home *** CD-ROM | disk | FTP | other *** search
- # define PL 102
- # define ESC 033
- # define SI 017
- # define SO 016
- # define LINELN 800
- char *page[PL];
- char lbuff [LINELN], *line;
- main ()
- {
- int c, i, j, ll, cp, mustwr;
- extern int fin, fout;
- fin = dup(0);
- fout = dup(1);
-
- for (ll=0; ll<PL; ll++)
- page[ll] = 0;
-
- c = 1;
- cp = ll = 0;
- line = lbuff;
- mustwr = PL;
-
- while (c>0)
- switch (c = getchar())
- {
- case '\n':
- store (ll%PL);
- if (++ll >= mustwr)
- if (page[ll%PL] != 0)
- {
- printf ("%s\n",page[ll%PL]);
- mustwr++;
- free (page[ll%PL]);
- page[ll%PL]=0;
- }
- fetch (ll%PL);
- cp = 0;
- continue;
- case '\0': continue;
- case ESC:
- c = getchar();
- if (c == '7')
- {
- store(ll%PL);
- ll--;
- fetch (ll%PL);
- }
- else
- {
- outc (ESC, &line);
- outc (c, &line );
- }
- continue;
- case '\r':
- line = lbuff;
- continue;
- case '\t':
- outc (' ', &line);
- cp = line-lbuff;
- while (cp++%8)
- outc(' ', &line);
- continue;
- default:
- outc(c, &line);
- }
- for (i=0; i<PL; i++)
- if (page[(mustwr+i)%PL] != 0)
- printf ("%s\n",page[(mustwr+i) % PL]);
- flush();
- }
- outc (c, lp)
- char **lp;
- {
- int j;
- j = 0;
- while (j >0 || *(*lp) == '\b' || *(*lp) == ESC || **lp == SI || **lp == SO)
- {
- switch (*(*lp))
- {
- case '\b':
- j++;
- (*lp)++;
- break;
- case '\0':
- *(*lp)++ = ' ';
- j--;
- break;
- case ESC: /* 'escape' */
- (*lp) =+ 2;
- break;
- case SI:
- case SO:
- (*lp)++;
- break;
- default:
- (*lp)++;
- j--;
- break;
- }
- }
- if (c != ' ' || *(*lp) == '\0')
- *(*lp) = c;
- (*lp)++;
- }
- store (ll)
- {
- if (page[ll] != 0)
- free (page[ll]);
- page[ll] = alloc ( leng (lbuff) + 2);
- copy (page[ll],lbuff);
- }
- fetch(ll)
- {
- int i;
- for (i=0; i < LINELN; i++)
- lbuff[i] = '\0';
- copy (line=lbuff, page[ll]);
- }
- copy (s,t)
- char *s, *t;
- {
- if (t == 0)
- return (*s=0);
- while (*s++ = *t++);
- }
- leng (s)
- char *s;
- {
- int l;
- for (l=0; s[l]; l++);
- return (l);
- }
-