Example #1
0
File: symbol.c Project: nrhtr/elixr
XR symbol_eq(XR cl, XR self, XR other)
{
    (void) cl;

    if (!xrIsPtr(other))
        return VAL_FALSE;

    if (xrMTable(other) != symbol_vt)
        return VAL_FALSE;

    if (xrSymLen(self) != xrSymLen(other))
        return VAL_FALSE;

    /* FIXME: Symbols will all be so short this won't really help, need
     * to be able to just assume all symbols are interned */
    /* UPDATE: all symbols should now be interned. Just need to sort out
     * proper interfaces/messages for comparison */
    if (xrSymInterned(self) && xrSymInterned(other) && self == other) {
        return VAL_TRUE;
    }

    const char *stra = xrSymPtr(self);
    const char *strb = xrSymPtr(other);

    size_t slen = xrSymLen(self);
    size_t olen = xrSymLen(other);

    size_t mlen = (slen < olen) ? slen : olen;

    if (strncmp(stra, strb, mlen) == 0)
        return VAL_TRUE;

    return VAL_FALSE;
}
Example #2
0
int main(int argc, char **argv)
{
    xr_init();

    bool eval = false;
    bool verbose = false;

    int c;
    while ((c = getopt(argc, argv, "ev")) != -1) {
        switch (c) {
        case 'e':
            eval = true;
            break;
        case 'v':
            verbose = true;
            break;
        }
    }

    XR obj_list;

    if (optind < argc) {
        char *file = argv[optind];
        obj_list = xr_parse_dump_file(file);
    } else {
        obj_list = xr_parse_dump_from_stdin();
    }

    if (verbose)
        log("# Objs: %ld\n", xrListLen(obj_list));
    
    XR root_mt = xrMTable(root);
    assert(root_mt);
    
    /* Lookup the "init" method */
    XR init_m = xrClosureAt(send(root_mt, s_at, xr_sym("init")), 0);

    if (verbose)
        qsend(init_m, "show");

    if (!eval) {
        FILE *fp = fopen("blahtestsymfile", "w");
        qsend(root, "pack", fp);
        fclose(fp);
        return 0;
    }

    if (verbose)
        log("##############\nRunning VM\n##############\n");

    xr_run_method(init_m);

    return 0;
}