|
|
1.1 ! root 1: #define JERQ No home should be without one ! 2: /*%cc p.c pad.o spname.o ! 3: */ ! 4: #include <stdio.h> ! 5: #include "pad.h" ! 6: #include <signal.h> ! 7: #ifdef JERQ ! 8: #include <sgtty.h> ! 9: #include "/usr/jerq/include/jioctl.h" ! 10: int ismpx=0; ! 11: #endif ! 12: #define DEF 22 /* 3*DEF == 66, #lines per nroff page */ ! 13: #define WIDTH 79 /* some goddam terminals get confused at the margin */ ! 14: #define STDIN (char *)0 ! 15: int nprintfiles = 0; ! 16: int lineno = 0; ! 17: int pglen = DEF; ! 18: int width = WIDTH; ! 19: FILE *tty; ! 20: char buf[BUFSIZ]; ! 21: ! 22: main(argc, argv) ! 23: char *argv[]; ! 24: { ! 25: #ifdef JERQ ! 26: struct sgttyb sttybuf; ! 27: #endif ! 28: if((tty=fopen("/dev/tty", "r")) == NULL) { ! 29: printf("p: no /dev/tty\n"); ! 30: exit(1); ! 31: } ! 32: setbuf(stdout, buf); ! 33: #ifdef JERQ ! 34: if(ioctl(1, JWINSIZE, &sttybuf) == 0){ ! 35: pglen = sttybuf.sg_ospeed-1; /* ick */ ! 36: if(pglen<0) ! 37: pglen = 5; /* why not 5? */ ! 38: width = sttybuf.sg_ispeed-1; ! 39: if(width<10) ! 40: width=10; ! 41: ismpx=1; ! 42: } ! 43: #endif ! 44: while(argc > 1) { ! 45: --argc; argv++; ! 46: if(*argv[0] == '-') { ! 47: pglen = atoi(&argv[0][1]); ! 48: if(pglen < 0) ! 49: pglen = DEF; ! 50: } else ! 51: printfile(argv[0], argc==1); ! 52: } ! 53: if(nprintfiles == 0) ! 54: printfile(STDIN, 1); ! 55: return 0; ! 56: } ! 57: ! 58: PAD * ! 59: spopen(file, mode) ! 60: register char *file; ! 61: register char *mode; ! 62: { ! 63: register FILE *f; ! 64: register char c; ! 65: extern char *spname(); ! 66: ! 67: if((f=fopen(file, mode)) == NULL) { ! 68: file = spname(file); ! 69: if(file != (char *)0){ ! 70: printf("\"p %s\"? ", file); ! 71: fflush(stdout); ! 72: c = getc(tty); ! 73: if(c != 'n') ! 74: f=fopen(file, mode); ! 75: while(c != '\n') ! 76: c = getc(tty); ! 77: } ! 78: } ! 79: return(Pfopen(f)); ! 80: } ! 81: int peek; ! 82: int cheat; ! 83: int col; ! 84: get(pad) ! 85: PAD *pad; ! 86: { ! 87: register c; ! 88: if(c=peek){ ! 89: peek=0; ! 90: if(cheat && (peek=Pgetc(pad))=='\n') ! 91: peek=0; /* don't insert '\n' if it's coming up anyway */ ! 92: cheat=0; ! 93: }else ! 94: c=Pgetc(pad); ! 95: return c; ! 96: } ! 97: put(c) ! 98: register c; ! 99: { ! 100: putchar(c); ! 101: if(c=='\t') ! 102: col=(col|7)+1; ! 103: else if(c=='\n') ! 104: col=0; ! 105: else if(c=='\b' && col>0) ! 106: col--; ! 107: else if(c>=' ') ! 108: col++; ! 109: if(col>=width) ! 110: cheat=peek='\n'; ! 111: } ! 112: printfile(file, last) ! 113: register char *file; ! 114: { ! 115: register PAD *pad; ! 116: register c; ! 117: ! 118: nprintfiles++; ! 119: peek = cheat = 0; ! 120: col = 0; ! 121: if(file == STDIN) ! 122: pad=Pfopen(stdin); ! 123: else if((pad=spopen(file, "r")) == NULL) { ! 124: /* ! 125: * no need to use stderr in p! ! 126: */ ! 127: printf("p: can't open %s\n", file); ! 128: return; ! 129: } ! 130: while((c=get(pad))!=EOF || (!last && newline(pad, 1)=='-')) { ! 131: if(c == '\n' && ++lineno==pglen) { ! 132: if(newline(pad, 0)==EOF) ! 133: goto Return; ! 134: } else ! 135: put(c); ! 136: } ! 137: fflush(stdout); ! 138: Return: ! 139: Pclose(pad); ! 140: } ! 141: newline(p, eof) ! 142: register PAD *p; ! 143: { ! 144: register c, i; ! 145: ! 146: lineno = 0; ! 147: col = 0; ! 148: fflush(stdout); ! 149: loop: ! 150: switch(getc(tty)){ ! 151: case '\n': /* Continue */ ! 152: #ifdef JERQ ! 153: if(ismpx && !eof) ! 154: putchar('\f'); ! 155: #endif ! 156: return '\n'; ! 157: case '!': ! 158: callunix(); ! 159: goto loop; ! 160: case 'q': ! 161: waitnl(1); ! 162: case EOF: ! 163: return EOF; ! 164: case '-': ! 165: for(i=1; (c=getc(tty))=='-'; i++) ! 166: ; ! 167: ungetc(c, tty); ! 168: peek=cheat=0; ! 169: backpage(p, i); ! 170: waitnl(0); ! 171: return '-'; ! 172: /* Fall through */ ! 173: default: ! 174: waitnl(eof); ! 175: return '\n'; ! 176: } ! 177: } ! 178: ! 179: backpage(p, pg) ! 180: register PAD *p; ! 181: register pg; ! 182: { ! 183: register i; ! 184: while(pg--) ! 185: for(i=0; i<pglen; i++) ! 186: if(backline(p)==EOF) ! 187: return; ! 188: /* Now at end of new first line; back up to beginning */ ! 189: if(backline(p)=='\n') ! 190: (void)Pgetc(p); /* Eat that newline */ ! 191: } ! 192: ! 193: backline(p) ! 194: register PAD *p; ! 195: { ! 196: register c; ! 197: while((c=Pbackc(p))!='\n') ! 198: if(c==EOF) ! 199: return(EOF); ! 200: return('\n'); ! 201: } ! 202: ! 203: waitnl(eof){ ! 204: do; while(getc(tty) != '\n'); ! 205: #ifdef JERQ ! 206: if(ismpx && !eof) ! 207: putchar('\f'); ! 208: #endif ! 209: } ! 210: ! 211: callunix() ! 212: { ! 213: int rc, status, unixpid; ! 214: char buf[256]; ! 215: register char *p; ! 216: for(p=buf; (*p++=getc(tty))!='\n'; ) ! 217: ; ! 218: *--p=0; ! 219: if( (unixpid=fork())==0 ) { ! 220: close(0); dup(2); ! 221: execl("/bin/sh", "sh", "-c", buf, 0); ! 222: exit(255); ! 223: } ! 224: else if(unixpid == -1){ ! 225: printf("p: can't fork\n"); ! 226: return; ! 227: }else{ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); ! 228: while( (rc = wait(&status)) != unixpid && rc != -1 ) ; ! 229: signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); ! 230: printf("!\n"); ! 231: fflush(stdout); ! 232: } ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.