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/ |