string test changes, add intial stdlib

This commit is contained in:
zongor 2026-07-06 18:39:16 -07:00
parent 3a44877465
commit 65433ea629
2 changed files with 221 additions and 6 deletions

206
test/stdlib.ul Normal file
View File

@ -0,0 +1,206 @@
const int I16_MIN = -32768;
const int I16_MAX = 32767;
const nat U16_MAX = 65535;
byte[10000] heap;
nat heap_allocated = 0;
function malloc(nat size) ref byte[] {
nat pos = heap_allocated;
heap_allocated = heap_allocated + size;
return ref heap[pos];
}
function free() {
heap_allocated = 0;
}
function memcpy(ref byte[] to, ref byte[] from, nat length) {
for (nat i = 0; i < length; i++) {
to[i] = from[i];
}
return ptr;
}
function mallocpy(ref byte[] from, nat length) ref byte[] {
ref byte[] ptr = malloc(length);
for (nat i = 0; i < length; i++) {
ptr[i] = from[i];
}
return ptr;
}
/**
* Print with a newline
*/
function pln(str string) {
for (byte c in string) {
write = c;
}
write = '\n';
}
/**
* Concatinates 2 strings
*/
function strcat(str src1, str src2) str {
str result = malloc(src1.length + src2.length);
memcpy(ref result[0], ref src1[0]);
memcpy((ref result[0] + src1.length), ref src2[0]);
return result;
}
/**
* finds index of string, -1 if not found
*/
function stridx(str haystack, char needle) int {
int i = -1;
for (char c in haystack) {
i = i + 1;
if (c == needle) {
break;
}
}
return i;
}
/**
* checks if 2 strings are equal
*/
function streq(str src1, str src2) bool {
if (src1.length != src2.length) return false;
for (int i=0; src1.length; i++) {
if (src1[i] != src2[i]) return false;
}
return true;
}
/**
* Slice string
*/
function slice(str src, int start, int stop) str {
int len = stop - start;
str result = malloc(len);
for (int i=start; i<stop; i++) {
result[i] = src[i];
}
return result;
}
/**
* int to string
*/
function itos(int src) str {
byte buffer[6];
nat i = 6;
bool neg = n < 0;
if (neg) n = -n;
do {
buffer[--i] = '0' + n mod 10;
n /= 10;
} while(n > 0);
if(neg) buffer[--i] = '-';
str result = malloc(6 - i);
memcpy(result, &buffer[0] + i, 6 - i);
return result;
}
/**
* nat to string
*/
function ntos(nat src) str {
byte buffer[5];
nat i = 5;
do {
buffer[--i] = '0' + n mod 10;
n /= 10;
} while(n > 0);
str result = malloc(5 - i);
memcpy(result, &buffer[0] + i, 5 - i);
return result;
}
/**
* real to string
*/
function rtos(real src) str {
}
/**
* string to int
*/
function stoi(str src) int {
bool neg = false;
int n = 0;
nat idx = 0;
while (is_space(src[idx])) {
if (length-- == 0) { return n; }
idx = idx + 1;
}
if (src[idx] == '-') {
neg = true;
if (length-- == 0) { return n; }
idx = idx + 1;
}
while (is_digit(src[idx]) and length-- > 0) {
int digit = (src[idx] - '0' as int);
idx = idx + 1;
if (neg) {
if (n < (I16_MIN / 10) or (n == (I16_MIN / 10) and digit > -(I16_MIN mod 10))) {
return I16_MIN;
}
n = n * 10 - digit;
} else {
if (n > (I16_MAX / 10) or (n == (I16_MAX / 10) and digit > (I16_MAX mod 10))) {
return I16_MAX;
}
n = n * 10 + digit;
}
}
return neg ? -n : n;
}
/**
* string to nat
*/
function ston(str src) nat {
nat n = 0;
nat idx = 0;
while (is_space(src[idx])) {
if (length-- == 0) { return n; }
idx = idx + 1;
}
while (is_digit(src[idx]) and length-- > 0) {
nat digit = (src[idx] - '0' as nat);
idx = idx + 1;
if (n > (U16_MAX / 10) or (n == (U16_MAX / 10) and digit > (U16_MAX mod 10))) {
return U16_MAX;
}
n = n * 10 + digit;
}
return n;
}
/**
* string to real
*/
function stor(str src) real {
}

View File

@ -1,13 +1,22 @@
str hello = "hello World!\n";
str msg = " damage inflicted!\n";
str hello = "hello World!";
str msg = " damage inflicted!";
if (msg[1] == 'd') {
print("yes\n");
pln("yes");
}
print(msg.length as str);
print(msg);
pln(msg.length as str);
pln(msg);
hello[0] = hello[0] - ' ';
print(hello);
pln(hello);
halt;
function pln(str string) {
nat i = 0;
while (i < string.length) {
write = string[i];
i = i + 1;
}
write = '\n';
}