From 4b3d9b3dbf50cf65b690099047b6f0f8cbb380d2 Mon Sep 17 00:00:00 2001 From: waker Date: Sun, 18 Aug 2013 16:47:43 +0200 Subject: moved parser into separate lib --- plugins/libparser/parser.c | 107 +++++++++++++++++++++++++++++++++++++++++++++ plugins/libparser/parser.h | 39 +++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 plugins/libparser/parser.c create mode 100644 plugins/libparser/parser.h (limited to 'plugins/libparser') 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 + + 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 . +*/ + +#include +#include +#include +#include +#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 + + 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 . +*/ +#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 -- cgit v1.2.3