rcstorable 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/ext/rcstorable.c +4 -1
- data/ext/rcstorable.html +332 -0
- data/spec/store.pl +13 -1
- metadata +4 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
data/ext/rcstorable.c
CHANGED
@@ -160,7 +160,10 @@ static void
|
|
160
160
|
read_n_array_entries(VALUE array, uint32_t num)
|
161
161
|
{
|
162
162
|
if (num == 0) { return; }
|
163
|
-
read_compact_size();
|
163
|
+
/* read_compact_size();
|
164
|
+
* This is apparently not used. It is instead a typed value.
|
165
|
+
* Perhaps this is what the \004 prefix on some types means? We'll see if we get
|
166
|
+
* other errors now. */
|
164
167
|
rb_ary_push(array, read_object());
|
165
168
|
read_n_array_entries(array, num-1);
|
166
169
|
}
|
data/ext/rcstorable.html
ADDED
@@ -0,0 +1,332 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
5
|
+
<title>rcstorable.c</title>
|
6
|
+
<link rel="stylesheet" href="http://jashkenas.github.com/docco/resources/docco.css">
|
7
|
+
<style>
|
8
|
+
@font-face {
|
9
|
+
font-family: 'PragmataTTRegular';
|
10
|
+
src: url('pragmata.eot');
|
11
|
+
src: local('Pragmata TT'), local('PragmataTT'), url('pragmata.woff') format('woff'), url('pragmata.ttf') format('truetype');
|
12
|
+
}
|
13
|
+
.highlight {
|
14
|
+
font-family: 'PragmataTTRegular';
|
15
|
+
}
|
16
|
+
</style>
|
17
|
+
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id='container'>
|
21
|
+
<div id="background"></div>
|
22
|
+
<table cellspacing=0 cellpadding=0>
|
23
|
+
<thead>
|
24
|
+
<tr>
|
25
|
+
<th class=docs><h1>rcstorable.c</h1></th>
|
26
|
+
<th class=code></th>
|
27
|
+
</tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
<tr id='section-1'>
|
31
|
+
<td class=docs>
|
32
|
+
<div class="octowrap">
|
33
|
+
<a class="octothorpe" href="#section-1">#</a>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
</td>
|
37
|
+
<td class=code>
|
38
|
+
<div class='highlight'><pre><span class="cp">#include <stdbool.h></span>
|
39
|
+
<span class="cp">#include <stdio.h></span>
|
40
|
+
<span class="cp">#include <string.h></span>
|
41
|
+
<span class="cp">#include <stdint.h></span>
|
42
|
+
|
43
|
+
<span class="cp">#include "ruby.h"</span>
|
44
|
+
|
45
|
+
<span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">uchar</span><span class="p">;</span>
|
46
|
+
|
47
|
+
<span class="n">VALUE</span> <span class="n">thaw</span><span class="p">(</span><span class="n">VALUE</span><span class="p">,</span> <span class="n">VALUE</span><span class="p">);</span>
|
48
|
+
<span class="k">static</span> <span class="n">VALUE</span> <span class="n">read_object</span><span class="p">();</span>
|
49
|
+
<span class="k">static</span> <span class="n">VALUE</span> <span class="n">read_boolean</span><span class="p">();</span>
|
50
|
+
<span class="k">static</span> <span class="kt">uint32_t</span> <span class="n">read_32_bit_integer</span><span class="p">();</span>
|
51
|
+
<span class="k">static</span> <span class="kt">uint32_t</span> <span class="n">read_compact_size</span><span class="p">();</span>
|
52
|
+
<span class="k">static</span> <span class="kt">void</span> <span class="n">read_n_hash_pairs</span><span class="p">(</span><span class="n">VALUE</span><span class="p">,</span> <span class="kt">uint32_t</span><span class="p">);</span>
|
53
|
+
<span class="k">static</span> <span class="kt">void</span> <span class="n">read_n_array_entries</span><span class="p">(</span><span class="n">VALUE</span><span class="p">,</span> <span class="kt">uint32_t</span><span class="p">);</span>
|
54
|
+
<span class="k">static</span> <span class="n">VALUE</span> <span class="n">read_string</span><span class="p">(</span><span class="n">bool</span><span class="p">);</span>
|
55
|
+
<span class="k">static</span> <span class="kt">void</span> <span class="n">read_magic_numbers</span><span class="p">();</span>
|
56
|
+
<span class="k">static</span> <span class="kt">void</span> <span class="n">check_pointer</span><span class="p">(</span><span class="n">uchar</span><span class="o">*</span><span class="p">);</span>
|
57
|
+
|
58
|
+
<span class="k">enum</span> <span class="n">perl_types</span>
|
59
|
+
<span class="p">{</span>
|
60
|
+
<span class="n">PT_HASH_KEY</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
|
61
|
+
<span class="n">PT_ARRAY</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
|
62
|
+
<span class="n">PT_HASH</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span>
|
63
|
+
<span class="n">PT_VECTOR</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span>
|
64
|
+
<span class="n">PT_UNDEF</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
|
65
|
+
<span class="n">PT_BOOLEAN</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span>
|
66
|
+
<span class="n">PT_INT32</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span>
|
67
|
+
<span class="n">PT_STRING</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
|
68
|
+
<span class="n">PT_STRING_ALT</span> <span class="o">=</span> <span class="mi">23</span>
|
69
|
+
<span class="p">};</span>
|
70
|
+
|
71
|
+
<span class="c">// Used globally. Raptors. I know.</span>
|
72
|
+
<span class="k">static</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
73
|
+
<span class="k">static</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized_end</span><span class="p">;</span></pre></div>
|
74
|
+
</td>
|
75
|
+
</tr>
|
76
|
+
<tr id='section-2'>
|
77
|
+
<td class=docs>
|
78
|
+
<div class="octowrap">
|
79
|
+
<a class="octothorpe" href="#section-2">#</a>
|
80
|
+
</div>
|
81
|
+
<p> Given a perl Storable frozen blob, decode it into a ruby data structure.</p>
|
82
|
+
</td>
|
83
|
+
<td class=code>
|
84
|
+
<div class='highlight'><pre><span class="n">VALUE</span>
|
85
|
+
<span class="nf">thaw</span><span class="p">(</span><span class="n">VALUE</span> <span class="n">self</span><span class="p">,</span> <span class="n">VALUE</span> <span class="n">str</span><span class="p">)</span>
|
86
|
+
<span class="p">{</span>
|
87
|
+
<span class="k">if</span> <span class="p">(</span><span class="n">str</span> <span class="o">==</span> <span class="n">Qnil</span><span class="p">)</span> <span class="k">return</span> <span class="n">Qnil</span><span class="p">;</span> <span class="c">// Do something logical with nil.</span>
|
88
|
+
|
89
|
+
<span class="n">Check_Type</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">T_STRING</span><span class="p">);</span>
|
90
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">,</span> <span class="o">*</span><span class="n">serialized_end</span><span class="p">;</span>
|
91
|
+
|
92
|
+
<span class="n">serialized</span> <span class="o">=</span> <span class="n">RSTRING_PTR</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
|
93
|
+
<span class="n">serialized_end</span> <span class="o">=</span> <span class="n">serialized</span> <span class="o">+</span> <span class="n">RSTRING_LEN</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
|
94
|
+
|
95
|
+
<span class="n">read_magic_numbers</span><span class="p">();</span>
|
96
|
+
|
97
|
+
<span class="k">return</span> <span class="n">read_object</span><span class="p">();</span>
|
98
|
+
<span class="p">}</span></pre></div>
|
99
|
+
</td>
|
100
|
+
</tr>
|
101
|
+
<tr id='section-3'>
|
102
|
+
<td class=docs>
|
103
|
+
<div class="octowrap">
|
104
|
+
<a class="octothorpe" href="#section-3">#</a>
|
105
|
+
</div>
|
106
|
+
<p> Malformed strings can theoretically cause segfaults. Segfaults are bad.
|
107
|
+
We’ll check pretty much everything we do against the pre-computed end-of-string.</p>
|
108
|
+
</td>
|
109
|
+
<td class=code>
|
110
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">void</span>
|
111
|
+
<span class="nf">check_pointer</span><span class="p">(</span><span class="n">uchar</span> <span class="o">*</span><span class="n">ptr</span><span class="p">)</span>
|
112
|
+
<span class="p">{</span>
|
113
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized_end</span><span class="p">;</span>
|
114
|
+
<span class="k">if</span> <span class="p">(</span><span class="n">ptr</span> <span class="o">></span> <span class="n">serialized_end</span><span class="p">)</span> <span class="p">{</span>
|
115
|
+
<span class="n">rb_raise</span><span class="p">(</span><span class="n">rb_eRangeError</span><span class="p">,</span> <span class="s">"malformed data"</span><span class="p">);</span>
|
116
|
+
<span class="p">}</span>
|
117
|
+
<span class="p">}</span></pre></div>
|
118
|
+
</td>
|
119
|
+
</tr>
|
120
|
+
<tr id='section-4'>
|
121
|
+
<td class=docs>
|
122
|
+
<div class="octowrap">
|
123
|
+
<a class="octothorpe" href="#section-4">#</a>
|
124
|
+
</div>
|
125
|
+
<p> Certain test cases start with \005\006. Other ones don’t.
|
126
|
+
This will need to be fixed eventually.</p>
|
127
|
+
</td>
|
128
|
+
<td class=code>
|
129
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">void</span>
|
130
|
+
<span class="nf">read_magic_numbers</span><span class="p">()</span>
|
131
|
+
<span class="p">{</span>
|
132
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
133
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
|
134
|
+
<span class="n">serialized</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
|
135
|
+
<span class="p">}</span></pre></div>
|
136
|
+
</td>
|
137
|
+
</tr>
|
138
|
+
<tr id='section-5'>
|
139
|
+
<td class=docs>
|
140
|
+
<div class="octowrap">
|
141
|
+
<a class="octothorpe" href="#section-5">#</a>
|
142
|
+
</div>
|
143
|
+
<p> Figure out what type of object is at the front of serialized, read it in, potentially
|
144
|
+
recursively creating several other sub-objects in the process, and return it.</p>
|
145
|
+
</td>
|
146
|
+
<td class=code>
|
147
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="n">VALUE</span>
|
148
|
+
<span class="nf">read_object</span><span class="p">()</span>
|
149
|
+
<span class="p">{</span>
|
150
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
151
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="p">);</span>
|
152
|
+
<span class="kt">uint32_t</span> <span class="n">type</span> <span class="o">=</span> <span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">;</span>
|
153
|
+
<span class="kt">uint32_t</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
154
|
+
|
155
|
+
<span class="n">VALUE</span> <span class="n">object</span> <span class="o">=</span> <span class="n">Qnil</span><span class="p">;</span>
|
156
|
+
|
157
|
+
<span class="k">switch</span><span class="p">(</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
|
158
|
+
<span class="k">case</span> <span class="n">PT_UNDEF</span>:
|
159
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">Qnil</span><span class="p">;</span>
|
160
|
+
<span class="k">break</span><span class="p">;</span>
|
161
|
+
<span class="k">case</span> <span class="n">PT_HASH</span>:
|
162
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">rb_hash_new</span><span class="p">();</span>
|
163
|
+
<span class="n">size</span> <span class="o">=</span> <span class="n">read_32_bit_integer</span><span class="p">();</span>
|
164
|
+
<span class="n">read_n_hash_pairs</span><span class="p">(</span><span class="n">object</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
|
165
|
+
<span class="k">break</span><span class="p">;</span>
|
166
|
+
<span class="k">case</span> <span class="n">PT_INT32</span>:
|
167
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">INT2FIX</span><span class="p">(</span><span class="n">read_32_bit_integer</span><span class="p">());</span>
|
168
|
+
<span class="k">break</span><span class="p">;</span>
|
169
|
+
<span class="k">case</span> <span class="n">PT_ARRAY</span>:
|
170
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">rb_ary_new</span><span class="p">();</span>
|
171
|
+
<span class="n">size</span> <span class="o">=</span> <span class="n">read_32_bit_integer</span><span class="p">();</span>
|
172
|
+
<span class="n">read_n_array_entries</span><span class="p">(</span><span class="n">object</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
|
173
|
+
<span class="k">break</span><span class="p">;</span>
|
174
|
+
<span class="k">case</span> <span class="n">PT_BOOLEAN</span>:
|
175
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">read_boolean</span><span class="p">();</span>
|
176
|
+
<span class="k">break</span><span class="p">;</span>
|
177
|
+
<span class="k">case</span> <span class="n">PT_STRING</span>:
|
178
|
+
<span class="k">case</span> <span class="n">PT_STRING_ALT</span>:
|
179
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">read_string</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
|
180
|
+
<span class="k">break</span><span class="p">;</span>
|
181
|
+
<span class="k">case</span> <span class="n">PT_VECTOR</span>:
|
182
|
+
<span class="n">object</span> <span class="o">=</span> <span class="n">read_object</span><span class="p">();</span> <span class="c">// This is a marker we can just ignore...</span>
|
183
|
+
<span class="k">break</span><span class="p">;</span>
|
184
|
+
<span class="p">}</span>
|
185
|
+
|
186
|
+
<span class="k">return</span> <span class="n">object</span><span class="p">;</span>
|
187
|
+
<span class="p">}</span>
|
188
|
+
|
189
|
+
<span class="cp"> </span></pre></div>
|
190
|
+
</td>
|
191
|
+
</tr>
|
192
|
+
<tr id='section-6'>
|
193
|
+
<td class=docs>
|
194
|
+
<div class="octowrap">
|
195
|
+
<a class="octothorpe" href="#section-6">#</a>
|
196
|
+
</div>
|
197
|
+
<p> We’ve already created a hash, and read the size of it.
|
198
|
+
Now we need to read in n items, and add them to the hash.</p>
|
199
|
+
</td>
|
200
|
+
<td class=code>
|
201
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">void</span>
|
202
|
+
<span class="nf">read_n_hash_pairs</span><span class="p">(</span><span class="n">VALUE</span> <span class="n">hash</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">num</span><span class="p">)</span>
|
203
|
+
<span class="p">{</span>
|
204
|
+
<span class="k">if</span> <span class="p">(</span><span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
|
205
|
+
<span class="n">VALUE</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">read_object</span><span class="p">();</span>
|
206
|
+
<span class="n">rb_hash_aset</span><span class="p">(</span><span class="n">hash</span><span class="p">,</span> <span class="n">read_string</span><span class="p">(</span><span class="nb">true</span><span class="p">),</span> <span class="n">temp</span><span class="p">);</span>
|
207
|
+
<span class="n">read_n_hash_pairs</span><span class="p">(</span><span class="n">hash</span><span class="p">,</span> <span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
|
208
|
+
<span class="p">}</span>
|
209
|
+
|
210
|
+
<span class="k">static</span> <span class="n">VALUE</span>
|
211
|
+
<span class="nf">read_boolean</span><span class="p">()</span>
|
212
|
+
<span class="p">{</span>
|
213
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
214
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="p">);</span>
|
215
|
+
<span class="k">return</span> <span class="p">(</span><span class="o">*</span><span class="n">serialized</span><span class="o">++</span> <span class="o">==</span> <span class="mi">128</span><span class="p">)</span> <span class="o">?</span> <span class="n">Qfalse</span> <span class="o">:</span> <span class="n">Qtrue</span><span class="p">;</span>
|
216
|
+
<span class="p">}</span></pre></div>
|
217
|
+
</td>
|
218
|
+
</tr>
|
219
|
+
<tr id='section-7'>
|
220
|
+
<td class=docs>
|
221
|
+
<div class="octowrap">
|
222
|
+
<a class="octothorpe" href="#section-7">#</a>
|
223
|
+
</div>
|
224
|
+
<p> We’ve already created an array, and read the size of it.
|
225
|
+
Now we need to read in n items, and add them to the array.</p>
|
226
|
+
</td>
|
227
|
+
<td class=code>
|
228
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">void</span>
|
229
|
+
<span class="nf">read_n_array_entries</span><span class="p">(</span><span class="n">VALUE</span> <span class="n">array</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">num</span><span class="p">)</span>
|
230
|
+
<span class="p">{</span>
|
231
|
+
<span class="k">if</span> <span class="p">(</span><span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
|
232
|
+
<span class="n">rb_ary_push</span><span class="p">(</span><span class="n">array</span><span class="p">,</span> <span class="n">read_object</span><span class="p">());</span>
|
233
|
+
<span class="n">read_n_array_entries</span><span class="p">(</span><span class="n">array</span><span class="p">,</span> <span class="n">num</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
|
234
|
+
<span class="p">}</span></pre></div>
|
235
|
+
</td>
|
236
|
+
</tr>
|
237
|
+
<tr id='section-8'>
|
238
|
+
<td class=docs>
|
239
|
+
<div class="octowrap">
|
240
|
+
<a class="octothorpe" href="#section-8">#</a>
|
241
|
+
</div>
|
242
|
+
<p> Given a size, read in a string of that size. Note that Storable seems to use 319 as a
|
243
|
+
magic value, meaning the string should be read until a very low character is found.
|
244
|
+
I should test this more specifically, but it’s somewhere lower than “\t”, aka 7.</p>
|
245
|
+
</td>
|
246
|
+
<td class=code>
|
247
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="n">VALUE</span>
|
248
|
+
<span class="nf">read_string</span><span class="p">(</span><span class="n">bool</span> <span class="n">extended_size</span><span class="p">)</span>
|
249
|
+
<span class="p">{</span>
|
250
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
251
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="p">);</span>
|
252
|
+
|
253
|
+
<span class="n">VALUE</span> <span class="n">ret</span><span class="p">;</span>
|
254
|
+
<span class="kt">uint32_t</span> <span class="n">size</span> <span class="o">=</span> <span class="n">extended_size</span> <span class="o">?</span> <span class="n">read_32_bit_integer</span><span class="p">()</span> <span class="o">:</span> <span class="n">read_compact_size</span><span class="p">();</span>
|
255
|
+
<span class="kt">uint32_t</span> <span class="n">actual_size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
256
|
+
<span class="n">uchar</span> <span class="o">*</span><span class="n">tp</span> <span class="o">=</span> <span class="n">serialized</span><span class="p">;</span>
|
257
|
+
|
258
|
+
<span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="o">==</span> <span class="mi">319</span><span class="p">)</span> <span class="p">{</span> <span class="c">// apparently Storable uses \000\000\001\077 to mean "read until n<7"</span>
|
259
|
+
<span class="k">while</span> <span class="p">(</span><span class="o">*</span><span class="n">tp</span><span class="o">++</span> <span class="o">>=</span> <span class="mi">7</span><span class="p">)</span> <span class="p">{</span>
|
260
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">tp</span><span class="p">);</span>
|
261
|
+
<span class="n">actual_size</span><span class="o">++</span><span class="p">;</span>
|
262
|
+
<span class="p">}</span>
|
263
|
+
<span class="n">size</span> <span class="o">=</span> <span class="n">actual_size</span><span class="p">;</span>
|
264
|
+
<span class="p">}</span>
|
265
|
+
|
266
|
+
<span class="n">uchar</span> <span class="o">*</span><span class="n">np</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">size</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
|
267
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="o">+</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
|
268
|
+
<span class="n">memcpy</span><span class="p">(</span><span class="n">np</span><span class="p">,</span> <span class="n">serialized</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
|
269
|
+
<span class="n">serialized</span> <span class="o">+=</span> <span class="n">size</span><span class="p">;</span>
|
270
|
+
|
271
|
+
<span class="n">ret</span> <span class="o">=</span> <span class="n">rb_str_new</span><span class="p">(</span><span class="n">np</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
|
272
|
+
<span class="n">free</span><span class="p">(</span><span class="n">np</span><span class="p">);</span>
|
273
|
+
<span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
|
274
|
+
<span class="p">}</span></pre></div>
|
275
|
+
</td>
|
276
|
+
</tr>
|
277
|
+
<tr id='section-9'>
|
278
|
+
<td class=docs>
|
279
|
+
<div class="octowrap">
|
280
|
+
<a class="octothorpe" href="#section-9">#</a>
|
281
|
+
</div>
|
282
|
+
<p> Extended sizes are given as [w,x,y,z], where the size is 256*y + z.
|
283
|
+
This should really be read as a uint_32t, I guess.</p>
|
284
|
+
</td>
|
285
|
+
<td class=code>
|
286
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">uint32_t</span>
|
287
|
+
<span class="nf">read_32_bit_integer</span><span class="p">()</span>
|
288
|
+
<span class="p">{</span>
|
289
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
290
|
+
|
291
|
+
<span class="kt">uint32_t</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
292
|
+
|
293
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="o">+</span><span class="mi">3</span><span class="p">);</span>
|
294
|
+
|
295
|
+
<span class="c">// I don't want to deal with byte-order. This is just easier. </span>
|
296
|
+
<span class="n">size</span> <span class="o">+=</span> <span class="p">(</span><span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">)</span><span class="o">*</span><span class="mi">16777216</span><span class="p">;</span>
|
297
|
+
<span class="n">size</span> <span class="o">+=</span> <span class="p">(</span><span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">)</span><span class="o">*</span><span class="mi">65536</span><span class="p">;</span>
|
298
|
+
<span class="n">size</span> <span class="o">+=</span> <span class="p">(</span><span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">)</span><span class="o">*</span><span class="mi">256</span><span class="p">;</span>
|
299
|
+
<span class="n">size</span> <span class="o">+=</span> <span class="p">(</span><span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">);</span>
|
300
|
+
|
301
|
+
<span class="k">return</span> <span class="n">size</span><span class="p">;</span>
|
302
|
+
<span class="p">}</span></pre></div>
|
303
|
+
</td>
|
304
|
+
</tr>
|
305
|
+
<tr id='section-10'>
|
306
|
+
<td class=docs>
|
307
|
+
<div class="octowrap">
|
308
|
+
<a class="octothorpe" href="#section-10">#</a>
|
309
|
+
</div>
|
310
|
+
<p> Just one byte.</p>
|
311
|
+
|
312
|
+
</td>
|
313
|
+
<td class=code>
|
314
|
+
<div class='highlight'><pre><span class="k">static</span> <span class="kt">uint32_t</span>
|
315
|
+
<span class="nf">read_compact_size</span><span class="p">()</span> <span class="p">{</span>
|
316
|
+
<span class="k">extern</span> <span class="n">uchar</span> <span class="o">*</span><span class="n">serialized</span><span class="p">;</span>
|
317
|
+
<span class="n">check_pointer</span><span class="p">(</span><span class="n">serialized</span><span class="p">);</span>
|
318
|
+
<span class="k">return</span> <span class="o">*</span><span class="n">serialized</span><span class="o">++</span><span class="p">;</span>
|
319
|
+
<span class="p">}</span>
|
320
|
+
|
321
|
+
|
322
|
+
<span class="kt">void</span>
|
323
|
+
<span class="nf">Init_rcstorable</span><span class="p">()</span>
|
324
|
+
<span class="p">{</span>
|
325
|
+
<span class="n">VALUE</span> <span class="n">mRcstorable</span> <span class="o">=</span> <span class="n">rb_define_module</span><span class="p">(</span><span class="s">"RCStorable"</span><span class="p">);</span>
|
326
|
+
<span class="n">rb_define_singleton_method</span><span class="p">(</span><span class="n">mRcstorable</span><span class="p">,</span> <span class="s">"thaw"</span><span class="p">,</span> <span class="n">thaw</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
|
327
|
+
<span class="p">}</span></pre></div>
|
328
|
+
</td>
|
329
|
+
</tr>
|
330
|
+
</table>
|
331
|
+
</div>
|
332
|
+
</body>
|
data/spec/store.pl
CHANGED
@@ -5,5 +5,17 @@ use warnings;
|
|
5
5
|
use Storable;
|
6
6
|
use Data::Dumper;
|
7
7
|
|
8
|
-
|
8
|
+
my %blah = (
|
9
|
+
"a" => "A longish string",
|
10
|
+
"b" => "35",
|
11
|
+
"c" => {
|
12
|
+
"p" => "blah",
|
13
|
+
"q" => "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
|
14
|
+
},
|
15
|
+
"longer_key_name" => "29",
|
16
|
+
);
|
17
|
+
|
18
|
+
#my $x = "004\a\b12345678\004\b\b\b\003\004\000\000\000\004\003\002\000\000\000\n\004blah\001\000\000\000p\001>\002\000\000Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\001\000\000\000q\001\000\000\000c\n\00229\017\000\000\000longer_key_name\n\020A longish string\001\000\000\000a\n\00235\001\000\000\000b";
|
19
|
+
|
20
|
+
print Storable::nfreeze(\%blah);
|
9
21
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 3
|
9
|
+
version: 0.3.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Burke Libbey
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-27 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- ext/doc.rb
|
36
36
|
- ext/extconf.rb
|
37
37
|
- ext/rcstorable.c
|
38
|
+
- ext/rcstorable.html
|
38
39
|
- spec/rcstorable_spec.rb
|
39
40
|
- spec/store.pl
|
40
41
|
has_rdoc: true
|