This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
user:jbrant:systems:more2 [2010/11/29 15:39] – created jbrant | user:jbrant:systems:more2 [2010/11/29 15:43] (current) – jbrant | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
+ | /*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 < | ||
+ | #include < | ||
+ | #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 , " | ||
+ | { | ||
+ | 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( "/ | ||
+ | if (fp_tty | ||
+ | exit(1); | ||
+ | while ( fgets (line, LINELEN, fp ) ) | ||
+ | { /* more input */ | ||
+ | if ( num_of_lines == PAGELEN) | ||
+ | { /* full screen? */ | ||
+ | reply = see_more(fp_tty); | ||
+ | if ( reply == 0) /* n: done */ | ||
+ | break; | ||
+ | num_of_lines -= reply; | ||
+ | } | ||
+ | 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(" | ||
+ | while( (c=getc(cmd)) != EOF ) /* NEW: reads from tty */ | ||
+ | { | ||
+ | if ( c == ' | ||
+ | return 0; | ||
+ | if ( c == ' ' ) /* ' ' => next page */ | ||
+ | return PAGELEN; | ||
+ | if ( c == ' | ||
+ | return 1; | ||
+ | |||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </ |