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

📄 main.c

📁 Linux下VB解释器
💻 C
📖 第 1 页 / 共 4 页
字号:
	  else if (program_state == RUNNING && current->line > 0)	    {	      f = current->lib->l;	      l = current->line;	    }	  if (f)	    {	      if (first || lastline != l)		{		  fprintf (stderr, " in %s, line %d", f, l);		}	      lastline = l;	      first = FALSE;	    }	}      fprintf (stderr, ": %s\n", message);      if (program_state == RUNNING && severity <= ERROR	  && severity != DUMP)	dump_sub (1);    }  if (severity < errorlevel)    errorlevel = severity;  if (severity <= ERROR)    {      program_state = FINISHED;      endreason = erERROR;      exitcode = 1;    }  if (severity <= FATAL)    {      program_state = FINISHED;      fprintf (stderr,	       "---Immediate exit to system, due to a fatal error.\n");      end_it ();    }#ifdef UNIX  if (curinized && severity <= infolevel)    reset_prog_mode ();#endif}char *my_strndup (char *arg, int len)	/*  own version of strndup */{  char *copy;  copy = my_malloc (len + 1);  strncpy (copy, arg, len);  copy[len] = '\0';  return copy;}char *my_strdup (char *arg)		/* my own version of strdup, checks for failure */{  int l;  if (!arg)    return my_strndup ("", 0);  l = strlen (arg);  return my_strndup (arg, l);}void *my_malloc (unsigned num)	/* Alloc memory and issue warning on failure */{  void *room;  room = malloc (num + sizeof (int));  if (room == NULL)    {      sprintf (string, "Can't malloc %d bytes of memory", num);      error (FATAL, string);    }  return room;}voidmy_free (void *mem)		/* free memory */{  free (mem);}struct libfile_name *new_file (char *l, char *s)	/* create a new structure for library names */{  struct libfile_name *new;  struct libfile_name *curr;  static struct libfile_name *last = NULL;  int start, end;  /* check, if library has already been included */  for (curr = libfile_stack[0]; curr; curr = curr->next)    {      if (!strcmp (curr->l, l))	{	  if (is_bound)	    return curr;	  else	    return NULL;	}    }  new = my_malloc (sizeof (struct libfile_name));  new->next = NULL;  new->lineno = 1;  if (last)    last->next = new;  last = new;  new->l = my_strdup (l);  new->llen = strlen (new->l);  if (s)    {      new->s = my_strdup (s);    }  else    {      /* no short name supplied get piece from l */      end = strlen (l);      for (start = end; start > 0; start--)	{	  if (l[start - 1] == '\\' || l[start - 1] == '/')	    break;	  if (l[start] == '.')	    end = start;	}      end--;      new->s = my_malloc (end - start + 2);      strncpy (new->s, new->l + start, end - start + 1);      new->s[end - start + 1] = '\0';    }  new->slen = strlen (new->s);  new->datapointer = new->firstdata = NULL;  return new;}char *dotify (char *name, int addfun)	/* add library name, if not already present */{  static char buff[200];  if (!strchr (name, '.'))    {      strcpy (buff, currlib->s);      strcat (buff, ".");      strcat (buff, name);    }  else    {      strcpy (buff, name);    }  if (addfun && !strchr (name, '@'))    {      strcat (buff, "@");      strcat (buff, current_function);    }  return buff;}char *strip (char *name)		/* strip down to minimal name */{  static char buff[300];  char *at, *dot;  if (infolevel >= DEBUG)    return name;  dot = strchr (name, '.');  if (dot)    strcpy (buff, dot + 1);  else    strcpy (buff, name);  at = strchr (buff, '@');  if (at)    *at = '\0';  return buff;}voiddo_error (struct command *cmd)	/* issue user defined error */{  struct stackentry *s;  struct command *r;  s = stackhead;  while (s != stackroot)    {      if (s->type == stRETADDCALL)	{	  r = s->pointer;	  cmd->line = r->line;	  cmd->lib = r->lib;	  break;	}      s = s->prev;    }  error (ERROR, pop (stSTRING)->pointer);}voidcompile ()			/* create s subroutine at runtime */{  open_string (pop (stSTRING)->pointer);  yyparse ();  add_command (cEND, NULL);}voidcreate_execute (int string)	/* create command 'cEXECUTESUB' */{  struct command *cmd;  cmd = add_command (string ? cEXECUTE2 : cEXECUTE, NULL);  cmd->pointer = my_strdup (dotify ("", FALSE));}voidexecute (struct command *cmd)	/* execute a subroutine */{  struct stackentry *st, *ret;  char *fullname, *shortname;  struct command *newcurr;  st = stackhead;  do    {      st = st->prev;    }  while (st->type != stFREE);  st = st->next;  if (st->type != stSTRING)    {      error (ERROR, "need a string as a function name");      return;    }  shortname = st->pointer;  if ((shortname[strlen (shortname) - 1] == '$') !=      (cmd->type == cEXECUTE2))    {      if (cmd->type == cEXECUTE2)	sprintf (string,		 "expecting the name of a string function (not '%s')",		 shortname);      else	sprintf (string,		 "expecting the name of a numeric function (not '%s')",		 shortname);      error (ERROR, string);      return;    }  fullname = my_malloc (strlen (cmd->pointer) + strlen (shortname) + 2);  strcpy (fullname, cmd->pointer);  strcat (fullname, shortname);  free (st->pointer);  st->type = stFREE;  newcurr = search_label (fullname, smSUB);  if (!newcurr)    {      sprintf (string, "subroutine '%s' not defined", fullname);      error (ERROR, string);      return;    }  ret = push ();  ret->pointer = current;  ret->type = stRETADDCALL;  reshufflestack (ret);  current = newcurr;  free (fullname);}voidcreate_docu (char *doc)		/* create command 'docu' */{  struct command *cmd;  static struct command *previous = NULL;  if (inlib)    return;  cmd = add_command (cDOCU, NULL);  cmd->pointer = doc;  if (previous)    previous->nextassoc = cmd;  else    docuhead = cmd;  previous = cmd;  docucount++;}voidcreate_docu_array (void)	/* create array with documentation */{  struct array *ar;  struct command *doc;  int i;  /* create and prepare docu-array */  ar = create_array ('s', 1);  ar->bounds[0] = docucount + 1;  ar->pointer = my_malloc ((docucount + 1) * sizeof (char *));  ((char **) ar->pointer)[0] = my_strdup ("");  doc = docuhead;  i = 1;  while (doc)    {      ((char **) ar->pointer)[i] = doc->pointer;      doc = doc->nextassoc;      i++;    }  get_sym ("main.docu$", syARRAY, amADD_GLOBAL)->pointer = ar;}intisbound (void)			/* check if this interpreter is bound to a program */{  FILE *interpreter;  int i;  int c;  int proglen = 0;  int bound = 1;  if (!interpreter_path || !interpreter_path[0])    {      error (FATAL, "interpreter_path is not set !");      return 0;    }  if (!(interpreter = fopen (interpreter_path, "r")))    {      sprintf (string, "Couldn't open '%s' to check, if it is bound: %s",	       interpreter_path, my_strerror (errno));      error (WARNING, string);      return 0;    }  if (fseek (interpreter, 0 - strlen (YABMAGIC) - 1, SEEK_END))    {      sprintf (string, "Couldn't seek within '%s': %s", interpreter_path,	       my_strerror (errno));      error (WARNING, string);      return 0;    }  for (i = 0; i < (int) strlen (YABMAGIC); i++)    {      c = fgetc (interpreter);      if (c == EOF || c != (YABMAGIC)[i])	bound = 0;    }  if (!bound)    {      fclose (interpreter);      return bound;    }  if (fseek (interpreter, 0 - strlen (YABMAGIC) - 5 - 8 - 1, SEEK_END))    {      sprintf (string, "Couldn't seek within '%s': %s", interpreter_path,	       my_strerror (errno));      error (WARNING, string);      return 0;    }  if (!fscanf (interpreter, "%d", &proglen))    {      error (WARNING, "Could not read length of embedded program");      return 0;    }  if (fseek      (interpreter, 0 - strlen (YABMAGIC) - 5 - 8 - 5 - 5 - proglen,       SEEK_END))    {      sprintf (string, "Couldn't seek within '%s': %s", interpreter_path,	       my_strerror (errno));      error (WARNING, string);      return 0;    }  if (infolevel >= NOTE)    {      error (NOTE, "Dumping the embedded program, that will be executed:");      fprintf (stderr, "     ");      for (i = 0; i < proglen; i++)	{	  c = fgetc (interpreter);	  fprintf (stderr, "%c", c);	  if (c == '\n' && i < proglen - 1)	    fprintf (stderr, "     ");	}      error (NOTE, "End of program, that will be executed");      if (fseek	  (interpreter, 0 - strlen (YABMAGIC) - 5 - 8 - 5 - 5 - proglen,	   SEEK_END))	{	  sprintf (string, "Couldn't seek within '%s': %s",		   interpreter_path, my_strerror (errno));	  error (WARNING, string);	  return 0;	}    }  bound_program = interpreter;  return 1;}static intmybind (char *bound)		/* bind a program to the interpreter and save it */{  FILE *fyab;  FILE *fprog;  FILE *fbound;  FILE *flib;  int c;  char *pc;  int i;  int proglen = 0;  if (interactive)    {      error (ERROR, "cannot bind a program when called interactive");      return 0;    }  if (!strcmp (interpreter_path, bound))    {      sprintf (string, "will not overwrite '%s' with '%s'", bound,	       interpreter_path);      error (ERROR, string);      return 0;    }  if (!strcmp (main_file_name, bound))    {      sprintf (string, "will not overwrite '%s' with '%s'", bound,	       main_file_name);      error (ERROR, string);      return 0;    }  if (!(fyab = fopen (interpreter_path, "rb")))    {      sprintf (string, "could not open '%s' for reading: %s",	       interpreter_path, my_strerror (errno));      error (ERROR, string);      return 0;    }  if (!(fprog = fopen (main_file_name, "rb")))    {      sprintf (string, "could not open '%s' for reading: %s",	       main_file_name, my_strerror (errno));      error (ERROR, string);      fclose (fyab);      return 0;    }  if (!(fbound = fopen (bound, "wb")))    {      sprintf (string, "could not open '%s' for writing: %s", bound,	       my_strerror (errno));      error (ERROR, string);      fclose (fyab);      fclose (fprog);      return 0;    }  if (infolevel >= DEBUG)    {      sprintf (string, "binding %s and %s into %s", interpreter_path,	       main_file_name, bound);      error (NOTE, string);    }  while ((c = fgetc (fyab)) != EOF)    {      fputc (c, fbound);    }  for (i = 1; i < libfile_chain_length; i++)    {      if (!(flib = fopen (libfile_chain[i]->l, "rb")))	{	  sprintf (string, "could not open '%s' for reading: %s",		   libfile_chain[i]->l, my_strerror (errno));	  error (ERROR, string);	  fclose (flib);	  return 0;	}      sprintf (string, "\nimport %s\n", libfile_chain[i]->s);      for (pc = string; *pc; pc++)	{	  fputc (*pc, fbound);	  proglen++;	}      while ((c = fgetc (flib)) != EOF)	{	  fputc (c, fbound);	  proglen++;	}    }  for (pc = "\nimport main\n"; *pc; pc++)    {      fputc (*pc, fbound);      proglen++;    }  for (pc = "\nimport __END_OF_IMPORT\n"; *pc; pc++)    {      fputc (*pc, fbound);      proglen++;    }  while ((c = fgetc (fprog)) != EOF)    {      fputc (c, fbound);      proglen++;    }  fprintf (fbound, "\nend\n");  fprintf (fbound, "rem %08d\n", proglen);  fprintf (fbound, "rem %s\n", YABMAGIC);  fclose (fyab);  fclose (fprog);  fclose (fbound);  return 1;}char *find_interpreter (char *name)	/* find interpreter with full path */{  FILE *f;  char *path = NULL;#ifdef WINDOWS  path = my_malloc (1000);  GetModuleFileName (NULL, path, 1000);  if (f = fopen (path, "r"))    {      fclose (f);      return path;    }  else    {      my_free (path);      return my_strdup (name);    }#else  if (f = fopen (name, "r"))    {      fclose (f);      path = my_strdup (name);      return path;    }  else    {      char *from, *to, *try;      from = to = path = getenv ("PATH");      try = my_malloc (strlen (path) + strlen (name) + 2);      to = strchr (to + 1, ':');      while (to)	{	  strncpy (try, from, to - from);	  try[to - from] = 0;	  if (try[to - from - 1] != '/')	    strcat (try, "/");	  strcat (try, name);	  if (f = fopen (try, "r"))	    {	      fclose (f);	      return try;	    }	  from = to + 1;	  to = strchr (to + 1, ':');	}      return name;    }#endif}char *my_strerror (int err){				/* return description of error */#ifdef WINDOWS  return strerror (err);#else#ifdef HAVE_STRERROR  return strerror (err);#else  char buff[100];  sprintf (buff, "errno=%d", err);  return buff;#endif#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -