diff options
author | waker <wakeroid@gmail.com> | 2013-08-18 16:47:43 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2013-08-18 16:47:43 +0200 |
commit | 4b3d9b3dbf50cf65b690099047b6f0f8cbb380d2 (patch) | |
tree | 82d5158eac8bf97778fa71943d480a63e568db67 /plugins/libparser | |
parent | b81070152bb7a13c50a936ed9b1cf3d734583b2f (diff) |
moved parser into separate lib
Diffstat (limited to 'plugins/libparser')
-rw-r--r-- | plugins/libparser/parser.c | 107 | ||||
-rw-r--r-- | plugins/libparser/parser.h | 39 |
2 files changed, 146 insertions, 0 deletions
diff --git a/plugins/libparser/parser.c b/plugins/libparser/parser.c new file mode 100644 index 00000000..c49eeb72 --- /dev/null +++ b/plugins/libparser/parser.c @@ -0,0 +1,107 @@ +/* + DeaDBeeF - ultimate music player for GNU/Linux systems with X11 + Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <stdlib.h> +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include "parser.h" + +// very basic parser, ripped from psynth, optimized, and extended to support +// quoted strings and extra special chars +int parser_line; + +void +parser_init (void) { + parser_line = 1; +} + +const char * +skipws (const char *p) { + while (*p <= ' ' && *p) { + if (*p == '\n') { + parser_line++; + } + p++; + } + if (!*p) { + return NULL; + } + return p; +} + +const char * +gettoken (const char *p, char *tok) { + const char *c; + assert (p); + assert (tok); + int n = MAX_TOKEN-1; + char specialchars[] = "{}();"; + if (!(p = skipws (p))) { + return NULL; + } + if (*p == '"') { + p++; + c = p; + while (n > 0 && *c && *c != '"') { + if (*c == '\n') { + parser_line++; + } + *tok++ = *c++; + n--; + } + if (*c) { + c++; + } + *tok = 0; + return c; + } + if (strchr (specialchars, *p)) { + *tok = *p; + tok[1] = 0; + return p+1; + } + c = p; + while (n > 0 && *c > ' ' && !strchr (specialchars, *c)) { + *tok++ = *c++; + n--; + } + *tok = 0; + return c; +} + +const char * +gettoken_warn_eof (const char *p, char *tok) { + p = gettoken (p, tok); + if (!p) { + fprintf (stderr, "parser: unexpected eof at line %d", parser_line); + } + return p; +} + +const char * +gettoken_err_eof (const char *p, char *tok) { + p = gettoken (p, tok); + if (!p) { + fprintf (stderr, "parser: unexpected eof at line %d", parser_line); + exit (-1); + } + return p; +} + + diff --git a/plugins/libparser/parser.h b/plugins/libparser/parser.h new file mode 100644 index 00000000..b0f95169 --- /dev/null +++ b/plugins/libparser/parser.h @@ -0,0 +1,39 @@ +/* + DeaDBeeF - ultimate music player for GNU/Linux systems with X11 + Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef __PARSER_H +#define __PARSER_H + +#define MAX_TOKEN 256 +extern int parser_line; + +void +parser_init (void); + +const char * +skipws (const char *p); + +const char * +gettoken (const char *p, char *tok); + +const char * +gettoken_warn_eof (const char *p, char *tok); + +const char * +gettoken_err_eof (const char *p, char *tok); + +#endif |