#include <stdio.h>
#define DBG(a,b,c)
int main(int argc, char *argv[])
{
    FILE *cf;
    int is_packed = 1;
    int is_two = 1;
    int is_four = 1;
    int is_eight = 1;
    int is_sixteen = 1;
    struct {
        char a;
        float b;
    } char_float;
    struct {
        float b;
        char a;
    } float_char;
    struct {
        char a;
        double b;
    } char_double;
    struct {
        double b;
        char a;
    } double_char;
#ifdef HAVE_LONG_DOUBLE
    struct {
        char a;
        long double b;
    } char_long_double;
    struct {
        long double b;
        char a;
    } long_double_char;
    struct {
        long double a;
        int b;
        char c;
    } long_double_int_char;
#endif
    int size, extent1, extent2;

    size = sizeof(char) + sizeof(float);
    extent1 = sizeof(char_float);
    extent2 = sizeof(float_char);
    if (size != extent1)
        is_packed = 0;
    if ((extent1 % 2) != 0 && (extent2 % 2) != 0)
        is_two = 0;
    if ((extent1 % 4) != 0 && (extent2 % 4) != 0)
        is_four = 0;
    if (sizeof(float) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
        is_eight = 0;
    DBG("char_float", size, extent1);

    size = sizeof(char) + sizeof(double);
    extent1 = sizeof(char_double);
    extent2 = sizeof(double_char);
    if (size != extent1)
        is_packed = 0;
    if ((extent1 % 2) != 0 && (extent2 % 2) != 0)
        is_two = 0;
    if ((extent1 % 4) != 0 && (extent2 % 4) != 0)
        is_four = 0;
    if (sizeof(double) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
        is_eight = 0;
    DBG("char_double", size, extent1);

#ifdef HAVE_LONG_DOUBLE
    size = sizeof(char) + sizeof(long double);
    extent1 = sizeof(char_long_double);
    extent2 = sizeof(long_double_char);
    if (size != extent1)
        is_packed = 0;
    if ((extent1 % 2) != 0 && (extent2 % 2) != 0)
        is_two = 0;
    if ((extent1 % 4) != 0 && (extent2 % 4) != 0)
        is_four = 0;
    if (sizeof(long double) >= 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
        is_eight = 0;
    if (sizeof(long double) > 8 && (extent1 % 16) != 0 && (extent2 % 16) != 0)
        is_sixteen = 0;
    DBG("char_long-double", size, extent1);

    extent1 = sizeof(long_double_int_char);
    if ((extent1 % 2) != 0)
        is_two = 0;
    if ((extent1 % 4) != 0)
        is_four = 0;
    if (sizeof(long double) >= 8 && (extent1 % 8) != 0)
        is_eight = 0;
    if (sizeof(long double) > 8 && (extent1 % 16) != 0)
        is_sixteen = 0;
#else
    is_sixteen = 0;
#endif

    if (is_sixteen) {
        is_eight = 0;
        is_four = 0;
        is_two = 0;
    }

    if (is_eight) {
        is_four = 0;
        is_two = 0;
    }

    if (is_four)
        is_two = 0;

    /* Tabulate the results */
    cf = fopen("ctest.out", "w");
    if (is_packed + is_two + is_four + is_eight + is_sixteen == 0) {
        fprintf(cf, "Could not determine alignment\n");
    } else {
        if (is_packed + is_two + is_four + is_eight + is_sixteen != 1) {
            fprintf(cf, "error!\n");
        } else {
            if (is_packed)
                fprintf(cf, "packed\n");
            if (is_two)
                fprintf(cf, "two\n");
            if (is_four)
                fprintf(cf, "four\n");
            if (is_eight)
                fprintf(cf, "eight\n");
            if (is_sixteen)
                fprintf(cf, "sixteen\n");
        }
    }
    fclose(cf);
    return 0;
}
