From f0e8b76c033c98662dd4179cb2b829b20ebd9fe4 Mon Sep 17 00:00:00 2001 From: Christophe CURIS Date: Sun, 8 Jul 2012 14:04:44 +0200 Subject: [PATCH] Remove dependency to CPP: Moving parser functions to a dedicated file Due to the tasks to take in charge, the internal parser will grow in size to support basic CPP feature, so it is a good idea to start by moving the current functions into a dedicated file. --- WINGs/Makefile.am | 1 + WINGs/WINGs/WUtil.h | 7 +++ WINGs/menuparser.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/rootmenu.c | 95 ---------------------------------------- 4 files changed, 132 insertions(+), 95 deletions(-) create mode 100644 WINGs/menuparser.c diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 0c8f57f4..831325f0 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -71,6 +71,7 @@ libWUtil_la_SOURCES = \ handlers.c \ hashtable.c \ memory.c \ + menuparser.c \ misc.c \ notification.c \ proplist.c \ diff --git a/WINGs/WINGs/WUtil.h b/WINGs/WINGs/WUtil.h index 4ba66626..e7f4fc00 100644 --- a/WINGs/WINGs/WUtil.h +++ b/WINGs/WINGs/WUtil.h @@ -866,6 +866,13 @@ void WMSetUDSearchList(WMUserDefaults *database, WMPropList *list); extern char *WMUserDefaultsDidChangeNotification; +/* ---[ WINGs/menuparser.c ]---------------------------------------------- */ + + +char *getLine(void * file, const char *file_name); +void separateline(char *line, char **title, char **command, char **parameter, char **shortcut); + + /*-------------------------------------------------------------------------*/ /* Global variables */ diff --git a/WINGs/menuparser.c b/WINGs/menuparser.c new file mode 100644 index 00000000..dcd0d362 --- /dev/null +++ b/WINGs/menuparser.c @@ -0,0 +1,124 @@ +/* + * Window Maker window manager + * + * Copyright (c) 1997-2003 Alfredo K. Kojima + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include "wconfig.h" + +#include +#include +#include + +#include + +#define MAXLINE 1024 + + +char *getLine(void * file, const char *file_name) +{ + char linebuf[MAXLINE]; + char *line = NULL, *result = NULL; + size_t len; + int done; + +again: + done = 0; + while (!done && fgets(linebuf, sizeof(linebuf), file) != NULL) { + line = wtrimspace(linebuf); + len = strlen(line); + + /* allow line wrapping */ + if (len > 0 && line[len - 1] == '\\') { + line[len - 1] = '\0'; + } else { + done = 1; + } + + if (result == NULL) { + result = line; + } else { + if (strlen(result) < MAXLINE) { + result = wstrappend(result, line); + } + wfree(line); + } + } + if (!done || ferror(file)) { + wfree(result); + result = NULL; + } else if (result != NULL && (result[0] == 0 || result[0] == '#' || + (result[0] == '/' && result[1] == '/'))) { + wfree(result); + result = NULL; + goto again; + } else if (result != NULL && strlen(result) >= MAXLINE) { + wwarning(_("%s:maximal line size exceeded in menu config: %s"), + file_name, line); + wfree(result); + result = NULL; + goto again; + } + + return result; +} + +void separateline(char *line, char **title, char **command, char **parameter, char **shortcut) +{ + char *suffix, *next = line; + + *title = NULL; + *command = NULL; + *parameter = NULL; + *shortcut = NULL; + + /* get the title */ + *title = wtokennext(line, &next); + if (next == NULL) + return; + line = next; + + /* get the command or shortcut keyword */ + *command = wtokennext(line, &next); + if (next == NULL) + return; + line = next; + + if (*command != NULL && strcmp(*command, "SHORTCUT") == 0) { + /* get the shortcut */ + *shortcut = wtokennext(line, &next); + if (next == NULL) + return; + line = next; + + /* get the command */ + *command = wtokennext(line, &next); + if (next == NULL) + return; + line = next; + } + + /* get the parameters */ + suffix = wtrimspace(line); + + /* should we keep this weird old behavior? */ + if (suffix[0] == '"') { + *parameter = wtokennext(suffix, &next); + wfree(suffix); + } else { + *parameter = suffix; + } +} diff --git a/src/rootmenu.c b/src/rootmenu.c index 6c4bb2d3..c0e7ddef 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -891,101 +891,6 @@ static void freeline(char *title, char *command, char *parameter, char *shortcut wfree(shortcut); } -static void separateline(char *line, char **title, char **command, char **parameter, char **shortcut) -{ - char *suffix, *next = line; - - *title = NULL; - *command = NULL; - *parameter = NULL; - *shortcut = NULL; - - /* get the title */ - *title = wtokennext(line, &next); - if (next == NULL) - return; - line = next; - - /* get the command or shortcut keyword */ - *command = wtokennext(line, &next); - if (next == NULL) - return; - line = next; - - if (*command != NULL && strcmp(*command, "SHORTCUT") == 0) { - /* get the shortcut */ - *shortcut = wtokennext(line, &next); - if (next == NULL) - return; - line = next; - - /* get the command */ - *command = wtokennext(line, &next); - if (next == NULL) - return; - line = next; - } - - /* get the parameters */ - suffix = wtrimspace(line); - - /* should we keep this weird old behavior? */ - if (suffix[0] == '"') { - *parameter = wtokennext(suffix, &next); - wfree(suffix); - } else { - *parameter = suffix; - } -} - -static char *getLine(FILE * file, const char *file_name) -{ - char linebuf[MAXLINE]; - char *line = NULL, *result = NULL; - size_t len; - int done; - -again: - done = 0; - while (!done && fgets(linebuf, sizeof(linebuf), file) != NULL) { - line = wtrimspace(linebuf); - len = strlen(line); - - /* allow line wrapping */ - if (len > 0 && line[len - 1] == '\\') { - line[len - 1] = '\0'; - } else { - done = 1; - } - - if (result == NULL) { - result = line; - } else { - if (strlen(result) < MAXLINE) { - result = wstrappend(result, line); - } - wfree(line); - } - } - if (!done || ferror(file)) { - wfree(result); - result = NULL; - } else if (result != NULL && (result[0] == 0 || result[0] == '#' || - (result[0] == '/' && result[1] == '/'))) { - wfree(result); - result = NULL; - goto again; - } else if (result != NULL && strlen(result) >= MAXLINE) { - wwarning(_("%s:maximal line size exceeded in menu config: %s"), - file_name, line); - wfree(result); - result = NULL; - goto again; - } - - return result; -} - static WMenu *parseCascade(WScreen * scr, WMenu * menu, FILE * file, char *file_name) { char *line; -- 2.11.4.GIT