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. */
19typedef enum {
20 STRSCAN_ERROR,
21 STRSCAN_NUM, STRSCAN_IMAG,
22 STRSCAN_INT, STRSCAN_U32, STRSCAN_I64, STRSCAN_U64,
23} StrScanFmt;
24
25LJ_FUNC StrScanFmt lj_strscan_scan(const uint8_t *p, MSize len, TValue *o,
26 uint32_t opt);
27LJ_FUNC int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o);
28#if LJ_DUALNUM
29LJ_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 (!). */
35static 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