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