#include "stdafx.h"


#pragma comment(lib, "PhoneDB.lib")

#define BUFFER_SIZE 2048

const char g_program_name[] = "convertbase";



int convert_base(const char *inputfname, const char *outputfname);



char *strsplit(char *strToSplit, const char *delim, char *resultDelimPtr)
{
	static char *beginOfToken = NULL;
	static char *endOfToken = NULL;
	static char savedChar;
	static int	isCharSaved = FALSE;
	
	if (isCharSaved) {
		*endOfToken = savedChar;
		isCharSaved = FALSE;
		beginOfToken = endOfToken;
	}

	if (delim == NULL)
		return NULL;

	if (strToSplit != NULL)
		beginOfToken = strToSplit;
	else
		beginOfToken = endOfToken + 1;

	endOfToken = strpbrk(beginOfToken, delim);
	
	if (endOfToken) {
		savedChar = *endOfToken;
		if (resultDelimPtr)
			*resultDelimPtr = savedChar;

		isCharSaved = TRUE;
		*endOfToken = '\0';
	} else if (resultDelimPtr)
		*resultDelimPtr = '\0';

	return beginOfToken;
}


void usage(int exit_code)
{
	fprintf(stderr, "Usage:\n"
					"	%s INPUTFILE OUTPUTFILE\n",
					g_program_name);
	exit(exit_code);
}


int main(int argc, char* argv[])
{
	if (argc != 3)
		usage(EXIT_FAILURE);

	__try {
		convert_base(argv[1], argv[2]);
		//convert_base("telbase.txt", "database");
	} __except(EXCEPTION_ACCESS_VIOLATION) {
		puts("Got error: EXCEPTION_ACCESS_VIOLATION");
	}

	return EXIT_SUCCESS;
}


int convert_base(const char *inputfname, const char *outputfname)
{
	char buffer[BUFFER_SIZE];
	FILE *inputf, *outputf;

	inputf = fopen(inputfname, "rt");
	if (inputf == NULL)
		return EXIT_FAILURE;

	outputf = fopen(outputfname, "wt");
	if (outputf == NULL) {
		fclose(inputf);
		return EXIT_FAILURE;
	}
	
	fseek(inputf, 0, SEEK_END);
	long endOffset = ftell(inputf);
	if (endOffset == 0) {
		puts("Input file is empty!");
		return EXIT_FAILURE;
	}

	long showProgressEveryBytes = endOffset/100;
	int progressInfoShowedNTimes = 0;
	fseek(inputf, 0, SEEK_SET);

	while (fgets(buffer, BUFFER_SIZE, inputf)) {
		PHONE_DB_RECORD tmp_record, record;
		//0
		char *tok = strsplit(buffer, ";\n", NULL);
		strncpy(tmp_record.phone, tok, PHONE_DB_PHONE_LEN);
		tmp_record.phone[PHONE_DB_PHONE_LEN-1] = '\0';
		//1
		tok = strsplit(NULL, ";\n", NULL);
		strncpy(tmp_record.house, tok, PHONE_DB_HOUSE_LEN);
		tmp_record.house[PHONE_DB_HOUSE_LEN-1] = '\0';
		//2
		tok = strsplit(NULL, ";\n", NULL);
		strncpy(tmp_record.apartment, tok, PHONE_DB_APARTMENT_LEN);
		tmp_record.apartment[PHONE_DB_APARTMENT_LEN-1] = '\0';
		//3
		tok = strsplit(NULL, " \n", NULL);
		//4
		tok = strsplit(NULL, ";\n", NULL);
		strncpy(tmp_record.lastname, tok, PHONE_DB_LASTNAME_LEN);
		tmp_record.lastname[PHONE_DB_LASTNAME_LEN-1] = '\0';
		//5
		tok = strsplit(NULL, ";\n", NULL);
		
		BOOL namePatronymParsed = FALSE;
		if (*tok != '\0') {
			namePatronymParsed = TRUE;

			char buffer2[BUFFER_SIZE]; //contains 'name patronym'
			strcpy(buffer2, tok);
			//6
			char delimFound;
			char *name = strsplit(buffer2, "; \n", &delimFound);
			strncpy(tmp_record.name, name, PHONE_DB_NAME_LEN);
			tmp_record.name[PHONE_DB_NAME_LEN-1] = '\0';
			if (delimFound == ' ') {
				//7
				char *patronym = strsplit(NULL, " ;\n", &delimFound);
				strncpy(tmp_record.patronym, patronym, PHONE_DB_PATRONYM_LEN);
				tmp_record.patronym[PHONE_DB_PATRONYM_LEN-1] = '\0';
			} else {
				tmp_record.patronym[0] = '\0';
			}
			strsplit(NULL, NULL, NULL);
		} else {
			/*
			strncpy(tmp_record.name, "unknown", PHONE_DB_NAME_LEN);
			tmp_record.name[PHONE_DB_NAME_LEN-1] = '\0';

			strncpy(tmp_record.patronym, "unknown", PHONE_DB_PATRONYM_LEN);
			tmp_record.patronym[PHONE_DB_PATRONYM_LEN-1] = '\0';
			*/
			tmp_record.name[0] = '\0';
			tmp_record.patronym[0] = '\0';
		}
		//8
		if (namePatronymParsed) {
			tok = strsplit(tok, ";\n", NULL);
			tok = strsplit(NULL, ";\n", NULL);
		} else
			tok = strsplit(NULL, ";\n", NULL);

		strncpy(tmp_record.street, tok, PHONE_DB_STREET_LEN);
		tmp_record.street[PHONE_DB_STREET_LEN-1] = '\0';

		strncpy(tmp_record.housing, "42", PHONE_DB_HOUSING_LEN);
		tmp_record.housing[PHONE_DB_HOUSING_LEN-1] = '\0';
		
		strsplit(NULL, "\n", NULL);
		strsplit(NULL, NULL, NULL);

		FillDatabaseRecord(&record,
			tmp_record.phone,
			tmp_record.lastname,
			tmp_record.name,
			tmp_record.patronym,
			tmp_record.street,
			tmp_record.house,
			tmp_record.housing,
			tmp_record.apartment);

		//fwrite(&record, sizeof(record), 1, outputf);
		
		fputs(record.phone, outputf); fputc(';', outputf);
		fputs(record.lastname, outputf); fputc(';', outputf);
		fputs(record.name, outputf); fputc(';', outputf);
		fputs(record.patronym, outputf); fputc(';', outputf);
		fputs(record.street, outputf); fputc(';', outputf);
		fputs(record.house, outputf); fputc(';', outputf);
		fputs(record.housing, outputf); fputc(';', outputf);
		fputs(record.apartment, outputf);
		fputc('\n', outputf);

		long currOffset = ftell(inputf);
		if (currOffset > (showProgressEveryBytes * progressInfoShowedNTimes)) {
			system("cls");
			printf("%d%%\n", progressInfoShowedNTimes++);
		}
	}

	return EXIT_SUCCESS;
}
Соседние файлы в папке database_converter
  • #
    15.06.20141.42 Кб59database_converter.vcproj.HOMEPC.Admin.user
  • #
    15.06.20141.42 Кб59database_converter.vcproj.TEM-PC.Tem)).user
  • #
    15.06.20145.24 Кб59database_converter.vcxproj
  • #
    15.06.20141.32 Кб59database_converter.vcxproj.filters
  • #
    15.06.2014143 б59database_converter.vcxproj.user
  • #
    15.06.20145.22 Кб59main.cpp
  • #
    15.06.20142.34 Кб59PhoneDB.lib
  • #
    15.06.20141.36 Кб59ReadMe.txt
  • #
    15.06.2014304 б59stdafx.cpp
  • #
    15.06.2014417 б59stdafx.h
  • #
    15.06.2014765 б59targetver.h