macro.c   macro.c 
skipping to change at line 270 skipping to change at line 270
size_t nb; size_t nb;
assert(me != NULL); assert(me != NULL);
nb = strlen(me->name) + sizeof("%") - 1; nb = strlen(me->name) + sizeof("%") - 1;
if (me->opts) if (me->opts)
nb += strlen(me->opts) + sizeof("()") - 1; nb += strlen(me->opts) + sizeof("()") - 1;
if (me->body) if (me->body)
nb += strlen(me->body) + sizeof("\t") - 1; nb += strlen(me->body) + sizeof("\t") - 1;
nb++; nb++;
t = te = xmalloc(nb); t = te = (char *) xmalloc(nb);
*te = '\0'; *te = '\0';
te = stpcpy( stpcpy(te, "%"), me->name); te = stpcpy( stpcpy(te, "%"), me->name);
if (me->opts) if (me->opts)
te = stpcpy( stpcpy( stpcpy(te, "("), me->opts), ")"); te = stpcpy( stpcpy( stpcpy(te, "("), me->opts), ")");
if (me->body) if (me->body)
te = stpcpy( stpcpy(te, "\t"), me->body); te = stpcpy( stpcpy(te, "\t"), me->body);
*te = '\0'; *te = '\0';
return t; return t;
} }
skipping to change at line 334 skipping to change at line 334
const char ** av; const char ** av;
int ac = 0; int ac = 0;
int i; int i;
if (mc == NULL) if (mc == NULL)
mc = rpmGlobalMacroContext; mc = rpmGlobalMacroContext;
if (avp == NULL) if (avp == NULL)
return mc->firstFree; return mc->firstFree;
av = xcalloc( (mc->firstFree+1), sizeof(mc->macroTable[0])); av = (const char **) xcalloc( (mc->firstFree+1), sizeof(mc->macroTable[ 0]));
if (mc->macroTable != NULL) if (mc->macroTable != NULL)
for (i = 0; i < mc->firstFree; i++) { for (i = 0; i < mc->firstFree; i++) {
MacroEntry me; MacroEntry me;
me = mc->macroTable[i]; me = mc->macroTable[i];
if (used > 0 && me->used < used) if (used > 0 && me->used < used)
continue; continue;
if (used == 0 && me->used != 0) if (used == 0 && me->used != 0)
continue; continue;
#if !defined(DEBUG_MACROS) /* XXX preserve standalone build */ #if !defined(DEBUG_MACROS) /* XXX preserve standalone build */
if (mire != NULL && mireRegexec(mire, me->name, 0) < 0) if (mire != NULL && mireRegexec(mire, me->name, 0) < 0)
continue; continue;
#endif #endif
av[ac++] = dupMacroEntry(me); av[ac++] = dupMacroEntry(me);
} }
av[ac] = NULL; av[ac] = NULL;
*avp = av = xrealloc(av, (ac+1) * sizeof(*av)); *avp = av = (const char **) xrealloc(av, (ac+1) * sizeof(*av));
return ac; return ac;
} }
#endif #endif
/** /**
* Find entry in macro table. * Find entry in macro table.
* @param mc macro context * @param mc macro context
* @param name macro name * @param name macro name
* @param namelen no. of bytes * @param namelen no. of bytes
skipping to change at line 377 skipping to change at line 377
{ {
MacroEntry key, *ret; MacroEntry key, *ret;
/*@-globs@*/ /*@-globs@*/
if (mc == NULL) mc = rpmGlobalMacroContext; if (mc == NULL) mc = rpmGlobalMacroContext;
/*@=globs@*/ /*@=globs@*/
if (mc->macroTable == NULL || mc->firstFree == 0) if (mc->macroTable == NULL || mc->firstFree == 0)
return NULL; return NULL;
if (namelen > 0) { if (namelen > 0) {
char * t = strncpy(alloca(namelen + 1), name, namelen); char * t = strncpy((char *)alloca(namelen + 1), name, namelen);
t[namelen] = '\0'; t[namelen] = '\0';
name = t; name = t;
} }
key = memset(alloca(sizeof(*key)), 0, sizeof(*key)); key = (MacroEntry) memset(alloca(sizeof(*key)), 0, sizeof(*key));
/*@-temptrans -assignexpose@*/ /*@-temptrans -assignexpose@*/
key->name = (char *)name; key->name = (char *)name;
/*@=temptrans =assignexpose@*/ /*@=temptrans =assignexpose@*/
ret = (MacroEntry *) bsearch(&key, mc->macroTable, mc->firstFree, ret = (MacroEntry *) bsearch(&key, mc->macroTable, mc->firstFree,
sizeof(*(mc->macroTable)), compareMacroName); sizeof(*(mc->macroTable)), compareMacroName);
/* XXX TODO: find 1st empty slot and return that */ /* XXX TODO: find 1st empty slot and return that */
return ret; return ret;
} }
/* =============================================================== */ /* =============================================================== */
skipping to change at line 615 skipping to change at line 615
*/ */
static int static int
expandT(MacroBuf mb, const char * f, size_t flen) expandT(MacroBuf mb, const char * f, size_t flen)
/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
char *sbuf; char *sbuf;
const char *s = mb->s; const char *s = mb->s;
int rc; int rc;
sbuf = alloca(flen + 1); sbuf = (char *) alloca(flen + 1);
memset(sbuf, 0, (flen + 1)); memset(sbuf, 0, (flen + 1));
strncpy(sbuf, f, flen); strncpy(sbuf, f, flen);
sbuf[flen] = '\0'; sbuf[flen] = '\0';
mb->s = sbuf; mb->s = sbuf;
rc = expandMacro(mb); rc = expandMacro(mb);
mb->s = s; mb->s = s;
return rc; return rc;
} }
skipping to change at line 670 skipping to change at line 670
expandU(MacroBuf mb, char * u, size_t ulen) expandU(MacroBuf mb, char * u, size_t ulen)
/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
/*@modifies mb, *u, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, *u, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
const char *s = mb->s; const char *s = mb->s;
char *t = mb->t; char *t = mb->t;
size_t nb = mb->nb; size_t nb = mb->nb;
char *tbuf; char *tbuf;
int rc; int rc;
tbuf = alloca(ulen + 1); tbuf = (char *) alloca(ulen + 1);
memset(tbuf, 0, (ulen + 1)); memset(tbuf, 0, (ulen + 1));
mb->s = u; mb->s = u;
mb->t = tbuf; mb->t = tbuf;
mb->nb = ulen; mb->nb = ulen;
rc = expandMacro(mb); rc = expandMacro(mb);
tbuf[ulen] = '\0'; /* XXX just in case */ tbuf[ulen] = '\0'; /* XXX just in case */
if (ulen > mb->nb) if (ulen > mb->nb)
strncpy(u, tbuf, (ulen - mb->nb + 1)); strncpy(u, tbuf, (ulen - mb->nb + 1));
skipping to change at line 702 skipping to change at line 702
* @param cmd shell command * @param cmd shell command
* @param clen no. bytes in shell command * @param clen no. bytes in shell command
* @return result of expansion * @return result of expansion
*/ */
static int static int
doShellEscape(MacroBuf mb, const char * cmd, size_t clen) doShellEscape(MacroBuf mb, const char * cmd, size_t clen)
/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
size_t bufn = _macro_BUFSIZ + clen; size_t bufn = _macro_BUFSIZ + clen;
char * buf = alloca(bufn); char * buf = (char *) alloca(bufn);
FILE *shf; FILE *shf;
int rc; int rc;
int c; int c;
strncpy(buf, cmd, clen); strncpy(buf, cmd, clen);
buf[clen] = '\0'; buf[clen] = '\0';
rc = expandU(mb, buf, bufn); rc = expandU(mb, buf, bufn);
if (rc) if (rc)
return rc; return rc;
skipping to change at line 742 skipping to change at line 742
* @param expandbody should body be expanded? * @param expandbody should body be expanded?
* @return address to continue parsing * @return address to continue parsing
*/ */
/*@dependent@*/ static const char * /*@dependent@*/ static const char *
doDefine(MacroBuf mb, /*@returned@*/ const char * se, int level, int expand body) doDefine(MacroBuf mb, /*@returned@*/ const char * se, int level, int expand body)
/*@globals rpmGlobalMacroContext, h_errno, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, internalState @*/
{ {
const char *s = se; const char *s = se;
size_t bufn = _macro_BUFSIZ; size_t bufn = _macro_BUFSIZ;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
char *n = buf, *ne; char *n = buf, *ne;
char *o = NULL, *oe; char *o = NULL, *oe;
char *b, *be; char *b, *be;
int c; int c;
int oc = (int) ')'; int oc = (int) ')';
SKIPBLANK(s, c); SKIPBLANK(s, c);
if (c == (int) '.') /* XXX readonly macros */ if (c == (int) '.') /* XXX readonly macros */
/*@i@*/ *n++ = c = *s++; /*@i@*/ *n++ = c = *s++;
if (c == (int) '.') /* XXX readonly macros */ if (c == (int) '.') /* XXX readonly macros */
skipping to change at line 876 skipping to change at line 876
* @param mc macro context * @param mc macro context
* @param se macro name to undefine * @param se macro name to undefine
* @return address to continue parsing * @return address to continue parsing
*/ */
/*@dependent@*/ static const char * /*@dependent@*/ static const char *
doUndefine(MacroContext mc, /*@returned@*/ const char * se) doUndefine(MacroContext mc, /*@returned@*/ const char * se)
/*@globals rpmGlobalMacroContext @*/ /*@globals rpmGlobalMacroContext @*/
/*@modifies mc, rpmGlobalMacroContext @*/ /*@modifies mc, rpmGlobalMacroContext @*/
{ {
const char *s = se; const char *s = se;
char *buf = alloca(_macro_BUFSIZ); char *buf = (char *) alloca(_macro_BUFSIZ);
char *n = buf, *ne = n; char *n = buf, *ne = n;
int c; int c;
COPYNAME(ne, s, c); COPYNAME(ne, s, c);
/* Move scan over body */ /* Move scan over body */
while (iseol(*s)) while (iseol(*s))
s++; s++;
se = s; se = s;
skipping to change at line 948 skipping to change at line 948
me->prev = prev; me->prev = prev;
/*@=assignexpose@*/ /*@=assignexpose@*/
me->name = (prev ? prev->name : xstrdup(name)); me->name = (prev ? prev->name : xstrdup(name));
me->opts = (o ? xstrdup(o) : NULL); me->opts = (o ? xstrdup(o) : NULL);
me->body = xstrdup(b ? b : ""); me->body = xstrdup(b ? b : "");
me->used = 0; me->used = 0;
me->level = level; me->level = level;
me->flags = (name != n); me->flags = (name != n);
if (mep) if (mep)
*mep = me; *mep = me;
else else {
me = _free(me); if (me) free(me);
me = NULL;
}
} }
/** /**
* Pop macro definition from macro entry stack. * Pop macro definition from macro entry stack.
* @param mep address of macro entry slot * @param mep address of macro entry slot
*/ */
static void static void
popMacro(MacroEntry * mep) popMacro(MacroEntry * mep)
/*@modifies *mep @*/ /*@modifies *mep @*/
{ {
MacroEntry me = (*mep ? *mep : NULL); MacroEntry me = (*mep ? *mep : NULL);
if (me) { if (me) {
/* XXX cast to workaround const */ /* XXX cast to workaround const */
/*@-onlytrans@*/ /*@-onlytrans@*/
if ((*mep = me->prev) == NULL) if ((*mep = me->prev) == NULL)
me->name = _free(me->name); me->name = _free(me->name);
me->opts = _free(me->opts); me->opts = _free(me->opts);
me->body = _free(me->body); me->body = _free(me->body);
me = _free(me); if (me) free(me);
me = NULL;
/*@=onlytrans@*/ /*@=onlytrans@*/
} }
} }
/** /**
* Free parsed arguments for parameterized macro. * Free parsed arguments for parameterized macro.
* @param mb macro expansion state * @param mb macro expansion state
*/ */
static void static void
freeArgs(MacroBuf mb) freeArgs(MacroBuf mb)
skipping to change at line 1038 skipping to change at line 1041
*/ */
/*@dependent@*/ static const char * /*@dependent@*/ static const char *
grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se, grabArgs(MacroBuf mb, const MacroEntry me, /*@returned@*/ const char * se,
const char * lastc) const char * lastc)
/*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
poptContext optCon; poptContext optCon;
struct poptOption *optTbl; struct poptOption *optTbl;
size_t bufn = _macro_BUFSIZ; size_t bufn = _macro_BUFSIZ;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
char *b, *be; char *b, *be;
char aname[16]; char aname[16];
const char *opts; const char *opts;
int argc = 0; int argc = 0;
const char **argv; const char **argv;
int c; int c;
unsigned int popt_flags; unsigned int popt_flags;
/* Copy macro name as argv[0], save beginning of args. */ /* Copy macro name as argv[0], save beginning of args. */
buf[0] = '\0'; buf[0] = '\0';
skipping to change at line 1123 skipping to change at line 1126
#endif #endif
if (me->opts[0] == '+') popt_flags |= POPT_CONTEXT_POSIXMEHARDER; if (me->opts[0] == '+') popt_flags |= POPT_CONTEXT_POSIXMEHARDER;
/* Count the number of short options. */ /* Count the number of short options. */
opts = me->opts; opts = me->opts;
if (*opts == '+') opts++; if (*opts == '+') opts++;
for (c = 0; *opts != '\0'; opts++) for (c = 0; *opts != '\0'; opts++)
if (*opts != ':') c++; if (*opts != ':') c++;
/* Set up popt option table. */ /* Set up popt option table. */
optTbl = xcalloc(sizeof(*optTbl), (c + 1)); optTbl = (struct poptOption *) xcalloc(sizeof(*optTbl), (c + 1));
opts = me->opts; opts = me->opts;
if (*opts == '+') opts++; if (*opts == '+') opts++;
for (c = 0; *opts != '\0'; opts++) { for (c = 0; *opts != '\0'; opts++) {
if (*opts == ':') continue; if (*opts == ':') continue;
optTbl[c].shortName = opts[0]; optTbl[c].shortName = opts[0];
optTbl[c].val = (int) opts[0]; optTbl[c].val = (int) opts[0];
if (opts[1] == ':') if (opts[1] == ':')
optTbl[c].argInfo = POPT_ARG_STRING; optTbl[c].argInfo = POPT_ARG_STRING;
c++; c++;
} }
skipping to change at line 1193 skipping to change at line 1196
if (be != b) *be++ = ' '; /* Add space between args */ if (be != b) *be++ = ' '; /* Add space between args */
be = stpcpy(be, argv[c]); be = stpcpy(be, argv[c]);
} }
} }
/* Add unexpanded args as macro. */ /* Add unexpanded args as macro. */
addMacro(mb->mc, "*", NULL, b, mb->depth); addMacro(mb->mc, "*", NULL, b, mb->depth);
exit: exit:
optCon = poptFreeContext(optCon); optCon = poptFreeContext(optCon);
optTbl = _free(optTbl); if (optTbl) free(optTbl);
optTbl = NULL;
return se; return se;
} }
/** /**
* Perform macro message output * Perform macro message output
* @param mb macro expansion state * @param mb macro expansion state
* @param waserror use rpmError()? * @param waserror use rpmError()?
* @param msg message to ouput * @param msg message to ouput
* @param msglen no. of bytes in message * @param msglen no. of bytes in message
*/ */
static void static void
doOutput(MacroBuf mb, int waserror, const char * msg, size_t msglen) doOutput(MacroBuf mb, int waserror, const char * msg, size_t msglen)
/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
size_t bufn = _macro_BUFSIZ + msglen; size_t bufn = _macro_BUFSIZ + msglen;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
strncpy(buf, msg, msglen); strncpy(buf, msg, msglen);
buf[msglen] = '\0'; buf[msglen] = '\0';
(void) expandU(mb, buf, bufn); (void) expandU(mb, buf, bufn);
if (waserror) if (waserror)
rpmlog(RPMLOG_ERR, "%s\n", buf); rpmlog(RPMLOG_ERR, "%s\n", buf);
else else
fprintf(stderr, "%s", buf); fprintf(stderr, "%s", buf);
} }
skipping to change at line 1237 skipping to change at line 1241
* @param g beginning of field g * @param g beginning of field g
* @param gn length of field g * @param gn length of field g
*/ */
static void static void
doFoo(MacroBuf mb, int negate, const char * f, size_t fn, doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
/*@null@*/ const char * g, size_t gn) /*@null@*/ const char * g, size_t gn)
/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
/*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies mb, rpmGlobalMacroContext, fileSystem, internalState @*/
{ {
size_t bufn = _macro_BUFSIZ + fn + gn; size_t bufn = _macro_BUFSIZ + fn + gn;
char * buf = alloca(bufn); char * buf = (char *) alloca(bufn);
char *b = NULL, *be; char *b = NULL, *be;
int c; int c;
mode_t mode; mode_t mode;
buf[0] = '\0'; buf[0] = '\0';
if (g != NULL) { if (g != NULL) {
strncpy(buf, g, gn); strncpy(buf, g, gn);
buf[gn] = '\0'; buf[gn] = '\0';
(void) expandU(mb, buf, bufn); (void) expandU(mb, buf, bufn);
} }
skipping to change at line 1322 skipping to change at line 1326
b = ((rpmlogSetMask(0) >= RPMLOG_MASK( RPMLOG_INFO )) ? NULL : b uf); b = ((rpmlogSetMask(0) >= RPMLOG_MASK( RPMLOG_INFO )) ? NULL : b uf);
else else
b = ((rpmlogSetMask(0) >= RPMLOG_MASK( RPMLOG_INFO )) ? buf : NU LL); b = ((rpmlogSetMask(0) >= RPMLOG_MASK( RPMLOG_INFO )) ? buf : NU LL);
#else #else
/* XXX assume always verbose when running standalone */ /* XXX assume always verbose when running standalone */
b = (negate) ? NULL : buf; b = (negate) ? NULL : buf;
#endif #endif
} else if (STREQ("url2path", f, fn) || STREQ("u2p", f, fn)) { } else if (STREQ("url2path", f, fn) || STREQ("u2p", f, fn)) {
int ut = urlPath(buf, (const char **)&b); int ut = urlPath(buf, (const char **)&b);
ut = ut; /* XXX quiet gcc */ ut = ut; /* XXX quiet gcc */
if (*b == '\0') b = "/"; if (*b == '\0') b = (char *) "/";
} else if (STREQ("uncompress", f, fn)) { } else if (STREQ("uncompress", f, fn)) {
rpmCompressedMagic compressed = COMPRESSED_OTHER; rpmCompressedMagic compressed = COMPRESSED_OTHER;
/*@-globs@*/ /*@-globs@*/
for (b = buf; (c = (int)*b) && isblank(c);) for (b = buf; (c = (int)*b) && isblank(c);)
b++; b++;
/* XXX FIXME: file paths with embedded white space needs rework. */ /* XXX FIXME: file paths with embedded white space needs rework. */
for (be = b; (c = (int)*be) && !isblank(c);) for (be = b; (c = (int)*be) && !isblank(c);)
be++; be++;
/*@=globs@*/ /*@=globs@*/
*be++ = '\0'; *be++ = '\0';
skipping to change at line 1501 skipping to change at line 1505
int i; int i;
if (argc <= 0 || argv == NULL) /* XXX can't happen */ if (argc <= 0 || argv == NULL) /* XXX can't happen */
return POPT_ERROR_NOARG; return POPT_ERROR_NOARG;
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
if (argv[i] == NULL) if (argv[i] == NULL)
return POPT_ERROR_NOARG; return POPT_ERROR_NOARG;
nb += strlen(argv[i]) + 1; nb += strlen(argv[i]) + 1;
} }
dst = xmalloc(nb); dst = (char *) xmalloc(nb);
if (dst == NULL) /* XXX can't happen */ if (dst == NULL) /* XXX can't happen */
return POPT_ERROR_MALLOC; return POPT_ERROR_MALLOC;
argv2 = (void *) dst; argv2 = (char **) dst;
dst += (argc + 1) * sizeof(*argv); dst += (argc + 1) * sizeof(*argv);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
argv2[i] = dst; argv2[i] = dst;
dst += strlen(strcpy(dst, argv[i])) + 1; dst += strlen(strcpy(dst, argv[i])) + 1;
} }
argv2[argc] = NULL; argv2[argc] = NULL;
if (argvPtr) { if (argvPtr) {
*argvPtr = argv2; *argvPtr = argv2;
skipping to change at line 1530 skipping to change at line 1534
*argcPtr = argc; *argcPtr = argc;
return 0; return 0;
} }
static int XpoptParseArgvString(const char * s, int * argcPtr, char *** arg vPtr) static int XpoptParseArgvString(const char * s, int * argcPtr, char *** arg vPtr)
/*@modifies *argcPtr, *argvPtr @*/ /*@modifies *argcPtr, *argvPtr @*/
{ {
const char * src; const char * src;
char quote = '\0'; char quote = '\0';
int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
char ** argv = xmalloc(sizeof(*argv) * argvAlloced); char ** argv = (char **) xmalloc(sizeof(*argv) * argvAlloced);
int argc = 0; int argc = 0;
size_t buflen = strlen(s) + 1; size_t buflen = strlen(s) + 1;
char * buf = memset(alloca(buflen), 0, buflen); char * buf = (char *) memset(alloca(buflen), 0, buflen);
int rc = POPT_ERROR_MALLOC; int rc = POPT_ERROR_MALLOC;
if (argv == NULL) return rc; if (argv == NULL) return rc;
argv[argc] = buf; argv[argc] = buf;
for (src = s; *src != '\0'; src++) { for (src = s; *src != '\0'; src++) {
if (quote == *src) { if (quote == *src) {
quote = '\0'; quote = '\0';
} else if (quote != '\0') { } else if (quote != '\0') {
if (*src == '\\') { if (*src == '\\') {
skipping to change at line 1557 skipping to change at line 1561
goto exit; goto exit;
} }
if (*src != quote) *buf++ = '\\'; if (*src != quote) *buf++ = '\\';
} }
*buf++ = *src; *buf++ = *src;
} else if (isspace(*src)) { } else if (isspace(*src)) {
if (*argv[argc] != '\0') { if (*argv[argc] != '\0') {
buf++, argc++; buf++, argc++;
if (argc == argvAlloced) { if (argc == argvAlloced) {
argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA; argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
argv = realloc(argv, sizeof(*argv) * argvAlloced); argv = (char **) realloc(argv, sizeof(*argv) * argvAlloc ed);
if (argv == NULL) goto exit; if (argv == NULL) goto exit;
} }
argv[argc] = buf; argv[argc] = buf;
} }
} else switch (*src) { } else switch (*src) {
case '"': case '"':
case '\'': case '\'':
quote = *src; quote = *src;
/*@switchbreak@*/ break; /*@switchbreak@*/ break;
case '\\': case '\\':
skipping to change at line 1619 skipping to change at line 1623
default: continue; /*@notreached@*/ break; default: continue; /*@notreached@*/ break;
case ':': goto bingo; /*@notreached@*/ break; case ':': goto bingo; /*@notreached@*/ break;
} }
bingo: bingo:
{ size_t na = (size_t)(se-s-1); { size_t na = (size_t)(se-s-1);
char * args = NULL; char * args = NULL;
int ac; int ac;
int rc; int rc;
args = memcpy(xmalloc(na+1), s+1, na); args = (char *) memcpy(xmalloc(na+1), s+1, na);
args[na] = '\0'; args[na] = '\0';
ac = 0; ac = 0;
rc = XpoptParseArgvString(args, &ac, avp); rc = XpoptParseArgvString(args, &ac, avp);
args = _free(args); args = _free(args);
nb -= na; nb -= na;
} }
nb -= 3; nb -= 3;
script = memcpy(xmalloc(nb+1), se+1, nb+1); script = (char *) memcpy(xmalloc(nb+1), se+1, nb+1);
script[nb] = '\0'; script[nb] = '\0';
return script; return script;
} }
#endif #endif
/** /**
* The main macro recursion loop. * The main macro recursion loop.
* @todo Dynamically reallocate target buffer. * @todo Dynamically reallocate target buffer.
* @param mb macro expansion state * @param mb macro expansion state
* @return 0 on success, 1 on failure * @return 0 on success, 1 on failure
skipping to change at line 1814 skipping to change at line 1818
s = se; s = se;
continue; continue;
} }
if (mb->macro_trace) if (mb->macro_trace)
printMacro(mb, s, se); printMacro(mb, s, se);
/* Expand builtin macros */ /* Expand builtin macros */
if (STREQ("load", f, fn)) { if (STREQ("load", f, fn)) {
if (g != NULL) { if (g != NULL) {
char * mfn = strncpy(alloca(gn + 1), g, gn); char * mfn = strncpy((char *) alloca(gn + 1), g, gn);
int xx; int xx;
mfn[gn] = '\0'; mfn[gn] = '\0';
xx = rpmLoadMacroFile(NULL, mfn, _max_load_depth); xx = rpmLoadMacroFile(NULL, mfn, _max_load_depth);
/* Print failure iff %{load:...} or %{!?load:...} */ /* Print failure iff %{load:...} or %{!?load:...} */
if (xx != 0 && chkexist == negate) if (xx != 0 && chkexist == negate)
rpmlog(RPMLOG_ERR, _("%s: load macros failed\n"), mf n); rpmlog(RPMLOG_ERR, _("%s: load macros failed\n"), mf n);
} }
s = se; s = se;
continue; continue;
} }
skipping to change at line 1874 skipping to change at line 1878
rpmDumpMacroTable(mb->mc, NULL); rpmDumpMacroTable(mb->mc, NULL);
while (iseol(*se)) while (iseol(*se))
se++; se++;
s = se; s = se;
continue; continue;
} }
#ifdef WITH_LUA #ifdef WITH_LUA
if (STREQ("lua", f, fn)) { if (STREQ("lua", f, fn)) {
rpmlua lua = rpmluaGetGlobalState(); rpmlua lua = rpmluaGetGlobalState();
rpmlua olua = memcpy(alloca(sizeof(*olua)), lua, sizeof(*olu a)); rpmlua olua = (rpmlua) memcpy(alloca(sizeof(*olua)), lua, si zeof(*olua));
const char *ls = s+sizeof("{lua:")-1; const char *ls = s+sizeof("{lua:")-1;
const char *lse = se-sizeof("}")+1; const char *lse = se-sizeof("}")+1;
char *scriptbuf = (char *)xmalloc((lse-ls)+1); char *scriptbuf = (char *)xmalloc((lse-ls)+1);
const char *printbuf; const char *printbuf;
/* Reset the stateful output buffer before recursing down. * / /* Reset the stateful output buffer before recursing down. * /
lua->storeprint = 1; lua->storeprint = 1;
lua->printbuf = NULL; lua->printbuf = NULL;
lua->printbufsize = 0; lua->printbufsize = 0;
lua->printbufused = 0; lua->printbufused = 0;
skipping to change at line 2512 skipping to change at line 2516
#endif #endif
if (av != NULL) if (av != NULL)
for (j = 0; j < ac; j++) { for (j = 0; j < ac; j++) {
const char * globURL; const char * globURL;
const char * path; const char * path;
int ut = urlPath(av[j], &path); int ut = urlPath(av[j], &path);
glob_t gl; glob_t gl;
if (!Glob_pattern_p(av[j], 0) && strchr(path, '~') == NULL) { if (!Glob_pattern_p(av[j], 0) && strchr(path, '~') == NULL) {
argv = xrealloc(argv, (argc+2) * sizeof(*argv)); argv = (const char **) xrealloc(argv, (argc+2) * sizeof(*argv));
argv[argc] = xstrdup(av[j]); argv[argc] = xstrdup(av[j]);
if (_debug) if (_debug)
fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]); fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]);
argc++; argc++;
continue; continue;
} }
gl.gl_pathc = 0; gl.gl_pathc = 0;
gl.gl_pathv = NULL; gl.gl_pathv = NULL;
rc = Glob(av[j], GLOB_TILDE, Glob_error, &gl); rc = Glob(av[j], GLOB_TILDE, Glob_error, &gl);
skipping to change at line 2536 skipping to change at line 2540
/* XXX Prepend the URL leader for globs that have stripped it off */ /* XXX Prepend the URL leader for globs that have stripped it off */
maxb = 0; maxb = 0;
for (i = 0; i < gl.gl_pathc; i++) { for (i = 0; i < gl.gl_pathc; i++) {
if ((nb = strlen(&(gl.gl_pathv[i][0]))) > maxb) if ((nb = strlen(&(gl.gl_pathv[i][0]))) > maxb)
maxb = nb; maxb = nb;
} }
nb = ((ut == URL_IS_PATH) ? (path - av[j]) : 0); nb = ((ut == URL_IS_PATH) ? (path - av[j]) : 0);
maxb += nb; maxb += nb;
maxb += 1; maxb += 1;
globURL = globRoot = xmalloc(maxb); globURL = globRoot = (char *) xmalloc(maxb);
switch (ut) { switch (ut) {
case URL_IS_PATH: case URL_IS_PATH:
case URL_IS_DASH: case URL_IS_DASH:
strncpy(globRoot, av[j], nb); strncpy(globRoot, av[j], nb);
/*@switchbreak@*/ break; /*@switchbreak@*/ break;
case URL_IS_HKP: case URL_IS_HKP:
case URL_IS_FTP: case URL_IS_FTP:
case URL_IS_HTTP: case URL_IS_HTTP:
case URL_IS_HTTPS: case URL_IS_HTTPS:
case URL_IS_MONGO: /* XXX FIXME */ case URL_IS_MONGO: /* XXX FIXME */
case URL_IS_UNKNOWN: case URL_IS_UNKNOWN:
default: default:
/*@switchbreak@*/ break; /*@switchbreak@*/ break;
} }
globRoot += nb; globRoot += nb;
*globRoot = '\0'; *globRoot = '\0';
if (_debug) if (_debug)
fprintf(stderr, "*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (int)max b, (int)nb, (int)nb, av[j], globURL, globURL); fprintf(stderr, "*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (int)max b, (int)nb, (int)nb, av[j], globURL, globURL);
argv = xrealloc(argv, (argc+gl.gl_pathc+1) * sizeof(*argv)); argv = (const char **) xrealloc(argv, (argc+gl.gl_pathc+1) * sizeof( *argv));
if (argv != NULL) if (argv != NULL)
for (i = 0; i < gl.gl_pathc; i++) { for (i = 0; i < gl.gl_pathc; i++) {
const char * globFile = &(gl.gl_pathv[i][0]); const char * globFile = &(gl.gl_pathv[i][0]);
if (globRoot > globURL && globRoot[-1] == '/') if (globRoot > globURL && globRoot[-1] == '/')
while (*globFile == '/') globFile++; while (*globFile == '/') globFile++;
strcpy(globRoot, globFile); strcpy(globRoot, globFile);
if (_debug) if (_debug)
fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, globURL); fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, globURL);
argv[argc++] = xstrdup(globURL); argv[argc++] = xstrdup(globURL);
skipping to change at line 2614 skipping to change at line 2618
} }
return rc; return rc;
} }
#endif /* !defined(DEBUG_MACROS) */ #endif /* !defined(DEBUG_MACROS) */
/* =============================================================== */ /* =============================================================== */
int int
expandMacros(void * spec, MacroContext mc, char * sbuf, size_t slen) expandMacros(void * spec, MacroContext mc, char * sbuf, size_t slen)
{ {
MacroBuf mb = alloca(sizeof(*mb)); MacroBuf mb = (MacroBuf) alloca(sizeof(*mb));
char *tbuf; char *tbuf;
int rc; int rc;
if (sbuf == NULL || slen == 0) if (sbuf == NULL || slen == 0)
return 0; return 0;
if (mc == NULL) mc = rpmGlobalMacroContext; if (mc == NULL) mc = rpmGlobalMacroContext;
tbuf = alloca(slen + 1); tbuf = (char *) alloca(slen + 1);
tbuf[0] = '\0'; tbuf[0] = '\0';
mb->s = sbuf; mb->s = sbuf;
mb->t = tbuf; mb->t = tbuf;
mb->nb = slen; mb->nb = slen;
mb->depth = 0; mb->depth = 0;
mb->macro_trace = print_macro_trace; mb->macro_trace = print_macro_trace;
mb->expand_trace = print_expand_trace; mb->expand_trace = print_expand_trace;
mb->spec = spec; /* (future) %file expansion info */ mb->spec = spec; /* (future) %file expansion info */
skipping to change at line 2704 skipping to change at line 2708
/* If deleted name, sort macro table */ /* If deleted name, sort macro table */
if (!(mep && *mep)) if (!(mep && *mep))
sortMacroTable(mc); sortMacroTable(mc);
} }
} }
/*@-mustmod@*/ /* LCL: mc is modified through mb->mc, mb is abstract */ /*@-mustmod@*/ /* LCL: mc is modified through mb->mc, mb is abstract */
int int
rpmDefineMacro(MacroContext mc, const char * macro, int level) rpmDefineMacro(MacroContext mc, const char * macro, int level)
{ {
MacroBuf mb = alloca(sizeof(*mb)); MacroBuf mb = (MacroBuf) alloca(sizeof(*mb));
memset(mb, 0, sizeof(*mb)); memset(mb, 0, sizeof(*mb));
/* XXX just enough to get by */ /* XXX just enough to get by */
mb->mc = (mc ? mc : rpmGlobalMacroContext); mb->mc = (mc ? mc : rpmGlobalMacroContext);
(void) doDefine(mb, macro, level, 0); (void) doDefine(mb, macro, level, 0);
return 0; return 0;
} }
/*@=mustmod@*/ /*@=mustmod@*/
/*@-mustmod@*/ /* LCL: mc is modified through mb->mc, mb is abstract */ /*@-mustmod@*/ /* LCL: mc is modified through mb->mc, mb is abstract */
skipping to change at line 2767 skipping to change at line 2771
} }
} }
return; return;
} }
#endif #endif
int int
rpmLoadMacroFile(MacroContext mc, const char * fn, int nesting) rpmLoadMacroFile(MacroContext mc, const char * fn, int nesting)
{ {
size_t bufn = _macro_BUFSIZ; size_t bufn = _macro_BUFSIZ;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
int lineno = 0; int lineno = 0;
int rc = -1; int rc = -1;
FD_t fd; FD_t fd;
int xx; int xx;
/* XXX TODO: teach rdcl() to read through a URI, eliminate ".fpio". */ /* XXX TODO: teach rdcl() to read through a URI, eliminate ".fpio". */
fd = Fopen(fn, "r.fpio"); fd = Fopen(fn, "r.fpio");
if (fd == NULL || Ferror(fd)) { if (fd == NULL || Ferror(fd)) {
if (fd) (void) Fclose(fd); if (fd) (void) Fclose(fd);
return rc; return rc;
skipping to change at line 2938 skipping to change at line 2942
for (i = 0; i < mc->firstFree; i++) { for (i = 0; i < mc->firstFree; i++) {
MacroEntry me; MacroEntry me;
while ((me = mc->macroTable[i]) != NULL) { while ((me = mc->macroTable[i]) != NULL) {
/* XXX cast to workaround const */ /* XXX cast to workaround const */
/*@-onlytrans@*/ /*@-onlytrans@*/
if ((mc->macroTable[i] = me->prev) == NULL) if ((mc->macroTable[i] = me->prev) == NULL)
me->name = _free(me->name); me->name = _free(me->name);
/*@=onlytrans@*/ /*@=onlytrans@*/
me->opts = _free(me->opts); me->opts = _free(me->opts);
me->body = _free(me->body); me->body = _free(me->body);
me = _free(me); if (me) free(me);
me = NULL;
} }
} }
mc->macroTable = _free(mc->macroTable); free(mc->macroTable);
mc->macroTable = NULL;
} }
memset(mc, 0, sizeof(*mc)); memset(mc, 0, sizeof(*mc));
} }
/*@=globstate@*/ /*@=globstate@*/
/* =============================================================== */ /* =============================================================== */
int isCompressed(const char * file, rpmCompressedMagic * compressed) int isCompressed(const char * file, rpmCompressedMagic * compressed)
{ {
FD_t fd; FD_t fd;
ssize_t nb; ssize_t nb;
skipping to change at line 3079 skipping to change at line 3085
const char *s; const char *s;
char *t, *te; char *t, *te;
size_t sn, tn; size_t sn, tn;
size_t bufn = 8 * _macro_BUFSIZ; size_t bufn = 8 * _macro_BUFSIZ;
va_list ap; va_list ap;
if (arg == NULL) if (arg == NULL)
return xstrdup(""); return xstrdup("");
t = xmalloc(bufn + strlen(arg) + 1); t = (char *) xmalloc(bufn + strlen(arg) + 1);
*t = '\0'; *t = '\0';
te = stpcpy(t, arg); te = stpcpy(t, arg);
va_start(ap, arg); va_start(ap, arg);
while ((s = va_arg(ap, const char *)) != NULL) { while ((s = va_arg(ap, const char *)) != NULL) {
sn = strlen(s); sn = strlen(s);
tn = (te - t); tn = (te - t);
t = xrealloc(t, tn + sn + bufn + 1); t = (char *) xrealloc(t, tn + sn + bufn + 1);
te = t + tn; te = t + tn;
te = stpcpy(te, s); te = stpcpy(te, s);
} }
va_end(ap); va_end(ap);
*te = '\0'; *te = '\0';
tn = (te - t); tn = (te - t);
(void) expandMacros(NULL, mc, t, tn + bufn + 1); (void) expandMacros(NULL, mc, t, tn + bufn + 1);
t[tn + bufn] = '\0'; t[tn + bufn] = '\0';
t = xrealloc(t, strlen(t) + 1); t = (char *) xrealloc(t, strlen(t) + 1);
return t; return t;
} }
char * char *
rpmMCExpand(MacroContext mc, const char *arg, ...) rpmMCExpand(MacroContext mc, const char *arg, ...)
{ {
const char *s; const char *s;
char *t, *te; char *t, *te;
size_t sn, tn; size_t sn, tn;
size_t bufn = 8 * _macro_BUFSIZ; size_t bufn = 8 * _macro_BUFSIZ;
va_list ap; va_list ap;
if (arg == NULL) if (arg == NULL)
return xstrdup(""); return xstrdup("");
t = xmalloc(bufn + strlen(arg) + 1); t = (char *) xmalloc(bufn + strlen(arg) + 1);
*t = '\0'; *t = '\0';
te = stpcpy(t, arg); te = stpcpy(t, arg);
va_start(ap, arg); va_start(ap, arg);
while ((s = va_arg(ap, const char *)) != NULL) { while ((s = va_arg(ap, const char *)) != NULL) {
sn = strlen(s); sn = strlen(s);
tn = (te - t); tn = (te - t);
t = xrealloc(t, tn + sn + bufn + 1); t = (char *) xrealloc(t, tn + sn + bufn + 1);
te = t + tn; te = t + tn;
te = stpcpy(te, s); te = stpcpy(te, s);
} }
va_end(ap); va_end(ap);
*te = '\0'; *te = '\0';
tn = (te - t); tn = (te - t);
(void) expandMacros(NULL, mc, t, tn + bufn + 1); (void) expandMacros(NULL, mc, t, tn + bufn + 1);
t[tn + bufn] = '\0'; t[tn + bufn] = '\0';
t = xrealloc(t, strlen(t) + 1); t = (char *) xrealloc(t, strlen(t) + 1);
return t; return t;
} }
/*@=modfilesys@*/ /*@=modfilesys@*/
int int
rpmExpandNumeric(const char *arg) rpmExpandNumeric(const char *arg)
{ {
const char *val; const char *val;
int rc; int rc;
skipping to change at line 3262 skipping to change at line 3268
/*fprintf(stderr, "\t%s\n", path); */ /*fprintf(stderr, "\t%s\n", path); */
return path; return path;
} }
/* Return concatenated and expanded canonical path. */ /* Return concatenated and expanded canonical path. */
char * char *
rpmGetPath(const char *path, ...) rpmGetPath(const char *path, ...)
{ {
size_t bufn = _macro_BUFSIZ; size_t bufn = _macro_BUFSIZ;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
const char * s; const char * s;
char * t, * te; char * t, * te;
int slashed = 0; int slashed = 0;
va_list ap; va_list ap;
if (path == NULL) if (path == NULL)
return xstrdup(""); return xstrdup("");
buf[0] = '\0'; buf[0] = '\0';
t = buf; t = buf;
skipping to change at line 3358 skipping to change at line 3364
url = xfile; url = xfile;
nurl = strlen(url); nurl = strlen(url);
if (file >= url && file <= url+nurl) if (file >= url && file <= url+nurl)
nurl -= strlen(file); nurl -= strlen(file);
#if 0 #if 0
if (_debug) fprintf(stderr, "*** RGP ut %d file %s nurl %u\n", ut, file, (u nsigned)nurl); if (_debug) fprintf(stderr, "*** RGP ut %d file %s nurl %u\n", ut, file, (u nsigned)nurl);
#endif #endif
} }
if (url && nurl > 0) { if (url && nurl > 0) {
char *t = strncpy(alloca(nurl+1), url, nurl); char *t = strncpy((char *)alloca(nurl+1), url, nurl);
t[nurl] = '\0'; t[nurl] = '\0';
url = t; url = t;
} else } else
url = ""; url = "";
result = rpmGetPath(url, root, "/", mdir, "/", file, NULL); result = rpmGetPath(url, root, "/", mdir, "/", file, NULL);
xroot = _free(xroot); xroot = _free(xroot);
xmdir = _free(xmdir); xmdir = _free(xmdir);
xfile = _free(xfile); xfile = _free(xfile);
skipping to change at line 3431 skipping to change at line 3437
#else /* !EVAL_MACROS */ #else /* !EVAL_MACROS */
const char *rpmMacrofiles = "../macros:./testmacros"; const char *rpmMacrofiles = "../macros:./testmacros";
const char *testfile = "./test"; const char *testfile = "./test";
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
size_t bufn = _macro_BUFSIZ; size_t bufn = _macro_BUFSIZ;
char *buf = alloca(bufn); char *buf = (char *) alloca(bufn);
FILE *fp; FILE *fp;
int x; int x;
rpmInitMacros(NULL, rpmMacrofiles); rpmInitMacros(NULL, rpmMacrofiles);
if ((fp = fopen(testfile, "r")) != NULL) { if ((fp = fopen(testfile, "r")) != NULL) {
while(rdcl(buf, bufn, fp)) { while(rdcl(buf, bufn, fp)) {
x = expandMacros(NULL, NULL, buf, bufn); x = expandMacros(NULL, NULL, buf, bufn);
fprintf(stderr, "%d->%s\n", x, buf); fprintf(stderr, "%d->%s\n", x, buf);
memset(buf, 0, bufn); memset(buf, 0, bufn);
 End of changes. 45 change blocks. 
46 lines changed or deleted 52 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/