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

#if __cplusplus
extern "C" {
#endif

struct Foo1 { char c; };

struct Foo1 ctest1()
{
    struct Foo1 f;

    f.c = 3;
    return f;
}

struct Foo2 { short s; };

struct Foo2 ctest2()
{
    struct Foo2 f;

    f.s = 0x1234;
    return f;
}

struct Foo3 { char c; short s; };

struct Foo3 ctest3()
{
    struct Foo3 f;

    f.s = 0x5678;
    return f;
}


struct Foo4 { int i; };

struct Foo4 ctest4()
{
    struct Foo4 f;

    f.i = 0x12345678;
    return f;
}

struct Foo5 { int i, j; };

struct Foo5 ctest5()
{
    struct Foo5 f;

    f.i = 0x12345678;
    f.j = 0x21436587;
    return f;
}


struct Foo6 { int i, j, k; };

struct Foo6 ctest6()
{
    struct Foo6 f;

    f.i = 0x12345678;
    f.j = 0x21463587;
    f.k = 0x24163857;
    return f;
}

struct S7 { float a,b; };

struct S7 ctest10()
{
    struct S7 f;

    f.a = 2.5;
    f.b = 1.5;
    return f;
}

// =================================

char ctest7(char c)
{
    return c + 1;
}

unsigned char ctest8(unsigned char c)
{
    return c + 1;
}

signed char ctest9(signed char c)
{
    return c + 1;
}

/***********************************************/

void ctestrir(int x1, int x2, int x3, int x4, int x5, int x6, long double a, int b, long double c)
{
    assert(a == 100.0);
    assert(b == 67);
    assert(c == 200.0);
}

/***********************************************/

extern void dtestrir(int x1, int x2, int x3, int x4, int x5, int x6, long double a, int b, long double c);

void test4()
{
    dtestrir(1,2,3,4,5,6, 300.0, 68, 401.0);
}

/**********************************************/

typedef struct S11 {
  char a;
  char b;
  char c;
} S11;

S11 ctest11(char x, S11 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S11));
  assert(sizeof(S11) == 3);
  printf("x   = %d\n", (int)x);
  printf("s.a = %d\n", (int)s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", (int)s.c);
  printf("y   = %d\n", (int)y);
  return s;
}

/**********************************************/

typedef struct S12 {
  char a,d;
  char b,e;
  char c;
} S12;

S12 ctest12(char x, S12 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S12));
  assert(sizeof(S12) == 5);
  printf("x   = %d\n", (int)x);
  printf("s.a = %d\n", (int)s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", (int)s.c);
  printf("y   = %d\n", (int)y);
  return s;
}


/**********************************************/

typedef struct S13 {
  short a;
  short b;
  short c;
} S13;

S13 ctest13(char x, S13 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S13));
  assert(sizeof(S13) == 6);
  printf("x   = %d\n", (int)x);
  printf("s.a = %d\n", (int)s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", (int)s.c);
  printf("y   = %d\n", (int)y);
  return s;
}


/**********************************************/

typedef struct S14 {
  char a,d,e,f;
  char b,g;
  char c;
} S14;

S14 ctest14(char x, S14 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S14));
  assert(sizeof(S14) == 7);
  printf("x   = %d\n", (int)x);
  printf("s.a = %d\n", (int)s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", (int)s.c);
  printf("y   = %d\n", (int)y);
  return s;
}


/**********************************************/

typedef struct S15 {
  char a,d,e,f;
  char b,g,h,i;
  char c;
} S15;

S15 ctest15(char x, S15 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S15));
  assert(sizeof(S15) == 9);
  printf("x   = %d\n", (int)x);
  printf("s.a = %d\n", (int)s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", (int)s.c);
  printf("y   = %d\n", (int)y);
  return s;
}


/**********************************************/

typedef struct S16 {
  char a[5];
#ifdef __GNUC__
  struct __attribute__((packed))
#else
  #pragma pack(push, 1)
  struct
#endif
  {
    char b;
    int c;
  };
#ifndef __GNUC__
  #pragma pack(pop)
#endif
} S16;

S16 ctest16(char x, S16 s, char y) {
  printf("C sz = %d\n", (int)sizeof(S16));
  assert(sizeof(S16) == 10);
  printf("x   = %d\n", (int)x);
  printf("s.a = %.*s\n", 5, s.a);
  printf("s.b = %d\n", (int)s.b);
  printf("s.c = %d\n", s.c);
  printf("y   = %d\n", (int)y);
  return s;
}



#if __cplusplus
}
#endif
