6832 - tile: right-justify numbers
Fails noisily for negative integers so far.
This commit is contained in:
parent
04d06dfe53
commit
8152b0d109
|
@ -0,0 +1,52 @@
|
|||
# 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-int32-decimal screen, threshold
|
||||
compare n, threshold
|
||||
break-if->=
|
||||
#? print-string screen, "!"
|
||||
print-grapheme screen, 0x20 # space
|
||||
threshold <- try-divide threshold, 0xa
|
||||
loop
|
||||
}
|
||||
print-int32-decimal screen, n
|
||||
}
|
||||
|
||||
fn right-justify-threshold n: int -> result/eax: int {
|
||||
var curr/eax: int <- copy n
|
||||
var out/esi: int <- copy 1
|
||||
var ten/ecx: int <- copy 0xa # constant
|
||||
{
|
||||
compare curr, 0xa
|
||||
break-if-<
|
||||
curr <- try-divide curr, 0xa
|
||||
out <- 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"
|
||||
}
|
|
@ -203,7 +203,7 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad
|
|||
break-if-=
|
||||
# indent stack
|
||||
var indented-col/ebx: int <- copy left-col
|
||||
indented-col <- add 1
|
||||
indented-col <- add 1 # margin-right - 2 for padding spaces
|
||||
# compute stack
|
||||
var stack: int-stack
|
||||
var stack-addr/edi: (addr int-stack) <- address stack
|
||||
|
@ -211,6 +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 i/eax: int <- int-stack-length stack-addr
|
||||
{
|
||||
compare i, 0
|
||||
|
@ -218,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
|
||||
render-integer screen, val, max-val
|
||||
var size/eax: int <- decimal-size val
|
||||
compare size, max-width
|
||||
break-if-<=
|
||||
|
@ -259,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 {
|
||||
fn render-integer screen: (addr screen), val: int, max-val: int {
|
||||
var bg/eax: int <- hash-color val
|
||||
var fg/ecx: int <- copy 7
|
||||
{
|
||||
|
@ -279,7 +281,7 @@ fn render-integer screen: (addr screen), val: int {
|
|||
}
|
||||
start-color screen, fg, bg
|
||||
print-grapheme screen, 0x20 # space
|
||||
print-int32-decimal screen, val
|
||||
print-int32-decimal-right-justified screen, val, max-val
|
||||
print-grapheme screen, 0x20 # space
|
||||
}
|
||||
|
||||
|
|
|
@ -67,3 +67,25 @@ fn int-stack-length _self: (addr int-stack) -> result/eax: int {
|
|||
var top-addr/eax: (addr int) <- get self, top
|
||||
result <- copy *top-addr
|
||||
}
|
||||
|
||||
fn max-stack-value _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
|
||||
var data/edi: (addr array int) <- copy _data
|
||||
var top-addr/ecx: (addr int) <- get self, top
|
||||
var i/ebx: int <- copy 0
|
||||
result <- copy 0
|
||||
{
|
||||
compare i, *top-addr
|
||||
break-if->=
|
||||
var g/edx: (addr int) <- index data, i
|
||||
compare *g, result
|
||||
{
|
||||
break-if-<=
|
||||
result <- copy *g
|
||||
}
|
||||
i <- increment
|
||||
loop
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue