nasl_text_utils.c
来自「大国补丁后的nessus2.2.8的源代码」· C语言 代码 · 共 1,313 行 · 第 1/2 页
C
1,313 行
* * egrep(pattern, string) */tree_cell * nasl_egrep(lex_ctxt * lexic){ char * pattern = get_str_local_var_by_name(lexic, "pattern"); char * string = get_str_local_var_by_name(lexic, "string"); int icase = get_int_local_var_by_name(lexic, "icase", 0); tree_cell * retc; regex_t re; regmatch_t subs[NS]; char * s, * t; int copt; char * rets; int max_size = get_var_size_by_name(lexic, "string"); if(pattern == NULL || string == NULL) return NULL; bzero(subs, sizeof(subs)); bzero(&re, sizeof(re)); if(icase != 0) copt = REG_ICASE; else copt = 0; rets = emalloc(max_size + 1); string = estrdup(string); s = string; while( s[0] == '\n' )s++; t = strchr(s, '\n'); if(t != NULL ) t[0] = '\0'; if(s[0] != '\0') for(;;) { bzero(&re, sizeof(re)); nasl_re_set_syntax(RE_SYNTAX_POSIX_EGREP); if(nasl_regcomp(&re, pattern, REG_EXTENDED|copt)) { nasl_perror(lexic, "egrep() : regcomp() failed\n"); return NULL; } if(nasl_regexec(&re, s, (size_t)NS, subs, 0) == 0) { char * t = strchr(s, '\n'); if(t != NULL) t[0]='\0'; strcat(rets, s); strcat(rets, "\n"); if(t != NULL) t[0]='\n'; } nasl_regfree(&re); if(t == NULL) s = NULL; else s = &(t[1]); if(s != NULL ) { while(s[0] == '\n') s++; /* Skip empty lines */ t = strchr(s, '\n'); } else t = NULL; if(t != NULL) t[0] = '\0'; if(s == NULL || s[0] == '\0')break; }#ifdef I_WANT_MANY_DIRTY_ERROR_MESSAGES if(rets[0] == '\0') { efree(&rets); efree(&string); return FAKE_CELL; }#endif efree(&string); retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA; retc->size = strlen(rets); retc->x.str_val = rets; return retc;}/*---------------------------------------------------------------------*//* * This function returns an array */tree_cell*nasl_eregmatch(lex_ctxt* lexic){ char *pattern = get_str_local_var_by_name(lexic, "pattern"); char *string = get_str_local_var_by_name(lexic, "string"); int icase = get_int_local_var_by_name(lexic, "icase", 0); int copt = 0, i; tree_cell *retc; regex_t re; regmatch_t subs[NS]; anon_nasl_var v; nasl_array *a; if(icase != 0) copt = REG_ICASE; if(pattern == NULL || string == NULL) return NULL; nasl_re_set_syntax(RE_SYNTAX_POSIX_EGREP); if(nasl_regcomp(&re, pattern, REG_EXTENDED|copt)) { nasl_perror(lexic, "regmatch() : regcomp() failed\n"); return NULL; } if(nasl_regexec(&re, string, (size_t)NS, subs, 0) != 0) { nasl_regfree(&re); return NULL; } retc = alloc_tree_cell(0, NULL); retc->type = DYN_ARRAY; retc->x.ref_val = a = emalloc(sizeof(nasl_array)); for (i = 0; i < NS; i ++) if (subs[i].rm_so != -1) { v.var_type = VAR2_DATA; v.v.v_str.s_siz = subs[i].rm_eo - subs[i].rm_so; v.v.v_str.s_val = (unsigned char*)string + subs[i].rm_so; (void) add_var_to_list(a, i, &v); } nasl_regfree(&re); return retc;}/* * Syntax: substr(s, i1) or substr(s, i1, i2) * Returns character from string s starting for position i1 till the end or * position i2 (start of string is 0) */tree_cell* nasl_substr(lex_ctxt* lexic){ char *s1; int sz1, sz2, i1, i2, typ; tree_cell *retc; s1 = get_str_var_by_num(lexic, 0); sz1 = get_var_size_by_num(lexic, 0); typ = get_var_type_by_num(lexic, 0); i1 = get_int_var_by_num(lexic, 1, -1);#ifndef MAX_INT#define MAX_INT (~(1 << (sizeof(int) * 8 - 1)))#endif i2 = get_int_var_by_num(lexic, 2, MAX_INT); if (i2 >= sz1) i2 = sz1-1; if (s1 == NULL || i1 < 0) { nasl_perror(lexic, "Usage: substr(string, idx_start [,idx_end])\n"); return NULL; } retc = alloc_tree_cell(0, NULL); retc->type = (typ == CONST_STR ? CONST_STR : CONST_DATA); if (i1 > i2) { retc->x.str_val = emalloc(0); retc->size = 0; return retc; } sz2 = i2 - i1 + 1; retc->size = sz2; retc->x.str_val = emalloc(sz2); memcpy(retc->x.str_val, s1 + i1, sz2); return retc;}/*---------------------------------------------------------------------*//* * Syntax: insstr(s1, s2, i1, i2) or insstr(s1, s2, i1) * Insert string s2 into slice [i1:i2] of string s1 and returns the result * Warning: returns a CONST_DATA! */tree_cell* nasl_insstr(lex_ctxt* lexic){ char *s1, *s2, *s3; int sz1, sz2, sz3, i1, i2; tree_cell *retc; s1 = get_str_var_by_num(lexic, 0); sz1 = get_var_size_by_num(lexic, 0); s2 = get_str_var_by_num(lexic, 1); sz2 = get_var_size_by_num(lexic, 1); i1 = get_int_var_by_num(lexic, 2, -1); i2 = get_int_var_by_num(lexic, 3, -1); if (i2 > sz1 || i2 == -1) i2 = sz1-1; if (s1 == NULL || s2 == NULL || i1 < 0 || i2 < 0) { nasl_perror(lexic, "Usage: insstr(str1, str2, idx_start [,idx_end])\n"); return NULL; } if (i1 >= sz1) { nasl_perror(lexic, "insstr: cannot insert string2 after end of string1\n"); return NULL; } retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA; if (i1 > i2) { nasl_perror(lexic," insstr: warning! 1st index %d greater than 2nd index %d\n", i1, i2); sz3 = sz2; } else sz3 = sz1 + i1 - i2 - 1 + sz2; s3 = retc->x.str_val = emalloc(sz3); retc->size = sz3; if (i1 <= sz1) { memcpy(s3, s1, i1); s3 += i1; } memcpy(s3, s2, sz2); s3 += sz2; if (i2 < sz1 - 1) memcpy(s3, s1 + i2 +1, sz1 - 1 - i2); return retc;}tree_cell*nasl_match(lex_ctxt* lexic){ char *pattern = get_str_local_var_by_name(lexic, "pattern"); char *string = get_str_local_var_by_name(lexic, "string"); int icase = get_int_local_var_by_name(lexic, "icase", 0); tree_cell *retc; if (pattern == NULL) { nasl_perror(lexic, "nasl_match: parameter 'pattern' missing\n"); return NULL; } if (string == NULL) { nasl_perror(lexic, "nasl_match: parameter 'string' missing\n"); return NULL; } retc = alloc_tree_cell(0, NULL); retc->type = CONST_INT; retc->x.i_val = str_match(string, pattern, icase); return retc;}tree_cell*nasl_split(lex_ctxt* lexic){ tree_cell *retc; nasl_array *a; char *p, *str, *sep; int i, i0, j, len, sep_len = 0, keep = 1; anon_nasl_var v; str = get_str_var_by_num(lexic, 0); if (str == NULL) {#if NASL_DEBUG > 0 nasl_perror(lexic, "split: missing string parameter\n");#endif return NULL; } len = get_var_size_by_num(lexic, 0); if (len <= 0) len = strlen(str); if (len <= 0) return NULL; sep = get_str_local_var_by_name(lexic, "sep"); if (sep != NULL) { sep_len = get_var_size_by_name(lexic, "sep"); if ( sep_len <= 0 ) sep_len = strlen(sep); if ( sep_len <= 0 ) { nasl_perror(lexic, "split: invalid 'seplen' parameter\n"); return NULL; } } keep = get_int_local_var_by_name(lexic, "keep", 1); retc = alloc_tree_cell(0, NULL); retc->type = DYN_ARRAY; retc->x.ref_val = a = emalloc(sizeof(nasl_array)); bzero(&v, sizeof(v)); v.var_type = VAR2_DATA; if (sep != NULL) { i = 0; j = 0; for(;;) { if ((p = (char*)nasl_memmem(str + i, len - i, sep, sep_len)) == NULL) { v.v.v_str.s_siz = len - i; v.v.v_str.s_val = (unsigned char*)str + i; (void) add_var_to_list(a, j ++, &v); return retc; } else { if (keep) v.v.v_str.s_siz = (p - (str + i)) + sep_len; else v.v.v_str.s_siz = p - (str + i); v.v.v_str.s_val = (unsigned char*)str + i; (void) add_var_to_list(a, j ++, &v); i = (p - str) + sep_len; if (i >= len) return retc; } } } /* Otherwise, we detect the end of line. A little more subtle */ for (i = i0 = j = 0; i < len; i ++) { if (str[i] == '\r' && str[i+1] == '\n') { i ++; if (keep) v.v.v_str.s_siz = i - i0 + 1; else v.v.v_str.s_siz = i - i0 - 1; v.v.v_str.s_val = (unsigned char*)str + i0; i0 = i + 1; (void) add_var_to_list(a, j ++, &v); } else if (str[i] == '\n') { if (keep) v.v.v_str.s_siz = i - i0 + 1; else v.v.v_str.s_siz = i - i0; v.v.v_str.s_val = (unsigned char*)str + i0; i0 = i + 1; (void) add_var_to_list(a, j ++, &v); } } if (i > i0) { v.v.v_str.s_siz = i - i0; v.v.v_str.s_val = (unsigned char*)str + i0; (void) add_var_to_list(a, j ++, &v); } return retc;}tree_cell*nasl_chomp(lex_ctxt* lexic){ tree_cell *retc; char *p = NULL, *str; int i, len; str = get_str_var_by_num(lexic, 0); if (str == NULL) return NULL; len = get_var_size_by_num(lexic, 0); retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA; for (i = 0; i < len; i ++) if (isspace(str[i])) { if (p == NULL) p = str + i; } else p = NULL; if (p != NULL) len = (p - str); retc->x.str_val = emalloc(len); retc->size = len; memcpy(retc->x.str_val, str, len); retc->x.str_val[len] = '\0'; return retc;}/*---------------------------------------------------------------------*/tree_cell* nasl_crap(lex_ctxt* lexic){ tree_cell *retc; char *data = get_str_local_var_by_name(lexic, "data"); int data_len = -1; int len = get_int_local_var_by_name(lexic, "length", -1); int len2 = get_int_var_by_num(lexic, 0, -1); if(len < 0 && len2 < 0) { nasl_perror(lexic, "crap: invalid or missing 'length' argument\n"); return NULL; } if (len >= 0 && len2 >= 0) { nasl_perror(lexic, "crap: cannot set both unnamed and named 'length'\n"); return NULL; } if (len < 0) len = len2; if( len == 0 ) return FAKE_CELL; if (data != NULL) { data_len = get_var_size_by_name(lexic, "data"); if (data_len == 0) { nasl_perror(lexic, "crap: invalid null 'data' parameter\n"); return NULL; } } retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA /*CONST_STR*/; retc->x.str_val = emalloc(len+1); retc->size = len; if (data == NULL) memset(retc->x.str_val, 'X', len); else { int i,r; for(i = 0; i < len - data_len; i += data_len) memcpy(retc->x.str_val + i, data, data_len); if(data_len != 1) { if((r = (len % data_len)) > 0) memcpy(retc->x.str_val + (len - r), data, r); else memcpy(retc->x.str_val + (len - data_len), data, data_len); } else retc->x.str_val[ len - 1 ] = data[0]; } retc->x.str_val[len] = '\0'; return retc;}/*---------------------------------------------------------------------*/tree_cell* nasl_strstr(lex_ctxt * lexic){ char * a = get_str_var_by_num(lexic, 0); char * b = get_str_var_by_num(lexic, 1); int sz_a = get_var_size_by_num(lexic, 0); int sz_b = get_var_size_by_num(lexic, 1); char * c; tree_cell * retc; if(a == NULL || b == NULL) return NULL; if(sz_b > sz_a) return NULL; c = (char*)nasl_memmem(a, sz_a, b, sz_b); if(c == NULL) return FAKE_CELL; retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA; retc->size = sz_a - (c - a); retc->x.str_val = nasl_strndup(c, retc->size); return retc;}/* * stridx does the same job as strstr but returns the index of the substring * Returning NULL for "not found" is dangerous as automatic conversion to * to integer would change it into 0. * So we return (-1) */tree_cell*nasl_stridx(lex_ctxt * lexic){ char *a = get_str_var_by_num(lexic, 0); int sz_a = get_var_size_by_num(lexic, 0); char *b = get_str_var_by_num(lexic, 1); int sz_b = get_var_size_by_num(lexic, 1); char *c; int start = get_int_var_by_num(lexic, 2, 0); tree_cell *retc = alloc_typed_cell(CONST_INT); retc->x.i_val = -1; if (a == NULL || b == NULL) { nasl_perror(lexic, "stridx(string, substring [, start])\n"); return retc; } if(start < 0 || start > sz_a) { nasl_perror(lexic, "stridx(string, substring [, start])\n"); return retc; } if ((sz_a == start) || (sz_b > sz_a + start)) return retc; c = (char*)nasl_memmem(a + start, sz_a - start, b, sz_b); if(c != NULL) retc->x.i_val = c - a; return retc;}/* * str_replace(string: s, find: f, replace: r [,count: n]) */tree_cell*nasl_str_replace(lex_ctxt * lexic){ char *a, *b, *r, *s, *c; int sz_a, sz_b, sz_r, count; int i1, i2, sz2, n, l; tree_cell *retc = NULL; a = get_str_local_var_by_name(lexic, "string"); b = get_str_local_var_by_name(lexic, "find"); r = get_str_local_var_by_name(lexic, "replace"); sz_a = get_local_var_size_by_name(lexic, "string"); sz_b = get_local_var_size_by_name(lexic, "find"); sz_r = get_local_var_size_by_name(lexic, "replace"); count = get_int_local_var_by_name(lexic, "count", 0); if (a == NULL || b == NULL) { nasl_perror(lexic, "Missing argument: str_replace(string: s, find: f, replace: r [,count: c])\n"); return NULL; } if (sz_b == 0) { nasl_perror(lexic, "str_replace: illegal 'find' argument value\n"); return NULL; } if (r == NULL) { r = ""; sz_r = 0; } retc = alloc_typed_cell(CONST_DATA); s = emalloc(1); sz2 = 0; n = 0; for (i1 = i2 = 0; i1 <= sz_a - sz_b; ) { c = (char*)nasl_memmem(a + i1, sz_a - i1, b, sz_b); if(c == NULL) break; l = (c - a) - i1; sz2 += sz_r + l; s = erealloc(s, sz2+1); s[sz2] = '\0'; if (c - a > i1) { memcpy(s + i2, a + i1, l); i2 += l; } if (sz_r > 0) { memcpy(s + i2, r, sz_r); i2 += sz_r; } i1 += l + sz_b; n ++; if (count > 0 && n >= count) break; } if (i1 < sz_a) { sz2 += (sz_a - i1); s = erealloc(s, sz2+1); s[sz2] = '\0'; memcpy(s + i2, a + i1, sz_a - i1); } retc->x.str_val = s; retc->size = sz2; return retc;}/*---------------------------------------------------------------------*/tree_cell* nasl_int(lex_ctxt * lexic){ int r = get_int_var_by_num(lexic, 0, 0); tree_cell * retc; retc = alloc_tree_cell(0, NULL); retc->type = CONST_INT; retc->x.i_val = r; return retc;}/*EOF*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?