lib/fmt,strconv: char-literals for fmt/ftos magic decimals (Wave-1)

This commit is contained in:
2026-06-02 20:21:42 +09:00
parent fe32dedb08
commit 5987e389b9
5 changed files with 69 additions and 69 deletions

View File

@@ -43,7 +43,7 @@ fn i64dec(v: i64) str = {
if (n < 0) { neg = true; n = -n; };
let tmp: [20]u8;
let i: i32 = 0;
if (n == 0) { tmp[0] = 48u8; i = 1; };
if (n == 0) { tmp[0] = '0'; i = 1; };
for (n > 0) {
let d: i64 = n % 10i64;
tmp[i] = (d + 48i64): u8;
@@ -51,7 +51,7 @@ fn i64dec(v: i64) str = {
i += 1;
};
let out: i32 = 0;
if (neg) { i64dec_buf[out] = 45u8; out += 1; }; // '-'
if (neg) { i64dec_buf[out] = '-'; out += 1; };
for (i > 0) {
i -= 1;
i64dec_buf[out] = tmp[i];
@@ -186,7 +186,7 @@ fn scandigits(s: str, pos: *i32) i32 = {
let any: bool = false;
for (*pos < s.len) {
let c: u8 = s[*pos];
if (c < 48u8 || c > 57u8) {
if (c < '0' || c > '9') {
if (!any) { fmtabort(); };
return v;
};
@@ -206,25 +206,25 @@ fn scanmods(s: str, pos: *i32, m: *mods) void = {
m.pad = 32: rune; // ' ' — Hare iter.ha:130
for (*pos < s.len) {
let c: u8 = s[*pos];
if (c == 125u8) { return; }; // '}'
if (c == '}') { return; };
*pos += 1;
if (c == 45u8) { m.alignment = alignment.LEFT; } // '-'
else if (c == 61u8) { m.alignment = alignment.CENTER; } // '='
else if (c == 95u8) { // '_'
if (c == '-') { m.alignment = alignment.LEFT; }
else if (c == '=') { m.alignment = alignment.CENTER; }
else if (c == '_') {
if (*pos >= s.len) { fmtabort(); };
m.pad = s[*pos]: rune;
*pos += 1;
}
else if (c == 32u8) { m.neg = neg.SPACE; } // ' '
else if (c == 43u8) { m.neg = neg.PLUS; } // '+'
else if (c == 120u8) { m.base = strconv.base.HEX_LOWER; } // 'x'
else if (c == 88u8) { m.base = strconv.base.HEX_UPPER; } // 'X'
else if (c == 111u8) { m.base = strconv.base.OCT; } // 'o'
else if (c == 98u8) { m.base = strconv.base.BIN; } // 'b'
else if (c == 46u8) { // '.'
else if (c == ' ') { m.neg = neg.SPACE; }
else if (c == '+') { m.neg = neg.PLUS; }
else if (c == 'x') { m.base = strconv.base.HEX_LOWER; }
else if (c == 'X') { m.base = strconv.base.HEX_UPPER; }
else if (c == 'o') { m.base = strconv.base.OCT; }
else if (c == 'b') { m.base = strconv.base.BIN; }
else if (c == '.') {
m.prec = scandigits(s, pos);
}
else if (c >= 49u8 && c <= 57u8) { // '1'..'9'
else if (c >= '1' && c <= '9') {
*pos -= 1;
m.width = scandigits(s, pos);
}
@@ -297,7 +297,7 @@ fn rawlenf64(v: f64, m: *mods) i32 = {
let view: str = strconv.f64tos(v);
let body: i32 = view.len;
let had_neg: bool = false;
if (body > 0 && view.ptr[0] == 45u8) {
if (body > 0 && view.ptr[0] == '-') {
had_neg = true;
body -= 1;
};
@@ -348,7 +348,7 @@ fn formatraw(s: io.handle, arg: formattable, m: *mods) (size | io.error) = {
let pi: i32 = 0;
for (pi < pad0) {
let buf: [1]u8;
buf[0] = 48u8; // '0'
buf[0] = '0';
let r: (size | io.error) = putbytes(s, &buf[0], 1);
match (r) {
case let n: size => { total += n; };
@@ -385,7 +385,7 @@ fn formatraw(s: io.handle, arg: formattable, m: *mods) (size | io.error) = {
// so this peel is a no-op for them.
let view: str = strconv.f64tos(v);
let neg_flag: bool = false;
if (view.len > 0 && view.ptr[0] == 45u8) { // '-'
if (view.len > 0 && view.ptr[0] == '-') {
neg_flag = true;
view.ptr = view.ptr + 1u64;
view.len -= 1;
@@ -529,10 +529,10 @@ export fn fprintf(s: io.handle, fmt: str, args: field...) (size | io.error) = {
let checkunused: bool = true;
for (i < fmt.len) {
let c: u8 = fmt[i];
if (c == 123u8) { // '{'
if (c == '{') {
i += 1;
if (i >= fmt.len) { fmtabort(); };
if (fmt[i] == 123u8) { // '{{' literal
if (fmt[i] == '{') { // '{{' literal
let r: (size | io.error) = putbytes(s, fmt.ptr + i: u64, 1);
match (r) {
case let n: size => { total += n; };
@@ -542,7 +542,7 @@ export fn fprintf(s: io.handle, fmt: str, args: field...) (size | io.error) = {
} else {
let idx: i32 = 0;
let d: u8 = fmt[i];
if (d >= 48u8 && d <= 57u8) {
if (d >= '0' && d <= '9') {
checkunused = false;
idx = scandigits(fmt, &i);
} else {
@@ -551,11 +551,11 @@ export fn fprintf(s: io.handle, fmt: str, args: field...) (size | io.error) = {
};
let m: mods;
modsinit(&m);
if (i < fmt.len && fmt[i] == 58u8) { // ':'
if (i < fmt.len && fmt[i] == ':') {
i += 1;
scanmods(fmt, &i, &m);
};
if (i >= fmt.len || fmt[i] != 125u8) { fmtabort(); };
if (i >= fmt.len || fmt[i] != '}') { fmtabort(); };
i += 1;
if (idx >= args.len) { fmtabort(); };
let r: (size | io.error) = formatfield(s, args[idx], &m);
@@ -564,9 +564,9 @@ export fn fprintf(s: io.handle, fmt: str, args: field...) (size | io.error) = {
case let e: io.error => return e;
};
};
} else if (c == 125u8) { // '}'
} else if (c == '}') {
i += 1;
if (i >= fmt.len || fmt[i] != 125u8) { fmtabort(); };
if (i >= fmt.len || fmt[i] != '}') { fmtabort(); };
let r: (size | io.error) = putbytes(s, fmt.ptr + i: u64, 1);
match (r) {
case let n: size => { total += n; };