39#if (LUA_VERSION_NUM >= 502)
41#define luaL_register(L,n,f) luaL_newlib(L,f)
47#if !defined(STRUCT_INT)
48#define STRUCT_INT long
61#define isp2(x) ((x) > 0 && ((x) & ((x) - 1)) == 0)
70#define PADDING (sizeof(struct cD) - sizeof(double))
71#define MAXALIGN (PADDING > sizeof(int) ? PADDING : sizeof(int))
91static int getnum (
const char **fmt,
int df) {
97 a =
a*10 + *((*fmt)++) -
'0';
98 }
while (isdigit(**fmt));
104#define defaultoptions(h) ((h)->endian = native.endian, (h)->align = 1)
110 case 'B':
case 'b':
return sizeof(char);
111 case 'H':
case 'h':
return sizeof(short);
112 case 'L':
case 'l':
return sizeof(long);
113 case 'T':
return sizeof(size_t);
114 case 'f':
return sizeof(float);
115 case 'd':
return sizeof(double);
117 case 'c':
return getnum(fmt, 1);
118 case 'i':
case 'I': {
119 int sz =
getnum(fmt,
sizeof(
int));
121 luaL_error(L,
"integral size %d is larger than limit of %d",
135 if (size == 0 || opt ==
'c')
return 0;
136 if (size > (
size_t)h->
align)
138 return (size - (len & (size - 1))) & (size - 1);
154 luaL_error(L,
"alignment %d is not a power of 2",
a);
159 const char *msg =
lua_pushfstring(L,
"invalid format option '%c'", opt);
177 for (i = 0; i < size; i++) {
178 buff[i] = (
value & 0xff);
184 for (i = size - 1; i >= 0; i--) {
185 buff[i] = (
value & 0xff);
210 size_t totalsize = 0;
214 while (*fmt !=
'\0') {
216 size_t size =
optsize(L, opt, &fmt);
217 int toalign =
gettoalign(totalsize, &h, opt, size);
218 totalsize += toalign;
221 case 'b':
case 'B':
case 'h':
case 'H':
222 case 'l':
case 'L':
case 'T':
case 'i':
case 'I': {
242 case 'c':
case 's': {
245 if (size == 0) size = l;
264 int issigned,
int size) {
268 for (i = 0; i < size; i++) {
270 l |= (
Uinttype)(
unsigned char)buff[i];
274 for (i = size - 1; i >= 0; i--) {
276 l |= (
Uinttype)(
unsigned char)buff[i];
297 luaL_argcheck(L, pos <= ld, 3,
"initial position out of string");
301 size_t size =
optsize(L, opt, &fmt);
303 luaL_argcheck(L, size <= ld - pos, 2,
"data string too short");
307 case 'b':
case 'B':
case 'h':
case 'H':
308 case 'l':
case 'L':
case 'T':
case 'i':
case 'I': {
309 int issigned = islower(opt);
319 memcpy(&f, data+pos, size);
326 memcpy(&d, data+pos, size);
334 luaL_error(L,
"format 'c0' needs a previous size");
337 luaL_argcheck(L, size <= ld - pos, 2,
"data string too short");
343 const char *e = (
const char *)memchr(data+pos,
'\0', ld - pos);
346 size = (e - (data+pos)) + 1;
366 size_t size =
optsize(L, opt, &fmt);
370 else if (opt ==
'c' && size == 0)
CURL_EXTERN int void * arg
LUA_API void lua_pushnil(lua_State *L)
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
LUA_API const char * lua_pushfstring(lua_State *L, const char *fmt,...)
LUA_API void lua_pushvalue(lua_State *L, int idx)
LUA_API int lua_isnumber(lua_State *L, int idx)
LUA_API void lua_pushlstring(lua_State *L, const char *s, size_t len)
LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)
LUALIB_API void luaL_buffinit(lua_State *L, luaL_Buffer *B)
LUALIB_API void luaL_addlstring(luaL_Buffer *B, const char *s, size_t l)
LUALIB_API void luaL_checkstack(lua_State *L, int space, const char *mes)
LUALIB_API void luaL_pushresult(luaL_Buffer *B)
LUALIB_API int luaL_error(lua_State *L, const char *fmt,...)
LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int narg, lua_Integer def)
LUALIB_API const char * luaL_checklstring(lua_State *L, int narg, size_t *len)
LUALIB_API int luaL_argerror(lua_State *L, int narg, const char *extramsg)
LUALIB_API lua_Number luaL_checknumber(lua_State *L, int narg)
#define luaL_addchar(B, c)
#define luaL_checkstring(L, n)
#define luaL_argcheck(L, cond, numarg, extramsg)
#define lua_setglobal(L, s)
#define luaL_newlib(L, l)
#define lua_tonumber(L, i)
static const struct luaL_Reg thislib[]
static int getnum(const char **fmt, int df)
static void controloptions(lua_State *L, int opt, const char **fmt, Header *h)
static int b_unpack(lua_State *L)
static void putinteger(lua_State *L, luaL_Buffer *b, int arg, int endian, int size)
#define defaultoptions(h)
static int b_size(lua_State *L)
unsigned STRUCT_INT Uinttype
static int b_pack(lua_State *L)
static size_t optsize(lua_State *L, char opt, const char **fmt)
LUALIB_API int luaopen_struct(lua_State *L)
static int gettoalign(size_t len, Header *h, int opt, size_t size)
static void correctbytes(char *b, int size, int endian)
static lua_Number getinteger(const char *buff, int endian, int issigned, int size)
CURL_EXTERN CURLMcode curl_socket_t s