JD2022-TU1/main/extern/Camcam/LIBS/Mixer/INI_Manager.cpp

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);
}