#include <intuition/intuitionbase.h>
#include <libraries/dos.h>
#include <exec/memory.h>
#include <graphics/gfxbase.h>
#ifdef LATTICE
#include <proto/all.h>
#else
#include <functions.h>
#endif

#define fib FileInfoBlock
#define fibsize (long)sizeof(struct fib)

#define NOBORDER NULL
#define NOTEXT NULL

/* Gadget zum Abklicken... */
struct Gadget ClickGadget = { NULL,0,0,0,0,GADGHNONE,RELVERIFY,
                              BOOLGADGET,NOBORDER,0,NOTEXT,0,0,NULL,0};

/* Einfaches Fenster ohne alles... */
struct NewWindow NewScrollWindow = {
       0,230,640,8,0,1,
       GADGETUP|GADGETUP,
       BORDERLESS,
       &ClickGadget,NULL,
       NULL,
       NULL,NULL,
       640,200,640,200,
       WBENCHSCREEN };

/* Das Übliche... */
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct Table { char *Line;
               long Len; };

struct Table DefaultText[] = { "           VScroll 1.0               ",37,
                               "    © 1989 by Markt und Technik      ",37,
                               "     written by Christian Wolf       ",37,
                               "      currently resident at          ",37,
                               "        Spandauer Str. 104L          ",37,
                               "          1 Berlin 20                ",37,
                               "        Tel.: 030/3660450            ",37,
                               "  Usage: vscroll textfile [options]  ",37,
                               "  Use -w to modify window's width    ",37,
                               "  Use -s number of jiffies 1,2,4,8   ",37,
                               "  Use -l and -t to position window   ",37,
                               "  Use -r for no. of repetitions      ",37,
                               "  Use -h for a new height of window  ",37,
                               "                                     ",37,
                               "                                     ",37,
                               "                                     ",37,
                               "                                     ",37,0 };

struct BitMap ScrollBitMap;

void main(argc,argv)

 char **argv;
 int argc;

{
 struct Table *ScrollText=DefaultText,*cl=DefaultText;
 char *MyPtr,*LoadText=0;
 struct Window *ScrollWindow;
 struct RastPort *ScrollRastPort;
 long l=160,t=60,w=37*8,s=1,p=0,c=0,h=100,sl;
 long r=0xffffffff,Size,Lines;
 struct fib *fib;
 struct FileHandle *ThisFile;
 struct FileLock *MyLock;
 int i;

 /* Damit es nicht so ruckelt -> höchste Taskprorität */
 SetTaskPri(FindTask(0L),127L);

 /* parameter liste durchgehen */
 argc--;
 argv++;
 while (argc--)
        {
         if (**argv=='-')
             {
              (*argv)++;
              switch((*(*argv)++))
                     {
                      case 'h':
                      h=atoi(*argv);
                      break;
                      case 'l':
                      l=atoi(*argv);
                      break;
                      case 't':
                      t=atoi(*argv);
                      break;
                      case 's':
                      s=atoi(*argv);
                      break;
                      case 'r':
                      r=atoi(*argv);
                      break;
                     }
             }
         else
             {
              if (ScrollText==DefaultText)
                  {
                   /* TextFile laden... */
                   if (ThisFile=(struct FileHandle *)Open(*argv,MODE_OLDFILE))
                       {
                        /* fib öffen... */
                        if (fib=(struct fib *)AllocMem(fibsize,MEMF_PUBLIC))
                            {
                             MyLock=(struct FileLock *)Lock(*argv,ACCESS_READ);
                             Examine(MyLock,fib);
                             UnLock(MyLock);
                             Size=fib->fib_Size;
                             if (LoadText=(char *)AllocMem(Size,MEMF_PUBLIC))
                                  {
                                   Read(ThisFile,LoadText,Size);
                                   LoadText[Size-1]=0;
                                   for (MyPtr=LoadText,Lines=2;*MyPtr;MyPtr++)
                                        {
                                         if (*MyPtr == 0x0a) Lines++;
                                        }
                                   if (!(cl=ScrollText=(struct Table *)AllocMem(Lines<<3,MEMF_PUBLIC|MEMF_CLEAR))) exit(0);
                                   for (MyPtr=LoadText,cl++->Line=LoadText;*MyPtr;)
                                      {
                                       if (*MyPtr == 0x0a)
                                         {
                                          *MyPtr=0;
                                          cl++->Line=++MyPtr;
                                         }
                                       else MyPtr++;
                                      }
                                   cl->Line=0;
                                   for (cl=ScrollText,w=0;cl->Line;cl++)
                                        {
                                         if ((cl->Len=strlen(cl->Line)) > w) w=cl->Len;
                                        }
                                   w<<=3;
                                   cl=ScrollText;
                                  }
                             else ScrollText=DefaultText;
                             FreeMem(fib,fibsize);
                            }
                        else ScrollText=DefaultText;
                        Close(ThisFile);
                       }
                  }
             }
         argv++;
        }
 /* Libries öffnen... */
 IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L);
 GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L);
 /* Werte für Fenster und Gadget initialisieren */
 NewScrollWindow.LeftEdge=l;
 NewScrollWindow.TopEdge=t;
 NewScrollWindow.Width=w;
 NewScrollWindow.Height=h;
 ClickGadget.LeftEdge=0;
 ClickGadget.TopEdge=0;
 ClickGadget.Height=h;
 ClickGadget.Width=w;
 /* Fenster öffnen */
 if (ScrollWindow=(struct Window *)OpenWindow(&NewScrollWindow))
     {
      /* Rasterport holen */
      ScrollRastPort=ScrollWindow->RPort;
      SetAPen(ScrollRastPort,1L);
      SetBPen(ScrollRastPort,0L);
      SetDrMd(ScrollRastPort,JAM1);
      /* BitMap kopieren */
      ScrollBitMap=*ScrollRastPort->BitMap;
      ScrollRastPort->BitMap=&ScrollBitMap;
      ScrollBitMap.Depth=1;
      h+=6;

      while (!GetMsg(ScrollWindow->UserPort) && r)
       {
        WaitTOF();
        ScrollRaster(ScrollRastPort,0L,s,0L,0L,w-1,h-1);
        Move(ScrollRastPort,0L,h-s-p);
        Text(ScrollRastPort,cl->Line,cl->Len);
        p+=s;
        if (p > 8-s)
            {
             p=0;
             cl++;
             if (!cl->Line)
                 {
                  cl=ScrollText;
                  r--;
                 }
            }
       }
      ScrollBitMap.Depth=2;

      /* alles schließen */
      CloseWindow(ScrollWindow);
     }
 CloseLibrary((struct Library *)IntuitionBase);
 CloseLibrary((struct Library *)GfxBase);
 if (ScrollText!=DefaultText) FreeMem(ScrollText,Lines<<3);
 if (LoadText) FreeMem(LoadText,Size);
 SetTaskPri(FindTask(0L),0L);
}

