A streamlined version (for embedded use) of Jeff Brown's ZBar library. Visit <http://zbar.sourceforge.net> for more details.

Dependents:   BarcodeReader_F103

Committer:
hudakz
Date:
Fri Jan 10 22:06:18 2020 +0000
Revision:
1:4f5c042a2d34
Parent:
0:e33621169e44
Streamlined barcode reader library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:e33621169e44 1 /*------------------------------------------------------------------------
hudakz 0:e33621169e44 2 * Copyright 2008-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
hudakz 0:e33621169e44 3 *
hudakz 0:e33621169e44 4 * This file is part of the ZBar Bar Code Reader.
hudakz 0:e33621169e44 5 *
hudakz 0:e33621169e44 6 * The ZBar Bar Code Reader is free software; you can redistribute it
hudakz 0:e33621169e44 7 * and/or modify it under the terms of the GNU Lesser Public License as
hudakz 0:e33621169e44 8 * published by the Free Software Foundation; either version 2.1 of
hudakz 0:e33621169e44 9 * the License, or (at your option) any later version.
hudakz 0:e33621169e44 10 *
hudakz 0:e33621169e44 11 * The ZBar Bar Code Reader is distributed in the hope that it will be
hudakz 0:e33621169e44 12 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
hudakz 0:e33621169e44 13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 0:e33621169e44 14 * GNU Lesser Public License for more details.
hudakz 0:e33621169e44 15 *
hudakz 0:e33621169e44 16 * You should have received a copy of the GNU Lesser Public License
hudakz 0:e33621169e44 17 * along with the ZBar Bar Code Reader; if not, write to the Free
hudakz 0:e33621169e44 18 * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
hudakz 0:e33621169e44 19 * Boston, MA 02110-1301 USA
hudakz 0:e33621169e44 20 *
hudakz 0:e33621169e44 21 * http://sourceforge.net/projects/zbar
hudakz 0:e33621169e44 22 *------------------------------------------------------------------------*/
hudakz 0:e33621169e44 23
hudakz 0:e33621169e44 24 #include "../config.h"
hudakz 0:e33621169e44 25 #include <string.h> /* memmove */
hudakz 0:e33621169e44 26
hudakz 0:e33621169e44 27 #ifdef ENABLE_CODE39
hudakz 0:e33621169e44 28
hudakz 0:e33621169e44 29 #include <zbar.h>
hudakz 0:e33621169e44 30 #include "../decoder.h"
hudakz 0:e33621169e44 31
hudakz 0:e33621169e44 32 #ifdef DEBUG_CODE39
hudakz 0:e33621169e44 33 # define DEBUG_LEVEL DEBUG_CODE39
hudakz 0:e33621169e44 34 #endif
hudakz 0:e33621169e44 35 #include "../debug.h"
hudakz 0:e33621169e44 36
hudakz 0:e33621169e44 37 #define NUM_CHARS (0x2c)
hudakz 0:e33621169e44 38
hudakz 0:e33621169e44 39 static const unsigned char code39_hi[32] = {
hudakz 0:e33621169e44 40 0x80 | 0x00, /* 2 next */
hudakz 0:e33621169e44 41 0x40 | 0x02, /* 4 */
hudakz 0:e33621169e44 42 0x80 | 0x06, /* 2 next */
hudakz 0:e33621169e44 43 0xc0 | 0x08, /* 2 skip */
hudakz 0:e33621169e44 44 0x40 | 0x0a, /* 4 */
hudakz 0:e33621169e44 45 0x80 | 0x0e, /* 2 next */
hudakz 0:e33621169e44 46 0xc0 | 0x10, /* 2 skip */
hudakz 0:e33621169e44 47 0x00 | 0x12, /* direct */
hudakz 0:e33621169e44 48
hudakz 0:e33621169e44 49 0x80 | 0x13, /* 2 next */
hudakz 0:e33621169e44 50 0xc0 | 0x15, /* 2 skip */
hudakz 0:e33621169e44 51 0x80 | 0x17, /* 2 next */
hudakz 0:e33621169e44 52 0xff,
hudakz 0:e33621169e44 53 0xc0 | 0x19, /* 2 skip */
hudakz 0:e33621169e44 54 0x00 | 0x1b, /* direct */
hudakz 0:e33621169e44 55 0xff,
hudakz 0:e33621169e44 56 0xff,
hudakz 0:e33621169e44 57
hudakz 0:e33621169e44 58 0x40 | 0x1c, /* 4 */
hudakz 0:e33621169e44 59 0x80 | 0x20, /* 2 next */
hudakz 0:e33621169e44 60 0xc0 | 0x22, /* 2 skip */
hudakz 0:e33621169e44 61 0x00 | 0x24, /* direct */
hudakz 0:e33621169e44 62 0x80 | 0x25, /* 2 next */
hudakz 0:e33621169e44 63 0xff,
hudakz 0:e33621169e44 64 0x00 | 0x27, /* direct */
hudakz 0:e33621169e44 65 0xff,
hudakz 0:e33621169e44 66
hudakz 0:e33621169e44 67 0xc0 | 0x28, /* 2 skip */
hudakz 0:e33621169e44 68 0x00 | 0x2a, /* direct */
hudakz 0:e33621169e44 69 0xff,
hudakz 0:e33621169e44 70 0xff,
hudakz 0:e33621169e44 71 0x00 | 0x2b, /* direct */
hudakz 0:e33621169e44 72 0xff,
hudakz 0:e33621169e44 73 0xff,
hudakz 0:e33621169e44 74 0xff,
hudakz 0:e33621169e44 75 };
hudakz 0:e33621169e44 76
hudakz 0:e33621169e44 77 typedef struct char39_s {
hudakz 0:e33621169e44 78 unsigned char chk, rev, fwd;
hudakz 0:e33621169e44 79 } char39_t;
hudakz 0:e33621169e44 80
hudakz 0:e33621169e44 81 static const char39_t code39_encodings[NUM_CHARS] = {
hudakz 0:e33621169e44 82 { 0x07, 0x1a, 0x20 }, /* 00 */
hudakz 0:e33621169e44 83 { 0x0d, 0x10, 0x03 }, /* 01 */
hudakz 0:e33621169e44 84 { 0x13, 0x17, 0x22 }, /* 02 */
hudakz 0:e33621169e44 85 { 0x16, 0x1d, 0x23 }, /* 03 */
hudakz 0:e33621169e44 86 { 0x19, 0x0d, 0x05 }, /* 04 */
hudakz 0:e33621169e44 87 { 0x1c, 0x13, 0x06 }, /* 05 */
hudakz 0:e33621169e44 88 { 0x25, 0x07, 0x0c }, /* 06 */
hudakz 0:e33621169e44 89 { 0x2a, 0x2a, 0x27 }, /* 07 */
hudakz 0:e33621169e44 90 { 0x31, 0x04, 0x0e }, /* 08 */
hudakz 0:e33621169e44 91 { 0x34, 0x00, 0x0f }, /* 09 */
hudakz 0:e33621169e44 92 { 0x43, 0x15, 0x25 }, /* 0a */
hudakz 0:e33621169e44 93 { 0x46, 0x1c, 0x26 }, /* 0b */
hudakz 0:e33621169e44 94 { 0x49, 0x0b, 0x08 }, /* 0c */
hudakz 0:e33621169e44 95 { 0x4c, 0x12, 0x09 }, /* 0d */
hudakz 0:e33621169e44 96 { 0x52, 0x19, 0x2b }, /* 0e */
hudakz 0:e33621169e44 97 { 0x58, 0x0f, 0x00 }, /* 0f */
hudakz 0:e33621169e44 98 { 0x61, 0x02, 0x11 }, /* 10 */
hudakz 0:e33621169e44 99 { 0x64, 0x09, 0x12 }, /* 11 */
hudakz 0:e33621169e44 100 { 0x70, 0x06, 0x13 }, /* 12 */
hudakz 0:e33621169e44 101 { 0x85, 0x24, 0x16 }, /* 13 */
hudakz 0:e33621169e44 102 { 0x8a, 0x29, 0x28 }, /* 14 */
hudakz 0:e33621169e44 103 { 0x91, 0x21, 0x18 }, /* 15 */
hudakz 0:e33621169e44 104 { 0x94, 0x2b, 0x19 }, /* 16 */
hudakz 0:e33621169e44 105 { 0xa2, 0x28, 0x29 }, /* 17 */
hudakz 0:e33621169e44 106 { 0xa8, 0x27, 0x2a }, /* 18 */
hudakz 0:e33621169e44 107 { 0xc1, 0x1f, 0x1b }, /* 19 */
hudakz 0:e33621169e44 108 { 0xc4, 0x26, 0x1c }, /* 1a */
hudakz 0:e33621169e44 109 { 0xd0, 0x23, 0x1d }, /* 1b */
hudakz 0:e33621169e44 110 { 0x03, 0x14, 0x1e }, /* 1c */
hudakz 0:e33621169e44 111 { 0x06, 0x1b, 0x1f }, /* 1d */
hudakz 0:e33621169e44 112 { 0x09, 0x0a, 0x01 }, /* 1e */
hudakz 0:e33621169e44 113 { 0x0c, 0x11, 0x02 }, /* 1f */
hudakz 0:e33621169e44 114 { 0x12, 0x18, 0x21 }, /* 20 */
hudakz 0:e33621169e44 115 { 0x18, 0x0e, 0x04 }, /* 21 */
hudakz 0:e33621169e44 116 { 0x21, 0x01, 0x0a }, /* 22 */
hudakz 0:e33621169e44 117 { 0x24, 0x08, 0x0b }, /* 23 */
hudakz 0:e33621169e44 118 { 0x30, 0x05, 0x0d }, /* 24 */
hudakz 0:e33621169e44 119 { 0x42, 0x16, 0x24 }, /* 25 */
hudakz 0:e33621169e44 120 { 0x48, 0x0c, 0x07 }, /* 26 */
hudakz 0:e33621169e44 121 { 0x60, 0x03, 0x10 }, /* 27 */
hudakz 0:e33621169e44 122 { 0x81, 0x1e, 0x14 }, /* 28 */
hudakz 0:e33621169e44 123 { 0x84, 0x25, 0x15 }, /* 29 */
hudakz 0:e33621169e44 124 { 0x90, 0x22, 0x17 }, /* 2a */
hudakz 0:e33621169e44 125 { 0xc0, 0x20, 0x1a }, /* 2b */
hudakz 0:e33621169e44 126 };
hudakz 0:e33621169e44 127
hudakz 0:e33621169e44 128 static const unsigned char code39_characters[NUM_CHARS] =
hudakz 0:e33621169e44 129 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";
hudakz 0:e33621169e44 130
hudakz 0:e33621169e44 131 static inline unsigned char code39_decode1 (unsigned char enc,
hudakz 0:e33621169e44 132 unsigned e,
hudakz 0:e33621169e44 133 unsigned s)
hudakz 0:e33621169e44 134 {
hudakz 0:e33621169e44 135 unsigned char E = decode_e(e, s, 36);
hudakz 0:e33621169e44 136 if(E > 7)
hudakz 0:e33621169e44 137 return(0xff);
hudakz 0:e33621169e44 138 enc <<= 1;
hudakz 0:e33621169e44 139 if(E > 2) {
hudakz 0:e33621169e44 140 enc |= 1;
hudakz 0:e33621169e44 141 dprintf(2, "1");
hudakz 0:e33621169e44 142 }
hudakz 0:e33621169e44 143 else
hudakz 0:e33621169e44 144 dprintf(2, "0");
hudakz 0:e33621169e44 145 return(enc);
hudakz 0:e33621169e44 146 }
hudakz 0:e33621169e44 147
hudakz 0:e33621169e44 148 static inline signed char code39_decode9 (zbar_decoder_t *dcode)
hudakz 0:e33621169e44 149 {
hudakz 0:e33621169e44 150 code39_decoder_t *dcode39 = &dcode->code39;
hudakz 0:e33621169e44 151
hudakz 0:e33621169e44 152 dprintf(2, " s=%d ", dcode39->s9);
hudakz 0:e33621169e44 153 if(dcode39->s9 < 9)
hudakz 0:e33621169e44 154 return(-1);
hudakz 0:e33621169e44 155
hudakz 0:e33621169e44 156 /* threshold bar width ratios */
hudakz 0:e33621169e44 157 unsigned char i, enc = 0;
hudakz 0:e33621169e44 158 for(i = 0; i < 5; i++) {
hudakz 0:e33621169e44 159 enc = code39_decode1(enc, get_width(dcode, i), dcode39->s9);
hudakz 0:e33621169e44 160 if(enc == 0xff)
hudakz 0:e33621169e44 161 return(-1);
hudakz 0:e33621169e44 162 }
hudakz 0:e33621169e44 163 zassert(enc < 0x20, -1, " enc=%x s9=%x\n", enc, dcode39->s9);
hudakz 0:e33621169e44 164
hudakz 0:e33621169e44 165 /* lookup first 5 encoded widths for coarse decode */
hudakz 0:e33621169e44 166 unsigned char idx = code39_hi[enc];
hudakz 0:e33621169e44 167 if(idx == 0xff)
hudakz 0:e33621169e44 168 return(-1);
hudakz 0:e33621169e44 169
hudakz 0:e33621169e44 170 /* encode remaining widths (NB first encoded width is lost) */
hudakz 0:e33621169e44 171 for(; i < 9; i++) {
hudakz 0:e33621169e44 172 enc = code39_decode1(enc, get_width(dcode, i), dcode39->s9);
hudakz 0:e33621169e44 173 if(enc == 0xff)
hudakz 0:e33621169e44 174 return(-1);
hudakz 0:e33621169e44 175 }
hudakz 0:e33621169e44 176
hudakz 0:e33621169e44 177 if((idx & 0xc0) == 0x80)
hudakz 0:e33621169e44 178 idx = (idx & 0x3f) + ((enc >> 3) & 1);
hudakz 0:e33621169e44 179 else if((idx & 0xc0) == 0xc0)
hudakz 0:e33621169e44 180 idx = (idx & 0x3f) + ((enc >> 2) & 1);
hudakz 0:e33621169e44 181 else if(idx & 0xc0)
hudakz 0:e33621169e44 182 idx = (idx & 0x3f) + ((enc >> 2) & 3);
hudakz 0:e33621169e44 183 zassert(idx < 0x2c, -1, " idx=%x enc=%x s9=%x\n", idx, enc, dcode39->s9);
hudakz 0:e33621169e44 184
hudakz 0:e33621169e44 185 const char39_t *c = &code39_encodings[idx];
hudakz 0:e33621169e44 186 dprintf(2, " i=%02x chk=%02x c=%02x/%02x", idx, c->chk, c->fwd, c->rev);
hudakz 0:e33621169e44 187 if(enc != c->chk)
hudakz 0:e33621169e44 188 return(-1);
hudakz 0:e33621169e44 189
hudakz 0:e33621169e44 190 dcode39->width = dcode39->s9;
hudakz 0:e33621169e44 191 return((dcode39->direction) ? c->rev : c->fwd);
hudakz 0:e33621169e44 192 }
hudakz 0:e33621169e44 193
hudakz 0:e33621169e44 194 static inline signed char code39_decode_start (zbar_decoder_t *dcode)
hudakz 0:e33621169e44 195 {
hudakz 0:e33621169e44 196 code39_decoder_t *dcode39 = &dcode->code39;
hudakz 0:e33621169e44 197
hudakz 0:e33621169e44 198 signed char c = code39_decode9(dcode);
hudakz 0:e33621169e44 199 if(c == 0x19)
hudakz 0:e33621169e44 200 dcode39->direction ^= 1;
hudakz 0:e33621169e44 201 else if(c != 0x2b) {
hudakz 0:e33621169e44 202 dprintf(2, "\n");
hudakz 0:e33621169e44 203 return(ZBAR_NONE);
hudakz 0:e33621169e44 204 }
hudakz 0:e33621169e44 205
hudakz 0:e33621169e44 206 /* check leading quiet zone - spec is 10x */
hudakz 0:e33621169e44 207 unsigned quiet = get_width(dcode, 9);
hudakz 0:e33621169e44 208 if(quiet && quiet < dcode39->s9 / 2) {
hudakz 0:e33621169e44 209 dprintf(2, " [invalid quiet]\n");
hudakz 0:e33621169e44 210 return(ZBAR_NONE);
hudakz 0:e33621169e44 211 }
hudakz 0:e33621169e44 212
hudakz 0:e33621169e44 213 dcode39->element = 9;
hudakz 0:e33621169e44 214 dcode39->character = 0;
hudakz 0:e33621169e44 215 dprintf(1, " dir=%x [valid start]\n", dcode39->direction);
hudakz 0:e33621169e44 216 return(ZBAR_PARTIAL);
hudakz 0:e33621169e44 217 }
hudakz 0:e33621169e44 218
hudakz 0:e33621169e44 219 static inline void code39_postprocess (zbar_decoder_t *dcode)
hudakz 0:e33621169e44 220 {
hudakz 0:e33621169e44 221 code39_decoder_t *dcode39 = &dcode->code39;
hudakz 0:e33621169e44 222 int i;
hudakz 0:e33621169e44 223 if(dcode39->direction) {
hudakz 0:e33621169e44 224 /* reverse buffer */
hudakz 0:e33621169e44 225 dprintf(2, " (rev)");
hudakz 0:e33621169e44 226 for(i = 0; i < dcode39->character / 2; i++) {
hudakz 0:e33621169e44 227 unsigned j = dcode39->character - 1 - i;
hudakz 0:e33621169e44 228 char code = dcode->buf[i];
hudakz 0:e33621169e44 229 dcode->buf[i] = dcode->buf[j];
hudakz 0:e33621169e44 230 dcode->buf[j] = code;
hudakz 0:e33621169e44 231 }
hudakz 0:e33621169e44 232 }
hudakz 0:e33621169e44 233 for(i = 0; i < dcode39->character; i++)
hudakz 0:e33621169e44 234 dcode->buf[i] = ((dcode->buf[i] < 0x2b)
hudakz 0:e33621169e44 235 ? code39_characters[(unsigned)dcode->buf[i]]
hudakz 0:e33621169e44 236 : '?');
hudakz 0:e33621169e44 237 dcode->buflen = i;
hudakz 0:e33621169e44 238 dcode->buf[i] = '\0';
hudakz 0:e33621169e44 239 }
hudakz 0:e33621169e44 240
hudakz 0:e33621169e44 241 zbar_symbol_type_t _zbar_decode_code39 (zbar_decoder_t *dcode)
hudakz 0:e33621169e44 242 {
hudakz 0:e33621169e44 243 code39_decoder_t *dcode39 = &dcode->code39;
hudakz 0:e33621169e44 244
hudakz 0:e33621169e44 245 /* update latest character width */
hudakz 0:e33621169e44 246 dcode39->s9 -= get_width(dcode, 9);
hudakz 0:e33621169e44 247 dcode39->s9 += get_width(dcode, 0);
hudakz 0:e33621169e44 248
hudakz 0:e33621169e44 249 if(dcode39->character < 0) {
hudakz 0:e33621169e44 250 if(get_color(dcode) != ZBAR_BAR)
hudakz 0:e33621169e44 251 return(ZBAR_NONE);
hudakz 0:e33621169e44 252 dprintf(2, " code39:");
hudakz 0:e33621169e44 253 return((zbar_symbol_type_t)code39_decode_start(dcode));
hudakz 0:e33621169e44 254 }
hudakz 0:e33621169e44 255
hudakz 0:e33621169e44 256 if(++dcode39->element < 9)
hudakz 0:e33621169e44 257 return(ZBAR_NONE);
hudakz 0:e33621169e44 258
hudakz 0:e33621169e44 259 dprintf(2, " code39[%c%02d+%x]",
hudakz 0:e33621169e44 260 (dcode39->direction) ? '<' : '>',
hudakz 0:e33621169e44 261 dcode39->character, dcode39->element);
hudakz 0:e33621169e44 262
hudakz 0:e33621169e44 263 if(dcode39->element == 10) {
hudakz 0:e33621169e44 264 unsigned space = get_width(dcode, 0);
hudakz 0:e33621169e44 265 if(dcode39->character &&
hudakz 0:e33621169e44 266 dcode->buf[dcode39->character - 1] == 0x2b) { /* STOP */
hudakz 0:e33621169e44 267 /* trim STOP character */
hudakz 0:e33621169e44 268 dcode39->character--;
hudakz 0:e33621169e44 269 zbar_symbol_type_t sym = ZBAR_CODE39;
hudakz 0:e33621169e44 270
hudakz 0:e33621169e44 271 /* trailing quiet zone check */
hudakz 0:e33621169e44 272 if(space && space < dcode39->width / 2) {
hudakz 0:e33621169e44 273 dprintf(2, " [invalid qz]\n");
hudakz 0:e33621169e44 274 sym = ZBAR_NONE;
hudakz 0:e33621169e44 275 }
hudakz 0:e33621169e44 276 else if(dcode39->character < CFG(*dcode39, ZBAR_CFG_MIN_LEN) ||
hudakz 0:e33621169e44 277 (CFG(*dcode39, ZBAR_CFG_MAX_LEN) > 0 &&
hudakz 0:e33621169e44 278 dcode39->character > CFG(*dcode39, ZBAR_CFG_MAX_LEN))) {
hudakz 0:e33621169e44 279 dprintf(2, " [invalid len]\n");
hudakz 0:e33621169e44 280 sym = ZBAR_NONE;
hudakz 0:e33621169e44 281 }
hudakz 0:e33621169e44 282 else {
hudakz 0:e33621169e44 283 /* FIXME checksum (needs config enable) */
hudakz 0:e33621169e44 284 code39_postprocess(dcode);
hudakz 0:e33621169e44 285 dprintf(2, " [valid end]\n");
hudakz 0:e33621169e44 286 }
hudakz 0:e33621169e44 287 dcode39->character = -1;
hudakz 0:e33621169e44 288 if(!sym)
hudakz 0:e33621169e44 289 dcode->lock = ZBAR_NONE;
hudakz 0:e33621169e44 290 return(sym);
hudakz 0:e33621169e44 291 }
hudakz 0:e33621169e44 292 if(space > dcode39->width / 2) {
hudakz 0:e33621169e44 293 /* inter-character space check failure */
hudakz 0:e33621169e44 294 dcode->lock = ZBAR_NONE;
hudakz 0:e33621169e44 295 dcode39->character = -1;
hudakz 0:e33621169e44 296 dprintf(2, " ics>%d [invalid ics]", dcode39->width);
hudakz 0:e33621169e44 297 }
hudakz 0:e33621169e44 298 dcode39->element = ZBAR_NONE;
hudakz 0:e33621169e44 299 dprintf(2, "\n");
hudakz 0:e33621169e44 300 return(ZBAR_NONE);
hudakz 0:e33621169e44 301 }
hudakz 0:e33621169e44 302
hudakz 0:e33621169e44 303 signed char c = code39_decode9(dcode);
hudakz 0:e33621169e44 304 dprintf(2, " c=%d", c);
hudakz 0:e33621169e44 305
hudakz 0:e33621169e44 306 /* lock shared resources */
hudakz 0:e33621169e44 307 if(!dcode39->character && get_lock(dcode, ZBAR_CODE39)) {
hudakz 0:e33621169e44 308 dcode39->character = -1;
hudakz 0:e33621169e44 309 dprintf(1, " [locked %d]\n", dcode->lock);
hudakz 0:e33621169e44 310 return(ZBAR_PARTIAL);
hudakz 0:e33621169e44 311 }
hudakz 0:e33621169e44 312
hudakz 0:e33621169e44 313 if(c < 0 ||
hudakz 0:e33621169e44 314 ((dcode39->character >= BUFFER_MIN) &&
hudakz 0:e33621169e44 315 size_buf(dcode, dcode39->character + 1))) {
hudakz 0:e33621169e44 316 dprintf(1, (c < 0) ? " [aborted]\n" : " [overflow]\n");
hudakz 0:e33621169e44 317 dcode->lock = ZBAR_NONE;
hudakz 0:e33621169e44 318 dcode39->character = -1;
hudakz 0:e33621169e44 319 return(ZBAR_NONE);
hudakz 0:e33621169e44 320 }
hudakz 0:e33621169e44 321 else {
hudakz 0:e33621169e44 322 zassert(c < 0x2c, ZBAR_NONE, "c=%02x s9=%x\n", c, dcode39->s9);
hudakz 0:e33621169e44 323 dprintf(2, "\n");
hudakz 0:e33621169e44 324 }
hudakz 0:e33621169e44 325
hudakz 0:e33621169e44 326 dcode->buf[dcode39->character++] = c;
hudakz 0:e33621169e44 327
hudakz 0:e33621169e44 328 return(ZBAR_NONE);
hudakz 0:e33621169e44 329 }
hudakz 0:e33621169e44 330
hudakz 0:e33621169e44 331 #endif