forked from KolibriOS/kolibrios
eb7e44a0e0
Implemented proper handeling of partially received commands. git-svn-id: svn://kolibrios.org@9984 a494cfbc-eb01-0410-851d-a64ba20cac60
200 lines
5.1 KiB
PHP
200 lines
5.1 KiB
PHP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; Copyright (C) KolibriOS team 2004-2024. All rights reserved. ;;
|
|
;; Distributed under terms of the GNU General Public License ;;
|
|
;; ;;
|
|
;; Written by hidnplayr@kolibrios.org ;;
|
|
;; ;;
|
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
|
;; Version 2, June 1991 ;;
|
|
;; ;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
; TODO: work correctly with user prefixes.
|
|
; use first byte of nick for prefix ONLY (use a space for those that do not have special powers..)
|
|
|
|
user_prefixes db '~&@%+ ', 0 ; in descending order
|
|
|
|
; TODO: update selected user if needed
|
|
; esi is ptr to nick
|
|
; ebx is ptr to window
|
|
align 4
|
|
user_add:
|
|
|
|
cmp [ebx + window.users], MAX_USERS
|
|
jae .fail
|
|
|
|
; Check if user is already listed (case insensitive)
|
|
mov edi, [ebx + window.data_ptr]
|
|
add edi, window_data.names
|
|
mov ebp, [ebx + window.users]
|
|
inc ebp ; CHECKME
|
|
|
|
push esi edi
|
|
.restart:
|
|
mov ecx, MAX_NICK_LEN
|
|
.loop1:
|
|
lodsb
|
|
cmp al, '@'
|
|
jne @f
|
|
mov al, ' ' ; give @ highest priority
|
|
@@:
|
|
cmp al, 'A'
|
|
jb @f
|
|
cmp al, 'Z'
|
|
ja @f
|
|
add al, 'a' - 'A' ; convert to lowercase
|
|
@@:
|
|
dec ecx
|
|
jz .got_it
|
|
|
|
.loop2:
|
|
mov dl, [edi]
|
|
cmp dl, 0
|
|
je .got_it
|
|
cmp dl, '@'
|
|
jne @f
|
|
mov dl, ' ' ; give @ highest priority
|
|
@@:
|
|
cmp dl, 'A'
|
|
jb @f
|
|
cmp dl, 'Z'
|
|
ja @f
|
|
add dl, 'a' - 'A' ; convert to lowercase
|
|
@@:
|
|
cmp al, dl
|
|
jb .got_it
|
|
je .check_next
|
|
|
|
pop edi esi
|
|
add edi, MAX_NICK_LEN
|
|
push esi edi
|
|
|
|
dec ebp
|
|
jnz .restart
|
|
|
|
.check_next:
|
|
inc edi
|
|
jmp .loop1
|
|
|
|
.got_it:
|
|
pop edi esi
|
|
|
|
; OK, insert it here..
|
|
|
|
; mov all trailing usernames by MAX_NICK_LEN bytes
|
|
push esi edi
|
|
mov esi, [ebx + window.data_ptr]
|
|
add esi, window_data.names + MAX_NICK_LEN * (MAX_USERS - 1) - 4 ; -4 because we're copying backward, dword wise
|
|
mov ecx, esi
|
|
sub ecx, edi
|
|
add ecx, MAX_NICK_LEN
|
|
shr ecx, 2
|
|
lea edi, [esi + MAX_NICK_LEN]
|
|
std
|
|
rep movsd
|
|
cld
|
|
pop edi esi
|
|
|
|
; Now insert our new username
|
|
mov ecx, MAX_NICK_LEN-1
|
|
.fill:
|
|
lodsb
|
|
cmp al, ' '
|
|
je .done
|
|
cmp al, '!'
|
|
je .done
|
|
cmp al, 13
|
|
je .done
|
|
cmp al, 10
|
|
je .done
|
|
cmp al, 0
|
|
je .done
|
|
stosb
|
|
loop .fill
|
|
.done:
|
|
xor al, al
|
|
stosb
|
|
|
|
inc [ebx + window.users]
|
|
or [ebx + window.flags], FLAG_UPDATED
|
|
dec esi
|
|
.fail:
|
|
ret
|
|
|
|
|
|
|
|
|
|
; TODO: update selected user if needed
|
|
; esi is ptr to nick
|
|
; ebx is ptr to window
|
|
align 4
|
|
user_remove:
|
|
|
|
call user_find
|
|
jz .fail
|
|
|
|
lea esi, [edi + MAX_NICK_LEN]
|
|
mov ecx, [ebx + window.data_ptr]
|
|
add ecx, window_data.names + MAX_NICK_LEN * MAX_USERS
|
|
sub ecx, esi
|
|
shr ecx, 2
|
|
rep movsd
|
|
|
|
dec [ebx + window.users]
|
|
or [ebx + window.flags], FLAG_UPDATED
|
|
.fail:
|
|
ret
|
|
|
|
|
|
|
|
; IN:
|
|
; esi is ptr to nick
|
|
; ebx is ptr to window
|
|
; OUT:
|
|
; edi is ptr to nick in userlist
|
|
align 4
|
|
user_find:
|
|
|
|
mov eax, [ebx + window.users]
|
|
test eax, eax
|
|
jz .fail
|
|
mov edi, [ebx + window.data_ptr]
|
|
add edi, window_data.names
|
|
|
|
.loop:
|
|
push esi edi
|
|
mov ecx, MAX_NICK_LEN
|
|
repe cmpsb
|
|
cmp byte[edi-1], 0
|
|
je .got_it
|
|
; TODO: check byte[esi] too!
|
|
pop edi esi
|
|
add edi, MAX_NICK_LEN
|
|
dec eax
|
|
jnz .loop
|
|
jmp .fail
|
|
|
|
.got_it:
|
|
pop edi esi
|
|
test edi, edi ; to clear zero flag
|
|
ret
|
|
|
|
.fail:
|
|
xor edi, edi
|
|
ret
|
|
|
|
|
|
|
|
user_remove_all:
|
|
|
|
xor eax, eax
|
|
mov edi, [window_print]
|
|
mov [edi + window.users], eax
|
|
mov [edi + window.selected], eax
|
|
mov edi, [edi + window.data_ptr]
|
|
add edi, window_data.names
|
|
mov ecx, MAX_NICK_LEN * MAX_USERS / 4
|
|
rep stosd
|
|
|
|
ret |