Lua 5.1.4: lzio.c


L0001    /*
L0002    ** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
L0003    ** a generic input stream interface
L0004    ** See Copyright Notice in lua.h
L0005    */
L0006    
L0007    
L0008    #include <string.h>
L0009    
L0010    #define lzio_c
L0011    #define LUA_CORE
L0012    
L0013    #include "lua.h"
L0014    
L0015    #include "llimits.h"
L0016    #include "lmem.h"
L0017    #include "lstate.h"
L0018    #include "lzio.h"
L0019    
L0020    
L0021    int luaZ_fill (ZIO *z) {
L0022      size_t size;
L0023      lua_State *L = z->L;
L0024      const char *buff;
L0025      lua_unlock(L);
L0026      buff = z->reader(L, z->data, &size);
L0027      lua_lock(L);
L0028      if (buff == NULL || size == 0) return EOZ;
L0029      z->n = size - 1;
L0030      z->p = buff;
L0031      return char2int(*(z->p++));
L0032    }
L0033    
L0034    
L0035    int luaZ_lookahead (ZIO *z) {
L0036      if (z->n == 0) {
L0037        if (luaZ_fill(z) == EOZ)
L0038          return EOZ;
L0039        else {
L0040          z->n++;  /* luaZ_fill removed first byte; put back it */
L0041          z->p--;
L0042        }
L0043      }
L0044      return char2int(*z->p);
L0045    }
L0046    
L0047    
L0048    void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
L0049      z->L = L;
L0050      z->reader = reader;
L0051      z->data = data;
L0052      z->n = 0;
L0053      z->p = NULL;
L0054    }
L0055    
L0056    
L0057    /* --------------------------------------------------------------- read --- */
L0058    size_t luaZ_read (ZIO *z, void *b, size_t n) {
L0059      while (n) {
L0060        size_t m;
L0061        if (luaZ_lookahead(z) == EOZ)
L0062          return n;  /* return number of missing bytes */
L0063        m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
L0064        memcpy(b, z->p, m);
L0065        z->n -= m;
L0066        z->p += m;
L0067        b = (char *)b + m;
L0068        n -= m;
L0069      }
L0070      return 0;
L0071    }
L0072    
L0073    /* ------------------------------------------------------------------------ */
L0074    char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
L0075      if (n > buff->buffsize) {
L0076        if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;
L0077        luaZ_resizebuffer(L, buff, n);
L0078      }
L0079      return buff->buffer;
L0080    }
L0081    
L0082    

Generated by pretty.lua