197 lines
8.4 KiB
Plaintext
197 lines
8.4 KiB
Plaintext
''****************************************
|
|
''* Simple_Numbers *
|
|
''* Authors: Chip Gracey, Jon Williams *
|
|
''* Copyright (c) 2006 Parallax, Inc. *
|
|
''* See end of file for terms of use. *
|
|
''****************************************
|
|
''
|
|
'' Provides simple numeric conversion methods; all methods return a pointer to
|
|
'' a string.
|
|
''
|
|
'' Updated... 29 APR 2006
|
|
|
|
|
|
CON
|
|
|
|
MAX_LEN = 64 ' 63 chars + zero terminator
|
|
|
|
|
|
VAR
|
|
|
|
long idx ' pointer into string
|
|
byte nstr[MAX_LEN] ' string for numeric data
|
|
|
|
|
|
PUB dec(value)
|
|
|
|
'' Returns pointer to signed-decimal string
|
|
|
|
clrstr(@nstr, MAX_LEN) ' clear output string
|
|
return decstr(value) ' return pointer to numeric string
|
|
|
|
|
|
PUB decf(value, width) | t_val, field
|
|
|
|
'' Returns pointer to signed-decimal, fixed-width (space padded) string
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
width := 1 #> width <# constant(MAX_LEN - 1) ' qualify field width
|
|
|
|
t_val := ||value ' work with absolute
|
|
field~ ' clear field
|
|
|
|
repeat while t_val > 0 ' count number of digits
|
|
field++
|
|
t_val /= 10
|
|
|
|
field #>= 1 ' min field width is 1
|
|
if value < 0 ' if value is negative
|
|
field++ ' bump field for neg sign indicator
|
|
|
|
if field < width ' need padding?
|
|
repeat (width - field) ' yes
|
|
nstr[idx++] := " " ' pad with space(s)
|
|
|
|
return decstr(value)
|
|
|
|
|
|
PUB decx(value, digits) | div
|
|
|
|
'' Returns pointer to zero-padded, signed-decimal string
|
|
'' -- if value is negative, field width is digits+1
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
digits := 1 #> digits <# 10
|
|
|
|
if (value < 0) ' negative value?
|
|
-value ' yes, make positive
|
|
nstr[idx++] := "-" ' and print sign indicator
|
|
|
|
div := 1_000_000_000 ' initialize divisor
|
|
if digits < 10 ' less than 10 digits?
|
|
repeat (10 - digits) ' yes, adjust divisor
|
|
div /= 10
|
|
|
|
value //= (div * 10) ' truncate unused digits
|
|
|
|
repeat digits
|
|
nstr[idx++] := (value / div + "0") ' convert digit to ASCII
|
|
value //= div ' update value
|
|
div /= 10 ' update divisor
|
|
|
|
return @nstr
|
|
|
|
|
|
PUB hex(value, digits)
|
|
|
|
'' Returns pointer to a digits-wide hexadecimal string
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
return hexstr(value, digits)
|
|
|
|
|
|
PUB ihex(value, digits)
|
|
|
|
'' Returns pointer to a digits-wide, indicated (with $) hexadecimal string
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
nstr[idx++] := "$"
|
|
return hexstr(value, digits)
|
|
|
|
|
|
PUB bin(value, digits)
|
|
|
|
'' Returns pointer to a digits-wide binary string
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
return binstr(value, digits)
|
|
|
|
|
|
PUB ibin(value, digits)
|
|
|
|
'' Returns pointer to a digits-wide, indicated (with %) binary string
|
|
|
|
clrstr(@nstr, MAX_LEN)
|
|
nstr[idx++] := "%" ' preface with binary indicator
|
|
return binstr(value, digits)
|
|
|
|
|
|
PRI clrstr(strAddr, size)
|
|
|
|
' Clears string at strAddr
|
|
' -- also resets global character pointer (idx)
|
|
|
|
bytefill(strAddr, 0, size) ' clear string to zeros
|
|
idx~ ' reset index
|
|
|
|
|
|
PRI decstr(value) | div, z_pad
|
|
|
|
' Converts value to signed-decimal string equivalent
|
|
' -- characters written to current position of idx
|
|
' -- returns pointer to nstr
|
|
|
|
if (value < 0) ' negative value?
|
|
-value ' yes, make positive
|
|
nstr[idx++] := "-" ' and print sign indicator
|
|
|
|
div := 1_000_000_000 ' initialize divisor
|
|
z_pad~ ' clear zero-pad flag
|
|
|
|
repeat 10
|
|
if (value => div) ' printable character?
|
|
nstr[idx++] := (value / div + "0") ' yes, print ASCII digit
|
|
value //= div ' update value
|
|
z_pad~~ ' set zflag
|
|
elseif z_pad or (div == 1) ' printing or last column?
|
|
nstr[idx++] := "0"
|
|
div /= 10
|
|
|
|
return @nstr
|
|
|
|
|
|
PRI hexstr(value, digits)
|
|
|
|
' Converts value to digits-wide hexadecimal string equivalent
|
|
' -- characters written to current position of idx
|
|
' -- returns pointer to nstr
|
|
|
|
digits := 1 #> digits <# 8 ' qualify digits
|
|
value <<= (8 - digits) << 2 ' prep most significant digit
|
|
repeat digits
|
|
nstr[idx++] := lookupz((value <-= 4) & $F : "0".."9", "A".."F")
|
|
|
|
return @nstr
|
|
|
|
|
|
PRI binstr(value, digits)
|
|
|
|
' Converts value to digits-wide binary string equivalent
|
|
' -- characters written to current position of idx
|
|
' -- returns pointer to nstr
|
|
|
|
digits := 1 #> digits <# 32 ' qualify digits
|
|
value <<= 32 - digits ' prep MSB
|
|
repeat digits
|
|
nstr[idx++] := (value <-= 1) & 1 + "0" ' move digits (ASCII) to string
|
|
|
|
return @nstr
|
|
|
|
{{
|
|
|
|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ TERMS OF USE: MIT License │
|
|
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
|
|
│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
|
|
│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
|
|
│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
|
|
│is furnished to do so, subject to the following conditions: │
|
|
│ │
|
|
│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
|
|
│ │
|
|
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
|
|
│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
|
|
│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
|
|
│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}} |