int64_t readnum(char *str, bool *error)
{
char *r = str, *q;
- int32_t radix;
+ int32_t pradix, sradix, radix;
+ int plen, slen;
uint64_t result, checklimit;
int digit, last;
bool warn = false;
* $<string> (hexadecimal)
* <string><radix-letter>
*/
- if (*r == '0' && (radix = radix_letter(r[1])))
- r += 2;
+ pradix = sradix = 0;
+ plen = slen = 0;
+
+ if (*r == '0' && (pradix = radix_letter(r[1])) != 0)
+ plen = 2;
else if (*r == '$')
- radix = 16, r++;
- else if ((radix = radix_letter(q[-1])) != 0)
- q--;
- else
+ pradix = 16, plen = 1;
+
+ if ((sradix = radix_letter(q[-1])) != 0)
+ slen = 1;
+
+ if (pradix && pradix > sradix) {
+ radix = pradix;
+ r += plen;
+ } else if (sradix && sradix > pradix) {
+ radix = sradix;
+ q -= slen;
+ } else {
radix = 10;
+ }
/*
* If this number has been found for us by something other than
dd 1010_0101x ; Hex
dd $1010_0101 ; Hex
+ db 0dh ; Hex
+ db 0bh ; Hex
+ db 0dx ; Hex
+ db 0bx ; Hex
+ db 0hd ; Hex
+ db 0hb ; Hex
+ db 0xd ; Hex
+ db 0xb ; Hex
+
;; Floating-point constants
;; All of these should output B4A21147
dd 3.7282705e+4 ; Decimal