1 /*------------------------------------------------------------------------
2  *  Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
3  *
4  *  This file is part of the ZBar Bar Code Reader.
5  *
6  *  The ZBar Bar Code Reader is free software; you can redistribute it
7  *  and/or modify it under the terms of the GNU Lesser Public License as
8  *  published by the Free Software Foundation; either version 2.1 of
9  *  the License, or (at your option) any later version.
10  *
11  *  The ZBar Bar Code Reader is distributed in the hope that it will be
12  *  useful, but WITHOUT ANY WARRANTY; without even the implied warranty
13  *  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU Lesser Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser Public License
17  *  along with the ZBar Bar Code Reader; if not, write to the Free
18  *  Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  *  Boston, MA  02110-1301  USA
20  *
21  *  http://sourceforge.net/projects/zbar
22  *------------------------------------------------------------------------*/
23 
24 #include <stdlib.h>     /* malloc, calloc, free */
25 #include <stdio.h>      /* snprintf */
26 #include <string.h>     /* memset, strlen */
27 
28 #include <zbar.h>
29 #include "decoder.h"
30 
31 #if defined(DEBUG_DECODER) || defined(DEBUG_EAN) ||             \
32     defined(DEBUG_CODE39) || defined(DEBUG_I25) ||              \
33     defined(DEBUG_CODE128) || defined(DEBUG_QR_FINDER) ||       \
34     (defined(DEBUG_PDF417) && (DEBUG_PDF417 >= 4))
35 # define DEBUG_LEVEL 1
36 #endif
37 #include "debug.h"
38 
zbar_decoder_create()39 zbar_decoder_t *zbar_decoder_create ()
40 {
41     zbar_decoder_t *dcode = calloc(1, sizeof(zbar_decoder_t));
42     dcode->buf_alloc = BUFFER_MIN;
43     dcode->buf = malloc(dcode->buf_alloc);
44 
45     /* initialize default configs */
46 #ifdef ENABLE_EAN
47     dcode->ean.enable = 1;
48     dcode->ean.ean13_config = ((1 << ZBAR_CFG_ENABLE) |
49                                (1 << ZBAR_CFG_EMIT_CHECK));
50     dcode->ean.ean8_config = ((1 << ZBAR_CFG_ENABLE) |
51                               (1 << ZBAR_CFG_EMIT_CHECK));
52     dcode->ean.upca_config = 1 << ZBAR_CFG_EMIT_CHECK;
53     dcode->ean.upce_config = 1 << ZBAR_CFG_EMIT_CHECK;
54     dcode->ean.isbn10_config = 1 << ZBAR_CFG_EMIT_CHECK;
55     dcode->ean.isbn13_config = 1 << ZBAR_CFG_EMIT_CHECK;
56 #endif
57 #ifdef ENABLE_I25
58     dcode->i25.config = 1 << ZBAR_CFG_ENABLE;
59     CFG(dcode->i25, ZBAR_CFG_MIN_LEN) = 6;
60 #endif
61 #ifdef ENABLE_CODE39
62     dcode->code39.config = 1 << ZBAR_CFG_ENABLE;
63     CFG(dcode->code39, ZBAR_CFG_MIN_LEN) = 1;
64 #endif
65 #ifdef ENABLE_CODE128
66     dcode->code128.config = 1 << ZBAR_CFG_ENABLE;
67 #endif
68 #ifdef ENABLE_PDF417
69     dcode->pdf417.config = 1 << ZBAR_CFG_ENABLE;
70 #endif
71 #ifdef ENABLE_QRCODE
72     dcode->qrf.config = 1 << ZBAR_CFG_ENABLE;
73 #endif
74 
75     zbar_decoder_reset(dcode);
76     return(dcode);
77 }
78 
zbar_decoder_destroy(zbar_decoder_t * dcode)79 void zbar_decoder_destroy (zbar_decoder_t *dcode)
80 {
81     if(dcode->buf)
82         free(dcode->buf);
83     free(dcode);
84 }
85 
zbar_decoder_reset(zbar_decoder_t * dcode)86 void zbar_decoder_reset (zbar_decoder_t *dcode)
87 {
88     memset(dcode, 0, (long)&dcode->buf_alloc - (long)dcode);
89 #ifdef ENABLE_EAN
90     ean_reset(&dcode->ean);
91 #endif
92 #ifdef ENABLE_I25
93     i25_reset(&dcode->i25);
94 #endif
95 #ifdef ENABLE_CODE39
96     code39_reset(&dcode->code39);
97 #endif
98 #ifdef ENABLE_CODE128
99     code128_reset(&dcode->code128);
100 #endif
101 #ifdef ENABLE_PDF417
102     pdf417_reset(&dcode->pdf417);
103 #endif
104 #ifdef ENABLE_QRCODE
105     qr_finder_reset(&dcode->qrf);
106 #endif
107 }
108 
zbar_decoder_new_scan(zbar_decoder_t * dcode)109 void zbar_decoder_new_scan (zbar_decoder_t *dcode)
110 {
111     /* soft reset decoder */
112     memset(dcode->w, 0, sizeof(dcode->w));
113     dcode->lock = 0;
114     dcode->idx = 0;
115 #ifdef ENABLE_EAN
116     ean_new_scan(&dcode->ean);
117 #endif
118 #ifdef ENABLE_I25
119     i25_reset(&dcode->i25);
120 #endif
121 #ifdef ENABLE_CODE39
122     code39_reset(&dcode->code39);
123 #endif
124 #ifdef ENABLE_CODE128
125     code128_reset(&dcode->code128);
126 #endif
127 #ifdef ENABLE_PDF417
128     pdf417_reset(&dcode->pdf417);
129 #endif
130 #ifdef ENABLE_QRCODE
131     qr_finder_reset(&dcode->qrf);
132 #endif
133 }
134 
135 
zbar_decoder_get_color(const zbar_decoder_t * dcode)136 zbar_color_t zbar_decoder_get_color (const zbar_decoder_t *dcode)
137 {
138     return(get_color(dcode));
139 }
140 
zbar_decoder_get_data(const zbar_decoder_t * dcode)141 const char *zbar_decoder_get_data (const zbar_decoder_t *dcode)
142 {
143     return((char*)dcode->buf);
144 }
145 
zbar_decoder_get_data_length(const zbar_decoder_t * dcode)146 unsigned int zbar_decoder_get_data_length (const zbar_decoder_t *dcode)
147 {
148     return(dcode->buflen);
149 }
150 
151 zbar_decoder_handler_t *
zbar_decoder_set_handler(zbar_decoder_t * dcode,zbar_decoder_handler_t handler)152 zbar_decoder_set_handler (zbar_decoder_t *dcode,
153                           zbar_decoder_handler_t handler)
154 {
155     zbar_decoder_handler_t *result = dcode->handler;
156     dcode->handler = handler;
157     return(result);
158 }
159 
zbar_decoder_set_userdata(zbar_decoder_t * dcode,void * userdata)160 void zbar_decoder_set_userdata (zbar_decoder_t *dcode,
161                                 void *userdata)
162 {
163     dcode->userdata = userdata;
164 }
165 
zbar_decoder_get_userdata(const zbar_decoder_t * dcode)166 void *zbar_decoder_get_userdata (const zbar_decoder_t *dcode)
167 {
168     return(dcode->userdata);
169 }
170 
zbar_decoder_get_type(const zbar_decoder_t * dcode)171 zbar_symbol_type_t zbar_decoder_get_type (const zbar_decoder_t *dcode)
172 {
173     return(dcode->type);
174 }
175 
zbar_decode_width(zbar_decoder_t * dcode,unsigned w)176 zbar_symbol_type_t zbar_decode_width (zbar_decoder_t *dcode,
177                                       unsigned w)
178 {
179     dcode->w[dcode->idx & (DECODE_WINDOW - 1)] = w;
180     dprintf(1, "    decode[%x]: w=%d (%g)\n", dcode->idx, w, (w / 32.));
181 
182     /* each decoder processes width stream in parallel */
183     zbar_symbol_type_t sym = dcode->type = ZBAR_NONE;
184 
185 #ifdef ENABLE_EAN
186     if((dcode->ean.enable) &&
187        (sym = _zbar_decode_ean(dcode)))
188         dcode->type = sym;
189 #endif
190 #ifdef ENABLE_CODE39
191     if(TEST_CFG(dcode->code39.config, ZBAR_CFG_ENABLE) &&
192        (sym = _zbar_decode_code39(dcode)) > ZBAR_PARTIAL)
193         dcode->type = sym;
194 #endif
195 #ifdef ENABLE_CODE128
196     if(TEST_CFG(dcode->code128.config, ZBAR_CFG_ENABLE) &&
197        (sym = _zbar_decode_code128(dcode)) > ZBAR_PARTIAL)
198         dcode->type = sym;
199 #endif
200 #ifdef ENABLE_I25
201     if(TEST_CFG(dcode->i25.config, ZBAR_CFG_ENABLE) &&
202        (sym = _zbar_decode_i25(dcode)) > ZBAR_PARTIAL)
203         dcode->type = sym;
204 #endif
205 #ifdef ENABLE_PDF417
206     if(TEST_CFG(dcode->pdf417.config, ZBAR_CFG_ENABLE) &&
207        (sym = _zbar_decode_pdf417(dcode)) > ZBAR_PARTIAL)
208         dcode->type = sym;
209 #endif
210 #ifdef ENABLE_QRCODE
211     if(TEST_CFG(dcode->qrf.config, ZBAR_CFG_ENABLE) &&
212        (sym = _zbar_find_qr(dcode)) > ZBAR_PARTIAL)
213         dcode->type = sym;
214 #endif
215 
216     dcode->idx++;
217     if(dcode->type) {
218         if(dcode->handler)
219             dcode->handler(dcode);
220         if(dcode->lock && dcode->type > ZBAR_PARTIAL)
221             dcode->lock = 0;
222     }
223     return(dcode->type);
224 }
225 
decoder_set_config_bool(zbar_decoder_t * dcode,zbar_symbol_type_t sym,zbar_config_t cfg,int val)226 static inline int decoder_set_config_bool (zbar_decoder_t *dcode,
227                                            zbar_symbol_type_t sym,
228                                            zbar_config_t cfg,
229                                            int val)
230 {
231     unsigned *config = NULL;
232     switch(sym) {
233 #ifdef ENABLE_EAN
234     case ZBAR_EAN13:
235         config = &dcode->ean.ean13_config;
236         break;
237 
238     case ZBAR_EAN8:
239         config = &dcode->ean.ean8_config;
240         break;
241 
242     case ZBAR_UPCA:
243         config = &dcode->ean.upca_config;
244         break;
245 
246     case ZBAR_UPCE:
247         config = &dcode->ean.upce_config;
248         break;
249 
250     case ZBAR_ISBN10:
251         config = &dcode->ean.isbn10_config;
252         break;
253 
254     case ZBAR_ISBN13:
255         config = &dcode->ean.isbn13_config;
256         break;
257 #endif
258 
259 #ifdef ENABLE_I25
260     case ZBAR_I25:
261         config = &dcode->i25.config;
262         break;
263 #endif
264 
265 #ifdef ENABLE_CODE39
266     case ZBAR_CODE39:
267         config = &dcode->code39.config;
268         break;
269 #endif
270 
271 #ifdef ENABLE_CODE128
272     case ZBAR_CODE128:
273         config = &dcode->code128.config;
274         break;
275 #endif
276 
277 #ifdef ENABLE_PDF417
278     case ZBAR_PDF417:
279         config = &dcode->pdf417.config;
280         break;
281 #endif
282 
283 #ifdef ENABLE_QRCODE
284     case ZBAR_QRCODE:
285         config = &dcode->qrf.config;
286         break;
287 #endif
288 
289     /* FIXME handle addons */
290 
291     default:
292         return(1);
293     }
294     if(!config || cfg >= ZBAR_CFG_NUM)
295         return(1);
296 
297     if(!val)
298         *config &= ~(1 << cfg);
299     else if(val == 1)
300         *config |= (1 << cfg);
301     else
302         return(1);
303 
304 #ifdef ENABLE_EAN
305     dcode->ean.enable = TEST_CFG(dcode->ean.ean13_config |
306                                  dcode->ean.ean8_config |
307                                  dcode->ean.upca_config |
308                                  dcode->ean.upce_config |
309                                  dcode->ean.isbn10_config |
310                                  dcode->ean.isbn13_config,
311                                  ZBAR_CFG_ENABLE);
312 #endif
313 
314     return(0);
315 }
316 
decoder_set_config_int(zbar_decoder_t * dcode,zbar_symbol_type_t sym,zbar_config_t cfg,int val)317 static inline int decoder_set_config_int (zbar_decoder_t *dcode,
318                                           zbar_symbol_type_t sym,
319                                           zbar_config_t cfg,
320                                           int val)
321 {
322     switch(sym) {
323 
324 #ifdef ENABLE_I25
325     case ZBAR_I25:
326         CFG(dcode->i25, cfg) = val;
327         break;
328 #endif
329 #ifdef ENABLE_CODE39
330     case ZBAR_CODE39:
331         CFG(dcode->code39, cfg) = val;
332         break;
333 #endif
334 #ifdef ENABLE_CODE128
335     case ZBAR_CODE128:
336         CFG(dcode->code128, cfg) = val;
337         break;
338 #endif
339 #ifdef ENABLE_PDF417
340     case ZBAR_PDF417:
341         CFG(dcode->pdf417, cfg) = val;
342         break;
343 #endif
344 
345     default:
346         return(1);
347     }
348     return(0);
349 }
350 
zbar_decoder_set_config(zbar_decoder_t * dcode,zbar_symbol_type_t sym,zbar_config_t cfg,int val)351 int zbar_decoder_set_config (zbar_decoder_t *dcode,
352                              zbar_symbol_type_t sym,
353                              zbar_config_t cfg,
354                              int val)
355 {
356     if(sym == ZBAR_NONE) {
357         zbar_decoder_set_config(dcode, ZBAR_EAN13, cfg, val);
358         zbar_decoder_set_config(dcode, ZBAR_EAN8, cfg, val);
359         zbar_decoder_set_config(dcode, ZBAR_UPCA, cfg, val);
360         zbar_decoder_set_config(dcode, ZBAR_UPCE, cfg, val);
361         zbar_decoder_set_config(dcode, ZBAR_ISBN10, cfg, val);
362         zbar_decoder_set_config(dcode, ZBAR_ISBN13, cfg, val);
363         zbar_decoder_set_config(dcode, ZBAR_I25, cfg, val);
364         zbar_decoder_set_config(dcode, ZBAR_CODE39, cfg, val);
365         zbar_decoder_set_config(dcode, ZBAR_CODE128, cfg, val);
366         zbar_decoder_set_config(dcode, ZBAR_PDF417, cfg, val);
367         zbar_decoder_set_config(dcode, ZBAR_QRCODE, cfg, val);
368         return(0);
369     }
370 
371     if(cfg >= 0 && cfg < ZBAR_CFG_NUM)
372         return(decoder_set_config_bool(dcode, sym, cfg, val));
373     else if(cfg >= ZBAR_CFG_MIN_LEN && cfg <= ZBAR_CFG_MAX_LEN)
374         return(decoder_set_config_int(dcode, sym, cfg, val));
375     else
376         return(1);
377 }
378 
379 
380 static char *decoder_dump = NULL;
381 static unsigned decoder_dumplen = 0;
382 
_zbar_decoder_buf_dump(unsigned char * buf,unsigned int buflen)383 const char *_zbar_decoder_buf_dump (unsigned char *buf,
384                                     unsigned int buflen)
385 {
386     int dumplen = (buflen * 3) + 12;
387     if(!decoder_dump || dumplen > decoder_dumplen) {
388         if(decoder_dump)
389             free(decoder_dump);
390         decoder_dump = malloc(dumplen);
391         decoder_dumplen = dumplen;
392     }
393     char *p = decoder_dump +
394         snprintf(decoder_dump, 12, "buf[%04x]=",
395                  (buflen > 0xffff) ? 0xffff : buflen);
396     int i;
397     for(i = 0; i < buflen; i++)
398         p += snprintf(p, 4, "%s%02x", (i) ? " " : "",  buf[i]);
399     return(decoder_dump);
400 }
401