oakc 0.6.1

A portable programming language with a compact backend
Documentation
#[std]
#[memory(512)]

fn realloc(old_ptr: &char, old_size: num, new_size: num) -> &char {
    let new_ptr = alloc(new_size) as &char;

    for (let i=0; i<old_size; i=i+1) {
        new_ptr[i] = old_ptr[i];
    }

    free old_ptr: old_size;

    return new_ptr
}

fn strcpy(dst: &char, src: &char) {
    for (let i=0; src[i] != '\0'; i=i+1) {
        dst[i] = src[i];
    }
    dst[i] = '\0';
}

fn strlen(str: &char) -> num {
    for (let i=0; str[i] != '\0'; i=i+1) {}
    return i
}

fn strsize(str: &char) -> num { return strlen(str) + 1 }

struct String {
    let ptr: &char,
        len: num;

    fn new() -> String {
        return [alloc(1), 0];
    }

    fn from(str: &char) -> String {
        let result = String::new();
        for (let i=0; str[i] != '\0'; i=i+1) {
            result.push(str[i]);
        }

        return result
    }

    fn push(self: &String, ch: char) {
        self->len = self->len + 1;
        self->ptr = realloc(self->ptr, self->len, self->len + 1);
        (self->ptr)[self->len - 1] = ch;
        (self->ptr)[self->len] = '\0';
    }

    fn copy(self: &String) -> String {
        let ptr = alloc(self->len+1) as &char;
        strcpy(ptr, self->ptr);
        return [ptr, self->len]
    }

    fn drop(self: &String) {
        free self->ptr: self->len + 1;
    }
}

fn putstring(s: String) {
    putstr(s->ptr);
}

struct Person {
    let first_name:  String,
        middle_name: String,
        last_name:   String;

    fn new(first:  &char,
           middle: &char,
           last:   &char) -> Person {
        return [
            String::from(first),
            String::from(middle),
            String::from(last),
        ];
    }

    fn print(self: &Person) {
        putstring(self->last_name);
        putstr(", ");
        putstring(self->first_name);
        putchar(' ');
        putchar(
            ((self->middle_name)->ptr)[0]
        );
        putcharln('.');
    }

    fn copy(self: &Person) -> Person {
        putstrln("copy!");
        return [
            self->first_name,
            self->middle_name,
            self->last_name
        ]
    }

    fn drop(self: &Person) {
        putstrln("drop!");
        (self->first_name).drop();
        (self->middle_name).drop();
        (self->last_name).drop();
    }
}

fn putperson(p: Person) {
    p.print();
}


fn main() {
    let p = Person::new("Adam", "Ryan", "McDaniel");
    p.print();
    putperson(p);
    p.print();
}