aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/parse_config.c16
-rw-r--r--miscutils/fbsplash.c86
-rw-r--r--modutils/modprobe-small.c16
-rw-r--r--networking/libiproute/rt_names.c44
5 files changed, 57 insertions, 106 deletions
diff --git a/include/libbb.h b/include/libbb.h
index c0b731b36..47fcdf08b 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1006,6 +1006,7 @@ enum {
PARSE_MIN_DIE = 0x00100000, // die if less tokens found
// keep a copy of current line
PARSE_KEEP_COPY = 0x00200000 * ENABLE_DEBUG_CROND_OPTION,
+ PARSE_ESCAPE = 0x00400000, // process escape sequences in tokens
};
typedef struct parser_t {
FILE *fp;
diff --git a/libbb/parse_config.c b/libbb/parse_config.c
index d1b29218b..83dc997f6 100644
--- a/libbb/parse_config.c
+++ b/libbb/parse_config.c
@@ -66,8 +66,7 @@ parser_t* FAST_FUNC config_open2(const char *filename, FILE* FAST_FUNC (*fopen_f
parser->fp = fopen_func(filename);
if (parser->fp)
return parser;
- if (ENABLE_FEATURE_CLEAN_UP)
- free(parser);
+ free(parser);
return NULL;
}
@@ -212,6 +211,19 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const
if ((flags & (PARSE_DONT_REDUCE|PARSE_DONT_TRIM)) || *line) {
//bb_info_msg("N[%d] T[%s]", ii, line);
tokens[ii++] = line;
+ // process escapes in token
+ if (flags & PARSE_ESCAPE) {
+ char *s = line;
+ while (*s) {
+ if (*s == '\\') {
+ s++;
+ *line++ = bb_process_escape_sequence((const char **)&s);
+ } else {
+ *line++ = *s++;
+ }
+ }
+ *line = '\0';
+ }
}
line = q;
//bb_info_msg("A[%s]", line);
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 380f09bea..6357f78ea 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -38,13 +38,7 @@ struct globals {
FILE *logfile_fd; // log file
#endif
unsigned char *addr; // pointer to framebuffer memory
- unsigned nbar_width; // progress bar width
- unsigned nbar_height; // progress bar height
- unsigned nbar_posx; // progress bar horizontal position
- unsigned nbar_posy; // progress bar vertical position
- unsigned char nbar_colr; // progress bar color red component
- unsigned char nbar_colg; // progress bar color green component
- unsigned char nbar_colb; // progress bar color blue component
+ unsigned ns[7]; // n-parameters
const char *image_filename;
struct fb_var_screeninfo scr_var;
struct fb_fix_screeninfo scr_fix;
@@ -54,6 +48,13 @@ struct globals {
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
} while (0)
+#define nbar_width ns[0] // progress bar width
+#define nbar_height ns[1] // progress bar height
+#define nbar_posx ns[2] // progress bar horizontal position
+#define nbar_posy ns[3] // progress bar vertical position
+#define nbar_colr ns[4] // progress bar color red component
+#define nbar_colg ns[5] // progress bar color green component
+#define nbar_colb ns[6] // progress bar color blue component
#if DEBUG
#define DEBUG_MESSAGE(strMessage, args...) \
@@ -280,77 +281,32 @@ static void fb_drawimage(void)
static void init(const char *cfg_filename)
{
static const char const param_names[] ALIGN1 =
- "BAR_LEFT\0" "BAR_TOP\0"
"BAR_WIDTH\0" "BAR_HEIGHT\0"
+ "BAR_LEFT\0" "BAR_TOP\0"
"BAR_R\0" "BAR_G\0" "BAR_B\0"
#if DEBUG
"DEBUG\0"
#endif
;
- FILE *inifile;
- char *buf;
-
- inifile = xfopen_stdin(cfg_filename);
-
- while ((buf = xmalloc_fgetline(inifile)) != NULL) {
- char *value_str;
- int val;
-
- if (*buf == '#') { // it's a comment
- free(buf);
- continue;
- }
-
- value_str = strchr(buf, '=');
- if (!value_str)
- goto err;
- *value_str++ = '\0';
- val = xatoi_u(value_str);
-
- switch (index_in_strings(param_names, buf)) {
- case 0:
- // progress bar horizontal position
- G.nbar_posx = val;
- break;
- case 1:
- // progress bar vertical position
- G.nbar_posy = val;
- break;
- case 2:
- // progress bar width
- G.nbar_width = val;
- break;
- case 3:
- // progress bar height
- G.nbar_height = val;
- break;
- case 4:
- // progress bar color - red component
- G.nbar_colr = val;
- break;
- case 5:
- // progress bar color - green component
- G.nbar_colg = val;
- break;
- case 6:
- // progress bar color - blue component
- G.nbar_colb = val;
- break;
+ char *token[2];
+ parser_t *parser = config_open2(cfg_filename, xfopen_stdin);
+ while (config_read(parser, token, 2, 2, "#=", PARSE_MIN_DIE)) {
+ unsigned val = xatoi_u(token[1]);
+ int i = index_in_strings(param_names, token[0]);
+ if (i < 0)
+ bb_error_msg_and_die("syntax error: '%s'", token[0]);
+ if (i >= 0 && i < 7)
+ G.ns[i] = val;
#if DEBUG
- case 7:
+ if (i == 7) {
G.bdebug_messages = val;
if (G.bdebug_messages)
G.logfile_fd = xfopen_for_write("/tmp/fbsplash.log");
- break;
-#endif
- err:
- default:
- bb_error_msg_and_die("syntax error: '%s'", buf);
}
- free(buf);
+#endif
}
- fclose(inifile);
+ config_close(parser);
}
diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c
index f75dae8a3..1654cc52d 100644
--- a/modutils/modprobe-small.c
+++ b/modutils/modprobe-small.c
@@ -485,23 +485,19 @@ static module_info* find_alias(const char *alias)
}
#if ENABLE_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED
+// TODO: open only once, invent config_rewind()
static int already_loaded(const char *name)
{
int ret = 0;
- int len = strlen(name);
- char *line;
- FILE* modules;
-
- modules = xfopen_for_read("/proc/modules");
- while ((line = xmalloc_fgets(modules)) != NULL) {
- if (strncmp(line, name, len) == 0 && line[len] == ' ') {
- free(line);
+ char *s;
+ parser_t *parser = config_open2("/proc/modules", xfopen_for_read);
+ while (config_read(parser, &s, 1, 1, "# \t", 0)) {
+ if (strcmp(s, name) == 0) {
ret = 1;
break;
}
- free(line);
}
- fclose(modules);
+ config_close(parser);
return ret;
}
#else
diff --git a/networking/libiproute/rt_names.c b/networking/libiproute/rt_names.c
index b22df9cb7..1a2d52e86 100644
--- a/networking/libiproute/rt_names.c
+++ b/networking/libiproute/rt_names.c
@@ -13,41 +13,27 @@
#include "libbb.h"
#include "rt_names.h"
+/* so far all callers have size == 256 */
+#define rtnl_tab_initialize(file, tab, size) rtnl_tab_initialize(file, tab)
+#define size 256
static void rtnl_tab_initialize(const char *file, const char **tab, int size)
{
- char buf[512];
- FILE *fp;
-
- fp = fopen_for_read(file);
- if (!fp)
+ char *token[2];
+ parser_t *parser = config_open2(file, fopen_for_read);
+ if (!parser)
return;
- while (fgets(buf, sizeof(buf), fp)) {
- char *p = buf;
- int id;
- char namebuf[512];
-
- while (*p == ' ' || *p == '\t')
- p++;
- if (*p == '#' || *p == '\n' || *p == 0)
- continue;
- if (sscanf(p, "0x%x %s\n", &id, namebuf) != 2
- && sscanf(p, "0x%x %s #", &id, namebuf) != 2
- && sscanf(p, "%d %s\n", &id, namebuf) != 2
- && sscanf(p, "%d %s #", &id, namebuf) != 2
- ) {
- bb_error_msg("database %s is corrupted at %s",
- file, p);
- return;
+ while (config_read(parser, token, 2, 2, "# \t", 0)) {
+ int id = bb_strtou(token[0], NULL, 0);
+ if (id < 0 || id > size) {
+ bb_error_msg("database %s is corrupted at line %d",
+ file, parser->lineno);
+ break;
}
-
- if (id < 0 || id > size)
- continue;
-
- tab[id] = xstrdup(namebuf);
+ tab[id] = xstrdup(token[1]);
}
- fclose(fp);
+ config_close(parser);
}
-
+#undef size
static const char **rtnl_rtprot_tab; /* [256] */