1 /**
2 \file ADM_indexFile
3 \brief Handle index file reading
4 copyright : (C) 2009 by mean
5 email : fixounet@free.fr
6
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17 #include "ADM_default.h"
18 #include "ADM_indexFile.h"
19 #include "ctype.h"
20 /**
21
22 */
dmxToken(const char * name,const char * value)23 dmxToken::dmxToken(const char *name,const char *value)
24 {
25 this->name=ADM_strdup(name);
26 this->value=ADM_strdup(value);
27 }
28 /**
29
30 */
~dmxToken()31 dmxToken::~dmxToken()
32 {
33 if(name) ADM_dealloc(name);
34 if(value) ADM_dealloc(value);
35 }
36
getName(void)37 char *dmxToken::getName(void) {return name;}
getValue(void)38 char *dmxToken::getValue(void){return value;}
39 /**
40
41 */
isNumeric(void)42 bool dmxToken::isNumeric(void)
43 {
44 bool num=true;
45 int l=strlen(value);
46 for(int i=0;i<l;i++)
47 {
48 char v=value[i];
49 if(!isdigit(v)&& v!=0x0a && v!=0x0d) num=false;
50 }
51 return num;
52 }
53 /**
54
55 */
getAsNumber(void)56 uint32_t dmxToken::getAsNumber(void)
57 {
58 uint32_t v;
59 v=atoi(value);
60 return v;
61 }
62 /**
63
64 */
getAsNumber64(void)65 uint64_t dmxToken::getAsNumber64(void)
66 {
67 uint64_t v;
68 sscanf(value,"%" PRId64,&v);
69 return v;
70 }
71
72 //****************************************************************************************
73
74 /**
75
76 */
77
indexFile()78 indexFile::indexFile()
79 {
80 file=NULL;
81 buffer.setSize(ADM_INDEX_BUFFER);
82 }
83 /**
84
85 */
86
~indexFile()87 indexFile::~indexFile()
88 {
89 close();
90 }
91 /**
92
93 */
purgeTokens(void)94 void indexFile::purgeTokens(void)
95 {
96 int nb=ListOfTokens.size();
97 for(int i=0;i<nb;i++)
98 delete ListOfTokens[i];
99 ListOfTokens.clear();
100 }
101 /**
102
103 */
searchToken(const char * name)104 dmxToken *indexFile::searchToken(const char *name)
105 {
106 for(int i=0;i<ListOfTokens.size();i++)
107 {
108 dmxToken *tk=ListOfTokens[i];
109 if(!strcasecmp(name,tk->getName())) return tk;
110 }
111 printf("[indexFile] Token %s not found\n",name);
112 for(int i=0;i<ListOfTokens.size();i++)
113 printf(" [%d]%s\n",i,ListOfTokens[i]->getName());
114 return NULL;
115 }
116 /**
117
118 */
119
open(const char * name)120 bool indexFile::open(const char *name)
121 {
122 file=ADM_fopen(name,"rt");
123 if(!file) return false;
124 return true;
125 }
126
127 /**
128
129 */
130
close(void)131 bool indexFile::close(void)
132 {
133 if(file)
134 {
135 fclose(file);
136 file=NULL;
137 }
138 purgeTokens();
139 return true;
140 }
141
142 /**
143
144 */
145
goToSection(const char * section)146 bool indexFile::goToSection(const char *section)
147 {
148 char match[100];
149 sprintf(match,"[%s]\n",section);
150 fseek(file,0,SEEK_SET);
151 while(1)
152 {
153 if(!fgets((char*)buffer.at(0),ADM_INDEX_BUFFER,file) )
154 {
155 printf("[indexFile] Cannot find section %s,%s*\n",section,match);
156 return false;
157 }
158 if(!strcasecmp((char*)buffer.at(0),match)) return true;
159 }
160 return false;
161 }
162
163 /**
164 \fn readSection
165 */
166
readSection(const char * section)167 bool indexFile::readSection(const char *section)
168 {
169 if(false==goToSection(section)) return false;
170 // Until we reach the next section, store all couples name/value into the
171 //
172 while(1)
173 {
174 if(!readString(ADM_INDEX_BUFFER,buffer.at(0))) break;
175 if(buffer[0]=='[') break; // end of section
176 // Now search the = and replace it by a zero
177 char *head,*tail;
178 head=(char *)buffer.at(0);
179 tail=(char *)buffer.at(0);
180 tail=strstr((char *)buffer.at(0),"=");
181 if(!tail)
182 {
183 if(buffer[0]=='#') // Comment
184 {
185
186 }else
187 {
188 printf("[psIndexer]Weird line :%s\n",buffer.at(0));
189 break;
190 }
191 }else
192 {
193 *tail=0;
194 tail++;
195 dmxToken *tk=new dmxToken(head,tail);
196 ListOfTokens.append(tk);
197 }
198 }
199 return true;
200 }
201
202 /**
203
204 */
205
getAsUint32(const char * name)206 uint32_t indexFile::getAsUint32(const char *name)
207 {
208 dmxToken *token=searchToken(name);
209 if(!token) return 0;
210 if(token->isNumeric()) return token->getAsNumber();
211 printf("[psIndex] token %s is not a digit : %s\n",name,token->getValue());
212 return 0;
213 }
214 /**
215
216 */
getAsUint64(const char * name)217 uint64_t indexFile::getAsUint64(const char *name)
218 {
219 dmxToken *token=searchToken(name);
220 if(!token) return 0;
221 if(token->isNumeric()) return token->getAsNumber64();
222 printf("[psIndex] token %s is not a digit : %s\n",name,token->getValue());
223 return 0;
224 }
225 /**
226 \fn getAsHex
227 \read entry as hex
228
229 */
230
getAsHex(const char * name)231 uint32_t indexFile::getAsHex(const char *name)
232 {
233 uint32_t v;
234 dmxToken *token=searchToken(name);
235 char *s;
236 if(!token) return 0;
237 s=token->getValue();
238 sscanf(s,"%x",&v);
239 return v;
240 }
241
242 /**
243
244 */
245
getAsString(const char * name)246 char *indexFile::getAsString(const char *name)
247 {
248 dmxToken *token=searchToken(name);
249 if(!token) return NULL;
250 return token->getValue();
251
252 }
253
254 /**
255
256 */
257
readString(uint32_t maxLen,uint8_t * buffer)258 bool indexFile::readString(uint32_t maxLen,uint8_t *buffer)
259 {
260 if(!fgets((char *)buffer,maxLen,file)) return false;
261 buffer[maxLen-1]=0;
262 if(buffer[0])
263 while(1)
264 {
265 int l=strlen((char *)buffer);
266 if(!l) break;
267 char c=buffer[l-1];
268 if(c==0xa || c==0xd)
269 {
270 buffer[l-1]=0;
271 continue;
272 }
273 break;
274 }
275 return true;
276 }
277
278
279 //EOF
280
281