easy-crc 0.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3ac427e10260621e53de286d84c1f5546dcc6aaa
4
+ data.tar.gz: 9dc192a043f58c65cad6d3805636e8ffa2fb6a98
5
+ SHA512:
6
+ metadata.gz: afedc692533e8e6214a8485b77dce2d4ad22ea727311a981446f28eced2d8fd0ab59d0ca0791694d6db5beea11882b9ce50abca34372caf764bad50a2847b5d3
7
+ data.tar.gz: 25c5bf169e03542e3be4f27f3b21a6668a83913a2bc6611c0c465f5da5770f514d4bb65a574e7ab75a5f74636941d72bee32daca743e328e2c9acdfcce23eb40
@@ -0,0 +1,184 @@
1
+ #include <stdbool.h>
2
+ #include <stdio.h>
3
+ #include <stddef.h>
4
+ #include <stdint.h>
5
+ #include <ruby.h>
6
+ #include <ruby/thread.h>
7
+
8
+ /* http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c */
9
+
10
+ static uint32_t crc32_tab[] = {
11
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
12
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
13
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
14
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
15
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
16
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
17
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
18
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
19
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
20
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
21
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
22
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
23
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
24
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
25
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
26
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
27
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
28
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
29
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
30
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
31
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
32
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
33
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
34
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
35
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
36
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
37
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
38
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
39
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
40
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
41
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
42
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
43
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
44
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
45
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
46
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
47
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
48
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
49
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
50
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
51
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
52
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
53
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
54
+ };
55
+
56
+ static uint32_t
57
+ crc32(uint32_t crc, const void *buf, size_t size)
58
+ {
59
+ const uint8_t *p;
60
+
61
+ p = buf;
62
+ crc = crc ^ ~0U;
63
+
64
+ while (size--)
65
+ crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
66
+
67
+ return crc ^ ~0U;
68
+ }
69
+
70
+ typedef struct {
71
+ const char *path;
72
+ FILE *fd;
73
+ uint32_t crc;
74
+ int error;
75
+ int stop;
76
+ } easy_crc32_params;
77
+
78
+ static void *
79
+ easy_crc_crc32_no_gil(void *p)
80
+ {
81
+ easy_crc32_params *params = (easy_crc32_params*) p;
82
+
83
+ const size_t BUFSIZE = 8192;
84
+ char buf[BUFSIZE];
85
+ size_t len;
86
+
87
+ params->fd = fopen(params->path, "r");
88
+ if(params->fd == NULL) {
89
+ params->error = 1;
90
+ return NULL;
91
+ }
92
+
93
+ do {
94
+
95
+ if(params->stop) {
96
+ params->error = 2;
97
+ return NULL;
98
+ }
99
+
100
+ len = fread(buf, 1, BUFSIZE, params->fd);
101
+
102
+ if(len == 0) {
103
+ if(ferror(params->fd)) {
104
+ params->error = 3;
105
+ return NULL;
106
+ }
107
+ } else {
108
+ params->crc = crc32(params->crc, buf, len);
109
+ }
110
+
111
+ } while(len == BUFSIZE);
112
+
113
+ return NULL;
114
+ }
115
+
116
+ static void
117
+ easy_crc_crc32_stop(void *p)
118
+ {
119
+ easy_crc32_params *params = (easy_crc32_params*) p;
120
+ params->stop = true;
121
+ }
122
+
123
+ static VALUE
124
+ easy_crc_crc32_start(VALUE p)
125
+ {
126
+ easy_crc32_params *params;
127
+ Data_Get_Struct(p, easy_crc32_params, params);
128
+
129
+ rb_thread_call_without_gvl(easy_crc_crc32_no_gil, (void*) params, easy_crc_crc32_stop, (void*) params);
130
+ return Qnil;
131
+ }
132
+
133
+ static VALUE
134
+ easy_crc_crc32_cleanup(VALUE p)
135
+ {
136
+ easy_crc32_params *params;
137
+ Data_Get_Struct(p, easy_crc32_params, params);
138
+
139
+ if(params->fd != NULL) {
140
+ fclose(params->fd);
141
+ params->fd = NULL;
142
+ }
143
+
144
+ return Qnil;
145
+ }
146
+
147
+ static VALUE
148
+ easy_crc_crc32(VALUE self, VALUE path)
149
+ {
150
+ easy_crc32_params params;
151
+ VALUE vparams;
152
+
153
+ if(TYPE(path) != T_STRING)
154
+ rb_raise(rb_eTypeError, "invalid type for path name");
155
+
156
+ params.path = StringValueCStr(path);
157
+ params.fd = NULL;
158
+ params.crc = 0;
159
+ params.error = 0;
160
+ params.stop = false;
161
+
162
+ vparams = Data_Wrap_Struct(0, 0, 0, &params);
163
+
164
+ rb_ensure(easy_crc_crc32_start, vparams, easy_crc_crc32_cleanup, vparams);
165
+
166
+ if(params.error == 1)
167
+ rb_raise(rb_eIOError, "failed to open file");
168
+
169
+ if(params.error == 2)
170
+ rb_raise(rb_eThreadError, "thread stopped");
171
+
172
+ if(params.error == 3)
173
+ rb_raise(rb_eIOError, "failed to read from file");
174
+
175
+ return INT2FIX(params.crc);
176
+ }
177
+
178
+ void
179
+ Init_easy_crc()
180
+ {
181
+ VALUE mEasyCrc;
182
+ mEasyCrc = rb_define_module("EasyCRC");
183
+ rb_define_module_function(mEasyCrc, "crc32", easy_crc_crc32, 1);
184
+ }
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile('easy_crc')
@@ -0,0 +1,3 @@
1
+ module EasyCRC
2
+ VERSION = '0.0.1'
3
+ end
data/lib/easy-crc.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'easy_crc.so'
2
+ require 'easy-crc/version'
3
+
4
+ module EasyCRC
5
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy-crc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - FlavourSys Technology GmbH
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake-compiler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: EasyCRC let's you calculate CRC32 checksums of files without locking
42
+ the whole Ruby process
43
+ email: technology@flavoursys.com
44
+ executables: []
45
+ extensions:
46
+ - ext/easy_crc/extconf.rb
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/easy-crc.rb
50
+ - lib/easy-crc/version.rb
51
+ - ext/easy_crc/extconf.rb
52
+ - ext/easy_crc/easy_crc.c
53
+ homepage: http://github.com/flavoursys/easy-crc
54
+ licenses:
55
+ - MIT
56
+ metadata: {}
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 2.0.14
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: GIL-free CRC32 checksums of files
77
+ test_files: []