diff options
Diffstat (limited to 'contrib/binutils/gas/macro.c')
-rw-r--r-- | contrib/binutils/gas/macro.c | 176 |
1 files changed, 50 insertions, 126 deletions
diff --git a/contrib/binutils/gas/macro.c b/contrib/binutils/gas/macro.c index 0842431..0991744 100644 --- a/contrib/binutils/gas/macro.c +++ b/contrib/binutils/gas/macro.c @@ -1,5 +1,5 @@ -/* macro.c - macro support for gas and gasp - Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +/* macro.c - macro support for gas + Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Written by Steve and Judy Chamberlain of Cygnus Support, @@ -63,20 +63,19 @@ extern void *alloca (); #include "asintl.h" /* The routines in this file handle macro definition and expansion. - They are called by both gasp and gas. */ + They are called by gas. */ /* Internal functions. */ -static int get_token PARAMS ((int, sb *, sb *)); -static int getstring PARAMS ((int, sb *, sb *)); -static int get_any_string PARAMS ((int, sb *, sb *, int, int)); -static int do_formals PARAMS ((macro_entry *, int, sb *)); -static int get_apost_token PARAMS ((int, sb *, sb *, int)); -static int sub_actual - PARAMS ((int, sb *, sb *, struct hash_control *, int, sb *, int)); +static int get_token (int, sb *, sb *); +static int getstring (int, sb *, sb *); +static int get_any_string (int, sb *, sb *, int, int); +static int do_formals (macro_entry *, int, sb *); +static int get_apost_token (int, sb *, sb *, int); +static int sub_actual (int, sb *, sb *, struct hash_control *, int, sb *, int); static const char *macro_expand_body - PARAMS ((sb *, sb *, formal_entry *, struct hash_control *, int, int)); -static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int)); + (sb *, sb *, formal_entry *, struct hash_control *, int); +static const char *macro_expand (int, sb *, macro_entry *, sb *); #define ISWHITE(x) ((x) == ' ' || (x) == '\t') @@ -93,13 +92,13 @@ static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int)); /* The macro hash table. */ -static struct hash_control *macro_hash; +struct hash_control *macro_hash; /* Whether any macros have been defined. */ int macro_defined; -/* Whether we are in GASP alternate mode. */ +/* Whether we are in alternate syntax mode. */ static int macro_alternate; @@ -113,7 +112,7 @@ static int macro_strip_at; /* Function to use to parse an expression. */ -static int (*macro_expr) PARAMS ((const char *, int, sb *, int *)); +static int (*macro_expr) (const char *, int, sb *, int *); /* Number of macro expansions that have been done. */ @@ -122,11 +121,8 @@ static int macro_number; /* Initialize macro processing. */ void -macro_init (alternate, mri, strip_at, expr) - int alternate; - int mri; - int strip_at; - int (*expr) PARAMS ((const char *, int, sb *, int *)); +macro_init (int alternate, int mri, int strip_at, + int (*expr) (const char *, int, sb *, int *)) { macro_hash = hash_new (); macro_defined = 0; @@ -139,8 +135,7 @@ macro_init (alternate, mri, strip_at, expr) /* Switch in and out of MRI mode on the fly. */ void -macro_mri_mode (mri) - int mri; +macro_mri_mode (int mri) { macro_mri = mri; } @@ -152,11 +147,8 @@ macro_mri_mode (mri) Return 1 on success, 0 on unexpected EOF. */ int -buffer_and_nest (from, to, ptr, get_line) - const char *from; - const char *to; - sb *ptr; - int (*get_line) PARAMS ((sb *)); +buffer_and_nest (const char *from, const char *to, sb *ptr, + int (*get_line) (sb *)) { int from_len = strlen (from); int to_len = strlen (to); @@ -222,8 +214,8 @@ buffer_and_nest (from, to, ptr, get_line) } } - /* Add a CR to the end and keep running. */ - sb_add_char (ptr, '\n'); + /* Add the original end-of-line char to the end and keep running. */ + sb_add_char (ptr, more); line_start = ptr->len; more = get_line (ptr); } @@ -235,10 +227,7 @@ buffer_and_nest (from, to, ptr, get_line) /* Pick up a token. */ static int -get_token (idx, in, name) - int idx; - sb *in; - sb *name; +get_token (int idx, sb *in, sb *name) { if (idx < in->len && (ISALPHA (in->ptr[idx]) @@ -263,10 +252,7 @@ get_token (idx, in, name) /* Pick up a string. */ static int -getstring (idx, in, acc) - int idx; - sb *in; - sb *acc; +getstring (int idx, sb *in, sb *acc) { idx = sb_skip_white (idx, in); @@ -354,19 +340,14 @@ getstring (idx, in, acc) */ static int -get_any_string (idx, in, out, expand, pretend_quoted) - int idx; - sb *in; - sb *out; - int expand; - int pretend_quoted; +get_any_string (int idx, sb *in, sb *out, int expand, int pretend_quoted) { sb_reset (out); idx = sb_skip_white (idx, in); if (idx < in->len) { - if (in->len > 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx])) + if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx])) { while (!ISSEP (in->ptr[idx])) sb_add_char (out, in->ptr[idx++]); @@ -439,10 +420,7 @@ get_any_string (idx, in, out, expand, pretend_quoted) /* Pick up the formal parameters of a macro definition. */ static int -do_formals (macro, idx, in) - macro_entry *macro; - int idx; - sb *in; +do_formals (macro_entry *macro, int idx, sb *in) { formal_entry **p = ¯o->formals; @@ -522,12 +500,8 @@ do_formals (macro, idx, in) the macro which was defined. */ const char * -define_macro (idx, in, label, get_line, namep) - int idx; - sb *in; - sb *label; - int (*get_line) PARAMS ((sb *)); - const char **namep; +define_macro (int idx, sb *in, sb *label, + int (*get_line) (sb *), const char **namep) { macro_entry *macro; sb name; @@ -583,11 +557,7 @@ define_macro (idx, in, label, get_line, namep) /* Scan a token, and then skip KIND. */ static int -get_apost_token (idx, in, name, kind) - int idx; - sb *in; - sb *name; - int kind; +get_apost_token (int idx, sb *in, sb *name, int kind) { idx = get_token (idx, in, name); if (idx < in->len @@ -601,14 +571,8 @@ get_apost_token (idx, in, name, kind) /* Substitute the actual value for a formal parameter. */ static int -sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere) - int start; - sb *in; - sb *t; - struct hash_control *formal_hash; - int kind; - sb *out; - int copyifnotthere; +sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash, + int kind, sb *out, int copyifnotthere) { int src; formal_entry *ptr; @@ -637,6 +601,7 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere) { /* Doing this permits people to use & in macro bodies. */ sb_add_char (out, '&'); + sb_add_sb (out, t); } else if (copyifnotthere) { @@ -653,13 +618,8 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere) /* Expand the body of a macro. */ static const char * -macro_expand_body (in, out, formals, formal_hash, comment_char, locals) - sb *in; - sb *out; - formal_entry *formals; - struct hash_control *formal_hash; - int comment_char; - int locals; +macro_expand_body (sb *in, sb *out, formal_entry *formals, + struct hash_control *formal_hash, int locals) { sb t; int src = 0; @@ -689,14 +649,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) else if (in->ptr[src] == '\\') { src++; - if (in->ptr[src] == comment_char && comment_char != '\0') - { - /* This is a comment, just drop the rest of the line. */ - while (src < in->len - && in->ptr[src] != '\n') - src++; - } - else if (in->ptr[src] == '(') + if (in->ptr[src] == '(') { /* Sub in till the next ')' literally. */ src++; @@ -779,7 +732,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) formal_entry *f; src = sb_skip_white (src + 5, in); - while (in->ptr[src] != '\n' && in->ptr[src] != comment_char) + while (in->ptr[src] != '\n') { static int loccnt; char buf[20]; @@ -806,17 +759,6 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) } } } - else if (comment_char != '\0' - && in->ptr[src] == comment_char - && src + 1 < in->len - && in->ptr[src + 1] == comment_char - && !inquote) - { - /* Two comment chars in a row cause the rest of the line to - be dropped. */ - while (src < in->len && in->ptr[src] != '\n') - src++; - } else if (in->ptr[src] == '"' || (macro_mri && in->ptr[src] == '\'')) { @@ -899,12 +841,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) body. */ static const char * -macro_expand (idx, in, m, out, comment_char) - int idx; - sb *in; - macro_entry *m; - sb *out; - int comment_char; +macro_expand (int idx, sb *in, macro_entry *m, sb *out) { sb t; formal_entry *ptr; @@ -954,7 +891,7 @@ macro_expand (idx, in, m, out, comment_char) /* Peel off the actuals and store them away in the hash tables' actuals. */ idx = sb_skip_white (idx, in); - while (idx < in->len && in->ptr[idx] != comment_char) + while (idx < in->len) { int scan; @@ -1056,8 +993,7 @@ macro_expand (idx, in, m, out, comment_char) sb_add_string (&ptr->actual, buffer); } - err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, - comment_char, 1); + err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, 1); if (err != NULL) return err; @@ -1090,16 +1026,11 @@ macro_expand (idx, in, m, out, comment_char) } /* Check for a macro. If one is found, put the expansion into - *EXPAND. COMMENT_CHAR is the comment character--this is used by - gasp. Return 1 if a macro is found, 0 otherwise. */ + *EXPAND. Return 1 if a macro is found, 0 otherwise. */ int -check_macro (line, expand, comment_char, error, info) - const char *line; - sb *expand; - int comment_char; - const char **error; - macro_entry **info; +check_macro (const char *line, sb *expand, + const char **error, macro_entry **info) { const char *s; char *copy, *cs; @@ -1135,7 +1066,7 @@ check_macro (line, expand, comment_char, error, info) sb_add_char (&line_sb, *s++); sb_new (expand); - *error = macro_expand (0, &line_sb, macro, expand, comment_char); + *error = macro_expand (0, &line_sb, macro, expand); sb_kill (&line_sb); @@ -1149,8 +1080,7 @@ check_macro (line, expand, comment_char, error, info) /* Delete a macro. */ void -delete_macro (name) - const char *name; +delete_macro (const char *name) { hash_delete (macro_hash, name); } @@ -1160,13 +1090,7 @@ delete_macro (name) success, or an error message otherwise. */ const char * -expand_irp (irpc, idx, in, out, get_line, comment_char) - int irpc; - int idx; - sb *in; - sb *out; - int (*get_line) PARAMS ((sb *)); - int comment_char; +expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *)) { const char *mn; sb sub; @@ -1204,10 +1128,10 @@ expand_irp (irpc, idx, in, out, get_line, comment_char) sb_reset (out); idx = sb_skip_comma (idx, in); - if (idx >= in->len || in->ptr[idx] == comment_char) + if (idx >= in->len) { /* Expand once with a null string. */ - err = macro_expand_body (&sub, out, &f, h, comment_char, 0); + err = macro_expand_body (&sub, out, &f, h, 0); if (err != NULL) return err; } @@ -1215,7 +1139,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char) { if (irpc && in->ptr[idx] == '"') ++idx; - while (idx < in->len && in->ptr[idx] != comment_char) + while (idx < in->len) { if (!irpc) idx = get_any_string (idx, in, &f.actual, 1, 0); @@ -1226,7 +1150,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char) int nxt; nxt = sb_skip_white (idx + 1, in); - if (nxt >= in->len || in->ptr[nxt] == comment_char) + if (nxt >= in->len) { idx = nxt; break; @@ -1236,7 +1160,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char) sb_add_char (&f.actual, in->ptr[idx]); ++idx; } - err = macro_expand_body (&sub, out, &f, h, comment_char, 0); + err = macro_expand_body (&sub, out, &f, h, 0); if (err != NULL) return err; if (!irpc) |