os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit a74a50a013107b841f6d9a62a65882da86276224
parent 528b0c16fe05c98cefbef0c6faab4f6819d02991
Author: erai <erai@omiltem.net>
Date:   Sat,  7 Jun 2025 02:31:59 -0400

add binary constants

Diffstat:
Mcc4.om | 12++++++++++++
Mlib.om | 44++++++++++++++++++++++++++++++++++++++++++++
Mvimfiles/syntax/omiltem.vim | 2++
3 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/cc4.om b/cc4.om @@ -126,6 +126,18 @@ lexer { return IDENT; } + "0b" ["01"] (["01_"]* ["01"])? { + var n: *node; + var ok: int; + n = mknode(ctx.c.p, N_NUM, nil, nil); + n.n = bin2int(&ctx.buf[ctx.start + 2], ctx.end - ctx.start - 2, &ok); + if !ok { + die("invalid bin"); + } + ctx.val.n = n; + return NUMBER; + } + "0x" ["0-9a-fA-F"] (["0-9a-fA-F_"]* ["0-9a-fA-F"])? { var n: *node; var ok: int; diff --git a/lib.om b/lib.om @@ -317,6 +317,50 @@ func readall(fd: int, len: *int, a: *alloc): *byte { return buf; } +func bin2int(s: *byte, len: int, ok: *int): int { + var i: int; + var x: int; + var d: int; + x = 0; + i = 0; + loop { + if i == len { + break; + } + + d = s[i] as int; + + if d == '_' { + i = i + 1; + continue; + } else if d >= '0' && d <= '1' { + d = d - '0'; + } else { + *ok = 0; + return 0; + } + + if x > (1 << 63) - 1 { + *ok = 0; + return 0; + } + + x = x * 2; + + if x > ((1 << 63) - 1) - d { + *ok = 0; + return 0; + } + + x = x + d; + + i = i + 1; + } + + *ok = 1; + return x; +} + func hex2int(s: *byte, len: int, ok: *int): int { var i: int; var x: int; diff --git a/vimfiles/syntax/omiltem.vim b/vimfiles/syntax/omiltem.vim @@ -35,11 +35,13 @@ syn region oChar start=+'+ skip=+\\\\\|\\'+ end=+'+ syn match oDecInt "\<-\=\%(0\|\d\+\)\>" syn match oHexInt "\<-\=0[xX]\%(\x\+\)\>" +syn match oBinInt "\<-\=0[bB]\%([01]\+\)\>" syn region oBlock start="{" end="}" transparent hi def link oDecInt Integer hi def link oHexInt Integer +hi def link oBinInt Integer hi def link Integer Number hi def link oChar Character