blob: 2e6ba6f5b9af42ef979a72d4ed27a8a8c28a1c0d [file] [log] [blame]
// Copyright 2019 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
pri status "#not a digit"
pri status "#too large"
pub struct parser?(
val : base.u32,
)
pub func parser.parse?(src: base.io_reader) {
var c : base.u8
while true {
c = args.src.read_u8?()
if c == 0 {
return ok
}
if (c < 0x30) or (0x39 < c) { // '0' and '9' are ASCII 0x30 and 0x39.
return "#not a digit"
}
// Rebase from ASCII (0x30 ..= 0x39) to the value (0 ..= 9).
c -= 0x30
if this.val < 429_496729 {
this.val = (10 * this.val) + (c as base.u32)
continue
} else if (this.val > 429_496729) or (c > 5) {
return "#too large"
}
// Uncomment this assertion to see what facts are known here.
// assert false
this.val = (10 * this.val) + (c as base.u32)
} endwhile
}
pub func parser.value() base.u32 {
return this.val
}