Implement CONFIG_KEY_UNSIGNED_INTEGER
authorScott Moreau <oreaus@gmail.com>
Fri, 27 Jan 2012 20:25:49 +0000 (13:25 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 27 Jan 2012 20:34:27 +0000 (15:34 -0500)
strtol() does not work when trying to assign 32 bits of data into a
regular signed int on 32 bit systems. Use corresponding strtoul()
instead.

clients/desktop-shell.c
shared/config-parser.c
shared/config-parser.h

index 4848449..3d5119a 100644 (file)
@@ -107,8 +107,8 @@ static int key_locking = 1;
 static const struct config_key shell_config_keys[] = {
        { "background-image", CONFIG_KEY_STRING, &key_background_image },
        { "background-type", CONFIG_KEY_STRING, &key_background_type },
-       { "panel-color", CONFIG_KEY_INTEGER, &key_panel_color },
-       { "background-color", CONFIG_KEY_INTEGER, &key_background_color },
+       { "panel-color", CONFIG_KEY_UNSIGNED_INTEGER, &key_panel_color },
+       { "background-color", CONFIG_KEY_UNSIGNED_INTEGER, &key_background_color },
        { "locking", CONFIG_KEY_BOOLEAN, &key_locking },
 };
 
index 3b8c5c2..10f6f12 100644 (file)
@@ -32,6 +32,7 @@ handle_key(const struct config_key *key, const char *value)
 {
        char *end, *s;
        int i, len;
+       unsigned int ui;
        
        switch (key->type) {
        case CONFIG_KEY_INTEGER:
@@ -43,6 +44,15 @@ handle_key(const struct config_key *key, const char *value)
                *(int *)key->data = i;
                return 0;
 
+       case CONFIG_KEY_UNSIGNED_INTEGER:
+               ui = strtoul(value, &end, 0);
+               if (*end != '\n') {
+                       fprintf(stderr, "invalid integer: %s\n", value);
+                       return -1;
+               }
+               *(unsigned int *)key->data = ui;
+               return 0;
+
        case CONFIG_KEY_STRING:
                len = strlen(value);
                s = malloc(len);
index 34f5c31..27f528d 100644 (file)
 #define CONFIGPARSER_H
 
 enum config_key_type {
-       CONFIG_KEY_INTEGER,     /* typeof data = int */
-       CONFIG_KEY_STRING,      /* typeof data = char* */
-       CONFIG_KEY_BOOLEAN      /* typeof data = int */
+       CONFIG_KEY_INTEGER,             /* typeof data = int */
+       CONFIG_KEY_UNSIGNED_INTEGER,    /* typeof data = unsigned int */
+       CONFIG_KEY_STRING,              /* typeof data = char* */
+       CONFIG_KEY_BOOLEAN              /* typeof data = int */
 };
 
 struct config_key {