home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 14view / vf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  3.3 KB  |  136 lines

  1. /*
  2.  *    vf -- view a file using a full-screen window onto
  3.  *    an in-memory text file buffer
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <local\std.h>
  10. #include <local\video.h>
  11. #include "vf.h"
  12.  
  13. extern int setctype(int, int);
  14. int Startscan, Endscan;    /* cursor scan line range */
  15. unsigned char Attr;    /* primary display attribute */
  16. unsigned char Revattr;    /* reverse video for highlighting */
  17. unsigned char Usrattr;    /* user's original attribute */
  18.  
  19. main(argc, argv)
  20. int argc;
  21. char **argv;
  22. {
  23.     int ch;
  24.     unsigned char chr;
  25.     BOOLEAN errflag;
  26.     BOOLEAN numbers;
  27.     int errcode;
  28.     FILE *fp;
  29.     extern char *optarg;
  30.     extern int optind;
  31.     static char pgm[MAXNAME + 1] = { "vf" };
  32.  
  33.     /* function prototypes */
  34.     void clean();
  35.     extern clrscrn(unsigned char);
  36.     extern void getpname(char *, char *);
  37.     extern void fixtabs(int);
  38.     extern void initmsg(int, int, int, unsigned char, int);
  39.     extern int getopt(int, char **, char *);
  40.     extern int vf_cmd(FILE *, char *, BOOLEAN);
  41.     extern int readca(unsigned char *, unsigned char *, unsigned int);
  42.     extern int getctype(int *, int *, int);
  43.  
  44.     errcode = 0;
  45.     fixtabs(TABWIDTH);
  46.  
  47.     /* get program name from DOS (version 3.00 and later) */
  48.     if (_osmajor >= 3)
  49.         getpname(*argv, pgm);
  50.  
  51.     /* be sure we have needed DOS support */
  52.     if (_osmajor < 2) {
  53.         fprintf(stderr, "%s requires DOS 2.00 or later\n", pgm);
  54.         exit(1);
  55.     }
  56.  
  57.     /* process optional arguments first */
  58.     errflag = numbers = FALSE;
  59.     while ((ch = getopt(argc, argv, "n")) != EOF)
  60.         switch (ch) {
  61.         case 'n':
  62.             /* turn on line numbering */
  63.             numbers = TRUE;
  64.             break;
  65.         case '?':
  66.             /* bad option */
  67.             errflag = TRUE;
  68.             break;
  69.         }
  70.  
  71.     /* check for command-line errors */
  72.     argc -= optind;
  73.     argv += optind;
  74.     if (errflag == TRUE || argc == 0) {
  75.         fprintf(stderr, "Usage: %s [-n] file...\n", pgm);
  76.         exit(1);
  77.     }
  78.  
  79.     /* get current video attribute and set VF attributes */
  80.     getstate();
  81.     readca(&chr, &Usrattr, Vpage);    /* save user's attribute settings */
  82.     /*
  83.      * These colors are modified from those presented in the
  84.      * book so that VF will work on all monochrome and
  85.      * color systems the same way -- change them to suit
  86.      * your own shade of reality and operating conditions
  87.      */
  88.     Attr = Usrattr;            /* basic text attributes */
  89.     /* reverse video for highlighting */
  90.     Revattr = ((Attr & 0x7) << 4) | (Attr >> 4);
  91.     clrscrn(Attr);
  92.  
  93.     /* save user's cursor shape and turn cursor off */
  94.     getctype(&Startscan, &Endscan, Vpage);
  95.     setctype(MAXSCAN, MAXSCAN);
  96.  
  97.     /* set up the message line manager */
  98.     initmsg(MSGROW, MSGCOL, Maxcol[Vmode] - MSGCOL, Attr, Vpage);
  99.  
  100.     /* display first screen page */
  101.     putcur(0, 0, Vpage);
  102.     putstr("ViewFile/1.0  H=Help Q=Quit Esc=Next", Vpage);
  103.     putcur(1, 0, Vpage);
  104.     writea(Revattr, Maxcol[Vmode], Vpage);
  105.  
  106.     for (; argc-- > 0; ++argv) {
  107.         if ((fp = fopen(*argv, "r")) == NULL) {
  108.             fprintf(stderr, "%s: cannot open %s -- ", pgm, *argv);
  109.             perror("");
  110.             ++errcode;
  111.             continue;
  112.         }
  113.         if (vf_cmd(fp, *argv, numbers) != 0)
  114.             break;
  115.         fclose(fp);
  116.     }
  117.     clean();
  118.     exit(errcode);
  119. }
  120.  
  121.  
  122. /*
  123.  *    clean -- restore the user's original conditions
  124.  */
  125.  
  126. void
  127. clean()
  128. {
  129.     /* set screen to user's attribute */
  130.     clrscrn(Usrattr);
  131.     putcur(0, 0, Vpage);
  132.  
  133.     /* restore user's cursor shape */
  134.     setctype(Startscan, Endscan);
  135. }
  136.