version 1.38, 2001/09/27 22:38:28 |
version 1.39, 2001/09/29 15:43:48 |
|
|
static void doifelse __P((const char *[], int)); |
static void doifelse __P((const char *[], int)); |
static int doincl __P((const char *)); |
static int doincl __P((const char *)); |
static int dopaste __P((const char *)); |
static int dopaste __P((const char *)); |
|
static void gnu_dochq __P((const char *[], int)); |
static void dochq __P((const char *[], int)); |
static void dochq __P((const char *[], int)); |
|
static void gnu_dochc __P((const char *[], int)); |
static void dochc __P((const char *[], int)); |
static void dochc __P((const char *[], int)); |
static void dodiv __P((int)); |
static void dodiv __P((int)); |
static void doundiv __P((const char *[], int)); |
static void doundiv __P((const char *[], int)); |
|
|
|
|
/* |
/* |
* eval - eval all macros and builtins calls |
* eval - eval all macros and builtins calls |
|
* argc - number of elements in argv. |
|
* argv - element vector : |
|
* argv[0] = definition of a user |
|
* macro or nil if built-in. |
|
* argv[1] = name of the macro or |
|
* built-in. |
|
* argv[2] = parameters to user-defined |
|
* . macro or built-in. |
|
* . |
|
* |
|
* A call in the form of macro-or-builtin() will result in: |
|
* argv[0] = nullstr |
|
* argv[1] = macro-or-builtin |
|
* argv[2] = nullstr |
|
* |
|
* argc is 3 for macro-or-builtin() and 2 for macro-or-builtin |
*/ |
*/ |
void |
void |
eval(argv, argc, td) |
eval(argv, argc, td) |
|
|
|
|
/* |
/* |
* expand_builtin - evaluate built-in macros. |
* expand_builtin - evaluate built-in macros. |
* argc - number of elements in argv. |
|
* argv - element vector : |
|
* argv[0] = definition of a user |
|
* macro or nil if built-in. |
|
* argv[1] = name of the macro or |
|
* built-in. |
|
* argv[2] = parameters to user-defined |
|
* . macro or built-in. |
|
* . |
|
* |
|
* Note that the minimum value for argc is 3. A call in the form |
|
* of macro-or-builtin() will result in: |
|
* argv[0] = nullstr |
|
* argv[1] = macro-or-builtin |
|
* argv[2] = nullstr |
|
*/ |
*/ |
|
|
void |
void |
expand_builtin(argv, argc, td) |
expand_builtin(argv, argc, td) |
const char *argv[]; |
const char *argv[]; |
|
|
int td; |
int td; |
{ |
{ |
int c, n; |
int c, n; |
|
int ac; |
static int sysval = 0; |
static int sysval = 0; |
|
|
#ifdef DEBUG |
#ifdef DEBUG |
|
|
* 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.. |
*/ |
*/ |
|
ac = argc; |
|
|
if (argc == 3 && !*(argv[2])) |
if (argc == 3 && !*(argv[2])) |
argc--; |
argc--; |
|
|
|
|
break; |
break; |
#endif |
#endif |
case CHNQTYPE: |
case CHNQTYPE: |
dochq(argv, argc); |
if (mimic_gnu) |
|
gnu_dochq(argv, ac); |
|
else |
|
dochq(argv, argc); |
break; |
break; |
|
|
case CHNCTYPE: |
case CHNCTYPE: |
dochc(argv, argc); |
if (mimic_gnu) |
|
gnu_dochc(argv, ac); |
|
else |
|
dochc(argv, argc); |
break; |
break; |
|
|
case SUBSTYPE: |
case SUBSTYPE: |
|
|
} |
} |
#endif |
#endif |
|
|
|
static void |
|
gnu_dochq(argv, ac) |
|
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) { |
|
lquote[0] = LQUOTE, lquote[1] = EOS; |
|
rquote[0] = RQUOTE, rquote[1] = EOS; |
|
} else { |
|
strlcpy(lquote, argv[2], sizeof(lquote)); |
|
if(ac > 3) |
|
strlcpy(rquote, argv[3], sizeof(rquote)); |
|
else |
|
rquote[0] = EOS; |
|
} |
|
} |
|
|
/* |
/* |
* dochq - change quote characters |
* dochq - change quote characters |
*/ |
*/ |
|
|
const char *argv[]; |
const char *argv[]; |
int argc; |
int argc; |
{ |
{ |
/* In gnu-m4 mode, having two empty arguments means no quotes at |
|
* all. */ |
|
if (mimic_gnu) { |
|
if (argc > 3 && !*argv[2] && !*argv[3]) { |
|
lquote[0] = EOS; |
|
rquote[0] = EOS; |
|
return; |
|
} |
|
} |
|
if (argc > 2) { |
if (argc > 2) { |
if (*argv[2]) |
if (*argv[2]) |
strlcpy(lquote, argv[2], sizeof(lquote)); |
strlcpy(lquote, argv[2], sizeof(lquote)); |
|
|
} |
} |
} |
} |
|
|
|
static void |
|
gnu_dochc(argv, ac) |
|
const char *argv[]; |
|
int ac; |
|
{ |
|
/* In gnu-m4 mode, no arguments mean no comment |
|
* arguments at all. */ |
|
if (ac == 2) { |
|
scommt[0] = EOS; |
|
ecommt[0] = EOS; |
|
} else { |
|
if (*argv[2]) |
|
strlcpy(scommt, argv[2], sizeof(scommt)); |
|
else |
|
scommt[0] = SCOMMT, scommt[1] = EOS; |
|
if(ac > 3 && *argv[3]) |
|
strlcpy(ecommt, argv[3], sizeof(ecommt)); |
|
else |
|
ecommt[0] = ECOMMT, ecommt[1] = EOS; |
|
} |
|
} |
/* |
/* |
* dochc - change comment characters |
* dochc - change comment characters |
*/ |
*/ |