3 ** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
11 typedef uint32_t SFormat
; /* Format indicator. */
13 /* Format parser state. */
14 typedef struct FormatState
{
15 const uint8_t *p
; /* Current format string pointer. */
16 const uint8_t *e
; /* End of format string. */
17 const char *str
; /* Returned literal string. */
18 MSize len
; /* Size of literal string. */
21 /* Format types (max. 16). */
22 typedef enum FormatType
{
23 STRFMT_EOF
, STRFMT_ERR
, STRFMT_LIT
,
24 STRFMT_INT
, STRFMT_UINT
, STRFMT_NUM
, STRFMT_STR
, STRFMT_CHAR
, STRFMT_PTR
27 /* Format subtypes (bits are reused). */
28 #define STRFMT_T_HEX 0x0010 /* STRFMT_UINT */
29 #define STRFMT_T_OCT 0x0020 /* STRFMT_UINT */
30 #define STRFMT_T_FP_A 0x0000 /* STRFMT_NUM */
31 #define STRFMT_T_FP_E 0x0010 /* STRFMT_NUM */
32 #define STRFMT_T_FP_F 0x0020 /* STRFMT_NUM */
33 #define STRFMT_T_FP_G 0x0030 /* STRFMT_NUM */
34 #define STRFMT_T_QUOTED 0x0010 /* STRFMT_STR */
37 #define STRFMT_F_LEFT 0x0100
38 #define STRFMT_F_PLUS 0x0200
39 #define STRFMT_F_ZERO 0x0400
40 #define STRFMT_F_SPACE 0x0800
41 #define STRFMT_F_ALT 0x1000
42 #define STRFMT_F_UPPER 0x2000
44 /* Format indicator fields. */
45 #define STRFMT_SH_WIDTH 16
46 #define STRFMT_SH_PREC 24
48 #define STRFMT_TYPE(sf) ((FormatType)((sf) & 15))
49 #define STRFMT_WIDTH(sf) (((sf) >> STRFMT_SH_WIDTH) & 255u)
50 #define STRFMT_PREC(sf) ((((sf) >> STRFMT_SH_PREC) & 255u) - 1u)
51 #define STRFMT_FP(sf) (((sf) >> 4) & 3)
53 /* Formats for conversion characters. */
54 #define STRFMT_A (STRFMT_NUM|STRFMT_T_FP_A)
55 #define STRFMT_C (STRFMT_CHAR)
56 #define STRFMT_D (STRFMT_INT)
57 #define STRFMT_E (STRFMT_NUM|STRFMT_T_FP_E)
58 #define STRFMT_F (STRFMT_NUM|STRFMT_T_FP_F)
59 #define STRFMT_G (STRFMT_NUM|STRFMT_T_FP_G)
60 #define STRFMT_I STRFMT_D
61 #define STRFMT_O (STRFMT_UINT|STRFMT_T_OCT)
62 #define STRFMT_P (STRFMT_PTR)
63 #define STRFMT_Q (STRFMT_STR|STRFMT_T_QUOTED)
64 #define STRFMT_S (STRFMT_STR)
65 #define STRFMT_U (STRFMT_UINT)
66 #define STRFMT_X (STRFMT_UINT|STRFMT_T_HEX)
67 #define STRFMT_G14 (STRFMT_G | ((14+1) << STRFMT_SH_PREC))
69 /* Maximum buffer sizes for conversions. */
70 #define STRFMT_MAXBUF_XINT (1+22) /* '0' prefix + uint64_t in octal. */
71 #define STRFMT_MAXBUF_INT (1+10) /* Sign + int32_t in decimal. */
72 #define STRFMT_MAXBUF_NUM 32 /* Must correspond with STRFMT_G14. */
73 #define STRFMT_MAXBUF_PTR (2+2*sizeof(ptrdiff_t)) /* "0x" + hex ptr. */
76 LJ_FUNC SFormat LJ_FASTCALL
lj_strfmt_parse(FormatState
*fs
);
78 static LJ_AINLINE
void lj_strfmt_init(FormatState
*fs
, const char *p
, MSize len
)
80 fs
->p
= (const uint8_t *)p
;
81 fs
->e
= (const uint8_t *)p
+ len
;
82 /* Must be NUL-terminated. May have NULs inside, too. */
83 lj_assertX(*fs
->e
== 0, "format not NUL-terminated");
86 /* Raw conversions. */
87 LJ_FUNC
char * LJ_FASTCALL
lj_strfmt_wint(char *p
, int32_t k
);
88 LJ_FUNC
char * LJ_FASTCALL
lj_strfmt_wptr(char *p
, const void *v
);
89 LJ_FUNC
char * LJ_FASTCALL
lj_strfmt_wuleb128(char *p
, uint32_t v
);
90 LJ_FUNC
const char *lj_strfmt_wstrnum(lua_State
*L
, cTValue
*o
, MSize
*lenp
);
92 /* Unformatted conversions to buffer. */
93 LJ_FUNC SBuf
* LJ_FASTCALL
lj_strfmt_putint(SBuf
*sb
, int32_t k
);
95 LJ_FUNC SBuf
* LJ_FASTCALL
lj_strfmt_putnum(SBuf
*sb
, cTValue
*o
);
97 LJ_FUNC SBuf
* LJ_FASTCALL
lj_strfmt_putptr(SBuf
*sb
, const void *v
);
99 LJ_FUNC SBuf
* LJ_FASTCALL
lj_strfmt_putquoted(SBuf
*sb
, GCstr
*str
);
102 /* Formatted conversions to buffer. */
103 LJ_FUNC SBuf
*lj_strfmt_putfxint(SBuf
*sb
, SFormat sf
, uint64_t k
);
104 LJ_FUNC SBuf
*lj_strfmt_putfnum_int(SBuf
*sb
, SFormat sf
, lua_Number n
);
105 LJ_FUNC SBuf
*lj_strfmt_putfnum_uint(SBuf
*sb
, SFormat sf
, lua_Number n
);
106 LJ_FUNC SBuf
*lj_strfmt_putfnum(SBuf
*sb
, SFormat
, lua_Number n
);
107 LJ_FUNC SBuf
*lj_strfmt_putfchar(SBuf
*sb
, SFormat
, int32_t c
);
109 LJ_FUNC SBuf
*lj_strfmt_putfstr(SBuf
*sb
, SFormat
, GCstr
*str
);
111 LJ_FUNC
int lj_strfmt_putarg(lua_State
*L
, SBuf
*sb
, int arg
, int retry
);
113 /* Conversions to strings. */
114 LJ_FUNC GCstr
* LJ_FASTCALL
lj_strfmt_int(lua_State
*L
, int32_t k
);
115 LJ_FUNCA GCstr
* LJ_FASTCALL
lj_strfmt_num(lua_State
*L
, cTValue
*o
);
116 LJ_FUNCA GCstr
* LJ_FASTCALL
lj_strfmt_number(lua_State
*L
, cTValue
*o
);
118 LJ_FUNC GCstr
* LJ_FASTCALL
lj_strfmt_char(lua_State
*L
, int c
);
120 LJ_FUNC GCstr
* LJ_FASTCALL
lj_strfmt_obj(lua_State
*L
, cTValue
*o
);
122 /* Internal string formatting. */
123 LJ_FUNC
const char *lj_strfmt_pushvf(lua_State
*L
, const char *fmt
,
125 LJ_FUNC
const char *lj_strfmt_pushf(lua_State
*L
, const char *fmt
, ...)
126 #if defined(__GNUC__) || defined(__clang__)
127 __attribute__ ((format (printf
, 2, 3)))