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