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

📄 function.c

📁 Linux下VB解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
	pointer = strstr (str, str2);      else	pointer = NULL;      if (pointer == NULL)	value = 0;      else	value = pointer - str + 1;      result = stNUMBER;      break;    case fINSTR2:      str = a1->pointer;      str2 = a2->pointer;      start = (int) a3->value;      if (start > (int) strlen (str))	{	  value = 0;	}      else	{	  if (start < 1)	    start = 1;	  pointer = strstr (str + start - 1, str2);	  if (pointer == NULL)	    value = 0;	  else	    value = pointer - str + 1;	}      result = stNUMBER;      break;    case fRINSTR:      str = a1->pointer;      str2 = a2->pointer;      len = strlen (str2);      for (i = strlen (str) - 1; i >= 0; i--)	if (!strncmp (str + i, str2, len))	  break;      value = i + 1;      result = stNUMBER;      break;    case fRINSTR2:      str = a1->pointer;      str2 = a2->pointer;      len = strlen (str2);      start = (int) a3->value;      if (start < 1)	{	  value = 0;	}      else	{	  if (start > (int) strlen (str))	    start = strlen (str);	  for (i = start - 1; i >= 0; i--)	    if (!strncmp (str + i, str2, len))	      break;	  value = i + 1;	}      result = stNUMBER;      break;    case fDATE:      pointer = my_malloc (100);      time (&datetime);      strftime (pointer, 100, "%w-%m-%d-%Y-%a-%b", localtime (&datetime));      result = stSTRING;      break;    case fTIME:      pointer = my_malloc (100);      time (&datetime);      strftime (pointer, 100, "%H-%M-%S", localtime (&datetime));      sprintf (pointer + strlen (pointer), "-%d",	       (int) (time (NULL) - compilation_start));      result = stSTRING;      break;    case fSYSTEM:      str = a1->pointer;      pointer = do_system (str);      result = stSTRING;      break;    case fSYSTEM2:      str = a1->pointer;      value = do_system2 (str);      result = stNUMBER;      break;    case fPEEK:      str = a1->pointer;      value = peek (str);      result = stNUMBER;      break;    case fPEEK2:      str = a1->pointer;      pointer = peek2 (str, current);      result = stSTRING;      break;    case fPEEK3:      str = a1->pointer;      str2 = a2->pointer;      pointer = peek3 (str, str2);      result = stSTRING;      break;    case fPEEK4:      value = peekfile ((int) a1->value);      result = stNUMBER;      break;    case fGETBIT:      pointer =	  getbit ((int) a1->value, (int) a2->value, (int) a3->value,		  (int) a4->value);      result = stSTRING;      break;    case fGETCHAR:      pointer =	  getchars ((int) a1->value, (int) a2->value, (int) a3->value,		    (int) a4->value);      result = stSTRING;      break;    case fTELL:      i = (int) (a1->value);      if (badstream (i, 0))	return;      if (!(stream_modes[i] & (smREAD | smWRITE)))	{	  sprintf (string, "stream %d not opened", i);	  error (ERROR, string);	  value = 0;	}      else	{	  value = ftell (streams[i]);	}      result = stNUMBER;      break;    default:      error (ERROR, "function called but not implemented");      return;    }  stack = push ();  /* copy result */  stack->type = result;  if (result == stSTRING)    stack->pointer = pointer;  else    stack->value = value;}static intdo_system2 (char *cmd)		/* execute command as system */{#ifdef UNIX  int ret;  if (curinized)    reset_shell_mode ();  ret = system (cmd);  if (curinized)    reset_prog_mode ();  return ret;#else  STARTUPINFO start;  PROCESS_INFORMATION proc;  DWORD ec;			/* exit code */  SECURITY_ATTRIBUTES prosec;  SECURITY_ATTRIBUTES thrsec;  char *comspec;  ZeroMemory (&prosec, sizeof (prosec));  prosec.nLength = sizeof (prosec);  prosec.bInheritHandle = TRUE;  ZeroMemory (&thrsec, sizeof (thrsec));  thrsec.nLength = sizeof (thrsec);  thrsec.bInheritHandle = TRUE;  ZeroMemory (&start, sizeof (start));  start.cb = sizeof (STARTUPINFO);  start.dwFlags = STARTF_USESTDHANDLES;  start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);  start.hStdError = GetStdHandle (STD_ERROR_HANDLE);  start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);  comspec = getenv ("COMSPEC");  if (!comspec)    comspec = "command.com";  sprintf (string, "%s /C %s", comspec, cmd);  if (!CreateProcess (NULL, string, &prosec, &thrsec, TRUE, 0,		      NULL, NULL, &start, &proc))    {      sprintf (string, "couldn't execute '%s'", cmd);      error (ERROR, string);      return -1;    }  WaitForSingleObject (proc.hProcess, INFINITE);  if (!GetExitCodeProcess (proc.hProcess, &ec))    ec = -1;  CloseHandle (proc.hProcess);  CloseHandle (proc.hThread);  return ec;#endif}static voidclear_buff ()			/* clear system-input buffers */{  buffcurr = &buffroot;  buffcount = 0;}static voidstore_buff (char *buff, int len)	/* store system-input buffer */{  *buffcurr = my_malloc (sizeof (struct buff_chain));  memcpy ((*buffcurr)->buff, buff, SYSBUFFLEN + 1);  (*buffcurr)->len = len;  (*buffcurr)->next = NULL;  buffcurr = &((*buffcurr)->next);  buffcount++;}char *recall_buff ()			/* recall store buffer */{  struct buff_chain *curr, *old;  char *result;  int done, len;  result = (char *) my_malloc (buffcount * (SYSBUFFLEN + 1));  curr = buffroot;  len = 0;  for (done = 0; done < buffcount && curr; done++)    {      memcpy (result + len, curr->buff, SYSBUFFLEN);      len += curr->len;      old = curr;      curr = curr->next;      my_free (old);    }  return result;}static char *do_system (char *cmd)		/* executes command via command.com */{  static char buff[SYSBUFFLEN + 1];	/* buffer to store command */  int len;			/* number of bytes read */#ifdef UNIX  FILE *p;			/* points to pipe */  int c;			/* char read from pipe */#else  int ret;  STARTUPINFO start;  PROCESS_INFORMATION proc;  HANDLE piperead, pipewrite;	/* both ends of pipes */  SECURITY_ATTRIBUTES prosec;  SECURITY_ATTRIBUTES thrsec;  char *comspec;#endif  clear_buff ();#ifdef UNIX  p = popen (cmd, "r");  if (p == NULL)    {      sprintf (string, "couldn't execute '%s'", cmd);      error (ERROR, string);      return my_strdup ("");    }  do    {      len = 0;      while (len < SYSBUFFLEN)	{	  c = fgetc (p);	  if (c == EOF)	    {	      buff[len] = '\0';	      break;	    }	  buff[len] = c;	  len++;	}      store_buff (buff, len);    }  while (c != EOF);  pclose (p);#else  ZeroMemory (&prosec, sizeof (prosec));  prosec.nLength = sizeof (prosec);  prosec.bInheritHandle = TRUE;  ZeroMemory (&thrsec, sizeof (thrsec));  thrsec.nLength = sizeof (thrsec);  thrsec.bInheritHandle = TRUE;  /* create pipe for writing */  CreatePipe (&piperead, &pipewrite, &prosec, 0);  ZeroMemory (&start, sizeof (start));  start.cb = sizeof (STARTUPINFO);  start.dwFlags = STARTF_USESTDHANDLES;  start.hStdOutput = pipewrite;  start.hStdError = pipewrite;  start.hStdInput = GetStdHandle (STD_INPUT_HANDLE);  comspec = getenv ("COMSPEC");  if (!comspec)    comspec = "command.com";  sprintf (string, "%s /C %s", comspec, cmd);  if (!CreateProcess (NULL, string, &prosec, &thrsec, TRUE, 0,		      NULL, NULL, &start, &proc))    {      sprintf (string, "couldn't execute '%s'", cmd);      error (ERROR, string);      return my_strdup ("");    }  CloseHandle (pipewrite);  do    {      /* wait for output to arrive */      if (!ReadFile (piperead, buff, SYSBUFFLEN, (LPDWORD) & len, NULL))	ret = GetLastError ();      else	ret = 0;      buff[len] = '\0';      if (len > 0)	store_buff (buff, len);    }  while (ret != ERROR_BROKEN_PIPE && ret != ERROR_HANDLE_EOF);  CloseHandle (piperead);  CloseHandle (proc.hProcess);  CloseHandle (proc.hThread);#endif  return recall_buff ();}voidgetmousexybm (char *s, int *px, int *py, int *pb, int *pm)	/* get mouse coordinates */{  int x = 0, y = 0, b = 0, m = 0;  char c;  if (*s)    {      sscanf (s, "MB%d%c+%d:%04d,%04d", &b, &c, &m, &x, &y);      if (px)	*px = x;      if (py)	*py = y;      if (pb)	{	  if (c == 'd')	    *pb = b;	  else	    *pb = -b;	}      if (pm)	*pm = m;      return;    }  if (px)    *px = mousex;  if (py)    *py = mousey;  if (pb)    *pb = mouseb;  if (pm)    *pm = mousemod;}static char *dec2other (double d, int base)	/* convert double to hex or binary number */{  int len;  double dec, dec2;  char *other;  int negative = FALSE;  if (d < 0)    {      dec2 = floor (-d);      negative = TRUE;    }  else    {      dec2 = floor (d);    }  len = negative ? 2 : 1;  for (dec = dec2; dec >= base; dec /= base)    len++;  other = my_malloc (len + 1);  other[len] = '\0';  dec = dec2;  for (len--; len >= 0; len--)    {      other[len] =	  "0123456789abcdef"[(int)			     (floor			      (dec - base * floor (dec / base) + 0.5))];      dec = floor (dec / base);    }  if (negative)    other[0] = '-';  return other;}static doubleother2dec (char *hex, int base)	/* convert hex or binary to double number */{  double dec;  static char *digits = "0123456789abcdef";  char *found;  int i, len;  if (base != 2 && base != 16)    {      sprintf (string, "Cannot convert base-%d numbers", base);      error (ERROR, string);      return 0.;    }  dec = 0;  len = strlen (hex);  for (i = 0; i < len; i++)    {      dec *= base;      found = strchr (digits, tolower (hex[i]));      if (!found || found - digits >= base)	{	  sprintf (string, "Not a base-%d number: '%s'", base, hex);	  error (ERROR, string);	  return 0.;	}      dec += found - digits;    }  return dec;}intmyformat (char *dest, double num, char *format, char *sep)	/* format number according to string */{  int i1, i2;			/* dummy */  char c1;			/* dummy */  static char ctrl[6];  char *found, *form;  int pre, post, len, i, digit, colons, dots;  int neg = FALSE;  double ip, fp, round;  static char *digits = "0123456789";  form = format;  if (*form == '%')    {				/* c-style format */      strcpy (ctrl, "+- #0");	/* allowed control chars for c-format */      form++;      while ((found = strchr (ctrl, *form)) != NULL)	{	  *found = '?';	  form++;	}      if (sscanf (form, "%u.%u%c%n", &i1, &i2, &c1, &i) != 3 &&	  sscanf (form, "%u.%c%n", &i2, &c1, &i) != 2 &&	  sscanf (form, ".%u%c%n", &i2, &c1, &i) != 2 &&	  sscanf (form, "%u%c%n", &i2, &c1, &i) != 2)	return FALSE;      if (!strchr ("feEgG", c1) || form[i])	return FALSE;      /* seems okay, let's print */      sprintf (dest, format, num);    }  else    {				/* basic-style format */      if (num < 0)	{	  neg = TRUE;	  num = -num;	}      colons = 0;      dots = 0;      pre = 0;      post = 0;      for (form = format; *form; form++)	{	  if (*form == ',')	    {	      if (dots)		return FALSE;	      colons++;	    }	  else if (*form == '.')	    {	      dots++;	    }	  else if (*form == '#')	    {	      if (dots)		post++;	      else		pre++;	    }	  else	    {	      return FALSE;	    }	}      if (dots > 1)	return FALSE;      len = strlen (format);      dest[len] = '\0';      round = 0.5;      for (i = 0; i < post; i++)	round /= 10.;      if (fabs (num) < round)	neg = FALSE;      num += round;      ip = floor (num);      fp = num - ip;      if (fp > 1 || fp < 0)	fp = 0;      dest[pre + colons] = format[pre + colons];      if ((int) ip)	{	  for (i = pre + colons - 1; i >= 0; i--)	    {	      if (neg && !(int) ip)		{		  neg = 0;		  dest[i] = '-';		}	      else		{		  if (format[i] == '#')		    {		      digit = ((int) ip) % 10;		      ip /= 10;		      if (((int) ip) || digit > 0)			dest[i] = digits[digit];		      else			dest[i] = ' ';		    }		  else		    {		      if ((int) ip)			dest[i] = format[i];		      else			dest[i] = ' ';		    }		}	    }	}      else	{	  i = pre + colons - 1;	  dest[i--] = '0';	}      if ((neg && i < 0) || ((int) ip))	{	  strcpy (dest, format);	  return TRUE;	}      if (neg)	dest[i--] = '-';      for (; i >= 0; i--)	dest[i] = ' ';      for (i = pre + colons + 1; i < len; i++)	{	  fp *= 10;	  digit = (int) fp;	  fp -= digit;	  dest[i] = digits[digit];	}      if (sep && sep[0] && sep[1])	{	  for (i = 0; i < len; i++)	    {	      if (dest[i] == ',')		dest[i++] = sep[0];	      if (dest[i] == '.')		dest[i++] = sep[1];	    }	}    }  return TRUE;}static char *fromto (char *str, int from, int to)	/* gives back portion of string *//* from and to can be in the range 1...strlen(str) */{  int len, i;  char *part;  len = strlen (str);  if (from > to || to < 0 || from > len - 1)    {      /* give back empty string */      part = my_malloc (1);      part[0] = '\0';    }  else    {      if (from <= 0)	from = 0;      if (to >= len)	to = len - 1;      part = my_malloc (sizeof (char) * (to - from + 2));	/* characters and '/0' */      for (i = from; i <= to; i++)	part[i - from] = str[i];	/* copy */      part[i - from] = '\0';    }  return part;}voidmywait ()			/* wait given number of seconds */{  double delay;#ifdef UNIX  struct timeval tv;#else  MSG msg;  int timerid;#endif  delay = pop (stNUMBER)->value;  if (delay < 0)    delay = 0.;#ifdef UNIX  tv.tv_sec = (int) delay;  tv.tv_usec = (delay - (int) delay) * 1000000;  select (0, NULL, NULL, NULL, &tv);#else /* WINDOWS */  timerid = SetTimer (NULL, 0, (int) (delay * 1000), (TIMERPROC) NULL);  GetMessage ((LPMSG) & msg, NULL, WM_TIMER, WM_TIMER);  KillTimer (NULL, timerid);#endif}voidmybell ()			/* ring ascii bell */{#ifdef UNIX  printf ("\007");  fflush (stdout);#else /* WINDOWS */  Beep (1000, 100);#endif}voidcreate_poke (char flag)		/* create Command 'cPOKE' */{  struct command *cmd;  if (flag == 'S' || flag == 'D')    cmd = add_command (cPOKEFILE, FALSE);  else    cmd = add_command (cPOKE, FALSE);  cmd->tag = flag;}voidpoke (struct command *cmd)	/* poke into internals */{  char *dest, *s, c;  char *sarg = NULL;  double darg;  if (cmd->tag == 's')    sarg = pop (stSTRING)->pointer;  else    darg = pop (stNUMBER)->value;  dest = pop (stSTRING)->pointer;  for (s = dest; *s; s++)    *s = tolower ((int) *s);  if (!strcmp (dest, "fontheight") && !sarg)    {

⌨️ 快捷键说明

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