User Tools

Site Tools


user:jbrant:systems:more2
/*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;
         }
user/jbrant/systems/more2.txt · Last modified: 2010/11/29 10:43 by jbrant