6833 - tile: right-justify for negative numbers

This commit is contained in:
Kartik Agaram 2020-09-22 10:13:35 -07:00
parent 8152b0d109
commit 670bf6ed01
3 changed files with 55 additions and 40 deletions

View File

@ -1,12 +1,12 @@
# print n with enough leading spaces to be right-justified with max
# only works for positive ints for now
fn print-int32-decimal-right-justified screen: (addr screen), n: int, max: int {
var threshold/eax: int <- right-justify-threshold max
# print 'n' with enough leading spaces to be right-justified with 'threshold'
# 'threshold' should be the minimum positive number for some width
fn print-int32-decimal-right-justified screen: (addr screen), n: int, _threshold: int {
# tweak things for negative numbers
var n2/ecx: int <- right-justify-threshold-decimal n
var threshold/eax: int <- copy _threshold
{
#? print-int32-decimal screen, threshold
compare n, threshold
compare n2, threshold
break-if->=
#? print-string screen, "!"
print-grapheme screen, 0x20 # space
threshold <- try-divide threshold, 0xa
loop
@ -14,39 +14,53 @@ fn print-int32-decimal-right-justified screen: (addr screen), n: int, max: int {
print-int32-decimal screen, n
}
fn right-justify-threshold n: int -> result/eax: int {
# return the minimum positive number with the same width in decimal as 'n'
fn right-justify-threshold-decimal n: int -> result/ecx: int {
var ten/edx: int <- copy 0xa # constant
# replace '-' at the start with '0' at the end
var curr/eax: int <- copy n
var out/esi: int <- copy 1
var ten/ecx: int <- copy 0xa # constant
compare curr, 0
{
break-if->=
curr <- negate
curr <- multiply ten
}
# now we're dealing with a positive number
result <- copy 1
{
compare curr, 0xa
break-if-<
curr <- try-divide curr, 0xa
out <- multiply ten
result <- multiply ten
loop
}
result <- copy out
}
fn test-right-justify-threshold {
var x/eax: int <- right-justify-threshold 0
check-ints-equal x, 1, "F - test-right-justify-threshold: 0"
x <- right-justify-threshold 1
check-ints-equal x, 1, "F - test-right-justify-threshold: 1"
x <- right-justify-threshold 4
check-ints-equal x, 1, "F - test-right-justify-threshold: 4"
x <- right-justify-threshold 9
check-ints-equal x, 1, "F - test-right-justify-threshold: 9"
x <- right-justify-threshold 0xa
check-ints-equal x, 0xa, "F - test-right-justify-threshold: 10"
x <- right-justify-threshold 0xb
check-ints-equal x, 0xa, "F - test-right-justify-threshold: 11"
x <- right-justify-threshold 0x4f # 79
check-ints-equal x, 0xa, "F - test-right-justify-threshold: 79"
x <- right-justify-threshold 0x64 # 100
check-ints-equal x, 0x64, "F - test-right-justify-threshold: 100"
x <- right-justify-threshold 0x3e7 # 999
check-ints-equal x, 0x64, "F - test-right-justify-threshold: 999"
x <- right-justify-threshold 0x3e8 # 1000
check-ints-equal x, 0x3e8, "F - test-right-justify-threshold: 1000"
var x/ecx: int <- right-justify-threshold-decimal 0
check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 0"
x <- right-justify-threshold-decimal 1
check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 1"
x <- right-justify-threshold-decimal 4
check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 4"
x <- right-justify-threshold-decimal 9
check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 9"
x <- right-justify-threshold-decimal 0xa
check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 10"
x <- right-justify-threshold-decimal 0xb
check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 11"
x <- right-justify-threshold-decimal 0x4f # 79
check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 79"
x <- right-justify-threshold-decimal 0x64 # 100
check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 100"
x <- right-justify-threshold-decimal 0x65 # 101
check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 101"
x <- right-justify-threshold-decimal 0x3e7 # 999
check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 999"
x <- right-justify-threshold-decimal 0x3e8 # 1000
check-ints-equal x, 0x3e8, "F - test-right-justify-threshold-decimal: 1000"
x <- right-justify-threshold-decimal -1
check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: -1"
x <- right-justify-threshold-decimal -0xb # -11
check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: -11"
}

View File

@ -211,8 +211,8 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad
evaluate first-word, final-word, stack-addr
# render stack
var curr-row/edx: int <- copy 6 # input-row 3 + stack-margin-top 3
var _max-val/eax: int <- max-stack-value stack-addr
var max-val/esi: int <- copy _max-val
var _justify-threshold/eax: int <- max-stack-justify-threshold stack-addr
var justify-threshold/esi: int <- copy _justify-threshold
var i/eax: int <- int-stack-length stack-addr
{
compare i, 0
@ -220,7 +220,7 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad
move-cursor screen, curr-row, indented-col
{
var val/eax: int <- pop-int-stack stack-addr
render-integer screen, val, max-val
render-integer screen, val, justify-threshold
var size/eax: int <- decimal-size val
compare size, max-width
break-if-<=
@ -261,7 +261,7 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad
}
# synaesthesia
fn render-integer screen: (addr screen), val: int, max-val: int {
fn render-integer screen: (addr screen), val: int, justify-threshold: int {
var bg/eax: int <- hash-color val
var fg/ecx: int <- copy 7
{
@ -281,7 +281,7 @@ fn render-integer screen: (addr screen), val: int, max-val: int {
}
start-color screen, fg, bg
print-grapheme screen, 0x20 # space
print-int32-decimal-right-justified screen, val, max-val
print-int32-decimal-right-justified screen, val, justify-threshold
print-grapheme screen, 0x20 # space
}

View File

@ -68,7 +68,7 @@ fn int-stack-length _self: (addr int-stack) -> result/eax: int {
result <- copy *top-addr
}
fn max-stack-value _self: (addr int-stack) -> result/eax: int {
fn max-stack-justify-threshold _self: (addr int-stack) -> result/eax: int {
var self/esi: (addr int-stack) <- copy _self
var data-ah/edi: (addr handle array int) <- get self, data
var _data/eax: (addr array int) <- lookup *data-ah
@ -80,10 +80,11 @@ fn max-stack-value _self: (addr int-stack) -> result/eax: int {
compare i, *top-addr
break-if->=
var g/edx: (addr int) <- index data, i
compare *g, result
var threshold/ecx: int <- right-justify-threshold-decimal *g
compare threshold, result
{
break-if-<=
result <- copy *g
result <- copy threshold
}
i <- increment
loop