ljx

FORK: LuaJIT with native 5.2 and 5.3 support
git clone https://git.neptards.moe/neptards/ljx.git
Log | Files | Refs | README

lj_buf.h (2953B)


      1 /*
      2 ** Buffer handling.
      3 ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
      4 */
      5 
      6 #ifndef _LJ_BUF_H
      7 #define _LJ_BUF_H
      8 
      9 #include "lj_obj.h"
     10 #include "lj_gc.h"
     11 #include "lj_str.h"
     12 
     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)))
     23 
     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);
     29 
     30 static LJ_AINLINE void lj_buf_init(lua_State *L, SBuf *sb)
     31 {
     32   setsbufL(sb, L);
     33   setmref(sb->p, NULL); setmref(sb->e, NULL); setmref(sb->b, NULL);
     34 }
     35 
     36 static LJ_AINLINE void lj_buf_reset(SBuf *sb)
     37 {
     38   setmrefr(sb->p, sb->b);
     39 }
     40 
     41 static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)
     42 {
     43   SBuf *sb = &G(L)->tmpbuf;
     44   setsbufL(sb, L);
     45   lj_buf_reset(sb);
     46   return sb;
     47 }
     48 
     49 static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)
     50 {
     51   lj_mem_free(g, sbufB(sb), sbufsz(sb));
     52 }
     53 
     54 static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz)
     55 {
     56   if (LJ_UNLIKELY(sz > sbufsz(sb)))
     57     return lj_buf_need2(sb, sz);
     58   return sbufB(sb);
     59 }
     60 
     61 static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz)
     62 {
     63   if (LJ_UNLIKELY(sz > sbufleft(sb)))
     64     return lj_buf_more2(sb, sz);
     65   return sbufP(sb);
     66 }
     67 
     68 /* Low-level buffer put operations */
     69 LJ_FUNC SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len);
     70 LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c);
     71 LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s);
     72 
     73 static LJ_AINLINE char *lj_buf_wmem(char *p, const void *q, MSize len)
     74 {
     75   return (char *)memcpy(p, q, len) + len;
     76 }
     77 
     78 static LJ_AINLINE void lj_buf_putb(SBuf *sb, int c)
     79 {
     80   char *p = lj_buf_more(sb, 1);
     81   *p++ = (char)c;
     82   setsbufP(sb, p);
     83 }
     84 
     85 /* High-level buffer put operations */
     86 LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);
     87 LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);
     88 LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);
     89 LJ_FUNC SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep);
     90 LJ_FUNC SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep,
     91 			    int32_t i, int32_t e);
     92 
     93 /* Miscellaneous buffer operations */
     94 LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);
     95 LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);
     96 LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);
     97 
     98 static LJ_AINLINE GCstr *lj_buf_str(lua_State *L, SBuf *sb)
     99 {
    100   return lj_str_new(L, sbufB(sb), sbuflen(sb));
    101 }
    102 
    103 #endif