68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								** $Id: lzio.c,v 1.37 2015/09/08 15:41:05 roberto Exp $
							 | 
						||
| 
								 | 
							
								** Buffered streams
							 | 
						||
| 
								 | 
							
								** See Copyright Notice in lua.h
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define lzio_c
							 | 
						||
| 
								 | 
							
								#define LUA_CORE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "lzio.h"
							 | 
						||
| 
								 | 
							
								#include "lprefix.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "lua.h"
							 | 
						||
| 
								 | 
							
								#include "llimits.h"
							 | 
						||
| 
								 | 
							
								#include "lmem.h"
							 | 
						||
| 
								 | 
							
								#include "lstate.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace NS_SLUA {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int luaZ_fill (ZIO *z) {
							 | 
						||
| 
								 | 
							
								  size_t size;
							 | 
						||
| 
								 | 
							
								  lua_State *L = z->L;
							 | 
						||
| 
								 | 
							
								  const char *buff;
							 | 
						||
| 
								 | 
							
								  lua_unlock(L);
							 | 
						||
| 
								 | 
							
								  buff = z->reader(L, z->data, &size);
							 | 
						||
| 
								 | 
							
								  lua_lock(L);
							 | 
						||
| 
								 | 
							
								  if (buff == NULL || size == 0)
							 | 
						||
| 
								 | 
							
								    return EOZ;
							 | 
						||
| 
								 | 
							
								  z->n = size - 1;  /* discount char being returned */
							 | 
						||
| 
								 | 
							
								  z->p = buff;
							 | 
						||
| 
								 | 
							
								  return cast_uchar(*(z->p++));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
							 | 
						||
| 
								 | 
							
								  z->L = L;
							 | 
						||
| 
								 | 
							
								  z->reader = reader;
							 | 
						||
| 
								 | 
							
								  z->data = data;
							 | 
						||
| 
								 | 
							
								  z->n = 0;
							 | 
						||
| 
								 | 
							
								  z->p = NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* --------------------------------------------------------------- read --- */
							 | 
						||
| 
								 | 
							
								size_t luaZ_read (ZIO *z, void *b, size_t n) {
							 | 
						||
| 
								 | 
							
								  while (n) {
							 | 
						||
| 
								 | 
							
								    size_t m;
							 | 
						||
| 
								 | 
							
								    if (z->n == 0) {  /* no bytes in buffer? */
							 | 
						||
| 
								 | 
							
								      if (luaZ_fill(z) == EOZ)  /* try to read more */
							 | 
						||
| 
								 | 
							
								        return n;  /* no more input; return number of missing bytes */
							 | 
						||
| 
								 | 
							
								      else {
							 | 
						||
| 
								 | 
							
								        z->n++;  /* luaZ_fill consumed first byte; put it back */
							 | 
						||
| 
								 | 
							
								        z->p--;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
							 | 
						||
| 
								 | 
							
								    memcpy(b, z->p, m);
							 | 
						||
| 
								 | 
							
								    z->n -= m;
							 | 
						||
| 
								 | 
							
								    z->p += m;
							 | 
						||
| 
								 | 
							
								    b = (char *)b + m;
							 | 
						||
| 
								 | 
							
								    n -= m;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // end NS_SLUA
							 |