]> git.sur5r.net Git - i3/i3status/commitdiff
Simplify config file parsing *a lot*
authorMichael Stapelberg <michael+git@stapelberg.de>
Sun, 25 Jan 2009 22:03:19 +0000 (23:03 +0100)
committerMichael Stapelberg <michael+git@stapelberg.de>
Sun, 25 Jan 2009 22:03:19 +0000 (23:03 +0100)
config.c

index e77ff2ef871b9887b710a9b604da1b5bc6857701..51bd9dc6fb26e378281ff2f86ed81a1c6270e9a0 100644 (file)
--- a/config.c
+++ b/config.c
@@ -15,7 +15,7 @@
 
 const char *wlan_interface;
 const char *eth_interface;
-const char *wmii_path;
+char *wmii_path;
 const char *time_format;
 const char *battery_path;
 bool use_colors;
@@ -28,49 +28,6 @@ unsigned int interval = 1;
 
 void die(const char *fmt, ...);
 
-/*
- * This function exists primarily for resolving ~ in pathnames. However, you
- * can also specify ~/Movies/ *, which will only return the first match!
- *
- */
-char *glob_path(const char *path) {
-       static glob_t globbuf;
-       if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
-               die("glob() failed");
-       char *result = strdup(globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : path);
-       globfree(&globbuf);
-       return result;
-}
-
-/*
- * Loads configuration from configfile
- *
- */
-static void get_next_config_entry(FILE *handle, char **dest_name, char **dest_value, char *whole_buffer, int whole_buffer_size) {
-       char *ret;
-       if ((ret = fgets(whole_buffer, whole_buffer_size, handle)) == whole_buffer) {
-               char *c = whole_buffer;
-               /* Skip whitespaces in the beginning */
-               while (isspace((int)*c) && *c != '\0')
-                       c++;
-               *dest_name = c;
-               while (!isspace((int)*c))
-                       c++;
-               /* Terminate string as soon as whitespaces begin or it's terminated anyway */
-               *(c++) = '\0';
-
-               /* Same for the value: strip whitespaces */
-               while (isspace((int)*c) && *c != '\0')
-                       c++;
-               *dest_value = c;
-               /* Whitespace is allowed, newline/carriage return is not */
-               while ((*c != '\n') && (*c != '\r') && (*c != '\0'))
-                       c++;
-               *c = 0;
-       } else if (ret != NULL)
-               die("Could not read line in configuration file");
-}
-
 /*
  * Reads the configuration from the given file
  *
@@ -78,7 +35,7 @@ static void get_next_config_entry(FILE *handle, char **dest_name, char **dest_va
 int load_configuration(const char *configfile) {
        #define OPT(x) else if (strcasecmp(dest_name, x) == 0)
 
-       /* Check if the file exists */
+       /* check if the file exists */
        struct stat buf;
        if (stat(configfile, &buf) < 0)
                return -1;
@@ -87,44 +44,52 @@ int load_configuration(const char *configfile) {
        FILE *handle = fopen(configfile, "r");
        if (handle == NULL)
                die("Could not open configfile");
-       char *dest_name = NULL, *dest_value = NULL, whole_buffer[1026];
+       char dest_name[512], dest_value[512], whole_buffer[1026];
        struct stat stbuf;
        while (!feof(handle)) {
-               get_next_config_entry(handle, &dest_name, &dest_value, whole_buffer, 1024);
-               /* No more entries? We're done! */
-               if (dest_name == NULL)
-                       break;
-               /* Skip comments and empty lines */
+               char *ret;
+               if ((ret = fgets(whole_buffer, 1024, handle)) == whole_buffer) {
+                       /* sscanf implicitly strips whitespace */
+                       if (sscanf(whole_buffer, "%s %[^\n]", dest_name, dest_value) < 1)
+                               continue;
+               } else if (ret != NULL)
+                       die("Could not read line in configuration file");
+
+               /* skip comments and empty lines */
                if (dest_name[0] == '#' || strlen(dest_name) < 3)
                        continue;
 
                OPT("wlan")
-               {
                        wlan_interface = strdup(dest_value);
-               }
                OPT("eth")
-               {
                        eth_interface = strdup(dest_value);
-               }
+               OPT("time_format")
+                       time_format = strdup(dest_value);
+               OPT("battery_path")
+                       battery_path = strdup(dest_value);
+               OPT("color")
+                       use_colors = true;
+               OPT("get_ethspeed")
+                       get_ethspeed = true;
+               OPT("normcolors")
+                       wmii_normcolors = strdup(dest_value);
+               OPT("interval")
+                       interval = atoi(dest_value);
                OPT("wmii_path")
                {
-                       char *globbed = glob_path(dest_value);
-                       if ((stat(globbed, &stbuf)) == -1) {
+                       static glob_t globbuf;
+                       if (glob(dest_value, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
+                               die("glob() failed");
+                       wmii_path = strdup(globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : dest_value);
+                       globfree(&globbuf);
+
+                       if ((stat(wmii_path, &stbuf)) == -1) {
                                fprintf(stderr, "Warning: wmii_path contains an invalid path\n");
-                               free(globbed);
-                               globbed = strdup(dest_value);
+                               free(wmii_path);
+                               wmii_path = strdup(dest_value);
                        }
-                       if (globbed[strlen(globbed)-1] != '/')
+                       if (wmii_path[strlen(wmii_path)-1] != '/')
                                die("wmii_path is not terminated by /");
-                       wmii_path = globbed;
-               }
-               OPT("time_format")
-               {
-                       time_format = strdup(dest_value);
-               }
-               OPT("battery_path")
-               {
-                       battery_path = strdup(dest_value);
                }
                OPT("run_watch")
                {
@@ -159,28 +124,11 @@ int load_configuration(const char *configfile) {
                                        token++;
                        }
                }
-               OPT("color")
-               {
-                       use_colors = true;
-               }
-               OPT("get_ethspeed")
-               {
-                       get_ethspeed = true;
-               }
-               OPT("normcolors")
-               {
-                       wmii_normcolors = strdup(dest_value);
-               }
-               OPT("interval")
-               {
-                       interval = atoi(dest_value);
-               }
                else
                {
                        result = -2;
                        die("Unknown configfile option: %s\n", dest_name);
                }
-               dest_name = dest_value = NULL;
        }
        fclose(handle);