diff --git a/ChangeLog b/ChangeLog index 12351e1ba..ce7081139 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ -2010-06-30 Robert Larice +2010-06-30 Holger Vogt + * inpcom.c: no braces in let, set commands inside control loop + * glob.c: reinstate {$var} expansion (patch by R. Larice) + +2010-06-30 Robert Larice * src/include/ftedev.h : ansi prototypes for the function pointers in struct DISPDEVICE typedef for those functions diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 97a86bcd2..f0bb74d59 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1931,10 +1931,11 @@ inp_fix_for_numparam(struct line *deck) continue; } - /* exclude plot line between .control and .endc from getting quotes changed */ + /* exclude echo, let, set, plot line between .control and .endc from getting quotes changed */ if ( ciprefix( ".control", c->li_line ) ) found_control = TRUE; if ( ciprefix( ".endc", c->li_line ) ) found_control = FALSE; - if ((found_control) && (ciprefix( "plot", c->li_line ))) { + if ((found_control) && ((ciprefix( "plot", c->li_line )) || (ciprefix( "echo", c->li_line )) + || (ciprefix( "let", c->li_line )) || (ciprefix( "set", c->li_line )))) { c = c->li_next; continue; } diff --git a/src/frontend/parser/glob.c b/src/frontend/parser/glob.c index 17a90db9b..a5ce76d53 100644 --- a/src/frontend/parser/glob.c +++ b/src/frontend/parser/glob.c @@ -34,8 +34,15 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group char cp_comma = ','; +char cp_ocurl = '{'; +char cp_ccurl = '}'; char cp_til = '~'; +static wordlist *bracexpand(char *string); +static wordlist *brac1(char *string); +static wordlist *brac2(char *string); + + /* For each word, go through two steps: expand the {}'s, and then do ?*[] * globbing in them. Sort after the second phase but not the first... */ @@ -48,6 +55,19 @@ cp_doglob(wordlist *wlist) wordlist *wl; char *s; + /* Expand {a,b,c} */ + + for (wl = wlist; wl; wl = wl->wl_next) { + wordlist *nwl, *w = bracexpand(wl->wl_word); + if (!w) { + wlist->wl_word = NULL; /* XXX */ + return (wlist); + } + nwl = wl_splice(wl, w); + if (wlist == wl) + wlist = w; + wl = nwl; + } /* Do tilde expansion. */ @@ -64,6 +84,123 @@ cp_doglob(wordlist *wlist) return (wlist); } +static wordlist * +bracexpand(char *string) +{ + wordlist *wl, *w; + char *s; + + if (!string) + return (NULL); + wl = brac1(string); + if (!wl) + return (NULL); + for (w = wl; w; w = w->wl_next) { + s = w->wl_word; + w->wl_word = copy(s); + tfree(s); + } + return (wl); +} + +/* Given a string, returns a wordlist of all the {} expansions. This is + * called recursively by cp_brac2(). All the words here will be of size + * BSIZE_SP, so it is a good idea to copy() and free() the old words. + */ + +static wordlist * +brac1(char *string) +{ + wordlist *words, *wl, *w, *nw, *nwl, *newwl; + char *s; + int nb; + + words = alloc(struct wordlist); + words->wl_word = tmalloc(BSIZE_SP); + words->wl_word[0] = 0; + words->wl_next = NULL; + words->wl_prev = NULL; + for (s = string; *s; s++) { + if (*s == cp_ocurl) { + nwl = brac2(s); + nb = 0; + for (;;) { + if (*s == cp_ocurl) + nb++; + if (*s == cp_ccurl) + nb--; + if (*s == '\0') { /* { */ + fprintf(cp_err, "Error: missing }.\n"); + return (NULL); + } + if (nb == 0) + break; + s++; + } + /* Add nwl to the rest of the strings in words. */ + newwl = NULL; + for (wl = words; wl; wl = wl->wl_next) + for (w = nwl; w; w = w->wl_next) { + nw = alloc(struct wordlist); + nw->wl_next = NULL; + nw->wl_prev = NULL; + nw->wl_word = tmalloc(BSIZE_SP); + (void) strcpy(nw->wl_word, wl->wl_word); + (void) strcat(nw->wl_word, w->wl_word); + newwl = wl_append(newwl, nw); + } + wl_free(words); + words = newwl; + } else + for (wl = words; wl; wl = wl->wl_next) + appendc(wl->wl_word, *s); + } + return (words); +} + +/* Given a string starting with a {, return a wordlist of the expansions + * for the text until the matching }. + */ + +static wordlist * +brac2(char *string) +{ + wordlist *wlist = NULL, *nwl; + char buf[BSIZE_SP], *s; + int nb; + bool eflag = FALSE; + + string++; /* Get past the first open brace... */ + for (;;) { + (void) strcpy(buf, string); + nb = 0; + s = buf; + for (;;) { + if ((*s == cp_ccurl) && (nb == 0)) { + eflag = TRUE; + break; + } + if ((*s == cp_comma) && (nb == 0)) + break; + if (*s == cp_ocurl) + nb++; + if (*s == cp_ccurl) + nb--; + if (*s == '\0') { /* { */ + fprintf(cp_err, "Error: missing }.\n"); + return (NULL); + } + s++; + } + *s = '\0'; + nwl = brac1(buf); + wlist = wl_append(wlist, nwl); + string += s - buf + 1; + if (eflag) + return (wlist); + } +} + /* Expand tildes. */ char *