int INIFindSection(ACTUALHANDLE infile, char *section) { int charcount; int i; int retflag; int retval; char scanbuffer[INIMAXLEN + 1]; #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: FindSection(%s)", section); #endif /* VERBOSE_FUNCTION_INI */ charcount = 0; retflag = 0; while (retflag == 0) { retval = INIReadLine(infile, scanbuffer); if (retval == 0) return (-1); // EOF? Stop here. if (scanbuffer[0] == '[') { i = 0; while ((i < INIMAXLEN) && (*(section + i) != 0) && (*(section + i) == scanbuffer[i + 1])) i++; if ((i < INIMAXLEN - 2) && (*(section + i) == 0)) { if ((scanbuffer[i + 1] == ']') && (scanbuffer[i + 2] == 0)) retflag = 1; // ENDIF- End marks look good? Return successful. } // ENDIF- Do we have a section match? } // ENDIF- Does this look like a section header? if (retflag == 0) charcount += retval; } // ENDWHILE- Scanning lines for the correct [Section] header. return (charcount); } // END INIFindSection()
// Returns: number of bytes to get to start of keyword (or -1) int INIFindKeyword(ACTUALHANDLE infile, const char *keyword, char *buffer) { int charcount; int i; int j; int retflag; int retval; char scanbuffer[INIMAXLEN+1]; #ifdef VERBOSE_FUNCTION_INI PrintLog("USBqemu ini: FindKeyword(%s)", keyword); #endif /* VERBOSE_FUNCTION_INI */ charcount = 0; retflag = 0; while(retflag == 0) { retval = INIReadLine(infile, scanbuffer); if(retval == 0) return(-1); // EOF? Stop here. if(scanbuffer[0] == '[') return(-1); // New section? Stop here. i = 0; while((i < INIMAXLEN) && (*(keyword + i) != 0) && (*(keyword + i) == scanbuffer[i])) i++; if((i < INIMAXLEN - 2) && (*(keyword + i) == 0)) { if(scanbuffer[i] == '=') { retflag = 1; if(buffer != NULL) { i++; j = 0; while((i < INIMAXLEN) && (scanbuffer[i] != 0)) { *(buffer + j) = scanbuffer[i]; i++; j++; } // ENDWHILE- Copying the value out to the outbound buffer. *(buffer + j) = 0; // And 0-terminate. } // ENDIF- Return the value as well? } // ENDIF- End marks look good? Return successful. } // ENDIF- Do we have a section match? if(retflag == 0) charcount += retval; } // ENDWHILE- Scanning lines for the correct [Section] header. #ifdef VERBOSE_FUNCTION_INI PrintLog("USBqemu ini: Value: %s", buffer); #endif /* VERBOSE_FUNCTION_INI */ return(charcount); } // END INIFindKeyWord()
int INIRemove(char *file, char *section, char *keyword) { char inname[INIMAXLEN + 1]; char outname[INIMAXLEN + 1]; int filepos; ACTUALHANDLE infile; ACTUALHANDLE outfile; char templine[INIMAXLEN + 1]; int i; int retval; if (file == NULL) return (-1); if (section == NULL) return (-1); #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: Remove(%s, %s, %s)", file, section, keyword); #endif /* VERBOSE_FUNCTION_INI */ filepos = INIRemoveExt(file, inname); for (i = 0; i <= filepos; i++) outname[i] = inname[i]; INIAddInExt(inname, filepos); INIAddOutExt(outname, filepos); infile = ActualFileOpenForRead(inname); if (infile == ACTUALHANDLENULL) return (-1); retval = INIFindSection(infile, section); if (retval == -1) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't even find the section? Abort filepos = retval; if (keyword == NULL) { #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: removing section"); #endif /* VERBOSE_FUNCTION_INI */ outfile = ActualFileOpenForWrite(outname); if (outfile == ACTUALHANDLENULL) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't open a temp file? Abort ActualFileSeek(infile, 0); retval = INICopy(infile, outfile, filepos); if (retval > 0) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing everything up to the section? Abort. templine[0] = 0; retval = 1; while ((retval > 0) && (templine[0] != '[')) retval = INIReadLine(infile, templine); // ENDWHILE- Read to the start of the next section... or EOF. if (templine[0] == '[') { i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); if (retval < i) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing it out? Abort. } // ENDIF- Are there other sections after this one? Save them then. } else { filepos = retval; ActualFileSeek(infile, filepos); filepos += INIReadLine(infile, templine); // Get section line's byte count retval = INIFindKeyword(infile, keyword, NULL); if (retval == -1) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't find the keyword? Abort filepos += retval; #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: removing keyword"); #endif /* VERBOSE_FUNCTION_INI */ outfile = ActualFileOpenForWrite(outname); if (outfile == ACTUALHANDLENULL) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't open a temp file? Abort ActualFileSeek(infile, 0); retval = INICopy(infile, outfile, filepos); if (retval > 0) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing everything up to keyword? Abort. INIReadLine(infile, templine); // Read (and discard) the keyword line } // ENDIF- Wipe out the whole section? Or just a keyword? INICopy(infile, outfile, 0xFFFFFFF); // Write out rest of file ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(inname); ActualFileRename(outname, inname); return (0); } // END INIRemove()
int INISaveString(char *file, char *section, char *keyword, char *value) { char inname[INIMAXLEN + 1]; char outname[INIMAXLEN + 1]; int filepos; ACTUALHANDLE infile; ACTUALHANDLE outfile; int i; int retval; char templine[INIMAXLEN + 1]; if (file == NULL) return (-1); if (section == NULL) return (-1); if (keyword == NULL) return (-1); if (value == NULL) return (-1); #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: SaveString(%s, %s, %s, %s)", file, section, keyword, value); #endif /* VERBOSE_FUNCTION_INI */ filepos = INIRemoveExt(file, inname); for (i = 0; i <= filepos; i++) outname[i] = inname[i]; INIAddInExt(inname, filepos); INIAddOutExt(outname, filepos); filepos = 0; infile = ActualFileOpenForRead(inname); if (infile == ACTUALHANDLENULL) { #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: creating new file"); #endif /* VERBOSE_FUNCTION_INI */ outfile = ActualFileOpenForWrite(inname); if (outfile == ACTUALHANDLENULL) return (-1); // Just a bad name? Abort. sprintf(templine, "[%s]\r\n", section); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); if (retval < i) { ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(inname); return (-1); } // ENDIF- Trouble writing it out? Abort. sprintf(templine, "%s=%s\r\n", keyword, value); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); ActualFileClose(outfile); outfile = ACTUALHANDLENULL; if (retval < i) { ActualFileDelete(inname); return (-1); } // ENDIF- Trouble writing it out? Abort. return (0); } // ENDIF- No input file? Create a brand new .ini file then. retval = INIFindSection(infile, section); if (retval < 0) { #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: creating new section"); #endif /* VERBOSE_FUNCTION_INI */ outfile = ActualFileOpenForWrite(outname); if (outfile == ACTUALHANDLENULL) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't open a temp file? Abort ActualFileSeek(infile, 0); // Move ini to beginning of file... INICopy(infile, outfile, 0x0FFFFFFF); // Copy the whole file out... sprintf(templine, "\r\n[%s]\r\n", section); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); if (retval < i) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing it out? Abort. sprintf(templine, "%s=%s\r\n", keyword, value); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; if (retval < i) { ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing it out? Abort. ActualFileDelete(inname); ActualFileRename(outname, inname); return (0); } // ENDIF- Couldn't find the section? Make a new one! filepos = retval; ActualFileSeek(infile, filepos); filepos += INIReadLine(infile, templine); // Get section line's byte count retval = INIFindKeyword(infile, keyword, NULL); if (retval < 0) { #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: creating new keyword"); #endif /* VERBOSE_FUNCTION_INI */ ActualFileSeek(infile, filepos); retval = INIReadLine(infile, templine); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0) && (templine[i] != '=')) i++; while ((retval > 0) && (templine[i] == '=')) { filepos += retval; retval = INIReadLine(infile, templine); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0) && (templine[i] != '=')) i++; } // ENDWHILE- skimming to the bottom of the section outfile = ActualFileOpenForWrite(outname); if (outfile == ACTUALHANDLENULL) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't open a temp file? Abort ActualFileSeek(infile, 0); retval = INICopy(infile, outfile, filepos); if (retval > 0) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing everything up to keyword? Abort. sprintf(templine, "%s=%s\r\n", keyword, value); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); if (retval < i) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing it out? Abort. } else { #ifdef VERBOSE_FUNCTION_INI PrintLog("CDVDiso ini: replacing keyword"); #endif /* VERBOSE_FUNCTION_INI */ filepos += retval; // Position just before old version of keyword outfile = ActualFileOpenForWrite(outname); if (outfile == ACTUALHANDLENULL) { ActualFileClose(infile); infile = ACTUALHANDLENULL; return (-1); } // ENDIF- Couldn't open a temp file? Abort ActualFileSeek(infile, 0); retval = INICopy(infile, outfile, filepos); if (retval > 0) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing everything up to keyword? Abort. INIReadLine(infile, templine); // Read past old keyword/value... // Replace with new value sprintf(templine, "%s=%s\r\n", keyword, value); i = 0; while ((i < INIMAXLEN) && (templine[i] != 0)) i++; retval = ActualFileWrite(outfile, i, templine); if (retval < i) { ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(outname); return (-1); } // ENDIF- Trouble writing it out? Abort. } // ENDIF- Need to add a new keyword? INICopy(infile, outfile, 0xFFFFFFF); // Write out rest of file ActualFileClose(infile); infile = ACTUALHANDLENULL; ActualFileClose(outfile); outfile = ACTUALHANDLENULL; ActualFileDelete(inname); ActualFileRename(outname, inname); return (0); } // END INISaveString()