OpenVAS Scanner 23.32.3
nasl_text_utils.c File Reference

Functions related to text-related utilities in the NASL functions. More...

#include "nasl_text_utils.h"
#include "../misc/strutils.h"
#include "exec.h"
#include "nasl_debug.h"
#include "nasl_func.h"
#include "nasl_global_ctxt.h"
#include "nasl_lex_ctxt.h"
#include "nasl_tree.h"
#include "nasl_var.h"
#include <ctype.h>
#include <glib.h>
#include <regex.h>
#include <string.h>
#include <unistd.h>
Include dependency graph for nasl_text_utils.c:

Go to the source code of this file.

Macros

#define _GNU_SOURCE
#define G_LOG_DOMAIN   "lib nasl"
 GLib logging domain.
#define RAW_STR_LEN   32768
#define NS   16
#define MAX_INT   (~(1 << (sizeof (int) * 8 - 1)))

Functions

tree_cellnasl_string (lex_ctxt *lexic)
tree_cellnasl_rawstring (lex_ctxt *lexic)
tree_cellnasl_strlen (lex_ctxt *lexic)
tree_cellnasl_strcat (lex_ctxt *lexic)
tree_cellnasl_display (lex_ctxt *lexic)
tree_cellnasl_hex (lex_ctxt *lexic)
tree_cellnasl_hexstr (lex_ctxt *lexic)
tree_cellnasl_ord (lex_ctxt *lexic)
tree_cellnasl_tolower (lex_ctxt *lexic)
tree_cellnasl_toupper (lex_ctxt *lexic)
tree_cellnasl_ereg (lex_ctxt *lexic)
 Matches a string against a regular expression.
static char * _regreplace (const char *pattern, const char *replace, const char *string, int icase, int extended)
tree_cellnasl_ereg_replace (lex_ctxt *lexic)
 Search for a pattern in a string and replace it.
tree_cellnasl_egrep (lex_ctxt *lexic)
 looks for a pattern in a string, line by line.
tree_cellnasl_eregmatch (lex_ctxt *lexic)
 Does extended regular expression pattern matching.
tree_cellnasl_substr (lex_ctxt *lexic)
tree_cellnasl_insstr (lex_ctxt *lexic)
tree_cellnasl_match (lex_ctxt *lexic)
tree_cellnasl_split (lex_ctxt *lexic)
tree_cellnasl_chomp (lex_ctxt *lexic)
 Takes an unnamed string argument and removes any spaces at the end of it. "Space" means white space, vertical or horizontal tabulation, carriage return or line feed.
tree_cellnasl_crap (lex_ctxt *lexic)
tree_cellnasl_strstr (lex_ctxt *lexic)
tree_cellnasl_stridx (lex_ctxt *lexic)
 Returns index of a substring.
tree_cellnasl_str_replace (lex_ctxt *lexic)
tree_cellnasl_int (lex_ctxt *lexic)

Detailed Description

Functions related to text-related utilities in the NASL functions.

Definition in file nasl_text_utils.c.

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 12 of file nasl_text_utils.c.

◆ G_LOG_DOMAIN

#define G_LOG_DOMAIN   "lib nasl"

GLib logging domain.

Definition at line 36 of file nasl_text_utils.c.

◆ MAX_INT

#define MAX_INT   (~(1 << (sizeof (int) * 8 - 1)))

Referenced by nasl_substr().

◆ NS

#define NS   16

Definition at line 505 of file nasl_text_utils.c.

Referenced by _regreplace(), nasl_egrep(), and nasl_eregmatch().

◆ RAW_STR_LEN

#define RAW_STR_LEN   32768

Definition at line 134 of file nasl_text_utils.c.

Referenced by nasl_rawstring().

Function Documentation

◆ _regreplace()

char * _regreplace ( const char * pattern,
const char * replace,
const char * string,
int icase,
int extended )
static

Definition at line 511 of file nasl_text_utils.c.

513{
514 regex_t re;
515 regmatch_t subs[NS];
516
517 char *buf, /* buf is where we build the replaced string */
518 *nbuf, /* nbuf is used when we grow the buffer */
519 *walkbuf; /* used to walk buf when replacing backrefs */
520 const char *walk; /* used to walk replacement string for backrefs */
521 int buf_len;
522 int pos, tmp, string_len, new_l;
523 int err, copts = 0;
524
525 string_len = strlen (string);
526
527 if (icase)
528 copts = REG_ICASE;
529 if (extended)
530 copts |= REG_EXTENDED;
531 err = regcomp (&re, pattern, copts);
532 if (err)
533 {
534 return NULL;
535 }
536
537 /* start with a buffer that is twice the size of the stringo
538 we're doing replacements in */
539 buf_len = 2 * string_len;
540 buf = g_malloc0 (buf_len + 1);
541
542 err = pos = 0;
543 buf[0] = '\0';
544
545 while (!err)
546 {
547 err =
548 regexec (&re, &string[pos], (size_t) NS, subs, (pos ? REG_NOTBOL : 0));
549
550 if (err && err != REG_NOMATCH)
551 {
552 g_free (buf);
553 return (NULL);
554 }
555 if (!err)
556 {
557 /* backref replacement is done in two passes:
558 1) find out how long the string will be, and allocate buf
559 2) copy the part before match, replacement and backrefs to buf
560
561 Jaakko Hyv?tti <Jaakko.Hyvatti@iki.fi>
562 */
563
564 new_l = strlen (buf) + subs[0].rm_so; /* part before the match */
565 walk = replace;
566 while (*walk)
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)
570 {
571 new_l += subs[walk[1] - '0'].rm_eo - subs[walk[1] - '0'].rm_so;
572 walk += 2;
573 }
574 else
575 {
576 new_l++;
577 walk++;
578 }
579
580 if (new_l + 1 > buf_len)
581 {
582 buf_len = buf_len + 2 * new_l;
583 nbuf = g_malloc0 (buf_len + 1);
584 strncpy (nbuf, buf, buf_len);
585 g_free (buf);
586 buf = nbuf;
587 }
588 tmp = strlen (buf);
589 /* copy the part of the string before the match */
590 strncat (buf, &string[pos], subs[0].rm_so);
591
592 /* copy replacement and backrefs */
593 walkbuf = &buf[tmp + subs[0].rm_so];
594 walk = replace;
595 while (*walk)
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)
599 {
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);
602 walkbuf += tmp;
603 walk += 2;
604 }
605 else
606 *walkbuf++ = *walk++;
607 *walkbuf = '\0';
608
609 /* and get ready to keep looking for replacements */
610 if (subs[0].rm_so == subs[0].rm_eo)
611 {
612 if (subs[0].rm_so + pos >= string_len)
613 break;
614 new_l = strlen (buf) + 1;
615 if (new_l + 1 > buf_len)
616 {
617 buf_len = buf_len + 2 * new_l;
618 nbuf = g_malloc0 (buf_len + 1);
619 strncpy (nbuf, buf, buf_len);
620 g_free (buf);
621 buf = nbuf;
622 }
623 pos += subs[0].rm_eo + 1;
624 buf[new_l - 1] = string[pos - 1];
625 buf[new_l] = '\0';
626 }
627 else
628 {
629 pos += subs[0].rm_eo;
630 }
631 }
632 else
633 { /* REG_NOMATCH */
634 new_l = strlen (buf) + strlen (&string[pos]);
635 if (new_l + 1 > buf_len)
636 {
637 buf_len = new_l; /* now we know exactly how long it is */
638 nbuf = g_malloc0 (buf_len + 1);
639 strncpy (nbuf, buf, buf_len);
640 g_free (buf);
641 buf = nbuf;
642 }
643 /* stick that last bit of string on our output */
644 strcat (buf, &string[pos]);
645 }
646 }
647
648 buf[new_l] = '\0';
649 regfree (&re);
650 /* whew. */
651 return (buf);
652}
#define NS

References NS.

Referenced by nasl_ereg_replace().

Here is the caller graph for this function:

◆ nasl_chomp()

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, vertical or horizontal tabulation, carriage return or line feed.

Definition at line 1195 of file nasl_text_utils.c.

1196{
1197 tree_cell *retc;
1198 char *str;
1199 int len;
1200
1201 str = get_str_var_by_num (lexic, 0);
1202 if (str == NULL)
1203 return NULL;
1204
1206
1207 g_strchomp (str);
1208 len = strlen (str);
1209
1210 retc->x.str_val = g_malloc0 (len + 1);
1211 retc->size = len;
1212 memcpy (retc->x.str_val, str, len);
1213 return retc;
1214}
char * get_str_var_by_num(lex_ctxt *, int)
Definition nasl_var.c:1108
uint8_t len
tree_cell * alloc_typed_cell(int typ)
Definition nasl_tree.c:25
@ CONST_DATA
Definition nasl_tree.h:82
struct TC tree_cell
int size
Definition nasl_tree.h:99
union TC::@332262321161220155002104006201360276211317150140 x
char * str_val
Definition nasl_tree.h:103

References alloc_typed_cell(), CONST_DATA, get_str_var_by_num(), len, TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_crap()

tree_cell * nasl_crap ( lex_ctxt * lexic)

Definition at line 1218 of file nasl_text_utils.c.

1219{
1220 tree_cell *retc;
1221 char *data = get_str_var_by_name (lexic, "data");
1222 int data_len = -1;
1223 int len = get_int_var_by_name (lexic, "length", -1);
1224 int len2 = get_int_var_by_num (lexic, 0, -1);
1225
1226 if (len < 0 && len2 < 0)
1227 {
1228 nasl_perror (lexic, "crap: invalid or missing 'length' argument\n");
1229 return NULL;
1230 }
1231 if (len >= 0 && len2 >= 0)
1232 {
1233 nasl_perror (lexic, "crap: cannot set both unnamed and named 'length'\n");
1234 return NULL;
1235 }
1236 if (len < 0)
1237 len = len2;
1238
1239 if (len == 0)
1240 return FAKE_CELL;
1241
1242 if (data != NULL)
1243 {
1244 data_len = get_var_size_by_name (lexic, "data");
1245 if (data_len == 0)
1246 {
1247 nasl_perror (lexic, "crap: invalid null 'data' parameter\n");
1248 return NULL;
1249 }
1250 }
1251
1253 retc->x.str_val = g_malloc0 (len + 1);
1254 retc->size = len;
1255 if (data == NULL)
1256 memset (retc->x.str_val, 'X', len);
1257 else
1258 {
1259 int i, r;
1260 for (i = 0; i < len - data_len; i += data_len)
1261 memcpy (retc->x.str_val + i, data, data_len);
1262
1263 if (data_len != 1)
1264 {
1265 if ((r = (len % data_len)) > 0)
1266 memcpy (retc->x.str_val + (len - r), data, r);
1267 else
1268 memcpy (retc->x.str_val + (len - data_len), data, data_len);
1269 }
1270 else
1271 retc->x.str_val[len - 1] = data[0];
1272 }
1273 retc->x.str_val[len] = '\0';
1274 return retc;
1275}
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition nasl_debug.c:105
int get_var_size_by_name(lex_ctxt *, const char *)
Definition nasl_var.c:1138
char * get_str_var_by_name(lex_ctxt *, const char *)
Definition nasl_var.c:1118
long int get_int_var_by_num(lex_ctxt *, int, int)
Definition nasl_var.c:1094
long int get_int_var_by_name(lex_ctxt *, const char *, int)
Definition nasl_var.c:1101
#define FAKE_CELL
Definition nasl_tree.h:110

References alloc_typed_cell(), CONST_DATA, FAKE_CELL, get_int_var_by_name(), get_int_var_by_num(), get_str_var_by_name(), get_var_size_by_name(), len, nasl_perror(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_display()

tree_cell * nasl_display ( lex_ctxt * lexic)

Definition at line 295 of file nasl_text_utils.c.

296{
297 tree_cell *r, *retc;
298 int j;
299 char *msg = NULL;
300 r = nasl_string (lexic);
301
302 msg = g_malloc0 (r->size + 1);
303 for (j = 0; j < r->size; j++)
304 msg[j] =
305 (isprint (r->x.str_val[j]) || isspace (r->x.str_val[j]) ? r->x.str_val[j]
306 : '.');
307
308 g_message ("%s", msg);
309 g_free (msg);
311 retc->x.i_val = r->size;
312 deref_cell (r);
313 return retc;
314}
tree_cell * nasl_string(lex_ctxt *lexic)
void deref_cell(tree_cell *c)
Definition nasl_tree.c:178
@ CONST_INT
Definition nasl_tree.h:79
long int i_val
Definition nasl_tree.h:104

References alloc_typed_cell(), CONST_INT, deref_cell(), TC::i_val, nasl_string(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_egrep()

tree_cell * nasl_egrep ( lex_ctxt * lexic)

looks for a pattern in a string, line by line.

NASL Function: egrep\n
NASL Named Parameters:\n
  • string String to search the pattern in
  • pattern the patern that should be matched
  • icase case insensitive flag
  • rnul replace the null char in the string. Default TRUE.
NASL Returns:\n The concatenation of all lines that match. Null otherwise.
Parameters
[in]lexicLexical context of NASL interpreter.

Definition at line 725 of file nasl_text_utils.c.

726{
727 char *pattern = get_str_var_by_name (lexic, "pattern");
728 char *string = get_str_var_by_name (lexic, "string");
729 int icase = get_int_var_by_name (lexic, "icase", 0);
730 int replace_nul = get_int_var_by_name (lexic, "rnul", 1);
731 tree_cell *retc;
732 regex_t re;
733 regmatch_t subs[NS];
734 char *s, *t;
735 int copt;
736 char *rets;
737 int max_size = get_var_size_by_name (lexic, "string");
738
739 if (pattern == NULL || string == NULL)
740 return NULL;
741
742 bzero (subs, sizeof (subs));
743 bzero (&re, sizeof (re));
744
745 if (icase != 0)
746 copt = REG_ICASE;
747 else
748 copt = 0;
749
750 rets = g_malloc0 (max_size + 2);
751 if (replace_nul)
752 string = g_regex_escape_nul (string, max_size);
753 else
754 string = g_strdup (string);
755
756 s = string;
757 while (s[0] == '\n')
758 s++;
759
760 t = strchr (s, '\n');
761 if (t != NULL)
762 t[0] = '\0';
763
764 if (s[0] != '\0')
765 for (;;)
766 {
767 bzero (&re, sizeof (re));
768 if (regcomp (&re, pattern, REG_EXTENDED | copt))
769 {
771 lexic, "egrep() : regcomp() failed for pattern '%s'.\n", pattern);
772 g_free (rets);
773 return NULL;
774 }
775
776 if (regexec (&re, s, (size_t) NS, subs, 0) == 0)
777 {
778 char *rt = strchr (s, '\n');
779
780 if (rt != NULL)
781 rt[0] = '\0';
782
783 strcat (rets, s);
784 strcat (rets, "\n");
785 if (rt != NULL)
786 rt[0] = '\n';
787 }
788
789 regfree (&re);
790
791 if (t == NULL)
792 s = NULL;
793 else
794 s = &(t[1]);
795
796 if (s != NULL)
797 {
798 while (s[0] == '\n')
799 s++; /* Skip empty lines */
800 t = strchr (s, '\n');
801 }
802 else
803 t = NULL;
804
805 if (t != NULL)
806 t[0] = '\0';
807
808 if (s == NULL || s[0] == '\0')
809 break;
810 }
811#ifdef I_WANT_MANY_DIRTY_ERROR_MESSAGES
812 if (rets[0] == '\0')
813 {
814 g_free (rets);
815 g_free (string);
816 return FAKE_CELL;
817 }
818#endif
819 g_free (string);
820
822 retc->size = strlen (rets);
823 retc->x.str_val = rets;
824
825 return retc;
826}
Define a string struct for storing the response.

References alloc_typed_cell(), CONST_DATA, FAKE_CELL, get_int_var_by_name(), get_str_var_by_name(), get_var_size_by_name(), nasl_perror(), NS, TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_ereg()

tree_cell * nasl_ereg ( lex_ctxt * lexic)

Matches a string against a regular expression.

NASL Function: egrep\n
NASL Named Parameters:\n
  • string String to search the pattern in
  • pattern the patern that should be matched
  • icase case insensitive flag
  • rnul replace the null char in the string. Default TRUE.
  • multiline Is FALSE by default (string is truncated at the first “end of line”), and can be set to TRUE for multiline search.
NASL Returns:\n The first found pattern.
Parameters
[in]lexicLexical context of NASL interpreter.

Definition at line 449 of file nasl_text_utils.c.

450{
451 char *pattern = get_str_var_by_name (lexic, "pattern");
452 char *string = get_str_var_by_name (lexic, "string");
453 int icase = get_int_var_by_name (lexic, "icase", 0);
454 int multiline = get_int_var_by_name (lexic, "multiline", 0);
455 int replace_nul = get_int_var_by_name (lexic, "rnul", 1);
456 int max_size = get_var_size_by_name (lexic, "string");
457 char *s;
458 int copt = 0;
459 tree_cell *retc;
460 regex_t re;
461
462 if (icase != 0)
463 copt = REG_ICASE;
464
465 if (pattern == NULL || string == NULL)
466 return NULL;
467
468 if (regcomp (&re, pattern, REG_EXTENDED | REG_NOSUB | copt))
469 {
470 nasl_perror (lexic, "ereg() : regcomp() failed for pattern '%s'.\n",
471 pattern);
472 return NULL;
473 }
474
476
477 if (replace_nul)
478 string = g_regex_escape_nul (string, max_size);
479 else
480 string = g_strdup (string);
481
482 if (multiline)
483 s = NULL;
484 else
485 s = strchr (string, '\n');
486 if (s != NULL)
487 s[0] = '\0';
488 if (s != string)
489 {
490 if (regexec (&re, string, 0, NULL, 0) == 0)
491 retc->x.i_val = 1;
492 else
493 retc->x.i_val = 0;
494 }
495 else
496 retc->x.i_val = 0;
497
498 g_free (string);
499 regfree (&re);
500 return retc;
501}

References alloc_typed_cell(), CONST_INT, get_int_var_by_name(), get_str_var_by_name(), get_var_size_by_name(), TC::i_val, nasl_perror(), and TC::x.

Here is the call graph for this function:

◆ nasl_ereg_replace()

tree_cell * nasl_ereg_replace ( lex_ctxt * lexic)

Search for a pattern in a string and replace it.

NASL Function: ereg_replace\n
NASL Named Parameters:\n
  • string String to search the pattern in
  • pattern patern to search in the string for
  • replace string to replace the pattern with
  • icase case insensitive flag
  • rnul replace the null char in the string. Default TRUE.
NASL Returns:\n The new string with the pattern replaced with replace
Parameters
[in]lexicLexical context of NASL interpreter.

Definition at line 670 of file nasl_text_utils.c.

671{
672 char *pattern = get_str_var_by_name (lexic, "pattern");
673 char *replace = get_str_var_by_name (lexic, "replace");
674 char *string = get_str_var_by_name (lexic, "string");
675 int icase = get_int_var_by_name (lexic, "icase", 0);
676 int replace_nul = get_int_var_by_name (lexic, "rnul", 1);
677 int max_size = get_var_size_by_name (lexic, "string");
678
679 char *r;
680 tree_cell *retc;
681
682 if (pattern == NULL || replace == NULL)
683 {
684 nasl_perror (lexic,
685 "Usage : ereg_replace(string:<string>, pattern:<pat>, "
686 "replace:<replace>, icase:<TRUE|FALSE>\n");
687 return NULL;
688 }
689 if (string == NULL)
690 return NULL;
691
692 if (replace_nul)
693 string = g_regex_escape_nul (string, max_size);
694 else
695 string = g_strdup (string);
696
697 r = _regreplace (pattern, replace, string, icase, 1);
698 if (r == NULL)
699 return FAKE_CELL;
700
702 retc->size = strlen (r);
703 retc->x.str_val = r;
704
705 return retc;
706}
static char * _regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended)

References _regreplace(), alloc_typed_cell(), CONST_DATA, FAKE_CELL, get_int_var_by_name(), get_str_var_by_name(), get_var_size_by_name(), nasl_perror(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_eregmatch()

tree_cell * nasl_eregmatch ( lex_ctxt * lexic)

Does extended regular expression pattern matching.

NASL Function: eregmatch\n
NASL Unnamed Parameters:\n
  • pattern An regex pattern
  • string A string
  • icase Boolean, for case sensitve
  • find_all Boolean, to find all matches
  • rnul replace the null char in the string. Default TRUE.
NASL Returns:\n An array with the first match (find_all: False)
or an array with all matches (find_all: TRUE). NULL or empty if no match was found.
Parameters
[in]lexicLexical context of NASL interpreter.

Definition at line 850 of file nasl_text_utils.c.

851{
852 char *pattern = get_str_var_by_name (lexic, "pattern");
853 char *string = get_str_var_by_name (lexic, "string");
854 int icase = get_int_var_by_name (lexic, "icase", 0);
855 int find_all = get_int_var_by_name (lexic, "find_all", 0);
856 int replace_nul = get_int_var_by_name (lexic, "rnul", 1);
857 int max_size = get_var_size_by_name (lexic, "string");
858 int copt = 0;
859 tree_cell *retc;
860 regex_t re;
861 regmatch_t subs[NS];
863 nasl_array *a;
864
865 if (icase != 0)
866 copt = REG_ICASE;
867
868 if (pattern == NULL || string == NULL)
869 return NULL;
870
871 if (replace_nul)
872 string = g_regex_escape_nul (string, max_size);
873 else
874 string = g_strdup (string);
875
876 if (regcomp (&re, pattern, REG_EXTENDED | copt))
877 {
878 nasl_perror (lexic, "regmatch() : regcomp() failed for pattern '%s'.\n",
879 pattern);
880 return NULL;
881 }
883 retc->x.ref_val = a = g_malloc0 (sizeof (nasl_array));
884
885 if (find_all == 0)
886 {
887 if (regexec (&re, string, (size_t) NS, subs, 0) != 0)
888 {
889 regfree (&re);
890 return NULL;
891 }
892
893 int i;
894 for (i = 0; i < NS; i++)
895 if (subs[i].rm_so != -1)
896 {
898 v.v.v_str.s_siz = subs[i].rm_eo - subs[i].rm_so;
899 v.v.v_str.s_val = (unsigned char *) string + subs[i].rm_so;
900 (void) add_var_to_list (a, i, &v);
901 }
902 }
903 else
904 {
905 int index = 0;
906 char *current_pos;
907 current_pos = string;
908 while (1)
909 {
910 if (regexec (&re, current_pos, (size_t) NS, subs, 0) != 0)
911 {
912 regfree (&re);
913 break;
914 }
915
916 unsigned int offset = 0, i = 0;
917 for (i = 0; i < NS; i++)
918 {
919 char current_pos_cp[strlen (current_pos) + 1];
920
921 if (subs[i].rm_so == -1)
922 break;
923
924 if (i == 0)
925 offset = subs[i].rm_eo;
926
927 strcpy (current_pos_cp, current_pos);
928 current_pos_cp[subs[i].rm_eo] = 0;
930 v.v.v_str.s_siz = subs[i].rm_eo - subs[i].rm_so;
931 v.v.v_str.s_val =
932 (unsigned char *) current_pos_cp + subs[i].rm_so;
933 (void) add_var_to_list (a, index, &v);
934 index++;
935 }
936 current_pos += offset;
937 }
938 }
939
940 regfree (&re);
941 return retc;
942}
@ DYN_ARRAY
Definition nasl_tree.h:90
int add_var_to_list(nasl_array *a, int i, const anon_nasl_var *v)
Definition nasl_var.c:1245
struct st_a_nasl_var anon_nasl_var
struct st_nasl_array nasl_array
@ VAR2_DATA
Definition nasl_var.h:18
void * ref_val
Definition nasl_tree.h:105
nasl_string_t v_str
Definition nasl_var.h:47
union st_a_nasl_var::@154137074032032170165360023270032033276061363156 v
unsigned char * s_val
Definition nasl_var.h:26

References add_var_to_list(), alloc_typed_cell(), DYN_ARRAY, get_int_var_by_name(), get_str_var_by_name(), get_var_size_by_name(), nasl_perror(), NS, TC::ref_val, st_nasl_string::s_siz, st_nasl_string::s_val, st_a_nasl_var::v, st_a_nasl_var::v_str, VAR2_DATA, st_a_nasl_var::var_type, and TC::x.

Here is the call graph for this function:

◆ nasl_hex()

tree_cell * nasl_hex ( lex_ctxt * lexic)

Definition at line 319 of file nasl_text_utils.c.

320{
321 tree_cell *retc;
322 int v = get_int_var_by_num (lexic, 0, -1);
323 char ret[7];
324
325 if (v == -1)
326 return NULL;
327
328 snprintf (ret, sizeof (ret), "0x%02x", (unsigned char) v);
330 retc->size = strlen (ret);
331 retc->x.str_val = g_strdup (ret);
332
333 return retc;
334}
@ CONST_STR
Definition nasl_tree.h:80

References alloc_typed_cell(), CONST_STR, get_int_var_by_num(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_hexstr()

tree_cell * nasl_hexstr ( lex_ctxt * lexic)

Definition at line 339 of file nasl_text_utils.c.

340{
341 tree_cell *retc;
342 char *s = get_str_var_by_num (lexic, 0);
343 int len = get_var_size_by_num (lexic, 0);
344 char *ret;
345 int i;
346
347 if (s == NULL)
348 return NULL;
349
350 ret = g_malloc0 (len * 2 + 1);
351 for (i = 0; i < len; i++)
352 {
353 /* if i < len there are at least three chars left in ret + 2 * i */
354 snprintf (ret + 2 * i, 3, "%02x", (unsigned char) s[i]);
355 }
356
358 retc->size = strlen (ret);
359 retc->x.str_val = ret;
360
361 return retc;
362}
int get_var_size_by_num(lex_ctxt *, int)
Definition nasl_var.c:1145

References alloc_typed_cell(), CONST_STR, get_str_var_by_num(), get_var_size_by_num(), len, TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_insstr()

tree_cell * nasl_insstr ( lex_ctxt * lexic)

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!

Definition at line 1006 of file nasl_text_utils.c.

1007{
1008 char *s1, *s2, *s3;
1009 int sz1, sz2, sz3, i1, i2;
1010 tree_cell *retc;
1011
1012 s1 = get_str_var_by_num (lexic, 0);
1013 sz1 = get_var_size_by_num (lexic, 0);
1014 s2 = get_str_var_by_num (lexic, 1);
1015 sz2 = get_var_size_by_num (lexic, 1);
1016
1017 i1 = get_int_var_by_num (lexic, 2, -1);
1018 i2 = get_int_var_by_num (lexic, 3, -1);
1019 if (i2 > sz1 || i2 == -1)
1020 i2 = sz1 - 1;
1021
1022 if (s1 == NULL || s2 == NULL || i1 < 0 || i2 < 0)
1023 {
1024 nasl_perror (lexic, "Usage: insstr(str1, str2, idx_start [,idx_end])\n");
1025 return NULL;
1026 }
1027
1028 if (i1 >= sz1)
1029 {
1030 nasl_perror (lexic,
1031 "insstr: cannot insert string2 after end of string1\n");
1032 return NULL;
1033 }
1034
1036
1037 if (i1 > i2)
1038 {
1039 nasl_perror (lexic,
1040 " insstr: warning! 1st index %d greater than 2nd index %d\n",
1041 i1, i2);
1042 sz3 = sz2;
1043 }
1044 else
1045 sz3 = sz1 + i1 - i2 - 1 + sz2;
1046
1047 s3 = retc->x.str_val = g_malloc0 (sz3 + 1);
1048 retc->size = sz3;
1049
1050 if (i1 <= sz1)
1051 {
1052 memcpy (s3, s1, i1);
1053 s3 += i1;
1054 }
1055 memcpy (s3, s2, sz2);
1056 s3 += sz2;
1057 if (i2 < sz1 - 1)
1058 memcpy (s3, s1 + i2 + 1, sz1 - 1 - i2);
1059
1060 return retc;
1061}

References alloc_typed_cell(), CONST_DATA, get_int_var_by_num(), get_str_var_by_num(), get_var_size_by_num(), nasl_perror(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_int()

tree_cell * nasl_int ( lex_ctxt * lexic)

Definition at line 1435 of file nasl_text_utils.c.

1436{
1437 long int r = get_int_var_by_num (lexic, 0, 0);
1438 tree_cell *retc;
1439
1440 retc = alloc_typed_cell (CONST_INT);
1441 retc->x.i_val = r;
1442
1443 return retc;
1444}

References alloc_typed_cell(), CONST_INT, get_int_var_by_num(), TC::i_val, and TC::x.

Here is the call graph for this function:

◆ nasl_match()

tree_cell * nasl_match ( lex_ctxt * lexic)

Definition at line 1064 of file nasl_text_utils.c.

1065{
1066 char *pattern = get_str_var_by_name (lexic, "pattern");
1067 char *string = get_str_var_by_name (lexic, "string");
1068 int icase = get_int_var_by_name (lexic, "icase", 0);
1069 tree_cell *retc;
1070
1071 if (pattern == NULL)
1072 {
1073 nasl_perror (lexic, "nasl_match: parameter 'pattern' missing\n");
1074 return NULL;
1075 }
1076 if (string == NULL)
1077 {
1078 nasl_perror (lexic, "nasl_match: parameter 'string' missing\n");
1079 return NULL;
1080 }
1081
1082 retc = alloc_typed_cell (CONST_INT);
1083 retc->x.i_val = str_match (string, pattern, icase);
1084 return retc;
1085}
int str_match(const gchar *string, const gchar *pattern, int icase)
Matches a string against a pattern.
Definition strutils.c:22

References alloc_typed_cell(), CONST_INT, get_int_var_by_name(), get_str_var_by_name(), TC::i_val, nasl_perror(), str_match(), and TC::x.

Here is the call graph for this function:

◆ nasl_ord()

tree_cell * nasl_ord ( lex_ctxt * lexic)

Definition at line 366 of file nasl_text_utils.c.

367{
368 tree_cell *retc;
369 unsigned char *val = (unsigned char *) get_str_var_by_num (lexic, 0);
370
371 if (val == NULL)
372 {
373 nasl_perror (lexic, "Usage : ord(char). The given char or string "
374 "is NULL\n");
375 return NULL;
376 }
377
379 retc->x.i_val = val[0];
380 return retc;
381}
const char * val
Definition nasl_init.c:440

References alloc_typed_cell(), CONST_INT, get_str_var_by_num(), TC::i_val, nasl_perror(), val, and TC::x.

Here is the call graph for this function:

◆ nasl_rawstring()

tree_cell * nasl_rawstring ( lex_ctxt * lexic)

Definition at line 136 of file nasl_text_utils.c.

137{
138 tree_cell *retc;
139 int vi, vn, i, j, x;
140 int sz, typ;
141 const char *s;
142 int total_len = 0;
143
145 retc->size = 0;
146 retc->x.str_val = g_malloc0 (RAW_STR_LEN + 1);
147
148 vn = array_max_index (&lexic->ctx_vars);
149 for (vi = 0; vi < vn && total_len < RAW_STR_LEN - 1; vi++)
150 {
151 if ((typ = get_var_type_by_num (lexic, vi)) == VAR2_UNDEF)
152 continue;
153 sz = get_var_size_by_num (lexic, vi);
154
155 if (typ == VAR2_INT)
156 {
157 x = get_int_var_by_num (lexic, vi, 0);
158 retc->x.str_val[total_len++] = x;
159 }
160 else
161 {
162 int current_len;
163 char str[RAW_STR_LEN];
164
165 s = get_str_var_by_num (lexic, vi);
166 if (!s)
167 continue;
168 if (sz <= 0)
169 sz = strlen (s);
170
171 if (sz >= RAW_STR_LEN)
172 {
173 nasl_perror (lexic, "Error. Too long argument in raw_string()\n");
174 break;
175 }
176
177 /* Should we test if the variable is composed only of digits? */
178 if (typ == VAR2_STRING)
179 {
180 /* TBD:I should decide at last if we keep those "purified"
181 * string or not, and if we do, if "CONST_STR" & "VAR2_STR" are
182 * "not pure" strings */
183 for (i = 0, j = 0; i < sz; i++)
184 {
185 if (s[i] == '\\')
186 {
187 if (s[i + 1] == 'n')
188 {
189 str[j++] = '\n';
190 i++;
191 }
192 else if (s[i + 1] == 't')
193 {
194 str[j++] = '\t';
195 i++;
196 }
197 else if (s[i + 1] == 'r')
198 {
199 str[j++] = '\r';
200 i++;
201 }
202 else if (s[i + 1] == 'x' && isxdigit (s[i + 2])
203 && isxdigit (s[i + 3]))
204 {
205 if (isdigit (s[i + 2]))
206 x = (s[i + 2] - '0') * 16;
207 else
208 x = (10 + tolower (s[i + 2]) - 'a') * 16;
209 if (isdigit (s[i + 3]))
210 x += s[i + 3] - '0';
211 else
212 x += tolower (s[i + 3]) + 10 - 'a';
213 str[j++] = x;
214 i += 3;
215 }
216 else if (s[i + 1] == '\\')
217 {
218 str[j++] = s[i];
219 i++;
220 }
221 else
222 i++;
223 }
224 else
225 str[j++] = s[i];
226 }
227 current_len = j;
228 }
229 else
230 {
231 memcpy (str, s, sz);
232 str[sz] = '\0';
233 current_len = sz;
234 }
235
236 if (total_len + current_len > RAW_STR_LEN)
237 {
238 nasl_perror (lexic, "Error. Too long argument in raw_string()\n");
239 break;
240 }
241 bcopy (str, retc->x.str_val + total_len, current_len);
242 total_len += current_len;
243 }
244 }
245
246 retc->size = total_len;
247 return retc;
248}
int get_var_type_by_num(lex_ctxt *, int)
Returns NASL variable/cell type, VAR2_UNDEF if value is NULL.
Definition nasl_var.c:1155
#define RAW_STR_LEN
int array_max_index(nasl_array *a)
Definition nasl_var.c:1302
@ VAR2_STRING
Definition nasl_var.h:17
@ VAR2_INT
Definition nasl_var.h:16
@ VAR2_UNDEF
Definition nasl_var.h:15
nasl_array ctx_vars

References alloc_typed_cell(), array_max_index(), CONST_DATA, struct_lex_ctxt::ctx_vars, get_int_var_by_num(), get_str_var_by_num(), get_var_size_by_num(), get_var_type_by_num(), nasl_perror(), RAW_STR_LEN, TC::size, TC::str_val, VAR2_INT, VAR2_STRING, VAR2_UNDEF, and TC::x.

Here is the call graph for this function:

◆ nasl_split()

tree_cell * nasl_split ( lex_ctxt * lexic)

Definition at line 1088 of file nasl_text_utils.c.

1089{
1090 tree_cell *retc;
1091 nasl_array *a;
1092 char *p, *str, *sep;
1093 int i, i0, j, len, sep_len = 0, keep = 1;
1094 anon_nasl_var v;
1095
1096 str = get_str_var_by_num (lexic, 0);
1097 if (str == NULL)
1098 return NULL;
1099 len = get_var_size_by_num (lexic, 0);
1100 if (len <= 0)
1101 len = strlen (str);
1102 if (len <= 0)
1103 return NULL;
1104
1105 sep = get_str_var_by_name (lexic, "sep");
1106 if (sep != NULL)
1107 {
1108 sep_len = get_var_size_by_name (lexic, "sep");
1109 if (sep_len <= 0)
1110 sep_len = strlen (sep);
1111 if (sep_len <= 0)
1112 {
1113 nasl_perror (lexic, "split: invalid 'seplen' parameter\n");
1114 return NULL;
1115 }
1116 }
1117
1118 keep = get_int_var_by_name (lexic, "keep", 1);
1119
1120 retc = alloc_typed_cell (DYN_ARRAY);
1121 retc->x.ref_val = a = g_malloc0 (sizeof (nasl_array));
1122
1123 bzero (&v, sizeof (v));
1124 v.var_type = VAR2_DATA;
1125
1126 if (sep != NULL)
1127 {
1128 i = 0;
1129 j = 0;
1130 for (;;)
1131 {
1132 if ((p = memmem (str + i, len - i, sep, sep_len)) == NULL)
1133 {
1134 v.v.v_str.s_siz = len - i;
1135 v.v.v_str.s_val = (unsigned char *) str + i;
1136 (void) add_var_to_list (a, j++, &v);
1137 return retc;
1138 }
1139 else
1140 {
1141 if (keep)
1142 v.v.v_str.s_siz = (p - (str + i)) + sep_len;
1143 else
1144 v.v.v_str.s_siz = p - (str + i);
1145 v.v.v_str.s_val = (unsigned char *) str + i;
1146 (void) add_var_to_list (a, j++, &v);
1147 i = (p - str) + sep_len;
1148 if (i >= len)
1149 return retc;
1150 }
1151 }
1152 }
1153
1154 /* Otherwise, we detect the end of line. A little more subtle. */
1155 for (i = i0 = j = 0; i < len; i++)
1156 {
1157 if (str[i] == '\r' && str[i + 1] == '\n')
1158 {
1159 i++;
1160 if (keep)
1161 v.v.v_str.s_siz = i - i0 + 1;
1162 else
1163 v.v.v_str.s_siz = i - i0 - 1;
1164 v.v.v_str.s_val = (unsigned char *) str + i0;
1165 i0 = i + 1;
1166 (void) add_var_to_list (a, j++, &v);
1167 }
1168 else if (str[i] == '\n')
1169 {
1170 if (keep)
1171 v.v.v_str.s_siz = i - i0 + 1;
1172 else
1173 v.v.v_str.s_siz = i - i0;
1174 v.v.v_str.s_val = (unsigned char *) str + i0;
1175 i0 = i + 1;
1176 (void) add_var_to_list (a, j++, &v);
1177 }
1178 }
1179
1180 if (i > i0)
1181 {
1182 v.v.v_str.s_siz = i - i0;
1183 v.v.v_str.s_val = (unsigned char *) str + i0;
1184 (void) add_var_to_list (a, j++, &v);
1185 }
1186 return retc;
1187}

References add_var_to_list(), alloc_typed_cell(), DYN_ARRAY, get_int_var_by_name(), get_str_var_by_name(), get_str_var_by_num(), get_var_size_by_name(), get_var_size_by_num(), len, nasl_perror(), TC::ref_val, st_nasl_string::s_siz, st_nasl_string::s_val, st_a_nasl_var::v, st_a_nasl_var::v_str, VAR2_DATA, st_a_nasl_var::var_type, and TC::x.

Here is the call graph for this function:

◆ nasl_str_replace()

tree_cell * nasl_str_replace ( lex_ctxt * lexic)

str_replace(string: s, find: f, replace: r [,count: n])

Definition at line 1357 of file nasl_text_utils.c.

1358{
1359 char *a, *b, *r, *s, *c;
1360 int sz_a, sz_b, sz_r, count;
1361 int i1, i2, sz2, n, l;
1362 tree_cell *retc = NULL;
1363
1364 a = get_str_var_by_name (lexic, "string");
1365 b = get_str_var_by_name (lexic, "find");
1366 r = get_str_var_by_name (lexic, "replace");
1367 sz_a = get_var_size_by_name (lexic, "string");
1368 sz_b = get_var_size_by_name (lexic, "find");
1369 sz_r = get_var_size_by_name (lexic, "replace");
1370 count = get_int_var_by_name (lexic, "count", 0);
1371
1372 if (a == NULL || b == NULL)
1373 {
1374 nasl_perror (lexic, "Missing argument: str_replace(string: s, find: f, "
1375 "replace: r [,count: c])\n");
1376 return NULL;
1377 }
1378
1379 if (sz_b == 0)
1380 {
1381 nasl_perror (lexic, "str_replace: illegal 'find' argument value\n");
1382 return NULL;
1383 }
1384
1385 if (r == NULL)
1386 {
1387 r = "";
1388 sz_r = 0;
1389 }
1390
1392 s = g_malloc0 (1);
1393 sz2 = 0;
1394 n = 0;
1395 for (i1 = i2 = 0; i1 <= sz_a - sz_b;)
1396 {
1397 c = memmem (a + i1, sz_a - i1, b, sz_b);
1398 if (c == NULL)
1399 break;
1400 l = (c - a) - i1;
1401 sz2 += sz_r + l;
1402 s = g_realloc (s, sz2 + 1);
1403 s[sz2] = '\0';
1404 if (c - a > i1)
1405 {
1406 memcpy (s + i2, a + i1, l);
1407 i2 += l;
1408 }
1409 if (sz_r > 0)
1410 {
1411 memcpy (s + i2, r, sz_r);
1412 i2 += sz_r;
1413 }
1414 i1 += l + sz_b;
1415 n++;
1416 if (count > 0 && n >= count)
1417 break;
1418 }
1419
1420 if (i1 < sz_a)
1421 {
1422 sz2 += (sz_a - i1);
1423 s = g_realloc (s, sz2 + 1);
1424 s[sz2] = '\0';
1425 memcpy (s + i2, a + i1, sz_a - i1);
1426 }
1427
1428 retc->x.str_val = s;
1429 retc->size = sz2;
1430 return retc;
1431}

References alloc_typed_cell(), CONST_DATA, get_int_var_by_name(), get_str_var_by_name(), get_var_size_by_name(), nasl_perror(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_strcat()

tree_cell * nasl_strcat ( lex_ctxt * lexic)

Definition at line 263 of file nasl_text_utils.c.

264{
265 tree_cell *retc;
266 char *s;
267 int vi, vn, newlen;
268 int sz;
269
271 retc->size = 0;
272 retc->x.str_val = g_malloc0 (1);
273
274 vn = array_max_index (&lexic->ctx_vars);
275 for (vi = 0; vi < vn; vi++)
276 {
277 s = get_str_var_by_num (lexic, vi);
278 if (s == NULL)
279 continue;
280 sz = get_var_size_by_num (lexic, vi);
281 if (sz <= 0)
282 sz = strlen (s);
283
284 newlen = retc->size + sz;
285 retc->x.str_val = g_realloc (retc->x.str_val, newlen + 1);
286 memcpy (retc->x.str_val + retc->size, s, sz);
287 retc->size = newlen;
288 }
289 retc->x.str_val[retc->size] = '\0';
290 return retc;
291}

References alloc_typed_cell(), array_max_index(), CONST_DATA, struct_lex_ctxt::ctx_vars, get_str_var_by_num(), get_var_size_by_num(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_stridx()

tree_cell * nasl_stridx ( lex_ctxt * lexic)

Returns index of a substring.

Returning NULL for "not found" is dangerous as automatic conversion to to integer would change it into 0. So we return (-1).

Returns
-1 if string not found, otherwise index of substring.
See also
strstr

Definition at line 1321 of file nasl_text_utils.c.

1322{
1323 char *a = get_str_var_by_num (lexic, 0);
1324 int sz_a = get_var_size_by_num (lexic, 0);
1325 char *b = get_str_var_by_num (lexic, 1);
1326 int sz_b = get_var_size_by_num (lexic, 1);
1327 char *c;
1328 int start = get_int_var_by_num (lexic, 2, 0);
1330
1331 retc->x.i_val = -1;
1332 if (a == NULL || b == NULL)
1333 {
1334 nasl_perror (lexic, "stridx(string, substring [, start])\n");
1335 return retc;
1336 }
1337
1338 if (start < 0 || start > sz_a)
1339 {
1340 nasl_perror (lexic, "stridx(string, substring [, start])\n");
1341 return retc;
1342 }
1343
1344 if ((sz_a == start) || (sz_b > sz_a + start))
1345 return retc;
1346
1347 c = memmem (a + start, sz_a - start, b, sz_b);
1348 if (c != NULL)
1349 retc->x.i_val = c - a;
1350 return retc;
1351}

References alloc_typed_cell(), CONST_INT, get_int_var_by_num(), get_str_var_by_num(), get_var_size_by_num(), TC::i_val, nasl_perror(), and TC::x.

Here is the call graph for this function:

◆ nasl_string()

tree_cell * nasl_string ( lex_ctxt * lexic)

Definition at line 39 of file nasl_text_utils.c.

40{
41 tree_cell *retc;
42 int vi, vn, newlen;
43 int sz, typ;
44 const char *s, *p1;
45 char *p2;
46
48 retc->size = 0;
49 retc->x.str_val = g_malloc0 (1);
50
51 vn = array_max_index (&lexic->ctx_vars);
52 for (vi = 0; vi < vn; vi++)
53 {
54 if ((typ = get_var_type_by_num (lexic, vi)) == VAR2_UNDEF)
55 continue;
56 s = get_str_var_by_num (lexic, vi);
57 if (!s)
58 continue;
59 sz = get_var_size_by_num (lexic, vi);
60 if (sz <= 0)
61 sz = strlen (s);
62
63 newlen = retc->size + sz;
64 retc->x.str_val = g_realloc (retc->x.str_val, newlen + 1);
65 p2 = retc->x.str_val + retc->size;
66 p1 = s;
67 retc->size = newlen;
68 if (typ != VAR2_STRING)
69 {
70 memcpy (p2, p1, sz);
71 p2[sz] = '\0';
72 }
73 else
74 while (*p1 != '\0')
75 {
76 if (*p1 == '\\' && p1[1] != '\0')
77 {
78 switch (p1[1])
79 {
80 case 'n':
81 *p2++ = '\n';
82 break;
83 case 't':
84 *p2++ = '\t';
85 break;
86 case 'r':
87 *p2++ = '\r';
88 break;
89 case '\\':
90 *p2++ = '\\';
91 break;
92 case 'x':
93 if (isxdigit (p1[2]) && isxdigit (p1[3]))
94 {
95 *p2++ =
96 16
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');
101 p1 += 2;
102 retc->size -= 2;
103 }
104 else
105 {
106 nasl_perror (lexic,
107 "Buggy hex value '\\x%c%c' skipped\n",
108 isprint (p1[2]) ? p1[2] : '.',
109 isprint (p1[3]) ? p1[3] : '.');
110 /* We do not increment p1 by 4,
111 we may miss the end of the string */
112 }
113 break;
114 default:
115 nasl_perror (lexic,
116 "Unknown escape sequence '\\%c' in the "
117 "string '%s'\n",
118 isprint (p1[1]) ? p1[1] : '.', s);
119 retc->size--;
120 break;
121 }
122 p1 += 2;
123 retc->size--;
124 }
125 else
126 *p2++ = *p1++;
127 }
128 }
129 retc->x.str_val[retc->size] = '\0';
130 return retc;
131}

References alloc_typed_cell(), array_max_index(), CONST_DATA, struct_lex_ctxt::ctx_vars, get_str_var_by_num(), get_var_size_by_num(), get_var_type_by_num(), nasl_perror(), TC::size, TC::str_val, VAR2_STRING, VAR2_UNDEF, and TC::x.

Referenced by nasl_display().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ nasl_strlen()

tree_cell * nasl_strlen ( lex_ctxt * lexic)

Definition at line 252 of file nasl_text_utils.c.

253{
254 int len = get_var_size_by_num (lexic, 0);
255 tree_cell *retc;
256
258 retc->x.i_val = len;
259 return retc;
260}

References alloc_typed_cell(), CONST_INT, get_var_size_by_num(), TC::i_val, len, and TC::x.

Here is the call graph for this function:

◆ nasl_strstr()

tree_cell * nasl_strstr ( lex_ctxt * lexic)

Definition at line 1280 of file nasl_text_utils.c.

1281{
1282 char *a = get_str_var_by_num (lexic, 0);
1283 char *b = get_str_var_by_num (lexic, 1);
1284 int sz_a = get_var_size_by_num (lexic, 0);
1285 int sz_b = get_var_size_by_num (lexic, 1);
1286
1287 char *c;
1288 tree_cell *retc;
1289
1290 if (a == NULL || b == NULL)
1291 return NULL;
1292
1293 if (sz_b > sz_a)
1294 return NULL;
1295
1296 c = memmem (a, sz_a, b, sz_b);
1297 if (c == NULL)
1298 return FAKE_CELL;
1299
1301 retc->size = sz_a - (c - a);
1302
1303 retc->x.str_val = g_malloc0 (retc->size + 1);
1304 memcpy (retc->x.str_val, c, retc->size + 1);
1305
1306 return retc;
1307}

References alloc_typed_cell(), CONST_DATA, FAKE_CELL, get_str_var_by_num(), get_var_size_by_num(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_substr()

tree_cell * nasl_substr ( lex_ctxt * lexic)

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)

Definition at line 950 of file nasl_text_utils.c.

951{
952 char *s1;
953 int sz1, sz2, i1, i2, typ;
954 tree_cell *retc;
955
956 s1 = get_str_var_by_num (lexic, 0);
957 sz1 = get_var_size_by_num (lexic, 0);
958 typ = get_var_type_by_num (lexic, 0);
959 i1 = get_int_var_by_num (lexic, 1, -1);
960#ifndef MAX_INT
961#define MAX_INT (~(1 << (sizeof (int) * 8 - 1)))
962#endif
963 i2 = get_int_var_by_num (lexic, 2, MAX_INT);
964 if (i2 >= sz1)
965 i2 = sz1 - 1;
966
967 if (s1 == NULL)
968 {
969 nasl_perror (lexic, "Usage: substr(string, idx_start [,idx_end])\n. "
970 "The given string is NULL");
971 return NULL;
972 }
973 if (i1 < 0)
974 {
975 nasl_perror (lexic,
976 "Usage: substr(string, idx_start [,idx_end]). "
977 "At least idx_start must be given to trim the "
978 "string '%s'.\n",
979 s1);
980 return NULL;
981 }
982
984 if (typ == CONST_STR)
985 retc->type = CONST_STR;
986 if (i1 > i2)
987 {
988 retc->x.str_val = g_malloc0 (1);
989 retc->size = 0;
990 return retc;
991 }
992 sz2 = i2 - i1 + 1;
993 retc->size = sz2;
994 retc->x.str_val = g_malloc0 (sz2 + 1);
995 memcpy (retc->x.str_val, s1 + i1, sz2);
996 return retc;
997}
#define MAX_INT
short type
Definition nasl_tree.h:95

References alloc_typed_cell(), CONST_DATA, CONST_STR, get_int_var_by_num(), get_str_var_by_num(), get_var_size_by_num(), get_var_type_by_num(), MAX_INT, nasl_perror(), TC::size, TC::str_val, TC::type, and TC::x.

Here is the call graph for this function:

◆ nasl_tolower()

tree_cell * nasl_tolower ( lex_ctxt * lexic)

Definition at line 385 of file nasl_text_utils.c.

386{
387 tree_cell *retc;
388 char *str = get_str_var_by_num (lexic, 0), *ret;
389 int str_len = get_var_size_by_num (lexic, 0);
390 int i;
391
392 if (str == NULL)
393 return NULL;
394
395 ret = g_malloc0 (str_len + 1);
396 memcpy (ret, str, str_len + 1);
397
398 for (i = 0; i < str_len; i++)
399 ret[i] = tolower (ret[i]);
400
402 retc->size = str_len;
403 retc->x.str_val = ret;
404 return retc;
405}

References alloc_typed_cell(), CONST_DATA, get_str_var_by_num(), get_var_size_by_num(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function:

◆ nasl_toupper()

tree_cell * nasl_toupper ( lex_ctxt * lexic)

Definition at line 409 of file nasl_text_utils.c.

410{
411 tree_cell *retc;
412 char *str = get_str_var_by_num (lexic, 0), *ret;
413 int str_len = get_var_size_by_num (lexic, 0);
414 int i;
415
416 if (str == NULL)
417 return NULL;
418
419 ret = g_malloc0 (str_len + 1);
420 memcpy (ret, str, str_len + 1);
421
422 for (i = 0; i < str_len; i++)
423 ret[i] = toupper (ret[i]);
424
426 retc->size = str_len;
427 retc->x.str_val = ret;
428 return retc;
429}

References alloc_typed_cell(), CONST_DATA, get_str_var_by_num(), get_var_size_by_num(), TC::size, TC::str_val, and TC::x.

Here is the call graph for this function: