VAR BYTE _lblhash;
 
 
 
EXPORT PROC initlblbuf()
 
{
 
  _lblhash = 0x00;
 
  REPEAT {
 
    _lblshift[_lblhash] = _LBLBUFEOF;
 
    INC _lblhash;
 
  }UNTIL (_lblhash == 0x00);
 
  _lblbuffreeidx = 0;
 
};
 
 
 
EXPORT FUNC TYPE lbltype() //тхЁэєЄ№ Єшя ьхЄъш _name ш _typeaddr
 
{
 
VAR PBYTE plbl; //ьхЄър т ЄрсышЎх чрърэўштрхЄё  эєы╕ь
 
VAR TYPE t;
 
VAR UINT plbl_idx;
 
  t = _T_UNKNOWN;
 
  _lblhash = (BYTE)hash((PBYTE)_name);
 
  plbl_idx = _lblshift[_lblhash];
 
  WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
 
    plbl = &_lbls[plbl_idx];
 
    plbl_idx = *(PUINT)(plbl);
 
    plbl = &plbl[+sizeof(UINT)+1]; //skip string size
 
    IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр
 
      _typeaddr = (UINT)(plbl - _lbls); //фы  чряюьшэрэш  Єшяр т сєфє∙хщ яхЁхьхээющ //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT)
 
      plbl = &plbl[_lenname+1];
 
      t = *(TYPE*)(plbl);
 
      plbl = &plbl[+sizeof(TYPE)]; //INC plbl;
 
      _isloc = (BOOL)*(PBYTE)(plbl);
 
      INC plbl;
 
      IF ((t&_T_TYPE)==(TYPE)0x00) _typeaddr = *(PUINT)(plbl); //тёяюьшэрхь рфЁхё Єшяр, хёыш ¤Єю яхЁхьхээр , р эх юс· тыхэшх Єшяр
 
      plbl = &plbl[+sizeof(UINT)];
 
      _varsz = *(PUINT)(plbl);
 
      break;
 
    };
 
  };
 
RETURN t;
 
}
 
 
 
EXPORT PROC dellbl() //фы  undef
 
{
 
VAR PBYTE plbl; //ьхЄър т ЄрсышЎх чрърэўштрхЄё  эєы╕ь
 
VAR UINT plbl_idx;
 
    //errstr("dellbl:"); errstr(_name); enderr();
 
  _lblhash = (BYTE)hash((PBYTE)_name);
 
  plbl_idx = _lblshift[_lblhash];
 
  WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
 
    plbl = &_lbls[plbl_idx];
 
    plbl_idx = *(PUINT)(plbl);
 
    plbl = &plbl[+sizeof(UINT)+1]; //skip string size
 
    IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр
 
      POKE *(PCHAR)(plbl) = '\0';
 
      break;
 
    };
 
  };
 
}
 
 
 
EXPORT FUNC UINT gettypename(PCHAR s) //тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т s (ёЁрчє яюёых lbltype)
 
{
 
RETURN strcopy((PCHAR)&_lbls[_typeaddr], (UINT)*(PBYTE)&_lbls[_typeaddr-1], s); //from, n, to //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT)
 
}
 
 
 
EXPORT PROC addlbl(TYPE t, BOOL isloc, UINT varsz) //(_name)
 
{
 
VAR PBYTE plbl;
 
VAR UINT freeidx;
 
VAR TYPE oldt;
 
  oldt = lbltype(); //(_name) //єёЄрэртыштрхЄ _isloc (хёыш эрщфхэр) ш _typeaddr (рфЁхё, хёыш эрщфхэр)
 
  IF ((oldt == _T_UNKNOWN)||isloc) { //хёыш эх с√ыю ьхЄъш шыш ыюъры№эр  яютхЁї уыюсры№эющ шыш фЁєующ ыюъры№эющ (ярЁрьхЄЁр)
 
    //ьхЄъш эхЄ: яш°хь т эрўрыю Ўхяюўъш рфЁхё ъюэЎр ёЄЁрэшЎ√ ш ёючфр╕ь ьхЄъє Єрь ёю ёё√ыъющ эр ёЄрЁюх эрўрыю Ўхяюўъш
 
    freeidx = _lblbuffreeidx; //[0] //эрўрыю ётюсюфэюую ьхёЄр
 
    IF (freeidx < _LBLBUFMAXSHIFT) { //хёЄ№ ьхёЄю яюф ьхЄъє
 
      plbl = &_lbls[freeidx]; //єърчрЄхы№ эр эрўрыю ёючфртрхьющ ьхЄъш
 
      //яш°хь ьхЄъє
 
      POKE *(PUINT)(plbl) = _lblshift[_lblhash]; //ёЄрЁ√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
 
      plbl = &plbl[+sizeof(UINT)];
 
      POKE *(PBYTE)(plbl) = (BYTE)_lenname;
 
      INC plbl;
 
      strcopy(_name, _lenname, (PCHAR)plbl);
 
      plbl = &plbl[_lenname+1];
 
      POKE *(TYPE*)(plbl) = t;
 
      plbl = &plbl[+sizeof(TYPE)]; //INC plbl;
 
      POKE *(PBYTE)(plbl) = (BYTE)isloc;
 
      INC plbl;
 
      POKE *(PUINT)(plbl) = _typeaddr; //ёё√ыър эр эрчтрэшх Єшяр (фы  ёЄЁєъЄєЁ√)
 
      plbl = &plbl[+sizeof(UINT)];
 
      _varszaddr = (UINT)(plbl - _lbls); //ўЄюс√ яюЄюь ьюцэю с√ыю ьхэ Є№
 
      POKE *(PUINT)(plbl) = varsz;
 
      _lblbuffreeidx = (UINT)(plbl - _lbls) + +sizeof(UINT); //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш
 
      _lblshift[_lblhash] = freeidx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
 
    }ELSE {errstr("nomem"); enderr();
 
    };
 
  }ELSE IF (oldt != t) {
 
    errstr("addvar type doesn't match previous declaration:"); errstr(_name); enderr();
 
  };
 
}
 
 
 
EXPORT PROC setvarsz(UINT addr, UINT shift)
 
{
 
  POKE *(PUINT)(&_lbls[addr]) = shift;
 
}