예제 #1
0
HklString* hkl_string_new_from_string(const HklString* string)
{
  assert(string != NULL);

  HklString* copy = hkl_string_new();
  hkl_string_copy(copy, string);

  return copy;
}
예제 #2
0
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;
} 
예제 #3
0
파일: hkl_tree.c 프로젝트: cknadler/hkl
HklPair* hkl_pair_new()
{
  HklPair* pair = hkl_alloc_object(HklPair);

  pair->key = hkl_string_new();
  pair->value = NULL;

  return pair;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
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;
}