>From dec00bfb90fee6ae008f76f7c598724aa9475707 Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
Date: Sat, 9 Oct 2010 09:23:40 +0200
Subject: [PATCH] wmmenugen: Add file name validator function

Add optional interface parsers may choose to implement that, when
a directory is being scanned for files to parse, may, based on
the file name, decide whether or not said file should be parsed.

Signed-off-by: Tamas TEVESZ <[email protected]>
---
 util/wmmenugen.c                |   21 ++++++++++++++-------
 util/wmmenugen.h                |    2 ++
 util/wmmenugen_parse_wmconfig.c |   10 ++++++++++
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/util/wmmenugen.c b/util/wmmenugen.c
index cbb55d8..a87a001 100644
--- a/util/wmmenugen.c
+++ b/util/wmmenugen.c
@@ -44,6 +44,7 @@ static int menuSortFunc(const void *left, const void *right);
 static int nodeFindSubMenuByNameFunc(const void *item, const void *cdata);
 static WMTreeNode *findPositionInMenu(char *submenu);
 static void (*parse)(const char *file, void 
(*addWMMenuEntryCallback)(WMMenuEntry *aEntry));
+static Bool (*validateFilename)(const char *filename);
 
 static WMArray *plMenuNodes;
 char *terminal;
@@ -59,6 +60,7 @@ int main(int argc, char **argv)
        plMenuNodes = WMCreateArray(8); /* grows on demand */
        menu = (WMTreeNode *)NULL;
        parse = NULL;
+       validateFilename = NULL;
 
        /* assemblePLMenuFunc passes this around */
        previousDepth = (int *)wmalloc(sizeof(int));
@@ -90,6 +92,7 @@ int main(int argc, char **argv)
                                fputs("Using parser \"wmconfig\"\n", stderr);
 #endif
                                parse = &parse_wmconfig;
+                               validateFilename = &wmconfig_validate_file;
                        } else {
                                fprintf(stderr, "%s: Unknown parser \"%s\"\n", 
__progname, argv[i] + 8);
                        }
@@ -142,6 +145,10 @@ static int dirParseFunc(const char *filename, const struct 
stat *st, int tflags,
        (void)tflags;
        (void)ftw;
 
+       if (validateFilename &&
+           !validateFilename(filename))
+               return 0;
+
        parse(filename, addWMMenuEntryCallback);
        return 0;
 }
@@ -196,7 +203,7 @@ static void assemblePLMenuFunc(WMTreeNode *aNode, void 
*data)
        pDepth = *(int *)data;
 
        if (pDepth > cDepth) {                          /* just ascended out of 
a/several submenu(s) */
-               WMPropList *last, *but;                 /* merge the 
differences */
+               WMPropList *last, *but;                 /* merge the tail up to 
the current position */
                int i;
                for (i = pDepth - cDepth; i > 0; i--) {
                        last = WMPopFromArray(plMenuNodes);
@@ -239,12 +246,12 @@ static void assemblePLMenuFunc(WMTreeNode *aNode, void 
*data)
                                snprintf(buf, sizeof(buf), "%s -e \"%s\"", 
terminal, wm->CmdLine);
                        else
                                snprintf(buf, sizeof(buf), "%s", wm->CmdLine);
-                       WMAddToPLArray(pl, WMCreatePLArray(
-                               WMCreatePLString(wm->Name),
-                               WMCreatePLString("SHEXEC"),
-                               WMCreatePLString(buf),
-                               NULL)
-                       );
+                               WMAddToPLArray(pl, WMCreatePLArray(
+                                       WMCreatePLString(wm->Name),
+                                       WMCreatePLString("SHEXEC"),
+                                       WMCreatePLString(buf),
+                                       NULL)
+                               );
                }
                WMAddToArray(plMenuNodes, pl);
        }
diff --git a/util/wmmenugen.h b/util/wmmenugen.h
index 920c6e3..61bb06a 100644
--- a/util/wmmenugen.h
+++ b/util/wmmenugen.h
@@ -57,3 +57,5 @@ Bool fileInPath(const char *file);
  */
 void parse_xdg(const char *file, void (*addWMMenuEntryCallback)(WMMenuEntry 
*aEntry));
 void parse_wmconfig(const char *file, void 
(*addWMMenuEntryCallback)(WMMenuEntry *aEntry));
+Bool wmconfig_validate_file(const char *filename);
+
diff --git a/util/wmmenugen_parse_wmconfig.c b/util/wmmenugen_parse_wmconfig.c
index 26d1f7a..6b244d8 100644
--- a/util/wmmenugen_parse_wmconfig.c
+++ b/util/wmmenugen_parse_wmconfig.c
@@ -129,6 +129,16 @@ void parse_wmconfig(const char *file, void 
(*addWMMenuEntryCallback)(WMMenuEntry
        }
 }
 
+/* an example to illustrate validateFilename.
+ * with wmconfig, no special handling is needed
+ */
+Bool wmconfig_validate_file(const char *filename)
+{
+       (void)filename;
+
+       return True;
+}
+
 /* get a line allocating label, key and value as necessary */
 static void parse_wmconfig_line(char **label, char **key, char **value, char 
*line)
 {
-- 
1.7.0.4


-- 
[-]

mkdir /nonexistent
From dec00bfb90fee6ae008f76f7c598724aa9475707 Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
Date: Sat, 9 Oct 2010 09:23:40 +0200
Subject: [PATCH] wmmenugen: Add file name validator function

Add optional interface parsers may choose to implement that, when
a directory is being scanned for files to parse, may, based on
the file name, decide whether or not said file should be parsed.

Signed-off-by: Tamas TEVESZ <[email protected]>
---
 util/wmmenugen.c                |   21 ++++++++++++++-------
 util/wmmenugen.h                |    2 ++
 util/wmmenugen_parse_wmconfig.c |   10 ++++++++++
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/util/wmmenugen.c b/util/wmmenugen.c
index cbb55d8..a87a001 100644
--- a/util/wmmenugen.c
+++ b/util/wmmenugen.c
@@ -44,6 +44,7 @@ static int menuSortFunc(const void *left, const void *right);
 static int nodeFindSubMenuByNameFunc(const void *item, const void *cdata);
 static WMTreeNode *findPositionInMenu(char *submenu);
 static void (*parse)(const char *file, void (*addWMMenuEntryCallback)(WMMenuEntry *aEntry));
+static Bool (*validateFilename)(const char *filename);
 
 static WMArray *plMenuNodes;
 char *terminal;
@@ -59,6 +60,7 @@ int main(int argc, char **argv)
 	plMenuNodes = WMCreateArray(8); /* grows on demand */
 	menu = (WMTreeNode *)NULL;
 	parse = NULL;
+	validateFilename = NULL;
 
 	/* assemblePLMenuFunc passes this around */
 	previousDepth = (int *)wmalloc(sizeof(int));
@@ -90,6 +92,7 @@ int main(int argc, char **argv)
 				fputs("Using parser \"wmconfig\"\n", stderr);
 #endif
 				parse = &parse_wmconfig;
+				validateFilename = &wmconfig_validate_file;
 			} else {
 				fprintf(stderr, "%s: Unknown parser \"%s\"\n", __progname, argv[i] + 8);
 			}
@@ -142,6 +145,10 @@ static int dirParseFunc(const char *filename, const struct stat *st, int tflags,
 	(void)tflags;
 	(void)ftw;
 
+	if (validateFilename &&
+	    !validateFilename(filename))
+		return 0;
+
 	parse(filename, addWMMenuEntryCallback);
 	return 0;
 }
@@ -196,7 +203,7 @@ static void assemblePLMenuFunc(WMTreeNode *aNode, void *data)
 	pDepth = *(int *)data;
 
 	if (pDepth > cDepth) {				/* just ascended out of a/several submenu(s) */
-		WMPropList *last, *but;			/* merge the differences */
+		WMPropList *last, *but;			/* merge the tail up to the current position */
 		int i;
 		for (i = pDepth - cDepth; i > 0; i--) {
 			last = WMPopFromArray(plMenuNodes);
@@ -239,12 +246,12 @@ static void assemblePLMenuFunc(WMTreeNode *aNode, void *data)
 				snprintf(buf, sizeof(buf), "%s -e \"%s\"", terminal, wm->CmdLine);
 			else
 				snprintf(buf, sizeof(buf), "%s", wm->CmdLine);
-			WMAddToPLArray(pl, WMCreatePLArray(
-				WMCreatePLString(wm->Name),
-				WMCreatePLString("SHEXEC"),
-				WMCreatePLString(buf),
-				NULL)
-			);
+				WMAddToPLArray(pl, WMCreatePLArray(
+					WMCreatePLString(wm->Name),
+					WMCreatePLString("SHEXEC"),
+					WMCreatePLString(buf),
+					NULL)
+				);
 		}
 		WMAddToArray(plMenuNodes, pl);
 	}
diff --git a/util/wmmenugen.h b/util/wmmenugen.h
index 920c6e3..61bb06a 100644
--- a/util/wmmenugen.h
+++ b/util/wmmenugen.h
@@ -57,3 +57,5 @@ Bool fileInPath(const char *file);
  */
 void parse_xdg(const char *file, void (*addWMMenuEntryCallback)(WMMenuEntry *aEntry));
 void parse_wmconfig(const char *file, void (*addWMMenuEntryCallback)(WMMenuEntry *aEntry));
+Bool wmconfig_validate_file(const char *filename);
+
diff --git a/util/wmmenugen_parse_wmconfig.c b/util/wmmenugen_parse_wmconfig.c
index 26d1f7a..6b244d8 100644
--- a/util/wmmenugen_parse_wmconfig.c
+++ b/util/wmmenugen_parse_wmconfig.c
@@ -129,6 +129,16 @@ void parse_wmconfig(const char *file, void (*addWMMenuEntryCallback)(WMMenuEntry
 	}
 }
 
+/* an example to illustrate validateFilename.
+ * with wmconfig, no special handling is needed
+ */
+Bool wmconfig_validate_file(const char *filename)
+{
+	(void)filename;
+
+	return True;
+}
+
 /* get a line allocating label, key and value as necessary */
 static void parse_wmconfig_line(char **label, char **key, char **value, char *line)
 {
-- 
1.7.0.4

Reply via email to