Here's a complete patch for the ecore_config tool;

- implement list (heap sort with pathcmp)
- tweak get, adding type
- remove get_type (obsoleted by get tweak)
- use getopt
- add some checks
- add del

Cheers,
--
Morten
Index: ecore_config.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/bin/ecore_config.c,v
retrieving revision 1.3
diff -u -r1.3 ecore_config.c
--- ecore_config.c      18 Sep 2005 12:48:24 -0000      1.3
+++ ecore_config.c      4 Dec 2005 13:13:05 -0000
@@ -6,31 +6,48 @@
 #include <stdlib.h>
 
 #ifdef BUILD_ECORE_CONFIG
+#include <unistd.h>
+#include <Eet.h>
 #include "Ecore_Config.h"
+#include "Ecore_Data.h"
 
+// strcmp for paths - for sorting folders before files
 int
-set(const char *key, int ec_type, const char *value)
+pathcmp(const char *s1, const char *s2)
 {
-       int i;
-       float f;
-       
-       switch (ec_type) {
-       case ECORE_CONFIG_INT:
-       case ECORE_CONFIG_BLN:
-               i = atoi(value);
-               if (ecore_config_typed_set(key, &i, ec_type) != 
ECORE_CONFIG_ERR_SUCC) return -1;
-               break;
-       case ECORE_CONFIG_FLT:
-               f = atof(value);
-               if (ecore_config_typed_set(key, &f, ec_type) != 
ECORE_CONFIG_ERR_SUCC) return -1;
-               break;
-       case ECORE_CONFIG_STR:
-       case ECORE_CONFIG_RGB:
-       case ECORE_CONFIG_THM:
-       case ECORE_CONFIG_NIL:
-               if (ecore_config_typed_set(key, value, ec_type) != 
ECORE_CONFIG_ERR_SUCC) return -1;
-               break;
+       char *s1d, *s2d;
+
+       // strip common part of paths
+       while(*s1 && *s2 && *s1 == *s2) {
+               s1++;
+               s2++;
        }
+
+       // handle /foo/bar/baz <> /foo/bar_baz properly
+       if (*s1 == '/' && *s2 != '/') return -1;
+       if (*s1 != '/' && *s2 == '/') return  1;
+
+       // skip leading /
+       if (*s1 == '/') s1++;
+       if (*s2 == '/') s2++;
+
+       // order folders before files
+       s1d = strchr(s1, '/');
+       s2d = strchr(s2, '/');
+       if (s1d != NULL && s2d == NULL) return -1;
+       if (s1d == NULL && s2d != NULL) return  1;
+
+       return strcmp(s1, s2);
+}
+
+int
+del(const char *key)
+{
+       Ecore_Config_Prop *e;
+       e = ecore_config_get(key);
+       if(e == NULL) return -1;
+
+       ecore_config_dst(e);
        return 0;
 }
 
@@ -49,22 +66,22 @@
                printf("\n");
                break;
        case ECORE_CONFIG_INT:
-               printf("%ld\n", ecore_config_int_get(key));
+               printf("integer %ld\n", ecore_config_int_get(key));
                break;
        case ECORE_CONFIG_BLN:
-               printf("%d\n", ecore_config_boolean_get(key));
+               printf("bool    %d\n", ecore_config_boolean_get(key));
                break;
        case ECORE_CONFIG_FLT:
-               printf("%lf\n", ecore_config_float_get(key));
+               printf("float   %lf\n", ecore_config_float_get(key));
                break;
        case ECORE_CONFIG_STR:
-               printf("%s\n", ecore_config_string_get(key));
+               printf("string  \"%s\"\n", ecore_config_string_get(key));
                break;
        case ECORE_CONFIG_RGB:
-               printf("%s\n", ecore_config_argbstr_get(key));
+               printf("rgb     \"%s\"\n", ecore_config_argbstr_get(key));
                break;
        case ECORE_CONFIG_THM:
-               printf("%s\n", ecore_config_theme_get(key));
+               printf("theme   \"%s\"\n", ecore_config_theme_get(key));
                break;
        default:
                fprintf(stderr, "Property has unrecognised type");
@@ -76,147 +93,163 @@
 int
 list(const char *file)
 {
-       fprintf(stderr, "Command not yet supported\n");
-       return -1;
-}
+       char *key;
 
-int
-get_type(const char *key)
-{
+       Eet_File *ef;
        Ecore_Config_Prop *e;
-       if (!(e = ecore_config_get(key))) {
-               fprintf(stderr, "No such property\n");
-               return -1;
-       }
-               
-       switch (e->type) {
-       case ECORE_CONFIG_NIL:
-               printf("nil\n");
-               break;
-       case ECORE_CONFIG_INT:
-               printf("int\n");
-               break;
-       case ECORE_CONFIG_BLN:
-               printf("bool\n");
-               break;
-       case ECORE_CONFIG_FLT:
-               printf("float\n");
-               break;
-       case ECORE_CONFIG_STR:
-               printf("string\n");
-               break;
-       case ECORE_CONFIG_RGB:
-               printf("rgb\n");
-               break;
-       case ECORE_CONFIG_THM:
-               printf("theme\n");
-               break;
-       default:
-               fprintf(stderr, "Property has unrecognised type");
-               return -1;
-       }
-       return 0;
-}
+       Ecore_Sheap *keys;
 
-int
-parse_type(const char *type)
-{
-       if (!strcmp("nil", type)) {
-               return ECORE_CONFIG_NIL;
-       } else if (!strcmp("int", type)) {
-               return ECORE_CONFIG_INT;
-       } else if (!strcmp("float", type)) {
-               return ECORE_CONFIG_FLT;
-       } else if (!strcmp("bool", type)) {
-               return ECORE_CONFIG_BLN;
-       } else if (!strcmp("str", type)) {
-               return ECORE_CONFIG_STR;
-       } else if (!strcmp("rgb", type)) {
-               return ECORE_CONFIG_RGB;
-       } else if (!strcmp("theme", type)) {
-               return ECORE_CONFIG_THM;
+       ef = eet_open(file, EET_FILE_MODE_READ);
+       if (!ef) return -1;
+
+       keys = ecore_sheap_new(ECORE_COMPARE_CB(pathcmp), eet_num_entries(ef));
+
+       eet_close(ef);
+
+       e = __ecore_config_bundle_local->data;
+
+       do {
+               ecore_sheap_insert(keys, e->key);
+       } while((e = e->next));
+
+       while((key = ecore_sheap_extract(keys))) {
+               printf("%-28s\t", key);
+               get(key);
        }
-       return -1;
+
+       return 0;
 }
 
 void
 usage_and_exit(const char *prog, int ret, const char *msg)
 {
        if (msg) fprintf(stderr, msg);
-       fprintf(stderr, "Usage: %s <config-file> {get|set|type|list} 
[args...]\n", prog);
-       fprintf(stderr, "LIST:       %s <config-file> list\n", prog);
-       fprintf(stderr, "GET:        %s <config-file> get <key>\n", prog);
-       fprintf(stderr, "GET TYPE:   %s <config-file> type <key>\n", prog);
-       fprintf(stderr, "SET:        %s <config-file> set <key> 
{nil|int|float|bool|str|rgb|theme} <value>\n", prog);
+       fprintf(stderr, "Usage: %s -c <file> <command> [-k key]\n", prog);
+       fprintf(stderr, "Modify ecore_config files\n\n");
+       fprintf(stderr, "Accepted commands:\n");
+       fprintf(stderr, "  -a          get all keys\n");
+       fprintf(stderr, "  -g          get key\n");
+       fprintf(stderr, "  -d          delete key\n");
+       fprintf(stderr, "  -b <value>  set boolean\n");
+       fprintf(stderr, "  -f <value>  set float\n");
+       fprintf(stderr, "  -i <value>  set integer\n");
+       fprintf(stderr, "  -n          set nil\n");
+       fprintf(stderr, "  -r <value>  set RGBA\n");
+       fprintf(stderr, "  -s <value>  set string\n");
+       fprintf(stderr, "  -t <value>  set theme\n\n");
+       fprintf(stderr, "  -k <key> must be specified for all commands except 
-a\n\n");
        exit(ret);
 }
 
 int
-main(int argc, const char **argv)
+main(int argc, char * const argv[])
 {
-       const char *prog, *file, *cmd, *key, *type, *value;
-       int ec_type = -1;
+       Ecore_Config_Bundle *t;
+       Ecore_Config_Prop *e;
+       const char *prog, *file, *key;
+       void *value = (void *)NULL;
+       char cmd = 's';
+       int type = -1;
        int ret = 0;
-       prog = file = cmd = key = type = value = NULL;
+       int i;
+       float f;
        
-       prog = argv[0];
-       if (argc < 3) usage_and_exit(prog, 2, "Not enough arguments\n");
+       file = key = prog = NULL;
 
-       file = argv[1];
-       cmd = argv[2];
+       prog = strdup(argv[0]);
 
-       // Check for valid command
-       if (strcmp("get", cmd) &&
-               strcmp("type", cmd) &&
-               strcmp("set", cmd) &&
-               strcmp("list", cmd))
-       {
-               usage_and_exit(prog, 2, "Unrecognised command\n");
-       }
-       
-       // Check for enough arguments
-       if ((*cmd == 's') || (*cmd == 'g') || (*cmd == 't')) {
-               if (argc < 3) usage_and_exit(prog, 2, "Not enough arguments\n");
-               key = argv[3];
-       }
-
-       if (*cmd == 's') {
-               if (argc < 5) usage_and_exit(prog, 2, "No type and value 
specified\n");
-               type = argv[4];
-
-               if ((ec_type = parse_type(type)) < 0)
-                       usage_and_exit(prog, 3, "Unsupported type\n");
-
-               if (strcmp(type, "nil")) {
-                       if (argc < 6)
-                               usage_and_exit(prog, 2, "No value specified\n");
-                       value = argv[5];
+       if(argc < 4)
+               usage_and_exit(prog, 2, NULL);
+
+       while((ret = getopt(argc, argv, "angdb:f:i:r:s:t:c:k:")) != -1) {
+               switch(ret) {
+                       case 'k':
+                               key = strdup(optarg);
+                               break;
+                       case 'n':
+                               type = ECORE_CONFIG_NIL;
+                               value = NULL;
+                               break;
+                       case 'b':
+                               type = ECORE_CONFIG_BLN;
+                               i = atoi(optarg);
+                               value = &i;
+                               break;
+                       case 'i':
+                               type = ECORE_CONFIG_INT;
+                               i = atoi(optarg);
+                               value = &i;
+                               break;
+                       case 'f':
+                               type = ECORE_CONFIG_FLT;
+                               f = atof(optarg);
+                               value = &f;
+                               break;
+                       case 'r':
+                               type = ECORE_CONFIG_RGB;
+                               value = strdup(optarg);
+                               break;
+                       case 's':
+                               type = ECORE_CONFIG_STR;
+                               value = strdup(optarg);
+                               break;
+                       case 't':
+                               type = ECORE_CONFIG_THM;
+                               value = strdup(optarg);
+                               break;
+                       case 'c':
+                               file = strdup(optarg);
+                               break;
+                       case '?':
+                       case ':':
+                               usage_and_exit(prog, 2, "Bad argument\n");
+                       default:
+                               cmd = ret;
+                               break;
                }
        }
+
+       if(cmd != 'a' && key == NULL)
+               usage_and_exit(prog, 2, "You need to specify key!\n");
        
+       if(ecore_config_init("econfig") != ECORE_CONFIG_ERR_SUCC) {
+               fprintf(stderr, "Couldn't init ecore_config!\n");
+               return 1;
+       }
+
+       // Remove non-file data
+       t = __ecore_config_bundle_local;
+       while((e = t->data)) {
+               ecore_config_dst(e);
+       }
+
        // Load configuration from file
-       ecore_config_init("econfig");
        ecore_config_file_load(file);
-       
+
        // Execute command
-       switch (*cmd) {
-       case 's':
-               if (set(key, ec_type, value)) {
-                       fprintf(stderr, "Set failed\n");
-                       ret = 4;
-               } else {
-                       ecore_config_file_save(file);
-               }
-               break;
-       case 'g':
-               if (get(key)) ret = 4;
-               break;
-       case 't':
-               if (get_type(key)) ret = 4;
-               break;
-       case 'l':
-               if (list(file)) ret = 4;
-               break;
+       switch (cmd) {
+               case 's':
+                       if (ecore_config_typed_set(key, value, type) != 
ECORE_CONFIG_ERR_SUCC) {
+                               fprintf(stderr, "Set failed for %s\n", key);
+                               ret = 1;
+                       } else {
+                               ecore_config_file_save(file);
+                       }
+                       break;
+               case 'd':
+                       if(del(key)) {
+                               fprintf(stderr, "Delete failed for %s\n", key);
+                               ret = 1;
+                       } else {
+                               ecore_config_file_save(file);
+                       }
+                       break;
+               case 'g':
+                       if (get(key)) ret = 1;
+                       break;
+               case 'a':
+                       if (list(file)) ret = 1;
+                       break;
        }
 
        ecore_config_shutdown();

Reply via email to