Exemplo n.º 1
0
Arquivo: chasm.c Projeto: eax/chimp
static int
real_main (int argc, char **argv)
{
    ChimpRef *result;
    ChimpRef *module;
    ChimpRef *main_method;
    ChimpRef *args;
    if (argc < 2) {
        fprintf (stderr, "usage: %s <file>\n", argv[0]);
        return 1;
    }

    module = assemble_module (argv[1]);
    if (module == NULL) {
        fprintf (stderr, "error: failed to compile %s\n", argv[1]);
        return 1;
    }

    main_method = chimp_object_getattr_str (module, "main");
    if (main_method == NULL) {
        fprintf (stderr, "error: could not find main method in this module\n");
        return 1;
    }

    args = parse_args (argc, argv);
    result = chimp_vm_invoke (NULL, main_method, args);
    if (result == NULL) {
        fprintf (stderr, "error: chimp_vm_invoke () returned NULL\n");
        return 1;
    }

    printf ("%s\n", CHIMP_STR_DATA (chimp_object_str (result)));

    return 0;
}
Exemplo n.º 2
0
static ChimpRef *
_chimp_io_output (ChimpRef *self, ChimpRef *args, char* separator)
{
    size_t i;

    for (i = 0; i < CHIMP_ARRAY_SIZE(args); i++) {
        ChimpRef *str = chimp_object_str (CHIMP_ARRAY_ITEM (args, i));
        printf ("%s%s", CHIMP_STR_DATA(str), separator);
    }

    return chimp_nil;
}
Exemplo n.º 3
0
static ChimpRef *
_chimp_unit_test(ChimpRef *self, ChimpRef *args)
{
    fprintf (stdout, ".");

    // TODO: Size/argument validation on the incoming args
    ChimpRef *name = chimp_object_str (CHIMP_ARRAY_ITEM(args, 0));
    ChimpRef *fn = CHIMP_ARRAY_ITEM(args, 1);

    if (test_runner == NULL)
    {
        test_runner = chimp_test_new();
    }
    CHIMP_TEST(test_runner)->name = name;

    ChimpRef *fn_args = chimp_array_new();
    chimp_array_push(fn_args, test_runner);

    chimp_object_call (fn, fn_args);
    CHIMP_TEST(test_runner)->passed++;

    return chimp_nil;
}
Exemplo n.º 4
0
Arquivo: hash.c Projeto: eax/chimp
static ChimpRef *
chimp_hash_str (ChimpRef *self)
{
    size_t size = CHIMP_HASH_SIZE(self);
    /* '{' + '}' + (': ' x size) + (', ' x (size-1)) + '\0' */
    size_t total_len = 2 + (size * 2) + (size > 0 ? ((size-1) * 2) : 0) + 1;
    ChimpRef *ref;
    ChimpRef *strs;
    char *data;
    size_t i, k;


    strs = chimp_array_new_with_capacity (size);
    if (strs == NULL) {
        return NULL;
    }

    for (i = 0; i < size; i++) {
        size_t j;
        ChimpRef *item[2];
        item[0] = CHIMP_HASH(self)->keys[i];
        item[1] = CHIMP_HASH(self)->values[i];
        for (j = 0; j < 2; j++) {
            ref = item[j];
            /* XXX what we really want is something like Python's repr() */
            if (CHIMP_ANY_CLASS(ref) == chimp_str_class) {
                /* for surrounding quotes */
                total_len += 2;
            }
            ref = chimp_object_str (ref);
            if (ref == NULL) {
                return NULL;
            }
            chimp_array_push (strs, ref);
            total_len += CHIMP_STR_SIZE(ref);
        }
    }

    data = CHIMP_MALLOC(char, total_len);
    if (data == NULL) {
        return NULL;
    }
    k = 0;
    data[k++] = '{';

    for (i = 0; i < size; i++) {
        size_t j;
        ChimpRef *item[2];
        item[0] = CHIMP_HASH(self)->keys[i];
        item[1] = CHIMP_HASH(self)->values[i];
        for (j = 0; j < 2; j++) {
            ref = CHIMP_ARRAY_ITEM(strs, (i * 2) + j);
            /* XXX what we really want is something like Python's repr() */
            /* TODO instanceof */
            if (CHIMP_ANY_CLASS(item[j]) == chimp_str_class) {
                data[k++] = '"';
            }
            memcpy (data + k, CHIMP_STR_DATA(ref), CHIMP_STR_SIZE(ref));
            k += CHIMP_STR_SIZE(ref);
            if (CHIMP_ANY_CLASS(item[j]) == chimp_str_class) {
                data[k++] = '"';
            }
            if (j == 0) {
                data[k++] = ':';
                data[k++] = ' ';
            }
        }
        if (i < (size-1)) {
            data[k++] = ',';
            data[k++] = ' ';
        }
    }

    data[k++] = '}';
    data[k] = '\0';

    return chimp_str_new_take (data, total_len-1);
}