in src/odbc/rsodbc/rsini.cpp [249:383]
int RsIni::writePrivateProfileString(char *pSectionName, char *pKey, char *pData, char *pFile)
{
FILE *fp;
char buffer[INI_BUFFER_SIZE];
char search[INI_KEY_SIZE];
char original[INI_BUFFER_SIZE];
char *pChar = NULL;
int iStrCode = -1;
size_t iFileLength;
size_t iBufferLength;
char * pFileBuffer;
char pFullFilePath[MAX_PATH + 1];
int iTempLen;
if(pFile == NULL || pSectionName == NULL || pKey == NULL)
{
return 0;
}
getFullOdbcIniPath(pFullFilePath, MAX_PATH, pFile);
fp = fopen(pFullFilePath, "r");
if(fp == NULL)
{
fp = fopen(pFullFilePath, "w");
if (fp == NULL)
return 0;
fclose(fp);
iFileLength = 0;
}
else
{
fseek(fp, 0, SEEK_END );
iFileLength = ftell(fp);
fclose(fp);
}
iTempLen = iBufferLength = iFileLength + strlen(pKey) + 1 + ((pData) ? strlen(pData) : 0) + 2 + strlen(pSectionName) + 4;
pFileBuffer = (char *) malloc(iBufferLength);
pFileBuffer[0] = '\0';
fp = fopen(pFullFilePath, "r");
snprintf(search, INI_KEY_SIZE, "[%s]", pSectionName);
while(fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
{
strncat(pFileBuffer, buffer, iTempLen);
iTempLen -= strlen(buffer);
if(buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)-1]= '\0';
if(isCommentLine(buffer))
continue;
if ((iStrCode = _stricmp(search, buffer)) == 0)
break;
} // Loop
if (iStrCode == 0)
{
iStrCode = -1;
strncpy(search, pKey, INI_KEY_SIZE);
while(fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
{
original[0] = '\0';
if(isCommentLine(buffer))
{
strncat( pFileBuffer, buffer, INI_BUFFER_SIZE);
continue;
}
strncpy(original, buffer, INI_BUFFER_SIZE);
if (isSection(buffer))
break;
if (buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)-1]=0;
if ((pChar = strchr(buffer, '=')) != NULL)
*pChar=0;
if ((iStrCode = _stricmp(search, buffer)) == 0)
{
original[0] = '\0';
break;
}
strncat(pFileBuffer, original, INI_BUFFER_SIZE);
original[0] = '\0';
} // Loop
if(pData)
{
snprintf(buffer, INI_BUFFER_SIZE, "%s=%s\n", pKey, pData );
strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
}
if(original[0] != '\0')
strncat( pFileBuffer, original, INI_BUFFER_SIZE);
}
else
{
snprintf(buffer, INI_BUFFER_SIZE, "[%s]\n", pSectionName);
strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
if(pData)
{
snprintf(buffer, INI_BUFFER_SIZE, "%s=%s\n", pKey, pData);
strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
}
}
while (fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
fclose(fp);
fp = fopen(pFullFilePath, "w");
if(fp == NULL)
{
free(pFileBuffer);
return 0;
}
iFileLength = strlen(pFileBuffer);
fputs(pFileBuffer, fp);
fclose(fp);
free(pFileBuffer);
return 1;
}