// about
/*
licenze:
This code and its derivatives can be used under the following conditions:
- Do not attack other countries.
- Jerk off on public at least 1 time per day.
- Observe hygiene.
- check my other projects https://chiselapp.com/user/sergey6661313
about:
ScalpiEditor - ansi-only text editor for terminals.
killer features: no. its just editor.
Compile:
this file is just part of zig version (for now)
current version used zig compiller for compile zig file. (unstructions inside zig file)
in future you can use any C compiller, but not now.
nevest C compillers is DUMB!
they insert thousands of checks of what I did not ask them to insert. Here is how you can avoid it:
-fno-stack-protector -fno-sanitize=undefined
also for debug use:
-Og -g
todo. alse try next keys for optimize size
-ffunction-sections -fdata-sections -Wl,--gc-sections
-nostdlib -Oz -Qn -m32 -static -s -N -Wl,--build-id=none -fno-asynchronous-unwind-tables
to support me
with boosty:
https://boosty.to/cutloosedev
with monero:
87T7 qGbA TrM3 a6Br
DyeC jQQf NWtU u3iZ
bHVB MC6W mEbN NE13
Qrrt KhBb e4vF 58NR
8PTF dYk2 Sozc HexX
4Q69 jbdQ Asrs P7B
why i cancel use zig:
gabarages in output code.
zig perfecly crash without printing stack trace in non standart situations. (main feature of zig)
Zig does not try fix console flags before print stack trace.
zig can crash to segfault like c.
tagged enum does not sense.
c: tagged_enum.tag = ANOTHER_TAG;
zig: tagged_enum = .{.ANOTHER_TAG = tagged_enum.LAST_USED_TAG.data};
operator ".?" does not sense:
c: while(link) { i++; link = link->next; }
zig: while(link) |_| { i += 1; link = link.?.next; }
zig idiomatic: while(link) |unwrapped_link|{ i += 1; link = unwrapped_link.next; }
nullable types are inconvenient.
c: if (link) i++;
zig idiomatic: if (link) |_| i += 1;
zig but C pointer: if (@intFromPtr(link) != @intFromPtr(c.NULL)) i += 1;
*/
// TODO
/*
remove name buffer_len. use buffer_max_size and buffer_used instead.
*/
// desctiptions
// # __AlignedPtr__
/* its a virtual struct becouse C not have "anytype" type.
struct __AlignedPtr__ {
char gap[gap_size] // padding for aligning data. gap_size can be 0.
anytype your_data // <- the pointer that the alloc function returns will be pointed here.
uint8_t gap_size
}
*/
// AP - its hex like but use from 'a' to 'p' values for symbols
// __NetworkTcpHttpWebSocketHeader__
// real struct of web socket header:
// fin_flag: u1 = 1,
// rsv: [3]u1 = .{0,0,0},
// opcode: Opcode = .binary, // may be text
// mask_flag: u1 = 0,
// payload_len: u7 = 0,
// extended_payload_len: u16 or u64 or void (optional)
// masking_key: u64 or void (optional)
// 2 bytes (__NetworkTcpHttpWebSocketHeaderSmall__) header for sizes 1 ... 125
// 4 bytes (__NetworkTcpHttpWebSocketHeaderMedium__) header for sizes 126 ... 65535
// 10 bytes (__NetworkTcpHttpWebSocketHeaderLong__) header for sizes more than 65535
// enums
// # __LoggerWriter__
#define __LoggerWriter_toFallback__ 0
#define __LoggerWriter_toFile__ 1
#define __LoggerWriter_toConsole__ 2
#define __LoggerWriter_toTerminal__ 3
// # __MemTree_fix_counts_Action__
#define __MemTree_fix_counts_Action_plus__ 'p'
#define __MemTree_fix_counts_Action_minus__ 'm'
// # __MemTree_fix_nested_Action__
#define __MemTree_fix_nested_Action_plus__ 'p'
#define __MemTree_fix_nested_Action_minus__ 'm'
// # __OsNetworkTcpSocketConnectResult__ (char)
#define __OsNetworkTcpSocketConnectResult_error__ -1
#define __OsNetworkTcpSocketConnectResult_inProgress__ 0
#define __OsNetworkTcpSocketConnectResult_success__ 1
// # __TargetMemoryType__
#define __TargetMemoryType_endiansLittle__ 1
#define __TargetMemoryType_endiansBig__ 2
// # __TargetOs__
#define __TargetOs_windows__ 1
#define __TargetOs_linux__ 2
// settings
// # __AppEditorLineLen_max__
#define __AppEditorLineLen_max__ (1024 * 8)
// # __AppEditorTheme_arrows__
#define __AppEditorTheme_arrows__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_unbold__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_yellow__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_commentary__
#define __AppEditorTheme_commentary__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_yellow__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_current__
#define __AppEditorTheme_current__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_light_green__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_current_commentary__
#define __AppEditorTheme_current_commentary__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_yellow__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_current_disabled__
#define __AppEditorTheme_current_disabled__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_light_green__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_current_folded__
#define __AppEditorTheme_current_folded__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bold__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_light_green__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_current_rune__
#define __AppEditorTheme_current_rune__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_magenta__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_disabled__
#define __AppEditorTheme_disabled__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_magenta__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_easy_motion__
#define __AppEditorTheme_easy_motion__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_yellow__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_folded__
#define __AppEditorTheme_folded__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bold__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_zero__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_folded_arrows__
#define __AppEditorTheme_folded_arrows__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bold__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_gray__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_yellow__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_headers__
#define __AppEditorTheme_headers__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bold__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_cyan__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_notification__
#define __AppEditorTheme_notification__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_red__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorTheme_reset__
#define __AppEditorTheme_reset__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_reset__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_bg_color_zero__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_zero__ \
__ConsoleAnsiOutputFontStyle_end__
// # __AppEditorViewsEasyMotionHorizontal_step__
#define __AppEditorViewsEasyMotionHorizontal_step__ 3
// # __AppEditorViewsEasyMotionVertical_step__
#define __AppEditorViewsEasyMotionVertical_step__ 2
// # __App_expectedFps__
#define __App_expectedFps__ 30
// # __OsFilePathLen_max__
#define __OsFilePathLen_max__ 1024
// # __OsNetworkTcpHttp_maxHeaders__
#define __OsNetworkTcpHttp_maxHeaders__ 48
// # __OsNetworkTcp_maxClientCount__
#define __OsNetworkTcp_maxClientCount__ 8
// # __TerminalInput_size__
#define __TerminalInput_size__ 32
// # __target_memoryType__
#define __target_memoryType__ __TargetMemoryType_endiansLittle__
// # __target_os__
//#define __target_os__ __TargetOs_linux__
#ifndef __target_os__
#ifdef _WIN32
#define __target_os__ __TargetOs_windows__
#elif defined(__linux__)
#define __target_os__ __TargetOs_linux__
#endif
#endif
// # __with_network__
#define __with_network__ 0
// macro
// types and structs
// # __Size__
#define __Size__ __Type_getSize__(size_t)
// # __Ptr__
#define __Ptr__ __Type_getSize__(uintptr_t)
// # __Slice__
// # __Slice_ptr__
#define __SlicePtr__ __Ptr__
#define __Slice_ptr__ 0
// # __Slice_len__
#define __SliceLen__ __Size__
#define __Slice_len__ __Align_up__(__Slice_ptr__ + __SlicePtr__, __Size__)
// c
// # __Addr_fromPtr__
#define __Addr_fromPtr__(ptr) ((uintptr_t)(ptr))
// # __Align_up__
#define __Align_up__(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
// # __CText_len__
#define __CText_len__(str) (__arrayLen__(str) - 1)
// # __CText_write__
#define __CText_write__(buffer, text) (__Mem_copy__(buffer, text, __CText_len__(text)), __CText_len__(text))
// # __Instance_fromPtr__
#define __Instance_fromPtr__(ptr) (*(ptr))
// # __Struct_getFieldOffset__
#define __Struct_getFieldOffset__(type, field) (__Addr_fromPtr__(__TypedPtr_getFieldPtr__(__TypedPtr_virtual__(type), field)))
// # __Type_getAlign__
#define __Type_getAlign__(type) (__Struct_getFieldOffset__(struct {char c; type t;}, t))
// # __Type_getSize__
#define __Type_getSize__(type) (__Struct_getFieldOffset__(struct {type t; char c;}, c))
// # __TypedPtr_fromAddr__
#define __TypedPtr_fromAddr__(type, addr) ((type*)(addr))
// # __TypedPtr_getFieldPtr__
#define __TypedPtr_getFieldPtr__( ptr, field_name) (&(ptr)->field_name)
// # __TypedPtr_getParentPtrFromFieldPtr__
#define __TypedPtr_getParentPtrFromFieldPtr__( type, field_name, field_ptr) (__TypedPtr_fromAddr__(type, __Addr_fromPtr__((field_ptr)) - __Struct_getFieldOffset__(type, field_name)))
// # __TypedPtr_virtual__
#define __TypedPtr_virtual__( type) (__TypedPtr_fromAddr__(type, 0))
// # __arrayLen__
#define __arrayLen__( array) (sizeof((array)) / sizeof((array[0])))
// # __len_and_text__
#define __len_and_text__( str) __CText_len__(str), str
// # __text_and_len__
#define __text_and_len__( str) str, __CText_len__(str)
// # and
#define and &&
// # or
#define or ||
// os
// # __OsConsoleOutput_writeCText__
#define __OsConsoleOutput_writeCText__( ctx, text) \
__OsConsoleOutput_write__( ctx, text, __CText_len__(text))
// # __OsFile_readToAny__
#define __OsFile_readToAny__( file, buffer, buffer_len, offset ) \
__OsFile_readToBuffer__( file, (char*) (buffer), buffer_len, offset )
// # __OsMem_allocAny__
#define __OsMem_allocAny__( ret_data_addr, size) \
__OsMem_alloc__( (uintptr_t*) (ret_data_addr), size)
// # __OsMem_freeAny__
#define __OsMem_freeAny__( ret_data_addr) \
__OsMem_free__( (uintptr_t) (ret_data_addr))
// # __OsNetworkTcp_maxAllowedListenPort__
#define __OsNetworkTcp_maxAllowedListenPort__ 49151
// Os specific
#if __target_os__ == __TargetOs_windows__
#define WSA_SUCCESS 0
#elif __target_os__ == __TargetOs_linux__
#else
#error "__target_os__ not implemented"
#endif
// # breakpoint
#if __target_os__ == __TargetOs_windows__
#define breakpoint() DebugBreak()
#elif __target_os__ == __TargetOs_linux__
#define breakpoint() raise(SIGTRAP)
#else
#error "__target_os__ not implemented"
#endif
// lib
// # Sha1_digest_length
#define Sha1_digest_length 20
// # __AlignedPtr_allocAny__
#define __AlignedPtr_allocAny__( ret_data_addr, mem_align, size) \
__AlignedPtr_alloc__( (uintptr_t*) (ret_data_addr), mem_align, size)
// # __AlignedPtr_freeAny__
#define __AlignedPtr_freeAny__( ret_data_addr, size) \
__AlignedPtr_free__( (uintptr_t) (ret_data_addr), size)
// # __ConsoleAnsiInputKey_alt_0__
#define __ConsoleAnsiInputKey_alt_0__ ('0' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_1__
#define __ConsoleAnsiInputKey_alt_1__ ('1' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_2__
#define __ConsoleAnsiInputKey_alt_2__ ('2' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_3__
#define __ConsoleAnsiInputKey_alt_3__ ('3' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_4__
#define __ConsoleAnsiInputKey_alt_4__ ('4' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_5__
#define __ConsoleAnsiInputKey_alt_5__ ('5' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_6__
#define __ConsoleAnsiInputKey_alt_6__ ('6' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_7__
#define __ConsoleAnsiInputKey_alt_7__ ('7' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_8__
#define __ConsoleAnsiInputKey_alt_8__ ('8' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_9__
#define __ConsoleAnsiInputKey_alt_9__ ('9' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_M__
#define __ConsoleAnsiInputKey_alt_M__ ('M' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_N__
#define __ConsoleAnsiInputKey_alt_N__ ('N' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt__
#define __ConsoleAnsiInputKey_alt__ (1 << 11)
// # __ConsoleAnsiInputKey_alt_a__
#define __ConsoleAnsiInputKey_alt_a__ ('a' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_apostrophe__
#define __ConsoleAnsiInputKey_alt_apostrophe__ ('`' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_b__
#define __ConsoleAnsiInputKey_alt_b__ ('b' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_c__
#define __ConsoleAnsiInputKey_alt_c__ ('c' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_close_bracket__
#define __ConsoleAnsiInputKey_alt_close_bracket__ (']' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_comma__
#define __ConsoleAnsiInputKey_alt_comma__ (',' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_d__
#define __ConsoleAnsiInputKey_alt_d__ ('d' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_dot__
#define __ConsoleAnsiInputKey_alt_dot__ ('.' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_down__
#define __ConsoleAnsiInputKey_alt_down__ (__ConsoleAnsiInputKey_down__ + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_e__
#define __ConsoleAnsiInputKey_alt_e__ ('e' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_f__
#define __ConsoleAnsiInputKey_alt_f__ ('f' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_g__
#define __ConsoleAnsiInputKey_alt_g__ ('g' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_h__
#define __ConsoleAnsiInputKey_alt_h__ ('h' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_i__
#define __ConsoleAnsiInputKey_alt_i__ ('i' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_j__
#define __ConsoleAnsiInputKey_alt_j__ ('j' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_k__
#define __ConsoleAnsiInputKey_alt_k__ ('k' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_l__
#define __ConsoleAnsiInputKey_alt_l__ ('l' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_left__
#define __ConsoleAnsiInputKey_alt_left__ (__ConsoleAnsiInputKey_left__ + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_m__
#define __ConsoleAnsiInputKey_alt_m__ ('m' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_n__
#define __ConsoleAnsiInputKey_alt_n__ ('n' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_o__
#define __ConsoleAnsiInputKey_alt_o__ ('o' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_open_bracket__
#define __ConsoleAnsiInputKey_alt_open_bracket__ ('[' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_p__
#define __ConsoleAnsiInputKey_alt_p__ ('p' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_q__
#define __ConsoleAnsiInputKey_alt_q__ ('q' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_r__
#define __ConsoleAnsiInputKey_alt_r__ ('r' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_right__
#define __ConsoleAnsiInputKey_alt_right__ (__ConsoleAnsiInputKey_right__ + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_s__
#define __ConsoleAnsiInputKey_alt_s__ ('s' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_semicolon__
#define __ConsoleAnsiInputKey_alt_semicolon__ (';' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_t__
#define __ConsoleAnsiInputKey_alt_t__ ('t' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_u__
#define __ConsoleAnsiInputKey_alt_u__ ('u' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_up__
#define __ConsoleAnsiInputKey_alt_up__ (__ConsoleAnsiInputKey_up__ + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_v__
#define __ConsoleAnsiInputKey_alt_v__ ('v' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_w__
#define __ConsoleAnsiInputKey_alt_w__ ('w' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_x__
#define __ConsoleAnsiInputKey_alt_x__ ('x' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_y__
#define __ConsoleAnsiInputKey_alt_y__ ('y' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_alt_z__
#define __ConsoleAnsiInputKey_alt_z__ ('z' + __ConsoleAnsiInputKey_alt__)
// # __ConsoleAnsiInputKey_ascii_ctrl__
#define __ConsoleAnsiInputKey_ascii_ctrl__ (-'a' + 1) /* do not use externally */
// # __ConsoleAnsiInputKey_back_space__
#define __ConsoleAnsiInputKey_back_space__ 127 /* sometime delete */
// # __ConsoleAnsiInputKey_ctrl__
#define __ConsoleAnsiInputKey_ctrl__ (1 << 10)
// # __ConsoleAnsiInputKey_ctrl_a__ start_of_heading __ConsoleAnsiInputKey_ctrl_a__
#define __ConsoleAnsiInputKey_ctrl_a__ ('a' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_alt_v__
#define __ConsoleAnsiInputKey_ctrl_alt_v__ ('v' + __ConsoleAnsiInputKey_alt__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_b__
#define __ConsoleAnsiInputKey_ctrl_b__ ('b' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_bs__ also ctrl_h
#define __ConsoleAnsiInputKey_ctrl_bs__ 8
// # __ConsoleAnsiInputKey_ctrl_c__
#define __ConsoleAnsiInputKey_ctrl_c__ ('c' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_d__
#define __ConsoleAnsiInputKey_ctrl_d__ ('d' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_down__
#define __ConsoleAnsiInputKey_ctrl_down__ (__ConsoleAnsiInputKey_down__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_e__
#define __ConsoleAnsiInputKey_ctrl_e__ ('e' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_enter__
#define __ConsoleAnsiInputKey_ctrl_enter__ (__ConsoleAnsiInputKey_enter__ + __ConsoleAnsiInputKey_special__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_f__
#define __ConsoleAnsiInputKey_ctrl_f__ ('f' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_g__
#define __ConsoleAnsiInputKey_ctrl_g__ ('g' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_h__ also ctrl_bs
#define __ConsoleAnsiInputKey_ctrl_bs__ 8
#define __ConsoleAnsiInputKey_ctrl_h__ ('h' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_i__ also # __ConsoleAnsiInputKey_tab__
#define __ConsoleAnsiInputKey_tab__ 9
#define __ConsoleAnsiInputKey_ctrl_i__ ('i' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_j__
#define __ConsoleAnsiInputKey_ctrl_j__ ('j' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_k__ vertical_tab
#define __ConsoleAnsiInputKey_ctrl_k__ ('k' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_l__ formFeed
#define __ConsoleAnsiInputKey_ctrl_l__ ('l' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_left__
#define __ConsoleAnsiInputKey_ctrl_left__ (__ConsoleAnsiInputKey_left__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_m__ also # __ConsoleAnsiInputKey_enter__
#define __ConsoleAnsiInputKey_enter__ 13
#define __ConsoleAnsiInputKey_ctrl_m__ ('m' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_n__
#define __ConsoleAnsiInputKey_ctrl_n__ ('n' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_o__
#define __ConsoleAnsiInputKey_ctrl_o__ ('o' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_p__
#define __ConsoleAnsiInputKey_ctrl_p__ ('p' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_q__
#define __ConsoleAnsiInputKey_ctrl_q__ ('q' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_r__
#define __ConsoleAnsiInputKey_ctrl_r__ ('r' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_right__
#define __ConsoleAnsiInputKey_ctrl_right__ (__ConsoleAnsiInputKey_right__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_s__
#define __ConsoleAnsiInputKey_ctrl_s__ ('s' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_shift_left__
#define __ConsoleAnsiInputKey_ctrl_shift_left__ (__ConsoleAnsiInputKey_left__ + __ConsoleAnsiInputKey_ctrl__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_ctrl_shift_right__
#define __ConsoleAnsiInputKey_ctrl_shift_right__ (__ConsoleAnsiInputKey_right__ + __ConsoleAnsiInputKey_ctrl__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_ctrl_t__
#define __ConsoleAnsiInputKey_ctrl_t__ ('t' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_triangular_close_quotation_mark__
#define __ConsoleAnsiInputKey_ctrl_triangular_close_quotation_mark__ ('>' + __ConsoleAnsiInputKey_special__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_triangular_open_quotation_mark__
#define __ConsoleAnsiInputKey_ctrl_triangular_open_quotation_mark__ ('<' + __ConsoleAnsiInputKey_special__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_u__
#define __ConsoleAnsiInputKey_ctrl_u__ ('u' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_up__
#define __ConsoleAnsiInputKey_ctrl_up__ (__ConsoleAnsiInputKey_up__ + __ConsoleAnsiInputKey_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_v__
#define __ConsoleAnsiInputKey_ctrl_v__ ('v' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_w__
#define __ConsoleAnsiInputKey_ctrl_w__ ('w' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_x__
#define __ConsoleAnsiInputKey_ctrl_x__ ('x' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_y__
#define __ConsoleAnsiInputKey_ctrl_y__ ('y' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_ctrl_z__
#define __ConsoleAnsiInputKey_ctrl_z__ ('z' + __ConsoleAnsiInputKey_ascii_ctrl__)
// # __ConsoleAnsiInputKey_delete__
#define __ConsoleAnsiInputKey_delete__ (5 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_down__
#define __ConsoleAnsiInputKey_down__ (4 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_end__
#define __ConsoleAnsiInputKey_end__ (8 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_escape__
#define __ConsoleAnsiInputKey_escape__ 27
// # __ConsoleAnsiInputKey_f10__
#define __ConsoleAnsiInputKey_f10__ (10 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f11__
#define __ConsoleAnsiInputKey_f11__ (11 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f12__
#define __ConsoleAnsiInputKey_f12__ (12 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f1__
#define __ConsoleAnsiInputKey_f1__ (1 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f2__
#define __ConsoleAnsiInputKey_f2__ (2 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f3__
#define __ConsoleAnsiInputKey_f3__ (3 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f4__
#define __ConsoleAnsiInputKey_f4__ (4 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f5__
#define __ConsoleAnsiInputKey_f5__ (5 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f6__
#define __ConsoleAnsiInputKey_f6__ (6 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f7__
#define __ConsoleAnsiInputKey_f7__ (7 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f8__
#define __ConsoleAnsiInputKey_f8__ (8 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_f9__
#define __ConsoleAnsiInputKey_f9__ (9 + __ConsoleAnsiInputKey_functional__)
// # __ConsoleAnsiInputKey_functional__
#define __ConsoleAnsiInputKey_functional__ (1 << 9)
// # __ConsoleAnsiInputKey_home__
#define __ConsoleAnsiInputKey_home__ (9 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_left__
#define __ConsoleAnsiInputKey_left__ (1 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_mouse__
#define __ConsoleAnsiInputKey_mouse__ (1 << 13)
// # __ConsoleAnsiInputKey_page_down__
#define __ConsoleAnsiInputKey_page_down__ (7 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_page_up__
#define __ConsoleAnsiInputKey_page_up__ (6 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_right__
#define __ConsoleAnsiInputKey_right__ (2 + __ConsoleAnsiInputKey_special__)
// # __ConsoleAnsiInputKey_shift__
#define __ConsoleAnsiInputKey_shift__ (1 << 12)
// # __ConsoleAnsiInputKey_shift_delete__
#define __ConsoleAnsiInputKey_shift_delete__ (__ConsoleAnsiInputKey_delete__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_shift_down__
#define __ConsoleAnsiInputKey_shift_down__ (__ConsoleAnsiInputKey_down__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_shift_left__
#define __ConsoleAnsiInputKey_shift_left__ (__ConsoleAnsiInputKey_left__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_shift_right__
#define __ConsoleAnsiInputKey_shift_right__ (__ConsoleAnsiInputKey_right__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_shift_up__
#define __ConsoleAnsiInputKey_shift_up__ (__ConsoleAnsiInputKey_up__ + __ConsoleAnsiInputKey_shift__)
// # __ConsoleAnsiInputKey_special__
#define __ConsoleAnsiInputKey_special__ (1 << 8)
// # __ConsoleAnsiInputKey_up__
#define __ConsoleAnsiInputKey_up__ (3 + __ConsoleAnsiInputKey_special__)
// # __CryptoScalpiHash_doAny__
#define __CryptoScalpiHash_doAny__( hasher, data_ptr, data_len, dest, dest_size) \
__CryptoScalpiHash_do__( hasher, (char*)data_ptr, data_len, dest, dest_size)
// # __FileComplete_readToAny__
#define __FileComplete_readToAny__( ret_data_ptr, ret_file_data_size, file_name, file_name_len, align ) \
__FileComplete_read__( (uintptr_t*)ret_data_ptr, ret_file_data_size, file_name, file_name_len, align )
// # __Hex_bytesLenFromHex__
#define __Hex_bytesLenFromHex__(len) (len >> 1)
// # __Hex_lenFromBytesLen__
#define __Hex_lenFromBytesLen__(len) (len * 2)
// # __MemSize_gb__
#define __MemSize_gb__ (1024 * __MemSize_mb__)
// # __MemSize_kb__
#define __MemSize_kb__ 1024
// # __MemSize_mb__
#define __MemSize_mb__ (1024 * __MemSize_kb__)
// # __Mem_fillAny__
#define __Mem_fillAny__( dest, symbol, len) \
__Mem_fill__( (char*)dest, symbol, len)
// # __Mem_nativeToBig__
#if __target_memoryType__ == __TargetMemoryType_endiansBig__
#define __Mem_nativeToBig__(dest, src, size) __Mem_copy__(dest, src, size)
#elif __target_memoryType__ == __TargetMemoryType_endiansLittle__
#define __Mem_nativeToBig__(dest, src, size) __Mem_reverse__(dest, src, size)
#else
#error "please define __target_memoryType__ with __TargetMemoryType_ (you can test endings with cpu_checkNumberFormat function)"
#endif
// # __Mem_nativeToLittle__
#if __target_memoryType__ == __TargetMemoryType_endiansBig__
#define __Mem_nativeToLittle__(dest, src, size) __Mem_reverse__(dest, src, size)
#elif __target_memoryType__ == __TargetMemoryType_endiansLittle__
#define __Mem_nativeToLittle__(dest, src, size) __Mem_copy__(dest, src, size)
#else
#error "please define __target_memoryType__ with __TargetMemoryType_ (you can test endings with cpu_checkNumberFormat function)"
#endif
// # __NetworkTcpHttpWebSocketHandShake_encoded_len__
#define __NetworkTcpHttpWebSocketHandShake_encoded_len__ 28
// # __NetworkTcpHttpWebSocketHeaderLongExtendedPayloadLen_size__
#define __NetworkTcpHttpWebSocketHeaderLongExtendedPayloadLen_size__ 8
// # __NetworkTcpHttpWebSocketHeaderLong__
#define __NetworkTcpHttpWebSocketHeaderLong__ 2
// # __NetworkTcpHttpWebSocketHeaderLong_flag__
#define __NetworkTcpHttpWebSocketHeaderLong_flag__ 127
// # __NetworkTcpHttpWebSocketHeaderLong_size__
#define __NetworkTcpHttpWebSocketHeaderLong_size__ (__NetworkTcpHttpWebSocketHeaderSmall_size__ + __NetworkTcpHttpWebSocketHeaderLongExtendedPayloadLen_size__)
// # __NetworkTcpHttpWebSocketHeaderMask_size__
#define __NetworkTcpHttpWebSocketHeaderMask_size__ 4
// # __NetworkTcpHttpWebSocketHeaderMediumExtendedPayloadLen_size__
#define __NetworkTcpHttpWebSocketHeaderMediumExtendedPayloadLen_size__ 2
// # __NetworkTcpHttpWebSocketHeaderMedium__
#define __NetworkTcpHttpWebSocketHeaderMedium__ 1
// # __NetworkTcpHttpWebSocketHeaderMedium_flag__
#define __NetworkTcpHttpWebSocketHeaderMedium_flag__ 126
// # __NetworkTcpHttpWebSocketHeaderMedium_size__
#define __NetworkTcpHttpWebSocketHeaderMedium_size__ (__NetworkTcpHttpWebSocketHeaderSmall_size__ + __NetworkTcpHttpWebSocketHeaderMediumExtendedPayloadLen_size__)
// # __NetworkTcpHttpWebSocketHeaderOpcode_binary__
#define __NetworkTcpHttpWebSocketHeaderOpcode_binary__ 2
// # __NetworkTcpHttpWebSocketHeaderOpcode_close__
#define __NetworkTcpHttpWebSocketHeaderOpcode_close__ 8
// # __NetworkTcpHttpWebSocketHeaderOpcode_continuation__
#define __NetworkTcpHttpWebSocketHeaderOpcode_continuation__ 0
// # __NetworkTcpHttpWebSocketHeaderOpcode_ping__
#define __NetworkTcpHttpWebSocketHeaderOpcode_ping__ 9
// # __NetworkTcpHttpWebSocketHeaderOpcode_pong__
#define __NetworkTcpHttpWebSocketHeaderOpcode_pong__ 10
// # __NetworkTcpHttpWebSocketHeaderOpcode_text__
#define __NetworkTcpHttpWebSocketHeaderOpcode_text__ 1
// # __NetworkTcpHttpWebSocketHeaderSmallExtendedPayloadLen_size__
#define __NetworkTcpHttpWebSocketHeaderSmallExtendedPayloadLen_size__ 0
// # __NetworkTcpHttpWebSocketHeaderSmall__
#define __NetworkTcpHttpWebSocketHeaderSmall__ 0
// # __NetworkTcpHttpWebSocketHeaderSmall_size__
#define __NetworkTcpHttpWebSocketHeaderSmall_size__ 2
// # __Sha1Block_size__
#define __Sha1Block_size__ 64
// # __Terminal_setFontStyleCText__
#define __Terminal_setFontStyleCText__( ctx, text) \
__Terminal_setFontStyle__( ctx, text, __CText_len__(text))
// # __TextCharsDecFromU64_lenMax__
//#define __TextCharsDecFromU64_lenMax__ __CText_len__("18446744073709551615")
#define __TextCharsDecFromU64_lenMax__ 20
// # __TimeStamp_len__
// for write time stamp like "00:00:00" as "HH:MM:SS" where HH - hours, MM - minuts, SS - seconds
#define __TimeStamp_len__ 8
// # __Time_daysPerWeek__
#define __Time_daysPerWeek__ 7
// # __Time_hourPerDay__
#define __Time_hourPerDay__ 24
// # __Time_minPerHour__
#define __Time_minPerHour__ 60
// # __Time_msPerFsec__
#define __Time_msPerFsec__ 0.001
// # __Time_msPerS__
#define __Time_msPerS__ 1000
// # __Time_msPerSec__
#define __Time_msPerSec__ 1000
// # __Time_nsPerFsec__
#define __Time_nsPerFsec__ 0.000_000_001
// # __Time_secPerMin__
#define __Time_secPerMin__ 60
// # __Time_usPerFsec__
#define __Time_usPerFsec__ 0.000_001
// # __u64FromTextDec_maxLen__
//#define __u64FromTextDec_maxLen__ __CText_len__("18446744073709551615")
#define __u64FromTextDec_maxLen__ 20
// app
#define __AppEditor_changeStatusCText__(text) __AppEditor_changeStatus__(text, __CText_len__(text))
// imports
// libC
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <inttypes.h>
#include <iso646.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <tgmath.h>
#include <time.h>
#include <uchar.h>
#include <wchar.h>
#include <wctype.h>
#if __target_os__ == __TargetOs_windows__
// posix
#include <fcntl.h>
// Windows
#if __with_network__
#include <ws2tcpip.h> // include before windows.h
//#include <winsock.h>
#include <winsock2.h>
#endif
#include <windef.h>
#include <windows.h>
#include <winuser.h>
#include <commctrl.h>
#include <io.h>
#include <conio.h>
#ifdef __COMPILED_FROM_ZIG_FILE__
#define INVALID_HANDLE_VALUE (HANDLE)0xFFFFFFFF
#endif
#elif __target_os__ == __TargetOs_linux__
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <time.h>
#if __with_network__
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#endif
#endif
// strings
// # __Base64StandardAlphabet_chars__
#define __Base64StandardAlphabet_chars__ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
// # __ConsoleAnsiOutputCursorStyle_reset__
#define __ConsoleAnsiOutputCursorStyle_reset__ __ConsoleAnsi_control__ "0 q"
// # __ConsoleAnsiOutputFontStyle_bg_color_black__
#define __ConsoleAnsiOutputFontStyle_bg_color_black__ "40"
// # __ConsoleAnsiOutputFontStyle_bg_color_blue__
#define __ConsoleAnsiOutputFontStyle_bg_color_blue__ "44"
// # __ConsoleAnsiOutputFontStyle_bg_color_cyan__
#define __ConsoleAnsiOutputFontStyle_bg_color_cyan__ "46"
// # __ConsoleAnsiOutputFontStyle_bg_color_gold__
#define __ConsoleAnsiOutputFontStyle_bg_color_gold__ "43"
// # __ConsoleAnsiOutputFontStyle_bg_color_gray__
#define __ConsoleAnsiOutputFontStyle_bg_color_gray__ "100"
// # __ConsoleAnsiOutputFontStyle_bg_color_green__
#define __ConsoleAnsiOutputFontStyle_bg_color_green__ "42"
// # __ConsoleAnsiOutputFontStyle_bg_color_light_blue__
#define __ConsoleAnsiOutputFontStyle_bg_color_light_blue__ "104"
// # __ConsoleAnsiOutputFontStyle_bg_color_light_cyan__
#define __ConsoleAnsiOutputFontStyle_bg_color_light_cyan__ "106"
// # __ConsoleAnsiOutputFontStyle_bg_color_light_gray__
#define __ConsoleAnsiOutputFontStyle_bg_color_light_gray__ "47"
// # __ConsoleAnsiOutputFontStyle_bg_color_light_green__
#define __ConsoleAnsiOutputFontStyle_bg_color_light_green__ "102"
// # __ConsoleAnsiOutputFontStyle_bg_color_light_magenta__
#define __ConsoleAnsiOutputFontStyle_bg_color_light_magenta__ "105"
// # __ConsoleAnsiOutputFontStyle_bg_color_magenta__
#define __ConsoleAnsiOutputFontStyle_bg_color_magenta__ "45"
// # __ConsoleAnsiOutputFontStyle_bg_color_pink__
#define __ConsoleAnsiOutputFontStyle_bg_color_pink__ "101"
// # __ConsoleAnsiOutputFontStyle_bg_color_red__
#define __ConsoleAnsiOutputFontStyle_bg_color_red__ "41"
// # __ConsoleAnsiOutputFontStyle_bg_color_white__
#define __ConsoleAnsiOutputFontStyle_bg_color_white__ "107"
// # __ConsoleAnsiOutputFontStyle_bg_color_yellow__
#define __ConsoleAnsiOutputFontStyle_bg_color_yellow__ "103"
// # __ConsoleAnsiOutputFontStyle_bg_color_zero__
#define __ConsoleAnsiOutputFontStyle_bg_color_zero__ "49"
// # __ConsoleAnsiOutputFontStyle_bold__
#define __ConsoleAnsiOutputFontStyle_bold__ "1"
// # __ConsoleAnsiOutputFontStyle_color_black__
#define __ConsoleAnsiOutputFontStyle_color_black__ "30"
// # __ConsoleAnsiOutputFontStyle_color_blue__
#define __ConsoleAnsiOutputFontStyle_color_blue__ "34"
// # __ConsoleAnsiOutputFontStyle_color_cyan__
#define __ConsoleAnsiOutputFontStyle_color_cyan__ "36"
// # __ConsoleAnsiOutputFontStyle_color_gold__
#define __ConsoleAnsiOutputFontStyle_color_gold__ "33"
// # __ConsoleAnsiOutputFontStyle_color_gray__
#define __ConsoleAnsiOutputFontStyle_color_gray__ "90"
// # __ConsoleAnsiOutputFontStyle_color_green__
#define __ConsoleAnsiOutputFontStyle_color_green__ "32"
// # __ConsoleAnsiOutputFontStyle_color_light_blue__
#define __ConsoleAnsiOutputFontStyle_color_light_blue__ "94"
// # __ConsoleAnsiOutputFontStyle_color_light_cyan__
#define __ConsoleAnsiOutputFontStyle_color_light_cyan__ "96"
// # __ConsoleAnsiOutputFontStyle_color_light_gray__
#define __ConsoleAnsiOutputFontStyle_color_light_gray__ "37"
// # __ConsoleAnsiOutputFontStyle_color_light_green__
#define __ConsoleAnsiOutputFontStyle_color_light_green__ "92"
// # __ConsoleAnsiOutputFontStyle_color_light_magenta__
#define __ConsoleAnsiOutputFontStyle_color_light_magenta__ "95"
// # __ConsoleAnsiOutputFontStyle_color_magenta__
#define __ConsoleAnsiOutputFontStyle_color_magenta__ "35"
// # __ConsoleAnsiOutputFontStyle_color_pink__
#define __ConsoleAnsiOutputFontStyle_color_pink__ "91"
// # __ConsoleAnsiOutputFontStyle_color_red__
#define __ConsoleAnsiOutputFontStyle_color_red__ "31"
// # __ConsoleAnsiOutputFontStyle_color_white__
#define __ConsoleAnsiOutputFontStyle_color_white__ "97"
// # __ConsoleAnsiOutputFontStyle_color_yellow__
#define __ConsoleAnsiOutputFontStyle_color_yellow__ "93"
// # __ConsoleAnsiOutputFontStyle_color_zero__
#define __ConsoleAnsiOutputFontStyle_color_zero__ "39"
// # __ConsoleAnsiOutputFontStyle_command_reset__
#define __ConsoleAnsiOutputFontStyle_command_reset__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_reset__ \
__ConsoleAnsiOutputFontStyle_end__
// # __ConsoleAnsiOutputFontStyle_conceal__
#define __ConsoleAnsiOutputFontStyle_conceal__ "8"
// # __ConsoleAnsiOutputFontStyle_dim__
#define __ConsoleAnsiOutputFontStyle_dim__ "2"
// # __ConsoleAnsiOutputFontStyle_end__
#define __ConsoleAnsiOutputFontStyle_end__ "m"
// # __ConsoleAnsiOutputFontStyle_fraktur__
#define __ConsoleAnsiOutputFontStyle_fraktur__ "20"
// # __ConsoleAnsiOutputFontStyle_italic__
#define __ConsoleAnsiOutputFontStyle_italic__ "3"
// # __ConsoleAnsiOutputFontStyle_reset__
#define __ConsoleAnsiOutputFontStyle_reset__ "0"
// # __ConsoleAnsiOutputFontStyle_sep__
#define __ConsoleAnsiOutputFontStyle_sep__ ";"
// # __ConsoleAnsiOutputFontStyle_set_bg_color__
#define __ConsoleAnsiOutputFontStyle_set_bg_color__ "48"
// # __ConsoleAnsiOutputFontStyle_set_color__
#define __ConsoleAnsiOutputFontStyle_set_color__ "38"
// # __ConsoleAnsiOutputFontStyle_start__
#define __ConsoleAnsiOutputFontStyle_start__ __ConsoleAnsi_control__
// # __ConsoleAnsiOutputFontStyle_unbold__
#define __ConsoleAnsiOutputFontStyle_unbold__ "21;24"
// # __ConsoleAnsiOutputFontStyle_underline__
#define __ConsoleAnsiOutputFontStyle_underline__ "4"
// # __ConsoleAnsiOutputSettings_disableLineWrap__
#define __ConsoleAnsiOutputSettings_disableLineWrap__ __ConsoleAnsi_control__ "?7l"
// # __ConsoleAnsiOutputSettings_enableLineWrap__
#define __ConsoleAnsiOutputSettings_enableLineWrap__ __ConsoleAnsi_control__ "?7h"
// # __ConsoleAnsi_control__
#define __ConsoleAnsi_control__ __ConsoleAnsi_esc__ "["
// # __ConsoleAnsi_esc__
#define __ConsoleAnsi_esc__ "\x1B"
// # __ConsoleAnsi_output_clear_line__
#define __ConsoleAnsi_output_clear_line__ __ConsoleAnsi_control__ "2K"
// # __ConsoleAnsi_output_clear_to_end_line__
#define __ConsoleAnsi_output_clear_to_end_line__ __ConsoleAnsi_control__ "0K"
// # __ConsoleAnsi_output_clear_to_start_line__
#define __ConsoleAnsi_output_clear_to_start_line__ __ConsoleAnsi_control__ "1K"
// # __ConsoleAnsi_output_cursor_hide__
#define __ConsoleAnsi_output_cursor_hide__ __ConsoleAnsi_control__ "?25l"
// # __ConsoleAnsi_output_cursor_show__
#define __ConsoleAnsi_output_cursor_show__ __ConsoleAnsi_control__ "?25h"
// # __ConsoleAnsi_output_cursor_style_blinking_I_beam__
#define __ConsoleAnsi_output_cursor_style_blinking_I_beam__ __ConsoleAnsi_control__ "5 q"
// # __ConsoleAnsi_output_cursor_style_blinking_block__
#define __ConsoleAnsi_output_cursor_style_blinking_block__ __ConsoleAnsi_control__ "1 q"
// # __ConsoleAnsi_output_cursor_style_blinking_underline__
#define __ConsoleAnsi_output_cursor_style_blinking_underline__ __ConsoleAnsi_control__ "3 q"
// # __ConsoleAnsi_output_cursor_style_steady_I_beam__
#define __ConsoleAnsi_output_cursor_style_steady_I_beam__ __ConsoleAnsi_control__ "6 q"
// # __ConsoleAnsi_output_cursor_style_steady_block__
#define __ConsoleAnsi_output_cursor_style_steady_block__ __ConsoleAnsi_control__ "2 q"
// # __ConsoleAnsi_output_cursor_style_steady_underline__
#define __ConsoleAnsi_output_cursor_style_steady_underline__ __ConsoleAnsi_control__ "4 q"
// # __OsFilePath_separator__
#if __target_os__ == __TargetOs_windows__
#define __OsFilePath_separator__ "\\"
#elif __target_os__ == __TargetOs_linux__
#define __OsFilePath_separator__ "/"
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
// # ansi_input_mouse_grab
#define ansi_input_mouse_grab __ConsoleAnsi_control__ "?1000h"
// # ansi_input_mouse_release
#define ansi_input_mouse_release __ConsoleAnsi_control__ "?1000l"
// basic types
// C
// # __Float32__
typedef float __Float32__;
// # __Float64__
typedef double __Float64__;
// # __FloatExtraSize__
typedef long double __FloatExtraSize__;
// # __ConsoleAnsiInputKey__
typedef
uint64_t
__ConsoleAnsiInputKey__
;
// # __FSec__
typedef __Float64__ __FSec__;
// # __OsConsoleInputHandle__
#if __target_os__ == __TargetOs_windows__
typedef void* __OsConsoleInputHandle__;
#elif __target_os__ == __TargetOs_linux__
typedef FILE* __OsConsoleInputHandle__;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
// # __OsConsoleOutputHandle__
#if __target_os__ == __TargetOs_windows__
typedef HANDLE __OsConsoleOutputHandle__;
#elif __target_os__ == __TargetOs_linux__
typedef int __OsConsoleOutputHandle__;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
// # __OsFileHandle__
#if __target_os__ == __TargetOs_windows__
typedef HANDLE __OsFileHandle__;
#elif __target_os__ == __TargetOs_linux__
typedef int __OsFileHandle__;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
// # __OsNetworkTcpHandle__
#if __target_os__ == __TargetOs_windows__
typedef SOCKET __OsNetworkTcpHandle__;
#elif __target_os__ == __TargetOs_linux__
typedef int __OsNetworkTcpHandle__;
#else
typedef void* __OsNetworkTcpHandle__;
#warning "__target_os__ not implemented"
#endif
// # __WriteFnPtrVoid__
typedef
void
(*__WriteFnPtrVoid__)
(void* context, const char* bytes, size_t bytes_len)
;
// # __WriteFnPtr__
typedef
size_t
(*__WriteFnPtr__)
(void* context, const char* bytes, size_t bytes_len)
;
// struct prototypes
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parser__;
struct __Console__;
// structs
// universal
// # Slice
struct Slice {
char* ptr;
size_t len;
};
// # __Math2dPosU__
struct __Math2dPosU__ {
size_t x;
size_t y;
};
// # __Writer__
struct __Writer__ {
void* context;
__WriteFnPtr__ write;
};
// # network_tcp_Ip
struct network_tcp_Ip {
uint16_t port;
uint8_t address[4];
};
// Os
// system specifics
#if __target_os__ == __TargetOs_windows__
#elif __target_os__ == __TargetOs_linux__
// # __OsLinux_timespec__
struct __OsLinux_timespec__ {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
#else
#error "__target_os__ not implemented"
#endif
// # __OsConsoleFlags__
struct __OsConsoleFlags__ {
bool inited;
#if __target_os__ == __TargetOs_windows__
DWORD input_mode;
DWORD output_mode;
#elif __target_os__ == __TargetOs_linux__
struct termios termios;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
};
// # __OsConsoleInput__
struct __OsConsoleInput__ {
__OsConsoleInputHandle__ handle;
#if __target_os__ == __TargetOs_windows__
#elif __target_os__ == __TargetOs_linux__
int fileno;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
};
// # __OsConsoleOutput__
struct __OsConsoleOutput__ {
__OsConsoleOutputHandle__ __OsConsoleOutput_handle__;
#if __target_os__ == __TargetOs_windows__
#elif __target_os__ == __TargetOs_linux__
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
};
// # __OsHelper__
struct __OsHelper__ {
#if __target_os__ == __TargetOs_windows__
HINSTANCE instance;
void* console_input_handle;
__OsConsoleOutputHandle__ console_output_handle;
#if __with_network__
bool network_inited;
WSADATA wsdata;
#endif
#elif __target_os__ == __TargetOs_linux__
FILE* console_input_handle;
__OsConsoleOutputHandle__ console_output_handle;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
};
// lib
// # Finder
struct Finder {
struct Slice text;
struct Slice desired;
size_t pos;
};
// # RoundParam (SHA1)
struct RoundParam {uint32_t a; uint32_t b; uint32_t c; uint32_t d; uint32_t e; uint32_t i;};
// # Sha1_Streaming
struct Sha1_Streaming {
uint32_t state[5];
char block[__Sha1Block_size__];
size_t buf_len; // current? filling level of block
uint64_t total_len;
};
// # __ConsoleAnsiInputKey_SequenceParser__
struct __ConsoleAnsiInputKey_SequenceParser__ {
__ConsoleAnsiInputKey__ sequence;
size_t used;
};
// # __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ {
const char* __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__;
__ConsoleAnsiInputKey__ key;
};
// # __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parser__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parser__ {
size_t text_len;
size_t len;
const struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ *ptr;
};
// # __Console__
struct __Console__ {
struct __OsConsoleInput__ input;
struct __OsConsoleOutput__ output;
};
// # __CryptoRandom__
struct __CryptoRandom__ {
size_t seed;
};
// # __CryptoScalpiHash__
struct __CryptoScalpiHash__ {
uint8_t mask; // value with 4 ones and 4 zeros like: 0b00001111
uint8_t a;
uint8_t b;
};
// # __Logger__
struct __Logger__ {
// write to terminal, console, file or to all together, but no real check "bytes is writen"
struct __Writer__ writers[4]; // __LoggerWriters__
};
// # __Math2dAreaU__
struct __Math2dAreaU__ {
struct __Math2dPosU__ from;
struct __Math2dPosU__ to;
};
// # __MemListLink__
struct __MemListLink__ {
struct __MemListLink__* prev;
struct __MemListLink__* next;
struct __MemList__* list;
};
// # __MemList__
struct __MemList__ {
struct __MemListLink__* first;
struct __MemListLink__* last;
size_t count;
};
// # __MemTree__
struct __MemTree__ {
struct __MemList__ childs;
struct __MemListLink__ link;
size_t count; // recurse. for get non recurse use childs.count
size_t nested;
};
// # __NetworkTcpIpToText__
struct __NetworkTcpIpToText__ {
/// 255.255.255.255:65535
/// 127. 0. 0. 1:27015
/// 0. 0. 0. 1: 0
char buffer[25];
size_t len;
};
// # __NetworkTcpServer__
#if __with_network__
struct __NetworkTcpServer__ {
bool __NetworkTcpServer_ready__;
__OsNetworkTcpHandle__ __NetworkTcpServer_socketHandle__;
size_t __NetworkTcpServer_maxWaitingClients__;
uint16_t port;
};
#endif
// # __NetworkTcpVisitor__
#if __with_network__
struct __NetworkTcpVisitor__ {
__OsNetworkTcpHandle__ socket_handle;
struct network_tcp_Ip ip;
struct sockaddr_in addr;
};
#endif
// # __TerminalInput__
struct __TerminalInput__ {
// usage:
// call __TerminalInput_updateBuffer__ for update unreaded
// use __TerminalInput_grab__ in loop for get keys
size_t ungrabed;
char buffer[__TerminalInput_size__];
};
// # __TerminalOutput__
struct __TerminalOutput__ {
struct __Math2dPosU__ cursor_pos;
const char* font_style;
size_t __TerminalOutput_fontStyleLen__;
struct __Math2dPosU__ size;
bool convert_n_to_rn;
bool apply_r;
bool apply_n;
};
// # __Terminal__
struct __Terminal__ {
struct __Console__ *console;
struct __OsConsoleFlags__ system_flags;
struct __TerminalInput__ input;
struct __TerminalOutput__ output;
};
// # __TextFormatU64__
struct __TextFormatU64__ {
char buffer [__TextCharsDecFromU64_lenMax__];
char *ptr;
size_t len;
};
// # __Text_Splitter__
struct __Text_Splitter__ {
struct Finder finder;
bool stop;
size_t last_pos;
};
// # __TimeClock__
struct __TimeClock__ {
uint64_t ms;
uint64_t sec;
uint64_t min;
uint64_t hour;
};
// # __TimeTotal__
struct __TimeTotal__ {
int64_t ms;
int64_t sec;
int64_t min;
int64_t hour;
int64_t day;
};
// # __Trace__
struct __Trace__ {
struct __Trace__ *__Trace_prevTrace__;
size_t __Trace_line__;
};
// # network_tcp_http_WebSocket_Parser
struct network_tcp_http_WebSocket_Parser {
char* message; // no null
size_t frame_len;
size_t header_len;
size_t message_len;
};
// App
// # __AppEditorHistoryNote__
struct __AppEditorHistoryNote__ {
__ConsoleAnsiInputKey__ key;
struct __MemListLink__ link;
};
// # __AppEditorLine__
struct __AppEditorLine__ {
struct __MemListLink__ link; // used in Views.Flat.lines for iterating
struct __MemTree__ tree; // used in Views.Fold.lines
char text[__AppEditorLineLen_max__]; // todo use ptr to allocated data
size_t text_len;
};
// # __AppEditorViewsFind__
struct __AppEditorViewsFind__ {
struct __Math2dPosU__ offset;
struct __AppEditorLine__ line;
const struct __AppEditorViewsVTable__ *context_vtable;
void *context;
size_t symbol;
bool need_redraw;
};
// # __AppEditorViewsFlat__
struct __AppEditorViewsFlat__ {
struct __AppEditorLine__ *line; // current working line - is setted by outside.
struct __AppEditorLine__ *marked_line; // can be null
struct __MemList__ lines;
struct __MemList__ cutted;
struct __AppEditorLine__ bakup_line;
struct __Math2dPosU__ offset;
size_t symbol;
bool __AppEditorViewsFlat_autoSpace__;
bool need_redraw;
bool need_draw_line_num;
};
// # __AppEditorViewsFolded__
struct __AppEditorViewsFolded__ {
struct __AppEditorLine__ *line;
struct __AppEditorLine__ *marked_line;
struct __MemTree__ lines;
struct __MemTree__ cutted;
struct __AppEditorLine__ bakup_line;
struct __Math2dPosU__ offset;
size_t symbol; // pos of cursor on current line.
bool need_redraw;
bool need_draw_line_num;
};
// # __AppEditorViewsGoToLine__
struct __AppEditorViewsGoToLine__ {
struct __AppEditorLine__ line;
const struct __AppEditorViewsVTable__ *context_vtable;
void *context;
size_t symbol;
struct __Math2dPosU__ offset;
bool need_redraw;
};
// # __AppEditorViewsReplace__
struct __AppEditorViewsReplace__ {
struct __AppEditorLine__ line;
struct __Math2dPosU__ offset;
const struct __AppEditorViewsVTable__ *context_vtable;
void *context;
size_t symbol;
bool need_redraw;
};
// # __AppEditorViewsVTable__
struct __AppEditorViewsVTable__ {
size_t (*getOffsetX) (void *t);
size_t (*getOffsetY) (void *t);
size_t (*getSymbolPosX) (void *t);
size_t (*countLineNum) (void *t);
void (*setAsView) (void *t);
void (*goToPrevLine) (void *t);
void (*goToNextLine) (void *t);
void (*goToSymbolPosX) (void *t, size_t pos);
void (*goToLineFromNumber) (void *t, size_t num);
};
// # __AppEditorViews__
struct __AppEditorViews__ {
struct __AppEditorViewsReplace__ replace;
struct __AppEditorViewsFind__ find;
struct __AppEditorViewsGoToLine__ go_to_line;
struct __AppEditorViewsFlat__ flat;
struct __AppEditorViewsFolded__ folded;
};
// # __AppEditor__
struct __AppEditor__ {
struct __MemList__ history;
struct __AppEditorViews__ views;
const char *__AppEditor_endLine__;
struct __MemListLink__ *stop_record_link;
struct __MemListLink__ *start_record_link;
void (*do_ptr) (void *ctx); // can be null
void (*onKey_ptr) (void *ctx, __ConsoleAnsiInputKey__ key); // can be null
void *current_ctx; // can be null
const struct __AppEditorViewsVTable__ *current_vtable; // can be null
size_t __AppEditor_fileName_len__;
size_t __AppEditor_pathToClipboard_len__;
size_t __AppEditor_endLine_len__;
size_t lines_drawing;
char __AppEditor_fileName__ [__OsFilePathLen_max__];
char __AppEditor_pathToClipboard__ [__OsFilePathLen_max__];
bool working;
bool recording_macro;
bool inited;
};
// # __App__
struct __App__ {
struct __OsHelper__ __App_osHelper__;
struct __Logger__ __App_logger__;
struct __Console__ console;
struct __Terminal__ terminal;
struct __AppEditor__ editor;
int64_t tick; // time ms
bool working;
};
// typedef to fn_ptrs
// function prototypes
// @ __Ap_fromNibble__
uint8_t __Ap_fromNibble__ (char data);
// @ __Buffer_push__
void __Buffer_push__ ( char *buffer, size_t *buffer_used, size_t pos, char item);
// @ __Buffer_setIndent__
bool __Buffer_setIndent__ ( char *buffer, size_t *buffer_used, size_t buffer_max, size_t new_indent);
// @ __ConsoleOutput_cursorHide__
void __ConsoleOutput_cursorHide__ ( struct __OsConsoleOutput__* console_output);
// @ __Console_showCursor__
void __Console_showCursor__ ( struct __Console__ *console);
// @ __CryptoScalpiHash_do__
void __CryptoScalpiHash_do__ ( struct __CryptoScalpiHash__ *t, const char *src, size_t src_size, char *dest, size_t dest_size);
// @ __CryptoScalpiHash_reset__
void __CryptoScalpiHash_reset__ ( struct __CryptoScalpiHash__ *t);
// @ __CryptoScalpiHash_swapTwoBit__
void __CryptoScalpiHash_swapTwoBit__ ( struct __CryptoScalpiHash__ *t);
// @ __Crypto_sumBytes__
uint8_t __Crypto_sumBytes__ ( const char *data, size_t data_len);
// @ __Crypto_xorBytes__
uint8_t __Crypto_xorBytes__ ( const char *data, size_t data_len);
// @ __Crypto_xorCyclic__
void __Crypto_xorCyclic__ ( char *dest, const char *a, size_t dest_len, const char *b, size_t b_len);
// @ __FileComplete_clear__
bool __FileComplete_clear__(
const char* file_name,
size_t file_name_len
);
// @ __FileComplete_write__
bool __FileComplete_write__(
const char* file_name,
size_t file_name_len,
const char* bytes,
size_t bytes_len
);
// @ __HexCapital_fromNibble__
char __HexCapital_fromNibble__ ( char data);
// @ __Hex_fromByte__
void __Hex_fromByte__ ( char *buffer, uint8_t data);
// @ __Hex_fromNibble__
char __Hex_fromNibble__ ( uint8_t data);
// @ __Logger_init__
void __Logger_init__ (struct __Logger__* t);
// @ __Math_ceilDiv32__
uint32_t __Math_ceilDiv32__ ( uint32_t a, uint32_t b);
// @ __MemListLink_init__
void __MemListLink_init__ ( struct __MemListLink__* link);
// @ __MemListLink_resetLinks__
void __MemListLink_resetLinks__ ( struct __MemListLink__* link);
// @ __MemList_init__
void __MemList_init__ ( struct __MemList__* list);
// @ __MemList_pushLast__
void __MemList_pushLast__ ( struct __MemList__ *list, struct __MemListLink__ *item);
// @ __MemTree_fix_counts__
void __MemTree_fix_counts__ ( struct __MemTree__ *t, size_t delta_count, char action);
// @ __MemTree_fix_nested__
void __MemTree_fix_nested__ ( struct __MemTree__ *t, size_t nested_delta, char action);
// @ __MemTree_getParentOrNull__
struct __MemTree__* __MemTree_getParentOrNull__ ( struct __MemTree__ *tree);
// @ __MemTree_getParent__
void __MemTree_getParent__ ( struct __MemTree__ **ret, struct __MemTree__ *tree);
// @ __MemTree_init__
void __MemTree_init__ ( struct __MemTree__ *t);
// @ __MemTree_popFirstChild__
struct __MemTree__* __MemTree_popFirstChild__ ( struct __MemTree__ *tree);
// @ __MemTree_pushNext__
void __MemTree_pushNext__ ( struct __MemTree__ *t, struct __MemTree__ *item);
// @ __MemTree_traverse__
struct __MemTree__* __MemTree_traverse__ ( struct __MemTree__ *tree);
// @ __Mem_copyBackward__
void __Mem_copyBackward__ ( char* dest, const char* src, size_t size);
// @ __Mem_copy__
void __Mem_copy__ ( char *dest, const char *src, size_t size);
// @ __Mem_find__
bool __Mem_find__ ( size_t *ret_pos, const char *data, size_t data_len, const char *desired, size_t desired_len);
// @ __Mem_isEql__
bool __Mem_isEql__ ( const char a[], const char b[], size_t len);
// @ __Nibble_fromAp__
uint8_t __Nibble_fromAp__ (char data);
// @ __Nibble_fromHexNibble__
char __Nibble_fromHexNibble__ ( char nibble);
// @ __OsConsoleInput_init__
void __OsConsoleInput_init__ ( struct __OsConsoleInput__* t, __OsConsoleInputHandle__ input_hanle);
// @ __OsConsoleOutput_init__
void __OsConsoleOutput_init__ ( struct __OsConsoleOutput__* output, __OsConsoleOutputHandle__ handle);
// @ __OsConsoleOutput_write__
bool __OsConsoleOutput_write__ ( struct __OsConsoleOutput__* os_console_output, const char* data, size_t _len);
// @ __OsFallbackConsole_write__
size_t __OsFallbackConsole_write__ ( void* unused_ctx, char* data, size_t len);
// @ __OsFile_clear__
void __OsFile_clear__ ( __OsFileHandle__ file);
// @ __OsFile_close__
void __OsFile_close__ ( __OsFileHandle__ file);
// @ __OsFile_create__
bool __OsFile_create__ ( __OsFileHandle__ *ret, const char file_name[], size_t file_name_len);
// @ __OsFile_exist__
bool __OsFile_exist__ ( const char* file_name, size_t file_name_len);
// @ __OsFile_getSize__
size_t __OsFile_getSize__ ( __OsFileHandle__ file);
// @ __OsFile_open__
bool __OsFile_open__ (__OsFileHandle__ *ret, const char file_name[], size_t file_name_len);
// @ __OsFile_readToBuffer__
bool __OsFile_readToBuffer__ ( __OsFileHandle__ file, char *buffer, size_t buffer_len, size_t offset);
// @ __OsFile_setPos__
void __OsFile_setPos__ ( __OsFileHandle__ file, size_t pos);
// @ __OsFile_truncate__
void __OsFile_truncate__ ( __OsFileHandle__ file);
// @ __OsFile_write__
bool __OsFile_write__ ( __OsFileHandle__ file, const char* data, size_t data_len, size_t offset);
// @ __OsHelper_deinit__
void __OsHelper_deinit__ ( struct __OsHelper__*t);
// @ __OsHelper_init__
bool __OsHelper_init__ ( struct __OsHelper__* t);
// @ __OsHelper_process__
void __OsHelper_process__ ( struct __OsHelper__* t);
// @ __OsMem_alloc__
bool __OsMem_alloc__ ( uintptr_t *ret_data_addr, size_t size);
// @ __OsMem_free__
void __OsMem_free__ ( uintptr_t ret_data_addr);
// @ __Os_getTick__
uint64_t __Os_getTick__ ();
// @ __Os_sleep__
void __Os_sleep__( uint64_t ms);
// @ __TerminalInput_shift__
void __TerminalInput_shift__ ( struct __TerminalInput__ *t, size_t val);
// @ __Terminal_Output_Cursor_shiftDown__
void __Terminal_Output_Cursor_shiftDown__(struct __Terminal__ *terminal, size_t delta);
// @ __Terminal_Output_Cursor_shiftLeft__
void __Terminal_Output_Cursor_shiftLeft__(struct __Terminal__ *terminal, size_t delta);
// @ __Terminal_Output_Cursor_shiftRight__
void __Terminal_Output_Cursor_shiftRight__(struct __Terminal__ *terminal, size_t delta);
// @ __Terminal_Output_Cursor_shiftUp__
void __Terminal_Output_Cursor_shiftUp__(struct __Terminal__ *terminal, size_t delta);
// @ __Terminal_cursorMove__
void __Terminal_cursorMove__ ( struct __Terminal__ *terminal, size_t pos_x, size_t pos_y);
// @ __Terminal_moveCursorToStartOfLine__
void __Terminal_moveCursorToStartOfLine__ ( struct __Terminal__ *terminal);
// @ __Terminal_resetColors__
void __Terminal_resetColors__ ( struct __Terminal__ *terminal);
// @ __Terminal_setFontStyle__
void __Terminal_setFontStyle__ ( struct __Terminal__ *terminal, const char* font_style, size_t font_style_len);
// @ __Terminal_updateOutputSize__
void __Terminal_updateOutputSize__ ( struct __Terminal__ *terminal);
// @ __Terminal_writeToOutput__
void __Terminal_writeToOutput__ ( struct __Terminal__ *terminal, const char *bytes, size_t bytes_len);
// @ __Terminal_writeToOutput__
void __Terminal_writeToOutput__ ( struct __Terminal__ *terminal, const char *bytes, size_t bytes_len);
// @ __TextAsciiSymbol_isBreakWord__
bool __TextAsciiSymbol_isBreakWord__ ( char symbol);
// @ __TextAsciiSymbol_isWord__
bool __TextAsciiSymbol_isWord__ ( char symbol);
// @ __TextAscii_countIndent__
size_t __TextAscii_countIndent__ ( const char *text, size_t text_len, size_t tabsize);
// @ __TextAscii_isVisible__
bool __TextAscii_isVisible__ ( char byte);
// @ __Text_countIndent__
size_t __Text_countIndent__ ( char* text, size_t text_len, size_t tab_size);
// @ __Text_formatU64ToBuffer__
size_t __Text_formatU64ToBuffer__ ( char *buffer, uint64_t number, size_t min_width);
// @ __ZText_countLen__
size_t __ZText_countLen__ ( const char text[]);
// @ print_trace_example
void print_trace_example ( int anyarg, struct __Trace__* prev_trace);
// @ real_main
bool real_main(int args_len, char** args_ptr);
// @ tests
bool tests ();
// globals
// # __AppEditorViewsEasyMotionHorizontalContext_vtable__
const struct __AppEditorViewsVTable__* __AppEditorViewsEasyMotionHorizontalContext_vtable__;
// # __AppEditorViewsEasyMotionHorizontal_context__
void* __AppEditorViewsEasyMotionHorizontal_context__;
// # __AppEditorViewsEasyMotionVertical_context__
void* __AppEditorViewsEasyMotionVertical_context__;
// # __AppEditorViewsEasyMotionVertical_context_vtable__
const struct __AppEditorViewsVTable__* __AppEditorViewsEasyMotionVertical_context_vtable__;
// # __AppEditorViewsVtable_flat__
struct __AppEditorViewsVTable__ __AppEditorViewsVtable_flat__;
// # __AppEditorViewsVtable_folded__
struct __AppEditorViewsVTable__ __AppEditorViewsVtable_folded__;
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_1__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_1__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x16", .key = __ConsoleAnsiInputKey_ctrl_alt_v__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x27", .key = __ConsoleAnsiInputKey_alt_apostrophe__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x2C", .key = __ConsoleAnsiInputKey_alt_comma__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x2E", .key = __ConsoleAnsiInputKey_alt_dot__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x30", .key = __ConsoleAnsiInputKey_alt_0__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x31", .key = __ConsoleAnsiInputKey_alt_1__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x32", .key = __ConsoleAnsiInputKey_alt_2__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x33", .key = __ConsoleAnsiInputKey_alt_3__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x34", .key = __ConsoleAnsiInputKey_alt_4__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x35", .key = __ConsoleAnsiInputKey_alt_5__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x36", .key = __ConsoleAnsiInputKey_alt_6__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x37", .key = __ConsoleAnsiInputKey_alt_7__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x38", .key = __ConsoleAnsiInputKey_alt_8__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x39", .key = __ConsoleAnsiInputKey_alt_9__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x3B", .key = __ConsoleAnsiInputKey_alt_semicolon__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4D", .key = __ConsoleAnsiInputKey_alt_M__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x61", .key = __ConsoleAnsiInputKey_alt_a__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x62", .key = __ConsoleAnsiInputKey_alt_b__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x63", .key = __ConsoleAnsiInputKey_alt_c__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x64", .key = __ConsoleAnsiInputKey_alt_d__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x65", .key = __ConsoleAnsiInputKey_alt_e__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x66", .key = __ConsoleAnsiInputKey_alt_f__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x67", .key = __ConsoleAnsiInputKey_alt_g__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x68", .key = __ConsoleAnsiInputKey_alt_h__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x69", .key = __ConsoleAnsiInputKey_alt_i__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6A", .key = __ConsoleAnsiInputKey_alt_j__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6B", .key = __ConsoleAnsiInputKey_alt_k__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6C", .key = __ConsoleAnsiInputKey_alt_l__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6E", .key = __ConsoleAnsiInputKey_alt_n__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6F", .key = __ConsoleAnsiInputKey_alt_o__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x6D", .key = __ConsoleAnsiInputKey_alt_m__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x70", .key = __ConsoleAnsiInputKey_alt_p__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x71", .key = __ConsoleAnsiInputKey_alt_q__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x72", .key = __ConsoleAnsiInputKey_alt_r__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x73", .key = __ConsoleAnsiInputKey_alt_s__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x74", .key = __ConsoleAnsiInputKey_alt_t__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x75", .key = __ConsoleAnsiInputKey_alt_u__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x76", .key = __ConsoleAnsiInputKey_alt_v__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x77", .key = __ConsoleAnsiInputKey_alt_w__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x78", .key = __ConsoleAnsiInputKey_alt_x__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x79", .key = __ConsoleAnsiInputKey_alt_y__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x7A", .key = __ConsoleAnsiInputKey_alt_z__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B", .key = __ConsoleAnsiInputKey_alt_open_bracket__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5D", .key = __ConsoleAnsiInputKey_alt_close_bracket__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_2__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_2__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x50", .key = __ConsoleAnsiInputKey_f1__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x51", .key = __ConsoleAnsiInputKey_f2__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x52", .key = __ConsoleAnsiInputKey_f3__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x53", .key = __ConsoleAnsiInputKey_f4__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x64", .key = __ConsoleAnsiInputKey_ctrl_left__ }, // rxvt
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x4F\x63", .key = __ConsoleAnsiInputKey_ctrl_right__ }, // rxvt
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x41", .key = __ConsoleAnsiInputKey_up__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x42", .key = __ConsoleAnsiInputKey_down__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x43", .key = __ConsoleAnsiInputKey_right__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x44", .key = __ConsoleAnsiInputKey_left__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x46", .key = __ConsoleAnsiInputKey_end__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x48", .key = __ConsoleAnsiInputKey_home__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_3__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_3__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x5B\x41", .key = __ConsoleAnsiInputKey_f1__ }, // tty
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x5B\x42", .key = __ConsoleAnsiInputKey_f2__ }, // tty
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x5B\x43", .key = __ConsoleAnsiInputKey_f3__ }, // tty
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x5B\x44", .key = __ConsoleAnsiInputKey_f4__ }, // tty
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x33\x7E", .key = __ConsoleAnsiInputKey_delete__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x35\x7E", .key = __ConsoleAnsiInputKey_page_up__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x36\x7E", .key = __ConsoleAnsiInputKey_page_down__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_4__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_4__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x31\x7E", .key = __ConsoleAnsiInputKey_f1__ }, // rxvt
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x32\x7E", .key = __ConsoleAnsiInputKey_f2__ }, // rxvt
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x35\x7E", .key = __ConsoleAnsiInputKey_f5__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x37\x7E", .key = __ConsoleAnsiInputKey_f6__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x38\x7E", .key = __ConsoleAnsiInputKey_f7__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x39\x7E", .key = __ConsoleAnsiInputKey_f8__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x32\x30\x7E", .key = __ConsoleAnsiInputKey_f9__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x32\x31\x7E", .key = __ConsoleAnsiInputKey_f10__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x32\x33\x7E", .key = __ConsoleAnsiInputKey_f11__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x32\x34\x7E", .key = __ConsoleAnsiInputKey_f12__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_5__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_5__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x32\x41", .key = __ConsoleAnsiInputKey_shift_up__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x33\x41", .key = __ConsoleAnsiInputKey_alt_up__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x35\x41", .key = __ConsoleAnsiInputKey_ctrl_up__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x32\x42", .key = __ConsoleAnsiInputKey_shift_down__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x33\x42", .key = __ConsoleAnsiInputKey_alt_down__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x35\x42", .key = __ConsoleAnsiInputKey_ctrl_down__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x32\x43", .key = __ConsoleAnsiInputKey_shift_right__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x33\x43", .key = __ConsoleAnsiInputKey_alt_right__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x35\x43", .key = __ConsoleAnsiInputKey_ctrl_right__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x36\x43", .key = __ConsoleAnsiInputKey_ctrl_shift_right__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x35\x44", .key = __ConsoleAnsiInputKey_ctrl_left__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x36\x44", .key = __ConsoleAnsiInputKey_ctrl_shift_left__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x32\x44", .key = __ConsoleAnsiInputKey_shift_left__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x31\x3B\x33\x44", .key = __ConsoleAnsiInputKey_alt_left__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x33\x3B\x32\x7E", .key = __ConsoleAnsiInputKey_shift_delete__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_sequences_9__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ __ConsoleAnsi_input_Key_SequenceParser_sequences_9__[] = {
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "\x5B\x32\x37\x3B\x35\x3B\x31\x33\x7E", .key = __ConsoleAnsiInputKey_ctrl_enter__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "[27;5;44~", .key = __ConsoleAnsiInputKey_ctrl_triangular_open_quotation_mark__ },
{ .__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__ = "[27;5;46~", .key = __ConsoleAnsiInputKey_ctrl_triangular_close_quotation_mark__ },
};
// # __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parsers__
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parser__ __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parsers__[] = {
{ .text_len = 9, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_9__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_9__[0] },
{ .text_len = 5, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_5__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_5__[0] },
{ .text_len = 4, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_4__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_4__[0] },
{ .text_len = 3, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_3__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_3__[0] },
{ .text_len = 2, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_2__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_2__[0] },
{ .text_len = 1, .len = __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_sequences_1__), .ptr = &__ConsoleAnsi_input_Key_SequenceParser_sequences_1__[0] },
};
// # __ConsoleAnsi_input_Key_SequenceParser_fromBytes__
bool __ConsoleAnsi_input_Key_SequenceParser_fromBytes__(
struct __ConsoleAnsiInputKey_SequenceParser__ *out,
const char *data,
size_t data_len
) {
if (data[0] == '\x1B') {
const char* user_sequence = &data[1];
size_t user_sequence_len = data_len - 1;
if (user_sequence_len >= 5 and __Mem_isEql__(user_sequence, "\x5B\x4D", 2)) { // mouse
out->sequence = __ConsoleAnsiInputKey_mouse__;
out->used = 6;
return true;
}
// reverse iterating about __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parsers__
for (size_t parser_id = 0; parser_id < __arrayLen__(__ConsoleAnsi_input_Key_SequenceParser_fromBytes_parsers__); parser_id++) {
struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_parser__ *parser = &__ConsoleAnsi_input_Key_SequenceParser_fromBytes_parsers__[parser_id];
size_t check_len = parser->text_len;
if (user_sequence_len >= check_len) {
size_t seq_count = parser->len;
const struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__ *seq_list = parser->ptr;
for (size_t seq_id = 0; seq_id < seq_count; seq_id++) {
const struct __ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo__* seq = &seq_list[seq_id];
if (__Mem_isEql__(user_sequence, &seq->__ConsoleAnsi_input_Key_SequenceParser_fromBytes_SequenceInfo_text__[0], check_len)) {
out->sequence = seq->key;
out->used = check_len + 1;
return true;
}
}
}
}
}
return false;
}
// # __app__
struct __App__ __app__;
// functions
// # Base64_getEncodeSize
uint32_t Base64_getEncodeSize(uint32_t src_len) {
int blocks = __Math_ceilDiv32__(src_len, 3);
return blocks * 4;
}
// # Slice_debug
void Slice_debug(struct Slice* slice, char* name, size_t line) {
if (slice->len == 0) {
printf("%zu: %s is NULL. \r\n", line, name);
} else {
printf("%zu: %s (%zu): \"%.*s", line, name, slice->len, (int)slice->len, slice->ptr);
}
}
// # __AlignedPtr_alloc__
bool __AlignedPtr_alloc__(
uintptr_t *ret_data_addr,
uint8_t data_align, // expected >= 1
size_t data_size // expected >= 1
) {
bool ok = true;
uint8_t gap_size = 0;
size_t allocated_size = data_size + (data_align - 1) + sizeof(gap_size);
uintptr_t allocated_addr;
if (__OsMem_allocAny__(&allocated_addr, allocated_size)) {
// calc size of gap
uint8_t nodled = allocated_addr % data_align;
if (nodled) {
gap_size = data_align - nodled;
}
// write ret_data_addr
uintptr_t data_addr = allocated_addr + gap_size;
*ret_data_addr = data_addr;
// save gap size
* (uint8_t*) (data_addr + data_size) = gap_size;
if (!ok) __OsMem_freeAny__(allocated_addr);
} else {
ok = false;
}
return ok;
}
// # __AlignedPtr_free__
void __AlignedPtr_free__(
uintptr_t data_addr,
size_t data_size
) {
uint8_t gap_size = * (uint8_t*) (data_addr + data_size);
__OsMem_freeAny__(data_addr - gap_size);
}
// # __Ap_fromByte__
void __Ap_fromByte__(
char *buffer, // expected len >= 2
char byte
) {
buffer[0] = __Ap_fromNibble__((byte & 0xF0) >> 4);
buffer[1] = __Ap_fromNibble__(byte & 0x0F);
}
// # __Ap_fromBytesReversed__
void __Ap_fromBytesReversed__(
char *buffer, // expected len >= data_len << 1
const char *data,
size_t data_len
) {
size_t writed = data_len << 1;
for (size_t readed = 0; readed < data_len; readed++) {
writed -= 2;
__Ap_fromByte__(&buffer[writed], data[readed]);
}
}
// # __Ap_fromBytes__
void __Ap_fromBytes__(
char *buffer, // expected len >= data_len << 1
const char *data,
size_t data_len
) {
size_t writed = 0;
for(size_t pos = 0; pos < data_len; pos++) {
__Ap_fromByte__(&buffer[writed], data[pos]);
writed += 2;
}
}
// # __Ap_fromNibble__
uint8_t __Ap_fromNibble__(
char data
) {
if (data <= 16) {
return 'A' + data;
}
return 0;
}
// # __AppEditorHistoryNote_alloc__
bool __AppEditorHistoryNote_alloc__(
struct __AppEditorHistoryNote__ **ptr
) {
return __AlignedPtr_allocAny__( ptr, __Type_getAlign__(struct __AppEditorHistoryNote__), sizeof(struct __AppEditorHistoryNote__) );
}
// # __AppEditorHistoryNote_free__
void __AppEditorHistoryNote_free__(
struct __AppEditorHistoryNote__* ptr
) {
__AlignedPtr_freeAny__(ptr, sizeof(struct __AppEditorHistoryNote__));
}
// # __AppEditorLine_alloc__
bool __AppEditorLine_alloc__(struct __AppEditorLine__ **ptr) {
return __AlignedPtr_allocAny__(ptr, __Type_getAlign__(struct __AppEditorLine__), __Type_getSize__(struct __AppEditorLine__) );
}
// # __AppEditorLine_free__
void __AppEditorLine_free__(struct __AppEditorLine__ *line) {
__AlignedPtr_freeAny__(line, __Type_getSize__(struct __AppEditorLine__));
}
// # __AppEditorLine_init__
void __AppEditorLine_init__(
struct __AppEditorLine__ *t
) {
__MemListLink_init__(&t->link);
__MemTree_init__(&t->tree);
t->text_len = 0;
}
// # __AppEditorLine_setIndent__
bool __AppEditorLine_setIndent__( // TODO check all uses this fn
struct __AppEditorLine__ *line,
size_t new_indent // expected < __AppEditorLineLen_max__ - line->text_len
) {
return __Buffer_setIndent__(&line->text[0], &line->text_len, __AppEditorLineLen_max__, new_indent);
}
// # __AppEditorLine_setText__
void __AppEditorLine_setText__ (
struct __AppEditorLine__ *line,
char *text_ptr,
size_t text_len // expected < __AppEditorLineLen_max__
) {
line->text_len = text_len;
__Mem_copy__(&line->text[0], text_ptr, text_len);
}
// # __AppEditorListOfLine_writeToFile__
bool
__AppEditorListOfLine_writeToFile__(
struct __MemList__ *lines,
const char* file_name,
size_t file_name_len
) {
bool ok = true;
if (lines->count == 0) {
ok = __FileComplete_clear__(file_name, file_name_len);
} else if (lines->count == 1) {
struct __MemListLink__* link = lines->first;
struct __AppEditorLine__* line = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorLine__, link, link);
if (line->text_len > 0) {
ok = __FileComplete_write__(file_name, file_name_len, &line->text[0], line->text_len);
} else {
ok = __FileComplete_clear__(file_name, file_name_len);
}
} else { // lines > 1
const char* end_line = __app__.editor.__AppEditor_endLine__;
size_t end_line_len = __app__.editor.__AppEditor_endLine_len__;
size_t full_len = 0; // garanty > 0 becouse lines > 1
{ // count fill len
struct __MemListLink__* link = lines->first;
struct __AppEditorLine__* line = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorLine__, link, link);
full_len += line->text_len;
link = link->next;
while (link) {
struct __AppEditorLine__* line = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorLine__, link, link);
full_len += end_line_len + line->text_len;
link = link->next;
}
}
char* buffer;
if (__AlignedPtr_allocAny__(&buffer, 4, full_len)) { // use aligned just for speed
// save to buffer
size_t writed = 0;
{ // convert lines to one buffer
struct __MemListLink__* link = lines->first; // garanty not null by lines > 1
// write first line
struct __AppEditorLine__* first_line = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorLine__, link, link);
if (first_line->text_len > 0) {
__Mem_copy__(&buffer[writed], &first_line->text[0], first_line->text_len);
writed += first_line->text_len;
}
link = link->next;
// write other lines
while (link) {
__Mem_copy__(&buffer[writed], end_line, end_line_len);
writed += end_line_len;
struct __AppEditorLine__* line = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorLine__, link, link);
if (line->text_len > 0) {
__Mem_copy__(&buffer[writed], &line->text[0], line->text_len);
writed += line->text_len;
}
link = link->next;
}
}
// write to file
if (__FileComplete_write__(file_name, file_name_len, buffer, writed)) {
} else { // file not rewrited
ok = false;
}
__AlignedPtr_freeAny__(buffer, full_len);
} else { // memory not allocated
ok = false;
}
}
return ok;
}
// # __AppEditorViewsEasyMotionHorizontal_draw__
void __AppEditorViewsEasyMotionHorizontal_draw__() {
struct __Terminal__* terminal = &__app__.terminal;
__Terminal_setFontStyle__(&__app__.terminal, __AppEditorTheme_easy_motion__, __CText_len__(__AppEditorTheme_easy_motion__));
size_t voy = __AppEditorViewsEasyMotionHorizontalContext_vtable__->getOffsetY(__AppEditorViewsEasyMotionHorizontal_context__);
size_t pos = 0;
char rune = 'a';
while (true) {
if (pos >= terminal->output.size.x - 1 - __AppEditorViewsEasyMotionHorizontal_step__) break;
__Terminal_cursorMove__(terminal, pos, voy);
__Terminal_writeToOutput__(terminal, &rune, 1);
if (rune == '9') {
break;
} else if (rune == 'z') {
rune = '0';
} else {
rune += 1;
}
pos += __AppEditorViewsEasyMotionHorizontal_step__;
}
}
// # __AppEditorViewsEasyMotionHorizontal_moveTo__
void __AppEditorViewsEasyMotionHorizontal_moveTo__(
size_t pos
) {
size_t spx = __AppEditorViewsEasyMotionHorizontalContext_vtable__->getSymbolPosX(__AppEditorViewsEasyMotionHorizontal_context__);
size_t vox = __AppEditorViewsEasyMotionHorizontalContext_vtable__->getOffsetX(__AppEditorViewsEasyMotionHorizontal_context__);
__AppEditorViewsEasyMotionHorizontalContext_vtable__->goToSymbolPosX(__AppEditorViewsEasyMotionHorizontal_context__, spx - vox + pos);
__AppEditorViewsEasyMotionHorizontalContext_vtable__->setAsView(__AppEditorViewsEasyMotionHorizontal_context__);
}
// # __AppEditor_addKeyToHistory__
bool __AppEditor_addKeyToHistory__(
struct __AppEditor__ *editor,
__ConsoleAnsiInputKey__ key
) {
bool ok = true;
struct __AppEditorHistoryNote__ *hn;
if ( __AppEditorHistoryNote_alloc__(&hn)) {
hn->key = key;
struct __MemListLink__ *link = &hn->link;
__MemListLink_init__(link);
__MemList_pushLast__(&editor->history, link);
if (!ok) __AppEditorHistoryNote_free__(hn);
} else {
ok = false;
}
return ok;
}
// # __AppEditor_changeStatus__
void __AppEditor_changeStatus__(
const char *text,
size_t text_len
) {
__ConsoleOutput_cursorHide__(&__app__.console.output);
__Terminal_cursorMove__(&__app__.terminal, 0, __app__.terminal.output.size.y - 1);
__Terminal_setFontStyleCText__(&__app__.terminal, __AppEditorTheme_notification__);
__Terminal_writeToOutput__(&__app__.terminal, text, text_len);
__OsConsoleOutput_write__(&__app__.console.output, __ConsoleAnsi_output_clear_to_end_line__, 0);
__Terminal_resetColors__(&__app__.terminal);
__Console_showCursor__(&__app__.console);
}
// # __AppEditor_playMacro__
/* // use me after port fn __AppEditor_onKey__
bool __AppEditor_playMacro__(struct __AppEditor__ *t) {
bool ok = true;
if (t->recording_macro != true) {
struct __MemListLink__ *start = t->start_record_link;
struct __MemListLink__ *end = t->stop_record_link;
if ( start and end ) {
struct __MemListLink__ *next_link = start->next; // skipped start recording itself
while ( next_link and (next_link != stop)) {
struct __AppEditorHistoryNote__ *history_note = __TypedPtr_getParentPtrFromFieldPtr__(struct __AppEditorHistoryNote__, link, next_link));
struct __ConsoleAnsiInputKey__ key = history_note->key;
__AppEditor_onKey__(t, key);
next_link = next_link->next;
}
} else {
ok = false;
__AppEditor_changeStatusCText__("macro not recorded.");
}
} else {
ok = false;
__AppEditor_changeStatusCText__("not aviable while recording");
}
return ok;
}
*/
// # __AppEditor_startRecordMacro__
bool __AppEditor_startRecordMacro__(
struct __AppEditor__ *t
) {
bool ok = true;
if (t->recording_macro != true) {
if (__AppEditor_addKeyToHistory__(t, 0)) {
t->recording_macro = true;
t->start_record_link = t->history.last;
t->stop_record_link = NULL;
__AppEditor_changeStatusCText__("start recording macro.");
} else {
ok = false;
__AppEditor_changeStatusCText__("Unexpected error"); // todo add line
}
} else {
ok = false;
__AppEditor_changeStatusCText__("macro is recording right now"); // todo add line
}
return ok;
}
// # __AppEditor_stopRecordMacro__
bool __AppEditor_stopRecordMacro__(struct __AppEditor__ *t) {
bool ok = true;
if (t->recording_macro == true) {
if (__AppEditor_addKeyToHistory__(t, 0)) {
t->stop_record_link = t->history.last;
t->recording_macro = false;
__AppEditor_changeStatusCText__("stop recording macro.");
} else {
ok = false;
}
} else {
ok = false;
__AppEditor_changeStatusCText__("macro not recording right now.");
}
return ok;
}
// # __AppEditor_stop__
void __AppEditor_stop__(struct __AppEditor__ *t) {
__Terminal_cursorMove__(&__app__.terminal, 0, t->lines_drawing);
__OsConsoleOutput_write__(&__app__.console.output, "\n", 0);
printf("file: {%.*s}", t->__AppEditor_fileName_len__ , &t->__AppEditor_fileName__[0]);
{ // draw_line_num
void *ctx = t->current_ctx; if (ctx) {
const struct __AppEditorViewsVTable__ *vt = t->current_vtable; if (vt) {
size_t (*cln) (void *t) = vt->countLineNum; if (cln) {
size_t current_line = cln(ctx);
printf(" {%d}", current_line);
}
}
}
}
__OsConsoleOutput_write__(&__app__.console.output, "\r\n", 0);
t->working = false;
}
// # __App_deinit__
void __App_deinit__(struct __App__* app) {
__OsHelper_deinit__(&app->__App_osHelper__);
}
// # __App_init__
bool __App_init__(struct __App__* t) {
bool ok = true;
__Logger_init__(&t->__App_logger__); // preinit console output for debug
if (__OsHelper_init__(&t->__App_osHelper__)) {
t->tick = __Os_getTick__();
if (!ok) __OsHelper_deinit__(&t->__App_osHelper__);
} else {
ok = false;
printf("%d app.__App_osHelper__ not inited\r\n", __LINE__);
}
return ok;
}
// # __App_process__
bool __App_process__(struct __App__* t) {
bool ok = true;
__OsHelper_process__(&t->__App_osHelper__);
return ok;
}
// # __App_waitToNextFrame__
void __App_waitToNextFrame__(struct __App__* t) {
uint64_t expected_frame_end_time = t->tick + __Time_msPerS__ / __App_expectedFps__;
uint64_t resulting_frame_end_time = __Os_getTick__();
if (resulting_frame_end_time > expected_frame_end_time + 120) {
uint64_t delta = resulting_frame_end_time - expected_frame_end_time;
printf("%d \t hitch detection: %zu delta: %zu ms \r\n", __LINE__, t->tick, delta);
}
uint64_t delay_sleep = 1;
if (resulting_frame_end_time < expected_frame_end_time) {
delay_sleep = expected_frame_end_time - resulting_frame_end_time;
}
__Os_sleep__(delay_sleep);
t->tick = resulting_frame_end_time + delay_sleep;
}
// # __Ascii_getFirstVisibleCharOrEnd__
size_t __Ascii_getFirstVisibleCharOrEnd__(
const char *ptr,
size_t len // expected > 0
) {
size_t pos = 0;
for (;pos < len; pos++) {
char byte = ptr[pos];
if (__TextAscii_isVisible__(byte)) break;
}
return pos;
}
// # __Ascii_isEmpty__
bool __Ascii_isEmpty__(
const char *ptr,
size_t len // expected > 0
) {
return __Ascii_getFirstVisibleCharOrEnd__(ptr, len) < len;
}
// # __Base64_encode3Bytes__
void __Base64_encode3Bytes__(unsigned char in[3], char out[4]) {
out[0] = __Base64StandardAlphabet_chars__[(in[0] & 0b11111100) >> 2];
out[1] = __Base64StandardAlphabet_chars__[((in[0] & 0b00000011) << 4) | ((in[1] & 0b11110000) >> 4)];
out[2] = __Base64StandardAlphabet_chars__[((in[1] & 0b00001111) << 2) | ((in[2] & 0b11000000) >> 6)];
out[3] = __Base64StandardAlphabet_chars__[(in[2] & 0b00111111)];
}
// # __Base64_encode__
void __Base64_encode__(char* src, size_t src_len, char* out) {
// EXAMPLE
// Source ASCII text: "Ma"
// Character M a
// Octets 77 (0x4d) 97 (0x61)
// Bits 0 1 0 0 1 1 0 1|0 1 1 0 0 0 0 1|0 0 _ _ _ _ _ _|
// Base64 0 1 0 0 1 1|0 1 0 1 1 0|0 0 0 1 0 0|_ _ _ _ _ _|
// Sextets 19 22 4 Padding
// Character T W E =
// Octets 84 (0x54) 87 (0x57) 69 (0x45) 61 (0x3D)
// parse normal octets
char* end_of_src = src + src_len;
while(true) {
if (src + 3 > end_of_src) break;
__Base64_encode3Bytes__((void*) src, out);
src += 3;
out += 4;
}
// parse extra_bytes
size_t extra_bytes = end_of_src - src;
if (extra_bytes > 0 ) {
char b[3] = {0};
__Mem_copy__(b, src, extra_bytes);
__Base64_encode3Bytes__((void*)b, out);
out += 4;
// add padding
size_t pads = 3 - extra_bytes;
for (char* pad = out - pads ;pad < out; pad++) {*pad = '=';}
}
}
// # __BitsU32_disable__
uint32_t __BitsU32_disable__(uint32_t value, uint32_t mask) {
return value & (~mask);
}
// # __BitsU32_enable__
uint32_t __BitsU32_enable__(uint32_t value, uint32_t mask) {
return value | mask;
}
// # __BitsU32_toggle__
uint32_t __BitsU32_toggle__(uint32_t value, uint32_t mask, bool new_state) {
if (new_state) {
return __BitsU32_enable__(value, mask);
} else {
return __BitsU32_disable__(value, mask);
}
}
// # __Buffer_addIndent__
void __Buffer_addIndent__(
char *buffer,
size_t *buffer_used,
size_t count // expected < (buffer_max - *buffer_used)
) {
size_t pos = 0;
while (pos < count) {
__Buffer_push__(buffer, buffer_used, 0, ' ');
pos = pos + 1;
}
}
// # __Buffer_addIndent_check__
bool
__Buffer_addIndent_check__(
char *buffer,
size_t *buffer_used,
size_t buffer_max,
size_t count
) {
size_t space = buffer_max - *buffer_used;
return space > count;
}
// # __Buffer_pop__
char __Buffer_pop__(
char *buffer,
size_t *buffer_used, // expected (*) > 0
size_t pos // expected <= buffer_used
) {
char ret = buffer[pos];
(*buffer_used)--;
if (pos < *buffer_used) {
__Mem_copy__(&buffer[pos], &buffer[pos + 1], *buffer_used - pos);
}
return ret;
}
// # __Buffer_pop_check__
bool __Buffer_pop_check__(
size_t buffer_used,
size_t pos
) {
return ((buffer_used > 0) and (pos < buffer_used));
}
// # __Buffer_push__
void __Buffer_push__(
char *buffer,
size_t *buffer_used, // expected < allocated
size_t pos, // expected < allocated
char item
) {
if (pos < *buffer_used) { // shiftSymbolsToRight
__Mem_copyBackward__(&buffer[pos + 1], &buffer[pos], *buffer_used - pos);
}
buffer[pos] = item;
(*buffer_used)++;
}
// # __Buffer_removeIndent__
void
__Buffer_removeIndent__(
char *buffer,
size_t *buffer_used, // expected >= count
size_t count // expected <= buffer_used
) {
size_t pos = 0;
while (pos < count) {
__Buffer_pop__(
buffer,
buffer_used, // (*) > 0 becouse expected *buffer_used >= loop_count
0
);
pos += 1;
}
}
// # __Buffer_setIndent__
bool
__Buffer_setIndent__(
char *buffer,
size_t *buffer_used,
size_t buffer_max,
size_t new_indent // expected < buffer_max
) {
bool ok = true;
size_t indent = __Text_countIndent__(buffer, *buffer_used, 1);
if (new_indent != indent) {
if (new_indent > indent) {
size_t delta = new_indent - indent;
if (__Buffer_addIndent_check__(buffer, buffer_used, buffer_max, delta)) {
__Buffer_addIndent__(buffer, buffer_used, delta);
} else {
ok = false;
}
} else { // new_indent < indent
size_t delta = indent - new_indent;
__Buffer_removeIndent__(buffer, buffer_used, delta);
}
}
return ok;
}
// # __Byte_fromAp__
uint8_t __Byte_fromAp__(
const char* data // expected len >= 2
) {
char fo = __Nibble_fromAp__(data[0]);
char of = __Nibble_fromAp__(data[1]);
return (fo << 4) | of;
}
// # __Byte_fromHex__
char __Byte_fromHex__(char* hex_byte) {
char b_F0 = __Nibble_fromHexNibble__(hex_byte[0]);
char b_0F = __Nibble_fromHexNibble__(hex_byte[1]);
return (b_F0 << 4) | b_0F;
}
// # __Bytes_fromApReversed__
void __Bytes_fromApReversed__(
char *buffer, // expected len >= ap_len >> 1
const char *ap,
size_t ap_len // expected >= 2, expected odd
) {
size_t ap_pos = ap_len;
size_t writed = 0;
while (ap_pos > 0) {
ap_pos -= 2; // garanty ap_pos < ap_len
buffer[writed] = __Byte_fromAp__(&ap[ap_pos]);
writed += 1;
}
}
// # __Bytes_fromAp__
void __Bytes_fromAp__(
char *buffer, // expected len >= ap_len >> 1
const char *ap,
size_t ap_len
) {
size_t readed = 0;
size_t writed = 0;
while(readed < ap_len) {
buffer[writed] = __Byte_fromAp__(&ap[readed]);
writed += 1;
readed += 2;
}
}
// # __Bytes_fromHex__ // REPLACED ARG ORDER!
void __Bytes_fromHex__(
char* buffer_ptr, // expected len >= hex_len >> 2
char* hex,
size_t hex_len
) {
size_t end_pos = hex_len >> 1;
for(size_t pos = 0; pos < end_pos; pos++) {
buffer_ptr[pos] = __Byte_fromHex__(&hex[pos*2]);
}
}
// # __ConsoleOutput_cursorHide__
void __ConsoleOutput_cursorHide__(struct __OsConsoleOutput__* console_output) {
__OsConsoleOutput_write__(console_output, __ConsoleAnsi_output_cursor_hide__, 0);
}
// # __Console_clearLine__
void __Console_clearLine__(struct __Console__ *console) {
__OsConsoleOutput_writeCText__(&console->output, __ConsoleAnsi_output_clear_line__);
}
// # __Console_init__
void __Console_init__(
struct __Console__ *t,
__OsConsoleInputHandle__ input_handle,
__OsConsoleOutputHandle__ output_handle
) {
__OsConsoleInput_init__(&t->input, input_handle);
__OsConsoleOutput_init__(&t->output, output_handle);
}
// # __Console_showCursor__
void __Console_showCursor__(struct __Console__ *console) {
__OsConsoleOutput_writeCText__(&console->output, __ConsoleAnsi_output_cursor_show__);
}
// # __CryptoRandom_do__
void __CryptoRandom_do__(
struct __CryptoRandom__ *t,
char *out_buffer,
size_t buffer_len
) {
struct __CryptoScalpiHash__ hasher;
__CryptoScalpiHash_reset__(&hasher);
__CryptoScalpiHash_doAny__(&hasher, &t->seed, sizeof(t->seed), out_buffer, buffer_len);
t->seed += 1;
}
// # __CryptoScalpiHash_doBit__
void __CryptoScalpiHash_doBit__(
struct __CryptoScalpiHash__* t,
uint8_t bit,
char *dest, // canbe not zeroed
size_t dest_len
) {
uint8_t bb = 2 - bit;
for (int i = 0; i < dest_len; i++) {
uint8_t *output_byte = (uint8_t*) &dest[i];
t->a += *output_byte;
t->b += bb;
__CryptoScalpiHash_swapTwoBit__(t);
*output_byte += t->mask;
}
}
// # __CryptoScalpiHash_doByte__
void __CryptoScalpiHash_doByte__(
struct __CryptoScalpiHash__ *t,
uint8_t byte,
char *dest,
size_t size
) {
uint8_t pos = 0;
while (true) {
uint8_t bit = (byte >> pos) & 1;
__CryptoScalpiHash_doBit__(t, bit, dest, size);
if (pos == 7) break;
pos += 1;
}
}
// # __CryptoScalpiHash_do__
void __CryptoScalpiHash_do__(
struct __CryptoScalpiHash__ *t,
const char *src,
size_t src_size,
char *dest,
size_t dest_size
) {
for (int i = 0; i < src_size; i++) {
__CryptoScalpiHash_doByte__(t, src[i], dest, dest_size);
}
}
// # __CryptoScalpiHash_reset__
void __CryptoScalpiHash_reset__(
struct __CryptoScalpiHash__ *t
) {
t->mask = 0b00001111;
t->a = 0;
t->b = 0;
}
// # __CryptoScalpiHash_swapTwoBit__
void __CryptoScalpiHash_swapTwoBit__(struct __CryptoScalpiHash__ *t) {
// truncate a and b to 3 bit.
uint8_t a = t->a & 0b111;
uint8_t b = t->b & 0b111;
// save bits with swap
uint8_t tmp_a = (t->mask & 1 << a) >> a << b;
uint8_t tmp_b = (t->mask & 1 << b) >> b << a;
uint8_t tmp = tmp_a | tmp_b;
// clear bits
t->mask &= 255 - (1 << a);
t->mask &= 255 - (1 << b);
// set last bits
t->mask |= tmp;
}
// # __Crypto_sumBytes__
uint8_t __Crypto_sumBytes__(
const char *data,
size_t data_len
) {
char ret = 0;
for (size_t pos = 0; pos < data_len; pos++) {
ret += data[pos];
}
return ret;
}
// # __Crypto_xorBytes__
uint8_t __Crypto_xorBytes__(
const char *data,
size_t data_len
) {
char ret = 0;
for (size_t pos = 0; pos < data_len; pos++) {
ret ^= data[pos];
}
return ret;
}
// # __Crypto_xorCyclic__
void __Crypto_xorCyclic__(
char *dest,
const char *a,
size_t dest_len,
const char *b,
size_t b_len
) {
// expected dest_len == a.len
size_t ci = 0; // cyclical iterator
for (size_t pos = 0; pos < dest_len; pos++) {
dest[pos] = a[pos] ^ b[ci];
ci += 1;
if (ci == b_len) ci = 0;
}
}
// # __FileComplete_clear__
bool __FileComplete_clear__(
const char* file_name,
size_t file_name_len
) {
bool ok = true;
__OsFileHandle__ file;
if (__OsFile_open__(&file, file_name, file_name_len)) {
__OsFile_clear__(file);
__OsFile_close__(file);
} else {
ok = false;
}
return ok;
}
// # __FileComplete_read__
bool __FileComplete_read__(
uintptr_t *ret_data_ptr,
size_t *ret_file_data_size, // not zeroed by this func. increment instead.
const char* file_name,
size_t file_name_len,
uint8_t align
) {
bool ok = true;
__OsFileHandle__ file;
if(__OsFile_exist__(file_name, file_name_len)) {
ok = __OsFile_open__(&file, file_name, file_name_len);
} else {
ok = __OsFile_create__(&file, file_name, file_name_len);
}
if (ok) {
size_t file_size = __OsFile_getSize__(file);
*ret_file_data_size += file_size;
char* file_data;
if (__AlignedPtr_allocAny__(ret_data_ptr, align, file_size)) {
if ( __OsFile_readToAny__( file, ret_data_ptr, file_size, 0 )) {
} else {
ok = false;
}
} else {
ok = false;
}
__OsFile_close__(file);
}
return ok;
}
// # __FileComplete_write__
bool __FileComplete_write__(
const char* file_name,
size_t file_name_len,
const char* bytes,
size_t bytes_len
) {
bool ok = true;
__OsFileHandle__ file;
if(__OsFile_exist__(file_name, file_name_len)) {
ok = __OsFile_open__(&file, file_name, file_name_len);
} else {
ok = __OsFile_create__(&file, file_name, file_name_len);
}
if (ok) {
if (__OsFile_write__(file, bytes, bytes_len, 0)) {
__OsFile_truncate__(file);
} else {
ok = false;
}
__OsFile_close__(file);
}
return ok;
}
// # __File_clear__
void __File_clear__(
__OsFileHandle__ file
) {
__OsFile_setPos__(file, 0);
__OsFile_truncate__(file);
}
// # __Finder_init__
void __Finder_init__(
struct Finder* t,
char* text,
size_t text_len,
char* desired,
size_t desired_len
) {
t->pos = 0;
t->text.ptr = text;
t->text.len = text_len;
t->desired.ptr = desired;
t->desired.len = desired_len;
}
// # __Finder_next__
bool __Finder_next__(
struct Finder* t,
size_t* out_pos
) {
if (t->pos != t->text.len) {
char *data = &t->text.ptr[t->pos];
size_t data_len = t->text.len - t->pos;
size_t finded = 0;
if ( true
and t->desired.len > 0
and data_len >= t->desired.len
and __Mem_find__(
&finded,
data,
data_len,
t->desired.ptr,
t->desired.len
)
) {
size_t new_pos = t->pos + finded;
t->pos = new_pos + t->desired.len;
*out_pos = new_pos;
return true;
}
}
return false;
}
// # __FormatsHex_packBytesReverse__
void __FormatsHex_packBytesReverse__(
char *hex, // expected len >= __Hex_lenFromBytesLen__(data_len)
char *data,
size_t data_len // expected >= 1
) {
size_t hex_pos = data_len << 1;
for (size_t data_pos = 0; data_pos < data_len; data_pos++) {
hex_pos -= 2;
__Hex_fromByte__(&hex[hex_pos], data[data_pos]);
}
}
// # __HexCapital_fromByte__
void Hex_packByte_H(char data, char* hex_byte) {
hex_byte[0] = __HexCapital_fromNibble__((data & 0xF0) >> 4);
hex_byte[1] = __HexCapital_fromNibble__(data & 0x0F);
}
// # __HexCapital_fromBytes__
void Hex_pack_H(char* hex, char* data, size_t data_len) {
// expected hex.len is __Hex_lenFromBytesLen__(len)
for(size_t pos = 0; pos < data_len; pos++) {
Hex_packByte_H(data[pos], &hex[pos * 2]);
}
}
// # __HexCapital_fromNibble__
char __HexCapital_fromNibble__(char data) {
if (data <= 9) return '0' + data;
if (data <= 15) return 'A' + data - 10;
return 0;
}
// # __Hex_fromByte__
void __Hex_fromByte__(
char *buffer,
uint8_t data
) {
buffer[0] = __Hex_fromNibble__((data & 0xF0) >> 4);
buffer[1] = __Hex_fromNibble__(data & 0x0F);
}
// # __Hex_fromBytes__
void __Hex_fromBytes__(
char *hex, // expected len >= __Hex_lenFromBytesLen__(data_len)
char *data,
size_t data_len
) {
for(size_t pos = 0; pos < data_len; pos++) {
__Hex_fromByte__(&hex[pos << 1], data[pos]);
}
}
// # __Hex_fromNibble__
char __Hex_fromNibble__(uint8_t data) {
if (data <= 9) return (uint8_t)'0' + data;
if (data <= 15) return (uint8_t)'a' + data - 10;
return 0;
}
// # __Logger_init__
void __Logger_init__ (struct __Logger__* t) {
for (int i = 0; i < __arrayLen__(t->writers); i++) {
struct __Writer__* w = &t->writers[i];
w->context = 0;
w->write = 0;
}
}
// # __Logger_writeToSelf__
void __Logger_writeToSelf__(struct __Logger__* t, const char bytes[], size_t len) {
for (size_t i = 0; i < __arrayLen__(t->writers); i++) {
struct __Writer__* w = &t->writers[i];
if (w->write) {
size_t writed = w->write(w->context, bytes, len);
}
}
}
// # __Math_ceilDiv32__
uint32_t __Math_ceilDiv32__(uint32_t a, uint32_t b) {
return (a + b - 1) / b;
}
// # __Math_linearInterpolationWithCoef__
__Float32__ __Math_linearInterpolationWithCoef__(
__Float32__ r1,
__Float32__ r2,
__Float32__ coef
) {
return r1 + coef * (r2 - r1);
}
// # __Math_linearInterpolation__
__Float32__ __Math_linearInterpolation__(
__Float32__ v1,
__Float32__ v2,
__Float32__ r1,
__Float32__ r2,
__Float32__ vx
) {
return r1 + (vx - v1) / (v2 - v1) * (r2 - r1);
}
// # __MemListLink_init__
void __MemListLink_init__(
struct __MemListLink__* link
) {
__MemListLink_resetLinks__(link);
}
// # __MemListLink_isFirst__
bool
__MemListLink_isFirst__(
struct __MemListLink__* link
) {
struct __MemListLink__* prev = link->prev;
bool prev_is_null = (link->prev) == NULL;
return prev_is_null;
}
// # __MemListLink_resetLinks__
void __MemListLink_resetLinks__(struct __MemListLink__* link) {
link->prev = NULL;
link->next = NULL;
link->list = NULL;
}
// # __MemList_init__
void __MemList_init__(
struct __MemList__* list
) {
list->first = NULL;
list->last = NULL;
list->count = 0;
}
// # __MemList_pop__
void __MemList_pop__(
struct __MemList__ *list,
struct __MemListLink__ *item // expected item linked to list
) {
if (list->count == 1) {
list->first = NULL;
list->last = NULL;
__MemListLink_resetLinks__(item);
} else { // count > 1 becouse != 1 and item is linked to list
if (item == list->first) {
struct __MemListLink__ *next = item->next; // not null becouse item is first and count > 1
list->first = next;
next->prev = NULL;
if (list->count == 2) {
list->last = next;
}
} else if (item == list->last) {
struct __MemListLink__ *prev = item->prev; // cannot be null becouse item is last and count > 1
list->last = prev;
prev->next = NULL;
if (list->count == 2) {
list->first = prev;
}
} else { // non first or last
// flatten prev and next
struct __MemListLink__ *next = item->next; // item is not last
struct __MemListLink__ *prev = item->prev; // item is not first
next->prev = prev;
prev->next = next;
}
__MemListLink_resetLinks__(item);
}
list->count -= 1;
}
// # __MemList_pushAfter__
void __MemList_pushAfter__(
struct __MemList__* list,
struct __MemListLink__* after,
struct __MemListLink__* item
) {
struct __MemListLink__* next = after->next;
if (next) {
next->prev = item;
} else { // after is last
list->last = item;
}
item->next = next;
after->next = item;
item->prev = after;
item->list = list;
list->count += 1;
}
// # __MemList_pushBefore__
void __MemList_pushBefore__(
struct __MemList__* list,
struct __MemListLink__* before,
struct __MemListLink__* item
) {
struct __MemListLink__* prev = before->prev;
if (prev) { // non firts
prev->next = item;
} else { // is first
list->first = item;
}
item->prev = prev;
before->prev = item;
item->next = before;
item->list = list;
list->count += 1;
}
// # __MemList_pushFirst__
void __MemList_pushFirst__(
struct __MemList__ *list,
struct __MemListLink__ *item // expected freed item
) {
struct __MemListLink__* first = list->first;
if (first) { // list not empty
first->prev = item;
item->next = first;
} else { // list is empty
list->last = item;
}
list->first = item;
item->list = list;
list->count += 1;
}
// # __MemList_pushLast__
void __MemList_pushLast__(
struct __MemList__ *list,
struct __MemListLink__ *item
) {
struct __MemListLink__* last = list->last;
if (last) {
last->next = item;
item->prev = last;
} else { // list empty
list->first = item;
}
list->last = item;
item->list = list;
list->count += 1;
}
// # __MemTree_fix_counts__
void __MemTree_fix_counts__(
struct __MemTree__ *t,
size_t delta_count,
char action // __MemTree_fix_counts_Action__
) {
struct __MemTree__ *tree = t;
if (action == __MemTree_fix_counts_Action_plus__) {
while (tree) {
tree->count += delta_count;
tree = __MemTree_getParentOrNull__(tree);
}
} else { // minus
while (tree) {
tree->count -= delta_count;
tree = __MemTree_getParentOrNull__(tree);
}
}
}
// # __MemTree_getParentOrNull__
struct __MemTree__* // can be null
__MemTree_getParentOrNull__ (
struct __MemTree__ *tree
) {
struct __MemList__ *list = tree->link.list;
if (list) {
struct __MemTree__ *parent = __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, childs, list);
return parent;
}
return NULL;
};
// # __MemTree_getParent__
void __MemTree_getParent__ (
struct __MemTree__ **ret,
struct __MemTree__ *tree // expected child
) {
struct __MemList__ *list = tree->link.list;
*ret = __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, childs, list);
};
// # __MemTree_getPrev__
struct __MemTree__*
__MemTree_getPrev__(
struct __MemTree__ *tree // expected __MemTree_isFirst__(tree) = false;
) {
struct __MemListLink__ *prev_link = tree->link.prev;
return __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, link, prev_link);
}
// # __MemTree_growChilds__
// convert childs to siblings
void __MemTree_growChilds__(
struct __MemTree__ *tree // expected tree with tree.childs.count > 0 and __MemTree_isChild__(tree) == true
) {
struct __MemList__ *childs = &tree->childs;
size_t *childs_count = &childs->count;
while(*childs_count > 0) {
struct __MemTree__ *child = __MemTree_popFirstChild__(tree);
__MemTree_pushNext__(tree, child);
}
}
// # __MemTree_init__
void __MemTree_init__(
struct __MemTree__ *t
) {
t->count = 0;
t->nested = 0;
__MemList_init__ (&t->childs);
__MemListLink_init__ (&t->link);
}
// # __MemTree_isChild__
bool __MemTree_isChild__ (
struct __MemTree__ *tree
) {
return tree->link.list != NULL;
};
// # __MemTree_isFirst__
bool __MemTree_isFirst__(
struct __MemTree__ *tree
) {
return tree->link.prev == NULL;
}
// # __MemTree_popFirstChild__
struct __MemTree__*
__MemTree_popFirstChild__(
struct __MemTree__ *tree // expected tree.childs.count > 0
) {
struct __MemListLink__ *child_link = tree->childs.first;
__MemList_pop__(&tree->childs, child_link);
return __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, link, child_link);
}
// # __MemTree_pop__
// pop self from parent
void __MemTree_pop__(
struct __MemTree__ *t // expected __MemTree_isChild__(tree) == true
) {
struct __MemTree__ *parent;
__MemTree_getParent__(&parent, t);
__MemList_pop__(&parent->childs, &t->link);
__MemTree_fix_counts__(parent, t->count + 1, __MemTree_fix_counts_Action_minus__);
__MemTree_fix_nested__(t, t->nested, __MemTree_fix_nested_Action_minus__);
}
// # __MemTree_pushChild__
void __MemTree_pushChild__(
struct __MemTree__ *t,
struct __MemTree__ *item
) {
__MemTree_fix_nested__(item, t->nested + 1, __MemTree_fix_nested_Action_plus__);
__MemList_pushLast__(&t->childs, &item->link);
__MemTree_fix_counts__(t, item->count + 1, __MemTree_fix_counts_Action_plus__);
}
// # __MemTree_fix_nested__
void __MemTree_fix_nested__(
struct __MemTree__ *t,
size_t nested_delta,
char action // __MemTree_fix_nested_Action__
) {
struct __MemTree__ *tree = t;
if (action == __MemTree_fix_nested_Action_plus__) {
while (tree) {
tree->nested += nested_delta;
tree = __MemTree_traverse__(tree);
}
} else { // minus
while (tree) {
tree->nested -= nested_delta;
tree = __MemTree_traverse__(tree);
}
}
}
// # __MemTree_pushNext__
void __MemTree_pushNext__(
struct __MemTree__ *t, // expected as child of another tree
struct __MemTree__ *item
) {
struct __MemTree__ *parent;
__MemTree_getParent__(&parent, t);
__MemTree_fix_nested__(item, t->nested, __MemTree_fix_nested_Action_plus__);
__MemList_pushAfter__(&parent->childs, &t->link, &item->link);
__MemTree_fix_counts__(parent, item->count + 1, __MemTree_fix_counts_Action_plus__);
}
// # __MemTree_pushPrev__
void __MemTree_pushPrev__(
struct __MemTree__ *t, // expected t is child
struct __MemTree__ *item
) {
struct __MemTree__ *parent;
__MemTree_getParent__(&parent, t); // expected true by right argument
__MemTree_fix_nested__(item, t->nested, __MemTree_fix_nested_Action_plus__);
__MemList_pushBefore__(&parent->childs, &t->link, &item->link);
__MemTree_fix_counts__(parent, item->count + 1, __MemTree_fix_counts_Action_plus__);
}
// # __MemTree_traverse__
struct __MemTree__* // return first_child or next or find next_parental or null
__MemTree_traverse__(
struct __MemTree__ *tree
) {
if (tree->childs.first) {
struct __MemListLink__ *first = tree->childs.first;
return __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, link, first);
} else {
struct __MemListLink__ *next = tree->link.next;
if (next) {
return __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, link, next);
} else {
struct __MemTree__ *parent = __MemTree_getParentOrNull__(tree);
while (parent) {
struct __MemListLink__ *next_of_parent = parent->link.next;
if (next_of_parent) {
return __TypedPtr_getParentPtrFromFieldPtr__(struct __MemTree__, link, next_of_parent);
}
parent = __MemTree_getParentOrNull__(parent);
}
}
}
return NULL;
}
// # __Mem_copyBackward__
void __Mem_copyBackward__(char* dest, const char* src, size_t size) {
size_t pos = size;
while(pos > 0) {
pos-=1;
dest[pos] = src[pos];
}
}
// # __Mem_copy__
void __Mem_copy__( // todo create macros __Mem_copyAny__
char *dest,
const char *src,
size_t size
) {
// i use this instead memcpy becouse clang-in-zig just replace memcpy to crash-zig-bloated-version code
size_t pos = 0;
while(pos < size) {
dest[pos] = src[pos];
pos++;
}
}
// # __Mem_fill__
void __Mem_fill__(
char *dest,
char symbol,
size_t len
) {
for (size_t pos = 0; pos < len; pos++) {
dest[pos] = symbol;
}
}
// # __Mem_findDiffOrLen__
size_t __Mem_findDiffOrLen__(const char a[], const char b[], size_t len) {
size_t pos = 0;
while(pos < len) {
if (a[pos] != b[pos]) break;
pos++;
}
return pos;
}
// # __Mem_findFast__
bool __Mem_findFast__(
size_t *ret_pos, // expected value 0
const char *data,
size_t data_len, // expected > 0
const char *desired,
size_t desired_len // expected > 0 // expected <= data_len // optimal > 4
) {
bool finded = false;
if (desired_len <= 4) {
if (data_len >= desired_len and __Mem_find__(ret_pos, data, data_len, desired, desired_len)) {
finded = true;
}
} else {
size_t final_check_pos = data_len - desired_len;
uint8_t target_sum = __Crypto_sumBytes__(desired, desired_len);
uint8_t target_xor = __Crypto_xorBytes__(desired, desired_len);
uint8_t hash_sum = __Crypto_sumBytes__(data, desired_len);
uint8_t hash_xor = __Crypto_xorBytes__(data, desired_len);
for (size_t pos = 0; pos <= final_check_pos; pos++) {
if (true
and hash_xor == target_xor
and hash_sum == target_sum
) {
if (__Mem_isEql__(&data[pos], desired, desired_len)) {
finded = true;
*ret_pos += pos;
break;
}
}
uint8_t last_start_byte = data[pos];
hash_xor ^= last_start_byte;
hash_sum -= last_start_byte;
uint8_t new_byte_end = data[pos + desired_len];
hash_xor ^= new_byte_end;
hash_sum += new_byte_end;
}
}
return finded;
}
// # __Mem_find__
bool __Mem_find__(
size_t *ret_pos, // this value increment by this func
const char *data,
size_t data_len, // expected >= desired_len
const char *desired,
size_t desired_len // expected >= 1
) {
bool finded = false;
size_t last_pos = data_len - desired_len;
for (uintptr_t pos = 0; pos <= last_pos; pos++) {
size_t slice_len = data_len - pos;
if (slice_len >= desired_len) {
if (__Mem_isEql__(&data[pos], desired, desired_len)) {
*ret_pos = pos;
finded = true;
break;
}
} else {
break;
}
}
return finded;
}
// # __Mem_isEql__
bool __Mem_isEql__(
const char* a,
const char* b,
size_t len
) {
return __Mem_findDiffOrLen__(a, b, len) == len;
}
// # __Mem_isEql_test__
bool __Mem_isEql_test__() {
return true
and (__Mem_isEql__("abcd", "abcd", 4))
and (__Mem_isEql__("abcd", "abce", 4) == false)
and (__Mem_isEql__("abcdasdasd", "asd", 3) == false)
;
}
// # __Mem_reverse__
void __Mem_reverse__(
char *dest,
const char *src,
size_t len
) {
src = &src[len - 1];
size_t iter = 0;
for(; iter < len; iter++, dest++, src--) {
*dest = *src;
}
}
// # __Nibble_fromAp__
uint8_t __Nibble_fromAp__(char data) {
if (data >= 'A' && data <= 'P') {
return data - 'A';
} else if (data >= 'a' && data <= 'p') {
return data - 'a';
}
return 0;
}
// # __Nibble_fromHexNibble__
char __Nibble_fromHexNibble__(char nibble) {
if (nibble >= 'a') return 10 + nibble - 'a';
if (nibble >= 'A') return 10 + nibble - 'A';
return nibble - '0';
}
// # __OsConsoleFlags_apply__
bool __OsConsoleFlags_apply__(
struct __OsConsoleFlags__ *t,
struct __OsConsoleInput__ *input,
struct __OsConsoleOutput__ *output
) {
// expected inited
bool ok = true;
#if __target_os__ == __TargetOs_windows__
int result1 = SetConsoleMode(input->handle, t->input_mode);
if (result1 == 0) {
ok = false;
// todo GetLastError();
}
int result2 = SetConsoleMode(output->__OsConsoleOutput_handle__, t->output_mode);
if (result2 == 0) {
ok = false;
// todo GetLastError();
}
#elif __target_os__ == __TargetOs_linux__
tcsetattr(input->fileno, TCSANOW, &t->termios);
tcsetattr(output->__OsConsoleOutput_handle__, TCSANOW, &t->termios);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsConsoleFlags_init__
bool __OsConsoleFlags_init__(struct __OsConsoleFlags__ *t, struct __OsConsoleInput__* input, struct __OsConsoleOutput__ *output) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
bool result1 = GetConsoleMode(input->handle, &t->input_mode);
if (result1 != 0) {
bool result2 = GetConsoleMode(output->__OsConsoleOutput_handle__, &t->output_mode);
if (result2 != 0) {
t->inited = true;
} else {
ok = false;
}
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
int result = tcgetattr(input->fileno, &t->termios);
if (result == 0) {
t->inited = true;
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsConsoleFlags_setNonCanonicalMode__
bool __OsConsoleFlags_setNonCanonicalMode__(struct __OsConsoleFlags__ *t) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
uint32_t input = t->input_mode;
input = __BitsU32_toggle__(input, ENABLE_EXTENDED_FLAGS, true);
input = __BitsU32_toggle__(input, ENABLE_ECHO_INPUT, false); // print pressed keys
input = __BitsU32_toggle__(input, ENABLE_LINE_INPUT, false); // wait '\n' (buffering on enter)
input = __BitsU32_toggle__(input, ENABLE_VIRTUAL_TERMINAL_INPUT, true);
input = __BitsU32_toggle__(input, ENABLE_PROCESSED_INPUT, false); // CTRL+C
input = __BitsU32_toggle__(input, ENABLE_MOUSE_INPUT, false);
input = __BitsU32_toggle__(input, ENABLE_QUICK_EDIT_MODE, true); // enable mouse select and copy
input = __BitsU32_toggle__(input, ENABLE_WINDOW_INPUT, false); // reported of change size of the console screen buffer
input = __BitsU32_toggle__(input, ENABLE_INSERT_MODE, true); // When enabled, text entered in a console window will be inserted at the current cursor location and all text following that location will not be overwritten. When disabled, all following text will be overwritten.
t->input_mode = input;
uint32_t output = t->output_mode;
output = __BitsU32_toggle__(output, ENABLE_LVB_GRID_WORLDWIDE, true); // enable colors
output = __BitsU32_toggle__(output, ENABLE_VIRTUAL_TERMINAL_PROCESSING, true); // emulate VT100
output = __BitsU32_toggle__(output, ENABLE_PROCESSED_OUTPUT, true); // Backspace, tab, bell, carriage return, and line feed characters are processed
output = __BitsU32_toggle__(output, ENABLE_WRAP_AT_EOL_OUTPUT, false); // disable line wrap
output = __BitsU32_toggle__(output, DISABLE_NEWLINE_AUTO_RETURN, true);
t->output_mode = output;
#elif __target_os__ == __TargetOs_linux__
// clear c_cc
cc_t* cc = &t->termios.c_cc[0]; // cc_t c_cc[NCCS]
for (int i = 0; i < NCCS ; i++) {
cc[i] = 0;
}
// timers off
cc = &t->termios.c_cc[0];
cc[VTIME] = 0;
cc[VMIN] = 1;
uint32_t cflag = t->termios.c_cflag;
cflag = __BitsU32_toggle__(cflag, CS8, true); // use 8 bit
cflag = __BitsU32_toggle__(cflag, CSTOPB, false); // two stops bits
cflag = __BitsU32_toggle__(cflag, PARENB, false); // parity check
cflag = __BitsU32_toggle__(cflag, PARODD, false); // parity check
t->termios.c_cflag = cflag;
uint32_t lflag = t->termios.c_lflag;
lflag = __BitsU32_toggle__(lflag, ISIG, false); // disable react to Ctrl+C
lflag = __BitsU32_toggle__(lflag, ICANON, false); // no wait '\n'
lflag = __BitsU32_toggle__(lflag, ECHO, false); // print pressed keys
lflag = __BitsU32_toggle__(lflag, ECHOE, false); // mashing
lflag = __BitsU32_toggle__(lflag, ECHONL, false); // print NL
lflag = __BitsU32_toggle__(lflag, ECHOK, false); // nl after clear line
lflag = __BitsU32_toggle__(lflag, ECHOKE, false); // print NL after BS
lflag = __BitsU32_toggle__(lflag, ECHOPRT, false); // print BS (BS SP BS)
lflag = __BitsU32_toggle__(lflag, IEXTEN, false); // special funcs
t->termios.c_lflag = lflag;
uint32_t iflag = t->termios.c_iflag;
iflag = __BitsU32_toggle__(iflag, IGNBRK, true); // ignore break control
iflag = __BitsU32_toggle__(iflag, BRKINT, true); // do not delete all data after break control
iflag = __BitsU32_toggle__(iflag, IXON, false); // disable react to Ctrl+S Ctlr+Q
iflag = __BitsU32_toggle__(iflag, ISTRIP, false); // strip
iflag = __BitsU32_toggle__(iflag, INLCR, false); // convert NL to CR
iflag = __BitsU32_toggle__(iflag, ICRNL, false); // convert CR to NL
iflag = __BitsU32_toggle__(iflag, XCASE, false); // convert register to UP
iflag = __BitsU32_toggle__(iflag, IUCLC, false); // convert register to down
iflag = __BitsU32_toggle__(iflag, IGNPAR, true); // ignore framing or parity errors
iflag = __BitsU32_toggle__(iflag, IMAXBEL, false); // no bell
t->termios.c_iflag = iflag;
uint32_t oflag = t->termios.c_oflag;
oflag = __BitsU32_toggle__(oflag, ONOCR, false); // on start line // Auto CR
oflag = __BitsU32_toggle__(oflag, ONLRET, false); // on end line // Auto CR
oflag = __BitsU32_toggle__(oflag, OPOST, true); // \_(O_o)_/
oflag = __BitsU32_toggle__(oflag, ONLCR, true); // NL to CR
oflag = __BitsU32_toggle__(oflag, OCRNL, false); // CR to NL
oflag = __BitsU32_toggle__(oflag, OLCUC, false); // convert to CAPS
oflag = __BitsU32_toggle__(oflag, XTABS, false); // convert tab
oflag = __BitsU32_toggle__(oflag, TAB3, false); // convert tab
oflag = __BitsU32_toggle__(oflag, OFDEL, false); // use null for deleted symbol
t->termios.c_oflag = oflag;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsConsoleInput_getCountOfUnreaded__
bool __OsConsoleInput_getCountOfUnreaded__(struct __OsConsoleInput__* t, size_t *ret_unreaded) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
DWORD unreaded = 0;
if ( GetNumberOfConsoleInputEvents(t->handle, &unreaded) ) {
*ret_unreaded += unreaded;
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
int unreaded = 0;
int result = ioctl(t->fileno, FIONREAD, &unreaded);
*ret_unreaded += unreaded;
#else
#error "__target_os__ not implemented"
#endif
return ok;
}
// # __OsConsoleInput_init__
void __OsConsoleInput_init__(
struct __OsConsoleInput__* t,
__OsConsoleInputHandle__ input_hanle
) {
#if __target_os__ == __TargetOs_windows__
t->handle = input_hanle;
#elif __target_os__ == __TargetOs_linux__
t->handle = input_hanle;
t->fileno = fileno(t->handle);
#else
#error "__target_os__ not implemented"
#endif
}
// # __OsConsoleInput_readByte__
bool __OsConsoleInput_readByte__(
char *ret_byte,
struct __OsConsoleInput__ *t
) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
INPUT_RECORD key;
DWORD picked = 0;
if ( ReadConsoleInputA(t->handle, &key, 1, &picked) ) {
if (picked != 0) {
if (key.EventType == KEY_EVENT) {
KEY_EVENT_RECORD *event = &key.Event.KeyEvent;
if (event->bKeyDown != 0) {
if (event->uChar.AsciiChar != 0) {
*ret_byte = event->uChar.AsciiChar;
} else {ok = false;}
} else {ok = false;}
} else {ok = false;}
} else {ok = false;}
} else {ok = false;}
#elif __target_os__ == __TargetOs_linux__
ssize_t result = read(t->fileno, ret_byte, 1);
if (result != 1) {ok = false;}
#else
#error "__target_os__ not implemented"
#endif
return ok;
}
// # __OsConsoleOutput_getSize__
void __OsConsoleOutput_getSize__ (
struct __OsConsoleOutput__ *t,
struct __Math2dPosU__ *ret_pos
) {
#if __target_os__ == __TargetOs_windows__
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(t->__OsConsoleOutput_handle__, &csbi);
int x = csbi.srWindow.Right - csbi.srWindow.Left + 1;
int y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
ret_pos->x = x;
ret_pos->y = y;
// printf("%d, %d x %d\n", __LINE__, x, y);
#elif __target_os__ == __TargetOs_linux__
struct winsize w;
ioctl(t->__OsConsoleOutput_handle__, TIOCGWINSZ, &w);
ret_pos->x = w.ws_col;
ret_pos->y = w.ws_row;
#else
#error "__target_os__ not implemented"
#endif
}
// # __OsConsoleOutput_init__
void __OsConsoleOutput_init__(struct __OsConsoleOutput__* output, __OsConsoleOutputHandle__ handle) {
output->__OsConsoleOutput_handle__ = handle;
#if __target_os__ == __TargetOs_windows__
#elif __target_os__ == __TargetOs_linux__
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsConsoleOutput_write__
bool __OsConsoleOutput_write__(
struct __OsConsoleOutput__* os_console_output,
const char* data,
size_t _len
) {
bool ok = true;
// support null-string // todo remove me
size_t len = _len;
if (len == 0) {
while(data[len] != 0) len += 1;
}
#if __target_os__ == __TargetOs_windows__
unsigned long writed = 0;
WriteConsoleA(os_console_output->__OsConsoleOutput_handle__, data, len, &writed, NULL);
len = writed;
#elif __target_os__ == __TargetOs_linux__
// stdin = 0
// stdout = 1
// stderr = 2
if (write(1, data, len) == len) {
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsEnvHome_getLen__
size_t __OsEnvHome_getLen__() {
size_t len = 0;
#if __target_os__ == __TargetOs_windows__
char* home_drive = getenv("HOMEDRIVE");
len += __ZText_countLen__(home_drive);
char* home_path = getenv("HOMEPATH");
len += __ZText_countLen__(home_path);
#elif __target_os__ == __TargetOs_linux__
char* home = getenv("HOME");
len += __ZText_countLen__(home);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return len;
}
// # __OsEnvHome_write__
void __OsEnvHome_write__(
char* buffer // expected len >= __OsEnvHome_getLen__()
) {
#if __target_os__ == __TargetOs_windows__
size_t writed = 0;
// write HOMEDRIVE
char* home_drive = getenv("HOMEDRIVE");
size_t home_drive_len = __ZText_countLen__(home_drive);
__Mem_copy__(&buffer[writed], home_drive, home_drive_len);
writed += home_drive_len;
// write HOMEPATH
char* home_path = getenv("HOMEPATH");
size_t home_path_len = __ZText_countLen__(home_path);
__Mem_copy__(&buffer[writed], home_path, home_path_len);
writed += home_path_len;
#elif __target_os__ == __TargetOs_linux__
char* home = getenv("HOME");
size_t len = __ZText_countLen__(home);
__Mem_copy__(buffer, home, len);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFallbackConsole_write__
size_t
__OsFallbackConsole_write__ (
void* unused_ctx,
char* data,
size_t len
) {
#if __target_os__ == __TargetOs_windows__
struct __OsConsoleOutput__ console_output;
__OsConsoleOutput_init__(&console_output, GetStdHandle(STD_OUTPUT_HANDLE));
__OsConsoleOutput_write__(&console_output, data, len);
#elif __target_os__ == __TargetOs_linux__
__OsConsoleOutput_write__ (NULL, data, len);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return len;
}
// # __OsFile_clear__
void __OsFile_clear__(
__OsFileHandle__ file
) {
__OsFile_setPos__(file, 0);
__OsFile_truncate__(file);
}
// # __OsFile_close__
void __OsFile_close__(
__OsFileHandle__ file
) {
#if __target_os__ == __TargetOs_windows__
CloseHandle(file);
#elif __target_os__ == __TargetOs_linux__
close(file);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFile_create__
bool __OsFile_create__(
__OsFileHandle__ *ret,
const char file_name[],
size_t file_name_len // expected < __OsFilePathLen_max__
) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
char file_name_z[__OsFilePathLen_max__ + 1]; // null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
HANDLE file = CreateFile( // open
file_name_z, // [in] LPCSTR lpFileName,
GENERIC_WRITE | GENERIC_READ, // [in] DWORD dwDesiredAccess,
0, // [in] DWORD dwShareMode, // TODO also try FILE_SHARE_WRITE
NULL, // [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OPEN_ALWAYS, // [in] DWORD dwCreationDisposition,
FILE_ATTRIBUTE_NORMAL, // [in] DWORD dwFlagsAndAttributes,
NULL // [in, optional] HANDLE hTemplateFile
);
if (file != INVALID_HANDLE_VALUE) {
*ret = file;
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
char file_name_z[__OsFilePathLen_max__ + 1]; // create null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
int file = creat(file_name_z, 0777);
if (file != -1) {
*ret = file;
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsFile_exist__
bool __OsFile_exist__(
const char* file_name,
size_t file_name_len // expected < __OsFilePathLen_max__
) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
char file_name_z[__OsFilePathLen_max__ + 1]; // create null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
DWORD attrs = GetFileAttributesA(file_name_z);
if (true
and (attrs != INVALID_FILE_ATTRIBUTES)
and (!(attrs & FILE_ATTRIBUTE_DIRECTORY))
) {
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
char file_name_z[__OsFilePathLen_max__ + 1]; // create null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
struct stat buffer;
if (stat(file_name_z, &buffer) == 0) {
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsFile_getPos__
size_t __OsFile_getPos__(
__OsFileHandle__ file
) {
#if __target_os__ == __TargetOs_windows__
LARGE_INTEGER liPosition = {0};
LARGE_INTEGER liNewPosition = {0};
BOOL sfp_result = SetFilePointerEx (
file,
liPosition,
&liNewPosition,
FILE_CURRENT
);
if (sfp_result == FALSE) {
// unexpected
int err = GetLastError();
printf("%d SetFilePointerEx error: %d", __LINE__, err);
}
return liNewPosition.QuadPart;
#elif __target_os__ == __TargetOs_linux__
return lseek(file, 0, SEEK_CUR);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFile_getSize__
size_t __OsFile_getSize__(
__OsFileHandle__ file
) {
#if __target_os__ == __TargetOs_windows__
LARGE_INTEGER size;
if (GetFileSizeEx(file, &size)) {
return size.QuadPart;
} else {
// unexpected
return 0;
}
#elif __target_os__ == __TargetOs_linux__
struct stat st;
fstat(file, &st);
return st.st_size;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFile_openOrCreate__
bool __OsFile_openOrCreate__(
__OsFileHandle__ *ret,
const char file_name[],
size_t file_name_len // expected < __OsFilePathLen_max__
) {
if (__OsFile_exist__(file_name, file_name_len)) {
return __OsFile_open__(ret, file_name, file_name_len);
} else {
return __OsFile_create__(ret, file_name, file_name_len);
}
}
// # __OsFile_open__
bool __OsFile_open__(
__OsFileHandle__ *ret,
const char file_name[],
size_t file_name_len // expected < __OsFilePathLen_max__
) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
char file_name_z[__OsFilePathLen_max__ + 1]; // null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
HANDLE file = CreateFile( // open
file_name_z, // [in] LPCSTR lpFileName,
GENERIC_WRITE | GENERIC_READ, // [in] DWORD dwDesiredAccess,
0, // [in] DWORD dwShareMode, // TODO also try FILE_SHARE_WRITE
NULL, // [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OPEN_EXISTING, // [in] DWORD dwCreationDisposition,
FILE_ATTRIBUTE_NORMAL, // [in] DWORD dwFlagsAndAttributes,
NULL // [in, optional] HANDLE hTemplateFile
);
if (file != INVALID_HANDLE_VALUE) {
*ret = file;
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
char file_name_z[__OsFilePathLen_max__ + 1]; // null terminated string
__Mem_copy__(file_name_z, file_name, file_name_len);
file_name_z[file_name_len] = 0;
// open
int file = open(file_name_z, O_RDWR);
if (file != -1) {
*ret = file;
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
return ok;
}
// # __OsFile_readToBuffer__
bool __OsFile_readToBuffer__(
__OsFileHandle__ file,
char *buffer,
size_t buffer_len,
size_t offset
) {
bool ok = true;
size_t readed = 0;
while (ok and (readed < buffer_len)) {
__OsFile_setPos__(file, offset + readed);
#if __target_os__ == __TargetOs_windows__
__OsFile_setPos__(file, offset + readed);
LPDWORD readed_atom = 0;
if (ReadFile(file, &buffer[readed], buffer_len - readed, &readed_atom, NULL)) {
readed += (size_t) readed_atom;
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
__OsFile_setPos__(file, offset + readed);
ssize_t read_result = read(file, &buffer[readed], buffer_len - readed);
if (read_result >= 0) {
readed += read_result;
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
return ok;
}
// # __OsFile_setPos__
void __OsFile_setPos__(
__OsFileHandle__ file,
size_t pos
) {
#if __target_os__ == __TargetOs_windows__
LARGE_INTEGER liPosition = {0};
liPosition.QuadPart = pos;
BOOL sfp_result = SetFilePointerEx(file, liPosition, NULL, FILE_BEGIN);
if (sfp_result == FALSE) {
// unexpeced
printf("%d, unexpected SetFilePointer result", __LINE__);
}
#elif __target_os__ == __TargetOs_linux__
lseek(file, pos, SEEK_SET);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFile_truncate__
void __OsFile_truncate__(
__OsFileHandle__ file
) {
#if __target_os__ == __TargetOs_windows__
bool ok = true;
if (FlushFileBuffers(file)) {
if (SetEndOfFile(file)) {
if (FlushFileBuffers(file)) {
} else { // unexpected
ok = false;
printf("%d unexpected retusult of FlushFileBuffers", __LINE__);
}
} else { // unexpected
ok = false;
printf("%d unexpected retusult of SetEndOfFile", __LINE__);
}
} else { // unexpected
ok = false;
printf("%d unexpected retusult of FlushFileBuffers", __LINE__);
}
if (!ok) printf("%d failue", __LINE__);
// return ok; not needed to real return ok state becouse expected posibly truncate any file without errors.
#elif __target_os__ == __TargetOs_linux__
size_t current_pos = __OsFile_getPos__(file);
ftruncate(file, current_pos);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __OsFile_write__
bool __OsFile_write__(
__OsFileHandle__ file,
const char* data,
size_t data_len,
size_t offset
) {
bool ok = true;
size_t writed = 0;
while (ok and (writed < data_len)) {
__OsFile_setPos__(file, offset + writed);
#if __target_os__ == __TargetOs_windows__
DWORD atom_writed = 0;
if ( WriteFile(file, &data[writed], data_len - writed, &atom_writed, NULL) ) {
writed += atom_writed;
ok = FlushFileBuffers(file);
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
ssize_t atom_write = write(file, &data[writed], data_len - writed);
if (atom_write != -1) {
writed += atom_write;
} else {
ok = false;
}
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
return ok;
}
// # __OsHelper_deinit__
void __OsHelper_deinit__(struct __OsHelper__*t) {
#if __target_os__ == __TargetOs_windows__
#if __with_network__
WSACleanup();
#endif
FreeLibrary(t->instance);
#elif __target_os__ == __TargetOs_linux__
// nothing to do
#else
#error "__target_os__ not implemented"
#endif
}
// # __OsHelper_init__
bool __OsHelper_init__(struct __OsHelper__* t) {
bool ok = true;
#if __target_os__ == __TargetOs_windows__
HMODULE instance = GetModuleHandleA(NULL);
if (instance != NULL) {
t->instance = instance;
HANDLE console_input_handle = GetStdHandle(STD_INPUT_HANDLE);
if (console_input_handle != INVALID_HANDLE_VALUE) {
t->console_input_handle = console_input_handle;
HANDLE console_output_handle = GetStdHandle(STD_OUTPUT_HANDLE);
if (console_output_handle != INVALID_HANDLE_VALUE) {
t->console_output_handle = console_output_handle;
#if __with_network__
if (
WSAStartup(
514, // wVersionRequested ver 2.2
&t->wsdata
) == 0
) { } else {
ok = false;
}
#endif
} else {
ok = false;
}
} else {
ok = false;
}
} else {
ok = false;
}
#elif __target_os__ == __TargetOs_linux__
t->console_input_handle = stdin;
t->console_output_handle = 1; // standart output
#else
#error "__target_os__ not implemented"
#endif
return ok;
}
// # __OsHelper_process__
void __OsHelper_process__(struct __OsHelper__* t) {
#if __target_os__ == __TargetOs_windows__
MSG msg;
if (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
#elif __target_os__ == __TargetOs_linux__
// nothing to do
#else
#error "__target_os__ not implemented"
#endif
}
// # __OsMem_alloc__
bool __OsMem_alloc__( // TODO use real system alloc?
uintptr_t *ret,
size_t size
) {
bool ok = true;
char* ptr = malloc(size);
if (ptr) {
*ret = (uintptr_t) ptr;
} else {
ok = false;
// TODO print debug
}
return ok;
}
// # __OsMem_free__
void __OsMem_free__(uintptr_t ptr) {
free((void*) ptr);
}
// # __Os_getTick__
uint64_t __Os_getTick__() {
#if __target_os__ == __TargetOs_windows__
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
uint64_t ft64;
__Mem_copy__((char*) &ft64, (char*) &ft, 8);
return ft64 / 10000; // in ft is intervals * 100 ns. to ms need * 100 / 1000000
#elif __target_os__ == __TargetOs_linux__
// NOT TESTED
struct timespec ts;
clock_gettime(CLOCK_REALTIME, (void*)&ts);
uint64_t ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
return ms;
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __Os_sleep__
void __Os_sleep__(uint64_t ms) {
int a = 10;
#if __target_os__ == __TargetOs_windows__
Sleep(ms);
#elif __target_os__ == __TargetOs_linux__
struct timespec delay;
delay.tv_sec = ms / 1000;
delay.tv_nsec = (ms % 1000) * 1000000;
nanosleep(&delay, NULL);
#elif __target_os__ == __TargetOs_linuxOld__
if (milliseconds >= 1000) {
sleep(milliseconds / 1000);
}
usleep((milliseconds % 1000) * 1000);
#else
#error "not implemented current __target_os__ or not defined. (expected __TargetOs_ value)"
#endif
}
// # __TerminalInput_grab__
bool __TerminalInput_grab__(
__ConsoleAnsiInputKey__ *ret_key,
struct __TerminalInput__ *t
) {
if (t->ungrabed > 0) {
char* bytes = &t->buffer[0];
size_t bytes_len = t->ungrabed;
struct __ConsoleAnsiInputKey_SequenceParser__ parsed;
if (__ConsoleAnsi_input_Key_SequenceParser_fromBytes__(&parsed, bytes, bytes_len)) {
__TerminalInput_shift__(t, parsed.used);
*ret_key = parsed.sequence;
return true;
} else {
__ConsoleAnsiInputKey__ key = bytes[0];
__TerminalInput_shift__(t, 1);
*ret_key = key;
return true;
}
}
return false;
}
// # __TerminalInput_init__
void __TerminalInput_init__(
struct __TerminalInput__ *t
) {
t->ungrabed = 0;
}
// # __TerminalInput_shift__
void __TerminalInput_shift__(
struct __TerminalInput__ *t,
size_t val
) {
__Mem_copy__(&t->buffer[0], &t->buffer[val], __TerminalInput_size__ - val);
t->ungrabed -= val;
}
// # __TerminalOutputCursorPos_init__
void __TerminalOutputCursorPos_init__(
struct __Math2dPosU__ *cursor_pos
) {
cursor_pos->x = 0;
cursor_pos->y = 0;
}
// # __TerminalOutputCursorPos_move__
// not use me directly. use __Terminal_cursorMove__ instead
void __TerminalOutputCursorPos_move__(
struct __Terminal__ *terminal,
size_t new_pos_x,
size_t new_pos_y
) {
struct __Math2dPosU__ *cursor_pos = &terminal->output.cursor_pos;
if (new_pos_x != cursor_pos->x) { // move_from_x
// reset x pos
__OsConsoleOutput_write__(&terminal->console->output, "\r", 0);
cursor_pos->x = 0;
if (new_pos_x != 0) {
__Terminal_Output_Cursor_shiftRight__(terminal, new_pos_x - cursor_pos->x);
}
}
if (new_pos_y != cursor_pos->y) { // move_from_y
if (new_pos_y > cursor_pos->y) {
__Terminal_Output_Cursor_shiftDown__(terminal, new_pos_y - cursor_pos->y);
} else {
__Terminal_Output_Cursor_shiftUp__(terminal, cursor_pos->y - new_pos_y);
}
}
}
// # __Terminal_Output_Cursor_shiftDown__
void __Terminal_Output_Cursor_shiftDown__(
struct __Terminal__ *terminal,
size_t delta
) {
struct __Math2dPosU__ *cursor_pos = &terminal->output.cursor_pos;
if (delta != 0){
// print_to_console(__ConsoleAnsi_control__ + delta + "B");
char buffer[1024];
size_t writed = 0;
writed += __CText_write__(&buffer[0], __ConsoleAnsi_control__);
writed += __Text_formatU64ToBuffer__(&buffer[writed], delta, 1);
writed += __CText_write__(&buffer[writed], "B");
__OsConsoleOutput_write__(&terminal->console->output, &buffer[0], writed);
cursor_pos->y += delta;
}
}
// # __Terminal_Output_Cursor_shiftLeft__
void __Terminal_Output_Cursor_shiftLeft__(
struct __Terminal__ *terminal,
size_t delta
) {
struct __Math2dPosU__ *cursor_pos = &terminal->output.cursor_pos;
if (delta != 0) {
// print_to_console(__ConsoleAnsi_control__ + delta + "D");
char buffer[1024];
size_t writed = 0;
writed += __CText_write__(&buffer[0], __ConsoleAnsi_control__);
writed += __Text_formatU64ToBuffer__(&buffer[writed], delta, 1);
writed += __CText_write__(&buffer[writed], "D");
__OsConsoleOutput_write__(&terminal->console->output, &buffer[0], writed);
cursor_pos->x -= delta;
}
}
// # __Terminal_Output_Cursor_shiftRight__
void __Terminal_Output_Cursor_shiftRight__(
struct __Terminal__ *terminal,
size_t delta
) {
struct __Math2dPosU__ *cursor_pos = &terminal->output.cursor_pos;
if (delta != 0) {
// print_to_console(__ConsoleAnsi_control__ + delta + "C");
char buffer[1024];
size_t writed = 0;
writed += __CText_write__(&buffer[0], __ConsoleAnsi_control__);
writed += __Text_formatU64ToBuffer__(&buffer[writed], delta, 1);
writed += __CText_write__(&buffer[writed], "C");
__OsConsoleOutput_write__(&terminal->console->output, &buffer[0], writed);
cursor_pos->x += delta;
}
}
// # __Terminal_Output_Cursor_shiftUp__
void __Terminal_Output_Cursor_shiftUp__(
struct __Terminal__ *terminal,
size_t delta
) {
struct __Math2dPosU__ *cursor_pos = &terminal->output.cursor_pos;
if (delta != 0) {
// print_to_console(__ConsoleAnsi_control__ + delta + "A");
char buffer[1024];
size_t writed = 0;
writed += __CText_write__(&buffer[0], __ConsoleAnsi_control__);
writed += __Text_formatU64ToBuffer__(&buffer[writed], delta, 1);
writed += __CText_write__(&buffer[writed], "A");
__OsConsoleOutput_write__(&terminal->console->output, &buffer[0], writed);
cursor_pos->y -= delta;
}
}
// # __Terminal_clearOutput__
void __Terminal_clearOutput__(struct __Terminal__ *terminal) {
struct __Console__* console = terminal->console;
__ConsoleOutput_cursorHide__(&terminal->console->output);
size_t pos_y = 0;
while (pos_y < terminal->output.size.y) {
__Terminal_cursorMove__(terminal, 0, pos_y);
__OsConsoleOutput_writeCText__(&console->output, __ConsoleAnsi_output_clear_line__);
pos_y += 1;
}
__Console_showCursor__(console);
}
// # __Terminal_cursorMove__
void __Terminal_cursorMove__( // todo rename to cursorMoveOrReset
struct __Terminal__ *terminal,
size_t pos_x,
size_t pos_y
) {
if ((pos_x > terminal->output.size.x) or (pos_y > terminal->output.size.y)) {
terminal->output.cursor_pos.x = terminal->output.size.x - 1;
terminal->output.cursor_pos.y = terminal->output.size.y - 1;
__Terminal_moveCursorToStartOfLine__(terminal);
} else {
__TerminalOutputCursorPos_move__(terminal, pos_x, pos_y);
}
}
// # __Terminal_deinitOutput__
void __Terminal_deinitOutput__(struct __Terminal__ *terminal) {
struct __Console__ *console = terminal->console;
struct __OsConsoleOutput__ *console_output = &console->output;
__OsConsoleOutput_writeCText__(console_output, __ConsoleAnsiOutputSettings_enableLineWrap__);
__Terminal_resetColors__(terminal);
__OsConsoleOutput_writeCText__(console_output, __ConsoleAnsiOutputFontStyle_command_reset__);
__OsConsoleOutput_writeCText__(console_output, "\r\n");
__Console_showCursor__(console);
}
// # __Terminal_deinit__
bool __Terminal_deinit__(struct __Terminal__ *terminal) {
bool ok = true;
struct __Console__* console = terminal->console;
__Terminal_deinitOutput__(terminal);
if (__OsConsoleFlags_apply__(&terminal->system_flags, &console->input, &console->output)) {
} else {
ok = false;
}
return ok;
}
// # __Terminal_initBlankLinesToOutput__
void __Terminal_initBlankLinesToOutput__(struct __Terminal__ *terminal) {
struct __Console__ *console = terminal->console;
__OsConsoleOutput_writeCText__(&console->output, "\r\n");
__Terminal_cursorMove__(terminal, 0, 0);
size_t pos_y = 0;
while (pos_y < terminal->output.size.y - 2) {
__OsConsoleOutput_writeCText__(&console->output, "\r\n");
pos_y += 1;
terminal->output.cursor_pos.y += 1;
}
}
// # __Terminal_initOutput__
void __Terminal_initOutput__(struct __Terminal__ *terminal) {
struct __TerminalOutput__ *output = &terminal->output;
__TerminalOutputCursorPos_init__(&output->cursor_pos);
output->font_style = "";
output->__TerminalOutput_fontStyleLen__ = 0;
output->size.x = 1;
output->size.y = 1;
output->convert_n_to_rn = false;
output->apply_r = false;
output->apply_n = false;
__Terminal_updateOutputSize__(terminal);
__Terminal_resetColors__(terminal);
__Terminal_initBlankLinesToOutput__(terminal);
__Terminal_clearOutput__(terminal);
__Terminal_cursorMove__(terminal, 0, 0);
}
// # __Terminal_init__
bool __Terminal_init__(
struct __Terminal__ *t,
struct __Console__ *console
) {
bool ok = true;
t->console = console;
__TerminalInput_init__(&t->input);
__Terminal_initOutput__(t);
// configure console
// save flags before change
if (__OsConsoleFlags_init__(&t->system_flags, &console->input, &console->output)) {
// go to interactive mode ("non canonical mode" or "raw mode")
struct __OsConsoleFlags__ flags;
if (__OsConsoleFlags_init__(&flags, &console->input, &console->output)) {
__OsConsoleFlags_setNonCanonicalMode__(&flags);
if (__OsConsoleFlags_apply__(&flags, &console->input, &console->output)) {
__OsConsoleOutput_writeCText__(&console->output, __ConsoleAnsiOutputSettings_disableLineWrap__);
} else {
ok = false;
}
} else {
ok = false;
}
} else {
ok = false;
}
return ok;
}
// # __Terminal_moveCursorToNextLine__
void __Terminal_moveCursorToNextLine__(struct __Terminal__ *terminal) {
if (terminal->output.cursor_pos.y < terminal->output.size.y) {
__TerminalOutputCursorPos_move__(terminal, terminal->output.cursor_pos.x, terminal->output.cursor_pos.y + 1);
} else {
__OsConsoleOutput_write__(&terminal->console->output, "\n", 0);
}
}
// # __Terminal_moveCursorToStartOfLine__
void __Terminal_moveCursorToStartOfLine__(struct __Terminal__ *terminal) {
__OsConsoleOutput_write__(&terminal->console->output, "\r", 0);
terminal->output.cursor_pos.x = 0;
}
// # __Terminal_moveCursorToStartOfNextLine__
void __Terminal_moveCursorToStartOfNextLine__(struct __Terminal__ *terminal) { // \r\n
__Terminal_moveCursorToNextLine__(terminal);
__Terminal_moveCursorToStartOfLine__(terminal);
}
// # __Terminal_resetColors__
void __Terminal_resetColors__(struct __Terminal__ *terminal) {
__Terminal_setFontStyleCText__(terminal, __ConsoleAnsiOutputFontStyle_command_reset__);
}
// # __Terminal_setFontStyle__
void __Terminal_setFontStyle__(
struct __Terminal__ *terminal,
const char* font_style,
size_t font_style_len
) {
terminal->output.font_style = font_style;
terminal->output.__TerminalOutput_fontStyleLen__ = font_style_len;
__OsConsoleOutput_write__(&terminal->console->output, font_style, font_style_len);
}
// # __Terminal_updateInputBuffer__
void __Terminal_updateInputBuffer__(
struct __Terminal__ *terminal
) {
struct __Console__ *console = terminal->console;
size_t unreaded = 0;
if (__OsConsoleInput_getCountOfUnreaded__(&console->input, &unreaded)) {
while (terminal->input.ungrabed < __TerminalInput_size__ and unreaded > 0) { // get new byte
char byte;
if (__OsConsoleInput_readByte__(&byte, &console->input)) {
terminal->input.buffer[terminal->input.ungrabed] = byte;
terminal->input.ungrabed += 1;
}
unreaded -= 1;
}
} else {
// ok = false;
}
}
// # __Terminal_updateOutputSize__
void __Terminal_updateOutputSize__(struct __Terminal__ *terminal) {
struct __Math2dPosU__ size;
__OsConsoleOutput_getSize__(&terminal->console->output, &size);
// x
if (size.x >= 6) {
terminal->output.size.x = size.x - 3;
} else {
terminal->output.size.x = size.x;
}
// y
if (size.y >= 6) {
terminal->output.size.y = size.y - 3;
} else {
terminal->output.size.y = size.y;
}
}
// # __Terminal_writeColoredErrorSymbolToOutput__
void __Terminal_writeColoredErrorSymbolToOutput__(
struct __Terminal__ *t
) {
struct __Console__ *console = t->console;
#define __TerminalErrorSymbol_color__ \
__ConsoleAnsiOutputFontStyle_start__ \
__ConsoleAnsiOutputFontStyle_bg_color_yellow__ \
__ConsoleAnsiOutputFontStyle_sep__ \
__ConsoleAnsiOutputFontStyle_color_red__ \
__ConsoleAnsiOutputFontStyle_end__
__OsConsoleOutput_writeCText__(&console->output, __TerminalErrorSymbol_color__);
__OsConsoleOutput_writeCText__(&console->output, "#");
__OsConsoleOutput_write__(&console->output, t->output.font_style, t->output.__TerminalOutput_fontStyleLen__);
t->output.cursor_pos.x += 1;
}
// # __Terminal_writeToOutput__
void __Terminal_writeToOutput__(
struct __Terminal__ *terminal,
const char *bytes,
size_t bytes_len
) {
for (size_t readed = 0; readed < bytes_len; readed += 1) {
char byte = bytes[readed];
if (byte >= ' ' and byte <= '~') {
struct __Console__ * console = terminal->console;
__OsConsoleOutput_write__(&console->output, &bytes[readed], 1);
terminal->output.cursor_pos.x += 1;
} else if (byte == '\r') {
if (terminal->output.apply_r) {
__Terminal_moveCursorToStartOfLine__(terminal);
} else {
__Terminal_writeColoredErrorSymbolToOutput__(terminal);
}
} else if (byte == '\t') {
__Terminal_writeColoredErrorSymbolToOutput__(terminal);
} else if (byte == '\n') {
if (terminal->output.apply_n) {
if (terminal->output.convert_n_to_rn) __Terminal_moveCursorToStartOfLine__(terminal);
__Terminal_moveCursorToNextLine__(terminal);
} else {
__Terminal_writeColoredErrorSymbolToOutput__(terminal);
}
} else {
__Terminal_writeColoredErrorSymbolToOutput__(terminal);
}
}
}
// # __TextAsciiSymbol_isBreakWord__
bool __TextAsciiSymbol_isBreakWord__(char symbol) {
return __TextAsciiSymbol_isWord__(symbol) == false;
}
// # __TextAsciiSymbol_isWordSymbol__
bool __TextAsciiSymbol_isWordSymbol__(char symbol) {
return false
or (symbol >= '0' and symbol <= '9')
or (symbol >= 'a' and symbol <= 'z')
or (symbol >= 'A' and symbol <= 'Z')
;
}
// # __TextAsciiSymbol_isWord__
bool __TextAsciiSymbol_isWord__(char symbol) {
return false
or (symbol == '_')
or __TextAsciiSymbol_isWordSymbol__(symbol)
;
}
// # __TextAscii_compare__
char // return -1, 0 or 1 where -1 mean less, 0 mean eql and 1 is more.
__TextAscii_compare__(
const char* text1,
const char* text2,
size_t text_len
) {
for (size_t pos = 0; pos < text_len; pos++) {
uint8_t t1 = *(uint8_t*) &text1[pos];
uint8_t t2 = *(uint8_t*) &text2[pos];
if (t1 != t2) {
if (t1 < t2) return -1;
return 1;
}
}
return 0;
}
// # __TextAscii_countIndentReverse__
size_t __TextAscii_countIndentReverse__(
const char *text,
size_t text_len,
size_t tabsize
) {
size_t count = 0;
if (text_len > 0) {
size_t pos = text_len - 1;
while(true) {
char r = text[pos];
if (r == 0 ) {
count += 1;
} else if (r == ' ') {
count += 1;
} else if (r == '\t') {
count += tabsize;
} else if (r == '\r') {
count += 1;
} else break;
if (pos == 0) break;
pos -= 1;
}
}
return count;
}
// # __TextAscii_countIndent__
size_t __TextAscii_countIndent__(
const char *text,
size_t text_len,
size_t tabsize
) {
size_t count = 0;
for (size_t pos = 0; pos < text_len; pos++) {
char r = text[pos];
if ( r == 0) { count += 1;
} else if ( r == ' ') { count += 1;
} else if ( r == '\t') { count += tabsize;
} else if ( r == '\r') { count += 1;
} else break;
}
return count;
}
// # __TextAscii_countNonIndent__
size_t __TextAscii_countNonIndent__(
const char *text,
size_t text_len
) {
size_t indent = __TextAscii_countIndent__(text, text_len, 1);
return text_len - indent;
}
// # __TextAscii_cutIndents__
bool __TextAscii_cutIndents__(
size_t *ret_pos, // incremented by fn
size_t *ret_len, // incremented by fn
const char *bytes,
size_t bytes_len
) {
bool ok = true;
if (bytes_len > 0) { // cut from left
size_t start = 0;
while (true) {
if (start < bytes_len) {
if (bytes[start] != ' ') {
break;
}
start += 1;
} else { // TextIsEmpty
ok = false;
break;
}
}
if (ok) { // cut from right
size_t end = bytes_len - 1;
while (true) {
if (bytes[end] != ' ') {
break;
}
end -= 1;
}
*ret_pos += start;
*ret_len += end+1 - start;
}
} else {
ok = false;
}
return ok;
}
// # __TextAscii_findBreakOfWordReverse__
size_t __TextAscii_findBreakOfWordReverse__(
const char *text,
size_t text_len // expected text_len > 0
) {
if (text_len == 1) return 0;
for (size_t pos = text_len - 1; pos > 0; pos--) {
char symbol = text[pos];
if (__TextAsciiSymbol_isBreakWord__(symbol)) return pos;
}
return 0;
}
// # __TextAscii_findBreakOfWord__
size_t __TextAscii_findBreakOfWord__(
const char* text,
size_t text_len
) {
if (text_len == 1) return 1;
for (size_t pos = 1; pos < text_len; pos++) {
char symbol = text[pos];
if (__TextAsciiSymbol_isBreakWord__(symbol)) return pos;
}
return text_len;
}
// # __TextAscii_getNonIndent__
bool
__TextAscii_getNonIndent__(
const char **ret_ptr,
size_t *ret_size,
const char *text,
size_t text_len
) {
size_t indent = __TextAscii_countIndent__(text, text_len, 1);
if (indent == text_len) return false;
*ret_ptr = &text[indent];
*ret_size = text_len - indent;
return true;
}
// # __TextAscii_getStartOfText__
bool __TextAscii_getStartOfText__(
size_t *ret_pos, // increment by fn
const char *text,
size_t text_len
) {
bool ok = true;
bool finded = false;
size_t pos = 0;
for (; pos < text_len; pos++) {
char symbol = text[pos];
if (true
and symbol != ' '
and symbol != '\t'
) {
finded = true;
break;
}
}
*ret_pos += pos;
ok = ok and finded;
return ok;
}
// # __TextAscii_isLetter__
bool __TextAscii_isLetter__(char rune) {
return false
or rune < ' '
or __TextAsciiSymbol_isWord__(rune)
or rune >= 127
;
}
// # __TextAscii_isVisible__
bool __TextAscii_isVisible__(char byte) {
return (byte >= 33) and (byte <= 126);
}
// # __TextFormatU64_do__
void __TextFormatU64_do__(
struct __TextFormatU64__ *t,
uint64_t number,
size_t min_width
) {
size_t len = 0;
uintptr_t buffer_start = (uintptr_t) &t->buffer[0];
uintptr_t buffer_end = buffer_start + __TextCharsDecFromU64_lenMax__;
// write utoa
uintptr_t addr = buffer_end;
for (uint64_t num = number; num > 0; num = num / 10) {
uint8_t remainder = num % 10;
addr = addr - 1;
*(char*) addr = '0' + (char) remainder;
}
len = buffer_end - addr;
// fill zeroes to min_width
if (min_width > len) {
size_t fill_len = min_width - len;
addr = addr - fill_len;
__Mem_fillAny__(addr, '0', fill_len);
len = len + fill_len;
}
t->ptr = (char*) addr;
t->len = len;
}
// # __TextSplitter_init__
void __TextSplitter_init__(struct __Text_Splitter__* t, char* text, size_t text_len, char* delim, size_t delim_len) {
t->stop = false;
t->last_pos = 0;
__Finder_init__(&t->finder, text, text_len, delim, delim_len);
}
// # __TextSplitter_next__
bool __TextSplitter_next__(struct __Text_Splitter__* t, struct Slice* out_slice) {
if (t->stop == false) {
size_t finded;
if (__Finder_next__(&t->finder, &finded)) {
out_slice->ptr = &t->finder.text.ptr[t->last_pos]; // slice = t->finder.text[t->last_pos..finded];
out_slice->len = finded - t->last_pos;
t->last_pos = t->finder.pos;
return true;
} else {
t->stop = true;
out_slice->ptr = &t->finder.text.ptr[t->last_pos]; // slice = t->finder.text[t->last_pos..];
out_slice->len = t->finder.text.len - t->last_pos;
t->last_pos = t->finder.pos;
return true;
}
}
return false;
}
// # __Text_countIndent__
size_t
__Text_countIndent__(
char* text,
size_t text_len, // can be 0
size_t tab_size
) {
size_t counted = 0;
size_t pos = 0;
while (pos < text_len) {
char symbol = text[pos];
if (symbol == ' ') {
counted = counted + 1;
} else if (symbol == '\t') {
counted = counted + tab_size;
} else {
break;
}
pos = pos + 1;
}
return counted;
}
// # __Text_formatU64ToBuffer__
size_t __Text_formatU64ToBuffer__(
char *buffer, // expected len >= __TextCharsDecFromU64_lenMax__
uint64_t number,
size_t min_width
) {
struct __TextFormatU64__ format;
__TextFormatU64_do__(&format, number, min_width);
if (format.len > 0) {
__Mem_copy__(buffer, format.ptr, format.len);
}
return format.len;
}
// # __Text_formatU64__
size_t __Text_formatU64__(__WriteFnPtrVoid__ fn_write, void* context, uint64_t number, size_t min_width) {
struct __TextFormatU64__ format;
__TextFormatU64_do__(&format, number, min_width);
fn_write(context, format.ptr, format.len);
return format.len;
}
// # __Trace_init__
void __Trace_init__(
struct __Trace__ *trace,
struct __Trace__ *prev_trace, // can be null
size_t line
) {
trace->__Trace_prevTrace__ = prev_trace;
trace->__Trace_line__ = line;
}
// # __Trace_print__
void __Trace_print__(
struct __Trace__ *trace
) {
if (trace) {
printf("%zu", trace->__Trace_line__);
trace = trace->__Trace_prevTrace__;
while (trace) {
printf("|%zu", trace->__Trace_line__);
trace = trace->__Trace_prevTrace__;
}
} else {
printf("nil");
}
}
// # __ZText_countLen__
size_t __ZText_countLen__(const char text[]) {
size_t len = 0;
while(text[len] != 0) len++;
return len;
}
// # __ZText_fromBytes__
void __ZText_fromBytes__(char* buffer, const char bytes[], size_t bytes_len) {
// expected buffer_len >= bytes_len + 1
__Mem_copy__(buffer, bytes, bytes_len);
buffer[bytes_len] = 0;
}
// # __ZText_writeToBuffer__
size_t __ZText_writeToBuffer__(char buffer[], const char data[]) {
const size_t len = __ZText_countLen__(data);
__Mem_copy__(buffer, data, len);
return len;
}
// # __ZText_writeToWriteFn__
size_t __ZText_writeToWriteFn__(__WriteFnPtr__ fn_write, void* context, const char text[]) {
const size_t len = __ZText_countLen__(text);
fn_write(context, text, len);
return len;
}
// # __mem_findFastReverse__
bool __mem_findFastReverse__(
size_t *ret_pos, // func increment this
const char *data,
size_t data_len, // expected >= 1
const char *desired,
size_t desired_len // expected <= data_len
) {
bool finded = false;
size_t final_check_pos = data_len - desired_len;
if (desired_len <= 4) {
for (size_t pos = 0; pos <= final_check_pos + 1; pos++) {
size_t rpos = final_check_pos - pos;
if (__Mem_isEql__(&data[rpos], desired, desired_len)) {
*ret_pos += rpos;
finded = true;
break;
}
}
} else {
const char* final_check_ptr = &data[final_check_pos];
if (__Mem_isEql__(final_check_ptr, desired, desired_len)) {
finded = true;
*ret_pos += final_check_pos;
} else {
uint8_t target_sum = __Crypto_sumBytes__(desired, desired_len);
uint8_t target_xor = __Crypto_xorBytes__(desired, desired_len);
uint8_t hash_sum = __Crypto_sumBytes__(final_check_ptr, desired_len);
uint8_t hash_xor = __Crypto_xorBytes__(final_check_ptr, desired_len);
for (size_t pos = 1; pos <= final_check_pos + 1; pos++) {
size_t rpos = final_check_pos - pos;
uint8_t last_final_byte = data[rpos + desired_len];
hash_xor ^= last_final_byte;
hash_sum -= last_final_byte;
uint8_t new_byte = data[rpos];
hash_xor ^= new_byte;
hash_sum += new_byte;
if (
(hash_xor == target_xor)
and (hash_sum == target_sum)
and (__Mem_isEql__(&data[rpos], desired, desired_len))
) {
*ret_pos += rpos;
finded = true;
break;
}
}
}
}
return finded;
}
// # __u64FromTextDec__ atoi atou
uint64_t
__u64FromTextDec__(
const char *bytes, // expected bytes only with numbers from '0' to '9'
size_t len // expected > 0; expected <= __u64FromTextDec_maxLen__
) {
uint64_t result = 0;
size_t numerical_place = 1;
size_t pos = len - 1; // last symbol
while (true) {
char byte = bytes[pos];
uint64_t value = (uint64_t) ((uint8_t)byte - (uint8_t)'0');
result += value * numerical_place;
if (pos == 0) break;
numerical_place *= 10;
pos -= 1;
}
return result;
}
// # bits_rotl16
uint16_t bits_rotl16(uint16_t value, unsigned int shift) {
shift %= 16;
return (value << shift) | (value >> (16 - shift));
}
// # bits_rotl32
uint32_t bits_rotl32(uint32_t value, unsigned int shift) {
shift %= 32;
return (value << shift) | (value >> (32 - shift));
}
// # bits_rotl64
uint64_t bits_rotl64(uint64_t value, unsigned int shift) {
shift %= 64;
return (value << shift) | (value >> (64 - shift));
}
// # bits_rotl8
uint8_t bits_rotl8(uint8_t value, unsigned int shift) {
shift %= 8;
return (value << shift) | (value >> (8 - shift));
}
// # call_other_trace_example
void call_other_trace_example(
struct __Trace__* prev_trace // can be null
) {
struct __Trace__ trace; __Trace_init__(&trace, prev_trace, __LINE__);
trace.__Trace_line__ = __LINE__; print_trace_example(0, &trace);
}
// # cpu_checkNumberFormat
bool cpu_checkNumberFormat() {
char current_endians = 0;
int n = 1;
if (* (char *) &n == 1) {
current_endians = __TargetMemoryType_endiansLittle__;
} else {
current_endians = __TargetMemoryType_endiansBig__;
}
if (__target_memoryType__ == current_endians) {
return true;
} else {
printf("%d wrong MEMORY_TYPE !\r\n", __LINE__);
}
return false;
}
// # isStartWith
bool isStartWith(struct Slice* a, struct Slice* b) {
return (a->len >= b->len) && __Mem_isEql__(a->ptr, b->ptr, b->len);
}
// # main
#ifndef __COMPILED_FROM_ZIG_FILE__
int main(int args_len, char** args_ptr) {
if (real_main(args_len, args_ptr)) return 0;
return 1;
}
#endif
// # printHex
void printHex(char* buffer_ptr, uintptr_t buffer_len) {
for (int i = 0; i < buffer_len; i++) {
printf(" %02X ", buffer_ptr[i]);
}
}
// # print_trace_example
void print_trace_example(
int anyarg,
struct __Trace__* prev_trace
) {
struct __Trace__ trace; __Trace_init__(&trace, prev_trace, __LINE__);
trace.__Trace_line__ = __LINE__; __Trace_print__(&trace);
}
// # readBig16
uint16_t readBig16(char* src) {
uint16_t ret;
__Mem_nativeToBig__( (char*) &ret, src, 2);
return ret;
}
// # readBig32
uint32_t readBig32(char* src) {
uint32_t ret;
__Mem_nativeToBig__( (char*) &ret, src, 4);
return ret;
}
// # readBig64
uint64_t readBig64(char* src) {
uint64_t ret;
__Mem_nativeToBig__( (char*) &ret, src, 8);
return ret;
}
// # readLittle16
uint16_t readLittle16(char* src) {
uint16_t ret;
__Mem_nativeToLittle__( (char*) &ret, src, 2);
return ret;
}
// # readLittle32
uint32_t readLittle32(char* src) {
uint32_t ret;
__Mem_nativeToLittle__( (char*) &ret, src, 4);
return ret;
}
// # readLittle64
uint64_t readLittle64(char* src) {
uint64_t ret;
__Mem_nativeToLittle__( (char*) &ret, src, 8);
return ret;
}
// # real_main
bool real_main(int args_len, char** args_ptr) {
struct __Trace__ trace; __Trace_init__(&trace, NULL, __LINE__);
bool ok = true;
trace.__Trace_line__ = __LINE__;
if (tests()) {
trace.__Trace_line__ = __LINE__;
printf("%d success tests \r\n", __LINE__);
if (false and __App_init__(&__app__)) {
trace.__Trace_line__ = __LINE__; __Trace_print__(&trace);
while(true) {
if (!__App_process__(&__app__)) break;
__App_waitToNextFrame__(&__app__);
}
__App_deinit__(&__app__);
} else {
ok = false;
printf("%d fail: __App_init__\r\n", __LINE__);
}
} else {
ok = false;
printf("%d fail tests \r\n", __LINE__);
}
return ok;
}
// # test_rot
bool test_rot() {
char a = 0b11111100 >> 2;
if (a == 0b00111111) {
return true;
} else {
printf("%d: failed test_rot.", __LINE__);
}
return false;
}
// # tests
bool tests() {
// const char* test_file_name = "scalpi_testing_file.txt";
// size_t test_file_name_len = __ZText_countLen__(test_file_name);
if ( true
and cpu_checkNumberFormat()
and __Mem_isEql_test__()
// and __FileComplete_write__(test_file_name, test_file_name_len, "abcd", 4)
// and __FileComplete_write__(test_file_name, test_file_name_len, "efgh", 4)
// and __FileComplete_write__(test_file_name, test_file_name_len, "ijkm", 4)
// and etc...
) {
return true;
} else {
printf("%d fail tests \r\n", __LINE__);
return false;
}
return true;
}
// # writeBig16
void writeBig16(
char *dest,
uint16_t value
) {
__Mem_nativeToBig__( dest, (char*)&value, 2);
}
// # writeBig32
void writeBig32(
char *dest,
uint32_t value
) {
__Mem_nativeToBig__(dest, (char*)&value, 4);
}
// # writeBig64
void writeBig64(
char *dest,
uint64_t value
) {
__Mem_nativeToBig__(dest, (char*)&value, 8);
}
// # writeLittle16
void writeLittle16(
char *dest,
uint16_t value
) {
__Mem_nativeToLittle__(dest, (char*)&value, 2);
}
// # writeLittle32
void writeLittle32(
char *dest,
uint32_t value
) {
__Mem_nativeToLittle__(dest, (char*)&value, 4);
}
// # writeLittle64
void writeLittle64(
char *dest,
uint64_t value
) {
__Mem_nativeToLittle__(dest, (char*)&value, 8);
}
// # writeWithOffset
void writeWithOffset(
char *dest,
size_t *writed,
char *data,
size_t data_len // increment by fn
) {
__Mem_copy__(&dest[*writed], data, data_len);
*writed += data_len;
}
// TODO port this zig code to C
/*
const Utf8 = struct {
const BytesIterator = struct {
const Parsed = struct {
num: u64 = 0,
bytes: []const u8 = &.{},
fn is_connector(t: *Parsed) bool {
if (t.num == 0x200D) return true;
return false;
}
};
const Iterator = struct {
bytes: []const u8,
pos: usize = 0,
fn next(t: *Iterator) ?Parsed {
// Masks:
//| 1 byte | 2 byte | 3 byte | 4 byte
//
// 0xxxxxxx
// 110xxxxx 10xxxxxx
// 1110xxxx 10xxxxxx 10xxxxxx
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// example "?"
// 208 -- 110 10000
// 159 -- 10 011111
// is
// 1055 -- 000 10000011111
parse: {
var parsed: Parsed = .{};
// 1 byte
if (t.bytes.len <= t.pos) break :parse;
const b1 = t.bytes[t.pos];
const c1: u64 = @intCast(b1);
if (checkMask(b1, 0, 0b10000000)) { // 0xxxxxxx
parsed.num = b1 & 0b01111111;
parsed.bytes = t.bytes[t.pos .. t.pos + 1];
t.pos += 1;
return parsed;
}
// 2 byte
if (t.bytes.len <= t.pos + 1) break :parse;
const b2 = t.bytes[t.pos + 1];
const c2: u64 = @intCast(b2);
if (checkMask(b1, 0b11000000, 0b11100000)) { // 110xxxxx
parsed.num = ((c1 & 31) << 6) + (c2 & 63);
parsed.bytes = t.bytes[t.pos .. t.pos + 2];
t.pos += 2;
return parsed;
}
// 3 byte
if (t.bytes.len <= t.pos + 2) break :parse;
const b3 = t.bytes[t.pos + 2];
const c3: u64 = @intCast(b3);
if (checkMask(b1, 0b11100000, 0b11110000)) { // 1110xxxx
parsed.num = ((c1 & 15) << 12) + ((c2 & 63) << 6) + (c3 & 63);
parsed.bytes = t.bytes[t.pos .. t.pos + 3];
t.pos += 3;
return parsed;
}
// 4 byte
if (t.bytes.len <= t.pos + 3) break :parse;
const b4 = t.bytes[t.pos + 3];
const c4: u64 = @intCast(b4);
if (checkMask(b1, 0b11110000, 0b11111000)) { // 11110xxx
parsed.num = ((c1 & 7) << 21) + ((c2 & 63) << 12) + ((c3 & 63) << 6) + (c4 & 63);
parsed.bytes = t.bytes[t.pos .. t.pos + 4];
t.pos += 4;
return parsed;
}
}
t.pos += 1;
return null;
}
};
fn checkMask(num: u8, mask: u8, used_bits: u8) bool {
if (num & used_bits == mask) {
return true;
} else {
return false;
}
}
fn fromDo(bytes: []const u8) Iterator {
return Iterator{ .bytes = bytes };
}
};
};
*/