Я ещё немног подумал над алгоритмом и немного упростил всё...
Код:
#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <math.h>
#pragma hdrstop
#pragma argsused
int hstoi(char* hexstr)
{
int idx, len, result;
len=strlen(hexstr);
strrev(hexstr);
result=0;
for(idx=0; idx<len; idx++)
{
if (isdigit(hexstr[idx]))
{
result+=(hexstr[idx]-48)*pow(16,idx);
} else {
switch(toupper(hexstr[idx]))
{
case 'A': result+=10*pow(16,idx);break;
case 'B': result+=11*pow(16,idx);break;
case 'C': result+=12*pow(16,idx);break;
case 'D': result+=13*pow(16,idx);break;
case 'E': result+=14*pow(16,idx);break;
case 'F': result+=15*pow(16,idx);break;
default:
cout << "Incorrect offset";
exit(3);
break;
}
}
}
return result;
}
int main(int argc, char* argv[])
{
FILE *binFile;
char *sPtr, *kPtr, *cFile, bSect[512], bKeys[512], bValue[512], MyPath[256],
iniPath[256], MyDrive[2], MyDir[251];
cout << "Patcher started...\r\n";
GetModuleFileName(NULL,MyPath,sizeof(MyPath));
_splitpath(MyPath, MyDrive, MyDir, NULL, NULL);
sprintf(iniPath,"%s%s%s", MyDrive,MyDir,"map.ini");
sprintf(MyPath,"%s%s", MyDrive,MyDir);
cout << "Getting patch map...\r\n";
if (GetPrivateProfileString(NULL,NULL,FALSE,bSect,sizeof(bSect),iniPath) == 0)
{
cout << "Can't see map.ini\r\n" << "\r\n";
system("pause");
exit(1);
}
sPtr=bSect;
while(*sPtr!=NULL)//перебираем буфер секций
{
cFile=(char*) malloc(strlen(MyPath)+strlen(sPtr)+1);
sprintf(cFile,"%s%s",MyPath,sPtr);
binFile=fopen(cFile,"r+b");
printf("Patching %s:\r\n",sPtr);
if (binFile==NULL)
{
printf("\tCan't open file %s\r\n",sPtr);
system("pause");
exit(2);
}
GetPrivateProfileString(sPtr,NULL,FALSE,bKeys,sizeof(bKeys),iniPath);
kPtr=bKeys;
while(*kPtr!=NULL) //перебираем ключи секции
{
GetPrivateProfileString(sPtr,kPtr,FALSE,bValue,sizeof(bValue),iniPath);
printf("\t%s=%s\r\n",kPtr,bValue);
fseek(binFile,hstoi(kPtr),0);
fwrite(bValue, 1, strlen(bValue), binFile);
kPtr=strchr(kPtr,'\0')+1;
};
fclose(binFile);
free(cFile);
sPtr=strchr(sPtr,'\0')+1;
}
cout << "Patching done. Have a nice day :)\r\n";
return 0;
}