lbuffer.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. ** $Id: lbuffer.c,v 1.3 1998/06/02 20:37:04 roberto Exp roberto $
  3. ** Auxiliary functions for building Lua libraries
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdio.h>
  7. #include "lauxlib.h"
  8. #include "lmem.h"
  9. #include "lstate.h"
  10. /*-------------------------------------------------------
  11. ** Auxiliary buffer
  12. -------------------------------------------------------*/
  13. #define BUFF_STEP 32
  14. #define openspace(size) if (L->Mbuffnext+(size) > L->Mbuffsize) Openspace(size)
  15. static void Openspace (int size)
  16. {
  17. lua_State *l = L; /* to optimize */
  18. int base = l->Mbuffbase-l->Mbuffer;
  19. l->Mbuffsize *= 2;
  20. if (l->Mbuffnext+size > l->Mbuffsize) /* still not big enough? */
  21. l->Mbuffsize = l->Mbuffnext+size;
  22. l->Mbuffer = luaM_realloc(l->Mbuffer, l->Mbuffsize);
  23. l->Mbuffbase = l->Mbuffer+base;
  24. }
  25. char *luaL_openspace (int size)
  26. {
  27. openspace(size);
  28. return L->Mbuffer+L->Mbuffnext;
  29. }
  30. void luaL_addchar (int c)
  31. {
  32. openspace(BUFF_STEP);
  33. L->Mbuffer[L->Mbuffnext++] = c;
  34. }
  35. void luaL_resetbuffer (void)
  36. {
  37. L->Mbuffnext = L->Mbuffbase-L->Mbuffer;
  38. }
  39. void luaL_addsize (int n)
  40. {
  41. L->Mbuffnext += n;
  42. }
  43. int luaL_getsize (void)
  44. {
  45. return L->Mbuffnext-(L->Mbuffbase-L->Mbuffer);
  46. }
  47. int luaL_newbuffer (int size)
  48. {
  49. int old = L->Mbuffbase-L->Mbuffer;
  50. openspace(size);
  51. L->Mbuffbase = L->Mbuffer+L->Mbuffnext;
  52. return old;
  53. }
  54. void luaL_oldbuffer (int old)
  55. {
  56. L->Mbuffnext = L->Mbuffbase-L->Mbuffer;
  57. L->Mbuffbase = L->Mbuffer+old;
  58. }
  59. char *luaL_buffer (void)
  60. {
  61. return L->Mbuffbase;
  62. }