10 #define isblank(_c) ((_c) == ' ' || (_c) == '\t')
12 #define iseol(_c) ((_c) == '\n' || (_c) == '\r')
14 #define STREQ(_t, _f, _fn) ((_fn) == (sizeof(_t)-1) && !strncmp((_t), (_f), (_fn)))
18 #include <sys/types.h>
27 #define rpmError fprintf
28 #define rpmIsVerbose() (0)
29 #define RPMERR_BADSPEC stderr
33 #define vmefail(_nb) (exit(1), NULL)
36 #define urlPath(_xr, _r) (*(_r) = (_xr), URL_IS_PATH)
37 #define xisalnum(_c) isalnum(_c)
38 #define xisalpha(_c) isalpha(_c)
39 #define xisdigit(_c) isdigit(_c)
42 #define Fopen(_path, _fmode) fopen(_path, "r");
44 #define Fstrerror(_fd) strerror(errno)
48 #define fdGetFILE(_fd) (_fd)
51 _free(
const void * p)
54 if (p != NULL) free((
void *)p);
77 #if defined(__LCLINT__)
79 extern const unsigned short int **__ctype_b_loc (
void) ;
116 #define SAVECHAR(_mb, _c) { *(_mb)->t = (_c), (_mb)->t++, (_mb)->nb--; }
120 #define _MAX_MACRO_DEPTH 16
124 #define _PRINT_MACRO_TRACE 0
128 #define _PRINT_EXPAND_TRACE 0
133 #define MACRO_CHUNK_SIZE 16
160 if (ame == NULL && bme == NULL)
166 return strcmp(ame->
name, bme->
name);
225 if (fp == NULL) fp = stderr;
227 fprintf(fp,
"========================\n");
237 fprintf(fp,
"%3d%c %s", me->
level,
238 (me->
used > 0 ?
'=' :
':'), me->
name);
240 fprintf(fp,
"(%s)", me->
opts);
242 fprintf(fp,
"\t%s", me->
body);
247 fprintf(fp,
_(
"======================== active %d empty %d\n"),
274 char * t = strncpy(
alloca(namelen + 1), name, namelen);
280 key = memset(
alloca(
sizeof(*key)), 0,
sizeof(*key));
282 key->
name = (
char *)name;
317 if (fgets(q, size, f) == NULL)
321 for (q += nb - 1; nb > 0 &&
iseol(*q); q--)
323 for (; p <= q; p++) {
333 case '{': p++, bc++;
break;
334 case '(': p++, pc++;
break;
335 case '%': p++;
break;
338 case '{':
if (bc > 0) bc++;
break;
339 case '}':
if (bc > 0) bc--;
break;
340 case '(':
if (pc > 0) pc++;
break;
341 case ')':
if (pc > 0) pc--;
break;
344 if (nb == 0 || (*q !=
'\\' && !bc && !pc) || *(q+1) ==
'\0') {
353 return (nread > 0 ? buf : NULL);
372 while ((c = *p++) !=
'\0') {
378 if (--lvl <= 0)
return --p;
382 return (
const char *)NULL;
397 const char *ellipsis;
401 fprintf(stderr,
_(
"%3d>%*s(empty)"), mb->
depth,
402 (2 * mb->
depth + 1),
"");
410 for (senl = se; *senl && !
iseol(*senl); senl++)
414 choplen = 61 - (2 * mb->
depth);
415 if ((senl - s) > choplen) {
422 fprintf(stderr,
"%3d>%*s%%%.*s^", mb->
depth,
423 (2 * mb->
depth + 1),
"", (
int)(se - s), s);
424 if (se[1] !=
'\0' && (senl - (se+1)) > 0)
425 fprintf(stderr,
"%-.*s%s", (
int)(senl - (se+1)), se+1, ellipsis);
426 fprintf(stderr,
"\n");
440 const char *ellipsis;
444 fprintf(stderr,
_(
"%3d<%*s(empty)\n"), mb->
depth, (2 * mb->
depth + 1),
"");
449 while (te > t &&
iseol(te[-1]))
456 while ((tenl = strchr(t,
'\n')) && tenl < te)
460 choplen = 61 - (2 * mb->
depth);
461 if ((te - t) > choplen) {
467 fprintf(stderr,
"%3d<%*s", mb->
depth, (2 * mb->
depth + 1),
"");
469 fprintf(stderr,
"%.*s%s", (
int)(te - t), t, ellipsis);
470 fprintf(stderr,
"\n");
473 #define SKIPBLANK(_s, _c) \
475 while (((_c) = *(_s)) && isblank(_c)) \
479 #define SKIPNONBLANK(_s, _c) \
481 while (((_c) = *(_s)) && !(isblank(_c) || iseol(_c))) \
485 #define COPYNAME(_ne, _s, _c) \
486 { SKIPBLANK(_s,_c); \
488 while(((_c) = *(_s)) && (xisalnum(_c) || (_c) == '_')) \
489 *(_ne)++ = *(_s)++; \
494 #define COPYOPTS(_oe, _s, _c) \
496 while(((_c) = *(_s)) && (_c) != ')') \
497 *(_oe)++ = *(_s)++; \
515 const char *s = mb->
s;
519 memset(sbuf, 0, (flen + 1));
521 strncpy(sbuf, f, flen);
538 expandS(
MacroBuf mb,
char * tbuf,
size_t tbuflen)
542 const char *t = mb->
t;
568 const char *s = mb->
s;
575 memset(tbuf, 0, (ulen + 1));
584 strncpy(u, tbuf, (ulen - mb->
nb + 1));
608 char * buf =
alloca(bufn);
613 strncpy(buf, cmd, clen);
619 if ((shf = popen(buf,
"r")) == NULL)
621 while(mb->
nb > 0 && (c = fgetc(shf)) != EOF)
626 while (
iseol(mb->
t[-1])) {
679 if ((se =
matchchar(s, c,
'}')) == NULL) {
681 _(
"Macro %%%s has unterminated body\n"), n);
687 strncpy(b, s, (se - s));
696 while (*s && (bc || pc || !
iseol(*s))) {
706 case '{': *be++ = *s++; bc++;
break;
707 case '(': *be++ = *s++; pc++;
break;
708 case '%': *be++ = *s++;
break;
711 case '{':
if (bc > 0) bc++;
break;
712 case '}':
if (bc > 0) bc--;
break;
713 case '(':
if (pc > 0) pc++;
break;
714 case ')':
if (pc > 0) pc--;
break;
722 _(
"Macro %%%s has unterminated body\n"), n);
729 while (--be >= b && (c = *be) && (
isblank(c) ||
iseol(c)))
742 if (!((c = *n) && (
xisalpha(c) || c ==
'_') && (ne - n) > 2)) {
744 _(
"Macro %%%s has illegal name (%%define)\n"), n);
749 if (o && oc !=
')') {
760 if (expandbody &&
expandU(mb, b, (&buf[bufn] - b))) {
788 char *n = buf, *ne = n;
799 if (!((c = *n) && (
xisalpha(c) || c ==
'_') && (ne - n) > 2)) {
801 _(
"Macro %%%s has illegal name (%%undefine)\n"), n);
824 char *n = buf, *ne = n;
835 if (!((c = *n) && (
xisalpha(c) || c ==
'_') && (ne - n) > 2)) {
837 _(
"Macro %%%s has illegal name (%%unglobal)\n"), n);
853 fprintf(stderr,
"%s", msg);
854 fprintf(stderr,
"\tme %p", me);
856 fprintf(stderr,
"\tname %p(%s) prev %p",
858 fprintf(stderr,
"\n");
872 const char * b,
int level)
875 MacroEntry prev = (mep && *mep ? *mep : NULL);
877 const char *
name = n;
892 me->
flags = (name != n);
918 if ((*mep = me->
prev) == NULL)
955 if (strlen(me->
name) == 1 && strchr(
"#*0", *me->
name)) {
956 if (*me->
name ==
'*' && me->
used > 0)
958 }
else if (!skiptest && me->
used <= 0) {
961 _(
"Macro %%%s (%s) was not used below level %d\n"),
995 const char *opts, *o;
1010 while ((c = *se++) !=
'\0' && (se-1) != lastc) {
1024 if (c ==
'\0') se--;
1047 argv = (
const char **)
alloca((argc + 1) *
sizeof(*argv));
1051 for (c = 0; c < argc; c++) {
1086 while((c = getopt(argc, (
char **)argv, opts)) != -1)
1089 if (c ==
'?' || (o = strchr(opts, c)) == NULL) {
1091 (
char)c, me->
name, opts);
1101 aname[0] =
'-'; aname[1] = c; aname[2] =
'\0';
1104 aname[0] =
'-'; aname[1] = c; aname[2] =
'*'; aname[3] =
'\0';
1111 sprintf(aname,
"%d", (argc - optind));
1117 for (c = optind; c < argc; c++) {
1118 sprintf(aname,
"%d", (c - optind + 1));
1120 if (be != b) *be++ =
' ';
1122 be =
stpcpy(be, argv[c]);
1147 char *buf =
alloca(bufn);
1149 strncpy(buf, msg, msglen);
1151 (void)
expandU(mb, buf, bufn);
1155 fprintf(stderr,
"%s", buf);
1169 const char * g,
size_t gn)
1174 char * buf =
alloca(bufn);
1175 char *b = NULL, *be;
1180 strncpy(buf, g, gn);
1182 (void)
expandU(mb, buf, bufn);
1187 for (c = 5; c < fn-1 && f[c] ==
'0' &&
xisdigit(f[c+1]);)
1194 if (
STREQ(
"basename", f, fn)) {
1195 if ((b = strrchr(buf,
'/')) == NULL)
1199 }
else if (
STREQ(
"dirname", f, fn)) {
1200 if ((b = strrchr(buf,
'/')) != NULL)
1203 }
else if (
STREQ(
"suffix", f, fn)) {
1204 if ((b = strrchr(buf,
'.')) != NULL)
1206 }
else if (
STREQ(
"expand", f, fn)) {
1208 }
else if (
STREQ(
"verbose", f, fn)) {
1213 }
else if (
STREQ(
"url2path", f, fn) ||
STREQ(
"u2p", f, fn)) {
1214 int ut =
urlPath(buf, (
const char **)&b);
1217 if (*b ==
'\0') b =
"/";
1219 }
else if (
STREQ(
"uncompress", f, fn)) {
1222 for (b = buf; (c = *b) &&
isblank(c);)
1224 for (be = b; (c = *be) && !
isblank(c);)
1229 switch(compressed) {
1232 sprintf(be,
"%%__cat %s", b);
1235 sprintf(be,
"%%__gzip -dc %s", b);
1238 sprintf(be,
"%%__bzip2 -dc %s", b);
1241 sprintf(be,
"%%__unzip -qq %s", b);
1244 sprintf(be,
"%%__lzop -dc %s", b);
1247 sprintf(be,
"%%__lzma -dc %s", b);
1250 sprintf(be,
"%%__xz -dc %s", b);
1254 }
else if (
STREQ(
"S", f, fn)) {
1255 for (b = buf; (c = *b) &&
xisdigit(c);)
1259 sprintf(b,
"%%SOURCE%s", buf);
1262 }
else if (
STREQ(
"P", f, fn)) {
1263 for (b = buf; (c = *b) &&
xisdigit(c);)
1267 sprintf(b,
"%%PATCH%s", buf);
1270 }
else if (
STREQ(
"F", f, fn)) {
1271 b = buf + strlen(buf) + 1;
1272 sprintf(b,
"file%s.file", buf);
1276 (void)
expandT(mb, b, strlen(b));
1295 const char *s = mb->
s, *se;
1308 _(
"Recursion depth(%d) greater than max(%d)\n"),
1316 while (rc == 0 && mb->
nb > 0 && (c = *s) !=
'\0') {
1343 while (*s !=
'\0' && strchr(
"!?", *s) != NULL) {
1346 negate = ((negate + 1) % 2);
1356 while((c = *se) && (
xisalnum(c) || c ==
'_'))
1362 if (*se ==
'*') se++;
1374 if ((lastc = strchr(fe,
'\n')) == NULL)
1375 lastc = strchr(fe,
'\0');
1379 if ((se =
matchchar(s, c,
')')) == NULL) {
1381 _(
"Unterminated %c: %s\n"), (
char)c, s);
1396 if ((se =
matchchar(s, c,
'}')) == NULL) {
1398 _(
"Unterminated %c: %s\n"), (
char)c, s);
1404 while (strchr(
"!?", *f) != NULL) {
1407 negate = ((negate + 1) % 2);
1415 for (fe = f; (c = *fe) && !strchr(
" :}", c);)
1434 if ((fe - f) <= 0) {
1440 _(
"A %% is followed by an unparseable macro\n"));
1450 if (
STREQ(
"load", f, fn)) {
1452 char * mfn = strncpy(
alloca(gn + 1), g, gn);
1460 if (
STREQ(
"global", f, fn)) {
1464 if (
STREQ(
"define", f, fn)) {
1468 if (
STREQ(
"undefine", f, fn)) {
1472 if (
STREQ(
"unglobal", f, fn)) {
1477 if (
STREQ(
"echo", f, fn) ||
1478 STREQ(
"warn", f, fn) ||
1479 STREQ(
"error", f, fn)) {
1481 if (
STREQ(
"error", f, fn))
1483 if (g != NULL && g < ge)
1491 if (
STREQ(
"trace", f, fn)) {
1494 if (mb->
depth == 1) {
1502 if (
STREQ(
"dump", f, fn)) {
1511 if (
STREQ(
"lua", f, fn)) {
1513 const char *ls = s+
sizeof(
"{lua:")-1;
1514 const char *lse = se-
sizeof(
"}")+1;
1515 char *scriptbuf = (
char *)
xmalloc((lse-ls)+1);
1516 const char *printbuf;
1517 memcpy(scriptbuf, ls, lse-ls);
1518 scriptbuf[lse-ls] =
'\0';
1519 rpmluaSetPrintBuffer(lua, 1);
1520 if (rpmluaRunScript(lua, scriptbuf, NULL) == -1)
1522 printbuf = rpmluaGetPrintBuffer(lua);
1524 int len = strlen(printbuf);
1527 memcpy(mb->
t, printbuf, len);
1531 rpmluaSetPrintBuffer(lua, 0);
1540 if (lastc != NULL && fn > 5 &&
STREQ(
"patch", f, 5) &&
xisdigit(f[5])) {
1542 doFoo(mb, negate, f, (lastc - f), NULL, 0);
1550 if (
STREQ(
"basename", f, fn) ||
1551 STREQ(
"dirname", f, fn) ||
1552 STREQ(
"suffix", f, fn) ||
1553 STREQ(
"expand", f, fn) ||
1554 STREQ(
"verbose", f, fn) ||
1555 STREQ(
"uncompress", f, fn) ||
1556 STREQ(
"url2path", f, fn) ||
1557 STREQ(
"u2p", f, fn) ||
1558 STREQ(
"S", f, fn) ||
1559 STREQ(
"P", f, fn) ||
1560 STREQ(
"F", f, fn)) {
1562 doFoo(mb, negate, f, fn, g, gn);
1570 me = (mep ? *mep : NULL);
1576 if ((me == NULL && !negate) ||
1577 (me != NULL && negate)) {
1594 if ((me == NULL && !negate) ||
1595 (me != NULL && negate)) {
1613 if (fn == 1 && *f ==
'*') {
1622 if (!strncmp(f,
"if", fn) ||
1623 !strncmp(f,
"else", fn) ||
1624 !strncmp(f,
"endif", fn)) {
1629 _(
"Macro %%%.*s not found, skipping\n"), fn, f);
1637 if (me && me->
opts != NULL) {
1638 if (lastc != NULL) {
1657 if (me->
opts != NULL)
1672 #if !defined(DEBUG_MACROS)
1676 #define POPT_ERROR_NOARG -10
1677 #define POPT_ERROR_BADQUOTE -15
1678 #define POPT_ERROR_MALLOC -21
1680 #define POPT_ARGV_ARRAY_GROW_DELTA 5
1684 int * argcPtr,
const char *** argvPtr)
1687 size_t nb = (argc + 1) *
sizeof(*argv);
1688 const char ** argv2;
1692 if (argc <= 0 || argv == NULL)
1694 for (i = 0; i < argc; i++) {
1695 if (argv[i] == NULL)
1697 nb += strlen(argv[i]) + 1;
1703 argv2 = (
void *) dst;
1704 dst += (argc + 1) *
sizeof(*argv);
1707 for (i = 0; i < argc; i++) {
1709 dst += strlen(strcpy(dst, argv[i])) + 1;
1733 const char ** argv = malloc(
sizeof(*argv) * argvAlloced);
1735 int buflen = strlen(s) + 1;
1736 char * buf = memset(
alloca(buflen), 0, buflen);
1739 if (argv == NULL)
return rc;
1742 for (src = s; *src !=
'\0'; src++) {
1743 if (quote == *src) {
1745 }
else if (quote !=
'\0') {
1752 if (*src != quote) *buf++ =
'\\';
1755 }
else if (isspace(*src)) {
1756 if (*argv[argc] !=
'\0') {
1758 if (argc == argvAlloced) {
1760 argv = realloc(argv,
sizeof(*argv) * argvAlloced);
1761 if (argv == NULL)
goto exit;
1765 }
else switch (*src) {
1783 if (strlen(argv[argc])) {
1790 if (argv) free(argv);
1798 int rpmGlob(
const char * patterns,
int * argcPtr,
const char *** argvPtr)
1801 const char ** av = NULL;
1803 const char ** argv = NULL;
1804 char * globRoot = NULL;
1806 const char * old_collate = NULL;
1807 const char * old_ctype = NULL;
1831 for (j = 0; j < ac; j++) {
1832 const char * globURL;
1834 int ut =
urlPath(av[j], &path);
1838 argv =
xrealloc(argv, (argc+2) *
sizeof(*argv));
1841 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]);
1854 for (i = 0; i < gl.gl_pathc; i++) {
1855 if ((nb = strlen(&(gl.gl_pathv[i][0]))) > maxb)
1862 globURL = globRoot =
xmalloc(maxb);
1867 strncpy(globRoot, av[j], nb);
1880 fprintf(stderr,
"*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (
int)maxb, (
int)nb, (
int)nb, av[j], globURL, globURL);
1882 argv =
xrealloc(argv, (argc+gl.gl_pathc+1) *
sizeof(*argv));
1885 for (i = 0; i < gl.gl_pathc; i++) {
1886 const char * globFile = &(gl.gl_pathv[i][0]);
1887 if (globRoot > globURL && globRoot[-1] ==
'/')
1888 while (*globFile ==
'/') globFile++;
1889 strcpy(globRoot, globFile);
1891 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, globURL);
1892 argv[argc++] =
xstrdup(globURL);
1897 globURL =
_free(globURL);
1900 if (argv != NULL && argc > 0) {
1915 (void)
setlocale(LC_COLLATE, old_collate);
1916 old_collate =
_free(old_collate);
1920 old_ctype =
_free(old_ctype);
1926 if (rc || argvPtr == NULL) {
1929 for (i = 0; i < argc; i++)
1930 argv[i] =
_free(argv[i]);
1948 if (sbuf == NULL || slen == 0)
1953 memset(tbuf, 0, (slen + 1));
1971 strncpy(sbuf, tbuf, (slen - mb->
nb + 1));
1978 const char * n,
const char * o,
const char * b,
int level)
1981 const char *
name = n;
1991 if ((mep =
findEntry(mc, name, 0)) == NULL) {
2000 if (*mep && (*mep)->
flags && !(n[0] ==
'.' && n[1] ==
'.')) {
2002 if (strcmp((*mep)->name,
"buildroot"))
2010 if ((*mep)->prev == NULL)
2022 if ((mep =
findEntry(mc, n, 0)) != NULL) {
2037 while ((mep =
findEntry(mc, n, 0)) != NULL) {
2048 memset(mb, 0,
sizeof(*mb));
2051 (void)
doDefine(mb, macro, level, 0);
2060 if (mc == NULL || mc == rpmGlobalMacroContext)
2082 char *buf =
alloca(bufn);
2085 if (fd == NULL ||
Ferror(fd)) {
2086 if (fd) (void)
Fclose(fd);
2096 while(
rdcl(buf, bufn, fd) != NULL) {
2114 char *mfiles, *m, *me;
2116 if (macrofiles == NULL)
2123 for (m = mfiles; m && *m !=
'\0'; m = me) {
2128 for (me = m; (me = strchr(me,
':')) != NULL; me++) {
2130 if (!(me[1] ==
'/' && me[2] ==
'/'))
2134 if (me && *me ==
':')
2142 #if defined(DEBUG_MACROS)
2144 av =
xmalloc((ac + 1) *
sizeof(*av));
2155 for (i = 0; i < ac; i++) {
2156 size_t slen = strlen(av[i]);
2159 #define _suffix(_s, _x) \
2160 (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))
2164 ||
_suffix(av[i],
".rpmsave"))
2169 av[i] =
_free(av[i]);
2173 mfiles =
_free(mfiles);
2205 memset(mc, 0,
sizeof(*mc));
2215 unsigned char magic[13];
2220 fd =
Fopen(file,
"r");
2221 if (fd == NULL ||
Ferror(fd)) {
2224 if (fd) (void)
Fclose(fd);
2227 nb =
Fread(magic,
sizeof(magic[0]),
sizeof(magic), fd);
2231 }
else if (nb <
sizeof(magic)) {
2233 file, (
unsigned)
sizeof(magic));
2243 end = strchr(file,
'\0');
2245 if (ext > file && !strcasecmp(ext,
".tar"))
return rc;
2247 if (magic[0] ==
'B' && magic[1] ==
'Z')
2250 if (magic[0] == 0120 && magic[1] == 0113
2251 && magic[2] == 0003 && magic[3] == 0004)
2254 if (magic[0] == 0x89 && magic[1] ==
'L'
2255 && magic[2] ==
'Z' && magic[3] ==
'O')
2259 if (magic[ 9] == 0x00 && magic[10] == 0x00 &&
2260 magic[11] == 0x00 && magic[12] == 0x00)
2263 if (magic[0] == 0135 && magic[1] == 0 && magic[2] == 0)
2266 if (magic[0] == 0xFD && magic[1] == 0x37 && magic[2] == 0x7A
2267 && magic[3] == 0x58 && magic[4] == 0x5A && magic[5] == 0x00)
2270 if ((magic[0] == 0037 && magic[1] == 0213)
2271 || (magic[0] == 0037 && magic[1] == 0236)
2272 || (magic[0] == 0037 && magic[1] == 0036)
2273 || (magic[0] == 0037 && magic[1] == 0240)
2274 || (magic[0] == 0037 && magic[1] == 0235))
2296 t =
xmalloc(bufn + strlen(arg) + 1);
2302 while ((s = va_arg(ap,
const char *)) != NULL) {
2305 t =
xrealloc(t, tn + sn + bufn + 1);
2315 t[tn + bufn] =
'\0';
2332 if (!(val && *val !=
'%'))
2334 else if (*val ==
'Y' || *val ==
'y')
2336 else if (*val ==
'N' || *val ==
'n')
2340 rc = strtol(val, &end, 0);
2341 if (!(end && *end ==
'\0'))
2361 while (*s !=
'\0') {
2365 if (s[1] ==
'/' && s[2] ==
'/') {
2369 if (s[0] ==
'/') *t++ = *s++;
2377 for (se = te + 1; se < t && *se !=
'/'; se++)
2379 if (se < t && *se ==
'/') {
2385 while (t > te && t[-1] ==
'/')
2395 if (begin && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
2401 if (begin && s[1] ==
'\0') {
2405 if ((t[-1] ==
'/' && s[1] ==
'\0') || (t > path && t[-1] ==
'/' && s[1] ==
'/')) {
2410 if (!begin && t > path && t[-1] ==
'/' && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
2414 for (--te; te > path && *te !=
'/'; te--)
2430 if (t > &path[1] && t[-1] ==
'/')
2444 char *buf =
alloca(bufn);
2458 while ((s = va_arg(ap,
const char *)) != NULL) {
2473 const char *
rpmGenPath(
const char * urlroot,
const char * urlmdir,
2474 const char *urlfile)
2476 const char * xroot =
rpmGetPath(urlroot, NULL);
2477 const char * root = xroot;
2478 const char * xmdir =
rpmGetPath(urlmdir, NULL);
2479 const char * mdir = xmdir;
2480 const char * xfile =
rpmGetPath(urlfile, NULL);
2481 const char *
file = xfile;
2482 const char * result;
2483 const char * url = NULL;
2488 if (_debug) fprintf(stderr,
"*** RGP xroot %s xmdir %s xfile %s\n", xroot, xmdir, xfile);
2493 nurl = root - xroot;
2495 if (_debug) fprintf(stderr,
"*** RGP ut %d root %s nurl %d\n", ut, root, nurl);
2498 if (root == NULL || *root ==
'\0') root =
"/";
2503 nurl = mdir - xmdir;
2505 if (_debug) fprintf(stderr,
"*** RGP ut %d mdir %s nurl %d\n", ut, mdir, nurl);
2508 if (mdir == NULL || *mdir ==
'\0') mdir =
"/";
2513 nurl = file - xfile;
2515 if (_debug) fprintf(stderr,
"*** RGP ut %d file %s nurl %d\n", ut, file, nurl);
2520 if (url && nurl > 0) {
2521 char *t = strncpy(
alloca(nurl+1), url, nurl);
2528 result =
rpmGetPath(url, root,
"/", mdir,
"/", file, NULL);
2530 xroot =
_free(xroot);
2531 xmdir =
_free(xmdir);
2532 xfile =
_free(xfile);
2534 if (_debug) fprintf(stderr,
"*** RGP result %s\n", result);
2541 #if defined(DEBUG_MACROS)
2543 #if defined(EVAL_MACROS)
2548 main(
int argc,
char *argv[])
2552 extern char *optarg;
2555 while ((c = getopt(argc, argv,
"f:")) != EOF ) {
2558 rpmMacrofiles = optarg;
2566 if (errflg || optind >= argc) {
2567 fprintf(stderr,
"Usage: %s [-f macropath ] macro ...\n", argv[0]);
2573 for ( ; optind < argc; optind++) {
2578 fprintf(stdout,
"%s:\t%s\n", argv[optind], val);
2588 const char *rpmMacrofiles =
"../macros:./testmacros";
2589 const char *testfile =
"./test";
2592 main(
int argc,
char *argv[])
2595 char *buf =
alloca(bufn);
2601 if ((fp = fopen(testfile,
"r")) != NULL) {
2602 while(
rdcl(buf, bufn, fp)) {
2604 fprintf(stderr,
"%d->%s\n", x, buf);
2605 memset(buf, 0, bufn);
2610 while(
rdcl(buf, bufn, stdin)) {
2612 fprintf(stderr,
"%d->%s\n <-\n", x, buf);
2613 memset(buf, 0, bufn);