version 1.57, 2005/08/06 16:22:26 |
version 1.58, 2005/09/06 15:33:21 |
|
|
static void doifelse(const char *[], int); |
static void doifelse(const char *[], int); |
static int doincl(const char *); |
static int doincl(const char *); |
static int dopaste(const char *); |
static int dopaste(const char *); |
static void gnu_dochq(const char *[], int); |
|
static void dochq(const char *[], int); |
static void dochq(const char *[], int); |
static void gnu_dochc(const char *[], int); |
|
static void dochc(const char *[], int); |
static void dochc(const char *[], int); |
static void dom4wrap(const char *); |
static void dom4wrap(const char *); |
static void dodiv(int); |
static void dodiv(int); |
|
|
* have macro-or-builtin() type call. We adjust |
* have macro-or-builtin() type call. We adjust |
* argc to avoid further checking.. |
* argc to avoid further checking.. |
*/ |
*/ |
|
/* we keep the initial value for those built-ins that differentiate |
|
* between builtin() and builtin. |
|
*/ |
ac = argc; |
ac = argc; |
|
|
if (argc == 3 && !*(argv[2])) |
if (argc == 3 && !*(argv[2])) |
|
|
break; |
break; |
#endif |
#endif |
case CHNQTYPE: |
case CHNQTYPE: |
if (mimic_gnu) |
dochq(argv, ac); |
gnu_dochq(argv, ac); |
|
else |
|
dochq(argv, argc); |
|
break; |
break; |
|
|
case CHNCTYPE: |
case CHNCTYPE: |
if (mimic_gnu) |
dochc(argv, argc); |
gnu_dochc(argv, ac); |
|
else |
|
dochc(argv, argc); |
|
break; |
break; |
|
|
case SUBSTYPE: |
case SUBSTYPE: |
|
|
pbstr(rquote); |
pbstr(rquote); |
pbstr(argv[n]); |
pbstr(argv[n]); |
pbstr(lquote); |
pbstr(lquote); |
putback(COMMA); |
pushback(COMMA); |
} |
} |
pbstr(rquote); |
pbstr(rquote); |
pbstr(argv[3]); |
pbstr(argv[3]); |
|
|
p--; /* last character of defn */ |
p--; /* last character of defn */ |
while (p > t) { |
while (p > t) { |
if (*(p - 1) != ARGFLAG) |
if (*(p - 1) != ARGFLAG) |
PUTBACK(*p); |
PUSHBACK(*p); |
else { |
else { |
switch (*p) { |
switch (*p) { |
|
|
|
|
if (argc > 2) { |
if (argc > 2) { |
for (n = argc - 1; n > 2; n--) { |
for (n = argc - 1; n > 2; n--) { |
pbstr(argv[n]); |
pbstr(argv[n]); |
putback(COMMA); |
pushback(COMMA); |
} |
} |
pbstr(argv[2]); |
pbstr(argv[2]); |
} |
} |
|
|
pbstr(rquote); |
pbstr(rquote); |
pbstr(argv[n]); |
pbstr(argv[n]); |
pbstr(lquote); |
pbstr(lquote); |
putback(COMMA); |
pushback(COMMA); |
} |
} |
pbstr(rquote); |
pbstr(rquote); |
pbstr(argv[2]); |
pbstr(argv[2]); |
|
|
} |
} |
break; |
break; |
default: |
default: |
PUTBACK(*p); |
PUSHBACK(*p); |
PUTBACK('$'); |
PUSHBACK('$'); |
break; |
break; |
} |
} |
p--; |
p--; |
|
|
p--; |
p--; |
} |
} |
if (p == t) /* do last character */ |
if (p == t) /* do last character */ |
PUTBACK(*p); |
PUSHBACK(*p); |
} |
} |
|
|
|
|
|
|
} |
} |
#endif |
#endif |
|
|
|
/* |
|
* dochq - change quote characters |
|
*/ |
static void |
static void |
gnu_dochq(const char *argv[], int ac) |
dochq(const char *argv[], int ac) |
{ |
{ |
/* In gnu-m4 mode, the only way to restore quotes is to have no |
|
* arguments at all. */ |
|
if (ac == 2) { |
if (ac == 2) { |
lquote[0] = LQUOTE, lquote[1] = EOS; |
lquote[0] = LQUOTE; lquote[1] = EOS; |
rquote[0] = RQUOTE, rquote[1] = EOS; |
rquote[0] = RQUOTE; rquote[1] = EOS; |
} else { |
} else { |
strlcpy(lquote, argv[2], sizeof(lquote)); |
strlcpy(lquote, argv[2], sizeof(lquote)); |
if(ac > 3) |
if (ac > 3) { |
strlcpy(rquote, argv[3], sizeof(rquote)); |
strlcpy(rquote, argv[3], sizeof(rquote)); |
else |
} else { |
rquote[0] = EOS; |
rquote[0] = ECOMMT; rquote[1] = EOS; |
|
} |
} |
} |
} |
} |
|
|
/* |
/* |
* dochq - change quote characters |
* dochc - change comment characters |
*/ |
*/ |
static void |
static void |
dochq(const char *argv[], int argc) |
dochc(const char *argv[], int argc) |
{ |
{ |
if (argc > 2) { |
/* XXX Note that there is no difference between no argument and a single |
if (*argv[2]) |
* empty argument. |
strlcpy(lquote, argv[2], sizeof(lquote)); |
*/ |
else { |
if (argc == 2) { |
lquote[0] = LQUOTE; |
|
lquote[1] = EOS; |
|
} |
|
if (argc > 3) { |
|
if (*argv[3]) |
|
strlcpy(rquote, argv[3], sizeof(rquote)); |
|
} else |
|
strlcpy(rquote, lquote, sizeof(rquote)); |
|
} else { |
|
lquote[0] = LQUOTE, lquote[1] = EOS; |
|
rquote[0] = RQUOTE, rquote[1] = EOS; |
|
} |
|
} |
|
|
|
static void |
|
gnu_dochc(const char *argv[], int ac) |
|
{ |
|
/* In gnu-m4 mode, no arguments mean no comment |
|
* arguments at all. */ |
|
if (ac == 2) { |
|
scommt[0] = EOS; |
scommt[0] = EOS; |
ecommt[0] = EOS; |
ecommt[0] = EOS; |
} else { |
} else { |
if (*argv[2]) |
strlcpy(scommt, argv[2], sizeof(scommt)); |
strlcpy(scommt, argv[2], sizeof(scommt)); |
if (argc == 3) { |
else |
ecommt[0] = ECOMMT; ecommt[1] = EOS; |
scommt[0] = SCOMMT, scommt[1] = EOS; |
} else { |
if(ac > 3 && *argv[3]) |
|
strlcpy(ecommt, argv[3], sizeof(ecommt)); |
strlcpy(ecommt, argv[3], sizeof(ecommt)); |
else |
|
ecommt[0] = ECOMMT, ecommt[1] = EOS; |
|
} |
|
} |
|
/* |
|
* dochc - change comment characters |
|
*/ |
|
static void |
|
dochc(const char *argv[], int argc) |
|
{ |
|
if (argc > 2) { |
|
if (*argv[2]) |
|
strlcpy(scommt, argv[2], sizeof(scommt)); |
|
if (argc > 3) { |
|
if (*argv[3]) |
|
strlcpy(ecommt, argv[3], sizeof(ecommt)); |
|
} |
} |
else |
|
ecommt[0] = ECOMMT, ecommt[1] = EOS; |
|
} |
} |
else { |
|
scommt[0] = SCOMMT, scommt[1] = EOS; |
|
ecommt[0] = ECOMMT, ecommt[1] = EOS; |
|
} |
|
} |
} |
|
|
/* |
/* |
|
|
#endif |
#endif |
if (fc >= ap && fc < ap + strlen(ap)) |
if (fc >= ap && fc < ap + strlen(ap)) |
for (k = fc + nc - 1; k >= fc; k--) |
for (k = fc + nc - 1; k >= fc; k--) |
putback(*k); |
pushback(*k); |
} |
} |
|
|
/* |
/* |