summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl/ipoe/lua_lpack.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2017-10-13 23:59:50 +0300
committerDmitry Kozlov <xeb@mail.ru>2017-10-13 23:59:55 +0300
commitec3d2f2942172d79fe74a01f5c980873e01ff5dd (patch)
tree0ded3c0a34324ecd67eb263fd47758cf8fef632e /accel-pppd/ctrl/ipoe/lua_lpack.c
parent0ce5c789bc6c27852c9efeb1d7ab84aa44b551a5 (diff)
downloadaccel-ppp-ec3d2f2942172d79fe74a01f5c980873e01ff5dd.tar.gz
accel-ppp-ec3d2f2942172d79fe74a01f5c980873e01ff5dd.zip
improved lua support
Implemented support for lua 5.2/5.3. To build accel-ppp with exact lua version pass it in -DLUA=x.y, for example -DLUA=5.2 (cmake 3.0 is required for this). Old style -DLUA=TRUE supports only 5.1 and does not require cmake 3.0. Also extra lua modules (lua_lpack, lua_bit) took out into separated library luasupp.
Diffstat (limited to 'accel-pppd/ctrl/ipoe/lua_lpack.c')
-rw-r--r--accel-pppd/ctrl/ipoe/lua_lpack.c271
1 files changed, 0 insertions, 271 deletions
diff --git a/accel-pppd/ctrl/ipoe/lua_lpack.c b/accel-pppd/ctrl/ipoe/lua_lpack.c
deleted file mode 100644
index feb0a5a8..00000000
--- a/accel-pppd/ctrl/ipoe/lua_lpack.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
-* lpack.c
-* a Lua library for packing and unpacking binary data
-* Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br>
-* 29 Jun 2007 19:27:20
-* This code is hereby placed in the public domain.
-* with contributions from Ignacio Castaņo <castanyo@yahoo.es> and
-* Roberto Ierusalimschy <roberto@inf.puc-rio.br>.
-*/
-
-#define OP_ZSTRING 'z' /* zero-terminated string */
-#define OP_BSTRING 'p' /* string preceded by length byte */
-#define OP_WSTRING 'P' /* string preceded by length word */
-#define OP_SSTRING 'a' /* string preceded by length size_t */
-#define OP_STRING 'A' /* string */
-#define OP_FLOAT 'f' /* float */
-#define OP_DOUBLE 'd' /* double */
-#define OP_NUMBER 'n' /* Lua number */
-#define OP_CHAR 'c' /* char */
-#define OP_BYTE 'b' /* byte = unsigned char */
-#define OP_SHORT 'h' /* short */
-#define OP_USHORT 'H' /* unsigned short */
-#define OP_INT 'i' /* int */
-#define OP_UINT 'I' /* unsigned int */
-#define OP_LONG 'l' /* long */
-#define OP_ULONG 'L' /* unsigned long */
-#define OP_LITTLEENDIAN '<' /* little endian */
-#define OP_BIGENDIAN '>' /* big endian */
-#define OP_NATIVE '=' /* native endian */
-
-#include <ctype.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "lua.h"
-#include "lualib.h"
-#include "lauxlib.h"
-
-static void badcode(lua_State *L, int c)
-{
- char s[]="bad code `?'";
- s[sizeof(s)-3]=c;
- luaL_argerror(L,1,s);
-}
-
-static int doendian(int c)
-{
- int x=1;
- int e=*(char*)&x;
- if (c==OP_LITTLEENDIAN) return !e;
- if (c==OP_BIGENDIAN) return e;
- if (c==OP_NATIVE) return 0;
- return 0;
-}
-
-static void doswap(int swap, void *p, size_t n)
-{
- if (swap)
- {
- char *a=p;
- int i,j;
- for (i=0, j=n-1, n=n/2; n--; i++, j--)
- {
- char t=a[i]; a[i]=a[j]; a[j]=t;
- }
- }
-}
-
-#define UNPACKNUMBER(OP,T) \
- case OP: \
- { \
- T a; \
- int m=sizeof(a); \
- if (i+m>len) goto done; \
- memcpy(&a,s+i,m); \
- i+=m; \
- doswap(swap,&a,m); \
- lua_pushinteger(L,(lua_Integer)a); \
- ++n; \
- break; \
- }
-
-#define UNPACKSTRING(OP,T) \
- case OP: \
- { \
- T l; \
- int m=sizeof(l); \
- if (i+m>len) goto done; \
- memcpy(&l,s+i,m); \
- doswap(swap,&l,m); \
- if (i+m+l>len) goto done; \
- i+=m; \
- lua_pushlstring(L,s+i,l); \
- i+=l; \
- ++n; \
- break; \
- }
-
-static int l_unpack(lua_State *L) /** unpack(s,f,[init]) */
-{
- size_t len;
- const char *s=luaL_checklstring(L,1,&len);
- const char *f=luaL_checkstring(L,2);
- int i=luaL_optnumber(L,3,1)-1;
- int n=0;
- int swap=0;
- lua_pushnil(L);
- while (*f)
- {
- int c=*f++;
- int N=1;
- if (isdigit(*f))
- {
- N=0;
- while (isdigit(*f)) N=10*N+(*f++)-'0';
- if (N==0 && c==OP_STRING) { lua_pushliteral(L,""); ++n; }
- }
- while (N--) switch (c)
- {
- case OP_LITTLEENDIAN:
- case OP_BIGENDIAN:
- case OP_NATIVE:
- {
- swap=doendian(c);
- N=0;
- break;
- }
- case OP_STRING:
- {
- ++N;
- if (i+N>len) goto done;
- lua_pushlstring(L,s+i,N);
- i+=N;
- ++n;
- N=0;
- break;
- }
- case OP_ZSTRING:
- {
- size_t l;
- if (i>=len) goto done;
- l=strlen(s+i);
- lua_pushlstring(L,s+i,l);
- i+=l+1;
- ++n;
- break;
- }
- UNPACKSTRING(OP_BSTRING, unsigned char)
- UNPACKSTRING(OP_WSTRING, unsigned short)
- UNPACKSTRING(OP_SSTRING, size_t)
- UNPACKNUMBER(OP_NUMBER, lua_Number)
- UNPACKNUMBER(OP_DOUBLE, double)
- UNPACKNUMBER(OP_FLOAT, float)
- UNPACKNUMBER(OP_CHAR, int8_t)
- UNPACKNUMBER(OP_BYTE, uint8_t)
- UNPACKNUMBER(OP_SHORT, int16_t)
- UNPACKNUMBER(OP_USHORT, uint16_t)
- UNPACKNUMBER(OP_INT, int32_t)
- UNPACKNUMBER(OP_UINT, uint32_t)
- UNPACKNUMBER(OP_LONG, int64_t)
- UNPACKNUMBER(OP_ULONG, uint64_t)
- case ' ': case ',':
- break;
- default:
- badcode(L,c);
- break;
- }
- }
-done:
- lua_pushnumber(L,i+1);
- lua_replace(L,-n-2);
- return n+1;
-}
-
-#define PACKNUMBER(OP,T) \
- case OP: \
- { \
- T a=(T)luaL_checknumber(L,i++); \
- doswap(swap,&a,sizeof(a)); \
- luaL_addlstring(&b,(void*)&a,sizeof(a)); \
- break; \
- }
-
-#define PACKSTRING(OP,T) \
- case OP: \
- { \
- size_t l; \
- const char *a=luaL_checklstring(L,i++,&l); \
- T ll=(T)l; \
- doswap(swap,&ll,sizeof(ll)); \
- luaL_addlstring(&b,(void*)&ll,sizeof(ll)); \
- luaL_addlstring(&b,a,l); \
- break; \
- }
-
-static int l_pack(lua_State *L) /** pack(f,...) */
-{
- int i=2;
- const char *f=luaL_checkstring(L,1);
- int swap=0;
- luaL_Buffer b;
- luaL_buffinit(L,&b);
- while (*f)
- {
- int c=*f++;
- int N=1;
- if (isdigit(*f))
- {
- N=0;
- while (isdigit(*f)) N=10*N+(*f++)-'0';
- }
- while (N--) switch (c)
- {
- case OP_LITTLEENDIAN:
- case OP_BIGENDIAN:
- case OP_NATIVE:
- {
- swap=doendian(c);
- N=0;
- break;
- }
- case OP_STRING:
- case OP_ZSTRING:
- {
- size_t l;
- const char *a=luaL_checklstring(L,i++,&l);
- luaL_addlstring(&b,a,l+(c==OP_ZSTRING));
- break;
- }
- PACKSTRING(OP_BSTRING, unsigned char)
- PACKSTRING(OP_WSTRING, unsigned short)
- PACKSTRING(OP_SSTRING, size_t)
- PACKNUMBER(OP_NUMBER, lua_Number)
- PACKNUMBER(OP_DOUBLE, double)
- PACKNUMBER(OP_FLOAT, float)
- PACKNUMBER(OP_CHAR, int8_t)
- PACKNUMBER(OP_BYTE, uint8_t)
- PACKNUMBER(OP_SHORT, int16_t)
- PACKNUMBER(OP_USHORT, uint16_t)
- PACKNUMBER(OP_INT, int32_t)
- PACKNUMBER(OP_UINT, uint32_t)
- PACKNUMBER(OP_LONG, int64_t)
- PACKNUMBER(OP_ULONG, uint64_t)
- case ' ': case ',':
- break;
- default:
- badcode(L,c);
- break;
- }
- }
- luaL_pushresult(&b);
- return 1;
-}
-
-static const luaL_reg R[] =
-{
- {"pack", l_pack},
- {"unpack", l_unpack},
- {NULL, NULL}
-};
-
-int luaopen_lpack(lua_State *L)
-{
-#ifdef USE_GLOBALS
- lua_register(L,"bpack",l_pack);
- lua_register(L,"bunpack",l_unpack);
-#else
- luaI_openlib(L, LUA_STRLIBNAME, R, 0);
-#endif
- return 0;
-}