version 1.48, 2003/06/18 21:08:07 |
version 1.49, 2003/06/30 21:42:50 |
|
|
#include "extern.h" |
#include "extern.h" |
#include "pathnames.h" |
#include "pathnames.h" |
|
|
#define BUILTIN_MARKER "__builtin_" |
|
|
|
static void setup_definition(ndptr, const char *); |
|
static void dodefn(const char *); |
static void dodefn(const char *); |
static void dopushdef(const char *, const char *); |
static void dopushdef(const char *, const char *); |
static void dodump(const char *[], int); |
static void dodump(const char *[], int); |
|
|
static const char *handledash(char *, char *, const char *); |
static const char *handledash(char *, char *, const char *); |
static void expand_builtin(const char *[], int, int); |
static void expand_builtin(const char *[], int, int); |
static void expand_macro(const char *[], int); |
static void expand_macro(const char *[], int); |
static void dump_one_def(ndptr); |
static void dump_one_def(const char *, struct macro_definition *); |
|
|
unsigned long expansion_id; |
unsigned long expansion_id; |
|
|
|
|
* argc - number of elements in argv. |
* argc - number of elements in argv. |
* argv - element vector : |
* argv - element vector : |
* argv[0] = definition of a user |
* argv[0] = definition of a user |
* macro or nil if built-in. |
* macro or NULL if built-in. |
* argv[1] = name of the macro or |
* argv[1] = name of the macro or |
* built-in. |
* built-in. |
* argv[2] = parameters to user-defined |
* argv[2] = parameters to user-defined |
|
|
* another definition |
* another definition |
*/ |
*/ |
if (argc > 3) { |
if (argc > 3) { |
if (lookup(argv[2]) != nil) |
if (lookup_macro_definition(argv[2]) != NULL) |
pbstr(argv[3]); |
pbstr(argv[3]); |
else if (argc > 4) |
else if (argc > 4) |
pbstr(argv[4]); |
pbstr(argv[4]); |
|
|
*/ |
*/ |
if (argc > 2) |
if (argc > 2) |
for (n = 2; n < argc; n++) |
for (n = 2; n < argc; n++) |
remhash(argv[n], ALL); |
macro_undefine(argv[n]); |
break; |
break; |
|
|
case POPDTYPE: |
case POPDTYPE: |
|
|
*/ |
*/ |
if (argc > 2) |
if (argc > 2) |
for (n = 2; n < argc; n++) |
for (n = 2; n < argc; n++) |
remhash(argv[n], TOP); |
macro_popdef(argv[n]); |
break; |
break; |
|
|
case MKTMTYPE: |
case MKTMTYPE: |
|
|
|
|
|
|
/* |
/* |
* common part to dodefine and dopushdef |
|
*/ |
|
static void |
|
setup_definition(ndptr p, const char *defn) |
|
{ |
|
int n; |
|
|
|
if (strncmp(defn, BUILTIN_MARKER, sizeof(BUILTIN_MARKER)-1) == 0) { |
|
n = builtin_type(defn+sizeof(BUILTIN_MARKER)-1); |
|
if (n != -1) { |
|
p->type = n & TYPEMASK; |
|
if ((n & NOARGS) == 0) |
|
p->type |= NEEDARGS; |
|
p->defn = xstrdup(defn+sizeof(BUILTIN_MARKER)-1); |
|
return; |
|
} |
|
} |
|
if (!*defn) |
|
p->defn = null; |
|
else |
|
p->defn = xstrdup(defn); |
|
p->type = MACRTYPE; |
|
} |
|
|
|
/* |
|
* dodefine - install definition in the table |
* dodefine - install definition in the table |
*/ |
*/ |
void |
void |
dodefine(const char *name, const char *defn) |
dodefine(const char *name, const char *defn) |
{ |
{ |
ndptr p; |
|
|
|
if (!*name) |
if (!*name) |
errx(1, "%s at line %lu: null definition.", CURRENT_NAME, |
errx(1, "%s at line %lu: null definition.", CURRENT_NAME, |
CURRENT_LINE); |
CURRENT_LINE); |
if ((p = lookup(name)) == nil) |
macro_define(name, defn); |
p = addent(name); |
|
else if (p->defn != null) |
|
free((char *) p->defn); |
|
setup_definition(p, defn); |
|
if (STREQ(name, defn)) |
|
p->type |= RECDEF; |
|
} |
} |
|
|
/* |
/* |
|
|
static void |
static void |
dodefn(const char *name) |
dodefn(const char *name) |
{ |
{ |
ndptr p; |
struct macro_definition *p; |
char *real; |
char *real; |
|
|
if ((p = lookup(name)) != nil) { |
if ((p = lookup_macro_definition(name)) != NULL) { |
if ((p->type & TYPEMASK) == MACRTYPE) { |
if ((p->type & TYPEMASK) == MACRTYPE) { |
pbstr(rquote); |
pbstr(rquote); |
pbstr(p->defn); |
pbstr(p->defn); |
|
|
static void |
static void |
dopushdef(const char *name, const char *defn) |
dopushdef(const char *name, const char *defn) |
{ |
{ |
ndptr p; |
|
|
|
if (!*name) |
if (!*name) |
errx(1, "%s at line %lu: null definition", CURRENT_NAME, |
errx(1, "%s at line %lu: null definition", CURRENT_NAME, |
CURRENT_LINE); |
CURRENT_LINE); |
p = addent(name); |
macro_pushdef(name, defn); |
setup_definition(p, defn); |
|
if (STREQ(name, defn)) |
|
p->type |= RECDEF; |
|
} |
} |
|
|
/* |
/* |
* dump_one_def - dump the specified definition. |
* dump_one_def - dump the specified definition. |
*/ |
*/ |
static void |
static void |
dump_one_def(ndptr p) |
dump_one_def(const char *name, struct macro_definition *p) |
{ |
{ |
if (mimic_gnu) { |
if (mimic_gnu) { |
if ((p->type & TYPEMASK) == MACRTYPE) |
if ((p->type & TYPEMASK) == MACRTYPE) |
fprintf(traceout, "%s:\t%s\n", p->name, p->defn); |
fprintf(traceout, "%s:\t%s\n", name, p->defn); |
else { |
else { |
fprintf(traceout, "%s:\t<%s>\n", p->name, p->defn); |
fprintf(traceout, "%s:\t<%s>\n", name, p->defn); |
} |
} |
} else |
} else |
fprintf(traceout, "`%s'\t`%s'\n", p->name, p->defn); |
fprintf(traceout, "`%s'\t`%s'\n", name, p->defn); |
} |
} |
|
|
/* |
/* |
|
|
dodump(const char *argv[], int argc) |
dodump(const char *argv[], int argc) |
{ |
{ |
int n; |
int n; |
ndptr p; |
struct macro_definition *p; |
|
|
if (argc > 2) { |
if (argc > 2) { |
for (n = 2; n < argc; n++) |
for (n = 2; n < argc; n++) |
if ((p = lookup(argv[n])) != nil) |
if ((p = lookup_macro_definition(argv[n])) != NULL) |
dump_one_def(p); |
dump_one_def(argv[n], p); |
} else { |
} else |
for (n = 0; n < HASHSIZE; n++) |
macro_for_all(dump_one_def); |
for (p = hashtab[n]; p != nil; p = p->nxtptr) |
|
dump_one_def(p); |
|
} |
|
} |
} |
|
|
/* |
/* |