Enlightenment CVS committal

Author  : handyande
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/bin


Modified Files:
        ecore_config.c 


Log Message:
Thanks Morten Nilsen for your ecore_config patches - applied here and working 
nicely
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/bin/ecore_config.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ecore_config.c      18 Sep 2005 12:48:24 -0000      1.3
+++ ecore_config.c      7 Dec 2005 23:30:29 -0000       1.4
@@ -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,161 @@
 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;
+       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 == 's' && type == -1)
+               usage_and_exit(prog, 2, "You need to specify a command!\n");
+
+       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
+       while (ecore_config_dst(__ecore_config_bundle_local->data));
+
        // 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();




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to