home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 316.lha / EtaleFileReader / efr.c < prev    next >
C/C++ Source or Header  |  1989-11-30  |  7KB  |  256 lines

  1. /*  efr.c  -- (main in efr)  Copyright © 1989 by William F. Hammond  */
  2. #ifndef TDM_H
  3. #include "tdm.h"
  4. #endif
  5. /*********************************************************************/
  6. void main(argc, argv)
  7. USHORT argc;
  8. UBYTE *argv[];
  9. {
  10. static UBYTE welcome[] =
  11. " Etale File Reader by William F. Hammond, Copyright ‹ 1989-freely distributable ";
  12. static UBYTE caution[] =
  13. "   Reading standard input; to quit enter \"<Control>-c\"                          ";
  14. struct Screen *screen;
  15. struct FileHandle *stdinh;
  16. struct IntuiMessage *imsg;
  17. ULONG flags, ilock;
  18. LONG golinea;
  19. USHORT type;
  20. SHORT code, proc, wherefile, jfr;
  21. BYTE goloop;
  22. UBYTE igtch, kill;
  23. if(argc <= 0) exit(0);            /*   call from WorkBench not allowed   */
  24. stream = stdin;
  25. filearg = NULL;
  26. proc = argc;
  27. while(proc)
  28.    {
  29.    if(proc > 3)
  30.       {
  31. /*  Usage:  efr [t] file  OR  efr < file [t]  OR  efr < golist g file  */
  32.       errsp[0] = (UBYTE *)"Usage:  ";
  33.       errsp[1] = argv[0];
  34.       errsp[2] = (UBYTE *)" [t] file  OR  ";
  35.       errsp[3] = argv[0];
  36.       errsp[4] = (UBYTE *)" < file [t]  OR  ";
  37.       errsp[5] = argv[0];
  38.       errsp[6] = (UBYTE *)" <golist g file\xa";
  39.       strcpy(errstr, errsp[0]);
  40.       for(jfr = 1; jfr < 7; jfr ++) strcat(errstr, errsp[jfr]);
  41.       fputs(errstr, stderr);
  42.       exit(10);
  43.       }
  44.    wherefile = 0; gflag = NULB; tflag = NULB;
  45.    if(proc == 3)
  46.       {
  47.       if( strlen(argv[1]) !=1 ) proc = 4;
  48.       else
  49.          {
  50.          if( (argv[1][0] | 0x20) == 'g') gflag = ONEB;
  51.          if( (argv[1][0] | 0x20) == 't') tflag = ONEB;
  52.          if( (gflag | tflag) == 0 ) proc = 4;
  53.          if(proc == 3) wherefile = 2;
  54.          }
  55.       }
  56.    if(proc ==2)
  57.       {
  58.       wherefile = 1;
  59.       if(strlen(argv[1]) == 1)
  60.          {
  61.          if( argv[1][0] == '?' ) {wherefile = 0; proc = 4;}
  62.          if( (argv[1][0] | 0x20) == 't') {wherefile = 0; tflag = ONEB;}
  63.          }
  64.       }
  65.    if(wherefile)
  66.       {
  67.       filearg = fopen(argv[wherefile], "r");
  68.       if(filearg == NULL)
  69.          {
  70.          errsp[0] = (UBYTE *)"Cannot open file \"";
  71.          errsp[1] = argv[wherefile];
  72.          errsp[2] = (UBYTE *)"\"\xa";
  73.          strcpy(errstr, errsp[0]);
  74.          for(jfr = 1; jfr < 3; jfr ++) strcat(errstr, errsp[jfr]);
  75.          fputs(errstr,stderr);
  76.          exit(10);
  77.          }
  78.       stream = filearg;
  79.       }
  80.    if(proc < 4) proc = 0;
  81.    }        /*  end of "proc" loop  */
  82. IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library", 33L);
  83. if (IntuitionBase == NULL)
  84.    {
  85.    fputs("main: Cannot open intuition library, v. 33\xa", stderr);
  86.    if(filearg) fclose(filearg);
  87.    exit(21);
  88.    }
  89. GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 33L);
  90. if (GfxBase == NULL)
  91.    {
  92.    fputs("main: Cannot open graphics library, v. 33\xa", stderr);
  93.    CloseLibrary(IntuitionBase);
  94.    if(filearg) fclose(filearg);
  95.    exit(22);
  96.    }
  97. flags = ACTIVATE|BORDERLESS|SMART_REFRESH|NOCAREREFRESH;
  98. type = 0x000F;   /*  Aztec says CUSTOMSCREEN = 0x000FL  */
  99. ilock = LockIBase(0L);
  100. screen = IntuitionBase->ActiveScreen;
  101. mw = makewindow(0,0,screen->Width,screen->Height,"",flags,screen,type);
  102. UnlockIBase(ilock);
  103. if (mw == NULL)
  104.    {
  105.    fputs("main: Cannot open window\xa", stderr);
  106.    CloseLibrary(GfxBase);
  107.    CloseLibrary(IntuitionBase);
  108.    if(filearg) fclose(filearg);
  109.    exit(24);
  110.    }
  111. kill = NULB;
  112. rp = mw->RPort;
  113. SetAPen(rp, 1L);
  114. SetBPen(rp, 0L);
  115. Move(rp, 0L, 0L);
  116. SetDrMd(rp, (LONG)JAM2);
  117. ClearScreen(rp);
  118. enable = AskSoftStyle(rp);
  119. style = (ULONG)FS_NORMAL;
  120. savestyle = SetSoftStyle(rp, style, enable);
  121. SetDrMd(rp, (LONG)(JAM2|INVERSVID));
  122. Move(rp, 0L, (LONG)(rp->TxBaseline));
  123. Text(rp, welcome, (ULONG)strlen(welcome));
  124. maxrowpix = (mw->Height) + (rp->TxBaseline) - (rp->TxHeight);
  125. maxline = (maxrowpix - rp->TxBaseline)/rp->TxHeight;
  126. if(strcmp(argv[0],"efr"))Delay(25L);
  127. if(maxline < 3)
  128.    {
  129.    fputs("Font too tall for this reader on this screen\xa", stderr);
  130.    kill = ONEB;
  131.    }
  132. ModifyIDCMP(mw, VANILLAKEY);
  133. if( (filearg == NULL) || gflag )
  134.    {
  135.    Move(rp, 0L, (LONG)(rp->TxBaseline + rp->TxHeight));
  136.    Text(rp, caution, (ULONG)strlen(caution));
  137.    stdinh = Input();
  138.    if(stdinh == NULL)
  139.       {
  140.       fputs("Standard input handle unavailable\xa", stderr);
  141.       kill = ONEB;
  142.       }
  143.    if(!kill)
  144.       {
  145.       if(IsInteractive(stdinh))
  146.          {
  147.          fputs("Using standard input; enter \"<Control>-\\\" to quit\xa",
  148.                 stderr);
  149.          while( (!kill) && (!WaitForChar(stdinh, 5L)) )
  150.             {
  151.             igtch = NULB;
  152.             while(imsg = (struct IntuiMessage *)GetMsg(mw->UserPort))
  153.                {
  154.                if(imsg->Class == VANILLAKEY) igtch = (UBYTE)imsg->Code;
  155.                ReplyMsg(imsg);
  156.                }
  157.             if(igtch == 0x03) kill = ONEB;
  158.             }
  159.          }                         /*   if   IsInteractive(stdinh)   */
  160.       }                         /*   if   !kill                     */
  161.    }                         /*   if  filearg == NULL  OR  gflag   */
  162. delta = ( (4 * rp->TxHeight) + 5)/10;
  163. instr = AllocMem((LONG)(MAXSTRLN+1), MEMF_CLEAR);
  164. pvstr = AllocMem((LONG)(MAXSTRLN+1), MEMF_CLEAR);
  165. if ( (instr == NULL) || (pvstr == NULL) )
  166.    {
  167.    fputs("main: Insufficient memory for line buffers\xa", stderr);
  168.    kill = ONEB;
  169.    }
  170. linesize = 0L;
  171. txtline = 0L;
  172. golinet = 1L;
  173. code = 1;
  174. if(gflag)
  175.    {
  176.    code = -1;
  177.    }
  178. if(kill) code = 0;
  179. while (code)
  180.    {
  181.    if(code < 0)      /*  pick up golinet from stdin  */
  182.       {
  183.       goloop = ONEB;
  184.       while(goloop)
  185.          {
  186.          if( (bfgets(instr, MAXSTRLN , stdin)) == NULL )
  187.             {
  188.             goloop = NULB;
  189.             gflag = 0;   /*  use current line passed in golinet  */
  190.             }
  191.          else
  192.             {
  193.             instr[MAXSTRLN] = '\0';
  194.             golinea = tnump(instr);
  195.             if(golinea > 0L)
  196.                {
  197.                golinet = golinea;
  198.                goloop = NULB;
  199.                }
  200.             }
  201.          }
  202.       }
  203.    golinem = golinet;              /*  golinet is line requested by user  */
  204.    if (golinem <= 0L) golinem = 1L;
  205.    if (golinem <= txtline)      /*  txtline itself has already been read  */
  206.       {
  207.       if (stream != filearg) 
  208.          {
  209.          fputs("Cannot back up standard input\xa", stderr);
  210.          break;
  211.          }
  212.       else     /*  The stream must be rewound  */
  213.          {
  214.          txtline = 0;
  215.          fseek(stream, 0L, 0);
  216.          }
  217.       }
  218.    code = txttw();
  219.    }
  220. ModifyIDCMP(mw, NULL);
  221. FreeMem(instr, (LONG)(MAXSTRLN+1));
  222. FreeMem(pvstr, (LONG)(MAXSTRLN+1));
  223. CloseWindow(mw);
  224. CloseLibrary(GfxBase);
  225. CloseLibrary(IntuitionBase);
  226. if(filearg) fclose(filearg);
  227. exit(0);
  228. }
  229. /*********************************************************************/
  230. struct Window *makewindow(x,y,w,h,name,flags,screen,type)
  231. SHORT x, y, w, h;
  232. UBYTE *name;
  233. ULONG flags;
  234. struct Screen *screen;
  235. USHORT type;
  236. {
  237. struct Window *mw;
  238. struct NewWindow new, *nw;
  239. nw = &new;
  240. new.LeftEdge = x; new.TopEdge = y;
  241. new.Width = w; new.Height = h;
  242. new.DetailPen = (UBYTE)1; new.BlockPen = (UBYTE)0;
  243. new.IDCMPFlags = NULL;
  244. new.Flags = flags;
  245. new.FirstGadget = NULL;
  246. new.CheckMark = NULL;
  247. new.Title = (UBYTE *)name;
  248. new.Screen = screen;
  249. new.BitMap = NULL;
  250. new.MinWidth = 0; new.MinHeight = 0;
  251. new.MaxWidth = 0; new.MaxHeight = 0;
  252. new.Type = type;
  253. mw = OpenWindow(nw);
  254. return mw;
  255. }
  256.