/*
Orion Game 22.10.2014
Скриптовый язык Ori Lng
*/
#include <stdio.h>
#include <string.h>
#include "oriLang.h"
/***********************************************************
Функция принимает код и начинает сортировку в массив тегов.
LngCode - скрипт код
********************************************************** */
OriLng& OriLng:: operator << (char *LngCode) {
lenBuffer = strlen(LngCode);
if (lenBuffer > MAX_BUFFER_LNG) {
sprintf(ErrorTeg, ERROR_MAX_BUFFER);
return *this;
}
if (lenBuffer == 0) {
sprintf(ErrorTeg, ERROR_MAX_BUFFER);
return *this;
}
strcat(Buffer, LngCode);
CountTeg = 0;
int endRead = 0;
int a = 0, b = 0;
char g_buffer[MAX_SYMBOL_NAME];
while (endRead >= 0) {
endRead = StartScan(b, g_buffer, a, b);
if (endRead == 1) {
Teg[CountTeg].StartSymbol = a;
Teg[CountTeg].EndSymbol = b;
strcpy(Teg[CountTeg].Teg, g_buffer);
CountTeg++;
} //EndIf
} //EndWhile
}
/***********************************************************
Функция ищет имя тега вместе с указаными скобками.
StartPosition - Адрес с которого начинается поиск
NameTeg - Буффер для найденого тега
StartPositionTeg - Адрес, где был открыт тег
EndPositionTeg - Адрес, где был закрыт тег
********************************************************** */
int OriLng::StartScan(int StartPosition, char* NameTeg, int &StartPositionTeg,
int &EndPositionTeg) {
NameTeg[0] = '\x00';
if (StartPosition > MAX_BUFFER_LNG)
{
sprintf(ErrorTeg, ERROR_MAX_BUFFER, StartPositionTeg);
return false;
}
if (lenBuffer == 0)
{
sprintf(ErrorTeg, ERROR_MAX_BUFFER, StartPositionTeg);
return false;
}
int _count_symbol = 0;
int CountTegSymbol = 0;
for (int i = StartPosition; i <= lenBuffer; i++) {
if (Buffer[i] == OPEN_TEG_SYMBOL) {
StartPositionTeg = i;
int WFor = i + MAX_SYMBOL_NAME;
for (int w = i; w <= WFor; w++) {
if (CountTegSymbol > MAX_SYMBOL_NAME - 1) {
sprintf(ErrorTeg, ERROR_LEN_TEG, StartPositionTeg);
return 0;
}
CountTegSymbol++;
if (Buffer[w] == CLOSE_TEG_SYMBOL) {
EndPositionTeg = w;
for (int k = StartPositionTeg; k <= EndPositionTeg; k++) {
NameTeg[_count_symbol] = Buffer[k];
_count_symbol++;
}
NameTeg[_count_symbol] = '\x00';
return 1;
} //end if close symbol
} // endfori
} //end if symbol
} //endfori
return -1;
}
/***********************************************************
Функция кладёт в буффер данные, указаные в скрипт языке.
_buffer - буффер
NameTeg - имя тега
********************************************************** */
int OriLng::ReturnData(char *_buffer, char *NameTeg) {
_buffer[0] = '\x00';
int StartDataRead = 0;
int EndDataRead = 0;
int NTeg = 0;
// Найдем первый тег
for (int i = 0; i < CountTeg; i++)
if (strcmp(NameTeg, Teg[i].Teg) == 0) {
StartDataRead = Teg[i].EndSymbol;
NTeg = i + 1;
break;
}
// Найдем его пару
for (int i = NTeg; i < CountTeg; i++)
if (strcmp(NameTeg, Teg[i].Teg) == 0) {
EndDataRead = Teg[i].StartSymbol;
break;
}
if (EndDataRead == 0)
{
sprintf(ErrorTeg, ERROR_SEARCH_TEG, NameTeg);
return 0;
}
int count = 0;
for (int i = StartDataRead + 1; i < EndDataRead; i++) {
_buffer[count] = this->Buffer[i];
count++;
}
return 1;
}
/***********************************************************
Функция чистит буфер и теги
********************************************************** */
void OriLng::Clear() {
Buffer[0] = '\0';
CountTeg = 0;
}