commit a74a50a013107b841f6d9a62a65882da86276224
parent 528b0c16fe05c98cefbef0c6faab4f6819d02991
Author: erai <erai@omiltem.net>
Date: Sat, 7 Jun 2025 02:31:59 -0400
add binary constants
Diffstat:
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