summaryrefslogtreecommitdiffstats
path: root/zbar/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'zbar/config.c')
-rw-r--r--zbar/config.c171
1 files changed, 171 insertions, 0 deletions
diff --git a/zbar/config.c b/zbar/config.c
new file mode 100644
index 0000000..1b2a39b
--- /dev/null
+++ b/zbar/config.c
@@ -0,0 +1,171 @@
+/*------------------------------------------------------------------------
+ * Copyright 2008-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
+ *
+ * This file is part of the ZBar Bar Code Reader.
+ *
+ * The ZBar Bar Code Reader is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The ZBar Bar Code Reader is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser Public License
+ * along with the ZBar Bar Code Reader; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * http://sourceforge.net/projects/zbar
+ *------------------------------------------------------------------------*/
+
+#include "config.h"
+#include <stdlib.h> /* strtol */
+#include <string.h> /* strchr, strncmp, strlen */
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <zbar.h>
+
+int zbar_parse_config(const char *cfgstr, zbar_symbol_type_t *sym,
+ zbar_config_t *cfg, int *val)
+{
+ const char *dot, *eq;
+ int len;
+ char negate;
+ if (!cfgstr)
+ return (1);
+
+ dot = strchr(cfgstr, '.');
+ if (dot) {
+ int len = dot - cfgstr;
+ if (!len || (len == 1 && !strncmp(cfgstr, "*", len)))
+ *sym = 0;
+ else if (len < 2)
+ return (1);
+ else if (!strncmp(cfgstr, "qrcode", len))
+ *sym = ZBAR_QRCODE;
+ else if (!strncmp(cfgstr, "sqcode", len))
+ *sym = ZBAR_SQCODE;
+ else if (!strncmp(cfgstr, "db", len))
+ *sym = ZBAR_DATABAR;
+ else if (len < 3)
+ return (1);
+ else if (!strncmp(cfgstr, "upca", len))
+ *sym = ZBAR_UPCA;
+ else if (!strncmp(cfgstr, "upce", len))
+ *sym = ZBAR_UPCE;
+ else if (!strncmp(cfgstr, "ean13", len))
+ *sym = ZBAR_EAN13;
+ else if (!strncmp(cfgstr, "ean8", len))
+ *sym = ZBAR_EAN8;
+ else if (!strncmp(cfgstr, "ean5", len))
+ *sym = ZBAR_EAN5;
+ else if (!strncmp(cfgstr, "ean2", len))
+ *sym = ZBAR_EAN2;
+ else if (!strncmp(cfgstr, "composite", len))
+ *sym = ZBAR_COMPOSITE;
+ else if (!strncmp(cfgstr, "i25", len))
+ *sym = ZBAR_I25;
+ else if (len < 4)
+ return (1);
+ else if (!strncmp(cfgstr, "scanner", len))
+ *sym = ZBAR_PARTIAL; /* FIXME lame */
+ else if (!strncmp(cfgstr, "isbn13", len))
+ *sym = ZBAR_ISBN13;
+ else if (!strncmp(cfgstr, "isbn10", len))
+ *sym = ZBAR_ISBN10;
+ else if (!strncmp(cfgstr, "db-exp", len))
+ *sym = ZBAR_DATABAR_EXP;
+ else if (!strncmp(cfgstr, "codabar", len))
+ *sym = ZBAR_CODABAR;
+ else if (len < 6)
+ return (1);
+ else if (!strncmp(cfgstr, "code93", len))
+ *sym = ZBAR_CODE93;
+ else if (!strncmp(cfgstr, "code39", len))
+ *sym = ZBAR_CODE39;
+ else if (!strncmp(cfgstr, "pdf417", len))
+ *sym = ZBAR_PDF417;
+ else if (len < 7)
+ return (1);
+ else if (!strncmp(cfgstr, "code128", len))
+ *sym = ZBAR_CODE128;
+ else if (!strncmp(cfgstr, "databar", len))
+ *sym = ZBAR_DATABAR;
+ else if (!strncmp(cfgstr, "databar-exp", len))
+ *sym = ZBAR_DATABAR_EXP;
+ else
+ return (1);
+ cfgstr = dot + 1;
+ } else
+ *sym = 0;
+
+ len = strlen(cfgstr);
+ eq = strchr(cfgstr, '=');
+ if (eq)
+ len = eq - cfgstr;
+ else
+ *val = 1; /* handle this here so we can override later */
+ negate = 0;
+
+ if (len > 3 && !strncmp(cfgstr, "no-", 3)) {
+ negate = 1;
+ cfgstr += 3;
+ len -= 3;
+ }
+
+ if (len < 1)
+ return (1);
+ else if (!strncmp(cfgstr, "y-density", len))
+ *cfg = ZBAR_CFG_Y_DENSITY;
+ else if (!strncmp(cfgstr, "x-density", len))
+ *cfg = ZBAR_CFG_X_DENSITY;
+ else if (len < 2)
+ return (1);
+ else if (!strncmp(cfgstr, "enable", len))
+ *cfg = ZBAR_CFG_ENABLE;
+ else if (len < 3)
+ return (1);
+ else if (!strncmp(cfgstr, "disable", len)) {
+ *cfg = ZBAR_CFG_ENABLE;
+ negate = !negate; /* no-disable ?!? */
+ } else if (!strncmp(cfgstr, "min-length", len))
+ *cfg = ZBAR_CFG_MIN_LEN;
+ else if (!strncmp(cfgstr, "max-length", len))
+ *cfg = ZBAR_CFG_MAX_LEN;
+ else if (!strncmp(cfgstr, "ascii", len))
+ *cfg = ZBAR_CFG_ASCII;
+ else if (!strncmp(cfgstr, "binary", len))
+ *cfg = ZBAR_CFG_BINARY;
+ else if (!strncmp(cfgstr, "add-check", len))
+ *cfg = ZBAR_CFG_ADD_CHECK;
+ else if (!strncmp(cfgstr, "emit-check", len))
+ *cfg = ZBAR_CFG_EMIT_CHECK;
+ else if (!strncmp(cfgstr, "uncertainty", len))
+ *cfg = ZBAR_CFG_UNCERTAINTY;
+ else if (!strncmp(cfgstr, "test-inverted", len))
+ *cfg = ZBAR_CFG_TEST_INVERTED;
+ else if (!strncmp(cfgstr, "position", len))
+ *cfg = ZBAR_CFG_POSITION;
+ else
+ return (1);
+
+ if (eq) {
+#ifdef HAVE_ERRNO_H
+ errno = 0;
+#endif
+ *val = strtol(eq + 1, NULL, 0);
+#ifdef HAVE_ERRNO_H
+ if (errno)
+ return (1);
+#endif
+ }
+ if (negate)
+ *val = !*val;
+
+ return (0);
+}