HklString* hkl_string_new_from_string(const HklString* string) { assert(string != NULL); HklString* copy = hkl_string_new(); hkl_string_copy(copy, string); return copy; }
HklString* hkl_string_new_from_utf8(const char* utf8_data) { assert(utf8_data != NULL); HklString* string = hkl_string_new(); hkl_string_set_utf8(string, utf8_data); return string; }
HklPair* hkl_pair_new() { HklPair* pair = hkl_alloc_object(HklPair); pair->key = hkl_string_new(); pair->value = NULL; return pair; }
HklString* hkl_string_new_from_real(double real) { // create a buffer to store the integer HklString* string = hkl_string_new(); string->size = sprintf(conversion_buffer, "%lg", real) + 1; string->utf8_data = realloc(string->utf8_data, string->size); memcpy(string->utf8_data, conversion_buffer, string->size); string->length = utf8_length(string->utf8_data); return string; }
int main(int argc, const char* argv[]) { HklTree* testtree = hkl_tree_new(); HklString* testname = hkl_string_new(); // Registered tests // This line gives the function "hashtest" defined in test/hash.c // external linkage. If you don't know what that means, don't worry bout it. // :P :3 extern HklTestFunction hashtest; hkl_string_set_utf8(testname, "hash"); hkl_tree_insert(testtree, testname, &hashtest); extern HklTestFunction gctest; hkl_string_set_utf8(testname, "gc"); hkl_tree_insert(testtree, testname, &gctest); extern HklTestFunction traversaltest; hkl_string_set_utf8(testname, "traversal"); hkl_tree_insert(testtree, testname, &traversaltest); if (argv[1] == NULL) { fprintf(stderr, "No test given. Exiting.\n"); return 1; } hkl_string_set_utf8(testname, argv[1]); HklPair* pair = hkl_tree_search(testtree, testname); if (pair == NULL) { fprintf(stderr, "Test \"%s\" does not exist!\n", argv[1]); return 1; } HklTestFunction test = pair->value; if (test) test(&argv[2]); hkl_string_free(testname); hkl_tree_free(testtree); return 0; }
HklValue* hklr_op_multiply(HklValue* left_value, HklValue* right_value) { HklValue* result = NULL; bool left_updated = false, right_updated = false; // Dereference left and right sides if (left_value->type == HKL_TYPE_REF) { left_updated = true; left_value = hklr_object_dereference(left_value->as.object); } if (right_value->type == HKL_TYPE_REF) { right_updated = true; right_value = hklr_object_dereference(right_value->as.object); } switch (left_value->type) { case HKL_TYPE_INT: switch(right_value->type) { case HKL_TYPE_INT: result = hkl_value_new(HKL_TYPE_INT, left_value->as.integer * right_value->as.integer); break; case HKL_TYPE_REAL: result = hkl_value_new(HKL_TYPE_REAL, left_value->as.integer * right_value->as.real); break; case HKL_TYPE_STRING: result = hkl_value_new(HKL_TYPE_STRING, hkl_string_new()); int i; for (i=0; i < (int)left_value->as.integer; i ++) { hkl_string_cat(result->as.string, right_value->as.string); } break; default: assert(false); break; } break; // HKL_TYPE_INT case HKL_TYPE_REAL: switch(right_value->type) { case HKL_TYPE_INT: result = hkl_value_new(HKL_TYPE_REAL, left_value->as.real * right_value->as.integer); break; case HKL_TYPE_REAL: result = hkl_value_new(HKL_TYPE_REAL, left_value->as.real * right_value->as.real); break; default: assert(false); break; } break; // HKL_TYPE_REAL case HKL_TYPE_STRING: switch(right_value->type) { case HKL_TYPE_INT: { result = hkl_value_new(HKL_TYPE_STRING, hkl_string_new()); int i; for (i=0; i < (int)right_value->as.integer; i ++) { hkl_string_cat(result->as.string, left_value->as.string); } } break; default: assert(false); break; } break; // HKL_TYPE_STRING default: assert(false); break; } if (left_updated) { hkl_value_free(left_value); } if (right_updated) { hkl_value_free(right_value); } return result; }