3 ** Copyright (C) 2005-2014 Mike Pall. See Copyright Notice in luajit.h
13 /* Resizable string buffers. Struct definition in lj_obj.h. */
14 #define sbufB(sb) (mref((sb)->b, char))
15 #define sbufP(sb) (mref((sb)->p, char))
16 #define sbufE(sb) (mref((sb)->e, char))
17 #define sbufL(sb) (mref((sb)->L, lua_State))
18 #define sbufsz(sb) ((MSize)(sbufE((sb)) - sbufB((sb))))
19 #define sbuflen(sb) ((MSize)(sbufP((sb)) - sbufB((sb))))
20 #define sbufleft(sb) ((MSize)(sbufE((sb)) - sbufP((sb))))
21 #define setsbufP(sb, q) (setmref((sb)->p, (q)))
22 #define setsbufL(sb, l) (setmref((sb)->L, (l)))
24 /* Buffer management */
25 LJ_FUNC
char *LJ_FASTCALL
lj_buf_need2(SBuf
*sb
, MSize sz
);
26 LJ_FUNC
char *LJ_FASTCALL
lj_buf_more2(SBuf
*sb
, MSize sz
);
27 LJ_FUNC
void LJ_FASTCALL
lj_buf_shrink(lua_State
*L
, SBuf
*sb
);
28 LJ_FUNC
char * LJ_FASTCALL
lj_buf_tmp(lua_State
*L
, MSize sz
);
30 static LJ_AINLINE
void lj_buf_init(lua_State
*L
, SBuf
*sb
)
33 setmref(sb
->p
, NULL
); setmref(sb
->e
, NULL
); setmref(sb
->b
, NULL
);
36 static LJ_AINLINE
void lj_buf_reset(SBuf
*sb
)
38 setmrefr(sb
->p
, sb
->b
);
41 static LJ_AINLINE SBuf
*lj_buf_tmp_(lua_State
*L
)
43 SBuf
*sb
= &G(L
)->tmpbuf
;
49 static LJ_AINLINE
void lj_buf_free(global_State
*g
, SBuf
*sb
)
51 lj_mem_free(g
, sbufB(sb
), sbufsz(sb
));
54 static LJ_AINLINE
char *lj_buf_need(SBuf
*sb
, MSize sz
)
56 if (LJ_UNLIKELY(sz
> sbufsz(sb
)))
57 return lj_buf_need2(sb
, sz
);
61 static LJ_AINLINE
char *lj_buf_more(SBuf
*sb
, MSize sz
)
63 if (LJ_UNLIKELY(sz
> sbufleft(sb
)))
64 return lj_buf_more2(sb
, sz
);
68 /* Low-level buffer put operations */
69 LJ_FUNC SBuf
*lj_buf_putmem(SBuf
*sb
, const void *q
, MSize len
);
71 LJ_FUNC SBuf
* LJ_FASTCALL
lj_buf_putchar(SBuf
*sb
, int c
);
73 LJ_FUNC SBuf
* LJ_FASTCALL
lj_buf_putstr(SBuf
*sb
, GCstr
*s
);
75 static LJ_AINLINE
char *lj_buf_wmem(char *p
, const void *q
, MSize len
)
77 return (char *)memcpy(p
, q
, len
) + len
;
80 static LJ_AINLINE
void lj_buf_putb(SBuf
*sb
, int c
)
82 char *p
= lj_buf_more(sb
, 1);
87 /* High-level buffer put operations */
88 LJ_FUNCA SBuf
* LJ_FASTCALL
lj_buf_putstr_reverse(SBuf
*sb
, GCstr
*s
);
89 LJ_FUNCA SBuf
* LJ_FASTCALL
lj_buf_putstr_lower(SBuf
*sb
, GCstr
*s
);
90 LJ_FUNCA SBuf
* LJ_FASTCALL
lj_buf_putstr_upper(SBuf
*sb
, GCstr
*s
);
91 LJ_FUNC SBuf
*lj_buf_putstr_rep(SBuf
*sb
, GCstr
*s
, int32_t rep
);
92 LJ_FUNC SBuf
*lj_buf_puttab(SBuf
*sb
, GCtab
*t
, GCstr
*sep
,
93 int32_t i
, int32_t e
);
95 /* Miscellaneous buffer operations */
96 LJ_FUNCA GCstr
* LJ_FASTCALL
lj_buf_tostr(SBuf
*sb
);
97 LJ_FUNC GCstr
*lj_buf_cat2str(lua_State
*L
, GCstr
*s1
, GCstr
*s2
);
98 LJ_FUNC
uint32_t LJ_FASTCALL
lj_buf_ruleb128(const char **pp
);
100 static LJ_AINLINE GCstr
*lj_buf_str(lua_State
*L
, SBuf
*sb
)
102 return lj_str_new(L
, sbufB(sb
), sbuflen(sb
));