Ruby  2.0.0p648(2015-12-16revision53162)
Data Structures | Macros | Functions | Variables
strscan.c File Reference
#include "ruby/ruby.h"
#include "ruby/re.h"
#include "ruby/encoding.h"
#include "regint.h"

Go to the source code of this file.

Data Structures

struct  strscanner
 

Macros

#define STRSCAN_VERSION   "0.7.0"
 
#define FLAG_MATCHED   (1 << 0)
 
#define MATCHED_P(s)   ((s)->flags & FLAG_MATCHED)
 
#define MATCHED(s)   (s)->flags |= FLAG_MATCHED
 
#define CLEAR_MATCH_STATUS(s)   (s)->flags &= ~FLAG_MATCHED
 
#define S_PBEG(s)   (RSTRING_PTR((s)->str))
 
#define S_LEN(s)   (RSTRING_LEN((s)->str))
 
#define S_PEND(s)   (S_PBEG(s) + S_LEN(s))
 
#define CURPTR(s)   (S_PBEG(s) + (s)->curr)
 
#define S_RESTLEN(s)   (S_LEN(s) - (s)->curr)
 
#define EOS_P(s)   ((s)->curr >= RSTRING_LEN(p->str))
 
#define GET_SCANNER(obj, var)
 
#define INSPECT_LENGTH   5
 
#define BUFSIZE   256
 

Functions

static VALUE infect _ ((VALUE str, struct strscanner *p))
 
static VALUE extract_range _ ((struct strscanner *p, long beg_i, long end_i))
 
static VALUE extract_beg_len _ ((struct strscanner *p, long beg_i, long len))
 
static struct strscanner *check_strscan _ ((VALUE obj))
 
static void strscan_mark _ ((void *p))
 
static size_t strscan_memsize _ ((const void *p))
 
static VALUE strscan_s_allocate _ ((VALUE klass))
 
static VALUE strscan_initialize _ ((int argc, VALUE *argv, VALUE self))
 
static VALUE strscan_init_copy _ ((VALUE vself, VALUE vorig))
 
static VALUE strscan_s_mustc _ ((VALUE self))
 
static VALUE strscan_set_string _ ((VALUE self, VALUE str))
 
static VALUE strscan_set_pos _ ((VALUE self, VALUE pos))
 
static VALUE strscan_do_scan _ ((VALUE self, VALUE regex, int succptr, int getstr, int headonly))
 
static VALUE strscan_scan _ ((VALUE self, VALUE re))
 
static VALUE strscan_scan_full _ ((VALUE self, VALUE re, VALUE succp, VALUE getp))
 
static void adjust_registers_to_matched _ ((struct strscanner *p))
 
static VALUE strscan_peek _ ((VALUE self, VALUE len))
 
static VALUE strscan_aref _ ((VALUE self, VALUE idx))
 
static VALUE infect (VALUE str, struct strscanner *p)
 
static VALUE str_new (struct strscanner *p, const char *ptr, long len)
 
static VALUE extract_range (struct strscanner *p, long beg_i, long end_i)
 
static VALUE extract_beg_len (struct strscanner *p, long beg_i, long len)
 
static void strscan_mark (void *ptr)
 
static void strscan_free (void *ptr)
 
static size_t strscan_memsize (const void *ptr)
 
static VALUE strscan_s_allocate (VALUE klass)
 
static VALUE strscan_initialize (int argc, VALUE *argv, VALUE self)
 
static struct strscannercheck_strscan (VALUE obj)
 
static VALUE strscan_init_copy (VALUE vself, VALUE vorig)
 
static VALUE strscan_s_mustc (VALUE self)
 
static VALUE strscan_reset (VALUE self)
 
static VALUE strscan_terminate (VALUE self)
 
static VALUE strscan_clear (VALUE self)
 
static VALUE strscan_get_string (VALUE self)
 
static VALUE strscan_set_string (VALUE self, VALUE str)
 
static VALUE strscan_concat (VALUE self, VALUE str)
 
static VALUE strscan_get_pos (VALUE self)
 
static VALUE strscan_get_charpos (VALUE self)
 
static VALUE strscan_set_pos (VALUE self, VALUE v)
 
static VALUE strscan_do_scan (VALUE self, VALUE regex, int succptr, int getstr, int headonly)
 
static VALUE strscan_scan (VALUE self, VALUE re)
 
static VALUE strscan_match_p (VALUE self, VALUE re)
 
static VALUE strscan_skip (VALUE self, VALUE re)
 
static VALUE strscan_check (VALUE self, VALUE re)
 
static VALUE strscan_scan_full (VALUE self, VALUE re, VALUE s, VALUE f)
 
static VALUE strscan_scan_until (VALUE self, VALUE re)
 
static VALUE strscan_exist_p (VALUE self, VALUE re)
 
static VALUE strscan_skip_until (VALUE self, VALUE re)
 
static VALUE strscan_check_until (VALUE self, VALUE re)
 
static VALUE strscan_search_full (VALUE self, VALUE re, VALUE s, VALUE f)
 
static void adjust_registers_to_matched (struct strscanner *p)
 
static VALUE strscan_getch (VALUE self)
 
static VALUE strscan_get_byte (VALUE self)
 
static VALUE strscan_getbyte (VALUE self)
 
static VALUE strscan_peek (VALUE self, VALUE vlen)
 
static VALUE strscan_peep (VALUE self, VALUE vlen)
 
static VALUE strscan_unscan (VALUE self)
 
static VALUE strscan_bol_p (VALUE self)
 
static VALUE strscan_eos_p (VALUE self)
 
static VALUE strscan_empty_p (VALUE self)
 
static VALUE strscan_rest_p (VALUE self)
 
static VALUE strscan_matched_p (VALUE self)
 
static VALUE strscan_matched (VALUE self)
 
static VALUE strscan_matched_size (VALUE self)
 
static VALUE strscan_aref (VALUE self, VALUE idx)
 
static VALUE strscan_pre_match (VALUE self)
 
static VALUE strscan_post_match (VALUE self)
 
static VALUE strscan_rest (VALUE self)
 
static VALUE strscan_rest_size (VALUE self)
 
static VALUE strscan_restsize (VALUE self)
 
static VALUE strscan_inspect (VALUE self)
 
static VALUE inspect1 (struct strscanner *p)
 
static VALUE inspect2 (struct strscanner *p)
 
void Init_strscan ()
 

Variables

static VALUE StringScanner
 
static VALUE ScanError
 
static ID id_byteslice
 
static const rb_data_type_t strscanner_type
 

Macro Definition Documentation

◆ BUFSIZE

#define BUFSIZE   256

Definition at line 1090 of file strscan.c.

◆ CLEAR_MATCH_STATUS

#define CLEAR_MATCH_STATUS (   s)    (s)->flags &= ~FLAG_MATCHED

◆ CURPTR

#define CURPTR (   s)    (S_PBEG(s) + (s)->curr)

Definition at line 50 of file strscan.c.

Referenced by inspect1(), inspect2(), strscan_bol_p(), strscan_do_scan(), and strscan_getch().

◆ EOS_P

#define EOS_P (   s)    ((s)->curr >= RSTRING_LEN(p->str))

◆ FLAG_MATCHED

#define FLAG_MATCHED   (1 << 0)

Definition at line 30 of file strscan.c.

◆ GET_SCANNER

#define GET_SCANNER (   obj,
  var 
)
Value:
do {\
(var) = check_strscan(obj);\
if (NIL_P((var)->str)) rb_raise(rb_eArgError, "uninitialized StringScanner object");\
} while (0)
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1788
static struct strscanner * check_strscan(VALUE obj)
Definition: strscan.c:227
#define NIL_P(v)
Definition: ruby.h:446
VALUE rb_eArgError
Definition: error.c:517

Definition at line 55 of file strscan.c.

Referenced by strscan_aref(), strscan_bol_p(), strscan_concat(), strscan_do_scan(), strscan_eos_p(), strscan_get_byte(), strscan_get_charpos(), strscan_get_pos(), strscan_get_string(), strscan_getch(), strscan_matched(), strscan_matched_p(), strscan_matched_size(), strscan_peek(), strscan_post_match(), strscan_pre_match(), strscan_reset(), strscan_rest(), strscan_rest_p(), strscan_rest_size(), strscan_set_pos(), strscan_terminate(), and strscan_unscan().

◆ INSPECT_LENGTH

#define INSPECT_LENGTH   5

Definition at line 1089 of file strscan.c.

Referenced by inspect1(), and inspect2().

◆ MATCHED

#define MATCHED (   s)    (s)->flags |= FLAG_MATCHED

Definition at line 44 of file strscan.c.

Referenced by strscan_do_scan(), strscan_get_byte(), and strscan_getch().

◆ MATCHED_P

#define MATCHED_P (   s)    ((s)->flags & FLAG_MATCHED)

◆ S_LEN

#define S_LEN (   s)    (RSTRING_LEN((s)->str))

◆ S_PBEG

#define S_PBEG (   s)    (RSTRING_PTR((s)->str))

Definition at line 47 of file strscan.c.

Referenced by extract_beg_len(), and extract_range().

◆ S_PEND

#define S_PEND (   s)    (S_PBEG(s) + S_LEN(s))

Definition at line 49 of file strscan.c.

Referenced by strscan_bol_p(), and strscan_getch().

◆ S_RESTLEN

#define S_RESTLEN (   s)    (S_LEN(s) - (s)->curr)

Definition at line 51 of file strscan.c.

Referenced by strscan_do_scan().

◆ STRSCAN_VERSION

#define STRSCAN_VERSION   "0.7.0"

Definition at line 16 of file strscan.c.

Referenced by Init_strscan().

Function Documentation

◆ _() [1/18]

static VALUE infect _ ( (VALUE str, struct strscanner *p )
static

◆ _() [2/18]

static VALUE extract_range _ ( (struct strscanner *p, long beg_i, long end_i)  )
static

◆ _() [3/18]

static VALUE extract_beg_len _ ( (struct strscanner *p, long beg_i, long len)  )
static

◆ _() [4/18]

static struct strscanner* check_strscan _ ( (VALUE obj)  )
static

◆ _() [5/18]

static void strscan_free _ ( (void *p )
static

◆ _() [6/18]

static size_t strscan_memsize _ ( (const void *p )
static

◆ _() [7/18]

static VALUE strscan_s_allocate _ ( (VALUE klass)  )
static

◆ _() [8/18]

static VALUE strscan_initialize _ ( (int argc, VALUE *argv, VALUE self)  )
static

◆ _() [9/18]

static VALUE strscan_init_copy _ ( (VALUE vself, VALUE vorig)  )
static

◆ _() [10/18]

static VALUE strscan_inspect _ ( (VALUE self)  )
static

◆ _() [11/18]

static VALUE strscan_concat _ ( (VALUE self, VALUE str)  )
static

◆ _() [12/18]

static VALUE strscan_set_pos _ ( (VALUE self, VALUE pos)  )
static

◆ _() [13/18]

static VALUE strscan_do_scan _ ( (VALUE self, VALUE regex, int succptr, int getstr, int headonly)  )
static

◆ _() [14/18]

static VALUE strscan_check_until _ ( (VALUE self, VALUE re)  )
static

◆ _() [15/18]

static VALUE strscan_search_full _ ( (VALUE self, VALUE re, VALUE succp, VALUE getp)  )
static

◆ _() [16/18]

static VALUE inspect2 _ ( (struct strscanner *p )
static

◆ _() [17/18]

static VALUE strscan_peep _ ( (VALUE self, VALUE len)  )
static

◆ _() [18/18]

static VALUE strscan_aref _ ( (VALUE self, VALUE idx)  )
static

◆ adjust_registers_to_matched()

static void adjust_registers_to_matched ( struct strscanner p)
static

Definition at line 696 of file strscan.c.

References onig_region_clear(), onig_region_set(), and p.

Referenced by strscan_get_byte(), and strscan_getch().

◆ check_strscan()

static struct strscanner* check_strscan ( VALUE  obj)
static

◆ extract_beg_len()

static VALUE extract_beg_len ( struct strscanner p,
long  beg_i,
long  len 
)
static

Definition at line 150 of file strscan.c.

References infect(), p, Qnil, S_LEN, S_PBEG, and str_new().

Referenced by strscan_do_scan(), and strscan_peek().

◆ extract_range()

static VALUE extract_range ( struct strscanner p,
long  beg_i,
long  end_i 
)
static

◆ infect()

static VALUE infect ( VALUE  str,
struct strscanner p 
)
static

Definition at line 126 of file strscan.c.

References OBJ_INFECT, p, and strscanner::str.

Referenced by extract_beg_len(), extract_range(), strscan_inspect(), strscan_peek(), and strscan_rest().

◆ Init_strscan()

void Init_strscan ( )

◆ inspect1()

static VALUE inspect1 ( struct strscanner p)
static

◆ inspect2()

static VALUE inspect2 ( struct strscanner p)
static

◆ str_new()

static VALUE str_new ( struct strscanner p,
const char *  ptr,
long  len 
)
static

Definition at line 133 of file strscan.c.

References p, rb_enc_copy(), rb_str_new(), and strscanner::str.

Referenced by extract_beg_len(), extract_range(), strscan_peek(), and strscan_rest().

◆ strscan_aref()

static VALUE strscan_aref ( VALUE  self,
VALUE  idx 
)
static

Definition at line 988 of file strscan.c.

References extract_range(), GET_SCANNER, i, MATCHED_P, NUM2LONG, p, and Qnil.

Referenced by Init_strscan().

◆ strscan_bol_p()

static VALUE strscan_bol_p ( VALUE  self)
static

Definition at line 860 of file strscan.c.

References CURPTR, GET_SCANNER, p, Qfalse, Qnil, Qtrue, and S_PEND.

Referenced by Init_strscan().

◆ strscan_check()

static VALUE strscan_check ( VALUE  self,
VALUE  re 
)
static

Definition at line 581 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_check_until()

static VALUE strscan_check_until ( VALUE  self,
VALUE  re 
)
static

Definition at line 675 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_clear()

static VALUE strscan_clear ( VALUE  self)
static

Definition at line 309 of file strscan.c.

References rb_warning(), and strscan_terminate().

Referenced by Init_strscan().

◆ strscan_concat()

static VALUE strscan_concat ( VALUE  self,
VALUE  str 
)
static

Definition at line 360 of file strscan.c.

References GET_SCANNER, p, rb_str_append(), strscanner::str, and StringValue.

Referenced by Init_strscan().

◆ strscan_do_scan()

static VALUE strscan_do_scan ( VALUE  self,
VALUE  regex,
int  succptr,
int  getstr,
int  headonly 
)
static

◆ strscan_empty_p()

static VALUE strscan_empty_p ( VALUE  self)
static

Definition at line 894 of file strscan.c.

References rb_warning(), and strscan_eos_p().

Referenced by Init_strscan().

◆ strscan_eos_p()

static VALUE strscan_eos_p ( VALUE  self)
static

Definition at line 881 of file strscan.c.

References EOS_P, GET_SCANNER, p, Qfalse, and Qtrue.

Referenced by Init_strscan(), and strscan_empty_p().

◆ strscan_exist_p()

static VALUE strscan_exist_p ( VALUE  self,
VALUE  re 
)
static

Definition at line 634 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_free()

static void strscan_free ( void *  ptr)
static

Definition at line 170 of file strscan.c.

References onig_region_free(), p, and ruby_xfree().

◆ strscan_get_byte()

static VALUE strscan_get_byte ( VALUE  self)
static

◆ strscan_get_charpos()

static VALUE strscan_get_charpos ( VALUE  self)
static

Definition at line 407 of file strscan.c.

References GET_SCANNER, id_byteslice, INT2FIX, INT2NUM, p, rb_funcall(), and rb_str_length().

Referenced by Init_strscan().

◆ strscan_get_pos()

static VALUE strscan_get_pos ( VALUE  self)
static

Definition at line 385 of file strscan.c.

References GET_SCANNER, INT2FIX, and p.

Referenced by Init_strscan().

◆ strscan_get_string()

static VALUE strscan_get_string ( VALUE  self)
static

Definition at line 319 of file strscan.c.

References GET_SCANNER, and p.

Referenced by Init_strscan().

◆ strscan_getbyte()

static VALUE strscan_getbyte ( VALUE  self)
static

Definition at line 778 of file strscan.c.

References rb_warning(), and strscan_get_byte().

Referenced by Init_strscan().

◆ strscan_getch()

static VALUE strscan_getch ( VALUE  self)
static

◆ strscan_init_copy()

static VALUE strscan_init_copy ( VALUE  vself,
VALUE  vorig 
)
static

◆ strscan_initialize()

static VALUE strscan_initialize ( int  argc,
VALUE argv,
VALUE  self 
)
static

Definition at line 213 of file strscan.c.

References argc, argv, check_strscan(), p, rb_scan_args(), strscanner::str, and StringValue.

Referenced by Init_strscan().

◆ strscan_inspect()

static VALUE strscan_inspect ( VALUE  self)
static

Definition at line 1104 of file strscan.c.

References check_strscan(), EOS_P, infect(), inspect1(), inspect2(), NIL_P, p, PRIsVALUE, rb_obj_class(), rb_sprintf(), and S_LEN.

Referenced by Init_strscan().

◆ strscan_mark()

static void strscan_mark ( void *  ptr)
static

Definition at line 163 of file strscan.c.

References p, and rb_gc_mark().

◆ strscan_match_p()

static VALUE strscan_match_p ( VALUE  self,
VALUE  re 
)
static

Definition at line 537 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_matched()

static VALUE strscan_matched ( VALUE  self)
static

Definition at line 943 of file strscan.c.

References extract_range(), GET_SCANNER, MATCHED_P, p, and Qnil.

Referenced by Init_strscan().

◆ strscan_matched_p()

static VALUE strscan_matched_p ( VALUE  self)
static

Definition at line 927 of file strscan.c.

References GET_SCANNER, MATCHED_P, p, Qfalse, and Qtrue.

Referenced by Init_strscan().

◆ strscan_matched_size()

static VALUE strscan_matched_size ( VALUE  self)
static

Definition at line 964 of file strscan.c.

References GET_SCANNER, INT2NUM, MATCHED_P, p, and Qnil.

Referenced by Init_strscan().

◆ strscan_memsize()

static size_t strscan_memsize ( const void *  ptr)
static

Definition at line 178 of file strscan.c.

References onig_region_memsize(), p, and size.

◆ strscan_peek()

static VALUE strscan_peek ( VALUE  self,
VALUE  vlen 
)
static

Definition at line 796 of file strscan.c.

References EOS_P, extract_beg_len(), GET_SCANNER, infect(), NUM2LONG, p, S_LEN, and str_new().

Referenced by Init_strscan(), and strscan_peep().

◆ strscan_peep()

static VALUE strscan_peep ( VALUE  self,
VALUE  vlen 
)
static

Definition at line 817 of file strscan.c.

References rb_warning(), and strscan_peek().

Referenced by Init_strscan().

◆ strscan_post_match()

static VALUE strscan_post_match ( VALUE  self)
static

Definition at line 1036 of file strscan.c.

References extract_range(), GET_SCANNER, MATCHED_P, p, Qnil, and S_LEN.

Referenced by Init_strscan().

◆ strscan_pre_match()

static VALUE strscan_pre_match ( VALUE  self)
static

Definition at line 1017 of file strscan.c.

References extract_range(), GET_SCANNER, MATCHED_P, p, and Qnil.

Referenced by Init_strscan().

◆ strscan_reset()

static VALUE strscan_reset ( VALUE  self)
static

Definition at line 276 of file strscan.c.

References CLEAR_MATCH_STATUS, GET_SCANNER, and p.

Referenced by Init_strscan().

◆ strscan_rest()

static VALUE strscan_rest ( VALUE  self)
static

Definition at line 1050 of file strscan.c.

References EOS_P, extract_range(), GET_SCANNER, infect(), p, S_LEN, and str_new().

Referenced by Init_strscan().

◆ strscan_rest_p()

static VALUE strscan_rest_p ( VALUE  self)
static

Definition at line 909 of file strscan.c.

References EOS_P, GET_SCANNER, p, Qfalse, and Qtrue.

Referenced by Init_strscan().

◆ strscan_rest_size()

static VALUE strscan_rest_size ( VALUE  self)
static

Definition at line 1065 of file strscan.c.

References EOS_P, GET_SCANNER, i, INT2FIX, p, and S_LEN.

Referenced by Init_strscan(), and strscan_restsize().

◆ strscan_restsize()

static VALUE strscan_restsize ( VALUE  self)
static

Definition at line 1083 of file strscan.c.

References rb_warning(), and strscan_rest_size().

Referenced by Init_strscan().

◆ strscan_s_allocate()

static VALUE strscan_s_allocate ( VALUE  klass)
static

Definition at line 194 of file strscan.c.

References ALLOC, CLEAR_MATCH_STATUS, MEMZERO, onig_region_init(), p, Qnil, strscanner_type, and TypedData_Wrap_Struct.

Referenced by Init_strscan().

◆ strscan_s_mustc()

static VALUE strscan_s_mustc ( VALUE  self)
static

Definition at line 267 of file strscan.c.

Referenced by Init_strscan().

◆ strscan_scan()

static VALUE strscan_scan ( VALUE  self,
VALUE  re 
)
static

Definition at line 520 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_scan_full()

static VALUE strscan_scan_full ( VALUE  self,
VALUE  re,
VALUE  s,
VALUE  f 
)
static

Definition at line 597 of file strscan.c.

References f, RTEST, and strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_scan_until()

static VALUE strscan_scan_until ( VALUE  self,
VALUE  re 
)
static

Definition at line 615 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_search_full()

static VALUE strscan_search_full ( VALUE  self,
VALUE  re,
VALUE  s,
VALUE  f 
)
static

Definition at line 690 of file strscan.c.

References f, RTEST, and strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_set_pos()

static VALUE strscan_set_pos ( VALUE  self,
VALUE  v 
)
static

Definition at line 429 of file strscan.c.

References GET_SCANNER, i, INT2NUM, NUM2INT, p, rb_eRangeError, rb_raise(), S_LEN, and v.

Referenced by Init_strscan().

◆ strscan_set_string()

static VALUE strscan_set_string ( VALUE  self,
VALUE  str 
)
static

Definition at line 334 of file strscan.c.

References check_strscan(), CLEAR_MATCH_STATUS, p, strscanner::str, and StringValue.

Referenced by Init_strscan().

◆ strscan_skip()

static VALUE strscan_skip ( VALUE  self,
VALUE  re 
)
static

Definition at line 560 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_skip_until()

static VALUE strscan_skip_until ( VALUE  self,
VALUE  re 
)
static

Definition at line 656 of file strscan.c.

References strscan_do_scan().

Referenced by Init_strscan().

◆ strscan_terminate()

static VALUE strscan_terminate ( VALUE  self)
static

Definition at line 294 of file strscan.c.

References CLEAR_MATCH_STATUS, GET_SCANNER, p, and S_LEN.

Referenced by Init_strscan(), and strscan_clear().

◆ strscan_unscan()

static VALUE strscan_unscan ( VALUE  self)
static

Definition at line 835 of file strscan.c.

References CLEAR_MATCH_STATUS, GET_SCANNER, MATCHED_P, p, rb_raise(), and ScanError.

Referenced by Init_strscan().

Variable Documentation

◆ id_byteslice

ID id_byteslice
static

Definition at line 24 of file strscan.c.

Referenced by Init_strscan(), and strscan_get_charpos().

◆ ScanError

VALUE ScanError
static

Definition at line 23 of file strscan.c.

Referenced by Init_strscan(), strscan_do_scan(), and strscan_unscan().

◆ StringScanner

VALUE StringScanner
static

Definition at line 22 of file strscan.c.

Referenced by Init_strscan().

◆ strscanner_type

const rb_data_type_t strscanner_type
static
Initial value:
= {
"StringScanner",
}
static size_t strscan_memsize(const void *ptr)
Definition: strscan.c:178
static void strscan_mark(void *ptr)
Definition: strscan.c:163
static void strscan_free(void *ptr)
Definition: strscan.c:170

Definition at line 188 of file strscan.c.

Referenced by check_strscan(), and strscan_s_allocate().