155 lines
No EOL
4.7 KiB
C++
155 lines
No EOL
4.7 KiB
C++
#include "INI_Manager.h"
|
|
|
|
|
|
/* This function checks if there is a carriage return at the end of the ini file and adds it if there is not */
|
|
void checkEndReturn(char* iniFilename)
|
|
{
|
|
if(fileExists(iniFilename))
|
|
{
|
|
long int returnPos = 0;
|
|
long int fileLen = lengthOfFile(iniFilename);
|
|
long int lastReturnPos = 0;
|
|
while((returnPos=findText(iniFilename, returnPos, "\n"))!=-1)
|
|
{
|
|
lastReturnPos = returnPos += 2;
|
|
}
|
|
if(fileLen!=0 && lastReturnPos!=fileLen)
|
|
{
|
|
char tmp[3];
|
|
*tmp = 13; *(tmp+1) = 10; *(tmp+2) = 0;
|
|
insertText(iniFilename, fileLen, tmp);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* This function gets the value of a variable previously saved in a ini file or return a customized default value if it's failed */
|
|
bool getIniValue(char* iniFilename, char* iniVarname, char* iniVarDefaultValue, char* iniValueDest)
|
|
{
|
|
//ajout au besoin d'un saut de ligne final dans le fichier INI
|
|
checkEndReturn(iniFilename);
|
|
|
|
//recherche du nom de la variable avec un espace à la fin pour gérer les variables avec un nom inclus dans un autre
|
|
char * tmpVarname = (char*)ZeroAlloc(strlen(iniVarname)+2);
|
|
strcpy(tmpVarname, iniVarname);
|
|
strcat(tmpVarname, " ");
|
|
long int linePos = findText(iniFilename, 0, tmpVarname);
|
|
CC_free(tmpVarname);
|
|
//on vérifie également qu'il n'y a pas d'autres lettres ou chiffres collés avant le nom de la variable
|
|
char c[3];
|
|
if((linePos >= 1) && getText(iniFilename, linePos-1, linePos, c))
|
|
{
|
|
//si la variable est effectivement absente, on retourne "ABSENT"
|
|
if((*c>='a' && *c<='z') || (*c>='A' && *c<='Z') || (*c>='0' && *c<='9'))
|
|
{
|
|
if(iniValueDest) strcpy(iniValueDest, iniVarDefaultValue);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//si la ligne définissant la variable est en commentaire ("//" avant le nom de la variable), on retourne "ABSENT"
|
|
long int cPos = linePos;
|
|
while((cPos >= 1) && getText(iniFilename, cPos-1, cPos, c) && *c==' ')
|
|
{
|
|
cPos--;
|
|
}
|
|
if((cPos >= 2) && (findText(iniFilename, cPos-2, "//") == (cPos-2)))
|
|
{
|
|
if(iniValueDest) strcpy(iniValueDest, iniVarDefaultValue);
|
|
return false;
|
|
}
|
|
|
|
//si la variable est effectivement présente et doit être lue, on récupère sa valeur
|
|
if(linePos!=-1)
|
|
{
|
|
linePos = findText(iniFilename, linePos, " = ") + 3;
|
|
long int lineEnd = findText(iniFilename, linePos, "\n");
|
|
if(lineEnd!=-1)
|
|
{
|
|
//si le but était de retourner la valeur de la variable, on la retourne avec "PRESENT"
|
|
if(iniValueDest)
|
|
{
|
|
getText(iniFilename, linePos, lineEnd, iniValueDest);
|
|
return true;
|
|
}
|
|
//si le but était de vérifier la présence de la variable...
|
|
else
|
|
{
|
|
//... on retourne "ABSENT" si la variable à la valeur "0"...
|
|
char *stringEnd = (char*)ZeroAlloc(lineEnd-linePos+2);
|
|
if(getText(iniFilename, linePos, lineEnd, stringEnd) && *stringEnd=='0')
|
|
{
|
|
CC_free(stringEnd);
|
|
return false;
|
|
}
|
|
//... "PRESENT" sinon.
|
|
else
|
|
{
|
|
CC_free(stringEnd);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//si la variable est absente, on retourne "ABSENT"
|
|
if(iniValueDest) strcpy(iniValueDest, iniVarDefaultValue);
|
|
return false;
|
|
}
|
|
|
|
/* This function gets the line of a variable value saved in a ini file */
|
|
bool getIniValue(char* iniFilename, char* iniVarname, char* iniValueDest)
|
|
{
|
|
return getIniValue(iniFilename, iniVarname, "\0", iniValueDest);
|
|
}
|
|
|
|
/* This function says if a variable iniVarname is saved in a ini file iniFilename */
|
|
bool getIniValue(char* iniFilename, char* iniVarname)
|
|
{
|
|
return getIniValue(iniFilename, iniVarname, "\0", 0);
|
|
}
|
|
|
|
|
|
/* This function deletes the line of a variable value saved in a ini file */
|
|
bool delIniValue(char* iniFilename, char* iniVarname)
|
|
{
|
|
//ajout au besoin d'un saut de ligne final dans le fichier INI
|
|
checkEndReturn(iniFilename);
|
|
|
|
//récupération de la position de la ligne de la variable à supprimer du fichier ini
|
|
long int linePos = findText(iniFilename, 0, iniVarname);
|
|
long int lineEnd = findText(iniFilename, linePos, "\n")+2;
|
|
bool definedValue = (linePos!=-1);
|
|
|
|
//suppression de la ligne
|
|
if(linePos!=-1 && lineEnd!=-1)
|
|
deleteText(iniFilename, linePos, lineEnd);
|
|
|
|
return definedValue;
|
|
}
|
|
|
|
/* This function saves a variable value in a ini file */
|
|
bool setIniValue(char* iniFilename, char* iniVarname, char* newValue)
|
|
{
|
|
//ajout au besoin d'un saut de ligne final dans le fichier INI
|
|
checkEndReturn(iniFilename);
|
|
|
|
//suppression de la ligne contenant la valeur de la variable à ajouter
|
|
bool definedValue = delIniValue(iniFilename, iniVarname);
|
|
|
|
//ajout de la nouvelle ligne pour définir la valeur de la variable
|
|
FILE* iniFile = CC_fopen(iniFilename,"at");
|
|
if (iniFile)
|
|
{
|
|
if(newValue) fprintf(iniFile, "%s = %s\n", iniVarname, newValue);
|
|
else fprintf(iniFile, "%s = 1\n", iniVarname);
|
|
CC_fclose(iniFile);
|
|
}
|
|
|
|
return definedValue;
|
|
}
|
|
|
|
/* This function puts a variable in a ini file */
|
|
bool setIniValue(char* iniFilename, char* iniVarname)
|
|
{
|
|
return setIniValue(iniFilename, iniVarname, 0);
|
|
} |