Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include "library.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
CList::CList(void)
{
Count = 0;
Begin = 0;
Cur = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
CList::~CList()
{
Clear();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::Clear(void)
{
while(Cur)
Delete();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::Free(void)
{
void* p;
while(Cur)
{
p = GetData();
if(p)
delete p;
Delete();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::Delete(void)
{
ListItem* n;
ListItem* p;
//если список пустой
if(!Cur)
return;
//если в списке один элемент
if(Cur->Next == Cur)
{
delete Cur;
Begin = 0;
Cur = 0;
}
//если в списке более одного элемента
else
{
n = Cur->Next;
p = Cur->Prev;
delete Cur;
p->Next = n;
n->Prev = p;
Cur = n;
}
--Count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CList::GetCount(void)
{
return Count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::Add(void)
{
ListItem* t;
ListItem* n;
//создать элемент
t = new ListItem;
if(!t)
return;
t->Data = 0;
//если список пустой
if(!Cur)
{
t->Next = t;
t->Prev = t;
Begin = t;
}
//если список непустой
else
{
n = Cur->Next;
t->Next = n;
t->Prev = Cur;
Cur->Next = t;
n->Prev = t;
}
Cur = t;
++Count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::GoBegin(void)
{
Cur = Begin;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::GoNext(void)
{
if(Cur)
Cur = Cur->Next;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::GoPrev(void)
{
if(Cur)
Cur = Cur->Prev;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void* CList::GetData(void)
{
if(!Cur)
return 0;
return Cur->Data;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CList::SetData(void* p)
{
if(!Cur)
return;
Cur->Data = p;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
CLogFile::CLogFile(void)
{
FileName[0] = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CLogFile::Setup(char* fn)
{
strcpy(FileName, fn);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CLogFile::Reset(void)
{
FILE* f;
f = fopen(FileName, "w");
if(f)
fclose(f);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CLogFile::Print(char* str, ...)
{
FILE* f;
va_list v;
if(!str)
return;
f = fopen(FileName, "a");
if(!f)
return;
//запись в протокол
va_start(v, str);
vfprintf(f, str, v);
va_end(v);
fclose(f);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
CSyntaxer::CSyntaxer(void)
{
file = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
CSyntaxer::~CSyntaxer()
{
Close();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CSyntaxer::Open(char* fn)
{
Close();
file = fopen(fn, "rb");
if(!file)
return 0;
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CSyntaxer::Close(void)
{
if(file)
{
fclose(file);
file = 0;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CSyntaxer::SkipComment(void)
{
int c;
if(!file)
return 0;
while(1)
{
c = getc(file);
if(c == -1 || c == '\n')
break;
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CSyntaxer::SkipSpaces(void)
{
int c;
if(!file)
return 0;
while(1)
{
c = getc(file);
if(c == -1)
break;
if(c == ' ' || c == '\t' || c == '\n' || c == '\r')
continue;
if(c == ';')
{
if(!SkipComment())
return 0;
continue;
}
fseek(file, ftell(file) - 1, 0);
break;
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CSyntaxer::GetWord(char* str)
{
int c;
int i;
*str = 0;
if(!file)
return 0;
//чтение слова
if(!SkipSpaces())
return 0;
i = 0;
while(1)
{
c = getc(file);
if(c == -1 || c == ' ' || c == '\t' || c == '\r' || c == '\n')
{
if(!i)
return 0;
break;
}
if(c == ';')
{
if(!i)
return 0;
fseek(file, ftell(file) - 1, 0);
break;
}
if(c >= 'A' && c <= 'Z')
{
str[i] = c;
++i;
continue;
}
if(c >= 'a' && c <= 'z')
{
str[i] = c;
++i;
continue;
}
return 0;
}
str[i] = 0;
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
int CSyntaxer::GetNumber(int* num)
{
int c;
bool minus;
bool empty;
*num = 0;
if(!file)
return 0;
//чтение числа
if(!SkipSpaces())
return 0;
minus = false;
empty = true;
while(1)
{
c = getc(file);
if(c == -1 || c == ' ' || c == '\t' || c == '\r' || c == '\n')
{
if(empty)
return 0;
break;
}
if(c == ';')
{
if(empty)
return 0;
fseek(file, ftell(file) - 1, 0);
break;
}
if(c == '-')
{
if(minus)
return 0;
minus = true;
continue;
}
if(c >= '0' && c <= '9')
{
*num = int(*num * 10 + (c - '0'));
empty = false;
continue;
}
return 0;
}
if(minus)
*num *= -1;
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////