//------------------------------------------------------------------------------
// strcmp( ESI, EDI)
// strlen( EDI)
// strcpy( EDI, ESI)
// strcat( EDI, ESI)
// strchr( ESI,BL)
// strrchr( ESI,BL)
// strstr( EBX, EDX)
// itoa( ESI)
// atoi( EAX)
// strupr( ESI)
// strlwr( ESI)
// strttl( EDX)
// strtok( ESI)
//------------------------------------------------------------------------------

inline fastcall signed int strcmp( ESI, EDI)
{
	loop()
	{
		IF (DSBYTE[ESI]<DSBYTE[EDI]) RETURN -1;
		IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
		IF (DSBYTE[ESI]=='\0') RETURN 0;
		ESI++;
		EDI++;
	}
}


inline fastcall signed int strncmp( ESI, EDI, ECX)
{
  asm {
    MOV EBX, EDI
    XOR EAX, EAX
    MOV EDX, ECX
    OR ECX, ECX
    JE L1
    REPNE SCASB
    SUB EDX, ECX
    MOV ECX, EDX
    MOV EDI, EBX
    XOR EBX, EBX
    REPE CMPSB
    MOV AL, DSBYTE[ ESI-1]
    MOV BL, DSBYTE[ EDI-1]
    SUB EAX, EBX
L1:
  }
}



/*

inline fastcall signed int strcmpi( ESI,EDI)
uses EBX
{
	do{
		$lodsb
		IF(AL>='a')&&(AL<='z')AL-=0x20;
		BL=DSBYTE[(E)DI];
		IF(BL>='a')&&(BL<='z')BL-=0x20;
		AL-=BL;
		IF(!ZEROFLAG)BREAK;
		(E)DI++;
	}while(BL!=0);
}

inline char STRNCMPI((E)SI,(E)DI,(E)CX)
{
	(E)AX=0;
	LOOPNZ((E)CX){
		$lodsb
		IF(AL>='a')&&(AL<='z')AL-=0x20;
		AH=DSBYTE[EDI];
		IF(AH>='a')&&(AH<='z')AH-=0x20;
		EDI++;
		IF(AL==0)||(AH==0)||(AL!=AH)BREAK;
	}
	AL=AL-AH;
}*/



inline fastcall unsigned int strlen( EDI)
{
	$xor eax, eax
	$mov ecx, -1
	$REPNE $SCASB
	EAX-=2+ECX;
}


inline fastcall strcpy( EDI, ESI)
{
	$cld
l2:
	$lodsb
	$stosb
	$test al,al
	$jnz l2
}


inline fastcall strcat( EDI, ESI)
{
  asm {
    mov ebx, edi
    xor ecx, ecx
    xor eax, eax
    dec ecx
    repne scasb
    dec edi
    mov edx, edi
    mov edi, esi
    xor ecx, ecx
    xor eax, eax
    dec ecx
    repne scasb
    xor ecx, 0ffffffffh
    mov edi, edx
    mov edx, ecx
    mov eax, edi
    shr ecx, 2
    rep movsd
    mov ecx, edx
    and ecx, 3
    rep movsb
    mov eax, ebx
	}
}

char buffer[11];
inline fastcall dword itoa( ESI)
{
     $mov     edi, #buffer
     $mov     ecx, 10
     $test     esi, esi
     $jns     f1
     $mov     al, '-'
     $stosb
     $neg     esi
f1:
     $mov     eax, esi
     $push     -'0'
f2:
     $xor     edx, edx
     $div     ecx
     $push     edx
     $test     eax, eax
     $jnz     f2
f3:
     $pop     eax
     $add     al, '0'
     $stosb
     $jnz     f3
     $mov     eax, #buffer
     $ret
} 


inline fastcall dword atoi( EDI)
{
	//ESI=EDI=EAX;
	ESI=EDI;
	IF(DSBYTE[ESI]=='-')ESI++;
	EAX=0;
	BH=AL;
	do{
		BL=DSBYTE[ESI]-'0';
		EAX=EAX*10+EBX;
		ESI++;
	}while(DSBYTE[ESI]>0);
	IF(DSBYTE[EDI]=='-') -EAX;
}


inline fastcall unsigned int strchr( ESI,BL)
{
	int jj=0;
	do{
		jj++;
		$lodsb
		IF(AL==BL) return jj;
	} while(AL!=0);
}


inline fastcall unsigned int strrchr( ESI,BL)
{
	int jj=0, last=-1;
	do{
		jj++;
		$lodsb
		IF(AL==BL) last=jj;
	} while(AL!=0);
	return last;
}


inline fastcall strupr( ESI)
{
	do{
		AL=DSBYTE[ESI];
		IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
 		ESI++;
	}while(AL!=0);
}

inline fastcall strlwr( ESI)
{
	do{
		$LODSB
		IF(AL>='A')&&(AL<='Z'){
			AL+=0x20;
			DSBYTE[ESI-1]=AL;
			CONTINUE;
		}
	}while(AL!=0);
}

inline fastcall strttl( EDX)
{
	AL=DSBYTE[EDX];
	IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
	IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;	//�-�
	IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;	//�-�
	do{
		EDX++;
		AL=DSBYTE[EDX];
		IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
		IF(AL>='�')&&(AL<='�')DSBYTE[EDX]=AL|0x20; //�-�
		IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;	//�-�
	}while(AL!=0);
}



inline fastcall unsigned int strstr( EBX, EDX)
{
  asm {
    mov edi, edx
    xor ecx, ecx
    xor eax, eax
    dec ecx
    repne scasb
    not ecx
    dec ecx
    je ls2
    mov esi, ecx
    xor ecx, ecx
    mov edi, ebx
    dec ecx
    repne scasb
    not ecx
    sub ecx, esi
    jbe ls2
    mov edi, ebx
    lea ebx, DSDWORD[ esi-1]
ls1: mov esi, edx
    lodsb
    repne scasb
    jne ls2
    mov eax, ecx
    push edi
    mov ecx, ebx
    repe cmpsb
    pop edi
    mov ecx, eax
    jne ls1
    lea eax, DSDWORD[ edi-1]
    jmp short ls3
ls2: xor eax, eax
ls3:
  }
}
















/* strtok( LPSTR dest, src, divs);
src - ��������� �� �������� ������ ��� ��������� ����������� ������
dest - ��������� �� �����, ���� ����� ����������� �����
divs - ��������� �� ������, ���������� �������-�����������
����������: 0, ���� ���� ������ ���
         �� 0, ���� ����� ����������� � dest (��������� ��� ��������
               � �������� src ��� ������������ ������) */

dword fastcall strtok( EDX, ESI, EBX)
{
  asm {
    XOR ECX, ECX
    MOV EDI, EBX
    XOR EAX, EAX
    DEC ECX
    REPNE SCASB
    XOR ECX, 0FFFFFFFFH
    DEC ECX
    PUSH ECX
L1: LODSB
    OR AL, AL
    JZ L4
    MOV EDI, EBX
    MOV ECX, SSDWORD[ ESP]
    REPNE SCASB
    JZ L1
    DEC ESI
L2: LODSB
    MOV EDI, EBX
    MOV ECX, SSDWORD[ ESP]
    REPNE SCASB
    JZ L3
    MOV DSBYTE[ EDX], AL
    INC EDX
    JMP SHORT L2
L3: MOV EAX, ESI
L4: POP ECX
  } DSBYTE[ EDX] = 0;
}

#define strncpy strcpyn
#define strnmov strmovn
#define stricmp strcmpi
#define strcmpn strncmp
#define strncmpi strcmpni
#define stricmpn strcmpni
#define strnicmp strcmpni
#define strincmp strcmpni
#define strcmpin strcmpni