mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Change interval syntax: .. open range, ..< half-closed range
This commit is contained in:
+5
-5
@@ -339,7 +339,7 @@ __bounds_check_error :: proc(file: string, line, column: int, index, count: int)
|
|||||||
if 0 <= index && index < count {
|
if 0 <= index && index < count {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fmt.fprintf(os.stderr, "%s(%d:%d) Index %d is out of bounds range 0..%d\n",
|
fmt.fprintf(os.stderr, "%s(%d:%d) Index %d is out of bounds range 0..<%d\n",
|
||||||
file, line, column, index, count);
|
file, line, column, index, count);
|
||||||
__debug_trap();
|
__debug_trap();
|
||||||
}
|
}
|
||||||
@@ -348,7 +348,7 @@ __slice_expr_error :: proc(file: string, line, column: int, low, high, max: int)
|
|||||||
if 0 <= low && low <= high && high <= max {
|
if 0 <= low && low <= high && high <= max {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fmt.fprintf(os.stderr, "%s(%d:%d) Invalid slice indices: [%d..%d..%d]\n",
|
fmt.fprintf(os.stderr, "%s(%d:%d) Invalid slice indices: [%d..<%d..<%d]\n",
|
||||||
file, line, column, low, high, max);
|
file, line, column, low, high, max);
|
||||||
__debug_trap();
|
__debug_trap();
|
||||||
}
|
}
|
||||||
@@ -356,7 +356,7 @@ __substring_expr_error :: proc(file: string, line, column: int, low, high: int)
|
|||||||
if 0 <= low && low <= high {
|
if 0 <= low && low <= high {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fmt.fprintf(os.stderr, "%s(%d:%d) Invalid substring indices: [%d..%d]\n",
|
fmt.fprintf(os.stderr, "%s(%d:%d) Invalid substring indices: [%d..<%d]\n",
|
||||||
file, line, column, low, high);
|
file, line, column, low, high);
|
||||||
__debug_trap();
|
__debug_trap();
|
||||||
}
|
}
|
||||||
@@ -395,7 +395,7 @@ __mem_copy_non_overlapping :: proc(dst, src: rawptr, len: int) -> rawptr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__mem_compare :: proc(a, b: ^byte, n: int) -> int {
|
__mem_compare :: proc(a, b: ^byte, n: int) -> int {
|
||||||
for i in 0..n {
|
for i in 0..<n {
|
||||||
match {
|
match {
|
||||||
case (a+i)^ < (b+i)^:
|
case (a+i)^ < (b+i)^:
|
||||||
return -1;
|
return -1;
|
||||||
@@ -602,7 +602,7 @@ __dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
|||||||
|
|
||||||
__dynamic_array_resize(nm_hashes, size_of(int), align_of(int), new_count);
|
__dynamic_array_resize(nm_hashes, size_of(int), align_of(int), new_count);
|
||||||
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
|
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
|
||||||
for i in 0..new_count {
|
for i in 0..<new_count {
|
||||||
nm.hashes[i] = -1;
|
nm.hashes[i] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -22,29 +22,29 @@ decimal_to_string :: proc(buf: []byte, a: ^Decimal) -> string {
|
|||||||
|
|
||||||
// TODO(bill): make this work with a buffer that's not big enough
|
// TODO(bill): make this work with a buffer that's not big enough
|
||||||
assert(len(buf) >= n);
|
assert(len(buf) >= n);
|
||||||
buf = buf[..n];
|
buf = buf[0..<n];
|
||||||
|
|
||||||
if a.count == 0 {
|
if a.count == 0 {
|
||||||
buf[0] = '0';
|
buf[0] = '0';
|
||||||
return cast(string)buf[0..1];
|
return cast(string)buf[0..<1];
|
||||||
}
|
}
|
||||||
|
|
||||||
w := 0;
|
w := 0;
|
||||||
if a.decimal_point <= 0 {
|
if a.decimal_point <= 0 {
|
||||||
buf[w] = '0'; w++;
|
buf[w] = '0'; w++;
|
||||||
buf[w] = '.'; w++;
|
buf[w] = '.'; w++;
|
||||||
w += digit_zero(buf[w .. w-a.decimal_point]);
|
w += digit_zero(buf[w ..< w-a.decimal_point]);
|
||||||
w += copy(buf[w..], a.digits[0..a.count]);
|
w += copy(buf[w..], a.digits[0..<a.count]);
|
||||||
} else if a.decimal_point < a.count {
|
} else if a.decimal_point < a.count {
|
||||||
w += copy(buf[w..], a.digits[0..a.decimal_point]);
|
w += copy(buf[w..], a.digits[0..<a.decimal_point]);
|
||||||
buf[w] = '.'; w++;
|
buf[w] = '.'; w++;
|
||||||
w += copy(buf[w..], a.digits[a.decimal_point .. a.count]);
|
w += copy(buf[w..], a.digits[a.decimal_point ..< a.count]);
|
||||||
} else {
|
} else {
|
||||||
w += copy(buf[w..], a.digits[0..a.count]);
|
w += copy(buf[w..], a.digits[0..<a.count]);
|
||||||
w += digit_zero(buf[w .. w+a.decimal_point-a.count]);
|
w += digit_zero(buf[w ..< w+a.decimal_point-a.count]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cast(string)buf[0..w];
|
return cast(string)buf[0..<w];
|
||||||
}
|
}
|
||||||
|
|
||||||
// trim trailing zeros
|
// trim trailing zeros
|
||||||
|
|||||||
+23
-23
@@ -21,7 +21,7 @@ write_rune :: proc(buf: ^[]byte, r: rune) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
b, n := utf8.encode_rune(r);
|
b, n := utf8.encode_rune(r);
|
||||||
append(buf, ..b[..n]);
|
append(buf, ..b[0..<n]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Fmt_Info :: struct {
|
Fmt_Info :: struct {
|
||||||
@@ -47,24 +47,24 @@ Fmt_Info :: struct {
|
|||||||
|
|
||||||
fprint :: proc(fd: os.Handle, args: ..any) -> int {
|
fprint :: proc(fd: os.Handle, args: ..any) -> int {
|
||||||
data: [_BUFFER_SIZE]byte;
|
data: [_BUFFER_SIZE]byte;
|
||||||
buf := data[..0];
|
buf := data[0..<0];
|
||||||
bprint(^buf, ..args);
|
bprint(^buf, ..args);
|
||||||
os.write(fd, buf[..len(buf)]);
|
os.write(fd, buf);
|
||||||
return len(buf);
|
return len(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintln :: proc(fd: os.Handle, args: ..any) -> int {
|
fprintln :: proc(fd: os.Handle, args: ..any) -> int {
|
||||||
data: [_BUFFER_SIZE]byte;
|
data: [_BUFFER_SIZE]byte;
|
||||||
buf := data[..0];
|
buf := data[0..<0];
|
||||||
bprintln(^buf, ..args);
|
bprintln(^buf, ..args);
|
||||||
os.write(fd, buf[..len(buf)]);
|
os.write(fd, buf);
|
||||||
return len(buf);
|
return len(buf);
|
||||||
}
|
}
|
||||||
fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int {
|
fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int {
|
||||||
data: [_BUFFER_SIZE]byte;
|
data: [_BUFFER_SIZE]byte;
|
||||||
buf := data[..0];
|
buf := data[0..<0];
|
||||||
bprintf(^buf, fmt, ..args);
|
bprintf(^buf, fmt, ..args);
|
||||||
os.write(fd, buf[..len(buf)]);
|
os.write(fd, buf);
|
||||||
return len(buf);
|
return len(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,9 +82,9 @@ printf :: proc(fmt: string, args: ..any) -> int {
|
|||||||
|
|
||||||
fprint_type :: proc(fd: os.Handle, info: ^Type_Info) {
|
fprint_type :: proc(fd: os.Handle, info: ^Type_Info) {
|
||||||
data: [_BUFFER_SIZE]byte;
|
data: [_BUFFER_SIZE]byte;
|
||||||
buf := data[..0];
|
buf := data[0..<0];
|
||||||
write_type(^buf, info);
|
write_type(^buf, info);
|
||||||
os.write(fd, buf[..len(buf)]);
|
os.write(fd, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_type :: proc(buf: ^[]byte, ti: ^Type_Info) {
|
write_type :: proc(buf: ^[]byte, ti: ^Type_Info) {
|
||||||
@@ -305,15 +305,15 @@ bprintln :: proc(buf: ^[]byte, args: ..any) -> int {
|
|||||||
|
|
||||||
sprint :: proc(buf: []byte, args: ..any) -> string {
|
sprint :: proc(buf: []byte, args: ..any) -> string {
|
||||||
count := bprint(^buf, ..args);
|
count := bprint(^buf, ..args);
|
||||||
return cast(string)buf[..count];
|
return cast(string)buf[0..<count];
|
||||||
}
|
}
|
||||||
sprintln :: proc(buf: []byte, args: ..any) -> string {
|
sprintln :: proc(buf: []byte, args: ..any) -> string {
|
||||||
count := bprintln(^buf, ..args);
|
count := bprintln(^buf, ..args);
|
||||||
return cast(string)buf[..count];
|
return cast(string)buf[0..<count];
|
||||||
}
|
}
|
||||||
sprintf :: proc(buf: []byte, fmt: string, args: ..any) -> string {
|
sprintf :: proc(buf: []byte, fmt: string, args: ..any) -> string {
|
||||||
count := bprintf(^buf, fmt, ..args);
|
count := bprintf(^buf, fmt, ..args);
|
||||||
return cast(string)buf[..count];
|
return cast(string)buf[0..<count];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -519,7 +519,7 @@ _write_int :: proc(fi: ^Fmt_Info, u: u64, base: int, is_signed: bool, bit_size:
|
|||||||
if fi.hash { flags |= strconv.Int_Flag.PREFIX; }
|
if fi.hash { flags |= strconv.Int_Flag.PREFIX; }
|
||||||
if fi.plus { flags |= strconv.Int_Flag.PLUS; }
|
if fi.plus { flags |= strconv.Int_Flag.PLUS; }
|
||||||
if fi.space { flags |= strconv.Int_Flag.SPACE; }
|
if fi.space { flags |= strconv.Int_Flag.SPACE; }
|
||||||
s := strconv.append_bits(buf[..0], u, base, is_signed, bit_size, digits, flags);
|
s := strconv.append_bits(buf[0..<0], u, base, is_signed, bit_size, digits, flags);
|
||||||
|
|
||||||
prev_zero := fi.zero;
|
prev_zero := fi.zero;
|
||||||
defer fi.zero = prev_zero;
|
defer fi.zero = prev_zero;
|
||||||
@@ -584,8 +584,8 @@ fmt_float :: proc(fi: ^Fmt_Info, v: f64, bit_size: int, verb: rune) {
|
|||||||
prec = fi.prec;
|
prec = fi.prec;
|
||||||
}
|
}
|
||||||
buf: [128]byte;
|
buf: [128]byte;
|
||||||
str := strconv.append_float(buf[1..1], v, 'f', prec, bit_size);
|
str := strconv.append_float(buf[1..<1], v, 'f', prec, bit_size);
|
||||||
str = cast(string)buf[..len(str)+1];
|
str = cast(string)buf[0..<len(str)];
|
||||||
if str[1] == '+' || str[1] == '-' {
|
if str[1] == '+' || str[1] == '-' {
|
||||||
str = str[1..];
|
str = str[1..];
|
||||||
} else {
|
} else {
|
||||||
@@ -605,7 +605,7 @@ fmt_float :: proc(fi: ^Fmt_Info, v: f64, bit_size: int, verb: rune) {
|
|||||||
if fi.zero && fi.width_set && fi.width > len(str) {
|
if fi.zero && fi.width_set && fi.width > len(str) {
|
||||||
write_byte(fi.buf, str[0]);
|
write_byte(fi.buf, str[0]);
|
||||||
fmt_write_padding(fi, fi.width - len(str));
|
fmt_write_padding(fi, fi.width - len(str));
|
||||||
write_string(fi.buf, str[1..]);
|
write_string(fi.buf, str[1..<]);
|
||||||
} else {
|
} else {
|
||||||
_pad(fi, str);
|
_pad(fi, str);
|
||||||
}
|
}
|
||||||
@@ -628,7 +628,7 @@ fmt_string :: proc(fi: ^Fmt_Info, s: string, verb: rune) {
|
|||||||
fi.space = false;
|
fi.space = false;
|
||||||
defer fi.space = space;
|
defer fi.space = space;
|
||||||
|
|
||||||
for i in 0..len(s) {
|
for i in 0..<len(s) {
|
||||||
if i > 0 && space {
|
if i > 0 && space {
|
||||||
write_byte(fi.buf, ' ');
|
write_byte(fi.buf, ' ');
|
||||||
}
|
}
|
||||||
@@ -776,7 +776,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|||||||
|
|
||||||
write_byte(fi.buf, '[');
|
write_byte(fi.buf, '[');
|
||||||
defer write_byte(fi.buf, ']');
|
defer write_byte(fi.buf, ']');
|
||||||
for i in 0..info.count {
|
for i in 0..<info.count {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
write_string(fi.buf, ", ");
|
write_string(fi.buf, ", ");
|
||||||
}
|
}
|
||||||
@@ -793,7 +793,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|||||||
write_byte(fi.buf, '[');
|
write_byte(fi.buf, '[');
|
||||||
defer write_byte(fi.buf, ']');
|
defer write_byte(fi.buf, ']');
|
||||||
array := cast(^raw.Dynamic_Array)v.data;
|
array := cast(^raw.Dynamic_Array)v.data;
|
||||||
for i in 0..array.len {
|
for i in 0..<array.len {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
write_string(fi.buf, ", ");
|
write_string(fi.buf, ", ");
|
||||||
}
|
}
|
||||||
@@ -815,7 +815,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|||||||
|
|
||||||
entry_type := union_cast(^Struct)ed.elem;
|
entry_type := union_cast(^Struct)ed.elem;
|
||||||
entry_size := ed.elem_size;
|
entry_size := ed.elem_size;
|
||||||
for i in 0..entries.len {
|
for i in 0..<entries.len {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
write_string(fi.buf, ", ");
|
write_string(fi.buf, ", ");
|
||||||
}
|
}
|
||||||
@@ -844,7 +844,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|||||||
write_byte(fi.buf, '[');
|
write_byte(fi.buf, '[');
|
||||||
defer write_byte(fi.buf, ']');
|
defer write_byte(fi.buf, ']');
|
||||||
slice := cast(^[]byte)v.data;
|
slice := cast(^[]byte)v.data;
|
||||||
for i in 0..len(slice) {
|
for _, i in slice {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
write_string(fi.buf, ", ");
|
write_string(fi.buf, ", ");
|
||||||
}
|
}
|
||||||
@@ -856,7 +856,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|||||||
write_byte(fi.buf, '<');
|
write_byte(fi.buf, '<');
|
||||||
defer write_byte(fi.buf, '>');
|
defer write_byte(fi.buf, '>');
|
||||||
|
|
||||||
for i in 0..info.count {
|
for i in 0..<info.count {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
write_string(fi.buf, ", ");
|
write_string(fi.buf, ", ");
|
||||||
}
|
}
|
||||||
@@ -1011,7 +1011,7 @@ bprintf :: proc(b: ^[]byte, fmt: string, args: ..any) -> int {
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if i > prev_i {
|
if i > prev_i {
|
||||||
write_string(b, fmt[prev_i..i]);
|
write_string(b, fmt[prev_i..<i]);
|
||||||
}
|
}
|
||||||
if i >= end {
|
if i >= end {
|
||||||
break;
|
break;
|
||||||
|
|||||||
+1
-1
@@ -175,7 +175,7 @@ murmur64 :: proc(data: []byte) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO(bill): Fix this
|
// TODO(bill): Fix this
|
||||||
#no_bounds_check data8 := slice_to_bytes(data32[i..])[..3];
|
#no_bounds_check data8 := slice_to_bytes(data32[i..])[..<3];
|
||||||
match len {
|
match len {
|
||||||
case 3:
|
case 3:
|
||||||
h2 ~= cast(u32)data8[2] << 16;
|
h2 ~= cast(u32)data8[2] << 16;
|
||||||
|
|||||||
+4
-4
@@ -160,8 +160,8 @@ mat4_identity :: proc() -> Mat4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mat4_transpose :: proc(m: Mat4) -> Mat4 {
|
mat4_transpose :: proc(m: Mat4) -> Mat4 {
|
||||||
for j in 0..4 {
|
for j in 0..<4 {
|
||||||
for i in 0..4 {
|
for i in 0..<4 {
|
||||||
m[i][j], m[j][i] = m[j][i], m[i][j];
|
m[i][j], m[j][i] = m[j][i], m[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,8 +170,8 @@ mat4_transpose :: proc(m: Mat4) -> Mat4 {
|
|||||||
|
|
||||||
mul :: proc(a, b: Mat4) -> Mat4 {
|
mul :: proc(a, b: Mat4) -> Mat4 {
|
||||||
c: Mat4;
|
c: Mat4;
|
||||||
for j in 0..4 {
|
for j in 0..<4 {
|
||||||
for i in 0..4 {
|
for i in 0..<4 {
|
||||||
c[j][i] = a[0][i]*b[j][0] +
|
c[j][i] = a[0][i]*b[j][0] +
|
||||||
a[1][i]*b[j][1] +
|
a[1][i]*b[j][1] +
|
||||||
a[2][i]*b[j][2] +
|
a[2][i]*b[j][2] +
|
||||||
|
|||||||
+2
-2
@@ -96,7 +96,7 @@ Arena_Temp_Memory :: struct {
|
|||||||
|
|
||||||
init_arena_from_memory :: proc(using a: ^Arena, data: []byte) {
|
init_arena_from_memory :: proc(using a: ^Arena, data: []byte) {
|
||||||
backing = Allocator{};
|
backing = Allocator{};
|
||||||
memory = data[..0];
|
memory = data[0..<0];
|
||||||
temp_count = 0;
|
temp_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ begin_arena_temp_memory :: proc(a: ^Arena) -> Arena_Temp_Memory {
|
|||||||
end_arena_temp_memory :: proc(using tmp: Arena_Temp_Memory) {
|
end_arena_temp_memory :: proc(using tmp: Arena_Temp_Memory) {
|
||||||
assert(len(arena.memory) >= original_count);
|
assert(len(arena.memory) >= original_count);
|
||||||
assert(arena.temp_count > 0);
|
assert(arena.temp_count > 0);
|
||||||
arena.memory = arena.memory[..original_count];
|
arena.memory = arena.memory[0..<original_count];
|
||||||
arena.temp_count--;
|
arena.temp_count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ _libgl := win32.LoadLibraryA(_string_data("opengl32.dll\x00"));
|
|||||||
|
|
||||||
GetProcAddress :: proc(name: string) -> proc() #cc_c {
|
GetProcAddress :: proc(name: string) -> proc() #cc_c {
|
||||||
if name[len(name)-1] == 0 {
|
if name[len(name)-1] == 0 {
|
||||||
name = name[..len(name)-1];
|
name = name[0..<len(name)-1];
|
||||||
}
|
}
|
||||||
// NOTE(bill): null terminated
|
// NOTE(bill): null terminated
|
||||||
assert((^name[0] + len(name))^ == 0);
|
assert((^name[0] + len(name))^ == 0);
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ _alloc_command_line_arguments :: proc() -> []string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cast(string)buf[..i];
|
return cast(string)buf[0..<i];
|
||||||
}
|
}
|
||||||
|
|
||||||
arg_count: i32;
|
arg_count: i32;
|
||||||
|
|||||||
+3
-3
@@ -182,7 +182,7 @@ format_digits :: proc(buf: []byte, shortest: bool, neg: bool, digs: Decimal_Slic
|
|||||||
// integer, padded with zeros when needed
|
// integer, padded with zeros when needed
|
||||||
if digs.decimal_point > 0 {
|
if digs.decimal_point > 0 {
|
||||||
m := min(digs.count, digs.decimal_point);
|
m := min(digs.count, digs.decimal_point);
|
||||||
append(buf, ..digs.digits[..m]);
|
append(buf, ..digs.digits[0..<m]);
|
||||||
for ; m < digs.decimal_point; m++ {
|
for ; m < digs.decimal_point; m++ {
|
||||||
append(buf, '0');
|
append(buf, '0');
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ format_digits :: proc(buf: []byte, shortest: bool, neg: bool, digs: Decimal_Slic
|
|||||||
// fractional part
|
// fractional part
|
||||||
if prec > 0 {
|
if prec > 0 {
|
||||||
append(buf, '.');
|
append(buf, '.');
|
||||||
for i in 0..prec {
|
for i in 0..<prec {
|
||||||
c: byte = '0';
|
c: byte = '0';
|
||||||
if j := digs.decimal_point + i; 0 <= j && j < digs.count {
|
if j := digs.decimal_point + i; 0 <= j && j < digs.count {
|
||||||
c = digs.digits[j];
|
c = digs.digits[j];
|
||||||
@@ -258,7 +258,7 @@ round_shortest :: proc(d: ^Decimal, mant: u64, exp: int, flt: ^Float_Info) {
|
|||||||
|
|
||||||
inclusive := mant%2 == 0;
|
inclusive := mant%2 == 0;
|
||||||
|
|
||||||
for i in 0..d.count {
|
for i in 0..<d.count {
|
||||||
l: byte = '0'; // lower digit
|
l: byte = '0'; // lower digit
|
||||||
if i < lower.count {
|
if i < lower.count {
|
||||||
l = lower.digits[i];
|
l = lower.digits[i];
|
||||||
|
|||||||
+1
-1
@@ -160,7 +160,7 @@ decode_last_rune :: proc(s: []byte) -> (rune, int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start = max(start, 0);
|
start = max(start, 0);
|
||||||
r, size = decode_rune(s[start..end]);
|
r, size = decode_rune(s[start..<end]);
|
||||||
if start+size != end {
|
if start+size != end {
|
||||||
return RUNE_ERROR, 1;
|
return RUNE_ERROR, 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2819,6 +2819,7 @@ bool check_index_value(Checker *c, AstNode *index_value, i64 max_count, i64 *val
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5732,6 +5733,11 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
|
|||||||
o->mode = Addressing_Value;
|
o->mode = Addressing_Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (se->low == NULL && se->high != NULL) {
|
||||||
|
error(se->interval0, "1st index is required if a 2nd index is specified");
|
||||||
|
// It is okay to continue as it will assume the 1st index is zero
|
||||||
|
}
|
||||||
|
|
||||||
if (se->index3 && (se->high == NULL || se->max == NULL)) {
|
if (se->index3 && (se->high == NULL || se->max == NULL)) {
|
||||||
error(se->close, "2nd and 3rd indices are required in a 3-index slice");
|
error(se->close, "2nd and 3rd indices are required in a 3-index slice");
|
||||||
o->mode = Addressing_Invalid;
|
o->mode = Addressing_Invalid;
|
||||||
@@ -5739,6 +5745,16 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
|
|||||||
return kind;
|
return kind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (se->index3 && se->interval0.kind != se->interval1.kind) {
|
||||||
|
error(se->close, "The interval separators for in a 3-index slice must be the same");
|
||||||
|
o->mode = Addressing_Invalid;
|
||||||
|
o->expr = node;
|
||||||
|
return kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TokenKind interval_kind = se->interval0.kind;
|
||||||
|
|
||||||
i64 indices[2] = {0};
|
i64 indices[2] = {0};
|
||||||
AstNode *nodes[3] = {se->low, se->high, se->max};
|
AstNode *nodes[3] = {se->low, se->high, se->max};
|
||||||
for (isize i = 0; i < gb_count_of(nodes); i++) {
|
for (isize i = 0; i < gb_count_of(nodes); i++) {
|
||||||
|
|||||||
+2
-1
@@ -771,7 +771,8 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
|
|||||||
|
|
||||||
TokenKind op = Token_Lt;
|
TokenKind op = Token_Lt;
|
||||||
switch (ie->op.kind) {
|
switch (ie->op.kind) {
|
||||||
case Token_Ellipsis: op = Token_Lt; break;
|
case Token_Ellipsis: op = Token_LtEq; break;
|
||||||
|
case Token_HalfClosed: op = Token_Lt; break;
|
||||||
default: error(ie->op, "Invalid range operator"); break;
|
default: error(ie->op, "Invalid range operator"); break;
|
||||||
}
|
}
|
||||||
bool ok = compare_exact_values(op, a, b);
|
bool ok = compare_exact_values(op, a, b);
|
||||||
|
|||||||
@@ -4905,6 +4905,17 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
|
|||||||
if (se->low != NULL) low = ir_build_expr(proc, se->low);
|
if (se->low != NULL) low = ir_build_expr(proc, se->low);
|
||||||
if (se->high != NULL) high = ir_build_expr(proc, se->high);
|
if (se->high != NULL) high = ir_build_expr(proc, se->high);
|
||||||
if (se->max != NULL) max = ir_build_expr(proc, se->max);
|
if (se->max != NULL) max = ir_build_expr(proc, se->max);
|
||||||
|
|
||||||
|
|
||||||
|
if (high != NULL && se->interval0.kind == Token_Ellipsis) {
|
||||||
|
high = ir_emit_arith(proc, Token_Add, high, v_one, t_int);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max != NULL && se->interval1.kind == Token_Ellipsis) {
|
||||||
|
GB_ASSERT(se->interval0.kind == se->interval1.kind);
|
||||||
|
max = ir_emit_arith(proc, Token_Add, max, v_one, t_int);
|
||||||
|
}
|
||||||
|
|
||||||
irValue *addr = ir_build_addr(proc, se->expr).addr;
|
irValue *addr = ir_build_addr(proc, se->expr).addr;
|
||||||
irValue *base = ir_emit_load(proc, addr);
|
irValue *base = ir_emit_load(proc, addr);
|
||||||
Type *type = base_type(ir_type(base));
|
Type *type = base_type(ir_type(base));
|
||||||
@@ -5553,7 +5564,8 @@ void ir_build_range_interval(irProcedure *proc, AstNodeIntervalExpr *node, Type
|
|||||||
|
|
||||||
TokenKind op = Token_Lt;
|
TokenKind op = Token_Lt;
|
||||||
switch (node->op.kind) {
|
switch (node->op.kind) {
|
||||||
case Token_Ellipsis: op = Token_Lt; break;
|
case Token_Ellipsis: op = Token_LtEq; break;
|
||||||
|
case Token_HalfClosed: op = Token_Lt; break;
|
||||||
default: GB_PANIC("Invalid interval operator"); break;
|
default: GB_PANIC("Invalid interval operator"); break;
|
||||||
}
|
}
|
||||||
irValue *cond = ir_emit_comp(proc, op, ir_emit_load(proc, value), upper);
|
irValue *cond = ir_emit_comp(proc, op, ir_emit_load(proc, value), upper);
|
||||||
|
|||||||
+15
-5
@@ -105,6 +105,7 @@ typedef enum FieldFlag {
|
|||||||
FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_immutable,
|
FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_immutable,
|
||||||
} FieldListTag;
|
} FieldListTag;
|
||||||
|
|
||||||
|
|
||||||
AstNodeArray make_ast_node_array(AstFile *f) {
|
AstNodeArray make_ast_node_array(AstFile *f) {
|
||||||
AstNodeArray a;
|
AstNodeArray a;
|
||||||
// array_init(&a, gb_arena_allocator(&f->arena));
|
// array_init(&a, gb_arena_allocator(&f->arena));
|
||||||
@@ -155,9 +156,11 @@ AST_NODE_KIND(_ExprBegin, "", i32) \
|
|||||||
AST_NODE_KIND(SelectorExpr, "selector expression", struct { Token token; AstNode *expr, *selector; }) \
|
AST_NODE_KIND(SelectorExpr, "selector expression", struct { Token token; AstNode *expr, *selector; }) \
|
||||||
AST_NODE_KIND(IndexExpr, "index expression", struct { AstNode *expr, *index; Token open, close; }) \
|
AST_NODE_KIND(IndexExpr, "index expression", struct { AstNode *expr, *index; Token open, close; }) \
|
||||||
AST_NODE_KIND(DerefExpr, "dereference expression", struct { Token op; AstNode *expr; }) \
|
AST_NODE_KIND(DerefExpr, "dereference expression", struct { Token op; AstNode *expr; }) \
|
||||||
AST_NODE_KIND(SliceExpr, "slice expression", struct { \
|
AST_NODE_KIND(SliceExpr, "slice expression", struct { \
|
||||||
AstNode *expr; \
|
AstNode *expr; \
|
||||||
Token open, close; \
|
Token open, close; \
|
||||||
|
Token interval0; \
|
||||||
|
Token interval1; \
|
||||||
bool index3; \
|
bool index3; \
|
||||||
AstNode *low, *high, *max; \
|
AstNode *low, *high, *max; \
|
||||||
}) \
|
}) \
|
||||||
@@ -686,11 +689,13 @@ AstNode *ast_index_expr(AstFile *f, AstNode *expr, AstNode *index, Token open, T
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AstNode *ast_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, bool index3, AstNode *low, AstNode *high, AstNode *max) {
|
AstNode *ast_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, Token interval0, Token interval1, bool index3, AstNode *low, AstNode *high, AstNode *max) {
|
||||||
AstNode *result = make_ast_node(f, AstNode_SliceExpr);
|
AstNode *result = make_ast_node(f, AstNode_SliceExpr);
|
||||||
result->SliceExpr.expr = expr;
|
result->SliceExpr.expr = expr;
|
||||||
result->SliceExpr.open = open;
|
result->SliceExpr.open = open;
|
||||||
result->SliceExpr.close = close;
|
result->SliceExpr.close = close;
|
||||||
|
result->SliceExpr.interval0 = interval0;
|
||||||
|
result->SliceExpr.interval1 = interval1;
|
||||||
result->SliceExpr.index3 = index3;
|
result->SliceExpr.index3 = index3;
|
||||||
result->SliceExpr.low = low;
|
result->SliceExpr.low = low;
|
||||||
result->SliceExpr.high = high;
|
result->SliceExpr.high = high;
|
||||||
@@ -1980,15 +1985,19 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) {
|
|||||||
f->expr_level++;
|
f->expr_level++;
|
||||||
open = expect_token(f, Token_OpenBracket);
|
open = expect_token(f, Token_OpenBracket);
|
||||||
|
|
||||||
if (f->curr_token.kind != Token_Ellipsis) {
|
if (f->curr_token.kind != Token_Ellipsis &&
|
||||||
|
f->curr_token.kind != Token_HalfClosed) {
|
||||||
indices[0] = parse_expr(f, false);
|
indices[0] = parse_expr(f, false);
|
||||||
}
|
}
|
||||||
bool is_index = true;
|
bool is_index = true;
|
||||||
|
|
||||||
while (f->curr_token.kind == Token_Ellipsis && ellipsis_count < gb_count_of(ellipses)) {
|
while ((f->curr_token.kind == Token_Ellipsis ||
|
||||||
|
f->curr_token.kind == Token_HalfClosed)
|
||||||
|
&& ellipsis_count < gb_count_of(ellipses)) {
|
||||||
ellipses[ellipsis_count++] = f->curr_token;
|
ellipses[ellipsis_count++] = f->curr_token;
|
||||||
next_token(f);
|
next_token(f);
|
||||||
if (f->curr_token.kind != Token_Ellipsis &&
|
if (f->curr_token.kind != Token_Ellipsis &&
|
||||||
|
f->curr_token.kind != Token_HalfClosed &&
|
||||||
f->curr_token.kind != Token_CloseBracket &&
|
f->curr_token.kind != Token_CloseBracket &&
|
||||||
f->curr_token.kind != Token_EOF) {
|
f->curr_token.kind != Token_EOF) {
|
||||||
indices[ellipsis_count] = parse_expr(f, false);
|
indices[ellipsis_count] = parse_expr(f, false);
|
||||||
@@ -2013,7 +2022,7 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) {
|
|||||||
indices[2] = ast_bad_expr(f, ellipses[1], close);
|
indices[2] = ast_bad_expr(f, ellipses[1], close);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
operand = ast_slice_expr(f, operand, open, close, index3, indices[0], indices[1], indices[2]);
|
operand = ast_slice_expr(f, operand, open, close, ellipses[0], ellipses[1], index3, indices[0], indices[1], indices[2]);
|
||||||
} else {
|
} else {
|
||||||
operand = ast_index_expr(f, operand, indices[0], open, close);
|
operand = ast_index_expr(f, operand, indices[0], open, close);
|
||||||
}
|
}
|
||||||
@@ -2301,6 +2310,7 @@ AstNode *parse_simple_stmt(AstFile *f, bool in_stmt_ok) {
|
|||||||
allow_token(f, Token_in);
|
allow_token(f, Token_in);
|
||||||
AstNode *expr = parse_expr(f, false);
|
AstNode *expr = parse_expr(f, false);
|
||||||
switch (f->curr_token.kind) {
|
switch (f->curr_token.kind) {
|
||||||
|
case Token_HalfClosed:
|
||||||
case Token_Ellipsis: {
|
case Token_Ellipsis: {
|
||||||
Token op = f->curr_token;
|
Token op = f->curr_token;
|
||||||
next_token(f);
|
next_token(f);
|
||||||
|
|||||||
+2
-2
@@ -75,7 +75,7 @@ TOKEN_KIND(Token__ComparisonEnd, "_ComparisonEnd"), \
|
|||||||
TOKEN_KIND(Token_Period, "."), \
|
TOKEN_KIND(Token_Period, "."), \
|
||||||
TOKEN_KIND(Token_Comma, ","), \
|
TOKEN_KIND(Token_Comma, ","), \
|
||||||
TOKEN_KIND(Token_Ellipsis, ".."), \
|
TOKEN_KIND(Token_Ellipsis, ".."), \
|
||||||
TOKEN_KIND(Token_HalfOpenRange, "..<"), \
|
TOKEN_KIND(Token_HalfClosed, "..<"), \
|
||||||
TOKEN_KIND(Token__OperatorEnd, "_OperatorEnd"), \
|
TOKEN_KIND(Token__OperatorEnd, "_OperatorEnd"), \
|
||||||
\
|
\
|
||||||
TOKEN_KIND(Token__KeywordBegin, "_KeywordBegin"), \
|
TOKEN_KIND(Token__KeywordBegin, "_KeywordBegin"), \
|
||||||
@@ -872,7 +872,7 @@ Token tokenizer_get_token(Tokenizer *t) {
|
|||||||
token.kind = Token_Ellipsis;
|
token.kind = Token_Ellipsis;
|
||||||
if (t->curr_rune == '<') {
|
if (t->curr_rune == '<') {
|
||||||
advance_to_next_rune(t);
|
advance_to_next_rune(t);
|
||||||
token.kind = Token_HalfOpenRange;
|
token.kind = Token_HalfClosed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user