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

📄 slstrops.c

📁 一个C格式的脚本处理函数库源代码,可让你的C程序具有执行C格式的脚本文件
💻 C
📖 第 1 页 / 共 3 页
字号:
	   default:	     SLang_doerror("Invalid Format.");	     return(out);	  }	*f++ = ch; *f = 0;	width = width + precis;	if (width > guess_size) guess_size = width;	if (len + guess_size > malloc_len)	  {	     outp = (char *) SLrealloc(out, len + guess_size + 1);	     if (outp == NULL)	       {		  SLang_Error = SL_MALLOC_ERROR;		  return (out);	       }	     out = outp;	     outp = out + len;	     malloc_len = len + guess_size;	  }	if (use_varp)	  {	     sprintf(outp, dfmt, varp);	     if (do_free) SLang_free_slstring ((char *)varp);	  }#if SLANG_HAS_FLOAT	else if (use_double) sprintf(outp, dfmt, x);#endif	else if (use_long) sprintf (outp, dfmt, long_var);	else sprintf(outp, dfmt, int_var);	len += strlen(outp);	outp = out + len;	fmt = p;     }   if (out != NULL)     {	outp = SLrealloc (out, (unsigned int) (outp - out) + 1);	if (outp != NULL) out = outp;     }   return (out);}/*}}}*/int _SLstrops_do_sprintf_n (int n) /*{{{*/{   char *p;   char *fmt;   SLang_Object_Type *ptr;   int ofs;   if (-1 == (ofs = SLreverse_stack (n + 1)))     return -1;   ptr = _SLang_get_run_stack_base () + ofs;   if (SLang_pop_slstring(&fmt))     return -1;   p = SLdo_sprintf (fmt);   SLang_free_slstring (fmt);   SLdo_pop_n (_SLang_get_run_stack_pointer () - ptr);   if (SLang_Error)     {	SLfree (p);	return -1;     }      return SLang_push_malloced_string (p);}/*}}}*/static void sprintf_n_cmd (int *n){   _SLstrops_do_sprintf_n (*n);}static void sprintf_cmd (void){   _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1);    /* do not include format */}/* converts string s to a form that can be used in an eval */static void make_printable_string(char *s) /*{{{*/{   unsigned int len;   register char *s1 = s, ch, *ss1;   char *ss;   /* compute length */   len = 3;   while ((ch = *s1++) != 0)     {	if ((ch == '\n') || (ch == '\\') || (ch == '"')) len++;	len++;     }   if (NULL == (ss = SLmalloc(len)))     return;   s1 = s;   ss1 = ss;   *ss1++ = '"';   while ((ch = *s1++) != 0)     {	if (ch == '\n')	  {	     ch = 'n';	     *ss1++ = '\\';	  }	else if ((ch == '\\') || (ch == '"'))	  {	     *ss1++ = '\\';	  }	*ss1++ = ch;     }   *ss1++ = '"';   *ss1 = 0;   if (-1 == SLang_push_string (ss))     SLfree (ss);}/*}}}*/static int is_list_element_cmd (char *list, char *elem, int *d_ptr){   char ch;   int d, n;   unsigned int len;   char *lbeg, *lend;   d = *d_ptr;   len = strlen (elem);   n = 1;   lend = list;   while (1)     {	lbeg = lend;	while ((0 != (ch = *lend)) && (ch != (char) d)) lend++;	if ((lbeg + len == lend)	    && (0 == strncmp (elem, lbeg, len)))	  break;	if (ch == 0)	  {	     n = 0;	     break;	  }	lend++;			       /* skip delim */	n++;     }   return n;}/*}}}*//* Regular expression routines for strings */static SLRegexp_Type regexp_reg;static int string_match_cmd (char *str, char *pat, int *nptr) /*{{{*/{   int n;   unsigned int len;   unsigned char rbuf[512], *match;   n = *nptr;   regexp_reg.case_sensitive = 1;   regexp_reg.buf = rbuf;   regexp_reg.pat = (unsigned char *) pat;   regexp_reg.buf_len = sizeof (rbuf);   if (SLang_regexp_compile (&regexp_reg))     {	SLang_verror (SL_INVALID_PARM, "Unable to compile pattern");	return -1;     }   n--;   len = strlen(str);   if ((n < 0) || ((unsigned int) n > len))     {	/* SLang_Error = SL_INVALID_PARM; */	return 0;     }   str += n;   len -= n;   if (NULL == (match = SLang_regexp_match((unsigned char *) str, len, &regexp_reg)))     return 0;   /* adjust offsets */   regexp_reg.offset = n;   return (1 + (int) ((char *) match - str));}/*}}}*/static int string_match_nth_cmd (int *nptr) /*{{{*/{   int n, beg;   n = *nptr;   if ((n < 0) || (n > 9) || (regexp_reg.pat == NULL)       || ((beg = regexp_reg.beg_matches[n]) == -1))     {	SLang_Error = SL_INVALID_PARM;	return -1;     }   SLang_push_integer(beg + regexp_reg.offset);   return regexp_reg.end_matches[n];}/*}}}*/static char *create_delimited_string (char **list, unsigned int n, 				      char *delim){   unsigned int len, dlen;   unsigned int i;   unsigned int num;   char *str, *s;   len = 1;			       /* allow room for \0 char */   num = 0;   for (i = 0; i < n; i++)     {	if (list[i] == NULL) continue;	len += strlen (list[i]);	num++;     }   dlen = strlen (delim);   if (num > 1)     len += (num - 1) * dlen;   if (NULL == (str = SLmalloc (len)))     return NULL;   *str = 0;   s = str;   i = 0;	   while (num > 1)     {	while (list[i] == NULL)	  i++;		strcpy (s, list[i]);	s += strlen (list[i]);	strcpy (s, delim);	s += dlen;	i++;	num--;     }      if (num)     {	while (list[i] == NULL)	  i++;		strcpy (s, list[i]);     }      return str;}static void create_delimited_string_cmd (int *nptr){   unsigned int n, i;   char **strings;   char *str;   str = NULL;   n = 1 + (unsigned int) *nptr;       /* n includes delimiter */   if (NULL == (strings = (char **)SLmalloc (n * sizeof (char *))))     {	SLdo_pop_n (n);	return;     }   memset((char *)strings, 0, n * sizeof (char *));   i = n;   while (i != 0)     {	i--;	if (-1 == SLang_pop_slstring (strings + i))	  goto return_error;     }   str = create_delimited_string (strings + 1, (n - 1), strings[0]);   /* drop */   return_error:   for (i = 0; i < n; i++) SLang_free_slstring (strings[i]);   SLfree ((char *)strings);   (void) SLang_push_malloced_string (str);   /* NULL Ok */}static void strjoin_cmd (char *delim){   SLang_Array_Type *at;   char *str;   if (-1 == SLang_pop_array_of_type (&at, SLANG_STRING_TYPE))     return;      str = create_delimited_string ((char **)at->data, at->num_elements, delim);   SLang_free_array (at);   (void) SLang_push_malloced_string (str);   /* NULL Ok */}static void str_delete_chars_cmd (char *s, char *d){   unsigned char lut[256];   unsigned char *s1, *s2;   unsigned char ch;   make_lut ((unsigned char *)d, lut);   if (NULL == (s = SLmake_string (s)))     return;   s1 = s2 = (unsigned char *) s;   while ((ch = *s2++) != 0)     {	if (0 == lut[ch])	  *s1++ = ch;     }   *s1 = 0;      (void) SLang_push_malloced_string (s);}static unsigned char *make_lut_string (unsigned char *s){   unsigned char lut[256];   unsigned char *l;   unsigned int i;   /* Complement-- a natural order is imposed */   make_lut (s, lut);   l = lut;   for (i = 1; i < 256; i++)     {	if (lut[i])	  *l++ = (unsigned char) i;     }   *l = 0;   return (unsigned char *) SLmake_string ((char *)lut);}static unsigned char *make_str_range (unsigned char *s){   unsigned char *s1, *range;   unsigned int num;   unsigned char ch;   int len;   if (*s == '^')     return make_lut_string (s);   num = 0;   s1 = s;   while ((ch = *s1++) != 0)     {	unsigned char ch1;	ch1 = *s1;	if (ch1 == '-')	  {	     s1++;	     ch1 = *s1;	     len = (int)ch1 - (int)ch;	     if (len < 0)	       len = -len;	     	     num += (unsigned int) len;	     if (ch1 != 0)	       s1++;	  }	num++;     }      range = (unsigned char *)SLmalloc (num + 1);   if (range == NULL)     return NULL;      s1 = s;   s = range;   while ((ch = *s1++) != 0)     {	unsigned char ch1;	unsigned int i;	ch1 = *s1;	if (ch1 != '-')	  {	     *s++ = ch;	     continue;	  }	s1++;	ch1 = *s1;		if (ch > ch1)	  {	     if (ch1 == 0)	       ch1 = 1;	     for (i = (unsigned int) ch; i >= (unsigned int) ch1; i--)	       *s++ = (unsigned char) i;	     	     if (*s1 == 0)	       break;	  }	else	  {	     for (i = (unsigned int) ch; i <= (unsigned int) ch1; i++)	       *s++ = (unsigned char) i;	  }	s1++;     }   #if 0   if (range + num != s)     SLang_verror (SL_INTERNAL_ERROR, "make_str_range: num wrong");#endif   *s = 0;   return range;}static void strtrans_cmd (char *s, unsigned char *from, unsigned char *to){   unsigned char map[256];   char *s1;   unsigned int i;   unsigned char ch;   unsigned char last_to;   unsigned char *from_range, *to_range;   for (i = 0; i < 256; i++) map[i] = (unsigned char) i;   if (*to == 0)     {	str_delete_chars_cmd (s, (char *)from);	return;     }   from_range = make_str_range (from);   if (from_range == NULL)     return;   to_range = make_str_range (to);   if (to_range == NULL)     {	SLfree ((char *)from_range);	return;     }   from = from_range;   to = to_range;   last_to = 0;   while ((ch = *from++) != 0)     {	unsigned char to_ch;	if (0 == (to_ch = *to++))	  {	     do	       {		  map[ch] = last_to;	       }	     while (0 != (ch = *from++));	     break;	  }		last_to = map[ch] = to_ch;     }   SLfree ((char *)from_range);   SLfree ((char *)to_range);   s = SLmake_string (s);   if (s == NULL)     return;   s1 = s;   while ((ch = (unsigned char) *s1) != 0)     *s1++ = (char) map[ch];      (void) SLang_push_malloced_string (s);}static SLang_Intrin_Fun_Type Strops_Table [] = /*{{{*/{   MAKE_INTRINSIC_I("create_delimited_string",  create_delimited_string_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SS("strcmp",  strcmp_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_SSI("strncmp",  strncmp_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_0("strcat",  strcat_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("strlen",  strlen_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_SII("strchop", strchop_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SII("strchopr", strchopr_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_I("strreplace", strreplace_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_SSS("str_replace", str_replace_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_SII("substr",  substr_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SS("is_substr",  issubstr_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_II("strsub",  strsub_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SII("extract_element", extract_element_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SSI("is_list_element", is_list_element_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_SSI("string_match", string_match_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_I("string_match_nth", string_match_nth_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_0("strlow", strlow_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_I("tolower", tolower_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_I("toupper", toupper_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_0("strup", strup_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("isdigit",  isdigit_cmd, SLANG_INT_TYPE),   MAKE_INTRINSIC_S("strtrim", strtrim_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("strtrim_end", strtrim_end_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("strtrim_beg", strtrim_beg_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_0("strcompress", strcompress_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_I("Sprintf", sprintf_n_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_0("sprintf", sprintf_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_0("sscanf", _SLang_sscanf, SLANG_INT_TYPE),   MAKE_INTRINSIC_S("make_printable_string", make_printable_string, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SSI("str_quote_string", str_quote_string_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SSS("str_uncomment_string", str_uncomment_string_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_II("define_case", SLang_define_case, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("strtok", strtok_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_S("strjoin", strjoin_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SSS("strtrans", strtrans_cmd, SLANG_VOID_TYPE),   MAKE_INTRINSIC_SS("str_delete_chars", str_delete_chars_cmd, SLANG_VOID_TYPE),   SLANG_END_INTRIN_FUN_TABLE};/*}}}*/int _SLang_init_slstrops (void){   return SLadd_intrin_fun_table (Strops_Table, NULL);}

⌨️ 快捷键说明

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