/* Conformance Test 4.2.1.1:  Test scoping of identifiers */

/* Global declarations of all different identifier types in C.             */
/* Each identifier should be available through the end of the source file. */

#include <math.h>

int printf(const char *, ...);

#define MAC_NAME1  10                  /* macro name           */

typedef  int  *intPtr;                 /* user-defined type    */
char     F1 (int x, int y);            /* function name        */

         int i;                        /* variable             */

struct ComplexNum { float real;        /* type tag name        */
                    float imag; };     /*   and struct fields  */

union  LongOrShort { long longNum;     /* type tag name        */
                     int  shortNum; }; /*   and union fields   */

enum flowers { rose, iris, carnation };    /* type tag name    */
                                           /*   and enum const */

int main (void)
  {
   char   ch;
   int    m;
   intPtr k;
   struct ComplexNum  c, d;
   union  LongOrShort z;
   enum   flowers     f;

   m = 3;
   k = &m;
   if (*k != 3)
       goto Fail;

   c.real = 5.1;
   c.imag = 2.0;
   d      = c;
   if ((fabs(d.real - 5.1) > 0.00001) || (fabs(d.imag - 2.0) > 0.00001))
       goto Fail;

   z.longNum = 5;
   if (z.shortNum != 5)            /* don't ever do this in real life! */
       goto Fail;

   f = carnation;
   if (f != 2)
       goto Fail;

   i = MAC_NAME1;
   if (i != 10)
       goto Fail;

   ch = F1 (3, i);
   if (ch != '\r')
       goto Fail;

   printf ("Passed Conformance Test 4.2.1.1\n");
   return 0;

   printf ("This code can never be reached !!!\n");

Fail:
   printf ("Failed Conformance Test 4.2.1.1\n");
   return 0;

   printf ("Nor can this code ever be reached !!!\n");
  }

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

char     F1 (int x, int y)
  {
   int    m;
   intPtr k;
   struct ComplexNum  c, *d;
   union  LongOrShort z;
   enum   flowers     f;

   m = 5;
   k = &m;
   if (*k != 5)
       goto Err1;

   c.real = 18.7;
   c.imag = 23.5;
   d      = &c;
   if ((fabs(d->real - 18.7) > 0.00001) || (fabs(d->imag - 23.5) > 0.00001))
       goto Err2;

   z.longNum = 0x7FE5;
   if (z.shortNum != 0x7fe5)       /* don't ever do this in real life! */
       goto Err3;

   #define MAC_NAME2  11

   f = iris;
   if (f != 1)
       goto Fail;

   i = MAC_NAME2;
   if (i != 11)
       goto Fail;

   return (x + y);

Err1:
   return (1);

Err2:
   return (2);

Err3:
   return (3);

Fail:
   return (4);
  }