implement str.from_i64
This commit is contained in:
@@ -5,7 +5,7 @@ A very cool language
|
|||||||
## Features
|
## Features
|
||||||
* Clean indentation-based syntax
|
* Clean indentation-based syntax
|
||||||
* Compiles to x86_64 Assembly
|
* Compiles to x86_64 Assembly
|
||||||
* ~~No libc required~~ (SOON; still used for `malloc,realloc,free,snprintf,system,gethostbyname`)
|
* ~~No libc required~~ (SOON; still used for memory allocation and DNS resolution)
|
||||||
* Produces tiny static executables (~50KB with musl)
|
* Produces tiny static executables (~50KB with musl)
|
||||||
* Sometimes works
|
* Sometimes works
|
||||||
* Has the pipe operator
|
* Has the pipe operator
|
||||||
|
|||||||
@@ -105,8 +105,7 @@ section .text
|
|||||||
"
|
"
|
||||||
);
|
);
|
||||||
|
|
||||||
// take that rustfmt
|
for name in &["malloc", "realloc", "free", "system", "gethostbyname"] {
|
||||||
for name in "malloc,realloc,free,snprintf,system,gethostbyname".split(",") {
|
|
||||||
emit!(&mut self.output, "extern {}", name);
|
emit!(&mut self.output, "extern {}", name);
|
||||||
emit!(&mut self.output, "c.{} equ {}", name, name);
|
emit!(&mut self.output, "c.{} equ {}", name, name);
|
||||||
}
|
}
|
||||||
|
|||||||
29
src/std.zr
29
src/std.zr
@@ -104,7 +104,7 @@ func str.len[s: String] : I64
|
|||||||
func str.copy[s: String] : String
|
func str.copy[s: String] : String
|
||||||
let size: I64 = str.len(s) + 1
|
let size: I64 = str.len(s) + 1
|
||||||
let dup: String = mem.alloc(size)
|
let dup: String = mem.alloc(size)
|
||||||
for i in 0..size+1
|
for i in 0..size
|
||||||
str.set(dup, i, s[i])
|
str.set(dup, i, s[i])
|
||||||
return dup
|
return dup
|
||||||
|
|
||||||
@@ -203,10 +203,31 @@ func str.reverse[s: String] : String
|
|||||||
str.set(out, len, 0)
|
str.set(out, len, 0)
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
// not sure this covers all wacky edge cases
|
||||||
func str.from_i64[n: I64] : String
|
func str.from_i64[n: I64] : String
|
||||||
let x: String = mem.alloc(21)
|
if n == 0
|
||||||
c.snprintf(x, 21, "%ld", n)
|
let s: String = mem.alloc(2)
|
||||||
return x
|
str.set(s, 0, '0')
|
||||||
|
str.set(s, 1, 0)
|
||||||
|
return s
|
||||||
|
|
||||||
|
let neg: Bool = n < 0
|
||||||
|
if neg
|
||||||
|
n = -n
|
||||||
|
let buf: String = mem.alloc(21)
|
||||||
|
let i: I64 = 0
|
||||||
|
while n > 0
|
||||||
|
let d: U8 = n % 10
|
||||||
|
str.set(buf, i, '0' + d)
|
||||||
|
n = n / 10
|
||||||
|
i = i + 1
|
||||||
|
if neg
|
||||||
|
str.set(buf, i, '-')
|
||||||
|
i = i + 1
|
||||||
|
str.set(buf, i, 0)
|
||||||
|
let s: String = str.reverse(buf)
|
||||||
|
mem.free(buf)
|
||||||
|
return s
|
||||||
|
|
||||||
func str.parse_i64[s: String] : I64
|
func str.parse_i64[s: String] : I64
|
||||||
let len: I64 = str.len(s)
|
let len: I64 = str.len(s)
|
||||||
|
|||||||
Reference in New Issue
Block a user