summaryrefslogtreecommitdiff
path: root/05/util.b
diff options
context:
space:
mode:
Diffstat (limited to '05/util.b')
-rw-r--r--05/util.b38
1 files changed, 34 insertions, 4 deletions
diff --git a/05/util.b b/05/util.b
index 3d0ffb6..5f7c5e6 100644
--- a/05/util.b
+++ b/05/util.b
@@ -1,3 +1,11 @@
+function sign_extend_32_to_64
+ argument n
+ local c
+ c = n > 31
+ n |= c * 0xffffffff00000000
+ return n
+
+
; multiply two 64-bit signed numbers to a 128-bit number
function full_multiply_signed
argument a
@@ -456,15 +464,27 @@ function fputn_signed
argument fd
argument n
if n < 0 goto fputn_negative
-
- fputn(fd, n)
- return
-
+ fputn(fd, n)
+ return
:fputn_negative
fputc(fd, '-)
n = 0 - n
fputn(fd, n)
return
+
+; like fputn_signed, but include the sign even if it's zero or positive
+function fputn_with_sign
+ argument fd
+ argument n
+ if n < 0 goto fputn_with_sign_negative
+ fputc(fd, '+)
+ fputn(fd, n)
+ return
+ :fputn_with_sign_negative
+ fputc(fd, '-)
+ n = 0 - n
+ fputn(fd, n)
+ return
:hex_digits
string 0123456789abcdef
@@ -527,6 +547,11 @@ function putn_signed
fputn_signed(1, n)
return
+function putn_with_sign
+ argument n
+ fputn_with_sign(1, n)
+ return
+
function putnln
argument n
fputn(1, n)
@@ -539,6 +564,11 @@ function putnln_signed
fputc(1, 10)
return
+function putnln_with_sign
+ argument n
+ fputn_with_sign(1, n)
+ fputc(1, 10)
+ return
function fputc
argument fd