Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / Lab_11 / library

.cpp
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
7.72 Кб
Скачать
#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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////

Соседние файлы в папке Lab_11