| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /* more02.c - version 0.2 of more
- * read and print 24 lines then pause for a few special commands
- * feature of version 0.2: reads from /dev/tty for commands
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define PAGELEN 24
- #define LINELEN 512
- void do_more(FILE *);
- int see_more(FILE *);
- int main( int ac , char *av[] )
- {
- char flag[] = "-o";
- char *outname;
- char *inname;
- int c;
- FILE *fp;
- FILE *outfile;
- if ( ac == 4 )
- {
- for ( int i = 0; i < ac; i++)
- {
- if ( ! strcmp (av[i], flag) )
- {
- outname = av[i+1];
- printf ("%s\n", outname);
- if ( i == 1 )
- {
- inname = av[3];
- }
- if ( i == 2 )
- {
- inname = av[1];
- }
- printf ("%s\n", inname);
- }
- }
- fp = fopen (inname, "r");
- outfile = fopen (outname, "w");
- while ( (c = fgetc (fp) ) != EOF )
- {
- fputc( c, outfile );
- }
- fclose (outfile);
- fclose (fp);
- printf ("%s\n", "here");
- fp = fopen (inname, "r");
- do_more (fp);
- fclose (fp);
- printf ("%s\n", "here1");
- }
- if ( ac == 1 )
- {
- do_more( stdin );
- }
- if ( ac == 2 )
- {
- while ( --ac )
- if ( (fp = fopen( *++av , "r" )) != NULL )
- {
- do_more( fp );
- fclose( fp );
- }
- else
- exit(1);
- }
- return 0;
- }
- void do_more( FILE *fp )
- /*
- * read PAGELEN lines, then call see_more() for further instructions
- */
- {
- char line[LINELEN];
- int num_of_lines = 0;
- int see_more(FILE *), reply;
- FILE *fp_tty;
- fp_tty = fopen( "/dev/tty", "r" ); /* NEW: cmd stream */
- if ( fp_tty == NULL ) /* if open fails */
- exit(1); /* no use in running */
- while ( fgets( line, LINELEN, fp ) ){ /* more input */
- if ( num_of_lines == PAGELEN ) { /* full screen? */
- reply = see_more(fp_tty); /* NEW: pass FILE * */
- if ( reply == 0 ) /* n: done */
- break;
- num_of_lines -= reply; /* reset count */
- }
- if ( fputs( line, stdout ) == EOF ) /* show line */
- exit(1); /* or die */
- num_of_lines++; /* count it */
- }
- }
- int see_more(FILE *cmd) /* NEW: accepts arg */
- /*
- * print message, wait for response, return # of lines to advance
- * q means no, space means yes, CR means one line
- */
- {
- int c;
- printf("\033[7m more? \033[m"); /* reverse on a vt100 */
- while( (c=getc(cmd)) != EOF ) /* NEW: reads from tty */
- {
- if ( c == 'q' ) /* q -> N */
- return 0;
- if ( c == ' ' ) /* ' ' => next page */
- return PAGELEN; /* how many to show */
- if ( c == '\n' ) /* Enter key => 1 line */
- return 1;
- }
- return 0;
- }
|