kolibrios/kernel/branches/net/applications/ircc/users.inc
hidnplayr 1373a38089 Added alphabetic sorting for users in IRCc
git-svn-id: svn://kolibrios.org@3233 a494cfbc-eb01-0410-851d-a64ba20cac60
2013-02-07 13:29:24 +00:00

164 lines
3.3 KiB
PHP

; esi is ptr to nick
; ebx is ptr to window
align 4
user_add:
cmp [ebx + window.users], MAX_USERS
jae fail
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)
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
stosb
loop .fill
.done:
xor al, al
stosb
inc [ebx + window.users]
ret
; 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]
xor eax, eax
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