|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44: typedef int (*SIG_TYP)();
45: SIG_TYP signal();
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86: typedef unsigned char u_char;
87: typedef unsigned short u_short;
88: typedef unsigned int u_int;
89: typedef unsigned long u_long;
90:
91:
92:
93: typedef struct _physadr { int r[1]; } *physadr;
94: typedef long daddr_t;
95: typedef char * caddr_t;
96: typedef u_short ino_t;
97: typedef long swblk_t;
98: typedef long size_t;
99: typedef long time_t;
100: typedef long label_t[14];
101: typedef short dev_t;
102: typedef long off_t;
103: typedef long portid_t;
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289: typedef struct fd_set { unsigned long fds_bits[ (128 + sizeof(int) * 8 -1)/( sizeof(int) * 8 )]; } fd_set;
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303: struct sgttyb {
304: char sg_ispeed;
305: char sg_ospeed;
306: char sg_erase;
307: char sg_kill;
308: short sg_flags;
309: };
310:
311:
312:
313:
314: struct tchars {
315: char t_intrc;
316: char t_quitc;
317: char t_startc;
318: char t_stopc;
319: char t_eofc;
320: char t_brkc;
321: };
322:
323:
324:
325:
326: struct insld {
327: short ld;
328: short level;
329: };
330:
331:
332:
333:
334: struct passfd {
335: union {
336: struct file *fp;
337: int fd;
338: } f;
339: short uid;
340: short gid;
341: short nice;
342: short fill;
343: };
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465: struct ltchars {
466: char t_suspc;
467: char t_dsuspc;
468: char t_rprntc;
469: char t_flushc;
470: char t_werasc;
471: char t_lnextc;
472: };
473:
474:
475:
476:
477:
478: struct luchars {
479: char t_undoc;
480: char t_urotc;
481: };
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630: typedef int jmp_buf[10];
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652: char Q[] = "";
653: char T[] = "TMP";
654:
655:
656:
657: int peekc;
658: int lastc;
659: char savedfile[128];
660: char file[128];
661: char linebuf[512];
662: char rhsbuf[512/2];
663: char expbuf[256+4];
664: int circfl;
665: int *zero;
666: int *dot;
667: int *dol;
668: int given;
669: int *addr1;
670: int *addr2;
671: char genbuf[512];
672: long count;
673: char *nextip;
674: char *linebp;
675: int ninbuf;
676: int io;
677: int pflag;
678: long lseek();
679: int (*oldhup)();
680: int (*oldquit)();
681: int vflag = 1;
682: int xflag;
683: int xtflag;
684: int kflag;
685: int oflag;
686: char key[9 + 1];
687: char crbuf[512];
688: char perm[768];
689: char tperm[768];
690: int listf;
691: int listn;
692: int col;
693: char *globp;
694: int tfile = -1;
695: int tline;
696: char *tfname;
697: char *loc1;
698: char *loc2;
699: char *locs;
700: char ibuff[512];
701: int iblock = -1;
702: char obuff[512];
703: int oblock = -1;
704: int ichanged;
705: int nleft;
706: char WRERR[] = "WRITE ERROR";
707: int names[26];
708: int anymarks;
709: char *braslist[5];
710: char *braelist[5];
711: int nbra;
712: int subnewa;
713: int subolda;
714: int fchange;
715: int wrapp;
716: int bpagesize = 20;
717: unsigned nlall = 128;
718:
719: int *address();
720: char *getline();
721: char *getblock();
722: char *place();
723: char *mktemp();
724: char *malloc();
725: char *realloc();
726: jmp_buf savej;
727:
728: main(argc, argv)
729: char **argv;
730: {
731: register char *p1, *p2;
732: extern int onintr(), quit(), onhup();
733: int (*oldintr)();
734:
735: oldquit = signal(3 , (int (*)())1);
736: oldhup = signal(1 , (int (*)())1);
737: oldintr = signal(2 , (int (*)())1);
738: if ((int)signal(15 , (int (*)())1) == 0)
739: signal(15 , quit);
740: argv++;
741: while (argc > 1 && **argv=='-') {
742: switch((*argv)[1]) {
743:
744: case '\0':
745: vflag = 0;
746: break;
747:
748: case 'q':
749: signal(3 , (int (*)())0);
750: vflag = 1;
751: break;
752:
753: case 'X':
754: xflag = 1;
755: break;
756:
757: case 'o':
758: oflag = 1;
759: vflag = 0;
760: break;
761: }
762: argv++;
763: argc--;
764: }
765: if(xflag){
766: getkey();
767: kflag = crinit(key, perm);
768: }
769:
770: if (oflag) {
771: p1 = "/dev/stdout";
772: p2 = savedfile;
773: while (*p2++ = *p1++)
774: ;
775: globp = "a";
776: } else if (argc>1) {
777: p1 = *argv;
778: p2 = savedfile;
779: while (*p2++ = *p1++)
780: if (p2 >= &savedfile[sizeof(savedfile)])
781: p2--;
782: globp = "r";
783: }
784: zero = (int *)malloc(nlall*sizeof(int));
785: tfname = mktemp("/tmp/eXXXXX");
786: init();
787: if (((int)oldintr&01) == 0)
788: signal(2 , onintr);
789: if (((int)oldhup&01) == 0)
790: signal(1 , onhup);
791: setjmp(savej);
792: commands();
793: quit();
794: }
795:
796: commands()
797: {
798: int getfile(), gettty();
799: register *a1, c;
800: register int temp;
801: char lastsep;
802:
803: for (;;) {
804: if (pflag) {
805: pflag = 0;
806: addr1 = addr2 = dot;
807: print();
808: }
809: c = '\n';
810: for (addr1 = 0;;) {
811: lastsep = c;
812: a1 = address();
813: c = getchr();
814: if (c!=',' && c!=';')
815: break;
816: if (lastsep==',')
817: error(Q);
818: if (a1==0) {
819: a1 = zero+1;
820: if (a1>dol)
821: a1--;
822: }
823: addr1 = a1;
824: if (c==';')
825: dot = a1;
826: }
827: if (lastsep!='\n' && a1==0)
828: a1 = dol;
829: if ((addr2=a1)==0) {
830: given = 0;
831: addr2 = dot;
832: }
833: else
834: given = 1;
835: if (addr1==0)
836: addr1 = addr2;
837: switch(c) {
838:
839: case 'a':
840: add(0);
841: continue;
842:
843: case 'b':
844: nonzero();
845: browse();
846: continue;
847:
848: case 'c':
849: nonzero();
850: newline();
851: rdelete(addr1, addr2);
852: append(gettty, addr1-1);
853: continue;
854:
855: case 'd':
856: nonzero();
857: newline();
858: rdelete(addr1, addr2);
859: continue;
860:
861: case 'E':
862: fchange = 0;
863: c = 'e';
864: case 'e':
865: setnoaddr();
866: if (vflag && fchange) {
867: fchange = 0;
868: error(Q);
869: }
870: filename(c);
871: init();
872: addr2 = zero;
873: goto caseread;
874:
875: case 'f':
876: setnoaddr();
877: filename(c);
878: puts(savedfile);
879: continue;
880:
881: case 'g':
882: global(1);
883: continue;
884:
885: case 'i':
886: add(-1);
887: continue;
888:
889:
890: case 'j':
891: if (!given)
892: addr2++;
893: newline();
894: join();
895: continue;
896:
897: case 'k':
898: nonzero();
899: if ((c = getchr()) < 'a' || c > 'z')
900: error(Q);
901: newline();
902: names[c-'a'] = *addr2 & ~01;
903: anymarks |= 01;
904: continue;
905:
906: case 'm':
907: move(0);
908: continue;
909:
910: case 'n':
911: listn++;
912: newline();
913: print();
914: continue;
915:
916: case '\n':
917: if (a1==0) {
918: a1 = dot+1;
919: addr2 = a1;
920: addr1 = a1;
921: }
922: if (lastsep==';')
923: addr1 = a1;
924: print();
925: continue;
926:
927: case 'l':
928: listf++;
929: case 'p':
930: case 'P':
931: newline();
932: print();
933: continue;
934:
935: case 'Q':
936: fchange = 0;
937: case 'q':
938: setnoaddr();
939: newline();
940: quit();
941:
942: case 'r':
943: filename(c);
944: caseread:
945: if ((io = open(file, 0)) < 0) {
946: lastc = '\n';
947: error(file);
948: }
949: setwide();
950: squeeze(0);
951: ninbuf = 0;
952: c = zero != dol;
953: append(getfile, addr2);
954: exfile();
955: fchange = c;
956: continue;
957:
958: case 's':
959: nonzero();
960: substitute(globp!=0);
961: continue;
962:
963: case 't':
964: move(1);
965: continue;
966:
967: case 'u':
968: nonzero();
969: newline();
970: if ((*addr2&~01) != subnewa)
971: error(Q);
972: *addr2 = subolda;
973: dot = addr2;
974: continue;
975:
976: case 'v':
977: global(0);
978: continue;
979:
980: case 'W':
981: wrapp++;
982: case 'w':
983: setwide();
984: squeeze(dol>zero);
985: if ((temp = getchr()) != 'q' && temp != 'Q') {
986: peekc = temp;
987: temp = 0;
988: }
989: filename(c);
990: if(!wrapp ||
991: ((io = open(file,1)) == -1) ||
992: ((lseek(io, 0L, 2)) == -1))
993: if ((io = creat(file, 0666)) < 0)
994: error(file);
995: wrapp = 0;
996: if (dol > zero)
997: putfile();
998: exfile();
999: if (addr1<=zero+1 && addr2==dol)
1000: fchange = 0;
1001: if (temp == 'Q')
1002: fchange = 0;
1003: if (temp)
1004: quit();
1005: continue;
1006:
1007: case 'X':
1008: setnoaddr();
1009: newline();
1010: xflag = 1;
1011: puts("Entering encrypting mode!");
1012: getkey();
1013: kflag = crinit(key, perm);
1014: continue;
1015:
1016:
1017: case '=':
1018: setwide();
1019: squeeze(0);
1020: newline();
1021: count = addr2 - zero;
1022: putd();
1023: putchr('\n');
1024: continue;
1025:
1026: case '!':
1027: callunix();
1028: continue;
1029:
1030: case -1:
1031: return;
1032:
1033: }
1034: error(Q);
1035: }
1036: }
1037:
1038: print(){
1039: register int *a1;
1040: nonzero();
1041: a1 = addr1;
1042: do {
1043: if (listn) {
1044: count = a1-zero;
1045: putd();
1046: putchr('\t');
1047: }
1048: puts(getline(*a1++));
1049: } while (a1 <= addr2);
1050: dot = addr2;
1051: listf = 0;
1052: listn = 0;
1053: pflag = 0;
1054: }
1055:
1056: int *
1057: address()
1058: {
1059: register int sign, *a;
1060: int opcnt, nextopand, *b;
1061: register int c;
1062:
1063: nextopand = -1;
1064: sign = 1;
1065: opcnt = 0;
1066: a = dot;
1067: do {
1068: do c = getchr(); while (c==' ' || c=='\t');
1069: if ('0'<=c && c<='9') {
1070: peekc = c;
1071: if (!opcnt)
1072: a = zero;
1073: a += sign*getnum();
1074: } else switch (c) {
1075: case '$':
1076: a = dol;
1077:
1078: case '.':
1079: if (opcnt)
1080: error(Q);
1081: break;
1082: case '\'':
1083: c = getchr();
1084: if (opcnt || c<'a' || 'z'<c)
1085: error(Q);
1086: a = zero;
1087: do a++; while (a<=dol && names[c-'a']!=(*a&~01));
1088: break;
1089: case '?':
1090: sign = -sign;
1091:
1092: case '/':
1093: compile(c);
1094: b = a;
1095: for (;;) {
1096: a += sign;
1097: if (a<zero)
1098: a = dol;
1099: if (a>dol)
1100: a = zero;
1101: if (execute(a))
1102: break;
1103: if (a==b)
1104: error(Q);
1105: }
1106: break;
1107: default:
1108: if (nextopand == opcnt) {
1109: a += sign;
1110: if (a<zero || dol<a)
1111: continue;
1112: }
1113: if (c!='+' && c!='-' && c!='^') {
1114: peekc = c;
1115: if (opcnt==0)
1116: a = 0;
1117: return (a);
1118: }
1119: sign = 1;
1120: if (c!='+')
1121: sign = -sign;
1122: nextopand = ++opcnt;
1123: continue;
1124: }
1125: sign = 1;
1126: opcnt++;
1127: } while (zero<=a && a<=dol);
1128: error(Q);
1129:
1130: }
1131: int getnum()
1132: {
1133: register int r, c;
1134:
1135: r = 0;
1136: while ((c=getchr())>='0' && c<='9')
1137: r = r*10 + c - '0';
1138: peekc = c;
1139: return (r);
1140: }
1141:
1142: setwide()
1143: {
1144: if (!given) {
1145: addr1 = zero + (dol>zero);
1146: addr2 = dol;
1147: }
1148: }
1149:
1150: setnoaddr()
1151: {
1152: if (given)
1153: error(Q);
1154: }
1155:
1156: nonzero()
1157: {
1158: squeeze(1);
1159: }
1160:
1161: squeeze(i)
1162: int i;
1163: {
1164: if (addr1<zero+i || addr2>dol || addr1>addr2)
1165: error(Q);
1166: }
1167:
1168: newline()
1169: {
1170: register c;
1171:
1172: if ((c = getchr()) == '\n' || c == -1)
1173: return;
1174: if (c=='p' || c=='l' || c=='n') {
1175: pflag++;
1176: if (c=='l')
1177: listf++;
1178: else if (c=='n')
1179: listn++;
1180: if ((c=getchr())=='\n')
1181: return;
1182: }
1183: error(Q);
1184: }
1185:
1186: filename(comm)
1187: {
1188: register char *p1, *p2;
1189: register c;
1190:
1191: count = 0;
1192: c = getchr();
1193: if (c=='\n' || c==-1) {
1194: p1 = savedfile;
1195: if (*p1==0 && comm!='f')
1196: error(Q);
1197: p2 = file;
1198: while (*p2++ = *p1++)
1199: ;
1200: return;
1201: }
1202: if (c!=' ')
1203: error(Q);
1204: while ((c = getchr()) == ' ')
1205: ;
1206: if (c=='\n')
1207: error(Q);
1208: p1 = file;
1209: do {
1210: if (p1 >= &file[sizeof(file)-1] || c==' ' || c==-1)
1211: error(Q);
1212: *p1++ = c;
1213: } while ((c = getchr()) != '\n');
1214: *p1++ = 0;
1215: if (savedfile[0]==0 || comm=='e' || comm=='f') {
1216: p1 = savedfile;
1217: p2 = file;
1218: while (*p1++ = *p2++)
1219: ;
1220: }
1221: }
1222:
1223: exfile()
1224: {
1225: close(io);
1226: io = -1;
1227: if (vflag) {
1228: putd();
1229: putchr('\n');
1230: }
1231: }
1232:
1233: onintr()
1234: {
1235: signal(2 , onintr);
1236: putchr('\n');
1237: lastc = '\n';
1238: error(Q);
1239: }
1240:
1241: onhup()
1242: {
1243: signal(2 , (int (*)())1);
1244: signal(1 , (int (*)())1);
1245: if (dol > zero) {
1246: addr1 = zero+1;
1247: addr2 = dol;
1248: io = creat("ed.hup", 0666);
1249: if (io > 0)
1250: putfile();
1251: }
1252: fchange = 0;
1253: quit();
1254: }
1255:
1256: error(s)
1257: char *s;
1258: {
1259: register c;
1260:
1261: wrapp = 0;
1262: listf = 0;
1263: listn = 0;
1264: putchr('?');
1265: puts(s);
1266: count = 0;
1267: lseek(0, (long)0, 2);
1268: pflag = 0;
1269: if (globp)
1270: lastc = '\n';
1271: globp = 0;
1272: peekc = lastc;
1273: if(lastc)
1274: while ((c = getchr()) != '\n' && c != -1)
1275: ;
1276: if (io > 0) {
1277: close(io);
1278: io = -1;
1279: }
1280: longjmp(savej, 1);
1281: }
1282:
1283: getchr()
1284: {
1285: char c;
1286: if (lastc=peekc) {
1287: peekc = 0;
1288: return(lastc);
1289: }
1290: if (globp) {
1291: if ((lastc = *globp++) != 0)
1292: return(lastc);
1293: globp = 0;
1294: return(-1);
1295: }
1296: if (read(0, &c, 1) <= 0)
1297: return(lastc = -1);
1298: lastc = c&0177;
1299: return(lastc);
1300: }
1301:
1302: gettty()
1303: {
1304: register int rc;
1305:
1306: if (rc = gety())
1307: return(rc);
1308: if (linebuf[0]=='.' && linebuf[1]==0)
1309: return(-1);
1310: return(0);
1311: }
1312:
1313: gety()
1314: {
1315: register int c;
1316: register char *gf;
1317: register char *p;
1318:
1319: p = linebuf;
1320: gf = globp;
1321: while ((c = getchr()) != '\n') {
1322: if (c==-1) {
1323: if (gf)
1324: peekc = c;
1325: return(c);
1326: }
1327: if ((c &= 0177) == 0)
1328: continue;
1329: *p++ = c;
1330: if (p >= &linebuf[512-2])
1331: error(Q);
1332: }
1333:
1334: *p++ = 0;
1335: return(0);
1336: }
1337:
1338: getfile()
1339: {
1340: register c;
1341: register char *lp, *fp;
1342:
1343: lp = linebuf;
1344: fp = nextip;
1345: do {
1346: if (--ninbuf < 0) {
1347: if ((ninbuf = read(io, genbuf, 512)-1) < 0)
1348: if (lp>linebuf) {
1349: puts("'\\n' appended");
1350: *genbuf = '\n';
1351: }
1352: else return(-1);
1353: fp = genbuf;
1354: while(fp < &genbuf[ninbuf]) {
1355: if (*fp++ & 0200) {
1356: if (kflag)
1357: crblock(perm, genbuf, ninbuf+1, count);
1358: break;
1359: }
1360: }
1361: fp = genbuf;
1362: }
1363: c = *fp++;
1364: if (c=='\0')
1365: continue;
1366: if (c&0200 || lp >= &linebuf[512]) {
1367: lastc = '\n';
1368: error(Q);
1369: }
1370: *lp++ = c;
1371: count++;
1372: } while (c != '\n');
1373: *--lp = 0;
1374: nextip = fp;
1375: return(0);
1376: }
1377:
1378: putfile()
1379: {
1380: int *a1, n;
1381: register char *fp, *lp;
1382: register nib;
1383:
1384: nib = 512;
1385: fp = genbuf;
1386: a1 = addr1;
1387: do {
1388: lp = getline(*a1++);
1389: for (;;) {
1390: if (--nib < 0) {
1391: n = fp-genbuf;
1392: if(kflag)
1393: crblock(perm, genbuf, n, count-n);
1394: if(write(io, genbuf, n) != n) {
1395: puts(WRERR);
1396: error(Q);
1397: }
1398: nib = 511;
1399: fp = genbuf;
1400: }
1401: count++;
1402: if ((*fp++ = *lp++) == 0) {
1403: fp[-1] = '\n';
1404: break;
1405: }
1406: }
1407: } while (a1 <= addr2);
1408: n = fp-genbuf;
1409: if(kflag)
1410: crblock(perm, genbuf, n, count-n);
1411: if(write(io, genbuf, n) != n) {
1412: puts(WRERR);
1413: error(Q);
1414: }
1415: }
1416:
1417: append(f, a)
1418: int *a;
1419: int (*f)();
1420: {
1421: register *a1, *a2, *rdot;
1422: int nline, tl;
1423:
1424: nline = 0;
1425: dot = a;
1426: while ((*f)() == 0) {
1427: if ((dol-zero)+1 >= nlall) {
1428: int *ozero = zero;
1429: nlall += 512;
1430: if ((zero = (int *)realloc((char *)zero, nlall*sizeof(int)))==0) {
1431: error("MEM?");
1432: onhup();
1433: }
1434: dot += zero - ozero;
1435: dol += zero - ozero;
1436: }
1437: tl = putline();
1438: nline++;
1439: a1 = ++dol;
1440: a2 = a1+1;
1441: rdot = ++dot;
1442: while (a1 > rdot)
1443: *--a2 = *--a1;
1444: *rdot = tl;
1445: }
1446: return(nline);
1447: }
1448:
1449: add(i)
1450: int i;
1451: {
1452: if (i && (given || dol>zero)) {
1453: addr1--;
1454: addr2--;
1455: }
1456: squeeze(0);
1457: newline();
1458: append(gettty, addr2);
1459: }
1460:
1461: browse()
1462: {
1463: register forward, n;
1464: static bformat;
1465: static bnum;
1466: forward=1;
1467: if((peekc=getchr())!='\n'){
1468: if (peekc=='-' || peekc=='+') {
1469: if(peekc=='-')
1470: forward=0;
1471: getchr();
1472: }
1473: if((n=getnum())>0)
1474: bpagesize=n;
1475: }
1476: newline();
1477: if (pflag) {
1478: bformat=listf;
1479: bnum=listn;
1480: } else {
1481: listf=bformat;
1482: listn=bnum;
1483: }
1484: if (forward) {
1485: addr1=addr2;
1486: if((addr2+=bpagesize)>dol)
1487: addr2=dol;
1488: } else {
1489: if((addr1=addr2-bpagesize)<=zero)
1490: addr1=zero+1;
1491: }
1492: print();
1493: }
1494:
1495: callunix()
1496: {
1497: register (*savint)(), pid, rpid;
1498: int retcode;
1499:
1500: setnoaddr();
1501: if ((pid = fork()) == 0) {
1502: signal(1 , oldhup);
1503: signal(3 , oldquit);
1504: execl("/bin/sh", "sh", "-t", 0);
1505: exit(0100);
1506: }
1507: savint = signal(2 , (int (*)())1);
1508: while ((rpid = wait(&retcode)) != pid && rpid != -1)
1509: ;
1510: signal(2 , savint);
1511: if (vflag) {
1512: puts("!");
1513: }
1514: }
1515:
1516: quit()
1517: {
1518: if (vflag && fchange && dol!=zero) {
1519: fchange = 0;
1520: error(Q);
1521: }
1522: unlink(tfname);
1523: exit(0);
1524: }
1525:
1526: rdelete(ad1, ad2)
1527: int *ad1, *ad2;
1528: {
1529: register *a1, *a2, *a3;
1530:
1531: a1 = ad1;
1532: a2 = ad2+1;
1533: a3 = dol;
1534: dol -= a2 - a1;
1535: do {
1536: *a1++ = *a2++;
1537: } while (a2 <= a3);
1538: a1 = ad1;
1539: if (a1 > dol)
1540: a1 = dol;
1541: dot = a1;
1542: fchange = 1;
1543: }
1544:
1545: gdelete()
1546: {
1547: register *a1, *a2, *a3;
1548:
1549: a3 = dol;
1550: for (a1=zero; (*a1&01)==0; a1++)
1551: if (a1>=a3)
1552: return;
1553: for (a2=a1+1; a2<=a3;) {
1554: if (*a2&01) {
1555: a2++;
1556: dot = a1;
1557: } else
1558: *a1++ = *a2++;
1559: }
1560: dol = a1-1;
1561: if (dot>dol)
1562: dot = dol;
1563: fchange = 1;
1564: }
1565:
1566: char *
1567: getline(tl)
1568: {
1569: register char *bp, *lp;
1570: register nl;
1571:
1572: lp = linebuf;
1573: bp = getblock(tl, 0);
1574: nl = nleft;
1575: tl &= ~0377;
1576: while (*lp++ = *bp++)
1577: if (--nl == 0) {
1578: bp = getblock(tl+=0400, 0);
1579: nl = nleft;
1580: }
1581: return(linebuf);
1582: }
1583:
1584: putline()
1585: {
1586: register char *bp, *lp;
1587: register nl;
1588: int tl;
1589:
1590: fchange = 1;
1591: lp = linebuf;
1592: tl = tline;
1593: bp = getblock(tl, 1);
1594: nl = nleft;
1595: tl &= ~0377;
1596: while (*bp = *lp++) {
1597: if (*bp++ == '\n') {
1598: *--bp = 0;
1599: linebp = lp;
1600: break;
1601: }
1602: if (--nl == 0) {
1603: bp = getblock(tl+=0400, 1);
1604: nl = nleft;
1605: }
1606: }
1607: nl = tline;
1608: tline += (((lp-linebuf)+03)>>1)&077776;
1609: return(nl);
1610: }
1611:
1612: char *
1613: getblock(atl, iof)
1614: {
1615: extern read(), write();
1616: register bno, off;
1617: register char *p1, *p2;
1618: register int n;
1619:
1620: bno = (atl>>8)&0377;
1621: off = (atl<<1)&0774;
1622: if (bno >= 255) {
1623: lastc = '\n';
1624: error(T);
1625: }
1626: nleft = 512 - off;
1627: if (bno==iblock) {
1628: ichanged |= iof;
1629: return(ibuff+off);
1630: }
1631: if (bno==oblock)
1632: return(obuff+off);
1633: if (iof==0) {
1634: if (ichanged) {
1635: if(xtflag)
1636: crblock(tperm, ibuff, 512, (long)0);
1637: blkio(iblock, ibuff, write);
1638: }
1639: ichanged = 0;
1640: iblock = bno;
1641: blkio(bno, ibuff, read);
1642: if(xtflag)
1643: crblock(tperm, ibuff, 512, (long)0);
1644: return(ibuff+off);
1645: }
1646: if (oblock>=0) {
1647: if(xtflag) {
1648: p1 = obuff;
1649: p2 = crbuf;
1650: n = 512;
1651: while(n--)
1652: *p2++ = *p1++;
1653: crblock(tperm, crbuf, 512, (long)0);
1654: blkio(oblock, crbuf, write);
1655: } else
1656: blkio(oblock, obuff, write);
1657: }
1658: oblock = bno;
1659: return(obuff+off);
1660: }
1661:
1662: blkio(b, buf, iofcn)
1663: char *buf;
1664: int (*iofcn)();
1665: {
1666: lseek(tfile, (long)b<<9, 0);
1667: if ((*iofcn)(tfile, buf, 512) != 512) {
1668: error(T);
1669: }
1670: }
1671:
1672: init()
1673: {
1674: register *markp;
1675:
1676: close(tfile);
1677: tline = 2;
1678: for (markp = names; markp < &names[26]; )
1679: *markp++ = 0;
1680: subnewa = 0;
1681: anymarks = 0;
1682: iblock = -1;
1683: oblock = -1;
1684: ichanged = 0;
1685: close(creat(tfname, 0600));
1686: tfile = open(tfname, 2);
1687: if(xflag) {
1688: xtflag = 1;
1689: makekey(key, tperm);
1690: }
1691: dot = dol = zero;
1692: }
1693:
1694: global(k)
1695: {
1696: register char *gp;
1697: register c;
1698: register int *a1;
1699: char globuf[256];
1700:
1701: if (globp)
1702: error(Q);
1703: setwide();
1704: squeeze(dol>zero);
1705: if ((c=getchr())=='\n')
1706: error(Q);
1707: compile(c);
1708: gp = globuf;
1709: while ((c = getchr()) != '\n') {
1710: if (c==-1)
1711: error(Q);
1712: if (c=='\\') {
1713: c = getchr();
1714: if (c!='\n')
1715: *gp++ = '\\';
1716: }
1717: *gp++ = c;
1718: if (gp >= &globuf[256-2])
1719: error(Q);
1720: }
1721: if (gp == globuf)
1722: *gp++ = 'p';
1723: *gp++ = '\n';
1724: *gp++ = 0;
1725: for (a1=zero; a1<=dol; a1++) {
1726: *a1 &= ~01;
1727: if (a1>=addr1 && a1<=addr2 && execute(a1)==k)
1728: *a1 |= 01;
1729: }
1730:
1731:
1732:
1733: if (globuf[0]=='d' && globuf[1]=='\n' && globuf[2]=='\0') {
1734: gdelete();
1735: return;
1736: }
1737: for (a1=zero; a1<=dol; a1++) {
1738: if (*a1 & 01) {
1739: *a1 &= ~01;
1740: dot = a1;
1741: globp = globuf;
1742: commands();
1743: a1 = zero;
1744: }
1745: }
1746: }
1747:
1748: join()
1749: {
1750: register char *gp, *lp;
1751: register *a1;
1752:
1753: nonzero();
1754: gp = genbuf;
1755: for (a1=addr1; a1<=addr2; a1++) {
1756: lp = getline(*a1);
1757: while (*gp = *lp++)
1758: if (gp++ >= &genbuf[512-2])
1759: error(Q);
1760: }
1761: lp = linebuf;
1762: gp = genbuf;
1763: while (*lp++ = *gp++)
1764: ;
1765: *addr1 = putline();
1766: if (addr1<addr2)
1767: rdelete(addr1+1, addr2);
1768: dot = addr1;
1769: }
1770:
1771: substitute(inglob)
1772: {
1773: register *markp, *a1, nl;
1774: int gsubf;
1775: int getsub();
1776: int n, m;
1777:
1778: n = getnum();
1779: gsubf = compsub();
1780: for (a1 = addr1; a1 <= addr2; a1++) {
1781: if (execute(a1)){
1782: int *ozero;
1783: m = n;
1784: do {
1785: if (--m <= 0) {
1786: dosub();
1787: if (!gsubf)
1788: break;
1789: }
1790: } while (execute((int *)0));
1791: if (m <= 0) {
1792: inglob |= 01;
1793: subnewa = putline();
1794: *a1 &= ~01;
1795: if (anymarks) {
1796: for (markp = names; markp < &names[26]; markp++)
1797: if (*markp == *a1)
1798: *markp = subnewa;
1799: }
1800: subolda = *a1;
1801: *a1 = subnewa;
1802: ozero = zero;
1803: nl = append(getsub, a1);
1804: nl += zero-ozero;
1805: a1 += nl;
1806: addr2 += nl;
1807: }
1808: }
1809: }
1810: if (inglob==0)
1811: error(Q);
1812: }
1813:
1814: compsub()
1815: {
1816: register seof, c;
1817: register char *p;
1818:
1819: if ((seof = getchr()) == '\n' || seof == ' ')
1820: error(Q);
1821: compile(seof);
1822: p = rhsbuf;
1823: for (;;) {
1824: c = getchr();
1825: if (c=='\\')
1826: c = getchr() | 0200;
1827: if (c=='\n') {
1828: if (globp && globp[0])
1829: c |= 0200;
1830: else {
1831: peekc = c;
1832: pflag++;
1833: break;
1834: }
1835: }
1836: if (c==seof)
1837: break;
1838: *p++ = c;
1839: if (p >= &rhsbuf[512/2])
1840: error(Q);
1841: }
1842: *p++ = 0;
1843: if ((peekc = getchr()) == 'g') {
1844: peekc = 0;
1845: newline();
1846: return(1);
1847: }
1848: newline();
1849: return(0);
1850: }
1851:
1852: getsub()
1853: {
1854: register char *p1, *p2;
1855:
1856: p1 = linebuf;
1857: if ((p2 = linebp) == 0)
1858: return(-1);
1859: while (*p1++ = *p2++)
1860: ;
1861: linebp = 0;
1862: return(0);
1863: }
1864:
1865: dosub()
1866: {
1867: register char *lp, *sp, *rp;
1868: int c;
1869:
1870: lp = linebuf;
1871: sp = genbuf;
1872: rp = rhsbuf;
1873: while (lp < loc1)
1874: *sp++ = *lp++;
1875: while (c = *rp++&0377) {
1876: if (c=='&') {
1877: sp = place(sp, loc1, loc2);
1878: continue;
1879: } else if (c&0200 && (c &= 0177) >='1' && c < nbra+'1') {
1880: sp = place(sp, braslist[c-'1'], braelist[c-'1']);
1881: continue;
1882: }
1883: *sp++ = c&0177;
1884: if (sp >= &genbuf[512])
1885: error(Q);
1886: }
1887: lp = loc2;
1888: loc2 = sp - genbuf + linebuf;
1889: while (*sp++ = *lp++)
1890: if (sp >= &genbuf[512])
1891: error(Q);
1892: lp = linebuf;
1893: sp = genbuf;
1894: while (*lp++ = *sp++)
1895: ;
1896: }
1897:
1898: char *
1899: place(sp, l1, l2)
1900: register char *sp, *l1, *l2;
1901: {
1902:
1903: while (l1 < l2) {
1904: *sp++ = *l1++;
1905: if (sp >= &genbuf[512])
1906: error(Q);
1907: }
1908: return(sp);
1909: }
1910:
1911: move(cflag)
1912: {
1913: register int *adt, *ad1, *ad2;
1914: int getcopy();
1915:
1916: nonzero();
1917: if ((adt = address())==0)
1918: error(Q);
1919: newline();
1920: if (cflag) {
1921: int *ozero, delta;
1922: ad1 = dol;
1923: ozero = zero;
1924: append(getcopy, ad1++);
1925: ad2 = dol;
1926: delta = zero - ozero;
1927: ad1 += delta;
1928: adt += delta;
1929: } else {
1930: ad2 = addr2;
1931: for (ad1 = addr1; ad1 <= ad2;)
1932: *ad1++ &= ~01;
1933: ad1 = addr1;
1934: }
1935: ad2++;
1936: if (adt<ad1) {
1937: dot = adt + (ad2-ad1);
1938: if ((++adt)==ad1)
1939: return;
1940: reverse(adt, ad1);
1941: reverse(ad1, ad2);
1942: reverse(adt, ad2);
1943: } else if (adt >= ad2) {
1944: dot = adt++;
1945: reverse(ad1, ad2);
1946: reverse(ad2, adt);
1947: reverse(ad1, adt);
1948: } else
1949: error(Q);
1950: fchange = 1;
1951: }
1952:
1953: reverse(a1, a2)
1954: register int *a1, *a2;
1955: {
1956: register int t;
1957:
1958: for (;;) {
1959: t = *--a2;
1960: if (a2 <= a1)
1961: return;
1962: *a2 = *a1;
1963: *a1++ = t;
1964: }
1965: }
1966:
1967: getcopy()
1968: {
1969: if (addr1 > addr2)
1970: return(-1);
1971: getline(*addr1++);
1972: return(0);
1973: }
1974:
1975: compile(aeof)
1976: {
1977: register eof, c;
1978: register char *ep;
1979: char *lastep;
1980: char bracket[5], *bracketp;
1981: int cclcnt;
1982:
1983: ep = expbuf;
1984: eof = aeof;
1985: bracketp = bracket;
1986: if ((c = getchr()) == '\n') {
1987: peekc = c;
1988: c = eof;
1989: }
1990: if (c == eof) {
1991: if (*ep==0)
1992: error(Q);
1993: return;
1994: }
1995: circfl = 0;
1996: nbra = 0;
1997: if (c=='^') {
1998: c = getchr();
1999: circfl++;
2000: }
2001: peekc = c;
2002: lastep = 0;
2003: for (;;) {
2004: if (ep >= &expbuf[256])
2005: goto cerror;
2006: c = getchr();
2007: if (c == '\n') {
2008: peekc = c;
2009: c = eof;
2010: }
2011: if (c==eof) {
2012: if (bracketp != bracket)
2013: goto cerror;
2014: *ep++ = 11;
2015: return;
2016: }
2017: if (c!='*')
2018: lastep = ep;
2019: switch (c) {
2020:
2021: case '\\':
2022: if ((c = getchr())=='(') {
2023: if (nbra >= 5)
2024: goto cerror;
2025: *bracketp++ = nbra;
2026: *ep++ = 1;
2027: *ep++ = nbra++;
2028: continue;
2029: }
2030: if (c == ')') {
2031: if (bracketp <= bracket)
2032: goto cerror;
2033: *ep++ = 12;
2034: *ep++ = *--bracketp;
2035: continue;
2036: }
2037: if (c>='1' && c<'1'+5) {
2038: *ep++ = 14;
2039: *ep++ = c-'1';
2040: continue;
2041: }
2042: *ep++ = 2;
2043: if (c=='\n')
2044: goto cerror;
2045: *ep++ = c;
2046: continue;
2047:
2048: case '.':
2049: *ep++ = 4;
2050: continue;
2051:
2052: case '\n':
2053: goto cerror;
2054:
2055: case '*':
2056: if (lastep==0 || *lastep==1 || *lastep==12)
2057: goto defchar;
2058: *lastep |= 01;
2059: continue;
2060:
2061: case '$':
2062: if ((peekc=getchr()) != eof && peekc!='\n')
2063: goto defchar;
2064: *ep++ = 10;
2065: continue;
2066:
2067: case '[':
2068: *ep++ = 6;
2069: *ep++ = 0;
2070: cclcnt = 1;
2071: if ((c=getchr()) == '^') {
2072: c = getchr();
2073: ep[-2] = 8;
2074: }
2075: do {
2076: if (c=='\n')
2077: goto cerror;
2078: if (c=='-' && ep[-1]!=0) {
2079: if ((c=getchr())==']') {
2080: *ep++ = '-';
2081: cclcnt++;
2082: break;
2083: }
2084: while (ep[-1]<c) {
2085: *ep = ep[-1]+1;
2086: ep++;
2087: cclcnt++;
2088: if (ep>=&expbuf[256])
2089: goto cerror;
2090: }
2091: }
2092: *ep++ = c;
2093: cclcnt++;
2094: if (ep >= &expbuf[256])
2095: goto cerror;
2096: } while ((c = getchr()) != ']');
2097: lastep[1] = cclcnt;
2098: continue;
2099:
2100: defchar:
2101: default:
2102: *ep++ = 2;
2103: *ep++ = c;
2104: }
2105: }
2106: cerror:
2107: expbuf[0] = 0;
2108: nbra = 0;
2109: error(Q);
2110: }
2111:
2112: execute(addr)
2113: int *addr;
2114: {
2115: register char *p1, *p2;
2116: register c;
2117:
2118: for (c=0; c<5; c++) {
2119: braslist[c] = 0;
2120: braelist[c] = 0;
2121: }
2122: if (addr == (int *)0) {
2123: if (circfl)
2124: return(0);
2125: locs = p1 = loc2;
2126: } else {
2127: if (addr==zero)
2128: return(0);
2129: p1 = getline(*addr);
2130: locs = 0;
2131: }
2132: p2 = expbuf;
2133: if (circfl) {
2134: loc1 = p1;
2135: return(advance(p1, p2));
2136: }
2137:
2138: if (*p2==2) {
2139: c = p2[1];
2140: do {
2141: if (*p1!=c)
2142: continue;
2143: if (advance(p1, p2)) {
2144: loc1 = p1;
2145: return(1);
2146: }
2147: } while (*p1++);
2148: return(0);
2149: }
2150:
2151: do {
2152: if (advance(p1, p2)) {
2153: loc1 = p1;
2154: return(1);
2155: }
2156: } while (*p1++);
2157: return(0);
2158: }
2159:
2160: advance(lp, ep)
2161: register char *ep, *lp;
2162: {
2163: register char *curlp;
2164: int i;
2165:
2166: for (;;) switch (*ep++) {
2167:
2168: case 2:
2169: if (*ep++ == *lp++)
2170: continue;
2171: return(0);
2172:
2173: case 4:
2174: if (*lp++)
2175: continue;
2176: return(0);
2177:
2178: case 10:
2179: if (*lp==0)
2180: continue;
2181: return(0);
2182:
2183: case 11:
2184: loc2 = lp;
2185: return(1);
2186:
2187: case 6:
2188: if (cclass(ep, *lp++, 1)) {
2189: ep += *ep;
2190: continue;
2191: }
2192: return(0);
2193:
2194: case 8:
2195: if (cclass(ep, *lp++, 0)) {
2196: ep += *ep;
2197: continue;
2198: }
2199: return(0);
2200:
2201: case 1:
2202: braslist[*ep++] = lp;
2203: continue;
2204:
2205: case 12:
2206: braelist[*ep++] = lp;
2207: continue;
2208:
2209: case 14:
2210: if (braelist[i = *ep++]==0)
2211: error(Q);
2212: if (backref(i, lp)) {
2213: lp += braelist[i] - braslist[i];
2214: continue;
2215: }
2216: return(0);
2217:
2218: case 14|01:
2219: if (braelist[i = *ep++] == 0)
2220: error(Q);
2221: curlp = lp;
2222: while (backref(i, lp))
2223: lp += braelist[i] - braslist[i];
2224: while (lp >= curlp) {
2225: if (advance(lp, ep))
2226: return(1);
2227: lp -= braelist[i] - braslist[i];
2228: }
2229: continue;
2230:
2231: case 4|01:
2232: curlp = lp;
2233: while (*lp++)
2234: ;
2235: goto star;
2236:
2237: case 2|01:
2238: curlp = lp;
2239: while (*lp++ == *ep)
2240: ;
2241: ep++;
2242: goto star;
2243:
2244: case 6|01:
2245: case 8|01:
2246: curlp = lp;
2247: while (cclass(ep, *lp++, ep[-1]==(6|01)))
2248: ;
2249: ep += *ep;
2250: goto star;
2251:
2252: star:
2253: do {
2254: lp--;
2255: if (lp==locs)
2256: break;
2257: if (advance(lp, ep))
2258: return(1);
2259: } while (lp > curlp);
2260: return(0);
2261:
2262: default:
2263: error(Q);
2264: }
2265: }
2266:
2267: backref(i, lp)
2268: register i;
2269: register char *lp;
2270: {
2271: register char *bp;
2272:
2273: bp = braslist[i];
2274: while (*bp++ == *lp++)
2275: if (bp >= braelist[i])
2276: return(1);
2277: return(0);
2278: }
2279:
2280: cclass(set, c, af)
2281: register char *set;
2282: register c;
2283: {
2284: register n;
2285:
2286: if (c==0)
2287: return(0);
2288: n = *set++;
2289: while (--n)
2290: if (*set++ == c)
2291: return(af);
2292: return(!af);
2293: }
2294:
2295: putd()
2296: {
2297: register r;
2298:
2299: r = count%10;
2300: count /= 10;
2301: if (count)
2302: putd();
2303: putchr(r + '0');
2304: }
2305:
2306: puts(sp)
2307: register char *sp;
2308: {
2309: col = 0;
2310: while (*sp)
2311: putchr(*sp++);
2312: putchr('\n');
2313: }
2314:
2315: char line[70];
2316: char *linp = line;
2317:
2318: putchr(ac)
2319: {
2320: register char *lp;
2321: register c;
2322:
2323: lp = linp;
2324: c = ac;
2325: if (listf) {
2326: if (c=='\n') {
2327: if (linp!=line && linp[-1]==' ') {
2328: *lp++ = '\\';
2329: *lp++ = 'n';
2330: }
2331: } else {
2332: if (col > (72-4-2)) {
2333: col = 8;
2334: *lp++ = '\\';
2335: *lp++ = '\n';
2336: *lp++ = '\t';
2337: }
2338: col++;
2339: if (c=='\b' || c=='\t' || c=='\\') {
2340: *lp++ = '\\';
2341: if (c=='\b')
2342: c = 'b';
2343: else if (c=='\t')
2344: c = 't';
2345: col++;
2346: } else if (c<' ' || c=='\177') {
2347: *lp++ = '\\';
2348: *lp++ = (c>>6) +'0';
2349: *lp++ = ((c>>3)&07)+'0';
2350: c = ( c &07)+'0';
2351: col += 3;
2352: }
2353: }
2354: }
2355: *lp++ = c;
2356: if(c == '\n' || lp >= &line[64]) {
2357: linp = line;
2358: write(oflag?2:1, line, lp-line);
2359: return;
2360: }
2361: linp = lp;
2362: }
2363: crblock(permp, buf, nchar, startn)
2364: char *permp;
2365: char *buf;
2366: long startn;
2367: {
2368: register char *p1;
2369: int n1;
2370: int n2;
2371: register char *t1, *t2, *t3;
2372:
2373: t1 = permp;
2374: t2 = &permp[256];
2375: t3 = &permp[512];
2376:
2377: n1 = startn&0377;
2378: n2 = (startn>>8)&0377;
2379: p1 = buf;
2380: while(nchar--) {
2381: *p1 = t2[(t3[(t1[(*p1+n1)&0377]+n2)&0377]-n2)&0377]-n1;
2382: n1++;
2383: if(n1==256){
2384: n1 = 0;
2385: n2++;
2386: if(n2==256) n2 = 0;
2387: }
2388: p1++;
2389: }
2390: }
2391:
2392: getkey()
2393: {
2394: struct sgttyb b;
2395: int save;
2396: int (*sig)();
2397: register char *p;
2398: register c;
2399:
2400: sig = signal(2 , (int (*)())1);
2401: if (gtty(0, &b) == -1)
2402: error("Input not tty");
2403: save = b.sg_flags;
2404: b.sg_flags &= ~010;
2405: stty(0, &b);
2406: puts("Key:");
2407: p = key;
2408: while(((c=getchr()) != -1) && (c!='\n')) {
2409: if(p < &key[9])
2410: *p++ = c;
2411: }
2412: *p = 0;
2413: b.sg_flags = save;
2414: stty(0, &b);
2415: signal(2 , sig);
2416: return(key[0] != 0);
2417: }
2418:
2419:
2420:
2421:
2422:
2423: crinit(keyp, permp)
2424: char *keyp, *permp;
2425: {
2426: register char *t1, *t2, *t3;
2427: register i;
2428: int ic, k, temp, pf[2];
2429: unsigned random;
2430: char buf[13];
2431: long seed;
2432:
2433: t1 = permp;
2434: t2 = &permp[256];
2435: t3 = &permp[512];
2436: if(*keyp == 0)
2437: return(0);
2438: strncpy(buf, keyp, 8);
2439: while (*keyp)
2440: *keyp++ = '\0';
2441: buf[8] = buf[0];
2442: buf[9] = buf[1];
2443: if (pipe(pf)<0)
2444: pf[0] = pf[1] = -1;
2445: if (fork()==0) {
2446: close(0);
2447: close(1);
2448: dup(pf[0]);
2449: dup(pf[1]);
2450: execl("/usr/lib/makekey", "-", 0);
2451: execl("/lib/makekey", "-", 0);
2452: exit(1);
2453: }
2454: write(pf[1], buf, 10);
2455: if (wait((int *)0)==-1 || read(pf[0], buf, 13)!=13)
2456: error("crypt: cannot generate key");
2457: close(pf[0]);
2458: close(pf[1]);
2459: seed = 123;
2460: for (i=0; i<13; i++)
2461: seed = seed*buf[i] + i;
2462: for(i=0;i<256;i++){
2463: t1[i] = i;
2464: t3[i] = 0;
2465: }
2466: for(i=0; i<256; i++) {
2467: seed = 5*seed + buf[i%13];
2468: random = seed % 65521;
2469: k = 256-1 - i;
2470: ic = (random&0377) % (k+1);
2471: random >>= 8;
2472: temp = t1[k];
2473: t1[k] = t1[ic];
2474: t1[ic] = temp;
2475: if(t3[k]!=0) continue;
2476: ic = (random&0377) % k;
2477: while(t3[ic]!=0) ic = (ic+1) % k;
2478: t3[k] = ic;
2479: t3[ic] = k;
2480: }
2481: for(i=0; i<256; i++)
2482: t2[t1[i]&0377] = i;
2483: return(1);
2484: }
2485:
2486: makekey(a, b)
2487: char *a, *b;
2488: {
2489: register int i;
2490: long t;
2491: char temp[9 + 1];
2492:
2493: for(i = 0; i < 9; i++)
2494: temp[i] = *a++;
2495: time(&t);
2496: t += getpid();
2497: for(i = 0; i < 4; i++)
2498: temp[i] ^= (t>>(8*i))&0377;
2499: crinit(temp, b);
2500:
2501: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.