diff --git a/programs/network/ircc/ircc.asm b/programs/network/ircc/ircc.asm index e2c6630c40..466a6203ba 100644 --- a/programs/network/ircc/ircc.asm +++ b/programs/network/ircc/ircc.asm @@ -13,84 +13,85 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -version equ '0.22' +version equ '0.23' ; connection status -STATUS_DISCONNECTED = 0 -STATUS_RESOLVING = 1 -STATUS_CONNECTING = 2 -STATUS_CONNECTED = 3 +STATUS_DISCONNECTED = 0 +STATUS_RESOLVING = 1 +STATUS_CONNECTING = 2 +STATUS_CONNECTED = 3 ; window flags -FLAG_UPDATED = 1 shl 0 -FLAG_RECEIVING_NAMES = 1 shl 1 +FLAG_UPDATED = 1 shl 0 +FLAG_RECEIVING_NAMES = 1 shl 1 +FLAG_SCROLL_LOW = 1 shl 2 ; window types -WINDOWTYPE_NONE = 0 -WINDOWTYPE_SERVER = 1 -WINDOWTYPE_CHANNEL = 2 -WINDOWTYPE_CHAT = 3 -WINDOWTYPE_LIST = 4 -WINDOWTYPE_DCC = 5 +WINDOWTYPE_NONE = 0 +WINDOWTYPE_SERVER = 1 +WINDOWTYPE_CHANNEL = 2 +WINDOWTYPE_CHAT = 3 +WINDOWTYPE_LIST = 4 +WINDOWTYPE_DCC = 5 ; supported encodings -CP866 = 0 -CP1251 = 1 -UTF8 = 2 +CP866 = 0 +CP1251 = 1 +UTF8 = 2 ; settings -USERCMD_MAX_SIZE = 400 +USERCMD_MAX_SIZE = 400 -WIN_MIN_X = 600 -WIN_MIN_Y = 170 +WIN_MIN_X = 600 +WIN_MIN_Y = 170 -TEXT_X = 5 -TEXT_Y = TOP_Y + 2 +TEXT_X = 5 +TEXT_Y = TOP_Y + 2 -TOP_Y = 24 -BOTTOM_Y = 15 +TOP_Y = 24 +BOTTOM_Y = 15 -MAX_WINDOWS = 20 -MAX_USERS = 4096 -TEXT_BUFFERSIZE = 1024*1024 +MAX_WINDOWS = 20 +MAX_USERS = 4096 +TEXT_BUFFERSIZE = 1024*1024 -MAX_NICK_LEN = 32 -MAX_REAL_LEN = 32 ; realname -MAX_SERVER_NAME = 256 +MAX_NICK_LEN = 32 +MAX_REAL_LEN = 32 ; realname +MAX_SERVER_NAME = 256 -MAX_CHANNEL_LEN = 40 -MAX_CHANNELS = 37 +MAX_CHANNEL_LEN = 40 +MAX_CHANNELS = 37 -MAX_COMMAND_LEN = 512 +MAX_COMMAND_LEN = 512 -TIMESTAMP = 3 ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp +TIMESTAMP = 3 ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp -MAX_WINDOWNAME_LEN = 256 +MAX_WINDOWNAME_LEN = 256 -WINDOW_BTN_START = 100 -WINDOW_BTN_CLOSE = 2 -WINDOW_BTN_LIST = 3 +WINDOW_BTN_START = 100 +WINDOW_BTN_CLOSE = 2 +WINDOW_BTN_LIST = 3 -SCROLLBAR_WIDTH = 14 -USERLIST_WIDTH = 100 +SCROLLBAR_WIDTH = 14 +USERLIST_WIDTH = 100 -FONT_HEIGHT = 9 -FONT_WIDTH = 6 +FONT_HEIGHT = 9 +FONT_WIDTH = 6 format binary as "" use32 - org 0x0 + org 0x0 - db 'MENUET01' ; 8 byte id - dd 1 ; header version - dd START ; program start - dd I_END ; program image size - dd IM_END+2048 ; required amount of memory - dd IM_END+2048 - dd param - dd path + db 'MENUET01' ; 8 byte id + dd 1 ; header version + dd START ; program start + dd I_END ; program image size + dd IM_END+2048 ; required amount of memory + dd IM_END+2048 + dd param + dd path include "../../macros.inc" include "../../proc32.inc" @@ -99,28 +100,28 @@ include "../../network.inc" include "../../struct.inc" include "../../develop/libraries/box_lib/trunk/box_lib.mac" -struct window - data_ptr dd ? - flags db ? - type db ? - name rb MAX_WINDOWNAME_LEN - users dd ? - users_scroll dd ? - selected dd ? ; selected user, 0 if none selected +struct window + data_ptr dd ? + flags db ? + type db ? + name rb MAX_WINDOWNAME_LEN + users dd ? + users_scroll dd ? + selected dd ? ; selected user, 0 if none selected - text_start dd ? ; pointer to current textbox data - text_end dd ? - text_print dd ? ; pointer to first character to print on screen - text_line_print dd ? ; line number of that character - text_write dd ? ; write pointer - text_lines dd ? ; total number of lines - text_scanned dd ? ; pointer to beginning of unscanned data (we still need to count number of lines, insert newline characters,..) + text_start dd ? ; pointer to current textbox data + text_end dd ? + text_print dd ? ; pointer to first character to print on screen + text_line_print dd ? ; line number of that character + text_write dd ? ; write pointer + text_lines dd ? ; total number of lines + text_scanned dd ? ; pointer to beginning of unscanned data (we still need to count number of lines, insert newline characters,..) ends -struct window_data - text rb TEXT_BUFFERSIZE - names rb MAX_NICK_LEN * MAX_USERS +struct window_data + text rb TEXT_BUFFERSIZE + names rb MAX_NICK_LEN * MAX_USERS ends include "encodings.inc" @@ -135,220 +136,220 @@ include "textbox.inc" START: - mcall 68, 11 ; init heap so we can allocate memory dynamically + mcall 68, 11 ; init heap so we can allocate memory dynamically ; wanted events - mcall 40, EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_STACK+EVM_MOUSE+EVM_MOUSE_FILTER + mcall 40, EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_STACK+EVM_MOUSE+EVM_MOUSE_FILTER ; load libraries - stdcall dll.Load, @IMPORT - test eax, eax - jnz exit + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit ; find path to main settings file (ircc.ini) - mov edi, path ; Calculate the length of zero-terminated string - xor al, al - mov ecx, 1024 - repne scasb - dec edi - mov eax, '.ini' - stosd - xor al, al - stosb + mov edi, path ; Calculate the length of zero-terminated string + xor al, al + mov ecx, 1024 + repne scasb + dec edi + mov eax, '.ini' + stosd + xor al, al + stosb ; Fill the window buffer with zeros - mov edi, windows - mov ecx, (sizeof.window*MAX_WINDOWS+3)/4 - xor eax, eax - rep stosd + mov edi, windows + mov ecx, (sizeof.window*MAX_WINDOWS+3)/4 + xor eax, eax + rep stosd ; clear command area too - mov edi, servercommand - mov ecx, 600/4 - rep stosd + mov edi, servercommand + mov ecx, 600/4 + rep stosd ; allocate window data block - mov ebx, windows - call window_create_textbox - test eax, eax - jz error - mov [ebx + window.type], WINDOWTYPE_SERVER + mov ebx, windows + call window_create_textbox + test eax, eax + jz error + mov [ebx + window.type], WINDOWTYPE_SERVER ; get system colors - mcall 48, 3, colors, 40 + mcall 48, 3, colors, 40 ; set edit box and scrollbar colors - mov eax, [colors.work] - mov [scroll1.bg_color], eax - mov [scroll2.bg_color], eax + mov eax, [colors.work] + mov [scroll1.bg_color], eax + mov [scroll2.bg_color], eax - mov eax, [colors.work_button] - mov [scroll1.front_color], eax - mov [scroll2.front_color], eax + mov eax, [colors.work_button] + mov [scroll1.front_color], eax + mov [scroll2.front_color], eax - mov eax, [colors.work_text] - mov [scroll1.line_color], eax - mov [scroll2.line_color], eax + mov eax, [colors.work_text] + mov [scroll1.line_color], eax + mov [scroll2.line_color], eax - mov [scroll1.type], 1 ; 0 = simple, 1 = skinned - mov [scroll2.type], 1 + mov [scroll1.type], 1 ; 0 = simple, 1 = skinned + mov [scroll2.type], 1 ; get settings from ini - invoke ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick - invoke ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real - invoke ini.get_str, path, str_user, str_quitmsg, quit_msg, 250, default_quit + invoke ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick + invoke ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real + invoke ini.get_str, path, str_user, str_quitmsg, quit_msg, 250, default_quit ; Welcome user - mov esi, str_welcome - call print_asciiz + mov esi, str_welcome + call print_asciiz ; Check if parameter contains an URL - cmp byte[param], 0 - je @f - mov esi, param - mov ecx, 1024 - call cmd_usr_server.now + cmp byte[param], 0 + je @f + mov esi, param + mov ecx, 1024 + call cmd_usr_server.now @@: ; Draw window a first time, so we can figure out skin size - call draw_window + call draw_window redraw: - call draw_window + call draw_window mainloop: - mcall 10 ; wait for event + mcall 10 ; wait for event - dec eax - jz redraw + dec eax + jz redraw - dec eax - jz main_window_key + dec eax + jz main_window_key - dec eax - jz button + dec eax + jz button - cmp al, 3 - je mouse + cmp al, 3 + je mouse - call process_network_event + call process_network_event - mov edi, [window_active] - test [edi + window.flags], FLAG_UPDATED - jz .no_update - call draw_channel_text - mov edi, [window_active] - cmp [edi + window.type], WINDOWTYPE_CHANNEL - jne .no_update - call draw_channel_list + mov edi, [window_active] + test [edi + window.flags], FLAG_UPDATED + jz .no_update + call draw_channel_text + mov edi, [window_active] + cmp [edi + window.type], WINDOWTYPE_CHANNEL + jne .no_update + call draw_channel_list .no_update: - call highlight_updated_tabs + call highlight_updated_tabs - jmp mainloop + jmp mainloop button: - mcall 17 ; get id - ror eax, 8 + mcall 17 ; get id + ror eax, 8 - cmp ax, 1 ; close program - je exit + cmp ax, 1 ; close program + je exit - cmp ax, WINDOW_BTN_CLOSE - jne @f - call cmd_usr_close_window - jmp mainloop + cmp ax, WINDOW_BTN_CLOSE + jne @f + call cmd_usr_close_window + jmp mainloop @@: - cmp ax, WINDOW_BTN_LIST - jne @f + cmp ax, WINDOW_BTN_LIST + jne @f - push eax + push eax - mcall 37, 1 ; Get mouse position - sub ax, TEXT_Y - mov bl, FONT_HEIGHT - div bl - and eax, 0x000000ff - inc eax - add eax, [scroll1.position] - mov ebx, [window_active] - mov [ebx + window.selected], eax + mcall 37, 1 ; Get mouse position + sub ax, TEXT_Y + mov bl, FONT_HEIGHT + div bl + and eax, 0x000000ff + inc eax + add eax, [scroll1.position] + mov ebx, [window_active] + mov [ebx + window.selected], eax - call draw_channel_list + call draw_channel_list - pop eax - test eax, 1 shl 25 ; Right mouse button pressed? - jz mainloop + pop eax + test eax, 1 shl 25 ; Right mouse button pressed? + jz mainloop ; TODO: check if selected nick is my nick! ; Right mouse BTN was pressed, open chat window - mov ebx, [window_active] - mov eax, [ebx + window.selected] - dec eax - imul eax, MAX_NICK_LEN - mov ebx, [ebx + window.data_ptr] - lea esi, [ebx + window_data.names + eax] - call window_open - test ebx, ebx - jz mainloop - mov [window_active], ebx - call redraw + mov ebx, [window_active] + mov eax, [ebx + window.selected] + dec eax + imul eax, MAX_NICK_LEN + mov ebx, [ebx + window.data_ptr] + lea esi, [ebx + window_data.names + eax] + call window_open + test ebx, ebx + jz mainloop + mov [window_active], ebx + call redraw - jmp mainloop + jmp mainloop @@: - sub ax, WINDOW_BTN_START - jb exit + sub ax, WINDOW_BTN_START + jb exit - cmp ax, MAX_WINDOWS - ja exit + cmp ax, MAX_WINDOWS + ja exit ; Save users scrollbar position - push [scroll1.position] - mov edx, [window_active] - pop [edx + window.users_scroll] + push [scroll1.position] + mov edx, [window_active] + pop [edx + window.users_scroll] ; OK, time to switch to another window. - mov dx, sizeof.window - mul dx - shl edx, 16 - mov dx, ax - add edx, windows - cmp [edx + window.type], WINDOWTYPE_NONE - je exit - mov [window_active], edx + mov dx, sizeof.window + mul dx + shl edx, 16 + mov dx, ax + add edx, windows + cmp [edx + window.type], WINDOWTYPE_NONE + je exit + mov [window_active], edx - push [edx + window.text_line_print] - pop [scroll2.position] + push [edx + window.text_line_print] + pop [scroll2.position] - push [edx + window.users_scroll] - pop [scroll1.position] + push [edx + window.users_scroll] + pop [scroll1.position] - call draw_window - jmp mainloop + call draw_window + jmp mainloop exit: - cmp [socketnum], 0 - je @f - mov esi, quit_msg - call quit_server + cmp [socketnum], 0 + je @f + mov esi, quit_msg + call quit_server @@: error: - mcall -1 + mcall -1 main_window_key: - mcall 2 + mcall 2 - push dword edit1 - call [edit_box_key] + push dword edit1 + call [edit_box_key] ; cmp ah, 178 ; jne .no_up @@ -363,244 +364,250 @@ main_window_key: ; jmp mainloop ; ; .no_down: - cmp ah, 13 ; enter - jne no_send2 + cmp ah, 13 ; enter + jne no_send2 - call user_parser + call user_parser - mov eax, [edit1.size] + mov eax, [edit1.size] - mov [edit1.size], 0 - mov [edit1.pos], 0 + mov [edit1.size], 0 + mov [edit1.pos], 0 - push dword edit1 - call [edit_box_draw] + push dword edit1 + call [edit_box_draw] - call draw_channel_text + call draw_channel_text - jmp mainloop + jmp mainloop no_send2: - jmp mainloop + jmp mainloop mouse: - push dword edit1 - call [edit_box_mouse] + push dword edit1 + call [edit_box_mouse] ; mcall 37, 7 ; movsx eax, ax ; add [scroll2.position], eax ; TODO: check if scrollbar is active? - mov edi, [window_active] - cmp [edi + window.type], WINDOWTYPE_CHANNEL - jne @f - push [scroll1.position] - push dword scroll1 - call [scrollbar_mouse] - pop eax - cmp eax, [scroll1.position] ; did the scrollbar move? - je @f - call draw_channel_list + mov edi, [window_active] + cmp [edi + window.type], WINDOWTYPE_CHANNEL + jne @f + push [scroll1.position] + push dword scroll1 + call [scrollbar_mouse] + pop eax + cmp eax, [scroll1.position] ; did the scrollbar move? + je @f + call draw_channel_list @@: ; TODO: check if scrollbar is active? - mov edi, [window_active] - mov eax, [edi + window.text_lines] - cmp eax, [textbox_height] - jbe @f - push dword scroll2 - call [scrollbar_mouse] - mov edi, [window_active] - mov edx, [scroll2.position] - sub edx, [edi + window.text_line_print] - je @f - call draw_channel_text.scroll_to_pos + mov edi, [window_active] + mov eax, [edi + window.text_lines] + cmp eax, [textbox_height] + jbe @f + push dword scroll2 + call [scrollbar_mouse] + mov edi, [window_active] + and [edi+window.flags], not FLAG_SCROLL_LOW + mov edx, [scroll2.position] + add edx, [scroll2.cur_area] + sub edx, [scroll2.max_area] + jne @f + or [edi+window.flags], FLAG_SCROLL_LOW + @@: mov edx, [scroll2.position] + sub edx, [edi + window.text_line_print] + je @f + call draw_channel_text.scroll_to_pos @@: - jmp mainloop + jmp mainloop ; DATA AREA encoding_text: -db 'CP866 ' -db 'CP1251' -db 'UTF-8 ' +db 'CP866 ' +db 'CP1251' +db 'UTF-8 ' encoding_text_len = 6 -join_header db 3, '3* ', 0 -quit_header db 3, '5* ', 0 -nick_header db 3, '2* ', 0 -kick_header db 3, '5* ', 0 -mode_header db 3, '2* ', 0 -part_header db 3, '5* ', 0 -topic_header db 3, '3* ', 0 -action_header db 3, '6* ', 0 -ctcp_header db 3, '13-> [', 0 -msg_header db 3, '7-> *', 0 -ctcp_version db '] VERSION', 10, 0 -ctcp_ping db '] PING', 10, 0 -ctcp_time db '] TIME', 10, 0 +join_header db 3, '3* ', 0 +quit_header db 3, '5* ', 0 +nick_header db 3, '2* ', 0 +kick_header db 3, '5* ', 0 +mode_header db 3, '2* ', 0 +part_header db 3, '5* ', 0 +topic_header db 3, '3* ', 0 +action_header db 3, '6* ', 0 +ctcp_header db 3, '13-> [', 0 +msg_header db 3, '7-> *', 0 +ctcp_version db '] VERSION', 10, 0 +ctcp_ping db '] PING', 10, 0 +ctcp_time db '] TIME', 10, 0 -has_left_channel db ' has left ', 0 -joins_channel db ' has joined ', 0 -is_now_known_as db ' is now known as ', 0 -has_quit_irc db ' has quit IRC', 10, 0 +has_left_channel db ' has left ', 0 +joins_channel db ' has joined ', 0 +is_now_known_as db ' is now known as ', 0 +has_quit_irc db ' has quit IRC', 10, 0 -sets_mode db ' sets mode ', 0 -str_kicked db ' is kicked from ', 0 -str_by db ' by ', 0 -str_nickchange db 'Nickname is now ', 0 -str_realchange db 'Real name is now ', 0 -str_talking db 'Now talking in ', 0 -str_topic db 'Topic is "', 0 -str_topic_end db '"', 10, 0 -str_setby db 'Set by ', 0 +sets_mode db ' sets mode ', 0 +str_kicked db ' is kicked from ', 0 +str_by db ' by ', 0 +str_nickchange db 'Nickname is now ', 0 +str_realchange db 'Real name is now ', 0 +str_talking db 'Now talking in ', 0 +str_topic db 'Topic is "', 0 +str_topic_end db '"', 10, 0 +str_setby db 'Set by ', 0 -str_connecting db 3, '3* Connecting to ', 0 -str_sockerr db 3, '5* Socket error', 10, 0 -str_dnserr db 3, '5* Unable to resolve hostname', 10, 0 -str_refused db 3, '5* Connection refused', 10, 0 -str_srv_disconnected db 3, '5* Server disconnected', 10, 0 -str_disconnected db 3, '5* Disconnected', 10, 0 -str_reconnect db 3, '5* Connection reset by user', 10, 0 -str_notconnected db 3, '5* Not connected to server', 10, 0 -str_notchannel db 3, '5* You are not on a channel', 10, 0 +str_connecting db 3, '3* Connecting to ', 0 +str_sockerr db 3, '5* Socket error', 10, 0 +str_dnserr db 3, '5* Unable to resolve hostname', 10, 0 +str_refused db 3, '5* Connection refused', 10, 0 +str_srv_disconnected db 3, '5* Server disconnected', 10, 0 +str_disconnected db 3, '5* Disconnected', 10, 0 +str_reconnect db 3, '5* Connection reset by user', 10, 0 +str_notconnected db 3, '5* Not connected to server', 10, 0 +str_notchannel db 3, '5* You are not on a channel', 10, 0 -str_1 db 3, '13 -', 0 -str_2 db '- ', 0 +str_1 db 3, '13 -', 0 +str_2 db '- ', 0 -str_list db 'list', 0 +str_list db 'list', 0 -str_help db 'The following commands are available:', 10 - db 10 - db '/nick : change nickname', 10 - db '/real : change real name', 10 - db '/server
: connect to server', 10 - db '/code : change codepage (cp866, cp1251, or utf8)', 10 - db '/join : join a channel', 10 - db '/part : part from a channel', 10 - db '/quit : quit server', 10 - db '/msg : send a private message', 10 - db '/ctcp : send a message using client to client protocol', 10 - db 10 - db 'Other commands are send straight to server.', 10 - db 10, 0 +str_help db 'The following commands are available:', 10 + db 10 + db '/nick : change nickname', 10 + db '/real : change real name', 10 + db '/server
: connect to server', 10 + db '/code : change codepage (cp866, cp1251, or utf8)', 10 + db '/join : join a channel', 10 + db '/part : part from a channel', 10 + db '/quit : quit server', 10 + db '/msg : send a private message', 10 + db '/ctcp : send a message using client to client protocol', 10 + db 10 + db 'Other commands are send straight to server.', 10 + db 10, 0 -str_welcome db 3, '3 ___', 3, '7__________', 3, '6_________ ', 3, '4 __ __ __', 10 - db 3, '3| \', 3, '7______ \', 3, '6_ ___ \ ', 3, '4 ____ | | |__| ____ _____/ |_', 10 - db 3, '3| |', 3, '7| _/', 3, '6 \ \/ ', 3, '4 _/ ___\| | | |/ __ \ / \ __\', 10 - db 3, '3| |', 3, '7| | \', 3, '6 \____', 3, '4 \ \___| |_| \ ___/| | \ |', 10 - db 3, '3|___|', 3, '7|____|_ /', 3, '6\______ /', 3, '4 \___ >____/__|\___ >___| /__|', 10 - db 3, '3 ', 3, '7 \/ ', 3, '6 \/ ', 3, '4 \/ \/ \/', 10 - db 10 - db 'Welcome to the KolibriOS IRC client v', version, 10 - db 10 - db 'Type /help for help', 10, 10, 0 +str_welcome db 3, '3 ___', 3, '7__________', 3, '6_________ ', 3, '4 __ __ __', 10 + db 3, '3| \', 3, '7______ \', 3, '6_ ___ \ ', 3, '4 ____ | | |__| ____ _____/ |_', 10 + db 3, '3| |', 3, '7| _/', 3, '6 \ \/ ', 3, '4 _/ ___\| | | |/ __ \ / \ __\', 10 + db 3, '3| |', 3, '7| | \', 3, '6 \____', 3, '4 \ \___| |_| \ ___/| | \ |', 10 + db 3, '3|___|', 3, '7|____|_ /', 3, '6\______ /', 3, '4 \___ >____/__|\___ >___| /__|', 10 + db 3, '3 ', 3, '7 \/ ', 3, '6 \/ ', 3, '4 \/ \/ \/', 10 + db 10 + db 'Welcome to the KolibriOS IRC client v', version, 10 + db 10 + db 'Type /help for help', 10, 10, 0 -str_version db 'VERSION ' -str_programname db 'KolibriOS IRC client v', version, 0 +str_version db 'VERSION ' +str_programname db 'KolibriOS IRC client v', version, 0 -str_user db 'user', 0 -str_nick db 'nick', 0 -str_real db 'realname', 0 -str_email db 'email', 0 -str_quitmsg db 'quitmsg', 0 +str_user db 'user', 0 +str_nick db 'nick', 0 +str_real db 'realname', 0 +str_email db 'email', 0 +str_quitmsg db 'quitmsg', 0 -default_nick db 'kolibri_user', 0 -default_real db 'Kolibri User', 0 -default_quit db 'KolibriOS forever', 0 +default_nick db 'kolibri_user', 0 +default_real db 'Kolibri User', 0 +default_quit db 'KolibriOS forever', 0 -irc_colors dd 0xffffff ; 0 white - dd 0x000000 ; 1 black - dd 0x00007f ; 2 blue (navy) - dd 0x009300 ; 3 green - dd 0xff0000 ; 4 red - dd 0x7f0000 ; 5 brown (maroon) - dd 0x9c009c ; 6 purple - dd 0xfc7f00 ; 7 olive - dd 0xffff00 ; 8 yellow - dd 0x00fc00 ; 9 light green - dd 0x009393 ; 10 teal - dd 0x00ffff ; 11 cyan - dd 0x0000fc ; 12 royal blue - dd 0xff00ff ; 13 pink - dd 0x7f7f7f ; 14 grey - dd 0xd4d0c4 ; 15 light grey (silver) +irc_colors dd 0xffffff ; 0 white + dd 0x000000 ; 1 black + dd 0x00007f ; 2 blue (navy) + dd 0x009300 ; 3 green + dd 0xff0000 ; 4 red + dd 0x7f0000 ; 5 brown (maroon) + dd 0x9c009c ; 6 purple + dd 0xfc7f00 ; 7 olive + dd 0xffff00 ; 8 yellow + dd 0x00fc00 ; 9 light green + dd 0x009393 ; 10 teal + dd 0x00ffff ; 11 cyan + dd 0x0000fc ; 12 royal blue + dd 0xff00ff ; 13 pink + dd 0x7f7f7f ; 14 grey + dd 0xd4d0c4 ; 15 light grey (silver) sockaddr1: - dw AF_INET4 -.port dw 0x0b1a ; 6667 FIXMEEEEEE -.ip dd 0 - rb 10 + dw AF_INET4 +.port dw 0x0b1a ; 6667 FIXMEEEEEE +.ip dd 0 + rb 10 -status dd STATUS_DISCONNECTED +status dd STATUS_DISCONNECTED -window_active dd windows -window_print dd windows +window_active dd windows +window_print dd windows align 4 @IMPORT: -library network, 'network.obj',\ - libini, 'libini.obj',\ - boxlib, 'box_lib.obj' +library network, 'network.obj',\ + libini, 'libini.obj',\ + boxlib, 'box_lib.obj' -import network,\ - getaddrinfo, 'getaddrinfo',\ - freeaddrinfo, 'freeaddrinfo',\ - inet_ntoa, 'inet_ntoa' +import network,\ + getaddrinfo, 'getaddrinfo',\ + freeaddrinfo, 'freeaddrinfo',\ + inet_ntoa, 'inet_ntoa' -import libini,\ - ini.get_str, 'ini_get_str',\ - ini.get_int, 'ini_get_int' +import libini,\ + ini.get_str, 'ini_get_str',\ + ini.get_int, 'ini_get_int' -import boxlib,\ - edit_box_draw, 'edit_box',\ - edit_box_key, 'edit_box_key',\ - edit_box_mouse, 'edit_box_mouse',\ - scrollbar_draw, 'scrollbar_v_draw',\ - scrollbar_mouse,'scrollbar_v_mouse' +import boxlib,\ + edit_box_draw, 'edit_box',\ + edit_box_key, 'edit_box_key',\ + edit_box_mouse, 'edit_box_mouse',\ + scrollbar_draw, 'scrollbar_v_draw',\ + scrollbar_mouse,'scrollbar_v_mouse' - ; width, left, top -edit1 edit_box 0, 0, 0, 0xffffff, 0x6f9480, 0, 0, 0, USERCMD_MAX_SIZE, usercommand, mouse_dd, ed_always_focus, 25, 25 - ; xsize, xpos, ysize, ypos, btn_height, max, cur, pos, bgcol, frcol, linecol + ; width, left, top +edit1 edit_box 0, 0, 0, 0xffffff, 0x6f9480, 0, 0, 0, USERCMD_MAX_SIZE, usercommand, mouse_dd, ed_always_focus, 25, 25 + ; xsize, xpos, ysize, ypos, btn_height, max, cur, pos, bgcol, frcol, linecol scroll1 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 scroll2 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 -usercommand db '/server chat.freenode.net', 0 - rb MAX_COMMAND_LEN +usercommand db '/server chat.freenode.net', 0 + rb MAX_COMMAND_LEN I_END: -utf8_bytes_rest dd ? ; bytes rest in current UTF8 sequence -utf8_char dd ? ; first bits of current UTF8 character +utf8_bytes_rest dd ? ; bytes rest in current UTF8 sequence +utf8_char dd ? ; first bits of current UTF8 character -packetbuf rb 1024 ; buffer for packets to server -path rb 1024 -param rb 1024 +packetbuf rb 1024 ; buffer for packets to server +path rb 1024 +param rb 1024 -servercommand rb 600 +servercommand rb 600 -thread_info process_information -xsize dd ? -ysize dd ? -mouse_dd dd ? +thread_info process_information +xsize dd ? +ysize dd ? +mouse_dd dd ? -textbox_height dd ? ; in characters -textbox_width dd ? ; in characters, not pixels ;) +textbox_height dd ? ; in characters +textbox_width dd ? ; in characters, not pixels ;) -colors system_colors +colors system_colors -irc_server_name rb MAX_SERVER_NAME ; TODO: move this server URL into window struct -socketnum dd ? ; TODO: same for socket +irc_server_name rb MAX_SERVER_NAME ; TODO: move this server URL into window struct +socketnum dd ? ; TODO: same for socket -user_nick rb MAX_NICK_LEN -user_real_name rb MAX_REAL_LEN -quit_msg rb 250 +user_nick rb MAX_NICK_LEN +user_real_name rb MAX_REAL_LEN +quit_msg rb 250 -windows rb MAX_WINDOWS*sizeof.window +windows rb MAX_WINDOWS*sizeof.window IM_END: \ No newline at end of file diff --git a/programs/network/ircc/textbox.inc b/programs/network/ircc/textbox.inc index 79fcc898e1..3c1f7e372c 100644 --- a/programs/network/ircc/textbox.inc +++ b/programs/network/ircc/textbox.inc @@ -11,46 +11,46 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -text_insert_newlines: ; esi = ASCIIZ string +text_insert_newlines: ; esi = ASCIIZ string - xor edx, edx ; number of lines of text - cmp byte[esi], 0 - je .done + xor edx, edx ; number of lines of text + cmp byte[esi], 0 + je .done .next_line: - xor ebx, ebx - mov ecx, [textbox_width] - inc ecx + xor ebx, ebx + mov ecx, [textbox_width] + inc ecx .more: - dec ecx - jz .end_of_line - lodsb ; get one character of the string - test al, al ; end of string? - jz .almost_done - cmp al, ' ' ; it's a space! remember its position - je .space - cmp al, 13 ; we already inserted a newline once, make it a space again - je .soft_nl - cmp al, 10 ; it's a newline, continue onto the next line - jne .more - inc edx - jmp .next_line + dec ecx + jz .end_of_line + lodsb ; get one character of the string + test al, al ; end of string? + jz .almost_done + cmp al, ' ' ; it's a space! remember its position + je .space + cmp al, 13 ; we already inserted a newline once, make it a space again + je .soft_nl + cmp al, 10 ; it's a newline, continue onto the next line + jne .more + inc edx + jmp .next_line .soft_nl: - mov byte[esi-1], ' ' + mov byte[esi-1], ' ' .space: - mov ebx, esi ; last detected space - jmp .more + mov ebx, esi ; last detected space + jmp .more .end_of_line: - inc edx - test ebx, ebx ; did we detect any spaces on this line? - jz .next_line ; no: just continue onto the next line - mov byte[ebx-1], 13 ; yes: replace last space on line with a soft newline - mov esi, ebx ; and continue parsing just after last space - jmp .next_line ; + inc edx + test ebx, ebx ; did we detect any spaces on this line? + jz .next_line ; no: just continue onto the next line + mov byte[ebx-1], 13 ; yes: replace last space on line with a soft newline + mov esi, ebx ; and continue parsing just after last space + jmp .next_line ; .almost_done: - dec esi + dec esi .done: - ret + ret ;---------------------------------- ; scan untill next line is reached @@ -61,20 +61,20 @@ text_insert_newlines: ; esi = ASCIIZ string ;---------------------------------- text_nextline: - mov ecx, [textbox_width] + mov ecx, [textbox_width] .loop: - lodsb - test al, al - jz .done - cmp al, 10 - je .done - cmp al, 13 - je .done - dec ecx - jnz .loop + lodsb + test al, al + jz .done + cmp al, 10 + je .done + cmp al, 13 + je .done + dec ecx + jnz .loop .done: - ret + ret ;---------------------------------- @@ -86,21 +86,21 @@ text_nextline: ;---------------------------------- print_string: - push eax + push eax .loop: - lodsb - cmp al, bl - je .done - cmp al, 13 - je .loop - test al, al - jz .done - call print_char - jmp .loop + lodsb + cmp al, bl + je .done + cmp al, 13 + je .loop + test al, al + jz .done + call print_char + jmp .loop .done: - pop eax + pop eax - ret + ret ;---------------------------------- @@ -111,17 +111,17 @@ print_string: ;---------------------------------- print_asciiz: - push eax + push eax .loop: - lodsb - test al, al - jz .done - call print_char - jmp .loop + lodsb + test al, al + jz .done + call print_char + jmp .loop .done: - pop eax + pop eax - ret + ret ;---------------------------------- @@ -132,250 +132,251 @@ print_asciiz: ;---------------------------------- print_char: - push esi edi - mov esi, [window_print] - mov edi, [esi + window.text_write] - stosb - cmp edi, [esi + window.text_end] - jae .uh_ow - mov [esi + window.text_write], edi + push esi edi + mov esi, [window_print] + mov edi, [esi + window.text_write] + stosb + cmp edi, [esi + window.text_end] + jae .uh_ow + mov [esi + window.text_write], edi .continue: - or [esi + window.flags], FLAG_UPDATED - pop edi esi + or [esi + window.flags], FLAG_UPDATED + pop edi esi - ret + ret .uh_ow: - pusha - mov edi, [esi + window.text_start] - mov [esi + window.text_print], edi - lea esi, [edi + TEXT_BUFFERSIZE/2] - call text_nextline - mov ecx, TEXT_BUFFERSIZE/8 - rep movsd - mov esi, edi - call text_insert_newlines + pusha + mov edi, [esi + window.text_start] + mov [esi + window.text_print], edi + lea esi, [edi + TEXT_BUFFERSIZE/2] + call text_nextline + mov ecx, TEXT_BUFFERSIZE/8 + rep movsd + mov esi, edi + call text_insert_newlines - mov ebx, [window_print] - mov [ebx + window.text_lines], edx - mov [ebx + window.text_scanned], esi - mov [ebx + window.text_write], esi - mov [ebx + window.text_line_print], 0 - popa + mov ebx, [window_print] + mov [ebx + window.text_lines], edx + mov [ebx + window.text_scanned], esi + mov [ebx + window.text_write], esi + mov [ebx + window.text_line_print], 0 + popa - jmp .continue + jmp .continue draw_channel_text: - mov edi, [window_active] - and [edi + window.flags], not FLAG_UPDATED ; clear the 'window is updated' flag + mov edi, [window_active] + and [edi + window.flags], not FLAG_UPDATED ; clear the 'window is updated' flag ; Scan new text for newlines - mov esi, [edi + window.text_scanned] - call text_insert_newlines - add [edi + window.text_lines], edx - mov [edi + window.text_scanned], esi + mov esi, [edi + window.text_scanned] + call text_insert_newlines + add [edi + window.text_lines], edx + mov [edi + window.text_scanned], esi ; Is scrollbar at lowest position? - mov edx, [scroll2.position] - test edx, edx - jz .yesscroll - add edx, [scroll2.cur_area] - sub edx, [scroll2.max_area] - jne .noscroll + test [edi + window.flags], FLAG_SCROLL_LOW + jnz .yesscroll ;Yes + cmp [scroll2.all_redraw], 1 ;No + jnz .noscroll + mov edx, [textbox_height] + sub edx, [edi + window.text_line_print] + jg .noscroll .yesscroll: ; Scrollbar was at lowest position, scroll down automatically when new text arrived. - mov edx, [edi + window.text_lines] - sub edx, [textbox_height] - jle .noscroll ; There are less lines of text than fit into the window, dont scroll.. - sub edx, [edi + window.text_line_print] - je .noscroll ; We are already at the bottom pos, dont scroll.. - .scroll_to_pos: ; edx = number of lines to go up/down (flags must indicate direction) - pushf - add [edi + window.text_line_print], edx - mov esi, [edi + window.text_print] - popf - ja .loop_forward - std ; set direction flag so we can scan backwards - dec esi - dec esi ; move our cursor just in front of newline, for scanning backwards + mov edx, [edi + window.text_lines] + sub edx, [textbox_height] + jle .noscroll ; There are less lines of text than fit into the window, dont scroll.. + sub edx, [edi + window.text_line_print] + je .noscroll ; We are already at the bottom pos, dont scroll.. + .scroll_to_pos: ; edx = number of lines to go up/down (flags must indicate direction) + pushf + add [edi + window.text_line_print], edx + mov esi, [edi + window.text_print] + popf + ja .loop_forward + std ; set direction flag so we can scan backwards + dec esi + dec esi ; move our cursor just in front of newline, for scanning backwards .loop_backward: - call text_nextline - inc edx - jnz .loop_backward - inc esi - inc esi ; move the cursor just after last newline - cld - jmp .ok + call text_nextline + inc edx + jnz .loop_backward + inc esi + inc esi ; move the cursor just after last newline + cld + jmp .ok .loop_forward: - call text_nextline - dec edx - jnz .loop_forward + call text_nextline + dec edx + jnz .loop_forward .ok: - mov [edi + window.text_print], esi + mov [edi + window.text_print], esi .noscroll: ; Update and draw scrollbar when nescessary - mov edx, [edi + window.text_lines] - cmp edx, [textbox_height] - jbe .scroll_done + mov edx, [edi + window.text_lines] + cmp edx, [textbox_height] + jbe .scroll_done - mov [scroll2.max_area], edx - mov eax, [edi + window.text_line_print] - mov [scroll2.position], eax + mov [scroll2.max_area], edx + mov eax, [edi + window.text_line_print] + mov [scroll2.position], eax - push dword scroll2 ; redraw scrollbar - call [scrollbar_draw] - mov [scroll2.all_redraw], 0 ; next time, dont redraw it completely + push dword scroll2 ; redraw scrollbar + call [scrollbar_draw] + mov [scroll2.all_redraw], 0 ; next time, dont redraw it completely .scroll_done: ; Calculate start offset coordinates (align text to bottom) - mov ebx, [textbox_height] - sub ebx, [edi + window.text_lines] - jb .no_offset - imul ebx, FONT_HEIGHT - push [edi + window.text_start] - pop [edi + window.text_print] - jmp .draw_text + mov ebx, [textbox_height] + sub ebx, [edi + window.text_lines] + jb .no_offset + imul ebx, FONT_HEIGHT + push [edi + window.text_start] + pop [edi + window.text_print] + jmp .draw_text .no_offset: - xor ebx, ebx + xor ebx, ebx .draw_text: ; Prepare to actually draw some text - mov eax, [textbox_height] ; max number of lines to draw - add ebx, TEXT_X shl 16 + TEXT_Y - mov ecx, [colors.work_text] ; default text color - mov edx, [edi + window.text_print] + mov eax, [textbox_height] ; max number of lines to draw + add ebx, TEXT_X shl 16 + TEXT_Y + mov ecx, [colors.work_text] ; default text color + mov edx, [edi + window.text_print] .drawloop: - cmp byte[edx], 0 - je .end_of_text + cmp byte[edx], 0 + je .end_of_text ; Clear one row of characters - pusha - mov cx, bx - shl ecx, 16 - mov cx, FONT_HEIGHT - mov ebx, TEXT_X shl 16 - mov bx, word[textbox_width] - imul bx, FONT_WIDTH - mov edx, [colors.work] - mcall 13 ; draw rectangle - popa + pusha + mov cx, bx + shl ecx, 16 + mov cx, FONT_HEIGHT + mov ebx, TEXT_X shl 16 + mov bx, word[textbox_width] + imul bx, FONT_WIDTH + mov edx, [colors.work] + mcall 13 ; draw rectangle + popa - mov esi, edx - add esi, [textbox_width] + mov esi, edx + add esi, [textbox_width] .line: - cmp byte[edx], 0 - je .end_of_text + cmp byte[edx], 0 + je .end_of_text - cmp byte[edx], 13 - je .newline_soft + cmp byte[edx], 13 + je .newline_soft - cmp byte[edx], 10 - je .newline_hard + cmp byte[edx], 10 + je .newline_hard - push esi eax - cmp byte[edx], 3 ; escape code for mIRC colors - jne .no_colors - inc edx - call dec_to_esi - jz .no_colors - mov ecx, [irc_colors + 4*esi] + push esi eax + cmp byte[edx], 3 ; escape code for mIRC colors + jne .no_colors + inc edx + call dec_to_esi + jz .no_colors + mov ecx, [irc_colors + 4*esi] - cmp byte[edx], ',' ; background color? - jne .no_colors - inc edx - call dec_to_esi - jz .no_colors - mov edi, [irc_colors + 4*esi] - or ecx, 0x40000000 + cmp byte[edx], ',' ; background color? + jne .no_colors + inc edx + call dec_to_esi + jz .no_colors + mov edi, [irc_colors + 4*esi] + or ecx, 0x40000000 .no_colors: - mov esi, 1 - mcall 4 ; draw text - add ebx, FONT_WIDTH shl 16 - inc edx - pop eax esi - cmp edx, esi - jb .line - jmp .line_full + mov esi, 1 + mcall 4 ; draw text + add ebx, FONT_WIDTH shl 16 + inc edx + pop eax esi + cmp edx, esi + jb .line + jmp .line_full .newline_hard: - mov ecx, [colors.work_text] + mov ecx, [colors.work_text] .newline_soft: - inc edx + inc edx .line_full: - and ebx, 0x0000ffff - add ebx, TEXT_X shl 16 + FONT_HEIGHT - dec eax - jnz .drawloop + and ebx, 0x0000ffff + add ebx, TEXT_X shl 16 + FONT_HEIGHT + dec eax + jnz .drawloop .end_of_text: - ret + ret dec_to_esi: - xor esi, esi + xor esi, esi .loop: - movzx eax, byte[edx] - sub al, '0' - jb .done - cmp al, 9 - ja .done - inc edx - lea esi, [esi*4 + esi] ; esi * 5 - lea esi, [esi*2 + eax] ; esi * 2 + eax - jmp .loop + movzx eax, byte[edx] + sub al, '0' + jb .done + cmp al, 9 + ja .done + inc edx + lea esi, [esi*4 + esi] ; esi * 5 + lea esi, [esi*2 + eax] ; esi * 2 + eax + jmp .loop .done: - cmp esi, 16 - jae .fail - ret + cmp esi, 16 + jae .fail + ret .fail: - xor esi, esi - ret + xor esi, esi + ret if TIMESTAMP print_timestamp: - pusha - mcall 3 ; get system time - mov ebx, eax + pusha + mcall 3 ; get system time + mov ebx, eax - mov al, '[' - call print_char - mov ecx, TIMESTAMP + mov al, '[' + call print_char + mov ecx, TIMESTAMP .loop: - mov al, bl - shr al, 4 - add al, '0' - call print_char + mov al, bl + shr al, 4 + add al, '0' + call print_char - mov al, bl - and al, 0x0f - add al, '0' - call print_char + mov al, bl + and al, 0x0f + add al, '0' + call print_char - dec ecx - jz .done + dec ecx + jz .done - mov al, ':' - call print_char - shr ebx, 8 - jmp .loop + mov al, ':' + call print_char + shr ebx, 8 + jmp .loop .done: - mov al, ']' - call print_char - mov al, ' ' - call print_char + mov al, ']' + call print_char + mov al, ' ' + call print_char - popa - ret + popa + ret end if \ No newline at end of file diff --git a/programs/network/ircc/window.inc b/programs/network/ircc/window.inc index 9ac2940f84..30a988a2c4 100644 --- a/programs/network/ircc/window.inc +++ b/programs/network/ircc/window.inc @@ -19,36 +19,37 @@ window_create_textbox: - push ebx + push ebx ; allocate the window data block - mcall 68, 12, sizeof.window_data - test eax, eax - pop ebx - jz .fail + mcall 68, 12, sizeof.window_data + test eax, eax + pop ebx + jz .fail ; fill it with all zeros - push eax - mov edi, eax - mov ecx, (sizeof.window_data+3)/4 - xor eax, eax - rep stosd - pop eax + push eax + mov edi, eax + mov ecx, (sizeof.window_data+3)/4 + xor eax, eax + rep stosd + pop eax - mov [ebx + window.data_ptr], eax - mov [ebx + window.flags], 0 + mov [ebx + window.data_ptr], eax + mov [ebx + window.flags], 0 + or [ebx + window.flags], FLAG_SCROLL_LOW - add eax, window_data.text+2 ; let text begin at offset 2, this way the text will be prepended with two null bytes - mov [ebx + window.text_start], eax - mov [ebx + window.text_print], eax - mov [ebx + window.text_write], eax - mov [ebx + window.text_scanned], eax - mov [ebx + window.text_lines], 0 - mov [ebx + window.text_line_print], 0 - add eax, TEXT_BUFFERSIZE-1 - mov [ebx + window.text_end], eax + add eax, window_data.text+2 ; let text begin at offset 2, this way the text will be prepended with two null bytes + mov [ebx + window.text_start], eax + mov [ebx + window.text_print], eax + mov [ebx + window.text_write], eax + mov [ebx + window.text_scanned], eax + mov [ebx + window.text_lines], 0 + mov [ebx + window.text_line_print], 0 + add eax, TEXT_BUFFERSIZE-1 + mov [ebx + window.text_end], eax .fail: - ret + ret ; window_set_name @@ -62,58 +63,58 @@ window_create_textbox: window_set_name: - lea edi, [ebx + window.name] - mov ecx, MAX_WINDOWNAME_LEN + lea edi, [ebx + window.name] + mov ecx, MAX_WINDOWNAME_LEN .loop: - lodsb - cmp al, 0x21 ; name ends with 0, space or ! - jbe .addzero - stosb - dec ecx - jnz .loop + lodsb + cmp al, 0x21 ; name ends with 0, space or ! + jbe .addzero + stosb + dec ecx + jnz .loop .addzero: - xor al, al - stosb + xor al, al + stosb - push esi ebx - call draw_windowtabs - pop ebx esi + push esi ebx + call draw_windowtabs + pop ebx esi - ret + ret -window_close: ; closes the 'print' window +window_close: ; closes the 'print' window ; Remove the window (overwrite current structure with trailing ones) - mov edi, [window_print] - push [edi + window.data_ptr] ; remember data ptr so we can free it later - lea esi, [edi + sizeof.window] - mov ecx, windows + MAX_WINDOWS*sizeof.window - sub ecx, esi - rep movsb + mov edi, [window_print] + push [edi + window.data_ptr] ; remember data ptr so we can free it later + lea esi, [edi + sizeof.window] + mov ecx, windows + MAX_WINDOWS*sizeof.window + sub ecx, esi + rep movsb ; Completely zero the trailing window block (there will always be one!) - mov ecx, sizeof.window - xor al, al - rep stosb + mov ecx, sizeof.window + xor al, al + rep stosb ; free the window data block - pop ecx - mcall 68, 13 + pop ecx + mcall 68, 13 ; We closed this window so we need to show another - mov edi, [window_active] - cmp [edi + window.data_ptr], 0 - jne @f - sub edi, sizeof.window - mov [window_active], edi - mov [window_print], edi ;;;;;;;; + mov edi, [window_active] + cmp [edi + window.data_ptr], 0 + jne @f + sub edi, sizeof.window + mov [window_active], edi + mov [window_print], edi ;;;;;;;; @@: ; At last, redraw everything - call draw_window + call draw_window - ret + ret ; window_find: @@ -125,33 +126,33 @@ window_close: ; closes the 'print' window window_find: - mov ebx, windows - mov eax, MAX_WINDOWS + mov ebx, windows + mov eax, MAX_WINDOWS .scanloop: - push esi - cmp [ebx + window.type], WINDOWTYPE_NONE - je .try_next - lea edi, [ebx + window.name] - mov ecx, MAX_WINDOWNAME_LEN - repe cmpsb - cmp byte[edi-1], 0 ; last equall character was null? yes, the strings match! - je .got_it - cmp byte[edi], 0 ; we're at the end of string1.. ? - jne .try_next - cmp byte[esi], 0x21 ; and the end of string2? yes! - jbe .got_it + push esi + cmp [ebx + window.type], WINDOWTYPE_NONE + je .try_next + lea edi, [ebx + window.name] + mov ecx, MAX_WINDOWNAME_LEN + repe cmpsb + cmp byte[edi-1], 0 ; last equall character was null? yes, the strings match! + je .got_it + cmp byte[edi], 0 ; we're at the end of string1.. ? + jne .try_next + cmp byte[esi], 0x21 ; and the end of string2? yes! + jbe .got_it .try_next: - pop esi - add ebx, sizeof.window - dec eax - jnz .scanloop + pop esi + add ebx, sizeof.window + dec eax + jnz .scanloop - xor ebx, ebx - ret + xor ebx, ebx + ret .got_it: - add esp, 4 - ret + add esp, 4 + ret @@ -166,48 +167,48 @@ window_find: window_open: ; Skip heading spaces - lodsb - cmp al, ' ' - je window_open - cmp al, ':' - je window_open - dec esi + lodsb + cmp al, ' ' + je window_open + cmp al, ':' + je window_open + dec esi - call window_find - test ebx, ebx - jnz .got_it + call window_find + test ebx, ebx + jnz .got_it ; create channel window - search for empty slot .create_it: - mov ebx, windows - mov ecx, MAX_WINDOWS + mov ebx, windows + mov ecx, MAX_WINDOWS .scanloop2: - cmp [ebx + window.type], WINDOWTYPE_NONE - je .free_found - add ebx, sizeof.window - dec ecx - jnz .scanloop2 - jmp .error + cmp [ebx + window.type], WINDOWTYPE_NONE + je .free_found + add ebx, sizeof.window + dec ecx + jnz .scanloop2 + jmp .error .free_found: - call window_create_textbox - test eax, eax - jz .error - mov [ebx + window.type], WINDOWTYPE_CHAT ; FIXME: let caller handle this ? + call window_create_textbox + test eax, eax + jz .error + mov [ebx + window.type], WINDOWTYPE_CHAT ; FIXME: let caller handle this ? - call window_set_name + call window_set_name .got_it: - lodsb - cmp al, ' ' - je .got_it - cmp al, ':' - je .got_it - dec esi + lodsb + cmp al, ' ' + je .got_it + cmp al, ':' + je .got_it + dec esi - mov [window_print], ebx - ret + mov [window_print], ebx + ret .error: - xor ebx, ebx - ret \ No newline at end of file + xor ebx, ebx + ret \ No newline at end of file