User Tools

Site Tools


user:jbrant:systems:more2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
user:jbrant:systems:more2 [2010/11/29 15:39] – created jbrantuser:jbrant:systems:more2 [2010/11/29 15:43] (current) jbrant
Line 1: Line 1:
 +<code>
 +/*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>
  
 +#define PAGELEN 24
 +#define LINELEN 512
 +
 +void do_more(FILE *);
 +int see_more(FILE *);
 +
 +int main ( int ac , char *av[] )
 +{
 +
 +        FILE *fp;
 +        if ( ac == 1 )
 +                do_more( stdin);
 +        else
 +                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 futher 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 )
 +                                exit(1);
 +                        num_of_lines++;
 +                }
 +}
 +        int see_more(FILE *cmd)
 +        /*
 +         * 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;
 +         }
 +
 +</code>