jbsrc/lib/src/core/jb-config.c (2899B) - raw
1 /* 2 * JB, the Jean-Yves Lefort's Build System 3 * Copyright (C) 2008 Jean-Yves Lefort <jylefort@brutele.be> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 #include <stdlib.h> 21 #include "jb-config.h" 22 #include "jb-variable.h" 23 #include "jb-util.h" 24 25 void 26 jb_config_save (void) 27 { 28 GString *config; 29 GSList *l; 30 31 config = g_string_new(NULL); 32 33 JB_LIST_FOREACH(l, jb_variables) 34 { 35 JBVariable *variable = l->data; 36 char *value; 37 char *escaped; 38 39 value = jb_variable_to_string(variable); 40 escaped = g_strescape(value, NULL); 41 g_free(value); 42 43 g_string_append_printf(config, 44 "%s|%s|%i|%s\n", 45 variable->name, 46 jb_variable_get_type_name(variable), 47 variable->flags, 48 escaped); 49 g_free(escaped); 50 } 51 52 jb_write_file_or_exit(JB_CONFIG_FILE, config->str); 53 g_string_free(config, TRUE); 54 } 55 56 void 57 jb_config_load (void) 58 { 59 char *config; 60 char **lines; 61 int i; 62 63 config = jb_read_file_or_exit(JB_CONFIG_FILE); 64 lines = g_strsplit(config, "\n", 0); 65 g_free(config); 66 67 for (i = 0; lines[i] != NULL; i++) 68 { 69 int lineno = i + 1; 70 char **fields; 71 JBVariable *variable; 72 JBVariableType *type; 73 char *unescaped; 74 GError *err = NULL; 75 76 if (*lines[i] == '\0') 77 continue; 78 79 fields = g_strsplit(lines[i], "|", 4); 80 if (g_strv_length(fields) != 4) 81 jb_error("%s:%i: cannot parse line", JB_CONFIG_FILE, lineno); 82 83 type = jb_variable_get_type(fields[1]); 84 if (type == NULL) 85 jb_error("%s:%i: invalid type \"%s\"", JB_CONFIG_FILE, lineno, fields[1]); 86 87 variable = jb_variable_get_variable(fields[0]); 88 if (variable == NULL) 89 variable = jb_variable_add(type, fields[0], NULL, NULL, atoi(fields[2])); 90 else 91 { 92 if (type != variable->type) 93 jb_error("%s:%i: inconsistent type \"%s\" (type \"%s\" expected)", 94 JB_CONFIG_FILE, 95 lineno, 96 type->name, 97 variable->type->name); 98 } 99 100 unescaped = g_strcompress(fields[3]); 101 102 if (! jb_variable_set_from_string(variable, unescaped, &err)) 103 jb_error("%s:%i: invalid value for type \"%s\": %s", 104 JB_CONFIG_FILE, 105 lineno, 106 type->name, 107 err->message); 108 109 g_free(unescaped); 110 } 111 112 g_strfreev(lines); 113 }