packages feed

hs-ffmpeg-0.2.3: src/macros.hsc2hs.h

/*
  Helper macros
 */

#define hsc_test(name) \
  printf("%s = undefined\n", #name);

#define hsc_enum2(t, f, print_name, x)         \
    print_name;                               \
    printf (" :: %s\n", #t);                  \
    print_name;                               \
    printf (" = %s ", #f);                    \
    if ((x) < 0)                              \
        printf ("(%ld)\n", (long)(x));        \
    else                                      \
        printf ("%lu\n", (unsigned long)(x));

#define hsc_haskellizef(x)                                          \
    do{                                                              \
        const char *s = (x);                                       \
        int upper = 0;                                             \
        if (*s != '\0')                                            \
        {                                                          \
            putchar (tolower (*s));                                \
            ++s;                                                   \
            while (*s != '\0')                                     \
            {                                                      \
                if (*s == '_')                                     \
                    upper = 1;                                     \
                else                                               \
                {                                                  \
                    putchar (upper ? toupper (*s) : tolower (*s)); \
                    upper = 0;                                     \
                }                                                  \
                ++s;                                               \
            }                                                      \
        }                                                          \
    }while(0)

#define hsc_haskellizet(x)                                         \
    do{                                                              \
        const char *s = (x);                                       \
        int upper = 1;                                             \
        if (*s != '\0')                                            \
        {                                                          \
            while (*s != '\0')                                     \
            {                                                      \
                if (*s == '_')                                     \
                    upper = 1;                                     \
                else                                               \
                {                                                  \
                    putchar (upper ? toupper (*s) : tolower (*s)); \
                    upper = 0;                                     \
                }                                                  \
                ++s;                                               \
            }                                                      \
        }                                                          \
    }while(0)


#define hsc_begin_enum(type, val)                   \
  do                                                \
    {                                               \
      printf("data %s = \n", #type);                \
      char enum_type[255];                          \
      strcpy(enum_type, #type);                     \
      char enum_buffer[500][255];                   \
      long enum_vals[255];                          \
      int e = 0;                                    \
      printf("\t ");                                 \
      hsc_haskellizet(#val);                        \
      printf("\n");                                 \
      strcpy(enum_buffer[e], #val);                 \
      enum_vals[e++] = (long)val;
      
#define hsc_add_enum(val)                       \
  printf("\t|");                                \
  hsc_haskellizet(#val);                        \
  printf("\n");                                 \
  strcpy(enum_buffer[e], #val);                 \
  enum_vals[e++] = (long)val;

#define hsc_end_enum(deriving)                  \
  if(deriving[0] != 0){                         \
    printf(" deriving (%s)\n\n", deriving);         \
  }                                             \
  printf("instance Enum %s where\n", enum_type);    \
  int i;                                            \
  for(i = 0; i < e; ++i){                       \
    printf("\tfromEnum ");                      \
    hsc_haskellizet(enum_buffer[i]);             \
    printf(" = (%ld)\n", enum_vals[i]);             \
  }                                                 \
  for(i = 0; i < e; ++i){                       \
    printf("\ttoEnum (%ld) = ", enum_vals[i]);  \
    hsc_haskellizet(enum_buffer[i]);                                \
    printf("\n");                                                   \
  }                                                                 \
  printf("\ttoEnum id = error $ \"toEnum: fail to cast\" ++ (show id) ++ \"to %s\"\n", enum_type); \
  }while(0)