const char * define_macro (int idx, sb *in, sb *label, int (*get_line) (sb *), const char **namep) { macro_entry *macro; sb name; const char *namestr; macro = (macro_entry *) xmalloc (sizeof (macro_entry)); sb_new (¯o->sub); sb_new (&name); macro->formal_count = 0; macro->formals = 0; idx = sb_skip_white (idx, in); if (! buffer_and_nest ("MACRO", "ENDM", ¯o->sub, get_line)) return _("unexpected end of file in macro definition"); if (label != NULL && label->len != 0) { sb_add_sb (&name, label); if (idx < in->len && in->ptr[idx] == '(') { /* It's the label: MACRO (formals,...) sort */ idx = do_formals (macro, idx + 1, in); if (in->ptr[idx] != ')') return _("missing ) after formals"); } else { /* It's the label: MACRO formals,... sort */ idx = do_formals (macro, idx, in); } } else { idx = get_token (idx, in, &name); idx = sb_skip_comma (idx, in); idx = do_formals (macro, idx, in); } /* And stick it in the macro hash table. */ for (idx = 0; idx < name.len; idx++) name.ptr[idx] = TOLOWER (name.ptr[idx]); namestr = sb_terminate (&name); hash_jam (macro_hash, namestr, (PTR) macro); macro_defined = 1; if (namep != NULL) *namep = namestr; return NULL; }
const char * define_macro (int idx, sb *in, sb *label, int (*get_line) (sb *), char *file, unsigned int line, const char **namep) { macro_entry *macro; sb name; const char *error = NULL; macro = (macro_entry *) xmalloc (sizeof (macro_entry)); sb_new (¯o->sub); sb_new (&name); macro->file = file; macro->line = line; macro->formal_count = 0; macro->formals = 0; macro->formal_hash = hash_new (); idx = sb_skip_white (idx, in); if (! buffer_and_nest ("MACRO", "ENDM", ¯o->sub, get_line)) error = _("unexpected end of file in macro `%s' definition"); if (label != NULL && label->len != 0) { sb_add_sb (&name, label); macro->name = sb_terminate (&name); if (idx < in->len && in->ptr[idx] == '(') { /* It's the label: MACRO (formals,...) sort */ idx = do_formals (macro, idx + 1, in); if (idx < in->len && in->ptr[idx] == ')') idx = sb_skip_white (idx + 1, in); else if (!error) error = _("missing `)' after formals in macro definition `%s'"); } else { /* It's the label: MACRO formals,... sort */ idx = do_formals (macro, idx, in); } } else { int cidx; idx = get_token (idx, in, &name); macro->name = sb_terminate (&name); if (name.len == 0) error = _("Missing macro name"); cidx = sb_skip_white (idx, in); idx = sb_skip_comma (cidx, in); if (idx == cidx || idx < in->len) idx = do_formals (macro, idx, in); else idx = cidx; } if (!error && idx < in->len) error = _("Bad parameter list for macro `%s'"); /* And stick it in the macro hash table. */ for (idx = 0; idx < name.len; idx++) name.ptr[idx] = TOLOWER (name.ptr[idx]); if (hash_find (macro_hash, macro->name)) error = _("Macro `%s' was already defined"); if (!error) error = hash_jam (macro_hash, macro->name, (PTR) macro); if (namep != NULL) *namep = macro->name; if (!error) macro_defined = 1; else free_macro (macro); return error; }