?login_element?

Subversion Repositories NedoOS

Rev

Rev 653 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. VAR BYTE _lblhash;
  2.  
  3. EXPORT PROC initlblbuf()
  4. {
  5.   _lblhash = 0x00;
  6.   REPEAT {
  7.     _lblshift[_lblhash] = _LBLBUFEOF;
  8.     INC _lblhash;
  9.   }UNTIL (_lblhash == 0x00);
  10.   _lblbuffreeidx = 0;
  11. };
  12.  
  13. EXPORT FUNC TYPE lbltype() //тхЁэєЄ№ Єшя ьхЄъш _name ш _typeaddr
  14. {
  15. VAR PBYTE plbl; //ьхЄър т ЄрсышЎх чрърэўштрхЄё  эєы╕ь
  16. VAR TYPE t;
  17. VAR UINT plbl_idx;
  18.   t = _T_UNKNOWN;
  19.   _lblhash = (BYTE)hash((PBYTE)_name);
  20.   plbl_idx = _lblshift[_lblhash];
  21.   WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
  22.     plbl = &_lbls[plbl_idx];
  23.     plbl_idx = *(PUINT)(plbl);
  24.     plbl = &plbl[+sizeof(UINT)+1]; //skip string size
  25.     IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр
  26.       _typeaddr = (UINT)(plbl - _lbls); //фы  чряюьшэрэш  Єшяр т сєфє∙хщ яхЁхьхээющ //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT)
  27.       plbl = &plbl[_lenname+1];
  28.       t = *(TYPE*)(plbl);
  29.       plbl = &plbl[+sizeof(TYPE)]; //INC plbl;
  30.       _isloc = (BOOL)*(PBYTE)(plbl);
  31.       INC plbl;
  32.       IF ((t&_T_TYPE)==(TYPE)0x00) _typeaddr = *(PUINT)(plbl); //тёяюьшэрхь рфЁхё Єшяр, хёыш ¤Єю яхЁхьхээр , р эх юс· тыхэшх Єшяр
  33.       plbl = &plbl[+sizeof(UINT)];
  34.       _varsz = *(PUINT)(plbl);
  35.       break;
  36.     };
  37.   };
  38. RETURN t;
  39. }
  40.  
  41. EXPORT PROC dellbl() //фы  undef
  42. {
  43. VAR PBYTE plbl; //ьхЄър т ЄрсышЎх чрърэўштрхЄё  эєы╕ь
  44. VAR UINT plbl_idx;
  45.     //errstr("dellbl:"); errstr(_name); enderr();
  46.   _lblhash = (BYTE)hash((PBYTE)_name);
  47.   plbl_idx = _lblshift[_lblhash];
  48.   WHILE (plbl_idx != _LBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
  49.     plbl = &_lbls[plbl_idx];
  50.     plbl_idx = *(PUINT)(plbl);
  51.     plbl = &plbl[+sizeof(UINT)+1]; //skip string size
  52.     IF (strcp((PCHAR)_name, (PCHAR)plbl)) { //ьхЄър эрщфхэр
  53.       POKE *(PCHAR)(plbl) = '\0';
  54.       break;
  55.     };
  56.   };
  57. }
  58.  
  59. EXPORT FUNC UINT gettypename(PCHAR s) //тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т s (ёЁрчє яюёых lbltype)
  60. {
  61. RETURN strcopy((PCHAR)&_lbls[_typeaddr], (UINT)*(PBYTE)&_lbls[_typeaddr-1], s); //from, n, to //т C шэфхъё√, т рёьх єърчрЄхыш (ыхчєЄ т UINT)
  62. }
  63.  
  64. EXPORT PROC addlbl(TYPE t, BOOL isloc, UINT varsz) //(_name)
  65. {
  66. VAR PBYTE plbl;
  67. VAR UINT freeidx;
  68. VAR TYPE oldt;
  69.   oldt = lbltype(); //(_name) //єёЄрэртыштрхЄ _isloc (хёыш эрщфхэр) ш _typeaddr (рфЁхё, хёыш эрщфхэр)
  70.   IF ((oldt == _T_UNKNOWN)||isloc) { //хёыш эх с√ыю ьхЄъш шыш ыюъры№эр  яютхЁї уыюсры№эющ шыш фЁєующ ыюъры№эющ (ярЁрьхЄЁр)
  71.     //ьхЄъш эхЄ: яш°хь т эрўрыю Ўхяюўъш рфЁхё ъюэЎр ёЄЁрэшЎ√ ш ёючфр╕ь ьхЄъє Єрь ёю ёё√ыъющ эр ёЄрЁюх эрўрыю Ўхяюўъш
  72.     freeidx = _lblbuffreeidx; //[0] //эрўрыю ётюсюфэюую ьхёЄр
  73.     IF (freeidx < _LBLBUFMAXSHIFT) { //хёЄ№ ьхёЄю яюф ьхЄъє
  74.       plbl = &_lbls[freeidx]; //єърчрЄхы№ эр эрўрыю ёючфртрхьющ ьхЄъш
  75.       //яш°хь ьхЄъє
  76.       POKE *(PUINT)(plbl) = _lblshift[_lblhash]; //ёЄрЁ√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
  77.       plbl = &plbl[+sizeof(UINT)];
  78.       POKE *(PBYTE)(plbl) = (BYTE)_lenname;
  79.       INC plbl;
  80.       strcopy(_name, _lenname, (PCHAR)plbl);
  81.       plbl = &plbl[_lenname+1];
  82.       POKE *(TYPE*)(plbl) = t;
  83.       plbl = &plbl[+sizeof(TYPE)]; //INC plbl;
  84.       POKE *(PBYTE)(plbl) = (BYTE)isloc;
  85.       INC plbl;
  86.       POKE *(PUINT)(plbl) = _typeaddr; //ёё√ыър эр эрчтрэшх Єшяр (фы  ёЄЁєъЄєЁ√)
  87.       plbl = &plbl[+sizeof(UINT)];
  88.       _varszaddr = (UINT)(plbl - _lbls); //ўЄюс√ яюЄюь ьюцэю с√ыю ьхэ Є№
  89.       POKE *(PUINT)(plbl) = varsz;
  90.       _lblbuffreeidx = (UINT)(plbl - _lbls) + +sizeof(UINT); //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш
  91.       _lblshift[_lblhash] = freeidx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
  92.     }ELSE {errstr("nomem"); enderr();
  93.     };
  94.   }ELSE IF (oldt != t) {
  95.     errstr("addvar type doesn't match previous declaration:"); errstr(_name); enderr();
  96.   };
  97. }
  98.  
  99. EXPORT PROC setvarsz(UINT addr, UINT shift)
  100. {
  101.   POKE *(PUINT)(&_lbls[addr]) = shift;
  102. }
  103.  
  104.