BeRTOS
|
00001 00038 #include "ini_reader.h" 00039 #include "cfg/cfg_ini_reader.h" 00040 #include <string.h> 00041 #include <stdio.h> 00042 #include <ctype.h> 00043 00044 /* 00045 * Returns when the line containing the section is found. 00046 * The file pointer is positioned at the start of the next line. 00047 * Returns EOF if no section was found, 0 otherwise. 00048 */ 00049 static int findSection(KFile *fd, const char *section, size_t section_len, char *line, size_t size) 00050 { 00051 while (kfile_gets(fd, line, size) != EOF) 00052 { 00053 char *ptr = line; 00054 unsigned i; 00055 /* accept only sections that begin at first char */ 00056 if (*ptr++ != '[') 00057 continue; 00058 00059 /* find the end-of-section character */ 00060 for (i = 0; i < size && *ptr != ']'; ++i, ++ptr) 00061 ; 00062 00063 /* The found section could be long that our section key */ 00064 if (section_len != i) 00065 continue; 00066 00067 /* did we find the correct section? */ 00068 if(strncmp(&line[1], section, section_len)) 00069 continue; 00070 else 00071 return 0; 00072 } 00073 return EOF; 00074 } 00075 00076 /* 00077 * Fills the argument with the key found in line 00078 */ 00079 static char *getKey(const char *line, char *key, size_t size) 00080 { 00081 /* null-terminated string */ 00082 while (isspace((unsigned char)*line)) 00083 ++line; 00084 int i = 0; 00085 while (*line != '=' && !isspace((unsigned char)*line) && size) 00086 { 00087 key[i++] = *line; 00088 ++line; 00089 --size; 00090 } 00091 size ? (key[i] = '\0') : (key[i-1] = '\0'); 00092 return key; 00093 } 00094 00095 /* 00096 * Fills the argument with the value found in line. 00097 */ 00098 static char *getValue(const char *line, char *value, size_t size) 00099 { 00100 while (*line++ != '=') 00101 ; 00102 while (isspace((unsigned char)*line)) 00103 ++line; 00104 int i = 0; 00105 while (*line && size) 00106 { 00107 value[i++] = *line++; 00108 --size; 00109 } 00110 size ? (value[i] = '\0') : (value[i-1] = '\0'); 00111 return value; 00112 } 00113 00121 static int findKey(KFile *fd, const char *key, char *line, size_t size) 00122 { 00123 int err; 00124 do 00125 { 00126 err = kfile_gets(fd, line, size); 00127 char curr_key[30]; 00128 getKey(line, curr_key, 30); 00129 /* check key */ 00130 if (!strcmp(curr_key, key)) 00131 return 0; 00132 } 00133 while (err != EOF && *line != '['); 00134 return EOF; 00135 } 00136 00137 /* 00138 * On errors, the function returns EOF and fills the buffer with the default value. 00139 */ 00140 int ini_getString(KFile *fd, const char *section, const char *key, const char *default_value, char *buf, size_t size) 00141 { 00142 char line[CONFIG_INI_MAX_LINE_LEN]; 00143 00144 if (kfile_seek(fd, 0, KSM_SEEK_SET) == EOF) 00145 goto error; 00146 00147 if (findSection(fd, section, strlen(section), line, CONFIG_INI_MAX_LINE_LEN) == EOF) 00148 goto error; 00149 00150 if (findKey(fd, key, line, CONFIG_INI_MAX_LINE_LEN) == EOF) 00151 goto error; 00152 else 00153 getValue(line, buf, size); 00154 return 0; 00155 00156 error: 00157 strncpy(buf, default_value, size); 00158 if (size > 0) 00159 buf[size - 1] = '\0'; 00160 return EOF; 00161 }