/* Display orthogonal polynomials

Implemented by:
E. Lenz
Johann-Fichte-Strasse 11
8 Munich 40
Germany                           */

#include <intuition/intuition.h>

#define FOREVER for(;;)

extern void *OpenLibrary();
extern void *OpenWindow();
extern void *GetMsg();
extern double fabs();

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct IntuiMessage *message;
struct RastPort *rp;
struct Window *w;

UBYTE Title[80];

struct NewWindow nw =
{  0, 0,                  /*  left edge, top edge    */
   640, 256,              /*  width, height,         */
   0, 1,                  /*  detail, block pens     */
   CLOSEWINDOW            /*  IDCMP flags            */
 | MENUPICK,
                          /*  Regular flags for gadgets and such */
   WINDOWDEPTH
 | WINDOWSIZING
 | WINDOWDRAG
 | WINDOWCLOSE
 | SMART_REFRESH
 | ACTIVATE,

   NULL,                                   /* First gadget in list        */
   NULL,                                   /* User checkmark              */
   Title,                                  /* Window Title                */
   NULL,                                   /* Pointer to screen           */
   NULL,                                   /* Pointer to superbitmap      */
   50, 25, 640, 256,                       /* Min and max size            */
   WBENCHSCREEN,                           /* Using the Workbench screen  */
};

struct IntuiText ttbl =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Write table file",  /* IText */
        NULL,                          /* NextText */
};


struct MenuItem tbl =
{       (struct MenuItem *) NULL,
        0,30,                               /* LeftEdge, TopEdge */
        200,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,      /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&ttbl,                        /* ItemFill */
        NULL,                               /* SelectFill */
        't',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};


struct IntuiText twrt =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Write IFF file",    /* IText */
        NULL,                          /* NextText */
};


struct MenuItem wrt =
{       (struct MenuItem *) &tbl,
        0,20,                               /* LeftEdge, TopEdge */
        200,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,      /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&twrt,                        /* ItemFill */
        NULL,                               /* SelectFill */
        'i',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};


struct IntuiText tclr =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)"   Clear screen",    /* IText */
        NULL,                          /* NextText */
};


struct MenuItem clr =
{       (struct MenuItem *) &wrt,
        0,10,                               /* LeftEdge, TopEdge */
        200,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|CHECKIT|CHECKED|MENUTOGGLE|COMMSEQ, /*  Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tclr,                        /* ItemFill */
        NULL,                               /* SelectFill */
        's',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText tval =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Value",             /* IText */
        NULL,                          /* NextText */
};

struct MenuItem val =
{       (struct MenuItem *) &clr,
        0,0,                                /* LeftEdge, TopEdge */
        200,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tval,                        /* ItemFill */
        NULL,                               /* SelectFill */
        'v',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct Menu men2 =
{       (struct Menu *) NULL,        /* NEXT menu */
        230, 0, 150, 0,              /* LeftEdge, TopEdge, Width, Height */
        MENUENABLED,                 /* Flags */
        (BYTE *) "Options",          /* MenuName */
        (struct MenuItem *)&val,     /* First item */
        0,0,0,0,                     /* JazzX,JazzY, BeatX, BeatY */
        };

struct IntuiText tlegend =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Legendre",          /* IText */
        NULL,                          /* NextText */
};

struct MenuItem legend =
{       (struct MenuItem *) NULL,
        0,50,                               /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tlegend,                     /* ItemFill */
        NULL,                               /* SelectFill */
        'n',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText tlaguer =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Laguerre",          /* IText */
        NULL,                          /* NextText */
};

struct MenuItem laguer =
{       (struct MenuItem *) &legend,
        0,40,                               /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tlaguer,                     /* ItemFill */
        NULL,                               /* SelectFill */
        'l',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText tjacob =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Jacobi",            /* IText */
        NULL,                          /* NextText */
};

struct MenuItem jacob =
{       (struct MenuItem *) &laguer,
        0,30,                               /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tjacob,                      /* ItemFill */
        NULL,                               /* SelectFill */
        'j',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText thermi =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Hermite",           /* IText */
        NULL,                          /* NextText */
};

struct MenuItem hermi =
{       (struct MenuItem *) &jacob,
        0,20,                               /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&thermi,                      /* ItemFill */
        NULL,                               /* SelectFill */
        'h',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText tgegen =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Gegenbauer",        /* IText */
        NULL,                          /* NextText */
};

struct MenuItem gegen =
{       (struct MenuItem *) &hermi,
        0,10,                               /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tgegen,                      /* ItemFill */
        NULL,                               /* SelectFill */
        'g',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct IntuiText tcheby =
{       0,1,                           /* frontpen, backpen */
        JAM1,                          /* drawmode */
        1,1,                           /* leftedge, topedge */
        NULL,                          /* TextAttr */
        (UBYTE *)" Chebyshev",         /* IText */
        NULL,                          /* NextText */
};


struct MenuItem cheby =
{       (struct MenuItem *) &gegen,
        0,0,                                /* LeftEdge, TopEdge */
        150,10,                             /* Width, Height */
        ITEMTEXT|HIGHCOMP|ITEMENABLED|COMMSEQ,  /* Flags */
        0,                                  /* Mutual Exclude */
        (APTR)&tcheby,                      /* ItemFill */
        NULL,                               /* SelectFill */
        'c',                                /* Command    */
        NULL,                               /* Subitem */
        0,                                  /* NextSelect */
};

struct Menu menu =
{       (struct Menu *) &men2,       /* NEXT menu */
        30, 0, 150, 0,               /* LeftEdge, TopEdge, Width, Height */
        MENUENABLED,                 /* Flags */
        (BYTE *) "Polynomials",      /* MenuName */
        (struct MenuItem *)&cheby,   /* First item */
        0,0,0,0,                     /* JazzX,JazzY, BeatX, BeatY */
        };

#define STRINGSIZE 10
 UBYTE DefString[STRINGSIZE];
 UBYTE DefString2[STRINGSIZE];
 UBYTE Undo [STRINGSIZE];

ULONG MessageClass;
int clear=1;
int lastval=0;
int order=3;
float x,y;

cls()
{ SetAPen(rp,0L);
  RectFill(rp,0L,10L,640L,256L);
}

axis(xl,yl,xu,yu)
float xl,yl,xu,yu;
{ char Buffer[20];

  SetWindowTitles(w,nw.Title,-1L);
  SetAPen(rp,3L);
  Move(rp,0L,133L);    /* X axis */
  Draw(rp,640L,133L);
  Move(rp,10L,125L);   /* x = xl */
  sprintf(Buffer,"x = %.1f",xl);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,580L,125L);  /* x = xu */
  sprintf(Buffer,"x = %.1f",xu);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,320L,10L);   /* Y axis */
  Draw(rp,320L,256L);
  Move(rp,250L,20L);   /* y = yu */
  sprintf(Buffer,"P = %.1f",yu);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,250L,250L);  /* y = yl */
  sprintf(Buffer,"P = %.1f",yl);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,160L,130L);  /* x = (xu+3*xl)/4 */
  Draw(rp,160L,136L);
  Move(rp,150L,125L);
  sprintf(Buffer,"x = %.1f",(xu+3*xl)/4);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,480L,130L);  /* x = (3*xu+xl)/4 */
  Draw(rp,480L,136L);
  Move(rp,470L,125L);
  sprintf(Buffer,"x = %.1f",(3*xu+xl)/4);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,317L,71L);   /* y = (3*yu+yl)/4 */
  Draw(rp,323L,71L);
  Move(rp,250L,71L);
  sprintf(Buffer,"P = %.1f",(3*yu+yl)/4);
  Text(rp,Buffer,(long)strlen(Buffer));
  Move(rp,317L,194L);  /* y = (yu+3*yl)/4 */
  Draw(rp,323L,194L);
  Move(rp,250L,194L);
  sprintf(Buffer,"P = %.1f",(yu+3*yl)/4);
  Text(rp,Buffer,(long)strlen(Buffer));
  SetAPen(rp,1L);
}

extern float Chebyshev();

DrawCheby(n)
int n;
{ int i,j;
  float t;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Chebyshev Polynomial degree %d",n);
  axis(-1.0,-1.0,1.0,1.0);
  for (i=0;i<640;i++)
      { t=i/320.0-1.0;
        t=Chebyshev(n,t);
        j=(1-t)*123+10;
        Move(rp,(long)i,(long)j);
        Draw(rp,(long)i,(long)j);
      }
  lastval=0;
}

extern float Gegenbauer();

DrawGegen(n,a)
int n;
float a;
{ long i,j;
  float t,max;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Gegenbauer Polynomial(%.1f) degree %d",a,n);
  max=Gegenbauer(n,-1.0,a); /* determine the Y Axis limits */
  t=Gegenbauer(n,1.0,a);
  if (t>max) max=t;
  axis(-1.0,-max,1.0,max);
  for (i=0;i<640;i++)
      { t=i/320.0-1.0;
        t=Gegenbauer(n,t,a);
        j=(1-t/max)*123+10;
        Move(rp,i,j);
        Draw(rp,i,j);
      }
  lastval=1;
}

extern float Hermite();

DrawHerm(n)
int n;
{ int i,j;
  float max,s,t,dt;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Hermite Polynomial degree %d",n);
  max=fabs(Hermite(n,x));
  s=x;
  dt=(y-x)/10;
  for (i=0;i<10;i++)
      { s+=dt;
        t=fabs(Hermite(n,s));
        if (t>max) max=t;
      }
  axis(x,-max,y,max);
  s=x;
  dt=(y-x)/640;
  for (i=0;i<640;i++)
      { t=Hermite(n,s);
        j=(1-t/max)*123+10;
        Move(rp,(long)i,(long)j);
        Draw(rp,(long)i,(long)j);
        s+=dt;
      }
  lastval=2;
}

extern float Jacobi();

DrawJack(n,a,b)
int n;
float a,b;
{ int i,j;
  float t,max;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Jacobi Polynomial(%.1f)(%.1f) degree %d",a,b,n);
  max=Jacobi(n,1.0,a,b);
  t=fabs(Jacobi(n,-1.0,a,b));
  if (t>max) max=t;
  axis(-1.0,-max,1.0,max);
  for (i=0;i<640;i++)
      { t=i/320.0-1.0;
        t=Jacobi(n,t,a,b);
        j=(1-t/max)*123+10;
        Move(rp,(long)i,(long)j);
        Draw(rp,(long)i,(long)j);
      }
  lastval=3;
}

extern float Laguerre();

DrawLag(n)
int n;
{ int i,j;
  float max,s,t,dt;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Laguerre Polynomial degree %d",n);
  s=x;
  dt=(y-x)/10;
  max=fabs(Laguerre(n,x));
  for (i=0;i<10;i++)
      { s+=dt;
        t=fabs(Laguerre(n,s));
        if (t>max) max=t;
      }
  axis(x,-max,y,max);
  s=x;
  dt=(y-x)/640;
  for (i=0;i<640;i++)
      { s+=dt;
        t=Laguerre(n,s);
        j=(1-t/max)*123+10;
        Move(rp,(long)i,(long)j);
        Draw(rp,(long)i,(long)j);
      }
  lastval=4;
}

extern float Legendre();

DrawLeg(n)
int n;
{ int i,j;
  float t;

  if (n<0) return;
  if (clear) cls();
  sprintf(Title,"Legendre Polynomial degree %d",n);
  axis(-1.0,-1.0,1.0,1.0);
  for (i=0;i<640;i++)
      { t=i/320.0-1.0;
        t=Legendre(n,t);
        j=(1-t)*123+10;
        Move(rp,(long)i,(long)j);
        Draw(rp,(long)i,(long)j);
      }
  lastval=5;
}

float real();

main()
{ USHORT code;
  static float r,s,t,u;
  char Buffer[80];

  if (!(GfxBase = OpenLibrary("graphics.library",NULL))) quit(1);
  if (!(IntuitionBase = OpenLibrary("intuition.library",NULL))) quit(2);

  if (!(w = OpenWindow(&nw)))
    {  nw.Height=200;
       if (!(w = OpenWindow(&nw))) quit(3);
    }
  SetMenuStrip(w, &menu);

  rp = w->RPort;

  cls();
  DrawCheby(3);

  FOREVER
    {  Wait(1L<<w->UserPort->mp_SigBit);
       while(message = GetMsg(w->UserPort))
          { MessageClass = message->Class;
            code = message->Code;
            ReplyMsg(message);
            switch (MessageClass)
               {   case MENUPICK:     switch (code&0xff)
                                         { case 0:    sprintf(Title,"Chebyshev");
                                                      DrawCheby(number());
                                                      break;
                                           case 1:    strcpy(Buffer,Title);
                                                      sprintf(Title,"Value at:");
                                                      r=real();
                                                      strcpy(Title,Buffer);
                                                      SetWindowTitles(w,nw.Title,-1L);
                                                      switch(lastval)
                                                        { case 0: u=Chebyshev(order,r);
                                                                  break;
                                                          case 1: u=Gegenbauer(order,r,s);
                                                                  break;
                                                          case 2: u=Hermite(order,r);
                                                                  break;
                                                          case 3: u=Jacobi(order,r,s,t);
                                                                  break;
                                                          case 4: u=Laguerre(order,r);
                                                                  break;
                                                          case 5: u=Legendre(order,r);
                                                                  break;
                                                        }
                                                      Display(r,s,t,u);
                                                      break;
                                           case 0x20: sprintf(Title,"Gegenbauer a");
                                                      s=real();
                                                      sprintf(Title,"Gegenbauer");
                                                      DrawGegen(number(),s);
                                                      break;
                                           case 0x21: clear^=1;
                                                      break;
                                           case 0x40: sprintf(Title,"Hermite lower range");
                                                      x=real();
                                                      sprintf(Title,"Hermite upper range");
                                                      y=real();
                                                      if (y<=x) break;
                                                      sprintf(Title,"Hermite");
                                                      DrawHerm(number());
                                                      break;
                                           case 0x41: SaveIff(lastval,order,s,t);
                                                      break;
                                           case 0x60: sprintf(Title,"Jacobi a");
                                                      s=real();
                                                      sprintf(Title,"Jacobi b");
                                                      t=real();
                                                      sprintf(Title,"Jacobi");
                                                      DrawJack(number(),s,t);
                                                      break;
                                           case 0x61: Table(lastval,order,s,t,x,y);
                                                      break;
                                           case 0x80: sprintf(Title,"Laguerre lower range");
                                                      x=real();
                                                      if (x<0) break;
                                                      sprintf(Title,"Laguerre upper range");
                                                      y=real();
                                                      if (y<=x) break;
                                                      sprintf(Title,"Laguerre");
                                                      DrawLag(number());
                                                      break;
                                           case 0xa0: sprintf(Title,"Legendre");
                                                      DrawLeg(number());
                                                      break;
                                         }
                                      break;
                   case CLOSEWINDOW : quit(0);
               }
          }
    }
}


quit(i)
int i;
{ if (w) CloseWindow(w);
  if (GfxBase) CloseLibrary(GfxBase);
  if (IntuitionBase) CloseLibrary(IntuitionBase);
  exit(i);
}

/******************
  Get an integer
 ******************/

 struct IntuiMessage *message1;
 struct Window *w1;

 struct IntuiText ntext = {2,2,JAM1, 10, -11, 0, Title, 0};

 struct StringInfo TexString = {
    DefString,                      /* Buffer - Pointer to Buffer */
    Undo,                           /* UndoBuffer - Undo buf ptr  */
    0,                              /* BufferPos - Init Chr Posn */
    STRINGSIZE,                     /* MaxChars - Max number of Chars */
    0, 0,                           /* DispPos - First Disp Chr */
    13,                             /* NumChars - Number of Characters */
    0, 0, 0,                        /* Posn Vars calc by Intuition */
    NULL,                           /* No pointer to Rasport */
    0,                              /* Longint Value */
    NULL                            /* No pointer to alt Keyboard */
 };

 SHORT Pairs[] = {
 -1,  -1,                            /* Information describing the */
 160, -1,                            /* border around the gadget */
 160, 9,
 -1, 9,
 -1, -1
  };

 #define NUM_PAIRS 5                /* There are Four pairs above */

 struct Border StrBorder = {
  -1, -1,                           /* LeftEdge, TopEdge */
  1, 0, JAM1,                       /* FrontPen,  BackPen  DrawMode  */
  NUM_PAIRS,                        /* Number of XY Pairs */
  Pairs,                            /* XY, Pointer to XY Pairs */
  NULL                              /* No more borders */
 };

 struct Gadget tex_gad = {
    0, 30, 30, 150,11, GADGHCOMP, STRINGCENTER | LONGINT | RELVERIFY,
    STRGADGET, (APTR)&StrBorder, 0,
    &ntext, 0, (APTR)&TexString, 0, 0
 };

 struct NewWindow nw1 =
{  100, 100,              /*  Start position       */
   220, 70,               /*  width, height,       */
   0, 1,                  /*  detail, block pens   */
   CLOSEWINDOW            /*  IDCMP flags          */
 | REFRESHWINDOW
 | GADGETUP,
                          /*  Regular flags for gadgets and such */
   WINDOWDEPTH
 | WINDOWSIZING
 | WINDOWDRAG
 | WINDOWCLOSE
 | SMART_REFRESH,

   &tex_gad,                        /* First gadget in list         */
   NULL,                            /* User checkmark               */
   (UBYTE *)"Degree of Polynomial", /* Window Title                 */
   NULL,                            /* Pointer to screen            */
   NULL,                            /* Pointer to superbitmap       */
   0, 0, 1, 1,                      /* Ignored because not sizeable */
   WBENCHSCREEN,                    /* Using the Workbench screen   */
   };

number()
{  ULONG MessageClass;

   if (!(w1 = OpenWindow(&nw1) )) return(-1);

   FOREVER
    {  if (message1 = GetMsg(w1->UserPort))
        { MessageClass = message1->Class;
          ReplyMsg(message1);
          switch (MessageClass)
            { case GADGETUP    : CloseWindow(w1);
                                 order = (ULONG)TexString.LongInt;
                                 if ((order<0)||(order>99)) order=-1;
                                 return(order);

              case CLOSEWINDOW : CloseWindow(w1);
                                 return(-1);
            }
        }
    }
}
/******************
  Get a real number
 ******************/

 struct IntuiMessage *message2;
 struct Window *w2;

 struct StringInfo TexString2 = {
    DefString2,                     /* Buffer - Pointer to Buffer */
    Undo,                           /* UndoBuffer - Undo buf ptr  */
    0,                              /* BufferPos - Init Chr Posn */
    STRINGSIZE,                     /* MaxChars - Max number of Chars */
    0, 0,                           /* DispPos - First Disp Chr */
    13,                             /* NumChars - Number of Characters */
    0, 0, 0,                        /* Posn Vars calc by Intuition */
    NULL,                           /* No pointer to Rasport */
    0,                              /* Longint Value */
    NULL                            /* No pointer to alt Keyboard */
 };

 struct Gadget tex_gad2 = {
    0, 30, 30, 150,11, GADGHCOMP, STRINGCENTER | RELVERIFY,
    STRGADGET, (APTR)&StrBorder, 0,
    &ntext, 0, (APTR)&TexString2, 0, 0
 };

 struct NewWindow nw2 =
{  100, 100,              /*  Start position       */
   220, 70,               /*  width, height,       */
   0, 1,                  /*  detail, block pens   */
   CLOSEWINDOW            /*  IDCMP flags          */
 | REFRESHWINDOW
 | GADGETUP,
                          /*  Regular flags for gadgets and such */
   WINDOWDEPTH
 | WINDOWSIZING
 | WINDOWDRAG
 | WINDOWCLOSE
 | SMART_REFRESH,

   &tex_gad2,                      /* First gadget in list         */
   NULL,                           /* User checkmark               */
   (UBYTE *)"Enter real Number",   /* Window Title                 */
   NULL,                           /* Pointer to screen            */
   NULL,                           /* Pointer to superbitmap       */
   0, 0, 1, 1,                     /* Ignored because not sizeable */
   WBENCHSCREEN,                   /* Using the Workbench screen   */
   };

float real()
{  ULONG MessageClass;
   float val;
   extern double atof();

   if (!(w2 = OpenWindow(&nw2) )) return(12);

   FOREVER
    {  if (message2 = GetMsg(w2->UserPort))
        { MessageClass = message2->Class;
          ReplyMsg(message2);
          switch (MessageClass)
            { case GADGETUP    : CloseWindow(w2);
                                 val = atof(DefString2);
                                 return(val);

              case CLOSEWINDOW : CloseWindow(w2);
                                 return(-1.0);
            }
        }
    }
}

#include <libraries/dos.h>
char nw3[] = "CON:20/10/400/100/Display value";

extern void *Open();

/* Display the value of a polynomial at defined x */

Display(r,s,t,u)
float r,s,t,u;
{  struct Filehandle *out;
   char Buffer[80];

   if ((out=Open(nw3,MODE_OLDFILE))==NULL) return;
   switch(lastval)
      { case 0: sprintf(Buffer,"Chebyshev Polynomial degree %d\n",order);
                break;
        case 1: sprintf(Buffer,"Gegenbauer Polynomial(%.1f) degree %d\n",s,order);
                break;
        case 2: sprintf(Buffer,"Hermite Polynomial degree %d\n",order);
                break;
        case 3: sprintf(Buffer,"Jacobi Polynomial(%.1f)(%.1f) degree %d\n",s,t,order);
                break;
        case 4: sprintf(Buffer,"Laguerre Polynomial degree %d\n",order);
                break;
        case 5: sprintf(Buffer,"Legendre Polynomial degree %d\n",order);
                break;
      }
   Write(out,Buffer,(long)strlen(Buffer));
   sprintf(Buffer,"at %.3f = %.3f\n",r,u);
   Write(out,Buffer,(long)strlen(Buffer));
   sprintf(Buffer,"Press any key\n");
   Write(out,Buffer,14L);
   Read(out,Buffer,1L);
   Close(out);
}

