Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Dr.Dark

Старожил


Сообщения: 224
Благодарности: 15

Профиль | Отправить PM | Цитировать


Я ещё немног подумал над алгоритмом и немного упростил всё...
терь так выглядит
Код: Выделить весь код
#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;
}

-------
Спасение утопающих-дело рук самих утопающих.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:11, 30-08-2010 | #5