Algorithms and Modelling
Structure Chart

Notation
- Keywords are capitalised.
- Subroutines in the code are underlined.
- Subroutines from an external source (i.e. the C++ standard library, FTXUI, or tomlplusplus) are italicised.
- Subroutine definitions are bold and underlined.
- Notation for indexing uses square brackets, and literal strings are denoted with quotation marks.
Pseudocode
BEGIN MAINPROGRAM
INITIALISATION
set handler to handler-constructor
set colour-theme to handler.config.theme
set screen to interactive-fullscreen-constructor
set UI elements to default states
END INITIALISATION
WHILE running
render-elements
CASEWHERE catch-event is
carriage return : send-message (message-content)
mousewheel up :
IF scroll-amount is not lowest THEN
decrease scroll-amount
ENDIF
mousewheel down :
IF scroll-amount is not highest THEN
increase scroll-amount
ENDIF
escape : quit program
ENDCASE
IF poll-for-messages returns true THEN
receive-messages
refresh-screen
ENDIF
ENDWHILE
END MAINPROGRAM
BEGIN SUBPROGRAM handler-constructor
INITIALISATION
set config to config-constructor
set user to config.users[default-user]
set server to config.server[default-server]
set server-ip to convert to useable type (server.ip-address)
set server-socket to socket-constructor (IPV4, TCP-socket, any, 6667, server-ip)
set socket-file-descriptor to server-socket.get-socket-fd
END INITIALISATION
set socket to non-blocking (socket-file-descriptor)
send-message (nick command)
send-message (user command)
END SUBPROGRAM handler-constructor
BEGIN SUBPROGRAM config-constructor
INITIALISATION
IF config file doesn't exist THEN
create config file with defaults
ENDIF
set config-location to get home directory/.config/ircat/config/toml
END INITIALISATION
set config to parse toml file
END SUBPROGRAM config-constructor
BEGIN SUBPROGRAM socket-constructor
(address-family, socket-type,
protocol, port, ip-address)
INITIALISATION
set member values to parameters
END INITIALISATION
IF set socket-file-descriptor to socket (family, socket-type, protocol) returns an error THEN
print error-message
ENDIF
IF socket-purpose is binding THEN
set socket option (reuse address, true)
bind socket
ELSE
connect socket
ENDIF
END SUBPROGRAM socket-constructor
BEGIN SUBPROGRAM send-message
(content)
set bytes-sent to 0
set total-sent to 0
set length to length of content
WHILE total-sent < length
send (content)
set bytes-sent to return value of send
set total-sent to total-sent + bytes-sent
ENDWHILE
END SUBPROGRAM send-message
BEGIN SUBPROGRAM poll-for-messages
set events-count to poll (socket-file-descriptor)
IF events-count > 0 THEN
append receive-messages to messages
return true
ENDIF
END SUBPROGRAM poll-for-messages
BEGIN SUBPROGRAM receive-messages
set buffer to array of 2048 characters
set bytes-received to 0
set messages to empty vector of strings
set parsed-messages to empty vector of irc-messages
recv (socket-file-descriptor, buffer)
set bytes-received to return value of recv
WHILE there are carriage returns in buffer
append a slice of the buffer from the start until the next carriage return to messages
remove that slice of the buffer including the carriage return
ENDWHILE
FOR message IN messages
append parse-message (message) to parsed-messsages
ENDFOR
return parsed-messages
END SUBPROGRAM receive-messages
BEGIN SUBPROGRAM parse-message
(message)
set trailing to empty string
set result to empty irc-message
IF message size < 1 THEN
return result
ENDIF
IF message[0] is a ":" THEN
set result.prefix to the slice of message between 1 and the first space
remove that slice from message
ENDIF
set result.command to the slice of message from the start until the first space
remove that slice from message
IF message contains " :" THEN
set trailing to the slice of message from after " :" until the end
remove that slice from message
ENDIF
WHILE there are spaces in message
append the slice of message from the start until the first space to result.params
remove that slice from message
ENDWHILE
IF there are still characters in message THEN
append message to result.params
ENDIF
append trailinig to result.params
return result
END SUBPROGRAM parse-message
BEGIN SUBPROGRAM render-elements
set message-box to horizontal box (individual-components)
set components to vertical box (message-box)
render (render-messages)
render (components)
END SUBPROGRAM render-elements
BEGIN SUBPROGRAM render-messages
set rendered to vector of elements
FOR message in messages
append vertical box (separator-bar, message.prefix, msg.params[last]) to rendered
ENDFOR
return rendered
END SUBPROGRAM render-messages