#define SyError 0 // Ошибочный символ
#define SySymbol 1 // обшие символы
#define SyDigit 2 // Число
#define SyLatin 3 // Латинские буквы
#define SyCommas 4 // Двоеточие
#define SyApost 5 // Апостроф
#define SyEquals 6 // Знак равно
#define SySpace 7 // Пробел
#define SyQuoteBeg 8 // <
#define SyQuoteEnd 9 // >
#define SyAmp 10 // Амперсенд
#define SySlQuest 11 // Вопросительный знак
#define SySlExcl 12 // Восклицательный знак
#define SySlesh 13 // Слэш
#define MaxSy SySlesh+1
const static char tab[256]=
{
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 0, 0, //0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //1
7,12, 4, 1, 1, 1,10, 5, 1, 1, 1, 1, 1, 2, 1,13, //2
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 8, 6, 9,11, //3
1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, //4
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, //5
1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, //6
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, //7
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //8
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //9
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //A
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //B
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //C
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //D
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //E
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 //F
};
int EndTeg(void)
{
int res=0;
#define EEnd 0
#define EB1 1 //
#define EB2 2 //
#define EB3 3 //
#define EB4 4 //
#define EB5 5
#define EErr 6
#define MaxE EErr+1
const static int ETab[MaxE][MaxSy]=
{
// Er Sy Dig Lat " ' = Spac < > & ? ! /
{EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd}, //EEnd
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB2 }, //EB1
{EErr, EErr, EErr, EB3 , EErr, EErr, EErr, EB2 , EErr, EErr, EErr, EErr, EErr, EErr}, //EB2
{EErr, EErr, EB3 , EB3 , EErr, EErr, EErr, EB4 , EErr, EB4 , EErr, EErr, EErr, EErr}, //EB3
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB5 , EErr, EEnd, EErr, EErr, EErr, EErr}, //EB4
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB5 , EErr, EEnd, EErr, EErr, EErr, EErr}, //EB5
{EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd} //AErr
};
int Ev=EB1;
char Name[vXML_MaxTeg+1];
int LName=0;
Name[LName]=0;
XML_IDENT Sim;
while (Ev != EEnd)
{
Ev=ETab[Ev][tab[buf[beg]]];
switch(Ev)
{
case EB1:
case EB2:
case EB5:
if (!IncBeg()) Ev=EErr;
break;
case EB3:
Name[LName++]=buf[beg];
Name[LName]=0;
if (LName>=vXML_MaxTeg) Ev=EErr;
if (!IncBeg()) Ev=EErr;
break;
case EB4:
CaseUp(Name);
Trees.SetNullPos();
if (Trees.FindWord(Name,&Sim)==2) res=Sim.id;
break;
case EErr:
res=0;
break;
}
}
return res;
}