dos_compilers/Zortech C++ v206/GENERAL/ZCMORE.C
2024-07-02 07:30:38 -07:00

102 lines
2.8 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*_ zcmore.c Fri Oct 13 1989 Modified by: Samuel Druker */
/* Copyright (C) 1986 by Northwest Software */
/* All Rights Reserved */
/* Written by Walter Bright */
/* This is a program meant to demonstrate the use of the disp package */
/* of functions. It also illustrates how ftell() and fseek() can be */
/* used with text files. */
/* ZCMORE is a functional replacement for the MORE program supplied */
/* with MS-DOS. It, however, does not work with non-IBM PC compatible */
/* displays. */
/* To compile: */
/* ZTC -mti zcmore */
/* To use: */
/* ZCMORE filename */
#include <stdio.h>
#include <disp.h>
main(argc,argv)
int argc;
char *argv[];
{ FILE *f;
int c;
int rows;
unsigned long fsize,fpos,startpage,lastpage;
if (argc == 2) /* expecting 1 arg, the file name */
{ f = fopen(argv[1],"r");
if (!f)
{ fprintf(stderr,"Can't open file '%s'\n",argv[1]);
exit(1);
}
fsize = filesize(argv[1]);
}
else
{ fprintf(stderr,"ZCMORE: a program to peruse files\n\
Use:\n\tZCMORE filename\n");
exit(1);
}
disp_open(); /* initialize display package */
rows = 0; /* row 0 == top row */
lastpage = 0; /* no previous page */
startpage = 0; /* start of this page */
while ((c = fgetc(f)) != EOF) /* while not end of file */
{ c &= 0x7F; /* so WordStar files can be read */
disp_putc(c); /* display character read */
if (disp_cursorcol == 0) /* if finished a line */
{ rows++; /* # of lines output */
if (rows == disp_numrows - 1) /* if end of screen */
{ disp_startstand();
fpos = ftell(f); /* where are we in file? */
disp_printf("--More-- %2ld%%",(fpos*100)/fsize);
disp_endstand();
disp_putc(' ');
loop:
disp_flush(); /* flush output to display */
c = getch(); /* wait for user input */
switch (c)
{
case 't': /* start of file */
case 'T':
lastpage = 0;
/* FALL-THROUGH */
case 'b': /* go back a screen */
case 'B':
fseek(f,lastpage,0);
fpos = startpage = lastpage;
/* FALL-THROUGH */
case ' ':
rows = 0; /* next screen */
lastpage = startpage;
startpage = fpos;
disp_move(0,0);
disp_eeop(); /* clear screen */
break;
case '\r':
/* just one more line */
rows = disp_numrows - 2;
disp_putc('\r');
disp_eeol(); /* erase 'More' */
break;
case 3:
case 'Q':
case 'q':
disp_putc('\r');
disp_eeol(); /* erase 'More' */
goto done; /* quit */
default: /* error */
disp_printf("' '=next page, 'b'=\
back page, 't'=top, Return=next line, 'q'=quit");
disp_move(disp_numrows - 1,13);
goto loop; /* try again */
}
}
}
} /* while */
done: disp_close(); /* finish up gracefully */
}