mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-20 04:48:06 +01:00
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.
This commit is contained in:
committed by
Carlos R. Mafra
parent
39fa6d9e2c
commit
f0e8b76c03
@@ -71,6 +71,7 @@ libWUtil_la_SOURCES = \
|
|||||||
handlers.c \
|
handlers.c \
|
||||||
hashtable.c \
|
hashtable.c \
|
||||||
memory.c \
|
memory.c \
|
||||||
|
menuparser.c \
|
||||||
misc.c \
|
misc.c \
|
||||||
notification.c \
|
notification.c \
|
||||||
proplist.c \
|
proplist.c \
|
||||||
|
|||||||
@@ -866,6 +866,13 @@ void WMSetUDSearchList(WMUserDefaults *database, WMPropList *list);
|
|||||||
extern char *WMUserDefaultsDidChangeNotification;
|
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 */
|
/* Global variables */
|
||||||
|
|||||||
124
WINGs/menuparser.c
Normal file
124
WINGs/menuparser.c
Normal file
@@ -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 <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include <WINGs/WUtil.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -891,101 +891,6 @@ static void freeline(char *title, char *command, char *parameter, char *shortcut
|
|||||||
wfree(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)
|
static WMenu *parseCascade(WScreen * scr, WMenu * menu, FILE * file, char *file_name)
|
||||||
{
|
{
|
||||||
char *line;
|
char *line;
|
||||||
|
|||||||
Reference in New Issue
Block a user