1 /*
2 ** String scanning.
3 ** Copyright (C) 2005-2021 Mike Pall. See Copyright Notice in luajit.h
4 */
5 
6 #ifndef _LJ_STRSCAN_H
7 #define _LJ_STRSCAN_H
8 
9 #include "lj_obj.h"
10 
11 /* Options for accepted/returned formats. */
12 #define STRSCAN_OPT_TOINT	0x01  /* Convert to int32_t, if possible. */
13 #define STRSCAN_OPT_TONUM	0x02  /* Always convert to double. */
14 #define STRSCAN_OPT_IMAG	0x04
15 #define STRSCAN_OPT_LL		0x08
16 #define STRSCAN_OPT_C		0x10
17 
18 /* Returned format. */
19 typedef enum {
20   STRSCAN_ERROR,
21   STRSCAN_NUM, STRSCAN_IMAG,
22   STRSCAN_INT, STRSCAN_U32, STRSCAN_I64, STRSCAN_U64,
23 } StrScanFmt;
24 
25 LJ_FUNC StrScanFmt lj_strscan_scan(const uint8_t *p, MSize len, TValue *o,
26 				   uint32_t opt);
27 LJ_FUNC int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o);
28 #if LJ_DUALNUM
29 LJ_FUNC int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o);
30 #else
31 #define lj_strscan_number(s, o)		lj_strscan_num((s), (o))
32 #endif
33 
34 /* Check for number or convert string to number/int in-place (!). */
lj_strscan_numberobj(TValue * o)35 static LJ_AINLINE int lj_strscan_numberobj(TValue *o)
36 {
37   return tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), o));
38 }
39 
40 #endif
41