etienne herbin / FileIni
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers FileIni.c Source File

FileIni.c

00001 #include "mbed.h"
00002 #include "FileIni.h "
00003 
00004 #ifndef _POSIX_VERSION
00005 
00006 int _strupr(char* ptrSource)
00007 {
00008     int i=0;
00009     while(ptrSource[i]!='\0')
00010     {
00011         if (ptrSource[i]>='a' && ptrSource[i]<='z') ptrSource[i]=ptrSource[i]-48;
00012         i++;
00013     }
00014     return 0;
00015 }
00016 #endif
00017 
00018 
00019 LPINI IniLoad (char* ptrFileName)
00020 {
00021     /** declaration des variables */
00022     FILE* ptrFile=NULL;
00023     INI *lpinStart=NULL, *lpinCurrent=NULL, *lpinTmp=NULL;
00024     INIKEY *lpikKey=NULL, *lpikTmp=NULL;
00025     char ligne[MAX_PATH];
00026     char isSectionNew=2;
00027     char *ptrToken=NULL, *ptrLine=NULL;
00028     /** initialisation */
00029     lpinStart=(LPINI)malloc(sizeof(INI));
00030     if (lpinStart==NULL) return NULL;
00031     INI_ZERO(lpinStart);
00032     if (ptrFileName==NULL) return lpinStart;
00033     ptrFile=fopen(ptrFileName, "r");
00034     if (ptrFile==NULL) return NULL;
00035     lpinCurrent=lpinStart;
00036     /** parsage */
00037     wait(1);
00038     while (fgets(ligne, MAX_PATH, ptrFile)!=NULL)
00039     {
00040         /* on nettoie la ligne */
00041         if ((ptrToken=strchr(ligne, 13))) *ptrToken='\0';
00042         /* on supprime les commentaires */
00043         if ((ptrToken=strchr(ligne, ';'))) *ptrToken='\0';
00044         wait(0.5);
00045         if (*ligne=='[')
00046         {
00047             ptrLine=ligne+1;
00048             ptrToken=strchr(ptrLine, ']');
00049             if (ptrToken!=NULL) *ptrToken='\0';
00050             _strupr(ptrLine);
00051             /** On alloue une nouvelle structure */
00052             if (!(lpinTmp=(LPINI)malloc(sizeof(INI)))) EXIT_FREE
00053             INI_ZERO(lpinTmp);
00054             lpinCurrent->lpinNext=lpinTmp;
00055             lpinCurrent=lpinTmp;
00056             if (!(lpinCurrent->ptrSectionName=(char*)malloc(strlen(ptrLine)+1))) EXIT_FREE
00057             _strupr(ptrLine);
00058             strcpy(lpinCurrent->ptrSectionName, ptrLine);
00059             isSectionNew=1;
00060             /* il s'agit d'une Nouvelle Section */
00061         }
00062         else if (*ligne!='\0')
00063         {
00064             /*  il s'agit d'une cl&#65533;&#65533; */
00065             if (ptrToken=strchr(ligne, '=')) *ptrToken='\0';
00066             ptrLine=ptrToken+1;
00067             if (!(lpikTmp=(LPINIKEY)malloc(sizeof(INIKEY)))) EXIT_FREE;
00068             INIKEY_ZERO(lpikTmp);
00069             if (isSectionNew==1)
00070             {
00071                 lpinCurrent->lpikKey=lpikTmp; /* si il s'agit de la premi&#65533;re cl&#65533;e */
00072                 lpikKey=lpikTmp;
00073             }
00074             else
00075             {
00076                 lpikKey->lpikNext=lpikTmp;
00077                 lpikKey=lpikTmp;
00078             }
00079             _strupr(ligne);
00080             if (((lpikKey->ptrValue=(char*)malloc(strlen(ptrLine)+1)) && (lpikKey->ptrKeyName=(char*)malloc(strlen(ligne)+1)))==0) EXIT_FREE
00081             strcpy(lpikKey->ptrValue, ptrLine);
00082             strcpy(lpikKey->ptrKeyName, ligne);
00083             isSectionNew=0;
00084         }
00085     }
00086     fclose(ptrFile);
00087     return lpinStart;
00088 }
00089 
00090 LPINI IniGetSection (char* ptrSectionName, LPINI lpinIni)
00091 {
00092     while (lpinIni!=NULL)
00093     {
00094         if (lpinIni->ptrSectionName)
00095         {
00096             if (!strcmp(lpinIni->ptrSectionName, ptrSectionName)) return lpinIni;
00097         }
00098         lpinIni=lpinIni->lpinNext;
00099     }
00100     return NULL;
00101 }
00102 
00103 LPINIKEY IniGetKey(char* ptrVarName, LPINI lpinSection)
00104 {
00105     LPINIKEY lpikSection=lpinSection->lpikKey;
00106     while (lpikSection)
00107     {
00108         if (lpikSection->ptrKeyName)
00109         {
00110             if(!strcmp(lpikSection->ptrKeyName, ptrVarName)) return lpikSection;
00111         }
00112         lpikSection=lpikSection->lpikNext;
00113     }
00114     return NULL;
00115 }
00116 
00117 int IniGetValue(char* ptrValue, int iLength, LPINIKEY lpikIniKey)
00118 {
00119     if (lpikIniKey==NULL) return EXIT_FAILURE;
00120     strncpy(ptrValue, lpikIniKey->ptrValue, iLength);
00121     return 0;
00122 }
00123 
00124 int IniSetValue(char* ptrValue, LPINIKEY lpikIniKey)
00125 {
00126     char* ptrTmp=NULL;
00127     if (lpikIniKey==NULL) return EXIT_FAILURE;
00128     ptrTmp=(char*)realloc(lpikIniKey->ptrValue, strlen(ptrValue));
00129     if (ptrTmp==NULL) return EXIT_FAILURE;
00130     strcpy(ptrTmp, ptrValue);
00131     lpikIniKey->ptrValue=ptrTmp;
00132     return 0;
00133 }
00134 
00135 LPINIKEY IniCreateKey(char* ptrKeyName, char* ptrValue, LPINI lpinSection)
00136 {
00137     INIKEY *lpikTmp=NULL;
00138     LPINIKEY lpikSection=lpinSection->lpikKey;
00139     lpikTmp=(LPINIKEY)malloc(sizeof(INIKEY));
00140     if (lpikTmp==NULL) return NULL;
00141     INIKEY_ZERO(lpikTmp);
00142     if (lpinSection->lpikKey==NULL)
00143     {
00144         lpinSection->lpikKey=lpikTmp;
00145     }
00146     else
00147     {
00148         lpikTmp->lpikNext=lpikSection->lpikNext;
00149         lpikSection->lpikNext=lpikTmp;
00150     }
00151     lpikSection=lpikTmp;
00152     lpikSection->ptrKeyName=(char*)malloc(strlen(ptrKeyName)+1);
00153     lpikSection->ptrValue=(char*)malloc(strlen(ptrValue)+1);
00154     if (!(lpikSection->ptrValue && lpikSection->ptrKeyName)) return NULL;
00155     strcpy(lpikSection->ptrValue, ptrValue);
00156     strcpy(lpikSection->ptrKeyName, ptrKeyName);
00157     return lpikSection;
00158 }
00159 
00160 LPINI IniCreateSection(char* ptrSectionName, LPINI lpinIni)
00161 {
00162     LPINI lpinTmp=NULL;
00163     if (lpinIni->ptrSectionName!=NULL)
00164     {
00165         lpinTmp=(LPINI)malloc(sizeof(INI));
00166         if (lpinTmp==NULL) return NULL;
00167         INI_ZERO(lpinTmp);
00168         lpinTmp->lpinNext=lpinIni->lpinNext;
00169         lpinIni->lpinNext=lpinTmp;
00170         lpinIni=lpinTmp;
00171     }
00172     lpinIni->ptrSectionName=(char*)malloc(strlen(ptrSectionName));
00173     if (lpinIni->ptrSectionName==NULL)
00174     {
00175         return 0;
00176     }
00177     strcpy(lpinIni->ptrSectionName, ptrSectionName);
00178     return lpinIni;
00179 }
00180 
00181 int IniSave(char* ptrFileName, LPINI lpinIni)
00182 {
00183     FILE* ptrFile=NULL;
00184     LPINIKEY lpikKey=NULL;
00185     ptrFile=fopen(ptrFileName, "w");
00186     if (ptrFile==NULL) return EXIT_FAILURE;
00187     while (lpinIni)
00188     {
00189         if (lpinIni->ptrSectionName)
00190         {
00191             fprintf(ptrFile, "[%s]%c%c", lpinIni->ptrSectionName, 13 ,10);
00192             lpikKey=lpinIni->lpikKey;
00193             while (lpikKey)
00194             {
00195                 if (lpikKey->ptrKeyName) fprintf(ptrFile, "%s=%s%c%c", lpikKey->ptrKeyName, lpikKey->ptrValue, 13,10);
00196                 lpikKey=lpikKey->lpikNext;
00197             }
00198         }
00199         lpinIni=lpinIni->lpinNext;
00200     }
00201     fclose(ptrFile);
00202     return EXIT_SUCCESS;
00203 }
00204 
00205 void IniDeleteSection(LPINI lpinSection)
00206 {
00207     free(lpinSection->ptrSectionName);
00208     lpinSection->ptrSectionName=NULL;
00209 }
00210 
00211 void IniDeleteKey(LPINIKEY lpikKey)
00212 {
00213     free(lpikKey->ptrKeyName);
00214     lpikKey->ptrKeyName=NULL;
00215 }
00216 
00217 void IniFree(LPINI lpinIni)
00218 {
00219     LPINIKEY lpikKey;
00220     LPINIKEY lpikTmp;
00221     LPINI lpinTmp;
00222     while (lpinIni!=NULL)
00223     {
00224         lpikKey=lpinIni->lpikKey;
00225         while (lpikKey!=NULL)
00226         {
00227             free(lpikKey->ptrKeyName);
00228             free(lpikKey->ptrValue);
00229             lpikTmp=lpikKey->lpikNext;
00230             free(lpikKey);
00231             lpikKey=lpikTmp;
00232         }
00233         free(lpinIni->ptrSectionName);
00234         lpinTmp=lpinIni->lpinNext;
00235         free(lpinIni);
00236         lpinIni=lpinTmp;
00237     }
00238 }