macro fixes (Benedict Lofstedt, #4220):
authorjbj <devnull@localhost>
Thu, 29 Jul 1999 12:36:03 +0000 (12:36 +0000)
committerjbj <devnull@localhost>
Thu, 29 Jul 1999 12:36:03 +0000 (12:36 +0000)
  expand %# just like %{#} (and with same value as shell analogues).
  macro defaults for *, 0, and # if no args specified.
  getopt on non-linux requires optind to be saved/restored.

CVS patchset: 3209
CVS date: 1999/07/29 12:36:03

CHANGES
lib/macro.c
rpmio/macro.c

diff --git a/CHANGES b/CHANGES
index cae76b7..a131199 100644 (file)
--- a/CHANGES
+++ b/CHANGES
        - add _mandir/_infodir macro expansions to docdirs (Tomasz Kloczko).
        - add post install configurable dependency checking.
        - fix: segfault on --rebuild (#4185).
-       - fix: getopt on non-linux requires optind to be saved/restored
-         rather than just set to 0 (Benedict Lofstedt, #4220).
+       - macro fixes (Benedict Lofstedt, #4220):
+          expand %# just like %{#} (and with same value as shell analogues).
+          macro defaults for *, 0, and # if no args specified.
+          getopt on non-linux requires optind to be saved/restored.
 
 3.0.1 -> 3.0.2
        - eliminate armv4 entries from rpmrc (Andrew E. Mileski).
index 64749f0..2dadb8c 100644 (file)
@@ -579,7 +579,7 @@ freeArgs(MacroBuf *mb)
 }
 
 static const char *
-grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
+grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se, char lastc)
 {
     char buf[BUFSIZ], *b, *be;
     char aname[16];
@@ -602,20 +602,20 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
 
     addMacro(mb->mc, "0", NULL, b, mb->depth);
     
-    /* Copy args into buf until newline */
+    /* Copy args into buf until lastc */
     *be++ = ' ';
     b = be;    /* Save beginning of args */
     while ((c = *se) != 0) {
        char *a;
        se++;
-       if (c == '\n')
+       if (c == lastc)
                break;
        if (isblank(c))
                continue;
        if (argc > 1)
                *be++ = ' ';
        a = be;
-       while (!(isblank(c) || c == '\n')) {
+       while (!(isblank(c) || c == lastc)) {
                *be++ = c;
                if ((c = *se) == '\0')
                        break;
@@ -625,7 +625,6 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
        argc++;
     }
 
-#if 0
 /*
  * The macro %* analoguous to the shell's $* means "Pass all non-macro
  * parameters." Consequently, there needs to be a macro that means "Pass all
@@ -636,7 +635,6 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
  */
     /* Add unexpanded args as macro */
     addMacro(mb->mc, "**", NULL, b, mb->depth);
-#endif
 
 #ifdef NOTYET
     /* XXX if macros can be passed as args ... */
@@ -717,7 +715,7 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
     }
 
     /* Add arg count as macro */
-    sprintf(aname, "%d", (argc - optind + 1));
+    sprintf(aname, "%d", (argc - optind));
     addMacro(mb->mc, "#", NULL, aname, mb->depth);
 
     /* Add unexpanded args as macro */
@@ -834,7 +832,7 @@ expandMacro(MacroBuf *mb)
     int c;
     int rc = 0;
     int negate;
-    int grab;
+    char grab;
     int chkexist;
 
     if (++mb->depth > max_macro_depth) {
@@ -866,7 +864,7 @@ expandMacro(MacroBuf *mb)
        if (mb->depth > 1)      /* XXX full expansion for outermost level */
                t = mb->t;      /* save expansion pointer for printExpand */
        negate = 0;
-       grab = 0;
+       grab = '\0';
        chkexist = 0;
        switch ((c = *s)) {
        default:                /* %name substitution */
@@ -885,12 +883,22 @@ expandMacro(MacroBuf *mb)
                        se++;
                while((c = *se) && (isalnum(c) || c == '_'))
                        se++;
-               if (*se == '*')
+               /* Recognize non-alnum macros too */
+               switch (*se) {
+               case '*':
+                       se++;
+                       if (*se == '*') se++;
+                       break;
+               case '#':
                        se++;
+                       break;
+               default:
+                       break;
+               }
                fe = se;
                /* For "%name " macros ... */
                if ((c = *fe) && isblank(c))
-                       grab = 1;
+                       grab = '\n';
                break;
        case '(':               /* %(...) shell escape */
                if ((se = matchchar(s, c, ')')) == NULL) {
@@ -926,11 +934,18 @@ expandMacro(MacroBuf *mb)
                                break;
                        }
                }
-               for (fe = f; (c = *fe) && !strchr(":}", c);)
+               for (fe = f; (c = *fe) && !strchr(" :}", c);)
                        fe++;
-               if (c == ':') {
+               switch (c) {
+               case ':':
                        g = fe + 1;
                        ge = se - 1;
+                       break;
+               case ' ':
+                       grab = se[-1];
+                       break;
+               default:
+                       break;
                }
                break;
        }
@@ -1074,10 +1089,13 @@ expandMacro(MacroBuf *mb)
 
        /* Setup args for "%name " macros with opts */
        if (me && me->opts != NULL) {
-               if (grab)
-                       se = grabArgs(mb, me, fe);
-               else {
-                   addMacro(mb->mc, "*", NULL, "", mb->depth);
+               if (grab) {
+                       se = grabArgs(mb, me, fe, grab);
+               } else {
+                       addMacro(mb->mc, "**", NULL, "", mb->depth);
+                       addMacro(mb->mc, "*", NULL, "", mb->depth);
+                       addMacro(mb->mc, "#", NULL, "0", mb->depth);
+                       addMacro(mb->mc, "0", NULL, me->name, mb->depth);
                }
        }
 
index 64749f0..2dadb8c 100644 (file)
@@ -579,7 +579,7 @@ freeArgs(MacroBuf *mb)
 }
 
 static const char *
-grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
+grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se, char lastc)
 {
     char buf[BUFSIZ], *b, *be;
     char aname[16];
@@ -602,20 +602,20 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
 
     addMacro(mb->mc, "0", NULL, b, mb->depth);
     
-    /* Copy args into buf until newline */
+    /* Copy args into buf until lastc */
     *be++ = ' ';
     b = be;    /* Save beginning of args */
     while ((c = *se) != 0) {
        char *a;
        se++;
-       if (c == '\n')
+       if (c == lastc)
                break;
        if (isblank(c))
                continue;
        if (argc > 1)
                *be++ = ' ';
        a = be;
-       while (!(isblank(c) || c == '\n')) {
+       while (!(isblank(c) || c == lastc)) {
                *be++ = c;
                if ((c = *se) == '\0')
                        break;
@@ -625,7 +625,6 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
        argc++;
     }
 
-#if 0
 /*
  * The macro %* analoguous to the shell's $* means "Pass all non-macro
  * parameters." Consequently, there needs to be a macro that means "Pass all
@@ -636,7 +635,6 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
  */
     /* Add unexpanded args as macro */
     addMacro(mb->mc, "**", NULL, b, mb->depth);
-#endif
 
 #ifdef NOTYET
     /* XXX if macros can be passed as args ... */
@@ -717,7 +715,7 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se)
     }
 
     /* Add arg count as macro */
-    sprintf(aname, "%d", (argc - optind + 1));
+    sprintf(aname, "%d", (argc - optind));
     addMacro(mb->mc, "#", NULL, aname, mb->depth);
 
     /* Add unexpanded args as macro */
@@ -834,7 +832,7 @@ expandMacro(MacroBuf *mb)
     int c;
     int rc = 0;
     int negate;
-    int grab;
+    char grab;
     int chkexist;
 
     if (++mb->depth > max_macro_depth) {
@@ -866,7 +864,7 @@ expandMacro(MacroBuf *mb)
        if (mb->depth > 1)      /* XXX full expansion for outermost level */
                t = mb->t;      /* save expansion pointer for printExpand */
        negate = 0;
-       grab = 0;
+       grab = '\0';
        chkexist = 0;
        switch ((c = *s)) {
        default:                /* %name substitution */
@@ -885,12 +883,22 @@ expandMacro(MacroBuf *mb)
                        se++;
                while((c = *se) && (isalnum(c) || c == '_'))
                        se++;
-               if (*se == '*')
+               /* Recognize non-alnum macros too */
+               switch (*se) {
+               case '*':
+                       se++;
+                       if (*se == '*') se++;
+                       break;
+               case '#':
                        se++;
+                       break;
+               default:
+                       break;
+               }
                fe = se;
                /* For "%name " macros ... */
                if ((c = *fe) && isblank(c))
-                       grab = 1;
+                       grab = '\n';
                break;
        case '(':               /* %(...) shell escape */
                if ((se = matchchar(s, c, ')')) == NULL) {
@@ -926,11 +934,18 @@ expandMacro(MacroBuf *mb)
                                break;
                        }
                }
-               for (fe = f; (c = *fe) && !strchr(":}", c);)
+               for (fe = f; (c = *fe) && !strchr(" :}", c);)
                        fe++;
-               if (c == ':') {
+               switch (c) {
+               case ':':
                        g = fe + 1;
                        ge = se - 1;
+                       break;
+               case ' ':
+                       grab = se[-1];
+                       break;
+               default:
+                       break;
                }
                break;
        }
@@ -1074,10 +1089,13 @@ expandMacro(MacroBuf *mb)
 
        /* Setup args for "%name " macros with opts */
        if (me && me->opts != NULL) {
-               if (grab)
-                       se = grabArgs(mb, me, fe);
-               else {
-                   addMacro(mb->mc, "*", NULL, "", mb->depth);
+               if (grab) {
+                       se = grabArgs(mb, me, fe, grab);
+               } else {
+                       addMacro(mb->mc, "**", NULL, "", mb->depth);
+                       addMacro(mb->mc, "*", NULL, "", mb->depth);
+                       addMacro(mb->mc, "#", NULL, "0", mb->depth);
+                       addMacro(mb->mc, "0", NULL, me->name, mb->depth);
                }
        }