Тривиальный код, только начал и тут подумал, а может я быдлокодер ::). Если да, то почему?
На русские буковки ниже внимания не обращаем, это временно. В остальном можете конструктивно и обоснованно закидать какашками/тапками/помидорами.
Смысл поста? Нуу не знаю, может кто чего полезного скажет.
/**--------------------------------------------------------------------------**/
/**----------------------------HIMERA CORE-----------------------------------**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*enum { TRUE, FALSE }; ::) */
enum { FALSE, TRUE };
enum { SECTION_START,
SECTION_END,
SECTION_NAME_START,
SECTION_NAME_END,
KEY_START,
KEY_END,
VALUE_START,
VALUE_END
};
/* defauil style */
char himera_style[]= {'{', '}', '(', ')', '[', ']', '(', ')' };
/* default events */
enum { EVENT_OPEN_SECTION,
EVENT_CLOSE_SECTION,
EVENT_OPEN_SETION_NAME,
EVENT_CLOSE_SECTION_NAME,
EVENT_OPEN_KEY,
EVENT_CLOSE_KEY,
EVENT_OPEN_VALUE,
EVENT_CLOSE_VALUE,
EVENT_NULL
};
unsigned int himera_event_status=EVENT_NULL;
enum { FILE_OPEN, FILE_CLOSE};
static unsigned int himera_file_status=FILE_CLOSE;
static FILE *himera_file_point=NULL;
#define MAX_LEN_NAME_FILE 1024
static char himera_file_name[MAX_LEN_NAME_FILE];
static char * himera_file_ram=NULL;
unsigned int ramstatus=FALSE;
/* open file, save name file, save point file
* himerafile: output to file
*
* FIXME: тут надо переоткрывать файл и уведомлять об этом
* это если по хорошему. Ане кричать что он уже открыт.
*/
void himeraopen(const char * himerafile)
{
if(himera_file_status==FILE_CLOSE)
{
FILE *himerapoint;
if((himerapoint=fopen(himerafile,"r"))==NULL)
{
printf("[ERROR] Нет такого файла!\n");
exit(1);
};
printf("[INFO] Открытие фалла [%s]\n",himerafile);
himera_file_point=himerapoint;
himera_file_status=FILE_OPEN;
for(int i=0; himerafile[i]!='\0'; i++)
{
if(i>MAX_LEN_NAME_FILE)
{
printf("[ERROR] Длинна имени файла больше MAX_LEN_NAME_FILE\n");
fclose(himerapoint);
exit(1);
};
};
memset(himera_file_name, 0, sizeof(himera_file_name));
strcpy(himera_file_name,himerafile);
}
else
{
if(!(strcmp(himerafile,himera_file_name)))
{
printf("[WARNING] этот файл уже открыт, ничего не будет сделанно\n");
return;
};
printf("[INFO] закрытие старого файла\n");
fclose(himera_file_point);
himera_file_status=FILE_CLOSE;
memset(himera_file_name, 0, sizeof(himera_file_name));
printf("[INFO] освобождение ресурсов\n");
free(himera_file_ram);
ramstatus=FALSE;
himera_file_ram=NULL;
printf("[INFO] открытие нового файла \n");
himeraopen(himerafile);
};
}
/* print himerafile on stdio
* print sample information himerafile
*/
void himeracat(void)
{
if(himera_file_status==FILE_CLOSE)
{
printf("[WARNING] нет открытого файла \n");
exit;
};
char ch;
long long int strcount=1;
long long int chcount;
printf("\n**********************************\n");
printf("[INFO] Файл на носителе file:[%s]",himera_file_name);
printf("\n**********************************\n1: ");
for(long long int j=0; (ch=fgetc(himera_file_point))!=EOF; chcount=++j)
{
printf("%c",ch);
if(ch=='\n')
{
printf("%lld: ",++strcount);
};
};
printf("\n**********************************\n");
printf("lines: [%lld] chars [%lld]",strcount,chcount);
printf("\n**********************************\n");
/*---------------------------------------------------------------------*/
if(ramstatus==TRUE)
{
char ch;
long long int strcount=1;
long long int chcount;
printf("\n**********************************\n");
printf("[INFO] Файл в памяти file:[%s]",himera_file_name);
printf("\n**********************************\n1: ");
for(long long int j=0; (ch=fgetc(himera_file_ram))!=EOF; chcount=++j)
{
printf("%c",ch);
if(ch=='\n')
{
printf("%lld: ",++strcount);
};
};
printf("\n**********************************\n");
printf("lines: [%lld] chars [%lld]",strcount,chcount);
printf("\n**********************************\n");
};
/*---------------------------------------------------------------------*/
}
/*загружает весь файл в память*/
void himeraload(void)
{
if(ramstatus==TRUE)
{
/* printf("[WARNING] попытка повторной загрузки, файл уже загружен!\n");
return;
*/
printf("[INFO] обновление копии файла в памяти\n");
free(himera_file_ram);
ramstatus=FALSE;
himera_file_ram=NULL;
};
setbuf(stdout,NULL);
printf("[INFO] загрузка файла [%s] старт \n",himera_file_name);
/* узнаём размер файла */
int size_file=0;
for(long long int count=0; fgetc(himera_file_point)!=EOF; size_file=++count);
/* выделяем память под файл*/
himera_file_ram = calloc(size_file, sizeof(int));/* FIXME: int vs char? */
if(himera_file_ram=NULL)
{
printf("Ошибка при распределении памяти\n");
exit(1);
}
/*копируем файл в память*/
int ch,count=0;
while((ch=fgetc(himera_file_point))!=EOF)
{
himera_file_ram[count]=ch;
};
printf("[INFO] загрузка файла [%s] загруженно \n",himera_file_name);
ramstatus=TRUE;
}
/*сохраняет текущий открытый изменённый файл на носитель*/
//himerasave()
/*находит искомую секцию или ключ */
//himeragrep()
//himeratype()
void himeraget_int(int * var,const char section, const char key)
{
};
void himeraget_float(float * var,const char section, const char key)
{
};
void himeraget_char(char * var,const char section, const char key)
{
};
/*free resource and exit himera*/
void himeraclose(void)
{
printf("[INFO] освобождение ресурсов \n");
fclose(himera_file_point);
himera_file_status=FILE_CLOSE;
memset(himera_file_name, 0, sizeof(himera_file_name));
free(himera_file_ram);
ramstatus=FALSE;
himera_file_ram=NULL;
}