

;       =================================================================================
;         OPERACJE NA LANCUCHACH ZNAKOW  - STATYCZNA BIBLIOTEKA PROCEDUR ASSEMBLERA
;             W SKLADNI FASM. KOMPILATOR: FASMW ( http://www.flatassembler.net )
;                          < wawrzyniakmarcincode@gmail.com >
;       =================================================================================
;
;
;
;       ---------------------------------------------------------------------------------
;       Wszystkie funkcje oparte sa na zalozeniach:
;         - koncowy bajt zerowy w przypadku ansi lub koncowe dwa bajty dla unicode naleza
;           do lancucha znakow i stanowia jego integralna czesc.
;         - wszystkie funkcje przywracaja po sobie stos oraz przywracaja stan
;           rejestrow EBX, ESI, EDI, EBP oraz rejestr flagowy.
;         - wszystkie zawarte w pliku funkcje dzialaja autonomicznie tzn bez potrzeby
;           dostepu do funkcji z poza tego pliku jednak moga wywolywac siebie nawzajem
;           co oznacza, ze do prawidlowego dzialania biblioteki niezbedne sa wszystkie
;           funkcje z listy ponizej.
;       ---------------------------------------------------------------------------------
;
;
;
;
;       =================================================================================
;          LISTA ZDEFINIOWANYCH W TYM PLIKU PROCEDUR WRAZ Z PROTOTYPEM WYWOLANIA:
;       =================================================================================
;
;            01).   -    DWORD    ansiLength          ( pstringx )
;            02).   -    DWORD    unicodeLength       ( pstringx )
;            03).   -    VOID     ansiCopy            ( pstring_out, pstring_in )
;            04).   -    VOID     unicodeCopy         ( pstring_out, pstring_in )
;            05).   -    VOID     ansiCat             ( pstring_out, pstring_in )
;            05).   -    BOOL     ansiCmp             ( pstringx, pstringy )
;            06).   -    DWORD    ansiCmpx            ( pstringx, pstringy )
;            07).   -    BOOL     unicodeCmp          ( pstringx, pstringy )
;            08).   -    DWORD    unicodeCmpx         ( pstringx, pstringy )
;            09).   -    VOID     ansiToBig           ( pstring_out, pstring_in )
;            10).   -    VOID     ansiToSmall         ( pstring_out, pstring_in )
;            11).   -    VOID     unicodeToBig        ( pstring_out, pstring_in )
;            12).   -    VOID     unicodeToSmall      ( pstring_out, pstring_in )
;            13).   -    VOID     unicodeToAnsi       ( pstring_out, pstring_in )
;            14).   -    VOID     ansiToUnicode       ( pstring_out, pstring_in )


;
;
;
;       =================================================================================
;          STALE WARTOSCI WYKOZYSTYWANE PRZEZ FUNKCJE W TYM PLIKU:
;       =================================================================================
;





;       =================================================================================
;                     KODY ZRODLOWE ZDEFINIOWANYCH FUNKCJI:
;       =================================================================================
;
;
;
;
;
;       =================================================================================
;       DWORD   ansiLength   ( pstring )
;               zwraca dlugosc lancucha ansi.
;       in:     pointer do stringu ansi.
;       out:    ilosc znakow.
;       ---------------------------------------------------------------------------------
        proc    ansiLength   uses ebx esi edi, pstringx
        pushfd
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringx]
            cld
            repne     scasb
            not       ecx
            xchg      eax, ecx
            popfd
            ret
        endp
;       =================================================================================







;       =================================================================================
;       DWORD   unicodeLength   ( pstring )
;               zwraca dlugosc lancucha unicode w bajtach nie w znakach.
;       in:     pointer do stringu unicode.
;       out:    ilosc bajtow przypisanych do stringa.
;       ---------------------------------------------------------------------------------
        proc    unicodeLength   uses ebx esi edi, pstringx
        pushfd
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringx]
            cld
            repne     scasw
            not       ecx
            xchg      eax, ecx
            popfd
            ret
        endp
;       =================================================================================







;       =================================================================================
;       VOID    ansiCopy   ( pstring_out, pstring_in )
;               kopiuje podany lancuch znakow.
;
;       ---------------------------------------------------------------------------------
        proc    ansiCopy   uses ebx esi edi, pstring_out, pstring_in
        pushfd
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstring_in]
            cld
            repne     scasb
            not       ecx
            mov       esi, [pstring_in]
            mov       edi, [pstring_out]
            rep       movsb
            ret
        endp
;       =================================================================================







;       =================================================================================
;       VOID    unicodeCopy   ( pstring_out, pstring_in )
;               kopiuje podany lancuch znakow.
;
;       ---------------------------------------------------------------------------------
        proc    unicodeCopy   uses ebx esi edi, pstring_out, pstring_in
        pushfd
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstring_in]
            cld
            repne     scasw
            not       ecx
            mov       esi, [pstring_in]
            mov       edi, [pstring_out]
            rep       movsb
            ret
        endp
;       =================================================================================







;       =================================================================================
;       VOID    ansiCat   ( pstring_out, pstring_in )
;                 laczy dwa stringi. Nic nie zwraca.
;       in:     pointer do lancucha docelowego, pointer do lancucha dolacanego.
;       out:    Nic nie zwraca.
;
;       ---------------------------------------------------------------------------------
        proc    ansiCat   uses esi edi, pstringx, pstringy
        pushfd

            cld
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       esi, [pstringy]
            mov       edi, [pstringx]
            repne     scasb
            dec       edi
         @@:
            lodsb
            stosb
            test    eax, eax
            jnz     @b
            popfd
            ret
endp
;       =================================================================================








;       =================================================================================
;       BOOL    ansiCmp   (  pstringx,  pstringy )
;               Funkcja porownuje dwa lancuchy ansi zwraca TRUE jezeli sa identyczne.
;               W przeciwnym wypadku zwraca FALSE.
;       in:     pointer do lancucha1, pointer do lancucha2
;       out:    TRUE jezeli identyczne, FALSE jezeli rozne.
;       ---------------------------------------------------------------------------------
        proc    ansiCmp   uses ebx esi edi,  pstringx,  pstringy
        pushfd
          .length:
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringx]
            cld
            repne     scasb
            xchg      ebx, ecx
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringx]
            repne     scasb
            cmp       ecx, ebx
            je       .cmp
            popfd
            ret
          .cmp:
            not       ecx
            push      [pstringx]
            pop       esi
            push      [pstringy]
            pop       edi
            repe      cmpsb
            jcxz     .return_true
          .return_false:
            popfd
            ret
          .return_true:
            inc       eax
            popfd
            ret
       endp
;       =================================================================================









;       =================================================================================
;       BOOL    unicodeCmp   (  pstringx,  pstringy )
;               Funkcja porownuje dwa lancuchy unicode zwraca TRUE jezeli sa identyczne.
;               W przeciwnym wypadku zwraca FALSE.
;       in:     pointer do lancucha1, pointer do lancucha2
;       out:    TRUE jezeli identyczne, FALSE jezeli rozne.
;       ---------------------------------------------------------------------------------
        proc    unicodeCmp   uses ebx esi edi,  pstringx,  pstringy
        pushfd
          .length:
            xor       eax, eax
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringx]
            cld
            repne     scasw
            xchg      ebx, ecx
            mov       ecx, 0FFFFFFFFh
            mov       edi, [pstringy]
            repne     scasw
            cmp       ecx, ebx
            je       .cmp
            popfd
            ret
          .cmp:
            not       ecx
            push      [pstringx]
            pop       esi
            push      [pstringy]
            pop       edi
            repe      cmpsw
            jcxz     .return_true
          .return_false:
            popfd
            ret
          .return_true:
            inc       eax
            popfd
            ret
       endp
;      =================================================================================








;       =================================================================================
;       VOID   ansiToSmall   ( pstring_out,  pstring_in )
;              Zmienia rozmiar wszystkich liter w podanym stringu z duzych na male litery.
;       IN:    pstring_out - bufor wyjsciowy.   pstring_in - pointer na lancuch znakow.
;       OUT:   funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc     ansiToSmall  uses ebx esi edi,  pstring_out, pstring_in
        pushfd
          .getlength:
            xor       eax, eax
            mov       edi, [pstring_in]
            push      edi
            mov       ecx, 0FFFFFFFFh
            cld
            repne     scasb
            not       ecx
            pop       esi
            mov       edi, [pstring_out]
          .change_size:
            lodsb
            cmp       al, 'A'
            jnae      @F
            cmp       al, 'Z'
            jnbe      @F
            or        al, 020h
          @@:
            stosb
            loop     .change_size
            popfd
            ret
        endp
;       =================================================================================









;       =================================================================================
;       VOID   unicodeToSmall   ( pstring_out,  pstring_in )
;              Zmienia rozmiar wszystkich liter w podanym stringu z duzych na male litery.
;       IN:    pstring_out - bufor wyjsciowy.   pstring_in - pointer na lancuch znakow.
;       OUT:   funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc     unicodeToSmall  uses ebx esi edi,  pstring_out, pstring_in
        pushfd
          .getlength:
            xor       eax, eax
            mov       edi, [pstring_in]
            push      edi
            mov       ecx, 0FFFFFFFFh
            cld
            repne     scasw
            not       ecx
            pop       esi
            mov       edi, [pstring_out]
          .change_size:
            lodsw
            cmp       al, 'A'
            jnae      @F
            cmp       al, 'Z'
            jnbe      @F
            or        al, 020h
          @@:
            stosw
            loop     .change_size
            popfd
            ret
        endp
;       =================================================================================








;       =================================================================================
;       VOID   ansiToBig   ( pstring_out,  pstring_in )
;              Zmienia rozmiar wszystkich liter w podanym stringu z malych na duze litery.
;       IN:    pstring_out - bufor wyjsciowy.   pstring_in - pointer na lancuch znakow.
;       OUT:   funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc     ansiToBig  uses ebx esi edi,  pstring_out, pstring_in
        pushfd
          .getlength:
            xor       eax, eax
            mov       edi, [pstring_in]
            push      edi
            mov       ecx, 0FFFFFFFFh
            cld
            repne     scasb
            not       ecx
            pop       esi
            mov       edi, [pstring_out]
         .change_size:
            lodsb
            cmp       al, 'a'
            jnae      @F
            cmp       al, 'z'
            jnbe      @F
            xor       al, 020h
          @@:
            stosb
            loop     .change_size
            popfd
            ret
        endp
;       =================================================================================








;       =================================================================================
;       VOID   unicodeToBig   ( pstring_out,  pstring_in )
;              Zmienia rozmiar wszystkich liter w podanym stringu z malych na duze.
;       IN:    pstring_out - bufor wyjsciowy.   pstring_in - pointer na lancuch znakow.
;       OUT:   funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc     unicodeToBig  uses ebx esi edi,  pstring_out, pstring_in
        pushfd
          .getlength:
            xor       eax, eax
            mov       edi, [pstring_in]
            push      edi
            mov       ecx, 0FFFFFFFFh
            cld
            repne     scasw
            not       ecx
            pop       esi
            mov       edi, [pstring_out]
          .change_size:
            lodsw
            cmp       al, 'a'
            jnae      @F
            cmp       al, 'z'
            jnbe      @F
            xor       al, 020h
          @@:
            stosw
            loop     .change_size
            popfd
            ret
        endp
;       =================================================================================




;       =================================================================================
;       VOID  unicodeToAnsi   ( pstring_out, pstring_in )
;             .konwertuje string unicode do postaci ansi.
;       IN:   pstring_out  - pointer na bufor ktory odbierze string wyjsciowy.
;             pstring_in   - pointer na string wejsciowy.
;       OUT:  Funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc    unicodeToAnsi   uses ebx esi edi, pstring_out, pstring_in
        pushfd
                xor        eax, eax
                mov        ecx, 0FFFFFFFFh
                mov        edi, [pstring_in]
                mov        esi, edi
                cld
                repne      scasw
                not        ecx
                mov        edi, [pstring_out]
            @@: lodsw
                stosb
                loop       @B
                popfd
                ret
        endp
;       =================================================================================






;       =================================================================================
;       VOID  ansiToUnicode   ( pstring_out, pstring_in )
;             .konwertuje string ansi do postaci unicode.
;       IN:   pstring_out  - pointer na bufor ktory odbierze string wyjsciowy.
;             pstring_in   - pointer na string wejsciowy.
;       OUT:  Funkcja nic nie zwraca.
;       ---------------------------------------------------------------------------------
        proc    ansiToUnicode   uses ebx esi edi, pstring_out, pstring_in
        pushfd
                xor        eax, eax
                mov        ecx, 0FFFFFFFFh
                mov        edi, [pstring_in]
                mov        esi, edi
                cld
                repne      scasb
                not        ecx
                mov        edi, [pstring_out]
            @@: lodsb
                stosw
                loop       @B
                popfd
                ret
        endp
;       =================================================================================




;       *********************************************************************************
;       =================================================================================
;       W TEJ CZESCI FUNKCJE KOZYSTAJA Z INNYCH FUNKCJI I PROCEDUR TEGO PLIKU:
;       =================================================================================
;       *********************************************************************************



;       =================================================================================
;       DWORD   ansiCmpx  (  pstringx,  pstringy )
;              .porownuje dwa lancuchy znakow ansi bez wzgledu na wielkosc liter.
;              .maxymalna wielkosc badanych stringow = 1024 bajty.
;       IN:     pstring_x  - pointer na string x.
;               pstring_y  - pointer na string y.
;       OUT:    00         - lancuchy sa rozne.
;               01         - lancuchy sa identyczne.
;               0FFFFFFFFh - jeden lub obydwa lancuchy sa zbyt dlugie ( 1024 b limit )
;       ---------------------------------------------------------------------------------
        proc   ansiCmpx   uses ebx esi edi, pstring_x, pstring_y
        pushfd
        locals
                stringx         rb  1024
                stringy         rb  1024
        endl
                .start:
                       stdcall     ansiLength, [pstring_x]
                       cmp         eax, 1024
                       ja         .length_error
                       stdcall     ansiLength, [pstring_y]
                       cmp         eax, 1024
                       ja         .length_error
                       stdcall     ansiToSmall, addr stringx, [pstring_x]
                       stdcall     ansiToSmall, addr stringy, [pstring_y]
                       stdcall     ansiCmp,     addr stringx, addr stringy
                       popfd
                       ret
                .length_error:
                       mov         eax, 0FFFFFFFFh
                       popfd
                       ret
        endp
;       =================================================================================





;       =================================================================================
;       DWORD   unicodeCmpx  (  pstringx,  pstringy )
;              .porownuje dwa lancuchy znakow unicode bez wzgledu na wielkosc liter.
;              .maxymalna wielkosc badanych stringow = 1024 bajty.
;       IN:     pstring_x  - pointer na string x.
;               pstring_y  - pointer na string y.
;       OUT:    00         - lancuchy sa rozne.
;               01         - lancuchy sa identyczne.
;               0FFFFFFFFh - jeden lub obydwa lancuchy sa zbyt dlugie ( 1024 b limit )
;       ---------------------------------------------------------------------------------
        proc    unicodeCmpx   uses ebx esi edi, pstring_x, pstring_y
        pushfd
        locals
                stringx         rb      1024
                stringy         rb      1024
        endl
                .start:
                        stdcall    unicodeLength, [pstring_x]
                        cmp        eax, 1024
                        ja        .length_error
                        stdcall    unicodeLength, [pstring_y]
                        cmp        eax, 1024
                        ja        .length_error
                        stdcall    unicodeToSmall, addr stringx, [pstring_x]
                        stdcall    unicodeToSmall, addr stringy, [pstring_y]
                        stdcall    unicodeCmp, addr stringx, addr stringy
                        popfd
                        ret
                .length_error:
                        mov       eax, 0FFFFFFFFh
                        popfd
                        ret
        endp
;       =================================================================================


