📄 deffilep.y
字号:
const char *module; int ordinal; const char *internal_name;{ def_file_import *i; int max_imports = ROUND_UP(def->num_imports, 16); if (def->num_imports >= max_imports) { max_imports = ROUND_UP(def->num_imports+1, 16); if (def->imports) def->imports = (def_file_import *) xrealloc (def->imports, max_imports * sizeof (def_file_import)); else def->imports = (def_file_import *) xmalloc (max_imports * sizeof (def_file_import)); } i = def->imports + def->num_imports; memset (i, 0, sizeof (def_file_import)); if (name) i->name = xstrdup (name); if (module) i->module = def_stash_module(def, module); i->ordinal = ordinal; if (internal_name) i->internal_name = xstrdup (internal_name); else i->internal_name = i->name; def->num_imports++; return i;}struct{ char *param; int token;}diropts[] ={ { "-heap", HEAPSIZE }, { "-stack", STACKSIZE }, { "-attr", SECTIONS }, { "-export", EXPORTS }, { 0, 0 }};voiddef_file_add_directive (my_def, param, len) def_file *my_def; const char *param; int len;{ def_file *save_def = def; const char *pend = param + len; const char *tend = param; int i; def = my_def; while (param < pend) { while (param < pend && isspace (*param)) param++; for (tend = param + 1; tend < pend && !(isspace (tend[-1]) && *tend == '-'); tend++); for (i = 0; diropts[i].param; i++) { int len = strlen (diropts[i].param); if (tend - param >= len && strncmp (param, diropts[i].param, len) == 0 && (param[len] == ':' || param[len] == ' ')) { lex_parse_string_end = tend; lex_parse_string = param + len + 1; lex_forced_token = diropts[i].token; saw_newline = 0; def_parse (); break; } } if (!diropts[i].param) { /* xgettext:c-format */ einfo (_("Warning: .drectve `%.*s' unrecognized\n"), tend - param, param); } lex_parse_string = 0; param = tend; } def = save_def;}/***************************************************************************** Parser Callbacks *****************************************************************************/static voiddef_name (name, base) const char *name; int base;{ if (def->name) free (def->name); def->name = xstrdup (name); def->base_address = base; def->is_dll = 0;}static voiddef_library (name, base) const char *name; int base;{ if (def->name) free (def->name); def->name = xstrdup (name); def->base_address = base; def->is_dll = 1;}static voiddef_description (text) const char *text;{ int len = def->description ? strlen (def->description) : 0; len += strlen (text) + 1; if (def->description) { def->description = (char *) xrealloc (def->description, len); strcat (def->description, text); } else { def->description = (char *) xmalloc (len); strcpy (def->description, text); }}static voiddef_stacksize (reserve, commit) int reserve; int commit;{ def->stack_reserve = reserve; def->stack_commit = commit;}static voiddef_heapsize (reserve, commit) int reserve; int commit;{ def->heap_reserve = reserve; def->heap_commit = commit;}static voiddef_section (name, attr) const char *name; int attr;{ def_file_section *s; int max_sections = ROUND_UP(def->num_section_defs, 4); if (def->num_section_defs >= max_sections) { max_sections = ROUND_UP(def->num_section_defs+1, 4); if (def->section_defs) def->section_defs = (def_file_section *) xrealloc (def->section_defs, max_sections * sizeof (def_file_import)); else def->section_defs = (def_file_section *) xmalloc (max_sections * sizeof (def_file_import)); } s = def->section_defs + def->num_section_defs; memset (s, 0, sizeof (def_file_section)); s->name = xstrdup (name); if (attr & 1) s->flag_read = 1; if (attr & 2) s->flag_write = 1; if (attr & 4) s->flag_execute = 1; if (attr & 8) s->flag_shared = 1; def->num_section_defs++;}static voiddef_section_alt (name, attr) const char *name; const char *attr;{ int aval = 0; for (; *attr; attr++) { switch (*attr) { case 'R': case 'r': aval |= 1; break; case 'W': case 'w': aval |= 2; break; case 'X': case 'x': aval |= 4; break; case 'S': case 's': aval |= 8; break; } } def_section (name, aval);}static voiddef_exports (external_name, internal_name, ordinal, flags) const char *external_name; const char *internal_name; int ordinal; int flags;{ def_file_export *dfe; if (!internal_name && external_name) internal_name = external_name;#if TRACE printf ("def_exports, ext=%s int=%s\n", external_name, internal_name);#endif dfe = def_file_add_export (def, external_name, internal_name, ordinal); if (flags & 1) dfe->flag_noname = 1; if (flags & 2) dfe->flag_constant = 1; if (flags & 4) dfe->flag_data = 1; if (flags & 8) dfe->flag_private = 1;}static voiddef_import (internal_name, module, dllext, name, ordinal) const char *internal_name; const char *module; const char *dllext; const char *name; int ordinal;{ char *buf = 0; if (dllext != NULL) { buf = (char *) xmalloc (strlen (module) + strlen (dllext) + 2); sprintf (buf, "%s.%s", module, dllext); module = buf; } def_file_add_import (def, name, module, ordinal, internal_name); if (buf) free (buf);}static voiddef_version (major, minor) int major; int minor;{ def->version_major = major; def->version_minor = minor;}static voiddef_directive (str) char *str;{ struct directive *d = (struct directive *) xmalloc (sizeof (struct directive)); d->next = directives; directives = d; d->name = xstrdup (str); d->len = strlen (str);}static intdef_error (err) const char *err;{ einfo ("%P: %s:%d: %s\n", def_filename, linenumber, err); return 0;}/***************************************************************************** Lexical Scanner *****************************************************************************/#undef TRACE#define TRACE 0/* Never freed, but always reused as needed, so no real leak */static char *buffer = 0;static int buflen = 0;static int bufptr = 0;static voidput_buf (c) char c;{ if (bufptr == buflen) { buflen += 50; /* overly reasonable, eh? */ if (buffer) buffer = (char *) xrealloc (buffer, buflen + 1); else buffer = (char *) xmalloc (buflen + 1); } buffer[bufptr++] = c; buffer[bufptr] = 0; /* not optimal, but very convenient */}static struct{ char *name; int token;}tokens[] ={ { "BASE", BASE }, { "CODE", CODE }, { "CONSTANT", CONSTANTU }, { "constant", CONSTANTL }, { "DATA", DATAU }, { "data", DATAL }, { "DESCRIPTION", DESCRIPTION }, { "DIRECTIVE", DIRECTIVE }, { "EXECUTE", EXECUTE }, { "EXPORTS", EXPORTS }, { "HEAPSIZE", HEAPSIZE }, { "IMPORTS", IMPORTS }, { "LIBRARY", LIBRARY }, { "NAME", NAME }, { "NONAME", NONAMEU }, { "noname", NONAMEL }, { "PRIVATE", PRIVATEU }, { "private", PRIVATEL }, { "READ", READ }, { "SECTIONS", SECTIONS }, { "SEGMENTS", SECTIONS }, { "SHARED", SHARED }, { "STACKSIZE", STACKSIZE }, { "VERSION", VERSIONK }, { "WRITE", WRITE }, { 0, 0 }};static intdef_getc (){ int rv; if (lex_parse_string) { if (lex_parse_string >= lex_parse_string_end) rv = EOF; else rv = *lex_parse_string++; } else { rv = fgetc (the_file); } if (rv == '\n') saw_newline = 1; return rv;}static intdef_ungetc (c) int c;{ if (lex_parse_string) { lex_parse_string--; return c; } else return ungetc (c, the_file);}static intdef_lex (){ int c, i, q; if (lex_forced_token) { i = lex_forced_token; lex_forced_token = 0;#if TRACE printf ("lex: forcing token %d\n", i);#endif return i; } c = def_getc (); /* trim leading whitespace */ while (c != EOF && (c == ' ' || c == '\t') && saw_newline) c = def_getc (); if (c == EOF) {#if TRACE printf ("lex: EOF\n");#endif return 0; } if (saw_newline && c == ';') { do { c = def_getc (); } while (c != EOF && c != '\n'); if (c == '\n') return def_lex (); return 0; } /* must be something else */ saw_newline = 0; if (isdigit (c)) { bufptr = 0; while (c != EOF && (isxdigit (c) || (c == 'x'))) { put_buf (c); c = def_getc (); } if (c != EOF) def_ungetc (c); yylval.number = strtoul (buffer, 0, 0);#if TRACE printf ("lex: `%s' returns NUMBER %d\n", buffer, yylval.number);#endif return NUMBER; } if (isalpha (c) || strchr ("$:-_?", c)) { bufptr = 0; while (c != EOF && (isalnum (c) || strchr ("$:-_?/@", c))) { put_buf (c); c = def_getc (); } if (c != EOF) def_ungetc (c); for (i = 0; tokens[i].name; i++) if (strcmp (tokens[i].name, buffer) == 0) {#if TRACE printf ("lex: `%s' is a string token\n", buffer);#endif return tokens[i].token; }#if TRACE printf ("lex: `%s' returns ID\n", buffer);#endif yylval.id = xstrdup (buffer); return ID; } if (c == '\'' || c == '"') { q = c; c = def_getc (); bufptr = 0; while (c != EOF && c != q) { put_buf (c); c = def_getc (); } yylval.id = xstrdup (buffer);#if TRACE printf ("lex: `%s' returns ID\n", buffer);#endif return ID; } if (c == '=' || c == '.' || c == '@' || c == ',') {#if TRACE printf ("lex: `%c' returns itself\n", c);#endif return c; } if (c == '\n') { linenumber++; saw_newline = 1; } /*printf ("lex: 0x%02x ignored\n", c); */ return def_lex ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -