root/lj_buf.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. lj_buf_init
  2. lj_buf_reset
  3. lj_buf_tmp_
  4. lj_buf_free
  5. lj_buf_need
  6. lj_buf_more
  7. lj_buf_wmem
  8. lj_buf_putb
  9. lj_buf_str

   1 /*
   2 ** Buffer handling.
   3 ** Copyright (C) 2005-2017 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

/* [<][>][^][v][top][bottom][index][help] */