more1.c
#include <stdio.h>
#include <sys/ioctl.h>
int PAGELEN, LINELEN;
struct winsize wbuf;
void do_more(FILE *);
int see_more(FILE *);
int main(int ac, char *av[])
{
FILE *fp;
if(ioctl(0,TIOCGWINSZ,&wbuf)!=-1)
{
PAGELEN = wbuf.ws_row;
LINELEN = wbuf.ws_col;
}
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)
{
char line[LINELEN];
int num_of_lines = 0;
int see_more(FILE *), reply;
FILE *fp_tty;
fp_tty = fopen("/dev/tty","r");
if(fp_tty == NULL)
exit(1);
while(fgets(line, LINELEN, fp))
{
if(ioctl(0,TIOCGWINSZ,&wbuf)!=-1)
{
PAGELEN = wbuf.ws_row;
LINELEN = wbuf.ws_col;
}
if (num_of_lines == PAGELEN)
{
reply = see_more(fp_tty);
if (reply == 0)
break;
num_of_lines -= reply;
}
if(fputs(line, stdout) == EOF)
exit(1);
num_of_lines++;
}
}
int see_more(FILE *cmd)
{
int c;
printf("\033[7m more? \033[m");
while((c=getc(cmd)) != EOF)
{
if (c == 'q')
return 0;
if (c == ' ')
{
return PAGELEN;
}
if (c == '\n')
return 1;
}
return 0;
}