Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
FileIni.c
- Committer:
- dumont
- Date:
- 2012-06-10
- Revision:
- 0:79f68acc26ec
File content as of revision 0:79f68acc26ec:
#include "mbed.h"
#include "FileIni.h"
#ifndef _POSIX_VERSION
int _strupr(char* ptrSource)
{
int i=0;
while(ptrSource[i]!='\0')
{
if (ptrSource[i]>='a' && ptrSource[i]<='z') ptrSource[i]=ptrSource[i]-48;
i++;
}
return 0;
}
#endif
LPINI IniLoad(char* ptrFileName)
{
/** declaration des variables */
FILE* ptrFile=NULL;
INI *lpinStart=NULL, *lpinCurrent=NULL, *lpinTmp=NULL;
INIKEY *lpikKey=NULL, *lpikTmp=NULL;
char ligne[MAX_PATH];
char isSectionNew=2;
char *ptrToken=NULL, *ptrLine=NULL;
/** initialisation */
lpinStart=(LPINI)malloc(sizeof(INI));
if (lpinStart==NULL) return NULL;
INI_ZERO(lpinStart);
if (ptrFileName==NULL) return lpinStart;
ptrFile=fopen(ptrFileName, "r");
if (ptrFile==NULL) return NULL;
lpinCurrent=lpinStart;
/** parsage */
wait(1);
while (fgets(ligne, MAX_PATH, ptrFile)!=NULL)
{
/* on nettoie la ligne */
if ((ptrToken=strchr(ligne, 13))) *ptrToken='\0';
/* on supprime les commentaires */
if ((ptrToken=strchr(ligne, ';'))) *ptrToken='\0';
wait(0.5);
if (*ligne=='[')
{
ptrLine=ligne+1;
ptrToken=strchr(ptrLine, ']');
if (ptrToken!=NULL) *ptrToken='\0';
_strupr(ptrLine);
/** On alloue une nouvelle structure */
if (!(lpinTmp=(LPINI)malloc(sizeof(INI)))) EXIT_FREE
INI_ZERO(lpinTmp);
lpinCurrent->lpinNext=lpinTmp;
lpinCurrent=lpinTmp;
if (!(lpinCurrent->ptrSectionName=(char*)malloc(strlen(ptrLine)+1))) EXIT_FREE
_strupr(ptrLine);
strcpy(lpinCurrent->ptrSectionName, ptrLine);
isSectionNew=1;
/* il s'agit d'une Nouvelle Section */
}
else if (*ligne!='\0')
{
/* il s'agit d'une cl�� */
if (ptrToken=strchr(ligne, '=')) *ptrToken='\0';
ptrLine=ptrToken+1;
if (!(lpikTmp=(LPINIKEY)malloc(sizeof(INIKEY)))) EXIT_FREE;
INIKEY_ZERO(lpikTmp);
if (isSectionNew==1)
{
lpinCurrent->lpikKey=lpikTmp; /* si il s'agit de la premi�re cl�e */
lpikKey=lpikTmp;
}
else
{
lpikKey->lpikNext=lpikTmp;
lpikKey=lpikTmp;
}
_strupr(ligne);
if (((lpikKey->ptrValue=(char*)malloc(strlen(ptrLine)+1)) && (lpikKey->ptrKeyName=(char*)malloc(strlen(ligne)+1)))==0) EXIT_FREE
strcpy(lpikKey->ptrValue, ptrLine);
strcpy(lpikKey->ptrKeyName, ligne);
isSectionNew=0;
}
}
fclose(ptrFile);
return lpinStart;
}
LPINI IniGetSection(char* ptrSectionName, LPINI lpinIni)
{
while (lpinIni!=NULL)
{
if (lpinIni->ptrSectionName)
{
if (!strcmp(lpinIni->ptrSectionName, ptrSectionName)) return lpinIni;
}
lpinIni=lpinIni->lpinNext;
}
return NULL;
}
LPINIKEY IniGetKey(char* ptrVarName, LPINI lpinSection)
{
LPINIKEY lpikSection=lpinSection->lpikKey;
while (lpikSection)
{
if (lpikSection->ptrKeyName)
{
if(!strcmp(lpikSection->ptrKeyName, ptrVarName)) return lpikSection;
}
lpikSection=lpikSection->lpikNext;
}
return NULL;
}
int IniGetValue(char* ptrValue, int iLength, LPINIKEY lpikIniKey)
{
if (lpikIniKey==NULL) return EXIT_FAILURE;
strncpy(ptrValue, lpikIniKey->ptrValue, iLength);
return 0;
}
int IniSetValue(char* ptrValue, LPINIKEY lpikIniKey)
{
char* ptrTmp=NULL;
if (lpikIniKey==NULL) return EXIT_FAILURE;
ptrTmp=(char*)realloc(lpikIniKey->ptrValue, strlen(ptrValue));
if (ptrTmp==NULL) return EXIT_FAILURE;
strcpy(ptrTmp, ptrValue);
lpikIniKey->ptrValue=ptrTmp;
return 0;
}
LPINIKEY IniCreateKey(char* ptrKeyName, char* ptrValue, LPINI lpinSection)
{
INIKEY *lpikTmp=NULL;
LPINIKEY lpikSection=lpinSection->lpikKey;
lpikTmp=(LPINIKEY)malloc(sizeof(INIKEY));
if (lpikTmp==NULL) return NULL;
INIKEY_ZERO(lpikTmp);
if (lpinSection->lpikKey==NULL)
{
lpinSection->lpikKey=lpikTmp;
}
else
{
lpikTmp->lpikNext=lpikSection->lpikNext;
lpikSection->lpikNext=lpikTmp;
}
lpikSection=lpikTmp;
lpikSection->ptrKeyName=(char*)malloc(strlen(ptrKeyName)+1);
lpikSection->ptrValue=(char*)malloc(strlen(ptrValue)+1);
if (!(lpikSection->ptrValue && lpikSection->ptrKeyName)) return NULL;
strcpy(lpikSection->ptrValue, ptrValue);
strcpy(lpikSection->ptrKeyName, ptrKeyName);
return lpikSection;
}
LPINI IniCreateSection(char* ptrSectionName, LPINI lpinIni)
{
LPINI lpinTmp=NULL;
if (lpinIni->ptrSectionName!=NULL)
{
lpinTmp=(LPINI)malloc(sizeof(INI));
if (lpinTmp==NULL) return NULL;
INI_ZERO(lpinTmp);
lpinTmp->lpinNext=lpinIni->lpinNext;
lpinIni->lpinNext=lpinTmp;
lpinIni=lpinTmp;
}
lpinIni->ptrSectionName=(char*)malloc(strlen(ptrSectionName));
if (lpinIni->ptrSectionName==NULL)
{
return 0;
}
strcpy(lpinIni->ptrSectionName, ptrSectionName);
return lpinIni;
}
int IniSave(char* ptrFileName, LPINI lpinIni)
{
FILE* ptrFile=NULL;
LPINIKEY lpikKey=NULL;
ptrFile=fopen(ptrFileName, "w");
if (ptrFile==NULL) return EXIT_FAILURE;
while (lpinIni)
{
if (lpinIni->ptrSectionName)
{
fprintf(ptrFile, "[%s]%c%c", lpinIni->ptrSectionName, 13 ,10);
lpikKey=lpinIni->lpikKey;
while (lpikKey)
{
if (lpikKey->ptrKeyName) fprintf(ptrFile, "%s=%s%c%c", lpikKey->ptrKeyName, lpikKey->ptrValue, 13,10);
lpikKey=lpikKey->lpikNext;
}
}
lpinIni=lpinIni->lpinNext;
}
fclose(ptrFile);
return EXIT_SUCCESS;
}
void IniDeleteSection(LPINI lpinSection)
{
free(lpinSection->ptrSectionName);
lpinSection->ptrSectionName=NULL;
}
void IniDeleteKey(LPINIKEY lpikKey)
{
free(lpikKey->ptrKeyName);
lpikKey->ptrKeyName=NULL;
}
void IniFree(LPINI lpinIni)
{
LPINIKEY lpikKey;
LPINIKEY lpikTmp;
LPINI lpinTmp;
while (lpinIni!=NULL)
{
lpikKey=lpinIni->lpikKey;
while (lpikKey!=NULL)
{
free(lpikKey->ptrKeyName);
free(lpikKey->ptrValue);
lpikTmp=lpikKey->lpikNext;
free(lpikKey);
lpikKey=lpikTmp;
}
free(lpinIni->ptrSectionName);
lpinTmp=lpinIni->lpinNext;
free(lpinIni);
lpinIni=lpinTmp;
}
}