From 1ab4141e381fc5672c3b9c6e54ec46d6b360be7e Mon Sep 17 00:00:00 2001 From: nbd Date: Sun, 17 Jul 2005 22:50:05 +0000 Subject: add wildcard support to menuconfig git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@1493 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/config/lex.zconf.c_shipped | 65 +++++++++++++++++++++++++------------- package/config/zconf.l | 65 +++++++++++++++++++++++++------------- 2 files changed, 86 insertions(+), 44 deletions(-) (limited to 'package/config') diff --git a/package/config/lex.zconf.c_shipped b/package/config/lex.zconf.c_shipped index b877bb6b3..83026dfaa 100644 --- a/package/config/lex.zconf.c_shipped +++ b/package/config/lex.zconf.c_shipped @@ -20,6 +20,7 @@ #include #include #include +#include /* end standard C headers. */ @@ -3622,32 +3623,52 @@ void zconf_initscan(const char *name) void zconf_nextfile(const char *name) { - struct file *file = file_lookup(name); - struct buffer *buf = malloc(sizeof(*buf)); - memset(buf, 0, sizeof(*buf)); - - current_buf->state = YY_CURRENT_BUFFER; - zconfin = zconf_fopen(name); - if (!zconfin) { - printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + size_t i; + int retval; + glob_t files; + char *filename; + struct file *file; + struct buffer *buf; + + retval = glob(name, GLOB_ERR | GLOB_MARK, NULL, &files); + if (retval == GLOB_NOSPACE || retval == GLOB_ABORTED || retval == GLOB_NOMATCH) { + printf("%s:%d: glob failed: %s \"%s\"\n", zconf_curname(), zconf_lineno(), + retval == GLOB_NOSPACE ? "failed to allocate memory" : + retval == GLOB_ABORTED ? "read error" : "no match", + name); exit(1); } - zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); - buf->parent = current_buf; - current_buf = buf; - if (file->flags & FILE_BUSY) { - printf("recursive scan (%s)?\n", name); - exit(1); - } - if (file->flags & FILE_SCANNED) { - printf("file %s already scanned?\n", name); - exit(1); + for (i = files.gl_pathc-1; i != (size_t)-1; --i) { + filename = files.gl_pathv[i]; + + file = file_lookup(filename); + buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(filename); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", + zconf_curname(), zconf_lineno(), filename); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", filename); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", filename); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; } - file->flags |= FILE_BUSY; - file->lineno = 1; - file->parent = current_file; - current_file = file; } static struct buffer *zconf_endfile(void) diff --git a/package/config/zconf.l b/package/config/zconf.l index 55517b287..3a4947a88 100644 --- a/package/config/zconf.l +++ b/package/config/zconf.l @@ -12,6 +12,7 @@ #include #include #include +#include #define LKC_DIRECT_LINK #include "lkc.h" @@ -301,32 +302,52 @@ void zconf_initscan(const char *name) void zconf_nextfile(const char *name) { - struct file *file = file_lookup(name); - struct buffer *buf = malloc(sizeof(*buf)); - memset(buf, 0, sizeof(*buf)); - - current_buf->state = YY_CURRENT_BUFFER; - yyin = zconf_fopen(name); - if (!yyin) { - printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + size_t i; + int retval; + glob_t files; + char *filename; + struct file *file; + struct buffer *buf; + + retval = glob(name, GLOB_ERR | GLOB_MARK, NULL, &files); + if (retval == GLOB_NOSPACE || retval == GLOB_ABORTED || retval == GLOB_NOMATCH) { + printf("%s:%d: glob failed: %s \"%s\"\n", zconf_curname(), zconf_lineno(), + retval == GLOB_NOSPACE ? "failed to allocate memory" : + retval == GLOB_ABORTED ? "read error" : "no match", + name); exit(1); } - yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - buf->parent = current_buf; - current_buf = buf; - if (file->flags & FILE_BUSY) { - printf("recursive scan (%s)?\n", name); - exit(1); - } - if (file->flags & FILE_SCANNED) { - printf("file %s already scanned?\n", name); - exit(1); + for (i = files.gl_pathc-1; i != (size_t)-1; --i) { + filename = files.gl_pathv[i]; + + file = file_lookup(filename); + buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(filename); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", + zconf_curname(), zconf_lineno(), filename); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", filename); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", filename); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; } - file->flags |= FILE_BUSY; - file->lineno = 1; - file->parent = current_file; - current_file = file; } static struct buffer *zconf_endfile(void) -- cgit v1.2.3