src/lj_buf.h - luajit-2.0-src

Functions defined

Macros defined

Source code

  1. /*
  2. ** Buffer handling.
  3. ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
  4. */

  5. #ifndef _LJ_BUF_H
  6. #define _LJ_BUF_H

  7. #include "lj_obj.h"
  8. #include "lj_gc.h"
  9. #include "lj_str.h"

  10. /* Resizable string buffers. Struct definition in lj_obj.h. */
  11. #define sbufB(sb)        (mref((sb)->b, char))
  12. #define sbufP(sb)        (mref((sb)->p, char))
  13. #define sbufE(sb)        (mref((sb)->e, char))
  14. #define sbufL(sb)        (mref((sb)->L, lua_State))
  15. #define sbufsz(sb)        ((MSize)(sbufE((sb)) - sbufB((sb))))
  16. #define sbuflen(sb)        ((MSize)(sbufP((sb)) - sbufB((sb))))
  17. #define sbufleft(sb)        ((MSize)(sbufE((sb)) - sbufP((sb))))
  18. #define setsbufP(sb, q)        (setmref((sb)->p, (q)))
  19. #define setsbufL(sb, l)        (setmref((sb)->L, (l)))

  20. /* Buffer management */
  21. LJ_FUNC char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz);
  22. LJ_FUNC char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz);
  23. LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb);
  24. LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz);

  25. static LJ_AINLINE void lj_buf_init(lua_State *L, SBuf *sb)
  26. {
  27.   setsbufL(sb, L);
  28.   setmref(sb->p, NULL); setmref(sb->e, NULL); setmref(sb->b, NULL);
  29. }

  30. static LJ_AINLINE void lj_buf_reset(SBuf *sb)
  31. {
  32.   setmrefr(sb->p, sb->b);
  33. }

  34. static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)
  35. {
  36.   SBuf *sb = &G(L)->tmpbuf;
  37.   setsbufL(sb, L);
  38.   lj_buf_reset(sb);
  39.   return sb;
  40. }

  41. static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)
  42. {
  43.   lj_mem_free(g, sbufB(sb), sbufsz(sb));
  44. }

  45. static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz)
  46. {
  47.   if (LJ_UNLIKELY(sz > sbufsz(sb)))
  48.     return lj_buf_need2(sb, sz);
  49.   return sbufB(sb);
  50. }

  51. static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz)
  52. {
  53.   if (LJ_UNLIKELY(sz > sbufleft(sb)))
  54.     return lj_buf_more2(sb, sz);
  55.   return sbufP(sb);
  56. }

  57. /* Low-level buffer put operations */
  58. LJ_FUNC SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len);
  59. #if LJ_HASJIT
  60. LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c);
  61. #endif
  62. LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s);

  63. static LJ_AINLINE char *lj_buf_wmem(char *p, const void *q, MSize len)
  64. {
  65.   return (char *)memcpy(p, q, len) + len;
  66. }

  67. static LJ_AINLINE void lj_buf_putb(SBuf *sb, int c)
  68. {
  69.   char *p = lj_buf_more(sb, 1);
  70.   *p++ = (char)c;
  71.   setsbufP(sb, p);
  72. }

  73. /* High-level buffer put operations */
  74. LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);
  75. LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);
  76. LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);
  77. LJ_FUNC SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep);
  78. LJ_FUNC SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep,
  79.                             int32_t i, int32_t e);

  80. /* Miscellaneous buffer operations */
  81. LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);
  82. LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);
  83. LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);

  84. static LJ_AINLINE GCstr *lj_buf_str(lua_State *L, SBuf *sb)
  85. {
  86.   return lj_str_new(L, sbufB(sb), sbuflen(sb));
  87. }

  88. #endif