semacode 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +25 -0
- data/README +18 -8
- data/Rakefile +52 -0
- data/ext/iec16022ecc200.c +7 -18
- data/ext/semacode.c +21 -3
- data/ext/semacode.h +1 -0
- metadata +6 -4
data/CHANGELOG
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
|
3
|
+
2007-03-02 guido
|
4
|
+
|
5
|
+
* Initial encoder wrapping for Ruby API
|
6
|
+
|
7
|
+
* Packaged as a gem
|
8
|
+
|
9
|
+
|
10
|
+
2007-03-03 guido
|
11
|
+
|
12
|
+
* Separated native extension into its own namespace
|
13
|
+
|
14
|
+
* Trying to make a correct gem still
|
15
|
+
|
16
|
+
|
17
|
+
2007-03-04 guido
|
18
|
+
|
19
|
+
* Exposed the encoding list used to create the semacode
|
20
|
+
|
21
|
+
* Use Ruby allocation functions instead of malloc.
|
22
|
+
|
23
|
+
* Fixes compiler errors with Fink not finding malloc.h
|
24
|
+
|
25
|
+
* Given up on making the gem do auto-require
|
data/README
CHANGED
@@ -27,10 +27,12 @@ available from <http://www.gnu.org>
|
|
27
27
|
You can contact me via <guido@sohne.net> if you have patches, bug fixes or
|
28
28
|
improvements.
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
Copyright (C) 2007, Guido Sohne
|
31
|
+
Website: http://sohne.net/projects/semafox
|
32
|
+
|
33
|
+
=== Credits
|
33
34
|
|
35
|
+
Based on the iec16022ecc200.c encoder by Adrian Kennard, Andrews & Arnold Ltd
|
34
36
|
|
35
37
|
== Quick Start
|
36
38
|
|
@@ -80,6 +82,14 @@ Return the semacode as an array of arrays of boolean
|
|
80
82
|
<tt>grid = semacode.data</tt> or
|
81
83
|
<tt>grid = semacode.to_a</tt> or
|
82
84
|
|
85
|
+
Return the encoding list used to create the semacode
|
86
|
+
|
87
|
+
This encoding list is composed of the 'character set', complete with
|
88
|
+
shifts from one encoding type to another, that is used for the DataMatrix
|
89
|
+
algorithm.
|
90
|
+
|
91
|
+
<tt>encoding = semacode.encoding</tt>
|
92
|
+
|
83
93
|
Return the semacode as a string
|
84
94
|
|
85
95
|
The string is a comma separated list of character vectors. Each vector is a row
|
@@ -93,11 +103,11 @@ Encode another string
|
|
93
103
|
|
94
104
|
<tt>semacode.encode "http://sohne.net"</tt>
|
95
105
|
|
96
|
-
Get the width
|
106
|
+
Get the width of the semacode
|
97
107
|
|
98
108
|
<tt>semacode.width</tt>
|
99
109
|
|
100
|
-
Get the height
|
110
|
+
Get the height of the semacode
|
101
111
|
|
102
112
|
<tt>semacode.height</tt>
|
103
113
|
|
@@ -106,7 +116,7 @@ How long is the semacode? (width * height)
|
|
106
116
|
<tt>semacode.length</tt> or
|
107
117
|
<tt>semacode.size</tt>
|
108
118
|
|
109
|
-
Get the raw encoded length (before padding and before
|
119
|
+
Get the raw encoded length (before padding and before ECC)
|
110
120
|
|
111
121
|
<tt>semacode.raw_encoded_length</tt>
|
112
122
|
|
@@ -114,11 +124,11 @@ Get the symbol size
|
|
114
124
|
|
115
125
|
The max number of characters this semacode type
|
116
126
|
(specific width x height) can hold is called the
|
117
|
-
symbol size
|
127
|
+
symbol size.
|
118
128
|
|
119
129
|
<tt>semacode.symbol_size</tt>
|
120
130
|
|
121
|
-
|
131
|
+
Count the ECC bytes
|
122
132
|
|
123
133
|
How many bytes were used for error correction?
|
124
134
|
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
|
4
|
+
spec = Gem::Specification.new do |s|
|
5
|
+
s.name = "semacode"
|
6
|
+
s.version = "0.7.2"
|
7
|
+
s.author = "Guido Sohne"
|
8
|
+
s.email = "guido@sohne.net"
|
9
|
+
s.homepage = "http://sohne.net/projects/semafox/"
|
10
|
+
s.platform = Gem::Platform::RUBY
|
11
|
+
s.summary = "Create semacodes (2D barcodes) using Ruby."
|
12
|
+
s.rubyforge_project = "semacode"
|
13
|
+
s.description = <<DESC
|
14
|
+
This Ruby extension implements a DataMatrix encoder for Ruby. It is typically
|
15
|
+
used to create semacodes, which are barcodes, that contain URLs. This encoder
|
16
|
+
does not create image files or visual representations of the semacode. This is
|
17
|
+
because it can be used for more than creating images, such as rendering
|
18
|
+
semacodes to HTML, SVG, PDF or even stored in a database or file for later
|
19
|
+
use.
|
20
|
+
DESC
|
21
|
+
|
22
|
+
s.extensions << 'ext/extconf.rb'
|
23
|
+
s.add_dependency('rake', '>= 0.7.0')
|
24
|
+
s.files = FileList[
|
25
|
+
"{lib,ext}/**/*.rb",
|
26
|
+
"ext/**/*.c",
|
27
|
+
"ext/**/*.h",
|
28
|
+
"tests/**/*.rb",
|
29
|
+
"README",
|
30
|
+
"CHANGELOG",
|
31
|
+
"Rakefile"].to_a
|
32
|
+
s.require_path = "lib"
|
33
|
+
s.autorequire = "semacode"
|
34
|
+
s.test_files = FileList["{tests}/**/*test.rb"].to_a
|
35
|
+
s.has_rdoc = true
|
36
|
+
s.extra_rdoc_files = ["README"]
|
37
|
+
end
|
38
|
+
|
39
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
40
|
+
pkg.need_zip = true
|
41
|
+
pkg.need_tar_gz = true
|
42
|
+
pkg.need_tar_bz2 = true
|
43
|
+
end
|
44
|
+
|
45
|
+
task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
|
46
|
+
puts "Successfully created #{spec.name}-#{spec.version} gem"
|
47
|
+
end
|
48
|
+
|
49
|
+
if $0 == __FILE__
|
50
|
+
Gem::manage_gems
|
51
|
+
Gem::Builder.new(spec).build
|
52
|
+
end
|
data/ext/iec16022ecc200.c
CHANGED
@@ -26,7 +26,6 @@
|
|
26
26
|
#include <ctype.h>
|
27
27
|
#include <string.h>
|
28
28
|
#include <time.h>
|
29
|
-
#include <malloc.h>
|
30
29
|
#include "ruby.h"
|
31
30
|
#include "reedsol.h"
|
32
31
|
#include "iec16022ecc200.h"
|
@@ -71,19 +70,6 @@ ecc200matrix[] =
|
|
71
70
|
0 // terminate
|
72
71
|
};
|
73
72
|
|
74
|
-
// simple checked response malloc
|
75
|
-
static void *
|
76
|
-
safemalloc (int n)
|
77
|
-
{
|
78
|
-
void *p = (void *) malloc((size_t) n);
|
79
|
-
if (!p)
|
80
|
-
{
|
81
|
-
rb_raise(rb_eRuntimeError, "malloc failed", n);
|
82
|
-
exit (1);
|
83
|
-
}
|
84
|
-
return p;
|
85
|
-
}
|
86
|
-
|
87
73
|
// Annex M placement alorithm low level
|
88
74
|
static void
|
89
75
|
ecc200placementbit (int *array, int NR, int NC, int r, int c, int p, char b)
|
@@ -506,6 +492,7 @@ unsigned char switchcost[E_MAX][E_MAX] = {
|
|
506
492
|
static char *
|
507
493
|
encmake (int l, unsigned char *s, int *lenp, char exact)
|
508
494
|
{
|
495
|
+
VALUE rb_str = NULL;
|
509
496
|
char *encoding = 0;
|
510
497
|
int p = l;
|
511
498
|
char e;
|
@@ -761,7 +748,7 @@ encmake (int l, unsigned char *s, int *lenp, char exact)
|
|
761
748
|
enc[p][b].s += enc[p + 1][b].s;
|
762
749
|
//rb_raise(rb_eRuntimeError, "%d:", p); for (e = 0; e < E_MAX; e++) rb_raise(rb_eRuntimeError, " %c*%d/%d", encchr[e], enc[p][e].s, enc[p][e].t); rb_raise(rb_eRuntimeError, "\n");
|
763
750
|
}
|
764
|
-
encoding =
|
751
|
+
encoding = ALLOC_N(char, l + 1);
|
765
752
|
p = 0;
|
766
753
|
{
|
767
754
|
char cur = E_ASCII; // starts ASCII
|
@@ -873,7 +860,7 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
873
860
|
}
|
874
861
|
if (!matrix->W)
|
875
862
|
{
|
876
|
-
rb_raise(rb_eRuntimeError, "barcode
|
863
|
+
rb_raise(rb_eRuntimeError, "overlong barcode");
|
877
864
|
return 0;
|
878
865
|
}
|
879
866
|
W = matrix->W;
|
@@ -894,9 +881,9 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
894
881
|
*places;
|
895
882
|
NC = W - 2 * (W / matrix->FW);
|
896
883
|
NR = H - 2 * (H / matrix->FH);
|
897
|
-
places =
|
884
|
+
places = ALLOC_N(int, NC * NR);
|
898
885
|
ecc200placement (places, NR, NC);
|
899
|
-
grid =
|
886
|
+
grid = ALLOC_N(char, W * H);
|
900
887
|
memset (grid, 0, W * H);
|
901
888
|
for (y = 0; y < H; y += matrix->FH)
|
902
889
|
{
|
@@ -931,6 +918,8 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
931
918
|
*Hptr = H;
|
932
919
|
if (encodingptr)
|
933
920
|
*encodingptr = encoding;
|
921
|
+
else
|
922
|
+
free(encoding); // get rid of this if we aren't returning it
|
934
923
|
if (maxp)
|
935
924
|
*maxp = matrix->bytes;
|
936
925
|
if (eccp)
|
data/ext/semacode.c
CHANGED
@@ -41,7 +41,11 @@ encode_string(semacode_t *semacode, int message_length, char *message)
|
|
41
41
|
/* deallocate if exists already */
|
42
42
|
if(semacode !=NULL && semacode->data != NULL)
|
43
43
|
free(semacode->data);
|
44
|
-
|
44
|
+
|
45
|
+
/* deallocate if exists already */
|
46
|
+
if(semacode !=NULL && semacode->encoding != NULL)
|
47
|
+
free(semacode->encoding);
|
48
|
+
|
45
49
|
bzero(semacode, sizeof(semacode_t));
|
46
50
|
|
47
51
|
// work around encoding bug by appending an extra character.
|
@@ -55,7 +59,7 @@ encode_string(semacode_t *semacode, int message_length, char *message)
|
|
55
59
|
semacode->data = (char *) iec16022ecc200(
|
56
60
|
&semacode->width,
|
57
61
|
&semacode->height,
|
58
|
-
|
62
|
+
&semacode->encoding,
|
59
63
|
message_length,
|
60
64
|
(unsigned char *) message,
|
61
65
|
&semacode->raw_encoded_length,
|
@@ -81,7 +85,8 @@ semacode_free(semacode_t *semacode)
|
|
81
85
|
{
|
82
86
|
if(semacode != NULL) {
|
83
87
|
if(semacode->data != NULL)
|
84
|
-
free(semacode->
|
88
|
+
free(semacode->encoding);
|
89
|
+
free(semacode->data);
|
85
90
|
bzero(semacode, sizeof(semacode));
|
86
91
|
free(semacode);
|
87
92
|
}
|
@@ -257,6 +262,18 @@ semacode_data(VALUE self)
|
|
257
262
|
return semacode_grid(semacode);
|
258
263
|
}
|
259
264
|
|
265
|
+
/*
|
266
|
+
This returns the encoding string used to create the semacode.
|
267
|
+
*/
|
268
|
+
static VALUE
|
269
|
+
semacode_encoded(VALUE self)
|
270
|
+
{
|
271
|
+
semacode_t *semacode;
|
272
|
+
Data_Get_Struct(self, semacode_t, semacode);
|
273
|
+
|
274
|
+
return rb_str_new2(semacode->encoding);
|
275
|
+
}
|
276
|
+
|
260
277
|
/*
|
261
278
|
This returns the width of the semacode.
|
262
279
|
*/
|
@@ -347,6 +364,7 @@ Init_semacode_native()
|
|
347
364
|
rb_define_method(rb_cEncoder, "encode", semacode_encode, 1);
|
348
365
|
rb_define_method(rb_cEncoder, "to_a", semacode_data, 0);
|
349
366
|
rb_define_method(rb_cEncoder, "data", semacode_data, 0);
|
367
|
+
rb_define_method(rb_cEncoder, "encoding", semacode_encoded, 0);
|
350
368
|
rb_define_method(rb_cEncoder, "to_s", semacode_to_s, 0);
|
351
369
|
rb_define_method(rb_cEncoder, "to_str", semacode_to_s, 0);
|
352
370
|
rb_define_method(rb_cEncoder, "width", semacode_width, 0);
|
data/ext/semacode.h
CHANGED
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: semacode
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
6
|
+
version: 0.7.2
|
7
7
|
date: 2007-03-04 00:00:00 +00:00
|
8
8
|
summary: Create semacodes (2D barcodes) using Ruby.
|
9
9
|
require_paths:
|
@@ -29,16 +29,18 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Guido Sohne
|
31
31
|
files:
|
32
|
+
- lib/semacode.rb
|
32
33
|
- ext/extconf.rb
|
33
34
|
- ext/iec16022ecc200.c
|
34
|
-
- ext/iec16022ecc200.h
|
35
35
|
- ext/reedsol.c
|
36
|
-
- ext/reedsol.h
|
37
36
|
- ext/semacode.c
|
37
|
+
- ext/iec16022ecc200.h
|
38
|
+
- ext/reedsol.h
|
38
39
|
- ext/semacode.h
|
39
|
-
- lib/semacode.rb
|
40
40
|
- tests/test.rb
|
41
41
|
- README
|
42
|
+
- CHANGELOG
|
43
|
+
- Rakefile
|
42
44
|
test_files:
|
43
45
|
- tests/test.rb
|
44
46
|
rdoc_options: []
|