author | Kim Alvefur <zash@zash.se> |
Tue, 23 Apr 2024 20:01:41 +0200 | |
changeset 13486 | 4d697961546d |
parent 12980 | a187600ec7d6 |
permissions | -rw-r--r-- |
12358
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
/* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
** {====================================================== |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 |
** Library for packing/unpacking structures. |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
** $Id: struct.c,v 1.8 2018/05/16 11:00:23 roberto Exp $ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
** See Copyright Notice at the end of this file |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
** ======================================================= |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
*/ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
/* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
** Valid formats: |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
** > - big endian |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
** < - little endian |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
** ![num] - alignment |
12391
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
12358
diff
changeset
|
13 |
** x - padding |
12358
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 |
** b/B - signed/unsigned byte |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
** h/H - signed/unsigned short |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
** l/L - signed/unsigned long |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
** T - size_t |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
** i/In - signed/unsigned integer with size 'n' (default is size of int) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 |
** cn - sequence of 'n' chars (from/to a string); when packing, n==0 means |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
the whole string; when unpacking, n==0 means use the previous |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
read number as the string length |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
** s - zero-terminated string |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 |
** f - float |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
** d - double |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
** ' ' - ignored |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
*/ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
#include <ctype.h> |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
#include <limits.h> |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
#include <stddef.h> |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
#include <string.h> |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
#include "lua.h" |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 |
#include "lauxlib.h" |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
/* basic integer type */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 |
#if !defined(STRUCT_INT) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 |
#define STRUCT_INT long |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
#endif |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 |
typedef STRUCT_INT Inttype; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 |
/* corresponding unsigned version */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 |
typedef unsigned STRUCT_INT Uinttype; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 |
/* maximum size (in bytes) for integral types */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
#define MAXINTSIZE 32 |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 |
/* is 'x' a power of 2? */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 |
#define isp2(x) ((x) > 0 && ((x) & ((x) - 1)) == 0) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 |
/* dummy structure to get alignment requirements */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
struct cD { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
char c; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 |
double d; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |
}; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
#define PADDING (sizeof(struct cD) - sizeof(double)) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
#define MAXALIGN (PADDING > sizeof(int) ? PADDING : sizeof(int)) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
/* endian options */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
#define BIG 0 |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
#define LITTLE 1 |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
static union { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 |
int dummy; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 |
char endian; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
} const native = {1}; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 |
typedef struct Header { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 |
int endian; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 |
int align; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 |
} Header; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 |
static int getnum (const char **fmt, int df) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 |
if (!isdigit(**fmt)) /* no number? */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 |
return df; /* return default value */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 |
else { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 |
int a = 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 |
do { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 |
a = a*10 + *((*fmt)++) - '0'; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 |
} while (isdigit(**fmt)); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
return a; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 |
#define defaultoptions(h) ((h)->endian = native.endian, (h)->align = 1) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 |
static size_t optsize (lua_State *L, char opt, const char **fmt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 |
switch (opt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 |
case 'B': case 'b': return sizeof(char); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
case 'H': case 'h': return sizeof(short); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 |
case 'L': case 'l': return sizeof(long); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 |
case 'T': return sizeof(size_t); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 |
case 'f': return sizeof(float); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 |
case 'd': return sizeof(double); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 |
case 'x': return 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
case 'c': return getnum(fmt, 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 |
case 'i': case 'I': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 |
int sz = getnum(fmt, sizeof(int)); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 |
if (sz > MAXINTSIZE) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 |
luaL_error(L, "integral size %d is larger than limit of %d", |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 |
sz, MAXINTSIZE); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 |
return sz; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 |
default: return 0; /* other cases do not need alignment */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 |
/* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 |
** return number of bytes needed to align an element of size 'size' |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 |
** at current position 'len' |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 |
*/ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 |
static int gettoalign (size_t len, Header *h, int opt, size_t size) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 |
if (size == 0 || opt == 'c') return 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 |
if (size > (size_t)h->align) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 |
size = h->align; /* respect max. alignment */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 |
return (size - (len & (size - 1))) & (size - 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 |
/* |
12857
e1a71e83d430
util.struct: Fix typo in comment
Kim Alvefur <zash@zash.se>
parents:
12579
diff
changeset
|
137 |
** options to control endianness and alignment |
12358
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 |
*/ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 |
static void controloptions (lua_State *L, int opt, const char **fmt, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 |
Header *h) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 |
switch (opt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 |
case ' ': return; /* ignore white spaces */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 |
case '>': h->endian = BIG; return; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 |
case '<': h->endian = LITTLE; return; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 |
case '!': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 |
int a = getnum(fmt, MAXALIGN); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 |
if (!isp2(a)) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 |
luaL_error(L, "alignment %d is not a power of 2", a); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 |
h->align = a; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 |
return; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 |
default: { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 |
const char *msg = lua_pushfstring(L, "invalid format option '%c'", opt); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 |
luaL_argerror(L, 1, msg); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 |
static void putinteger (lua_State *L, luaL_Buffer *b, int arg, int endian, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 |
int size) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 |
lua_Number n = luaL_checknumber(L, arg); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 |
Uinttype value; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 |
char buff[MAXINTSIZE]; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 |
if (n < 0) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 |
value = (Uinttype)(Inttype)n; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 |
else |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 |
value = (Uinttype)n; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 |
if (endian == LITTLE) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 |
int i; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 |
for (i = 0; i < size; i++) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 |
buff[i] = (value & 0xff); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 |
value >>= 8; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 |
else { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
int i; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 |
for (i = size - 1; i >= 0; i--) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 |
buff[i] = (value & 0xff); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 |
value >>= 8; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 |
luaL_addlstring(b, buff, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 |
static void correctbytes (char *b, int size, int endian) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 |
if (endian != native.endian) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 |
int i = 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 |
while (i < --size) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 |
char temp = b[i]; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 |
b[i++] = b[size]; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 |
b[size] = temp; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 |
static int b_pack (lua_State *L) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 |
luaL_Buffer b; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 |
const char *fmt = luaL_checkstring(L, 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 |
Header h; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 |
int arg = 2; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 |
size_t totalsize = 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 |
defaultoptions(&h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 |
lua_pushnil(L); /* mark to separate arguments from string buffer */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 |
luaL_buffinit(L, &b); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 |
while (*fmt != '\0') { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 |
int opt = *fmt++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 |
size_t size = optsize(L, opt, &fmt); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 |
int toalign = gettoalign(totalsize, &h, opt, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 |
totalsize += toalign; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 |
while (toalign-- > 0) luaL_addchar(&b, '\0'); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 |
switch (opt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 |
case 'b': case 'B': case 'h': case 'H': |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 |
case 'l': case 'L': case 'T': case 'i': case 'I': { /* integer types */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 |
putinteger(L, &b, arg++, h.endian, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 |
case 'x': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 |
luaL_addchar(&b, '\0'); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 |
case 'f': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 |
float f = (float)luaL_checknumber(L, arg++); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 |
correctbytes((char *)&f, size, h.endian); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 |
luaL_addlstring(&b, (char *)&f, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
229 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
230 |
case 'd': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 |
double d = luaL_checknumber(L, arg++); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
232 |
correctbytes((char *)&d, size, h.endian); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
233 |
luaL_addlstring(&b, (char *)&d, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
236 |
case 'c': case 's': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
237 |
size_t l; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
238 |
const char *s = luaL_checklstring(L, arg++, &l); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
239 |
if (size == 0) size = l; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
240 |
luaL_argcheck(L, l >= (size_t)size, arg, "string too short"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
241 |
luaL_addlstring(&b, s, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
242 |
if (opt == 's') { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 |
luaL_addchar(&b, '\0'); /* add zero at the end */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 |
size++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
246 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
247 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
248 |
default: controloptions(L, opt, &fmt, &h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
249 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
250 |
totalsize += size; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
251 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
252 |
luaL_pushresult(&b); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
253 |
return 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
254 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
255 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
256 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
257 |
static lua_Number getinteger (const char *buff, int endian, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
258 |
int issigned, int size) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
259 |
Uinttype l = 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
260 |
int i; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
261 |
if (endian == BIG) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
262 |
for (i = 0; i < size; i++) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
263 |
l <<= 8; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
264 |
l |= (Uinttype)(unsigned char)buff[i]; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
265 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
266 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
267 |
else { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
268 |
for (i = size - 1; i >= 0; i--) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
269 |
l <<= 8; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
270 |
l |= (Uinttype)(unsigned char)buff[i]; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
271 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
272 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
273 |
if (!issigned) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
274 |
return (lua_Number)l; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
275 |
else { /* signed format */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
276 |
Uinttype mask = (Uinttype)(~((Uinttype)0)) << (size*8 - 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
277 |
if (l & mask) /* negative value? */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
278 |
l |= mask; /* signal extension */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
279 |
return (lua_Number)(Inttype)l; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
280 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
281 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
282 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
283 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
284 |
static int b_unpack (lua_State *L) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
285 |
Header h; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
286 |
const char *fmt = luaL_checkstring(L, 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
287 |
size_t ld; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
288 |
const char *data = luaL_checklstring(L, 2, &ld); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
289 |
size_t pos = (size_t)luaL_optinteger(L, 3, 1) - 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
290 |
int n = 0; /* number of results */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
291 |
luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
292 |
defaultoptions(&h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
293 |
while (*fmt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 |
int opt = *fmt++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
295 |
size_t size = optsize(L, opt, &fmt); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
296 |
pos += gettoalign(pos, &h, opt, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
297 |
luaL_argcheck(L, size <= ld - pos, 2, "data string too short"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
298 |
/* stack space for item + next position */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
299 |
luaL_checkstack(L, 2, "too many results"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
300 |
switch (opt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
301 |
case 'b': case 'B': case 'h': case 'H': |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
302 |
case 'l': case 'L': case 'T': case 'i': case 'I': { /* integer types */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
303 |
int issigned = islower(opt); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
304 |
lua_Number res = getinteger(data+pos, h.endian, issigned, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
305 |
lua_pushnumber(L, res); n++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
306 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
307 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
308 |
case 'x': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
309 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
310 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
311 |
case 'f': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
312 |
float f; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
313 |
memcpy(&f, data+pos, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
314 |
correctbytes((char *)&f, sizeof(f), h.endian); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
315 |
lua_pushnumber(L, f); n++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
316 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
317 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
318 |
case 'd': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
319 |
double d; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
320 |
memcpy(&d, data+pos, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
321 |
correctbytes((char *)&d, sizeof(d), h.endian); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
322 |
lua_pushnumber(L, d); n++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
323 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
324 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
325 |
case 'c': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
326 |
if (size == 0) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
327 |
if (n == 0 || !lua_isnumber(L, -1)) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
328 |
luaL_error(L, "format 'c0' needs a previous size"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
329 |
size = lua_tonumber(L, -1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
330 |
lua_pop(L, 1); n--; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
331 |
luaL_argcheck(L, size <= ld - pos, 2, "data string too short"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
332 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
333 |
lua_pushlstring(L, data+pos, size); n++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
334 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
335 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
336 |
case 's': { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
337 |
const char *e = (const char *)memchr(data+pos, '\0', ld - pos); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
338 |
if (e == NULL) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
339 |
luaL_error(L, "unfinished string in data"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
340 |
size = (e - (data+pos)) + 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
341 |
lua_pushlstring(L, data+pos, size - 1); n++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
342 |
break; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
343 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
344 |
default: controloptions(L, opt, &fmt, &h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
345 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
346 |
pos += size; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
347 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
348 |
lua_pushinteger(L, pos + 1); /* next position */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
349 |
return n + 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
350 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
351 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
352 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
353 |
static int b_size (lua_State *L) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
354 |
Header h; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
355 |
const char *fmt = luaL_checkstring(L, 1); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
356 |
size_t pos = 0; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
357 |
defaultoptions(&h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
358 |
while (*fmt) { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
359 |
int opt = *fmt++; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
360 |
size_t size = optsize(L, opt, &fmt); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
361 |
pos += gettoalign(pos, &h, opt, size); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
362 |
if (opt == 's') |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
363 |
luaL_argerror(L, 1, "option 's' has no fixed size"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
364 |
else if (opt == 'c' && size == 0) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
365 |
luaL_argerror(L, 1, "option 'c0' has no fixed size"); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
366 |
if (!isalnum(opt)) |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
367 |
controloptions(L, opt, &fmt, &h); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
368 |
pos += size; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
369 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
370 |
lua_pushinteger(L, pos); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
371 |
return 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
372 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
373 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
374 |
/* }====================================================== */ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
375 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
376 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
377 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
378 |
static const struct luaL_Reg thislib[] = { |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
379 |
{"pack", b_pack}, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
380 |
{"unpack", b_unpack}, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
381 |
{"size", b_size}, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
382 |
{NULL, NULL} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
383 |
}; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
384 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
385 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
386 |
LUALIB_API int luaopen_util_struct (lua_State *L); |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
387 |
|
12980
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12857
diff
changeset
|
388 |
LUALIB_API int luaopen_prosody_util_struct (lua_State *L) { |
12579
1f6f05a98fcd
util-src: Remove Lua 5.1 compat macros
Kim Alvefur <zash@zash.se>
parents:
12391
diff
changeset
|
389 |
luaL_newlib(L, thislib); |
12358
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
390 |
return 1; |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
391 |
} |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
392 |
|
12980
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12857
diff
changeset
|
393 |
LUALIB_API int luaopen_util_struct (lua_State *L) { |
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12857
diff
changeset
|
394 |
return luaopen_prosody_util_struct(L); |
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12857
diff
changeset
|
395 |
} |
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12857
diff
changeset
|
396 |
|
12358
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
397 |
|
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
398 |
/****************************************************************************** |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
399 |
* Copyright (C) 2010-2018 Lua.org, PUC-Rio. All rights reserved. |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
400 |
* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
401 |
* Permission is hereby granted, free of charge, to any person obtaining |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
402 |
* a copy of this software and associated documentation files (the |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
403 |
* "Software"), to deal in the Software without restriction, including |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
404 |
* without limitation the rights to use, copy, modify, merge, publish, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
405 |
* distribute, sublicense, and/or sell copies of the Software, and to |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
406 |
* permit persons to whom the Software is furnished to do so, subject to |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
407 |
* the following conditions: |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
408 |
* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
409 |
* The above copyright notice and this permission notice shall be |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
410 |
* included in all copies or substantial portions of the Software. |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
411 |
* |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
412 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
413 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
414 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
415 |
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
416 |
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
417 |
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
418 |
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
419 |
******************************************************************************/ |
3ce3633527af
util.struct: Import Roberto 'struct' library v0.3
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
420 |