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 (!). */ |
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 | |