#include exec/types.h
#include intuition/intuition.h
#include intuition/intuitionbase.h
#include exec/exec.h
#include exec/execbase.h
#include libraries/dos.h
#include libraries/dosextens.h
#include graphics/gfxmacros.h
#include functions.h

#define NOBORDER NULL
#define NOTEXT NULL

/* Gadget zum Abklicken... */

struct Gadget ClickGadget = { NULL,0,0,0,8,GADGHNONE,RELVERIFY,
                              BOOLGADGET,NOBORDER,0,NOTEXT,0,0,NULL,0};

/* Einfaches Fenster ohne alles... */

struct NewWindow NewScrollWindow = {
       0,230,640,8,0,1,
       GADGETUP,
       BORDERLESS,
       &ClickGadget,NULL,
       NULL,
       NULL,NULL,
       0,0,0,0,
       WBENCHSCREEN };

/* Das Übliche... */

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

/* Default scrolltext */

char *DefaultText= "Hscroll 1.0 (w) 1989 by Christian Wolf. Options: -lx and -ty"
                   " puts your scroll to equivalent x and y position. Use -w to"
                   " select the window's width. -s is used to have different"
                   " scroll speeds. Values allowed are: 1,2,4,8. Add a filename"
                   " to your parameter list to have your own text. -rn lets"
                   " the text repeat n times. To remove the scrolltext, just"
                   " click it. Have much fun...                             ";

main(argc,argv)

 int argc;
 char **argv;

{
 struct Window *ScrollWindow;
 struct RastPort *ScrollRastPort;
 short l=160,t=248,w=320,s=2,p=0,c=0,sl=strlen(DefaultText);
 long r=0xffffffff,Size;
 struct FileHandle *ThisFile;
 struct FileLock *MyLock;
 char *ScrollText=DefaultText,*MyPtr;
 struct FileInfoBlock *FileInfoBlock;

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

 /* FileInfoBlock öffen... */
 FileInfoBlock=AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR);
 if (!FileInfoBlock) exit(0);

 /* parameter liste durchgehen */

 argc--;
 argv++;
 while (argc--)
        {
         if (**argv=='-')
             {
              (*argv)++;
              switch((*(*argv)++))
                     {
                      case 'w':
                      w=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
             {
              /* TextFile laden... */
              if (ThisFile=Open(*argv,MODE_OLDFILE))
                  {
                   MyLock=Lock(*argv,ACCESS_READ);
                   Examine(MyLock,FileInfoBlock);
                   Size=FileInfoBlock->fib_Size;
                   if (MyPtr=ScrollText=AllocMem(Size,MEMF_PUBLIC))
                        {
                         Read(ThisFile,ScrollText,Size);
                         MyPtr[Size]=0;
                         /* eventuelle returns entfernen... */
                         while (*MyPtr)
                                {
                                 if (*MyPtr == 0x0a) *MyPtr++=' ';
                                 else MyPtr++;
                                }
                         UnLock(MyLock);
                         Close(ThisFile);
                        }
                   else ScrollText=DefaultText;
                  }
              sl=strlen(ScrollText);
             }
         argv++;
        }
 /* Libries öffnen... */

 IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
 GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);

 /* Werte für Fenster und Gadget initialisieren */

 NewScrollWindow.LeftEdge=l;
 NewScrollWindow.TopEdge=t;
 NewScrollWindow.Width=w;
 ClickGadget.LeftEdge=0;
 ClickGadget.TopEdge=0;
 ClickGadget.Width=w;

 /* Fenster öffnen */

 if (!(ScrollWindow=OpenWindow(&NewScrollWindow))) exit(0);

 /* Rasterport holen */

 ScrollRastPort=ScrollWindow->RPort;

 SetAPen(ScrollRastPort,3);
 SetBPen(ScrollRastPort,0);
 SetDrMd(ScrollRastPort,JAM1);

 /* Hauptschleife -> Scrollen, solange r!=0 oder UserPort leer */

 while (!GetMsg(ScrollWindow->UserPort) && r)
  {
   /* Auf den VBL warten */
   WaitTOF();
   /* Grafik um s Pixels verschieben... */
   ScrollRaster(ScrollRastPort,s,0,0,0,w-1,7);
   Move(ScrollRastPort,w-s-p,6);
   if (sl <= c)
       {
        c=0;
        r--;
       }
   /* Nachfolgenden Text reinschreiben */
   Text(ScrollRastPort,&ScrollText[c],1);
   p+=s;
   if (p > 8-s)
       {
        p=0;
        c++;
       }
  }
 /* Alles schließen... */
 CloseWindow(ScrollWindow);
 CloseLibrary(IntuitionBase);
 CloseLibrary(GfxBase);
 if (ScrollText!=DefaultText) FreeMem(ScrollText,sl);
 if (FileInfoBlock) FreeMem(FileInfoBlock,sizeof(struct FileInfoBlock));
 SetTaskPri(FindTask(0),0);
}

