sereal 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,89 @@
1
+ #include "sereal.h"
2
+ static inline void *realloc_or_raise(void *p, u32 n) {
3
+ u8 *buf = realloc(p,n);
4
+ if (!buf)
5
+ rb_raise(rb_eNoMemError,"memory allocation failure for %d bytes",n);
6
+ return buf;
7
+ }
8
+ static inline void *alloc_or_raise(u32 s) {
9
+ return realloc_or_raise(NULL,s);
10
+ }
11
+
12
+ static inline sereal_t * s_create(void) {
13
+ sereal_t *s = alloc_or_raise(sizeof(*s));
14
+ ZERO(s,sizeof(*s));
15
+ return s;
16
+ }
17
+
18
+ static inline void s_destroy(sereal_t *s) {
19
+ if (s->data)
20
+ free(s->data);
21
+
22
+ free(s);
23
+ }
24
+
25
+ static inline void s_alloc(sereal_t *s, u32 len) {
26
+ if (s->rsize > s->size + len)
27
+ return;
28
+
29
+ u32 size = s->size + len + 512; // every time allocate 512b more, so we wont alloc for a while
30
+ u8 *buf = realloc_or_raise(s->data,size);
31
+ s->data = buf;
32
+ s->rsize = size;
33
+ }
34
+
35
+ static inline void s_append(sereal_t *s, void *suffix, u32 s_len) {
36
+ s_alloc(s,s_len);
37
+ COPY(suffix,(s->data + s->size), s_len);
38
+ s->size += s_len;
39
+ s->pos += s_len;
40
+ }
41
+
42
+ static inline void s_append_u8(sereal_t *s,u8 b) {
43
+ s_append(s,&b,sizeof(b));
44
+ }
45
+
46
+ static inline void s_append_u32(sereal_t *s,u32 b) {
47
+ s_append(s,&b,sizeof(b));
48
+ }
49
+
50
+ static inline void *s_get_p_at_pos(sereal_t *s, u32 pos,u32 req) {
51
+ if (pos + req > s->size)
52
+ rb_raise(rb_eRangeError,"position is out of bounds (%d + %d > %d)",pos,req,s->size);
53
+ return &s->data[pos];
54
+ }
55
+
56
+ static inline void *s_get_p(sereal_t *s) {
57
+ return s_get_p_at_pos(s,s->pos,0);
58
+ }
59
+ static inline u8 s_get_u8(sereal_t *s) {
60
+ return *((u8 *) s_get_p(s));
61
+ }
62
+
63
+ static inline u8 s_get_u8_bang(sereal_t *s) {
64
+ u8 r = s_get_u8(s);
65
+ s->pos++;
66
+ return r;
67
+ }
68
+
69
+ static inline u32 s_get_u32_bang(sereal_t *s) {
70
+ u32 *r = (u32 *) s_get_p_at_pos(s,s->pos,sizeof(u32) - 1); /* current position + 3 bytes */
71
+ s->pos += sizeof(u32);
72
+ return *r;
73
+ }
74
+
75
+ static inline u32 s_shift_position_bang(sereal_t *s, u32 len) {
76
+ s->pos += len;
77
+ return len;
78
+ }
79
+ static inline void s_dump(sereal_t *s) {
80
+ u32 i;
81
+ for (i = 0; i < s->size; i++) {
82
+ if (i == s->pos)
83
+ fprintf(stderr," [%c %d] ",s->data[i],s->data[i]);
84
+ else
85
+ fprintf(stderr," (%c %d) ",s->data[i],s->data[i]);
86
+ }
87
+ fprintf(stderr,"\n");
88
+ }
89
+
@@ -0,0 +1,238 @@
1
+ #include "sereal.h"
2
+ #include "buffer.h"
3
+ #include "decode.h"
4
+ #include "snappy/csnappy_decompress.c"
5
+
6
+ static VALUE s_default_reader(sereal_t *s, u8 tag) {
7
+ // s_dump(s);
8
+ rb_raise(rb_eTypeError,"unsupported tag %d",tag);
9
+ return Qnil;
10
+ }
11
+
12
+ /* VARINT */
13
+ static u64 s_get_varint_bang(sereal_t *s) {
14
+ u64 uv = 0;
15
+ unsigned int lshift = 0;
16
+ while (s_get_u8(s) & 0x80) {
17
+ uv |= ((u64)(s_get_u8_bang(s) & 0x7F) << lshift);
18
+ lshift += 7;
19
+ if (lshift > (sizeof(uv) * 8))
20
+ rb_raise(rb_eTypeError, "varint too big");
21
+ }
22
+ uv |= ((u64)(s_get_u8_bang(s)) << lshift);
23
+ return uv;
24
+ }
25
+
26
+ /* ZIGZAG */
27
+ static VALUE s_read_zigzag(sereal_t *s, u8 tag) {
28
+ signed long long z = 0;
29
+ u64 v = s_get_varint_bang(s);
30
+ if (v & 1) {
31
+ z = ((long) v >> 1);
32
+ } else {
33
+ z = (long) v >> 1;
34
+ }
35
+ return LL2NUM(z);
36
+ }
37
+
38
+ /* VARINT */
39
+ static VALUE s_read_varint(sereal_t *s, u8 tag) {
40
+ return ULL2NUM(s_get_varint_bang(s));
41
+ }
42
+
43
+ /* FLOAT */
44
+ static VALUE s_read_float(sereal_t *s, u8 tag) {
45
+ float *f = (float *) s_get_p_at_pos(s,s->pos,sizeof(*f));
46
+ return DBL2NUM((double) *f);
47
+ }
48
+
49
+ /* DOUBLE */
50
+ static VALUE s_read_double(sereal_t *s, u8 tag) {
51
+ double *d = (double *) s_get_p_at_pos(s,s->pos,sizeof(*d));
52
+ return DBL2NUM(*d);
53
+ }
54
+
55
+ /* LONG DOUBLE */
56
+ static VALUE s_read_long_double(sereal_t *s, u8 tag) {
57
+ long double *d = (long double *) s_get_p_at_pos(s,s->pos,sizeof(*d));
58
+ return DBL2NUM((double) *d);
59
+ }
60
+
61
+ /* POS */
62
+ static VALUE s_read_small_positive_int(sereal_t *s, u8 tag) {
63
+ return INT2FIX(tag);
64
+ }
65
+
66
+ /* NEG */
67
+ static VALUE s_read_small_negative_int(sereal_t *s, u8 tag) {
68
+ return INT2FIX(tag - 32);
69
+ }
70
+
71
+ /* ARRAY */
72
+ static inline VALUE s_read_array_with_len(sereal_t *s, u32 len) {
73
+ VALUE arr[len];
74
+ register u32 i;
75
+ for (i = 0; i < len; i++)
76
+ arr[i] = sereal_to_rb_object(s);
77
+ return rb_ary_new4(len,arr);
78
+ }
79
+
80
+ /* ARRAY */
81
+ static VALUE s_read_array(sereal_t *s,u8 tag) {
82
+ return s_read_array_with_len(s,s_get_varint_bang(s));
83
+ }
84
+
85
+ /* ARRAY */
86
+ static VALUE s_read_arrayref(sereal_t *s, u8 tag) {
87
+ return s_read_array_with_len(s,tag & SRL_MASK_ARRAYREF_COUNT);
88
+ }
89
+
90
+ /* HASH */
91
+ static inline VALUE s_read_hash_with_len(sereal_t *s, u32 len) {
92
+ VALUE hash = rb_hash_new();
93
+ register u32 i;
94
+ for (i = 0; i < len; i++) {
95
+ VALUE key = sereal_to_rb_object(s);
96
+ VALUE value = sereal_to_rb_object(s);
97
+ rb_hash_aset(hash,key,value);
98
+ }
99
+ return hash;
100
+ }
101
+ /* HASH */
102
+ static VALUE s_read_hash(sereal_t *s, u8 tag) {
103
+ return s_read_hash_with_len(s,s_get_varint_bang(s));
104
+ }
105
+ /* HASH */
106
+ static VALUE s_read_hashref(sereal_t *s, u8 tag) {
107
+ return s_read_hash_with_len(s,tag & SRL_MASK_HASHREF_COUNT);
108
+ }
109
+ static VALUE s_read_rb_string_bang(sereal_t *s,u8 t) {
110
+ u32 len = 0;
111
+ VALUE string;
112
+ #define RETURN_STRING(fx_l,fx_gen) \
113
+ do { \
114
+ len = fx_l; \
115
+ string = fx_gen; \
116
+ s_shift_position_bang(s,len); \
117
+ return string; \
118
+ } while(0);
119
+ if (t == SRL_HDR_STR_UTF8) {
120
+ RETURN_STRING(s_get_varint_bang(s),
121
+ rb_enc_str_new(s_get_p(s),len,
122
+ rb_utf8_encoding()));
123
+ } else if (t == SRL_HDR_BINARY || t == SRL_HDR_SYM) {
124
+ RETURN_STRING(s_get_varint_bang(s),
125
+ rb_str_new(s_get_p(s),len));
126
+ } else if (IS_SHORT_BINARY(t)) {
127
+ RETURN_STRING((t & SRL_MASK_SHORT_BINARY_LEN),
128
+ rb_str_new(s_get_p(s), len));
129
+ }
130
+ #undef RETURN_STRING
131
+ rb_raise(rb_eTypeError, "undefined string type %d",t);
132
+ }
133
+
134
+ static VALUE s_read_next_rb_string_bang(sereal_t *s) {
135
+ return s_read_rb_string_bang(s,s_get_u8_bang(s));
136
+ }
137
+
138
+ static VALUE s_read_regexp(sereal_t *s, u8 tag) {
139
+ VALUE pattern = s_read_next_rb_string_bang(s);
140
+ VALUE modifiers = s_read_next_rb_string_bang(s);
141
+
142
+ u32 flags = 0;
143
+ if (strchr(RSTRING_PTR(modifiers),'i'))
144
+ flags |= IGNORECASE;
145
+
146
+ if (strchr(RSTRING_PTR(modifiers),'m'))
147
+ flags |= MULTILINE;
148
+
149
+ if (strchr(RSTRING_PTR(modifiers),'x'))
150
+ flags |= EXTENDED;
151
+ #ifdef RUBINIUS
152
+ return rb_reg_new(RSTRING_PTR(pattern),RSTRING_LEN(pattern),flags);
153
+ #else
154
+ return rb_reg_new_str(pattern,flags);
155
+ #endif
156
+ }
157
+
158
+ static VALUE s_read_nil(sereal_t *s, u8 tag) {
159
+ return Qnil;
160
+ }
161
+
162
+ static VALUE s_read_true(sereal_t *s, u8 tag) {
163
+ return Qtrue;
164
+ }
165
+
166
+ static VALUE s_read_false(sereal_t *s, u8 tag) {
167
+ return Qfalse;
168
+ }
169
+
170
+ static VALUE s_read_pad(sereal_t *s, u8 tag) {
171
+ /* just skip this byte and go forward */
172
+ return sereal_to_rb_object(s);
173
+ }
174
+ static VALUE s_read_extend(sereal_t *s, u8 tag) {
175
+ rb_raise(rb_eArgError,"extend tags are not supported");
176
+ }
177
+
178
+ VALUE sereal_to_rb_object(sereal_t *s) {
179
+ u8 t;
180
+ S_RECURSE_INC(s);
181
+ while (s->pos < s->size) {
182
+ t = s_get_u8_bang(s);
183
+ if (t & SRL_HDR_TRACK_FLAG)
184
+ rb_raise(rb_eArgError, "trackable objects are not supported");
185
+ S_RECURSE_DEC(s);
186
+ return (*READERS[t])(s,t);
187
+ }
188
+ return Qnil;
189
+ }
190
+
191
+ VALUE method_sereal_decode(VALUE self, VALUE args) {
192
+ u32 argc = RARRAY_LEN(args);
193
+ if (argc < 1)
194
+ rb_raise(rb_eArgError,"need at least 1 argument (object)");
195
+ VALUE payload = rb_ary_shift(args);
196
+ VALUE safe = Qtrue;
197
+ if (TYPE(payload) != T_STRING)
198
+ rb_raise(rb_eTypeError,"can not decode objects of type %s",rb_obj_classname(payload));
199
+
200
+ sereal_t *s = s_create();
201
+ s->data = RSTRING_PTR(payload);
202
+ s->size = RSTRING_LEN(payload);
203
+
204
+ if (s->size < 6 || s_get_u32_bang(s) != 0x6c72733d)
205
+ rb_raise(rb_eTypeError,"invalid header");
206
+
207
+ u8 version = s_get_u8_bang(s);
208
+ u8 suffix = s_get_varint_bang(s);
209
+ int is_compressed = (version & SRL_PROTOCOL_ENCODING_MASK) == SRL_PROTOCOL_ENCODING_SNAPPY ? TRUE : FALSE;
210
+
211
+ if (is_compressed) {
212
+ u32 uncompressed_len;
213
+ int snappy_header_len = csnappy_get_uncompressed_length(s_get_p(s),
214
+ (s->size - s->pos),
215
+ &uncompressed_len);
216
+ if (snappy_header_len == CSNAPPY_E_HEADER_BAD)
217
+ rb_raise(rb_eTypeError,"invalid snappy header");
218
+
219
+ u8 *uncompressed = alloc_or_raise(uncompressed_len);
220
+ int done = csnappy_decompress(s_get_p(s),
221
+ (s->size - s->pos),
222
+ uncompressed,
223
+ uncompressed_len);
224
+ if (done)
225
+ rb_raise(rb_eTypeError, "snappy decompression failed error: %d",done);
226
+ s->data = uncompressed;
227
+ s->size = uncompressed_len;
228
+ s->pos = 0;
229
+ }
230
+
231
+ VALUE result = sereal_to_rb_object(s);
232
+ if (is_compressed)
233
+ s_destroy(s);
234
+ else
235
+ free(s); // we do not destroy because it will free s->data which is RSTRING_PTR(payload)
236
+ return result;
237
+ }
238
+
@@ -0,0 +1,282 @@
1
+ VALUE sereal_to_rb_object(sereal_t *s);
2
+ static VALUE s_default_reader(sereal_t *s, u8 tag);
3
+ static VALUE s_read_zigzag(sereal_t *s, u8 tag);
4
+ static VALUE s_read_varint(sereal_t *s, u8 tag);
5
+ static VALUE s_read_float(sereal_t *s, u8 tag);
6
+ static VALUE s_read_double(sereal_t *s, u8 tag);
7
+ static VALUE s_read_long_double(sereal_t *s, u8 tag);
8
+ static VALUE s_read_small_positive_int(sereal_t *s, u8 tag);
9
+ static VALUE s_read_small_negative_int(sereal_t *s, u8 tag);
10
+ static VALUE s_read_array(sereal_t *s,u8 tag);
11
+ static VALUE s_read_arrayref(sereal_t *s, u8 tag);
12
+ static VALUE s_read_hash(sereal_t *s, u8 tag);
13
+ static VALUE s_read_hashref(sereal_t *s, u8 tag);
14
+ static VALUE s_read_rb_string_bang(sereal_t *s,u8 t);
15
+ static VALUE s_read_next_rb_string_bang(sereal_t *s);
16
+ static VALUE s_read_object(sereal_t *s,u8 tag);
17
+ static VALUE s_read_regexp(sereal_t *s, u8 tag);
18
+ static VALUE s_read_sym(sereal_t *s,u8 tag);
19
+ static VALUE s_read_nil(sereal_t *s, u8 tag);
20
+ static VALUE s_read_true(sereal_t *s, u8 tag);
21
+ static VALUE s_read_false(sereal_t *s, u8 tag);
22
+ static VALUE s_read_pad(sereal_t *s, u8 tag);
23
+ static VALUE s_read_extend(sereal_t *s, u8 tag);
24
+
25
+ static VALUE (*READERS[256])(sereal_t *, u8) = {
26
+ s_read_small_positive_int, // 0 SRL_HDR_POS_LOW
27
+ s_read_small_positive_int, // 1
28
+ s_read_small_positive_int, // 2
29
+ s_read_small_positive_int, // 3
30
+ s_read_small_positive_int, // 4
31
+ s_read_small_positive_int, // 5
32
+ s_read_small_positive_int, // 6
33
+ s_read_small_positive_int, // 7
34
+ s_read_small_positive_int, // 8
35
+ s_read_small_positive_int, // 9
36
+ s_read_small_positive_int, // 10
37
+ s_read_small_positive_int, // 11
38
+ s_read_small_positive_int, // 12
39
+ s_read_small_positive_int, // 13
40
+ s_read_small_positive_int, // 14
41
+ s_read_small_positive_int, // 15 SRL_HDR_POS_HIGH
42
+ s_read_small_negative_int, // 16 SRL_HDR_NEG_LOW
43
+ s_read_small_negative_int, // 17
44
+ s_read_small_negative_int, // 18
45
+ s_read_small_negative_int, // 19
46
+ s_read_small_negative_int, // 20
47
+ s_read_small_negative_int, // 21
48
+ s_read_small_negative_int, // 22
49
+ s_read_small_negative_int, // 23
50
+ s_read_small_negative_int, // 24
51
+ s_read_small_negative_int, // 25
52
+ s_read_small_negative_int, // 26
53
+ s_read_small_negative_int, // 27
54
+ s_read_small_negative_int, // 28
55
+ s_read_small_negative_int, // 29
56
+ s_read_small_negative_int, // 30
57
+ s_read_small_negative_int, // 31 SRL_HDR_NEG_HIGH
58
+ s_read_varint, // 32 SRL_HDR_VARINT
59
+ s_read_zigzag, // 33 SRL_HDR_ZIGZAG
60
+ s_read_float, // 34 SRL_HDR_FLOAT
61
+ s_read_double, // 35 SRL_HDR_DOUBLE
62
+ s_read_long_double, // 36 SRL_HDR_LONG_DOUBLE
63
+ s_read_nil, // 37 SRL_HDR_UNDEF
64
+ s_read_rb_string_bang, // 38 SRL_HDR_BINARY
65
+ s_read_rb_string_bang, // 39 SRL_HDR_STR_UTF8
66
+ s_default_reader, /* XXX */ // 40 SRL_HDR_REFN
67
+ s_default_reader, /* XXX */ // 41 SRL_HDR_REFP
68
+ s_read_hash, // 42 SRL_HDR_HASH
69
+ s_read_array, // 43 SRL_HDR_ARRAY
70
+ s_default_reader, /* XXX */ // 44 SRL_HDR_OBJECT
71
+ s_default_reader, /* XXX */ // 45 SRL_HDR_OBJECTV
72
+ s_default_reader, /* XXX */ // 46 SRL_HDR_ALIAS
73
+ s_default_reader, /* XXX */ // 47 SRL_HDR_COPY
74
+ s_default_reader, /* XXX */ // 48 SRL_HDR_WEAKEN
75
+ s_read_regexp, // 49 SRL_HDR_REGEXP
76
+ s_default_reader, /* XXX */ // 50 SRL_HDR_RESERVED_LOW
77
+ s_default_reader, /* XXX */ // 51
78
+ s_default_reader, /* XXX */ // 52
79
+ s_default_reader, /* XXX */ // 53
80
+ s_default_reader, /* XXX */ // 54
81
+ s_default_reader, /* XXX */ // 55
82
+ s_default_reader, /* XXX */ // 56
83
+ s_default_reader, /* XXX */ // 57 SRL_HDR_RESERVED_HIGH
84
+ s_read_false, // 58 SRL_HDR_FALSE
85
+ s_read_true, // 59 SRL_HDR_TRUE
86
+ s_default_reader, /* XXX */ // 60 SRL_HDR_MANY
87
+ s_default_reader, /* XXX */ // 61 SRL_HDR_PACKET_START
88
+ s_read_extend, // 62 SRL_HDR_EXTEND
89
+ s_read_pad, // 63 SRL_HDR_PAD
90
+ s_read_arrayref, // 64 SRL_HDR_ARRAYREF_LOW
91
+ s_read_arrayref, // 65
92
+ s_read_arrayref, // 66
93
+ s_read_arrayref, // 67
94
+ s_read_arrayref, // 68
95
+ s_read_arrayref, // 69
96
+ s_read_arrayref, // 70
97
+ s_read_arrayref, // 71
98
+ s_read_arrayref, // 72
99
+ s_read_arrayref, // 73
100
+ s_read_arrayref, // 74
101
+ s_read_arrayref, // 75
102
+ s_read_arrayref, // 76
103
+ s_read_arrayref, // 77
104
+ s_read_arrayref, // 78
105
+ s_read_arrayref, // 79 SRL_HDR_ARRAYREF_HIGH
106
+ s_read_hashref, // 80 SRL_HDR_HASHREF_LOW
107
+ s_read_hashref, // 81
108
+ s_read_hashref, // 82
109
+ s_read_hashref, // 83
110
+ s_read_hashref, // 84
111
+ s_read_hashref, // 85
112
+ s_read_hashref, // 86
113
+ s_read_hashref, // 87
114
+ s_read_hashref, // 88
115
+ s_read_hashref, // 89
116
+ s_read_hashref, // 90
117
+ s_read_hashref, // 91
118
+ s_read_hashref, // 92
119
+ s_read_hashref, // 93
120
+ s_read_hashref, // 94
121
+ s_read_hashref, // 95 SRL_HDR_HASHREF_HIGH
122
+ s_read_rb_string_bang, // 96 SRL_HDR_SHORT_BINARY_LOW
123
+ s_read_rb_string_bang, // 97
124
+ s_read_rb_string_bang, // 98
125
+ s_read_rb_string_bang, // 99
126
+ s_read_rb_string_bang, // 100
127
+ s_read_rb_string_bang, // 101
128
+ s_read_rb_string_bang, // 102
129
+ s_read_rb_string_bang, // 103
130
+ s_read_rb_string_bang, // 104
131
+ s_read_rb_string_bang, // 105
132
+ s_read_rb_string_bang, // 106
133
+ s_read_rb_string_bang, // 107
134
+ s_read_rb_string_bang, // 108
135
+ s_read_rb_string_bang, // 109
136
+ s_read_rb_string_bang, // 110
137
+ s_read_rb_string_bang, // 111
138
+ s_read_rb_string_bang, // 112
139
+ s_read_rb_string_bang, // 113
140
+ s_read_rb_string_bang, // 114
141
+ s_read_rb_string_bang, // 115
142
+ s_read_rb_string_bang, // 116
143
+ s_read_rb_string_bang, // 117
144
+ s_read_rb_string_bang, // 118
145
+ s_read_rb_string_bang, // 119
146
+ s_read_rb_string_bang, // 120
147
+ s_read_rb_string_bang, // 121
148
+ s_read_rb_string_bang, // 122
149
+ s_read_rb_string_bang, // 123
150
+ s_read_rb_string_bang, // 124
151
+ s_read_rb_string_bang, // 125
152
+ s_read_rb_string_bang, // 126
153
+ s_read_rb_string_bang, // 127
154
+ s_default_reader, /* XXX */ // 128 SRL_HDR_TRACK_FLAG
155
+ s_default_reader, /* XXX */ // 129
156
+ s_default_reader, /* XXX */ // 130
157
+ s_default_reader, /* XXX */ // 131
158
+ s_default_reader, /* XXX */ // 132
159
+ s_default_reader, /* XXX */ // 133
160
+ s_default_reader, /* XXX */ // 134
161
+ s_default_reader, /* XXX */ // 135
162
+ s_default_reader, /* XXX */ // 136
163
+ s_default_reader, /* XXX */ // 137
164
+ s_default_reader, /* XXX */ // 138
165
+ s_default_reader, /* XXX */ // 139
166
+ s_default_reader, /* XXX */ // 140
167
+ s_default_reader, /* XXX */ // 141
168
+ s_default_reader, /* XXX */ // 142
169
+ s_default_reader, /* XXX */ // 143
170
+ s_default_reader, /* XXX */ // 144
171
+ s_default_reader, /* XXX */ // 145
172
+ s_default_reader, /* XXX */ // 146
173
+ s_default_reader, /* XXX */ // 147
174
+ s_default_reader, /* XXX */ // 148
175
+ s_default_reader, /* XXX */ // 149
176
+ s_default_reader, /* XXX */ // 150
177
+ s_default_reader, /* XXX */ // 151
178
+ s_default_reader, /* XXX */ // 152
179
+ s_default_reader, /* XXX */ // 153
180
+ s_default_reader, /* XXX */ // 154
181
+ s_default_reader, /* XXX */ // 155
182
+ s_default_reader, /* XXX */ // 156
183
+ s_default_reader, /* XXX */ // 157
184
+ s_default_reader, /* XXX */ // 158
185
+ s_default_reader, /* XXX */ // 159
186
+ s_default_reader, /* XXX */ // 160
187
+ s_default_reader, /* XXX */ // 161
188
+ s_default_reader, /* XXX */ // 162
189
+ s_default_reader, /* XXX */ // 163
190
+ s_default_reader, /* XXX */ // 164
191
+ s_default_reader, /* XXX */ // 165
192
+ s_default_reader, /* XXX */ // 166
193
+ s_default_reader, /* XXX */ // 167
194
+ s_default_reader, /* XXX */ // 168
195
+ s_default_reader, /* XXX */ // 169
196
+ s_default_reader, /* XXX */ // 170
197
+ s_default_reader, /* XXX */ // 171
198
+ s_default_reader, /* XXX */ // 172
199
+ s_default_reader, /* XXX */ // 173
200
+ s_default_reader, /* XXX */ // 174
201
+ s_default_reader, /* XXX */ // 175
202
+ s_default_reader, /* XXX */ // 176
203
+ s_default_reader, /* XXX */ // 177
204
+ s_default_reader, /* XXX */ // 178
205
+ s_default_reader, /* XXX */ // 179
206
+ s_default_reader, /* XXX */ // 180
207
+ s_default_reader, /* XXX */ // 181
208
+ s_default_reader, /* XXX */ // 182
209
+ s_default_reader, /* XXX */ // 183
210
+ s_default_reader, /* XXX */ // 184
211
+ s_default_reader, /* XXX */ // 185
212
+ s_default_reader, /* XXX */ // 186
213
+ s_default_reader, /* XXX */ // 187
214
+ s_default_reader, /* XXX */ // 188
215
+ s_default_reader, /* XXX */ // 189
216
+ s_default_reader, /* XXX */ // 190
217
+ s_default_reader, /* XXX */ // 191
218
+ s_default_reader, /* XXX */ // 192
219
+ s_default_reader, /* XXX */ // 193
220
+ s_default_reader, /* XXX */ // 194
221
+ s_default_reader, /* XXX */ // 195
222
+ s_default_reader, /* XXX */ // 196
223
+ s_default_reader, /* XXX */ // 197
224
+ s_default_reader, /* XXX */ // 198
225
+ s_default_reader, /* XXX */ // 199
226
+ s_default_reader, /* XXX */ // 200
227
+ s_default_reader, /* XXX */ // 201
228
+ s_default_reader, /* XXX */ // 202
229
+ s_default_reader, /* XXX */ // 203
230
+ s_default_reader, /* XXX */ // 204
231
+ s_default_reader, /* XXX */ // 205
232
+ s_default_reader, /* XXX */ // 206
233
+ s_default_reader, /* XXX */ // 207
234
+ s_default_reader, /* XXX */ // 208
235
+ s_default_reader, /* XXX */ // 209
236
+ s_default_reader, /* XXX */ // 210
237
+ s_default_reader, /* XXX */ // 211
238
+ s_default_reader, /* XXX */ // 212
239
+ s_default_reader, /* XXX */ // 213
240
+ s_default_reader, /* XXX */ // 214
241
+ s_default_reader, /* XXX */ // 215
242
+ s_default_reader, /* XXX */ // 216
243
+ s_default_reader, /* XXX */ // 217
244
+ s_default_reader, /* XXX */ // 218
245
+ s_default_reader, /* XXX */ // 219
246
+ s_default_reader, /* XXX */ // 220
247
+ s_default_reader, /* XXX */ // 221
248
+ s_default_reader, /* XXX */ // 222
249
+ s_default_reader, /* XXX */ // 223
250
+ s_default_reader, /* XXX */ // 224
251
+ s_default_reader, /* XXX */ // 225
252
+ s_default_reader, /* XXX */ // 226
253
+ s_default_reader, /* XXX */ // 227
254
+ s_default_reader, /* XXX */ // 228
255
+ s_default_reader, /* XXX */ // 229
256
+ s_default_reader, /* XXX */ // 230
257
+ s_default_reader, /* XXX */ // 231
258
+ s_default_reader, /* XXX */ // 232
259
+ s_default_reader, /* XXX */ // 233
260
+ s_default_reader, /* XXX */ // 234
261
+ s_default_reader, /* XXX */ // 235
262
+ s_default_reader, /* XXX */ // 236
263
+ s_default_reader, /* XXX */ // 237
264
+ s_default_reader, /* XXX */ // 238
265
+ s_default_reader, /* XXX */ // 239
266
+ s_default_reader, /* XXX */ // 240
267
+ s_default_reader, /* XXX */ // 241
268
+ s_default_reader, /* XXX */ // 242
269
+ s_default_reader, /* XXX */ // 243
270
+ s_default_reader, /* XXX */ // 244
271
+ s_default_reader, /* XXX */ // 245
272
+ s_default_reader, /* XXX */ // 246
273
+ s_default_reader, /* XXX */ // 247
274
+ s_default_reader, /* XXX */ // 248
275
+ s_default_reader, /* XXX */ // 249
276
+ s_default_reader, /* XXX */ // 250
277
+ s_default_reader, /* XXX */ // 251
278
+ s_default_reader, /* XXX */ // 252
279
+ s_default_reader, /* XXX */ // 253
280
+ s_default_reader, /* XXX */ // 254
281
+ s_default_reader /* XXX */ // 255
282
+ };