📄 slstrops.c
字号:
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 (®exp_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, ®exp_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 + -