TriOS-alt/system/administra/admrtc/Numbers.spin

819 lines
88 KiB
Plaintext

{{
*************************************
* Numbers v1.1 *
* Author: Jeff Martin *
* Copyright (c) 2005 Parallax, Inc. *
* See end of file for terms of use. *
*************************************
{-----------------REVISION HISTORY-----------------
v1.1 - 5/5/2009 fixed formatting bug caused by specifying field width smaller than location of first grouping character.}
}}
VAR
long BCX0, BCX1, BCX2, BCX3 'BCX Workspace
byte Symbols[7] 'Special symbols (7 characters)
byte StrBuf[49] 'Internal String Buffer
PUB Init
''Initialize to default settings. Init MUST be called before first object use.
'' ┌──────────────────────────────────────────────────┐
'' │ DEFAULT SPECIAL SYMBOLS │
'' ├─────┬──────┬─────────────────────────────────────┤
'' │ ID │ Char │ Usage │
'' ├─────┼──────┼─────────────────────────────────────┤
'' │ 1 │ , │ Comma (digit group separator) │
'' │ 2 │ _ │ Underscore (digit group separator) │
'' │ 3 │ $ │ Dollar Sign (Hexadecimal indicator) │
'' │ 4 │ % │ Percent Sign (Binary indicator) │
'' │ 5-7 │ │ Unused (User definable via Config) │
'' └─────┴──────┴─────────────────────────────────────┘
Config(@DefaultSymbols)
PUB Config(SymAddr)
{{Configure for custom symbols.
PARAMETERS: SymAddr = Address of a string of characters (7 or less) to be used as Special Symbols (indexed from 1 to 7). New symbols can be added or
existing symbols can be modified based on regional customs. Note: The first four symbols must always be the logical: 1) digit group separator
(default is ','), 2) general separator (default is '_'), 3) hexadecimal base indicator (default is '$'), and 4) binary base indicator
(default is '%').}}
bytemove(@Symbols, SymAddr, 7)
PUB ToStr(Num, Format): StrAddr
{{Convert long Num to z-string using Format; returns string address.
PARAMETERS: Num = 32-bit signed value to translate to ASCII string.
Format = Indicates output format: base, width, grouping, etc. See "FORMAT SYNTAX" for more information.
RETURNS: Actual length of output string, not including null terminator.}}
BCXToText(Format >> 19 & 7, Format >> 13 & $3F, Format >> 12 & 1, Format >> 11 & 1, Format >> 5 & $3F, BinToBCX(Num, Format & $1F #> 2 <# 16))
StrAddr := @StrBuf
PUB FromStr(StrAddr, Format): Num | Idx, N, Val, Char, Base, GChar, IChar, Field
''Convert z-string (at StrAddr) to long Num using Format.
''PARAMETERS: StrAddr = Address of string buffer containing the numeric string to convert.
'' Format = Indicates input format: base, width, etc. See "FORMAT SYNTAX" for more information. Note: three Format elements are ignored by
'' FromStr(): Zero/Space Padding, Hide/Show Plus Sign, and Digit Group Size. All other elements are actively used during translation.
''RETURNS: Long containing 32-bit signed result.
Base := Format & $1F #> 2 <# 16 'Get base
if GChar := Format >> 13 & 7 'Get grouping character
GChar := Symbols[--GChar #> 0]
if IChar := Format >> 19 & 7 'Get indicator character
IChar := Symbols[--IChar #> 0]
Field := Format >> 5 & $3F - 1 'Get field size, if any (subtract out sign char)
longfill(@Idx, 0, 3) 'Clear Idx, N and Val
repeat while Char := byte[StrAddr][Idx] 'While not null
if (not IChar or (IChar and Val)) and InBaseRange(Char, Base) > 0 'Found first valid digit? (with prefix indicator if required)?
quit ' exit to process digits
else 'else
if not Val := IChar and (Char == IChar) ' look for indicator character (if required)
N := Char == "-" 'Update N flag if not indicator
Idx++
Field += Val 'Subract indicator character from remaining field size
repeat while (Field--) and (Char := byte[StrAddr][Idx++]) and ((Val := InBaseRange(Char, Base)) > 0 or (GChar and (Char == GChar)))
if Val 'While not null and valid digit or grouping char
Num := Num * Base + --Val 'Accumulate if valid digit
if N
-Num 'Negate if necessary
PRI BinToBCX(Num, Base): Digits | N
'Convert signed binary Num to signed BCX value (Binary Coded X ;where X (2..16) is determined by Base)
'Returns: Number of significant Digits (not counting zero-left-padding).
longfill(@BCX0, 0, 4) 'Clear BCX Workspace
N := (Num < 0) & $10000000 'Remember if Num negative
repeat 'Calc all BCX digits
byte[@BCX0][Digits++ >> 1] += ||(Num // Base) << (4 * Digits&1)
while Num /= Base
BCX3 |= N 'If negative, set flag (highest digit of BCX Workspace)
PRI BCXToText(IChar, Group, ShowPlus, SPad, Field, Digits): Size | Idx, GCnt, SChar, GChar, X
'Convert BCX Buffer contents to z-string at StrBuf.
'IChar..Field each correspond to elements of Format. See "FORMAT SYNTAX" for more information.
'If Field = 0, Digits+1+Group is the effective field (always limited to max of 49).
'Digits : Number of significant digits (not counting zero-left-padding).
'RETURNS: Actual Size (length) of output string, not including null terminator.
X := 1-(IChar > 0) 'Xtra char count (1 or 2, for sign and optional base indicator)
IChar := Symbols[--IChar] 'Get base indicator character
SChar := "+" + 2*(BCX3 >> 28) + 11*(not (ShowPlus | (BCX3 >> 28)) or ((Digits == 1) and (BCX0 == 0))) 'Determine sign character ('+', ' ' or '-')
GChar := Symbols[Group & 7 - 1 #> 0] 'Get group character
if Field > 0 and SPad^1 and Digits < 32 'Need to add extra zero-padding?
BCX3 &= $0FFFFFFF ' then clear negative flag and set to 32 digits
Digits := 32
Group := -((Group >>= 3)-(Group > 0))*(Group+1 < Digits) 'Get group size (0 if not enough Digits)
Size := (Field - (Field==0)*(Digits+X+((Digits-1)/Group))) <# 49 'Field = 0? Set Size to Digits+X+Group (max 49).
if Group 'Insert group chars
bytefill(@StrBuf+(Size-Digits-(Digits-1)/Group #> 2), GChar, Digits+(Digits-1)/Group <# Size)
Idx~~ 'Insert digits
repeat while (++Idx < Digits) and (Idx + (GCnt := Idx/Group) < Size-X)
byte[@StrBuf][Size-Idx-1-GCnt] := lookupz(byte[@BCX0][Idx>>1] >> (4 * Idx&1) // 16: "0".."9","A".."F")
bytefill(@StrBuf, " ", Size-Idx-(Idx-1)/Group #> 0) 'Left pad with spaces, if necessary
byte[@StrBuf][Size-X-Idx-(Idx-1)/Group #> 0] := SChar 'Insert sign
if X == 2
byte[@StrBuf][Size-1-Idx-(Idx-1)/Group #> 1] := IChar 'Insert base indicator, if necessary
byte[@StrBuf][Size] := 0 'Zero-terminate string
PRI InBaseRange(Char, Base): Value
'Compare Char against valid characters for Base (1..16) (adjusting for lower-case automatically).
'Returns 0 if Char outside valid Base chars or, if valid, returns corresponding Value+1.
Value := ( Value -= (Char - $2F) * (Char => "0" and Char =< "9") + ((Char &= $DF) - $36) * (Char => "A" and Char =< "F") ) * -(Value < ++Base)
DAT
DefaultSymbols byte ",_$%xxx" 'Special, default, symbols ("x" means unused)
''
''
''**************************
''* FUNCTIONAL DESCRIPTION *
''**************************
''
''The Numbers object converts values in variables (longs) to strings and vice-versa in any base from 2 to 16.
''
''Standard/Default Features:
'' * supports full 32-bit signed values
'' * converts using any base from 2 to 16 (binary to hexadecimal)
'' * defaults to variable widths (ouputs entire number, regardless of size)
'' * uses ' ' or '-' for sign character
''
''Optional Features
'' * allows fixed widths (1 to 49 characters); left padded with either zeros (left justified) or spaces (right justified)
'' * can show plus sign for values > 0
'' * allows digit grouping (each 2 to 8 characters) with customizable separators; ex: 1000000 becomes 1,000,000 and 7AB14B9C becomes 7AB1_4B9C
'' * allows base indicator character (inserted right after sign) with customizable characters; ex: 7AB1 becomes $7AB1 and -1011 becomes -%1011
'' * all special symbols can be customized
''
''
''**************************
''* FORMAT SYNTAX *
''**************************
''
''The Format parameter of ToStr() and FromStr() is a 22-bit value indicating the desired output or input format. Custom values can be used for the Format
''parameter, however, a series of pre-defined constants for common formats as well as each of the elemental building blocks have already been defined by this
''object. These pre-defined constants are listed below, followed by a detailed explanation of the syntax of the Format parameter.
''
''┌────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────┐
''│ COMMON FORMAT CONSTANTS │ │ Working Examples │
''├─────────────────────┬───────────┬────────────┬─────────┬─────────────┬─────────────────┤ ├────────────┬────────┬─────────────────┤
''│ CONSTANT │ INDICATED │ DELIMITING │ PADDING │ BASE │ WIDTH │ │ Long Value │ Format │ String Result │
''│ │ BASE │ │ │ │ (incl. symbols) │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ DEC │ -1234 │
''│ BIN │ │ │ │ Binary │ Variable │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ 1234 │ DEC │ 1234 │
''│ IBIN │ % │ │ │ Binary │ Variable │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ 1234 │ HEX │ 4D2 │
''│ DBIN │ │ Underscore │ │ Binary │ Variable │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ IHEX │ -$4D2 │
''│ IDBIN │ % │ Underscore │ │ Binary │ Variable │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ 1234 │ BIN │ 10011010010 │
''│ BIN2..BIN33 │ │ │ Zero │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ IBIN │ -%10011010010 │
''│ IBIN3..IBIN34 │ % │ │ Zero │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ 1234 │ DDEC │ 1,234 │
''│ DBIN7..DBIN40 │ │ Underscore │ Zero │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ DDEC8 │ -001,234 │
''│ IDBIN8..IDBIN41 │ % │ Underscore │ Zero │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ DSDEC8 │ -1,234 │
''│ SBIN3..SBIN33 │ │ │ Space │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ 1234 │ DBIN │ 100_1101_0010 │
''│ ISBIN4..ISBIN34 │ % │ │ Space │ Binary │ Fixed │ ├────────────┼────────┼─────────────────┤
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ │ -1234 │ DBIN15 │ -0100_1101_0010 │
''│ DSBIN7..DSBIN40 │ │ Underscore │ Space │ Binary │ Fixed │ └────────────┴────────┴─────────────────┘
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ *Note: In these examples, all positive
''│ IDSBIN8..IDSBIN41 │ % │ Underscore │ Space │ Binary │ Fixed │ values' output strings have a space
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ for the sign character. Don't forget
''│ DEC │ │ │ │ Decimal │ Variable │ that fact when sizing string buffer
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤ or otherwise using result.
''│ DDEC │ │ Comma │ │ Decimal │ Variable │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ DEC2..DEC11 │ │ │ Zero │ Decimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ SDEC3..SDEC11 │ │ │ Space │ Decimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ DSDEC6..DSDEC14 │ │ Comma │ Space │ Decimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ HEX │ │ │ │ Hexadecimal │ Variable │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ IHEX │ $ │ │ │ Hexadecimal │ Variable │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ DHEX │ │ Underscore │ │ Hexadecimal │ Variable │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ IDHEX │ $ │ Underscore │ │ Hexadecimal │ Variable │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ HEX2..HEX9 │ │ │ Zero │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ IHEX3..IHEX10 │ $ │ │ Zero │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ DHEX7..DHEX10 │ │ Underscore │ Zero │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ IDHEX8..IDHEX11 │ $ │ Underscore │ Zero │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ SHEX3..SHEX9 │ │ │ Space │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ ISHEX4..ISHEX10 │ $ │ │ Space │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ DSHEX7..DSHEX10 │ │ Underscore │ Space │ Hexadecimal │ Fixed │
''├─────────────────────┼───────────┼────────────┼─────────┼─────────────┼─────────────────┤
''│ IDSHEX8..IDSHEX11 │ $ │ Underscore │ Space │ Hexadecimal │ Fixed │
''└─────────────────────┴───────────┴────────────┴─────────┴─────────────┴─────────────────┘
''
''
''If the desired format was not already defined by the Common Format Constants, above, you may use the following constants as building blocks to create
''the customer format you need.
''
''┌─────────────────────────────────────────────────────┐
''│ FORMAT CONSTANT "BUILDING BLOCKS" │
''│ (use these if no equivelant common format exisits) │
''├────────────────────┬────────────────────────────────┤
''│ CONSTANT │ DESCRIPTION │
''├────────────────────┼────────────────────────────────┤
''│ BIN, DEC or HEX │ Binary, Decimal or Hexadecimal │
''├────────────────────┼────────────────────────────────┤
''│ CHAR1..CHAR48 │ Field Width (includes symbols) │
''├────────────────────┼────────────────────────────────┤
''│ <nothing> / SPCPAD │ Zero / Space Pad │
''├────────────────────┼────────────────────────────────┤
''│ <nothing> / PLUS │ Hide / Show Plus │
''├────────────────────┼────────────────────────────────┤
''│ COMMA, USCORE │ Group Character │
''├────────────────────┼────────────────────────────────┤
''│ GROUP2..GROUP8 │ Group Size │
''├────────────────────┼────────────────────────────────┤
''│ BINCHAR or HEXCHAR │ Indicator Character │
''└────────────────────┴────────────────────────────────┘
''
''
''The detailed syntax of the Format parameter is described below.
''
''There are 7 elements of the Format parameter:
'' 1) Base,
'' 2) Field Width,
'' 3) Zero/Space Padding,
'' 4) Hide/Show Plus Sign,
'' 5) Grouping Character ID,
'' 6) Digit Group Size,
'' 7) Indicator Character
''Only the Base element is required, all others are optional.
''
''The 22-bit syntax is as follows:
''
'' III ZZZ GGG P S FFFFFF BBBBB
''
''I : Indicator Character ID (0-7). 0 = no indicator character, 1 = Comma, 2 = Underscore, 3 = Dollar Sign, 4 = Percent Sign, etc., as defined by default Init; may be customized via call to Config().
''Z : Digit Group Size (0-7). 0 = no digit group characters, 1 = every 2 chars, 2 = every 3 chars, etc.
''G : Grouping Character ID (0-7). 0 or 1 = Comma, 2 = Underscore, etc., as defined by default Init; may be customized via call to Config().
''P : Hide/Show Plus Sign (0-1). For Num values > 0, sign char is: ' ' (if P = 0), or '+' (if P = 1).
''S : Zero/Space Pad (0-1). [Ignored unless Field Width > 0]. 0 = left pad with zeros (left justified), 1 = left pad with spaces (right justified).
''F : Field Width (0-48). String field width, including sign character and any special characters (not including zero terminator).
''B : Base (2-16). Base to convert number to; 2 = binary, 10 = decimal, 16 = hexadecimal, etc. This element is required.
''
''Examples:
''
''Conversion to variable-width decimal value:
'' Use Format of: %000_000_000_0_0_000000_01010, or simply %1010 (decimal 10).
''
''Conversion to 5-character wide, fixed-width hexadecimal value (left padded with zeros):
'' Use Format of: %000_000_000_0_0_000101_10000
''
''Conversion to 5-character wide, fixed-width hexadecimal value (left padded with spaces):
'' Use Format of: %000_000_000_0_1_000101_10000
''
''Conversion to variable-width decimal value comma-separated at thousands:
'' Use Format of: %000_010_001_0_0_000000_01010
''
''Conversion to Indicated, 6-character wide, fixed-width hexadecimal value (left padded with spaces):
'' Use Format of: %011_000_000_0_1_000110_10000
''
''For convenience and code readability, a number of pre-defined symbolic constants are included that can be added together for any format
''combination imaginable. See "FORMAT CONSTANT 'BUILDING BLOCKS'", above. For example, using these constants, the above example format values become
''the following, respectively:
'' DEC
'' HEX+CHAR5
'' HEX+CHAR5+SPCPAD
'' DEC+GROUP3+COMMA
'' HEX+CHAR6+HEXCHAR+SPCPAD
''
''
''┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
''│ 32-Bit Statistics for Bases 2 to 16 │
''├──────┬────────────┬────────────────────────────────────────────────────────────────────────────┬───────────────────┤
''│ Base │ Max Digits │ Range (Signed) │ Range Is Shown │
''│ │ w/o symbols│ Minimum │ Maximum │ Grouped By │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 2 │ 32 │ -10000000_00000000_00000000_00000000 │ +1111111_11111111_11111111_11111111 │ Bytes (exact) │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 3 │ 20 │ -12112_12221_21102_02102 │ +12112_12221_21102_02101 │ Bytes │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 4 │ 16 │ -2000_0000_0000_0000 │ +1333_3333_3333_3333 │ Bytes (exact) │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 5 │ 14 │ -13_344223_434043 │ +13_344223_434042 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 6 │ 12 │ -553032_005532 │ +553032_005531 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 7 │ 12 │ -10_41342_11162 │ +10_41342_11161 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 8 │ 11 │ -2_00000_00000 │ +1_77777_77777 │ Words (15 bits) │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 9 │ 10 │ -54787_73672 │ +54787_73671 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 10 │ 10 │ -2,147,483,648 │ +2,147,483,647 │ Thousands (exact) │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 11 │ 9 │ -A_0222_0282 │ +A_0222_0281 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 12 │ 9 │ -4_BB23_08A8 │ +4_BB23_08A7 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 13 │ 9 │ -2_82BA_4AAB │ +2_82BA_4AAA │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 14 │ 9 │ -1_652C_A932 │ +1_652C_A931 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 15 │ 8 │ -C87D_66B8 │ +C87D_66B7 │ Words │
''├──────┼────────────┼──────────────────────────────────────┼─────────────────────────────────────┼───────────────────┤
''│ 16 │ 8 │ -8000_0000 │ +7FFF_FFFF │ Words (exact) │
''└──────┴────────────┴──────────────────────────────────────┴─────────────────────────────────────┴───────────────────┘
CON
'┌──────────────────────────────────────────┐
'│ Format "Building Blocks" │
'└──────────────────────────────────────────┘
' III ZZZ GGG P S FFFFFF BBBBB
CHAR2 = %000_000_000_0_0_000010_00000 'Fixed Width (includes sign and special symbols)
CHAR3 = %000_000_000_0_0_000011_00000
CHAR4 = %000_000_000_0_0_000100_00000
CHAR5 = %000_000_000_0_0_000101_00000
CHAR6 = %000_000_000_0_0_000110_00000
CHAR7 = %000_000_000_0_0_000111_00000
CHAR8 = %000_000_000_0_0_001000_00000
CHAR9 = %000_000_000_0_0_001001_00000
CHAR10 = %000_000_000_0_0_001010_00000
CHAR11 = %000_000_000_0_0_001011_00000
CHAR12 = %000_000_000_0_0_001100_00000
CHAR13 = %000_000_000_0_0_001101_00000
CHAR14 = %000_000_000_0_0_001110_00000
CHAR15 = %000_000_000_0_0_001111_00000
CHAR16 = %000_000_000_0_0_010000_00000
CHAR17 = %000_000_000_0_0_010001_00000
CHAR18 = %000_000_000_0_0_010010_00000
CHAR19 = %000_000_000_0_0_010011_00000
CHAR20 = %000_000_000_0_0_010100_00000
CHAR21 = %000_000_000_0_0_010101_00000
CHAR22 = %000_000_000_0_0_010110_00000
CHAR23 = %000_000_000_0_0_010111_00000
CHAR24 = %000_000_000_0_0_011000_00000
CHAR25 = %000_000_000_0_0_011001_00000
CHAR26 = %000_000_000_0_0_011010_00000
CHAR27 = %000_000_000_0_0_011011_00000
CHAR28 = %000_000_000_0_0_011100_00000
CHAR29 = %000_000_000_0_0_011101_00000
CHAR30 = %000_000_000_0_0_011110_00000
CHAR31 = %000_000_000_0_0_011111_00000
CHAR32 = %000_000_000_0_0_100000_00000
CHAR33 = %000_000_000_0_0_100001_00000
CHAR34 = %000_000_000_0_0_100010_00000
CHAR35 = %000_000_000_0_0_100011_00000
CHAR36 = %000_000_000_0_0_100100_00000
CHAR37 = %000_000_000_0_0_100101_00000
CHAR38 = %000_000_000_0_0_100110_00000
CHAR39 = %000_000_000_0_0_100111_00000
CHAR40 = %000_000_000_0_0_101000_00000
CHAR41 = %000_000_000_0_0_101001_00000
CHAR42 = %000_000_000_0_0_101010_00000
CHAR43 = %000_000_000_0_0_101011_00000
CHAR44 = %000_000_000_0_0_101100_00000
CHAR45 = %000_000_000_0_0_101101_00000
CHAR46 = %000_000_000_0_0_101110_00000
CHAR47 = %000_000_000_0_0_101111_00000
CHAR48 = %000_000_000_0_0_110000_00000
CHAR49 = %000_000_000_0_0_110001_00000
SPCPAD = %000_000_000_0_1_000000_00000 'Space padded
PLUS = %000_000_000_1_0_000000_00000 'Show plus sign '+' for num > 0
COMMA = %000_000_001_0_0_000000_00000 'Comma delimiter
USCORE = %000_000_010_0_0_000000_00000 'Underscore delimiter
HEXCHAR = %011_000_000_0_0_000000_00000 'Hexadecimal prefix '$'
BINCHAR = %100_000_000_0_0_000000_00000 'Binary prefix '%'
GROUP2 = %000_001_000_0_0_000000_00000 'Group digits
GROUP3 = %000_010_000_0_0_000000_00000
GROUP4 = %000_011_000_0_0_000000_00000
GROUP5 = %000_100_000_0_0_000000_00000
GROUP6 = %000_101_000_0_0_000000_00000
GROUP7 = %000_110_000_0_0_000000_00000
GROUP8 = %000_111_000_0_0_000000_00000
'┌──────────────────────────────────────────┐
'│ Common Decimal Formatters │
'└──────────────────────────────────────────┘
DEC = %000_000_000_0_0_000000_01010 'Decimal, variable widths
DDEC = DEC+GROUP3+COMMA 'Decimal, variable widths, delimited with commas
DEC2 = DEC+CHAR2 'Decimal, fixed widths, zero padded
DEC3 = DEC+CHAR3
DEC4 = DEC+CHAR4
DEC5 = DEC+CHAR5
DEC6 = DEC+CHAR6
DEC7 = DEC+CHAR7
DEC8 = DEC+CHAR8
DEC9 = DEC+CHAR9
DEC10 = DEC+CHAR10
DEC11 = DEC+CHAR11
SDEC3 = DEC3+SPCPAD 'Decimal, fixed widths, space padded
SDEC4 = DEC4+SPCPAD
SDEC5 = DEC5+SPCPAD
SDEC6 = DEC6+SPCPAD
SDEC7 = DEC7+SPCPAD
SDEC8 = DEC8+SPCPAD
SDEC9 = DEC9+SPCPAD
SDEC10 = DEC10+SPCPAD
SDEC11 = DEC11+SPCPAD
DSDEC6 = SDEC6+GROUP3+COMMA 'Decimal, fixed widths, space padded, delimited with commas
DSDEC7 = SDEC7+GROUP3+COMMA
DSDEC8 = SDEC8+GROUP3+COMMA
DSDEC9 = SDEC9+GROUP3+COMMA
DSDEC10 = SDEC10+GROUP3+COMMA
DSDEC11 = SDEC11+GROUP3+COMMA
DSDEC12 = DEC+CHAR12+SPCPAD+GROUP3+COMMA
DSDEC13 = DEC+CHAR13+SPCPAD+GROUP3+COMMA
DSDEC14 = DEC+CHAR14+SPCPAD+GROUP3+COMMA
'┌──────────────────────────────────────────┐
'│ Common Hexadecimal Formatters │
'└──────────────────────────────────────────┘
HEX = %000_000_000_0_0_000000_10000 'Hexadecimal, variable widths
DHEX = HEX+GROUP4+USCORE 'Hexadecimal, variable widths, delimited with underscore
HEX2 = HEX+CHAR2 'Hexadecimal, fixed widths, zero padded
HEX3 = HEX+CHAR3
HEX4 = HEX+CHAR4
HEX5 = HEX+CHAR5
HEX6 = HEX+CHAR6
HEX7 = HEX+CHAR7
HEX8 = HEX+CHAR8
HEX9 = HEX+CHAR9
SHEX3 = HEX3+SPCPAD 'Hexadecimal, fixed widths, space padded
SHEX4 = HEX4+SPCPAD
SHEX5 = HEX5+SPCPAD
SHEX6 = HEX6+SPCPAD
SHEX7 = HEX7+SPCPAD
SHEX8 = HEX8+SPCPAD
SHEX9 = HEX9+SPCPAD
DHEX7 = HEX7+GROUP4+USCORE 'Hexadecimal, fixed widths, zero padded, delimited with underscore
DHEX8 = HEX8+GROUP4+USCORE
DHEX9 = HEX9+GROUP4+USCORE
DHEX10 = HEX+CHAR10+GROUP4+USCORE
DSHEX7 = DHEX7+SPCPAD 'Hexadecimal, fixed widths, space padded, delimited with underscore
DSHEX8 = DHEX8+SPCPAD
DSHEX9 = DHEX9+SPCPAD
DSHEX10 = DHEX10+SPCPAD
IHEX = HEX+HEXCHAR 'Indicated hexadecimal, variable widths
IDHEX = DHEX+HEXCHAR 'Indicated hexadecimal, variable widths, delimited with underscore
IHEX3 = HEX3+HEXCHAR 'Indicated hexadecimal, fixed widths, zero padded
IHEX4 = HEX4+HEXCHAR
IHEX5 = HEX5+HEXCHAR
IHEX6 = HEX6+HEXCHAR
IHEX7 = HEX7+HEXCHAR
IHEX8 = HEX8+HEXCHAR
IHEX9 = HEX9+HEXCHAR
IHEX10 = HEX+CHAR10+HEXCHAR
ISHEX4 = SHEX4+HEXCHAR 'Indicated hexadecimal, fixed widths, space padded
ISHEX5 = SHEX5+HEXCHAR
ISHEX6 = SHEX6+HEXCHAR
ISHEX7 = SHEX7+HEXCHAR
ISHEX8 = SHEX8+HEXCHAR
ISHEX9 = SHEX9+HEXCHAR
ISHEX10 = HEX+CHAR10+SPCPAD+HEXCHAR
IDHEX8 = DHEX8+HEXCHAR 'Indicated hexadecimal, fixed widths, zero padded, delimited with underscore
IDHEX9 = DHEX9+HEXCHAR
IDHEX10 = DHEX10+HEXCHAR
IDHEX11 = HEX+CHAR11+GROUP4+USCORE+HEXCHAR
IDSHEX8 = DSHEX8+HEXCHAR 'Indicated hexadecimal, fixed widths, space padded, delimited with underscore
IDSHEX9 = DSHEX9+HEXCHAR
IDSHEX10 = DSHEX10+HEXCHAR
IDSHEX11 = HEX+CHAR11+GROUP4+USCORE+HEXCHAR
'┌──────────────────────────────────────────┐
'│ Common Binary Formatters │
'└──────────────────────────────────────────┘
BIN = %000_000_000_0_0_000000_00010 'Binary, variable widths
DBIN = BIN+GROUP4+USCORE 'Binary, variable widths, delimited with underscores
BIN2 = BIN+CHAR2 'Binary, fixed widths, zero padded
BIN3 = BIN+CHAR3
BIN4 = BIN+CHAR4
BIN5 = BIN+CHAR5
BIN6 = BIN+CHAR6
BIN7 = BIN+CHAR7
BIN8 = BIN+CHAR8
BIN9 = BIN+CHAR9
BIN10 = BIN+CHAR10
BIN11 = BIN+CHAR11
BIN12 = BIN+CHAR12
BIN13 = BIN+CHAR13
BIN14 = BIN+CHAR14
BIN15 = BIN+CHAR15
BIN16 = BIN+CHAR16
BIN17 = BIN+CHAR17
BIN18 = BIN+CHAR18
BIN19 = BIN+CHAR19
BIN20 = BIN+CHAR20
BIN21 = BIN+CHAR21
BIN22 = BIN+CHAR22
BIN23 = BIN+CHAR23
BIN24 = BIN+CHAR24
BIN25 = BIN+CHAR25
BIN26 = BIN+CHAR26
BIN27 = BIN+CHAR27
BIN28 = BIN+CHAR28
BIN29 = BIN+CHAR29
BIN30 = BIN+CHAR30
BIN31 = BIN+CHAR31
BIN32 = BIN+CHAR32
BIN33 = BIN+CHAR33
SBIN3 = BIN3+SPCPAD 'Binary, fixed widths, space padded
SBIN4 = BIN4+SPCPAD
SBIN5 = BIN5+SPCPAD
SBIN6 = BIN6+SPCPAD
SBIN7 = BIN7+SPCPAD
SBIN8 = BIN8+SPCPAD
SBIN9 = BIN9+SPCPAD
SBIN10 = BIN10+SPCPAD
SBIN11 = BIN11+SPCPAD
SBIN12 = BIN12+SPCPAD
SBIN13 = BIN13+SPCPAD
SBIN14 = BIN14+SPCPAD
SBIN15 = BIN15+SPCPAD
SBIN16 = BIN16+SPCPAD
SBIN17 = BIN17+SPCPAD
SBIN18 = BIN18+SPCPAD
SBIN19 = BIN19+SPCPAD
SBIN20 = BIN20+SPCPAD
SBIN21 = BIN21+SPCPAD
SBIN22 = BIN22+SPCPAD
SBIN23 = BIN23+SPCPAD
SBIN24 = BIN24+SPCPAD
SBIN25 = BIN25+SPCPAD
SBIN26 = BIN26+SPCPAD
SBIN27 = BIN27+SPCPAD
SBIN28 = BIN28+SPCPAD
SBIN29 = BIN29+SPCPAD
SBIN30 = BIN30+SPCPAD
SBIN31 = BIN31+SPCPAD
SBIN32 = BIN32+SPCPAD
SBIN33 = BIN33+SPCPAD
DBIN7 = BIN7+GROUP4+USCORE 'Binary, fixed widths, zero padded, delimited with underscores
DBIN8 = BIN8+GROUP4+USCORE
DBIN9 = BIN9+GROUP4+USCORE
DBIN10 = BIN10+GROUP4+USCORE
DBIN11 = BIN11+GROUP4+USCORE
DBIN12 = BIN12+GROUP4+USCORE
DBIN13 = BIN13+GROUP4+USCORE
DBIN14 = BIN14+GROUP4+USCORE
DBIN15 = BIN15+GROUP4+USCORE
DBIN16 = BIN16+GROUP4+USCORE
DBIN17 = BIN17+GROUP4+USCORE
DBIN18 = BIN18+GROUP4+USCORE
DBIN19 = BIN19+GROUP4+USCORE
DBIN20 = BIN20+GROUP4+USCORE
DBIN21 = BIN21+GROUP4+USCORE
DBIN22 = BIN22+GROUP4+USCORE
DBIN23 = BIN23+GROUP4+USCORE
DBIN24 = BIN24+GROUP4+USCORE
DBIN25 = BIN25+GROUP4+USCORE
DBIN26 = BIN26+GROUP4+USCORE
DBIN27 = BIN27+GROUP4+USCORE
DBIN28 = BIN28+GROUP4+USCORE
DBIN29 = BIN29+GROUP4+USCORE
DBIN30 = BIN30+GROUP4+USCORE
DBIN31 = BIN31+GROUP4+USCORE
DBIN32 = BIN32+GROUP4+USCORE
DBIN33 = BIN33+GROUP4+USCORE
DBIN34 = BIN+CHAR34+GROUP4+USCORE
DBIN35 = BIN+CHAR35+GROUP4+USCORE
DBIN36 = BIN+CHAR36+GROUP4+USCORE
DBIN37 = BIN+CHAR37+GROUP4+USCORE
DBIN38 = BIN+CHAR38+GROUP4+USCORE
DBIN39 = BIN+CHAR39+GROUP4+USCORE
DBIN40 = BIN+CHAR40+GROUP4+USCORE
DSBIN7 = DBIN7+SPCPAD 'Binary, fixed widths, space padded, delimited with underscores
DSBIN8 = DBIN8+SPCPAD
DSBIN9 = DBIN9+SPCPAD
DSBIN10 = DBIN10+SPCPAD
DSBIN11 = DBIN11+SPCPAD
DSBIN12 = DBIN12+SPCPAD
DSBIN13 = DBIN13+SPCPAD
DSBIN14 = DBIN14+SPCPAD
DSBIN15 = DBIN15+SPCPAD
DSBIN16 = DBIN16+SPCPAD
DSBIN17 = DBIN17+SPCPAD
DSBIN18 = DBIN18+SPCPAD
DSBIN19 = DBIN19+SPCPAD
DSBIN20 = DBIN20+SPCPAD
DSBIN21 = DBIN21+SPCPAD
DSBIN22 = DBIN22+SPCPAD
DSBIN23 = DBIN23+SPCPAD
DSBIN24 = DBIN24+SPCPAD
DSBIN25 = DBIN25+SPCPAD
DSBIN26 = DBIN26+SPCPAD
DSBIN27 = DBIN27+SPCPAD
DSBIN28 = DBIN28+SPCPAD
DSBIN29 = DBIN29+SPCPAD
DSBIN30 = DBIN30+SPCPAD
DSBIN31 = DBIN31+SPCPAD
DSBIN32 = DBIN32+SPCPAD
DSBIN33 = DBIN33+SPCPAD
DSBIN34 = DBIN34+SPCPAD
DSBIN35 = DBIN35+SPCPAD
DSBIN36 = DBIN36+SPCPAD
DSBIN37 = DBIN37+SPCPAD
DSBIN38 = DBIN38+SPCPAD
DSBIN39 = DBIN39+SPCPAD
DSBIN40 = DBIN40+SPCPAD
IBIN = BIN+BINCHAR 'Indicated binary, variable widths
IDBIN = DBIN+BINCHAR 'Indicated binary, variable widths, delimited with underscores
IBIN3 = BIN3+BINCHAR 'Indicated binary, fixed widths, zero padded
IBIN4 = BIN4+BINCHAR
IBIN5 = BIN5+BINCHAR
IBIN6 = BIN6+BINCHAR
IBIN7 = BIN7+BINCHAR
IBIN8 = BIN8+BINCHAR
IBIN9 = BIN9+BINCHAR
IBIN10 = BIN10+BINCHAR
IBIN11 = BIN11+BINCHAR
IBIN12 = BIN12+BINCHAR
IBIN13 = BIN13+BINCHAR
IBIN14 = BIN14+BINCHAR
IBIN15 = BIN15+BINCHAR
IBIN16 = BIN16+BINCHAR
IBIN17 = BIN17+BINCHAR
IBIN18 = BIN18+BINCHAR
IBIN19 = BIN19+BINCHAR
IBIN20 = BIN20+BINCHAR
IBIN21 = BIN21+BINCHAR
IBIN22 = BIN22+BINCHAR
IBIN23 = BIN23+BINCHAR
IBIN24 = BIN24+BINCHAR
IBIN25 = BIN25+BINCHAR
IBIN26 = BIN26+BINCHAR
IBIN27 = BIN27+BINCHAR
IBIN28 = BIN28+BINCHAR
IBIN29 = BIN29+BINCHAR
IBIN30 = BIN30+BINCHAR
IBIN31 = BIN31+BINCHAR
IBIN32 = BIN32+BINCHAR
IBIN33 = BIN33+BINCHAR
IBIN34 = BIN+CHAR34+BINCHAR
ISBIN4 = SBIN4+BINCHAR 'Indicated binary, fixed widths, space padded
ISBIN5 = SBIN5+BINCHAR
ISBIN6 = SBIN6+BINCHAR
ISBIN7 = SBIN7+BINCHAR
ISBIN8 = SBIN8+BINCHAR
ISBIN9 = SBIN9+BINCHAR
ISBIN10 = SBIN10+BINCHAR
ISBIN11 = SBIN11+BINCHAR
ISBIN12 = SBIN12+BINCHAR
ISBIN13 = SBIN13+BINCHAR
ISBIN14 = SBIN14+BINCHAR
ISBIN15 = SBIN15+BINCHAR
ISBIN16 = SBIN16+BINCHAR
ISBIN17 = SBIN17+BINCHAR
ISBIN18 = SBIN18+BINCHAR
ISBIN19 = SBIN19+BINCHAR
ISBIN20 = SBIN20+BINCHAR
ISBIN21 = SBIN21+BINCHAR
ISBIN22 = SBIN22+BINCHAR
ISBIN23 = SBIN23+BINCHAR
ISBIN24 = SBIN24+BINCHAR
ISBIN25 = SBIN25+BINCHAR
ISBIN26 = SBIN26+BINCHAR
ISBIN27 = SBIN27+BINCHAR
ISBIN28 = SBIN28+BINCHAR
ISBIN29 = SBIN29+BINCHAR
ISBIN30 = SBIN30+BINCHAR
ISBIN31 = SBIN31+BINCHAR
ISBIN32 = SBIN32+BINCHAR
ISBIN33 = SBIN33+BINCHAR
ISBIN34 = BIN+CHAR34+SPCPAD+BINCHAR
IDBIN8 = DBIN8+BINCHAR 'Indicated binary, fixed widths, zero padded, delimited with underscores
IDBIN9 = DBIN9+BINCHAR
IDBIN10 = DBIN10+BINCHAR
IDBIN11 = DBIN11+BINCHAR
IDBIN12 = DBIN12+BINCHAR
IDBIN13 = DBIN13+BINCHAR
IDBIN14 = DBIN14+BINCHAR
IDBIN15 = DBIN15+BINCHAR
IDBIN16 = DBIN16+BINCHAR
IDBIN17 = DBIN17+BINCHAR
IDBIN18 = DBIN18+BINCHAR
IDBIN19 = DBIN19+BINCHAR
IDBIN20 = DBIN20+BINCHAR
IDBIN21 = DBIN21+BINCHAR
IDBIN22 = DBIN22+BINCHAR
IDBIN23 = DBIN23+BINCHAR
IDBIN24 = DBIN24+BINCHAR
IDBIN25 = DBIN25+BINCHAR
IDBIN26 = DBIN26+BINCHAR
IDBIN27 = DBIN27+BINCHAR
IDBIN28 = DBIN28+BINCHAR
IDBIN29 = DBIN29+BINCHAR
IDBIN30 = DBIN30+BINCHAR
IDBIN31 = DBIN31+BINCHAR
IDBIN32 = DBIN32+BINCHAR
IDBIN33 = DBIN33+BINCHAR
IDBIN34 = DBIN34+BINCHAR
IDBIN35 = DBIN35+BINCHAR
IDBIN36 = DBIN36+BINCHAR
IDBIN37 = DBIN37+BINCHAR
IDBIN38 = DBIN38+BINCHAR
IDBIN39 = DBIN39+BINCHAR
IDBIN40 = DBIN40+BINCHAR
IDBIN41 = BIN+CHAR41+GROUP4+USCORE+BINCHAR
IDSBIN8 = DSBIN8+BINCHAR 'Indicated binary, fixed widths, space padded, delimited with underscores
IDSBIN9 = DSBIN9+BINCHAR
IDSBIN10 = DSBIN10+BINCHAR
IDSBIN11 = DSBIN11+BINCHAR
IDSBIN12 = DSBIN12+BINCHAR
IDSBIN13 = DSBIN13+BINCHAR
IDSBIN14 = DSBIN14+BINCHAR
IDSBIN15 = DSBIN15+BINCHAR
IDSBIN16 = DSBIN16+BINCHAR
IDSBIN17 = DSBIN17+BINCHAR
IDSBIN18 = DSBIN18+BINCHAR
IDSBIN19 = DSBIN19+BINCHAR
IDSBIN20 = DSBIN20+BINCHAR
IDSBIN21 = DSBIN21+BINCHAR
IDSBIN22 = DSBIN22+BINCHAR
IDSBIN23 = DSBIN23+BINCHAR
IDSBIN24 = DSBIN24+BINCHAR
IDSBIN25 = DSBIN25+BINCHAR
IDSBIN26 = DSBIN26+BINCHAR
IDSBIN27 = DSBIN27+BINCHAR
IDSBIN28 = DSBIN28+BINCHAR
IDSBIN29 = DSBIN29+BINCHAR
IDSBIN30 = DSBIN30+BINCHAR
IDSBIN31 = DSBIN31+BINCHAR
IDSBIN32 = DSBIN32+BINCHAR
IDSBIN33 = DSBIN33+BINCHAR
IDSBIN34 = DSBIN34+BINCHAR
IDSBIN35 = DSBIN35+BINCHAR
IDSBIN36 = DSBIN36+BINCHAR
IDSBIN37 = DSBIN37+BINCHAR
IDSBIN38 = DSBIN38+BINCHAR
IDSBIN39 = DSBIN39+BINCHAR
IDSBIN40 = DSBIN40+BINCHAR
IDSBIN41 = BIN+CHAR41+SPCPAD+GROUP4+USCORE+BINCHAR
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}