Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2024. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;   Written by hidnplayr@kolibrios.org                            ;;
  7. ;;                                                                 ;;
  8. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  9. ;;          Version 2, June 1991                                   ;;
  10. ;;                                                                 ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. ; TODO: work correctly with user prefixes.
  14. ; use first byte of nick for prefix ONLY (use a space for those that do not have special powers..)
  15.  
  16. user_prefixes db '~&@%+ ', 0    ; in descending order
  17.  
  18. ; TODO: update selected user if needed
  19. ; esi is ptr to nick
  20. ; ebx is ptr to window
  21. align 4
  22. user_add:
  23.  
  24.         cmp     [ebx + window.users], MAX_USERS
  25.         jae     .fail
  26.  
  27. ; Check if user is already listed (case insensitive)
  28.         mov     edi, [ebx + window.data_ptr]
  29.         add     edi, window_data.names
  30.         mov     ebp, [ebx + window.users]
  31.         inc     ebp             ; CHECKME
  32.  
  33.         push    esi edi
  34.   .restart:
  35.         mov     ecx, MAX_NICK_LEN
  36.   .loop1:
  37.         lodsb
  38.         cmp     al, '@'
  39.         jne     @f
  40.         mov     al, ' '         ; give @ highest priority
  41.   @@:
  42.         cmp     al, 'A'
  43.         jb      @f
  44.         cmp     al, 'Z'
  45.         ja      @f
  46.         add     al, 'a' - 'A'   ; convert to lowercase
  47.   @@:
  48.         dec     ecx
  49.         jz      .got_it
  50.  
  51.   .loop2:
  52.         mov     dl, [edi]
  53.         cmp     dl, 0
  54.         je      .got_it
  55.         cmp     dl, '@'
  56.         jne     @f
  57.         mov     dl, ' '         ; give @ highest priority
  58.   @@:
  59.         cmp     dl, 'A'
  60.         jb      @f
  61.         cmp     dl, 'Z'
  62.         ja      @f
  63.         add     dl, 'a' - 'A'   ; convert to lowercase
  64.   @@:
  65.         cmp     al, dl
  66.         jb      .got_it
  67.         je      .check_next
  68.  
  69.         pop     edi esi
  70.         add     edi, MAX_NICK_LEN
  71.         push    esi edi
  72.  
  73.         dec     ebp
  74.         jnz     .restart
  75.  
  76.   .check_next:
  77.         inc     edi
  78.         jmp     .loop1
  79.  
  80.   .got_it:
  81.         pop     edi esi
  82.  
  83. ; OK, insert it here..
  84.  
  85. ; mov all trailing usernames by MAX_NICK_LEN bytes
  86.         push    esi edi
  87.         mov     esi, [ebx + window.data_ptr]
  88.         add     esi, window_data.names + MAX_NICK_LEN * (MAX_USERS - 1) - 4     ; -4 because we're copying backward, dword wise
  89.         mov     ecx, esi
  90.         sub     ecx, edi
  91.         add     ecx, MAX_NICK_LEN
  92.         shr     ecx, 2
  93.         lea     edi, [esi + MAX_NICK_LEN]
  94.         std
  95.         rep     movsd
  96.         cld
  97.         pop     edi esi
  98.  
  99. ; Now insert our new username
  100.         mov     ecx, MAX_NICK_LEN-1
  101.   .fill:
  102.         lodsb
  103.         cmp     al, ' '
  104.         je      .done
  105.         cmp     al, '!'
  106.         je      .done
  107.         cmp     al, 13
  108.         je      .done
  109.         cmp     al, 10
  110.         je      .done
  111.         cmp     al, 0
  112.         je      .done
  113.         stosb
  114.         loop    .fill
  115.   .done:
  116.         xor     al, al
  117.         stosb
  118.  
  119.         inc     [ebx + window.users]
  120.         or      [ebx + window.flags], FLAG_UPDATED
  121.         dec     esi
  122.   .fail:
  123.         ret
  124.  
  125.  
  126.  
  127.  
  128. ; TODO: update selected user if needed
  129. ; esi is ptr to nick
  130. ; ebx is ptr to window
  131. align 4
  132. user_remove:
  133.  
  134.         call    user_find
  135.         jz      .fail
  136.  
  137.         lea     esi, [edi + MAX_NICK_LEN]
  138.         mov     ecx, [ebx + window.data_ptr]
  139.         add     ecx, window_data.names + MAX_NICK_LEN * MAX_USERS
  140.         sub     ecx, esi
  141.         shr     ecx, 2
  142.         rep     movsd
  143.  
  144.         dec     [ebx + window.users]
  145.         or      [ebx + window.flags], FLAG_UPDATED
  146.   .fail:
  147.         ret
  148.  
  149.  
  150.  
  151. ; IN:
  152. ; esi is ptr to nick
  153. ; ebx is ptr to window
  154. ; OUT:
  155. ; edi is ptr to nick in userlist
  156. align 4
  157. user_find:
  158.  
  159.         mov     eax, [ebx + window.users]
  160.         test    eax, eax
  161.         jz      .fail
  162.         mov     edi, [ebx + window.data_ptr]
  163.         add     edi, window_data.names
  164.  
  165.   .loop:
  166.         push    esi edi
  167.         mov     ecx, MAX_NICK_LEN
  168.         repe    cmpsb
  169.         cmp     byte[edi-1], 0
  170.         je      .got_it
  171.         ; TODO: check byte[esi] too!
  172.         pop     edi esi
  173.         add     edi, MAX_NICK_LEN
  174.         dec     eax
  175.         jnz     .loop
  176.         jmp     .fail
  177.  
  178.   .got_it:
  179.         pop     edi esi
  180.         test    edi, edi        ; to clear zero flag
  181.         ret
  182.  
  183.   .fail:
  184.         xor     edi, edi
  185.         ret
  186.  
  187.  
  188.  
  189. user_remove_all:
  190.  
  191.         xor     eax, eax
  192.         mov     edi, [window_print]
  193.         mov     [edi + window.users], eax
  194.         mov     [edi + window.selected], eax
  195.         mov     edi, [edi + window.data_ptr]
  196.         add     edi, window_data.names
  197.         mov     ecx, MAX_NICK_LEN * MAX_USERS / 4
  198.         rep stosd
  199.  
  200.         ret