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 CHANGED
@@ -1 +1 @@
1
- 0.3.2
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
  }
@@ -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 &lt;stdbool.h&gt;</span>
39
+ <span class="cp">#include &lt;stdio.h&gt;</span>
40
+ <span class="cp">#include &lt;string.h&gt;</span>
41
+ <span class="cp">#include &lt;stdint.h&gt;</span>
42
+
43
+ <span class="cp">#include &quot;ruby.h&quot;</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&rsquo;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">&gt;</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">&quot;malformed data&quot;</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&rsquo;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&rsquo;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&rsquo;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&rsquo;s somewhere lower than &ldquo;\t&rdquo;, 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 &quot;read until n&lt;7&quot;</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">&gt;=</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&#39;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">&quot;RCStorable&quot;</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">&quot;thaw&quot;</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
- print Dumper(Storable::thaw($x));
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
- - 2
9
- version: 0.3.2
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-10 00:00:00 -05:00
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