#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gst/gst.h>
#include <gst/gstqueue.h>
#include <gst/gsttrashstack.h>
#include <stdlib.h>

typedef struct
{
  char *name;
  int size;
  int abi_size;
}
Struct;

#ifdef HAVE_CPU_I386
#include "struct_i386.h"
#define HAVE_ABI_SIZES
#else
/* in case someone wants to generate a new arch */
#include "struct_i386.h"
#endif

int
main (int argc, char *argv[])
{
  int i;

  if (argc > 1) {
    g_print ("/* Generated by GStreamer-%s */\n", GST_VERSION);
    g_print ("Struct list[] = {\n");
    for (i = 0; list[i].name; i++) {
      g_print ("  { \"%s\", sizeof (%s), %d },\n",
          list[i].name, list[i].name, list[i].size);
    }
    g_print ("  { NULL, 0, 0}\n");
    g_print ("};\n");
  } else {
    g_print ("Run './struct_size regen' to regenerate structs.h\n");

#ifdef HAVE_ABI_SIZES
    {
      gboolean ok = TRUE;

      for (i = 0; list[i].name; i++) {
        if (list[i].size != list[i].abi_size) {
          ok = FALSE;
          g_print ("sizeof(%s) is %d, expected %d\n",
              list[i].name, list[i].size, list[i].abi_size);
        }
      }
      if (ok) {
        g_print ("All structures expected size\n");
      } else {
        g_print ("failed\n");
        exit (1);
      }
    }
#else
    g_print ("No structure size list was generated for this architecture\n");
    g_print ("ignoring\n");
#endif
  }

  exit (0);
}