[klibc] Re: Warnings building dash
Herbert Xu
herbert at gondor.apana.org.au
Tue Mar 28 13:06:47 PST 2006
On Tue, Mar 28, 2006 at 07:42:17AM +1100, herbert wrote:
> On Mon, Mar 27, 2006 at 08:21:12AM -0800, H. Peter Anvin wrote:
> >
> > That's not going to fly, though, for merging upstream with the kernel.
>
> OK I'll send you a patch then.
Turns out that we can use alloca to get rid of the setjmp/longjmp
altogether. This makes dash 1% smaller.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert at gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
diff --git a/parser.c b/parser.c
index c62a950..4362f6a 100644
--- a/parser.c
+++ b/parser.c
@@ -32,6 +32,7 @@
* SUCH DAMAGE.
*/
+#include <alloca.h>
#include <stdlib.h>
#include "shell.h"
@@ -76,7 +77,6 @@
struct heredoc *heredoclist; /* list of here documents to read */
-int parsebackquote; /* nonzero if we are inside backquotes */
int doprompt; /* if set, prompt the user */
int needprompt; /* true if interactive and at start of line */
int lasttoken; /* last token read */
@@ -847,21 +847,8 @@
int dqvarnest; /* levels of variables expansion within double quotes */
int oldstyle;
char const *prevsyntax; /* syntax before arithmetic */
-#if __GNUC__
- /* Avoid longjmp clobbering */
- (void) &out;
- (void) "ef;
- (void) &dblquote;
- (void) &varnest;
- (void) &arinest;
- (void) &parenlevel;
- (void) &dqvarnest;
- (void) &oldstyle;
- (void) &prevsyntax;
- (void) &syntax;
-#endif
-
- startlinno = plinno;
+
+ startlinno = plinno;
dblquote = 0;
if (syntax == DQSYNTAX)
dblquote = 1;
@@ -1019,7 +1006,7 @@
endword:
if (syntax == ARISYNTAX)
synerror("Missing '))'");
- if (syntax != BASESYNTAX && ! parsebackquote && eofmark == NULL)
+ if (syntax != BASESYNTAX && eofmark == NULL)
synerror("Unterminated quoted string");
if (varnest != 0) {
startlinno = plinno;
@@ -1263,35 +1250,17 @@
parsebackq: {
struct nodelist **nlpp;
- int savepbq;
- union node *n;
- char *volatile str;
- struct jmploc jmploc;
- struct jmploc *volatile savehandler;
+ union node *n;
+ char *str;
size_t savelen;
int saveprompt;
-#ifdef __GNUC__
- (void) &saveprompt;
-#endif
-
- savepbq = parsebackquote;
- if (setjmp(jmploc.loc)) {
- if (str)
- ckfree(str);
- parsebackquote = 0;
- handler = savehandler;
- longjmp(handler->loc, 1);
- }
- INTOFF;
+
str = NULL;
savelen = out - (char *)stackblock();
if (savelen > 0) {
- str = ckmalloc(savelen);
+ str = alloca(savelen);
memcpy(str, stackblock(), savelen);
}
- savehandler = handler;
- handler = &jmploc;
- INTON;
if (oldstyle) {
/* We must read until the closing backquote, giving special
treatment to some slashes, and then push the string and
@@ -1360,7 +1329,6 @@
nlpp = &(*nlpp)->next;
*nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist));
(*nlpp)->next = NULL;
- parsebackquote = oldstyle;
if (oldstyle) {
saveprompt = doprompt;
@@ -1391,13 +1359,7 @@
if (str) {
memcpy(out, str, savelen);
STADJUST(savelen, out);
- INTOFF;
- ckfree(str);
- str = NULL;
- INTON;
- }
- parsebackquote = savepbq;
- handler = savehandler;
+ }
if (arinest || dblquote)
USTPUTC(CTLBACKQ | CTLQUOTE, out);
else
More information about the klibc
mailing list