⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deffilep.y

📁 基于4个mips核的noc设计
💻 Y
📖 第 1 页 / 共 2 页
字号:
     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 + -