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; }
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; }
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; }
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); }