#include <stdlib.h>
#include <string.h>

typedef struct POINTER {
  char *string;
  int   number;
} test_ptr_t;

extern void
take_one_pointer(test_ptr_t *ptr)
{
  char *string = "some string";

  ptr->string = malloc(strlen(string) + 1);
  ptr->string = strcpy(ptr->string, string);

  ptr->number = 42;
}

extern test_ptr_t *
return_pointer()
{
  test_ptr_t *ptr = malloc(sizeof(test_ptr_t));

  take_one_pointer(ptr);

  return ptr;
}

extern char *
return_str_from_ptr(test_ptr_t *ptr)
{
  return ptr->string;
}

extern int
return_int_from_ptr(test_ptr_t *ptr)
{
  return ptr->number;
}

extern char *
return_str_from_ptr_by_ref(test_ptr_t **ptr)
{
  return (*ptr)->string;
}

extern int
return_int_from_ptr_by_ref(test_ptr_t **ptr)
{
  return (*ptr)->number;
}

extern void *
return_null(void)
{
  return NULL;
}

extern int
get_test_ptr_size()
{
  return sizeof(test_ptr_t);
}
