diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-09-08 01:39:31 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-09-08 02:09:49 -0700 |
| commit | b53b29d435f83ef9db6afdd9ed4a3d46ba2a2755 (patch) | |
| tree | 35d146dee865179a78a01c5b67b69ed56ce2fcdb | |
| parent | 05e59d02e76a1eed55f04f63257a7bb65326bcb0 (diff) | |
add suffix comments which come at the end of a line
this may be the most important feature for pretty output there aren't actually any yet (though this has been tested), because there's another feature needed to make them useful Change-Id: I4ad26a5815e3ffbc64eddd8c813c6eee6d2e989a Force-Push: yes
| -rw-r--r-- | transform.e | 119 |
1 files changed, 108 insertions, 11 deletions
diff --git a/transform.e b/transform.e index e24e4b7..dd417a3 100644 --- a/transform.e +++ b/transform.e @@ -2729,10 +2729,12 @@ allocate-transformation-state s" transformation-state" variable : hex-output-metadata-entry-string 3 8 * + ; : hex-output-metadata-next-entry 4 8 * + ; : hex-output-metadata-entry-type-line-comment 0 ; -: hex-output-metadata-entry-type-line-break 1 ; -: hex-output-metadata-entry-type-indent 2 ; -: hex-output-metadata-entry-type-string-literal 3 ; -: hex-output-metadata-entry-type-alignment 4 ; +: hex-output-metadata-entry-type-suffix-comment 1 ; +: hex-output-metadata-entry-type-fresh-line 2 ; +: hex-output-metadata-entry-type-blank-line 3 ; +: hex-output-metadata-entry-type-indent 4 ; +: hex-output-metadata-entry-type-string-literal 5 ; +: hex-output-metadata-entry-type-alignment 6 ; ~ Initialize the contents of the output metadata to all zeroes. This is ~ called from hex-transform at its top level, at the very start, to make sure @@ -2845,7 +2847,7 @@ allocate-transformation-state s" transformation-state" variable s" is comments! Enjoy. :)" pack-hex-output-metadata-entry - over 0 hex-output-metadata-entry-type-line-break 0 + over 0 hex-output-metadata-entry-type-blank-line 0 pack-hex-output-metadata-entry 0 swap ! ~ End-of-entries delimiter @@ -2960,6 +2962,45 @@ allocate-transformation-state s" transformation-state" variable transformation-state transformation-state-output-metadata @ hex-output-metadata-indentation-depth ! ; +: postprocess-metadata-entries + transformation-state transformation-state-output-metadata @ + hex-output-metadata-first-entry + { dup @ } { + ~ (entry pointer) + + dup hex-output-metadata-entry-type @ + hex-output-metadata-entry-type-suffix-comment = + over hex-output-metadata-entry-data-length @ 0 != && { + ~ (entry pointer) + dup dup + + { dup @ } { hex-output-metadata-next-entry } while 8 + + ~ (entry pointer, entry pointer, entry array end pointer) + swap - + ~ (entry pointer, entry array tail length) + swap dup dup hex-output-metadata-next-entry 4 roll + ~ (entry pointer, entry pointer, adjusted entry pointer, + ~ entry array tail length) + memmove + ~ (entry pointer) + + dup hex-output-metadata-entry-type + hex-output-metadata-entry-type-fresh-line swap ! + + dup hex-output-metadata-entry-data-length 0 swap ! + + dup hex-output-metadata-next-entry + ~ (entry pointer, next entry pointer) + + dup hex-output-metadata-entry-data-length @ + over hex-output-metadata-entry-data-start @ + + over hex-output-metadata-entry-data-start ! + hex-output-metadata-entry-data-length 0 swap ! + } if + + hex-output-metadata-next-entry + } while drop ; + ~ This "replacement" is a little different from an alternate: When the code ~ under transformation attempts to compile its own version of sys-write, it ~ gets a stub that calls this word instead. It's swapped out by @@ -2974,6 +3015,8 @@ allocate-transformation-state s" transformation-state" variable ~ ~ (length to write, base address --) : hex-sys-write-replacement + postprocess-metadata-entries + { over } { transformation-state transformation-state-output-metadata @ hex-output-metadata-first-entry @@ -2995,7 +3038,21 @@ allocate-transformation-state s" transformation-state" variable } if dup hex-output-metadata-entry-type @ - hex-output-metadata-entry-type-line-break = { + hex-output-metadata-entry-type-suffix-comment = { + space + dup hex-output-metadata-entry-string @ ." ~ " emitstring newline + + 1 is-fresh-line! + } if + + dup hex-output-metadata-entry-type @ + hex-output-metadata-entry-type-fresh-line = { + fresh-line + 1 is-fresh-line! + } if + + dup hex-output-metadata-entry-type @ + hex-output-metadata-entry-type-blank-line = { fresh-line newline 1 is-fresh-line! @@ -3730,12 +3787,45 @@ allocate-transformation-state s" transformation-state" variable : hex-tilde-replacement transformation-state transformation-state-output-metadata @ hex-output-metadata-latest-output-point @ - 0 - 3roll - ~ (data start, data length, string pointer) + swap + ~ (data start, string pointer) + + ~ Copy the first space-separated word of the comment body into scratch + ~ space to see if it's a special instruction. To minimize interference with + ~ the program under transformation, we use the outer log's scratch space + ~ rather than the inner one's. + swap-transform-variables + dup + here @ + ~ (... source pointer, destination pointer) + { over 8@ dup 0x20 != && } { + swap unpack8 swap 3unroll pack8 + } while + 0 pack8 drop drop + + here @ + swap-transform-variables + + ~ (data start, string pointer, first word string pointer) + dup read-integer 0 = { + ~ (data start, string pointer, first word string pointer, data length) + 3unroll stringlen 1+ + + } { + drop 0 swap + } if-else + ~ (data start, data length, adjusted string pointer) + + ~ The first word wasn't special, so proceed to look for whole-line special + ~ instructions. + + dup s" fresh-line" stringcmp 0 = { + drop hex-output-metadata-entry-type-fresh-line 0 + add-hex-output-metadata-entry + exit + } if dup s" blank-line" stringcmp 0 = { - drop hex-output-metadata-entry-type-line-break 0 + drop hex-output-metadata-entry-type-blank-line 0 add-hex-output-metadata-entry exit } if @@ -3752,11 +3842,18 @@ allocate-transformation-state s" transformation-state" variable exit } if + ~ If a nonzero length is specified, treat it as a suffix comment. + over 0 != { + hex-output-metadata-entry-type-suffix-comment swap + add-hex-output-metadata-entry + exit + } if + + ~ It's just an ordinary line comment. hex-output-metadata-entry-type-line-comment swap add-hex-output-metadata-entry ; - ~ The tilde alternate is a very important word for the hex transform; it has ~ the task of implementing a special comment syntax which can be used by words ~ that generate binary output, to define comments which will appear as part of |