libbb: fixes to config_read() by maintainer
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 20 Jul 2008 13:01:56 +0000 (13:01 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 20 Jul 2008 13:01:56 +0000 (13:01 -0000)
sysctl: use config_read()

function                                             old     new   delta
sysctl_main                                          121     232    +111
config_read                                          478     502     +24
parse_main                                           239     241      +2
sysctl_preload_file_and_exit                         234       -    -234
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 3/0 up/down: 137/-234)          Total: -97 bytes

libbb/parse_config.c
procps/sysctl.c

index 8d7c97eb1f1a0fb865aa793859ccb676206e392b..68caa2c37ec723ccbad20781712d5f25ccb9dc06 100644 (file)
@@ -25,7 +25,7 @@ int parse_main(int argc UNUSED_PARAM, char **argv)
                if (p) {
                        int n;
                        char **t = xmalloc(sizeof(char *) * ntokens);
-                       while ((n = config_read(p, t, ntokens, mintokens, delims, flags)) > 0) {
+                       while ((n = config_read(p, t, ntokens, mintokens, delims, flags)) != 0) {
                                for (int i = 0; i < n; ++i)
                                        printf("[%s]", t[i]);
                                puts("");
@@ -114,10 +114,8 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const
        int ntokens = flags & 0xFF;
        int mintokens = (flags & 0xFF00) >> 8;
 
-       /*
        // N.B. this could only be used in read-in-one-go version, or when tokens use xstrdup(). TODO
-       if (!parser->lineno || !(flags & PARSE_DONT_NULL))
-       */
+       //if (!parser->lineno || !(flags & PARSE_DONT_NULL))
                memset(tokens, 0, sizeof(tokens[0]) * ntokens);
        config_free_data(parser);
 
@@ -171,7 +169,7 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const
                        break;
 
  next_line:
-               /* skip empty line */
+               // skip empty line
                free(line);
        }
 
@@ -183,9 +181,9 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const
                parser->data = xstrdup(line);
        }
 
-       /* now split line to tokens */
+       // split line to tokens
        ntokens--; // now it's max allowed token no
-       // N.B, non-empty remainder is also a token,
+       // N.B. non-empty remainder is also a token,
        // so if ntokens <= 1, we just return the whole line
        // N.B. if PARSE_LAST_IS_GREEDY is set the remainder of the line is stuck to the last token
        for (ii = 0; *line && ii <= ntokens; ) {
@@ -193,7 +191,10 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const
                // get next token
                // at the last token and need greedy token ->
                if ((flags & PARSE_LAST_IS_GREEDY) && (ii == ntokens)) {
-                       // ... don't cut the line
+                       // skip possible delimiters
+                       if (!(flags & PARSE_DONT_REDUCE))
+                               line += strspn(line, delims);
+                       // don't cut the line
                        q = line + strlen(line);
                } else {
                        // vanilla token. cut the line at the first delim
index 3607a2364918a26b6b25f178ec6e4250a6825012..6e582b0f942f37ce3e43e0e4f309b87696f0787a 100644 (file)
@@ -88,56 +88,32 @@ int sysctl_main(int argc UNUSED_PARAM, char **argv)
  * preload the sysctl's from a conf file
  * - we parse the file and then reform it (strip out whitespace)
  */
-#define PRELOAD_BUF 256
 
 static int sysctl_preload_file_and_exit(const char *filename)
 {
-       int lineno;
-       char oneline[PRELOAD_BUF];
-       char buffer[PRELOAD_BUF];
-       char *name, *value;
-       FILE *fp;
+       char *token[2];
+       parser_t *parser;
 
-       fp = xfopen(filename, "r");
-
-       lineno = 0;
-       while (fgets(oneline, sizeof(oneline) - 1, fp)) {
-               lineno++;
-               trim(oneline);
-               if (oneline[0] == '#' || oneline[0] == ';')
-                       continue;
-               if (!oneline[0] || !oneline[1])
-                       continue;
-
-               name = strtok(oneline, "=");
-               if (!name) {
-                       bb_error_msg(WARN_BAD_LINE, filename, lineno);
-                       continue;
-               }
-               trim(name);
-               if (!*name) {
-                       bb_error_msg(WARN_BAD_LINE, filename, lineno);
-                       continue;
-               }
+       parser = config_open(filename);
+       if (!parser)
+               return 1;
 
-               value = strtok(NULL, "\n\r");
-               if (!value) {
-                       bb_error_msg(WARN_BAD_LINE, filename, lineno);
-                       continue;
-               }
-               while (*value == ' ' || *value == '\t')
-                       value++;
-               if (!*value) {
-                       bb_error_msg(WARN_BAD_LINE, filename, lineno);
-                       continue;
+       while (config_read(parser, token, 2, 0, "# \t=", PARSE_LAST_IS_GREEDY)) { // TODO: ';' is comment char too
+               if (!token[1]) {
+                       bb_error_msg(WARN_BAD_LINE, filename, parser->lineno);
+               } else {
+#if 0
+                       char *s = xasprintf("%s=%s", token[0], token[1]);
+                       sysctl_write_setting(s);
+                       free(s);
+#else // PLAY_WITH_FIRE for -4 bytes?
+                       sprintf(parser->line, "%s=%s", token[0], token[1]); // must have room by definition
+                       sysctl_write_setting(parser->line);
+#endif
                }
-
-               /* safe because sizeof(oneline) == sizeof(buffer) */
-               sprintf(buffer, "%s=%s", name, value);
-               sysctl_write_setting(buffer);
        }
        if (ENABLE_FEATURE_CLEAN_UP)
-               fclose(fp);
+               config_close(parser);
        return 0;
 } /* end sysctl_preload_file_and_exit() */