*: conversion to config parser
No binary (build failed)
—
(log yok)
| @@ -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; | |
| @@ -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); | |
| @@ -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); |
| } | |
| @@ -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 | |
| @@ -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] */ | |