#include <stdio.h>
#include <stdint.h>

// See comments in build_native_lib()
#define EXPORT __attribute__((visibility("default")))

enum cenum {
  cenum_a,
  cenum_b,
};

EXPORT int32_t add_one_int(int32_t x) {
  return 2 + x;
}

EXPORT void printer(void) {
  printf("printing from C\n");
}

// function with many arguments, to test functionality when some args are stored
// on the stack
EXPORT int32_t test_stack_spill(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f, int32_t g, int32_t h, int32_t i, int32_t j, int32_t k, int32_t l) {
  return a+b+c+d+e+f+g+h+i+j+k+l;
}

EXPORT uint32_t get_unsigned_int(void) {
  return -10;
}

EXPORT int16_t add_int16(int16_t x) {
  return x + 3;
}

EXPORT int64_t add_short_to_long(int16_t x, int64_t y) {
  return x + y;
}

EXPORT float add_float(float x) {
  return x + 1.5f;
}

EXPORT uint8_t u8_id(uint8_t x) {
  return x;
}

EXPORT uint8_t scalar_enum(enum cenum e) {
  return (uint8_t)e;
}

// To test that functions not marked with EXPORT cannot be called by Miri.
int32_t not_exported(void) {
  return 0;
}
