home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / FLEXLIST.ZIP / VIEW.C < prev    next >
Text File  |  1989-07-27  |  7KB  |  338 lines

  1. /*
  2.  
  3.     view.c
  4.     7-25-89
  5.  
  6.     Copyright 1989
  7.     John W. Small
  8.     All rights reserved
  9.  
  10.     PSW / Power SoftWare
  11.     P.O. Box 10072
  12.     McLean, Virginia 22102 8072
  13.  
  14. */
  15.  
  16. #include <stdlib.h>        /*  exit(), atol()  */
  17. #include <stdio.h>         /*  fopen(), fclose(),  */
  18.                         /*  fgets()  */
  19. #include <string.h>        /*  strlen(), strcpy()  */
  20. #include <io.h>         /*  open(), close(), read()  */
  21. #include <fcntl.h>      /*  O_RDONLY, O_BINARY  */
  22. #include <conio.h>        /*  clrscr(), clreol(),  */
  23.                         /*  gotoxy(), cprintf(),  */
  24.                         /*  putch(), cgets(),  */
  25.                         /*  textcolor(),  */
  26.                         /*  textbackgound(),  */
  27.                         /*  window()  */
  28. #include <dos.h>        /*  int86(), union REGS;  */
  29. #include <flexlist.h>    /*  mkFlist(), rmFlist(),  */
  30.                         /*  nempty(), iquedptr(),   */
  31.                         /*  nextdptr(), prevdptr(),  */
  32.                         /*  rcld()  */
  33.  
  34.  
  35. #define tabstops 4
  36. #define tabdisp ' '
  37. #define HSCROLL  8
  38. #define HPAN     50
  39. #define VSCROLL  7
  40. #define MAXLINES 23
  41. #define MAXCOLS 79
  42. #define FNSIZE  65
  43. #define BUFSIZE 2048
  44. static char buf[BUFSIZE];
  45. static int color, bgrd, ccolor, cbgrd, mcolor, mbgrd;
  46. static long lineno;
  47.  
  48. Flist loadpgs(char *fname)      /*  return list of pages  */
  49. {
  50.     Flist pgs;          /*  pages Flist  */
  51.     long fpos, bpos, y; /*  file and base positions */
  52.     int fd, eob;        /*  end of buf  */
  53.     register int i;
  54.  
  55.     if (!fname)
  56.         return (Flist) 0;
  57.     if (strlen(fname) >= FNSIZE)
  58.         return (Flist) 0;
  59.     if ((fd = open(fname,O_RDONLY|O_BINARY)) < 0)
  60.         return (Flist) 0;
  61.     if ((pgs = mkFlist(sizeof(long),FNSIZE))
  62.         == (Flist) 0)
  63.         return (Flist) 0;
  64.     strcpy(Flistdptr(pgs),fname);
  65.     fpos = bpos = 0;
  66.     if (!iquedptr(pgs,&fpos))  {
  67.         rmFlist(&pgs);
  68.         close(fd);
  69.         return (Flist) 0;
  70.     }
  71.     for (y = 1; (eob = read(fd,buf,BUFSIZE)) != 0;
  72.         bpos += eob)
  73.         for (i = 0 ; i < eob; i++)
  74.             if (buf[i] == '\n')  {
  75.                 if (!(y % VSCROLL))  {
  76.                     fpos = bpos + i + 1;
  77.                     if (!iquedptr(pgs,&fpos))  {
  78.                         rmFlist(&pgs);
  79.                         close(fd);
  80.                         return (Flist) 0;
  81.                     }
  82.                 }
  83.                 y++;
  84.             }
  85.     close(fd);
  86.     return pgs;
  87. }
  88.  
  89. #define  Home    71
  90. #define  UpArr  72
  91. #define  PgUp   73
  92. #define  LArr   75
  93. #define  RArr   77
  94. #define  EndKey 79
  95. #define  DnArr  80
  96. #define  PgDn   81
  97. #define  CtrlLArr    115
  98. #define  CtrlRArr    116
  99. #define  ESC    27
  100. #define     F1     59
  101. #define  F3     61
  102.  
  103. int getPC(void)
  104. {
  105.   union REGS rgs;
  106.  
  107.   rgs.x.ax  =  0x0000;
  108.   int86(0x16,&rgs,&rgs);
  109.   if (rgs.h.al) {
  110.      return (int ) rgs.h.al;
  111.   }
  112.   return - (int) rgs.h.ah;
  113. }
  114.  
  115. char *newFile(void)
  116. {
  117.     static char fname[FNSIZE];
  118.     int c;
  119.  
  120.     gotoxy(1,25);
  121.     textcolor(mcolor);
  122.     textbackground(mbgrd);
  123.     clreol();
  124.     fname[0] = FNSIZE;
  125.     cprintf("Enter file: ");
  126.     return cgets(fname);
  127. }
  128.  
  129. int putpgs(char *fname)
  130. {
  131.     FILE *pgsfile, *newpgsfile;
  132.     Flist pgs, newpgs;
  133.     long fpos;
  134.     int c, x, y, i, startCol;
  135.  
  136.     if ((pgs = loadpgs(fname)) == (Flist) 0)
  137.         return 1;
  138.  
  139.     if ((pgsfile = fopen(Flistdptr(pgs),"r"))
  140.         == (FILE *) 0)
  141.         return 2;
  142.  
  143.     for (c = lineno? 0 : -Home, startCol = 1; c != ESC;
  144.         c = getPC())  {
  145.         switch (c)  {
  146.         case 0:
  147.             if (!rcld(pgs,&fpos,
  148.                 ((unsigned) ((lineno - 1) / VSCROLL)) + 1))
  149.                 rcld(pgs,&fpos,1);
  150.             break;
  151.         case -PgDn:
  152.             if ((i = ncur(pgs) + 3) < nempty(pgs))
  153.                 rcld(pgs,&fpos,i);
  154.             else if (ncur(pgs) < nempty(pgs))
  155.                 rcld(pgs,&fpos,nempty(pgs));
  156.             else
  157.                 continue;
  158.             break;
  159.         case -PgUp:
  160.             if ((i = ncur(pgs) - 3) > 0)
  161.                 rcld(pgs,&fpos,i);
  162.             else if (i > -2)
  163.                 rcld(pgs,&fpos,1);
  164.             else
  165.                 continue;
  166.             break;
  167.         case -Home:
  168.             rcld(pgs,&fpos,1);
  169.             break;
  170.         case -EndKey:
  171.             rcld(pgs,&fpos,nempty(pgs));
  172.             break;
  173.         case -UpArr:
  174.             if (ncur(pgs) > 1)
  175.                 prevdptr(pgs,&fpos);
  176.             else
  177.                 continue;
  178.             break;
  179.         case -DnArr:
  180.             if (ncur(pgs) < nempty(pgs))
  181.                 nextdptr(pgs,&fpos);
  182.             else
  183.                 continue;
  184.             break;
  185.         case -LArr:
  186.             if (startCol == 1)
  187.                 continue;
  188.             if ((startCol -= HSCROLL) < 1)
  189.                 startCol = 1;
  190.             break;
  191.         case -CtrlLArr:
  192.             if (startCol == 1)
  193.                 continue;
  194.             if ((startCol -= HPAN) < 1)
  195.                 startCol = 1;
  196.             break;
  197.         case -RArr:
  198.             startCol += HSCROLL;
  199.             break;
  200.         case -CtrlRArr:
  201.             startCol += HPAN;
  202.             break;
  203.         case -F1:
  204.             textcolor(mcolor);
  205.             textbackground(mbgrd);
  206.             gotoxy(1,25);
  207.             clreol();
  208.             cprintf("Keys: PgUp, PgDn, Home = top,"
  209.             " End = bottom, F3 = new file, ESC = Quit");
  210.             continue;
  211.         case -F3:
  212.             if ((newpgs = loadpgs(newFile()))
  213.                 != (Flist) 0)  {
  214.                 if ((newpgsfile =
  215.                     fopen(Flistdptr(newpgs),"r"))
  216.                     != (FILE *) 0)  {
  217.                     fclose(pgsfile);
  218.                     pgsfile = newpgsfile;
  219.                     rmFlist(&pgs);
  220.                     pgs = newpgs;
  221.                     rcld(pgs,&fpos,1);
  222.                 }
  223.                 else  {
  224.                     rmFlist(&newpgs);
  225.                     continue;
  226.                 }
  227.             }
  228.             else
  229.                 continue;
  230.             break;
  231.         default:
  232.             continue;
  233.         }
  234.         fseek(pgsfile,fpos,0);
  235.         textcolor(color);
  236.         textbackground(bgrd);
  237.         window(1,1,80,24);
  238.         clrscr();
  239.         for (y = 1; (y <= MAXLINES) &&
  240.             fgets(buf,BUFSIZE,pgsfile); y++)  {
  241.             gotoxy(1,y);
  242.             for (x = 1, i = 0;
  243.                 buf[i] && buf[i] != '\n' &&
  244.                 x < startCol + MAXCOLS;
  245.                 i++)  {
  246.                 if (buf[i] == '\t')  {     /* expand tab */
  247.                     for (;x % tabstops; x++)
  248.                         if (x >= startCol) putch(tabdisp);
  249.                     if (x >= startCol) putch(tabdisp);
  250.                     x++;
  251.                 }
  252.                 else if (x < startCol)
  253.                     x++;
  254.                 else if (buf[i] < 26)  {  /* ctrl char */
  255.                     textcolor(ccolor);
  256.                     textbackground(cbgrd);
  257.                     putch(buf[i] + 'A' - 1);
  258.                     textcolor(color);
  259.                     textbackground(bgrd);
  260.                     x++;
  261.                 }
  262.                 else {
  263.                     putch(buf[i]);
  264.                     x++;
  265.                 }
  266.             }
  267.         }
  268.         textcolor(mcolor);
  269.         textbackground(mbgrd);
  270.         window(1,1,80,25);
  271.         gotoxy(1,25);
  272.         cprintf("View file: %s   Line %d   Col %d",
  273.             (char *) Flistdptr(pgs),
  274.             (ncur(pgs) - 1) * VSCROLL + 1,
  275.             startCol);
  276.         clreol();
  277.     }
  278.     fclose(pgsfile);
  279.     rmFlist(&pgs);
  280.     return 0;
  281. }
  282.  
  283. int vmode(void)
  284. {
  285.     union REGS rgs;
  286.  
  287.     rgs.x.ax = 0x0F00;
  288.     int86(0x10,&rgs,&rgs);
  289.     return (int) rgs.h.al;
  290. }
  291.  
  292. void scrInit(void)
  293. {
  294.     textmode(C80);
  295.     if (vmode() == 7)  {
  296.         color  = BLACK;
  297.         bgrd   = LIGHTGRAY;
  298.         ccolor = LIGHTGRAY;
  299.         cbgrd  = BLACK;
  300.         mcolor = BLACK;
  301.         mbgrd  = LIGHTGRAY;
  302.     }
  303.     else  {
  304.         color  = BLACK;
  305.         bgrd   = LIGHTGRAY;
  306.         ccolor = BLUE;
  307.         cbgrd  = LIGHTGRAY;
  308.         mcolor = LIGHTGRAY;
  309.         mbgrd  = RED;
  310.     }
  311.     textcolor(color);
  312.     textbackground(bgrd);
  313.     clrscr();
  314. }
  315.  
  316. main(int argc, char *argv[])
  317. {
  318.     int i;
  319.  
  320.     if (argc > 3)  {
  321.         puts("\nusage:  list  filename  [lineno]");
  322.         exit(1);
  323.     }
  324.     if (argc == 3)
  325.         lineno = atol(argv[2]);
  326.     else
  327.         lineno = 0L;
  328.     scrInit();
  329.     if (argc >= 2)
  330.         i = putpgs(argv[1]);
  331.     else
  332.         i = putpgs(newFile());
  333.     textcolor(LIGHTGRAY);
  334.     textbackground(BLACK);
  335.     clrscr();
  336.     exit(i);
  337. }
  338.