Word Unperfect
public
Read
Owner: themaster
Branch: main
Commits: 0
Git CLI clone URL
git clone https://www.xt-emporium.com/git/word-unperfect.git
Fullscreen desktop URL
Code
Commits
History
Branches
Bug Reports
Discussions
Compare
Settings
word-unperfect
/
rev
/
wp_record_stream.c
File editor
/* Parser/layout tail from Ghidra (not linked in owbuild yet). Buffer primitives: * wp_record_stream_buffers.c */ #include "wp_record_stream.h" #include "wp_parser_classify.h" #include <string.h> #include "wp_layout_state.h" #include "wp_span_metrics.h" #include "wp_host_compat.h" extern void __cdecl16near parser_carry_chain_eval_order_no_op(WpLayoutGlobals *wl); extern uint16_t __cdecl16near layout_decrement_cursor_and_span_aux_route_stage_1(WpLayoutGlobals *wl); extern uint16_t __cdecl16near layout_decrement_cursor_and_span_aux_route_stage_2(WpLayoutGlobals *wl); extern void __cdecl16near check_layout_state_update_gate(WpLayoutGlobals *wl, uint8_t *in_CF); extern uint8_t __cdecl16near layout_scan_memory_stride_3_for_char(WpLayoutGlobals *wl); extern void __cdecl16near route_far_jump_shell_segment_proxy(WpLayoutGlobals *wl); extern void __cdecl16near layout_sub_ax_from_variant_anchor_and_total(WpLayoutGlobals *wl); extern void __cdecl16near layout_status_extend_update(WpLayoutGlobals *wl); extern void __cdecl16near layout_sub_metrics_line_accum_from_variant_anchor_and_total(WpLayoutGlobals *wl); extern uint8_t __cdecl16near layout_variant_balance_check(WpLayoutGlobals *wl); extern uint8_t __cdecl16near scan_memory_stride_3_for_char(WpLayoutGlobals *wl); extern uint8_t __cdecl16near consume_and_prepend_byte_input(WpLayoutGlobals *wl); extern void __cdecl16near layout_record_wide_temp_lo_hi_route_stage_1(WpLayoutGlobals *wl); extern uint16_t __cdecl16near layout_reset_cursor_aliases_variant_table(WpLayoutGlobals *wl); extern uint32_t __cdecl16near layout_add_compact_metric_delta(WpLayoutGlobals *wl, uint16_t delta_high, uint16_t delta_low); extern void __cdecl16near parser_io_flags_set_4_and_backup_irq(WpLayoutGlobals *wl, int high, int low); extern void __cdecl16near consume_gated_byte_and_classify(WpLayoutGlobals *wl); extern uint16_t __cdecl16near allocate_layout_gate_mask_bit(WpLayoutGlobals *wl); extern void __cdecl16near layout_parse_token_stream_until_gate_overflow(WpLayoutGlobals *wl, uint16_t gate); extern void __cdecl16near layout_parse_field_whitespace_position_gate(WpLayoutGlobals *wl); extern void __cdecl16near free_layout_gate_mask_bit(WpLayoutGlobals *wl); extern void __cdecl16near set_mode_or_status_bits(WpLayoutGlobals *wl); extern uint32_t __cdecl16near layout_cursor_extent_clamp(WpLayoutGlobals *wl); extern uint16_t __cdecl16near consume_and_prepend_word_secondary(WpLayoutGlobals *wl); extern uint16_t __cdecl16near layout_record_length_word_from_stream(WpLayoutGlobals *wl); extern void __cdecl16near layout_heap_control_branch(WpLayoutGlobals *wl); extern void __cdecl16near layout_update_variant_anchor_state(WpLayoutGlobals *wl); extern void __cdecl16near shell_adjust_byte_at_di_plus2_by_dh(WpLayoutGlobals *wl); extern void __cdecl16near layout_reset_cursor_and_record_aux(WpLayoutGlobals *wl); extern void __cdecl16near layout_measure_line_extent_dirty_heap(WpLayoutGlobals *wl); extern void __cdecl16near engine_far_call_1836(WpLayoutGlobals *wl, uint16_t arg); extern void __cdecl16near parser_no_op_body_proxy(WpLayoutGlobals *wl); void __cdecl16near layout_normalize_if_ctrl_byte_below_d0_path_a(WpLayoutGlobals *wl, uint8_t code) { if (code < 0xd0) { layout_range_check_aux_return_ax(wl); } } void __cdecl16near layout_normalize_if_ctrl_byte_below_d0_path_b(WpLayoutGlobals *wl, uint8_t code) { if (code < 0xd0) { layout_range_check_aux_return_ax(wl); } } uint16_t __cdecl16near layout_range_check_aux_return_ax(WpLayoutGlobals *wl) { (void)wl; return 0; } uint16_t __cdecl16near parser_classify_or_handle_token(WpLayoutGlobals *wl, uint8_t code) { WpParserClassifyStats stats; WpParserClassifyStep step; WpRecord rec; memset(&rec, 0, sizeof(rec)); rec.code = code; rec.is_complete = true; wp_parser_classify_stats_clear(&stats); if (wp_parser_classify_plan_record(wl, &rec, &step)) { wp_parser_classify_apply_step(wl, &step, &stats); if (step.route == WP_PARSER_CLASSIFY_ROUTE_PRINTABLE_BACKTRACK || step.route == WP_PARSER_CLASSIFY_ROUTE_SPACE_BACKTRACK || step.route == WP_PARSER_CLASSIFY_ROUTE_C0_EXTENDED_REPLAY || step.route == WP_PARSER_CLASSIFY_ROUTE_LOW_CONTROL_RESTORE) { return 0xFFFFU; } } return 0; } uint16_t __cdecl16near parser_process_token_stream(WpLayoutGlobals *wl); uint32_t __cdecl16near parser_main_record_loop_with_reentry_guard(WpLayoutGlobals *wl) { uint16_t uVar1; uint16_t uVar2; int iVar3; uint16_t uVar4; uint16_t uVar5; uint16_t in_AX = 0; uint16_t uVar6; uint16_t uVar7; uint16_t in_DX = 0; uint16_t uVar8; int in_BX = -1; int iVar9; uint8_t uVar10; bool bVar11; bool bVar12; char cVar13; char cVar14; uint32_t uVar15; if (wl->parser_reentry_guard != '\0') goto LAB_1000_2e7c; wl->parser_reentry_guard = 1; uVar1 = wl->parser_runtime_flags; wl->parser_runtime_flags = wl->parser_runtime_flags | 0x10; uVar7 = wl->record_stream_offset_low; uVar2 = wl->record_stream_offset_high; uVar15 = layout_toggle_record_mode_flag_word(wl); uVar8 = (uint16_t)(uVar15 >> 16); uVar4 = (uint16_t)(uVar7 < (uint16_t)uVar15); uVar5 = uVar2 - uVar8; uVar10 = uVar2 < uVar8 || uVar5 < uVar4; iVar3 = wl->variant_checkpoint; uVar15 = layout_add_compact_metric_delta(wl, uVar5 - uVar4, uVar7 - (uint16_t)uVar15); parser_io_flags_set_4_and_backup_irq(wl, (int)(uVar15 >> 16), (int)uVar15); if (uVar10) { LAB_1000_2e20: wl->parser_reentry_guard = wl->parser_reentry_guard | 2; } else { bVar11 = in_BX != -1; if (in_BX != -1) { consume_gated_byte_and_classify(wl); *(int *)(wl->secondary_record.word + 2) = in_BX; cVar14 = '\0'; cVar13 = (int8_t)wl->carry_width < 0; uVar10 = (wl->carry_width == 0); if (uVar10) { iVar9 = wl->variant_total; uVar6 = allocate_layout_gate_mask_bit(wl); layout_parse_token_stream_until_gate_overflow(wl, uVar6); if (uVar10 || cVar14 != cVar13) { layout_parse_field_whitespace_position_gate(wl); wl->state_flags = wl->state_flags & 0xfe; } free_layout_gate_mask_bit(wl); if (iVar9 != wl->variant_total) { wl->status_dirty_flags = wl->status_dirty_flags | 0x48; goto LAB_1000_2e25; } } goto LAB_1000_2e20; } /* Compatibility no-op adapter marker for layout render/state-flow gating. */ layout_no_op_return(wl); if (bVar11) goto LAB_1000_2e20; } LAB_1000_2e25: if (wl->carry_width != 0) { set_mode_or_status_bits(wl); } layout_toggle_record_mode_flag_word(wl); wl->record_replay_depth = wl->record_replay_depth + 1; uVar15 = layout_cursor_extent_clamp(wl); uVar7 = (uint16_t)(uVar15 >> 16); wl->record_replay_depth = wl->record_replay_depth - 1; bVar11 = uVar7 < wl->record_stream_offset_high; bVar12 = uVar7 == wl->record_stream_offset_high; if (bVar12) { bVar11 = (uint16_t)uVar15 < wl->record_stream_offset_low; bVar12 = (uint16_t)uVar15 == wl->record_stream_offset_low; } if (bVar11 || bVar12) { wl->parse_dirty_flags = wl->parse_dirty_flags | 8; } wl->parser_runtime_flags = wl->parser_runtime_flags & 0xef; if ((uVar1 & 0x10) != 0) { wl->parser_runtime_flags = wl->parser_runtime_flags | 0x10; } wl->parser_reentry_guard = 0; if (iVar3 == wl->variant_checkpoint) { if (iVar3 == 0) { wl->stream_resume_token = 0; } } else { wl->status_dirty_flags = wl->status_dirty_flags | 0x48; } LAB_1000_2e7c: return CONCAT22(in_DX,in_AX); } uint32_t __cdecl16near process_layout_state_records_main(WpLayoutGlobals *wl) { LayoutPendingSpanRecord *pending_span_record; uint16_t uVar2; uint8_t uVar3; uint8_t uVar4; uint16_t in_AX = 0; uint16_t uVar6; char cVar8; uint16_t uVar7; uint16_t in_DX = 0; uint16_t uVar9; uint8_t uVar10; uint16_t local_10; int local_e; char local_1; if (wl->record_buffer_space < 0x800) { invoke_overlay_expand_primary_buffer(wl); } uVar9 = 0; if (((wl->explicit_span_total == 0) && (wl->measured_span_a != 0)) && ((wl->measured_span_flags & 0x80) != 0)) { local_10 = wl->measured_span_b; uVar9 = 1; local_e = wl->measured_span_a; } if ((wl->measured_span_dirty_flags & 0x80) != 0) { uVar9 = uVar9 | 0x80; } if ((wl->measured_span_total_flags & 0x80) != 0) { wl->measured_span_total = wl->measured_span_a + wl->measured_span_b; uVar9 = uVar9 | 0x40; } if ((uVar9 != 0) || ((wl->runtime_flags & 0x40) != 0)) { uVar3 = wl->state_flags; uVar4 = wl->parser_runtime_flags; wl->parser_runtime_flags = wl->parser_runtime_flags | 0x10; uVar6 = allocate_layout_gate_mask_bit(wl); layout_parse_token_stream_until_gate_overflow(wl, uVar6); if (uVar9 != 0) { pending_span_record = (LayoutPendingSpanRecord *)wl->primary_record.as_record_p; pending_span_record->tag0 = 0x1d4; pending_span_record->tag1 = 0x1d4; if ((uVar9 & 1) != 0) { pending_span_record->record_type = 0x600; pending_span_record->span_a = local_e; pending_span_record->span_b = local_10; pending_span_record->carry_width = (uint16_t)wl->carry_width; } layout_finalize_record_envelope_commit(wl); } uVar10 = 0; wl->measured_span_dirty_flags = 0; wl->measured_span_total = 0; wl->measured_span_total_flags = 0; while ((uVar6 = consume_and_prepend_word_secondary(wl), !uVar10 && ((char)uVar6 == -0x2c))) { cVar8 = (char)(uVar6 >> 8); uVar10 = (cVar8 == '\0'); if (cVar8 == '\x01') { consume_word_from_secondary_buffer(wl); uVar7 = consume_word_from_secondary_buffer(wl); uVar9 = uVar7; do { if (parser_consume_next_input_byte(wl) == 0xFFFFU) break; uVar7 = uVar7 - 1; } while (uVar7 != 0); layout_record_length_word_from_stream(wl); if (uVar10) { uVar2 = wl->record_stream_offset_low; wl->record_stream_offset_low = wl->record_stream_offset_low - (uVar9 + 4); uVar9 = (uint16_t)(uVar2 < uVar9 + 4); uVar10 = (wl->record_stream_offset_high < uVar7 || wl->record_stream_offset_high - uVar7 < uVar9); wl->record_stream_offset_high = (wl->record_stream_offset_high - uVar7) - uVar9; } } else { if (parser_consume_next_input_byte(wl) == 0xFFFFU) break; if (parser_process_token_stream(wl) == 0xFFFFU) break; } } free_layout_gate_mask_bit(wl); wl->parser_runtime_flags = uVar4; wl->state_flags = uVar3; wl->measured_span_shadow = 0; } local_1 = (char)((uint16_t)in_AX >> 8); if (local_1 == '\0') { layout_heap_control_branch(wl); } if (wl->postprocess_mode != '\0') { layout_update_variant_anchor_state(wl); } return CONCAT22(in_DX,in_AX); } uint32_t __cdecl16near layout_finalize_record_envelope_commit(WpLayoutGlobals *wl) { LayoutRecordEnvelopeHeader *record_header; uint16_t *puVar1; uint16_t uVar2; uint16_t in_AX = 0; uint16_t record_byte_length; uint16_t in_DX = 0; uint16_t *unaff_DI = (uint16_t *)wl->primary_record.as_record_p; uint8_t bVar5; record_header = (LayoutRecordEnvelopeHeader *)wl->primary_record.as_record_p; record_byte_length = (uint16_t)((uintptr_t)unaff_DI - (uintptr_t)record_header); if (4 < record_byte_length) { record_header->byte_length = record_byte_length; *unaff_DI = record_byte_length; unaff_DI[1] = CONCAT11((char)record_header->tag,(char)(record_header->tag >> 8)); bVar5 = (uint8_t)(unaff_DI + 2 < (uint16_t *)wl->primary_record.as_record_p); record_byte_length = layout_record_length_word_from_stream(wl); wl->record_used_bytes = wl->record_used_bytes + record_byte_length; wl->record_buffer_space = wl->record_buffer_space - record_byte_length; wl->primary_record.word = wl->primary_record.word + record_byte_length; if ((bVar5 & 1) != 0) { puVar1 = (uint16_t *)&wl->record_stream_offset_low; uVar2 = *puVar1; *puVar1 = *puVar1 + record_byte_length; wl->record_stream_offset_high = wl->record_stream_offset_high + (uint16_t)ghidra_carry2(uVar2, record_byte_length); } } return CONCAT22(in_DX,in_AX); } uint32_t __cdecl16near layout_emit_or_measure_line_window(WpLayoutGlobals *wl) { uint16_t *puVar1; uint16_t *puVar2; uint8_t bVar3; uint16_t in_AX = 0; int iVar4; uint16_t uVar5; int iVar6; uint16_t uVar7; uint16_t uVar8; char extraout_DL = 0; char extraout_DL_00 = 0; char extraout_DL_01 = 0; char extraout_DL_02 = 0; char cVar9; uint16_t in_DX = 0; uint16_t extraout_DX = 0; uint16_t extraout_DX_00 = 0; uint16_t uVar10 = 0; uint16_t extraout_DX_01 = 0; uint16_t extraout_DX_02 = 0; uint16_t *puVar11; uint16_t *puVar12; uint16_t uVar13; uint16_t *puVar14; uint8_t uVar15; bool bVar16; uint16_t uVar17; uVar15 = (uint8_t)(wl->cursor < wl->line_start); bVar16 = (wl->cursor == wl->line_start); /* Carry-chain ordering marker retained as explicit adapter call-through. */ if ((bVar16) || (parser_carry_chain_eval_order_no_op(wl), bVar16)) { do { /* Explicitly model the decompiler-inserted no-op marker hop. */ parser_no_op_body_proxy(wl); if (uVar15) goto LAB_1000_57c1; uVar10 = extraout_DX; shell_adjust_byte_at_di_plus2_by_dh(wl); if (wl->record_buffer_space < 0x800) { invoke_overlay_expand_primary_buffer(wl); uVar10 = extraout_DX_00; } uVar5 = (uint16_t)wl->carry_width; puVar14 = (uint16_t *)wl->primary_record.as_record_p; *puVar14 = 0x2d4; puVar11 = puVar14 + 2; puVar14[1] = 0x2d4; uVar10 = uVar10 & 0xff00; if ((wl->emit_flags & 4) != 0) { wl->emit_flags = wl->emit_flags & 0xfb; wl->emit_flags = wl->emit_flags | 0x10; layout_reset_cursor_aliases_variant_table(wl); *puVar11 = 0x1400; puVar14[3] = wl->emit_record_scratch_5031; puVar14[4] = (uint16_t)wl->line_start; puVar14[5] = wl->emit_record_scratch_5033; puVar14[6] = (uint16_t)wl->emit_record_line_extent; puVar14[7] = (uint16_t)wl->carry_width; uVar17 = wl->emit_record_carry_scratch_7dc1; puVar14[8] = uVar17; wl->emit_record_scratch_5031 = uVar17; uVar17 = wl->emit_record_carry_scratch_7dc3; puVar14[9] = uVar17; wl->line_start = uVar17; layout_reset_cursor_and_record_aux(wl); uVar17 = wl->emit_record_carry_scratch_7dc5; puVar14[10] = uVar17; wl->emit_record_scratch_5033 = uVar17; uVar17 = wl->emit_record_carry_scratch_7dc7; puVar14[0xb] = uVar17; wl->emit_record_line_extent = uVar17; layout_measure_line_extent_dirty_heap(wl); iVar4 = wl->emit_record_carry_scratch_7dc9 - wl->carry_width; puVar11 = puVar14 + 0xd; puVar14[0xc] = (uint16_t)iVar4; wl->carry_width = wl->carry_width + iVar4; uVar10 = extraout_DX_01; if (iVar4 != 0) { wl->render_dirty_flags = wl->render_dirty_flags | 1; wl->variant_total = wl->variant_total + 1; wl->variant_anchor = wl->variant_anchor + 1; uVar10 = (uint16_t)CONCAT11((char)(extraout_DX_01 >> 8), 1); } } bVar16 = false; bVar3 = wl->record_extension_block_count; uVar8 = (uint16_t)bVar3; if (uVar8 != 0) { bVar16 = (bVar3 < wl->record_extension_block_capacity); if (wl->record_extension_block_capacity < bVar3) { uVar8 = (uint16_t)wl->record_extension_block_capacity; } puVar14 = puVar11 + 1; *puVar11 = 1; uVar17 = (uint16_t)wl->carry_width; wl->carry_width = uVar5; uVar13 = (uint16_t)(uintptr_t)wl->record_extension_buffer; puVar11 = puVar14; do { uVar7 = uVar8; puVar12 = puVar11; uVar5 = shell_slide_secondary_record_ring_by_2kb(wl, uVar10); if (!bVar16) { *puVar14 = uVar5; puVar14[1] = (uint16_t)(uintptr_t)puVar11; puVar2 = puVar14 + 3; puVar14[2] = uVar7; puVar14 = puVar14 + 4; *puVar2 = uVar10; } engine_far_call_1836(wl, 0x3adb); bVar16 = (0xffef < uVar13); uVar13 = uVar13 + 0x10; uVar8 = uVar8 - 1; uVar10 = extraout_DX_02; puVar11 = puVar12; } while (uVar8 != 0); wl->carry_width = uVar17; bVar16 = (puVar14 < puVar12); iVar4 = (int)((uintptr_t)puVar14 - (uintptr_t)puVar12); if (iVar4 != 0) { bVar16 = ((char)(iVar4 >> 8) != '\0'); if (bVar16) { iVar4 = 0xf8; } bVar16 = bVar16 && ((uint16_t *)0xff07 < puVar12); *(uint8_t *)((uintptr_t)puVar12 - 1) = (uint8_t)iVar4; } } layout_finalize_record_envelope_commit(wl); cVar9 = extraout_DL; if (!bVar16) { bVar16 = false; wl->status_dirty_flags = wl->status_dirty_flags | 2; iVar4 = (int)consume_word_from_secondary_buffer(wl); cVar9 = extraout_DL_00; if (!bVar16) { if (iVar4 == 0x2d4) { iVar6 = (int)consume_word_from_secondary_buffer(wl); iVar4 = iVar6; do { if (parser_consume_next_input_byte(wl) == 0xFFFFU) break; iVar6 = iVar6 - 1; } while (iVar6 != 0); bVar16 = false; iVar4 = (int)layout_record_length_word_from_stream(wl); cVar9 = extraout_DL_02; if (bVar16) { puVar1 = (uint16_t *)&wl->record_stream_offset_low; uVar10 = *puVar1; *puVar1 = *puVar1 - (uint16_t)(iVar4 + 4); wl->record_stream_offset_high = wl->record_stream_offset_high - (uint16_t)(uVar10 < iVar4 + 4); } } else { prepend_word_to_buffer(wl, (uint16_t)iVar4); cVar9 = extraout_DL_01; } } } if (wl->record_extension_needs_flush != '\0') { wl->emit_flags = wl->emit_flags | 4; break; } uVar15 = 0; } while (cVar9 != '\0'); } else { LAB_1000_57c1: wl->emit_flags = wl->emit_flags & 0xfb; } return CONCAT22(in_DX,in_AX); } uint32_t __cdecl16near layout_toggle_record_mode_flag_word(WpLayoutGlobals *wl) { uint16_t uVar1; uVar1 = (uint16_t)((uint32_t)wl->record_block_index * 0x800); return CONCAT22((uint16_t)(((uint32_t)wl->record_block_index * 0x800 >> 16) + (uint16_t)ghidra_carry2(uVar1, (uint16_t)wl->record_used_bytes)), uVar1 + (uint16_t)wl->record_used_bytes); } uint16_t __cdecl16near layout_record_length_word_from_stream(WpLayoutGlobals *wl) { return (uint16_t)layout_toggle_record_mode_flag_word(wl); } /* Function: consume_and_append_byte_primary @ 1000:0c8a */ void __cdecl16near consume_and_append_byte_primary(WpLayoutGlobals *wl) { uint8_t in_AL; uint8_t in_CF = 0; in_AL = consume_byte_from_primary_buffer(wl); if (!(bool)in_CF) { append_byte_to_buffer(wl, in_AL); } return; } /* Function: check_secondary_record_space_and_invoke_overlay @ 1000:0ccc */ void __cdecl16near check_secondary_record_space_and_invoke_overlay(WpLayoutGlobals *wl, uint16_t unaff_SI) { uint16_t unaff_DS; if ((uint16_t)wl->secondary_record_used_bytes < unaff_SI) { invoke_overlay_probe_secondary_record(wl); } return; }
Commit message
This repository is read-only for this account.
Repository snapshot
Current branch
main
Visibility
public
Your access
Read
Remote
None
File activity
View file history