36#define G_LOG_DOMAIN "lib nasl"
52 for (vi = 0; vi < vn; vi++)
63 newlen = retc->
size + sz;
76 if (*p1 ==
'\\' && p1[1] !=
'\0')
93 if (isxdigit (p1[2]) && isxdigit (p1[3]))
97 * (isdigit (p1[2]) ? p1[2] -
'0'
98 : 10 + tolower (p1[2]) -
'a')
99 + (isdigit (p1[3]) ? p1[3] -
'0'
100 : 10 + tolower (p1[3]) -
'a');
107 "Buggy hex value '\\x%c%c' skipped\n",
108 isprint (p1[2]) ? p1[2] :
'.',
109 isprint (p1[3]) ? p1[3] :
'.');
116 "Unknown escape sequence '\\%c' in the "
118 isprint (p1[1]) ? p1[1] :
'.', s);
134#define RAW_STR_LEN 32768
149 for (vi = 0; vi < vn && total_len <
RAW_STR_LEN - 1; vi++)
173 nasl_perror (lexic,
"Error. Too long argument in raw_string()\n");
183 for (i = 0, j = 0; i < sz; i++)
192 else if (s[i + 1] ==
't')
197 else if (s[i + 1] ==
'r')
202 else if (s[i + 1] ==
'x' && isxdigit (s[i + 2])
203 && isxdigit (s[i + 3]))
205 if (isdigit (s[i + 2]))
206 x = (s[i + 2] -
'0') * 16;
208 x = (10 + tolower (s[i + 2]) -
'a') * 16;
209 if (isdigit (s[i + 3]))
212 x += tolower (s[i + 3]) + 10 -
'a';
216 else if (s[i + 1] ==
'\\')
238 nasl_perror (lexic,
"Error. Too long argument in raw_string()\n");
241 bcopy (str, retc->
x.
str_val + total_len, current_len);
242 total_len += current_len;
246 retc->
size = total_len;
275 for (vi = 0; vi < vn; vi++)
284 newlen = retc->
size + sz;
302 msg = g_malloc0 (r->
size + 1);
303 for (j = 0; j < r->
size; j++)
308 g_message (
"%s", msg);
328 snprintf (ret,
sizeof (ret),
"0x%02x", (
unsigned char) v);
330 retc->
size = strlen (ret);
350 ret = g_malloc0 (
len * 2 + 1);
351 for (i = 0; i <
len; i++)
354 snprintf (ret + 2 * i, 3,
"%02x", (
unsigned char) s[i]);
358 retc->
size = strlen (ret);
373 nasl_perror (lexic,
"Usage : ord(char). The given char or string "
395 ret = g_malloc0 (str_len + 1);
396 memcpy (ret, str, str_len + 1);
398 for (i = 0; i < str_len; i++)
399 ret[i] = tolower (ret[i]);
402 retc->
size = str_len;
419 ret = g_malloc0 (str_len + 1);
420 memcpy (ret, str, str_len + 1);
422 for (i = 0; i < str_len; i++)
423 ret[i] = toupper (ret[i]);
426 retc->
size = str_len;
465 if (pattern == NULL ||
string == NULL)
468 if (regcomp (&re, pattern, REG_EXTENDED | REG_NOSUB | copt))
470 nasl_perror (lexic,
"ereg() : regcomp() failed for pattern '%s'.\n",
478 string = g_regex_escape_nul (
string, max_size);
480 string = g_strdup (
string);
485 s = strchr (
string,
'\n');
490 if (regexec (&re,
string, 0, NULL, 0) == 0)
511_regreplace (
const char *pattern,
const char *replace,
const char *
string,
512 int icase,
int extended)
522 int pos, tmp, string_len, new_l;
525 string_len = strlen (
string);
530 copts |= REG_EXTENDED;
531 err = regcomp (&re, pattern, copts);
539 buf_len = 2 * string_len;
540 buf = g_malloc0 (buf_len + 1);
548 regexec (&re, &
string[pos], (
size_t)
NS, subs, (pos ? REG_NOTBOL : 0));
550 if (err && err != REG_NOMATCH)
564 new_l = strlen (buf) + subs[0].rm_so;
567 if (
'\\' == *walk &&
'0' <= walk[1] &&
'9' >= walk[1]
568 && subs[walk[1] -
'0'].rm_so > -1
569 && subs[walk[1] -
'0'].rm_eo > -1)
571 new_l += subs[walk[1] -
'0'].rm_eo - subs[walk[1] -
'0'].rm_so;
580 if (new_l + 1 > buf_len)
582 buf_len = buf_len + 2 * new_l;
583 nbuf = g_malloc0 (buf_len + 1);
584 strncpy (nbuf, buf, buf_len);
590 strncat (buf, &
string[pos], subs[0].rm_so);
593 walkbuf = &buf[tmp + subs[0].rm_so];
596 if (
'\\' == *walk &&
'0' <= walk[1] &&
'9' >= walk[1]
597 && subs[walk[1] -
'0'].rm_so > -1
598 && subs[walk[1] -
'0'].rm_eo > -1)
600 tmp = subs[walk[1] -
'0'].rm_eo - subs[walk[1] -
'0'].rm_so;
601 memcpy (walkbuf, &
string[pos + subs[walk[1] -
'0'].rm_so], tmp);
606 *walkbuf++ = *walk++;
610 if (subs[0].rm_so == subs[0].rm_eo)
612 if (subs[0].rm_so + pos >= string_len)
614 new_l = strlen (buf) + 1;
615 if (new_l + 1 > buf_len)
617 buf_len = buf_len + 2 * new_l;
618 nbuf = g_malloc0 (buf_len + 1);
619 strncpy (nbuf, buf, buf_len);
623 pos += subs[0].rm_eo + 1;
624 buf[new_l - 1] =
string[pos - 1];
629 pos += subs[0].rm_eo;
634 new_l = strlen (buf) + strlen (&
string[pos]);
635 if (new_l + 1 > buf_len)
638 nbuf = g_malloc0 (buf_len + 1);
639 strncpy (nbuf, buf, buf_len);
644 strcat (buf, &
string[pos]);
682 if (pattern == NULL || replace == NULL)
685 "Usage : ereg_replace(string:<string>, pattern:<pat>, "
686 "replace:<replace>, icase:<TRUE|FALSE>\n");
693 string = g_regex_escape_nul (
string, max_size);
695 string = g_strdup (
string);
697 r =
_regreplace (pattern, replace,
string, icase, 1);
702 retc->
size = strlen (r);
739 if (pattern == NULL ||
string == NULL)
742 bzero (subs,
sizeof (subs));
743 bzero (&re,
sizeof (re));
750 rets = g_malloc0 (max_size + 2);
752 string = g_regex_escape_nul (
string, max_size);
754 string = g_strdup (
string);
760 t = strchr (s,
'\n');
767 bzero (&re,
sizeof (re));
768 if (regcomp (&re, pattern, REG_EXTENDED | copt))
771 lexic,
"egrep() : regcomp() failed for pattern '%s'.\n", pattern);
776 if (regexec (&re, s, (
size_t)
NS, subs, 0) == 0)
778 char *rt = strchr (s,
'\n');
800 t = strchr (s,
'\n');
808 if (s == NULL || s[0] ==
'\0')
811#ifdef I_WANT_MANY_DIRTY_ERROR_MESSAGES
822 retc->
size = strlen (rets);
868 if (pattern == NULL ||
string == NULL)
872 string = g_regex_escape_nul (
string, max_size);
874 string = g_strdup (
string);
876 if (regcomp (&re, pattern, REG_EXTENDED | copt))
878 nasl_perror (lexic,
"regmatch() : regcomp() failed for pattern '%s'.\n",
887 if (regexec (&re,
string, (
size_t)
NS, subs, 0) != 0)
894 for (i = 0; i <
NS; i++)
895 if (subs[i].rm_so != -1)
899 v.
v.
v_str.
s_val = (
unsigned char *)
string + subs[i].rm_so;
910 if (regexec (&re, current_pos, (
size_t)
NS, subs, 0) != 0)
916 unsigned int offset = 0, i = 0;
917 for (i = 0; i <
NS; i++)
919 char current_pos_cp[strlen (current_pos) + 1];
921 if (subs[i].rm_so == -1)
925 offset = subs[i].rm_eo;
927 strcpy (current_pos_cp, current_pos);
928 current_pos_cp[subs[i].rm_eo] = 0;
932 (
unsigned char *) current_pos_cp + subs[i].rm_so;
936 current_pos += offset;
953 int sz1, sz2, i1, i2, typ;
961#define MAX_INT (~(1 << (sizeof (int) * 8 - 1)))
969 nasl_perror (lexic,
"Usage: substr(string, idx_start [,idx_end])\n. "
970 "The given string is NULL");
976 "Usage: substr(string, idx_start [,idx_end]). "
977 "At least idx_start must be given to trim the "
994 retc->
x.
str_val = g_malloc0 (sz2 + 1);
995 memcpy (retc->
x.
str_val, s1 + i1, sz2);
1009 int sz1, sz2, sz3, i1, i2;
1019 if (i2 > sz1 || i2 == -1)
1022 if (s1 == NULL || s2 == NULL || i1 < 0 || i2 < 0)
1024 nasl_perror (lexic,
"Usage: insstr(str1, str2, idx_start [,idx_end])\n");
1031 "insstr: cannot insert string2 after end of string1\n");
1040 " insstr: warning! 1st index %d greater than 2nd index %d\n",
1045 sz3 = sz1 + i1 - i2 - 1 + sz2;
1047 s3 = retc->
x.
str_val = g_malloc0 (sz3 + 1);
1052 memcpy (s3, s1, i1);
1055 memcpy (s3, s2, sz2);
1058 memcpy (s3, s1 + i2 + 1, sz1 - 1 - i2);
1071 if (pattern == NULL)
1073 nasl_perror (lexic,
"nasl_match: parameter 'pattern' missing\n");
1078 nasl_perror (lexic,
"nasl_match: parameter 'string' missing\n");
1092 char *p, *str, *sep;
1093 int i, i0, j,
len, sep_len = 0, keep = 1;
1110 sep_len = strlen (sep);
1113 nasl_perror (lexic,
"split: invalid 'seplen' parameter\n");
1123 bzero (&v,
sizeof (v));
1132 if ((p = memmem (str + i,
len - i, sep, sep_len)) == NULL)
1147 i = (p - str) + sep_len;
1155 for (i = i0 = j = 0; i <
len; i++)
1157 if (str[i] ==
'\r' && str[i + 1] ==
'\n')
1168 else if (str[i] ==
'\n')
1226 if (
len < 0 && len2 < 0)
1228 nasl_perror (lexic,
"crap: invalid or missing 'length' argument\n");
1231 if (
len >= 0 && len2 >= 0)
1233 nasl_perror (lexic,
"crap: cannot set both unnamed and named 'length'\n");
1247 nasl_perror (lexic,
"crap: invalid null 'data' parameter\n");
1260 for (i = 0; i <
len - data_len; i += data_len)
1261 memcpy (retc->
x.
str_val + i, data, data_len);
1265 if ((r = (
len % data_len)) > 0)
1268 memcpy (retc->
x.
str_val + (
len - data_len), data, data_len);
1290 if (a == NULL || b == NULL)
1296 c = memmem (a, sz_a, b, sz_b);
1301 retc->
size = sz_a - (c - a);
1332 if (a == NULL || b == NULL)
1334 nasl_perror (lexic,
"stridx(string, substring [, start])\n");
1338 if (start < 0 || start > sz_a)
1340 nasl_perror (lexic,
"stridx(string, substring [, start])\n");
1344 if ((sz_a == start) || (sz_b > sz_a + start))
1347 c = memmem (a + start, sz_a - start, b, sz_b);
1359 char *a, *b, *r, *s, *c;
1360 int sz_a, sz_b, sz_r, count;
1361 int i1, i2, sz2, n, l;
1372 if (a == NULL || b == NULL)
1374 nasl_perror (lexic,
"Missing argument: str_replace(string: s, find: f, "
1375 "replace: r [,count: c])\n");
1381 nasl_perror (lexic,
"str_replace: illegal 'find' argument value\n");
1395 for (i1 = i2 = 0; i1 <= sz_a - sz_b;)
1397 c = memmem (a + i1, sz_a - i1, b, sz_b);
1402 s = g_realloc (s, sz2 + 1);
1406 memcpy (s + i2, a + i1, l);
1411 memcpy (s + i2, r, sz_r);
1416 if (count > 0 && n >= count)
1423 s = g_realloc (s, sz2 + 1);
1425 memcpy (s + i2, a + i1, sz_a - i1);
void nasl_perror(lex_ctxt *lexic, char *msg,...)
int get_var_type_by_num(lex_ctxt *, int)
Returns NASL variable/cell type, VAR2_UNDEF if value is NULL.
struct struct_lex_ctxt lex_ctxt
int get_var_size_by_name(lex_ctxt *, const char *)
int get_var_size_by_num(lex_ctxt *, int)
char * get_str_var_by_name(lex_ctxt *, const char *)
char * get_str_var_by_num(lex_ctxt *, int)
long int get_int_var_by_num(lex_ctxt *, int, int)
long int get_int_var_by_name(lex_ctxt *, const char *, int)
tree_cell * nasl_hex(lex_ctxt *lexic)
tree_cell * nasl_display(lex_ctxt *lexic)
static char * _regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended)
tree_cell * nasl_chomp(lex_ctxt *lexic)
Takes an unnamed string argument and removes any spaces at the end of it. "Space" means white space,...
tree_cell * nasl_strstr(lex_ctxt *lexic)
tree_cell * nasl_split(lex_ctxt *lexic)
tree_cell * nasl_tolower(lex_ctxt *lexic)
tree_cell * nasl_eregmatch(lex_ctxt *lexic)
Does extended regular expression pattern matching.
tree_cell * nasl_insstr(lex_ctxt *lexic)
tree_cell * nasl_substr(lex_ctxt *lexic)
tree_cell * nasl_rawstring(lex_ctxt *lexic)
tree_cell * nasl_egrep(lex_ctxt *lexic)
looks for a pattern in a string, line by line.
tree_cell * nasl_strcat(lex_ctxt *lexic)
tree_cell * nasl_str_replace(lex_ctxt *lexic)
tree_cell * nasl_strlen(lex_ctxt *lexic)
tree_cell * nasl_match(lex_ctxt *lexic)
tree_cell * nasl_string(lex_ctxt *lexic)
tree_cell * nasl_ereg_replace(lex_ctxt *lexic)
Search for a pattern in a string and replace it.
tree_cell * nasl_ord(lex_ctxt *lexic)
tree_cell * nasl_hexstr(lex_ctxt *lexic)
tree_cell * nasl_stridx(lex_ctxt *lexic)
Returns index of a substring.
tree_cell * nasl_ereg(lex_ctxt *lexic)
Matches a string against a regular expression.
tree_cell * nasl_int(lex_ctxt *lexic)
tree_cell * nasl_crap(lex_ctxt *lexic)
tree_cell * nasl_toupper(lex_ctxt *lexic)
tree_cell * alloc_typed_cell(int typ)
void deref_cell(tree_cell *c)
int array_max_index(nasl_array *a)
int add_var_to_list(nasl_array *a, int i, const anon_nasl_var *v)
struct st_a_nasl_var anon_nasl_var
struct st_nasl_array nasl_array
union TC::@332262321161220155002104006201360276211317150140 x
union st_a_nasl_var::@154137074032032170165360023270032033276061363156 v
Define a string struct for storing the response.
int str_match(const gchar *string, const gchar *pattern, int icase)
Matches a string against a pattern.