js-stream-sas7bdat 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/binding.gyp +58 -0
  2. package/package.json +4 -2
  3. package/src/binding/ReadStat/LICENSE +19 -0
  4. package/src/binding/ReadStat/README.md +483 -0
  5. package/src/binding/ReadStat/src/CKHashTable.c +309 -0
  6. package/src/binding/ReadStat/src/CKHashTable.h +37 -0
  7. package/src/binding/ReadStat/src/readstat.h +627 -0
  8. package/src/binding/ReadStat/src/readstat_bits.c +69 -0
  9. package/src/binding/ReadStat/src/readstat_bits.h +20 -0
  10. package/src/binding/ReadStat/src/readstat_convert.c +36 -0
  11. package/src/binding/ReadStat/src/readstat_convert.h +2 -0
  12. package/src/binding/ReadStat/src/readstat_error.c +126 -0
  13. package/src/binding/ReadStat/src/readstat_iconv.h +15 -0
  14. package/src/binding/ReadStat/src/readstat_io_unistd.c +147 -0
  15. package/src/binding/ReadStat/src/readstat_io_unistd.h +11 -0
  16. package/src/binding/ReadStat/src/readstat_malloc.c +34 -0
  17. package/src/binding/ReadStat/src/readstat_malloc.h +4 -0
  18. package/src/binding/ReadStat/src/readstat_metadata.c +53 -0
  19. package/src/binding/ReadStat/src/readstat_parser.c +121 -0
  20. package/src/binding/ReadStat/src/readstat_strings.h +6 -0
  21. package/src/binding/ReadStat/src/readstat_value.c +178 -0
  22. package/src/binding/ReadStat/src/readstat_variable.c +123 -0
  23. package/src/binding/ReadStat/src/readstat_writer.c +677 -0
  24. package/src/binding/ReadStat/src/readstat_writer.h +21 -0
  25. package/src/binding/ReadStat/src/sas/ieee.c +420 -0
  26. package/src/binding/ReadStat/src/sas/ieee.h +6 -0
  27. package/src/binding/ReadStat/src/sas/readstat_sas.c +528 -0
  28. package/src/binding/ReadStat/src/sas/readstat_sas.h +131 -0
  29. package/src/binding/ReadStat/src/sas/readstat_sas7bcat_read.c +515 -0
  30. package/src/binding/ReadStat/src/sas/readstat_sas7bcat_write.c +218 -0
  31. package/src/binding/ReadStat/src/sas/readstat_sas7bdat_read.c +1304 -0
  32. package/src/binding/ReadStat/src/sas/readstat_sas7bdat_write.c +812 -0
  33. package/src/binding/ReadStat/src/sas/readstat_sas_rle.c +286 -0
  34. package/src/binding/ReadStat/src/sas/readstat_sas_rle.h +8 -0
  35. package/src/binding/ReadStat/src/sas/readstat_xport.c +28 -0
  36. package/src/binding/ReadStat/src/sas/readstat_xport.h +47 -0
  37. package/src/binding/ReadStat/src/sas/readstat_xport_parse_format.c +265 -0
  38. package/src/binding/ReadStat/src/sas/readstat_xport_parse_format.h +4 -0
  39. package/src/binding/ReadStat/src/sas/readstat_xport_parse_format.rl +68 -0
  40. package/src/binding/ReadStat/src/sas/readstat_xport_read.c +777 -0
  41. package/src/binding/ReadStat/src/sas/readstat_xport_write.c +561 -0
  42. package/src/binding/readstat_binding.cc +393 -0
@@ -0,0 +1,309 @@
1
+ // CKHashTable - A simple hash table
2
+ // Copyright 2010-2020 Evan Miller (see LICENSE)
3
+
4
+ #include "CKHashTable.h"
5
+
6
+ /*
7
+ SipHash reference C implementation
8
+
9
+ Copyright (c) 2012 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
10
+ Copyright (c) 2012 Daniel J. Bernstein <djb@cr.yp.to>
11
+
12
+ To the extent possible under law, the author(s) have dedicated all copyright
13
+ and related and neighboring rights to this software to the public domain
14
+ worldwide. This software is distributed without any warranty.
15
+
16
+ You should have received a copy of the CC0 Public Domain Dedication along with
17
+ this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
18
+ */
19
+ #include <stdio.h>
20
+ #include <string.h>
21
+ #include <stdlib.h>
22
+ typedef uint64_t u64;
23
+ typedef uint32_t u32;
24
+ typedef uint8_t u8;
25
+
26
+
27
+ #define ROTL(x,b) (u64)( ((x) << (b)) | ( (x) >> (64 - (b))) )
28
+
29
+ #define U32TO8_LE(p, v) \
30
+ (p)[0] = (u8)((v) ); (p)[1] = (u8)((v) >> 8); \
31
+ (p)[2] = (u8)((v) >> 16); (p)[3] = (u8)((v) >> 24);
32
+
33
+ #define U64TO8_LE(p, v) \
34
+ U32TO8_LE((p), (u32)((v) )); \
35
+ U32TO8_LE((p) + 4, (u32)((v) >> 32));
36
+
37
+ #define U8TO64_LE(p) \
38
+ (((u64)((p)[0]) ) | \
39
+ ((u64)((p)[1]) << 8) | \
40
+ ((u64)((p)[2]) << 16) | \
41
+ ((u64)((p)[3]) << 24) | \
42
+ ((u64)((p)[4]) << 32) | \
43
+ ((u64)((p)[5]) << 40) | \
44
+ ((u64)((p)[6]) << 48) | \
45
+ ((u64)((p)[7]) << 56))
46
+
47
+ #define SIPROUND \
48
+ do { \
49
+ v0 += v1; v1=ROTL(v1,13); v1 ^= v0; v0=ROTL(v0,32); \
50
+ v2 += v3; v3=ROTL(v3,16); v3 ^= v2; \
51
+ v0 += v3; v3=ROTL(v3,21); v3 ^= v0; \
52
+ v2 += v1; v1=ROTL(v1,17); v1 ^= v2; v2=ROTL(v2,32); \
53
+ } while(0)
54
+
55
+ /* SipHash-1-2 */
56
+ static int siphash( unsigned char *out, const unsigned char *in, unsigned long long inlen, const unsigned char *k )
57
+ {
58
+ /* "somepseudorandomlygeneratedbytes" */
59
+ u64 v0 = 0x736f6d6570736575ULL;
60
+ u64 v1 = 0x646f72616e646f6dULL;
61
+ u64 v2 = 0x6c7967656e657261ULL;
62
+ u64 v3 = 0x7465646279746573ULL;
63
+ u64 b;
64
+ u64 k0 = U8TO64_LE( k );
65
+ u64 k1 = U8TO64_LE( k + 8 );
66
+ u64 m;
67
+ const u8 *end = in + inlen - ( inlen % sizeof( u64 ) );
68
+ const int left = inlen & 7;
69
+ b = ( ( u64 )inlen ) << 56;
70
+ v3 ^= k1;
71
+ v2 ^= k0;
72
+ v1 ^= k1;
73
+ v0 ^= k0;
74
+
75
+ for ( ; in != end; in += 8 )
76
+ {
77
+ m = U8TO64_LE( in );
78
+
79
+ v3 ^= m;
80
+
81
+ SIPROUND;
82
+
83
+ v0 ^= m;
84
+ }
85
+
86
+ switch( left )
87
+ {
88
+ case 7: b |= ( ( u64 )in[ 6] ) << 48;
89
+
90
+ case 6: b |= ( ( u64 )in[ 5] ) << 40;
91
+
92
+ case 5: b |= ( ( u64 )in[ 4] ) << 32;
93
+
94
+ case 4: b |= ( ( u64 )in[ 3] ) << 24;
95
+
96
+ case 3: b |= ( ( u64 )in[ 2] ) << 16;
97
+
98
+ case 2: b |= ( ( u64 )in[ 1] ) << 8;
99
+
100
+ case 1: b |= ( ( u64 )in[ 0] ); break;
101
+
102
+ case 0: break;
103
+ }
104
+
105
+ v3 ^= b;
106
+
107
+ SIPROUND;
108
+
109
+ v0 ^= b;
110
+ v2 ^= 0xff;
111
+
112
+ SIPROUND;
113
+ SIPROUND;
114
+
115
+ b = v0 ^ v1 ^ v2 ^ v3;
116
+ U64TO8_LE( out, b );
117
+ return 0;
118
+ }
119
+
120
+ static uint64_t ck_hash_str(const char *str, size_t keylen)
121
+ {
122
+ uint64_t hash;
123
+ unsigned char k[16] = { 0 };
124
+ siphash((unsigned char *)&hash, (const unsigned char *)str, keylen, k);
125
+ return hash;
126
+ }
127
+
128
+ const void *ck_float_hash_lookup(float key, ck_hash_table_t *table)
129
+ {
130
+ return ck_str_n_hash_lookup((const char *)&key, sizeof(float), table);
131
+ }
132
+
133
+ int ck_float_hash_insert(float key, const void *value, ck_hash_table_t *table) {
134
+ return ck_str_n_hash_insert((const char *)&key, sizeof(float), value, table);
135
+ }
136
+
137
+ const void *ck_double_hash_lookup(double key, ck_hash_table_t *table)
138
+ {
139
+ return ck_str_n_hash_lookup((const char *)&key, sizeof(double), table);
140
+ }
141
+
142
+ int ck_double_hash_insert(double key, const void *value, ck_hash_table_t *table) {
143
+ return ck_str_n_hash_insert((const char *)&key, sizeof(double), value, table);
144
+ }
145
+
146
+ const void *ck_str_hash_lookup(const char *key, ck_hash_table_t *table) {
147
+ size_t keylen = strlen(key);
148
+ return ck_str_n_hash_lookup(key, keylen, table);
149
+ }
150
+
151
+ const void *ck_str_n_hash_lookup(const char *key, size_t keylen, ck_hash_table_t *table)
152
+ {
153
+ if (table->count == 0)
154
+ return NULL;
155
+
156
+ if (keylen == 0)
157
+ return NULL;
158
+
159
+ uint64_t hash_key = ck_hash_str(key, keylen);
160
+ hash_key %= table->capacity;
161
+ uint64_t end = hash_key;
162
+ do {
163
+ char *this_key = &table->keys[table->entries[hash_key].key_offset];
164
+ size_t this_keylen = table->entries[hash_key].key_length;
165
+ if (this_keylen == 0)
166
+ return NULL;
167
+ if (this_keylen == keylen && memcmp(this_key, key, keylen) == 0) {
168
+ return table->entries[hash_key].value;
169
+ }
170
+ hash_key++;
171
+ hash_key %= table->capacity;
172
+ } while (hash_key != end);
173
+ return NULL;
174
+ }
175
+
176
+ int ck_str_hash_insert(const char *key, const void *value, ck_hash_table_t *table)
177
+ {
178
+ size_t keylen = strlen(key);
179
+ return ck_str_n_hash_insert(key, keylen, value, table);
180
+ }
181
+
182
+ static int ck_hash_insert_nocopy(off_t key_offset, size_t keylen, uint64_t hash_key,
183
+ const void *value, ck_hash_table_t *table)
184
+ {
185
+ if (table->capacity == 0)
186
+ return 0;
187
+
188
+ hash_key %= table->capacity;
189
+ uint64_t end = (hash_key + table->capacity - 1) % table->capacity;
190
+ while (hash_key != end) {
191
+ ck_hash_entry_t *entry = &table->entries[hash_key];
192
+ if (table->entries[hash_key].key_length == 0) {
193
+ table->count++;
194
+ entry->key_offset = key_offset;
195
+ entry->key_length = keylen;
196
+ entry->value = value;
197
+ return 1;
198
+ } else if (entry->key_length == keylen &&
199
+ entry->key_offset == key_offset) {
200
+ entry->value = value;
201
+ return 1;
202
+ }
203
+ hash_key++;
204
+ hash_key %= table->capacity;
205
+ }
206
+ return 0;
207
+ }
208
+
209
+ int ck_str_n_hash_insert(const char *key, size_t keylen, const void *value, ck_hash_table_t *table)
210
+ {
211
+ if (table->capacity == 0)
212
+ return 0;
213
+
214
+ if (keylen == 0)
215
+ return 0;
216
+
217
+ if (table->count >= 0.75 * table->capacity) {
218
+ if (ck_hash_table_grow(table) == -1) {
219
+ return 0;
220
+ }
221
+ }
222
+
223
+ uint64_t hash_key = ck_hash_str(key, keylen);
224
+ hash_key %= table->capacity;
225
+ uint64_t end = hash_key;
226
+ do {
227
+ ck_hash_entry_t *entry = &table->entries[hash_key];
228
+ char *this_key = &table->keys[entry->key_offset];
229
+ if (entry->key_length == 0) {
230
+ table->count++;
231
+ while (table->keys_used + keylen > table->keys_capacity) {
232
+ table->keys_capacity *= 2;
233
+ table->keys = realloc(table->keys, table->keys_capacity);
234
+ }
235
+ memcpy(table->keys + table->keys_used, key, keylen);
236
+ entry->key_offset = table->keys_used;
237
+ entry->key_length = keylen;
238
+ table->keys_used += keylen;
239
+ entry->value = value;
240
+ return 1;
241
+ } else if (entry->key_length == keylen &&
242
+ memcmp(this_key, key, keylen) == 0) {
243
+ table->entries[hash_key].value = value;
244
+ return 1;
245
+ }
246
+ hash_key++;
247
+ hash_key %= table->capacity;
248
+ } while (hash_key != end);
249
+ return 0;
250
+ }
251
+
252
+ ck_hash_table_t *ck_hash_table_init(size_t num_entries, size_t mean_key_length)
253
+ {
254
+ ck_hash_table_t *table;
255
+ if ((table = malloc(sizeof(ck_hash_table_t))) == NULL)
256
+ return NULL;
257
+
258
+ if ((table->keys = malloc(num_entries * mean_key_length)) == NULL) {
259
+ free(table);
260
+ return NULL;
261
+ }
262
+ table->keys_capacity = num_entries * mean_key_length;
263
+
264
+ num_entries *= 2;
265
+
266
+ if ((table->entries = malloc(num_entries * sizeof(ck_hash_entry_t))) == NULL) {
267
+ free(table->keys);
268
+ free(table);
269
+ return NULL;
270
+ }
271
+ table->capacity = num_entries;
272
+ ck_hash_table_wipe(table);
273
+ return table;
274
+ }
275
+
276
+ void ck_hash_table_free(ck_hash_table_t *table) {
277
+ free(table->entries);
278
+ if (table->keys)
279
+ free(table->keys);
280
+ free(table);
281
+ }
282
+
283
+ void ck_hash_table_wipe(ck_hash_table_t *table) {
284
+ table->keys_used = 0;
285
+ table->count = 0;
286
+ memset(table->entries, 0, table->capacity * sizeof(ck_hash_entry_t));
287
+ }
288
+
289
+ int ck_hash_table_grow(ck_hash_table_t *table) {
290
+ ck_hash_entry_t *old_entries = table->entries;
291
+ uint64_t old_capacity = table->capacity;
292
+ uint64_t new_capacity = 2 * table->capacity;
293
+ if ((table->entries = calloc(new_capacity, sizeof(ck_hash_entry_t))) == NULL) {
294
+ return -1;
295
+ }
296
+ table->capacity = new_capacity;
297
+ table->count = 0;
298
+ for (int i=0; i<old_capacity; i++) {
299
+ if (old_entries[i].key_length != 0) {
300
+ char *this_key = &table->keys[old_entries[i].key_offset];
301
+ uint64_t hash_key = ck_hash_str(this_key, old_entries[i].key_length);
302
+ if (!ck_hash_insert_nocopy(old_entries[i].key_offset, old_entries[i].key_length,
303
+ hash_key, old_entries[i].value, table))
304
+ return -1;
305
+ }
306
+ }
307
+ free(old_entries);
308
+ return 0;
309
+ }
@@ -0,0 +1,37 @@
1
+ // CKHashTable - A simple hash table
2
+ // Copyright 2010-2020 Evan Miller (see LICENSE)
3
+
4
+ #include <sys/types.h>
5
+ #include <stdint.h>
6
+
7
+ typedef struct ck_hash_entry_s {
8
+ off_t key_offset;
9
+ size_t key_length;
10
+ const void *value;
11
+ } ck_hash_entry_t;
12
+
13
+ typedef struct ck_hash_table_s {
14
+ size_t capacity;
15
+ size_t count;
16
+ ck_hash_entry_t *entries;
17
+ char *keys;
18
+ size_t keys_used;
19
+ size_t keys_capacity;
20
+ } ck_hash_table_t;
21
+
22
+ int ck_str_hash_insert(const char *key, const void *value, ck_hash_table_t *table);
23
+ const void *ck_str_hash_lookup(const char *key, ck_hash_table_t *table);
24
+
25
+ int ck_str_n_hash_insert(const char *key, size_t keylen, const void *value, ck_hash_table_t *table);
26
+ const void *ck_str_n_hash_lookup(const char *key, size_t keylen, ck_hash_table_t *table);
27
+
28
+ int ck_float_hash_insert(float key, const void *value, ck_hash_table_t *table);
29
+ const void *ck_float_hash_lookup(float key, ck_hash_table_t *table);
30
+
31
+ int ck_double_hash_insert(double key, const void *value, ck_hash_table_t *table);
32
+ const void *ck_double_hash_lookup(double key, ck_hash_table_t *table);
33
+
34
+ ck_hash_table_t *ck_hash_table_init(size_t num_entries, size_t mean_key_length);
35
+ void ck_hash_table_wipe(ck_hash_table_t *table);
36
+ int ck_hash_table_grow(ck_hash_table_t *table);
37
+ void ck_hash_table_free(ck_hash_table_t *table);