9base-6/0000755000175000017500000000000011402154555011546 5ustar anselmanselm9base-6/mtime/0000755000175000017500000000000011402154555012661 5ustar anselmanselm9base-6/mtime/Makefile0000644000175000017500000000017311402154555014322 0ustar anselmanselm# mtime - unix port from plan9 # # Depends on ../lib9 TARG = mtime include ../std.mk pre-uninstall: post-install: 9base-6/mtime/mtime.10000644000175000017500000000064111402154555014057 0ustar anselmanselm.TH FSIZE 1 .SH NAME fsize, mtime \- print file information .SH SYNOPSIS .B fsize .I file ... .PP .B mtime .I file ... .SH DESCRIPTION .I Fsize prints the name and size of each of the files. .PP .I Mtime prints the name and modification time (in seconds since the epoch) of each of the files. .SH SOURCE .B \*9/src/cmd/fsize.c .br .B \*9/src/cmd/mtime.c .SH BUGS The output formats of the two programs are different. 9base-6/mtime/mtime.c0000644000175000017500000000070211402154555014137 0ustar anselmanselm#include #include void usage(void) { fprint(2, "usage: mtime file...\n"); exits("usage"); } void main(int argc, char **argv) { int errors, i; Dir *d; ARGBEGIN{ default: usage(); }ARGEND errors = 0; for(i=0; imtime, argv[i]); free(d); } } exits(errors ? "errors" : nil); } 9base-6/unutf/0000755000175000017500000000000011402154555012707 5ustar anselmanselm9base-6/unutf/Makefile0000644000175000017500000000017711402154555014354 0ustar anselmanselm# unutf - unutf unix port from plan9 # Depends on ../lib9 TARG = unutf include ../std.mk pre-uninstall: post-install: 9base-6/unutf/unutf.10000644000175000017500000000000011402154555014120 0ustar anselmanselm9base-6/unutf/unutf.c0000644000175000017500000000044111402154555014213 0ustar anselmanselm/* * stupid little program to pipe unicode chars through * when converting to non-utf compilers. */ #include #include #include Biobuf bin; void main(void) { int c; Binit(&bin, 0, OREAD); while((c = Bgetrune(&bin)) >= 0) print("0x%ux\n", c); exits(0); } 9base-6/ed/0000755000175000017500000000000011402154555012136 5ustar anselmanselm9base-6/ed/ed.c0000644000175000017500000005377511402154555012713 0ustar anselmanselm/* * Editor */ #include #include #include #include #undef EOF /* stdio? */ enum { FNSIZE = 128, /* file name */ LBSIZE = 4096, /* max line size */ BLKSIZE = 4096, /* block size in temp file */ NBLK = 8191, /* max size of temp file */ ESIZE = 256, /* max size of reg exp */ GBSIZE = 256, /* max size of global command */ MAXSUB = 9, /* max number of sub reg exp */ ESCFLG = 0xFFFF, /* escape Rune - user defined code */ EOF = -1 }; void (*oldhup)(int); void (*oldquit)(int); int* addr1; int* addr2; int anymarks; int col; long count; int* dol; int* dot; int fchange; char file[FNSIZE]; Rune genbuf[LBSIZE]; int given; Rune* globp; int iblock; int ichanged; int io; Biobuf iobuf; int lastc; char line[70]; Rune* linebp; Rune linebuf[LBSIZE]; int listf; int listn; Rune* loc1; Rune* loc2; int names[26]; int nleft; int oblock; int oflag; Reprog *pattern; int peekc; int pflag; int rescuing; Rune rhsbuf[LBSIZE/sizeof(Rune)]; char savedfile[FNSIZE]; jmp_buf savej; int subnewa; int subolda; Resub subexp[MAXSUB]; char* tfname; int tline; int waiting; int wrapp; int* zero; char Q[] = ""; char T[] = "TMP"; char WRERR[] = "WRITE ERROR"; int bpagesize = 20; char hex[] = "0123456789abcdef"; char* linp = line; ulong nlall = 128; int tfile = -1; int vflag = 1; void add(int); int* address(void); int append(int(*)(void), int*); void browse(void); void callunix(void); void commands(void); void compile(int); int compsub(void); void dosub(void); void error(char*); int match(int*); void exfile(int); void filename(int); Rune* getblock(int, int); int getchr(void); int getcopy(void); int getfile(void); Rune* getline(int); int getnum(void); int getsub(void); int gettty(void); void global(int); void init(void); void join(void); void move(int); void newline(void); void nonzero(void); void notifyf(void*, char*); Rune* place(Rune*, Rune*, Rune*); void printcom(void); void putchr(int); void putd(void); void putfile(void); int putline(void); void putshst(Rune*); void putst(char*); void quit(void); void rdelete(int*, int*); void regerror(char *); void reverse(int*, int*); void setnoaddr(void); void setwide(void); void squeeze(int); void substitute(int); char* _mktemp(char *as); Rune La[] = { 'a', 0 }; Rune Lr[] = { 'r', 0 }; char tmp[] = "/var/tmp/eXXXXX"; void main(int argc, char *argv[]) { char *p1, *p2; notify(notifyf); ARGBEGIN { case 'o': oflag = 1; vflag = 0; break; } ARGEND USED(argc); if(*argv && (strcmp(*argv, "-") == 0)) { argv++; vflag = 0; } if(oflag) { p1 = "/dev/stdout"; p2 = savedfile; while(*p2++ = *p1++) ; globp = La; } else if(*argv) { p1 = *argv; p2 = savedfile; while(*p2++ = *p1++) if(p2 >= &savedfile[sizeof(savedfile)]) p2--; globp = Lr; } zero = malloc((nlall+5)*sizeof(int*)); tfname = _mktemp(tmp); init(); setjmp(savej); commands(); quit(); } void commands(void) { int *a1, c, temp; char lastsep; Dir *d; for(;;) { if(pflag) { pflag = 0; addr1 = addr2 = dot; printcom(); } c = '\n'; for(addr1 = 0;;) { lastsep = c; a1 = address(); c = getchr(); if(c != ',' && c != ';') break; if(lastsep == ',') error(Q); if(a1 == 0) { a1 = zero+1; if(a1 > dol) a1--; } addr1 = a1; if(c == ';') dot = a1; } if(lastsep != '\n' && a1 == 0) a1 = dol; if((addr2=a1) == 0) { given = 0; addr2 = dot; } else given = 1; if(addr1 == 0) addr1 = addr2; switch(c) { case 'a': add(0); continue; case 'b': nonzero(); browse(); continue; case 'c': nonzero(); newline(); rdelete(addr1, addr2); append(gettty, addr1-1); continue; case 'd': nonzero(); newline(); rdelete(addr1, addr2); continue; case 'E': fchange = 0; c = 'e'; case 'e': setnoaddr(); if(vflag && fchange) { fchange = 0; error(Q); } filename(c); init(); addr2 = zero; goto caseread; case 'f': setnoaddr(); filename(c); putst(savedfile); continue; case 'g': global(1); continue; case 'i': add(-1); continue; case 'j': if(!given) addr2++; newline(); join(); continue; case 'k': nonzero(); c = getchr(); if(c < 'a' || c > 'z') error(Q); newline(); names[c-'a'] = *addr2 & ~01; anymarks |= 01; continue; case 'm': move(0); continue; case 'n': listn++; newline(); printcom(); continue; case '\n': if(a1==0) { a1 = dot+1; addr2 = a1; addr1 = a1; } if(lastsep==';') addr1 = a1; printcom(); continue; case 'l': listf++; case 'p': case 'P': newline(); printcom(); continue; case 'Q': fchange = 0; case 'q': setnoaddr(); newline(); quit(); case 'r': filename(c); caseread: if((io=open(file, OREAD)) < 0) { lastc = '\n'; error(file); } if((d = dirfstat(io)) != nil){ if(d->mode & DMAPPEND) print("warning: %s is append only\n", file); free(d); } Binit(&iobuf, io, OREAD); setwide(); squeeze(0); c = zero != dol; append(getfile, addr2); exfile(OREAD); fchange = c; continue; case 's': nonzero(); substitute(globp != 0); continue; case 't': move(1); continue; case 'u': nonzero(); newline(); if((*addr2&~01) != subnewa) error(Q); *addr2 = subolda; dot = addr2; continue; case 'v': global(0); continue; case 'W': wrapp++; case 'w': setwide(); squeeze(dol>zero); temp = getchr(); if(temp != 'q' && temp != 'Q') { peekc = temp; temp = 0; } filename(c); if(!wrapp || ((io = open(file, OWRITE)) == -1) || ((seek(io, 0L, 2)) == -1)) if((io = create(file, OWRITE, 0666)) < 0) error(file); Binit(&iobuf, io, OWRITE); wrapp = 0; if(dol > zero) putfile(); exfile(OWRITE); if(addr1<=zero+1 && addr2==dol) fchange = 0; if(temp == 'Q') fchange = 0; if(temp) quit(); continue; case '=': setwide(); squeeze(0); newline(); count = addr2 - zero; putd(); putchr('\n'); continue; case '!': callunix(); continue; case EOF: return; } error(Q); } } void printcom(void) { int *a1; nonzero(); a1 = addr1; do { if(listn) { count = a1-zero; putd(); putchr('\t'); } putshst(getline(*a1++)); } while(a1 <= addr2); dot = addr2; listf = 0; listn = 0; pflag = 0; } int* address(void) { int sign, *a, opcnt, nextopand, *b, c; nextopand = -1; sign = 1; opcnt = 0; a = dot; do { do { c = getchr(); } while(c == ' ' || c == '\t'); if(c >= '0' && c <= '9') { peekc = c; if(!opcnt) a = zero; a += sign*getnum(); } else switch(c) { case '$': a = dol; case '.': if(opcnt) error(Q); break; case '\'': c = getchr(); if(opcnt || c < 'a' || c > 'z') error(Q); a = zero; do { a++; } while(a <= dol && names[c-'a'] != (*a & ~01)); break; case '?': sign = -sign; case '/': compile(c); b = a; for(;;) { a += sign; if(a <= zero) a = dol; if(a > dol) a = zero; if(match(a)) break; if(a == b) error(Q); } break; default: if(nextopand == opcnt) { a += sign; if(a < zero || dol < a) continue; /* error(Q); */ } if(c != '+' && c != '-' && c != '^') { peekc = c; if(opcnt == 0) a = 0; return a; } sign = 1; if(c != '+') sign = -sign; nextopand = ++opcnt; continue; } sign = 1; opcnt++; } while(zero <= a && a <= dol); error(Q); return 0; } int getnum(void) { int r, c; r = 0; for(;;) { c = getchr(); if(c < '0' || c > '9') break; r = r*10 + (c-'0'); } peekc = c; return r; } void setwide(void) { if(!given) { addr1 = zero + (dol>zero); addr2 = dol; } } void setnoaddr(void) { if(given) error(Q); } void nonzero(void) { squeeze(1); } void squeeze(int i) { if(addr1 < zero+i || addr2 > dol || addr1 > addr2) error(Q); } void newline(void) { int c; c = getchr(); if(c == '\n' || c == EOF) return; if(c == 'p' || c == 'l' || c == 'n') { pflag++; if(c == 'l') listf++; else if(c == 'n') listn++; c = getchr(); if(c == '\n') return; } error(Q); } void filename(int comm) { char *p1, *p2; Rune rune; int c; count = 0; c = getchr(); if(c == '\n' || c == EOF) { p1 = savedfile; if(*p1 == 0 && comm != 'f') error(Q); p2 = file; while(*p2++ = *p1++) ; return; } if(c != ' ') error(Q); while((c=getchr()) == ' ') ; if(c == '\n') error(Q); p1 = file; do { if(p1 >= &file[sizeof(file)-6] || c == ' ' || c == EOF) error(Q); rune = c; p1 += runetochar(p1, &rune); } while((c=getchr()) != '\n'); *p1 = 0; if(savedfile[0] == 0 || comm == 'e' || comm == 'f') { p1 = savedfile; p2 = file; while(*p1++ = *p2++) ; } } void exfile(int om) { if(om == OWRITE) if(Bflush(&iobuf) < 0) error(Q); close(io); io = -1; if(vflag) { putd(); putchr('\n'); } } void error1(char *s) { int c; wrapp = 0; listf = 0; listn = 0; count = 0; seek(0, 0, 2); pflag = 0; if(globp) lastc = '\n'; globp = 0; peekc = lastc; if(lastc) for(;;) { c = getchr(); if(c == '\n' || c == EOF) break; } if(io > 0) { close(io); io = -1; } putchr('?'); putst(s); } void error(char *s) { error1(s); longjmp(savej, 1); } void rescue(void) { rescuing = 1; if(dol > zero) { addr1 = zero+1; addr2 = dol; io = create("ed.hup", OWRITE, 0666); if(io > 0){ Binit(&iobuf, io, OWRITE); putfile(); } } fchange = 0; quit(); } void notifyf(void *a, char *s) { if(strcmp(s, "interrupt") == 0){ if(rescuing || waiting) noted(NCONT); putchr('\n'); lastc = '\n'; error1(Q); notejmp(a, savej, 0); } if(strcmp(s, "hangup") == 0 || strcmp(s, "kill") == 0){ if(rescuing) noted(NDFLT); rescue(); } if(strstr(s, "child")) noted(NCONT); fprint(2, "ed: note: %s\n", s); abort(); } int getchr(void) { char s[UTFmax]; int i; Rune r; if(lastc = peekc) { peekc = 0; return lastc; } if(globp) { if((lastc=*globp++) != 0) return lastc; globp = 0; return EOF; } for(i=0;;) { if(read(0, s+i, 1) <= 0) return lastc = EOF; i++; if(fullrune(s, i)) break; } chartorune(&r, s); lastc = r; return lastc; } int gety(void) { int c; Rune *gf, *p; p = linebuf; gf = globp; for(;;) { c = getchr(); if(c == '\n') { *p = 0; return 0; } if(c == EOF) { if(gf) peekc = c; return c; } if(c == 0) continue; *p++ = c; if(p >= &linebuf[LBSIZE-2]) error(Q); } } int gettty(void) { int rc; rc = gety(); if(rc) return rc; if(linebuf[0] == '.' && linebuf[1] == 0) return EOF; return 0; } int getfile(void) { int c; Rune *lp; lp = linebuf; do { c = Bgetrune(&iobuf); if(c < 0) { if(lp > linebuf) { putst("'\\n' appended"); c = '\n'; } else return EOF; } if(lp >= &linebuf[LBSIZE]) { lastc = '\n'; error(Q); } *lp++ = c; count++; } while(c != '\n'); lp[-1] = 0; return 0; } void putfile(void) { int *a1; Rune *lp; long c; a1 = addr1; do { lp = getline(*a1++); for(;;) { count++; c = *lp++; if(c == 0) { if(Bputrune(&iobuf, '\n') < 0) error(Q); break; } if(Bputrune(&iobuf, c) < 0) error(Q); } } while(a1 <= addr2); if(Bflush(&iobuf) < 0) error(Q); } int append(int (*f)(void), int *a) { int *a1, *a2, *rdot, nline, d; nline = 0; dot = a; while((*f)() == 0) { if((dol-zero) >= nlall) { nlall += 512; a1 = realloc(zero, (nlall+50)*sizeof(int*)); if(a1 == 0) { error("MEM?"); rescue(); } /* relocate pointers; avoid wraparound if sizeof(int) < sizeof(int*) */ d = addr1 - zero; addr1 = a1 + d; d = addr2 - zero; addr2 = a1 + d; d = dol - zero; dol = a1 + d; d = dot - zero; dot = a1 + d; zero = a1; } d = putline(); nline++; a1 = ++dol; a2 = a1+1; rdot = ++dot; while(a1 > rdot) *--a2 = *--a1; *rdot = d; } return nline; } void add(int i) { if(i && (given || dol > zero)) { addr1--; addr2--; } squeeze(0); newline(); append(gettty, addr2); } void browse(void) { int forward, n; static int bformat, bnum; /* 0 */ forward = 1; peekc = getchr(); if(peekc != '\n'){ if(peekc == '-' || peekc == '+') { if(peekc == '-') forward = 0; getchr(); } n = getnum(); if(n > 0) bpagesize = n; } newline(); if(pflag) { bformat = listf; bnum = listn; } else { listf = bformat; listn = bnum; } if(forward) { addr1 = addr2; addr2 += bpagesize; if(addr2 > dol) addr2 = dol; } else { addr1 = addr2-bpagesize; if(addr1 <= zero) addr1 = zero+1; } printcom(); } void callunix(void) { int c, pid; Rune rune; char buf[512]; char *p; setnoaddr(); p = buf; while((c=getchr()) != EOF && c != '\n') if(p < &buf[sizeof(buf) - 6]) { rune = c; p += runetochar(p, &rune); } *p = 0; pid = fork(); if(pid == 0) { execlp("rc", "rc", "-c", buf, (char*)0); sysfatal("exec failed: %r"); exits("execl failed"); } waiting = 1; while(waitpid() != pid) ; waiting = 0; if(vflag) putst("!"); } void quit(void) { if(vflag && fchange && dol!=zero) { fchange = 0; error(Q); } remove(tfname); exits(0); } void onquit(int sig) { USED(sig); quit(); } void rdelete(int *ad1, int *ad2) { int *a1, *a2, *a3; a1 = ad1; a2 = ad2+1; a3 = dol; dol -= a2 - a1; do { *a1++ = *a2++; } while(a2 <= a3); a1 = ad1; if(a1 > dol) a1 = dol; dot = a1; fchange = 1; } void gdelete(void) { int *a1, *a2, *a3; a3 = dol; for(a1=zero; (*a1&01)==0; a1++) if(a1>=a3) return; for(a2=a1+1; a2<=a3;) { if(*a2 & 01) { a2++; dot = a1; } else *a1++ = *a2++; } dol = a1-1; if(dot > dol) dot = dol; fchange = 1; } Rune* getline(int tl) { Rune *lp, *bp; int nl; lp = linebuf; bp = getblock(tl, OREAD); nl = nleft; tl &= ~((BLKSIZE/sizeof(Rune)) - 1); while(*lp++ = *bp++) { nl -= sizeof(Rune); if(nl == 0) { bp = getblock(tl += BLKSIZE/sizeof(Rune), OREAD); nl = nleft; } } return linebuf; } int putline(void) { Rune *lp, *bp; int nl, tl; fchange = 1; lp = linebuf; tl = tline; bp = getblock(tl, OWRITE); nl = nleft; tl &= ~((BLKSIZE/sizeof(Rune))-1); while(*bp = *lp++) { if(*bp++ == '\n') { bp[-1] = 0; linebp = lp; break; } nl -= sizeof(Rune); if(nl == 0) { tl += BLKSIZE/sizeof(Rune); bp = getblock(tl, OWRITE); nl = nleft; } } nl = tline; tline += ((lp-linebuf) + 03) & 077776; return nl; } void blkio(int b, uchar *buf, int isread) { int n; seek(tfile, b*BLKSIZE, 0); if(isread) n = read(tfile, buf, BLKSIZE); else n = write(tfile, buf, BLKSIZE); if(n != BLKSIZE) error(T); } Rune* getblock(int atl, int iof) { int bno, off; static uchar ibuff[BLKSIZE]; static uchar obuff[BLKSIZE]; bno = atl / (BLKSIZE/sizeof(Rune)); off = (atl*sizeof(Rune)) & (BLKSIZE-1) & ~03; if(bno >= NBLK) { lastc = '\n'; error(T); } nleft = BLKSIZE - off; if(bno == iblock) { ichanged |= iof; return (Rune*)(ibuff+off); } if(bno == oblock) return (Rune*)(obuff+off); if(iof == OREAD) { if(ichanged) blkio(iblock, ibuff, 0); ichanged = 0; iblock = bno; blkio(bno, ibuff, 1); return (Rune*)(ibuff+off); } if(oblock >= 0) blkio(oblock, obuff, 0); oblock = bno; return (Rune*)(obuff+off); } void init(void) { int *markp; close(tfile); tline = 2; for(markp = names; markp < &names[26]; ) *markp++ = 0; subnewa = 0; anymarks = 0; iblock = -1; oblock = -1; ichanged = 0; if((tfile = create(tfname, ORDWR, 0600)) < 0){ error1(T); exits(0); } dot = dol = zero; } void global(int k) { Rune *gp, globuf[GBSIZE]; int c, *a1; if(globp) error(Q); setwide(); squeeze(dol > zero); c = getchr(); if(c == '\n') error(Q); compile(c); gp = globuf; while((c=getchr()) != '\n') { if(c == EOF) error(Q); if(c == '\\') { c = getchr(); if(c != '\n') *gp++ = '\\'; } *gp++ = c; if(gp >= &globuf[GBSIZE-2]) error(Q); } if(gp == globuf) *gp++ = 'p'; *gp++ = '\n'; *gp = 0; for(a1=zero; a1<=dol; a1++) { *a1 &= ~01; if(a1 >= addr1 && a1 <= addr2 && match(a1) == k) *a1 |= 01; } /* * Special case: g/.../d (avoid n^2 algorithm) */ if(globuf[0] == 'd' && globuf[1] == '\n' && globuf[2] == 0) { gdelete(); return; } for(a1=zero; a1<=dol; a1++) { if(*a1 & 01) { *a1 &= ~01; dot = a1; globp = globuf; commands(); a1 = zero; } } } void join(void) { Rune *gp, *lp; int *a1; nonzero(); gp = genbuf; for(a1=addr1; a1<=addr2; a1++) { lp = getline(*a1); while(*gp = *lp++) if(gp++ >= &genbuf[LBSIZE-2]) error(Q); } lp = linebuf; gp = genbuf; while(*lp++ = *gp++) ; *addr1 = putline(); if(addr1 < addr2) rdelete(addr1+1, addr2); dot = addr1; } void substitute(int inglob) { int *mp, *a1, nl, gsubf, n; n = getnum(); /* OK even if n==0 */ gsubf = compsub(); for(a1 = addr1; a1 <= addr2; a1++) { if(match(a1)){ int *ozero; int m = n; do { int span = loc2-loc1; if(--m <= 0) { dosub(); if(!gsubf) break; if(span == 0) { /* null RE match */ if(*loc2 == 0) break; loc2++; } } } while(match(0)); if(m <= 0) { inglob |= 01; subnewa = putline(); *a1 &= ~01; if(anymarks) { for(mp=names; mp<&names[26]; mp++) if(*mp == *a1) *mp = subnewa; } subolda = *a1; *a1 = subnewa; ozero = zero; nl = append(getsub, a1); addr2 += nl; nl += zero-ozero; a1 += nl; } } } if(inglob == 0) error(Q); } int compsub(void) { int seof, c; Rune *p; seof = getchr(); if(seof == '\n' || seof == ' ') error(Q); compile(seof); p = rhsbuf; for(;;) { c = getchr(); if(c == '\\') { c = getchr(); *p++ = ESCFLG; if(p >= &rhsbuf[LBSIZE/sizeof(Rune)]) error(Q); } else if(c == '\n' && (!globp || !globp[0])) { peekc = c; pflag++; break; } else if(c == seof) break; *p++ = c; if(p >= &rhsbuf[LBSIZE/sizeof(Rune)]) error(Q); } *p = 0; peekc = getchr(); if(peekc == 'g') { peekc = 0; newline(); return 1; } newline(); return 0; } int getsub(void) { Rune *p1, *p2; p1 = linebuf; if((p2 = linebp) == 0) return EOF; while(*p1++ = *p2++) ; linebp = 0; return 0; } void dosub(void) { Rune *lp, *sp, *rp; int c, n; lp = linebuf; sp = genbuf; rp = rhsbuf; while(lp < loc1) *sp++ = *lp++; while(c = *rp++) { if(c == '&'){ sp = place(sp, loc1, loc2); continue; } if(c == ESCFLG && (c = *rp++) >= '1' && c < MAXSUB+'0') { n = c-'0'; if(subexp[n].s.rsp && subexp[n].e.rep) { sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep); continue; } error(Q); } *sp++ = c; if(sp >= &genbuf[LBSIZE]) error(Q); } lp = loc2; loc2 = sp - genbuf + linebuf; while(*sp++ = *lp++) if(sp >= &genbuf[LBSIZE]) error(Q); lp = linebuf; sp = genbuf; while(*lp++ = *sp++) ; } Rune* place(Rune *sp, Rune *l1, Rune *l2) { while(l1 < l2) { *sp++ = *l1++; if(sp >= &genbuf[LBSIZE]) error(Q); } return sp; } void move(int cflag) { int *adt, *ad1, *ad2; nonzero(); if((adt = address())==0) /* address() guarantees addr is in range */ error(Q); newline(); if(cflag) { int *ozero, delta; ad1 = dol; ozero = zero; append(getcopy, ad1++); ad2 = dol; delta = zero - ozero; ad1 += delta; adt += delta; } else { ad2 = addr2; for(ad1 = addr1; ad1 <= ad2;) *ad1++ &= ~01; ad1 = addr1; } ad2++; if(adt= ad2) { dot = adt++; reverse(ad1, ad2); reverse(ad2, adt); reverse(ad1, adt); } else error(Q); fchange = 1; } void reverse(int *a1, int *a2) { int t; for(;;) { t = *--a2; if(a2 <= a1) return; *a2 = *a1; *a1++ = t; } } int getcopy(void) { if(addr1 > addr2) return EOF; getline(*addr1++); return 0; } void compile(int eof) { Rune c; char *ep; char expbuf[ESIZE]; if((c = getchr()) == '\n') { peekc = c; c = eof; } if(c == eof) { if(!pattern) error(Q); return; } if(pattern) { free(pattern); pattern = 0; } ep = expbuf; do { if(c == '\\') { if(ep >= expbuf+sizeof(expbuf)) { error(Q); return; } ep += runetochar(ep, &c); if((c = getchr()) == '\n') { error(Q); return; } } if(ep >= expbuf+sizeof(expbuf)) { error(Q); return; } ep += runetochar(ep, &c); } while((c = getchr()) != eof && c != '\n'); if(c == '\n') peekc = c; *ep = 0; pattern = regcomp(expbuf); } int match(int *addr) { if(!pattern) return 0; if(addr){ if(addr == zero) return 0; subexp[0].s.rsp = getline(*addr); } else subexp[0].s.rsp = loc2; subexp[0].e.rep = 0; if(rregexec(pattern, linebuf, subexp, MAXSUB)) { loc1 = subexp[0].s.rsp; loc2 = subexp[0].e.rep; return 1; } loc1 = loc2 = 0; return 0; } void putd(void) { int r; r = count%10; count /= 10; if(count) putd(); putchr(r + '0'); } void putst(char *sp) { Rune r; col = 0; for(;;) { sp += chartorune(&r, sp); if(r == 0) break; putchr(r); } putchr('\n'); } void putshst(Rune *sp) { col = 0; while(*sp) putchr(*sp++); putchr('\n'); } void putchr(int ac) { char *lp; int c; Rune rune; lp = linp; c = ac; if(listf) { if(c == '\n') { if(linp != line && linp[-1] == ' ') { *lp++ = '\\'; *lp++ = 'n'; } } else { if(col > (72-6-2)) { col = 8; *lp++ = '\\'; *lp++ = '\n'; *lp++ = '\t'; } col++; if(c=='\b' || c=='\t' || c=='\\') { *lp++ = '\\'; if(c == '\b') c = 'b'; else if(c == '\t') c = 't'; col++; } else if(c<' ' || c>='\177') { *lp++ = '\\'; *lp++ = 'x'; *lp++ = hex[c>>12]; *lp++ = hex[c>>8&0xF]; *lp++ = hex[c>>4&0xF]; c = hex[c&0xF]; col += 5; } } } rune = c; lp += runetochar(lp, &rune); if(c == '\n' || lp >= &line[sizeof(line)-5]) { linp = line; write(oflag? 2: 1, line, lp-line); return; } linp = lp; } char* _mktemp(char *as) { char *s; unsigned pid; int i; pid = getpid(); s = as; while(*s++) ; s--; while(*--s == 'X') { *s = pid % 10 + '0'; pid /= 10; } s++; i = 'a'; while(access(as, 0) != -1) { if(i == 'z') return "/"; *s = i++; } return as; } void regerror(char *s) { USED(s); error(Q); } 9base-6/ed/ed.10000644000175000017500000003314111402154555012612 0ustar anselmanselm.TH ED 1 .SH NAME ed \- text editor .SH SYNOPSIS .B ed [ .B - ] [ .B -o ] [ .I file ] .SH DESCRIPTION .I Ed is a venerable text editor. .PP If a .I file argument is given, .I ed simulates an .L e command (see below) on that file: it is read into .I ed's buffer so that it can be edited. The options are .TP .B - Suppress the printing of character counts by .LR e , .LR r , and .L w commands and of the confirming .L ! by .L ! commands. .TP .B -o (for output piping) Write all output to the standard error file except writing by .L w commands. If no .I file is given, make .B /dev/stdout the remembered file; see the .L e command below. .PP .I Ed operates on a `buffer', a copy of the file it is editing; changes made in the buffer have no effect on the file until a .L w (write) command is given. The copy of the text being edited resides in a temporary file called the .IR buffer . .PP Commands to .I ed have a simple and regular structure: zero, one, or two .I addresses followed by a single character .IR command , possibly followed by parameters to the command. These addresses specify one or more lines in the buffer. Missing addresses are supplied by default. .PP In general, only one command may appear on a line. Certain commands allow the addition of text to the buffer. While .I ed is accepting text, it is said to be in .I "input mode." In this mode, no commands are recognized; all input is merely collected. Input mode is left by typing a period .L . alone at the beginning of a line. .PP .I Ed supports the .I "regular expression" notation described in .IR regexp (7). Regular expressions are used in addresses to specify lines and in one command (see .I s below) to specify a portion of a line which is to be replaced. If it is desired to use one of the regular expression metacharacters as an ordinary character, that character may be preceded by .RB ` \e '. This also applies to the character bounding the regular expression (often .LR / ) and to .L \e itself. .PP To understand addressing in .I ed it is necessary to know that at any time there is a .I "current line." Generally, the current line is the last line affected by a command; however, the exact effect on the current line is discussed under the description of each command. Addresses are constructed as follows. .TP 1. The character .LR . , customarily called `dot', addresses the current line. .TP 2. The character .L $ addresses the last line of the buffer. .TP 3. A decimal number .I n addresses the .IR n -th line of the buffer. .TP 4. .BI \'x addresses the line marked with the name .IR x , which must be a lower-case letter. Lines are marked with the .L k command. .TP 5. A regular expression enclosed in slashes ( .LR / ) addresses the line found by searching forward from the current line and stopping at the first line containing a string that matches the regular expression. If necessary the search wraps around to the beginning of the buffer. .TP 6. A regular expression enclosed in queries .L ? addresses the line found by searching backward from the current line and stopping at the first line containing a string that matches the regular expression. If necessary the search wraps around to the end of the buffer. .TP 7. An address followed by a plus sign .L + or a minus sign .L - followed by a decimal number specifies that address plus (resp. minus) the indicated number of lines. The plus sign may be omitted. .TP 8. An address followed by .L + (or .LR - ) followed by a regular expression enclosed in slashes specifies the first matching line following (or preceding) that address. The search wraps around if necessary. The .L + may be omitted, so .L 0/x/ addresses the .I first line in the buffer with an .LR x . Enclosing the regular expression in .L ? reverses the search direction. .TP 9. If an address begins with .L + or .L - the addition or subtraction is taken with respect to the current line; e.g.\& .L -5 is understood to mean .LR .-5 . .TP 10. If an address ends with .L + or .LR - , then 1 is added (resp. subtracted). As a consequence of this rule and rule 9, the address .L - refers to the line before the current line. Moreover, trailing .L + and .L - characters have cumulative effect, so .L -- refers to the current line less 2. .TP 11. To maintain compatibility with earlier versions of the editor, the character .L ^ in addresses is equivalent to .LR - . .PP Commands may require zero, one, or two addresses. Commands which require no addresses regard the presence of an address as an error. Commands which accept one or two addresses assume default addresses when insufficient are given. If more addresses are given than a command requires, the last one or two (depending on what is accepted) are used. .PP Addresses are separated from each other typically by a comma .LR , . They may also be separated by a semicolon .LR ; . In this case the current line is set to the previous address before the next address is interpreted. If no address precedes a comma or semicolon, line 1 is assumed; if no address follows, the last line of the buffer is assumed. The second address of any two-address sequence must correspond to a line following the line corresponding to the first address. .PP In the following list of .I ed commands, the default addresses are shown in parentheses. The parentheses are not part of the address, but are used to show that the given addresses are the default. `Dot' means the current line. .TP .RB (\|\fL.\fP\|) \|a .br .ns .TP .br .ns .TP .B . Read the given text and append it after the addressed line. Dot is left on the last line input, if there were any, otherwise at the addressed line. Address .L 0 is legal for this command; text is placed at the beginning of the buffer. .TP .RB (\|\fL.,.\fP\|) \|b [ +- ][\fIpagesize\fP][ pln\fR] Browse. Print a `page', normally 20 lines. The optional .L + (default) or .L - specifies whether the next or previous page is to be printed. The optional .I pagesize is the number of lines in a page. The optional .LR p , .LR n , or .L l causes printing in the specified format, initially .LR p . Pagesize and format are remembered between .L b commands. Dot is left at the last line displayed. .TP .RB (\|\fL.,.\fP\|) \|c .br .ns .TP .br .ns .TP .B . Change. Delete the addressed lines, then accept input text to replace these lines. Dot is left at the last line input; if there were none, it is left at the line preceding the deleted lines. .TP .RB (\|\fL.,.\fP\|) \|d Delete the addressed lines from the buffer. Dot is set to the line following the last line deleted, or to the last line of the buffer if the deleted lines had no successor. .TP .BI e " filename" Edit. Delete the entire contents of the buffer; then read the named file into the buffer. Dot is set to the last line of the buffer. The number of characters read is typed. The file name is remembered for possible use in later .LR e , .LR r , or .L w commands. If .I filename is missing, the remembered name is used. .TP .BI E " filename" Unconditional .LR e ; see .RL ` q ' below. .TP .BI f " filename" Print the currently remembered file name. If .I filename is given, the currently remembered file name is first changed to .IR filename . .TP .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP/\fIcommand\ list\fP .PD 0 .TP .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP/ .TP .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP .PD Global. First mark every line which matches the given .IR regular expression . Then for every such line, execute the .I command list with dot initially set to that line. A single command or the first of multiple commands appears on the same line with the global command. All lines of a multi-line list except the last line must end with .LR \e . The .RB \&` \&. \&' terminating input mode for an .LR a , .LR i , .L c command may be omitted if it would be on the last line of the command list. The commands .L g and .L v are not permitted in the command list. Any character other than space or newline may be used instead of .L / to delimit the regular expression. The second and third forms mean .BI g/ regular\ expression /p \f1. .TP .RB (\| .\| ) \|i .PD 0 .TP .TP .B . Insert the given text before the addressed line. Dot is left at the last line input, or, if there were none, at the line before the addressed line. This command differs from the .I a command only in the placement of the text. .PD .TP .RB (\| .,.+1 \|) \|j Join the addressed lines into a single line; intermediate newlines are deleted. Dot is left at the resulting line. .TP .RB (\|\fL.\fP\|) \|k\fIx\fP Mark the addressed line with name .IR x , which must be a lower-case letter. The address form .BI \' x then addresses this line. .ne 2.5 .TP .RB (\|\fL.,.\fP\|) \|l List. Print the addressed lines in an unambiguous way: a tab is printed as .LR \et , a backspace as .LR \eb , backslashes as .LR \e\e , and non-printing characters as a backslash, an .LR x , and four hexadecimal digits. Long lines are folded, with the second and subsequent sub-lines indented one tab stop. If the last character in the line is a blank, it is followed by .LR \en . An .L l may be appended, like .LR p , to any non-I/O command. .TP .RB (\|\fL.,.\fP\|) \|m\fIa Move. Reposition the addressed lines after the line addressed by .IR a . Dot is left at the last moved line. .TP .RB (\|\fL.,.\fP\|) \|n Number. Perform .LR p , prefixing each line with its line number and a tab. An .L n may be appended, like .LR p , to any non-I/O command. .TP .RB (\|\fL.,.\fP\|) \|p Print the addressed lines. Dot is left at the last line printed. A .L p appended to any non-I/O command causes the then current line to be printed after the command is executed. .TP .RB (\|\fL.,.\fP\|) \|P This command is a synonym for .LR p . .TP .B q Quit the editor. No automatic write of a file is done. A .L q or .L e command is considered to be in error if the buffer has been modified since the last .LR w , .LR q , or .L e command. .TP .B Q Quit unconditionally. .TP .RB ( $ )\|r\ \fIfilename\fP Read in the given file after the addressed line. If no .I filename is given, the remembered file name is used. The file name is remembered if there were no remembered file name already. If the read is successful, the number of characters read is printed. Dot is left at the last line read from the file. .TP .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP/ .PD 0 .TP .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP/g .TP .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP .PD Substitute. Search each addressed line for an occurrence of the specified regular expression. On each line in which .I n matches are found .RI ( n defaults to 1 if missing), the .IR n th matched string is replaced by the replacement specified. If the global replacement indicator .L g appears after the command, all subsequent matches on the line are also replaced. It is an error for the substitution to fail on all addressed lines. Any character other than space or newline may be used instead of .L / to delimit the regular expression and the replacement. Dot is left at the last line substituted. The third form means .BI s n / regular\ expression / replacement\fP/p\f1. The second .L / may be omitted if the replacement is empty. .IP An ampersand .L & appearing in the replacement is replaced by the string matching the regular expression. The characters .BI \e n\f1, where .I n is a digit, are replaced by the text matched by the .IR n -th regular subexpression enclosed between .L ( and .LR ) . When nested parenthesized subexpressions are present, .I n is determined by counting occurrences of .L ( starting from the left. .IP A literal .LR & , .LR / , .L \e or newline may be included in a replacement by prefixing it with .LR \e . .TP .RB (\|\fL.,.\fP\|) \|t\|\fIa Transfer. Copy the addressed lines after the line addressed by .IR a . Dot is left at the last line of the copy. .TP .RB (\|\fL.,.\fP\|) \|u Undo. Restore the preceding contents of the first addressed line (sic), which must be the last line in which a substitution was made (double sic). .TP .RB (\|\fL1,$\fP\|) \|v/\fIregular\ expression\fP/\fIcommand\ list\fP This command is the same as the global command .L g except that the command list is executed with dot initially set to every line .I except those matching the regular expression. .TP .RB (\|\fL1,$\fP\|) \|w " \fIfilename\fP" Write the addressed lines to the given file. If the file does not exist, it is created with mode 666 (readable and writable by everyone). If no .I filename is given, the remembered file name, if any, is used. The file name is remembered if there were no remembered file name already. Dot is unchanged. If the write is successful, the number of characters written is printed. .TP .RB (\|\fL1,$\fP\|) \|W " \fIfilename\fP" Perform .LR w , but append to, instead of overwriting, any existing file contents. .TP .RB ( $ ) \|= Print the line number of the addressed line. Dot is unchanged. .TP .BI ! shell\ command Send the remainder of the line after the .L ! to .IR rc (1) to be interpreted as a command. Dot is unchanged. .TP .RB (\| .+1 )\| An address without a command is taken as a .L p command. A terminal .L / may be omitted from the address. A blank line alone is equivalent to .LR .+1p ; it is useful for stepping through text. .PP If an interrupt signal .SM (DEL) is sent, .I ed prints a .L ? and returns to its command level. .PP When reading a file, .I ed discards .SM NUL characters and all characters after the last newline. .SH FILES .B /tmp/e* .br .B ed.hup \ \ work is saved here if terminal hangs up .SH SOURCE .B \*9/src/cmd/ed.c .SH "SEE ALSO" .IR sam (1), .IR sed (1), .IR regexp (7) .SH DIAGNOSTICS .BI ? name for inaccessible file; .L ?TMP for temporary file overflow; .L ? for errors in commands or other overflows. 9base-6/ed/Makefile0000644000175000017500000000016611402154555013601 0ustar anselmanselm# ed - ed unix port from plan9 # Depends on ../lib9 TARG = ed include ../std.mk pre-uninstall: post-install: 9base-6/cmp/0000755000175000017500000000000011402154555012325 5ustar anselmanselm9base-6/cmp/cmp.c0000644000175000017500000000406211402154555013252 0ustar anselmanselm#include #include #define BUF 65536 int sflag = 0; int lflag = 0; int Lflag = 0; static void usage(void); void main(int argc, char *argv[]) { int n, i; uchar *p, *q; uchar buf1[BUF], buf2[BUF]; int f1, f2; vlong nc = 1, o, l = 1; char *name1, *name2; uchar *b1s, *b1e, *b2s, *b2e; ARGBEGIN{ case 's': sflag = 1; break; case 'l': lflag = 1; break; case 'L': Lflag = 1; break; default: usage(); }ARGEND if(argc < 2) usage(); if((f1 = open(name1 = *argv++, OREAD)) == -1){ if(!sflag) perror(name1); exits("open"); } if((f2 = open(name2 = *argv++, OREAD)) == -1){ if(!sflag) perror(name2); exits("open"); } if(*argv){ o = strtoll(*argv++, 0, 0); if(seek(f1, o, 0) < 0){ if(!sflag) perror("cmp: seek by offset1"); exits("seek 1"); } } if(*argv){ o = strtoll(*argv++, 0, 0); if(seek(f2, o, 0) < 0){ if(!sflag) perror("cmp: seek by offset2"); exits("seek 2"); } } if(*argv) usage(); b1s = b1e = buf1; b2s = b2e = buf2; for(;;){ if(b1s >= b1e){ if(b1s >= &buf1[BUF]) b1s = buf1; n = read(f1, b1s, &buf1[BUF] - b1s); b1e = b1s + n; } if(b2s >= b2e){ if(b2s >= &buf2[BUF]) b2s = buf2; n = read(f2, b2s, &buf2[BUF] - b2s); b2e = b2s + n; } n = b2e - b2s; if(n > b1e - b1s) n = b1e - b1s; if(n <= 0) break; if(memcmp((void *)b1s, (void *)b2s, n) != 0){ if(sflag) exits("differ"); for(p = b1s, q = b2s, i = 0; i < n; p++, q++, i++) { if(*p == '\n') l++; if(*p != *q){ if(!lflag){ print("%s %s differ: char %lld", name1, name2, nc+i); print(Lflag?" line %lld\n":"\n", l); exits("differ"); } print("%6lld 0x%.2x 0x%.2x\n", nc+i, *p, *q); } } } if(Lflag) for(p = b1s; p < b1e;) if(*p++ == '\n') l++; nc += n; b1s += n; b2s += n; } if(b1e - b1s == b2e - b2s) exits((char *)0); if(!sflag) print("EOF on %s\n", (b1e - b1s > b2e - b2s)? name2 : name1); exits("EOF"); } static void usage(void) { print("Usage: cmp [-lsL] file1 file2 [offset1 [offset2] ]\n"); exits("usage"); } 9base-6/cmp/Makefile0000644000175000017500000000017111402154555013764 0ustar anselmanselm# cmp - cmp unix port from plan9 # Depends on ../lib9 TARG = cmp include ../std.mk pre-uninstall: post-install: 9base-6/cmp/cmp.10000644000175000017500000000210311402154555013162 0ustar anselmanselm.TH CMP 1 .SH NAME cmp \- compare two files .SH SYNOPSIS .B cmp [ .B -lsL ] .I file1 file2 [ .I offset1 [ .I offset2 ] ] .SH DESCRIPTION The two files are compared. A diagnostic results if the contents differ, otherwise there is no output. .PP The options are: .TP .B l Print the byte number (decimal) and the differing bytes (hexadecimal) for each difference. .TP .B s Print nothing for differing files, but set the exit status. .TP .B L Print the line number of the first differing byte. .PP If offsets are given, comparison starts at the designated byte position of the corresponding file. Offsets that begin with .B 0x are hexadecimal; with .BR 0 , octal; with anything else, decimal. .SH SOURCE .B \*9/src/cmd/cmp.c .SH "SEE ALSO" .IR diff (1) .SH DIAGNOSTICS If a file is inaccessible or missing, the exit status is .LR open . If the files are the same, the exit status is empty (true). If they are the same except that one is longer than the other, the exit status is .LR EOF . Otherwise .I cmp reports the position of the first disagreeing byte and the exit status is .LR differ . 9base-6/echo/0000755000175000017500000000000011402154555012464 5ustar anselmanselm9base-6/echo/echo.10000644000175000017500000000065511402154555013472 0ustar anselmanselm.TH ECHO 1 .SH NAME echo \- print arguments .SH SYNOPSIS .B echo [ .B -n ] [ .I arg ... ] .SH DESCRIPTION .I Echo writes its arguments separated by blanks and terminated by a newline on the standard output. Option .B -n suppresses the newline. .SH SOURCE .B \*9/src/cmd/echo.c .SH DIAGNOSTICS If .I echo draws an error while writing to standard output, the exit status is .LR "write error" . Otherwise the exit status is empty. 9base-6/echo/Makefile0000644000175000017500000000017411402154555014126 0ustar anselmanselm# echo - echo unix port from plan9 # Depends on ../lib9 TARG = echo include ../std.mk pre-uninstall: post-install: 9base-6/echo/echo.c0000644000175000017500000000105111402154555013543 0ustar anselmanselm#include #include void main(int argc, char *argv[]) { int nflag; int i, len; char *buf, *p; nflag = 0; if(argc > 1 && strcmp(argv[1], "-n") == 0) nflag = 1; len = 1; for(i = 1+nflag; i < argc; i++) len += strlen(argv[i])+1; buf = malloc(len); if(buf == 0) exits("no memory"); p = buf; for(i = 1+nflag; i < argc; i++){ strcpy(p, argv[i]); p += strlen(p); if(i < argc-1) *p++ = ' '; } if(!nflag) *p++ = '\n'; if(write(1, buf, p-buf) < 0) fprint(2, "echo: write error: %r\n"); exits((char *)0); } 9base-6/fortune/0000755000175000017500000000000011402154555013230 5ustar anselmanselm9base-6/fortune/Makefile0000644000175000017500000000017711402154555014675 0ustar anselmanselm# fortune - unix port from plan9 # # Depends on ../lib9 TARG = fortune include ../std.mk pre-uninstall: post-install: 9base-6/fortune/fortune.c0000644000175000017500000000332411402154555015060 0ustar anselmanselm#include #include #include #define index findex char choice[2048]; char *index = "#9/lib/fortunes.index"; char *fortunes = "#9/lib/fortunes"; void main(int argc, char *argv[]) { int i; long offs; uchar off[4]; int ix, nix; int newindex, oldindex; char *p; Dir *fbuf, *ixbuf; Biobuf *f, g; index = unsharp(index); fortunes = unsharp(fortunes); newindex = 0; oldindex = 0; ix = offs = 0; if((f=Bopen(argc>1?argv[1]:fortunes, OREAD)) == 0){ print("Misfortune!\n"); exits("misfortune"); } ixbuf = nil; if(argc == 1){ ix = open(index, OREAD); if(ix>=0){ oldindex = 1; ixbuf = dirfstat(ix); fbuf = dirfstat(Bfildes(f)); if(ixbuf == nil || fbuf == nil){ print("Misfortune?\n"); exits("misfortune"); } if(fbuf->mtime > ixbuf->mtime){ nix = create(index, OWRITE, 0666); if(nix >= 0){ close(ix); ix = nix; newindex = 1; oldindex = 0; } } }else{ ix = create(index, OWRITE, 0666); if(ix >= 0) newindex = 1; } } if(oldindex){ srand(getpid()); seek(ix, lrand()%(ixbuf->length/sizeof(offs))*sizeof(offs), 0); read(ix, off, sizeof(off)); Bseek(f, off[0]|(off[1]<<8)|(off[2]<<16)|(off[3]<<24), 0); p = Brdline(f, '\n'); if(p){ p[Blinelen(f)-1] = 0; strcpy(choice, p); }else strcpy(choice, "Misfortune!"); }else{ Binit(&g, ix, 1); srand(getpid()); for(i=1;;i++){ if(newindex) offs = Boffset(f); p = Brdline(f, '\n'); if(p == 0) break; p[Blinelen(f)-1] = 0; if(newindex){ off[0] = offs; off[1] = offs>>8; off[2] = offs>>16; off[3] = offs>>24; Bwrite(&g, off, sizeof(off)); } if(lrand()%i==0) strcpy(choice, p); } } print("%s\n", choice); exits(0); } 9base-6/fortune/fortune.10000644000175000017500000000065311402154555015000 0ustar anselmanselm.TH FORTUNE 1 .SH NAME fortune \- sample lines from a file .SH SYNOPSIS .B fortune [ .I file ] .SH DESCRIPTION .I Fortune prints a one-line aphorism chosen at random. If a .I file is specified, the saying is taken from that file; otherwise it is selected from .BR \*9/lib/fortunes . .SH FILES .B \*9/lib/fortunes .br .B \*9/lib/fortunes.index \ \ fast lookup table, maintained automatically .SH SOURCE .B \*9/src/cmd/fortune.c 9base-6/pbd/0000755000175000017500000000000011402154555012313 5ustar anselmanselm9base-6/pbd/pbd.c0000644000175000017500000000036711402154555013232 0ustar anselmanselm#include #include void main(void) { char buf[512], *p; p = "???"; if(getwd(buf, sizeof buf)){ p = strrchr(buf, '/'); if(p == nil) p = buf; else if(p>buf || p[1]!='\0') p++; } write(1, p, strlen(p)); exits(0); } 9base-6/pbd/pbd.10000644000175000017500000000000011402154555013130 0ustar anselmanselm9base-6/pbd/Makefile0000644000175000017500000000017111402154555013752 0ustar anselmanselm# pbd - pbd unix port from plan9 # Depends on ../lib9 TARG = pbd include ../std.mk pre-uninstall: post-install: 9base-6/hoc/0000755000175000017500000000000011402154555012317 5ustar anselmanselm9base-6/hoc/hoc.y0000644000175000017500000002276411402154555013275 0ustar anselmanselm%{ #include #include #include #include #include "hoc.h" #define code2(c1,c2) code(c1); code(c2) #define code3(c1,c2,c3) code(c1); code(c2); code(c3) %} %union { Symbol *sym; /* symbol table pointer */ Inst *inst; /* machine instruction */ int narg; /* number of arguments */ Formal *formals; /* list of formal parameters */ } %token NUMBER STRING PRINT VAR BLTIN UNDEF WHILE FOR IF ELSE %token FUNCTION PROCEDURE RETURN FUNC PROC READ %type formals %type expr stmt asgn prlist stmtlist %type cond while for if begin end %type procname %type arglist %right '=' ADDEQ SUBEQ MULEQ DIVEQ MODEQ %left OR %left AND %left GT GE LT LE EQ NE %left '+' '-' %left '*' '/' '%' %left UNARYMINUS NOT INC DEC %right '^' %% list: /* nothing */ | list '\n' | list defn '\n' | list asgn '\n' { code2(xpop, STOP); return 1; } | list stmt '\n' { code(STOP); return 1; } | list expr '\n' { code2(printtop, STOP); return 1; } | list error '\n' { yyerrok; } ; asgn: VAR '=' expr { code3(varpush,(Inst)$1,assign); $$=$3; } | VAR ADDEQ expr { code3(varpush,(Inst)$1,addeq); $$=$3; } | VAR SUBEQ expr { code3(varpush,(Inst)$1,subeq); $$=$3; } | VAR MULEQ expr { code3(varpush,(Inst)$1,muleq); $$=$3; } | VAR DIVEQ expr { code3(varpush,(Inst)$1,diveq); $$=$3; } | VAR MODEQ expr { code3(varpush,(Inst)$1,modeq); $$=$3; } ; stmt: expr { code(xpop); } | RETURN { defnonly("return"); code(procret); } | RETURN expr { defnonly("return"); $$=$2; code(funcret); } | PROCEDURE begin '(' arglist ')' { $$ = $2; code3(call, (Inst)$1, (Inst)(uintptr)$4); } | PRINT prlist { $$ = $2; } | while '(' cond ')' stmt end { ($1)[1] = (Inst)$5; /* body of loop */ ($1)[2] = (Inst)$6; } /* end, if cond fails */ | for '(' cond ';' cond ';' cond ')' stmt end { ($1)[1] = (Inst)$5; /* condition */ ($1)[2] = (Inst)$7; /* post loop */ ($1)[3] = (Inst)$9; /* body of loop */ ($1)[4] = (Inst)$10; } /* end, if cond fails */ | if '(' cond ')' stmt end { /* else-less if */ ($1)[1] = (Inst)$5; /* thenpart */ ($1)[3] = (Inst)$6; } /* end, if cond fails */ | if '(' cond ')' stmt end ELSE stmt end { /* if with else */ ($1)[1] = (Inst)$5; /* thenpart */ ($1)[2] = (Inst)$8; /* elsepart */ ($1)[3] = (Inst)$9; } /* end, if cond fails */ | '{' stmtlist '}' { $$ = $2; } ; cond: expr { code(STOP); } ; while: WHILE { $$ = code3(whilecode,STOP,STOP); } ; for: FOR { $$ = code(forcode); code3(STOP,STOP,STOP); code(STOP); } ; if: IF { $$ = code(ifcode); code3(STOP,STOP,STOP); } ; begin: /* nothing */ { $$ = progp; } ; end: /* nothing */ { code(STOP); $$ = progp; } ; stmtlist: /* nothing */ { $$ = progp; } | stmtlist '\n' | stmtlist stmt ; expr: NUMBER { $$ = code2(constpush, (Inst)$1); } | VAR { $$ = code3(varpush, (Inst)$1, eval); } | asgn | FUNCTION begin '(' arglist ')' { $$ = $2; code3(call,(Inst)$1,(Inst)(uintptr)$4); } | READ '(' VAR ')' { $$ = code2(varread, (Inst)$3); } | BLTIN '(' expr ')' { $$=$3; code2(bltin, (Inst)$1->u.ptr); } | '(' expr ')' { $$ = $2; } | expr '+' expr { code(add); } | expr '-' expr { code(sub); } | expr '*' expr { code(mul); } | expr '/' expr { code(div); } | expr '%' expr { code(mod); } | expr '^' expr { code (power); } | '-' expr %prec UNARYMINUS { $$=$2; code(negate); } | expr GT expr { code(gt); } | expr GE expr { code(ge); } | expr LT expr { code(lt); } | expr LE expr { code(le); } | expr EQ expr { code(eq); } | expr NE expr { code(ne); } | expr AND expr { code(and); } | expr OR expr { code(or); } | NOT expr { $$ = $2; code(not); } | INC VAR { $$ = code2(preinc,(Inst)$2); } | DEC VAR { $$ = code2(predec,(Inst)$2); } | VAR INC { $$ = code2(postinc,(Inst)$1); } | VAR DEC { $$ = code2(postdec,(Inst)$1); } ; prlist: expr { code(prexpr); } | STRING { $$ = code2(prstr, (Inst)$1); } | prlist ',' expr { code(prexpr); } | prlist ',' STRING { code2(prstr, (Inst)$3); } ; defn: FUNC procname { $2->type=FUNCTION; indef=1; } '(' formals ')' stmt { code(procret); define($2, $5); indef=0; } | PROC procname { $2->type=PROCEDURE; indef=1; } '(' formals ')' stmt { code(procret); define($2, $5); indef=0; } ; formals: { $$ = 0; } | VAR { $$ = formallist($1, 0); } | VAR ',' formals { $$ = formallist($1, $3); } ; procname: VAR | FUNCTION | PROCEDURE ; arglist: /* nothing */ { $$ = 0; } | expr { $$ = 1; } | arglist ',' expr { $$ = $1 + 1; } ; %% /* end of grammar */ char *progname; int lineno = 1; jmp_buf begin; int indef; char *infile; /* input file name */ Biobuf *bin; /* input file descriptor */ Biobuf binbuf; char **gargv; /* global argument list */ int gargc; int c = '\n'; /* global for use by warning() */ int backslash(int), follow(int, int, int); void defnonly(char*), run(void); void warning(char*, char*); int yylex(void) /* hoc6 */ { while ((c=Bgetc(bin)) == ' ' || c == '\t') ; if (c < 0) return 0; if (c == '\\') { c = Bgetc(bin); if (c == '\n') { lineno++; return yylex(); } } if (c == '#') { /* comment */ while ((c=Bgetc(bin)) != '\n' && c >= 0) ; if (c == '\n') lineno++; return c; } if (c == '.' || isdigit(c)) { /* number */ double d; Bungetc(bin); Bgetd(bin, &d); yylval.sym = install("", NUMBER, d); return NUMBER; } if (isalpha(c) || c == '_') { Symbol *s; char sbuf[100], *p = sbuf; do { if (p >= sbuf + sizeof(sbuf) - 1) { *p = '\0'; execerror("name too long", sbuf); } *p++ = c; } while ((c=Bgetc(bin)) >= 0 && (isalnum(c) || c == '_')); Bungetc(bin); *p = '\0'; if ((s=lookup(sbuf)) == 0) s = install(sbuf, UNDEF, 0.0); yylval.sym = s; return s->type == UNDEF ? VAR : s->type; } if (c == '"') { /* quoted string */ char sbuf[100], *p; for (p = sbuf; (c=Bgetc(bin)) != '"'; p++) { if (c == '\n' || c == Beof) execerror("missing quote", ""); if (p >= sbuf + sizeof(sbuf) - 1) { *p = '\0'; execerror("string too long", sbuf); } *p = backslash(c); } *p = 0; yylval.sym = (Symbol *)emalloc(strlen(sbuf)+1); strcpy((char*)yylval.sym, sbuf); return STRING; } switch (c) { case '+': return follow('+', INC, follow('=', ADDEQ, '+')); case '-': return follow('-', DEC, follow('=', SUBEQ, '-')); case '*': return follow('=', MULEQ, '*'); case '/': return follow('=', DIVEQ, '/'); case '%': return follow('=', MODEQ, '%'); case '>': return follow('=', GE, GT); case '<': return follow('=', LE, LT); case '=': return follow('=', EQ, '='); case '!': return follow('=', NE, NOT); case '|': return follow('|', OR, '|'); case '&': return follow('&', AND, '&'); case '\n': lineno++; return '\n'; default: return c; } } int backslash(int c) /* get next char with \'s interpreted */ { static char transtab[] = "b\bf\fn\nr\rt\t"; if (c != '\\') return c; c = Bgetc(bin); if (islower(c) && strchr(transtab, c)) return strchr(transtab, c)[1]; return c; } int follow(int expect, int ifyes, int ifno) /* look ahead for >=, etc. */ { int c = Bgetc(bin); if (c == expect) return ifyes; Bungetc(bin); return ifno; } void yyerror(char* s) /* report compile-time error */ { /*rob warning(s, (char *)0); longjmp(begin, 0); rob*/ execerror(s, (char *)0); } void execerror(char* s, char* t) /* recover from run-time error */ { warning(s, t); Bseek(bin, 0L, 2); /* flush rest of file */ restoreall(); longjmp(begin, 0); } void fpecatch(void) /* catch floating point exceptions */ { execerror("floating point exception", (char *) 0); } void intcatch(void) /* catch interrupts */ { execerror("interrupt", 0); } void run(void) /* execute until EOF */ { setjmp(begin); for (initcode(); yyparse(); initcode()) execute(progbase); } void main(int argc, char* argv[]) /* hoc6 */ { static int first = 1; #ifdef YYDEBUG extern int yydebug; yydebug=3; #endif progname = argv[0]; init(); if (argc == 1) { /* fake an argument list */ static char *stdinonly[] = { "-" }; gargv = stdinonly; gargc = 1; } else if (first) { /* for interrupts */ first = 0; gargv = argv+1; gargc = argc-1; } Binit(&binbuf, 0, OREAD); bin = &binbuf; while (moreinput()) run(); exits(0); } int moreinput(void) { char *expr; static char buf[64]; int fd; static Biobuf b; if (gargc-- <= 0) return 0; if (bin && bin != &binbuf) Bterm(bin); infile = *gargv++; lineno = 1; if (strcmp(infile, "-") == 0) { bin = &binbuf; infile = 0; return 1; } if(strncmp(infile, "-e", 2) == 0) { if(infile[2]==0){ if(gargc == 0){ fprint(2, "%s: no argument for -e\n", progname); return 0; } gargc--; expr = *gargv++; }else expr = infile+2; sprint(buf, "/tmp/hocXXXXXXX"); fd = mkstemp(buf); remove(buf); /* infile = mktemp(buf); fd = create(infile, ORDWR|ORCLOSE, 0600); if(fd < 0){ fprint(2, "%s: can't create temp. file: %r\n", progname); return 0; } */ fprint(fd, "%s\n", expr); /* leave fd around; file will be removed on exit */ /* the following looks weird but is required for unix version */ bin = &b; seek(fd, 0, 0); Binit(bin, fd, OREAD); } else { bin=Bopen(infile, OREAD); if (bin == 0) { fprint(2, "%s: can't open %s\n", progname, infile); return moreinput(); } } return 1; } void warning(char* s, char* t) /* print warning message */ { fprint(2, "%s: %s", progname, s); if (t) fprint(2, " %s", t); if (infile) fprint(2, " in %s", infile); fprint(2, " near line %d\n", lineno); while (c != '\n' && c != Beof) if((c = Bgetc(bin)) == '\n') /* flush rest of input line */ lineno++; } void defnonly(char *s) /* warn if illegal definition */ { if (!indef) execerror(s, "used outside definition"); } 9base-6/hoc/math.c0000644000175000017500000000173611402154555013423 0ustar anselmanselm#include #include #include "hoc.h" double errcheck(double, char*); double Log(double x) { return errcheck(log(x), "log"); } double Log10(double x) { return errcheck(log10(x), "log10"); } double Sqrt(double x) { return errcheck(sqrt(x), "sqrt"); } double Exp(double x) { return errcheck(exp(x), "exp"); } double Asin(double x) { return errcheck(asin(x), "asin"); } double Acos(double x) { return errcheck(acos(x), "acos"); } double Sinh(double x) { return errcheck(sinh(x), "sinh"); } double Cosh(double x) { return errcheck(cosh(x), "cosh"); } double Pow(double x, double y) { return errcheck(pow(x,y), "exponentiation"); } double integer(double x) { if(x<-2147483648.0 || x>2147483647.0) execerror("argument out of domain", 0); return (double)(long)x; } double errcheck(double d, char* s) /* check result of library call */ { if(isNaN(d)) execerror(s, "argument out of domain"); if(isInf(d, 0)) execerror(s, "result out of range"); return d; } 9base-6/hoc/code.c0000644000175000017500000002370511402154555013404 0ustar anselmanselm#include #include #include #include "hoc.h" #include "y.tab.h" #define NSTACK 256 static Datum stack[NSTACK]; /* the stack */ static Datum *stackp; /* next free spot on stack */ #define NPROG 2000 Inst prog[NPROG]; /* the machine */ Inst *progp; /* next free spot for code generation */ Inst *pc; /* program counter during execution */ Inst *progbase = prog; /* start of current subprogram */ int returning; /* 1 if return stmt seen */ int indef; /* 1 if parsing a func or proc */ typedef struct Frame { /* proc/func call stack frame */ Symbol *sp; /* symbol table entry */ Inst *retpc; /* where to resume after return */ Datum *argn; /* n-th argument on stack */ int nargs; /* number of arguments */ } Frame; #define NFRAME 100 Frame frame[NFRAME]; Frame *fp; /* frame pointer */ void initcode(void) { progp = progbase; stackp = stack; fp = frame; returning = 0; indef = 0; } void nop(void) { } void push(Datum d) { if (stackp >= &stack[NSTACK]) execerror("stack too deep", 0); *stackp++ = d; } Datum pop(void) { if (stackp == stack) execerror("stack underflow", 0); return *--stackp; } void xpop(void) /* for when no value is wanted */ { if (stackp == stack) execerror("stack underflow", (char *)0); --stackp; } void constpush(void) { Datum d; d.val = ((Symbol *)*pc++)->u.val; push(d); } void varpush(void) { Datum d; d.sym = (Symbol *)(*pc++); push(d); } void whilecode(void) { Datum d; Inst *savepc = pc; execute(savepc+2); /* condition */ d = pop(); while (d.val) { execute(*((Inst **)(savepc))); /* body */ if (returning) break; execute(savepc+2); /* condition */ d = pop(); } if (!returning) pc = *((Inst **)(savepc+1)); /* next stmt */ } void forcode(void) { Datum d; Inst *savepc = pc; execute(savepc+4); /* precharge */ pop(); execute(*((Inst **)(savepc))); /* condition */ d = pop(); while (d.val) { execute(*((Inst **)(savepc+2))); /* body */ if (returning) break; execute(*((Inst **)(savepc+1))); /* post loop */ pop(); execute(*((Inst **)(savepc))); /* condition */ d = pop(); } if (!returning) pc = *((Inst **)(savepc+3)); /* next stmt */ } void ifcode(void) { Datum d; Inst *savepc = pc; /* then part */ execute(savepc+3); /* condition */ d = pop(); if (d.val) execute(*((Inst **)(savepc))); else if (*((Inst **)(savepc+1))) /* else part? */ execute(*((Inst **)(savepc+1))); if (!returning) pc = *((Inst **)(savepc+2)); /* next stmt */ } void define(Symbol* sp, Formal *f) /* put func/proc in symbol table */ { Fndefn *fd; int n; fd = emalloc(sizeof(Fndefn)); fd->code = progbase; /* start of code */ progbase = progp; /* next code starts here */ fd->formals = f; for(n=0; f; f=f->next) n++; fd->nargs = n; sp->u.defn = fd; } void call(void) /* call a function */ { Formal *f; Datum *arg; Saveval *s; int i; Symbol *sp = (Symbol *)pc[0]; /* symbol table entry */ /* for function */ if (fp >= &frame[NFRAME]) execerror(sp->name, "call nested too deeply"); fp++; fp->sp = sp; fp->nargs = (int)(uintptr)pc[1]; fp->retpc = pc + 2; fp->argn = stackp - 1; /* last argument */ if(fp->nargs != sp->u.defn->nargs) execerror(sp->name, "called with wrong number of arguments"); /* bind formals */ f = sp->u.defn->formals; arg = stackp - fp->nargs; while(f){ s = emalloc(sizeof(Saveval)); s->val = f->sym->u; s->type = f->sym->type; s->next = f->save; f->save = s; f->sym->u.val = arg->val; f->sym->type = VAR; f = f->next; arg++; } for (i = 0; i < fp->nargs; i++) pop(); /* pop arguments; no longer needed */ execute(sp->u.defn->code); returning = 0; } void restore(Symbol *sp) /* restore formals associated with symbol */ { Formal *f; Saveval *s; f = sp->u.defn->formals; while(f){ s = f->save; if(s == 0) /* more actuals than formals */ break; f->sym->u = s->val; f->sym->type = s->type; f->save = s->next; free(s); f = f->next; } } void restoreall(void) /* restore all variables in case of error */ { while(fp>=frame && fp->sp){ restore(fp->sp); --fp; } fp = frame; } static void ret(void) /* common return from func or proc */ { /* restore formals */ restore(fp->sp); pc = (Inst *)fp->retpc; --fp; returning = 1; } void funcret(void) /* return from a function */ { Datum d; if (fp->sp->type == PROCEDURE) execerror(fp->sp->name, "(proc) returns value"); d = pop(); /* preserve function return value */ ret(); push(d); } void procret(void) /* return from a procedure */ { if (fp->sp->type == FUNCTION) execerror(fp->sp->name, "(func) returns no value"); ret(); } void bltin(void) { Datum d; d = pop(); d.val = (*(double (*)(double))*pc++)(d.val); push(d); } void add(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val += d2.val; push(d1); } void sub(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val -= d2.val; push(d1); } void mul(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val *= d2.val; push(d1); } void div(void) { Datum d1, d2; d2 = pop(); if (d2.val == 0.0) execerror("division by zero", (char *)0); d1 = pop(); d1.val /= d2.val; push(d1); } void mod(void) { Datum d1, d2; d2 = pop(); if (d2.val == 0.0) execerror("division by zero", (char *)0); d1 = pop(); /* d1.val %= d2.val; */ d1.val = fmod(d1.val, d2.val); push(d1); } void negate(void) { Datum d; d = pop(); d.val = -d.val; push(d); } void verify(Symbol* s) { if (s->type != VAR && s->type != UNDEF) execerror("attempt to evaluate non-variable", s->name); if (s->type == UNDEF) execerror("undefined variable", s->name); } void eval(void) /* evaluate variable on stack */ { Datum d; d = pop(); verify(d.sym); d.val = d.sym->u.val; push(d); } void preinc(void) { Datum d; d.sym = (Symbol *)(*pc++); verify(d.sym); d.val = d.sym->u.val += 1.0; push(d); } void predec(void) { Datum d; d.sym = (Symbol *)(*pc++); verify(d.sym); d.val = d.sym->u.val -= 1.0; push(d); } void postinc(void) { Datum d; double v; d.sym = (Symbol *)(*pc++); verify(d.sym); v = d.sym->u.val; d.sym->u.val += 1.0; d.val = v; push(d); } void postdec(void) { Datum d; double v; d.sym = (Symbol *)(*pc++); verify(d.sym); v = d.sym->u.val; d.sym->u.val -= 1.0; d.val = v; push(d); } void gt(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val > d2.val); push(d1); } void lt(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val < d2.val); push(d1); } void ge(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val >= d2.val); push(d1); } void le(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val <= d2.val); push(d1); } void eq(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val == d2.val); push(d1); } void ne(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val != d2.val); push(d1); } void and(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val != 0.0 && d2.val != 0.0); push(d1); } void or(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = (double)(d1.val != 0.0 || d2.val != 0.0); push(d1); } void not(void) { Datum d; d = pop(); d.val = (double)(d.val == 0.0); push(d); } void power(void) { Datum d1, d2; d2 = pop(); d1 = pop(); d1.val = Pow(d1.val, d2.val); push(d1); } void assign(void) { Datum d1, d2; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); d1.sym->u.val = d2.val; d1.sym->type = VAR; push(d2); } void addeq(void) { Datum d1, d2; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); d2.val = d1.sym->u.val += d2.val; d1.sym->type = VAR; push(d2); } void subeq(void) { Datum d1, d2; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); d2.val = d1.sym->u.val -= d2.val; d1.sym->type = VAR; push(d2); } void muleq(void) { Datum d1, d2; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); d2.val = d1.sym->u.val *= d2.val; d1.sym->type = VAR; push(d2); } void diveq(void) { Datum d1, d2; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); d2.val = d1.sym->u.val /= d2.val; d1.sym->type = VAR; push(d2); } void ppush(Datum *d) { push(*d); } void modeq(void) { Datum d1, d2; long x; d1 = pop(); d2 = pop(); if (d1.sym->type != VAR && d1.sym->type != UNDEF) execerror("assignment to non-variable", d1.sym->name); /* d2.val = d1.sym->u.val %= d2.val; */ x = d1.sym->u.val; x %= (long) d2.val; d2.val = x; d1.sym->u.val = x; d1.sym->type = VAR; /* push(d2) generates a compiler error on Linux w. gcc 2.95.4 */ ppush(&d2); } void printtop(void) /* pop top value from stack, print it */ { Datum d; static Symbol *s; /* last value computed */ if (s == 0) s = install("_", VAR, 0.0); d = pop(); print("%.17g\n", d.val); s->u.val = d.val; } void prexpr(void) /* print numeric value */ { Datum d; d = pop(); print("%.17g ", d.val); } void prstr(void) /* print string value */ { print("%s", (char *) *pc++); } void varread(void) /* read into variable */ { Datum d; extern Biobuf *bin; Symbol *var = (Symbol *) *pc++; int c; Again: do c = Bgetc(bin); while(c==' ' || c=='\t'); if(c == Beof){ Iseof: if(moreinput()) goto Again; d.val = var->u.val = 0.0; goto Return; } if(strchr("+-.0123456789", c) == 0) execerror("non-number read into", var->name); Bungetc(bin); if(Bgetd(bin, &var->u.val) == Beof) goto Iseof; else d.val = 1.0; Return: var->type = VAR; push(d); } Inst* code(Inst f) /* install one instruction or operand */ { Inst *oprogp = progp; if (progp >= &prog[NPROG]) execerror("program too big", (char *)0); *progp++ = f; return oprogp; } void execute(Inst* p) { for (pc = p; *pc != STOP && !returning; ) (*((++pc)[-1]))(); } 9base-6/hoc/init.c0000644000175000017500000000264011402154555013430 0ustar anselmanselm#include #include #include "hoc.h" #include "y.tab.h" static struct { /* Keywords */ char *name; int kval; } keywords[] = { "proc", PROC, "func", FUNC, "return", RETURN, "if", IF, "else", ELSE, "while", WHILE, "for", FOR, "print", PRINT, "read", READ, 0, 0 }; static struct { /* Constants */ char *name; double cval; } consts[] = { "PI", 3.14159265358979323846, "E", 2.71828182845904523536, "GAMMA", 0.57721566490153286060, /* Euler */ "DEG", 57.29577951308232087680, /* deg/radian */ "PHI", 1.61803398874989484820, /* golden ratio */ 0, 0 }; static struct { /* Built-ins */ char *name; double (*func)(double); } builtins[] = { "sin", sin, "cos", cos, "tan", tan, "atan", atan, "asin", Asin, /* checks range */ "acos", Acos, /* checks range */ "sinh", Sinh, /* checks range */ "cosh", Cosh, /* checks range */ "tanh", tanh, "log", Log, /* checks range */ "log10", Log10, /* checks range */ "exp", Exp, /* checks range */ "sqrt", Sqrt, /* checks range */ "int", integer, "abs", fabs, 0, 0 }; void init(void) /* install constants and built-ins in table */ { int i; Symbol *s; for (i = 0; keywords[i].name; i++) install(keywords[i].name, keywords[i].kval, 0.0); for (i = 0; consts[i].name; i++) install(consts[i].name, VAR, consts[i].cval); for (i = 0; builtins[i].name; i++) { s = install(builtins[i].name, BLTIN, 0.0); s->u.ptr = builtins[i].func; } } 9base-6/hoc/hoc.10000644000175000017500000000446411402154555013162 0ustar anselmanselm.TH HOC 1 .SH NAME hoc \- interactive floating point language .SH SYNOPSIS .B hoc [ .I file ... ] [ .B -e .I expression ] .SH DESCRIPTION .I Hoc interprets a simple language for floating point arithmetic, at about the level of BASIC, with C-like syntax and functions. .PP The named .I files are read and interpreted in order. If no .I file is given or if .I file is .L - .I hoc interprets the standard input. The .B -e option allows input to .I hoc to be specified on the command line, to be treated as if it appeared in a file. .PP .I Hoc input consists of .I expressions and .IR statements . Expressions are evaluated and their results printed. Statements, typically assignments and function or procedure definitions, produce no output unless they explicitly call .IR print . .PP Variable names have the usual syntax, including .LR _ ; the name .L _ by itself contains the value of the last expression evaluated. The variables .BR E , .BR PI , .BR PHI , .BR GAMMA and .B DEG are predefined; the last is 59.25..., degrees per radian. .PP Expressions are formed with these C-like operators, listed by decreasing precedence. .TP .B ^ exponentiation .TP .B ! - ++ -- .TP .B * / % .TP .B + - .TP .B > >= < <= == != .TP .B && .TP .B || .TP .B = += -= *= /= %= .PP Built in functions are .BR abs , .BR acos , .BR asin , .B atan (one argument), .BR cos , .BR cosh , .BR exp , .BR int , .BR log , .BR log10 , .BR sin , .BR sinh , .BR sqrt , .BR tan , and .BR tanh . The function .B read(x) reads a value into the variable .B x and returns 0 at EOF; the statement .B print prints a list of expressions that may include string constants such as \fL"hello\en"\f1.\fP .PP Control flow statements are .BR if - else , .BR while , and .BR for , with braces for grouping. Newline ends a statement. Backslash-newline is equivalent to a space. .PP Functions and procedures are introduced by the words .B func and .BR proc ; .B return is used to return with a value from a function. .SH EXAMPLES .EX func gcd(a, b) { temp = abs(a) % abs(b) if(temp == 0) return abs(b) return gcd(b, temp) } for(i=1; i<12; i++) print gcd(i,12) .EE .SH SOURCE .B \*9/src/cmd/hoc .SH "SEE ALSO" .IR bc (1), .IR dc (1) .br B. W. Kernighan and R. Pike, .I The Unix Programming Environment, Prentice-Hall, 1984 .SH BUGS Error recovery is imperfect within function and procedure definitions. 9base-6/hoc/Makefile0000644000175000017500000000026111402154555013756 0ustar anselmanselm# hoc - hoc unix port from plan9 # Depends on ../lib9 TARG = hoc OFILES = y.tab.o init.o code.o math.o symbol.o YFILES = hoc.y MANFILES = hoc.1 include ../yacc.mk 9base-6/hoc/symbol.c0000644000175000017500000000172411402154555013774 0ustar anselmanselm#include #include #include "hoc.h" #include "y.tab.h" static Symbol *symlist = 0; /* symbol table: linked list */ Symbol* lookup(char* s) /* find s in symbol table */ { Symbol *sp; for (sp = symlist; sp != (Symbol *) 0; sp = sp->next) if (strcmp(sp->name, s) == 0) return sp; return 0; /* 0 ==> not found */ } Symbol* install(char* s, int t, double d) /* install s in symbol table */ { Symbol *sp; sp = emalloc(sizeof(Symbol)); sp->name = emalloc(strlen(s)+1); /* +1 for '\0' */ strcpy(sp->name, s); sp->type = t; sp->u.val = d; sp->next = symlist; /* put at front of list */ symlist = sp; return sp; } void* emalloc(unsigned n) /* check return from malloc */ { char *p; p = malloc(n); if (p == 0) execerror("out of memory", (char *) 0); return p; } Formal* formallist(Symbol *formal, Formal *list) /* add formal to list */ { Formal *f; f = emalloc(sizeof(Formal)); f->sym = formal; f->save = 0; f->next = list; return f; } 9base-6/hoc/hoc.h0000644000175000017500000000451111402154555013242 0ustar anselmanselmtypedef void (*Inst)(void); #define STOP (Inst) 0 typedef struct Symbol Symbol; typedef union Datum Datum; typedef struct Formal Formal; typedef struct Saveval Saveval; typedef struct Fndefn Fndefn; typedef union Symval Symval; union Symval { /* value of a symbol */ double val; /* VAR */ double (*ptr)(double); /* BLTIN */ Fndefn *defn; /* FUNCTION, PROCEDURE */ char *str; /* STRING */ }; struct Symbol { /* symbol table entry */ char *name; long type; Symval u; struct Symbol *next; /* to link to another */ }; Symbol *install(char*, int, double), *lookup(char*); union Datum { /* interpreter stack type */ double val; Symbol *sym; }; struct Saveval { /* saved value of variable */ Symval val; long type; Saveval *next; }; struct Formal { /* formal parameter */ Symbol *sym; Saveval *save; Formal *next; }; struct Fndefn { /* formal parameter */ Inst *code; Formal *formals; int nargs; }; extern Formal *formallist(Symbol*, Formal*); extern double Fgetd(int); extern int moreinput(void); extern void restore(Symbol*); extern void restoreall(void); extern void execerror(char*, char*); extern void define(Symbol*, Formal*), verify(Symbol*); extern Datum pop(void); extern void initcode(void), push(Datum), xpop(void), constpush(void); extern void varpush(void); #define div hocdiv extern void eval(void), add(void), sub(void), mul(void), div(void), mod(void); extern void negate(void), power(void); extern void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void); extern Inst *progp, *progbase, prog[], *code(Inst); extern void assign(void), bltin(void), varread(void); extern void prexpr(void), prstr(void); extern void gt(void), lt(void), eq(void), ge(void), le(void), ne(void); extern void and(void), or(void), not(void); extern void ifcode(void), whilecode(void), forcode(void); extern void call(void), arg(void), argassign(void); extern void funcret(void), procret(void); extern void preinc(void), predec(void), postinc(void), postdec(void); extern void execute(Inst*); extern void printtop(void); extern double Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double); extern double Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double); extern double Pow(double, double); extern void init(void); extern int yyparse(void); extern void execerror(char*, char*); extern void *emalloc(unsigned); 9base-6/uniq/0000755000175000017500000000000011402154555012522 5ustar anselmanselm9base-6/uniq/Makefile0000644000175000017500000000017411402154555014164 0ustar anselmanselm# uniq - uniq unix port from plan9 # Depends on ../lib9 TARG = uniq include ../std.mk pre-uninstall: post-install: 9base-6/uniq/uniq.c0000644000175000017500000000430311402154555013642 0ustar anselmanselm/* * Deal with duplicated lines in a file */ #include #include #include #include #define SIZE 8000 int fields = 0; int letters = 0; int linec = 0; char mode; int uniq; char *b1, *b2; long bsize; Biobuf fin; Biobuf fout; int gline(char *buf); void pline(char *buf); int equal(char *b1, char *b2); char* skip(char *s); void main(int argc, char *argv[]) { int f; bsize = SIZE; b1 = malloc(bsize); b2 = malloc(bsize); f = 0; while(argc > 1) { if(*argv[1] == '-') { if(isdigit((uchar)argv[1][1])) fields = atoi(&argv[1][1]); else mode = argv[1][1]; argc--; argv++; continue; } if(*argv[1] == '+') { letters = atoi(&argv[1][1]); argc--; argv++; continue; } f = open(argv[1], 0); if(f < 0) { fprint(2, "cannot open %s\n", argv[1]); exits("open"); } break; } if(argc > 2) { fprint(2, "unexpected argument %s\n", argv[2]); exits("arg"); } Binit(&fin, f, OREAD); Binit(&fout, 1, OWRITE); if(gline(b1)) exits(0); for(;;) { linec++; if(gline(b2)) { pline(b1); exits(0); } if(!equal(b1, b2)) { pline(b1); linec = 0; do { linec++; if(gline(b1)) { pline(b2); exits(0); } } while(equal(b2, b1)); pline(b2); linec = 0; } } } int gline(char *buf) { char *p; p = Brdline(&fin, '\n'); if(p == 0) return 1; if(fin.rdline >= bsize-1) { fprint(2, "line too long\n"); exits("too long"); } memmove(buf, p, fin.rdline); buf[fin.rdline-1] = 0; return 0; } void pline(char *buf) { switch(mode) { case 'u': if(uniq) { uniq = 0; return; } break; case 'd': if(uniq) break; return; case 'c': Bprint(&fout, "%4d ", linec); } uniq = 0; Bprint(&fout, "%s\n", buf); } int equal(char *b1, char *b2) { char c; if(fields || letters) { b1 = skip(b1); b2 = skip(b2); } for(;;) { c = *b1++; if(c != *b2++) { if(c == 0 && mode == 's') return 1; return 0; } if(c == 0) { uniq++; return 1; } } } char* skip(char *s) { int nf, nl; nf = nl = 0; while(nf++ < fields) { while(*s == ' ' || *s == '\t') s++; while(!(*s == ' ' || *s == '\t' || *s == 0) ) s++; } while(nl++ < letters && *s != 0) s++; return s; } 9base-6/uniq/uniq.10000644000175000017500000000174211402154555013564 0ustar anselmanselm.TH UNIQ 1 .SH NAME uniq \- report repeated lines in a file .SH SYNOPSIS .B uniq [ .B -udc [ .BI +- num ] ] [ .I file ] .SH DESCRIPTION .I Uniq copies the input .IR file , or the standard input, to the standard output, comparing adjacent lines. In the normal case, the second and succeeding copies of repeated lines are removed. Repeated lines must be adjacent in order to be found. .TP .B -u Print unique lines. .TP .B -d Print (one copy of) duplicated lines. .TP .B -c Prefix a repetition count and a tab to each output line. Implies .B -u and .BR -d . .TP .BI - num The first .IR num fields together with any blanks before each are ignored. A field is defined as a string of non-space, non-tab characters separated by tabs and spaces from its neighbors. .TP .BI + num The first .IR num characters are ignored. Fields are skipped before characters. .SH SOURCE .B \*9/src/cmd/uniq.c .SH "SEE ALSO" .IR sort (1) .SH BUGS Field selection and comparison should be compatible with .IR sort (1). 9base-6/join/0000755000175000017500000000000011402154555012505 5ustar anselmanselm9base-6/join/join.10000644000175000017500000000477511402154555013543 0ustar anselmanselm.TH JOIN 1 .CT 1 files .SH NAME join \- relational database operator .SH SYNOPSIS .B join [ .I options ] .I file1 file2 .SH DESCRIPTION .I Join forms, on the standard output, a join of the two relations specified by the lines of .I file1 and .IR file2 . If one of the file names is .LR - , the standard input is used. .PP .I File1 and .I file2 must be sorted in increasing .SM ASCII collating sequence on the fields on which they are to be joined, normally the first in each line. .PP There is one line in the output for each pair of lines in .I file1 and .I file2 that have identical join fields. The output line normally consists of the common field, then the rest of the line from .IR file1 , then the rest of the line from .IR file2 . .PP Input fields are normally separated spaces or tabs; output fields by space. In this case, multiple separators count as one, and leading separators are discarded. .PP The following options are recognized, with POSIX syntax. .TP .BI -a " n In addition to the normal output, produce a line for each unpairable line in file .IR n , where .I n is 1 or 2. .TP .BI -v " n Like .BR -a , omitting output for paired lines. .TP .BI -e " s Replace empty output fields by string .IR s . .TP .BI -1 " m .br .ns .TP .BI -2 " m Join on the .IR m th field of .I file1 or .IR file2 . .TP .BI -j "n m" Archaic equivalent for .BI - n " m"\f1. .TP .BI -o fields Each output line comprises the designated fields. The comma-separated field designators are either .BR 0 , meaning the join field, or have the form .IR n . m , where .I n is a file number and .I m is a field number. Archaic usage allows separate arguments for field designators. .PP .TP .BI -t c Use character .I c as the only separator (tab character) on input and output. Every appearance of .I c in a line is significant. .SH EXAMPLES .TP .L sort /etc/passwd | join -t: -1 1 -a 1 -e "" - bdays Add birthdays to the .B /etc/passwd file, leaving unknown birthdays empty. The layout of .B /adm/users is given in .IR passwd (5); .B bdays contains sorted lines like .LR "ken:Feb\ 4,\ 1953" . .TP .L tr : ' ' temp .br .ns .TP .L join -1 3 -2 3 -o 1.1,2.1 temp temp | awk '$1 < $2' Print all pairs of users with identical userids. .SH SOURCE .B \*9/src/cmd/join.c .SH "SEE ALSO" .IR sort (1), .IR comm (1), .IR awk (1) .SH BUGS With default field separation, the collating sequence is that of .BI "sort -b" .BI -k y , y\f1; with .BR -t , the sequence is that of .BI "sort -t" x .BI -k y , y\f1. .PP One of the files must be randomly accessible. 9base-6/join/Makefile0000644000175000017500000000017411402154555014147 0ustar anselmanselm# join - join unix port from plan9 # Depends on ../lib9 TARG = join include ../std.mk pre-uninstall: post-install: 9base-6/join/join.c0000644000175000017500000001657011402154555013621 0ustar anselmanselm/* join F1 F2 on stuff */ #include #include #include #include #define F1 0 #define F2 1 #define F0 3 #define NFLD 100 /* max field per line */ #define comp() runecmp(ppi[F1][j1],ppi[F2][j2]) FILE *f[2]; Rune buf[2][BUFSIZ]; /*input lines */ Rune *ppi[2][NFLD+1]; /* pointers to fields in lines */ Rune *s1,*s2; #define j1 joinj1 #define j2 joinj2 int j1 = 1; /* join of this field of file 1 */ int j2 = 1; /* join of this field of file 2 */ int olist[2*NFLD]; /* output these fields */ int olistf[2*NFLD]; /* from these files */ int no; /* number of entries in olist */ Rune sep1 = ' '; /* default field separator */ Rune sep2 = '\t'; char *sepstr=" "; int discard; /* count of truncated lines */ Rune null[BUFSIZ]/* = L""*/; int a1; int a2; char *getoptarg(int*, char***); void output(int, int); int input(int); void oparse(char*); void error(char*, char*); void seek1(void), seek2(void); Rune *strtorune(Rune *, char *); void main(int argc, char **argv) { int i; while (argc > 1 && argv[1][0] == '-') { if (argv[1][1] == '\0') break; switch (argv[1][1]) { case '-': argc--; argv++; goto proceed; case 'a': switch(*getoptarg(&argc, &argv)) { case '1': a1++; break; case '2': a2++; break; default: error("incomplete option -a",""); } break; case 'e': strtorune(null, getoptarg(&argc, &argv)); break; case 't': sepstr=getoptarg(&argc, &argv); chartorune(&sep1, sepstr); sep2 = sep1; break; case 'o': if(argv[1][2]!=0 || argc>2 && strchr(argv[2],',')!=0) oparse(getoptarg(&argc, &argv)); else for (no = 0; no<2*NFLD && argc>2; no++){ if (argv[2][0] == '1' && argv[2][1] == '.') { olistf[no] = F1; olist[no] = atoi(&argv[2][2]); } else if (argv[2][0] == '2' && argv[2][1] == '.') { olist[no] = atoi(&argv[2][2]); olistf[no] = F2; } else if (argv[2][0] == '0') olistf[no] = F0; else break; argc--; argv++; } break; case 'j': if(argc <= 2) break; if (argv[1][2] == '1') j1 = atoi(argv[2]); else if (argv[1][2] == '2') j2 = atoi(argv[2]); else j1 = j2 = atoi(argv[2]); argc--; argv++; break; case '1': j1 = atoi(getoptarg(&argc, &argv)); break; case '2': j2 = atoi(getoptarg(&argc, &argv)); break; } argc--; argv++; } proceed: for (i = 0; i < no; i++) if (olist[i]-- > NFLD) /* 0 origin */ error("field number too big in -o",""); if (argc != 3) error("usage: join [-1 x -2 y] [-o list] file1 file2",""); j1--; j2--; /* everyone else believes in 0 origin */ s1 = ppi[F1][j1]; s2 = ppi[F2][j2]; if (strcmp(argv[1], "-") == 0) f[F1] = stdin; else if ((f[F1] = fopen(argv[1], "r")) == 0) error("can't open %s", argv[1]); if(strcmp(argv[2], "-") == 0) { f[F2] = stdin; } else if ((f[F2] = fopen(argv[2], "r")) == 0) error("can't open %s", argv[2]); if(ftell(f[F2]) >= 0) seek2(); else if(ftell(f[F1]) >= 0) seek1(); else error("neither file is randomly accessible",""); if (discard) error("some input line was truncated", ""); exits(""); } int runecmp(Rune *a, Rune *b){ while(*a==*b){ if(*a=='\0') return 0; a++; b++; } if(*a<*b) return -1; return 1; } char *runetostr(char *buf, Rune *r){ char *s; for(s=buf;*r;r++) s+=runetochar(s, r); *s='\0'; return buf; } Rune *strtorune(Rune *buf, char *s){ Rune *r; for(r=buf;*s;r++) s+=chartorune(r, s); *r='\0'; return buf; } /* lazy. there ought to be a clean way to combine seek1 & seek2 */ #define get1() n1=input(F1) #define get2() n2=input(F2) void seek2(void) { int n1, n2; int top2=0; int bot2 = ftell(f[F2]); get1(); get2(); while(n1>0 && n2>0 || (a1||a2) && n1+n2>0) { if(n1>0 && n2>0 && comp()>0 || n1==0) { if(a2) output(0, n2); bot2 = ftell(f[F2]); get2(); } else if(n1>0 && n2>0 && comp()<0 || n2==0) { if(a1) output(n1, 0); get1(); } else /*(n1>0 && n2>0 && comp()==0)*/ { while(n2>0 && comp()==0) { output(n1, n2); top2 = ftell(f[F2]); get2(); } fseek(f[F2], bot2, 0); get2(); get1(); for(;;) { if(n1>0 && n2>0 && comp()==0) { output(n1, n2); get2(); } else if(n1>0 && n2>0 && comp()<0 || n2==0) { fseek(f[F2], bot2, 0); get2(); get1(); } else /*(n1>0 && n2>0 && comp()>0 || n1==0)*/{ fseek(f[F2], top2, 0); bot2 = top2; get2(); break; } } } } } void seek1(void) { int n1, n2; int top1=0; int bot1 = ftell(f[F1]); get1(); get2(); while(n1>0 && n2>0 || (a1||a2) && n1+n2>0) { if(n1>0 && n2>0 && comp()>0 || n1==0) { if(a2) output(0, n2); get2(); } else if(n1>0 && n2>0 && comp()<0 || n2==0) { if(a1) output(n1, 0); bot1 = ftell(f[F1]); get1(); } else /*(n1>0 && n2>0 && comp()==0)*/ { while(n2>0 && comp()==0) { output(n1, n2); top1 = ftell(f[F1]); get1(); } fseek(f[F1], bot1, 0); get2(); get1(); for(;;) { if(n1>0 && n2>0 && comp()==0) { output(n1, n2); get1(); } else if(n1>0 && n2>0 && comp()>0 || n1==0) { fseek(f[F1], bot1, 0); get2(); get1(); } else /*(n1>0 && n2>0 && comp()<0 || n2==0)*/{ fseek(f[F1], top1, 0); bot1 = top1; get1(); break; } } } } } int input(int n) /* get input line and split into fields */ { register int i, c; Rune *bp; Rune **pp; char line[BUFSIZ]; bp = buf[n]; pp = ppi[n]; if (fgets(line, BUFSIZ, f[n]) == 0) return(0); strtorune(bp, line); i = 0; do { i++; if (sep1 == ' ') /* strip multiples */ while ((c = *bp) == sep1 || c == sep2) bp++; /* skip blanks */ *pp++ = bp; /* record beginning */ while ((c = *bp) != sep1 && c != '\n' && c != sep2 && c != '\0') bp++; *bp++ = '\0'; /* mark end by overwriting blank */ } while (c != '\n' && c != '\0' && i < NFLD-1); if (c != '\n') discard++; *pp = 0; return(i); } void output(int on1, int on2) /* print items from olist */ { int i; Rune *temp; char buf[BUFSIZ]; if (no <= 0) { /* default case */ printf("%s", runetostr(buf, on1? ppi[F1][j1]: ppi[F2][j2])); for (i = 0; i < on1; i++) if (i != j1) printf("%s%s", sepstr, runetostr(buf, ppi[F1][i])); for (i = 0; i < on2; i++) if (i != j2) printf("%s%s", sepstr, runetostr(buf, ppi[F2][i])); printf("\n"); } else { for (i = 0; i < no; i++) { if (olistf[i]==F0 && on1>j1) temp = ppi[F1][j1]; else if (olistf[i]==F0 && on2>j2) temp = ppi[F2][j2]; else { temp = ppi[olistf[i]][olist[i]]; if(olistf[i]==F1 && on1<=olist[i] || olistf[i]==F2 && on2<=olist[i] || *temp==0) temp = null; } printf("%s", runetostr(buf, temp)); if (i == no - 1) printf("\n"); else printf("%s", sepstr); } } } void error(char *s1, char *s2) { fprintf(stderr, "join: "); fprintf(stderr, s1, s2); fprintf(stderr, "\n"); exits(s1); } char * getoptarg(int *argcp, char ***argvp) { int argc = *argcp; char **argv = *argvp; if(argv[1][2] != 0) return &argv[1][2]; if(argc<=2 || argv[2][0]=='-') error("incomplete option %s", argv[1]); *argcp = argc-1; *argvp = ++argv; return argv[1]; } void oparse(char *s) { for (no = 0; no<2*NFLD && *s; no++, s++) { switch(*s) { case 0: return; case '0': olistf[no] = F0; break; case '1': case '2': if(s[1] == '.' && isdigit((uchar)s[2])) { olistf[no] = *s=='1'? F1: F2; olist[no] = atoi(s += 2); break; } /* fall thru */ default: error("invalid -o list", ""); } if(s[1] == ',') s++; } } 9base-6/cal/0000755000175000017500000000000011402154555012305 5ustar anselmanselm9base-6/cal/Makefile0000644000175000017500000000017111402154555013744 0ustar anselmanselm# cal - cal unix port from plan9 # Depends on ../lib9 TARG = cal include ../std.mk pre-uninstall: post-install: 9base-6/cal/cal.c0000644000175000017500000001015411402154555013211 0ustar anselmanselm#include #include #include char dayw[] = { " S M Tu W Th F S" }; char *smon[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }; char mon[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; char string[432]; Biobuf bout; void main(int argc, char *argv[]); int number(char *str); void pstr(char *str, int n); void cal(int m, int y, char *p, int w); int jan1(int yr); int curmo(void); int curyr(void); void main(int argc, char *argv[]) { int y, i, j, m; if(argc > 3) { fprint(2, "usage: cal [month] [year]\n"); exits("usage"); } Binit(&bout, 1, OWRITE); /* * no arg, print current month */ if(argc == 1) { m = curmo(); y = curyr(); goto xshort; } /* * one arg * if looks like a month, print month * else print year */ if(argc == 2) { y = number(argv[1]); if(y < 0) y = -y; if(y >= 1 && y <= 12) { m = y; y = curyr(); goto xshort; } goto xlong; } /* * two arg, month and year */ m = number(argv[1]); if(m < 0) m = -m; y = number(argv[2]); goto xshort; /* * print out just month */ xshort: if(m < 1 || m > 12) goto badarg; if(y < 1 || y > 9999) goto badarg; Bprint(&bout, " %s %u\n", smon[m-1], y); Bprint(&bout, "%s\n", dayw); cal(m, y, string, 24); for(i=0; i<6*24; i+=24) pstr(string+i, 24); exits(0); /* * print out complete year */ xlong: y = number(argv[1]); if(y<1 || y>9999) goto badarg; Bprint(&bout, "\n\n\n"); Bprint(&bout, " %u\n", y); Bprint(&bout, "\n"); for(i=0; i<12; i+=3) { for(j=0; j<6*72; j++) string[j] = '\0'; Bprint(&bout, " %.3s", smon[i]); Bprint(&bout, " %.3s", smon[i+1]); Bprint(&bout, " %.3s\n", smon[i+2]); Bprint(&bout, "%s %s %s\n", dayw, dayw, dayw); cal(i+1, y, string, 72); cal(i+2, y, string+23, 72); cal(i+3, y, string+46, 72); for(j=0; j<6*72; j+=72) pstr(string+j, 72); } Bprint(&bout, "\n\n\n"); exits(0); badarg: Bprint(&bout, "cal: bad argument\n"); } struct { char* word; int val; } dict[] = { "jan", 1, "january", 1, "feb", 2, "february", 2, "mar", 3, "march", 3, "apr", 4, "april", 4, "may", 5, "jun", 6, "june", 6, "jul", 7, "july", 7, "aug", 8, "august", 8, "sep", 9, "sept", 9, "september", 9, "oct", 10, "october", 10, "nov", 11, "november", 11, "dec", 12, "december", 12, 0 }; /* * convert to a number. * if its a dictionary word, * return negative number */ int number(char *str) { int n, c; char *s; for(n=0; s=dict[n].word; n++) if(strcmp(s, str) == 0) return -dict[n].val; n = 0; s = str; while(c = *s++) { if(c<'0' || c>'9') return 0; n = n*10 + c-'0'; } return n; } void pstr(char *str, int n) { int i; char *s; s = str; i = n; while(i--) if(*s++ == '\0') s[-1] = ' '; i = n+1; while(i--) if(*--s != ' ') break; s[1] = '\0'; Bprint(&bout, "%s\n", str); } void cal(int m, int y, char *p, int w) { int d, i; char *s; s = p; d = jan1(y); mon[2] = 29; mon[9] = 30; switch((jan1(y+1)+7-d)%7) { /* * non-leap year */ case 1: mon[2] = 28; break; /* * 1752 */ default: mon[9] = 19; break; /* * leap year */ case 2: ; } for(i=1; i 9) *s = i/10+'0'; s++; *s++ = i%10+'0'; s++; if(++d == 7) { d = 0; s = p+w; p = s; } } } /* * return day of the week * of jan 1 of given year */ int jan1(int yr) { int y, d; /* * normal gregorian calendar * one extra day per four years */ y = yr; d = 4+y+(y+3)/4; /* * julian calendar * regular gregorian * less three days per 400 */ if(y > 1800) { d -= (y-1701)/100; d += (y-1601)/400; } /* * great calendar changeover instant */ if(y > 1752) d += 3; return d%7; } /* * system dependent * get current month and year */ int curmo(void) { Tm *tm; tm = localtime(time(0)); return tm->mon+1; } int curyr(void) { Tm *tm; tm = localtime(time(0)); return tm->year+1900; } 9base-6/cal/cal.10000644000175000017500000000152011402154555013124 0ustar anselmanselm.TH CAL 1 .SH NAME cal \- print calendar .SH SYNOPSIS .B cal [ .I month ] [ .I year ] .SH DESCRIPTION .I Cal prints a calendar. .I Month is either a number from 1 to 12, a lower case month name, or a lower case three-letter prefix of a month name. .I Year can be between 1 and 9999. If either .I month or .I year is omitted, the current month or year is used. If only one argument is given, and it is a number larger than 12, a calendar for all twelve months of the given year is produced; otherwise a calendar for just one month is printed. The calendar produced is that for England and her colonies. .PP Try .EX cal sep 1752 .EE .SH SOURCE .B \*9/src/cmd/cal.c .SH BUGS The year is always considered to start in January even though this is historically naive. .PP Beware that .L "cal 90" refers to the early Christian era, not the 20th century. 9base-6/test/0000755000175000017500000000000011402154555012525 5ustar anselmanselm9base-6/test/Makefile0000644000175000017500000000023111402154555014161 0ustar anselmanselm# test - test unix port from plan9 # Depends on ../lib9 TARG = test include ../std.mk # Solaris #LDFLAGS += -dy pre-uninstall: post-install: 9base-6/test/test.10000644000175000017500000000671611402154555013600 0ustar anselmanselm.TH TEST 1 .SH NAME test \- set status according to condition .SH SYNOPSIS .B test .I expr .SH DESCRIPTION .I Test evaluates the expression .IR expr . If the value is true the exit status is null; otherwise the exit status is non-null. If there are no arguments the exit status is non-null. .PP The following primitives are used to construct .IR expr . .TP "\w'\fIn1 \fL-eq \fIn2\fLXX'u" .BI -r " file" True if the file exists (is accessible) and is readable. .PD0 .TP .BI -w " file" True if the file exists and is writable. .TP .BI -x " file" True if the file exists and has execute permission. .TP .BI -e " file True if the file exists. .TP .BI -f " file" True if the file exists and is a plain file. .TP .BI -d " file" True if the file exists and is a directory. .TP .BI -s " file" True if the file exists and has a size greater than zero. .TP .BI -t " fildes True if the open file whose file descriptor number is .I fildes (1 by default) is the same file as .BR /dev/cons . .TP .BI -A " file" True if the file exists and is append-only. .TP .BI -L " file" True if the file exists and is exclusive-use. .TP .BI -T "file" True if the file exists and is temporary. .TP .IB s1 " = " s2 True if the strings .I s1 and .I s2 are identical. .TP .IB s1 " != " s2 True if the strings .I s1 and .I s2 are not identical. .TP s1 True if .I s1 is not the null string. (Deprecated.) .TP .BI -n " s1" True if the length of string .I s1 is non-zero. .TP .BI -z " s1" True if the length of string .I s1 is zero. .TP .IB n1 " -eq " n2 True if the integers .I n1 and .I n2 are arithmetically equal. Any of the comparisons .BR -ne , .BR -gt , .BR -ge , .BR -lt , or .BR -le may be used in place of .BR -eq . The (nonstandard) construct .BI -l " string\f1, meaning the length of .IR string , may be used in place of an integer. .TP .IB a " -nt " b True if file .I a is newer than (modified after) file .IR b . .TP .IB a " -ot " b True if file .I a is older than (modified before) file .IR b . .TP .IB f " -older " t True if file .I f is older than (modified before) time .IR t . If .I t is a integer followed by the letters .BR y (years), .BR M (months), .BR d (days), .BR h (hours), .BR m (minutes), or .BR s (seconds), it represents current time minus the specified time. If there is no letter, it represents seconds since epoch. You can also concatenate mixed units. For example, .B 3d12h means three days and twelve hours ago. .PD .PP These primaries may be combined with the following operators: .TP "\w'\fL( \fIexpr\fL )XX'u" .B ! unary negation operator .PD0 .TP .B -o binary .I or operator .TP .B -a binary .I and operator; higher precedence than .BR -o .TP .BI "( " expr " )" parentheses for grouping. .PD .PP The primitives .BR -b , .BR -u , .BR -g , and .BR -s return false; they are recognized for compatibility with POSIX. .PP Notice that all the operators and flags are separate arguments to .IR test . Notice also that parentheses and equal signs are meaningful to .I rc and must be enclosed in quotes. .SH EXAMPLES .I Test is a dubious way to check for specific character strings: it uses a process to do what an .IR rc (1) match or switch statement can do. The first example is not only inefficient but wrong, because .I test understands the purported string .B \&"-c" as an option. .IP .EX if (test $1 '=' "-c") echo OK # wrong! .EE .LP A better way is .IP .EX if (~ $1 -c) echo OK .EE .PP Test whether .L abc is in the current directory. .IP .B test -f abc -o -d abc .SH SOURCE .B \*9/src/cmd/test.c .SH "SEE ALSO" .IR rc (1) 9base-6/test/test.c0000644000175000017500000001322711402154555013655 0ustar anselmanselm/* * POSIX standard * test expression * [ expression ] * * Plan 9 additions: * -A file exists and is append-only * -L file exists and is exclusive-use * -T file exists and is temporary */ #include #include #define isatty plan9_isatty #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) int ap; int ac; char **av; char *tmp; void synbad(char *, char *); int fsizep(char *); int isdir(char *); int isreg(char *); int isatty(int); int isint(char *, int *); int isolder(char *, char *); int isolderthan(char *, char *); int isnewerthan(char *, char *); int hasmode(char *, ulong); int tio(char *, int); int e(void), e1(void), e2(void), e3(void); char *nxtarg(int); void main(int argc, char *argv[]) { int r; char *c; ac = argc; av = argv; ap = 1; if(EQ(argv[0],"[")) { if(!EQ(argv[--ac],"]")) synbad("] missing",""); } argv[ac] = 0; if (ac<=1) exits("usage"); r = e(); /* * nice idea but short-circuit -o and -a operators may have * not consumed their right-hand sides. */ if(0 && (c = nxtarg(1)) != nil) synbad("unexpected operator/operand: ", c); exits(r?0:"false"); } char * nxtarg(int mt) { if(ap>=ac){ if(mt){ ap++; return(0); } synbad("argument expected",""); } return(av[ap++]); } int nxtintarg(int *pans) { if(ap=ac) return(isatty(1)); else if(nxtintarg(&int1)) return(isatty(int1)); else synbad("not a valid file descriptor number ", ""); if(EQ(a, "-n")) return(!EQ(nxtarg(0), "")); if(EQ(a, "-z")) return(EQ(nxtarg(0), "")); p2 = nxtarg(1); if (p2==0) return(!EQ(a,"")); if(EQ(p2, "=")) return(EQ(nxtarg(0), a)); if(EQ(p2, "!=")) return(!EQ(nxtarg(0), a)); if(EQ(p2, "-older")) return(isolder(nxtarg(0), a)); if(EQ(p2, "-ot")) return(isolderthan(nxtarg(0), a)); if(EQ(p2, "-nt")) return(isnewerthan(nxtarg(0), a)); if(!isint(a, &int1)) synbad("unexpected operator/operand: ", p2); if(nxtintarg(&int2)){ if(EQ(p2, "-eq")) return(int1==int2); if(EQ(p2, "-ne")) return(int1!=int2); if(EQ(p2, "-gt")) return(int1>int2); if(EQ(p2, "-lt")) return(int1=int2); if(EQ(p2, "-le")) return(int1<=int2); } synbad("unknown operator ",p2); return 0; /* to shut ken up */ } int tio(char *a, int f) { return access (a, f) >= 0; } /* copy to local memory; clear names for safety */ int localstat(char *f, Dir *dir) { Dir *d; d = dirstat(f); if(d == nil) return(-1); *dir = *d; free(d); dir->name = 0; dir->uid = 0; dir->gid = 0; dir->muid = 0; return 0; } /* copy to local memory; clear names for safety */ int localfstat(int f, Dir *dir) { Dir *d; d = dirfstat(f); if(d == nil) return(-1); *dir = *d; free(d); dir->name = 0; dir->uid = 0; dir->gid = 0; dir->muid = 0; return 0; } int hasmode(char *f, ulong m) { Dir dir; if(localstat(f,&dir)<0) return(0); return(dir.mode&m); } int isdir(char *f) { Dir dir; if(localstat(f,&dir)<0) return(0); return(dir.mode&DMDIR); } int isreg(char *f) { Dir dir; if(localstat(f,&dir)<0) return(0); return(!(dir.mode&DMDIR)); } int isatty(int fd) { Dir d1, d2; if(localfstat(fd, &d1) < 0) return 0; if(localstat("/dev/cons", &d2) < 0) return 0; return d1.type==d2.type && d1.dev==d2.dev && d1.qid.path==d2.qid.path; } int fsizep(char *f) { Dir dir; if(localstat(f,&dir)<0) return(0); return(dir.length>0); } void synbad(char *s1, char *s2) { int len; write(2, "test: ", 6); if ((len = strlen(s1)) != 0) write(2, s1, len); if ((len = strlen(s2)) != 0) write(2, s2, len); write(2, "\n", 1); exits("bad syntax"); } int isint(char *s, int *pans) { char *ep; *pans = strtol(s, &ep, 0); return (*ep == 0); } int isolder(char *pin, char *f) { char *p = pin; ulong n, m; Dir dir; if(localstat(f,&dir)<0) return(0); /* parse time */ n = 0; while(*p){ m = strtoul(p, &p, 0); switch(*p){ case 0: n = m; break; case 'y': m *= 12; /* fall through */ case 'M': m *= 30; /* fall through */ case 'd': m *= 24; /* fall through */ case 'h': m *= 60; /* fall through */ case 'm': m *= 60; /* fall through */ case 's': n += m; p++; break; default: synbad("bad time syntax, ", pin); } } return(dir.mtime+n < time(0)); } int isolderthan(char *a, char *b) { Dir ad, bd; if(localstat(a, &ad)<0) return(0); if(localstat(b, &bd)<0) return(0); return ad.mtime > bd.mtime; } int isnewerthan(char *a, char *b) { Dir ad, bd; if(localstat(a, &ad)<0) return(0); if(localstat(b, &bd)<0) return(0); return ad.mtime < bd.mtime; } 9base-6/touch/0000755000175000017500000000000011402154555012670 5ustar anselmanselm9base-6/touch/Makefile0000644000175000017500000000017711402154555014335 0ustar anselmanselm# touch - touch unix port from plan9 # Depends on ../lib9 TARG = touch include ../std.mk pre-uninstall: post-install: 9base-6/touch/touch.c0000644000175000017500000000177111402154555014164 0ustar anselmanselm#include #include int touch(int, char *); ulong now; int tflag; void usage(void) { fprint(2, "usage: touch [-c] [-t time] files\n"); exits("usage"); } void main(int argc, char **argv) { int nocreate = 0; int status = 0; now = time(0); ARGBEGIN{ case 't': tflag = 1; now = strtoul(EARGF(usage()), 0, 0); break; case 'c': nocreate = 1; break; default: usage(); }ARGEND if(!*argv) usage(); while(*argv) status += touch(nocreate, *argv++); if(status) exits("touch"); exits(0); } int touch(int nocreate, char *name) { Dir stbuff; int fd; nulldir(&stbuff); stbuff.mtime = now; if(dirwstat(name, &stbuff) >= 0) return 0; if(nocreate){ fprint(2, "touch: %s: cannot wstat: %r\n", name); return 1; } if((fd = create(name, OREAD, 0666)) < 0) { fprint(2, "touch: %s: cannot create: %r\n", name); return 1; } if(tflag && dirfwstat(fd, &stbuff) < 0){ fprint(2, "touch: %s: cannot wstat: %r\n", name); close(fd); return 1; } close(fd); return 0; } 9base-6/touch/touch.10000644000175000017500000000071411402154555014076 0ustar anselmanselm.TH TOUCH 1 .SH NAME touch \- set modification date of a file .SH SYNOPSIS .B touch [ .B -c ] [ .B -t .I time ] .I file ... .SH DESCRIPTION .I Touch attempts to set the modification time of the .I files to .I time (by default, the current time). If a .I file does not exist, it will be created unless option .B -c is present. .SH SOURCE .B \*9/src/cmd/touch.c .SH SEE ALSO .IR ls (1), .IR stat (3), .IR chmod (1) .SH BUGS .I Touch will not touch directories. 9base-6/du/0000755000175000017500000000000011402154555012156 5ustar anselmanselm9base-6/du/Makefile0000644000175000017500000000016611402154555013621 0ustar anselmanselm# du - du unix port from plan9 # Depends on ../lib9 TARG = du include ../std.mk pre-uninstall: post-install: 9base-6/du/du.10000644000175000017500000000013611402154555012650 0ustar anselmanselm.TH DU 1 .SH NAME du .SH SYNOPSIS .B du .SH DESCRIPTION .I du .SH SOURCE .B \*9/src/cmd/du.c 9base-6/du/du.c0000644000175000017500000000603511402154555012736 0ustar anselmanselm#include #include extern vlong du(char*, Dir*); extern vlong k(vlong); extern void err(char*); extern int warn(char*); extern int seen(Dir*); int aflag; int fflag; int nflag; int sflag; int tflag; int uflag; int qflag; char *fmt = "%llud\t%s\n"; vlong blocksize = 1024LL; void main(int argc, char *argv[]) { int i; char *s, *ss; ARGBEGIN { case 'a': /* all files */ aflag = 1; break; case 's': /* only top level */ sflag = 1; break; case 'f': /* ignore errors */ fflag = 1; break; case 'n': /* all files, number of bytes */ aflag = 1; nflag = 1; break; case 't': /* return modified/accessed time */ tflag = 1; break; case 'u': /* accessed time */ uflag = 1; break; case 'q': /* qid */ fmt = "%.16llux\t%s\n"; qflag = 1; break; case 'b': /* block size */ s = ARGF(); if(s) { blocksize = strtoul(s, &ss, 0); if(s == ss) blocksize = 1; if(*ss == 'k') blocksize *= 1024; } break; } ARGEND if(argc==0) print(fmt, du(".", dirstat(".")), "."); else for(i=0; iqid.type&QTDIR) == 0) nk = k(dir->length); else{ nk = 0; while((n=dirread(fd, &buf)) > 0) { d = buf; for(i=0; iqid.type&QTDIR) == 0) { t = k(d->length); nk += t; if(aflag) { sprint(file, "%s/%s", name, d->name); if(tflag) { t = d->mtime; if(uflag) t = d->atime; } if(qflag) t = d->qid.path; print(fmt, t, file); } continue; } if(strcmp(d->name, ".") == 0 || strcmp(d->name, "..") == 0 || seen(d)) continue; sprint(file, "%s/%s", name, d->name); t = du(file, d); nk += t; if(tflag) { t = d->mtime; if(uflag) t = d->atime; } if(qflag) t = d->qid.path; if(!sflag) print(fmt, t, file); } free(buf); } if(n < 0) warn(name); } close(fd); if(tflag) { if(uflag) return dir->atime; return dir->mtime; } if(qflag) return dir->qid.path; return nk; } #define NCACHE 128 /* must be power of two */ typedef struct Cache Cache; struct Cache { Dir* cache; int n; int max; } cache[NCACHE]; int seen(Dir *dir) { Dir *dp; int i; Cache *c; c = &cache[dir->qid.path&(NCACHE-1)]; dp = c->cache; for(i=0; in; i++, dp++) if(dir->qid.path == dp->qid.path && dir->type == dp->type && dir->dev == dp->dev) return 1; if(c->n == c->max){ c->cache = realloc(c->cache, (c->max+=20)*sizeof(Dir)); if(c->cache == 0) err("malloc failure"); } c->cache[c->n++] = *dir; return 0; } void err(char *s) { fprint(2, "du: %s: %r\n", s); exits(s); } int warn(char *s) { if(fflag == 0) fprint(2, "du: %s: %r\n", s); return 0; } vlong k(vlong n) { if(nflag) return n; n = (n+blocksize-1)/blocksize; return n*blocksize/1024LL; } 9base-6/strings/0000755000175000017500000000000011402154555013237 5ustar anselmanselm9base-6/strings/strings.10000644000175000017500000000140511402154555015012 0ustar anselmanselm.TH STRINGS 1 .SH NAME strings \- extract printable strings .SH SYNOPSIS .B strings [ .I file ... ] .SH DESCRIPTION .I Strings finds and prints strings containing 6 or more consecutive printable UTF-encoded characters in a (typically) binary file, default standard input. Printable characters are taken to be .SM ASCII characters from blank through tilde (hexadecimal 20 through 7E), inclusive, and all other characters from value 00A0 to FFFF. Strings reports the decimal offset within the file at which the string starts and the text of the string. If the string is longer than 70 runes the line is terminated by three dots and the printing is resumed on the next line with the offset of the continuation line. .SH SOURCE .B \*9/src/cmd/strings.c .SH SEE ALSO .IR nm (1) 9base-6/strings/Makefile0000644000175000017500000000020511402154555014674 0ustar anselmanselm# strings - strings unix port from plan9 # Depends on ../lib9 TARG = strings include ../std.mk pre-uninstall: post-install: 9base-6/strings/strings.c0000644000175000017500000000235511402154555015101 0ustar anselmanselm#include #include #include Biobuf *fin; Biobuf fout; #define MINSPAN 6 /* Min characters in string */ #define BUFSIZE 70 void stringit(char *); #undef isprint #define isprint risprint int isprint(Rune); void main(int argc, char **argv) { int i; Binit(&fout, 1, OWRITE); if(argc < 2) { stringit("/dev/stdin"); exits(0); } for(i = 1; i < argc; i++) { if(argc > 2) print("%s:\n", argv[i]); stringit(argv[i]); } exits(0); } void stringit(char *str) { long posn, start; int cnt = 0; long c; Rune buf[BUFSIZE]; if ((fin = Bopen(str, OREAD)) == 0) { perror("open"); return; } start = 0; posn = Boffset(fin); while((c = Bgetrune(fin)) >= 0) { if(isprint(c)) { if(start == 0) start = posn; buf[cnt++] = c; if(cnt == BUFSIZE-1) { buf[cnt] = 0; Bprint(&fout, "%8ld: %S ...\n", start, buf); start = 0; cnt = 0; } } else { if(cnt >= MINSPAN) { buf[cnt] = 0; Bprint(&fout, "%8ld: %S\n", start, buf); } start = 0; cnt = 0; } posn = Boffset(fin); } if(cnt >= MINSPAN){ buf[cnt] = 0; Bprint(&fout, "%8ld: %S\n", start, buf); } Bterm(fin); } int isprint(Rune r) { if ((r >= ' ' && r <0x7f) || r > 0xA0) return 1; else return 0; } 9base-6/dd/0000755000175000017500000000000011402154555012135 5ustar anselmanselm9base-6/dd/dd.10000644000175000017500000000000011402154555012574 0ustar anselmanselm9base-6/dd/Makefile0000644000175000017500000000016611402154555013600 0ustar anselmanselm# dd - dd unix port from plan9 # Depends on ../lib9 TARG = dd include ../std.mk pre-uninstall: post-install: 9base-6/dd/dd.c0000644000175000017500000002652111402154555012676 0ustar anselmanselm#include #include #define BIG 2147483647 #define LCASE (1<<0) #define UCASE (1<<1) #define SWAB (1<<2) #define NERR (1<<3) #define SYNC (1<<4) int cflag; int fflag; char *string; char *ifile; char *ofile; char *ibuf; char *obuf; vlong skip; vlong oseekn; vlong iseekn; vlong count; long files = 1; long ibs = 512; long obs = 512; long bs; long cbs; long ibc; long obc; long cbc; long nifr; long nipr; long nofr; long nopr; long ntrunc; int dotrunc = 1; int ibf; int obf; char *op; int nspace; uchar etoa[256]; uchar atoe[256]; uchar atoibm[256]; void flsh(void); int match(char *s); vlong number(long big); void cnull(int cc); void null(int c); void ascii(int cc); void unblock(int cc); void ebcdic(int cc); void ibm(int cc); void block(int cc); void term(void); void stats(void); #define iskey(s) ((key[0] == '-') && (strcmp(key+1, s) == 0)) void main(int argc, char *argv[]) { void (*conv)(int); char *ip; char *key; int a, c; conv = null; for(c=1; c= argc){ fprint(2, "dd: arg %s needs a value\n", key); exits("arg"); } string = argv[c]; if(iskey("ibs")) { ibs = number(BIG); continue; } if(iskey("obs")) { obs = number(BIG); continue; } if(iskey("cbs")) { cbs = number(BIG); continue; } if(iskey("bs")) { bs = number(BIG); continue; } if(iskey("if")) { ifile = string; continue; } if(iskey("of")) { ofile = string; continue; } if(iskey("trunc")) { dotrunc = number(BIG); continue; } if(iskey("skip")) { skip = number(BIG); continue; } if(iskey("seek") || iskey("oseek")) { oseekn = number(BIG); continue; } if(iskey("iseek")) { iseekn = number(BIG); continue; } if(iskey("count")) { count = number(BIG); continue; } if(iskey("files")) { files = number(BIG); continue; } if(iskey("conv")) { cloop: if(match(",")) goto cloop; if(*string == '\0') continue; if(match("ebcdic")) { conv = ebcdic; goto cloop; } if(match("ibm")) { conv = ibm; goto cloop; } if(match("ascii")) { conv = ascii; goto cloop; } if(match("block")) { conv = block; goto cloop; } if(match("unblock")) { conv = unblock; goto cloop; } if(match("lcase")) { cflag |= LCASE; goto cloop; } if(match("ucase")) { cflag |= UCASE; goto cloop; } if(match("swab")) { cflag |= SWAB; goto cloop; } if(match("noerror")) { cflag |= NERR; goto cloop; } if(match("sync")) { cflag |= SYNC; goto cloop; } } fprint(2, "dd: bad arg: %s\n", key); exits("arg"); } if(conv == null && cflag&(LCASE|UCASE)) conv = cnull; if(ifile) ibf = open(ifile, 0); else ibf = dup(0, -1); if(ibf < 0) { fprint(2, "dd: open %s: %r\n", ifile); exits("open"); } if(ofile){ if(dotrunc) obf = create(ofile, 1, 0664); else obf = open(ofile, 1); if(obf < 0) { fprint(2, "dd: create %s: %r\n", ofile); exits("create"); } }else{ obf = dup(1, -1); if(obf < 0) { fprint(2, "dd: can't dup file descriptor: %s: %r\n", ofile); exits("dup"); } } if(bs) ibs = obs = bs; if(ibs == obs && conv == null) fflag++; if(ibs == 0 || obs == 0) { fprint(2, "dd: counts: cannot be zero\n"); exits("counts"); } ibuf = sbrk(ibs); if(fflag) obuf = ibuf; else obuf = sbrk(obs); sbrk(64); /* For good measure */ if(ibuf == (char *)-1 || obuf == (char *)-1) { fprint(2, "dd: not enough memory: %r\n"); exits("memory"); } ibc = 0; obc = 0; cbc = 0; op = obuf; /* if(signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, term); */ seek(obf, obs*oseekn, 1); seek(ibf, ibs*iseekn, 1); while(skip) { read(ibf, ibuf, ibs); skip--; } ip = 0; loop: if(ibc-- == 0) { ibc = 0; if(count==0 || nifr+nipr!=count) { if(cflag&(NERR|SYNC)) for(ip=ibuf+ibs; ip>ibuf;) *--ip = 0; ibc = read(ibf, ibuf, ibs); } if(ibc == -1) { perror("read"); if((cflag&NERR) == 0) { flsh(); term(); } ibc = 0; for(c=0; c>1) & ~1; if(cflag&SWAB && c) do { a = *ip++; ip[-1] = *ip; *ip++ = a; } while(--c); ip = ibuf; if(fflag) { obc = ibc; flsh(); ibc = 0; } goto loop; } c = 0; c |= *ip++; c &= 0377; (*conv)(c); goto loop; } void flsh(void) { int c; if(obc) { c = write(obf, obuf, obc); if(c != obc) { if(c > 0) ++nopr; perror("write"); term(); } if(obc == obs) nofr++; else nopr++; obc = 0; } } int match(char *s) { char *cs; cs = string; while(*cs++ == *s) if(*s++ == '\0') goto true; if(*s != '\0') return 0; true: cs--; string = cs; return 1; } vlong number(long big) { char *cs; vlong n; cs = string; n = 0; while(*cs >= '0' && *cs <= '9') n = n*10 + *cs++ - '0'; for(;;) switch(*cs++) { case 'k': n *= 1024; continue; /* case 'w': n *= sizeof(int); continue; */ case 'b': n *= 512; continue; /* case '*':*/ case 'x': string = cs; n *= number(BIG); case '\0': if(n>=big || n<0) { fprint(2, "dd: argument %lld out of range\n", n); exits("range"); } return n; } /* never gets here */ } void cnull(int cc) { int c; c = cc; if((cflag&UCASE) && c>='a' && c<='z') c += 'A'-'a'; if((cflag&LCASE) && c>='A' && c<='Z') c += 'a'-'A'; null(c); } void null(int c) { *op = c; op++; if(++obc >= obs) { flsh(); op = obuf; } } void ascii(int cc) { int c; c = etoa[cc]; if(cbs == 0) { cnull(c); return; } if(c == ' ') { nspace++; goto out; } while(nspace > 0) { null(' '); nspace--; } cnull(c); out: if(++cbc >= cbs) { null('\n'); cbc = 0; nspace = 0; } } void unblock(int cc) { int c; c = cc & 0377; if(cbs == 0) { cnull(c); return; } if(c == ' ') { nspace++; goto out; } while(nspace > 0) { null(' '); nspace--; } cnull(c); out: if(++cbc >= cbs) { null('\n'); cbc = 0; nspace = 0; } } void ebcdic(int cc) { int c; c = cc; if(cflag&UCASE && c>='a' && c<='z') c += 'A'-'a'; if(cflag&LCASE && c>='A' && c<='Z') c += 'a'-'A'; c = atoe[c]; if(cbs == 0) { null(c); return; } if(cc == '\n') { while(cbc < cbs) { null(atoe[' ']); cbc++; } cbc = 0; return; } if(cbc == cbs) ntrunc++; cbc++; if(cbc <= cbs) null(c); } void ibm(int cc) { int c; c = cc; if(cflag&UCASE && c>='a' && c<='z') c += 'A'-'a'; if(cflag&LCASE && c>='A' && c<='Z') c += 'a'-'A'; c = atoibm[c] & 0377; if(cbs == 0) { null(c); return; } if(cc == '\n') { while(cbc < cbs) { null(atoibm[' ']); cbc++; } cbc = 0; return; } if(cbc == cbs) ntrunc++; cbc++; if(cbc <= cbs) null(c); } void block(int cc) { int c; c = cc; if(cflag&UCASE && c>='a' && c<='z') c += 'A'-'a'; if(cflag&LCASE && c>='A' && c<='Z') c += 'a'-'A'; c &= 0377; if(cbs == 0) { null(c); return; } if(cc == '\n') { while(cbc < cbs) { null(' '); cbc++; } cbc = 0; return; } if(cbc == cbs) ntrunc++; cbc++; if(cbc <= cbs) null(c); } void term(void) { stats(); exits(0); } void stats(void) { fprint(2, "%lud+%lud records in\n", nifr, nipr); fprint(2, "%lud+%lud records out\n", nofr, nopr); if(ntrunc) fprint(2, "%lud truncated records\n", ntrunc); } uchar etoa[] = { 0000,0001,0002,0003,0234,0011,0206,0177, 0227,0215,0216,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0235,0205,0010,0207, 0030,0031,0222,0217,0034,0035,0036,0037, 0200,0201,0202,0203,0204,0012,0027,0033, 0210,0211,0212,0213,0214,0005,0006,0007, 0220,0221,0026,0223,0224,0225,0226,0004, 0230,0231,0232,0233,0024,0025,0236,0032, 0040,0240,0241,0242,0243,0244,0245,0246, 0247,0250,0133,0056,0074,0050,0053,0041, 0046,0251,0252,0253,0254,0255,0256,0257, 0260,0261,0135,0044,0052,0051,0073,0136, 0055,0057,0262,0263,0264,0265,0266,0267, 0270,0271,0174,0054,0045,0137,0076,0077, 0272,0273,0274,0275,0276,0277,0300,0301, 0302,0140,0072,0043,0100,0047,0075,0042, 0303,0141,0142,0143,0144,0145,0146,0147, 0150,0151,0304,0305,0306,0307,0310,0311, 0312,0152,0153,0154,0155,0156,0157,0160, 0161,0162,0313,0314,0315,0316,0317,0320, 0321,0176,0163,0164,0165,0166,0167,0170, 0171,0172,0322,0323,0324,0325,0326,0327, 0330,0331,0332,0333,0334,0335,0336,0337, 0340,0341,0342,0343,0344,0345,0346,0347, 0173,0101,0102,0103,0104,0105,0106,0107, 0110,0111,0350,0351,0352,0353,0354,0355, 0175,0112,0113,0114,0115,0116,0117,0120, 0121,0122,0356,0357,0360,0361,0362,0363, 0134,0237,0123,0124,0125,0126,0127,0130, 0131,0132,0364,0365,0366,0367,0370,0371, 0060,0061,0062,0063,0064,0065,0066,0067, 0070,0071,0372,0373,0374,0375,0376,0377, }; uchar atoe[] = { 0000,0001,0002,0003,0067,0055,0056,0057, 0026,0005,0045,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0074,0075,0062,0046, 0030,0031,0077,0047,0034,0035,0036,0037, 0100,0117,0177,0173,0133,0154,0120,0175, 0115,0135,0134,0116,0153,0140,0113,0141, 0360,0361,0362,0363,0364,0365,0366,0367, 0370,0371,0172,0136,0114,0176,0156,0157, 0174,0301,0302,0303,0304,0305,0306,0307, 0310,0311,0321,0322,0323,0324,0325,0326, 0327,0330,0331,0342,0343,0344,0345,0346, 0347,0350,0351,0112,0340,0132,0137,0155, 0171,0201,0202,0203,0204,0205,0206,0207, 0210,0211,0221,0222,0223,0224,0225,0226, 0227,0230,0231,0242,0243,0244,0245,0246, 0247,0250,0251,0300,0152,0320,0241,0007, 0040,0041,0042,0043,0044,0025,0006,0027, 0050,0051,0052,0053,0054,0011,0012,0033, 0060,0061,0032,0063,0064,0065,0066,0010, 0070,0071,0072,0073,0004,0024,0076,0341, 0101,0102,0103,0104,0105,0106,0107,0110, 0111,0121,0122,0123,0124,0125,0126,0127, 0130,0131,0142,0143,0144,0145,0146,0147, 0150,0151,0160,0161,0162,0163,0164,0165, 0166,0167,0170,0200,0212,0213,0214,0215, 0216,0217,0220,0232,0233,0234,0235,0236, 0237,0240,0252,0253,0254,0255,0256,0257, 0260,0261,0262,0263,0264,0265,0266,0267, 0270,0271,0272,0273,0274,0275,0276,0277, 0312,0313,0314,0315,0316,0317,0332,0333, 0334,0335,0336,0337,0352,0353,0354,0355, 0356,0357,0372,0373,0374,0375,0376,0377, }; uchar atoibm[] = { 0000,0001,0002,0003,0067,0055,0056,0057, 0026,0005,0045,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0074,0075,0062,0046, 0030,0031,0077,0047,0034,0035,0036,0037, 0100,0132,0177,0173,0133,0154,0120,0175, 0115,0135,0134,0116,0153,0140,0113,0141, 0360,0361,0362,0363,0364,0365,0366,0367, 0370,0371,0172,0136,0114,0176,0156,0157, 0174,0301,0302,0303,0304,0305,0306,0307, 0310,0311,0321,0322,0323,0324,0325,0326, 0327,0330,0331,0342,0343,0344,0345,0346, 0347,0350,0351,0255,0340,0275,0137,0155, 0171,0201,0202,0203,0204,0205,0206,0207, 0210,0211,0221,0222,0223,0224,0225,0226, 0227,0230,0231,0242,0243,0244,0245,0246, 0247,0250,0251,0300,0117,0320,0241,0007, 0040,0041,0042,0043,0044,0025,0006,0027, 0050,0051,0052,0053,0054,0011,0012,0033, 0060,0061,0032,0063,0064,0065,0066,0010, 0070,0071,0072,0073,0004,0024,0076,0341, 0101,0102,0103,0104,0105,0106,0107,0110, 0111,0121,0122,0123,0124,0125,0126,0127, 0130,0131,0142,0143,0144,0145,0146,0147, 0150,0151,0160,0161,0162,0163,0164,0165, 0166,0167,0170,0200,0212,0213,0214,0215, 0216,0217,0220,0232,0233,0234,0235,0236, 0237,0240,0252,0253,0254,0255,0256,0257, 0260,0261,0262,0263,0264,0265,0266,0267, 0270,0271,0272,0273,0274,0275,0276,0277, 0312,0313,0314,0315,0316,0317,0332,0333, 0334,0335,0336,0337,0352,0353,0354,0355, 0356,0357,0372,0373,0374,0375,0376,0377, }; 9base-6/diff/0000755000175000017500000000000011402154555012456 5ustar anselmanselm9base-6/diff/diff.10000644000175000017500000000561711402154555013461 0ustar anselmanselm.TH DIFF 1 .SH NAME diff \- differential file comparator .SH SYNOPSIS .B diff [ .B -acefmnbwr ] file1 ... file2 .SH DESCRIPTION .I Diff tells what lines must be changed in two files to bring them into agreement. If one file is a directory, then a file in that directory with basename the same as that of the other file is used. If both files are directories, similarly named files in the two directories are compared by the method of .I diff for text files and .IR cmp (1) otherwise. If more than two file names are given, then each argument is compared to the last argument as above. The .B -r option causes .I diff to process similarly named subdirectories recursively. When processing more than one file, .I diff prefixes file differences with a single line listing the two differing files, in the form of a .I diff command line. The .B -m flag causes this behavior even when processing single files. .PP The normal output contains lines of these forms: .IP "" 5 .I n1 .B a .I n3,n4 .br .I n1,n2 .B d .I n3 .br .I n1,n2 .B c .I n3,n4 .PP These lines resemble .I ed commands to convert .I file1 into .IR file2 . The numbers after the letters pertain to .IR file2 . In fact, by exchanging `a' for `d' and reading backward one may ascertain equally how to convert .I file2 into .IR file1 . As in .IR ed , identical pairs where .I n1 = .I n2 or .I n3 = .I n4 are abbreviated as a single number. .PP Following each of these lines come all the lines that are affected in the first file flagged by `<', then all the lines that are affected in the second file flagged by `>'. .PP The .B -b option causes trailing blanks (spaces and tabs) to be ignored and other strings of blanks to compare equal. The .B -w option causes all white-space to be removed from input lines before applying the difference algorithm. .PP The .B -n option prefixes each range with .IB file : \fR and inserts a space around the .BR a , .BR c , and .B d verbs. The .B -e option produces a script of .I "a, c" and .I d commands for the editor .IR ed , which will recreate .I file2 from .IR file1 . The .B -f option produces a similar script, not useful with .IR ed , in the opposite order. It may, however, be useful as input to a stream-oriented post-processor. .PP The .B -c option includes three lines of context around each change, merging changes whose contexts overlap. The .B -a flag displays the entire file as context. .PP Except in rare circumstances, .I diff finds a smallest sufficient set of file differences. .SH FILES .B /tmp/diff[12] .SH SOURCE .B \*9/src/cmd/diff .SH "SEE ALSO" .IR cmp (1), .IR comm (1), .IR ed (1) .SH DIAGNOSTICS Exit status is the empty string for no differences, .L some for some, and .L error for trouble. .SH BUGS Editing scripts produced under the .BR -e " or" .BR -f " option are naive about" creating lines consisting of a single `\fB.\fR'. .PP When running .I diff on directories, the notion of what is a text file is open to debate. 9base-6/diff/diffio.c0000644000175000017500000001473411402154555014073 0ustar anselmanselm#include #include #include #include #include "diff.h" struct line { int serial; int value; }; extern struct line *file[2]; extern int len[2]; extern long *ixold, *ixnew; extern int *J; static Biobuf *input[2]; static char *file1, *file2; static int firstchange; #define MAXLINELEN 4096 #define MIN(x, y) ((x) < (y) ? (x): (y)) static int readline(Biobuf *bp, char *buf) { int c; char *p, *e; p = buf; e = p + MAXLINELEN-1; do { c = Bgetc(bp); if (c < 0) { if (p == buf) return -1; break; } if (c == '\n') break; *p++ = c; } while (p < e); *p = 0; if (c != '\n' && c >= 0) { do c = Bgetc(bp); while (c >= 0 && c != '\n'); } return p - buf; } #define HALFLONG 16 #define low(x) (x&((1L<>HALFLONG) /* * hashing has the effect of * arranging line in 7-bit bytes and then * summing 1-s complement in 16-bit hunks */ static int readhash(Biobuf *bp, char *buf) { long sum; unsigned shift; char *p; int len, space; sum = 1; shift = 0; if ((len = readline(bp, buf)) == -1) return 0; p = buf; switch(bflag) /* various types of white space handling */ { case 0: while (len--) { sum += (long)*p++ << (shift &= (HALFLONG-1)); shift += 7; } break; case 1: /* * coalesce multiple white-space */ for (space = 0; len--; p++) { if (isspace((uchar)*p)) { space++; continue; } if (space) { shift += 7; space = 0; } sum += (long)*p << (shift &= (HALFLONG-1)); shift += 7; } break; default: /* * strip all white-space */ while (len--) { if (isspace((uchar)*p)) { p++; continue; } sum += (long)*p++ << (shift &= (HALFLONG-1)); shift += 7; } break; } sum = low(sum) + high(sum); return ((short)low(sum) + (short)high(sum)); } Biobuf * prepare(int i, char *arg) { struct line *p; int j, h; Biobuf *bp; char *cp, buf[MAXLINELEN]; int nbytes; Rune r; bp = Bopen(arg, OREAD); if (!bp) { panic(mflag ? 0: 2, "cannot open %s: %r\n", arg); return 0; } if (binary) return bp; nbytes = Bread(bp, buf, MIN(1024, MAXLINELEN)); if (nbytes > 0) { cp = buf; while (cp < buf+nbytes-UTFmax) { /* * heuristic for a binary file in the * brave new UNICODE world */ cp += chartorune(&r, cp); if (r == 0 || (r > 0x7f && r <= 0xa0)) { binary++; return bp; } } Bseek(bp, 0, 0); } p = MALLOC(struct line, 3); for (j = 0; h = readhash(bp, buf); p[j].value = h) p = REALLOC(p, struct line, (++j+3)); len[i] = j; file[i] = p; input[i] = bp; /*fix*/ if (i == 0) { /*fix*/ file1 = arg; firstchange = 0; } else file2 = arg; return bp; } static int squishspace(char *buf) { char *p, *q; int space; for (space = 0, q = p = buf; *q; q++) { if (isspace((uchar)*q)) { space++; continue; } if (space && bflag == 1) { *p++ = ' '; space = 0; } *p++ = *q; } *p = 0; return p - buf; } /* * need to fix up for unexpected EOF's */ void check(Biobuf *bf, Biobuf *bt) { int f, t, flen, tlen; char fbuf[MAXLINELEN], tbuf[MAXLINELEN]; ixold[0] = ixnew[0] = 0; for (f = t = 1; f < len[0]; f++) { flen = readline(bf, fbuf); ixold[f] = ixold[f-1] + flen + 1; /* ftell(bf) */ if (J[f] == 0) continue; do { tlen = readline(bt, tbuf); ixnew[t] = ixnew[t-1] + tlen + 1; /* ftell(bt) */ } while (t++ < J[f]); if (bflag) { flen = squishspace(fbuf); tlen = squishspace(tbuf); } if (flen != tlen || strcmp(fbuf, tbuf)) J[f] = 0; } while (t < len[1]) { tlen = readline(bt, tbuf); ixnew[t] = ixnew[t-1] + tlen + 1; /* fseek(bt) */ t++; } } static void range(int a, int b, char *separator) { Bprint(&stdout, "%d", a > b ? b: a); if (a < b) Bprint(&stdout, "%s%d", separator, b); } static void fetch(long *f, int a, int b, Biobuf *bp, char *s) { char buf[MAXLINELEN]; int maxb; if(a <= 1) a = 1; if(bp == input[0]) maxb = len[0]; else maxb = len[1]; if(b > maxb) b = maxb; if(a > maxb) return; Bseek(bp, f[a-1], 0); while (a++ <= b) { readline(bp, buf); Bprint(&stdout, "%s%s\n", s, buf); } } typedef struct Change Change; struct Change { int a; int b; int c; int d; }; Change *changes; int nchanges; void change(int a, int b, int c, int d) { char verb; char buf[4]; Change *ch; if (a > b && c > d) return; anychange = 1; if (mflag && firstchange == 0) { if(mode) { buf[0] = '-'; buf[1] = mode; buf[2] = ' '; buf[3] = '\0'; } else { buf[0] = '\0'; } Bprint(&stdout, "diff %s%s %s\n", buf, file1, file2); firstchange = 1; } verb = a > b ? 'a': c > d ? 'd': 'c'; switch(mode) { case 'e': range(a, b, ","); Bputc(&stdout, verb); break; case 0: range(a, b, ","); Bputc(&stdout, verb); range(c, d, ","); break; case 'n': Bprint(&stdout, "%s:", file1); range(a, b, ","); Bprint(&stdout, " %c ", verb); Bprint(&stdout, "%s:", file2); range(c, d, ","); break; case 'f': Bputc(&stdout, verb); range(a, b, " "); break; case 'c': case 'a': if(nchanges%1024 == 0) changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0])); ch = &changes[nchanges++]; ch->a = a; ch->b = b; ch->c = c; ch->d = d; return; } Bputc(&stdout, '\n'); if (mode == 0 || mode == 'n') { fetch(ixold, a, b, input[0], "< "); if (a <= b && c <= d) Bprint(&stdout, "---\n"); } fetch(ixnew, c, d, input[1], mode == 0 || mode == 'n' ? "> ": ""); if (mode != 0 && mode != 'n' && c <= d) Bprint(&stdout, ".\n"); } enum { Lines = 3 /* number of lines of context shown */ }; int changeset(int i) { while(i changes[i+1].a) i++; if(i len[0]) b = len[0]; if(d > len[1]) d = len[1]; if(mode == 'a'){ a = 1; b = len[0]; c = 1; d = len[1]; j = nchanges; } Bprint(&stdout, "%s:", file1); range(a, b, ","); Bprint(&stdout, " - "); Bprint(&stdout, "%s:", file2); range(c, d, ","); Bputc(&stdout, '\n'); at = a; for(; i #include #include #include "diff.h" /* diff - differential file comparison * * Uses an algorithm due to Harold Stone, which finds * a pair of longest identical subsequences in the two * files. * * The major goal is to generate the match vector J. * J[i] is the index of the line in file1 corresponding * to line i file0. J[i] = 0 if there is no * such line in file1. * * Lines are hashed so as to work in core. All potential * matches are located by sorting the lines of each file * on the hash (called value). In particular, this * collects the equivalence classes in file1 together. * Subroutine equiv replaces the value of each line in * file0 by the index of the first element of its * matching equivalence in (the reordered) file1. * To save space equiv squeezes file1 into a single * array member in which the equivalence classes * are simply concatenated, except that their first * members are flagged by changing sign. * * Next the indices that point into member are unsorted into * array class according to the original order of file0. * * The cleverness lies in routine stone. This marches * through the lines of file0, developing a vector klist * of "k-candidates". At step i a k-candidate is a matched * pair of lines x,y (x in file0 y in file1) such that * there is a common subsequence of lenght k * between the first i lines of file0 and the first y * lines of file1, but there is no such subsequence for * any smaller y. x is the earliest possible mate to y * that occurs in such a subsequence. * * Whenever any of the members of the equivalence class of * lines in file1 matable to a line in file0 has serial number * less than the y of some k-candidate, that k-candidate * with the smallest such y is replaced. The new * k-candidate is chained (via pred) to the current * k-1 candidate so that the actual subsequence can * be recovered. When a member has serial number greater * that the y of all k-candidates, the klist is extended. * At the end, the longest subsequence is pulled out * and placed in the array J by unravel. * * With J in hand, the matches there recorded are * check'ed against reality to assure that no spurious * matches have crept in due to hashing. If they have, * they are broken, and "jackpot " is recorded--a harmless * matter except that a true match for a spuriously * mated line may now be unnecessarily reported as a change. * * Much of the complexity of the program comes simply * from trying to minimize core utilization and * maximize the range of doable problems by dynamically * allocating what is needed and reusing what is not. * The core requirements for problems larger than somewhat * are (in words) 2*length(file0) + length(file1) + * 3*(number of k-candidates installed), typically about * 6n words for files of length n. */ /* TIDY THIS UP */ struct cand { int x; int y; int pred; } cand; struct line { int serial; int value; } *file[2], line; int len[2]; int binary; struct line *sfile[2]; /*shortened by pruning common prefix and suffix*/ int slen[2]; int pref, suff; /*length of prefix and suffix*/ int *class; /*will be overlaid on file[0]*/ int *member; /*will be overlaid on file[1]*/ int *klist; /*will be overlaid on file[0] after class*/ struct cand *clist; /* merely a free storage pot for candidates */ int clen; int *J; /*will be overlaid on class*/ long *ixold; /*will be overlaid on klist*/ long *ixnew; /*will be overlaid on file[1]*/ /* END OF SOME TIDYING */ static void sort(struct line *a, int n) /*shellsort CACM #201*/ { int m; struct line *ai, *aim, *j, *k; struct line w; int i; m = 0; for (i = 1; i <= n; i *= 2) m = 2*i - 1; for (m /= 2; m != 0; m /= 2) { k = a+(n-m); for (j = a+1; j <= k; j++) { ai = j; aim = ai+m; do { if (aim->value > ai->value || aim->value == ai->value && aim->serial > ai->serial) break; w = *ai; *ai = *aim; *aim = w; aim = ai; ai -= m; } while (ai > a && aim >= ai); } } } static void unsort(struct line *f, int l, int *b) { int *a; int i; a = MALLOC(int, (l+1)); for(i=1;i<=l;i++) a[f[i].serial] = f[i].value; for(i=1;i<=l;i++) b[i] = a[i]; FREE(a); } static void prune(void) { int i,j; for(pref=0;prefx = x; q->y = y; q->pred = pred; return clen++; } static int search(int *c, int k, int y) { int i, j, l; int t; if(clist[c[k]].y < y) /*quick look for typical case*/ return k+1; i = 0; j = k+1; while((l=(i+j)/2) > i) { t = clist[c[l]].y; if(t > y) j = l; else if(t < y) i = l; else return l; } return l+1; } static int stone(int *a, int n, int *b, int *c) { int i, k,y; int j, l; int oldc, tc; int oldl; k = 0; c[0] = newcand(0,0,0); for(i=1; i<=n; i++) { j = a[i]; if(j==0) continue; y = -b[j]; oldl = 0; oldc = c[0]; do { if(y <= clist[oldc].y) continue; l = search(c, k, y); if(l!=oldl+1) oldc = c[l-1]; if(l<=k) { if(clist[c[l]].y <= y) continue; tc = c[l]; c[l] = newcand(i,y,oldc); oldc = tc; oldl = l; } else { c[l] = newcand(i,y,oldc); k++; break; } } while((y=b[++j]) > 0); } return k; } static void unravel(int p) { int i; struct cand *q; for(i=0; i<=len[0]; i++) { if (i <= pref) J[i] = i; else if (i > len[0]-suff) J[i] = i+len[1]-len[0]; else J[i] = 0; } for(q=clist+p;q->y!=0;q=clist+q->pred) J[q->x+pref] = q->y+pref; } static void output(void) { int m, i0, i1, j0, j1; m = len[0]; J[0] = 0; J[m+1] = len[1]+1; if (mode != 'e') { for (i0 = 1; i0 <= m; i0 = i1+1) { while (i0 <= m && J[i0] == J[i0-1]+1) i0++; j0 = J[i0-1]+1; i1 = i0-1; while (i1 < m && J[i1+1] == 0) i1++; j1 = J[i1+1]-1; J[i1] = j1; change(i0, i1, j0, j1); } } else { for (i0 = m; i0 >= 1; i0 = i1-1) { while (i0 >= 1 && J[i0] == J[i0+1]-1 && J[i0]) i0--; j0 = J[i0+1]-1; i1 = i0+1; while (i1 > 1 && J[i1-1] == 0) i1--; j1 = J[i1-1]+1; J[i1] = j1; change(i1 , i0, j1, j0); } } if (m == 0) change(1, 0, 1, len[1]); flushchanges(); } #define BUF 4096 static int cmp(Biobuf* b1, Biobuf* b2) { int n; uchar buf1[BUF], buf2[BUF]; int f1, f2; vlong nc = 1; uchar *b1s, *b1e, *b2s, *b2e; f1 = Bfildes(b1); f2 = Bfildes(b2); seek(f1, 0, 0); seek(f2, 0, 0); b1s = b1e = buf1; b2s = b2e = buf2; for(;;){ if(b1s >= b1e){ if(b1s >= &buf1[BUF]) b1s = buf1; n = read(f1, b1s, &buf1[BUF] - b1s); b1e = b1s + n; } if(b2s >= b2e){ if(b2s >= &buf2[BUF]) b2s = buf2; n = read(f2, b2s, &buf2[BUF] - b2s); b2e = b2s + n; } n = b2e - b2s; if(n > b1e - b1s) n = b1e - b1s; if(n <= 0) break; if(memcmp((void *)b1s, (void *)b2s, n) != 0){ return 1; } nc += n; b1s += n; b2s += n; } if(b1e - b1s == b2e - b2s) return 0; return 1; } void diffreg(char *f, char *t) { Biobuf *b0, *b1; int k; binary = 0; b0 = prepare(0, f); if (!b0) return; b1 = prepare(1, t); if (!b1) { FREE(file[0]); Bterm(b0); return; } if (binary){ /* could use b0 and b1 but this is simpler. */ if (cmp(b0, b1)) print("binary files %s %s differ\n", f, t); Bterm(b0); Bterm(b1); return; } clen = 0; prune(); sort(sfile[0], slen[0]); sort(sfile[1], slen[1]); member = (int *)file[1]; equiv(sfile[0], slen[0], sfile[1], slen[1], member); member = REALLOC(member, int, slen[1]+2); class = (int *)file[0]; unsort(sfile[0], slen[0], class); class = REALLOC(class, int, slen[0]+2); klist = MALLOC(int, slen[0]+2); clist = MALLOC(struct cand, 1); k = stone(class, slen[0], member, klist); FREE(member); FREE(class); J = MALLOC(int, len[0]+2); unravel(klist[k]); FREE(clist); FREE(klist); ixold = MALLOC(long, len[0]+2); ixnew = MALLOC(long, len[1]+2); Bseek(b0, 0, 0); Bseek(b1, 0, 0); check(b0, b1); output(); FREE(J); FREE(ixold); FREE(ixnew); Bterm(b0); Bterm(b1); /* ++++ */ } 9base-6/diff/diffdir.c0000644000175000017500000000355411402154555014240 0ustar anselmanselm#include #include #include #include "diff.h" static int itemcmp(const void *v1, const void *v2) { char *const*d1 = v1, *const*d2 = v2; return strcmp(*d1, *d2); } static char ** scandir(char *name) { char **cp; Dir *db; int nitems; int fd, n; if ((fd = open(name, OREAD)) < 0){ panic(mflag ? 0 : 2, "can't open %s\n", name); return nil; } cp = 0; nitems = 0; if((n = dirreadall(fd, &db)) > 0){ while (n--) { cp = REALLOC(cp, char *, (nitems+1)); cp[nitems] = MALLOC(char, strlen((db+n)->name)+1); strcpy(cp[nitems], (db+n)->name); nitems++; } free(db); } cp = REALLOC(cp, char*, (nitems+1)); cp[nitems] = 0; close(fd); qsort((char *)cp, nitems, sizeof(char*), itemcmp); return cp; } static int isdotordotdot(char *p) { if (*p == '.') { if (!p[1]) return 1; if (p[1] == '.' && !p[2]) return 1; } return 0; } void diffdir(char *f, char *t, int level) { char **df, **dt, **dirf, **dirt; char *from, *to; int res; char fb[MAXPATHLEN+1], tb[MAXPATHLEN+1]; df = scandir(f); dt = scandir(t); dirf = df; dirt = dt; if(df == nil || dt == nil) goto Out; while (*df || *dt) { from = *df; to = *dt; if (from && isdotordotdot(from)) { df++; continue; } if (to && isdotordotdot(to)) { dt++; continue; } if (!from) res = 1; else if (!to) res = -1; else res = strcmp(from, to); if (res < 0) { if (mode == 0 || mode == 'n') Bprint(&stdout, "Only in %s: %s\n", f, from); df++; continue; } if (res > 0) { if (mode == 0 || mode == 'n') Bprint(&stdout, "Only in %s: %s\n", t, to); dt++; continue; } if (mkpathname(fb, f, from)) continue; if (mkpathname(tb, t, to)) continue; diff(fb, tb, level+1); df++; dt++; } Out: for (df = dirf; df && *df; df++) FREE(*df); for (dt = dirt; dt && *dt; dt++) FREE(*dt); FREE(dirf); FREE(dirt); } 9base-6/diff/Makefile0000644000175000017500000000147111402154555014121 0ustar anselmanselm# diff - diff shell unix port from plan9 # Depends on ../lib9 TARG = diff OFILES = diffdir.o diffio.o diffreg.o main.o MANFILES = diff.1 include ../config.mk all: ${TARG} @strip ${TARG} @echo built ${TARG} install: ${TARG} @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f ${TARG} ${DESTDIR}${PREFIX}/bin/ @chmod 755 ${DESTDIR}${PREFIX}/bin/${TARG} @mkdir -p ${DESTDIR}${MANPREFIX}/man1 @cp -f ${MANFILES} ${DESTDIR}${MANPREFIX}/man1 @chmod 444 ${DESTDIR}${MANPREFIX}/man1/${MANFILES} uninstall: rm -f ${DESTDIR}${PREFIX}/bin/${TARG} rm -f ${DESTDIR}${MANPREFIX}/man1/${MANFILES} .c.o: @echo CC $*.c @${CC} ${CFLAGS} -I../lib9 -I${PREFIX}/include -I../lib9 $*.c clean: rm -f ${OFILES} ${TARG} ${TARG}: ${OFILES} @echo LD ${TARG} @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L${PREFIX}/lib -L../lib9 -l9 9base-6/diff/main.c0000644000175000017500000001053711402154555013554 0ustar anselmanselm#include #include #include #include "diff.h" #define DIRECTORY(s) ((s)->qid.type&QTDIR) #define REGULAR_FILE(s) ((s)->type == 'M' && !DIRECTORY(s)) Biobuf stdout; static char *tmp[] = {"/tmp/diff1XXXXXXXXXXX", "/tmp/diff2XXXXXXXXXXX"}; static int whichtmp; static char *progname; static char usage[] = "diff [ -acefmnbwr ] file1 ... file2\n"; static void rmtmpfiles(void) { while (whichtmp > 0) { whichtmp--; remove(tmp[whichtmp]); } } void done(int status) { rmtmpfiles(); switch(status) { case 0: exits(""); case 1: exits("some"); default: exits("error"); } /*NOTREACHED*/ } void panic(int status, char *fmt, ...) { va_list arg; Bflush(&stdout); fprint(2, "%s: ", progname); va_start(arg, fmt); vfprint(2, fmt, arg); va_end(arg); if (status) done(status); /*NOTREACHED*/ } static int catch(void *a, char *msg) { USED(a); panic(2, msg); return 1; } int mkpathname(char *pathname, char *path, char *name) { if (strlen(path) + strlen(name) > MAXPATHLEN) { panic(0, "pathname %s/%s too long\n", path, name); return 1; } sprint(pathname, "%s/%s", path, name); return 0; } static char * mktmpfile(int input, Dir **sb) { int fd, i; char *p; char buf[8192]; atnotify(catch, 1); /* p = mktemp(tmp[whichtmp++]); fd = create(p, OWRITE, 0600); */ fd = mkstemp(p=tmp[whichtmp++]); if (fd < 0) { panic(mflag ? 0: 2, "cannot create %s: %r\n", p); return 0; } while ((i = read(input, buf, sizeof(buf))) > 0) { if ((i = write(fd, buf, i)) < 0) break; } *sb = dirfstat(fd); close(fd); if (i < 0) { panic(mflag ? 0: 2, "cannot read/write %s: %r\n", p); return 0; } return p; } static char * statfile(char *file, Dir **sb) { Dir *dir; int input; dir = dirstat(file); if(dir == nil) { if (strcmp(file, "-") || (dir = dirfstat(0)) == nil) { panic(mflag ? 0: 2, "cannot stat %s: %r\n", file); return 0; } free(dir); return mktmpfile(0, sb); } else if (!REGULAR_FILE(dir) && !DIRECTORY(dir)) { free(dir); if ((input = open(file, OREAD)) == -1) { panic(mflag ? 0: 2, "cannot open %s: %r\n", file); return 0; } file = mktmpfile(input, sb); close(input); } else *sb = dir; return file; } void diff(char *f, char *t, int level) { char *fp, *tp, *p, fb[MAXPATHLEN+1], tb[MAXPATHLEN+1]; Dir *fsb, *tsb; if ((fp = statfile(f, &fsb)) == 0) goto Return; if ((tp = statfile(t, &tsb)) == 0){ free(fsb); goto Return; } if (DIRECTORY(fsb) && DIRECTORY(tsb)) { if (rflag || level == 0) diffdir(fp, tp, level); else Bprint(&stdout, "Common subdirectories: %s and %s\n", fp, tp); } else if (REGULAR_FILE(fsb) && REGULAR_FILE(tsb)) diffreg(fp, tp); else { if (REGULAR_FILE(fsb)) { if ((p = utfrrune(f, '/')) == 0) p = f; else p++; if (mkpathname(tb, tp, p) == 0) diffreg(fp, tb); } else { if ((p = utfrrune(t, '/')) == 0) p = t; else p++; if (mkpathname(fb, fp, p) == 0) diffreg(fb, tp); } } free(fsb); free(tsb); Return: rmtmpfiles(); } void main(int argc, char *argv[]) { char *p; int i; Dir *fsb, *tsb; extern int _p9usepwlibrary; _p9usepwlibrary = 0; Binit(&stdout, 1, OWRITE); progname = *argv; while (--argc && (*++argv)[0] == '-' && (*argv)[1]) { for (p = *argv+1; *p; p++) { switch (*p) { case 'e': case 'f': case 'n': case 'c': case 'a': mode = *p; break; case 'w': bflag = 2; break; case 'b': bflag = 1; break; case 'r': rflag = 1; mflag = 1; break; case 'm': mflag = 1; break; case 'h': default: progname = "Usage"; panic(2, usage); } } } if (argc < 2) panic(2, usage, progname); if ((tsb = dirstat(argv[argc-1])) == nil) panic(2, "can't stat %s\n", argv[argc-1]); if (argc > 2) { if (!DIRECTORY(tsb)) panic(2, usage, progname); mflag = 1; } else { if ((fsb = dirstat(argv[0])) == nil) panic(2, "can't stat %s\n", argv[0]); if (DIRECTORY(fsb) && DIRECTORY(tsb)) mflag = 1; free(fsb); } free(tsb); for (i = 0; i < argc-1; i++) diff(argv[i], argv[argc-1], 0); done(anychange); /*NOTREACHED*/ } static char noroom[] = "out of memory - try diff -h\n"; void * emalloc(unsigned n) { register void *p; if ((p = malloc(n)) == 0) panic(2, noroom); return p; } void * erealloc(void *p, unsigned n) { register void *rp; if ((rp = realloc(p, n)) == 0) panic(2, noroom); return rp; } 9base-6/diff/diff.h0000644000175000017500000000146111402154555013541 0ustar anselmanselm#define stdout bstdout char mode; /* '\0', 'e', 'f', 'h' */ char bflag; /* ignore multiple and trailing blanks */ char rflag; /* recurse down directory trees */ char mflag; /* pseudo flag: doing multiple files, one dir */ int anychange; extern Biobuf stdout; extern int binary; #define MALLOC(t, n) ((t *)emalloc((n)*sizeof(t))) #define REALLOC(p, t, n) ((t *)erealloc((void *)(p), (n)*sizeof(t))) #define FREE(p) free((void *)(p)) #define MAXPATHLEN 1024 int mkpathname(char *, char *, char *); void *emalloc(unsigned); void *erealloc(void *, unsigned); void diff(char *, char *, int); void diffdir(char *, char *, int); void diffreg(char *, char *); Biobuf *prepare(int, char *); void panic(int, char *, ...); void check(Biobuf *, Biobuf *); void change(int, int, int, int); void flushchanges(void); 9base-6/cat/0000755000175000017500000000000011402154555012315 5ustar anselmanselm9base-6/cat/Makefile0000644000175000017500000000017111402154555013754 0ustar anselmanselm# cat - cat unix port from plan9 # Depends on ../lib9 TARG = cat include ../std.mk pre-uninstall: post-install: 9base-6/cat/cat.10000644000175000017500000000316411402154555013152 0ustar anselmanselm.TH CAT 1 .SH NAME cat, read, nobs \- catenate files .SH SYNOPSIS .B cat [ .I file ... ] .br .B read [ .B -m ] [ .B -n .I nline ] [ .I file ... ] .br .B nobs [ .I file ... ] .SH DESCRIPTION .I Cat reads each .I file in sequence and writes it on the standard output. Thus .IP .L cat file .LP prints a file and .IP .L cat file1 file2 >file3 .LP concatenates the first two files and places the result on the third. .PP If no .I file is given, .I cat reads from the standard input. Output is buffered in blocks matching the input. .PP .I Read copies to standard output exactly one line from the named .IR file , default standard input. It is useful in interactive .IR rc (1) scripts. .PP The .B -m flag causes it to continue reading and writing multiple lines until end of file; .B -n causes it to read no more than .I nline lines. .PP .I Read always executes a single .B write for each line of input, which can be helpful when preparing input to programs that expect line-at-a-time data. It never reads any more data from the input than it prints to the output. .PP .I Nobs copies the named files to standard output except that it removes all backspace characters and the characters that precede them. It is useful to use as .B $PAGER with the Unix version of .IR man (1) when run inside a .I win (see .IR acme (1)) window. .SH SOURCE .B \*9/src/cmd/cat.c .br .B \*9/src/cmd/read.c .br .B \*9/bin/nobs .SH SEE ALSO .IR cp (1) .SH DIAGNOSTICS .I Read exits with status .B eof on end of file or, in the .B -n case, if it doesn't read .I nlines lines. .SH BUGS Beware of .L "cat a b >a" and .LR "cat a b >b" , which destroy input files before reading them. 9base-6/cat/cat.c0000644000175000017500000000102411402154555013225 0ustar anselmanselm#include #include void cat(int f, char *s) { char buf[8192]; long n; while((n=read(f, buf, (long)sizeof buf))>0) if(write(1, buf, n)!=n) sysfatal("write error copying %s: %r", s); if(n < 0) sysfatal("error reading %s: %r", s); } void main(int argc, char *argv[]) { int f, i; argv0 = "cat"; if(argc == 1) cat(0, ""); else for(i=1; i #include #include /* Macros for Rune support of ctype.h-like functions */ #undef isupper #undef islower #undef isalpha #undef isdigit #undef isalnum #undef isspace #undef tolower #define isupper(r) ('A' <= (r) && (r) <= 'Z') #define islower(r) ('a' <= (r) && (r) <= 'z') #define isalpha(r) (isupper(r) || islower(r)) #define islatin1(r) (0xC0 <= (r) && (r) <= 0xFF) #define isdigit(r) ('0' <= (r) && (r) <= '9') #define isalnum(r) (isalpha(r) || isdigit(r)) #define isspace(r) ((r) == ' ' || (r) == '\t' \ || (0x0A <= (r) && (r) <= 0x0D)) #define tolower(r) ((r)-'A'+'a') #define sgn(v) ((v) < 0 ? -1 : ((v) > 0 ? 1 : 0)) #define WORDSIZ 4000 char *filename = "#9/lib/words"; Biobuf *dfile; Biobuf bout; Biobuf bin; int fold; int direc; int exact; int iflag; int rev = 1; /*-1 for reverse-ordered file, not implemented*/ int (*compare)(Rune*, Rune*); Rune tab = '\t'; Rune entry[WORDSIZ]; Rune word[WORDSIZ]; Rune key[50], orig[50]; Rune latin_fold_tab[] = { /* Table to fold latin 1 characters to ASCII equivalents based at Rune value 0xc0 À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ */ 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , 'o', 'u', 'u', 'u', 'u', 'y', 0 , 0 , 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 , 'o', 'u', 'u', 'u', 'u', 'y', 0 , 'y', }; int locate(void); int acomp(Rune*, Rune*); int getword(Biobuf*, Rune *rp, int n); void torune(char*, Rune*); void rcanon(Rune*, Rune*); int ncomp(Rune*, Rune*); void main(int argc, char *argv[]) { int n; filename = unsharp(filename); Binit(&bin, 0, OREAD); Binit(&bout, 1, OWRITE); compare = acomp; ARGBEGIN{ case 'd': direc++; break; case 'f': fold++; break; case 'i': iflag++; break; case 'n': compare = ncomp; break; case 't': chartorune(&tab,ARGF()); break; case 'x': exact++; break; default: fprint(2, "%s: bad option %c\n", argv0, ARGC()); fprint(2, "usage: %s -[dfinx] [-t c] [string] [file]\n", argv0); exits("usage"); } ARGEND if(!iflag){ if(argc >= 1) { torune(argv[0], orig); argv++; argc--; } else iflag++; } if(argc < 1) { direc++; fold++; } else filename = argv[0]; if (!iflag) rcanon(orig, key); dfile = Bopen(filename, OREAD); if(dfile == 0) { fprint(2, "look: can't open %s\n", filename); exits("no dictionary"); } if(!iflag) if(!locate()) exits("not found"); do { if(iflag) { Bflush(&bout); if(!getword(&bin, orig, sizeof(orig)/sizeof(orig[0]))) exits(0); rcanon(orig, key); if(!locate()) continue; } if (!exact || !acomp(word, key)) Bprint(&bout, "%S\n", entry); while(getword(dfile, entry, sizeof(entry)/sizeof(entry[0]))) { rcanon(entry, word); n = compare(key, word); switch(n) { case -1: if(exact) break; case 0: if (!exact || !acomp(word, orig)) Bprint(&bout, "%S\n", entry); continue; } break; } } while(iflag); exits(0); } int locate(void) { vlong top, bot, mid; int c; int n; bot = 0; top = Bseek(dfile, 0L, 2); for(;;) { mid = (top+bot) / 2; Bseek(dfile, mid, 0); do c = Bgetrune(dfile); while(c>=0 && c!='\n'); mid = Boffset(dfile); if(!getword(dfile, entry, sizeof(entry)/sizeof(entry[0]))) break; rcanon(entry, word); n = compare(key, word); switch(n) { case -2: case -1: case 0: if(top <= mid) break; top = mid; continue; case 1: case 2: bot = mid; continue; } break; } Bseek(dfile, bot, 0); while(getword(dfile, entry, sizeof(entry)/sizeof(entry[0]))) { rcanon(entry, word); n = compare(key, word); switch(n) { case -2: return 0; case -1: if(exact) return 0; case 0: return 1; case 1: case 2: continue; } } return 0; } /* * acomp(s, t) returns: * -2 if s strictly precedes t * -1 if s is a prefix of t * 0 if s is the same as t * 1 if t is a prefix of s * 2 if t strictly precedes s */ int acomp(Rune *s, Rune *t) { int cs, ct; for(;;) { cs = *s; ct = *t; if(cs != ct) break; if(cs == 0) return 0; s++; t++; } if(cs == 0) return -1; if(ct == 0) return 1; if(cs < ct) return -2; return 2; } void torune(char *old, Rune *new) { do old += chartorune(new, old); while(*new++); } void rcanon(Rune *old, Rune *new) { Rune r; while((r = *old++) && r != tab) { if (islatin1(r) && latin_fold_tab[r-0xc0]) r = latin_fold_tab[r-0xc0]; if(direc) if(!(isalnum(r) || r == ' ' || r == '\t')) continue; if(fold) if(isupper(r)) r = tolower(r); *new++ = r; } *new = 0; } int ncomp(Rune *s, Rune *t) { Rune *is, *it, *js, *jt; int a, b; int ssgn, tsgn; while(isspace(*s)) s++; while(isspace(*t)) t++; ssgn = tsgn = -2*rev; if(*s == '-') { s++; ssgn = -ssgn; } if(*t == '-') { t++; tsgn = -tsgn; } for(is = s; isdigit(*is); is++) ; for(it = t; isdigit(*it); it++) ; js = is; jt = it; a = 0; if(ssgn == tsgn) while(it>t && is>s) if(b = *--it - *--is) a = b; while(is > s) if(*--is != '0') return -ssgn; while(it > t) if(*--it != '0') return tsgn; if(a) return sgn(a)*ssgn; if(*(s=js) == '.') s++; if(*(t=jt) == '.') t++; if(ssgn == tsgn) while(isdigit(*s) && isdigit(*t)) if(a = *t++ - *s++) return sgn(a)*ssgn; while(isdigit(*s)) if(*s++ != '0') return -ssgn; while(isdigit(*t)) if(*t++ != '0') return tsgn; return 0; } int getword(Biobuf *f, Rune *rp, int n) { long c; while(n-- > 0) { c = Bgetrune(f); if(c < 0) return 0; if(c == '\n') { *rp = '\0'; return 1; } *rp++ = c; } fprint(2, "Look: word too long. Bailing out.\n"); return 0; } 9base-6/bc/0000755000175000017500000000000011402154555012132 5ustar anselmanselm9base-6/bc/Makefile0000644000175000017500000000025611402154555013575 0ustar anselmanselm# bc - bc unix port from plan9 # Depends on ../lib9 TARG = bc OFILES = y.tab.o YFILES = bc.y MANFILES = bc.1 include ../yacc.mk # Solaris #LDFLAGS += -dy -lxnet 9base-6/bc/bc.10000644000175000017500000000725411402154555012610 0ustar anselmanselm.TH BC 1 .SH NAME bc \- arbitrary-precision arithmetic language .SH SYNOPSIS .B bc [ .B -c ] [ .B -l ] [ .B -s ] [ .I file ... ] .SH DESCRIPTION .I Bc is an interactive processor for a language that resembles C but provides arithmetic on numbers of arbitrary length with up to 100 digits right of the decimal point. It takes input from any files given, then reads the standard input. The .B -l argument stands for the name of an arbitrary precision math library. The .B -s argument suppresses the automatic display of calculation results; all output is via the .B print command. .PP The following syntax for .I bc programs is like that of C; .I L means letter .BR a - z , .I E means expression, .I S means statement. .TF length(E) .TP Lexical .RS .HP comments are enclosed in .B /* */ .HP newlines end statements .RE .TP Names .IP simple variables: .I L .br array elements: .IB L [ E ] .br The words .BR ibase , .BR obase , and .B scale .TP Other operands .IP arbitrarily long numbers with optional sign and decimal point. .RS .TP .BI ( E ) .TP .BI sqrt( E ) .TP .BI length( E ) number of significant decimal digits .TP .BI scale( E ) number of digits right of decimal point .TP .IB L ( E , ... ,\fIE\fP) function call .RE .TP Operators .RS .HP .B "+ - * / % ^\ " .RB ( % is remainder; .B ^ is power) .HP .B "++ --\ " .TP .B "== <= >= != < >" .TP .B "= += -= *= /= %= ^=" .RE .TP Statements .RS .br .I E .br .B { .I S .B ; \&... .B ; .I S .B } .br .B "print" .I E .br .B "if (" .I E .B ) .I S .br .B "while (" .I E .B ) .I S .br .B "for (" .I E .B ; .I E .B ; .I E .B ")" .I S .br null statement .br .B break .br .B quit .br \fL"\fRtext\fL"\fR .RE .TP Function definitions .RS .br .B define .I L .B ( .I L .B , \&... .B , .I L .B ){ .PD0 .br .B auto .I L .B , \&... .B , .I L .br .I S .B ; \&... .B ; .I S .br .B return .I E .LP .B } .RE .TP Functions in .B -l math library .RS .TP .BI s( x ) sine .TP .BI c( x ) cosine .TP .BI e( x ) exponential .TP .BI l( x ) log .TP .BI a( x ) arctangent .TP .BI j( "n, x" ) Bessel function .RE .PP .DT All function arguments are passed by value. .PD .PP The value of an expression at the top level is printed unless the main operator is an assignment or the .B -s command line argument is given. Text in quotes, which may include newlines, is always printed. Either semicolons or newlines may separate statements. Assignment to .B scale influences the number of digits to be retained on arithmetic operations in the manner of .IR dc (1). Assignments to .B ibase or .B obase set the input and output number radix respectively. .PP The same letter may be used as an array, a function, and a simple variable simultaneously. All variables are global to the program. Automatic variables are pushed down during function calls. In a declaration of an array as a function argument or automatic variable empty square brackets must follow the array name. .PP .I Bc is actually a preprocessor for .IR dc (1), which it invokes automatically, unless the .B -c (compile only) option is present. In this case the .I dc input is sent to the standard output instead. .SH EXAMPLE Define a function to compute an approximate value of the exponential. Use it to print 10 values. (The exponential function in the library gives better answers.) .PP .EX scale = 20 define e(x) { auto a, b, c, i, s a = 1 b = 1 s = 1 for(i=1; 1; i++) { a *= x b *= i c = a/b if(c == 0) return s s += c } } for(i=1; i<=10; i++) print e(i) .EE .SH FILES .B \*9/lib/bclib mathematical library .SH SOURCE .B \*9/src/cmd/bc.y .SH "SEE ALSO" .IR dc (1), .IR hoc (1) .SH BUGS No .LR && , .LR || , or .L ! operators. .PP A .L for statement must have all three .LR E s. .PP A .L quit is interpreted when read, not when executed. 9base-6/bc/bc.y0000644000175000017500000003216111402154555012713 0ustar anselmanselm%{ #include #include #include #define bsp_max 5000 Biobuf *in; Biobuf bstdin; Biobuf bstdout; char cary[1000]; char* cp = { cary }; char string[1000]; char* str = { string }; int crs = 128; int rcrs = 128; /* reset crs */ int bindx = 0; int lev = 0; int ln; char* ttp; char* ss = ""; int bstack[10] = { 0 }; char* numb[15] = { " 0", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " 10", " 11", " 12", " 13", " 14" }; char* pre; char* post; long peekc = -1; int sargc; int ifile; char** sargv; char *funtab[] = { "<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>" }; char *atab[] = { "<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>" }; char* letr[26] = { "a","b","c","d","e","f","g","h","i","j", "k","l","m","n","o","p","q","r","s","t", "u","v","w","x","y","z" }; char* dot = { "." }; char* bspace[bsp_max]; char** bsp_nxt = bspace; int bdebug = 0; int lflag; int cflag; int sflag; char* bundle(int, ...); void conout(char*, char*); int cpeek(int, int, int); int getch(void); char* geta(char*); char* getf(char*); void getout(void); void output(char*); void pp(char*); void routput(char*); void tp(char*); void yyerror(char*, ...); int yyparse(void); typedef void* pointer; #pragma varargck type "lx" pointer %} %union { char* cptr; int cc; } %type pstat stat stat1 def slist dlets e ase nase %type slist re fprefix cargs eora cons constant lora %type crs %token LETTER EQOP _AUTO DOT %token DIGIT SQRT LENGTH _IF FFF EQ %token _PRINT _WHILE _FOR NE LE GE INCR DECR %token _RETURN _BREAK _DEFINE BASE OBASE SCALE %token QSTR ERROR %right '=' EQOP %left '+' '-' %left '*' '/' '%' %right '^' %left UMINUS %% start: start stuff | stuff stuff: pstat tail { output($1); } | def dargs ')' '{' dlist slist '}' { ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q"); conout(ttp, (char*)$1); rcrs = crs; output(""); lev = bindx = 0; } dlist: tail | dlist _AUTO dlets tail stat: stat1 | nase { if(sflag) bundle(2, $1, "s."); } pstat: stat1 { if(sflag) bundle(2, $1, "0"); } | nase { if(!sflag) bundle(2, $1, "ps."); } stat1: { bundle(1, ""); } | ase { bundle(2, $1, "s."); } | SCALE '=' e { bundle(2, $3, "k"); } | SCALE EQOP e { bundle(4, "K", $3, $2, "k"); } | BASE '=' e { bundle(2, $3, "i"); } | BASE EQOP e { bundle(4, "I", $3, $2, "i"); } | OBASE '=' e { bundle(2, $3, "o"); } | OBASE EQOP e { bundle(4, "O", $3, $2, "o"); } | QSTR { bundle(3, "[", $1, "]P"); } | _BREAK { bundle(2, numb[lev-bstack[bindx-1]], "Q"); } | _PRINT e { bundle(2, $2, "ps."); } | _RETURN e { bundle(4, $2, post, numb[lev], "Q"); } | _RETURN { bundle(4, "0", post, numb[lev], "Q"); } | '{' slist '}' { $$ = $2; } | FFF { bundle(1, "fY"); } | _IF crs BLEV '(' re ')' stat { conout($7, $2); bundle(3, $5, $2, " "); } | _WHILE crs '(' re ')' stat BLEV { bundle(3, $6, $4, $2); conout($$, $2); bundle(3, $4, $2, " "); } | fprefix crs re ';' e ')' stat BLEV { bundle(5, $7, $5, "s.", $3, $2); conout($$, $2); bundle(5, $1, "s.", $3, $2, " "); } | '~' LETTER '=' e { bundle(3, $4, "S", $2); } fprefix: _FOR '(' e ';' { $$ = $3; } BLEV: = { --bindx; } slist: stat | slist tail stat { bundle(2, $1, $3); } tail: '\n' { ln++; } | ';' re: e EQ e { $$ = bundle(3, $1, $3, "="); } | e '<' e { bundle(3, $1, $3, ">"); } | e '>' e { bundle(3, $1, $3, "<"); } | e NE e { bundle(3, $1, $3, "!="); } | e GE e { bundle(3, $1, $3, "!>"); } | e LE e { bundle(3, $1, $3, "!<"); } | e { bundle(2, $1, " 0!="); } nase: '(' e ')' { $$ = $2; } | cons { bundle(3, " ", $1, " "); } | DOT cons { bundle(3, " .", $2, " "); } | cons DOT cons { bundle(5, " ", $1, ".", $3, " "); } | cons DOT { bundle(4, " ", $1, ".", " "); } | DOT { $$ = "l."; } | LETTER '[' e ']' { bundle(3, $3, ";", geta($1)); } | LETTER INCR { bundle(4, "l", $1, "d1+s", $1); } | INCR LETTER { bundle(4, "l", $2, "1+ds", $2); } | DECR LETTER { bundle(4, "l", $2, "1-ds", $2); } | LETTER DECR { bundle(4, "l", $1, "d1-s", $1); } | LETTER '[' e ']' INCR { bundle(7, $3, ";", geta($1), "d1+" ,$3, ":" ,geta($1)); } | INCR LETTER '[' e ']' { bundle(7, $4, ";", geta($2), "1+d", $4, ":", geta($2)); } | LETTER '[' e ']' DECR { bundle(7, $3, ";", geta($1), "d1-", $3, ":", geta($1)); } | DECR LETTER '[' e ']' { bundle(7, $4, ";", geta($2), "1-d", $4, ":" ,geta($2)); } | SCALE INCR { bundle(1, "Kd1+k"); } | INCR SCALE { bundle(1, "K1+dk"); } | SCALE DECR { bundle(1, "Kd1-k"); } | DECR SCALE { bundle(1, "K1-dk"); } | BASE INCR { bundle(1, "Id1+i"); } | INCR BASE { bundle(1, "I1+di"); } | BASE DECR { bundle(1, "Id1-i"); } | DECR BASE { bundle(1, "I1-di"); } | OBASE INCR { bundle(1, "Od1+o"); } | INCR OBASE { bundle(1, "O1+do"); } | OBASE DECR { bundle(1, "Od1-o"); } | DECR OBASE { bundle(1, "O1-do"); } | LETTER '(' cargs ')' { bundle(4, $3, "l", getf($1), "x"); } | LETTER '(' ')' { bundle(3, "l", getf($1), "x"); } | LETTER = { bundle(2, "l", $1); } | LENGTH '(' e ')' { bundle(2, $3, "Z"); } | SCALE '(' e ')' { bundle(2, $3, "X"); } | '?' { bundle(1, "?"); } | SQRT '(' e ')' { bundle(2, $3, "v"); } | '~' LETTER { bundle(2, "L", $2); } | SCALE { bundle(1, "K"); } | BASE { bundle(1, "I"); } | OBASE { bundle(1, "O"); } | '-' e { bundle(3, " 0", $2, "-"); } | e '+' e { bundle(3, $1, $3, "+"); } | e '-' e { bundle(3, $1, $3, "-"); } | e '*' e { bundle(3, $1, $3, "*"); } | e '/' e { bundle(3, $1, $3, "/"); } | e '%' e { bundle(3, $1, $3, "%%"); } | e '^' e { bundle(3, $1, $3, "^"); } ase: LETTER '=' e { bundle(3, $3, "ds", $1); } | LETTER '[' e ']' '=' e { bundle(5, $6, "d", $3, ":", geta($1)); } | LETTER EQOP e { bundle(6, "l", $1, $3, $2, "ds", $1); } | LETTER '[' e ']' EQOP e { bundle(9, $3, ";", geta($1), $6, $5, "d", $3, ":", geta($1)); } e: ase | nase cargs: eora | cargs ',' eora { bundle(2, $1, $3); } eora: e | LETTER '[' ']' { bundle(2, "l", geta($1)); } cons: constant { *cp++ = 0; } constant: '_' { $$ = cp; *cp++ = '_'; } | DIGIT { $$ = cp; *cp++ = $1; } | constant DIGIT { *cp++ = $2; } crs: = { $$ = cp; *cp++ = '<'; *cp++ = crs/100+'0'; *cp++ = (crs%100)/10+'0'; *cp++ = crs%10+'0'; *cp++ = '>'; *cp++ = '\0'; if(crs++ >= 220) { yyerror("program too big"); getout(); } bstack[bindx++] = lev++; } def: _DEFINE LETTER '(' { $$ = getf($2); pre = (char*)""; post = (char*)""; lev = 1; bindx = 0; bstack[bindx] = 0; } dargs: | lora { pp((char*)$1); } | dargs ',' lora { pp((char*)$3); } dlets: lora { tp((char*)$1); } | dlets ',' lora { tp((char*)$3); } lora: LETTER { $$=$1; } | LETTER '[' ']' { $$ = geta($1); } %% int yylex(void) { int c, ch; restart: c = getch(); peekc = -1; while(c == ' ' || c == '\t') c = getch(); if(c == '\\') { getch(); goto restart; } if(c >= 'a' && c <= 'z') { /* look ahead to look for reserved words */ peekc = getch(); if(peekc >= 'a' && peekc <= 'z') { /* must be reserved word */ if(c=='p' && peekc=='r') { c = _PRINT; goto skip; } if(c=='i' && peekc=='f') { c = _IF; goto skip; } if(c=='w' && peekc=='h') { c = _WHILE; goto skip; } if(c=='f' && peekc=='o') { c = _FOR; goto skip; } if(c=='s' && peekc=='q') { c = SQRT; goto skip; } if(c=='r' && peekc=='e') { c = _RETURN; goto skip; } if(c=='b' && peekc=='r') { c = _BREAK; goto skip; } if(c=='d' && peekc=='e') { c = _DEFINE; goto skip; } if(c=='s' && peekc=='c') { c = SCALE; goto skip; } if(c=='b' && peekc=='a') { c = BASE; goto skip; } if(c=='i' && peekc=='b') { c = BASE; goto skip; } if(c=='o' && peekc=='b') { c = OBASE; goto skip; } if(c=='d' && peekc=='i') { c = FFF; goto skip; } if(c=='a' && peekc=='u') { c = _AUTO; goto skip; } if(c=='l' && peekc=='e') { c = LENGTH; goto skip; } if(c=='q' && peekc=='u') getout(); /* could not be found */ return ERROR; skip: /* skip over rest of word */ peekc = -1; for(;;) { ch = getch(); if(ch < 'a' || ch > 'z') break; } peekc = ch; return c; } /* usual case; just one single letter */ yylval.cptr = letr[c-'a']; return LETTER; } if((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { yylval.cc = c; return DIGIT; } switch(c) { case '.': return DOT; case '*': yylval.cptr = "*"; return cpeek('=', EQOP, c); case '%': yylval.cptr = "%%"; return cpeek('=', EQOP, c); case '^': yylval.cptr = "^"; return cpeek('=', EQOP, c); case '+': ch = cpeek('=', EQOP, c); if(ch == EQOP) { yylval.cptr = "+"; return ch; } return cpeek('+', INCR, c); case '-': ch = cpeek('=', EQOP, c); if(ch == EQOP) { yylval.cptr = "-"; return ch; } return cpeek('-', DECR, c); case '=': return cpeek('=', EQ, '='); case '<': return cpeek('=', LE, '<'); case '>': return cpeek('=', GE, '>'); case '!': return cpeek('=', NE, '!'); case '/': ch = cpeek('=', EQOP, c); if(ch == EQOP) { yylval.cptr = "/"; return ch; } if(peekc == '*') { peekc = -1; for(;;) { ch = getch(); if(ch == '*') { peekc = getch(); if(peekc == '/') { peekc = -1; goto restart; } } } } return c; case '"': yylval.cptr = str; while((c=getch()) != '"'){ *str++ = c; if(str >= &string[999]){ yyerror("string space exceeded"); getout(); } } *str++ = 0; return QSTR; default: return c; } } int cpeek(int c, int yes, int no) { peekc = getch(); if(peekc == c) { peekc = -1; return yes; } return no; } int getch(void) { long ch; loop: ch = peekc; if(ch < 0){ if(in == 0) ch = -1; else ch = Bgetc(in); } peekc = -1; if(ch >= 0) return ch; ifile++; if(ifile >= sargc) { if(ifile >= sargc+1) getout(); in = &bstdin; Binit(in, 0, OREAD); ln = 0; goto loop; } if(in) Bterm(in); if((in = Bopen(sargv[ifile], OREAD)) != 0){ ln = 0; ss = sargv[ifile]; goto loop; } fprint(2, "open %s: %r\n", sargv[ifile]); yyerror("cannot open input file"); return 0; /* shut up ken */ } char* bundle(int a, ...) { int i; char **q; va_list arg; i = a; va_start(arg, a); q = bsp_nxt; if(bdebug) fprint(2, "bundle %d elements at %lx\n", i, q); while(i-- > 0) { if(bsp_nxt >= &bspace[bsp_max]) yyerror("bundling space exceeded"); *bsp_nxt++ = va_arg(arg, char*); } *bsp_nxt++ = 0; va_end(arg); yyval.cptr = (char*)q; return (char*)q; } void routput(char *p) { char **pp; if(bdebug) fprint(2, "routput(%lx)\n", p); if((char**)p >= &bspace[0] && (char**)p < &bspace[bsp_max]) { /* part of a bundle */ pp = (char**)p; while(*pp != 0) routput(*pp++); } else Bprint(&bstdout, p); /* character string */ } void output(char *p) { routput(p); bsp_nxt = &bspace[0]; Bprint(&bstdout, "\n"); Bflush(&bstdout); cp = cary; crs = rcrs; } void conout(char *p, char *s) { Bprint(&bstdout, "["); routput(p); Bprint(&bstdout, "]s%s\n", s); Bflush(&bstdout); lev--; } void yyerror(char *s, ...) { if(ifile > sargc) ss = "teletype"; Bprint(&bstdout, "c[%s:%d, %s]pc\n", s, ln+1, ss); Bflush(&bstdout); cp = cary; crs = rcrs; bindx = 0; lev = 0; bsp_nxt = &bspace[0]; } void pp(char *s) { /* puts the relevant stuff on pre and post for the letter s */ bundle(3, "S", s, pre); pre = yyval.cptr; bundle(4, post, "L", s, "s."); post = yyval.cptr; } void tp(char *s) { /* same as pp, but for temps */ bundle(3, "0S", s, pre); pre = yyval.cptr; bundle(4, post, "L", s, "s."); post = yyval.cptr; } void yyinit(int argc, char **argv) { Binit(&bstdout, 1, OWRITE); sargv = argv; sargc = argc; if(sargc == 0) { in = &bstdin; Binit(in, 0, OREAD); } else if((in = Bopen(sargv[0], OREAD)) == 0) yyerror("cannot open input file"); ifile = 0; ln = 0; ss = sargv[0]; } void getout(void) { Bprint(&bstdout, "q"); Bflush(&bstdout); exits(0); } char* getf(char *p) { return funtab[*p - 'a']; } char* geta(char *p) { return atab[*p - 'a']; } void main(int argc, char **argv) { int p[2]; ARGBEGIN{ case 'd': bdebug++; break; case 'c': cflag++; break; case 'l': lflag++; break; case 's': sflag++; break; default: fprint(2, "Usage: bc [-l] [-c] [file ...]\n"); exits("usage"); }ARGEND if(lflag) { argc++; argv--; *argv = unsharp("#9/lib/bclib"); } if(cflag) { yyinit(argc, argv); for(;;) yyparse(); exits(0); } pipe(p); if(fork() == 0) { dup(p[1], 1); close(p[0]); close(p[1]); yyinit(argc, argv); for(;;) yyparse(); } dup(p[0], 0); close(p[0]); close(p[1]); execl(unsharp("#9/bin/dc"), "dc", nil); } 9base-6/seq/0000755000175000017500000000000011402154555012336 5ustar anselmanselm9base-6/seq/seq.c0000644000175000017500000000271211402154555013274 0ustar anselmanselm#include #include double min = 1.0; double max = 0.0; double incr = 1.0; int constant = 0; int nsteps; char *format; void usage(void) { fprint(2, "usage: seq [-fformat] [-w] [first [incr]] last\n"); exits("usage"); } void buildfmt(void) { int i; char *dp; int w, p, maxw, maxp; static char fmt[16]; char buf[32]; format = "%g\n"; if(!constant) return; maxw = 0; maxp = 0; for(i=0; i<=nsteps; i++){ sprint(buf, "%g", min+i*incr); if(strchr(buf, 'e')!=0) return; dp = strchr(buf,'.'); w = dp==0? strlen(buf): dp-buf; p = dp==0? 0: strlen(strchr(buf,'.')+1); if(w>maxw) maxw = w; if(p>maxp) maxp = p; } if(maxp > 0) maxw += maxp+1; sprint(fmt,"%%%d.%df\n", maxw, maxp); format = fmt; } void main(int argc, char *argv[]){ int i, j, n; char buf[256], ffmt[4096]; ARGBEGIN{ case 'w': constant++; break; case 'f': format = ARGF(); if(format[strlen(format)-1] != '\n'){ sprint(ffmt, "%s\n", format); format = ffmt; } break; default: goto out; }ARGEND out: if(argc<1 || argc>3) usage(); max = atof(argv[argc-1]); if(argc > 1) min = atof(argv[0]); if(argc > 2) incr = atof(argv[1]); if(incr == 0){ fprint(2, "seq: zero increment\n"); exits("zero increment"); } nsteps = (max-min)/incr+.5; if(!format) buildfmt(); for(i=0; i<=nsteps; i++){ n = sprint(buf, format, min+i*incr); if(constant) for(j=0; buf[j]==' '; j++) buf[j] ='0'; write(1, buf, n); } exits(0); } 9base-6/seq/Makefile0000644000175000017500000000017111402154555013775 0ustar anselmanselm# seq - seq unix port from plan9 # Depends on ../lib9 TARG = seq include ../std.mk pre-uninstall: post-install: 9base-6/seq/seq.10000644000175000017500000000215211402154555013210 0ustar anselmanselm.TH SEQ 1 .SH NAME seq \- print sequences of numbers .SH SYNOPSIS .B seq [ .B -w ] [ .BI -f format ] [ .I first [ .I incr ] ] .I last .SH DESCRIPTION .I Seq prints a sequence of numbers, one per line, from .I first (default 1) to as near .I last as possible, in increments of .I incr (default 1). The loop is: .sp .EX for(val = min; val <= max; val += incr) print val; .EE .sp The numbers are interpreted as floating point. .PP Normally integer values are printed as decimal integers. The options are .TP "\w'\fL-f \fIformat\fLXX'u" .BI -f format Use the .IR print (3)-style .I format .IR print for printing each (floating point) number. The default is .LR %g . .TP .B -w Equalize the widths of all numbers by padding with leading zeros as necessary. Not effective with option .BR -f , nor with numbers in exponential notation. .SH EXAMPLES .TP .L seq 0 .05 .1 Print .BR "0 0.05 0.1" (on separate lines). .TP .L seq -w 0 .05 .1 Print .BR "0.00 0.05 0.10" . .SH SOURCE .B \*9/src/cmd/seq.c .SH BUGS Option .B -w always surveys every value in advance. Thus .L seq -w 1000000000 is a painful way to get an `infinite' sequence. 9base-6/ls/0000755000175000017500000000000011402154555012164 5ustar anselmanselm9base-6/ls/ls.10000644000175000017500000000574511402154555012677 0ustar anselmanselm.TH LS 1 .SH NAME ls, lc \- list contents of directory .SH SYNOPSIS .B ls [ .B -dlmnpqrstuFQ ] .I name ... .PP .B lc [ .B -dlmnpqrstuFQ ] .I name ... .SH DESCRIPTION For each directory argument, .I ls lists the contents of the directory; for each file argument, .I ls repeats its name and any other information requested. When no argument is given, the current directory is listed. By default, the output is sorted alphabetically by name. .PP .I Lc is the same as .IR ls , but sets the .B -p option and pipes the output through .IR mc (1). .PP There are a number of options: .TP .B -d If argument is a directory, list it, not its contents. .TP .B -l List in long format, giving mode (see below), file system type (e.g., for devices, the .B # code letter that names it; see .IR intro (3)), the instance or subdevice number, owner, group, size in bytes, and time of last modification for each file. .TP .B -m List the name of the user who most recently modified the file. .TP .B -n Don't sort the listing. .TP .B -p Print only the final path element of each file name. .TP .B -q List the .I qid (see .IR stat (3)) of each file; the printed fields are in the order path, version, and type. .TP .B -r Reverse the order of sort. .TP .B -s Give size in Kbytes for each entry. .TP .B -t Sort by time modified (latest first) instead of by name. .TP .B -u Under .B -t sort by time of last access; under .B -l print time of last access. .TP .B -F Add the character .B / after all directory names and the character .B * after all executable files. .TP .B -L Print the character .B t before each file if it has the temporary flag set, and .B - otherwise. .TP .B -Q By default, printed file names are quoted if they contain characters special to .IR rc (1). The .B -Q flag disables this behavior. .PP The mode printed under the .B -l option contains 11 characters, interpreted as follows: the first character is .TP .B d if the entry is a directory; .TP .B a if the entry is an append-only file; .TP .B D if the entry is a Unix device; .TP .B L if the entry is a symbolic link; .TP .B P if the entry is a named pipe; .TP .B S if the entry is a socket; .TP .B - if the entry is a plain file. .PD .PP The next letter is .B l if the file is exclusive access (one writer or reader at a time). .PP The last 9 characters are interpreted as three sets of three bits each. The first set refers to owner permissions; the next to permissions to others in the same user-group; and the last to all others. Within each set the three characters indicate permission respectively to read, to write, or to execute the file as a program. For a directory, `execute' permission is interpreted to mean permission to search the directory for a specified file. The permissions are indicated as follows: .TP 3 .B r if the file is readable; .PD 0 .TP 3 .B w if the file is writable; .TP 3 .B x if the file is executable; .TP 3 .B - if none of the above permissions is granted. .PD .SH SOURCE .B \*9/src/cmd/ls.c .br .B \*9/bin/lc .SH SEE ALSO .IR stat (3), .IR mc (1) 9base-6/ls/Makefile0000644000175000017500000000017011402154555013622 0ustar anselmanselm# ls - ls unix port from plan9 # # Depends on ../lib9 TARG = ls include ../std.mk pre-uninstall: post-install: 9base-6/ls/ls.c0000644000175000017500000001251111402154555012746 0ustar anselmanselm#include #include #include #define dirbuf p9dirbuf /* avoid conflict on sun */ typedef struct NDir NDir; struct NDir { Dir *d; char *prefix; }; int errs = 0; int dflag; int lflag; int mflag; int nflag; int pflag; int qflag; int Qflag; int rflag; int sflag; int tflag; int uflag; int Fflag; int ndirbuf; int ndir; NDir* dirbuf; int ls(char*, int); int compar(NDir*, NDir*); char* asciitime(long); char* darwx(long); void rwx(long, char*); void growto(long); void dowidths(Dir*); void format(Dir*, char*); void output(void); ulong clk; int swidth; /* max width of -s size */ int qwidth; /* max width of -q version */ int vwidth; /* max width of dev */ int uwidth; /* max width of userid */ int mwidth; /* max width of muid */ int glwidth; /* max width of groupid and length */ Biobuf bin; void main(int argc, char *argv[]) { int i; Binit(&bin, 1, OWRITE); ARGBEGIN{ case 'F': Fflag++; break; case 'd': dflag++; break; case 'l': lflag++; break; case 'm': mflag++; break; case 'n': nflag++; break; case 'p': pflag++; break; case 'q': qflag++; break; case 'Q': Qflag++; break; case 'r': rflag++; break; case 's': sflag++; break; case 't': tflag++; break; case 'u': uflag++; break; default: fprint(2, "usage: ls [-dlmnpqrstuFQ] [file ...]\n"); exits("usage"); }ARGEND doquote = needsrcquote; quotefmtinstall(); fmtinstall('M', dirmodefmt); if(lflag) clk = time(0); if(argc == 0) errs = ls(".", 0); else for(i=0; iqid.type&QTDIR && dflag==0){ free(db); db = nil; output(); fd = open(s, OREAD); if(fd == -1) goto error; n = dirreadall(fd, &db); if(n < 0) goto error; growto(ndir+n); for(i=0; iname = strdup(p+1); } ndir++; } return 0; } void output(void) { int i; char buf[4096]; char *s; if(!nflag) qsort(dirbuf, ndir, sizeof dirbuf[0], (int (*)(const void*, const void*))compar); for(i=0; iname); format(dirbuf[i].d, buf); } else format(dirbuf[i].d, dirbuf[i].d->name); } ndir = 0; Bflush(&bin); } void dowidths(Dir *db) { char buf[256]; int n; if(sflag) { n = sprint(buf, "%llud", (db->length+1023)/1024); if(n > swidth) swidth = n; } if(qflag) { n = sprint(buf, "%lud", db->qid.vers); if(n > qwidth) qwidth = n; } if(mflag) { n = snprint(buf, sizeof buf, "[%s]", db->muid); if(n > mwidth) mwidth = n; } if(lflag) { n = sprint(buf, "%ud", db->dev); if(n > vwidth) vwidth = n; n = strlen(db->uid); if(n > uwidth) uwidth = n; n = sprint(buf, "%llud", db->length); n += strlen(db->gid); if(n > glwidth) glwidth = n; } } char* fileflag(Dir *db) { if(Fflag == 0) return ""; if(QTDIR & db->qid.type) return "/"; if(0111 & db->mode) return "*"; return ""; } void format(Dir *db, char *name) { int i; if(sflag) Bprint(&bin, "%*llud ", swidth, (db->length+1023)/1024); if(mflag){ Bprint(&bin, "[%s] ", db->muid); for(i=2+strlen(db->muid); iqid.path, qwidth, db->qid.vers, db->qid.type); if(lflag) Bprint(&bin, "%M %C %*ud %*s %s %*llud %s ", db->mode, db->type, vwidth, db->dev, -uwidth, db->uid, db->gid, (int)(glwidth-strlen(db->gid)), db->length, asciitime(uflag? db->atime : db->mtime)); Bprint(&bin, Qflag? "%s%s\n" : "%q%s\n", name, fileflag(db)); } void growto(long n) { if(n <= ndirbuf) return; ndirbuf = n; dirbuf=(NDir *)realloc(dirbuf, ndirbuf*sizeof(NDir)); if(dirbuf == 0){ fprint(2, "ls: malloc fail\n"); exits("malloc fail"); } } int compar(NDir *a, NDir *b) { long i; Dir *ad, *bd; ad = a->d; bd = b->d; if(tflag){ if(uflag) i = bd->atime-ad->atime; else i = bd->mtime-ad->mtime; }else{ if(a->prefix && b->prefix){ i = strcmp(a->prefix, b->prefix); if(i == 0) i = strcmp(ad->name, bd->name); }else if(a->prefix){ i = strcmp(a->prefix, bd->name); if(i == 0) i = 1; /* a is longer than b */ }else if(b->prefix){ i = strcmp(ad->name, b->prefix); if(i == 0) i = -1; /* b is longer than a */ }else i = strcmp(ad->name, bd->name); } if(i == 0) i = (ad Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =================================================================== The Plan 9 software is provided under the terms of the Lucent Public License, Version 1.02, reproduced below, with the following notable exceptions: 1. No right is granted to create derivative works of or to redistribute (other than with the Plan 9 Operating System) the screen imprinter fonts identified in subdirectory /lib/font/bit/lucida and printer fonts (Lucida Sans Unicode, Lucida Sans Italic, Lucida Sans Demibold, Lucida Typewriter, Lucida Sans Typewriter83), identified in subdirectory /sys/lib/postscript/font. These directories contain material copyrights by B&H Inc. and Y&Y Inc. 2. The printer fonts identified in subdirectory /sys/lib/ghostscript/font are subject to the GNU GPL, reproduced in the file /LICENSE.gpl. 3. The ghostscript program in the subdirectory /sys/src/cmd/gs is covered by the Aladdin Free Public License, reproduced in the file /LICENSE.afpl. Other, less notable exceptions are marked in the file tree with COPYING, COPYRIGHT, or LICENSE files. =================================================================== Lucent Public License Version 1.02 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a. in the case of Lucent Technologies Inc. ("LUCENT"), the Original Program, and b. in the case of each Contributor, i. changes to the Program, and ii. additions to the Program; where such changes and/or additions to the Program were added to the Program by such Contributor itself or anyone acting on such Contributor's behalf, and the Contributor explicitly consents, in accordance with Section 3C, to characterization of the changes and/or additions as Contributions. "Contributor" means LUCENT and any other entity that has Contributed a Contribution to the Program. "Distributor" means a Recipient that distributes the Program, modifications to the Program, or any part thereof. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Original Program" means the original version of the software accompanying this Agreement as released by LUCENT, including source code, object code and documentation, if any. "Program" means the Original Program and Contributions or any part thereof "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. The patent license granted by a Contributor shall also apply to the combination of the Contribution of that Contributor and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license granted by a Contributor shall not apply to (i) any other combinations which include the Contribution, nor to (ii) Contributions of other Contributors. No hardware per se is licensed hereunder. c. Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d. Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A. Distributor may choose to distribute the Program in any form under this Agreement or under its own license agreement, provided that: a. it complies with the terms and conditions of this Agreement; b. if the Program is distributed in source code or other tangible form, a copy of this Agreement or Distributor's own license agreement is included with each copy of the Program; and c. if distributed under Distributor's own license agreement, such license agreement: i. effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii. effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; and iii. states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party. B. Each Distributor must include the following in a conspicuous location in the Program: Copyright (C) 2003, Lucent Technologies Inc. and others. All Rights Reserved. C. In addition, each Contributor must identify itself as the originator of its Contribution in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. Also, each Contributor must agree that the additions and/or changes are intended to be a Contribution. Once a Contribution is contributed, it may not thereafter be revoked. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Distributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for Contributors. Therefore, if a Distributor includes the Program in a commercial product offering, such Distributor ("Commercial Distributor") hereby agrees to defend and indemnify every Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively"Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Distributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Distributor in writing of such claim, and b) allow the Commercial Distributor to control, and cooperate with the Commercial Distributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Distributor might include the Program in a commercial product offering, Product X. That Distributor is then a Commercial Distributor. If that Commercial Distributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Distributor's responsibility alone. Under this section, the Commercial Distributor would have to defend claims against the Contributors related to those performance claims and warranties, and if a court requires any Contributor to pay any damages as a result, the Commercial Distributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. EXPORT CONTROL Recipient agrees that Recipient alone is responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries). 8. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. LUCENT may publish new versions (including revisions) of this Agreement from time to time. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. No one other than LUCENT has the right to modify this Agreement. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. 9base-6/sleep/0000755000175000017500000000000011402154555012656 5ustar anselmanselm9base-6/sleep/Makefile0000644000175000017500000000024111402154555014313 0ustar anselmanselm# sleep - sleep unix port from plan9 # Depends on ../lib9 TARG = sleep include ../std.mk # Solaris #LDFLAGS += -dy -lrt pre-uninstall: post-install: 9base-6/sleep/sleep.10000644000175000017500000000060411402154555014050 0ustar anselmanselm.TH SLEEP 1 .SH NAME sleep \- suspend execution for an interval .SH SYNOPSIS .B sleep .I time .SH DESCRIPTION .I Sleep suspends execution for .I time seconds. .SH EXAMPLES Execute a command 100 seconds hence. .IP .EX {sleep 100; command}& .EE .PP Repeat a command every 30 seconds. .IP .EX while (){ command sleep 30 } .EE .SH SOURCE .B \*9/src/cmd/sleep.c .SH "SEE ALSO" .IR sleep (3) 9base-6/sleep/sleep.c0000644000175000017500000000025211402154555014131 0ustar anselmanselm#include #include void main(int argc, char *argv[]) { long secs; if(argc>1) for(secs = atol(argv[1]); secs > 0; secs--) sleep(1000); exits(0); } 9base-6/primes/0000755000175000017500000000000011402154555013045 5ustar anselmanselm9base-6/primes/Makefile0000644000175000017500000000017511402154555014510 0ustar anselmanselm# primes - unix port from plan9 # # Depends on ../lib9 TARG = primes include ../std.mk pre-uninstall: post-install: 9base-6/primes/primes.10000644000175000017500000000000011402154555014414 0ustar anselmanselm9base-6/primes/primes.c0000644000175000017500000000411611402154555014512 0ustar anselmanselm#include #include #define ptsiz (sizeof(pt)/sizeof(pt[0])) #define whsiz (sizeof(wheel)/sizeof(wheel[0])) #define tabsiz (sizeof(table)/sizeof(table[0])) #define tsiz8 (tabsiz*8) double big = 9.007199254740992e15; int pt[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,101,103,107,109,113, 127,131,137,139,149,151,157,163,167,173, 179,181,191,193,197,199,211,223,227,229, }; double wheel[] = { 10, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 4, 2,10, 2, }; uchar table[1000]; uchar bittab[] = { 1, 2, 4, 8, 16, 32, 64, 128, }; void mark(double nn, long k); void ouch(void); void main(int argc, char *argp[]) { int i; double k, temp, v, limit, nn; if(argc <= 1) { fprint(2, "usage: primes starting [ending]\n"); exits("usage"); } nn = atof(argp[1]); limit = big; if(argc > 2) { limit = atof(argp[2]); if(limit < nn) exits(0); if(limit > big) ouch(); } if(nn < 0 || nn > big) ouch(); if(nn == 0) nn = 1; if(nn < 230) { for(i=0; i limit) exits(0); print("%d\n", pt[i]); if(limit >= big) exits(0); } nn = 230; } modf(nn/2, &temp); nn = 2.*temp + 1; /* * clear the sieve table. */ for(;;) { for(i=0; i= whsiz) i = 0; } /* * now get the primes from the table * and print them. */ for(i=0; i>3] & bittab[i&07]) continue; temp = nn + i; if(temp > limit) exits(0); print("%.0f\n", temp); if(limit >= big) exits(0); } nn += tsiz8; } } void mark(double nn, long k) { double t1; long j; modf(nn/k, &t1); j = k*t1 - nn; if(j < 0) j += k; for(; j>3] |= bittab[j&07]; } void ouch(void) { fprint(2, "limits exceeded\n"); exits("limits"); } 9base-6/std.mk0000644000175000017500000000144711402154555012677 0ustar anselmanselm# std.mk - included by most Makefiles in subdirs OFILES ?= ${TARG}.o MANFILE ?= ${TARG}.1 include ../config.mk all: ${TARG} @strip ${TARG} @echo built ${TARG} install: install-default post-install install-default: ${TARG} @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f ${TARG} ${DESTDIR}${PREFIX}/bin/ @chmod 755 ${DESTDIR}${PREFIX}/bin/${TARG} @mkdir -p ${DESTDIR}${MANPREFIX}/man1 @cp -f ${MANFILE} ${DESTDIR}${MANPREFIX}/man1 @chmod 444 ${DESTDIR}${MANPREFIX}/man1/${MANFILE} uninstall: pre-uninstall rm -f ${DESTDIR}${PREFIX}/bin/${TARG} rm -f ${DESTDIR}${MANPREFIX}/man1/${MANFILE} .c.o: @echo CC $*.c @${CC} ${CFLAGS} -I../lib9 -I../lib9/sec $*.c clean: rm -f ${OFILES} ${TARG} ${TARG}: ${OFILES} @echo LD ${TARG} @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -L../lib9 -l9 -lm 9base-6/yacc/0000755000175000017500000000000011402154555012465 5ustar anselmanselm9base-6/yacc/yacc.c0000644000175000017500000016304211402154555013556 0ustar anselmanselm#include #include #include #include #define Bungetrune Bungetc /* ok for now. */ /* * all these are 32 bit */ #define TBITSET ((32+NTERMS)/32) /* BOTCH?? +31 */ #define BIT(a,i) ((a)[(i)>>5] & (1<<((i)&037))) #define SETBIT(a,i) ((a)[(i)>>5] |= (1<<((i)&037))) #define NWORDS(n) (((n)+32)/32) char *PARSER = "#9/yacc/yaccpar"; char *PARSERS = "#9/yacc/yaccpars"; #define TEMPNAME "y.tmp.XXXXXX" #define ACTNAME "y.acts.XXXXXX" #define OFILE "tab.c" #define FILEU "output" #define FILED "tab.h" #define FILEDEBUG "debug" enum { /* * the following are adjustable * according to memory size */ ACTSIZE = 40000, MEMSIZE = 40000, NSTATES = 2000, NTERMS = 511, NPROD = 1600, NNONTERM = 600, TEMPSIZE = 2000, CNAMSZ = 10000, LSETSIZE = 2400, WSETSIZE = 350, NAMESIZE = 50, NTYPES = 63, ISIZE = 400, PRIVATE = 0xE000, /* unicode private use */ /* relationships which must hold: TBITSET ints must hold NTERMS+1 bits... WSETSIZE >= NNONTERM LSETSIZE >= NNONTERM TEMPSIZE >= NTERMS + NNONTERM + 1 TEMPSIZE >= NSTATES */ NTBASE = 010000, ERRCODE = 8190, ACCEPTCODE = 8191, NOASC = 0, /* no assoc. */ LASC = 1, /* left assoc. */ RASC = 2, /* right assoc. */ BASC = 3, /* binary assoc. */ /* flags for state generation */ DONE = 0, MUSTDO = 1, MUSTLOOKAHEAD = 2, /* flags for a rule having an action, and being reduced */ ACTFLAG = 04, REDFLAG = 010, /* output parser flags */ YYFLAG1 = -1000, /* parse tokens */ IDENTIFIER = PRIVATE, MARK, TERM, LEFT, RIGHT, BINARY, PREC, LCURLY, IDENTCOLON, NUMBER, START, TYPEDEF, TYPENAME, UNION, ENDFILE = 0, EMPTY = 1, WHOKNOWS = 0, OK = 1, NOMORE = -1000 }; /* macros for getting associativity and precedence levels */ #define ASSOC(i) ((i)&03) #define PLEVEL(i) (((i)>>4)&077) #define TYPE(i) (((i)>>10)&077) /* macros for setting associativity and precedence levels */ #define SETASC(i,j) i |= j #define SETPLEV(i,j) i |= (j<<4) #define SETTYPE(i,j) i |= (j<<10) /* looping macros */ #define TLOOP(i) for(i=1; i<=ntokens; i++) #define NTLOOP(i) for(i=0; i<=nnonter; i++) #define PLOOP(s,i) for(i=s; i= 0 && j < 256) { if(temp1[j]) { print("yacc bug -- cant have 2 different Ts with same value\n"); print(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name); nerrors++; } temp1[j] = i; if(j > c) c = j; } } warray("yytok1", temp1, c+1); /* table 2 has PRIVATE-PRIVATE+256 */ aryfil(temp1, 256, 0); c = 0; TLOOP(i) { j = tokset[i].value - PRIVATE; if(j >= 0 && j < 256) { if(temp1[j]) { print("yacc bug -- cant have 2 different Ts with same value\n"); print(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name); nerrors++; } temp1[j] = i; if(j > c) c = j; } } warray("yytok2", temp1, c+1); /* table 3 has everything else */ Bprint(ftable, "static\tconst\tlong yytok3[] =\n{\n"); c = 0; TLOOP(i) { j = tokset[i].value; if(j >= 0 && j < 256) continue; if(j >= PRIVATE && j < 256+PRIVATE) continue; Bprint(ftable, "%4d,%4d,", j, i); c++; if(c%5 == 0) Bprint(ftable, "\n"); } Bprint(ftable, "%4d\n};\n", 0); /* copy parser text */ while((c=Bgetrune(finput)) != Beof) { if(c == '$') { if((c = Bgetrune(finput)) != 'A') Bputrune(ftable, '$'); else { /* copy actions */ faction = Bopen(actname, OREAD); if(faction == 0) error("cannot reopen action tempfile"); while((c=Bgetrune(faction)) != Beof) Bputrune(ftable, c); Bterm(faction); ZAPFILE(actname); c = Bgetrune(finput); } } Bputrune(ftable, c); } Bterm(ftable); } /* * copies string q into p, returning next free char ptr */ char* chcopy(char* p, char* q) { int c; while(c = *q) { if(c == '"') *p++ = '\\'; *p++ = c; q++; } *p = 0; return p; } /* * creates output string for item pointed to by pp */ char* writem(int *pp) { int i,*p; static char sarr[ISIZE]; char* q; for(p=pp; *p>0; p++) ; p = prdptr[-*p]; q = chcopy(sarr, nontrst[*p-NTBASE].name); q = chcopy(q, ": "); for(;;) { *q = ' '; p++; if(p == pp) *q = '.'; q++; *q = '\0'; i = *p; if(i <= 0) break; q = chcopy(q, symnam(i)); if(q > &sarr[ISIZE-30]) error("item too big"); } /* an item calling for a reduction */ i = *pp; if(i < 0 ) { q = chcopy(q, " ("); sprint(q, "%d)", -i); } return sarr; } /* * return a pointer to the name of symbol i */ char* symnam(int i) { char* cp; cp = (i >= NTBASE)? nontrst[i-NTBASE].name: tokset[i].name; if(*cp == ' ') cp++; return cp; } /* * output the summary on y.output */ void summary(void) { if(foutput != 0) { Bprint(foutput, "\n%d/%d terminals, %d/%d nonterminals\n", ntokens, NTERMS, nnonter, NNONTERM); Bprint(foutput, "%d/%d grammar rules, %d/%d states\n", nprod, NPROD, nstate, NSTATES); Bprint(foutput, "%d shift/reduce, %d reduce/reduce conflicts reported\n", zzsrconf, zzrrconf); Bprint(foutput, "%d/%d working sets used\n", (int)(zzcwp-wsets), WSETSIZE); Bprint(foutput, "memory: states,etc. %d/%d, parser %d/%d\n", (int)(zzmemsz-mem0), MEMSIZE, (int)(memp-amem), ACTSIZE); Bprint(foutput, "%d/%d distinct lookahead sets\n", nlset, LSETSIZE); Bprint(foutput, "%d extra closures\n", zzclose - 2*nstate); Bprint(foutput, "%d shift entries, %d exceptions\n", zzacent, zzexcp); Bprint(foutput, "%d goto entries\n", zzgoent); Bprint(foutput, "%d entries saved by goto default\n", zzgobest); } if(zzsrconf != 0 || zzrrconf != 0) { print("\nconflicts: "); if(zzsrconf) print("%d shift/reduce", zzsrconf); if(zzsrconf && zzrrconf) print(", "); if(zzrrconf) print("%d reduce/reduce", zzrrconf); print("\n"); } if(ftemp != 0) { Bterm(ftemp); ftemp = 0; } if(fdefine != 0) { Bterm(fdefine); fdefine = 0; } } /* * write out error comment -- NEEDS WORK */ void error(char *s, ...) { va_list arg; nerrors++; fprint(2, "\n fatal error:"); va_start(arg, s); vfprint(2, s, arg); va_end(arg); fprint(2, ", %s:%d\n", infile, lineno); if(!fatfl) return; summary(); cleantmp(); exits("error"); } /* * set elements 0 through n-1 to c */ void aryfil(int *v, int n, int c) { int i; for(i=0; ilset; if(pp == 0) Bprint(foutput, "\tNULL"); else { Bprint(foutput, " { "); TLOOP(j) if(BIT(pp,j)) Bprint(foutput, "%s ", symnam(j)); Bprint(foutput, "}"); } } /* * compute an array with the beginnings of productions yielding given nonterminals * The array pres points to these lists * the array pyield has the lists: the total size is only NPROD+1 */ void cpres(void) { int c, j, i, **pmem; static int *pyield[NPROD]; pmem = pyield; NTLOOP(i) { c = i+NTBASE; pres[i] = pmem; fatfl = 0; /* make undefined symbols nonfatal */ PLOOP(0, j) if(*prdptr[j] == c) *pmem++ = prdptr[j]+1; if(pres[i] == pmem) error("nonterminal %s not defined!", nontrst[i].name); } pres[i] = pmem; fatfl = 1; if(nerrors) { summary(); cleantmp(); exits("error"); } if(pmem != &pyield[nprod]) error("internal Yacc error: pyield %d", pmem-&pyield[nprod]); } /* * compute an array with the first of nonterminals */ void cpfir(void) { int *p, **s, i, **t, ch, changes; zzcwp = &wsets[nnonter]; NTLOOP(i) { aryfil(wsets[i].ws.lset, tbitset, 0); t = pres[i+1]; /* initially fill the sets */ for(s=pres[i]; s 0; ++p) { if(ch < NTBASE) { SETBIT(wsets[i].ws.lset, ch); break; } if(!pempty[ch-NTBASE]) break; } } /* now, reflect transitivity */ changes = 1; while(changes) { changes = 0; NTLOOP(i) { t = pres[i+1]; for(s = pres[i]; s < t; ++s) for(p = *s; (ch = (*p-NTBASE)) >= 0; ++p) { changes |= setunion(wsets[i].ws.lset, wsets[ch].ws.lset); if(!pempty[ch]) break; } } } NTLOOP(i) pfirst[i] = flset(&wsets[i].ws); if(!indebug) return; if(foutput != 0) NTLOOP(i) { Bprint(foutput, "\n%s: ", nontrst[i].name); prlook(pfirst[i]); Bprint(foutput, " %d\n", pempty[i]); } } /* * sorts last state,and sees if it equals earlier ones. returns state number */ int state(int c) { Item *p1, *p2, *k, *l, *q1, *q2; int size1, size2, i; p1 = pstate[nstate]; p2 = pstate[nstate+1]; if(p1 == p2) return 0; /* null state */ /* sort the items */ for(k = p2-1; k > p1; k--) /* make k the biggest */ for(l = k-1; l >= p1; --l) if(l->pitem > k->pitem) { int *s; Lkset *ss; s = k->pitem; k->pitem = l->pitem; l->pitem = s; ss = k->look; k->look = l->look; l->look = ss; } size1 = p2 - p1; /* size of state */ for(i = (c>=NTBASE)? ntstates[c-NTBASE]: tstates[c]; i != 0; i = mstates[i]) { /* get ith state */ q1 = pstate[i]; q2 = pstate[i+1]; size2 = q2 - q1; if(size1 != size2) continue; k = p1; for(l = q1; l < q2; l++) { if(l->pitem != k->pitem) break; k++; } if(l != q2) continue; /* found it */ pstate[nstate+1] = pstate[nstate]; /* delete last state */ /* fix up lookaheads */ if(nolook) return i; for(l = q1, k = p1; l < q2; ++l, ++k ) { int s; SETLOOP(s) clset.lset[s] = l->look->lset[s]; if(setunion(clset.lset, k->look->lset)) { tystate[i] = MUSTDO; /* register the new set */ l->look = flset( &clset ); } } return i; } /* state is new */ if(nolook) error("yacc state/nolook error"); pstate[nstate+2] = p2; if(nstate+1 >= NSTATES) error("too many states"); if(c >= NTBASE) { mstates[nstate] = ntstates[c-NTBASE]; ntstates[c-NTBASE] = nstate; } else { mstates[nstate] = tstates[c]; tstates[c] = nstate; } tystate[nstate] = MUSTDO; return nstate++; } void putitem(int *ptr, Lkset *lptr) { Item *j; if(pidebug && foutput != 0) Bprint(foutput, "putitem(%s), state %d\n", writem(ptr), nstate); j = pstate[nstate+1]; j->pitem = ptr; if(!nolook) j->look = flset(lptr); pstate[nstate+1] = ++j; if((int*)j > zzmemsz) { zzmemsz = (int*)j; if(zzmemsz >= &mem0[MEMSIZE]) error("out of state space"); } } /* * mark nonterminals which derive the empty string * also, look for nonterminals which don't derive any token strings */ void cempty(void) { int i, *p; /* first, use the array pempty to detect productions that can never be reduced */ /* set pempty to WHONOWS */ aryfil(pempty, nnonter+1, WHOKNOWS); /* now, look at productions, marking nonterminals which derive something */ more: PLOOP(0, i) { if(pempty[*prdptr[i] - NTBASE]) continue; for(p = prdptr[i]+1; *p >= 0; ++p) if(*p >= NTBASE && pempty[*p-NTBASE] == WHOKNOWS) break; /* production can be derived */ if(*p < 0) { pempty[*prdptr[i]-NTBASE] = OK; goto more; } } /* now, look at the nonterminals, to see if they are all OK */ NTLOOP(i) { /* the added production rises or falls as the start symbol ... */ if(i == 0) continue; if(pempty[i] != OK) { fatfl = 0; error("nonterminal %s never derives any token string", nontrst[i].name); } } if(nerrors) { summary(); cleantmp(); exits("error"); } /* now, compute the pempty array, to see which nonterminals derive the empty string */ /* set pempty to WHOKNOWS */ aryfil( pempty, nnonter+1, WHOKNOWS); /* loop as long as we keep finding empty nonterminals */ again: PLOOP(1, i) { /* not known to be empty */ if(pempty[*prdptr[i]-NTBASE] == WHOKNOWS) { for(p = prdptr[i]+1; *p >= NTBASE && pempty[*p-NTBASE] == EMPTY ; ++p) ; /* we have a nontrivially empty nonterminal */ if(*p < 0) { pempty[*prdptr[i]-NTBASE] = EMPTY; /* got one ... try for another */ goto again; } } } } /* * generate the states */ void stagen(void) { int c, i, j, more; Wset *p, *q; /* initialize */ nstate = 0; /* THIS IS FUNNY from the standpoint of portability * it represents the magic moment when the mem0 array, which has * been holding the productions, starts to hold item pointers, of a * different type... * someday, alloc should be used to allocate all this stuff... for now, we * accept that if pointers don't fit in integers, there is a problem... */ pstate[0] = pstate[1] = (Item*)mem; aryfil(clset.lset, tbitset, 0); putitem(prdptr[0]+1, &clset); tystate[0] = MUSTDO; nstate = 1; pstate[2] = pstate[1]; aryfil(amem, ACTSIZE, 0); /* now, the main state generation loop */ for(more=1; more;) { more = 0; SLOOP(i) { if(tystate[i] != MUSTDO) continue; tystate[i] = DONE; aryfil(temp1, nnonter+1, 0); /* take state i, close it, and do gotos */ closure(i); /* generate goto's */ WSLOOP(wsets, p) { if(p->flag) continue; p->flag = 1; c = *(p->pitem); if(c <= 1) { if(pstate[i+1]-pstate[i] <= p-wsets) tystate[i] = MUSTLOOKAHEAD; continue; } /* do a goto on c */ WSLOOP(p, q) /* this item contributes to the goto */ if(c == *(q->pitem)) { putitem(q->pitem+1, &q->ws); q->flag = 1; } if(c < NTBASE) state(c); /* register new state */ else temp1[c-NTBASE] = state(c); } if(gsdebug && foutput != 0) { Bprint(foutput, "%d: ", i); NTLOOP(j) if(temp1[j]) Bprint(foutput, "%s %d, ", nontrst[j].name, temp1[j]); Bprint(foutput, "\n"); } indgo[i] = apack(&temp1[1], nnonter-1) - 1; /* do some more */ more = 1; } } } /* * generate the closure of state i */ void closure(int i) { Wset *u, *v; Item *p, *q; int c, ch, work, k, *pi, **s, **t; zzclose++; /* first, copy kernel of state i to wsets */ cwp = wsets; ITMLOOP(i, p, q) { cwp->pitem = p->pitem; cwp->flag = 1; /* this item must get closed */ SETLOOP(k) cwp->ws.lset[k] = p->look->lset[k]; WSBUMP(cwp); } /* now, go through the loop, closing each item */ work = 1; while(work) { work = 0; WSLOOP(wsets, u) { if(u->flag == 0) continue; /* dot is before c */ c = *(u->pitem); if(c < NTBASE) { u->flag = 0; /* only interesting case is where . is before nonterminal */ continue; } /* compute the lookahead */ aryfil(clset.lset, tbitset, 0); /* find items involving c */ WSLOOP(u, v) if(v->flag == 1 && *(pi=v->pitem) == c) { v->flag = 0; if(nolook) continue; while((ch = *++pi) > 0) { /* terminal symbol */ if(ch < NTBASE) { SETBIT(clset.lset, ch); break; } /* nonterminal symbol */ setunion(clset.lset, pfirst[ch-NTBASE]->lset); if(!pempty[ch-NTBASE]) break; } if(ch <= 0) setunion(clset.lset, v->ws.lset); } /* * now loop over productions derived from c * c is now nonterminal number */ c -= NTBASE; t = pres[c+1]; for(s = pres[c]; s < t; ++s) { /* * put these items into the closure * is the item there */ WSLOOP(wsets, v) /* yes, it is there */ if(v->pitem == *s) { if(nolook) goto nexts; if(setunion(v->ws.lset, clset.lset)) v->flag = work = 1; goto nexts; } /* not there; make a new entry */ if(cwp-wsets+1 >= WSETSIZE) error( "working set overflow"); cwp->pitem = *s; cwp->flag = 1; if(!nolook) { work = 1; SETLOOP(k) cwp->ws.lset[k] = clset.lset[k]; } WSBUMP(cwp); nexts:; } } } /* have computed closure; flags are reset; return */ if(cwp > zzcwp) zzcwp = cwp; if(cldebug && foutput != 0) { Bprint(foutput, "\nState %d, nolook = %d\n", i, nolook); WSLOOP(wsets, u) { if(u->flag) Bprint(foutput, "flag set!\n"); u->flag = 0; Bprint(foutput, "\t%s", writem(u->pitem)); prlook(&u->ws); Bprint(foutput, "\n"); } } } /* * decide if the lookahead set pointed to by p is known * return pointer to a perminent location for the set */ Lkset* flset(Lkset *p) { Lkset *q; int *u, *v, *w, j; for(q = &lkst[nlset]; q-- > lkst;) { u = p->lset; v = q->lset; w = &v[tbitset]; while(v < w) if(*u++ != *v++) goto more; /* we have matched */ return q; more:; } /* add a new one */ q = &lkst[nlset++]; if(nlset >= LSETSIZE) error("too many lookahead sets"); SETLOOP(j) q->lset[j] = p->lset[j]; return q; } void cleantmp(void) { ZAPFILE(actname); ZAPFILE(tempname); } void intr(void) { cleantmp(); exits("interrupted"); } void setup(int argc, char *argv[]) { long c, t; int i, j, fd, lev, ty, ytab, *p; int vflag, dflag, stem; char actnm[8], *stemc, *s, dirbuf[128]; Biobuf *fout; ytab = 0; vflag = 0; dflag = 0; stem = 0; stemc = "y"; foutput = 0; fdefine = 0; fdebug = 0; ARGBEGIN{ case 'v': case 'V': vflag++; break; case 'D': yydebug = ARGF(); break; case 'a': yyarg = 1; break; case 'd': dflag++; break; case 'l': yyline = 0; break; case 'o': ytab++; ytabc = ARGF(); break; case 's': stem++; stemc = ARGF(); break; case 'S': parser = PARSERS; break; default: error("illegal option: %c", ARGC()); }ARGEND openup(stemc, dflag, vflag, ytab, ytabc); fout = dflag?fdefine:ftable; if(yyarg){ Bprint(ftable, "#define\tYYARG\t1\n\n"); } if((fd = mkstemp(ttempname)) >= 0){ tempname = ttempname; ftemp = Bfdopen(fd, OWRITE); } if((fd = mkstemp(tactname)) >= 0){ actname = tactname; faction = Bfdopen(fd, OWRITE); } if(ftemp == 0 || faction == 0) error("cannot open temp file"); if(argc < 1) error("no input file"); infile = argv[0]; if(infile[0] != '/' && getwd(dirbuf, sizeof dirbuf)!=nil){ i = strlen(infile)+1+strlen(dirbuf)+1+10; s = malloc(i); if(s != nil){ snprint(s, i, "%s/%s", dirbuf, infile); cleanname(s); infile = s; } } finput = Bopen(infile, OREAD); if(finput == 0) error("cannot open '%s'", argv[0]); cnamp = cnames; defin(0, "$end"); extval = PRIVATE; /* tokens start in unicode 'private use' */ defin(0, "error"); defin(1, "$accept"); defin(0, "$unk"); mem = mem0; i = 0; for(t = gettok(); t != MARK && t != ENDFILE;) switch(t) { case ';': t = gettok(); break; case START: if(gettok() != IDENTIFIER) error("bad %%start construction"); start = chfind(1, tokname); t = gettok(); continue; case TYPEDEF: if(gettok() != TYPENAME) error("bad syntax in %%type"); ty = numbval; for(;;) { t = gettok(); switch(t) { case IDENTIFIER: if((t=chfind(1, tokname)) < NTBASE) { j = TYPE(toklev[t]); if(j != 0 && j != ty) error("type redeclaration of token %s", tokset[t].name); else SETTYPE(toklev[t], ty); } else { j = nontrst[t-NTBASE].value; if(j != 0 && j != ty) error("type redeclaration of nonterminal %s", nontrst[t-NTBASE].name ); else nontrst[t-NTBASE].value = ty; } case ',': continue; case ';': t = gettok(); default: break; } break; } continue; case UNION: /* copy the union declaration to the output */ cpyunion(); t = gettok(); continue; case LEFT: case BINARY: case RIGHT: i++; case TERM: /* nonzero means new prec. and assoc. */ lev = t-TERM; ty = 0; /* get identifiers so defined */ t = gettok(); /* there is a type defined */ if(t == TYPENAME) { ty = numbval; t = gettok(); } for(;;) { switch(t) { case ',': t = gettok(); continue; case ';': break; case IDENTIFIER: j = chfind(0, tokname); if(j >= NTBASE) error("%s defined earlier as nonterminal", tokname); if(lev) { if(ASSOC(toklev[j])) error("redeclaration of precedence of %s", tokname); SETASC(toklev[j], lev); SETPLEV(toklev[j], i); } if(ty) { if(TYPE(toklev[j])) error("redeclaration of type of %s", tokname); SETTYPE(toklev[j],ty); } t = gettok(); if(t == NUMBER) { tokset[j].value = numbval; if(j < ndefout && j > 3) error("please define type number of %s earlier", tokset[j].name); t = gettok(); } continue; } break; } continue; case LCURLY: defout(0); cpycode(); t = gettok(); continue; default: error("syntax error"); } if(t == ENDFILE) error("unexpected EOF before %%"); /* t is MARK */ if(!yyarg) Bprint(ftable, "extern int yyerrflag;\n"); Bprint(ftable, "#ifndef YYMAXDEPTH\n"); Bprint(ftable, "#define YYMAXDEPTH 150\n"); Bprint(ftable, "#endif\n" ); if(!ntypes) { Bprint(ftable, "#ifndef YYSTYPE\n"); Bprint(ftable, "#define YYSTYPE int\n"); Bprint(ftable, "#endif\n"); } if(!yyarg){ Bprint(ftable, "YYSTYPE yylval;\n"); Bprint(ftable, "YYSTYPE yyval;\n"); }else{ if(dflag) Bprint(ftable, "#include \"%s.%s\"\n\n", stemc, FILED); Bprint(fout, "struct Yyarg {\n"); Bprint(fout, "\tint\tyynerrs;\n"); Bprint(fout, "\tint\tyyerrflag;\n"); Bprint(fout, "\tvoid*\targ;\n"); Bprint(fout, "\tYYSTYPE\tyyval;\n"); Bprint(fout, "\tYYSTYPE\tyylval;\n"); Bprint(fout, "};\n\n"); } prdptr[0] = mem; /* added production */ *mem++ = NTBASE; /* if start is 0, we will overwrite with the lhs of the first rule */ *mem++ = start; *mem++ = 1; *mem++ = 0; prdptr[1] = mem; while((t=gettok()) == LCURLY) cpycode(); if(t != IDENTCOLON) error("bad syntax on first rule"); if(!start) prdptr[0][1] = chfind(1, tokname); /* read rules */ while(t != MARK && t != ENDFILE) { /* process a rule */ rlines[nprod] = lineno; if(t == '|') *mem++ = *prdptr[nprod-1]; else if(t == IDENTCOLON) { *mem = chfind(1, tokname); if(*mem < NTBASE) error("token illegal on LHS of grammar rule"); mem++; } else error("illegal rule: missing semicolon or | ?"); /* read rule body */ t = gettok(); more_rule: while(t == IDENTIFIER) { *mem = chfind(1, tokname); if(*mem < NTBASE) levprd[nprod] = toklev[*mem]; mem++; t = gettok(); } if(t == PREC) { if(gettok() != IDENTIFIER) error("illegal %%prec syntax"); j = chfind(2, tokname); if(j >= NTBASE) error("nonterminal %s illegal after %%prec", nontrst[j-NTBASE].name); levprd[nprod] = toklev[j]; t = gettok(); } if(t == '=') { levprd[nprod] |= ACTFLAG; Bprint(faction, "\ncase %d:", nprod); cpyact(mem-prdptr[nprod]-1); Bprint(faction, " break;"); if((t=gettok()) == IDENTIFIER) { /* action within rule... */ sprint(actnm, "$$%d", nprod); /* make it a nonterminal */ j = chfind(1, actnm); /* * the current rule will become rule number nprod+1 * move the contents down, and make room for the null */ for(p = mem; p >= prdptr[nprod]; --p) p[2] = *p; mem += 2; /* enter null production for action */ p = prdptr[nprod]; *p++ = j; *p++ = -nprod; /* update the production information */ levprd[nprod+1] = levprd[nprod] & ~ACTFLAG; levprd[nprod] = ACTFLAG; if(++nprod >= NPROD) error("more than %d rules", NPROD); prdptr[nprod] = p; /* make the action appear in the original rule */ *mem++ = j; /* get some more of the rule */ goto more_rule; } } while(t == ';') t = gettok(); *mem++ = -nprod; /* check that default action is reasonable */ if(ntypes && !(levprd[nprod]&ACTFLAG) && nontrst[*prdptr[nprod]-NTBASE].value) { /* no explicit action, LHS has value */ int tempty; tempty = prdptr[nprod][1]; if(tempty < 0) error("must return a value, since LHS has a type"); else if(tempty >= NTBASE) tempty = nontrst[tempty-NTBASE].value; else tempty = TYPE(toklev[tempty]); if(tempty != nontrst[*prdptr[nprod]-NTBASE].value) error("default action causes potential type clash"); } nprod++; if(nprod >= NPROD) error("more than %d rules", NPROD); prdptr[nprod] = mem; levprd[nprod] = 0; } /* end of all rules */ defout(1); finact(); if(t == MARK) { Bprint(ftable, "\n"); if(yyline) Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile); while((c=Bgetrune(finput)) != Beof) Bputrune(ftable, c); } Bterm(finput); } /* * finish action routine */ void finact(void) { Bterm(faction); Bprint(ftable, "#define YYEOFCODE %d\n", 1); Bprint(ftable, "#define YYERRCODE %d\n", 2); } /* * define s to be a terminal if t=0 * or a nonterminal if t=1 */ int defin(int nt, char *s) { int val; Rune rune; val = 0; if(nt) { nnonter++; if(nnonter >= NNONTERM) error("too many nonterminals, limit %d",NNONTERM); nontrst[nnonter].name = cstash(s); return NTBASE + nnonter; } /* must be a token */ ntokens++; if(ntokens >= NTERMS) error("too many terminals, limit %d", NTERMS); tokset[ntokens].name = cstash(s); /* establish value for token */ /* single character literal */ if(s[0] == ' ') { val = chartorune(&rune, &s[1]); if(s[val+1] == 0) { val = rune; goto out; } } /* escape sequence */ if(s[0] == ' ' && s[1] == '\\') { if(s[3] == 0) { /* single character escape sequence */ switch(s[2]) { case 'n': val = '\n'; break; case 'r': val = '\r'; break; case 'b': val = '\b'; break; case 't': val = '\t'; break; case 'f': val = '\f'; break; case '\'': val = '\''; break; case '"': val = '"'; break; case '\\': val = '\\'; break; default: error("invalid escape"); } goto out; } /* \nnn sequence */ if(s[2] >= '0' && s[2] <= '7') { if(s[3] < '0' || s[3] > '7' || s[4] < '0' || s[4] > '7' || s[5] != 0) error("illegal \\nnn construction"); val = 64*s[2] + 8*s[3] + s[4] - 73*'0'; if(val == 0) error("'\\000' is illegal"); goto out; } error("unknown escape"); } val = extval++; out: tokset[ntokens].value = val; toklev[ntokens] = 0; return ntokens; } /* * write out the defines (at the end of the declaration section) */ void defout(int last) { int i, c; char sar[NAMESIZE+10]; for(i=ndefout; i<=ntokens; i++) { /* non-literals */ c = tokset[i].name[0]; if(c != ' ' && c != '$') { Bprint(ftable, "#define %s %d\n", tokset[i].name, tokset[i].value); if(fdefine) Bprint(fdefine, "#define\t%s\t%d\n", tokset[i].name, tokset[i].value); } } ndefout = ntokens+1; if(last && fdebug) { Bprint(fdebug, "static char* yytoknames[] =\n{\n"); TLOOP(i) { if(tokset[i].name) { chcopy(sar, tokset[i].name); Bprint(fdebug, "\t\"%s\",\n", sar); continue; } Bprint(fdebug, "\t0,\n"); } Bprint(fdebug, "};\n"); } } char* cstash(char *s) { char *temp; temp = cnamp; do { if(cnamp >= &cnames[cnamsz]) error("too many characters in id's and literals"); else *cnamp++ = *s; } while(*s++); return temp; } long gettok(void) { long c; Rune rune; int i, base, match, reserve; static int peekline; begin: reserve = 0; lineno += peekline; peekline = 0; c = Bgetrune(finput); while(c == ' ' || c == '\n' || c == '\t' || c == '\f') { if(c == '\n') lineno++; c = Bgetrune(finput); } /* skip comment */ if(c == '/') { lineno += skipcom(); goto begin; } switch(c) { case Beof: return ENDFILE; case '{': Bungetrune(finput); return '='; case '<': /* get, and look up, a type name (union member name) */ i = 0; while((c=Bgetrune(finput)) != '>' && c >= 0 && c != '\n') { rune = c; c = runetochar(&tokname[i], &rune); if(i < NAMESIZE) i += c; } if(c != '>') error("unterminated < ... > clause"); tokname[i] = 0; for(i=1; i<=ntypes; i++) if(!strcmp(typeset[i], tokname)) { numbval = i; return TYPENAME; } ntypes++; numbval = ntypes; typeset[numbval] = cstash(tokname); return TYPENAME; case '"': case '\'': match = c; tokname[0] = ' '; i = 1; for(;;) { c = Bgetrune(finput); if(c == '\n' || c <= 0) error("illegal or missing ' or \"" ); if(c == '\\') { tokname[i] = '\\'; if(i < NAMESIZE) i++; c = Bgetrune(finput); } else if(c == match) break; rune = c; c = runetochar(&tokname[i], &rune); if(i < NAMESIZE) i += c; } break; case '%': case '\\': switch(c = Bgetrune(finput)) { case '0': return TERM; case '<': return LEFT; case '2': return BINARY; case '>': return RIGHT; case '%': case '\\': return MARK; case '=': return PREC; case '{': return LCURLY; default: reserve = 1; } default: /* number */ if(isdigit(c)) { numbval = c-'0'; base = (c=='0')? 8: 10; for(c = Bgetrune(finput); isdigit(c); c = Bgetrune(finput)) numbval = numbval*base + (c-'0'); Bungetrune(finput); return NUMBER; } if(islower(c) || isupper(c) || c=='_' || c=='.' || c=='$') { i = 0; while(islower(c) || isupper(c) || isdigit(c) || c == '-' || c=='_' || c=='.' || c=='$') { if(reserve && isupper(c)) c += 'a'-'A'; rune = c; c = runetochar(&tokname[i], &rune); if(i < NAMESIZE) i += c; c = Bgetrune(finput); } } else return c; Bungetrune(finput); } tokname[i] = 0; /* find a reserved word */ if(reserve) { for(c=0; resrv[c].name; c++) if(strcmp(tokname, resrv[c].name) == 0) return resrv[c].value; error("invalid escape, or illegal reserved word: %s", tokname); } /* look ahead to distinguish IDENTIFIER from IDENTCOLON */ c = Bgetrune(finput); while(c == ' ' || c == '\t'|| c == '\n' || c == '\f' || c == '/') { if(c == '\n') peekline++; /* look for comments */ if(c == '/') peekline += skipcom(); c = Bgetrune(finput); } if(c == ':') return IDENTCOLON; Bungetrune(finput); return IDENTIFIER; } /* * determine the type of a symbol */ int fdtype(int t) { int v; if(t >= NTBASE) v = nontrst[t-NTBASE].value; else v = TYPE(toklev[t]); if(v <= 0) error("must specify type for %s", (t>=NTBASE)? nontrst[t-NTBASE].name: tokset[t].name); return v; } int chfind(int t, char *s) { int i; if(s[0] == ' ') t = 0; TLOOP(i) if(!strcmp(s, tokset[i].name)) return i; NTLOOP(i) if(!strcmp(s, nontrst[i].name)) return NTBASE+i; /* cannot find name */ if(t > 1) error("%s should have been defined earlier", s); return defin(t, s); } /* * copy the union declaration to the output, and the define file if present */ void cpyunion(void) { long c; int level; Bprint(ftable, "\n"); if(yyline) Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile); Bprint(ftable, "typedef union "); if(fdefine != 0) Bprint(fdefine, "\ntypedef union "); level = 0; for(;;) { if((c=Bgetrune(finput)) == Beof) error("EOF encountered while processing %%union"); Bputrune(ftable, c); if(fdefine != 0) Bputrune(fdefine, c); switch(c) { case '\n': lineno++; break; case '{': level++; break; case '}': level--; /* we are finished copying */ if(level == 0) { Bprint(ftable, " YYSTYPE;\n"); if(fdefine != 0){ Bprint(fdefine, "\tYYSTYPE;\n"); if(!yyarg) Bprint(fdefine, "extern\tYYSTYPE\tyylval;\n"); } return; } } } } /* * copies code between \{ and \} */ void cpycode(void) { long c; c = Bgetrune(finput); if(c == '\n') { c = Bgetrune(finput); lineno++; } Bprint(ftable, "\n"); if(yyline) Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile); while(c != Beof) { if(c == '\\') { if((c=Bgetrune(finput)) == '}') return; Bputc(ftable, '\\'); } if(c == '%') { if((c=Bgetrune(finput)) == '}') return; Bputc(ftable, '%'); } Bputrune(ftable, c); if(c == '\n') lineno++; c = Bgetrune(finput); } error("eof before %%}"); } /* * skip over comments * skipcom is called after reading a '/' */ int skipcom(void) { long c; int i; /* i is the number of lines skipped */ i = 0; if(Bgetrune(finput) != '*') error("illegal comment"); c = Bgetrune(finput); while(c != Beof) { while(c == '*') if((c=Bgetrune(finput)) == '/') return i; if(c == '\n') i++; c = Bgetrune(finput); } error("EOF inside comment"); return 0; } /* * copy C action to the next ; or closing } */ void cpyact(int offset) { long c; int brac, match, j, s, fnd, tok; Bprint(faction, "\n"); if(yyline) Bprint(faction, "#line\t%d\t\"%s\"\n", lineno, infile); brac = 0; loop: c = Bgetrune(finput); swt: switch(c) { case ';': if(brac == 0) { Bputrune(faction, c); return; } goto lcopy; case '{': brac++; goto lcopy; case '$': s = 1; tok = -1; c = Bgetrune(finput); /* type description */ if(c == '<') { Bungetrune(finput); if(gettok() != TYPENAME) error("bad syntax on $ clause"); tok = numbval; c = Bgetrune(finput); } if(c == '$') { Bprint(faction, "yyval"); /* put out the proper tag... */ if(ntypes) { if(tok < 0) tok = fdtype(*prdptr[nprod]); Bprint(faction, ".%s", typeset[tok]); } goto loop; } if(c == '-') { s = -s; c = Bgetrune(finput); } if(isdigit(c)) { j = 0; while(isdigit(c)) { j = j*10 + (c-'0'); c = Bgetrune(finput); } Bungetrune(finput); j = j*s - offset; if(j > 0) error("Illegal use of $%d", j+offset); dollar: Bprint(faction, "yypt[-%d].yyv", -j); /* put out the proper tag */ if(ntypes) { if(j+offset <= 0 && tok < 0) error("must specify type of $%d", j+offset); if(tok < 0) tok = fdtype(prdptr[nprod][j+offset]); Bprint(faction, ".%s", typeset[tok]); } goto loop; } if(isupper(c) || islower(c) || c == '_' || c == '.') { int tok; /* tok used oustide for type info */ /* look for $name */ Bungetrune(finput); if(gettok() != IDENTIFIER) error("$ must be followed by an identifier"); tok = chfind(2, tokname); if((c = Bgetrune(finput)) != '#') { Bungetrune(finput); fnd = -1; } else if(gettok() != NUMBER) { error("# must be followed by number"); fnd = -1; } else fnd = numbval; for(j=1; j<=offset; ++j) if(tok == prdptr[nprod][j]) { if(--fnd <= 0) { j -= offset; goto dollar; } } error("$name or $name#number not found"); } Bputc(faction, '$'); if(s < 0 ) Bputc(faction, '-'); goto swt; case '}': brac--; if(brac) goto lcopy; Bputrune(faction, c); return; case '/': /* look for comments */ Bputrune(faction, c); c = Bgetrune(finput); if(c != '*') goto swt; /* it really is a comment */ Bputrune(faction, c); c = Bgetrune(finput); while(c >= 0) { while(c == '*') { Bputrune(faction, c); if((c=Bgetrune(finput)) == '/') goto lcopy; } Bputrune(faction, c); if(c == '\n') lineno++; c = Bgetrune(finput); } error("EOF inside comment"); case '\'': /* character constant */ match = '\''; goto string; case '"': /* character string */ match = '"'; string: Bputrune(faction, c); while(c = Bgetrune(finput)) { if(c == '\\') { Bputrune(faction, c); c = Bgetrune(finput); if(c == '\n') lineno++; } else if(c == match) goto lcopy; if(c == '\n') error("newline in string or char. const."); Bputrune(faction, c); } error("EOF in string or character constant"); case Beof: error("action does not terminate"); case '\n': lineno++; goto lcopy; } lcopy: Bputrune(faction, c); goto loop; } void openup(char *stem, int dflag, int vflag, int ytab, char *ytabc) { char buf[256]; if(vflag) { sprint(buf, "%s.%s", stem, FILEU); foutput = Bopen(buf, OWRITE); if(foutput == 0) error("cannot open %s", buf); } if(yydebug) { sprint(buf, "%s.%s", stem, FILEDEBUG); if((fdebug = Bopen(buf, OWRITE)) == 0) error("can't open %s", buf); } if(dflag) { sprint(buf, "%s.%s", stem, FILED); fdefine = Bopen(buf, OWRITE); if(fdefine == 0) error("can't create %s", buf); } if(ytab == 0) sprint(buf, "%s.%s", stem, OFILE); else strcpy(buf, ytabc); ftable = Bopen(buf, OWRITE); if(ftable == 0) error("cannot open table file %s", buf); } /* * print the output for the states */ void output(void) { int i, k, c; Wset *u, *v; Bprint(ftable, "static\tconst\tshort yyexca[] =\n{"); if(fdebug) Bprint(fdebug, "static\tconst\tchar* yystates[] =\n{\n"); /* output the stuff for state i */ SLOOP(i) { nolook = tystate[i]!=MUSTLOOKAHEAD; closure(i); /* output actions */ nolook = 1; aryfil(temp1, ntokens+nnonter+1, 0); WSLOOP(wsets, u) { c = *(u->pitem); if(c > 1 && c < NTBASE && temp1[c] == 0) { WSLOOP(u, v) if(c == *(v->pitem)) putitem(v->pitem+1, (Lkset*)0); temp1[c] = state(c); } else if(c > NTBASE && temp1[(c -= NTBASE) + ntokens] == 0) temp1[c+ntokens] = amem[indgo[i]+c]; } if(i == 1) temp1[1] = ACCEPTCODE; /* now, we have the shifts; look at the reductions */ lastred = 0; WSLOOP(wsets, u) { c = *u->pitem; /* reduction */ if(c <= 0) { lastred = -c; TLOOP(k) if(BIT(u->ws.lset, k)) { if(temp1[k] == 0) temp1[k] = c; else if(temp1[k] < 0) { /* reduce/reduce conflict */ if(foutput) Bprint(foutput, "\n%d: reduce/reduce conflict" " (red'ns %d and %d ) on %s", i, -temp1[k], lastred, symnam(k)); if(-temp1[k] > lastred) temp1[k] = -lastred; zzrrconf++; } else /* potential shift/reduce conflict */ precftn( lastred, k, i ); } } } wract(i); } if(fdebug) Bprint(fdebug, "};\n"); Bprint(ftable, "};\n"); Bprint(ftable, "#define YYNPROD %d\n", nprod); Bprint(ftable, "#define YYPRIVATE %d\n", PRIVATE); if(yydebug) Bprint(ftable, "#define yydebug %s\n", yydebug); } /* * pack state i from temp1 into amem */ int apack(int *p, int n) { int *pp, *qq, *rr, off, *q, *r; /* we don't need to worry about checking because * we will only look at entries known to be there... * eliminate leading and trailing 0's */ q = p+n; for(pp = p, off = 0; *pp == 0 && pp <= q; ++pp, --off) ; /* no actions */ if(pp > q) return 0; p = pp; /* now, find a place for the elements from p to q, inclusive */ r = &amem[ACTSIZE-1]; for(rr = amem; rr <= r; rr++, off++) { for(qq = rr, pp = p; pp <= q; pp++, qq++) if(*pp != 0) if(*pp != *qq && *qq != 0) goto nextk; /* we have found an acceptable k */ if(pkdebug && foutput != 0) Bprint(foutput, "off = %d, k = %d\n", off, (int)(rr-amem)); for(qq = rr, pp = p; pp <= q; pp++, qq++) if(*pp) { if(qq > r) error("action table overflow"); if(qq > memp) memp = qq; *qq = *pp; } if(pkdebug && foutput != 0) for(pp = amem; pp <= memp; pp += 10) { Bprint(foutput, "\t"); for(qq = pp; qq <= pp+9; qq++) Bprint(foutput, "%d ", *qq); Bprint(foutput, "\n"); } return(off); nextk:; } error("no space in action table"); return 0; } /* * output the gotos for the nontermninals */ void go2out(void) { int i, j, k, best, count, cbest, times; /* mark begining of gotos */ Bprint(ftemp, "$\n"); for(i = 1; i <= nnonter; i++) { go2gen(i); /* find the best one to make default */ best = -1; times = 0; /* is j the most frequent */ for(j = 0; j <= nstate; j++) { if(tystate[j] == 0) continue; if(tystate[j] == best) continue; /* is tystate[j] the most frequent */ count = 0; cbest = tystate[j]; for(k = j; k <= nstate; k++) if(tystate[k] == cbest) count++; if(count > times) { best = cbest; times = count; } } /* best is now the default entry */ zzgobest += times-1; for(j = 0; j <= nstate; j++) if(tystate[j] != 0 && tystate[j] != best) { Bprint(ftemp, "%d,%d,", j, tystate[j]); zzgoent++; } /* now, the default */ if(best == -1) best = 0; zzgoent++; Bprint(ftemp, "%d\n", best); } } /* * output the gotos for nonterminal c */ void go2gen(int c) { int i, work, cc; Item *p, *q; /* first, find nonterminals with gotos on c */ aryfil(temp1, nnonter+1, 0); temp1[c] = 1; work = 1; while(work) { work = 0; PLOOP(0, i) /* cc is a nonterminal */ if((cc=prdptr[i][1]-NTBASE) >= 0) /* cc has a goto on c */ if(temp1[cc] != 0) { /* thus, the left side of production i does too */ cc = *prdptr[i]-NTBASE; if(temp1[cc] == 0) { work = 1; temp1[cc] = 1; } } } /* now, we have temp1[c] = 1 if a goto on c in closure of cc */ if(g2debug && foutput != 0) { Bprint(foutput, "%s: gotos on ", nontrst[c].name); NTLOOP(i) if(temp1[i]) Bprint(foutput, "%s ", nontrst[i].name); Bprint(foutput, "\n"); } /* now, go through and put gotos into tystate */ aryfil(tystate, nstate, 0); SLOOP(i) ITMLOOP(i, p, q) if((cc = *p->pitem) >= NTBASE) /* goto on c is possible */ if(temp1[cc-NTBASE]) { tystate[i] = amem[indgo[i]+c]; break; } } /* * decide a shift/reduce conflict by precedence. * r is a rule number, t a token number * the conflict is in state s * temp1[t] is changed to reflect the action */ void precftn(int r, int t, int s) { int lp, lt, action; lp = levprd[r]; lt = toklev[t]; if(PLEVEL(lt) == 0 || PLEVEL(lp) == 0) { /* conflict */ if(foutput != 0) Bprint(foutput, "\n%d: shift/reduce conflict (shift %d(%d), red'n %d(%d)) on %s", s, temp1[t], PLEVEL(lt), r, PLEVEL(lp), symnam(t)); zzsrconf++; return; } if(PLEVEL(lt) == PLEVEL(lp)) action = ASSOC(lt); else if(PLEVEL(lt) > PLEVEL(lp)) action = RASC; /* shift */ else action = LASC; /* reduce */ switch(action) { case BASC: /* error action */ temp1[t] = ERRCODE; break; case LASC: /* reduce */ temp1[t] = -r; break; } } /* * output state i * temp1 has the actions, lastred the default */ void wract(int i) { int p, p0, p1, ntimes, tred, count, j, flag; /* find the best choice for lastred */ lastred = 0; ntimes = 0; TLOOP(j) { if(temp1[j] >= 0) continue; if(temp1[j]+lastred == 0) continue; /* count the number of appearances of temp1[j] */ count = 0; tred = -temp1[j]; levprd[tred] |= REDFLAG; TLOOP(p) if(temp1[p]+tred == 0) count++; if(count > ntimes) { lastred = tred; ntimes = count; } } /* * for error recovery, arrange that, if there is a shift on the * error recovery token, `error', that the default be the error action */ if(temp1[2] > 0) lastred = 0; /* clear out entries in temp1 which equal lastred */ TLOOP(p) if(temp1[p]+lastred == 0) temp1[p] = 0; wrstate(i); defact[i] = lastred; flag = 0; TLOOP(p0) if((p1=temp1[p0]) != 0) { if(p1 < 0) { p1 = -p1; goto exc; } if(p1 == ACCEPTCODE) { p1 = -1; goto exc; } if(p1 == ERRCODE) { p1 = 0; exc: if(flag++ == 0) Bprint(ftable, "-1, %d,\n", i); Bprint(ftable, "\t%d, %d,\n", p0, p1); zzexcp++; continue; } Bprint(ftemp, "%d,%d,", p0, p1); zzacent++; } if(flag) { defact[i] = -2; Bprint(ftable, "\t-2, %d,\n", lastred); } Bprint(ftemp, "\n"); } /* * writes state i */ void wrstate(int i) { int j0, j1; Item *pp, *qq; Wset *u; if(fdebug) { if(lastred) { Bprint(fdebug, " 0, /*%d*/\n", i); } else { Bprint(fdebug, " \""); ITMLOOP(i, pp, qq) Bprint(fdebug, "%s\\n", writem(pp->pitem)); if(tystate[i] == MUSTLOOKAHEAD) WSLOOP(wsets + (pstate[i+1] - pstate[i]), u) if(*u->pitem < 0) Bprint(fdebug, "%s\\n", writem(u->pitem)); Bprint(fdebug, "\", /*%d*/\n", i); } } if(foutput == 0) return; Bprint(foutput, "\nstate %d\n", i); ITMLOOP(i, pp, qq) Bprint(foutput, "\t%s\n", writem(pp->pitem)); if(tystate[i] == MUSTLOOKAHEAD) /* print out empty productions in closure */ WSLOOP(wsets+(pstate[i+1]-pstate[i]), u) if(*u->pitem < 0) Bprint(foutput, "\t%s\n", writem(u->pitem)); /* check for state equal to another */ TLOOP(j0) if((j1=temp1[j0]) != 0) { Bprint(foutput, "\n\t%s ", symnam(j0)); /* shift, error, or accept */ if(j1 > 0) { if(j1 == ACCEPTCODE) Bprint(foutput, "accept"); else if(j1 == ERRCODE) Bprint(foutput, "error"); else Bprint(foutput, "shift %d", j1); } else Bprint(foutput, "reduce %d (src line %d)", -j1, rlines[-j1]); } /* output the final production */ if(lastred) Bprint(foutput, "\n\t. reduce %d (src line %d)\n\n", lastred, rlines[lastred]); else Bprint(foutput, "\n\t. error\n\n"); /* now, output nonterminal actions */ j1 = ntokens; for(j0 = 1; j0 <= nnonter; j0++) { j1++; if(temp1[j1]) Bprint(foutput, "\t%s goto %d\n", symnam(j0+NTBASE), temp1[j1]); } } void warray(char *s, int *v, int n) { int i; Bprint(ftable, "static\tconst\tshort %s[] =\n{", s); for(i=0;;) { if(i%10 == 0) Bprint(ftable, "\n"); Bprint(ftable, "%4d", v[i]); i++; if(i >= n) { Bprint(ftable, "\n};\n"); break; } Bprint(ftable, ","); } } /* * in order to free up the mem and amem arrays for the optimizer, * and still be able to output yyr1, etc., after the sizes of * the action array is known, we hide the nonterminals * derived by productions in levprd. */ void hideprod(void) { int i, j; j = 0; levprd[0] = 0; PLOOP(1, i) { if(!(levprd[i] & REDFLAG)) { j++; if(foutput != 0) Bprint(foutput, "Rule not reduced: %s\n", writem(prdptr[i])); } levprd[i] = *prdptr[i] - NTBASE; } if(j) print("%d rules never reduced\n", j); } void callopt(void) { int i, *p, j, k, *q; /* read the arrays from tempfile and set parameters */ finput = Bopen(tempname, OREAD); if(finput == 0) error("optimizer cannot open tempfile"); pgo[0] = 0; temp1[0] = 0; nstate = 0; nnonter = 0; for(;;) { switch(gtnm()) { case '\n': nstate++; pmem--; temp1[nstate] = pmem - mem0; case ',': continue; case '$': break; default: error("bad tempfile %s", tempname); } break; } pmem--; temp1[nstate] = yypgo[0] = pmem - mem0; for(;;) { switch(gtnm()) { case '\n': nnonter++; yypgo[nnonter] = pmem-mem0; case ',': continue; case -1: break; default: error("bad tempfile"); } break; } pmem--; yypgo[nnonter--] = pmem - mem0; for(i = 0; i < nstate; i++) { k = 32000; j = 0; q = mem0 + temp1[i+1]; for(p = mem0 + temp1[i]; p < q ; p += 2) { if(*p > j) j = *p; if(*p < k) k = *p; } /* nontrivial situation */ if(k <= j) { /* j is now the range */ /* j -= k; *//* call scj */ if(k > maxoff) maxoff = k; } tystate[i] = (temp1[i+1]-temp1[i]) + 2*j; if(j > maxspr) maxspr = j; } /* initialize ggreed table */ for(i = 1; i <= nnonter; i++) { ggreed[i] = 1; j = 0; /* minimum entry index is always 0 */ q = mem0 + yypgo[i+1] - 1; for(p = mem0+yypgo[i]; p < q ; p += 2) { ggreed[i] += 2; if(*p > j) j = *p; } ggreed[i] = ggreed[i] + 2*j; if(j > maxoff) maxoff = j; } /* now, prepare to put the shift actions into the amem array */ for(i = 0; i < ACTSIZE; i++) amem[i] = 0; maxa = amem; for(i = 0; i < nstate; i++) { if(tystate[i] == 0 && adb > 1) Bprint(ftable, "State %d: null\n", i); indgo[i] = YYFLAG1; } while((i = nxti()) != NOMORE) if(i >= 0) stin(i); else gin(-i); /* print amem array */ if(adb > 2 ) for(p = amem; p <= maxa; p += 10) { Bprint(ftable, "%4d ", (int)(p-amem)); for(i = 0; i < 10; ++i) Bprint(ftable, "%4d ", p[i]); Bprint(ftable, "\n"); } /* write out the output appropriate to the language */ aoutput(); osummary(); ZAPFILE(tempname); } void gin(int i) { int *p, *r, *s, *q1, *q2; /* enter gotos on nonterminal i into array amem */ ggreed[i] = 0; q2 = mem0+ yypgo[i+1] - 1; q1 = mem0 + yypgo[i]; /* now, find amem place for it */ for(p = amem; p < &amem[ACTSIZE]; p++) { if(*p) continue; for(r = q1; r < q2; r += 2) { s = p + *r + 1; if(*s) goto nextgp; if(s > maxa) if((maxa = s) > &amem[ACTSIZE]) error("a array overflow"); } /* we have found amem spot */ *p = *q2; if(p > maxa) if((maxa = p) > &amem[ACTSIZE]) error("a array overflow"); for(r = q1; r < q2; r += 2) { s = p + *r + 1; *s = r[1]; } pgo[i] = p-amem; if(adb > 1) Bprint(ftable, "Nonterminal %d, entry at %d\n", i, pgo[i]); return; nextgp:; } error("cannot place goto %d\n", i); } void stin(int i) { int *r, *s, n, flag, j, *q1, *q2; tystate[i] = 0; /* enter state i into the amem array */ q2 = mem0+temp1[i+1]; q1 = mem0+temp1[i]; /* find an acceptable place */ for(n = -maxoff; n < ACTSIZE; n++) { flag = 0; for(r = q1; r < q2; r += 2) { if((s = *r + n + amem) < amem) goto nextn; if(*s == 0) flag++; else if(*s != r[1]) goto nextn; } /* check that the position equals another only if the states are identical */ for(j=0; j 1) Bprint(ftable, "State %d: entry at %d equals state %d\n", i, n, j); return; } /* we have some disagreement */ goto nextn; } } for(r = q1; r < q2; r += 2) { if((s = *r+n+amem) >= &amem[ACTSIZE]) error("out of space in optimizer a array"); if(s > maxa) maxa = s; if(*s != 0 && *s != r[1]) error("clobber of a array, pos'n %d, by %d", s-amem, r[1]); *s = r[1]; } indgo[i] = n; if(adb > 1) Bprint(ftable, "State %d: entry at %d\n", i, indgo[i]); return; nextn:; } error("Error; failure to place state %d\n", i); } /* * finds the next i */ int nxti(void) { int i, max, maxi; max = 0; maxi = 0; for(i = 1; i <= nnonter; i++) if(ggreed[i] >= max) { max = ggreed[i]; maxi = -i; } for(i = 0; i < nstate; ++i) if(tystate[i] >= max) { max = tystate[i]; maxi = i; } if(nxdb) Bprint(ftable, "nxti = %d, max = %d\n", maxi, max); if(max == 0) return NOMORE; return maxi; } /* * write summary */ void osummary(void) { int i, *p; if(foutput == 0) return; i = 0; for(p = maxa; p >= amem; p--) if(*p == 0) i++; Bprint(foutput, "Optimizer space used: input %d/%d, output %d/%d\n", (int)(pmem-mem0+1), MEMSIZE, (int)(maxa-amem+1), ACTSIZE); Bprint(foutput, "%d table entries, %d zero\n", (int)(maxa-amem+1), i); Bprint(foutput, "maximum spread: %d, maximum offset: %d\n", maxspr, maxoff); } /* * this version is for C * write out the optimized parser */ void aoutput(void) { Bprint(ftable, "#define\tYYLAST\t%d\n", (int)(maxa-amem+1)); arout("yyact", amem, (maxa-amem)+1); arout("yypact", indgo, nstate); arout("yypgo", pgo, nnonter+1); } void arout(char *s, int *v, int n) { int i; Bprint(ftable, "static\tconst\tshort %s[] =\n{", s); for(i = 0; i < n;) { if(i%10 == 0) Bprint(ftable, "\n"); Bprint(ftable, "%4d", v[i]); i++; if(i == n) Bprint(ftable, "\n};\n"); else Bprint(ftable, ","); } } /* * read and convert an integer from the standard input * return the terminating character * blanks, tabs, and newlines are ignored */ int gtnm(void) { int sign, val, c; sign = 0; val = 0; while((c=Bgetrune(finput)) != Beof) { if(isdigit(c)) { val = val*10 + c-'0'; continue; } if(c == '-') { sign = 1; continue; } break; } if(sign) val = -val; *pmem++ = val; if(pmem >= &mem0[MEMSIZE]) error("out of space"); return c; } 9base-6/yacc/yaccpar0000644000175000017500000001215511402154555014036 0ustar anselmanselm#define YYFLAG -1000 #define YYERROR goto yyerrlab #define YYACCEPT return(0) #define YYABORT return(1) #define yyclearin yychar = -1 #define yyerrok yyerrflag = 0 #ifdef yydebug #include "y.debug" #else #define yydebug 0 static const char* yytoknames[1]; /* for debugging */ static const char* yystates[1]; /* for debugging */ #endif /* parser for yacc output */ #ifdef YYARG #define yynerrs yyarg->yynerrs #define yyerrflag yyarg->yyerrflag #define yyval yyarg->yyval #define yylval yyarg->yylval #else int yynerrs = 0; /* number of errors */ int yyerrflag = 0; /* error recovery flag */ #endif extern int fprint(int, char*, ...); extern int sprint(char*, char*, ...); static const char* yytokname(int yyc) { static char x[10]; if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) if(yytoknames[yyc-1]) return yytoknames[yyc-1]; sprint(x, "<%d>", yyc); return x; } static const char* yystatname(int yys) { static char x[10]; if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) if(yystates[yys]) return yystates[yys]; sprint(x, "<%d>\n", yys); return x; } static long #ifdef YYARG yylex1(struct Yyarg *yyarg) #else yylex1(void) #endif { long yychar; const long *t3p; int c; #ifdef YYARG yychar = yylex(yyarg); #else yychar = yylex(); #endif if(yychar <= 0) { c = yytok1[0]; goto out; } if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { c = yytok1[yychar]; goto out; } if(yychar >= YYPRIVATE) if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { c = yytok2[yychar-YYPRIVATE]; goto out; } for(t3p=yytok3;; t3p+=2) { c = t3p[0]; if(c == yychar) { c = t3p[1]; goto out; } if(c == 0) break; } c = 0; out: if(c == 0) c = yytok2[1]; /* unknown char */ if(yydebug >= 3) fprint(2, "lex %.4lux %s\n", yychar, yytokname(c)); return c; } int #ifdef YYARG yyparse(struct Yyarg *yyarg) #else yyparse(void) #endif { struct { YYSTYPE yyv; int yys; } yys[YYMAXDEPTH], *yyp, *yypt; const short *yyxi; int yyj, yym, yystate, yyn, yyg; long yychar; #ifndef YYARG YYSTYPE save1, save2; int save3, save4; save1 = yylval; save2 = yyval; save3 = yynerrs; save4 = yyerrflag; #endif yystate = 0; yychar = -1; yynerrs = 0; yyerrflag = 0; yyp = &yys[-1]; goto yystack; ret0: yyn = 0; goto ret; ret1: yyn = 1; goto ret; ret: #ifndef YYARG yylval = save1; yyval = save2; yynerrs = save3; yyerrflag = save4; #endif return yyn; yystack: /* put a state and value onto the stack */ if(yydebug >= 4) fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate)); yyp++; if(yyp >= &yys[YYMAXDEPTH]) { yyerror("yacc stack overflow"); goto ret1; } yyp->yys = yystate; yyp->yyv = yyval; yynewstate: yyn = yypact[yystate]; if(yyn <= YYFLAG) goto yydefault; /* simple state */ if(yychar < 0) #ifdef YYARG yychar = yylex1(yyarg); #else yychar = yylex1(); #endif yyn += yychar; if(yyn < 0 || yyn >= YYLAST) goto yydefault; yyn = yyact[yyn]; if(yychk[yyn] == yychar) { /* valid shift */ yychar = -1; yyval = yylval; yystate = yyn; if(yyerrflag > 0) yyerrflag--; goto yystack; } yydefault: /* default state action */ yyn = yydef[yystate]; if(yyn == -2) { if(yychar < 0) #ifdef YYARG yychar = yylex1(yyarg); #else yychar = yylex1(); #endif /* look through exception table */ for(yyxi=yyexca;; yyxi+=2) if(yyxi[0] == -1 && yyxi[1] == yystate) break; for(yyxi += 2;; yyxi += 2) { yyn = yyxi[0]; if(yyn < 0 || yyn == yychar) break; } yyn = yyxi[1]; if(yyn < 0) goto ret0; } if(yyn == 0) { /* error ... attempt to resume parsing */ switch(yyerrflag) { case 0: /* brand new error */ yyerror("syntax error"); if(yydebug >= 1) { fprint(2, "%s", yystatname(yystate)); fprint(2, "saw %s\n", yytokname(yychar)); } goto yyerrlab; yyerrlab: yynerrs++; case 1: case 2: /* incompletely recovered error ... try again */ yyerrflag = 3; /* find a state where "error" is a legal shift action */ while(yyp >= yys) { yyn = yypact[yyp->yys] + YYERRCODE; if(yyn >= 0 && yyn < YYLAST) { yystate = yyact[yyn]; /* simulate a shift of "error" */ if(yychk[yystate] == YYERRCODE) goto yystack; } /* the current yyp has no shift onn "error", pop stack */ if(yydebug >= 2) fprint(2, "error recovery pops state %d, uncovers %d\n", yyp->yys, (yyp-1)->yys ); yyp--; } /* there is no state on the stack with an error shift ... abort */ goto ret1; case 3: /* no shift yet; clobber input char */ if(yydebug >= 2) fprint(2, "error recovery discards %s\n", yytokname(yychar)); if(yychar == YYEOFCODE) goto ret1; yychar = -1; goto yynewstate; /* try again in the same state */ } } /* reduction by production yyn */ if(yydebug >= 2) fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate)); yypt = yyp; yyp -= yyr2[yyn]; yyval = (yyp+1)->yyv; yym = yyn; /* consult goto table to find next state */ yyn = yyr1[yyn]; yyg = yypgo[yyn]; yyj = yyg + yyp->yys + 1; if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) yystate = yyact[yyg]; switch(yym) { $A } goto yystack; /* stack new state and value */ } 9base-6/yacc/Makefile0000644000175000017500000000017411402154555014127 0ustar anselmanselm# yacc - yacc unix port from plan9 # Depends on ../lib9 TARG = yacc include ../std.mk pre-uninstall: post-install: 9base-6/yacc/9yacc0000755000175000017500000000007011402154555013420 0ustar anselmanselm#!/bin/sh PLAN9="`pwd`/.." export PLAN9 ../yacc/yacc $* 9base-6/yacc/yacc.10000644000175000017500000000674411402154555013501 0ustar anselmanselm.TH YACC 1 .SH NAME yacc \- yet another compiler-compiler .SH SYNOPSIS .B yacc [ .I option ... ] .I grammar .SH DESCRIPTION .I Yacc converts a context-free grammar and translation code into a set of tables for an LR(1) parser and translator. The grammar may be ambiguous; specified precedence rules are used to break ambiguities. .PP The output file, .BR y.tab.c , must be compiled by the C compiler to produce a program .LR yyparse . This program must be loaded with a lexical analyzer function, .B yylex(void) (often generated by .IR lex (1)), with a .B main(int argc, char *argv[]) program, and with an error handling routine, .BR yyerror(char*) . .PP The options are .TP "\w'\fL-o \fIoutput\fLXX'u" .BI -o " output Direct output to the specified file instead of .BR y.tab.c . .TP .BI -D n Create file .BR y.debug , containing diagnostic messages. To incorporate them in the parser, compile it with preprocessor symbol .B yydebug defined. The amount of diagnostic output from the parser is regulated by value .IR n . The value 0 reports errors; 1 reports reductions; higher values (up to 4) include more information about state transitions. .TP .B -v Create file .BR y.output , containing a description of the parsing tables and of conflicts arising from ambiguities in the grammar. .TP .B -d Create file .BR y.tab.h , containing .B #define statements that associate .IR yacc -assigned `token codes' with user-declared `token names'. Include it in source files other than .B y.tab.c to give access to the token codes. .TP .BI -s " stem Change the prefix .L y of the file names .BR y.tab.c , .BR y.tab.h , .BR y.debug , and .B y.output to .IR stem . .TP .B -S Write a parser that uses Stdio instead of the .B print routines in libc. .TP .BI -l Disable #line directives in the generated parser. .TP .BI -a Generate a parser that takes an argument of type Yyarg and passes this argument to each invocation of the lexer function, yylex. Yyarg contains per-instance state and a single user-visible member, arg, of type void*. .PP The specification of .I yacc itself is essentially the same as the UNIX version described in the references mentioned below. Besides the .B -D option, the main relevant differences are: .IP The interface to the C environment is by default through .B rather than .BR ; the .B -S option reverses this. .IP The parser accepts .SM UTF input text (see .IR utf (7)), which has a couple of effects. First, the return value of .B yylex() no longer fits in a .BR short ; second, the starting value for non-terminals is now 0xE000 rather than 257. .IP The generated parser can be recursive: actions can call .IR yyparse , for example to implement a sort of .B #include statement in an interpreter. .IP Finally, some undocumented inner workings of the parser have been changed, which may affect programs that know too much about its structure. .SH FILES .TF y.debug.xxxxx .TP .B y.output .TP .B y.tab.c .TP .B y.tab.h .TP .B y.debug .TP .B y.tmp.* temporary file .TP .B y.acts.* temporary file .TP .B \*9/lib/yaccpar parser prototype .TP .B \*9/lib/yaccpars parser prototype using stdio .SH SOURCE .B \*9/src/cmd/yacc.c .SH "SEE ALSO" .IR lex (1) .br S. C. Johnson and R. Sethi, ``Yacc: A parser generator'', .I Unix Research System Programmer's Manual, Tenth Edition, Volume 2 .br B. W. Kernighan and Rob Pike, .I The UNIX Programming Environment, Prentice Hall, 1984 .SH BUGS The parser may not have full information when it writes to .B y.debug so that the names of the tokens returned by .L yylex may be missing. 9base-6/yacc/yaccpars0000644000175000017500000001202611402154555014216 0ustar anselmanselm#define YYFLAG -1000 #define YYERROR goto yyerrlab #define YYACCEPT return(0) #define YYABORT return(1) #define yyclearin yychar = -1 #define yyerrok yyerrflag = 0 #ifdef yydebug #include "y.debug" #else #define yydebug 0 static const char* yytoknames[1]; /* for debugging */ static const char* yystates[1]; /* for debugging */ #endif /* parser for yacc output */ #ifdef YYARG #define yynerrs yyarg->yynerrs #define yyerrflag yyarg->yyerrflag #define yyval yyarg->yyval #define yylval yyarg->yylval #else int yynerrs = 0; /* number of errors */ int yyerrflag = 0; /* error recovery flag */ #endif static const char* yytokname(int yyc) { static char x[10]; if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) if(yytoknames[yyc-1]) return yytoknames[yyc-1]; sprintf(x, "<%d>", yyc); return x; } static const char* yystatname(int yys) { static char x[10]; if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) if(yystates[yys]) return yystates[yys]; sprintf(x, "<%d>\n", yys); return x; } static long #ifdef YYARG yylex1(struct Yyarg *yyarg) #else yylex1(void) #endif { long yychar; const long *t3p; int c; #ifdef YYARG yychar = yylex(yyarg); #else yychar = yylex(); #endif if(yychar <= 0) { c = yytok1[0]; goto out; } if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { c = yytok1[yychar]; goto out; } if(yychar >= YYPRIVATE) if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { c = yytok2[yychar-YYPRIVATE]; goto out; } for(t3p=yytok3;; t3p+=2) { c = t3p[0]; if(c == yychar) { c = t3p[1]; goto out; } if(c == 0) break; } c = 0; out: if(c == 0) c = yytok2[1]; /* unknown char */ if(yydebug >= 3) printf("lex %.4lX %s\n", yychar, yytokname(c)); return c; } int #ifdef YYARG yyparse(struct Yyarg *yyarg) #else yyparse(void) #endif { struct { YYSTYPE yyv; int yys; } yys[YYMAXDEPTH], *yyp, *yypt; const short *yyxi; int yyj, yym, yystate, yyn, yyg; long yychar; #ifndef YYARG YYSTYPE save1, save2; int save3, save4; save1 = yylval; save2 = yyval; save3 = yynerrs; save4 = yyerrflag; #endif yystate = 0; yychar = -1; yynerrs = 0; yyerrflag = 0; yyp = &yys[-1]; goto yystack; ret0: yyn = 0; goto ret; ret1: yyn = 1; goto ret; ret: #ifndef YYARG yylval = save1; yyval = save2; yynerrs = save3; yyerrflag = save4; #endif return yyn; yystack: /* put a state and value onto the stack */ if(yydebug >= 4) printf("char %s in %s", yytokname(yychar), yystatname(yystate)); yyp++; if(yyp >= &yys[YYMAXDEPTH]) { yyerror("yacc stack overflow"); goto ret1; } yyp->yys = yystate; yyp->yyv = yyval; yynewstate: yyn = yypact[yystate]; if(yyn <= YYFLAG) goto yydefault; /* simple state */ if(yychar < 0) #ifdef YYARG yychar = yylex1(yyarg); #else yychar = yylex1(); #endif yyn += yychar; if(yyn < 0 || yyn >= YYLAST) goto yydefault; yyn = yyact[yyn]; if(yychk[yyn] == yychar) { /* valid shift */ yychar = -1; yyval = yylval; yystate = yyn; if(yyerrflag > 0) yyerrflag--; goto yystack; } yydefault: /* default state action */ yyn = yydef[yystate]; if(yyn == -2) { if(yychar < 0) #ifdef YYARG yychar = yylex1(yyarg); #else yychar = yylex1(); #endif /* look through exception table */ for(yyxi=yyexca;; yyxi+=2) if(yyxi[0] == -1 && yyxi[1] == yystate) break; for(yyxi += 2;; yyxi += 2) { yyn = yyxi[0]; if(yyn < 0 || yyn == yychar) break; } yyn = yyxi[1]; if(yyn < 0) goto ret0; } if(yyn == 0) { /* error ... attempt to resume parsing */ switch(yyerrflag) { case 0: /* brand new error */ yyerror("syntax error"); if(yydebug >= 1) { printf("%s", yystatname(yystate)); printf("saw %s\n", yytokname(yychar)); } goto yyerrlab; yyerrlab: yynerrs++; case 1: case 2: /* incompletely recovered error ... try again */ yyerrflag = 3; /* find a state where "error" is a legal shift action */ while(yyp >= yys) { yyn = yypact[yyp->yys] + YYERRCODE; if(yyn >= 0 && yyn < YYLAST) { yystate = yyact[yyn]; /* simulate a shift of "error" */ if(yychk[yystate] == YYERRCODE) goto yystack; } /* the current yyp has no shift onn "error", pop stack */ if(yydebug >= 2) printf("error recovery pops state %d, uncovers %d\n", yyp->yys, (yyp-1)->yys ); yyp--; } /* there is no state on the stack with an error shift ... abort */ goto ret1; case 3: /* no shift yet; clobber input char */ if(yydebug >= YYEOFCODE) printf("error recovery discards %s\n", yytokname(yychar)); if(yychar == YYEOFCODE) goto ret1; yychar = -1; goto yynewstate; /* try again in the same state */ } } /* reduction by production yyn */ if(yydebug >= 2) printf("reduce %d in:\n\t%s", yyn, yystatname(yystate)); yypt = yyp; yyp -= yyr2[yyn]; yyval = (yyp+1)->yyv; yym = yyn; /* consult goto table to find next state */ yyn = yyr1[yyn]; yyg = yypgo[yyn]; yyj = yyg + yyp->yys + 1; if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) yystate = yyact[yyg]; switch(yym) { $A } goto yystack; /* stack new state and value */ } 9base-6/cleanname/0000755000175000017500000000000011402154555013471 5ustar anselmanselm9base-6/cleanname/cleanname.c0000644000175000017500000000131311402154555015556 0ustar anselmanselm#include #include void main(int argc, char **argv) { char *dir; char *name; int i; dir = nil; ARGBEGIN{ case 'd': if((dir=ARGF()) == nil) goto Usage; break; default: goto Usage; }ARGEND; if(argc < 1) { Usage: fprint(2, "usage: cleanname [-d pwd] name...\n"); exits("usage"); } for(i=0; i #include void main(int argc, char *argv[]) { char *pr; int n, dflag; dflag = 0; if(argc>1 && strcmp(argv[1], "-d") == 0){ --argc; ++argv; dflag = 1; } if(argc < 2 || argc > 3){ fprint(2, "usage: basename [-d] string [suffix]\n"); exits("usage"); } pr = utfrrune(argv[1], '/'); if(dflag){ if(pr){ *pr = 0; print("%s\n", argv[1]); exits(0); } print(".\n"); exits(0); } if(pr) pr++; else pr = argv[1]; if(argc==3){ n = strlen(pr)-strlen(argv[2]); if(n >= 0 && !strcmp(pr+n, argv[2])) pr[n] = 0; } print("%s\n", pr); exits(0); } 9base-6/basename/Makefile0000644000175000017500000000021011402154555014752 0ustar anselmanselm# basename - basename unix port from plan9 # Depends on ../lib9 TARG = basename include ../std.mk pre-uninstall: post-install: 9base-6/basename/basename.10000644000175000017500000000102611402154555015155 0ustar anselmanselm.TH BASENAME 1 .SH NAME basename \- strip file name affixes .SH SYNOPSIS .B basename [ .B -d ] .I string [ .I suffix ] .SH DESCRIPTION .PP .I Basename deletes any prefix ending in slash .RB ( / ) and the .IR suffix , if present in .IR string , from .IR string , and prints the result on the standard output. .PP The .B -d option instead prints the directory component, that is, .I string up to but not including the final slash. If the string contains no slash, a period and newline are printed. .SH SOURCE .B \*9/src/cmd/basename.c 9base-6/freq/0000755000175000017500000000000011402154555012503 5ustar anselmanselm9base-6/freq/Makefile0000644000175000017500000000017111402154555014142 0ustar anselmanselm# freq - unix port from plan9 # # Depends on ../lib9 TARG = freq include ../std.mk pre-uninstall: post-install: 9base-6/freq/freq.c0000644000175000017500000000322111402154555013602 0ustar anselmanselm#include #include #include long count[1<<16]; Biobuf bout; void freq(int, char*); long flag; enum { Fdec = 1<<0, Fhex = 1<<1, Foct = 1<<2, Fchar = 1<<3, Frune = 1<<4 }; void main(int argc, char *argv[]) { int f, i; flag = 0; Binit(&bout, 1, OWRITE); ARGBEGIN{ default: fprint(2, "freq: unknown option %c\n", ARGC()); exits("usage"); case 'd': flag |= Fdec; break; case 'x': flag |= Fhex; break; case 'o': flag |= Foct; break; case 'c': flag |= Fchar; break; case 'r': flag |= Frune; break; }ARGEND if((flag&(Fdec|Fhex|Foct|Fchar)) == 0) flag |= Fdec | Fhex | Foct | Fchar; if(argc < 1) { freq(0, "-"); exits(0); } for(i=0; i= 0x7f && i < 0xa0 || i > 0xff && !(flag & Frune)) Bprint(&bout, "- "); else Bprint(&bout, "%C ", (int)i); } Bprint(&bout, "%8ld\n", count[i]); } Bflush(&bout); } 9base-6/freq/freq.10000644000175000017500000000133611402154555013525 0ustar anselmanselm.TH FREQ 1 .SH NAME freq \- print histogram of character frequencies .SH SYNOPSIS .B freq [ .B -dxocr ] [ .I file ... ] .SH DESCRIPTION .I Freq reads the given files (default standard input) and prints histograms of the character frequencies. By default, .I freq counts each byte as a character; under the .B -r option it instead counts .SM UTF sequences, that is, runes. .PP Each non-zero entry of the table is printed preceded by the byte value, in decimal, octal, hex, and Unicode character (if printable). If any options are given, the .BR -d , .BR -x , .BR -o , .B -c flags specify a subset of value formats: decimal, hex, octal, and character, respectively. .SH SOURCE .B \*9/src/cmd/freq.c .SH SEE ALSO .IR utf (7), .IR wc (1) 9base-6/yacc.mk0000644000175000017500000000151711402154555013022 0ustar anselmanselm# yacc.mk - included by all Makefiles in subdirs which depend on yacc include ../config.mk all: @if [ ! -f y.tab.c ]; then \ make -f Makefile depend;\ fi @make -f Makefile ${TARG} @echo built ${TARG} depend: @echo YACC ${YFILES} @${YACC} -d ${YFILES} install: ${TARG} @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f ${TARG} ${DESTDIR}${PREFIX}/bin/ @chmod 755 ${DESTDIR}${PREFIX}/bin/${TARG} @mkdir -p ${DESTDIR}${MANPREFIX}/man1 @cp -f ${MANFILES} ${DESTDIR}${MANPREFIX}/man1 @chmod 444 ${DESTDIR}${MANPREFIX}/man1/${MANFILES} uninstall: rm -f ${DESTDIR}${PREFIX}/bin/${TARG} rm -f ${DESTDIR}${MANPREFIX}/man1/${MANFILES} .c.o: @echo CC $*.c @${CC} ${CFLAGS} -I../lib9 -I../lib9 $*.c clean: rm -f ${OFILES} ${TARG} y.tab.c y.tab.h ${TARG}: ${OFILES} @echo LD ${TARG} @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L../lib9 -l9 9base-6/rc/0000755000175000017500000000000011402154555012152 5ustar anselmanselm9base-6/rc/trap.c0000644000175000017500000000155611402154555013273 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "fns.h" #include "io.h" extern char *Signame[]; void dotrap(void) { int i; struct var *trapreq; struct word *starval; starval = vlook("*")->val; while(ntrap) for(i = 0;i!=NSIG;i++) while(trap[i]){ --trap[i]; --ntrap; if(getpid()!=mypid) Exit(getstatus()); trapreq = vlook(Signame[i]); if(trapreq->fn){ start(trapreq->fn, trapreq->pc, (struct var *)0); runq->local = newvar(strdup("*"), runq->local); runq->local->val = copywords(starval, (struct word *)0); runq->local->changed = 1; runq->redir = runq->startredir = 0; } else if(i==SIGINT || i==SIGQUIT){ /* * run the stack down until we uncover the * command reading loop. Xreturn will exit * if there is none (i.e. if this is not * an interactive rc.) */ while(!runq->iflag) Xreturn(); } else Exit(getstatus()); } } 9base-6/rc/getflags.c0000644000175000017500000000757211402154555014125 0ustar anselmanselm/*% cyntax -DTEST % && cc -DTEST -go # % */ #include "rc.h" #include "getflags.h" #include "fns.h" char *flagset[] = {""}; char **flag[NFLAG]; char cmdline[NCMDLINE+1]; char *cmdname; static char *flagarg=""; static void reverse(char**, char**); static int scanflag(int, char*); static void errn(char*, int); static void errs(char*); static void errc(int); static int reason; #define RESET 1 #define FEWARGS 2 #define FLAGSYN 3 #define BADFLAG 4 static int badflag; int getflags(int argc, char *argv[], char *flags, int stop) { char *s, *t; int i, j, c, count; flagarg = flags; if(cmdname==0) cmdname = argv[0]; s = cmdline; for(i = 0;i!=argc;i++){ for(t = argv[i];*t;t++) if(s!=&cmdline[NCMDLINE]) *s++=*t; if(i!=argc-1 && s!=&cmdline[NCMDLINE]) *s++=' '; } *s='\0'; i = 1; while(i!=argc){ if(argv[i][0]!='-' || argv[i][1]=='\0'){ if(stop) return argc; i++; continue; } s = argv[i]+1; while(*s){ c=*s++; count = scanflag(c, flags); if(count==-1) return -1; if(flag[c]){ reason = RESET; badflag = c; return -1; } if(count==0){ flag[c] = flagset; if(*s=='\0'){ for(j = i+1;j<=argc;j++) argv[j-1] = argv[j]; --argc; } } else{ if(*s=='\0'){ for(j = i+1;j<=argc;j++) argv[j-1] = argv[j]; --argc; s = argv[i]; } if(argc-icode[runq->pc]; while(c->f==Xpopredir) c++; return c->f==Xexit; } void Xsimple(void) { word *a; thread *p = runq; var *v; struct builtin *bp; int pid; globlist(); a = runq->argv->words; if(a==0){ Xerror1("empty argument list"); return; } if(flag['x']) pfmt(err, "%v\n", p->argv->words); /* wrong, should do redirs */ v = gvlook(a->word); if(v->fn) execfunc(v); else{ if(strcmp(a->word, "builtin")==0){ if(count(a)==1){ pfmt(err, "builtin: empty argument list\n"); setstatus("empty arg list"); poplist(); return; } a = a->next; popword(); } for(bp = Builtin;bp->name;bp++) if(strcmp(a->word, bp->name)==0){ (*bp->fnc)(); return; } if(exitnext()){ /* fork and wait is redundant */ pushword("exec"); execexec(); Xexit(); } else{ flush(err); Updenv(); /* necessary so changes don't go out again */ if((pid = execforkexec()) < 0){ Xerror("try again"); return; } /* interrupts don't get us out */ poplist(); while(Waitfor(pid, 1) < 0) ; } } } struct word nullpath = { "", 0}; void doredir(redir *rp) { if(rp){ doredir(rp->next); switch(rp->type){ case ROPEN: if(rp->from!=rp->to){ Dup(rp->from, rp->to); close(rp->from); } break; case RDUP: Dup(rp->from, rp->to); break; case RCLOSE: close(rp->from); break; } } } word* searchpath(char *w) { word *path; if(strncmp(w, "/", 1)==0 /* || strncmp(w, "#", 1)==0 */ || strncmp(w, "./", 2)==0 || strncmp(w, "../", 3)==0 || (path = vlook("path")->val)==0) path=&nullpath; return path; } void execexec(void) { popword(); /* "exec" */ if(runq->argv->words==0){ Xerror1("empty argument list"); return; } doredir(runq->redir); Execute(runq->argv->words, searchpath(runq->argv->words->word)); poplist(); } void execfunc(var *func) { word *starval; popword(); starval = runq->argv->words; runq->argv->words = 0; poplist(); start(func->fn, func->pc, runq->local); runq->local = newvar(strdup("*"), runq->local); runq->local->val = starval; runq->local->changed = 1; } int dochdir(char *word) { /* report to /dev/wdir if it exists and we're interactive */ static int wdirfd = -2; if(chdir(word)<0) return -1; if(flag['i']!=0){ if(wdirfd==-2) /* try only once */ wdirfd = open("/dev/wdir", OWRITE|OCEXEC); if(wdirfd>=0) write(wdirfd, word, strlen(word)); } return 1; } void execcd(void) { word *a = runq->argv->words; word *cdpath; char dir[512]; setstatus("can't cd"); cdpath = vlook("cdpath")->val; switch(count(a)){ default: pfmt(err, "Usage: cd [directory]\n"); break; case 2: if(a->next->word[0]=='/' || cdpath==0) cdpath=&nullpath; for(;cdpath;cdpath = cdpath->next){ strcpy(dir, cdpath->word); if(dir[0]) strcat(dir, "/"); strcat(dir, a->next->word); if(dochdir(dir)>=0){ if(strlen(cdpath->word) && strcmp(cdpath->word, ".")!=0) pfmt(err, "%s\n", dir); setstatus(""); break; } } if(cdpath==0) pfmt(err, "Can't cd %s: %r\n", a->next->word); break; case 1: a = vlook("home")->val; if(count(a)>=1){ if(dochdir(a->word)>=0) setstatus(""); else pfmt(err, "Can't cd %s: %r\n", a->word); } else pfmt(err, "Can't cd -- $home empty\n"); break; } poplist(); } void execexit(void) { switch(count(runq->argv->words)){ default: pfmt(err, "Usage: exit [status]\nExiting anyway\n"); case 2: setstatus(runq->argv->words->next->word); case 1: Xexit(); } } void execshift(void) { int n; word *a; var *star; switch(count(runq->argv->words)){ default: pfmt(err, "Usage: shift [n]\n"); setstatus("shift usage"); poplist(); return; case 2: n = atoi(runq->argv->words->next->word); break; case 1: n = 1; break; } star = vlook("*"); for(;n && star->val;--n){ a = star->val->next; efree(star->val->word); efree((char *)star->val); star->val = a; star->changed = 1; } setstatus(""); poplist(); } int octal(char *s) { int n = 0; while(*s==' ' || *s=='\t' || *s=='\n') s++; while('0'<=*s && *s<='7') n = n*8+*s++-'0'; return n; } int mapfd(int fd) { redir *rp; for(rp = runq->redir;rp;rp = rp->next){ switch(rp->type){ case RCLOSE: if(rp->from==fd) fd=-1; break; case RDUP: case ROPEN: if(rp->to==fd) fd = rp->from; break; } } return fd; } union code rdcmds[4]; void execcmds(io *f) { static int first = 1; if(first){ rdcmds[0].i = 1; rdcmds[1].f = Xrdcmds; rdcmds[2].f = Xreturn; first = 0; } start(rdcmds, 1, runq->local); runq->cmdfd = f; runq->iflast = 0; } void execeval(void) { char *cmdline, *s, *t; int len = 0; word *ap; if(count(runq->argv->words)<=1){ Xerror1("Usage: eval cmd ..."); return; } eflagok = 1; for(ap = runq->argv->words->next;ap;ap = ap->next) len+=1+strlen(ap->word); cmdline = emalloc(len); s = cmdline; for(ap = runq->argv->words->next;ap;ap = ap->next){ for(t = ap->word;*t;) *s++=*t++; *s++=' '; } s[-1]='\n'; poplist(); execcmds(opencore(cmdline, len)); efree(cmdline); } union code dotcmds[14]; void execdot(void) { int iflag = 0; int fd; list *av; thread *p = runq; char *zero; static int first = 1; char file[512]; word *path; if(first){ dotcmds[0].i = 1; dotcmds[1].f = Xmark; dotcmds[2].f = Xword; dotcmds[3].s="0"; dotcmds[4].f = Xlocal; dotcmds[5].f = Xmark; dotcmds[6].f = Xword; dotcmds[7].s="*"; dotcmds[8].f = Xlocal; dotcmds[9].f = Xrdcmds; dotcmds[10].f = Xunlocal; dotcmds[11].f = Xunlocal; dotcmds[12].f = Xreturn; first = 0; } else eflagok = 1; popword(); if(p->argv->words && strcmp(p->argv->words->word, "-i")==0){ iflag = 1; popword(); } /* get input file */ if(p->argv->words==0){ Xerror1("Usage: . [-i] file [arg ...]"); return; } zero = strdup(p->argv->words->word); popword(); fd=-1; for(path = searchpath(zero);path;path = path->next){ strcpy(file, path->word); if(file[0]) strcat(file, "/"); strcat(file, zero); if((fd = open(file, 0))>=0) break; if(strcmp(file, "/dev/stdin")==0){ /* for sun & ucb */ fd = Dup1(0); if(fd>=0) break; } } if(fd<0){ pfmt(err, "%s: ", zero); setstatus("can't open"); Xerror(".: can't open"); return; } /* set up for a new command loop */ start(dotcmds, 1, (struct var *)0); pushredir(RCLOSE, fd, 0); runq->cmdfile = zero; runq->cmdfd = openfd(fd); runq->iflag = iflag; runq->iflast = 0; /* push $* value */ pushlist(); runq->argv->words = p->argv->words; /* free caller's copy of $* */ av = p->argv; p->argv = av->next; efree((char *)av); /* push $0 value */ pushlist(); pushword(zero); ndot++; } void execflag(void) { char *letter, *val; switch(count(runq->argv->words)){ case 2: setstatus(flag[(uchar)runq->argv->words->next->word[0]]?"":"flag not set"); break; case 3: letter = runq->argv->words->next->word; val = runq->argv->words->next->next->word; if(strlen(letter)==1){ if(strcmp(val, "+")==0){ flag[(uchar)letter[0]] = flagset; break; } if(strcmp(val, "-")==0){ flag[(uchar)letter[0]] = 0; break; } } default: Xerror1("Usage: flag [letter] [+-]"); return; } poplist(); } void execwhatis(void){ /* mildly wrong -- should fork before writing */ word *a, *b, *path; var *v; struct builtin *bp; char file[512]; struct io out[1]; int found, sep; a = runq->argv->words->next; if(a==0){ Xerror1("Usage: whatis name ..."); return; } setstatus(""); out->fd = mapfd(1); out->bufp = out->buf; out->ebuf = &out->buf[NBUF]; out->strp = 0; for(;a;a = a->next){ v = vlook(a->word); if(v->val){ pfmt(out, "%s=", a->word); if(v->val->next==0) pfmt(out, "%q\n", v->val->word); else{ sep='('; for(b = v->val;b && b->word;b = b->next){ pfmt(out, "%c%q", sep, b->word); sep=' '; } pfmt(out, ")\n"); } found = 1; } else found = 0; v = gvlook(a->word); if(v->fn) pfmt(out, "fn %s %s\n", v->name, v->fn[v->pc-1].s); else{ for(bp = Builtin;bp->name;bp++) if(strcmp(a->word, bp->name)==0){ pfmt(out, "builtin %s\n", a->word); break; } if(!bp->name){ for(path = searchpath(a->word);path;path = path->next){ strcpy(file, path->word); if(file[0]) strcat(file, "/"); strcat(file, a->word); if(Executable(file)){ pfmt(out, "%s\n", file); break; } } if(!path && !found){ pfmt(err, "%s: not found\n", a->word); setstatus("not found"); } } } } poplist(); flush(err); } void execwait(void) { switch(count(runq->argv->words)){ default: Xerror1("Usage: wait [pid]"); return; case 2: Waitfor(atoi(runq->argv->words->next->word), 0); break; case 1: Waitfor(-1, 0); break; } poplist(); } 9base-6/rc/fmtquote.c0000644000175000017500000000703111402154555014163 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "fmt.h" #include "fmtdef.h" extern int (*doquote)(int); /* * How many bytes of output UTF will be produced by quoting (if necessary) this string? * How many runes? How much of the input will be consumed? * The parameter q is filled in by _quotesetup. * The string may be UTF or Runes (s or r). * Return count does not include NUL. * Terminate the scan at the first of: * NUL in input * count exceeded in input * count exceeded on output * *ninp is set to number of input bytes accepted. * nin may be <0 initially, to avoid checking input by count. */ void __quotesetup(char *s, int nin, int nout, Quoteinfo *q, int sharp) { int c; q->quoted = 0; q->nbytesout = 0; q->nrunesout = 0; q->nbytesin = 0; q->nrunesin = 0; if(sharp || nin==0 || *s=='\0'){ if(nout < 2) return; q->quoted = 1; q->nbytesout = 2; q->nrunesout = 2; } for(; nin!=0; nin-=1){ c = *s; if(c == '\0') break; if(q->nrunesout+1 > nout) break; if((c <= L' ') || (c == L'\'') || (doquote!=nil && doquote(c))){ if(!q->quoted){ if(1+q->nrunesout+1+1 > nout) /* no room for quotes */ break; q->nrunesout += 2; /* include quotes */ q->nbytesout += 2; /* include quotes */ q->quoted = 1; } if(c == '\'') { q->nbytesout++; q->nrunesout++; /* quotes reproduce as two characters */ } } /* advance input */ s++; q->nbytesin++; q->nrunesin++; /* advance output */ q->nbytesout++; q->nrunesout++; } } static int qstrfmt(char *sin, Quoteinfo *q, Fmt *f) { int r; char *t, *s, *m, *me; ulong fl; int nc, w; m = sin; me = m + q->nbytesin; w = f->width; fl = f->flags; if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0) return -1; t = f->to; s = f->stop; FMTCHAR(f, t, s, '\''); for(nc = q->nrunesin; nc > 0; nc--){ r = *(uchar*)m++; FMTCHAR(f, t, s, r); if(r == '\'') FMTCHAR(f, t, s, r); } FMTCHAR(f, t, s, '\''); f->nfmt += t - (char *)f->to; f->to = t; if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0) return -1; return 0; } int __quotestrfmt(int runesin, Fmt *f) { int outlen; char *s; Quoteinfo q; f->flags &= ~FmtPrec; /* ignored for %q %Q, so disable for %s %S in easy case */ s = va_arg(f->args, char *); if(!s) return __fmtcpy(f, "", 5, 5); if(f->flush) outlen = 0x7FFFFFFF; /* if we can flush, no output limit */ else outlen = (char*)f->stop - (char*)f->to; __quotesetup(s, -1, outlen, &q, f->flags&FmtSharp); if(!q.quoted) return __fmtcpy(f, s, q.nrunesin, q.nbytesin); return qstrfmt(s, &q, f); } int quotestrfmt(Fmt *f) { return __quotestrfmt(0, f); } void quotefmtinstall(void) { fmtinstall('q', quotestrfmt); } int __needsquotes(char *s, int *quotelenp) { Quoteinfo q; __quotesetup(s, -1, 0x7FFFFFFF, &q, 0); *quotelenp = q.nbytesout; return q.quoted; } 9base-6/rc/code.c0000644000175000017500000002013711402154555013233 0ustar anselmanselm#include "rc.h" #include "io.h" #include "exec.h" #include "fns.h" #include "getflags.h" #define c0 t->child[0] #define c1 t->child[1] #define c2 t->child[2] int codep, ncode; #define emitf(x) ((void)(codep!=ncode || morecode()), codebuf[codep].f = (x), codep++) #define emiti(x) ((void)(codep!=ncode || morecode()), codebuf[codep].i = (x), codep++) #define emits(x) ((void)(codep!=ncode || morecode()), codebuf[codep].s = (x), codep++) void stuffdot(int); char *fnstr(tree*); void outcode(tree*, int); void codeswitch(tree*, int); int iscase(tree*); code *codecopy(code*); void codefree(code*); int morecode(void) { ncode+=100; codebuf = (code *)realloc((char *)codebuf, ncode*sizeof codebuf[0]); if(codebuf==0) panic("Can't realloc %d bytes in morecode!", ncode*sizeof codebuf[0]); memset(codebuf+ncode-100, 0, 100*sizeof codebuf[0]); return 0; } void stuffdot(int a) { if(a<0 || codep<=a) panic("Bad address %d in stuffdot", a); codebuf[a].i = codep; } int compile(tree *t) { ncode = 100; codebuf = (code *)emalloc(ncode*sizeof codebuf[0]); codep = 0; emiti(0); /* reference count */ outcode(t, flag['e']?1:0); if(nerror){ efree((char *)codebuf); return 0; } readhere(); emitf(Xreturn); emitf(0); return 1; } void cleanhere(char *f) { emitf(Xdelhere); emits(strdup(f)); } char* fnstr(tree *t) { io *f = openstr(); char *v; extern char nl; char svnl = nl; nl=';'; pfmt(f, "%t", t); nl = svnl; v = f->strp; f->strp = 0; closeio(f); return v; } void outcode(tree *t, int eflag) { int p, q; tree *tt; if(t==0) return; if(t->type!=NOT && t->type!=';') runq->iflast = 0; switch(t->type){ default: pfmt(err, "bad type %d in outcode\n", t->type); break; case '$': emitf(Xmark); outcode(c0, eflag); emitf(Xdol); break; case '"': emitf(Xmark); outcode(c0, eflag); emitf(Xqdol); break; case SUB: emitf(Xmark); outcode(c0, eflag); emitf(Xmark); outcode(c1, eflag); emitf(Xsub); break; case '&': emitf(Xasync); if(havefork){ p = emiti(0); outcode(c0, eflag); emitf(Xexit); stuffdot(p); } else emits(fnstr(c0)); break; case ';': outcode(c0, eflag); outcode(c1, eflag); break; case '^': emitf(Xmark); outcode(c1, eflag); emitf(Xmark); outcode(c0, eflag); emitf(Xconc); break; case '`': emitf(Xbackq); if(havefork){ p = emiti(0); outcode(c0, 0); emitf(Xexit); stuffdot(p); } else emits(fnstr(c0)); break; case ANDAND: outcode(c0, 0); emitf(Xtrue); p = emiti(0); outcode(c1, eflag); stuffdot(p); break; case ARGLIST: outcode(c1, eflag); outcode(c0, eflag); break; case BANG: outcode(c0, eflag); emitf(Xbang); break; case PCMD: case BRACE: outcode(c0, eflag); break; case COUNT: emitf(Xmark); outcode(c0, eflag); emitf(Xcount); break; case FN: emitf(Xmark); outcode(c0, eflag); if(c1){ emitf(Xfn); p = emiti(0); emits(fnstr(c1)); outcode(c1, eflag); emitf(Xunlocal); /* get rid of $* */ emitf(Xreturn); stuffdot(p); } else emitf(Xdelfn); break; case IF: outcode(c0, 0); emitf(Xif); p = emiti(0); outcode(c1, eflag); emitf(Xwastrue); stuffdot(p); break; case NOT: if(!runq->iflast) yyerror("`if not' does not follow `if(...)'"); emitf(Xifnot); p = emiti(0); outcode(c0, eflag); stuffdot(p); break; case OROR: outcode(c0, 0); emitf(Xfalse); p = emiti(0); outcode(c1, eflag); stuffdot(p); break; case PAREN: outcode(c0, eflag); break; case SIMPLE: emitf(Xmark); outcode(c0, eflag); emitf(Xsimple); if(eflag) emitf(Xeflag); break; case SUBSHELL: emitf(Xsubshell); if(havefork){ p = emiti(0); outcode(c0, eflag); emitf(Xexit); stuffdot(p); } else emits(fnstr(c0)); if(eflag) emitf(Xeflag); break; case SWITCH: codeswitch(t, eflag); break; case TWIDDLE: emitf(Xmark); outcode(c1, eflag); emitf(Xmark); outcode(c0, eflag); emitf(Xmatch); if(eflag) emitf(Xeflag); break; case WHILE: q = codep; outcode(c0, 0); if(q==codep) emitf(Xsettrue); /* empty condition == while(true) */ emitf(Xtrue); p = emiti(0); outcode(c1, eflag); emitf(Xjump); emiti(q); stuffdot(p); break; case WORDS: outcode(c1, eflag); outcode(c0, eflag); break; case FOR: emitf(Xmark); if(c1){ outcode(c1, eflag); emitf(Xglob); } else{ emitf(Xmark); emitf(Xword); emits(strdup("*")); emitf(Xdol); } emitf(Xmark); /* dummy value for Xlocal */ emitf(Xmark); outcode(c0, eflag); emitf(Xlocal); p = emitf(Xfor); q = emiti(0); outcode(c2, eflag); emitf(Xjump); emiti(p); stuffdot(q); emitf(Xunlocal); break; case WORD: emitf(Xword); emits(strdup(t->str)); break; case DUP: if(t->rtype==DUPFD){ emitf(Xdup); emiti(t->fd0); emiti(t->fd1); } else{ emitf(Xclose); emiti(t->fd0); } outcode(c1, eflag); emitf(Xpopredir); break; case PIPEFD: emitf(Xpipefd); emiti(t->rtype); if(havefork){ p = emiti(0); outcode(c0, eflag); emitf(Xexit); stuffdot(p); } else { emits(fnstr(c0)); } break; case REDIR: emitf(Xmark); outcode(c0, eflag); emitf(Xglob); switch(t->rtype){ case APPEND: emitf(Xappend); break; case WRITE: emitf(Xwrite); break; case READ: case HERE: emitf(Xread); break; case RDWR: emitf(Xrdwr); break; } emiti(t->fd0); outcode(c1, eflag); emitf(Xpopredir); break; case '=': tt = t; for(;t && t->type=='=';t = c2); if(t){ for(t = tt;t->type=='=';t = c2){ emitf(Xmark); outcode(c1, eflag); emitf(Xmark); outcode(c0, eflag); emitf(Xlocal); } outcode(t, eflag); for(t = tt; t->type=='='; t = c2) emitf(Xunlocal); } else{ for(t = tt;t;t = c2){ emitf(Xmark); outcode(c1, eflag); emitf(Xmark); outcode(c0, eflag); emitf(Xassign); } } t = tt; /* so tests below will work */ break; case PIPE: emitf(Xpipe); emiti(t->fd0); emiti(t->fd1); if(havefork){ p = emiti(0); q = emiti(0); outcode(c0, eflag); emitf(Xexit); stuffdot(p); } else { emits(fnstr(c0)); q = emiti(0); } outcode(c1, eflag); emitf(Xreturn); stuffdot(q); emitf(Xpipewait); break; } if(t->type!=NOT && t->type!=';') runq->iflast = t->type==IF; else if(c0) runq->iflast = c0->type==IF; } /* * switch code looks like this: * Xmark * (get switch value) * Xjump 1f * out: Xjump leave * 1: Xmark * (get case values) * Xcase 1f * (commands) * Xjump out * 1: Xmark * (get case values) * Xcase 1f * (commands) * Xjump out * 1: * leave: * Xpopm */ void codeswitch(tree *t, int eflag) { int leave; /* patch jump address to leave switch */ int out; /* jump here to leave switch */ int nextcase; /* patch jump address to next case */ tree *tt; if(c1->child[0]==nil || c1->child[0]->type!=';' || !iscase(c1->child[0]->child[0])){ yyerror("case missing in switch"); return; } emitf(Xmark); outcode(c0, eflag); emitf(Xjump); nextcase = emiti(0); out = emitf(Xjump); leave = emiti(0); stuffdot(nextcase); t = c1->child[0]; while(t->type==';'){ tt = c1; emitf(Xmark); for(t = c0->child[0];t->type==ARGLIST;t = c0) outcode(c1, eflag); emitf(Xcase); nextcase = emiti(0); t = tt; for(;;){ if(t->type==';'){ if(iscase(c0)) break; outcode(c0, eflag); t = c1; } else{ if(!iscase(t)) outcode(t, eflag); break; } } emitf(Xjump); emiti(out); stuffdot(nextcase); } stuffdot(leave); emitf(Xpopm); } int iscase(tree *t) { if(t->type!=SIMPLE) return 0; do t = c0; while(t->type==ARGLIST); return t->type==WORD && !t->quoted && strcmp(t->str, "case")==0; } code* codecopy(code *cp) { cp[0].i++; return cp; } void codefree(code *cp) { code *p; if(--cp[0].i!=0) return; for(p = cp+1;p->f;p++){ if(p->f==Xappend || p->f==Xclose || p->f==Xread || p->f==Xwrite || p->f==Xrdwr || p->f==Xasync || p->f==Xbackq || p->f==Xcase || p->f==Xfalse || p->f==Xfor || p->f==Xjump || p->f==Xsubshell || p->f==Xtrue) p++; else if(p->f==Xdup || p->f==Xpipefd) p+=2; else if(p->f==Xpipe) p+=4; else if(p->f==Xword || p->f==Xdelhere) efree((++p)->s); else if(p->f==Xfn){ efree(p[2].s); p+=2; } } efree((char *)cp); } 9base-6/rc/pfnc.c0000644000175000017500000000245011402154555013245 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" struct{ void (*f)(void); char *name; }fname[] = { Xappend, "Xappend", Xasync, "Xasync", Xbang, "Xbang", Xclose, "Xclose", Xdup, "Xdup", Xeflag, "Xeflag", Xexit, "Xexit", Xfalse, "Xfalse", Xifnot, "Xifnot", Xjump, "Xjump", Xmark, "Xmark", Xpopm, "Xpopm", Xrdwr, "Xrdwr", Xread, "Xread", Xreturn, "Xreturn", Xtrue, "Xtrue", Xif, "Xif", Xwastrue, "Xwastrue", Xword, "Xword", Xwrite, "Xwrite", Xmatch, "Xmatch", Xcase, "Xcase", Xconc, "Xconc", Xassign, "Xassign", Xdol, "Xdol", Xcount, "Xcount", Xlocal, "Xlocal", Xunlocal, "Xunlocal", Xfn, "Xfn", Xdelfn, "Xdelfn", Xpipe, "Xpipe", Xpipewait, "Xpipewait", Xrdcmds, "Xrdcmds", (void (*)(void))Xerror, "Xerror", Xbackq, "Xbackq", Xpipefd, "Xpipefd", Xsubshell, "Xsubshell", Xdelhere, "Xdelhere", Xfor, "Xfor", Xglob, "Xglob", Xrdfn, "Xrdfn", Xsimple, "Xsimple", Xrdfn, "Xrdfn", Xqdol, "Xqdol", 0}; void pfnc(io *fd, thread *t) { int i; void (*fn)(void) = t->code[t->pc].f; list *a; pfmt(fd, "pid %d cycle %p %d ", getpid(), t->code, t->pc); for(i = 0;fname[i].f;i++) if(fname[i].f==fn){ pstr(fd, fname[i].name); break; } if(!fname[i].f) pfmt(fd, "%p", fn); for(a = t->argv;a;a = a->next) pfmt(fd, " (%v)", a->words); pchr(fd, '\n'); flush(fd); } 9base-6/rc/var.c0000644000175000017500000000500111402154555013102 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "fns.h" int hash(char *s, int n) { int h = 0, i = 1; while(*s) h+=*s++*i++; h%=n; return h<0?h+n:h; } #define NKW 30 struct kw{ char *name; int type; struct kw *next; }*kw[NKW]; void kenter(int type, char *name) { int h = hash(name, NKW); struct kw *p = new(struct kw); p->type = type; p->name = name; p->next = kw[h]; kw[h] = p; } void kinit(void) { kenter(FOR, "for"); kenter(IN, "in"); kenter(WHILE, "while"); kenter(IF, "if"); kenter(NOT, "not"); kenter(TWIDDLE, "~"); kenter(BANG, "!"); kenter(SUBSHELL, "@"); kenter(SWITCH, "switch"); kenter(FN, "fn"); } tree* klook(char *name) { struct kw *p; tree *t = token(name, WORD); for(p = kw[hash(name, NKW)];p;p = p->next) if(strcmp(p->name, name)==0){ t->type = p->type; t->iskw = 1; break; } return t; } var* gvlook(char *name) { int h = hash(name, NVAR); var *v; for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v; return gvar[h] = newvar(strdup(name), gvar[h]); } var* vlook(char *name) { var *v; if(runq) for(v = runq->local;v;v = v->next) if(strcmp(v->name, name)==0) return v; return gvlook(name); } void _setvar(char *name, word *val, int callfn) { struct var *v = vlook(name); freewords(v->val); v->val=val; v->changed=1; if(callfn && v->changefn) v->changefn(v); } void setvar(char *name, word *val) { _setvar(name, val, 1); } void bigpath(var *v) { /* convert $PATH to $path */ char *p, *q; word **l, *w; if(v->val == nil){ _setvar("path", nil, 0); return; } p = v->val->word; w = nil; l = &w; /* * Doesn't handle escaped colon nonsense. */ if(p[0] == 0) p = nil; while(p){ q = strchr(p, ':'); if(q) *q = 0; *l = newword(p[0] ? p : ".", nil); l = &(*l)->next; if(q){ *q = ':'; p = q+1; }else p = nil; } _setvar("path", w, 0); } char* list2strcolon(word *words) { char *value, *s, *t; int len = 0; word *ap; for(ap = words;ap;ap = ap->next) len+=1+strlen(ap->word); value = emalloc(len+1); s = value; for(ap = words;ap;ap = ap->next){ for(t = ap->word;*t;) *s++=*t++; *s++=':'; } if(s==value) *s='\0'; else s[-1]='\0'; return value; } void littlepath(var *v) { /* convert $path to $PATH */ char *p; word *w; p = list2strcolon(v->val); w = new(word); w->word = p; w->next = nil; _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */ } void pathinit(void) { var *v; v = gvlook("path"); v->changefn = littlepath; v = gvlook("PATH"); v->changefn = bigpath; bigpath(v); } 9base-6/rc/rc.10000644000175000017500000004727211402154555012654 0ustar anselmanselm.TH RC 1 .SH NAME rc, cd, eval, exec, exit, flag, rfork, shift, wait, whatis, ., ~ \- command language .SH SYNOPSIS .B rc [ .B -srdiIlxepvV ] [ .B -c command ] [ .I file [ .I arg ... ]] .SH DESCRIPTION .I Rc is the Plan 9 shell. It executes command lines read from a terminal or a file or, with the .B -c flag, from .I rc's argument list. .SS Command Lines A command line is a sequence of commands, separated by ampersands or semicolons .RB ( & or .BR ; ), terminated by a newline. The commands are executed in sequence from left to right. .I Rc does not wait for a command followed by .B & to finish executing before starting the following command. Whenever a command followed by .B & is executed, its process id is assigned to the .I rc variable .BR $apid . Whenever a command .I not followed by .B & exits or is terminated, the .I rc variable .B $status gets the process's wait message (see .IR wait (3)); it will be the null string if the command was successful. .PP A long command line may be continued on subsequent lines by typing a backslash .RB ( \e ) followed by a newline. This sequence is treated as though it were a blank. Backslash is not otherwise a special character. .PP A number-sign .RB ( # ) and any following characters up to (but not including) the next newline are ignored, except in quotation marks. .SS Simple Commands A simple command is a sequence of arguments interspersed with I/O redirections. If the first argument is the name of an .I rc function or of one of .I rc's built-in commands, it is executed by .IR rc . Otherwise if the name starts with a slash .RB ( / ), it must be the path name of the program to be executed. Names containing no initial slash are searched for in a list of directory names stored in .BR $path . The first executable file of the given name found in a directory in .B $path is the program to be executed. To be executable, the user must have execute permission (see .IR stat (3)) and the file must be either an executable binary for the current machine's CPU type, or a shell script. Shell scripts begin with a line containing the full path name of a shell (usually .BR /bin/rc ), prefixed by .LR #! . .PP The first word of a simple command cannot be a keyword unless it is quoted or otherwise disguised. The keywords are .EX for in while if not switch fn ~ ! @ .EE .SS Arguments and Variables A number of constructions may be used where .I rc's syntax requires an argument to appear. In many cases a construction's value will be a list of arguments rather than a single string. .PP The simplest kind of argument is the unquoted word: a sequence of one or more characters none of which is a blank, tab, newline, or any of the following: .EX # ; & | ^ $ = ` ' { } ( ) < > .EE An unquoted word that contains any of the characters .B * .B ? .B [ is a pattern for matching against file names. The character .B * matches any sequence of characters, .B ? matches any single character, and .BI [ class ] matches any character in the .IR class . If the first character of .I class is .BR ~ , the class is complemented. The .I class may also contain pairs of characters separated by .BR - , standing for all characters lexically between the two. The character .B / must appear explicitly in a pattern, as must the first character of the path name components .B . and .BR .. . A pattern is replaced by a list of arguments, one for each path name matched, except that a pattern matching no names is not replaced by the empty list, but rather stands for itself. Pattern matching is done after all other operations. Thus, .EX x=/tmp echo $x^/*.c .EE matches .BR /tmp/*.c , rather than matching .B "/*.c and then prefixing .BR /tmp . .PP A quoted word is a sequence of characters surrounded by single quotes .RB ( ' ). A single quote is represented in a quoted word by a pair of quotes .RB ( '' ). .PP Each of the following is an argument. .PD 0 .HP .BI ( arguments ) .br The value of a sequence of arguments enclosed in parentheses is a list comprising the members of each element of the sequence. Argument lists have no recursive structure, although their syntax may suggest it. The following are entirely equivalent: .EX echo hi there everybody ((echo) (hi there) everybody) .EE .HP .BI $ argument .HP .BI $ argument ( subscript ) .br The .I argument after the .B $ is the name of a variable whose value is substituted. Multiple levels of indirection are possible, but of questionable utility. Variable values are lists of strings. If .I argument is a number .IR n , the value is the .IR n th element of .BR $* , unless .B $* doesn't have .I n elements, in which case the value is empty. If .I argument is followed by a parenthesized list of subscripts, the value substituted is a list composed of the requested elements (origin 1). The parenthesis must follow the variable name with no spaces. Subscripts can also take the form .IB m - n or .IB m - to indicate a sequence of elements. Assignments to variables are described below. .HP .BI $# argument .br The value is the number of elements in the named variable. A variable never assigned a value has zero elements. .HP $"\c .I argument .br The value is a single string containing the components of the named variable separated by spaces. A variable with zero elements yields the empty string. .HP .BI `{ command } .br .I rc executes the .I command and reads its standard output, splitting it into a list of arguments, using characters in .B $ifs as separators. If .B $ifs is not otherwise set, its value is .BR "'\ \et\en'" . .HP .BI <{ command } .HP .BI >{ command } .br The .I command is executed asynchronously with its standard output or standard input connected to a pipe. The value of the argument is the name of a file referring to the other end of the pipe. This allows the construction of non-linear pipelines. For example, the following runs two commands .B old and .B new and uses .B cmp to compare their outputs .EX cmp <{old} <{new} .EE .HP .IB argument ^ argument .br The .B ^ operator concatenates its two operands. If the two operands have the same number of components, they are concatenated pairwise. If not, then one operand must have one component, and the other must be non-empty, and concatenation is distributive. .PD .SS Free Carets In most circumstances, .I rc will insert the .B ^ operator automatically between words that are not separated by white space. Whenever one of .B $ .B ' .B ` follows a quoted or unquoted word or an unquoted word follows a quoted word with no intervening blanks or tabs, a .B ^ is inserted between the two. If an unquoted word immediately follows a .BR $ and contains a character other than an alphanumeric, underscore, or .BR * , a .B ^ is inserted before the first such character. Thus .IP .B cc -$flags $stem.c .LP is equivalent to .IP .B cc -^$flags $stem^.c .SS I/O Redirections The sequence .BI > file redirects the standard output file (file descriptor 1, normally the terminal) to the named .IR file ; .BI >> file appends standard output to the file. The standard input file (file descriptor 0, also normally the terminal) may be redirected from a file by the sequence .BI < file \f1, or from an inline `here document' by the sequence .BI << eof-marker\f1. The contents of a here document are lines of text taken from the command input stream up to a line containing nothing but the .IR eof-marker , which may be either a quoted or unquoted word. If .I eof-marker is unquoted, variable names of the form .BI $ word have their values substituted from .I rc's environment. If .BI $ word is followed by a caret .RB ( ^ ), the caret is deleted. If .I eof-marker is quoted, no substitution occurs. .PP Redirections may be applied to a file-descriptor other than standard input or output by qualifying the redirection operator with a number in square brackets. For example, the diagnostic output (file descriptor 2) may be redirected by writing .BR "cc junk.c >[2]junk" . .PP A file descriptor may be redirected to an already open descriptor by writing .BI >[ fd0 = fd1 ] or .BI <[ fd0 = fd1 ]\f1. .I Fd1 is a previously opened file descriptor and .I fd0 becomes a new copy (in the sense of .IR dup (3)) of it. A file descriptor may be closed by writing .BI >[ fd0 =] or .BI <[ fd0 =]\f1. .PP Redirections are executed from left to right. Therefore, .B cc junk.c >/dev/null >[2=1] and .B cc junk.c >[2=1] >/dev/null have different effects: the first puts standard output in .BR /dev/null and then puts diagnostic output in the same place, where the second directs diagnostic output to the terminal and sends standard output to .BR /dev/null . .SS Compound Commands A pair of commands separated by a pipe operator .RB ( | ) is a command. The standard output of the left command is sent through a pipe to the standard input of the right command. The pipe operator may be decorated to use different file descriptors. .BI |[ fd ] connects the output end of the pipe to file descriptor .I fd rather than 1. .BI |[ fd0 = fd1 ] connects output to .I fd1 of the left command and input to .I fd0 of the right command. .PP A pair of commands separated by .B && or .B || is a command. In either case, the left command is executed and its exit status examined. If the operator is .B && the right command is executed if the left command's status is null. .B || causes the right command to be executed if the left command's status is non-null. .PP The exit status of a command may be inverted (non-null is changed to null, null is changed to non-null) by preceding it with a .BR ! . .PP The .B | operator has highest precedence, and is left-associative (i.e. binds tighter to the left than the right). .B ! has intermediate precedence, and .B && and .B || have the lowest precedence. .PP The unary .B @ operator, with precedence equal to .BR ! , causes its operand to be executed in a subshell. .PP Each of the following is a command. .PD 0 .HP .B if ( .I list .B ) .I command .br A .I list is a sequence of commands, separated by .BR & , .BR ; , or newline. It is executed and if its exit status is null, the .I command is executed. .HP .B if not .I command .br The immediately preceding command must have been .BI if( list ) .IR command . If its condition was non-zero, the .I command is executed. .HP .BI for( name .B in .IB arguments ) .I command .HP .BI for( name ) .I command .br The .I command is executed once for each .IR argument with that argument assigned to .IR name . If the argument list is omitted, .B $* is used. .HP .BI while( list ) .I command .br The .I list is executed repeatedly until its exit status is non-null. Each time it returns null status, the .I command is executed. An empty .I list is taken to give null status. .HP .BI "switch(" argument "){" list } .br The .IR list is searched for simple commands beginning with the word .BR case . (The search is only at the `top level' of the .IR list . That is, .B cases in nested constructs are not found.) .I Argument is matched against each word following .B case using the pattern-matching algorithm described above, except that .B / and the first characters of .B . and .B .. need not be matched explicitly. When a match is found, commands in the list are executed up to the next following .B case command (at the top level) or the closing brace. .HP .BI { list } .br Braces serve to alter the grouping of commands implied by operator priorities. The .I body is a sequence of commands separated by .BR & , .BR ; , or newline. .HP .BI "fn " name { list } .HP .BI "fn " name .br The first form defines a function with the given .IR name . Subsequently, whenever a command whose first argument is .I name is encountered, the current value of the remainder of the command's argument list will be assigned to .BR $* , after saving its current value, and .I rc will execute the .IR list . The second form removes .IR name 's function definition. .HP .BI "fn " note { list } .br .HP .BI "fn " note .br A function with a special name will be called when .I rc receives a corresponding note; see .IR notify (3). The valid note names (and corresponding notes) are .B sighup .RB ( hangup ), .B sigint .RB ( interrupt ), .BR sigalrm .RB ( alarm ), and .B sigfpe (floating point trap). By default .I rc exits on receiving any signal, except when run interactively, in which case interrupts and quits normally cause .I rc to stop whatever it's doing and start reading a new command. The second form causes .I rc to handle a signal in the default manner. .I Rc recognizes an artificial note, .BR sigexit , which occurs when .I rc is about to finish executing. .HP .IB name = "argument command" .br Any command may be preceded by a sequence of assignments interspersed with redirections. The assignments remain in effect until the end of the command, unless the command is empty (i.e. the assignments stand alone), in which case they are effective until rescinded by later assignments. .PD .SS Built-in Commands These commands are executed internally by .IR rc , usually because their execution changes or depends on .IR rc 's internal state. .PD 0 .HP .BI . " file ..." .br Execute commands from .IR file . .B $* is set for the duration to the remainder of the argument list following .IR file . .I File is searched for using .BR $path . .HP .BI builtin " command ..." .br Execute .I command as usual except that any function named .I command is ignored in favor of the built-in meaning. .HP .BI "cd [" dir "]" .br Change the current directory to .IR dir . The default argument is .BR $home . .I dir is searched for in each of the directories mentioned in .BR $cdpath . .HP .BI "eval [" "arg ..." "]" .br The arguments are concatenated separated by spaces into a single string, read as input to .IR rc , and executed. .HP .BI "exec [" "command ..." "]" .br This instance of .I rc replaces itself with the given (non-built-in) .IR command . .HP .BI "flag " f " [+-]" .br Either set .RB ( + ), clear .RB ( - ), or test (neither .B + nor .BR - ) the flag .IR f , where .I f is a single character, one of the command line flags (see Invocation, below). .HP .BI "exit [" status "]" .br Exit with the given exit status. If none is given, the current value of .B $status is used. .HP .BR "rfork " [ nNeEsfFm ] .br Become a new process group using .BI rfork( flags ) where .I flags is composed of the bitwise OR of the .B rfork flags specified by the option letters (see .IR fork (2)). If no .I flags are given, they default to .BR ens . The .I flags and their meanings are: .B n is .BR RFNAMEG ; .B N is .BR RFCNAMEG ; .B e is .BR RFENVG ; .B E is .BR RFCENVG ; .B s is .BR RFNOTEG ; .B f is .BR RFFDG ; .B F is .BR RFCFDG ; and .B m is .BR RFNOMNT . .HP .BI "shift [" n "]" .br Delete the first .IR n (default 1) elements of .BR $* . .HP .BI "wait [" pid "]" .br Wait for the process with the given .I pid to exit. If no .I pid is given, all outstanding processes are waited for. .HP .BI whatis " name ..." .br Print the value of each .I name in a form suitable for input to .IR rc . The output is an assignment to any variable, the definition of any function, a call to .B builtin for any built-in command, or the completed pathname of any executable file. .HP .BI ~ " subject pattern ..." .br The .I subject is matched against each .I pattern in sequence. If it matches any pattern, .B $status is set to zero. Otherwise, .B $status is set to one. Patterns are the same as for file name matching, except that .B / and the first character of .B . and .B .. need not be matched explicitly. The .I patterns are not subjected to file name matching before the .B ~ command is executed, so they need not be enclosed in quotation marks. .PD .SS Environment The .I environment is a list of strings made available to executing binaries by the kernel. .I Rc creates an environment entry for each variable whose value is non-empty, and for each function. The string for a variable entry has the variable's name followed by .B = and its value. If the value has more than one component, these are separated by SOH (001) characters. The string for a function is just the .I rc input that defines the function. The name of a function in the environment is the function name preceded by .LR fn# . .PP When .I rc starts executing it reads variable and function definitions from its environment. .SS Special Variables The following variables are set or used by .IR rc . .PD 0 .TP \w'\fL$promptXX'u .B $* Set to .IR rc 's argument list during initialization. Whenever a .B . command or a function is executed, the current value is saved and .B $* receives the new argument list. The saved value is restored on completion of the .B . or function. .TP .B $apid Whenever a process is started asynchronously with .BR & , .B $apid is set to its process id. .TP .B $home The default directory for .BR cd . .TP .B $ifs The input field separators used in backquote substitutions. If .B $ifs is not set in .IR rc 's environment, it is initialized to blank, tab and newline. .TP .B $path The search path used to find commands and input files for the .B . command. If not set in the environment, it is initialized by parsing the .B $PATH variable (as in .IR sh (1)) or by .BR "path=(.\ /bin)" . The variables .B $path and .B $PATH are maintained together: changes to one will be reflected in the other. .\" Its use is discouraged; instead use .\" .IR bind (1) .\" to build a .\" .B /bin .\" containing what's needed. .TP .B $pid Set during initialization to .IR rc 's process id. .TP .B $prompt When .I rc is run interactively, the first component of .B $prompt is printed before reading each command. The second component is printed whenever a newline is typed and more lines are required to complete the command. If not set in the environment, it is initialized by .BR "prompt=('%\ '\ '\ ')" . .TP .B $status Set to the wait message of the last-executed program. (unless started with .BR &). .B ! and .B ~ also change .BR $status . Its value is used to control execution in .BR && , .BR || , .B if and .B while commands. When .I rc exits at end-of-file of its input or on executing an .B exit command with no argument, .B $status is its exit status. .PD .SS Invocation If .I rc is started with no arguments it reads commands from standard input. Otherwise its first non-flag argument is the name of a file from which to read commands (but see .B -c below). Subsequent arguments become the initial value of .BR $* . .I Rc accepts the following command-line flags. .PD 0 .TP \w'\fL-c\ \fIstring\fLXX'u .BI -c " string" Commands are read from .IR string . .TP .B -s Print out exit status after any command where the status is non-null. .TP .B -e Exit if .B $status is non-null after executing a simple command. .TP .B -i If .B -i is present, or .I rc is given no arguments and its standard input is a terminal, it runs interactively. Commands are prompted for using .BR $prompt . .TP .B -I Makes sure .I rc is not run interactively. .TP .B -l If .B -l is given or the first character of argument zero is .BR - , .I rc reads commands from .BR $home/lib/profile , if it exists, before reading its normal input. .TP .B -p A no-op. .TP .B -d A no-op. .TP .B -v Echo input on file descriptor 2 as it is read. .TP .B -x Print each simple command before executing it. .TP .B -r Print debugging information (internal form of commands as they are executed). .PD .SH SOURCE .B \*9/src/cmd/rc .SH "SEE ALSO" Tom Duff, ``Rc \- The Plan 9 Shell''. .SH BUGS There should be a way to match patterns against whole lists rather than just single strings. .PP Using .B ~ to check the value of .B $status changes .BR $status . .PP Functions that use here documents don't work. .PP Free carets don't get inserted next to keywords. .PP The .BI <{ command } syntax depends on the underlying operating system providing a file descriptor device tree at .BR /dev/fd . .PP By default, FreeBSD 5 does not provide file descriptors greater than 2 in .BR /dev/fd . To fix this, add .IP .EX /fdescfs /dev/fd fdescfs rw 0 0 .EE .LP to .BR /etc/fstab , and then .B mount .BR /dev/fd . (Adding the line to .B fstab ensures causes FreeBSD to mount the file system automatically at boot time.) 9base-6/rc/pcmd.c0000644000175000017500000000517111402154555013245 0ustar anselmanselm#include "rc.h" #include "io.h" #include "fns.h" char nl='\n'; /* change to semicolon for bourne-proofing */ #define c0 t->child[0] #define c1 t->child[1] #define c2 t->child[2] void pdeglob(io *f, char *s) { while(*s){ if(*s==GLOB) s++; pchr(f, *s++); } } void pcmd(io *f, tree *t) { if(t==0) return; switch(t->type){ default: pfmt(f, "bad %d %p %p %p", t->type, c0, c1, c2); break; case '$': pfmt(f, "$%t", c0); break; case '"': pfmt(f, "$\"%t", c0); break; case '&': pfmt(f, "%t&", c0); break; case '^': pfmt(f, "%t^%t", c0, c1); break; case '`': pfmt(f, "`%t", c0); break; case ANDAND: pfmt(f, "%t && %t", c0, c1); break; case BANG: pfmt(f, "! %t", c0); break; case BRACE: pfmt(f, "{%t}", c0); break; case COUNT: pfmt(f, "$#%t", c0); break; case FN: pfmt(f, "fn %t %t", c0, c1); break; case IF: pfmt(f, "if%t%t", c0, c1); break; case NOT: pfmt(f, "if not %t", c0); break; case OROR: pfmt(f, "%t || %t", c0, c1); break; case PCMD: case PAREN: pfmt(f, "(%t)", c0); break; case SUB: pfmt(f, "$%t(%t)", c0, c1); break; case SIMPLE: pfmt(f, "%t", c0); break; case SUBSHELL: pfmt(f, "@ %t", c0); break; case SWITCH: pfmt(f, "switch %t %t", c0, c1); break; case TWIDDLE: pfmt(f, "~ %t %t", c0, c1); break; case WHILE: pfmt(f, "while %t%t", c0, c1); break; case ARGLIST: if(c0==0) pfmt(f, "%t", c1); else if(c1==0) pfmt(f, "%t", c0); else pfmt(f, "%t %t", c0, c1); break; case ';': if(c0){ if(c1) pfmt(f, "%t%c%t", c0, nl, c1); else pfmt(f, "%t", c0); } else pfmt(f, "%t", c1); break; case WORDS: if(c0) pfmt(f, "%t ", c0); pfmt(f, "%t", c1); break; case FOR: pfmt(f, "for(%t", c0); if(c1) pfmt(f, " in %t", c1); pfmt(f, ")%t", c2); break; case WORD: if(t->quoted) pfmt(f, "%Q", t->str); else pdeglob(f, t->str); break; case DUP: if(t->rtype==DUPFD) pfmt(f, ">[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */ else pfmt(f, ">[%d=]", t->fd0); pfmt(f, "%t", c1); break; case PIPEFD: case REDIR: switch(t->rtype){ case HERE: pchr(f, '<'); case READ: case RDWR: pchr(f, '<'); if(t->rtype==RDWR) pchr(f, '>'); if(t->fd0!=0) pfmt(f, "[%d]", t->fd0); break; case APPEND: pchr(f, '>'); case WRITE: pchr(f, '>'); if(t->fd0!=1) pfmt(f, "[%d]", t->fd0); break; } pfmt(f, "%t", c0); if(c1) pfmt(f, " %t", c1); break; case '=': pfmt(f, "%t=%t", c0, c1); if(c2) pfmt(f, " %t", c2); break; case PIPE: pfmt(f, "%t|", c0); if(t->fd1==0){ if(t->fd0!=1) pfmt(f, "[%d]", t->fd0); } else pfmt(f, "[%d=%d]", t->fd0, t->fd1); pfmt(f, "%t", c1); break; } } 9base-6/rc/getflags.h0000644000175000017500000000027111402154555014117 0ustar anselmanselm#define NFLAG 128 #define NCMDLINE 512 extern char **flag[NFLAG]; extern char cmdline[NCMDLINE+1]; extern char *cmdname; extern char *flagset[]; int getflags(int, char*[], char*, int); 9base-6/rc/subr.c0000644000175000017500000000231011402154555013265 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" char* emalloc(long n) { char *p = (char *)Malloc(n); if(p==0) panic("Can't malloc %d bytes", n); /* if(err){ pfmt(err, "malloc %d->%p\n", n, p); flush(err); } /**/ memset(p, 0, n); return p; } void efree(char *p) { /* pfmt(err, "free %p\n", p); flush(err); /**/ if(p) free(p); else pfmt(err, "free 0\n"); } extern int lastword, lastdol; void yyerror(char *m) { pfmt(err, "rc: "); if(runq->cmdfile && !runq->iflag) pfmt(err, "%s:%d: ", runq->cmdfile, runq->lineno); else if(runq->cmdfile) pfmt(err, "%s: ", runq->cmdfile); else if(!runq->iflag) pfmt(err, "line %d: ", runq->lineno); if(tok[0] && tok[0]!='\n') pfmt(err, "token %q: ", tok); pfmt(err, "%s\n", m); flush(err); lastword = 0; lastdol = 0; while(lastc!='\n' && lastc!=EOF) advance(); nerror++; setvar("status", newword(m, (word *)0)); } char *bp; static void iacvt(int n) { if(n<0){ *bp++='-'; n=-n; /* doesn't work for n==-inf */ } if(n/10) iacvt(n/10); *bp++=n%10+'0'; } void inttoascii(char *s, long n) { bp = s; iacvt(n); *bp='\0'; } void panic(char *s, int n) { pfmt(err, "rc: "); pfmt(err, s, n); pchr(err, '\n'); flush(err); Abort(); } 9base-6/rc/syn.y0000644000175000017500000000607011402154555013160 0ustar anselmanselm%term FOR IN WHILE IF NOT TWIDDLE BANG SUBSHELL SWITCH FN %term WORD REDIR DUP PIPE SUB %term SIMPLE ARGLIST WORDS BRACE PAREN PCMD PIPEFD /* not used in syntax */ /* operator priorities -- lowest first */ %left IF WHILE FOR SWITCH ')' NOT %left ANDAND OROR %left BANG SUBSHELL %left PIPE %left '^' %right '$' COUNT '"' %left SUB %{ #include "rc.h" #include "fns.h" %} %union{ struct tree *tree; }; %type line paren brace body cmdsa cmdsan assign epilog redir %type cmd simple first word comword keyword words %type NOT FOR IN WHILE IF TWIDDLE BANG SUBSHELL SWITCH FN %type WORD REDIR DUP PIPE %% rc: { return 1;} | line '\n' {return !compile($1);} line: cmd | cmdsa line {$$=tree2(';', $1, $2);} body: cmd | cmdsan body {$$=tree2(';', $1, $2);} cmdsa: cmd ';' | cmd '&' {$$=tree1('&', $1);} cmdsan: cmdsa | cmd '\n' brace: '{' body '}' {$$=tree1(BRACE, $2);} paren: '(' body ')' {$$=tree1(PCMD, $2);} assign: first '=' word {$$=tree2('=', $1, $3);} epilog: {$$=0;} | redir epilog {$$=mung2($1, $1->child[0], $2);} redir: REDIR word {$$=mung1($1, $1->rtype==HERE?heredoc($2):$2);} | DUP cmd: {$$=0;} | brace epilog {$$=epimung($1, $2);} | IF paren {skipnl();} cmd {$$=mung2($1, $2, $4);} | IF NOT {skipnl();} cmd {$$=mung1($2, $4);} | FOR '(' word IN words ')' {skipnl();} cmd /* * if ``words'' is nil, we need a tree element to distinguish between * for(i in ) and for(i), the former being a loop over the empty set * and the latter being the implicit argument loop. so if $5 is nil * (the empty set), we represent it as "()". don't parenthesize non-nil * functions, to avoid growing parentheses every time we reread the * definition. */ {$$=mung3($1, $3, $5 ? $5 : tree1(PAREN, $5), $8);} | FOR '(' word ')' {skipnl();} cmd {$$=mung3($1, $3, (struct tree *)0, $6);} | WHILE paren {skipnl();} cmd {$$=mung2($1, $2, $4);} | SWITCH word {skipnl();} brace {$$=tree2(SWITCH, $2, $4);} | simple {$$=simplemung($1);} | TWIDDLE word words {$$=mung2($1, $2, $3);} | cmd ANDAND cmd {$$=tree2(ANDAND, $1, $3);} | cmd OROR cmd {$$=tree2(OROR, $1, $3);} | cmd PIPE cmd {$$=mung2($2, $1, $3);} | redir cmd %prec BANG {$$=mung2($1, $1->child[0], $2);} | assign cmd %prec BANG {$$=mung3($1, $1->child[0], $1->child[1], $2);} | BANG cmd {$$=mung1($1, $2);} | SUBSHELL cmd {$$=mung1($1, $2);} | FN words brace {$$=tree2(FN, $2, $3);} | FN words {$$=tree1(FN, $2);} simple: first | simple word {$$=tree2(ARGLIST, $1, $2);} | simple redir {$$=tree2(ARGLIST, $1, $2);} first: comword | first '^' word {$$=tree2('^', $1, $3);} word: keyword {lastword=1; $1->type=WORD;} | comword | word '^' word {$$=tree2('^', $1, $3);} comword: '$' word {$$=tree1('$', $2);} | '$' word SUB words ')' {$$=tree2(SUB, $2, $4);} | '"' word {$$=tree1('"', $2);} | COUNT word {$$=tree1(COUNT, $2);} | WORD | '`' brace {$$=tree1('`', $2);} | '(' words ')' {$$=tree1(PAREN, $2);} | REDIR brace {$$=mung1($1, $2); $$->type=PIPEFD;} keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN words: {$$=(struct tree*)0;} | words word {$$=tree2(WORDS, $1, $2);} 9base-6/rc/glob.c0000644000175000017500000001067411402154555013251 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "fns.h" char *globname; struct word *globv; /* * delete all the GLOB marks from s, in place */ void deglob(char *s) { char *t = s; do{ if(*t==GLOB) t++; *s++=*t; }while(*t++); } int globcmp(const void *s, const void *t) { return strcmp(*(char**)s, *(char**)t); } void globsort(word *left, word *right) { char **list; word *a; int n = 0; for(a = left;a!=right;a = a->next) n++; list = (char **)emalloc(n*sizeof(char *)); for(a = left,n = 0;a!=right;a = a->next,n++) list[n] = a->word; qsort((void *)list, n, sizeof(void *), globcmp); for(a = left,n = 0;a!=right;a = a->next,n++) a->word = list[n]; efree((char *)list); } /* * Push names prefixed by globname and suffixed by a match of p onto the astack. * namep points to the end of the prefix in globname. */ void globdir(char *p, char *namep) { char *t, *newp; int f; /* scan the pattern looking for a component with a metacharacter in it */ if(*p=='\0'){ globv = newword(globname, globv); return; } t = namep; newp = p; while(*newp){ if(*newp==GLOB) break; *t=*newp++; if(*t++=='/'){ namep = t; p = newp; } } /* If we ran out of pattern, append the name if accessible */ if(*newp=='\0'){ *t='\0'; if(access(globname, 0)==0) globv = newword(globname, globv); return; } /* read the directory and recur for any entry that matches */ *namep='\0'; if((f = Opendir(globname[0]?globname:"."))<0) return; while(*newp!='/' && *newp!='\0') newp++; while(Readdir(f, namep, *newp=='/')){ if(matchfn(namep, p)){ for(t = namep;*t;t++); globdir(newp, t); } } Closedir(f); } /* * Push all file names matched by p on the current thread's stack. * If there are no matches, the list consists of p. */ void glob(char *p) { word *svglobv = globv; int globlen = Globsize(p); if(!globlen){ deglob(p); globv = newword(p, globv); return; } globname = emalloc(globlen); globname[0]='\0'; globdir(p, globname); efree(globname); if(svglobv==globv){ deglob(p); globv = newword(p, globv); } else globsort(globv, svglobv); } /* * Do p and q point at equal utf codes */ int equtf(char *p, char *q) { if(*p!=*q) return 0; if(twobyte(*p)) return p[1]==q[1]; if(threebyte(*p)){ if(p[1]!=q[1]) return 0; if(p[1]=='\0') return 1; /* broken code at end of string! */ return p[2]==q[2]; } return 1; } /* * Return a pointer to the next utf code in the string, * not jumping past nuls in broken utf codes! */ char* nextutf(char *p) { if(twobyte(*p)) return p[1]=='\0'?p+1:p+2; if(threebyte(*p)) return p[1]=='\0'?p+1:p[2]=='\0'?p+2:p+3; return p+1; } /* * Convert the utf code at *p to a unicode value */ int unicode(char *p) { int u=*p&0xff; if(twobyte(u)) return ((u&0x1f)<<6)|(p[1]&0x3f); if(threebyte(u)) return (u<<12)|((p[1]&0x3f)<<6)|(p[2]&0x3f); return u; } /* * Does the string s match the pattern p * . and .. are only matched by patterns starting with . * * matches any sequence of characters * ? matches any single character * [...] matches the enclosed list of characters */ int matchfn(char *s, char *p) { if(s[0]=='.' && (s[1]=='\0' || s[1]=='.' && s[2]=='\0') && p[0]!='.') return 0; return match(s, p, '/'); } int match(char *s, char *p, int stop) { int compl, hit, lo, hi, t, c; for(;*p!=stop && *p!='\0';s = nextutf(s),p = nextutf(p)){ if(*p!=GLOB){ if(!equtf(p, s)) return 0; } else switch(*++p){ case GLOB: if(*s!=GLOB) return 0; break; case '*': for(;;){ if(match(s, nextutf(p), stop)) return 1; if(!*s) break; s = nextutf(s); } return 0; case '?': if(*s=='\0') return 0; break; case '[': if(*s=='\0') return 0; c = unicode(s); p++; compl=*p=='~'; if(compl) p++; hit = 0; while(*p!=']'){ if(*p=='\0') return 0; /* syntax error */ lo = unicode(p); p = nextutf(p); if(*p!='-') hi = lo; else{ p++; if(*p=='\0') return 0; /* syntax error */ hi = unicode(p); p = nextutf(p); if(hinext); glob(gl->word); } } void globlist(void) { word *a; globv = 0; globlist1(runq->argv->words); poplist(); pushlist(); if(globv){ for(a = globv;a->next;a = a->next); a->next = runq->argv->words; runq->argv->words = globv; } } 9base-6/rc/plan9ish.c0000644000175000017500000002457111402154555014056 0ustar anselmanselm/* * Plan 9 versions of system-specific functions * By convention, exported routines herein have names beginning with an * upper case letter. */ #include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" #include "getflags.h" char *Signame[]={ "sigexit", "sighup", "sigint", "sigquit", "sigalrm", "sigkill", "sigfpe", "sigterm", 0 }; char *syssigname[]={ "exit", /* can't happen */ "hangup", "interrupt", "quit", /* can't happen */ "alarm", "kill", "sys: fp: ", "term", 0 }; char* Rcmain(void) { return unsharp("#9/etc/rcmain"); } char Fdprefix[]="/dev/fd/"; long readnb(int, char *, long); void execfinit(void); void execbind(void); void execmount(void); void execulimit(void); void execumask(void); void execrfork(void); builtin Builtin[]={ "cd", execcd, "whatis", execwhatis, "eval", execeval, "exec", execexec, /* but with popword first */ "exit", execexit, "shift", execshift, "wait", execwait, ".", execdot, "finit", execfinit, "flag", execflag, "ulimit", execulimit, "umask", execumask, "rfork", execrfork, 0 }; void execrfork(void) { int arg; char *s; switch(count(runq->argv->words)){ case 1: arg = RFENVG|RFNOTEG|RFNAMEG; break; case 2: arg = 0; for(s = runq->argv->words->next->word;*s;s++) switch(*s){ default: goto Usage; case 'n': arg|=RFNAMEG; break; case 'N': arg|=RFCNAMEG; break; case 'e': /* arg|=RFENVG; */ break; case 'E': arg|=RFCENVG; break; case 's': arg|=RFNOTEG; break; case 'f': arg|=RFFDG; break; case 'F': arg|=RFCFDG; break; } break; default: Usage: pfmt(err, "Usage: %s [nNeEsfF]\n", runq->argv->words->word); setstatus("rfork usage"); poplist(); return; } if(rfork(arg)==-1){ pfmt(err, "rc: %s failed\n", runq->argv->words->word); setstatus("rfork failed"); } else setstatus(""); poplist(); } #define SEP '\1' char **environp; struct word *enval(s) register char *s; { register char *t, c; register struct word *v; for(t=s;*t && *t!=SEP;t++); c=*t; *t='\0'; v=newword(s, c=='\0'?(struct word *)0:enval(t+1)); *t=c; return v; } void Vinit(void){ extern char **environ; register char *s; register char **env=environ; environp=env; for(;*env;env++){ for(s=*env;*s && *s!='(' && *s!='=';s++); switch(*s){ case '\0': /* pfmt(err, "rc: odd environment %q?\n", *env); */ break; case '=': *s='\0'; setvar(*env, enval(s+1)); *s='='; break; case '(': /* ignore functions for now */ break; } } } char **envp; void Xrdfn(void){ char *p; register char *s; register int len; for(;*envp;envp++){ s = *envp; if(strncmp(s, "fn#", 3) == 0){ p = strchr(s, '='); if(p == nil) continue; *p = ' '; s[2] = ' '; len = strlen(s); execcmds(opencore(s, len)); s[len] = '\0'; return; } #if 0 for(s=*envp;*s && *s!='(' && *s!='=';s++); switch(*s){ case '\0': pfmt(err, "environment %q?\n", *envp); break; case '=': /* ignore variables */ break; case '(': /* Bourne again */ s=*envp+3; envp++; len=strlen(s); s[len]='\n'; execcmds(opencore(s, len+1)); s[len]='\0'; return; } #endif } Xreturn(); } union code rdfns[4]; void execfinit(void){ static int first=1; if(first){ rdfns[0].i=1; rdfns[1].f=Xrdfn; rdfns[2].f=Xjump; rdfns[3].i=1; first=0; } Xpopm(); envp=environp; start(rdfns, 1, runq->local); } extern int mapfd(int); int Waitfor(int pid, int unused0){ thread *p; Waitmsg *w; char errbuf[ERRMAX]; if(pid >= 0 && !havewaitpid(pid)) return 0; while((w = wait()) != nil){ delwaitpid(w->pid); if(w->pid==pid){ if(strncmp(w->msg, "signal: ", 8) == 0) fprint(mapfd(2), "%d: %s\n", w->pid, w->msg); setstatus(w->msg); free(w); return 0; } if(runq->iflag && strncmp(w->msg, "signal: ", 8) == 0) fprint(2, "%d: %s\n", w->pid, w->msg); for(p=runq->ret;p;p=p->ret) if(p->pid==w->pid){ p->pid=-1; strcpy(p->status, w->msg); } free(w); } rerrstr(errbuf, sizeof errbuf); if(strcmp(errbuf, "interrupted")==0) return -1; return 0; } char **mkargv(word *a) { char **argv=(char **)emalloc((count(a)+2)*sizeof(char *)); char **argp=argv+1; /* leave one at front for runcoms */ for(;a;a=a->next) *argp++=a->word; *argp=0; return argv; } /* void addenv(var *v) { char envname[256]; word *w; int f; io *fd; if(v->changed){ v->changed=0; snprint(envname, sizeof envname, "/env/%s", v->name); if((f=Creat(envname))<0) pfmt(err, "rc: can't open %s: %r\n", envname); else{ for(w=v->val;w;w=w->next) write(f, w->word, strlen(w->word)+1L); close(f); } } if(v->fnchanged){ v->fnchanged=0; snprint(envname, sizeof envname, "/env/fn#%s", v->name); if((f=Creat(envname))<0) pfmt(err, "rc: can't open %s: %r\n", envname); else{ if(v->fn){ fd=openfd(f); pfmt(fd, "fn %s %s\n", v->name, v->fn[v->pc-1].s); closeio(fd); } close(f); } } } void updenvlocal(var *v) { if(v){ updenvlocal(v->next); addenv(v); } } void Updenv(void){ var *v, **h; for(h=gvar;h!=&gvar[NVAR];h++) for(v=*h;v;v=v->next) addenv(v); if(runq) updenvlocal(runq->local); } */ int cmpenv(const void *a, const void *b) { return strcmp(*(char**)a, *(char**)b); } char **mkenv(){ register char **env, **ep, *p, *q; register struct var **h, *v; register struct word *a; register int nvar=0, nchr=0, sep; /* * Slightly kludgy loops look at locals then globals */ for(h=gvar-1;h!=&gvar[NVAR];h++) for(v=h>=gvar?*h:runq->local;v;v=v->next){ if((v==vlook(v->name)) && v->val){ nvar++; nchr+=strlen(v->name)+1; for(a=v->val;a;a=a->next) nchr+=strlen(a->word)+1; } if(v->fn){ nvar++; nchr+=strlen(v->name)+strlen(v->fn[v->pc-1].s)+8; } } env=(char **)emalloc((nvar+1)*sizeof(char *)+nchr); ep=env; p=(char *)&env[nvar+1]; for(h=gvar-1;h!=&gvar[NVAR];h++) for(v=h>=gvar?*h:runq->local;v;v=v->next){ if((v==vlook(v->name)) && v->val){ *ep++=p; q=v->name; while(*q) *p++=*q++; sep='='; for(a=v->val;a;a=a->next){ *p++=sep; sep=SEP; q=a->word; while(*q) *p++=*q++; } *p++='\0'; } if(v->fn){ *ep++=p; #if 0 *p++='#'; *p++='('; *p++=')'; /* to fool Bourne */ *p++='f'; *p++='n'; *p++=' '; q=v->name; while(*q) *p++=*q++; *p++=' '; #endif *p++='f'; *p++='n'; *p++='#'; q=v->name; while(*q) *p++=*q++; *p++='='; q=v->fn[v->pc-1].s; while(*q) *p++=*q++; *p++='\n'; *p++='\0'; } } *ep=0; qsort((char *)env, nvar, sizeof ep[0], cmpenv); return env; } void Updenv(void){} void Execute(word *args, word *path) { char **argv=mkargv(args); char **env=mkenv(); char file[1024]; int nc; Updenv(); for(;path;path=path->next){ nc=strlen(path->word); if(nc<1024){ strcpy(file, path->word); if(file[0]){ strcat(file, "/"); nc++; } if(nc+strlen(argv[1])<1024){ strcat(file, argv[1]); execve(file, argv+1, env); } else werrstr("command name too long"); } } rerrstr(file, sizeof file); pfmt(err, "%s: %s\n", argv[1], file); efree((char *)argv); } #define NDIR 256 /* shoud be a better way */ int Globsize(char *p) { ulong isglob=0, globlen=NDIR+1; for(;*p;p++){ if(*p==GLOB){ p++; if(*p!=GLOB) isglob++; globlen+=*p=='*'?NDIR:1; } else globlen++; } return isglob?globlen:0; } #define NFD 50 #define NDBUF 32 struct{ Dir *dbuf; int i; int n; }dir[NFD]; int Opendir(char *name) { Dir *db; int f; f=open(name, 0); if(f==-1) return f; db = dirfstat(f); if(db!=nil && (db->mode&DMDIR)){ if(f=NFD) return 0; if(dir[f].i==dir[f].n){ /* read */ free(dir[f].dbuf); dir[f].dbuf=0; n=dirread(f, &dir[f].dbuf); if(n>=0) dir[f].n=n; else dir[f].n=0; dir[f].i=0; } if(dir[f].i==dir[f].n) return 0; strcpy(p, dir[f].dbuf[dir[f].i].name); dir[f].i++; return 1; } void Closedir(int f){ if(f>=0 && f=32){ /* rc is probably in a trap loop */ pfmt(err, "rc: Too many traps (trap %s), aborting\n", s); abort(); } noted(NCONT); } void Trapinit(void){ notify(notifyf); } void Unlink(char *name) { remove(name); } long Write(int fd, char *buf, long cnt) { return write(fd, buf, (long)cnt); } long Read(int fd, char *buf, long cnt) { int i; i = readnb(fd, buf, cnt); if(ntrap) dotrap(); return i; } long Seek(int fd, long cnt, long whence) { return seek(fd, cnt, whence); } int Executable(char *file) { Dir *statbuf; int ret; statbuf = dirstat(file); if(statbuf == nil) return 0; ret = ((statbuf->mode&0111)!=0 && (statbuf->mode&DMDIR)==0); free(statbuf); return ret; } int Creat(char *file) { return create(file, 1, 0666L); } int Dup(int a, int b){ return dup(a, b); } int Dup1(int a){ return dup(a, -1); } void Exit(char *stat) { Updenv(); setstatus(stat); exits(truestatus()?"":getstatus()); } int Eintr(void){ return interrupted; } void Noerror(void){ interrupted=0; } int Isatty(int fd){ return isatty(fd); } void Abort(void){ pfmt(err, "aborting\n"); flush(err); Exit("aborting"); } void Memcpy(char *a, char *b, long n) { memmove(a, b, (long)n); } void *Malloc(ulong n){ return malloc(n); } int exitcode(char *msg) { int n; n = atoi(msg); if(n == 0) n = 1; return n; } int *waitpids; int nwaitpids; void addwaitpid(int pid) { waitpids = realloc(waitpids, (nwaitpids+1)*sizeof waitpids[0]); if(waitpids == 0) panic("Can't realloc %d waitpids", nwaitpids+1); waitpids[nwaitpids++] = pid; } void delwaitpid(int pid) { int r, w; for(r=w=0; r #include #if defined(PLAN9PORT) && defined(__sun__) # define BSD_COMP /* sigh. for TIOCNOTTY */ #endif #include #include "rc.h" #include "getflags.h" #include "exec.h" #include "io.h" #include "fns.h" int havefork = 1; void Xasync(void) { int null = open("/dev/null", 0); int tty; int pid; char npid[10]; if(null<0){ Xerror("Can't open /dev/null\n"); return; } switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){ case -1: close(null); Xerror("try again"); break; case 0: clearwaitpids(); /* * I don't know what the right thing to do here is, * so this is all experimentally determined. * If we just dup /dev/null onto 0, then running * ssh foo & will reopen /dev/tty, try to read a password, * get a signal, and repeat, in a tight loop, forever. * Arguably this is a bug in ssh (it behaves the same * way under bash as under rc) but I'm fixing it here * anyway. If we dissociate the process from the tty, * then it won't be able to open /dev/tty ever again. * The SIG_IGN on SIGTTOU makes writing the tty * (via fd 1 or 2, for example) succeed even though * our pgrp is not the terminal's controlling pgrp. */ if((tty = open("/dev/tty", OREAD)) >= 0){ /* * Should make reads of tty fail, writes succeed. */ signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); ioctl(tty, TIOCNOTTY); close(tty); } if(isatty(0)) pushredir(ROPEN, null, 0); else close(null); start(runq->code, runq->pc+1, runq->local); runq->ret = 0; break; default: addwaitpid(pid); close(null); runq->pc = runq->code[runq->pc].i; inttoascii(npid, pid); setvar("apid", newword(npid, (word *)0)); break; } } void Xpipe(void) { struct thread *p = runq; int pc = p->pc, forkid; int lfd = p->code[pc++].i; int rfd = p->code[pc++].i; int pfd[2]; if(pipe(pfd)<0){ Xerror("can't get pipe"); return; } switch(forkid = fork()){ case -1: Xerror("try again"); break; case 0: clearwaitpids(); start(p->code, pc+2, runq->local); runq->ret = 0; close(pfd[PRD]); pushredir(ROPEN, pfd[PWR], lfd); break; default: addwaitpid(forkid); start(p->code, p->code[pc].i, runq->local); close(pfd[PWR]); pushredir(ROPEN, pfd[PRD], rfd); p->pc = p->code[pc+1].i; p->pid = forkid; break; } } /* * Who should wait for the exit from the fork? */ void Xbackq(void) { char wd[8193]; int c; char *s, *ewd=&wd[8192], *stop; struct io *f; var *ifs = vlook("ifs"); word *v, *nextv; int pfd[2]; int pid; stop = ifs->val?ifs->val->word:""; if(pipe(pfd)<0){ Xerror("can't make pipe"); return; } switch(pid = fork()){ case -1: Xerror("try again"); close(pfd[PRD]); close(pfd[PWR]); return; case 0: clearwaitpids(); close(pfd[PRD]); start(runq->code, runq->pc+1, runq->local); pushredir(ROPEN, pfd[PWR], 1); return; default: addwaitpid(pid); close(pfd[PWR]); f = openfd(pfd[PRD]); s = wd; v = 0; while((c = rchr(f))!=EOF){ if(strchr(stop, c) || s==ewd){ if(s!=wd){ *s='\0'; v = newword(wd, v); s = wd; } } else *s++=c; } if(s!=wd){ *s='\0'; v = newword(wd, v); } closeio(f); Waitfor(pid, 0); /* v points to reversed arglist -- reverse it onto argv */ while(v){ nextv = v->next; v->next = runq->argv->words; runq->argv->words = v; v = nextv; } runq->pc = runq->code[runq->pc].i; return; } } void Xpipefd(void) { struct thread *p = runq; int pc = p->pc, pid; char name[40]; int pfd[2]; int sidefd, mainfd; if(pipe(pfd)<0){ Xerror("can't get pipe"); return; } if(p->code[pc].i==READ){ sidefd = pfd[PWR]; mainfd = pfd[PRD]; } else{ sidefd = pfd[PRD]; mainfd = pfd[PWR]; } switch(pid = fork()){ case -1: Xerror("try again"); break; case 0: clearwaitpids(); start(p->code, pc+2, runq->local); close(mainfd); pushredir(ROPEN, sidefd, p->code[pc].i==READ?1:0); runq->ret = 0; break; default: addwaitpid(pid); close(sidefd); pushredir(ROPEN, mainfd, mainfd); /* isn't this a noop? */ strcpy(name, Fdprefix); inttoascii(name+strlen(name), mainfd); pushword(name); p->pc = p->code[pc+1].i; break; } } void Xsubshell(void) { int pid; switch(pid = fork()){ case -1: Xerror("try again"); break; case 0: clearwaitpids(); start(runq->code, runq->pc+1, runq->local); runq->ret = 0; break; default: addwaitpid(pid); Waitfor(pid, 1); runq->pc = runq->code[runq->pc].i; break; } } int execforkexec(void) { int pid; int n; char buf[ERRMAX]; switch(pid = fork()){ case -1: return -1; case 0: clearwaitpids(); pushword("exec"); execexec(); strcpy(buf, "can't exec: "); n = strlen(buf); errstr(buf+n, ERRMAX-n); Exit(buf); } addwaitpid(pid); return pid; } 9base-6/rc/exec.c0000644000175000017500000004127211402154555013250 0ustar anselmanselm#include "rc.h" #include "getflags.h" #include "exec.h" #include "io.h" #include "fns.h" /* * Start executing the given code at the given pc with the given redirection */ char *argv0="rc"; void start(code *c, int pc, var *local) { struct thread *p = new(struct thread); p->code = codecopy(c); p->pc = pc; p->argv = 0; p->redir = p->startredir = runq?runq->redir:0; p->local = local; p->cmdfile = 0; p->cmdfd = 0; p->eof = 0; p->iflag = 0; p->lineno = 1; p->ret = runq; runq = p; } word* newword(char *wd, word *next) { word *p = new(word); p->word = strdup(wd); p->next = next; return p; } void pushword(char *wd) { if(runq->argv==0) panic("pushword but no argv!", 0); runq->argv->words = newword(wd, runq->argv->words); } void popword(void) { word *p; if(runq->argv==0) panic("popword but no argv!", 0); p = runq->argv->words; if(p==0) panic("popword but no word!", 0); runq->argv->words = p->next; efree(p->word); efree((char *)p); } void freelist(word *w) { word *nw; while(w){ nw = w->next; efree(w->word); efree((char *)w); w = nw; } } void pushlist(void) { list *p = new(list); p->next = runq->argv; p->words = 0; runq->argv = p; } void poplist(void) { list *p = runq->argv; if(p==0) panic("poplist but no argv", 0); freelist(p->words); runq->argv = p->next; efree((char *)p); } int count(word *w) { int n; for(n = 0;w;n++) w = w->next; return n; } void pushredir(int type, int from, int to) { redir * rp = new(redir); rp->type = type; rp->from = from; rp->to = to; rp->next = runq->redir; runq->redir = rp; } var* newvar(char *name, var *next) { var *v = new(var); v->name = name; v->val = 0; v->fn = 0; v->changed = 0; v->fnchanged = 0; v->next = next; v->changefn = 0; return v; } /* * get command line flags, initialize keywords & traps. * get values from environment. * set $pid, $cflag, $* * fabricate bootstrap code and start it (*=(argv);. /usr/lib/rcmain $*) * start interpreting code */ int main(int argc, char *argv[]) { code bootstrap[32]; char num[12], *rcmain; int i; /* needed for rcmain later */ putenv("PLAN9", unsharp("#9")); argc = getflags(argc, argv, "SsrdiIlxepvVc:1m:1[command]", 1); if(argc==-1) usage("[file [arg ...]]"); if(argv[0][0]=='-') flag['l'] = flagset; if(flag['I']) flag['i'] = 0; else if(flag['i']==0 && argc==1 && Isatty(0)) flag['i'] = flagset; rcmain = flag['m'] ? flag['m'][0] : Rcmain(); err = openfd(2); kinit(); Trapinit(); Vinit(); inttoascii(num, mypid = getpid()); pathinit(); setvar("pid", newword(num, (word *)0)); setvar("cflag", flag['c']?newword(flag['c'][0], (word *)0) :(word *)0); setvar("rcname", newword(argv[0], (word *)0)); i = 0; bootstrap[i++].i = 1; bootstrap[i++].f = Xmark; bootstrap[i++].f = Xword; bootstrap[i++].s="*"; bootstrap[i++].f = Xassign; bootstrap[i++].f = Xmark; bootstrap[i++].f = Xmark; bootstrap[i++].f = Xword; bootstrap[i++].s="*"; bootstrap[i++].f = Xdol; bootstrap[i++].f = Xword; bootstrap[i++].s = rcmain; bootstrap[i++].f = Xword; bootstrap[i++].s="."; bootstrap[i++].f = Xsimple; bootstrap[i++].f = Xexit; bootstrap[i].i = 0; start(bootstrap, 1, (var *)0); /* prime bootstrap argv */ pushlist(); argv0 = strdup(argv[0]); for(i = argc-1;i!=0;--i) pushword(argv[i]); for(;;){ if(flag['r']) pfnc(err, runq); runq->pc++; (*runq->code[runq->pc-1].f)(); if(ntrap) dotrap(); } } /* * Opcode routines * Arguments on stack (...) * Arguments in line [...] * Code in line with jump around {...} * * Xappend(file)[fd] open file to append * Xassign(name, val) assign val to name * Xasync{... Xexit} make thread for {}, no wait * Xbackq{... Xreturn} make thread for {}, push stdout * Xbang complement condition * Xcase(pat, value){...} exec code on match, leave (value) on * stack * Xclose[i] close file descriptor * Xconc(left, right) concatenate, push results * Xcount(name) push var count * Xdelfn(name) delete function definition * Xdeltraps(names) delete named traps * Xdol(name) get variable value * Xqdol(name) concatenate variable components * Xdup[i j] dup file descriptor * Xexit rc exits with status * Xfalse{...} execute {} if false * Xfn(name){... Xreturn} define function * Xfor(var, list){... Xreturn} for loop * Xjump[addr] goto * Xlocal(name, val) create local variable, assign value * Xmark mark stack * Xmatch(pat, str) match pattern, set status * Xpipe[i j]{... Xreturn}{... Xreturn} construct a pipe between 2 new threads, * wait for both * Xpipefd[type]{... Xreturn} connect {} to pipe (input or output, * depending on type), push /dev/fd/?? * Xpopm(value) pop value from stack * Xrdwr(file)[fd] open file for reading and writing * Xread(file)[fd] open file to read * Xsettraps(names){... Xreturn} define trap functions * Xshowtraps print trap list * Xsimple(args) run command and wait * Xreturn kill thread * Xsubshell{... Xexit} execute {} in a subshell and wait * Xtrue{...} execute {} if true * Xunlocal delete local variable * Xword[string] push string * Xwrite(file)[fd] open file to write */ void Xappend(void) { char *file; int f; switch(count(runq->argv->words)){ default: Xerror1(">> requires singleton"); return; case 0: Xerror1(">> requires file"); return; case 1: break; } file = runq->argv->words->word; if((f = open(file, 1))<0 && (f = Creat(file))<0){ pfmt(err, "%s: ", file); Xerror("can't open"); return; } Seek(f, 0L, 2); pushredir(ROPEN, f, runq->code[runq->pc].i); runq->pc++; poplist(); } void Xsettrue(void) { setstatus(""); } void Xbang(void) { setstatus(truestatus()?"false":""); } void Xclose(void) { pushredir(RCLOSE, runq->code[runq->pc].i, 0); runq->pc++; } void Xdup(void) { pushredir(RDUP, runq->code[runq->pc].i, runq->code[runq->pc+1].i); runq->pc+=2; } void Xeflag(void) { if(eflagok && !truestatus()) Xexit(); } void Xexit(void) { struct var *trapreq; struct word *starval; static int beenhere = 0; if(getpid()==mypid && !beenhere){ trapreq = vlook("sigexit"); if(trapreq->fn){ beenhere = 1; --runq->pc; starval = vlook("*")->val; start(trapreq->fn, trapreq->pc, (struct var *)0); runq->local = newvar(strdup("*"), runq->local); runq->local->val = copywords(starval, (struct word *)0); runq->local->changed = 1; runq->redir = runq->startredir = 0; return; } } Exit(getstatus()); } void Xfalse(void) { if(truestatus()) runq->pc = runq->code[runq->pc].i; else runq->pc++; } int ifnot; /* dynamic if not flag */ void Xifnot(void) { if(ifnot) runq->pc++; else runq->pc = runq->code[runq->pc].i; } void Xjump(void) { runq->pc = runq->code[runq->pc].i; } void Xmark(void) { pushlist(); } void Xpopm(void) { poplist(); } void Xread(void) { char *file; int f; switch(count(runq->argv->words)){ default: Xerror1("< requires singleton\n"); return; case 0: Xerror1("< requires file\n"); return; case 1: break; } file = runq->argv->words->word; if((f = open(file, 0))<0){ pfmt(err, "%s: ", file); Xerror("can't open"); return; } pushredir(ROPEN, f, runq->code[runq->pc].i); runq->pc++; poplist(); } void Xrdwr(void) { char *file; int f; switch(count(runq->argv->words)){ default: Xerror1("<> requires singleton\n"); return; case 0: Xerror1("<> requires file\n"); return; case 1: break; } file = runq->argv->words->word; if((f = open(file, ORDWR))<0){ pfmt(err, "%s: ", file); Xerror("can't open"); return; } pushredir(ROPEN, f, runq->code[runq->pc].i); runq->pc++; poplist(); } void turfredir(void) { while(runq->redir!=runq->startredir) Xpopredir(); } void Xpopredir(void) { struct redir *rp = runq->redir; if(rp==0) panic("turfredir null!", 0); runq->redir = rp->next; if(rp->type==ROPEN) close(rp->from); efree((char *)rp); } void Xreturn(void) { struct thread *p = runq; turfredir(); while(p->argv) poplist(); codefree(p->code); runq = p->ret; efree((char *)p); if(runq==0) Exit(getstatus()); } void Xtrue(void) { if(truestatus()) runq->pc++; else runq->pc = runq->code[runq->pc].i; } void Xif(void) { ifnot = 1; if(truestatus()) runq->pc++; else runq->pc = runq->code[runq->pc].i; } void Xwastrue(void) { ifnot = 0; } void Xword(void) { pushword(runq->code[runq->pc++].s); } void Xwrite(void) { char *file; int f; switch(count(runq->argv->words)){ default: Xerror1("> requires singleton\n"); return; case 0: Xerror1("> requires file\n"); return; case 1: break; } file = runq->argv->words->word; if((f = Creat(file))<0){ pfmt(err, "%s: ", file); Xerror("can't open"); return; } pushredir(ROPEN, f, runq->code[runq->pc].i); runq->pc++; poplist(); } char* list2str(word *words) { char *value, *s, *t; int len = 0; word *ap; for(ap = words;ap;ap = ap->next) len+=1+strlen(ap->word); value = emalloc(len+1); s = value; for(ap = words;ap;ap = ap->next){ for(t = ap->word;*t;) *s++=*t++; *s++=' '; } if(s==value) *s='\0'; else s[-1]='\0'; return value; } void Xmatch(void) { word *p; char *subject; subject = list2str(runq->argv->words); setstatus("no match"); for(p = runq->argv->next->words;p;p = p->next) if(match(subject, p->word, '\0')){ setstatus(""); break; } efree(subject); poplist(); poplist(); } void Xcase(void) { word *p; char *s; int ok = 0; s = list2str(runq->argv->next->words); for(p = runq->argv->words;p;p = p->next){ if(match(s, p->word, '\0')){ ok = 1; break; } } efree(s); if(ok) runq->pc++; else runq->pc = runq->code[runq->pc].i; poplist(); } word* conclist(word *lp, word *rp, word *tail) { char *buf; word *v; if(lp->next || rp->next) tail = conclist(lp->next==0?lp:lp->next, rp->next==0?rp:rp->next, tail); buf = emalloc(strlen(lp->word)+strlen(rp->word)+1); strcpy(buf, lp->word); strcat(buf, rp->word); v = newword(buf, tail); efree(buf); return v; } void Xconc(void) { word *lp = runq->argv->words; word *rp = runq->argv->next->words; word *vp = runq->argv->next->next->words; int lc = count(lp), rc = count(rp); if(lc!=0 || rc!=0){ if(lc==0 || rc==0){ Xerror1("null list in concatenation"); return; } if(lc!=1 && rc!=1 && lc!=rc){ Xerror1("mismatched list lengths in concatenation"); return; } vp = conclist(lp, rp, vp); } poplist(); poplist(); runq->argv->words = vp; } void Xassign(void) { var *v; if(count(runq->argv->words)!=1){ Xerror1("variable name not singleton!"); return; } deglob(runq->argv->words->word); v = vlook(runq->argv->words->word); poplist(); globlist(); freewords(v->val); v->val = runq->argv->words; v->changed = 1; if(v->changefn) v->changefn(v); runq->argv->words = 0; poplist(); } /* * copy arglist a, adding the copy to the front of tail */ word* copywords(word *a, word *tail) { word *v = 0, **end; for(end=&v;a;a = a->next,end=&(*end)->next) *end = newword(a->word, 0); *end = tail; return v; } void Xdol(void) { word *a, *star; char *s, *t; int n; if(count(runq->argv->words)!=1){ Xerror1("variable name not singleton!"); return; } s = runq->argv->words->word; deglob(s); n = 0; for(t = s;'0'<=*t && *t<='9';t++) n = n*10+*t-'0'; a = runq->argv->next->words; if(n==0 || *t) a = copywords(vlook(s)->val, a); else{ star = vlook("*")->val; if(star && 1<=n && n<=count(star)){ while(--n) star = star->next; a = newword(star->word, a); } } poplist(); runq->argv->words = a; } void Xqdol(void) { word *a, *p; char *s; int n; if(count(runq->argv->words)!=1){ Xerror1("variable name not singleton!"); return; } s = runq->argv->words->word; deglob(s); a = vlook(s)->val; poplist(); n = count(a); if(n==0){ pushword(""); return; } for(p = a;p;p = p->next) n+=strlen(p->word); s = emalloc(n); if(a){ strcpy(s, a->word); for(p = a->next;p;p = p->next){ strcat(s, " "); strcat(s, p->word); } } else s[0]='\0'; pushword(s); efree(s); } word* copynwords(word *a, word *tail, int n) { word *v, **end; v = 0; end = &v; while(n-- > 0){ *end = newword(a->word, 0); end = &(*end)->next; a = a->next; } *end = tail; return v; } word* subwords(word *val, int len, word *sub, word *a) { int n, m; char *s; if(!sub) return a; a = subwords(val, len, sub->next, a); s = sub->word; deglob(s); m = 0; n = 0; while('0'<=*s && *s<='9') n = n*10+ *s++ -'0'; if(*s == '-'){ if(*++s == 0) m = len - n; else{ while('0'<=*s && *s<='9') m = m*10+ *s++ -'0'; m -= n; } } if(n<1 || n>len || m<0) return a; if(n+m>len) m = len-n; while(--n > 0) val = val->next; return copynwords(val, a, m+1); } void Xsub(void) { word *a, *v; char *s; if(count(runq->argv->next->words)!=1){ Xerror1("variable name not singleton!"); return; } s = runq->argv->next->words->word; deglob(s); a = runq->argv->next->next->words; v = vlook(s)->val; a = subwords(v, count(v), runq->argv->words, a); poplist(); poplist(); runq->argv->words = a; } void Xcount(void) { word *a; char *s, *t; int n; char num[12]; if(count(runq->argv->words)!=1){ Xerror1("variable name not singleton!"); return; } s = runq->argv->words->word; deglob(s); n = 0; for(t = s;'0'<=*t && *t<='9';t++) n = n*10+*t-'0'; if(n==0 || *t){ a = vlook(s)->val; inttoascii(num, count(a)); } else{ a = vlook("*")->val; inttoascii(num, a && 1<=n && n<=count(a)?1:0); } poplist(); pushword(num); } void Xlocal(void) { if(count(runq->argv->words)!=1){ Xerror1("variable name must be singleton\n"); return; } deglob(runq->argv->words->word); runq->local = newvar(strdup(runq->argv->words->word), runq->local); runq->local->val = copywords(runq->argv->next->words, (word *)0); runq->local->changed = 1; poplist(); poplist(); } void Xunlocal(void) { var *v = runq->local, *hid; if(v==0) panic("Xunlocal: no locals!", 0); runq->local = v->next; hid = vlook(v->name); hid->changed = 1; efree(v->name); freewords(v->val); efree((char *)v); } void freewords(word *w) { word *nw; while(w){ efree(w->word); nw = w->next; efree((char *)w); w = nw; } } void Xfn(void) { var *v; word *a; int end; end = runq->code[runq->pc].i; for(a = runq->argv->words;a;a = a->next){ v = gvlook(a->word); if(v->fn) codefree(v->fn); v->fn = codecopy(runq->code); v->pc = runq->pc+2; v->fnchanged = 1; } runq->pc = end; poplist(); } void Xdelfn(void) { var *v; word *a; for(a = runq->argv->words;a;a = a->next){ v = gvlook(a->word); if(v->fn) codefree(v->fn); v->fn = 0; v->fnchanged = 1; } poplist(); } char* concstatus(char *s, char *t) { static char v[NSTATUS+1]; int n = strlen(s); strncpy(v, s, NSTATUS); if(npid==-1) setstatus(concstatus(runq->status, getstatus())); else{ strncpy(status, getstatus(), NSTATUS); status[NSTATUS]='\0'; Waitfor(runq->pid, 1); runq->pid=-1; setstatus(concstatus(getstatus(), status)); } } void Xrdcmds(void) { struct thread *p = runq; word *prompt; flush(err); nerror = 0; if(flag['s'] && !truestatus()) pfmt(err, "status=%v\n", vlook("status")->val); if(runq->iflag){ prompt = vlook("prompt")->val; if(prompt) promptstr = prompt->word; else promptstr="% "; } Noerror(); if(yyparse()){ if(!p->iflag || p->eof && !Eintr()){ if(p->cmdfile) efree(p->cmdfile); closeio(p->cmdfd); Xreturn(); /* should this be omitted? */ } else{ if(Eintr()){ pchr(err, '\n'); p->eof = 0; } --p->pc; /* go back for next command */ } } else{ ntrap = 0; /* avoid double-interrupts during blocked writes */ --p->pc; /* re-execute Xrdcmds after codebuf runs */ start(codebuf, 1, runq->local); } freenodes(); } void Xerror(char *s) { if(strcmp(argv0, "rc")==0 || strcmp(argv0, "/bin/rc")==0) pfmt(err, "rc: %s: %r\n", s); else pfmt(err, "rc (%s): %s: %r\n", argv0, s); flush(err); setstatus("error"); while(!runq->iflag) Xreturn(); } void Xerror1(char *s) { if(strcmp(argv0, "rc")==0 || strcmp(argv0, "/bin/rc")==0) pfmt(err, "rc: %s\n", s); else pfmt(err, "rc (%s): %s\n", argv0, s); flush(err); setstatus("error"); while(!runq->iflag) Xreturn(); } void setstatus(char *s) { setvar("status", newword(s, (word *)0)); } char* getstatus(void) { var *status = vlook("status"); return status->val?status->val->word:""; } int truestatus(void) { char *s; for(s = getstatus();*s;s++) if(*s!='|' && *s!='0') return 0; return 1; } void Xdelhere(void) { Unlink(runq->code[runq->pc++].s); } void Xfor(void) { if(runq->argv->words==0){ poplist(); runq->pc = runq->code[runq->pc].i; } else{ freelist(runq->local->val); runq->local->val = runq->argv->words; runq->local->changed = 1; runq->argv->words = runq->argv->words->next; runq->local->val->next = 0; runq->pc++; } } void Xglob(void) { globlist(); } 9base-6/rc/haventfork.c0000644000175000017500000000606211402154555014471 0ustar anselmanselm#include "rc.h" #include "getflags.h" #include "exec.h" #include "io.h" #include "fns.h" int havefork = 0; static char ** rcargv(char *s) { int argc; char **argv; word *p; p = vlook("*")->val; argv = malloc((count(p)+6)*sizeof(char*)); argc = 0; argv[argc++] = argv0; if(flag['e']) argv[argc++] = "-Se"; else argv[argc++] = "-S"; argv[argc++] = "-c"; argv[argc++] = s; for(p = vlook("*")->val; p; p = p->next) argv[argc++] = p->word; argv[argc] = 0; return argv; } void Xasync(void) { uint pid; char buf[20], **argv; Updenv(); argv = rcargv(runq->code[runq->pc].s); pid = ForkExecute(argv0, argv, -1, 1, 2); free(argv); if(pid == 0) { Xerror("proc failed"); return; } runq->pc++; sprint(buf, "%d", pid); setvar("apid", newword(buf, (word *)0)); } void Xbackq(void) { char wd[8193], **argv; int c; char *s, *ewd=&wd[8192], *stop; struct io *f; var *ifs = vlook("ifs"); word *v, *nextv; int pfd[2]; int pid; stop = ifs->val?ifs->val->word:""; if(pipe(pfd)<0){ Xerror("can't make pipe"); return; } Updenv(); argv = rcargv(runq->code[runq->pc].s); pid = ForkExecute(argv0, argv, -1, pfd[1], 2); free(argv); close(pfd[1]); if(pid == 0) { Xerror("proc failed"); close(pfd[0]); return; } f = openfd(pfd[0]); s = wd; v = 0; while((c=rchr(f))!=EOF){ if(strchr(stop, c) || s==ewd){ if(s!=wd){ *s='\0'; v=newword(wd, v); s=wd; } } else *s++=c; } if(s!=wd){ *s='\0'; v=newword(wd, v); } closeio(f); Waitfor(pid, 1); /* v points to reversed arglist -- reverse it onto argv */ while(v){ nextv=v->next; v->next=runq->argv->words; runq->argv->words=v; v=nextv; } runq->pc++; } void Xpipe(void) { thread *p=runq; int pc=p->pc, pid; int rfd=p->code[pc+1].i; int pfd[2]; char **argv; if(pipe(pfd)<0){ Xerror1("can't get pipe"); return; } Updenv(); argv = rcargv(runq->code[pc+2].s); pid = ForkExecute(argv0, argv, 0, pfd[1], 2); free(argv); close(pfd[1]); if(pid == 0) { Xerror("proc failed"); close(pfd[0]); return; } start(p->code, pc+4, runq->local); pushredir(ROPEN, pfd[0], rfd); p->pc=p->code[pc+3].i; p->pid=pid; } void Xpipefd(void) { Abort(); } void Xsubshell(void) { char **argv; int pid; Updenv(); argv = rcargv(runq->code[runq->pc].s); pid = ForkExecute(argv0, argv, -1, 1, 2); free(argv); if(pid < 0) { Xerror("proc failed"); return; } Waitfor(pid, 1); runq->pc++; } /* * start a process running the cmd on the stack and return its pid. */ int execforkexec(void) { char **argv; char file[1024]; int nc; word *path; int pid; if(runq->argv->words==0) return -1; argv = mkargv(runq->argv->words); for(path = searchpath(runq->argv->words->word);path;path = path->next){ nc = strlen(path->word); if(ncword); if(file[0]){ strcat(file, "/"); nc++; } if(nc+strlen(argv[1])= 0){ free(argv); return pid; } } } } free(argv); return -1; } 9base-6/rc/lex.c0000644000175000017500000001407311402154555013113 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "getflags.h" #include "fns.h" int getnext(void); int wordchr(int c) { return !strchr("\n \t#;&|^$=`'{}()<>", c) && c!=EOF; } int idchr(int c) { /* * Formerly: * return 'a'<=c && c<='z' || 'A'<=c && c<='Z' || '0'<=c && c<='9' * || c=='_' || c=='*'; */ return c>' ' && !strchr("!\"#$%&'()+,-./:;<=>?@[\\]^`{|}~", c); } int future = EOF; int doprompt = 1; int inquote; int incomm; /* * Look ahead in the input stream */ int nextc(void) { if(future==EOF) future = getnext(); return future; } /* * Consume the lookahead character. */ int advance(void) { int c = nextc(); lastc = future; future = EOF; return c; } /* * read a character from the input stream */ int getnext(void) { int c; static int peekc = EOF; if(peekc!=EOF){ c = peekc; peekc = EOF; return c; } if(runq->eof) return EOF; if(doprompt) pprompt(); c = rchr(runq->cmdfd); if(!inquote && c=='\\'){ c = rchr(runq->cmdfd); if(c=='\n' && !incomm){ /* don't continue a comment */ doprompt = 1; c=' '; } else{ peekc = c; c='\\'; } } doprompt = doprompt || c=='\n' || c==EOF; if(c==EOF) runq->eof++; else if(flag['V'] || ndot>=2 && flag['v']) pchr(err, c); return c; } void pprompt(void) { var *prompt; if(runq->iflag){ pstr(err, promptstr); flush(err); prompt = vlook("prompt"); if(prompt->val && prompt->val->next) promptstr = prompt->val->next->word; else promptstr="\t"; } runq->lineno++; doprompt = 0; } void skipwhite(void) { int c; for(;;){ c = nextc(); /* Why did this used to be if(!inquote && c=='#') ?? */ if(c=='#'){ incomm = 1; for(;;){ c = nextc(); if(c=='\n' || c==EOF) { incomm = 0; break; } advance(); } } if(c==' ' || c=='\t') advance(); else return; } } void skipnl(void) { int c; for(;;){ skipwhite(); c = nextc(); if(c!='\n') return; advance(); } } int nextis(int c) { if(nextc()==c){ advance(); return 1; } return 0; } char* addtok(char *p, int val) { if(p==0) return 0; if(p==&tok[NTOK-1]){ *p = 0; yyerror("token buffer too short"); return 0; } *p++=val; return p; } char* addutf(char *p, int c) { p = addtok(p, c); if(twobyte(c)) /* 2-byte escape */ return addtok(p, advance()); if(threebyte(c)){ /* 3-byte escape */ p = addtok(p, advance()); return addtok(p, advance()); } return p; } int lastdol; /* was the last token read '$' or '$#' or '"'? */ int lastword; /* was the last token read a word or compound word terminator? */ int yylex(void) { int c, d = nextc(); char *w = tok; struct tree *t; yylval.tree = 0; /* * Embarassing sneakiness: if the last token read was a quoted or unquoted * WORD then we alter the meaning of what follows. If the next character * is `(', we return SUB (a subscript paren) and consume the `('. Otherwise, * if the next character is the first character of a simple or compound word, * we insert a `^' before it. */ if(lastword){ lastword = 0; if(d=='('){ advance(); strcpy(tok, "( [SUB]"); return SUB; } if(wordchr(d) || d=='\'' || d=='`' || d=='$' || d=='"'){ strcpy(tok, "^"); return '^'; } } inquote = 0; skipwhite(); switch(c = advance()){ case EOF: lastdol = 0; strcpy(tok, "EOF"); return EOF; case '$': lastdol = 1; if(nextis('#')){ strcpy(tok, "$#"); return COUNT; } if(nextis('"')){ strcpy(tok, "$\""); return '"'; } strcpy(tok, "$"); return '$'; case '&': lastdol = 0; if(nextis('&')){ skipnl(); strcpy(tok, "&&"); return ANDAND; } strcpy(tok, "&"); return '&'; case '|': lastdol = 0; if(nextis(c)){ skipnl(); strcpy(tok, "||"); return OROR; } case '<': case '>': lastdol = 0; /* * funny redirection tokens: * redir: arrow | arrow '[' fd ']' * arrow: '<' | '<<' | '>' | '>>' | '|' * fd: digit | digit '=' | digit '=' digit * digit: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' * some possibilities are nonsensical and get a message. */ *w++=c; t = newtree(); switch(c){ case '|': t->type = PIPE; t->fd0 = 1; t->fd1 = 0; break; case '>': t->type = REDIR; if(nextis(c)){ t->rtype = APPEND; *w++=c; } else t->rtype = WRITE; t->fd0 = 1; break; case '<': t->type = REDIR; if(nextis(c)){ t->rtype = HERE; *w++=c; } else if (nextis('>')){ t->rtype = RDWR; *w++=c; } else t->rtype = READ; t->fd0 = 0; break; } if(nextis('[')){ *w++='['; c = advance(); *w++=c; if(c<'0' || '9'type==PIPE?"pipe syntax" :"redirection syntax"); return EOF; } t->fd0 = 0; do{ t->fd0 = t->fd0*10+c-'0'; *w++=c; c = advance(); }while('0'<=c && c<='9'); if(c=='='){ *w++='='; if(t->type==REDIR) t->type = DUP; c = advance(); if('0'<=c && c<='9'){ t->rtype = DUPFD; t->fd1 = t->fd0; t->fd0 = 0; do{ t->fd0 = t->fd0*10+c-'0'; *w++=c; c = advance(); }while('0'<=c && c<='9'); } else{ if(t->type==PIPE) goto RedirErr; t->rtype = CLOSE; } } if(c!=']' || t->type==DUP && (t->rtype==HERE || t->rtype==APPEND)) goto RedirErr; *w++=']'; } *w='\0'; yylval.tree = t; if(t->type==PIPE) skipnl(); return t->type; case '\'': lastdol = 0; lastword = 1; inquote = 1; for(;;){ c = advance(); if(c==EOF) break; if(c=='\''){ if(nextc()!='\'') break; advance(); } w = addutf(w, c); } if(w!=0) *w='\0'; t = token(tok, WORD); t->quoted = 1; yylval.tree = t; return t->type; } if(!wordchr(c)){ lastdol = 0; tok[0] = c; tok[1]='\0'; return c; } for(;;){ /* next line should have (char)c==GLOB, but ken's compiler is broken */ if(c=='*' || c=='[' || c=='?' || c==(unsigned char)GLOB) w = addtok(w, GLOB); w = addutf(w, c); c = nextc(); if(lastdol?!idchr(c):!wordchr(c)) break; advance(); } lastword = 1; lastdol = 0; if(w!=0) *w='\0'; t = klook(tok); if(t->type!=WORD) lastword = 0; t->quoted = 0; yylval.tree = t; return t->type; } 9base-6/rc/Makefile0000644000175000017500000000245211402154555013615 0ustar anselmanselm# rc - rc shell unix port from plan9 # Depends on ../lib9 TARG = rc OFILES = code.o exec.o getflags.o glob.o here.o io.o lex.o \ pcmd.o pfnc.o simple.o subr.o trap.o tree.o unixcrap.o \ var.o y.tab.o plan9ish.o havefork.o YFILES = syn.y MANFILES = rc.1 include ../config.mk # Solaris #LDFLAGS += -dy -lxnet all: @if [ ! -f y.tab.c ]; then \ make -f Makefile depend;\ fi @make -f Makefile ${TARG} @echo built ${TARG} depend: @echo YACC ${YFILES} @${YACC} -d ${YFILES} @cp y.tab.h x.tab.h install: ${TARG} @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f ${TARG} ${DESTDIR}${PREFIX}/bin/ @chmod 755 ${DESTDIR}${PREFIX}/bin/${TARG} @mkdir -p ${DESTDIR}${MANPREFIX}/man1 @cp -f ${MANFILES} ${DESTDIR}${MANPREFIX}/man1 @chmod 444 ${DESTDIR}${MANPREFIX}/man1/${MANFILES} @mkdir -p ${DESTDIR}${PREFIX}/etc @cp -f rcmain ${DESTDIR}${PREFIX}/etc @chmod 755 ${DESTDIR}${PREFIX}/etc/rcmain uninstall: rm -f ${DESTDIR}${PREFIX}/bin/${TARG} rm -f ${DESTDIR}${MANPREFIX}/man1/${MANFILES} rm -f ${DESTDIR}${PREFIX}/etc/rcmain .c.o: @echo CC $*.c @${CC} ${CFLAGS} -I../lib9 -I${PREFIX}/include -I../lib9 $*.c clean: rm -f ${OFILES} ${TARG} y.tab.c y.tab.h x.tab.h ${TARG}: ${OFILES} @echo LD ${TARG} @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L${PREFIX}/lib -L../lib9 -l9 9base-6/rc/exec.h0000644000175000017500000000541411402154555013253 0ustar anselmanselm/* * Definitions used in the interpreter */ extern void Xappend(void), Xasync(void), Xbackq(void), Xbang(void), Xclose(void); extern void Xconc(void), Xcount(void), Xdelfn(void), Xdol(void), Xqdol(void), Xdup(void); extern void Xexit(void), Xfalse(void), Xfn(void), Xfor(void), Xglob(void); extern void Xjump(void), Xmark(void), Xmatch(void), Xpipe(void), Xread(void); extern void Xrdwr(void); extern void Xrdfn(void), Xunredir(void), Xstar(void), Xreturn(void), Xsubshell(void); extern void Xtrue(void), Xword(void), Xwrite(void), Xpipefd(void), Xcase(void); extern void Xlocal(void), Xunlocal(void), Xassign(void), Xsimple(void), Xpopm(void); extern void Xrdcmds(void), Xwastrue(void), Xif(void), Xifnot(void), Xpipewait(void); extern void Xdelhere(void), Xpopredir(void), Xsub(void), Xeflag(void), Xsettrue(void); extern void Xerror(char*); extern void Xerror1(char*); /* * word lists are in correct order, * i.e. word0->word1->word2->word3->0 */ struct word{ char *word; word *next; }; struct list{ word *words; list *next; }; word *newword(char *, word *), *copywords(word *, word *); struct redir{ char type; /* what to do */ short from, to; /* what to do it to */ struct redir *next; /* what else to do (reverse order) */ }; #define NSTATUS ERRMAX /* length of status (from plan 9) */ /* * redir types */ #define ROPEN 1 /* dup2(from, to); close(from); */ #define RDUP 2 /* dup2(from, to); */ #define RCLOSE 3 /* close(from); */ struct thread{ union code *code; /* code for this thread */ int pc; /* code[pc] is the next instruction */ struct list *argv; /* argument stack */ struct redir *redir; /* redirection stack */ struct redir *startredir; /* redir inheritance point */ struct var *local; /* list of local variables */ char *cmdfile; /* file name in Xrdcmd */ struct io *cmdfd; /* file descriptor for Xrdcmd */ int iflast; /* static `if not' checking */ int eof; /* is cmdfd at eof? */ int iflag; /* interactive? */ int lineno; /* linenumber */ int pid; /* process for Xpipewait to wait for */ char status[NSTATUS]; /* status for Xpipewait */ tree *treenodes; /* tree nodes created by this process */ thread *ret; /* who continues when this finishes */ }; thread *runq; code *codecopy(code*); code *codebuf; /* compiler output */ int ntrap; /* number of outstanding traps */ int trap[NSIG]; /* number of outstanding traps per type */ struct builtin{ char *name; void (*fnc)(void); }; extern struct builtin Builtin[]; int eflagok; /* kludge flag so that -e doesn't exit in startup */ int havefork; void execcd(void), execwhatis(void), execeval(void), execexec(void); int execforkexec(void); void execexit(void), execshift(void); void execwait(void), execumask(void), execdot(void), execflag(void); void execfunc(var*), execcmds(io *); 9base-6/rc/tree.c0000644000175000017500000000402711402154555013260 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" tree *treenodes; /* * create and clear a new tree node, and add it * to the node list. */ tree* newtree(void) { tree *t = new(tree); t->iskw = 0; t->str = 0; t->child[0] = t->child[1] = t->child[2] = 0; t->next = treenodes; treenodes = t; return t; } void freenodes(void) { tree *t, *u; for(t = treenodes;t;t = u){ u = t->next; if(t->str) efree(t->str); efree((char *)t); } treenodes = 0; } tree* tree1(int type, tree *c0) { return tree3(type, c0, (tree *)0, (tree *)0); } tree* tree2(int type, tree *c0, tree *c1) { return tree3(type, c0, c1, (tree *)0); } tree* tree3(int type, tree *c0, tree *c1, tree *c2) { tree *t; if(type==';'){ if(c0==0) return c1; if(c1==0) return c0; } t = newtree(); t->type = type; t->child[0] = c0; t->child[1] = c1; t->child[2] = c2; return t; } tree* mung1(tree *t, tree *c0) { t->child[0] = c0; return t; } tree* mung2(tree *t, tree *c0, tree *c1) { t->child[0] = c0; t->child[1] = c1; return t; } tree* mung3(tree *t, tree *c0, tree *c1, tree *c2) { t->child[0] = c0; t->child[1] = c1; t->child[2] = c2; return t; } tree* epimung(tree *comp, tree *epi) { tree *p; if(epi==0) return comp; for(p = epi;p->child[1];p = p->child[1]); p->child[1] = comp; return epi; } /* * Add a SIMPLE node at the root of t and percolate all the redirections * up to the root. */ tree* simplemung(tree *t) { tree *u; struct io *s; t = tree1(SIMPLE, t); s = openstr(); pfmt(s, "%t", t); t->str = strdup(s->strp); closeio(s); for(u = t->child[0];u->type==ARGLIST;u = u->child[0]){ if(u->child[1]->type==DUP || u->child[1]->type==REDIR){ u->child[1]->child[1] = t; t = u->child[1]; u->child[1] = 0; } } return t; } tree* token(char *str, int type) { tree *t = newtree(); t->type = type; t->str = strdup(str); return t; } void freetree(tree *p) { if(p==0) return; freetree(p->child[0]); freetree(p->child[1]); freetree(p->child[2]); if(p->str) efree(p->str); efree((char *)p); } 9base-6/rc/rc.h0000644000175000017500000000664711402154555012744 0ustar anselmanselm/* * Plan9 is defined for plan 9 * V9 is defined for 9th edition * Sun is defined for sun-os * Please don't litter the code with ifdefs. The three below (and one in * getflags) should be enough. */ #define Plan9 #ifdef Plan9 #include #include #undef NSIG #undef SIGINT #undef SIGQUIT #define NSIG 32 #define SIGINT 2 #define SIGQUIT 3 #endif #ifdef V9 #include #include #endif #ifdef Sun #include #endif #define YYMAXDEPTH 500 #ifndef PAREN #ifndef YYMAJOR #include "x.tab.h" #endif #endif #undef pipe /* so that /dev/fd works */ #define searchpath rcsearchpath /* avoid new libc function */ typedef struct tree tree; typedef struct word word; typedef struct io io; typedef union code code; typedef struct var var; typedef struct list list; typedef struct redir redir; typedef struct thread thread; typedef struct builtin builtin; struct tree{ int type; int rtype, fd0, fd1; /* details of REDIR PIPE DUP tokens */ char *str; int quoted; int iskw; tree *child[3]; tree *next; }; tree *newtree(void); tree *token(char*, int), *klook(char*), *tree1(int, tree*); tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*); tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*); tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*); tree *simplemung(tree*), *heredoc(tree*); void freetree(tree*); tree *cmdtree; /* * The first word of any code vector is a reference count. * Always create a new reference to a code vector by calling codecopy(.). * Always call codefree(.) when deleting a reference. */ union code{ void (*f)(void); int i; char *s; }; char *promptstr; int doprompt; #define NTOK 8192 char tok[NTOK]; #define APPEND 1 #define WRITE 2 #define READ 3 #define HERE 4 #define DUPFD 5 #define CLOSE 6 #define RDWR 7 struct var{ char *name; /* ascii name */ word *val; /* value */ int changed; code *fn; /* pointer to function's code vector */ int fnchanged; int pc; /* pc of start of function */ var *next; /* next on hash or local list */ void (*changefn)(var*); }; var *vlook(char*), *gvlook(char*), *newvar(char*, var*); #define NVAR 521 var *gvar[NVAR]; /* hash for globals */ #define new(type) ((type *)emalloc(sizeof(type))) char *emalloc(long); void *Malloc(ulong); void efree(char*); #define NOFILE 128 /* should come from */ struct here{ tree *tag; char *name; struct here *next; }; int mypid; /* * Glob character escape in strings: * In a string, GLOB must be followed by *?[ or GLOB. * GLOB* matches any string * GLOB? matches any single character * GLOB[...] matches anything in the brackets * GLOBGLOB matches GLOB */ #define GLOB ((char)0x01) /* * onebyte(c), twobyte(c), threebyte(c) * Is c the first character of a one- two- or three-byte utf sequence? */ #define onebyte(c) ((c&0x80)==0x00) #define twobyte(c) ((c&0xe0)==0xc0) #define threebyte(c) ((c&0xf0)==0xe0) char **argp; char **args; int nerror; /* number of errors encountered during compilation */ int doprompt; /* is it time for a prompt? */ /* * Which fds are the reading/writing end of a pipe? * Unfortunately, this can vary from system to system. * 9th edition Unix doesn't care, the following defines * work on plan 9. */ #define PRD 0 #define PWR 1 extern char *Rcmain(), Fdprefix[]; #define register /* * How many dot commands have we executed? * Used to ensure that -v flag doesn't print rcmain. */ int ndot; char *getstatus(void); int lastc; int lastword; int kidpid; 9base-6/rc/io.h0000644000175000017500000000120611402154555012731 0ustar anselmanselm/* * on Mac OS X, err is something else, * and assigning to it causes a bus error. * what a crappy linker. */ #define err rc_err #define EOF (-1) #define NBUF 512 struct io{ int fd; char *bufp, *ebuf, *strp, buf[NBUF]; }; io *err; io *openfd(int), *openstr(void), *opencore(char *, int); int emptybuf(io*); void pchr(io*, int); int rchr(io*); void closeio(io*); void flush(io*); int fullbuf(io*, int); void pdec(io*, int); void poct(io*, unsigned); void pptr(io*, void*); void pquo(io*, char*); void pwrd(io*, char*); void pstr(io*, char*); void pcmd(io*, tree*); void pval(io*, word*); void pfnc(io*, thread*); void pfmt(io*, char*, ...); 9base-6/rc/here.c0000644000175000017500000000471011402154555013243 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" struct here *here, **ehere; int ser = 0; char tmp[]="/tmp/here0000.0000"; char hex[]="0123456789abcdef"; void psubst(io*, char*); void pstrs(io*, word*); void hexnum(char *p, int n) { *p++=hex[(n>>12)&0xF]; *p++=hex[(n>>8)&0xF]; *p++=hex[(n>>4)&0xF]; *p = hex[n&0xF]; } tree* heredoc(tree *tag) { struct here *h = new(struct here); if(tag->type!=WORD) yyerror("Bad here tag"); h->next = 0; if(here) *ehere = h; else here = h; ehere=&h->next; h->tag = tag; hexnum(&tmp[9], getpid()); hexnum(&tmp[14], ser++); h->name = strdup(tmp); return token(tmp, WORD); } /* * bug: lines longer than NLINE get split -- this can cause spurious * missubstitution, or a misrecognized EOF marker. */ #define NLINE 4096 void readhere(void) { struct here *h, *nexth; io *f; char *s, *tag; int c, subst; char line[NLINE+1]; for(h = here;h;h = nexth){ subst=!h->tag->quoted; tag = h->tag->str; c = Creat(h->name); if(c<0) yyerror("can't create here document"); f = openfd(c); s = line; pprompt(); while((c = rchr(runq->cmdfd))!=EOF){ if(c=='\n' || s==&line[NLINE]){ *s='\0'; if(tag && strcmp(line, tag)==0) break; if(subst) psubst(f, line); else pstr(f, line); s = line; if(c=='\n'){ pprompt(); pchr(f, c); } else *s++=c; } else *s++=c; } flush(f); closeio(f); cleanhere(h->name); nexth = h->next; efree((char *)h); } here = 0; doprompt = 1; } void psubst(io *f, char *s) { char *t, *u; int savec, n; word *star; while(*s){ if(*s!='$'){ if(0xa0<=(*s&0xff) && (*s&0xff)<=0xf5){ pchr(f, *s++); if(*s=='\0') break; } else if(0xf6<=(*s&0xff) && (*s&0xff)<=0xf7){ pchr(f, *s++); if(*s=='\0') break; pchr(f, *s++); if(*s=='\0') break; } pchr(f, *s++); } else{ t=++s; if(*t=='$') pchr(f, *t++); else{ while(*t && idchr(*t)) t++; savec=*t; *t='\0'; n = 0; for(u = s;*u && '0'<=*u && *u<='9';u++) n = n*10+*u-'0'; if(n && *u=='\0'){ star = vlook("*")->val; if(star && 1<=n && n<=count(star)){ while(--n) star = star->next; pstr(f, star->word); } } else pstrs(f, vlook(s)->val); *t = savec; if(savec=='^') t++; } s = t; } } } void pstrs(io *f, word *a) { if(a){ while(a->next && a->next->word){ pstr(f, a->word); pchr(f, ' '); a = a->next; } pstr(f, a->word); } } 9base-6/rc/io.c0000644000175000017500000000725311402154555012734 0ustar anselmanselm#include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" int pfmtnest = 0; void pfmt(io *f, char *fmt, ...) { va_list ap; char err[ERRMAX]; va_start(ap, fmt); pfmtnest++; for(;*fmt;fmt++) if(*fmt!='%') pchr(f, *fmt); else switch(*++fmt){ case '\0': va_end(ap); return; case 'c': pchr(f, va_arg(ap, int)); break; case 'd': pdec(f, va_arg(ap, int)); break; case 'o': poct(f, va_arg(ap, unsigned)); break; case 'p': pptr(f, va_arg(ap, void*)); break; case 'Q': pquo(f, va_arg(ap, char *)); break; case 'q': pwrd(f, va_arg(ap, char *)); break; case 'r': rerrstr(err, sizeof err); pstr(f, err); break; case 's': pstr(f, va_arg(ap, char *)); break; case 't': pcmd(f, va_arg(ap, struct tree *)); break; case 'v': pval(f, va_arg(ap, struct word *)); break; default: pchr(f, *fmt); break; } va_end(ap); if(--pfmtnest==0) flush(f); } void pchr(io *b, int c) { if(b->bufp==b->ebuf) fullbuf(b, c); else *b->bufp++=c; } int rchr(io *b) { if(b->bufp==b->ebuf) return emptybuf(b); return *b->bufp++ & 0xFF; } void pquo(io *f, char *s) { pchr(f, '\''); for(;*s;s++) if(*s=='\'') pfmt(f, "''"); else pchr(f, *s); pchr(f, '\''); } void pwrd(io *f, char *s) { char *t; for(t = s;*t;t++) if(!wordchr(*t)) break; if(t==s || *t) pquo(f, s); else pstr(f, s); } void pptr(io *f, void *v) { int n; uintptr p; p = (uintptr)v; if(sizeof(uintptr) == sizeof(uvlong) && p>>32) for(n = 60;n>=32;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]); for(n = 28;n>=0;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]); } void pstr(io *f, char *s) { if(s==0) s="(null)"; while(*s) pchr(f, *s++); } void pdec(io *f, int n) { if(n<0){ n=-n; if(n>=0){ pchr(f, '-'); pdec(f, n); return; } /* n is two's complement minimum integer */ n = 1-n; pchr(f, '-'); pdec(f, n/10); pchr(f, n%10+'1'); return; } if(n>9) pdec(f, n/10); pchr(f, n%10+'0'); } void poct(io *f, unsigned n) { if(n>7) poct(f, n>>3); pchr(f, (n&7)+'0'); } void pval(io *f, word *a) { if(a){ while(a->next && a->next->word){ pwrd(f, a->word); pchr(f, ' '); a = a->next; } pwrd(f, a->word); } } int fullbuf(io *f, int c) { flush(f); return *f->bufp++=c; } void flush(io *f) { int n; char *s; if(f->strp){ n = f->ebuf-f->strp; f->strp = realloc(f->strp, n+101); if(f->strp==0) panic("Can't realloc %d bytes in flush!", n+101); f->bufp = f->strp+n; f->ebuf = f->bufp+100; for(s = f->bufp;s<=f->ebuf;s++) *s='\0'; } else{ n = f->bufp-f->buf; if(n && Write(f->fd, f->buf, n) < 0){ Write(3, "Write error\n", 12); if(ntrap) dotrap(); } f->bufp = f->buf; f->ebuf = f->buf+NBUF; } } io* openfd(int fd) { io *f = new(struct io); f->fd = fd; f->bufp = f->ebuf = f->buf; f->strp = 0; return f; } io* openstr(void) { io *f = new(struct io); char *s; f->fd=-1; f->bufp = f->strp = emalloc(101); f->ebuf = f->bufp+100; for(s = f->bufp;s<=f->ebuf;s++) *s='\0'; return f; } /* * Open a corebuffer to read. EOF occurs after reading len * characters from buf. */ io* opencore(char *s, int len) { io *f = new(struct io); char *buf = emalloc(len); f->fd= -1 /*open("/dev/null", 0)*/; f->bufp = f->strp = buf; f->ebuf = buf+len; Memcpy(buf, s, len); return f; } void iorewind(io *io) { if(io->fd==-1) io->bufp = io->strp; else{ io->bufp = io->ebuf = io->buf; Seek(io->fd, 0L, 0); } } void closeio(io *io) { if(io->fd>=0) close(io->fd); if(io->strp) efree(io->strp); efree((char *)io); } int emptybuf(io *f) { int n; if(f->fd==-1 || (n = Read(f->fd, f->buf, NBUF))<=0) return EOF; f->bufp = f->buf; f->ebuf = f->buf+n; return *f->bufp++&0xff; } 9base-6/rc/rcmain0000644000175000017500000000136311402154555013351 0ustar anselmanselm# rcmain: Plan 9 on Unix version if(~ $#home 0) home=$HOME if(~ $#home 0) home=/ if(~ $#ifs 0) ifs=' ' switch($#prompt){ case 0 prompt=('; ' ' ') case 1 prompt=($prompt ' ') } if(~ $rcname ?.out ?.rc */?.rc */?.out) prompt=('broken! ' ' ') if(flag p) path=(/bin /usr/bin) if not{ finit # should be taken care of by rc now, but leave just in case } fn sigexit if(! ~ $#cflag 0){ if(flag l && test -r $home/lib/profile) . $home/lib/profile status='' eval $cflag exit $status } if(flag i){ if(flag l && test -r $home/lib/profile) . $home/lib/profile status='' if(! ~ $#* 0) . $* . -i '/dev/stdin' exit $status } if(flag l && test -r $home/lib/profile) . $home/lib/profile if(~ $#* 0){ . /dev/stdin exit $status } status='' . $* exit $status 9base-6/rc/unixcrap.c0000644000175000017500000000713611402154555014156 0ustar anselmanselm#include #include #include #include #include #include #include #include "rc.h" #include "exec.h" #include "io.h" #include "fns.h" #include "getflags.h" extern char **mkargv(word*); extern int mapfd(int); static char *eargs = "cdflmnstuv"; static int rlx[] = { RLIMIT_CORE, RLIMIT_DATA, RLIMIT_FSIZE, #ifdef RLIMIT_MEMLOCK RLIMIT_MEMLOCK, #else 0, #endif #ifdef RLIMIT_RSS RLIMIT_RSS, #else 0, #endif RLIMIT_NOFILE, RLIMIT_STACK, RLIMIT_CPU, #ifdef RLIMIT_NPROC RLIMIT_NPROC, #else 0, #endif #ifdef RLIMIT_RSS RLIMIT_RSS, #else 0, #endif }; static void eusage(void) { fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs); } #define Notset -4 #define Unlimited -3 #define Hard -2 #define Soft -1 void execulimit(void) { int fd, n, argc, sethard, setsoft, limit; int flag[256]; char **argv, **oargv, *p; char *argv0; struct rlimit rl; argv0 = nil; setstatus(""); oargv = mkargv(runq->argv->words); argv = oargv+1; for(argc=0; argv[argc]; argc++) ; memset(flag, 0, sizeof flag); ARGBEGIN{ default: if(strchr(eargs, ARGC()) == nil){ eusage(); return; } case 'S': case 'H': case 'a': flag[ARGC()] = 1; break; }ARGEND if(argc > 1){ eusage(); goto out; } fd = mapfd(1); sethard = 1; setsoft = 1; if(flag['S'] && flag['H']) ; else if(flag['S']) sethard = 0; else if(flag['H']) setsoft = 0; limit = Notset; if(argc>0){ if(strcmp(argv[0], "unlimited") == 0) limit = Unlimited; else if(strcmp(argv[0], "hard") == 0) limit = Hard; else if(strcmp(argv[0], "soft") == 0) limit = Soft; else if((limit = strtol(argv[0], &p, 0)) < 0 || *p != 0){ eusage(); goto out; } } if(flag['a']){ for(p=eargs; *p; p++){ getrlimit(rlx[p-eargs], &rl); n = flag['H'] ? rl.rlim_max : rl.rlim_cur; if(n == -1) fprint(fd, "ulimit -%c unlimited\n", *p); else fprint(fd, "ulimit -%c %d\n", *p, n); } goto out; } for(p=eargs; *p; p++){ if(flag[(uchar)*p]){ n = 0; getrlimit(rlx[p-eargs], &rl); switch(limit){ case Notset: n = flag['H'] ? rl.rlim_max : rl.rlim_cur; if(n == -1) fprint(fd, "ulimit -%c unlimited\n", *p); else fprint(fd, "ulimit -%c %d\n", *p, n); break; case Hard: n = rl.rlim_max; goto set; case Soft: n = rl.rlim_cur; goto set; case Unlimited: n = -1; goto set; default: n = limit; set: if(setsoft) rl.rlim_cur = n; if(sethard) rl.rlim_max = n; if(setrlimit(rlx[p-eargs], &rl) < 0) fprint(mapfd(2), "setrlimit: %r\n"); } } } out: free(oargv); poplist(); flush(err); } void execumask(void) { int n, argc; char **argv, **oargv, *p; char *argv0; argv0 = nil; setstatus(""); oargv = mkargv(runq->argv->words); argv = oargv+1; for(argc=0; argv[argc]; argc++) ; ARGBEGIN{ default: usage: fprint(mapfd(2), "usage: umask [mode]\n"); goto out; }ARGEND if(argc > 1) goto usage; if(argc == 1){ n = strtol(argv[0], &p, 8); if(*p != 0 || p == argv[0]) goto usage; umask(n); goto out; } n = umask(0); umask(n); if(n < 0){ fprint(mapfd(2), "umask: %r\n"); goto out; } fprint(mapfd(1), "umask %03o\n", n); out: free(oargv); poplist(); flush(err); } /* * Cope with non-blocking read. */ long readnb(int fd, char *buf, long cnt) { int n, didreset; int flgs; didreset = 0; while((n = read(fd, buf, cnt)) == -1) if(!didreset && errno == EAGAIN){ if((flgs = fcntl(fd, F_GETFL, 0)) == -1) return -1; flgs &= ~O_NONBLOCK; if(fcntl(fd, F_SETFL, flgs) == -1) return -1; didreset = 1; } return n; } 9base-6/rc/fns.h0000644000175000017500000000272211402154555013114 0ustar anselmanselmvoid Abort(void); void Closedir(int); int Creat(char*); int Dup(int, int); int Dup1(int); int Eintr(void); int Executable(char*); void Execute(word*, word*); void Exit(char*); int ForkExecute(char*, char**, int, int, int); int Globsize(char*); int Isatty(int); void Memcpy(char*, char*, long); void Noerror(void); int Opendir(char*); long Read(int, char*, long); int Readdir(int, char*, int); long Seek(int, long, long); void Trapinit(void); void Unlink(char*); void Updenv(void); void Vinit(void); int Waitfor(int, int); long Write(int, char*, long); void addwaitpid(int); int advance(void); int back(int); void cleanhere(char*); void codefree(code*); int compile(tree*); char * list2str(word*); int count(word*); void deglob(char*); void delwaitpid(int); void dotrap(void); void freenodes(void); void freewords(word*); void globlist(void); int havewaitpid(int); int idchr(int); void inttoascii(char*, long); void kinit(void); int mapfd(int); int match(char*, char*, int); int matchfn(char*, char*); char** mkargv(word*); void clearwaitpids(void); void panic(char*, int); void pathinit(void); void poplist(void); void popword(void); void pprompt(void); void pushlist(void); void pushredir(int, int, int); void pushword(char*); void readhere(void); word* searchpath(char*); void setstatus(char*); void setvar(char*, word*); void skipnl(void); void start(code*, int, var*); int truestatus(void); void usage(char*); int wordchr(int); void yyerror(char*); int yylex(void); int yyparse(void); 9base-6/config.mk0000644000175000017500000000105011402154555013340 0ustar anselmanselm# Customize to fit your system # paths PREFIX = /usr/local/plan9 MANPREFIX = ${PREFIX}/share/man VERSION = 6 OBJTYPE = 386 #OBJTYPE = arm #OBJTYPE = x86_64 # Linux/BSD #CFLAGS += -Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -c -I. -DPREFIX="\"${PREFIX}\"" CFLAGS += -c -I. -DPREFIX="\"${PREFIX}\"" LDFLAGS += -static # Solaris #CFLAGS = -fast -xtarget=ultra -D__sun__ -c -I. -DPREFIX="\"${PREFIX}\"" #LDFLAGS = -dn # compiler AR = ar rc CC = cc YACC = ../yacc/9yacc 9base-6/awk/0000755000175000017500000000000011402154555012330 5ustar anselmanselm9base-6/awk/lex.c0000644000175000017500000003007311402154555013267 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #include #include #include #include #include "awk.h" #include "y.tab.h" extern YYSTYPE yylval; extern int infunc; int lineno = 1; int bracecnt = 0; int brackcnt = 0; int parencnt = 0; typedef struct Keyword { char *word; int sub; int type; } Keyword; Keyword keywords[] ={ /* keep sorted: binary searched */ { "BEGIN", XBEGIN, XBEGIN }, { "END", XEND, XEND }, { "NF", VARNF, VARNF }, { "atan2", FATAN, BLTIN }, { "break", BREAK, BREAK }, { "close", CLOSE, CLOSE }, { "continue", CONTINUE, CONTINUE }, { "cos", FCOS, BLTIN }, { "delete", DELETE, DELETE }, { "do", DO, DO }, { "else", ELSE, ELSE }, { "exit", EXIT, EXIT }, { "exp", FEXP, BLTIN }, { "fflush", FFLUSH, BLTIN }, { "for", FOR, FOR }, { "func", FUNC, FUNC }, { "function", FUNC, FUNC }, { "getline", GETLINE, GETLINE }, { "gsub", GSUB, GSUB }, { "if", IF, IF }, { "in", IN, IN }, { "index", INDEX, INDEX }, { "int", FINT, BLTIN }, { "length", FLENGTH, BLTIN }, { "log", FLOG, BLTIN }, { "match", MATCHFCN, MATCHFCN }, { "next", NEXT, NEXT }, { "nextfile", NEXTFILE, NEXTFILE }, { "print", PRINT, PRINT }, { "printf", PRINTF, PRINTF }, { "rand", FRAND, BLTIN }, { "return", RETURN, RETURN }, { "sin", FSIN, BLTIN }, { "split", SPLIT, SPLIT }, { "sprintf", SPRINTF, SPRINTF }, { "sqrt", FSQRT, BLTIN }, { "srand", FSRAND, BLTIN }, { "sub", SUB, SUB }, { "substr", SUBSTR, SUBSTR }, { "system", FSYSTEM, BLTIN }, { "tolower", FTOLOWER, BLTIN }, { "toupper", FTOUPPER, BLTIN }, { "utf", FUTF, BLTIN }, { "while", WHILE, WHILE }, }; #define DEBUG #ifdef DEBUG #define RET(x) { if(dbg)printf("lex %s\n", tokname(x)); return(x); } #else #define RET(x) return(x) #endif int peek(void) { int c = input(); unput(c); return c; } int gettok(char **pbuf, int *psz) /* get next input token */ { int c; char *buf = *pbuf; int sz = *psz; char *bp = buf; c = input(); if (c == 0) return 0; buf[0] = c; buf[1] = 0; if (!isalnum(c) && c != '.' && c != '_') return c; *bp++ = c; if (isalpha(c) || c == '_') { /* it's a varname */ for ( ; (c = input()) != 0; ) { if (bp-buf >= sz) if (!adjbuf(&buf, &sz, bp-buf+2, 100, &bp, 0)) FATAL( "out of space for name %.10s...", buf ); if (isalnum(c) || c == '_') *bp++ = c; else { *bp = 0; unput(c); break; } } } else { /* it's a number */ char *rem; /* read input until can't be a number */ for ( ; (c = input()) != 0; ) { if (bp-buf >= sz) if (!adjbuf(&buf, &sz, bp-buf+2, 100, &bp, 0)) FATAL( "out of space for number %.10s...", buf ); if (isdigit(c) || c == 'e' || c == 'E' || c == '.' || c == '+' || c == '-') *bp++ = c; else { unput(c); break; } } *bp = 0; strtod(buf, &rem); /* parse the number */ unputstr(rem); /* put rest back for later */ rem[0] = 0; } *pbuf = buf; *psz = sz; return buf[0]; } int word(char *); int string(void); int regexpr(void); int sc = 0; /* 1 => return a } right now */ int reg = 0; /* 1 => return a REGEXPR now */ int yylex(void) { int c; static char *buf = 0; static int bufsize = 500; if (buf == 0 && (buf = (char *) malloc(bufsize)) == NULL) FATAL( "out of space in yylex" ); if (sc) { sc = 0; RET('}'); } if (reg) { reg = 0; return regexpr(); } for (;;) { c = gettok(&buf, &bufsize); if (c == 0) return 0; if (isalpha(c) || c == '_') return word(buf); if (isdigit(c) || c == '.') { yylval.cp = setsymtab(buf, tostring(buf), atof(buf), CON|NUM, symtab); /* should this also have STR set? */ RET(NUMBER); } yylval.i = c; switch (c) { case '\n': /* {EOL} */ RET(NL); case '\r': /* assume \n is coming */ case ' ': /* {WS}+ */ case '\t': break; case '#': /* #.* strip comments */ while ((c = input()) != '\n' && c != 0) ; unput(c); break; case ';': RET(';'); case '\\': if (peek() == '\n') { input(); } else if (peek() == '\r') { input(); input(); /* \n */ lineno++; } else { RET(c); } break; case '&': if (peek() == '&') { input(); RET(AND); } else RET('&'); case '|': if (peek() == '|') { input(); RET(BOR); } else RET('|'); case '!': if (peek() == '=') { input(); yylval.i = NE; RET(NE); } else if (peek() == '~') { input(); yylval.i = NOTMATCH; RET(MATCHOP); } else RET(NOT); case '~': yylval.i = MATCH; RET(MATCHOP); case '<': if (peek() == '=') { input(); yylval.i = LE; RET(LE); } else { yylval.i = LT; RET(LT); } case '=': if (peek() == '=') { input(); yylval.i = EQ; RET(EQ); } else { yylval.i = ASSIGN; RET(ASGNOP); } case '>': if (peek() == '=') { input(); yylval.i = GE; RET(GE); } else if (peek() == '>') { input(); yylval.i = APPEND; RET(APPEND); } else { yylval.i = GT; RET(GT); } case '+': if (peek() == '+') { input(); yylval.i = INCR; RET(INCR); } else if (peek() == '=') { input(); yylval.i = ADDEQ; RET(ASGNOP); } else RET('+'); case '-': if (peek() == '-') { input(); yylval.i = DECR; RET(DECR); } else if (peek() == '=') { input(); yylval.i = SUBEQ; RET(ASGNOP); } else RET('-'); case '*': if (peek() == '=') { /* *= */ input(); yylval.i = MULTEQ; RET(ASGNOP); } else if (peek() == '*') { /* ** or **= */ input(); /* eat 2nd * */ if (peek() == '=') { input(); yylval.i = POWEQ; RET(ASGNOP); } else { RET(POWER); } } else RET('*'); case '/': RET('/'); case '%': if (peek() == '=') { input(); yylval.i = MODEQ; RET(ASGNOP); } else RET('%'); case '^': if (peek() == '=') { input(); yylval.i = POWEQ; RET(ASGNOP); } else RET(POWER); case '$': /* BUG: awkward, if not wrong */ c = gettok(&buf, &bufsize); if (c == '(' || c == '[' || (infunc && isarg(buf) >= 0)) { unputstr(buf); RET(INDIRECT); } else if (isalpha(c)) { if (strcmp(buf, "NF") == 0) { /* very special */ unputstr("(NF)"); RET(INDIRECT); } yylval.cp = setsymtab(buf, "", 0.0, STR|NUM, symtab); RET(IVAR); } else { unputstr(buf); RET(INDIRECT); } case '}': if (--bracecnt < 0) SYNTAX( "extra }" ); sc = 1; RET(';'); case ']': if (--brackcnt < 0) SYNTAX( "extra ]" ); RET(']'); case ')': if (--parencnt < 0) SYNTAX( "extra )" ); RET(')'); case '{': bracecnt++; RET('{'); case '[': brackcnt++; RET('['); case '(': parencnt++; RET('('); case '"': return string(); /* BUG: should be like tran.c ? */ default: RET(c); } } } int string(void) { int c, n; char *s, *bp; static char *buf = 0; static int bufsz = 500; if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) FATAL("out of space for strings"); for (bp = buf; (c = input()) != '"'; ) { if (!adjbuf(&buf, &bufsz, bp-buf+2, 500, &bp, 0)) FATAL("out of space for string %.10s...", buf); switch (c) { case '\n': case '\r': case 0: SYNTAX( "non-terminated string %.10s...", buf ); lineno++; break; case '\\': c = input(); switch (c) { case '"': *bp++ = '"'; break; case 'n': *bp++ = '\n'; break; case 't': *bp++ = '\t'; break; case 'f': *bp++ = '\f'; break; case 'r': *bp++ = '\r'; break; case 'b': *bp++ = '\b'; break; case 'v': *bp++ = '\v'; break; case 'a': *bp++ = '\007'; break; case '\\': *bp++ = '\\'; break; case '0': case '1': case '2': /* octal: \d \dd \ddd */ case '3': case '4': case '5': case '6': case '7': n = c - '0'; if ((c = peek()) >= '0' && c < '8') { n = 8 * n + input() - '0'; if ((c = peek()) >= '0' && c < '8') n = 8 * n + input() - '0'; } *bp++ = n; break; case 'x': /* hex \x0-9a-fA-F + */ { char xbuf[100], *px; for (px = xbuf; (c = input()) != 0 && px-xbuf < 100-2; ) { if (isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) *px++ = c; else break; } *px = 0; unput(c); sscanf(xbuf, "%x", &n); *bp++ = n; break; } default: *bp++ = c; break; } break; default: *bp++ = c; break; } } *bp = 0; s = tostring(buf); *bp++ = ' '; *bp++ = 0; yylval.cp = setsymtab(buf, s, 0.0, CON|STR|DONTFREE, symtab); RET(STRING); } int binsearch(char *w, Keyword *kp, int n) { int cond, low, mid, high; low = 0; high = n - 1; while (low <= high) { mid = (low + high) / 2; if ((cond = strcmp(w, kp[mid].word)) < 0) high = mid - 1; else if (cond > 0) low = mid + 1; else return mid; } return -1; } int word(char *w) { Keyword *kp; int c, n; n = binsearch(w, keywords, sizeof(keywords)/sizeof(keywords[0])); kp = keywords + n; if (n != -1) { /* found in table */ yylval.i = kp->sub; switch (kp->type) { /* special handling */ case FSYSTEM: if (safe) SYNTAX( "system is unsafe" ); RET(kp->type); case FUNC: if (infunc) SYNTAX( "illegal nested function" ); RET(kp->type); case RETURN: if (!infunc) SYNTAX( "return not in function" ); RET(kp->type); case VARNF: yylval.cp = setsymtab("NF", "", 0.0, NUM, symtab); RET(VARNF); default: RET(kp->type); } } c = peek(); /* look for '(' */ if (c != '(' && infunc && (n=isarg(w)) >= 0) { yylval.i = n; RET(ARG); } else { yylval.cp = setsymtab(w, "", 0.0, STR|NUM|DONTFREE, symtab); if (c == '(') { RET(CALL); } else { RET(VAR); } } } void startreg(void) /* next call to yyles will return a regular expression */ { reg = 1; } int regexpr(void) { int c; static char *buf = 0; static int bufsz = 500; char *bp; if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) FATAL("out of space for rex expr"); bp = buf; for ( ; (c = input()) != '/' && c != 0; ) { if (!adjbuf(&buf, &bufsz, bp-buf+3, 500, &bp, 0)) FATAL("out of space for reg expr %.10s...", buf); if (c == '\n') { SYNTAX( "newline in regular expression %.10s...", buf ); unput('\n'); break; } else if (c == '\\') { *bp++ = '\\'; *bp++ = input(); } else { *bp++ = c; } } *bp = 0; yylval.s = tostring(buf); unput('/'); RET(REGEXPR); } /* low-level lexical stuff, sort of inherited from lex */ char ebuf[300]; char *ep = ebuf; char yysbuf[100]; /* pushback buffer */ char *yysptr = yysbuf; FILE *yyin = 0; int input(void) /* get next lexical input character */ { int c; extern char *lexprog; if (yysptr > yysbuf) c = *--yysptr; else if (lexprog != NULL) { /* awk '...' */ if ((c = *lexprog) != 0) lexprog++; } else /* awk -f ... */ c = pgetc(); if (c == '\n') lineno++; else if (c == EOF) c = 0; if (ep >= ebuf + sizeof ebuf) ep = ebuf; return *ep++ = c; } void unput(int c) /* put lexical character back on input */ { if (c == '\n') lineno--; if (yysptr >= yysbuf + sizeof(yysbuf)) FATAL("pushed back too much: %.20s...", yysbuf); *yysptr++ = c; if (--ep < ebuf) ep = ebuf + sizeof(ebuf) - 1; } void unputstr(char *s) /* put a string back on input */ { int i; for (i = strlen(s)-1; i >= 0; i--) unput(s[i]); } 9base-6/awk/Makefile0000644000175000017500000000031411402154555013766 0ustar anselmanselm# awk - awk unix port from plan9 # Depends on ../lib9 TARG = awk OFILES = re.o lex.o main.o parse.o proctab.o tran.o lib.o run.o y.tab.o YFILES = awkgram.y MANFILES = awk.1 include ../yacc.mk 9base-6/awk/parse.c0000644000175000017500000001171511402154555013613 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define DEBUG #include #include #include #include "awk.h" #include "y.tab.h" Node *nodealloc(int n) { Node *x; x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *)); if (x == NULL) FATAL("out of space in nodealloc"); x->nnext = NULL; x->lineno = lineno; return(x); } Node *exptostat(Node *a) { a->ntype = NSTAT; return(a); } Node *node1(int a, Node *b) { Node *x; x = nodealloc(1); x->nobj = a; x->narg[0]=b; return(x); } Node *node2(int a, Node *b, Node *c) { Node *x; x = nodealloc(2); x->nobj = a; x->narg[0] = b; x->narg[1] = c; return(x); } Node *node3(int a, Node *b, Node *c, Node *d) { Node *x; x = nodealloc(3); x->nobj = a; x->narg[0] = b; x->narg[1] = c; x->narg[2] = d; return(x); } Node *node4(int a, Node *b, Node *c, Node *d, Node *e) { Node *x; x = nodealloc(4); x->nobj = a; x->narg[0] = b; x->narg[1] = c; x->narg[2] = d; x->narg[3] = e; return(x); } Node *stat1(int a, Node *b) { Node *x; x = node1(a,b); x->ntype = NSTAT; return(x); } Node *stat2(int a, Node *b, Node *c) { Node *x; x = node2(a,b,c); x->ntype = NSTAT; return(x); } Node *stat3(int a, Node *b, Node *c, Node *d) { Node *x; x = node3(a,b,c,d); x->ntype = NSTAT; return(x); } Node *stat4(int a, Node *b, Node *c, Node *d, Node *e) { Node *x; x = node4(a,b,c,d,e); x->ntype = NSTAT; return(x); } Node *op1(int a, Node *b) { Node *x; x = node1(a,b); x->ntype = NEXPR; return(x); } Node *op2(int a, Node *b, Node *c) { Node *x; x = node2(a,b,c); x->ntype = NEXPR; return(x); } Node *op3(int a, Node *b, Node *c, Node *d) { Node *x; x = node3(a,b,c,d); x->ntype = NEXPR; return(x); } Node *op4(int a, Node *b, Node *c, Node *d, Node *e) { Node *x; x = node4(a,b,c,d,e); x->ntype = NEXPR; return(x); } Node *celltonode(Cell *a, int b) { Node *x; a->ctype = OCELL; a->csub = b; x = node1(0, (Node *) a); x->ntype = NVALUE; return(x); } Node *rectonode(void) /* make $0 into a Node */ { extern Cell *literal0; return op1(INDIRECT, celltonode(literal0, CUNK)); } Node *makearr(Node *p) { Cell *cp; if (isvalue(p)) { cp = (Cell *) (p->narg[0]); if (isfcn(cp)) SYNTAX( "%s is a function, not an array", cp->nval ); else if (!isarr(cp)) { xfree(cp->sval); cp->sval = (char *) makesymtab(NSYMTAB); cp->tval = ARR; } } return p; } #define PA2NUM 50 /* max number of pat,pat patterns allowed */ int paircnt; /* number of them in use */ int pairstack[PA2NUM]; /* state of each pat,pat */ Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */ { Node *x; x = node4(PASTAT2, a, b, c, itonp(paircnt)); if (paircnt++ >= PA2NUM) SYNTAX( "limited to %d pat,pat statements", PA2NUM ); x->ntype = NSTAT; return(x); } Node *linkum(Node *a, Node *b) { Node *c; if (errorflag) /* don't link things that are wrong */ return a; if (a == NULL) return(b); else if (b == NULL) return(a); for (c = a; c->nnext != NULL; c = c->nnext) ; c->nnext = b; return(a); } void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */ { /* body of function, arglist */ Node *p; int n; if (isarr(v)) { SYNTAX( "`%s' is an array name and a function name", v->nval ); return; } v->tval = FCN; v->sval = (char *) st; n = 0; /* count arguments */ for (p = vl; p; p = p->nnext) n++; v->fval = n; dprintf( ("defining func %s (%d args)\n", v->nval, n) ); } int isarg(char *s) /* is s in argument list for current function? */ { /* return -1 if not, otherwise arg # */ extern Node *arglist; Node *p = arglist; int n; for (n = 0; p != 0; p = p->nnext, n++) if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0) return n; return -1; } int ptoi(void *p) /* convert pointer to integer */ { return (int) (long) p; /* swearing that p fits, of course */ } Node *itonp(int i) /* and vice versa */ { return (Node *) (long) i; } 9base-6/awk/proto.h0000644000175000017500000001405311402154555013647 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define getline p9getline extern int yywrap(void); extern void setfname(Cell *); extern int constnode(Node *); extern char *strnode(Node *); extern Node *notnull(Node *); extern int yyparse(void); extern int yylex(void); extern void startreg(void); extern int input(void); extern void unput(int); extern void unputstr(char *); extern int yylook(void); extern int yyback(int *, int); extern int yyinput(void); extern void *compre(char *); extern int hexstr(char **); extern void quoted(char **, char **, char *); extern int match(void *, char *, char *); extern int pmatch(void *, char *, char *); extern int nematch(void *, char *, char *); extern int countposn(char *, int); extern void overflow(void); extern int pgetc(void); extern char *cursource(void); extern Node *nodealloc(int); extern Node *exptostat(Node *); extern Node *node1(int, Node *); extern Node *node2(int, Node *, Node *); extern Node *node3(int, Node *, Node *, Node *); extern Node *node4(int, Node *, Node *, Node *, Node *); extern Node *stat3(int, Node *, Node *, Node *); extern Node *op2(int, Node *, Node *); extern Node *op1(int, Node *); extern Node *stat1(int, Node *); extern Node *op3(int, Node *, Node *, Node *); extern Node *op4(int, Node *, Node *, Node *, Node *); extern Node *stat2(int, Node *, Node *); extern Node *stat4(int, Node *, Node *, Node *, Node *); extern Node *celltonode(Cell *, int); extern Node *rectonode(void); extern Node *makearr(Node *); extern Node *pa2stat(Node *, Node *, Node *); extern Node *linkum(Node *, Node *); extern void defn(Cell *, Node *, Node *); extern int isarg(char *); extern char *tokname(int); extern Cell *(*proctab[])(Node **, int); extern int ptoi(void *); extern Node *itonp(int); extern void syminit(void); extern void arginit(int, char **); extern void envinit(char **); extern Array *makesymtab(int); extern void freesymtab(Cell *); extern void freeelem(Cell *, char *); extern Cell *setsymtab(char *, char *, double, unsigned int, Array *); extern int hash(char *, int); extern void rehash(Array *); extern Cell *lookup(char *, Array *); extern double setfval(Cell *, double); extern void funnyvar(Cell *, char *); extern char *setsval(Cell *, char *); extern double getfval(Cell *); extern char *getsval(Cell *); extern char *tostring(char *); extern char *qstring(char *, int); extern void recinit(unsigned int); extern void initgetrec(void); extern void makefields(int, int); extern void growfldtab(int n); extern int getrec(char **, int *, int); extern void nextfile(void); extern int readrec(char **buf, int *bufsize, FILE *inf); extern char *getargv(int); extern void setclvar(char *); extern void fldbld(void); extern void cleanfld(int, int); extern void newfld(int); extern int refldbld(char *, char *); extern void recbld(void); extern Cell *fieldadr(int); extern void yyerror(char *); extern void fpecatch(int); extern void bracecheck(void); extern void bcheck2(int, int, int); extern void SYNTAX(char *, ...); extern void FATAL(char *, ...); extern void WARNING(char *, ...); extern void error(void); extern void eprint(void); extern void bclass(int); extern double errcheck(double, char *); extern int isclvar(char *); extern int is_number(char *); extern int adjbuf(char **pb, int *sz, int min, int q, char **pbp, char *what); extern void run(Node *); extern Cell *execute(Node *); extern Cell *program(Node **, int); extern Cell *call(Node **, int); extern Cell *copycell(Cell *); extern Cell *arg(Node **, int); extern Cell *jump(Node **, int); extern Cell *getline(Node **, int); extern Cell *getnf(Node **, int); extern Cell *array(Node **, int); extern Cell *awkdelete(Node **, int); extern Cell *intest(Node **, int); extern Cell *matchop(Node **, int); extern Cell *boolop(Node **, int); extern Cell *relop(Node **, int); extern void tfree(Cell *); extern Cell *gettemp(void); extern Cell *field(Node **, int); extern Cell *indirect(Node **, int); extern Cell *substr(Node **, int); extern Cell *sindex(Node **, int); extern int format(char **, int *, char *, Node *); extern Cell *awksprintf(Node **, int); extern Cell *awkprintf(Node **, int); extern Cell *arith(Node **, int); extern double ipow(double, int); extern Cell *incrdecr(Node **, int); extern Cell *assign(Node **, int); extern Cell *cat(Node **, int); extern Cell *pastat(Node **, int); extern Cell *dopa2(Node **, int); extern Cell *split(Node **, int); extern Cell *condexpr(Node **, int); extern Cell *ifstat(Node **, int); extern Cell *whilestat(Node **, int); extern Cell *dostat(Node **, int); extern Cell *forstat(Node **, int); extern Cell *instat(Node **, int); extern Cell *bltin(Node **, int); extern Cell *printstat(Node **, int); extern Cell *nullproc(Node **, int); extern FILE *redirect(int, Node *); extern FILE *openfile(int, char *); extern char *filename(FILE *); extern Cell *closefile(Node **, int); extern void closeall(void); extern Cell *sub(Node **, int); extern Cell *gsub(Node **, int); extern FILE *popen(const char *, const char *); extern int pclose(FILE *); 9base-6/awk/tran.c0000644000175000017500000002712011402154555013442 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define DEBUG #include #include #include #include #include #include "awk.h" #include "y.tab.h" #define FULLTAB 2 /* rehash when table gets this x full */ #define GROWTAB 4 /* grow table by this factor */ Array *symtab; /* main symbol table */ char **FS; /* initial field sep */ char **RS; /* initial record sep */ char **OFS; /* output field sep */ char **ORS; /* output record sep */ char **OFMT; /* output format for numbers */ char **CONVFMT; /* format for conversions in getsval */ Awkfloat *NF; /* number of fields in current record */ Awkfloat *NR; /* number of current record */ Awkfloat *FNR; /* number of current record in current file */ char **FILENAME; /* current filename argument */ Awkfloat *ARGC; /* number of arguments from command line */ char **SUBSEP; /* subscript separator for a[i,j,k]; default \034 */ Awkfloat *RSTART; /* start of re matched with ~; origin 1 (!) */ Awkfloat *RLENGTH; /* length of same */ Cell *nrloc; /* NR */ Cell *nfloc; /* NF */ Cell *fnrloc; /* FNR */ Array *ARGVtab; /* symbol table containing ARGV[...] */ Array *ENVtab; /* symbol table containing ENVIRON[...] */ Cell *rstartloc; /* RSTART */ Cell *rlengthloc; /* RLENGTH */ Cell *symtabloc; /* SYMTAB */ Cell *nullloc; /* a guaranteed empty cell */ Node *nullnode; /* zero&null, converted into a node for comparisons */ Cell *literal0; extern Cell **fldtab; void syminit(void) /* initialize symbol table with builtin vars */ { literal0 = setsymtab("0", "0", 0.0, NUM|STR|CON|DONTFREE, symtab); /* this is used for if(x)... tests: */ nullloc = setsymtab("$zero&null", "", 0.0, NUM|STR|CON|DONTFREE, symtab); nullnode = celltonode(nullloc, CCON); FS = &setsymtab("FS", " ", 0.0, STR|DONTFREE, symtab)->sval; RS = &setsymtab("RS", "\n", 0.0, STR|DONTFREE, symtab)->sval; OFS = &setsymtab("OFS", " ", 0.0, STR|DONTFREE, symtab)->sval; ORS = &setsymtab("ORS", "\n", 0.0, STR|DONTFREE, symtab)->sval; OFMT = &setsymtab("OFMT", "%.6g", 0.0, STR|DONTFREE, symtab)->sval; CONVFMT = &setsymtab("CONVFMT", "%.6g", 0.0, STR|DONTFREE, symtab)->sval; FILENAME = &setsymtab("FILENAME", "", 0.0, STR|DONTFREE, symtab)->sval; nfloc = setsymtab("NF", "", 0.0, NUM, symtab); NF = &nfloc->fval; nrloc = setsymtab("NR", "", 0.0, NUM, symtab); NR = &nrloc->fval; fnrloc = setsymtab("FNR", "", 0.0, NUM, symtab); FNR = &fnrloc->fval; SUBSEP = &setsymtab("SUBSEP", "\034", 0.0, STR|DONTFREE, symtab)->sval; rstartloc = setsymtab("RSTART", "", 0.0, NUM, symtab); RSTART = &rstartloc->fval; rlengthloc = setsymtab("RLENGTH", "", 0.0, NUM, symtab); RLENGTH = &rlengthloc->fval; symtabloc = setsymtab("SYMTAB", "", 0.0, ARR, symtab); symtabloc->sval = (char *) symtab; } void arginit(int ac, char **av) /* set up ARGV and ARGC */ { Cell *cp; int i; char temp[50]; ARGC = &setsymtab("ARGC", "", (Awkfloat) ac, NUM, symtab)->fval; cp = setsymtab("ARGV", "", 0.0, ARR, symtab); ARGVtab = makesymtab(NSYMTAB); /* could be (int) ARGC as well */ cp->sval = (char *) ARGVtab; for (i = 0; i < ac; i++) { sprintf(temp, "%d", i); if (is_number(*av)) setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab); else setsymtab(temp, *av, 0.0, STR, ARGVtab); av++; } } void envinit(char **envp) /* set up ENVIRON variable */ { Cell *cp; char *p; cp = setsymtab("ENVIRON", "", 0.0, ARR, symtab); ENVtab = makesymtab(NSYMTAB); cp->sval = (char *) ENVtab; for ( ; *envp; envp++) { if ((p = strchr(*envp, '=')) == NULL) continue; *p++ = 0; /* split into two strings at = */ if (is_number(p)) setsymtab(*envp, p, atof(p), STR|NUM, ENVtab); else setsymtab(*envp, p, 0.0, STR, ENVtab); p[-1] = '='; /* restore in case env is passed down to a shell */ } } Array *makesymtab(int n) /* make a new symbol table */ { Array *ap; Cell **tp; ap = (Array *) malloc(sizeof(Array)); tp = (Cell **) calloc(n, sizeof(Cell *)); if (ap == NULL || tp == NULL) FATAL("out of space in makesymtab"); ap->nelem = 0; ap->size = n; ap->tab = tp; return(ap); } void freesymtab(Cell *ap) /* free a symbol table */ { Cell *cp, *temp; Array *tp; int i; if (!isarr(ap)) return; tp = (Array *) ap->sval; if (tp == NULL) return; for (i = 0; i < tp->size; i++) { for (cp = tp->tab[i]; cp != NULL; cp = temp) { xfree(cp->nval); if (freeable(cp)) xfree(cp->sval); temp = cp->cnext; /* avoids freeing then using */ free(cp); } tp->tab[i] = 0; } free(tp->tab); free(tp); } void freeelem(Cell *ap, char *s) /* free elem s from ap (i.e., ap["s"] */ { Array *tp; Cell *p, *prev = NULL; int h; tp = (Array *) ap->sval; h = hash(s, tp->size); for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext) if (strcmp(s, p->nval) == 0) { if (prev == NULL) /* 1st one */ tp->tab[h] = p->cnext; else /* middle somewhere */ prev->cnext = p->cnext; if (freeable(p)) xfree(p->sval); free(p->nval); free(p); tp->nelem--; return; } } Cell *setsymtab(char *n, char *s, Awkfloat f, unsigned t, Array *tp) { int h; Cell *p; if (n != NULL && (p = lookup(n, tp)) != NULL) { dprintf( ("setsymtab found %p: n=%s s=\"%s\" f=%g t=%o\n", p, p->nval, p->sval, p->fval, p->tval) ); return(p); } p = (Cell *) malloc(sizeof(Cell)); if (p == NULL) FATAL("out of space for symbol table at %s", n); p->nval = tostring(n); p->sval = s ? tostring(s) : tostring(""); p->fval = f; p->tval = t; p->csub = CUNK; p->ctype = OCELL; tp->nelem++; if (tp->nelem > FULLTAB * tp->size) rehash(tp); h = hash(n, tp->size); p->cnext = tp->tab[h]; tp->tab[h] = p; dprintf( ("setsymtab set %p: n=%s s=\"%s\" f=%g t=%o\n", p, p->nval, p->sval, p->fval, p->tval) ); return(p); } int hash(char *s, int n) /* form hash value for string s */ { unsigned hashval; for (hashval = 0; *s != '\0'; s++) hashval = (*s + 31 * hashval); return hashval % n; } void rehash(Array *tp) /* rehash items in small table into big one */ { int i, nh, nsz; Cell *cp, *op, **np; nsz = GROWTAB * tp->size; np = (Cell **) calloc(nsz, sizeof(Cell *)); if (np == NULL) /* can't do it, but can keep running. */ return; /* someone else will run out later. */ for (i = 0; i < tp->size; i++) { for (cp = tp->tab[i]; cp; cp = op) { op = cp->cnext; nh = hash(cp->nval, nsz); cp->cnext = np[nh]; np[nh] = cp; } } free(tp->tab); tp->tab = np; tp->size = nsz; } Cell *lookup(char *s, Array *tp) /* look for s in tp */ { Cell *p; int h; h = hash(s, tp->size); for (p = tp->tab[h]; p != NULL; p = p->cnext) if (strcmp(s, p->nval) == 0) return(p); /* found it */ return(NULL); /* not found */ } Awkfloat setfval(Cell *vp, Awkfloat f) /* set float val of a Cell */ { int fldno; if ((vp->tval & (NUM | STR)) == 0) funnyvar(vp, "assign to"); if (isfld(vp)) { donerec = 0; /* mark $0 invalid */ fldno = atoi(vp->nval); if (fldno > *NF) newfld(fldno); dprintf( ("setting field %d to %g\n", fldno, f) ); } else if (isrec(vp)) { donefld = 0; /* mark $1... invalid */ donerec = 1; } if (freeable(vp)) xfree(vp->sval); /* free any previous string */ vp->tval &= ~STR; /* mark string invalid */ vp->tval |= NUM; /* mark number ok */ dprintf( ("setfval %p: %s = %g, t=%o\n", vp, vp->nval, f, vp->tval) ); return vp->fval = f; } void funnyvar(Cell *vp, char *rw) { if (isarr(vp)) FATAL("can't %s %s; it's an array name.", rw, vp->nval); if (vp->tval & FCN) FATAL("can't %s %s; it's a function.", rw, vp->nval); WARNING("funny variable %p: n=%s s=\"%s\" f=%g t=%o", vp, vp->nval, vp->sval, vp->fval, vp->tval); } char *setsval(Cell *vp, char *s) /* set string val of a Cell */ { char *t; int fldno; dprintf( ("starting setsval %p: %s = \"%s\", t=%o\n", vp, vp->nval, s, vp->tval) ); if ((vp->tval & (NUM | STR)) == 0) funnyvar(vp, "assign to"); if (isfld(vp)) { donerec = 0; /* mark $0 invalid */ fldno = atoi(vp->nval); if (fldno > *NF) newfld(fldno); dprintf( ("setting field %d to %s (%p)\n", fldno, s, s) ); } else if (isrec(vp)) { donefld = 0; /* mark $1... invalid */ donerec = 1; } t = tostring(s); /* in case it's self-assign */ vp->tval &= ~NUM; vp->tval |= STR; if (freeable(vp)) xfree(vp->sval); vp->tval &= ~DONTFREE; dprintf( ("setsval %p: %s = \"%s (%p)\", t=%o\n", vp, vp->nval, t,t, vp->tval) ); return(vp->sval = t); } Awkfloat getfval(Cell *vp) /* get float val of a Cell */ { if ((vp->tval & (NUM | STR)) == 0) funnyvar(vp, "read value of"); if (isfld(vp) && donefld == 0) fldbld(); else if (isrec(vp) && donerec == 0) recbld(); if (!isnum(vp)) { /* not a number */ vp->fval = atof(vp->sval); /* best guess */ if (is_number(vp->sval) && !(vp->tval&CON)) vp->tval |= NUM; /* make NUM only sparingly */ } dprintf( ("getfval %p: %s = %g, t=%o\n", vp, vp->nval, vp->fval, vp->tval) ); return(vp->fval); } char *getsval(Cell *vp) /* get string val of a Cell */ { char s[100]; /* BUG: unchecked */ double dtemp; if ((vp->tval & (NUM | STR)) == 0) funnyvar(vp, "read value of"); if (isfld(vp) && donefld == 0) fldbld(); else if (isrec(vp) && donerec == 0) recbld(); if (isstr(vp) == 0) { if (freeable(vp)) xfree(vp->sval); if (modf(vp->fval, &dtemp) == 0) /* it's integral */ sprintf(s, "%.30g", vp->fval); else sprintf(s, *CONVFMT, vp->fval); vp->sval = tostring(s); vp->tval &= ~DONTFREE; vp->tval |= STR; } dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", vp, vp->nval, vp->sval, vp->sval, vp->tval) ); return(vp->sval); } char *tostring(char *s) /* make a copy of string s */ { char *p; p = (char *) malloc(strlen(s)+1); if (p == NULL) FATAL("out of space in tostring on %s", s); strcpy(p, s); return(p); } char *qstring(char *s, int delim) /* collect string up to next delim */ { char *os = s; int c, n; char *buf, *bp; if ((buf = (char *) malloc(strlen(s)+3)) == NULL) FATAL( "out of space in qstring(%s)", s); for (bp = buf; (c = *s) != delim; s++) { if (c == '\n') SYNTAX( "newline in string %.20s...", os ); else if (c != '\\') *bp++ = c; else { /* \something */ c = *++s; if (c == 0) { /* \ at end */ *bp++ = '\\'; break; /* for loop */ } switch (c) { case '\\': *bp++ = '\\'; break; case 'n': *bp++ = '\n'; break; case 't': *bp++ = '\t'; break; case 'b': *bp++ = '\b'; break; case 'f': *bp++ = '\f'; break; case 'r': *bp++ = '\r'; break; default: if (!isdigit(c)) { *bp++ = c; break; } n = c - '0'; if (isdigit(s[1])) { n = 8 * n + *++s - '0'; if (isdigit(s[1])) n = 8 * n + *++s - '0'; } *bp++ = n; break; } } } *bp++ = 0; return buf; } 9base-6/awk/run.c0000644000175000017500000012344211402154555013306 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define DEBUG #include #include #include #include #include #include #include #include "awk.h" #include "y.tab.h" #define tempfree(x) if (istemp(x)) tfree(x); else /* #undef tempfree void tempfree(Cell *p) { if (p->ctype == OCELL && (p->csub < CUNK || p->csub > CFREE)) { WARNING("bad csub %d in Cell %d %s", p->csub, p->ctype, p->sval); } if (istemp(p)) tfree(p); } */ #ifdef _NFILE #ifndef FOPEN_MAX #define FOPEN_MAX _NFILE #endif #endif #ifndef FOPEN_MAX #define FOPEN_MAX 40 /* max number of open files */ #endif #ifndef RAND_MAX #define RAND_MAX 32767 /* all that ansi guarantees */ #endif jmp_buf env; extern int pairstack[]; Node *winner = NULL; /* root of parse tree */ Cell *tmps; /* free temporary cells for execution */ static Cell truecell ={ OBOOL, BTRUE, 0, 0, 1.0, NUM }; Cell *True = &truecell; static Cell falsecell ={ OBOOL, BFALSE, 0, 0, 0.0, NUM }; Cell *False = &falsecell; static Cell breakcell ={ OJUMP, JBREAK, 0, 0, 0.0, NUM }; Cell *jbreak = &breakcell; static Cell contcell ={ OJUMP, JCONT, 0, 0, 0.0, NUM }; Cell *jcont = &contcell; static Cell nextcell ={ OJUMP, JNEXT, 0, 0, 0.0, NUM }; Cell *jnext = &nextcell; static Cell nextfilecell ={ OJUMP, JNEXTFILE, 0, 0, 0.0, NUM }; Cell *jnextfile = &nextfilecell; static Cell exitcell ={ OJUMP, JEXIT, 0, 0, 0.0, NUM }; Cell *jexit = &exitcell; static Cell retcell ={ OJUMP, JRET, 0, 0, 0.0, NUM }; Cell *jret = &retcell; static Cell tempcell ={ OCELL, CTEMP, 0, "", 0.0, NUM|STR|DONTFREE }; Node *curnode = NULL; /* the node being executed, for debugging */ /* buffer memory management */ int adjbuf(char **pbuf, int *psiz, int minlen, int quantum, char **pbptr, char *whatrtn) /* pbuf: address of pointer to buffer being managed * psiz: address of buffer size variable * minlen: minimum length of buffer needed * quantum: buffer size quantum * pbptr: address of movable pointer into buffer, or 0 if none * whatrtn: name of the calling routine if failure should cause fatal error * * return 0 for realloc failure, !=0 for success */ { if (minlen > *psiz) { char *tbuf; int rminlen = quantum ? minlen % quantum : 0; int boff = pbptr ? *pbptr - *pbuf : 0; /* round up to next multiple of quantum */ if (rminlen) minlen += quantum - rminlen; tbuf = (char *) realloc(*pbuf, minlen); if (tbuf == NULL) { if (whatrtn) FATAL("out of memory in %s", whatrtn); return 0; } *pbuf = tbuf; *psiz = minlen; if (pbptr) *pbptr = tbuf + boff; } return 1; } void run(Node *a) /* execution of parse tree starts here */ { extern void stdinit(void); stdinit(); execute(a); closeall(); } Cell *execute(Node *u) /* execute a node of the parse tree */ { int nobj; Cell *(*proc)(Node **, int); Cell *x; Node *a; if (u == NULL) return(True); for (a = u; ; a = a->nnext) { curnode = a; if (isvalue(a)) { x = (Cell *) (a->narg[0]); if (isfld(x) && !donefld) fldbld(); else if (isrec(x) && !donerec) recbld(); return(x); } nobj = a->nobj; if (notlegal(nobj)) /* probably a Cell* but too risky to print */ FATAL("illegal statement"); proc = proctab[nobj-FIRSTTOKEN]; x = (*proc)(a->narg, nobj); if (isfld(x) && !donefld) fldbld(); else if (isrec(x) && !donerec) recbld(); if (isexpr(a)) return(x); if (isjump(x)) return(x); if (a->nnext == NULL) return(x); tempfree(x); } } Cell *program(Node **a, int n) /* execute an awk program */ { /* a[0] = BEGIN, a[1] = body, a[2] = END */ Cell *x; if (setjmp(env) != 0) goto ex; if (a[0]) { /* BEGIN */ x = execute(a[0]); if (isexit(x)) return(True); if (isjump(x)) FATAL("illegal break, continue, next or nextfile from BEGIN"); tempfree(x); } if (a[1] || a[2]) while (getrec(&record, &recsize, 1) > 0) { x = execute(a[1]); if (isexit(x)) break; tempfree(x); } ex: if (setjmp(env) != 0) /* handles exit within END */ goto ex1; if (a[2]) { /* END */ x = execute(a[2]); if (isbreak(x) || isnext(x) || iscont(x)) FATAL("illegal break, continue, next or nextfile from END"); tempfree(x); } ex1: return(True); } struct Frame { /* stack frame for awk function calls */ int nargs; /* number of arguments in this call */ Cell *fcncell; /* pointer to Cell for function */ Cell **args; /* pointer to array of arguments after execute */ Cell *retval; /* return value */ }; #define NARGS 50 /* max args in a call */ struct Frame *frame = NULL; /* base of stack frames; dynamically allocated */ int nframe = 0; /* number of frames allocated */ struct Frame *fp = NULL; /* frame pointer. bottom level unused */ Cell *call(Node **a, int n) /* function call. very kludgy and fragile */ { static Cell newcopycell = { OCELL, CCOPY, 0, "", 0.0, NUM|STR|DONTFREE }; int i, ncall, ndef; Node *x; Cell *args[NARGS], *oargs[NARGS]; /* BUG: fixed size arrays */ Cell *y, *z, *fcn; char *s; fcn = execute(a[0]); /* the function itself */ s = fcn->nval; if (!isfcn(fcn)) FATAL("calling undefined function %s", s); if (frame == NULL) { fp = frame = (struct Frame *) calloc(nframe += 100, sizeof(struct Frame)); if (frame == NULL) FATAL("out of space for stack frames calling %s", s); } for (ncall = 0, x = a[1]; x != NULL; x = x->nnext) /* args in call */ ncall++; ndef = (int) fcn->fval; /* args in defn */ dprintf( ("calling %s, %d args (%d in defn), fp=%d\n", s, ncall, ndef, (int) (fp-frame)) ); if (ncall > ndef) WARNING("function %s called with %d args, uses only %d", s, ncall, ndef); if (ncall + ndef > NARGS) FATAL("function %s has %d arguments, limit %d", s, ncall+ndef, NARGS); for (i = 0, x = a[1]; x != NULL; i++, x = x->nnext) { /* get call args */ dprintf( ("evaluate args[%d], fp=%d:\n", i, (int) (fp-frame)) ); y = execute(x); oargs[i] = y; dprintf( ("args[%d]: %s %f <%s>, t=%o\n", i, y->nval, y->fval, isarr(y) ? "(array)" : y->sval, y->tval) ); if (isfcn(y)) FATAL("can't use function %s as argument in %s", y->nval, s); if (isarr(y)) args[i] = y; /* arrays by ref */ else args[i] = copycell(y); tempfree(y); } for ( ; i < ndef; i++) { /* add null args for ones not provided */ args[i] = gettemp(); *args[i] = newcopycell; } fp++; /* now ok to up frame */ if (fp >= frame + nframe) { int dfp = fp - frame; /* old index */ frame = (struct Frame *) realloc((char *) frame, (nframe += 100) * sizeof(struct Frame)); if (frame == NULL) FATAL("out of space for stack frames in %s", s); fp = frame + dfp; } fp->fcncell = fcn; fp->args = args; fp->nargs = ndef; /* number defined with (excess are locals) */ fp->retval = gettemp(); dprintf( ("start exec of %s, fp=%d\n", s, (int) (fp-frame)) ); y = execute((Node *)(fcn->sval)); /* execute body */ dprintf( ("finished exec of %s, fp=%d\n", s, (int) (fp-frame)) ); for (i = 0; i < ndef; i++) { Cell *t = fp->args[i]; if (isarr(t)) { if (t->csub == CCOPY) { if (i >= ncall) { freesymtab(t); t->csub = CTEMP; tempfree(t); } else { oargs[i]->tval = t->tval; oargs[i]->tval &= ~(STR|NUM|DONTFREE); oargs[i]->sval = t->sval; tempfree(t); } } } else if (t != y) { /* kludge to prevent freeing twice */ t->csub = CTEMP; tempfree(t); } } tempfree(fcn); if (isexit(y) || isnext(y) || isnextfile(y)) return y; tempfree(y); /* this can free twice! */ z = fp->retval; /* return value */ dprintf( ("%s returns %g |%s| %o\n", s, getfval(z), getsval(z), z->tval) ); fp--; return(z); } Cell *copycell(Cell *x) /* make a copy of a cell in a temp */ { Cell *y; y = gettemp(); y->csub = CCOPY; /* prevents freeing until call is over */ y->nval = x->nval; /* BUG? */ y->sval = x->sval ? tostring(x->sval) : NULL; y->fval = x->fval; y->tval = x->tval & ~(CON|FLD|REC|DONTFREE); /* copy is not constant or field */ /* is DONTFREE right? */ return y; } Cell *arg(Node **a, int n) /* nth argument of a function */ { n = ptoi(a[0]); /* argument number, counting from 0 */ dprintf( ("arg(%d), fp->nargs=%d\n", n, fp->nargs) ); if (n+1 > fp->nargs) FATAL("argument #%d of function %s was not supplied", n+1, fp->fcncell->nval); return fp->args[n]; } Cell *jump(Node **a, int n) /* break, continue, next, nextfile, return */ { Cell *y; switch (n) { case EXIT: if (a[0] != NULL) { y = execute(a[0]); errorflag = (int) getfval(y); tempfree(y); } longjmp(env, 1); case RETURN: if (a[0] != NULL) { y = execute(a[0]); if ((y->tval & (STR|NUM)) == (STR|NUM)) { setsval(fp->retval, getsval(y)); fp->retval->fval = getfval(y); fp->retval->tval |= NUM; } else if (y->tval & STR) setsval(fp->retval, getsval(y)); else if (y->tval & NUM) setfval(fp->retval, getfval(y)); else /* can't happen */ FATAL("bad type variable %d", y->tval); tempfree(y); } return(jret); case NEXT: return(jnext); case NEXTFILE: nextfile(); return(jnextfile); case BREAK: return(jbreak); case CONTINUE: return(jcont); default: /* can't happen */ FATAL("illegal jump type %d", n); } return 0; /* not reached */ } Cell *getline(Node **a, int n) /* get next line from specific input */ { /* a[0] is variable, a[1] is operator, a[2] is filename */ Cell *r, *x; extern Cell **fldtab; FILE *fp; char *buf; int bufsize = recsize; int mode; if ((buf = (char *) malloc(bufsize)) == NULL) FATAL("out of memory in getline"); fflush(stdout); /* in case someone is waiting for a prompt */ r = gettemp(); if (a[1] != NULL) { /* getline < file */ x = execute(a[2]); /* filename */ mode = ptoi(a[1]); if (mode == '|') /* input pipe */ mode = LE; /* arbitrary flag */ fp = openfile(mode, getsval(x)); tempfree(x); if (fp == NULL) n = -1; else n = readrec(&buf, &bufsize, fp); if (n <= 0) { ; } else if (a[0] != NULL) { /* getline var sval)) { fldtab[0]->fval = atof(fldtab[0]->sval); fldtab[0]->tval |= NUM; } } } else { /* bare getline; use current input */ if (a[0] == NULL) /* getline */ n = getrec(&record, &recsize, 1); else { /* getline var */ n = getrec(&buf, &bufsize, 0); x = execute(a[0]); setsval(x, buf); tempfree(x); } } setfval(r, (Awkfloat) n); free(buf); return r; } Cell *getnf(Node **a, int n) /* get NF */ { if (donefld == 0) fldbld(); return (Cell *) a[0]; } Cell *array(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */ { Cell *x, *y, *z; char *s; Node *np; char *buf; int bufsz = recsize; int nsub = strlen(*SUBSEP); if ((buf = (char *) malloc(bufsz)) == NULL) FATAL("out of memory in array"); x = execute(a[0]); /* Cell* for symbol table */ buf[0] = 0; for (np = a[1]; np; np = np->nnext) { y = execute(np); /* subscript */ s = getsval(y); if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) FATAL("out of memory for %s[%s...]", x->nval, buf); strcat(buf, s); if (np->nnext) strcat(buf, *SUBSEP); tempfree(y); } if (!isarr(x)) { dprintf( ("making %s into an array\n", x->nval) ); if (freeable(x)) xfree(x->sval); x->tval &= ~(STR|NUM|DONTFREE); x->tval |= ARR; x->sval = (char *) makesymtab(NSYMTAB); } z = setsymtab(buf, "", 0.0, STR|NUM, (Array *) x->sval); z->ctype = OCELL; z->csub = CVAR; tempfree(x); free(buf); return(z); } Cell *awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */ { Cell *x, *y; Node *np; char *s; int nsub = strlen(*SUBSEP); x = execute(a[0]); /* Cell* for symbol table */ if (!isarr(x)) return True; if (a[1] == 0) { /* delete the elements, not the table */ freesymtab(x); x->tval &= ~STR; x->tval |= ARR; x->sval = (char *) makesymtab(NSYMTAB); } else { int bufsz = recsize; char *buf; if ((buf = (char *) malloc(bufsz)) == NULL) FATAL("out of memory in adelete"); buf[0] = 0; for (np = a[1]; np; np = np->nnext) { y = execute(np); /* subscript */ s = getsval(y); if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) FATAL("out of memory deleting %s[%s...]", x->nval, buf); strcat(buf, s); if (np->nnext) strcat(buf, *SUBSEP); tempfree(y); } freeelem(x, buf); free(buf); } tempfree(x); return True; } Cell *intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */ { Cell *x, *ap, *k; Node *p; char *buf; char *s; int bufsz = recsize; int nsub = strlen(*SUBSEP); ap = execute(a[1]); /* array name */ if (!isarr(ap)) { dprintf( ("making %s into an array\n", ap->nval) ); if (freeable(ap)) xfree(ap->sval); ap->tval &= ~(STR|NUM|DONTFREE); ap->tval |= ARR; ap->sval = (char *) makesymtab(NSYMTAB); } if ((buf = (char *) malloc(bufsz)) == NULL) { FATAL("out of memory in intest"); } buf[0] = 0; for (p = a[0]; p; p = p->nnext) { x = execute(p); /* expr */ s = getsval(x); if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) FATAL("out of memory deleting %s[%s...]", x->nval, buf); strcat(buf, s); tempfree(x); if (p->nnext) strcat(buf, *SUBSEP); } k = lookup(buf, (Array *) ap->sval); tempfree(ap); free(buf); if (k == NULL) return(False); else return(True); } Cell *matchop(Node **a, int n) /* ~ and match() */ { Cell *x, *y; char *s, *t; int i; void *p; x = execute(a[1]); /* a[1] = target text */ s = getsval(x); if (a[0] == 0) /* a[1] == 0: already-compiled reg expr */ p = (void *) a[2]; else { y = execute(a[2]); /* a[2] = regular expr */ t = getsval(y); p = compre(t); tempfree(y); } if (n == MATCHFCN) i = pmatch(p, s, s); else i = match(p, s, s); tempfree(x); if (n == MATCHFCN) { int start = countposn(s, patbeg-s)+1; if (patlen < 0) start = 0; setfval(rstartloc, (Awkfloat) start); setfval(rlengthloc, (Awkfloat) countposn(patbeg, patlen)); x = gettemp(); x->tval = NUM; x->fval = start; return x; } else if ((n == MATCH && i == 1) || (n == NOTMATCH && i == 0)) return(True); else return(False); } Cell *boolop(Node **a, int n) /* a[0] || a[1], a[0] && a[1], !a[0] */ { Cell *x, *y; int i; x = execute(a[0]); i = istrue(x); tempfree(x); switch (n) { case BOR: if (i) return(True); y = execute(a[1]); i = istrue(y); tempfree(y); if (i) return(True); else return(False); case AND: if ( !i ) return(False); y = execute(a[1]); i = istrue(y); tempfree(y); if (i) return(True); else return(False); case NOT: if (i) return(False); else return(True); default: /* can't happen */ FATAL("unknown boolean operator %d", n); } return 0; /*NOTREACHED*/ } Cell *relop(Node **a, int n) /* a[0 < a[1], etc. */ { int i; Cell *x, *y; Awkfloat j; x = execute(a[0]); y = execute(a[1]); if (x->tval&NUM && y->tval&NUM) { j = x->fval - y->fval; i = j<0? -1: (j>0? 1: 0); } else { i = strcmp(getsval(x), getsval(y)); } tempfree(x); tempfree(y); switch (n) { case LT: if (i<0) return(True); else return(False); case LE: if (i<=0) return(True); else return(False); case NE: if (i!=0) return(True); else return(False); case EQ: if (i == 0) return(True); else return(False); case GE: if (i>=0) return(True); else return(False); case GT: if (i>0) return(True); else return(False); default: /* can't happen */ FATAL("unknown relational operator %d", n); } return 0; /*NOTREACHED*/ } void tfree(Cell *a) /* free a tempcell */ { if (freeable(a)) { dprintf( ("freeing %s %s %o\n", a->nval, a->sval, a->tval) ); xfree(a->sval); } if (a == tmps) FATAL("tempcell list is curdled"); a->cnext = tmps; tmps = a; } Cell *gettemp(void) /* get a tempcell */ { int i; Cell *x; if (!tmps) { tmps = (Cell *) calloc(100, sizeof(Cell)); if (!tmps) FATAL("out of space for temporaries"); for(i = 1; i < 100; i++) tmps[i-1].cnext = &tmps[i]; tmps[i-1].cnext = 0; } x = tmps; tmps = x->cnext; *x = tempcell; return(x); } Cell *indirect(Node **a, int n) /* $( a[0] ) */ { Cell *x; int m; char *s; x = execute(a[0]); m = (int) getfval(x); if (m == 0 && !is_number(s = getsval(x))) /* suspicion! */ FATAL("illegal field $(%s), name \"%s\"", s, x->nval); /* BUG: can x->nval ever be null??? */ tempfree(x); x = fieldadr(m); x->ctype = OCELL; /* BUG? why are these needed? */ x->csub = CFLD; return(x); } Cell *substr(Node **a, int nnn) /* substr(a[0], a[1], a[2]) */ { int k, m, n; char *s, *p; int temp; Cell *x, *y, *z = 0; x = execute(a[0]); y = execute(a[1]); if (a[2] != 0) z = execute(a[2]); s = getsval(x); k = countposn(s, strlen(s)) + 1; if (k <= 1) { tempfree(x); tempfree(y); if (a[2] != 0) tempfree(z); x = gettemp(); setsval(x, ""); return(x); } m = (int) getfval(y); if (m <= 0) m = 1; else if (m > k) m = k; tempfree(y); if (a[2] != 0) { n = (int) getfval(z); tempfree(z); } else n = k - 1; if (n < 0) n = 0; else if (n > k - m) n = k - m; dprintf( ("substr: m=%d, n=%d, s=%s\n", m, n, s) ); y = gettemp(); while (*s && --m) s += mblen(s, k); for (p = s; *p && n--; p += mblen(p, k)) ; temp = *p; /* with thanks to John Linderman */ *p = '\0'; setsval(y, s); *p = temp; tempfree(x); return(y); } Cell *sindex(Node **a, int nnn) /* index(a[0], a[1]) */ { Cell *x, *y, *z; char *s1, *s2, *p1, *p2, *q; Awkfloat v = 0.0; x = execute(a[0]); s1 = getsval(x); y = execute(a[1]); s2 = getsval(y); z = gettemp(); for (p1 = s1; *p1 != '\0'; p1++) { for (q=p1, p2=s2; *p2 != '\0' && *q == *p2; q++, p2++) ; if (*p2 == '\0') { v = (Awkfloat) countposn(s1, p1-s1) + 1; /* origin 1 */ break; } } tempfree(x); tempfree(y); setfval(z, v); return(z); } #define MAXNUMSIZE 50 int format(char **pbuf, int *pbufsize, char *s, Node *a) /* printf-like conversions */ { char *fmt; char *p, *t, *os; Cell *x; int flag = 0, n; int fmtwd; /* format width */ int fmtsz = recsize; char *buf = *pbuf; int bufsize = *pbufsize; os = s; p = buf; if ((fmt = (char *) malloc(fmtsz)) == NULL) FATAL("out of memory in format()"); while (*s) { adjbuf(&buf, &bufsize, MAXNUMSIZE+1+p-buf, recsize, &p, "format"); if (*s != '%') { *p++ = *s++; continue; } if (*(s+1) == '%') { *p++ = '%'; s += 2; continue; } /* have to be real careful in case this is a huge number, eg, %100000d */ fmtwd = atoi(s+1); if (fmtwd < 0) fmtwd = -fmtwd; adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); for (t = fmt; (*t++ = *s) != '\0'; s++) { if (!adjbuf(&fmt, &fmtsz, MAXNUMSIZE+1+t-fmt, recsize, &t, 0)) FATAL("format item %.30s... ran format() out of memory", os); if (isalpha(*s) && *s != 'l' && *s != 'h' && *s != 'L') break; /* the ansi panoply */ if (*s == '*') { x = execute(a); a = a->nnext; sprintf(t-1, "%d", fmtwd=(int) getfval(x)); if (fmtwd < 0) fmtwd = -fmtwd; adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); t = fmt + strlen(fmt); tempfree(x); } } *t = '\0'; if (fmtwd < 0) fmtwd = -fmtwd; adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); switch (*s) { case 'f': case 'e': case 'g': case 'E': case 'G': flag = 1; break; case 'd': case 'i': flag = 2; if(*(s-1) == 'l') break; *(t-1) = 'l'; *t = 'd'; *++t = '\0'; break; case 'o': case 'x': case 'X': case 'u': flag = *(s-1) == 'l' ? 2 : 3; break; case 's': flag = 4; break; case 'c': flag = 5; break; default: WARNING("weird printf conversion %s", fmt); flag = 0; break; } if (a == NULL) FATAL("not enough args in printf(%s)", os); x = execute(a); a = a->nnext; n = MAXNUMSIZE; if (fmtwd > n) n = fmtwd; adjbuf(&buf, &bufsize, 1+n+p-buf, recsize, &p, "format"); switch (flag) { case 0: sprintf(p, "%s", fmt); /* unknown, so dump it too */ t = getsval(x); n = strlen(t); if (fmtwd > n) n = fmtwd; adjbuf(&buf, &bufsize, 1+strlen(p)+n+p-buf, recsize, &p, "format"); p += strlen(p); sprintf(p, "%s", t); break; case 1: sprintf(p, fmt, getfval(x)); break; case 2: sprintf(p, fmt, (long) getfval(x)); break; case 3: sprintf(p, fmt, (int) getfval(x)); break; case 4: t = getsval(x); n = strlen(t); if (fmtwd > n) n = fmtwd; if (!adjbuf(&buf, &bufsize, 1+n+p-buf, recsize, &p, 0)) FATAL("huge string/format (%d chars) in printf %.30s... ran format() out of memory", n, t); sprintf(p, fmt, t); break; case 5: if (isnum(x)) { if (getfval(x)) sprintf(p, fmt, (int) getfval(x)); else{ *p++ = '\0'; *p = '\0'; } } else sprintf(p, fmt, getsval(x)[0]); break; } tempfree(x); p += strlen(p); s++; } *p = '\0'; free(fmt); for ( ; a; a = a->nnext) /* evaluate any remaining args */ execute(a); *pbuf = buf; *pbufsize = bufsize; return p - buf; } Cell *awksprintf(Node **a, int n) /* sprintf(a[0]) */ { Cell *x; Node *y; char *buf; int bufsz=3*recsize; if ((buf = (char *) malloc(bufsz)) == NULL) FATAL("out of memory in awksprintf"); y = a[0]->nnext; x = execute(a[0]); if (format(&buf, &bufsz, getsval(x), y) == -1) FATAL("sprintf string %.30s... too long. can't happen.", buf); tempfree(x); x = gettemp(); x->sval = buf; x->tval = STR; return(x); } Cell *awkprintf(Node **a, int n) /* printf */ { /* a[0] is list of args, starting with format string */ /* a[1] is redirection operator, a[2] is redirection file */ FILE *fp; Cell *x; Node *y; char *buf; int len; int bufsz=3*recsize; if ((buf = (char *) malloc(bufsz)) == NULL) FATAL("out of memory in awkprintf"); y = a[0]->nnext; x = execute(a[0]); if ((len = format(&buf, &bufsz, getsval(x), y)) == -1) FATAL("printf string %.30s... too long. can't happen.", buf); tempfree(x); if (a[1] == NULL) { /* fputs(buf, stdout); */ fwrite(buf, len, 1, stdout); if (ferror(stdout)) FATAL("write error on stdout"); } else { fp = redirect(ptoi(a[1]), a[2]); /* fputs(buf, fp); */ fwrite(buf, len, 1, fp); fflush(fp); if (ferror(fp)) FATAL("write error on %s", filename(fp)); } free(buf); return(True); } Cell *arith(Node **a, int n) /* a[0] + a[1], etc. also -a[0] */ { Awkfloat i, j = 0; double v; Cell *x, *y, *z; x = execute(a[0]); i = getfval(x); tempfree(x); if (n != UMINUS) { y = execute(a[1]); j = getfval(y); tempfree(y); } z = gettemp(); switch (n) { case ADD: i += j; break; case MINUS: i -= j; break; case MULT: i *= j; break; case DIVIDE: if (j == 0) FATAL("division by zero"); i /= j; break; case MOD: if (j == 0) FATAL("division by zero in mod"); modf(i/j, &v); i = i - j * v; break; case UMINUS: i = -i; break; case POWER: if (j >= 0 && modf(j, &v) == 0.0) /* pos integer exponent */ i = ipow(i, (int) j); else i = errcheck(pow(i, j), "pow"); break; default: /* can't happen */ FATAL("illegal arithmetic operator %d", n); } setfval(z, i); return(z); } double ipow(double x, int n) /* x**n. ought to be done by pow, but isn't always */ { double v; if (n <= 0) return 1; v = ipow(x, n/2); if (n % 2 == 0) return v * v; else return x * v * v; } Cell *incrdecr(Node **a, int n) /* a[0]++, etc. */ { Cell *x, *z; int k; Awkfloat xf; x = execute(a[0]); xf = getfval(x); k = (n == PREINCR || n == POSTINCR) ? 1 : -1; if (n == PREINCR || n == PREDECR) { setfval(x, xf + k); return(x); } z = gettemp(); setfval(z, xf); setfval(x, xf + k); tempfree(x); return(z); } Cell *assign(Node **a, int n) /* a[0] = a[1], a[0] += a[1], etc. */ { /* this is subtle; don't muck with it. */ Cell *x, *y; Awkfloat xf, yf; double v; y = execute(a[1]); x = execute(a[0]); if (n == ASSIGN) { /* ordinary assignment */ if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */ ; /* leave alone unless it's a field */ else if ((y->tval & (STR|NUM)) == (STR|NUM)) { setsval(x, getsval(y)); x->fval = getfval(y); x->tval |= NUM; } else if (isstr(y)) setsval(x, getsval(y)); else if (isnum(y)) setfval(x, getfval(y)); else funnyvar(y, "read value of"); tempfree(y); return(x); } xf = getfval(x); yf = getfval(y); switch (n) { case ADDEQ: xf += yf; break; case SUBEQ: xf -= yf; break; case MULTEQ: xf *= yf; break; case DIVEQ: if (yf == 0) FATAL("division by zero in /="); xf /= yf; break; case MODEQ: if (yf == 0) FATAL("division by zero in %%="); modf(xf/yf, &v); xf = xf - yf * v; break; case POWEQ: if (yf >= 0 && modf(yf, &v) == 0.0) /* pos integer exponent */ xf = ipow(xf, (int) yf); else xf = errcheck(pow(xf, yf), "pow"); break; default: FATAL("illegal assignment operator %d", n); break; } tempfree(y); setfval(x, xf); return(x); } Cell *cat(Node **a, int q) /* a[0] cat a[1] */ { Cell *x, *y, *z; int n1, n2; char *s; x = execute(a[0]); y = execute(a[1]); getsval(x); getsval(y); n1 = strlen(x->sval); n2 = strlen(y->sval); s = (char *) malloc(n1 + n2 + 1); if (s == NULL) FATAL("out of space concatenating %.15s... and %.15s...", x->sval, y->sval); strcpy(s, x->sval); strcpy(s+n1, y->sval); tempfree(y); z = gettemp(); z->sval = s; z->tval = STR; tempfree(x); return(z); } Cell *pastat(Node **a, int n) /* a[0] { a[1] } */ { Cell *x; if (a[0] == 0) x = execute(a[1]); else { x = execute(a[0]); if (istrue(x)) { tempfree(x); x = execute(a[1]); } } return x; } Cell *dopa2(Node **a, int n) /* a[0], a[1] { a[2] } */ { Cell *x; int pair; pair = ptoi(a[3]); if (pairstack[pair] == 0) { x = execute(a[0]); if (istrue(x)) pairstack[pair] = 1; tempfree(x); } if (pairstack[pair] == 1) { x = execute(a[1]); if (istrue(x)) pairstack[pair] = 0; tempfree(x); x = execute(a[2]); return(x); } return(False); } Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */ { Cell *x = 0, *y, *ap; char *s; int sep; char *t, temp, num[50], *fs = 0; int n, arg3type; y = execute(a[0]); /* source string */ s = getsval(y); arg3type = ptoi(a[3]); if (a[2] == 0) /* fs string */ fs = *FS; else if (arg3type == STRING) { /* split(str,arr,"string") */ x = execute(a[2]); fs = getsval(x); } else if (arg3type == REGEXPR) fs = "(regexpr)"; /* split(str,arr,/regexpr/) */ else FATAL("illegal type of split"); sep = *fs; ap = execute(a[1]); /* array name */ freesymtab(ap); dprintf( ("split: s=|%s|, a=%s, sep=|%s|\n", s, ap->nval, fs) ); ap->tval &= ~STR; ap->tval |= ARR; ap->sval = (char *) makesymtab(NSYMTAB); n = 0; if ((*s != '\0' && strlen(fs) > 1) || arg3type == REGEXPR) { /* reg expr */ void *p; if (arg3type == REGEXPR) { /* it's ready already */ p = (void *) a[2]; } else { p = compre(fs); } t = s; if (nematch(p,s,t)) { do { n++; sprintf(num, "%d", n); temp = *patbeg; *patbeg = '\0'; if (is_number(t)) setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); else setsymtab(num, t, 0.0, STR, (Array *) ap->sval); *patbeg = temp; t = patbeg + patlen; if (t[-1] == 0 || *t == 0) { n++; sprintf(num, "%d", n); setsymtab(num, "", 0.0, STR, (Array *) ap->sval); goto spdone; } } while (nematch(p,s,t)); } n++; sprintf(num, "%d", n); if (is_number(t)) setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); else setsymtab(num, t, 0.0, STR, (Array *) ap->sval); spdone: p = NULL; } else if (sep == ' ') { for (n = 0; ; ) { while (*s == ' ' || *s == '\t' || *s == '\n') s++; if (*s == 0) break; n++; t = s; do s++; while (*s!=' ' && *s!='\t' && *s!='\n' && *s!='\0'); temp = *s; *s = '\0'; sprintf(num, "%d", n); if (is_number(t)) setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); else setsymtab(num, t, 0.0, STR, (Array *) ap->sval); *s = temp; if (*s != 0) s++; } } else if (sep == 0) { /* new: split(s, a, "") => 1 char/elem */ for (n = 0; *s != 0; s++) { char buf[2]; n++; sprintf(num, "%d", n); buf[0] = *s; buf[1] = 0; if (isdigit(buf[0])) setsymtab(num, buf, atof(buf), STR|NUM, (Array *) ap->sval); else setsymtab(num, buf, 0.0, STR, (Array *) ap->sval); } } else if (*s != 0) { for (;;) { n++; t = s; while (*s != sep && *s != '\n' && *s != '\0') s++; temp = *s; *s = '\0'; sprintf(num, "%d", n); if (is_number(t)) setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); else setsymtab(num, t, 0.0, STR, (Array *) ap->sval); *s = temp; if (*s++ == 0) break; } } tempfree(ap); tempfree(y); if (a[2] != 0 && arg3type == STRING) tempfree(x); x = gettemp(); x->tval = NUM; x->fval = n; return(x); } Cell *condexpr(Node **a, int n) /* a[0] ? a[1] : a[2] */ { Cell *x; x = execute(a[0]); if (istrue(x)) { tempfree(x); x = execute(a[1]); } else { tempfree(x); x = execute(a[2]); } return(x); } Cell *ifstat(Node **a, int n) /* if (a[0]) a[1]; else a[2] */ { Cell *x; x = execute(a[0]); if (istrue(x)) { tempfree(x); x = execute(a[1]); } else if (a[2] != 0) { tempfree(x); x = execute(a[2]); } return(x); } Cell *whilestat(Node **a, int n) /* while (a[0]) a[1] */ { Cell *x; for (;;) { x = execute(a[0]); if (!istrue(x)) return(x); tempfree(x); x = execute(a[1]); if (isbreak(x)) { x = True; return(x); } if (isnext(x) || isexit(x) || isret(x)) return(x); tempfree(x); } } Cell *dostat(Node **a, int n) /* do a[0]; while(a[1]) */ { Cell *x; for (;;) { x = execute(a[0]); if (isbreak(x)) return True; if (isnext(x) || isnextfile(x) || isexit(x) || isret(x)) return(x); tempfree(x); x = execute(a[1]); if (!istrue(x)) return(x); tempfree(x); } } Cell *forstat(Node **a, int n) /* for (a[0]; a[1]; a[2]) a[3] */ { Cell *x; x = execute(a[0]); tempfree(x); for (;;) { if (a[1]!=0) { x = execute(a[1]); if (!istrue(x)) return(x); else tempfree(x); } x = execute(a[3]); if (isbreak(x)) /* turn off break */ return True; if (isnext(x) || isexit(x) || isret(x)) return(x); tempfree(x); x = execute(a[2]); tempfree(x); } } Cell *instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */ { Cell *x, *vp, *arrayp, *cp, *ncp; Array *tp; int i; vp = execute(a[0]); arrayp = execute(a[1]); if (!isarr(arrayp)) { return True; } tp = (Array *) arrayp->sval; tempfree(arrayp); for (i = 0; i < tp->size; i++) { /* this routine knows too much */ for (cp = tp->tab[i]; cp != NULL; cp = ncp) { setsval(vp, cp->nval); ncp = cp->cnext; x = execute(a[2]); if (isbreak(x)) { tempfree(vp); return True; } if (isnext(x) || isexit(x) || isret(x)) { tempfree(vp); return(x); } tempfree(x); } } return True; } Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg list */ { Cell *x, *y; Awkfloat u; int t; wchar_t wc; char *p, *buf; char mbc[50]; Node *nextarg; FILE *fp; t = ptoi(a[0]); x = execute(a[1]); nextarg = a[1]->nnext; switch (t) { case FLENGTH: p = getsval(x); u = (Awkfloat) countposn(p, strlen(p)); break; case FLOG: u = errcheck(log(getfval(x)), "log"); break; case FINT: modf(getfval(x), &u); break; case FEXP: u = errcheck(exp(getfval(x)), "exp"); break; case FSQRT: u = errcheck(sqrt(getfval(x)), "sqrt"); break; case FSIN: u = sin(getfval(x)); break; case FCOS: u = cos(getfval(x)); break; case FATAN: if (nextarg == 0) { WARNING("atan2 requires two arguments; returning 1.0"); u = 1.0; } else { y = execute(a[1]->nnext); u = atan2(getfval(x), getfval(y)); tempfree(y); nextarg = nextarg->nnext; } break; case FSYSTEM: fflush(stdout); /* in case something is buffered already */ u = (Awkfloat) system(getsval(x)) / 256; /* 256 is unix-dep */ break; case FRAND: /* in principle, rand() returns something in 0..RAND_MAX */ u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX; break; case FSRAND: if (isrec(x)) /* no argument provided */ u = time((time_t *)0); else u = getfval(x); srand((unsigned int) u); break; case FTOUPPER: case FTOLOWER: buf = tostring(getsval(x)); if (t == FTOUPPER) { for (p = buf; *p; p++) if (islower(*p)) *p = toupper(*p); } else { for (p = buf; *p; p++) if (isupper(*p)) *p = tolower(*p); } tempfree(x); x = gettemp(); setsval(x, buf); free(buf); return x; case FFLUSH: if ((fp = openfile(FFLUSH, getsval(x))) == NULL) u = EOF; else u = fflush(fp); break; case FUTF: wc = (int)getfval(x); mbc[wctomb(mbc, wc)] = 0; tempfree(x); x = gettemp(); setsval(x, mbc); return x; default: /* can't happen */ FATAL("illegal function type %d", t); break; } tempfree(x); x = gettemp(); setfval(x, u); if (nextarg != 0) { WARNING("warning: function has too many arguments"); for ( ; nextarg; nextarg = nextarg->nnext) execute(nextarg); } return(x); } Cell *printstat(Node **a, int n) /* print a[0] */ { int r; Node *x; Cell *y; FILE *fp; if (a[1] == 0) /* a[1] is redirection operator, a[2] is file */ fp = stdout; else fp = redirect(ptoi(a[1]), a[2]); for (x = a[0]; x != NULL; x = x->nnext) { y = execute(x); fputs(getsval(y), fp); tempfree(y); if (x->nnext == NULL) r = fputs(*ORS, fp); else r = fputs(*OFS, fp); if (r == EOF) FATAL("write error on %s", filename(fp)); } if (a[1] != 0) if (fflush(fp) == EOF) FATAL("write error on %s", filename(fp)); return(True); } Cell *nullproc(Node **a, int n) { n = n; a = a; return 0; } FILE *redirect(int a, Node *b) /* set up all i/o redirections */ { FILE *fp; Cell *x; char *fname; x = execute(b); fname = getsval(x); fp = openfile(a, fname); if (fp == NULL) FATAL("can't open file %s", fname); tempfree(x); return fp; } struct files { FILE *fp; char *fname; int mode; /* '|', 'a', 'w' => LE/LT, GT */ } files[FOPEN_MAX] ={ { NULL, "/dev/stdin", LT }, /* watch out: don't free this! */ { NULL, "/dev/stdout", GT }, { NULL, "/dev/stderr", GT } }; void stdinit(void) /* in case stdin, etc., are not constants */ { files[0].fp = stdin; files[1].fp = stdout; files[2].fp = stderr; } FILE *openfile(int a, char *us) { char *s = us; int i, m; FILE *fp = 0; if (*s == '\0') FATAL("null file name in print or getline"); for (i=0; i < FOPEN_MAX; i++) if (files[i].fname && strcmp(s, files[i].fname) == 0) { if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) return files[i].fp; if (a == FFLUSH) return files[i].fp; } if (a == FFLUSH) /* didn't find it, so don't create it! */ return NULL; for (i=0; i < FOPEN_MAX; i++) if (files[i].fp == 0) break; if (i >= FOPEN_MAX) FATAL("%s makes too many open files", s); fflush(stdout); /* force a semblance of order */ m = a; if (a == GT) { fp = fopen(s, "w"); } else if (a == APPEND) { fp = fopen(s, "a"); m = GT; /* so can mix > and >> */ } else if (a == '|') { /* output pipe */ fp = popen(s, "w"); } else if (a == LE) { /* input pipe */ fp = popen(s, "r"); } else if (a == LT) { /* getline sval, files[i].fname) == 0) { if (ferror(files[i].fp)) WARNING( "i/o error occurred on %s", files[i].fname ); if (files[i].mode == '|' || files[i].mode == LE) stat = pclose(files[i].fp); else stat = fclose(files[i].fp); if (stat == EOF) WARNING( "i/o error occurred closing %s", files[i].fname ); if (i > 2) /* don't do /dev/std... */ xfree(files[i].fname); files[i].fname = NULL; /* watch out for ref thru this */ files[i].fp = NULL; } tempfree(x); return(True); } void closeall(void) { int i, stat; for (i = 0; i < FOPEN_MAX; i++) if (files[i].fp) { if (ferror(files[i].fp)) WARNING( "i/o error occurred on %s", files[i].fname ); if (files[i].mode == '|' || files[i].mode == LE) stat = pclose(files[i].fp); else stat = fclose(files[i].fp); if (stat == EOF) WARNING( "i/o error occurred while closing %s", files[i].fname ); } } void backsub(char **pb_ptr, char **sptr_ptr); Cell *sub(Node **a, int nnn) /* substitute command */ { char *sptr, *pb, *q; Cell *x, *y, *result; char *t, *buf; void *p; int bufsz = recsize; if ((buf = (char *) malloc(bufsz)) == NULL) FATAL("out of memory in sub"); x = execute(a[3]); /* target string */ t = getsval(x); if (a[0] == 0) /* 0 => a[1] is already-compiled regexpr */ p = (void *) a[1]; /* regular expression */ else { y = execute(a[1]); p = compre(getsval(y)); tempfree(y); } y = execute(a[2]); /* replacement string */ result = False; if (pmatch(p, t, t)) { sptr = t; adjbuf(&buf, &bufsz, 1+patbeg-sptr, recsize, 0, "sub"); pb = buf; while (sptr < patbeg) *pb++ = *sptr++; sptr = getsval(y); while (*sptr != 0) { adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "sub"); if (*sptr == '\\') { backsub(&pb, &sptr); } else if (*sptr == '&') { sptr++; adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "sub"); for (q = patbeg; q < patbeg+patlen; ) *pb++ = *q++; } else *pb++ = *sptr++; } *pb = '\0'; if (pb > buf + bufsz) FATAL("sub result1 %.30s too big; can't happen", buf); sptr = patbeg + patlen; if ((patlen == 0 && *patbeg) || (patlen && *(sptr-1))) { adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "sub"); while ((*pb++ = *sptr++) != 0) ; } if (pb > buf + bufsz) FATAL("sub result2 %.30s too big; can't happen", buf); setsval(x, buf); /* BUG: should be able to avoid copy */ result = True;; } tempfree(x); tempfree(y); free(buf); return result; } Cell *gsub(Node **a, int nnn) /* global substitute */ { Cell *x, *y; char *rptr, *sptr, *t, *pb, *c; char *buf; void *p; int mflag, num; int bufsz = recsize; if ((buf = (char *)malloc(bufsz)) == NULL) FATAL("out of memory in gsub"); mflag = 0; /* if mflag == 0, can replace empty string */ num = 0; x = execute(a[3]); /* target string */ c = t = getsval(x); if (a[0] == 0) /* 0 => a[1] is already-compiled regexpr */ p = (void *) a[1]; /* regular expression */ else { y = execute(a[1]); p = compre(getsval(y)); tempfree(y); } y = execute(a[2]); /* replacement string */ if (pmatch(p, t, c)) { pb = buf; rptr = getsval(y); do { if (patlen == 0 && *patbeg != 0) { /* matched empty string */ if (mflag == 0) { /* can replace empty */ num++; sptr = rptr; while (*sptr != 0) { adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub"); if (*sptr == '\\') { backsub(&pb, &sptr); } else if (*sptr == '&') { char *q; sptr++; adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "gsub"); for (q = patbeg; q < patbeg+patlen; ) *pb++ = *q++; } else *pb++ = *sptr++; } } if (*c == 0) /* at end */ goto done; adjbuf(&buf, &bufsz, 2+pb-buf, recsize, &pb, "gsub"); *pb++ = *c++; if (pb > buf + bufsz) /* BUG: not sure of this test */ FATAL("gsub result0 %.30s too big; can't happen", buf); mflag = 0; } else { /* matched nonempty string */ num++; sptr = c; adjbuf(&buf, &bufsz, 1+(patbeg-sptr)+pb-buf, recsize, &pb, "gsub"); while (sptr < patbeg) *pb++ = *sptr++; sptr = rptr; while (*sptr != 0) { adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub"); if (*sptr == '\\') { backsub(&pb, &sptr); } else if (*sptr == '&') { char *q; sptr++; adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "gsub"); for (q = patbeg; q < patbeg+patlen; ) *pb++ = *q++; } else *pb++ = *sptr++; } c = patbeg + patlen; if ((c[-1] == 0) || (*c == 0)) goto done; if (pb > buf + bufsz) FATAL("gsub result1 %.30s too big; can't happen", buf); mflag = 1; } } while (pmatch(p, t, c)); sptr = c; adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "gsub"); while ((*pb++ = *sptr++) != 0) ; done: if (pb > buf + bufsz) FATAL("gsub result2 %.30s too big; can't happen", buf); *pb = '\0'; setsval(x, buf); /* BUG: should be able to avoid copy + free */ } tempfree(x); tempfree(y); x = gettemp(); x->tval = NUM; x->fval = num; free(buf); return(x); } void backsub(char **pb_ptr, char **sptr_ptr) /* handle \\& variations */ { /* sptr[0] == '\\' */ char *pb = *pb_ptr, *sptr = *sptr_ptr; if (sptr[1] == '\\') { if (sptr[2] == '\\' && sptr[3] == '&') { /* \\\& -> \& */ *pb++ = '\\'; *pb++ = '&'; sptr += 4; } else if (sptr[2] == '&') { /* \\& -> \ + matched */ *pb++ = '\\'; sptr += 2; } else { /* \\x -> \\x */ *pb++ = *sptr++; *pb++ = *sptr++; } } else if (sptr[1] == '&') { /* literal & */ sptr++; *pb++ = *sptr++; } else /* literal \ */ *pb++ = *sptr++; *pb_ptr = pb; *sptr_ptr = sptr; } 9base-6/awk/proctab.c0000644000175000017500000001202511402154555014126 0ustar anselmanselm#include #include #include "awk.h" #include "y.tab.h" static char *printname[92] = { (char *) "FIRSTTOKEN", /* 57346 */ (char *) "PROGRAM", /* 57347 */ (char *) "PASTAT", /* 57348 */ (char *) "PASTAT2", /* 57349 */ (char *) "XBEGIN", /* 57350 */ (char *) "XEND", /* 57351 */ (char *) "NL", /* 57352 */ (char *) "ARRAY", /* 57353 */ (char *) "MATCH", /* 57354 */ (char *) "NOTMATCH", /* 57355 */ (char *) "MATCHOP", /* 57356 */ (char *) "FINAL", /* 57357 */ (char *) "DOT", /* 57358 */ (char *) "ALL", /* 57359 */ (char *) "CCL", /* 57360 */ (char *) "NCCL", /* 57361 */ (char *) "CHAR", /* 57362 */ (char *) "OR", /* 57363 */ (char *) "STAR", /* 57364 */ (char *) "QUEST", /* 57365 */ (char *) "PLUS", /* 57366 */ (char *) "AND", /* 57367 */ (char *) "BOR", /* 57368 */ (char *) "APPEND", /* 57369 */ (char *) "EQ", /* 57370 */ (char *) "GE", /* 57371 */ (char *) "GT", /* 57372 */ (char *) "LE", /* 57373 */ (char *) "LT", /* 57374 */ (char *) "NE", /* 57375 */ (char *) "IN", /* 57376 */ (char *) "ARG", /* 57377 */ (char *) "BLTIN", /* 57378 */ (char *) "BREAK", /* 57379 */ (char *) "CLOSE", /* 57380 */ (char *) "CONTINUE", /* 57381 */ (char *) "DELETE", /* 57382 */ (char *) "DO", /* 57383 */ (char *) "EXIT", /* 57384 */ (char *) "FOR", /* 57385 */ (char *) "FUNC", /* 57386 */ (char *) "SUB", /* 57387 */ (char *) "GSUB", /* 57388 */ (char *) "IF", /* 57389 */ (char *) "INDEX", /* 57390 */ (char *) "LSUBSTR", /* 57391 */ (char *) "MATCHFCN", /* 57392 */ (char *) "NEXT", /* 57393 */ (char *) "NEXTFILE", /* 57394 */ (char *) "ADD", /* 57395 */ (char *) "MINUS", /* 57396 */ (char *) "MULT", /* 57397 */ (char *) "DIVIDE", /* 57398 */ (char *) "MOD", /* 57399 */ (char *) "ASSIGN", /* 57400 */ (char *) "ASGNOP", /* 57401 */ (char *) "ADDEQ", /* 57402 */ (char *) "SUBEQ", /* 57403 */ (char *) "MULTEQ", /* 57404 */ (char *) "DIVEQ", /* 57405 */ (char *) "MODEQ", /* 57406 */ (char *) "POWEQ", /* 57407 */ (char *) "PRINT", /* 57408 */ (char *) "PRINTF", /* 57409 */ (char *) "SPRINTF", /* 57410 */ (char *) "ELSE", /* 57411 */ (char *) "INTEST", /* 57412 */ (char *) "CONDEXPR", /* 57413 */ (char *) "POSTINCR", /* 57414 */ (char *) "PREINCR", /* 57415 */ (char *) "POSTDECR", /* 57416 */ (char *) "PREDECR", /* 57417 */ (char *) "VAR", /* 57418 */ (char *) "IVAR", /* 57419 */ (char *) "VARNF", /* 57420 */ (char *) "CALL", /* 57421 */ (char *) "NUMBER", /* 57422 */ (char *) "STRING", /* 57423 */ (char *) "REGEXPR", /* 57424 */ (char *) "GETLINE", /* 57425 */ (char *) "RETURN", /* 57426 */ (char *) "SPLIT", /* 57427 */ (char *) "SUBSTR", /* 57428 */ (char *) "WHILE", /* 57429 */ (char *) "CAT", /* 57430 */ (char *) "NOT", /* 57431 */ (char *) "UMINUS", /* 57432 */ (char *) "POWER", /* 57433 */ (char *) "DECR", /* 57434 */ (char *) "INCR", /* 57435 */ (char *) "INDIRECT", /* 57436 */ (char *) "LASTTOKEN", /* 57437 */ }; Cell *(*proctab[92])(Node **, int) = { nullproc, /* FIRSTTOKEN */ program, /* PROGRAM */ pastat, /* PASTAT */ dopa2, /* PASTAT2 */ nullproc, /* XBEGIN */ nullproc, /* XEND */ nullproc, /* NL */ array, /* ARRAY */ matchop, /* MATCH */ matchop, /* NOTMATCH */ nullproc, /* MATCHOP */ nullproc, /* FINAL */ nullproc, /* DOT */ nullproc, /* ALL */ nullproc, /* CCL */ nullproc, /* NCCL */ nullproc, /* CHAR */ nullproc, /* OR */ nullproc, /* STAR */ nullproc, /* QUEST */ nullproc, /* PLUS */ boolop, /* AND */ boolop, /* BOR */ nullproc, /* APPEND */ relop, /* EQ */ relop, /* GE */ relop, /* GT */ relop, /* LE */ relop, /* LT */ relop, /* NE */ instat, /* IN */ arg, /* ARG */ bltin, /* BLTIN */ jump, /* BREAK */ closefile, /* CLOSE */ jump, /* CONTINUE */ awkdelete, /* DELETE */ dostat, /* DO */ jump, /* EXIT */ forstat, /* FOR */ nullproc, /* FUNC */ sub, /* SUB */ gsub, /* GSUB */ ifstat, /* IF */ sindex, /* INDEX */ nullproc, /* LSUBSTR */ matchop, /* MATCHFCN */ jump, /* NEXT */ jump, /* NEXTFILE */ arith, /* ADD */ arith, /* MINUS */ arith, /* MULT */ arith, /* DIVIDE */ arith, /* MOD */ assign, /* ASSIGN */ nullproc, /* ASGNOP */ assign, /* ADDEQ */ assign, /* SUBEQ */ assign, /* MULTEQ */ assign, /* DIVEQ */ assign, /* MODEQ */ assign, /* POWEQ */ printstat, /* PRINT */ awkprintf, /* PRINTF */ awksprintf, /* SPRINTF */ nullproc, /* ELSE */ intest, /* INTEST */ condexpr, /* CONDEXPR */ incrdecr, /* POSTINCR */ incrdecr, /* PREINCR */ incrdecr, /* POSTDECR */ incrdecr, /* PREDECR */ nullproc, /* VAR */ nullproc, /* IVAR */ getnf, /* VARNF */ call, /* CALL */ nullproc, /* NUMBER */ nullproc, /* STRING */ nullproc, /* REGEXPR */ getline, /* GETLINE */ jump, /* RETURN */ split, /* SPLIT */ substr, /* SUBSTR */ whilestat, /* WHILE */ cat, /* CAT */ boolop, /* NOT */ arith, /* UMINUS */ arith, /* POWER */ nullproc, /* DECR */ nullproc, /* INCR */ indirect, /* INDIRECT */ nullproc, /* LASTTOKEN */ }; char *tokname(int n) { static char buf[100]; if (n < FIRSTTOKEN || n > LASTTOKEN) { sprintf(buf, "token %d", n); return buf; } return printname[n-FIRSTTOKEN]; } 9base-6/awk/maketab.c0000644000175000017500000001175611402154555014112 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* * this program makes the table to link function names * and type indices that is used by execute() in run.c. * it finds the indices in y.tab.h, produced by yacc. */ #include #include #include #include "awk.h" #include "y.tab.h" struct xx { int token; char *name; char *pname; } proc[] = { { PROGRAM, "program", NULL }, { BOR, "boolop", " || " }, { AND, "boolop", " && " }, { NOT, "boolop", " !" }, { NE, "relop", " != " }, { EQ, "relop", " == " }, { LE, "relop", " <= " }, { LT, "relop", " < " }, { GE, "relop", " >= " }, { GT, "relop", " > " }, { ARRAY, "array", NULL }, { INDIRECT, "indirect", "$(" }, { SUBSTR, "substr", "substr" }, { SUB, "sub", "sub" }, { GSUB, "gsub", "gsub" }, { INDEX, "sindex", "sindex" }, { SPRINTF, "awksprintf", "sprintf " }, { ADD, "arith", " + " }, { MINUS, "arith", " - " }, { MULT, "arith", " * " }, { DIVIDE, "arith", " / " }, { MOD, "arith", " % " }, { UMINUS, "arith", " -" }, { POWER, "arith", " **" }, { PREINCR, "incrdecr", "++" }, { POSTINCR, "incrdecr", "++" }, { PREDECR, "incrdecr", "--" }, { POSTDECR, "incrdecr", "--" }, { CAT, "cat", " " }, { PASTAT, "pastat", NULL }, { PASTAT2, "dopa2", NULL }, { MATCH, "matchop", " ~ " }, { NOTMATCH, "matchop", " !~ " }, { MATCHFCN, "matchop", "matchop" }, { INTEST, "intest", "intest" }, { PRINTF, "awkprintf", "printf" }, { PRINT, "printstat", "print" }, { CLOSE, "closefile", "closefile" }, { DELETE, "awkdelete", "awkdelete" }, { SPLIT, "split", "split" }, { ASSIGN, "assign", " = " }, { ADDEQ, "assign", " += " }, { SUBEQ, "assign", " -= " }, { MULTEQ, "assign", " *= " }, { DIVEQ, "assign", " /= " }, { MODEQ, "assign", " %= " }, { POWEQ, "assign", " ^= " }, { CONDEXPR, "condexpr", " ?: " }, { IF, "ifstat", "if(" }, { WHILE, "whilestat", "while(" }, { FOR, "forstat", "for(" }, { DO, "dostat", "do" }, { IN, "instat", "instat" }, { NEXT, "jump", "next" }, { NEXTFILE, "jump", "nextfile" }, { EXIT, "jump", "exit" }, { BREAK, "jump", "break" }, { CONTINUE, "jump", "continue" }, { RETURN, "jump", "ret" }, { BLTIN, "bltin", "bltin" }, { CALL, "call", "call" }, { ARG, "arg", "arg" }, { VARNF, "getnf", "NF" }, { GETLINE, "getline", "getline" }, { 0, "", "" }, }; #define SIZE (LASTTOKEN - FIRSTTOKEN + 1) char *table[SIZE]; char *names[SIZE]; int main(int argc, char *argv[]) { struct xx *p; int i, n, tok; char c; FILE *fp; char buf[200], name[200], def[200]; printf("#include \n"); printf("#include \"awk.h\"\n"); printf("#include \"y.tab.h\"\n\n"); for (i = SIZE; --i >= 0; ) names[i] = ""; if ((fp = fopen("y.tab.h", "r")) == NULL) { fprintf(stderr, "maketab can't open y.tab.h!\n"); exit(1); } printf("static char *printname[%d] = {\n", SIZE); i = 0; while (fgets(buf, sizeof buf, fp) != NULL) { n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok); if (c != '#' || (n != 4 && strcmp(def,"define") != 0)) /* not a valid #define */ continue; if (tok < FIRSTTOKEN || tok > LASTTOKEN) { fprintf(stderr, "maketab funny token %d %s\n", tok, buf); exit(1); } names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1); strcpy(names[tok-FIRSTTOKEN], name); printf("\t(char *) \"%s\",\t/* %d */\n", name, tok); i++; } printf("};\n\n"); for (p=proc; p->token!=0; p++) table[p->token-FIRSTTOKEN] = p->name; printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE); for (i=0; i LASTTOKEN) {\n"); printf(" sprintf(buf, \"token %%d\", n);\n"); printf(" return buf;\n"); printf(" }\n"); printf(" return printname[n-FIRSTTOKEN];\n"); printf("}\n"); return 0; } 9base-6/awk/main.c0000644000175000017500000001224211402154555013421 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ char *version = "version 19990602"; #define DEBUG #include #include #include #include #include #include "awk.h" #include "y.tab.h" extern char **environ; extern int nfields; int dbg = 0; char *cmdname; /* gets argv[0] for error messages */ extern FILE *yyin; /* lex input file */ char *lexprog; /* points to program argument if it exists */ extern int errorflag; /* non-zero if any syntax errors; set by yyerror */ int compile_time = 2; /* for error printing: */ /* 2 = cmdline, 1 = compile, 0 = running */ char *pfile[20]; /* program filenames from -f's */ int npfile = 0; /* number of filenames */ int curpfile = 0; /* current filename */ int safe = 0; /* 1 => "safe" mode */ int main(int argc, char *argv[]) { char *fs = NULL, *marg; int temp; cmdname = argv[0]; if (argc == 1) { fprintf(stderr, "Usage: %s [-F fieldsep] [-mf n] [-mr n] [-v var=value] [-f programfile | 'program'] [file ...]\n", cmdname); exit(1); } signal(SIGFPE, fpecatch); yyin = NULL; symtab = makesymtab(NSYMTAB); while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (strcmp(argv[1], "--") == 0) { /* explicit end of args */ argc--; argv++; break; } switch (argv[1][1]) { case 's': if (strcmp(argv[1], "-safe") == 0) safe = 1; break; case 'f': /* next argument is program filename */ argc--; argv++; if (argc <= 1) FATAL("no program filename"); pfile[npfile++] = argv[1]; break; case 'F': /* set field separator */ if (argv[1][2] != 0) { /* arg is -Fsomething */ if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */ fs = "\t"; else if (argv[1][2] != 0) fs = &argv[1][2]; } else { /* arg is -F something */ argc--; argv++; if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */ fs = "\t"; else if (argc > 1 && argv[1][0] != 0) fs = &argv[1][0]; } if (fs == NULL || *fs == '\0') WARNING("field separator FS is empty"); break; case 'v': /* -v a=1 to be done NOW. one -v for each */ if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) setclvar(argv[1]); break; case 'm': /* more memory: -mr=record, -mf=fields */ /* no longer needed */ marg = argv[1]; if (argv[1][3]) temp = atoi(&argv[1][3]); else { argv++; argc--; temp = atoi(&argv[1][0]); } switch (marg[2]) { case 'r': recsize = temp; break; case 'f': nfields = temp; break; default: FATAL("unknown option %s\n", marg); } break; case 'd': dbg = atoi(&argv[1][2]); if (dbg == 0) dbg = 1; printf("awk %s\n", version); break; case 'V': /* added for exptools "standard" */ printf("awk %s\n", version); exit(0); break; default: WARNING("unknown option %s ignored", argv[1]); break; } argc--; argv++; } /* argv[1] is now the first argument */ if (npfile == 0) { /* no -f; first argument is program */ if (argc <= 1) { if (dbg) exit(0); FATAL("no program given"); } dprintf( ("program = |%s|\n", argv[1]) ); lexprog = argv[1]; argc--; argv++; } recinit(recsize); syminit(); compile_time = 1; argv[0] = cmdname; /* put prog name at front of arglist */ dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); arginit(argc, argv); if (!safe) envinit(environ); yyparse(); if (fs) *FS = qstring(fs, '\0'); dprintf( ("errorflag=%d\n", errorflag) ); if (errorflag == 0) { compile_time = 0; run(winner); } else bracecheck(); return(errorflag); } int pgetc(void) /* get 1 character from awk program */ { int c; for (;;) { if (yyin == NULL) { if (curpfile >= npfile) return EOF; if (strcmp(pfile[curpfile], "-") == 0) yyin = stdin; else if ((yyin = fopen(pfile[curpfile], "r")) == NULL) FATAL("can't open file %s", pfile[curpfile]); lineno = 1; } if ((c = getc(yyin)) != EOF) return c; if (yyin != stdin) fclose(yyin); yyin = NULL; curpfile++; } } char *cursource(void) /* current source file name */ { if (npfile > 0) return pfile[curpfile]; else return NULL; } 9base-6/awk/re.c0000644000175000017500000001544711402154555013115 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define DEBUG #include #include #include #include #include #include #include "awk.h" #include "y.tab.h" /* This file provides the interface between the main body of * awk and the pattern matching package. It preprocesses * patterns prior to compilation to provide awk-like semantics * to character sequences not supported by the pattern package. * The following conversions are performed: * * "()" -> "[]" * "[-" -> "[\-" * "[^-" -> "[^\-" * "-]" -> "\-]" * "[]" -> "[]*" * "\xdddd" -> "\z" where 'z' is the UTF sequence * for the hex value * "\ddd" -> "\o" where 'o' is a char octal value * "\b" -> "\B" where 'B' is backspace * "\t" -> "\T" where 'T' is tab * "\f" -> "\F" where 'F' is form feed * "\n" -> "\N" where 'N' is newline * "\r" -> "\r" where 'C' is cr */ #define MAXRE 512 static char re[MAXRE]; /* copy buffer */ char *patbeg; int patlen; /* number of chars in pattern */ #define NPATS 20 /* number of slots in pattern cache */ static struct pat_list /* dynamic pattern cache */ { char *re; int use; Reprog *program; } pattern[NPATS]; static int npats; /* cache fill level */ /* Compile a pattern */ void *compre(char *pat) { int i, j, inclass; char c, *p, *s; Reprog *program; if (!compile_time) { /* search cache for dynamic pattern */ for (i = 0; i < npats; i++) if (!strcmp(pat, pattern[i].re)) { pattern[i].use++; return((void *) pattern[i].program); } } /* Preprocess Pattern for compilation */ p = re; s = pat; inclass = 0; while (c = *s++) { if (c == '\\') { quoted(&s, &p, re+MAXRE); continue; } else if (!inclass && c == '(' && *s == ')') { if (p < re+MAXRE-2) { /* '()' -> '[]*' */ *p++ = '['; *p++ = ']'; c = '*'; s++; } else overflow(); } else if (c == '['){ /* '[-' -> '[\-' */ inclass = 1; if (*s == '-') { if (p < re+MAXRE-2) { *p++ = '['; *p++ = '\\'; c = *s++; } else overflow(); } /* '[^-' -> '[^\-'*/ else if (*s == '^' && s[1] == '-'){ if (p < re+MAXRE-3) { *p++ = '['; *p++ = *s++; *p++ = '\\'; c = *s++; } else overflow(); } else if (*s == '['){ /* skip '[[' */ if (p < re+MAXRE-1) *p++ = c; else overflow(); c = *s++; } else if (*s == '^' && s[1] == '[') { /* skip '[^['*/ if (p < re+MAXRE-2) { *p++ = c; *p++ = *s++; c = *s++; } else overflow(); } else if (*s == ']') { /* '[]' -> '[]*' */ if (p < re+MAXRE-2) { *p++ = c; *p++ = *s++; c = '*'; inclass = 0; } else overflow(); } } else if (c == '-' && *s == ']') { /* '-]' -> '\-]' */ if (p < re+MAXRE-1) *p++ = '\\'; else overflow(); } else if (c == ']') inclass = 0; if (p < re+MAXRE-1) *p++ = c; else overflow(); } *p = 0; program = regcomp(re); /* compile pattern */ if (!compile_time) { if (npats < NPATS) /* Room in cache */ i = npats++; else { /* Throw out least used */ int use = pattern[0].use; i = 0; for (j = 1; j < NPATS; j++) { if (pattern[j].use < use) { use = pattern[j].use; i = j; } } xfree(pattern[i].program); xfree(pattern[i].re); } pattern[i].re = tostring(pat); pattern[i].program = program; pattern[i].use = 1; } return((void *) program); } /* T/F match indication - matched string not exported */ int match(void *p, char *s, char *start) { return regexec((Reprog *) p, (char *) s, 0, 0); } /* match and delimit the matched string */ int pmatch(void *p, char *s, char *start) { Resub m; m.s.sp = start; m.e.ep = 0; if (regexec((Reprog *) p, (char *) s, &m, 1)) { patbeg = m.s.sp; patlen = m.e.ep-m.s.sp; return 1; } patlen = -1; patbeg = start; return 0; } /* perform a non-empty match */ int nematch(void *p, char *s, char *start) { if (pmatch(p, s, start) == 1 && patlen > 0) return 1; patlen = -1; patbeg = start; return 0; } /* in the parsing of regular expressions, metacharacters like . have */ /* to be seen literally; \056 is not a metacharacter. */ int hexstr(char **pp) /* find and eval hex string at pp, return new p */ { char c; int n = 0; int i; for (i = 0, c = (*pp)[i]; i < 4 && isxdigit(c); i++, c = (*pp)[i]) { if (isdigit(c)) n = 16 * n + c - '0'; else if ('a' <= c && c <= 'f') n = 16 * n + c - 'a' + 10; else if ('A' <= c && c <= 'F') n = 16 * n + c - 'A' + 10; } *pp += i; return n; } /* look for awk-specific escape sequences */ #define isoctdigit(c) ((c) >= '0' && (c) <= '7') /* multiple use of arg */ void quoted(char **s, char **to, char *end) /* handle escaped sequence */ { char *p = *s; char *t = *to; wchar_t c; switch(c = *p++) { case 't': c = '\t'; break; case 'n': c = '\n'; break; case 'f': c = '\f'; break; case 'r': c = '\r'; break; case 'b': c = '\b'; break; default: if (t < end-1) /* all else must be escaped */ *t++ = '\\'; if (c == 'x') { /* hexadecimal goo follows */ c = hexstr(&p); if (t < end-MB_CUR_MAX) t += wctomb(t, c); else overflow(); *to = t; *s = p; return; } else if (isoctdigit(c)) { /* \d \dd \ddd */ c -= '0'; if (isoctdigit(*p)) { c = 8 * c + *p++ - '0'; if (isoctdigit(*p)) c = 8 * c + *p++ - '0'; } } break; } if (t < end-1) *t++ = c; *s = p; *to = t; } /* count rune positions */ int countposn(char *s, int n) { int i, j; char *end; for (i = 0, end = s+n; *s && s < end; i++){ j = mblen(s, n); if(j <= 0) j = 1; s += j; } return(i); } /* pattern package error handler */ void regerror(char *s) { FATAL("%s", s); } void overflow(void) { FATAL("%s", "regular expression too big"); } 9base-6/awk/awkgram.y0000644000175000017500000003315311402154555014160 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ %{ #include #include #include "awk.h" #define makedfa(a,b) compre(a) void checkdup(Node *list, Cell *item); int yywrap(void) { return(1); } Node *beginloc = 0; Node *endloc = 0; int infunc = 0; /* = 1 if in arglist or body of func */ int inloop = 0; /* = 1 if in while, for, do */ char *curfname = 0; /* current function name */ Node *arglist = 0; /* list of args for current function */ %} %union { Node *p; Cell *cp; int i; char *s; } %token FIRSTTOKEN /* must be first */ %token

PROGRAM PASTAT PASTAT2 XBEGIN XEND %token NL ',' '{' '(' '|' ';' '/' ')' '}' '[' ']' %token ARRAY %token MATCH NOTMATCH MATCHOP %token FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS %token AND BOR APPEND EQ GE GT LE LT NE IN %token ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC %token SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE %token ADD MINUS MULT DIVIDE MOD %token ASSIGN ASGNOP ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ %token PRINT PRINTF SPRINTF %token

ELSE INTEST CONDEXPR %token POSTINCR PREINCR POSTDECR PREDECR %token VAR IVAR VARNF CALL NUMBER STRING %token REGEXPR %type

pas pattern ppattern plist pplist patlist prarg term re %type

pa_pat pa_stat pa_stats %type reg_expr %type

simple_stmt opt_simple_stmt stmt stmtlist %type

var varname funcname varlist %type

for if else while %type do st %type pst opt_pst lbrace rbrace rparen comma nl opt_nl and bor %type subop print %right ASGNOP %right '?' %right ':' %left BOR %left AND %left GETLINE %nonassoc APPEND EQ GE GT LE LT NE MATCHOP IN '|' %left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FUNC %left GSUB IF INDEX LSUBSTR MATCHFCN NEXT NUMBER %left PRINT PRINTF RETURN SPLIT SPRINTF STRING SUB SUBSTR %left REGEXPR VAR VARNF IVAR WHILE '(' %left CAT %left '+' '-' %left '*' '/' '%' %left NOT UMINUS %right POWER %right DECR INCR %left INDIRECT %token LASTTOKEN /* must be last */ %% program: pas { if (errorflag==0) winner = (Node *)stat3(PROGRAM, beginloc, $1, endloc); } | error { yyclearin; bracecheck(); SYNTAX("bailing out"); } ; and: AND | and NL ; bor: BOR | bor NL ; comma: ',' | comma NL ; do: DO | do NL ; else: ELSE | else NL ; for: FOR '(' opt_simple_stmt ';' opt_nl pattern ';' opt_nl opt_simple_stmt rparen {inloop++;} stmt { --inloop; $$ = stat4(FOR, $3, notnull($6), $9, $12); } | FOR '(' opt_simple_stmt ';' ';' opt_nl opt_simple_stmt rparen {inloop++;} stmt { --inloop; $$ = stat4(FOR, $3, NIL, $7, $10); } | FOR '(' varname IN varname rparen {inloop++;} stmt { --inloop; $$ = stat3(IN, $3, makearr($5), $8); } ; funcname: VAR { setfname($1); } | CALL { setfname($1); } ; if: IF '(' pattern rparen { $$ = notnull($3); } ; lbrace: '{' | lbrace NL ; nl: NL | nl NL ; opt_nl: /* empty */ { $$ = 0; } | nl ; opt_pst: /* empty */ { $$ = 0; } | pst ; opt_simple_stmt: /* empty */ { $$ = 0; } | simple_stmt ; pas: opt_pst { $$ = 0; } | opt_pst pa_stats opt_pst { $$ = $2; } ; pa_pat: pattern { $$ = notnull($1); } ; pa_stat: pa_pat { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), NIL)); } | pa_pat lbrace stmtlist '}' { $$ = stat2(PASTAT, $1, $3); } | pa_pat ',' pa_pat { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), NIL)); } | pa_pat ',' pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $3, $5); } | lbrace stmtlist '}' { $$ = stat2(PASTAT, NIL, $2); } | XBEGIN lbrace stmtlist '}' { beginloc = linkum(beginloc, $3); $$ = 0; } | XEND lbrace stmtlist '}' { endloc = linkum(endloc, $3); $$ = 0; } | FUNC funcname '(' varlist rparen {infunc++;} lbrace stmtlist '}' { infunc--; curfname=0; defn((Cell *)$2, $4, $8); $$ = 0; } ; pa_stats: pa_stat | pa_stats opt_pst pa_stat { $$ = linkum($1, $3); } ; patlist: pattern | patlist comma pattern { $$ = linkum($1, $3); } ; ppattern: var ASGNOP ppattern { $$ = op2($2, $1, $3); } | ppattern '?' ppattern ':' ppattern %prec '?' { $$ = op3(CONDEXPR, notnull($1), $3, $5); } | ppattern bor ppattern %prec BOR { $$ = op2(BOR, notnull($1), notnull($3)); } | ppattern and ppattern %prec AND { $$ = op2(AND, notnull($1), notnull($3)); } | ppattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); } | ppattern MATCHOP ppattern { if (constnode($3)) $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0)); else $$ = op3($2, (Node *)1, $1, $3); } | ppattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } | ppattern term %prec CAT { $$ = op2(CAT, $1, $2); } | re | term ; pattern: var ASGNOP pattern { $$ = op2($2, $1, $3); } | pattern '?' pattern ':' pattern %prec '?' { $$ = op3(CONDEXPR, notnull($1), $3, $5); } | pattern bor pattern %prec BOR { $$ = op2(BOR, notnull($1), notnull($3)); } | pattern and pattern %prec AND { $$ = op2(AND, notnull($1), notnull($3)); } | pattern EQ pattern { $$ = op2($2, $1, $3); } | pattern GE pattern { $$ = op2($2, $1, $3); } | pattern GT pattern { $$ = op2($2, $1, $3); } | pattern LE pattern { $$ = op2($2, $1, $3); } | pattern LT pattern { $$ = op2($2, $1, $3); } | pattern NE pattern { $$ = op2($2, $1, $3); } | pattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); } | pattern MATCHOP pattern { if (constnode($3)) $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0)); else $$ = op3($2, (Node *)1, $1, $3); } | pattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } | pattern '|' GETLINE var { if (safe) SYNTAX("cmd | getline is unsafe"); else $$ = op3(GETLINE, $4, itonp($2), $1); } | pattern '|' GETLINE { if (safe) SYNTAX("cmd | getline is unsafe"); else $$ = op3(GETLINE, (Node*)0, itonp($2), $1); } | pattern term %prec CAT { $$ = op2(CAT, $1, $2); } | re | term ; plist: pattern comma pattern { $$ = linkum($1, $3); } | plist comma pattern { $$ = linkum($1, $3); } ; pplist: ppattern | pplist comma ppattern { $$ = linkum($1, $3); } ; prarg: /* empty */ { $$ = rectonode(); } | pplist | '(' plist ')' { $$ = $2; } ; print: PRINT | PRINTF ; pst: NL | ';' | pst NL | pst ';' ; rbrace: '}' | rbrace NL ; re: reg_expr { $$ = op3(MATCH, NIL, rectonode(), (Node*)makedfa($1, 0)); } | NOT re { $$ = op1(NOT, notnull($2)); } ; reg_expr: '/' {startreg();} REGEXPR '/' { $$ = $3; } ; rparen: ')' | rparen NL ; simple_stmt: print prarg '|' term { if (safe) SYNTAX("print | is unsafe"); else $$ = stat3($1, $2, itonp($3), $4); } | print prarg APPEND term { if (safe) SYNTAX("print >> is unsafe"); else $$ = stat3($1, $2, itonp($3), $4); } | print prarg GT term { if (safe) SYNTAX("print > is unsafe"); else $$ = stat3($1, $2, itonp($3), $4); } | print prarg { $$ = stat3($1, $2, NIL, NIL); } | DELETE varname '[' patlist ']' { $$ = stat2(DELETE, makearr($2), $4); } | DELETE varname { $$ = stat2(DELETE, makearr($2), 0); } | pattern { $$ = exptostat($1); } | error { yyclearin; SYNTAX("illegal statement"); } ; st: nl | ';' opt_nl ; stmt: BREAK st { if (!inloop) SYNTAX("break illegal outside of loops"); $$ = stat1(BREAK, NIL); } | CLOSE pattern st { $$ = stat1(CLOSE, $2); } | CONTINUE st { if (!inloop) SYNTAX("continue illegal outside of loops"); $$ = stat1(CONTINUE, NIL); } | do {inloop++;} stmt {--inloop;} WHILE '(' pattern ')' st { $$ = stat2(DO, $3, notnull($7)); } | EXIT pattern st { $$ = stat1(EXIT, $2); } | EXIT st { $$ = stat1(EXIT, NIL); } | for | if stmt else stmt { $$ = stat3(IF, $1, $2, $4); } | if stmt { $$ = stat3(IF, $1, $2, NIL); } | lbrace stmtlist rbrace { $$ = $2; } | NEXT st { if (infunc) SYNTAX("next is illegal inside a function"); $$ = stat1(NEXT, NIL); } | NEXTFILE st { if (infunc) SYNTAX("nextfile is illegal inside a function"); $$ = stat1(NEXTFILE, NIL); } | RETURN pattern st { $$ = stat1(RETURN, $2); } | RETURN st { $$ = stat1(RETURN, NIL); } | simple_stmt st | while {inloop++;} stmt { --inloop; $$ = stat2(WHILE, $1, $3); } | ';' opt_nl { $$ = 0; } ; stmtlist: stmt | stmtlist stmt { $$ = linkum($1, $2); } ; subop: SUB | GSUB ; term: term '/' ASGNOP term { $$ = op2(DIVEQ, $1, $4); } | term '+' term { $$ = op2(ADD, $1, $3); } | term '-' term { $$ = op2(MINUS, $1, $3); } | term '*' term { $$ = op2(MULT, $1, $3); } | term '/' term { $$ = op2(DIVIDE, $1, $3); } | term '%' term { $$ = op2(MOD, $1, $3); } | term POWER term { $$ = op2(POWER, $1, $3); } | '-' term %prec UMINUS { $$ = op1(UMINUS, $2); } | '+' term %prec UMINUS { $$ = $2; } | NOT term %prec UMINUS { $$ = op1(NOT, notnull($2)); } | BLTIN '(' ')' { $$ = op2(BLTIN, itonp($1), rectonode()); } | BLTIN '(' patlist ')' { $$ = op2(BLTIN, itonp($1), $3); } | BLTIN { $$ = op2(BLTIN, itonp($1), rectonode()); } | CALL '(' ')' { $$ = op2(CALL, celltonode($1,CVAR), NIL); } | CALL '(' patlist ')' { $$ = op2(CALL, celltonode($1,CVAR), $3); } | DECR var { $$ = op1(PREDECR, $2); } | INCR var { $$ = op1(PREINCR, $2); } | var DECR { $$ = op1(POSTDECR, $1); } | var INCR { $$ = op1(POSTINCR, $1); } | GETLINE var LT term { $$ = op3(GETLINE, $2, itonp($3), $4); } | GETLINE LT term { $$ = op3(GETLINE, NIL, itonp($2), $3); } | GETLINE var { $$ = op3(GETLINE, $2, NIL, NIL); } | GETLINE { $$ = op3(GETLINE, NIL, NIL, NIL); } | INDEX '(' pattern comma pattern ')' { $$ = op2(INDEX, $3, $5); } | INDEX '(' pattern comma reg_expr ')' { SYNTAX("index() doesn't permit regular expressions"); $$ = op2(INDEX, $3, (Node*)$5); } | '(' pattern ')' { $$ = $2; } | MATCHFCN '(' pattern comma reg_expr ')' { $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa($5, 1)); } | MATCHFCN '(' pattern comma pattern ')' { if (constnode($5)) $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa(strnode($5), 1)); else $$ = op3(MATCHFCN, (Node *)1, $3, $5); } | NUMBER { $$ = celltonode($1, CCON); } | SPLIT '(' pattern comma varname comma pattern ')' /* string */ { $$ = op4(SPLIT, $3, makearr($5), $7, (Node*)STRING); } | SPLIT '(' pattern comma varname comma reg_expr ')' /* const /regexp/ */ { $$ = op4(SPLIT, $3, makearr($5), (Node*)makedfa($7, 1), (Node *)REGEXPR); } | SPLIT '(' pattern comma varname ')' { $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); } /* default */ | SPRINTF '(' patlist ')' { $$ = op1($1, $3); } | STRING { $$ = celltonode($1, CCON); } | subop '(' reg_expr comma pattern ')' { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); } | subop '(' pattern comma pattern ')' { if (constnode($3)) $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, rectonode()); else $$ = op4($1, (Node *)1, $3, $5, rectonode()); } | subop '(' reg_expr comma pattern comma var ')' { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, $7); } | subop '(' pattern comma pattern comma var ')' { if (constnode($3)) $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, $7); else $$ = op4($1, (Node *)1, $3, $5, $7); } | SUBSTR '(' pattern comma pattern comma pattern ')' { $$ = op3(SUBSTR, $3, $5, $7); } | SUBSTR '(' pattern comma pattern ')' { $$ = op3(SUBSTR, $3, $5, NIL); } | var ; var: varname | varname '[' patlist ']' { $$ = op2(ARRAY, makearr($1), $3); } | IVAR { $$ = op1(INDIRECT, celltonode($1, CVAR)); } | INDIRECT term { $$ = op1(INDIRECT, $2); } ; varlist: /* nothing */ { arglist = $$ = 0; } | VAR { arglist = $$ = celltonode($1,CVAR); } | varlist comma VAR { checkdup($1, $3); arglist = $$ = linkum($1,celltonode($3,CVAR)); } ; varname: VAR { $$ = celltonode($1, CVAR); } | ARG { $$ = op1(ARG, itonp($1)); } | VARNF { $$ = op1(VARNF, (Node *) $1); } ; while: WHILE '(' pattern rparen { $$ = notnull($3); } ; %% void setfname(Cell *p) { if (isarr(p)) SYNTAX("%s is an array, not a function", p->nval); else if (isfcn(p)) SYNTAX("you can't define function %s more than once", p->nval); curfname = p->nval; } int constnode(Node *p) { return isvalue(p) && ((Cell *) (p->narg[0]))->csub == CCON; } char *strnode(Node *p) { return ((Cell *)(p->narg[0]))->sval; } Node *notnull(Node *n) { switch (n->nobj) { case LE: case LT: case EQ: case NE: case GT: case GE: case BOR: case AND: case NOT: return n; default: return op2(NE, n, nullnode); } } void checkdup(Node *vl, Cell *cp) /* check if name already in list */ { char *s = cp->nval; for ( ; vl; vl = vl->nnext) { if (strcmp(s, ((Cell *)(vl->narg[0]))->nval) == 0) { SYNTAX("duplicate argument %s", s); break; } } } 9base-6/awk/lib.c0000644000175000017500000004051111402154555013243 0ustar anselmanselm/**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name Lucent Technologies or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ #define DEBUG #include #include #include #include #include #include #include "awk.h" #include "y.tab.h" FILE *infile = NULL; char *file = ""; char *record; int recsize = RECSIZE; char *fields; int fieldssize = RECSIZE; Cell **fldtab; /* pointers to Cells */ char inputFS[100] = " "; #define MAXFLD 200 int nfields = MAXFLD; /* last allocated slot for $i */ int donefld; /* 1 = implies rec broken into fields */ int donerec; /* 1 = record is valid (no flds have changed) */ int lastfld = 0; /* last used field */ int argno = 1; /* current input argument number */ extern Awkfloat *ARGC; static Cell dollar0 = { OCELL, CFLD, NULL, "", 0.0, REC|STR|DONTFREE }; static Cell dollar1 = { OCELL, CFLD, NULL, "", 0.0, FLD|STR|DONTFREE }; void recinit(unsigned int n) { record = (char *) malloc(n); fields = (char *) malloc(n); fldtab = (Cell **) malloc((nfields+1) * sizeof(Cell *)); if (record == NULL || fields == NULL || fldtab == NULL) FATAL("out of space for $0 and fields"); fldtab[0] = (Cell *) malloc(sizeof (Cell)); *fldtab[0] = dollar0; fldtab[0]->sval = record; fldtab[0]->nval = tostring("0"); makefields(1, nfields); } void makefields(int n1, int n2) /* create $n1..$n2 inclusive */ { char temp[50]; int i; for (i = n1; i <= n2; i++) { fldtab[i] = (Cell *) malloc(sizeof (struct Cell)); if (fldtab[i] == NULL) FATAL("out of space in makefields %d", i); *fldtab[i] = dollar1; sprintf(temp, "%d", i); fldtab[i]->nval = tostring(temp); } } void initgetrec(void) { int i; char *p; for (i = 1; i < *ARGC; i++) { if (!isclvar(p = getargv(i))) { /* find 1st real filename */ setsval(lookup("FILENAME", symtab), getargv(i)); return; } setclvar(p); /* a commandline assignment before filename */ argno++; } infile = stdin; /* no filenames, so use stdin */ } int getrec(char **pbuf, int *pbufsize, int isrecord) /* get next input record */ { /* note: cares whether buf == record */ int c; static int firsttime = 1; char *buf = *pbuf; int bufsize = *pbufsize; if (firsttime) { firsttime = 0; initgetrec(); } dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n", *RS, *FS, *ARGC, *FILENAME) ); if (isrecord) { donefld = 0; donerec = 1; } buf[0] = 0; while (argno < *ARGC || infile == stdin) { dprintf( ("argno=%d, file=|%s|\n", argno, file) ); if (infile == NULL) { /* have to open a new file */ file = getargv(argno); if (*file == '\0') { /* it's been zapped */ argno++; continue; } if (isclvar(file)) { /* a var=value arg */ setclvar(file); argno++; continue; } *FILENAME = file; dprintf( ("opening file %s\n", file) ); if (*file == '-' && *(file+1) == '\0') infile = stdin; else if ((infile = fopen(file, "r")) == NULL) FATAL("can't open file %s", file); setfval(fnrloc, 0.0); } c = readrec(&buf, &bufsize, infile); if (c != 0 || buf[0] != '\0') { /* normal record */ if (isrecord) { if (freeable(fldtab[0])) xfree(fldtab[0]->sval); fldtab[0]->sval = buf; /* buf == record */ fldtab[0]->tval = REC | STR | DONTFREE; if (is_number(fldtab[0]->sval)) { fldtab[0]->fval = atof(fldtab[0]->sval); fldtab[0]->tval |= NUM; } } setfval(nrloc, nrloc->fval+1); setfval(fnrloc, fnrloc->fval+1); *pbuf = buf; *pbufsize = bufsize; return 1; } /* EOF arrived on this file; set up next */ if (infile != stdin) fclose(infile); infile = NULL; argno++; } *pbuf = buf; *pbufsize = bufsize; return 0; /* true end of file */ } void nextfile(void) { if (infile != stdin) fclose(infile); infile = NULL; argno++; } int readrec(char **pbuf, int *pbufsize, FILE *inf) /* read one record into buf */ { int sep, c; char *rr, *buf = *pbuf; int bufsize = *pbufsize; if (strlen(*FS) >= sizeof(inputFS)) FATAL("field separator %.10s... is too long", *FS); strcpy(inputFS, *FS); /* for subsequent field splitting */ if ((sep = **RS) == 0) { sep = '\n'; while ((c=getc(inf)) == '\n' && c != EOF) /* skip leading \n's */ ; if (c != EOF) ungetc(c, inf); } for (rr = buf; ; ) { for (; (c=getc(inf)) != sep && c != EOF; ) { if (rr-buf+1 > bufsize) if (!adjbuf(&buf, &bufsize, 1+rr-buf, recsize, &rr, "readrec 1")) FATAL("input record `%.30s...' too long", buf); *rr++ = c; } if (**RS == sep || c == EOF) break; if ((c = getc(inf)) == '\n' || c == EOF) /* 2 in a row */ break; if (!adjbuf(&buf, &bufsize, 2+rr-buf, recsize, &rr, "readrec 2")) FATAL("input record `%.30s...' too long", buf); *rr++ = '\n'; *rr++ = c; } if (!adjbuf(&buf, &bufsize, 1+rr-buf, recsize, &rr, "readrec 3")) FATAL("input record `%.30s...' too long", buf); *rr = 0; dprintf( ("readrec saw <%s>, returns %d\n", buf, c == EOF && rr == buf ? 0 : 1) ); *pbuf = buf; *pbufsize = bufsize; return c == EOF && rr == buf ? 0 : 1; } char *getargv(int n) /* get ARGV[n] */ { Cell *x; char *s, temp[50]; extern Array *ARGVtab; sprintf(temp, "%d", n); x = setsymtab(temp, "", 0.0, STR, ARGVtab); s = getsval(x); dprintf( ("getargv(%d) returns |%s|\n", n, s) ); return s; } void setclvar(char *s) /* set var=value from s */ { char *p; Cell *q; for (p=s; *p != '='; p++) ; *p++ = 0; p = qstring(p, '\0'); q = setsymtab(s, p, 0.0, STR, symtab); setsval(q, p); if (is_number(q->sval)) { q->fval = atof(q->sval); q->tval |= NUM; } dprintf( ("command line set %s to |%s|\n", s, p) ); } void fldbld(void) /* create fields from current record */ { /* this relies on having fields[] the same length as $0 */ /* the fields are all stored in this one array with \0's */ char *r, *fr, sep; Cell *p; int i, j, n; if (donefld) return; if (!isstr(fldtab[0])) getsval(fldtab[0]); r = fldtab[0]->sval; n = strlen(r); if (n > fieldssize) { xfree(fields); if ((fields = (char *) malloc(n+1)) == NULL) FATAL("out of space for fields in fldbld %d", n); fieldssize = n; } fr = fields; i = 0; /* number of fields accumulated here */ if (strlen(inputFS) > 1) { /* it's a regular expression */ i = refldbld(r, inputFS); } else if ((sep = *inputFS) == ' ') { /* default whitespace */ for (i = 0; ; ) { while (*r == ' ' || *r == '\t' || *r == '\n') r++; if (*r == 0) break; i++; if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); fldtab[i]->sval = fr; fldtab[i]->tval = FLD | STR | DONTFREE; do *fr++ = *r++; while (*r != ' ' && *r != '\t' && *r != '\n' && *r != '\0'); *fr++ = 0; } *fr = 0; } else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ for (i = 0; *r != 0; r++) { char buf[2]; i++; if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); buf[0] = *r; buf[1] = 0; fldtab[i]->sval = tostring(buf); fldtab[i]->tval = FLD | STR; } *fr = 0; } else if (*r != 0) { /* if 0, it's a null field */ for (;;) { i++; if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); fldtab[i]->sval = fr; fldtab[i]->tval = FLD | STR | DONTFREE; while (*r != sep && *r != '\n' && *r != '\0') /* \n is always a separator */ *fr++ = *r++; *fr++ = 0; if (*r++ == 0) break; } *fr = 0; } if (i > nfields) FATAL("record `%.30s...' has too many fields; can't happen", r); cleanfld(i+1, lastfld); /* clean out junk from previous record */ lastfld = i; donefld = 1; for (j = 1; j <= lastfld; j++) { p = fldtab[j]; if(is_number(p->sval)) { p->fval = atof(p->sval); p->tval |= NUM; } } setfval(nfloc, (Awkfloat) lastfld); if (dbg) { for (j = 0; j <= lastfld; j++) { p = fldtab[j]; printf("field %d (%s): |%s|\n", j, p->nval, p->sval); } } } void cleanfld(int n1, int n2) /* clean out fields n1 .. n2 inclusive */ { /* nvals remain intact */ Cell *p; int i; for (i = n1; i <= n2; i++) { p = fldtab[i]; if (freeable(p)) xfree(p->sval); p->sval = ""; p->tval = FLD | STR | DONTFREE; } } void newfld(int n) /* add field n after end of existing lastfld */ { if (n > nfields) growfldtab(n); cleanfld(lastfld+1, n); lastfld = n; setfval(nfloc, (Awkfloat) n); } Cell *fieldadr(int n) /* get nth field */ { if (n < 0) FATAL("trying to access field %d", n); if (n > nfields) /* fields after NF are empty */ growfldtab(n); /* but does not increase NF */ return(fldtab[n]); } void growfldtab(int n) /* make new fields up to at least $n */ { int nf = 2 * nfields; if (n > nf) nf = n; fldtab = (Cell **) realloc(fldtab, (nf+1) * (sizeof (struct Cell *))); if (fldtab == NULL) FATAL("out of space creating %d fields", nf); makefields(nfields+1, nf); nfields = nf; } int refldbld(char *rec, char *fs) /* build fields from reg expr in FS */ { /* this relies on having fields[] the same length as $0 */ /* the fields are all stored in this one array with \0's */ char *fr; void *p; int i, n; n = strlen(rec); if (n > fieldssize) { xfree(fields); if ((fields = (char *) malloc(n+1)) == NULL) FATAL("out of space for fields in refldbld %d", n); fieldssize = n; } fr = fields; *fr = '\0'; if (*rec == '\0') return 0; p = compre(fs); dprintf( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) ); for (i = 1; ; i++) { if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); fldtab[i]->tval = FLD | STR | DONTFREE; fldtab[i]->sval = fr; dprintf( ("refldbld: i=%d\n", i) ); if (nematch(p, rec, rec)) { dprintf( ("match %s (%d chars)\n", patbeg, patlen) ); strncpy(fr, rec, patbeg-rec); fr += patbeg - rec + 1; *(fr-1) = '\0'; rec = patbeg + patlen; } else { dprintf( ("no match %s\n", rec) ); strcpy(fr, rec); break; } } return i; } void recbld(void) /* create $0 from $1..$NF if necessary */ { int i; char *r, *p; if (donerec == 1) return; r = record; for (i = 1; i <= *NF; i++) { p = getsval(fldtab[i]); if (!adjbuf(&record, &recsize, 1+strlen(p)+r-record, recsize, &r, "recbld 1")) FATAL("created $0 `%.30s...' too long", record); while ((*r = *p++) != 0) r++; if (i < *NF) { if (!adjbuf(&record, &recsize, 2+strlen(*OFS)+r-record, recsize, &r, "recbld 2")) FATAL("created $0 `%.30s...' too long", record); for (p = *OFS; (*r = *p++) != 0; ) r++; } } if (!adjbuf(&record, &recsize, 2+r-record, recsize, &r, "recbld 3")) FATAL("built giant record `%.30s...'", record); *r = '\0'; dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); if (freeable(fldtab[0])) xfree(fldtab[0]->sval); fldtab[0]->tval = REC | STR | DONTFREE; fldtab[0]->sval = record; dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); dprintf( ("recbld = |%s|\n", record) ); donerec = 1; } int errorflag = 0; void yyerror(char *s) { SYNTAX(s); } void SYNTAX(char *fmt, ...) { extern char *cmdname, *curfname; static int been_here = 0; va_list varg; if (been_here++ > 2) return; fprintf(stderr, "%s: ", cmdname); va_start(varg, fmt); vfprintf(stderr, fmt, varg); va_end(varg); if(compile_time == 1 && cursource() != NULL) fprintf(stderr, " at %s:%d", cursource(), lineno); else fprintf(stderr, " at line %d", lineno); if (curfname != NULL) fprintf(stderr, " in function %s", curfname); fprintf(stderr, "\n"); errorflag = 2; eprint(); } void fpecatch(int n) { FATAL("floating point exception %d", n); } extern int bracecnt, brackcnt, parencnt; void bracecheck(void) { int c; static int beenhere = 0; if (beenhere++) return; while ((c = input()) != EOF && c != '\0') bclass(c); bcheck2(bracecnt, '{', '}'); bcheck2(brackcnt, '[', ']'); bcheck2(parencnt, '(', ')'); } void bcheck2(int n, int c1, int c2) { if (n == 1) fprintf(stderr, "\tmissing %c\n", c2); else if (n > 1) fprintf(stderr, "\t%d missing %c's\n", n, c2); else if (n == -1) fprintf(stderr, "\textra %c\n", c2); else if (n < -1) fprintf(stderr, "\t%d extra %c's\n", -n, c2); } void FATAL(char *fmt, ...) { extern char *cmdname; va_list varg; fflush(stdout); fprintf(stderr, "%s: ", cmdname); va_start(varg, fmt); vfprintf(stderr, fmt, varg); va_end(varg); error(); if (dbg > 1) /* core dump if serious debugging on */ abort(); exit(2); } void WARNING(char *fmt, ...) { extern char *cmdname; va_list varg; fflush(stdout); fprintf(stderr, "%s: ", cmdname); va_start(varg, fmt); vfprintf(stderr, fmt, varg); va_end(varg); error(); } void error() { extern Node *curnode; int line; fprintf(stderr, "\n"); if (compile_time != 2 && NR && *NR > 0) { if (strcmp(*FILENAME, "-") != 0) fprintf(stderr, " input record %s:%d", *FILENAME, (int) (*FNR)); else fprintf(stderr, " input record number %d", (int) (*FNR)); fprintf(stderr, "\n"); } if (compile_time != 2 && curnode) line = curnode->lineno; else if (compile_time != 2 && lineno) line = lineno; else line = -1; if (compile_time == 1 && cursource() != NULL){ if(line >= 0) fprintf(stderr, " source %s:%d", cursource(), line); else fprintf(stderr, " source file %s", cursource()); }else if(line >= 0) fprintf(stderr, " source line %d", line); fprintf(stderr, "\n"); eprint(); } void eprint(void) /* try to print context around error */ { char *p, *q; int c; static int been_here = 0; extern char ebuf[], *ep; if (compile_time == 2 || compile_time == 0 || been_here++ > 0) return; p = ep - 1; if (p > ebuf && *p == '\n') p--; for ( ; p > ebuf && *p != '\n' && *p != '\0'; p--) ; while (*p == '\n') p++; fprintf(stderr, " context is\n\t"); for (q=ep-1; q>=p && *q!=' ' && *q!='\t' && *q!='\n'; q--) ; for ( ; p < q; p++) if (*p) putc(*p, stderr); fprintf(stderr, " >>> "); for ( ; p < ep; p++) if (*p) putc(*p, stderr); fprintf(stderr, " <<< "); if (*ep) while ((c = input()) != '\n' && c != '\0' && c != EOF) { putc(c, stderr); bclass(c); } putc('\n', stderr); ep = ebuf; } void bclass(int c) { switch (c) { case '{': bracecnt++; break; case '}': bracecnt--; break; case '[': brackcnt++; break; case ']': brackcnt--; break; case '(': parencnt++; break; case ')': parencnt--; break; } } double errcheck(double x, char *s) { if (errno == EDOM) { errno = 0; WARNING("%s argument out of domain", s); x = 1; } else if (errno == ERANGE) { errno = 0; WARNING("%s result out of range", s); x = 1; } return x; } int isclvar(char *s) /* is s of form var=something ? */ { char *os = s; if (!isalpha(*s) && *s != '_') return 0; for ( ; *s; s++) if (!(isalnum(*s) || *s == '_')) break; return *s == '=' && s > os && *(s+1) != '='; } /* strtod is supposed to be a proper test of what's a valid number */ #include int is_number(char *s) { double r; char *ep; /* * fast could-it-be-a-number check before calling strtod, * which takes a surprisingly long time to reject non-numbers. */ switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': case '-': case '+': case '.': case 'n': /* nans */ case 'N': case 'i': /* infs */ case 'I': break; default: return 0; /* can't be a number */ } errno = 0; r = strtod(s, &ep); if (ep == s || r == HUGE_VAL || errno == ERANGE) return 0; while (*ep == ' ' || *ep == '\t' || *ep == '\n') ep++; if (*ep == '\0') return 1; else return 0; } 9base-6/awk/awk.h0000644000175000017500000001102111402154555013256 0ustar anselmanselm/* Copyright (c) Lucent Technologies 1997 All Rights Reserved */ typedef double Awkfloat; /* unsigned char is more trouble than it's worth */ typedef unsigned char uschar; #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } } #define DEBUG #ifdef DEBUG /* uses have to be doubly parenthesized */ # define dprintf(x) if (dbg) printf x #else # define dprintf(x) #endif extern char errbuf[]; extern int compile_time; /* 1 if compiling, 0 if running */ extern int safe; /* 0 => unsafe, 1 => safe */ #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ extern int recsize; /* size of current record, orig RECSIZE */ extern char **FS; extern char **RS; extern char **ORS; extern char **OFS; extern char **OFMT; extern Awkfloat *NR; extern Awkfloat *FNR; extern Awkfloat *NF; extern char **FILENAME; extern char **SUBSEP; extern Awkfloat *RSTART; extern Awkfloat *RLENGTH; extern char *record; /* points to $0 */ extern int lineno; /* line number in awk program */ extern int errorflag; /* 1 if error has occurred */ extern int donefld; /* 1 if record broken into fields */ extern int donerec; /* 1 if record is valid (no fld has changed */ extern char inputFS[]; /* FS at time of input, for field splitting */ extern int dbg; extern char *patbeg; /* beginning of pattern matched */ extern int patlen; /* length of pattern matched. set in b.c */ /* Cell: all information about a variable or constant */ typedef struct Cell { uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ uschar csub; /* CCON, CTEMP, CFLD, etc. */ char *nval; /* name, for variables only */ char *sval; /* string value */ Awkfloat fval; /* value as number */ int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ struct Cell *cnext; /* ptr to next if chained */ } Cell; typedef struct Array { /* symbol table array */ int nelem; /* elements in table right now */ int size; /* size of tab */ Cell **tab; /* hash table pointers */ } Array; #define NSYMTAB 50 /* initial size of a symbol table */ extern Array *symtab; extern Cell *nrloc; /* NR */ extern Cell *fnrloc; /* FNR */ extern Cell *nfloc; /* NF */ extern Cell *rstartloc; /* RSTART */ extern Cell *rlengthloc; /* RLENGTH */ /* Cell.tval values: */ #define NUM 01 /* number value is valid */ #define STR 02 /* string value is valid */ #define DONTFREE 04 /* string space is not freeable */ #define CON 010 /* this is a constant */ #define ARR 020 /* this is an array */ #define FCN 040 /* this is a function name */ #define FLD 0100 /* this is a field $1, $2, ... */ #define REC 0200 /* this is $0 */ /* function types */ #define FLENGTH 1 #define FSQRT 2 #define FEXP 3 #define FLOG 4 #define FINT 5 #define FSYSTEM 6 #define FRAND 7 #define FSRAND 8 #define FSIN 9 #define FCOS 10 #define FATAN 11 #define FTOUPPER 12 #define FTOLOWER 13 #define FFLUSH 14 #define FUTF 15 /* Node: parse tree is made of nodes, with Cell's at bottom */ typedef struct Node { int ntype; struct Node *nnext; int lineno; int nobj; struct Node *narg[1]; /* variable: actual size set by calling malloc */ } Node; #define NIL ((Node *) 0) extern Node *winner; extern Node *nullstat; extern Node *nullnode; /* ctypes */ #define OCELL 1 #define OBOOL 2 #define OJUMP 3 /* Cell subtypes: csub */ #define CFREE 7 #define CCOPY 6 #define CCON 5 #define CTEMP 4 #define CNAME 3 #define CVAR 2 #define CFLD 1 #define CUNK 0 /* bool subtypes */ #define BTRUE 11 #define BFALSE 12 /* jump subtypes */ #define JEXIT 21 #define JNEXT 22 #define JBREAK 23 #define JCONT 24 #define JRET 25 #define JNEXTFILE 26 /* node types */ #define NVALUE 1 #define NSTAT 2 #define NEXPR 3 extern int pairstack[], paircnt; #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) #define isvalue(n) ((n)->ntype == NVALUE) #define isexpr(n) ((n)->ntype == NEXPR) #define isjump(n) ((n)->ctype == OJUMP) #define isexit(n) ((n)->csub == JEXIT) #define isbreak(n) ((n)->csub == JBREAK) #define iscont(n) ((n)->csub == JCONT) #define isnext(n) ((n)->csub == JNEXT) #define isnextfile(n) ((n)->csub == JNEXTFILE) #define isret(n) ((n)->csub == JRET) #define isrec(n) ((n)->tval & REC) #define isfld(n) ((n)->tval & FLD) #define isstr(n) ((n)->tval & STR) #define isnum(n) ((n)->tval & NUM) #define isarr(n) ((n)->tval & ARR) #define isfcn(n) ((n)->tval & FCN) #define istrue(n) ((n)->csub == BTRUE) #define istemp(n) ((n)->csub == CTEMP) #define isargument(n) ((n)->nobj == ARG) /* #define freeable(p) (!((p)->tval & DONTFREE)) */ #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) #include "proto.h" 9base-6/awk/README0000644000175000017500000000070511402154555013212 0ustar anselmanselmThis 'awk' source is directly downloaded from the Plan 9 source http://cm.bell-labs.com/sources/plan9/sys/src/cmd/awk/ as such, it's copyright is held by Lucent Technologies and distributed under the Lucent Public License version 1.02 [http://www.opensource.org/licenses/lucent1.02.php]. Modifications were made by Jeff Sickel in order to build using Plan 9 from User Space [http://swtch.com/plan9port/] to the following files: mkfile re.c 9base-6/awk/awk.10000644000175000017500000002462511402154555013205 0ustar anselmanselm.TH AWK 1 .SH NAME awk \- pattern-directed scanning and processing language .SH SYNOPSIS .B awk [ .BI -F fs ] [ .BI -v .I var=value ] [ .BI -mr n ] [ .BI -mf n ] [ .B -f .I prog [ .I prog ] [ .I file ... ] .SH DESCRIPTION .I Awk scans each input .I file for lines that match any of a set of patterns specified literally in .IR prog or in one or more files specified as .B -f .IR file . With each pattern there can be an associated action that will be performed when a line of a .I file matches the pattern. Each line is matched against the pattern portion of every pattern-action statement; the associated action is performed for each matched pattern. The file name .L - means the standard input. Any .IR file of the form .I var=value is treated as an assignment, not a file name, and is executed at the time it would have been opened if it were a file name. The option .B -v followed by .I var=value is an assignment to be done before .I prog is executed; any number of .B -v options may be present. .B \-F .IR fs option defines the input field separator to be the regular expression .IR fs . .PP An input line is normally made up of fields separated by white space, or by regular expression .BR FS . The fields are denoted .BR $1 , .BR $2 , \&..., while .B $0 refers to the entire line. If .BR FS is null, the input line is split into one field per character. .PP To compensate for inadequate implementation of storage management, the .B \-mr option can be used to set the maximum size of the input record, and the .B \-mf option to set the maximum number of fields. .PP A pattern-action statement has the form .IP .IB pattern " { " action " } .PP A missing .BI { " action " } means print the line; a missing pattern always matches. Pattern-action statements are separated by newlines or semicolons. .PP An action is a sequence of statements. A statement can be one of the following: .PP .EX .ta \w'\fLdelete array[expression]'u if(\fI expression \fP)\fI statement \fP\fR[ \fPelse\fI statement \fP\fR]\fP while(\fI expression \fP)\fI statement\fP for(\fI expression \fP;\fI expression \fP;\fI expression \fP)\fI statement\fP for(\fI var \fPin\fI array \fP)\fI statement\fP do\fI statement \fPwhile(\fI expression \fP) break continue {\fR [\fP\fI statement ... \fP\fR] \fP} \fIexpression\fP #\fR commonly\fP\fI var = expression\fP print\fR [ \fP\fIexpression-list \fP\fR] \fP\fR[ \fP>\fI expression \fP\fR]\fP printf\fI format \fP\fR[ \fP,\fI expression-list \fP\fR] \fP\fR[ \fP>\fI expression \fP\fR]\fP return\fR [ \fP\fIexpression \fP\fR]\fP next #\fR skip remaining patterns on this input line\fP nextfile #\fR skip rest of this file, open next, start at top\fP delete\fI array\fP[\fI expression \fP] #\fR delete an array element\fP delete\fI array\fP #\fR delete all elements of array\fP exit\fR [ \fP\fIexpression \fP\fR]\fP #\fR exit immediately; status is \fP\fIexpression\fP .EE .DT .PP Statements are terminated by semicolons, newlines or right braces. An empty .I expression-list stands for .BR $0 . String constants are quoted \&\fL"\ "\fR, with the usual C escapes recognized within. Expressions take on string or numeric values as appropriate, and are built using the operators .B + \- * / % ^ (exponentiation), and concatenation (indicated by white space). The operators .B ! ++ \-\- += \-= *= /= %= ^= > >= < <= == != ?: are also available in expressions. Variables may be scalars, array elements (denoted .IB x [ i ] ) or fields. Variables are initialized to the null string. Array subscripts may be any string, not necessarily numeric; this allows for a form of associative memory. Multiple subscripts such as .B [i,j,k] are permitted; the constituents are concatenated, separated by the value of .BR SUBSEP . .PP The .B print statement prints its arguments on the standard output (or on a file if .BI > file or .BI >> file is present or on a pipe if .BI | cmd is present), separated by the current output field separator, and terminated by the output record separator. .I file and .I cmd may be literal names or parenthesized expressions; identical string values in different statements denote the same open file. The .B printf statement formats its expression list according to the format (see .IR fprintf (2)) . The built-in function .BI close( expr ) closes the file or pipe .IR expr . The built-in function .BI fflush( expr ) flushes any buffered output for the file or pipe .IR expr . .PP The mathematical functions .BR exp , .BR log , .BR sqrt , .BR sin , .BR cos , and .BR atan2 are built in. Other built-in functions: .TF length .TP .B length the length of its argument taken as a string, or of .B $0 if no argument. .TP .B rand random number on (0,1) .TP .B srand sets seed for .B rand and returns the previous seed. .TP .B int truncates to an integer value .TP .B utf converts its numerical argument, a character number, to a .SM UTF string .TP .BI substr( s , " m" , " n\fL) the .IR n -character substring of .I s that begins at position .IR m counted from 1. .TP .BI index( s , " t" ) the position in .I s where the string .I t occurs, or 0 if it does not. .TP .BI match( s , " r" ) the position in .I s where the regular expression .I r occurs, or 0 if it does not. The variables .B RSTART and .B RLENGTH are set to the position and length of the matched string. .TP .BI split( s , " a" , " fs\fL) splits the string .I s into array elements .IB a [1]\f1, .IB a [2]\f1, \&..., .IB a [ n ]\f1, and returns .IR n . The separation is done with the regular expression .I fs or with the field separator .B FS if .I fs is not given. An empty string as field separator splits the string into one array element per character. .TP .BI sub( r , " t" , " s\fL) substitutes .I t for the first occurrence of the regular expression .I r in the string .IR s . If .I s is not given, .B $0 is used. .TP .B gsub same as .B sub except that all occurrences of the regular expression are replaced; .B sub and .B gsub return the number of replacements. .TP .BI sprintf( fmt , " expr" , " ...\fL) the string resulting from formatting .I expr ... according to the .I printf format .I fmt .TP .BI system( cmd ) executes .I cmd and returns its exit status .TP .BI tolower( str ) returns a copy of .I str with all upper-case characters translated to their corresponding lower-case equivalents. .TP .BI toupper( str ) returns a copy of .I str with all lower-case characters translated to their corresponding upper-case equivalents. .PD .PP The ``function'' .B getline sets .B $0 to the next input record from the current input file; .B getline .BI < file sets .B $0 to the next record from .IR file . .B getline .I x sets variable .I x instead. Finally, .IB cmd " | getline pipes the output of .I cmd into .BR getline ; each call of .B getline returns the next line of output from .IR cmd . In all cases, .B getline returns 1 for a successful input, 0 for end of file, and \-1 for an error. .PP Patterns are arbitrary Boolean combinations (with .BR "! || &&" ) of regular expressions and relational expressions. Regular expressions are as in .IR regexp (6). Isolated regular expressions in a pattern apply to the entire line. Regular expressions may also occur in relational expressions, using the operators .BR ~ and .BR !~ . .BI / re / is a constant regular expression; any string (constant or variable) may be used as a regular expression, except in the position of an isolated regular expression in a pattern. .PP A pattern may consist of two patterns separated by a comma; in this case, the action is performed for all lines from an occurrence of the first pattern though an occurrence of the second. .PP A relational expression is one of the following: .IP .I expression matchop regular-expression .br .I expression relop expression .br .IB expression " in " array-name .br .BI ( expr , expr,... ") in " array-name .PP where a .I relop is any of the six relational operators in C, and a .I matchop is either .B ~ (matches) or .B !~ (does not match). A conditional is an arithmetic expression, a relational expression, or a Boolean combination of these. .PP The special patterns .B BEGIN and .B END may be used to capture control before the first input line is read and after the last. .B BEGIN and .B END do not combine with other patterns. .PP Variable names with special meanings: .TF FILENAME .TP .B CONVFMT conversion format used when converting numbers (default .BR "%.6g" ) .TP .B FS regular expression used to separate fields; also settable by option .BI \-F fs\f1. .TP .BR NF number of fields in the current record .TP .B NR ordinal number of the current record .TP .B FNR ordinal number of the current record in the current file .TP .B FILENAME the name of the current input file .TP .B RS input record separator (default newline) .TP .B OFS output field separator (default blank) .TP .B ORS output record separator (default newline) .TP .B OFMT output format for numbers (default .BR "%.6g" ) .TP .B SUBSEP separates multiple subscripts (default 034) .TP .B ARGC argument count, assignable .TP .B ARGV argument array, assignable; non-null members are taken as file names .TP .B ENVIRON array of environment variables; subscripts are names. .PD .PP Functions may be defined (at the position of a pattern-action statement) thus: .IP .L function foo(a, b, c) { ...; return x } .PP Parameters are passed by value if scalar and by reference if array name; functions may be called recursively. Parameters are local to the function; all other variables are global. Thus local variables may be created by providing excess parameters in the function definition. .SH EXAMPLES .TP .L length($0) > 72 Print lines longer than 72 characters. .TP .L { print $2, $1 } Print first two fields in opposite order. .PP .EX BEGIN { FS = ",[ \et]*|[ \et]+" } { print $2, $1 } .EE .ns .IP Same, with input fields separated by comma and/or blanks and tabs. .PP .EX { s += $1 } END { print "sum is", s, " average is", s/NR } .EE .ns .IP Add up first column, print sum and average. .TP .L /start/, /stop/ Print all lines between start/stop pairs. .PP .EX BEGIN { # Simulate echo(1) for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] printf "\en" exit } .EE .SH SOURCE .B /sys/src/cmd/awk .SH SEE ALSO .IR sed (1), .IR regexp (6), .br A. V. Aho, B. W. Kernighan, P. J. Weinberger, .I The AWK Programming Language, Addison-Wesley, 1988. ISBN 0-201-07981-X .SH BUGS There are no explicit conversions between numbers and strings. To force an expression to be treated as a number add 0 to it; to force it to be treated as a string concatenate \&\fL""\fP to it. .br The scope rules for variables in functions are a botch; the syntax is worse. 9base-6/lib9/0000755000175000017500000000000011402154555012405 5ustar anselmanselm9base-6/lib9/atexit.c0000644000175000017500000000135211402154555014050 0ustar anselmanselm#include #include #define NEXIT 33 static Lock onexlock; static struct { void (*f)(void); int pid; }onex[NEXIT]; int atexit(void (*f)(void)) { int i; lock(&onexlock); for(i=0; i= 0; i--) if((f = onex[i].f) && pid == onex[i].pid) { onex[i].f = 0; (*f)(); } if(s == 0 || *s == 0) exit(0); exit(exitcode(s)); } 9base-6/lib9/read9pmsg.c0000644000175000017500000000071611402154555014450 0ustar anselmanselm#include #include #include int read9pmsg(int fd, void *abuf, uint n) { int m, len; uchar *buf; buf = abuf; /* read count */ m = readn(fd, buf, BIT32SZ); if(m != BIT32SZ){ if(m < 0) return -1; return 0; } len = GBIT32(buf); if(len <= BIT32SZ || len > n){ werrstr("bad length in 9P2000 message header"); return -1; } len -= BIT32SZ; m = readn(fd, buf+BIT32SZ, len); if(m < len) return 0; return BIT32SZ+m; } 9base-6/lib9/create.c0000644000175000017500000000255111402154555014017 0ustar anselmanselm#define _GNU_SOURCE /* for Linux O_DIRECT */ #include #define NOPLAN9DEFINES #include #include #include #include #include #ifndef O_DIRECT #define O_DIRECT 0 #endif int p9create(char *path, int mode, ulong perm) { int fd, cexec, umode, rclose, lock, rdwr; struct flock fl; rdwr = mode&3; lock = mode&OLOCK; cexec = mode&OCEXEC; rclose = mode&ORCLOSE; mode &= ~(ORCLOSE|OCEXEC|OLOCK); /* XXX should get mode mask right? */ fd = -1; if(perm&DMDIR){ if(mode != OREAD){ werrstr("bad mode in directory create"); goto out; } if(mkdir(path, perm&0777) < 0) goto out; fd = open(path, O_RDONLY); }else{ umode = (mode&3)|O_CREAT|O_TRUNC; mode &= ~(3|OTRUNC); if(mode&ODIRECT){ umode |= O_DIRECT; mode &= ~ODIRECT; } if(mode&OEXCL){ umode |= O_EXCL; mode &= ~OEXCL; } if(mode&OAPPEND){ umode |= O_APPEND; mode &= ~OAPPEND; } if(mode){ werrstr("unsupported mode in create"); goto out; } fd = open(path, umode, perm); } out: if(fd >= 0){ if(lock){ fl.l_type = (rdwr==OREAD) ? F_RDLCK : F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; if(fcntl(fd, F_SETLK, &fl) < 0){ close(fd); werrstr("lock: %r"); return -1; } } if(cexec) fcntl(fd, F_SETFL, FD_CLOEXEC); if(rclose) remove(path); } return fd; } 9base-6/lib9/lib9.h0000644000175000017500000000004111402154555013410 0ustar anselmanselm#include #include 9base-6/lib9/atoi.c0000644000175000017500000000012211402154555013500 0ustar anselmanselm#include #include int atoi(char *s) { return strtol(s, 0, 0); } 9base-6/lib9/convM2D.c0000644000175000017500000000370611402154555014027 0ustar anselmanselm#include #include #include int statchecku(uchar *buf, uint nbuf, int dotu) { uchar *ebuf; int i, nstr; ebuf = buf + nbuf; if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf)) return -1; buf += STATFIXLEN - 4 * BIT16SZ; nstr = 4; if(dotu) nstr = 5; for(i = 0; i < nstr; i++){ if(buf + BIT16SZ > ebuf) return -1; buf += BIT16SZ + GBIT16(buf); } if(dotu) buf += 3*BIT32SZ; if(buf != ebuf) return -1; return 0; } int statcheck(uchar *buf, uint nbuf) { return statchecku(buf, nbuf, 0); } static char nullstring[] = ""; uint convM2Du(uchar *buf, uint nbuf, Dir *d, char *strs, int dotu) { uchar *p, *ebuf; char *sv[5]; int i, ns, nstr; if(nbuf < STATFIXLEN) return 0; p = buf; ebuf = buf + nbuf; p += BIT16SZ; /* ignore size */ d->type = GBIT16(p); p += BIT16SZ; d->dev = GBIT32(p); p += BIT32SZ; d->qid.type = GBIT8(p); p += BIT8SZ; d->qid.vers = GBIT32(p); p += BIT32SZ; d->qid.path = GBIT64(p); p += BIT64SZ; d->mode = GBIT32(p); p += BIT32SZ; d->atime = GBIT32(p); p += BIT32SZ; d->mtime = GBIT32(p); p += BIT32SZ; d->length = GBIT64(p); p += BIT64SZ; nstr = 4; if(dotu) nstr = 5; for(i = 0; i < nstr; i++){ if(p + BIT16SZ > ebuf) return 0; ns = GBIT16(p); p += BIT16SZ; if(p + ns > ebuf) return 0; if(strs){ sv[i] = strs; memmove(strs, p, ns); strs += ns; *strs++ = '\0'; } p += ns; } if(dotu){ if(p + BIT32SZ*3 > ebuf) return 0; d->uidnum = GBIT32(p); p += BIT32SZ; d->gidnum = GBIT32(p); p += BIT32SZ; d->muidnum = GBIT32(p); p += BIT32SZ; } if(strs){ d->name = sv[0]; d->uid = sv[1]; d->gid = sv[2]; d->muid = sv[3]; d->ext = nullstring; if(dotu) d->ext = sv[4]; }else{ d->name = nullstring; d->uid = nullstring; d->gid = nullstring; d->muid = nullstring; d->ext = nullstring; } return p - buf; } uint convM2D(uchar *buf, uint nbuf, Dir *d, char *strs) { return convM2Du(buf, nbuf, d, strs, 0); } 9base-6/lib9/pipe.c0000644000175000017500000000050011402154555013501 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include /* * We use socketpair to get a two-way pipe. * The pipe still doesn't preserve message boundaries. * Worse, it cannot be reopened via /dev/fd/NNN on Linux. */ int p9pipe(int fd[2]) { return socketpair(AF_UNIX, SOCK_STREAM, 0, fd); } 9base-6/lib9/regexp.h0000644000175000017500000000002511402154555014045 0ustar anselmanselm#include 9base-6/lib9/lock.c0000644000175000017500000000155111402154555013503 0ustar anselmanselm#include #include #include #include #include #include static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER; static void lockinit(Lock *lk) { pthread_mutexattr_t attr; pthread_mutex_lock(&initmutex); if(lk->init == 0){ pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); pthread_mutex_init(&lk->mutex, &attr); pthread_mutexattr_destroy(&attr); lk->init = 1; } pthread_mutex_unlock(&initmutex); } void lock(Lock *lk) { if(!lk->init) lockinit(lk); if(pthread_mutex_lock(&lk->mutex) != 0) abort(); } int canlock(Lock *lk) { int r; if(!lk->init) lockinit(lk); r = pthread_mutex_trylock(&lk->mutex); if(r == 0) return 1; if(r == EBUSY) return 0; abort(); } void unlock(Lock *lk) { if(pthread_mutex_unlock(&lk->mutex) != 0) abort(); } 9base-6/lib9/lrand.c0000644000175000017500000000213111402154555013646 0ustar anselmanselm#include #include /* * algorithm by * D. P. Mitchell & J. A. Reeds */ #define LEN 607 #define TAP 273 #define MASK 0x7fffffffL #define A 48271 #define M 2147483647 #define Q 44488 #define R 3399 #define NORM (1.0/(1.0+MASK)) static ulong rng_vec[LEN]; static ulong* rng_tap = rng_vec; static ulong* rng_feed = 0; static Lock lk; static void isrand(long seed) { long lo, hi, x; int i; rng_tap = rng_vec; rng_feed = rng_vec+LEN-TAP; seed = seed%M; if(seed < 0) seed += M; if(seed == 0) seed = 89482311; x = seed; /* * Initialize by x[n+1] = 48271 * x[n] mod (2**31 - 1) */ for(i = -20; i < LEN; i++) { hi = x / Q; lo = x % Q; x = A*lo - R*hi; if(x < 0) x += M; if(i >= 0) rng_vec[i] = x; } } void p9srand(long seed) { lock(&lk); isrand(seed); unlock(&lk); } long p9lrand(void) { ulong x; lock(&lk); rng_tap--; if(rng_tap < rng_vec) { if(rng_feed == 0) { isrand(1); rng_tap--; } rng_tap += LEN; } rng_feed--; if(rng_feed < rng_vec) rng_feed += LEN; x = (*rng_feed + *rng_tap) & MASK; *rng_feed = x; unlock(&lk); return x; } 9base-6/lib9/fmtlock2.c0000644000175000017500000000022111402154555014265 0ustar anselmanselm#include #include static Lock fmtlock; void __fmtlock(void) { lock(&fmtlock); } void __fmtunlock(void) { unlock(&fmtlock); } 9base-6/lib9/open.c0000644000175000017500000000207211402154555013513 0ustar anselmanselm#define _GNU_SOURCE /* for Linux O_DIRECT */ #include #define NOPLAN9DEFINES #include #include #ifndef O_DIRECT #define O_DIRECT 0 #endif int p9open(char *name, int mode) { int cexec, rclose; int fd, umode, lock, rdwr; struct flock fl; rdwr = mode&3; umode = rdwr; cexec = mode&OCEXEC; rclose = mode&ORCLOSE; lock = mode&OLOCK; mode &= ~(3|OCEXEC|ORCLOSE|OLOCK); if(mode&OTRUNC){ umode |= O_TRUNC; mode ^= OTRUNC; } if(mode&ODIRECT){ umode |= O_DIRECT; mode ^= ODIRECT; } if(mode&ONONBLOCK){ umode |= O_NONBLOCK; mode ^= ONONBLOCK; } if(mode&OAPPEND){ umode |= O_APPEND; mode ^= OAPPEND; } if(mode){ werrstr("mode 0x%x not supported", mode); return -1; } fd = open(name, umode); if(fd >= 0){ if(lock){ fl.l_type = (rdwr==OREAD) ? F_RDLCK : F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; if(fcntl(fd, F_SETLK, &fl) < 0){ close(fd); werrstr("lock: %r"); return -1; } } if(cexec) fcntl(fd, F_SETFL, FD_CLOEXEC); if(rclose) remove(name); } return fd; } 9base-6/lib9/dup.c0000644000175000017500000000021011402154555013332 0ustar anselmanselm#include #include #undef dup int p9dup(int old, int new) { if(new == -1) return dup(old); return dup2(old, new); } 9base-6/lib9/sysfatal.c0000644000175000017500000000050311402154555014375 0ustar anselmanselm#include void (*_sysfatal)(char*, ...); void sysfatal(char *fmt, ...) { char buf[256]; va_list arg; va_start(arg, fmt); if(_sysfatal) (*_sysfatal)(fmt, arg); vseprint(buf, buf+sizeof buf, fmt, arg); va_end(arg); __fixargv0(); fprint(2, "%s: %s\n", argv0 ? argv0 : "", buf); exits("fatal"); } 9base-6/lib9/unsharp.c0000644000175000017500000000163711402154555014240 0ustar anselmanselm#include #include /* * I don't want too many of these, * but the ones we have are just too useful. */ static struct { char *old; char *new; } replace[] = { "#9", nil, /* must be first */ "#d", "/dev/fd", }; char* unsharp(char *old) { char *new; int i, olen, nlen, len; if(replace[0].new == nil) replace[0].new = get9root(); for(i=0; i #include #include int netcrypt(void *key, void *chal) { uchar buf[8], *p; strncpy((char*)buf, chal, 7); buf[7] = '\0'; for(p = buf; *p && *p != '\n'; p++) ; *p = '\0'; encrypt(key, buf, 8); sprint(chal, "%.2ux%.2ux%.2ux%.2ux", buf[0], buf[1], buf[2], buf[3]); return 1; } 9base-6/lib9/searchpath.c0000644000175000017500000000210611402154555014672 0ustar anselmanselm#include #include /* * Search $PATH for an executable with the given name. * Like in rc, mid-name slashes do not disable search. * Should probably handle escaped colons, * but I don't know what the syntax is. */ char* searchpath(char *name) { char *path, *p, *next; char *s, *ss; int ns, l; s = nil; ns = 0; if((name[0] == '.' && name[1] == '/') || (name[0] == '.' && name[1] == '.' && name[2] == '/') || (name[0] == '/')){ if(access(name, AEXEC) >= 0) return strdup(name); return nil; } path = getenv("PATH"); for(p=path; p && *p; p=next){ if((next = strchr(p, ':')) != nil) *next++ = 0; if(*p == 0){ if(access(name, AEXEC) >= 0){ free(s); free(path); return strdup(name); } }else{ l = strlen(p)+1+strlen(name)+1; if(l > ns){ ss = realloc(s, l); if(ss == nil){ free(s); free(path); return nil; } s = ss; ns = l; } strcpy(s, p); strcat(s, "/"); strcat(s, name); if(access(s, AEXEC) >= 0){ free(path); return s; } } } free(s); free(path); return nil; } 9base-6/lib9/lnrand.c0000644000175000017500000000030211402154555014022 0ustar anselmanselm#include #include #define MASK 0x7fffffffL long lnrand(long n) { long slop, v; if(n < 0) return n; slop = MASK % n; do v = lrand(); while(v <= slop); return v % n; } 9base-6/lib9/debugmalloc.c0000644000175000017500000000576211402154555015041 0ustar anselmanselm#include #define NOPLAN9DEFINES #include /* * The Unix libc routines cannot be trusted to do their own locking. * Sad but apparently true. */ static Lock malloclock; static int mallocpid; /* * The Unix mallocs don't do nearly enough error checking * for my tastes. We'll waste another 24 bytes per guy so that * we can. This is severely antisocial, since now free and p9free * are not interchangeable. */ int debugmalloc; #define Overhead (debugmalloc ? (6*sizeof(ulong)) : 0) #define MallocMagic 0xA110C09 #define ReallocMagic 0xB110C09 #define CallocMagic 0xC110C09 #define FreeMagic 0xF533F533 #define CheckMagic 0 #define END "\x7F\x2E\x55\x23" static void whoops(void *v) { fprint(2, "bad malloc block %p\n", v); abort(); } static void* mark(void *v, ulong pc, ulong n, ulong magic) { ulong *u; char *p; if(!debugmalloc) return v; if(v == nil) return nil; if(magic == FreeMagic || magic == CheckMagic){ u = (ulong*)((char*)v-4*sizeof(ulong)); if(u[0] != MallocMagic && u[0] != ReallocMagic && u[0] != CallocMagic) whoops(v); n = u[1]; p = (char*)v+n; if(memcmp(p, END, 4) != 0) whoops(v); if(magic != CheckMagic){ u[0] = FreeMagic; u[1] = u[2] = u[3] = pc; if(n > 16){ u[4] = u[5] = u[6] = u[7] = pc; memset((char*)v+16, 0xFB, n-16); } } return u; }else{ u = v; u[0] = magic; u[1] = n; u[2] = 0; u[3] = 0; if(magic == ReallocMagic) u[3] = pc; else u[2] = pc; p = (char*)(u+4)+n; memmove(p, END, 4); return u+4; } } void setmalloctag(void *v, ulong t) { ulong *u; if(!debugmalloc) return; if(v == nil) return; u = mark(v, 0, 0, 0); u[2] = t; } void setrealloctag(void *v, ulong t) { ulong *u; if(!debugmalloc) return; if(v == nil) return; u = mark(v, 0, 0, 0); u[3] = t; } void* p9malloc(ulong n) { void *v; if(n == 0) n++; /*fprint(2, "%s %d malloc\n", argv0, getpid()); */ lock(&malloclock); mallocpid = getpid(); v = malloc(n+Overhead); v = mark(v, getcallerpc(&n), n, MallocMagic); unlock(&malloclock); /*fprint(2, "%s %d donemalloc\n", argv0, getpid()); */ return v; } void p9free(void *v) { if(v == nil) return; /*fprint(2, "%s %d free\n", argv0, getpid()); */ lock(&malloclock); mallocpid = getpid(); v = mark(v, getcallerpc(&v), 0, FreeMagic); free(v); unlock(&malloclock); /*fprint(2, "%s %d donefree\n", argv0, getpid()); */ } void* p9calloc(ulong a, ulong b) { void *v; /*fprint(2, "%s %d calloc\n", argv0, getpid()); */ lock(&malloclock); mallocpid = getpid(); v = calloc(a*b+Overhead, 1); v = mark(v, getcallerpc(&a), a*b, CallocMagic); unlock(&malloclock); /*fprint(2, "%s %d donecalloc\n", argv0, getpid()); */ return v; } void* p9realloc(void *v, ulong n) { /*fprint(2, "%s %d realloc\n", argv0, getpid()); */ lock(&malloclock); mallocpid = getpid(); v = mark(v, getcallerpc(&v), 0, CheckMagic); v = realloc(v, n+Overhead); v = mark(v, getcallerpc(&v), n, ReallocMagic); unlock(&malloclock); /*fprint(2, "%s %d donerealloc\n", argv0, getpid()); */ return v; } 9base-6/lib9/_p9dialparse.c0000644000175000017500000000656111402154555015135 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include #include static char *nets[] = { "tcp", "udp", nil }; #define CLASS(p) ((*(uchar*)(p))>>6) static struct { char *net; char *service; int port; } porttbl[] = { "tcp", "9fs", 564, "tcp", "whoami", 565, "tcp", "guard", 566, "tcp", "ticket", 567, "tcp", "exportfs", 17007, "tcp", "rexexec", 17009, "tcp", "ncpu", 17010, "tcp", "cpu", 17013, "tcp", "venti", 17034, "tcp", "wiki", 17035, "tcp", "secstore", 5356, "udp", "dns", 53, "tcp", "dns", 53, }; static int parseip(char *host, u32int *pip) { uchar addr[4]; int x, i; char *p; p = host; for(i=0; i<4 && *p; i++){ x = strtoul(p, &p, 0); if(x < 0 || x >= 256) return -1; if(*p != '.' && *p != 0) return -1; if(*p == '.') p++; addr[i] = x; } switch(CLASS(addr)){ case 0: case 1: if(i == 3){ addr[3] = addr[2]; addr[2] = addr[1]; addr[1] = 0; }else if(i == 2){ addr[3] = addr[1]; addr[2] = 0; addr[1] = 0; }else if(i != 4) return -1; break; case 2: if(i == 3){ addr[3] = addr[2]; addr[2] = 0; }else if(i != 4) return -1; break; } *pip = *(u32int*)addr; return 0; } int p9dialparse(char *addr, char **pnet, char **punix, u32int *phost, int *pport) { char *net, *host, *port, *e; int i; struct servent *se; struct hostent *he; struct sockaddr_un *sockun; *punix = nil; net = addr; if((host = strchr(net, '!')) == nil){ werrstr("malformed address"); return -1; } *host++ = 0; if((port = strchr(host, '!')) == nil){ if(strcmp(net, "unix")==0 || strcmp(net, "net")==0){ Unix: if(strlen(host)+1 > sizeof sockun->sun_path){ werrstr("unix socket name too long"); return -1; } *punix = host; *pnet = "unix"; *phost = 0; *pport = 0; return 0; } werrstr("malformed address"); return -1; } *port++ = 0; if(*host == 0){ werrstr("malformed address (empty host)"); return -1; } if(*port == 0){ werrstr("malformed address (empty port)"); return -1; } if(strcmp(net, "unix") == 0) goto Unix; if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0 && strcmp(net, "net") != 0){ werrstr("bad network %s!%s!%s", net, host, port); return -1; } /* translate host */ if(strcmp(host, "*") == 0) *phost = 0; else if(parseip(host, phost) == 0) {} else if((he = gethostbyname(host)) != nil) *phost = *(u32int*)(he->h_addr); else{ werrstr("unknown host %s", host); return -1; } /* translate network and port; should return list rather than first */ if(strcmp(net, "net") == 0){ for(i=0; nets[i]; i++){ if((se = getservbyname(port, nets[i])) != nil){ *pnet = nets[i]; *pport = ntohs(se->s_port); return 0; } } } for(i=0; is_port); return 0; } werrstr("unknown service %s!*!%s", net, port); return -1; } 9base-6/lib9/jmp.c0000644000175000017500000000034011402154555013334 0ustar anselmanselm#include #define NOPLAN9DEFINES #include void p9longjmp(p9jmp_buf buf, int val) { siglongjmp((void*)buf, val); } void p9notejmp(void *x, p9jmp_buf buf, int val) { USED(x); siglongjmp((void*)buf, val); } 9base-6/lib9/pin.c0000644000175000017500000000016411402154555013340 0ustar anselmanselm#include #include static void nop(void) { } void (*_pin)(void) = nop; void (*_unpin)(void) = nop; 9base-6/lib9/qlock.c0000644000175000017500000000433411402154555013666 0ustar anselmanselm#include #include /* * The function pointers are supplied by the thread * library during its initialization. If there is no thread * library, there is no multithreading. */ int (*_lock)(Lock*, int, ulong); void (*_unlock)(Lock*, ulong); int (*_qlock)(QLock*, int, ulong); /* do not use */ void (*_qunlock)(QLock*, ulong); void (*_rsleep)(Rendez*, ulong); /* do not use */ int (*_rwakeup)(Rendez*, int, ulong); int (*_rlock)(RWLock*, int, ulong); /* do not use */ int (*_wlock)(RWLock*, int, ulong); void (*_runlock)(RWLock*, ulong); void (*_wunlock)(RWLock*, ulong); void lock(Lock *l) { if(_lock) (*_lock)(l, 1, getcallerpc(&l)); else l->held = 1; } int canlock(Lock *l) { if(_lock) return (*_lock)(l, 0, getcallerpc(&l)); else{ if(l->held) return 0; l->held = 1; return 1; } } void unlock(Lock *l) { if(_unlock) (*_unlock)(l, getcallerpc(&l)); else l->held = 0; } void qlock(QLock *l) { if(_qlock) (*_qlock)(l, 1, getcallerpc(&l)); else l->l.held = 1; } int canqlock(QLock *l) { if(_qlock) return (*_qlock)(l, 0, getcallerpc(&l)); else{ if(l->l.held) return 0; l->l.held = 1; return 1; } } void qunlock(QLock *l) { if(_qunlock) (*_qunlock)(l, getcallerpc(&l)); else l->l.held = 0; } void rlock(RWLock *l) { if(_rlock) (*_rlock)(l, 1, getcallerpc(&l)); else l->readers++; } int canrlock(RWLock *l) { if(_rlock) return (*_rlock)(l, 0, getcallerpc(&l)); else{ if(l->writer) return 0; l->readers++; return 1; } } void runlock(RWLock *l) { if(_runlock) (*_runlock)(l, getcallerpc(&l)); else l->readers--; } void wlock(RWLock *l) { if(_wlock) (*_wlock)(l, 1, getcallerpc(&l)); else l->writer = (void*)1; } int canwlock(RWLock *l) { if(_wlock) return (*_wlock)(l, 0, getcallerpc(&l)); else{ if(l->writer || l->readers) return 0; l->writer = (void*)1; return 1; } } void wunlock(RWLock *l) { if(_wunlock) (*_wunlock)(l, getcallerpc(&l)); else l->writer = nil; } void rsleep(Rendez *r) { if(_rsleep) (*_rsleep)(r, getcallerpc(&r)); } int rwakeup(Rendez *r) { if(_rwakeup) return (*_rwakeup)(r, 0, getcallerpc(&r)); return 0; } int rwakeupall(Rendez *r) { if(_rwakeup) return (*_rwakeup)(r, 1, getcallerpc(&r)); return 0; } 9base-6/lib9/time.c0000644000175000017500000000163011402154555013507 0ustar anselmanselm#include #include #include #include #define NOPLAN9DEFINES #include long p9times(long *t) { struct rusage ru, cru; if(getrusage(0, &ru) < 0 || getrusage(-1, &cru) < 0) return -1; t[0] = ru.ru_utime.tv_sec*1000 + ru.ru_utime.tv_usec/1000; t[1] = ru.ru_stime.tv_sec*1000 + ru.ru_stime.tv_usec/1000; t[2] = cru.ru_utime.tv_sec*1000 + cru.ru_utime.tv_usec/1000; t[3] = cru.ru_stime.tv_sec*1000 + cru.ru_stime.tv_usec/1000; /* BUG */ return t[0]+t[1]+t[2]+t[3]; } double p9cputime(void) { long t[4]; double d; if(p9times(t) < 0) return -1.0; d = (double)t[0]+(double)t[1]+(double)t[2]+(double)t[3]; return d/1000.0; } vlong p9nsec(void) { struct timeval tv; if(gettimeofday(&tv, 0) < 0) return -1; return (vlong)tv.tv_sec*1000*1000*1000 + tv.tv_usec*1000; } long p9time(long *tt) { long t; t = time(0); if(tt) *tt = t; return t; } 9base-6/lib9/st4nkO6D0000644000175000017500000000001011402154555013673 0ustar anselmanselm! 9base-6/lib9/post9p.c0000644000175000017500000000276311402154555014017 0ustar anselmanselm#include #include int chattyfuse; int post9pservice(int fd, char *name, char *mtpt) { int i, pid; char *ns, *addr; Waitmsg *w; if(name == nil && mtpt == nil){ close(fd); werrstr("nothing to do"); return -1; } if(name){ if(strchr(name, '!')) /* assume is already network address */ addr = strdup(name); else{ if((ns = getns()) == nil) return -1; addr = smprint("unix!%s/%s", ns, name); free(ns); } if(addr == nil) return -1; switch(pid = fork()){ case -1: return -1; case 0: dup(fd, 0); dup(fd, 1); for(i=3; i<20; i++) close(i); execlp("9pserve", "9pserve", "-u", addr, (char*)0); fprint(2, "exec 9pserve: %r\n"); _exits("exec"); } close(fd); w = waitfor(pid); if(w == nil) return -1; if(w->msg && w->msg[0]){ free(w); werrstr("9pserve failed"); return -1; } free(w); if(mtpt){ /* reopen */ if((fd = dial(addr, nil, nil, nil)) < 0){ werrstr("cannot reopen for mount: %r"); return -1; } } free(addr); } if(mtpt){ switch(pid = rfork(RFFDG|RFPROC|RFNOWAIT)){ case -1: return -1; case 0: dup(fd, 0); for(i=3; i<20; i++) close(i); /* Try v9fs on Linux, which will mount 9P directly. */ execlp("mount9p", "mount9p", "-", mtpt, (char*)0); if(chattyfuse) execlp("9pfuse", "9pfuse", "-D", "-", mtpt, (char*)0); else execlp("9pfuse", "9pfuse", "-", mtpt, (char*)0); fprint(2, "exec 9pfuse: %r\n"); _exits("exec"); } close(fd); } return 0; } 9base-6/lib9/get9root.c0000644000175000017500000000031411402154555014323 0ustar anselmanselm#include #include char* get9root(void) { static char *s; if(s) return s; if((s = getenv("PLAN9")) != 0) return s; /* could do better - search $PATH */ s = PREFIX; return s; } 9base-6/lib9/dirread.c0000644000175000017500000000647611402154555014200 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*); #if defined(__linux__) || defined(__FreeBSD_kernel__) static int mygetdents(int fd, struct dirent *buf, int n) { off_t off; int nn; /* This doesn't match the man page, but it works in Debian with a 2.2 kernel */ off = p9seek(fd, 0, 1); nn = getdirentries(fd, (void*)buf, n, &off); return nn; } #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) static int mygetdents(int fd, struct dirent *buf, int n) { long off; return getdirentries(fd, (void*)buf, n, &off); } #elif defined(__sun__) || defined(__NetBSD__) static int mygetdents(int fd, struct dirent *buf, int n) { return getdents(fd, (void*)buf, n); } #elif defined(__AIX__) static int mygetdents(int fd, struct dirent *buf, int n) { return getdirent(fd, (void*)buf, n); } #endif static int countde(char *p, int n) { char *e; int m; struct dirent *de; e = p+n; m = 0; while(p < e){ de = (struct dirent*)p; if(de->d_reclen <= 4+2+2+1 || p+de->d_reclen > e) break; if(de->d_name[0]=='.' && de->d_name[1]==0) de->d_name[0] = 0; else if(de->d_name[0]=='.' && de->d_name[1]=='.' && de->d_name[2]==0) de->d_name[0] = 0; m++; p += de->d_reclen; } return m; } static int dirpackage(int fd, char *buf, int n, Dir **dp) { int oldwd; char *p, *str, *estr; int i, nstr, m; struct dirent *de; struct stat st, lst; Dir *d; n = countde(buf, n); if(n <= 0) return n; if((oldwd = open(".", O_RDONLY)) < 0) return -1; if(fchdir(fd) < 0) return -1; p = buf; nstr = 0; for(i=0; id_name[0] == 0) /* nothing */ {} else if(lstat(de->d_name, &lst) < 0) de->d_name[0] = 0; else{ st = lst; if(S_ISLNK(lst.st_mode)) stat(de->d_name, &st); nstr += _p9dir(&lst, &st, de->d_name, nil, nil, nil); } p += de->d_reclen; } d = malloc(sizeof(Dir)*n+nstr); if(d == nil){ fchdir(oldwd); close(oldwd); return -1; } str = (char*)&d[n]; estr = str+nstr; p = buf; m = 0; for(i=0; id_name[0] != 0 && lstat(de->d_name, &lst) >= 0){ st = lst; if((lst.st_mode&S_IFMT) == S_IFLNK) stat(de->d_name, &st); _p9dir(&lst, &st, de->d_name, &d[m++], &str, estr); } p += de->d_reclen; } fchdir(oldwd); close(oldwd); *dp = d; return m; } long dirread(int fd, Dir **dp) { char *buf; struct stat st; int n; *dp = 0; if(fstat(fd, &st) < 0) return -1; if(st.st_blksize < 8192) st.st_blksize = 8192; buf = malloc(st.st_blksize); if(buf == nil) return -1; n = mygetdents(fd, (void*)buf, st.st_blksize); if(n < 0){ free(buf); return -1; } n = dirpackage(fd, buf, n, dp); free(buf); return n; } long dirreadall(int fd, Dir **d) { uchar *buf, *nbuf; long n, ts; struct stat st; if(fstat(fd, &st) < 0) return -1; if(st.st_blksize < 8192) st.st_blksize = 8192; buf = nil; ts = 0; for(;;){ nbuf = realloc(buf, ts+st.st_blksize); if(nbuf == nil){ free(buf); return -1; } buf = nbuf; n = mygetdents(fd, (void*)(buf+ts), st.st_blksize); if(n <= 0) break; ts += n; } if(ts >= 0) ts = dirpackage(fd, (char*)buf, ts, d); free(buf); if(ts == 0 && n < 0) return -1; return ts; } 9base-6/lib9/getcallerpc-ppc.c0000644000175000017500000000011711402154555015615 0ustar anselmanselm#include ulong getcallerpc(void *x) { return (((ulong*)(x))[-4]); } 9base-6/lib9/getns.c0000644000175000017500000000324611402154555013676 0ustar anselmanselm#include #include #include static int isme(char *uid) { int n; char *p; n = strtol(uid, &p, 10); if(*p == 0 && p > uid) return n == getuid(); return strcmp(getuser(), uid) == 0; } /* * Absent other hints, it works reasonably well to use * the X11 display name as the name space identifier. * This is how sam's B has worked since the early days. * Since most programs using name spaces are also using X, * this still seems reasonable. Terminal-only sessions * can set $NAMESPACE. */ static char* nsfromdisplay(void) { int fd; Dir *d; char *disp, *p; if((disp = getenv("DISPLAY")) == nil){ #ifdef __APPLE__ // Might be running native GUI on OS X. disp = strdup(":0.0"); if(disp == nil) return nil; #else werrstr("$DISPLAY not set"); return nil; #endif } /* canonicalize: xxx:0.0 => xxx:0 */ p = strrchr(disp, ':'); if(p){ p++; while(isdigit((uchar)*p)) p++; if(strcmp(p, ".0") == 0) *p = 0; } /* turn /tmp/launch/:0 into _tmp_launch_:0 (OS X 10.5) */ for(p=disp; *p; p++) if(*p == '/') *p = '_'; p = smprint("/tmp/ns.%s.%s", getuser(), disp); free(disp); if(p == nil){ werrstr("out of memory"); return p; } if((fd=create(p, OREAD, DMDIR|0700)) >= 0){ close(fd); return p; } if((d = dirstat(p)) == nil){ free(d); werrstr("stat %s: %r", p); free(p); return nil; } if((d->mode&0777) != 0700 || !isme(d->uid)){ werrstr("bad name space dir %s", p); free(p); free(d); return nil; } free(d); return p; } char* getns(void) { char *ns; ns = getenv("NAMESPACE"); if(ns == nil) ns = nsfromdisplay(); if(ns == nil){ werrstr("$NAMESPACE not set, %r"); return nil; } return ns; } 9base-6/lib9/getuser.c0000644000175000017500000000035611402154555014233 0ustar anselmanselm#include #include #include char* getuser(void) { static char user[64]; struct passwd *pw; pw = getpwuid(getuid()); if(pw == nil) return "none"; strecpy(user, user+sizeof user, pw->pw_name); return user; } 9base-6/lib9/nrand.c0000644000175000017500000000026011402154555013651 0ustar anselmanselm#include #define MASK 0x7fffffffL int nrand(int n) { long slop, v; if(n < 0) return n; slop = MASK % n; do v = lrand(); while(v <= slop); return v % n; } 9base-6/lib9/cleanname.c0000644000175000017500000000225711402154555014502 0ustar anselmanselm#include #include /* * In place, rewrite name to compress multiple /, eliminate ., and process .. */ #define SEP(x) ((x)=='/' || (x) == 0) char* cleanname(char *name) { char *p, *q, *dotdot; int rooted; rooted = name[0] == '/'; /* * invariants: * p points at beginning of path element we're considering. * q points just past the last path element we wrote (no slash). * dotdot points just past the point where .. cannot backtrack * any further (no slash). */ p = q = dotdot = name+rooted; while(*p) { if(p[0] == '/') /* null element */ p++; else if(p[0] == '.' && SEP(p[1])) p += 1; /* don't count the separator in case it is nul */ else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) { p += 2; if(q > dotdot) { /* can backtrack */ while(--q > dotdot && *q != '/') ; } else if(!rooted) { /* /.. is / but ./../ is .. */ if(q != name) *q++ = '/'; *q++ = '.'; *q++ = '.'; dotdot = q; } } else { /* real path element */ if(q != name+rooted) *q++ = '/'; while((*q = *p) != '/' && *q != 0) p++, q++; } } if(q == name) /* empty string is really ``.'' */ *q++ = '.'; *q = '\0'; return name; } 9base-6/lib9/sendfd.c0000644000175000017500000000315211402154555014015 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include #include #ifndef CMSG_ALIGN # ifdef __sun__ # define CMSG_ALIGN _CMSG_DATA_ALIGN # else # define CMSG_ALIGN(len) (((len)+sizeof(long)-1) & ~(sizeof(long)-1)) # endif #endif #ifndef CMSG_SPACE # define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr))+CMSG_ALIGN(len)) #endif #ifndef CMSG_LEN # define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr))+(len)) #endif int sendfd(int s, int fd) { char buf[1]; struct iovec iov; struct msghdr msg; struct cmsghdr *cmsg; int n; char cms[CMSG_SPACE(sizeof(int))]; buf[0] = 0; iov.iov_base = buf; iov.iov_len = 1; memset(&msg, 0, sizeof msg); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = (caddr_t)cms; msg.msg_controllen = CMSG_LEN(sizeof(int)); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; *(int*)CMSG_DATA(cmsg) = fd; if((n=sendmsg(s, &msg, 0)) != iov.iov_len) return -1; return 0; } int recvfd(int s) { int n; int fd; char buf[1]; struct iovec iov; struct msghdr msg; struct cmsghdr *cmsg; char cms[CMSG_SPACE(sizeof(int))]; iov.iov_base = buf; iov.iov_len = 1; memset(&msg, 0, sizeof msg); msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = (caddr_t)cms; msg.msg_controllen = sizeof cms; if((n=recvmsg(s, &msg, 0)) < 0) return -1; if(n == 0){ werrstr("unexpected EOF"); return -1; } cmsg = CMSG_FIRSTHDR(&msg); fd = *(int*)CMSG_DATA(cmsg); return fd; } 9base-6/lib9/sec/0000755000175000017500000000000011402154555013157 5ustar anselmanselm9base-6/lib9/sec/os.h0000644000175000017500000000004111402154555013744 0ustar anselmanselm#include #include 9base-6/lib9/sec/libsec.h0000644000175000017500000002216111402154555014573 0ustar anselmanselm#ifndef _LIBSEC_H_ #define _LIBSEC_H_ 1 #if defined(__cplusplus) extern "C" { #endif /* #pragma lib "libsec.a" #pragma src "/sys/src/libsec" */ AUTOLIB(sec) #ifndef _MPINT typedef struct mpint mpint; #endif /*******************************************************/ /* AES definitions */ /*******************************************************/ enum { AESbsize= 16, AESmaxkey= 32, AESmaxrounds= 14 }; typedef struct AESstate AESstate; struct AESstate { ulong setup; int rounds; int keybytes; uchar key[AESmaxkey]; /* unexpanded key */ u32int ekey[4*(AESmaxrounds + 1)]; /* encryption key */ u32int dkey[4*(AESmaxrounds + 1)]; /* decryption key */ uchar ivec[AESbsize]; /* initialization vector */ }; void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec); void aesCBCencrypt(uchar *p, int len, AESstate *s); void aesCBCdecrypt(uchar *p, int len, AESstate *s); /*******************************************************/ /* Blowfish Definitions */ /*******************************************************/ enum { BFbsize = 8, BFrounds = 16 }; /* 16-round Blowfish */ typedef struct BFstate BFstate; struct BFstate { ulong setup; uchar key[56]; uchar ivec[8]; u32int pbox[BFrounds+2]; u32int sbox[1024]; }; void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec); void bfCBCencrypt(uchar*, int, BFstate*); void bfCBCdecrypt(uchar*, int, BFstate*); void bfECBencrypt(uchar*, int, BFstate*); void bfECBdecrypt(uchar*, int, BFstate*); /*******************************************************/ /* DES definitions */ /*******************************************************/ enum { DESbsize= 8 }; /* single des */ typedef struct DESstate DESstate; struct DESstate { ulong setup; uchar key[8]; /* unexpanded key */ ulong expanded[32]; /* expanded key */ uchar ivec[8]; /* initialization vector */ }; void setupDESstate(DESstate *s, uchar key[8], uchar *ivec); void des_key_setup(uchar[8], ulong[32]); void block_cipher(ulong*, uchar*, int); void desCBCencrypt(uchar*, int, DESstate*); void desCBCdecrypt(uchar*, int, DESstate*); void desECBencrypt(uchar*, int, DESstate*); void desECBdecrypt(uchar*, int, DESstate*); /* for backward compatibility with 7 byte DES key format */ void des56to64(uchar *k56, uchar *k64); void des64to56(uchar *k64, uchar *k56); void key_setup(uchar[7], ulong[32]); /* triple des encrypt/decrypt orderings */ enum { DES3E= 0, DES3D= 1, DES3EEE= 0, DES3EDE= 2, DES3DED= 5, DES3DDD= 7 }; typedef struct DES3state DES3state; struct DES3state { ulong setup; uchar key[3][8]; /* unexpanded key */ ulong expanded[3][32]; /* expanded key */ uchar ivec[8]; /* initialization vector */ }; void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec); void triple_block_cipher(ulong keys[3][32], uchar*, int); void des3CBCencrypt(uchar*, int, DES3state*); void des3CBCdecrypt(uchar*, int, DES3state*); void des3ECBencrypt(uchar*, int, DES3state*); void des3ECBdecrypt(uchar*, int, DES3state*); /*******************************************************/ /* digests */ /*******************************************************/ enum { SHA1dlen= 20, /* SHA digest length */ MD4dlen= 16, /* MD4 digest length */ MD5dlen= 16 /* MD5 digest length */ }; typedef struct DigestState DigestState; struct DigestState { ulong len; u32int state[5]; uchar buf[128]; int blen; char malloced; char seeded; }; typedef struct DigestState SHAstate; /* obsolete name */ typedef struct DigestState SHA1state; typedef struct DigestState MD5state; typedef struct DigestState MD4state; DigestState* md4(uchar*, ulong, uchar*, DigestState*); DigestState* md5(uchar*, ulong, uchar*, DigestState*); DigestState* sha1(uchar*, ulong, uchar*, DigestState*); DigestState* hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); DigestState* hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); char* sha1pickle(SHA1state*); SHA1state* sha1unpickle(char*); /*******************************************************/ /* random number generation */ /*******************************************************/ void genrandom(uchar *buf, int nbytes); void prng(uchar *buf, int nbytes); ulong fastrand(void); ulong nfastrand(ulong); /*******************************************************/ /* primes */ /*******************************************************/ void genprime(mpint *p, int n, int accuracy); /* generate an n bit probable prime */ void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); /* prime and generator */ void genstrongprime(mpint *p, int n, int accuracy); /* generate an n bit strong prime */ void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]); int probably_prime(mpint *n, int nrep); /* miller-rabin test */ int smallprimetest(mpint *p); /* returns -1 if not prime, 0 otherwise */ /*******************************************************/ /* rc4 */ /*******************************************************/ typedef struct RC4state RC4state; struct RC4state { uchar state[256]; uchar x; uchar y; }; void setupRC4state(RC4state*, uchar*, int); void rc4(RC4state*, uchar*, int); void rc4skip(RC4state*, int); void rc4back(RC4state*, int); /*******************************************************/ /* rsa */ /*******************************************************/ typedef struct RSApub RSApub; typedef struct RSApriv RSApriv; typedef struct PEMChain PEMChain; /* public/encryption key */ struct RSApub { mpint *n; /* modulus */ mpint *ek; /* exp (encryption key) */ }; /* private/decryption key */ struct RSApriv { RSApub pub; mpint *dk; /* exp (decryption key) */ /* precomputed values to help with chinese remainder theorem calc */ mpint *p; mpint *q; mpint *kp; /* dk mod p-1 */ mpint *kq; /* dk mod q-1 */ mpint *c2; /* (inv p) mod q */ }; struct PEMChain { PEMChain *next; uchar *pem; int pemlen; }; RSApriv* rsagen(int nlen, int elen, int rounds); mpint* rsaencrypt(RSApub *k, mpint *in, mpint *out); mpint* rsadecrypt(RSApriv *k, mpint *in, mpint *out); RSApub* rsapuballoc(void); void rsapubfree(RSApub*); RSApriv* rsaprivalloc(void); void rsaprivfree(RSApriv*); RSApub* rsaprivtopub(RSApriv*); RSApub* X509toRSApub(uchar*, int, char*, int); RSApriv* asn1toRSApriv(uchar*, int); uchar* decodepem(char *s, char *type, int *len, char**); PEMChain* decodepemchain(char *s, char *type); uchar* X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen); RSApriv* rsafill(mpint *n, mpint *ek, mpint *dk, mpint *p, mpint *q); uchar* X509req(RSApriv *priv, char *subj, int *certlen); /*******************************************************/ /* elgamal */ /*******************************************************/ typedef struct EGpub EGpub; typedef struct EGpriv EGpriv; typedef struct EGsig EGsig; /* public/encryption key */ struct EGpub { mpint *p; /* modulus */ mpint *alpha; /* generator */ mpint *key; /* (encryption key) alpha**secret mod p */ }; /* private/decryption key */ struct EGpriv { EGpub pub; mpint *secret; /* (decryption key) */ }; /* signature */ struct EGsig { mpint *r, *s; }; EGpriv* eggen(int nlen, int rounds); mpint* egencrypt(EGpub *k, mpint *in, mpint *out); mpint* egdecrypt(EGpriv *k, mpint *in, mpint *out); EGsig* egsign(EGpriv *k, mpint *m); int egverify(EGpub *k, EGsig *sig, mpint *m); EGpub* egpuballoc(void); void egpubfree(EGpub*); EGpriv* egprivalloc(void); void egprivfree(EGpriv*); EGsig* egsigalloc(void); void egsigfree(EGsig*); EGpub* egprivtopub(EGpriv*); /*******************************************************/ /* dsa */ /*******************************************************/ typedef struct DSApub DSApub; typedef struct DSApriv DSApriv; typedef struct DSAsig DSAsig; /* public/encryption key */ struct DSApub { mpint *p; /* modulus */ mpint *q; /* group order, q divides p-1 */ mpint *alpha; /* group generator */ mpint *key; /* (encryption key) alpha**secret mod p */ }; /* private/decryption key */ struct DSApriv { DSApub pub; mpint *secret; /* (decryption key) */ }; /* signature */ struct DSAsig { mpint *r, *s; }; DSApriv* dsagen(DSApub *opub); DSAsig* dsasign(DSApriv *k, mpint *m); int dsaverify(DSApub *k, DSAsig *sig, mpint *m); DSApub* dsapuballoc(void); void dsapubfree(DSApub*); DSApriv* dsaprivalloc(void); void dsaprivfree(DSApriv*); DSAsig* dsasigalloc(void); void dsasigfree(DSAsig*); DSApub* dsaprivtopub(DSApriv*); DSApriv* asn1toDSApriv(uchar*, int); /*******************************************************/ /* TLS */ /*******************************************************/ typedef struct Thumbprint{ struct Thumbprint *next; uchar sha1[SHA1dlen]; } Thumbprint; typedef struct TLSconn{ char dir[40]; /* connection directory */ uchar *cert; /* certificate (local on input, remote on output) */ uchar *sessionID; int certlen, sessionIDlen; int (*trace)(char*fmt, ...); PEMChain *chain; } TLSconn; /* tlshand.c */ extern int tlsClient(int fd, TLSconn *c); extern int tlsServer(int fd, TLSconn *c); /* thumb.c */ extern Thumbprint* initThumbprints(char *ok, char *crl); extern void freeThumbprints(Thumbprint *ok); extern int okThumbprint(uchar *sha1, Thumbprint *ok); /* readcert.c */ extern uchar *readcert(char *filename, int *pcertlen); PEMChain *readcertchain(char *filename); #if defined(__cplusplus) } #endif #endif 9base-6/lib9/sec/md5pickle.c0000644000175000017500000000131011402154555015173 0ustar anselmanselm#include "os.h" #include char* md5pickle(MD5state *s) { char *p; int m, n; m = 17+4*9+4*((s->blen+3)/3); p = malloc(m); if(p == nil) return p; n = sprint(p, "%16.16llux %8.8ux %8.8ux %8.8ux %8.8ux ", s->len, s->state[0], s->state[1], s->state[2], s->state[3]); enc64(p+n, m-n, s->buf, s->blen); return p; } MD5state* md5unpickle(char *p) { MD5state *s; s = malloc(sizeof(*s)); if(s == nil) return nil; s->len = strtoull(p, &p, 16); s->state[0] = strtoul(p, &p, 16); s->state[1] = strtoul(p, &p, 16); s->state[2] = strtoul(p, &p, 16); s->state[3] = strtoul(p, &p, 16); s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); s->malloced = 1; s->seeded = 1; return s; } 9base-6/lib9/sec/sha1pickle.c0000644000175000017500000000131511402154555015347 0ustar anselmanselm#include "os.h" #include char* sha1pickle(SHA1state *s) { char *p; int m, n; m = 5*9+4*((s->blen+3)/3); p = malloc(m); if(p == nil) return p; n = sprint(p, "%8.8ux %8.8ux %8.8ux %8.8ux %8.8ux ", s->state[0], s->state[1], s->state[2], s->state[3], s->state[4]); enc64(p+n, m-n, s->buf, s->blen); return p; } SHA1state* sha1unpickle(char *p) { SHA1state *s; s = malloc(sizeof(*s)); if(s == nil) return nil; s->state[0] = strtoul(p, &p, 16); s->state[1] = strtoul(p, &p, 16); s->state[2] = strtoul(p, &p, 16); s->state[3] = strtoul(p, &p, 16); s->state[4] = strtoul(p, &p, 16); s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); s->malloced = 1; s->seeded = 1; return s; } 9base-6/lib9/sec/md5.c0000644000175000017500000000626611402154555014022 0ustar anselmanselm#include "os.h" #include /* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ static void encode(uchar*, u32int*, ulong); extern void _md5block(uchar*, ulong, u32int*); MD5state* md5(uchar *p, ulong len, uchar *digest, MD5state *s) { u32int x[16]; uchar buf[128]; int i; uchar *e; if(s == nil){ s = malloc(sizeof(*s)); if(s == nil) return nil; memset(s, 0, sizeof(*s)); s->malloced = 1; } if(s->seeded == 0){ /* seed the state, these constants would look nicer big-endian */ s->state[0] = 0x67452301; s->state[1] = 0xefcdab89; s->state[2] = 0x98badcfe; s->state[3] = 0x10325476; s->seeded = 1; } /* fill out the partial 64 byte block from previous calls */ if(s->blen){ i = 64 - s->blen; if(len < i) i = len; memmove(s->buf + s->blen, p, i); len -= i; s->blen += i; p += i; if(s->blen == 64){ _md5block(s->buf, s->blen, s->state); s->len += s->blen; s->blen = 0; } } /* do 64 byte blocks */ i = len & ~0x3f; if(i){ _md5block(p, i, s->state); s->len += i; len -= i; p += i; } /* save the left overs if not last call */ if(digest == 0){ if(len){ memmove(s->buf, p, len); s->blen += len; } return s; } /* * this is the last time through, pad what's left with 0x80, * 0's, and the input count to create a multiple of 64 bytes */ if(s->blen){ p = s->buf; len = s->blen; } else { memmove(buf, p, len); p = buf; } s->len += len; e = p + len; if(len < 56) i = 56 - len; else i = 120 - len; memset(e, 0, i); *e = 0x80; len += i; /* append the count */ x[0] = s->len<<3; x[1] = s->len>>29; encode(p+len, x, 8); /* digest the last part */ _md5block(p, len+8, s->state); s->len += len; /* return result and free state */ encode(digest, s->state, MD5dlen); if(s->malloced == 1) free(s); return nil; } /* * encodes input (u32int) into output (uchar). Assumes len is * a multiple of 4. */ static void encode(uchar *output, u32int *input, ulong len) { u32int x; uchar *e; for(e = output + len; output < e;) { x = *input++; *output++ = x; *output++ = x >> 8; *output++ = x >> 16; *output++ = x >> 24; } } 9base-6/lib9/sec/sha1.c0000644000175000017500000000434711402154555014167 0ustar anselmanselm#include "os.h" #include static void encode(uchar*, u32int*, ulong); extern void _sha1block(uchar*, ulong, u32int*); /* * we require len to be a multiple of 64 for all but * the last call. There must be room in the input buffer * to pad. */ SHA1state* sha1(uchar *p, ulong len, uchar *digest, SHA1state *s) { uchar buf[128]; u32int x[16]; int i; uchar *e; if(s == nil){ s = malloc(sizeof(*s)); if(s == nil) return nil; memset(s, 0, sizeof(*s)); s->malloced = 1; } if(s->seeded == 0){ /* seed the state, these constants would look nicer big-endian */ s->state[0] = 0x67452301; s->state[1] = 0xefcdab89; s->state[2] = 0x98badcfe; s->state[3] = 0x10325476; s->state[4] = 0xc3d2e1f0; s->seeded = 1; } /* fill out the partial 64 byte block from previous calls */ if(s->blen){ i = 64 - s->blen; if(len < i) i = len; memmove(s->buf + s->blen, p, i); len -= i; s->blen += i; p += i; if(s->blen == 64){ _sha1block(s->buf, s->blen, s->state); s->len += s->blen; s->blen = 0; } } /* do 64 byte blocks */ i = len & ~0x3f; if(i){ _sha1block(p, i, s->state); s->len += i; len -= i; p += i; } /* save the left overs if not last call */ if(digest == 0){ if(len){ memmove(s->buf, p, len); s->blen += len; } return s; } /* * this is the last time through, pad what's left with 0x80, * 0's, and the input count to create a multiple of 64 bytes */ if(s->blen){ p = s->buf; len = s->blen; } else { memmove(buf, p, len); p = buf; } s->len += len; e = p + len; if(len < 56) i = 56 - len; else i = 120 - len; memset(e, 0, i); *e = 0x80; len += i; /* append the count */ x[0] = s->len>>29; x[1] = s->len<<3; encode(p+len, x, 8); /* digest the last part */ _sha1block(p, len+8, s->state); s->len += len+8; /* return result and free state */ encode(digest, s->state, SHA1dlen); if(s->malloced == 1) free(s); return nil; } /* * encodes input (ulong) into output (uchar). Assumes len is * a multiple of 4. */ static void encode(uchar *output, u32int *input, ulong len) { u32int x; uchar *e; for(e = output + len; output < e;) { x = *input++; *output++ = x >> 24; *output++ = x >> 16; *output++ = x >> 8; *output++ = x; } } 9base-6/lib9/sec/md5block.c0000644000175000017500000001162711402154555015032 0ustar anselmanselm#include "os.h" #include /* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ /* * Rotate ammounts used in the algorithm */ enum { S11= 7, S12= 12, S13= 17, S14= 22, S21= 5, S22= 9, S23= 14, S24= 20, S31= 4, S32= 11, S33= 16, S34= 23, S41= 6, S42= 10, S43= 15, S44= 21, }; static u32int md5tab[] = { /* round 1 */ /*[0]*/ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, /* round 2 */ /*[16]*/0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, /* round 3 */ /*[32]*/0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, /* round 4 */ /*[48]*/0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, }; static void decode(u32int*, uchar*, ulong); extern void _md5block(uchar *p, ulong len, u32int *s); void _md5block(uchar *p, ulong len, u32int *s) { u32int a, b, c, d, sh; u32int *t; uchar *end; u32int x[16]; for(end = p+len; p < end; p += 64){ a = s[0]; b = s[1]; c = s[2]; d = s[3]; decode(x, p, 64); t = md5tab; sh = 0; for(; sh != 16; t += 4){ a += ((c ^ d) & b) ^ d; a += x[sh] + t[0]; a = (a << S11) | (a >> (32 - S11)); a += b; d += ((b ^ c) & a) ^ c; d += x[sh + 1] + t[1]; d = (d << S12) | (d >> (32 - S12)); d += a; c += ((a ^ b) & d) ^ b; c += x[sh + 2] + t[2]; c = (c << S13) | (c >> (32 - S13)); c += d; b += ((d ^ a) & c) ^ a; b += x[sh + 3] + t[3]; b = (b << S14) | (b >> (32 - S14)); b += c; sh += 4; } sh = 1; for(; sh != 1+20*4; t += 4){ a += ((b ^ c) & d) ^ c; a += x[sh & 0xf] + t[0]; a = (a << S21) | (a >> (32 - S21)); a += b; d += ((a ^ b) & c) ^ b; d += x[(sh + 5) & 0xf] + t[1]; d = (d << S22) | (d >> (32 - S22)); d += a; c += ((d ^ a) & b) ^ a; c += x[(sh + 10) & 0xf] + t[2]; c = (c << S23) | (c >> (32 - S23)); c += d; b += ((c ^ d) & a) ^ d; b += x[(sh + 15) & 0xf] + t[3]; b = (b << S24) | (b >> (32 - S24)); b += c; sh += 20; } sh = 5; for(; sh != 5+12*4; t += 4){ a += b ^ c ^ d; a += x[sh & 0xf] + t[0]; a = (a << S31) | (a >> (32 - S31)); a += b; d += a ^ b ^ c; d += x[(sh + 3) & 0xf] + t[1]; d = (d << S32) | (d >> (32 - S32)); d += a; c += d ^ a ^ b; c += x[(sh + 6) & 0xf] + t[2]; c = (c << S33) | (c >> (32 - S33)); c += d; b += c ^ d ^ a; b += x[(sh + 9) & 0xf] + t[3]; b = (b << S34) | (b >> (32 - S34)); b += c; sh += 12; } sh = 0; for(; sh != 28*4; t += 4){ a += c ^ (b | ~d); a += x[sh & 0xf] + t[0]; a = (a << S41) | (a >> (32 - S41)); a += b; d += b ^ (a | ~c); d += x[(sh + 7) & 0xf] + t[1]; d = (d << S42) | (d >> (32 - S42)); d += a; c += a ^ (d | ~b); c += x[(sh + 14) & 0xf] + t[2]; c = (c << S43) | (c >> (32 - S43)); c += d; b += d ^ (c | ~a); b += x[(sh + 21) & 0xf] + t[3]; b = (b << S44) | (b >> (32 - S44)); b += c; sh += 28; } s[0] += a; s[1] += b; s[2] += c; s[3] += d; } } /* * decodes input (uchar) into output (u32int). Assumes len is * a multiple of 4. */ static void decode(u32int *output, uchar *input, ulong len) { uchar *e; for(e = input+len; input < e; input += 4) *output++ = input[0] | (input[1] << 8) | (input[2] << 16) | (input[3] << 24); } 9base-6/lib9/sec/sha1block.c0000644000175000017500000001110111402154555015164 0ustar anselmanselm#include "os.h" void _sha1block(uchar *p, ulong len, u32int *s) { u32int a, b, c, d, e, x; uchar *end; u32int *wp, *wend; u32int w[80]; /* at this point, we have a multiple of 64 bytes */ for(end = p+len; p < end;){ a = s[0]; b = s[1]; c = s[2]; d = s[3]; e = s[4]; wend = w + 15; for(wp = w; wp < wend; wp += 5){ wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; e += ((a<<5) | (a>>27)) + wp[0]; e += 0x5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; d += ((e<<5) | (e>>27)) + wp[1]; d += 0x5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; c += ((d<<5) | (d>>27)) + wp[2]; c += 0x5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; b += ((c<<5) | (c>>27)) + wp[3]; b += 0x5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; a += ((b<<5) | (b>>27)) + wp[4]; a += 0x5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); p += 20; } wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; e += ((a<<5) | (a>>27)) + wp[0]; e += 0x5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); wp += 5; p += 4; wend = w + 40; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0x6ed9eba1 + (b^c^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x6ed9eba1 + (a^b^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x6ed9eba1 + (e^a^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x6ed9eba1 + (d^e^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x6ed9eba1 + (c^d^e); c = (c<<30)|(c>>2); } wend = w + 60; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); c = (c<<30)|(c>>2); } wend = w + 80; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0xca62c1d6 + (b^c^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0xca62c1d6 + (a^b^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0xca62c1d6 + (e^a^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0xca62c1d6 + (d^e^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0xca62c1d6 + (c^d^e); c = (c<<30)|(c>>2); } /* save state */ s[0] += a; s[1] += b; s[2] += c; s[3] += d; s[4] += e; } } 9base-6/lib9/nan.c0000644000175000017500000000036611402154555013332 0ustar anselmanselm#include #include #include "fmt/nan.h" double NaN(void) { return __NaN(); } double Inf(int sign) { return __Inf(sign); } int isNaN(double x) { return __isNaN(x); } int isInf(double x, int sign) { return __isInf(x, sign); } 9base-6/lib9/u.h0000644000175000017500000001015511402154555013024 0ustar anselmanselm#ifndef _U_H_ #define _U_H_ 1 #if defined(__cplusplus) extern "C" { #endif #define __BSD_VISIBLE 1 /* FreeBSD 5.x */ #if defined(__sun__) # define __EXTENSIONS__ 1 /* SunOS */ # if defined(__SunOS5_6__) || defined(__SunOS5_7__) || defined(__SunOS5_8__) || defined(__SunOS5_9__) || defined(__SunOS5_10__) /* NOT USING #define __MAKECONTEXT_V2_SOURCE 1 / * SunOS */ # else /* What's left? */ # define __MAKECONTEXT_V2_SOURCE 1 # endif #endif #define _BSD_SOURCE 1 #define _NETBSD_SOURCE 1 /* NetBSD */ #define _SVID_SOURCE 1 #if !defined(__APPLE__) && !defined(__OpenBSD__) # define _XOPEN_SOURCE 1000 # define _XOPEN_SOURCE_EXTENDED 1 #endif #if defined(__FreeBSD__) # include /* for strtoll */ # undef __ISO_C_VISIBLE # define __ISO_C_VISIBLE 1999 # undef __LONG_LONG_SUPPORTED # define __LONG_LONG_SUPPORTED #endif #if defined(__AIX__) # define _XOPEN_SOURCE 1 #endif #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include /* for tolower */ /* * OS-specific crap */ #define _NEEDUCHAR 1 #define _NEEDUSHORT 1 #define _NEEDUINT 1 #define _NEEDULONG 1 typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; #if defined(__linux__) # include # if defined(__Linux26__) # include # define PLAN9PORT_USING_PTHREADS 1 # endif # if defined(__USE_MISC) # undef _NEEDUSHORT # undef _NEEDUINT # undef _NEEDULONG # endif #elif defined(__sun__) # include # include # define PLAN9PORT_USING_PTHREADS 1 # undef _NEEDUSHORT # undef _NEEDUINT # undef _NEEDULONG # define nil 0 /* no cast to void* */ #elif defined(__FreeBSD__) # include # include # if __FreeBSD_version >= 500000 # define PLAN9PORT_USING_PTHREADS 1 # include # endif # if !defined(_POSIX_SOURCE) # undef _NEEDUSHORT # undef _NEEDUINT # endif #elif defined(__APPLE__) # include # include # define PLAN9PORT_USING_PTHREADS 1 # if __GNUC__ < 4 # undef _NEEDUSHORT # undef _NEEDUINT # endif # undef _ANSI_SOURCE # undef _POSIX_C_SOURCE # undef _XOPEN_SOURCE # if !defined(NSIG) # define NSIG 32 # endif # define _NEEDLL 1 #elif defined(__NetBSD__) # include # include # undef _NEEDUSHORT # undef _NEEDUINT # undef _NEEDULONG #elif defined(__OpenBSD__) # include # undef _NEEDUSHORT # undef _NEEDUINT # undef _NEEDULONG #else /* No idea what system this is -- try some defaults */ # include # define PLAN9PORT_USING_PTHREADS 1 #endif #ifndef O_DIRECT #define O_DIRECT 0 #endif typedef signed char schar; #ifdef _NEEDUCHAR typedef unsigned char uchar; #endif #ifdef _NEEDUSHORT typedef unsigned short ushort; #endif #ifdef _NEEDUINT typedef unsigned int uint; #endif #ifdef _NEEDULONG typedef unsigned long ulong; #endif typedef unsigned long long uvlong; typedef long long vlong; typedef uint64_t u64int; typedef int64_t s64int; typedef uint8_t u8int; typedef int8_t s8int; typedef uint16_t u16int; typedef int16_t s16int; typedef uintptr_t uintptr; typedef intptr_t intptr; typedef uint32_t u32int; typedef int32_t s32int; #undef _NEEDUCHAR #undef _NEEDUSHORT #undef _NEEDUINT #undef _NEEDULONG /* * Funny-named symbols to tip off 9l to autolink. */ #define AUTOLIB(x) static int __p9l_autolib_ ## x = 1; #define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x = 1; /* * Gcc is too smart for its own good. */ #if defined(__GNUC__) # undef strcmp /* causes way too many warnings */ # if __GNUC__ >= 4 || (__GNUC__==3 && !defined(__APPLE_CC__)) # undef AUTOLIB # define AUTOLIB(x) int __p9l_autolib_ ## x __attribute__ ((weak)); # undef AUTOFRAMEWORK # define AUTOFRAMEWORK(x) int __p9l_autoframework_ ## x __attribute__ ((weak)); # else # undef AUTOLIB # define AUTOLIB(x) static int __p9l_autolib_ ## x __attribute__ ((unused)); # undef AUTOFRAMEWORK # define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x __attribute__ ((unused)); # endif #endif #if defined(__cplusplus) } #endif #endif 9base-6/lib9/bio/0000755000175000017500000000000011402154555013156 5ustar anselmanselm9base-6/lib9/bio/bputc.c0000644000175000017500000000034311402154555014437 0ustar anselmanselm#include "lib9.h" #include int Bputc(Biobuf *bp, int c) { int i; for(;;) { i = bp->ocount; if(i) { bp->ebuf[i++] = c; bp->ocount = i; return 0; } if(Bflush(bp) == Beof) break; } return Beof; } 9base-6/lib9/bio/bprint.c0000644000175000017500000000026011402154555014616 0ustar anselmanselm#include "lib9.h" #include int Bprint(Biobuf *bp, char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = Bvprint(bp, fmt, arg); va_end(arg); return n; } 9base-6/lib9/bio/bflush.c0000644000175000017500000000071511402154555014610 0ustar anselmanselm#include "lib9.h" #include int Bflush(Biobuf *bp) { int n, c; switch(bp->state) { case Bwactive: n = bp->bsize+bp->ocount; if(n == 0) return 0; c = write(bp->fid, bp->bbuf, n); if(n == c) { bp->offset += n; bp->ocount = -bp->bsize; return 0; } bp->state = Binactive; bp->ocount = 0; break; case Bracteof: bp->state = Bractive; case Bractive: bp->icount = 0; bp->gbuf = bp->ebuf; return 0; } return Beof; } 9base-6/lib9/bio/bgetc.c0000644000175000017500000000163711402154555014415 0ustar anselmanselm#include "lib9.h" #include int Bgetc(Biobuf *bp) { int i; loop: i = bp->icount; if(i != 0) { bp->icount = i+1; return bp->ebuf[i]; } if(bp->state != Bractive) { if(bp->state == Bracteof) bp->state = Bractive; return Beof; } /* * get next buffer, try to keep Bungetsize * characters pre-catenated from the previous * buffer to allow that many ungets. */ memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize); i = read(bp->fid, bp->bbuf, bp->bsize); bp->gbuf = bp->bbuf; if(i <= 0) { bp->state = Bracteof; if(i < 0) bp->state = Binactive; return Beof; } if(i < bp->bsize) { memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, i+Bungetsize); bp->gbuf = bp->ebuf-i; } bp->icount = -i; bp->offset += i; goto loop; } int Bungetc(Biobuf *bp) { if(bp->state == Bracteof) bp->state = Bractive; if(bp->state != Bractive) return Beof; bp->icount--; return 1; } 9base-6/lib9/bio/bfildes.c0000644000175000017500000000012211402154555014725 0ustar anselmanselm#include "lib9.h" #include int Bfildes(Biobuf *bp) { return bp->fid; } 9base-6/lib9/bio/bvprint.c0000644000175000017500000000115311402154555015006 0ustar anselmanselm#include "lib9.h" #include static int fmtBflush(Fmt *f) { Biobuf *bp; bp = f->farg; bp->ocount = (char*)f->to - (char*)f->stop; if(Bflush(bp) < 0) return 0; f->stop = bp->ebuf; f->to = (char*)f->stop + bp->ocount; f->start = f->to; return 1; } int Bvprint(Biobuf *bp, char *fmt, va_list arg) { int n; Fmt f; f.runes = 0; f.stop = bp->ebuf; f.start = (char*)f.stop + bp->ocount; f.to = f.start; f.flush = fmtBflush; f.farg = bp; f.nfmt = 0; fmtlocaleinit(&f, nil, nil, nil); n = fmtvprint(&f, fmt, arg); bp->ocount = (char*)f.to - (char*)f.stop; if(n == 0) n = f.nfmt; return n; } 9base-6/lib9/bio/bputrune.c0000644000175000017500000000046011402154555015166 0ustar anselmanselm#include "lib9.h" #include #include int Bputrune(Biobuf *bp, long c) { Rune rune; char str[4]; int n; rune = c; if(rune < Runeself) { Bputc(bp, rune); return 1; } n = runetochar(str, &rune); if(n == 0) return Bbad; if(Bwrite(bp, str, n) != n) return Beof; return n; } 9base-6/lib9/bio/bgetd.c0000644000175000017500000000057711402154555014420 0ustar anselmanselm#include "lib9.h" #include struct bgetd { Biobuf* b; int eof; }; static int Bgetdf(void *vp) { int c; struct bgetd *bg = vp; c = Bgetc(bg->b); if(c == Beof) bg->eof = 1; return c; } int Bgetd(Biobuf *bp, double *dp) { double d; struct bgetd b; b.b = bp; b.eof = 0; d = fmtcharstod(Bgetdf, &b); if(b.eof) return -1; Bungetc(bp); *dp = d; return 1; } 9base-6/lib9/bio/brdline.c0000644000175000017500000000275711402154555014754 0ustar anselmanselm#include "lib9.h" #include void* Brdline(Biobuf *bp, int delim) { char *ip, *ep; int i, j; i = -bp->icount; if(i == 0) { /* * eof or other error */ if(bp->state != Bractive) { if(bp->state == Bracteof) bp->state = Bractive; bp->rdline = 0; bp->gbuf = bp->ebuf; return 0; } } /* * first try in remainder of buffer (gbuf doesn't change) */ ip = (char*)bp->ebuf - i; ep = memchr(ip, delim, i); if(ep) { j = (ep - ip) + 1; bp->rdline = j; bp->icount += j; return ip; } /* * copy data to beginning of buffer */ if(i < bp->bsize) memmove(bp->bbuf, ip, i); bp->gbuf = bp->bbuf; /* * append to buffer looking for the delim */ ip = (char*)bp->bbuf + i; while(i < bp->bsize) { j = read(bp->fid, ip, bp->bsize-i); if(j <= 0) { /* * end of file with no delim */ memmove(bp->ebuf-i, bp->bbuf, i); bp->rdline = i; bp->icount = -i; bp->gbuf = bp->ebuf-i; return 0; } bp->offset += j; i += j; ep = memchr(ip, delim, j); if(ep) { /* * found in new piece * copy back up and reset everything */ ip = (char*)bp->ebuf - i; if(i < bp->bsize){ memmove(ip, bp->bbuf, i); bp->gbuf = (unsigned char*)ip; } j = (ep - (char*)bp->bbuf) + 1; bp->rdline = j; bp->icount = j - i; return ip; } ip += j; } /* * full buffer without finding */ bp->rdline = bp->bsize; bp->icount = -bp->bsize; bp->gbuf = bp->bbuf; return 0; } int Blinelen(Biobuf *bp) { return bp->rdline; } 9base-6/lib9/bio/brdstr.c0000644000175000017500000000404611402154555014626 0ustar anselmanselm#include "lib9.h" #include static char* badd(char *p, int *np, char *data, int ndata, int delim, int nulldelim) { int n; n = *np; p = realloc(p, n+ndata+1); if(p){ memmove(p+n, data, ndata); n += ndata; if(n>0 && nulldelim && p[n-1]==delim) p[--n] = '\0'; else p[n] = '\0'; *np = n; } return p; } char* Brdstr(Biobuf *bp, int delim, int nulldelim) { char *ip, *ep, *p; int i, j; i = -bp->icount; bp->rdline = 0; if(i == 0) { /* * eof or other error */ if(bp->state != Bractive) { if(bp->state == Bracteof) bp->state = Bractive; bp->gbuf = bp->ebuf; return nil; } } /* * first try in remainder of buffer (gbuf doesn't change) */ ip = (char*)bp->ebuf - i; ep = memchr(ip, delim, i); if(ep) { j = (ep - ip) + 1; bp->icount += j; return badd(nil, &bp->rdline, ip, j, delim, nulldelim); } /* * copy data to beginning of buffer */ if(i < bp->bsize) memmove(bp->bbuf, ip, i); bp->gbuf = bp->bbuf; /* * append to buffer looking for the delim */ p = nil; for(;;){ ip = (char*)bp->bbuf + i; while(i < bp->bsize) { j = read(bp->fid, ip, bp->bsize-i); if(j <= 0 && i == 0) return p; if(j <= 0 && i > 0){ /* * end of file but no delim. pretend we got a delim * by making the delim \0 and smashing it with nulldelim. */ j = 1; ep = ip; delim = '\0'; nulldelim = 1; *ep = delim; /* there will be room for this */ }else{ bp->offset += j; ep = memchr(ip, delim, j); } i += j; if(ep) { /* * found in new piece * copy back up and reset everything */ ip = (char*)bp->ebuf - i; if(i < bp->bsize){ memmove(ip, bp->bbuf, i); bp->gbuf = (unsigned char*)ip; } j = (ep - (char*)bp->bbuf) + 1; bp->icount = j - i; return badd(p, &bp->rdline, ip, j, delim, nulldelim); } ip += j; } /* * full buffer without finding; add to user string and continue */ p = badd(p, &bp->rdline, (char*)bp->bbuf, bp->bsize, 0, 0); i = 0; bp->icount = 0; bp->gbuf = bp->ebuf; } } 9base-6/lib9/bio/bseek.c0000644000175000017500000000164111402154555014415 0ustar anselmanselm#include "lib9.h" #include long long Bseek(Biobuf *bp, long long offset, int base) { vlong n, d; int bufsz; switch(bp->state) { default: fprint(2, "Bseek: unknown state %d\n", bp->state); return Beof; case Bracteof: bp->state = Bractive; bp->icount = 0; bp->gbuf = bp->ebuf; case Bractive: n = offset; if(base == 1) { n += Boffset(bp); base = 0; } /* * try to seek within buffer */ if(base == 0) { d = n - Boffset(bp); bufsz = bp->ebuf - bp->gbuf; if(-bufsz <= d && d <= bufsz){ bp->icount += d; if(d >= 0) { if(bp->icount <= 0) return n; } else { if(bp->ebuf - bp->gbuf >= -bp->icount) return n; } } } /* * reset the buffer */ n = lseek(bp->fid, n, base); bp->icount = 0; bp->gbuf = bp->ebuf; break; case Bwactive: Bflush(bp); n = seek(bp->fid, offset, base); break; } bp->offset = n; return n; } 9base-6/lib9/bio/bread.c0000644000175000017500000000125111402154555014376 0ustar anselmanselm#include "lib9.h" #include long Bread(Biobuf *bp, void *ap, long count) { long c; unsigned char *p; int i, n, ic; p = ap; c = count; ic = bp->icount; while(c > 0) { n = -ic; if(n > c) n = c; if(n == 0) { if(bp->state != Bractive) break; i = read(bp->fid, bp->bbuf, bp->bsize); if(i <= 0) { bp->state = Bracteof; if(i < 0) bp->state = Binactive; break; } bp->gbuf = bp->bbuf; bp->offset += i; if(i < bp->bsize) { memmove(bp->ebuf-i, bp->bbuf, i); bp->gbuf = bp->ebuf-i; } ic = -i; continue; } memmove(p, bp->ebuf+ic, n); c -= n; ic += n; p += n; } bp->icount = ic; return count-c; } 9base-6/lib9/bio/boffset.c0000644000175000017500000000052611402154555014755 0ustar anselmanselm#include "lib9.h" #include vlong Boffset(Biobuf *bp) { vlong n; switch(bp->state) { default: fprint(2, "Boffset: unknown state %d\n", bp->state); n = Beof; break; case Bracteof: case Bractive: n = bp->offset + bp->icount; break; case Bwactive: n = bp->offset + (bp->bsize + bp->ocount); break; } return n; } 9base-6/lib9/bio/bbuffered.c0000644000175000017500000000044311402154555015247 0ustar anselmanselm#include "lib9.h" #include int Bbuffered(Biobuf *bp) { switch(bp->state) { case Bracteof: case Bractive: return -bp->icount; case Bwactive: return bp->bsize + bp->ocount; case Binactive: return 0; } fprint(2, "Bbuffered: unknown state %d\n", bp->state); return 0; } 9base-6/lib9/bio/bcat.c0000644000175000017500000000132511402154555014234 0ustar anselmanselm#include #include "bio.h" Biobuf bout; void bcat(Biobuf *b, char *name) { char buf[1000]; int n; while((n = Bread(b, buf, sizeof buf)) > 0){ if(Bwrite(&bout, buf, n) < 0) fprint(2, "writing during %s: %r\n", name); } if(n < 0) fprint(2, "reading %s: %r\n", name); } int main(int argc, char **argv) { int i; Biobuf b, *bp; Fmt fmt; Binit(&bout, 1, O_WRONLY); Bfmtinit(&fmt, &bout); fmtprint(&fmt, "hello, world\n"); Bfmtflush(&fmt); if(argc == 1){ Binit(&b, 0, O_RDONLY); bcat(&b, ""); }else{ for(i=1; i #include #include #include #include #define OREAD O_RDONLY #define OWRITE O_WRONLY #include #define nil ((void*)0) 9base-6/lib9/bio/bgetrune.c0000644000175000017500000000116611402154555015141 0ustar anselmanselm#include "lib9.h" #include #include long Bgetrune(Biobuf *bp) { int c, i; Rune rune; char str[4]; c = Bgetc(bp); if(c < Runeself) { /* one char */ bp->runesize = 1; return c; } str[0] = c; for(i=1;;) { c = Bgetc(bp); if(c < 0) return c; str[i++] = c; if(fullrune(str, i)) { bp->runesize = chartorune(&rune, str); while(i > bp->runesize) { Bungetc(bp); i--; } return rune; } } } int Bungetrune(Biobuf *bp) { if(bp->state == Bracteof) bp->state = Bractive; if(bp->state != Bractive) return Beof; bp->icount -= bp->runesize; bp->runesize = 0; return 1; } 9base-6/lib9/bio/lib9.std.h0000644000175000017500000000072711402154555014765 0ustar anselmanselm#define _FILE_OFFSET_BITS 64 #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #define OREAD O_RDONLY #define OWRITE O_WRONLY #define OCEXEC 0 #define ORCLOSE 0 #define OTRUNC 0 #define nil ((void*)0) typedef long long vlong; typedef unsigned long long uvlong; #define seek(fd, offset, whence) lseek(fd, offset, whence) #define create(name, mode, perm) creat(name, perm) 9base-6/lib9/bio/bwrite.c0000644000175000017500000000105111402154555014613 0ustar anselmanselm#include "lib9.h" #include long Bwrite(Biobuf *bp, void *ap, long count) { long c; unsigned char *p; int i, n, oc; p = ap; c = count; oc = bp->ocount; while(c > 0) { n = -oc; if(n > c) n = c; if(n == 0) { if(bp->state != Bwactive) return Beof; i = write(bp->fid, bp->bbuf, bp->bsize); if(i != bp->bsize) { bp->state = Binactive; return Beof; } bp->offset += i; oc = -bp->bsize; continue; } memmove(bp->ebuf+oc, p, n); oc += n; c -= n; p += n; } bp->ocount = oc; return count-c; } 9base-6/lib9/bio/binit.c0000644000175000017500000000367711402154555014444 0ustar anselmanselm#include "lib9.h" #include enum { MAXBUFS = 20 }; static Biobuf* wbufs[MAXBUFS]; static int atexitflag; static void batexit(void) { Biobuf *bp; int i; for(i=0; istate = Bractive; bp->ocount = 0; break; case OWRITE: install(bp); bp->state = Bwactive; bp->ocount = -size; break; } bp->bbuf = p; bp->ebuf = p+size; bp->bsize = size; bp->icount = 0; bp->gbuf = bp->ebuf; bp->fid = f; bp->flag = 0; bp->rdline = 0; bp->offset = 0; bp->runesize = 0; return 0; } int Binit(Biobuf *bp, int f, int mode) { return Binits(bp, f, mode, bp->b, sizeof(bp->b)); } Biobuf* Bfdopen(int f, int mode) { Biobuf *bp; bp = malloc(sizeof(Biobuf)); if(bp == 0) return 0; Binits(bp, f, mode, bp->b, sizeof(bp->b)); bp->flag = Bmagic; return bp; } Biobuf* Bopen(char *name, int mode) { Biobuf *bp; int f; switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) { default: fprint(2, "Bopen: unknown mode %d\n", mode); return 0; case OREAD: f = open(name, mode); if(f < 0) return 0; break; case OWRITE: f = create(name, mode, 0666); if(f < 0) return 0; } bp = Bfdopen(f, mode); if(bp == 0) close(f); return bp; } int Bterm(Biobuf *bp) { deinstall(bp); Bflush(bp); if(bp->flag == Bmagic) { bp->flag = 0; close(bp->fid); free(bp); } return 0; } 9base-6/lib9/ctime.c0000644000175000017500000000601211402154555013651 0ustar anselmanselm/* * This routine converts time as follows. * The epoch is 0000 Jan 1 1970 GMT. * The argument time is in seconds since then. * The localtime(t) entry returns a pointer to an array * containing * * seconds (0-59) * minutes (0-59) * hours (0-23) * day of month (1-31) * month (0-11) * year-1970 * weekday (0-6, Sun is 0) * day of the year * daylight savings flag * * The routine gets the daylight savings time from the environment. * * asctime(tvec)) * where tvec is produced by localtime * returns a ptr to a character string * that has the ascii time in the form * * \\ * Thu Jan 01 00:00:00 GMT 1970n0 * 012345678901234567890123456789 * 0 1 2 * * ctime(t) just calls localtime, then asctime. */ #include #include #include "zoneinfo.h" static char dmsize[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; #define dysize ctimedysize static int dysize(int); static void ct_numb(char*, int); char* ctime(long t) { return asctime(localtime(t)); } Tm* localtime(long tim) { Tinfo ti; Tm *ct; if (zonelookuptinfo(&ti, tim)!=-1) { ct = gmtime(tim+ti.tzoff); strncpy(ct->zone, ti.zone, sizeof ct->zone); ct->zone[sizeof ct->zone-1] = 0; ct->tzoff = ti.tzoff; return ct; } return gmtime(tim); } Tm* gmtime(long tim) { int d0, d1; long hms, day; static Tm xtime; /* * break initial number into days */ hms = tim % 86400L; day = tim / 86400L; if(hms < 0) { hms += 86400L; day -= 1; } /* * generate hours:minutes:seconds */ xtime.sec = hms % 60; d1 = hms / 60; xtime.min = d1 % 60; d1 /= 60; xtime.hour = d1; /* * day is the day number. * generate day of the week. * The addend is 4 mod 7 (1/1/1970 was Thursday) */ xtime.wday = (day + 7340036L) % 7; /* * year number */ if(day >= 0) for(d1 = 1970; day >= dysize(d1); d1++) day -= dysize(d1); else for (d1 = 1970; day < 0; d1--) day += dysize(d1-1); xtime.year = d1-1900; xtime.yday = d0 = day; /* * generate month */ if(dysize(d1) == 366) dmsize[1] = 29; for(d1 = 0; d0 >= dmsize[d1]; d1++) d0 -= dmsize[d1]; dmsize[1] = 28; xtime.mday = d0 + 1; xtime.mon = d1; strcpy(xtime.zone, "GMT"); return &xtime; } char* asctime(Tm *t) { char *ncp; static char cbuf[30]; strcpy(cbuf, "Thu Jan 01 00:00:00 GMT 1970\n"); ncp = &"SunMonTueWedThuFriSat"[t->wday*3]; cbuf[0] = *ncp++; cbuf[1] = *ncp++; cbuf[2] = *ncp; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[t->mon*3]; cbuf[4] = *ncp++; cbuf[5] = *ncp++; cbuf[6] = *ncp; ct_numb(cbuf+8, t->mday); ct_numb(cbuf+11, t->hour+100); ct_numb(cbuf+14, t->min+100); ct_numb(cbuf+17, t->sec+100); ncp = t->zone; cbuf[20] = *ncp++; cbuf[21] = *ncp++; cbuf[22] = *ncp; if(t->year >= 100) { cbuf[24] = '2'; cbuf[25] = '0'; } ct_numb(cbuf+26, t->year+100); return cbuf; } static int dysize(int y) { if(y%4 == 0 && (y%100 != 0 || y%400 == 0)) return 366; return 365; } static void ct_numb(char *cp, int n) { cp[0] = ' '; if(n >= 10) cp[0] = (n/10)%10 + '0'; cp[1] = n%10 + '0'; } 9base-6/lib9/strdup.c0000644000175000017500000000025611402154555014075 0ustar anselmanselm#include #include char* strdup(char *s) { char *t; int l; l = strlen(s); t = malloc(l+1); if(t == nil) return nil; memmove(t, s, l+1); return t; } 9base-6/lib9/dirstat.c0000644000175000017500000000104711402154555014225 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*); Dir* dirstat(char *file) { struct stat lst; struct stat st; int nstr; Dir *d; char *str; if(lstat(file, &lst) < 0) return nil; st = lst; if((lst.st_mode&S_IFMT) == S_IFLNK) stat(file, &st); nstr = _p9dir(&lst, &st, file, nil, nil, nil); d = mallocz(sizeof(Dir)+nstr, 1); if(d == nil) return nil; str = (char*)&d[1]; _p9dir(&lst, &st, file, d, &str, str+nstr); return d; } 9base-6/lib9/syslog.c0000644000175000017500000000372111402154555014074 0ustar anselmanselm#include #include static struct { int fd; int consfd; char *name; Dir *d; Dir *consd; Lock lk; } sl = { -1, -1, }; static void _syslogopen(void) { char buf[1024], *p; if(sl.fd >= 0) close(sl.fd); snprint(buf, sizeof(buf), "#9/log/%s", sl.name); p = unsharp(buf); sl.fd = open(p, OWRITE|OCEXEC|OAPPEND); free(p); } /* * Print * sysname: time: mesg * on /sys/log/logname. * If cons or log file can't be opened, print on the system console, too. */ void syslog(int cons, char *logname, char *fmt, ...) { char buf[1024]; char *ctim, *p; va_list arg; int n; Dir *d; char err[ERRMAX]; err[0] = '\0'; errstr(err, sizeof err); lock(&sl.lk); /* * paranoia makes us stat to make sure a fork+close * hasn't broken our fd's */ d = dirfstat(sl.fd); if(sl.fd < 0 || sl.name == nil || strcmp(sl.name, logname)!=0 || sl.d == nil || d == nil || d->dev != sl.d->dev || d->type != sl.d->type || d->qid.path != sl.d->qid.path){ free(sl.name); sl.name = strdup(logname); if(sl.name == nil) cons = 1; else{ _syslogopen(); if(sl.fd < 0) cons = 1; free(sl.d); sl.d = d; d = nil; /* don't free it */ } } free(d); if(cons){ d = dirfstat(sl.consfd); if(sl.consfd < 0 || d == nil || sl.consd == nil || d->dev != sl.consd->dev || d->type != sl.consd->type || d->qid.path != sl.consd->qid.path){ sl.consfd = open("/dev/tty", OWRITE|OCEXEC); free(sl.consd); sl.consd = d; d = nil; /* don't free it */ } free(d); } if(fmt == nil){ unlock(&sl.lk); return; } ctim = ctime(time(0)); werrstr(err); p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname()); strncpy(p, ctim+4, 15); p += 15; *p++ = ' '; va_start(arg, fmt); p = vseprint(p, buf+sizeof(buf)-1, fmt, arg); va_end(arg); *p++ = '\n'; n = p - buf; if(sl.fd >= 0){ seek(sl.fd, 0, 2); write(sl.fd, buf, n); } if(cons && sl.consfd >=0) write(sl.consfd, buf, n); unlock(&sl.lk); } 9base-6/lib9/u16.c0000644000175000017500000000145011402154555013164 0ustar anselmanselm#include static char t16e[] = "0123456789ABCDEF"; int dec16(uchar *out, int lim, char *in, int n) { int c, w = 0, i = 0; uchar *start = out; uchar *eout = out + lim; while(n-- > 0){ c = *in++; if('0' <= c && c <= '9') c = c - '0'; else if('a' <= c && c <= 'z') c = c - 'a' + 10; else if('A' <= c && c <= 'Z') c = c - 'A' + 10; else continue; w = (w<<4) + c; i++; if(i == 2){ if(out + 1 > eout) goto exhausted; *out++ = w; w = 0; i = 0; } } exhausted: return out - start; } int enc16(char *out, int lim, uchar *in, int n) { uint c; char *eout = out + lim; char *start = out; while(n-- > 0){ c = *in++; if(out + 2 >= eout) goto exhausted; *out++ = t16e[c>>4]; *out++ = t16e[c&0xf]; } exhausted: *out = 0; return out - start; } 9base-6/lib9/testfork.c0000644000175000017500000000052111402154555014410 0ustar anselmanselm#include void sayhi(void *v) { USED(v); print("hello from subproc\n"); print("rendez got %lu from main\n", rendezvous(0x1234, 1234)); exits(0); } int main(int argc, char **argv) { print("hello from main\n"); ffork(RFMEM|RFPROC, sayhi, nil); print("rendez got %lu from subproc\n", rendezvous(0x1234, 0)); exits(0); } 9base-6/lib9/getcallerpc-x86_64.c0000644000175000017500000000011711402154555015771 0ustar anselmanselm#include ulong getcallerpc(void *x) { return (((ulong*)(x))[-1]); } 9base-6/lib9/priv.c0000644000175000017500000000057111402154555013534 0ustar anselmanselm#include #include #include "9proc.h" static Lock privlock; static ulong privmap; int privalloc(void) { int i; lock(&privlock); for(i=0; ipriv[i]; } 9base-6/lib9/truerand.c0000644000175000017500000000117411402154555014400 0ustar anselmanselm#include #include ulong truerand(void) { int i, n; uchar buf[sizeof(ulong)]; static int randfd = -1; static char *randfile; if(randfd < 0){ randfd = open(randfile="/dev/random", OREAD); /* OpenBSD lets you open /dev/random but not read it! */ if(randfd < 0 || read(randfd, buf, 1) != 1) randfd = open(randfile="/dev/srandom", OREAD); /* OpenBSD */ if(randfd < 0) sysfatal("can't open %s: %r", randfile); fcntl(randfd, F_SETFD, FD_CLOEXEC); } for(i=0; i #define NOPLAN9DEFINES #include #include #include #include #include #include #undef sun #define sun sockun extern int _p9netfd(char*); static char *unknown = "unknown"; static int convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr) { struct sockaddr_un *sun; struct sockaddr_in *sin; uchar *ip; u32int ipl; socklen_t sn; int n; char *net; switch(sa->sa_family){ case AF_INET: sin = (void*)sa; ip = (uchar*)&sin->sin_addr; ipl = *(u32int*)ip; if(ipl == 0) *lsys = strdup("*"); else *lsys = smprint("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); *lserv = smprint("%d", ntohs(sin->sin_port)); sn = sizeof n; if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0) return -1; if(n == SOCK_STREAM) net = "tcp"; else if(n == SOCK_DGRAM) net = "udp"; else{ werrstr("unknown network type"); return -1; } *laddr = smprint("%s!%s!%s", net, *lsys, *lserv); if(*lsys == nil || *lserv == nil || *laddr == nil) return -1; return 0; case AF_UNIX: sun = (void*)sa; *lsys = unknown; *lserv = unknown; *laddr = smprint("unix!%s", sun->sun_path); if(*laddr == nil) return -1; return 0; default: werrstr("unknown socket family"); return -1; } } NetConnInfo* getnetconninfo(char *dir, int fd) { socklen_t sn; union { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_un sun; } u; NetConnInfo *nci; if(dir){ if((fd = _p9netfd(dir)) < 0){ werrstr("no such network connection %s", dir); return nil; } } nci = mallocz(sizeof *nci, 1); if(nci == nil) goto err; nci->dir = smprint("/dev/fd/%d", fd); nci->root = strdup("/net"); nci->spec = unknown; if(nci->dir == nil || nci->root == nil) goto err; sn = sizeof u; if(getsockname(fd, &u.sa, &sn) < 0) goto err; if(convert(fd, &u.sa, &nci->lsys, &nci->lserv, &nci->laddr) < 0) goto err; sn = sizeof u; if(getpeername(fd, &u.sa, &sn) < 0) goto err; if(convert(fd, &u.sa, &nci->rsys, &nci->rserv, &nci->raddr) < 0) goto err; return nci; err: freenetconninfo(nci); return nil; } static void xfree(void *v) { if(v != nil && v != unknown) free(v); } void freenetconninfo(NetConnInfo *nci) { if(nci == nil) return; xfree(nci->dir); xfree(nci->root); xfree(nci->spec); xfree(nci->lsys); xfree(nci->lserv); xfree(nci->rsys); xfree(nci->rserv); xfree(nci->laddr); xfree(nci->raddr); free(nci); } 9base-6/lib9/_p9translate.c0000644000175000017500000000157211402154555015163 0ustar anselmanselm#include #include /* * I don't want too many of these, * but the ones we have are just too useful. */ static struct { char *old; char *new; } replace[] = { "#9", nil, /* must be first */ "#d", "/dev/fd", }; char* plan9translate(char *old) { char *new; int i, olen, nlen, len; if(replace[0].new == nil){ replace[0].new = getenv("PLAN9"); if(replace[0].new == nil) replace[0].new = PREFIX; } for(i=0; i"; strcpy(new, replace[i].new); strcpy(new+nlen, old+olen); assert(strlen(new) == len); return new; } return old; } 9base-6/lib9/getcallerpc-sun4u.s0000644000175000017500000000007611402154555016135 0ustar anselmanselm.text .globl getcallerpc getcallerpc: retl or %o7, %r0, %o0 9base-6/lib9/write.c0000644000175000017500000000040411402154555013701 0ustar anselmanselm#include #define NOPLAN9DEFINES #include long p9write(int f, void *av, long n) { char *a; long m, t; a = av; t = 0; while(t < n){ m = write(f, a+t, n-t); if(m <= 0){ if(t == 0) return m; break; } t += m; } return t; } 9base-6/lib9/mallocz.c0000644000175000017500000000027511402154555014216 0ustar anselmanselm#include #include #include #include void* mallocz(unsigned long n, int clr) { void *v; v = malloc(n); if(clr && v) memset(v, 0, n); return v; } 9base-6/lib9/atnotify.c0000644000175000017500000000141411402154555014406 0ustar anselmanselm#include #include #define NFN 33 static int (*onnot[NFN])(void*, char*); static Lock onnotlock; static void notifier(void *v, char *s) { int i; for(i=0; i static char qsep[] = " \t\r\n"; static char* qtoken(char *s, char *sep) { int quoting; char *t; quoting = 0; t = s; /* s is output string, t is input string */ while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){ if(*t != '\''){ *s++ = *t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t++; *s++ = *t++; } if(*s != '\0'){ *s = '\0'; if(t == s) t++; } return t; } static char* etoken(char *t, char *sep) { int quoting; /* move to end of next token */ quoting = 0; while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){ if(*t != '\''){ t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t += 2; } return t; } int gettokens(char *s, char **args, int maxargs, char *sep) { int nargs; for(nargs=0; nargs #include #include int failed; /* Consume argument and ignore it */ int Zflag(Fmt* f) { if(va_arg(f->args, int)) ; return 1; /* it's a flag */ } void verify(char *s, char *t) { if(strcmp(s, t) != 0){ failed = 1; fprintf(stderr, "error: (%s) != (%s)\n", s, t); } free(s); } Rune lightsmiley = 0x263a; Rune darksmiley = 0x263b; /* Test printer that loads unusual decimal point and separator */ char* mysmprint(char *fmt, ...) { Fmt f; if(fmtstrinit(&f) < 0) return 0; va_start(f.args, fmt); f.decimal = smprint("%C", lightsmiley); f.thousands = smprint("%C", darksmiley); f.grouping = "\1\2\3\4"; if(dofmt(&f, fmt) < 0) return 0; va_end(f.args); return fmtstrflush(&f); } double near1[] = { 0.5, 0.95, 0.995, 0.9995, 0.99995, 0.999995, 0.9999995, 0.99999995, 0.999999995, }; void main(int argc, char **argv) { int i, j; quotefmtinstall(); fmtinstall('Z', Zflag); fmtinstall(L'\x263a', Zflag); #ifdef PLAN9PORT { extern int __ifmt(Fmt*); fmtinstall('i', __ifmt); } #endif verify(smprint("hello world"), "hello world"); #ifdef PLAN9PORT verify(smprint("x: %ux", 0x87654321), "x: 87654321"); #else verify(smprint("x: %x", 0x87654321), "x: 87654321"); #endif verify(smprint("d: %d", 0x87654321), "d: -2023406815"); verify(smprint("s: %s", "hi there"), "s: hi there"); verify(smprint("q: %q", "hi i'm here"), "q: 'hi i''m here'"); verify(smprint("c: %c", '!'), "c: !"); verify(smprint("g: %g %g %g", 3.14159, 3.14159e10, 3.14159e-10), "g: 3.14159 3.14159e+10 3.14159e-10"); verify(smprint("e: %e %e %e", 3.14159, 3.14159e10, 3.14159e-10), "e: 3.141590e+00 3.141590e+10 3.141590e-10"); verify(smprint("f: %f %f %f", 3.14159, 3.14159e10, 3.14159e-10), "f: 3.141590 31415900000.000000 0.000000"); verify(smprint("smiley: %C", (Rune)0x263a), "smiley: \xe2\x98\xba"); verify(smprint("%g %.18g", 2e25, 2e25), "2e+25 2e+25"); verify(smprint("%2.18g", 1.0), " 1"); verify(smprint("%f", 3.1415927/4), "0.785398"); verify(smprint("%d", 23), "23"); verify(smprint("%i", 23), "23"); verify(smprint("%Zi", 1234, 23), "23"); /* ANSI and their wacky corner cases */ verify(smprint("%.0d", 0), ""); verify(smprint("%.0o", 0), ""); verify(smprint("%.0x", 0), ""); verify(smprint("%#.0o", 0), "0"); verify(smprint("%#.0x", 0), ""); /* difficult floating point tests that many libraries get wrong */ verify(smprint("%.100f", 1.0), "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); verify(smprint("%.100g", 1.0), "1"); verify(smprint("%0100f", 1.0), "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001.000000"); for(i=1; i<9; i++) for(j=0; j<=i; j++) verify(smprint("%.*g", j, near1[i]), "1"); /* test $ reorderings */ verify(smprint("%3$d %4$06d %2$d %1$d", 444, 333, 111, 222), "111 000222 333 444"); verify(smprint("%3$Zd %5$06d %2$d %1$d", 444, 333, 555, 111, 222), "111 000222 333 444"); verify(smprint("%3$d %4$*5$06d %2$d %1$d", 444, 333, 111, 222, 20), "111 000222 333 444"); verify(smprint("%3$hd %4$*5$06d %2$d %1$d", 444, 333, (short)111, 222, 20), "111 000222 333 444"); verify(smprint("%3$\xe2\x98\xba""d %5$06d %2$d %1$d", 444, 333, 555, 111, 222), "111 000222 333 444"); /* test %'d formats */ verify(smprint("%'d %'d %'d", 1, 2222, 33333333), "1 2,222 33,333,333"); verify(smprint("%'019d", 0), "000,000,000,000,000"); verify(smprint("%'08d %'08d %'08d", 1, 2222, 33333333), "0,000,001 0,002,222 33,333,333"); #ifdef PLAN9PORT verify(smprint("%'ux %'uX %'ub", 0x11111111, 0xabcd1234, 12345), "1111:1111 ABCD:1234 11:0000:0011:1001"); #else verify(smprint("%'x %'X %'b", 0x11111111, 0xabcd1234, 12345), "1111:1111 ABCD:1234 11:0000:0011:1001"); #endif verify(smprint("%'lld %'lld %'lld", 1LL, 222222222LL, 3333333333333LL), "1 222,222,222 3,333,333,333,333"); verify(smprint("%'019lld %'019lld %'019lld", 1LL, 222222222LL, 3333333333333LL), "000,000,000,000,001 000,000,222,222,222 003,333,333,333,333"); #ifdef PLAN9PORT verify(smprint("%'llux %'lluX %'llub", 0x111111111111LL, 0xabcd12345678LL, 112342345LL), "1111:1111:1111 ABCD:1234:5678 110:1011:0010:0011:0101:0100:1001"); #else verify(smprint("%'llx %'llX %'llb", 0x111111111111LL, 0xabcd12345678LL, 112342345LL), "1111:1111:1111 ABCD:1234:5678 110:1011:0010:0011:0101:0100:1001"); #endif /* test %'d with custom (utf-8!) separators */ /* x and b still use : */ verify(mysmprint("%'d %'d %'d", 1, 2222, 33333333), "1 2\xe2\x98\xbb""22\xe2\x98\xbb""2 33\xe2\x98\xbb""333\xe2\x98\xbb""33\xe2\x98\xbb""3"); #ifdef PLAN9PORT verify(mysmprint("%'ux %'uX %'ub", 0x11111111, 0xabcd1234, 12345), "1111:1111 ABCD:1234 11:0000:0011:1001"); #else verify(mysmprint("%'x %'X %'b", 0x11111111, 0xabcd1234, 12345), "1111:1111 ABCD:1234 11:0000:0011:1001"); #endif verify(mysmprint("%'lld %'lld %'lld", 1LL, 222222222LL, 3333333333333LL), "1 222\xe2\x98\xbb""222\xe2\x98\xbb""22\xe2\x98\xbb""2 333\xe2\x98\xbb""3333\xe2\x98\xbb""333\xe2\x98\xbb""33\xe2\x98\xbb""3"); verify(mysmprint("%'llx %'llX %'llb", 0x111111111111LL, 0xabcd12345678LL, 112342345LL), "1111:1111:1111 ABCD:1234:5678 110:1011:0010:0011:0101:0100:1001"); verify(mysmprint("%.4f", 3.14159), "3\xe2\x98\xba""1416"); if(failed) sysfatal("tests failed"); exits(0); } 9base-6/lib9/zoneinfo.c0000644000175000017500000000602411402154555014402 0ustar anselmanselm#include #include /* * Access local time entries of zoneinfo files. * Formats 0 and 2 are supported, and 4-byte timestamps * * Copyright © 2008 M. Teichgräber * Contributed under the terms of the Lucent Public License 1.02. */ #include "zoneinfo.h" static struct Zoneinfo { int timecnt; /* # of transition times */ int typecnt; /* # of local time types */ int charcnt; /* # of characters of time zone abbreviation strings */ uchar *ptime; uchar *ptype; uchar *ptt; uchar *pzone; } z; static uchar *tzdata; static uchar* readtzfile(char *file) { uchar *p; int fd; Dir *d; fd = open(file, OREAD); if (fd<0) return nil; d = dirfstat(fd); if (d==nil) return nil; p = malloc(d->length); if (p!=nil) readn(fd, p, d->length); free(d); close(fd); return p; } static char *zonefile; void tzfile(char *f) { if (tzdata!=nil) { free(tzdata); tzdata = nil; } z.timecnt = 0; zonefile = f; } static long get4(uchar *p) { return (p[0]<<24)+(p[1]<<16)+(p[2]<<8)+p[3]; } enum { TTinfosz = 4+1+1, }; static int parsehead(void) { uchar *p; int ver; ver = tzdata[4]; if (ver!=0) if (ver!='2') return -1; p = tzdata + 4 + 1 + 15; z.timecnt = get4(p+3*4); z.typecnt = get4(p+4*4); if (z.typecnt==0) return -1; z.charcnt = get4(p+5*4); z.ptime = p+6*4; z.ptype = z.ptime + z.timecnt*4; z.ptt = z.ptype + z.timecnt; z.pzone = z.ptt + z.typecnt*TTinfosz; return 0; } static void ttinfo(Tinfo *ti, int tti) { uchar *p; int i; i = z.ptype[tti]; assert(itzoff = get4(p); ti->dlflag = p[4]; assert(p[5]zone = (char*)z.pzone + p[5]; } static void readtimezone(void) { char *tmp; z.timecnt = 0; switch (zonefile==nil) { default: if ((tmp=getenv("timezone"))!=nil) { tzdata = readtzfile(tmp); free(tmp); break; } zonefile = "/etc/localtime"; /* fall through */ case 0: tzdata = readtzfile(zonefile); } if (tzdata==nil) return; if (strncmp("TZif", (char*)tzdata, 4)!=0) goto errfree; if (parsehead()==-1) { errfree: free(tzdata); tzdata = nil; z.timecnt = 0; return; } } static tlong gett4(uchar *p) { long l; l = get4(p); if (l<0) return 0; return l; } int zonetinfo(Tinfo *ti, int i) { if (tzdata==nil) readtimezone(); if (i<0 || i>=z.timecnt) return -1; ti->t = gett4(z.ptime + 4*i); ttinfo(ti, i); return i; } int zonelookuptinfo(Tinfo *ti, tlong t) { uchar *p; int i; tlong oldtt, tt; if (tzdata==nil) readtimezone(); oldtt = 0; p = z.ptime; for (i=0; i0) { ttinfo(ti, i-1); ti->t = oldtt; // fprint(2, "t:%ld off:%d dflag:%d %s\n", (long)ti->t, ti->tzoff, ti->dlflag, ti->zone); return i-1; } return -1; } void zonedump(int fd) { int i; uchar *p; tlong t; Tinfo ti; if (tzdata==nil) readtimezone(); p = z.ptime; for (i=0; i #define NOPLAN9DEFINES #include #include extern int _p9strsig(char*); int postnote(int who, int pid, char *msg) { int sig; sig = _p9strsig(msg); if(sig == 0){ werrstr("unknown note"); return -1; } switch(who){ default: werrstr("bad who in postnote"); return -1; case PNPROC: return kill(pid, sig); case PNGROUP: if((pid = getpgid(pid)) < 0) return -1; return killpg(pid, sig); } } 9base-6/lib9/testprint.c0000644000175000017500000000051611402154555014607 0ustar anselmanselm#include #include void main(int argc, char **argv) { char c; c = argv[1][strlen(argv[1])-1]; if(c == 'f' || c == 'e' || c == 'g' || c == 'F' || c == 'E' || c == 'G') print(argv[1], atof(argv[2])); else if(c == 'x' || c == 'u' || c == 'd' || c == 'c' || c == 'C' || c == 'X') print(argv[1], atoi(argv[2])); } 9base-6/lib9/opentemp.c0000644000175000017500000000040011402154555014372 0ustar anselmanselm#include #include int opentemp(char *template, int mode) { int fd, fd1; fd = mkstemp(template); if(fd < 0) return -1; if((fd1 = open(template, mode)) < 0){ remove(template); close(fd); return -1; } close(fd); return fd1; } 9base-6/lib9/regex/0000755000175000017500000000000011402154555013517 5ustar anselmanselm9base-6/lib9/regex/regaux.c0000644000175000017500000000405111402154555015156 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" #include "regcomp.h" /* * save a new match in mp */ extern void _renewmatch(Resub *mp, int ms, Resublist *sp) { int i; if(mp==0 || ms<=0) return; if(mp[0].s.sp==0 || sp->m[0].s.spm[0].s.sp==mp[0].s.sp && sp->m[0].e.ep>mp[0].e.ep)){ for(i=0; im[i]; for(; iinst; p++){ if(p->inst == ip){ if(sep->m[0].s.sp < p->se.m[0].s.sp){ if(ms > 1) p->se = *sep; else p->se.m[0] = sep->m[0]; } return 0; } } p->inst = ip; if(ms > 1) p->se = *sep; else p->se.m[0] = sep->m[0]; (++p)->inst = 0; return p; } /* * same as renewthread, but called with * initial empty start pointer. */ extern Relist* _renewemptythread(Relist *lp, /* _relist to add to */ Reinst *ip, /* instruction to add */ int ms, char *sp) /* pointers to subexpressions */ { Relist *p; for(p=lp; p->inst; p++){ if(p->inst == ip){ if(sp < p->se.m[0].s.sp) { if(ms > 1) memset(&p->se, 0, sizeof(p->se)); p->se.m[0].s.sp = sp; } return 0; } } p->inst = ip; if(ms > 1) memset(&p->se, 0, sizeof(p->se)); p->se.m[0].s.sp = sp; (++p)->inst = 0; return p; } extern Relist* _rrenewemptythread(Relist *lp, /* _relist to add to */ Reinst *ip, /* instruction to add */ int ms, Rune *rsp) /* pointers to subexpressions */ { Relist *p; for(p=lp; p->inst; p++){ if(p->inst == ip){ if(rsp < p->se.m[0].s.rsp) { if(ms > 1) memset(&p->se, 0, sizeof(p->se)); p->se.m[0].s.rsp = rsp; } return 0; } } p->inst = ip; if(ms > 1) memset(&p->se, 0, sizeof(p->se)); p->se.m[0].s.rsp = rsp; (++p)->inst = 0; return p; } 9base-6/lib9/regex/rregexec.c0000644000175000017500000001117111402154555015470 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" #include "regcomp.h" /* * return 0 if no match * >0 if a match * <0 if we ran out of _relist space */ static int rregexec1(Reprog *progp, /* program to run */ Rune *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms, /* number of elements at mp */ Reljunk *j) { int flag=0; Reinst *inst; Relist *tlp; Rune *s; int i, checkstart; Rune r, *rp, *ep; Relist* tl; /* This list, next list */ Relist* nl; Relist* tle; /* ends of this and next list */ Relist* nle; int match; Rune *p; match = 0; checkstart = j->startchar; if(mp) for(i=0; irelist[0][0].inst = 0; j->relist[1][0].inst = 0; /* Execute machine once for each character, including terminal NUL */ s = j->rstarts; do{ /* fast check for first char */ if(checkstart) { switch(j->starttype) { case RUNE: p = runestrchr(s, j->startchar); if(p == 0 || p == j->reol) return match; s = p; break; case BOL: if(s == bol) break; p = runestrchr(s, '\n'); if(p == 0 || s == j->reol) return match; s = p+1; break; } } r = *s; /* switch run lists */ tl = j->relist[flag]; tle = j->reliste[flag]; nl = j->relist[flag^=1]; nle = j->reliste[flag]; nl->inst = 0; /* Add first instruction to current list */ _rrenewemptythread(tl, progp->startinst, ms, s); /* Execute machine until current list is empty */ for(tlp=tl; tlp->inst; tlp++){ for(inst=tlp->inst; ; inst = inst->u2.next){ switch(inst->type){ case RUNE: /* regular character */ if(inst->u1.r == r) if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case LBRA: tlp->se.m[inst->u1.subid].s.rsp = s; continue; case RBRA: tlp->se.m[inst->u1.subid].e.rep = s; continue; case ANY: if(r != '\n') if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case ANYNL: if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case BOL: if(s == bol || *(s-1) == '\n') continue; break; case EOL: if(s == j->reol || r == 0 || r == '\n') continue; break; case CCLASS: ep = inst->u1.cp->end; for(rp = inst->u1.cp->spans; rp < ep; rp += 2) if(r >= rp[0] && r <= rp[1]){ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; } break; case NCCLASS: ep = inst->u1.cp->end; for(rp = inst->u1.cp->spans; rp < ep; rp += 2) if(r >= rp[0] && r <= rp[1]) break; if(rp == ep) if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case OR: /* evaluate right choice later */ if(_renewthread(tlp, inst->u1.right, ms, &tlp->se) == tle) return -1; /* efficiency: advance and re-evaluate */ continue; case END: /* Match! */ match = 1; tlp->se.m[0].e.rep = s; if(mp != 0) _renewmatch(mp, ms, &tlp->se); break; } break; } } if(s == j->reol) break; checkstart = j->startchar && nl->inst==0; s++; }while(r); return match; } static int rregexec2(Reprog *progp, /* program to run */ Rune *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms, /* number of elements at mp */ Reljunk *j ) { Relist relist0[5*LISTSIZE], relist1[5*LISTSIZE]; /* mark space */ j->relist[0] = relist0; j->relist[1] = relist1; j->reliste[0] = relist0 + nelem(relist0) - 2; j->reliste[1] = relist1 + nelem(relist1) - 2; return rregexec1(progp, bol, mp, ms, j); } extern int rregexec(Reprog *progp, /* program to run */ Rune *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms) /* number of elements at mp */ { Reljunk j; Relist relist0[LISTSIZE], relist1[LISTSIZE]; int rv; /* * use user-specified starting/ending location if specified */ j.rstarts = bol; j.reol = 0; if(mp && ms>0){ if(mp->s.sp) j.rstarts = mp->s.rsp; if(mp->e.ep) j.reol = mp->e.rep; } j.starttype = 0; j.startchar = 0; if(progp->startinst->type == RUNE && progp->startinst->u1.r < Runeself) { j.starttype = RUNE; j.startchar = progp->startinst->u1.r; } if(progp->startinst->type == BOL) j.starttype = BOL; /* mark space */ j.relist[0] = relist0; j.relist[1] = relist1; j.reliste[0] = relist0 + nelem(relist0) - 2; j.reliste[1] = relist1 + nelem(relist1) - 2; rv = rregexec1(progp, bol, mp, ms, &j); if(rv >= 0) return rv; rv = rregexec2(progp, bol, mp, ms, &j); if(rv >= 0) return rv; return -1; } 9base-6/lib9/regex/lib9.h0000644000175000017500000000004111402154555014522 0ustar anselmanselm#include #include 9base-6/lib9/regex/regsub.c0000644000175000017500000000215511402154555015155 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" /* substitute into one string using the matches from the last regexec() */ extern void regsub(char *sp, /* source string */ char *dp, /* destination string */ int dlen, Resub *mp, /* subexpression elements */ int ms) /* number of elements pointed to by mp */ { char *ssp, *ep; int i; ep = dp+dlen-1; while(*sp != '\0'){ if(*sp == '\\'){ switch(*++sp){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = *sp-'0'; if(mp[i].s.sp != 0 && mp!=0 && ms>i) for(ssp = mp[i].s.sp; ssp < mp[i].e.ep; ssp++) if(dp < ep) *dp++ = *ssp; break; case '\\': if(dp < ep) *dp++ = '\\'; break; case '\0': sp--; break; default: if(dp < ep) *dp++ = *sp; break; } }else if(*sp == '&'){ if(mp[0].s.sp != 0 && mp!=0 && ms>0) if(mp[0].s.sp != 0) for(ssp = mp[0].s.sp; ssp < mp[0].e.ep; ssp++) if(dp < ep) *dp++ = *ssp; }else{ if(dp < ep) *dp++ = *sp; } sp++; } *dp = '\0'; } 9base-6/lib9/regex/test2.c0000644000175000017500000000052411402154555014725 0ustar anselmanselm#include "lib9.h" #include main(int ac, char **av) { Resub rs[10]; Reprog *p; char *s; int i; p = regcomp("[^a-z]"); s = "\n"; if(regexec(p, s, rs, 10)) print("%s %lux %lux %lux\n", s, s, rs[0].sp, rs[0].ep); s = "0"; if(regexec(p, s, rs, 10)) print("%s %lux %lux %lux\n", s, s, rs[0].sp, rs[0].ep); exit(0); } 9base-6/lib9/regex/regerror.c0000644000175000017500000000030411402154555015507 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" void regerror(char *s) { char buf[132]; strcpy(buf, "regerror: "); strcat(buf, s); strcat(buf, "\n"); write(2, buf, strlen(buf)); exits("regerr"); } 9base-6/lib9/regex/regcomp.c0000644000175000017500000002301711402154555015322 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" #include "regcomp.h" #define TRUE 1 #define FALSE 0 /* * Parser Information */ typedef struct Node { Reinst* first; Reinst* last; }Node; #define NSTACK 20 static Node andstack[NSTACK]; static Node *andp; static int atorstack[NSTACK]; static int* atorp; static int cursubid; /* id of current subexpression */ static int subidstack[NSTACK]; /* parallel to atorstack */ static int* subidp; static int lastwasand; /* Last token was operand */ static int nbra; static char* exprp; /* pointer to next character in source expression */ static int lexdone; static int nclass; static Reclass*classp; static Reinst* freep; static int errors; static Rune yyrune; /* last lex'd rune */ static Reclass*yyclassp; /* last lex'd class */ /* predeclared crap */ static void operator(int); static void pushand(Reinst*, Reinst*); static void pushator(int); static void evaluntil(int); static int bldcclass(void); static jmp_buf regkaboom; static void rcerror(char *s) { errors++; regerror(s); longjmp(regkaboom, 1); } static Reinst* newinst(int t) { freep->type = t; freep->u2.left = 0; freep->u1.right = 0; return freep++; } static void operand(int t) { Reinst *i; if(lastwasand) operator(CAT); /* catenate is implicit */ i = newinst(t); if(t == CCLASS || t == NCCLASS) i->u1.cp = yyclassp; if(t == RUNE) i->u1.r = yyrune; pushand(i, i); lastwasand = TRUE; } static void operator(int t) { if(t==RBRA && --nbra<0) rcerror("unmatched right paren"); if(t==LBRA){ if(++cursubid >= NSUBEXP) rcerror ("too many subexpressions"); nbra++; if(lastwasand) operator(CAT); } else evaluntil(t); if(t != RBRA) pushator(t); lastwasand = FALSE; if(t==STAR || t==QUEST || t==PLUS || t==RBRA) lastwasand = TRUE; /* these look like operands */ } static void regerr2(char *s, int c) { char buf[100]; char *cp = buf; while(*s) *cp++ = *s++; *cp++ = c; *cp = '\0'; rcerror(buf); } static void cant(char *s) { char buf[100]; strcpy(buf, "can't happen: "); strcat(buf, s); rcerror(buf); } static void pushand(Reinst *f, Reinst *l) { if(andp >= &andstack[NSTACK]) cant("operand stack overflow"); andp->first = f; andp->last = l; andp++; } static void pushator(int t) { if(atorp >= &atorstack[NSTACK]) cant("operator stack overflow"); *atorp++ = t; *subidp++ = cursubid; } static Node* popand(int op) { Reinst *inst; if(andp <= &andstack[0]){ regerr2("missing operand for ", op); inst = newinst(NOP); pushand(inst,inst); } return --andp; } static int popator(void) { if(atorp <= &atorstack[0]) cant("operator stack underflow"); --subidp; return *--atorp; } static void evaluntil(int pri) { Node *op1, *op2; Reinst *inst1, *inst2; while(pri==RBRA || atorp[-1]>=pri){ switch(popator()){ default: rcerror("unknown operator in evaluntil"); break; case LBRA: /* must have been RBRA */ op1 = popand('('); inst2 = newinst(RBRA); inst2->u1.subid = *subidp; op1->last->u2.next = inst2; inst1 = newinst(LBRA); inst1->u1.subid = *subidp; inst1->u2.next = op1->first; pushand(inst1, inst2); return; case OR: op2 = popand('|'); op1 = popand('|'); inst2 = newinst(NOP); op2->last->u2.next = inst2; op1->last->u2.next = inst2; inst1 = newinst(OR); inst1->u1.right = op1->first; inst1->u2.left = op2->first; pushand(inst1, inst2); break; case CAT: op2 = popand(0); op1 = popand(0); op1->last->u2.next = op2->first; pushand(op1->first, op2->last); break; case STAR: op2 = popand('*'); inst1 = newinst(OR); op2->last->u2.next = inst1; inst1->u1.right = op2->first; pushand(inst1, inst1); break; case PLUS: op2 = popand('+'); inst1 = newinst(OR); op2->last->u2.next = inst1; inst1->u1.right = op2->first; pushand(op2->first, inst1); break; case QUEST: op2 = popand('?'); inst1 = newinst(OR); inst2 = newinst(NOP); inst1->u2.left = inst2; inst1->u1.right = op2->first; op2->last->u2.next = inst2; pushand(inst1, inst2); break; } } } static Reprog* optimize(Reprog *pp) { Reinst *inst, *target; int size; Reprog *npp; Reclass *cl; int diff; /* * get rid of NOOP chains */ for(inst=pp->firstinst; inst->type!=END; inst++){ target = inst->u2.next; while(target->type == NOP) target = target->u2.next; inst->u2.next = target; } /* * The original allocation is for an area larger than * necessary. Reallocate to the actual space used * and then relocate the code. */ size = sizeof(Reprog) + (freep - pp->firstinst)*sizeof(Reinst); npp = realloc(pp, size); if(npp==0 || npp==pp) return pp; diff = (char *)npp - (char *)pp; freep = (Reinst *)((char *)freep + diff); for(inst=npp->firstinst; insttype){ case OR: case STAR: case PLUS: case QUEST: inst->u1.right = (void*)((char*)inst->u1.right + diff); break; case CCLASS: case NCCLASS: inst->u1.right = (void*)((char*)inst->u1.right + diff); cl = inst->u1.cp; cl->end = (void*)((char*)cl->end + diff); break; } inst->u2.left = (void*)((char*)inst->u2.left + diff); } npp->startinst = (void*)((char*)npp->startinst + diff); return npp; } #ifdef DEBUG static void dumpstack(void){ Node *stk; int *ip; print("operators\n"); for(ip=atorstack; ipfirst->type, stk->last->type); } static void dump(Reprog *pp) { Reinst *l; Rune *p; l = pp->firstinst; do{ print("%d:\t0%o\t%d\t%d", l-pp->firstinst, l->type, l->u2.left-pp->firstinst, l->u1.right-pp->firstinst); if(l->type == RUNE) print("\t%C\n", l->u1.r); else if(l->type == CCLASS || l->type == NCCLASS){ print("\t["); if(l->type == NCCLASS) print("^"); for(p = l->u1.cp->spans; p < l->u1.cp->end; p += 2) if(p[0] == p[1]) print("%C", p[0]); else print("%C-%C", p[0], p[1]); print("]\n"); } else print("\n"); }while(l++->type); } #endif static Reclass* newclass(void) { if(nclass >= NCLASS) regerr2("too many character classes; limit", NCLASS+'0'); return &(classp[nclass++]); } static int nextc(Rune *rp) { if(lexdone){ *rp = 0; return 1; } exprp += chartorune(rp, exprp); if(*rp == '\\'){ exprp += chartorune(rp, exprp); return 1; } if(*rp == 0) lexdone = 1; return 0; } static int lex(int literal, int dot_type) { int quoted; quoted = nextc(&yyrune); if(literal || quoted){ if(yyrune == 0) return END; return RUNE; } switch(yyrune){ case 0: return END; case '*': return STAR; case '?': return QUEST; case '+': return PLUS; case '|': return OR; case '.': return dot_type; case '(': return LBRA; case ')': return RBRA; case '^': return BOL; case '$': return EOL; case '[': return bldcclass(); } return RUNE; } static int bldcclass(void) { int type; Rune r[NCCRUNE]; Rune *p, *ep, *np; Rune rune; int quoted; /* we have already seen the '[' */ type = CCLASS; yyclassp = newclass(); /* look ahead for negation */ /* SPECIAL CASE!!! negated classes don't match \n */ ep = r; quoted = nextc(&rune); if(!quoted && rune == '^'){ type = NCCLASS; quoted = nextc(&rune); *ep++ = '\n'; *ep++ = '\n'; } /* parse class into a set of spans */ for(; ep<&r[NCCRUNE];){ if(rune == 0){ rcerror("malformed '[]'"); return 0; } if(!quoted && rune == ']') break; if(!quoted && rune == '-'){ if(ep == r){ rcerror("malformed '[]'"); return 0; } quoted = nextc(&rune); if((!quoted && rune == ']') || rune == 0){ rcerror("malformed '[]'"); return 0; } *(ep-1) = rune; } else { *ep++ = rune; *ep++ = rune; } quoted = nextc(&rune); } /* sort on span start */ for(p = r; p < ep; p += 2){ for(np = p; np < ep; np += 2) if(*np < *p){ rune = np[0]; np[0] = p[0]; p[0] = rune; rune = np[1]; np[1] = p[1]; p[1] = rune; } } /* merge spans */ np = yyclassp->spans; p = r; if(r == ep) yyclassp->end = np; else { np[0] = *p++; np[1] = *p++; for(; p < ep; p += 2) if(p[0] <= np[1]){ if(p[1] > np[1]) np[1] = p[1]; } else { np += 2; np[0] = p[0]; np[1] = p[1]; } yyclassp->end = np+2; } return type; } static Reprog* regcomp1(char *s, int literal, int dot_type) { int token; Reprog *volatile pp; /* get memory for the program */ pp = malloc(sizeof(Reprog) + 6*sizeof(Reinst)*strlen(s)); if(pp == 0){ regerror("out of memory"); return 0; } freep = pp->firstinst; classp = pp->class; errors = 0; if(setjmp(regkaboom)) goto out; /* go compile the sucker */ lexdone = 0; exprp = s; nclass = 0; nbra = 0; atorp = atorstack; andp = andstack; subidp = subidstack; lastwasand = FALSE; cursubid = 0; /* Start with a low priority operator to prime parser */ pushator(START-1); while((token = lex(literal, dot_type)) != END){ if((token&0300) == OPERATOR) operator(token); else operand(token); } /* Close with a low priority operator */ evaluntil(START); /* Force END */ operand(END); evaluntil(START); #ifdef DEBUG dumpstack(); #endif if(nbra) rcerror("unmatched left paren"); --andp; /* points to first and only operand */ pp->startinst = andp->first; #ifdef DEBUG dump(pp); #endif pp = optimize(pp); #ifdef DEBUG print("start: %d\n", andp->first-pp->firstinst); dump(pp); #endif out: if(errors){ free(pp); pp = 0; } return pp; } extern Reprog* regcomp(char *s) { return regcomp1(s, 0, ANY); } extern Reprog* regcomplit(char *s) { return regcomp1(s, 1, ANY); } extern Reprog* regcompnl(char *s) { return regcomp1(s, 0, ANYNL); } 9base-6/lib9/regex/rregsub.c0000644000175000017500000000220411402154555015332 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" /* substitute into one string using the matches from the last regexec() */ extern void rregsub(Rune *sp, /* source string */ Rune *dp, /* destination string */ int dlen, Resub *mp, /* subexpression elements */ int ms) /* number of elements pointed to by mp */ { Rune *ssp, *ep; int i; ep = dp+(dlen/sizeof(Rune))-1; while(*sp != '\0'){ if(*sp == '\\'){ switch(*++sp){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = *sp-'0'; if(mp[i].s.rsp != 0 && mp!=0 && ms>i) for(ssp = mp[i].s.rsp; ssp < mp[i].e.rep; ssp++) if(dp < ep) *dp++ = *ssp; break; case '\\': if(dp < ep) *dp++ = '\\'; break; case '\0': sp--; break; default: if(dp < ep) *dp++ = *sp; break; } }else if(*sp == '&'){ if(mp[0].s.rsp != 0 && mp!=0 && ms>0) if(mp[0].s.rsp != 0) for(ssp = mp[0].s.rsp; ssp < mp[0].e.rep; ssp++) if(dp < ep) *dp++ = *ssp; }else{ if(dp < ep) *dp++ = *sp; } sp++; } *dp = '\0'; } 9base-6/lib9/regex/cvt0000644000175000017500000000036611402154555014243 0ustar anselmanselm#!/bin/sh /usr/bin/sed -E ' s/\.(sp|rsp)/.s.\1/g s/\.(ep|rep)/.e.\1/g s/(\.|->)(cp|r|subid|right)([^a-zA-Z0-9_])/\1u1.\2\3/g s/(\.|->)(left|next)([^a-z])/\1u2.\2\3/g /#include /d s//"lib9.h"/g s/"regexp.h"/"regexp9.h"/g ' $* 9base-6/lib9/regex/regexec.c0000644000175000017500000001164511402154555015314 0ustar anselmanselm#include "lib9.h" #include "regexp9.h" #include "regcomp.h" /* * return 0 if no match * >0 if a match * <0 if we ran out of _relist space */ static int regexec1(Reprog *progp, /* program to run */ char *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms, /* number of elements at mp */ Reljunk *j ) { int flag=0; Reinst *inst; Relist *tlp; char *s; int i, checkstart; Rune r, *rp, *ep; int n; Relist* tl; /* This list, next list */ Relist* nl; Relist* tle; /* ends of this and next list */ Relist* nle; int match; char *p; match = 0; checkstart = j->starttype; if(mp) for(i=0; irelist[0][0].inst = 0; j->relist[1][0].inst = 0; /* Execute machine once for each character, including terminal NUL */ s = j->starts; do{ /* fast check for first char */ if(checkstart) { switch(j->starttype) { case RUNE: p = utfrune(s, j->startchar); if(p == 0 || s == j->eol) return match; s = p; break; case BOL: if(s == bol) break; p = utfrune(s, '\n'); if(p == 0 || s == j->eol) return match; s = p+1; break; } } r = *(uchar*)s; if(r < Runeself) n = 1; else n = chartorune(&r, s); /* switch run lists */ tl = j->relist[flag]; tle = j->reliste[flag]; nl = j->relist[flag^=1]; nle = j->reliste[flag]; nl->inst = 0; /* Add first instruction to current list */ if(match == 0) _renewemptythread(tl, progp->startinst, ms, s); /* Execute machine until current list is empty */ for(tlp=tl; tlp->inst; tlp++){ /* assignment = */ for(inst = tlp->inst; ; inst = inst->u2.next){ switch(inst->type){ case RUNE: /* regular character */ if(inst->u1.r == r){ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; } break; case LBRA: tlp->se.m[inst->u1.subid].s.sp = s; continue; case RBRA: tlp->se.m[inst->u1.subid].e.ep = s; continue; case ANY: if(r != '\n') if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case ANYNL: if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case BOL: if(s == bol || *(s-1) == '\n') continue; break; case EOL: if(s == j->eol || r == 0 || r == '\n') continue; break; case CCLASS: ep = inst->u1.cp->end; for(rp = inst->u1.cp->spans; rp < ep; rp += 2) if(r >= rp[0] && r <= rp[1]){ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; } break; case NCCLASS: ep = inst->u1.cp->end; for(rp = inst->u1.cp->spans; rp < ep; rp += 2) if(r >= rp[0] && r <= rp[1]) break; if(rp == ep) if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle) return -1; break; case OR: /* evaluate right choice later */ if(_renewthread(tlp, inst->u1.right, ms, &tlp->se) == tle) return -1; /* efficiency: advance and re-evaluate */ continue; case END: /* Match! */ match = 1; tlp->se.m[0].e.ep = s; if(mp != 0) _renewmatch(mp, ms, &tlp->se); break; } break; } } if(s == j->eol) break; checkstart = j->starttype && nl->inst==0; s += n; }while(r); return match; } static int regexec2(Reprog *progp, /* program to run */ char *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms, /* number of elements at mp */ Reljunk *j ) { int rv; Relist *relist0, *relist1; /* mark space */ relist0 = malloc(BIGLISTSIZE*sizeof(Relist)); if(relist0 == nil) return -1; relist1 = malloc(BIGLISTSIZE*sizeof(Relist)); if(relist1 == nil){ free(relist1); return -1; } j->relist[0] = relist0; j->relist[1] = relist1; j->reliste[0] = relist0 + BIGLISTSIZE - 2; j->reliste[1] = relist1 + BIGLISTSIZE - 2; rv = regexec1(progp, bol, mp, ms, j); free(relist0); free(relist1); return rv; } extern int regexec(Reprog *progp, /* program to run */ char *bol, /* string to run machine on */ Resub *mp, /* subexpression elements */ int ms) /* number of elements at mp */ { Reljunk j; Relist relist0[LISTSIZE], relist1[LISTSIZE]; int rv; /* * use user-specified starting/ending location if specified */ j.starts = bol; j.eol = 0; if(mp && ms>0){ if(mp->s.sp) j.starts = mp->s.sp; if(mp->e.ep) j.eol = mp->e.ep; } j.starttype = 0; j.startchar = 0; if(progp->startinst->type == RUNE && progp->startinst->u1.r < Runeself) { j.starttype = RUNE; j.startchar = progp->startinst->u1.r; } if(progp->startinst->type == BOL) j.starttype = BOL; /* mark space */ j.relist[0] = relist0; j.relist[1] = relist1; j.reliste[0] = relist0 + nelem(relist0) - 2; j.reliste[1] = relist1 + nelem(relist1) - 2; rv = regexec1(progp, bol, mp, ms, &j); if(rv >= 0) return rv; rv = regexec2(progp, bol, mp, ms, &j); if(rv >= 0) return rv; return -1; } 9base-6/lib9/regex/regcomp.h0000644000175000017500000000405311402154555015326 0ustar anselmanselm/* * substitution list */ #define uchar __reuchar typedef unsigned char uchar; #define nelem(x) (sizeof(x)/sizeof((x)[0])) #define NSUBEXP 32 typedef struct Resublist Resublist; struct Resublist { Resub m[NSUBEXP]; }; /* max character classes per program */ extern Reprog RePrOg; #define NCLASS (sizeof(RePrOg.class)/sizeof(Reclass)) /* max rune ranges per character class */ #define NCCRUNE (sizeof(Reclass)/sizeof(Rune)) /* * Actions and Tokens (Reinst types) * * 02xx are operators, value == precedence * 03xx are tokens, i.e. operands for operators */ #define RUNE 0177 #define OPERATOR 0200 /* Bitmask of all operators */ #define START 0200 /* Start, used for marker on stack */ #define RBRA 0201 /* Right bracket, ) */ #define LBRA 0202 /* Left bracket, ( */ #define OR 0203 /* Alternation, | */ #define CAT 0204 /* Concatentation, implicit operator */ #define STAR 0205 /* Closure, * */ #define PLUS 0206 /* a+ == aa* */ #define QUEST 0207 /* a? == a|nothing, i.e. 0 or 1 a's */ #define ANY 0300 /* Any character except newline, . */ #define ANYNL 0301 /* Any character including newline, . */ #define NOP 0302 /* No operation, internal use only */ #define BOL 0303 /* Beginning of line, ^ */ #define EOL 0304 /* End of line, $ */ #define CCLASS 0305 /* Character class, [] */ #define NCCLASS 0306 /* Negated character class, [] */ #define END 0377 /* Terminate: match found */ /* * regexec execution lists */ #define LISTSIZE 10 #define BIGLISTSIZE (10*LISTSIZE) typedef struct Relist Relist; struct Relist { Reinst* inst; /* Reinstruction of the thread */ Resublist se; /* matched subexpressions in this thread */ }; typedef struct Reljunk Reljunk; struct Reljunk { Relist* relist[2]; Relist* reliste[2]; int starttype; Rune startchar; char* starts; char* eol; Rune* rstarts; Rune* reol; }; extern Relist* _renewthread(Relist*, Reinst*, int, Resublist*); extern void _renewmatch(Resub*, int, Resublist*); extern Relist* _renewemptythread(Relist*, Reinst*, int, char*); extern Relist* _rrenewemptythread(Relist*, Reinst*, int, Rune*); 9base-6/lib9/regex/test.c0000644000175000017500000000175311402154555014650 0ustar anselmanselm#include "lib9.h" #include struct x { char *re; char *s; Reprog *p; }; struct x t[] = { { "^[^!@]+$", "/bin/upas/aliasmail '&'", 0 }, { "^local!(.*)$", "/mail/box/\\1/mbox", 0 }, { "^plan9!(.*)$", "\\1", 0 }, { "^helix!(.*)$", "\\1", 0 }, { "^([^!]+)@([^!@]+)$", "\\2!\\1", 0 }, { "^(uk\\.[^!]*)(!.*)$", "/bin/upas/uk2uk '\\1' '\\2'", 0 }, { "^[^!]*\\.[^!]*!.*$", "inet!&", 0 }, { "^\xE2\x98\xBA$", "smiley", 0 }, { "^(coma|research|pipe|pyxis|inet|hunny|gauss)!(.*)$", "/mail/lib/qmail '\\s' 'net!\\1' '\\2'", 0 }, { "^.*$", "/mail/lib/qmail '\\s' 'net!research' '&'", 0 }, { 0, 0, 0 }, }; main(int ac, char **av) { Resub rs[10]; char dst[128]; int n; struct x *tp; for(tp = t; tp->re; tp++) tp->p = regcomp(tp->re); for(tp = t; tp->re; tp++){ print("%s VIA %s", av[1], tp->re); memset(rs, 0, sizeof rs); if(regexec(tp->p, av[1], rs, 10)){ regsub(tp->s, dst, sizeof dst, rs, 10); print(" sub %s -> %s", tp->s, dst); } print("\n"); } exit(0); } 9base-6/lib9/regex/README0000644000175000017500000000036411402154555014402 0ustar anselmanselmThis is a Unix port of the Plan 9 regular expression library, originally done for the Inferno operating system. Russ Cox repackaged this to build as a standalone Unix library. Send comments about packaging to Russ Cox 9base-6/lib9/regex/lib9.std.h0000644000175000017500000000023111402154555015314 0ustar anselmanselm#include #include #include #include #include #define exits(x) exit(x && *x ? 1 : 0) #define nil 0 9base-6/lib9/exec.c0000644000175000017500000000026511402154555013500 0ustar anselmanselm#include #include int exec(char *prog, char *argv[]) { /* to mimic plan 9 should be just exec, but execvp is a better fit for unix */ return execvp(prog, argv); } 9base-6/lib9/cistrcmp.c0000644000175000017500000000050311402154555014373 0ustar anselmanselm#include #include int cistrcmp(char *s1, char *s2) { int c1, c2; while(*s1){ c1 = *(uchar*)s1++; c2 = *(uchar*)s2++; if(c1 == c2) continue; if(c1 >= 'A' && c1 <= 'Z') c1 -= 'A' - 'a'; if(c2 >= 'A' && c2 <= 'Z') c2 -= 'A' - 'a'; if(c1 != c2) return c1 - c2; } return -*s2; } 9base-6/lib9/convD2M.c0000644000175000017500000000360711402154555014027 0ustar anselmanselm#include #include #include uint sizeD2Mu(Dir *d, int dotu) { char *sv[5]; int i, ns, nstr, fixlen; sv[0] = d->name; sv[1] = d->uid; sv[2] = d->gid; sv[3] = d->muid; fixlen = STATFIXLEN; nstr = 4; if(dotu){ fixlen = STATFIXLENU; sv[4] = d->ext; nstr = 5; } ns = 0; for(i = 0; i < nstr; i++) if(sv[i]) ns += strlen(sv[i]); return fixlen + ns; } uint sizeD2M(Dir *d) { return sizeD2Mu(d, 0); } uint convD2Mu(Dir *d, uchar *buf, uint nbuf, int dotu) { uchar *p, *ebuf; char *sv[5]; int i, ns, nsv[5], ss, nstr, fixlen; if(nbuf < BIT16SZ) return 0; p = buf; ebuf = buf + nbuf; sv[0] = d->name; sv[1] = d->uid; sv[2] = d->gid; sv[3] = d->muid; fixlen = STATFIXLEN; nstr = 4; if(dotu){ fixlen = STATFIXLENU; sv[4] = d->ext; nstr = 5; } ns = 0; for(i = 0; i < nstr; i++){ if(sv[i]) nsv[i] = strlen(sv[i]); else nsv[i] = 0; ns += nsv[i]; } ss = fixlen + ns; /* set size befor erroring, so user can know how much is needed */ /* note that length excludes count field itself */ PBIT16(p, ss-BIT16SZ); p += BIT16SZ; if(ss > nbuf) return BIT16SZ; PBIT16(p, d->type); p += BIT16SZ; PBIT32(p, d->dev); p += BIT32SZ; PBIT8(p, d->qid.type); p += BIT8SZ; PBIT32(p, d->qid.vers); p += BIT32SZ; PBIT64(p, d->qid.path); p += BIT64SZ; PBIT32(p, d->mode); p += BIT32SZ; PBIT32(p, d->atime); p += BIT32SZ; PBIT32(p, d->mtime); p += BIT32SZ; PBIT64(p, d->length); p += BIT64SZ; for(i = 0; i < nstr; i++){ ns = nsv[i]; if(p + ns + BIT16SZ > ebuf) return 0; PBIT16(p, ns); p += BIT16SZ; if(ns) memmove(p, sv[i], ns); p += ns; } if(dotu){ PBIT32(p, d->uidnum); p += BIT32SZ; PBIT32(p, d->gidnum); p += BIT32SZ; PBIT32(p, d->muidnum); p += BIT32SZ; } if(ss != p - buf) return 0; return p - buf; } uint convD2M(Dir *d, uchar *buf, uint nbuf) { return convD2Mu(d, buf, nbuf, 0); } 9base-6/lib9/dirfstat.c0000644000175000017500000000077711402154555014404 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*); Dir* dirfstat(int fd) { struct stat st; int nstr; Dir *d; char *str, tmp[100]; if(fstat(fd, &st) < 0) return nil; snprint(tmp, sizeof tmp, "/dev/fd/%d", fd); nstr = _p9dir(&st, &st, tmp, nil, nil, nil); d = mallocz(sizeof(Dir)+nstr, 1); if(d == nil) return nil; str = (char*)&d[1]; _p9dir(&st, &st, tmp, d, &str, str+nstr); return d; } 9base-6/lib9/fork.c0000644000175000017500000000046711402154555013521 0ustar anselmanselm#include #include #include #include "9proc.h" #undef fork int p9fork(void) { int pid; sigset_t all, old; sigfillset(&all); sigprocmask(SIG_SETMASK, &all, &old); pid = fork(); if(pid == 0){ _clearuproc(); _p9uproc(0); } sigprocmask(SIG_SETMASK, &old, nil); return pid; } 9base-6/lib9/quote.c0000644000175000017500000000433711402154555013715 0ustar anselmanselm#include #include /* in libfmt */ extern int (*doquote)(int); extern int __needsquotes(char*, int*); extern int __runeneedsquotes(Rune*, int*); char* unquotestrdup(char *s) { char *t, *ret; int quoting; ret = s = strdup(s); /* return unquoted copy */ if(ret == nil) return ret; quoting = 0; t = s; /* s is output string, t is input string */ while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){ if(*t != '\''){ *s++ = *t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t++; *s++ = *t++; } if(t != s) memmove(s, t, strlen(t)+1); return ret; } Rune* unquoterunestrdup(Rune *s) { Rune *t, *ret; int quoting; ret = s = runestrdup(s); /* return unquoted copy */ if(ret == nil) return ret; quoting = 0; t = s; /* s is output string, t is input string */ while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){ if(*t != '\''){ *s++ = *t++; continue; } /* *t is a quote */ if(!quoting){ quoting = 1; t++; continue; } /* quoting and we're on a quote */ if(t[1] != '\''){ /* end of quoted section; absorb closing quote */ t++; quoting = 0; continue; } /* doubled quote; fold one quote into two */ t++; *s++ = *t++; } if(t != s) memmove(s, t, (runestrlen(t)+1)*sizeof(Rune)); return ret; } char* quotestrdup(char *s) { char *t, *u, *ret; int quotelen; Rune r; if(__needsquotes(s, "elen) == 0) return strdup(s); ret = malloc(quotelen+1); if(ret == nil) return nil; u = ret; *u++ = '\''; for(t=s; *t; t++){ r = *t; if(r == '\'') *u++ = r; /* double the quote */ *u++ = r; } *u++ = '\''; *u = '\0'; return ret; } Rune* quoterunestrdup(Rune *s) { Rune *t, *u, *ret; int quotelen; Rune r; if(__runeneedsquotes(s, "elen) == 0) return runestrdup(s); ret = malloc((quotelen+1)*sizeof(Rune)); if(ret == nil) return nil; u = ret; *u++ = '\''; for(t=s; *t; t++){ r = *t; if(r == '\'') *u++ = r; /* double the quote */ *u++ = r; } *u++ = '\''; *u = '\0'; return ret; } 9base-6/lib9/Makefile0000644000175000017500000000576411402154555014061 0ustar anselmanselm# lib9 - unix port from plan9 lib9 include ../config.mk LIB=lib9.a TARG=lib9 # following objects are not compiled for several reasons # crypt.o # netcrypt.o # convD2M.o # convM2D.o # convM2S.o # convS2M.o SECFILES=\ sec/sha1block.o\ sec/sha1.o\ sec/sha1pickle.o\ sec/md5block.o\ sec/md5.o\ sec/md5pickle.o\ NUM=\ fmt/charstod.o\ fmt/pow10.o\ FMTOFILES=\ fmt/dofmt.o\ fmt/fltfmt.o\ fmt/fmt.o\ fmt/fmtfd.o\ fmt/fmtfdflush.o\ fmt/fmtlocale.o\ fmtlock2.o\ fmt/fmtnull.o\ fmt/fmtprint.o\ fmt/fmtquote.o\ fmt/fmtrune.o\ fmt/fmtstr.o\ fmt/fmtvprint.o\ fmt/fprint.o\ fmt/nan64.o\ fmt/print.o\ fmt/runefmtstr.o\ fmt/runeseprint.o\ fmt/runesmprint.o\ fmt/runesnprint.o\ fmt/runesprint.o\ fmt/runevseprint.o\ fmt/runevsmprint.o\ fmt/runevsnprint.o\ fmt/seprint.o\ fmt/smprint.o\ fmt/snprint.o\ fmt/sprint.o\ fmt/strtod.o\ fmt/vfprint.o\ fmt/vseprint.o\ fmt/vsmprint.o\ fmt/vsnprint.o\ $(NUM)\ UTFOFILES=\ utf/rune.o\ utf/runestrcat.o\ utf/runestrchr.o\ utf/runestrcmp.o\ utf/runestrcpy.o\ utf/runestrdup.o\ utf/runestrlen.o\ utf/runestrecpy.o\ utf/runestrncat.o\ utf/runestrncmp.o\ utf/runestrncpy.o\ utf/runestrrchr.o\ utf/runestrstr.o\ utf/runetype.o\ utf/utfecpy.o\ utf/utflen.o\ utf/utfnlen.o\ utf/utfrrune.o\ utf/utfrune.o\ utf/utfutf.o\ BIOFILES=\ bio/bbuffered.o\ bio/bfildes.o\ bio/bflush.o\ bio/bgetc.o\ bio/bgetrune.o\ bio/bgetd.o\ bio/binit.o\ bio/boffset.o\ bio/bprint.o\ bio/bputc.o\ bio/bputrune.o\ bio/brdline.o\ bio/brdstr.o\ bio/bread.o\ bio/bseek.o\ bio/bvprint.o\ bio/bwrite.o\ REGEXFILES=\ regex/regcomp.o\ regex/regerror.o\ regex/regexec.o\ regex/regsub.o\ regex/regaux.o\ regex/rregexec.o\ regex/rregsub.o\ LIB9OFILES=\ _exits.o\ _p9dialparse.o\ _p9dir.o\ announce.o\ argv0.o\ atexit.o\ atoi.o\ atol.o\ atoll.o\ atnotify.o\ await.o\ cistrcmp.o\ cistrncmp.o\ cistrstr.o\ cleanname.o\ create.o\ ctime.o\ dial.o\ dirfstat.o\ dirfwstat.o\ dirmodefmt.o\ dirread.o\ dirstat.o\ dirwstat.o\ dup.o\ encodefmt.o\ errstr.o\ exec.o\ execl.o\ exitcode.o\ fcallfmt.o\ get9root.o\ getcallerpc-$(OBJTYPE).o\ getenv.o\ getfields.o\ getnetconn.o\ getns.o\ getuser.o\ getwd.o\ jmp.o\ lrand.o\ lnrand.o\ main.o\ malloc.o\ malloctag.o\ mallocz.o\ nan.o\ needsrcquote.o\ needstack.o\ netmkaddr.o\ notify.o\ nrand.o\ nulldir.o\ open.o\ opentemp.o\ pin.o\ pipe.o\ post9p.o\ postnote.o\ qlock.o\ quote.o\ rand.o\ read9pmsg.o\ readcons.o\ readn.o\ rfork.o\ searchpath.o\ seek.o\ sendfd.o\ sleep.o\ strdup.o\ strecpy.o\ sysfatal.o\ syslog.o\ sysname.o\ time.o\ tm2sec.o\ tokenize.o\ truerand.o\ u16.o\ u32.o\ u64.o\ unsharp.o\ wait.o\ waitpid.o\ write.o\ zoneinfo.o\ OFILES=\ $(SECFILES)\ $(FMTOFILES)\ $(UTFOFILES)\ $(BIOFILES)\ $(REGEXFILES)\ $(LIB9OFILES) all: ${LIB} @echo built lib9 install: uninstall: ${LIB}: ${OFILES} @echo AR ${TARG} @${AR} ${LIB} ${OFILES} .c.o: @echo CC $*.c @${CC} -o $*.o ${CFLAGS} -Isec -I${PREFIX}/include $*.c clean: rm -f ${OFILES} ${LIB} 9base-6/lib9/dirmodefmt.c0000644000175000017500000000171111402154555014703 0ustar anselmanselm#include #include static char *modes[] = { "---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx", }; static void rwx(long m, char *s) { strncpy(s, modes[m], 3); } int dirmodefmt(Fmt *f) { static char buf[16]; ulong m; m = va_arg(f->args, ulong); if(m & DMDIR) buf[0]='d'; else if(m & DMAPPEND) buf[0]='a'; else if(m & DMAUTH) buf[0]='A'; else if(m & DMDEVICE) buf[0] = 'D'; else if(m & DMSOCKET) buf[0] = 'S'; else if(m & DMNAMEDPIPE) buf[0] = 'P'; else buf[0]='-'; /* * It's a little weird to have DMSYMLINK conflict with DMEXCL * here, but since you can have symlinks to any of the above * things, this is a better display. Especially since we don't do * DMEXCL on any of the supported systems. */ if(m & DMEXCL) buf[1]='l'; else if(m & DMSYMLINK) buf[1] = 'L'; else buf[1]='-'; rwx((m>>6)&7, buf+2); rwx((m>>3)&7, buf+5); rwx((m>>0)&7, buf+8); buf[11] = 0; return fmtstrcpy(f, buf); } 9base-6/lib9/nulldir.c0000644000175000017500000000021411402154555014217 0ustar anselmanselm#include #include void nulldir(Dir *d) { memset(d, ~0, sizeof(Dir)); d->name = d->uid = d->gid = d->muid = d->ext = ""; } 9base-6/lib9/LICENSE0000644000175000017500000000155311402154555013416 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ This is a Unix port of the Plan 9 formatted I/O package. Please send comments about the packaging to Russ Cox . 9base-6/lib9/strecpy.c0000644000175000017500000000032011402154555014235 0ustar anselmanselm#include char* strecpy(char *to, char *e, char *from) { if(to >= e) return to; to = memccpy(to, from, '\0', e - to); if(to == nil){ to = e - 1; *to = '\0'; }else{ to--; } return to; } 9base-6/lib9/cistrncmp.c0000644000175000017500000000055611402154555014561 0ustar anselmanselm#include #include int cistrncmp(char *s1, char *s2, int n) { int c1, c2; while(*s1 && n-- > 0){ c1 = *(uchar*)s1++; c2 = *(uchar*)s2++; if(c1 == c2) continue; if(c1 >= 'A' && c1 <= 'Z') c1 -= 'A' - 'a'; if(c2 >= 'A' && c2 <= 'Z') c2 -= 'A' - 'a'; if(c1 != c2) return c1 - c2; } if(n <= 0) return 0; return -*s2; } 9base-6/lib9/atoll.c0000644000175000017500000000012611402154555013663 0ustar anselmanselm#include #include vlong atoll(char *s) { return strtoll(s, 0, 0); } 9base-6/lib9/getcallerpc-power.c0000644000175000017500000000013111402154555016163 0ustar anselmanselm#include ulong getcallerpc(void *x) { ulong *lp; lp = x; return lp[-1]; } 9base-6/lib9/fmt.h0000644000175000017500000000752011402154555013350 0ustar anselmanselm#ifndef _FMT_H_ #define _FMT_H_ 1 #if defined(__cplusplus) extern "C" { #endif /* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include typedef struct Fmt Fmt; struct Fmt{ unsigned char runes; /* output buffer is runes or chars? */ void *start; /* of buffer */ void *to; /* current place in the buffer */ void *stop; /* end of the buffer; overwritten if flush fails */ int (*flush)(Fmt *); /* called when to == stop */ void *farg; /* to make flush a closure */ int nfmt; /* num chars formatted so far */ va_list args; /* args passed to dofmt */ int r; /* % format Rune */ int width; int prec; unsigned long flags; char *decimal; /* decimal point; cannot be "" */ /* For %'d */ char *thousands; /* separator for thousands */ /* * Each char is an integer indicating #digits before next separator. Values: * \xFF: no more grouping (or \x7F; defined to be CHAR_MAX in POSIX) * \x00: repeat previous indefinitely * \x**: count that many */ char *grouping; /* descriptor of separator placement */ }; enum{ FmtWidth = 1, FmtLeft = FmtWidth << 1, FmtPrec = FmtLeft << 1, FmtSharp = FmtPrec << 1, FmtSpace = FmtSharp << 1, FmtSign = FmtSpace << 1, FmtApost = FmtSign << 1, FmtZero = FmtApost << 1, FmtUnsigned = FmtZero << 1, FmtShort = FmtUnsigned << 1, FmtLong = FmtShort << 1, FmtVLong = FmtLong << 1, FmtComma = FmtVLong << 1, FmtByte = FmtComma << 1, FmtLDouble = FmtByte << 1, FmtFlag = FmtLDouble << 1 }; extern int (*fmtdoquote)(int); /* Edit .+1,/^$/ | cfn $PLAN9/src/lib9/fmt/?*.c | grep -v static |grep -v __ */ int dofmt(Fmt *f, char *fmt); int dorfmt(Fmt *f, const Rune *fmt); double fmtcharstod(int(*f)(void*), void *vp); int fmtfdflush(Fmt *f); int fmtfdinit(Fmt *f, int fd, char *buf, int size); int fmtinstall(int c, int (*f)(Fmt*)); int fmtnullinit(Fmt*); void fmtlocaleinit(Fmt*, char*, char*, char*); int fmtprint(Fmt *f, char *fmt, ...); int fmtrune(Fmt *f, int r); int fmtrunestrcpy(Fmt *f, Rune *s); int fmtstrcpy(Fmt *f, char *s); char* fmtstrflush(Fmt *f); int fmtstrinit(Fmt *f); double fmtstrtod(const char *as, char **aas); int fmtvprint(Fmt *f, char *fmt, va_list args); int fprint(int fd, char *fmt, ...); int print(char *fmt, ...); void quotefmtinstall(void); int quoterunestrfmt(Fmt *f); int quotestrfmt(Fmt *f); Rune* runefmtstrflush(Fmt *f); int runefmtstrinit(Fmt *f); Rune* runeseprint(Rune *buf, Rune *e, char *fmt, ...); Rune* runesmprint(char *fmt, ...); int runesnprint(Rune *buf, int len, char *fmt, ...); int runesprint(Rune *buf, char *fmt, ...); Rune* runevseprint(Rune *buf, Rune *e, char *fmt, va_list args); Rune* runevsmprint(char *fmt, va_list args); int runevsnprint(Rune *buf, int len, char *fmt, va_list args); char* seprint(char *buf, char *e, char *fmt, ...); char* smprint(char *fmt, ...); int snprint(char *buf, int len, char *fmt, ...); int sprint(char *buf, char *fmt, ...); int vfprint(int fd, char *fmt, va_list args); char* vseprint(char *buf, char *e, char *fmt, va_list args); char* vsmprint(char *fmt, va_list args); int vsnprint(char *buf, int len, char *fmt, va_list args); #if defined(__cplusplus) } #endif #endif 9base-6/lib9/regexp9.h0000644000175000017500000000337611402154555014152 0ustar anselmanselm#ifndef _REGEXP9_H_ #define _REGEXP9_H_ 1 #if defined(__cplusplus) extern "C" { #endif #ifdef AUTOLIB AUTOLIB(regexp9) #endif #include typedef struct Resub Resub; typedef struct Reclass Reclass; typedef struct Reinst Reinst; typedef struct Reprog Reprog; /* * Sub expression matches */ struct Resub{ union { char *sp; Rune *rsp; }s; union { char *ep; Rune *rep; }e; }; /* * character class, each pair of rune's defines a range */ struct Reclass{ Rune *end; Rune spans[64]; }; /* * Machine instructions */ struct Reinst{ int type; union { Reclass *cp; /* class pointer */ Rune r; /* character */ int subid; /* sub-expression id for RBRA and LBRA */ Reinst *right; /* right child of OR */ }u1; union { /* regexp relies on these two being in the same union */ Reinst *left; /* left child of OR */ Reinst *next; /* next instruction for CAT & LBRA */ }u2; }; /* * Reprogram definition */ struct Reprog{ Reinst *startinst; /* start pc */ Reclass class[16]; /* .data */ Reinst firstinst[5]; /* .text */ }; extern Reprog *regcomp9(char*); extern Reprog *regcomplit9(char*); extern Reprog *regcompnl9(char*); extern void regerror9(char*); extern int regexec9(Reprog*, char*, Resub*, int); extern void regsub9(char*, char*, int, Resub*, int); extern int rregexec9(Reprog*, Rune*, Resub*, int); extern void rregsub9(Rune*, Rune*, int, Resub*, int); /* * Darwin simply cannot handle having routines that * override other library routines. */ #ifndef NOPLAN9DEFINES #define regcomp regcomp9 #define regcomplit regcomplit9 #define regcompnl regcompnl9 #define regerror regerror9 #define regexec regexec9 #define regsub regsub9 #define rregexec rregexec9 #define rregsub rregsub9 #endif #if defined(__cplusplus) } #endif #endif 9base-6/lib9/main.c0000644000175000017500000000026011402154555013473 0ustar anselmanselm#include #define NOPLAN9DEFINES #include extern void p9main(int, char**); int main(int argc, char **argv) { p9main(argc, argv); exits("main"); return 99; } 9base-6/lib9/wait.c0000644000175000017500000000145511402154555013522 0ustar anselmanselm#include #include static Waitmsg* _wait(int n, char *buf) { int l; char *fld[5]; Waitmsg *w; if(n <= 0) return nil; buf[n] = '\0'; if(tokenize(buf, fld, nelem(fld)) != nelem(fld)){ werrstr("couldn't parse wait message"); return nil; } l = strlen(fld[4])+1; w = malloc(sizeof(Waitmsg)+l); if(w == nil) return nil; w->pid = atoi(fld[0]); w->time[0] = atoi(fld[1]); w->time[1] = atoi(fld[2]); w->time[2] = atoi(fld[3]); w->msg = (char*)&w[1]; memmove(w->msg, fld[4], l); return w; } Waitmsg* wait(void) { char buf[256]; return _wait(await(buf, sizeof buf-1), buf); } Waitmsg* waitnohang(void) { char buf[256]; return _wait(awaitnohang(buf, sizeof buf-1), buf); } Waitmsg* waitfor(int pid) { char buf[256]; return _wait(awaitfor(pid, buf, sizeof buf-1), buf); } 9base-6/lib9/crypt.c0000755000175000017500000000202511402154555013714 0ustar anselmanselm/* * Data Encryption Standard * D.P.Mitchell 83/06/08. * * block_cipher(key, block, decrypting) * * these routines use the non-standard 7 byte format * for DES keys. */ #include #include #include #include /* * destructively encrypt the buffer, which * must be at least 8 characters long. */ int encrypt(void *key, void *vbuf, int n) { ulong ekey[32]; uchar *buf; int i, r; if(n < 8) return 0; key_setup(key, ekey); buf = vbuf; n--; r = n % 7; n /= 7; for(i = 0; i < n; i++){ block_cipher(ekey, buf, 0); buf += 7; } if(r) block_cipher(ekey, buf - 7 + r, 0); return 1; } /* * destructively decrypt the buffer, which * must be at least 8 characters long. */ int decrypt(void *key, void *vbuf, int n) { ulong ekey[128]; uchar *buf; int i, r; if(n < 8) return 0; key_setup(key, ekey); buf = vbuf; n--; r = n % 7; n /= 7; buf += n * 7; if(r) block_cipher(ekey, buf - 7 + r, 1); for(i = 0; i < n; i++){ buf -= 7; block_cipher(ekey, buf, 1); } return 1; } 9base-6/lib9/rand.c0000644000175000017500000000010211402154555013466 0ustar anselmanselm#include int p9rand(void) { return lrand() & 0x7fff; } 9base-6/lib9/argv0.c0000644000175000017500000000027711402154555013576 0ustar anselmanselm#include char *argv0; /* * Mac OS can't deal with files that only declare data. * ARGBEGIN mentions this function so that this file gets pulled in. */ void __fixargv0(void) { } 9base-6/lib9/readn.c0000644000175000017500000000033311402154555013641 0ustar anselmanselm#include long readn(int f, void *av, long n) { char *a; long m, t; a = av; t = 0; while(t < n){ m = read(f, a+t, n-t); if(m <= 0){ if(t == 0) return m; break; } t += m; } return t; } 9base-6/lib9/regexp.70000644000175000017500000000421011402154555013764 0ustar anselmanselm.TH REGEXP 7 .SH NAME regexp \- Plan 9 regular expression notation .SH DESCRIPTION This manual page describes the regular expression syntax used by the Plan 9 regular expression library .IR regexp (3). It is the form used by .IR egrep (1) before .I egrep got complicated. .PP A .I "regular expression" specifies a set of strings of characters. A member of this set of strings is said to be .I matched by the regular expression. In many applications a delimiter character, commonly .LR / , bounds a regular expression. In the following specification for regular expressions the word `character' means any character (rune) but newline. .PP The syntax for a regular expression .B e0 is .IP .EX e3: literal | charclass | '.' | '^' | '$' | '(' e0 ')' e2: e3 | e2 REP REP: '*' | '+' | '?' e1: e2 | e1 e2 e0: e1 | e0 '|' e1 .EE .PP A .B literal is any non-metacharacter, or a metacharacter (one of .BR .*+?[]()|\e^$ ), or the delimiter preceded by .LR \e . .PP A .B charclass is a nonempty string .I s bracketed .BI [ \|s\| ] (or .BI [^ s\| ]\fR); it matches any character in (or not in) .IR s . A negated character class never matches newline. A substring .IB a - b\f1, with .I a and .I b in ascending order, stands for the inclusive range of characters between .I a and .IR b . In .IR s , the metacharacters .LR - , .LR ] , an initial .LR ^ , and the regular expression delimiter must be preceded by a .LR \e ; other metacharacters have no special meaning and may appear unescaped. .PP A .L . matches any character. .PP A .L ^ matches the beginning of a line; .L $ matches the end of the line. .PP The .B REP operators match zero or more .RB ( * ), one or more .RB ( + ), zero or one .RB ( ? ), instances respectively of the preceding regular expression .BR e2 . .PP A concatenated regular expression, .BR "e1\|e2" , matches a match to .B e1 followed by a match to .BR e2 . .PP An alternative regular expression, .BR "e0\||\|e1" , matches either a match to .B e0 or a match to .BR e1 . .PP A match to any part of a regular expression extends as far as possible without preventing a match to the remainder of the regular expression. .SH "SEE ALSO" .IR regexp (3) 9base-6/lib9/malloc.c0000644000175000017500000000126211402154555014021 0ustar anselmanselm/* * These are here mainly so that I can link against * debugmalloc.c instead and not recompile the world. */ #include #define NOPLAN9DEFINES #include static Lock malloclock; void* p9malloc(ulong n) { void *v; if(n == 0) n++; lock(&malloclock); v = malloc(n); unlock(&malloclock); return v; } void p9free(void *v) { if(v == nil) return; lock(&malloclock); free(v); unlock(&malloclock); } void* p9calloc(ulong a, ulong b) { void *v; if(a*b == 0) a = b = 1; lock(&malloclock); v = calloc(a*b, 1); unlock(&malloclock); return v; } void* p9realloc(void *v, ulong n) { lock(&malloclock); v = realloc(v, n); unlock(&malloclock); return v; } 9base-6/lib9/nan.h0000644000175000017500000000016211402154555013331 0ustar anselmanselmextern double __NaN(void); extern double __Inf(int); extern int __isNaN(double); extern int __isInf(double, int); 9base-6/lib9/utf.h0000644000175000017500000000306611402154555013361 0ustar anselmanselm#ifndef _UTF_H_ #define _UTF_H_ 1 #if defined(__cplusplus) extern "C" { #endif typedef unsigned short Rune; /* 16 bits */ enum { UTFmax = 3, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ Runeerror = 0xFFFD, /* decoding error in UTF */ Runemax = 0x10FFFF /* maximum rune value */ }; /* Edit .+1,/^$/ | cfn $PLAN9/src/lib9/utf/?*.c | grep -v static |grep -v __ */ int chartorune(Rune *rune, char *str); int fullrune(char *str, int n); int isalpharune(Rune c); int islowerrune(Rune c); int isspacerune(Rune c); int istitlerune(Rune c); int isupperrune(Rune c); int runelen(long c); int runenlen(Rune *r, int nrune); Rune* runestrcat(Rune *s1, Rune *s2); Rune* runestrchr(Rune *s, Rune c); int runestrcmp(Rune *s1, Rune *s2); Rune* runestrcpy(Rune *s1, Rune *s2); Rune* runestrdup(Rune *s) ; Rune* runestrecpy(Rune *s1, Rune *es1, Rune *s2); long runestrlen(Rune *s); Rune* runestrncat(Rune *s1, Rune *s2, long n); int runestrncmp(Rune *s1, Rune *s2, long n); Rune* runestrncpy(Rune *s1, Rune *s2, long n); Rune* runestrrchr(Rune *s, Rune c); Rune* runestrstr(Rune *s1, Rune *s2); int runetochar(char *str, Rune *rune); Rune tolowerrune(Rune c); Rune totitlerune(Rune c); Rune toupperrune(Rune c); char* utfecpy(char *to, char *e, char *from); int utflen(char *s); int utfnlen(char *s, long m); char* utfrrune(char *s, long c); char* utfrune(char *s, long c); char* utfutf(char *s1, char *s2); #if defined(__cplusplus) } #endif #endif 9base-6/lib9/jmp-FreeBSD.s0000644000175000017500000000006411402154555014567 0ustar anselmanselm.globl sigsetjmp, p9setjmp p9setjmp: jmp sigsetjmp 9base-6/lib9/date.c0000644000175000017500000000365111402154555013473 0ustar anselmanselm#include #include /* setenv etc. */ #define NOPLAN9DEFINES #include #include #define _HAVETIMEGM 1 #define _HAVETMZONE 1 #define _HAVETMTZOFF 1 #if defined(__linux__) # undef _HAVETMZONE # undef _HAVETMTZOFF #elif defined(__sun__) # undef _HAVETIMEGM # undef _HAVETMZONE # undef _HAVETMTZOFF #endif static Tm bigtm; static void tm2Tm(struct tm *tm, Tm *bigtm) { char *s; memset(bigtm, 0, sizeof *bigtm); bigtm->sec = tm->tm_sec; bigtm->min = tm->tm_min; bigtm->hour = tm->tm_hour; bigtm->mday = tm->tm_mday; bigtm->mon = tm->tm_mon; bigtm->year = tm->tm_year; bigtm->wday = tm->tm_wday; strftime(bigtm->zone, sizeof bigtm->zone, "%Z", tm); #ifdef _HAVETZOFF bigtm->tzoff = tm->tm_gmtoff; #endif if(bigtm->zone[0] == 0){ s = getenv("TIMEZONE"); if(s){ strecpy(bigtm->zone, bigtm->zone+4, s); free(s); } } } static void Tm2tm(Tm *bigtm, struct tm *tm) { memset(tm, 0, sizeof *tm); tm->tm_sec = bigtm->sec; tm->tm_min = bigtm->min; tm->tm_hour = bigtm->hour; tm->tm_mday = bigtm->mday; tm->tm_mon = bigtm->mon; tm->tm_year = bigtm->year; tm->tm_wday = bigtm->wday; #ifdef _HAVETMZONE tm->tm_zone = bigtm->zone; #endif #ifdef _HAVETZOFF tm->tm_gmtoff = bigtm->tzoff; #endif } Tm* p9gmtime(long x) { time_t t; struct tm tm; t = (time_t)x; tm = *gmtime(&t); tm2Tm(&tm, &bigtm); return &bigtm; } Tm* p9localtime(long x) { time_t t; struct tm tm; t = (time_t)x; tm = *localtime(&t); tm2Tm(&tm, &bigtm); return &bigtm; } #if !defined(_HAVETIMEGM) static time_t timegm(struct tm *tm) { time_t ret; char *tz; char *s; tz = getenv("TZ"); putenv("TZ="); tzset(); ret = mktime(tm); if(tz){ s = smprint("TZ=%s", tz); if(s) putenv(s); } return ret; } #endif long p9tm2sec(Tm *bigtm) { struct tm tm; Tm2tm(bigtm, &tm); if(strcmp(bigtm->zone, "GMT") == 0 || strcmp(bigtm->zone, "UCT") == 0) return timegm(&tm); return mktime(&tm); /* local time zone */ } 9base-6/lib9/rfork.c0000644000175000017500000000541011402154555013674 0ustar anselmanselm#include #include #include #include #undef rfork static void nop(int x) { USED(x); } int p9rfork(int flags) { int pid, status; int p[2]; int n; char buf[128], *q; extern char **environ; if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){ /* check other flags before we commit */ flags &= ~(RFPROC|RFFDG|RFENVG); n = (flags & ~(RFNOTEG|RFNAMEG|RFNOWAIT|RFCENVG)); if(n){ werrstr("unknown flags %08ux in rfork", n); return -1; } if(flags&RFNOWAIT){ /* * BUG - should put the signal handler back after we * finish, but I just don't care. If a program calls with * NOWAIT once, they're not likely to want child notes * after that. */ signal(SIGCHLD, nop); if(pipe(p) < 0) return -1; } pid = fork(); if(pid == -1) return -1; if(flags&RFNOWAIT){ flags &= ~RFNOWAIT; if(pid){ /* * Parent - wait for child to fork wait-free child. * Then read pid from pipe. Assume pipe buffer can absorb the write. */ close(p[1]); status = 0; if(wait4(pid, &status, 0, 0) < 0){ werrstr("pipe dance - wait4 - %r"); close(p[0]); return -1; } n = readn(p[0], buf, sizeof buf-1); close(p[0]); if(!WIFEXITED(status) || WEXITSTATUS(status)!=0 || n <= 0){ if(!WIFEXITED(status)) werrstr("pipe dance - !exited 0x%ux", status); else if(WEXITSTATUS(status) != 0) werrstr("pipe dance - non-zero status 0x%ux", status); else if(n < 0) werrstr("pipe dance - pipe read error - %r"); else if(n == 0) werrstr("pipe dance - pipe read eof"); else werrstr("pipe dance - unknown failure"); return -1; } buf[n] = 0; if(buf[0] == 'x'){ werrstr("%s", buf+2); return -1; } pid = strtol(buf, &q, 0); }else{ /* * Child - fork a new child whose wait message can't * get back to the parent because we're going to exit! */ signal(SIGCHLD, SIG_IGN); close(p[0]); pid = fork(); if(pid){ /* Child parent - send status over pipe and exit. */ if(pid > 0) fprint(p[1], "%d", pid); else fprint(p[1], "x %r"); close(p[1]); _exit(0); }else{ /* Child child - close pipe. */ close(p[1]); } } } if(pid != 0) return pid; if(flags&RFCENVG) if(environ) *environ = nil; } if(flags&RFPROC){ werrstr("cannot use rfork for shared memory -- use libthread"); return -1; } if(flags&RFNAMEG){ /* XXX set $NAMESPACE to a new directory */ flags &= ~RFNAMEG; } if(flags&RFNOTEG){ setpgid(0, getpid()); flags &= ~RFNOTEG; } if(flags&RFNOWAIT){ werrstr("cannot use RFNOWAIT without RFPROC"); return -1; } if(flags){ werrstr("unknown flags %08ux in rfork", flags); return -1; } return 0; } 9base-6/lib9/dirwstat.c0000644000175000017500000000077011402154555014416 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include int dirwstat(char *file, Dir *dir) { int ret; struct utimbuf ub; /* BUG handle more */ ret = 0; if(~dir->mode != 0){ if(chmod(file, dir->mode) < 0) ret = -1; } if(~dir->mtime != 0){ ub.actime = dir->mtime; ub.modtime = dir->mtime; if(utime(file, &ub) < 0) ret = -1; } if(~dir->length != 0){ if(truncate(file, dir->length) < 0) ret = -1; } return ret; } 9base-6/lib9/sysname.c0000644000175000017500000000064411402154555014234 0ustar anselmanselm#include #include char* sysname(void) { static char buf[512]; char *p, *q; if(buf[0]) return buf; if((q = getenv("sysname")) != nil && q[0] != 0){ utfecpy(buf, buf+sizeof buf, q); free(q); return buf; } if(q) free(q); if(gethostname(buf, sizeof buf) >= 0){ buf[sizeof buf-1] = 0; if((p = strchr(buf, '.')) != nil) *p = 0; return buf; } strcpy(buf, "gnot"); return buf; } 9base-6/lib9/zoneinfo.h0000644000175000017500000000047211402154555014410 0ustar anselmanselm#define zonetinfo _p9zonetinfo #define zonedump _p9zonedump #define zonelookuptinfo _p9zonelookuptinfo typedef long tlong; typedef struct Tinfo { long t; int tzoff; int dlflag; char *zone; } Tinfo; extern int zonelookuptinfo(Tinfo*, tlong); extern int zonetinfo(Tinfo*, int); extern void zonedump(int fd); 9base-6/lib9/encodefmt.c0000644000175000017500000000206011402154555014513 0ustar anselmanselm#include int encodefmt(Fmt *f) { char *out; char *buf, *p; int len; int ilen; int rv; uchar *b; char obuf[64]; /* rsc optimization */ b = va_arg(f->args, uchar*); if(b == 0) return fmtstrcpy(f, ""); ilen = f->prec; f->prec = 0; if(!(f->flags&FmtPrec) || ilen < 0) goto error; f->flags &= ~FmtPrec; switch(f->r){ case '<': len = (8*ilen+4)/5 + 3; break; case '[': len = (8*ilen+5)/6 + 4; break; case 'H': len = 2*ilen + 1; break; default: goto error; } if(len > sizeof(obuf)){ buf = malloc(len); if(buf == nil) goto error; } else buf = obuf; /* convert */ out = buf; switch(f->r){ case '<': rv = enc32(out, len, b, ilen); break; case '[': rv = enc64(out, len, b, ilen); break; case 'H': rv = enc16(out, len, b, ilen); if(rv >= 0 && (f->flags & FmtLong)) for(p = buf; *p; p++) *p = tolower((uchar)*p); break; default: rv = -1; break; } if(rv < 0) goto error; fmtstrcpy(f, buf); if(buf != obuf) free(buf); return 0; error: return fmtstrcpy(f, ""); } 9base-6/lib9/needsrcquote.c0000644000175000017500000000022711402154555015253 0ustar anselmanselm#include #include int needsrcquote(int c) { if(c <= ' ') return 1; if(strchr("`^#*[]=|\\?${}()'<>&;", c)) return 1; return 0; } 9base-6/lib9/seek.c0000644000175000017500000000016611402154555013503 0ustar anselmanselm#include #include vlong seek(int fd, vlong offset, int whence) { return lseek(fd, offset, whence); } 9base-6/lib9/utf/0000755000175000017500000000000011402154555013203 5ustar anselmanselm9base-6/lib9/utf/lib9.h0000644000175000017500000000051211402154555014211 0ustar anselmanselm#include #include "utf.h" #define nil ((void*)0) #define uchar _fmtuchar #define ushort _fmtushort #define uint _fmtuint #define ulong _fmtulong #define vlong _fmtvlong #define uvlong _fmtuvlong typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; 9base-6/lib9/utf/utfecpy.c0000644000175000017500000000213211402154555015024 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #define _BSD_SOURCE 1 /* memccpy */ #include #include #include "plan9.h" #include "utf.h" char* utfecpy(char *to, char *e, char *from) { char *end; if(to >= e) return to; end = memccpy(to, from, '\0', e - to); if(end == nil){ end = e-1; while(end>to && (*--end&0xC0)==0x80) ; *end = '\0'; }else{ end--; } return end; } 9base-6/lib9/utf/runestrlen.c0000644000175000017500000000157011402154555015553 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" long runestrlen(Rune *s) { return runestrchr(s, 0) - s; } 9base-6/lib9/utf/runestrecpy.c0000644000175000017500000000174411402154555015740 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrecpy(Rune *s1, Rune *es1, Rune *s2) { if(s1 >= es1) return s1; while(*s1++ = *s2++){ if(s1 == es1){ *--s1 = '\0'; break; } } return s1; } 9base-6/lib9/utf/runestrchr.c0000644000175000017500000000175111402154555015552 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrchr(Rune *s, Rune c) { Rune c0 = c; Rune c1; if(c == 0) { while(*s++) ; return s-1; } while(c1 = *s++) if(c1 == c0) return s-1; return 0; } 9base-6/lib9/utf/utfnlen.c0000644000175000017500000000212711402154555015024 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" int utfnlen(char *s, long m) { int c; long n; Rune rune; char *es; es = s + m; for(n = 0; s < es; n++) { c = *(uchar*)s; if(c < Runeself){ if(c == '\0') break; s++; continue; } if(!fullrune(s, es-s)) break; s += chartorune(&rune, s); } return n; } 9base-6/lib9/utf/runestrncmp.c0000644000175000017500000000202411402154555015725 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" int runestrncmp(Rune *s1, Rune *s2, long n) { Rune c1, c2; while(n > 0) { c1 = *s1++; c2 = *s2++; n--; if(c1 != c2) { if(c1 > c2) return 1; return -1; } if(c1 == 0) break; } return 0; } 9base-6/lib9/utf/NOTICE0000644000175000017500000000136411402154555014113 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 1998-2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ 9base-6/lib9/utf/rune.c0000644000175000017500000000603311402154555014322 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" enum { Bit1 = 7, Bitx = 6, Bit2 = 5, Bit3 = 4, Bit4 = 3, T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */ Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */ Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */ Maskx = (1< T1 */ c = *(uchar*)str; if(c < Tx) { *rune = c; return 1; } /* * two character sequence * 0080-07FF => T2 Tx */ c1 = *(uchar*)(str+1) ^ Tx; if(c1 & Testx) goto bad; if(c < T3) { if(c < T2) goto bad; l = ((c << Bitx) | c1) & Rune2; if(l <= Rune1) goto bad; *rune = l; return 2; } /* * three character sequence * 0800-FFFF => T3 Tx Tx */ c2 = *(uchar*)(str+2) ^ Tx; if(c2 & Testx) goto bad; if(c < T4) { l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; if(l <= Rune2) goto bad; *rune = l; return 3; } /* * bad decoding */ bad: *rune = Bad; return 1; } int runetochar(char *str, Rune *rune) { long c; /* * one character sequence * 00000-0007F => 00-7F */ c = *rune; if(c <= Rune1) { str[0] = c; return 1; } /* * two character sequence * 0080-07FF => T2 Tx */ if(c <= Rune2) { str[0] = T2 | (c >> 1*Bitx); str[1] = Tx | (c & Maskx); return 2; } /* * three character sequence * 0800-FFFF => T3 Tx Tx */ str[0] = T3 | (c >> 2*Bitx); str[1] = Tx | ((c >> 1*Bitx) & Maskx); str[2] = Tx | (c & Maskx); return 3; } int runelen(long c) { Rune rune; char str[10]; rune = c; return runetochar(str, &rune); } int runenlen(Rune *r, int nrune) { int nb, c; nb = 0; while(nrune--) { c = *r++; if(c <= Rune1) nb++; else if(c <= Rune2) nb += 2; else nb += 3; } return nb; } int fullrune(char *str, int n) { int c; if(n > 0) { c = *(uchar*)str; if(c < Tx) return 1; if(n > 1) if(c < T3 || n > 2) return 1; } return 0; } 9base-6/lib9/utf/runetype.c0000644000175000017500000007337011402154555015234 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" /* * alpha ranges - * only covers ranges not in lower||upper */ static Rune __alpha2[] = { 0x00d8, 0x00f6, /* Ø - ö */ 0x00f8, 0x01f5, /* ø - ǵ */ 0x0250, 0x02a8, /* ɐ - ʨ */ 0x038e, 0x03a1, /* Ύ - Ρ */ 0x03a3, 0x03ce, /* Σ - ώ */ 0x03d0, 0x03d6, /* ϐ - ϖ */ 0x03e2, 0x03f3, /* Ϣ - ϳ */ 0x0490, 0x04c4, /* Ґ - ӄ */ 0x0561, 0x0587, /* ա - և */ 0x05d0, 0x05ea, /* א - ת */ 0x05f0, 0x05f2, /* װ - ײ */ 0x0621, 0x063a, /* ء - غ */ 0x0640, 0x064a, /* ـ - ي */ 0x0671, 0x06b7, /* ٱ - ڷ */ 0x06ba, 0x06be, /* ں - ھ */ 0x06c0, 0x06ce, /* ۀ - ێ */ 0x06d0, 0x06d3, /* ې - ۓ */ 0x0905, 0x0939, /* अ - ह */ 0x0958, 0x0961, /* क़ - ॡ */ 0x0985, 0x098c, /* অ - ঌ */ 0x098f, 0x0990, /* এ - ঐ */ 0x0993, 0x09a8, /* ও - ন */ 0x09aa, 0x09b0, /* প - র */ 0x09b6, 0x09b9, /* শ - হ */ 0x09dc, 0x09dd, /* ড় - ঢ় */ 0x09df, 0x09e1, /* য় - ৡ */ 0x09f0, 0x09f1, /* ৰ - ৱ */ 0x0a05, 0x0a0a, /* ਅ - ਊ */ 0x0a0f, 0x0a10, /* ਏ - ਐ */ 0x0a13, 0x0a28, /* ਓ - ਨ */ 0x0a2a, 0x0a30, /* ਪ - ਰ */ 0x0a32, 0x0a33, /* ਲ - ਲ਼ */ 0x0a35, 0x0a36, /* ਵ - ਸ਼ */ 0x0a38, 0x0a39, /* ਸ - ਹ */ 0x0a59, 0x0a5c, /* ਖ਼ - ੜ */ 0x0a85, 0x0a8b, /* અ - ઋ */ 0x0a8f, 0x0a91, /* એ - ઑ */ 0x0a93, 0x0aa8, /* ઓ - ન */ 0x0aaa, 0x0ab0, /* પ - ર */ 0x0ab2, 0x0ab3, /* લ - ળ */ 0x0ab5, 0x0ab9, /* વ - હ */ 0x0b05, 0x0b0c, /* ଅ - ଌ */ 0x0b0f, 0x0b10, /* ଏ - ଐ */ 0x0b13, 0x0b28, /* ଓ - ନ */ 0x0b2a, 0x0b30, /* ପ - ର */ 0x0b32, 0x0b33, /* ଲ - ଳ */ 0x0b36, 0x0b39, /* ଶ - ହ */ 0x0b5c, 0x0b5d, /* ଡ଼ - ଢ଼ */ 0x0b5f, 0x0b61, /* ୟ - ୡ */ 0x0b85, 0x0b8a, /* அ - ஊ */ 0x0b8e, 0x0b90, /* எ - ஐ */ 0x0b92, 0x0b95, /* ஒ - க */ 0x0b99, 0x0b9a, /* ங - ச */ 0x0b9e, 0x0b9f, /* ஞ - ட */ 0x0ba3, 0x0ba4, /* ண - த */ 0x0ba8, 0x0baa, /* ந - ப */ 0x0bae, 0x0bb5, /* ம - வ */ 0x0bb7, 0x0bb9, /* ஷ - ஹ */ 0x0c05, 0x0c0c, /* అ - ఌ */ 0x0c0e, 0x0c10, /* ఎ - ఐ */ 0x0c12, 0x0c28, /* ఒ - న */ 0x0c2a, 0x0c33, /* ప - ళ */ 0x0c35, 0x0c39, /* వ - హ */ 0x0c60, 0x0c61, /* ౠ - ౡ */ 0x0c85, 0x0c8c, /* ಅ - ಌ */ 0x0c8e, 0x0c90, /* ಎ - ಐ */ 0x0c92, 0x0ca8, /* ಒ - ನ */ 0x0caa, 0x0cb3, /* ಪ - ಳ */ 0x0cb5, 0x0cb9, /* ವ - ಹ */ 0x0ce0, 0x0ce1, /* ೠ - ೡ */ 0x0d05, 0x0d0c, /* അ - ഌ */ 0x0d0e, 0x0d10, /* എ - ഐ */ 0x0d12, 0x0d28, /* ഒ - ന */ 0x0d2a, 0x0d39, /* പ - ഹ */ 0x0d60, 0x0d61, /* ൠ - ൡ */ 0x0e01, 0x0e30, /* ก - ะ */ 0x0e32, 0x0e33, /* า - ำ */ 0x0e40, 0x0e46, /* เ - ๆ */ 0x0e5a, 0x0e5b, /* ๚ - ๛ */ 0x0e81, 0x0e82, /* ກ - ຂ */ 0x0e87, 0x0e88, /* ງ - ຈ */ 0x0e94, 0x0e97, /* ດ - ທ */ 0x0e99, 0x0e9f, /* ນ - ຟ */ 0x0ea1, 0x0ea3, /* ມ - ຣ */ 0x0eaa, 0x0eab, /* ສ - ຫ */ 0x0ead, 0x0eae, /* ອ - ຮ */ 0x0eb2, 0x0eb3, /* າ - ຳ */ 0x0ec0, 0x0ec4, /* ເ - ໄ */ 0x0edc, 0x0edd, /* ໜ - ໝ */ 0x0f18, 0x0f19, /* ༘ - ༙ */ 0x0f40, 0x0f47, /* ཀ - ཇ */ 0x0f49, 0x0f69, /* ཉ - ཀྵ */ 0x10d0, 0x10f6, /* ა - ჶ */ 0x1100, 0x1159, /* ᄀ - ᅙ */ 0x115f, 0x11a2, /* ᅟ - ᆢ */ 0x11a8, 0x11f9, /* ᆨ - ᇹ */ 0x1e00, 0x1e9b, /* Ḁ - ẛ */ 0x1f50, 0x1f57, /* ὐ - ὗ */ 0x1f80, 0x1fb4, /* ᾀ - ᾴ */ 0x1fb6, 0x1fbc, /* ᾶ - ᾼ */ 0x1fc2, 0x1fc4, /* ῂ - ῄ */ 0x1fc6, 0x1fcc, /* ῆ - ῌ */ 0x1fd0, 0x1fd3, /* ῐ - ΐ */ 0x1fd6, 0x1fdb, /* ῖ - Ί */ 0x1fe0, 0x1fec, /* ῠ - Ῥ */ 0x1ff2, 0x1ff4, /* ῲ - ῴ */ 0x1ff6, 0x1ffc, /* ῶ - ῼ */ 0x210a, 0x2113, /* ℊ - ℓ */ 0x2115, 0x211d, /* ℕ - ℝ */ 0x2120, 0x2122, /* ℠ - ™ */ 0x212a, 0x2131, /* K - ℱ */ 0x2133, 0x2138, /* ℳ - ℸ */ 0x3041, 0x3094, /* ぁ - ゔ */ 0x30a1, 0x30fa, /* ァ - ヺ */ 0x3105, 0x312c, /* ㄅ - ㄬ */ 0x3131, 0x318e, /* ㄱ - ㆎ */ 0x3192, 0x319f, /* ㆒ - ㆟ */ 0x3260, 0x327b, /* ㉠ - ㉻ */ 0x328a, 0x32b0, /* ㊊ - ㊰ */ 0x32d0, 0x32fe, /* ㋐ - ㋾ */ 0x3300, 0x3357, /* ㌀ - ㍗ */ 0x3371, 0x3376, /* ㍱ - ㍶ */ 0x337b, 0x3394, /* ㍻ - ㎔ */ 0x3399, 0x339e, /* ㎙ - ㎞ */ 0x33a9, 0x33ad, /* ㎩ - ㎭ */ 0x33b0, 0x33c1, /* ㎰ - ㏁ */ 0x33c3, 0x33c5, /* ㏃ - ㏅ */ 0x33c7, 0x33d7, /* ㏇ - ㏗ */ 0x33d9, 0x33dd, /* ㏙ - ㏝ */ 0x4e00, 0x9fff, /* 一 - 鿿 */ 0xac00, 0xd7a3, /* 가 - 힣 */ 0xf900, 0xfb06, /* 豈 - st */ 0xfb13, 0xfb17, /* ﬓ - ﬗ */ 0xfb1f, 0xfb28, /* ײַ - ﬨ */ 0xfb2a, 0xfb36, /* שׁ - זּ */ 0xfb38, 0xfb3c, /* טּ - לּ */ 0xfb40, 0xfb41, /* נּ - סּ */ 0xfb43, 0xfb44, /* ףּ - פּ */ 0xfb46, 0xfbb1, /* צּ - ﮱ */ 0xfbd3, 0xfd3d, /* ﯓ - ﴽ */ 0xfd50, 0xfd8f, /* ﵐ - ﶏ */ 0xfd92, 0xfdc7, /* ﶒ - ﷇ */ 0xfdf0, 0xfdf9, /* ﷰ - ﷹ */ 0xfe70, 0xfe72, /* ﹰ - ﹲ */ 0xfe76, 0xfefc, /* ﹶ - ﻼ */ 0xff66, 0xff6f, /* ヲ - ッ */ 0xff71, 0xff9d, /* ア - ン */ 0xffa0, 0xffbe, /* ᅠ - ᄒ */ 0xffc2, 0xffc7, /* ᅡ - ᅦ */ 0xffca, 0xffcf, /* ᅧ - ᅬ */ 0xffd2, 0xffd7, /* ᅭ - ᅲ */ 0xffda, 0xffdc, /* ᅳ - ᅵ */ }; /* * alpha singlets - * only covers ranges not in lower||upper */ static Rune __alpha1[] = { 0x00aa, /* ª */ 0x00b5, /* µ */ 0x00ba, /* º */ 0x03da, /* Ϛ */ 0x03dc, /* Ϝ */ 0x03de, /* Ϟ */ 0x03e0, /* Ϡ */ 0x06d5, /* ە */ 0x09b2, /* ল */ 0x0a5e, /* ਫ਼ */ 0x0a8d, /* ઍ */ 0x0ae0, /* ૠ */ 0x0b9c, /* ஜ */ 0x0cde, /* ೞ */ 0x0e4f, /* ๏ */ 0x0e84, /* ຄ */ 0x0e8a, /* ຊ */ 0x0e8d, /* ຍ */ 0x0ea5, /* ລ */ 0x0ea7, /* ວ */ 0x0eb0, /* ະ */ 0x0ebd, /* ຽ */ 0x1fbe, /* ι */ 0x207f, /* ⁿ */ 0x20a8, /* ₨ */ 0x2102, /* ℂ */ 0x2107, /* ℇ */ 0x2124, /* ℤ */ 0x2126, /* Ω */ 0x2128, /* ℨ */ 0xfb3e, /* מּ */ 0xfe74, /* ﹴ */ }; /* * space ranges */ static Rune __space2[] = { 0x0009, 0x000a, /* tab and newline */ 0x0020, 0x0020, /* space */ 0x00a0, 0x00a0, /*   */ 0x2000, 0x200b, /*   - ​ */ 0x2028, 0x2029, /* 
 - 
 */ 0x3000, 0x3000, /*   */ 0xfeff, 0xfeff, /*  */ }; /* * lower case ranges * 3rd col is conversion excess 500 */ static Rune __toupper2[] = { 0x0061, 0x007a, 468, /* a-z A-Z */ 0x00e0, 0x00f6, 468, /* à-ö À-Ö */ 0x00f8, 0x00fe, 468, /* ø-þ Ø-Þ */ 0x0256, 0x0257, 295, /* ɖ-ɗ Ɖ-Ɗ */ 0x0258, 0x0259, 298, /* ɘ-ə Ǝ-Ə */ 0x028a, 0x028b, 283, /* ʊ-ʋ Ʊ-Ʋ */ 0x03ad, 0x03af, 463, /* έ-ί Έ-Ί */ 0x03b1, 0x03c1, 468, /* α-ρ Α-Ρ */ 0x03c3, 0x03cb, 468, /* σ-ϋ Σ-Ϋ */ 0x03cd, 0x03ce, 437, /* ύ-ώ Ύ-Ώ */ 0x0430, 0x044f, 468, /* а-я А-Я */ 0x0451, 0x045c, 420, /* ё-ќ Ё-Ќ */ 0x045e, 0x045f, 420, /* ў-џ Ў-Џ */ 0x0561, 0x0586, 452, /* ա-ֆ Ա-Ֆ */ 0x1f00, 0x1f07, 508, /* ἀ-ἇ Ἀ-Ἇ */ 0x1f10, 0x1f15, 508, /* ἐ-ἕ Ἐ-Ἕ */ 0x1f20, 0x1f27, 508, /* ἠ-ἧ Ἠ-Ἧ */ 0x1f30, 0x1f37, 508, /* ἰ-ἷ Ἰ-Ἷ */ 0x1f40, 0x1f45, 508, /* ὀ-ὅ Ὀ-Ὅ */ 0x1f60, 0x1f67, 508, /* ὠ-ὧ Ὠ-Ὧ */ 0x1f70, 0x1f71, 574, /* ὰ-ά Ὰ-Ά */ 0x1f72, 0x1f75, 586, /* ὲ-ή Ὲ-Ή */ 0x1f76, 0x1f77, 600, /* ὶ-ί Ὶ-Ί */ 0x1f78, 0x1f79, 628, /* ὸ-ό Ὸ-Ό */ 0x1f7a, 0x1f7b, 612, /* ὺ-ύ Ὺ-Ύ */ 0x1f7c, 0x1f7d, 626, /* ὼ-ώ Ὼ-Ώ */ 0x1f80, 0x1f87, 508, /* ᾀ-ᾇ ᾈ-ᾏ */ 0x1f90, 0x1f97, 508, /* ᾐ-ᾗ ᾘ-ᾟ */ 0x1fa0, 0x1fa7, 508, /* ᾠ-ᾧ ᾨ-ᾯ */ 0x1fb0, 0x1fb1, 508, /* ᾰ-ᾱ Ᾰ-Ᾱ */ 0x1fd0, 0x1fd1, 508, /* ῐ-ῑ Ῐ-Ῑ */ 0x1fe0, 0x1fe1, 508, /* ῠ-ῡ Ῠ-Ῡ */ 0x2170, 0x217f, 484, /* ⅰ-ⅿ Ⅰ-Ⅿ */ 0x24d0, 0x24e9, 474, /* ⓐ-ⓩ Ⓐ-Ⓩ */ 0xff41, 0xff5a, 468, /* a-z A-Z */ }; /* * lower case singlets * 2nd col is conversion excess 500 */ static Rune __toupper1[] = { 0x00ff, 621, /* ÿ Ÿ */ 0x0101, 499, /* ā Ā */ 0x0103, 499, /* ă Ă */ 0x0105, 499, /* ą Ą */ 0x0107, 499, /* ć Ć */ 0x0109, 499, /* ĉ Ĉ */ 0x010b, 499, /* ċ Ċ */ 0x010d, 499, /* č Č */ 0x010f, 499, /* ď Ď */ 0x0111, 499, /* đ Đ */ 0x0113, 499, /* ē Ē */ 0x0115, 499, /* ĕ Ĕ */ 0x0117, 499, /* ė Ė */ 0x0119, 499, /* ę Ę */ 0x011b, 499, /* ě Ě */ 0x011d, 499, /* ĝ Ĝ */ 0x011f, 499, /* ğ Ğ */ 0x0121, 499, /* ġ Ġ */ 0x0123, 499, /* ģ Ģ */ 0x0125, 499, /* ĥ Ĥ */ 0x0127, 499, /* ħ Ħ */ 0x0129, 499, /* ĩ Ĩ */ 0x012b, 499, /* ī Ī */ 0x012d, 499, /* ĭ Ĭ */ 0x012f, 499, /* į Į */ 0x0131, 268, /* ı I */ 0x0133, 499, /* ij IJ */ 0x0135, 499, /* ĵ Ĵ */ 0x0137, 499, /* ķ Ķ */ 0x013a, 499, /* ĺ Ĺ */ 0x013c, 499, /* ļ Ļ */ 0x013e, 499, /* ľ Ľ */ 0x0140, 499, /* ŀ Ŀ */ 0x0142, 499, /* ł Ł */ 0x0144, 499, /* ń Ń */ 0x0146, 499, /* ņ Ņ */ 0x0148, 499, /* ň Ň */ 0x014b, 499, /* ŋ Ŋ */ 0x014d, 499, /* ō Ō */ 0x014f, 499, /* ŏ Ŏ */ 0x0151, 499, /* ő Ő */ 0x0153, 499, /* œ Œ */ 0x0155, 499, /* ŕ Ŕ */ 0x0157, 499, /* ŗ Ŗ */ 0x0159, 499, /* ř Ř */ 0x015b, 499, /* ś Ś */ 0x015d, 499, /* ŝ Ŝ */ 0x015f, 499, /* ş Ş */ 0x0161, 499, /* š Š */ 0x0163, 499, /* ţ Ţ */ 0x0165, 499, /* ť Ť */ 0x0167, 499, /* ŧ Ŧ */ 0x0169, 499, /* ũ Ũ */ 0x016b, 499, /* ū Ū */ 0x016d, 499, /* ŭ Ŭ */ 0x016f, 499, /* ů Ů */ 0x0171, 499, /* ű Ű */ 0x0173, 499, /* ų Ų */ 0x0175, 499, /* ŵ Ŵ */ 0x0177, 499, /* ŷ Ŷ */ 0x017a, 499, /* ź Ź */ 0x017c, 499, /* ż Ż */ 0x017e, 499, /* ž Ž */ 0x017f, 200, /* ſ S */ 0x0183, 499, /* ƃ Ƃ */ 0x0185, 499, /* ƅ Ƅ */ 0x0188, 499, /* ƈ Ƈ */ 0x018c, 499, /* ƌ Ƌ */ 0x0192, 499, /* ƒ Ƒ */ 0x0199, 499, /* ƙ Ƙ */ 0x01a1, 499, /* ơ Ơ */ 0x01a3, 499, /* ƣ Ƣ */ 0x01a5, 499, /* ƥ Ƥ */ 0x01a8, 499, /* ƨ Ƨ */ 0x01ad, 499, /* ƭ Ƭ */ 0x01b0, 499, /* ư Ư */ 0x01b4, 499, /* ƴ Ƴ */ 0x01b6, 499, /* ƶ Ƶ */ 0x01b9, 499, /* ƹ Ƹ */ 0x01bd, 499, /* ƽ Ƽ */ 0x01c5, 499, /* Dž DŽ */ 0x01c6, 498, /* dž DŽ */ 0x01c8, 499, /* Lj LJ */ 0x01c9, 498, /* lj LJ */ 0x01cb, 499, /* Nj NJ */ 0x01cc, 498, /* nj NJ */ 0x01ce, 499, /* ǎ Ǎ */ 0x01d0, 499, /* ǐ Ǐ */ 0x01d2, 499, /* ǒ Ǒ */ 0x01d4, 499, /* ǔ Ǔ */ 0x01d6, 499, /* ǖ Ǖ */ 0x01d8, 499, /* ǘ Ǘ */ 0x01da, 499, /* ǚ Ǚ */ 0x01dc, 499, /* ǜ Ǜ */ 0x01df, 499, /* ǟ Ǟ */ 0x01e1, 499, /* ǡ Ǡ */ 0x01e3, 499, /* ǣ Ǣ */ 0x01e5, 499, /* ǥ Ǥ */ 0x01e7, 499, /* ǧ Ǧ */ 0x01e9, 499, /* ǩ Ǩ */ 0x01eb, 499, /* ǫ Ǫ */ 0x01ed, 499, /* ǭ Ǭ */ 0x01ef, 499, /* ǯ Ǯ */ 0x01f2, 499, /* Dz DZ */ 0x01f3, 498, /* dz DZ */ 0x01f5, 499, /* ǵ Ǵ */ 0x01fb, 499, /* ǻ Ǻ */ 0x01fd, 499, /* ǽ Ǽ */ 0x01ff, 499, /* ǿ Ǿ */ 0x0201, 499, /* ȁ Ȁ */ 0x0203, 499, /* ȃ Ȃ */ 0x0205, 499, /* ȅ Ȅ */ 0x0207, 499, /* ȇ Ȇ */ 0x0209, 499, /* ȉ Ȉ */ 0x020b, 499, /* ȋ Ȋ */ 0x020d, 499, /* ȍ Ȍ */ 0x020f, 499, /* ȏ Ȏ */ 0x0211, 499, /* ȑ Ȑ */ 0x0213, 499, /* ȓ Ȓ */ 0x0215, 499, /* ȕ Ȕ */ 0x0217, 499, /* ȗ Ȗ */ 0x0253, 290, /* ɓ Ɓ */ 0x0254, 294, /* ɔ Ɔ */ 0x025b, 297, /* ɛ Ɛ */ 0x0260, 295, /* ɠ Ɠ */ 0x0263, 293, /* ɣ Ɣ */ 0x0268, 291, /* ɨ Ɨ */ 0x0269, 289, /* ɩ Ɩ */ 0x026f, 289, /* ɯ Ɯ */ 0x0272, 287, /* ɲ Ɲ */ 0x0283, 282, /* ʃ Ʃ */ 0x0288, 282, /* ʈ Ʈ */ 0x0292, 281, /* ʒ Ʒ */ 0x03ac, 462, /* ά Ά */ 0x03cc, 436, /* ό Ό */ 0x03d0, 438, /* ϐ Β */ 0x03d1, 443, /* ϑ Θ */ 0x03d5, 453, /* ϕ Φ */ 0x03d6, 446, /* ϖ Π */ 0x03e3, 499, /* ϣ Ϣ */ 0x03e5, 499, /* ϥ Ϥ */ 0x03e7, 499, /* ϧ Ϧ */ 0x03e9, 499, /* ϩ Ϩ */ 0x03eb, 499, /* ϫ Ϫ */ 0x03ed, 499, /* ϭ Ϭ */ 0x03ef, 499, /* ϯ Ϯ */ 0x03f0, 414, /* ϰ Κ */ 0x03f1, 420, /* ϱ Ρ */ 0x0461, 499, /* ѡ Ѡ */ 0x0463, 499, /* ѣ Ѣ */ 0x0465, 499, /* ѥ Ѥ */ 0x0467, 499, /* ѧ Ѧ */ 0x0469, 499, /* ѩ Ѩ */ 0x046b, 499, /* ѫ Ѫ */ 0x046d, 499, /* ѭ Ѭ */ 0x046f, 499, /* ѯ Ѯ */ 0x0471, 499, /* ѱ Ѱ */ 0x0473, 499, /* ѳ Ѳ */ 0x0475, 499, /* ѵ Ѵ */ 0x0477, 499, /* ѷ Ѷ */ 0x0479, 499, /* ѹ Ѹ */ 0x047b, 499, /* ѻ Ѻ */ 0x047d, 499, /* ѽ Ѽ */ 0x047f, 499, /* ѿ Ѿ */ 0x0481, 499, /* ҁ Ҁ */ 0x0491, 499, /* ґ Ґ */ 0x0493, 499, /* ғ Ғ */ 0x0495, 499, /* ҕ Ҕ */ 0x0497, 499, /* җ Җ */ 0x0499, 499, /* ҙ Ҙ */ 0x049b, 499, /* қ Қ */ 0x049d, 499, /* ҝ Ҝ */ 0x049f, 499, /* ҟ Ҟ */ 0x04a1, 499, /* ҡ Ҡ */ 0x04a3, 499, /* ң Ң */ 0x04a5, 499, /* ҥ Ҥ */ 0x04a7, 499, /* ҧ Ҧ */ 0x04a9, 499, /* ҩ Ҩ */ 0x04ab, 499, /* ҫ Ҫ */ 0x04ad, 499, /* ҭ Ҭ */ 0x04af, 499, /* ү Ү */ 0x04b1, 499, /* ұ Ұ */ 0x04b3, 499, /* ҳ Ҳ */ 0x04b5, 499, /* ҵ Ҵ */ 0x04b7, 499, /* ҷ Ҷ */ 0x04b9, 499, /* ҹ Ҹ */ 0x04bb, 499, /* һ Һ */ 0x04bd, 499, /* ҽ Ҽ */ 0x04bf, 499, /* ҿ Ҿ */ 0x04c2, 499, /* ӂ Ӂ */ 0x04c4, 499, /* ӄ Ӄ */ 0x04c8, 499, /* ӈ Ӈ */ 0x04cc, 499, /* ӌ Ӌ */ 0x04d1, 499, /* ӑ Ӑ */ 0x04d3, 499, /* ӓ Ӓ */ 0x04d5, 499, /* ӕ Ӕ */ 0x04d7, 499, /* ӗ Ӗ */ 0x04d9, 499, /* ә Ә */ 0x04db, 499, /* ӛ Ӛ */ 0x04dd, 499, /* ӝ Ӝ */ 0x04df, 499, /* ӟ Ӟ */ 0x04e1, 499, /* ӡ Ӡ */ 0x04e3, 499, /* ӣ Ӣ */ 0x04e5, 499, /* ӥ Ӥ */ 0x04e7, 499, /* ӧ Ӧ */ 0x04e9, 499, /* ө Ө */ 0x04eb, 499, /* ӫ Ӫ */ 0x04ef, 499, /* ӯ Ӯ */ 0x04f1, 499, /* ӱ Ӱ */ 0x04f3, 499, /* ӳ Ӳ */ 0x04f5, 499, /* ӵ Ӵ */ 0x04f9, 499, /* ӹ Ӹ */ 0x1e01, 499, /* ḁ Ḁ */ 0x1e03, 499, /* ḃ Ḃ */ 0x1e05, 499, /* ḅ Ḅ */ 0x1e07, 499, /* ḇ Ḇ */ 0x1e09, 499, /* ḉ Ḉ */ 0x1e0b, 499, /* ḋ Ḋ */ 0x1e0d, 499, /* ḍ Ḍ */ 0x1e0f, 499, /* ḏ Ḏ */ 0x1e11, 499, /* ḑ Ḑ */ 0x1e13, 499, /* ḓ Ḓ */ 0x1e15, 499, /* ḕ Ḕ */ 0x1e17, 499, /* ḗ Ḗ */ 0x1e19, 499, /* ḙ Ḙ */ 0x1e1b, 499, /* ḛ Ḛ */ 0x1e1d, 499, /* ḝ Ḝ */ 0x1e1f, 499, /* ḟ Ḟ */ 0x1e21, 499, /* ḡ Ḡ */ 0x1e23, 499, /* ḣ Ḣ */ 0x1e25, 499, /* ḥ Ḥ */ 0x1e27, 499, /* ḧ Ḧ */ 0x1e29, 499, /* ḩ Ḩ */ 0x1e2b, 499, /* ḫ Ḫ */ 0x1e2d, 499, /* ḭ Ḭ */ 0x1e2f, 499, /* ḯ Ḯ */ 0x1e31, 499, /* ḱ Ḱ */ 0x1e33, 499, /* ḳ Ḳ */ 0x1e35, 499, /* ḵ Ḵ */ 0x1e37, 499, /* ḷ Ḷ */ 0x1e39, 499, /* ḹ Ḹ */ 0x1e3b, 499, /* ḻ Ḻ */ 0x1e3d, 499, /* ḽ Ḽ */ 0x1e3f, 499, /* ḿ Ḿ */ 0x1e41, 499, /* ṁ Ṁ */ 0x1e43, 499, /* ṃ Ṃ */ 0x1e45, 499, /* ṅ Ṅ */ 0x1e47, 499, /* ṇ Ṇ */ 0x1e49, 499, /* ṉ Ṉ */ 0x1e4b, 499, /* ṋ Ṋ */ 0x1e4d, 499, /* ṍ Ṍ */ 0x1e4f, 499, /* ṏ Ṏ */ 0x1e51, 499, /* ṑ Ṑ */ 0x1e53, 499, /* ṓ Ṓ */ 0x1e55, 499, /* ṕ Ṕ */ 0x1e57, 499, /* ṗ Ṗ */ 0x1e59, 499, /* ṙ Ṙ */ 0x1e5b, 499, /* ṛ Ṛ */ 0x1e5d, 499, /* ṝ Ṝ */ 0x1e5f, 499, /* ṟ Ṟ */ 0x1e61, 499, /* ṡ Ṡ */ 0x1e63, 499, /* ṣ Ṣ */ 0x1e65, 499, /* ṥ Ṥ */ 0x1e67, 499, /* ṧ Ṧ */ 0x1e69, 499, /* ṩ Ṩ */ 0x1e6b, 499, /* ṫ Ṫ */ 0x1e6d, 499, /* ṭ Ṭ */ 0x1e6f, 499, /* ṯ Ṯ */ 0x1e71, 499, /* ṱ Ṱ */ 0x1e73, 499, /* ṳ Ṳ */ 0x1e75, 499, /* ṵ Ṵ */ 0x1e77, 499, /* ṷ Ṷ */ 0x1e79, 499, /* ṹ Ṹ */ 0x1e7b, 499, /* ṻ Ṻ */ 0x1e7d, 499, /* ṽ Ṽ */ 0x1e7f, 499, /* ṿ Ṿ */ 0x1e81, 499, /* ẁ Ẁ */ 0x1e83, 499, /* ẃ Ẃ */ 0x1e85, 499, /* ẅ Ẅ */ 0x1e87, 499, /* ẇ Ẇ */ 0x1e89, 499, /* ẉ Ẉ */ 0x1e8b, 499, /* ẋ Ẋ */ 0x1e8d, 499, /* ẍ Ẍ */ 0x1e8f, 499, /* ẏ Ẏ */ 0x1e91, 499, /* ẑ Ẑ */ 0x1e93, 499, /* ẓ Ẓ */ 0x1e95, 499, /* ẕ Ẕ */ 0x1ea1, 499, /* ạ Ạ */ 0x1ea3, 499, /* ả Ả */ 0x1ea5, 499, /* ấ Ấ */ 0x1ea7, 499, /* ầ Ầ */ 0x1ea9, 499, /* ẩ Ẩ */ 0x1eab, 499, /* ẫ Ẫ */ 0x1ead, 499, /* ậ Ậ */ 0x1eaf, 499, /* ắ Ắ */ 0x1eb1, 499, /* ằ Ằ */ 0x1eb3, 499, /* ẳ Ẳ */ 0x1eb5, 499, /* ẵ Ẵ */ 0x1eb7, 499, /* ặ Ặ */ 0x1eb9, 499, /* ẹ Ẹ */ 0x1ebb, 499, /* ẻ Ẻ */ 0x1ebd, 499, /* ẽ Ẽ */ 0x1ebf, 499, /* ế Ế */ 0x1ec1, 499, /* ề Ề */ 0x1ec3, 499, /* ể Ể */ 0x1ec5, 499, /* ễ Ễ */ 0x1ec7, 499, /* ệ Ệ */ 0x1ec9, 499, /* ỉ Ỉ */ 0x1ecb, 499, /* ị Ị */ 0x1ecd, 499, /* ọ Ọ */ 0x1ecf, 499, /* ỏ Ỏ */ 0x1ed1, 499, /* ố Ố */ 0x1ed3, 499, /* ồ Ồ */ 0x1ed5, 499, /* ổ Ổ */ 0x1ed7, 499, /* ỗ Ỗ */ 0x1ed9, 499, /* ộ Ộ */ 0x1edb, 499, /* ớ Ớ */ 0x1edd, 499, /* ờ Ờ */ 0x1edf, 499, /* ở Ở */ 0x1ee1, 499, /* ỡ Ỡ */ 0x1ee3, 499, /* ợ Ợ */ 0x1ee5, 499, /* ụ Ụ */ 0x1ee7, 499, /* ủ Ủ */ 0x1ee9, 499, /* ứ Ứ */ 0x1eeb, 499, /* ừ Ừ */ 0x1eed, 499, /* ử Ử */ 0x1eef, 499, /* ữ Ữ */ 0x1ef1, 499, /* ự Ự */ 0x1ef3, 499, /* ỳ Ỳ */ 0x1ef5, 499, /* ỵ Ỵ */ 0x1ef7, 499, /* ỷ Ỷ */ 0x1ef9, 499, /* ỹ Ỹ */ 0x1f51, 508, /* ὑ Ὑ */ 0x1f53, 508, /* ὓ Ὓ */ 0x1f55, 508, /* ὕ Ὕ */ 0x1f57, 508, /* ὗ Ὗ */ 0x1fb3, 509, /* ᾳ ᾼ */ 0x1fc3, 509, /* ῃ ῌ */ 0x1fe5, 507, /* ῥ Ῥ */ 0x1ff3, 509, /* ῳ ῼ */ }; /* * upper case ranges * 3rd col is conversion excess 500 */ static Rune __tolower2[] = { 0x0041, 0x005a, 532, /* A-Z a-z */ 0x00c0, 0x00d6, 532, /* À-Ö à-ö */ 0x00d8, 0x00de, 532, /* Ø-Þ ø-þ */ 0x0189, 0x018a, 705, /* Ɖ-Ɗ ɖ-ɗ */ 0x018e, 0x018f, 702, /* Ǝ-Ə ɘ-ə */ 0x01b1, 0x01b2, 717, /* Ʊ-Ʋ ʊ-ʋ */ 0x0388, 0x038a, 537, /* Έ-Ί έ-ί */ 0x038e, 0x038f, 563, /* Ύ-Ώ ύ-ώ */ 0x0391, 0x03a1, 532, /* Α-Ρ α-ρ */ 0x03a3, 0x03ab, 532, /* Σ-Ϋ σ-ϋ */ 0x0401, 0x040c, 580, /* Ё-Ќ ё-ќ */ 0x040e, 0x040f, 580, /* Ў-Џ ў-џ */ 0x0410, 0x042f, 532, /* А-Я а-я */ 0x0531, 0x0556, 548, /* Ա-Ֆ ա-ֆ */ 0x10a0, 0x10c5, 548, /* Ⴀ-Ⴥ ა-ჵ */ 0x1f08, 0x1f0f, 492, /* Ἀ-Ἇ ἀ-ἇ */ 0x1f18, 0x1f1d, 492, /* Ἐ-Ἕ ἐ-ἕ */ 0x1f28, 0x1f2f, 492, /* Ἠ-Ἧ ἠ-ἧ */ 0x1f38, 0x1f3f, 492, /* Ἰ-Ἷ ἰ-ἷ */ 0x1f48, 0x1f4d, 492, /* Ὀ-Ὅ ὀ-ὅ */ 0x1f68, 0x1f6f, 492, /* Ὠ-Ὧ ὠ-ὧ */ 0x1f88, 0x1f8f, 492, /* ᾈ-ᾏ ᾀ-ᾇ */ 0x1f98, 0x1f9f, 492, /* ᾘ-ᾟ ᾐ-ᾗ */ 0x1fa8, 0x1faf, 492, /* ᾨ-ᾯ ᾠ-ᾧ */ 0x1fb8, 0x1fb9, 492, /* Ᾰ-Ᾱ ᾰ-ᾱ */ 0x1fba, 0x1fbb, 426, /* Ὰ-Ά ὰ-ά */ 0x1fc8, 0x1fcb, 414, /* Ὲ-Ή ὲ-ή */ 0x1fd8, 0x1fd9, 492, /* Ῐ-Ῑ ῐ-ῑ */ 0x1fda, 0x1fdb, 400, /* Ὶ-Ί ὶ-ί */ 0x1fe8, 0x1fe9, 492, /* Ῠ-Ῡ ῠ-ῡ */ 0x1fea, 0x1feb, 388, /* Ὺ-Ύ ὺ-ύ */ 0x1ff8, 0x1ff9, 372, /* Ὸ-Ό ὸ-ό */ 0x1ffa, 0x1ffb, 374, /* Ὼ-Ώ ὼ-ώ */ 0x2160, 0x216f, 516, /* Ⅰ-Ⅿ ⅰ-ⅿ */ 0x24b6, 0x24cf, 526, /* Ⓐ-Ⓩ ⓐ-ⓩ */ 0xff21, 0xff3a, 532, /* A-Z a-z */ }; /* * upper case singlets * 2nd col is conversion excess 500 */ static Rune __tolower1[] = { 0x0100, 501, /* Ā ā */ 0x0102, 501, /* Ă ă */ 0x0104, 501, /* Ą ą */ 0x0106, 501, /* Ć ć */ 0x0108, 501, /* Ĉ ĉ */ 0x010a, 501, /* Ċ ċ */ 0x010c, 501, /* Č č */ 0x010e, 501, /* Ď ď */ 0x0110, 501, /* Đ đ */ 0x0112, 501, /* Ē ē */ 0x0114, 501, /* Ĕ ĕ */ 0x0116, 501, /* Ė ė */ 0x0118, 501, /* Ę ę */ 0x011a, 501, /* Ě ě */ 0x011c, 501, /* Ĝ ĝ */ 0x011e, 501, /* Ğ ğ */ 0x0120, 501, /* Ġ ġ */ 0x0122, 501, /* Ģ ģ */ 0x0124, 501, /* Ĥ ĥ */ 0x0126, 501, /* Ħ ħ */ 0x0128, 501, /* Ĩ ĩ */ 0x012a, 501, /* Ī ī */ 0x012c, 501, /* Ĭ ĭ */ 0x012e, 501, /* Į į */ 0x0130, 301, /* İ i */ 0x0132, 501, /* IJ ij */ 0x0134, 501, /* Ĵ ĵ */ 0x0136, 501, /* Ķ ķ */ 0x0139, 501, /* Ĺ ĺ */ 0x013b, 501, /* Ļ ļ */ 0x013d, 501, /* Ľ ľ */ 0x013f, 501, /* Ŀ ŀ */ 0x0141, 501, /* Ł ł */ 0x0143, 501, /* Ń ń */ 0x0145, 501, /* Ņ ņ */ 0x0147, 501, /* Ň ň */ 0x014a, 501, /* Ŋ ŋ */ 0x014c, 501, /* Ō ō */ 0x014e, 501, /* Ŏ ŏ */ 0x0150, 501, /* Ő ő */ 0x0152, 501, /* Œ œ */ 0x0154, 501, /* Ŕ ŕ */ 0x0156, 501, /* Ŗ ŗ */ 0x0158, 501, /* Ř ř */ 0x015a, 501, /* Ś ś */ 0x015c, 501, /* Ŝ ŝ */ 0x015e, 501, /* Ş ş */ 0x0160, 501, /* Š š */ 0x0162, 501, /* Ţ ţ */ 0x0164, 501, /* Ť ť */ 0x0166, 501, /* Ŧ ŧ */ 0x0168, 501, /* Ũ ũ */ 0x016a, 501, /* Ū ū */ 0x016c, 501, /* Ŭ ŭ */ 0x016e, 501, /* Ů ů */ 0x0170, 501, /* Ű ű */ 0x0172, 501, /* Ų ų */ 0x0174, 501, /* Ŵ ŵ */ 0x0176, 501, /* Ŷ ŷ */ 0x0178, 379, /* Ÿ ÿ */ 0x0179, 501, /* Ź ź */ 0x017b, 501, /* Ż ż */ 0x017d, 501, /* Ž ž */ 0x0181, 710, /* Ɓ ɓ */ 0x0182, 501, /* Ƃ ƃ */ 0x0184, 501, /* Ƅ ƅ */ 0x0186, 706, /* Ɔ ɔ */ 0x0187, 501, /* Ƈ ƈ */ 0x018b, 501, /* Ƌ ƌ */ 0x0190, 703, /* Ɛ ɛ */ 0x0191, 501, /* Ƒ ƒ */ 0x0193, 705, /* Ɠ ɠ */ 0x0194, 707, /* Ɣ ɣ */ 0x0196, 711, /* Ɩ ɩ */ 0x0197, 709, /* Ɨ ɨ */ 0x0198, 501, /* Ƙ ƙ */ 0x019c, 711, /* Ɯ ɯ */ 0x019d, 713, /* Ɲ ɲ */ 0x01a0, 501, /* Ơ ơ */ 0x01a2, 501, /* Ƣ ƣ */ 0x01a4, 501, /* Ƥ ƥ */ 0x01a7, 501, /* Ƨ ƨ */ 0x01a9, 718, /* Ʃ ʃ */ 0x01ac, 501, /* Ƭ ƭ */ 0x01ae, 718, /* Ʈ ʈ */ 0x01af, 501, /* Ư ư */ 0x01b3, 501, /* Ƴ ƴ */ 0x01b5, 501, /* Ƶ ƶ */ 0x01b7, 719, /* Ʒ ʒ */ 0x01b8, 501, /* Ƹ ƹ */ 0x01bc, 501, /* Ƽ ƽ */ 0x01c4, 502, /* DŽ dž */ 0x01c5, 501, /* Dž dž */ 0x01c7, 502, /* LJ lj */ 0x01c8, 501, /* Lj lj */ 0x01ca, 502, /* NJ nj */ 0x01cb, 501, /* Nj nj */ 0x01cd, 501, /* Ǎ ǎ */ 0x01cf, 501, /* Ǐ ǐ */ 0x01d1, 501, /* Ǒ ǒ */ 0x01d3, 501, /* Ǔ ǔ */ 0x01d5, 501, /* Ǖ ǖ */ 0x01d7, 501, /* Ǘ ǘ */ 0x01d9, 501, /* Ǚ ǚ */ 0x01db, 501, /* Ǜ ǜ */ 0x01de, 501, /* Ǟ ǟ */ 0x01e0, 501, /* Ǡ ǡ */ 0x01e2, 501, /* Ǣ ǣ */ 0x01e4, 501, /* Ǥ ǥ */ 0x01e6, 501, /* Ǧ ǧ */ 0x01e8, 501, /* Ǩ ǩ */ 0x01ea, 501, /* Ǫ ǫ */ 0x01ec, 501, /* Ǭ ǭ */ 0x01ee, 501, /* Ǯ ǯ */ 0x01f1, 502, /* DZ dz */ 0x01f2, 501, /* Dz dz */ 0x01f4, 501, /* Ǵ ǵ */ 0x01fa, 501, /* Ǻ ǻ */ 0x01fc, 501, /* Ǽ ǽ */ 0x01fe, 501, /* Ǿ ǿ */ 0x0200, 501, /* Ȁ ȁ */ 0x0202, 501, /* Ȃ ȃ */ 0x0204, 501, /* Ȅ ȅ */ 0x0206, 501, /* Ȇ ȇ */ 0x0208, 501, /* Ȉ ȉ */ 0x020a, 501, /* Ȋ ȋ */ 0x020c, 501, /* Ȍ ȍ */ 0x020e, 501, /* Ȏ ȏ */ 0x0210, 501, /* Ȑ ȑ */ 0x0212, 501, /* Ȓ ȓ */ 0x0214, 501, /* Ȕ ȕ */ 0x0216, 501, /* Ȗ ȗ */ 0x0386, 538, /* Ά ά */ 0x038c, 564, /* Ό ό */ 0x03e2, 501, /* Ϣ ϣ */ 0x03e4, 501, /* Ϥ ϥ */ 0x03e6, 501, /* Ϧ ϧ */ 0x03e8, 501, /* Ϩ ϩ */ 0x03ea, 501, /* Ϫ ϫ */ 0x03ec, 501, /* Ϭ ϭ */ 0x03ee, 501, /* Ϯ ϯ */ 0x0460, 501, /* Ѡ ѡ */ 0x0462, 501, /* Ѣ ѣ */ 0x0464, 501, /* Ѥ ѥ */ 0x0466, 501, /* Ѧ ѧ */ 0x0468, 501, /* Ѩ ѩ */ 0x046a, 501, /* Ѫ ѫ */ 0x046c, 501, /* Ѭ ѭ */ 0x046e, 501, /* Ѯ ѯ */ 0x0470, 501, /* Ѱ ѱ */ 0x0472, 501, /* Ѳ ѳ */ 0x0474, 501, /* Ѵ ѵ */ 0x0476, 501, /* Ѷ ѷ */ 0x0478, 501, /* Ѹ ѹ */ 0x047a, 501, /* Ѻ ѻ */ 0x047c, 501, /* Ѽ ѽ */ 0x047e, 501, /* Ѿ ѿ */ 0x0480, 501, /* Ҁ ҁ */ 0x0490, 501, /* Ґ ґ */ 0x0492, 501, /* Ғ ғ */ 0x0494, 501, /* Ҕ ҕ */ 0x0496, 501, /* Җ җ */ 0x0498, 501, /* Ҙ ҙ */ 0x049a, 501, /* Қ қ */ 0x049c, 501, /* Ҝ ҝ */ 0x049e, 501, /* Ҟ ҟ */ 0x04a0, 501, /* Ҡ ҡ */ 0x04a2, 501, /* Ң ң */ 0x04a4, 501, /* Ҥ ҥ */ 0x04a6, 501, /* Ҧ ҧ */ 0x04a8, 501, /* Ҩ ҩ */ 0x04aa, 501, /* Ҫ ҫ */ 0x04ac, 501, /* Ҭ ҭ */ 0x04ae, 501, /* Ү ү */ 0x04b0, 501, /* Ұ ұ */ 0x04b2, 501, /* Ҳ ҳ */ 0x04b4, 501, /* Ҵ ҵ */ 0x04b6, 501, /* Ҷ ҷ */ 0x04b8, 501, /* Ҹ ҹ */ 0x04ba, 501, /* Һ һ */ 0x04bc, 501, /* Ҽ ҽ */ 0x04be, 501, /* Ҿ ҿ */ 0x04c1, 501, /* Ӂ ӂ */ 0x04c3, 501, /* Ӄ ӄ */ 0x04c7, 501, /* Ӈ ӈ */ 0x04cb, 501, /* Ӌ ӌ */ 0x04d0, 501, /* Ӑ ӑ */ 0x04d2, 501, /* Ӓ ӓ */ 0x04d4, 501, /* Ӕ ӕ */ 0x04d6, 501, /* Ӗ ӗ */ 0x04d8, 501, /* Ә ә */ 0x04da, 501, /* Ӛ ӛ */ 0x04dc, 501, /* Ӝ ӝ */ 0x04de, 501, /* Ӟ ӟ */ 0x04e0, 501, /* Ӡ ӡ */ 0x04e2, 501, /* Ӣ ӣ */ 0x04e4, 501, /* Ӥ ӥ */ 0x04e6, 501, /* Ӧ ӧ */ 0x04e8, 501, /* Ө ө */ 0x04ea, 501, /* Ӫ ӫ */ 0x04ee, 501, /* Ӯ ӯ */ 0x04f0, 501, /* Ӱ ӱ */ 0x04f2, 501, /* Ӳ ӳ */ 0x04f4, 501, /* Ӵ ӵ */ 0x04f8, 501, /* Ӹ ӹ */ 0x1e00, 501, /* Ḁ ḁ */ 0x1e02, 501, /* Ḃ ḃ */ 0x1e04, 501, /* Ḅ ḅ */ 0x1e06, 501, /* Ḇ ḇ */ 0x1e08, 501, /* Ḉ ḉ */ 0x1e0a, 501, /* Ḋ ḋ */ 0x1e0c, 501, /* Ḍ ḍ */ 0x1e0e, 501, /* Ḏ ḏ */ 0x1e10, 501, /* Ḑ ḑ */ 0x1e12, 501, /* Ḓ ḓ */ 0x1e14, 501, /* Ḕ ḕ */ 0x1e16, 501, /* Ḗ ḗ */ 0x1e18, 501, /* Ḙ ḙ */ 0x1e1a, 501, /* Ḛ ḛ */ 0x1e1c, 501, /* Ḝ ḝ */ 0x1e1e, 501, /* Ḟ ḟ */ 0x1e20, 501, /* Ḡ ḡ */ 0x1e22, 501, /* Ḣ ḣ */ 0x1e24, 501, /* Ḥ ḥ */ 0x1e26, 501, /* Ḧ ḧ */ 0x1e28, 501, /* Ḩ ḩ */ 0x1e2a, 501, /* Ḫ ḫ */ 0x1e2c, 501, /* Ḭ ḭ */ 0x1e2e, 501, /* Ḯ ḯ */ 0x1e30, 501, /* Ḱ ḱ */ 0x1e32, 501, /* Ḳ ḳ */ 0x1e34, 501, /* Ḵ ḵ */ 0x1e36, 501, /* Ḷ ḷ */ 0x1e38, 501, /* Ḹ ḹ */ 0x1e3a, 501, /* Ḻ ḻ */ 0x1e3c, 501, /* Ḽ ḽ */ 0x1e3e, 501, /* Ḿ ḿ */ 0x1e40, 501, /* Ṁ ṁ */ 0x1e42, 501, /* Ṃ ṃ */ 0x1e44, 501, /* Ṅ ṅ */ 0x1e46, 501, /* Ṇ ṇ */ 0x1e48, 501, /* Ṉ ṉ */ 0x1e4a, 501, /* Ṋ ṋ */ 0x1e4c, 501, /* Ṍ ṍ */ 0x1e4e, 501, /* Ṏ ṏ */ 0x1e50, 501, /* Ṑ ṑ */ 0x1e52, 501, /* Ṓ ṓ */ 0x1e54, 501, /* Ṕ ṕ */ 0x1e56, 501, /* Ṗ ṗ */ 0x1e58, 501, /* Ṙ ṙ */ 0x1e5a, 501, /* Ṛ ṛ */ 0x1e5c, 501, /* Ṝ ṝ */ 0x1e5e, 501, /* Ṟ ṟ */ 0x1e60, 501, /* Ṡ ṡ */ 0x1e62, 501, /* Ṣ ṣ */ 0x1e64, 501, /* Ṥ ṥ */ 0x1e66, 501, /* Ṧ ṧ */ 0x1e68, 501, /* Ṩ ṩ */ 0x1e6a, 501, /* Ṫ ṫ */ 0x1e6c, 501, /* Ṭ ṭ */ 0x1e6e, 501, /* Ṯ ṯ */ 0x1e70, 501, /* Ṱ ṱ */ 0x1e72, 501, /* Ṳ ṳ */ 0x1e74, 501, /* Ṵ ṵ */ 0x1e76, 501, /* Ṷ ṷ */ 0x1e78, 501, /* Ṹ ṹ */ 0x1e7a, 501, /* Ṻ ṻ */ 0x1e7c, 501, /* Ṽ ṽ */ 0x1e7e, 501, /* Ṿ ṿ */ 0x1e80, 501, /* Ẁ ẁ */ 0x1e82, 501, /* Ẃ ẃ */ 0x1e84, 501, /* Ẅ ẅ */ 0x1e86, 501, /* Ẇ ẇ */ 0x1e88, 501, /* Ẉ ẉ */ 0x1e8a, 501, /* Ẋ ẋ */ 0x1e8c, 501, /* Ẍ ẍ */ 0x1e8e, 501, /* Ẏ ẏ */ 0x1e90, 501, /* Ẑ ẑ */ 0x1e92, 501, /* Ẓ ẓ */ 0x1e94, 501, /* Ẕ ẕ */ 0x1ea0, 501, /* Ạ ạ */ 0x1ea2, 501, /* Ả ả */ 0x1ea4, 501, /* Ấ ấ */ 0x1ea6, 501, /* Ầ ầ */ 0x1ea8, 501, /* Ẩ ẩ */ 0x1eaa, 501, /* Ẫ ẫ */ 0x1eac, 501, /* Ậ ậ */ 0x1eae, 501, /* Ắ ắ */ 0x1eb0, 501, /* Ằ ằ */ 0x1eb2, 501, /* Ẳ ẳ */ 0x1eb4, 501, /* Ẵ ẵ */ 0x1eb6, 501, /* Ặ ặ */ 0x1eb8, 501, /* Ẹ ẹ */ 0x1eba, 501, /* Ẻ ẻ */ 0x1ebc, 501, /* Ẽ ẽ */ 0x1ebe, 501, /* Ế ế */ 0x1ec0, 501, /* Ề ề */ 0x1ec2, 501, /* Ể ể */ 0x1ec4, 501, /* Ễ ễ */ 0x1ec6, 501, /* Ệ ệ */ 0x1ec8, 501, /* Ỉ ỉ */ 0x1eca, 501, /* Ị ị */ 0x1ecc, 501, /* Ọ ọ */ 0x1ece, 501, /* Ỏ ỏ */ 0x1ed0, 501, /* Ố ố */ 0x1ed2, 501, /* Ồ ồ */ 0x1ed4, 501, /* Ổ ổ */ 0x1ed6, 501, /* Ỗ ỗ */ 0x1ed8, 501, /* Ộ ộ */ 0x1eda, 501, /* Ớ ớ */ 0x1edc, 501, /* Ờ ờ */ 0x1ede, 501, /* Ở ở */ 0x1ee0, 501, /* Ỡ ỡ */ 0x1ee2, 501, /* Ợ ợ */ 0x1ee4, 501, /* Ụ ụ */ 0x1ee6, 501, /* Ủ ủ */ 0x1ee8, 501, /* Ứ ứ */ 0x1eea, 501, /* Ừ ừ */ 0x1eec, 501, /* Ử ử */ 0x1eee, 501, /* Ữ ữ */ 0x1ef0, 501, /* Ự ự */ 0x1ef2, 501, /* Ỳ ỳ */ 0x1ef4, 501, /* Ỵ ỵ */ 0x1ef6, 501, /* Ỷ ỷ */ 0x1ef8, 501, /* Ỹ ỹ */ 0x1f59, 492, /* Ὑ ὑ */ 0x1f5b, 492, /* Ὓ ὓ */ 0x1f5d, 492, /* Ὕ ὕ */ 0x1f5f, 492, /* Ὗ ὗ */ 0x1fbc, 491, /* ᾼ ᾳ */ 0x1fcc, 491, /* ῌ ῃ */ 0x1fec, 493, /* Ῥ ῥ */ 0x1ffc, 491, /* ῼ ῳ */ }; /* * title characters are those between * upper and lower case. ie DZ Dz dz */ static Rune __totitle1[] = { 0x01c4, 501, /* DŽ Dž */ 0x01c6, 499, /* dž Dž */ 0x01c7, 501, /* LJ Lj */ 0x01c9, 499, /* lj Lj */ 0x01ca, 501, /* NJ Nj */ 0x01cc, 499, /* nj Nj */ 0x01f1, 501, /* DZ Dz */ 0x01f3, 499, /* dz Dz */ }; static Rune* bsearch(Rune c, Rune *t, int n, int ne) { Rune *p; int m; while(n > 1) { m = n/2; p = t + m*ne; if(c >= p[0]) { t = p; n = n-m; } else n = m; } if(n && c >= t[0]) return t; return 0; } Rune tolowerrune(Rune c) { Rune *p; p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3); if(p && c >= p[0] && c <= p[1]) return c + p[2] - 500; p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2); if(p && c == p[0]) return c + p[1] - 500; return c; } Rune toupperrune(Rune c) { Rune *p; p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3); if(p && c >= p[0] && c <= p[1]) return c + p[2] - 500; p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2); if(p && c == p[0]) return c + p[1] - 500; return c; } Rune totitlerune(Rune c) { Rune *p; p = bsearch(c, __totitle1, nelem(__totitle1)/2, 2); if(p && c == p[0]) return c + p[1] - 500; return c; } int islowerrune(Rune c) { Rune *p; p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3); if(p && c >= p[0] && c <= p[1]) return 1; p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2); if(p && c == p[0]) return 1; return 0; } int isupperrune(Rune c) { Rune *p; p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3); if(p && c >= p[0] && c <= p[1]) return 1; p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2); if(p && c == p[0]) return 1; return 0; } int isalpharune(Rune c) { Rune *p; if(isupperrune(c) || islowerrune(c)) return 1; p = bsearch(c, __alpha2, nelem(__alpha2)/2, 2); if(p && c >= p[0] && c <= p[1]) return 1; p = bsearch(c, __alpha1, nelem(__alpha1), 1); if(p && c == p[0]) return 1; return 0; } int istitlerune(Rune c) { return isupperrune(c) && islowerrune(c); } int isspacerune(Rune c) { Rune *p; p = bsearch(c, __space2, nelem(__space2)/2, 2); if(p && c >= p[0] && c <= p[1]) return 1; return 0; } 9base-6/lib9/utf/utfrrune.c0000644000175000017500000000225511402154555015225 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" char* utfrrune(char *s, long c) { long c1; Rune r; char *s1; if(c < Runesync) /* not part of utf sequence */ return strrchr(s, c); s1 = 0; for(;;) { c1 = *(uchar*)s; if(c1 < Runeself) { /* one byte rune */ if(c1 == 0) return s1; if(c1 == c) s1 = s; s++; continue; } c1 = chartorune(&r, s); if(r == c) s1 = s; s += c1; } } 9base-6/lib9/utf/LICENSE0000644000175000017500000000136411402154555014214 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 1998-2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ 9base-6/lib9/utf/runestrcpy.c0000644000175000017500000000164411402154555015572 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrcpy(Rune *s1, Rune *s2) { Rune *os1; os1 = s1; while(*s1++ = *s2++) ; return os1; } 9base-6/lib9/utf/runestrncat.c0000644000175000017500000000175711402154555015731 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrncat(Rune *s1, Rune *s2, long n) { Rune *os1; os1 = s1; s1 = runestrchr(s1, 0); while(*s1++ = *s2++) if(--n < 0) { s1[-1] = 0; break; } return os1; } 9base-6/lib9/utf/runestrstr.c0000644000175000017500000000224711402154555015607 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" /* * Return pointer to first occurrence of s2 in s1, * 0 if none */ Rune* runestrstr(Rune *s1, Rune *s2) { Rune *p, *pa, *pb; int c0, c; c0 = *s2; if(c0 == 0) return s1; s2++; for(p=runestrchr(s1, c0); p; p=runestrchr(p+1, c0)) { pa = p; for(pb=s2;; pb++) { c = *pb; if(c == 0) return p; if(c != *++pa) break; } } return 0; } 9base-6/lib9/utf/plan9.h0000644000175000017500000000102311402154555014373 0ustar anselmanselm/* * compiler directive on Plan 9 */ #ifndef USED #define USED(x) if(x);else #endif /* * easiest way to make sure these are defined */ #define uchar _utfuchar #define ushort _utfushort #define uint _utfuint #define ulong _utfulong typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; /* * nil cannot be ((void*)0) on ANSI C, * because it is used for function pointers */ #undef nil #define nil 0 #undef nelem #define nelem(x) (sizeof (x)/sizeof (x)[0]) 9base-6/lib9/utf/utflen.c0000644000175000017500000000200111402154555014635 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" int utflen(char *s) { int c; long n; Rune rune; n = 0; for(;;) { c = *(uchar*)s; if(c < Runeself) { if(c == 0) return n; s++; } else s += chartorune(&rune, s); n++; } } 9base-6/lib9/utf/runestrcat.c0000644000175000017500000000162611402154555015546 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrcat(Rune *s1, Rune *s2) { runestrcpy(runestrchr(s1, 0), s2); return s1; } 9base-6/lib9/utf/runestrdup.c0000644000175000017500000000174211402154555015566 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include #include "plan9.h" #include "utf.h" Rune* runestrdup(Rune *s) { Rune *ns; ns = malloc(sizeof(Rune)*(runestrlen(s) + 1)); if(ns == 0) return 0; return runestrcpy(ns, s); } 9base-6/lib9/utf/utfutf.c0000644000175000017500000000223711402154555014670 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" /* * Return pointer to first occurrence of s2 in s1, * 0 if none */ char* utfutf(char *s1, char *s2) { char *p; long f, n1, n2; Rune r; n1 = chartorune(&r, s2); f = r; if(f <= Runesync) /* represents self */ return strstr(s1, s2); n2 = strlen(s2); for(p=s1; p=utfrune(p, f); p+=n1) if(strncmp(p, s2, n2) == 0) return p; return 0; } 9base-6/lib9/utf/utfrune.c0000644000175000017500000000224011402154555015035 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" char* utfrune(char *s, long c) { long c1; Rune r; int n; if(c < Runesync) /* not part of utf sequence */ return strchr(s, c); for(;;) { c1 = *(uchar*)s; if(c1 < Runeself) { /* one byte rune */ if(c1 == 0) return 0; if(c1 == c) return s; s++; continue; } n = chartorune(&r, s); if(r == c) return s; s += n; } } 9base-6/lib9/utf/portdate0000644000175000017500000000071211402154555014750 0ustar anselmanselmrune.c 2004/1225 runestrcat.c 2004/1225 runestrchr.c 2004/1225 runestrcmp.c 2004/1225 runestrcpy.c 2004/1225 runestrdup.c 2004/1225 runestrecpy.c 2004/1225 runestrlen.c 2004/1225 runestrncat.c 2004/1225 runestrncmp.c 2004/1225 runestrncpy.c 2004/1225 runestrrchr.c 2004/1225 runestrstr.c 2004/1225 runetype.c 2004/1225 utfecpy.c 2004/1225 utflen.c 2004/1225 utfnlen.c 2004/1225 utfrrune.c 2004/1225 utfrune.c 2004/1225 utfutf.c 2004/1225 9base-6/lib9/utf/README0000644000175000017500000000136411402154555014067 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 1998-2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ 9base-6/lib9/utf/runestrcmp.c0000644000175000017500000000176711402154555015564 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" int runestrcmp(Rune *s1, Rune *s2) { Rune c1, c2; for(;;) { c1 = *s1++; c2 = *s2++; if(c1 != c2) { if(c1 > c2) return 1; return -1; } if(c1 == 0) return 0; } } 9base-6/lib9/utf/runestrrchr.c0000644000175000017500000000172011402154555015730 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrrchr(Rune *s, Rune c) { Rune *r; if(c == 0) return runestrchr(s, 0); r = 0; while(s = runestrchr(s, c)) r = s++; return r; } 9base-6/lib9/utf/runestrncpy.c0000644000175000017500000000200411402154555015737 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ #include #include #include "plan9.h" #include "utf.h" Rune* runestrncpy(Rune *s1, Rune *s2, long n) { int i; Rune *os1; os1 = s1; for(i = 0; i < n; i++) if((*s1++ = *s2++) == 0) { while(++i < n) *s1++ = 0; return os1; } return os1; } 9base-6/lib9/utf/utfdef.h0000644000175000017500000000115711402154555014635 0ustar anselmanselm/* * compiler directive on Plan 9 */ #ifndef USED #define USED(x) if(x);else #endif /* * easiest way to make sure these are defined */ #define uchar _fmtuchar #define ushort _fmtushort #define uint _fmtuint #define ulong _fmtulong #define vlong _fmtvlong #define uvlong _fmtuvlong typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned long long uvlong; typedef long long vlong; /* * nil cannot be ((void*)0) on ANSI C, * because it is used for function pointers */ #undef nil #define nil 0 #undef nelem #define nelem ((void*)0) 9base-6/lib9/libc.h0000644000175000017500000006017011402154555013473 0ustar anselmanselm/* * Lib9 is miscellany from the Plan 9 C library that doesn't * fit into libutf or into libfmt, but is still missing from traditional * Unix C libraries. */ #ifndef _LIBC_H_ #define _LIBC_H_ 1 #if defined(__cplusplus) extern "C" { #endif #include #include /* * Begin usual libc.h */ #ifndef nil #define nil ((void*)0) #endif #define nelem(x) (sizeof(x)/sizeof((x)[0])) #ifndef offsetof #define offsetof(s, m) (ulong)(&(((s*)0)->m)) #endif /* * mem routines (provided by system ) * extern void* memccpy(void*, void*, int, ulong); extern void* memset(void*, int, ulong); extern int memcmp(void*, void*, ulong); extern void* memcpy(void*, void*, ulong); extern void* memmove(void*, void*, ulong); extern void* memchr(void*, int, ulong); */ /* * string routines (provided by system ) * extern char* strcat(char*, char*); extern char* strchr(char*, int); extern int strcmp(char*, char*); extern char* strcpy(char*, char*); */ extern char* strecpy(char*, char*, char*); extern char* p9strdup(char*); /* extern char* strncat(char*, char*, long); extern char* strncpy(char*, char*, long); extern int strncmp(char*, char*, long); extern char* strpbrk(char*, char*); extern char* strrchr(char*, int); extern char* strtok(char*, char*); extern long strlen(char*); extern long strspn(char*, char*); extern long strcspn(char*, char*); extern char* strstr(char*, char*); */ extern int cistrncmp(char*, char*, int); extern int cistrcmp(char*, char*); extern char* cistrstr(char*, char*); extern int tokenize(char*, char**, int); /* enum { UTFmax = 3, Runesync = 0x80, Runeself = 0x80, Runeerror = 0x80, }; */ /* * rune routines (provided by * extern int runetochar(char*, Rune*); extern int chartorune(Rune*, char*); extern int runelen(long); extern int runenlen(Rune*, int); extern int fullrune(char*, int); extern int utflen(char*); extern int utfnlen(char*, long); extern char* utfrune(char*, long); extern char* utfrrune(char*, long); extern char* utfutf(char*, char*); extern char* utfecpy(char*, char*, char*); extern Rune* runestrcat(Rune*, Rune*); extern Rune* runestrchr(Rune*, Rune); extern int runestrcmp(Rune*, Rune*); extern Rune* runestrcpy(Rune*, Rune*); extern Rune* runestrncpy(Rune*, Rune*, long); extern Rune* runestrecpy(Rune*, Rune*, Rune*); extern Rune* runestrdup(Rune*); extern Rune* runestrncat(Rune*, Rune*, long); extern int runestrncmp(Rune*, Rune*, long); extern Rune* runestrrchr(Rune*, Rune); extern long runestrlen(Rune*); extern Rune* runestrstr(Rune*, Rune*); extern Rune tolowerrune(Rune); extern Rune totitlerune(Rune); extern Rune toupperrune(Rune); extern int isalpharune(Rune); extern int islowerrune(Rune); extern int isspacerune(Rune); extern int istitlerune(Rune); extern int isupperrune(Rune); */ /* * malloc (provied by system ) * extern void* malloc(ulong); */ extern void* p9malloc(ulong); extern void* mallocz(ulong, int); extern void p9free(void*); extern void* p9calloc(ulong, ulong); extern void* p9realloc(void*, ulong); extern void setmalloctag(void*, ulong); extern void setrealloctag(void*, ulong); extern ulong getmalloctag(void*); extern ulong getrealloctag(void*); /* extern void* malloctopoolblock(void*); */ #ifndef NOPLAN9DEFINES #define malloc p9malloc #define realloc p9realloc #define calloc p9calloc #define free p9free #undef strdup #define strdup p9strdup #endif /* * print routines (provided by ) * typedef struct Fmt Fmt; struct Fmt{ uchar runes; void *start; void *to; void *stop; int (*flush)(Fmt *); void *farg; int nfmt; va_list args; int r; int width; int prec; ulong flags; }; enum{ FmtWidth = 1, FmtLeft = FmtWidth << 1, FmtPrec = FmtLeft << 1, FmtSharp = FmtPrec << 1, FmtSpace = FmtSharp << 1, FmtSign = FmtSpace << 1, FmtZero = FmtSign << 1, FmtUnsigned = FmtZero << 1, FmtShort = FmtUnsigned << 1, FmtLong = FmtShort << 1, FmtVLong = FmtLong << 1, FmtComma = FmtVLong << 1, FmtByte = FmtComma << 1, FmtFlag = FmtByte << 1 }; extern int print(char*, ...); extern char* seprint(char*, char*, char*, ...); extern char* vseprint(char*, char*, char*, va_list); extern int snprint(char*, int, char*, ...); extern int vsnprint(char*, int, char*, va_list); extern char* smprint(char*, ...); extern char* vsmprint(char*, va_list); extern int sprint(char*, char*, ...); extern int fprint(int, char*, ...); extern int vfprint(int, char*, va_list); extern int runesprint(Rune*, char*, ...); extern int runesnprint(Rune*, int, char*, ...); extern int runevsnprint(Rune*, int, char*, va_list); extern Rune* runeseprint(Rune*, Rune*, char*, ...); extern Rune* runevseprint(Rune*, Rune*, char*, va_list); extern Rune* runesmprint(char*, ...); extern Rune* runevsmprint(char*, va_list); extern int fmtfdinit(Fmt*, int, char*, int); extern int fmtfdflush(Fmt*); extern int fmtstrinit(Fmt*); extern char* fmtstrflush(Fmt*); extern int runefmtstrinit(Fmt*); extern Rune* runefmtstrflush(Fmt*); extern int fmtinstall(int, int (*)(Fmt*)); extern int dofmt(Fmt*, char*); extern int dorfmt(Fmt*, Rune*); extern int fmtprint(Fmt*, char*, ...); extern int fmtvprint(Fmt*, char*, va_list); extern int fmtrune(Fmt*, int); extern int fmtstrcpy(Fmt*, char*); extern int fmtrunestrcpy(Fmt*, Rune*); */ /* * error string for %r * supplied on per os basis, not part of fmt library * * (provided by lib9, but declared in fmt.h) * extern int errfmt(Fmt *f); */ /* * quoted strings */ extern char *unquotestrdup(char*); extern Rune *unquoterunestrdup(Rune*); extern char *quotestrdup(char*); extern Rune *quoterunestrdup(Rune*); /* * in fmt.h * extern void quotefmtinstall(void); extern int quotestrfmt(Fmt*); extern int quoterunestrfmt(Fmt*); */ #ifndef NOPLAN9DEFINES #define doquote fmtdoquote #endif extern int needsrcquote(int); /* * random number */ extern void p9srand(long); extern int p9rand(void); extern int p9nrand(int); extern long p9lrand(void); extern long p9lnrand(long); extern double p9frand(void); extern ulong truerand(void); /* uses /dev/random */ extern ulong ntruerand(ulong); /* uses /dev/random */ #ifndef NOPLAN9DEFINES #define srand p9srand #define rand p9rand #define nrand p9nrand #define lrand p9lrand #define lnrand p9lnrand #define frand p9frand #endif /* * math */ extern ulong getfcr(void); extern void setfsr(ulong); extern ulong getfsr(void); extern void setfcr(ulong); extern double NaN(void); extern double Inf(int); extern int isNaN(double); extern int isInf(double, int); extern ulong umuldiv(ulong, ulong, ulong); extern long muldiv(long, long, long); /* * provided by math.h * extern double pow(double, double); extern double atan2(double, double); extern double fabs(double); extern double atan(double); extern double log(double); extern double log10(double); extern double exp(double); extern double floor(double); extern double ceil(double); extern double hypot(double, double); extern double sin(double); extern double cos(double); extern double tan(double); extern double asin(double); extern double acos(double); extern double sinh(double); extern double cosh(double); extern double tanh(double); extern double sqrt(double); extern double fmod(double, double); #define HUGE 3.4028234e38 #define PIO2 1.570796326794896619231e0 #define PI (PIO2+PIO2) */ #define PI M_PI #define PIO2 M_PI_2 /* * Time-of-day */ typedef struct Tm { int sec; int min; int hour; int mday; int mon; int year; int wday; int yday; char zone[4]; int tzoff; } Tm; extern Tm* p9gmtime(long); extern Tm* p9localtime(long); extern char* p9asctime(Tm*); extern char* p9ctime(long); extern double p9cputime(void); extern long p9times(long*); extern long p9tm2sec(Tm*); extern vlong p9nsec(void); #ifndef NOPLAN9DEFINES #define gmtime p9gmtime #define localtime p9localtime #define asctime p9asctime #define ctime p9ctime #define cputime p9cputime #define times p9times #define tm2sec p9tm2sec #define nsec p9nsec #endif /* * one-of-a-kind */ enum { PNPROC = 1, PNGROUP = 2 }; /* extern int abs(int); */ extern int p9atexit(void(*)(void)); extern void p9atexitdont(void(*)(void)); extern int atnotify(int(*)(void*, char*), int); /* * extern double atof(char*); */ extern int p9atoi(char*); extern long p9atol(char*); extern vlong p9atoll(char*); extern double fmtcharstod(int(*)(void*), void*); extern char* cleanname(char*); extern int p9decrypt(void*, void*, int); extern int p9encrypt(void*, void*, int); extern int netcrypt(void*, void*); extern int dec64(uchar*, int, char*, int); extern int enc64(char*, int, uchar*, int); extern int dec32(uchar*, int, char*, int); extern int enc32(char*, int, uchar*, int); extern int dec16(uchar*, int, char*, int); extern int enc16(char*, int, uchar*, int); extern int encodefmt(Fmt*); extern int dirmodefmt(Fmt*); extern int exitcode(char*); extern void exits(char*); extern double frexp(double, int*); extern ulong getcallerpc(void*); extern char* p9getenv(char*); extern int p9putenv(char*, char*); extern int getfields(char*, char**, int, int, char*); extern int gettokens(char *, char **, int, char *); extern char* getuser(void); extern char* p9getwd(char*, int); extern int iounit(int); /* extern long labs(long); */ /* extern double ldexp(double, int); */ extern void p9longjmp(p9jmp_buf, int); extern char* mktemp(char*); extern int opentemp(char*, int); /* extern double modf(double, double*); */ extern void p9notejmp(void*, p9jmp_buf, int); extern void perror(const char*); extern int postnote(int, int, char *); extern double p9pow10(int); /* extern int putenv(char*, char*); */ extern char* searchpath(char*); /* extern int p9setjmp(p9jmp_buf); */ #define p9setjmp(b) sigsetjmp((void*)(b), 1) /* * extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int); extern vlong strtoll(char*, char**, int); extern uvlong strtoull(char*, char**, int); */ extern void sysfatal(char*, ...); extern void p9syslog(int, char*, char*, ...); extern long p9time(long*); /* extern int tolower(int); */ /* extern int toupper(int); */ extern void needstack(int); extern char* readcons(char*, char*, int); extern void (*_pin)(void); extern void (*_unpin)(void); #ifndef NOPLAN9DEFINES #define atexit p9atexit #define atexitdont p9atexitdont #define atoi p9atoi #define atol p9atol #define atoll p9atoll #define encrypt p9encrypt #define decrypt p9decrypt #define getenv p9getenv #define getwd p9getwd #define longjmp p9longjmp #undef setjmp #define setjmp p9setjmp #define putenv p9putenv #define notejmp p9notejmp #define jmp_buf p9jmp_buf #define time p9time #define pow10 p9pow10 #define strtod fmtstrtod #define charstod fmtcharstod #define syslog p9syslog #endif /* * just enough information so that libc can be * properly locked without dragging in all of libthread */ typedef struct _Thread _Thread; typedef struct _Threadlist _Threadlist; struct _Threadlist { _Thread *head; _Thread *tail; }; extern _Thread *(*threadnow)(void); /* * synchronization */ typedef struct Lock Lock; struct Lock { #ifdef PLAN9PORT_USING_PTHREADS int init; pthread_mutex_t mutex; #endif int held; }; extern void lock(Lock*); extern void unlock(Lock*); extern int canlock(Lock*); extern int (*_lock)(Lock*, int, ulong); extern void (*_unlock)(Lock*, ulong); typedef struct QLock QLock; struct QLock { Lock l; _Thread *owner; _Threadlist waiting; }; extern void qlock(QLock*); extern void qunlock(QLock*); extern int canqlock(QLock*); extern int (*_qlock)(QLock*, int, ulong); /* do not use */ extern void (*_qunlock)(QLock*, ulong); typedef struct Rendez Rendez; struct Rendez { QLock *l; _Threadlist waiting; }; extern void rsleep(Rendez*); /* unlocks r->l, sleeps, locks r->l again */ extern int rwakeup(Rendez*); extern int rwakeupall(Rendez*); extern void (*_rsleep)(Rendez*, ulong); /* do not use */ extern int (*_rwakeup)(Rendez*, int, ulong); typedef struct RWLock RWLock; struct RWLock { Lock l; int readers; _Thread *writer; _Threadlist rwaiting; _Threadlist wwaiting; }; extern void rlock(RWLock*); extern void runlock(RWLock*); extern int canrlock(RWLock*); extern void wlock(RWLock*); extern void wunlock(RWLock*); extern int canwlock(RWLock*); extern int (*_rlock)(RWLock*, int, ulong); /* do not use */ extern int (*_wlock)(RWLock*, int, ulong); extern void (*_runlock)(RWLock*, ulong); extern void (*_wunlock)(RWLock*, ulong); /* * per-process private data */ extern void** privalloc(void); extern void privfree(void**); /* * network dialing */ #define NETPATHLEN 40 extern int p9accept(int, char*); extern int p9announce(char*, char*); extern int p9dial(char*, char*, char*, int*); extern int p9dialparse(char *ds, char **net, char **unixa, u32int *ip, int *port); extern void p9setnetmtpt(char*, int, char*); extern int p9listen(char*, char*); extern char* p9netmkaddr(char*, char*, char*); extern int p9reject(int, char*, char*); #ifndef NOPLAN9DEFINES #define accept p9accept #define announce p9announce #define dial p9dial #define setnetmtpt p9setnetmtpt #define listen p9listen #define netmkaddr p9netmkaddr #define reject p9reject #endif /* * encryption */ extern int pushssl(int, char*, char*, char*, int*); extern int pushtls(int, char*, char*, int, char*, char*); /* * network services */ typedef struct NetConnInfo NetConnInfo; struct NetConnInfo { char *dir; /* connection directory */ char *root; /* network root */ char *spec; /* binding spec */ char *lsys; /* local system */ char *lserv; /* local service */ char *rsys; /* remote system */ char *rserv; /* remote service */ char *laddr; char *raddr; }; extern NetConnInfo* getnetconninfo(char*, int); extern void freenetconninfo(NetConnInfo*); /* * system calls * */ #define STATMAX 65535U /* max length of machine-independent stat structure */ #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ #define ERRMAX 128 /* max length of error string */ #define MORDER 0x0003 /* mask for bits defining order of mounting */ #define MREPL 0x0000 /* mount replaces object */ #define MBEFORE 0x0001 /* mount goes before others in union directory */ #define MAFTER 0x0002 /* mount goes after others in union directory */ #define MCREATE 0x0004 /* permit creation in mounted directory */ #define MCACHE 0x0010 /* cache some data */ #define MMASK 0x0017 /* all bits on */ #define OREAD 0 /* open for read */ #define OWRITE 1 /* write */ #define ORDWR 2 /* read and write */ #define OEXEC 3 /* execute, == read but check execute permission */ #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ #define OCEXEC 32 /* or'ed in, close on exec */ #define ORCLOSE 64 /* or'ed in, remove on close */ #define ODIRECT 128 /* or'ed in, direct access */ #define ONONBLOCK 256 /* or'ed in, non-blocking call */ #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ #define OLOCK 0x2000 /* or'ed in, lock after opening */ #define OAPPEND 0x4000 /* or'ed in, append only */ #define AEXIST 0 /* accessible: exists */ #define AEXEC 1 /* execute access */ #define AWRITE 2 /* write access */ #define AREAD 4 /* read access */ /* Segattch */ #define SG_RONLY 0040 /* read only */ #define SG_CEXEC 0100 /* detach on exec */ #define NCONT 0 /* continue after note */ #define NDFLT 1 /* terminate after note */ #define NSAVE 2 /* clear note but hold state */ #define NRSTR 3 /* restore saved state */ /* bits in Qid.type */ #define QTDIR 0x80 /* type bit for directories */ #define QTAPPEND 0x40 /* type bit for append only files */ #define QTEXCL 0x20 /* type bit for exclusive use files */ #define QTMOUNT 0x10 /* type bit for mounted channel */ #define QTAUTH 0x08 /* type bit for authentication file */ #define QTTMP 0x04 /* type bit for non-backed-up file */ #define QTSYMLINK 0x02 /* type bit for symbolic link */ #define QTFILE 0x00 /* type bits for plain file */ /* bits in Dir.mode */ #define DMDIR 0x80000000 /* mode bit for directories */ #define DMAPPEND 0x40000000 /* mode bit for append only files */ #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ #define DMAUTH 0x08000000 /* mode bit for authentication file */ #define DMTMP 0x04000000 /* mode bit for non-backed-up file */ #define DMSYMLINK 0x02000000 /* mode bit for symbolic link (Unix, 9P2000.u) */ #define DMDEVICE 0x00800000 /* mode bit for device file (Unix, 9P2000.u) */ #define DMNAMEDPIPE 0x00200000 /* mode bit for named pipe (Unix, 9P2000.u) */ #define DMSOCKET 0x00100000 /* mode bit for socket (Unix, 9P2000.u) */ #define DMSETUID 0x00080000 /* mode bit for setuid (Unix, 9P2000.u) */ #define DMSETGID 0x00040000 /* mode bit for setgid (Unix, 9P2000.u) */ #define DMREAD 0x4 /* mode bit for read permission */ #define DMWRITE 0x2 /* mode bit for write permission */ #define DMEXEC 0x1 /* mode bit for execute permission */ #ifdef RFMEM /* FreeBSD, OpenBSD */ #undef RFFDG #undef RFNOTEG #undef RFPROC #undef RFMEM #undef RFNOWAIT #undef RFCFDG #undef RFNAMEG #undef RFENVG #undef RFCENVG #undef RFCFDG #undef RFCNAMEG #endif enum { RFNAMEG = (1<<0), RFENVG = (1<<1), RFFDG = (1<<2), RFNOTEG = (1<<3), RFPROC = (1<<4), RFMEM = (1<<5), RFNOWAIT = (1<<6), RFCNAMEG = (1<<10), RFCENVG = (1<<11), RFCFDG = (1<<12) /* RFREND = (1<<13), */ /* RFNOMNT = (1<<14) */ }; typedef struct Qid { uvlong path; ulong vers; uchar type; } Qid; typedef struct Dir { /* system-modified data */ ushort type; /* server type */ uint dev; /* server subtype */ /* file data */ Qid qid; /* unique id from server */ ulong mode; /* permissions */ ulong atime; /* last read time */ ulong mtime; /* last write time */ vlong length; /* file length */ char *name; /* last element of path */ char *uid; /* owner name */ char *gid; /* group name */ char *muid; /* last modifier name */ /* 9P2000.u extensions */ uint uidnum; /* numeric uid */ uint gidnum; /* numeric gid */ uint muidnum; /* numeric muid */ char *ext; /* extended info */ } Dir; /* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */ typedef struct Waitmsg { int pid; /* of loved one */ ulong time[3]; /* of loved one & descendants */ char *msg; } Waitmsg; typedef struct IOchunk { void *addr; ulong len; } IOchunk; extern void _exits(char*); extern void abort(void); /* extern int access(char*, int); */ extern long p9alarm(ulong); extern int await(char*, int); extern int awaitfor(int, char*, int); extern int awaitnohang(char*, int); /* extern int bind(char*, char*, int); give up */ /* extern int brk(void*); */ extern int p9chdir(char*); extern int close(int); extern int p9create(char*, int, ulong); extern int p9dup(int, int); extern int errstr(char*, uint); extern int p9exec(char*, char*[]); extern int p9execl(char*, ...); /* extern int p9fork(void); */ extern int p9rfork(int); /* not implemented extern int fauth(int, char*); extern int fstat(int, uchar*, int); extern int fwstat(int, uchar*, int); extern int fversion(int, int, char*, int); extern int mount(int, int, char*, int, char*); extern int unmount(char*, char*); */ extern int noted(int); extern int notify(void(*)(void*, char*)); extern int noteenable(char*); extern int notedisable(char*); extern int notifyon(char*); extern int notifyoff(char*); extern int p9open(char*, int); extern int fd2path(int, char*, int); extern int p9pipe(int*); /* * use defs from extern long pread(int, void*, long, vlong); extern long preadv(int, IOchunk*, int, vlong); extern long pwrite(int, void*, long, vlong); extern long pwritev(int, IOchunk*, int, vlong); extern long read(int, void*, long); */ extern long readn(int, void*, long); /* extern long readv(int, IOchunk*, int); */ extern int remove(const char*); /* extern void* sbrk(ulong); */ /* extern long oseek(int, long, int); */ extern vlong p9seek(int, vlong, int); /* give up extern long segattach(int, char*, void*, ulong); extern int segbrk(void*, void*); extern int segdetach(void*); extern int segflush(void*, ulong); extern int segfree(void*, ulong); */ extern int p9sleep(long); /* extern int stat(char*, uchar*, int); give up */ extern Waitmsg* p9wait(void); extern Waitmsg* p9waitfor(int); extern Waitmsg* waitnohang(void); extern int p9waitpid(void); /* extern long write(int, void*, long); extern long writev(int, IOchunk*, int); */ extern long p9write(int, void*, long); /* extern int wstat(char*, uchar*, int); give up */ extern ulong rendezvous(ulong, ulong); #ifndef NOPLAN9DEFINES #define alarm p9alarm #define dup p9dup #define exec p9exec #define execl p9execl #define seek p9seek #define sleep p9sleep #define wait p9wait #define waitpid p9waitpid /* #define fork p9fork */ #define rfork p9rfork /* #define access p9access */ #define create p9create #undef open #define open p9open #define pipe p9pipe #define waitfor p9waitfor #define write p9write #endif extern Dir* dirstat(char*); extern Dir* dirfstat(int); extern int dirwstat(char*, Dir*); extern int dirfwstat(int, Dir*); extern long dirread(int, Dir**); extern void nulldir(Dir*); extern long dirreadall(int, Dir**); /* extern int getpid(void); */ /* extern int getppid(void); */ extern void rerrstr(char*, uint); extern char* sysname(void); extern void werrstr(char*, ...); extern char* getns(void); extern char* get9root(void); extern char* unsharp(char*); extern int sendfd(int, int); extern int recvfd(int); extern int post9pservice(int, char*, char*); extern int chattyfuse; /* external names that we don't want to step on */ #ifndef NOPLAN9DEFINES #define main p9main #endif #ifdef VARARGCK #pragma varargck type "lld" vlong #pragma varargck type "llx" vlong #pragma varargck type "lld" uvlong #pragma varargck type "llx" uvlong #pragma varargck type "ld" long #pragma varargck type "lx" long #pragma varargck type "ld" ulong #pragma varargck type "lx" ulong #pragma varargck type "d" int #pragma varargck type "x" int #pragma varargck type "c" int #pragma varargck type "C" int #pragma varargck type "d" uint #pragma varargck type "x" uint #pragma varargck type "c" uint #pragma varargck type "C" uint #pragma varargck type "f" double #pragma varargck type "e" double #pragma varargck type "g" double #pragma varargck type "lf" long double #pragma varargck type "le" long double #pragma varargck type "lg" long double #pragma varargck type "s" char* #pragma varargck type "q" char* #pragma varargck type "S" Rune* #pragma varargck type "Q" Rune* #pragma varargck type "r" void #pragma varargck type "%" void #pragma varargck type "n" int* #pragma varargck type "p" void* #pragma varargck type "<" void* #pragma varargck type "[" void* #pragma varargck type "H" void* #pragma varargck type "lH" void* #pragma varargck flag ' ' #pragma varargck flag '#' #pragma varargck flag '+' #pragma varargck flag ',' #pragma varargck flag '-' #pragma varargck flag 'u' #pragma varargck argpos fmtprint 2 #pragma varargck argpos fprint 2 #pragma varargck argpos print 1 #pragma varargck argpos runeseprint 3 #pragma varargck argpos runesmprint 1 #pragma varargck argpos runesnprint 3 #pragma varargck argpos runesprint 2 #pragma varargck argpos seprint 3 #pragma varargck argpos smprint 1 #pragma varargck argpos snprint 3 #pragma varargck argpos sprint 2 #pragma varargck argpos sysfatal 1 #pragma varargck argpos p9syslog 3 #pragma varargck argpos werrstr 1 #endif /* compiler directives on plan 9 */ #define SET(x) ((x)=0) #define USED(x) if(x){}else{} #ifdef __GNUC__ # if __GNUC__ >= 3 # undef USED # define USED(x) ((void)(x)) # endif #endif /* command line */ extern char *argv0; extern void __fixargv0(void); #define ARGBEGIN for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\ argv[0] && argv[0][0]=='-' && argv[0][1];\ argc--, argv++) {\ char *_args, *_argt;\ Rune _argc;\ _args = &argv[0][1];\ if(_args[0]=='-' && _args[1]==0){\ argc--; argv++; break;\ }\ _argc = 0;\ while(*_args && (_args += chartorune(&_argc, _args)))\ switch(_argc) #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc); #define ARGF() (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) #define EARGF(x) (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) #define ARGC() _argc #if defined(__cplusplus) } #endif #endif /* _LIB9_H_ */ 9base-6/lib9/getcallerpc-PowerMacintosh.c0000644000175000017500000000011711402154555017775 0ustar anselmanselm#include ulong getcallerpc(void *x) { return (((ulong*)(x))[-4]); } 9base-6/lib9/getcallerpc-386.c0000644000175000017500000000011711402154555015353 0ustar anselmanselm#include ulong getcallerpc(void *x) { return (((ulong*)(x))[-1]); } 9base-6/lib9/errstr.c0000644000175000017500000000235511402154555014077 0ustar anselmanselm/* * We assume there's only one error buffer for the whole system. * If you use ffork, you need to provide a _syserrstr. Since most * people will use libthread (which provides a _syserrstr), this is * okay. */ #include #include #include #include enum { EPLAN9 = 0x19283745 }; char *(*_syserrstr)(void); static char xsyserr[ERRMAX]; static char* getsyserr(void) { char *s; s = nil; if(_syserrstr) s = (*_syserrstr)(); if(s == nil) s = xsyserr; return s; } int errstr(char *err, uint n) { char tmp[ERRMAX]; char *syserr; strecpy(tmp, tmp+ERRMAX, err); rerrstr(err, n); syserr = getsyserr(); strecpy(syserr, syserr+ERRMAX, tmp); errno = EPLAN9; return 0; } void rerrstr(char *err, uint n) { char *syserr; syserr = getsyserr(); if(errno == EINTR) strcpy(syserr, "interrupted"); else if(errno != EPLAN9) strcpy(syserr, strerror(errno)); strecpy(err, err+n, syserr); } /* replaces __errfmt in libfmt */ int __errfmt(Fmt *f) { if(errno == EPLAN9) return fmtstrcpy(f, getsyserr()); return fmtstrcpy(f, strerror(errno)); } void werrstr(char *fmt, ...) { va_list arg; char buf[ERRMAX]; va_start(arg, fmt); vseprint(buf, buf+ERRMAX, fmt, arg); va_end(arg); errstr(buf, ERRMAX); } 9base-6/lib9/malloctag.c0000644000175000017500000000021511402154555014512 0ustar anselmanselm#include void setmalloctag(void *v, ulong t) { USED(v); USED(t); } void setrealloctag(void *v, ulong t) { USED(v); USED(t); } 9base-6/lib9/readcons.c0000644000175000017500000000321611402154555014351 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include static int rawx(int fd, int echoing) { int was; static struct termios ttmode; if(echoing == -1) return -1; if(tcgetattr(fd, &ttmode) < 0) return -1; was = (ttmode.c_lflag&(ECHO|ICANON)); ttmode.c_lflag &= ~(ECHO|ICANON); ttmode.c_lflag |= echoing; if(tcsetattr(fd, TCSANOW, &ttmode) < 0) return -1; return was; } char* readcons(char *prompt, char *def, int secret) { int fd, n, raw; char line[10]; char *s, *t; int l; if((fd = open("/dev/tty", ORDWR)) < 0) return nil; raw = -1; if(secret){ raw = rawx(fd, 0); if(raw == -1) return nil; } if(def) fprint(fd, "%s[%s]: ", prompt, def); else fprint(fd, "%s: ", prompt); s = strdup(""); if(s == nil) return nil; for(;;){ n = read(fd, line, 1); if(n < 0){ Error: if(secret){ rawx(fd, raw); write(fd, "\n", 1); } close(fd); free(s); return nil; } if(n > 0 && line[0] == 0x7F) goto Error; if(n == 0 || line[0] == 0x04 || line[0] == '\n' || line[0] == '\r'){ if(secret){ rawx(fd, raw); write(fd, "\n", 1); } close(fd); if(*s == 0 && def){ free(s); s = strdup(def); } return s; } if(line[0] == '\b'){ if(strlen(s) > 0) s[strlen(s)-1] = 0; }else if(line[0] == 0x15){ /* ^U: line kill */ if(def != nil) fprint(fd, "\n%s[%s]: ", prompt, def); else fprint(fd, "\n%s: ", prompt); s[0] = 0; }else{ l = strlen(s); t = malloc(l+2); if(t) memmove(t, s, l); memset(s, 'X', l); free(s); if(t == nil) return nil; t[l] = line[0]; t[l+1] = 0; s = t; } } } 9base-6/lib9/needstack.c0000644000175000017500000000012211402154555014505 0ustar anselmanselm#include #include void needstack(int howmuch) { USED(howmuch); } 9base-6/lib9/notify.c0000644000175000017500000001115511402154555014064 0ustar anselmanselm/* * Signal handling for Plan 9 programs. * We stubbornly use the strings from Plan 9 instead * of the enumerated Unix constants. * There are some weird translations. In particular, * a "kill" note is the same as SIGTERM in Unix. * There is no equivalent note to Unix's SIGKILL, since * it's not a deliverable signal anyway. * * We do not handle SIGABRT or SIGSEGV, mainly because * the thread library queues its notes for later, and we want * to dump core with the state at time of delivery. * * We have to add some extra entry points to provide the * ability to tweak which signals are deliverable and which * are acted upon. Notifydisable and notifyenable play with * the process signal mask. Notifyignore enables the signal * but will not call notifyf when it comes in. This is occasionally * useful. */ #include #include #define NOPLAN9DEFINES #include extern char *_p9sigstr(int, char*); extern int _p9strsig(char*); typedef struct Sig Sig; struct Sig { int sig; /* signal number */ int flags; }; enum { Restart = 1<<0, Ignore = 1<<1, NoNotify = 1<<2, }; static Sig sigs[] = { SIGHUP, 0, SIGINT, 0, SIGQUIT, 0, SIGILL, 0, SIGTRAP, 0, /* SIGABRT, 0, */ #ifdef SIGEMT SIGEMT, 0, #endif SIGFPE, 0, SIGBUS, 0, /* SIGSEGV, 0, */ SIGCHLD, Restart|Ignore, SIGSYS, 0, SIGPIPE, Ignore, SIGALRM, 0, SIGTERM, 0, SIGTSTP, Restart|Ignore|NoNotify, /* SIGTTIN, Restart|Ignore, */ /* SIGTTOU, Restart|Ignore, */ SIGXCPU, 0, SIGXFSZ, 0, SIGVTALRM, 0, SIGUSR1, 0, SIGUSR2, 0, #ifdef SIGWINCH SIGWINCH, Restart|Ignore|NoNotify, #endif #ifdef SIGINFO SIGINFO, Restart|Ignore|NoNotify, #endif }; static Sig* findsig(int s) { int i; for(i=0; ib)){ case 0: if(notifyf) (*notifyf)(nil, _p9sigstr(sig, tmp)); /* fall through */ case 1: /* noted(NDFLT) */ if(0)print("DEFAULT %d\n", sig); s = findsig(sig); if(s && (s->flags&Ignore)) return; signal(sig, SIG_DFL); raise(sig); _exit(1); case 2: /* noted(NCONT) */ if(0)print("HANDLED %d\n", sig); return; } } static void signonotify(int sig) { USED(sig); } int noted(int v) { p9longjmp((*_notejmpbuf)()->b, v==NCONT ? 2 : 1); abort(); return 0; } int notify(void (*f)(void*, char*)) { static int init; notifyf = f; if(!init){ init = 1; noteinit(); } return 0; } /* * Nonsense about enabling and disabling signals. */ typedef void Sighandler(int); static Sighandler* handler(int s) { struct sigaction sa; sigaction(s, nil, &sa); return sa.sa_handler; } static int notesetenable(int sig, int enabled) { sigset_t mask, omask; if(sig == 0) return -1; sigemptyset(&mask); sigaddset(&mask, sig); sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, &omask); return !sigismember(&omask, sig); } int noteenable(char *msg) { return notesetenable(_p9strsig(msg), 1); } int notedisable(char *msg) { return notesetenable(_p9strsig(msg), 0); } static int notifyseton(int s, int on) { Sig *sig; struct sigaction sa, osa; sig = findsig(s); if(sig == nil) return -1; memset(&sa, 0, sizeof sa); sa.sa_handler = on ? signotify : signonotify; if(sig->flags&Restart) sa.sa_flags |= SA_RESTART; /* * We can't allow signals within signals because there's * only one jump buffer. */ sigfillset(&sa.sa_mask); /* * Install handler. */ sigaction(sig->sig, &sa, &osa); return osa.sa_handler == signotify; } int notifyon(char *msg) { return notifyseton(_p9strsig(msg), 1); } int notifyoff(char *msg) { return notifyseton(_p9strsig(msg), 0); } /* * Initialization follows sigs table. */ static void noteinit(void) { int i; Sig *sig; for(i=0; isig) != SIG_DFL) continue; notifyseton(sig->sig, !(sig->flags&NoNotify)); } } 9base-6/lib9/u64.c0000644000175000017500000000630311402154555013171 0ustar anselmanselm#include enum { INVAL= 255 }; static uchar t64d[256] = { INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 62,INVAL,INVAL,INVAL, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL, 0, 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,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL }; static char t64e[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int dec64(uchar *out, int lim, char *in, int n) { ulong b24; uchar *start = out; uchar *e = out + lim; int i, c; b24 = 0; i = 0; while(n-- > 0){ c = t64d[*(uchar*)in++]; if(c == INVAL) continue; switch(i){ case 0: b24 = c<<18; break; case 1: b24 |= c<<12; break; case 2: b24 |= c<<6; break; case 3: if(out + 3 > e) goto exhausted; b24 |= c; *out++ = b24>>16; *out++ = b24>>8; *out++ = b24; i = -1; break; } i++; } switch(i){ case 2: if(out + 1 > e) goto exhausted; *out++ = b24>>16; break; case 3: if(out + 2 > e) goto exhausted; *out++ = b24>>16; *out++ = b24>>8; break; } exhausted: return out - start; } int enc64(char *out, int lim, uchar *in, int n) { int i; ulong b24; char *start = out; char *e = out + lim; for(i = n/3; i > 0; i--){ b24 = (*in++)<<16; b24 |= (*in++)<<8; b24 |= *in++; if(out + 4 >= e) goto exhausted; *out++ = t64e[(b24>>18)]; *out++ = t64e[(b24>>12)&0x3f]; *out++ = t64e[(b24>>6)&0x3f]; *out++ = t64e[(b24)&0x3f]; } switch(n%3){ case 2: b24 = (*in++)<<16; b24 |= (*in)<<8; if(out + 4 >= e) goto exhausted; *out++ = t64e[(b24>>18)]; *out++ = t64e[(b24>>12)&0x3f]; *out++ = t64e[(b24>>6)&0x3f]; *out++ = '='; break; case 1: b24 = (*in)<<16; if(out + 4 >= e) goto exhausted; *out++ = t64e[(b24>>18)]; *out++ = t64e[(b24>>12)&0x3f]; *out++ = '='; *out++ = '='; break; } exhausted: *out = 0; return out - start; } 9base-6/lib9/announce.c0000644000175000017500000000524411402154555014364 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include #include #include #undef sun #define sun sockun int _p9netfd(char *dir) { int fd; if(strncmp(dir, "/dev/fd/", 8) != 0) return -1; fd = strtol(dir+8, &dir, 0); if(*dir != 0) return -1; return fd; } static void putfd(char *dir, int fd) { snprint(dir, NETPATHLEN, "/dev/fd/%d", fd); } #undef unix #define unix sockunix int p9announce(char *addr, char *dir) { int proto; char *buf, *unix; char *net; u32int host; int port, s; int n; socklen_t sn; struct sockaddr_in sa; struct sockaddr_un sun; buf = strdup(addr); if(buf == nil) return -1; if(p9dialparse(buf, &net, &unix, &host, &port) < 0){ free(buf); return -1; } if(strcmp(net, "tcp") == 0) proto = SOCK_STREAM; else if(strcmp(net, "udp") == 0) proto = SOCK_DGRAM; else if(strcmp(net, "unix") == 0) goto Unix; else{ werrstr("can only handle tcp, udp, and unix: not %s", net); free(buf); return -1; } free(buf); memset(&sa, 0, sizeof sa); memmove(&sa.sin_addr, &host, 4); sa.sin_family = AF_INET; sa.sin_port = htons(port); if((s = socket(AF_INET, proto, 0)) < 0) return -1; sn = sizeof n; if(port && getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) >= 0 && n == SOCK_STREAM){ n = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&n, sizeof n); } if(bind(s, (struct sockaddr*)&sa, sizeof sa) < 0){ close(s); return -1; } if(proto == SOCK_STREAM){ listen(s, 8); putfd(dir, s); } return s; Unix: memset(&sun, 0, sizeof sun); sun.sun_family = AF_UNIX; strcpy(sun.sun_path, unix); if((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) return -1; sn = sizeof sun; if(bind(s, (struct sockaddr*)&sun, sizeof sun) < 0){ if(errno == EADDRINUSE && connect(s, (struct sockaddr*)&sun, sizeof sun) < 0 && errno == ECONNREFUSED){ /* dead socket, so remove it */ remove(unix); close(s); if((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) return -1; if(bind(s, (struct sockaddr*)&sun, sizeof sun) >= 0) goto Success; } close(s); return -1; } Success: listen(s, 8); putfd(dir, s); return s; } int p9listen(char *dir, char *newdir) { int fd, one; if((fd = _p9netfd(dir)) < 0){ werrstr("bad 'directory' in listen: %s", dir); return -1; } if((fd = accept(fd, nil, nil)) < 0) return -1; one = 1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof one); putfd(newdir, fd); return fd; } int p9accept(int cfd, char *dir) { int fd; if((fd = _p9netfd(dir)) < 0){ werrstr("bad 'directory' in accept"); return -1; } /* need to dup because the listen fd will be closed */ return dup(fd); } 9base-6/lib9/bio.h0000644000175000017500000000411411402154555013327 0ustar anselmanselm#ifndef _BIO_H_ #define _BIO_H_ 1 #if defined(__cplusplus) extern "C" { #endif #ifdef AUTOLIB AUTOLIB(bio) #endif #include /* for O_RDONLY, O_WRONLY */ typedef struct Biobuf Biobuf; enum { Bsize = 8*1024, Bungetsize = 4, /* space for ungetc */ Bmagic = 0x314159, Beof = -1, Bbad = -2, Binactive = 0, /* states */ Bractive, Bwactive, Bracteof, Bend }; struct Biobuf { int icount; /* neg num of bytes at eob */ int ocount; /* num of bytes at bob */ int rdline; /* num of bytes after rdline */ int runesize; /* num of bytes of last getrune */ int state; /* r/w/inactive */ int fid; /* open file */ int flag; /* magic if malloc'ed */ long long offset; /* offset of buffer in file */ int bsize; /* size of buffer */ unsigned char* bbuf; /* pointer to beginning of buffer */ unsigned char* ebuf; /* pointer to end of buffer */ unsigned char* gbuf; /* pointer to good data in buf */ unsigned char b[Bungetsize+Bsize]; }; #define BGETC(bp)\ ((bp)->icount?(bp)->bbuf[(bp)->bsize+(bp)->icount++]:Bgetc((bp))) #define BPUTC(bp,c)\ ((bp)->ocount?(bp)->bbuf[(bp)->bsize+(bp)->ocount++]=(c),0:Bputc((bp),(c))) #define BOFFSET(bp)\ (((bp)->state==Bractive)?\ (bp)->offset + (bp)->icount:\ (((bp)->state==Bwactive)?\ (bp)->offset + ((bp)->bsize + (bp)->ocount):\ -1)) #define BLINELEN(bp)\ (bp)->rdline #define BFILDES(bp)\ (bp)->fid int Bbuffered(Biobuf*); Biobuf* Bfdopen(int, int); int Bfildes(Biobuf*); int Bflush(Biobuf*); int Bgetc(Biobuf*); int Bgetd(Biobuf*, double*); long Bgetrune(Biobuf*); int Binit(Biobuf*, int, int); int Binits(Biobuf*, int, int, unsigned char*, int); int Blinelen(Biobuf*); long long Boffset(Biobuf*); Biobuf* Bopen(char*, int); int Bprint(Biobuf*, char*, ...); int Bputc(Biobuf*, int); int Bputrune(Biobuf*, long); void* Brdline(Biobuf*, int); char* Brdstr(Biobuf*, int, int); long Bread(Biobuf*, void*, long); long long Bseek(Biobuf*, long long, int); int Bterm(Biobuf*); int Bungetc(Biobuf*); int Bungetrune(Biobuf*); long Bwrite(Biobuf*, void*, long); int Bvprint(Biobuf*, char*, va_list); #if defined(__cplusplus) } #endif #endif 9base-6/lib9/await.c0000644000175000017500000000557111402154555013666 0ustar anselmanselm#define NOPLAN9DEFINES #include #include #include #include #include #include #include #ifndef WCOREDUMP /* not on Mac OS X Tiger */ #define WCOREDUMP(status) 0 #endif static struct { int sig; char *str; } tab[] = { SIGHUP, "hangup", SIGINT, "interrupt", SIGQUIT, "quit", SIGILL, "sys: illegal instruction", SIGTRAP, "sys: breakpoint", SIGABRT, "sys: abort", #ifdef SIGEMT SIGEMT, "sys: emulate instruction executed", #endif SIGFPE, "sys: fp: trap", SIGKILL, "sys: kill", SIGBUS, "sys: bus error", SIGSEGV, "sys: segmentation violation", SIGALRM, "alarm", SIGTERM, "kill", SIGURG, "sys: urgent condition on socket", SIGSTOP, "sys: stop", SIGTSTP, "sys: tstp", SIGCONT, "sys: cont", SIGCHLD, "sys: child", SIGTTIN, "sys: ttin", SIGTTOU, "sys: ttou", #ifdef SIGIO /* not on Mac OS X Tiger */ SIGIO, "sys: i/o possible on fd", #endif SIGXCPU, "sys: cpu time limit exceeded", SIGXFSZ, "sys: file size limit exceeded", SIGVTALRM, "sys: virtual time alarm", SIGPROF, "sys: profiling timer alarm", #ifdef SIGWINCH /* not on Mac OS X Tiger */ SIGWINCH, "sys: window size change", #endif #ifdef SIGINFO SIGINFO, "sys: status request", #endif SIGUSR1, "sys: usr1", SIGUSR2, "sys: usr2", SIGPIPE, "sys: write on closed pipe", }; char* _p9sigstr(int sig, char *tmp) { int i; for(i=0; i #define NOPLAN9DEFINES #include #include #include #include #if defined(__NetBSD__) || (defined(__OpenBSD__) && OpenBSD <= 200611) #if !defined(sched_yield) # define sched_yield() \ do{ struct timespec ts; \ ts.tv_sec = 0; \ ts.tv_nsec = 0; \ nanosleep(&ts, 0); \ }while(0) #endif #endif int p9sleep(long milli) { struct timeval tv; if(milli == 0){ sched_yield(); return 0; } tv.tv_sec = milli/1000; tv.tv_usec = (milli%1000)*1000; return select(0, 0, 0, 0, &tv); } long p9alarm(ulong milli) { struct itimerval itv; struct itimerval oitv; itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 0; itv.it_value.tv_sec = milli/1000; itv.it_value.tv_usec = (milli%1000)*1000; if(setitimer(ITIMER_REAL, &itv, &oitv) < 0) return -1; return oitv.it_value.tv_sec*1000+oitv.it_value.tv_usec/1000; } 9base-6/lib9/dirfwstat.c0000644000175000017500000000176411402154555014570 0ustar anselmanselm#define NOPLAN9DEFINES #include #include #include #include #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__linux__) /* do nothing -- futimes exists and is fine */ #elif defined(__SunOS5_9__) /* use futimesat */ static int futimes(int fd, struct timeval *tv) { return futimesat(fd, 0, tv); } #else /* provide dummy */ /* rename just in case -- linux provides an unusable one */ #undef futimes #define futimes myfutimes static int futimes(int fd, struct timeval *tv) { werrstr("futimes not available"); return -1; } #endif int dirfwstat(int fd, Dir *dir) { int ret; struct timeval tv[2]; ret = 0; if(~dir->mode != 0){ if(fchmod(fd, dir->mode) < 0) ret = -1; } if(~dir->mtime != 0){ tv[0].tv_sec = dir->mtime; tv[0].tv_usec = 0; tv[1].tv_sec = dir->mtime; tv[1].tv_usec = 0; if(futimes(fd, tv) < 0) ret = -1; } if(~dir->length != 0){ if(ftruncate(fd, dir->length) < 0) ret = -1; } return ret; } 9base-6/lib9/u32.c0000644000175000017500000000453711402154555013173 0ustar anselmanselm#include int dec32(uchar *dest, int ndest, char *src, int nsrc) { char *s, *tab; uchar *start; int i, u[8]; if(ndest+1 < (5*nsrc+7)/8) return -1; start = dest; tab = "23456789abcdefghijkmnpqrstuvwxyz"; while(nsrc>=8){ for(i=0; i<8; i++){ s = strchr(tab,(int)src[i]); u[i] = s ? s-tab : 0; } *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2)); *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4)); *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3)); *dest++ = ((0x7 & u[6])<<5) | u[7]; src += 8; nsrc -= 8; } if(nsrc > 0){ if(nsrc == 1 || nsrc == 3 || nsrc == 6) return -1; for(i=0; i>2)); if(nsrc == 2) goto out; *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4)); if(nsrc == 4) goto out; *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); if(nsrc == 5) goto out; *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3)); } out: return dest-start; } int enc32(char *dest, int ndest, uchar *src, int nsrc) { char *tab, *start; int j; if(ndest <= (8*nsrc+4)/5 ) return -1; start = dest; tab = "23456789abcdefghijkmnpqrstuvwxyz"; while(nsrc>=5){ j = (0x1f & (src[0]>>3)); *dest++ = tab[j]; j = (0x1c & (src[0]<<2)) | (0x03 & (src[1]>>6)); *dest++ = tab[j]; j = (0x1f & (src[1]>>1)); *dest++ = tab[j]; j = (0x10 & (src[1]<<4)) | (0x0f & (src[2]>>4)); *dest++ = tab[j]; j = (0x1e & (src[2]<<1)) | (0x01 & (src[3]>>7)); *dest++ = tab[j]; j = (0x1f & (src[3]>>2)); *dest++ = tab[j]; j = (0x18 & (src[3]<<3)) | (0x07 & (src[4]>>5)); *dest++ = tab[j]; j = (0x1f & (src[4])); *dest++ = tab[j]; src += 5; nsrc -= 5; } if(nsrc){ j = (0x1f & (src[0]>>3)); *dest++ = tab[j]; j = (0x1c & (src[0]<<2)); if(nsrc == 1) goto out; j |= (0x03 & (src[1]>>6)); *dest++ = tab[j]; j = (0x1f & (src[1]>>1)); if(nsrc == 2) goto out; *dest++ = tab[j]; j = (0x10 & (src[1]<<4)); if(nsrc == 3) goto out; j |= (0x0f & (src[2]>>4)); *dest++ = tab[j]; j = (0x1e & (src[2]<<1)); if(nsrc == 4) goto out; j |= (0x01 & (src[3]>>7)); *dest++ = tab[j]; j = (0x1f & (src[3]>>2)); *dest++ = tab[j]; j = (0x18 & (src[3]<<3)); out: *dest++ = tab[j]; } *dest = 0; return dest-start; } 9base-6/lib9/fcall.h0000644000175000017500000000567611402154555013655 0ustar anselmanselm#ifndef _FCALL_H_ #define _FCALL_H_ 1 #ifdef __cplusplus extern "C" { #endif /* #pragma src "/sys/src/libc/9sys" #pragma lib "libc.a" */ #define VERSION9P "9P2000" #define MAXWELEM 16 typedef struct Fcall { uchar type; u32int fid; ushort tag; u32int msize; /* Tversion, Rversion */ char *version; /* Tversion, Rversion */ ushort oldtag; /* Tflush */ char *ename; /* Rerror */ Qid qid; /* Rattach, Ropen, Rcreate */ u32int iounit; /* Ropen, Rcreate */ Qid aqid; /* Rauth */ u32int afid; /* Tauth, Tattach */ char *uname; /* Tauth, Tattach */ char *aname; /* Tauth, Tattach */ u32int perm; /* Tcreate */ char *name; /* Tcreate */ uchar mode; /* Tcreate, Topen */ u32int newfid; /* Twalk */ ushort nwname; /* Twalk */ char *wname[MAXWELEM]; /* Twalk */ ushort nwqid; /* Rwalk */ Qid wqid[MAXWELEM]; /* Rwalk */ vlong offset; /* Tread, Twrite */ u32int count; /* Tread, Twrite, Rread */ char *data; /* Twrite, Rread */ ushort nstat; /* Twstat, Rstat */ uchar *stat; /* Twstat, Rstat */ int unixfd; /* Ropenfd */ } Fcall; #define GBIT8(p) ((p)[0]) #define GBIT16(p) ((p)[0]|((p)[1]<<8)) #define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) #define GBIT64(p) ((vlong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) #define PBIT8(p,v) (p)[0]=(v) #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 #define BIT8SZ 1 #define BIT16SZ 2 #define BIT32SZ 4 #define BIT64SZ 8 #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) /* STATFIXLEN includes leading 16-bit count */ /* The count, however, excludes itself; total size is BIT16SZ+count */ #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ #define NOTAG (ushort)~0U /* Dummy tag */ #define NOFID (u32int)~0U /* Dummy fid */ #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ enum { Tversion = 100, Rversion, Tauth = 102, Rauth, Tattach = 104, Rattach, Terror = 106, /* illegal */ Rerror, Tflush = 108, Rflush, Twalk = 110, Rwalk, Topen = 112, Ropen, Tcreate = 114, Rcreate, Tread = 116, Rread, Twrite = 118, Rwrite, Tclunk = 120, Rclunk, Tremove = 122, Rremove, Tstat = 124, Rstat, Twstat = 126, Rwstat, Tmax, Topenfd = 98, Ropenfd, }; uint convM2S(uchar*, uint, Fcall*); uint convS2M(Fcall*, uchar*, uint); uint sizeS2M(Fcall*); int statcheck(uchar *abuf, uint nbuf); uint convM2D(uchar*, uint, Dir*, char*); uint convD2M(Dir*, uchar*, uint); uint sizeD2M(Dir*); int fcallfmt(Fmt*); int dirfmt(Fmt*); int dirmodefmt(Fmt*); int read9pmsg(int, void*, uint); /* #pragma varargck type "F" Fcall* #pragma varargck type "M" ulong #pragma varargck type "D" Dir* */ #ifdef __cplusplus } #endif #endif 9base-6/lib9/getcallerpc-arm.c0000644000175000017500000000011411402154555015607 0ustar anselmanselm#include ulong getcallerpc(void *x) { return ((ulong*)x)[-2]; } 9base-6/lib9/fcallfmt.c0000644000175000017500000001417111402154555014345 0ustar anselmanselm#include #include #include static uint dumpsome(char*, char*, char*, long); static void fdirconv(char*, char*, Dir*); static char *qidtype(char*, uchar); #define QIDFMT "(%.16llux %lud %s)" int fcallfmt(Fmt *fmt) { Fcall *f; int fid, type, tag, i; char buf[512], tmp[200]; char *p, *e; Dir *d; Qid *q; e = buf+sizeof(buf); f = va_arg(fmt->args, Fcall*); type = f->type; fid = f->fid; tag = f->tag; switch(type){ case Tversion: /* 100 */ seprint(buf, e, "Tversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); break; case Rversion: seprint(buf, e, "Rversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); break; case Tauth: /* 102 */ seprint(buf, e, "Tauth tag %ud afid %d uname %s aname %s", tag, f->afid, f->uname, f->aname); break; case Rauth: seprint(buf, e, "Rauth tag %ud qid " QIDFMT, tag, f->aqid.path, f->aqid.vers, qidtype(tmp, f->aqid.type)); break; case Tattach: /* 104 */ seprint(buf, e, "Tattach tag %ud fid %d afid %d uname %s aname %s", tag, fid, f->afid, f->uname, f->aname); break; case Rattach: seprint(buf, e, "Rattach tag %ud qid " QIDFMT, tag, f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type)); break; case Rerror: /* 107; 106 (Terror) illegal */ seprint(buf, e, "Rerror tag %ud ename %s", tag, f->ename); break; case Tflush: /* 108 */ seprint(buf, e, "Tflush tag %ud oldtag %ud", tag, f->oldtag); break; case Rflush: seprint(buf, e, "Rflush tag %ud", tag); break; case Twalk: /* 110 */ p = seprint(buf, e, "Twalk tag %ud fid %d newfid %d nwname %d ", tag, fid, f->newfid, f->nwname); if(f->nwname <= MAXWELEM) for(i=0; inwname; i++) p = seprint(p, e, "%d:%s ", i, f->wname[i]); break; case Rwalk: p = seprint(buf, e, "Rwalk tag %ud nwqid %ud ", tag, f->nwqid); if(f->nwqid <= MAXWELEM) for(i=0; inwqid; i++){ q = &f->wqid[i]; p = seprint(p, e, "%d:" QIDFMT " ", i, q->path, q->vers, qidtype(tmp, q->type)); } break; case Topen: /* 112 */ seprint(buf, e, "Topen tag %ud fid %ud mode %d", tag, fid, f->mode); break; case Ropen: seprint(buf, e, "Ropen tag %ud qid " QIDFMT " iounit %ud", tag, f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); break; case Topenfd: /* 98 */ seprint(buf, e, "Topenfd tag %ud fid %ud mode %d", tag, fid, f->mode); break; case Ropenfd: seprint(buf, e, "Ropenfd tag %ud qid " QIDFMT " iounit %ud unixfd %d", tag, f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit, f->unixfd); break; case Tcreate: /* 114 */ seprint(buf, e, "Tcreate tag %ud fid %ud name %s perm %M mode %d", tag, fid, f->name, (ulong)f->perm, f->mode); break; case Rcreate: seprint(buf, e, "Rcreate tag %ud qid " QIDFMT " iounit %ud ", tag, f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); break; case Tread: /* 116 */ seprint(buf, e, "Tread tag %ud fid %d offset %lld count %ud", tag, fid, f->offset, f->count); break; case Rread: p = seprint(buf, e, "Rread tag %ud count %ud ", tag, f->count); dumpsome(p, e, f->data, f->count); break; case Twrite: /* 118 */ p = seprint(buf, e, "Twrite tag %ud fid %d offset %lld count %ud ", tag, fid, f->offset, f->count); dumpsome(p, e, f->data, f->count); break; case Rwrite: seprint(buf, e, "Rwrite tag %ud count %ud", tag, f->count); break; case Tclunk: /* 120 */ seprint(buf, e, "Tclunk tag %ud fid %ud", tag, fid); break; case Rclunk: seprint(buf, e, "Rclunk tag %ud", tag); break; case Tremove: /* 122 */ seprint(buf, e, "Tremove tag %ud fid %ud", tag, fid); break; case Rremove: seprint(buf, e, "Rremove tag %ud", tag); break; case Tstat: /* 124 */ seprint(buf, e, "Tstat tag %ud fid %ud", tag, fid); break; case Rstat: p = seprint(buf, e, "Rstat tag %ud ", tag); if(f->stat == nil || f->nstat > sizeof tmp) seprint(p, e, " stat(%d bytes)", f->nstat); else{ d = (Dir*)tmp; convM2D(f->stat, f->nstat, d, (char*)(d+1)); seprint(p, e, " stat "); fdirconv(p+6, e, d); } break; case Twstat: /* 126 */ p = seprint(buf, e, "Twstat tag %ud fid %ud", tag, fid); if(f->stat == nil || f->nstat > sizeof tmp) seprint(p, e, " stat(%d bytes)", f->nstat); else{ d = (Dir*)tmp; convM2D(f->stat, f->nstat, d, (char*)(d+1)); seprint(p, e, " stat "); fdirconv(p+6, e, d); } break; case Rwstat: seprint(buf, e, "Rwstat tag %ud", tag); break; default: seprint(buf, e, "unknown type %d", type); } return fmtstrcpy(fmt, buf); } static char* qidtype(char *s, uchar t) { char *p; p = s; if(t & QTDIR) *p++ = 'd'; if(t & QTAPPEND) *p++ = 'a'; if(t & QTEXCL) *p++ = 'l'; if(t & QTAUTH) *p++ = 'A'; *p = '\0'; return s; } int dirfmt(Fmt *fmt) { char buf[160]; fdirconv(buf, buf+sizeof buf, va_arg(fmt->args, Dir*)); return fmtstrcpy(fmt, buf); } static void fdirconv(char *buf, char *e, Dir *d) { char tmp[16]; seprint(buf, e, "'%s' '%s' '%s' '%s' " "q " QIDFMT " m %#luo " "at %ld mt %ld l %lld " "t %d d %d", d->name, d->uid, d->gid, d->muid, d->qid.path, d->qid.vers, qidtype(tmp, d->qid.type), d->mode, d->atime, d->mtime, d->length, d->type, d->dev); } /* * dump out count (or DUMPL, if count is bigger) bytes from * buf to ans, as a string if they are all printable, * else as a series of hex bytes */ #define DUMPL 64 static uint dumpsome(char *ans, char *e, char *buf, long count) { int i, printable; char *p; if(buf == nil){ seprint(ans, e, ""); return strlen(ans); } printable = 1; if(count > DUMPL) count = DUMPL; for(i=0; i127) printable = 0; p = ans; *p++ = '\''; if(printable){ if(2*count > e-p-2) count = (e-p-2)/2; for(i=0; i e-p-2) count = (e-p-2)/2; for(i=0; i0 && i%4==0) *p++ = ' '; sprint(p, "%2.2ux", (uchar)buf[i]); p += 2; } } *p++ = '\''; *p = 0; assert(p < e); return p - ans; } 9base-6/lib9/testfltfmt.c0000644000175000017500000000733411402154555014754 0ustar anselmanselm#include #include #include /* * try all combination of flags and float conversions * with some different widths & precisions */ #define Njust 2 #define Nplus 3 #define Nalt 2 #define Nzero 2 #define Nspec 5 #define Nwidth 5 #define Nprec 5 static double fmtvals[] = { 3.1415925535897932e15, 3.1415925535897932e14, 3.1415925535897932e13, 3.1415925535897932e12, 3.1415925535897932e11, 3.1415925535897932e10, 3.1415925535897932e9, 3.1415925535897932e8, 3.1415925535897932e7, 3.1415925535897932e6, 3.1415925535897932e5, 3.1415925535897932e4, 3.1415925535897932e3, 3.1415925535897932e2, 3.1415925535897932e1, 3.1415925535897932e0, 3.1415925535897932e-1, 3.1415925535897932e-2, 3.1415925535897932e-3, 3.1415925535897932e-4, 3.1415925535897932e-5, 3.1415925535897932e-6, 3.1415925535897932e-7, 3.1415925535897932e-8, 3.1415925535897932e-9, 3.1415925535897932e-10, 3.1415925535897932e-11, 3.1415925535897932e-12, 3.1415925535897932e-13, 3.1415925535897932e-14, 3.1415925535897932e-15, }; /* * are the numbers close? * used to compare long numbers where the last few digits are garbage * due to precision problems */ static int numclose(char *num1, char *num2) { int ndig; double d1, d2; enum { MAXDIG = 15 }; d1 = fmtstrtod(num1, 0); d2 = fmtstrtod(num2, 0); if(d1 != d2) return 0; ndig = 0; while (*num1) { if (*num1 >= '0' && *num1 <= '9') { ndig++; if (ndig > MAXDIG) { if (!(*num2 >= '0' && *num2 <= '9')) { return 0; } } else if (*num1 != *num2) { return 0; } } else if (*num1 != *num2) { return 0; } else if (*num1 == 'e' || *num1 == 'E') { ndig = 0; } num1++; num2++; } if (*num1 || !num2) return 0; return 1; } static void doit(int just, int plus, int alt, int zero, int width, int prec, int spec) { char format[256]; char *p; const char *s; int i; p = format; *p++ = '%'; if (just > 0) *p++ = "-"[just - 1]; if (plus > 0) *p++ = "+ "[plus - 1]; if (alt > 0) *p++ = "#"[alt - 1]; if (zero > 0) *p++ = "0"[zero - 1]; s = ""; switch (width) { case 1: s = "1"; break; case 2: s = "5"; break; case 3: s = "10"; break; case 4: s = "15"; break; } strcpy(p, s); s = ""; switch (prec) { case 1: s = ".0"; break; case 2: s = ".2"; break; case 3: s = ".5"; break; case 4: s = ".15"; break; } strcat(p, s); p = strchr(p, '\0'); *p++ = "efgEG"[spec]; *p = '\0'; for (i = 0; i < sizeof(fmtvals) / sizeof(fmtvals[0]); i++) { char ref[1024], buf[1024]; Rune rbuf[1024]; double d1, d2; sprintf(ref, format, fmtvals[i]); snprint(buf, sizeof(buf), format, fmtvals[i]); if (strcmp(ref, buf) != 0 && !numclose(ref, buf)) { d1 = fmtstrtod(ref, 0); d2 = fmtstrtod(buf, 0); fprintf(stderr, "%s: ref='%s'%s fmt='%s'%s\n", format, ref, d1==fmtvals[i] ? "" : " (ref is inexact!)", buf, d2==fmtvals[i] ? "" : " (fmt is inexact!)"); // exits("oops"); } /* Check again with output to rune string */ runesnprint(rbuf, 1024, format, fmtvals[i]); snprint(buf, sizeof(buf), "%S", rbuf); if (strcmp(ref, buf) != 0 && !numclose(ref, buf)) { d1 = fmtstrtod(ref, 0); d2 = fmtstrtod(buf, 0); fprintf(stderr, "%s: ref='%s'%s fmt='%s'%s\n", format, ref, d1==fmtvals[i] ? "" : " (ref is inexact!)", buf, d2==fmtvals[i] ? "" : " (fmt is inexact!)"); // exits("oops"); } } } void main(int argc, char **argv) { int just, plus, alt, zero, width, prec, spec; for (just = 0; just < Njust; just++) for (plus = 0; plus < Nplus; plus++) for (alt = 0; alt < Nalt; alt++) for (zero = 0; zero < Nzero; zero++) for (width = 0; width < Nwidth; width++) for (prec = 0; prec < Nprec; prec++) for (spec = 0; spec < Nspec; spec++) doit(just, plus, alt, zero, width, prec, spec); exits(0); } 9base-6/lib9/atol.c0000644000175000017500000000012311402154555013504 0ustar anselmanselm#include #include long atol(char *s) { return strtol(s, 0, 0); } 9base-6/lib9/test.c0000644000175000017500000000014011402154555013523 0ustar anselmanselm#include int main(int argc, char **argv) { werrstr("hello world"); print("%r\n"); } 9base-6/lib9/convM2S.c0000644000175000017500000001236611402154555014050 0ustar anselmanselm#include #include #include static uchar* gstring(uchar *p, uchar *ep, char **s) { uint n; if(p+BIT16SZ > ep) return nil; n = GBIT16(p); p += BIT16SZ - 1; if(p+n+1 > ep) return nil; /* move it down, on top of count, to make room for '\0' */ memmove(p, p + 1, n); p[n] = '\0'; *s = (char*)p; p += n+1; return p; } static uchar* gqid(uchar *p, uchar *ep, Qid *q) { if(p+QIDSZ > ep) return nil; q->type = GBIT8(p); p += BIT8SZ; q->vers = GBIT32(p); p += BIT32SZ; q->path = GBIT64(p); p += BIT64SZ; return p; } /* * no syntactic checks. * three causes for error: * 1. message size field is incorrect * 2. input buffer too short for its own data (counts too long, etc.) * 3. too many names or qids * gqid() and gstring() return nil if they would reach beyond buffer. * main switch statement checks range and also can fall through * to test at end of routine. */ uint convM2Su(uchar *ap, uint nap, Fcall *f, int dotu) { uchar *p, *ep; uint i, size; p = ap; ep = p + nap; if(p+BIT32SZ+BIT8SZ+BIT16SZ > ep) return 0; size = GBIT32(p); p += BIT32SZ; if(size < BIT32SZ+BIT8SZ+BIT16SZ) return 0; f->type = GBIT8(p); p += BIT8SZ; f->tag = GBIT16(p); p += BIT16SZ; switch(f->type) { default: return 0; case Tversion: if(p+BIT32SZ > ep) return 0; f->msize = GBIT32(p); p += BIT32SZ; p = gstring(p, ep, &f->version); break; case Tflush: if(p+BIT16SZ > ep) return 0; f->oldtag = GBIT16(p); p += BIT16SZ; break; case Tauth: if(p+BIT32SZ > ep) return 0; f->afid = GBIT32(p); p += BIT32SZ; p = gstring(p, ep, &f->uname); if(p == nil) break; p = gstring(p, ep, &f->aname); if(p == nil) break; break; case Tattach: if(p+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; if(p+BIT32SZ > ep) return 0; f->afid = GBIT32(p); p += BIT32SZ; p = gstring(p, ep, &f->uname); if(p == nil) break; p = gstring(p, ep, &f->aname); if(p == nil) break; break; case Twalk: if(p+BIT32SZ+BIT32SZ+BIT16SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; f->newfid = GBIT32(p); p += BIT32SZ; f->nwname = GBIT16(p); p += BIT16SZ; if(f->nwname > MAXWELEM) return 0; for(i=0; inwname; i++){ p = gstring(p, ep, &f->wname[i]); if(p == nil) break; } break; case Topen: case Topenfd: if(p+BIT32SZ+BIT8SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; f->mode = GBIT8(p); p += BIT8SZ; break; case Tcreate: if(p+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; p = gstring(p, ep, &f->name); if(p == nil) break; if(p+BIT32SZ+BIT8SZ > ep) return 0; f->perm = GBIT32(p); p += BIT32SZ; f->mode = GBIT8(p); p += BIT8SZ; if(dotu) p = gstring(p, ep, &f->extension); break; case Tread: if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; f->offset = GBIT64(p); p += BIT64SZ; f->count = GBIT32(p); p += BIT32SZ; break; case Twrite: if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; f->offset = GBIT64(p); p += BIT64SZ; f->count = GBIT32(p); p += BIT32SZ; if(p+f->count > ep) return 0; f->data = (char*)p; p += f->count; break; case Tclunk: case Tremove: if(p+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; break; case Tstat: if(p+BIT32SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; break; case Twstat: if(p+BIT32SZ+BIT16SZ > ep) return 0; f->fid = GBIT32(p); p += BIT32SZ; f->nstat = GBIT16(p); p += BIT16SZ; if(p+f->nstat > ep) return 0; f->stat = p; p += f->nstat; break; /* */ case Rversion: if(p+BIT32SZ > ep) return 0; f->msize = GBIT32(p); p += BIT32SZ; p = gstring(p, ep, &f->version); break; case Rerror: p = gstring(p, ep, &f->ename); f->errornum = 0; if(dotu){ if(p+BIT16SZ > ep) return 0; f->errornum = GBIT16(p); p += BIT16SZ; } break; case Rflush: break; case Rauth: p = gqid(p, ep, &f->aqid); if(p == nil) break; break; case Rattach: p = gqid(p, ep, &f->qid); if(p == nil) break; break; case Rwalk: if(p+BIT16SZ > ep) return 0; f->nwqid = GBIT16(p); p += BIT16SZ; if(f->nwqid > MAXWELEM) return 0; for(i=0; inwqid; i++){ p = gqid(p, ep, &f->wqid[i]); if(p == nil) break; } break; case Ropen: case Ropenfd: case Rcreate: p = gqid(p, ep, &f->qid); if(p == nil) break; if(p+BIT32SZ > ep) return 0; f->iounit = GBIT32(p); p += BIT32SZ; if(f->type == Ropenfd){ if(p+BIT32SZ > ep) return 0; f->unixfd = GBIT32(p); p += BIT32SZ; } break; case Rread: if(p+BIT32SZ > ep) return 0; f->count = GBIT32(p); p += BIT32SZ; if(p+f->count > ep) return 0; f->data = (char*)p; p += f->count; break; case Rwrite: if(p+BIT32SZ > ep) return 0; f->count = GBIT32(p); p += BIT32SZ; break; case Rclunk: case Rremove: break; case Rstat: if(p+BIT16SZ > ep) return 0; f->nstat = GBIT16(p); p += BIT16SZ; if(p+f->nstat > ep) return 0; f->stat = p; p += f->nstat; break; case Rwstat: break; } if(p==nil || p>ep) return 0; if(ap+size == p) return size; return 0; } uint convM2S(uchar *ap, uint nap, Fcall *f) { return convM2Su(ap, nap, f, 0); } 9base-6/lib9/execl.c0000644000175000017500000000061111402154555013647 0ustar anselmanselm#include #include int execl(char *prog, ...) { int i; va_list arg; char **argv; va_start(arg, prog); for(i=0; va_arg(arg, char*) != nil; i++) ; va_end(arg); argv = malloc((i+1)*sizeof(char*)); if(argv == nil) return -1; va_start(arg, prog); for(i=0; (argv[i] = va_arg(arg, char*)) != nil; i++) ; va_end(arg); exec(prog, argv); free(argv); return -1; } 9base-6/lib9/portdate0000644000175000017500000000215211402154555014152 0ustar anselmanselmannounce.c 2004/1225 atexit.c 2004/1225 atnotify.c 2004/1225 atol.c 2004/1225 atoll.c 2004/1225 cistrcmp.c 2004/1225 cistrncmp.c 2004/1225 cistrstr.c 2004/1225 cleanname.c 2004/1225 convD2M.c 2004/1225 convM2D.c 2004/1225 convM2S.c 2004/1225 convS2M.c 2004/1225 ctime.c 2004/1225 dial.c 2004/1225 dirfstat.c 2004/1225 dirfwstat.c 2004/1225 dirmodefmt.c 2004/1225 dirread.c 2004/1225 dirstat.c 2004/1225 dirwstat.c 2004/1225 encodefmt.c 2004/1225 fcallfmt.c 2004/1225 fork.c 2004/1225 getenv.c 2004/1225 getfields.c 2004/1225 getuser.c 2004/1225 getwd.c 2004/1225 lnrand.c 2004/1225 lock.c 2004/1225 lrand.c 2004/1225 malloc.c 2004/1225 nan.c 2004/1225 needsrcquote.c 2004/1225 netmkaddr.c 2004/1225 nrand.c 2004/1225 nulldir.c 2004/1225 postnote.c 2004/1225 qlock.c 2004/1225 quote.c 2004/1225 rand.c 2004/1225 read9pmsg.c 2004/1225 readn.c 2004/1225 strdup.c 2004/1225 strecpy.c 2004/1225 sysfatal.c 2004/1225 sysname.c 2004/1225 time.c 2004/1225 tokenize.c 2004/1225 truerand.c 2004/1225 u16.c 2004/1225 u32.c 2004/1225 u64.c 2004/1225 wait.c 2004/1225 waitpid.c 2004/1225 9base-6/lib9/getfields.c0000644000175000017500000000076511402154555014527 0ustar anselmanselm#include int getfields(char *str, char **args, int max, int mflag, char *set) { Rune r; int nr, intok, narg; if(max <= 0) return 0; narg = 0; args[narg] = str; if(!mflag) narg++; intok = 0; for(;; str += nr) { nr = chartorune(&r, str); if(r == 0) break; if(utfrune(set, r)) { if(narg >= max) break; *str = 0; intok = 0; args[narg] = str + nr; if(!mflag) narg++; } else { if(!intok && mflag) narg++; intok = 1; } } return narg; } 9base-6/lib9/netmkaddr.c0000644000175000017500000000225211402154555014523 0ustar anselmanselm#include #include #include /* * make an address, add the defaults */ char * netmkaddr(char *linear, char *defnet, char *defsrv) { static char addr[256]; char *cp; /* * dump network name */ cp = strchr(linear, '!'); if(cp == 0){ if(defnet == 0) defnet = "net"; /* allow unix sockets to omit unix! prefix */ if(access(linear, 0) >= 0){ snprint(addr, sizeof(addr), "unix!%s", linear); return addr; } /* allow host:service in deference to Unix convention */ if((cp = strchr(linear, ':')) != nil){ snprint(addr, sizeof(addr), "%s!%.*s!%s", defnet, utfnlen(linear, cp-linear), linear, cp+1); return addr; } if(defsrv) snprint(addr, sizeof(addr), "%s!%s!%s", defnet, linear, defsrv); else snprint(addr, sizeof(addr), "%s!%s", defnet, linear); return addr; } /* * if there is already a service, use it */ cp = strchr(cp+1, '!'); if(cp) return linear; /* * if the network is unix, no service */ if(strncmp(linear, "unix!", 5) == 0) return linear; /* * add default service */ if(defsrv == 0) return linear; snprint(addr, sizeof(addr), "%s!%s", linear, defsrv); return addr; } 9base-6/lib9/waitpid.c0000644000175000017500000000044611402154555014216 0ustar anselmanselm#include #include int waitpid(void) { int n; char buf[512], *fld[5]; n = await(buf, sizeof buf-1); if(n <= 0) return -1; buf[n] = '\0'; if(tokenize(buf, fld, nelem(fld)) != nelem(fld)){ werrstr("couldn't parse wait message"); return -1; } return atoi(fld[0]); } 9base-6/lib9/_p9dir.c0000644000175000017500000001061011402154555013735 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include #include #include #if defined(__APPLE__) #define _HAVESTGEN #include static vlong disksize(int fd, struct stat *st) { u64int bc; u32int bs; bs = 0; bc = 0; ioctl(fd, DKIOCGETBLOCKSIZE, &bs); ioctl(fd, DKIOCGETBLOCKCOUNT, &bc); if(bs >0 && bc > 0) return bc*bs; return 0; } #elif defined(__FreeBSD__) #define _HAVESTGEN #include #include #include static vlong disksize(int fd, struct stat *st) { off_t mediasize; if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 0) return mediasize; return 0; } #elif defined(__OpenBSD__) #define _HAVESTGEN #include #include static vlong disksize(int fd, struct stat *st) { struct disklabel lab; int n; if(!S_ISCHR(st->st_mode)) return 0; if(ioctl(fd, DIOCGDINFO, &lab) < 0) return 0; n = minor(st->st_rdev)&7; if(n >= lab.d_npartitions) return 0; return (vlong)lab.d_partitions[n].p_size * lab.d_secsize; } #elif defined(__linux__) #include #include #include #undef major #define major(dev) ((int)(((dev) >> 8) & 0xff)) static vlong disksize(int fd, struct stat *st) { u64int u64; long l; struct hd_geometry geo; memset(&geo, 0, sizeof geo); l = 0; u64 = 0; #ifdef BLKGETSIZE64 if(ioctl(fd, BLKGETSIZE64, &u64) >= 0) return u64; #endif if(ioctl(fd, BLKGETSIZE, &l) >= 0) return l*512; if(ioctl(fd, HDIO_GETGEO, &geo) >= 0) return (vlong)geo.heads*geo.sectors*geo.cylinders*512; return 0; } #else static vlong disksize(int fd, struct stat *st) { return 0; } #endif int _p9usepwlibrary = 1; /* * Caching the last group and passwd looked up is * a significant win (stupidly enough) on most systems. * It's not safe for threaded programs, but neither is using * getpwnam in the first place, so I'm not too worried. */ int _p9dir(struct stat *lst, struct stat *st, char *name, Dir *d, char **str, char *estr) { char *s; char tmp[20]; static struct group *g; static struct passwd *p; static int gid, uid; int sz, fd; fd = -1; USED(fd); sz = 0; if(d) memset(d, 0, sizeof *d); /* name */ s = strrchr(name, '/'); if(s) s++; if(!s || !*s) s = name; if(*s == '/') s++; if(*s == 0) s = "/"; if(d){ if(*str + strlen(s)+1 > estr) d->name = "oops"; else{ strcpy(*str, s); d->name = *str; *str += strlen(*str)+1; } } sz += strlen(s)+1; /* user */ if(p && st->st_uid == uid && p->pw_uid == uid) ; else if(_p9usepwlibrary){ p = getpwuid(st->st_uid); uid = st->st_uid; } if(p == nil || st->st_uid != uid || p->pw_uid != uid){ snprint(tmp, sizeof tmp, "%d", (int)st->st_uid); s = tmp; }else s = p->pw_name; sz += strlen(s)+1; if(d){ if(*str+strlen(s)+1 > estr) d->uid = "oops"; else{ strcpy(*str, s); d->uid = *str; *str += strlen(*str)+1; } } /* group */ if(g && st->st_gid == gid && g->gr_gid == gid) ; else if(_p9usepwlibrary){ g = getgrgid(st->st_gid); gid = st->st_gid; } if(g == nil || st->st_gid != gid || g->gr_gid != gid){ snprint(tmp, sizeof tmp, "%d", (int)st->st_gid); s = tmp; }else s = g->gr_name; sz += strlen(s)+1; if(d){ if(*str + strlen(s)+1 > estr) d->gid = "oops"; else{ strcpy(*str, s); d->gid = *str; *str += strlen(*str)+1; } } if(d){ d->type = 'M'; d->muid = ""; d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino; #ifdef _HAVESTGEN d->qid.vers = st->st_gen; #endif if(d->qid.vers == 0) d->qid.vers = st->st_mtime + st->st_ctime; d->mode = st->st_mode&0777; d->atime = st->st_atime; d->mtime = st->st_mtime; d->length = st->st_size; if(S_ISLNK(lst->st_mode)){ /* yes, lst not st */ d->mode |= DMSYMLINK; d->length = lst->st_size; } else if(S_ISDIR(st->st_mode)){ d->length = 0; d->mode |= DMDIR; d->qid.type = QTDIR; } else if(S_ISFIFO(st->st_mode)) d->mode |= DMNAMEDPIPE; else if(S_ISSOCK(st->st_mode)) d->mode |= DMSOCKET; else if(S_ISBLK(st->st_mode)){ d->mode |= DMDEVICE; d->qid.path = ('b'<<16)|st->st_rdev; } else if(S_ISCHR(st->st_mode)){ d->mode |= DMDEVICE; d->qid.path = ('c'<<16)|st->st_rdev; } /* fetch real size for disks */ if(S_ISBLK(lst->st_mode) || S_ISCHR(lst->st_mode)){ if((fd = open(name, O_RDONLY)) >= 0){ d->length = disksize(fd, st); close(fd); } } } return sz; } 9base-6/lib9/_exits.c0000644000175000017500000000016311402154555014044 0ustar anselmanselm#include #include void _exits(char *s) { if(s == 0 || *s == 0) _exit(0); _exit(exitcode(s)); } 9base-6/lib9/tm2sec.c0000644000175000017500000000355411402154555013755 0ustar anselmanselm#include #include #include "zoneinfo.h" #define SEC2MIN 60L #define SEC2HOUR (60L*SEC2MIN) #define SEC2DAY (24L*SEC2HOUR) /* * days per month plus days/year */ static int dmsize[] = { 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static int ldmsize[] = { 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* * return the days/month for the given year */ static int * yrsize(int y) { if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0)) return ldmsize; else return dmsize; } /* * compute seconds since Jan 1 1970 GMT * and convert to our timezone. */ long tm2sec(Tm *tm) { Tinfo ti0, ti1, *ti; long secs; int i, yday, year, *d2m; secs = 0; /* * seconds per year */ year = tm->year + 1900; for(i = 1970; i < year; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * if mday is set, use mon and mday to compute yday */ if(tm->mday){ yday = 0; d2m = yrsize(year); for(i=0; imon; i++) yday += d2m[i+1]; yday += tm->mday-1; }else{ yday = tm->yday; } secs += yday * SEC2DAY; /* * hours, minutes, seconds */ secs += tm->hour * SEC2HOUR; secs += tm->min * SEC2MIN; secs += tm->sec; /* * Assume the local time zone if zone is not GMT */ if(strcmp(tm->zone, "GMT") != 0) { i = zonelookuptinfo(&ti0, secs); ti = &ti0; if (i != -1) if (ti->tzoff!=0) { /* * to what local time period `secs' belongs? */ if (ti->tzoff>0) { /* * east of GMT; check previous local time transition */ if (ti->t+ti->tzoff > secs) if (zonetinfo(&ti1, i-1)!=-1) ti = &ti1; } else /* * west of GMT; check next local time transition */ if (zonetinfo(&ti1, i+1)) if (ti1.t+ti->tzoff < secs) ti = &ti1; // fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti->tzoff, (long)secs); secs -= ti->tzoff; } } if(secs < 0) secs = 0; return secs; } 9base-6/lib9/convS2M.c0000644000175000017500000001264411402154555014047 0ustar anselmanselm#include #include #include static uchar* pstring(uchar *p, char *s) { uint n; if(s == nil){ PBIT16(p, 0); p += BIT16SZ; return p; } n = strlen(s); PBIT16(p, n); p += BIT16SZ; memmove(p, s, n); p += n; return p; } static uchar* pqid(uchar *p, Qid *q) { PBIT8(p, q->type); p += BIT8SZ; PBIT32(p, q->vers); p += BIT32SZ; PBIT64(p, q->path); p += BIT64SZ; return p; } static uint stringsz(char *s) { if(s == nil) return BIT16SZ; return BIT16SZ+strlen(s); } uint sizeS2Mu(Fcall *f, int dotu) { uint n; int i; n = 0; n += BIT32SZ; /* size */ n += BIT8SZ; /* type */ n += BIT16SZ; /* tag */ switch(f->type) { default: return 0; case Tversion: n += BIT32SZ; n += stringsz(f->version); break; case Tflush: n += BIT16SZ; break; case Tauth: n += BIT32SZ; n += stringsz(f->uname); n += stringsz(f->aname); break; case Tattach: n += BIT32SZ; n += BIT32SZ; n += stringsz(f->uname); n += stringsz(f->aname); break; case Twalk: n += BIT32SZ; n += BIT32SZ; n += BIT16SZ; for(i=0; inwname; i++) n += stringsz(f->wname[i]); break; case Topen: case Topenfd: n += BIT32SZ; n += BIT8SZ; break; case Tcreate: n += BIT32SZ; n += stringsz(f->name); n += BIT32SZ; n += BIT8SZ; if(dotu) n += stringsz(f->extension); break; case Tread: n += BIT32SZ; n += BIT64SZ; n += BIT32SZ; break; case Twrite: n += BIT32SZ; n += BIT64SZ; n += BIT32SZ; n += f->count; break; case Tclunk: case Tremove: n += BIT32SZ; break; case Tstat: n += BIT32SZ; break; case Twstat: n += BIT32SZ; n += BIT16SZ; n += f->nstat; break; /* */ case Rversion: n += BIT32SZ; n += stringsz(f->version); break; case Rerror: n += stringsz(f->ename); if(dotu) n += BIT16SZ; break; case Rflush: break; case Rauth: n += QIDSZ; break; case Rattach: n += QIDSZ; break; case Rwalk: n += BIT16SZ; n += f->nwqid*QIDSZ; break; case Ropen: case Rcreate: n += QIDSZ; n += BIT32SZ; break; case Ropenfd: n += QIDSZ; n += BIT32SZ; n += BIT32SZ; break; case Rread: n += BIT32SZ; n += f->count; break; case Rwrite: n += BIT32SZ; break; case Rclunk: break; case Rremove: break; case Rstat: n += BIT16SZ; n += f->nstat; break; case Rwstat: break; } return n; } uint sizeS2M(Fcall *f) { return sizeS2Mu(f, 0); } uint convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu) { uchar *p; uint i, size; size = sizeS2Mu(f, dotu); if(size == 0) return 0; if(size > nap) return 0; p = (uchar*)ap; PBIT32(p, size); p += BIT32SZ; PBIT8(p, f->type); p += BIT8SZ; PBIT16(p, f->tag); p += BIT16SZ; switch(f->type) { default: return 0; case Tversion: PBIT32(p, f->msize); p += BIT32SZ; p = pstring(p, f->version); break; case Tflush: PBIT16(p, f->oldtag); p += BIT16SZ; break; case Tauth: PBIT32(p, f->afid); p += BIT32SZ; p = pstring(p, f->uname); p = pstring(p, f->aname); break; case Tattach: PBIT32(p, f->fid); p += BIT32SZ; PBIT32(p, f->afid); p += BIT32SZ; p = pstring(p, f->uname); p = pstring(p, f->aname); break; case Twalk: PBIT32(p, f->fid); p += BIT32SZ; PBIT32(p, f->newfid); p += BIT32SZ; PBIT16(p, f->nwname); p += BIT16SZ; if(f->nwname > MAXWELEM) return 0; for(i=0; inwname; i++) p = pstring(p, f->wname[i]); break; case Topen: case Topenfd: PBIT32(p, f->fid); p += BIT32SZ; PBIT8(p, f->mode); p += BIT8SZ; break; case Tcreate: PBIT32(p, f->fid); p += BIT32SZ; p = pstring(p, f->name); PBIT32(p, f->perm); p += BIT32SZ; PBIT8(p, f->mode); p += BIT8SZ; if(dotu) p = pstring(p, f->extension); break; case Tread: PBIT32(p, f->fid); p += BIT32SZ; PBIT64(p, f->offset); p += BIT64SZ; PBIT32(p, f->count); p += BIT32SZ; break; case Twrite: PBIT32(p, f->fid); p += BIT32SZ; PBIT64(p, f->offset); p += BIT64SZ; PBIT32(p, f->count); p += BIT32SZ; memmove(p, f->data, f->count); p += f->count; break; case Tclunk: case Tremove: PBIT32(p, f->fid); p += BIT32SZ; break; case Tstat: PBIT32(p, f->fid); p += BIT32SZ; break; case Twstat: PBIT32(p, f->fid); p += BIT32SZ; PBIT16(p, f->nstat); p += BIT16SZ; memmove(p, f->stat, f->nstat); p += f->nstat; break; /* */ case Rversion: PBIT32(p, f->msize); p += BIT32SZ; p = pstring(p, f->version); break; case Rerror: p = pstring(p, f->ename); if(dotu){ PBIT16(p, f->errornum); p += BIT16SZ; } break; case Rflush: break; case Rauth: p = pqid(p, &f->aqid); break; case Rattach: p = pqid(p, &f->qid); break; case Rwalk: PBIT16(p, f->nwqid); p += BIT16SZ; if(f->nwqid > MAXWELEM) return 0; for(i=0; inwqid; i++) p = pqid(p, &f->wqid[i]); break; case Ropen: case Rcreate: case Ropenfd: p = pqid(p, &f->qid); PBIT32(p, f->iounit); p += BIT32SZ; if(f->type == Ropenfd){ PBIT32(p, f->unixfd); p += BIT32SZ; } break; case Rread: PBIT32(p, f->count); p += BIT32SZ; memmove(p, f->data, f->count); p += f->count; break; case Rwrite: PBIT32(p, f->count); p += BIT32SZ; break; case Rclunk: break; case Rremove: break; case Rstat: PBIT16(p, f->nstat); p += BIT16SZ; memmove(p, f->stat, f->nstat); p += f->nstat; break; case Rwstat: break; } if(size != p-ap) return 0; return size; } uint convS2M(Fcall *f, uchar *ap, uint nap) { return convS2Mu(f, ap, nap, 0); } 9base-6/lib9/exitcode.c0000644000175000017500000000011011402154555014345 0ustar anselmanselm#include #include int exitcode(char *s) { return 1; } 9base-6/lib9/getenv.c0000644000175000017500000000043111402154555014037 0ustar anselmanselm#include #define NOPLAN9DEFINES #include char* p9getenv(char *s) { char *t; t = getenv(s); if(t == 0) return 0; return strdup(t); } int p9putenv(char *s, char *v) { char *t; t = smprint("%s=%s", s, v); if(t == nil) return -1; putenv(t); return 0; } 9base-6/lib9/fmt/0000755000175000017500000000000011402154555013173 5ustar anselmanselm9base-6/lib9/fmt/runevsnprint.c0000644000175000017500000000100311402154555016106 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int runevsnprint(Rune *buf, int len, char *fmt, va_list args) { Fmt f; if(len <= 0) return -1; f.runes = 1; f.start = buf; f.to = buf; f.stop = buf + len - 1; f.flush = nil; f.farg = nil; f.nfmt = 0; VA_COPY(f.args,args); fmtlocaleinit(&f, nil, nil, nil); dofmt(&f, fmt); VA_END(f.args); *(Rune*)f.to = '\0'; return (Rune*)f.to - buf; } 9base-6/lib9/fmt/print.c0000644000175000017500000000041611402154555014474 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int print(char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = vfprint(1, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/pow10.c0000644000175000017500000000242511402154555014310 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * this table might overflow 127-bit exponent representations. * in that case, truncate it after 1.0e38. * it is important to get all one can from this * routine since it is used in atof to scale numbers. * the presumption is that C converts fp numbers better * than multipication of lower powers of 10. */ static double tab[] = { 1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10,1.0e11,1.0e12,1.0e13,1.0e14,1.0e15,1.0e16,1.0e17,1.0e18,1.0e19, 1.0e20,1.0e21,1.0e22,1.0e23,1.0e24,1.0e25,1.0e26,1.0e27,1.0e28,1.0e29, 1.0e30,1.0e31,1.0e32,1.0e33,1.0e34,1.0e35,1.0e36,1.0e37,1.0e38,1.0e39, 1.0e40,1.0e41,1.0e42,1.0e43,1.0e44,1.0e45,1.0e46,1.0e47,1.0e48,1.0e49, 1.0e50,1.0e51,1.0e52,1.0e53,1.0e54,1.0e55,1.0e56,1.0e57,1.0e58,1.0e59, 1.0e60,1.0e61,1.0e62,1.0e63,1.0e64,1.0e65,1.0e66,1.0e67,1.0e68,1.0e69, }; double __fmtpow10(int n) { int m; if(n < 0) { n = -n; if(n < (int)(sizeof(tab)/sizeof(tab[0]))) return 1/tab[n]; m = n/2; return __fmtpow10(-m) * __fmtpow10(m-n); } if(n < (int)(sizeof(tab)/sizeof(tab[0]))) return tab[n]; m = n/2; return __fmtpow10(m) * __fmtpow10(n-m); } 9base-6/lib9/fmt/fmtlock.c0000644000175000017500000000030111402154555014770 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" void __fmtlock(void) { } void __fmtunlock(void) { } 9base-6/lib9/fmt/fmtquote.c0000644000175000017500000001163711402154555015213 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * How many bytes of output UTF will be produced by quoting (if necessary) this string? * How many runes? How much of the input will be consumed? * The parameter q is filled in by __quotesetup. * The string may be UTF or Runes (s or r). * Return count does not include NUL. * Terminate the scan at the first of: * NUL in input * count exceeded in input * count exceeded on output * *ninp is set to number of input bytes accepted. * nin may be <0 initially, to avoid checking input by count. */ void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout) { int w; Rune c; q->quoted = 0; q->nbytesout = 0; q->nrunesout = 0; q->nbytesin = 0; q->nrunesin = 0; if(sharp || nin==0 || (s && *s=='\0') || (r && *r=='\0')){ if(nout < 2) return; q->quoted = 1; q->nbytesout = 2; q->nrunesout = 2; } for(; nin!=0; nin--){ if(s) w = chartorune(&c, s); else{ c = *r; w = runelen(c); } if(c == '\0') break; if(runesout){ if(q->nrunesout+1 > nout) break; }else{ if(q->nbytesout+w > nout) break; } if((c <= L' ') || (c == L'\'') || (fmtdoquote!=nil && fmtdoquote(c))){ if(!q->quoted){ if(runesout){ if(1+q->nrunesout+1+1 > nout) /* no room for quotes */ break; }else{ if(1+q->nbytesout+w+1 > nout) /* no room for quotes */ break; } q->nrunesout += 2; /* include quotes */ q->nbytesout += 2; /* include quotes */ q->quoted = 1; } if(c == '\'') { if(runesout){ if(1+q->nrunesout+1 > nout) /* no room for quotes */ break; }else{ if(1+q->nbytesout+w > nout) /* no room for quotes */ break; } q->nbytesout++; q->nrunesout++; /* quotes reproduce as two characters */ } } /* advance input */ if(s) s += w; else r++; q->nbytesin += w; q->nrunesin++; /* advance output */ q->nbytesout += w; q->nrunesout++; #ifndef PLAN9PORT /* ANSI requires precision in bytes, not Runes. */ nin-= w-1; /* and then n-- in the loop */ #endif } } static int qstrfmt(char *sin, Rune *rin, Quoteinfo *q, Fmt *f) { Rune r, *rm, *rme; char *t, *s, *m, *me; Rune *rt, *rs; ulong fl; int nc, w; m = sin; me = m + q->nbytesin; rm = rin; rme = rm + q->nrunesin; fl = f->flags; w = 0; if(fl & FmtWidth) w = f->width; if(f->runes){ if(!(fl & FmtLeft) && __rfmtpad(f, w - q->nrunesout) < 0) return -1; }else{ if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0) return -1; } t = (char*)f->to; s = (char*)f->stop; rt = (Rune*)f->to; rs = (Rune*)f->stop; if(f->runes) FMTRCHAR(f, rt, rs, '\''); else FMTRUNE(f, t, s, '\''); for(nc = q->nrunesin; nc > 0; nc--){ if(sin){ r = *(uchar*)m; if(r < Runeself) m++; else if((me - m) >= UTFmax || fullrune(m, me-m)) m += chartorune(&r, m); else break; }else{ if(rm >= rme) break; r = *(uchar*)rm++; } if(f->runes){ FMTRCHAR(f, rt, rs, r); if(r == '\'') FMTRCHAR(f, rt, rs, r); }else{ FMTRUNE(f, t, s, r); if(r == '\'') FMTRUNE(f, t, s, r); } } if(f->runes){ FMTRCHAR(f, rt, rs, '\''); USED(rs); f->nfmt += rt - (Rune *)f->to; f->to = rt; if(fl & FmtLeft && __rfmtpad(f, w - q->nrunesout) < 0) return -1; }else{ FMTRUNE(f, t, s, '\''); USED(s); f->nfmt += t - (char *)f->to; f->to = t; if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0) return -1; } return 0; } int __quotestrfmt(int runesin, Fmt *f) { int nin, outlen; Rune *r; char *s; Quoteinfo q; nin = -1; if(f->flags&FmtPrec) nin = f->prec; if(runesin){ r = va_arg(f->args, Rune *); s = nil; }else{ s = va_arg(f->args, char *); r = nil; } if(!s && !r) return __fmtcpy(f, (void*)"", 5, 5); if(f->flush) outlen = 0x7FFFFFFF; /* if we can flush, no output limit */ else if(f->runes) outlen = (Rune*)f->stop - (Rune*)f->to; else outlen = (char*)f->stop - (char*)f->to; __quotesetup(s, r, nin, outlen, &q, f->flags&FmtSharp, f->runes); /*print("bytes in %d bytes out %d runes in %d runesout %d\n", q.nbytesin, q.nbytesout, q.nrunesin, q.nrunesout); */ if(runesin){ if(!q.quoted) return __fmtrcpy(f, r, q.nrunesin); return qstrfmt(nil, r, &q, f); } if(!q.quoted) return __fmtcpy(f, s, q.nrunesin, q.nbytesin); return qstrfmt(s, nil, &q, f); } int quotestrfmt(Fmt *f) { return __quotestrfmt(0, f); } int quoterunestrfmt(Fmt *f) { return __quotestrfmt(1, f); } void quotefmtinstall(void) { fmtinstall('q', quotestrfmt); fmtinstall('Q', quoterunestrfmt); } int __needsquotes(char *s, int *quotelenp) { Quoteinfo q; __quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0); *quotelenp = q.nbytesout; return q.quoted; } int __runeneedsquotes(Rune *r, int *quotelenp) { Quoteinfo q; __quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0); *quotelenp = q.nrunesout; return q.quoted; } 9base-6/lib9/fmt/fltfmt.c0000644000175000017500000003106211402154555014635 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include #include #include #include #include #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" #include "nan.h" enum { FDIGIT = 30, FDEFLT = 6, NSIGNIF = 17 }; /* * first few powers of 10, enough for about 1/2 of the * total space for doubles. */ static double pows10[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49, 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69, 1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79, 1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89, 1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99, 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, }; #define npows10 ((int)(sizeof(pows10)/sizeof(pows10[0]))) #define pow10(x) fmtpow10(x) static double pow10(int n) { double d; int neg; neg = 0; if(n < 0){ neg = 1; n = -n; } if(n < npows10) d = pows10[n]; else{ d = pows10[npows10-1]; for(;;){ n -= npows10 - 1; if(n < npows10){ d *= pows10[n]; break; } d *= pows10[npows10 - 1]; } } if(neg) return 1./d; return d; } /* * add 1 to the decimal integer string a of length n. * if 99999 overflows into 10000, return 1 to tell caller * to move the virtual decimal point. */ static int xadd1(char *a, int n) { char *b; int c; if(n < 0 || n > NSIGNIF) return 0; for(b = a+n-1; b >= a; b--) { c = *b + 1; if(c <= '9') { *b = c; return 0; } *b = '0'; } /* * need to overflow adding digit. * shift number down and insert 1 at beginning. * decimal is known to be 0s or we wouldn't * have gotten this far. (e.g., 99999+1 => 00000) */ a[0] = '1'; return 1; } /* * subtract 1 from the decimal integer string a. * if 10000 underflows into 09999, make it 99999 * and return 1 to tell caller to move the virtual * decimal point. this way, xsub1 is inverse of xadd1. */ static int xsub1(char *a, int n) { char *b; int c; if(n < 0 || n > NSIGNIF) return 0; for(b = a+n-1; b >= a; b--) { c = *b - 1; if(c >= '0') { if(c == '0' && b == a) { /* * just zeroed the top digit; shift everyone up. * decimal is known to be 9s or we wouldn't * have gotten this far. (e.g., 10000-1 => 09999) */ *b = '9'; return 1; } *b = c; return 0; } *b = '9'; } /* * can't get here. the number a is always normalized * so that it has a nonzero first digit. */ abort(); } /* * format exponent like sprintf(p, "e%+02d", e) */ static void xfmtexp(char *p, int e, int ucase) { char se[9]; int i; *p++ = ucase ? 'E' : 'e'; if(e < 0) { *p++ = '-'; e = -e; } else *p++ = '+'; i = 0; while(e) { se[i++] = e % 10 + '0'; e /= 10; } while(i < 2) se[i++] = '0'; while(i > 0) *p++ = se[--i]; *p++ = '\0'; } /* * compute decimal integer m, exp such that: * f = m*10^exp * m is as short as possible with losing exactness * assumes special cases (NaN, +Inf, -Inf) have been handled. */ static void xdtoa(double f, char *s, int *exp, int *neg, int *ns) { int c, d, e2, e, ee, i, ndigit, oerrno; char tmp[NSIGNIF+10]; double g; oerrno = errno; /* in case strtod smashes errno */ /* * make f non-negative. */ *neg = 0; if(f < 0) { f = -f; *neg = 1; } /* * must handle zero specially. */ if(f == 0){ *exp = 0; s[0] = '0'; s[1] = '\0'; *ns = 1; return; } /* * find g,e such that f = g*10^e. * guess 10-exponent using 2-exponent, then fine tune. */ frexp(f, &e2); e = (int)(e2 * .301029995664); g = f * pow10(-e); while(g < 1) { e--; g = f * pow10(-e); } while(g >= 10) { e++; g = f * pow10(-e); } /* * convert NSIGNIF digits as a first approximation. */ for(i=0; i g) { if(xadd1(s, NSIGNIF)) { /* gained a digit */ e--; xfmtexp(s+NSIGNIF, e, 0); } continue; } if(f < g) { if(xsub1(s, NSIGNIF)) { /* lost a digit */ e++; xfmtexp(s+NSIGNIF, e, 0); } continue; } break; } /* * play with the decimal to try to simplify. */ /* * bump last few digits up to 9 if we can */ for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) { c = s[i]; if(c != '9') { s[i] = '9'; g = fmtstrtod(s, nil); if(g != f) { s[i] = c; break; } } } /* * add 1 in hopes of turning 9s to 0s */ if(s[NSIGNIF-1] == '9') { strcpy(tmp, s); ee = e; if(xadd1(tmp, NSIGNIF)) { ee--; xfmtexp(tmp+NSIGNIF, ee, 0); } g = fmtstrtod(tmp, nil); if(g == f) { strcpy(s, tmp); e = ee; } } /* * bump last few digits down to 0 as we can. */ for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) { c = s[i]; if(c != '0') { s[i] = '0'; g = fmtstrtod(s, nil); if(g != f) { s[i] = c; break; } } } /* * remove trailing zeros. */ ndigit = NSIGNIF; while(ndigit > 1 && s[ndigit-1] == '0'){ e++; --ndigit; } s[ndigit] = 0; *exp = e; *ns = ndigit; errno = oerrno; } #ifdef PLAN9PORT static char *special[] = { "NaN", "NaN", "+Inf", "+Inf", "-Inf", "-Inf" }; #else static char *special[] = { "nan", "NAN", "inf", "INF", "-inf", "-INF" }; #endif int __efgfmt(Fmt *fmt) { char buf[NSIGNIF+10], *dot, *digits, *p, *s, suf[10], *t; double f; int c, chr, dotwid, e, exp, fl, ndigits, neg, newndigits; int pad, point, prec, realchr, sign, sufwid, ucase, wid, z1, z2; Rune r, *rs, *rt; if(fmt->flags&FmtLong) f = va_arg(fmt->args, long double); else f = va_arg(fmt->args, double); /* * extract formatting flags */ fl = fmt->flags; fmt->flags = 0; prec = FDEFLT; if(fl & FmtPrec) prec = fmt->prec; chr = fmt->r; ucase = 0; switch(chr) { case 'A': case 'E': case 'F': case 'G': chr += 'a'-'A'; ucase = 1; break; } /* * pick off special numbers. */ if(__isNaN(f)) { s = special[0+ucase]; special: fmt->flags = fl & (FmtWidth|FmtLeft); return __fmtcpy(fmt, s, strlen(s), strlen(s)); } if(__isInf(f, 1)) { s = special[2+ucase]; goto special; } if(__isInf(f, -1)) { s = special[4+ucase]; goto special; } /* * get exact representation. */ digits = buf; xdtoa(f, digits, &exp, &neg, &ndigits); /* * get locale's decimal point. */ dot = fmt->decimal; if(dot == nil) dot = "."; dotwid = utflen(dot); /* * now the formatting fun begins. * compute parameters for actual fmt: * * pad: number of spaces to insert before/after field. * z1: number of zeros to insert before digits * z2: number of zeros to insert after digits * point: number of digits to print before decimal point * ndigits: number of digits to use from digits[] * suf: trailing suffix, like "e-5" */ realchr = chr; switch(chr){ case 'g': /* * convert to at most prec significant digits. (prec=0 means 1) */ if(prec == 0) prec = 1; if(ndigits > prec) { if(digits[prec] >= '5' && xadd1(digits, prec)) exp++; exp += ndigits-prec; ndigits = prec; } /* * extra rules for %g (implemented below): * trailing zeros removed after decimal unless FmtSharp. * decimal point only if digit follows. */ /* fall through to %e */ default: case 'e': /* * one significant digit before decimal, no leading zeros. */ point = 1; z1 = 0; /* * decimal point is after ndigits digits right now. * slide to be after first. */ e = exp + (ndigits-1); /* * if this is %g, check exponent and convert prec */ if(realchr == 'g') { if(-4 <= e && e < prec) goto casef; prec--; /* one digit before decimal; rest after */ } /* * compute trailing zero padding or truncate digits. */ if(1+prec >= ndigits) z2 = 1+prec - ndigits; else { /* * truncate digits */ assert(realchr != 'g'); newndigits = 1+prec; if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) { /* * had 999e4, now have 100e5 */ e++; } ndigits = newndigits; z2 = 0; } xfmtexp(suf, e, ucase); sufwid = strlen(suf); break; casef: case 'f': /* * determine where digits go with respect to decimal point */ if(ndigits+exp > 0) { point = ndigits+exp; z1 = 0; } else { point = 1; z1 = 1 + -(ndigits+exp); } /* * %g specifies prec = number of significant digits * convert to number of digits after decimal point */ if(realchr == 'g') prec += z1 - point; /* * compute trailing zero padding or truncate digits. */ if(point+prec >= z1+ndigits) z2 = point+prec - (z1+ndigits); else { /* * truncate digits */ assert(realchr != 'g'); newndigits = point+prec - z1; if(newndigits < 0) { z1 += newndigits; newndigits = 0; } else if(newndigits == 0) { /* perhaps round up */ if(digits[0] >= '5'){ digits[0] = '1'; newndigits = 1; goto newdigit; } } else if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) { /* * digits was 999, is now 100; make it 1000 */ digits[newndigits++] = '0'; newdigit: /* * account for new digit */ if(z1) /* 0.099 => 0.100 or 0.99 => 1.00*/ z1--; else /* 9.99 => 10.00 */ point++; } z2 = 0; ndigits = newndigits; } sufwid = 0; break; } /* * if %g is given without FmtSharp, remove trailing zeros. * must do after truncation, so that e.g. print %.3g 1.001 * produces 1, not 1.00. sorry, but them's the rules. */ if(realchr == 'g' && !(fl & FmtSharp)) { if(z1+ndigits+z2 >= point) { if(z1+ndigits < point) z2 = point - (z1+ndigits); else{ z2 = 0; while(z1+ndigits > point && digits[ndigits-1] == '0') ndigits--; } } } /* * compute width of all digits and decimal point and suffix if any */ wid = z1+ndigits+z2; if(wid > point) wid += dotwid; else if(wid == point){ if(fl & FmtSharp) wid += dotwid; else point++; /* do not print any decimal point */ } wid += sufwid; /* * determine sign */ sign = 0; if(neg) sign = '-'; else if(fl & FmtSign) sign = '+'; else if(fl & FmtSpace) sign = ' '; if(sign) wid++; /* * compute padding */ pad = 0; if((fl & FmtWidth) && fmt->width > wid) pad = fmt->width - wid; if(pad && !(fl & FmtLeft) && (fl & FmtZero)){ z1 += pad; point += pad; pad = 0; } /* * format the actual field. too bad about doing this twice. */ if(fmt->runes){ if(pad && !(fl & FmtLeft) && __rfmtpad(fmt, pad) < 0) return -1; rt = (Rune*)fmt->to; rs = (Rune*)fmt->stop; if(sign) FMTRCHAR(fmt, rt, rs, sign); while(z1>0 || ndigits>0 || z2>0) { if(z1 > 0){ z1--; c = '0'; }else if(ndigits > 0){ ndigits--; c = *digits++; }else{ z2--; c = '0'; } FMTRCHAR(fmt, rt, rs, c); if(--point == 0) { for(p = dot; *p; ){ p += chartorune(&r, p); FMTRCHAR(fmt, rt, rs, r); } } } fmt->nfmt += rt - (Rune*)fmt->to; fmt->to = rt; if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0) return -1; if(pad && (fl & FmtLeft) && __rfmtpad(fmt, pad) < 0) return -1; }else{ if(pad && !(fl & FmtLeft) && __fmtpad(fmt, pad) < 0) return -1; t = (char*)fmt->to; s = (char*)fmt->stop; if(sign) FMTCHAR(fmt, t, s, sign); while(z1>0 || ndigits>0 || z2>0) { if(z1 > 0){ z1--; c = '0'; }else if(ndigits > 0){ ndigits--; c = *digits++; }else{ z2--; c = '0'; } FMTCHAR(fmt, t, s, c); if(--point == 0) for(p=dot; *p; p++) FMTCHAR(fmt, t, s, *p); } fmt->nfmt += t - (char*)fmt->to; fmt->to = t; if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0) return -1; if(pad && (fl & FmtLeft) && __fmtpad(fmt, pad) < 0) return -1; } return 0; } 9base-6/lib9/fmt/fmtfdflush.c0000644000175000017500000000063411402154555015504 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * generic routine for flushing a formatting buffer * to a file descriptor */ int __fmtFdFlush(Fmt *f) { int n; n = (char*)f->to - (char*)f->start; if(n && write((uintptr)f->farg, f->start, n) != n) return 0; f->to = f->start; return 1; } 9base-6/lib9/fmt/test2.c0000644000175000017500000000016611402154555014403 0ustar anselmanselm#include #include #include int main(int argc, char **argv) { print("%020.10d\n", 100); } 9base-6/lib9/fmt/fprint.c0000644000175000017500000000043011402154555014636 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int fprint(int fd, char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = vfprint(fd, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/NOTICE0000644000175000017500000000155311402154555014103 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ This is a Unix port of the Plan 9 formatted I/O package. Please send comments about the packaging to Russ Cox . 9base-6/lib9/fmt/sprint.c0000644000175000017500000000130311402154555014653 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int sprint(char *buf, char *fmt, ...) { int n; uint len; va_list args; len = 1<<30; /* big number, but sprint is deprecated anyway */ /* * on PowerPC, the stack is near the top of memory, so * we must be sure not to overflow a 32-bit pointer. * * careful! gcc-4.2 assumes buf+len < buf can never be true and * optimizes the test away. casting to uintptr works around this bug. */ if((uintptr)buf+len < (uintptr)buf) len = -(uintptr)buf-1; va_start(args, fmt); n = vsnprint(buf, len, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/fmtdef.h0000644000175000017500000000543011402154555014613 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ /* * dofmt -- format to a buffer * the number of characters formatted is returned, * or -1 if there was an error. * if the buffer is ever filled, flush is called. * it should reset the buffer and return whether formatting should continue. */ typedef int (*Fmts)(Fmt*); typedef struct Quoteinfo Quoteinfo; struct Quoteinfo { int quoted; /* if set, string must be quoted */ int nrunesin; /* number of input runes that can be accepted */ int nbytesin; /* number of input bytes that can be accepted */ int nrunesout; /* number of runes that will be generated */ int nbytesout; /* number of bytes that will be generated */ }; /* Edit .+1,/^$/ |cfn |grep -v static | grep __ */ double __Inf(int sign); double __NaN(void); int __badfmt(Fmt *f); int __charfmt(Fmt *f); int __countfmt(Fmt *f); int __efgfmt(Fmt *fmt); int __errfmt(Fmt *f); int __flagfmt(Fmt *f); int __fmtFdFlush(Fmt *f); int __fmtcpy(Fmt *f, const void *vm, int n, int sz); void* __fmtdispatch(Fmt *f, void *fmt, int isrunes); void * __fmtflush(Fmt *f, void *t, int len); void __fmtlock(void); int __fmtpad(Fmt *f, int n); double __fmtpow10(int n); int __fmtrcpy(Fmt *f, const void *vm, int n); void __fmtunlock(void); int __ifmt(Fmt *f); int __isInf(double d, int sign); int __isNaN(double d); int __needsep(int*, char**); int __needsquotes(char *s, int *quotelenp); int __percentfmt(Fmt *f); void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout); int __quotestrfmt(int runesin, Fmt *f); int __rfmtpad(Fmt *f, int n); int __runefmt(Fmt *f); int __runeneedsquotes(Rune *r, int *quotelenp); int __runesfmt(Fmt *f); int __strfmt(Fmt *f); #define FMTCHAR(f, t, s, c)\ do{\ if(t + 1 > (char*)s){\ t = (char*)__fmtflush(f, t, 1);\ if(t != nil)\ s = (char*)f->stop;\ else\ return -1;\ }\ *t++ = c;\ }while(0) #define FMTRCHAR(f, t, s, c)\ do{\ if(t + 1 > (Rune*)s){\ t = (Rune*)__fmtflush(f, t, sizeof(Rune));\ if(t != nil)\ s = (Rune*)f->stop;\ else\ return -1;\ }\ *t++ = c;\ }while(0) #define FMTRUNE(f, t, s, r)\ do{\ Rune _rune;\ int _runelen;\ if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ t = (char*)__fmtflush(f, t, _runelen);\ if(t != nil)\ s = (char*)f->stop;\ else\ return -1;\ }\ if(r < Runeself)\ *t++ = r;\ else{\ _rune = r;\ t += runetochar(t, &_rune);\ }\ }while(0) #ifdef va_copy # define VA_COPY(a,b) va_copy(a,b) # define VA_END(a) va_end(a) #else # define VA_COPY(a,b) (a) = (b) # define VA_END(a) #endif 9base-6/lib9/fmt/strtod.c0000644000175000017500000002056211402154555014663 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include #include #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" static ulong umuldiv(ulong a, ulong b, ulong c) { double d; d = ((double)a * (double)b) / (double)c; if(d >= 4294967295.) d = 4294967295.; return (ulong)d; } /* * This routine will convert to arbitrary precision * floating point entirely in multi-precision fixed. * The answer is the closest floating point number to * the given decimal number. Exactly half way are * rounded ala ieee rules. * Method is to scale input decimal between .500 and .999... * with external power of 2, then binary search for the * closest mantissa to this decimal number. * Nmant is is the required precision. (53 for ieee dp) * Nbits is the max number of bits/word. (must be <= 28) * Prec is calculated - the number of words of fixed mantissa. */ enum { Nbits = 28, /* bits safely represented in a ulong */ Nmant = 53, /* bits of precision required */ Prec = (Nmant+Nbits+1)/Nbits, /* words of Nbits each to represent mantissa */ Sigbit = 1<<(Prec*Nbits-Nmant), /* first significant bit of Prec-th word */ Ndig = 1500, One = (ulong)(1<>1), Maxe = 310, Fsign = 1<<0, /* found - */ Fesign = 1<<1, /* found e- */ Fdpoint = 1<<2, /* found . */ S0 = 0, /* _ _S0 +S1 #S2 .S3 */ S1, /* _+ #S2 .S3 */ S2, /* _+# #S2 .S4 eS5 */ S3, /* _+. #S4 */ S4, /* _+#.# #S4 eS5 */ S5, /* _+#.#e +S6 #S7 */ S6, /* _+#.#e+ #S7 */ S7 /* _+#.#e+# #S7 */ }; static int xcmp(char*, char*); static int fpcmp(char*, ulong*); static void frnorm(ulong*); static void divascii(char*, int*, int*, int*); static void mulascii(char*, int*, int*, int*); typedef struct Tab Tab; struct Tab { int bp; int siz; char* cmp; }; double fmtstrtod(const char *as, char **aas) { int na, ex, dp, bp, c, i, flag, state; ulong low[Prec], hig[Prec], mid[Prec]; double d; char *s, a[Ndig]; flag = 0; /* Fsign, Fesign, Fdpoint */ na = 0; /* number of digits of a[] */ dp = 0; /* na of decimal point */ ex = 0; /* exonent */ state = S0; for(s=(char*)as;; s++) { c = *s; if(c >= '0' && c <= '9') { switch(state) { case S0: case S1: case S2: state = S2; break; case S3: case S4: state = S4; break; case S5: case S6: case S7: state = S7; ex = ex*10 + (c-'0'); continue; } if(na == 0 && c == '0') { dp--; continue; } if(na < Ndig-50) a[na++] = c; continue; } switch(c) { case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': if(state == S0) continue; break; case '-': if(state == S0) flag |= Fsign; else flag |= Fesign; case '+': if(state == S0) state = S1; else if(state == S5) state = S6; else break; /* syntax */ continue; case '.': flag |= Fdpoint; dp = na; if(state == S0 || state == S1) { state = S3; continue; } if(state == S2) { state = S4; continue; } break; case 'e': case 'E': if(state == S2 || state == S4) { state = S5; continue; } break; } break; } /* * clean up return char-pointer */ switch(state) { case S0: if(xcmp(s, "nan") == 0) { if(aas != nil) *aas = s+3; goto retnan; } case S1: if(xcmp(s, "infinity") == 0) { if(aas != nil) *aas = s+8; goto retinf; } if(xcmp(s, "inf") == 0) { if(aas != nil) *aas = s+3; goto retinf; } case S3: if(aas != nil) *aas = (char*)as; goto ret0; /* no digits found */ case S6: s--; /* back over +- */ case S5: s--; /* back over e */ break; } if(aas != nil) *aas = s; if(flag & Fdpoint) while(na > 0 && a[na-1] == '0') na--; if(na == 0) goto ret0; /* zero */ a[na] = 0; if(!(flag & Fdpoint)) dp = na; if(flag & Fesign) ex = -ex; dp += ex; if(dp < -Maxe){ errno = ERANGE; goto ret0; /* underflow by exp */ } else if(dp > +Maxe) goto retinf; /* overflow by exp */ /* * normalize the decimal ascii number * to range .[5-9][0-9]* e0 */ bp = 0; /* binary exponent */ while(dp > 0) divascii(a, &na, &dp, &bp); while(dp < 0 || a[0] < '5') mulascii(a, &na, &dp, &bp); /* close approx by naive conversion */ mid[0] = 0; mid[1] = 1; for(i=0; (c=a[i]) != '\0'; i++) { mid[0] = mid[0]*10 + (c-'0'); mid[1] = mid[1]*10; if(i >= 8) break; } low[0] = umuldiv(mid[0], One, mid[1]); hig[0] = umuldiv(mid[0]+1, One, mid[1]); for(i=1; i>= 1; } frnorm(mid); /* compare */ c = fpcmp(a, mid); if(c > 0) { c = 1; for(i=0; i= Sigbit/2) { mid[Prec-1] += Sigbit; frnorm(mid); } goto out; ret0: return 0; retnan: return __NaN(); retinf: /* * Unix strtod requires these. Plan 9 would return Inf(0) or Inf(-1). */ errno = ERANGE; if(flag & Fsign) return -HUGE_VAL; return HUGE_VAL; out: d = 0; for(i=0; i0; i--) { f[i] += c; c = f[i] >> Nbits; f[i] &= One-1; } f[0] += c; } static int fpcmp(char *a, ulong* f) { ulong tf[Prec]; int i, d, c; for(i=0; i> Nbits) + '0'; tf[0] &= One-1; /* compare next digit */ c = *a; if(c == 0) { if('0' < d) return -1; if(tf[0] != 0) goto cont; for(i=1; i d) return +1; if(c < d) return -1; a++; cont:; } } static void divby(char *a, int *na, int b) { int n, c; char *p; p = a; n = 0; while(n>>b == 0) { c = *a++; if(c == 0) { while(n) { c = n*10; if(c>>b) break; n = c; } goto xx; } n = n*10 + c-'0'; (*na)--; } for(;;) { c = n>>b; n -= c<>b; n -= c<= (int)(nelem(tab1))) d = (int)(nelem(tab1))-1; t = tab1 + d; b = t->bp; if(memcmp(a, t->cmp, t->siz) > 0) d--; *dp -= d; *bp += b; divby(a, na, b); } static void mulby(char *a, char *p, char *q, int b) { int n, c; n = 0; *p = 0; for(;;) { q--; if(q < a) break; c = *q - '0'; c = (c<= (int)(nelem(tab2))) d = (int)(nelem(tab2))-1; t = tab2 + d; b = t->bp; if(memcmp(a, t->cmp, t->siz) < 0) d--; p = a + *na; *bp -= b; *dp += d; *na += d; mulby(a, p+d, p, b); } static int xcmp(char *a, char *b) { int c1, c2; while((c1 = *b++) != '\0') { c2 = *a++; if(isupper(c2)) c2 = tolower(c2); if(c1 != c2) return 1; } return 0; } 9base-6/lib9/fmt/LICENSE0000644000175000017500000000175611402154555014211 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson, * with contributions from Mike Burrows and Sean Dorward. * * Copyright (c) 2002-2006 by Lucent Technologies. * Portions Copyright (c) 2004 Google Inc. * * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ This is a Unix port of the Plan 9 formatted I/O package. Please send comments about the packaging to Russ Cox . 9base-6/lib9/fmt/fmtnull.c0000644000175000017500000000101111402154555015011 0ustar anselmanselm/* Copyright (c) 2004 Google Inc.; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * Absorb output without using resources. */ static Rune nullbuf[32]; static int __fmtnullflush(Fmt *f) { f->to = nullbuf; f->nfmt = 0; return 0; } int fmtnullinit(Fmt *f) { memset(f, 0, sizeof *f); f->runes = 1; f->start = nullbuf; f->to = nullbuf; f->stop = nullbuf+nelem(nullbuf); f->flush = __fmtnullflush; fmtlocaleinit(f, nil, nil, nil); return 0; } 9base-6/lib9/fmt/errfmt.c0000644000175000017500000000040611402154555014636 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int __errfmt(Fmt *f) { char *s; s = strerror(errno); return fmtstrcpy(f, s); } 9base-6/lib9/fmt/runesnprint.c0000644000175000017500000000051111402154555015723 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int runesnprint(Rune *buf, int len, char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = runevsnprint(buf, len, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/vfprint.c0000644000175000017500000000057511402154555015036 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int vfprint(int fd, char *fmt, va_list args) { Fmt f; char buf[256]; int n; fmtfdinit(&f, fd, buf, sizeof(buf)); VA_COPY(f.args,args); n = dofmt(&f, fmt); VA_END(f.args); if(n > 0 && __fmtFdFlush(&f) == 0) return -1; return n; } 9base-6/lib9/fmt/runesprint.c0000644000175000017500000000047611402154555015557 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int runesprint(Rune *buf, char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = runevsnprint(buf, 256, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/snprint.c0000644000175000017500000000045511402154555015040 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int snprint(char *buf, int len, char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = vsnprint(buf, len, fmt, args); va_end(args); return n; } 9base-6/lib9/fmt/charstod.c0000644000175000017500000000243511402154555015152 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * Reads a floating-point number by interpreting successive characters * returned by (*f)(vp). The last call it makes to f terminates the * scan, so is not a character in the number. It may therefore be * necessary to back up the input stream up one byte after calling charstod. */ double fmtcharstod(int(*f)(void*), void *vp) { double num, dem; int neg, eneg, dig, exp, c; num = 0; neg = 0; dig = 0; exp = 0; eneg = 0; c = (*f)(vp); while(c == ' ' || c == '\t') c = (*f)(vp); if(c == '-' || c == '+'){ if(c == '-') neg = 1; c = (*f)(vp); } while(c >= '0' && c <= '9'){ num = num*10 + c-'0'; c = (*f)(vp); } if(c == '.') c = (*f)(vp); while(c >= '0' && c <= '9'){ num = num*10 + c-'0'; dig++; c = (*f)(vp); } if(c == 'e' || c == 'E'){ c = (*f)(vp); if(c == '-' || c == '+'){ if(c == '-'){ dig = -dig; eneg = 1; } c = (*f)(vp); } while(c >= '0' && c <= '9'){ exp = exp*10 + c-'0'; c = (*f)(vp); } } exp -= dig; if(exp < 0){ exp = -exp; eneg = !eneg; } dem = __fmtpow10(exp); if(eneg) num /= dem; else num *= dem; if(neg) return -num; return num; } 9base-6/lib9/fmt/nan.h0000644000175000017500000000016211402154555014117 0ustar anselmanselmextern double __NaN(void); extern double __Inf(int); extern int __isNaN(double); extern int __isInf(double, int); 9base-6/lib9/fmt/runesmprint.c0000644000175000017500000000045611402154555015732 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" Rune* runesmprint(char *fmt, ...) { va_list args; Rune *p; va_start(args, fmt); p = runevsmprint(fmt, args); va_end(args); return p; } 9base-6/lib9/fmt/fmtlocale.c0000644000175000017500000000250411402154555015306 0ustar anselmanselm/* Copyright (c) 2004 Google Inc.; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * Fill in the internationalization stuff in the State structure. * For nil arguments, provide the sensible defaults: * decimal is a period * thousands separator is a comma * thousands are marked every three digits */ void fmtlocaleinit(Fmt *f, char *decimal, char *thousands, char *grouping) { if(decimal == nil || decimal[0] == '\0') decimal = "."; if(thousands == nil) thousands = ","; if(grouping == nil) grouping = "\3"; f->decimal = decimal; f->thousands = thousands; f->grouping = grouping; } /* * We are about to emit a digit in e.g. %'d. If that digit would * overflow a thousands (e.g.) grouping, tell the caller to emit * the thousands separator. Always advance the digit counter * and pointer into the grouping descriptor. */ int __needsep(int *ndig, char **grouping) { int group; (*ndig)++; group = *(unsigned char*)*grouping; /* CHAR_MAX means no further grouping. \0 means we got the empty string */ if(group == 0xFF || group == 0x7f || group == 0x00) return 0; if(*ndig > group){ /* if we're at end of string, continue with this grouping; else advance */ if((*grouping)[1] != '\0') (*grouping)++; *ndig = 1; return 1; } return 0; } 9base-6/lib9/fmt/fmtstr.c0000644000175000017500000000044411402154555014660 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" char* fmtstrflush(Fmt *f) { if(f->start == nil) return nil; *(char*)f->to = '\0'; f->to = f->start; return (char*)f->start; } 9base-6/lib9/fmt/fmtprint.c0000644000175000017500000000115011402154555015177 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * format a string into the output buffer * designed for formats which themselves call fmt, * but ignore any width flags */ int fmtprint(Fmt *f, char *fmt, ...) { va_list va; int n; f->flags = 0; f->width = 0; f->prec = 0; VA_COPY(va, f->args); VA_END(f->args); va_start(f->args, fmt); n = dofmt(f, fmt); va_end(f->args); f->flags = 0; f->width = 0; f->prec = 0; VA_COPY(f->args,va); VA_END(va); if(n >= 0) return 0; return n; } 9base-6/lib9/fmt/fmt.c0000644000175000017500000000676711402154555014145 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" enum { Maxfmt = 64 }; typedef struct Convfmt Convfmt; struct Convfmt { int c; volatile Fmts fmt; /* for spin lock in fmtfmt; avoids race due to write order */ }; static struct { /* lock by calling __fmtlock, __fmtunlock */ int nfmt; Convfmt fmt[Maxfmt]; } fmtalloc; static Convfmt knownfmt[] = { ' ', __flagfmt, '#', __flagfmt, '%', __percentfmt, '\'', __flagfmt, '+', __flagfmt, ',', __flagfmt, '-', __flagfmt, 'C', __runefmt, /* Plan 9 addition */ 'E', __efgfmt, #ifndef PLAN9PORT 'F', __efgfmt, /* ANSI only */ #endif 'G', __efgfmt, #ifndef PLAN9PORT 'L', __flagfmt, /* ANSI only */ #endif 'S', __runesfmt, /* Plan 9 addition */ 'X', __ifmt, 'b', __ifmt, /* Plan 9 addition */ 'c', __charfmt, 'd', __ifmt, 'e', __efgfmt, 'f', __efgfmt, 'g', __efgfmt, 'h', __flagfmt, #ifndef PLAN9PORT 'i', __ifmt, /* ANSI only */ #endif 'l', __flagfmt, 'n', __countfmt, 'o', __ifmt, 'p', __ifmt, 'r', __errfmt, 's', __strfmt, #ifdef PLAN9PORT 'u', __flagfmt, #else 'u', __ifmt, #endif 'x', __ifmt, 0, nil, }; int (*fmtdoquote)(int); /* * __fmtlock() must be set */ static int __fmtinstall(int c, Fmts f) { Convfmt *p, *ep; if(c<=0 || c>=65536) return -1; if(!f) f = __badfmt; ep = &fmtalloc.fmt[fmtalloc.nfmt]; for(p=fmtalloc.fmt; pc == c) break; if(p == &fmtalloc.fmt[Maxfmt]) return -1; p->fmt = f; if(p == ep){ /* installing a new format character */ fmtalloc.nfmt++; p->c = c; } return 0; } int fmtinstall(int c, int (*f)(Fmt*)) { int ret; __fmtlock(); ret = __fmtinstall(c, f); __fmtunlock(); return ret; } static Fmts fmtfmt(int c) { Convfmt *p, *ep; ep = &fmtalloc.fmt[fmtalloc.nfmt]; for(p=fmtalloc.fmt; pc == c){ while(p->fmt == nil) /* loop until value is updated */ ; return p->fmt; } /* is this a predefined format char? */ __fmtlock(); for(p=knownfmt; p->c; p++) if(p->c == c){ __fmtinstall(p->c, p->fmt); __fmtunlock(); return p->fmt; } __fmtunlock(); return __badfmt; } void* __fmtdispatch(Fmt *f, void *fmt, int isrunes) { Rune rune, r; int i, n; f->flags = 0; f->width = f->prec = 0; for(;;){ if(isrunes){ r = *(Rune*)fmt; fmt = (Rune*)fmt + 1; }else{ fmt = (char*)fmt + chartorune(&rune, (char*)fmt); r = rune; } f->r = r; switch(r){ case '\0': return nil; case '.': f->flags |= FmtWidth|FmtPrec; continue; case '0': if(!(f->flags & FmtWidth)){ f->flags |= FmtZero; continue; } /* fall through */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = 0; while(r >= '0' && r <= '9'){ i = i * 10 + r - '0'; if(isrunes){ r = *(Rune*)fmt; fmt = (Rune*)fmt + 1; }else{ r = *(char*)fmt; fmt = (char*)fmt + 1; } } if(isrunes) fmt = (Rune*)fmt - 1; else fmt = (char*)fmt - 1; numflag: if(f->flags & FmtWidth){ f->flags |= FmtPrec; f->prec = i; }else{ f->flags |= FmtWidth; f->width = i; } continue; case '*': i = va_arg(f->args, int); if(i < 0){ /* * negative precision => * ignore the precision. */ if(f->flags & FmtPrec){ f->flags &= ~FmtPrec; f->prec = 0; continue; } i = -i; f->flags |= FmtLeft; } goto numflag; } n = (*fmtfmt(r))(f); if(n < 0) return nil; if(n == 0) return fmt; } } 9base-6/lib9/fmt/test3.c0000644000175000017500000000153511402154555014405 0ustar anselmanselm#include #include #include void test(char *fmt, ...) { va_list arg; char fmtbuf[100], stdbuf[100]; va_start(arg, fmt); vsnprint(fmtbuf, sizeof fmtbuf, fmt, arg); va_end(arg); va_start(arg, fmt); vsnprint(stdbuf, sizeof stdbuf, fmt, arg); va_end(arg); if(strcmp(fmtbuf, stdbuf) != 0) print("fmt %s: fmt=\"%s\" std=\"%s\"\n", fmt, fmtbuf, stdbuf); print("fmt %s: %s\n", fmt, fmtbuf); } int main(int argc, char *argv[]) { test("%f", 3.14159); test("%f", 3.14159e10); test("%f", 3.14159e-10); test("%e", 3.14159); test("%e", 3.14159e10); test("%e", 3.14159e-10); test("%g", 3.14159); test("%g", 3.14159e10); test("%g", 3.14159e-10); test("%g", 2e25); test("%.18g", 2e25); test("%2.18g", 1.0); test("%2.18f", 1.0); test("%f", 3.1415927/4); test("%20.10d", 12345); test("%0.10d", 12345); return 0; } 9base-6/lib9/fmt/runefmtstr.c0000644000175000017500000000044111402154555015547 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" Rune* runefmtstrflush(Fmt *f) { if(f->start == nil) return nil; *(Rune*)f->to = '\0'; f->to = f->start; return f->start; } 9base-6/lib9/fmt/vseprint.c0000644000175000017500000000073711402154555015220 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" char* vseprint(char *buf, char *e, char *fmt, va_list args) { Fmt f; if(e <= buf) return nil; f.runes = 0; f.start = buf; f.to = buf; f.stop = e - 1; f.flush = 0; f.farg = nil; f.nfmt = 0; VA_COPY(f.args,args); fmtlocaleinit(&f, nil, nil, nil); dofmt(&f, fmt); VA_END(f.args); *(char*)f.to = '\0'; return (char*)f.to; } 9base-6/lib9/fmt/plan9.h0000644000175000017500000000132111402154555014364 0ustar anselmanselm#include /* * compiler directive on Plan 9 */ #ifndef USED #define USED(x) if(x);else #endif /* * easiest way to make sure these are defined */ #define uchar _fmtuchar #define ushort _fmtushort #define uint _fmtuint #define ulong _fmtulong #define vlong _fmtvlong #define uvlong _fmtuvlong #define uintptr _fmtuintptr typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned long long uvlong; typedef long long vlong; typedef uintptr_t uintptr; /* * nil cannot be ((void*)0) on ANSI C, * because it is used for function pointers */ #undef nil #define nil 0 #undef nelem #define nelem(x) (sizeof (x)/sizeof (x)[0]) 9base-6/lib9/fmt/fmtvprint.c0000644000175000017500000000116111402154555015367 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * format a string into the output buffer * designed for formats which themselves call fmt, * but ignore any width flags */ int fmtvprint(Fmt *f, char *fmt, va_list args) { va_list va; int n; f->flags = 0; f->width = 0; f->prec = 0; VA_COPY(va,f->args); VA_END(f->args); VA_COPY(f->args,args); n = dofmt(f, fmt); f->flags = 0; f->width = 0; f->prec = 0; VA_END(f->args); VA_COPY(f->args,va); VA_END(va); if(n >= 0) return 0; return n; } 9base-6/lib9/fmt/runevsmprint.c0000644000175000017500000000272611402154555016122 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ /* * Plan 9 port version must include libc.h in order to * get Plan 9 debugging malloc, which sometimes returns * different pointers than the standard malloc. */ #ifdef PLAN9PORT #include #include #include "fmtdef.h" #else #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" #endif static int runeFmtStrFlush(Fmt *f) { Rune *s; int n; if(f->start == nil) return 0; n = (uintptr)f->farg; n *= 2; s = (Rune*)f->start; f->start = realloc(s, sizeof(Rune)*n); if(f->start == nil){ f->farg = nil; f->to = nil; f->stop = nil; free(s); return 0; } f->farg = (void*)(uintptr)n; f->to = (Rune*)f->start + ((Rune*)f->to - s); f->stop = (Rune*)f->start + n - 1; return 1; } int runefmtstrinit(Fmt *f) { int n; memset(f, 0, sizeof *f); f->runes = 1; n = 32; f->start = malloc(sizeof(Rune)*n); if(f->start == nil) return -1; f->to = f->start; f->stop = (Rune*)f->start + n - 1; f->flush = runeFmtStrFlush; f->farg = (void*)(uintptr)n; f->nfmt = 0; fmtlocaleinit(f, nil, nil, nil); return 0; } /* * print into an allocated string buffer */ Rune* runevsmprint(char *fmt, va_list args) { Fmt f; int n; if(runefmtstrinit(&f) < 0) return nil; VA_COPY(f.args,args); n = dofmt(&f, fmt); VA_END(f.args); if(f.start == nil) return nil; if(n < 0){ free(f.start); return nil; } *(Rune*)f.to = '\0'; return (Rune*)f.start; } 9base-6/lib9/fmt/vsnprint.c0000644000175000017500000000077511402154555015233 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int vsnprint(char *buf, int len, char *fmt, va_list args) { Fmt f; if(len <= 0) return -1; f.runes = 0; f.start = buf; f.to = buf; f.stop = buf + len - 1; f.flush = 0; f.farg = nil; f.nfmt = 0; VA_COPY(f.args,args); fmtlocaleinit(&f, nil, nil, nil); dofmt(&f, fmt); VA_END(f.args); *(char*)f.to = '\0'; return (char*)f.to - buf; } 9base-6/lib9/fmt/dofmt.c0000644000175000017500000002567311402154555014465 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ /* Copyright (c) 2004 Google Inc.; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* format the output into f->to and return the number of characters fmted */ int dofmt(Fmt *f, char *fmt) { Rune rune, *rt, *rs; int r; char *t, *s; int n, nfmt; nfmt = f->nfmt; for(;;){ if(f->runes){ rt = (Rune*)f->to; rs = (Rune*)f->stop; while((r = *(uchar*)fmt) && r != '%'){ if(r < Runeself) fmt++; else{ fmt += chartorune(&rune, fmt); r = rune; } FMTRCHAR(f, rt, rs, r); } fmt++; f->nfmt += rt - (Rune *)f->to; f->to = rt; if(!r) return f->nfmt - nfmt; f->stop = rs; }else{ t = (char*)f->to; s = (char*)f->stop; while((r = *(uchar*)fmt) && r != '%'){ if(r < Runeself){ FMTCHAR(f, t, s, r); fmt++; }else{ n = chartorune(&rune, fmt); if(t + n > s){ t = (char*)__fmtflush(f, t, n); if(t != nil) s = (char*)f->stop; else return -1; } while(n--) *t++ = *fmt++; } } fmt++; f->nfmt += t - (char *)f->to; f->to = t; if(!r) return f->nfmt - nfmt; f->stop = s; } fmt = (char*)__fmtdispatch(f, fmt, 0); if(fmt == nil) return -1; } } void * __fmtflush(Fmt *f, void *t, int len) { if(f->runes) f->nfmt += (Rune*)t - (Rune*)f->to; else f->nfmt += (char*)t - (char *)f->to; f->to = t; if(f->flush == 0 || (*f->flush)(f) == 0 || (char*)f->to + len > (char*)f->stop){ f->stop = f->to; return nil; } return f->to; } /* * put a formatted block of memory sz bytes long of n runes into the output buffer, * left/right justified in a field of at least f->width characters (if FmtWidth is set) */ int __fmtpad(Fmt *f, int n) { char *t, *s; int i; t = (char*)f->to; s = (char*)f->stop; for(i = 0; i < n; i++) FMTCHAR(f, t, s, ' '); f->nfmt += t - (char *)f->to; f->to = t; return 0; } int __rfmtpad(Fmt *f, int n) { Rune *t, *s; int i; t = (Rune*)f->to; s = (Rune*)f->stop; for(i = 0; i < n; i++) FMTRCHAR(f, t, s, ' '); f->nfmt += t - (Rune *)f->to; f->to = t; return 0; } int __fmtcpy(Fmt *f, const void *vm, int n, int sz) { Rune *rt, *rs, r; char *t, *s, *m, *me; ulong fl; int nc, w; m = (char*)vm; me = m + sz; fl = f->flags; w = 0; if(fl & FmtWidth) w = f->width; if((fl & FmtPrec) && n > f->prec) n = f->prec; if(f->runes){ if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0) return -1; rt = (Rune*)f->to; rs = (Rune*)f->stop; for(nc = n; nc > 0; nc--){ r = *(uchar*)m; if(r < Runeself) m++; else if((me - m) >= UTFmax || fullrune(m, me-m)) m += chartorune(&r, m); else break; FMTRCHAR(f, rt, rs, r); } f->nfmt += rt - (Rune *)f->to; f->to = rt; if(fl & FmtLeft && __rfmtpad(f, w - n) < 0) return -1; }else{ if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0) return -1; t = (char*)f->to; s = (char*)f->stop; for(nc = n; nc > 0; nc--){ r = *(uchar*)m; if(r < Runeself) m++; else if((me - m) >= UTFmax || fullrune(m, me-m)) m += chartorune(&r, m); else break; FMTRUNE(f, t, s, r); } f->nfmt += t - (char *)f->to; f->to = t; if(fl & FmtLeft && __fmtpad(f, w - n) < 0) return -1; } return 0; } int __fmtrcpy(Fmt *f, const void *vm, int n) { Rune r, *m, *me, *rt, *rs; char *t, *s; ulong fl; int w; m = (Rune*)vm; fl = f->flags; w = 0; if(fl & FmtWidth) w = f->width; if((fl & FmtPrec) && n > f->prec) n = f->prec; if(f->runes){ if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0) return -1; rt = (Rune*)f->to; rs = (Rune*)f->stop; for(me = m + n; m < me; m++) FMTRCHAR(f, rt, rs, *m); f->nfmt += rt - (Rune *)f->to; f->to = rt; if(fl & FmtLeft && __rfmtpad(f, w - n) < 0) return -1; }else{ if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0) return -1; t = (char*)f->to; s = (char*)f->stop; for(me = m + n; m < me; m++){ r = *m; FMTRUNE(f, t, s, r); } f->nfmt += t - (char *)f->to; f->to = t; if(fl & FmtLeft && __fmtpad(f, w - n) < 0) return -1; } return 0; } /* fmt out one character */ int __charfmt(Fmt *f) { char x[1]; x[0] = va_arg(f->args, int); f->prec = 1; return __fmtcpy(f, (const char*)x, 1, 1); } /* fmt out one rune */ int __runefmt(Fmt *f) { Rune x[1]; x[0] = va_arg(f->args, int); return __fmtrcpy(f, (const void*)x, 1); } /* public helper routine: fmt out a null terminated string already in hand */ int fmtstrcpy(Fmt *f, char *s) { int i, j; if(!s) return __fmtcpy(f, "", 5, 5); /* if precision is specified, make sure we don't wander off the end */ if(f->flags & FmtPrec){ #ifdef PLAN9PORT Rune r; i = 0; for(j=0; jprec && s[i]; j++) i += chartorune(&r, s+i); #else /* ANSI requires precision in bytes, not Runes */ for(i=0; iprec; i++) if(s[i] == 0) break; j = utfnlen(s, i); /* won't print partial at end */ #endif return __fmtcpy(f, s, j, i); } return __fmtcpy(f, s, utflen(s), strlen(s)); } /* fmt out a null terminated utf string */ int __strfmt(Fmt *f) { char *s; s = va_arg(f->args, char *); return fmtstrcpy(f, s); } /* public helper routine: fmt out a null terminated rune string already in hand */ int fmtrunestrcpy(Fmt *f, Rune *s) { Rune *e; int n, p; if(!s) return __fmtcpy(f, "", 5, 5); /* if precision is specified, make sure we don't wander off the end */ if(f->flags & FmtPrec){ p = f->prec; for(n = 0; n < p; n++) if(s[n] == 0) break; }else{ for(e = s; *e; e++) ; n = e - s; } return __fmtrcpy(f, s, n); } /* fmt out a null terminated rune string */ int __runesfmt(Fmt *f) { Rune *s; s = va_arg(f->args, Rune *); return fmtrunestrcpy(f, s); } /* fmt a % */ int __percentfmt(Fmt *f) { Rune x[1]; x[0] = f->r; f->prec = 1; return __fmtrcpy(f, (const void*)x, 1); } /* fmt an integer */ int __ifmt(Fmt *f) { char buf[140], *p, *conv; /* 140: for 64 bits of binary + 3-byte sep every 4 digits */ uvlong vu; ulong u; int neg, base, i, n, fl, w, isv; int ndig, len, excess, bytelen; char *grouping; char *thousands; neg = 0; fl = f->flags; isv = 0; vu = 0; u = 0; #ifndef PLAN9PORT /* * Unsigned verbs for ANSI C */ switch(f->r){ case 'o': case 'p': case 'u': case 'x': case 'X': fl |= FmtUnsigned; fl &= ~(FmtSign|FmtSpace); break; } #endif if(f->r == 'p'){ u = (ulong)va_arg(f->args, void*); f->r = 'x'; fl |= FmtUnsigned; }else if(fl & FmtVLong){ isv = 1; if(fl & FmtUnsigned) vu = va_arg(f->args, uvlong); else vu = va_arg(f->args, vlong); }else if(fl & FmtLong){ if(fl & FmtUnsigned) u = va_arg(f->args, ulong); else u = va_arg(f->args, long); }else if(fl & FmtByte){ if(fl & FmtUnsigned) u = (uchar)va_arg(f->args, int); else u = (char)va_arg(f->args, int); }else if(fl & FmtShort){ if(fl & FmtUnsigned) u = (ushort)va_arg(f->args, int); else u = (short)va_arg(f->args, int); }else{ if(fl & FmtUnsigned) u = va_arg(f->args, uint); else u = va_arg(f->args, int); } conv = "0123456789abcdef"; grouping = "\4"; /* for hex, octal etc. (undefined by spec but nice) */ thousands = f->thousands; switch(f->r){ case 'd': case 'i': case 'u': base = 10; grouping = f->grouping; break; case 'X': conv = "0123456789ABCDEF"; /* fall through */ case 'x': base = 16; thousands = ":"; break; case 'b': base = 2; thousands = ":"; break; case 'o': base = 8; break; default: return -1; } if(!(fl & FmtUnsigned)){ if(isv && (vlong)vu < 0){ vu = -(vlong)vu; neg = 1; }else if(!isv && (long)u < 0){ u = -(long)u; neg = 1; } } p = buf + sizeof buf - 1; n = 0; /* in runes */ excess = 0; /* number of bytes > number runes */ ndig = 0; len = utflen(thousands); bytelen = strlen(thousands); if(isv){ while(vu){ i = vu % base; vu /= base; if((fl & FmtComma) && n % 4 == 3){ *p-- = ','; n++; } if((fl & FmtApost) && __needsep(&ndig, &grouping)){ n += len; excess += bytelen - len; p -= bytelen; memmove(p+1, thousands, bytelen); } *p-- = conv[i]; n++; } }else{ while(u){ i = u % base; u /= base; if((fl & FmtComma) && n % 4 == 3){ *p-- = ','; n++; } if((fl & FmtApost) && __needsep(&ndig, &grouping)){ n += len; excess += bytelen - len; p -= bytelen; memmove(p+1, thousands, bytelen); } *p-- = conv[i]; n++; } } if(n == 0){ /* * "The result of converting a zero value with * a precision of zero is no characters." - ANSI * * "For o conversion, # increases the precision, if and only if * necessary, to force the first digit of the result to be a zero * (if the value and precision are both 0, a single 0 is printed)." - ANSI */ if(!(fl & FmtPrec) || f->prec != 0 || (f->r == 'o' && (fl & FmtSharp))){ *p-- = '0'; n = 1; if(fl & FmtApost) __needsep(&ndig, &grouping); } /* * Zero values don't get 0x. */ if(f->r == 'x' || f->r == 'X') fl &= ~FmtSharp; } for(w = f->prec; n < w && p > buf+3; n++){ if((fl & FmtApost) && __needsep(&ndig, &grouping)){ n += len; excess += bytelen - len; p -= bytelen; memmove(p+1, thousands, bytelen); } *p-- = '0'; } if(neg || (fl & (FmtSign|FmtSpace))) n++; if(fl & FmtSharp){ if(base == 16) n += 2; else if(base == 8){ if(p[1] == '0') fl &= ~FmtSharp; else n++; } } if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){ w = 0; if(fl & FmtWidth) w = f->width; for(; n < w && p > buf+3; n++){ if((fl & FmtApost) && __needsep(&ndig, &grouping)){ n += len; excess += bytelen - len; p -= bytelen; memmove(p+1, thousands, bytelen); } *p-- = '0'; } f->flags &= ~FmtWidth; } if(fl & FmtSharp){ if(base == 16) *p-- = f->r; if(base == 16 || base == 8) *p-- = '0'; } if(neg) *p-- = '-'; else if(fl & FmtSign) *p-- = '+'; else if(fl & FmtSpace) *p-- = ' '; f->flags &= ~FmtPrec; return __fmtcpy(f, p + 1, n, n + excess); } int __countfmt(Fmt *f) { void *p; ulong fl; fl = f->flags; p = va_arg(f->args, void*); if(fl & FmtVLong){ *(vlong*)p = f->nfmt; }else if(fl & FmtLong){ *(long*)p = f->nfmt; }else if(fl & FmtByte){ *(char*)p = f->nfmt; }else if(fl & FmtShort){ *(short*)p = f->nfmt; }else{ *(int*)p = f->nfmt; } return 0; } int __flagfmt(Fmt *f) { switch(f->r){ case ',': f->flags |= FmtComma; break; case '-': f->flags |= FmtLeft; break; case '+': f->flags |= FmtSign; break; case '#': f->flags |= FmtSharp; break; case '\'': f->flags |= FmtApost; break; case ' ': f->flags |= FmtSpace; break; case 'u': f->flags |= FmtUnsigned; break; case 'h': if(f->flags & FmtShort) f->flags |= FmtByte; f->flags |= FmtShort; break; case 'L': f->flags |= FmtLDouble; break; case 'l': if(f->flags & FmtLong) f->flags |= FmtVLong; f->flags |= FmtLong; break; } return 1; } /* default error format */ int __badfmt(Fmt *f) { char x[3]; x[0] = '%'; x[1] = f->r; x[2] = '%'; f->prec = 3; __fmtcpy(f, (const void*)x, 3, 3); return 0; } 9base-6/lib9/fmt/smprint.c0000644000175000017500000000042211402154555015031 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" char* smprint(char *fmt, ...) { va_list args; char *p; va_start(args, fmt); p = vsmprint(fmt, args); va_end(args); return p; } 9base-6/lib9/fmt/seprint.c0000644000175000017500000000045611402154555015030 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" char* seprint(char *buf, char *e, char *fmt, ...) { char *p; va_list args; va_start(args, fmt); p = vseprint(buf, e, fmt, args); va_end(args); return p; } 9base-6/lib9/fmt/strtod.h0000644000175000017500000000017011402154555014661 0ustar anselmanselmextern double __NaN(void); extern double __Inf(int); extern double __isNaN(double); extern double __isInf(double, int); 9base-6/lib9/fmt/dorfmt.c0000644000175000017500000000173111402154555014634 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* format the output into f->to and return the number of characters fmted */ /* BUG: THIS FILE IS NOT UPDATED TO THE NEW SPEC */ int dorfmt(Fmt *f, const Rune *fmt) { Rune *rt, *rs; int r; char *t, *s; int nfmt; nfmt = f->nfmt; for(;;){ if(f->runes){ rt = (Rune*)f->to; rs = (Rune*)f->stop; while((r = *fmt++) && r != '%'){ FMTRCHAR(f, rt, rs, r); } f->nfmt += rt - (Rune *)f->to; f->to = rt; if(!r) return f->nfmt - nfmt; f->stop = rs; }else{ t = (char*)f->to; s = (char*)f->stop; while((r = *fmt++) && r != '%'){ FMTRUNE(f, t, f->stop, r); } f->nfmt += t - (char *)f->to; f->to = t; if(!r) return f->nfmt - nfmt; f->stop = s; } fmt = (Rune*)__fmtdispatch(f, (Rune*)fmt, 1); if(fmt == nil) return -1; } return 0; /* not reached */ } 9base-6/lib9/fmt/vsmprint.c0000644000175000017500000000256111402154555015225 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ /* * Plan 9 port version must include libc.h in order to * get Plan 9 debugging malloc, which sometimes returns * different pointers than the standard malloc. */ #ifdef PLAN9PORT #include #include #include "fmtdef.h" #else #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" #endif static int fmtStrFlush(Fmt *f) { char *s; int n; if(f->start == nil) return 0; n = (uintptr)f->farg; n *= 2; s = (char*)f->start; f->start = realloc(s, n); if(f->start == nil){ f->farg = nil; f->to = nil; f->stop = nil; free(s); return 0; } f->farg = (void*)(uintptr)n; f->to = (char*)f->start + ((char*)f->to - s); f->stop = (char*)f->start + n - 1; return 1; } int fmtstrinit(Fmt *f) { int n; memset(f, 0, sizeof *f); f->runes = 0; n = 32; f->start = malloc(n); if(f->start == nil) return -1; f->to = f->start; f->stop = (char*)f->start + n - 1; f->flush = fmtStrFlush; f->farg = (void*)(uintptr)n; f->nfmt = 0; fmtlocaleinit(f, nil, nil, nil); return 0; } /* * print into an allocated string buffer */ char* vsmprint(char *fmt, va_list args) { Fmt f; int n; if(fmtstrinit(&f) < 0) return nil; VA_COPY(f.args,args); n = dofmt(&f, fmt); VA_END(f.args); if(n < 0){ free(f.start); return nil; } return fmtstrflush(&f); } 9base-6/lib9/fmt/fmtfd.c0000644000175000017500000000124411402154555014440 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" /* * public routine for final flush of a formatting buffer * to a file descriptor; returns total char count. */ int fmtfdflush(Fmt *f) { if(__fmtFdFlush(f) <= 0) return -1; return f->nfmt; } /* * initialize an output buffer for buffered printing */ int fmtfdinit(Fmt *f, int fd, char *buf, int size) { f->runes = 0; f->start = buf; f->to = buf; f->stop = buf + size; f->flush = __fmtFdFlush; f->farg = (void*)(uintptr_t)fd; f->flags = 0; f->nfmt = 0; fmtlocaleinit(f, nil, nil, nil); return 0; } 9base-6/lib9/fmt/nan64.c0000644000175000017500000000225411402154555014270 0ustar anselmanselm/* * 64-bit IEEE not-a-number routines. * This is big/little-endian portable assuming that * the 64-bit doubles and 64-bit integers have the * same byte ordering. */ #include "plan9.h" #include #include "fmt.h" #include "fmtdef.h" static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001; static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000; static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000; /* gcc sees through the obvious casts. */ static uvlong d2u(double d) { union { uvlong v; double d; } u; assert(sizeof(u.d) == sizeof(u.v)); u.d = d; return u.v; } static double u2d(uvlong v) { union { uvlong v; double d; } u; assert(sizeof(u.d) == sizeof(u.v)); u.v = v; return u.d; } double __NaN(void) { return u2d(uvnan); } int __isNaN(double d) { uvlong x; x = d2u(d); /* IEEE 754: exponent bits 0x7FF and non-zero mantissa */ return (x&uvinf) == uvinf && (x&~uvneginf) != 0; } double __Inf(int sign) { return u2d(sign < 0 ? uvneginf : uvinf); } int __isInf(double d, int sign) { uvlong x; x = d2u(d); if(sign == 0) return x==uvinf || x==uvneginf; else if(sign > 0) return x==uvinf; else return x==uvneginf; } 9base-6/lib9/fmt/runevseprint.c0000644000175000017500000000077111402154555016110 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" Rune* runevseprint(Rune *buf, Rune *e, char *fmt, va_list args) { Fmt f; if(e <= buf) return nil; f.runes = 1; f.start = buf; f.to = buf; f.stop = e - 1; f.flush = nil; f.farg = nil; f.nfmt = 0; VA_COPY(f.args,args); fmtlocaleinit(&f, nil, nil, nil); dofmt(&f, fmt); VA_END(f.args); *(Rune*)f.to = '\0'; return (Rune*)f.to; } 9base-6/lib9/fmt/test.c0000644000175000017500000000346411402154555014325 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ /* Copyright (c) 2004 Google Inc.; see LICENSE */ #include #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int main(int argc, char *argv[]) { quotefmtinstall(); print("hello world\n"); print("x: %x\n", 0x87654321); print("u: %u\n", 0x87654321); print("d: %d\n", 0x87654321); print("s: %s\n", "hi there"); print("q: %q\n", "hi i'm here"); print("c: %c\n", '!'); print("g: %g %g %g\n", 3.14159, 3.14159e10, 3.14159e-10); print("e: %e %e %e\n", 3.14159, 3.14159e10, 3.14159e-10); print("f: %f %f %f\n", 3.14159, 3.14159e10, 3.14159e-10); print("smiley: %C\n", (Rune)0x263a); print("%g %.18g\n", 2e25, 2e25); print("%2.18g\n", 1.0); print("%2.18f\n", 1.0); print("%f\n", 3.1415927/4); print("%d\n", 23); print("%i\n", 23); print("%0.10d\n", 12345); /* test %4$d formats */ print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222); print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222); print("%3$d %4$*5$06d %2$d %1$d\n", 444, 333, 111, 222, 20); print("%3$hd %4$*5$06d %2$d %1$d\n", 444, 333, (short)111, 222, 20); print("%3$lld %4$*5$06d %2$d %1$d\n", 444, 333, 111LL, 222, 20); /* test %'d formats */ print("%'d %'d %'d\n", 1, 2222, 33333333); print("%'019d\n", 0); print("%08d %08d %08d\n", 1, 2222, 33333333); print("%'08d %'08d %'08d\n", 1, 2222, 33333333); print("%'x %'X %'b\n", 0x11111111, 0xabcd1234, 12345); print("%'lld %'lld %'lld\n", 1LL, 222222222LL, 3333333333333LL); print("%019lld %019lld %019lld\n", 1LL, 222222222LL, 3333333333333LL); print("%'019lld %'019lld %'019lld\n", 1LL, 222222222LL, 3333333333333LL); print("%'020lld %'020lld %'020lld\n", 1LL, 222222222LL, 3333333333333LL); print("%'llx %'llX %'llb\n", 0x111111111111LL, 0xabcd12345678LL, 112342345LL); return 0; } 9base-6/lib9/fmt/portdate0000644000175000017500000000121611402154555014740 0ustar anselmanselmdofmt.c 2004/1225 dorfmt.c 2004/1225 errfmt.c 2004/1225 fltfmt.c 2004/1225 fmt.c 2004/1225 fmtfd.c 2004/1225 fmtlock.c 2004/1225 fmtprint.c 2004/1225 fmtquote.c 2004/1225 fmtrune.c 2004/1225 fmtstr.c 2004/1225 fmtvprint.c 2004/1225 fprint.c 2004/1225 print.c 2004/1225 runefmtstr.c 2004/1225 runeseprint.c 2004/1225 runesmprint.c 2004/1225 runesnprint.c 2004/1225 runesprint.c 2004/1225 runevseprint.c 2004/1225 runevsmprint.c 2004/1225 runevsnprint.c 2004/1225 seprint.c 2004/1225 smprint.c 2004/1225 snprint.c 2004/1225 sprint.c 2004/1225 vfprint.c 2004/1225 vseprint.c 2004/1225 vsmprint.c 2004/1225 vsnprint.c 2004/1225 9base-6/lib9/fmt/README0000644000175000017500000000155311402154555014057 0ustar anselmanselm/* * The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ This is a Unix port of the Plan 9 formatted I/O package. Please send comments about the packaging to Russ Cox . 9base-6/lib9/fmt/runeseprint.c0000644000175000017500000000051211402154555015713 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" Rune* runeseprint(Rune *buf, Rune *e, char *fmt, ...) { Rune *p; va_list args; va_start(args, fmt); p = runevseprint(buf, e, fmt, args); va_end(args); return p; } 9base-6/lib9/fmt/fmtrune.c0000644000175000017500000000066211402154555015023 0ustar anselmanselm/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */ #include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" int fmtrune(Fmt *f, int r) { Rune *rt; char *t; int n; if(f->runes){ rt = (Rune*)f->to; FMTRCHAR(f, rt, f->stop, r); f->to = rt; n = 1; }else{ t = (char*)f->to; FMTRUNE(f, t, f->stop, r); n = t - (char*)f->to; f->to = t; } f->nfmt += n; return 0; } 9base-6/lib9/getwd.c0000644000175000017500000000015211402154555013661 0ustar anselmanselm#include #include #undef getwd char* p9getwd(char *s, int ns) { return getcwd(s, ns); } 9base-6/lib9/dial.c0000644000175000017500000000540311402154555013464 0ustar anselmanselm#include #include #undef accept #undef announce #undef dial #undef setnetmtpt #undef hangup #undef listen #undef netmkaddr #undef reject #include #include #include #include #include #undef unix #define unix xunix int p9dial(char *addr, char *local, char *dummy2, int *dummy3) { char *buf; char *net, *unix; u32int host; int port; int proto; socklen_t sn; int n; struct sockaddr_in sa, sal; struct sockaddr_un su; int s; if(dummy2 || dummy3){ werrstr("cannot handle extra arguments in dial"); return -1; } buf = strdup(addr); if(buf == nil) return -1; if(p9dialparse(buf, &net, &unix, &host, &port) < 0){ free(buf); return -1; } if(strcmp(net, "tcp") == 0) proto = SOCK_STREAM; else if(strcmp(net, "udp") == 0) proto = SOCK_DGRAM; else if(strcmp(net, "unix") == 0) goto Unix; else{ werrstr("can only handle tcp, udp, and unix: not %s", net); free(buf); return -1; } free(buf); if((s = socket(AF_INET, proto, 0)) < 0) return -1; if(local){ buf = strdup(local); if(buf == nil){ close(s); return -1; } if(p9dialparse(buf, &net, &unix, &host, &port) < 0){ badlocal: free(buf); close(s); return -1; } if(unix){ werrstr("bad local address %s for dial %s", local, addr); goto badlocal; } memset(&sal, 0, sizeof sal); memmove(&sal.sin_addr, &local, 4); sal.sin_family = AF_INET; sal.sin_port = htons(port); sn = sizeof n; if(port && getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) >= 0 && n == SOCK_STREAM){ n = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&n, sizeof n); } if(bind(s, (struct sockaddr*)&sal, sizeof sal) < 0) goto badlocal; free(buf); } n = 1; setsockopt(s, SOL_SOCKET, SO_BROADCAST, &n, sizeof n); if(host != 0){ memset(&sa, 0, sizeof sa); memmove(&sa.sin_addr, &host, 4); sa.sin_family = AF_INET; sa.sin_port = htons(port); if(connect(s, (struct sockaddr*)&sa, sizeof sa) < 0){ close(s); return -1; } } if(proto == SOCK_STREAM){ int one = 1; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof one); } return s; Unix: if(local){ werrstr("local address not supported on unix network"); free(buf); return -1; } /* Allow regular files in addition to Unix sockets. */ if((s = open(unix, ORDWR)) >= 0) return s; memset(&su, 0, sizeof su); su.sun_family = AF_UNIX; if(strlen(unix)+1 > sizeof su.sun_path){ werrstr("unix socket name too long"); free(buf); return -1; } strcpy(su.sun_path, unix); free(buf); if((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){ werrstr("socket: %r"); return -1; } if(connect(s, (struct sockaddr*)&su, sizeof su) < 0){ werrstr("connect %s: %r", su.sun_path); close(s); return -1; } return s; } 9base-6/lib9/cistrstr.c0000644000175000017500000000054511402154555014432 0ustar anselmanselm#include #include char* cistrstr(char *s, char *sub) { int c, csub, n; csub = *sub; if(csub == '\0') return s; if(csub >= 'A' && csub <= 'Z') csub -= 'A' - 'a'; sub++; n = strlen(sub); for(; c = *s; s++){ if(c >= 'A' && c <= 'Z') c -= 'A' - 'a'; if(c == csub && cistrncmp(s+1, sub, n) == 0) return s; } return nil; } 9base-6/lib9/udp.c0000644000175000017500000000210611402154555013340 0ustar anselmanselm#include #define NOPLAN9DEFINES #include #include #include #include /* * prefix of all v4 addresses * copied from libip because libc cannot depend on libip */ static uchar v4prefix[IPaddrlen] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0 }; long udpread(int fd, Udphdr *hdr, void *buf, long n) { struct sockaddr_in sin; socklen_t len; len = sizeof sin; n = recvfrom(fd, buf, n, 0, (struct sockaddr*)&sin, &len); if(len != sizeof sin){ werrstr("recvfrom acting weird"); return -1; } if(n < 0) return -1; memset(hdr, 0, sizeof *hdr); memmove(hdr->raddr, v4prefix, IPaddrlen); *(u32int*)(hdr->raddr+12) = *(u32int*)&sin.sin_addr; *(u16int*)hdr->rport = *(u16int*)&sin.sin_port; return n; } long udpwrite(int fd, Udphdr *hdr, void *buf, long n) { struct sockaddr_in sin; memset(&sin, 0, sizeof sin); sin.sin_family = AF_INET; *(u32int*)&sin.sin_addr = *(u32int*)(hdr->raddr+12); *(u16int*)&sin.sin_port = *(u16int*)hdr->rport; return sendto(fd, buf, n, 0, (struct sockaddr*)&sin, sizeof sin); } 9base-6/sed/0000755000175000017500000000000011402154555012321 5ustar anselmanselm9base-6/sed/Makefile0000644000175000017500000000017111402154555013760 0ustar anselmanselm# sed - sed unix port from plan9 # Depends on ../lib9 TARG = sed include ../std.mk pre-uninstall: post-install: 9base-6/sed/sed.10000644000175000017500000001545211402154555013165 0ustar anselmanselm.TH SED 1 .SH NAME sed \- stream editor .SH SYNOPSIS .B sed [ .B -gln ] [ .B -e .I script ] [ .B -f .I sfile ] [ .I file ... ] .SH DESCRIPTION .I Sed copies the named .I files (standard input default) to the standard output, edited according to a script of commands. The .B -f option causes the script to be taken from file .IR sfile ; these options accumulate. If there is just one .B -e option and no .BR -f 's, the flag .B -e may be omitted. The .B -n option suppresses the default output; .B -g causes all substitutions to be global, as if suffixed .BR g . The .B -l option causes .I sed to flush its output buffer after every newline. .PP A script consists of editing commands, one per line, of the following form: .IP [\fIaddress\fR [\fL,\fI address\fR] ] \fIfunction\fR [\fIargument\fR ...] .PP In normal operation .I sed cyclically copies a line of input into a .I pattern space (unless there is something left after a .L D command), applies in sequence all commands whose .I addresses select that pattern space, and at the end of the script copies the pattern space to the standard output (except under .BR -n ) and deletes the pattern space. .PP An .I address is either a decimal number that counts input lines cumulatively across files, a .L $ that addresses the last line of input, or a context address, .BI / regular-expression / \f1, in the style of .IR regexp (7), with the added convention that .L \en matches a newline embedded in the pattern space. .PP A command line with no addresses selects every pattern space. .PP A command line with one address selects each pattern space that matches the address. .PP A command line with two addresses selects the inclusive range from the first pattern space that matches the first address through the next pattern space that matches the second. (If the second address is a number less than or equal to the line number first selected, only one line is selected.) Thereafter the process is repeated, looking again for the first address. .PP Editing commands can be applied to non-selected pattern spaces by use of the negation function .L ! (below). .PP An argument denoted .I text consists of one or more lines, all but the last of which end with .L \e to hide the newline. Backslashes in text are treated like backslashes in the replacement string of an .L s command, and may be used to protect initial blanks and tabs against the stripping that is done on every script line. .PP An argument denoted .I rfile or .I wfile must terminate the command line and must be preceded by exactly one blank. Each .I wfile is created before processing begins. There can be at most 120 distinct .I wfile arguments. .TP \w'\fL!\ \fIfunction\fLXXX'u .B a\e .br .ns .TP .I text Append. Place .I text on the output before reading the next input line. .TP .BI b " label" Branch to the .B : command bearing the .IR label . If .I label is empty, branch to the end of the script. .TP .B c\e .br .ns .TP .I text Change. Delete the pattern space. With 0 or 1 address or at the end of a 2-address range, place .I text on the output. Start the next cycle. .TP .B d Delete the pattern space. Start the next cycle. .TP .B D Delete the initial segment of the pattern space through the first newline. Start the next cycle. .TP .B g Replace the contents of the pattern space by the contents of the hold space. .TP .B G Append the contents of the hold space to the pattern space. .TP .B h Replace the contents of the hold space by the contents of the pattern space. .TP .B H Append the contents of the pattern space to the hold space. .ne 3 .TP .B i\e .br .ns .TP .I text Insert. Place .I text on the standard output. .TP .B n Copy the pattern space to the standard output. Replace the pattern space with the next line of input. .TP .B N Append the next line of input to the pattern space with an embedded newline. (The current line number changes.) .TP .B p Print. Copy the pattern space to the standard output. .TP .B P Copy the initial segment of the pattern space through the first newline to the standard output. .TP .B q Quit. Branch to the end of the script. Do not start a new cycle. .TP .BI r " rfile" Read the contents of .IR rfile . Place them on the output before reading the next input line. .TP .B s/\fIregular-expression\fP/\fIreplacement\fP/\fIflags Substitute the .I replacement string for instances of the .I regular-expression in the pattern space. Any character may be used instead of .LR / . For a fuller description see .IR regexp (7). .I Flags is zero or more of .RS .TP .B g Global. Substitute for all non-overlapping instances of the .I regular expression rather than just the first one. .TP .B p Print the pattern space if a replacement was made. .TP .BI w " wfile" Write. Append the pattern space to .I wfile if a replacement was made. .RE .TP .BI t " label" Test. Branch to the .L : command bearing the .I label if any substitutions have been made since the most recent reading of an input line or execution of a .LR t . If .I label is empty, branch to the end of the script. .TP .B w .I wfile .br Write. Append the pattern space to .IR wfile . .TP .B x Exchange the contents of the pattern and hold spaces. .TP .B y/\fIstring1\fP/\fIstring2\fP/ Transform. Replace all occurrences of characters in .I string1 with the corresponding character in .IR string2 . The lengths of .I string1 and .I string2 must be equal. .TP .BI ! "function" Don't. Apply the .I function (or group, if .I function is .LR { ) only to lines .I not selected by the address(es). .TP .BI : " label" This command does nothing; it bears a .I label for .B b and .B t commands to branch to. .TP .B = Place the current line number on the standard output as a line. .TP .B { Execute the following commands through a matching .L } only when the pattern space is selected. .TP .B " " An empty command is ignored. .ne 4 .SH EXAMPLES .TP .B sed 10q file Print the first 10 lines of the file. .TP .B sed '/^$/d' Delete empty lines from standard input. .TP .B sed 's/UNIX/& system/g' Replace every instance of .L UNIX by .LR "UNIX system" . .PP .EX sed 's/ *$// \fRdrop trailing blanks\fP /^$/d \fRdrop empty lines\fP s/ */\e \fRreplace blanks by newlines\fP /g /^$/d' chapter* .EE .ns .IP Print the files .BR chapter1 , .BR chapter2 , etc. one word to a line. .PP .EX nroff -ms manuscript | sed ' ${ /^$/p \fRif last line of file is empty, print it\fP } //N \fRif current line is empty, append next line\fP /^\en$/D' \fRif two lines are empty, delete the first\fP .EE .ns .IP Delete all but one of each group of empty lines from a formatted manuscript. .SH SOURCE .B \*9/src/cmd/sed.c .SH SEE ALSO .IR ed (1), .IR grep (1), .IR awk (1), .IR lex (1), .IR sam (1), .IR regexp (7) .br L. E. McMahon, `SED \(em A Non-interactive Text Editor', Unix Research System Programmer's Manual, Volume 2. .SH BUGS If input is from a pipe, buffering may consume characters beyond a line on which a .L q command is executed. 9base-6/sed/sed.c0000644000175000017500000006515011402154555013247 0ustar anselmanselm/* * sed -- stream editor * * */ #include #include #include #include enum { DEPTH = 20, /* max nesting depth of {} */ MAXCMDS = 512, /* max sed commands */ ADDSIZE = 10000, /* size of add & read buffer */ MAXADDS = 20, /* max pending adds and reads */ LBSIZE = 8192, /* input line size */ LABSIZE = 50, /* max label name size */ MAXSUB = 10, /* max number of sub reg exp */ MAXFILES = 120 /* max output files */ }; /* An address is a line #, a R.E., "$", a reference to the last * R.E., or nothing. */ typedef struct { enum { A_NONE, A_DOL, A_LINE, A_RE, A_LAST }type; union { long line; /* Line # */ Reprog *rp; /* Compiled R.E. */ } u; } Addr; typedef struct SEDCOM { Addr ad1; /* optional start address */ Addr ad2; /* optional end address */ union { Reprog *re1; /* compiled R.E. */ Rune *text; /* added text or file name */ struct SEDCOM *lb1; /* destination command of branch */ } u; Rune *rhs; /* Right-hand side of substitution */ Biobuf* fcode; /* File ID for read and write */ char command; /* command code -see below */ char gfl; /* 'Global' flag for substitutions */ char pfl; /* 'print' flag for substitutions */ char active; /* 1 => data between start and end */ char negfl; /* negation flag */ } SedCom; /* Command Codes for field SedCom.command */ #define ACOM 01 #define BCOM 020 #define CCOM 02 #define CDCOM 025 #define CNCOM 022 #define COCOM 017 #define CPCOM 023 #define DCOM 03 #define ECOM 015 #define EQCOM 013 #define FCOM 016 #define GCOM 027 #define CGCOM 030 #define HCOM 031 #define CHCOM 032 #define ICOM 04 #define LCOM 05 #define NCOM 012 #define PCOM 010 #define QCOM 011 #define RCOM 06 #define SCOM 07 #define TCOM 021 #define WCOM 014 #define CWCOM 024 #define YCOM 026 #define XCOM 033 typedef struct label { /* Label symbol table */ Rune asc[9]; /* Label name */ SedCom *chain; SedCom *address; /* Command associated with label */ } Label; typedef struct FILE_CACHE { /* Data file control block */ struct FILE_CACHE *next; /* Forward Link */ char *name; /* Name of file */ } FileCache; SedCom pspace[MAXCMDS]; /* Command storage */ SedCom *pend = pspace+MAXCMDS; /* End of command storage */ SedCom *rep = pspace; /* Current fill point */ Reprog *lastre = 0; /* Last regular expression */ Resub subexp[MAXSUB]; /* sub-patterns of pattern match*/ Rune addspace[ADDSIZE]; /* Buffer for a, c, & i commands */ Rune *addend = addspace+ADDSIZE; SedCom *abuf[MAXADDS]; /* Queue of pending adds & reads */ SedCom **aptr = abuf; struct { /* Sed program input control block */ enum PTYPE /* Either on command line or in file */ { P_ARG, P_FILE } type; union PCTL { /* Pointer to data */ Biobuf *bp; char *curr; } pctl; } prog; Rune genbuf[LBSIZE]; /* Miscellaneous buffer */ FileCache *fhead = 0; /* Head of File Cache Chain */ FileCache *ftail = 0; /* Tail of File Cache Chain */ Rune *loc1; /* Start of pattern match */ Rune *loc2; /* End of pattern match */ Rune seof; /* Pattern delimiter char */ Rune linebuf[LBSIZE+1]; /* Input data buffer */ Rune *lbend = linebuf+LBSIZE; /* End of buffer */ Rune *spend = linebuf; /* End of input data */ Rune *cp; /* Current scan point in linebuf */ Rune holdsp[LBSIZE+1]; /* Hold buffer */ Rune *hend = holdsp+LBSIZE; /* End of hold buffer */ Rune *hspend = holdsp; /* End of hold data */ int nflag; /* Command line flags */ int gflag; int lflag; int dolflag; /* Set when at true EOF */ int sflag; /* Set when substitution done */ int jflag; /* Set when jump required */ int delflag; /* Delete current line when set */ long lnum = 0; /* Input line count */ char fname[MAXFILES][40]; /* File name cache */ Biobuf *fcode[MAXFILES]; /* File ID cache */ int nfiles = 0; /* Cache fill point */ Biobuf fout; /* Output stream */ Biobuf bstdin; /* Default input */ Biobuf* f = 0; /* Input data */ Label ltab[LABSIZE]; /* Label name symbol table */ Label *labend = ltab+LABSIZE; /* End of label table */ Label *lab = ltab+1; /* Current Fill point */ int depth = 0; /* {} stack pointer */ Rune bad; /* Dummy err ptr reference */ Rune *badp = &bad; char CGMES[] = "Command garbled: %S"; char TMMES[] = "Too much text: %S"; char LTL[] = "Label too long: %S"; char AD0MES[] = "No addresses allowed: %S"; char AD1MES[] = "Only one address allowed: %S"; void address(Addr *); void arout(void); int cmp(char *, char *); int rcmp(Rune *, Rune *); void command(SedCom *); Reprog *compile(void); Rune *compsub(Rune *, Rune *); void dechain(void); void dosub(Rune *); int ecmp(Rune *, Rune *, int); void enroll(char *); void errexit(void); int executable(SedCom *); void execute(void); void fcomp(void); long getrune(void); Rune *gline(Rune *); int match(Reprog *, Rune *); void newfile(enum PTYPE, char *); int opendata(void); Biobuf *open_file(char *); Rune *place(Rune *, Rune *, Rune *); void quit(char *, char *); int rline(Rune *, Rune *); Label *search(Label *); int substitute(SedCom *); char *text(char *); Rune *stext(Rune *, Rune *); int ycomp(SedCom *); char * trans(int c); void putline(Biobuf *bp, Rune *buf, int n); void main(int argc, char **argv) { int compfl; lnum = 0; Binit(&fout, 1, OWRITE); fcode[nfiles++] = &fout; compfl = 0; if(argc == 1) exits(0); ARGBEGIN{ case 'n': nflag++; continue; case 'f': if(argc <= 1) quit("no pattern-file", 0); newfile(P_FILE, ARGF()); fcomp(); compfl = 1; continue; case 'e': if (argc <= 1) quit("missing pattern", 0); newfile(P_ARG, ARGF()); fcomp(); compfl = 1; continue; case 'g': gflag++; continue; case 'l': lflag++; continue; default: fprint(2, "sed: Unknown flag: %c\n", ARGC()); continue; } ARGEND if(compfl == 0) { if (--argc < 0) quit("missing pattern", 0); newfile(P_ARG, *argv++); fcomp(); } if(depth) quit("Too many {'s", 0); ltab[0].address = rep; dechain(); if(argc <= 0) enroll(0); /* Add stdin to cache */ else while(--argc >= 0) { enroll(*argv++); } execute(); exits(0); } void fcomp(void) { Rune *tp; SedCom *pt, *pt1; int i; Label *lpt; static Rune *p = addspace; static SedCom **cmpend[DEPTH]; /* stack of {} operations */ while (rline(linebuf, lbend) >= 0) { cp = linebuf; comploop: while(*cp == ' ' || *cp == '\t') cp++; if(*cp == '\0' || *cp == '#') continue; if(*cp == ';') { cp++; goto comploop; } address(&rep->ad1); if (rep->ad1.type != A_NONE) { if (rep->ad1.type == A_LAST) { if (!lastre) quit("First RE may not be null", 0); rep->ad1.type = A_RE; rep->ad1.u.rp = lastre; } if(*cp == ',' || *cp == ';') { cp++; address(&rep->ad2); if (rep->ad2.type == A_LAST) { rep->ad1.type = A_RE; rep->ad2.u.rp = lastre; } } else rep->ad2.type = A_NONE; } while(*cp == ' ' || *cp == '\t') cp++; swit: switch(*cp++) { default: quit("Unrecognized command: %S", (char *)linebuf); case '!': rep->negfl = 1; goto swit; case '{': rep->command = BCOM; rep->negfl = !(rep->negfl); cmpend[depth++] = &rep->u.lb1; if(++rep >= pend) quit("Too many commands: %S", (char *) linebuf); if(*cp == '\0') continue; goto comploop; case '}': if(rep->ad1.type != A_NONE) quit(AD0MES, (char *) linebuf); if(--depth < 0) quit("Too many }'s", 0); *cmpend[depth] = rep; if(*cp == 0) continue; goto comploop; case '=': rep->command = EQCOM; if(rep->ad2.type != A_NONE) quit(AD1MES, (char *) linebuf); break; case ':': if(rep->ad1.type != A_NONE) quit(AD0MES, (char *) linebuf); while(*cp == ' ') cp++; tp = lab->asc; while (*cp && *cp != ';' && *cp != ' ' && *cp != '\t' && *cp != '#') { *tp++ = *cp++; if(tp >= &(lab->asc[8])) quit(LTL, (char *) linebuf); } *tp = '\0'; if(lpt = search(lab)) { if(lpt->address) quit("Duplicate labels: %S", (char *) linebuf); } else { lab->chain = 0; lpt = lab; if(++lab >= labend) quit("Too many labels: %S", (char *) linebuf); } lpt->address = rep; if (*cp == '#') continue; rep--; /* reuse this slot */ break; case 'a': rep->command = ACOM; if(rep->ad2.type != A_NONE) quit(AD1MES, (char *) linebuf); if(*cp == '\\') cp++; if(*cp++ != '\n') quit(CGMES, (char *) linebuf); rep->u.text = p; p = stext(p, addend); break; case 'c': rep->command = CCOM; if(*cp == '\\') cp++; if(*cp++ != '\n') quit(CGMES, (char *) linebuf); rep->u.text = p; p = stext(p, addend); break; case 'i': rep->command = ICOM; if(rep->ad2.type != A_NONE) quit(AD1MES, (char *) linebuf); if(*cp == '\\') cp++; if(*cp++ != '\n') quit(CGMES, (char *) linebuf); rep->u.text = p; p = stext(p, addend); break; case 'g': rep->command = GCOM; break; case 'G': rep->command = CGCOM; break; case 'h': rep->command = HCOM; break; case 'H': rep->command = CHCOM; break; case 't': rep->command = TCOM; goto jtcommon; case 'b': rep->command = BCOM; jtcommon: while(*cp == ' ')cp++; if(*cp == '\0') { if(pt = ltab[0].chain) { while(pt1 = pt->u.lb1) pt = pt1; pt->u.lb1 = rep; } else ltab[0].chain = rep; break; } tp = lab->asc; while((*tp++ = *cp++)) if(tp >= &(lab->asc[8])) quit(LTL, (char *) linebuf); cp--; tp[-1] = '\0'; if(lpt = search(lab)) { if(lpt->address) { rep->u.lb1 = lpt->address; } else { pt = lpt->chain; while(pt1 = pt->u.lb1) pt = pt1; pt->u.lb1 = rep; } } else { lab->chain = rep; lab->address = 0; if(++lab >= labend) quit("Too many labels: %S", (char *) linebuf); } break; case 'n': rep->command = NCOM; break; case 'N': rep->command = CNCOM; break; case 'p': rep->command = PCOM; break; case 'P': rep->command = CPCOM; break; case 'r': rep->command = RCOM; if(rep->ad2.type != A_NONE) quit(AD1MES, (char *) linebuf); if(*cp++ != ' ') quit(CGMES, (char *) linebuf); rep->u.text = p; p = stext(p, addend); break; case 'd': rep->command = DCOM; break; case 'D': rep->command = CDCOM; rep->u.lb1 = pspace; break; case 'q': rep->command = QCOM; if(rep->ad2.type != A_NONE) quit(AD1MES, (char *) linebuf); break; case 'l': rep->command = LCOM; break; case 's': rep->command = SCOM; seof = *cp++; if ((rep->u.re1 = compile()) == 0) { if(!lastre) quit("First RE may not be null.", 0); rep->u.re1 = lastre; } rep->rhs = p; if((p = compsub(p, addend)) == 0) quit(CGMES, (char *) linebuf); if(*cp == 'g') { cp++; rep->gfl++; } else if(gflag) rep->gfl++; if(*cp == 'p') { cp++; rep->pfl = 1; } if(*cp == 'P') { cp++; rep->pfl = 2; } if(*cp == 'w') { cp++; if(*cp++ != ' ') quit(CGMES, (char *) linebuf); text(fname[nfiles]); for(i = nfiles - 1; i >= 0; i--) if(cmp(fname[nfiles],fname[i]) == 0) { rep->fcode = fcode[i]; goto done; } if(nfiles >= MAXFILES) quit("Too many files in w commands 1", 0); rep->fcode = open_file(fname[nfiles]); } break; case 'w': rep->command = WCOM; if(*cp++ != ' ') quit(CGMES, (char *) linebuf); text(fname[nfiles]); for(i = nfiles - 1; i >= 0; i--) if(cmp(fname[nfiles], fname[i]) == 0) { rep->fcode = fcode[i]; goto done; } if(nfiles >= MAXFILES){ fprint(2, "sed: Too many files in w commands 2 \n"); fprint(2, "nfiles = %d; MAXF = %d\n", nfiles, MAXFILES); errexit(); } rep->fcode = open_file(fname[nfiles]); break; case 'x': rep->command = XCOM; break; case 'y': rep->command = YCOM; seof = *cp++; if (ycomp(rep) == 0) quit(CGMES, (char *) linebuf); break; } done: if(++rep >= pend) quit("Too many commands, last: %S", (char *) linebuf); if(*cp++ != '\0') { if(cp[-1] == ';') goto comploop; quit(CGMES, (char *) linebuf); } } } Biobuf * open_file(char *name) { Biobuf *bp; int fd; if ((bp = malloc(sizeof(Biobuf))) == 0) quit("Out of memory", 0); if ((fd = open(name, OWRITE)) < 0 && (fd = create(name, OWRITE, 0666)) < 0) quit("Cannot create %s", name); Binit(bp, fd, OWRITE); Bseek(bp, 0, 2); fcode[nfiles++] = bp; return bp; } Rune * compsub(Rune *rhs, Rune *end) { Rune r; while ((r = *cp++) != '\0') { if(r == '\\') { if (rhs < end) *rhs++ = 0xFFFF; else return 0; r = *cp++; if(r == 'n') r = '\n'; } else { if(r == seof) { if (rhs < end) *rhs++ = '\0'; else return 0; return rhs; } } if (rhs < end) *rhs++ = r; else return 0; } return 0; } Reprog * compile(void) { Rune c; char *ep; char expbuf[512]; if((c = *cp++) == seof) /* '//' */ return 0; ep = expbuf; do { if (c == 0 || c == '\n') quit(TMMES, (char *) linebuf); if (c == '\\') { if (ep >= expbuf+sizeof(expbuf)) quit(TMMES, (char *) linebuf); ep += runetochar(ep, &c); if ((c = *cp++) == 'n') c = '\n'; } if (ep >= expbuf+sizeof(expbuf)) quit(TMMES, (char *) linebuf); ep += runetochar(ep, &c); } while ((c = *cp++) != seof); *ep = 0; return lastre = regcomp(expbuf); } void regerror(char *s) { USED(s); quit(CGMES, (char *) linebuf); } void newfile(enum PTYPE type, char *name) { if (type == P_ARG) prog.pctl.curr = name; else if ((prog.pctl.bp = Bopen(name, OREAD)) == 0) quit("Cannot open pattern-file: %s\n", name); prog.type = type; } int rline(Rune *buf, Rune *end) { long c; Rune r; while ((c = getrune()) >= 0) { r = c; if (r == '\\') { if (buf <= end) *buf++ = r; if ((c = getrune()) < 0) break; r = c; } else if (r == '\n') { *buf = '\0'; return(1); } if (buf <= end) *buf++ = r; } *buf = '\0'; return(-1); } long getrune(void) { char *p; long c; Rune r; if (prog.type == P_ARG) { if ((p = prog.pctl.curr) != 0) { if (*p) { prog.pctl.curr += chartorune(&r, p); c = r; } else { c = '\n'; /* fake an end-of-line */ prog.pctl.curr = 0; } } else c = -1; } else if ((c = Bgetrune(prog.pctl.bp)) < 0) Bterm(prog.pctl.bp); return c; } void address(Addr *ap) { int c; long lno; if((c = *cp++) == '$') ap->type = A_DOL; else if(c == '/') { seof = c; if (ap->u.rp = compile()) ap->type = A_RE; else ap->type = A_LAST; } else if (c >= '0' && c <= '9') { lno = c-'0'; while ((c = *cp) >= '0' && c <= '9') lno = lno*10 + *cp++-'0'; if(!lno) quit("line number 0 is illegal",0); ap->type = A_LINE; ap->u.line = lno; } else { cp--; ap->type = A_NONE; } } int cmp(char *a, char *b) /* compare characters */ { while(*a == *b++) if (*a == '\0') return(0); else a++; return(1); } int rcmp(Rune *a, Rune *b) /* compare runes */ { while(*a == *b++) if (*a == '\0') return(0); else a++; return(1); } char * text(char *p) /* extract character string */ { Rune r; while(*cp == '\t' || *cp == ' ') cp++; while (*cp) { if ((r = *cp++) == '\\') if ((r = *cp++) == 0) break;; if (r == '\n') while (*cp == '\t' || *cp == ' ') cp++; p += runetochar(p, &r); } *p++ = '\0'; return p; } Rune * stext(Rune *p, Rune *end) /* extract rune string */ { while(*cp == '\t' || *cp == ' ') cp++; while (*cp) { if (*cp == '\\') if (*++cp == 0) break; if (p >= end-1) quit(TMMES, (char *) linebuf); if ((*p++ = *cp++) == '\n') while(*cp == '\t' || *cp == ' ') cp++; } *p++ = 0; return p; } Label * search (Label *ptr) { Label *rp; for (rp = ltab; rp < ptr; rp++) if(rcmp(rp->asc, ptr->asc) == 0) return(rp); return(0); } void dechain(void) { Label *lptr; SedCom *rptr, *trptr; for(lptr = ltab; lptr < lab; lptr++) { if(lptr->address == 0) quit("Undefined label: %S", (char *) lptr->asc); if(lptr->chain) { rptr = lptr->chain; while(trptr = rptr->u.lb1) { rptr->u.lb1 = lptr->address; rptr = trptr; } rptr->u.lb1 = lptr->address; } } } int ycomp(SedCom *r) { int i; Rune *rp; Rune c, *tsp, highc; Rune *sp; highc = 0; for(tsp = cp; *tsp != seof; tsp++) { if(*tsp == '\\') tsp++; if(*tsp == '\n' || *tsp == '\0') return(0); if (*tsp > highc) highc = *tsp; } tsp++; if ((rp = r->u.text = (Rune *) malloc(sizeof(Rune)*(highc+2))) == 0) quit("Out of memory", 0); *rp++ = highc; /* save upper bound */ for (i = 0; i <= highc; i++) rp[i] = i; sp = cp; while((c = *sp++) != seof) { if(c == '\\' && *sp == 'n') { sp++; c = '\n'; } if((rp[c] = *tsp++) == '\\' && *tsp == 'n') { rp[c] = '\n'; tsp++; } if(rp[c] == seof || rp[c] == '\0') { free(r->u.re1); r->u.re1 = 0; return(0); } } if(*tsp != seof) { free(r->u.re1); r->u.re1 = 0; return(0); } cp = tsp+1; return(1); } void execute(void) { SedCom *ipc; while (spend = gline(linebuf)){ for(ipc = pspace; ipc->command; ) { if (!executable(ipc)) { ipc++; continue; } command(ipc); if(delflag) break; if(jflag) { jflag = 0; if((ipc = ipc->u.lb1) == 0) break; } else ipc++; } if(!nflag && !delflag) putline(&fout, linebuf, spend-linebuf); if(aptr > abuf) { arout(); } delflag = 0; } } /* determine if a statement should be applied to an input line */ int executable(SedCom *ipc) { if (ipc->active) { /* Addr1 satisfied - accept until Addr2 */ if (ipc->active == 1) /* Second line */ ipc->active = 2; switch(ipc->ad2.type) { case A_NONE: /* No second addr; use first */ ipc->active = 0; break; case A_DOL: /* Accept everything */ return !ipc->negfl; case A_LINE: /* Line at end of range? */ if (lnum <= ipc->ad2.u.line) { if (ipc->ad2.u.line == lnum) ipc->active = 0; return !ipc->negfl; } ipc->active = 0; /* out of range */ return ipc->negfl; case A_RE: /* Check for matching R.E. */ if (match(ipc->ad2.u.rp, linebuf)) ipc->active = 0; return !ipc->negfl; default: /* internal error */ quit("Internal error", 0); } } switch (ipc->ad1.type) { /* Check first address */ case A_NONE: /* Everything matches */ return !ipc->negfl; case A_DOL: /* Only last line */ if (dolflag) return !ipc->negfl; break; case A_LINE: /* Check line number */ if (ipc->ad1.u.line == lnum) { ipc->active = 1; /* In range */ return !ipc->negfl; } break; case A_RE: /* Check R.E. */ if (match(ipc->ad1.u.rp, linebuf)) { ipc->active = 1; /* In range */ return !ipc->negfl; } break; default: quit("Internal error", 0); } return ipc->negfl; } int match(Reprog *pattern, Rune *buf) { if (!pattern) return 0; subexp[0].s.rsp = buf; subexp[0].e.rep = 0; if (rregexec(pattern, linebuf, subexp, MAXSUB) > 0) { loc1 = subexp[0].s.rsp; loc2 = subexp[0].e.rep; return 1; } loc1 = loc2 = 0; return 0; } int substitute(SedCom *ipc) { int len; if(!match(ipc->u.re1, linebuf)) return 0; /* * we have at least one match. some patterns, e.g. '$' or '^', can * produce zero-length matches, so during a global substitute we * must bump to the character after a zero-length match to keep from looping. */ sflag = 1; if(ipc->gfl == 0) /* single substitution */ dosub(ipc->rhs); else do{ /* global substitution */ len = loc2-loc1; /* length of match */ dosub(ipc->rhs); /* dosub moves loc2 */ if(*loc2 == 0) /* end of string */ break; if(len == 0) /* zero-length R.E. match */ loc2++; /* bump over zero-length match */ if(*loc2 == 0) /* end of string */ break; } while(match(ipc->u.re1, loc2)); return 1; } void dosub(Rune *rhsbuf) { Rune *lp, *sp; Rune *rp; int c, n; lp = linebuf; sp = genbuf; rp = rhsbuf; while (lp < loc1) *sp++ = *lp++; while(c = *rp++) { if (c == '&') { sp = place(sp, loc1, loc2); continue; } if (c == 0xFFFF && (c = *rp++) >= '1' && c < MAXSUB+'0') { n = c-'0'; if (subexp[n].s.rsp && subexp[n].e.rep) { sp = place(sp, subexp[n].s.rsp, subexp[n].e.rep); continue; } else { fprint(2, "sed: Invalid back reference \\%d\n",n); errexit(); } } *sp++ = c; if (sp >= &genbuf[LBSIZE]) fprint(2, "sed: Output line too long.\n"); } lp = loc2; loc2 = sp - genbuf + linebuf; while (*sp++ = *lp++) if (sp >= &genbuf[LBSIZE]) fprint(2, "sed: Output line too long.\n"); lp = linebuf; sp = genbuf; while (*lp++ = *sp++) ; spend = lp-1; } Rune * place(Rune *sp, Rune *l1, Rune *l2) { while (l1 < l2) { *sp++ = *l1++; if (sp >= &genbuf[LBSIZE]) fprint(2, "sed: Output line too long.\n"); } return(sp); } char * trans(int c) { static char buf[] = "\\x0000"; static char hex[] = "0123456789abcdef"; switch(c) { case '\b': return "\\b"; case '\n': return "\\n"; case '\r': return "\\r"; case '\t': return "\\t"; case '\\': return "\\\\"; } buf[2] = hex[(c>>12)&0xF]; buf[3] = hex[(c>>8)&0xF]; buf[4] = hex[(c>>4)&0xF]; buf[5] = hex[c&0xF]; return buf; } void command(SedCom *ipc) { int i, c; Rune *p1, *p2; char *ucp; Rune *rp; Rune *execp; switch(ipc->command) { case ACOM: *aptr++ = ipc; if(aptr >= abuf+MAXADDS) { quit("sed: Too many appends after line %ld\n", (char *) lnum); } *aptr = 0; break; case CCOM: delflag = 1; if(ipc->active == 1) { for(rp = ipc->u.text; *rp; rp++) Bputrune(&fout, *rp); Bputc(&fout, '\n'); } break; case DCOM: delflag++; break; case CDCOM: p1 = p2 = linebuf; while(*p1 != '\n') { if(*p1++ == 0) { delflag++; return; } } p1++; while(*p2++ = *p1++) ; spend = p2-1; jflag++; break; case EQCOM: Bprint(&fout, "%ld\n", lnum); break; case GCOM: p1 = linebuf; p2 = holdsp; while(*p1++ = *p2++) ; spend = p1-1; break; case CGCOM: *spend++ = '\n'; p1 = spend; p2 = holdsp; while(*p1++ = *p2++) if(p1 >= lbend) break; spend = p1-1; break; case HCOM: p1 = holdsp; p2 = linebuf; while(*p1++ = *p2++); hspend = p1-1; break; case CHCOM: *hspend++ = '\n'; p1 = hspend; p2 = linebuf; while(*p1++ = *p2++) if(p1 >= hend) break; hspend = p1-1; break; case ICOM: for(rp = ipc->u.text; *rp; rp++) Bputrune(&fout, *rp); Bputc(&fout, '\n'); break; case BCOM: jflag = 1; break; case LCOM: c = 0; for (i = 0, rp = linebuf; *rp; rp++) { c = *rp; if(c >= 0x20 && c < 0x7F && c != '\\') { Bputc(&fout, c); if(i++ > 71) { Bprint(&fout, "\\\n"); i = 0; } } else { for (ucp = trans(*rp); *ucp; ucp++){ c = *ucp; Bputc(&fout, c); if(i++ > 71) { Bprint(&fout, "\\\n"); i = 0; } } } } if(c == ' ') Bprint(&fout, "\\n"); Bputc(&fout, '\n'); break; case NCOM: if(!nflag) putline(&fout, linebuf, spend-linebuf); if(aptr > abuf) arout(); if((execp = gline(linebuf)) == 0) { delflag = 1; break; } spend = execp; break; case CNCOM: if(aptr > abuf) arout(); *spend++ = '\n'; if((execp = gline(spend)) == 0) { delflag = 1; break; } spend = execp; break; case PCOM: putline(&fout, linebuf, spend-linebuf); break; case CPCOM: cpcom: for(rp = linebuf; *rp && *rp != '\n'; rp++) Bputc(&fout, *rp); Bputc(&fout, '\n'); break; case QCOM: if(!nflag) putline(&fout, linebuf, spend-linebuf); if(aptr > abuf) arout(); exits(0); case RCOM: *aptr++ = ipc; if(aptr >= &abuf[MAXADDS]) quit("sed: Too many reads after line %ld\n", (char *) lnum); *aptr = 0; break; case SCOM: i = substitute(ipc); if(i && ipc->pfl) if(ipc->pfl == 1) putline(&fout, linebuf, spend-linebuf); else goto cpcom; if(i && ipc->fcode) goto wcom; break; case TCOM: if(sflag == 0) break; sflag = 0; jflag = 1; break; wcom: case WCOM: putline(ipc->fcode,linebuf, spend-linebuf); break; case XCOM: p1 = linebuf; p2 = genbuf; while(*p2++ = *p1++); p1 = holdsp; p2 = linebuf; while(*p2++ = *p1++); spend = p2 - 1; p1 = genbuf; p2 = holdsp; while(*p2++ = *p1++); hspend = p2 - 1; break; case YCOM: p1 = linebuf; p2 = ipc->u.text; for (i = *p2++; *p1; p1++){ if (*p1 <= i) *p1 = p2[*p1]; } break; } } void putline(Biobuf *bp, Rune *buf, int n) { while (n--) Bputrune(bp, *buf++); Bputc(bp, '\n'); if(lflag) Bflush(bp); } int ecmp(Rune *a, Rune *b, int count) { while(count--) if(*a++ != *b++) return(0); return(1); } void arout(void) { Rune *p1; Biobuf *fi; int c; char *s; char buf[128]; for (aptr = abuf; *aptr; aptr++) { if((*aptr)->command == ACOM) { for(p1 = (*aptr)->u.text; *p1; p1++ ) Bputrune(&fout, *p1); Bputc(&fout, '\n'); } else { for(s = buf, p1= (*aptr)->u.text; *p1; p1++) s += runetochar(s, p1); *s = '\0'; if((fi = Bopen(buf, OREAD)) == 0) continue; while((c = Bgetc(fi)) >= 0) Bputc(&fout, c); Bterm(fi); } } aptr = abuf; *aptr = 0; } void errexit(void) { exits("error"); } void quit (char *msg, char *arg) { fprint(2, "sed: "); fprint(2, msg, arg); fprint(2, "\n"); errexit(); } Rune * gline(Rune *addr) { long c; Rune *p; static long peekc = 0; if (f == 0 && opendata() < 0) return 0; sflag = 0; lnum++; /* Bflush(&fout);********* dumped 4/30/92 - bobf****/ do { p = addr; for (c = (peekc ? peekc : Bgetrune(f)); c >= 0; c = Bgetrune(f)) { if (c == '\n') { if ((peekc = Bgetrune(f)) < 0) { if (fhead == 0) dolflag = 1; } *p = '\0'; return p; } if (c && p < lbend) *p++ = c; } /* return partial final line, adding implicit newline */ if(p != addr) { *p = '\0'; peekc = -1; if (fhead == 0) dolflag = 1; return p; } peekc = 0; Bterm(f); } while (opendata() > 0); /* Switch to next stream */ f = 0; return 0; } /* Data file input section - the intent is to transparently * catenate all data input streams. */ void enroll(char *filename) /* Add a file to the input file cache */ { FileCache *fp; if ((fp = (FileCache *) malloc(sizeof (FileCache))) == 0) quit("Out of memory", 0); if (ftail == 0) fhead = fp; else ftail->next = fp; ftail = fp; fp->next = 0; fp->name = filename; /* 0 => stdin */ } int opendata(void) { if (fhead == 0) return -1; if (fhead->name) { if ((f = Bopen(fhead->name, OREAD)) == 0) quit("Can't open %s", fhead->name); } else { Binit(&bstdin, 0, OREAD); f = &bstdin; } fhead = fhead->next; return 1; } 9base-6/troff/0000755000175000017500000000000011402154555012666 5ustar anselmanselm9base-6/troff/n2.c0000644000175000017500000001167711402154555013365 0ustar anselmanselm/* * n2.c * * output, cleanup */ #define _BSD_SOURCE 1 /* popen */ #include "tdef.h" #include "fns.h" #include "ext.h" #include #ifdef STRICT /* not in ANSI or POSIX */ FILE* popen(char*, char*); #endif extern jmp_buf sjbuf; int toolate; int error; char obuf[2*BUFSIZ]; char *obufp = obuf; /* pipe command structure; allows redicously long commends for .pi */ struct Pipe { char *buf; int tick; int cnt; } Pipe; int xon = 0; /* records if in middle of \X */ int pchar(Tchar i) { int j; static int hx = 0; /* records if have seen HX */ if (hx) { hx = 0; j = absmot(i); if (isnmot(i)) { if (j > dip->blss) dip->blss = j; } else { if (j > dip->alss) dip->alss = j; ralss = dip->alss; } return 0; } if (ismot(i)) { pchar1(i); return 0; } switch (j = cbits(i)) { case 0: case IMP: case RIGHT: case LEFT: return 0; case HX: hx = 1; return 0; case XON: xon++; break; case XOFF: xon--; break; case PRESC: if (!xon && !tflg && dip == &d[0]) j = eschar; /* fall through */ default: setcbits(i, trtab[j]); } if (NROFF & xon) /* rob fix for man2html */ return 0; pchar1(i); return 0; } void pchar1(Tchar i) { int j; j = cbits(i); if (dip != &d[0]) { wbf(i); dip->op = offset; return; } if (!tflg && !print) { if (j == '\n') dip->alss = dip->blss = 0; return; } if (j == FILLER && !xon) return; if (tflg) { /* transparent mode, undiverted */ if (print) /* assumes that it's ok to print */ /* OUT "%c", j PUT; /* i.e., is ascii */ outascii(i); return; } if (TROFF && ascii) outascii(i); else ptout(i); } void outweird(int k) /* like ptchname() but ascii */ { char *chn = chname(k); switch (chn[0]) { case MBchar: OUT "%s", chn+1 PUT; /* \n not needed? */ break; case Number: OUT "\\N'%s'", chn+1 PUT; break; case Troffchar: if (strlen(chn+1) == 2) OUT "\\(%s", chn+1 PUT; else OUT "\\C'%s'", chn+1 PUT; break; default: OUT " %s? ", chn PUT; break; } } void outascii(Tchar i) /* print i in best-guess ascii */ { int j = cbits(i); /* is this ever called with NROFF set? probably doesn't work at all. */ if (ismot(i)) oput(' '); else if (j < ALPHABET && j >= ' ' || j == '\n' || j == '\t') oput(j); else if (j == DRAWFCN) oputs("\\D"); else if (j == HYPHEN) oput('-'); else if (j == MINUS) /* special pleading for strange encodings */ oputs("\\-"); else if (j == PRESC) oputs("\\e"); else if (j == FILLER) oputs("\\&"); else if (j == UNPAD) oputs("\\ "); else if (j == OHC) /* this will never occur; stripped out earlier */ oputs("\\%"); else if (j == XON) oputs("\\X"); else if (j == XOFF) oputs(" "); else if (j == LIG_FI) oputs("fi"); else if (j == LIG_FL) oputs("fl"); else if (j == LIG_FF) oputs("ff"); else if (j == LIG_FFI) oputs("ffi"); else if (j == LIG_FFL) oputs("ffl"); else if (j == WORDSP) { /* nothing at all */ if (xon) /* except in \X */ oput(' '); } else outweird(j); } int flusho(void) { if (NROFF && !toolate && t.twinit) fwrite(t.twinit, strlen(t.twinit), 1, ptid); if (obufp > obuf) { if (pipeflg && !toolate) { /* fprintf(stderr, "Pipe to <%s>\n", Pipe.buf); */ if (!Pipe.buf[0] || (ptid = popen(Pipe.buf, "w")) == NULL) ERROR "pipe %s not created.", Pipe.buf WARN; if (Pipe.buf) free(Pipe.buf); } if (!toolate) toolate++; *obufp = 0; fputs(obuf, ptid); fflush(ptid); obufp = obuf; } return 1; } void caseex(void) { done(0); } void done(int x) { int i; error |= x; app = ds = lgf = 0; if (i = em) { donef = -1; eschar = '\\'; em = 0; if (control(i, 0)) longjmp(sjbuf, 1); } if (!nfo) done3(0); mflg = 0; dip = &d[0]; if (woff) /* BUG!!! This isn't set anywhere */ wbf((Tchar)0); if (pendw) getword(1); pendnf = 0; if (donef == 1) done1(0); donef = 1; ip = 0; frame = stk; nxf = frame + 1; if (!ejf) tbreak(); nflush++; eject((Stack *)0); longjmp(sjbuf, 1); } void done1(int x) { error |= x; if (numtabp[NL].val) { trap = 0; eject((Stack *)0); longjmp(sjbuf, 1); } if (!ascii) pttrailer(); done2(0); } void done2(int x) { ptlead(); if (TROFF && !ascii) ptstop(); flusho(); done3(x); } void done3(int x) { error |= x; flusho(); if (NROFF) twdone(); if (pipeflg) pclose(ptid); exit(error); } void edone(int x) { frame = stk; nxf = frame + 1; ip = 0; done(x); } void casepi(void) { int j; char buf[NTM]; if (Pipe.buf == NULL) { if ((Pipe.buf = (char *)calloc(NTM, sizeof(char))) == NULL) { ERROR "No buf space for pipe cmd" WARN; return; } Pipe.tick = 1; } else Pipe.buf[Pipe.cnt++] = '|'; getline(buf, NTM); j = strlen(buf); if (toolate) { ERROR "Cannot create pipe to %s", buf WARN; return; } Pipe.cnt += j; if (j >= NTM +1) { Pipe.tick++; if ((Pipe.buf = (char *)realloc(Pipe.buf, Pipe.tick * NTM * sizeof(char))) == NULL) { ERROR "No more buf space for pipe cmd" WARN; return; } } strcat(Pipe.buf, buf); pipeflg++; } 9base-6/troff/n9.c0000644000175000017500000002160311402154555013362 0ustar anselmanselm#include "tdef.h" #include "ext.h" #include "fns.h" /* * troff9.c * * misc functions */ Tchar setz(void) { Tchar i; if (!ismot(i = getch())) i |= ZBIT; return(i); } void setline(void) { Tchar *i; Tchar c; int length; int j, w, cnt, delim, rem, temp; Tchar linebuf[NC]; if (ismot(c = getch())) return; delim = cbits(c); vflag = 0; dfact = EM; length = quant(atoi0(), HOR); dfact = 1; if (!length) { eat(delim); return; } s0: if ((j = cbits(c = getch())) == delim || j == '\n') { ch = c; c = RULE | chbits; } else if (cbits(c) == FILLER) goto s0; w = width(c); if (w <= 0) { ERROR "zero-width underline character ignored" WARN; c = RULE | chbits; w = width(c); } i = linebuf; if (length < 0) { *i++ = makem(length); length = -length; } if (!(cnt = length / w)) { *i++ = makem(-(temp = ((w - length) / 2))); *i++ = c; *i++ = makem(-(w - length - temp)); goto s1; } if (rem = length % w) { if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN) *i++ = c | ZBIT; *i++ = makem(rem); } if (cnt) { *i++ = RPT; *i++ = cnt; *i++ = c; } s1: *i = 0; eat(delim); pushback(linebuf); } int eat(int c) { int i; while ((i = cbits(getch())) != c && i != '\n') ; return(i); } void setov(void) { int j, k; Tchar i, o[NOV+1]; int delim, w[NOV+1]; if (ismot(i = getch())) return; delim = cbits(i); for (k = 0; k < NOV && (j = cbits(i = getch())) != delim && j != '\n'; k++) { o[k] = i; w[k] = width(i); } o[k] = w[k] = 0; if (o[0]) for (j = 1; j; ) { j = 0; for (k = 1; o[k] ; k++) { if (w[k-1] < w[k]) { j++; i = w[k]; w[k] = w[k-1]; w[k-1] = i; i = o[k]; o[k] = o[k-1]; o[k-1] = i; } } } else return; *pbp++ = makem(w[0] / 2); for (k = 0; o[k]; k++) ; while (k>0) { k--; *pbp++ = makem(-((w[k] + w[k+1]) / 2)); *pbp++ = o[k]; } } void setbra(void) { int k; Tchar i, *j, dwn; int cnt, delim; Tchar brabuf[NC]; if (ismot(i = getch())) return; delim = cbits(i); j = brabuf + 1; cnt = 0; if (NROFF) dwn = (2 * t.Halfline) | MOT | VMOT; else dwn = EM | MOT | VMOT; while ((k = cbits(i = getch())) != delim && k != '\n' && j <= brabuf + NC - 4) { *j++ = i | ZBIT; *j++ = dwn; cnt++; } if (--cnt < 0) return; else if (!cnt) { ch = *(j - 2); return; } *j = 0; if (NROFF) *--j = *brabuf = (cnt * t.Halfline) | MOT | NMOT | VMOT; else *--j = *brabuf = (cnt * EM) / 2 | MOT | NMOT | VMOT; *--j &= ~ZBIT; pushback(brabuf); } void setvline(void) { int i; Tchar c, rem, ver, neg; int cnt, delim, v; Tchar vlbuf[NC]; Tchar *vlp; if (ismot(c = getch())) return; delim = cbits(c); dfact = lss; vflag++; i = quant(atoi0(), VERT); dfact = 1; if (!i) { eat(delim); vflag = 0; return; } if ((cbits(c = getch())) == delim) { c = BOXRULE | chbits; /*default box rule*/ } else getch(); c |= ZBIT; neg = 0; if (i < 0) { i = -i; neg = NMOT; } if (NROFF) v = 2 * t.Halfline; else { v = EM; if (v < VERT) /* ATT EVK hack: Erik van Konijnenburg, */ v = VERT; /* hvlpb!evkonij, ATT NSI Hilversum, Holland */ } cnt = i / v; rem = makem(i % v) | neg; ver = makem(v) | neg; vlp = vlbuf; if (!neg) *vlp++ = ver; if (absmot(rem) != 0) { *vlp++ = c; *vlp++ = rem; } while (vlp < vlbuf + NC - 3 && cnt--) { *vlp++ = c; *vlp++ = ver; } *(vlp - 2) &= ~ZBIT; if (!neg) vlp--; *vlp = 0; pushback(vlbuf); vflag = 0; } #define NPAIR (NC/2-6) /* max pairs in spline, etc. */ void setdraw(void) /* generate internal cookies for a drawing function */ { int i, j, k, dx[NPAIR], dy[NPAIR], delim, type; Tchar c, drawbuf[NC]; int drawch = '.'; /* character to draw with */ /* input is \D'f dx dy dx dy ... c' (or at least it had better be) */ /* this does drawing function f with character c and the */ /* specified dx,dy pairs interpreted as appropriate */ /* pairs are deltas from last point, except for radii */ /* l dx dy: line from here by dx,dy */ /* c x: circle of diameter x, left side here */ /* e x y: ellipse of diameters x,y, left side here */ /* a dx1 dy1 dx2 dy2: ccw arc: ctr at dx1,dy1, then end at dx2,dy2 from there */ /* ~ dx1 dy1 dx2 dy2...: spline to dx1,dy1 to dx2,dy2 ... */ /* b x c: built-up character of type c, ht x */ /* f dx dy ...: f is any other char: like spline */ if (ismot(c = getch())) return; delim = cbits(c); numerr.escarg = type = cbits(getch()); if (type == '~') /* head off the .tr ~ problem */ type = 's'; for (i = 0; i < NPAIR ; i++) { skip(); vflag = 0; dfact = EM; dx[i] = quant(atoi0(), HOR); if (dx[i] > MAXMOT) dx[i] = MAXMOT; else if (dx[i] < -MAXMOT) dx[i] = -MAXMOT; skip(); if (type == 'c') { dy[i] = 0; goto eat; } vflag = 1; dfact = lss; dy[i] = quant(atoi0(), VERT); if (dy[i] > MAXMOT) dy[i] = MAXMOT; else if (dy[i] < -MAXMOT) dy[i] = -MAXMOT; eat: if (cbits(c = getch()) != ' ') { /* must be the end */ if (cbits(c) != delim) { drawch = cbits(c); getch(); } i++; break; } } dfact = 1; vflag = 0; if (TROFF) { drawbuf[0] = DRAWFCN | chbits | ZBIT; drawbuf[1] = type | chbits | ZBIT; drawbuf[2] = drawch | chbits | ZBIT; for (k = 0, j = 3; k < i; k++) { drawbuf[j++] = MOT | ((dx[k] >= 0) ? dx[k] : (NMOT | -dx[k])); drawbuf[j++] = MOT | VMOT | ((dy[k] >= 0) ? dy[k] : (NMOT | -dy[k])); } if (type == DRAWELLIPSE) { drawbuf[5] = drawbuf[4] | NMOT; /* so the net vertical is zero */ j = 6; } else if (type == DRAWBUILD) { drawbuf[4] = drawbuf[3] | NMOT; /* net horizontal motion is zero */ drawbuf[2] &= ~ZBIT; /* width taken from drawing char */ j = 5; } drawbuf[j++] = DRAWFCN | chbits | ZBIT; /* marks end for ptout */ drawbuf[j] = 0; pushback(drawbuf); } } void casefc(void) { int i; Tchar j; gchtab[fc] &= ~FCBIT; fc = IMP; padc = ' '; if (skip() || ismot(j = getch()) || (i = cbits(j)) == '\n') return; fc = i; gchtab[fc] |= FCBIT; if (skip() || ismot(ch) || (ch = cbits(ch)) == fc) return; padc = ch; } Tchar setfield(int x) { Tchar ii, jj, *fp; int i, j; int length, ws, npad, temp, type; Tchar **pp, *padptr[NPP]; Tchar fbuf[FBUFSZ]; int savfc, savtc, savlc; Tchar rchar; int savepos; static Tchar wbuf[] = { WORDSP, 0}; rchar = 0; if (x == tabch) rchar = tabc | chbits; else if (x == ldrch) rchar = dotc | chbits; temp = npad = ws = 0; savfc = fc; savtc = tabch; savlc = ldrch; tabch = ldrch = fc = IMP; savepos = numtabp[HP].val; gchtab[tabch] &= ~TABBIT; gchtab[ldrch] &= ~LDRBIT; gchtab[fc] &= ~FCBIT; gchtab[IMP] |= TABBIT|LDRBIT|FCBIT; for (j = 0; ; j++) { if ((tabtab[j] & TABMASK) == 0) { if (x == savfc) ERROR "zero field width." WARN; jj = 0; goto rtn; } if ((length = ((tabtab[j] & TABMASK) - numtabp[HP].val)) > 0 ) break; } type = tabtab[j] & ~TABMASK; fp = fbuf; pp = padptr; if (x == savfc) { while (1) { j = cbits(ii = getch()); jj = width(ii); widthp = jj; numtabp[HP].val += jj; if (j == padc) { npad++; *pp++ = fp; if (pp > padptr + NPP - 1) break; goto s1; } else if (j == savfc) break; else if (j == '\n') { temp = j; if (nlflg && ip == 0) { numtabp[CD].val--; nlflg = 0; } break; } ws += jj; s1: *fp++ = ii; if (fp > fbuf + FBUFSZ - 3) break; } if (ws) *fp++ = WORDSP; if (!npad) { npad++; *pp++ = fp; *fp++ = 0; } *fp++ = temp; *fp = 0; temp = i = (j = length - ws) / npad; i = (i / HOR) * HOR; if ((j -= i * npad) < 0) j = -j; ii = makem(i); if (temp < 0) ii |= NMOT; for (; npad > 0; npad--) { *(*--pp) = ii; if (j) { j -= HOR; (*(*pp)) += HOR; } } pushback(fbuf); jj = 0; } else if (type == 0) { /*plain tab or leader*/ if ((j = width(rchar)) > 0) { int nchar = length / j; while (nchar-->0 && pbp < &pbbuf[NC-3]) { numtabp[HP].val += j; widthp = j; *pbp++ = rchar; } length %= j; } if (length) jj = length | MOT; else jj = getch0(); if (savepos > 0) pushback(wbuf); } else { /*center tab*/ /*right tab*/ while ((j = cbits(ii = getch())) != savtc && j != '\n' && j != savlc) { jj = width(ii); ws += jj; numtabp[HP].val += jj; widthp = jj; *fp++ = ii; if (fp > fbuf + FBUFSZ - 3) break; } *fp++ = ii; *fp = 0; if (type == RTAB) length -= ws; else length -= ws / 2; /*CTAB*/ pushback(fbuf); if ((j = width(rchar)) != 0 && length > 0) { int nchar = length / j; while (nchar-- > 0 && pbp < &pbbuf[NC-3]) *pbp++ = rchar; length %= j; } if (savepos > 0) pushback(wbuf); length = (length / HOR) * HOR; jj = makem(length); if (nlflg) { if (ip == 0) numtabp[CD].val--; nlflg = 0; } } rtn: gchtab[fc] &= ~FCBIT; gchtab[tabch] &= ~TABBIT; gchtab[ldrch] &= ~LDRBIT; fc = savfc; tabch = savtc; ldrch = savlc; gchtab[fc] |= FCBIT; gchtab[tabch] = TABBIT; gchtab[ldrch] |= LDRBIT; numtabp[HP].val = savepos; return(jj); } 9base-6/troff/n7.c0000644000175000017500000003040211402154555013355 0ustar anselmanselm#define _BSD_SOURCE 1 /* isascii */ #include "tdef.h" #include "fns.h" #include "ext.h" #ifdef STRICT /* not in ANSI or POSIX */ #define isascii(a) ((a) >= 0 && (a) <= 127) #endif #define GETCH gettch Tchar gettch(void); /* * troff7.c * * text */ int brflg; void tbreak(void) { int pad, k; Tchar *i, j; int resol; int un0 = un; trap = 0; if (nb) return; if (dip == d && numtabp[NL].val == -1) { newline(1); return; } if (!nc) { setnel(); if (!wch) return; if (pendw) getword(1); movword(); } else if (pendw && !brflg) { getword(1); movword(); } *linep = dip->nls = 0; if (NROFF && dip == d) horiz(po); if (lnmod) donum(); lastl = ne; if (brflg != 1) { totout = 0; } else if (ad) { if ((lastl = ll - un) < ne) lastl = ne; } if (admod && ad && (brflg != 2)) { lastl = ne; adsp = adrem = 0; if (admod == 1) un += quant(nel / 2, HOR); else if (admod == 2) un += nel; } totout++; brflg = 0; if (lastl + un > dip->maxl) dip->maxl = lastl + un; horiz(un); if (NROFF) { if (adrem % t.Adj) resol = t.Hor; else resol = t.Adj; } else resol = HOR; lastl = ne + (nwd-1) * adsp + adrem; for (i = line; nc > 0; ) { if ((cbits(j = *i++)) == ' ') { pad = 0; do { pad += width(j); nc--; } while ((cbits(j = *i++)) == ' '); i--; pad += adsp; --nwd; if (adrem) { if (adrem < 0) { pad -= resol; adrem += resol; } else if ((totout & 01) || adrem / resol >= nwd) { pad += resol; adrem -= resol; } } pchar((Tchar) WORDSP); horiz(pad); } else { pchar(j); nc--; } } if (ic) { if ((k = ll - un0 - lastl + ics) > 0) horiz(k); pchar(ic); } if (icf) icf++; else ic = 0; ne = nwd = 0; un = in; setnel(); newline(0); if (dip != d) { if (dip->dnl > dip->hnl) dip->hnl = dip->dnl; } else { if (numtabp[NL].val > dip->hnl) dip->hnl = numtabp[NL].val; } for (k = ls - 1; k > 0 && !trap; k--) newline(0); spread = 0; } void donum(void) { int i, nw; int lnv = numtabp[LN].val; nrbits = nmbits; nw = width('1' | nrbits); if (nn) { nn--; goto d1; } if (lnv % ndf) { numtabp[LN].val++; d1: un += nw * (nmwid + nms + ni); return; } i = 0; do { /* count digits in numtabp[LN].val */ i++; } while ((lnv /= 10) > 0); horiz(nw * (ni + max(nmwid-i, 0))); nform = 0; fnumb(numtabp[LN].val, pchar); un += nw * nms; numtabp[LN].val++; } void text(void) { Tchar i; static int spcnt; nflush++; numtabp[HP].val = 0; if ((dip == d) && (numtabp[NL].val == -1)) { newline(1); return; } setnel(); if (ce || !fi) { nofill(); return; } if (pendw) goto t4; if (pendt) if (spcnt) goto t2; else goto t3; pendt++; if (spcnt) goto t2; while ((cbits(i = GETCH())) == ' ') { spcnt++; numtabp[HP].val += sps; widthp = sps; } if (nlflg) { t1: nflush = pendt = ch = spcnt = 0; callsp(); return; } ch = i; if (spcnt) { t2: tbreak(); if (nc || wch) goto rtn; un += spcnt * sps; spcnt = 0; setnel(); if (trap) goto rtn; if (nlflg) goto t1; } t3: if (spread) goto t5; if (pendw || !wch) t4: if (getword(0)) goto t6; if (!movword()) goto t3; t5: if (nlflg) pendt = 0; adsp = adrem = 0; if (ad) { if (nwd == 1) adsp = nel; else adsp = nel / (nwd - 1); adsp = (adsp / HOR) * HOR; adrem = nel - adsp*(nwd-1); } brflg = 1; tbreak(); spread = 0; if (!trap) goto t3; if (!nlflg) goto rtn; t6: pendt = 0; ckul(); rtn: nflush = 0; } void nofill(void) { int j; Tchar i; if (!pendnf) { over = 0; tbreak(); if (trap) goto rtn; if (nlflg) { ch = nflush = 0; callsp(); return; } adsp = adrem = 0; nwd = 10000; } while ((j = (cbits(i = GETCH()))) != '\n') { if (j == ohc) continue; if (j == CONT) { pendnf++; nflush = 0; flushi(); ckul(); return; } j = width(i); widthp = j; numtabp[HP].val += j; storeline(i, j); } if (ce) { ce--; if ((i = quant(nel / 2, HOR)) > 0) un += i; } if (!nc) storeline((Tchar)FILLER, 0); brflg = 2; tbreak(); ckul(); rtn: pendnf = nflush = 0; } void callsp(void) { int i; if (flss) i = flss; else i = lss; flss = 0; casesp1(i); } void ckul(void) { if (ul && (--ul == 0)) { cu = 0; font = sfont; mchbits(); } if (it && --it == 0 && itmac) control(itmac, 0); } void storeline(Tchar c, int w) { int diff; if (linep >= line + lnsize - 2) { lnsize += LNSIZE; diff = linep - line; if (( line = (Tchar *)realloc((char *)line, lnsize * sizeof(Tchar))) != NULL) { if (linep && diff) linep = line + diff; } else { if (over) { return; } else { flusho(); ERROR "Line overflow." WARN; over++; *linep++ = LEFTHAND; w = width(LEFTHAND); nc++; c = '\n'; } } } *linep++ = c; ne += w; nel -= w; nc++; } void newline(int a) { int i, j, nlss; int opn; nlss = 0; if (a) goto nl1; if (dip != d) { j = lss; pchar1((Tchar)FLSS); if (flss) lss = flss; i = lss + dip->blss; dip->dnl += i; pchar1((Tchar)i); pchar1((Tchar)'\n'); lss = j; dip->blss = flss = 0; if (dip->alss) { pchar1((Tchar)FLSS); pchar1((Tchar)dip->alss); pchar1((Tchar)'\n'); dip->dnl += dip->alss; dip->alss = 0; } if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac) if (control(dip->dimac, 0)) { trap++; dip->ditf++; } return; } j = lss; if (flss) lss = flss; nlss = dip->alss + dip->blss + lss; numtabp[NL].val += nlss; if (TROFF && ascii) { dip->alss = dip->blss = 0; } pchar1((Tchar)'\n'); flss = 0; lss = j; if (numtabp[NL].val < pl) goto nl2; nl1: ejf = dip->hnl = numtabp[NL].val = 0; ejl = frame; if (donef) { if ((!nc && !wch) || ndone) done1(0); ndone++; donef = 0; if (frame == stk) nflush++; } opn = numtabp[PN].val; numtabp[PN].val++; if (npnflg) { numtabp[PN].val = npn; npn = npnflg = 0; } nlpn: if (numtabp[PN].val == pfrom) { print++; pfrom = -1; } else if (opn == pto) { print = 0; opn = -1; chkpn(); goto nlpn; } if (print) ptpage(numtabp[PN].val); /* supposedly in a clean state so can pause */ if (stop && print) { dpn++; if (dpn >= stop) { dpn = 0; ptpause(); } } nl2: trap = 0; if (numtabp[NL].val == 0) { if ((j = findn(0)) != NTRAP) trap = control(mlist[j], 0); } else if ((i = findt(numtabp[NL].val - nlss)) <= nlss) { if ((j = findn1(numtabp[NL].val - nlss + i)) == NTRAP) { flusho(); ERROR "Trap botch." WARN; done2(-5); } trap = control(mlist[j], 0); } } int findn1(int a) { int i, j; for (i = 0; i < NTRAP; i++) { if (mlist[i]) { if ((j = nlist[i]) < 0) j += pl; if (j == a) break; } } return(i); } void chkpn(void) { pto = *(pnp++); pfrom = pto>=0 ? pto : -pto; if (pto == -INT_MAX) { flusho(); done1(0); } if (pto < 0) { pto = -pto; print++; pfrom = 0; } } int findt(int a) { int i, j, k; k = INT_MAX; if (dip != d) { if (dip->dimac && (i = dip->ditrap - a) > 0) k = i; return(k); } for (i = 0; i < NTRAP; i++) { if (mlist[i]) { if ((j = nlist[i]) < 0) j += pl; if ((j -= a) <= 0) continue; if (j < k) k = j; } } i = pl - a; if (k > i) k = i; return(k); } int findt1(void) { int i; if (dip != d) i = dip->dnl; else i = numtabp[NL].val; return(findt(i)); } void eject(Stack *a) { int savlss; if (dip != d) return; ejf++; if (a) ejl = a; else ejl = frame; if (trap) return; e1: savlss = lss; lss = findt(numtabp[NL].val); newline(0); lss = savlss; if (numtabp[NL].val && !trap) goto e1; } int movword(void) { int w; Tchar i, *wp; int savwch, hys; over = 0; wp = wordp; if (!nwd) { while (cbits(*wp++) == ' ') { wch--; wne -= sps; } wp--; } if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) && (!(hyf & 02) || (findt1() > lss))) hyphen(wp); savwch = wch; hyp = hyptr; nhyp = 0; while (*hyp && *hyp <= wp) hyp++; while (wch) { if (hyoff != 1 && *hyp == wp) { hyp++; if (!wdstart || (wp > wdstart + 1 && wp < wdend && (!(hyf & 04) || wp < wdend - 1) && /* 04 => last 2 */ (!(hyf & 010) || wp > wdstart + 2))) { /* 010 => 1st 2 */ nhyp++; storeline((Tchar)IMP, 0); } } i = *wp++; w = width(i); wne -= w; wch--; storeline(i, w); } if (nel >= 0) { nwd++; return(0); /* line didn't fill up */ } if (TROFF) xbits((Tchar)HYPHEN, 1); hys = width((Tchar)HYPHEN); m1: if (!nhyp) { if (!nwd) goto m3; if (wch == savwch) goto m4; } if (*--linep != IMP) goto m5; if (!(--nhyp)) if (!nwd) goto m2; if (nel < hys) { nc--; goto m1; } m2: if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) { *linep = (*(linep - 1) & SFMASK) | HYPHEN; w = width(*linep); nel -= w; ne += w; linep++; } m3: nwd++; m4: wordp = wp; return(1); /* line filled up */ m5: nc--; w = width(*linep); ne -= w; nel += w; wne += w; wch++; wp--; goto m1; } void horiz(int i) { vflag = 0; if (i) pchar(makem(i)); } void setnel(void) { if (!nc) { linep = line; if (un1 >= 0) { un = un1; un1 = -1; } nel = ll - un; ne = adsp = adrem = 0; } } int getword(int x) { int j, k; Tchar i, *wp; int noword; int obits; j = 0; noword = 0; if (x) if (pendw) { *pendw = 0; goto rtn; } if (wordp = pendw) goto g1; hyp = hyptr; wordp = word; over = wne = wch = 0; hyoff = 0; obits = chbits; while (1) { /* picks up 1st char of word */ j = cbits(i = GETCH()); if (j == '\n') { wne = wch = 0; noword = 1; goto rtn; } if (j == ohc) { hyoff = 1; /* 1 => don't hyphenate */ continue; } if (j == ' ') { numtabp[HP].val += sps; widthp = sps; storeword(i, sps); continue; } break; } storeword(' ' | obits, sps); if (spflg) { storeword(' ' | obits, sps); spflg = 0; } g0: if (j == CONT) { pendw = wordp; nflush = 0; flushi(); return(1); } if (hyoff != 1) { if (j == ohc) { hyoff = 2; *hyp++ = wordp; if (hyp > hyptr + NHYP - 1) hyp = hyptr + NHYP - 1; goto g1; } if (((j == '-' || j == EMDASH)) && !(i & ZBIT)) /* zbit avoids \X */ if (wordp > word + 1) { hyoff = 2; *hyp++ = wordp + 1; if (hyp > hyptr + NHYP - 1) hyp = hyptr + NHYP - 1; } } j = width(i); numtabp[HP].val += j; storeword(i, j); g1: j = cbits(i = GETCH()); if (j != ' ') { static char *sentchar = ".?!"; /* sentence terminators */ if (j != '\n') goto g0; wp = wordp-1; /* handle extra space at end of sentence */ while (wp >= word) { j = cbits(*wp--); if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER) continue; for (k = 0; sentchar[k]; k++) if (j == sentchar[k]) { spflg++; break; } break; } } *wordp = 0; numtabp[HP].val += sps; rtn: for (wp = word; *wp; wp++) { if (ismot(j)) break; /* drechsler */ j = cbits(*wp); if (j == ' ') continue; if (!(isascii(j) && isdigit(j)) && j != '-') break; } if (*wp == 0) /* all numbers, so don't hyphenate */ hyoff = 1; wdstart = 0; wordp = word; pendw = 0; *hyp++ = 0; setnel(); return(noword); } void storeword(Tchar c, int w) { Tchar *savp; int i; if (wordp >= word + wdsize - 2) { wdsize += WDSIZE; savp = word; if (( word = (Tchar *)realloc((char *)word, wdsize * sizeof(Tchar))) != NULL) { if (wordp) wordp = word + (wordp - savp); if (pendw) pendw = word + (pendw - savp); if (wdstart) wdstart = word + (wdstart - savp); if (wdend) wdend = word + (wdend - savp); for (i = 0; i < NHYP; i++) if (hyptr[i]) hyptr[i] = word + (hyptr[i] - savp); } else { if (over) { return; } else { flusho(); ERROR "Word overflow." WARN; over++; c = LEFTHAND; w = width(LEFTHAND); } } } widthp = w; wne += w; *wordp++ = c; wch++; } Tchar gettch(void) { extern int c_isalnum; Tchar i; int j; if (TROFF) return getch(); i = getch(); j = cbits(i); if (ismot(i) || fbits(i) != ulfont) return(i); if (cu) { if (trtab[j] == ' ') { setcbits(i, '_'); setfbits(i, FT); /* default */ } return(i); } /* should test here for characters that ought to be underlined */ /* in the old nroff, that was the 200 bit on the width! */ /* for now, just do letters, digits and certain special chars */ if (j <= 127) { if (!isalnum(j)) setfbits(i, FT); } else { if (j < c_isalnum) setfbits(i, FT); } return(i); } 9base-6/troff/unansi0000644000175000017500000000230511402154555014106 0ustar anselmanselm# The awk program cvt will convert the relatively sterotyped ansi c # in this troff distribution into older-style c, by munging function # declarations. # You will also have to edit fns.h, by # sed 's/(.*)/()/g' fns.h >foo; mv foo fns.h # check this before doing the move! # you will also have to make some editing changes in # tdef.h in the Contab structure: s/(void)/()/ # you may have to fix up some function declarations # in n4.c, the ones with (*f)(Tchar). # you will surely also have header files to deal with. # the most obvious cases are dealt with by the following # commands. make sure you do this stuff on a copy! # function prototypes in n8.c probably belong in fns.h. readpats(void) must # be readpats() before cvt runs. sed \ -e 's/(void)/()/' \ -e 's/(Tchar[^)]*);/();/' \ -e 's/(char[^)]*);/();/' \ -e 's/(int[^)]*);/();/' \ n8.c >foo mv foo n8.c for i in *.c do cvt $i >foo mv foo $i done sed 's/(.*)/()/g' fns.h >foo mv foo fns.h sed -e 's/(void)/()/g' -e '/stdlib/d' tdef.h >foo mv foo tdef.h # Compliers may not approve of void *setbrk() in fns.h and n3.c. sed 's/^void\*[ ]setbrk/char* setbrk/' fns.h >foo mv foo fns.h sed 's/^void \*setbrk/char *setbrk/' n3.c >foo mv foo n3.c 9base-6/troff/t6.c0000644000175000017500000003615411402154555013374 0ustar anselmanselm/* * t6.c * * width functions, sizes and fonts */ #include "tdef.h" #include "fns.h" #include "ext.h" int fontlab[MAXFONTS+1]; int cstab[MAXFONTS+1]; int ccstab[MAXFONTS+1]; int bdtab[MAXFONTS+1]; int sbold = 0; int t_width(Tchar j) { int i, k; if (iszbit(j)) return 0; if (ismot(j)) { if (isvmot(j)) return(0); k = absmot(j); if (isnmot(j)) k = -k; return(k); } i = cbits(j); if (i < ' ') { if (i == '\b') return(-widthp); if (i == PRESC) i = eschar; else if (i == HX) return(0); } if (i == ohc) return(0); i = trtab[i]; if (i < ' ') return(0); if (sfbits(j) == oldbits) { xfont = pfont; xpts = ppts; } else xbits(j, 0); if (i < nchnames + ALPHABET && widcache[i].fontpts == (xfont<<8) + xpts && !setwdf) k = widcache[i].width; else { k = getcw(i); if (bd) k += (bd - 1) * HOR; if (cs) k = cs; } widthp = k; return(k); } /* * clear width cache-- s means just space */ void zapwcache(int s) { int i; if (s) { widcache[' '].fontpts = 0; return; } for (i=0; iwp[n].num == n) /* ascii at front */ return n; else return -1; } cp = &fp->wp[ALPHABET]; ep = &fp->wp[fp->nchars]; for ( ; cp < ep; cp++) /* search others */ if (cp->num == n) return cp - &fp->wp[0]; /* maybe it was a \N... */ np = chname(n); if (*np == Number) { i = atoi(np+1); /* sscanf(np+1, "%d", &i); */ cp = &fp->wp[0]; ep = &fp->wp[fp->nchars]; for ( ; cp < ep; cp++) { /* search others */ if (cp->code == i) return cp - &fp->wp[0]; } return -2; /* a \N that doesn't have an entry */ } return -1; /* vanilla not found */ } int getcw(int i) { int k, n, x; Font *fp; int nocache = 0; if (i < ' ') return 0; bd = 0; fp = &fonts[xfont]; if (i == ' ') { /* a blank */ k = (fp->spacewidth * spacesz + 6) / 12; /* this nonsense because .ss cmd uses 1/36 em as its units */ /* and default is 12 */ } else if ((n = onfont(i, xfont)) >= 0) { /* on this font at n */ k = fp->wp[n].wid; if (setwdf) numtabp[CT].val |= fp->wp[n].kern; } else if (n == -2) { /* \N with default width */ k = fp->defaultwidth; } else { /* not on current font */ nocache = 1; k = fp->defaultwidth; /* default-size space */ if (smnt) { int ii, jj; for (ii=smnt, jj=0; jj < nfonts; jj++, ii=ii % nfonts + 1) { if ((n = onfont(i, ii)) >= 0) { k = fonts[ii].wp[n].wid; if (xfont == sbold) bd = bdtab[ii]; if (setwdf) numtabp[CT].val |= fonts[ii].wp[n].kern; break; } } } } if (!bd) bd = bdtab[xfont]; if (cs = cstab[xfont]) { nocache = 1; if (ccs = ccstab[xfont]) x = ccs; else x = xpts; cs = (cs * EMPTS(x)) / 36; } /* was (k & BYTEMASK); since .wid is unsigned, should never happen */ if (k < 0) ERROR "can't happen: negative width %d in getcw %d\n", k, i WARN; k = (k * xpts + (Unitwidth / 2)) / Unitwidth; if (nocache|bd) widcache[i].fontpts = 0; else { widcache[i].fontpts = (xfont<<8) + xpts; widcache[i].width = k; } return(k); /* Unitwidth is Units/Point, where /* Units is the fundamental digitization /* of the character set widths, and /* Point is the number of goobies in a point /* e.g., for cat, Units=36, Point=6, so Unitwidth=36/6=6 /* In effect, it's the size at which the widths /* translate directly into units. */ } void xbits(Tchar i, int bitf) { int k; if(TROFF) { xfont = fbits(i); k = sbits(i); if(k) { xpts = pstab[k-1]; oldbits = sfbits(i); pfont = xfont; ppts = xpts; return; } switch(bitf) { case 0: xfont = font; xpts = pts; break; case 1: xfont = pfont; xpts = ppts; break; case 2: xfont = mfont; xpts = mpts; } } } /* these next two functions ought to be the same in troff and nroff, */ /* but the data structures they search are different. */ /* silly historical problem. */ Tchar t_setch(int c) { int j; char temp[50]; char *s; j = 0; s = temp; if (c == '(') { /* \(xx */ if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0) return(0); } else { /* \C'...' */ c = getach(); while ((*s = getach()) != c && *s != 0 && s < temp + sizeof(temp) - 1) s++; } *s = '\0'; #ifdef UNICODE return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */ #else if (NROFF) { j = chadd(temp, Troffchar, Lookup); if ( j == -1) return 0; else return j | chbits; } else return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */ #endif /*UNICODE*/ } Tchar t_setabs(void) /* set absolute char from \N'...' */ { int n; char temp[10]; getch(); /* delim */ n = 0; n = inumb(&n); getch(); /* delim */ if (nonumb) return 0; sprintf(temp, "%d", n); /* convert into "#n" */ n = chadd(temp, Number, Install); return n | chbits; } /* * fontlab[] is a cache that contains font information * for each font. * fontlab[] contains the 1- or 2-character name of the * font current associated with that font. * fonts 1..nfonts correspond to the mounted fonts; * the last of these are the special fonts. * If we don't use the (named) font in one of the * standard positions, we install the name in the next * free slot of fontlab[] and font[]. * Whenever we need info about the font, we * read in the data into the next free slot with getfont. * The ptfont() (t10.c) routine will tell * the device filter to put the font always at position * zero if xfont > nfonts, so no need to change these filters. * Yes, this is a bit kludgy. * * This gives the new specs of findft: * find the font name i, where i also can be a number. * Installs the font(name) i when not present * returns -1 on error */ int t_findft(int i) { int k; Uchar *p; p = unpair(i); if (isdigit(p[0])) { /* first look for numbers */ k = p[0] - '0'; if (p[1] > 0 && isdigit(p[1])) k = 10 * k + p[1] - '0'; if (k > 0 && k <= nfonts && k < smnt) return(k); /* mounted font: .ft 3 */ if (fontlab[k] && k <= MAXFONTS) { /* translate */ return(k); /*number to a name */ } else { fprintf(stderr, "troff: no font at position %d\n", k); return(-1); /* wild number */ } } /* * Now we look for font names */ for (k = 1; fontlab[k] != i; k++) { if (k > MAXFONTS) return(-1); /* running out of fontlab space */ if (fontlab[k] == 0) { /* passed all existing names */ if (setfp(k, i, (char *) 0, 1) == -1) return(-1); else { fontlab[k] = i; /* install the name */ return(k); } } } return(k); /* was one of the existing names */ } void caseps(void) { int i; if (TROFF) { if(skip()) i = apts1; else { noscale++; i = inumb(&apts); /* this is a disaster for fractional point sizes */ noscale = 0; if(nonumb) i = apts1; } casps1(i); } } void casps1(int i) { /* * in olden times, it used to ignore changes to 0 or negative. * this is meant to allow the requested size to be anything, * in particular so eqn can generate lots of \s-3's and still * get back by matching \s+3's. if (i <= 0) return; */ apts1 = apts; apts = i; pts1 = pts; pts = findps(i); mchbits(); } int findps(int i) { int j, k; for (j=k=0 ; pstab[j] != 0 ; j++) if (abs(pstab[j]-i) < abs(pstab[k]-i)) k = j; return(pstab[k]); } void t_mchbits(void) { int i, j, k; i = pts; for (j = 0; i > (k = pstab[j]); j++) if (!k) { j--; break; } chbits = 0; setsbits(chbits, ++j); setfbits(chbits, font); sps = width(' ' | chbits); zapwcache(1); } void t_setps(void) { int i, j; j = 0; i = cbits(getch()); if (isdigit(i)) { /* \sd or \sdd */ i -= '0'; if (i == 0) /* \s0 */ j = apts1; else if (i <= 3 && (ch=getch()) && isdigit(j = cbits(ch))) { /* \sdd */ j = 10 * i + j - '0'; ch = 0; } else /* \sd */ j = i; } else if (i == '(') { /* \s(dd */ j = cbits(getch()) - '0'; j = 10 * j + cbits(getch()) - '0'; if (j == 0) /* \s(00 */ j = apts1; } else if (i == '+' || i == '-') { /* \s+, \s- */ j = cbits(getch()); if (isdigit(j)) { /* \s+d, \s-d */ j -= '0'; } else if (j == '(') { /* \s+(dd, \s-(dd */ j = cbits(getch()) - '0'; j = 10 * j + cbits(getch()) - '0'; } if (i == '-') j = -j; j += apts; } casps1(j); } Tchar t_setht(void) /* set character height from \H'...' */ { int n; Tchar c; getch(); n = inumb(&apts); getch(); if (n == 0 || nonumb) n = apts; /* does this work? */ c = CHARHT; c |= ZBIT; setsbits(c, n); setfbits(c, pts); /* sneaky, CHARHT font bits are size bits */ return(c); } Tchar t_setslant(void) /* set slant from \S'...' */ { int n; Tchar c; getch(); n = 0; n = inumb(&n); getch(); if (nonumb) n = 0; c = SLANT; c |= ZBIT; setsfbits(c, n+180); return(c); } void caseft(void) { if (!TROFF) { n_caseft(); return; } skip(); setfont(1); } void t_setfont(int a) { int i, j; if (a) i = getrq(); else i = getsn(); if (!i || i == 'P') { j = font1; goto s0; } if (/* i == 'S' || */ i == '0') /* an experiment -- why can't we change to it? */ return; if ((j = findft(i)) == -1) if ((j = setfp(0, i, (char*) 0, 1)) == -1) /* try to put it in position 0 */ return; s0: font1 = font; font = j; mchbits(); } void t_setwd(void) { int base, wid; Tchar i; int delim, emsz, k; int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1; base = numtabp[ST].val = numtabp[SB].val = wid = numtabp[CT].val = 0; if (ismot(i = getch())) return; delim = cbits(i); savhp = numtabp[HP].val; numtabp[HP].val = 0; savapts = apts; savapts1 = apts1; savfont = font; savfont1 = font1; savpts = pts; savpts1 = pts1; setwdf++; while (cbits(i = getch()) != delim && !nlflg) { k = width(i); wid += k; numtabp[HP].val += k; if (!ismot(i)) { emsz = (INCH/72) * xpts; } else if (isvmot(i)) { k = absmot(i); if (isnmot(i)) k = -k; base -= k; emsz = 0; } else continue; if (base < numtabp[SB].val) numtabp[SB].val = base; if ((k = base + emsz) > numtabp[ST].val) numtabp[ST].val = k; } setn1(wid, 0, (Tchar) 0); numtabp[HP].val = savhp; apts = savapts; apts1 = savapts1; font = savfont; font1 = savfont1; pts = savpts; pts1 = savpts1; mchbits(); setwdf = 0; } Tchar t_vmot(void) { dfact = lss; vflag++; return t_mot(); } Tchar t_hmot(void) { dfact = EM; return t_mot(); } Tchar t_mot(void) { int j, n; Tchar i; j = HOR; getch(); /*eat delim*/ if (n = atoi0()) { if (vflag) j = VERT; i = makem(quant(n, j)); } else i = 0; getch(); vflag = 0; dfact = 1; return(i); } Tchar t_sethl(int k) { int j; Tchar i; j = EM / 2; if (k == 'u') j = -j; else if (k == 'r') j = -2 * j; vflag++; i = makem(j); vflag = 0; return(i); } Tchar t_makem(int i) { Tchar j; if (i >= 0) j = i; else j = -i; if (Hor > 1 && !vflag) j = (j + Hor/2)/Hor * Hor; j |= MOT; if (i < 0) j |= NMOT; if (vflag) j |= VMOT; return(j); } Tchar getlg(Tchar i) { Tchar j, k; int lf; if (!TROFF) return i; if ((lf = fonts[fbits(i)].ligfont) == 0) /* font lacks ligatures */ return(i); j = getch0(); if (cbits(j) == 'i' && (lf & LFI)) j = LIG_FI; else if (cbits(j) == 'l' && (lf & LFL)) j = LIG_FL; else if (cbits(j) == 'f' && (lf & LFF)) { if ((lf & (LFFI|LFFL)) && lg != 2) { k = getch0(); if (cbits(k)=='i' && (lf&LFFI)) j = LIG_FFI; else if (cbits(k)=='l' && (lf&LFFL)) j = LIG_FFL; else { *pbp++ = k; j = LIG_FF; } } else j = LIG_FF; } else { *pbp++ = j; j = i; } return(i & SFMASK | j); } void caselg(void) { if(TROFF) { skip(); lg = atoi0(); if (nonumb) lg = 1; } } void casefp(void) { int i, j; if (!TROFF) { n_casefp(); return; } skip(); i = cbits(getch()); if (isdigit(i)) { i -= '0'; j = cbits(getch()); if (isdigit(j)) i = 10 * i + j - '0'; } if (i <= 0 || i > nfonts) ERROR "fp: bad font position %d", i WARN; else if (skip() || !(j = getrq())) ERROR "fp: no font name" WARN; else if (skip() || !getname()) setfp(i, j, (char*) 0, 1); else /* 3rd argument = filename */ setfp(i, j, nextf, 1); } char *strdupl(const char *s) /* make a copy of s */ { char *t; t = (char *) malloc(strlen(s) + 1); if (t == NULL) ERROR "out of space in strdupl(%s)", s FATAL; strcpy(t, s); return t; } int setfp(int pos, int f, char *truename, int print) /* mount font f at position pos[0...nfonts] */ { char pathname[NS], shortname[NS], *sl; sl = (char*)0; zapwcache(0); if (truename) strcpy(shortname, truename); else strcpy(shortname, (char *) unpair(f)); if (truename && strrchr(truename, '/')) { /* .fp 1 R dir/file: use verbatim */ sprintf(pathname, "%s", truename); if (fonts[pos].truename) free(fonts[pos].truename); fonts[pos].truename = strdupl(truename); } else if (truename) { /* synonym: .fp 1 R Avant */ sprintf(pathname, "%s/dev%s/%s", fontdir, devname, truename); truename = 0; /* so doesn't get repeated by ptfpcmd */ } else /* vanilla: .fp 5 XX */ sprintf(pathname, "%s/dev%s/%s", fontdir, devname, shortname); if (truename == 0 && fonts[pos].truename != 0) { free(fonts[pos].truename); fonts[pos].truename = 0; } if (getfont(pathname, pos) < 0) { ERROR "Can't open font file %s", pathname WARN; return -1; } if (print && !ascii) { ptfpcmd(pos, fonts[pos].longname, truename); ptfont(); } if (pos == smnt) { smnt = 0; sbold = 0; } fontlab[pos] = f; if (smnt == 0 && fonts[pos].specfont) smnt = pos; bdtab[pos] = cstab[pos] = ccstab[pos] = 0; return pos; } /* * .cs request; don't check legality of optional arguments */ void casecs(void) { int i, j; if (TROFF) { int savtr = trace; trace = 0; noscale++; skip(); if (!(i = getrq()) || (i = findft(i)) < 0) goto rtn; skip(); cstab[i] = atoi0(); skip(); j = atoi0(); if(nonumb) ccstab[i] = 0; else ccstab[i] = findps(j); rtn: zapwcache(0); noscale = 0; trace = savtr; } } void casebd(void) { int i, j, k; j=0; if (!TROFF) { n_casebd(); return; } zapwcache(0); k = 0; bd0: if (skip() || !(i = getrq()) || (j = findft(i)) == -1) { if (k) goto bd1; else return; } if (j == smnt) { k = smnt; goto bd0; } if (k) { sbold = j; j = k; } bd1: skip(); noscale++; bdtab[j] = atoi0(); noscale = 0; } void casevs(void) { int i; if (!TROFF) { n_casevs(); return; } skip(); vflag++; dfact = INCH; /* default scaling is points! */ dfactd = 72; res = VERT; i = inumb(&lss); if (nonumb) i = lss1; if (i < VERT) i = VERT; lss1 = lss; lss = i; } void casess(void) { int i; if(TROFF) { noscale++; skip(); if(i = atoi0()) { spacesz = i & 0177; zapwcache(0); sps = width(' ' | chbits); } noscale = 0; } } Tchar t_xlss(void) { /* stores \x'...' into two successive Tchars. /* the first contains HX, the second the value, /* encoded as a vertical motion. /* decoding is done in n2.c by pchar(). */ int i; getch(); dfact = lss; i = quant(atoi0(), VERT); dfact = 1; getch(); if (i >= 0) *pbp++ = MOT | VMOT | i; else *pbp++ = MOT | VMOT | NMOT | -i; return(HX); } Uchar *unpair(int i) { static Uchar name[3]; name[0] = i & SHORTMASK; name[1] = (i >> SHORT) & SHORTMASK; name[2] = 0; return name; } 9base-6/troff/hyphen.tex0000644000175000017500000006602311402154555014712 0ustar anselmanselm% The Plain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!] \patterns{ % just type if you're not using INITEX .ach4 .ad4der .af1t .al3t .am5at .an5c .ang4 .ani5m .ant4 .an3te .anti5s .ar5s .ar4tie .ar4ty .as3c .as1p .as1s .aster5 .atom5 .au1d .av4i .awn4 .ba4g .ba5na .bas4e .ber4 .be5ra .be3sm .be5sto .bri2 .but4ti .cam4pe .can5c .capa5b .car5ol .ca4t .ce4la .ch4 .chill5i .ci2 .cit5r .co3e .co4r .cor5ner .de4moi .de3o .de3ra .de3ri .des4c .dictio5 .do4t .du4c .dumb5 .earth5 .eas3i .eb4 .eer4 .eg2 .el5d .el3em .enam3 .en3g .en3s .eq5ui5t .er4ri .es3 .eu3 .eye5 .fes3 .for5mer .ga2 .ge2 .gen3t4 .ge5og .gi5a .gi4b .go4r .hand5i .han5k .he2 .hero5i .hes3 .het3 .hi3b .hi3er .hon5ey .hon3o .hov5 .id4l .idol3 .im3m .im5pin .in1 .in3ci .ine2 .in2k .in3s .ir5r .is4i .ju3r .la4cy .la4m .lat5er .lath5 .le2 .leg5e .len4 .lep5 .lev1 .li4g .lig5a .li2n .li3o .li4t .mag5a5 .mal5o .man5a .mar5ti .me2 .mer3c .me5ter .mis1 .mist5i .mon3e .mo3ro .mu5ta .muta5b .ni4c .od2 .odd5 .of5te .or5ato .or3c .or1d .or3t .os3 .os4tl .oth3 .out3 .ped5al .pe5te .pe5tit .pi4e .pio5n .pi2t .pre3m .ra4c .ran4t .ratio5na .ree2 .re5mit .res2 .re5stat .ri4g .rit5u .ro4q .ros5t .row5d .ru4d .sci3e .self5 .sell5 .se2n .se5rie .sh2 .si2 .sing4 .st4 .sta5bl .sy2 .ta4 .te4 .ten5an .th2 .ti2 .til4 .tim5o5 .ting4 .tin5k .ton4a .to4p .top5i .tou5s .trib5ut .un1a .un3ce .under5 .un1e .un5k .un5o .un3u .up3 .ure3 .us5a .ven4de .ve5ra .wil5i .ye4 4ab. a5bal a5ban abe2 ab5erd abi5a ab5it5ab ab5lat ab5o5liz 4abr ab5rog ab3ul a4car ac5ard ac5aro a5ceou ac1er a5chet 4a2ci a3cie ac1in a3cio ac5rob act5if ac3ul ac4um a2d ad4din ad5er. 2adi a3dia ad3ica adi4er a3dio a3dit a5diu ad4le ad3ow ad5ran ad4su 4adu a3duc ad5um ae4r aeri4e a2f aff4 a4gab aga4n ag5ell age4o 4ageu ag1i 4ag4l ag1n a2go 3agog ag3oni a5guer ag5ul a4gy a3ha a3he ah4l a3ho ai2 a5ia a3ic. ai5ly a4i4n ain5in ain5o ait5en a1j ak1en al5ab al3ad a4lar 4aldi 2ale al3end a4lenti a5le5o al1i al4ia. ali4e al5lev 4allic 4alm a5log. a4ly. 4alys 5a5lyst 5alyt 3alyz 4ama am5ab am3ag ama5ra am5asc a4matis a4m5ato am5era am3ic am5if am5ily am1in ami4no a2mo a5mon amor5i amp5en a2n an3age 3analy a3nar an3arc anar4i a3nati 4and ande4s an3dis an1dl an4dow a5nee a3nen an5est. a3neu 2ang ang5ie an1gl a4n1ic a3nies an3i3f an4ime a5nimi a5nine an3io a3nip an3ish an3it a3niu an4kli 5anniz ano4 an5ot anoth5 an2sa an4sco an4sn an2sp ans3po an4st an4sur antal4 an4tie 4anto an2tr an4tw an3ua an3ul a5nur 4ao apar4 ap5at ap5ero a3pher 4aphi a4pilla ap5illar ap3in ap3ita a3pitu a2pl apoc5 ap5ola apor5i apos3t aps5es a3pu aque5 2a2r ar3act a5rade ar5adis ar3al a5ramete aran4g ara3p ar4at a5ratio ar5ativ a5rau ar5av4 araw4 arbal4 ar4chan ar5dine ar4dr ar5eas a3ree ar3ent a5ress ar4fi ar4fl ar1i ar5ial ar3ian a3riet ar4im ar5inat ar3io ar2iz ar2mi ar5o5d a5roni a3roo ar2p ar3q arre4 ar4sa ar2sh 4as. as4ab as3ant ashi4 a5sia. a3sib a3sic 5a5si4t ask3i as4l a4soc as5ph as4sh as3ten as1tr asur5a a2ta at3abl at5ac at3alo at5ap ate5c at5ech at3ego at3en. at3era ater5n a5terna at3est at5ev 4ath ath5em a5then at4ho ath5om 4ati. a5tia at5i5b at1ic at3if ation5ar at3itu a4tog a2tom at5omiz a4top a4tos a1tr at5rop at4sk at4tag at5te at4th a2tu at5ua at5ue at3ul at3ura a2ty au4b augh3 au3gu au4l2 aun5d au3r au5sib aut5en au1th a2va av3ag a5van ave4no av3era av5ern av5ery av1i avi4er av3ig av5oc a1vor 3away aw3i aw4ly aws4 ax4ic ax4id ay5al aye4 ays4 azi4er azz5i 5ba. bad5ger ba4ge bal1a ban5dag ban4e ban3i barbi5 bari4a bas4si 1bat ba4z 2b1b b2be b3ber bbi4na 4b1d 4be. beak4 beat3 4be2d be3da be3de be3di be3gi be5gu 1bel be1li be3lo 4be5m be5nig be5nu 4bes4 be3sp be5str 3bet bet5iz be5tr be3tw be3w be5yo 2bf 4b3h bi2b bi4d 3bie bi5en bi4er 2b3if 1bil bi3liz bina5r4 bin4d bi5net bi3ogr bi5ou bi2t 3bi3tio bi3tr 3bit5ua b5itz b1j bk4 b2l2 blath5 b4le. blen4 5blesp b3lis b4lo blun4t 4b1m 4b3n bne5g 3bod bod3i bo4e bol3ic bom4bi bon4a bon5at 3boo 5bor. 4b1ora bor5d 5bore 5bori 5bos4 b5ota both5 bo4to bound3 4bp 4brit broth3 2b5s2 bsor4 2bt bt4l b4to b3tr buf4fer bu4ga bu3li bumi4 bu4n bunt4i bu3re bus5ie buss4e 5bust 4buta 3butio b5uto b1v 4b5w 5by. bys4 1ca cab3in ca1bl cach4 ca5den 4cag4 2c5ah ca3lat cal4la call5in 4calo can5d can4e can4ic can5is can3iz can4ty cany4 ca5per car5om cast5er cas5tig 4casy ca4th 4cativ cav5al c3c ccha5 cci4a ccompa5 ccon4 ccou3t 2ce. 4ced. 4ceden 3cei 5cel. 3cell 1cen 3cenc 2cen4e 4ceni 3cent 3cep ce5ram 4cesa 3cessi ces5si5b ces5t cet4 c5e4ta cew4 2ch 4ch. 4ch3ab 5chanic ch5a5nis che2 cheap3 4ched che5lo 3chemi ch5ene ch3er. ch3ers 4ch1in 5chine. ch5iness 5chini 5chio 3chit chi2z 3cho2 ch4ti 1ci 3cia ci2a5b cia5r ci5c 4cier 5cific. 4cii ci4la 3cili 2cim 2cin c4ina 3cinat cin3em c1ing c5ing. 5cino cion4 4cipe ci3ph 4cipic 4cista 4cisti 2c1it cit3iz 5ciz ck1 ck3i 1c4l4 4clar c5laratio 5clare cle4m 4clic clim4 cly4 c5n 1co co5ag coe2 2cog co4gr coi4 co3inc col5i 5colo col3or com5er con4a c4one con3g con5t co3pa cop3ic co4pl 4corb coro3n cos4e cov1 cove4 cow5a coz5e co5zi c1q cras5t 5crat. 5cratic cre3at 5cred 4c3reta cre4v cri2 cri5f c4rin cris4 5criti cro4pl crop5o cros4e cru4d 4c3s2 2c1t cta4b ct5ang c5tant c2te c3ter c4ticu ctim3i ctu4r c4tw cud5 c4uf c4ui cu5ity 5culi cul4tis 3cultu cu2ma c3ume cu4mi 3cun cu3pi cu5py cur5a4b cu5ria 1cus cuss4i 3c4ut cu4tie 4c5utiv 4cutr 1cy cze4 1d2a 5da. 2d3a4b dach4 4daf 2dag da2m2 dan3g dard5 dark5 4dary 3dat 4dativ 4dato 5dav4 dav5e 5day d1b d5c d1d4 2de. deaf5 deb5it de4bon decan4 de4cil de5com 2d1ed 4dee. de5if deli4e del5i5q de5lo d4em 5dem. 3demic dem5ic. de5mil de4mons demor5 1den de4nar de3no denti5f de3nu de1p de3pa depi4 de2pu d3eq d4erh 5derm dern5iz der5s des2 d2es. de1sc de2s5o des3ti de3str de4su de1t de2to de1v dev3il 4dey 4d1f d4ga d3ge4t dg1i d2gy d1h2 5di. 1d4i3a dia5b di4cam d4ice 3dict 3did 5di3en d1if di3ge di4lato d1in 1dina 3dine. 5dini di5niz 1dio dio5g di4pl dir2 di1re dirt5i dis1 5disi d4is3t d2iti 1di1v d1j d5k2 4d5la 3dle. 3dled 3dles. 4dless 2d3lo 4d5lu 2dly d1m 4d1n4 1do 3do. do5de 5doe 2d5of d4og do4la doli4 do5lor dom5iz do3nat doni4 doo3d dop4p d4or 3dos 4d5out do4v 3dox d1p 1dr drag5on 4drai dre4 drea5r 5dren dri4b dril4 dro4p 4drow 5drupli 4dry 2d1s2 ds4p d4sw d4sy d2th 1du d1u1a du2c d1uca duc5er 4duct. 4ducts du5el du4g d3ule dum4be du4n 4dup du4pe d1v d1w d2y 5dyn dy4se dys5p e1a4b e3act ead1 ead5ie ea4ge ea5ger ea4l eal5er eal3ou eam3er e5and ear3a ear4c ear5es ear4ic ear4il ear5k ear2t eart3e ea5sp e3ass east3 ea2t eat5en eath3i e5atif e4a3tu ea2v eav3en eav5i eav5o 2e1b e4bel. e4bels e4ben e4bit e3br e4cad ecan5c ecca5 e1ce ec5essa ec2i e4cib ec5ificat ec5ifie ec5ify ec3im eci4t e5cite e4clam e4clus e2col e4comm e4compe e4conc e2cor ec3ora eco5ro e1cr e4crem ec4tan ec4te e1cu e4cul ec3ula 2e2da 4ed3d e4d1er ede4s 4edi e3dia ed3ib ed3ica ed3im ed1it edi5z 4edo e4dol edon2 e4dri e4dul ed5ulo ee2c eed3i ee2f eel3i ee4ly ee2m ee4na ee4p1 ee2s4 eest4 ee4ty e5ex e1f e4f3ere 1eff e4fic 5efici efil4 e3fine ef5i5nite 3efit efor5es e4fuse. 4egal eger4 eg5ib eg4ic eg5ing e5git5 eg5n e4go. e4gos eg1ul e5gur 5egy e1h4 eher4 ei2 e5ic ei5d eig2 ei5gl e3imb e3inf e1ing e5inst eir4d eit3e ei3th e5ity e1j e4jud ej5udi eki4n ek4la e1la e4la. e4lac elan4d el5ativ e4law elaxa4 e3lea el5ebra 5elec e4led el3ega e5len e4l1er e1les el2f el2i e3libe e4l5ic. el3ica e3lier el5igib e5lim e4l3ing e3lio e2lis el5ish e3liv3 4ella el4lab ello4 e5loc el5og el3op. el2sh el4ta e5lud el5ug e4mac e4mag e5man em5ana em5b e1me e2mel e4met em3ica emi4e em5igra em1in2 em5ine em3i3ni e4mis em5ish e5miss em3iz 5emniz emo4g emoni5o em3pi e4mul em5ula emu3n e3my en5amo e4nant ench4er en3dic e5nea e5nee en3em en5ero en5esi en5est en3etr e3new en5ics e5nie e5nil e3nio en3ish en3it e5niu 5eniz 4enn 4eno eno4g e4nos en3ov en4sw ent5age 4enthes en3ua en5uf e3ny. 4en3z e5of eo2g e4oi4 e3ol eop3ar e1or eo3re eo5rol eos4 e4ot eo4to e5out e5ow e2pa e3pai ep5anc e5pel e3pent ep5etitio ephe4 e4pli e1po e4prec ep5reca e4pred ep3reh e3pro e4prob ep4sh ep5ti5b e4put ep5uta e1q equi3l e4q3ui3s er1a era4b 4erand er3ar 4erati. 2erb er4bl er3ch er4che 2ere. e3real ere5co ere3in er5el. er3emo er5ena er5ence 4erene er3ent ere4q er5ess er3est eret4 er1h er1i e1ria4 5erick e3rien eri4er er3ine e1rio 4erit er4iu eri4v e4riva er3m4 er4nis 4ernit 5erniz er3no 2ero er5ob e5roc ero4r er1ou er1s er3set ert3er 4ertl er3tw 4eru eru4t 5erwau e1s4a e4sage. e4sages es2c e2sca es5can e3scr es5cu e1s2e e2sec es5ecr es5enc e4sert. e4serts e4serva 4esh e3sha esh5en e1si e2sic e2sid es5iden es5igna e2s5im es4i4n esis4te esi4u e5skin es4mi e2sol es3olu e2son es5ona e1sp es3per es5pira es4pre 2ess es4si4b estan4 es3tig es5tim 4es2to e3ston 2estr e5stro estruc5 e2sur es5urr es4w eta4b eten4d e3teo ethod3 et1ic e5tide etin4 eti4no e5tir e5titio et5itiv 4etn et5ona e3tra e3tre et3ric et5rif et3rog et5ros et3ua et5ym et5z 4eu e5un e3up eu3ro eus4 eute4 euti5l eu5tr eva2p5 e2vas ev5ast e5vea ev3ell evel3o e5veng even4i ev1er e5verb e1vi ev3id evi4l e4vin evi4v e5voc e5vu e1wa e4wag e5wee e3wh ewil5 ew3ing e3wit 1exp 5eyc 5eye. eys4 1fa fa3bl fab3r fa4ce 4fag fain4 fall5e 4fa4ma fam5is 5far far5th fa3ta fa3the 4fato fault5 4f5b 4fd 4fe. feas4 feath3 fe4b 4feca 5fect 2fed fe3li fe4mo fen2d fend5e fer1 5ferr fev4 4f1f f4fes f4fie f5fin. f2f5is f4fly f2fy 4fh 1fi fi3a 2f3ic. 4f3ical f3ican 4ficate f3icen fi3cer fic4i 5ficia 5ficie 4fics fi3cu fi5del fight5 fil5i fill5in 4fily 2fin 5fina fin2d5 fi2ne f1in3g fin4n fis4ti f4l2 f5less flin4 flo3re f2ly5 4fm 4fn 1fo 5fon fon4de fon4t fo2r fo5rat for5ay fore5t for4i fort5a fos5 4f5p fra4t f5rea fres5c fri2 fril4 frol5 2f3s 2ft f4to f2ty 3fu fu5el 4fug fu4min fu5ne fu3ri fusi4 fus4s 4futa 1fy 1ga gaf4 5gal. 3gali ga3lo 2gam ga5met g5amo gan5is ga3niz gani5za 4gano gar5n4 gass4 gath3 4gativ 4gaz g3b gd4 2ge. 2ged geez4 gel4in ge5lis ge5liz 4gely 1gen ge4nat ge5niz 4geno 4geny 1geo ge3om g4ery 5gesi geth5 4geto ge4ty ge4v 4g1g2 g2ge g3ger gglu5 ggo4 gh3in gh5out gh4to 5gi. 1gi4a gia5r g1ic 5gicia g4ico gien5 5gies. gil4 g3imen 3g4in. gin5ge 5g4ins 5gio 3gir gir4l g3isl gi4u 5giv 3giz gl2 gla4 glad5i 5glas 1gle gli4b g3lig 3glo glo3r g1m g4my gn4a g4na. gnet4t g1ni g2nin g4nio g1no g4non 1go 3go. gob5 5goe 3g4o4g go3is gon2 4g3o3na gondo5 go3ni 5goo go5riz gor5ou 5gos. gov1 g3p 1gr 4grada g4rai gran2 5graph. g5rapher 5graphic 4graphy 4gray gre4n 4gress. 4grit g4ro gruf4 gs2 g5ste gth3 gu4a 3guard 2gue 5gui5t 3gun 3gus 4gu4t g3w 1gy 2g5y3n gy5ra h3ab4l hach4 hae4m hae4t h5agu ha3la hala3m ha4m han4ci han4cy 5hand. han4g hang5er hang5o h5a5niz han4k han4te hap3l hap5t ha3ran ha5ras har2d hard3e har4le harp5en har5ter has5s haun4 5haz haz3a h1b 1head 3hear he4can h5ecat h4ed he5do5 he3l4i hel4lis hel4ly h5elo hem4p he2n hena4 hen5at heo5r hep5 h4era hera3p her4ba here5a h3ern h5erou h3ery h1es he2s5p he4t het4ed heu4 h1f h1h hi5an hi4co high5 h4il2 himer4 h4ina hion4e hi4p hir4l hi3ro hir4p hir4r his3el his4s hith5er hi2v 4hk 4h1l4 hlan4 h2lo hlo3ri 4h1m hmet4 2h1n h5odiz h5ods ho4g hoge4 hol5ar 3hol4e ho4ma home3 hon4a ho5ny 3hood hoon4 hor5at ho5ris hort3e ho5ru hos4e ho5sen hos1p 1hous house3 hov5el 4h5p 4hr4 hree5 hro5niz hro3po 4h1s2 h4sh h4tar ht1en ht5es h4ty hu4g hu4min hun5ke hun4t hus3t4 hu4t h1w h4wart hy3pe hy3ph hy2s 2i1a i2al iam4 iam5ete i2an 4ianc ian3i 4ian4t ia5pe iass4 i4ativ ia4tric i4atu ibe4 ib3era ib5ert ib5ia ib3in ib5it. ib5ite i1bl ib3li i5bo i1br i2b5ri i5bun 4icam 5icap 4icar i4car. i4cara icas5 i4cay iccu4 4iceo 4ich 2ici i5cid ic5ina i2cip ic3ipa i4cly i2c5oc 4i1cr 5icra i4cry ic4te ictu2 ic4t3ua ic3ula ic4um ic5uo i3cur 2id i4dai id5anc id5d ide3al ide4s i2di id5ian idi4ar i5die id3io idi5ou id1it id5iu i3dle i4dom id3ow i4dr i2du id5uo 2ie4 ied4e 5ie5ga ield3 ien5a4 ien4e i5enn i3enti i1er. i3esc i1est i3et 4if. if5ero iff5en if4fr 4ific. i3fie i3fl 4ift 2ig iga5b ig3era ight3i 4igi i3gib ig3il ig3in ig3it i4g4l i2go ig3or ig5ot i5gre igu5i ig1ur i3h 4i5i4 i3j 4ik i1la il3a4b i4lade i2l5am ila5ra i3leg il1er ilev4 il5f il1i il3ia il2ib il3io il4ist 2ilit il2iz ill5ab 4iln il3oq il4ty il5ur il3v i4mag im3age ima5ry imenta5r 4imet im1i im5ida imi5le i5mini 4imit im4ni i3mon i2mu im3ula 2in. i4n3au 4inav incel4 in3cer 4ind in5dling 2ine i3nee iner4ar i5ness 4inga 4inge in5gen 4ingi in5gling 4ingo 4ingu 2ini i5ni. i4nia in3io in1is i5nite. 5initio in3ity 4ink 4inl 2inn 2i1no i4no4c ino4s i4not 2ins in3se insur5a 2int. 2in4th in1u i5nus 4iny 2io 4io. ioge4 io2gr i1ol io4m ion3at ion4ery ion3i io5ph ior3i i4os io5th i5oti io4to i4our 2ip ipe4 iphras4 ip3i ip4ic ip4re4 ip3ul i3qua iq5uef iq3uid iq3ui3t 4ir i1ra ira4b i4rac ird5e ire4de i4ref i4rel4 i4res ir5gi ir1i iri5de ir4is iri3tu 5i5r2iz ir4min iro4g 5iron. ir5ul 2is. is5ag is3ar isas5 2is1c is3ch 4ise is3er 3isf is5han is3hon ish5op is3ib isi4d i5sis is5itiv 4is4k islan4 4isms i2so iso5mer is1p is2pi is4py 4is1s is4sal issen4 is4ses is4ta. is1te is1ti ist4ly 4istral i2su is5us 4ita. ita4bi i4tag 4ita5m i3tan i3tat 2ite it3era i5teri it4es 2ith i1ti 4itia 4i2tic it3ica 5i5tick it3ig it5ill i2tim 2itio 4itis i4tism i2t5o5m 4iton i4tram it5ry 4itt it3uat i5tud it3ul 4itz. i1u 2iv iv3ell iv3en. i4v3er. i4vers. iv5il. iv5io iv1it i5vore iv3o3ro i4v3ot 4i5w ix4o 4iy 4izar izi4 5izont 5ja jac4q ja4p 1je jer5s 4jestie 4jesty jew3 jo4p 5judg 3ka. k3ab k5ag kais4 kal4 k1b k2ed 1kee ke4g ke5li k3en4d k1er kes4 k3est. ke4ty k3f kh4 k1i 5ki. 5k2ic k4ill kilo5 k4im k4in. kin4de k5iness kin4g ki4p kis4 k5ish kk4 k1l 4kley 4kly k1m k5nes 1k2no ko5r kosh4 k3ou kro5n 4k1s2 k4sc ks4l k4sy k5t k1w lab3ic l4abo laci4 l4ade la3dy lag4n lam3o 3land lan4dl lan5et lan4te lar4g lar3i las4e la5tan 4lateli 4lativ 4lav la4v4a 2l1b lbin4 4l1c2 lce4 l3ci 2ld l2de ld4ere ld4eri ldi4 ld5is l3dr l4dri le2a le4bi left5 5leg. 5legg le4mat lem5atic 4len. 3lenc 5lene. 1lent le3ph le4pr lera5b ler4e 3lerg 3l4eri l4ero les2 le5sco 5lesq 3less 5less. l3eva lev4er. lev4era lev4ers 3ley 4leye 2lf l5fr 4l1g4 l5ga lgar3 l4ges lgo3 2l3h li4ag li2am liar5iz li4as li4ato li5bi 5licio li4cor 4lics 4lict. l4icu l3icy l3ida lid5er 3lidi lif3er l4iff li4fl 5ligate 3ligh li4gra 3lik 4l4i4l lim4bl lim3i li4mo l4im4p l4ina 1l4ine lin3ea lin3i link5er li5og 4l4iq lis4p l1it l2it. 5litica l5i5tics liv3er l1iz 4lj lka3 l3kal lka4t l1l l4law l2le l5lea l3lec l3leg l3lel l3le4n l3le4t ll2i l2lin4 l5lina ll4o lloqui5 ll5out l5low 2lm l5met lm3ing l4mod lmon4 2l1n2 3lo. lob5al lo4ci 4lof 3logic l5ogo 3logu lom3er 5long lon4i l3o3niz lood5 5lope. lop3i l3opm lora4 lo4rato lo5rie lor5ou 5los. los5et 5losophiz 5losophy los4t lo4ta loun5d 2lout 4lov 2lp lpa5b l3pha l5phi lp5ing l3pit l4pl l5pr 4l1r 2l1s2 l4sc l2se l4sie 4lt lt5ag ltane5 l1te lten4 ltera4 lth3i l5ties. ltis4 l1tr ltu2 ltur3a lu5a lu3br luch4 lu3ci lu3en luf4 lu5id lu4ma 5lumi l5umn. 5lumnia lu3o luo3r 4lup luss4 lus3te 1lut l5ven l5vet4 2l1w 1ly 4lya 4lyb ly5me ly3no 2lys4 l5yse 1ma 2mab ma2ca ma5chine ma4cl mag5in 5magn 2mah maid5 4mald ma3lig ma5lin mal4li mal4ty 5mania man5is man3iz 4map ma5rine. ma5riz mar4ly mar3v ma5sce mas4e mas1t 5mate math3 ma3tis 4matiza 4m1b mba4t5 m5bil m4b3ing mbi4v 4m5c 4me. 2med 4med. 5media me3die m5e5dy me2g mel5on mel4t me2m mem1o3 1men men4a men5ac men4de 4mene men4i mens4 mensu5 3ment men4te me5on m5ersa 2mes 3mesti me4ta met3al me1te me5thi m4etr 5metric me5trie me3try me4v 4m1f 2mh 5mi. mi3a mid4a mid4g mig4 3milia m5i5lie m4ill min4a 3mind m5inee m4ingl min5gli m5ingly min4t m4inu miot4 m2is mis4er. mis5l mis4ti m5istry 4mith m2iz 4mk 4m1l m1m mma5ry 4m1n mn4a m4nin mn4o 1mo 4mocr 5mocratiz mo2d1 mo4go mois2 moi5se 4mok mo5lest mo3me mon5et mon5ge moni3a mon4ism mon4ist mo3niz monol4 mo3ny. mo2r 4mora. mos2 mo5sey mo3sp moth3 m5ouf 3mous mo2v 4m1p mpara5 mpa5rab mpar5i m3pet mphas4 m2pi mpi4a mp5ies m4p1in m5pir mp5is mpo3ri mpos5ite m4pous mpov5 mp4tr m2py 4m3r 4m1s2 m4sh m5si 4mt 1mu mula5r4 5mult multi3 3mum mun2 4mup mu4u 4mw 1na 2n1a2b n4abu 4nac. na4ca n5act nag5er. nak4 na4li na5lia 4nalt na5mit n2an nanci4 nan4it nank4 nar3c 4nare nar3i nar4l n5arm n4as nas4c nas5ti n2at na3tal nato5miz n2au nau3se 3naut nav4e 4n1b4 ncar5 n4ces. n3cha n5cheo n5chil n3chis nc1in nc4it ncour5a n1cr n1cu n4dai n5dan n1de nd5est. ndi4b n5d2if n1dit n3diz n5duc ndu4r nd2we 2ne. n3ear ne2b neb3u ne2c 5neck 2ned ne4gat neg5ativ 5nege ne4la nel5iz ne5mi ne4mo 1nen 4nene 3neo ne4po ne2q n1er nera5b n4erar n2ere n4er5i ner4r 1nes 2nes. 4nesp 2nest 4nesw 3netic ne4v n5eve ne4w n3f n4gab n3gel nge4n4e n5gere n3geri ng5ha n3gib ng1in n5git n4gla ngov4 ng5sh n1gu n4gum n2gy 4n1h4 nha4 nhab3 nhe4 3n4ia ni3an ni4ap ni3ba ni4bl ni4d ni5di ni4er ni2fi ni5ficat n5igr nik4 n1im ni3miz n1in 5nine. nin4g ni4o 5nis. nis4ta n2it n4ith 3nitio n3itor ni3tr n1j 4nk2 n5kero n3ket nk3in n1kl 4n1l n5m nme4 nmet4 4n1n2 nne4 nni3al nni4v nob4l no3ble n5ocl 4n3o2d 3noe 4nog noge4 nois5i no5l4i 5nologis 3nomic n5o5miz no4mo no3my no4n non4ag non5i n5oniz 4nop 5nop5o5li nor5ab no4rary 4nosc nos4e nos5t no5ta 1nou 3noun nov3el3 nowl3 n1p4 npi4 npre4c n1q n1r nru4 2n1s2 ns5ab nsati4 ns4c n2se n4s3es nsid1 nsig4 n2sl ns3m n4soc ns4pe n5spi nsta5bl n1t nta4b nter3s nt2i n5tib nti4er nti2f n3tine n4t3ing nti4p ntrol5li nt4s ntu3me nu1a nu4d nu5en nuf4fe n3uin 3nu3it n4um nu1me n5umi 3nu4n n3uo nu3tr n1v2 n1w4 nym4 nyp4 4nz n3za 4oa oad3 o5a5les oard3 oas4e oast5e oat5i ob3a3b o5bar obe4l o1bi o2bin ob5ing o3br ob3ul o1ce och4 o3chet ocif3 o4cil o4clam o4cod oc3rac oc5ratiz ocre3 5ocrit octor5a oc3ula o5cure od5ded od3ic odi3o o2do4 odor3 od5uct. od5ucts o4el o5eng o3er oe4ta o3ev o2fi of5ite ofit4t o2g5a5r og5ativ o4gato o1ge o5gene o5geo o4ger o3gie 1o1gis og3it o4gl o5g2ly 3ogniz o4gro ogu5i 1ogy 2ogyn o1h2 ohab5 oi2 oic3es oi3der oiff4 oig4 oi5let o3ing oint5er o5ism oi5son oist5en oi3ter o5j 2ok o3ken ok5ie o1la o4lan olass4 ol2d old1e ol3er o3lesc o3let ol4fi ol2i o3lia o3lice ol5id. o3li4f o5lil ol3ing o5lio o5lis. ol3ish o5lite o5litio o5liv olli4e ol5ogiz olo4r ol5pl ol2t ol3ub ol3ume ol3un o5lus ol2v o2ly om5ah oma5l om5atiz om2be om4bl o2me om3ena om5erse o4met om5etry o3mia om3ic. om3ica o5mid om1in o5mini 5ommend omo4ge o4mon om3pi ompro5 o2n on1a on4ac o3nan on1c 3oncil 2ond on5do o3nen on5est on4gu on1ic o3nio on1is o5niu on3key on4odi on3omy on3s onspi4 onspir5a onsu4 onten4 on3t4i ontif5 on5um onva5 oo2 ood5e ood5i oo4k oop3i o3ord oost5 o2pa ope5d op1er 3opera 4operag 2oph o5phan o5pher op3ing o3pit o5pon o4posi o1pr op1u opy5 o1q o1ra o5ra. o4r3ag or5aliz or5ange ore5a o5real or3ei ore5sh or5est. orew4 or4gu 4o5ria or3ica o5ril or1in o1rio or3ity o3riu or2mi orn2e o5rof or3oug or5pe 3orrh or4se ors5en orst4 or3thi or3thy or4ty o5rum o1ry os3al os2c os4ce o3scop 4oscopi o5scr os4i4e os5itiv os3ito os3ity osi4u os4l o2so os4pa os4po os2ta o5stati os5til os5tit o4tan otele4g ot3er. ot5ers o4tes 4oth oth5esi oth3i4 ot3ic. ot5ica o3tice o3tif o3tis oto5s ou2 ou3bl ouch5i ou5et ou4l ounc5er oun2d ou5v ov4en over4ne over3s ov4ert o3vis oviti4 o5v4ol ow3der ow3el ow5est ow1i own5i o4wo oy1a 1pa pa4ca pa4ce pac4t p4ad 5pagan p3agat p4ai pain4 p4al pan4a pan3el pan4ty pa3ny pa1p pa4pu para5bl par5age par5di 3pare par5el p4a4ri par4is pa2te pa5ter 5pathic pa5thy pa4tric pav4 3pay 4p1b pd4 4pe. 3pe4a pear4l pe2c 2p2ed 3pede 3pedi pedia4 ped4ic p4ee pee4d pek4 pe4la peli4e pe4nan p4enc pen4th pe5on p4era. pera5bl p4erag p4eri peri5st per4mal perme5 p4ern per3o per3ti pe5ru per1v pe2t pe5ten pe5tiz 4pf 4pg 4ph. phar5i phe3no ph4er ph4es. ph1ic 5phie ph5ing 5phisti 3phiz ph2l 3phob 3phone 5phoni pho4r 4phs ph3t 5phu 1phy pi3a pian4 pi4cie pi4cy p4id p5ida pi3de 5pidi 3piec pi3en pi4grap pi3lo pi2n p4in. pind4 p4ino 3pi1o pion4 p3ith pi5tha pi2tu 2p3k2 1p2l2 3plan plas5t pli3a pli5er 4plig pli4n ploi4 plu4m plum4b 4p1m 2p3n po4c 5pod. po5em po3et5 5po4g poin2 5point poly5t po4ni po4p 1p4or po4ry 1pos pos1s p4ot po4ta 5poun 4p1p ppa5ra p2pe p4ped p5pel p3pen p3per p3pet ppo5site pr2 pray4e 5preci pre5co pre3em pref5ac pre4la pre3r p3rese 3press pre5ten pre3v 5pri4e prin4t3 pri4s pris3o p3roca prof5it pro3l pros3e pro1t 2p1s2 p2se ps4h p4sib 2p1t pt5a4b p2te p2th pti3m ptu4r p4tw pub3 pue4 puf4 pul3c pu4m pu2n pur4r 5pus pu2t 5pute put3er pu3tr put4ted put4tin p3w qu2 qua5v 2que. 3quer 3quet 2rab ra3bi rach4e r5acl raf5fi raf4t r2ai ra4lo ram3et r2ami rane5o ran4ge r4ani ra5no rap3er 3raphy rar5c rare4 rar5ef 4raril r2as ration4 rau4t ra5vai rav3el ra5zie r1b r4bab r4bag rbi2 rbi4f r2bin r5bine rb5ing. rb4o r1c r2ce rcen4 r3cha rch4er r4ci4b rc4it rcum3 r4dal rd2i rdi4a rdi4er rdin4 rd3ing 2re. re1al re3an re5arr 5reav re4aw r5ebrat rec5oll rec5ompe re4cre 2r2ed re1de re3dis red5it re4fac re2fe re5fer. re3fi re4fy reg3is re5it re1li re5lu r4en4ta ren4te re1o re5pin re4posi re1pu r1er4 r4eri rero4 re5ru r4es. re4spi ress5ib res2t re5stal re3str re4ter re4ti4z re3tri reu2 re5uti rev2 re4val rev3el r5ev5er. re5vers re5vert re5vil rev5olu re4wh r1f rfu4 r4fy rg2 rg3er r3get r3gic rgi4n rg3ing r5gis r5git r1gl rgo4n r3gu rh4 4rh. 4rhal ri3a ria4b ri4ag r4ib rib3a ric5as r4ice 4rici 5ricid ri4cie r4ico rid5er ri3enc ri3ent ri1er ri5et rig5an 5rigi ril3iz 5riman rim5i 3rimo rim4pe r2ina 5rina. rin4d rin4e rin4g ri1o 5riph riph5e ri2pl rip5lic r4iq r2is r4is. ris4c r3ish ris4p ri3ta3b r5ited. rit5er. rit5ers rit3ic ri2tu rit5ur riv5el riv3et riv3i r3j r3ket rk4le rk4lin r1l rle4 r2led r4lig r4lis rl5ish r3lo4 r1m rma5c r2me r3men rm5ers rm3ing r4ming. r4mio r3mit r4my r4nar r3nel r4ner r5net r3ney r5nic r1nis4 r3nit r3niv rno4 r4nou r3nu rob3l r2oc ro3cr ro4e ro1fe ro5fil rok2 ro5ker 5role. rom5ete rom4i rom4p ron4al ron4e ro5n4is ron4ta 1room 5root ro3pel rop3ic ror3i ro5ro ros5per ros4s ro4the ro4ty ro4va rov5el rox5 r1p r4pea r5pent rp5er. r3pet rp4h4 rp3ing r3po r1r4 rre4c rre4f r4reo rre4st rri4o rri4v rron4 rros4 rrys4 4rs2 r1sa rsa5ti rs4c r2se r3sec rse4cr rs5er. rs3es rse5v2 r1sh r5sha r1si r4si4b rson3 r1sp r5sw rtach4 r4tag r3teb rten4d rte5o r1ti rt5ib rti4d r4tier r3tig rtil3i rtil4l r4tily r4tist r4tiv r3tri rtroph4 rt4sh ru3a ru3e4l ru3en ru4gl ru3in rum3pl ru2n runk5 run4ty r5usc ruti5n rv4e rvel4i r3ven rv5er. r5vest r3vey r3vic rvi4v r3vo r1w ry4c 5rynge ry3t sa2 2s1ab 5sack sac3ri s3act 5sai salar4 sal4m sa5lo sal4t 3sanc san4de s1ap sa5ta 5sa3tio sat3u sau4 sa5vor 5saw 4s5b scan4t5 sca4p scav5 s4ced 4scei s4ces sch2 s4cho 3s4cie 5scin4d scle5 s4cli scof4 4scopy scour5a s1cu 4s5d 4se. se4a seas4 sea5w se2c3o 3sect 4s4ed se4d4e s5edl se2g seg3r 5sei se1le 5self 5selv 4seme se4mol sen5at 4senc sen4d s5ened sen5g s5enin 4sentd 4sentl sep3a3 4s1er. s4erl ser4o 4servo s1e4s se5sh ses5t 5se5um 5sev sev3en sew4i 5sex 4s3f 2s3g s2h 2sh. sh1er 5shev sh1in sh3io 3ship shiv5 sho4 sh5old shon3 shor4 short5 4shw si1b s5icc 3side. 5sides 5sidi si5diz 4signa sil4e 4sily 2s1in s2ina 5sine. s3ing 1sio 5sion sion5a si2r sir5a 1sis 3sitio 5siu 1siv 5siz sk2 4ske s3ket sk5ine sk5ing s1l2 s3lat s2le slith5 2s1m s3ma small3 sman3 smel4 s5men 5smith smol5d4 s1n4 1so so4ce soft3 so4lab sol3d2 so3lic 5solv 3som 3s4on. sona4 son4g s4op 5sophic s5ophiz s5ophy sor5c sor5d 4sov so5vi 2spa 5spai spa4n spen4d 2s5peo 2sper s2phe 3spher spho5 spil4 sp5ing 4spio s4ply s4pon spor4 4spot squal4l s1r 2ss s1sa ssas3 s2s5c s3sel s5seng s4ses. s5set s1si s4sie ssi4er ss5ily s4sl ss4li s4sn sspend4 ss2t ssur5a ss5w 2st. s2tag s2tal stam4i 5stand s4ta4p 5stat. s4ted stern5i s5tero ste2w stew5a s3the st2i s4ti. s5tia s1tic 5stick s4tie s3tif st3ing 5stir s1tle 5stock stom3a 5stone s4top 3store st4r s4trad 5stratu s4tray s4trid 4stry 4st3w s2ty 1su su1al su4b3 su2g3 su5is suit3 s4ul su2m sum3i su2n su2r 4sv sw2 4swo s4y 4syc 3syl syn5o sy5rin 1ta 3ta. 2tab ta5bles 5taboliz 4taci ta5do 4taf4 tai5lo ta2l ta5la tal5en tal3i 4talk tal4lis ta5log ta5mo tan4de tanta3 ta5per ta5pl tar4a 4tarc 4tare ta3riz tas4e ta5sy 4tatic ta4tur taun4 tav4 2taw tax4is 2t1b 4tc t4ch tch5et 4t1d 4te. tead4i 4teat tece4 5tect 2t1ed te5di 1tee teg4 te5ger te5gi 3tel. teli4 5tels te2ma2 tem3at 3tenan 3tenc 3tend 4tenes 1tent ten4tag 1teo te4p te5pe ter3c 5ter3d 1teri ter5ies ter3is teri5za 5ternit ter5v 4tes. 4tess t3ess. teth5e 3teu 3tex 4tey 2t1f 4t1g 2th. than4 th2e 4thea th3eas the5at the3is 3thet th5ic. th5ica 4thil 5think 4thl th5ode 5thodic 4thoo thor5it tho5riz 2ths 1tia ti4ab ti4ato 2ti2b 4tick t4ico t4ic1u 5tidi 3tien tif2 ti5fy 2tig 5tigu till5in 1tim 4timp tim5ul 2t1in t2ina 3tine. 3tini 1tio ti5oc tion5ee 5tiq ti3sa 3tise tis4m ti5so tis4p 5tistica ti3tl ti4u 1tiv tiv4a 1tiz ti3za ti3zen 2tl t5la tlan4 3tle. 3tled 3tles. t5let. t5lo 4t1m tme4 2t1n2 1to to3b to5crat 4todo 2tof to2gr to5ic to2ma tom4b to3my ton4ali to3nat 4tono 4tony to2ra to3rie tor5iz tos2 5tour 4tout to3war 4t1p 1tra tra3b tra5ch traci4 trac4it trac4te tras4 tra5ven trav5es5 tre5f tre4m trem5i 5tria tri5ces 5tricia 4trics 2trim tri4v tro5mi tron5i 4trony tro5phe tro3sp tro3v tru5i trus4 4t1s2 t4sc tsh4 t4sw 4t3t2 t4tes t5to ttu4 1tu tu1a tu3ar tu4bi tud2 4tue 4tuf4 5tu3i 3tum tu4nis 2t3up. 3ture 5turi tur3is tur5o tu5ry 3tus 4tv tw4 4t1wa twis4 4two 1ty 4tya 2tyl type3 ty5ph 4tz tz4e 4uab uac4 ua5na uan4i uar5ant uar2d uar3i uar3t u1at uav4 ub4e u4bel u3ber u4bero u1b4i u4b5ing u3ble. u3ca uci4b uc4it ucle3 u3cr u3cu u4cy ud5d ud3er ud5est udev4 u1dic ud3ied ud3ies ud5is u5dit u4don ud4si u4du u4ene uens4 uen4te uer4il 3ufa u3fl ugh3en ug5in 2ui2 uil5iz ui4n u1ing uir4m uita4 uiv3 uiv4er. u5j 4uk u1la ula5b u5lati ulch4 5ulche ul3der ul4e u1len ul4gi ul2i u5lia ul3ing ul5ish ul4lar ul4li4b ul4lis 4ul3m u1l4o 4uls uls5es ul1ti ultra3 4ultu u3lu ul5ul ul5v um5ab um4bi um4bly u1mi u4m3ing umor5o um2p unat4 u2ne un4er u1ni un4im u2nin un5ish uni3v un3s4 un4sw unt3ab un4ter. un4tes unu4 un5y un5z u4ors u5os u1ou u1pe uper5s u5pia up3ing u3pl up3p upport5 upt5ib uptu4 u1ra 4ura. u4rag u4ras ur4be urc4 ur1d ure5at ur4fer ur4fr u3rif uri4fic ur1in u3rio u1rit ur3iz ur2l url5ing. ur4no uros4 ur4pe ur4pi urs5er ur5tes ur3the urti4 ur4tie u3ru 2us u5sad u5san us4ap usc2 us3ci use5a u5sia u3sic us4lin us1p us5sl us5tere us1tr u2su usur4 uta4b u3tat 4ute. 4utel 4uten uten4i 4u1t2i uti5liz u3tine ut3ing ution5a u4tis 5u5tiz u4t1l ut5of uto5g uto5matic u5ton u4tou uts4 u3u uu4m u1v2 uxu3 uz4e 1va 5va. 2v1a4b vac5il vac3u vag4 va4ge va5lie val5o val1u va5mo va5niz va5pi var5ied 3vat 4ve. 4ved veg3 v3el. vel3li ve4lo v4ely ven3om v5enue v4erd 5vere. v4erel v3eren ver5enc v4eres ver3ie vermi4n 3verse ver3th v4e2s 4ves. ves4te ve4te vet3er ve4ty vi5ali 5vian 5vide. 5vided 4v3iden 5vides 5vidi v3if vi5gn vik4 2vil 5vilit v3i3liz v1in 4vi4na v2inc vin5d 4ving vio3l v3io4r vi1ou vi4p vi5ro vis3it vi3so vi3su 4viti vit3r 4vity 3viv 5vo. voi4 3vok vo4la v5ole 5volt 3volv vom5i vor5ab vori4 vo4ry vo4ta 4votee 4vv4 v4y w5abl 2wac wa5ger wag5o wait5 w5al. wam4 war4t was4t wa1te wa5ver w1b wea5rie weath3 wed4n weet3 wee5v wel4l w1er west3 w3ev whi4 wi2 wil2 will5in win4de win4g wir4 3wise with3 wiz5 w4k wl4es wl3in w4no 1wo2 wom1 wo5ven w5p wra4 wri4 writa4 w3sh ws4l ws4pe w5s4t 4wt wy4 x1a xac5e x4ago xam3 x4ap xas5 x3c2 x1e xe4cuto x2ed xer4i xe5ro x1h xhi2 xhil5 xhu4 x3i xi5a xi5c xi5di x4ime xi5miz x3o x4ob x3p xpan4d xpecto5 xpe3d x1t2 x3ti x1u xu3a xx4 y5ac 3yar4 y5at y1b y1c y2ce yc5er y3ch ych4e ycom4 ycot4 y1d y5ee y1er y4erf yes4 ye4t y5gi 4y3h y1i y3la ylla5bl y3lo y5lu ymbol5 yme4 ympa3 yn3chr yn5d yn5g yn5ic 5ynx y1o4 yo5d y4o5g yom4 yo5net y4ons y4os y4ped yper5 yp3i y3po y4poc yp2ta y5pu yra5m yr5ia y3ro yr4r ys4c y3s2e ys3ica ys3io 3ysis y4so yss4 ys1t ys3ta ysur4 y3thin yt3ic y1w za1 z5a2b zar2 4zb 2ze ze4n ze4p z1er ze3ro zet4 2z1i z4il z4is 5zl 4zm 1zo zo4m zo5ol zte4 4z1z2 z4zy } \hyphenation{ % Do NOT make any alterations to this list! --- DEK as-so-ciate as-so-ciates dec-li-na-tion oblig-a-tory phil-an-thropic present presents project projects reci-procity re-cog-ni-zance ref-or-ma-tion ret-ri-bu-tion ta-ble } 9base-6/troff/t10.c0000644000175000017500000002234411402154555013443 0ustar anselmanselm#include "tdef.h" #include "fns.h" #include "ext.h" /* * troff10.c * * typesetter interface */ int vpos = 0; /* absolute vertical position on page */ int hpos = 0; /* ditto horizontal */ extern Font fonts[MAXFONTS+1]; int Inch; int Hor; int Vert; int Unitwidth; int nfonts; void t_ptinit(void) { int i; char buf[100], *p; hmot = t_hmot; makem = t_makem; setabs = t_setabs; setch = t_setch; sethl = t_sethl; setht = t_setht; setslant = t_setslant; vmot = t_vmot; xlss = t_xlss; findft = t_findft; width = t_width; mchbits = t_mchbits; ptlead = t_ptlead; ptout = t_ptout; ptpause = t_ptpause; setfont = t_setfont; setps = t_setps; setwd = t_setwd; /* open table for device, */ /* read in resolution, size info, font info, etc., set params */ if ((p = getenv("TYPESETTER")) != 0) strcpy(devname, p); if (termtab[0] == 0) strcpy(termtab, DWBfontdir); if (fontdir[0] == 0) strcpy(fontdir, DWBfontdir); if (devname[0] == 0) strcpy(devname, TDEVNAME); hyf = 1; lg = 1; sprintf(buf, "/dev%s/DESC", devname); strcat(termtab, buf); if (getdesc(termtab) < 0) { ERROR "can't open DESC file %s", termtab WARN; done3(1); } if (!ascii) { OUT "x T %s\n", devname PUT; OUT "x res %d %d %d\n", Inch, Hor, Vert PUT; OUT "x init\n" PUT; } for (i = 1; i <= nfonts; i++) setfp(i, fontlab[i], (char *) 0, 0); sps = EM/3; /* space size */ ics = EM; /* insertion character space */ for (i = 0; i < (NTAB - 1) && DTAB * (i + 1) < TABMASK; i++) tabtab[i] = DTAB * (i + 1); tabtab[NTAB-1] = 0; pl = 11 * INCH; /* paper length */ po = PO; /* page offset */ spacesz = SS; lss = lss1 = VS; ll = ll1 = lt = lt1 = LL; t_specnames(); /* install names like "hyphen", etc. */ } void t_specnames(void) { int i; for (i = 0; spnames[i].n; i++) *spnames[i].n = chadd(spnames[i].v, Troffchar, Install); } void t_ptout(Tchar i) { int dv; Tchar *k; int temp, a, b; int diff; if (cbits(i) != '\n') { if (olinep >= oline + olnsize) { diff = olinep - oline; olnsize += OLNSIZE; if ((oline = (Tchar *)realloc((char *)oline, olnsize * sizeof(Tchar))) != NULL) { if (diff && olinep) olinep = oline + diff; } else { ERROR "Output line overflow." WARN; done(2); } } *olinep++ = i; return; } if (olinep == oline) { lead += lss; return; } hpos = po; /* ??? */ esc = 0; /* ??? */ ptesc(); /* the problem is to get back to the left end of the line */ dv = 0; for (k = oline; k < olinep; k++) { if (ismot(*k) && isvmot(*k)) { temp = absmot(*k); if (isnmot(*k)) temp = -temp; dv += temp; } } if (dv) { vflag++; *olinep++ = makem(-dv); vflag = 0; } b = dip->blss + lss; lead += dip->blss + lss; dip->blss = 0; for (k = oline; k < olinep; ) k += ptout0(k); /* now passing a pointer! */ olinep = oline; lead += dip->alss; a = dip->alss; dip->alss = 0; /* OUT "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos PUT; */ OUT "n%d %d\n", b, a PUT; /* be nice to chuck */ } int ptout0(Tchar *pi) { int j, k, w; int z, dx, dy, dx2, dy2, n; Tchar i; int outsize; /* size of object being printed */ w = 0; outsize = 1; /* default */ i = *pi; k = cbits(i); if (ismot(i)) { j = absmot(i); if (isnmot(i)) j = -j; if (isvmot(i)) lead += j; else esc += j; return(outsize); } if (k == CHARHT) { xpts = fbits(i); /* sneaky, font bits as size bits */ if (xpts != mpts) ptps(); OUT "x H %ld\n", sbits(i) PUT; return(outsize); } if (k == SLANT) { OUT "x S %ld\n", sfbits(i)-180 PUT; return(outsize); } if (k == WORDSP) { oput('w'); return(outsize); } if (sfbits(i) == oldbits) { xfont = pfont; xpts = ppts; } else xbits(i, 2); if (k == XON) { extern int xon; ptflush(); /* guarantee that everything is out */ if (esc) ptesc(); if (xfont != mfont) ptfont(); if (xpts != mpts) ptps(); if (lead) ptlead(); OUT "x X " PUT; xon++; for (j = 1; cbits(pi[j]) != XOFF; j++) outascii(pi[j]); oput('\n'); xon--; return j+1; } if (k < 040 && k != DRAWFCN) return(outsize); j = z = 0; if (k != DRAWFCN) { if (widcache[k].fontpts == (xfont<<8) + xpts && !setwdf) { w = widcache[k].width; bd = 0; cs = 0; } else w = getcw(k); if (cs) { if (bd) w += (bd - 1) * HOR; j = (cs - w) / 2; w = cs - j; if (bd) w -= (bd - 1) * HOR; } if (iszbit(i)) { if (cs) w = -j; else w = 0; z = 1; } } esc += j; if (xfont != mfont) ptfont(); if (xpts != mpts) ptps(); if (lead) ptlead(); /* put out the real character here */ if (k == DRAWFCN) { if (esc) ptesc(); w = 0; dx = absmot(pi[3]); if (isnmot(pi[3])) dx = -dx; dy = absmot(pi[4]); if (isnmot(pi[4])) dy = -dy; switch (cbits(pi[1])) { case DRAWCIRCLE: /* circle */ OUT "D%c %d\n", DRAWCIRCLE, dx PUT; /* dx is diameter */ hpos += dx; break; case DRAWELLIPSE: OUT "D%c %d %d\n", DRAWELLIPSE, dx, dy PUT; hpos += dx; break; case DRAWBUILD: k = cbits(pi[2]); OUT "D%c %d ", DRAWBUILD, dx PUT; if (k < ALPHABET) OUT "%c\n", k PUT; else ptchname(k); hpos += dx; break; case DRAWLINE: /* line */ k = cbits(pi[2]); OUT "D%c %d %d ", DRAWLINE, dx, dy PUT; if (k < ALPHABET) OUT "%c\n", k PUT; else ptchname(k); hpos += dx; vpos += dy; break; case DRAWARC: /* arc */ dx2 = absmot(pi[5]); if (isnmot(pi[5])) dx2 = -dx2; dy2 = absmot(pi[6]); if (isnmot(pi[6])) dy2 = -dy2; OUT "D%c %d %d %d %d\n", DRAWARC, dx, dy, dx2, dy2 PUT; hpos += dx + dx2; vpos += dy + dy2; break; case 's': /* using 's' internally to avoid .tr ~ */ pi[1] = '~'; case DRAWSPLINE: /* spline */ default: /* something else; copy it like spline */ OUT "D%c %d %d", (char)cbits(pi[1]), dx, dy PUT; hpos += dx; vpos += dy; if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) { /* it was somehow defective */ OUT "\n" PUT; break; } for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) { dx = absmot(pi[n]); if (isnmot(pi[n])) dx = -dx; dy = absmot(pi[n+1]); if (isnmot(pi[n+1])) dy = -dy; OUT " %d %d", dx, dy PUT; hpos += dx; vpos += dy; } OUT "\n" PUT; break; } for (n = 3; cbits(pi[n]) != DRAWFCN; n++) ; outsize = n + 1; } else if (k < ALPHABET) { /* try to go faster and compress output */ /* by printing nnc for small positive motion followed by c */ /* kludgery; have to make sure set all the vars too */ if (esc > 0 && esc < 100) { oput(esc / 10 + '0'); oput(esc % 10 + '0'); oput(k); hpos += esc; esc = 0; } else { if (esc) ptesc(); oput('c'); oput(k); oput('\n'); } } else { if (esc) ptesc(); ptchname(k); } if (bd) { bd -= HOR; if (esc += bd) ptesc(); if (k < ALPHABET) OUT "c%c\n", k PUT; else ptchname(k); if (z) esc -= bd; } esc += w; return(outsize); } void ptchname(int k) { char *chn = chname(k); switch (chn[0]) { case MBchar: OUT "c%s\n", chn+1 PUT; /* \n not needed? */ break; case Number: OUT "N%s\n", chn+1 PUT; break; case Troffchar: OUT "C%s\n", chn+1 PUT; break; default: ERROR "illegal char type %s", chn WARN; break; } } void ptflush(void) /* get us to a clean output state */ { if (TROFF) { /* ptesc(); but always H, no h */ hpos += esc; OUT "\nH%d\n", hpos PUT; esc = 0; ptps(); ptfont(); ptlead(); } } void ptps(void) { int i, j, k; i = xpts; for (j = 0; i > (k = pstab[j]); j++) if (!k) { k = pstab[--j]; break; } if (!ascii) OUT "s%d\n", k PUT; /* really should put out string rep of size */ mpts = i; } void ptfont(void) { mfont = xfont; if (ascii) return; if (xfont > nfonts) { ptfpcmd(0, fonts[xfont].longname, 0); /* Put the desired font in the * fontcache of the filter */ OUT "f0\n" PUT; /* make sure that it gets noticed */ } else OUT "f%d\n", xfont PUT; } void ptfpcmd(int f, char *s, char *longname) { if (f > nfonts) /* a bit risky? */ f = 0; if (longname) { OUT "x font %d %s %s\n", f, s, longname PUT; } else { OUT "x font %d %s\n", f, s PUT; } /* OUT "f%d\n", xfont PUT; /* need this for buggy version of adobe transcript */ /* which apparently believes that x font means */ /* to set the font, not just the position. */ } void t_ptlead(void) { vpos += lead; if (!ascii) OUT "V%d\n", vpos PUT; lead = 0; } void ptesc(void) { hpos += esc; if (!ascii) if (esc > 0) { oput('h'); if (esc>=10 && esc<100) { oput(esc/10 + '0'); oput(esc%10 + '0'); } else OUT "%d", esc PUT; } else OUT "H%d\n", hpos PUT; esc = 0; } void ptpage(int n) /* called at end of each output page, we hope */ { int i; if (NROFF) return; ptlead(); vpos = 0; if (ascii) return; OUT "p%d\n", n PUT; /* new page */ for (i = 0; i <= nfonts; i++) if (fontlab[i]) { if (fonts[i].truename) OUT "x font %d %s %s\n", i, fonts[i].longname, fonts[i].truename PUT; else OUT "x font %d %s\n", i, fonts[i].longname PUT; } ptps(); ptfont(); } void pttrailer(void) { if (TROFF) OUT "x trailer\n" PUT; } void ptstop(void) { if (TROFF) OUT "x stop\n" PUT; } void t_ptpause(void) { if (ascii) return; ptlead(); vpos = 0; pttrailer(); ptlead(); OUT "x pause\n" PUT; flusho(); mpts = mfont = 0; ptesc(); esc = po; hpos = vpos = 0; /* probably in wrong place */ } 9base-6/troff/n5.c0000644000175000017500000003372411402154555013365 0ustar anselmanselm/* * troff5.c * * misc processing requests */ #include "tdef.h" #include "fns.h" #include "ext.h" int iflist[NIF]; int ifx; int ifnum = 0; /* trying numeric expression for .if or .ie condition */ void casead(void) { int i; ad = 1; /* leave admod alone */ if (skip()) return; switch (i = cbits(getch())) { case 'r': /* right adj, left ragged */ admod = 2; break; case 'l': /* left adj, right ragged */ admod = ad = 0; /* same as casena */ break; case 'c': /*centered adj*/ admod = 1; break; case 'b': case 'n': admod = 0; break; case '0': case '2': case '4': ad = 0; case '1': case '3': case '5': admod = (i - '0') / 2; } } void casena(void) { ad = 0; } void casefi(void) { tbreak(); fi = 1; pendnf = 0; } void casenf(void) { tbreak(); fi = 0; } void casers(void) { dip->nls = 0; } void casens(void) { dip->nls++; } int chget(int c) { Tchar i; i = 0; if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') { ch = i; return(c); } else return cbits(i); /* was (i & BYTEMASK) */ } void casecc(void) { cc = chget('.'); } void casec2(void) { c2 = chget('\''); } void casehc(void) { ohc = chget(OHC); } void casetc(void) { tabc = chget(0); } void caselc(void) { dotc = chget(0); } void casehy(void) { int i; hyf = 1; if (skip()) return; noscale++; i = atoi0(); noscale = 0; if (nonumb) return; hyf = max(i, 0); } void casenh(void) { hyf = 0; } int max(int aa, int bb) { if (aa > bb) return(aa); else return(bb); } void casece(void) { int i; noscale++; skip(); i = max(atoi0(), 0); if (nonumb) i = 1; tbreak(); ce = i; noscale = 0; } void casein(void) { int i; if (skip()) i = in1; else { i = max(hnumb(&in), 0); if (nonumb) i = in1; } tbreak(); in1 = in; in = i; if (!nc) { un = in; setnel(); } } void casell(void) { int i; if (skip()) i = ll1; else { i = max(hnumb(&ll), INCH / 10); if (nonumb) i = ll1; } ll1 = ll; ll = i; setnel(); } void caselt(void) { int i; if (skip()) i = lt1; else { i = max(hnumb(<), 0); if (nonumb) i = lt1; } lt1 = lt; lt = i; } void caseti(void) { int i; if (skip()) return; i = max(hnumb(&in), 0); tbreak(); un1 = i; setnel(); } void casels(void) { int i; noscale++; if (skip()) i = ls1; else { i = max(inumb(&ls), 1); if (nonumb) i = ls1; } ls1 = ls; ls = i; noscale = 0; } void casepo(void) { int i; if (skip()) i = po1; else { i = max(hnumb(&po), 0); if (nonumb) i = po1; } po1 = po; po = i; if (TROFF & !ascii) esc += po - po1; } void casepl(void) { int i; skip(); if ((i = vnumb(&pl)) == 0) pl = 11 * INCH; /*11in*/ else pl = i; if (numtabp[NL].val > pl) numtabp[NL].val = pl; } void casewh(void) { int i, j, k; lgf++; skip(); i = vnumb((int *)0); if (nonumb) return; skip(); j = getrq(); if ((k = findn(i)) != NTRAP) { mlist[k] = j; return; } for (k = 0; k < NTRAP; k++) if (mlist[k] == 0) break; if (k == NTRAP) { flusho(); ERROR "cannot plant trap." WARN; return; } mlist[k] = j; nlist[k] = i; } void casech(void) { int i, j, k; lgf++; skip(); if (!(j = getrq())) return; else for (k = 0; k < NTRAP; k++) if (mlist[k] == j) break; if (k == NTRAP) return; skip(); i = vnumb((int *)0); if (nonumb) mlist[k] = 0; nlist[k] = i; } int findn(int i) { int k; for (k = 0; k < NTRAP; k++) if ((nlist[k] == i) && (mlist[k] != 0)) break; return(k); } void casepn(void) { int i; skip(); noscale++; i = max(inumb(&numtabp[PN].val), 0); noscale = 0; if (!nonumb) { npn = i; npnflg++; } } void casebp(void) { int i; Stack *savframe; if (dip != d) return; savframe = frame; skip(); if ((i = inumb(&numtabp[PN].val)) < 0) i = 0; tbreak(); if (!nonumb) { npn = i; npnflg++; } else if (dip->nls) return; eject(savframe); } void casetm(void) { casetm1(0, stderr); } void casefm(void) { static struct fcache { char *name; FILE *fp; } fcache[15]; int i; if ( skip() || !getname()) { ERROR "fm: missing filename" WARN; return; } for (i = 0; i < 15 && fcache[i].fp != NULL; i++) { if (strcmp(nextf, fcache[i].name) == 0) break; } if (i >= 15) { ERROR "fm: too many streams" WARN; return; } if (fcache[i].fp == NULL) { if( (fcache[i].fp = fopen(unsharp(nextf), "w")) == NULL) { ERROR "fm: cannot open %s", nextf WARN; return; } fcache[i].name = strdupl(nextf); } casetm1(0, fcache[i].fp); } void casetm1(int ab, FILE *out) { int i, j, c; char *p; char tmbuf[NTM]; lgf++; copyf++; if (ab) { if (skip()) ERROR "User Abort" WARN; else { extern int error; int savtrac = trace; i = trace = 0; noscale++; i = inumb(&trace); noscale--; if (i) { error = i; if (nlflg || skip()) ERROR "User Abort, exit code %d", i WARN; } trace = savtrac; } } else skip(); for (i = 0; i < NTM - 2; ) { if ((c = cbits(getch())) == '\n' || c == RIGHT) break; else if (c == MINUS) { /* special pleading for strange encodings */ tmbuf[i++] = '\\'; tmbuf[i++] = '-'; } else if (c == PRESC) { tmbuf[i++] = '\\'; tmbuf[i++] = 'e'; } else if (c == FILLER) { tmbuf[i++] = '\\'; tmbuf[i++] = '&'; } else if (c == UNPAD) { tmbuf[i++] = '\\'; tmbuf[i++] = ' '; } else if (c == OHC) { tmbuf[i++] = '\\'; tmbuf[i++] = '%'; } else if (c >= ALPHABET) { p = chname(c); switch (*p) { case MBchar: strcpy(&tmbuf[i], p+1); break; case Number: sprintf(&tmbuf[i], "\\N'%s'", p+1); break; case Troffchar: if ((j = strlen(p+1)) == 2) sprintf(&tmbuf[i], "\\(%s", p+1); else sprintf(&tmbuf[i], "\\C'%s'", p+1); break; default: sprintf(&tmbuf[i]," %s? ", p); break; } j = strlen(&tmbuf[i]); i += j; } else tmbuf[i++] = c; } tmbuf[i] = 0; if (ab) /* truncate output */ obufp = obuf; /* should be a function in n2.c */ flusho(); if (i) fprintf(out, "%s\n", tmbuf); fflush(out); copyf--; lgf--; } void casesp(void) { casesp1(0); } void casesp1(int a) { int i, j, savlss; tbreak(); if (dip->nls || trap) return; i = findt1(); if (!a) { skip(); j = vnumb((int *)0); if (nonumb) j = lss; } else j = a; if (j == 0) return; if (i < j) j = i; savlss = lss; if (dip != d) i = dip->dnl; else i = numtabp[NL].val; if ((i + j) < 0) j = -i; lss = j; newline(0); lss = savlss; } void casert(void) { int a, *p; skip(); if (dip != d) p = &dip->dnl; else p = &numtabp[NL].val; a = vnumb(p); if (nonumb) a = dip->mkline; if ((a < 0) || (a >= *p)) return; nb++; casesp1(a - *p); } void caseem(void) { lgf++; skip(); em = getrq(); } void casefl(void) { tbreak(); if (!ascii) ptflush(); flusho(); } void caseev(void) { int nxev; if (skip()) { e0: if (evi == 0) return; nxev = evlist[--evi]; goto e1; } noscale++; nxev = atoi0(); noscale = 0; if (nonumb) goto e0; flushi(); if (nxev >= NEV || nxev < 0 || evi >= EVLSZ) { flusho(); ERROR "cannot do .ev %d", nxev WARN; if (error) done2(040); else edone(040); return; } evlist[evi++] = ev; e1: if (ev == nxev) return; ev = nxev; envp = &env[ev]; } void envcopy(Env *e1, Env *e2) /* copy env e2 to e1 */ { *e1 = *e2; /* rumor hath that this fails on some machines */ } void caseel(void) { if (--ifx < 0) { ifx = 0; iflist[0] = 0; } caseif1(2); } void caseie(void) { if (ifx >= NIF) { ERROR "if-else overflow." WARN; ifx = 0; edone(040); } caseif1(1); ifx++; } void caseif(void) { caseif1(0); } void caseif1(int x) { extern int falsef; int notflag, true; Tchar i; if (x == 2) { notflag = 0; true = iflist[ifx]; goto i1; } true = 0; skip(); if ((cbits(i = getch())) == '!') { notflag = 1; } else { notflag = 0; ch = i; } ifnum++; i = atoi0(); ifnum = 0; if (!nonumb) { if (i > 0) true++; goto i1; } i = getch(); switch (cbits(i)) { case 'e': if (!(numtabp[PN].val & 01)) true++; break; case 'o': if (numtabp[PN].val & 01) true++; break; case 'n': if (NROFF) true++; break; case 't': if (TROFF) true++; break; case ' ': break; default: true = cmpstr(i); } i1: true ^= notflag; if (x == 1) iflist[ifx] = !true; if (true) { i2: while ((cbits(i = getch())) == ' ') ; if (cbits(i) == LEFT) goto i2; ch = i; nflush++; } else { if (!nlflg) { copyf++; falsef++; eatblk(0); copyf--; falsef--; } } } void eatblk(int inblk) { int cnt, i; cnt = 0; do { if (ch) { i = cbits(ch); ch = 0; } else i = cbits(getch0()); if (i == ESC) cnt++; else { if (cnt == 1) switch (i) { case '{': i = LEFT; break; case '}': i = RIGHT; break; case '\n': i = 'x'; break; } cnt = 0; } if (i == LEFT) eatblk(1); } while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT))); if (i == '\n') { nlflg++; if (ip == 0) numtabp[CD].val++; } } int cmpstr(Tchar c) { int j, delim; Tchar i; int val; int savapts, savapts1, savfont, savfont1, savpts, savpts1; Tchar string[1280]; Tchar *sp; if (ismot(c)) return(0); delim = cbits(c); savapts = apts; savapts1 = apts1; savfont = font; savfont1 = font1; savpts = pts; savpts1 = pts1; sp = string; while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1]) *sp++ = i; if (sp >= string + 1280) { ERROR "too-long string compare." WARN; edone(0100); } if (nlflg) { val = sp==string; goto rtn; } *sp = 0; apts = savapts; apts1 = savapts1; font = savfont; font1 = savfont1; pts = savpts; pts1 = savpts1; mchbits(); val = 1; sp = string; while ((j = cbits(i = getch())) != delim && j != '\n') { if (*sp != i) { eat(delim); val = 0; goto rtn; } sp++; } if (*sp) val = 0; rtn: apts = savapts; apts1 = savapts1; font = savfont; font1 = savfont1; pts = savpts; pts1 = savpts1; mchbits(); return(val); } void caserd(void) { lgf++; skip(); getname(); if (!iflg) { if (quiet) { if (NROFF) { echo_off(); flusho(); } fprintf(stderr, "\007"); /*bell*/ } else { if (nextf[0]) { fprintf(stderr, "%s:", nextf); } else { fprintf(stderr, "\007"); /*bell*/ } } } collect(); tty++; pushi(RD_OFFSET, PAIR('r','d')); } int rdtty(void) { char onechar; onechar = 0; if (read(0, &onechar, 1) == 1) { if (onechar == '\n') tty++; else tty = 1; if (tty != 3) return(onechar); } tty = 0; if (NROFF && quiet) echo_on(); return(0); } void caseec(void) { eschar = chget('\\'); } void caseeo(void) { eschar = 0; } void caseta(void) { int i, j, k; tabtab[0] = nonumb = 0; for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) { if (skip()) break; k = tabtab[max(i-1, 0)] & TABMASK; if ((j = max(hnumb(&k), 0)) > TABMASK) { ERROR "Tab too far away" WARN; j = TABMASK; } tabtab[i] = j & TABMASK; if (!nonumb) switch (cbits(ch)) { case 'C': tabtab[i] |= CTAB; break; case 'R': tabtab[i] |= RTAB; break; default: /*includes L*/ break; } nonumb = ch = 0; } if (!skip()) ERROR "Too many tab stops" WARN; tabtab[i] = 0; } void casene(void) { int i, j; skip(); i = vnumb((int *)0); if (nonumb) i = lss; if (dip == d && numtabp[NL].val == -1) { newline(1); return; } if (i > (j = findt1())) { i = lss; lss = j; dip->nls = 0; newline(0); lss = i; } } void casetr(void) { int i, j; Tchar k; lgf++; skip(); while ((i = cbits(k=getch())) != '\n') { if (ismot(k)) return; if (ismot(k = getch())) return; if ((j = cbits(k)) == '\n') j = ' '; trtab[i] = j; } } void casecu(void) { cu++; caseul(); } void caseul(void) { int i; noscale++; skip(); i = max(atoi0(), 0); if (nonumb) i = 1; if (ul && (i == 0)) { font = sfont; ul = cu = 0; } if (i) { if (!ul) { sfont = font; font = ulfont; } ul = i; } noscale = 0; mchbits(); } void caseuf(void) { int i, j; if (skip() || !(i = getrq()) || i == 'S' || (j = findft(i)) == -1) ulfont = ULFONT; /*default underline position*/ else ulfont = j; if (NROFF && ulfont == FT) ulfont = ULFONT; } void caseit(void) { int i; lgf++; it = itmac = 0; noscale++; skip(); i = atoi0(); skip(); if (!nonumb && (itmac = getrq())) it = i; noscale = 0; } void casemc(void) { int i; if (icf > 1) ic = 0; icf = 0; if (skip()) return; ic = getch(); icf = 1; skip(); i = max(hnumb((int *)0), 0); if (!nonumb) ics = i; } void casemk(void) { int i, j; if (dip != d) j = dip->dnl; else j = numtabp[NL].val; if (skip()) { dip->mkline = j; return; } if ((i = getrq()) == 0) return; numtabp[findr(i)].val = j; } void casesv(void) { int i; skip(); if ((i = vnumb((int *)0)) < 0) return; if (nonumb) i = 1; sv += i; caseos(); } void caseos(void) { int savlss; if (sv <= findt1()) { savlss = lss; lss = sv; newline(0); lss = savlss; sv = 0; } } void casenm(void) { int i; lnmod = nn = 0; if (skip()) return; lnmod++; noscale++; i = inumb(&numtabp[LN].val); if (!nonumb) numtabp[LN].val = max(i, 0); getnm(&ndf, 1); getnm(&nms, 0); getnm(&ni, 0); getnm(&nmwid, 3); /* really kludgy! */ noscale = 0; nmbits = chbits; } /* * .nm relies on the fact that illegal args are skipped; don't warn * for illegality of these */ void getnm(int *p, int min) { int i; int savtr = trace; eat(' '); if (skip()) return; trace = 0; i = atoi0(); if (nonumb) return; *p = max(i, min); trace = savtr; } void casenn(void) { noscale++; skip(); nn = max(atoi0(), 1); noscale = 0; } void caseab(void) { casetm1(1, stderr); done3(0); } /* nroff terminal handling has been pretty well excised */ /* as part of the merge with troff. these are ghostly remnants, */ /* called, but doing nothing. restore them at your peril. */ void save_tty(void) /*save any tty settings that may be changed*/ { } void restore_tty(void) /*restore tty settings from beginning*/ { } void set_tty(void) { } void echo_off(void) /*turn off ECHO for .rd in "-q" mode*/ { } void echo_on(void) /*restore ECHO after .rd in "-q" mode*/ { } 9base-6/troff/find0000644000175000017500000000001711402154555013527 0ustar anselmanselmgrep $1 *.[ch] 9base-6/troff/hytab.c0000644000175000017500000001607411402154555014151 0ustar anselmanselm/* * Hyphenation digram tables */ typedef unsigned char Uchar; Uchar bxh[26][13] = { 0060,0000,0040,0000,0040,0000,0000,0040,0000,0000,0040,0000,0040 }; Uchar hxx[26][13] = { 0006,0042,0041,0123,0021,0024,0063,0042,0002,0043,0021,0001,0022, 0140,0000,0200,0003,0260,0006,0000,0160,0007,0000,0140,0000,0320, 0220,0000,0160,0005,0240,0010,0000,0100,0006,0000,0200,0000,0320, 0240,0000,0120,0003,0140,0000,0000,0240,0010,0000,0220,0000,0160, 0042,0023,0041,0040,0040,0022,0043,0041,0030,0064,0021,0000,0041, 0100,0000,0140,0000,0220,0006,0000,0140,0003,0000,0200,0000,0000, 0200,0000,0120,0002,0220,0010,0000,0160,0006,0000,0140,0000,0320, 0020,0000,0020,0000,0020,0000,0000,0020,0000,0000,0020,0000,0000, 0043,0163,0065,0044,0022,0043,0104,0042,0061,0146,0061,0000,0007, 0100,0000,0140,0000,0040,0000,0000,0100,0000,0000,0120,0000,0000, 0140,0000,0040,0011,0060,0004,0001,0120,0003,0000,0140,0000,0040, 0200,0000,0100,0000,0140,0000,0000,0140,0000,0000,0140,0000,0240, 0200,0000,0140,0000,0160,0000,0000,0220,0000,0000,0140,0000,0240, 0200,0000,0140,0000,0160,0000,0000,0220,0000,0000,0060,0000,0240, 0021,0043,0041,0121,0040,0023,0042,0003,0142,0042,0061,0001,0022, 0120,0000,0140,0010,0140,0010,0000,0140,0002,0000,0120,0000,0120, 0000,0000,0000,0000,0360,0000,0000,0000,0000,0000,0160,0000,0000, 0100,0000,0040,0005,0120,0000,0000,0100,0000,0000,0060,0000,0140, 0140,0040,0100,0001,0240,0041,0000,0242,0000,0002,0140,0000,0100, 0240,0000,0120,0002,0200,0000,0000,0320,0007,0000,0240,0000,0340, 0101,0021,0041,0020,0040,0005,0042,0121,0002,0021,0201,0000,0020, 0160,0000,0100,0000,0140,0000,0000,0160,0006,0000,0220,0000,0140, 0140,0000,0020,0001,0020,0000,0000,0100,0001,0000,0300,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0106,0041,0040,0147,0040,0000,0063,0041,0001,0102,0160,0002,0002, 0300,0000,0040,0017,0140,0017,0000,0240,0000,0000,0140,0000,0120 }; Uchar bxxh[26][13] = { 0005,0150,0153,0062,0062,0246,0152,0127,0146,0203,0310,0017,0206, 0100,0000,0120,0000,0140,0000,0000,0100,0000,0000,0120,0000,0060, 0100,0000,0040,0000,0060,0000,0000,0060,0000,0000,0220,0000,0040, 0100,0000,0120,0000,0200,0000,0000,0100,0000,0000,0140,0000,0060, 0043,0142,0046,0140,0062,0147,0210,0131,0046,0106,0246,0017,0111, 0060,0000,0020,0000,0060,0000,0000,0040,0000,0000,0100,0000,0000, 0060,0000,0040,0000,0040,0000,0000,0040,0000,0000,0100,0000,0040, 0100,0000,0100,0000,0100,0000,0000,0040,0000,0000,0100,0000,0140, 0066,0045,0145,0140,0000,0070,0377,0030,0130,0103,0003,0017,0006, 0040,0000,0040,0000,0020,0000,0000,0040,0000,0000,0100,0000,0000, 0200,0000,0020,0000,0140,0000,0000,0120,0000,0000,0120,0000,0040, 0120,0000,0040,0000,0060,0000,0000,0060,0000,0000,0160,0000,0040, 0120,0000,0040,0000,0120,0000,0000,0040,0000,0000,0160,0000,0040, 0120,0000,0020,0000,0140,0000,0000,0120,0000,0000,0140,0000,0040, 0051,0126,0150,0140,0060,0210,0146,0006,0006,0165,0003,0017,0244, 0120,0000,0040,0000,0160,0000,0000,0140,0000,0000,0060,0000,0140, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0140,0000,0140,0000,0060,0000,0000,0100,0000,0000,0140,0000,0020, 0120,0000,0020,0000,0060,0000,0000,0060,0000,0000,0060,0000,0040, 0140,0000,0020,0000,0100,0000,0000,0140,0000,0000,0140,0000,0020, 0070,0125,0051,0162,0120,0105,0126,0104,0006,0044,0000,0017,0052, 0140,0000,0020,0000,0140,0000,0000,0060,0000,0000,0060,0000,0040, 0020,0000,0000,0000,0020,0000,0000,0000,0000,0000,0000,0000,0060, 0140,0000,0160,0000,0200,0000,0000,0140,0000,0000,0000,0000,0240, 0065,0042,0060,0200,0000,0210,0222,0146,0006,0204,0220,0012,0003, 0240,0000,0020,0000,0120,0000,0000,0200,0000,0000,0200,0000,0240 }; Uchar xhx[26][13] = { 0032,0146,0042,0107,0076,0102,0042,0146,0202,0050,0006,0000,0051, 0036,0377,0057,0013,0057,0366,0377,0057,0001,0377,0057,0000,0040, 0037,0377,0020,0000,0100,0022,0377,0057,0362,0116,0100,0000,0017, 0057,0377,0057,0031,0137,0363,0377,0037,0362,0270,0077,0000,0117, 0074,0142,0012,0236,0076,0125,0063,0165,0341,0046,0047,0000,0024, 0020,0017,0075,0377,0040,0001,0377,0017,0001,0204,0020,0000,0040, 0057,0017,0057,0340,0140,0362,0314,0117,0003,0302,0100,0000,0057, 0057,0357,0077,0017,0100,0366,0314,0057,0342,0346,0037,0000,0060, 0252,0145,0072,0157,0377,0165,0063,0066,0164,0050,0363,0000,0362, 0000,0000,0020,0000,0020,0000,0000,0017,0000,0000,0020,0000,0000, 0117,0017,0237,0377,0200,0354,0125,0110,0004,0257,0000,0000,0300, 0057,0367,0054,0357,0157,0216,0314,0114,0217,0353,0053,0000,0057, 0077,0213,0077,0077,0177,0317,0377,0114,0377,0352,0077,0000,0076, 0077,0213,0077,0077,0157,0177,0377,0054,0377,0352,0117,0000,0075, 0125,0230,0065,0216,0057,0066,0063,0047,0345,0126,0011,0000,0033, 0057,0377,0051,0360,0120,0361,0273,0056,0001,0256,0057,0000,0060, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0076,0310,0056,0310,0137,0174,0273,0055,0335,0266,0033,0000,0155, 0077,0157,0057,0360,0057,0063,0042,0024,0077,0206,0020,0000,0040, 0057,0037,0077,0360,0100,0365,0377,0037,0362,0176,0050,0000,0026, 0167,0146,0042,0112,0077,0110,0062,0254,0366,0052,0377,0000,0163, 0060,0000,0040,0000,0120,0000,0377,0060,0012,0000,0037,0000,0257, 0037,0232,0157,0361,0040,0003,0125,0010,0001,0256,0000,0000,0340, 0377,0377,0377,0377,0377,0377,0377,0377,0377,0377,0377,0017,0277, 0253,0315,0257,0216,0377,0206,0146,0306,0371,0126,0232,0000,0004, 0057,0012,0100,0360,0160,0360,0000,0040,0000,0017,0157,0000,0176 }; Uchar xxh[26][13] = { 0045,0150,0154,0162,0042,0246,0210,0147,0152,0103,0230,0017,0206, 0100,0000,0040,0000,0140,0000,0000,0100,0000,0021,0120,0017,0060, 0100,0000,0040,0002,0140,0320,0000,0060,0000,0001,0220,0017,0040, 0100,0001,0120,0001,0241,0000,0000,0100,0000,0020,0140,0017,0060, 0023,0162,0046,0142,0022,0207,0210,0131,0052,0106,0250,0017,0110, 0060,0000,0042,0000,0160,0000,0000,0040,0000,0212,0100,0017,0000, 0140,0000,0040,0002,0140,0000,0000,0120,0000,0040,0120,0017,0040, 0100,0000,0100,0000,0140,0001,0021,0140,0000,0046,0100,0017,0140, 0066,0045,0025,0201,0020,0130,0146,0030,0130,0103,0025,0017,0006, 0100,0000,0040,0000,0020,0000,0000,0040,0000,0000,0200,0017,0000, 0200,0000,0020,0001,0140,0000,0000,0140,0000,0000,0120,0017,0040, 0120,0026,0042,0020,0140,0161,0042,0143,0000,0022,0162,0017,0040, 0121,0042,0060,0020,0140,0200,0000,0123,0000,0021,0220,0017,0041, 0121,0042,0060,0120,0140,0200,0000,0123,0000,0021,0160,0017,0041, 0051,0126,0150,0141,0060,0210,0146,0066,0026,0165,0026,0017,0247, 0120,0000,0040,0003,0160,0000,0000,0140,0000,0021,0100,0017,0140, 0000,0000,0000,0000,0200,0000,0000,0000,0000,0000,0000,0017,0000, 0141,0023,0122,0040,0160,0143,0042,0142,0000,0047,0143,0017,0020, 0120,0000,0040,0006,0140,0060,0000,0141,0000,0026,0100,0017,0040, 0140,0000,0020,0007,0100,0000,0000,0140,0000,0001,0140,0017,0020, 0110,0125,0051,0162,0120,0125,0127,0104,0006,0104,0000,0017,0052, 0140,0000,0040,0000,0160,0000,0000,0140,0000,0000,0060,0017,0000, 0040,0005,0020,0000,0040,0313,0231,0030,0000,0140,0000,0017,0056, 0140,0000,0160,0000,0200,0000,0000,0140,0000,0000,0000,0017,0240, 0065,0042,0060,0040,0000,0206,0231,0146,0006,0224,0220,0017,0004, 0240,0000,0020,0000,0140,0000,0000,0220,0000,0000,0200,0017,0141 }; 9base-6/troff/FIXES0000644000175000017500000006062611402154555013501 0ustar anselmanselmMarch 11, 1994 If we are just plain old nroff (and not doing UNICODE) we should only Lookup characters, not Install when we don't know them. If we are troff, we Install them anyway March 8, 1994 Nroff had problems with parsing quoted white space as options or character code in some terminals tables. Changed by having scanf include white space when necessary as suggested by Rich. March 1, 1994 Made sanity check for terminal type depending on the trace level; trace level set with -tn flag at start up 22 Feb, 1994 More pointer shuffling fixes. 18 Feb, 1994 More disabling of multibyte stuff. Fixed bug in n5.c: casetm didn' know about the new format in the fontables. Feb 17, 1994 Removed extra include from n1.c Fixed dubious pointer shuffling in n7.c, t10.c & n8.c. Thanks Rich! Feb 10, 1994 Disabled the multybyte stuff; only plan 9 will get it. Jan 24, 1994 Fixed nasty bug discovered by td, which caused core dumps on \D'l-0.002775i 0i' and apparently all numbers closer to 0 than -.002775. Fixed in storeline() and storeword() (n7.c). Dec 16, 1993 nroff & troff -N were looking for the TYPESETTER variable, causing troff: cannot open /sys/lib/troff/term/tab.202; line 1, file stdin fixed my moving getenv("TYPESETTER") to t10.c in t_ptinit(void). Dec 3, 1993: The sequence \s+2\H'+10' came sometimes out in the wrong order (x H before s), so there wasn't a difference bewteen \s+2\H'+10' and \H'+10'\s+2. Now the fonts bits of the CHARHT are used to register the current pontsize, so we can issue a s10 in t10.c if needed. A bit sneaky. Try to prevent double slashes in path names. Especially under plan9 things started to look ugly. Exception word list now grows dynamic. Nov 30, 1993: Allow multiple calls to .pi, requested by Rob. .pi cat .pi dogs is now equivalent with .pi cat | dogs .ab now takes also optional error code: .ab [n] [string] If n and string, n is exit code, string is message If n, n is exit code, ``User Abort, exit code n" is message If !n and string, standard exit code, string is message If !n and ! string, standard exit code, "User Abort" is message Nov 24, 1993: Reordered code to keep the UNASNI scripts happy. Nroff dumped core reading terminal tables: apparenty under plan 9, scanf includes the '\n'; added test for '\0' in parse in n10.c. Relative tab settings (.ta +1C +2C) didn't work; anding the previous value with TABMASK fixes this (caseta). Nov 23, 1993: Included code, originally done by bwk for plan 9, to handle multi-byte characters. Nov 3, 1993: ``pair internal'' two char names by shifting 16 bits. Will allow the use of 16 bit characters sets (Unicode in plan9 etc.) for macro's etc. Oct 20, 1993: Word & line buffers are now dynamic: No more word or line overflow unless when we run out of memory. Oct 11, 1993: lost diversion warning pops up regularly with man macro's. Due to a possible macro coding problem. Triggered by something like troff -man: .TP .TP foo .ex Minimal code: .di aa throw away this diversion (aa) while being defined. .rm aa .br .di Fixed by disallowing .rm to throw away current diversion. The rn request will complain with: cannot remove diversion aa during definition; etc. Sep 29, 1993: Some long standing fixes which never went back in the source. Thanks to Janet & Rich. Sep 28, 1993: Changed getach() (n1.c), so it does't consider truncated special characters as (8-bit) ascii. STX ETX ENQ ACK and BELL are still allowed for the ultimate backwards compatibility. Some code changes, so real ANSI compilers like the SGI version (acc from Sun is a poor excuse for an ANSI compiler) don't barf. Some compromises (static Tchar wbuf in n9.c) allowed so the unansified stuff for non-ansi compilers (cc on Sun's) will work as well. Sep 9, 1993: Be nice to Gerard. Now also word spaces in .tl and after tabs/fleids etc. Aug 12, 1993: Tabs setting can now be humongous. We also allow 99 tabs to accomodate tbl. As a side effect, NTM buffers are now 1K Aug 11, 1993: .R register, now contains maximum number of addessable registers minus the number actually used. Small esthetic changes in error messages; removed a statement which wasn't reached anyway. Aug 10, 1993: Some more speed hacks: be smarter doing the linear table lookups in alloc() and finds(). The real name of the det diversion size macro is now gd. Aug 9, 1993: A much faster way to find the end of a string/macro, by remembering that when defined. Aug 6, 1993: Slightly more eficient way of skipping to the end of a string/macro Aug 5, 1993: Prevent character sign extension for 8-bit charnames diversions etc. by unpair Aug 4, 1993: Growing the dynamical macro/strings name space and registers space (See the experiment of 21 July) now with bigger increments. Casts added to satisfy non-ANSI compilers. Aug 3, 1993: Should check return value in alloc (n3.c), to prevent core dump when memory gets tight. July 28, 1993: New request: .sg

sets the dn and dl registers to the size of the diversion named in the argument. Doesn't do anything when the named diversion doesn't exist. The name sg is temporary until we find a better one. July 21, 1993: Experiment: Macro space & registers name allocated dynamically. Note that current reallocation occurs in increments of 1, to force the code to be executed a lot; a kind of stress testing. Also, eight bit characters allowed in macro/string names. July 21, 1993: Turn on the escape mode if the end macro is called. July 20, 1993: Tracing mode now default off Don't print s stackdump either when a file specfied on the command line argument cannot be opened July 15, 1993: Don't print useless line & current file informations when a file specfied on the command line argument cannot be opened. Sun ansi compiler doesn't default adhere to standards. Undid the kludge in tdef.h July 14, 1993: Coding error made the tab type R not function properly July 12, 1993: Fixed a typo in the version stuff, noticed by Rich July 9, 1993: Added the dwb home configuration stuff, thanks RIch. Also, NCHARS is big enough. Added a fflush to casetm, so .fm will be up to date. June 25, 1993 (Rich): -t option reinstated for the sake of compatibility. Some old shells scripts and man(1) from SunOs want this, sigh Compiler and system dependencies Some systems pull in sys/types.h via #include and then the compiler complains about two ushort typedefs. Therefore, ushort is now Ushort (and uchar Uchar). The SVID specifies a strdup, POSIX doesn't, anyway, troff provides its own version, slightly different then the standard one. A To prevent name clashes with that definion, renamed to strdupl. June 24, 1993 (Rich): -V option added for DWB3.4 (rich) May 18, 1993: Trivial fix (.cf) request for troff -a issuing .cf /dev/null with troff -a gives some spurious output: H720 H720 s10 f1 fixed by checking for ascii mode it ptesc(), ptps() and ptfont() in t10.c Enhancement Added a .tm request to roff. Works just like .tm, but now it will do it to file. The name is coined by Carmela. Great for creating indeces & toc's (we hope). May 18 1993: Compatibilty change Somebody complained that his favorite macro didn't work: it had a BELL (^G) in the name. This was a non-documented feature of earlier versions of troff (although the documentation actually doesn't say that you can. (They can only be used for delimiters or with the tr request), so it isn't that important). But the sake of eternal backward compatibilaty I allowed some control characters like, STX, ACK, etc. also be part of a macro/string name. While at it, I made it also possible to have eight bit characters be part of the name. It might be that this screws up the way users think about these things. For UNICODE versions, they probably want to do that as well, and that won't work as easy, (because these characters are 16-bits wide), so it is dubious whether we actually want this. BTW. Now .de \(ts\ts .tm terminal sigma macro .. .\(ts\(ts also works, as long the internal cookie for ts isn't more then eight bits. May 12, 1993: Syntax change Some requests accept tabs as a separator, some don't and this can be a nuisance. Now a tab is also recognized as an argument separator for requests, this makes .so /dev/null works. To be more precise, any motion character is allowed, so .so\h'5i'/dev/null will work as well, if one really wants that. It will be a problem for users who really relied on this as in .ds x string and expect the tab to become part of the string a, but I haven't seen any use of that (obscure trick). May 6, 1993: Eileen count fixed Troff sometimes went in a loop, and exited with: ``job looping; check abuse of macros'' (also known as the Eileen's loop). It can be forced with the next trivial programme: .de ff .di xx .. .wh -1 ff .bp Basically what happens is that a page transition now will happen in a diversion, which doesn't make sense. Wat really happens is that eject() (in n7.c) doesn't eject the frame because we are in a diversion. This cause the loop in n1.c (because now always stack->pname <= ejl). Adding check on whether we are not in a diversion takes care of the problem. March 30, 1993: Need request, .ne When there is a begin of page trap set, and the first thing in the file is a .ne request, the trap gets fired, but, the x font R etc. cookies doen't come out, because the troff thinks that the first page pseudo transition already took place. Fixed by forcing the start of the first page in the casene request with the same code as in casetl (which caused a similar problem quite some time ago). Change to .cf request ``Here document'' If the argument of .cf starts with a <<, the rest of it is taken as an EOF token. It will reat the rest of the input until it hits the EOF token and copies it to the output. This is similar as the shell's ``here document'' mechanisme and put in place to improve the kludgy way picasso, picpack etc. now include postscript. Using troff -TLatin1 (DWB version) and \N'...' caused core dump In t11, in chadd, it should test on NCHARS - ALPHABET to see whether we run out of table space (and we probably should beaf up NCHARS for the DWB version). March 16, 1993: Diversion rename bug fix It is possible to get troff in an infinite loop by renaming a diversion in progress, and calling it later with the new name (as in .di xx, .rn xx yy, .yy). The effect depends on whether troff already put stuff in the diversion or not. Fix by having .rn also rename the current diversion (if there is any and when appropriate). If the diversion calls itself by the new name and given the fix made on 11 nov 1992, this will now result in an error. (BTW, the fix from 11 nov is improved: diversions nest, so we have to account for that). December 18, 1992: Some people have complete novels as comments, so we need to skip comments while checking the legality of font files. thaks Rixh December 16, 1992 Some people rely on the order that -r arguments are given, so that troff -rC1 -rC3 ends up setting register C to 3. Because cpushback() pushes things in a LIFO order back, we have to do the same to get -r args in a FIFO order. Nov 17, 1992: Giving a -rL8 option cuased the string .nr L 8 to be printed on the output, using the wonderful 3b2. Some garbage was left in buf[100] in main(). Fixed by setting buf[0] explicitly to 0 (because some C-compilers complain about ``no automatic aggregate initialization''). Nov 11, 1992: Diversion bug fix If a diversion was being read and the input is faulty so the diversion was reading in itself, it caused troff to loop undefinitely. This was easily fixed by a test in control(a,b) in n1.c. Something similar things might happen with macros causing the ``eileenct problem'', but I didn't look for that. We have to wait until it happens. Oct 26, 1992: Numeric arguments: Illegal argments are treated as missing arguments. This changed the semantics of .ll, .ls, .in, .lg, .ul, .cu .lt (which acted as if the argument was 0) and .ps which was simply ignored with an illegal argument. Tidied up number parsing in atoi1(). This prevents arguments like .x or 1.2.3.4 being interpret as a legal number (nonumb = 0) Numeric arguments error reporting: Controlled by .pt, illegal numbers are now reported (default trace mode is 1). This is also true for the escapes: \h'..', \v'..' \H'..', \S'..', \N'..', \D'..', \l'.., \L'.. and \x'..'. \D'c' is the only drawing request which doesn't take a pair of numbers as arguments, so a special case is put here in setdraw() (This code actually could use an overhaul to get better parsing. As long as the \D'..' cookies are machine generated it is low on the priority list). Don't generate an error if the illegal argument to a request is a \}. It is too painful to do right (although it can be done, but it would clutter getch() and getcho() even more). Input line numbers (.c register) bug fixes: In not taken branches of .if or .ie, the input line # (numtab[CD].val) should be raised when necessary (in eatblk()). For concealed newlines, we still should count the line for input. Setfield (n9.c) sometimes pushes the rest of the line back to the input (including \n), without adjusting numtab[CD].val Because .c (and so numtab[CD].val) is the number of lines read and the error might actually happen in the current line (before seeing the '\n), we need to apply correction in errprint when nlflg set. (This correction needs to be undone when inside a macro because the nlflg is set by reading the args to the macro). Line number setting (.lf) request bug fixes: I interpret that the .c register will contain the number of read lines, not including the current one. Also, don't change the input line number when the first argument of .lf is not a number. As a net effect, the next input .EQ .EN .ab will generate the same output whether eqn has been used or not. If request bug fix: A ``.if page .tm foo'' caused the next line being ignored; This bcause when the 2nd delimiter of a string couldn't be found in cmpstr, the next line was always eaten. Solution: in caseif1, if the condition is false, we should check nlflg before eating a block. (Note: We might have eaten \{\ as well. We could disallow the \{\ in a string to be compared to prevent that but that might break other things). Enhancement to .pt: The .pt now pops the previous values when no argument is specified. Turned out to be handy when chasing for problems. Just ``bracked'' the code with .pt 7 and .pt and you get a trace of only that block. The meaning of the arguments is now: 01 trace numeric arguments (default on) 02 trace requests 04 trace macros Abort request (.ab) beautification: Don't print the extra carriage return when .ab is called without an argument. Oct 12, 1992: (Comments & spelling errors from this day on by jaap) replaced 32767 by INT_MAX in several places to allow for very long pages (on 32-but machines). The ``.fp 1 R \"COMMENT'' complains about ``./troff: Can't open font file /usr/lib/font/devpost/h'' on some systems. It sees the tab as part of the optional font file. Apparently it is system dependent whether isgraph() includes the tab character. Fixed by using getach() in getname() in n1.c instead. Aug 28, 1992: removed call to popi from rdtty(); it was eating up the rest of the macro if it was used from within one. (thanks, jaap) Jul 21, 1992: added extra test in nextfile() to pop current input file only if not in .nx command. thanks to jaap. added test in getword() to avoid hyphenating after \z character, which prevents any hyphenation inside \X'...'. thanks to jaap. added, then removed, code in getword() to prevent hyphenating anything shorter than 6 characters. looks like it changed a lot more than i thought. Jul 12, 1992: added .pt request to trace macros and requests (from jaap). .pt N Print trace of macros (N=1), requests (N=2) or both (N=3) Jun 5, 1992: added tests to t.twrest and t.twinit to avoid 0 deref in n2 and n10, for nroff -t xxxxx. thanks to Rich Drechsler. May 22, 1992: added extern decls to e.g., void Tchar (*hmot)(void) in tdef.h and added definition to ni.c, so pointers are defined explicitly. makes it work on turbo c++ and probably others. changed a couple of isdigit's and isgraph(getch()) to avoid multiple evaluation (even though it shouldn't happen). Made /usr/bin/nroff a shell script. May 12, 1992: n1.c: need p++ after strrchr to skip / in program name. thanks to Rich Drechsler. Apr 17, 1992: casefi(), n5.c: .u register should be 0 or 1, not incremented with each .fi. Apr 5, 1992: fiddled n7.c and added _nmwid to the environment, to add a 5th argument to .nm: the maximum number of digits in any line number. default is 3, which was previously hardwired in. added jaap's code for yet another register which actually delivers a string, called .S (so it can easily go in the switch in setn() in n4.c); it delivers the current tabstop and alignment modes in a format suitable for a subsequent .ta \n(.S command: .ds T \n(.S ... .ta \*T Mar 30, 1992: added test in getword to avoid hyphenating things with motions (and avoid a core dump sometimes too). Mar 13, 1992: \n(sb initialized wrong in setwd(). TYPESETTER=foo troff -Tpost used foo instead of post. Mar 12, 1992: rearranged tests in popf so that .so is closed properly before moving on to the next macro package. Mar 1, 1992: input mechanism rearranged to use getc() instead of stack of explicit input buffers. 5-10% slowdown. Jan 28, 1992: fixed .tm \(mi to print something sensible. thanks to jaap. Jan 2, 1992: fiddle setfp so doesn't put out font stuff if -a turned on. Dec 17, 1991: copy 3rd argument in .fp commands to x font ... lines when it contains a /, for testing fonts locally. Dec 13, 1991: parameterize the font directories, etc., so can be set in makefiles. added -N argument to run as nroff. Nov 8, 1991: add a maplow(towlower...) in n8.c to handle brain-damaged libraries. Nov 2, 1991: merged nroff into troff, based on Ken's plan 9 version. merged nii.c into ni.c, removed tw.h, etc. more work needed to make this stuff cleaner. July 27, 1991: added test in setn in n4 to fix bug that permitted things like \n (ab to work "properly". thanks to jaap for finding and fixing. added paranoid testing in t11 to make sure font files look ok. May 13, 1991: moved evaluation of \(xx from copy mode to non-copy mode, so that weird character names wouldn't get reevaluated in argument parsing. installed july 27. May 6, 1991: increased size of hyphenation exception buffer to 512 from 128 Apr 14, 1991: added an extra redundant call of ptfont in setfp, since it appears that some versions of adobe transcript assume that an "x font" command means to change the actual font as well. the fix preserves the current font. thanks to david brailsford and friends for spotting the problem. fixed up tests in alpha() in n8 to defend isalpha() against too-big inputs. punct() argument had wrong type too. thanks to rich drexler and peter nelson. Mar 19, 1991: fixed bug that prevented .rd from working with new corebuf organization. fixed bug that caused .ig inside diversions to give bad storage allocation. thanks to arthur david olson, whose fix was on netnews 3 years earlier. Mar 5, 1991: huge table sizes for kanji. Feb ??, 1991: working on dealing with large alphabets, notably kanji. added "defaultwidth" to font descriptions, for characters not given an explicit width. Jan, 1991: added tex hyphenation, using standard tex data files, but not the elaborate compressed trie, which is a lot of trouble to save maybe 40k bytes. this appears to run at exactly the same speed as before. so far this stuff reads into a fixed size array; that should change. it should also be possible to deal with multiple languages. the command .ha sets the algorithm. .ha 1 => tex, with troff rules if tex doesn't hyphenate; .ha 0 gives troff rules, and .ha resets to the default, which is tex. the hyphenation algorithm is part of the environment, a nod to a future in which i handle more than one language. replaced the fixed size corebuf array for string/macro storage by a dynamic structure that can grow. this appears to slow things down by maybe 3%. the code is about the same complexity. Dec 27, 1990: converted to ansi c, based on some work by ken thompson, but not as thoroughly as he did. there is a shell script unansi and an awk program cvt that will help you step back in time if you do not have an ansi c compiler. moved the special-name characters up to 256 instead of 128, although done in terms of ALPHABET, so one can pass 8 bit characters through. removed lots of 0177's and similar numbers. input is now not filtered, and if a character with the 8th bit on comes in, it will go out again. fixed t11.c to read character names in hex or octal as well as single-character ascii. unknown characters are now carried through with width = spacewidth. needs a way to set widths. removed all signal handling from troff. you signal, you die. added -d option to print version number. Dec 7, 1990: .fp 3 V VERYLONGNAME used to truncate the name to 10 chars; fixed. increased the limit on FBUFSZ for tables with very long fields. changed atoi1() to use double to avoid intermediate overflow. moved filenames like /usr/lib/font into tdef.h for easy change. removed some dreggish definitions. cleaned up non-portable error printing stuff; fixed up some messages. Dec 12, 1989: Removed the .! command, an undocumented synonym for .sy. Dec 4, 1989: Another wart to the \X code, to try to preserve blanks in all situations. Nov 17, 1989: A number of small changes preparatory to getting rid of nroff. The argument -Tnroff or -Tnroff-12 changes some internal values so that the predicate .if n is true and certain arithmetic operations are done as if nroff. This design is not yet final. Nov 7, 1989: Fixed hyphenation for nov-ice, ad-vice, de-vice, ser-vice, *-vice. Oct 11, 1989: It is now permitted to do an explicit change to font S. It is not clear what will break (though nothing seems to have). Oct 10, 1989: Modified flush code to always put out \nH instead of sometimes h. This makes it easier to parse the output for positioning. Sep 9, 1989: Fixed internal representation of \D'~...' so that it is immune to .tr ~ and variations. No external change. Aug 9, 1989: Changed .tm so it outputs \e, \%, \-, \&, \(blank). This might break indexing code. Only in the new version, as are all subsequent fixes. July, 1989: A major internal change: font information is read in ascii instead of the weird binary format of makedev (which is now dead). character names need not all appear in DESC; new names that appear when a font is used become part of the set of known names. There are some flaky bits here (it's conceivable that some \N number will collide with a real name), and it's probably 10-15% slower. Tant pis. As a by-product, nroff no longer compiles. I'll probably get back to this, but an alternative is to bag it once and for all. May 25, 1989: Another bug in \l, this time when width is 0. Not installed, since it's in the new font version. Apr 23, 1989: Fixed bug in n9 that caused core dump with unterminated \l command, like \l'1.5i ptflush no longer called when -a is on. Apr 12, 1989: fixed bug in n2 that failed to suppress printing of \! output when a -o was in effect. Apr 5, 1989: .fl and \X now cause output of size, font, hpos and vpos. this is necesary for postprocessors that intend to insert independent material, such as postscript. Feb 1, 1989: wait for .pi pipe to empty before exiting Oct 2, 1988: default is now -Tpost Sep 19, 1988: added abortive code to handle built-up characters by passing something through as \D'b...'. never used. Jul 4, 1988: replaced the sbrk nonsense in n3.c by calls to malloc. \N now tests against proper font size. installed Jaap Akkerhuis's code (mutatis mutandis) for permitting up to 99 fonts, swapping them into font pos 0 as needed. fixes the long-standing problem of having multiple font changes on a single output line. Jul 2, 1988: \X now preserves spaces even when contents are diverted. \N code safer -- NTRTAB and NWIDCACHE enlarged. Jul 14, 1987: Fixed obscure bug causing incorrect indentation of .mc output. 9base-6/troff/mbwc.c0000644000175000017500000000434011402154555013763 0ustar anselmanselm#include #include "mbwc.h" /* * Use the FSS-UTF transformation proposed by posix. * We define 7 byte types: * T0 0xxxxxxx 7 free bits * Tx 10xxxxxx 6 free bits * T1 110xxxxx 5 free bits * T2 1110xxxx 4 free bits * * Encoding is as follows. * From hex Thru hex Sequence Bits * 00000000 0000007F T0 7 * 00000080 000007FF T1 Tx 11 * 00000800 0000FFFF T2 Tx Tx 16 */ int mblen(const char *s, size_t n) { return mbtowc(0, s, n); } int mbtowc(wchar_t *pwc, const char *s, size_t n) { int c, c1, c2; long l; if(!s) return 0; if(n < 1) goto bad; c = s[0] & 0xff; if((c & 0x80) == 0x00) { if(pwc) *pwc = c; if(c == 0) return 0; return 1; } if(n < 2) goto bad; c1 = (s[1] ^ 0x80) & 0xff; if((c1 & 0xC0) != 0x00) goto bad; if((c & 0xE0) == 0xC0) { l = ((c << 6) | c1) & 0x7FF; if(l < 0x080) goto bad; if(pwc) *pwc = l; return 2; } if(n < 3) goto bad; c2 = (s[2] ^ 0x80) & 0xff; if((c2 & 0xC0) != 0x00) goto bad; if((c & 0xF0) == 0xE0) { l = ((((c << 6) | c1) << 6) | c2) & 0xFFFF; if(l < 0x0800) goto bad; if(pwc) *pwc = l; return 3; } /* * bad decoding */ bad: return -1; } int wctomb(char *s, wchar_t wchar) { long c; if(!s) return 0; c = wchar & 0xFFFF; if(c < 0x80) { s[0] = c; return 1; } if(c < 0x800) { s[0] = 0xC0 | (c >> 6); s[1] = 0x80 | (c & 0x3F); return 2; } s[0] = 0xE0 | (c >> 12); s[1] = 0x80 | ((c >> 6) & 0x3F); s[2] = 0x80 | (c & 0x3F); return 3; } size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n) { int i, d, c; for(i=0; i < n; i++) { c = *s & 0xff; if(c < 0x80) { *pwcs = c; if(c == 0) break; s++; } else { d = mbtowc(pwcs, s, 3); if(d <= 0) return (size_t)((d<0) ? -1 : i); s += d; } pwcs++; } return i; } size_t wcstombs(char *s, const wchar_t *pwcs, size_t n) { int d; long c; char *p, *pe; char buf[3]; p = s; pe = p+n-3; while(p < pe) { c = *pwcs++; if(c < 0x80) *p++ = c; else p += wctomb(p, c); if(c == 0) return p-s; } while(p < pe+3) { c = *pwcs++; d = wctomb(buf, c); if(p+d <= pe+3) { *p++ = buf[0]; if(d > 1) { *p++ = buf[2]; if(d > 2) *p++ = buf[3]; } } if(c == 0) break; } return p-s; } 9base-6/troff/tdef.h0000644000175000017500000004373211402154555013772 0ustar anselmanselm#include #include #include #include #include #include #undef MB_CUR_MAX #define MB_CUR_MAX 3 #define NROFF (!TROFF) /* Site dependent definitions */ #ifndef TMACDIR #define TMACDIR "lib/tmac/tmac." #endif #ifndef FONTDIR #define FONTDIR "lib/font" #endif #ifndef NTERMDIR #define NTERMDIR "lib/term/tab." #endif #ifndef TDEVNAME #define TDEVNAME "post" #endif #ifndef NDEVNAME #define NDEVNAME "37" #endif #ifndef TEXHYPHENS #define TEXHYPHENS "/usr/lib/tex/macros/hyphen.tex" #endif #ifndef ALTHYPHENS #define ALTHYPHENS "lib/tmac/hyphen.tex" /* another place to look */ #endif typedef unsigned char Uchar; typedef unsigned short Ushort; typedef /*unsigned*/ long Tchar; typedef struct Blockp Blockp; typedef struct Diver Diver; typedef struct Stack Stack; typedef struct Divsiz Divsiz; typedef struct Contab Contab; typedef struct Numtab Numtab; typedef struct Numerr Numerr; typedef struct Env Env; typedef struct Term Term; typedef struct Chwid Chwid; typedef struct Font Font; typedef struct Spnames Spnames; typedef struct Wcache Wcache; typedef struct Tbuf Tbuf; /* this simulates printf into a buffer that gets flushed sporadically */ /* the BSD goo is because SunOS sprintf doesn't return anything useful */ #ifdef BSD4_2 #define OUT (obufp += strlen(sprintf(obufp, #define PUT ))) > obuf+BUFSIZ ? flusho() : 1 #else #define OUT (obufp += sprintf(obufp, #define PUT )) > obuf+BUFSIZ ? flusho() : 1 #endif #define oputs(a) OUT "%s", a PUT #define oput(c) ( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 ) extern char errbuf[]; #define ERROR sprintf(errbuf, #define WARN ), errprint() #define FATAL ), errprint(), exit(1) /* starting values for typesetting parameters: */ #define PS 10 /* default point size */ #define FT 1 /* default font position */ #define ULFONT 2 /* default underline font */ #define BDFONT 3 /* default emboldening font */ #define BIFONT 4 /* default bold italic font */ #define LL (unsigned) 65*INCH/10 /* line length; 39picas=6.5in */ #define VS ((12*INCH)/72) /* initial vert space */ #define EMPTS(pts) (((long)Inch*(pts) + 36) / 72) #define EM (TROFF? EMPTS(pts): t.Em) #define INCH (TROFF? Inch: 240) #define HOR (TROFF? Hor: t.Adj) #define VERT (TROFF? Vert: t.Vert) #define PO (TROFF? Inch: 0) #define SPS (TROFF? EMPTS(pts)/3: INCH/10) #define SS (TROFF? 12: INCH/10) #define ICS (TROFF? EMPTS(pts): 2*INCH/10) #define DTAB (TROFF? (INCH/2): 0) /* These "characters" are used to encode various internal functions /* Some make use of the fact that most ascii characters between /* 0 and 040 don't have any graphic or other function. /* The few that do have a purpose (e.g., \n, \b, \t, ... /* are avoided by the ad hoc choices here. /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012 */ #define LEADER 001 #define IMP 004 /* impossible char; glues things together */ #define TAB 011 #define RPT 014 /* next character is to be repeated many times */ #define CHARHT 015 /* size field sets character height */ #define SLANT 016 /* size field sets amount of slant */ #define DRAWFCN 017 /* next several chars describe arb drawing fcns */ # define DRAWLINE 'l' /* line: 'l' dx dy char */ # define DRAWCIRCLE 'c' /* circle: 'c' r */ # define DRAWELLIPSE 'e' /* ellipse: 'e' rx ry */ # define DRAWARC 'a' /* arc: 'a' dx dy dx dy */ # define DRAWSPLINE '~' /* quadratic B spline: '~' dx dy dx dy ... */ /* other splines go thru too */ /* NOTE: the use of ~ is a botch since it's often used in .tr commands */ /* better to use a letter like s, but change it in the postprocessors too */ /* for now, this is taken care of in n9.c and t10.c */ # define DRAWBUILD 'b' /* built-up character (e.g., { */ #define LEFT 020 /* \{ */ #define RIGHT 021 /* \} */ #define FILLER 022 /* \& and similar purposes */ #define XON 023 /* \X'...' starts here */ #define OHC 024 /* optional hyphenation character \% */ #define CONT 025 /* \c character */ #define PRESC 026 /* printable escape */ #define UNPAD 027 /* unpaddable blank */ #define XPAR 030 /* transparent mode indicator */ #define FLSS 031 /* next Tchar contains vertical space */ /* used when recalling diverted text */ #define WORDSP 032 /* paddable word space */ #define ESC 033 /* current escape character */ #define XOFF 034 /* \X'...' ends here */ /* matches XON, but they will probably never nest */ /* so could drop this when another control is needed */ #define HX 035 /* next character is value of \x'...' */ #define MOTCH 036 /* this "character" is really motion; used by cbits() */ #define HYPHEN c_hyphen #define EMDASH c_emdash /* \(em */ #define RULE c_rule /* \(ru */ #define MINUS c_minus /* minus sign on current font */ #define LIG_FI c_fi /* \(ff */ #define LIG_FL c_fl /* \(fl */ #define LIG_FF c_ff /* \(ff */ #define LIG_FFI c_ffi /* \(Fi */ #define LIG_FFL c_ffl /* \(Fl */ #define ACUTE c_acute /* acute accent \(aa */ #define GRAVE c_grave /* grave accent \(ga */ #define UNDERLINE c_under /* \(ul */ #define ROOTEN c_rooten /* root en \(rn */ #define BOXRULE c_boxrule /* box rule \(br */ #define LEFTHAND c_lefthand /* left hand for word overflow */ #define DAGGER c_dagger /* dagger for end of sentence/footnote */ #define HYPHALG 1 /* hyphenation algorithm: 0=>good old troff, 1=>tex */ /* array sizes, and similar limits: */ #define MAXFONTS 99 /* Maximum number of fonts in fontab */ #define NM 91 /* requests + macros */ #define NN NNAMES /* number registers */ #define NNAMES 15 /* predefined reg names */ #define NIF 15 /* if-else nesting */ #define NS 128 /* name buffer */ #define NTM 1024 /* tm buffer */ #define NEV 3 /* environments */ #define EVLSZ 10 /* size of ev stack */ #define STACKSIZE (12*1024) /* stack for macros and strings in progress */ #define NHYP 10 /* max hyphens per word */ #define NHEX 512 /* byte size of exception word list */ #define NTAB 100 /* tab stops */ #define NSO 5 /* "so" depth */ #define NMF 5 /* number of -m flags */ #define WDSIZE 500 /* word buffer click size */ #define LNSIZE 4000 /* line buffer click size */ #define OLNSIZE 5000 /* output line buffer click; bigger for 'w', etc. */ #define NDI 5 /* number of diversions */ #define ALPHABET alphabet /* number of characters in basic alphabet. */ /* 128 for parochial USA 7-bit ascii, */ /* 256 for "European" mode with e.g., Latin-1 */ /* NCHARS must be greater than ALPHABET (ascii stuff) + total number of distinct char names from all fonts that will be run in this job (including unnamed ones and \N's) */ #define NCHARS (8*1024) /* maximum size of troff character set*/ /* However for nroff you want only : 1. number of special codes in charset of DESC, which ends up being the value of nchtab and which must be less than 512. 2. ALPHABET, which apparently is the size of the portion of the tables reserved for special control symbols Apparently the max N of \N is irrelevant; */ /* to allow \N of up to 254 with up to 338 special characters you need NCHARS of 338 + ALPHABET = 466 */ #define NROFFCHARS 1024 /* maximum size of nroff character set */ #define NTRTAB NCHARS /* number of items in trtab[] */ #define NWIDCACHE NCHARS /* number of items in widcache[] */ #define NTRAP 20 /* number of traps */ #define NPN 20 /* numbers in "-o" */ #define FBUFSZ 512 /* field buf size words */ #define IBUFSZ 4096 /* bytes */ #define NC 1024 /* cbuf size words */ #define NOV 10 /* number of overstrike chars */ #define NPP 10 /* pads per field */ /* Internal character representation: Internally, every character is carried around as a 32 bit cookie, called a "Tchar" (typedef long). Bits are numbered 31..0 from left to right. If bit 15 is 1, the character is motion, with if bit 16 it's vertical motion if bit 17 it's negative motion If bit 15 is 0, the character is a real character. if bit 31 zero motion bits 30..24 size bits 23..16 font */ /* in the following, "L" should really be a Tchar, but ... */ /* numerology leaves room for 16 bit chars */ #define MOT (01uL << 16) /* motion character indicator */ #define VMOT (01uL << 30) /* vertical motion bit */ #define NMOT (01uL << 29) /* negative motion indicator */ /* #define MOTV (MOT|VMOT|NMOT) /* motion flags */ /* #define MAXMOT (~MOTV) /* maximum motion permitted */ #define MAXMOT 0xFFFF #define ismot(n) ((n) & MOT) #define isvmot(n) (((n) & (MOT|VMOT)) == (MOT|VMOT)) /* must have tested MOT previously */ #define isnmot(n) (((n) & (MOT|NMOT)) == (MOT|NMOT)) /* ditto */ #define absmot(n) ((n) & 0xFFFF) #define ZBIT (01uL << 31) /* zero width char */ #define iszbit(n) ((n) & ZBIT) #define FSHIFT 17 #define SSHIFT (FSHIFT+7) #define SMASK (0177uL << SSHIFT) /* 128 distinct sizes */ #define FMASK (0177uL << FSHIFT) /* 128 distinct fonts */ #define SFMASK (SMASK|FMASK) /* size and font in a Tchar */ #define sbits(n) (((n) >> SSHIFT) & 0177) #define fbits(n) (((n) >> FSHIFT) & 0177) #define sfbits(n) (((n) & SFMASK) >> FSHIFT) #define cbits(n) ((n) & 0x1FFFF) /* isolate character bits, */ /* but don't include motions */ extern int realcbits(Tchar); #define setsbits(n,s) n = (n & ~SMASK) | (Tchar)(s) << SSHIFT #define setfbits(n,f) n = (n & ~FMASK) | (Tchar)(f) << FSHIFT #define setsfbits(n,sf) n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT #define setcbits(n,c) n = (n & ~0xFFFFuL | (c)) /* set character bits */ #define BYTEMASK 0377 #define BYTE 8 #define SHORTMASK 0XFFFF #define SHORT 16 #define TABMASK ((unsigned) INT_MAX >> 1) #define RTAB ((TABMASK << 1) & ~TABMASK) #define CTAB (RTAB << 1) #define TABBIT 02 /* bits in gchtab */ #define LDRBIT 04 #define FCBIT 010 #define PAIR(A,B) (A|(B<_ics #define sps envp->_sps #define spacesz envp->_spacesz #define lss envp->_lss #define lss1 envp->_lss1 #define ll envp->_ll #define ll1 envp->_ll1 #define lt envp->_lt #define lt1 envp->_lt1 #define ic envp->_ic #define icf envp->_icf #define chbits envp->_chbits #define spbits envp->_spbits #define nmbits envp->_nmbits #define apts envp->_apts #define apts1 envp->_apts1 #define pts envp->_pts #define pts1 envp->_pts1 #define font envp->_font #define font1 envp->_font1 #define ls envp->_ls #define ls1 envp->_ls1 #define ad envp->_ad #define nms envp->_nms #define ndf envp->_ndf #define nmwid envp->_nmwid #define fi envp->_fi #define cc envp->_cc #define c2 envp->_c2 #define ohc envp->_ohc #define tdelim envp->_tdelim #define hyf envp->_hyf #define hyoff envp->_hyoff #define hyphalg envp->_hyphalg #define un1 envp->_un1 #define tabc envp->_tabc #define dotc envp->_dotc #define adsp envp->_adsp #define adrem envp->_adrem #define lastl envp->_lastl #define nel envp->_nel #define admod envp->_admod #define wordp envp->_wordp #define spflg envp->_spflg #define linep envp->_linep #define wdend envp->_wdend #define wdstart envp->_wdstart #define wne envp->_wne #define ne envp->_ne #define nc envp->_nc #define nb envp->_nb #define lnmod envp->_lnmod #define nwd envp->_nwd #define nn envp->_nn #define ni envp->_ni #define ul envp->_ul #define cu envp->_cu #define ce envp->_ce #define in envp->_in #define in1 envp->_in1 #define un envp->_un #define wch envp->_wch #define pendt envp->_pendt #define pendw envp->_pendw #define pendnf envp->_pendnf #define spread envp->_spread #define it envp->_it #define itmac envp->_itmac #define hyptr envp->_hyptr #define tabtab envp->_tabtab #define line envp->_line._bufp #define lnsize envp->_line._size #define word envp->_word._bufp #define wdsize envp->_word._size #define oline _oline._bufp #define olnsize _oline._size /* * Note: * If this structure changes in ni.c, you must change * this as well, and vice versa. */ struct Env { int _ics; int _sps; int _spacesz; int _lss; int _lss1; int _ll; int _ll1; int _lt; int _lt1; Tchar _ic; int _icf; Tchar _chbits; Tchar _spbits; Tchar _nmbits; int _apts; int _apts1; int _pts; int _pts1; int _font; int _font1; int _ls; int _ls1; int _ad; int _nms; int _ndf; int _nmwid; int _fi; int _cc; int _c2; int _ohc; int _tdelim; int _hyf; int _hyoff; int _hyphalg; int _un1; int _tabc; int _dotc; int _adsp; int _adrem; int _lastl; int _nel; int _admod; Tchar *_wordp; int _spflg; Tchar *_linep; Tchar *_wdend; Tchar *_wdstart; int _wne; int _ne; int _nc; int _nb; int _lnmod; int _nwd; int _nn; int _ni; int _ul; int _cu; int _ce; int _in; int _in1; int _un; int _wch; int _pendt; Tchar *_pendw; int _pendnf; int _spread; int _it; int _itmac; Tchar *_hyptr[NHYP]; long _tabtab[NTAB]; Tbuf _line; Tbuf _word; }; extern Env env[]; extern Env *envp; enum { MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' }; /* U => utf, for instance; C => \(xx, N => \N'...' */ struct Chwid { /* data on one character */ Ushort num; /* character number: 0 -> not on this font >= ALPHABET -> its number among all Cxy's */ Ushort code; /* char code for actual device. used for \N */ char *str; /* code string for nroff */ Uchar wid; /* width */ Uchar kern; /* ascender/descender */ }; struct Font { /* characteristics of a font */ int name; /* int name, e.g., BI (2 chars) */ char longname[64]; /* long name of this font (e.g., "Bembo" */ char *truename; /* path name of table if not in standard place */ int nchars; /* number of width entries for this font */ char specfont; /* 1 == special font */ int spacewidth; /* width of space on this font */ int defaultwidth; /* default width of characters on this font */ Chwid *wp; /* widths, etc., of the real characters */ char ligfont; /* 1 == ligatures exist on this font */ }; /* ligatures, ORed into ligfont */ #define LFF 01 #define LFI 02 #define LFL 04 #define LFFI 010 #define LFFL 020 /* tracing modes */ #define TRNARGS 01 /* trace legality of numeric arguments */ #define TRREQ 02 /* trace requests */ #define TRMAC 04 /* trace macros */ #define RQERR 01 /* processing request/macro */ /* typewriter driving table structure */ extern Term t; struct Term { int bset; /* these bits have to be on */ int breset; /* these bits have to be off */ int Hor; /* #units in minimum horiz motion */ int Vert; /* #units in minimum vert motion */ int Newline; /* #units in single line space */ int Char; /* #units in character width */ int Em; /* ditto */ int Halfline; /* half line units */ int Adj; /* minimum units for horizontal adjustment */ char *twinit; /* initialize terminal */ char *twrest; /* reinitialize terminal */ char *twnl; /* terminal sequence for newline */ char *hlr; /* half-line reverse */ char *hlf; /* half-line forward */ char *flr; /* full-line reverse */ char *bdon; /* turn bold mode on */ char *bdoff; /* turn bold mode off */ char *iton; /* turn italic mode on */ char *itoff; /* turn italic mode off */ char *ploton; /* turn plot mode on */ char *plotoff; /* turn plot mode off */ char *up; /* sequence to move up in plot mode */ char *down; /* ditto */ char *right; /* ditto */ char *left; /* ditto */ Font tfont; /* widths and other info, as in a troff font */ }; extern Term t; /* * for error reporting; keep track of escapes/requests with numeric arguments */ struct Numerr { char type; /* request or escape? */ char esc; /* was escape sequence named esc */ char escarg; /* argument of esc's like \D'l' */ unsigned int req; /* was request or macro named req */ }; 9base-6/troff/n4.c0000644000175000017500000003003511402154555013354 0ustar anselmanselm/* * troff4.c * * number registers, conversion, arithmetic */ #include "tdef.h" #include "fns.h" #include "ext.h" int regcnt = NNAMES; int falsef = 0; /* on if inside false branch of if */ #define NHASHSIZE 128 /* must be 2**n */ #define NHASH(i) ((i>>6)^i) & (NHASHSIZE-1) Numtab *nhash[NHASHSIZE]; Numtab *numtabp = NULL; #define NDELTA 400 int ncnt = 0; void setn(void) { int i, j, f; Tchar ii; Uchar *p; char buf[NTM]; /* for \n(.S */ f = nform = 0; if ((i = cbits(ii = getach())) == '+') f = 1; else if (i == '-') f = -1; else if (ii) /* don't put it back if it's already back (thanks to jaap) */ ch = ii; if (falsef) f = 0; if ((i = getsn()) == 0) return; p = unpair(i); if (p[0] == '.') switch (p[1]) { case 's': i = pts; break; case 'v': i = lss; break; case 'f': i = font; break; case 'p': i = pl; break; case 't': i = findt1(); break; case 'o': i = po; break; case 'l': i = ll; break; case 'i': i = in; break; case '$': i = frame->nargs; break; case 'A': i = ascii; break; case 'c': i = numtabp[CD].val; break; case 'n': i = lastl; break; case 'a': i = ralss; break; case 'h': i = dip->hnl; break; case 'd': if (dip != d) i = dip->dnl; else i = numtabp[NL].val; break; case 'u': i = fi; break; case 'j': i = ad + 2 * admod; break; case 'w': i = widthp; break; case 'x': i = nel; break; case 'y': i = un; break; case 'T': i = dotT; break; /* -Tterm used in nroff */ case 'V': i = VERT; break; case 'H': i = HOR; break; case 'k': i = ne; break; case 'P': i = print; break; case 'L': i = ls; break; case 'R': /* maximal # of regs that can be addressed */ i = 255*256 - regcnt; break; case 'z': p = unpair(dip->curd); *pbp++ = p[1]; /* watch order */ *pbp++ = p[0]; return; case 'b': i = bdtab[font]; break; case 'F': cpushback(cfname[ifi]); return; case 'S': buf[0] = j = 0; for( i = 0; tabtab[i] != 0 && i < NTAB; i++) { if (i > 0) buf[j++] = ' '; sprintf(&buf[j], "%ld", tabtab[i] & TABMASK); j = strlen(buf); if ( tabtab[i] & RTAB) sprintf(&buf[j], "uR"); else if (tabtab[i] & CTAB) sprintf(&buf[j], "uC"); else sprintf(&buf[j], "uL"); j += 2; } cpushback(buf); return; default: goto s0; } else { s0: if ((j = findr(i)) == -1) i = 0; else { i = numtabp[j].val = numtabp[j].val + numtabp[j].inc * f; nform = numtabp[j].fmt; } } setn1(i, nform, (Tchar) 0); } Tchar numbuf[25]; Tchar *numbufp; int wrc(Tchar i) { if (numbufp >= &numbuf[24]) return(0); *numbufp++ = i; return(1); } /* insert into input number i, in format form, with size-font bits bits */ void setn1(int i, int form, Tchar bits) { numbufp = numbuf; nrbits = bits; nform = form; fnumb(i, wrc); *numbufp = 0; pushback(numbuf); } void prnumtab(Numtab *p) { int i; for (i = 0; i < ncnt; i++) if (p) if (p[i].r != 0) fprintf(stderr, "slot %d, %s, val %d\n", i, unpair(p[i].r), p[i].val); else fprintf(stderr, "slot %d empty\n", i); else fprintf(stderr, "slot %d empty\n", i); } void nnspace(void) { ncnt = sizeof(numtab)/sizeof(Numtab) + NDELTA; numtabp = (Numtab *) grow((char *)numtabp, ncnt, sizeof(Numtab)); if (numtabp == NULL) { ERROR "not enough memory for registers (%d)", ncnt WARN; exit(1); } numtabp = (Numtab *) memcpy((char *)numtabp, (char *)numtab, sizeof(numtab)); if (numtabp == NULL) { ERROR "Cannot initialize registers" WARN; exit(1); } } void grownumtab(void) { ncnt += NDELTA; numtabp = (Numtab *) grow((char *) numtabp, ncnt, sizeof(Numtab)); if (numtabp == NULL) { ERROR "Too many number registers (%d)", ncnt WARN; done2(04); } else { memset((char *)(numtabp) + (ncnt - NDELTA) * sizeof(Numtab), 0, NDELTA * sizeof(Numtab)); nrehash(); } } void nrehash(void) { Numtab *p; int i; for (i=0; ilink = 0; for (p=numtabp; p < &numtabp[ncnt]; p++) { if (p->r == 0) continue; i = NHASH(p->r); p->link = nhash[i]; nhash[i] = p; } } void nunhash(Numtab *rp) { Numtab *p; Numtab **lp; if (rp->r == 0) return; lp = &nhash[NHASH(rp->r)]; p = *lp; while (p) { if (p == rp) { *lp = p->link; p->link = 0; return; } lp = &p->link; p = p->link; } } int findr(int i) { Numtab *p; int h = NHASH(i); if (i == 0) return(-1); a0: for (p = nhash[h]; p; p = p->link) if (i == p->r) return(p - numtabp); for (p = numtabp; p < &numtabp[ncnt]; p++) { if (p->r == 0) { p->r = i; p->link = nhash[h]; nhash[h] = p; regcnt++; return(p - numtabp); } } grownumtab(); goto a0; } int usedr(int i) /* returns -1 if nr i has never been used */ { Numtab *p; if (i == 0) return(-1); for (p = nhash[NHASH(i)]; p; p = p->link) if (i == p->r) return(p - numtabp); return -1; } int fnumb(int i, int (*f)(Tchar)) { int j; j = 0; if (i < 0) { j = (*f)('-' | nrbits); i = -i; } switch (nform) { default: case '1': case 0: return decml(i, f) + j; case 'i': case 'I': return roman(i, f) + j; case 'a': case 'A': return abc(i, f) + j; } } int decml(int i, int (*f)(Tchar)) { int j, k; k = 0; nform--; if ((j = i / 10) || (nform > 0)) k = decml(j, f); return(k + (*f)((i % 10 + '0') | nrbits)); } int roman(int i, int (*f)(Tchar)) { if (!i) return((*f)('0' | nrbits)); if (nform == 'i') return(roman0(i, f, "ixcmz", "vldw")); else return(roman0(i, f, "IXCMZ", "VLDW")); } int roman0(int i, int (*f)(Tchar), char *onesp, char *fivesp) { int q, rem, k; if (!i) return(0); k = roman0(i / 10, f, onesp + 1, fivesp + 1); q = (i = i % 10) / 5; rem = i % 5; if (rem == 4) { k += (*f)(*onesp | nrbits); if (q) i = *(onesp + 1); else i = *fivesp; return(k += (*f)(i | nrbits)); } if (q) k += (*f)(*fivesp | nrbits); while (--rem >= 0) k += (*f)(*onesp | nrbits); return(k); } int abc(int i, int (*f)(Tchar)) { if (!i) return((*f)('0' | nrbits)); else return(abc0(i - 1, f)); } int abc0(int i, int (*f)(Tchar)) { int j, k; k = 0; if (j = i / 26) k = abc0(j - 1, f); return(k + (*f)((i % 26 + nform) | nrbits)); } long atoi0(void) { int c, k, cnt; Tchar ii; long i, acc; acc = 0; nonumb = 0; cnt = -1; a0: cnt++; ii = getch(); c = cbits(ii); switch (c) { default: ch = ii; if (cnt) break; case '+': i = ckph(); if (nonumb) break; acc += i; goto a0; case '-': i = ckph(); if (nonumb) break; acc -= i; goto a0; case '*': i = ckph(); if (nonumb) break; acc *= i; goto a0; case '/': i = ckph(); if (nonumb) break; if (i == 0) { flusho(); ERROR "divide by zero." WARN; acc = 0; } else acc /= i; goto a0; case '%': i = ckph(); if (nonumb) break; acc %= i; goto a0; case '&': /*and*/ i = ckph(); if (nonumb) break; if ((acc > 0) && (i > 0)) acc = 1; else acc = 0; goto a0; case ':': /*or*/ i = ckph(); if (nonumb) break; if ((acc > 0) || (i > 0)) acc = 1; else acc = 0; goto a0; case '=': if (cbits(ii = getch()) != '=') ch = ii; i = ckph(); if (nonumb) { acc = 0; break; } if (i == acc) acc = 1; else acc = 0; goto a0; case '>': k = 0; if (cbits(ii = getch()) == '=') k++; else ch = ii; i = ckph(); if (nonumb) { acc = 0; break; } if (acc > (i - k)) acc = 1; else acc = 0; goto a0; case '<': k = 0; if (cbits(ii = getch()) == '=') k++; else ch = ii; i = ckph(); if (nonumb) { acc = 0; break; } if (acc < (i + k)) acc = 1; else acc = 0; goto a0; case ')': break; case '(': acc = atoi0(); goto a0; } return(acc); } long ckph(void) { Tchar i; long j; if (cbits(i = getch()) == '(') j = atoi0(); else { j = atoi1(i); } return(j); } /* * print error about illegal numeric argument; */ void prnumerr(void) { char err_buf[40]; static char warn[] = "Numeric argument expected"; int savcd = numtabp[CD].val; if (numerr.type == RQERR) sprintf(err_buf, "%c%s: %s", nb ? cbits(c2) : cbits(cc), unpair(numerr.req), warn); else sprintf(err_buf, "\\%c'%s': %s", numerr.esc, &numerr.escarg, warn); if (frame != stk) /* uncertainty correction */ numtabp[CD].val--; ERROR "%s", err_buf WARN; numtabp[CD].val = savcd; } long atoi1(Tchar ii) { int i, j, digits; double acc; /* this is the only double in troff! */ int neg, abs, field, decpnt; extern int ifnum; neg = abs = field = decpnt = digits = 0; acc = 0; for (;;) { i = cbits(ii); switch (i) { default: break; case '+': ii = getch(); continue; case '-': neg = 1; ii = getch(); continue; case '|': abs = 1 + neg; neg = 0; ii = getch(); continue; } break; } a1: while (i >= '0' && i <= '9') { field++; digits++; acc = 10 * acc + i - '0'; ii = getch(); i = cbits(ii); } if (i == '.' && !decpnt++) { field++; digits = 0; ii = getch(); i = cbits(ii); goto a1; } if (!field) { ch = ii; goto a2; } switch (i) { case 'u': i = j = 1; /* should this be related to HOR?? */ break; case 'v': /*VSs - vert spacing*/ j = lss; i = 1; break; case 'm': /*Ems*/ j = EM; i = 1; break; case 'n': /*Ens*/ j = EM; if (TROFF) i = 2; else i = 1; /*Same as Ems in NROFF*/ break; case 'p': /*Points*/ j = INCH; i = 72; break; case 'i': /*Inches*/ j = INCH; i = 1; break; case 'c': /*Centimeters*/ /* if INCH is too big, this will overflow */ j = INCH * 50; i = 127; break; case 'P': /*Picas*/ j = INCH; i = 6; break; default: j = dfact; ch = ii; i = dfactd; } if (neg) acc = -acc; if (!noscale) { acc = (acc * j) / i; } if (field != digits && digits > 0) while (digits--) acc /= 10; if (abs) { if (dip != d) j = dip->dnl; else j = numtabp[NL].val; if (!vflag) { j = numtabp[HP].val; } if (abs == 2) j = -j; acc -= j; } a2: nonumb = (!field || field == decpnt); if (nonumb && (trace & TRNARGS) && !ismot(ii) && !nlflg && !ifnum) { if (cbits(ii) != RIGHT ) /* Too painful to do right */ prnumerr(); } return(acc); } void caserr(void) { int i, j; Numtab *p; lgf++; while (!skip() && (i = getrq()) ) { j = usedr(i); if (j < 0) continue; p = &numtabp[j]; nunhash(p); p->r = p->val = p->inc = p->fmt = 0; regcnt--; } } /* * .nr request; if tracing, don't check optional * 2nd argument because tbl generates .in 1.5n */ void casenr(void) { int i, j; int savtr = trace; lgf++; skip(); if ((i = findr(getrq())) == -1) goto rtn; skip(); j = inumb(&numtabp[i].val); if (nonumb) goto rtn; numtabp[i].val = j; skip(); trace = 0; j = atoi0(); /* BUG??? */ trace = savtr; if (nonumb) goto rtn; numtabp[i].inc = j; rtn: return; } void caseaf(void) { int i, k; Tchar j; lgf++; if (skip() || !(i = getrq()) || skip()) return; k = 0; j = getch(); if (!isalpha(cbits(j))) { ch = j; while ((j = cbits(getch())) >= '0' && j <= '9') k++; } if (!k) k = j; numtabp[findr(i)].fmt = k; /* was k & BYTEMASK */ } void setaf(void) /* return format of number register */ { int i, j; i = usedr(getsn()); if (i == -1) return; if (numtabp[i].fmt > 20) /* it was probably a, A, i or I */ *pbp++ = numtabp[i].fmt; else for (j = (numtabp[i].fmt ? numtabp[i].fmt : 1); j; j--) *pbp++ = '0'; } int vnumb(int *i) { vflag++; dfact = lss; res = VERT; return(inumb(i)); } int hnumb(int *i) { dfact = EM; res = HOR; return(inumb(i)); } int inumb(int *n) { int i, j, f; Tchar ii; f = 0; if (n) { if ((j = cbits(ii = getch())) == '+') f = 1; else if (j == '-') f = -1; else ch = ii; } i = atoi0(); if (n && f) i = *n + f * i; i = quant(i, res); vflag = 0; res = dfactd = dfact = 1; if (nonumb) i = 0; return(i); } int quant(int n, int m) { int i, neg; neg = 0; if (n < 0) { neg++; n = -n; } /* better as i = ((n + m/2)/m)*m */ i = n / m; if (n - m * i > m / 2) i += 1; i *= m; if (neg) i = -i; return(i); } 9base-6/troff/Makefile0000644000175000017500000000131311402154555014324 0ustar anselmanselm# mk - mk unix port from plan9 # Depends on ../lib9 TARG = troff OFILES = n1.o n2.o n3.o n4.o n5.o t6.o n6.o n7.o n8.o n9.o t10.o\ n10.o t11.o ni.o hytab.o suftab.o dwbinit.o mbwc.o MANFILES = troff.1 TROFFDIR = ${PREFIX}/lib/troff include ../std.mk CFLAGS += -DUNICODE -DTMACDIR=\"/tmac/tmac.\" -DTDEVNAME=\"utf\" -DFONTDIR=\"/font\" -DNTERMDIR=\"/term/tab.\" -DTEXHYPHENS=\"/hyphen.tex\" -DALTHYPHENS=\"/hyphen.tex\" -DDWBHOME=\"${TROFFDIR}/\" pre-uninstall: @rm -rf ${DESTDIR}${TROFFDIR} post-install: @mkdir -p ${DESTDIR}${TROFFDIR} @cp -r tmac ${DESTDIR}${TROFFDIR} @cp -r font ${DESTDIR}${TROFFDIR} @cp -r term ${DESTDIR}${TROFFDIR} @cp -r hyphen.tex ${DESTDIR}${TROFFDIR} 9base-6/troff/ext.h0000644000175000017500000000672611402154555013652 0ustar anselmanselm#define devname p9_devname extern int TROFF; extern int alphabet; extern char **argp; extern char *eibuf; extern char *ibufp; extern char *obufp; extern char *unlkp; extern char *xbufp; extern char *xeibuf; extern char cfname[NSO+1][NS]; extern int trace; extern char devname[]; extern char ibuf[IBUFSZ]; extern char mfiles[NMF][NS]; extern char nextf[]; extern char obuf[]; extern char termtab[]; extern char fontdir[]; extern Font fonts[MAXFONTS+1]; extern char xbuf[IBUFSZ]; extern Offset apptr; extern Offset ip; extern Offset nextb; extern Offset offset; extern Offset woff; extern Numerr numerr; extern int *pnp; extern int pstab[]; extern int nsizes; extern int app; extern int ascii; extern int bd; extern int bdtab[]; extern int ccs; extern char *chnames[]; /* chnames[n-ALPHABET] -> name of char n */ extern int copyf; extern int cs; extern int dfact; extern int dfactd; extern int diflg; extern int dilev; extern int donef; extern int dotT; extern int dpn; extern int ds; extern int ejf; extern int em; extern int eqflg; extern int error; extern int esc; extern int eschar; extern int ev; extern int evi; extern int evlist[EVLSZ]; extern int fc; extern int flss; extern int fontlab[]; extern int hflg; extern int ibf; extern int ifi; extern int iflg; extern int init; extern int lead; extern int lg; extern int lgf; extern int macerr; extern int mflg; extern int mfont; extern int mlist[NTRAP]; extern int mpts; extern int nchnames; extern int ndone; extern int newmn; extern int nflush; extern int nfo; extern int nfonts; extern int nform; extern int nhyp; extern int nlflg; extern int nlist[NTRAP]; extern int nmfi; extern int nonumb; extern int noscale; extern int npn; extern int npnflg; extern int nx; extern int oldbits; extern int oldmn; extern int over; extern int padc; extern int pfont; extern int pfrom; extern int pipeflg; extern int pl; extern int pnlist[]; extern int po1; extern int po; extern int ppts; #define print troffprint extern int print; extern FILE *ptid; extern int pto; extern int quiet; extern int ralss; extern int rargc; extern int raw; extern int res; extern int sbold; extern int setwdf; extern int sfont; extern int smnt; extern int stdi; extern int stop; extern int sv; extern int tabch, ldrch; extern int tflg; extern int totout; extern int trap; extern Ushort trtab[]; extern int tty; extern int ulfont; extern int vflag; extern int whichroff; extern int widthp; extern int xfont; extern int xpts; extern Stack *ejl; extern Stack *frame; extern Stack *stk; extern Stack *nxf; extern Tchar **hyp; extern Tchar *olinep; extern Tchar pbbuf[NC]; extern Tchar *pbp; extern Tchar *lastpbp; extern Tchar ch; extern Tchar nrbits; extern Tbuf _oline; extern Wcache widcache[]; extern char gchtab[]; extern Diver d[NDI]; extern Diver *dip; extern char xchname[]; extern short xchtab[]; extern char *codestr; extern char *chnamep; extern short *chtab; extern int nchtab; extern Numtab *numtabp; /* these characters are used as various signals or values /* in miscellaneous places. /* values are set in specnames in t10.c */ extern int c_hyphen; extern int c_emdash; extern int c_rule; extern int c_minus; extern int c_fi; extern int c_fl; extern int c_ff; extern int c_ffi; extern int c_ffl; extern int c_acute; extern int c_grave; extern int c_under; extern int c_rooten; extern int c_boxrule; extern int c_lefthand; extern int c_dagger; extern int c_isalnum; /* * String pointers for DWB pathname management. */ extern char *DWBfontdir; extern char *DWBntermdir; extern char *DWBalthyphens; 9base-6/troff/n3.c0000644000175000017500000003760311402154555013363 0ustar anselmanselm/* * troff3.c * * macro and string routines, storage allocation */ #include "tdef.h" #include "fns.h" #include "ext.h" Tchar *argtop; int pagech = '%'; int strflg; #define MHASHSIZE 128 /* must be 2**n */ #define MHASH(x) ((x>>6)^x) & (MHASHSIZE-1) Contab *mhash[MHASHSIZE]; Blockp *blist; /* allocated blocks for macros and strings */ int nblist; /* how many there are */ int bfree = -1; /* first (possible) free block in the list */ Contab *contabp = NULL; #define MDELTA 500 int nm = 0; int savname; /* name of macro/string being defined */ int savslot; /* place in Contab of savname */ int freeslot = -1; /* first (possible) free slot in contab */ void prcontab(Contab *p) { int i; for (i = 0; i < nm; i++) if (p) if (p[i].rq != 0) fprintf(stderr, "slot %d, %-2.2s\n", i, unpair(p[i].rq)); else fprintf(stderr, "slot %d empty\n", i); else fprintf(stderr, "slot %d empty\n", i); } void blockinit(void) { blist = (Blockp *) calloc(NBLIST, sizeof(Blockp)); if (blist == NULL) { ERROR "not enough room for %d blocks", NBLIST WARN; done2(1); } nblist = NBLIST; blist[0].nextoff = blist[1].nextoff = -1; blist[0].bp = (Tchar *) calloc(BLK, sizeof(Tchar)); blist[1].bp = (Tchar *) calloc(BLK, sizeof(Tchar)); /* -1 prevents blist[0] from being used; temporary fix */ /* for a design botch: offset==0 is overloaded. */ /* blist[1] reserved for .rd indicator -- also unused. */ /* but someone unwittingly looks at these, so allocate something */ bfree = 2; } char *grow(char *ptr, int num, int size) /* make array bigger */ { char *p; if (ptr == NULL) p = (char *) calloc(num, size); else p = (char *) realloc(ptr, num * size); return p; } void mnspace(void) { nm = sizeof(contab)/sizeof(Contab) + MDELTA; freeslot = sizeof(contab)/sizeof(Contab) + 1; contabp = (Contab *) grow((char *) contabp, nm, sizeof(Contab)); if (contabp == NULL) { ERROR "not enough memory for namespace of %d marcos", nm WARN; exit(1); } contabp = (Contab *) memcpy((char *) contabp, (char *)contab, sizeof(contab)); if (contabp == NULL) { ERROR "Cannot reinitialize macro/request name list" WARN; exit(1); } } void caseig(void) { int i; Offset oldoff = offset; offset = 0; i = copyb(); offset = oldoff; if (i != '.') control(i, 1); } void casern(void) { int i, j, k; lgf++; skip(); if ((i = getrq()) == 0 || (oldmn = findmn(i)) < 0) return; skip(); clrmn(findmn(j = getrq())); if (j) { munhash(&contabp[oldmn]); contabp[oldmn].rq = j; maddhash(&contabp[oldmn]); if (dip != d ) for (k = dilev; k; k--) if (d[k].curd == i) d[k].curd = j; } } void maddhash(Contab *rp) { Contab **hp; if (rp->rq == 0) return; hp = &mhash[MHASH(rp->rq)]; rp->link = *hp; *hp = rp; } void munhash(Contab *mp) { Contab *p; Contab **lp; if (mp->rq == 0) return; lp = &mhash[MHASH(mp->rq)]; p = *lp; while (p) { if (p == mp) { *lp = p->link; p->link = 0; return; } lp = &p->link; p = p->link; } } void mrehash(void) { Contab *p; int i; for (i=0; i < MHASHSIZE; i++) mhash[i] = 0; for (p=contabp; p < &contabp[nm]; p++) p->link = 0; for (p=contabp; p < &contabp[nm]; p++) { if (p->rq == 0) continue; i = MHASH(p->rq); p->link = mhash[i]; mhash[i] = p; } } void caserm(void) { int j; int k = 0; lgf++; g0: while (!skip() && (j = getrq()) != 0) { if (dip != d) for (k = dilev; k; k--) if (d[k].curd == j) { ERROR "cannot remove diversion %s during definition", unpair(j) WARN; goto g0; } clrmn(findmn(j)); } lgf--; } void caseas(void) { app++; caseds(); } void caseds(void) { ds++; casede(); } void caseam(void) { app++; casede(); } void casede(void) { int i, req; Offset savoff; req = '.'; lgf++; skip(); if ((i = getrq()) == 0) goto de1; if ((offset = finds(i)) == 0) goto de1; if (newmn) savslot = newmn; else savslot = findmn(i); savname = i; if (ds) copys(); else req = copyb(); clrmn(oldmn); if (newmn) { if (contabp[newmn].rq) munhash(&contabp[newmn]); contabp[newmn].rq = i; maddhash(&contabp[newmn]); } if (apptr) { savoff = offset; offset = apptr; wbf((Tchar) IMP); offset = savoff; } offset = dip->op; if (req != '.') control(req, 1); de1: ds = app = 0; } int findmn(int i) { Contab *p; for (p = mhash[MHASH(i)]; p; p = p->link) if (i == p->rq) return(p - contabp); return(-1); } void clrmn(int i) { if (i >= 0) { if (contabp[i].mx) ffree(contabp[i].mx); munhash(&contabp[i]); contabp[i].rq = 0; contabp[i].mx = 0; contabp[i].emx = 0; contabp[i].f = 0; if (contabp[i].divsiz != NULL) { free(contabp[i].divsiz); contabp[i].divsiz = NULL; } if (freeslot > i) freeslot = i; } } void growcontab(void) { nm += MDELTA; contabp = (Contab *) grow((char *) contabp , nm, sizeof(Contab)); if (contabp == NULL) { ERROR "Too many (%d) string/macro names", nm WARN; done2(02); } else { memset((char *)(contabp) + (nm - MDELTA) * sizeof(Contab), 0, MDELTA * sizeof(Contab)); mrehash(); } } Offset finds(int mn) { int i; Offset savip; oldmn = findmn(mn); newmn = 0; apptr = 0; if (app && oldmn >= 0 && contabp[oldmn].mx) { savip = ip; ip = contabp[oldmn].emx; oldmn = -1; apptr = ip; if (!diflg) ip = incoff(ip); nextb = ip; ip = savip; } else { for (i = freeslot; i < nm; i++) { if (contabp[i].rq == 0) break; } if (i == nm) growcontab(); freeslot = i + 1; if ((nextb = alloc()) == -1) { app = 0; if (macerr++ > 1) done2(02); if (nextb == 0) ERROR "Not enough space for string/macro names" WARN; edone(04); return(offset = 0); } contabp[i].mx = nextb; if (!diflg) { newmn = i; if (oldmn == -1) contabp[i].rq = -1; } else { contabp[i].rq = mn; maddhash(&contabp[i]); } } app = 0; return(offset = nextb); } int skip(void) { Tchar i; while (cbits(i = getch()) == ' ' || ismot(i)) ; ch = i; return(nlflg); } int copyb(void) { int i, j, state; Tchar ii; int req, k; Offset savoff; Uchar *p; savoff = 0; if (skip() || !(j = getrq())) j = '.'; req = j; p = unpair(j); /* was: k = j >> BYTE; j &= BYTEMASK; */ j = p[0]; k = p[1]; copyf++; flushi(); nlflg = 0; state = 1; /* state 0 eat up * state 1 look for . * state 2 look for first char of end macro * state 3 look for second char of end macro */ while (1) { i = cbits(ii = getch()); if (state == 3) { if (i == k) break; if (!k) { ch = ii; i = getach(); ch = ii; if (!i) break; } state = 0; goto c0; } if (i == '\n') { state = 1; nlflg = 0; goto c0; } if (state == 1 && i == '.') { state++; savoff = offset; goto c0; } if (state == 2 && i == j) { state++; goto c0; } state = 0; c0: if (offset) wbf(ii); } if (offset) { offset = savoff; wbf((Tchar)0); } copyf--; return(req); } void copys(void) { Tchar i; copyf++; if (skip()) goto c0; if (cbits(i = getch()) != '"') wbf(i); while (cbits(i = getch()) != '\n') wbf(i); c0: wbf((Tchar)0); copyf--; } Offset alloc(void) /* return free Offset in nextb */ { int i, j; for (i = bfree; i < nblist; i++) if (blist[i].nextoff == 0) break; if (i == nblist) { blist = (Blockp *) realloc((char *) blist, 2 * nblist * sizeof(Blockp)); if (blist == NULL) { ERROR "can't grow blist for string/macro defns" WARN; done2(2); } nblist *= 2; for (j = i; j < nblist; j++) { blist[j].nextoff = 0; blist[j].bp = 0; } } blist[i].nextoff = -1; /* this block is the end */ bfree = i + 1; if (blist[i].bp == 0) blist[i].bp = (Tchar *) calloc(BLK, sizeof(Tchar)); if (blist[i].bp == NULL) { ERROR "can't allocate memory for string/macro definitions" WARN; done2(2); } nextb = (Offset) i * BLK; return nextb; } void ffree(Offset i) /* free list of blocks starting at blist(o) */ { /* (doesn't actually free the blocks, just the pointers) */ int j; for ( ; blist[j = bindex(i)].nextoff != -1; ) { if (bfree > j) bfree = j; i = blist[j].nextoff; blist[j].nextoff = 0; } blist[j].nextoff = 0; } void wbf(Tchar i) /* store i into offset, get ready for next one */ { int j, off; if (!offset) return; j = bindex(offset); if (i == 0) contabp[savslot].emx = offset; off = boffset(offset); blist[j].bp[off++] = i; offset++; if (pastend(offset)) { /* off the end of this block */ if (blist[j].nextoff == -1) { if ((nextb = alloc()) == -1) { ERROR "Out of temp file space" WARN; done2(01); } blist[j].nextoff = nextb; } offset = blist[j].nextoff; } } Tchar rbf(void) /* return next char from blist[] block */ { Tchar i, j; if (ip == RD_OFFSET) { /* for rdtty */ if (j = rdtty()) return(j); else return(popi()); } i = rbf0(ip); if (i == 0) { if (!app) i = popi(); return(i); } ip = incoff(ip); return(i); } Offset xxxincoff(Offset p) /* get next blist[] block */ { p++; if (pastend(p)) { /* off the end of this block */ if ((p = blist[bindex(p-1)].nextoff) == -1) { /* and nothing was allocated after it */ ERROR "Bad storage allocation" WARN; done2(-5); } } return(p); } Tchar popi(void) { Stack *p; if (frame == stk) return(0); if (strflg) strflg--; p = nxf = frame; p->nargs = 0; frame = p->pframe; ip = p->pip; pendt = p->ppendt; lastpbp = p->lastpbp; return(p->pch); } /* * test that the end of the allocation is above a certain location * in memory */ #define SPACETEST(base, size) \ if ((char*)base + size >= (char*)stk+STACKSIZE) \ ERROR "Stacksize overflow in n3" WARN Offset pushi(Offset newip, int mname) { Stack *p; SPACETEST(nxf, sizeof(Stack)); p = nxf; p->pframe = frame; p->pip = ip; p->ppendt = pendt; p->pch = ch; p->lastpbp = lastpbp; p->mname = mname; lastpbp = pbp; pendt = ch = 0; frame = nxf; if (nxf->nargs == 0) nxf += 1; else nxf = (Stack *)argtop; return(ip = newip); } void *setbrk(int x) { char *i; if ((i = (char *) calloc(x, 1)) == 0) { ERROR "Core limit reached" WARN; edone(0100); } return(i); } int getsn(void) { int i; if ((i = getach()) == 0) return(0); if (i == '(') return(getrq()); else return(i); } Offset setstr(void) { int i, j; lgf++; if ((i = getsn()) == 0 || (j = findmn(i)) == -1 || !contabp[j].mx) { lgf--; return(0); } else { SPACETEST(nxf, sizeof(Stack)); nxf->nargs = 0; strflg++; lgf--; return pushi(contabp[j].mx, i); } } void collect(void) { int j; Tchar i, *strp, *lim, **argpp, **argppend; int quote; Stack *savnxf; copyf++; nxf->nargs = 0; savnxf = nxf; if (skip()) goto rtn; { char *memp; memp = (char *)savnxf; /* * 1 s structure for the macro descriptor * APERMAC Tchar *'s for pointers into the strings * space for the Tchar's themselves */ memp += sizeof(Stack); /* * CPERMAC = the total # of characters for ALL arguments */ #define CPERMAC 200 #define APERMAC 9 memp += APERMAC * sizeof(Tchar *); memp += CPERMAC * sizeof(Tchar); nxf = (Stack *)memp; } lim = (Tchar *)nxf; argpp = (Tchar **)(savnxf + 1); argppend = &argpp[APERMAC]; SPACETEST(argppend, sizeof(Tchar *)); strp = (Tchar *)argppend; /* * Zero out all the string pointers before filling them in. */ for (j = 0; j < APERMAC; j++) argpp[j] = 0; /* ERROR "savnxf=0x%x,nxf=0x%x,argpp=0x%x,strp=argppend=0x%x, lim=0x%x", * savnxf, nxf, argpp, strp, lim WARN; */ strflg = 0; while (argpp != argppend && !skip()) { *argpp++ = strp; quote = 0; if (cbits(i = getch()) == '"') quote++; else ch = i; while (1) { i = getch(); /* fprintf(stderr, "collect %c %d\n", cbits(i), cbits(i)); */ if (nlflg || (!quote && argpp != argppend && cbits(i) == ' ')) break; /* collects rest into $9 */ if ( quote && cbits(i) == '"' && cbits(i = getch()) != '"') { ch = i; break; } *strp++ = i; if (strflg && strp >= lim) { /* ERROR "strp=0x%x, lim = 0x%x", strp, lim WARN; */ ERROR "Macro argument too long" WARN; copyf--; edone(004); } SPACETEST(strp, 3 * sizeof(Tchar)); } *strp++ = 0; } nxf = savnxf; nxf->nargs = argpp - (Tchar **)(savnxf + 1); argtop = strp; rtn: copyf--; } void seta(void) { int i; i = cbits(getch()) - '0'; if (i > 0 && i <= APERMAC && i <= frame->nargs) pushback(*(((Tchar **)(frame + 1)) + i - 1)); } void caseda(void) { app++; casedi(); } void casegd(void) { int i, j; skip(); if ((i = getrq()) == 0) return; if ((j = findmn(i)) >= 0) { if (contabp[j].divsiz != NULL) { numtabp[DN].val = contabp[j].divsiz->dix; numtabp[DL].val = contabp[j].divsiz->diy; } } } #define FINDDIV(o) if ((o = findmn(dip->curd)) < 0) \ ERROR "lost diversion %s", unpair(dip->curd) WARN void casedi(void) { int i, j, *k; lgf++; if (skip() || (i = getrq()) == 0) { if (dip != d) { FINDDIV(savslot); wbf((Tchar)0); } if (dilev > 0) { numtabp[DN].val = dip->dnl; numtabp[DL].val = dip->maxl; FINDDIV(j); if ((contabp[j].divsiz = (Divsiz *) malloc(sizeof(Divsiz))) == NULL) { ERROR "Cannot alloc diversion size" WARN; done2(1); } else { contabp[j].divsiz->dix = numtabp[DN].val; contabp[j].divsiz->diy = numtabp[DL].val; } dip = &d[--dilev]; offset = dip->op; } goto rtn; } if (++dilev == NDI) { --dilev; ERROR "Diversions nested too deep" WARN; edone(02); } if (dip != d) { FINDDIV(j); savslot = j; wbf((Tchar)0); } diflg++; dip = &d[dilev]; dip->op = finds(i); dip->curd = i; clrmn(oldmn); k = (int *) & dip->dnl; for (j = 0; j < 10; j++) k[j] = 0; /*not op and curd*/ rtn: app = 0; diflg = 0; } void casedt(void) { lgf++; dip->dimac = dip->ditrap = dip->ditf = 0; skip(); dip->ditrap = vnumb((int *)0); if (nonumb) return; skip(); dip->dimac = getrq(); } #define LNSIZE 4000 void casetl(void) { int j; int w[3]; Tchar buf[LNSIZE]; Tchar *tp; Tchar i, delim; /* * bug fix * * if .tl is the first thing in the file, the p1 * doesn't come out, also the pagenumber will be 0 * * tends too confuse the device filter (and the user as well) */ if (dip == d && numtabp[NL].val == -1) newline(1); dip->nls = 0; skip(); if (ismot(delim = getch())) { ch = delim; delim = '\''; } else delim = cbits(delim); tp = buf; numtabp[HP].val = 0; w[0] = w[1] = w[2] = 0; j = 0; while (cbits(i = getch()) != '\n') { if (cbits(i) == cbits(delim)) { if (j < 3) w[j] = numtabp[HP].val; numtabp[HP].val = 0; if (w[j] != 0) *tp++ = WORDSP; j++; *tp++ = 0; } else { if (cbits(i) == pagech) { setn1(numtabp[PN].val, numtabp[findr('%')].fmt, i&SFMASK); continue; } numtabp[HP].val += width(i); if (tp < &buf[LNSIZE-10]) { if (cbits(i) == ' ' && *tp != WORDSP) *tp++ = WORDSP; *tp++ = i; } else { ERROR "Overflow in casetl" WARN; } } } if (j<3) w[j] = numtabp[HP].val; *tp++ = 0; *tp++ = 0; *tp = 0; tp = buf; if (NROFF) horiz(po); while (i = *tp++) pchar(i); if (w[1] || w[2]) horiz(j = quant((lt - w[1]) / 2 - w[0], HOR)); while (i = *tp++) pchar(i); if (w[2]) { horiz(lt - w[0] - w[1] - w[2] - j); while (i = *tp++) pchar(i); } newline(0); if (dip != d) { if (dip->dnl > dip->hnl) dip->hnl = dip->dnl; } else { if (numtabp[NL].val > dip->hnl) dip->hnl = numtabp[NL].val; } } void casepc(void) { pagech = chget(IMP); } void casepm(void) { int i, k; int xx, cnt, tcnt, kk, tot; Offset j; kk = cnt = tcnt = 0; tot = !skip(); stackdump(); for (i = 0; i < nm; i++) { if ((xx = contabp[i].rq) == 0 || contabp[i].mx == 0) continue; tcnt++; j = contabp[i].mx; for (k = 1; (j = blist[bindex(j)].nextoff) != -1; ) k++; cnt++; kk += k; if (!tot) fprintf(stderr, "%-2.2s %d\n", unpair(xx), k); } fprintf(stderr, "pm: total %d, macros %d, space %d\n", tcnt, cnt, kk); } void stackdump(void) /* dumps stack of macros in process */ { Stack *p; if (frame != stk) { fprintf(stderr, "stack: "); for (p = frame; p != stk; p = p->pframe) fprintf(stderr, "%s ", unpair(p->mname)); fprintf(stderr, "\n"); } } 9base-6/troff/troff.10000644000175000017500000000603311402154555014072 0ustar anselmanselm.TH TROFF 1 .SH NAME troff, nroff \- text formatting and typesetting .SH SYNOPSIS .B troff [ .I option ... ] [ .I file ... ] .PP .B nroff [ .I option ... ] [ .I file ... ] .SH DESCRIPTION .I Troff formats text in the named .I files for printing on a typesetter. .I Nroff does the same, but produces output suitable for typewriter-like devices. .PP If no .I file argument is present, the standard input is read. An argument consisting of a single minus .RB ( - ) is taken to be a file name corresponding to the standard input. The options are: .nr xx \w'\fL-m\f2name\ \ ' .TP \n(xxu .BI -o list Print pages in the comma-separated .I list of numbers and ranges. A range .IB N - M means .I N through .IR M ; initial .BI - M means up to .IR M ; final .IB N - means from .I N to the end. .TP .BI -n N Number first generated page .IR N . .TP .BI -m name Process the macro file .BI /sys/lib/tmac/tmac. name before the input .IR files . .TP .BI -r aN Set register .I a (one character name) to .IR N . .TP .B -i Read standard input after the input files are exhausted. .TP .B -q Invoke the simultaneous input-output mode of the .B rd request. .TP .B -N Produce output suitable for typewriter-like devices. .SS Typesetter devices (not \fL-N\fP) only .TP \n(xxu .B -a Send a printable textual approximation of the results to the standard output. .TP .BI -T dest Prepare output for typesetter .IR dest : .br .ns .RS .TP \w'\fL-TLatin1\ 'u .B -Tutf (The default.) PostScript printers with preprocessing to handle Unicode characters encoded in .SM UTF .PD0 .TP .B -Tpost Regular PostScript printers .PD0 .TP .B -T202 Mergenthaler Linotron 202 .RE .PD .TP "\w'\fL-m\f2name 'u" .BI -F dir Take font information from directory .IR dir . .SS Typewriter (\fL-N\fP) output only .TP \n(xxu .BI -s N Halt prior to every .I N pages (default .IR N =1) to allow paper loading or changing. .TP .BI -T name Prepare output for specified terminal. Known .I names include .B utf for the normal Plan 9 .SM UTF encoding of the Unicode Standard character set (default), .B 37 for the Teletype model 37, .B lp (`line-printer') for any terminal without half-line capability, .B 450 for the \s-1DASI\s+1-450 (Diablo Hyterm), and .B think (HP ThinkJet). .TP .B -e Produce equally-spaced words in adjusted lines, using full terminal resolution. .TP .B -h Use output tabs during horizontal spacing to speed output and reduce output character count. Tab settings are assumed to be every 8 nominal character widths. .SH FILES .TF \*9/troff/term/* .TP .B /tmp/trtmp* temporary file .TP .B \*9/tmac/tmac.* standard macro files .TP .B \*9/troff/term/* terminal driving tables for .I nroff .TP .B \*9/troff/font/* font width tables for .I troff .SH SOURCE .B \*9/src/cmd/troff .SH "SEE ALSO" .IR lpr (1), .IR proof (1), .IR tr2post (1), .IR eqn (1), .IR tbl (1), .IR pic (1), .IR grap (1), .IR doctype (1), .IR ms (7), .IR image (7), .IR tex (1), .IR deroff (1) .br J. F. Ossanna and B. W. Kernighan, ``Troff User's Manual'' .br B. W. Kernighan, ``A TROFF Tutorial'', .I Unix Research System Programmer's Manual, Tenth Edition, Volume 2. 9base-6/troff/t11.c0000644000175000017500000001574411402154555013452 0ustar anselmanselm#include "tdef.h" #include "fns.h" #include "ext.h" #define MAXCH NCHARS /* maximum number of global char names */ char *chnames[MAXCH]; /* chnames[n-ALPHABET] -> name of char n */ int nchnames; /* number of Cxy names currently seen */ #define MAXPS 100 /* max number of point sizes */ int pstab[MAXPS]; /* point sizes */ int nsizes; /* number in DESC */ Font fonts[MAXFONTS+1]; /* font info + ptr to width info */ #define skipline(f) while (getc(f) != '\n') #define eq(s1, s2) (strcmp(s1, s2) == 0) int getdesc(char *name) { FILE *fin; char cmd[100], s[100]; int i, v; if ((fin = fopen(unsharp(name), "r")) == NULL) return -1; while (fscanf(fin, "%s", cmd) != EOF) { if (strcmp(cmd, "res") == 0) { fscanf(fin, "%d", &Inch); } else if (strcmp(cmd, "hor") == 0) { fscanf(fin, "%d", &Hor); } else if (strcmp(cmd, "vert") == 0) { fscanf(fin, "%d", &Vert); } else if (strcmp(cmd, "unitwidth") == 0) { fscanf(fin, "%d", &Unitwidth); } else if (strcmp(cmd, "sizes") == 0) { nsizes = 0; while (fscanf(fin, "%d", &v) != EOF && v != 0 && nsizes < MAXPS) pstab[nsizes++] = v; } else if (strcmp(cmd, "fonts") == 0) { fscanf(fin, "%d", &nfonts); for (i = 1; i <= nfonts; i++) { fscanf(fin, "%s", s); fontlab[i] = PAIR(s[0], s[1]); } } else if (strcmp(cmd, "charset") == 0) { /* add any names */ while (fscanf(fin, "%s", s) != EOF) chadd(s, Troffchar, Install); break; } /* else just skip anything else */ skipline(fin); } fclose(fin); return 1; } static int checkfont(char *name) { /* in case it's not really a font description file */ /* really paranoid, but consider \f. */ FILE *fp; char buf[300], buf2[300]; int i, status = -1; if ((fp = fopen(unsharp(name), "r")) == NULL) return -1; for (i = 1; i <= 10; i++) { if (fgets(buf, sizeof buf, fp) == NULL) break; sscanf(buf, "%s", buf2); if (buf2[0] == '#') { i--; continue; } if (eq(buf2, "name") || eq(buf2, "fontname") || eq(buf2, "special") || eq(buf2, "charset")) { status = 1; break; } } fclose(fp); return status; } int getfont(char *name, int pos) /* create width tab for font */ { FILE *fin; Font *ftemp = &fonts[pos]; Chwid chtemp[MAXCH]; static Chwid chinit; int i, nw, n, wid, kern, code, type; char buf[100], ch[100], s1[100], s2[100], s3[100], cmd[300]; nw = code = 0; /* fprintf(stderr, "read font %s onto %d\n", name, pos); */ if (checkfont(name) == -1) return -1; if ((fin = fopen(unsharp(name), "r")) == NULL) return -1; for (i = 0; i < ALPHABET; i++) chtemp[i] = chinit; /* zero out to begin with */ ftemp->specfont = ftemp->ligfont = 0; ftemp->defaultwidth = ftemp->spacewidth = Inch * Unitwidth / 72 / 3; /* should be rounded */ while (fscanf(fin, "%s", cmd) != EOF) { if (strcmp(cmd, "name") == 0) fscanf(fin, "%s", ftemp->longname); else if (strcmp(cmd, "special") == 0) ftemp->specfont = 1; else if (strcmp(cmd, "ligatures") == 0) { ftemp->ligfont = getlig(fin); } else if (strcmp(cmd, "spacewidth") == 0) { fscanf(fin, "%d", &ftemp->spacewidth); } else if (strcmp(cmd, "defaultwidth") == 0) { fscanf(fin, "%d", &ftemp->defaultwidth); } else if (strcmp(cmd, "charset") == 0) { wchar_t wc; skipline(fin); nw = ALPHABET; while (fgets(buf, sizeof buf, fin) != NULL) { sscanf(buf, "%s %s %s %s", ch, s1, s2, s3); if (s1[0] != '"') { /* genuine new character */ sscanf(s1, "%d", &wid); sscanf(s2, "%d", &kern); code = strtol(s3, 0, 0); /* dec/oct/hex */ } /* otherwise it's a synonym for prev character, */ /* so leave previous values intact */ /* decide what kind of alphabet it might come from here */ if (strlen(ch) == 1) { /* it's ascii */ n = ch[0]; /* origin includes non-graphics */ chtemp[n].num = ch[0]; } else if (ch[0] == '\\' && ch[1] == '0') { n = strtol(ch+1, 0, 0); /* \0octal or \0xhex */ chtemp[n].num = n; #ifdef UNICODE } else if (mbtowc(&wc, ch, strlen(ch)) > 1) { chtemp[nw].num = chadd(ch, MBchar, Install); n = nw; nw++; #endif /*UNICODE*/ } else { if (strcmp(ch, "---") == 0) { /* no name */ sprintf(ch, "%d", code); type = Number; } else type = Troffchar; chtemp[nw].num = chadd(ch, type, Install); n = nw; nw++; } chtemp[n].wid = wid; chtemp[n].kern = kern; chtemp[n].code = code; /*fprintf(stderr, "font %2.2s char %4.4s num %3d wid %2d code %3d\n", ftemp->longname, ch, n, wid, code); */ } break; } skipline(fin); } fclose(fin); chtemp[' '].wid = ftemp->spacewidth; /* width of space on this font */ ftemp->nchars = nw; if (ftemp->wp) free(ftemp->wp); /* god help us if this wasn't allocated */ ftemp->wp = (Chwid *) malloc(nw * sizeof(Chwid)); if (ftemp->wp == NULL) return -1; for (i = 0; i < nw; i++) ftemp->wp[i] = chtemp[i]; /* * printf("%d chars: ", nw); * for (i = 0; i < nw; i++) * if (ftemp->wp[i].num > 0 && ftemp->wp[i].num < ALPHABET) { * printf("%c %d ", ftemp->wp[i].num, ftemp->wp[i].wid); * else if (i >= ALPHABET) * printf("%d (%s) %d ", ftemp->wp[i].num, * chnames[ftemp->wp[i].num-ALPHABET], ftemp->wp[i].wid); * } * printf("\n"); */ return 1; } int chadd(char *s, int type, int install) /* add s to global character name table; */ { /* or just look it up */ /* a temporary kludge: store the "type" as the first character */ /* of the string, so we can remember from whence it came */ char *p; int i; /* fprintf(stderr, "into chadd %s %c %c\n", s, type, install); /* */ for (i = 0; i < nchnames; i++) if (type == chnames[i][0] && eq(s, chnames[i]+1)) /* +1 since type at front */ break; /* fprintf(stderr, "i %d, nchnames %d\n", i, nchnames); /* */ if (i < nchnames) /* found same type and bytes at position i */ return ALPHABET + i; else if (install == Lookup) /* not found, and we were just looking */ return -1; chnames[nchnames] = p = (char *) malloc(strlen(s)+1+1); /* type + \0 */ if (p == NULL) { ERROR "out of space adding character %s", s WARN; return LEFTHAND; } if (nchnames >= NCHARS - ALPHABET) { ERROR "out of table space adding character %s", s WARN; return LEFTHAND; } strcpy(chnames[nchnames]+1, s); chnames[nchnames][0] = type; /* fprintf(stderr, "installed %c%s at %d\n", type, s, nchnames); /* */ return nchnames++ + ALPHABET; } char *chname(int n) /* return string for char with index n */ { /* includes type char at front, to be peeled off elsewhere */ if (n >= ALPHABET && n < nchnames + ALPHABET) return chnames[n-ALPHABET]; else return ""; } int getlig(FILE *fin) /* pick up ligature list */ { int lig; char temp[200]; lig = 0; while (fscanf(fin, "%s", temp) != EOF && strcmp(temp, "0") != 0) { if (strcmp(temp, "fi") == 0) lig |= LFI; else if (strcmp(temp, "fl") == 0) lig |= LFL; else if (strcmp(temp, "ff") == 0) lig |= LFF; else if (strcmp(temp, "ffi") == 0) lig |= LFFI; else if (strcmp(temp, "ffl") == 0) lig |= LFFL; else fprintf(stderr, "illegal ligature %s ignored\n", temp); } return lig; } 9base-6/troff/term/0000755000175000017500000000000011402154555013635 5ustar anselmanselm9base-6/troff/term/tab.370000644000175000017500000000300211402154555014551 0ustar anselmanselm37 bset 0 breset 0 Hor 24 Vert 20 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "" twrest "" twnl "\n" hlr "\0338" hlf "\0339" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \0338o\0339 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 \0338r\0339 co 1 \0338c\0339 pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 \016A\017 *b 1 \016B\017 *g 1 \016\\\017 *d 1 \016D\017 *e 1 \016S\017 *z 1 \016Q\017 *y 1 \016N\017 *h 1 \016T\017 *i 1 ,\bi *k 1 k *l 1 \016L\017 *m 1 \016M\017 *n 1 \016@\017 *c 1 \016X\017 *o 1 o *p 1 \016J\017 *r 1 \016K\017 *s 1 \016Y\017 *t 1 \016I\017 *u 1 u *f 1 \016U\017 *x 1 x *q 1 \016V\017 *w 1 \016C\017 *A 1 A *B 1 B *G 1 \016G\017 *D 1 \016W\017 *E 1 E *Z 1 Z *Y 1 H *H 1 \016O\017 *I 1 I *K 1 K *L 1 \016E\017 *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 1 \016P\017 *R 1 P *S 1 \016R\017 *T 1 T *U 1 Y *F 1 \016F\017 *X 1 X *Q 1 \016H\017 *W 1 \016Z\017 ts 1 s sr 2 \\/ rn 1 \0338_\0339 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 \0339~\0338 != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 \016]\017 gr 1 \016[\017 no 1 \016_\017 is 1 \016^\017 pt 2 oc es 1 O\b/ mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.lp0000644000175000017500000000250511402154555014742 0ustar anselmanselmlp bset 0 breset 0 Hor 24 Vert 40 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "" twrest "" twnl "\n" hlr "" hlf "" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 <\ba *b 1 ,\bB *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 /\bo *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 ~\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 2 ~\b|~\b| *R 1 P *S 1 ~\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 \0337_\n >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 6 gr 1 ~\bV no 1 - is 1 '\b,\bI pt 2 oc es 1 /\bO mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.post0000644000175000017500000000250711402154555015316 0ustar anselmanselmpost bset 0 breset 0 Hor 24 Vert 40 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "" twrest "" twnl "\n" hlr "" hlf "" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 <\ba *b 1 ,\bB *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 /\bo *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 ~\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 2 ~\b|~\b| *R 1 P *S 1 ~\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 \0337_\n >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 6 gr 1 ~\bV no 1 - is 1 '\b,\bI pt 2 oc es 1 /\bO mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.dumb0000644000175000017500000000250511402154555015256 0ustar anselmanselmlp bset 0 breset 0 Hor 24 Vert 40 Newline 40 Char 24 Em 24 Halfline 40 Adj 24 twinit "" twrest "" twnl "\n" hlr "" hlf "" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 <\ba *b 1 ,\bB *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 /\bo *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 ~\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 2 ~\b|~\b| *R 1 P *S 1 ~\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 \0337_\n >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 6 gr 1 ~\bV no 1 - is 1 '\b,\bI pt 2 oc es 1 /\bO mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.i3000000644000175000017500000000250711402154555015004 0ustar anselmanselmi300 bset 0 breset 0 Hor 24 Vert 40 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "" twrest "" twnl "\n" hlr "" hlf "" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 <\ba *b 1 ,\bB *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 /\bo *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 ~\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 2 ~\b|~\b| *R 1 P *S 1 ~\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 \0337_\n >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 6 gr 1 ~\bV no 1 - is 1 '\b,\bI pt 2 oc es 1 /\bO mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.thinksmall0000644000175000017500000000422711402154555016500 0ustar anselmanselmthinksmall bset 0 breset 0 Hor 12 Vert 30 Newline 30 Char 12 Em 12 Halfline 15 Adj 15 twinit "\033N\033&k2S\033&l8D" twrest "\033&k0S\033&l6D" twnl "\n" hlr "\033<" hlf "\033=" flr "" bdon "\016" bdoff "\017" iton "\033&dD" itoff "\033&d@" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 %\374 sq 2 [] ru 1 _ 14 1 %\367 12 1 %\370 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 %\263 dg 1 |\b- fm 1 %\250 ct 1 %\277 rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 %\275 aa 1 %\250 ga 1 %\251 ul 1 _ sl 1 / *a 1 <\ba *b 1 %\336 *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 %\326 *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 %\260\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b%\260 *O 1 O *P 2 %\260\b|%\260\b| *R 1 P *S 1 %\260\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 %\260 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 %\376 cu 1 U ca 3 (^) sb 2 (_\b%\260 sp 2 _\b%\260) ib 2 (%\260\b_\b= ip 2 %\260\b_\b=) if 2 oo pd 1 )\bo gr 1 %\260\bV no 1 - is 1 %\276 pt 2 oc es 1 %\322 mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | __ 1 _ `a 1 %\310 `e 1 %\311 `i 1 %\331 `o 1 %\312 `u 1 %\313 `A 1 %\241 `E 1 %\243 `I 1 %\346 `O 1 %\350 `U 1 %\255 'a 1 %\304 'e 1 %\305 'i 1 %\325 'o 1 %\306 'u 1 %\307 'A 1 %\340 'E 1 %\334 'I 1 %\345 'O 1 %\347 'U 1 %\355 ^a 1 %\300 ^e 1 %\301 ^i 1 %\321 ^o 1 %\302 ^u 1 %\303 ^A 1 %\242 ^E 1 %\244 ^I 1 %\246 ^O 1 %\337 ^U 1 %\256 ^s 1 %\354 ^S 1 %\353 "a 1 %\314 "e 1 %\315 "i 1 %\335 "o 1 %\316 "u 1 %\317 "A 1 %\330 "E 1 %\245 "I 1 %\247 "O 1 %\332 "U 1 %\333 "y 1 %\357 "Y 1 %\356 ~a 1 %\342 ~o 1 %\352 ~n 1 %\267 ~A 1 %\341 ~O 1 %\351 ~N 1 %\266 ~! 1 %\270 ~? 1 %\271 ,c 1 %\265 ,C 1 %\264 /o 1 %\326 /O 1 %\322 ao 1 %\324 Ao 1 %\320 ae 1 %\327 AE 1 %\323 << 1 %\373 >> 1 %\375 -L 1 %\273 =L 1 %\257 =Y 1 %\274 9base-6/troff/term/tab.4500000644000175000017500000000360011402154555014634 0ustar anselmanselm450 bset 0 breset 0177420 Hor 4 Vert 5 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "\0334" twrest "\0334" twnl "\015\n" hlr "\033D" hlf "\033U" flr "\033\n" bdon "" bdoff "" iton "" itoff "" ploton "\0333" plotoff "\0334" up "\033\n" down "\n" right " " left "\b" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 \241c\202(\241 *b 1 \200B\242\302\|\202\342 *g 1 \200)\201/\241 *d 1 \200o\342<\302 *e 1 <\b- *z 1 \200c\201\301,\241\343<\302 *y 1 \200n\202\302|\242\342 *h 1 O\b- *i 1 ,\bi *k 1 k *l 1 \200\\\304\241'\301\241'\345\202 *m 1 \200u\242,\202 *n 1 \241(\203/\242 *c 1 \200c\201\301,\241\343c\241\301`\201\301 *o 1 o *p 1 \341-\303\"\301\"\343 *r 1 \200o\242\302|\342\202 *s 1 \200o\301\202~\341\242 *t 1 \200t\301\202~\243~\201\341 *u 1 u *f 1 o\b/ *x 1 x *q 1 \200/-\302\202'\244'\202\342 *w 1 \241u\203u\242 *A 1 A *B 1 B *G 1 \242|\202\343-\303\202`\242 *D 1 \242/\303-\204-\343\\\242 *E 1 E *Z 1 Z *Y 1 H *H 1 O\b= *I 1 I *K 1 K *L 1 \242/\204\\\242 *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 1 \242[]\204[]\242\343-\303 *R 1 P *S 1 \200>\302-\345-\303 *T 1 T *U 1 Y *F 1 o\b[\b] *X 1 X *Q 1 \200[]-\302\202'\244`\202\342 *W 1 \200O\302\241-\202-\241\342 ts 1 s sr 2 \\/ rn 1 \344_\304 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 \200o\201\301`\241\341`\241\341`\201\301 gr 1 \242\\\343-\204-\303/\242 no 1 \200-\202\341,\301\242 is 1 \200|'\202`\243\306'\241`\202\346 pt 2 oc es 1 O\b/ mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.think0000644000175000017500000000416211402154555015445 0ustar anselmanselmthink bset 0 breset 0 Hor 20 Vert 40 Newline 40 Char 20 Em 20 Halfline 20 Adj 20 twinit "\033N" twrest "" twnl "\n" hlr "\033<" hlf "\033=" flr "" bdon "\016" bdoff "\017" iton "\033&dD" itoff "\033&d@" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 %\374 sq 2 [] ru 1 _ 14 1 %\367 12 1 %\370 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 %\263 dg 1 |\b- fm 1 %\250 ct 1 %\277 rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 %\275 aa 1 %\250 ga 1 %\251 ul 1 _ sl 1 / *a 1 <\ba *b 1 %\336 *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 %\326 *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 %\260\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b%\260 *O 1 O *P 2 %\260\b|%\260\b| *R 1 P *S 1 %\260\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 %\260 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 %\376 cu 1 U ca 3 (^) sb 2 (_\b%\260 sp 2 _\b%\260) ib 2 (%\260\b_\b= ip 2 %\260\b_\b=) if 2 oo pd 1 )\bo gr 1 %\260\bV no 1 - is 1 %\276 pt 2 oc es 1 %\322 mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | __ 1 _ `a 1 %\310 `e 1 %\311 `i 1 %\331 `o 1 %\312 `u 1 %\313 `A 1 %\241 `E 1 %\243 `I 1 %\346 `O 1 %\350 `U 1 %\255 'a 1 %\304 'e 1 %\305 'i 1 %\325 'o 1 %\306 'u 1 %\307 'A 1 %\340 'E 1 %\334 'I 1 %\345 'O 1 %\347 'U 1 %\355 ^a 1 %\300 ^e 1 %\301 ^i 1 %\321 ^o 1 %\302 ^u 1 %\303 ^A 1 %\242 ^E 1 %\244 ^I 1 %\246 ^O 1 %\337 ^U 1 %\256 ^s 1 %\354 ^S 1 %\353 "a 1 %\314 "e 1 %\315 "i 1 %\335 "o 1 %\316 "u 1 %\317 "A 1 %\330 "E 1 %\245 "I 1 %\247 "O 1 %\332 "U 1 %\333 "y 1 %\357 "Y 1 %\356 ~a 1 %\342 ~o 1 %\352 ~n 1 %\267 ~A 1 %\341 ~O 1 %\351 ~N 1 %\266 ~! 1 %\270 ~? 1 %\271 ,c 1 %\265 ,C 1 %\264 /o 1 %\326 /O 1 %\322 ao 1 %\324 Ao 1 %\320 ae 1 %\327 AE 1 %\323 << 1 %\373 >> 1 %\375 -L 1 %\273 =L 1 %\257 =Y 1 %\274 9base-6/troff/term/tab.450-120000644000175000017500000000362711402154555015065 0ustar anselmanselm450-12 bset 0 breset 054 Hor 4 Vert 5 Newline 40 Char 20 Em 20 Halfline 20 Adj 20 twinit "\0334\033\037\013" twrest "\0334\033\037\015" twnl "\015\n" hlr "\033D" hlf "\033U" flr "\033\n" bdon "" bdoff "" iton "" itoff "" ploton "\0333" plotoff "\0334" up "\033\n" down "\n" right " " left "\b" charset em 1 - hy 1 - \- 1 - bu 1 +\bo sq 2 \[] ru 1 _ 14 3 1/4 12 3 1/2 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 \344o\304 dg 1 |\b- fm 1 ' ct 1 c\b/ rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 j\bf aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 \241c\202(\241 *b 1 \200B\242\302\|\202\342 *g 1 \200)\201/\241 *d 1 \200o\342<\302 *e 1 <\b- *z 1 \200c\201\301,\241\343<\302 *y 1 \200n\202\302|\242\342 *h 1 O\b- *i 1 ,\bi *k 1 k *l 1 \200\\\304\241'\301\241'\345\202 *m 1 \200u\242,\202 *n 1 \241(\203/\242 *c 1 \200c\201\301,\241\343c\241\301`\201\301 *o 1 o *p 1 \341-\303\"\301\"\343 *r 1 \200o\242\302|\342\202 *s 1 \200o\301\202~\341\242 *t 1 \200t\301\202~\243~\201\341 *u 1 u *f 1 o\b/ *x 1 x *q 1 \200/-\302\202'\244'\202\342 *w 1 \241u\203u\242 *A 1 A *B 1 B *G 1 \242|\202\343-\303\202`\242 *D 1 \242/\303-\204-\343\\\242 *E 1 E *Z 1 Z *Y 1 H *H 1 O\b= *I 1 I *K 1 K *L 1 \242/\204\\\242 *M 1 M *N 1 N *C 1 _\b-\b~ *O 1 O *P 1 \242[]\204[]\242\343-\303 *R 1 P *S 1 \200>\302-\345-\303 *T 1 T *U 1 Y *F 1 o\b[\b] *X 1 X *Q 1 \200[]-\302\202'\244`\202\342 *W 1 \200O\302\241-\202-\241\342 ts 1 s sr 2 \\/ rn 1 \344_\304 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 +\b_ cu 1 U ca 3 (^) sb 2 (_\b~ sp 2 _\b~) ib 2 (~\b_\b= ip 2 ~\b_\b=) if 2 oo pd 1 \200o\201\301`\241\341`\241\341`\201\301 gr 1 \242\\\343-\204-\303/\242 no 1 \200-\202\341,\301\242 is 1 \200|'\202`\243\306'\241`\202\346 pt 2 oc es 1 O\b/ mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | 9base-6/troff/term/tab.utf0000644000175000017500000000356711402154555015136 0ustar anselmanselmutf bset 0 breset 0 Hor 24 Vert 40 Newline 40 Char 24 Em 24 Halfline 20 Adj 24 twinit "" twrest "" twnl "\n" hlr "" hlf "" flr "\0337" bdon "" bdoff "" iton "" itoff "" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 ∙ sq 1 ∎ ru 1 _ fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl dg 1 † fm 1 ' pl 1 + mi 1 - eq 1 = ** 1 * aa 1 ' ga 1 ` ul 1 _ sl 1 / *a 1 α *b 1 β *g 1 γ *d 1 δ *e 1 ε *z 1 ζ *y 1 η *h 1 θ *i 1 ι *k 1 κ *l 1 λ *n 1 ν *c 1 ξ *o 1 ο *p 1 π *r 1 ρ *s 1 σ *t 1 τ *u 1 υ *f 1 φ *x 1 χ *q 1 ψ *w 1 ω *A 1 Α *B 1 Β *G 1 Γ *D 1 Δ *E 1 Ε *Z 1 Ζ *Y 1 Η *H 1 Θ *I 1 Ι *K 1 Κ *L 1 Λ *M 1 Μ *N 1 Ν *C 1 Ξ *O 1 Ο *P 1 Π *R 1 Ρ *S 1 Σ *T 1 Τ *U 1 Υ *F 1 Φ *X 1 Χ *Q 1 Ψ *W 1 Ω ts 1 s sr 1 √ rn 1 ¯ >= 1 ≧ <= 1 ≦ == 1 ≡ ~= 1 ≃ ap 1 ≈ != 1 ≠ -> 1 → <- 1 ← ua 1 ↑ da 1 ↓ cu 1 ∪ ca 1 ∩ sb 1 ⊂ sp 1 ⊃ ib 1 ⊆ ip 1 ⊇ if 1 ∞ pd 1 ∂ gr 1 ∇ is 1 ∫ pt 1 ∝ es 1 ∅ mo 1 ∊ br 1 | dd 1 ‡ rh 1 ☞ lh 1 ☜ bs 1 O\b L1 1 O\b= ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | !! 1 ¡ c$ 1 ¢ l$ 1 £ g$ 1 ¤ y$ 1 ¥ || 1 ¦ SS 1 § "" 1 ¨ cO 1 © sa 1 ª << 1 « no 1 ¬ -- 1 ­ rO 1 ® __ 1 ¯ so 1 ° de 1 ° +- 1 ± s2 1 ² s3 1 ³ '' 1 ´ *m 1 μ mu 1 × pg 1 ¶ .. 1 · ,, 1 ¸ s1 1 ¹ s0 1 º >> 1 » 14 1 ¼ 12 1 ½ 34 1 ¾ ?? 1 ¿ A` 1 À A' 1 Á A^ 1  A~ 1 à A" 1 Ä Ao 1 Å AE 1 Æ C, 1 Ç E` 1 È E' 1 É E^ 1 Ê E" 1 Ë I` 1 Ì I' 1 Í I^ 1 Î I" 1 Ï D- 1 Ð N~ 1 Ñ O` 1 Ò O' 1 Ó O^ 1 Ô O~ 1 Õ O" 1 Ö xx 1 × O/ 1 Ø U` 1 Ù U' 1 Ú U^ 1 Û U" 1 Ü Y' 1 Ý P| 1 Þ ss 1 ß a` 1 à a' 1 á a^ 1 â a~ 1 ã a" 1 ä ao 1 å ae 1 æ c, 1 ç e` 1 è e' 1 é e^ 1 ê e" 1 ë i` 1 ì i' 1 í i^ 1 î i" 1 ï d- 1 ð n~ 1 ñ o` 1 ò o' 1 ó o^ 1 ô o~ 1 õ o" 1 ö -: 1 ÷ o/ 1 ø u` 1 ù u' 1 ú u^ 1 û u" 1 ü y' 1 ý p| 1 þ y" 1 ÿ 9base-6/troff/term/tab.thinkbold0000644000175000017500000000416611402154555016312 0ustar anselmanselmthinkbold bset 0 breset 0 Hor 20 Vert 40 Newline 40 Char 20 Em 20 Halfline 20 Adj 20 twinit "\033N\016" twrest "\017" twnl "\n" hlr "\033<" hlf "\033=" flr "" bdon "" bdoff "" iton "\033&dD" itoff "\033&d@" ploton "" plotoff "" up "" down "" right "" left "" charset em 1 - hy 1 - \- 1 - bu 1 %\374 sq 2 [] ru 1 _ 14 1 %\367 12 1 %\370 34 3 3/4 fi 2 fi fl 2 fl ff 2 ff Fi 3 ffi Fl 3 ffl de 1 %\263 dg 1 |\b- fm 1 %\250 ct 1 %\277 rg 1 r\bO co 1 c\bO pl 1 + mi 1 - eq 1 = ** 1 * sc 1 %\275 aa 1 %\250 ga 1 %\251 ul 1 _ sl 1 / *a 1 <\ba *b 1 %\336 *g 1 <\by *d 1 <\bo *e 1 -\bc *z 1 ,\bL *y 1 ,\bn *h 1 -\b0 *i 1 ,\bi *k 1 k *l 1 \\\b> *m 1 ,\bu *n 1 ,\bv *c 1 ,\b3 *o 1 o *p 1 -\bn *r 1 p *s 1 -\bo *t 1 ~\bt *u 1 u *f 1 %\326 *x 1 x *q 1 |\bu *w 1 u\bw *A 1 A *B 1 B *G 2 %\260\b|~ *D 2 _\b/_\b\\ *E 1 E *Z 1 Z *Y 1 H *H 1 -\bO *I 1 I *K 1 K *L 2 /\\ *M 1 M *N 1 N *C 1 _\b-\b%\260 *O 1 O *P 2 %\260\b|%\260\b| *R 1 P *S 1 %\260\b_\b> *T 1 T *U 1 Y *F 1 |\bO *X 1 X *Q 1 |\bU *W 2 _\b(_\b) ts 1 s sr 2 \\/ rn 1 %\260 >= 1 _\b> <= 1 _\b< == 1 _\b= ~= 1 ~\b= ap 1 ~ != 1 =\b/ -> 2 -> <- 2 <- ua 1 |\b^ da 1 |\bv mu 1 x di 1 -\b: +- 1 %\376 cu 1 U ca 3 (^) sb 2 (_\b%\260 sp 2 _\b%\260) ib 2 (%\260\b_\b= ip 2 %\260\b_\b=) if 2 oo pd 1 )\bo gr 1 %\260\bV no 1 - is 1 %\276 pt 2 oc es 1 %\322 mo 1 -\bC br 1 | dd 1 |\b= rh 2 => lh 2 <= bs 1 O\bo L1 1 O\b= or 1 | ci 1 O lt 1 ( lb 1 ( rt 1 ) rb 1 ) lk 1 | rk 1 | bv 1 | lf 1 | rf 1 | lc 1 | rc 1 | __ 1 _ `a 1 %\310 `e 1 %\311 `i 1 %\331 `o 1 %\312 `u 1 %\313 `A 1 %\241 `E 1 %\243 `I 1 %\346 `O 1 %\350 `U 1 %\255 'a 1 %\304 'e 1 %\305 'i 1 %\325 'o 1 %\306 'u 1 %\307 'A 1 %\340 'E 1 %\334 'I 1 %\345 'O 1 %\347 'U 1 %\355 ^a 1 %\300 ^e 1 %\301 ^i 1 %\321 ^o 1 %\302 ^u 1 %\303 ^A 1 %\242 ^E 1 %\244 ^I 1 %\246 ^O 1 %\337 ^U 1 %\256 ^s 1 %\354 ^S 1 %\353 "a 1 %\314 "e 1 %\315 "i 1 %\335 "o 1 %\316 "u 1 %\317 "A 1 %\330 "E 1 %\245 "I 1 %\247 "O 1 %\332 "U 1 %\333 "y 1 %\357 "Y 1 %\356 ~a 1 %\342 ~o 1 %\352 ~n 1 %\267 ~A 1 %\341 ~O 1 %\351 ~N 1 %\266 ~! 1 %\270 ~? 1 %\271 ,c 1 %\265 ,C 1 %\264 /o 1 %\326 /O 1 %\322 ao 1 %\324 Ao 1 %\320 ae 1 %\327 AE 1 %\323 << 1 %\373 >> 1 %\375 -L 1 %\273 =L 1 %\257 =Y 1 %\274 9base-6/troff/font/0000755000175000017500000000000011402154555013634 5ustar anselmanselm9base-6/troff/font/devutf/0000755000175000017500000000000011402154555015131 5ustar anselmanselm9base-6/troff/font/devutf/DejaVuCondensedSerif0000644000175000017500000006214511402154555021056 0ustar anselmanselmname DejaVuCondensedSerif fontname DejaVuCondensedSerif spacewidth 29 charset ! 38 2 33 0021 " 44 2 34 0022 dq " dq " # 80 2 35 0023 $ 60 3 36 0024 % 90 2 37 0025 & 85 2 38 0026 ( 37 3 40 0028 ) 37 3 41 0029 * 47 2 42 002a + 80 2 43 002b , 30 1 44 002c - 32 0 45 002d . 30 0 46 002e / 32 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 32 0 58 003a ; 32 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 51 2 63 003f @ 95 3 64 0040 A 69 2 65 0041 B 70 2 66 0042 C 73 2 67 0043 D 76 2 68 0044 E 69 2 69 0045 F 66 2 70 0046 G 76 2 71 0047 H 83 2 72 0048 I 38 2 73 0049 J 37 3 74 004a K 71 2 75 004b L 63 2 76 004c M 97 2 77 004d N 83 2 78 004e O 78 2 79 004f P 64 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 65 2 83 0053 T 63 2 84 0054 U 80 2 85 0055 V 69 2 86 0056 W 98 2 87 0057 X 68 2 88 0058 Y 63 2 89 0059 Z 66 2 90 005a [ 37 3 91 005b \ 32 3 92 005c bs " ] 37 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 57 0 97 0061 b 61 2 98 0062 c 53 0 99 0063 d 61 2 100 0064 e 56 0 101 0065 f 36 2 102 0066 g 61 1 103 0067 h 61 2 104 0068 i 30 2 105 0069 j 28 3 106 006a k 58 2 107 006b l 30 2 108 006c m 90 0 109 006d n 61 0 110 006e o 57 0 111 006f p 61 1 112 0070 q 61 1 113 0071 r 46 0 114 0072 s 49 0 115 0073 t 38 2 116 0074 u 61 0 117 0075 v 54 0 118 0076 w 81 0 119 0077 x 54 0 120 0078 y 54 1 121 0079 z 50 0 122 007a { 60 3 123 007b | 32 3 124 007c } 60 3 125 007d ~ 80 0 126 007e   57 0 160 00a0 ¡ 38 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 32 3 166 00a6 § 47 3 167 00a7 ¨ 47 2 168 00a8 © 95 2 169 00a9 ª 45 2 170 00aa « 58 0 171 00ab ¬ 80 0 172 00ac ­ 32 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 47 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 38 2 178 00b2 ³ 38 2 179 00b3 ´ 48 2 180 00b4 aa " µ 62 1 181 00b5 ¶ 60 3 182 00b6 · 30 0 183 00b7 ¸ 47 1 184 00b8 ¹ 38 2 185 00b9 º 45 2 186 00ba » 58 0 187 00bb ¼ 92 2 188 00bc ½ 92 2 189 00bd ¾ 92 2 190 00be ¿ 51 2 191 00bf À 69 2 192 00c0 Á 69 2 193 00c1  69 2 194 00c2 à 69 2 195 00c3 Ä 69 2 196 00c4 Å 69 2 197 00c5 Æ 95 2 198 00c6 Ç 73 3 199 00c7 È 69 2 200 00c8 É 69 2 201 00c9 Ê 69 2 202 00ca Ë 69 2 203 00cb Ì 38 2 204 00cc Í 38 2 205 00cd Î 38 2 206 00ce Ï 38 2 207 00cf Ð 77 2 208 00d0 Ñ 83 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 80 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 80 2 217 00d9 Ú 80 2 218 00da Û 80 2 219 00db Ü 80 2 220 00dc Ý 63 2 221 00dd Þ 64 2 222 00de ß 63 2 223 00df à 57 2 224 00e0 á 57 2 225 00e1 â 57 2 226 00e2 ã 57 2 227 00e3 ä 57 2 228 00e4 å 57 2 229 00e5 æ 89 0 230 00e6 ç 53 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 30 2 236 00ec í 31 2 237 00ed î 30 2 238 00ee ï 30 2 239 00ef ð 57 2 240 00f0 ñ 61 2 241 00f1 ò 57 2 242 00f2 ó 57 2 243 00f3 ô 57 2 244 00f4 õ 57 2 245 00f5 ö 57 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 57 0 248 00f8 ù 61 2 249 00f9 ú 61 2 250 00fa û 61 2 251 00fb ü 61 2 252 00fc ý 54 3 253 00fd þ 61 3 254 00fe ÿ 54 3 255 00ff ā 57 2 257 0101 Ă 69 2 258 0102 ă 57 2 259 0103 Ą 69 3 260 0104 ą 57 1 261 0105 Ć 73 2 262 0106 ć 53 2 263 0107 Ĉ 73 2 264 0108 ĉ 53 2 265 0109 Ċ 73 2 266 010a ċ 53 2 267 010b Č 73 2 268 010c č 53 2 269 010d Ď 76 2 270 010e ď 62 2 271 010f Đ 77 2 272 0110 đ 61 2 273 0111 Ē 69 2 274 0112 ē 56 2 275 0113 Ĕ 69 2 276 0114 ĕ 56 2 277 0115 Ė 69 2 278 0116 ė 56 2 279 0117 Ę 69 3 280 0118 ę 56 1 281 0119 Ě 69 2 282 011a ě 56 2 283 011b Ĝ 76 2 284 011c ĝ 61 3 285 011d Ğ 76 2 286 011e ğ 61 3 287 011f Ġ 76 2 288 0120 ġ 61 3 289 0121 Ģ 76 3 290 0122 ģ 61 3 291 0123 Ĥ 83 2 292 0124 ĥ 61 2 293 0125 Ħ 83 2 294 0126 ħ 61 2 295 0127 Ĩ 38 2 296 0128 ĩ 30 2 297 0129 Ī 38 2 298 012a ī 30 2 299 012b Ĭ 38 2 300 012c ĭ 30 2 301 012d Į 38 3 302 012e į 30 3 303 012f İ 38 2 304 0130 ı 30 0 305 0131 IJ 76 3 306 0132 ij 51 3 307 0133 Ĵ 38 3 308 0134 ĵ 29 3 309 0135 Ķ 71 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 63 2 313 0139 ĺ 30 2 314 013a Ļ 63 3 315 013b ļ 30 3 316 013c Ľ 63 2 317 013d ľ 38 2 318 013e Ŀ 64 2 319 013f ŀ 44 2 320 0140 Ł 64 2 321 0141 ł 31 2 322 0142 Ń 83 2 323 0143 ń 61 2 324 0144 Ņ 83 3 325 0145 ņ 61 1 326 0146 Ň 83 2 327 0147 ň 61 2 328 0148 ʼn 82 2 329 0149 Ŋ 83 3 330 014a ŋ 61 1 331 014b Ō 78 2 332 014c ō 57 2 333 014d Ŏ 78 2 334 014e ŏ 57 2 335 014f Ő 78 2 336 0150 ő 57 2 337 0151 Œ 108 2 338 0152 œ 94 0 339 0153 Ŕ 72 2 340 0154 ŕ 46 2 341 0155 Ŗ 72 3 342 0156 ŗ 46 1 343 0157 Ř 72 2 344 0158 ř 46 2 345 0159 Ś 65 2 346 015a ś 49 2 347 015b Ŝ 65 2 348 015c ŝ 49 2 349 015d Ş 65 3 350 015e ş 49 1 351 015f Š 65 2 352 0160 š 49 2 353 0161 Ţ 63 3 354 0162 ţ 38 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 38 2 359 0167 Ũ 80 2 360 0168 ũ 61 2 361 0169 Ū 80 2 362 016a ū 61 2 363 016b Ŭ 80 2 364 016c ŭ 61 2 365 016d Ů 80 2 366 016e ů 61 2 367 016f Ű 80 2 368 0170 ű 61 2 369 0171 Ų 80 3 370 0172 ų 61 1 371 0173 Ŵ 98 2 372 0174 ŵ 81 2 373 0175 Ŷ 63 2 374 0176 ŷ 54 3 375 0177 Ÿ 63 2 376 0178 Ź 66 2 377 0179 ź 50 2 378 017a Ż 66 2 379 017b ż 50 2 380 017c Ž 66 2 381 017d ž 50 2 382 017e ſ 36 2 383 017f Ɓ 69 2 385 0181 Ƃ 70 2 386 0182 ƃ 61 2 387 0183 Ƅ 70 2 388 0184 ƅ 61 2 389 0185 Ɔ 73 2 390 0186 Ƈ 74 2 391 0187 ƈ 54 2 392 0188 Ɖ 77 2 393 0189 Ɗ 75 2 394 018a Ƌ 70 2 395 018b ƌ 61 2 396 018c ƍ 57 1 397 018d Ǝ 69 2 398 018e Ə 78 2 399 018f Ɛ 60 2 400 0190 Ƒ 65 3 401 0191 ƒ 60 3 402 0192 Ɠ 77 2 403 0193 Ɣ 67 3 404 0194 ƕ 88 2 405 0195 Ɩ 38 2 406 0196 Ɨ 38 2 407 0197 Ƙ 72 2 408 0198 ƙ 58 2 409 0199 ƚ 30 2 410 019a ƛ 60 2 411 019b Ɯ 90 2 412 019c Ɲ 82 3 413 019d ƞ 61 1 414 019e Ɵ 78 2 415 019f Ơ 79 2 416 01a0 ơ 58 0 417 01a1 Ƣ 99 3 418 01a2 ƣ 77 1 419 01a3 Ƥ 63 2 420 01a4 ƥ 61 3 421 01a5 Ʀ 68 3 422 01a6 Ƨ 65 2 423 01a7 ƨ 49 0 424 01a8 Ʃ 67 2 425 01a9 ƪ 31 3 426 01aa ƫ 38 3 427 01ab Ƭ 64 2 428 01ac ƭ 38 2 429 01ad Ʈ 63 3 430 01ae Ư 81 2 431 01af ư 62 0 432 01b0 Ʊ 79 2 433 01b1 Ʋ 72 2 434 01b2 Ƴ 70 2 435 01b3 ƴ 71 1 436 01b4 Ƶ 66 2 437 01b5 ƶ 50 0 438 01b6 Ʒ 54 2 439 01b7 Ƹ 54 2 440 01b8 ƹ 54 1 441 01b9 ƻ 60 2 443 01bb Ƽ 65 2 444 01bc ƽ 54 1 445 01bd ƾ 51 2 446 01be ǀ 28 2 448 01c0 ǁ 47 2 449 01c1 ǂ 44 2 450 01c2 ǃ 30 2 451 01c3 Ǎ 69 2 461 01cd ǎ 57 2 462 01ce Ǐ 38 2 463 01cf ǐ 30 2 464 01d0 Ǒ 78 2 465 01d1 ǒ 57 2 466 01d2 Ǔ 80 2 467 01d3 ǔ 61 2 468 01d4 ǖ 61 2 470 01d6 Ǘ 82 2 471 01d7 ǘ 63 2 472 01d8 Ǚ 82 2 473 01d9 ǚ 63 2 474 01da Ǜ 81 2 475 01db ǜ 62 2 476 01dc ǝ 56 0 477 01dd ǟ 57 2 479 01df Ǣ 95 2 482 01e2 ǣ 89 2 483 01e3 Ǫ 78 3 490 01ea ǫ 57 1 491 01eb Ǭ 78 3 492 01ec ǭ 57 3 493 01ed Ƕ 110 2 502 01f6 Ș 65 3 536 0218 ș 49 1 537 0219 Ț 63 3 538 021a ț 38 3 539 021b Ȥ 66 3 548 0224 ȥ 50 1 549 0225 ȫ 57 2 555 022b ȭ 57 2 557 022d Ȯ 78 2 558 022e ȯ 57 2 559 022f ȱ 57 2 561 0231 Ȳ 63 2 562 0232 ȳ 54 3 563 0233 ȷ 28 1 567 0237 ȸ 91 2 568 0238 ȹ 91 1 569 0239 Ⱥ 69 2 570 023a Ȼ 73 2 571 023b ȼ 53 0 572 023c Ƚ 63 2 573 023d Ⱦ 63 2 574 023e ȿ 49 1 575 023f ɀ 50 1 576 0240 Ɂ 55 2 577 0241 ɐ 57 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 61 2 595 0253 ɔ 53 0 596 0254 ɕ 53 1 597 0255 ɖ 62 3 598 0256 ɗ 65 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 81 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 74 0 605 025d ɞ 58 0 606 025e ɟ 29 1 607 025f ɠ 65 3 608 0260 ɡ 61 1 609 0261 ɢ 52 0 610 0262 ɣ 67 1 611 0263 ɤ 54 0 612 0264 ɥ 61 1 613 0265 ɦ 61 2 614 0266 ɧ 61 3 615 0267 ɨ 30 2 616 0268 ɩ 37 0 617 0269 ɪ 30 0 618 026a ɫ 36 2 619 026b ɬ 43 2 620 026c ɭ 35 3 621 026d ɮ 61 3 622 026e ɯ 90 0 623 026f ɰ 90 1 624 0270 ɱ 90 1 625 0271 ɲ 60 1 626 0272 ɳ 66 1 627 0273 ɴ 61 0 628 0274 ɵ 57 0 629 0275 ɶ 75 0 630 0276 ɷ 62 0 631 0277 ɸ 57 3 632 0278 ɹ 48 0 633 0279 ɺ 48 2 634 027a ɻ 53 1 635 027b ɼ 46 1 636 027c ɽ 46 1 637 027d ɾ 43 0 638 027e ɿ 43 0 639 027f ʀ 56 0 640 0280 ʁ 56 0 641 0281 ʂ 49 1 642 0282 ʃ 26 3 643 0283 ʄ 35 3 644 0284 ʅ 46 1 645 0285 ʆ 31 3 646 0286 ʇ 38 1 647 0287 ʈ 38 3 648 0288 ʉ 61 0 649 0289 ʊ 59 0 650 028a ʋ 58 0 651 028b ʌ 54 0 652 028c ʍ 81 0 653 028d ʎ 54 2 654 028e ʏ 62 0 655 028f ʐ 57 1 656 0290 ʑ 53 1 657 0291 ʒ 54 1 658 0292 ʓ 53 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 48 3 663 0297 ʘ 67 0 664 0298 ʙ 52 0 665 0299 ʚ 58 0 666 029a ʛ 63 2 667 029b ʜ 61 0 668 029c ʝ 34 3 669 029d ʞ 58 1 670 029e ʟ 61 0 671 029f ʠ 65 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 95 2 675 02a3 ʤ 98 3 676 02a4 ʥ 95 3 677 02a5 ʦ 77 2 678 02a6 ʧ 57 3 679 02a7 ʨ 74 3 680 02a8 ʩ 85 3 681 02a9 ʪ 61 2 682 02aa ʫ 64 2 683 02ab ʬ 57 2 684 02ac ʭ 42 2 685 02ad ʮ 74 3 686 02ae ʯ 73 3 687 02af ʰ 41 2 688 02b0 ʱ 41 2 689 02b1 ʲ 25 2 690 02b2 ʳ 33 2 691 02b3 ʴ 33 2 692 02b4 ʵ 41 2 693 02b5 ʶ 37 2 694 02b6 ʷ 55 2 695 02b7 ʸ 40 2 696 02b8 ʻ 30 2 699 02bb ʼ 30 2 700 02bc ʾ 29 2 702 02be ʿ 29 2 703 02bf ˀ 26 2 704 02c0 ˁ 27 2 705 02c1 ˆ 47 2 710 02c6 ˇ 47 2 711 02c7 ˈ 26 2 712 02c8 ˌ 26 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 35 2 722 02d2 ˓ 29 0 723 02d3 ˖ 31 0 726 02d6 ˘ 47 2 728 02d8 ˙ 47 2 729 02d9 ˚ 47 2 730 02da ˛ 48 1 731 02db ˜ 47 2 732 02dc ˝ 48 2 733 02dd ˞ 40 0 734 02de ˠ 42 2 736 02e0 ˡ 23 2 737 02e1 ˢ 32 2 738 02e2 ˣ 40 2 739 02e3 ˤ 27 2 740 02e4 ˥ 57 2 741 02e5 ˦ 57 2 742 02e6 ˧ 57 2 743 02e7 ˨ 57 2 744 02e8 ˩ 57 2 745 02e9 ́ 57 2 769 0301 ̂ 57 2 770 0302 ̃ 57 2 771 0303 ̄ 57 2 772 0304 ̅ 0 2 773 0305 ̆ 57 2 774 0306 ̇ 57 2 775 0307 ̈ 57 2 776 0308 ̉ 0 2 777 0309 ̊ 57 2 778 030a ̋ 57 2 779 030b ̌ 57 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 30 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 62 1 801 0321 ̢ 48 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 26 2 884 0374 ͵ 26 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 48 2 900 0384 ΅ 48 2 901 0385 Ά 69 2 902 0386 · 30 0 903 0387 Έ 85 2 904 0388 Ή 98 2 905 0389 Ί 53 2 906 038a Ό 79 2 908 038c Ύ 85 2 910 038e Ώ 81 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 70 2 914 0392 Γ 66 2 915 0393 Δ 69 2 916 0394 Ε 69 2 917 0395 Ζ 66 2 918 0396 Η 83 2 919 0397 Θ 78 2 920 0398 Ι 38 2 921 0399 Κ 71 2 922 039a Λ 69 2 923 039b Μ 97 2 924 039c Ν 83 2 925 039d Ξ 67 2 926 039e Ο 78 2 927 039f Π 83 2 928 03a0 Ρ 64 2 929 03a1 Σ 67 2 931 03a3 Τ 63 2 932 03a4 Υ 63 2 933 03a5 Φ 78 2 934 03a6 Χ 68 2 935 03a7 Ψ 83 2 936 03a8 Ω 79 2 937 03a9 Ϊ 38 2 938 03aa Ϋ 63 2 939 03ab ά 64 2 940 03ac έ 51 2 941 03ad ή 57 3 942 03ae ί 37 2 943 03af ΰ 58 2 944 03b0 α 64 0 945 03b1 β 55 3 946 03b2 γ 57 1 947 03b3 δ 57 2 948 03b4 ε 51 0 949 03b5 ζ 51 3 950 03b6 η 57 1 951 03b7 θ 57 2 952 03b8 ι 37 0 953 03b9 κ 62 0 954 03ba λ 60 2 955 03bb μ 62 1 956 03bc ν 58 0 957 03bd ξ 52 3 958 03be ο 57 0 959 03bf π 62 0 960 03c0 ρ 56 1 961 03c1 ς 53 1 962 03c2 σ 65 0 963 03c3 τ 53 0 964 03c4 υ 58 0 965 03c5 φ 67 1 966 03c6 χ 57 1 967 03c7 ψ 74 1 968 03c8 ω 77 0 969 03c9 ϊ 37 2 970 03ca ϋ 58 2 971 03cb ό 57 2 972 03cc ύ 58 2 973 03cd ώ 77 2 974 03ce ϐ 55 2 976 03d0 ϑ 68 2 977 03d1 ϒ 65 2 978 03d2 ϓ 83 2 979 03d3 ϔ 67 2 980 03d4 ϕ 65 3 981 03d5 ϖ 77 0 982 03d6 ϗ 59 1 983 03d7 Ϙ 78 3 984 03d8 ϙ 57 1 985 03d9 Ϛ 73 3 986 03da ϛ 53 3 987 03db Ϝ 66 2 988 03dc ϝ 43 3 989 03dd Ϟ 56 2 990 03de ϟ 63 2 991 03df Ϡ 74 3 992 03e0 ϡ 55 1 993 03e1 ϰ 59 0 1008 03f0 ϱ 56 1 1009 03f1 ϲ 53 0 1010 03f2 ϳ 28 3 1011 03f3 ϴ 78 2 1012 03f4 ϵ 53 0 1013 03f5 ϶ 53 0 1014 03f6 Ϸ 64 2 1015 03f7 ϸ 61 3 1016 03f8 Ϲ 73 2 1017 03f9 Ϻ 97 2 1018 03fa ϻ 67 1 1019 03fb ϼ 56 1 1020 03fc Ͻ 73 2 1021 03fd Ͼ 73 2 1022 03fe Ͽ 73 2 1023 03ff Ё 67 2 1025 0401 Ђ 75 3 1026 0402 Ѓ 68 2 1027 0403 Є 73 2 1028 0404 Ѕ 65 2 1029 0405 І 38 2 1030 0406 Ї 38 2 1031 0407 Ј 37 3 1032 0408 Љ 101 2 1033 0409 Њ 106 2 1034 040a Ћ 82 2 1035 040b Ќ 78 2 1036 040c Ѝ 86 2 1037 040d Ў 73 2 1038 040e Џ 83 3 1039 040f А 69 2 1040 0410 Б 70 2 1041 0411 В 70 2 1042 0412 Г 66 2 1043 0413 Д 83 3 1044 0414 Е 69 2 1045 0415 Ж 105 2 1046 0416 З 60 2 1047 0417 И 83 2 1048 0418 Й 83 2 1049 0419 К 71 2 1050 041a Л 82 2 1051 041b М 97 2 1052 041c Н 83 2 1053 041d О 78 2 1054 041e П 83 2 1055 041f Р 64 2 1056 0420 С 73 2 1057 0421 Т 63 2 1058 0422 У 71 2 1059 0423 Ф 93 3 1060 0424 Х 68 2 1061 0425 Ц 83 3 1062 0426 Ч 71 2 1063 0427 Ш 97 2 1064 0428 Щ 100 3 1065 0429 Ъ 72 2 1066 042a Ы 99 2 1067 042b Ь 66 2 1068 042c Э 73 2 1069 042d Ю 113 2 1070 042e Я 80 2 1071 042f а 57 0 1072 0430 б 57 2 1073 0431 в 53 0 1074 0432 г 51 0 1075 0433 д 65 1 1076 0434 е 56 0 1077 0435 ж 81 0 1078 0436 з 51 0 1079 0437 и 63 0 1080 0438 й 63 2 1081 0439 к 58 0 1082 043a л 59 0 1083 043b м 80 0 1084 043c н 63 0 1085 043d о 57 0 1086 043e п 63 0 1087 043f р 61 1 1088 0440 с 53 0 1089 0441 т 53 0 1090 0442 у 54 1 1091 0443 ф 70 3 1092 0444 х 54 0 1093 0445 ц 66 1 1094 0446 ч 63 0 1095 0447 ш 81 0 1096 0448 щ 86 1 1097 0449 ъ 52 0 1098 044a ы 70 0 1099 044b ь 47 0 1100 044c э 53 0 1101 044d ю 83 0 1102 044e я 61 0 1103 044f ѐ 56 2 1104 0450 ё 56 2 1105 0451 ђ 59 3 1106 0452 ѓ 51 2 1107 0453 є 53 0 1108 0454 ѕ 49 0 1109 0455 і 30 2 1110 0456 ї 30 2 1111 0457 ј 28 3 1112 0458 љ 74 0 1113 0459 њ 76 0 1114 045a ћ 61 2 1115 045b ќ 58 2 1116 045c ѝ 63 2 1117 045d ў 54 3 1118 045e џ 62 1 1119 045f Ґ 66 2 1168 0490 ґ 51 2 1169 0491 Ғ 66 2 1170 0492 ғ 51 0 1171 0493 Қ 71 3 1178 049a қ 58 1 1179 049b Ҳ 68 3 1202 04b2 ҳ 54 1 1203 04b3 Ӑ 69 2 1232 04d0 ӑ 57 2 1233 04d1 Ӓ 70 2 1234 04d2 ӓ 57 2 1235 04d3 Ӕ 95 2 1236 04d4 ӕ 89 0 1237 04d5 Ӗ 71 2 1238 04d6 ӗ 56 2 1239 04d7 Ӡ 54 2 1248 04e0 ӡ 54 1 1249 04e1 Ӧ 79 2 1254 04e6 ӧ 57 2 1255 04e7 Ө 78 2 1256 04e8 ө 57 0 1257 04e9 Ӫ 80 2 1258 04ea ӫ 57 2 1259 04eb ᴂ 89 0 7426 1d02 ᴈ 48 0 7432 1d08 ᴉ 30 1 7433 1d09 ᴔ 94 0 7444 1d14 ᴖ 57 0 7446 1d16 ᴗ 57 0 7447 1d17 ᴝ 70 0 7453 1d1d ᴞ 90 0 7454 1d1e ᴟ 90 3 7455 1d1f ᵃ 37 2 7491 1d43 ᵄ 24 2 7492 1d44 ᵅ 38 2 7493 1d45 ᵆ 59 2 7494 1d46 ᵇ 38 2 7495 1d47 ᵈ 38 2 7496 1d48 ᵉ 37 2 7497 1d49 ᵊ 37 2 7498 1d4a ᵋ 32 2 7499 1d4b ᵌ 32 2 7500 1d4c ᵍ 38 2 7501 1d4d ᵎ 17 2 7502 1d4e ᵏ 35 2 7503 1d4f ᵐ 58 2 7504 1d50 ᵑ 38 2 7505 1d51 ᵒ 37 2 7506 1d52 ᵓ 33 2 7507 1d53 ᵔ 37 2 7508 1d54 ᵕ 37 0 7509 1d55 ᵖ 38 2 7510 1d56 ᵗ 23 2 7511 1d57 ᵘ 38 2 7512 1d58 ᵙ 44 2 7513 1d59 ᵚ 58 2 7514 1d5a ᵛ 35 2 7515 1d5b ᵷ 61 1 7543 1d77 ᵻ 35 0 7547 1d7b ᶅ 30 3 7557 1d85 ᶛ 38 2 7579 1d9b ᶜ 33 2 7580 1d9c ᶝ 33 2 7581 1d9d ᶞ 37 2 7582 1d9e ᶟ 32 2 7583 1d9f ᶠ 21 2 7584 1da0 ᶡ 21 2 7585 1da1 ᶢ 38 2 7586 1da2 ᶣ 38 2 7587 1da3 ᶤ 22 2 7588 1da4 ᶥ 23 2 7589 1da5 ᶦ 22 2 7590 1da6 ᶧ 22 2 7591 1da7 ᶨ 21 2 7592 1da8 ᶩ 17 2 7593 1da9 ᶪ 17 2 7594 1daa ᶫ 35 2 7595 1dab ᶬ 58 2 7596 1dac ᶭ 58 2 7597 1dad ᶮ 38 2 7598 1dae ᶯ 39 2 7599 1daf ᶰ 38 2 7600 1db0 ᶱ 37 2 7601 1db1 ᶲ 37 2 7602 1db2 ᶳ 31 2 7603 1db3 ᶴ 20 2 7604 1db4 ᶵ 23 2 7605 1db5 ᶶ 38 2 7606 1db6 ᶷ 37 2 7607 1db7 ᶹ 36 2 7609 1db9 ᶺ 35 2 7610 1dba ᶻ 31 2 7611 1dbb ᶼ 32 2 7612 1dbc ᶽ 31 2 7613 1dbd ᶾ 35 2 7614 1dbe ᶿ 37 2 7615 1dbf Ḍ 76 3 7692 1e0c ḍ 61 3 7693 1e0d Ḓ 76 3 7698 1e12 ḓ 61 3 7699 1e13 Ḥ 83 3 7716 1e24 ḥ 61 3 7717 1e25 Ḷ 63 3 7734 1e36 ḷ 30 3 7735 1e37 Ḹ 63 3 7736 1e38 ḹ 30 3 7737 1e39 Ḽ 63 3 7740 1e3c ḽ 30 3 7741 1e3d ṁ 90 2 7745 1e41 Ṃ 97 3 7746 1e42 ṃ 90 1 7747 1e43 Ṅ 83 2 7748 1e44 ṅ 61 2 7749 1e45 Ṇ 83 3 7750 1e46 ṇ 61 1 7751 1e47 Ṋ 83 3 7754 1e4a ṋ 61 1 7755 1e4b ṗ 61 3 7767 1e57 Ṛ 72 3 7770 1e5a ṛ 46 1 7771 1e5b Ṝ 72 3 7772 1e5c ṝ 46 3 7773 1e5d ṡ 49 2 7777 1e61 Ṣ 65 3 7778 1e62 ṣ 49 1 7779 1e63 Ṭ 63 3 7788 1e6c ṭ 38 3 7789 1e6d Ṱ 63 3 7792 1e70 ṱ 38 3 7793 1e71 Ṿ 69 3 7806 1e7e ṿ 54 1 7807 1e7f Ẁ 98 2 7808 1e80 ẁ 81 2 7809 1e81 Ẃ 98 2 7810 1e82 ẃ 81 2 7811 1e83 Ẅ 98 2 7812 1e84 ẅ 81 2 7813 1e85 Ẹ 69 3 7864 1eb8 ẹ 56 1 7865 1eb9 Ị 38 3 7882 1eca ị 30 3 7883 1ecb Ọ 78 3 7884 1ecc ọ 57 1 7885 1ecd Ụ 80 3 7908 1ee4 ụ 61 1 7909 1ee5 Ỳ 63 2 7922 1ef2 ỳ 54 3 7923 1ef3 ἁ 64 2 7937 1f01 ἂ 64 2 7938 1f02 ἃ 64 2 7939 1f03 ἄ 64 2 7940 1f04 ἅ 64 2 7941 1f05 ἆ 64 2 7942 1f06 ἇ 64 2 7943 1f07 Ἀ 69 2 7944 1f08 Ἁ 69 2 7945 1f09 Ἂ 82 2 7946 1f0a Ἃ 82 2 7947 1f0b Ἄ 70 2 7948 1f0c Ἅ 72 2 7949 1f0d Ἆ 69 2 7950 1f0e Ἇ 69 2 7951 1f0f ἐ 51 2 7952 1f10 ἑ 51 2 7953 1f11 ἒ 51 2 7954 1f12 ἓ 51 2 7955 1f13 ἔ 51 2 7956 1f14 ἕ 51 2 7957 1f15 Ἐ 81 2 7960 1f18 Ἑ 79 2 7961 1f19 Ἒ 101 2 7962 1f1a Ἓ 102 2 7963 1f1b Ἔ 95 2 7964 1f1c Ἕ 98 2 7965 1f1d ἠ 57 3 7968 1f20 ἡ 57 3 7969 1f21 ἢ 57 3 7970 1f22 ἣ 57 3 7971 1f23 ἤ 57 3 7972 1f24 ἥ 57 3 7973 1f25 ἦ 57 3 7974 1f26 ἧ 57 3 7975 1f27 Ἠ 94 2 7976 1f28 Ἡ 94 2 7977 1f29 Ἢ 115 2 7978 1f2a Ἣ 116 2 7979 1f2b Ἤ 110 2 7980 1f2c Ἥ 112 2 7981 1f2d Ἦ 104 2 7982 1f2e Ἧ 104 2 7983 1f2f ἰ 37 2 7984 1f30 ἱ 37 2 7985 1f31 ἲ 37 2 7986 1f32 ἳ 37 2 7987 1f33 ἴ 37 2 7988 1f34 ἵ 37 2 7989 1f35 ἶ 37 2 7990 1f36 ἷ 37 2 7991 1f37 Ἰ 49 2 7992 1f38 Ἱ 48 2 7993 1f39 Ἲ 69 2 7994 1f3a Ἳ 70 2 7995 1f3b Ἴ 64 2 7996 1f3c Ἵ 67 2 7997 1f3d Ἶ 59 2 7998 1f3e Ἷ 58 2 7999 1f3f ὀ 57 2 8000 1f40 ὁ 57 2 8001 1f41 ὂ 57 2 8002 1f42 ὃ 57 2 8003 1f43 ὄ 57 2 8004 1f44 ὅ 57 2 8005 1f45 Ὀ 77 2 8008 1f48 Ὁ 81 2 8009 1f49 Ὂ 106 2 8010 1f4a Ὃ 107 2 8011 1f4b Ὄ 89 2 8012 1f4c Ὅ 91 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 58 2 8020 1f54 ὕ 58 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 81 2 8025 1f59 Ὓ 102 2 8027 1f5b Ὕ 99 2 8029 1f5d Ὗ 91 2 8031 1f5f ὠ 77 2 8032 1f60 ὡ 77 2 8033 1f61 ὢ 77 2 8034 1f62 ὣ 77 2 8035 1f63 ὤ 77 2 8036 1f64 ὥ 77 2 8037 1f65 ὦ 77 2 8038 1f66 ὧ 77 2 8039 1f67 Ὠ 78 2 8040 1f68 Ὡ 82 2 8041 1f69 Ὢ 107 2 8042 1f6a Ὣ 108 2 8043 1f6b Ὤ 89 2 8044 1f6c Ὥ 92 2 8045 1f6d Ὦ 89 2 8046 1f6e Ὧ 92 2 8047 1f6f ὰ 64 2 8048 1f70 ά 64 2 8049 1f71 ὲ 51 2 8050 1f72 έ 51 2 8051 1f73 ὴ 57 3 8052 1f74 ή 57 3 8053 1f75 ὶ 37 2 8054 1f76 ί 37 2 8055 1f77 ὸ 57 2 8056 1f78 ό 57 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 77 2 8060 1f7c ώ 77 2 8061 1f7d ᾀ 64 3 8064 1f80 ᾁ 64 3 8065 1f81 ᾂ 64 3 8066 1f82 ᾃ 64 3 8067 1f83 ᾄ 64 3 8068 1f84 ᾅ 64 3 8069 1f85 ᾆ 64 3 8070 1f86 ᾇ 64 3 8071 1f87 ᾈ 69 3 8072 1f88 ᾉ 69 3 8073 1f89 ᾊ 82 3 8074 1f8a ᾋ 82 3 8075 1f8b ᾌ 69 3 8076 1f8c ᾍ 72 3 8077 1f8d ᾎ 69 3 8078 1f8e ᾏ 69 3 8079 1f8f ᾐ 57 3 8080 1f90 ᾑ 57 3 8081 1f91 ᾒ 57 3 8082 1f92 ᾓ 57 3 8083 1f93 ᾔ 57 3 8084 1f94 ᾕ 57 3 8085 1f95 ᾖ 57 3 8086 1f96 ᾗ 57 3 8087 1f97 ᾘ 94 3 8088 1f98 ᾙ 94 3 8089 1f99 ᾚ 114 3 8090 1f9a ᾛ 116 3 8091 1f9b ᾜ 109 3 8092 1f9c ᾝ 112 3 8093 1f9d ᾞ 104 3 8094 1f9e ᾟ 103 3 8095 1f9f ᾠ 77 3 8096 1fa0 ᾡ 77 3 8097 1fa1 ᾢ 77 3 8098 1fa2 ᾣ 77 3 8099 1fa3 ᾤ 77 3 8100 1fa4 ᾥ 77 3 8101 1fa5 ᾦ 77 3 8102 1fa6 ᾧ 77 3 8103 1fa7 ᾨ 78 3 8104 1fa8 ᾩ 82 3 8105 1fa9 ᾪ 107 3 8106 1faa ᾫ 107 3 8107 1fab ᾬ 89 3 8108 1fac ᾭ 92 3 8109 1fad ᾮ 89 3 8110 1fae ᾯ 92 3 8111 1faf ᾰ 64 2 8112 1fb0 ᾱ 64 2 8113 1fb1 ᾲ 64 3 8114 1fb2 ᾳ 64 1 8115 1fb3 ᾴ 64 3 8116 1fb4 ᾶ 64 2 8118 1fb6 ᾷ 64 3 8119 1fb7 Ᾰ 69 2 8120 1fb8 Ᾱ 69 2 8121 1fb9 Ὰ 69 2 8122 1fba Ά 69 2 8123 1fbb ᾼ 69 3 8124 1fbc ᾽ 48 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 48 2 8127 1fbf ῀ 47 2 8128 1fc0 ῁ 47 2 8129 1fc1 ῂ 57 3 8130 1fc2 ῃ 57 1 8131 1fc3 ῄ 57 3 8132 1fc4 ῆ 57 3 8134 1fc6 ῇ 57 3 8135 1fc7 Ὲ 86 2 8136 1fc8 Έ 85 2 8137 1fc9 Ὴ 101 2 8138 1fca Ή 98 2 8139 1fcb ῌ 83 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 47 2 8143 1fcf ῐ 37 2 8144 1fd0 ῑ 37 2 8145 1fd1 ῒ 37 2 8146 1fd2 ΐ 37 2 8147 1fd3 ῖ 37 2 8150 1fd6 ῗ 37 2 8151 1fd7 Ῐ 40 2 8152 1fd8 Ῑ 38 2 8153 1fd9 Ὶ 56 2 8154 1fda Ί 53 2 8155 1fdb ῝ 47 2 8157 1fdd ῞ 47 2 8158 1fde ῟ 47 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 56 3 8164 1fe4 ῥ 56 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 63 2 8168 1fe8 Ῡ 63 2 8169 1fe9 Ὺ 87 2 8170 1fea Ύ 85 2 8171 1feb Ῥ 75 2 8172 1fec ῭ 47 2 8173 1fed ΅ 48 2 8174 1fee ` 47 2 8175 1fef ῲ 77 3 8178 1ff2 ῳ 77 1 8179 1ff3 ῴ 77 3 8180 1ff4 ῶ 77 2 8182 1ff6 ῷ 77 3 8183 1ff7 Ὸ 91 2 8184 1ff8 Ό 79 2 8185 1ff9 Ὼ 93 2 8186 1ffa Ώ 80 2 8187 1ffb ῼ 79 3 8188 1ffc ´ 48 2 8189 1ffd ῾ 48 2 8190 1ffe ‐ 32 0 8208 2010 ‑ 32 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 30 2 8216 2018 ` " ‘ " ’ 30 2 8217 2019 ' " ’ " ‚ 30 1 8218 201a ‛ 30 2 8219 201b “ 49 2 8220 201c ” 48 2 8221 201d „ 49 1 8222 201e ‟ 48 2 8223 201f † 47 3 8224 2020 ‡ 47 3 8225 2021 • 56 0 8226 2022 ‣ 56 0 8227 2023 … 95 0 8230 2026 ‰ 127 2 8240 2030 ‱ 165 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 50 2 8252 203c ‾ 47 2 8254 203e ⁇ 93 2 8263 2047 ⁈ 72 2 8264 2048 ⁉ 71 2 8265 2049 ⁰ 38 2 8304 2070 ⁴ 38 2 8308 2074 ⁵ 38 2 8309 2075 ⁶ 38 2 8310 2076 ⁷ 38 2 8311 2077 ⁸ 38 2 8312 2078 ⁹ 38 2 8313 2079 ⁿ 41 2 8319 207f ₦ 63 2 8358 20a6 € 60 2 8364 20ac ₵ 60 3 8373 20b5 № 122 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 79 2 8486 2126 K 71 2 8490 212a Å 69 2 8491 212b ∂ 49 2 8706 2202 pd " ∆ 66 2 8710 2206 ∇ 66 2 8711 2207 gr " ∏ 76 3 8719 220f ∑ 68 3 8721 2211 − 80 0 8722 2212 ∕ 16 2 8725 2215 ∙ 30 0 8729 2219 bu " √ 61 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 70 0 8743 2227 l∧ 70 0 8743 2227 " ∨ 70 0 8744 2228 l| " ∩ 70 0 8745 2229 ca " ∪ 70 0 8746 222a cu " ∫ 49 3 8747 222b is " ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 73 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 49 2 8977 2311 ⌘ 95 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 50 3 8992 2320 ⌡ 48 3 8993 2321 ⌥ 95 2 8997 2325 ⍽ 87 1 9085 237d ⎮ 49 3 9134 23ae ⏏ 73 0 9167 23cf ␣ 73 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 56 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 56 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⟠ 47 3 10208 27e0 ⧫ 47 3 10731 29eb ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 63 2 64257 fb01 fl 63 2 64258 fb02 � 97 3 65533 fffd 9base-6/troff/font/devutf/DejaVuCondensedSansOblique0000644000175000017500000007301411402154555022230 0ustar anselmanselmname DejaVuCondensedSansOblique fontname DejaVuCondensedSansOblique spacewidth 29 charset ! 38 2 33 0021 " 44 2 34 0022 dq " dq " # 80 2 35 0023 $ 60 3 36 0024 % 90 2 37 0025 & 74 2 38 0026 ( 38 3 40 0028 ) 36 3 41 0029 * 47 2 42 002a + 80 2 43 002b , 30 1 44 002c - 34 0 45 002d . 30 0 46 002e / 32 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 61 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 32 0 58 003a ; 32 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 51 2 63 003f @ 95 3 64 0040 A 64 2 65 0041 B 65 2 66 0042 C 67 2 67 0043 D 73 2 68 0044 E 60 2 69 0045 F 55 2 70 0046 G 74 2 71 0047 H 71 2 72 0048 I 28 2 73 0049 J 27 3 74 004a K 63 2 75 004b L 53 2 76 004c M 82 2 77 004d N 71 2 78 004e O 75 2 79 004f P 57 2 80 0050 Q 75 3 81 0051 R 66 2 82 0052 S 60 2 83 0053 T 59 2 84 0054 U 70 2 85 0055 V 66 2 86 0056 W 95 2 87 0057 X 65 2 88 0058 Y 59 2 89 0059 Z 65 2 90 005a [ 37 3 91 005b \ 32 3 92 005c bs " ] 37 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 58 0 97 0061 b 60 2 98 0062 c 52 0 99 0063 d 61 2 100 0064 e 58 0 101 0065 f 34 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 27 2 105 0069 j 26 3 106 006a k 55 2 107 006b l 27 2 108 006c m 92 0 109 006d n 60 0 110 006e o 58 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 39 0 114 0072 s 49 0 115 0073 t 38 2 116 0074 u 60 0 117 0075 v 57 0 118 0076 w 78 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 50 0 122 007a { 61 3 123 007b | 32 3 124 007c } 60 3 125 007d ~ 80 0 126 007e   57 0 160 00a0 ¡ 38 2 161 00a1 ¢ 60 3 162 00a2 £ 61 2 163 00a3 ¤ 60 0 164 00a4 ¥ 61 2 165 00a5 ¦ 32 3 166 00a6 § 47 3 167 00a7 ¨ 48 2 168 00a8 © 95 2 169 00a9 ª 45 2 170 00aa « 59 0 171 00ab ¬ 80 0 172 00ac ­ 34 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 48 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 38 2 178 00b2 ³ 38 2 179 00b3 ´ 49 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 30 0 183 00b7 ¸ 47 1 184 00b8 ¹ 38 2 185 00b9 º 45 2 186 00ba » 59 0 187 00bb ¼ 92 2 188 00bc ½ 92 2 189 00bd ¾ 92 2 190 00be ¿ 50 2 191 00bf À 64 2 192 00c0 Á 64 2 193 00c1  64 2 194 00c2 à 65 2 195 00c3 Ä 64 2 196 00c4 Å 64 2 197 00c5 Æ 92 2 198 00c6 Ç 67 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 28 2 204 00cc Í 29 2 205 00cd Î 29 2 206 00ce Ï 29 2 207 00cf Ð 73 2 208 00d0 Ñ 71 2 209 00d1 Ò 75 2 210 00d2 Ó 75 2 211 00d3 Ô 75 2 212 00d4 Õ 75 2 213 00d5 Ö 75 2 214 00d6 × 80 0 215 00d7 mu " Ø 75 2 216 00d8 Ù 70 2 217 00d9 Ú 70 2 218 00da Û 70 2 219 00db Ü 70 2 220 00dc Ý 59 2 221 00dd Þ 58 2 222 00de ß 60 2 223 00df à 58 2 224 00e0 á 58 2 225 00e1 â 58 2 226 00e2 ã 58 2 227 00e3 ä 58 2 228 00e4 å 58 2 229 00e5 æ 94 0 230 00e6 ç 52 1 231 00e7 è 58 2 232 00e8 é 59 2 233 00e9 ê 58 2 234 00ea ë 58 2 235 00eb ì 26 2 236 00ec í 27 2 237 00ed î 27 2 238 00ee ï 27 2 239 00ef ð 58 2 240 00f0 ñ 60 2 241 00f1 ò 58 2 242 00f2 ó 58 2 243 00f3 ô 58 2 244 00f4 õ 58 2 245 00f5 ö 58 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 58 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 56 3 253 00fd þ 60 3 254 00fe ÿ 56 3 255 00ff ā 58 2 257 0101 Ă 65 2 258 0102 ă 58 2 259 0103 Ą 65 3 260 0104 ą 58 1 261 0105 Ć 67 2 262 0106 ć 53 2 263 0107 Ĉ 67 2 264 0108 ĉ 53 2 265 0109 Ċ 67 2 266 010a ċ 52 2 267 010b Č 67 2 268 010c č 53 2 269 010d Ď 73 2 270 010e ď 62 2 271 010f Đ 73 2 272 0110 đ 61 2 273 0111 Ē 60 2 274 0112 ē 58 2 275 0113 Ĕ 60 2 276 0114 ĕ 58 2 277 0115 Ė 60 2 278 0116 ė 58 2 279 0117 Ę 60 3 280 0118 ę 58 1 281 0119 Ě 60 2 282 011a ě 59 2 283 011b Ĝ 74 2 284 011c ĝ 60 3 285 011d Ğ 74 2 286 011e ğ 60 3 287 011f Ġ 74 2 288 0120 ġ 60 3 289 0121 Ģ 74 3 290 0122 ģ 60 3 291 0123 Ĥ 71 2 292 0124 ĥ 60 2 293 0125 Ħ 87 2 294 0126 ħ 66 2 295 0127 Ĩ 29 2 296 0128 ĩ 27 2 297 0129 Ī 29 2 298 012a ī 27 2 299 012b Ĭ 29 2 300 012c ĭ 27 2 301 012d Į 28 3 302 012e į 26 3 303 012f İ 28 2 304 0130 ı 26 0 305 0131 IJ 56 3 306 0132 ij 53 3 307 0133 Ĵ 28 3 308 0134 ĵ 26 3 309 0135 Ķ 63 3 310 0136 ķ 55 3 311 0137 ĸ 55 0 312 0138 Ĺ 53 2 313 0139 ĺ 27 2 314 013a Ļ 53 3 315 013b ļ 26 3 316 013c Ľ 53 2 317 013d ľ 32 2 318 013e Ŀ 53 2 319 013f ŀ 56 2 320 0140 Ł 53 2 321 0141 ł 27 2 322 0142 Ń 71 2 323 0143 ń 60 2 324 0144 Ņ 71 3 325 0145 ņ 60 1 326 0146 Ň 71 2 327 0147 ň 60 2 328 0148 ʼn 77 2 329 0149 Ŋ 71 3 330 014a ŋ 60 1 331 014b Ō 75 2 332 014c ō 58 2 333 014d Ŏ 75 2 334 014e ŏ 58 2 335 014f Ő 75 2 336 0150 ő 58 2 337 0151 Œ 102 2 338 0152 œ 98 0 339 0153 Ŕ 66 2 340 0154 ŕ 40 2 341 0155 Ŗ 66 3 342 0156 ŗ 39 1 343 0157 Ř 66 2 344 0158 ř 40 2 345 0159 Ś 60 2 346 015a ś 50 2 347 015b Ŝ 60 2 348 015c ŝ 50 2 349 015d Ş 60 3 350 015e ş 49 1 351 015f Š 60 2 352 0160 š 50 2 353 0161 Ţ 59 3 354 0162 ţ 38 3 355 0163 Ť 59 2 356 0164 ť 38 2 357 0165 Ŧ 59 2 358 0166 ŧ 37 2 359 0167 Ũ 70 2 360 0168 ũ 60 2 361 0169 Ū 70 2 362 016a ū 60 2 363 016b Ŭ 70 2 364 016c ŭ 60 2 365 016d Ů 70 2 366 016e ů 60 2 367 016f Ű 70 2 368 0170 ű 61 2 369 0171 Ų 70 3 370 0172 ų 60 1 371 0173 Ŵ 95 2 372 0174 ŵ 78 2 373 0175 Ŷ 59 2 374 0176 ŷ 56 3 375 0177 Ÿ 59 2 376 0178 Ź 65 2 377 0179 ź 50 2 378 017a Ż 65 2 379 017b ż 50 2 380 017c Ž 65 2 381 017d ž 50 2 382 017e ſ 34 2 383 017f ƀ 60 2 384 0180 Ɓ 69 2 385 0181 Ƃ 65 2 386 0182 ƃ 60 2 387 0183 Ƅ 65 2 388 0184 ƅ 60 2 389 0185 Ɔ 66 2 390 0186 Ƈ 67 2 391 0187 ƈ 53 2 392 0188 Ɖ 73 2 393 0189 Ɗ 78 2 394 018a Ƌ 65 2 395 018b ƌ 60 2 396 018c ƍ 58 1 397 018d Ǝ 60 2 398 018e Ə 75 2 399 018f Ɛ 60 2 400 0190 Ƒ 54 3 401 0191 ƒ 33 3 402 0192 Ɠ 74 2 403 0193 Ɣ 66 3 404 0194 ƕ 91 2 405 0195 Ɩ 34 2 406 0196 Ɨ 28 2 407 0197 Ƙ 66 2 408 0198 ƙ 55 2 409 0199 ƚ 26 2 410 019a ƛ 56 2 411 019b Ɯ 93 2 412 019c Ɲ 70 3 413 019d ƞ 60 1 414 019e Ɵ 75 2 415 019f Ơ 76 2 416 01a0 ơ 59 0 417 01a1 Ƣ 76 2 418 01a2 ƣ 59 1 419 01a3 Ƥ 62 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 58 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 49 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 32 3 426 01aa ƫ 38 3 427 01ab Ƭ 58 2 428 01ac ƭ 38 2 429 01ad Ʈ 59 3 430 01ae Ư 71 2 431 01af ư 61 0 432 01b0 Ʊ 73 2 433 01b1 Ʋ 69 2 434 01b2 Ƴ 67 2 435 01b3 ƴ 76 1 436 01b4 Ƶ 65 2 437 01b5 ƶ 50 0 438 01b6 Ʒ 63 2 439 01b7 Ƹ 63 2 440 01b8 ƹ 55 1 441 01b9 ƻ 60 2 443 01bb Ƽ 63 2 444 01bc ƽ 55 1 445 01bd ƾ 48 2 446 01be ǀ 28 3 448 01c0 ǁ 47 3 449 01c1 ǂ 44 3 450 01c2 ǃ 28 2 451 01c3 DŽ 138 2 452 01c4 Dž 123 2 453 01c5 dž 110 2 454 01c6 LJ 81 3 455 01c7 Lj 79 3 456 01c8 lj 53 3 457 01c9 NJ 99 3 458 01ca Nj 98 3 459 01cb nj 87 3 460 01cc Ǎ 64 2 461 01cd ǎ 58 2 462 01ce Ǐ 29 2 463 01cf ǐ 27 2 464 01d0 Ǒ 75 2 465 01d1 ǒ 58 2 466 01d2 Ǔ 70 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 72 2 471 01d7 ǘ 63 2 472 01d8 Ǚ 72 2 473 01d9 ǚ 63 2 474 01da Ǜ 72 2 475 01db ǜ 62 2 476 01dc ǝ 58 0 477 01dd ǟ 58 2 479 01df Ǣ 92 2 482 01e2 ǣ 94 2 483 01e3 Ǫ 75 3 490 01ea ǫ 58 1 491 01eb Ǭ 75 3 492 01ec ǭ 58 3 493 01ed DZ 138 2 497 01f1 Dz 123 2 498 01f2 dz 110 2 499 01f3 Ƕ 106 2 502 01f6 Ș 60 3 536 0218 ș 49 1 537 0219 Ț 59 3 538 021a ț 38 3 539 021b Ȥ 65 3 548 0224 ȥ 50 1 549 0225 ȫ 58 2 555 022b ȭ 58 2 557 022d Ȯ 75 2 558 022e ȯ 58 2 559 022f ȱ 58 2 561 0231 Ȳ 59 2 562 0232 ȳ 56 3 563 0233 ȷ 26 1 567 0237 ȸ 95 2 568 0238 ȹ 95 1 569 0239 Ⱥ 65 2 570 023a Ȼ 66 2 571 023b ȼ 52 0 572 023c Ƚ 53 2 573 023d Ⱦ 59 2 574 023e ȿ 50 1 575 023f ɀ 50 1 576 0240 Ɂ 49 2 577 0241 ɐ 58 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 52 0 596 0254 ɕ 52 1 597 0255 ɖ 61 3 598 0256 ɗ 70 2 599 0257 ɘ 58 0 600 0258 ə 58 0 601 0259 ɚ 76 0 602 025a ɛ 52 0 603 025b ɜ 52 0 604 025c ɝ 73 0 605 025d ɞ 65 0 606 025e ɟ 33 1 607 025f ɠ 61 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 66 1 611 0263 ɤ 57 0 612 0264 ɥ 61 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 35 2 616 0268 ɩ 36 0 617 0269 ɪ 35 0 618 026a ɫ 46 2 619 026b ɬ 46 2 620 026c ɭ 27 3 621 026d ɮ 60 3 622 026e ɯ 93 0 623 026f ɰ 93 1 624 0270 ɱ 93 1 625 0271 ɲ 61 1 626 0272 ɳ 61 1 627 0273 ɴ 60 0 628 0274 ɵ 58 0 629 0275 ɶ 81 0 630 0276 ɷ 69 0 631 0277 ɸ 58 3 632 0278 ɹ 44 0 633 0279 ɺ 44 2 634 027a ɻ 45 1 635 027b ɼ 44 1 636 027c ɽ 44 1 637 027d ɾ 42 0 638 027e ɿ 42 0 639 027f ʀ 56 0 640 0280 ʁ 57 0 641 0281 ʂ 49 1 642 0282 ʃ 32 3 643 0283 ʄ 36 3 644 0284 ʅ 44 1 645 0285 ʆ 31 3 646 0286 ʇ 37 1 647 0287 ʈ 38 3 648 0288 ʉ 60 0 649 0289 ʊ 59 0 650 028a ʋ 57 0 651 028b ʌ 56 0 652 028c ʍ 77 0 653 028d ʎ 56 2 654 028e ʏ 58 0 655 028f ʐ 50 1 656 0290 ʑ 50 1 657 0291 ʒ 55 1 658 0292 ʓ 55 1 659 0293 ʔ 49 2 660 0294 ʕ 49 2 661 0295 ʖ 48 2 662 0296 ʗ 49 3 663 0297 ʘ 57 0 664 0298 ʙ 55 0 665 0299 ʚ 65 0 666 029a ʛ 68 2 667 029b ʜ 60 0 668 029c ʝ 33 3 669 029d ʞ 64 1 670 029e ʟ 55 0 671 029f ʠ 70 3 672 02a0 ʡ 48 2 673 02a1 ʢ 49 2 674 02a2 ʣ 96 2 675 02a3 ʤ 100 3 676 02a4 ʥ 96 3 677 02a5 ʦ 78 2 678 02a6 ʧ 59 3 679 02a7 ʨ 74 3 680 02a8 ʩ 81 3 681 02a9 ʪ 61 2 682 02aa ʫ 62 2 683 02ab ʬ 49 2 684 02ac ʭ 49 2 685 02ad ʮ 55 3 686 02ae ʯ 63 3 687 02af ʰ 38 2 688 02b0 ʱ 38 2 689 02b1 ʲ 16 2 690 02b2 ʳ 25 2 691 02b3 ʴ 28 2 692 02b4 ʵ 28 2 693 02b5 ʶ 36 2 694 02b6 ʷ 49 2 695 02b7 ʸ 36 2 696 02b8 ʻ 31 2 699 02bb ʼ 30 2 700 02bc ʾ 30 2 702 02be ʿ 30 2 703 02bf ˀ 35 2 704 02c0 ˁ 35 2 705 02c1 ˆ 48 2 710 02c6 ˇ 49 2 711 02c7 ˈ 26 2 712 02c8 ˌ 26 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 29 2 722 02d2 ˓ 29 0 723 02d3 ˖ 40 0 726 02d6 ˘ 49 2 728 02d8 ˙ 48 2 729 02d9 ˚ 48 2 730 02da ˛ 47 1 731 02db ˜ 48 2 732 02dc ˝ 49 2 733 02dd ˞ 30 0 734 02de ˠ 41 2 736 02e0 ˡ 16 2 737 02e1 ˢ 35 2 738 02e2 ˣ 42 2 739 02e3 ˤ 35 2 740 02e4 ˥ 47 2 741 02e5 ˦ 47 2 742 02e6 ˧ 47 2 743 02e7 ˨ 47 2 744 02e8 ˩ 47 2 745 02e9 ́ 49 2 769 0301 ̂ 49 2 770 0302 ̃ 49 2 771 0303 ̄ 49 2 772 0304 ̅ 0 2 773 0305 ̆ 49 2 774 0306 ̇ 49 2 775 0307 ̈ 49 2 776 0308 ̉ 0 2 777 0309 ̊ 49 2 778 030a ̋ 49 2 779 030b ̌ 49 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 31 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 48 1 801 0321 ̢ 47 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 1 2 856 0358 ͡ 1 2 865 0361 ʹ 28 2 884 0374 ͵ 26 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 49 2 900 0384 ΅ 49 2 901 0385 Ά 65 2 902 0386 · 30 0 903 0387 Έ 73 2 904 0388 Ή 86 2 905 0389 Ί 41 2 906 038a Ό 80 2 908 038c Ύ 82 2 910 038e Ώ 86 2 911 038f ΐ 33 2 912 0390 Α 64 2 913 0391 Β 65 2 914 0392 Γ 53 2 915 0393 Δ 64 2 916 0394 Ε 60 2 917 0395 Ζ 65 2 918 0396 Η 71 2 919 0397 Θ 75 2 920 0398 Ι 28 2 921 0399 Κ 63 2 922 039a Λ 64 2 923 039b Μ 82 2 924 039c Ν 71 2 925 039d Ξ 60 2 926 039e Ο 75 2 927 039f Π 71 2 928 03a0 Ρ 57 2 929 03a1 Σ 60 2 931 03a3 Τ 59 2 932 03a4 Υ 59 2 933 03a5 Φ 75 2 934 03a6 Χ 65 2 935 03a7 Ψ 75 2 936 03a8 Ω 73 2 937 03a9 Ϊ 31 2 938 03aa Ϋ 61 2 939 03ab ά 63 2 940 03ac έ 52 2 941 03ad ή 60 3 942 03ae ί 33 2 943 03af ΰ 55 2 944 03b0 α 63 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 58 2 948 03b4 ε 51 0 949 03b5 ζ 52 3 950 03b6 η 60 1 951 03b7 θ 58 2 952 03b8 ι 32 0 953 03b9 κ 56 0 954 03ba λ 55 2 955 03bb μ 60 1 956 03bc ν 53 0 957 03bd ξ 53 3 958 03be ο 58 0 959 03bf π 58 0 960 03c0 ρ 60 1 961 03c1 ς 56 1 962 03c2 σ 61 0 963 03c3 τ 58 0 964 03c4 υ 55 0 965 03c5 φ 63 1 966 03c6 χ 56 1 967 03c7 ψ 63 1 968 03c8 ω 80 0 969 03c9 ϊ 33 2 970 03ca ϋ 55 2 971 03cb ό 58 2 972 03cc ύ 55 2 973 03cd ώ 80 2 974 03ce ϐ 58 2 976 03d0 ϑ 59 2 977 03d1 ϒ 67 2 978 03d2 ϓ 80 2 979 03d3 ϔ 69 2 980 03d4 ϕ 63 3 981 03d5 ϖ 80 0 982 03d6 ϗ 63 1 983 03d7 Ϙ 75 3 984 03d8 ϙ 58 1 985 03d9 Ϛ 62 3 986 03da ϛ 56 1 987 03db Ϝ 55 2 988 03dc ϝ 43 3 989 03dd Ϟ 63 2 990 03de ϟ 63 2 991 03df Ϡ 82 3 992 03e0 ϡ 59 1 993 03e1 ϰ 63 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 52 0 1010 03f2 ϳ 26 3 1011 03f3 ϴ 75 2 1012 03f4 ϵ 58 0 1013 03f5 ϶ 58 0 1014 03f6 Ϸ 58 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 67 2 1017 03f9 Ϻ 82 2 1018 03fa ϻ 62 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 66 2 1021 03fd Ͼ 67 2 1022 03fe Ͽ 66 2 1023 03ff Ё 60 2 1025 0401 Ђ 75 3 1026 0402 Ѓ 53 2 1027 0403 Є 67 2 1028 0404 Ѕ 60 2 1029 0405 І 28 2 1030 0406 Ї 29 2 1031 0407 Ј 27 3 1032 0408 Љ 103 2 1033 0409 Њ 99 2 1034 040a Ћ 74 2 1035 040b Ќ 63 2 1036 040c Ѝ 71 2 1037 040d Ў 58 2 1038 040e Џ 72 3 1039 040f А 64 2 1040 0410 Б 65 2 1041 0411 В 65 2 1042 0412 Г 53 2 1043 0413 Д 73 3 1044 0414 Е 60 2 1045 0415 Ж 82 2 1046 0416 З 60 2 1047 0417 И 71 2 1048 0418 Й 71 2 1049 0419 К 63 2 1050 041a Л 71 2 1051 041b М 82 2 1052 041c Н 71 2 1053 041d О 75 2 1054 041e П 71 2 1055 041f Р 57 2 1056 0420 С 67 2 1057 0421 Т 59 2 1058 0422 У 58 2 1059 0423 Ф 75 2 1060 0424 Х 65 2 1061 0425 Ц 74 3 1062 0426 Ч 66 2 1063 0427 Ш 95 2 1064 0428 Щ 97 3 1065 0429 Ъ 79 2 1066 042a Ы 78 2 1067 042b Ь 65 2 1068 042c Э 66 2 1069 042d Ю 98 2 1070 042e Я 66 2 1071 042f а 58 0 1072 0430 б 58 2 1073 0431 в 56 0 1074 0432 г 47 0 1075 0433 д 63 1 1076 0434 е 58 0 1077 0435 ж 70 0 1078 0436 з 51 0 1079 0437 и 62 0 1080 0438 й 62 2 1081 0439 к 58 0 1082 043a л 60 0 1083 043b м 72 0 1084 043c н 63 0 1085 043d о 58 0 1086 043e п 63 0 1087 043f р 60 1 1088 0440 с 52 0 1089 0441 т 51 0 1090 0442 у 56 1 1091 0443 ф 87 3 1092 0444 х 56 0 1093 0445 ц 65 1 1094 0446 ч 56 0 1095 0447 ш 83 0 1096 0448 щ 85 1 1097 0449 ъ 67 0 1098 044a ы 73 0 1099 044b ь 56 0 1100 044c э 58 0 1101 044d ю 77 0 1102 044e я 57 0 1103 044f ѐ 58 2 1104 0450 ё 58 2 1105 0451 ђ 61 3 1106 0452 ѓ 47 2 1107 0453 є 58 0 1108 0454 ѕ 49 0 1109 0455 і 27 2 1110 0456 ї 27 2 1111 0457 ј 26 3 1112 0458 љ 85 0 1113 0459 њ 85 0 1114 045a ћ 60 2 1115 045b ќ 58 2 1116 045c ѝ 62 2 1117 045d ў 56 3 1118 045e џ 63 1 1119 045f Ѥ 90 2 1124 0464 ѥ 71 0 1125 0465 Ҋ 73 3 1162 048a ҋ 62 3 1163 048b Ҍ 65 2 1164 048c ҍ 56 2 1165 048d Ґ 53 2 1168 0490 ґ 48 2 1169 0491 Ғ 53 2 1170 0492 ғ 47 0 1171 0493 Ҕ 53 3 1172 0494 ҕ 47 1 1173 0495 Җ 82 3 1174 0496 җ 70 1 1175 0497 Ҙ 60 3 1176 0498 ҙ 51 1 1177 0499 Қ 63 3 1178 049a қ 58 1 1179 049b Ҡ 77 2 1184 04a0 ҡ 69 0 1185 04a1 Ң 71 3 1186 04a2 ң 63 1 1187 04a3 Ҥ 97 2 1188 04a4 ҥ 84 0 1189 04a5 Ҧ 105 3 1190 04a6 ҧ 90 1 1191 04a7 Ҫ 67 3 1194 04aa ҫ 52 1 1195 04ab Ҭ 59 3 1196 04ac ҭ 51 1 1197 04ad Ү 59 2 1198 04ae ү 57 1 1199 04af Ұ 58 2 1200 04b0 ұ 56 1 1201 04b1 Ҳ 65 3 1202 04b2 ҳ 56 1 1203 04b3 Ҵ 86 3 1204 04b4 ҵ 76 1 1205 04b5 Ҷ 66 3 1206 04b6 ҷ 56 1 1207 04b7 Һ 66 2 1210 04ba һ 56 0 1211 04bb Ӏ 27 2 1216 04c0 Ӂ 84 2 1217 04c1 ӂ 70 2 1218 04c2 Ӆ 71 3 1221 04c5 ӆ 60 1 1222 04c6 Ӈ 71 3 1223 04c7 ӈ 63 1 1224 04c8 Ӊ 71 3 1225 04c9 ӊ 63 1 1226 04ca Ӌ 66 3 1227 04cb ӌ 56 1 1228 04cc Ӎ 82 3 1229 04cd ӎ 72 1 1230 04ce Ӑ 65 2 1232 04d0 ӑ 58 2 1233 04d1 Ӓ 67 2 1234 04d2 ӓ 58 2 1235 04d3 Ӕ 92 2 1236 04d4 ӕ 94 0 1237 04d5 Ӗ 62 2 1238 04d6 ӗ 58 2 1239 04d7 Ә 75 2 1240 04d8 ә 58 0 1241 04d9 Ӛ 77 2 1242 04da ӛ 58 2 1243 04db Ӝ 84 2 1244 04dc ӝ 70 2 1245 04dd Ӟ 62 2 1246 04de ӟ 51 2 1247 04df Ӡ 63 2 1248 04e0 ӡ 55 1 1249 04e1 Ӣ 71 2 1250 04e2 ӣ 62 2 1251 04e3 Ӥ 73 2 1252 04e4 ӥ 62 2 1253 04e5 Ӧ 77 2 1254 04e6 ӧ 58 2 1255 04e7 Ө 75 2 1256 04e8 ө 58 0 1257 04e9 Ӫ 77 2 1258 04ea ӫ 58 2 1259 04eb Ӭ 68 2 1260 04ec ӭ 48 2 1261 04ed Ӯ 58 2 1262 04ee ӯ 56 3 1263 04ef Ӱ 60 2 1264 04f0 ӱ 56 3 1265 04f1 Ӳ 61 2 1266 04f2 ӳ 56 3 1267 04f3 Ӵ 68 2 1268 04f4 ӵ 56 2 1269 04f5 Ӷ 53 3 1270 04f6 ӷ 47 1 1271 04f7 Ӹ 80 2 1272 04f8 ӹ 72 2 1273 04f9 Ա 82 2 1329 0531 Բ 69 2 1330 0532 Գ 84 2 1331 0533 Դ 84 2 1332 0534 Ե 69 2 1333 0535 Զ 61 3 1334 0536 Է 69 3 1335 0537 Ը 69 3 1336 0538 Թ 81 2 1337 0539 Ժ 84 2 1338 053a Ի 69 2 1339 053b Լ 59 3 1340 053c Խ 78 2 1341 053d Ծ 94 2 1342 053e Կ 70 2 1343 053f Հ 67 3 1344 0540 Ձ 61 2 1345 0541 Ղ 84 3 1346 0542 Ճ 74 2 1347 0543 Մ 84 2 1348 0544 Յ 69 2 1349 0545 Ն 80 2 1350 0546 Շ 69 2 1351 0547 Ո 69 2 1352 0548 Չ 70 3 1353 0549 Պ 75 2 1354 054a Ջ 61 3 1355 054b Ռ 84 2 1356 054c Ս 70 2 1357 054d Վ 84 3 1358 054e Տ 60 2 1359 054f Ր 69 2 1360 0550 Ց 69 2 1361 0551 Ւ 76 2 1362 0552 Փ 75 2 1363 0553 Ք 75 2 1364 0554 Օ 75 2 1365 0555 Ֆ 60 2 1366 0556 ՙ 30 2 1369 0559 ՚ 30 2 1370 055a ՛ 48 2 1371 055b ՜ 47 2 1372 055c ՝ 38 2 1373 055d ՞ 50 2 1374 055e ՟ 47 2 1375 055f ա 93 0 1377 0561 բ 60 1 1378 0562 գ 63 1 1379 0563 դ 63 1 1380 0564 զ 63 1 1382 0566 է 52 3 1383 0567 ը 60 1 1384 0568 թ 65 1 1385 0569 ժ 64 2 1386 056a ի 60 3 1387 056b լ 35 1 1388 056c խ 92 3 1389 056d ծ 60 2 1390 056e կ 60 3 1391 056f հ 60 2 1392 0570 ձ 60 2 1393 0571 ղ 63 1 1394 0572 ճ 60 2 1395 0573 մ 63 2 1396 0574 յ 26 1 1397 0575 ն 72 2 1398 0576 շ 49 1 1399 0577 ո 60 0 1400 0578 չ 42 1 1401 0579 պ 93 1 1402 057a ջ 49 1 1403 057b ռ 60 0 1404 057c ս 60 0 1405 057d վ 63 3 1406 057e տ 92 0 1407 057f ր 60 1 1408 0580 ց 60 1 1409 0581 ւ 36 0 1410 0582 փ 92 3 1411 0583 ք 61 1 1412 0584 օ 58 0 1413 0585 ֆ 58 3 1414 0586 և 66 2 1415 0587 ։ 32 0 1417 0589 ֊ 50 0 1418 058a ᴂ 93 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 26 1 7433 1d09 ᴔ 97 0 7444 1d14 ᴖ 59 0 7446 1d16 ᴗ 59 0 7447 1d17 ᴝ 70 0 7453 1d1d ᴞ 91 0 7454 1d1e ᴟ 60 1 7455 1d1f ᵃ 46 2 7491 1d43 ᵄ 46 2 7492 1d44 ᵅ 47 2 7493 1d45 ᵆ 70 2 7494 1d46 ᵇ 49 2 7495 1d47 ᵈ 47 2 7496 1d48 ᵉ 48 2 7497 1d49 ᵊ 48 2 7498 1d4a ᵋ 43 2 7499 1d4b ᵌ 43 2 7500 1d4c ᵍ 47 2 7501 1d4d ᵎ 26 2 7502 1d4e ᵏ 49 2 7503 1d4f ᵐ 68 2 7504 1d50 ᵑ 48 2 7505 1d51 ᵒ 48 2 7506 1d52 ᵓ 44 2 7507 1d53 ᵔ 48 2 7508 1d54 ᵕ 48 0 7509 1d55 ᵖ 49 2 7510 1d56 ᵗ 37 2 7511 1d57 ᵘ 47 2 7512 1d58 ᵙ 54 2 7513 1d59 ᵚ 68 2 7514 1d5a ᵛ 48 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 36 0 7547 1d7b ᶅ 27 3 7557 1d85 ᶛ 47 2 7579 1d9b ᶜ 44 2 7580 1d9c ᶝ 44 2 7581 1d9d ᶞ 48 2 7582 1d9e ᶟ 43 2 7583 1d9f ᶠ 37 2 7584 1da0 ᶡ 30 2 7585 1da1 ᶢ 47 2 7586 1da2 ᶣ 47 2 7587 1da3 ᶤ 33 2 7588 1da4 ᶥ 32 2 7589 1da5 ᶦ 33 2 7590 1da6 ᶧ 34 2 7591 1da7 ᶨ 30 2 7592 1da8 ᶩ 32 2 7593 1da9 ᶪ 31 2 7594 1daa ᶫ 44 2 7595 1dab ᶬ 68 2 7596 1dac ᶭ 68 2 7597 1dad ᶮ 47 2 7598 1dae ᶯ 54 2 7599 1daf ᶰ 48 2 7600 1db0 ᶱ 48 2 7601 1db1 ᶲ 48 2 7602 1db2 ᶳ 43 2 7603 1db3 ᶴ 36 2 7604 1db4 ᶵ 37 2 7605 1db5 ᶶ 57 2 7606 1db6 ᶷ 49 2 7607 1db7 ᶹ 47 2 7609 1db9 ᶺ 48 2 7610 1dba ᶻ 43 2 7611 1dbb ᶼ 50 2 7612 1dbc ᶽ 43 2 7613 1dbd ᶾ 46 2 7614 1dbe ᶿ 48 2 7615 1dbf Ḍ 73 3 7692 1e0c ḍ 61 3 7693 1e0d Ḓ 74 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 71 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 53 3 7734 1e36 ḷ 26 3 7735 1e37 Ḹ 53 3 7736 1e38 ḹ 27 3 7737 1e39 Ḽ 52 3 7740 1e3c ḽ 29 3 7741 1e3d ṁ 92 2 7745 1e41 Ṃ 82 3 7746 1e42 ṃ 92 1 7747 1e43 Ṅ 69 2 7748 1e44 ṅ 61 2 7749 1e45 Ṇ 71 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 69 3 7754 1e4a ṋ 61 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 66 3 7770 1e5a ṛ 39 1 7771 1e5b Ṝ 66 3 7772 1e5c ṝ 39 3 7773 1e5d ṡ 49 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 49 1 7779 1e63 Ṭ 59 3 7788 1e6c ṭ 38 3 7789 1e6d Ṱ 58 3 7792 1e70 ṱ 39 3 7793 1e71 Ṿ 66 3 7806 1e7e ṿ 57 1 7807 1e7f Ẁ 95 2 7808 1e80 ẁ 78 2 7809 1e81 Ẃ 95 2 7810 1e82 ẃ 78 2 7811 1e83 Ẅ 95 2 7812 1e84 ẅ 78 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 58 1 7865 1eb9 Ị 28 3 7882 1eca ị 26 3 7883 1ecb Ọ 75 3 7884 1ecc ọ 58 1 7885 1ecd Ụ 70 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 59 2 7922 1ef2 ỳ 56 3 7923 1ef3 ἁ 63 2 7937 1f01 ἂ 63 2 7938 1f02 ἃ 63 2 7939 1f03 ἄ 63 2 7940 1f04 ἅ 63 2 7941 1f05 ἆ 63 2 7942 1f06 ἇ 63 2 7943 1f07 Ἀ 64 2 7944 1f08 Ἁ 64 2 7945 1f09 Ἂ 83 2 7946 1f0a Ἃ 83 2 7947 1f0b Ἄ 73 2 7948 1f0c Ἅ 76 2 7949 1f0d Ἆ 67 2 7950 1f0e Ἇ 70 2 7951 1f0f ἐ 51 2 7952 1f10 ἑ 51 2 7953 1f11 ἒ 52 2 7954 1f12 ἓ 52 2 7955 1f13 ἔ 52 2 7956 1f14 ἕ 52 2 7957 1f15 Ἐ 67 2 7960 1f18 Ἑ 68 2 7961 1f19 Ἒ 92 2 7962 1f1a Ἓ 93 2 7963 1f1b Ἔ 85 2 7964 1f1c Ἕ 88 2 7965 1f1d ἠ 60 3 7968 1f20 ἡ 60 3 7969 1f21 ἢ 60 3 7970 1f22 ἣ 60 3 7971 1f23 ἤ 60 3 7972 1f24 ἥ 61 3 7973 1f25 ἦ 60 3 7974 1f26 ἧ 60 3 7975 1f27 Ἠ 79 2 7976 1f28 Ἡ 79 2 7977 1f29 Ἢ 103 2 7978 1f2a Ἣ 103 2 7979 1f2b Ἤ 97 2 7980 1f2c Ἥ 100 2 7981 1f2d Ἦ 89 2 7982 1f2e Ἧ 90 2 7983 1f2f ἰ 32 2 7984 1f30 ἱ 32 2 7985 1f31 ἲ 32 2 7986 1f32 ἳ 33 2 7987 1f33 ἴ 33 2 7988 1f34 ἵ 33 2 7989 1f35 ἶ 33 2 7990 1f36 ἷ 33 2 7991 1f37 Ἰ 36 2 7992 1f38 Ἱ 36 2 7993 1f39 Ἲ 60 2 7994 1f3a Ἳ 60 2 7995 1f3b Ἴ 54 2 7996 1f3c Ἵ 57 2 7997 1f3d Ἶ 47 2 7998 1f3e Ἷ 47 2 7999 1f3f ὀ 58 2 8000 1f40 ὁ 58 2 8001 1f41 ὂ 58 2 8002 1f42 ὃ 58 2 8003 1f43 ὄ 59 2 8004 1f44 ὅ 59 2 8005 1f45 Ὀ 76 2 8008 1f48 Ὁ 80 2 8009 1f49 Ὂ 104 2 8010 1f4a Ὃ 104 2 8011 1f4b Ὄ 89 2 8012 1f4c Ὅ 92 2 8013 1f4d ὐ 55 2 8016 1f50 ὑ 55 2 8017 1f51 ὒ 55 2 8018 1f52 ὓ 55 2 8019 1f53 ὔ 55 2 8020 1f54 ὕ 55 2 8021 1f55 ὖ 55 2 8022 1f56 ὗ 55 2 8023 1f57 Ὑ 75 2 8025 1f59 Ὓ 95 2 8027 1f5b Ὕ 97 2 8029 1f5d Ὗ 86 2 8031 1f5f ὠ 80 2 8032 1f60 ὡ 80 2 8033 1f61 ὢ 80 2 8034 1f62 ὣ 80 2 8035 1f63 ὤ 80 2 8036 1f64 ὥ 80 2 8037 1f65 ὦ 80 2 8038 1f66 ὧ 80 2 8039 1f67 Ὠ 76 2 8040 1f68 Ὡ 80 2 8041 1f69 Ὢ 103 2 8042 1f6a Ὣ 104 2 8043 1f6b Ὤ 90 2 8044 1f6c Ὥ 92 2 8045 1f6d Ὦ 88 2 8046 1f6e Ὧ 91 2 8047 1f6f ὰ 63 2 8048 1f70 ά 63 2 8049 1f71 ὲ 51 2 8050 1f72 έ 52 2 8051 1f73 ὴ 60 3 8052 1f74 ή 62 3 8053 1f75 ὶ 32 2 8054 1f76 ί 33 2 8055 1f77 ὸ 58 2 8056 1f78 ό 58 2 8057 1f79 ὺ 55 2 8058 1f7a ύ 55 2 8059 1f7b ὼ 80 2 8060 1f7c ώ 80 2 8061 1f7d ᾀ 63 3 8064 1f80 ᾁ 63 3 8065 1f81 ᾂ 63 3 8066 1f82 ᾃ 63 3 8067 1f83 ᾄ 63 3 8068 1f84 ᾅ 63 3 8069 1f85 ᾆ 63 3 8070 1f86 ᾇ 63 3 8071 1f87 ᾈ 64 3 8072 1f88 ᾉ 64 3 8073 1f89 ᾊ 83 3 8074 1f8a ᾋ 83 3 8075 1f8b ᾌ 73 3 8076 1f8c ᾍ 76 3 8077 1f8d ᾎ 67 3 8078 1f8e ᾏ 70 3 8079 1f8f ᾐ 60 3 8080 1f90 ᾑ 60 3 8081 1f91 ᾒ 60 3 8082 1f92 ᾓ 60 3 8083 1f93 ᾔ 61 3 8084 1f94 ᾕ 61 3 8085 1f95 ᾖ 61 3 8086 1f96 ᾗ 60 3 8087 1f97 ᾘ 79 3 8088 1f98 ᾙ 79 3 8089 1f99 ᾚ 103 3 8090 1f9a ᾛ 103 3 8091 1f9b ᾜ 97 3 8092 1f9c ᾝ 100 3 8093 1f9d ᾞ 89 3 8094 1f9e ᾟ 90 3 8095 1f9f ᾠ 80 3 8096 1fa0 ᾡ 80 3 8097 1fa1 ᾢ 80 3 8098 1fa2 ᾣ 80 3 8099 1fa3 ᾤ 80 3 8100 1fa4 ᾥ 80 3 8101 1fa5 ᾦ 80 3 8102 1fa6 ᾧ 80 3 8103 1fa7 ᾨ 76 3 8104 1fa8 ᾩ 80 3 8105 1fa9 ᾪ 103 3 8106 1faa ᾫ 104 3 8107 1fab ᾬ 90 3 8108 1fac ᾭ 92 3 8109 1fad ᾮ 88 3 8110 1fae ᾯ 90 3 8111 1faf ᾰ 63 2 8112 1fb0 ᾱ 63 2 8113 1fb1 ᾲ 63 3 8114 1fb2 ᾳ 63 1 8115 1fb3 ᾴ 63 3 8116 1fb4 ᾶ 63 2 8118 1fb6 ᾷ 63 3 8119 1fb7 Ᾰ 67 2 8120 1fb8 Ᾱ 64 2 8121 1fb9 Ὰ 68 2 8122 1fba Ά 65 2 8123 1fbb ᾼ 64 3 8124 1fbc ᾽ 48 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 48 2 8127 1fbf ῀ 48 2 8128 1fc0 ῁ 49 2 8129 1fc1 ῂ 60 3 8130 1fc2 ῃ 60 1 8131 1fc3 ῄ 62 3 8132 1fc4 ῆ 60 3 8134 1fc6 ῇ 60 3 8135 1fc7 Ὲ 77 2 8136 1fc8 Έ 71 2 8137 1fc9 Ὴ 88 2 8138 1fca Ή 83 2 8139 1fcb ῌ 71 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 49 2 8143 1fcf ῐ 33 2 8144 1fd0 ῑ 33 2 8145 1fd1 ῒ 33 2 8146 1fd2 ΐ 33 2 8147 1fd3 ῖ 33 2 8150 1fd6 ῗ 33 2 8151 1fd7 Ῐ 31 2 8152 1fd8 Ῑ 29 2 8153 1fd9 Ὶ 45 2 8154 1fda Ί 39 2 8155 1fdb ῝ 48 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 49 2 8159 1fdf ῠ 55 2 8160 1fe0 ῡ 55 2 8161 1fe1 ῢ 55 2 8162 1fe2 ΰ 55 2 8163 1fe3 ῤ 60 3 8164 1fe4 ῥ 60 3 8165 1fe5 ῦ 55 2 8166 1fe6 ῧ 55 2 8167 1fe7 Ῠ 61 2 8168 1fe8 Ῡ 59 2 8169 1fe9 Ὺ 81 2 8170 1fea Ύ 79 2 8171 1feb Ῥ 65 2 8172 1fec ῭ 48 2 8173 1fed ΅ 49 2 8174 1fee ` 48 2 8175 1fef ῲ 80 3 8178 1ff2 ῳ 80 1 8179 1ff3 ῴ 80 3 8180 1ff4 ῶ 80 2 8182 1ff6 ῷ 80 3 8183 1ff7 Ὸ 89 2 8184 1ff8 Ό 77 2 8185 1ff9 Ὼ 88 2 8186 1ffa Ώ 79 2 8187 1ffb ῼ 73 3 8188 1ffc ´ 49 2 8189 1ffd ῾ 48 2 8190 1ffe ‐ 34 0 8208 2010 ‑ 34 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 31 2 8216 2018 ` " ‘ " ’ 31 2 8217 2019 ' " ’ " ‚ 30 1 8218 201a ‛ 31 2 8219 201b “ 50 2 8220 201c ” 50 2 8221 201d „ 49 1 8222 201e ‟ 49 2 8223 201f † 48 3 8224 2020 ‡ 47 3 8225 2021 • 56 0 8226 2022 ‣ 56 0 8227 2023 ․ 31 0 8228 2024 ‥ 63 0 8229 2025 … 95 0 8230 2026 ‰ 128 2 8240 2030 ‱ 161 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 46 2 8252 203c ‽ 51 2 8253 203d ‾ 47 2 8254 203e ⁇ 88 2 8263 2047 ⁈ 70 2 8264 2048 ⁉ 69 2 8265 2049 ⁰ 58 2 8304 2070 ⁴ 57 2 8308 2074 ⁵ 57 2 8309 2075 ⁶ 58 2 8310 2076 ⁷ 58 2 8311 2077 ⁸ 58 2 8312 2078 ⁹ 58 2 8313 2079 ⁿ 38 2 8319 207f ₦ 71 2 8358 20a6 € 60 2 8364 20ac ₵ 61 3 8373 20b5 ℃ 107 2 8451 2103 № 111 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 73 2 8486 2126 ℧ 73 2 8487 2127 K 63 2 8490 212a Å 64 2 8491 212b Ⅎ 55 2 8498 2132 ⅋ 74 2 8523 214b Ⅰ 28 2 8544 2160 Ⅱ 47 2 8545 2161 Ⅲ 65 2 8546 2162 Ⅳ 88 2 8547 2163 Ⅴ 66 2 8548 2164 Ⅵ 88 2 8549 2165 Ⅶ 107 2 8550 2166 Ⅷ 125 2 8551 2167 Ⅸ 87 2 8552 2168 Ⅹ 65 2 8553 2169 Ⅺ 88 2 8554 216a Ⅻ 107 2 8555 216b Ⅼ 53 2 8556 216c Ⅽ 67 2 8557 216d Ⅾ 73 2 8558 216e Ⅿ 82 2 8559 216f ⅰ 27 2 8560 2170 ⅱ 44 2 8561 2171 ⅲ 61 2 8562 2172 ⅳ 77 2 8563 2173 ⅴ 57 0 8564 2174 ⅵ 77 2 8565 2175 ⅶ 94 2 8566 2176 ⅷ 112 2 8567 2177 ⅸ 78 2 8568 2178 ⅹ 56 0 8569 2179 ⅺ 78 2 8570 217a ⅻ 95 2 8571 217b ⅼ 27 2 8572 217c ⅽ 52 0 8573 217d ⅾ 61 2 8574 217e ⅿ 92 0 8575 217f ↀ 118 2 8576 2180 Ↄ 66 2 8579 2183 ∂ 49 2 8706 2202 pd " ∃ 60 2 8707 2203 te " ∆ 64 2 8710 2206 ∇ 64 2 8711 2207 gr " ∊ 75 0 8714 220a ∍ 75 0 8717 220d st " ∏ 72 3 8719 220f ∐ 72 3 8720 2210 ∑ 64 3 8721 2211 − 80 0 8722 2212 ∓ 80 2 8723 2213 ∕ 16 2 8725 2215 ∗ 59 0 8727 2217 ** " ∘ 59 0 8728 2218 ∙ 30 0 8729 2219 bu " √ 61 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 70 0 8743 2227 l∧ 70 0 8743 2227 " ∨ 70 0 8744 2228 l| " ∩ 70 0 8745 2229 ca " ∪ 70 0 8746 222a cu " ∫ 49 3 8747 222b is " ∬ 81 3 8748 222c ∭ 112 3 8749 222d ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≣ 80 2 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 49 2 8977 2311 ⌘ 95 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 50 3 8992 2320 ⌡ 48 3 8993 2321 ⌥ 95 2 8997 2325 〈 38 3 9001 2329 〉 37 3 9002 232a ⍽ 72 1 9085 237d ⎮ 49 3 9134 23ae ⏏ 73 0 9167 23cf ␢ 60 2 9250 2422 ␣ 60 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 56 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 56 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⚀ 83 2 9856 2680 ⚁ 83 2 9857 2681 ⚂ 83 2 9858 2682 ⚃ 83 2 9859 2683 ⚄ 83 2 9860 2684 ⚅ 83 2 9861 2685 ⟠ 47 3 10208 27e0 ⟨ 38 3 10216 27e8 ⟩ 37 3 10217 27e9 ⟪ 53 3 10218 27ea ⟫ 52 3 10219 27eb ⧫ 47 3 10731 29eb ⨌ 144 3 10764 2a0c ⨍ 78 3 10765 2a0d ⨎ 78 3 10766 2a0e ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 62 2 64257 fb01 fl 62 2 64258 fb02 ffi 92 2 64259 fb03 ffl 92 2 64260 fb04 ﬓ 114 2 64275 fb13 ﬔ 114 2 64276 fb14 ﬕ 114 3 64277 fb15 ﬖ 113 3 64278 fb16 ﬗ 145 3 64279 fb17 � 98 3 65533 fffd 9base-6/troff/font/devutf/DejaVuMonoSansOblique0000644000175000017500000005605711402154555021246 0ustar anselmanselmname DejaVuMonoSansOblique fontname DejaVuMonoSansOblique spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 0 60 003c = 60 0 61 003d > 60 0 62 003e ? 60 2 63 003f @ 60 3 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e   60 0 160 00a0 ¡ 60 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 0 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 3 188 00bc ½ 60 3 189 00bd ¾ 60 3 190 00be ¿ 60 2 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 0 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f Ɓ 60 2 385 0181 Ƃ 60 2 386 0182 ƃ 60 2 387 0183 Ƅ 60 2 388 0184 ƅ 60 2 389 0185 Ɔ 60 2 390 0186 Ƈ 60 2 391 0187 ƈ 60 2 392 0188 Ɖ 60 2 393 0189 Ɗ 60 2 394 018a Ƌ 60 2 395 018b ƌ 60 2 396 018c ƍ 60 2 397 018d Ǝ 60 2 398 018e Ə 60 2 399 018f Ɛ 60 2 400 0190 Ƒ 60 3 401 0191 ƒ 60 3 402 0192 Ɠ 60 2 403 0193 Ɣ 60 3 404 0194 ƕ 60 2 405 0195 Ɩ 60 2 406 0196 Ɨ 60 2 407 0197 Ƙ 60 2 408 0198 ƙ 60 2 409 0199 ƚ 60 2 410 019a ƛ 60 2 411 019b Ɯ 60 2 412 019c Ɲ 60 3 413 019d ƞ 60 1 414 019e Ɵ 60 2 415 019f Ơ 60 2 416 01a0 ơ 60 0 417 01a1 Ƣ 60 2 418 01a2 ƣ 60 1 419 01a3 Ƥ 60 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 60 3 426 01aa ƫ 60 3 427 01ab Ƭ 60 2 428 01ac ƭ 60 2 429 01ad Ʈ 60 3 430 01ae Ư 60 2 431 01af ư 60 0 432 01b0 Ʊ 60 2 433 01b1 Ʋ 60 2 434 01b2 Ƴ 60 2 435 01b3 ƴ 60 1 436 01b4 Ƶ 60 2 437 01b5 ƶ 60 0 438 01b6 Ʒ 60 2 439 01b7 Ƹ 60 2 440 01b8 ƹ 60 1 441 01b9 ƻ 60 2 443 01bb Ƽ 60 2 444 01bc ƽ 60 1 445 01bd ƾ 60 2 446 01be ǀ 60 2 448 01c0 ǁ 60 2 449 01c1 ǂ 60 2 450 01c2 ǃ 60 2 451 01c3 Ǎ 60 2 461 01cd ǎ 60 2 462 01ce Ǐ 60 2 463 01cf ǐ 60 2 464 01d0 Ǒ 60 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 60 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 60 2 471 01d7 ǘ 60 2 472 01d8 Ǚ 60 2 473 01d9 ǚ 60 2 474 01da Ǜ 60 2 475 01db ǜ 60 2 476 01dc ǝ 60 0 477 01dd ǟ 60 2 479 01df Ǣ 60 2 482 01e2 ǣ 60 2 483 01e3 Ǫ 60 3 490 01ea ǫ 60 1 491 01eb Ǭ 60 3 492 01ec ǭ 60 3 493 01ed Ƕ 60 2 502 01f6 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b Ȥ 60 3 548 0224 ȥ 60 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 60 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 60 2 562 0232 ȳ 60 3 563 0233 ȷ 60 1 567 0237 ȸ 60 2 568 0238 ȹ 60 1 569 0239 Ⱥ 60 2 570 023a Ȼ 60 2 571 023b ȼ 60 0 572 023c Ƚ 60 2 573 023d Ⱦ 60 2 574 023e ȿ 60 1 575 023f ɀ 60 1 576 0240 Ɂ 60 2 577 0241 ɐ 60 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 60 0 596 0254 ɕ 60 1 597 0255 ɖ 60 3 598 0256 ɗ 60 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 60 0 602 025a ɛ 60 0 603 025b ɜ 60 0 604 025c ɝ 60 0 605 025d ɞ 60 0 606 025e ɟ 60 1 607 025f ɠ 60 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 60 1 611 0263 ɤ 60 0 612 0264 ɥ 60 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 60 2 616 0268 ɩ 60 0 617 0269 ɪ 60 0 618 026a ɫ 60 2 619 026b ɬ 60 2 620 026c ɭ 60 3 621 026d ɮ 60 3 622 026e ɯ 60 0 623 026f ɰ 60 1 624 0270 ɱ 60 1 625 0271 ɲ 60 1 626 0272 ɳ 60 1 627 0273 ɴ 60 0 628 0274 ɵ 60 0 629 0275 ɶ 60 0 630 0276 ɷ 60 0 631 0277 ɸ 60 3 632 0278 ɹ 60 0 633 0279 ɺ 60 1 634 027a ɻ 60 1 635 027b ɼ 60 1 636 027c ɽ 60 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 60 1 642 0282 ʃ 60 3 643 0283 ʄ 60 3 644 0284 ʅ 60 1 645 0285 ʆ 60 3 646 0286 ʇ 60 1 647 0287 ʈ 60 3 648 0288 ʉ 60 0 649 0289 ʊ 60 0 650 028a ʋ 60 0 651 028b ʌ 60 0 652 028c ʍ 60 0 653 028d ʎ 60 2 654 028e ʏ 60 0 655 028f ʐ 60 1 656 0290 ʑ 60 1 657 0291 ʒ 60 1 658 0292 ʓ 60 1 659 0293 ʔ 60 2 660 0294 ʕ 60 2 661 0295 ʖ 60 2 662 0296 ʗ 60 3 663 0297 ʘ 60 0 664 0298 ʙ 60 0 665 0299 ʚ 60 0 666 029a ʛ 60 2 667 029b ʜ 60 0 668 029c ʝ 60 3 669 029d ʞ 60 1 670 029e ʟ 60 0 671 029f ʠ 60 3 672 02a0 ʡ 60 2 673 02a1 ʢ 60 2 674 02a2 ʣ 60 2 675 02a3 ʤ 60 3 676 02a4 ʥ 60 3 677 02a5 ʦ 60 2 678 02a6 ʧ 60 3 679 02a7 ʨ 60 3 680 02a8 ʩ 60 3 681 02a9 ʪ 60 2 682 02aa ʫ 60 2 683 02ab ʬ 60 2 684 02ac ʭ 60 2 685 02ad ʮ 60 3 686 02ae ʯ 60 3 687 02af ʰ 60 2 688 02b0 ʱ 60 2 689 02b1 ʲ 60 2 690 02b2 ʳ 60 2 691 02b3 ʴ 60 2 692 02b4 ʵ 60 2 693 02b5 ʶ 60 2 694 02b6 ʷ 60 2 695 02b7 ʸ 60 2 696 02b8 ʻ 60 2 699 02bb ʼ 60 2 700 02bc ʾ 60 2 702 02be ʿ 60 2 703 02bf ˀ 60 2 704 02c0 ˁ 60 2 705 02c1 ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˈ 60 2 712 02c8 ˌ 60 1 716 02cc ː 60 0 720 02d0 ˑ 60 0 721 02d1 ˒ 60 0 722 02d2 ˓ 60 0 723 02d3 ˖ 60 0 726 02d6 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ˞ 60 0 734 02de ˠ 60 2 736 02e0 ˡ 60 2 737 02e1 ˢ 60 2 738 02e2 ˣ 60 2 739 02e3 ˤ 60 2 740 02e4 ˥ 60 2 741 02e5 ˦ 60 2 742 02e6 ˧ 60 2 743 02e7 ˨ 60 2 744 02e8 ˩ 60 2 745 02e9 ́ 60 2 769 0301 ̂ 60 2 770 0302 ̃ 60 2 771 0303 ̄ 60 2 772 0304 ̅ 60 2 773 0305 ̆ 60 2 774 0306 ̇ 60 2 775 0307 ̈ 60 2 776 0308 ̉ 60 2 777 0309 ̊ 60 2 778 030a ̋ 60 2 779 030b ̌ 60 2 780 030c ̍ 60 2 781 030d ̎ 60 2 782 030e ̏ 60 2 783 030f ̐ 60 2 784 0310 ̑ 60 2 785 0311 ̒ 60 2 786 0312 ̓ 60 2 787 0313 ̔ 60 2 788 0314 ̕ 60 2 789 0315 ̖ 60 1 790 0316 ̗ 60 1 791 0317 ̘ 60 1 792 0318 ̙ 60 1 793 0319 ̚ 60 2 794 031a ̛ 60 0 795 031b ̜ 60 1 796 031c ̝ 60 1 797 031d ̞ 60 1 798 031e ̟ 60 1 799 031f ̠ 60 1 800 0320 ̡ 60 1 801 0321 ̢ 60 1 802 0322 ̣ 60 1 803 0323 ̤ 60 1 804 0324 ̥ 60 1 805 0325 ̦ 60 1 806 0326 ̧ 60 1 807 0327 ̨ 60 1 808 0328 ̩ 60 1 809 0329 ̪ 60 1 810 032a ̫ 60 1 811 032b ̬ 60 1 812 032c ̭ 60 1 813 032d ̮ 60 1 814 032e ̯ 60 1 815 032f ̰ 60 1 816 0330 ̱ 60 1 817 0331 ̲ 60 1 818 0332 ̳ 60 1 819 0333 ̴ 60 0 820 0334 ̵ 60 0 821 0335 ̶ 60 0 822 0336 ̷ 60 0 823 0337 ̸ 60 2 824 0338 ̹ 60 1 825 0339 ̺ 60 1 826 033a ̻ 60 1 827 033b ̼ 60 1 828 033c ̽ 60 2 829 033d ̾ 60 2 830 033e ̿ 60 2 831 033f ͘ 60 2 856 0358 ͡ 60 2 865 0361 ʹ 60 2 884 0374 ͵ 60 1 885 0375 ͺ 60 1 890 037a ; 60 1 894 037e ΄ 60 2 900 0384 ΅ 60 2 901 0385 Ά 60 2 902 0386 · 60 0 903 0387 Έ 60 2 904 0388 Ή 60 2 905 0389 Ί 60 2 906 038a Ό 60 2 908 038c Ύ 60 2 910 038e Ώ 60 2 911 038f ΐ 60 2 912 0390 Α 60 2 913 0391 Β 60 2 914 0392 Γ 60 2 915 0393 Δ 60 2 916 0394 Ε 60 2 917 0395 Ζ 60 2 918 0396 Η 60 2 919 0397 Θ 60 2 920 0398 Ι 60 2 921 0399 Κ 60 2 922 039a Λ 60 2 923 039b Μ 60 2 924 039c Ν 60 2 925 039d Ξ 60 2 926 039e Ο 60 2 927 039f Π 60 2 928 03a0 Ρ 60 2 929 03a1 Σ 60 2 931 03a3 Τ 60 2 932 03a4 Υ 60 2 933 03a5 Φ 60 2 934 03a6 Χ 60 2 935 03a7 Ψ 60 2 936 03a8 Ω 60 2 937 03a9 Ϊ 60 2 938 03aa Ϋ 60 2 939 03ab ά 60 2 940 03ac έ 60 2 941 03ad ή 60 3 942 03ae ί 60 2 943 03af ΰ 60 2 944 03b0 α 60 0 945 03b1 β 60 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 60 0 949 03b5 ζ 60 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 60 0 953 03b9 κ 60 0 954 03ba λ 60 2 955 03bb μ 60 1 956 03bc ν 60 0 957 03bd ξ 60 3 958 03be ο 60 0 959 03bf π 60 0 960 03c0 ρ 60 1 961 03c1 ς 60 1 962 03c2 σ 60 0 963 03c3 τ 60 0 964 03c4 υ 60 0 965 03c5 φ 60 1 966 03c6 χ 60 1 967 03c7 ψ 60 1 968 03c8 ω 60 0 969 03c9 ϊ 60 2 970 03ca ϋ 60 2 971 03cb ό 60 2 972 03cc ύ 60 2 973 03cd ώ 60 2 974 03ce ϐ 60 2 976 03d0 ϑ 60 2 977 03d1 ϒ 60 2 978 03d2 ϓ 60 2 979 03d3 ϔ 60 2 980 03d4 ϕ 60 3 981 03d5 ϖ 60 0 982 03d6 ϗ 60 1 983 03d7 Ϙ 60 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 60 3 986 03da ϛ 60 1 987 03db Ϝ 60 2 988 03dc ϝ 60 3 989 03dd Ϟ 60 2 990 03de ϟ 60 2 991 03df Ϡ 60 3 992 03e0 ϡ 60 1 993 03e1 ϰ 60 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 60 0 1010 03f2 ϳ 60 3 1011 03f3 ϴ 60 2 1012 03f4 ϵ 60 0 1013 03f5 ϶ 60 0 1014 03f6 Ϸ 60 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 60 2 1017 03f9 Ϻ 60 2 1018 03fa ϻ 60 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 60 2 1021 03fd Ͼ 60 2 1022 03fe Ͽ 60 2 1023 03ff Ё 60 2 1025 0401 Ђ 60 3 1026 0402 Ѓ 60 2 1027 0403 Є 60 2 1028 0404 Ѕ 60 2 1029 0405 І 60 2 1030 0406 Ї 60 2 1031 0407 Ј 60 2 1032 0408 Љ 60 2 1033 0409 Њ 60 2 1034 040a Ћ 60 2 1035 040b Ќ 60 2 1036 040c Ѝ 60 2 1037 040d Ў 60 2 1038 040e Џ 60 3 1039 040f А 60 2 1040 0410 Б 60 2 1041 0411 В 60 2 1042 0412 Г 60 2 1043 0413 Д 60 3 1044 0414 Е 60 2 1045 0415 Ж 60 2 1046 0416 З 60 2 1047 0417 И 60 2 1048 0418 Й 60 2 1049 0419 К 60 2 1050 041a Л 60 2 1051 041b М 60 2 1052 041c Н 60 2 1053 041d О 60 2 1054 041e П 60 2 1055 041f Р 60 2 1056 0420 С 60 2 1057 0421 Т 60 2 1058 0422 У 60 2 1059 0423 Ф 60 3 1060 0424 Х 60 2 1061 0425 Ц 60 3 1062 0426 Ч 60 2 1063 0427 Ш 60 2 1064 0428 Щ 60 3 1065 0429 Ъ 60 2 1066 042a Ы 60 2 1067 042b Ь 60 2 1068 042c Э 60 2 1069 042d Ю 60 2 1070 042e Я 60 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 60 0 1074 0432 г 60 0 1075 0433 д 60 1 1076 0434 е 60 0 1077 0435 ж 60 0 1078 0436 з 60 0 1079 0437 и 60 0 1080 0438 й 60 2 1081 0439 к 60 0 1082 043a л 60 0 1083 043b м 60 0 1084 043c н 60 0 1085 043d о 60 0 1086 043e п 60 0 1087 043f р 60 1 1088 0440 с 60 0 1089 0441 т 60 0 1090 0442 у 60 1 1091 0443 ф 60 3 1092 0444 х 60 0 1093 0445 ц 60 1 1094 0446 ч 60 0 1095 0447 ш 60 0 1096 0448 щ 60 1 1097 0449 ъ 60 0 1098 044a ы 60 0 1099 044b ь 60 0 1100 044c э 60 0 1101 044d ю 60 0 1102 044e я 60 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 60 3 1106 0452 ѓ 60 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 60 2 1110 0456 ї 60 2 1111 0457 ј 60 3 1112 0458 љ 60 0 1113 0459 њ 60 0 1114 045a ћ 60 2 1115 045b ќ 60 2 1116 045c ѝ 60 2 1117 045d ў 60 3 1118 045e џ 60 1 1119 045f Ґ 60 2 1168 0490 ґ 60 2 1169 0491 Ғ 60 2 1170 0492 ғ 60 0 1171 0493 Қ 60 3 1178 049a қ 60 1 1179 049b Ҳ 60 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 60 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 60 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 60 2 1236 04d4 ӕ 60 0 1237 04d5 Ӗ 60 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 60 2 1248 04e0 ӡ 60 1 1249 04e1 Ӧ 60 2 1254 04e6 ӧ 60 2 1255 04e7 ᴂ 60 0 7426 1d02 ᴈ 60 0 7432 1d08 ᴉ 60 1 7433 1d09 ᴔ 60 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 60 0 7453 1d1d ᴞ 60 0 7454 1d1e ᴟ 60 0 7455 1d1f ᵃ 60 2 7491 1d43 ᵄ 60 2 7492 1d44 ᵅ 60 2 7493 1d45 ᵆ 60 2 7494 1d46 ᵇ 60 2 7495 1d47 ᵈ 60 2 7496 1d48 ᵉ 60 2 7497 1d49 ᵊ 60 2 7498 1d4a ᵋ 60 2 7499 1d4b ᵌ 60 2 7500 1d4c ᵍ 60 2 7501 1d4d ᵎ 60 2 7502 1d4e ᵏ 60 2 7503 1d4f ᵐ 60 2 7504 1d50 ᵑ 60 2 7505 1d51 ᵒ 60 2 7506 1d52 ᵓ 60 2 7507 1d53 ᵔ 60 2 7508 1d54 ᵕ 60 0 7509 1d55 ᵖ 60 2 7510 1d56 ᵗ 60 2 7511 1d57 ᵘ 60 2 7512 1d58 ᵙ 60 0 7513 1d59 ᵚ 60 2 7514 1d5a ᵛ 60 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 60 0 7547 1d7b ᶅ 60 3 7557 1d85 ᶛ 60 2 7579 1d9b ᶜ 60 2 7580 1d9c ᶝ 60 2 7581 1d9d ᶞ 60 2 7582 1d9e ᶟ 60 2 7583 1d9f ᶠ 60 2 7584 1da0 ᶡ 60 2 7585 1da1 ᶢ 60 2 7586 1da2 ᶣ 60 2 7587 1da3 ᶤ 60 2 7588 1da4 ᶥ 60 2 7589 1da5 ᶦ 60 2 7590 1da6 ᶧ 60 2 7591 1da7 ᶨ 60 2 7592 1da8 ᶩ 60 2 7593 1da9 ᶪ 60 2 7594 1daa ᶫ 60 2 7595 1dab ᶬ 60 2 7596 1dac ᶭ 60 2 7597 1dad ᶮ 60 2 7598 1dae ᶯ 60 2 7599 1daf ᶰ 60 2 7600 1db0 ᶱ 60 2 7601 1db1 ᶲ 60 2 7602 1db2 ᶳ 60 2 7603 1db3 ᶴ 60 2 7604 1db4 ᶵ 60 2 7605 1db5 ᶶ 60 2 7606 1db6 ᶷ 60 2 7607 1db7 ᶹ 60 2 7609 1db9 ᶺ 60 2 7610 1dba ᶻ 60 2 7611 1dbb ᶼ 60 2 7612 1dbc ᶽ 60 2 7613 1dbd ᶾ 60 2 7614 1dbe ᶿ 60 2 7615 1dbf Ḍ 60 3 7692 1e0c ḍ 60 3 7693 1e0d Ḓ 60 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 60 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 60 3 7734 1e36 ḷ 60 3 7735 1e37 Ḹ 60 3 7736 1e38 ḹ 60 3 7737 1e39 Ḽ 60 3 7740 1e3c ḽ 60 3 7741 1e3d ṁ 60 2 7745 1e41 Ṃ 60 3 7746 1e42 ṃ 60 1 7747 1e43 Ṅ 60 2 7748 1e44 ṅ 60 2 7749 1e45 Ṇ 60 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 60 3 7754 1e4a ṋ 60 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 60 3 7770 1e5a ṛ 60 1 7771 1e5b Ṝ 60 3 7772 1e5c ṝ 60 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 60 3 7788 1e6c ṭ 60 3 7789 1e6d Ṱ 60 3 7792 1e70 ṱ 60 3 7793 1e71 Ṿ 60 3 7806 1e7e ṿ 60 1 7807 1e7f Ẁ 60 2 7808 1e80 ẁ 60 2 7809 1e81 Ẃ 60 2 7810 1e82 ẃ 60 2 7811 1e83 Ẅ 60 2 7812 1e84 ẅ 60 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 60 3 7882 1eca ị 60 3 7883 1ecb Ọ 60 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 60 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 60 2 7922 1ef2 ỳ 60 3 7923 1ef3 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‗ 60 1 8215 2017 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 2 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e ‟ 60 2 8223 201f † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 ‣ 60 0 8227 2023 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‱ 60 2 8241 2031 ‹ 60 0 8249 2039 › 60 0 8250 203a ‼ 60 2 8252 203c ‾ 60 2 8254 203e ⁇ 60 2 8263 2047 ⁈ 60 2 8264 2048 ⁉ 60 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 60 2 8319 207f ₦ 60 2 8358 20a6 € 60 2 8364 20ac ₵ 60 3 8373 20b5 ™ 60 2 8482 2122 tm " Ω 60 2 8486 2126 K 60 2 8490 212a Å 60 2 8491 212b ∂ 60 2 8706 2202 pd " ∆ 60 2 8710 2206 ∇ 60 2 8711 2207 gr " ∏ 60 3 8719 220f ∑ 60 3 8721 2211 − 60 0 8722 2212 ∕ 60 3 8725 2215 ∙ 60 0 8729 2219 bu " √ 60 2 8730 221a sr " ∝ 60 0 8733 221d pt " ∞ 60 0 8734 221e if " ∟ 60 2 8735 221f ∠ 60 2 8736 2220 an " ∧ 60 0 8743 2227 l∧ 60 0 8743 2227 " ∨ 60 0 8744 2228 l| " ∩ 60 0 8745 2229 ca " ∪ 60 0 8746 222a cu " ∫ 60 3 8747 222b is " ≈ 60 0 8776 2248 ~~ " ≠ 60 2 8800 2260 != " ≡ 60 0 8801 2261 == " ≤ 60 0 8804 2264 ≥ 60 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 60 0 8976 2310 ⌑ 60 2 8977 2311 ⌙ 60 0 8985 2319 ⌠ 60 3 8992 2320 ⌡ 60 3 8993 2321 ⍽ 60 1 9085 237d ⎮ 60 3 9134 23ae ⏏ 60 0 9167 23cf ␣ 60 1 9251 2423 ━ 60 0 9473 2501 │ 60 3 9474 2502 ┃ 60 3 9475 2503 ┄ 60 0 9476 2504 ┅ 60 0 9477 2505 ┆ 60 3 9478 2506 ┇ 60 3 9479 2507 ┈ 60 0 9480 2508 ┉ 60 0 9481 2509 ┊ 60 3 9482 250a ┋ 60 3 9483 250b ┌ 60 1 9484 250c ┍ 60 1 9485 250d ┎ 60 1 9486 250e ┏ 60 1 9487 250f ┐ 60 1 9488 2510 ┑ 60 1 9489 2511 ┒ 60 1 9490 2512 ┓ 60 1 9491 2513 └ 60 2 9492 2514 ┕ 60 2 9493 2515 ┖ 60 2 9494 2516 ┗ 60 2 9495 2517 ┘ 60 2 9496 2518 ┙ 60 2 9497 2519 ┚ 60 2 9498 251a ┛ 60 2 9499 251b ├ 60 3 9500 251c ┝ 60 3 9501 251d ┞ 60 3 9502 251e ┟ 60 3 9503 251f ┠ 60 3 9504 2520 ┡ 60 3 9505 2521 ┢ 60 3 9506 2522 ┣ 60 3 9507 2523 ┤ 60 3 9508 2524 ┥ 60 3 9509 2525 ┦ 60 3 9510 2526 ┧ 60 3 9511 2527 ┨ 60 3 9512 2528 ┩ 60 3 9513 2529 ┪ 60 3 9514 252a ┫ 60 3 9515 252b ┬ 60 1 9516 252c ┭ 60 1 9517 252d ┮ 60 1 9518 252e ┯ 60 1 9519 252f ┰ 60 1 9520 2530 ┱ 60 1 9521 2531 ┲ 60 1 9522 2532 ┳ 60 1 9523 2533 ┴ 60 2 9524 2534 ┵ 60 2 9525 2535 ┶ 60 2 9526 2536 ┷ 60 2 9527 2537 ┸ 60 2 9528 2538 ┹ 60 2 9529 2539 ┺ 60 2 9530 253a ┻ 60 2 9531 253b ┼ 60 3 9532 253c ┽ 60 3 9533 253d ┾ 60 3 9534 253e ┿ 60 3 9535 253f ╀ 60 3 9536 2540 ╁ 60 3 9537 2541 ╂ 60 3 9538 2542 ╃ 60 3 9539 2543 ╄ 60 3 9540 2544 ╅ 60 3 9541 2545 ╆ 60 3 9542 2546 ╇ 60 3 9543 2547 ╈ 60 3 9544 2548 ╉ 60 3 9545 2549 ╊ 60 3 9546 254a ╋ 60 3 9547 254b ╌ 60 0 9548 254c ╍ 60 0 9549 254d ╎ 60 3 9550 254e ╏ 60 3 9551 254f ═ 60 0 9552 2550 ║ 60 3 9553 2551 ╒ 60 1 9554 2552 ╓ 60 1 9555 2553 ╔ 60 1 9556 2554 ╕ 60 1 9557 2555 ╖ 60 1 9558 2556 ╗ 60 1 9559 2557 ╘ 60 2 9560 2558 ╙ 60 2 9561 2559 ╚ 60 2 9562 255a ╛ 60 2 9563 255b ╜ 60 2 9564 255c ╝ 60 2 9565 255d ╞ 60 3 9566 255e ╟ 60 3 9567 255f ╠ 60 3 9568 2560 ╡ 60 3 9569 2561 ╢ 60 3 9570 2562 ╣ 60 3 9571 2563 ╤ 60 1 9572 2564 ╥ 60 1 9573 2565 ╦ 60 1 9574 2566 ╧ 60 2 9575 2567 ╨ 60 2 9576 2568 ╩ 60 2 9577 2569 ╪ 60 3 9578 256a ╫ 60 3 9579 256b ╬ 60 3 9580 256c ╭ 60 1 9581 256d ╮ 60 1 9582 256e ╯ 60 2 9583 256f ╰ 60 2 9584 2570 ╱ 60 3 9585 2571 ╲ 60 3 9586 2572 ╳ 60 3 9587 2573 ╴ 60 0 9588 2574 ╵ 60 2 9589 2575 ╶ 60 0 9590 2576 ╷ 60 1 9591 2577 ╸ 60 0 9592 2578 ╹ 60 2 9593 2579 ╺ 60 0 9594 257a ╻ 60 1 9595 257b ╼ 60 0 9596 257c ╽ 60 3 9597 257d ╾ 60 0 9598 257e ╿ 60 3 9599 257f ▀ 60 2 9600 2580 ▁ 60 1 9601 2581 ▂ 60 1 9602 2582 ▃ 60 1 9603 2583 ▄ 60 1 9604 2584 ▅ 60 1 9605 2585 ▆ 60 1 9606 2586 ▇ 60 3 9607 2587 █ 60 3 9608 2588 ▉ 60 3 9609 2589 ▊ 60 3 9610 258a ▋ 60 3 9611 258b ▌ 60 3 9612 258c ▍ 60 3 9613 258d ▎ 60 3 9614 258e ▏ 60 3 9615 258f ▐ 60 3 9616 2590 ░ 60 3 9617 2591 ▒ 60 3 9618 2592 ▓ 60 3 9619 2593 ▔ 60 2 9620 2594 ▕ 60 3 9621 2595 ▖ 60 1 9622 2596 ▗ 60 1 9623 2597 ▘ 60 2 9624 2598 ▙ 60 3 9625 2599 ▚ 60 3 9626 259a ▛ 60 3 9627 259b ▜ 60 3 9628 259c ▝ 60 2 9629 259d ▞ 60 3 9630 259e ▟ 60 3 9631 259f ■ 60 0 9632 25a0 □ 60 0 9633 25a1 ▢ 60 0 9634 25a2 ▣ 60 0 9635 25a3 ▤ 60 0 9636 25a4 ▥ 60 0 9637 25a5 ▦ 60 0 9638 25a6 ▧ 60 0 9639 25a7 ▨ 60 0 9640 25a8 ▩ 60 0 9641 25a9 ▪ 60 0 9642 25aa ▫ 60 0 9643 25ab ▬ 60 0 9644 25ac ▭ 60 0 9645 25ad ▮ 60 0 9646 25ae ▯ 60 0 9647 25af ▰ 60 0 9648 25b0 ▱ 60 0 9649 25b1 ▲ 60 0 9650 25b2 △ 60 0 9651 25b3 ▴ 60 0 9652 25b4 ▵ 60 0 9653 25b5 ▶ 60 0 9654 25b6 ▷ 60 0 9655 25b7 ▸ 60 0 9656 25b8 ▹ 60 0 9657 25b9 ► 60 0 9658 25ba ▻ 60 0 9659 25bb ▼ 60 0 9660 25bc ▽ 60 0 9661 25bd ▾ 60 0 9662 25be ▿ 60 0 9663 25bf ◀ 60 0 9664 25c0 ◁ 60 0 9665 25c1 ◂ 60 0 9666 25c2 ◃ 60 0 9667 25c3 ◄ 60 0 9668 25c4 ◅ 60 0 9669 25c5 ◆ 60 0 9670 25c6 ◇ 60 0 9671 25c7 ◈ 60 0 9672 25c8 ◉ 60 0 9673 25c9 ◊ 60 3 9674 25ca ○ 60 0 9675 25cb ◌ 60 0 9676 25cc ◍ 60 0 9677 25cd ◎ 60 0 9678 25ce ● 60 0 9679 25cf ◐ 60 0 9680 25d0 ◑ 60 0 9681 25d1 ◒ 60 0 9682 25d2 ◓ 60 0 9683 25d3 ◔ 60 0 9684 25d4 ◕ 60 0 9685 25d5 ◖ 60 0 9686 25d6 ◗ 60 0 9687 25d7 ◘ 60 2 9688 25d8 ◙ 60 3 9689 25d9 ◚ 60 2 9690 25da ◛ 60 1 9691 25db ◜ 60 0 9692 25dc ◝ 60 0 9693 25dd ◞ 60 0 9694 25de ◟ 60 0 9695 25df ◠ 60 0 9696 25e0 ◡ 60 0 9697 25e1 ◢ 60 0 9698 25e2 ◣ 60 0 9699 25e3 ◤ 60 0 9700 25e4 ◥ 60 0 9701 25e5 ◦ 60 0 9702 25e6 ◧ 60 0 9703 25e7 ◨ 60 0 9704 25e8 ◩ 60 0 9705 25e9 ◪ 60 0 9706 25ea ◫ 60 0 9707 25eb ◬ 60 0 9708 25ec ◭ 60 0 9709 25ed ◮ 60 0 9710 25ee ◯ 60 1 9711 25ef ◰ 60 0 9712 25f0 ◱ 60 0 9713 25f1 ◲ 60 0 9714 25f2 ◳ 60 0 9715 25f3 ◴ 60 0 9716 25f4 ◵ 60 0 9717 25f5 ◶ 60 0 9718 25f6 ◷ 60 0 9719 25f7 ◸ 60 0 9720 25f8 ◹ 60 0 9721 25f9 ◺ 60 0 9722 25fa ◻ 60 0 9723 25fb ◼ 60 0 9724 25fc ◽ 60 0 9725 25fd ◾ 60 0 9726 25fe ◿ 60 0 9727 25ff ☸ 60 2 9784 2638 ⟠ 60 3 10208 27e0 ⧫ 60 3 10731 29eb ⬒ 60 0 11026 2b12 ⬓ 60 0 11027 2b13 fi 60 2 64257 fb01 fl 60 2 64258 fb02 � 60 3 65533 fffd 9base-6/troff/font/devutf/GR0000644000175000017500000000155111402154555015366 0ustar anselmanselmname GR fontname Symbol named in prologue spacewidth 25 charset *A 72 2 65 Α " *B 67 2 66 Β " *X 72 2 67 Χ " *D 61 2 68 Δ " *E 61 2 69 Ε " *F 76 2 70 Φ " *G 60 2 71 Γ " *Y 72 2 72 Η " *I 33 2 73 Ι " *K 72 2 75 Κ " *L 69 2 76 Λ " *M 89 2 77 Μ " *N 72 2 78 Ν " Ν " *O 72 2 79 Ο " *P 77 2 80 Π " *H 74 2 81 Θ " *R 56 2 82 Ρ " *S 59 2 83 Σ " Σ " *T 61 2 84 Τ " Τ " *U 69 2 85 Υ " Υ " *W 77 2 87 Ω " *C 65 2 88 Ξ " *Q 80 2 89 Ψ " *Z 61 2 90 Ζ " *a 63 0 97 α " *b 55 3 98 β " *x 55 1 99 χ " *d 49 2 100 δ " *e 44 0 101 ε " *f 52 3 102 φ " *g 41 1 103 γ " *y 60 1 104 η " *i 33 0 105 ι " *k 55 0 107 κ " *l 55 2 108 λ " *m 58 1 109 μ " *n 52 0 110 ν " *o 55 0 111 ο " *p 55 0 112 π " *h 52 2 113 θ " *r 55 1 114 ρ " *s 60 0 115 σ " *t 44 0 116 τ " *u 58 0 117 υ " *w 69 0 119 ω " *c 49 3 120 ξ " *q 69 1 121 ψ " *z 49 3 122 ζ " 9base-6/troff/font/devutf/DejaVuSansBoldOblique0000644000175000017500000007314411402154555021212 0ustar anselmanselmname DejaVuSansBoldOblique fontname DejaVuSansBoldOblique spacewidth 35 charset ! 46 2 33 0021 " 52 2 34 0022 dq " dq " # 70 2 35 0023 $ 70 3 36 0024 % 100 2 37 0025 & 87 2 38 0026 ( 46 3 40 0028 ) 46 3 41 0029 * 52 2 42 002a + 84 2 43 002b , 38 1 44 002c - 42 0 45 002d . 38 0 46 002e / 37 3 47 002f 0 70 2 48 0030 1 70 2 49 0031 2 70 2 50 0032 3 70 2 51 0033 4 70 2 52 0034 5 70 2 53 0035 6 70 2 54 0036 7 70 2 55 0037 8 70 2 56 0038 9 70 2 57 0039 : 40 0 58 003a ; 40 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 58 2 63 003f @ 100 3 64 0040 A 77 2 65 0041 B 76 2 66 0042 C 73 2 67 0043 D 83 2 68 0044 E 68 2 69 0045 F 68 2 70 0046 G 82 2 71 0047 H 84 2 72 0048 I 37 2 73 0049 J 37 3 74 004a K 77 2 75 004b L 64 2 76 004c M 100 2 77 004d N 84 2 78 004e O 85 2 79 004f P 73 2 80 0050 Q 85 3 81 0051 R 77 2 82 0052 S 72 2 83 0053 T 68 2 84 0054 U 81 2 85 0055 V 77 2 86 0056 W 110 2 87 0057 X 77 2 88 0058 Y 72 2 89 0059 Z 73 2 90 005a [ 46 3 91 005b \ 37 3 92 005c bs " ] 46 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 67 0 97 0061 b 72 2 98 0062 c 59 0 99 0063 d 72 2 100 0064 e 68 0 101 0065 f 44 2 102 0066 g 72 1 103 0067 h 71 2 104 0068 i 34 2 105 0069 j 34 3 106 006a k 67 2 107 006b l 34 2 108 006c m 104 0 109 006d n 71 0 110 006e o 69 0 111 006f p 72 1 112 0070 q 72 1 113 0071 r 49 0 114 0072 s 60 0 115 0073 t 48 2 116 0074 u 71 0 117 0075 v 65 0 118 0076 w 92 0 119 0077 x 65 0 120 0078 y 65 1 121 0079 z 58 0 122 007a { 71 3 123 007b | 37 3 124 007c } 71 3 125 007d ~ 84 0 126 007e   70 0 160 00a0 ¡ 46 2 161 00a1 ¢ 70 3 162 00a2 £ 70 2 163 00a3 ¤ 64 0 164 00a4 ¥ 70 2 165 00a5 ¦ 37 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 56 2 170 00aa « 65 0 171 00ab ¬ 84 0 172 00ac ­ 42 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 44 2 178 00b2 ³ 44 2 179 00b3 ´ 50 2 180 00b4 aa " µ 74 1 181 00b5 ¶ 64 3 182 00b6 · 38 0 183 00b7 ¸ 50 1 184 00b8 ¹ 44 2 185 00b9 º 56 2 186 00ba » 65 0 187 00bb ¼ 106 2 188 00bc ½ 106 2 189 00bd ¾ 106 2 190 00be ¿ 58 2 191 00bf À 77 2 192 00c0 Á 77 2 193 00c1  77 2 194 00c2 à 77 2 195 00c3 Ä 77 2 196 00c4 Å 77 2 197 00c5 Æ 108 2 198 00c6 Ç 73 3 199 00c7 È 68 2 200 00c8 É 68 2 201 00c9 Ê 68 2 202 00ca Ë 68 2 203 00cb Ì 37 2 204 00cc Í 37 2 205 00cd Î 37 2 206 00ce Ï 37 2 207 00cf Ð 85 2 208 00d0 Ñ 84 2 209 00d1 Ò 85 2 210 00d2 Ó 85 2 211 00d3 Ô 85 2 212 00d4 Õ 85 2 213 00d5 Ö 85 2 214 00d6 × 84 2 215 00d7 mu " Ø 85 2 216 00d8 Ù 81 2 217 00d9 Ú 81 2 218 00da Û 81 2 219 00db Ü 81 2 220 00dc Ý 72 2 221 00dd Þ 74 2 222 00de ß 72 2 223 00df à 67 2 224 00e0 á 67 2 225 00e1 â 67 2 226 00e2 ã 67 2 227 00e3 ä 67 2 228 00e4 å 67 2 229 00e5 æ 105 0 230 00e6 ç 59 1 231 00e7 è 68 2 232 00e8 é 68 2 233 00e9 ê 68 2 234 00ea ë 68 2 235 00eb ì 34 2 236 00ec í 34 2 237 00ed î 34 2 238 00ee ï 34 2 239 00ef ð 69 2 240 00f0 ñ 71 2 241 00f1 ò 69 2 242 00f2 ó 69 2 243 00f3 ô 69 2 244 00f4 õ 69 2 245 00f5 ö 69 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 69 0 248 00f8 ù 71 2 249 00f9 ú 71 2 250 00fa û 71 2 251 00fb ü 71 2 252 00fc ý 65 3 253 00fd þ 72 3 254 00fe ÿ 65 3 255 00ff ā 67 2 257 0101 Ă 77 2 258 0102 ă 67 2 259 0103 Ą 77 3 260 0104 ą 67 1 261 0105 Ć 73 2 262 0106 ć 59 2 263 0107 Ĉ 73 2 264 0108 ĉ 59 2 265 0109 Ċ 73 2 266 010a ċ 59 2 267 010b Č 73 2 268 010c č 59 2 269 010d Ď 83 2 270 010e ď 72 2 271 010f Đ 85 2 272 0110 đ 72 2 273 0111 Ē 68 2 274 0112 ē 68 2 275 0113 Ĕ 68 2 276 0114 ĕ 68 2 277 0115 Ė 68 2 278 0116 ė 68 2 279 0117 Ę 68 3 280 0118 ę 68 1 281 0119 Ě 68 2 282 011a ě 68 2 283 011b Ĝ 82 2 284 011c ĝ 72 3 285 011d Ğ 82 2 286 011e ğ 72 3 287 011f Ġ 82 2 288 0120 ġ 72 3 289 0121 Ģ 82 3 290 0122 ģ 72 3 291 0123 Ĥ 84 2 292 0124 ĥ 71 2 293 0125 Ħ 97 2 294 0126 ħ 79 2 295 0127 Ĩ 37 2 296 0128 ĩ 34 2 297 0129 Ī 37 2 298 012a ī 34 2 299 012b Ĭ 37 2 300 012c ĭ 34 2 301 012d Į 37 3 302 012e į 34 3 303 012f İ 37 2 304 0130 ı 34 0 305 0131 IJ 74 3 306 0132 ij 69 3 307 0133 Ĵ 37 3 308 0134 ĵ 34 3 309 0135 Ķ 77 3 310 0136 ķ 67 3 311 0137 ĸ 67 0 312 0138 Ĺ 64 2 313 0139 ĺ 34 2 314 013a Ļ 64 3 315 013b ļ 34 3 316 013c Ľ 64 2 317 013d ľ 46 2 318 013e Ŀ 64 2 319 013f ŀ 49 2 320 0140 Ł 66 2 321 0141 ł 38 2 322 0142 Ń 84 2 323 0143 ń 71 2 324 0144 Ņ 84 3 325 0145 ņ 71 1 326 0146 Ň 84 2 327 0147 ň 71 2 328 0148 ʼn 98 2 329 0149 Ŋ 84 3 330 014a ŋ 71 1 331 014b Ō 85 2 332 014c ō 69 2 333 014d Ŏ 85 2 334 014e ŏ 69 2 335 014f Ő 85 2 336 0150 ő 69 2 337 0151 Œ 117 2 338 0152 œ 109 0 339 0153 Ŕ 77 2 340 0154 ŕ 49 2 341 0155 Ŗ 77 3 342 0156 ŗ 49 1 343 0157 Ř 77 2 344 0158 ř 49 2 345 0159 Ś 72 2 346 015a ś 60 2 347 015b Ŝ 72 2 348 015c ŝ 60 2 349 015d Ş 72 3 350 015e ş 60 1 351 015f Š 72 2 352 0160 š 60 2 353 0161 Ţ 68 3 354 0162 ţ 48 3 355 0163 Ť 68 2 356 0164 ť 48 2 357 0165 Ŧ 68 2 358 0166 ŧ 48 2 359 0167 Ũ 81 2 360 0168 ũ 71 2 361 0169 Ū 81 2 362 016a ū 71 2 363 016b Ŭ 81 2 364 016c ŭ 71 2 365 016d Ů 81 2 366 016e ů 71 2 367 016f Ű 81 2 368 0170 ű 71 2 369 0171 Ų 81 3 370 0172 ų 71 1 371 0173 Ŵ 110 2 372 0174 ŵ 92 2 373 0175 Ŷ 72 2 374 0176 ŷ 65 3 375 0177 Ÿ 72 2 376 0178 Ź 73 2 377 0179 ź 58 2 378 017a Ż 73 2 379 017b ż 58 2 380 017c Ž 73 2 381 017d ž 58 2 382 017e ſ 44 2 383 017f ƀ 72 2 384 0180 Ɓ 81 2 385 0181 Ƃ 76 2 386 0182 ƃ 72 2 387 0183 Ƅ 76 2 388 0184 ƅ 72 2 389 0185 Ɔ 73 2 390 0186 Ƈ 73 2 391 0187 ƈ 59 2 392 0188 Ɖ 85 2 393 0189 Ɗ 88 2 394 018a Ƌ 76 2 395 018b ƌ 72 2 396 018c ƍ 69 1 397 018d Ǝ 68 2 398 018e Ə 85 2 399 018f Ɛ 70 2 400 0190 Ƒ 68 3 401 0191 ƒ 44 3 402 0192 Ɠ 82 2 403 0193 Ɣ 75 3 404 0194 ƕ 104 2 405 0195 Ɩ 44 2 406 0196 Ɨ 39 2 407 0197 Ƙ 77 2 408 0198 ƙ 67 2 409 0199 ƚ 36 2 410 019a ƛ 59 2 411 019b Ɯ 104 2 412 019c Ɲ 84 3 413 019d ƞ 71 1 414 019e Ɵ 85 2 415 019f Ơ 85 2 416 01a0 ơ 69 0 417 01a1 Ƣ 111 2 418 01a2 ƣ 96 1 419 01a3 Ƥ 78 2 420 01a4 ƥ 72 3 421 01a5 Ʀ 74 3 422 01a6 Ƨ 72 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 63 2 425 01a9 ƪ 55 3 426 01aa ƫ 48 3 427 01ab Ƭ 71 2 428 01ac ƭ 48 2 429 01ad Ʈ 68 3 430 01ae Ư 81 2 431 01af ư 71 0 432 01b0 Ʊ 77 2 433 01b1 Ʋ 81 2 434 01b2 Ƴ 72 2 435 01b3 ƴ 73 1 436 01b4 Ƶ 73 2 437 01b5 ƶ 58 0 438 01b6 Ʒ 77 2 439 01b7 Ƹ 77 2 440 01b8 ƹ 64 1 441 01b9 ƻ 70 2 443 01bb Ƽ 77 2 444 01bc ƽ 64 1 445 01bd ƾ 57 2 446 01be ǀ 37 3 448 01c0 ǁ 66 3 449 01c1 ǂ 54 3 450 01c2 ǃ 37 2 451 01c3 DŽ 155 2 452 01c4 Dž 145 2 453 01c5 dž 131 2 454 01c6 LJ 98 3 455 01c7 Lj 98 3 456 01c8 lj 67 3 457 01c9 NJ 119 3 458 01ca Nj 121 3 459 01cb nj 106 3 460 01cc Ǎ 77 2 461 01cd ǎ 67 2 462 01ce Ǐ 37 2 463 01cf ǐ 34 2 464 01d0 Ǒ 85 2 465 01d1 ǒ 69 2 466 01d2 Ǔ 81 2 467 01d3 ǔ 71 2 468 01d4 ǖ 71 2 470 01d6 Ǘ 81 2 471 01d7 ǘ 71 2 472 01d8 Ǚ 81 2 473 01d9 ǚ 71 2 474 01da Ǜ 81 2 475 01db ǜ 71 2 476 01dc ǝ 68 0 477 01dd ǟ 67 2 479 01df Ǣ 108 2 482 01e2 ǣ 105 2 483 01e3 Ǫ 85 3 490 01ea ǫ 69 1 491 01eb Ǭ 85 3 492 01ec ǭ 69 3 493 01ed DZ 155 2 497 01f1 Dz 145 2 498 01f2 dz 131 2 499 01f3 Ƕ 129 2 502 01f6 Ș 72 3 536 0218 ș 60 1 537 0219 Ț 68 3 538 021a ț 48 3 539 021b Ȥ 73 3 548 0224 ȥ 58 1 549 0225 ȫ 69 2 555 022b ȭ 69 2 557 022d Ȯ 85 2 558 022e ȯ 69 2 559 022f ȱ 69 2 561 0231 Ȳ 72 2 562 0232 ȳ 65 3 563 0233 ȷ 34 1 567 0237 ȸ 109 2 568 0238 ȹ 109 1 569 0239 Ⱥ 77 2 570 023a Ȼ 73 2 571 023b ȼ 59 0 572 023c Ƚ 64 2 573 023d Ⱦ 68 2 574 023e ȿ 60 1 575 023f ɀ 58 1 576 0240 Ɂ 78 2 577 0241 ɐ 67 0 592 0250 ɑ 72 0 593 0251 ɒ 72 0 594 0252 ɓ 72 2 595 0253 ɔ 59 0 596 0254 ɕ 59 1 597 0255 ɖ 79 3 598 0256 ɗ 79 2 599 0257 ɘ 68 0 600 0258 ə 68 0 601 0259 ɚ 88 0 602 025a ɛ 56 0 603 025b ɜ 54 0 604 025c ɝ 77 0 605 025d ɞ 68 0 606 025e ɟ 34 1 607 025f ɠ 79 3 608 0260 ɡ 72 1 609 0261 ɢ 63 0 610 0262 ɣ 73 1 611 0263 ɤ 64 1 612 0264 ɥ 71 1 613 0265 ɦ 71 2 614 0266 ɧ 71 3 615 0267 ɨ 55 2 616 0268 ɩ 44 0 617 0269 ɪ 55 0 618 026a ɫ 56 2 619 026b ɬ 69 2 620 026c ɭ 34 3 621 026d ɮ 84 3 622 026e ɯ 104 0 623 026f ɰ 104 1 624 0270 ɱ 104 1 625 0271 ɲ 71 1 626 0272 ɳ 79 1 627 0273 ɴ 64 0 628 0274 ɵ 69 0 629 0275 ɶ 91 0 630 0276 ɷ 68 0 631 0277 ɸ 77 3 632 0278 ɹ 54 0 633 0279 ɺ 54 2 634 027a ɻ 65 1 635 027b ɼ 49 1 636 027c ɽ 49 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 64 0 640 0280 ʁ 64 0 641 0281 ʂ 60 1 642 0282 ʃ 42 3 643 0283 ʄ 44 3 644 0284 ʅ 60 1 645 0285 ʆ 55 3 646 0286 ʇ 48 1 647 0287 ʈ 48 3 648 0288 ʉ 92 0 649 0289 ʊ 77 1 650 028a ʋ 67 0 651 028b ʌ 65 0 652 028c ʍ 92 0 653 028d ʎ 65 2 654 028e ʏ 72 0 655 028f ʐ 69 1 656 0290 ʑ 68 1 657 0291 ʒ 64 1 658 0292 ʓ 64 1 659 0293 ʔ 57 2 660 0294 ʕ 57 2 661 0295 ʖ 57 2 662 0296 ʗ 57 3 663 0297 ʘ 67 0 664 0298 ʙ 61 0 665 0299 ʚ 70 0 666 029a ʛ 68 2 667 029b ʜ 69 0 668 029c ʝ 34 3 669 029d ʞ 73 1 670 029e ʟ 54 0 671 029f ʠ 79 3 672 02a0 ʡ 57 2 673 02a1 ʢ 57 2 674 02a2 ʣ 116 2 675 02a3 ʤ 121 3 676 02a4 ʥ 115 3 677 02a5 ʦ 97 2 678 02a6 ʧ 77 3 679 02a7 ʨ 93 3 680 02a8 ʩ 103 3 681 02a9 ʪ 79 2 682 02aa ʫ 78 2 683 02ab ʬ 59 2 684 02ac ʭ 42 2 685 02ad ʮ 68 3 686 02ae ʯ 79 3 687 02af ʰ 46 2 688 02b0 ʱ 46 2 689 02b1 ʲ 22 2 690 02b2 ʳ 32 2 691 02b3 ʴ 32 2 692 02b4 ʵ 32 2 693 02b5 ʶ 41 2 694 02b6 ʷ 59 2 695 02b7 ʸ 42 2 696 02b8 ʻ 38 2 699 02bb ʼ 38 2 700 02bc ʾ 37 2 702 02be ʿ 37 2 703 02bf ˀ 33 2 704 02c0 ˁ 33 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 31 2 712 02c8 ˌ 31 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 37 0 722 02d2 ˓ 37 0 723 02d3 ˖ 50 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 35 0 734 02de ˠ 41 2 736 02e0 ˡ 22 2 737 02e1 ˢ 38 2 738 02e2 ˣ 41 2 739 02e3 ˤ 33 2 740 02e4 ˥ 50 2 741 02e5 ˦ 50 2 742 02e6 ˧ 50 2 743 02e7 ˨ 50 2 744 02e8 ˩ 50 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 0 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 30 2 884 0374 ͵ 30 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 44 2 900 0384 ΅ 50 2 901 0385 Ά 80 2 902 0386 · 38 0 903 0387 Έ 85 2 904 0388 Ή 101 2 905 0389 Ί 56 2 906 038a Ό 89 2 908 038c Ύ 98 2 910 038e Ώ 87 2 911 038f ΐ 39 2 912 0390 Α 77 2 913 0391 Β 76 2 914 0392 Γ 64 2 915 0393 Δ 77 2 916 0394 Ε 68 2 917 0395 Ζ 73 2 918 0396 Η 84 2 919 0397 Θ 85 2 920 0398 Ι 37 2 921 0399 Κ 77 2 922 039a Λ 77 2 923 039b Μ 100 2 924 039c Ν 84 2 925 039d Ξ 63 2 926 039e Ο 85 2 927 039f Π 84 2 928 03a0 Ρ 73 2 929 03a1 Σ 63 2 931 03a3 Τ 68 2 932 03a4 Υ 72 2 933 03a5 Φ 85 2 934 03a6 Χ 77 2 935 03a7 Ψ 79 2 936 03a8 Ω 77 2 937 03a9 Ϊ 37 2 938 03aa Ϋ 72 2 939 03ab ά 69 2 940 03ac έ 56 2 941 03ad ή 71 3 942 03ae ί 39 2 943 03af ΰ 61 2 944 03b0 α 69 0 945 03b1 β 67 3 946 03b2 γ 68 1 947 03b3 δ 69 2 948 03b4 ε 56 0 949 03b5 ζ 63 3 950 03b6 η 71 1 951 03b7 θ 67 2 952 03b8 ι 39 0 953 03b9 κ 71 0 954 03ba λ 63 2 955 03bb μ 74 1 956 03bc ν 68 0 957 03bd ξ 59 3 958 03be ο 69 0 959 03bf π 79 0 960 03c0 ρ 72 1 961 03c1 ς 59 1 962 03c2 σ 78 0 963 03c3 τ 58 0 964 03c4 υ 61 0 965 03c5 φ 78 1 966 03c6 χ 65 1 967 03c7 ψ 79 1 968 03c8 ω 84 0 969 03c9 ϊ 39 2 970 03ca ϋ 61 2 971 03cb ό 69 2 972 03cc ύ 61 2 973 03cd ώ 84 2 974 03ce ϐ 65 2 976 03d0 ϑ 66 2 977 03d1 ϒ 75 2 978 03d2 ϓ 98 2 979 03d3 ϔ 75 2 980 03d4 ϕ 80 3 981 03d5 ϖ 84 0 982 03d6 ϗ 74 1 983 03d7 Ϙ 85 3 984 03d8 ϙ 69 1 985 03d9 Ϛ 73 3 986 03da ϛ 59 1 987 03db Ϝ 68 2 988 03dc ϝ 49 3 989 03dd Ϟ 70 2 990 03de ϟ 66 2 991 03df Ϡ 92 3 992 03e0 ϡ 63 1 993 03e1 ϰ 74 0 1008 03f0 ϱ 72 1 1009 03f1 ϲ 59 0 1010 03f2 ϳ 34 3 1011 03f3 ϴ 85 2 1012 03f4 ϵ 64 0 1013 03f5 ϶ 64 0 1014 03f6 Ϸ 74 2 1015 03f7 ϸ 72 3 1016 03f8 Ϲ 73 2 1017 03f9 Ϻ 100 2 1018 03fa ϻ 73 1 1019 03fb ϼ 72 1 1020 03fc Ͻ 73 2 1021 03fd Ͼ 73 2 1022 03fe Ͽ 70 2 1023 03ff Ё 68 2 1025 0401 Ђ 88 3 1026 0402 Ѓ 64 2 1027 0403 Є 73 2 1028 0404 Ѕ 72 2 1029 0405 І 37 2 1030 0406 Ї 37 2 1031 0407 Ј 37 3 1032 0408 Љ 115 2 1033 0409 Њ 113 2 1034 040a Ћ 88 2 1035 040b Ќ 77 2 1036 040c Ѝ 84 2 1037 040d Ў 77 2 1038 040e Џ 84 3 1039 040f А 77 2 1040 0410 Б 76 2 1041 0411 В 76 2 1042 0412 Г 64 2 1043 0413 Д 95 3 1044 0414 Е 68 2 1045 0415 Ж 101 2 1046 0416 З 70 2 1047 0417 И 84 2 1048 0418 Й 84 2 1049 0419 К 77 2 1050 041a Л 83 2 1051 041b М 100 2 1052 041c Н 84 2 1053 041d О 85 2 1054 041e П 84 2 1055 041f Р 73 2 1056 0420 С 73 2 1057 0421 Т 68 2 1058 0422 У 77 2 1059 0423 Ф 85 2 1060 0424 Х 77 2 1061 0425 Ц 96 3 1062 0426 Ч 81 2 1063 0427 Ш 117 2 1064 0428 Щ 129 3 1065 0429 Ъ 94 2 1066 042a Ы 104 2 1067 042b Ь 76 2 1068 042c Э 73 2 1069 042d Ю 113 2 1070 042e Я 77 2 1071 042f а 67 0 1072 0430 б 69 2 1073 0431 в 61 0 1074 0432 г 52 0 1075 0433 д 82 1 1076 0434 е 68 0 1077 0435 ж 82 0 1078 0436 з 56 0 1079 0437 и 69 0 1080 0438 й 69 2 1081 0439 к 63 0 1082 043a л 69 0 1083 043b м 82 0 1084 043c н 69 0 1085 043d о 69 0 1086 043e п 69 0 1087 043f р 72 1 1088 0440 с 59 0 1089 0441 т 58 0 1090 0442 у 65 1 1091 0443 ф 92 3 1092 0444 х 65 0 1093 0445 ц 81 1 1094 0446 ч 69 0 1095 0447 ш 96 0 1096 0448 щ 107 1 1097 0449 ъ 75 0 1098 044a ы 86 0 1099 044b ь 61 0 1100 044c э 60 0 1101 044d ю 92 0 1102 044e я 64 0 1103 044f ѐ 68 2 1104 0450 ё 68 2 1105 0451 ђ 71 3 1106 0452 ѓ 52 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 34 2 1110 0456 ї 34 2 1111 0457 ј 34 3 1112 0458 љ 96 0 1113 0459 њ 96 0 1114 045a ћ 71 2 1115 045b ќ 63 2 1116 045c ѝ 69 2 1117 045d ў 65 3 1118 045e џ 69 1 1119 045f Ѥ 101 2 1124 0464 ѥ 84 0 1125 0465 Ҋ 94 3 1162 048a ҋ 81 3 1163 048b Ҍ 76 2 1164 048c ҍ 61 2 1165 048d Ґ 64 2 1168 0490 ґ 52 2 1169 0491 Ғ 64 2 1170 0492 ғ 52 0 1171 0493 Ҕ 79 3 1172 0494 ҕ 52 1 1173 0495 Җ 101 3 1174 0496 җ 82 1 1175 0497 Ҙ 70 3 1176 0498 ҙ 56 1 1177 0499 Қ 77 3 1178 049a қ 63 1 1179 049b Ҡ 97 2 1184 04a0 ҡ 77 0 1185 04a1 Ң 84 3 1186 04a2 ң 69 1 1187 04a3 Ҥ 110 2 1188 04a4 ҥ 87 0 1189 04a5 Ҧ 125 3 1190 04a6 ҧ 98 1 1191 04a7 Ҫ 73 3 1194 04aa ҫ 59 1 1195 04ab Ҭ 68 3 1196 04ac ҭ 58 1 1197 04ad Ү 72 2 1198 04ae ү 65 1 1199 04af Ұ 72 2 1200 04b0 ұ 65 1 1201 04b1 Ҳ 77 3 1202 04b2 ҳ 65 1 1203 04b3 Ҵ 110 3 1204 04b4 ҵ 100 1 1205 04b5 Ҷ 81 3 1206 04b6 ҷ 69 1 1207 04b7 Һ 81 2 1210 04ba һ 71 2 1211 04bb Ӏ 34 2 1216 04c0 Ӂ 101 2 1217 04c1 ӂ 82 2 1218 04c2 Ӆ 93 3 1221 04c5 ӆ 80 1 1222 04c6 Ӈ 84 3 1223 04c7 ӈ 69 1 1224 04c8 Ӊ 94 3 1225 04c9 ӊ 81 1 1226 04ca Ӌ 81 3 1227 04cb ӌ 69 1 1228 04cc Ӎ 110 3 1229 04cd ӎ 93 1 1230 04ce Ӑ 77 2 1232 04d0 ӑ 67 2 1233 04d1 Ӓ 77 2 1234 04d2 ӓ 67 2 1235 04d3 Ӕ 108 2 1236 04d4 ӕ 105 0 1237 04d5 Ӗ 68 2 1238 04d6 ӗ 68 2 1239 04d7 Ә 85 2 1240 04d8 ә 68 0 1241 04d9 Ӛ 85 2 1242 04da ӛ 68 2 1243 04db Ӝ 101 2 1244 04dc ӝ 82 2 1245 04dd Ӟ 70 2 1246 04de ӟ 56 2 1247 04df Ӡ 77 2 1248 04e0 ӡ 64 1 1249 04e1 Ӣ 84 2 1250 04e2 ӣ 69 2 1251 04e3 Ӥ 84 2 1252 04e4 ӥ 69 2 1253 04e5 Ӧ 85 2 1254 04e6 ӧ 69 2 1255 04e7 Ө 85 2 1256 04e8 ө 69 0 1257 04e9 Ӫ 85 2 1258 04ea ӫ 69 2 1259 04eb Ӭ 73 2 1260 04ec ӭ 60 2 1261 04ed Ӯ 77 2 1262 04ee ӯ 65 3 1263 04ef Ӱ 77 2 1264 04f0 ӱ 65 3 1265 04f1 Ӳ 77 2 1266 04f2 ӳ 65 3 1267 04f3 Ӵ 81 2 1268 04f4 ӵ 69 2 1269 04f5 Ӷ 64 3 1270 04f6 ӷ 52 1 1271 04f7 Ӹ 104 2 1272 04f8 ӹ 86 2 1273 04f9 Ա 98 2 1329 0531 Բ 81 2 1330 0532 Գ 98 2 1331 0533 Դ 98 2 1332 0534 Ե 81 2 1333 0535 Զ 78 3 1334 0536 Է 81 3 1335 0537 Ը 81 3 1336 0538 Թ 97 2 1337 0539 Ժ 98 2 1338 053a Ի 81 2 1339 053b Լ 71 3 1340 053c Խ 108 2 1341 053d Ծ 114 2 1342 053e Կ 81 2 1343 053f Հ 71 3 1344 0540 Ձ 76 2 1345 0541 Ղ 98 3 1346 0542 Ճ 88 2 1347 0543 Մ 98 2 1348 0544 Յ 79 2 1349 0545 Ն 98 2 1350 0546 Շ 81 2 1351 0547 Ո 81 2 1352 0548 Չ 81 3 1353 0549 Պ 96 2 1354 054a Ջ 78 3 1355 054b Ռ 98 2 1356 054c Ս 81 2 1357 054d Վ 98 3 1358 054e Տ 72 2 1359 054f Ր 81 2 1360 0550 Ց 79 2 1361 0551 Ւ 89 2 1362 0552 Փ 85 2 1363 0553 Ք 94 2 1364 0554 Օ 85 2 1365 0555 Ֆ 72 2 1366 0556 ՙ 37 2 1369 0559 ՚ 38 2 1370 055a ՛ 55 2 1371 055b ՜ 55 2 1372 055c ՝ 38 2 1373 055d ՞ 55 2 1374 055e ՟ 52 2 1375 055f ա 104 0 1377 0561 բ 71 1 1378 0562 գ 82 1 1379 0563 դ 82 1 1380 0564 զ 82 1 1382 0566 է 65 3 1383 0567 ը 71 1 1384 0568 թ 81 1 1385 0569 ժ 82 2 1386 056a ի 71 3 1387 056b լ 50 1 1388 056c խ 104 3 1389 056d ծ 72 2 1390 056e կ 71 3 1391 056f հ 71 2 1392 0570 ձ 72 2 1393 0571 ղ 82 1 1394 0572 ճ 71 2 1395 0573 մ 75 2 1396 0574 յ 34 1 1397 0575 ն 88 2 1398 0576 շ 56 1 1399 0577 ո 71 0 1400 0578 չ 56 1 1401 0579 պ 104 1 1402 057a ջ 56 1 1403 057b ռ 71 0 1404 057c ս 71 0 1405 057d վ 81 3 1406 057e տ 104 0 1407 057f ր 71 1 1408 0580 ց 72 1 1409 0581 ւ 50 0 1410 0582 փ 104 3 1411 0583 ք 78 1 1412 0584 օ 69 0 1413 0585 ֆ 72 3 1414 0586 և 86 2 1415 0587 ։ 40 0 1417 0589 ֊ 54 0 1418 058a ᴂ 105 0 7426 1d02 ᴈ 56 0 7432 1d08 ᴉ 34 1 7433 1d09 ᴔ 109 0 7444 1d14 ᴖ 70 0 7446 1d16 ᴗ 70 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 69 1 7455 1d1f ᵃ 46 2 7491 1d43 ᵄ 46 2 7492 1d44 ᵅ 48 2 7493 1d45 ᵆ 71 2 7494 1d46 ᵇ 48 2 7495 1d47 ᵈ 48 2 7496 1d48 ᵉ 48 2 7497 1d49 ᵊ 48 2 7498 1d4a ᵋ 39 2 7499 1d4b ᵌ 39 2 7500 1d4c ᵍ 48 2 7501 1d4d ᵎ 22 2 7502 1d4e ᵏ 49 2 7503 1d4f ᵐ 66 2 7504 1d50 ᵑ 46 2 7505 1d51 ᵒ 49 2 7506 1d52 ᵓ 41 2 7507 1d53 ᵔ 49 2 7508 1d54 ᵕ 49 0 7509 1d55 ᵖ 48 2 7510 1d56 ᵗ 39 2 7511 1d57 ᵘ 46 2 7512 1d58 ᵙ 46 2 7513 1d59 ᵚ 66 2 7514 1d5a ᵛ 50 2 7515 1d5b ᵷ 72 1 7543 1d77 ᵻ 55 0 7547 1d7b ᶅ 51 3 7557 1d85 ᶛ 57 2 7579 1d9b ᶜ 50 2 7580 1d9c ᶝ 50 2 7581 1d9d ᶞ 58 2 7582 1d9e ᶟ 47 2 7583 1d9f ᶠ 46 2 7584 1da0 ᶡ 44 2 7585 1da1 ᶢ 57 2 7586 1da2 ᶣ 54 2 7587 1da3 ᶤ 43 2 7588 1da4 ᶥ 37 2 7589 1da5 ᶦ 43 2 7590 1da6 ᶧ 43 2 7591 1da7 ᶨ 52 2 7592 1da8 ᶩ 41 2 7593 1da9 ᶪ 42 2 7594 1daa ᶫ 46 2 7595 1dab ᶬ 75 2 7596 1dac ᶭ 75 2 7597 1dad ᶮ 65 2 7598 1dae ᶯ 65 2 7599 1daf ᶰ 54 2 7600 1db0 ᶱ 58 2 7601 1db1 ᶲ 63 2 7602 1db2 ᶳ 51 2 7603 1db3 ᶴ 48 2 7604 1db4 ᶵ 48 2 7605 1db5 ᶶ 67 2 7606 1db6 ᶷ 58 2 7607 1db7 ᶹ 54 2 7609 1db9 ᶺ 59 2 7610 1dba ᶻ 51 2 7611 1dbb ᶼ 61 2 7612 1dbc ᶽ 56 2 7613 1dbd ᶾ 54 2 7614 1dbe ᶿ 51 2 7615 1dbf Ḍ 83 3 7692 1e0c ḍ 72 3 7693 1e0d Ḓ 83 3 7698 1e12 ḓ 72 3 7699 1e13 Ḥ 84 3 7716 1e24 ḥ 71 3 7717 1e25 Ḷ 64 3 7734 1e36 ḷ 34 3 7735 1e37 Ḹ 64 3 7736 1e38 ḹ 34 3 7737 1e39 Ḽ 64 3 7740 1e3c ḽ 34 3 7741 1e3d ṁ 104 2 7745 1e41 Ṃ 100 3 7746 1e42 ṃ 104 1 7747 1e43 Ṅ 84 2 7748 1e44 ṅ 71 2 7749 1e45 Ṇ 84 3 7750 1e46 ṇ 71 1 7751 1e47 Ṋ 84 3 7754 1e4a ṋ 71 1 7755 1e4b ṗ 72 3 7767 1e57 Ṛ 77 3 7770 1e5a ṛ 49 1 7771 1e5b Ṝ 77 3 7772 1e5c ṝ 49 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 72 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 68 3 7788 1e6c ṭ 48 3 7789 1e6d Ṱ 68 3 7792 1e70 ṱ 48 3 7793 1e71 Ṿ 77 3 7806 1e7e ṿ 65 1 7807 1e7f Ẁ 110 2 7808 1e80 ẁ 92 2 7809 1e81 Ẃ 110 2 7810 1e82 ẃ 92 2 7811 1e83 Ẅ 110 2 7812 1e84 ẅ 92 2 7813 1e85 Ẹ 68 3 7864 1eb8 ẹ 68 1 7865 1eb9 Ị 37 3 7882 1eca ị 34 3 7883 1ecb Ọ 85 3 7884 1ecc ọ 69 1 7885 1ecd Ụ 81 3 7908 1ee4 ụ 71 1 7909 1ee5 Ỳ 72 2 7922 1ef2 ỳ 65 3 7923 1ef3 ἁ 69 2 7937 1f01 ἂ 69 2 7938 1f02 ἃ 69 2 7939 1f03 ἄ 69 2 7940 1f04 ἅ 69 2 7941 1f05 ἆ 69 2 7942 1f06 ἇ 69 2 7943 1f07 Ἀ 77 2 7944 1f08 Ἁ 77 2 7945 1f09 Ἂ 104 2 7946 1f0a Ἃ 104 2 7947 1f0b Ἄ 94 2 7948 1f0c Ἅ 96 2 7949 1f0d Ἆ 84 2 7950 1f0e Ἇ 86 2 7951 1f0f ἐ 56 2 7952 1f10 ἑ 56 2 7953 1f11 ἒ 56 2 7954 1f12 ἓ 56 2 7955 1f13 ἔ 56 2 7956 1f14 ἕ 56 2 7957 1f15 Ἐ 79 2 7960 1f18 Ἑ 79 2 7961 1f19 Ἒ 110 2 7962 1f1a Ἓ 110 2 7963 1f1b Ἔ 102 2 7964 1f1c Ἕ 105 2 7965 1f1d ἠ 71 3 7968 1f20 ἡ 71 3 7969 1f21 ἢ 71 3 7970 1f22 ἣ 71 3 7971 1f23 ἤ 71 3 7972 1f24 ἥ 71 3 7973 1f25 ἦ 71 3 7974 1f26 ἧ 71 3 7975 1f27 Ἠ 95 2 7976 1f28 Ἡ 95 2 7977 1f29 Ἢ 125 2 7978 1f2a Ἣ 125 2 7979 1f2b Ἤ 118 2 7980 1f2c Ἥ 121 2 7981 1f2d Ἦ 105 2 7982 1f2e Ἧ 106 2 7983 1f2f ἰ 39 2 7984 1f30 ἱ 39 2 7985 1f31 ἲ 39 2 7986 1f32 ἳ 39 2 7987 1f33 ἴ 39 2 7988 1f34 ἵ 39 2 7989 1f35 ἶ 39 2 7990 1f36 ἷ 39 2 7991 1f37 Ἰ 48 2 7992 1f38 Ἱ 49 2 7993 1f39 Ἲ 78 2 7994 1f3a Ἳ 79 2 7995 1f3b Ἴ 71 2 7996 1f3c Ἵ 74 2 7997 1f3d Ἶ 60 2 7998 1f3e Ἷ 60 2 7999 1f3f ὀ 69 2 8000 1f40 ὁ 69 2 8001 1f41 ὂ 69 2 8002 1f42 ὃ 69 2 8003 1f43 ὄ 69 2 8004 1f44 ὅ 69 2 8005 1f45 Ὀ 89 2 8008 1f48 Ὁ 93 2 8009 1f49 Ὂ 122 2 8010 1f4a Ὃ 122 2 8011 1f4b Ὄ 105 2 8012 1f4c Ὅ 108 2 8013 1f4d ὐ 61 2 8016 1f50 ὑ 61 2 8017 1f51 ὒ 61 2 8018 1f52 ὓ 61 2 8019 1f53 ὔ 61 2 8020 1f54 ὕ 61 2 8021 1f55 ὖ 61 2 8022 1f56 ὗ 61 2 8023 1f57 Ὑ 93 2 8025 1f59 Ὓ 118 2 8027 1f5b Ὕ 120 2 8029 1f5d Ὗ 105 2 8031 1f5f ὠ 84 2 8032 1f60 ὡ 84 2 8033 1f61 ὢ 84 2 8034 1f62 ὣ 84 2 8035 1f63 ὤ 84 2 8036 1f64 ὥ 84 2 8037 1f65 ὦ 84 2 8038 1f66 ὧ 84 2 8039 1f67 Ὠ 83 2 8040 1f68 Ὡ 88 2 8041 1f69 Ὢ 117 2 8042 1f6a Ὣ 117 2 8043 1f6b Ὤ 99 2 8044 1f6c Ὥ 102 2 8045 1f6d Ὦ 95 2 8046 1f6e Ὧ 99 2 8047 1f6f ὰ 69 2 8048 1f70 ά 69 2 8049 1f71 ὲ 56 2 8050 1f72 έ 56 2 8051 1f73 ὴ 71 3 8052 1f74 ή 71 3 8053 1f75 ὶ 39 2 8054 1f76 ί 39 2 8055 1f77 ὸ 69 2 8056 1f78 ό 69 2 8057 1f79 ὺ 61 2 8058 1f7a ύ 61 2 8059 1f7b ὼ 84 2 8060 1f7c ώ 84 2 8061 1f7d ᾀ 69 3 8064 1f80 ᾁ 69 3 8065 1f81 ᾂ 69 3 8066 1f82 ᾃ 69 3 8067 1f83 ᾄ 69 3 8068 1f84 ᾅ 69 3 8069 1f85 ᾆ 69 3 8070 1f86 ᾇ 69 3 8071 1f87 ᾈ 77 3 8072 1f88 ᾉ 77 3 8073 1f89 ᾊ 104 3 8074 1f8a ᾋ 104 3 8075 1f8b ᾌ 94 3 8076 1f8c ᾍ 96 3 8077 1f8d ᾎ 84 3 8078 1f8e ᾏ 86 3 8079 1f8f ᾐ 71 3 8080 1f90 ᾑ 71 3 8081 1f91 ᾒ 71 3 8082 1f92 ᾓ 71 3 8083 1f93 ᾔ 71 3 8084 1f94 ᾕ 71 3 8085 1f95 ᾖ 71 3 8086 1f96 ᾗ 71 3 8087 1f97 ᾘ 95 3 8088 1f98 ᾙ 95 3 8089 1f99 ᾚ 125 3 8090 1f9a ᾛ 125 3 8091 1f9b ᾜ 118 3 8092 1f9c ᾝ 121 3 8093 1f9d ᾞ 105 3 8094 1f9e ᾟ 106 3 8095 1f9f ᾠ 84 3 8096 1fa0 ᾡ 84 3 8097 1fa1 ᾢ 84 3 8098 1fa2 ᾣ 84 3 8099 1fa3 ᾤ 84 3 8100 1fa4 ᾥ 84 3 8101 1fa5 ᾦ 84 3 8102 1fa6 ᾧ 84 3 8103 1fa7 ᾨ 83 3 8104 1fa8 ᾩ 88 3 8105 1fa9 ᾪ 117 3 8106 1faa ᾫ 117 3 8107 1fab ᾬ 99 3 8108 1fac ᾭ 102 3 8109 1fad ᾮ 95 3 8110 1fae ᾯ 99 3 8111 1faf ᾰ 69 2 8112 1fb0 ᾱ 69 2 8113 1fb1 ᾲ 69 3 8114 1fb2 ᾳ 69 1 8115 1fb3 ᾴ 69 3 8116 1fb4 ᾶ 69 2 8118 1fb6 ᾷ 69 3 8119 1fb7 Ᾰ 77 2 8120 1fb8 Ᾱ 77 2 8121 1fb9 Ὰ 88 2 8122 1fba Ά 80 2 8123 1fbb ᾼ 77 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 71 3 8130 1fc2 ῃ 71 1 8131 1fc3 ῄ 71 3 8132 1fc4 ῆ 71 3 8134 1fc6 ῇ 71 3 8135 1fc7 Ὲ 93 2 8136 1fc8 Έ 85 2 8137 1fc9 Ὴ 108 2 8138 1fca Ή 101 2 8139 1fcb ῌ 84 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 39 2 8144 1fd0 ῑ 39 2 8145 1fd1 ῒ 39 2 8146 1fd2 ΐ 39 2 8147 1fd3 ῖ 39 2 8150 1fd6 ῗ 39 2 8151 1fd7 Ῐ 37 2 8152 1fd8 Ῑ 37 2 8153 1fd9 Ὶ 62 2 8154 1fda Ί 56 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 61 2 8160 1fe0 ῡ 61 2 8161 1fe1 ῢ 61 2 8162 1fe2 ΰ 61 2 8163 1fe3 ῤ 72 3 8164 1fe4 ῥ 72 3 8165 1fe5 ῦ 61 2 8166 1fe6 ῧ 61 2 8167 1fe7 Ῠ 72 2 8168 1fe8 Ῡ 72 2 8169 1fe9 Ὺ 102 2 8170 1fea Ύ 98 2 8171 1feb Ῥ 84 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 84 3 8178 1ff2 ῳ 84 1 8179 1ff3 ῴ 84 3 8180 1ff4 ῶ 84 2 8182 1ff6 ῷ 84 3 8183 1ff7 Ὸ 106 2 8184 1ff8 Ό 89 2 8185 1ff9 Ὼ 100 2 8186 1ffa Ώ 87 2 8187 1ffb ῼ 77 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 42 0 8208 2010 ‑ 42 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 38 2 8216 2018 ` " ‘ " ’ 38 2 8217 2019 ' " ’ " ‚ 38 1 8218 201a ‛ 38 2 8219 201b “ 64 2 8220 201c ” 64 2 8221 201d „ 64 1 8222 201e ‟ 66 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 64 0 8226 2022 ‣ 64 0 8227 2023 ․ 38 0 8228 2024 ‥ 69 0 8229 2025 … 100 0 8230 2026 ‰ 145 2 8240 2030 ‱ 191 2 8241 2031 ‹ 41 0 8249 2039 › 41 0 8250 203a ‼ 63 2 8252 203c ‽ 58 2 8253 203d ‾ 50 2 8254 203e ⁇ 103 2 8263 2047 ⁈ 83 2 8264 2048 ⁉ 83 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 46 2 8319 207f ₦ 84 2 8358 20a6 € 70 2 8364 20ac ₵ 70 3 8373 20b5 ℃ 121 2 8451 2103 № 135 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 77 2 8486 2126 ℧ 77 2 8487 2127 K 77 2 8490 212a Å 77 2 8491 212b Ⅎ 68 2 8498 2132 ⅋ 87 2 8523 214b Ⅰ 37 2 8544 2160 Ⅱ 66 2 8545 2161 Ⅲ 95 2 8546 2162 Ⅳ 110 2 8547 2163 Ⅴ 77 2 8548 2164 Ⅵ 110 2 8549 2165 Ⅶ 139 2 8550 2166 Ⅷ 167 2 8551 2167 Ⅸ 112 2 8552 2168 Ⅹ 77 2 8553 2169 Ⅺ 112 2 8554 216a Ⅻ 141 2 8555 216b Ⅼ 64 2 8556 216c Ⅽ 73 2 8557 216d Ⅾ 83 2 8558 216e Ⅿ 100 2 8559 216f ⅰ 34 2 8560 2170 ⅱ 61 2 8561 2171 ⅲ 87 2 8562 2172 ⅳ 98 2 8563 2173 ⅴ 65 0 8564 2174 ⅵ 96 2 8565 2175 ⅶ 123 2 8566 2176 ⅷ 149 2 8567 2177 ⅸ 97 2 8568 2178 ⅹ 65 0 8569 2179 ⅺ 97 2 8570 217a ⅻ 123 2 8571 217b ⅼ 34 2 8572 217c ⅽ 59 0 8573 217d ⅾ 72 2 8574 217e ⅿ 104 0 8575 217f ↀ 129 2 8576 2180 Ↄ 73 2 8579 2183 ∂ 54 2 8706 2202 pd " ∃ 68 2 8707 2203 te " ∆ 70 2 8710 2206 ∇ 70 2 8711 2207 gr " ∊ 79 0 8714 220a ∍ 79 0 8717 220d st " ∏ 79 3 8719 220f ∐ 79 3 8720 2210 ∑ 72 3 8721 2211 − 84 0 8722 2212 ∓ 84 2 8723 2213 ∕ 17 2 8725 2215 ∗ 63 0 8727 2217 ** " ∘ 63 0 8728 2218 ∙ 38 0 8729 2219 bu " √ 67 2 8730 221a sr " ∝ 67 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 81 0 8743 2227 l∧ 81 0 8743 2227 " ∨ 81 0 8744 2228 l| " ∩ 81 0 8745 2229 ca " ∪ 81 0 8746 222a cu " ∫ 61 3 8747 222b is " ∬ 100 3 8748 222c ∭ 139 3 8749 222d ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≣ 84 3 8803 2263 ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 72 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 54 2 8977 2311 ⌘ 93 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 61 3 8992 2320 ⌡ 61 3 8993 2321 ⌥ 100 2 8997 2325 〈 46 3 9001 2329 〉 46 3 9002 232a ⍽ 86 1 9085 237d ⎮ 61 3 9134 23ae ⏏ 77 0 9167 23cf ␢ 72 2 9250 2422 ␣ 72 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 64 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 64 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⚀ 87 2 9856 2680 ⚁ 87 2 9857 2681 ⚂ 87 2 9858 2682 ⚃ 87 2 9859 2683 ⚄ 87 2 9860 2684 ⚅ 87 2 9861 2685 ⟠ 49 3 10208 27e0 ⟨ 46 3 10216 27e8 ⟩ 46 3 10217 27e9 ⟪ 72 3 10218 27ea ⟫ 72 3 10219 27eb ⧫ 49 3 10731 29eb ⨌ 178 3 10764 2a0c ⨍ 61 3 10765 2a0d ⨎ 61 3 10766 2a0e ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 79 2 64257 fb01 fl 79 2 64258 fb02 ffi 112 2 64259 fb03 ffl 112 2 64260 fb04 ﬓ 139 2 64275 fb13 ﬔ 138 2 64276 fb14 ﬕ 138 3 64277 fb15 ﬖ 138 3 64278 fb16 ﬗ 171 3 64279 fb17 � 111 3 65533 fffd 9base-6/troff/font/devutf/HI0000644000175000017500000000533611402154555015363 0ustar anselmanselmname HI fontname Helvetica-Oblique named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 0 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 26 3 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 37 2 170 ª " << 56 0 171 « " -, 58 0 172 hy 33 0 173 -- 58 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 58 2 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 54 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 61 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 58 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 67 2 221 Ý " TH 67 2 222 Þ " ss 61 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 50 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 58 0 247 ÷ " o/ 61 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 56 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/S0000644000175000017500000000544611402154555015267 0ustar anselmanselmname S fontname Symbol named in prologue special charset --- 33 2 33 fa 71 2 34 ∀ " --- 50 2 35 te 55 2 36 ∃ " --- 83 2 37 --- 78 2 38 st 44 0 39 ∍ " --- 33 3 40 --- 33 3 41 ** 50 2 42 ∗ " pl 55 0 43 --- 25 1 44 mi 55 0 45 µ " --- 25 0 46 sl 28 2 47 --- 50 2 48 --- 50 2 49 --- 50 2 50 --- 50 2 51 --- 50 2 52 --- 50 2 53 --- 50 2 54 --- 50 2 55 --- 50 2 56 --- 50 2 57 --- 28 0 58 --- 28 1 59 < 55 0 60 eq 55 0 61 > 55 0 62 --- 44 2 63 cg 55 0 64 ≅ " *A 72 2 65 Α " *B 67 2 66 Β " *X 72 2 67 Χ " *D 61 2 68 ∆ " *E 61 2 69 Ε " *F 76 2 70 Φ " *G 60 2 71 Γ " *Y 72 2 72 Η " *I 33 2 73 Ι " --- 63 2 74 ϑ " *K 72 2 75 Κ " *L 69 2 76 Λ " *M 89 2 77 Μ " *N 72 2 78 Ν " *O 72 2 79 Ο " *P 77 2 80 Π " *H 74 2 81 Θ " *R 56 2 82 Ρ " *S 59 2 83 Σ " *T 61 2 84 Τ " *U 69 2 85 Υ " ts 44 1 86 ς " *W 77 2 87 Ω " *C 65 2 88 Ξ " *Q 80 2 89 Ψ " *Z 61 2 90 Ζ " --- 33 3 91 tf 86 0 92 ∴ " --- 33 3 93 pp 66 2 94 ul 50 1 95 _ " rn 50 2 96 *a 63 0 97 α " *b 55 3 98 β " *x 55 1 99 χ " *d 49 2 100 δ " *e 44 0 101 ε " *f 52 3 102 φ " *g 41 1 103 γ " *y 60 1 104 η " *i 33 0 105 ι " --- 60 1 106 ϕ " *k 55 0 107 κ " *l 55 2 108 λ " *m 58 1 109 μ " *n 52 0 110 ν " *o 55 0 111 ο " *p 55 0 112 π " *h 52 2 113 θ " *r 55 1 114 ρ " *s 60 0 115 σ " *t 44 0 116 τ " *u 58 0 117 υ " --- 71 2 118 ϖ " *w 69 0 119 ω " *c 49 3 120 ξ " *q 69 1 121 ψ " *z 49 3 122 ζ " --- 48 3 123 or 20 3 124 --- 48 3 125 ap 55 0 126 --- 62 2 161 fm 25 2 162 ´ " <= 55 2 163 ≦ " fr 17 2 164 if 73 0 165 ∞ " fn 50 3 166 --- 75 0 167 --- 75 2 168 --- 75 0 169 --- 75 2 170 ab 104 0 171 ↔ " <- 99 0 172 ← " ua 60 2 173 ↑ " -> 99 0 174 → " da 60 2 175 ↓ " de 40 2 176 ° " +- 55 2 177 ± " --- 41 2 178 >= 55 2 179 ≧ " mu 55 0 180 × " pt 71 0 181 ∝ " pd 49 2 182 ∂ " bu 46 0 183 ∙ " di 55 0 184 ÷ " != 55 2 185 ≠ " == 55 0 186 ≡ " ~~ 55 0 187 ≈ " el 100 0 188 ⋯ " av 60 3 189 ah 100 0 190 CR 66 2 191 af 82 2 192 If 69 2 193 Rf 80 2 194 ws 99 3 195 Ox 77 2 196 ⊗ " O+ 77 2 197 ⊕ " es 82 2 198 ∅ " ca 77 0 199 ∩ " cu 77 0 200 ∪ " sp 71 0 201 ⊃ " ip 71 1 202 ⊇ " !b 71 0 203 ⊄ " sb 71 0 204 ⊂ " ib 71 1 205 ⊆ " mo 71 0 206 ∈ " !m 71 2 207 ∉ " an 77 2 208 ∠ " gr 71 2 209 ∇ " rg 79 2 210 ® " co 79 2 211 © " tm 89 2 212 --- 82 2 213 sr 55 2 214 √ " c. 25 0 215 no 71 0 216 ¬ " l& 60 0 217 ∧ " l| 60 0 218 ∨ " --- 104 0 219 --- 99 0 220 --- 60 2 221 --- 99 0 222 --- 60 2 223 lz 49 2 224 ⋄ " b< 33 3 225 RG 79 2 226 CO 79 2 227 TM 79 2 228 --- 71 2 229 LT 38 3 230 br 0 3 231 LX " LB 38 3 232 lc 50 2 233 lx 38 2 234 lf 50 2 235 lt 49 2 236 lk 49 2 237 lb 49 2 238 bv 49 2 239 | " b> 33 3 241 is 50 3 242 ∫ " --- 69 2 243 --- 69 2 244 --- 69 2 245 RT 38 3 246 RX 38 2 247 RB 38 3 248 rc 38 2 249 rx 50 3 250 rf 38 2 251 rt 49 2 252 rk 49 2 253 rb 49 2 254 ~= 55 0 1 ≃ " 9base-6/troff/font/devutf/LucidaSansCW0000644000175000017500000000650111402154555017336 0ustar anselmanselmname LucidaSansCW fontname LucidaSans-Typewriter spacewidth 60 charset ! 60 0 33 exclam " 60 0 34 quotedbl # 60 0 35 numbersign $ 60 0 36 dollar % 60 0 37 percent & 60 0 38 ampersand ' 60 0 39 quoteright ( 60 0 40 parenleft ) 60 0 41 parenright * 60 0 42 asterisk + 60 0 43 plus , 60 0 44 comma - 60 0 45 minus . 60 0 46 period / 60 0 47 slash 0 60 0 48 zero 1 60 0 49 one 2 60 0 50 two 3 60 0 51 three 4 60 0 52 four 5 60 0 53 five 6 60 0 54 six 7 60 0 55 seven 8 60 0 56 eight 9 60 0 57 nine : 60 0 58 colon ; 60 0 59 semicolon < 60 0 60 less = 60 0 61 equal > 60 0 62 greater ? 60 0 63 question @ 60 0 64 at A 60 0 65 A B 60 0 66 B C 60 0 67 C D 60 0 68 D E 60 0 69 E F 60 0 70 F G 60 0 71 G H 60 0 72 H I 60 0 73 I J 60 0 74 J K 60 0 75 K L 60 0 76 L M 60 0 77 M N 60 0 78 N O 60 0 79 O P 60 0 80 P Q 60 0 81 Q R 60 0 82 R S 60 0 83 S T 60 0 84 T U 60 0 85 U V 60 0 86 V W 60 0 87 W X 60 0 88 X Y 60 0 89 Y Z 60 0 90 Z [ 60 0 91 bracketleft \ 60 0 92 backslash ] 60 0 93 bracketright ^ 60 0 94 asciicircum _ 60 0 95 underscore ` 60 0 96 quoteleft a 60 0 97 a b 60 0 98 b c 60 0 99 c d 60 0 100 d e 60 0 101 e f 60 0 102 f g 60 0 103 g h 60 0 104 h i 60 0 105 i j 60 0 106 j k 60 0 107 k l 60 0 108 l m 60 0 109 m n 60 0 110 n o 60 0 111 o p 60 0 112 p q 60 0 113 q r 60 0 114 r s 60 0 115 s t 60 0 116 t u 60 0 117 u v 60 0 118 v w 60 0 119 w x 60 0 120 x y 60 0 121 y z 60 0 122 z { 60 0 123 braceleft | 60 0 124 bar } 60 0 125 braceright ~ 60 0 126 asciitilde ¡ 60 0 161 exclamdown ¢ 60 0 162 cent £ 60 0 163 sterling ¤ 60 0 164 currency ¥ 60 0 165 yen ¦ 60 0 166 brokenbar § 60 0 167 section ¨ 60 0 168 dieresis © 60 0 169 copyright « 60 0 171 guillemotleft ¬ 60 0 172 logicalnot ­ 60 0 173 hyphen hy " ® 60 0 174 registered ¯ 60 0 175 macron ° 60 0 176 degree ± 60 0 177 plusminus ² 60 0 178 twosuperior ³ 60 0 179 threesuperior ´ 60 0 180 acute µ 60 0 181 mu ¶ 60 0 182 paragraph · 60 0 183 periodcentered ¸ 60 0 184 cedilla ¹ 60 0 185 onesuperior » 60 0 187 guillemotright ¼ 60 0 188 onequarter ½ 60 0 189 onehalf ¾ 60 0 190 threequarters ¿ 60 0 191 questiondown À 60 0 192 Agrave Á 60 0 193 Aacute  60 0 194 Acircumflex à 60 0 195 Atilde Ä 60 0 196 Adieresis Å 60 0 197 Aring Æ 60 0 198 AE Ç 60 0 199 Ccedilla È 60 0 200 Egrave É 60 0 201 Eacute Ê 60 0 202 Ecircumflex Ë 60 0 203 Edieresis Ì 60 0 204 Igrave Í 60 0 205 Iacute Î 60 0 206 Icircumflex Ï 60 0 207 Idieresis Ð 60 0 208 Eth Ñ 60 0 209 Ntilde Ò 60 0 210 Ograve Ó 60 0 211 Oacute Ô 60 0 212 Ocircumflex Õ 60 0 213 Otilde Ö 60 0 214 Odieresis × 60 0 215 multiply Ø 60 0 216 Oslash Ù 60 0 217 Ugrave Ú 60 0 218 Uacute Û 60 0 219 Ucircumflex Ü 60 0 220 Udieresis Ý 60 0 221 Yacute Þ 60 0 222 Thorn ß 60 0 223 germandbls à 60 0 224 agrave á 60 0 225 aacute â 60 0 226 acircumflex ã 60 0 227 atilde ä 60 0 228 adieresis å 60 0 229 aring æ 60 0 230 ae ç 60 0 231 ccedilla è 60 0 232 egrave é 60 0 233 eacute ê 60 0 234 ecircumflex ë 60 0 235 edieresis ì 60 0 236 igrave í 60 0 237 iacute î 60 0 238 icircumflex ï 60 0 239 idieresis ð 60 0 240 eth ñ 60 0 241 ntilde ò 60 0 242 ograve ó 60 0 243 oacute ô 60 0 244 ocircumflex õ 60 0 245 otilde ö 60 0 246 odieresis ÷ 60 0 247 divide ø 60 0 248 oslash ù 60 0 249 ugrave ú 60 0 250 uacute û 60 0 251 ucircumflex ü 60 0 252 udieresis ý 60 0 253 yacute þ 60 0 254 thorn ÿ 60 0 255 ydieresis 9base-6/troff/font/devutf/LucidaCW0000644000175000017500000000647011402154555016516 0ustar anselmanselmname LucidaCW fontname LucidaTypewriter spacewidth 72 charset ! 72 0 33 exclam " 72 0 34 quotedbl # 72 0 35 numbersign $ 72 0 36 dollar % 72 0 37 percent & 72 0 38 ampersand ' 72 0 39 quoteright ( 72 0 40 parenleft ) 72 0 41 parenright * 72 0 42 asterisk + 72 0 43 plus , 72 0 44 comma - 72 0 45 minus . 72 0 46 period / 72 0 47 slash 0 72 0 48 zero 1 72 0 49 one 2 72 0 50 two 3 72 0 51 three 4 72 0 52 four 5 72 0 53 five 6 72 0 54 six 7 72 0 55 seven 8 72 0 56 eight 9 72 0 57 nine : 72 0 58 colon ; 72 0 59 semicolon < 72 0 60 less = 72 0 61 equal > 72 0 62 greater ? 72 0 63 question @ 72 0 64 at A 72 0 65 A B 72 0 66 B C 72 0 67 C D 72 0 68 D E 72 0 69 E F 72 0 70 F G 72 0 71 G H 72 0 72 H I 72 0 73 I J 72 0 74 J K 72 0 75 K L 72 0 76 L M 72 0 77 M N 72 0 78 N O 72 0 79 O P 72 0 80 P Q 72 0 81 Q R 72 0 82 R S 72 0 83 S T 72 0 84 T U 72 0 85 U V 72 0 86 V W 72 0 87 W X 72 0 88 X Y 72 0 89 Y Z 72 0 90 Z [ 72 0 91 bracketleft \ 72 0 92 backslash ] 72 0 93 bracketright ^ 72 0 94 asciicircum _ 72 0 95 underscore ` 72 0 96 quoteleft a 72 0 97 a b 72 0 98 b c 72 0 99 c d 72 0 100 d e 72 0 101 e f 72 0 102 f g 72 0 103 g h 72 0 104 h i 72 0 105 i j 72 0 106 j k 72 0 107 k l 72 0 108 l m 72 0 109 m n 72 0 110 n o 72 0 111 o p 72 0 112 p q 72 0 113 q r 72 0 114 r s 72 0 115 s t 72 0 116 t u 72 0 117 u v 72 0 118 v w 72 0 119 w x 72 0 120 x y 72 0 121 y z 72 0 122 z { 72 0 123 braceleft | 72 0 124 bar } 72 0 125 braceright ~ 72 0 126 asciitilde ¡ 72 0 161 exclamdown ¢ 72 0 162 cent £ 72 0 163 sterling ¤ 72 0 164 currency ¥ 72 0 165 yen ¦ 72 0 166 brokenbar § 72 0 167 section ¨ 72 0 168 dieresis © 72 0 169 copyright « 72 0 171 guillemotleft ¬ 72 0 172 logicalnot ­ 72 0 173 hyphen hy " ® 72 0 174 registered ¯ 72 0 175 macron ° 72 0 176 degree ± 72 0 177 plusminus ² 72 0 178 twosuperior ³ 72 0 179 threesuperior ´ 72 0 180 acute µ 72 0 181 mu ¶ 72 0 182 paragraph · 72 0 183 periodcentered ¸ 72 0 184 cedilla ¹ 72 0 185 onesuperior » 72 0 187 guillemotright ¼ 72 0 188 onequarter ½ 72 0 189 onehalf ¾ 72 0 190 threequarters ¿ 72 0 191 questiondown À 72 0 192 Agrave Á 72 0 193 Aacute  72 0 194 Acircumflex à 72 0 195 Atilde Ä 72 0 196 Adieresis Å 72 0 197 Aring Æ 72 0 198 AE Ç 72 0 199 Ccedilla È 72 0 200 Egrave É 72 0 201 Eacute Ê 72 0 202 Ecircumflex Ë 72 0 203 Edieresis Ì 72 0 204 Igrave Í 72 0 205 Iacute Î 72 0 206 Icircumflex Ï 72 0 207 Idieresis Ð 72 0 208 Eth Ñ 72 0 209 Ntilde Ò 72 0 210 Ograve Ó 72 0 211 Oacute Ô 72 0 212 Ocircumflex Õ 72 0 213 Otilde Ö 72 0 214 Odieresis × 72 0 215 multiply Ø 72 0 216 Oslash Ù 72 0 217 Ugrave Ú 72 0 218 Uacute Û 72 0 219 Ucircumflex Ü 72 0 220 Udieresis Ý 72 0 221 Yacute Þ 72 0 222 Thorn ß 72 0 223 germandbls à 72 0 224 agrave á 72 0 225 aacute â 72 0 226 acircumflex ã 72 0 227 atilde ä 72 0 228 adieresis å 72 0 229 aring æ 72 0 230 ae ç 72 0 231 ccedilla è 72 0 232 egrave é 72 0 233 eacute ê 72 0 234 ecircumflex ë 72 0 235 edieresis ì 72 0 236 igrave í 72 0 237 iacute î 72 0 238 icircumflex ï 72 0 239 idieresis ð 72 0 240 eth ñ 72 0 241 ntilde ò 72 0 242 ograve ó 72 0 243 oacute ô 72 0 244 ocircumflex õ 72 0 245 otilde ö 72 0 246 odieresis ÷ 72 0 247 divide ø 72 0 248 oslash ù 72 0 249 ugrave ú 72 0 250 uacute û 72 0 251 ucircumflex ü 72 0 252 udieresis ý 72 0 253 yacute þ 72 0 254 thorn ÿ 72 0 255 ydieresis 9base-6/troff/font/devutf/DejaVuCondensedSansBoldOblique0000644000175000017500000007311611402154555023034 0ustar anselmanselmname DejaVuCondensedSansBoldOblique fontname DejaVuCondensedSansBoldOblique spacewidth 31 charset ! 43 2 33 0021 " 49 2 34 0022 dq " dq " # 67 2 35 0023 $ 66 3 36 0024 % 95 2 37 0025 & 83 2 38 0026 ( 44 3 40 0028 ) 43 3 41 0029 * 50 2 42 002a + 80 2 43 002b , 35 1 44 002c - 39 0 45 002d . 36 0 46 002e / 35 3 47 002f 0 66 2 48 0030 1 66 2 49 0031 2 66 2 50 0032 3 66 2 51 0033 4 66 2 52 0034 5 66 2 53 0035 6 66 2 54 0036 7 66 2 55 0037 8 66 2 56 0038 9 66 2 57 0039 : 38 0 58 003a ; 37 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 55 2 63 003f @ 95 3 64 0040 A 73 2 65 0041 B 72 2 66 0042 C 70 2 67 0043 D 79 2 68 0044 E 65 2 69 0045 F 65 2 70 0046 G 78 2 71 0047 H 79 2 72 0048 I 35 2 73 0049 J 34 3 74 004a K 74 2 75 004b L 60 2 76 004c M 95 2 77 004d N 79 2 78 004e O 81 2 79 004f P 70 2 80 0050 Q 81 3 81 0051 R 73 2 82 0052 S 68 2 83 0053 T 65 2 84 0054 U 77 2 85 0055 V 74 2 86 0056 W 106 2 87 0057 X 73 2 88 0058 Y 70 2 89 0059 Z 69 2 90 005a [ 43 3 91 005b \ 35 3 92 005c bs " ] 43 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 64 0 97 0061 b 68 2 98 0062 c 56 0 99 0063 d 68 2 100 0064 e 64 0 101 0065 f 42 2 102 0066 g 68 1 103 0067 h 67 2 104 0068 i 33 2 105 0069 j 32 3 106 006a k 64 2 107 006b l 33 2 108 006c m 99 0 109 006d n 67 0 110 006e o 65 0 111 006f p 68 1 112 0070 q 68 1 113 0071 r 47 0 114 0072 s 56 0 115 0073 t 46 2 116 0074 u 68 0 117 0075 v 62 0 118 0076 w 88 0 119 0077 x 61 0 120 0078 y 62 1 121 0079 z 55 0 122 007a { 68 3 123 007b | 35 3 124 007c } 67 3 125 007d ~ 80 0 126 007e   63 0 160 00a0 ¡ 43 2 161 00a1 ¢ 66 3 162 00a2 £ 66 2 163 00a3 ¤ 60 0 164 00a4 ¥ 66 2 165 00a5 ¦ 35 3 166 00a6 § 47 3 167 00a7 ¨ 48 2 168 00a8 © 95 2 169 00a9 ª 54 2 170 00aa « 62 0 171 00ab ¬ 80 0 172 00ac ­ 39 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 48 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 42 2 178 00b2 ³ 42 2 179 00b3 ´ 49 2 180 00b4 aa " µ 69 1 181 00b5 ¶ 61 3 182 00b6 · 36 0 183 00b7 ¸ 46 1 184 00b8 ¹ 42 2 185 00b9 º 54 2 186 00ba » 62 0 187 00bb ¼ 101 2 188 00bc ½ 101 2 189 00bd ¾ 101 2 190 00be ¿ 55 2 191 00bf À 73 2 192 00c0 Á 73 2 193 00c1  73 2 194 00c2 à 73 2 195 00c3 Ä 73 2 196 00c4 Å 73 2 197 00c5 Æ 103 2 198 00c6 Ç 70 3 199 00c7 È 65 2 200 00c8 É 65 2 201 00c9 Ê 65 2 202 00ca Ë 65 2 203 00cb Ì 35 2 204 00cc Í 36 2 205 00cd Î 36 2 206 00ce Ï 36 2 207 00cf Ð 80 2 208 00d0 Ñ 79 2 209 00d1 Ò 81 2 210 00d2 Ó 81 2 211 00d3 Ô 81 2 212 00d4 Õ 81 2 213 00d5 Ö 81 2 214 00d6 × 80 2 215 00d7 mu " Ø 81 2 216 00d8 Ù 77 2 217 00d9 Ú 77 2 218 00da Û 77 2 219 00db Ü 77 2 220 00dc Ý 70 2 221 00dd Þ 70 2 222 00de ß 68 2 223 00df à 64 2 224 00e0 á 64 2 225 00e1 â 64 2 226 00e2 ã 64 2 227 00e3 ä 64 2 228 00e4 å 64 2 229 00e5 æ 99 0 230 00e6 ç 56 1 231 00e7 è 64 2 232 00e8 é 65 2 233 00e9 ê 64 2 234 00ea ë 64 2 235 00eb ì 33 2 236 00ec í 33 2 237 00ed î 33 2 238 00ee ï 33 2 239 00ef ð 65 2 240 00f0 ñ 67 2 241 00f1 ò 65 2 242 00f2 ó 65 2 243 00f3 ô 65 2 244 00f4 õ 65 2 245 00f5 ö 65 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 65 0 248 00f8 ù 68 2 249 00f9 ú 68 2 250 00fa û 68 2 251 00fb ü 68 2 252 00fc ý 62 3 253 00fd þ 68 3 254 00fe ÿ 62 3 255 00ff ā 64 2 257 0101 Ă 73 2 258 0102 ă 64 2 259 0103 Ą 73 3 260 0104 ą 64 1 261 0105 Ć 70 2 262 0106 ć 57 2 263 0107 Ĉ 70 2 264 0108 ĉ 57 2 265 0109 Ċ 70 2 266 010a ċ 56 2 267 010b Č 70 2 268 010c č 57 2 269 010d Ď 79 2 270 010e ď 69 2 271 010f Đ 80 2 272 0110 đ 69 2 273 0111 Ē 65 2 274 0112 ē 64 2 275 0113 Ĕ 65 2 276 0114 ĕ 64 2 277 0115 Ė 65 2 278 0116 ė 64 2 279 0117 Ę 65 3 280 0118 ę 64 1 281 0119 Ě 65 2 282 011a ě 65 2 283 011b Ĝ 78 2 284 011c ĝ 68 3 285 011d Ğ 78 2 286 011e ğ 68 3 287 011f Ġ 78 2 288 0120 ġ 68 3 289 0121 Ģ 78 3 290 0122 ģ 68 3 291 0123 Ĥ 79 2 292 0124 ĥ 67 2 293 0125 Ħ 93 2 294 0126 ħ 75 2 295 0127 Ĩ 36 2 296 0128 ĩ 33 2 297 0129 Ī 36 2 298 012a ī 33 2 299 012b Ĭ 36 2 300 012c ĭ 33 2 301 012d Į 35 3 302 012e į 33 3 303 012f İ 35 2 304 0130 ı 33 0 305 0131 IJ 71 3 306 0132 ij 65 3 307 0133 Ĵ 35 3 308 0134 ĵ 32 3 309 0135 Ķ 74 3 310 0136 ķ 64 3 311 0137 ĸ 64 0 312 0138 Ĺ 61 2 313 0139 ĺ 33 2 314 013a Ļ 60 3 315 013b ļ 32 3 316 013c Ľ 61 2 317 013d ľ 44 2 318 013e Ŀ 61 2 319 013f ŀ 47 2 320 0140 Ł 62 2 321 0141 ł 36 2 322 0142 Ń 79 2 323 0143 ń 67 2 324 0144 Ņ 79 3 325 0145 ņ 67 1 326 0146 Ň 79 2 327 0147 ň 68 2 328 0148 ʼn 93 2 329 0149 Ŋ 79 3 330 014a ŋ 68 1 331 014b Ō 81 2 332 014c ō 65 2 333 014d Ŏ 81 2 334 014e ŏ 65 2 335 014f Ő 81 2 336 0150 ő 65 2 337 0151 Œ 111 2 338 0152 œ 104 0 339 0153 Ŕ 73 2 340 0154 ŕ 48 2 341 0155 Ŗ 73 3 342 0156 ŗ 47 1 343 0157 Ř 73 2 344 0158 ř 48 2 345 0159 Ś 68 2 346 015a ś 57 2 347 015b Ŝ 68 2 348 015c ŝ 56 2 349 015d Ş 68 3 350 015e ş 56 1 351 015f Š 68 2 352 0160 š 57 2 353 0161 Ţ 65 3 354 0162 ţ 46 3 355 0163 Ť 65 2 356 0164 ť 46 2 357 0165 Ŧ 65 2 358 0166 ŧ 45 2 359 0167 Ũ 77 2 360 0168 ũ 68 2 361 0169 Ū 77 2 362 016a ū 68 2 363 016b Ŭ 77 2 364 016c ŭ 68 2 365 016d Ů 77 2 366 016e ů 68 2 367 016f Ű 77 2 368 0170 ű 68 2 369 0171 Ų 77 3 370 0172 ų 68 1 371 0173 Ŵ 106 2 372 0174 ŵ 88 2 373 0175 Ŷ 70 2 374 0176 ŷ 62 3 375 0177 Ÿ 70 2 376 0178 Ź 69 2 377 0179 ź 55 2 378 017a Ż 69 2 379 017b ż 55 2 380 017c Ž 69 2 381 017d ž 55 2 382 017e ſ 42 2 383 017f ƀ 68 2 384 0180 Ɓ 77 2 385 0181 Ƃ 72 2 386 0182 ƃ 68 2 387 0183 Ƅ 72 2 388 0184 ƅ 68 2 389 0185 Ɔ 69 2 390 0186 Ƈ 71 2 391 0187 ƈ 57 2 392 0188 Ɖ 80 2 393 0189 Ɗ 83 2 394 018a Ƌ 73 2 395 018b ƌ 68 2 396 018c ƍ 65 1 397 018d Ǝ 65 2 398 018e Ə 81 2 399 018f Ɛ 66 2 400 0190 Ƒ 64 3 401 0191 ƒ 41 3 402 0192 Ɠ 79 2 403 0193 Ɣ 72 3 404 0194 ƕ 99 2 405 0195 Ɩ 41 2 406 0196 Ɨ 37 2 407 0197 Ƙ 74 2 408 0198 ƙ 63 2 409 0199 ƚ 34 2 410 019a ƛ 56 2 411 019b Ɯ 99 2 412 019c Ɲ 79 3 413 019d ƞ 68 1 414 019e Ɵ 81 2 415 019f Ơ 81 2 416 01a0 ơ 66 0 417 01a1 Ƣ 106 2 418 01a2 ƣ 91 1 419 01a3 Ƥ 74 2 420 01a4 ƥ 68 3 421 01a5 Ʀ 70 3 422 01a6 Ƨ 68 2 423 01a7 ƨ 56 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 52 3 426 01aa ƫ 46 3 427 01ab Ƭ 67 2 428 01ac ƭ 46 2 429 01ad Ʈ 66 3 430 01ae Ư 78 2 431 01af ư 68 0 432 01b0 Ʊ 73 2 433 01b1 Ʋ 77 2 434 01b2 Ƴ 70 2 435 01b3 ƴ 63 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 55 0 438 01b6 Ʒ 73 2 439 01b7 Ƹ 73 2 440 01b8 ƹ 61 1 441 01b9 ƻ 66 2 443 01bb Ƽ 73 2 444 01bc ƽ 60 1 445 01bd ƾ 54 2 446 01be ǀ 35 3 448 01c0 ǁ 71 3 449 01c1 ǂ 52 3 450 01c2 ǃ 35 2 451 01c3 DŽ 147 2 452 01c4 Dž 138 2 453 01c5 dž 124 2 454 01c6 LJ 93 3 455 01c7 Lj 93 3 456 01c8 lj 64 3 457 01c9 NJ 113 3 458 01ca Nj 115 3 459 01cb nj 101 3 460 01cc Ǎ 73 2 461 01cd ǎ 64 2 462 01ce Ǐ 36 2 463 01cf ǐ 33 2 464 01d0 Ǒ 81 2 465 01d1 ǒ 65 2 466 01d2 Ǔ 77 2 467 01d3 ǔ 68 2 468 01d4 ǖ 68 2 470 01d6 Ǘ 80 2 471 01d7 ǘ 70 2 472 01d8 Ǚ 80 2 473 01d9 ǚ 70 2 474 01da Ǜ 79 2 475 01db ǜ 70 2 476 01dc ǝ 64 0 477 01dd ǟ 64 2 479 01df Ǣ 103 2 482 01e2 ǣ 99 2 483 01e3 Ǫ 81 3 490 01ea ǫ 65 1 491 01eb Ǭ 81 3 492 01ec ǭ 65 3 493 01ed DZ 147 2 497 01f1 Dz 138 2 498 01f2 dz 124 2 499 01f3 Ƕ 122 2 502 01f6 Ș 68 3 536 0218 ș 56 1 537 0219 Ț 65 3 538 021a ț 46 3 539 021b Ȥ 69 3 548 0224 ȥ 55 1 549 0225 ȫ 65 2 555 022b ȭ 65 2 557 022d Ȯ 81 2 558 022e ȯ 65 2 559 022f ȱ 65 2 561 0231 Ȳ 70 2 562 0232 ȳ 62 3 563 0233 ȷ 32 1 567 0237 ȸ 103 2 568 0238 ȹ 104 1 569 0239 Ⱥ 73 2 570 023a Ȼ 70 2 571 023b ȼ 56 0 572 023c Ƚ 60 2 573 023d Ⱦ 65 2 574 023e ȿ 57 1 575 023f ɀ 55 1 576 0240 Ɂ 75 2 577 0241 ɐ 64 0 592 0250 ɑ 68 0 593 0251 ɒ 68 0 594 0252 ɓ 68 2 595 0253 ɔ 56 0 596 0254 ɕ 56 0 597 0255 ɖ 68 2 598 0256 ɗ 76 2 599 0257 ɘ 64 0 600 0258 ə 64 0 601 0259 ɚ 83 0 602 025a ɛ 52 0 603 025b ɜ 51 0 604 025c ɝ 73 0 605 025d ɞ 65 0 606 025e ɟ 32 1 607 025f ɠ 76 3 608 0260 ɡ 68 1 609 0261 ɢ 59 0 610 0262 ɣ 70 1 611 0263 ɤ 61 1 612 0264 ɥ 68 1 613 0265 ɦ 67 2 614 0266 ɧ 67 3 615 0267 ɨ 52 2 616 0268 ɩ 42 0 617 0269 ɪ 52 0 618 026a ɫ 53 2 619 026b ɬ 66 2 620 026c ɭ 33 3 621 026d ɮ 67 3 622 026e ɯ 99 0 623 026f ɰ 99 1 624 0270 ɱ 99 1 625 0271 ɲ 67 1 626 0272 ɳ 75 1 627 0273 ɴ 61 0 628 0274 ɵ 65 0 629 0275 ɶ 86 0 630 0276 ɷ 64 0 631 0277 ɸ 73 3 632 0278 ɹ 51 0 633 0279 ɺ 51 2 634 027a ɻ 62 1 635 027b ɼ 47 1 636 027c ɽ 47 1 637 027d ɾ 47 0 638 027e ɿ 47 0 639 027f ʀ 60 0 640 0280 ʁ 61 0 641 0281 ʂ 57 1 642 0282 ʃ 39 3 643 0283 ʄ 41 3 644 0284 ʅ 58 1 645 0285 ʆ 52 3 646 0286 ʇ 45 1 647 0287 ʈ 46 3 648 0288 ʉ 87 0 649 0289 ʊ 73 1 650 028a ʋ 64 0 651 028b ʌ 61 0 652 028c ʍ 87 0 653 028d ʎ 61 2 654 028e ʏ 69 0 655 028f ʐ 66 1 656 0290 ʑ 55 0 657 0291 ʒ 61 1 658 0292 ʓ 61 1 659 0293 ʔ 55 2 660 0294 ʕ 55 2 661 0295 ʖ 54 2 662 0296 ʗ 55 3 663 0297 ʘ 63 0 664 0298 ʙ 61 0 665 0299 ʚ 66 0 666 029a ʛ 65 2 667 029b ʜ 61 0 668 029c ʝ 31 3 669 029d ʞ 70 1 670 029e ʟ 46 0 671 029f ʠ 76 3 672 02a0 ʡ 54 2 673 02a1 ʢ 55 2 674 02a2 ʣ 110 2 675 02a3 ʤ 115 3 676 02a4 ʥ 110 3 677 02a5 ʦ 92 2 678 02a6 ʧ 74 3 679 02a7 ʨ 88 3 680 02a8 ʩ 98 3 681 02a9 ʪ 75 2 682 02aa ʫ 74 2 683 02ab ʬ 56 2 684 02ac ʭ 39 2 685 02ad ʮ 64 3 686 02ae ʯ 75 3 687 02af ʰ 43 2 688 02b0 ʱ 43 2 689 02b1 ʲ 20 2 690 02b2 ʳ 30 2 691 02b3 ʴ 30 2 692 02b4 ʵ 31 2 693 02b5 ʶ 39 2 694 02b6 ʷ 56 2 695 02b7 ʸ 40 2 696 02b8 ʻ 37 2 699 02bb ʼ 36 2 700 02bc ʾ 35 2 702 02be ʿ 35 2 703 02bf ˀ 31 2 704 02c0 ˁ 31 2 705 02c1 ˆ 48 2 710 02c6 ˇ 48 2 711 02c7 ˈ 29 2 712 02c8 ˌ 29 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 35 2 722 02d2 ˓ 35 0 723 02d3 ˖ 47 0 726 02d6 ˘ 48 2 728 02d8 ˙ 48 2 729 02d9 ˚ 48 2 730 02da ˛ 47 1 731 02db ˜ 48 2 732 02dc ˝ 48 2 733 02dd ˞ 33 0 734 02de ˠ 40 2 736 02e0 ˡ 21 2 737 02e1 ˢ 36 2 738 02e2 ˣ 39 2 739 02e3 ˤ 31 2 740 02e4 ˥ 48 2 741 02e5 ˦ 48 2 742 02e6 ˧ 48 2 743 02e7 ˨ 48 2 744 02e8 ˩ 48 2 745 02e9 ́ 50 2 769 0301 ̂ 49 2 770 0302 ̃ 49 2 771 0303 ̄ 49 2 772 0304 ̅ 0 2 773 0305 ̆ 49 2 774 0306 ̇ 49 2 775 0307 ̈ 49 2 776 0308 ̉ 0 2 777 0309 ̊ 49 2 778 030a ̋ 50 2 779 030b ̌ 49 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 36 0 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 68 1 801 0321 ̢ 70 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 1 2 856 0358 ͡ 1 2 865 0361 ʹ 29 2 884 0374 ͵ 29 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 43 2 900 0384 ΅ 49 2 901 0385 Ά 75 2 902 0386 · 36 0 903 0387 Έ 80 2 904 0388 Ή 96 2 905 0389 Ί 53 2 906 038a Ό 84 2 908 038c Ύ 94 2 910 038e Ώ 82 2 911 038f ΐ 38 2 912 0390 Α 73 2 913 0391 Β 72 2 914 0392 Γ 61 2 915 0393 Δ 73 2 916 0394 Ε 65 2 917 0395 Ζ 69 2 918 0396 Η 79 2 919 0397 Θ 81 2 920 0398 Ι 35 2 921 0399 Κ 74 2 922 039a Λ 73 2 923 039b Μ 95 2 924 039c Ν 79 2 925 039d Ξ 60 2 926 039e Ο 81 2 927 039f Π 79 2 928 03a0 Ρ 70 2 929 03a1 Σ 60 2 931 03a3 Τ 65 2 932 03a4 Υ 70 2 933 03a5 Φ 81 2 934 03a6 Χ 73 2 935 03a7 Ψ 75 2 936 03a8 Ω 73 2 937 03a9 Ϊ 38 2 938 03aa Ϋ 71 2 939 03ab ά 65 2 940 03ac έ 53 2 941 03ad ή 68 3 942 03ae ί 37 2 943 03af ΰ 58 2 944 03b0 α 65 0 945 03b1 β 63 3 946 03b2 γ 65 1 947 03b3 δ 65 2 948 03b4 ε 53 0 949 03b5 ζ 60 3 950 03b6 η 68 1 951 03b7 θ 64 2 952 03b8 ι 37 0 953 03b9 κ 67 0 954 03ba λ 59 2 955 03bb μ 69 1 956 03bc ν 65 0 957 03bd ξ 56 3 958 03be ο 65 0 959 03bf π 75 0 960 03c0 ρ 68 1 961 03c1 ς 57 1 962 03c2 σ 74 0 963 03c3 τ 55 0 964 03c4 υ 58 0 965 03c5 φ 75 1 966 03c6 χ 61 1 967 03c7 ψ 76 1 968 03c8 ω 80 0 969 03c9 ϊ 37 2 970 03ca ϋ 58 2 971 03cb ό 65 2 972 03cc ύ 58 2 973 03cd ώ 80 2 974 03ce ϐ 62 2 976 03d0 ϑ 63 2 977 03d1 ϒ 71 2 978 03d2 ϓ 93 2 979 03d3 ϔ 73 2 980 03d4 ϕ 76 3 981 03d5 ϖ 80 0 982 03d6 ϗ 71 1 983 03d7 Ϙ 81 3 984 03d8 ϙ 65 1 985 03d9 Ϛ 70 3 986 03da ϛ 57 1 987 03db Ϝ 65 2 988 03dc ϝ 46 3 989 03dd Ϟ 67 2 990 03de ϟ 63 2 991 03df Ϡ 87 3 992 03e0 ϡ 59 1 993 03e1 ϰ 71 0 1008 03f0 ϱ 68 1 1009 03f1 ϲ 56 0 1010 03f2 ϳ 32 3 1011 03f3 ϴ 81 2 1012 03f4 ϵ 61 0 1013 03f5 ϶ 60 0 1014 03f6 Ϸ 70 2 1015 03f7 ϸ 68 3 1016 03f8 Ϲ 70 2 1017 03f9 Ϻ 95 2 1018 03fa ϻ 69 1 1019 03fb ϼ 68 1 1020 03fc Ͻ 69 2 1021 03fd Ͼ 70 2 1022 03fe Ͽ 66 2 1023 03ff Ё 65 2 1025 0401 Ђ 83 3 1026 0402 Ѓ 61 2 1027 0403 Є 70 2 1028 0404 Ѕ 68 2 1029 0405 І 35 2 1030 0406 Ї 36 2 1031 0407 Ј 34 3 1032 0408 Љ 109 2 1033 0409 Њ 107 2 1034 040a Ћ 83 2 1035 040b Ќ 74 2 1036 040c Ѝ 79 2 1037 040d Ў 74 2 1038 040e Џ 80 3 1039 040f А 73 2 1040 0410 Б 72 2 1041 0411 В 72 2 1042 0412 Г 61 2 1043 0413 Д 90 3 1044 0414 Е 65 2 1045 0415 Ж 96 2 1046 0416 З 66 2 1047 0417 И 79 2 1048 0418 Й 79 2 1049 0419 К 74 2 1050 041a Л 79 2 1051 041b М 95 2 1052 041c Н 79 2 1053 041d О 81 2 1054 041e П 79 2 1055 041f Р 70 2 1056 0420 С 70 2 1057 0421 Т 65 2 1058 0422 У 74 2 1059 0423 Ф 81 2 1060 0424 Х 73 2 1061 0425 Ц 91 3 1062 0426 Ч 77 2 1063 0427 Ш 111 2 1064 0428 Щ 122 3 1065 0429 Ъ 89 2 1066 042a Ы 98 2 1067 042b Ь 72 2 1068 042c Э 69 2 1069 042d Ю 108 2 1070 042e Я 73 2 1071 042f а 64 0 1072 0430 б 65 2 1073 0431 в 58 0 1074 0432 г 50 0 1075 0433 д 77 1 1076 0434 е 64 0 1077 0435 ж 78 0 1078 0436 з 53 0 1079 0437 и 66 0 1080 0438 й 66 2 1081 0439 к 60 0 1082 043a л 65 0 1083 043b м 78 0 1084 043c н 66 0 1085 043d о 65 0 1086 043e п 66 0 1087 043f р 68 1 1088 0440 с 56 0 1089 0441 т 55 0 1090 0442 у 62 1 1091 0443 ф 87 3 1092 0444 х 61 0 1093 0445 ц 76 1 1094 0446 ч 65 0 1095 0447 ш 91 0 1096 0448 щ 102 1 1097 0449 ъ 71 0 1098 044a ы 82 0 1099 044b ь 58 0 1100 044c э 61 0 1101 044d ю 87 0 1102 044e я 61 0 1103 044f ѐ 64 2 1104 0450 ё 64 2 1105 0451 ђ 67 3 1106 0452 ѓ 50 2 1107 0453 є 61 0 1108 0454 ѕ 56 0 1109 0455 і 33 2 1110 0456 ї 33 2 1111 0457 ј 32 3 1112 0458 љ 91 0 1113 0459 њ 91 0 1114 045a ћ 67 2 1115 045b ќ 60 2 1116 045c ѝ 66 2 1117 045d ў 62 3 1118 045e џ 66 1 1119 045f Ѥ 96 2 1124 0464 ѥ 80 0 1125 0465 Ҋ 90 3 1162 048a ҋ 76 3 1163 048b Ҍ 72 2 1164 048c ҍ 58 2 1165 048d Ґ 61 2 1168 0490 ґ 50 2 1169 0491 Ғ 61 2 1170 0492 ғ 50 0 1171 0493 Ҕ 75 3 1172 0494 ҕ 50 1 1173 0495 Җ 96 3 1174 0496 җ 78 1 1175 0497 Ҙ 66 3 1176 0498 ҙ 53 1 1177 0499 Қ 74 3 1178 049a қ 60 1 1179 049b Ҡ 93 2 1184 04a0 ҡ 74 0 1185 04a1 Ң 80 3 1186 04a2 ң 66 1 1187 04a3 Ҥ 105 2 1188 04a4 ҥ 83 0 1189 04a5 Ҧ 119 3 1190 04a6 ҧ 93 1 1191 04a7 Ҫ 70 3 1194 04aa ҫ 56 1 1195 04ab Ҭ 65 3 1196 04ac ҭ 55 1 1197 04ad Ү 70 2 1198 04ae ү 62 1 1199 04af Ұ 69 2 1200 04b0 ұ 62 1 1201 04b1 Ҳ 73 3 1202 04b2 ҳ 61 1 1203 04b3 Ҵ 105 3 1204 04b4 ҵ 95 1 1205 04b5 Ҷ 78 3 1206 04b6 ҷ 66 1 1207 04b7 Һ 77 2 1210 04ba һ 65 0 1211 04bb Ӏ 33 2 1216 04c0 Ӂ 98 2 1217 04c1 ӂ 78 2 1218 04c2 Ӆ 79 3 1221 04c5 ӆ 66 1 1222 04c6 Ӈ 79 3 1223 04c7 ӈ 66 1 1224 04c8 Ӊ 89 3 1225 04c9 ӊ 76 1 1226 04ca Ӌ 77 3 1227 04cb ӌ 65 1 1228 04cc Ӎ 104 3 1229 04cd ӎ 88 1 1230 04ce Ӑ 73 2 1232 04d0 ӑ 64 2 1233 04d1 Ӓ 75 2 1234 04d2 ӓ 64 2 1235 04d3 Ӕ 103 2 1236 04d4 ӕ 99 0 1237 04d5 Ӗ 67 2 1238 04d6 ӗ 64 2 1239 04d7 Ә 81 2 1240 04d8 ә 64 0 1241 04d9 Ӛ 83 2 1242 04da ӛ 64 2 1243 04db Ӝ 98 2 1244 04dc ӝ 78 2 1245 04dd Ӟ 68 2 1246 04de ӟ 53 2 1247 04df Ӡ 73 2 1248 04e0 ӡ 61 1 1249 04e1 Ӣ 79 2 1250 04e2 ӣ 66 2 1251 04e3 Ӥ 81 2 1252 04e4 ӥ 66 2 1253 04e5 Ӧ 83 2 1254 04e6 ӧ 65 2 1255 04e7 Ө 81 2 1256 04e8 ө 65 0 1257 04e9 Ӫ 83 2 1258 04ea ӫ 65 2 1259 04eb Ӭ 72 2 1260 04ec ӭ 57 2 1261 04ed Ӯ 74 2 1262 04ee ӯ 62 3 1263 04ef Ӱ 75 2 1264 04f0 ӱ 62 3 1265 04f1 Ӳ 76 2 1266 04f2 ӳ 62 3 1267 04f3 Ӵ 79 2 1268 04f4 ӵ 65 2 1269 04f5 Ӷ 61 3 1270 04f6 ӷ 50 1 1271 04f7 Ӹ 100 2 1272 04f8 ӹ 81 2 1273 04f9 Ա 93 2 1329 0531 Բ 77 2 1330 0532 Գ 94 2 1331 0533 Դ 94 2 1332 0534 Ե 77 2 1333 0535 Զ 73 3 1334 0536 Է 77 3 1335 0537 Ը 77 3 1336 0538 Թ 92 2 1337 0539 Ժ 94 2 1338 053a Ի 77 2 1339 053b Լ 67 3 1340 053c Խ 102 2 1341 053d Ծ 108 2 1342 053e Կ 77 2 1343 053f Հ 67 3 1344 0540 Ձ 72 2 1345 0541 Ղ 94 3 1346 0542 Ճ 83 2 1347 0543 Մ 94 2 1348 0544 Յ 75 2 1349 0545 Ն 93 2 1350 0546 Շ 77 2 1351 0547 Ո 77 2 1352 0548 Չ 77 3 1353 0549 Պ 91 2 1354 054a Ջ 73 3 1355 054b Ռ 93 2 1356 054c Ս 77 2 1357 054d Վ 94 3 1358 054e Տ 68 2 1359 054f Ր 77 2 1360 0550 Ց 75 2 1361 0551 Ւ 85 2 1362 0552 Փ 81 2 1363 0553 Ք 89 2 1364 0554 Օ 81 2 1365 0555 Ֆ 68 2 1366 0556 ՙ 35 2 1369 0559 ՚ 36 2 1370 055a ՛ 52 2 1371 055b ՜ 52 2 1372 055c ՝ 37 2 1373 055d ՞ 52 2 1374 055e ՟ 49 2 1375 055f ա 99 0 1377 0561 բ 67 1 1378 0562 գ 78 1 1379 0563 դ 78 1 1380 0564 զ 77 1 1382 0566 է 62 3 1383 0567 ը 67 1 1384 0568 թ 77 1 1385 0569 ժ 78 2 1386 056a ի 67 3 1387 056b լ 47 1 1388 056c խ 99 3 1389 056d ծ 68 2 1390 056e կ 68 3 1391 056f հ 67 2 1392 0570 ձ 68 2 1393 0571 ղ 78 1 1394 0572 ճ 68 2 1395 0573 մ 72 2 1396 0574 յ 32 1 1397 0575 ն 84 2 1398 0576 շ 53 1 1399 0577 ո 67 0 1400 0578 չ 53 1 1401 0579 պ 99 1 1402 057a ջ 53 1 1403 057b ռ 67 0 1404 057c ս 68 0 1405 057d վ 77 3 1406 057e տ 99 0 1407 057f ր 67 1 1408 0580 ց 68 1 1409 0581 ւ 47 0 1410 0582 փ 99 3 1411 0583 ք 73 1 1412 0584 օ 65 0 1413 0585 ֆ 68 3 1414 0586 և 82 2 1415 0587 ։ 38 0 1417 0589 ֊ 51 0 1418 058a ᴂ 100 0 7426 1d02 ᴈ 53 0 7432 1d08 ᴉ 33 1 7433 1d09 ᴔ 104 0 7444 1d14 ᴖ 67 0 7446 1d16 ᴗ 67 0 7447 1d17 ᴝ 70 0 7453 1d1d ᴞ 91 0 7454 1d1e ᴟ 66 1 7455 1d1f ᵃ 43 2 7491 1d43 ᵄ 43 2 7492 1d44 ᵅ 46 2 7493 1d45 ᵆ 68 2 7494 1d46 ᵇ 45 2 7495 1d47 ᵈ 46 2 7496 1d48 ᵉ 45 2 7497 1d49 ᵊ 45 2 7498 1d4a ᵋ 37 2 7499 1d4b ᵌ 37 2 7500 1d4c ᵍ 46 2 7501 1d4d ᵎ 21 2 7502 1d4e ᵏ 46 2 7503 1d4f ᵐ 63 2 7504 1d50 ᵑ 43 2 7505 1d51 ᵒ 46 2 7506 1d52 ᵓ 39 2 7507 1d53 ᵔ 47 2 7508 1d54 ᵕ 47 0 7509 1d55 ᵖ 45 2 7510 1d56 ᵗ 37 2 7511 1d57 ᵘ 43 2 7512 1d58 ᵙ 44 2 7513 1d59 ᵚ 63 2 7514 1d5a ᵛ 48 2 7515 1d5b ᵷ 68 1 7543 1d77 ᵻ 36 0 7547 1d7b ᶅ 49 3 7557 1d85 ᶛ 54 2 7579 1d9b ᶜ 48 2 7580 1d9c ᶝ 48 2 7581 1d9d ᶞ 55 2 7582 1d9e ᶟ 45 2 7583 1d9f ᶠ 45 2 7584 1da0 ᶡ 42 2 7585 1da1 ᶢ 54 2 7586 1da2 ᶣ 52 2 7587 1da3 ᶤ 42 2 7588 1da4 ᶥ 35 2 7589 1da5 ᶦ 42 2 7590 1da6 ᶧ 42 2 7591 1da7 ᶨ 50 2 7592 1da8 ᶩ 39 2 7593 1da9 ᶪ 40 2 7594 1daa ᶫ 43 2 7595 1dab ᶬ 72 2 7596 1dac ᶭ 72 2 7597 1dad ᶮ 62 2 7598 1dae ᶯ 62 2 7599 1daf ᶰ 51 2 7600 1db0 ᶱ 55 2 7601 1db1 ᶲ 60 2 7602 1db2 ᶳ 49 2 7603 1db3 ᶴ 46 2 7604 1db4 ᶵ 46 2 7605 1db5 ᶶ 64 2 7606 1db6 ᶷ 56 2 7607 1db7 ᶹ 52 2 7609 1db9 ᶺ 56 2 7610 1dba ᶻ 48 2 7611 1dbb ᶼ 58 2 7612 1dbc ᶽ 53 2 7613 1dbd ᶾ 52 2 7614 1dbe ᶿ 49 2 7615 1dbf Ḍ 79 3 7692 1e0c ḍ 68 3 7693 1e0d Ḓ 80 3 7698 1e12 ḓ 68 3 7699 1e13 Ḥ 79 3 7716 1e24 ḥ 67 3 7717 1e25 Ḷ 60 3 7734 1e36 ḷ 33 3 7735 1e37 Ḹ 61 3 7736 1e38 ḹ 33 3 7737 1e39 Ḽ 59 3 7740 1e3c ḽ 36 3 7741 1e3d ṁ 99 2 7745 1e41 Ṃ 95 3 7746 1e42 ṃ 99 1 7747 1e43 Ṅ 77 2 7748 1e44 ṅ 69 2 7749 1e45 Ṇ 79 3 7750 1e46 ṇ 67 1 7751 1e47 Ṋ 77 3 7754 1e4a ṋ 68 1 7755 1e4b ṗ 68 3 7767 1e57 Ṛ 73 3 7770 1e5a ṛ 47 1 7771 1e5b Ṝ 73 3 7772 1e5c ṝ 47 3 7773 1e5d ṡ 56 2 7777 1e61 Ṣ 68 3 7778 1e62 ṣ 56 1 7779 1e63 Ṭ 65 3 7788 1e6c ṭ 46 3 7789 1e6d Ṱ 65 3 7792 1e70 ṱ 47 3 7793 1e71 Ṿ 74 3 7806 1e7e ṿ 62 1 7807 1e7f Ẁ 106 2 7808 1e80 ẁ 88 2 7809 1e81 Ẃ 106 2 7810 1e82 ẃ 88 2 7811 1e83 Ẅ 106 2 7812 1e84 ẅ 88 2 7813 1e85 Ẹ 65 3 7864 1eb8 ẹ 64 1 7865 1eb9 Ị 35 3 7882 1eca ị 33 3 7883 1ecb Ọ 81 3 7884 1ecc ọ 65 1 7885 1ecd Ụ 77 3 7908 1ee4 ụ 68 1 7909 1ee5 Ỳ 70 2 7922 1ef2 ỳ 62 3 7923 1ef3 ἁ 65 2 7937 1f01 ἂ 65 2 7938 1f02 ἃ 65 2 7939 1f03 ἄ 65 2 7940 1f04 ἅ 65 2 7941 1f05 ἆ 65 2 7942 1f06 ἇ 65 2 7943 1f07 Ἀ 73 2 7944 1f08 Ἁ 73 2 7945 1f09 Ἂ 98 2 7946 1f0a Ἃ 99 2 7947 1f0b Ἄ 88 2 7948 1f0c Ἅ 91 2 7949 1f0d Ἆ 79 2 7950 1f0e Ἇ 81 2 7951 1f0f ἐ 53 2 7952 1f10 ἑ 53 2 7953 1f11 ἒ 53 2 7954 1f12 ἓ 53 2 7955 1f13 ἔ 53 2 7956 1f14 ἕ 53 2 7957 1f15 Ἐ 75 2 7960 1f18 Ἑ 75 2 7961 1f19 Ἒ 104 2 7962 1f1a Ἓ 104 2 7963 1f1b Ἔ 97 2 7964 1f1c Ἕ 100 2 7965 1f1d ἠ 68 3 7968 1f20 ἡ 68 3 7969 1f21 ἢ 68 3 7970 1f22 ἣ 68 3 7971 1f23 ἤ 68 3 7972 1f24 ἥ 68 3 7973 1f25 ἦ 68 3 7974 1f26 ἧ 68 3 7975 1f27 Ἠ 89 2 7976 1f28 Ἡ 90 2 7977 1f29 Ἢ 118 2 7978 1f2a Ἣ 119 2 7979 1f2b Ἤ 112 2 7980 1f2c Ἥ 114 2 7981 1f2d Ἦ 100 2 7982 1f2e Ἧ 101 2 7983 1f2f ἰ 37 2 7984 1f30 ἱ 37 2 7985 1f31 ἲ 37 2 7986 1f32 ἳ 37 2 7987 1f33 ἴ 38 2 7988 1f34 ἵ 38 2 7989 1f35 ἶ 37 2 7990 1f36 ἷ 37 2 7991 1f37 Ἰ 46 2 7992 1f38 Ἱ 47 2 7993 1f39 Ἲ 74 2 7994 1f3a Ἳ 75 2 7995 1f3b Ἴ 67 2 7996 1f3c Ἵ 70 2 7997 1f3d Ἶ 58 2 7998 1f3e Ἷ 58 2 7999 1f3f ὀ 65 2 8000 1f40 ὁ 65 2 8001 1f41 ὂ 65 2 8002 1f42 ὃ 65 2 8003 1f43 ὄ 66 2 8004 1f44 ὅ 66 2 8005 1f45 Ὀ 84 2 8008 1f48 Ὁ 88 2 8009 1f49 Ὂ 116 2 8010 1f4a Ὃ 116 2 8011 1f4b Ὄ 100 2 8012 1f4c Ὅ 103 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 59 2 8020 1f54 ὕ 59 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 89 2 8025 1f59 Ὓ 113 2 8027 1f5b Ὕ 114 2 8029 1f5d Ὗ 100 2 8031 1f5f ὠ 80 2 8032 1f60 ὡ 80 2 8033 1f61 ὢ 80 2 8034 1f62 ὣ 80 2 8035 1f63 ὤ 80 2 8036 1f64 ὥ 80 2 8037 1f65 ὦ 80 2 8038 1f66 ὧ 80 2 8039 1f67 Ὠ 78 2 8040 1f68 Ὡ 83 2 8041 1f69 Ὢ 110 2 8042 1f6a Ὣ 111 2 8043 1f6b Ὤ 94 2 8044 1f6c Ὥ 97 2 8045 1f6d Ὦ 90 2 8046 1f6e Ὧ 95 2 8047 1f6f ὰ 65 2 8048 1f70 ά 65 2 8049 1f71 ὲ 53 2 8050 1f72 έ 53 2 8051 1f73 ὴ 68 3 8052 1f74 ή 68 3 8053 1f75 ὶ 37 2 8054 1f76 ί 37 2 8055 1f77 ὸ 65 2 8056 1f78 ό 65 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 80 2 8060 1f7c ώ 80 2 8061 1f7d ᾀ 65 3 8064 1f80 ᾁ 65 3 8065 1f81 ᾂ 65 3 8066 1f82 ᾃ 65 3 8067 1f83 ᾄ 65 3 8068 1f84 ᾅ 65 3 8069 1f85 ᾆ 65 3 8070 1f86 ᾇ 65 3 8071 1f87 ᾈ 73 3 8072 1f88 ᾉ 73 3 8073 1f89 ᾊ 98 3 8074 1f8a ᾋ 98 3 8075 1f8b ᾌ 88 3 8076 1f8c ᾍ 91 3 8077 1f8d ᾎ 79 3 8078 1f8e ᾏ 81 3 8079 1f8f ᾐ 68 3 8080 1f90 ᾑ 68 3 8081 1f91 ᾒ 68 3 8082 1f92 ᾓ 68 3 8083 1f93 ᾔ 68 3 8084 1f94 ᾕ 68 3 8085 1f95 ᾖ 68 3 8086 1f96 ᾗ 68 3 8087 1f97 ᾘ 89 3 8088 1f98 ᾙ 90 3 8089 1f99 ᾚ 118 3 8090 1f9a ᾛ 118 3 8091 1f9b ᾜ 111 3 8092 1f9c ᾝ 114 3 8093 1f9d ᾞ 100 3 8094 1f9e ᾟ 101 3 8095 1f9f ᾠ 80 3 8096 1fa0 ᾡ 80 3 8097 1fa1 ᾢ 80 3 8098 1fa2 ᾣ 80 3 8099 1fa3 ᾤ 80 3 8100 1fa4 ᾥ 80 3 8101 1fa5 ᾦ 80 3 8102 1fa6 ᾧ 80 3 8103 1fa7 ᾨ 78 3 8104 1fa8 ᾩ 83 3 8105 1fa9 ᾪ 110 3 8106 1faa ᾫ 111 3 8107 1fab ᾬ 94 3 8108 1fac ᾭ 97 3 8109 1fad ᾮ 90 3 8110 1fae ᾯ 95 3 8111 1faf ᾰ 65 2 8112 1fb0 ᾱ 65 2 8113 1fb1 ᾲ 65 3 8114 1fb2 ᾳ 65 1 8115 1fb3 ᾴ 65 3 8116 1fb4 ᾶ 65 2 8118 1fb6 ᾷ 65 3 8119 1fb7 Ᾰ 75 2 8120 1fb8 Ᾱ 73 2 8121 1fb9 Ὰ 83 2 8122 1fba Ά 75 2 8123 1fbb ᾼ 73 3 8124 1fbc ᾽ 48 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 48 2 8127 1fbf ῀ 48 2 8128 1fc0 ῁ 48 2 8129 1fc1 ῂ 68 3 8130 1fc2 ῃ 68 1 8131 1fc3 ῄ 68 3 8132 1fc4 ῆ 68 3 8134 1fc6 ῇ 68 3 8135 1fc7 Ὲ 88 2 8136 1fc8 Έ 80 2 8137 1fc9 Ὴ 103 2 8138 1fca Ή 96 2 8139 1fcb ῌ 79 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 48 2 8143 1fcf ῐ 37 2 8144 1fd0 ῑ 37 2 8145 1fd1 ῒ 37 2 8146 1fd2 ΐ 38 2 8147 1fd3 ῖ 37 2 8150 1fd6 ῗ 37 2 8151 1fd7 Ῐ 38 2 8152 1fd8 Ῑ 36 2 8153 1fd9 Ὶ 59 2 8154 1fda Ί 53 2 8155 1fdb ῝ 48 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 48 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 68 3 8164 1fe4 ῥ 68 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 71 2 8168 1fe8 Ῡ 70 2 8169 1fe9 Ὺ 97 2 8170 1fea Ύ 93 2 8171 1feb Ῥ 80 2 8172 1fec ῭ 48 2 8173 1fed ΅ 49 2 8174 1fee ` 48 2 8175 1fef ῲ 80 3 8178 1ff2 ῳ 80 1 8179 1ff3 ῴ 80 3 8180 1ff4 ῶ 80 2 8182 1ff6 ῷ 80 3 8183 1ff7 Ὸ 101 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 96 2 8186 1ffa Ώ 82 2 8187 1ffb ῼ 73 3 8188 1ffc ´ 49 2 8189 1ffd ῾ 48 2 8190 1ffe ‐ 39 0 8208 2010 ‑ 39 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 37 2 8216 2018 ` " ‘ " ’ 36 2 8217 2019 ' " ’ " ‚ 35 1 8218 201a ‛ 36 2 8219 201b “ 62 2 8220 201c ” 61 2 8221 201d „ 60 1 8222 201e ‟ 62 2 8223 201f † 48 3 8224 2020 ‡ 47 3 8225 2021 • 61 0 8226 2022 ‣ 61 0 8227 2023 ․ 36 0 8228 2024 ‥ 65 0 8229 2025 … 95 0 8230 2026 ‰ 138 2 8240 2030 ‱ 181 2 8241 2031 ‹ 39 0 8249 2039 › 39 0 8250 203a ‼ 60 2 8252 203c ‽ 55 2 8253 203d ‾ 47 2 8254 203e ⁇ 98 2 8263 2047 ⁈ 79 2 8264 2048 ⁉ 79 2 8265 2049 ⁰ 57 2 8304 2070 ⁴ 57 2 8308 2074 ⁵ 57 2 8309 2075 ⁶ 57 2 8310 2076 ⁷ 57 2 8311 2077 ⁸ 57 2 8312 2078 ⁹ 57 2 8313 2079 ⁿ 43 2 8319 207f ₦ 79 2 8358 20a6 € 66 2 8364 20ac ₵ 66 3 8373 20b5 ℃ 115 2 8451 2103 № 128 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 73 2 8486 2126 ℧ 73 2 8487 2127 K 74 2 8490 212a Å 73 2 8491 212b Ⅎ 65 2 8498 2132 ⅋ 83 2 8523 214b Ⅰ 35 2 8544 2160 Ⅱ 63 2 8545 2161 Ⅲ 90 2 8546 2162 Ⅳ 105 2 8547 2163 Ⅴ 74 2 8548 2164 Ⅵ 105 2 8549 2165 Ⅶ 132 2 8550 2166 Ⅷ 159 2 8551 2167 Ⅸ 107 2 8552 2168 Ⅹ 73 2 8553 2169 Ⅺ 106 2 8554 216a Ⅻ 133 2 8555 216b Ⅼ 60 2 8556 216c Ⅽ 70 2 8557 216d Ⅾ 79 2 8558 216e Ⅿ 95 2 8559 216f ⅰ 33 2 8560 2170 ⅱ 58 2 8561 2171 ⅲ 83 2 8562 2172 ⅳ 94 2 8563 2173 ⅴ 62 0 8564 2174 ⅵ 92 2 8565 2175 ⅶ 117 2 8566 2176 ⅷ 142 2 8567 2177 ⅸ 92 2 8568 2178 ⅹ 61 0 8569 2179 ⅺ 92 2 8570 217a ⅻ 117 2 8571 217b ⅼ 33 2 8572 217c ⅽ 56 0 8573 217d ⅾ 68 2 8574 217e ⅿ 99 0 8575 217f ↀ 122 2 8576 2180 Ↄ 69 2 8579 2183 ∂ 52 2 8706 2202 pd " ∃ 60 2 8707 2203 te " ∆ 66 2 8710 2206 ∇ 66 2 8711 2207 gr " ∊ 75 0 8714 220a ∍ 75 0 8717 220d st " ∏ 75 3 8719 220f ∐ 75 3 8720 2210 ∑ 68 3 8721 2211 − 80 0 8722 2212 ∓ 80 2 8723 2213 ∕ 16 2 8725 2215 ∗ 59 0 8727 2217 ** " ∘ 59 0 8728 2218 ∙ 36 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 77 0 8743 2227 l∧ 77 0 8743 2227 " ∨ 77 0 8744 2228 l| " ∩ 77 0 8745 2229 ca " ∪ 77 0 8746 222a cu " ∫ 58 3 8747 222b is " ∬ 95 3 8748 222c ∭ 132 3 8749 222d ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≣ 80 3 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 68 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 88 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 59 3 8992 2320 ⌡ 57 3 8993 2321 ⌥ 95 2 8997 2325 〈 44 3 9001 2329 〉 43 3 9002 232a ⍽ 82 1 9085 237d ⎮ 58 3 9134 23ae ⏏ 73 0 9167 23cf ␢ 68 2 9250 2422 ␣ 68 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 61 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 61 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⚀ 83 2 9856 2680 ⚁ 83 2 9857 2681 ⚂ 83 2 9858 2682 ⚃ 83 2 9859 2683 ⚄ 83 2 9860 2684 ⚅ 83 2 9861 2685 ⟠ 47 3 10208 27e0 ⟨ 44 3 10216 27e8 ⟩ 43 3 10217 27e9 ⟪ 69 3 10218 27ea ⟫ 68 3 10219 27eb ⧫ 47 3 10731 29eb ⨌ 169 3 10764 2a0c ⨍ 58 3 10765 2a0d ⨎ 58 3 10766 2a0e ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 75 2 64257 fb01 fl 75 2 64258 fb02 ffi 106 2 64259 fb03 ffl 106 2 64260 fb04 ﬓ 132 2 64275 fb13 ﬔ 131 2 64276 fb14 ﬕ 131 3 64277 fb15 ﬖ 132 3 64278 fb16 ﬗ 163 3 64279 fb17 � 106 3 65533 fffd 9base-6/troff/font/devutf/ZD0000644000175000017500000000513311402154555015373 0ustar anselmanselmname ZD fontname ZapfDingbats named in prologue charset ! 97 2 33 " 96 2 34 # 97 2 35 $ 98 3 36 % 72 2 37 & 79 3 38 ' 79 3 39 ( 79 3 40 ) 69 2 41 * 96 2 42 + 94 2 43 , 55 3 44 - 86 2 45 . 91 2 46 / 93 2 47 0 91 2 48 1 95 2 49 2 97 2 50 3 76 3 51 4 85 3 52 5 76 2 53 6 76 2 54 7 57 3 55 8 68 3 56 9 76 2 57 : 76 2 58 ; 76 2 59 < 75 3 60 = 49 2 61 > 55 2 62 ? 54 3 63 @ 58 2 64 A 69 3 65 B 79 3 66 C 79 3 67 D 79 3 68 E 79 3 69 F 79 3 70 G 79 3 71 H 82 3 72 I 82 3 73 J 79 3 74 K 84 3 75 L 82 3 76 M 83 3 77 N 82 3 78 O 83 3 79 P 92 3 80 Q 74 2 81 R 72 2 82 S 75 2 83 T 79 3 84 U 79 3 85 V 70 3 86 W 78 3 87 X 77 3 88 Y 79 3 89 Z 76 2 90 [ 71 3 91 \ 71 3 92 ] 68 3 93 ^ 70 3 94 _ 83 3 95 ` 82 3 96 a 79 3 97 b 79 3 98 c 71 3 99 d 69 2 100 e 70 2 101 f 69 2 102 g 79 3 103 h 79 3 104 i 71 3 105 j 79 3 106 k 79 3 107 l 79 3 108 m 87 3 109 n 76 2 110 o 76 2 111 p 76 2 112 q 76 3 113 r 76 3 114 s 89 2 115 t 89 3 116 u 79 3 117 v 78 3 118 w 44 3 119 x 14 2 120 y 28 2 121 z 42 2 122 { 39 2 123 | 39 2 124 } 67 2 125 ~ 67 2 126 \` 28 0 145 !! 73 3 161 ¡ " c| 54 3 162 ¢ " L- 54 3 163 £ " xo 91 2 164 ¤ " Y- 67 3 165 ¥ " || 76 3 166 ¦ " so 76 2 167 § " "" 78 2 168 ¨ " co 60 3 169 © " a_ 69 3 170 ª " << 63 3 171 « " -, 79 3 172 ¬ " hy 79 3 173 ­ " ro 79 3 174 ® " -^ 79 3 175 ¯ " 0^ 79 3 176 ° " +- 79 3 177 ± " 2^ 79 3 178 ² " 3^ 79 3 179 ³ " \' 79 3 180 ´ " /u 79 3 181 µ " P! 79 3 182 ¶ " .^ 79 3 183 · " ,, 79 3 184 ¸ " 1^ 79 3 185 ¹ " o_ 79 3 186 º " >> 79 3 187 » " 14 79 3 188 ¼ " 12 79 3 189 ½ " 34 79 3 190 ¾ " ?? 79 3 191 ¿ " A` 79 3 192 À " A' 79 3 193 Á " A^ 79 3 194  " A~ 79 3 195 à " A" 79 3 196 Ä " A* 79 3 197 Å " AE 79 3 198 Æ " C, 79 3 199 Ç " E` 79 3 200 È " E' 79 3 201 É " E^ 79 3 202 Ê " E" 79 3 203 Ë " I` 79 3 204 Ì " I' 79 3 205 Í " I^ 79 3 206 Î " I" 79 3 207 Ï " D- 79 3 208 Ð " N~ 79 3 209 Ñ " O` 79 3 210 Ò " O' 79 3 211 Ó " O^ 89 2 212 Ô " O~ 84 2 213 Õ " O" 102 2 214 Ö " xx 46 3 215 × " O/ 75 2 216 Ø " U` 92 2 217 Ù " U' 75 2 218 Ú " U^ 92 2 219 Û " U" 93 2 220 Ü " Y' 93 2 221 Ý " TH 93 2 222 Þ " ss 83 2 223 ß " a` 87 2 224 à " a' 83 2 225 á " a^ 92 2 226 â " a~ 92 2 227 ã " a" 92 2 228 ä " a* 93 2 229 å " ae 93 2 230 æ " c, 46 3 231 ç " e` 88 2 232 è " e' 84 2 233 é " e^ 84 2 234 ê " e" 87 2 235 ë " i` 87 2 236 ì " i' 70 2 237 í " i^ 70 2 238 î " i" 87 2 239 ï " d- 28 0 240 ð " n~ 87 2 241 ñ " o` 76 2 242 ò " o' 95 2 243 ó " o^ 77 2 244 ô " o~ 87 2 245 õ " o" 77 2 246 ö " -: 89 3 247 ÷ " o/ 97 2 248 ø " u` 89 3 249 ù " u' 83 2 250 ú " u^ 87 2 251 û " u" 93 2 252 ü " y' 97 2 253 ý " th 92 2 254 þ " y" 28 0 255 ÿ " 9base-6/troff/font/devutf/NX0000644000175000017500000000534611402154555015411 0ustar anselmanselmname NX fontname NewCenturySchlbk-BoldItalic named in prologue spacewidth 29 charset ! 33 2 33 " 40 2 34 dq " # 57 2 35 $ 57 3 36 % 89 2 37 & 89 2 38 ' 26 2 39 ( 41 3 40 ) 41 3 41 * 50 2 42 + 61 0 43 , 29 1 44 - 33 0 173 . 29 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 29 0 58 ; 29 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 48 2 63 @ 75 2 64 A 74 2 65 B 76 2 66 C 76 2 67 D 83 2 68 E 74 2 69 F 70 2 70 G 82 2 71 H 87 2 72 I 44 2 73 J 67 2 74 K 78 2 75 L 70 2 76 M 94 2 77 N 85 2 78 O 83 2 79 P 74 2 80 Q 83 3 81 R 80 2 82 S 69 2 83 T 72 2 84 U 83 2 85 V 74 2 86 W 94 2 87 X 74 2 88 Y 70 2 89 Z 70 2 90 [ 41 3 91 \ 61 2 92 bs " ] 41 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 26 2 96 a 67 0 97 b 61 2 98 c 54 0 99 d 67 2 100 e 52 0 101 f 39 3 102 g 61 1 103 h 69 2 104 i 39 2 105 j 37 3 106 k 65 2 107 l 39 2 108 m 94 0 109 n 69 0 110 o 57 0 111 p 65 1 112 q 63 1 113 r 52 0 114 s 48 0 115 t 41 2 116 u 69 0 117 v 56 0 118 w 83 0 119 x 57 0 120 y 52 1 121 z 52 0 122 { 41 3 123 --- 61 2 124 } 41 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 3 161 ¡ " c| 57 3 162 ct " ¢ " L- 57 2 163 £ " ps " xo 57 2 164 ¤ " cr " Y- 57 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 41 2 170 ª " << 48 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 34 2 178 ² " 3^ 34 2 179 ³ " \' 33 2 180 aa " ´ " /u 69 1 181 µ " P! 65 2 182 pg " ¶ " .^ 29 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 34 2 185 ¹ " o_ 36 2 186 º " >> 48 0 187 » " 14 86 2 188 ¼ " 12 86 2 189 ½ " 34 86 2 190 ¾ " ?? 48 3 191 ¿ " A` 74 2 192 À " A' 74 2 193 Á " A^ 74 2 194  " A~ 74 2 195 à " A" 74 2 196 Ä " A* 74 2 197 Å " AE 89 2 198 Æ " C, 76 3 199 Ç " E` 74 2 200 È " E' 74 2 201 É " E^ 74 2 202 Ê " E" 74 2 203 Ë " I` 44 2 204 Ì " I' 44 2 205 Í " I^ 44 2 206 Î " I" 44 2 207 Ï " D- 83 2 208 Ð " N~ 85 2 209 Ñ " O` 83 2 210 Ò " O' 83 2 211 Ó " O^ 83 2 212 Ô " O~ 83 2 213 Õ " O" 83 2 214 Ö " xx 61 0 215 × " O/ 83 2 216 Ø " U` 83 2 217 Ù " U' 83 2 218 Ú " U^ 83 2 219 Û " U" 83 2 220 Ü " Y' 70 2 221 Ý " TH 74 2 222 Þ " ss 57 3 223 ß " a` 67 2 224 à " a' 67 2 225 á " a^ 67 2 226 â " a~ 67 2 227 ã " a" 67 2 228 ä " a* 67 2 229 å " ae 82 0 230 æ " c, 54 1 231 ç " e` 52 2 232 è " e' 52 2 233 é " e^ 52 2 234 ê " e" 52 2 235 ë " i` 39 2 236 ì " i' 39 2 237 í " i^ 39 2 238 î " i" 39 2 239 ï " d- 57 2 240 ð " n~ 69 2 241 ñ " o` 57 2 242 ò " o' 57 2 243 ó " o^ 57 2 244 ô " o~ 57 2 245 õ " o" 57 2 246 ö " -: 61 0 247 ÷ " o/ 57 3 248 ø " u` 69 2 249 ù " u' 69 2 250 ú " u^ 69 2 251 û " u" 69 2 252 ü " y' 52 3 253 ý " th 65 3 254 þ " y" 52 3 255 ÿ " 9base-6/troff/font/devutf/LuxiSerif-BoldOblique0000644000175000017500000001433511402154555021173 0ustar anselmanselmname LuxiSerif-BoldOblique fontname LuxiSerif-BoldOblique spacewidth 25 charset ! 33 2 33 0021 " 56 2 34 0022 dq " dq " # 50 2 35 0023 $ 50 3 36 0024 % 100 2 37 0025 & 83 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 50 2 42 002a + 57 0 43 002b , 25 1 44 002c - 33 0 45 002d . 25 0 46 002e / 28 3 47 002f 0 50 2 48 0030 1 50 2 49 0031 2 50 2 50 0032 3 50 2 51 0033 4 50 2 52 0034 5 50 2 53 0035 6 50 2 54 0036 7 50 2 55 0037 8 50 2 56 0038 9 50 2 57 0039 : 33 0 58 003a ; 33 1 59 003b < 57 0 60 003c = 57 0 61 003d > 57 0 62 003e ? 50 2 63 003f @ 93 2 64 0040 A 72 2 65 0041 B 67 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 78 2 72 0048 I 39 2 73 0049 J 50 3 74 004a K 78 2 75 004b L 67 2 76 004c M 94 2 77 004d N 72 2 78 004e O 78 2 79 004f P 61 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 56 2 83 0053 T 67 2 84 0054 U 72 2 85 0055 V 72 2 86 0056 W 100 2 87 0057 X 72 2 88 0058 Y 72 2 89 0059 Z 67 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 58 2 94 005e _ 50 1 95 005f a 50 0 97 0061 b 56 2 98 0062 c 44 0 99 0063 d 56 2 100 0064 e 44 0 101 0065 f 33 2 102 0066 g 50 1 103 0067 h 56 2 104 0068 i 28 2 105 0069 j 33 3 106 006a k 56 2 107 006b l 28 2 108 006c m 83 0 109 006d n 56 0 110 006e o 50 0 111 006f p 56 1 112 0070 q 56 1 113 0071 r 44 0 114 0072 s 39 0 115 0073 t 33 2 116 0074 u 56 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 44 0 122 007a { 39 3 123 007b | 22 3 124 007c } 39 3 125 007d ~ 52 0 126 007e € 50 2 128 0080   25 0 160 00a0 ¡ 33 1 161 00a1 ¢ 50 2 162 00a2 £ 50 2 163 00a3 ¤ 50 0 164 00a4 ¥ 50 2 165 00a5 ¦ 22 3 166 00a6 § 50 3 167 00a7 ¨ 33 2 168 00a8 © 75 2 169 00a9 ª 30 2 170 00aa « 50 0 171 00ab ¬ 57 0 172 00ac ­ 33 0 173 00ad hy " ® 75 2 174 00ae rg " ¯ 50 2 175 00af ° 40 2 176 00b0 ± 57 0 177 00b1 +- " ² 30 2 178 00b2 ³ 30 2 179 00b3 ´ 33 2 180 00b4 aa " µ 56 1 181 00b5 ¶ 54 3 182 00b6 · 25 0 183 00b7 ¸ 33 1 184 00b8 ¹ 30 2 185 00b9 º 33 2 186 00ba » 50 0 187 00bb ¼ 75 2 188 00bc ½ 75 2 189 00bd ¾ 75 2 190 00be ¿ 50 1 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 39 2 204 00cc Í 39 2 205 00cd Î 39 2 206 00ce Ï 39 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 57 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 72 2 221 00dd Þ 61 2 222 00de ß 56 2 223 00df à 50 2 224 00e0 á 50 2 225 00e1 â 50 2 226 00e2 ã 50 2 227 00e3 ä 50 2 228 00e4 å 50 2 229 00e5 æ 72 0 230 00e6 ç 44 1 231 00e7 è 44 2 232 00e8 é 44 2 233 00e9 ê 44 2 234 00ea ë 44 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 50 2 240 00f0 ñ 56 2 241 00f1 ò 50 2 242 00f2 ó 50 2 243 00f3 ô 50 2 244 00f4 õ 50 2 245 00f5 ö 50 2 246 00f6 ÷ 57 0 247 00f7 -: " di " ø 50 0 248 00f8 ù 56 2 249 00f9 ú 56 2 250 00fa û 56 2 251 00fb ü 56 2 252 00fc ý 50 3 253 00fd þ 56 3 254 00fe ÿ 50 3 255 00ff ā 50 2 257 0101 Ă 72 2 258 0102 ă 50 2 259 0103 Ą 72 3 260 0104 ą 50 1 261 0105 Ć 72 2 262 0106 ć 44 2 263 0107 Ĉ 72 2 264 0108 ĉ 45 2 265 0109 Ċ 72 2 266 010a ċ 44 2 267 010b Č 72 2 268 010c č 44 2 269 010d Ď 72 2 270 010e ď 73 2 271 010f Đ 72 2 272 0110 đ 56 2 273 0111 Ē 67 2 274 0112 ē 44 2 275 0113 Ĕ 67 2 276 0114 ĕ 44 2 277 0115 Ė 67 2 278 0116 ė 44 2 279 0117 Ę 67 3 280 0118 ę 44 1 281 0119 Ě 67 2 282 011a ě 44 2 283 011b Ĝ 78 2 284 011c ĝ 50 3 285 011d Ğ 78 2 286 011e ğ 50 3 287 011f Ġ 78 2 288 0120 ġ 50 3 289 0121 Ģ 78 3 290 0122 ģ 50 3 291 0123 Ĥ 78 2 292 0124 ĥ 56 2 293 0125 Ħ 78 2 294 0126 ħ 56 2 295 0127 Ĩ 39 2 296 0128 ĩ 28 2 297 0129 Ī 39 2 298 012a ī 28 2 299 012b Ĭ 39 2 300 012c ĭ 28 2 301 012d Į 39 3 302 012e į 28 3 303 012f İ 39 2 304 0130 ı 28 0 305 0131 IJ 82 3 306 0132 ij 55 3 307 0133 Ĵ 50 3 308 0134 ĵ 33 3 309 0135 Ķ 78 3 310 0136 ķ 56 3 311 0137 ĸ 56 0 312 0138 Ĺ 67 2 313 0139 ĺ 28 2 314 013a Ļ 67 3 315 013b ļ 28 3 316 013c Ľ 67 2 317 013d ľ 47 2 318 013e Ŀ 67 2 319 013f ŀ 40 2 320 0140 Ł 67 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 56 2 324 0144 Ņ 72 3 325 0145 ņ 56 1 326 0146 Ň 72 2 327 0147 ň 56 2 328 0148 ʼn 73 2 329 0149 Ŋ 72 3 330 014a ŋ 56 1 331 014b Ō 78 2 332 014c ō 50 2 333 014d Ŏ 78 2 334 014e ŏ 50 2 335 014f Ő 78 2 336 0150 ő 50 2 337 0151 Œ 100 2 338 0152 œ 72 0 339 0153 Ŕ 72 2 340 0154 ŕ 44 2 341 0155 Ŗ 72 3 342 0156 ŗ 44 1 343 0157 Ř 72 2 344 0158 ř 44 2 345 0159 Ś 56 2 346 015a ś 39 2 347 015b Ŝ 56 2 348 015c ŝ 39 2 349 015d Ş 56 3 350 015e ş 39 1 351 015f Š 56 2 352 0160 š 39 2 353 0161 Ţ 67 3 354 0162 ţ 33 3 355 0163 Ť 67 2 356 0164 ť 52 2 357 0165 Ŧ 67 2 358 0166 ŧ 33 2 359 0167 Ũ 72 2 360 0168 ũ 56 2 361 0169 Ū 72 2 362 016a ū 56 2 363 016b Ŭ 72 2 364 016c ŭ 56 2 365 016d Ů 72 2 366 016e ů 56 2 367 016f Ű 72 2 368 0170 ű 56 2 369 0171 Ų 72 3 370 0172 ų 56 1 371 0173 Ŵ 100 2 372 0174 ŵ 72 2 373 0175 Ŷ 72 2 374 0176 ŷ 50 3 375 0177 Ÿ 72 2 376 0178 Ź 67 2 377 0179 ź 44 2 378 017a Ż 67 2 379 017b ż 44 2 380 017c Ž 67 2 381 017d ž 44 2 382 017e ſ 28 2 383 017f ƒ 50 3 402 0192 Ș 56 3 536 0218 ș 39 1 537 0219 Ț 67 3 538 021a ț 33 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 33 1 894 037e · 25 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 25 0 8219 201b “ 50 2 8220 201c ” 50 2 8221 201d „ 50 1 8222 201e † 50 3 8224 2020 ‡ 50 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 50 2 8254 203e ⁄ 17 2 8260 2044 € 50 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 44 0 8494 212e − 79 0 8722 2212 ∕ 17 2 8725 2215 ∙ 25 0 8729 2219 bu " ⋅ 25 0 8901 22c5  56 2 59905 ea01  56 2 59906 ea02  30 2 61444 f004  33 3 63166 f6be fi 56 2 64257 fb01 fl 56 2 64258 fb02 9base-6/troff/font/devutf/AR0000644000175000017500000000533311402154555015362 0ustar anselmanselmname AR fontname AvantGarde-Book named in prologue spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 55 2 35 $ 55 2 36 % 78 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 43 2 42 + 61 0 43 , 28 0 44 - 33 0 173 . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 ^ 50 2 147 --- 61 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 43 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 ~ 44 2 148 --- 61 0 126 \` 38 2 145 ga " !! 29 1 161 ¡ " c| 55 2 162 ct " ¢ " L- 55 2 163 £ " ps " xo 55 0 164 ¤ " cr " Y- 55 2 165 ¥ " yn " || 67 2 166 ¦ " so 62 3 167 sc " § " "" 37 2 168 ¨ " :a " co 75 2 169 © " a_ 37 2 170 ª " << 43 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 49 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 38 2 180 aa " ´ " /u 61 1 181 µ " P! 56 3 182 pg " ¶ " .^ 28 0 183 · " ,, 32 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 43 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 59 1 191 ¿ " A` 74 2 192 À " A' 74 2 193 Á " A^ 74 2 194  " A~ 74 2 195 à " A" 74 2 196 Ä " A* 74 2 197 Å " AE 99 2 198 Æ " C, 81 3 199 Ç " E` 54 2 200 È " E' 54 2 201 É " E^ 54 2 202 Ê " E" 54 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 79 2 208 Ð " N~ 74 2 209 Ñ " O` 87 2 210 Ò " O' 87 2 211 Ó " O^ 87 2 212 Ô " O~ 87 2 213 Õ " O" 87 2 214 Ö " xx 61 0 215 × " O/ 87 2 216 Ø " U` 66 2 217 Ù " U' 66 2 218 Ú " U^ 66 2 219 Û " U" 66 2 220 Ü " Y' 59 2 221 Ý " TH 59 2 222 Þ " ss 55 2 223 ß " a` 68 2 224 à " a' 68 2 225 á " a^ 68 2 226 â " a~ 68 2 227 ã " a" 68 2 228 ä " a* 68 2 229 å " ae 116 0 230 æ " c, 65 1 231 ç " e` 65 2 232 è " e' 65 2 233 é " e^ 65 2 234 ê " e" 65 2 235 ë " i` 20 2 236 ì " i' 20 2 237 í " i^ 20 2 238 î " i" 20 2 239 ï " d- 66 2 240 ð " n~ 61 2 241 ñ " o` 66 2 242 ò " o' 66 2 243 ó " o^ 66 2 244 ô " o~ 66 2 245 õ " o" 66 2 246 ö " -: 61 0 247 ÷ " o/ 65 0 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 54 3 253 ý " th 68 3 254 þ " y" 54 3 255 ÿ " 9base-6/troff/font/devutf/Helvetica-Narrow-BoldOblique0000644000175000017500000000534711402154555022436 0ustar anselmanselmname Hx fontname Helvetica-Narrow-BoldOblique named in prologue spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 ^ 27 2 147 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 ¡ " c| 46 3 162 ct " ¢ " L- 46 2 163 £ " ps " xo 46 2 164 ¤ " cr " Y- 46 2 165 ¥ " yn " || 23 3 166 ¦ " so 46 3 167 sc " § " "" 27 2 168 ¨ " :a " co 60 2 169 © " a_ 30 2 170 ª " << 46 0 171 « " -, 48 0 172 hy 27 0 173 -- 48 0 45 ­ " ro 60 2 174 rg " ® " -^ 27 2 175 -a " ¯ " 0^ 33 2 176 ° " +- 48 2 177 ± " 2^ 27 2 178 ² " 3^ 27 2 179 ³ " \' 27 2 180 aa " ´ " /u 50 1 181 µ " P! 46 3 182 pg " ¶ " .^ 23 0 183 · " ,, 27 1 184 ¸ " ,a " 1^ 27 2 185 ¹ " o_ 30 2 186 º " >> 46 0 187 » " 14 68 2 188 ¼ " 12 68 2 189 ½ " 34 68 2 190 ¾ " ?? 50 1 191 ¿ " A` 59 2 192 À " A' 59 2 193 Á " A^ 59 2 194  " A~ 59 2 195 à " A" 59 2 196 Ä " A* 59 2 197 Å " AE 82 2 198 Æ " C, 59 3 199 Ç " E` 55 2 200 È " E' 55 2 201 É " E^ 55 2 202 Ê " E" 55 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 59 2 208 Ð " N~ 59 2 209 Ñ " O` 64 2 210 Ò " O' 64 2 211 Ó " O^ 64 2 212 Ô " O~ 64 2 213 Õ " O" 64 2 214 Ö " xx 48 0 215 × " O/ 64 2 216 Ø " U` 59 2 217 Ù " U' 59 2 218 Ú " U^ 59 2 219 Û " U" 59 2 220 Ü " Y' 55 2 221 Ý " TH 55 2 222 Þ " ss 50 2 223 ß " a` 46 2 224 à " a' 46 2 225 á " a^ 46 2 226 â " a~ 46 2 227 ã " a" 46 2 228 ä " a* 46 2 229 å " ae 73 0 230 æ " c, 46 1 231 ç " e` 46 2 232 è " e' 46 2 233 é " e^ 46 2 234 ê " e" 46 2 235 ë " i` 23 2 236 ì " i' 23 2 237 í " i^ 23 2 238 î " i" 23 2 239 ï " d- 50 2 240 ð " n~ 50 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 48 0 247 ÷ " o/ 50 0 248 ø " u` 50 2 249 ù " u' 50 2 250 ú " u^ 50 2 251 û " u" 50 2 252 ü " y' 46 3 253 ý " th 50 3 254 þ " y" 46 3 255 ÿ " 9base-6/troff/font/devutf/LuxiSans-BoldOblique0000644000175000017500000001433011402154555021022 0ustar anselmanselmname LuxiSans-BoldOblique fontname LuxiSans-BoldOblique spacewidth 28 charset ! 33 2 33 0021 " 47 2 34 0022 dq " dq " # 56 2 35 0023 $ 56 3 36 0024 % 89 2 37 0025 & 72 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 39 2 42 002a + 58 0 43 002b , 28 1 44 002c - 33 0 45 002d . 28 0 46 002e / 28 3 47 002f 0 56 2 48 0030 1 56 2 49 0031 2 56 2 50 0032 3 56 2 51 0033 4 56 2 52 0034 5 56 2 53 0035 6 56 2 54 0036 7 56 2 55 0037 8 56 2 56 0038 9 56 2 57 0039 : 33 0 58 003a ; 33 1 59 003b < 58 0 60 003c = 58 0 61 003d > 58 0 62 003e ? 61 2 63 003f @ 98 2 64 0040 A 72 2 65 0041 B 72 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 72 2 72 0048 I 28 2 73 0049 J 56 3 74 004a K 72 2 75 004b L 61 2 76 004c M 83 2 77 004d N 72 2 78 004e O 78 2 79 004f P 67 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 67 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 67 2 86 0056 W 94 2 87 0057 X 67 2 88 0058 Y 67 2 89 0059 Z 61 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 58 2 94 005e _ 56 1 95 005f a 56 0 97 0061 b 61 2 98 0062 c 56 0 99 0063 d 61 2 100 0064 e 56 0 101 0065 f 33 2 102 0066 g 61 1 103 0067 h 61 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 56 2 107 006b l 28 2 108 006c m 89 0 109 006d n 61 0 110 006e o 61 0 111 006f p 61 1 112 0070 q 61 1 113 0071 r 39 0 114 0072 s 56 0 115 0073 t 33 2 116 0074 u 61 0 117 0075 v 56 0 118 0076 w 78 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 50 0 122 007a { 39 3 123 007b | 28 3 124 007c } 39 3 125 007d ~ 58 0 126 007e € 56 2 128 0080   28 0 160 00a0 ¡ 33 2 161 00a1 ¢ 56 2 162 00a2 £ 56 2 163 00a3 ¤ 56 2 164 00a4 ¥ 56 2 165 00a5 ¦ 39 3 166 00a6 § 56 3 167 00a7 ¨ 33 2 168 00a8 © 74 2 169 00a9 ª 37 2 170 00aa « 56 0 171 00ab ¬ 58 0 172 00ac ­ 33 0 173 00ad hy " ® 74 2 174 00ae rg " ¯ 56 2 175 00af ° 40 2 176 00b0 ± 58 0 177 00b1 +- " ² 33 2 178 00b2 ³ 33 2 179 00b3 ´ 33 2 180 00b4 aa " µ 61 1 181 00b5 ¶ 56 3 182 00b6 · 28 0 183 00b7 ¸ 33 1 184 00b8 ¹ 33 2 185 00b9 º 37 2 186 00ba » 56 0 187 00bb ¼ 83 2 188 00bc ½ 83 2 189 00bd ¾ 83 2 190 00be ¿ 61 1 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 28 2 204 00cc Í 28 2 205 00cd Î 28 2 206 00ce Ï 28 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 58 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 67 2 221 00dd Þ 67 2 222 00de ß 61 2 223 00df à 56 2 224 00e0 á 56 2 225 00e1 â 56 2 226 00e2 ã 56 2 227 00e3 ä 56 2 228 00e4 å 56 2 229 00e5 æ 89 0 230 00e6 ç 56 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 61 2 240 00f0 ñ 61 2 241 00f1 ò 61 2 242 00f2 ó 61 2 243 00f3 ô 61 2 244 00f4 õ 61 2 245 00f5 ö 61 2 246 00f6 ÷ 58 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 61 2 249 00f9 ú 61 2 250 00fa û 61 2 251 00fb ü 61 2 252 00fc ý 56 3 253 00fd þ 61 3 254 00fe ÿ 56 3 255 00ff ā 56 2 257 0101 Ă 72 2 258 0102 ă 56 2 259 0103 Ą 72 3 260 0104 ą 56 1 261 0105 Ć 72 2 262 0106 ć 56 2 263 0107 Ĉ 72 2 264 0108 ĉ 56 2 265 0109 Ċ 72 2 266 010a ċ 56 2 267 010b Č 72 2 268 010c č 56 2 269 010d Ď 72 2 270 010e ď 72 2 271 010f Đ 72 2 272 0110 đ 61 2 273 0111 Ē 67 2 274 0112 ē 56 2 275 0113 Ĕ 67 2 276 0114 ĕ 56 2 277 0115 Ė 67 2 278 0116 ė 56 2 279 0117 Ę 67 3 280 0118 ę 56 1 281 0119 Ě 67 2 282 011a ě 56 2 283 011b Ĝ 78 2 284 011c ĝ 61 3 285 011d Ğ 78 2 286 011e ğ 61 3 287 011f Ġ 78 2 288 0120 ġ 61 3 289 0121 Ģ 78 3 290 0122 ģ 61 3 291 0123 Ĥ 72 2 292 0124 ĥ 61 2 293 0125 Ħ 72 2 294 0126 ħ 61 2 295 0127 Ĩ 28 2 296 0128 ĩ 28 2 297 0129 Ī 28 2 298 012a ī 28 2 299 012b Ĭ 28 2 300 012c ĭ 28 2 301 012d Į 28 3 302 012e į 28 3 303 012f İ 28 2 304 0130 ı 28 0 305 0131 IJ 78 3 306 0132 ij 56 3 307 0133 Ĵ 56 3 308 0134 ĵ 28 3 309 0135 Ķ 72 3 310 0136 ķ 56 3 311 0137 ĸ 56 0 312 0138 Ĺ 61 2 313 0139 ĺ 28 2 314 013a Ļ 61 3 315 013b ļ 28 3 316 013c Ľ 61 2 317 013d ľ 39 2 318 013e Ŀ 61 2 319 013f ŀ 48 2 320 0140 Ł 61 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 61 2 324 0144 Ņ 72 3 325 0145 ņ 61 1 326 0146 Ň 72 2 327 0147 ň 61 2 328 0148 ʼn 71 2 329 0149 Ŋ 72 3 330 014a ŋ 61 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 94 0 339 0153 Ŕ 72 2 340 0154 ŕ 39 2 341 0155 Ŗ 72 3 342 0156 ŗ 39 1 343 0157 Ř 72 2 344 0158 ř 39 2 345 0159 Ś 67 2 346 015a ś 56 2 347 015b Ŝ 67 2 348 015c ŝ 56 2 349 015d Ş 67 3 350 015e ş 56 1 351 015f Š 67 2 352 0160 š 56 2 353 0161 Ţ 61 3 354 0162 ţ 33 3 355 0163 Ť 61 2 356 0164 ť 48 2 357 0165 Ŧ 61 2 358 0166 ŧ 33 2 359 0167 Ũ 72 2 360 0168 ũ 61 2 361 0169 Ū 72 2 362 016a ū 61 2 363 016b Ŭ 72 2 364 016c ŭ 61 2 365 016d Ů 72 2 366 016e ů 61 2 367 016f Ű 72 2 368 0170 ű 61 2 369 0171 Ų 72 3 370 0172 ų 61 1 371 0173 Ŵ 94 2 372 0174 ŵ 78 2 373 0175 Ŷ 67 2 374 0176 ŷ 56 3 375 0177 Ÿ 67 2 376 0178 Ź 61 2 377 0179 ź 50 2 378 017a Ż 61 2 379 017b ż 50 2 380 017c Ž 61 2 381 017d ž 50 2 382 017e ſ 31 2 383 017f ƒ 56 3 402 0192 Ș 67 3 536 0218 ș 56 1 537 0219 Ț 61 3 538 021a ț 33 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 33 1 894 037e · 28 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 56 0 8210 2012 – 56 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 28 2 8216 2018 ` " ‘ " ’ 28 2 8217 2019 ' " ’ " ‚ 28 1 8218 201a ‛ 28 0 8219 201b “ 50 2 8220 201c ” 50 2 8221 201d „ 50 1 8222 201e † 56 3 8224 2020 ‡ 56 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 56 2 8254 203e ⁄ 17 2 8260 2044 € 56 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 56 0 8494 212e − 58 0 8722 2212 ∕ 17 2 8725 2215 ∙ 28 0 8729 2219 bu " ⋅ 28 0 8901 22c5  61 2 59905 ea01  61 2 59906 ea02  33 2 61444 f004  28 1 63166 f6be fi 61 2 64257 fb01 fl 61 2 64258 fb02 9base-6/troff/font/devutf/HL0000644000175000017500000000531111402154555015357 0ustar anselmanselmname HL fontname Helvetica-Light spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 ~ 33 2 148 --- 66 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 0 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 22 2 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 80 2 169 © " a_ 33 2 170 ª " << 56 0 171 « " -, 66 0 172 hy 33 0 173 -- 66 0 45 ­ " ro 80 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 66 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 65 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 33 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 50 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 66 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 61 2 221 Ý " TH 61 2 222 Þ " ss 50 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 56 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 22 2 236 ì " i' 22 2 237 í " i^ 22 2 238 î " i" 22 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 66 0 247 ÷ " o/ 56 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 61 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/DejaVuCondensedSerifBold0000644000175000017500000006223411402154555021656 0ustar anselmanselmname DejaVuCondensedSerifBold fontname DejaVuCondensedSerifBold spacewidth 31 charset ! 42 2 33 0021 " 49 2 34 0022 dq " dq " # 80 2 35 0023 $ 66 3 36 0024 % 90 2 37 0025 & 86 2 38 0026 ( 45 3 40 0028 ) 45 3 41 0029 * 50 2 42 002a + 80 2 43 002b , 33 1 44 002c - 39 0 45 002d . 33 0 46 002e / 35 3 47 002f 0 66 2 48 0030 1 66 2 49 0031 2 66 2 50 0032 3 66 2 51 0033 4 66 2 52 0034 5 66 2 53 0035 6 66 2 54 0036 7 66 2 55 0037 8 66 2 56 0038 9 66 2 57 0039 : 35 0 58 003a ; 35 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 56 2 63 003f @ 95 3 64 0040 A 74 2 65 0041 B 80 2 66 0042 C 76 2 67 0043 D 82 2 68 0044 E 72 2 69 0045 F 68 2 70 0046 G 81 2 71 0047 H 90 2 72 0048 I 44 2 73 0049 J 44 3 74 004a K 83 2 75 004b L 67 2 76 004c M 105 2 77 004d N 87 2 78 004e O 83 2 79 004f P 72 2 80 0050 Q 83 3 81 0051 R 79 2 82 0052 S 69 2 83 0053 T 71 2 84 0054 U 83 2 85 0055 V 74 2 86 0056 W 107 2 87 0057 X 74 2 88 0058 Y 68 2 89 0059 Z 69 2 90 005a [ 45 3 91 005b \ 35 3 92 005c bs " ] 45 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 62 0 97 0061 b 66 2 98 0062 c 58 0 99 0063 d 67 2 100 0064 e 60 0 101 0065 f 41 2 102 0066 g 67 1 103 0067 h 69 2 104 0068 i 36 2 105 0069 j 34 3 106 006a k 66 2 107 006b l 36 2 108 006c m 101 0 109 006d n 69 0 110 006e o 63 0 111 006f p 66 1 112 0070 q 67 1 113 0071 r 50 0 114 0072 s 53 0 115 0073 t 44 2 116 0074 u 69 0 117 0075 v 55 0 118 0076 w 82 0 119 0077 x 57 0 120 0078 y 55 1 121 0079 z 54 0 122 007a { 61 3 123 007b | 35 3 124 007c } 61 3 125 007d ~ 80 0 126 007e   63 0 160 00a0 ¡ 42 2 161 00a1 ¢ 66 3 162 00a2 £ 66 2 163 00a3 ¤ 60 0 164 00a4 ¥ 66 2 165 00a5 ¦ 35 3 166 00a6 § 50 3 167 00a7 ¨ 47 2 168 00a8 © 95 2 169 00a9 ª 46 2 170 00aa « 59 0 171 00ab ¬ 80 0 172 00ac ­ 39 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 47 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 42 2 178 00b2 ³ 42 2 179 00b3 ´ 48 2 180 00b4 aa " µ 69 1 181 00b5 ¶ 60 3 182 00b6 · 33 0 183 00b7 ¸ 47 1 184 00b8 ¹ 42 2 185 00b9 º 47 2 186 00ba » 59 0 187 00bb ¼ 99 2 188 00bc ½ 99 2 189 00bd ¾ 99 2 190 00be ¿ 56 2 191 00bf À 74 2 192 00c0 Á 74 2 193 00c1  74 2 194 00c2 à 74 2 195 00c3 Ä 74 2 196 00c4 Å 74 2 197 00c5 Æ 98 2 198 00c6 Ç 76 3 199 00c7 È 72 2 200 00c8 É 72 2 201 00c9 Ê 72 2 202 00ca Ë 72 2 203 00cb Ì 44 2 204 00cc Í 44 2 205 00cd Î 44 2 206 00ce Ï 44 2 207 00cf Ð 83 2 208 00d0 Ñ 87 2 209 00d1 Ò 83 2 210 00d2 Ó 83 2 211 00d3 Ô 83 2 212 00d4 Õ 83 2 213 00d5 Ö 83 2 214 00d6 × 80 2 215 00d7 mu " Ø 83 2 216 00d8 Ù 83 2 217 00d9 Ú 83 2 218 00da Û 83 2 219 00db Ü 83 2 220 00dc Ý 68 2 221 00dd Þ 72 2 222 00de ß 72 2 223 00df à 62 2 224 00e0 á 62 2 225 00e1 â 62 2 226 00e2 ã 62 2 227 00e3 ä 62 2 228 00e4 å 62 2 229 00e5 æ 93 0 230 00e6 ç 58 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 36 2 236 00ec í 36 2 237 00ed î 36 2 238 00ee ï 36 2 239 00ef ð 63 2 240 00f0 ñ 69 2 241 00f1 ò 63 2 242 00f2 ó 63 2 243 00f3 ô 63 2 244 00f4 õ 63 2 245 00f5 ö 63 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 63 0 248 00f8 ù 69 2 249 00f9 ú 69 2 250 00fa û 69 2 251 00fb ü 69 2 252 00fc ý 55 3 253 00fd þ 66 3 254 00fe ÿ 55 3 255 00ff ā 62 2 257 0101 Ă 74 2 258 0102 ă 62 2 259 0103 Ą 74 3 260 0104 ą 62 1 261 0105 Ć 76 2 262 0106 ć 58 2 263 0107 Ĉ 76 2 264 0108 ĉ 58 2 265 0109 Ċ 76 2 266 010a ċ 58 2 267 010b Č 76 2 268 010c č 58 2 269 010d Ď 82 2 270 010e ď 68 2 271 010f Đ 83 2 272 0110 đ 67 2 273 0111 Ē 72 2 274 0112 ē 60 2 275 0113 Ĕ 72 2 276 0114 ĕ 60 2 277 0115 Ė 72 2 278 0116 ė 60 2 279 0117 Ę 73 3 280 0118 ę 60 1 281 0119 Ě 72 2 282 011a ě 60 2 283 011b Ĝ 81 2 284 011c ĝ 67 3 285 011d Ğ 81 2 286 011e ğ 67 3 287 011f Ġ 81 2 288 0120 ġ 67 3 289 0121 Ģ 81 3 290 0122 ģ 67 3 291 0123 Ĥ 90 2 292 0124 ĥ 69 2 293 0125 Ħ 90 2 294 0126 ħ 69 2 295 0127 Ĩ 44 2 296 0128 ĩ 36 2 297 0129 Ī 44 2 298 012a ī 36 2 299 012b Ĭ 44 2 300 012c ĭ 36 2 301 012d Į 44 3 302 012e į 36 3 303 012f İ 44 2 304 0130 ı 36 0 305 0131 IJ 89 3 306 0132 ij 71 3 307 0133 Ĵ 44 3 308 0134 ĵ 34 3 309 0135 Ķ 83 3 310 0136 ķ 66 3 311 0137 ĸ 66 0 312 0138 Ĺ 67 2 313 0139 ĺ 36 2 314 013a Ļ 67 3 315 013b ļ 36 3 316 013c Ľ 67 2 317 013d ľ 48 2 318 013e Ŀ 67 2 319 013f ŀ 53 2 320 0140 Ł 67 2 321 0141 ł 37 2 322 0142 Ń 87 2 323 0143 ń 69 2 324 0144 Ņ 87 3 325 0145 ņ 69 1 326 0146 Ň 87 2 327 0147 ň 69 2 328 0148 ʼn 96 2 329 0149 Ŋ 87 3 330 014a ŋ 69 1 331 014b Ō 83 2 332 014c ō 63 2 333 014d Ŏ 83 2 334 014e ŏ 63 2 335 014f Ő 83 2 336 0150 ő 63 2 337 0151 Œ 112 2 338 0152 œ 98 0 339 0153 Ŕ 79 2 340 0154 ŕ 50 2 341 0155 Ŗ 79 3 342 0156 ŗ 50 1 343 0157 Ř 79 2 344 0158 ř 50 2 345 0159 Ś 69 2 346 015a ś 53 2 347 015b Ŝ 69 2 348 015c ŝ 53 2 349 015d Ş 69 3 350 015e ş 53 1 351 015f Š 69 2 352 0160 š 53 2 353 0161 Ţ 71 3 354 0162 ţ 44 3 355 0163 Ť 71 2 356 0164 ť 44 2 357 0165 Ŧ 71 2 358 0166 ŧ 44 2 359 0167 Ũ 83 2 360 0168 ũ 69 2 361 0169 Ū 83 2 362 016a ū 69 2 363 016b Ŭ 83 2 364 016c ŭ 69 2 365 016d Ů 83 2 366 016e ů 69 2 367 016f Ű 83 2 368 0170 ű 69 2 369 0171 Ų 83 3 370 0172 ų 69 1 371 0173 Ŵ 107 2 372 0174 ŵ 82 2 373 0175 Ŷ 68 2 374 0176 ŷ 55 3 375 0177 Ÿ 68 2 376 0178 Ź 69 2 377 0179 ź 54 2 378 017a Ż 69 2 379 017b ż 54 2 380 017c Ž 69 2 381 017d ž 54 2 382 017e ſ 41 2 383 017f Ɓ 79 2 385 0181 Ƃ 81 2 386 0182 ƃ 66 2 387 0183 Ƅ 81 2 388 0184 ƅ 66 2 389 0185 Ɔ 76 2 390 0186 Ƈ 76 2 391 0187 ƈ 59 2 392 0188 Ɖ 83 2 393 0189 Ɗ 82 2 394 018a Ƌ 81 2 395 018b ƌ 66 2 396 018c ƍ 63 1 397 018d Ǝ 72 2 398 018e Ə 83 2 399 018f Ɛ 66 2 400 0190 Ƒ 67 3 401 0191 ƒ 66 3 402 0192 Ɠ 82 2 403 0193 Ɣ 73 3 404 0194 ƕ 99 2 405 0195 Ɩ 44 2 406 0196 Ɨ 44 2 407 0197 Ƙ 83 2 408 0198 ƙ 66 2 409 0199 ƚ 36 2 410 019a ƛ 67 2 411 019b Ɯ 101 2 412 019c Ɲ 86 3 413 019d ƞ 69 1 414 019e Ɵ 83 2 415 019f Ơ 83 2 416 01a0 ơ 64 0 417 01a1 Ƣ 114 3 418 01a2 ƣ 90 1 419 01a3 Ƥ 71 2 420 01a4 ƥ 66 3 421 01a5 Ʀ 81 3 422 01a6 Ƨ 69 2 423 01a7 ƨ 53 0 424 01a8 Ʃ 67 2 425 01a9 ƪ 31 3 426 01aa ƫ 44 3 427 01ab Ƭ 71 2 428 01ac ƭ 44 2 429 01ad Ʈ 71 3 430 01ae Ư 84 2 431 01af ư 70 0 432 01b0 Ʊ 85 2 433 01b1 Ʋ 85 2 434 01b2 Ƴ 68 2 435 01b3 ƴ 66 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 54 0 438 01b6 Ʒ 54 2 439 01b7 Ƹ 54 2 440 01b8 ƹ 54 1 441 01b9 ƻ 66 2 443 01bb Ƽ 72 2 444 01bc ƽ 54 1 445 01bd ƾ 50 2 446 01be ǀ 28 2 448 01c0 ǁ 47 2 449 01c1 ǂ 44 2 450 01c2 ǃ 36 2 451 01c3 Ǎ 74 2 461 01cd ǎ 62 2 462 01ce Ǐ 44 2 463 01cf ǐ 36 2 464 01d0 Ǒ 83 2 465 01d1 ǒ 63 2 466 01d2 Ǔ 83 2 467 01d3 ǔ 69 2 468 01d4 ǖ 69 2 470 01d6 Ǘ 84 2 471 01d7 ǘ 71 2 472 01d8 Ǚ 84 2 473 01d9 ǚ 71 2 474 01da Ǜ 84 2 475 01db ǜ 70 2 476 01dc ǝ 60 0 477 01dd ǟ 62 2 479 01df Ǣ 98 2 482 01e2 ǣ 93 2 483 01e3 Ǫ 83 3 490 01ea ǫ 63 1 491 01eb Ǭ 83 3 492 01ec ǭ 63 3 493 01ed Ƕ 116 2 502 01f6 Ș 69 3 536 0218 ș 53 1 537 0219 Ț 71 3 538 021a ț 44 3 539 021b Ȥ 69 3 548 0224 ȥ 54 1 549 0225 ȫ 63 2 555 022b ȭ 63 2 557 022d Ȯ 83 2 558 022e ȯ 63 2 559 022f ȱ 63 2 561 0231 Ȳ 68 2 562 0232 ȳ 55 3 563 0233 ȷ 34 1 567 0237 ȸ 98 2 568 0238 ȹ 98 1 569 0239 Ⱥ 74 2 570 023a Ȼ 76 2 571 023b ȼ 58 0 572 023c Ƚ 67 2 573 023d Ⱦ 71 2 574 023e ȿ 53 1 575 023f ɀ 54 1 576 0240 Ɂ 63 2 577 0241 ɐ 62 0 592 0250 ɑ 67 0 593 0251 ɒ 67 0 594 0252 ɓ 66 2 595 0253 ɔ 58 0 596 0254 ɕ 58 1 597 0255 ɖ 67 3 598 0256 ɗ 70 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 86 0 602 025a ɛ 53 0 603 025b ɜ 53 0 604 025c ɝ 86 0 605 025d ɞ 68 0 606 025e ɟ 36 1 607 025f ɠ 67 3 608 0260 ɡ 67 1 609 0261 ɢ 60 0 610 0262 ɣ 68 1 611 0263 ɤ 60 0 612 0264 ɥ 69 1 613 0265 ɦ 69 2 614 0266 ɧ 69 3 615 0267 ɨ 36 2 616 0268 ɩ 36 2 617 0269 ɪ 36 0 618 026a ɫ 39 2 619 026b ɬ 49 2 620 026c ɭ 37 3 621 026d ɮ 69 3 622 026e ɯ 100 0 623 026f ɰ 100 1 624 0270 ɱ 100 1 625 0271 ɲ 69 1 626 0272 ɳ 70 1 627 0273 ɴ 68 0 628 0274 ɵ 63 0 629 0275 ɶ 101 0 630 0276 ɷ 71 0 631 0277 ɸ 63 3 632 0278 ɹ 54 0 633 0279 ɺ 54 2 634 027a ɻ 55 1 635 027b ɼ 50 1 636 027c ɽ 50 1 637 027d ɾ 43 0 638 027e ɿ 46 0 639 027f ʀ 76 0 640 0280 ʁ 76 0 641 0281 ʂ 53 1 642 0282 ʃ 31 3 643 0283 ʄ 41 3 644 0284 ʅ 51 1 645 0285 ʆ 31 3 646 0286 ʇ 47 1 647 0287 ʈ 44 3 648 0288 ʉ 69 0 649 0289 ʊ 65 0 650 028a ʋ 66 0 651 028b ʌ 61 0 652 028c ʍ 86 0 653 028d ʎ 61 2 654 028e ʏ 69 0 655 028f ʐ 55 1 656 0290 ʑ 54 1 657 0291 ʒ 54 1 658 0292 ʓ 54 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 52 3 663 0297 ʘ 68 0 664 0298 ʙ 69 0 665 0299 ʚ 68 0 666 029a ʛ 60 2 667 029b ʜ 69 0 668 029c ʝ 36 3 669 029d ʞ 70 1 670 029e ʟ 61 0 671 029f ʠ 67 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 106 2 675 02a3 ʤ 112 3 676 02a4 ʥ 106 3 677 02a5 ʦ 86 2 678 02a6 ʧ 68 3 679 02a7 ʨ 86 3 680 02a8 ʩ 99 3 681 02a9 ʪ 75 2 682 02aa ʫ 76 2 683 02ab ʬ 63 2 684 02ac ʭ 42 2 685 02ad ʮ 58 3 686 02ae ʯ 68 3 687 02af ʰ 50 2 688 02b0 ʱ 49 2 689 02b1 ʲ 30 2 690 02b2 ʳ 39 2 691 02b3 ʴ 39 2 692 02b4 ʵ 46 2 693 02b5 ʶ 50 2 694 02b6 ʷ 63 2 695 02b7 ʸ 46 2 696 02b8 ʻ 33 2 699 02bb ʼ 33 2 700 02bc ʾ 35 2 702 02be ʿ 35 2 703 02bf ˀ 30 2 704 02c0 ˁ 30 2 705 02c1 ˆ 47 2 710 02c6 ˇ 47 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 35 0 720 02d0 ˑ 35 0 721 02d1 ˒ 34 2 722 02d2 ˓ 35 0 723 02d3 ˖ 37 0 726 02d6 ˘ 47 2 728 02d8 ˙ 47 2 729 02d9 ˚ 47 2 730 02da ˛ 48 1 731 02db ˜ 47 2 732 02dc ˝ 48 2 733 02dd ˞ 40 0 734 02de ˠ 44 2 736 02e0 ˡ 28 2 737 02e1 ˢ 38 2 738 02e2 ˣ 45 2 739 02e3 ˤ 30 2 740 02e4 ˥ 46 2 741 02e5 ˦ 46 2 742 02e6 ˧ 46 2 743 02e7 ˨ 46 2 744 02e8 ˩ 46 2 745 02e9 ́ 57 2 769 0301 ̂ 57 2 770 0302 ̃ 57 2 771 0303 ̄ 57 2 772 0304 ̅ 0 2 773 0305 ̆ 57 2 774 0306 ̇ 57 2 775 0307 ̈ 57 2 776 0308 ̉ 0 2 777 0309 ̊ 57 2 778 030a ̋ 57 2 779 030b ̌ 57 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 33 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 70 1 801 0321 ̢ 68 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 29 2 884 0374 ͵ 29 1 885 0375 ͺ 48 1 890 037a ; 35 1 894 037e ΄ 48 2 900 0384 ΅ 48 2 901 0385 Ά 74 2 902 0386 · 33 0 903 0387 Έ 90 2 904 0388 Ή 106 2 905 0389 Ί 63 2 906 038a Ό 84 2 908 038c Ύ 91 2 910 038e Ώ 86 2 911 038f ΐ 46 2 912 0390 Α 74 2 913 0391 Β 80 2 914 0392 Γ 68 2 915 0393 Δ 74 2 916 0394 Ε 72 2 917 0395 Ζ 69 2 918 0396 Η 90 2 919 0397 Θ 83 2 920 0398 Ι 44 2 921 0399 Κ 83 2 922 039a Λ 74 2 923 039b Μ 105 2 924 039c Ν 87 2 925 039d Ξ 67 2 926 039e Ο 83 2 927 039f Π 90 2 928 03a0 Ρ 72 2 929 03a1 Σ 67 2 931 03a3 Τ 71 2 932 03a4 Υ 68 2 933 03a5 Φ 83 2 934 03a6 Χ 74 2 935 03a7 Ψ 87 2 936 03a8 Ω 85 2 937 03a9 Ϊ 44 2 938 03aa Ϋ 68 2 939 03ab ά 73 2 940 03ac έ 58 2 941 03ad ή 69 3 942 03ae ί 46 2 943 03af ΰ 66 2 944 03b0 α 73 0 945 03b1 β 63 3 946 03b2 γ 63 1 947 03b3 δ 63 2 948 03b4 ε 58 0 949 03b5 ζ 56 3 950 03b6 η 69 1 951 03b7 θ 63 2 952 03b8 ι 46 0 953 03b9 κ 71 0 954 03ba λ 67 2 955 03bb μ 69 1 956 03bc ν 66 0 957 03bd ξ 56 3 958 03be ο 63 0 959 03bf π 70 0 960 03c0 ρ 63 1 961 03c1 ς 58 1 962 03c2 σ 70 0 963 03c3 τ 64 0 964 03c4 υ 66 0 965 03c5 φ 86 1 966 03c6 χ 62 1 967 03c7 ψ 89 1 968 03c8 ω 90 0 969 03c9 ϊ 46 2 970 03ca ϋ 66 2 971 03cb ό 63 2 972 03cc ύ 66 2 973 03cd ώ 90 2 974 03ce ϐ 63 2 976 03d0 ϑ 81 2 977 03d1 ϒ 73 2 978 03d2 ϓ 92 2 979 03d3 ϔ 74 2 980 03d4 ϕ 89 3 981 03d5 ϖ 90 0 982 03d6 ϗ 62 1 983 03d7 Ϙ 83 3 984 03d8 ϙ 63 1 985 03d9 Ϛ 75 3 986 03da ϛ 58 3 987 03db Ϝ 68 2 988 03dc ϝ 49 3 989 03dd Ϟ 56 2 990 03de ϟ 63 2 991 03df Ϡ 76 3 992 03e0 ϡ 63 1 993 03e1 ϰ 62 0 1008 03f0 ϱ 63 1 1009 03f1 ϲ 58 0 1010 03f2 ϳ 34 3 1011 03f3 ϴ 83 2 1012 03f4 ϵ 58 0 1013 03f5 ϶ 58 0 1014 03f6 Ϸ 72 2 1015 03f7 ϸ 66 3 1016 03f8 Ϲ 76 2 1017 03f9 Ϻ 105 2 1018 03fa ϻ 82 1 1019 03fb ϼ 66 1 1020 03fc Ͻ 76 2 1021 03fd Ͼ 76 2 1022 03fe Ͽ 76 2 1023 03ff Ё 72 2 1025 0401 Ђ 85 3 1026 0402 Ѓ 68 2 1027 0403 Є 75 2 1028 0404 Ѕ 69 2 1029 0405 І 44 2 1030 0406 Ї 44 2 1031 0407 Ј 44 3 1032 0408 Љ 119 2 1033 0409 Њ 120 2 1034 040a Ћ 91 2 1035 040b Ќ 83 2 1036 040c Ѝ 90 2 1037 040d Ў 77 2 1038 040e Џ 90 3 1039 040f А 74 2 1040 0410 Б 81 2 1041 0411 В 80 2 1042 0412 Г 68 2 1043 0413 Д 90 3 1044 0414 Е 72 2 1045 0415 Ж 125 2 1046 0416 З 66 2 1047 0417 И 90 2 1048 0418 Й 90 2 1049 0419 К 83 2 1050 041a Л 89 2 1051 041b М 105 2 1052 041c Н 90 2 1053 041d О 83 2 1054 041e П 90 2 1055 041f Р 72 2 1056 0420 С 76 2 1057 0421 Т 71 2 1058 0422 У 77 2 1059 0423 Ф 100 3 1060 0424 Х 74 2 1061 0425 Ц 90 3 1062 0426 Ч 86 2 1063 0427 Ш 106 2 1064 0428 Щ 108 3 1065 0429 Ъ 83 2 1066 042a Ы 113 2 1067 042b Ь 75 2 1068 042c Э 75 2 1069 042d Ю 122 2 1070 042e Я 79 2 1071 042f а 62 0 1072 0430 б 63 2 1073 0431 в 70 0 1074 0432 г 60 0 1075 0433 д 83 1 1076 0434 е 60 0 1077 0435 ж 101 0 1078 0436 з 58 0 1079 0437 и 70 0 1080 0438 й 70 2 1081 0439 к 66 0 1082 043a л 69 0 1083 043b м 101 0 1084 043c н 70 0 1085 043d о 63 0 1086 043e п 70 0 1087 043f р 66 1 1088 0440 с 58 0 1089 0441 т 59 0 1090 0442 у 55 1 1091 0443 ф 78 3 1092 0444 х 57 0 1093 0445 ц 70 1 1094 0446 ч 70 0 1095 0447 ш 95 0 1096 0448 щ 97 1 1097 0449 ъ 65 0 1098 044a ы 95 0 1099 044b ь 63 0 1100 044c э 58 0 1101 044d ю 97 0 1102 044e я 76 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 66 3 1106 0452 ѓ 60 2 1107 0453 є 58 0 1108 0454 ѕ 53 0 1109 0455 і 36 2 1110 0456 ї 36 2 1111 0457 ј 34 3 1112 0458 љ 94 0 1113 0459 њ 94 0 1114 045a ћ 69 2 1115 045b ќ 66 2 1116 045c ѝ 70 2 1117 045d ў 55 3 1118 045e џ 70 1 1119 045f Ґ 68 2 1168 0490 ґ 60 2 1169 0491 Ғ 68 2 1170 0492 ғ 60 0 1171 0493 Қ 83 3 1178 049a қ 66 1 1179 049b Ҳ 74 3 1202 04b2 ҳ 57 1 1203 04b3 Ӑ 74 2 1232 04d0 ӑ 62 2 1233 04d1 Ӓ 75 2 1234 04d2 ӓ 62 2 1235 04d3 Ӕ 98 2 1236 04d4 ӕ 93 0 1237 04d5 Ӗ 74 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 54 2 1248 04e0 ӡ 54 1 1249 04e1 Ӧ 84 2 1254 04e6 ӧ 63 2 1255 04e7 Ө 83 2 1256 04e8 ө 63 0 1257 04e9 Ӫ 84 2 1258 04ea ӫ 63 2 1259 04eb ᴂ 89 0 7426 1d02 ᴈ 48 0 7432 1d08 ᴉ 30 1 7433 1d09 ᴔ 94 0 7444 1d14 ᴖ 63 0 7446 1d16 ᴗ 63 0 7447 1d17 ᴝ 70 2 7453 1d1d ᴞ 90 2 7454 1d1e ᴟ 90 3 7455 1d1f ᵃ 44 2 7491 1d43 ᵄ 44 2 7492 1d44 ᵅ 47 2 7493 1d45 ᵆ 62 2 7494 1d46 ᵇ 47 2 7495 1d47 ᵈ 47 2 7496 1d48 ᵉ 42 2 7497 1d49 ᵊ 42 2 7498 1d4a ᵋ 39 2 7499 1d4b ᵌ 39 2 7500 1d4c ᵍ 47 2 7501 1d4d ᵎ 28 2 7502 1d4e ᵏ 50 2 7503 1d4f ᵐ 69 2 7504 1d50 ᵑ 45 2 7505 1d51 ᵒ 44 2 7506 1d52 ᵓ 40 2 7507 1d53 ᵔ 44 2 7508 1d54 ᵕ 44 0 7509 1d55 ᵖ 47 2 7510 1d56 ᵗ 35 2 7511 1d57 ᵘ 49 2 7512 1d58 ᵙ 41 2 7513 1d59 ᵚ 69 2 7514 1d5a ᵛ 47 2 7515 1d5b ᵷ 61 1 7543 1d77 ᵻ 35 0 7547 1d7b ᶅ 36 3 7557 1d85 ᶛ 47 2 7579 1d9b ᶜ 40 2 7580 1d9c ᶝ 40 2 7581 1d9d ᶞ 44 2 7582 1d9e ᶟ 39 2 7583 1d9f ᶠ 36 2 7584 1da0 ᶡ 35 2 7585 1da1 ᶢ 47 2 7586 1da2 ᶣ 50 2 7587 1da3 ᶤ 28 2 7588 1da4 ᶥ 29 2 7589 1da5 ᶦ 28 2 7590 1da6 ᶧ 28 2 7591 1da7 ᶨ 35 2 7592 1da8 ᶩ 35 2 7593 1da9 ᶪ 30 2 7594 1daa ᶫ 41 2 7595 1dab ᶬ 65 2 7596 1dac ᶭ 69 2 7597 1dad ᶮ 56 2 7598 1dae ᶯ 56 2 7599 1daf ᶰ 45 2 7600 1db0 ᶱ 44 2 7601 1db1 ᶲ 50 2 7602 1db2 ᶳ 38 2 7603 1db3 ᶴ 37 2 7604 1db4 ᶵ 35 2 7605 1db5 ᶶ 49 2 7606 1db6 ᶷ 45 2 7607 1db7 ᶹ 46 2 7609 1db9 ᶺ 47 2 7610 1dba ᶻ 39 2 7611 1dbb ᶼ 50 2 7612 1dbc ᶽ 39 2 7613 1dbd ᶾ 43 2 7614 1dbe ᶿ 44 2 7615 1dbf Ḍ 82 3 7692 1e0c ḍ 67 3 7693 1e0d Ḓ 83 3 7698 1e12 ḓ 67 3 7699 1e13 Ḥ 90 3 7716 1e24 ḥ 69 3 7717 1e25 Ḷ 67 3 7734 1e36 ḷ 36 3 7735 1e37 Ḹ 67 3 7736 1e38 ḹ 36 3 7737 1e39 Ḽ 65 3 7740 1e3c ḽ 40 3 7741 1e3d ṁ 101 2 7745 1e41 Ṃ 105 3 7746 1e42 ṃ 101 1 7747 1e43 Ṅ 84 2 7748 1e44 ṅ 70 2 7749 1e45 Ṇ 87 3 7750 1e46 ṇ 69 1 7751 1e47 Ṋ 84 3 7754 1e4a ṋ 70 1 7755 1e4b ṗ 66 3 7767 1e57 Ṛ 79 3 7770 1e5a ṛ 50 1 7771 1e5b Ṝ 79 3 7772 1e5c ṝ 50 3 7773 1e5d ṡ 53 2 7777 1e61 Ṣ 69 3 7778 1e62 ṣ 53 1 7779 1e63 Ṭ 71 3 7788 1e6c ṭ 44 3 7789 1e6d Ṱ 70 3 7792 1e70 ṱ 46 3 7793 1e71 Ṿ 74 3 7806 1e7e ṿ 55 1 7807 1e7f Ẁ 107 2 7808 1e80 ẁ 82 2 7809 1e81 Ẃ 107 2 7810 1e82 ẃ 82 2 7811 1e83 Ẅ 107 2 7812 1e84 ẅ 82 2 7813 1e85 Ẹ 72 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 44 3 7882 1eca ị 36 3 7883 1ecb Ọ 83 3 7884 1ecc ọ 63 1 7885 1ecd Ụ 83 3 7908 1ee4 ụ 69 1 7909 1ee5 Ỳ 68 2 7922 1ef2 ỳ 55 3 7923 1ef3 ἁ 73 2 7937 1f01 ἂ 73 2 7938 1f02 ἃ 73 2 7939 1f03 ἄ 73 2 7940 1f04 ἅ 73 2 7941 1f05 ἆ 73 2 7942 1f06 ἇ 73 2 7943 1f07 Ἀ 74 2 7944 1f08 Ἁ 74 2 7945 1f09 Ἂ 93 2 7946 1f0a Ἃ 93 2 7947 1f0b Ἄ 79 2 7948 1f0c Ἅ 81 2 7949 1f0d Ἆ 74 2 7950 1f0e Ἇ 74 2 7951 1f0f ἐ 58 2 7952 1f10 ἑ 58 2 7953 1f11 ἒ 58 2 7954 1f12 ἓ 58 2 7955 1f13 ἔ 58 2 7956 1f14 ἕ 58 2 7957 1f15 Ἐ 87 2 7960 1f18 Ἑ 86 2 7961 1f19 Ἒ 111 2 7962 1f1a Ἓ 111 2 7963 1f1b Ἔ 103 2 7964 1f1c Ἕ 106 2 7965 1f1d ἠ 69 3 7968 1f20 ἡ 69 3 7969 1f21 ἢ 69 3 7970 1f22 ἣ 69 3 7971 1f23 ἤ 69 3 7972 1f24 ἥ 69 3 7973 1f25 ἦ 69 3 7974 1f26 ἧ 69 3 7975 1f27 Ἠ 104 2 7976 1f28 Ἡ 104 2 7977 1f29 Ἢ 129 2 7978 1f2a Ἣ 129 2 7979 1f2b Ἤ 121 2 7980 1f2c Ἥ 124 2 7981 1f2d Ἦ 113 2 7982 1f2e Ἧ 113 2 7983 1f2f ἰ 46 2 7984 1f30 ἱ 46 2 7985 1f31 ἲ 46 2 7986 1f32 ἳ 46 2 7987 1f33 ἴ 46 2 7988 1f34 ἵ 46 2 7989 1f35 ἶ 46 2 7990 1f36 ἷ 46 2 7991 1f37 Ἰ 59 2 7992 1f38 Ἱ 58 2 7993 1f39 Ἲ 83 2 7994 1f3a Ἳ 83 2 7995 1f3b Ἴ 76 2 7996 1f3c Ἵ 79 2 7997 1f3d Ἶ 68 2 7998 1f3e Ἷ 68 2 7999 1f3f ὀ 63 2 8000 1f40 ὁ 63 2 8001 1f41 ὂ 63 2 8002 1f42 ὃ 63 2 8003 1f43 ὄ 63 2 8004 1f44 ὅ 63 2 8005 1f45 Ὀ 85 2 8008 1f48 Ὁ 88 2 8009 1f49 Ὂ 117 2 8010 1f4a Ὃ 117 2 8011 1f4b Ὄ 98 2 8012 1f4c Ὅ 101 2 8013 1f4d ὐ 66 2 8016 1f50 ὑ 66 2 8017 1f51 ὒ 66 2 8018 1f52 ὓ 66 2 8019 1f53 ὔ 66 2 8020 1f54 ὕ 66 2 8021 1f55 ὖ 66 2 8022 1f56 ὗ 66 2 8023 1f57 Ὑ 87 2 8025 1f59 Ὓ 112 2 8027 1f5b Ὕ 107 2 8029 1f5d Ὗ 97 2 8031 1f5f ὠ 90 2 8032 1f60 ὡ 90 2 8033 1f61 ὢ 90 2 8034 1f62 ὣ 90 2 8035 1f63 ὤ 90 2 8036 1f64 ὥ 90 2 8037 1f65 ὦ 90 2 8038 1f66 ὧ 90 2 8039 1f67 Ὠ 88 2 8040 1f68 Ὡ 91 2 8041 1f69 Ὢ 120 2 8042 1f6a Ὣ 121 2 8043 1f6b Ὤ 100 2 8044 1f6c Ὥ 103 2 8045 1f6d Ὦ 97 2 8046 1f6e Ὧ 100 2 8047 1f6f ὰ 73 2 8048 1f70 ά 73 2 8049 1f71 ὲ 58 2 8050 1f72 έ 58 2 8051 1f73 ὴ 69 3 8052 1f74 ή 69 3 8053 1f75 ὶ 46 2 8054 1f76 ί 46 2 8055 1f77 ὸ 63 2 8056 1f78 ό 63 2 8057 1f79 ὺ 66 2 8058 1f7a ύ 66 2 8059 1f7b ὼ 90 2 8060 1f7c ώ 90 2 8061 1f7d ᾀ 73 3 8064 1f80 ᾁ 73 3 8065 1f81 ᾂ 73 3 8066 1f82 ᾃ 73 3 8067 1f83 ᾄ 73 3 8068 1f84 ᾅ 73 3 8069 1f85 ᾆ 73 3 8070 1f86 ᾇ 73 3 8071 1f87 ᾈ 74 3 8072 1f88 ᾉ 74 3 8073 1f89 ᾊ 93 3 8074 1f8a ᾋ 93 3 8075 1f8b ᾌ 79 3 8076 1f8c ᾍ 80 3 8077 1f8d ᾎ 74 3 8078 1f8e ᾏ 74 3 8079 1f8f ᾐ 69 3 8080 1f90 ᾑ 69 3 8081 1f91 ᾒ 69 3 8082 1f92 ᾓ 69 3 8083 1f93 ᾔ 69 3 8084 1f94 ᾕ 69 3 8085 1f95 ᾖ 69 3 8086 1f96 ᾗ 69 3 8087 1f97 ᾘ 104 3 8088 1f98 ᾙ 103 3 8089 1f99 ᾚ 128 3 8090 1f9a ᾛ 129 3 8091 1f9b ᾜ 121 3 8092 1f9c ᾝ 124 3 8093 1f9d ᾞ 113 3 8094 1f9e ᾟ 113 3 8095 1f9f ᾠ 90 3 8096 1fa0 ᾡ 90 3 8097 1fa1 ᾢ 90 3 8098 1fa2 ᾣ 90 3 8099 1fa3 ᾤ 90 3 8100 1fa4 ᾥ 90 3 8101 1fa5 ᾦ 90 3 8102 1fa6 ᾧ 90 3 8103 1fa7 ᾨ 88 3 8104 1fa8 ᾩ 91 3 8105 1fa9 ᾪ 120 3 8106 1faa ᾫ 120 3 8107 1fab ᾬ 100 3 8108 1fac ᾭ 103 3 8109 1fad ᾮ 97 3 8110 1fae ᾯ 100 3 8111 1faf ᾰ 73 2 8112 1fb0 ᾱ 73 2 8113 1fb1 ᾲ 73 3 8114 1fb2 ᾳ 73 1 8115 1fb3 ᾴ 73 3 8116 1fb4 ᾶ 73 2 8118 1fb6 ᾷ 73 3 8119 1fb7 Ᾰ 74 2 8120 1fb8 Ᾱ 74 2 8121 1fb9 Ὰ 77 2 8122 1fba Ά 74 2 8123 1fbb ᾼ 74 3 8124 1fbc ᾽ 47 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 47 2 8127 1fbf ῀ 47 2 8128 1fc0 ῁ 47 2 8129 1fc1 ῂ 69 3 8130 1fc2 ῃ 69 1 8131 1fc3 ῄ 69 3 8132 1fc4 ῆ 69 3 8134 1fc6 ῇ 69 3 8135 1fc7 Ὲ 95 2 8136 1fc8 Έ 89 2 8137 1fc9 Ὴ 113 2 8138 1fca Ή 106 2 8139 1fcb ῌ 90 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 47 2 8142 1fce ῏ 47 2 8143 1fcf ῐ 46 2 8144 1fd0 ῑ 46 2 8145 1fd1 ῒ 46 2 8146 1fd2 ΐ 46 2 8147 1fd3 ῖ 46 2 8150 1fd6 ῗ 46 2 8151 1fd7 Ῐ 47 2 8152 1fd8 Ῑ 44 2 8153 1fd9 Ὶ 68 2 8154 1fda Ί 62 2 8155 1fdb ῝ 47 2 8157 1fdd ῞ 47 2 8158 1fde ῟ 47 2 8159 1fdf ῠ 66 2 8160 1fe0 ῡ 66 2 8161 1fe1 ῢ 66 2 8162 1fe2 ΰ 66 2 8163 1fe3 ῤ 63 3 8164 1fe4 ῥ 63 3 8165 1fe5 ῦ 66 2 8166 1fe6 ῧ 66 2 8167 1fe7 Ῠ 70 2 8168 1fe8 Ῡ 68 2 8169 1fe9 Ὺ 97 2 8170 1fea Ύ 90 2 8171 1feb Ῥ 86 2 8172 1fec ῭ 47 2 8173 1fed ΅ 48 2 8174 1fee ` 47 2 8175 1fef ῲ 90 3 8178 1ff2 ῳ 90 1 8179 1ff3 ῴ 90 3 8180 1ff4 ῶ 90 2 8182 1ff6 ῷ 90 3 8183 1ff7 Ὸ 101 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 104 2 8186 1ffa Ώ 86 2 8187 1ffb ῼ 85 3 8188 1ffc ´ 48 2 8189 1ffd ῾ 47 2 8190 1ffe ‐ 39 0 8208 2010 ‑ 39 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 33 2 8219 201b “ 55 2 8220 201c ” 54 2 8221 201d „ 54 1 8222 201e ‟ 54 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 61 0 8226 2022 ‣ 61 0 8227 2023 … 95 0 8230 2026 ‰ 132 2 8240 2030 ‱ 173 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 60 2 8252 203c ‾ 47 2 8254 203e ⁇ 103 2 8263 2047 ⁈ 81 2 8264 2048 ⁉ 81 2 8265 2049 ⁰ 42 2 8304 2070 ⁴ 42 2 8308 2074 ⁵ 42 2 8309 2075 ⁶ 42 2 8310 2076 ⁷ 42 2 8311 2077 ⁸ 42 2 8312 2078 ⁹ 42 2 8313 2079 ⁿ 49 2 8319 207f ₦ 66 2 8358 20a6 € 66 2 8364 20ac ₵ 66 3 8373 20b5 № 130 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 85 2 8486 2126 K 83 2 8490 212a Å 74 2 8491 212b ∂ 51 2 8706 2202 pd " ∆ 72 2 8710 2206 ∇ 72 2 8711 2207 gr " ∏ 80 3 8719 220f ∑ 71 3 8721 2211 − 80 0 8722 2212 ∕ 16 2 8725 2215 ∙ 33 0 8729 2219 bu " √ 63 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 77 0 8743 2227 l∧ 77 0 8743 2227 " ∨ 77 0 8744 2228 l| " ∩ 77 0 8745 2229 ca " ∪ 77 0 8746 222a cu " ∫ 55 3 8747 222b is " ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 79 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 88 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 56 3 8992 2320 ⌡ 54 3 8993 2321 ⌥ 95 2 8997 2325 ⍽ 96 1 9085 237d ⎮ 55 3 9134 23ae ⏏ 73 0 9167 23cf ␣ 79 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 61 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 61 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⟠ 47 3 10208 27e0 ⧫ 47 3 10731 29eb ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 69 2 64257 fb01 fl 69 2 64258 fb02 � 106 3 65533 fffd 9base-6/troff/font/devutf/LuxiMono-BoldOblique0000644000175000017500000001441511402154555021032 0ustar anselmanselmname LuxiMono-BoldOblique fontname LuxiMono-BoldOblique spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 2 60 003c = 60 0 61 003d > 60 2 62 003e ? 60 2 63 003f @ 60 2 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e € 60 2 128 0080   60 0 160 00a0 ¡ 60 1 161 00a1 ¢ 60 2 162 00a2 £ 60 2 163 00a3 ¤ 60 2 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 0 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 2 188 00bc ½ 60 2 189 00bd ¾ 60 2 190 00be ¿ 60 1 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 2 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f ƒ 60 3 402 0192 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˉ 60 2 713 02c9 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ̦ 33 1 806 0326 ; 60 1 894 037e · 60 0 903 0387 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 65 1 8218 201a ‛ 60 0 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 65 1 8222 201e † 60 3 8224 2020 ‡ 65 3 8225 2021 • 60 0 8226 2022 … 60 0 8230 2026 ‰ 65 2 8240 2030 ‹ 60 0 8249 2039 › 60 0 8250 203a ‾ 60 2 8254 203e ⁄ 60 2 8260 2044 € 60 2 8364 20ac ™ 60 2 8482 2122 tm " ℮ 60 0 8494 212e − 60 0 8722 2212 ∕ 60 2 8725 2215 ∙ 60 0 8729 2219 bu " ⋅ 60 0 8901 22c5  60 2 59905 ea01  60 2 59906 ea02  60 2 61444 f004  60 2 61445 f005  60 2 61446 f006  60 2 61447 f007  60 1 63166 f6be fi 60 2 64257 fb01 fl 60 2 64258 fb02 9base-6/troff/font/devutf/LucidaSans0000644000175000017500000007574611402154555017125 0ustar anselmanselmname LucidaSans fontname LucidaSans spacewidth 32 charset ! 32 2 33 0021 " 37 2 34 0022 dq " # 63 2 35 0023 $ 63 2 36 0024 % 67 2 37 0025 & 70 2 38 0026 ' 32 2 8217 2019 ’ " ( 33 2 40 0028 ) 33 2 41 0029 * 48 2 42 002a + 80 0 43 002b , 32 1 44 002c - 58 0 45 002d . 32 0 46 002e / 53 2 47 002f 0 63 2 48 0030 1 63 2 49 0031 2 63 2 50 0032 3 63 2 51 0033 4 63 2 52 0034 5 63 2 53 0035 6 63 2 54 0036 7 63 2 55 0037 8 63 2 56 0038 9 63 2 57 0039 : 32 0 58 003a ; 32 1 59 003b < 80 2 60 003c = 80 0 61 003d > 80 2 62 003e ? 42 2 63 003f @ 86 3 64 0040 A 69 2 65 0041 B 58 2 66 0042 C 69 2 67 0043 D 75 2 68 0044 E 54 2 69 0045 F 54 2 70 0046 G 72 2 71 0047 H 74 2 72 0048 I 29 2 73 0049 J 31 2 74 004a K 65 2 75 004b L 53 2 76 004c M 86 2 77 004d N 74 2 78 004e O 78 2 79 004f P 55 2 80 0050 Q 78 2 81 0051 R 63 2 82 0052 S 54 2 83 0053 T 63 2 84 0054 U 69 2 85 0055 V 65 2 86 0056 W 86 2 87 0057 X 63 2 88 0058 Y 62 2 89 0059 Z 61 2 90 005a [ 33 3 91 005b \ 53 2 92 005c bs " ] 33 3 93 005d ^ 63 2 94 005e _ 50 1 95 005f ` 32 2 8216 2018 ‘ " \` 61 2 96 0060 ga " a 55 0 97 0061 b 63 2 98 0062 c 51 0 99 0063 d 63 2 100 0064 e 56 0 101 0065 f 37 2 102 0066 g 62 1 103 0067 h 62 2 104 0068 i 29 2 105 0069 j 30 3 106 006a k 58 2 107 006b l 29 2 108 006c m 93 0 109 006d n 62 0 110 006e o 61 0 111 006f p 63 1 112 0070 q 63 1 113 0071 r 41 0 114 0072 s 51 0 115 0073 t 37 2 116 0074 u 62 0 117 0075 v 52 0 118 0076 w 77 0 119 0077 x 61 0 120 0078 y 52 1 121 0079 z 57 0 122 007a { 33 3 123 007b | 37 3 124 007c } 33 3 125 007d ~ 63 2 126 007e   32 3 160 00a0 ¡ 32 1 161 00a1 ¢ 63 3 162 00a2 £ 63 2 163 00a3 ¤ 63 2 164 00a4 ¥ 63 2 165 00a5 ¦ 37 2 166 00a6 § 63 3 167 00a7 ¨ 61 2 168 00a8 © 86 2 169 00a9 ª 42 2 170 00aa « 52 0 171 00ab ¬ 80 0 172 00ac ­ 33 0 173 00ad hy " ® 63 2 174 00ae rg " ¯ 50 2 175 00af ° 28 2 176 00b0 ± 80 2 177 00b1 +- " ² 42 2 178 00b2 ³ 42 2 179 00b3 ´ 61 2 180 00b4 aa " µ 63 1 181 00b5 ¶ 63 3 182 00b6 · 63 0 183 00b7 ¸ 61 1 184 00b8 ¹ 42 2 185 00b9 º 42 2 186 00ba » 52 0 187 00bb ¼ 80 2 188 00bc ½ 80 2 189 00bd ¾ 80 2 190 00be ¿ 42 1 191 00bf À 69 2 192 00c0 Á 69 2 193 00c1  69 2 194 00c2 à 69 2 195 00c3 Ä 69 2 196 00c4 Å 69 2 197 00c5 Æ 91 2 198 00c6 Ç 69 3 199 00c7 È 54 2 200 00c8 É 54 2 201 00c9 Ê 54 2 202 00ca Ë 54 2 203 00cb Ì 29 2 204 00cc Í 29 2 205 00cd Î 29 2 206 00ce Ï 29 2 207 00cf Ð 75 2 208 00d0 Ñ 74 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 80 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 69 2 217 00d9 Ú 69 2 218 00da Û 69 2 219 00db Ü 69 2 220 00dc Ý 62 2 221 00dd Þ 55 2 222 00de ß 60 2 223 00df à 55 2 224 00e0 á 55 2 225 00e1 â 55 2 226 00e2 ã 55 2 227 00e3 ä 55 2 228 00e4 å 55 2 229 00e5 æ 85 0 230 00e6 ç 51 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 29 0 236 00ec í 29 2 237 00ed î 29 0 238 00ee ï 29 2 239 00ef ð 60 2 240 00f0 ñ 62 2 241 00f1 ò 61 2 242 00f2 ó 61 2 243 00f3 ô 61 2 244 00f4 õ 61 2 245 00f5 ö 61 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 61 2 248 00f8 ù 62 2 249 00f9 ú 62 2 250 00fa û 62 2 251 00fb ü 62 2 252 00fc ý 52 3 253 00fd þ 63 3 254 00fe ÿ 52 3 255 00ff Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 58 2 306 0132 ij 58 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/DejaVuSerifBold0000644000175000017500000006223511402154555020034 0ustar anselmanselmname DejaVuSerifBold fontname DejaVuSerifBold spacewidth 35 charset ! 44 2 33 0021 " 52 2 34 0022 dq " dq " # 84 2 35 0023 $ 70 3 36 0024 % 95 2 37 0025 & 90 2 38 0026 ( 47 3 40 0028 ) 47 3 41 0029 * 52 2 42 002a + 84 2 43 002b , 35 1 44 002c - 42 0 45 002d . 35 0 46 002e / 37 3 47 002f 0 70 2 48 0030 1 70 2 49 0031 2 70 2 50 0032 3 70 2 51 0033 4 70 2 52 0034 5 70 2 53 0035 6 70 2 54 0036 7 70 2 55 0037 8 70 2 56 0038 9 70 2 57 0039 : 37 0 58 003a ; 37 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 59 2 63 003f @ 100 3 64 0040 A 78 2 65 0041 B 85 2 66 0042 C 80 2 67 0043 D 87 2 68 0044 E 76 2 69 0045 F 71 2 70 0046 G 85 2 71 0047 H 94 2 72 0048 I 47 2 73 0049 J 47 3 74 004a K 87 2 75 004b L 70 2 76 004c M 111 2 77 004d N 91 2 78 004e O 87 2 79 004f P 75 2 80 0050 Q 87 3 81 0051 R 83 2 82 0052 S 72 2 83 0053 T 74 2 84 0054 U 87 2 85 0055 V 78 2 86 0056 W 112 2 87 0057 X 78 2 88 0058 Y 71 2 89 0059 Z 73 2 90 005a [ 47 3 91 005b \ 37 3 92 005c bs " ] 47 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 65 0 97 0061 b 70 2 98 0062 c 61 0 99 0063 d 70 2 100 0064 e 64 0 101 0065 f 43 2 102 0066 g 70 1 103 0067 h 73 2 104 0068 i 38 2 105 0069 j 36 3 106 006a k 69 2 107 006b l 38 2 108 006c m 106 0 109 006d n 73 0 110 006e o 67 0 111 006f p 70 1 112 0070 q 70 1 113 0071 r 53 0 114 0072 s 56 0 115 0073 t 46 2 116 0074 u 73 0 117 0075 v 58 0 118 0076 w 86 0 119 0077 x 60 0 120 0078 y 58 1 121 0079 z 57 0 122 007a { 64 3 123 007b | 36 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   70 0 160 00a0 ¡ 44 2 161 00a1 ¢ 70 3 162 00a2 £ 70 2 163 00a3 ¤ 64 0 164 00a4 ¥ 70 2 165 00a5 ¦ 36 3 166 00a6 § 52 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 49 2 170 00aa « 63 0 171 00ab ¬ 84 0 172 00ac ­ 42 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 44 2 178 00b2 ³ 44 2 179 00b3 ´ 50 2 180 00b4 aa " µ 73 1 181 00b5 ¶ 64 3 182 00b6 · 35 0 183 00b7 ¸ 50 1 184 00b8 ¹ 44 2 185 00b9 º 50 2 186 00ba » 63 0 187 00bb ¼ 104 2 188 00bc ½ 104 2 189 00bd ¾ 104 2 190 00be ¿ 59 2 191 00bf À 78 2 192 00c0 Á 78 2 193 00c1  78 2 194 00c2 à 78 2 195 00c3 Ä 78 2 196 00c4 Å 78 2 197 00c5 Æ 103 2 198 00c6 Ç 80 3 199 00c7 È 76 2 200 00c8 É 76 2 201 00c9 Ê 76 2 202 00ca Ë 76 2 203 00cb Ì 47 2 204 00cc Í 47 2 205 00cd Î 47 2 206 00ce Ï 47 2 207 00cf Ð 87 2 208 00d0 Ñ 91 2 209 00d1 Ò 87 2 210 00d2 Ó 87 2 211 00d3 Ô 87 2 212 00d4 Õ 87 2 213 00d5 Ö 87 2 214 00d6 × 84 2 215 00d7 mu " Ø 87 2 216 00d8 Ù 87 2 217 00d9 Ú 87 2 218 00da Û 87 2 219 00db Ü 87 2 220 00dc Ý 71 2 221 00dd Þ 76 2 222 00de ß 76 2 223 00df à 65 2 224 00e0 á 65 2 225 00e1 â 65 2 226 00e2 ã 65 2 227 00e3 ä 65 2 228 00e4 å 65 2 229 00e5 æ 98 0 230 00e6 ç 61 1 231 00e7 è 64 2 232 00e8 é 64 2 233 00e9 ê 64 2 234 00ea ë 64 2 235 00eb ì 38 2 236 00ec í 38 2 237 00ed î 38 2 238 00ee ï 38 2 239 00ef ð 67 2 240 00f0 ñ 73 2 241 00f1 ò 67 2 242 00f2 ó 67 2 243 00f3 ô 67 2 244 00f4 õ 67 2 245 00f5 ö 67 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 67 0 248 00f8 ù 73 2 249 00f9 ú 73 2 250 00fa û 73 2 251 00fb ü 73 2 252 00fc ý 58 3 253 00fd þ 70 3 254 00fe ÿ 58 3 255 00ff ā 65 2 257 0101 Ă 78 2 258 0102 ă 65 2 259 0103 Ą 78 3 260 0104 ą 65 1 261 0105 Ć 80 2 262 0106 ć 61 2 263 0107 Ĉ 80 2 264 0108 ĉ 61 2 265 0109 Ċ 80 2 266 010a ċ 61 2 267 010b Č 80 2 268 010c č 61 2 269 010d Ď 87 2 270 010e ď 70 2 271 010f Đ 87 2 272 0110 đ 70 2 273 0111 Ē 76 2 274 0112 ē 64 2 275 0113 Ĕ 76 2 276 0114 ĕ 64 2 277 0115 Ė 76 2 278 0116 ė 64 2 279 0117 Ę 76 3 280 0118 ę 64 1 281 0119 Ě 76 2 282 011a ě 64 2 283 011b Ĝ 85 2 284 011c ĝ 70 3 285 011d Ğ 85 2 286 011e ğ 70 3 287 011f Ġ 85 2 288 0120 ġ 70 3 289 0121 Ģ 85 3 290 0122 ģ 70 3 291 0123 Ĥ 94 2 292 0124 ĥ 73 2 293 0125 Ħ 94 2 294 0126 ħ 73 2 295 0127 Ĩ 47 2 296 0128 ĩ 38 2 297 0129 Ī 47 2 298 012a ī 38 2 299 012b Ĭ 47 2 300 012c ĭ 38 2 301 012d Į 47 3 302 012e į 38 3 303 012f İ 47 2 304 0130 ı 38 0 305 0131 IJ 94 3 306 0132 ij 75 3 307 0133 Ĵ 47 3 308 0134 ĵ 36 3 309 0135 Ķ 87 3 310 0136 ķ 69 3 311 0137 ĸ 69 0 312 0138 Ĺ 70 2 313 0139 ĺ 38 2 314 013a Ļ 70 3 315 013b ļ 38 3 316 013c Ľ 70 2 317 013d ľ 51 2 318 013e Ŀ 70 2 319 013f ŀ 56 2 320 0140 Ł 71 2 321 0141 ł 38 2 322 0142 Ń 91 2 323 0143 ń 73 2 324 0144 Ņ 91 3 325 0145 ņ 73 1 326 0146 Ň 91 2 327 0147 ň 73 2 328 0148 ʼn 101 2 329 0149 Ŋ 91 3 330 014a ŋ 73 1 331 014b Ō 87 2 332 014c ō 67 2 333 014d Ŏ 87 2 334 014e ŏ 67 2 335 014f Ő 87 2 336 0150 ő 67 2 337 0151 Œ 118 2 338 0152 œ 103 0 339 0153 Ŕ 83 2 340 0154 ŕ 53 2 341 0155 Ŗ 83 3 342 0156 ŗ 53 1 343 0157 Ř 83 2 344 0158 ř 53 2 345 0159 Ś 72 2 346 015a ś 56 2 347 015b Ŝ 72 2 348 015c ŝ 56 2 349 015d Ş 72 3 350 015e ş 56 1 351 015f Š 72 2 352 0160 š 56 2 353 0161 Ţ 74 3 354 0162 ţ 46 3 355 0163 Ť 74 2 356 0164 ť 46 2 357 0165 Ŧ 74 2 358 0166 ŧ 46 2 359 0167 Ũ 87 2 360 0168 ũ 73 2 361 0169 Ū 87 2 362 016a ū 73 2 363 016b Ŭ 87 2 364 016c ŭ 73 2 365 016d Ů 87 2 366 016e ů 73 2 367 016f Ű 87 2 368 0170 ű 73 2 369 0171 Ų 87 3 370 0172 ų 73 1 371 0173 Ŵ 112 2 372 0174 ŵ 86 2 373 0175 Ŷ 71 2 374 0176 ŷ 58 3 375 0177 Ÿ 71 2 376 0178 Ź 73 2 377 0179 ź 57 2 378 017a Ż 73 2 379 017b ż 57 2 380 017c Ž 73 2 381 017d ž 57 2 382 017e ſ 43 2 383 017f Ɓ 85 2 385 0181 Ƃ 85 2 386 0182 ƃ 70 2 387 0183 Ƅ 85 2 388 0184 ƅ 70 2 389 0185 Ɔ 80 2 390 0186 Ƈ 80 2 391 0187 ƈ 61 2 392 0188 Ɖ 87 2 393 0189 Ɗ 87 2 394 018a Ƌ 85 2 395 018b ƌ 70 2 396 018c ƍ 67 1 397 018d Ǝ 76 2 398 018e Ə 87 2 399 018f Ɛ 70 2 400 0190 Ƒ 71 3 401 0191 ƒ 43 3 402 0192 Ɠ 85 2 403 0193 Ɣ 77 3 404 0194 ƕ 104 2 405 0195 Ɩ 47 2 406 0196 Ɨ 47 2 407 0197 Ƙ 87 2 408 0198 ƙ 69 2 409 0199 ƚ 38 2 410 019a ƛ 70 2 411 019b Ɯ 106 2 412 019c Ɲ 91 3 413 019d ƞ 73 1 414 019e Ɵ 87 2 415 019f Ơ 87 2 416 01a0 ơ 67 0 417 01a1 Ƣ 120 3 418 01a2 ƣ 94 1 419 01a3 Ƥ 75 2 420 01a4 ƥ 70 3 421 01a5 Ʀ 84 3 422 01a6 Ƨ 72 2 423 01a7 ƨ 56 0 424 01a8 Ʃ 71 2 425 01a9 ƪ 33 3 426 01aa ƫ 46 3 427 01ab Ƭ 74 2 428 01ac ƭ 46 2 429 01ad Ʈ 74 3 430 01ae Ư 87 2 431 01af ư 73 0 432 01b0 Ʊ 89 2 433 01b1 Ʋ 89 2 434 01b2 Ƴ 71 2 435 01b3 ƴ 70 1 436 01b4 Ƶ 73 2 437 01b5 ƶ 57 0 438 01b6 Ʒ 57 2 439 01b7 Ƹ 57 2 440 01b8 ƹ 57 1 441 01b9 ƻ 70 2 443 01bb Ƽ 75 2 444 01bc ƽ 57 1 445 01bd ƾ 54 2 446 01be ǀ 29 2 448 01c0 ǁ 49 2 449 01c1 ǂ 46 2 450 01c2 ǃ 29 2 451 01c3 Ǎ 78 2 461 01cd ǎ 65 2 462 01ce Ǐ 47 2 463 01cf ǐ 38 2 464 01d0 Ǒ 87 2 465 01d1 ǒ 67 2 466 01d2 Ǔ 87 2 467 01d3 ǔ 73 2 468 01d4 ǖ 73 2 470 01d6 Ǘ 87 2 471 01d7 ǘ 73 2 472 01d8 Ǚ 87 2 473 01d9 ǚ 73 2 474 01da Ǜ 87 2 475 01db ǜ 73 2 476 01dc ǝ 64 0 477 01dd ǟ 65 2 479 01df Ǣ 103 2 482 01e2 ǣ 98 2 483 01e3 Ǫ 87 3 490 01ea ǫ 67 1 491 01eb Ǭ 87 3 492 01ec ǭ 67 3 493 01ed Ƕ 122 2 502 01f6 Ș 72 3 536 0218 ș 56 1 537 0219 Ț 74 3 538 021a ț 46 3 539 021b Ȥ 73 3 548 0224 ȥ 57 1 549 0225 ȫ 67 2 555 022b ȭ 67 2 557 022d Ȯ 87 2 558 022e ȯ 67 2 559 022f ȱ 67 2 561 0231 Ȳ 71 2 562 0232 ȳ 58 3 563 0233 ȷ 36 1 567 0237 ȸ 103 2 568 0238 ȹ 103 1 569 0239 Ⱥ 78 2 570 023a Ȼ 80 2 571 023b ȼ 61 0 572 023c Ƚ 70 2 573 023d Ⱦ 74 2 574 023e ȿ 56 1 575 023f ɀ 57 1 576 0240 Ɂ 66 2 577 0241 ɐ 65 0 592 0250 ɑ 70 0 593 0251 ɒ 70 0 594 0252 ɓ 70 2 595 0253 ɔ 61 0 596 0254 ɕ 61 1 597 0255 ɖ 70 3 598 0256 ɗ 73 2 599 0257 ɘ 64 0 600 0258 ə 64 0 601 0259 ɚ 91 0 602 025a ɛ 61 0 603 025b ɜ 61 0 604 025c ɝ 91 0 605 025d ɞ 72 0 606 025e ɟ 39 1 607 025f ɠ 70 3 608 0260 ɡ 70 1 609 0261 ɢ 63 0 610 0262 ɣ 71 1 611 0263 ɤ 63 0 612 0264 ɥ 73 1 613 0265 ɦ 73 2 614 0266 ɧ 73 3 615 0267 ɨ 38 2 616 0268 ɩ 38 0 617 0269 ɪ 38 0 618 026a ɫ 41 2 619 026b ɬ 51 2 620 026c ɭ 38 3 621 026d ɮ 80 3 622 026e ɯ 106 0 623 026f ɰ 106 1 624 0270 ɱ 106 1 625 0271 ɲ 73 1 626 0272 ɳ 73 1 627 0273 ɴ 71 0 628 0274 ɵ 67 0 629 0275 ɶ 106 0 630 0276 ɷ 75 0 631 0277 ɸ 67 3 632 0278 ɹ 57 0 633 0279 ɺ 57 2 634 027a ɻ 57 1 635 027b ɼ 53 1 636 027c ɽ 53 1 637 027d ɾ 45 0 638 027e ɿ 49 0 639 027f ʀ 80 0 640 0280 ʁ 80 0 641 0281 ʂ 56 1 642 0282 ʃ 33 3 643 0283 ʄ 43 3 644 0284 ʅ 54 1 645 0285 ʆ 33 3 646 0286 ʇ 49 1 647 0287 ʈ 46 3 648 0288 ʉ 73 0 649 0289 ʊ 68 0 650 028a ʋ 69 0 651 028b ʌ 64 0 652 028c ʍ 91 0 653 028d ʎ 64 2 654 028e ʏ 73 0 655 028f ʐ 57 1 656 0290 ʑ 57 1 657 0291 ʒ 57 1 658 0292 ʓ 57 1 659 0293 ʔ 54 2 660 0294 ʕ 54 2 661 0295 ʖ 54 2 662 0296 ʗ 54 3 663 0297 ʘ 72 0 664 0298 ʙ 73 0 665 0299 ʚ 72 0 666 029a ʛ 63 2 667 029b ʜ 73 0 668 029c ʝ 38 3 669 029d ʞ 74 1 670 029e ʟ 65 0 671 029f ʠ 70 3 672 02a0 ʡ 54 2 673 02a1 ʢ 54 2 674 02a2 ʣ 112 2 675 02a3 ʤ 118 3 676 02a4 ʥ 112 3 677 02a5 ʦ 91 2 678 02a6 ʧ 71 3 679 02a7 ʨ 91 3 680 02a8 ʩ 104 3 681 02a9 ʪ 79 2 682 02aa ʫ 80 2 683 02ab ʬ 66 2 684 02ac ʭ 44 2 685 02ad ʮ 61 3 686 02ae ʯ 72 3 687 02af ʰ 52 2 688 02b0 ʱ 52 2 689 02b1 ʲ 31 2 690 02b2 ʳ 41 2 691 02b3 ʴ 41 2 692 02b4 ʵ 48 2 693 02b5 ʶ 53 2 694 02b6 ʷ 66 0 695 02b7 ʸ 48 0 696 02b8 ʻ 35 2 699 02bb ʼ 35 2 700 02bc ʾ 37 2 702 02be ʿ 37 2 703 02bf ˀ 31 2 704 02c0 ˁ 31 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 28 2 712 02c8 ˌ 28 1 716 02cc ː 37 0 720 02d0 ˑ 37 0 721 02d1 ˒ 37 0 722 02d2 ˓ 37 0 723 02d3 ˖ 39 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 42 0 734 02de ˠ 46 2 736 02e0 ˡ 29 2 737 02e1 ˢ 39 2 738 02e2 ˣ 48 2 739 02e3 ˤ 31 2 740 02e4 ˥ 48 2 741 02e5 ˦ 48 2 742 02e6 ˧ 48 2 743 02e7 ˨ 48 2 744 02e8 ˩ 48 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 30 2 884 0374 ͵ 30 1 885 0375 ͺ 50 1 890 037a ; 37 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 78 2 902 0386 · 35 0 903 0387 Έ 95 2 904 0388 Ή 112 2 905 0389 Ί 66 2 906 038a Ό 89 2 908 038c Ύ 95 2 910 038e Ώ 91 2 911 038f ΐ 48 2 912 0390 Α 78 2 913 0391 Β 85 2 914 0392 Γ 71 2 915 0393 Δ 78 2 916 0394 Ε 76 2 917 0395 Ζ 73 2 918 0396 Η 94 2 919 0397 Θ 87 2 920 0398 Ι 47 2 921 0399 Κ 87 2 922 039a Λ 78 2 923 039b Μ 111 2 924 039c Ν 91 2 925 039d Ξ 70 2 926 039e Ο 87 2 927 039f Π 94 2 928 03a0 Ρ 75 2 929 03a1 Σ 71 2 931 03a3 Τ 74 2 932 03a4 Υ 71 2 933 03a5 Φ 87 2 934 03a6 Χ 78 2 935 03a7 Ψ 91 2 936 03a8 Ω 89 2 937 03a9 Ϊ 47 2 938 03aa Ϋ 71 2 939 03ab ά 77 2 940 03ac έ 61 2 941 03ad ή 73 3 942 03ae ί 48 2 943 03af ΰ 69 2 944 03b0 α 77 0 945 03b1 β 66 3 946 03b2 γ 66 1 947 03b3 δ 67 2 948 03b4 ε 61 0 949 03b5 ζ 59 3 950 03b6 η 73 1 951 03b7 θ 67 2 952 03b8 ι 48 0 953 03b9 κ 75 0 954 03ba λ 70 2 955 03bb μ 73 1 956 03bc ν 69 0 957 03bd ξ 59 3 958 03be ο 67 0 959 03bf π 73 0 960 03c0 ρ 67 1 961 03c1 ς 61 1 962 03c2 σ 74 0 963 03c3 τ 67 0 964 03c4 υ 69 0 965 03c5 φ 90 1 966 03c6 χ 66 1 967 03c7 ψ 94 1 968 03c8 ω 95 0 969 03c9 ϊ 48 2 970 03ca ϋ 69 2 971 03cb ό 67 2 972 03cc ύ 69 2 973 03cd ώ 95 2 974 03ce ϐ 67 2 976 03d0 ϑ 85 2 977 03d1 ϒ 76 2 978 03d2 ϓ 97 2 979 03d3 ϔ 76 2 980 03d4 ϕ 94 3 981 03d5 ϖ 95 0 982 03d6 ϗ 65 1 983 03d7 Ϙ 87 3 984 03d8 ϙ 67 1 985 03d9 Ϛ 80 3 986 03da ϛ 61 3 987 03db Ϝ 71 2 988 03dc ϝ 53 3 989 03dd Ϟ 59 2 990 03de ϟ 66 2 991 03df Ϡ 80 3 992 03e0 ϡ 67 1 993 03e1 ϰ 65 0 1008 03f0 ϱ 67 1 1009 03f1 ϲ 61 0 1010 03f2 ϳ 36 3 1011 03f3 ϴ 87 2 1012 03f4 ϵ 61 0 1013 03f5 ϶ 61 0 1014 03f6 Ϸ 76 2 1015 03f7 ϸ 70 3 1016 03f8 Ϲ 80 2 1017 03f9 Ϻ 111 2 1018 03fa ϻ 86 1 1019 03fb ϼ 69 1 1020 03fc Ͻ 80 2 1021 03fd Ͼ 80 2 1022 03fe Ͽ 80 2 1023 03ff Ё 76 2 1025 0401 Ђ 90 3 1026 0402 Ѓ 71 2 1027 0403 Є 80 2 1028 0404 Ѕ 72 2 1029 0405 І 47 2 1030 0406 Ї 47 2 1031 0407 Ј 47 3 1032 0408 Љ 126 2 1033 0409 Њ 126 2 1034 040a Ћ 96 2 1035 040b Ќ 87 2 1036 040c Ѝ 94 2 1037 040d Ў 81 2 1038 040e Џ 94 3 1039 040f А 78 2 1040 0410 Б 85 2 1041 0411 В 85 2 1042 0412 Г 71 2 1043 0413 Д 94 3 1044 0414 Е 76 2 1045 0415 Ж 132 2 1046 0416 З 70 2 1047 0417 И 94 2 1048 0418 Й 94 2 1049 0419 К 87 2 1050 041a Л 94 2 1051 041b М 111 2 1052 041c Н 94 2 1053 041d О 87 2 1054 041e П 94 2 1055 041f Р 75 2 1056 0420 С 80 2 1057 0421 Т 74 2 1058 0422 У 81 2 1059 0423 Ф 105 3 1060 0424 Х 78 2 1061 0425 Ц 94 3 1062 0426 Ч 91 2 1063 0427 Ш 112 2 1064 0428 Щ 113 3 1065 0429 Ъ 88 2 1066 042a Ы 119 2 1067 042b Ь 79 2 1068 042c Э 80 2 1069 042d Ю 129 2 1070 042e Я 83 2 1071 042f а 65 0 1072 0430 б 67 2 1073 0431 в 73 0 1074 0432 г 64 0 1075 0433 д 87 1 1076 0434 е 64 0 1077 0435 ж 106 0 1078 0436 з 61 0 1079 0437 и 73 0 1080 0438 й 73 2 1081 0439 к 69 0 1082 043a л 73 0 1083 043b м 106 0 1084 043c н 73 0 1085 043d о 67 0 1086 043e п 73 0 1087 043f р 70 1 1088 0440 с 61 0 1089 0441 т 62 0 1090 0442 у 58 1 1091 0443 ф 82 3 1092 0444 х 60 0 1093 0445 ц 73 1 1094 0446 ч 73 0 1095 0447 ш 100 0 1096 0448 щ 102 1 1097 0449 ъ 69 0 1098 044a ы 100 0 1099 044b ь 66 0 1100 044c э 61 0 1101 044d ю 103 0 1102 044e я 80 0 1103 044f ѐ 64 2 1104 0450 ё 64 2 1105 0451 ђ 70 3 1106 0452 ѓ 64 2 1107 0453 є 61 0 1108 0454 ѕ 56 0 1109 0455 і 38 2 1110 0456 ї 38 2 1111 0457 ј 36 3 1112 0458 љ 100 0 1113 0459 њ 99 0 1114 045a ћ 73 2 1115 045b ќ 69 2 1116 045c ѝ 73 2 1117 045d ў 58 3 1118 045e џ 73 1 1119 045f Ґ 71 2 1168 0490 ґ 64 2 1169 0491 Ғ 71 2 1170 0492 ғ 64 0 1171 0493 Қ 87 3 1178 049a қ 69 1 1179 049b Ҳ 78 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 78 2 1232 04d0 ӑ 65 2 1233 04d1 Ӓ 78 2 1234 04d2 ӓ 65 2 1235 04d3 Ӕ 103 2 1236 04d4 ӕ 98 0 1237 04d5 Ӗ 76 2 1238 04d6 ӗ 64 2 1239 04d7 Ӡ 57 2 1248 04e0 ӡ 57 1 1249 04e1 Ӧ 87 2 1254 04e6 ӧ 67 2 1255 04e7 Ө 87 2 1256 04e8 ө 67 0 1257 04e9 Ӫ 87 2 1258 04ea ӫ 67 2 1259 04eb ᴂ 94 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 32 1 7433 1d09 ᴔ 99 0 7444 1d14 ᴖ 67 0 7446 1d16 ᴗ 67 0 7447 1d17 ᴝ 74 2 7453 1d1d ᴞ 95 2 7454 1d1e ᴟ 95 3 7455 1d1f ᵃ 47 2 7491 1d43 ᵄ 47 2 7492 1d44 ᵅ 50 2 7493 1d45 ᵆ 66 2 7494 1d46 ᵇ 50 2 7495 1d47 ᵈ 50 2 7496 1d48 ᵉ 44 2 7497 1d49 ᵊ 44 2 7498 1d4a ᵋ 41 2 7499 1d4b ᵌ 41 2 7500 1d4c ᵍ 50 2 7501 1d4d ᵎ 30 2 7502 1d4e ᵏ 52 2 7503 1d4f ᵐ 73 2 7504 1d50 ᵑ 47 2 7505 1d51 ᵒ 47 2 7506 1d52 ᵓ 43 2 7507 1d53 ᵔ 47 2 7508 1d54 ᵕ 47 0 7509 1d55 ᵖ 50 2 7510 1d56 ᵗ 37 2 7511 1d57 ᵘ 52 2 7512 1d58 ᵙ 43 2 7513 1d59 ᵚ 73 2 7514 1d5a ᵛ 49 2 7515 1d5b ᵷ 64 1 7543 1d77 ᵻ 38 0 7547 1d7b ᶅ 38 3 7557 1d85 ᶛ 50 2 7579 1d9b ᶜ 43 2 7580 1d9c ᶝ 43 2 7581 1d9d ᶞ 47 2 7582 1d9e ᶟ 41 2 7583 1d9f ᶠ 38 2 7584 1da0 ᶡ 37 2 7585 1da1 ᶢ 50 2 7586 1da2 ᶣ 52 2 7587 1da3 ᶤ 30 2 7588 1da4 ᶥ 31 2 7589 1da5 ᶦ 30 2 7590 1da6 ᶧ 30 2 7591 1da7 ᶨ 37 2 7592 1da8 ᶩ 37 2 7593 1da9 ᶪ 32 2 7594 1daa ᶫ 43 2 7595 1dab ᶬ 68 2 7596 1dac ᶭ 73 2 7597 1dad ᶮ 59 2 7598 1dae ᶯ 59 2 7599 1daf ᶰ 47 2 7600 1db0 ᶱ 47 2 7601 1db1 ᶲ 52 2 7602 1db2 ᶳ 40 2 7603 1db3 ᶴ 39 2 7604 1db4 ᶵ 37 2 7605 1db5 ᶶ 52 2 7606 1db6 ᶷ 48 2 7607 1db7 ᶹ 49 2 7609 1db9 ᶺ 49 2 7610 1dba ᶻ 41 2 7611 1dbb ᶼ 53 2 7612 1dbc ᶽ 41 2 7613 1dbd ᶾ 45 2 7614 1dbe ᶿ 47 2 7615 1dbf Ḍ 87 3 7692 1e0c ḍ 70 3 7693 1e0d Ḓ 87 3 7698 1e12 ḓ 70 3 7699 1e13 Ḥ 94 3 7716 1e24 ḥ 73 3 7717 1e25 Ḷ 70 3 7734 1e36 ḷ 38 3 7735 1e37 Ḹ 70 3 7736 1e38 ḹ 38 3 7737 1e39 Ḽ 70 3 7740 1e3c ḽ 38 3 7741 1e3d ṁ 106 2 7745 1e41 Ṃ 111 3 7746 1e42 ṃ 106 1 7747 1e43 Ṅ 91 2 7748 1e44 ṅ 73 2 7749 1e45 Ṇ 91 3 7750 1e46 ṇ 73 1 7751 1e47 Ṋ 91 3 7754 1e4a ṋ 73 1 7755 1e4b ṗ 70 3 7767 1e57 Ṛ 83 3 7770 1e5a ṛ 53 1 7771 1e5b Ṝ 83 3 7772 1e5c ṝ 53 3 7773 1e5d ṡ 56 2 7777 1e61 Ṣ 72 3 7778 1e62 ṣ 56 1 7779 1e63 Ṭ 74 3 7788 1e6c ṭ 46 3 7789 1e6d Ṱ 74 3 7792 1e70 ṱ 46 3 7793 1e71 Ṿ 78 3 7806 1e7e ṿ 58 1 7807 1e7f Ẁ 112 2 7808 1e80 ẁ 86 2 7809 1e81 Ẃ 112 2 7810 1e82 ẃ 86 2 7811 1e83 Ẅ 112 2 7812 1e84 ẅ 86 2 7813 1e85 Ẹ 76 3 7864 1eb8 ẹ 64 1 7865 1eb9 Ị 47 3 7882 1eca ị 38 3 7883 1ecb Ọ 87 3 7884 1ecc ọ 67 1 7885 1ecd Ụ 87 3 7908 1ee4 ụ 73 1 7909 1ee5 Ỳ 71 2 7922 1ef2 ỳ 58 3 7923 1ef3 ἁ 77 2 7937 1f01 ἂ 77 2 7938 1f02 ἃ 77 2 7939 1f03 ἄ 77 2 7940 1f04 ἅ 77 2 7941 1f05 ἆ 77 2 7942 1f06 ἇ 77 2 7943 1f07 Ἀ 78 2 7944 1f08 Ἁ 78 2 7945 1f09 Ἂ 98 2 7946 1f0a Ἃ 98 2 7947 1f0b Ἄ 83 2 7948 1f0c Ἅ 85 2 7949 1f0d Ἆ 78 2 7950 1f0e Ἇ 78 2 7951 1f0f ἐ 61 2 7952 1f10 ἑ 61 2 7953 1f11 ἒ 61 2 7954 1f12 ἓ 61 2 7955 1f13 ἔ 61 2 7956 1f14 ἕ 61 2 7957 1f15 Ἐ 92 2 7960 1f18 Ἑ 91 2 7961 1f19 Ἒ 117 2 7962 1f1a Ἓ 117 2 7963 1f1b Ἔ 109 2 7964 1f1c Ἕ 112 2 7965 1f1d ἠ 73 3 7968 1f20 ἡ 73 3 7969 1f21 ἢ 73 3 7970 1f22 ἣ 73 3 7971 1f23 ἤ 73 3 7972 1f24 ἥ 73 3 7973 1f25 ἦ 73 3 7974 1f26 ἧ 73 3 7975 1f27 Ἠ 110 2 7976 1f28 Ἡ 109 2 7977 1f29 Ἢ 136 2 7978 1f2a Ἣ 136 2 7979 1f2b Ἤ 128 2 7980 1f2c Ἥ 131 2 7981 1f2d Ἦ 120 2 7982 1f2e Ἧ 119 2 7983 1f2f ἰ 48 2 7984 1f30 ἱ 48 2 7985 1f31 ἲ 48 2 7986 1f32 ἳ 48 2 7987 1f33 ἴ 48 2 7988 1f34 ἵ 48 2 7989 1f35 ἶ 48 2 7990 1f36 ἷ 48 2 7991 1f37 Ἰ 63 2 7992 1f38 Ἱ 62 2 7993 1f39 Ἲ 88 2 7994 1f3a Ἳ 88 2 7995 1f3b Ἴ 80 2 7996 1f3c Ἵ 83 2 7997 1f3d Ἶ 72 2 7998 1f3e Ἷ 71 2 7999 1f3f ὀ 67 2 8000 1f40 ὁ 67 2 8001 1f41 ὂ 67 2 8002 1f42 ὃ 67 2 8003 1f43 ὄ 67 2 8004 1f44 ὅ 67 2 8005 1f45 Ὀ 90 2 8008 1f48 Ὁ 93 2 8009 1f49 Ὂ 124 2 8010 1f4a Ὃ 124 2 8011 1f4b Ὄ 103 2 8012 1f4c Ὅ 107 2 8013 1f4d ὐ 69 2 8016 1f50 ὑ 69 2 8017 1f51 ὒ 69 2 8018 1f52 ὓ 69 2 8019 1f53 ὔ 69 2 8020 1f54 ὕ 69 2 8021 1f55 ὖ 69 2 8022 1f56 ὗ 69 2 8023 1f57 Ὑ 92 2 8025 1f59 Ὓ 119 2 8027 1f5b Ὕ 113 2 8029 1f5d Ὗ 102 2 8031 1f5f ὠ 95 2 8032 1f60 ὡ 95 2 8033 1f61 ὢ 95 2 8034 1f62 ὣ 95 2 8035 1f63 ὤ 95 2 8036 1f64 ὥ 95 2 8037 1f65 ὦ 95 2 8038 1f66 ὧ 95 2 8039 1f67 Ὠ 93 2 8040 1f68 Ὡ 96 2 8041 1f69 Ὢ 127 2 8042 1f6a Ὣ 127 2 8043 1f6b Ὤ 105 2 8044 1f6c Ὥ 109 2 8045 1f6d Ὦ 102 2 8046 1f6e Ὧ 106 2 8047 1f6f ὰ 77 2 8048 1f70 ά 77 2 8049 1f71 ὲ 61 2 8050 1f72 έ 61 2 8051 1f73 ὴ 73 3 8052 1f74 ή 73 3 8053 1f75 ὶ 48 2 8054 1f76 ί 48 2 8055 1f77 ὸ 67 2 8056 1f78 ό 67 2 8057 1f79 ὺ 69 2 8058 1f7a ύ 69 2 8059 1f7b ὼ 95 2 8060 1f7c ώ 95 2 8061 1f7d ᾀ 77 3 8064 1f80 ᾁ 77 3 8065 1f81 ᾂ 77 3 8066 1f82 ᾃ 77 3 8067 1f83 ᾄ 77 3 8068 1f84 ᾅ 77 3 8069 1f85 ᾆ 77 3 8070 1f86 ᾇ 77 3 8071 1f87 ᾈ 78 3 8072 1f88 ᾉ 78 3 8073 1f89 ᾊ 98 3 8074 1f8a ᾋ 98 3 8075 1f8b ᾌ 83 3 8076 1f8c ᾍ 85 3 8077 1f8d ᾎ 78 3 8078 1f8e ᾏ 78 3 8079 1f8f ᾐ 73 3 8080 1f90 ᾑ 73 3 8081 1f91 ᾒ 73 3 8082 1f92 ᾓ 73 3 8083 1f93 ᾔ 73 3 8084 1f94 ᾕ 73 3 8085 1f95 ᾖ 73 3 8086 1f96 ᾗ 73 3 8087 1f97 ᾘ 110 3 8088 1f98 ᾙ 109 3 8089 1f99 ᾚ 136 3 8090 1f9a ᾛ 136 3 8091 1f9b ᾜ 128 3 8092 1f9c ᾝ 131 3 8093 1f9d ᾞ 120 3 8094 1f9e ᾟ 119 3 8095 1f9f ᾠ 95 3 8096 1fa0 ᾡ 95 3 8097 1fa1 ᾢ 95 3 8098 1fa2 ᾣ 95 3 8099 1fa3 ᾤ 95 3 8100 1fa4 ᾥ 95 3 8101 1fa5 ᾦ 95 3 8102 1fa6 ᾧ 95 3 8103 1fa7 ᾨ 93 3 8104 1fa8 ᾩ 96 3 8105 1fa9 ᾪ 127 3 8106 1faa ᾫ 127 3 8107 1fab ᾬ 105 3 8108 1fac ᾭ 109 3 8109 1fad ᾮ 102 3 8110 1fae ᾯ 106 3 8111 1faf ᾰ 77 2 8112 1fb0 ᾱ 77 2 8113 1fb1 ᾲ 77 3 8114 1fb2 ᾳ 77 1 8115 1fb3 ᾴ 77 3 8116 1fb4 ᾶ 77 2 8118 1fb6 ᾷ 77 3 8119 1fb7 Ᾰ 78 2 8120 1fb8 Ᾱ 78 2 8121 1fb9 Ὰ 81 2 8122 1fba Ά 78 2 8123 1fbb ᾼ 78 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 73 3 8130 1fc2 ῃ 73 1 8131 1fc3 ῄ 73 3 8132 1fc4 ῆ 73 3 8134 1fc6 ῇ 73 3 8135 1fc7 Ὲ 100 2 8136 1fc8 Έ 95 2 8137 1fc9 Ὴ 119 2 8138 1fca Ή 112 2 8139 1fcb ῌ 94 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 48 2 8144 1fd0 ῑ 48 2 8145 1fd1 ῒ 48 2 8146 1fd2 ΐ 48 2 8147 1fd3 ῖ 48 2 8150 1fd6 ῗ 48 2 8151 1fd7 Ῐ 47 2 8152 1fd8 Ῑ 47 2 8153 1fd9 Ὶ 71 2 8154 1fda Ί 66 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 69 2 8160 1fe0 ῡ 69 2 8161 1fe1 ῢ 69 2 8162 1fe2 ΰ 69 2 8163 1fe3 ῤ 67 3 8164 1fe4 ῥ 67 3 8165 1fe5 ῦ 69 2 8166 1fe6 ῧ 69 2 8167 1fe7 Ῠ 71 2 8168 1fe8 Ῡ 71 2 8169 1fe9 Ὺ 102 2 8170 1fea Ύ 95 2 8171 1feb Ῥ 91 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 95 3 8178 1ff2 ῳ 95 1 8179 1ff3 ῴ 95 3 8180 1ff4 ῶ 95 2 8182 1ff6 ῷ 95 3 8183 1ff7 Ὸ 107 2 8184 1ff8 Ό 89 2 8185 1ff9 Ὼ 110 2 8186 1ffa Ώ 91 2 8187 1ffb ῼ 89 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 42 0 8208 2010 ‑ 42 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 35 2 8216 2018 ` " ‘ " ’ 35 2 8217 2019 ' " ’ " ‚ 35 1 8218 201a ‛ 35 2 8219 201b “ 58 2 8220 201c ” 58 2 8221 201d „ 58 1 8222 201e ‟ 58 2 8223 201f † 52 3 8224 2020 ‡ 52 3 8225 2021 • 64 0 8226 2022 ‣ 64 0 8227 2023 … 100 0 8230 2026 ‰ 138 2 8240 2030 ‱ 182 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 63 2 8252 203c ‾ 50 2 8254 203e ⁇ 108 2 8263 2047 ⁈ 86 2 8264 2048 ⁉ 86 2 8265 2049 ⁰ 44 2 8304 2070 ⁴ 44 2 8308 2074 ⁵ 44 2 8309 2075 ⁶ 44 2 8310 2076 ⁷ 44 2 8311 2077 ⁸ 44 2 8312 2078 ⁹ 44 2 8313 2079 ⁿ 52 2 8319 207f ₦ 70 2 8358 20a6 € 70 2 8364 20ac ₵ 70 3 8373 20b5 № 137 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 89 2 8486 2126 K 87 2 8490 212a Å 78 2 8491 212b ∂ 53 2 8706 2202 pd " ∆ 75 2 8710 2206 ∇ 75 2 8711 2207 gr " ∏ 84 3 8719 220f ∑ 75 3 8721 2211 − 84 0 8722 2212 ∕ 17 2 8725 2215 ∙ 35 0 8729 2219 bu " √ 66 2 8730 221a sr " ∝ 67 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 81 0 8743 2227 l∧ 81 0 8743 2227 " ∨ 81 0 8744 2228 l| " ∩ 81 0 8745 2229 ca " ∪ 81 0 8746 222a cu " ∫ 58 3 8747 222b is " ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 83 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 54 2 8977 2311 ⌘ 93 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 58 3 8992 2320 ⌡ 58 3 8993 2321 ⌥ 100 2 8997 2325 ⍽ 101 1 9085 237d ⎮ 58 3 9134 23ae ⏏ 77 0 9167 23cf ␣ 83 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 64 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 64 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⟠ 49 3 10208 27e0 ⧫ 49 3 10731 29eb ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 73 2 64257 fb01 fl 73 2 64258 fb02 � 111 3 65533 fffd 9base-6/troff/font/devutf/KX0000644000175000017500000000534211402154555015402 0ustar anselmanselmname KX fontname Bookman-DemiItalic named in prologue spacewidth 34 charset ! 32 2 33 " 38 2 34 dq " # 60 2 35 $ 68 3 36 % 88 2 37 & 98 2 38 ' 32 2 39 ( 26 3 40 ) 26 3 41 * 46 2 42 + 60 0 43 , 34 1 44 - 28 0 173 . 34 0 46 / 36 2 47 0 68 2 48 1 68 2 49 2 68 2 50 3 68 2 51 4 68 2 52 5 68 2 53 6 68 2 54 7 68 2 55 8 68 2 56 9 68 2 57 : 34 0 58 ; 34 1 59 --- 62 0 60 = 60 0 61 --- 62 0 62 ? 62 2 63 @ 78 2 64 A 72 2 65 B 72 2 66 C 70 2 67 D 76 2 68 E 72 2 69 F 66 2 70 G 76 2 71 H 80 2 72 I 38 2 73 J 62 2 74 K 78 2 75 L 64 2 76 M 86 2 77 N 74 2 78 O 76 2 79 P 64 2 80 Q 76 3 81 R 74 2 82 S 70 2 83 T 70 2 84 U 74 2 85 V 66 2 86 W 100 2 87 X 74 2 88 Y 66 2 89 Z 68 2 90 [ 26 3 91 \ 58 2 92 bs " ] 26 3 93 ^ 48 2 147 --- 62 2 94 --- 50 1 95 ` 32 2 96 a 68 0 97 b 60 2 98 c 56 0 99 d 68 2 100 e 56 0 101 f 42 3 102 g 62 1 103 h 70 2 104 i 38 2 105 j 32 3 106 k 70 2 107 l 38 2 108 m 96 0 109 n 68 0 110 o 60 0 111 p 66 1 112 q 62 1 113 r 50 0 114 s 54 0 115 t 44 2 116 u 68 0 117 v 54 0 118 w 86 0 119 x 62 0 120 y 60 1 121 z 56 0 122 { 30 3 123 --- 62 2 124 } 30 3 125 ~ 48 2 148 --- 62 0 126 \` 38 2 145 ga " !! 32 1 161 ¡ " c| 68 2 162 ct " ¢ " L- 68 2 163 £ " ps " xo 68 2 164 ¤ " cr " Y- 68 2 165 ¥ " yn " || 62 2 166 ¦ " so 62 3 167 sc " § " "" 52 2 168 ¨ " :a " co 78 2 169 © " a_ 44 2 170 ª " << 38 0 171 « " -, 62 0 172 hy 28 0 173 -- 60 0 45 ­ " ro 78 2 174 rg " ® " -^ 48 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 0 177 ± " 2^ 41 2 178 ² " 3^ 41 2 179 ³ " \' 34 2 180 aa " ´ " /u 68 1 181 µ " P! 68 3 182 pg " ¶ " .^ 34 0 183 · " ,, 36 1 184 ¸ " ,a " 1^ 41 2 185 ¹ " o_ 44 2 186 º " >> 38 0 187 » " 14 102 2 188 ¼ " 12 102 2 189 ½ " 34 102 2 190 ¾ " ?? 62 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 114 2 198 Æ " C, 70 3 199 Ç " E` 72 2 200 È " E' 72 2 201 É " E^ 72 2 202 Ê " E" 72 2 203 Ë " I` 38 2 204 Ì " I' 38 2 205 Í " I^ 38 2 206 Î " I" 38 2 207 Ï " D- 76 2 208 Ð " N~ 74 2 209 Ñ " O` 76 2 210 Ò " O' 76 2 211 Ó " O^ 76 2 212 Ô " O~ 76 2 213 Õ " O" 76 2 214 Ö " xx 60 0 215 × " O/ 76 2 216 Ø " U` 74 2 217 Ù " U' 74 2 218 Ú " U^ 74 2 219 Û " U" 74 2 220 Ü " Y' 66 2 221 Ý " TH 64 2 222 Þ " ss 66 3 223 ß " a` 68 2 224 à " a' 68 2 225 á " a^ 68 2 226 â " a~ 68 2 227 ã " a" 68 2 228 ä " a* 68 2 229 å " ae 88 0 230 æ " c, 56 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 38 2 236 ì " i' 38 2 237 í " i^ 38 2 238 î " i" 38 2 239 ï " d- 60 2 240 ð " n~ 68 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 0 247 ÷ " o/ 60 2 248 ø " u` 68 2 249 ù " u' 68 2 250 ú " u^ 68 2 251 û " u" 68 2 252 ü " y' 60 3 253 ý " th 66 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/HK0000644000175000017500000000532011402154555015356 0ustar anselmanselmname HK fontname Helvetica-LightOblique spacewidth 28 charset ! 33 2 33 " 28 2 34 dq " # 56 2 35 $ 56 2 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 66 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 66 0 60 = 66 0 61 --- 66 0 62 ? 50 2 63 @ 80 2 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 2 81 R 67 2 82 S 61 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 89 2 87 X 61 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 66 2 94 --- 50 1 95 ` 22 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 28 2 102 g 61 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 22 2 124 } 33 3 125 ~ 33 2 148 --- 66 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 0 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 22 2 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 80 2 169 © " a_ 33 2 170 ª " << 56 0 171 « " -, 66 0 172 hy 33 0 173 -- 66 0 45 ­ " ro 80 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 66 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 65 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 33 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 50 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 66 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 61 2 221 Ý " TH 61 2 222 Þ " ss 50 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 56 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 22 2 236 ì " i' 22 2 237 í " i^ 22 2 238 î " i" 22 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 66 0 247 ÷ " o/ 56 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 61 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/AB0000644000175000017500000000533311402154555015342 0ustar anselmanselmname AB fontname AvantGarde-Demi named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 - 42 0 173 . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 ^ 54 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 ~ 48 2 148 --- 60 0 126 \` 42 2 145 ga " !! 28 1 161 ¡ " c| 56 2 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 60 2 166 ¦ " so 56 3 167 sc " § " "" 50 2 168 ¨ " :a " co 74 2 169 © " a_ 36 2 170 ª " << 46 0 171 « " -, 60 0 172 hy 42 0 173 -- 60 0 45 ­ " ro 74 2 174 rg " ® " -^ 42 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 0 177 ± " 2^ 34 2 178 ² " 3^ 34 2 179 ³ " \' 42 2 180 aa " ´ " /u 58 1 181 µ " P! 60 3 182 pg " ¶ " .^ 28 0 183 · " ,, 34 1 184 ¸ " ,a " 1^ 34 2 185 ¹ " o_ 36 2 186 º " >> 46 0 187 » " 14 84 2 188 ¼ " 12 84 2 189 ½ " 34 84 2 190 ¾ " ?? 56 1 191 ¿ " A` 74 2 192 À " A' 74 2 193 Á " A^ 74 2 194  " A~ 74 2 195 à " A" 74 2 196 Ä " A* 74 2 197 Å " AE 90 2 198 Æ " C, 78 3 199 Ç " E` 52 2 200 È " E' 52 2 201 É " E^ 52 2 202 Ê " E" 52 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 74 2 208 Ð " N~ 74 2 209 Ñ " O` 84 2 210 Ò " O' 84 2 211 Ó " O^ 84 2 212 Ô " O~ 84 2 213 Õ " O" 84 2 214 Ö " xx 60 0 215 × " O/ 84 2 216 Ø " U` 64 2 217 Ù " U' 64 2 218 Ú " U^ 64 2 219 Û " U" 64 2 220 Ü " Y' 62 2 221 Ý " TH 56 2 222 Þ " ss 60 2 223 ß " a` 66 2 224 à " a' 66 2 225 á " a^ 66 2 226 â " a~ 66 2 227 ã " a" 66 2 228 ä " a* 66 2 229 å " ae 108 0 230 æ " c, 64 1 231 ç " e` 64 2 232 è " e' 64 2 233 é " e^ 64 2 234 ê " e" 64 2 235 ë " i` 24 2 236 ì " i' 24 2 237 í " i^ 24 2 238 î " i" 24 2 239 ï " d- 64 2 240 ð " n~ 60 2 241 ñ " o` 64 2 242 ò " o' 64 2 243 ó " o^ 64 2 244 ô " o~ 64 2 245 õ " o" 64 2 246 ö " -: 60 0 247 ÷ " o/ 66 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 58 3 253 ý " th 66 3 254 þ " y" 58 3 255 ÿ " 9base-6/troff/font/devutf/Jp0000644000175000017500000000011311402154555015420 0ustar anselmanselm# fake japanese name Jp spacewidth 1 defaultwidth 105 charset hy 0 0 0 " - 9base-6/troff/font/devutf/PA0000644000175000017500000007506611402154555015372 0ustar anselmanselmname PA fontname Palatino-Roman named in prologue spacewidth 25 charset ! 28 2 33 " 37 2 34 dq " # 50 2 35 $ 50 2 36 % 84 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 61 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 61 2 66 C 71 2 67 D 77 2 68 E 61 2 69 F 56 2 70 G 76 2 71 H 83 2 72 I 34 2 73 J 33 3 74 K 73 2 75 L 61 2 76 M 95 2 77 N 83 2 78 O 79 2 79 P 60 2 80 Q 79 3 81 R 67 2 82 S 53 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 55 2 98 c 44 0 99 d 61 2 100 e 48 0 101 f 33 2 102 g 56 1 103 h 58 2 104 i 29 2 105 j 23 3 106 k 56 2 107 l 29 2 108 m 88 0 109 n 58 0 110 o 55 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 42 0 115 t 33 2 116 u 60 0 117 v 57 0 118 w 83 0 119 x 52 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 28 1 161 ¡ " c| 50 2 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 33 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 60 1 181 µ " P! 63 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 33 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 44 1 191 ¿ " A` 78 2 192 À " A' 78 2 193 Á " A^ 78 2 194  " A~ 78 2 195 à " A" 78 2 196 Ä " A* 78 2 197 Å " AE 94 2 198 Æ " C, 71 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 34 2 204 Ì " I' 34 2 205 Í " I^ 34 2 206 Î " I" 34 2 207 Ï " D- 77 2 208 Ð " N~ 83 2 209 Ñ " O` 79 2 210 Ò " O' 79 2 211 Ó " O^ 79 2 212 Ô " O~ 79 2 213 Õ " O" 79 2 214 Ö " xx 61 0 215 × " O/ 83 2 216 Ø " U` 78 2 217 Ù " U' 78 2 218 Ú " U^ 78 2 219 Û " U" 78 2 220 Ü " Y' 67 2 221 Ý " TH 60 2 222 Þ " ss 56 2 223 ß " a` 50 2 224 à " a' 50 2 225 á " a^ 50 2 226 â " a~ 50 2 227 ã " a" 50 2 228 ä " a* 50 2 229 å " ae 76 0 230 æ " c, 44 1 231 ç " e` 48 2 232 è " e' 48 2 233 é " e^ 48 2 234 ê " e" 48 2 235 ë " i` 29 2 236 ì " i' 29 2 237 í " i^ 29 2 238 î " i" 29 2 239 ï " d- 55 2 240 ð " n~ 58 2 241 ñ " o` 55 2 242 ò " o' 55 2 243 ó " o^ 55 2 244 ô " o~ 55 2 245 õ " o" 55 2 246 ö " -: 61 0 247 ÷ " o/ 56 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 56 3 253 ý " th 60 3 254 þ " y" 56 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/LuxiSans0000644000175000017500000001430111402154555016621 0ustar anselmanselmname LuxiSans fontname LuxiSans spacewidth 28 charset ! 28 2 33 0021 " 35 2 34 0022 dq " dq " # 56 2 35 0023 $ 56 3 36 0024 % 89 2 37 0025 & 67 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 39 2 42 002a + 58 0 43 002b , 28 1 44 002c - 33 0 45 002d . 28 0 46 002e / 28 3 47 002f 0 56 2 48 0030 1 56 2 49 0031 2 56 2 50 0032 3 56 2 51 0033 4 56 2 52 0034 5 56 2 53 0035 6 56 2 54 0036 7 56 2 55 0037 8 56 2 56 0038 9 56 2 57 0039 : 28 0 58 003a ; 28 1 59 003b < 58 0 60 003c = 58 0 61 003d > 58 0 62 003e ? 56 2 63 003f @ 102 2 64 0040 A 67 2 65 0041 B 67 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 72 2 72 0048 I 28 2 73 0049 J 50 3 74 004a K 67 2 75 004b L 56 2 76 004c M 83 2 77 004d N 72 2 78 004e O 78 2 79 004f P 67 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 67 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 67 2 86 0056 W 94 2 87 0057 X 67 2 88 0058 Y 67 2 89 0059 Z 61 2 90 005a [ 28 3 91 005b \ 28 3 92 005c bs " ] 28 3 93 005d ^ 47 2 94 005e _ 56 1 95 005f a 56 0 97 0061 b 56 2 98 0062 c 50 0 99 0063 d 56 2 100 0064 e 56 0 101 0065 f 28 2 102 0066 g 56 1 103 0067 h 56 2 104 0068 i 22 2 105 0069 j 22 3 106 006a k 50 2 107 006b l 22 2 108 006c m 83 0 109 006d n 56 0 110 006e o 56 0 111 006f p 56 1 112 0070 q 56 1 113 0071 r 33 0 114 0072 s 50 0 115 0073 t 28 2 116 0074 u 56 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 50 0 122 007a { 33 3 123 007b | 26 3 124 007c } 33 3 125 007d ~ 58 0 126 007e € 56 2 128 0080   28 0 160 00a0 ¡ 33 1 161 00a1 ¢ 56 2 162 00a2 £ 56 2 163 00a3 ¤ 56 0 164 00a4 ¥ 56 2 165 00a5 ¦ 26 3 166 00a6 § 56 3 167 00a7 ¨ 33 2 168 00a8 © 74 2 169 00a9 ª 37 2 170 00aa « 56 0 171 00ab ¬ 58 0 172 00ac ­ 33 0 173 00ad hy " ® 74 2 174 00ae rg " ¯ 56 2 175 00af ° 40 2 176 00b0 ± 58 0 177 00b1 +- " ² 33 2 178 00b2 ³ 33 2 179 00b3 ´ 33 2 180 00b4 aa " µ 56 1 181 00b5 ¶ 54 3 182 00b6 · 28 0 183 00b7 ¸ 33 1 184 00b8 ¹ 33 2 185 00b9 º 37 2 186 00ba » 56 0 187 00bb ¼ 83 2 188 00bc ½ 83 2 189 00bd ¾ 83 2 190 00be ¿ 61 1 191 00bf À 67 2 192 00c0 Á 67 2 193 00c1  67 2 194 00c2 à 67 2 195 00c3 Ä 67 2 196 00c4 Å 67 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 28 2 204 00cc Í 28 2 205 00cd Î 28 2 206 00ce Ï 28 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 58 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 67 2 221 00dd Þ 67 2 222 00de ß 61 2 223 00df à 56 2 224 00e0 á 56 2 225 00e1 â 56 2 226 00e2 ã 56 2 227 00e3 ä 56 2 228 00e4 å 56 2 229 00e5 æ 89 0 230 00e6 ç 50 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 22 2 236 00ec í 22 2 237 00ed î 22 2 238 00ee ï 22 2 239 00ef ð 56 2 240 00f0 ñ 56 2 241 00f1 ò 56 2 242 00f2 ó 56 2 243 00f3 ô 56 2 244 00f4 õ 56 2 245 00f5 ö 56 2 246 00f6 ÷ 58 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 56 2 249 00f9 ú 56 2 250 00fa û 56 2 251 00fb ü 56 2 252 00fc ý 50 3 253 00fd þ 56 3 254 00fe ÿ 50 3 255 00ff ā 56 2 257 0101 Ă 67 2 258 0102 ă 56 2 259 0103 Ą 67 3 260 0104 ą 56 1 261 0105 Ć 72 2 262 0106 ć 50 2 263 0107 Ĉ 72 2 264 0108 ĉ 50 2 265 0109 Ċ 72 2 266 010a ċ 50 2 267 010b Č 72 2 268 010c č 50 2 269 010d Ď 72 2 270 010e ď 61 2 271 010f Đ 72 2 272 0110 đ 56 2 273 0111 Ē 67 2 274 0112 ē 56 2 275 0113 Ĕ 67 2 276 0114 ĕ 56 2 277 0115 Ė 67 2 278 0116 ė 56 2 279 0117 Ę 67 3 280 0118 ę 56 1 281 0119 Ě 67 2 282 011a ě 56 2 283 011b Ĝ 78 2 284 011c ĝ 56 3 285 011d Ğ 78 2 286 011e ğ 56 3 287 011f Ġ 78 2 288 0120 ġ 56 3 289 0121 Ģ 78 3 290 0122 ģ 56 3 291 0123 Ĥ 72 2 292 0124 ĥ 56 2 293 0125 Ħ 72 2 294 0126 ħ 56 2 295 0127 Ĩ 28 2 296 0128 ĩ 22 2 297 0129 Ī 28 2 298 012a ī 22 2 299 012b Ĭ 28 2 300 012c ĭ 22 2 301 012d Į 28 3 302 012e į 22 3 303 012f İ 28 2 304 0130 ı 22 0 305 0131 IJ 73 3 306 0132 ij 44 3 307 0133 Ĵ 50 3 308 0134 ĵ 22 3 309 0135 Ķ 67 3 310 0136 ķ 50 3 311 0137 ĸ 50 0 312 0138 Ĺ 56 2 313 0139 ĺ 22 2 314 013a Ļ 56 3 315 013b ļ 22 3 316 013c Ľ 56 2 317 013d ľ 29 2 318 013e Ŀ 56 2 319 013f ŀ 33 2 320 0140 Ł 56 2 321 0141 ł 22 2 322 0142 Ń 72 2 323 0143 ń 56 2 324 0144 Ņ 72 3 325 0145 ņ 56 1 326 0146 Ň 72 2 327 0147 ň 56 2 328 0148 ʼn 60 2 329 0149 Ŋ 72 3 330 014a ŋ 56 1 331 014b Ō 78 2 332 014c ō 56 2 333 014d Ŏ 78 2 334 014e ŏ 56 2 335 014f Ő 78 2 336 0150 ő 56 2 337 0151 Œ 100 2 338 0152 œ 94 0 339 0153 Ŕ 72 2 340 0154 ŕ 33 2 341 0155 Ŗ 72 3 342 0156 ŗ 33 1 343 0157 Ř 72 2 344 0158 ř 33 2 345 0159 Ś 67 2 346 015a ś 50 2 347 015b Ŝ 67 2 348 015c ŝ 50 2 349 015d Ş 67 3 350 015e ş 50 1 351 015f Š 67 2 352 0160 š 50 2 353 0161 Ţ 61 3 354 0162 ţ 28 3 355 0163 Ť 61 2 356 0164 ť 38 2 357 0165 Ŧ 61 2 358 0166 ŧ 28 2 359 0167 Ũ 72 2 360 0168 ũ 56 2 361 0169 Ū 72 2 362 016a ū 56 2 363 016b Ŭ 72 2 364 016c ŭ 56 2 365 016d Ů 72 2 366 016e ů 56 2 367 016f Ű 72 2 368 0170 ű 56 2 369 0171 Ų 72 3 370 0172 ų 56 1 371 0173 Ŵ 94 2 372 0174 ŵ 72 2 373 0175 Ŷ 67 2 374 0176 ŷ 50 3 375 0177 Ÿ 67 2 376 0178 Ź 61 2 377 0179 ź 50 2 378 017a Ż 61 2 379 017b ż 50 2 380 017c Ž 61 2 381 017d ž 50 2 382 017e ſ 22 2 383 017f ƒ 56 3 402 0192 Ș 67 3 536 0218 ș 50 1 537 0219 Ț 61 3 538 021a ț 28 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 28 1 894 037e · 28 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 56 0 8210 2012 – 56 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 22 2 8216 2018 ` " ‘ " ’ 22 2 8217 2019 ' " ’ " ‚ 22 1 8218 201a ‛ 28 0 8219 201b “ 33 2 8220 201c ” 33 2 8221 201d „ 33 1 8222 201e † 56 3 8224 2020 ‡ 56 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 56 2 8254 203e ⁄ 17 2 8260 2044 € 56 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 56 0 8494 212e − 58 0 8722 2212 ∕ 17 2 8725 2215 ∙ 28 0 8729 2219 bu " ⋅ 28 0 8901 22c5  50 2 59905 ea01  50 2 59906 ea02  33 2 61444 f004  22 1 63166 f6be fi 50 2 64257 fb01 fl 50 2 64258 fb02 9base-6/troff/font/devutf/NB0000644000175000017500000000534011402154555015355 0ustar anselmanselmname NB fontname NewCenturySchlbk-Bold named in prologue spacewidth 29 charset ! 30 2 33 " 33 2 34 dq " # 57 2 35 $ 57 3 36 % 83 2 37 & 85 2 38 ' 24 2 39 ( 39 3 40 ) 39 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 57 2 48 1 57 2 49 2 57 2 50 3 57 2 51 4 57 2 52 5 57 2 53 6 57 2 54 7 57 2 55 8 57 2 56 9 57 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 76 2 65 B 78 2 66 C 78 2 67 D 83 2 68 E 76 2 69 F 72 2 70 G 83 2 71 H 87 2 72 I 44 2 73 J 65 2 74 K 82 2 75 L 72 2 76 M 98 2 77 N 83 2 78 O 83 2 79 P 76 2 80 Q 83 3 81 R 82 2 82 S 67 2 83 T 72 2 84 U 83 2 85 V 76 2 86 W 98 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 39 3 91 \ 61 2 92 bs " ] 39 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 24 2 96 a 61 0 97 b 65 2 98 c 56 0 99 d 67 2 100 e 57 0 101 f 39 2 102 g 61 1 103 h 69 2 104 i 37 2 105 j 35 3 106 k 67 2 107 l 35 2 108 m 96 0 109 n 69 0 110 o 61 0 111 p 67 1 112 q 65 1 113 r 52 0 114 s 50 0 115 t 43 2 116 u 69 0 117 v 61 0 118 w 89 0 119 x 61 0 120 y 61 1 121 z 54 0 122 { 39 3 123 --- 61 2 124 } 39 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 30 1 161 ¡ " c| 57 3 162 ct " ¢ " L- 57 2 163 £ " ps " xo 57 2 164 ¤ " cr " Y- 57 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 2 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 37 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 34 2 178 ² " 3^ 34 2 179 ³ " \' 33 2 180 aa " ´ " /u 69 1 181 µ " P! 75 2 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 34 2 185 ¹ " o_ 37 2 186 º " >> 50 0 187 » " 14 86 2 188 ¼ " 12 86 2 189 ½ " 34 86 2 190 ¾ " ?? 50 1 191 ¿ " A` 76 2 192 À " A' 76 2 193 Á " A^ 76 2 194  " A~ 76 2 195 à " A" 76 2 196 Ä " A* 76 2 197 Å " AE 98 2 198 Æ " C, 78 3 199 Ç " E` 76 2 200 È " E' 76 2 201 É " E^ 76 2 202 Ê " E" 76 2 203 Ë " I` 44 2 204 Ì " I' 44 2 205 Í " I^ 44 2 206 Î " I" 44 2 207 Ï " D- 83 2 208 Ð " N~ 83 2 209 Ñ " O` 83 2 210 Ò " O' 83 2 211 Ó " O^ 83 2 212 Ô " O~ 83 2 213 Õ " O" 83 2 214 Ö " xx 61 0 215 × " O/ 83 2 216 Ø " U` 83 2 217 Ù " U' 83 2 218 Ú " U^ 83 2 219 Û " U" 83 2 220 Ü " Y' 72 2 221 Ý " TH 76 2 222 Þ " ss 61 2 223 ß " a` 61 2 224 à " a' 61 2 225 á " a^ 61 2 226 â " a~ 61 2 227 ã " a" 61 2 228 ä " a* 61 2 229 å " ae 87 0 230 æ " c, 56 1 231 ç " e` 57 2 232 è " e' 57 2 233 é " e^ 57 2 234 ê " e" 57 2 235 ë " i` 37 2 236 ì " i' 37 2 237 í " i^ 37 2 238 î " i" 37 2 239 ï " d- 61 2 240 ð " n~ 69 2 241 ñ " o` 61 2 242 ò " o' 61 2 243 ó " o^ 61 2 244 ô " o~ 61 2 245 õ " o" 61 2 246 ö " -: 61 0 247 ÷ " o/ 61 3 248 ø " u` 69 2 249 ù " u' 69 2 250 ú " u^ 69 2 251 û " u" 69 2 252 ü " y' 61 3 253 ý " th 67 3 254 þ " y" 61 3 255 ÿ " 9base-6/troff/font/devutf/mkMAP0000644000175000017500000000013011402154555016013 0ustar anselmanselm#!/bin/rc grep ' ' $* | awk ' $2 != "\"" {last = $4} {printf("\t%s\t%s\n", $1, last)} ' 9base-6/troff/font/devutf/LuxiMono-Oblique0000644000175000017500000001440511402154555020230 0ustar anselmanselmname LuxiMono-Oblique fontname LuxiMono-Oblique spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 2 60 003c = 60 0 61 003d > 60 2 62 003e ? 60 2 63 003f @ 60 2 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e € 60 2 128 0080   60 0 160 00a0 ¡ 60 1 161 00a1 ¢ 60 2 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 2 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 2 188 00bc ½ 60 2 189 00bd ¾ 60 2 190 00be ¿ 60 1 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 2 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f ƒ 60 3 402 0192 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˉ 60 2 713 02c9 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ̦ 60 1 806 0326 ; 60 1 894 037e · 60 0 903 0387 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 0 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‹ 60 0 8249 2039 › 60 0 8250 203a ‾ 60 2 8254 203e ⁄ 60 2 8260 2044 € 60 2 8364 20ac ™ 60 2 8482 2122 tm " ℮ 60 0 8494 212e − 60 0 8722 2212 ∕ 60 2 8725 2215 ∙ 60 0 8729 2219 bu " ⋅ 60 0 8901 22c5  60 2 59905 ea01  60 2 59906 ea02  60 2 61444 f004  60 2 61445 f005  60 2 61446 f006  60 2 61447 f007  60 1 63166 f6be fi 60 2 64257 fb01 fl 60 2 64258 fb02 9base-6/troff/font/devutf/LuxiSerif-Oblique0000644000175000017500000001431711402154555020372 0ustar anselmanselmname LuxiSerif-Oblique fontname LuxiSerif-Oblique spacewidth 25 charset ! 33 2 33 0021 " 41 2 34 0022 dq " dq " # 50 2 35 0023 $ 50 3 36 0024 % 83 2 37 0025 & 78 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 50 2 42 002a + 56 0 43 002b , 25 1 44 002c - 33 0 45 002d . 25 0 46 002e / 28 3 47 002f 0 50 2 48 0030 1 50 2 49 0031 2 50 2 50 0032 3 50 2 51 0033 4 50 2 52 0034 5 50 2 53 0035 6 50 2 54 0036 7 50 2 55 0037 8 50 2 56 0038 9 50 2 57 0039 : 28 0 58 003a ; 28 1 59 003b < 56 0 60 003c = 56 0 61 003d > 56 0 62 003e ? 44 2 63 003f @ 92 2 64 0040 A 72 2 65 0041 B 67 2 66 0042 C 67 2 67 0043 D 72 2 68 0044 E 61 2 69 0045 F 56 2 70 0046 G 72 2 71 0047 H 72 2 72 0048 I 33 2 73 0049 J 39 3 74 004a K 72 2 75 004b L 61 2 76 004c M 89 2 77 004d N 72 2 78 004e O 72 2 79 004f P 56 2 80 0050 Q 72 3 81 0051 R 67 2 82 0052 S 56 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 72 2 86 0056 W 94 2 87 0057 X 72 2 88 0058 Y 72 2 89 0059 Z 61 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 47 2 94 005e _ 50 1 95 005f a 44 0 97 0061 b 50 2 98 0062 c 44 0 99 0063 d 50 2 100 0064 e 44 0 101 0065 f 33 2 102 0066 g 50 1 103 0067 h 50 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 50 2 107 006b l 28 2 108 006c m 78 0 109 006d n 50 0 110 006e o 50 0 111 006f p 50 1 112 0070 q 50 1 113 0071 r 33 0 114 0072 s 39 0 115 0073 t 28 2 116 0074 u 50 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 44 0 122 007a { 48 3 123 007b | 20 3 124 007c } 48 3 125 007d ~ 54 0 126 007e € 50 2 128 0080   25 0 160 00a0 ¡ 33 1 161 00a1 ¢ 50 2 162 00a2 £ 50 2 163 00a3 ¤ 50 0 164 00a4 ¥ 50 2 165 00a5 ¦ 20 3 166 00a6 § 50 3 167 00a7 ¨ 33 2 168 00a8 © 76 2 169 00a9 ª 28 2 170 00aa « 50 0 171 00ab ¬ 56 0 172 00ac ­ 33 0 173 00ad hy " ® 76 2 174 00ae rg " ¯ 50 2 175 00af ° 40 2 176 00b0 ± 56 0 177 00b1 +- " ² 30 2 178 00b2 ³ 30 2 179 00b3 ´ 33 2 180 00b4 aa " µ 50 1 181 00b5 ¶ 45 3 182 00b6 · 25 0 183 00b7 ¸ 33 1 184 00b8 ¹ 30 2 185 00b9 º 31 2 186 00ba » 50 0 187 00bb ¼ 75 2 188 00bc ½ 75 2 189 00bd ¾ 75 2 190 00be ¿ 44 2 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 89 2 198 00c6 Ç 67 3 199 00c7 È 61 2 200 00c8 É 61 2 201 00c9 Ê 61 2 202 00ca Ë 61 2 203 00cb Ì 33 2 204 00cc Í 33 2 205 00cd Î 33 2 206 00ce Ï 33 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 72 2 210 00d2 Ó 72 2 211 00d3 Ô 72 2 212 00d4 Õ 72 2 213 00d5 Ö 72 2 214 00d6 × 56 0 215 00d7 mu " Ø 72 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 72 2 221 00dd Þ 56 2 222 00de ß 50 2 223 00df à 44 2 224 00e0 á 44 2 225 00e1 â 44 2 226 00e2 ã 44 2 227 00e3 ä 44 2 228 00e4 å 44 2 229 00e5 æ 67 0 230 00e6 ç 44 1 231 00e7 è 44 2 232 00e8 é 44 2 233 00e9 ê 44 2 234 00ea ë 44 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 50 2 240 00f0 ñ 50 2 241 00f1 ò 50 2 242 00f2 ó 50 2 243 00f3 ô 50 2 244 00f4 õ 50 2 245 00f5 ö 50 2 246 00f6 ÷ 56 0 247 00f7 -: " di " ø 50 0 248 00f8 ù 50 2 249 00f9 ú 50 2 250 00fa û 50 2 251 00fb ü 50 2 252 00fc ý 50 3 253 00fd þ 50 3 254 00fe ÿ 50 3 255 00ff ā 44 2 257 0101 Ă 72 2 258 0102 ă 44 2 259 0103 Ą 72 3 260 0104 ą 44 1 261 0105 Ć 67 2 262 0106 ć 44 2 263 0107 Ĉ 67 2 264 0108 ĉ 44 2 265 0109 Ċ 67 2 266 010a ċ 44 2 267 010b Č 67 2 268 010c č 44 2 269 010d Ď 72 2 270 010e ď 65 2 271 010f Đ 72 2 272 0110 đ 50 2 273 0111 Ē 61 2 274 0112 ē 44 2 275 0113 Ĕ 61 2 276 0114 ĕ 44 2 277 0115 Ė 61 2 278 0116 ė 44 2 279 0117 Ę 61 3 280 0118 ę 44 1 281 0119 Ě 61 2 282 011a ě 44 2 283 011b Ĝ 72 2 284 011c ĝ 50 3 285 011d Ğ 72 2 286 011e ğ 50 3 287 011f Ġ 72 2 288 0120 ġ 50 3 289 0121 Ģ 72 3 290 0122 ģ 50 3 291 0123 Ĥ 72 2 292 0124 ĥ 50 2 293 0125 Ħ 72 2 294 0126 ħ 50 2 295 0127 Ĩ 33 2 296 0128 ĩ 28 2 297 0129 Ī 33 2 298 012a ī 28 2 299 012b Ĭ 33 2 300 012c ĭ 28 2 301 012d Į 33 3 302 012e į 28 3 303 012f İ 33 2 304 0130 ı 28 0 305 0131 IJ 71 3 306 0132 ij 55 3 307 0133 Ĵ 39 3 308 0134 ĵ 28 3 309 0135 Ķ 72 3 310 0136 ķ 50 3 311 0137 ĸ 50 0 312 0138 Ĺ 61 2 313 0139 ĺ 28 2 314 013a Ļ 61 3 315 013b ļ 28 3 316 013c Ľ 61 2 317 013d ľ 41 2 318 013e Ŀ 61 2 319 013f ŀ 34 2 320 0140 Ł 61 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 50 2 324 0144 Ņ 72 3 325 0145 ņ 50 1 326 0146 Ň 72 2 327 0147 ň 50 2 328 0148 ʼn 60 2 329 0149 Ŋ 72 3 330 014a ŋ 50 1 331 014b Ō 72 2 332 014c ō 50 2 333 014d Ŏ 72 2 334 014e ŏ 50 2 335 014f Ő 72 2 336 0150 ő 50 2 337 0151 Œ 89 2 338 0152 œ 72 0 339 0153 Ŕ 67 2 340 0154 ŕ 33 2 341 0155 Ŗ 67 3 342 0156 ŗ 33 1 343 0157 Ř 67 2 344 0158 ř 33 2 345 0159 Ś 56 2 346 015a ś 39 2 347 015b Ŝ 56 2 348 015c ŝ 39 2 349 015d Ş 56 3 350 015e ş 39 1 351 015f Š 56 2 352 0160 š 39 2 353 0161 Ţ 61 3 354 0162 ţ 28 3 355 0163 Ť 61 2 356 0164 ť 33 2 357 0165 Ŧ 61 2 358 0166 ŧ 28 2 359 0167 Ũ 72 2 360 0168 ũ 50 2 361 0169 Ū 72 2 362 016a ū 50 2 363 016b Ŭ 72 2 364 016c ŭ 50 2 365 016d Ů 72 2 366 016e ů 50 2 367 016f Ű 72 2 368 0170 ű 50 2 369 0171 Ų 72 3 370 0172 ų 50 1 371 0173 Ŵ 94 2 372 0174 ŵ 72 2 373 0175 Ŷ 72 2 374 0176 ŷ 50 3 375 0177 Ÿ 72 2 376 0178 Ź 61 2 377 0179 ź 44 2 378 017a Ż 61 2 379 017b ż 44 2 380 017c Ž 61 2 381 017d ž 44 2 382 017e ſ 28 2 383 017f ƒ 50 3 402 0192 Ș 56 3 536 0218 ș 39 1 537 0219 Ț 61 3 538 021a ț 28 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 28 1 894 037e · 25 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 25 0 8219 201b “ 44 2 8220 201c ” 44 2 8221 201d „ 44 1 8222 201e † 50 3 8224 2020 ‡ 50 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 50 2 8254 203e ⁄ 17 2 8260 2044 € 50 2 8364 20ac ™ 98 2 8482 2122 tm " ℮ 44 0 8494 212e − 79 0 8722 2212 ∕ 17 2 8725 2215 ∙ 25 0 8729 2219 bu " ⋅ 25 0 8901 22c5  56 2 59905 ea01  56 2 59906 ea02  30 2 61444 f004  28 1 63166 f6be fi 56 2 64257 fb01 fl 56 2 64258 fb02 9base-6/troff/font/devutf/CW0000644000175000017500000007501411402154555015374 0ustar anselmanselmname CW fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/UnivMath30000644000175000017500000000244011402154555016672 0ustar anselmanselmname UnivMath3 fontname Universal-MathThree charset --- 44 2 33 --- 83 2 34 --- 28 2 35 --- 28 2 36 --- 39 2 37 --- 72 2 38 --- 83 2 39 --- 17 2 40 --- 17 2 41 --- 17 2 42 --- 22 2 43 --- 83 2 44 --- 28 2 45 --- 83 2 46 --- 28 2 47 --- 28 2 48 --- 22 2 49 --- 22 2 50 --- 22 2 51 --- 22 2 52 --- 22 2 53 --- 22 2 54 --- 22 2 55 --- 22 2 56 --- 28 2 57 --- 83 2 58 --- 83 2 59 --- 83 2 60 --- 28 2 61 --- 83 2 62 --- 83 2 63 --- 50 2 64 --- 50 2 65 --- 22 2 66 --- 22 2 67 --- 22 2 68 --- 28 2 69 --- 22 2 70 --- 22 2 71 --- 22 2 72 --- 17 2 73 --- 22 2 74 --- 22 2 75 --- 22 2 76 --- 28 2 77 --- 28 2 78 --- 44 2 79 --- 44 2 80 --- 44 2 81 --- 28 2 82 --- 22 2 83 --- 39 2 84 --- 17 2 85 --- 22 2 86 --- 17 2 87 --- 22 2 88 --- 39 2 89 --- 17 2 90 --- 83 2 91 --- 83 2 92 --- 83 2 93 --- 72 2 94 --- 22 2 95 --- 83 2 96 --- 39 2 97 --- 33 2 98 --- 33 2 99 --- 33 2 100 --- 50 2 101 --- 33 2 102 --- 33 2 103 --- 33 2 104 --- 33 2 105 --- 33 2 106 --- 33 2 107 --- 33 2 108 --- 33 2 109 --- 33 2 110 --- 67 2 111 --- 67 2 112 --- 100 2 113 --- 50 2 114 --- 33 2 115 --- 83 2 116 --- 22 2 117 --- 33 2 118 --- 28 2 119 --- 33 2 120 --- 50 2 121 --- 22 2 122 --- 83 2 123 --- 28 2 124 --- 83 2 125 --- 83 2 126 --- 83 2 162 --- 83 2 163 --- 83 2 164 --- 67 2 170 --- 83 2 176 --- 67 2 193 --- 83 2 248 --- 83 2 249 9base-6/troff/font/devutf/S10000644000175000017500000000063611402154555015344 0ustar anselmanselm# Times-Roman special font name S1 fontname Times-Roman named in prologue special charset ru 50 0 95 '' 37 0 0x201d `` 37 0 0x201c dg 63 0 0x2020 dd 63 0 0x2021 en 50 0 0x2013 \- " em 100 0 0x2014 bx 80 2 0x25a0 ob 56 2 0x25e6 ci 75 0 0x25cb sq 80 2 0x25a1 Sl 59 2 0x2113 L1 110 1 1 ☺ 70 1 1 LA 110 1 1 LV 110 3 1 LH 210 1 1 lh 100 0 1 rh 100 0 1 lH 100 0 1 rH 100 0 1 PC 220 2 1 DG 185 2 1 pw 60 0 1 FA 200 2 1 9base-6/troff/font/devutf/HM0000644000175000017500000000532511402154555015365 0ustar anselmanselmname H fontname Helvetica named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 0 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 26 3 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 37 2 170 ª " << 56 0 171 « " -, 58 0 172 hy 33 0 173 -- 58 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 58 2 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 54 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 61 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 58 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 67 2 221 Ý " TH 67 2 222 Þ " ss 61 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 50 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 58 0 247 ÷ " o/ 61 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 56 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/DejaVuCondensedSerifOblique0000644000175000017500000006216411402154555022400 0ustar anselmanselmname DejaVuCondensedSerifOblique fontname DejaVuCondensedSerifOblique spacewidth 29 charset ! 38 2 33 0021 " 44 2 34 0022 dq " dq " # 80 2 35 0023 $ 60 3 36 0024 % 90 2 37 0025 & 84 2 38 0026 ( 37 3 40 0028 ) 37 3 41 0029 * 47 2 42 002a + 80 2 43 002b , 30 1 44 002c - 32 0 45 002d . 30 0 46 002e / 32 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 61 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 32 0 58 003a ; 32 1 59 003b < 80 0 60 003c = 80 0 61 003d > 79 0 62 003e ? 51 2 63 003f @ 95 3 64 0040 A 68 2 65 0041 B 69 2 66 0042 C 73 2 67 0043 D 76 2 68 0044 E 69 2 69 0045 F 66 2 70 0046 G 76 2 71 0047 H 83 2 72 0048 I 38 2 73 0049 J 37 3 74 004a K 71 2 75 004b L 63 2 76 004c M 97 2 77 004d N 83 2 78 004e O 78 2 79 004f P 64 2 80 0050 Q 78 3 81 0051 R 71 2 82 0052 S 65 2 83 0053 T 64 2 84 0054 U 81 2 85 0055 V 69 2 86 0056 W 98 2 87 0057 X 67 2 88 0058 Y 63 2 89 0059 Z 66 2 90 005a [ 37 3 91 005b \ 32 3 92 005c bs " ] 37 3 93 005d ^ 79 2 94 005e _ 47 1 95 005f a 56 0 97 0061 b 60 2 98 0062 c 53 0 99 0063 d 61 2 100 0064 e 56 0 101 0065 f 36 3 102 0066 g 61 1 103 0067 h 61 2 104 0068 i 30 2 105 0069 j 28 3 106 006a k 57 2 107 006b l 30 2 108 006c m 90 0 109 006d n 61 0 110 006e o 57 0 111 006f p 60 1 112 0070 q 61 1 113 0071 r 46 0 114 0072 s 49 0 115 0073 t 38 2 116 0074 u 61 0 117 0075 v 54 0 118 0076 w 82 0 119 0077 x 53 0 120 0078 y 54 1 121 0079 z 50 0 122 007a { 61 3 123 007b | 32 3 124 007c } 60 3 125 007d ~ 80 0 126 007e   57 0 160 00a0 ¡ 38 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 61 2 165 00a5 ¦ 32 3 166 00a6 § 47 3 167 00a7 ¨ 48 2 168 00a8 © 95 2 169 00a9 ª 45 2 170 00aa « 58 0 171 00ab ¬ 80 0 172 00ac ­ 32 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 48 2 175 00af ° 47 2 176 00b0 ± 79 2 177 00b1 +- " ² 38 2 178 00b2 ³ 38 2 179 00b3 ´ 49 2 180 00b4 aa " µ 61 1 181 00b5 ¶ 61 3 182 00b6 · 30 0 183 00b7 ¸ 47 1 184 00b8 ¹ 38 2 185 00b9 º 45 2 186 00ba » 58 0 187 00bb ¼ 92 2 188 00bc ½ 92 2 189 00bd ¾ 92 2 190 00be ¿ 51 2 191 00bf À 68 2 192 00c0 Á 68 2 193 00c1  68 2 194 00c2 à 68 2 195 00c3 Ä 68 2 196 00c4 Å 68 2 197 00c5 Æ 95 2 198 00c6 Ç 73 3 199 00c7 È 69 2 200 00c8 É 69 2 201 00c9 Ê 69 2 202 00ca Ë 69 2 203 00cb Ì 38 2 204 00cc Í 38 2 205 00cd Î 38 2 206 00ce Ï 38 2 207 00cf Ð 76 2 208 00d0 Ñ 83 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 80 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 81 2 217 00d9 Ú 81 2 218 00da Û 81 2 219 00db Ü 81 2 220 00dc Ý 63 2 221 00dd Þ 64 2 222 00de ß 63 2 223 00df à 56 2 224 00e0 á 57 2 225 00e1 â 56 2 226 00e2 ã 57 2 227 00e3 ä 56 2 228 00e4 å 56 2 229 00e5 æ 89 0 230 00e6 ç 53 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 30 2 236 00ec í 31 2 237 00ed î 31 2 238 00ee ï 31 2 239 00ef ð 57 2 240 00f0 ñ 61 2 241 00f1 ò 57 2 242 00f2 ó 57 2 243 00f3 ô 57 2 244 00f4 õ 57 2 245 00f5 ö 57 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 57 0 248 00f8 ù 61 2 249 00f9 ú 61 2 250 00fa û 61 2 251 00fb ü 61 2 252 00fc ý 54 3 253 00fd þ 60 3 254 00fe ÿ 54 3 255 00ff ā 56 2 257 0101 Ă 68 2 258 0102 ă 56 2 259 0103 Ą 68 3 260 0104 ą 56 1 261 0105 Ć 73 2 262 0106 ć 53 2 263 0107 Ĉ 73 2 264 0108 ĉ 53 2 265 0109 Ċ 73 2 266 010a ċ 53 2 267 010b Č 73 2 268 010c č 54 2 269 010d Ď 76 2 270 010e ď 62 2 271 010f Đ 76 2 272 0110 đ 61 2 273 0111 Ē 69 2 274 0112 ē 56 2 275 0113 Ĕ 69 2 276 0114 ĕ 56 2 277 0115 Ė 69 2 278 0116 ė 56 2 279 0117 Ę 69 3 280 0118 ę 56 1 281 0119 Ě 69 2 282 011a ě 56 2 283 011b Ĝ 76 2 284 011c ĝ 61 3 285 011d Ğ 76 2 286 011e ğ 61 3 287 011f Ġ 76 2 288 0120 ġ 61 3 289 0121 Ģ 76 3 290 0122 ģ 61 3 291 0123 Ĥ 83 2 292 0124 ĥ 61 2 293 0125 Ħ 83 2 294 0126 ħ 61 2 295 0127 Ĩ 38 2 296 0128 ĩ 31 2 297 0129 Ī 38 2 298 012a ī 30 2 299 012b Ĭ 38 2 300 012c ĭ 31 2 301 012d Į 38 3 302 012e į 30 3 303 012f İ 38 2 304 0130 ı 30 0 305 0131 IJ 76 3 306 0132 ij 51 3 307 0133 Ĵ 38 3 308 0134 ĵ 29 3 309 0135 Ķ 71 3 310 0136 ķ 57 3 311 0137 ĸ 58 0 312 0138 Ĺ 63 2 313 0139 ĺ 30 2 314 013a Ļ 63 3 315 013b ļ 30 3 316 013c Ľ 63 2 317 013d ľ 38 2 318 013e Ŀ 64 2 319 013f ŀ 44 2 320 0140 Ł 63 2 321 0141 ł 31 2 322 0142 Ń 83 2 323 0143 ń 61 2 324 0144 Ņ 83 3 325 0145 ņ 61 1 326 0146 Ň 83 2 327 0147 ň 61 2 328 0148 ʼn 82 2 329 0149 Ŋ 83 3 330 014a ŋ 61 1 331 014b Ō 78 2 332 014c ō 57 2 333 014d Ŏ 78 2 334 014e ŏ 57 2 335 014f Ő 78 2 336 0150 ő 58 2 337 0151 Œ 108 2 338 0152 œ 94 0 339 0153 Ŕ 71 2 340 0154 ŕ 46 2 341 0155 Ŗ 71 3 342 0156 ŗ 46 1 343 0157 Ř 71 2 344 0158 ř 46 2 345 0159 Ś 65 2 346 015a ś 49 2 347 015b Ŝ 65 2 348 015c ŝ 49 2 349 015d Ş 65 3 350 015e ş 49 1 351 015f Š 65 2 352 0160 š 49 2 353 0161 Ţ 64 3 354 0162 ţ 38 3 355 0163 Ť 64 2 356 0164 ť 39 2 357 0165 Ŧ 64 2 358 0166 ŧ 38 2 359 0167 Ũ 81 2 360 0168 ũ 61 2 361 0169 Ū 81 2 362 016a ū 61 2 363 016b Ŭ 81 2 364 016c ŭ 61 2 365 016d Ů 81 2 366 016e ů 61 2 367 016f Ű 81 2 368 0170 ű 62 2 369 0171 Ų 81 3 370 0172 ų 61 1 371 0173 Ŵ 98 2 372 0174 ŵ 82 2 373 0175 Ŷ 63 2 374 0176 ŷ 54 3 375 0177 Ÿ 63 2 376 0178 Ź 66 2 377 0179 ź 50 2 378 017a Ż 66 2 379 017b ż 50 2 380 017c Ž 66 2 381 017d ž 50 2 382 017e ſ 36 3 383 017f Ɓ 69 2 385 0181 Ƃ 70 2 386 0182 ƃ 60 2 387 0183 Ƅ 69 2 388 0184 ƅ 60 2 389 0185 Ɔ 73 2 390 0186 Ƈ 74 2 391 0187 ƈ 54 2 392 0188 Ɖ 76 2 393 0189 Ɗ 76 2 394 018a Ƌ 70 2 395 018b ƌ 61 2 396 018c ƍ 57 1 397 018d Ǝ 69 2 398 018e Ə 78 2 399 018f Ɛ 60 2 400 0190 Ƒ 65 3 401 0191 ƒ 60 3 402 0192 Ɠ 77 2 403 0193 Ɣ 68 3 404 0194 ƕ 88 2 405 0195 Ɩ 38 2 406 0196 Ɨ 38 2 407 0197 Ƙ 72 2 408 0198 ƙ 57 2 409 0199 ƚ 30 2 410 019a ƛ 60 2 411 019b Ɯ 91 2 412 019c Ɲ 82 3 413 019d ƞ 61 1 414 019e Ɵ 78 2 415 019f Ơ 79 2 416 01a0 ơ 58 0 417 01a1 Ƣ 99 3 418 01a2 ƣ 77 1 419 01a3 Ƥ 64 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 67 3 422 01a6 Ƨ 65 2 423 01a7 ƨ 49 0 424 01a8 Ʃ 67 2 425 01a9 ƪ 31 3 426 01aa ƫ 39 3 427 01ab Ƭ 64 2 428 01ac ƭ 39 2 429 01ad Ʈ 64 3 430 01ae Ư 81 2 431 01af ư 62 0 432 01b0 Ʊ 79 2 433 01b1 Ʋ 72 2 434 01b2 Ƴ 71 2 435 01b3 ƴ 71 1 436 01b4 Ƶ 66 2 437 01b5 ƶ 50 0 438 01b6 Ʒ 54 2 439 01b7 Ƹ 54 2 440 01b8 ƹ 54 1 441 01b9 ƻ 60 2 443 01bb Ƽ 65 2 444 01bc ƽ 54 1 445 01bd ƾ 51 2 446 01be ǀ 28 2 448 01c0 ǁ 47 2 449 01c1 ǂ 44 2 450 01c2 ǃ 30 2 451 01c3 Ǎ 68 2 461 01cd ǎ 56 2 462 01ce Ǐ 38 2 463 01cf ǐ 31 2 464 01d0 Ǒ 78 2 465 01d1 ǒ 57 2 466 01d2 Ǔ 81 2 467 01d3 ǔ 61 2 468 01d4 ǖ 61 2 470 01d6 Ǘ 83 2 471 01d7 ǘ 64 2 472 01d8 Ǚ 83 2 473 01d9 ǚ 64 2 474 01da Ǜ 82 2 475 01db ǜ 64 2 476 01dc ǝ 56 0 477 01dd ǟ 57 2 479 01df Ǣ 95 2 482 01e2 ǣ 89 2 483 01e3 Ǫ 78 3 490 01ea ǫ 57 1 491 01eb Ǭ 78 3 492 01ec ǭ 57 3 493 01ed Ƕ 109 2 502 01f6 Ș 65 3 536 0218 ș 49 1 537 0219 Ț 64 3 538 021a ț 38 3 539 021b Ȥ 66 3 548 0224 ȥ 50 1 549 0225 ȫ 57 2 555 022b ȭ 57 2 557 022d Ȯ 78 2 558 022e ȯ 57 2 559 022f ȱ 57 2 561 0231 Ȳ 63 2 562 0232 ȳ 54 3 563 0233 ȷ 28 1 567 0237 ȸ 91 2 568 0238 ȹ 91 1 569 0239 Ⱥ 69 2 570 023a Ȼ 73 2 571 023b ȼ 53 0 572 023c Ƚ 63 2 573 023d Ⱦ 64 2 574 023e ȿ 49 1 575 023f ɀ 50 1 576 0240 Ɂ 56 2 577 0241 ɐ 57 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 60 2 595 0253 ɔ 53 0 596 0254 ɕ 53 1 597 0255 ɖ 62 3 598 0256 ɗ 66 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 81 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 74 0 605 025d ɞ 58 0 606 025e ɟ 29 1 607 025f ɠ 66 3 608 0260 ɡ 61 1 609 0261 ɢ 52 0 610 0262 ɣ 68 1 611 0263 ɤ 54 0 612 0264 ɥ 61 1 613 0265 ɦ 61 2 614 0266 ɧ 61 3 615 0267 ɨ 30 2 616 0268 ɩ 37 0 617 0269 ɪ 30 0 618 026a ɫ 36 2 619 026b ɬ 43 2 620 026c ɭ 35 3 621 026d ɮ 61 3 622 026e ɯ 90 0 623 026f ɰ 90 1 624 0270 ɱ 90 1 625 0271 ɲ 60 1 626 0272 ɳ 66 1 627 0273 ɴ 61 0 628 0274 ɵ 57 0 629 0275 ɶ 75 0 630 0276 ɷ 61 0 631 0277 ɸ 57 3 632 0278 ɹ 48 0 633 0279 ɺ 48 2 634 027a ɻ 52 1 635 027b ɼ 46 1 636 027c ɽ 46 1 637 027d ɾ 43 0 638 027e ɿ 43 0 639 027f ʀ 56 0 640 0280 ʁ 56 0 641 0281 ʂ 49 1 642 0282 ʃ 26 3 643 0283 ʄ 35 3 644 0284 ʅ 46 1 645 0285 ʆ 31 3 646 0286 ʇ 38 1 647 0287 ʈ 38 3 648 0288 ʉ 61 0 649 0289 ʊ 59 0 650 028a ʋ 58 0 651 028b ʌ 53 0 652 028c ʍ 81 0 653 028d ʎ 53 2 654 028e ʏ 63 0 655 028f ʐ 57 1 656 0290 ʑ 53 1 657 0291 ʒ 54 1 658 0292 ʓ 53 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 48 3 663 0297 ʘ 67 0 664 0298 ʙ 52 0 665 0299 ʚ 58 0 666 029a ʛ 63 2 667 029b ʜ 61 0 668 029c ʝ 34 3 669 029d ʞ 58 1 670 029e ʟ 61 0 671 029f ʠ 66 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 95 2 675 02a3 ʤ 98 3 676 02a4 ʥ 95 3 677 02a5 ʦ 77 2 678 02a6 ʧ 58 3 679 02a7 ʨ 75 3 680 02a8 ʩ 85 3 681 02a9 ʪ 61 2 682 02aa ʫ 64 2 683 02ab ʬ 57 2 684 02ac ʭ 42 2 685 02ad ʮ 74 3 686 02ae ʯ 73 3 687 02af ʰ 41 2 688 02b0 ʱ 40 2 689 02b1 ʲ 25 2 690 02b2 ʳ 33 2 691 02b3 ʴ 33 2 692 02b4 ʵ 40 2 693 02b5 ʶ 37 2 694 02b6 ʷ 56 2 695 02b7 ʸ 40 2 696 02b8 ʻ 30 2 699 02bb ʼ 30 2 700 02bc ʾ 30 2 702 02be ʿ 30 2 703 02bf ˀ 26 2 704 02c0 ˁ 27 2 705 02c1 ˆ 48 2 710 02c6 ˇ 49 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 34 2 722 02d2 ˓ 29 0 723 02d3 ˖ 37 0 726 02d6 ˘ 48 2 728 02d8 ˙ 48 2 729 02d9 ˚ 48 2 730 02da ˛ 47 1 731 02db ˜ 48 2 732 02dc ˝ 49 2 733 02dd ˞ 40 0 734 02de ˠ 43 2 736 02e0 ˡ 23 2 737 02e1 ˢ 32 2 738 02e2 ˣ 40 2 739 02e3 ˤ 27 2 740 02e4 ˥ 47 2 741 02e5 ˦ 46 2 742 02e6 ˧ 46 2 743 02e7 ˨ 46 2 744 02e8 ˩ 46 2 745 02e9 ́ 58 2 769 0301 ̂ 58 2 770 0302 ̃ 58 2 771 0303 ̄ 58 2 772 0304 ̅ 0 2 773 0305 ̆ 58 2 774 0306 ̇ 58 2 775 0307 ̈ 58 2 776 0308 ̉ 0 2 777 0309 ̊ 58 2 778 030a ̋ 58 2 779 030b ̌ 58 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 30 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 61 1 801 0321 ̢ 47 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 1 2 856 0358 ͡ 1 2 865 0361 ʹ 26 2 884 0374 ͵ 26 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 49 2 900 0384 ΅ 49 2 901 0385 Ά 68 2 902 0386 · 30 0 903 0387 Έ 86 2 904 0388 Ή 99 2 905 0389 Ί 54 2 906 038a Ό 79 2 908 038c Ύ 86 2 910 038e Ώ 81 2 911 038f ΐ 38 2 912 0390 Α 68 2 913 0391 Β 69 2 914 0392 Γ 66 2 915 0393 Δ 68 2 916 0394 Ε 69 2 917 0395 Ζ 66 2 918 0396 Η 83 2 919 0397 Θ 78 2 920 0398 Ι 38 2 921 0399 Κ 71 2 922 039a Λ 68 2 923 039b Μ 97 2 924 039c Ν 83 2 925 039d Ξ 67 2 926 039e Ο 78 2 927 039f Π 83 2 928 03a0 Ρ 64 2 929 03a1 Σ 67 2 931 03a3 Τ 64 2 932 03a4 Υ 63 2 933 03a5 Φ 78 2 934 03a6 Χ 67 2 935 03a7 Ψ 84 2 936 03a8 Ω 78 2 937 03a9 Ϊ 38 2 938 03aa Ϋ 63 2 939 03ab ά 64 2 940 03ac έ 51 2 941 03ad ή 57 3 942 03ae ί 38 2 943 03af ΰ 58 2 944 03b0 α 64 0 945 03b1 β 54 3 946 03b2 γ 57 1 947 03b3 δ 57 2 948 03b4 ε 51 0 949 03b5 ζ 52 3 950 03b6 η 57 1 951 03b7 θ 57 2 952 03b8 ι 37 0 953 03b9 κ 62 0 954 03ba λ 60 2 955 03bb μ 62 1 956 03bc ν 58 0 957 03bd ξ 53 3 958 03be ο 57 0 959 03bf π 62 0 960 03c0 ρ 56 1 961 03c1 ς 53 1 962 03c2 σ 65 0 963 03c3 τ 53 0 964 03c4 υ 58 0 965 03c5 φ 67 1 966 03c6 χ 57 1 967 03c7 ψ 75 1 968 03c8 ω 77 0 969 03c9 ϊ 38 2 970 03ca ϋ 58 2 971 03cb ό 57 2 972 03cc ύ 58 2 973 03cd ώ 77 2 974 03ce ϐ 55 2 976 03d0 ϑ 68 2 977 03d1 ϒ 66 2 978 03d2 ϓ 83 2 979 03d3 ϔ 68 2 980 03d4 ϕ 65 3 981 03d5 ϖ 78 0 982 03d6 ϗ 59 1 983 03d7 Ϙ 78 3 984 03d8 ϙ 57 1 985 03d9 Ϛ 73 3 986 03da ϛ 54 3 987 03db Ϝ 66 2 988 03dc ϝ 43 3 989 03dd Ϟ 56 2 990 03de ϟ 63 2 991 03df Ϡ 74 3 992 03e0 ϡ 55 1 993 03e1 ϰ 59 0 1008 03f0 ϱ 56 1 1009 03f1 ϲ 53 0 1010 03f2 ϳ 28 3 1011 03f3 ϴ 78 2 1012 03f4 ϵ 53 0 1013 03f5 ϶ 53 0 1014 03f6 Ϸ 64 2 1015 03f7 ϸ 61 3 1016 03f8 Ϲ 73 2 1017 03f9 Ϻ 97 2 1018 03fa ϻ 67 1 1019 03fb ϼ 56 1 1020 03fc Ͻ 73 2 1021 03fd Ͼ 73 2 1022 03fe Ͽ 73 2 1023 03ff Ё 69 2 1025 0401 Ђ 76 3 1026 0402 Ѓ 66 2 1027 0403 Є 73 2 1028 0404 Ѕ 65 2 1029 0405 І 38 2 1030 0406 Ї 38 2 1031 0407 Ј 37 3 1032 0408 Љ 100 2 1033 0409 Њ 106 2 1034 040a Ћ 82 2 1035 040b Ќ 71 2 1036 040c Ѝ 83 2 1037 040d Ў 71 2 1038 040e Џ 83 3 1039 040f А 68 2 1040 0410 Б 70 2 1041 0411 В 69 2 1042 0412 Г 66 2 1043 0413 Д 82 3 1044 0414 Е 69 2 1045 0415 Ж 105 2 1046 0416 З 60 2 1047 0417 И 83 2 1048 0418 Й 83 2 1049 0419 К 71 2 1050 041a Л 82 2 1051 041b М 97 2 1052 041c Н 83 2 1053 041d О 78 2 1054 041e П 83 2 1055 041f Р 64 2 1056 0420 С 73 2 1057 0421 Т 64 2 1058 0422 У 71 2 1059 0423 Ф 93 3 1060 0424 Х 67 2 1061 0425 Ц 83 3 1062 0426 Ч 71 2 1063 0427 Ш 97 2 1064 0428 Щ 100 3 1065 0429 Ъ 72 2 1066 042a Ы 99 2 1067 042b Ь 65 2 1068 042c Э 73 2 1069 042d Ю 113 2 1070 042e Я 80 2 1071 042f а 56 0 1072 0430 б 57 2 1073 0431 в 53 0 1074 0432 г 51 0 1075 0433 д 65 1 1076 0434 е 56 0 1077 0435 ж 81 0 1078 0436 з 51 0 1079 0437 и 63 0 1080 0438 й 63 2 1081 0439 к 58 0 1082 043a л 59 0 1083 043b м 80 0 1084 043c н 63 0 1085 043d о 57 0 1086 043e п 63 0 1087 043f р 60 1 1088 0440 с 53 0 1089 0441 т 53 0 1090 0442 у 54 1 1091 0443 ф 70 3 1092 0444 х 53 0 1093 0445 ц 65 1 1094 0446 ч 64 0 1095 0447 ш 81 0 1096 0448 щ 86 1 1097 0449 ъ 52 0 1098 044a ы 70 0 1099 044b ь 46 0 1100 044c э 53 0 1101 044d ю 82 0 1102 044e я 61 0 1103 044f ѐ 56 2 1104 0450 ё 56 2 1105 0451 ђ 59 3 1106 0452 ѓ 51 2 1107 0453 є 53 0 1108 0454 ѕ 49 0 1109 0455 і 30 2 1110 0456 ї 30 2 1111 0457 ј 28 3 1112 0458 љ 74 0 1113 0459 њ 75 0 1114 045a ћ 61 2 1115 045b ќ 58 2 1116 045c ѝ 63 2 1117 045d ў 54 3 1118 045e џ 62 1 1119 045f Ґ 66 2 1168 0490 ґ 51 2 1169 0491 Ғ 66 2 1170 0492 ғ 51 0 1171 0493 Қ 71 3 1178 049a қ 58 1 1179 049b Ҳ 67 3 1202 04b2 ҳ 53 1 1203 04b3 Ӑ 68 2 1232 04d0 ӑ 56 2 1233 04d1 Ӓ 70 2 1234 04d2 ӓ 56 2 1235 04d3 Ӕ 95 2 1236 04d4 ӕ 89 0 1237 04d5 Ӗ 71 2 1238 04d6 ӗ 56 2 1239 04d7 Ӡ 54 2 1248 04e0 ӡ 54 1 1249 04e1 Ӧ 80 2 1254 04e6 ӧ 57 2 1255 04e7 Ө 78 2 1256 04e8 ө 57 0 1257 04e9 Ӫ 80 2 1258 04ea ӫ 57 2 1259 04eb ᴂ 89 0 7426 1d02 ᴈ 48 0 7432 1d08 ᴉ 30 1 7433 1d09 ᴔ 94 0 7444 1d14 ᴖ 58 0 7446 1d16 ᴗ 58 0 7447 1d17 ᴝ 71 0 7453 1d1d ᴞ 91 0 7454 1d1e ᴟ 90 3 7455 1d1f ᵃ 45 2 7491 1d43 ᵄ 33 2 7492 1d44 ᵅ 47 2 7493 1d45 ᵆ 67 2 7494 1d46 ᵇ 47 2 7495 1d47 ᵈ 47 2 7496 1d48 ᵉ 45 2 7497 1d49 ᵊ 45 2 7498 1d4a ᵋ 41 2 7499 1d4b ᵌ 41 2 7500 1d4c ᵍ 47 2 7501 1d4d ᵎ 26 2 7502 1d4e ᵏ 43 2 7503 1d4f ᵐ 67 2 7504 1d50 ᵑ 47 2 7505 1d51 ᵒ 45 2 7506 1d52 ᵓ 42 2 7507 1d53 ᵔ 46 2 7508 1d54 ᵕ 46 0 7509 1d55 ᵖ 47 2 7510 1d56 ᵗ 32 2 7511 1d57 ᵘ 47 2 7512 1d58 ᵙ 53 2 7513 1d59 ᵚ 67 2 7514 1d5a ᵛ 44 2 7515 1d5b ᵷ 61 1 7543 1d77 ᵻ 36 0 7547 1d7b ᶅ 30 3 7557 1d85 ᶛ 47 2 7579 1d9b ᶜ 42 2 7580 1d9c ᶝ 42 2 7581 1d9d ᶞ 45 2 7582 1d9e ᶟ 41 2 7583 1d9f ᶠ 30 2 7584 1da0 ᶡ 30 2 7585 1da1 ᶢ 47 2 7586 1da2 ᶣ 47 2 7587 1da3 ᶤ 31 2 7588 1da4 ᶥ 32 2 7589 1da5 ᶦ 31 2 7590 1da6 ᶧ 31 2 7591 1da7 ᶨ 30 2 7592 1da8 ᶩ 26 2 7593 1da9 ᶪ 25 2 7594 1daa ᶫ 43 2 7595 1dab ᶬ 67 2 7596 1dac ᶭ 67 2 7597 1dad ᶮ 47 2 7598 1dae ᶯ 47 2 7599 1daf ᶰ 47 2 7600 1db0 ᶱ 45 2 7601 1db1 ᶲ 45 2 7602 1db2 ᶳ 40 2 7603 1db3 ᶴ 29 2 7604 1db4 ᶵ 33 2 7605 1db5 ᶶ 47 2 7606 1db6 ᶷ 46 2 7607 1db7 ᶹ 45 2 7609 1db9 ᶺ 44 2 7610 1dba ᶻ 40 2 7611 1dbb ᶼ 41 2 7612 1dbc ᶽ 40 2 7613 1dbd ᶾ 43 2 7614 1dbe ᶿ 45 2 7615 1dbf Ḍ 76 3 7692 1e0c ḍ 61 3 7693 1e0d Ḓ 77 3 7698 1e12 ḓ 61 3 7699 1e13 Ḥ 83 3 7716 1e24 ḥ 61 3 7717 1e25 Ḷ 63 3 7734 1e36 ḷ 30 3 7735 1e37 Ḹ 63 3 7736 1e38 ḹ 31 3 7737 1e39 Ḽ 61 3 7740 1e3c ḽ 34 3 7741 1e3d ṁ 90 2 7745 1e41 Ṃ 97 3 7746 1e42 ṃ 91 1 7747 1e43 Ṅ 80 2 7748 1e44 ṅ 63 2 7749 1e45 Ṇ 83 3 7750 1e46 ṇ 61 1 7751 1e47 Ṋ 80 3 7754 1e4a ṋ 62 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 71 3 7770 1e5a ṛ 46 1 7771 1e5b Ṝ 71 3 7772 1e5c ṝ 46 3 7773 1e5d ṡ 49 2 7777 1e61 Ṣ 65 3 7778 1e62 ṣ 49 1 7779 1e63 Ṭ 64 3 7788 1e6c ṭ 38 3 7789 1e6d Ṱ 63 3 7792 1e70 ṱ 41 3 7793 1e71 Ṿ 69 3 7806 1e7e ṿ 54 1 7807 1e7f Ẁ 98 2 7808 1e80 ẁ 82 2 7809 1e81 Ẃ 98 2 7810 1e82 ẃ 82 2 7811 1e83 Ẅ 98 2 7812 1e84 ẅ 82 2 7813 1e85 Ẹ 69 3 7864 1eb8 ẹ 56 1 7865 1eb9 Ị 38 3 7882 1eca ị 30 3 7883 1ecb Ọ 78 3 7884 1ecc ọ 57 1 7885 1ecd Ụ 81 3 7908 1ee4 ụ 61 1 7909 1ee5 Ỳ 63 2 7922 1ef2 ỳ 54 3 7923 1ef3 ἁ 64 2 7937 1f01 ἂ 64 2 7938 1f02 ἃ 64 2 7939 1f03 ἄ 64 2 7940 1f04 ἅ 64 2 7941 1f05 ἆ 64 2 7942 1f06 ἇ 64 2 7943 1f07 Ἀ 68 2 7944 1f08 Ἁ 68 2 7945 1f09 Ἂ 82 2 7946 1f0a Ἃ 82 2 7947 1f0b Ἄ 69 2 7948 1f0c Ἅ 72 2 7949 1f0d Ἆ 68 2 7950 1f0e Ἇ 68 2 7951 1f0f ἐ 51 2 7952 1f10 ἑ 51 2 7953 1f11 ἒ 51 2 7954 1f12 ἓ 51 2 7955 1f13 ἔ 51 2 7956 1f14 ἕ 51 2 7957 1f15 Ἐ 81 2 7960 1f18 Ἑ 80 2 7961 1f19 Ἒ 101 2 7962 1f1a Ἓ 102 2 7963 1f1b Ἔ 96 2 7964 1f1c Ἕ 98 2 7965 1f1d ἠ 57 3 7968 1f20 ἡ 57 3 7969 1f21 ἢ 57 3 7970 1f22 ἣ 57 3 7971 1f23 ἤ 57 3 7972 1f24 ἥ 57 3 7973 1f25 ἦ 57 3 7974 1f26 ἧ 57 3 7975 1f27 Ἠ 95 2 7976 1f28 Ἡ 94 2 7977 1f29 Ἢ 115 2 7978 1f2a Ἣ 116 2 7979 1f2b Ἤ 110 2 7980 1f2c Ἥ 113 2 7981 1f2d Ἦ 105 2 7982 1f2e Ἧ 104 2 7983 1f2f ἰ 37 2 7984 1f30 ἱ 37 2 7985 1f31 ἲ 37 2 7986 1f32 ἳ 37 2 7987 1f33 ἴ 38 2 7988 1f34 ἵ 38 2 7989 1f35 ἶ 38 2 7990 1f36 ἷ 38 2 7991 1f37 Ἰ 50 2 7992 1f38 Ἱ 49 2 7993 1f39 Ἲ 70 2 7994 1f3a Ἳ 70 2 7995 1f3b Ἴ 65 2 7996 1f3c Ἵ 67 2 7997 1f3d Ἶ 60 2 7998 1f3e Ἷ 59 2 7999 1f3f ὀ 57 2 8000 1f40 ὁ 57 2 8001 1f41 ὂ 57 2 8002 1f42 ὃ 57 2 8003 1f43 ὄ 57 2 8004 1f44 ὅ 57 2 8005 1f45 Ὀ 78 2 8008 1f48 Ὁ 82 2 8009 1f49 Ὂ 106 2 8010 1f4a Ὃ 107 2 8011 1f4b Ὄ 89 2 8012 1f4c Ὅ 91 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 58 2 8020 1f54 ὕ 58 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 81 2 8025 1f59 Ὓ 103 2 8027 1f5b Ὕ 100 2 8029 1f5d Ὗ 91 2 8031 1f5f ὠ 77 2 8032 1f60 ὡ 77 2 8033 1f61 ὢ 77 2 8034 1f62 ὣ 77 2 8035 1f63 ὤ 77 2 8036 1f64 ὥ 77 2 8037 1f65 ὦ 77 2 8038 1f66 ὧ 77 2 8039 1f67 Ὠ 78 2 8040 1f68 Ὡ 83 2 8041 1f69 Ὢ 107 2 8042 1f6a Ὣ 108 2 8043 1f6b Ὤ 90 2 8044 1f6c Ὥ 93 2 8045 1f6d Ὦ 89 2 8046 1f6e Ὧ 92 2 8047 1f6f ὰ 64 2 8048 1f70 ά 64 2 8049 1f71 ὲ 51 2 8050 1f72 έ 51 2 8051 1f73 ὴ 57 3 8052 1f74 ή 57 3 8053 1f75 ὶ 37 2 8054 1f76 ί 38 2 8055 1f77 ὸ 57 2 8056 1f78 ό 57 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 77 2 8060 1f7c ώ 77 2 8061 1f7d ᾀ 64 3 8064 1f80 ᾁ 64 3 8065 1f81 ᾂ 64 3 8066 1f82 ᾃ 64 3 8067 1f83 ᾄ 64 3 8068 1f84 ᾅ 64 3 8069 1f85 ᾆ 64 3 8070 1f86 ᾇ 64 3 8071 1f87 ᾈ 68 3 8072 1f88 ᾉ 68 3 8073 1f89 ᾊ 82 3 8074 1f8a ᾋ 82 3 8075 1f8b ᾌ 69 3 8076 1f8c ᾍ 72 3 8077 1f8d ᾎ 68 3 8078 1f8e ᾏ 68 3 8079 1f8f ᾐ 57 3 8080 1f90 ᾑ 57 3 8081 1f91 ᾒ 57 3 8082 1f92 ᾓ 57 3 8083 1f93 ᾔ 57 3 8084 1f94 ᾕ 57 3 8085 1f95 ᾖ 57 3 8086 1f96 ᾗ 57 3 8087 1f97 ᾘ 95 3 8088 1f98 ᾙ 94 3 8089 1f99 ᾚ 115 3 8090 1f9a ᾛ 116 3 8091 1f9b ᾜ 110 3 8092 1f9c ᾝ 112 3 8093 1f9d ᾞ 104 3 8094 1f9e ᾟ 104 3 8095 1f9f ᾠ 77 3 8096 1fa0 ᾡ 77 3 8097 1fa1 ᾢ 77 3 8098 1fa2 ᾣ 77 3 8099 1fa3 ᾤ 77 3 8100 1fa4 ᾥ 77 3 8101 1fa5 ᾦ 77 3 8102 1fa6 ᾧ 77 3 8103 1fa7 ᾨ 78 3 8104 1fa8 ᾩ 82 3 8105 1fa9 ᾪ 107 3 8106 1faa ᾫ 108 3 8107 1fab ᾬ 90 3 8108 1fac ᾭ 92 3 8109 1fad ᾮ 89 3 8110 1fae ᾯ 92 3 8111 1faf ᾰ 64 2 8112 1fb0 ᾱ 64 2 8113 1fb1 ᾲ 64 3 8114 1fb2 ᾳ 64 1 8115 1fb3 ᾴ 64 3 8116 1fb4 ᾶ 64 2 8118 1fb6 ᾷ 64 3 8119 1fb7 Ᾰ 68 2 8120 1fb8 Ᾱ 68 2 8121 1fb9 Ὰ 68 2 8122 1fba Ά 68 2 8123 1fbb ᾼ 68 3 8124 1fbc ᾽ 48 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 48 2 8127 1fbf ῀ 48 2 8128 1fc0 ῁ 49 2 8129 1fc1 ῂ 57 3 8130 1fc2 ῃ 57 1 8131 1fc3 ῄ 57 3 8132 1fc4 ῆ 57 3 8134 1fc6 ῇ 57 3 8135 1fc7 Ὲ 87 2 8136 1fc8 Έ 86 2 8137 1fc9 Ὴ 101 2 8138 1fca Ή 99 2 8139 1fcb ῌ 83 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 48 2 8143 1fcf ῐ 38 2 8144 1fd0 ῑ 38 2 8145 1fd1 ῒ 38 2 8146 1fd2 ΐ 38 2 8147 1fd3 ῖ 38 2 8150 1fd6 ῗ 38 2 8151 1fd7 Ῐ 38 2 8152 1fd8 Ῑ 38 2 8153 1fd9 Ὶ 56 2 8154 1fda Ί 54 2 8155 1fdb ῝ 48 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 48 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 56 3 8164 1fe4 ῥ 56 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 63 2 8168 1fe8 Ῡ 63 2 8169 1fe9 Ὺ 88 2 8170 1fea Ύ 86 2 8171 1feb Ῥ 75 2 8172 1fec ῭ 48 2 8173 1fed ΅ 49 2 8174 1fee ` 48 2 8175 1fef ῲ 77 3 8178 1ff2 ῳ 77 1 8179 1ff3 ῴ 77 3 8180 1ff4 ῶ 77 2 8182 1ff6 ῷ 77 3 8183 1ff7 Ὸ 92 2 8184 1ff8 Ό 79 2 8185 1ff9 Ὼ 94 2 8186 1ffa Ώ 81 2 8187 1ffb ῼ 78 3 8188 1ffc ´ 49 2 8189 1ffd ῾ 48 2 8190 1ffe ‐ 32 0 8208 2010 ‑ 32 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 30 2 8216 2018 ` " ‘ " ’ 30 2 8217 2019 ' " ’ " ‚ 30 1 8218 201a ‛ 30 2 8219 201b “ 49 2 8220 201c ” 49 2 8221 201d „ 49 1 8222 201e ‟ 49 2 8223 201f † 48 3 8224 2020 ‡ 47 3 8225 2021 • 56 0 8226 2022 ‣ 56 0 8227 2023 … 95 0 8230 2026 ‰ 127 2 8240 2030 ‱ 165 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 50 2 8252 203c ‾ 47 2 8254 203e ⁇ 93 2 8263 2047 ⁈ 72 2 8264 2048 ⁉ 71 2 8265 2049 ⁰ 38 2 8304 2070 ⁴ 38 2 8308 2074 ⁵ 38 2 8309 2075 ⁶ 38 2 8310 2076 ⁷ 38 2 8311 2077 ⁸ 38 2 8312 2078 ⁹ 38 2 8313 2079 ⁿ 41 2 8319 207f ₦ 63 2 8358 20a6 € 60 2 8364 20ac ₵ 61 3 8373 20b5 № 122 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 78 2 8486 2126 K 71 2 8490 212a Å 68 2 8491 212b ∂ 49 2 8706 2202 pd " ∆ 66 2 8710 2206 ∇ 66 2 8711 2207 gr " ∏ 76 3 8719 220f ∑ 67 3 8721 2211 − 80 0 8722 2212 ∕ 16 2 8725 2215 ∙ 30 0 8729 2219 bu " √ 61 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 70 0 8743 2227 l∧ 70 0 8743 2227 " ∨ 70 0 8744 2228 l| " ∩ 70 0 8745 2229 ca " ∪ 70 0 8746 222a cu " ∫ 49 3 8747 222b is " ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≤ 80 0 8804 2264 ≥ 79 0 8805 2265 ⌂ 73 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 49 2 8977 2311 ⌘ 95 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 50 3 8992 2320 ⌡ 48 3 8993 2321 ⌥ 95 2 8997 2325 ⍽ 87 1 9085 237d ⎮ 49 3 9134 23ae ⏏ 73 0 9167 23cf ␣ 72 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 56 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 56 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⟠ 47 3 10208 27e0 ⧫ 47 3 10731 29eb ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 63 3 64257 fb01 fl 63 3 64258 fb02 � 98 3 65533 fffd 9base-6/troff/font/devutf/AI0000644000175000017500000000534211402154555015351 0ustar anselmanselmname AI fontname AvantGarde-BookOblique named in prologue spacewidth 28 charset ! 29 2 33 " 31 2 34 dq " # 55 2 35 $ 55 2 36 % 78 2 37 & 76 2 38 ' 35 2 39 ( 37 3 40 ) 37 3 41 * 43 2 42 + 61 0 43 , 28 0 44 - 33 0 173 . 28 0 46 / 44 3 47 0 55 2 48 1 55 2 49 2 55 2 50 3 55 2 51 4 55 2 52 5 55 2 53 6 55 2 54 7 55 2 55 8 55 2 56 9 55 2 57 : 28 0 58 ; 28 0 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 59 2 63 @ 87 2 64 A 74 2 65 B 57 2 66 C 81 2 67 D 74 2 68 E 54 2 69 F 49 2 70 G 87 2 71 H 68 2 72 I 23 2 73 J 48 2 74 K 59 2 75 L 46 2 76 M 92 2 77 N 74 2 78 O 87 2 79 P 59 2 80 Q 87 2 81 R 61 2 82 S 50 2 83 T 43 2 84 U 66 2 85 V 70 2 86 W 96 2 87 X 61 2 88 Y 59 2 89 Z 48 2 90 [ 35 3 91 \ 61 2 92 bs " ] 35 3 93 ^ 50 2 147 --- 61 2 94 --- 50 1 95 ` 35 2 96 a 68 0 97 b 68 2 98 c 65 0 99 d 69 2 100 e 65 0 101 f 31 2 102 g 67 1 103 h 61 2 104 i 20 2 105 j 20 3 106 k 50 2 107 l 20 2 108 m 94 0 109 n 61 0 110 o 66 0 111 p 68 1 112 q 68 1 113 r 30 0 114 s 39 0 115 t 34 2 116 u 61 0 117 v 55 0 118 w 83 0 119 x 48 0 120 y 54 1 121 z 43 0 122 { 35 3 123 --- 67 2 124 } 35 3 125 ~ 44 2 148 --- 61 0 126 \` 38 2 145 ga " !! 29 1 161 ¡ " c| 55 2 162 ct " ¢ " L- 55 2 163 £ " ps " xo 55 0 164 ¤ " cr " Y- 55 2 165 ¥ " yn " || 67 2 166 ¦ " so 62 3 167 sc " § " "" 37 2 168 ¨ " :a " co 75 2 169 © " a_ 37 2 170 ª " << 43 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 49 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 38 2 180 aa " ´ " /u 61 1 181 µ " P! 56 3 182 pg " ¶ " .^ 28 0 183 · " ,, 32 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 43 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 59 1 191 ¿ " A` 74 2 192 À " A' 74 2 193 Á " A^ 74 2 194  " A~ 74 2 195 à " A" 74 2 196 Ä " A* 74 2 197 Å " AE 99 2 198 Æ " C, 81 3 199 Ç " E` 54 2 200 È " E' 54 2 201 É " E^ 54 2 202 Ê " E" 54 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 79 2 208 Ð " N~ 74 2 209 Ñ " O` 87 2 210 Ò " O' 87 2 211 Ó " O^ 87 2 212 Ô " O~ 87 2 213 Õ " O" 87 2 214 Ö " xx 61 0 215 × " O/ 87 2 216 Ø " U` 66 2 217 Ù " U' 66 2 218 Ú " U^ 66 2 219 Û " U" 66 2 220 Ü " Y' 59 2 221 Ý " TH 59 2 222 Þ " ss 55 2 223 ß " a` 68 2 224 à " a' 68 2 225 á " a^ 68 2 226 â " a~ 68 2 227 ã " a" 68 2 228 ä " a* 68 2 229 å " ae 116 0 230 æ " c, 65 1 231 ç " e` 65 2 232 è " e' 65 2 233 é " e^ 65 2 234 ê " e" 65 2 235 ë " i` 20 2 236 ì " i' 20 2 237 í " i^ 20 2 238 î " i" 20 2 239 ï " d- 66 2 240 ð " n~ 61 2 241 ñ " o` 66 2 242 ò " o' 66 2 243 ó " o^ 66 2 244 ô " o~ 66 2 245 õ " o" 66 2 246 ö " -: 61 0 247 ÷ " o/ 65 0 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 54 3 253 ý " th 68 3 254 þ " y" 54 3 255 ÿ " 9base-6/troff/font/devutf/DejaVuCondensedSans0000644000175000017500000007277411402154555020723 0ustar anselmanselmname DejaVuCondensedSans fontname DejaVuCondensedSans spacewidth 29 charset ! 38 2 33 0021 " 44 2 34 0022 dq " dq " # 80 2 35 0023 $ 60 3 36 0024 % 90 2 37 0025 & 74 2 38 0026 ( 37 3 40 0028 ) 37 3 41 0029 * 47 2 42 002a + 80 2 43 002b , 30 1 44 002c - 34 0 45 002d . 30 0 46 002e / 32 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 32 0 58 003a ; 32 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 50 2 63 003f @ 95 3 64 0040 A 65 2 65 0041 B 65 2 66 0042 C 66 2 67 0043 D 73 2 68 0044 E 60 2 69 0045 F 55 2 70 0046 G 73 2 71 0047 H 71 2 72 0048 I 28 2 73 0049 J 27 3 74 004a K 63 2 75 004b L 53 2 76 004c M 82 2 77 004d N 71 2 78 004e O 75 2 79 004f P 58 2 80 0050 Q 75 3 81 0051 R 66 2 82 0052 S 60 2 83 0053 T 58 2 84 0054 U 70 2 85 0055 V 65 2 86 0056 W 94 2 87 0057 X 65 2 88 0058 Y 58 2 89 0059 Z 65 2 90 005a [ 37 3 91 005b \ 32 3 92 005c bs " ] 37 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 58 0 97 0061 b 60 2 98 0062 c 52 0 99 0063 d 60 2 100 0064 e 58 0 101 0065 f 34 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 26 2 105 0069 j 26 3 106 006a k 55 2 107 006b l 26 2 108 006c m 93 0 109 006d n 60 0 110 006e o 58 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 40 0 114 0072 s 50 0 115 0073 t 37 2 116 0074 u 60 0 117 0075 v 56 0 118 0076 w 78 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 50 0 122 007a { 60 3 123 007b | 32 3 124 007c } 60 3 125 007d ~ 80 0 126 007e   57 0 160 00a0 ¡ 38 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 32 3 166 00a6 § 47 3 167 00a7 ¨ 47 2 168 00a8 © 95 2 169 00a9 ª 45 2 170 00aa « 58 0 171 00ab ¬ 80 0 172 00ac ­ 34 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 47 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 38 2 178 00b2 ³ 38 2 179 00b3 ´ 48 2 180 00b4 aa " µ 61 1 181 00b5 ¶ 60 3 182 00b6 · 30 0 183 00b7 ¸ 47 1 184 00b8 ¹ 38 2 185 00b9 º 45 2 186 00ba » 58 0 187 00bb ¼ 92 2 188 00bc ½ 92 2 189 00bd ¾ 92 2 190 00be ¿ 50 2 191 00bf À 65 2 192 00c0 Á 65 2 193 00c1  65 2 194 00c2 à 65 2 195 00c3 Ä 65 2 196 00c4 Å 65 2 197 00c5 Æ 92 2 198 00c6 Ç 66 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 28 2 204 00cc Í 28 2 205 00cd Î 28 2 206 00ce Ï 28 2 207 00cf Ð 73 2 208 00d0 Ñ 71 2 209 00d1 Ò 75 2 210 00d2 Ó 75 2 211 00d3 Ô 75 2 212 00d4 Õ 75 2 213 00d5 Ö 75 2 214 00d6 × 80 0 215 00d7 mu " Ø 75 2 216 00d8 Ù 70 2 217 00d9 Ú 70 2 218 00da Û 70 2 219 00db Ü 70 2 220 00dc Ý 58 2 221 00dd Þ 58 2 222 00de ß 60 2 223 00df à 58 2 224 00e0 á 58 2 225 00e1 â 58 2 226 00e2 ã 58 2 227 00e3 ä 58 2 228 00e4 å 58 2 229 00e5 æ 93 0 230 00e6 ç 52 1 231 00e7 è 58 2 232 00e8 é 58 2 233 00e9 ê 58 2 234 00ea ë 58 2 235 00eb ì 26 2 236 00ec í 27 2 237 00ed î 26 2 238 00ee ï 26 2 239 00ef ð 58 2 240 00f0 ñ 60 2 241 00f1 ò 58 2 242 00f2 ó 58 2 243 00f3 ô 58 2 244 00f4 õ 58 2 245 00f5 ö 58 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 58 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 56 3 253 00fd þ 60 3 254 00fe ÿ 56 3 255 00ff ā 58 2 257 0101 Ă 65 2 258 0102 ă 58 2 259 0103 Ą 65 3 260 0104 ą 58 1 261 0105 Ć 66 2 262 0106 ć 52 2 263 0107 Ĉ 66 2 264 0108 ĉ 52 2 265 0109 Ċ 66 2 266 010a ċ 52 2 267 010b Č 66 2 268 010c č 52 2 269 010d Ď 73 2 270 010e ď 61 2 271 010f Đ 73 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 58 2 275 0113 Ĕ 60 2 276 0114 ĕ 58 2 277 0115 Ė 60 2 278 0116 ė 58 2 279 0117 Ę 60 3 280 0118 ę 58 1 281 0119 Ě 60 2 282 011a ě 58 2 283 011b Ĝ 73 2 284 011c ĝ 60 3 285 011d Ğ 73 2 286 011e ğ 60 3 287 011f Ġ 73 2 288 0120 ġ 60 3 289 0121 Ģ 73 3 290 0122 ģ 60 3 291 0123 Ĥ 71 2 292 0124 ĥ 60 2 293 0125 Ħ 87 2 294 0126 ħ 66 2 295 0127 Ĩ 28 2 296 0128 ĩ 26 2 297 0129 Ī 28 2 298 012a ī 26 2 299 012b Ĭ 28 2 300 012c ĭ 26 2 301 012d Į 28 3 302 012e į 27 3 303 012f İ 28 2 304 0130 ı 26 0 305 0131 IJ 56 3 306 0132 ij 53 3 307 0133 Ĵ 28 3 308 0134 ĵ 26 3 309 0135 Ķ 63 3 310 0136 ķ 55 3 311 0137 ĸ 55 0 312 0138 Ĺ 53 2 313 0139 ĺ 28 2 314 013a Ļ 53 3 315 013b ļ 26 3 316 013c Ľ 53 2 317 013d ľ 36 2 318 013e Ŀ 53 2 319 013f ŀ 33 2 320 0140 Ł 53 2 321 0141 ł 27 2 322 0142 Ń 71 2 323 0143 ń 60 2 324 0144 Ņ 71 3 325 0145 ņ 60 1 326 0146 Ň 71 2 327 0147 ň 60 2 328 0148 ʼn 77 2 329 0149 Ŋ 71 3 330 014a ŋ 60 1 331 014b Ō 75 2 332 014c ō 58 2 333 014d Ŏ 75 2 334 014e ŏ 58 2 335 014f Ő 75 2 336 0150 ő 58 2 337 0151 Œ 102 2 338 0152 œ 97 0 339 0153 Ŕ 66 2 340 0154 ŕ 40 2 341 0155 Ŗ 66 3 342 0156 ŗ 39 1 343 0157 Ř 66 2 344 0158 ř 40 2 345 0159 Ś 60 2 346 015a ś 50 2 347 015b Ŝ 60 2 348 015c ŝ 50 2 349 015d Ş 60 3 350 015e ş 50 1 351 015f Š 60 2 352 0160 š 50 2 353 0161 Ţ 58 3 354 0162 ţ 37 3 355 0163 Ť 58 2 356 0164 ť 37 2 357 0165 Ŧ 58 2 358 0166 ŧ 37 2 359 0167 Ũ 70 2 360 0168 ũ 60 2 361 0169 Ū 70 2 362 016a ū 60 2 363 016b Ŭ 70 2 364 016c ŭ 60 2 365 016d Ů 70 2 366 016e ů 60 2 367 016f Ű 70 2 368 0170 ű 60 2 369 0171 Ų 70 3 370 0172 ų 61 1 371 0173 Ŵ 94 2 372 0174 ŵ 78 2 373 0175 Ŷ 58 2 374 0176 ŷ 56 3 375 0177 Ÿ 58 2 376 0178 Ź 65 2 377 0179 ź 50 2 378 017a Ż 65 2 379 017b ż 50 2 380 017c Ž 65 2 381 017d ž 50 2 382 017e ſ 34 2 383 017f ƀ 60 2 384 0180 Ɓ 69 2 385 0181 Ƃ 65 2 386 0182 ƃ 60 2 387 0183 Ƅ 65 2 388 0184 ƅ 60 2 389 0185 Ɔ 66 2 390 0186 Ƈ 67 2 391 0187 ƈ 53 2 392 0188 Ɖ 73 2 393 0189 Ɗ 78 2 394 018a Ƌ 65 2 395 018b ƌ 60 2 396 018c ƍ 58 1 397 018d Ǝ 60 2 398 018e Ə 75 2 399 018f Ɛ 60 2 400 0190 Ƒ 54 3 401 0191 ƒ 33 3 402 0192 Ɠ 74 2 403 0193 Ɣ 65 3 404 0194 ƕ 92 2 405 0195 Ɩ 34 2 406 0196 Ɨ 28 2 407 0197 Ƙ 66 2 408 0198 ƙ 55 2 409 0199 ƚ 26 2 410 019a ƛ 56 2 411 019b Ɯ 93 2 412 019c Ɲ 70 3 413 019d ƞ 60 1 414 019e Ɵ 75 2 415 019f Ơ 76 2 416 01a0 ơ 59 0 417 01a1 Ƣ 76 2 418 01a2 ƣ 59 1 419 01a3 Ƥ 61 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 58 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 49 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 31 3 426 01aa ƫ 37 3 427 01ab Ƭ 58 2 428 01ac ƭ 37 2 429 01ad Ʈ 58 3 430 01ae Ư 71 2 431 01af ư 61 0 432 01b0 Ʊ 73 2 433 01b1 Ʋ 69 2 434 01b2 Ƴ 66 2 435 01b3 ƴ 76 1 436 01b4 Ƶ 65 2 437 01b5 ƶ 50 0 438 01b6 Ʒ 63 2 439 01b7 Ƹ 63 2 440 01b8 ƹ 55 1 441 01b9 ƻ 60 2 443 01bb Ƽ 63 2 444 01bc ƽ 55 1 445 01bd ƾ 48 2 446 01be ǀ 28 3 448 01c0 ǁ 47 3 449 01c1 ǂ 44 3 450 01c2 ǃ 28 2 451 01c3 DŽ 135 2 452 01c4 Dž 123 2 453 01c5 dž 110 2 454 01c6 LJ 80 3 455 01c7 Lj 75 3 456 01c8 lj 43 3 457 01c9 NJ 89 3 458 01ca Nj 88 3 459 01cb nj 76 3 460 01cc Ǎ 65 2 461 01cd ǎ 58 2 462 01ce Ǐ 28 2 463 01cf ǐ 26 2 464 01d0 Ǒ 75 2 465 01d1 ǒ 58 2 466 01d2 Ǔ 70 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 71 2 471 01d7 ǘ 62 2 472 01d8 Ǚ 71 2 473 01d9 ǚ 62 2 474 01da Ǜ 71 2 475 01db ǜ 62 2 476 01dc ǝ 58 0 477 01dd ǟ 58 2 479 01df Ǣ 92 2 482 01e2 ǣ 93 2 483 01e3 Ǫ 75 3 490 01ea ǫ 58 1 491 01eb Ǭ 75 3 492 01ec ǭ 58 3 493 01ed DZ 135 2 497 01f1 Dz 123 2 498 01f2 dz 110 2 499 01f3 Ƕ 106 2 502 01f6 Ș 60 3 536 0218 ș 50 1 537 0219 Ț 58 3 538 021a ț 37 3 539 021b Ȥ 65 3 548 0224 ȥ 50 1 549 0225 ȫ 58 2 555 022b ȭ 58 2 557 022d Ȯ 75 2 558 022e ȯ 58 2 559 022f ȱ 58 2 561 0231 Ȳ 58 2 562 0232 ȳ 56 3 563 0233 ȷ 26 1 567 0237 ȸ 95 2 568 0238 ȹ 95 1 569 0239 Ⱥ 65 2 570 023a Ȼ 66 2 571 023b ȼ 52 0 572 023c Ƚ 53 2 573 023d Ⱦ 58 2 574 023e ȿ 50 1 575 023f ɀ 50 1 576 0240 Ɂ 49 2 577 0241 ɐ 58 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 52 0 596 0254 ɕ 52 1 597 0255 ɖ 61 3 598 0256 ɗ 69 2 599 0257 ɘ 58 0 600 0258 ə 58 0 601 0259 ɚ 76 0 602 025a ɛ 52 0 603 025b ɜ 52 0 604 025c ɝ 73 0 605 025d ɞ 65 0 606 025e ɟ 34 1 607 025f ɠ 61 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 65 1 611 0263 ɤ 56 0 612 0264 ɥ 60 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 35 2 616 0268 ɩ 37 0 617 0269 ɪ 35 0 618 026a ɫ 46 2 619 026b ɬ 46 2 620 026c ɭ 27 3 621 026d ɮ 60 3 622 026e ɯ 93 0 623 026f ɰ 93 1 624 0270 ɱ 93 1 625 0271 ɲ 61 1 626 0272 ɳ 62 1 627 0273 ɴ 60 0 628 0274 ɵ 58 0 629 0275 ɶ 81 0 630 0276 ɷ 69 0 631 0277 ɸ 58 3 632 0278 ɹ 44 0 633 0279 ɺ 44 2 634 027a ɻ 45 1 635 027b ɼ 44 1 636 027c ɽ 44 1 637 027d ɾ 42 0 638 027e ɿ 42 0 639 027f ʀ 57 0 640 0280 ʁ 57 0 641 0281 ʂ 50 1 642 0282 ʃ 32 3 643 0283 ʄ 36 3 644 0284 ʅ 44 1 645 0285 ʆ 31 3 646 0286 ʇ 37 1 647 0287 ʈ 37 3 648 0288 ʉ 60 0 649 0289 ʊ 59 0 650 028a ʋ 57 0 651 028b ʌ 56 0 652 028c ʍ 78 0 653 028d ʎ 56 2 654 028e ʏ 58 0 655 028f ʐ 50 1 656 0290 ʑ 50 1 657 0291 ʒ 55 1 658 0292 ʓ 55 1 659 0293 ʔ 48 2 660 0294 ʕ 48 2 661 0295 ʖ 48 2 662 0296 ʗ 48 3 663 0297 ʘ 57 0 664 0298 ʙ 55 0 665 0299 ʚ 65 0 666 029a ʛ 68 2 667 029b ʜ 60 0 668 029c ʝ 34 3 669 029d ʞ 63 1 670 029e ʟ 55 0 671 029f ʠ 69 3 672 02a0 ʡ 48 2 673 02a1 ʢ 48 2 674 02a2 ʣ 96 2 675 02a3 ʤ 100 3 676 02a4 ʥ 96 3 677 02a5 ʦ 78 2 678 02a6 ʧ 58 3 679 02a7 ʨ 74 3 680 02a8 ʩ 80 3 681 02a9 ʪ 61 2 682 02aa ʫ 62 2 683 02ab ʬ 49 2 684 02ac ʭ 49 2 685 02ad ʮ 54 3 686 02ae ʯ 63 3 687 02af ʰ 38 2 688 02b0 ʱ 38 2 689 02b1 ʲ 16 2 690 02b2 ʳ 25 2 691 02b3 ʴ 28 2 692 02b4 ʵ 28 2 693 02b5 ʶ 36 2 694 02b6 ʷ 49 2 695 02b7 ʸ 35 2 696 02b8 ʻ 30 2 699 02bb ʼ 30 2 700 02bc ʾ 29 2 702 02be ʿ 29 2 703 02bf ˀ 35 2 704 02c0 ˁ 35 2 705 02c1 ˆ 47 2 710 02c6 ˇ 47 2 711 02c7 ˈ 26 2 712 02c8 ˌ 26 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 29 2 722 02d2 ˓ 29 0 723 02d3 ˖ 40 0 726 02d6 ˘ 47 2 728 02d8 ˙ 47 2 729 02d9 ˚ 47 2 730 02da ˛ 48 1 731 02db ˜ 47 2 732 02dc ˝ 48 2 733 02dd ˞ 30 0 734 02de ˠ 40 2 736 02e0 ˡ 16 2 737 02e1 ˢ 35 2 738 02e2 ˣ 42 2 739 02e3 ˤ 35 2 740 02e4 ˥ 47 2 741 02e5 ˦ 47 2 742 02e6 ˧ 47 2 743 02e7 ˨ 47 2 744 02e8 ˩ 47 2 745 02e9 ́ 48 2 769 0301 ̂ 47 2 770 0302 ̃ 47 2 771 0303 ̄ 47 2 772 0304 ̅ 0 2 773 0305 ̆ 47 2 774 0306 ̇ 47 2 775 0307 ̈ 47 2 776 0308 ̉ 0 2 777 0309 ̊ 47 2 778 030a ̋ 48 2 779 030b ̌ 47 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 30 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 49 1 801 0321 ̢ 47 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 26 2 884 0374 ͵ 26 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 48 2 900 0384 ΅ 48 2 901 0385 Ά 66 2 902 0386 · 30 0 903 0387 Έ 70 2 904 0388 Ή 82 2 905 0389 Ί 38 2 906 038a Ό 77 2 908 038c Ύ 78 2 910 038e Ώ 78 2 911 038f ΐ 32 2 912 0390 Α 65 2 913 0391 Β 65 2 914 0392 Γ 53 2 915 0393 Δ 65 2 916 0394 Ε 60 2 917 0395 Ζ 65 2 918 0396 Η 71 2 919 0397 Θ 75 2 920 0398 Ι 28 2 921 0399 Κ 63 2 922 039a Λ 65 2 923 039b Μ 82 2 924 039c Ν 71 2 925 039d Ξ 60 2 926 039e Ο 75 2 927 039f Π 71 2 928 03a0 Ρ 58 2 929 03a1 Σ 60 2 931 03a3 Τ 58 2 932 03a4 Υ 58 2 933 03a5 Φ 75 2 934 03a6 Χ 65 2 935 03a7 Ψ 75 2 936 03a8 Ω 73 2 937 03a9 Ϊ 31 2 938 03aa Ϋ 60 2 939 03ab ά 63 2 940 03ac έ 52 2 941 03ad ή 62 3 942 03ae ί 32 2 943 03af ΰ 55 2 944 03b0 α 63 0 945 03b1 β 61 3 946 03b2 γ 56 1 947 03b3 δ 58 2 948 03b4 ε 51 0 949 03b5 ζ 52 3 950 03b6 η 60 1 951 03b7 θ 58 2 952 03b8 ι 32 0 953 03b9 κ 56 0 954 03ba λ 56 2 955 03bb μ 61 1 956 03bc ν 53 0 957 03bd ξ 53 3 958 03be ο 58 0 959 03bf π 57 0 960 03c0 ρ 60 1 961 03c1 ς 56 1 962 03c2 σ 60 0 963 03c3 τ 57 0 964 03c4 υ 55 0 965 03c5 φ 63 1 966 03c6 χ 56 1 967 03c7 ψ 63 1 968 03c8 ω 80 0 969 03c9 ϊ 32 2 970 03ca ϋ 55 2 971 03cb ό 58 2 972 03cc ύ 55 2 973 03cd ώ 80 2 974 03ce ϐ 58 2 976 03d0 ϑ 59 2 977 03d1 ϒ 66 2 978 03d2 ϓ 80 2 979 03d3 ϔ 68 2 980 03d4 ϕ 63 3 981 03d5 ϖ 80 0 982 03d6 ϗ 63 1 983 03d7 Ϙ 75 3 984 03d8 ϙ 58 1 985 03d9 Ϛ 62 3 986 03da ϛ 56 1 987 03db Ϝ 55 2 988 03dc ϝ 43 3 989 03dd Ϟ 63 2 990 03de ϟ 63 2 991 03df Ϡ 82 3 992 03e0 ϡ 60 1 993 03e1 ϰ 63 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 52 0 1010 03f2 ϳ 26 3 1011 03f3 ϴ 75 2 1012 03f4 ϵ 58 0 1013 03f5 ϶ 58 0 1014 03f6 Ϸ 58 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 66 2 1017 03f9 Ϻ 82 2 1018 03fa ϻ 62 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 66 2 1021 03fd Ͼ 66 2 1022 03fe Ͽ 66 2 1023 03ff Ё 60 2 1025 0401 Ђ 74 3 1026 0402 Ѓ 53 2 1027 0403 Є 66 2 1028 0404 Ѕ 60 2 1029 0405 І 28 2 1030 0406 Ї 28 2 1031 0407 Ј 27 3 1032 0408 Љ 104 2 1033 0409 Њ 99 2 1034 040a Ћ 74 2 1035 040b Ќ 63 2 1036 040c Ѝ 71 2 1037 040d Ў 58 2 1038 040e Џ 71 3 1039 040f А 65 2 1040 0410 Б 65 2 1041 0411 В 65 2 1042 0412 Г 53 2 1043 0413 Д 74 3 1044 0414 Е 60 2 1045 0415 Ж 82 2 1046 0416 З 60 2 1047 0417 И 71 2 1048 0418 Й 71 2 1049 0419 К 63 2 1050 041a Л 71 2 1051 041b М 82 2 1052 041c Н 71 2 1053 041d О 75 2 1054 041e П 71 2 1055 041f Р 58 2 1056 0420 С 66 2 1057 0421 Т 58 2 1058 0422 У 58 2 1059 0423 Ф 75 2 1060 0424 Х 65 2 1061 0425 Ц 74 3 1062 0426 Ч 65 2 1063 0427 Ш 95 2 1064 0428 Щ 98 3 1065 0429 Ъ 79 2 1066 042a Ы 84 2 1067 042b Ь 65 2 1068 042c Э 66 2 1069 042d Ю 98 2 1070 042e Я 66 2 1071 042f а 58 0 1072 0430 б 58 2 1073 0431 в 56 0 1074 0432 г 47 0 1075 0433 д 64 1 1076 0434 е 58 0 1077 0435 ж 70 0 1078 0436 з 51 0 1079 0437 и 62 0 1080 0438 й 62 2 1081 0439 к 58 0 1082 043a л 60 0 1083 043b м 72 0 1084 043c н 63 0 1085 043d о 58 0 1086 043e п 63 0 1087 043f р 60 1 1088 0440 с 52 0 1089 0441 т 50 0 1090 0442 у 56 1 1091 0443 ф 87 3 1092 0444 х 56 0 1093 0445 ц 65 1 1094 0446 ч 56 0 1095 0447 ш 83 0 1096 0448 щ 85 1 1097 0449 ъ 67 0 1098 044a ы 73 0 1099 044b ь 56 0 1100 044c э 58 0 1101 044d ю 77 0 1102 044e я 57 0 1103 044f ѐ 58 2 1104 0450 ё 58 2 1105 0451 ђ 61 3 1106 0452 ѓ 47 2 1107 0453 є 58 0 1108 0454 ѕ 50 0 1109 0455 і 26 2 1110 0456 ї 26 2 1111 0457 ј 26 3 1112 0458 љ 85 0 1113 0459 њ 85 0 1114 045a ћ 60 2 1115 045b ќ 58 2 1116 045c ѝ 62 2 1117 045d ў 56 3 1118 045e џ 63 1 1119 045f Ѥ 90 2 1124 0464 ѥ 71 0 1125 0465 Ҋ 75 3 1162 048a ҋ 65 3 1163 048b Ҍ 65 2 1164 048c ҍ 56 2 1165 048d Ґ 53 2 1168 0490 ґ 47 2 1169 0491 Ғ 53 2 1170 0492 ғ 47 0 1171 0493 Ҕ 60 3 1172 0494 ҕ 51 1 1173 0495 Җ 82 3 1174 0496 җ 70 1 1175 0497 Ҙ 60 3 1176 0498 ҙ 51 1 1177 0499 Қ 63 3 1178 049a қ 58 1 1179 049b Ҡ 76 2 1184 04a0 ҡ 68 0 1185 04a1 Ң 72 3 1186 04a2 ң 63 1 1187 04a3 Ҥ 97 2 1188 04a4 ҥ 84 0 1189 04a5 Ҧ 103 3 1190 04a6 ҧ 87 1 1191 04a7 Ҫ 66 3 1194 04aa ҫ 52 1 1195 04ab Ҭ 58 3 1196 04ac ҭ 50 1 1197 04ad Ү 58 2 1198 04ae ү 56 1 1199 04af Ұ 58 2 1200 04b0 ұ 56 1 1201 04b1 Ҳ 65 3 1202 04b2 ҳ 56 1 1203 04b3 Ҵ 89 3 1204 04b4 ҵ 77 1 1205 04b5 Ҷ 66 3 1206 04b6 ҷ 56 1 1207 04b7 Һ 65 2 1210 04ba һ 56 0 1211 04bb Ӏ 26 2 1216 04c0 Ӂ 83 2 1217 04c1 ӂ 70 2 1218 04c2 Ӆ 72 3 1221 04c5 ӆ 61 1 1222 04c6 Ӈ 71 3 1223 04c7 ӈ 63 1 1224 04c8 Ӊ 74 3 1225 04c9 ӊ 65 1 1226 04ca Ӌ 65 3 1227 04cb ӌ 56 1 1228 04cc Ӎ 85 3 1229 04cd ӎ 74 1 1230 04ce Ӑ 65 2 1232 04d0 ӑ 58 2 1233 04d1 Ӓ 67 2 1234 04d2 ӓ 58 2 1235 04d3 Ӕ 92 2 1236 04d4 ӕ 93 0 1237 04d5 Ӗ 62 2 1238 04d6 ӗ 58 2 1239 04d7 Ә 75 2 1240 04d8 ә 58 0 1241 04d9 Ӛ 76 2 1242 04da ӛ 58 2 1243 04db Ӝ 83 2 1244 04dc ӝ 70 2 1245 04dd Ӟ 62 2 1246 04de ӟ 51 2 1247 04df Ӡ 63 2 1248 04e0 ӡ 55 1 1249 04e1 Ӣ 71 2 1250 04e2 ӣ 62 2 1251 04e3 Ӥ 73 2 1252 04e4 ӥ 62 2 1253 04e5 Ӧ 76 2 1254 04e6 ӧ 58 2 1255 04e7 Ө 75 2 1256 04e8 ө 58 0 1257 04e9 Ӫ 77 2 1258 04ea ӫ 58 2 1259 04eb Ӭ 68 2 1260 04ec ӭ 53 2 1261 04ed Ӯ 58 2 1262 04ee ӯ 56 3 1263 04ef Ӱ 60 2 1264 04f0 ӱ 56 3 1265 04f1 Ӳ 60 2 1266 04f2 ӳ 56 3 1267 04f3 Ӵ 67 2 1268 04f4 ӵ 56 2 1269 04f5 Ӷ 53 3 1270 04f6 ӷ 47 1 1271 04f7 Ӹ 85 2 1272 04f8 ӹ 73 2 1273 04f9 Ա 83 2 1329 0531 Բ 70 2 1330 0532 Գ 84 2 1331 0533 Դ 84 2 1332 0534 Ե 70 2 1333 0535 Զ 61 3 1334 0536 Է 70 3 1335 0537 Ը 70 3 1336 0538 Թ 81 2 1337 0539 Ժ 84 2 1338 053a Ի 70 2 1339 053b Լ 60 3 1340 053c Խ 78 2 1341 053d Ծ 94 2 1342 053e Կ 70 2 1343 053f Հ 67 3 1344 0540 Ձ 61 2 1345 0541 Ղ 84 3 1346 0542 Ճ 74 2 1347 0543 Մ 84 2 1348 0544 Յ 70 2 1349 0545 Ն 80 2 1350 0546 Շ 70 2 1351 0547 Ո 70 2 1352 0548 Չ 70 3 1353 0549 Պ 75 2 1354 054a Ջ 61 3 1355 054b Ռ 84 2 1356 054c Ս 70 2 1357 054d Վ 84 3 1358 054e Տ 60 2 1359 054f Ր 70 2 1360 0550 Ց 70 2 1361 0551 Ւ 76 2 1362 0552 Փ 75 2 1363 0553 Ք 75 2 1364 0554 Օ 75 2 1365 0555 Ֆ 60 2 1366 0556 ՙ 29 2 1369 0559 ՚ 30 2 1370 055a ՛ 48 2 1371 055b ՜ 47 2 1372 055c ՝ 37 2 1373 055d ՞ 50 2 1374 055e ՟ 48 2 1375 055f ա 93 0 1377 0561 բ 60 1 1378 0562 գ 63 1 1379 0563 դ 64 1 1380 0564 զ 63 1 1382 0566 է 52 3 1383 0567 ը 60 1 1384 0568 թ 65 1 1385 0569 ժ 64 2 1386 056a ի 60 3 1387 056b լ 36 1 1388 056c խ 92 3 1389 056d ծ 60 2 1390 056e կ 60 3 1391 056f հ 60 2 1392 0570 ձ 60 2 1393 0571 ղ 64 1 1394 0572 ճ 60 2 1395 0573 մ 63 2 1396 0574 յ 26 1 1397 0575 ն 72 2 1398 0576 շ 49 1 1399 0577 ո 60 0 1400 0578 չ 43 1 1401 0579 պ 93 1 1402 057a ջ 49 1 1403 057b ռ 60 0 1404 057c ս 60 0 1405 057d վ 63 3 1406 057e տ 92 0 1407 057f ր 60 1 1408 0580 ց 60 1 1409 0581 ւ 36 0 1410 0582 փ 92 3 1411 0583 ք 61 1 1412 0584 օ 58 0 1413 0585 ֆ 58 3 1414 0586 և 66 2 1415 0587 ։ 32 0 1417 0589 ֊ 50 0 1418 058a ᴂ 93 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 26 1 7433 1d09 ᴔ 97 0 7444 1d14 ᴖ 58 0 7446 1d16 ᴗ 58 0 7447 1d17 ᴝ 70 0 7453 1d1d ᴞ 90 0 7454 1d1e ᴟ 60 1 7455 1d1f ᵃ 37 2 7491 1d43 ᵄ 37 2 7492 1d44 ᵅ 38 2 7493 1d45 ᵆ 61 2 7494 1d46 ᵇ 41 2 7495 1d47 ᵈ 38 2 7496 1d48 ᵉ 39 2 7497 1d49 ᵊ 39 2 7498 1d4a ᵋ 34 2 7499 1d4b ᵌ 34 2 7500 1d4c ᵍ 38 2 7501 1d4d ᵎ 17 2 7502 1d4e ᵏ 40 2 7503 1d4f ᵐ 59 2 7504 1d50 ᵑ 39 2 7505 1d51 ᵒ 39 2 7506 1d52 ᵓ 35 2 7507 1d53 ᵔ 39 2 7508 1d54 ᵕ 39 0 7509 1d55 ᵖ 41 2 7510 1d56 ᵗ 28 2 7511 1d57 ᵘ 38 2 7512 1d58 ᵙ 45 2 7513 1d59 ᵚ 59 2 7514 1d5a ᵛ 39 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 35 0 7547 1d7b ᶅ 27 3 7557 1d85 ᶛ 38 2 7579 1d9b ᶜ 35 2 7580 1d9c ᶝ 35 2 7581 1d9d ᶞ 39 2 7582 1d9e ᶟ 34 2 7583 1d9f ᶠ 28 2 7584 1da0 ᶡ 22 2 7585 1da1 ᶢ 38 2 7586 1da2 ᶣ 38 2 7587 1da3 ᶤ 25 2 7588 1da4 ᶥ 24 2 7589 1da5 ᶦ 25 2 7590 1da6 ᶧ 25 2 7591 1da7 ᶨ 22 2 7592 1da8 ᶩ 24 2 7593 1da9 ᶪ 22 2 7594 1daa ᶫ 36 2 7595 1dab ᶬ 59 2 7596 1dac ᶭ 59 2 7597 1dad ᶮ 39 2 7598 1dae ᶯ 46 2 7599 1daf ᶰ 39 2 7600 1db0 ᶱ 39 2 7601 1db1 ᶲ 39 2 7602 1db2 ᶳ 34 2 7603 1db3 ᶴ 27 2 7604 1db4 ᶵ 28 2 7605 1db5 ᶶ 48 2 7606 1db6 ᶷ 40 2 7607 1db7 ᶹ 39 2 7609 1db9 ᶺ 39 2 7610 1dba ᶻ 35 2 7611 1dbb ᶼ 41 2 7612 1dbc ᶽ 35 2 7613 1dbd ᶾ 37 2 7614 1dbe ᶿ 39 2 7615 1dbf Ḍ 73 3 7692 1e0c ḍ 60 3 7693 1e0d Ḓ 73 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 71 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 53 3 7734 1e36 ḷ 26 3 7735 1e37 Ḹ 53 3 7736 1e38 ḹ 26 3 7737 1e39 Ḽ 53 3 7740 1e3c ḽ 26 3 7741 1e3d ṁ 93 2 7745 1e41 Ṃ 82 3 7746 1e42 ṃ 93 1 7747 1e43 Ṅ 71 2 7748 1e44 ṅ 60 2 7749 1e45 Ṇ 71 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 71 3 7754 1e4a ṋ 60 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 66 3 7770 1e5a ṛ 39 1 7771 1e5b Ṝ 66 3 7772 1e5c ṝ 39 3 7773 1e5d ṡ 50 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 50 1 7779 1e63 Ṭ 58 3 7788 1e6c ṭ 37 3 7789 1e6d Ṱ 58 3 7792 1e70 ṱ 37 3 7793 1e71 Ṿ 65 3 7806 1e7e ṿ 56 1 7807 1e7f Ẁ 94 2 7808 1e80 ẁ 78 2 7809 1e81 Ẃ 94 2 7810 1e82 ẃ 78 2 7811 1e83 Ẅ 94 2 7812 1e84 ẅ 78 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 58 1 7865 1eb9 Ị 28 3 7882 1eca ị 26 3 7883 1ecb Ọ 75 3 7884 1ecc ọ 58 1 7885 1ecd Ụ 70 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 58 2 7922 1ef2 ỳ 56 3 7923 1ef3 ἁ 63 2 7937 1f01 ἂ 63 2 7938 1f02 ἃ 63 2 7939 1f03 ἄ 63 2 7940 1f04 ἅ 63 2 7941 1f05 ἆ 63 2 7942 1f06 ἇ 63 2 7943 1f07 Ἀ 65 2 7944 1f08 Ἁ 65 2 7945 1f09 Ἂ 83 2 7946 1f0a Ἃ 83 2 7947 1f0b Ἄ 73 2 7948 1f0c Ἅ 76 2 7949 1f0d Ἆ 67 2 7950 1f0e Ἇ 70 2 7951 1f0f ἐ 51 2 7952 1f10 ἑ 51 2 7953 1f11 ἒ 51 2 7954 1f12 ἓ 51 2 7955 1f13 ἔ 51 2 7956 1f14 ἕ 52 2 7957 1f15 Ἐ 67 2 7960 1f18 Ἑ 67 2 7961 1f19 Ἒ 91 2 7962 1f1a Ἓ 92 2 7963 1f1b Ἔ 85 2 7964 1f1c Ἕ 88 2 7965 1f1d ἠ 60 3 7968 1f20 ἡ 60 3 7969 1f21 ἢ 60 3 7970 1f22 ἣ 60 3 7971 1f23 ἤ 60 3 7972 1f24 ἥ 60 3 7973 1f25 ἦ 60 3 7974 1f26 ἧ 60 3 7975 1f27 Ἠ 79 2 7976 1f28 Ἡ 79 2 7977 1f29 Ἢ 102 2 7978 1f2a Ἣ 103 2 7979 1f2b Ἤ 97 2 7980 1f2c Ἥ 99 2 7981 1f2d Ἦ 88 2 7982 1f2e Ἧ 89 2 7983 1f2f ἰ 32 2 7984 1f30 ἱ 32 2 7985 1f31 ἲ 32 2 7986 1f32 ἳ 32 2 7987 1f33 ἴ 32 2 7988 1f34 ἵ 32 2 7989 1f35 ἶ 32 2 7990 1f36 ἷ 32 2 7991 1f37 Ἰ 36 2 7992 1f38 Ἱ 35 2 7993 1f39 Ἲ 60 2 7994 1f3a Ἳ 60 2 7995 1f3b Ἴ 54 2 7996 1f3c Ἵ 56 2 7997 1f3d Ἶ 46 2 7998 1f3e Ἷ 46 2 7999 1f3f ὀ 58 2 8000 1f40 ὁ 58 2 8001 1f41 ὂ 58 2 8002 1f42 ὃ 58 2 8003 1f43 ὄ 58 2 8004 1f44 ὅ 58 2 8005 1f45 Ὀ 76 2 8008 1f48 Ὁ 80 2 8009 1f49 Ὂ 103 2 8010 1f4a Ὃ 104 2 8011 1f4b Ὄ 89 2 8012 1f4c Ὅ 92 2 8013 1f4d ὐ 55 2 8016 1f50 ὑ 55 2 8017 1f51 ὒ 55 2 8018 1f52 ὓ 55 2 8019 1f53 ὔ 55 2 8020 1f54 ὕ 55 2 8021 1f55 ὖ 55 2 8022 1f56 ὗ 55 2 8023 1f57 Ὑ 74 2 8025 1f59 Ὓ 94 2 8027 1f5b Ὕ 96 2 8029 1f5d Ὗ 85 2 8031 1f5f ὠ 80 2 8032 1f60 ὡ 80 2 8033 1f61 ὢ 80 2 8034 1f62 ὣ 80 2 8035 1f63 ὤ 80 2 8036 1f64 ὥ 80 2 8037 1f65 ὦ 80 2 8038 1f66 ὧ 80 2 8039 1f67 Ὠ 76 2 8040 1f68 Ὡ 80 2 8041 1f69 Ὢ 103 2 8042 1f6a Ὣ 104 2 8043 1f6b Ὤ 90 2 8044 1f6c Ὥ 92 2 8045 1f6d Ὦ 87 2 8046 1f6e Ὧ 90 2 8047 1f6f ὰ 63 2 8048 1f70 ά 63 2 8049 1f71 ὲ 51 2 8050 1f72 έ 52 2 8051 1f73 ὴ 60 3 8052 1f74 ή 62 3 8053 1f75 ὶ 32 2 8054 1f76 ί 33 2 8055 1f77 ὸ 58 2 8056 1f78 ό 58 2 8057 1f79 ὺ 55 2 8058 1f7a ύ 55 2 8059 1f7b ὼ 80 2 8060 1f7c ώ 80 2 8061 1f7d ᾀ 63 3 8064 1f80 ᾁ 63 3 8065 1f81 ᾂ 63 3 8066 1f82 ᾃ 63 3 8067 1f83 ᾄ 63 3 8068 1f84 ᾅ 63 3 8069 1f85 ᾆ 63 3 8070 1f86 ᾇ 63 3 8071 1f87 ᾈ 65 3 8072 1f88 ᾉ 65 3 8073 1f89 ᾊ 83 3 8074 1f8a ᾋ 83 3 8075 1f8b ᾌ 73 3 8076 1f8c ᾍ 76 3 8077 1f8d ᾎ 67 3 8078 1f8e ᾏ 70 3 8079 1f8f ᾐ 60 3 8080 1f90 ᾑ 60 3 8081 1f91 ᾒ 60 3 8082 1f92 ᾓ 60 3 8083 1f93 ᾔ 60 3 8084 1f94 ᾕ 60 3 8085 1f95 ᾖ 60 3 8086 1f96 ᾗ 60 3 8087 1f97 ᾘ 79 3 8088 1f98 ᾙ 79 3 8089 1f99 ᾚ 102 3 8090 1f9a ᾛ 102 3 8091 1f9b ᾜ 97 3 8092 1f9c ᾝ 99 3 8093 1f9d ᾞ 88 3 8094 1f9e ᾟ 89 3 8095 1f9f ᾠ 80 3 8096 1fa0 ᾡ 80 3 8097 1fa1 ᾢ 80 3 8098 1fa2 ᾣ 80 3 8099 1fa3 ᾤ 80 3 8100 1fa4 ᾥ 80 3 8101 1fa5 ᾦ 80 3 8102 1fa6 ᾧ 80 3 8103 1fa7 ᾨ 76 3 8104 1fa8 ᾩ 80 3 8105 1fa9 ᾪ 103 3 8106 1faa ᾫ 103 3 8107 1fab ᾬ 89 3 8108 1fac ᾭ 92 3 8109 1fad ᾮ 87 3 8110 1fae ᾯ 90 3 8111 1faf ᾰ 63 2 8112 1fb0 ᾱ 63 2 8113 1fb1 ᾲ 63 3 8114 1fb2 ᾳ 63 1 8115 1fb3 ᾴ 63 3 8116 1fb4 ᾶ 63 2 8118 1fb6 ᾷ 63 3 8119 1fb7 Ᾰ 67 2 8120 1fb8 Ᾱ 65 2 8121 1fb9 Ὰ 68 2 8122 1fba Ά 66 2 8123 1fbb ᾼ 65 3 8124 1fbc ᾽ 47 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 47 2 8127 1fbf ῀ 47 2 8128 1fc0 ῁ 47 2 8129 1fc1 ῂ 60 3 8130 1fc2 ῃ 60 1 8131 1fc3 ῄ 62 3 8132 1fc4 ῆ 60 3 8134 1fc6 ῇ 60 3 8135 1fc7 Ὲ 76 2 8136 1fc8 Έ 70 2 8137 1fc9 Ὴ 88 2 8138 1fca Ή 82 2 8139 1fcb ῌ 71 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 47 2 8143 1fcf ῐ 32 2 8144 1fd0 ῑ 32 2 8145 1fd1 ῒ 32 2 8146 1fd2 ΐ 32 2 8147 1fd3 ῖ 32 2 8150 1fd6 ῗ 32 2 8151 1fd7 Ῐ 31 2 8152 1fd8 Ῑ 28 2 8153 1fd9 Ὶ 45 2 8154 1fda Ί 38 2 8155 1fdb ῝ 47 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 47 2 8159 1fdf ῠ 55 2 8160 1fe0 ῡ 55 2 8161 1fe1 ῢ 55 2 8162 1fe2 ΰ 55 2 8163 1fe3 ῤ 60 3 8164 1fe4 ῥ 60 3 8165 1fe5 ῦ 55 2 8166 1fe6 ῧ 55 2 8167 1fe7 Ῠ 60 2 8168 1fe8 Ῡ 58 2 8169 1fe9 Ὺ 80 2 8170 1fea Ύ 78 2 8171 1feb Ῥ 65 2 8172 1fec ῭ 47 2 8173 1fed ΅ 48 2 8174 1fee ` 47 2 8175 1fef ῲ 80 3 8178 1ff2 ῳ 80 1 8179 1ff3 ῴ 80 3 8180 1ff4 ῶ 80 2 8182 1ff6 ῷ 80 3 8183 1ff7 Ὸ 89 2 8184 1ff8 Ό 77 2 8185 1ff9 Ὼ 87 2 8186 1ffa Ώ 78 2 8187 1ffb ῼ 73 3 8188 1ffc ´ 48 2 8189 1ffd ῾ 47 2 8190 1ffe ‐ 34 0 8208 2010 ‑ 34 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 30 2 8216 2018 ` " ‘ " ’ 30 2 8217 2019 ' " ’ " ‚ 30 1 8218 201a ‛ 30 2 8219 201b “ 49 2 8220 201c ” 49 2 8221 201d „ 49 1 8222 201e ‟ 49 2 8223 201f † 47 3 8224 2020 ‡ 47 3 8225 2021 • 56 0 8226 2022 ‣ 56 0 8227 2023 ․ 32 0 8228 2024 ‥ 63 0 8229 2025 … 95 0 8230 2026 ‰ 127 2 8240 2030 ‱ 165 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 46 2 8252 203c ‽ 50 2 8253 203d ‾ 47 2 8254 203e ⁇ 88 2 8263 2047 ⁈ 70 2 8264 2048 ⁉ 70 2 8265 2049 ⁰ 38 2 8304 2070 ⁴ 38 2 8308 2074 ⁵ 38 2 8309 2075 ⁶ 38 2 8310 2076 ⁷ 38 2 8311 2077 ⁸ 38 2 8312 2078 ⁹ 38 2 8313 2079 ⁿ 38 2 8319 207f ₦ 71 2 8358 20a6 € 60 2 8364 20ac ₵ 61 3 8373 20b5 ℃ 107 2 8451 2103 № 111 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 73 2 8486 2126 ℧ 73 2 8487 2127 K 63 2 8490 212a Å 65 2 8491 212b Ⅎ 55 2 8498 2132 ⅋ 74 2 8523 214b Ⅰ 28 2 8544 2160 Ⅱ 47 2 8545 2161 Ⅲ 65 2 8546 2162 Ⅳ 88 2 8547 2163 Ⅴ 65 2 8548 2164 Ⅵ 87 2 8549 2165 Ⅶ 106 2 8550 2166 Ⅷ 125 2 8551 2167 Ⅸ 87 2 8552 2168 Ⅹ 65 2 8553 2169 Ⅺ 88 2 8554 216a Ⅻ 107 2 8555 216b Ⅼ 53 2 8556 216c Ⅽ 66 2 8557 216d Ⅾ 73 2 8558 216e Ⅿ 82 2 8559 216f ⅰ 26 2 8560 2170 ⅱ 43 2 8561 2171 ⅲ 60 2 8562 2172 ⅳ 77 2 8563 2173 ⅴ 56 0 8564 2174 ⅵ 77 2 8565 2175 ⅶ 94 2 8566 2176 ⅷ 111 2 8567 2177 ⅸ 78 2 8568 2178 ⅹ 56 0 8569 2179 ⅺ 78 2 8570 217a ⅻ 95 2 8571 217b ⅼ 26 2 8572 217c ⅽ 52 0 8573 217d ⅾ 60 2 8574 217e ⅿ 93 0 8575 217f ↀ 118 2 8576 2180 Ↄ 66 2 8579 2183 ∂ 49 2 8706 2202 pd " ∃ 60 2 8707 2203 te " ∆ 64 2 8710 2206 ∇ 64 2 8711 2207 gr " ∊ 75 0 8714 220a ∍ 75 0 8717 220d st " ∏ 72 3 8719 220f ∐ 72 3 8720 2210 ∑ 64 3 8721 2211 − 80 0 8722 2212 ∓ 80 2 8723 2213 ∕ 16 2 8725 2215 ∗ 59 0 8727 2217 ** " ∘ 59 0 8728 2218 ∙ 30 0 8729 2219 bu " √ 61 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 70 0 8743 2227 l∧ 70 0 8743 2227 " ∨ 70 0 8744 2228 l| " ∩ 70 0 8745 2229 ca " ∪ 70 0 8746 222a cu " ∫ 49 3 8747 222b is " ∬ 81 3 8748 222c ∭ 112 3 8749 222d ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≣ 80 2 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 49 2 8977 2311 ⌘ 95 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 50 3 8992 2320 ⌡ 48 3 8993 2321 ⌥ 95 2 8997 2325 〈 37 3 9001 2329 〉 37 3 9002 232a ⍽ 72 1 9085 237d ⎮ 49 3 9134 23ae ⏏ 73 0 9167 23cf ␢ 60 2 9250 2422 ␣ 60 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 56 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 56 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⚀ 83 2 9856 2680 ⚁ 83 2 9857 2681 ⚂ 83 2 9858 2682 ⚃ 83 2 9859 2683 ⚄ 83 2 9860 2684 ⚅ 83 2 9861 2685 ⟠ 47 3 10208 27e0 ⟨ 37 3 10216 27e8 ⟩ 37 3 10217 27e9 ⟪ 53 3 10218 27ea ⟫ 53 3 10219 27eb ⧫ 47 3 10731 29eb ⨌ 144 3 10764 2a0c ⨍ 78 3 10765 2a0d ⨎ 78 3 10766 2a0e ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 59 2 64257 fb01 fl 59 2 64258 fb02 ffi 91 2 64259 fb03 ffl 91 2 64260 fb04 ﬓ 114 2 64275 fb13 ﬔ 114 2 64276 fb14 ﬕ 114 3 64277 fb15 ﬖ 113 3 64278 fb16 ﬗ 145 3 64279 fb17 � 97 3 65533 fffd 9base-6/troff/font/devutf/LuxiSerif0000644000175000017500000001427711402154555017001 0ustar anselmanselmname LuxiSerif fontname LuxiSerif spacewidth 25 charset ! 33 2 33 0021 " 41 2 34 0022 dq " dq " # 50 2 35 0023 $ 50 3 36 0024 % 83 2 37 0025 & 78 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 50 2 42 002a + 56 0 43 002b , 25 1 44 002c - 33 0 45 002d . 25 0 46 002e / 28 3 47 002f 0 50 2 48 0030 1 50 2 49 0031 2 50 2 50 0032 3 50 2 51 0033 4 50 2 52 0034 5 50 2 53 0035 6 50 2 54 0036 7 50 2 55 0037 8 50 2 56 0038 9 50 2 57 0039 : 28 0 58 003a ; 28 1 59 003b < 56 0 60 003c = 56 0 61 003d > 56 0 62 003e ? 44 2 63 003f @ 92 2 64 0040 A 72 2 65 0041 B 67 2 66 0042 C 67 2 67 0043 D 72 2 68 0044 E 61 2 69 0045 F 56 2 70 0046 G 72 2 71 0047 H 72 2 72 0048 I 33 2 73 0049 J 39 3 74 004a K 72 2 75 004b L 61 2 76 004c M 89 2 77 004d N 72 2 78 004e O 72 2 79 004f P 56 2 80 0050 Q 72 3 81 0051 R 67 2 82 0052 S 56 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 72 2 86 0056 W 94 2 87 0057 X 72 2 88 0058 Y 72 2 89 0059 Z 61 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 47 2 94 005e _ 50 1 95 005f a 44 0 97 0061 b 50 2 98 0062 c 44 0 99 0063 d 50 2 100 0064 e 44 0 101 0065 f 33 2 102 0066 g 50 1 103 0067 h 50 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 50 2 107 006b l 28 2 108 006c m 78 0 109 006d n 50 0 110 006e o 50 0 111 006f p 50 1 112 0070 q 50 1 113 0071 r 33 0 114 0072 s 39 0 115 0073 t 28 2 116 0074 u 50 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 44 0 122 007a { 48 3 123 007b | 20 3 124 007c } 48 3 125 007d ~ 54 0 126 007e € 50 2 128 0080   25 0 160 00a0 ¡ 33 1 161 00a1 ¢ 50 2 162 00a2 £ 50 2 163 00a3 ¤ 50 0 164 00a4 ¥ 50 2 165 00a5 ¦ 20 3 166 00a6 § 50 3 167 00a7 ¨ 33 2 168 00a8 © 76 2 169 00a9 ª 28 2 170 00aa « 50 0 171 00ab ¬ 56 0 172 00ac ­ 33 0 173 00ad hy " ® 76 2 174 00ae rg " ¯ 50 2 175 00af ° 40 2 176 00b0 ± 56 0 177 00b1 +- " ² 30 2 178 00b2 ³ 30 2 179 00b3 ´ 33 2 180 00b4 aa " µ 50 1 181 00b5 ¶ 45 3 182 00b6 · 25 0 183 00b7 ¸ 33 1 184 00b8 ¹ 30 2 185 00b9 º 31 2 186 00ba » 50 0 187 00bb ¼ 75 2 188 00bc ½ 75 2 189 00bd ¾ 75 2 190 00be ¿ 44 2 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 89 2 198 00c6 Ç 67 3 199 00c7 È 61 2 200 00c8 É 61 2 201 00c9 Ê 61 2 202 00ca Ë 61 2 203 00cb Ì 33 2 204 00cc Í 33 2 205 00cd Î 33 2 206 00ce Ï 33 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 72 2 210 00d2 Ó 72 2 211 00d3 Ô 72 2 212 00d4 Õ 72 2 213 00d5 Ö 72 2 214 00d6 × 56 0 215 00d7 mu " Ø 72 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 72 2 221 00dd Þ 56 2 222 00de ß 50 2 223 00df à 44 2 224 00e0 á 44 2 225 00e1 â 44 2 226 00e2 ã 44 2 227 00e3 ä 44 2 228 00e4 å 44 2 229 00e5 æ 67 0 230 00e6 ç 44 1 231 00e7 è 44 2 232 00e8 é 44 2 233 00e9 ê 44 2 234 00ea ë 44 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 50 2 240 00f0 ñ 50 2 241 00f1 ò 50 2 242 00f2 ó 50 2 243 00f3 ô 50 2 244 00f4 õ 50 2 245 00f5 ö 50 2 246 00f6 ÷ 56 0 247 00f7 -: " di " ø 50 0 248 00f8 ù 50 2 249 00f9 ú 50 2 250 00fa û 50 2 251 00fb ü 50 2 252 00fc ý 50 3 253 00fd þ 50 3 254 00fe ÿ 50 3 255 00ff ā 44 2 257 0101 Ă 72 2 258 0102 ă 44 2 259 0103 Ą 72 3 260 0104 ą 44 1 261 0105 Ć 67 2 262 0106 ć 44 2 263 0107 Ĉ 67 2 264 0108 ĉ 44 2 265 0109 Ċ 67 2 266 010a ċ 44 2 267 010b Č 67 2 268 010c č 44 2 269 010d Ď 72 2 270 010e ď 65 2 271 010f Đ 72 2 272 0110 đ 50 2 273 0111 Ē 61 2 274 0112 ē 44 2 275 0113 Ĕ 61 2 276 0114 ĕ 44 2 277 0115 Ė 61 2 278 0116 ė 44 2 279 0117 Ę 61 3 280 0118 ę 44 1 281 0119 Ě 61 2 282 011a ě 44 2 283 011b Ĝ 72 2 284 011c ĝ 50 3 285 011d Ğ 72 2 286 011e ğ 50 3 287 011f Ġ 72 2 288 0120 ġ 50 3 289 0121 Ģ 72 3 290 0122 ģ 50 3 291 0123 Ĥ 72 2 292 0124 ĥ 50 2 293 0125 Ħ 72 2 294 0126 ħ 50 2 295 0127 Ĩ 33 2 296 0128 ĩ 28 2 297 0129 Ī 33 2 298 012a ī 28 2 299 012b Ĭ 33 2 300 012c ĭ 28 2 301 012d Į 33 3 302 012e į 28 3 303 012f İ 33 2 304 0130 ı 28 0 305 0131 IJ 71 3 306 0132 ij 55 3 307 0133 Ĵ 39 3 308 0134 ĵ 28 3 309 0135 Ķ 72 3 310 0136 ķ 50 3 311 0137 ĸ 50 0 312 0138 Ĺ 61 2 313 0139 ĺ 28 2 314 013a Ļ 61 3 315 013b ļ 28 3 316 013c Ľ 61 2 317 013d ľ 41 2 318 013e Ŀ 61 2 319 013f ŀ 34 2 320 0140 Ł 61 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 50 2 324 0144 Ņ 72 3 325 0145 ņ 50 1 326 0146 Ň 72 2 327 0147 ň 50 2 328 0148 ʼn 60 2 329 0149 Ŋ 72 3 330 014a ŋ 50 1 331 014b Ō 72 2 332 014c ō 50 2 333 014d Ŏ 72 2 334 014e ŏ 50 2 335 014f Ő 72 2 336 0150 ő 50 2 337 0151 Œ 89 2 338 0152 œ 72 0 339 0153 Ŕ 67 2 340 0154 ŕ 33 2 341 0155 Ŗ 67 3 342 0156 ŗ 33 1 343 0157 Ř 67 2 344 0158 ř 33 2 345 0159 Ś 56 2 346 015a ś 39 2 347 015b Ŝ 56 2 348 015c ŝ 39 2 349 015d Ş 56 3 350 015e ş 39 1 351 015f Š 56 2 352 0160 š 39 2 353 0161 Ţ 61 3 354 0162 ţ 28 3 355 0163 Ť 61 2 356 0164 ť 33 2 357 0165 Ŧ 61 2 358 0166 ŧ 28 2 359 0167 Ũ 72 2 360 0168 ũ 50 2 361 0169 Ū 72 2 362 016a ū 50 2 363 016b Ŭ 72 2 364 016c ŭ 50 2 365 016d Ů 72 2 366 016e ů 50 2 367 016f Ű 72 2 368 0170 ű 50 2 369 0171 Ų 72 3 370 0172 ų 50 1 371 0173 Ŵ 94 2 372 0174 ŵ 72 2 373 0175 Ŷ 72 2 374 0176 ŷ 50 3 375 0177 Ÿ 72 2 376 0178 Ź 61 2 377 0179 ź 44 2 378 017a Ż 61 2 379 017b ż 44 2 380 017c Ž 61 2 381 017d ž 44 2 382 017e ſ 28 2 383 017f ƒ 50 3 402 0192 Ș 56 3 536 0218 ș 39 1 537 0219 Ț 61 3 538 021a ț 28 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 28 1 894 037e · 25 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 25 0 8219 201b “ 44 2 8220 201c ” 44 2 8221 201d „ 44 1 8222 201e † 50 3 8224 2020 ‡ 50 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 50 2 8254 203e ⁄ 17 2 8260 2044 € 50 2 8364 20ac ™ 98 2 8482 2122 tm " ℮ 44 0 8494 212e − 79 0 8722 2212 ∕ 17 2 8725 2215 ∙ 25 0 8729 2219 bu " ⋅ 25 0 8901 22c5  56 2 59905 ea01  56 2 59906 ea02  30 2 61444 f004  28 1 63166 f6be fi 56 2 64257 fb01 fl 56 2 64258 fb02 9base-6/troff/font/devutf/DejaVuSerif0000644000175000017500000006215211402154555017231 0ustar anselmanselmname DejaVuSerif fontname DejaVuSerif spacewidth 32 charset ! 40 2 33 0021 " 46 2 34 0022 dq " dq " # 84 2 35 0023 $ 64 3 36 0024 % 95 2 37 0025 & 89 2 38 0026 ( 39 3 40 0028 ) 39 3 41 0029 * 50 2 42 002a + 84 2 43 002b , 32 1 44 002c - 34 0 45 002d . 32 0 46 002e / 34 3 47 002f 0 64 2 48 0030 1 64 2 49 0031 2 64 2 50 0032 3 64 2 51 0033 4 64 2 52 0034 5 64 2 53 0035 6 64 2 54 0036 7 64 2 55 0037 8 64 2 56 0038 9 64 2 57 0039 : 34 0 58 003a ; 34 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 54 2 63 003f @ 100 3 64 0040 A 72 2 65 0041 B 73 2 66 0042 C 77 2 67 0043 D 80 2 68 0044 E 73 2 69 0045 F 69 2 70 0046 G 80 2 71 0047 H 87 2 72 0048 I 40 2 73 0049 J 40 3 74 004a K 75 2 75 004b L 66 2 76 004c M 102 2 77 004d N 88 2 78 004e O 82 2 79 004f P 67 2 80 0050 Q 82 3 81 0051 R 75 2 82 0052 S 69 2 83 0053 T 67 2 84 0054 U 84 2 85 0055 V 72 2 86 0056 W 103 2 87 0057 X 71 2 88 0058 Y 66 2 89 0059 Z 69 2 90 005a [ 39 3 91 005b \ 34 3 92 005c bs " ] 39 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 60 0 97 0061 b 64 2 98 0062 c 56 0 99 0063 d 64 2 100 0064 e 59 0 101 0065 f 37 2 102 0066 g 64 1 103 0067 h 64 2 104 0068 i 32 2 105 0069 j 31 3 106 006a k 61 2 107 006b l 32 2 108 006c m 95 0 109 006d n 64 0 110 006e o 60 0 111 006f p 64 1 112 0070 q 64 1 113 0071 r 48 0 114 0072 s 51 0 115 0073 t 40 2 116 0074 u 64 0 117 0075 v 56 0 118 0076 w 86 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 53 0 122 007a { 64 3 123 007b | 34 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   64 0 160 00a0 ¡ 40 2 161 00a1 ¢ 64 3 162 00a2 £ 64 2 163 00a3 ¤ 64 0 164 00a4 ¥ 64 2 165 00a5 ¦ 34 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 48 2 170 00aa « 61 0 171 00ab ¬ 84 0 172 00ac ­ 34 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 40 2 178 00b2 ³ 40 2 179 00b3 ´ 50 2 180 00b4 aa " µ 65 1 181 00b5 ¶ 64 3 182 00b6 · 32 0 183 00b7 ¸ 50 1 184 00b8 ¹ 40 2 185 00b9 º 47 2 186 00ba » 61 0 187 00bb ¼ 97 2 188 00bc ½ 97 2 189 00bd ¾ 97 2 190 00be ¿ 54 2 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 77 3 199 00c7 È 73 2 200 00c8 É 73 2 201 00c9 Ê 73 2 202 00ca Ë 73 2 203 00cb Ì 40 2 204 00cc Í 40 2 205 00cd Î 40 2 206 00ce Ï 40 2 207 00cf Ð 81 2 208 00d0 Ñ 88 2 209 00d1 Ò 82 2 210 00d2 Ó 82 2 211 00d3 Ô 82 2 212 00d4 Õ 82 2 213 00d5 Ö 82 2 214 00d6 × 84 0 215 00d7 mu " Ø 82 2 216 00d8 Ù 84 2 217 00d9 Ú 84 2 218 00da Û 84 2 219 00db Ü 84 2 220 00dc Ý 66 2 221 00dd Þ 68 2 222 00de ß 67 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 94 0 230 00e6 ç 56 1 231 00e7 è 59 2 232 00e8 é 59 2 233 00e9 ê 59 2 234 00ea ë 59 2 235 00eb ì 32 2 236 00ec í 32 2 237 00ed î 32 2 238 00ee ï 32 2 239 00ef ð 60 2 240 00f0 ñ 64 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 60 0 248 00f8 ù 64 2 249 00f9 ú 64 2 250 00fa û 64 2 251 00fb ü 64 2 252 00fc ý 56 3 253 00fd þ 64 3 254 00fe ÿ 56 3 255 00ff ā 60 2 257 0101 Ă 72 2 258 0102 ă 60 2 259 0103 Ą 72 3 260 0104 ą 60 1 261 0105 Ć 77 2 262 0106 ć 56 2 263 0107 Ĉ 77 2 264 0108 ĉ 56 2 265 0109 Ċ 77 2 266 010a ċ 56 2 267 010b Č 77 2 268 010c č 56 2 269 010d Ď 80 2 270 010e ď 64 2 271 010f Đ 81 2 272 0110 đ 64 2 273 0111 Ē 73 2 274 0112 ē 59 2 275 0113 Ĕ 73 2 276 0114 ĕ 59 2 277 0115 Ė 73 2 278 0116 ė 59 2 279 0117 Ę 73 3 280 0118 ę 59 1 281 0119 Ě 73 2 282 011a ě 59 2 283 011b Ĝ 80 2 284 011c ĝ 64 3 285 011d Ğ 80 2 286 011e ğ 64 3 287 011f Ġ 80 2 288 0120 ġ 64 3 289 0121 Ģ 80 3 290 0122 ģ 64 3 291 0123 Ĥ 87 2 292 0124 ĥ 64 2 293 0125 Ħ 87 2 294 0126 ħ 64 2 295 0127 Ĩ 40 2 296 0128 ĩ 32 2 297 0129 Ī 40 2 298 012a ī 32 2 299 012b Ĭ 40 2 300 012c ĭ 32 2 301 012d Į 40 3 302 012e į 32 3 303 012f İ 40 2 304 0130 ı 32 0 305 0131 IJ 80 3 306 0132 ij 53 3 307 0133 Ĵ 40 3 308 0134 ĵ 31 3 309 0135 Ķ 75 3 310 0136 ķ 61 3 311 0137 ĸ 61 0 312 0138 Ĺ 66 2 313 0139 ĺ 32 2 314 013a Ļ 66 3 315 013b ļ 32 3 316 013c Ľ 66 2 317 013d ľ 40 2 318 013e Ŀ 67 2 319 013f ŀ 46 2 320 0140 Ł 67 2 321 0141 ł 32 2 322 0142 Ń 88 2 323 0143 ń 64 2 324 0144 Ņ 88 3 325 0145 ņ 64 1 326 0146 Ň 88 2 327 0147 ň 64 2 328 0148 ʼn 87 2 329 0149 Ŋ 88 3 330 014a ŋ 64 1 331 014b Ō 82 2 332 014c ō 60 2 333 014d Ŏ 82 2 334 014e ŏ 60 2 335 014f Ő 82 2 336 0150 ő 60 2 337 0151 Œ 114 2 338 0152 œ 99 0 339 0153 Ŕ 75 2 340 0154 ŕ 48 2 341 0155 Ŗ 75 3 342 0156 ŗ 48 1 343 0157 Ř 75 2 344 0158 ř 48 2 345 0159 Ś 69 2 346 015a ś 51 2 347 015b Ŝ 69 2 348 015c ŝ 51 2 349 015d Ş 69 3 350 015e ş 51 1 351 015f Š 69 2 352 0160 š 51 2 353 0161 Ţ 67 3 354 0162 ţ 40 3 355 0163 Ť 67 2 356 0164 ť 40 2 357 0165 Ŧ 67 2 358 0166 ŧ 40 2 359 0167 Ũ 84 2 360 0168 ũ 64 2 361 0169 Ū 84 2 362 016a ū 64 2 363 016b Ŭ 84 2 364 016c ŭ 64 2 365 016d Ů 84 2 366 016e ů 64 2 367 016f Ű 84 2 368 0170 ű 64 2 369 0171 Ų 84 3 370 0172 ų 64 1 371 0173 Ŵ 103 2 372 0174 ŵ 86 2 373 0175 Ŷ 66 2 374 0176 ŷ 56 3 375 0177 Ÿ 66 2 376 0178 Ź 69 2 377 0179 ź 53 2 378 017a Ż 69 2 379 017b ż 53 2 380 017c Ž 69 2 381 017d ž 53 2 382 017e ſ 37 2 383 017f Ɓ 73 2 385 0181 Ƃ 73 2 386 0182 ƃ 64 2 387 0183 Ƅ 73 2 388 0184 ƅ 64 2 389 0185 Ɔ 77 2 390 0186 Ƈ 77 2 391 0187 ƈ 56 2 392 0188 Ɖ 81 2 393 0189 Ɗ 80 2 394 018a Ƌ 73 2 395 018b ƌ 64 2 396 018c ƍ 60 1 397 018d Ǝ 73 2 398 018e Ə 82 2 399 018f Ɛ 64 2 400 0190 Ƒ 69 3 401 0191 ƒ 37 3 402 0192 Ɠ 80 2 403 0193 Ɣ 71 3 404 0194 ƕ 93 2 405 0195 Ɩ 40 2 406 0196 Ɨ 40 2 407 0197 Ƙ 75 2 408 0198 ƙ 61 2 409 0199 ƚ 32 2 410 019a ƛ 63 2 411 019b Ɯ 95 2 412 019c Ɲ 88 3 413 019d ƞ 64 1 414 019e Ɵ 82 2 415 019f Ơ 82 2 416 01a0 ơ 60 0 417 01a1 Ƣ 104 3 418 01a2 ƣ 81 1 419 01a3 Ƥ 67 2 420 01a4 ƥ 64 3 421 01a5 Ʀ 71 3 422 01a6 Ƨ 69 2 423 01a7 ƨ 51 0 424 01a8 Ʃ 71 2 425 01a9 ƪ 32 3 426 01aa ƫ 40 3 427 01ab Ƭ 67 2 428 01ac ƭ 40 2 429 01ad Ʈ 67 3 430 01ae Ư 84 2 431 01af ư 64 0 432 01b0 Ʊ 83 2 433 01b1 Ʋ 76 2 434 01b2 Ƴ 74 2 435 01b3 ƴ 74 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 53 0 438 01b6 Ʒ 56 2 439 01b7 Ƹ 56 2 440 01b8 ƹ 56 1 441 01b9 ƻ 64 2 443 01bb Ƽ 69 2 444 01bc ƽ 56 1 445 01bd ƾ 54 2 446 01be ǀ 29 2 448 01c0 ǁ 49 2 449 01c1 ǂ 46 2 450 01c2 ǃ 29 2 451 01c3 Ǎ 72 2 461 01cd ǎ 60 2 462 01ce Ǐ 40 2 463 01cf ǐ 32 2 464 01d0 Ǒ 82 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 84 2 467 01d3 ǔ 64 2 468 01d4 ǖ 64 2 470 01d6 Ǘ 84 2 471 01d7 ǘ 64 2 472 01d8 Ǚ 84 2 473 01d9 ǚ 64 2 474 01da Ǜ 84 2 475 01db ǜ 64 2 476 01dc ǝ 59 0 477 01dd ǟ 60 2 479 01df Ǣ 100 2 482 01e2 ǣ 94 2 483 01e3 Ǫ 82 3 490 01ea ǫ 60 1 491 01eb Ǭ 82 3 492 01ec ǭ 60 3 493 01ed Ƕ 115 2 502 01f6 Ș 69 3 536 0218 ș 51 1 537 0219 Ț 67 3 538 021a ț 40 3 539 021b Ȥ 69 3 548 0224 ȥ 53 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 82 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 66 2 562 0232 ȳ 56 3 563 0233 ȷ 31 1 567 0237 ȸ 96 2 568 0238 ȹ 96 1 569 0239 Ⱥ 72 2 570 023a Ȼ 77 2 571 023b ȼ 56 0 572 023c Ƚ 66 2 573 023d Ⱦ 67 2 574 023e ȿ 51 1 575 023f ɀ 53 1 576 0240 Ɂ 58 2 577 0241 ɐ 60 0 592 0250 ɑ 64 0 593 0251 ɒ 64 0 594 0252 ɓ 64 2 595 0253 ɔ 56 0 596 0254 ɕ 56 1 597 0255 ɖ 65 3 598 0256 ɗ 68 2 599 0257 ɘ 59 0 600 0258 ə 59 0 601 0259 ɚ 84 0 602 025a ɛ 51 0 603 025b ɜ 51 0 604 025c ɝ 77 0 605 025d ɞ 61 0 606 025e ɟ 31 1 607 025f ɠ 68 3 608 0260 ɡ 64 1 609 0261 ɢ 54 0 610 0262 ɣ 71 1 611 0263 ɤ 56 0 612 0264 ɥ 64 1 613 0265 ɦ 64 2 614 0266 ɧ 64 3 615 0267 ɨ 32 2 616 0268 ɩ 39 0 617 0269 ɪ 32 0 618 026a ɫ 38 2 619 026b ɬ 45 2 620 026c ɭ 36 3 621 026d ɮ 70 3 622 026e ɯ 95 0 623 026f ɰ 95 1 624 0270 ɱ 95 1 625 0271 ɲ 64 1 626 0272 ɳ 69 1 627 0273 ɴ 65 0 628 0274 ɵ 60 0 629 0275 ɶ 79 0 630 0276 ɷ 65 0 631 0277 ɸ 60 3 632 0278 ɹ 50 0 633 0279 ɺ 50 2 634 027a ɻ 55 1 635 027b ɼ 48 1 636 027c ɽ 48 1 637 027d ɾ 45 0 638 027e ɿ 45 0 639 027f ʀ 59 0 640 0280 ʁ 59 0 641 0281 ʂ 51 1 642 0282 ʃ 27 3 643 0283 ʄ 37 3 644 0284 ʅ 49 1 645 0285 ʆ 32 3 646 0286 ʇ 40 1 647 0287 ʈ 40 3 648 0288 ʉ 64 0 649 0289 ʊ 62 0 650 028a ʋ 61 0 651 028b ʌ 56 0 652 028c ʍ 86 0 653 028d ʎ 56 2 654 028e ʏ 66 0 655 028f ʐ 60 1 656 0290 ʑ 56 1 657 0291 ʒ 56 1 658 0292 ʓ 56 1 659 0293 ʔ 54 2 660 0294 ʕ 54 2 661 0295 ʖ 54 2 662 0296 ʗ 51 3 663 0297 ʘ 72 0 664 0298 ʙ 56 0 665 0299 ʚ 61 0 666 029a ʛ 65 2 667 029b ʜ 67 0 668 029c ʝ 37 3 669 029d ʞ 61 1 670 029e ʟ 65 0 671 029f ʠ 68 3 672 02a0 ʡ 54 2 673 02a1 ʢ 54 2 674 02a2 ʣ 100 2 675 02a3 ʤ 103 3 676 02a4 ʥ 100 3 677 02a5 ʦ 81 2 678 02a6 ʧ 60 3 679 02a7 ʨ 78 3 680 02a8 ʩ 89 3 681 02a9 ʪ 65 2 682 02aa ʫ 68 2 683 02ab ʬ 60 2 684 02ac ʭ 44 2 685 02ad ʮ 78 3 686 02ae ʯ 77 3 687 02af ʰ 43 2 688 02b0 ʱ 43 2 689 02b1 ʲ 26 2 690 02b2 ʳ 35 2 691 02b3 ʴ 35 2 692 02b4 ʵ 43 2 693 02b5 ʶ 39 2 694 02b6 ʷ 59 2 695 02b7 ʸ 42 2 696 02b8 ʻ 32 2 699 02bb ʼ 32 2 700 02bc ʾ 31 2 702 02be ʿ 31 2 703 02bf ˀ 28 2 704 02c0 ˁ 28 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 31 0 722 02d2 ˓ 31 0 723 02d3 ˖ 33 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 42 0 734 02de ˠ 45 2 736 02e0 ˡ 24 2 737 02e1 ˢ 34 2 738 02e2 ˣ 42 2 739 02e3 ˤ 28 2 740 02e4 ˥ 60 2 741 02e5 ˦ 60 2 742 02e6 ˧ 60 2 743 02e7 ˨ 60 2 744 02e8 ˩ 60 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 28 2 884 0374 ͵ 28 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 72 2 902 0386 · 32 0 903 0387 Έ 90 2 904 0388 Ή 104 2 905 0389 Ί 56 2 906 038a Ό 84 2 908 038c Ύ 90 2 910 038e Ώ 85 2 911 038f ΐ 39 2 912 0390 Α 72 2 913 0391 Β 73 2 914 0392 Γ 69 2 915 0393 Δ 72 2 916 0394 Ε 73 2 917 0395 Ζ 69 2 918 0396 Η 87 2 919 0397 Θ 82 2 920 0398 Ι 40 2 921 0399 Κ 75 2 922 039a Λ 72 2 923 039b Μ 102 2 924 039c Ν 88 2 925 039d Ξ 70 2 926 039e Ο 82 2 927 039f Π 87 2 928 03a0 Ρ 67 2 929 03a1 Σ 71 2 931 03a3 Τ 67 2 932 03a4 Υ 66 2 933 03a5 Φ 82 2 934 03a6 Χ 71 2 935 03a7 Ψ 88 2 936 03a8 Ω 83 2 937 03a9 Ϊ 40 2 938 03aa Ϋ 66 2 939 03ab ά 68 2 940 03ac έ 54 2 941 03ad ή 60 3 942 03ae ί 39 2 943 03af ΰ 61 2 944 03b0 α 68 0 945 03b1 β 58 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 54 0 949 03b5 ζ 54 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 39 0 953 03b9 κ 66 0 954 03ba λ 63 2 955 03bb μ 65 1 956 03bc ν 61 0 957 03bd ξ 55 3 958 03be ο 60 0 959 03bf π 66 0 960 03c0 ρ 59 1 961 03c1 ς 56 1 962 03c2 σ 68 0 963 03c3 τ 55 0 964 03c4 υ 61 0 965 03c5 φ 70 1 966 03c6 χ 61 1 967 03c7 ψ 78 1 968 03c8 ω 82 0 969 03c9 ϊ 39 2 970 03ca ϋ 61 2 971 03cb ό 60 2 972 03cc ύ 61 2 973 03cd ώ 82 2 974 03ce ϐ 58 2 976 03d0 ϑ 71 2 977 03d1 ϒ 69 2 978 03d2 ϓ 87 2 979 03d3 ϔ 69 2 980 03d4 ϕ 68 3 981 03d5 ϖ 82 0 982 03d6 ϗ 62 1 983 03d7 Ϙ 82 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 77 3 986 03da ϛ 56 3 987 03db Ϝ 69 2 988 03dc ϝ 46 3 989 03dd Ϟ 59 2 990 03de ϟ 66 2 991 03df Ϡ 78 3 992 03e0 ϡ 58 1 993 03e1 ϰ 62 0 1008 03f0 ϱ 59 1 1009 03f1 ϲ 56 0 1010 03f2 ϳ 31 3 1011 03f3 ϴ 82 2 1012 03f4 ϵ 56 0 1013 03f5 ϶ 56 0 1014 03f6 Ϸ 68 2 1015 03f7 ϸ 64 3 1016 03f8 Ϲ 77 2 1017 03f9 Ϻ 102 2 1018 03fa ϻ 71 1 1019 03fb ϼ 59 1 1020 03fc Ͻ 77 2 1021 03fd Ͼ 77 2 1022 03fe Ͽ 77 2 1023 03ff Ё 71 2 1025 0401 Ђ 80 3 1026 0402 Ѓ 72 2 1027 0403 Є 77 2 1028 0404 Ѕ 69 2 1029 0405 І 40 2 1030 0406 Ї 40 2 1031 0407 Ј 40 3 1032 0408 Љ 107 2 1033 0409 Њ 112 2 1034 040a Ћ 87 2 1035 040b Ќ 82 2 1036 040c Ѝ 90 2 1037 040d Ў 77 2 1038 040e Џ 87 3 1039 040f А 72 2 1040 0410 Б 73 2 1041 0411 В 73 2 1042 0412 Г 69 2 1043 0413 Д 87 3 1044 0414 Е 73 2 1045 0415 Ж 111 2 1046 0416 З 64 2 1047 0417 И 87 2 1048 0418 Й 87 2 1049 0419 К 75 2 1050 041a Л 87 2 1051 041b М 102 2 1052 041c Н 87 2 1053 041d О 82 2 1054 041e П 87 2 1055 041f Р 67 2 1056 0420 С 77 2 1057 0421 Т 67 2 1058 0422 У 75 2 1059 0423 Ф 98 3 1060 0424 Х 71 2 1061 0425 Ц 87 3 1062 0426 Ч 75 2 1063 0427 Ш 102 2 1064 0428 Щ 105 3 1065 0429 Ъ 76 2 1066 042a Ы 104 2 1067 042b Ь 69 2 1068 042c Э 77 2 1069 042d Ю 119 2 1070 042e Я 84 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 56 0 1074 0432 г 54 0 1075 0433 д 68 1 1076 0434 е 59 0 1077 0435 ж 85 0 1078 0436 з 54 0 1079 0437 и 67 0 1080 0438 й 67 2 1081 0439 к 61 0 1082 043a л 62 0 1083 043b м 84 0 1084 043c н 67 0 1085 043d о 60 0 1086 043e п 67 0 1087 043f р 64 1 1088 0440 с 56 0 1089 0441 т 55 0 1090 0442 у 56 1 1091 0443 ф 74 3 1092 0444 х 56 0 1093 0445 ц 69 1 1094 0446 ч 67 0 1095 0447 ш 85 0 1096 0448 щ 90 1 1097 0449 ъ 55 0 1098 044a ы 74 0 1099 044b ь 49 0 1100 044c э 56 0 1101 044d ю 87 0 1102 044e я 65 0 1103 044f ѐ 59 2 1104 0450 ё 59 2 1105 0451 ђ 62 3 1106 0452 ѓ 54 2 1107 0453 є 56 0 1108 0454 ѕ 51 0 1109 0455 і 32 2 1110 0456 ї 32 2 1111 0457 ј 31 3 1112 0458 љ 78 0 1113 0459 њ 80 0 1114 045a ћ 64 2 1115 045b ќ 61 2 1116 045c ѝ 67 2 1117 045d ў 56 3 1118 045e џ 66 1 1119 045f Ґ 69 2 1168 0490 ґ 54 2 1169 0491 Ғ 69 2 1170 0492 ғ 54 0 1171 0493 Қ 75 3 1178 049a қ 61 1 1179 049b Ҳ 71 3 1202 04b2 ҳ 56 1 1203 04b3 Ӑ 72 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 72 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 100 2 1236 04d4 ӕ 94 0 1237 04d5 Ӗ 73 2 1238 04d6 ӗ 59 2 1239 04d7 Ӡ 56 2 1248 04e0 ӡ 56 1 1249 04e1 Ӧ 82 2 1254 04e6 ӧ 60 2 1255 04e7 Ө 82 2 1256 04e8 ө 60 0 1257 04e9 Ӫ 82 2 1258 04ea ӫ 60 2 1259 04eb ᴂ 94 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 32 1 7433 1d09 ᴔ 99 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 95 3 7455 1d1f ᵃ 39 2 7491 1d43 ᵄ 25 2 7492 1d44 ᵅ 40 2 7493 1d45 ᵆ 62 2 7494 1d46 ᵇ 40 2 7495 1d47 ᵈ 40 2 7496 1d48 ᵉ 39 2 7497 1d49 ᵊ 39 2 7498 1d4a ᵋ 34 2 7499 1d4b ᵌ 34 2 7500 1d4c ᵍ 40 2 7501 1d4d ᵎ 17 2 7502 1d4e ᵏ 36 2 7503 1d4f ᵐ 61 2 7504 1d50 ᵑ 40 2 7505 1d51 ᵒ 39 2 7506 1d52 ᵓ 35 2 7507 1d53 ᵔ 39 2 7508 1d54 ᵕ 39 0 7509 1d55 ᵖ 40 2 7510 1d56 ᵗ 25 2 7511 1d57 ᵘ 40 2 7512 1d58 ᵙ 46 2 7513 1d59 ᵚ 61 2 7514 1d5a ᵛ 37 2 7515 1d5b ᵷ 64 1 7543 1d77 ᵻ 37 0 7547 1d7b ᶅ 32 3 7557 1d85 ᶛ 40 2 7579 1d9b ᶜ 35 2 7580 1d9c ᶝ 35 2 7581 1d9d ᶞ 39 2 7582 1d9e ᶟ 34 2 7583 1d9f ᶠ 22 2 7584 1da0 ᶡ 23 2 7585 1da1 ᶢ 40 2 7586 1da2 ᶣ 40 2 7587 1da3 ᶤ 23 2 7588 1da4 ᶥ 24 2 7589 1da5 ᶦ 23 2 7590 1da6 ᶧ 23 2 7591 1da7 ᶨ 23 2 7592 1da8 ᶩ 18 2 7593 1da9 ᶪ 17 2 7594 1daa ᶫ 37 2 7595 1dab ᶬ 61 2 7596 1dac ᶭ 61 2 7597 1dad ᶮ 41 2 7598 1dae ᶯ 40 2 7599 1daf ᶰ 40 2 7600 1db0 ᶱ 39 2 7601 1db1 ᶲ 39 2 7602 1db2 ᶳ 33 2 7603 1db3 ᶴ 21 2 7604 1db4 ᶵ 25 2 7605 1db5 ᶶ 40 2 7606 1db6 ᶷ 39 2 7607 1db7 ᶹ 38 2 7609 1db9 ᶺ 37 2 7610 1dba ᶻ 33 2 7611 1dbb ᶼ 33 2 7612 1dbc ᶽ 33 2 7613 1dbd ᶾ 36 2 7614 1dbe ᶿ 39 2 7615 1dbf Ḍ 80 3 7692 1e0c ḍ 64 3 7693 1e0d Ḓ 80 3 7698 1e12 ḓ 64 3 7699 1e13 Ḥ 87 3 7716 1e24 ḥ 64 3 7717 1e25 Ḷ 66 3 7734 1e36 ḷ 32 3 7735 1e37 Ḹ 66 3 7736 1e38 ḹ 32 3 7737 1e39 Ḽ 66 3 7740 1e3c ḽ 32 3 7741 1e3d ṁ 95 2 7745 1e41 Ṃ 102 3 7746 1e42 ṃ 95 1 7747 1e43 Ṅ 88 2 7748 1e44 ṅ 64 2 7749 1e45 Ṇ 88 3 7750 1e46 ṇ 64 1 7751 1e47 Ṋ 88 3 7754 1e4a ṋ 64 1 7755 1e4b ṗ 64 3 7767 1e57 Ṛ 75 3 7770 1e5a ṛ 48 1 7771 1e5b Ṝ 75 3 7772 1e5c ṝ 48 3 7773 1e5d ṡ 51 2 7777 1e61 Ṣ 69 3 7778 1e62 ṣ 51 1 7779 1e63 Ṭ 67 3 7788 1e6c ṭ 40 3 7789 1e6d Ṱ 67 3 7792 1e70 ṱ 40 3 7793 1e71 Ṿ 72 3 7806 1e7e ṿ 56 1 7807 1e7f Ẁ 103 2 7808 1e80 ẁ 86 2 7809 1e81 Ẃ 103 2 7810 1e82 ẃ 86 2 7811 1e83 Ẅ 103 2 7812 1e84 ẅ 86 2 7813 1e85 Ẹ 73 3 7864 1eb8 ẹ 59 1 7865 1eb9 Ị 40 3 7882 1eca ị 32 3 7883 1ecb Ọ 82 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 84 3 7908 1ee4 ụ 64 1 7909 1ee5 Ỳ 66 2 7922 1ef2 ỳ 56 3 7923 1ef3 ἁ 68 2 7937 1f01 ἂ 68 2 7938 1f02 ἃ 68 2 7939 1f03 ἄ 68 2 7940 1f04 ἅ 68 2 7941 1f05 ἆ 68 2 7942 1f06 ἇ 68 2 7943 1f07 Ἀ 72 2 7944 1f08 Ἁ 72 2 7945 1f09 Ἂ 87 2 7946 1f0a Ἃ 87 2 7947 1f0b Ἄ 73 2 7948 1f0c Ἅ 76 2 7949 1f0d Ἆ 72 2 7950 1f0e Ἇ 72 2 7951 1f0f ἐ 54 2 7952 1f10 ἑ 54 2 7953 1f11 ἒ 54 2 7954 1f12 ἓ 54 2 7955 1f13 ἔ 54 2 7956 1f14 ἕ 54 2 7957 1f15 Ἐ 85 2 7960 1f18 Ἑ 84 2 7961 1f19 Ἒ 107 2 7962 1f1a Ἓ 108 2 7963 1f1b Ἔ 101 2 7964 1f1c Ἕ 103 2 7965 1f1d ἠ 60 3 7968 1f20 ἡ 60 3 7969 1f21 ἢ 60 3 7970 1f22 ἣ 60 3 7971 1f23 ἤ 60 3 7972 1f24 ἥ 60 3 7973 1f25 ἦ 60 3 7974 1f26 ἧ 60 3 7975 1f27 Ἠ 100 2 7976 1f28 Ἡ 99 2 7977 1f29 Ἢ 121 2 7978 1f2a Ἣ 122 2 7979 1f2b Ἤ 116 2 7980 1f2c Ἥ 118 2 7981 1f2d Ἦ 110 2 7982 1f2e Ἧ 109 2 7983 1f2f ἰ 39 2 7984 1f30 ἱ 39 2 7985 1f31 ἲ 39 2 7986 1f32 ἳ 39 2 7987 1f33 ἴ 39 2 7988 1f34 ἵ 39 2 7989 1f35 ἶ 39 2 7990 1f36 ἷ 39 2 7991 1f37 Ἰ 52 2 7992 1f38 Ἱ 51 2 7993 1f39 Ἲ 73 2 7994 1f3a Ἳ 74 2 7995 1f3b Ἴ 68 2 7996 1f3c Ἵ 71 2 7997 1f3d Ἶ 62 2 7998 1f3e Ἷ 61 2 7999 1f3f ὀ 60 2 8000 1f40 ὁ 60 2 8001 1f41 ὂ 60 2 8002 1f42 ὃ 60 2 8003 1f43 ὄ 60 2 8004 1f44 ὅ 60 2 8005 1f45 Ὀ 82 2 8008 1f48 Ὁ 86 2 8009 1f49 Ὂ 112 2 8010 1f4a Ὃ 113 2 8011 1f4b Ὄ 94 2 8012 1f4c Ὅ 96 2 8013 1f4d ὐ 61 2 8016 1f50 ὑ 61 2 8017 1f51 ὒ 61 2 8018 1f52 ὓ 61 2 8019 1f53 ὔ 61 2 8020 1f54 ὕ 61 2 8021 1f55 ὖ 61 2 8022 1f56 ὗ 61 2 8023 1f57 Ὑ 85 2 8025 1f59 Ὓ 108 2 8027 1f5b Ὕ 104 2 8029 1f5d Ὗ 95 2 8031 1f5f ὠ 82 2 8032 1f60 ὡ 82 2 8033 1f61 ὢ 82 2 8034 1f62 ὣ 82 2 8035 1f63 ὤ 82 2 8036 1f64 ὥ 82 2 8037 1f65 ὦ 82 2 8038 1f66 ὧ 82 2 8039 1f67 Ὠ 83 2 8040 1f68 Ὡ 87 2 8041 1f69 Ὢ 113 2 8042 1f6a Ὣ 114 2 8043 1f6b Ὤ 95 2 8044 1f6c Ὥ 98 2 8045 1f6d Ὦ 94 2 8046 1f6e Ὧ 97 2 8047 1f6f ὰ 68 2 8048 1f70 ά 68 2 8049 1f71 ὲ 54 2 8050 1f72 έ 54 2 8051 1f73 ὴ 60 3 8052 1f74 ή 60 3 8053 1f75 ὶ 39 2 8054 1f76 ί 39 2 8055 1f77 ὸ 60 2 8056 1f78 ό 60 2 8057 1f79 ὺ 61 2 8058 1f7a ύ 61 2 8059 1f7b ὼ 82 2 8060 1f7c ώ 82 2 8061 1f7d ᾀ 68 3 8064 1f80 ᾁ 68 3 8065 1f81 ᾂ 68 3 8066 1f82 ᾃ 68 3 8067 1f83 ᾄ 68 3 8068 1f84 ᾅ 68 3 8069 1f85 ᾆ 68 3 8070 1f86 ᾇ 68 3 8071 1f87 ᾈ 72 3 8072 1f88 ᾉ 72 3 8073 1f89 ᾊ 87 3 8074 1f8a ᾋ 87 3 8075 1f8b ᾌ 73 3 8076 1f8c ᾍ 76 3 8077 1f8d ᾎ 72 3 8078 1f8e ᾏ 72 3 8079 1f8f ᾐ 60 3 8080 1f90 ᾑ 60 3 8081 1f91 ᾒ 60 3 8082 1f92 ᾓ 60 3 8083 1f93 ᾔ 60 3 8084 1f94 ᾕ 60 3 8085 1f95 ᾖ 60 3 8086 1f96 ᾗ 60 3 8087 1f97 ᾘ 100 3 8088 1f98 ᾙ 99 3 8089 1f99 ᾚ 121 3 8090 1f9a ᾛ 122 3 8091 1f9b ᾜ 116 3 8092 1f9c ᾝ 118 3 8093 1f9d ᾞ 110 3 8094 1f9e ᾟ 109 3 8095 1f9f ᾠ 82 3 8096 1fa0 ᾡ 82 3 8097 1fa1 ᾢ 82 3 8098 1fa2 ᾣ 82 3 8099 1fa3 ᾤ 82 3 8100 1fa4 ᾥ 82 3 8101 1fa5 ᾦ 82 3 8102 1fa6 ᾧ 82 3 8103 1fa7 ᾨ 83 3 8104 1fa8 ᾩ 87 3 8105 1fa9 ᾪ 113 3 8106 1faa ᾫ 114 3 8107 1fab ᾬ 95 3 8108 1fac ᾭ 98 3 8109 1fad ᾮ 94 3 8110 1fae ᾯ 97 3 8111 1faf ᾰ 68 2 8112 1fb0 ᾱ 68 2 8113 1fb1 ᾲ 68 3 8114 1fb2 ᾳ 68 1 8115 1fb3 ᾴ 68 3 8116 1fb4 ᾶ 68 2 8118 1fb6 ᾷ 68 3 8119 1fb7 Ᾰ 72 2 8120 1fb8 Ᾱ 72 2 8121 1fb9 Ὰ 72 2 8122 1fba Ά 72 2 8123 1fbb ᾼ 72 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 60 3 8130 1fc2 ῃ 60 1 8131 1fc3 ῄ 60 3 8132 1fc4 ῆ 60 3 8134 1fc6 ῇ 60 3 8135 1fc7 Ὲ 91 2 8136 1fc8 Έ 90 2 8137 1fc9 Ὴ 106 2 8138 1fca Ή 104 2 8139 1fcb ῌ 87 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 39 2 8144 1fd0 ῑ 39 2 8145 1fd1 ῒ 39 2 8146 1fd2 ΐ 39 2 8147 1fd3 ῖ 39 2 8150 1fd6 ῗ 39 2 8151 1fd7 Ῐ 40 2 8152 1fd8 Ῑ 40 2 8153 1fd9 Ὶ 59 2 8154 1fda Ί 56 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 61 2 8160 1fe0 ῡ 61 2 8161 1fe1 ῢ 61 2 8162 1fe2 ΰ 61 2 8163 1fe3 ῤ 59 3 8164 1fe4 ῥ 59 3 8165 1fe5 ῦ 61 2 8166 1fe6 ῧ 61 2 8167 1fe7 Ῠ 66 2 8168 1fe8 Ῡ 66 2 8169 1fe9 Ὺ 92 2 8170 1fea Ύ 90 2 8171 1feb Ῥ 79 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 82 3 8178 1ff2 ῳ 82 1 8179 1ff3 ῴ 82 3 8180 1ff4 ῶ 82 2 8182 1ff6 ῷ 82 3 8183 1ff7 Ὸ 96 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 98 2 8186 1ffa Ώ 85 2 8187 1ffb ῼ 83 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 34 0 8208 2010 ‑ 34 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 32 2 8216 2018 ` " ‘ " ’ 32 2 8217 2019 ' " ’ " ‚ 32 1 8218 201a ‛ 32 2 8219 201b “ 51 2 8220 201c ” 51 2 8221 201d „ 52 1 8222 201e ‟ 51 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 59 0 8226 2022 ‣ 59 0 8227 2023 … 100 0 8230 2026 ‰ 134 2 8240 2030 ‱ 173 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 53 2 8252 203c ‾ 50 2 8254 203e ⁇ 98 2 8263 2047 ⁈ 75 2 8264 2048 ⁉ 75 2 8265 2049 ⁰ 40 2 8304 2070 ⁴ 40 2 8308 2074 ⁵ 40 2 8309 2075 ⁶ 40 2 8310 2076 ⁷ 40 2 8311 2077 ⁸ 40 2 8312 2078 ⁹ 40 2 8313 2079 ⁿ 43 2 8319 207f ₦ 66 2 8358 20a6 € 64 2 8364 20ac ₵ 64 3 8373 20b5 № 128 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 83 2 8486 2126 K 75 2 8490 212a Å 72 2 8491 212b ∂ 52 2 8706 2202 pd " ∆ 70 2 8710 2206 ∇ 70 2 8711 2207 gr " ∏ 80 3 8719 220f ∑ 71 3 8721 2211 − 84 0 8722 2212 ∕ 17 2 8725 2215 ∙ 32 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 68 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 73 0 8743 2227 l∧ 73 0 8743 2227 " ∨ 73 0 8744 2228 l| " ∩ 73 0 8745 2229 ca " ∪ 73 0 8746 222a cu " ∫ 52 3 8747 222b is " ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 76 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 100 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 52 3 8992 2320 ⌡ 52 3 8993 2321 ⌥ 100 2 8997 2325 ⍽ 92 1 9085 237d ⎮ 52 3 9134 23ae ⏏ 77 0 9167 23cf ␣ 76 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 59 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 59 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⟠ 49 3 10208 27e0 ⧫ 49 3 10731 29eb ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 67 2 64257 fb01 fl 67 2 64258 fb02 � 103 3 65533 fffd 9base-6/troff/font/devutf/UnivMath10000644000175000017500000000226011402154555016670 0ustar anselmanselmname UnivMath1 fontname Universal-MathOne charset --- 83 2 33 << --- 56 2 34 h bar <= 83 2 35 <_ >= 83 2 36 >_ --- 83 2 37 <= --- 83 2 38 ~< te 67 2 39 --- 83 2 40 --- 83 2 41 --- 83 2 42 ~> --- 83 2 43 < 83 2 44 --- 50 2 45 > 83 2 46 / 28 2 47 " 33 2 48 pl 83 2 49 mi 83 2 50 mu 83 2 51 di 83 2 52 eq 83 2 53 +- 83 2 54 -+ 83 2 55 de 33 2 56 ' 33 2 57 al 61 2 58 fa 67 2 59 --- 83 2 60 gr 67 2 61 --- 83 2 62 bu 33 2 63 --- 83 2 64 >> A 72 2 65 B 67 2 66 C 83 2 67 D 67 2 68 E 67 2 69 F 78 2 70 G 61 2 71 H 78 2 72 I 39 2 73 J 78 2 74 K 72 2 75 L 72 2 76 M 89 2 77 N 78 2 78 O 78 2 79 P 78 2 80 Q 78 2 81 R 67 2 82 S 67 2 83 T 67 2 84 U 78 2 85 V 78 2 86 W 50 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 --- 83 2 91 \ 28 2 92 en 50 2 93 --- 83 2 94 --- 83 2 95 >< if 67 2 96 a 61 2 97 b 61 2 98 c 61 2 99 d 50 2 100 e 44 2 101 f 67 2 102 g 56 2 103 h 61 2 104 i 33 2 105 j 44 2 106 k 56 2 107 l 56 2 108 m 67 2 109 n 50 2 110 o 50 2 111 p 67 2 112 q 67 2 113 r 50 2 114 s 61 2 115 t 44 2 116 u 50 2 117 v 67 2 118 w 61 2 119 x 56 2 120 y 44 2 121 z 44 2 122 - 33 2 123 | 28 2 124 em 100 2 125 pt 67 2 126 --- 44 2 167 --- 50 2 171 pd 50 2 173 --- 56 2 194 --- 83 2 195 --- 83 2 248 --- 83 2 249 --- 56 2 251 9base-6/troff/font/devutf/LucidaSansCW830000644000175000017500000000650511402154555017515 0ustar anselmanselmname LucidaSansCW83 fontname LucidaSans-Typewriter83 spacewidth 50 charset ! 50 0 33 exclam " 50 0 34 quotedbl # 50 0 35 numbersign $ 50 0 36 dollar % 50 0 37 percent & 50 0 38 ampersand ' 50 0 39 quoteright ( 50 0 40 parenleft ) 50 0 41 parenright * 50 0 42 asterisk + 50 0 43 plus , 50 0 44 comma - 50 0 45 minus . 50 0 46 period / 50 0 47 slash 0 50 0 48 zero 1 50 0 49 one 2 50 0 50 two 3 50 0 51 three 4 50 0 52 four 5 50 0 53 five 6 50 0 54 six 7 50 0 55 seven 8 50 0 56 eight 9 50 0 57 nine : 50 0 58 colon ; 50 0 59 semicolon < 50 0 60 less = 50 0 61 equal > 50 0 62 greater ? 50 0 63 question @ 50 0 64 at A 50 0 65 A B 50 0 66 B C 50 0 67 C D 50 0 68 D E 50 0 69 E F 50 0 70 F G 50 0 71 G H 50 0 72 H I 50 0 73 I J 50 0 74 J K 50 0 75 K L 50 0 76 L M 50 0 77 M N 50 0 78 N O 50 0 79 O P 50 0 80 P Q 50 0 81 Q R 50 0 82 R S 50 0 83 S T 50 0 84 T U 50 0 85 U V 50 0 86 V W 50 0 87 W X 50 0 88 X Y 50 0 89 Y Z 50 0 90 Z [ 50 0 91 bracketleft \ 50 0 92 backslash ] 50 0 93 bracketright ^ 50 0 94 asciicircum _ 50 0 95 underscore ` 50 0 96 quoteleft a 50 0 97 a b 50 0 98 b c 50 0 99 c d 50 0 100 d e 50 0 101 e f 50 0 102 f g 50 0 103 g h 50 0 104 h i 50 0 105 i j 50 0 106 j k 50 0 107 k l 50 0 108 l m 50 0 109 m n 50 0 110 n o 50 0 111 o p 50 0 112 p q 50 0 113 q r 50 0 114 r s 50 0 115 s t 50 0 116 t u 50 0 117 u v 50 0 118 v w 50 0 119 w x 50 0 120 x y 50 0 121 y z 50 0 122 z { 50 0 123 braceleft | 50 0 124 bar } 50 0 125 braceright ~ 50 0 126 asciitilde ¡ 50 0 161 exclamdown ¢ 50 0 162 cent £ 50 0 163 sterling ¤ 50 0 164 currency ¥ 50 0 165 yen ¦ 50 0 166 brokenbar § 50 0 167 section ¨ 50 0 168 dieresis © 50 0 169 copyright « 50 0 171 guillemotleft ¬ 50 0 172 logicalnot ­ 50 0 173 hyphen hy " ® 50 0 174 registered ¯ 50 0 175 macron ° 50 0 176 degree ± 50 0 177 plusminus ² 50 0 178 twosuperior ³ 50 0 179 threesuperior ´ 50 0 180 acute µ 50 0 181 mu ¶ 50 0 182 paragraph · 50 0 183 periodcentered ¸ 50 0 184 cedilla ¹ 50 0 185 onesuperior » 50 0 187 guillemotright ¼ 50 0 188 onequarter ½ 50 0 189 onehalf ¾ 50 0 190 threequarters ¿ 50 0 191 questiondown À 50 0 192 Agrave Á 50 0 193 Aacute  50 0 194 Acircumflex à 50 0 195 Atilde Ä 50 0 196 Adieresis Å 50 0 197 Aring Æ 50 0 198 AE Ç 50 0 199 Ccedilla È 50 0 200 Egrave É 50 0 201 Eacute Ê 50 0 202 Ecircumflex Ë 50 0 203 Edieresis Ì 50 0 204 Igrave Í 50 0 205 Iacute Î 50 0 206 Icircumflex Ï 50 0 207 Idieresis Ð 50 0 208 Eth Ñ 50 0 209 Ntilde Ò 50 0 210 Ograve Ó 50 0 211 Oacute Ô 50 0 212 Ocircumflex Õ 50 0 213 Otilde Ö 50 0 214 Odieresis × 50 0 215 multiply Ø 50 0 216 Oslash Ù 50 0 217 Ugrave Ú 50 0 218 Uacute Û 50 0 219 Ucircumflex Ü 50 0 220 Udieresis Ý 50 0 221 Yacute Þ 50 0 222 Thorn ß 50 0 223 germandbls à 50 0 224 agrave á 50 0 225 aacute â 50 0 226 acircumflex ã 50 0 227 atilde ä 50 0 228 adieresis å 50 0 229 aring æ 50 0 230 ae ç 50 0 231 ccedilla è 50 0 232 egrave é 50 0 233 eacute ê 50 0 234 ecircumflex ë 50 0 235 edieresis ì 50 0 236 igrave í 50 0 237 iacute î 50 0 238 icircumflex ï 50 0 239 idieresis ð 50 0 240 eth ñ 50 0 241 ntilde ò 50 0 242 ograve ó 50 0 243 oacute ô 50 0 244 ocircumflex õ 50 0 245 otilde ö 50 0 246 odieresis ÷ 50 0 247 divide ø 50 0 248 oslash ù 50 0 249 ugrave ú 50 0 250 uacute û 50 0 251 ucircumflex ü 50 0 252 udieresis ý 50 0 253 yacute þ 50 0 254 thorn ÿ 50 0 255 ydieresis 9base-6/troff/font/devutf/shell.lib0000644000175000017500000005461411402154555016742 0ustar anselmanselm# # Shell library - for building devutf tables. # RESOLUTION=720 UNITWIDTH=10 OCTALESCAPES=${OCTALESCAPES:-160} # <= code means add \0ddd names DOWNLOADVECTOR=FALSE # TRUE can mean incomplete tables # # BuiltinTables returns command lines that generate PostScript programs # for building a typesetter description file and font width tables for # a relatively standard collection of fonts. Use awk to select a command # line or modify an existing command to build a width table for a new # font. # BuiltinTables() { cat <<-'//End of BuiltinTables' Proportional R Times-Roman Proportional I Times-Italic Proportional B Times-Bold Proportional BI Times-BoldItalic Proportional AB AvantGarde-Demi Proportional AI AvantGarde-BookOblique Proportional AR AvantGarde-Book Proportional AX AvantGarde-DemiOblique Proportional H Helvetica Proportional HB Helvetica-Bold Proportional HI Helvetica-Oblique Proportional HX Helvetica-BoldOblique Proportional Hb Helvetica-Narrow-Bold Proportional Hi Helvetica-Narrow-Oblique Proportional Hr Helvetica-Narrow Proportional Hx Helvetica-Narrow-BoldOblique Proportional KB Bookman-Demi Proportional KI Bookman-LightItalic Proportional KR Bookman-Light Proportional KX Bookman-DemiItalic Proportional NB NewCenturySchlbk-Bold Proportional NI NewCenturySchlbk-Italic Proportional NR NewCenturySchlbk-Roman Proportional NX NewCenturySchlbk-BoldItalic Proportional PA Palatino-Roman Proportional PB Palatino-Bold Proportional PI Palatino-Italic Proportional PX Palatino-BoldItalic Proportional ZI ZapfChancery-MediumItalic FixedWidth C Courier FixedWidth CB Courier-Bold FixedWidth CI Courier-Oblique FixedWidth CO Courier FixedWidth CW Courier FixedWidth CX Courier-BoldOblique Dingbats ZD ZapfDingbats Greek GR Symbol Symbol S Symbol Special S1 Times-Roman Description DESC --- //End of BuiltinTables } # # AllTables prints the complete list of builtin font names. # AllTables() { BuiltinTables | awk '{print $2}' } # # Charset functions generate keyword/value pairs (as PostScript objects) # that describe the character set available in a font. The keyword is a # PostScript string that represents troff's name for the character. The # value is usually the literal name (i.e. begins with a /) assigned to # the character in the PostScript font. The value can also be an integer # or a PostScript string. An integer value is used as an index in the # current font's Encoding array. A string value is returned to the host # unchanged when the entry for the character is constructed. Entries that # have (") as their value are synonyms for the preceeding character. # # The 18 characters missing from ROM resident fonts on older printers are # flagged with the PostScript comment "% missing". # StandardCharset() { cat <<-'//End of StandardCharset' (!) /exclam (") /quotedbl (dq) (") % synonym (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /hyphen % changed from minus by request (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (bs) (") % synonym (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (ga) (") % synonym (!!) /exclamdown (c|) /cent (ct) (") % devpost synonym (L-) /sterling (ps) (") % devpost synonym (xo) /currency (cr) (") % devpost synonym (Y-) /yen (yn) (") % devpost synonym (||) /brokenbar % missing (so) /section (sc) (") % devpost synonym ("") /dieresis (:a) (") % devpost synonym (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (--) /minus (ro) /registered (rg) (") % devpost synonym (-^) /macron (-a) (") % devpost synonym (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (aa) (") % devpost synonym (/u) /mu % missing (P!) /paragraph (pg) (") % devpost synonym (.^) /periodcentered (,,) /cedilla (,a) (") % devpost synonym (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis (^a) /circumflex % devpost accent (~a) /tilde % devpost accent (Ua) /breve % devpost accent (.a) /dotaccent % devpost accent (oa) /ring % devpost accent ("a) /hungarumlaut % devpost accent (Ca) /ogonek % devpost accent (va) /caron % devpost accent //End of StandardCharset } # # DingbatsCharset guarantees changes in StandardCharset don't show up in ZD. # DingbatsCharset() { cat <<-'//End of DingbatsCharset' (!) /exclam (") /quotedbl (#) /numbersign ($) /dollar (%) /percent (&) /ampersand (') /quoteright (\() /parenleft (\)) /parenright (*) /asterisk (+) /plus (,) /comma (-) /minus % also hyphen in devpost (.) /period (/) /slash (0) /zero (1) /one (2) /two (3) /three (4) /four (5) /five (6) /six (7) /seven (8) /eight (9) /nine (:) /colon (;) /semicolon (<) /less (=) /equal (>) /greater (?) /question (@) /at (A) /A (B) /B (C) /C (D) /D (E) /E (F) /F (G) /G (H) /H (I) /I (J) /J (K) /K (L) /L (M) /M (N) /N (O) /O (P) /P (Q) /Q (R) /R (S) /S (T) /T (U) /U (V) /V (W) /W (X) /X (Y) /Y (Z) /Z ([) /bracketleft (\\) /backslash (]) /bracketright (^) /asciicircum (_) /underscore (`) /quoteleft (a) /a (b) /b (c) /c (d) /d (e) /e (f) /f (g) /g (h) /h (i) /i (j) /j (k) /k (l) /l (m) /m (n) /n (o) /o (p) /p (q) /q (r) /r (s) /s (t) /t (u) /u (v) /v (w) /w (x) /x (y) /y (z) /z ({) /braceleft (|) /bar (}) /braceright (~) /asciitilde (\\`) /grave % devpost character (!!) /exclamdown (c|) /cent (L-) /sterling (xo) /currency (Y-) /yen (||) /brokenbar % missing (so) /section ("") /dieresis (co) /copyright (a_) /ordfeminine (<<) /guillemotleft (-,) /logicalnot (hy) /hyphen (ro) /registered (-^) /macron (0^) /degree % missing (+-) /plusminus % missing (2^) /twosuperior % missing (3^) /threesuperior % missing (\\') /acute (/u) /mu % missing (P!) /paragraph (.^) /periodcentered (,,) /cedilla (1^) /onesuperior % missing (o_) /ordmasculine (>>) /guillemotright (14) /onequarter % missing (12) /onehalf % missing (34) /threequarters % missing (??) /questiondown (A`) /Agrave (A') /Aacute (A^) /Acircumflex (A~) /Atilde (A") /Adieresis (A*) /Aring (AE) /AE (C,) /Ccedilla (E`) /Egrave (E') /Eacute (E^) /Ecircumflex (E") /Edieresis (I`) /Igrave (I') /Iacute (I^) /Icircumflex (I") /Idieresis (D-) /Eth % missing (N~) /Ntilde (O`) /Ograve (O') /Oacute (O^) /Ocircumflex (O~) /Otilde (O") /Odieresis (xx) /multiply % missing (O/) /Oslash (U`) /Ugrave (U') /Uacute (U^) /Ucircumflex (U") /Udieresis (Y') /Yacute % missing (TH) /Thorn % missing (ss) /germandbls (a`) /agrave (a') /aacute (a^) /acircumflex (a~) /atilde (a") /adieresis (a*) /aring (ae) /ae (c,) /ccedilla (e`) /egrave (e') /eacute (e^) /ecircumflex (e") /edieresis (i`) /igrave (i') /iacute (i^) /icircumflex (i") /idieresis (d-) /eth % missing (n~) /ntilde (o`) /ograve (o') /oacute (o^) /ocircumflex (o~) /otilde (o") /odieresis (-:) /divide % missing (o/) /oslash (u`) /ugrave (u') /uacute (u^) /ucircumflex (u") /udieresis (y') /yacute % missing (th) /thorn % missing (y") /ydieresis //End of DingbatsCharset } SymbolCharset() { cat <<-'//End of SymbolCharset' (---) /exclam (fa) /universal (---) /numbersign (te) /existential (---) /percent (---) /ampersand (st) /suchthat (---) /parenleft (---) /parenright (**) /asteriskmath (pl) /plus (---) /comma (mi) /minus (---) /period (sl) /slash (---) /zero (---) /one (---) /two (---) /three (---) /four (---) /five (---) /six (---) /seven (---) /eight (---) /nine (---) /colon (---) /semicolon (<) /less (eq) /equal (>) /greater (---) /question (cg) /congruent (*A) /Alpha (\244x) (") (*B) /Beta (\244y) (") (*X) /Chi (\244\257) (") (*D) /Delta (\244{) (") (*E) /Epsilon (\244|) (") (*F) /Phi (\244\256) (") (*G) /Gamma (\244z) (") (*Y) /Eta (\244~) (") (*I) /Iota (\244\241) (") (---) /theta1 (\244\331) (") (*K) /Kappa (\244\242) (") (*L) /Lambda (\244\243) (") (*M) /Mu (\244\244) (") (*N) /Nu (\244\245) (") (*O) /Omicron (\244\247) (") (*P) /Pi (\244\250) (") (*H) /Theta (\244\240) (") (*R) /Rho (\244\251) (") (*S) /Sigma (\244\253) (") (*T) /Tau (\244\254) (") (*U) /Upsilon (\244\255) (") (ts) /sigma1 (\244\312) (") (*W) /Omega (\244\261) (") (*C) /Xi (\244\246) (") (*Q) /Psi (\244\260) (") (*Z) /Zeta (\244}) (") (---) /bracketleft (tf) /therefore (---) /bracketright (pp) /perpendicular (ul) /underscore (_) (") % synonym (rn) /radicalex (*a) /alpha (\244\271) (") (*b) /beta (\244\272) (") (*x) /chi (\244\317) (") (*d) /delta (\244\274) (") (*e) /epsilon (\244\275) (") (*f) /phi (\244\316) (") (*g) /gamma (\244\273) (") (*y) /eta (\244\277) (") (*i) /iota (\244\301) (") (---) /phi1 (\244\335) (") (*k) /kappa (\244\302) (") (*l) /lambda (\244\303) (") (*m) /mu (\244\304) (") (*n) /nu (\244\305) (") (*o) /omicron (\244\307) (") (*p) /pi (\244\310) (") (*h) /theta (\244\300) (") (*r) /rho (\244\311) (") (*s) /sigma (\244\313) (") (*t) /tau (\244\314) (") (*u) /upsilon (\244\315) (") (---) /omega1 (\244\336) (") (*w) /omega (\244\321) (") (*c) /xi (\244\306) (") (*q) /psi (\244\320) (") (*z) /zeta (\244\276) (") (---) /braceleft (or) /bar (---) /braceright (ap) /similar (---) /Upsilon1 (fm) /minute (<=) /lessequal (fr) /fraction % devpost character (if) /infinity (fn) /florin % devpost character (---) /club (---) /diamond (---) /heart (---) /spade (ab) /arrowboth (<-) /arrowleft (ua) /arrowup (->) /arrowright (da) /arrowdown (de) /degree (+-) /plusminus (---) /second (>=) /greaterequal (mu) /multiply (pt) /proportional (pd) /partialdiff (bu) /bullet (di) /divide (!=) /notequal (==) /equivalence (~~) /approxequal (el) /ellipsis (av) /arrowvertex (ah) /arrowhorizex (CR) /carriagereturn (af) /aleph (If) /Ifraktur (Rf) /Rfraktur (ws) /weierstrass (Ox) /circlemultiply (O+) /circleplus (es) /emptyset (ca) /intersection (cu) /union (sp) /propersuperset (ip) /reflexsuperset (!b) /notsubset (sb) /propersubset (ib) /reflexsubset (mo) /element (!m) /notelement (an) /angle (gr) /gradient (rg) /registerserif (co) /copyrightserif (tm) /trademarkserif (---) /product (sr) /radical (c.) /dotmath (no) /logicalnot (l&) /logicaland (l|) /logicalor (---) /arrowdblboth (---) /arrowdblleft (---) /arrowdblup (---) /arrowdblright (---) /arrowdbldown (lz) /lozenge (b<) /angleleft (RG) /registersans (CO) /copyrightsans (TM) /trademarksans (---) /summation (LT) /parenlefttp (br) /parenleftex (LX) (") % synonym (LB) /parenleftbt (lc) /bracketlefttp (lx) /bracketleftex (lf) /bracketleftbt (lt) /bracelefttp (lk) /braceleftmid (lb) /braceleftbt (bv) /braceex (|) (") % synonym (b>) /angleright (is) /integral (---) /integraltp (---) /integralex (---) /integralbt (RT) /parenrighttp (RX) /parenrightex (RB) /parenrightbt (rc) /bracketrighttp (rx) /bracketrightex (rf) /bracketrightbt (rt) /bracerighttp (rk) /bracerightmid (rb) /bracerightbt (~=) (55 0 1) % charlib //End of SymbolCharset } SpecialCharset() { cat <<-'//End of SpecialCharset' (ru) /underscore ('') /quotedblright % devpost character (``) /quotedblleft % devpost character (dg) /dagger % devpost character (dd) /daggerdbl % devpost character (en) /endash % devpost character (\\-) (") % synonym (em) /emdash % (ff) (60 2 1) % charlib % (Fi) (84 2 1) % charlib % (Fl) (84 2 1) % charlib (14) (75 2 1) % charlib (12) (75 2 1) % charlib (34) (75 2 1) % charlib (bx) (50 2 1) % charlib (ob) (38 2 1) % charlib (ci) (75 0 1) % charlib (sq) (50 2 1) % charlib (Sl) (50 2 1) % charlib (L1) (110 1 1) % charlib (LA) (110 1 1) % charlib (LV) (110 3 1) % charlib (LH) (210 1 1) % charlib (lh) (100 0 1) % charlib (rh) (100 0 1) % charlib (lH) (100 0 1) % charlib (rH) (100 0 1) % charlib (PC) (220 2 1) % charlib (DG) (185 2 1) % charlib //End of SpecialCharset } # # Latin1 ensures a font uses the ISOLatin1Encoding vector, although only # text fonts should be re-encoded. Downloading the Encoding vector doesn't # often make sense. No ISOLatin1Encoding array likely means ROM based fonts # on your printer are incomplete. Type 1 fonts with a full Latin1 character # set appeared sometime after Version 50.0. # Latin1() { if [ "$DOWNLOADVECTOR" = TRUE ]; then cat <<-'//End of ISOLatin1Encoding' /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def //End of ISOLatin1Encoding fi echo "ISOLatin1Encoding /$1 ReEncode" } # # Generating functions output PostScript programs that build font width # tables or a typesetter description file. Send the program to a printer # and the complete table will come back on the serial port. All write on # stdout and assume the prologue and other required PostScript files are # all available. # Proportional() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" # Get <>_ and | from S. Use accents for ascii ^ and ~. StandardCharset | awk ' $1 == "(<)" && $2 == "/less" {$1 = "(---)"} $1 == "(>)" && $2 == "/greater" {$1 = "(---)"} $1 == "(_)" && $2 == "/underscore" {$1 = "(---)"} $1 == "(|)" && $2 == "/bar" {$1 = "(---)"} $1 == "(^)" && $2 == "/asciicircum" { printf "(^)\t/circumflex\n" $1 = "(---)" } $1 == "(~)" && $2 == "/asciitilde" { printf "(~)\t/tilde\n" $1 = "(---)" } {printf "%s\t%s\n", $1, $2} ' echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } FixedWidth() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" StandardCharset echo "] def" Latin1 $2 echo "/$2 SelectFont" echo "(opO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Dingbats() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/octalescapes $OCTALESCAPES def" echo "/charset [" DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ { printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2 }' echo "] def" echo "/$2 SelectFont" echo "( ) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Greek() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset | awk ' BEGIN {hit = -1} $1 ~ /\(\*[a-zA-Z]\)/ {print; hit = NR} $2 == "(\")" && hit == NR-1 {print; hit = NR} ' echo "] def" echo "/$2 SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(spacewidth ) Print 32 GetWidth Print (\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Symbol() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SymbolCharset echo "] def" echo "ChangeMetrics" echo "/S SelectFont" echo "(orO) SetAscender" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } Special() { echo "/unitwidth $UNITWIDTH def" echo "/resolution $RESOLUTION def" echo "/charset [" SpecialCharset echo "] def" echo "ChangeMetrics" echo "/S1 SelectFont" echo "(# Times-Roman special font\\\\n) Print" echo "(name $1\\\\n) Print" echo "(fontname $2\\\\n) Print" echo "/$1 NamedInPrologue" echo "(special\\\\n) Print" echo "(charset\\\\n) Print" echo "BuildFontCharset" } # # The DESC file doesn't have to be built on a printer. It's only here for # consistency. # Description() { echo "/charset [" # awk - so the stack doesn't overflow StandardCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}' SymbolCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}' SpecialCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}' echo "] def" cat <<-//DESC (#Device Description - utf character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 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 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res $RESOLUTION hor 1 vert 1 unitwidth $UNITWIDTH ) Print //DESC echo "(charset\\\\n) Print" echo "BuildDescCharset" echo "(\\\\n) Print" } 9base-6/troff/font/devutf/LINKFILE0000644000175000017500000000011111402154555016242 0ustar anselmanselm# # Creates missing width tables from existing ones. # rm -f HM cp H HM 9base-6/troff/font/devutf/I0000644000175000017500000000531311402154555015246 0ustar anselmanselmname I fontname Times-Italic named in prologue spacewidth 25 charset ! 33 2 33 " 42 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 68 2 43 , 25 1 44 - 33 0 173 . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 < 68 2 60 = 68 0 61 > 68 2 62 ? 50 2 63 @ 92 3 64 A 61 2 65 B 61 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 61 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 44 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 67 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 61 2 82 S 50 2 83 T 56 2 84 U 72 2 85 V 61 2 86 W 83 2 87 X 61 2 88 Y 56 2 89 Z 56 2 90 [ 39 3 91 \ 28 2 92 bs " ] 39 3 93 ^ 33 2 147 --- 42 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 72 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 44 0 118 w 67 0 119 x 44 0 120 y 44 1 121 z 39 0 122 { 40 3 123 | 28 3 124 } 40 3 125 ~ 33 2 148 --- 54 0 126 \` 33 2 145 ga " !! 39 1 161 ¡ " c| 50 3 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 28 3 166 ¦ " so 50 2 167 sc " § " "" 33 2 168 ¨ " :a " co 76 2 169 © " a_ 28 2 170 ª " << 50 0 171 « " -, 68 0 172 hy 33 0 173 -- 68 0 45 ­ " ro 76 2 174 rg " ® " -^ 33 2 175 -a " ´ " 0^ 40 2 176 ° " +- 68 2 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 50 1 181 µ " P! 52 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 31 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 50 1 191 ¿ " A` 61 2 192 À " A' 61 2 193 Á " A^ 61 2 194  " A~ 61 2 195 à " A" 61 2 196 Ä " A* 61 2 197 Å " AE 89 2 198 Æ " C, 67 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 33 2 204 Ì " I' 33 2 205 Í " I^ 33 2 206 Î " I" 33 2 207 Ï " D- 72 2 208 Ð " N~ 67 2 209 Ñ " O` 72 2 210 Ò " O' 72 2 211 Ó " O^ 72 2 212 Ô " O~ 72 2 213 Õ " O" 72 2 214 Ö " xx 68 0 215 × " O/ 72 3 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 56 2 221 Ý " TH 61 2 222 Þ " ss 50 3 223 ß " a` 50 2 224 à " a' 50 2 225 á " a^ 50 2 226 â " a~ 50 2 227 ã " a" 50 2 228 ä " a* 50 2 229 å " ae 67 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 50 2 240 ð " n~ 50 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 68 2 247 ÷ " o/ 50 3 248 ø " u` 50 2 249 ù " u' 50 2 250 ú " u^ 50 2 251 û " u" 50 2 252 ü " y' 44 3 253 ý " th 50 3 254 þ " y" 44 3 255 9base-6/troff/font/devutf/HX0000644000175000017500000000534111402154555015376 0ustar anselmanselmname HX fontname Helvetica-BoldOblique named in prologue spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 28 3 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 37 2 170 ª " << 56 0 171 « " -, 58 0 172 hy 33 0 173 -- 58 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 58 2 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 61 1 181 µ " P! 56 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 61 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 58 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 67 2 221 Ý " TH 67 2 222 Þ " ss 61 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 56 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 61 2 240 ð " n~ 61 2 241 ñ " o` 61 2 242 ò " o' 61 2 243 ó " o^ 61 2 244 ô " o~ 61 2 245 õ " o" 61 2 246 ö " -: 58 0 247 ÷ " o/ 61 0 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 56 3 253 ý " th 61 3 254 þ " y" 56 3 255 ÿ " 9base-6/troff/font/devutf/H0000644000175000017500000007505511402154555015257 0ustar anselmanselmname H fontname Helvetica named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 67 2 38 ' 22 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 < 58 0 60 = 58 0 61 > 58 0 62 ? 56 2 63 @ 102 3 64 A 67 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 50 2 74 K 67 2 75 L 56 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 28 3 91 \ 28 2 92 bs " ] 28 3 93 ^ 33 2 147 --- 47 2 94 --- 56 1 95 ` 22 2 96 a 56 0 97 b 56 2 98 c 50 0 99 d 56 2 100 e 56 0 101 f 28 2 102 g 56 1 103 h 56 2 104 i 22 2 105 j 22 3 106 k 50 2 107 l 22 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 56 1 113 r 33 0 114 s 50 0 115 t 28 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 50 0 122 { 33 3 123 --- 26 3 124 } 33 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 0 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 26 3 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 37 2 170 ª " << 56 0 171 « " -, 58 0 172 hy 33 0 173 -- 58 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 58 2 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 54 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 61 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 58 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 67 2 221 Ý " TH 67 2 222 Þ " ss 61 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 50 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 58 0 247 ÷ " o/ 61 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 56 3 254 þ " y" 50 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/HB0000644000175000017500000000533211402154555015350 0ustar anselmanselmname HB fontname Helvetica-Bold named in prologue spacewidth 28 charset ! 33 2 33 " 47 2 34 dq " # 56 2 35 $ 56 3 36 % 89 2 37 & 72 2 38 ' 28 2 39 ( 33 3 40 ) 33 3 41 * 39 2 42 + 58 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 33 0 58 ; 33 1 59 --- 58 0 60 = 58 0 61 --- 58 0 62 ? 61 2 63 @ 98 3 64 A 72 2 65 B 72 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 72 2 72 I 28 2 73 J 56 2 74 K 72 2 75 L 61 2 76 M 83 2 77 N 72 2 78 O 78 2 79 P 67 2 80 Q 78 2 81 R 72 2 82 S 67 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 94 2 87 X 67 2 88 Y 67 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 56 1 95 ` 28 2 96 a 56 0 97 b 61 2 98 c 56 0 99 d 61 2 100 e 56 0 101 f 33 2 102 g 61 1 103 h 61 2 104 i 28 2 105 j 28 3 106 k 56 2 107 l 28 2 108 m 89 0 109 n 61 0 110 o 61 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 56 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 78 0 119 x 56 0 120 y 56 1 121 z 50 0 122 { 39 3 123 --- 28 3 124 } 39 3 125 ~ 33 2 148 --- 58 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 28 3 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 37 2 170 ª " << 56 0 171 « " -, 58 0 172 hy 33 0 173 -- 58 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 58 2 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 61 1 181 µ " P! 56 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 56 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 61 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 58 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 67 2 221 Ý " TH 67 2 222 Þ " ss 61 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 89 0 230 æ " c, 56 1 231 ç " e` 56 2 232 è " e' 56 2 233 é " e^ 56 2 234 ê " e" 56 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 61 2 240 ð " n~ 61 2 241 ñ " o` 61 2 242 ò " o' 61 2 243 ó " o^ 61 2 244 ô " o~ 61 2 245 õ " o" 61 2 246 ö " -: 58 0 247 ÷ " o/ 61 0 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 56 3 253 ý " th 61 3 254 þ " y" 56 3 255 ÿ " 9base-6/troff/font/devutf/PI0000644000175000017500000000533211402154555015367 0ustar anselmanselmname PI fontname Palatino-Italic named in prologue spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 78 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 39 2 42 + 61 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 30 3 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 50 2 63 @ 75 2 64 A 72 2 65 B 61 2 66 C 67 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 78 2 72 I 33 2 73 J 33 3 74 K 67 2 75 L 56 2 76 M 94 2 77 N 78 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 44 0 97 b 46 2 98 c 41 0 99 d 50 2 100 e 39 0 101 f 28 3 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 44 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 44 0 111 p 50 1 112 q 46 1 113 r 39 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 50 2 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 33 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 50 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 33 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 50 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 94 2 198 Æ " C, 67 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 33 2 204 Ì " I' 33 2 205 Í " I^ 33 2 206 Î " I" 33 2 207 Ï " D- 78 2 208 Ð " N~ 78 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 61 0 215 × " O/ 78 2 216 Ø " U` 78 2 217 Ù " U' 78 2 218 Ú " U^ 78 2 219 Û " U" 78 2 220 Ü " Y' 67 2 221 Ý " TH 61 2 222 Þ " ss 50 3 223 ß " a` 44 2 224 à " a' 44 2 225 á " a^ 44 2 226 â " a~ 44 2 227 ã " a" 44 2 228 ä " a* 44 2 229 å " ae 64 0 230 æ " c, 41 1 231 ç " e` 39 2 232 è " e' 39 2 233 é " e^ 39 2 234 ê " e" 39 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 44 2 240 ð " n~ 56 2 241 ñ " o` 44 2 242 ò " o' 44 2 243 ó " o^ 44 2 244 ô " o~ 44 2 245 õ " o" 44 2 246 ö " -: 61 0 247 ÷ " o/ 44 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 50 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/CB0000644000175000017500000000526511402154555015350 0ustar anselmanselmname CB fontname Courier-Bold named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/CO0000644000175000017500000000526011402154555015360 0ustar anselmanselmname CO fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/BI0000644000175000017500000000533311402154555015352 0ustar anselmanselmname BI fontname Times-BoldItalic named in prologue spacewidth 25 charset ! 39 2 33 " 56 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 2 60 = 57 0 61 --- 57 2 62 ? 50 2 63 @ 83 3 64 A 67 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 67 2 69 F 67 2 70 G 72 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 67 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 61 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 67 2 86 W 89 2 87 X 67 2 88 Y 61 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 57 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 56 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 39 0 114 s 39 0 115 t 28 2 116 u 56 0 117 v 44 0 118 w 67 0 119 x 50 0 120 y 44 1 121 z 39 0 122 { 35 3 123 --- 22 2 124 } 35 3 125 ~ 33 2 148 --- 57 0 126 \` 33 2 145 ga " !! 39 1 161 ¡ " c| 50 3 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 22 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 27 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 57 2 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 58 1 181 µ " P! 50 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 30 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 50 1 191 ¿ " A` 67 2 192 À " A' 67 2 193 Á " A^ 67 2 194  " A~ 67 2 195 à " A" 67 2 196 Ä " A* 67 2 197 Å " AE 94 2 198 Æ " C, 67 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 39 2 204 Ì " I' 39 2 205 Í " I^ 39 2 206 Î " I" 39 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 72 2 210 Ò " O' 72 2 211 Ó " O^ 72 2 212 Ô " O~ 72 2 213 Õ " O" 72 2 214 Ö " xx 57 0 215 × " O/ 72 3 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 61 2 221 Ý " TH 61 2 222 Þ " ss 50 3 223 ß " a` 50 2 224 à " a' 50 2 225 á " a^ 50 2 226 â " a~ 50 2 227 ã " a" 50 2 228 ä " a* 50 2 229 å " ae 72 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 50 2 240 ð " n~ 56 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 57 0 247 ÷ " o/ 50 3 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 44 3 253 ý " th 50 3 254 þ " y" 44 3 255 ÿ " 9base-6/troff/font/devutf/LucidaSansB0000644000175000017500000000567711402154555017223 0ustar anselmanselmname LucidaSansB fontname LucidaSans-Demi spacewidth 32 charset ! 25 2 33 " 45 2 34 # 64 2 35 $ 64 2 36 % 78 2 37 & 75 2 38 ' 25 2 39 ( 36 2 40 ) 36 2 41 * 47 2 42 + 64 0 43 , 25 1 44 - 64 0 45 . 25 0 46 / 55 2 47 0 64 2 48 1 64 2 49 2 64 2 50 3 64 2 51 4 64 2 52 5 64 2 53 6 64 2 54 7 64 2 55 8 64 2 56 9 64 2 57 : 25 0 58 ; 25 1 59 < 64 2 60 = 64 0 61 > 64 2 62 ? 50 2 63 @ 84 3 64 A 74 2 65 B 63 2 66 C 71 2 67 D 79 2 68 E 60 2 69 F 57 2 70 G 75 2 71 H 78 2 72 I 33 2 73 J 42 2 74 K 71 2 75 L 58 2 76 M 91 2 77 N 77 2 78 O 82 2 79 P 61 2 80 Q 82 3 81 R 69 2 82 S 57 2 83 T 69 2 84 U 74 2 85 V 70 2 86 W 90 2 87 X 67 2 88 Y 69 2 89 Z 65 2 90 [ 36 3 91 \ 55 2 92 ] 36 3 93 ^ 64 2 94 _ 50 1 95 ` 25 2 96 a 59 0 97 b 66 2 98 c 53 0 99 d 66 2 100 e 59 0 101 f 41 2 102 g 66 1 103 h 66 2 104 i 33 2 105 j 33 3 106 k 63 2 107 l 33 2 108 m 97 0 109 n 66 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 45 0 114 s 57 0 115 t 41 2 116 u 66 0 117 v 59 0 118 w 86 0 119 x 59 0 120 y 58 1 121 z 59 0 122 { 36 3 123 | 25 3 124 } 36 3 125 ~ 64 2 126 ¡ 25 1 161 exclamdown ¢ 64 3 162 cent £ 64 2 163 sterling ¤ 64 2 164 currency ¥ 64 2 165 yen ¦ 25 2 166 brokenbar § 64 3 167 section ¨ 64 2 168 dieresis © 84 2 169 copyright ª 48 2 170 ordfeminine « 57 0 171 guillemotleft ¬ 64 0 172 logicalnot ­ 30 0 173 hyphen hy " ® 64 2 174 registered ¯ 64 2 175 macron ° 25 2 176 degree ± 64 2 177 plusminus ² 36 2 178 twosuperior ³ 36 2 179 threesuperior ´ 64 2 180 acute µ 66 1 181 mu ¶ 64 3 182 paragraph · 64 0 183 periodcentered ¸ 64 1 184 cedilla ¹ 37 2 185 onesuperior º 48 2 186 ordmasculine » 57 0 187 guillemotright ¼ 75 2 188 onequarter ½ 75 2 189 onehalf ¾ 75 2 190 threequarters ¿ 50 1 191 questiondown À 74 2 192 Agrave Á 74 2 193 Aacute  74 2 194 Acircumflex à 74 2 195 Atilde Ä 74 2 196 Adieresis Å 74 2 197 Aring Æ 96 2 198 AE Ç 71 3 199 Ccedilla È 60 2 200 Egrave É 60 2 201 Eacute Ê 60 2 202 Ecircumflex Ë 60 2 203 Edieresis Ì 33 2 204 Igrave Í 33 2 205 Iacute Î 33 2 206 Icircumflex Ï 33 2 207 Idieresis Ð 79 2 208 Eth Ñ 77 2 209 Ntilde Ò 82 2 210 Ograve Ó 82 2 211 Oacute Ô 82 2 212 Ocircumflex Õ 82 2 213 Otilde Ö 82 2 214 Odieresis × 64 0 215 multiply Ø 82 2 216 Oslash Ù 74 2 217 Ugrave Ú 74 2 218 Uacute Û 74 2 219 Ucircumflex Ü 74 2 220 Udieresis Ý 69 2 221 Yacute Þ 61 2 222 Thorn ß 66 2 223 germandbls à 59 2 224 agrave á 59 2 225 aacute â 59 2 226 acircumflex ã 59 2 227 atilde ä 59 2 228 adieresis å 59 2 229 aring æ 88 0 230 ae ç 53 1 231 ccedilla è 59 2 232 egrave é 59 2 233 eacute ê 59 2 234 ecircumflex ë 59 2 235 edieresis ì 33 2 236 igrave í 33 2 237 iacute î 33 2 238 icircumflex ï 33 2 239 idieresis ð 64 2 240 eth ñ 66 2 241 ntilde ò 64 2 242 ograve ó 64 2 243 oacute ô 64 2 244 ocircumflex õ 64 2 245 otilde ö 64 2 246 odieresis ÷ 64 0 247 divide ø 64 2 248 oslash ù 66 2 249 ugrave ú 66 2 250 uacute û 66 2 251 ucircumflex ü 66 2 252 udieresis ý 58 3 253 yacute þ 66 3 254 thorn ÿ 58 3 255 ydieresis 9base-6/troff/font/devutf/CI0000644000175000017500000000527011402154555015353 0ustar anselmanselmname CI fontname Courier-Oblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/DejaVuCondensedSansBold0000644000175000017500000007306511402154555021516 0ustar anselmanselmname DejaVuCondensedSansBold fontname DejaVuCondensedSansBold spacewidth 31 charset ! 43 2 33 0021 " 49 2 34 0022 dq " dq " # 80 2 35 0023 $ 66 3 36 0024 % 95 2 37 0025 & 83 2 38 0026 ( 43 3 40 0028 ) 43 3 41 0029 * 50 2 42 002a + 80 2 43 002b , 36 1 44 002c - 39 0 45 002d . 36 0 46 002e / 35 3 47 002f 0 66 2 48 0030 1 66 2 49 0031 2 66 2 50 0032 3 66 2 51 0033 4 66 2 52 0034 5 66 2 53 0035 6 66 2 54 0036 7 66 2 55 0037 8 66 2 56 0038 9 66 2 57 0039 : 38 0 58 003a ; 38 1 59 003b < 80 0 60 003c = 80 0 61 003d > 80 0 62 003e ? 55 2 63 003f @ 95 3 64 0040 A 73 2 65 0041 B 73 2 66 0042 C 70 2 67 0043 D 79 2 68 0044 E 65 2 69 0045 F 65 2 70 0046 G 78 2 71 0047 H 79 2 72 0048 I 35 2 73 0049 J 35 3 74 004a K 74 2 75 004b L 61 2 76 004c M 95 2 77 004d N 79 2 78 004e O 81 2 79 004f P 70 2 80 0050 Q 81 3 81 0051 R 73 2 82 0052 S 68 2 83 0053 T 65 2 84 0054 U 77 2 85 0055 V 73 2 86 0056 W 105 2 87 0057 X 73 2 88 0058 Y 69 2 89 0059 Z 69 2 90 005a [ 44 3 91 005b \ 35 3 92 005c bs " ] 43 3 93 005d ^ 80 2 94 005e _ 47 1 95 005f a 64 0 97 0061 b 68 2 98 0062 c 56 0 99 0063 d 68 2 100 0064 e 64 0 101 0065 f 41 2 102 0066 g 68 1 103 0067 h 68 2 104 0068 i 33 2 105 0069 j 32 3 106 006a k 64 2 107 006b l 33 2 108 006c m 99 0 109 006d n 68 0 110 006e o 65 0 111 006f p 68 1 112 0070 q 68 1 113 0071 r 47 0 114 0072 s 57 0 115 0073 t 45 2 116 0074 u 68 0 117 0075 v 62 0 118 0076 w 88 0 119 0077 x 61 0 120 0078 y 62 1 121 0079 z 55 0 122 007a { 68 3 123 007b | 35 3 124 007c } 68 3 125 007d ~ 80 0 126 007e   63 0 160 00a0 ¡ 43 2 161 00a1 ¢ 66 3 162 00a2 £ 66 2 163 00a3 ¤ 60 0 164 00a4 ¥ 66 2 165 00a5 ¦ 35 3 166 00a6 § 48 3 167 00a7 ¨ 47 2 168 00a8 © 95 2 169 00a9 ª 54 2 170 00aa « 61 0 171 00ab ¬ 80 0 172 00ac ­ 39 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 47 2 175 00af ° 47 2 176 00b0 ± 80 2 177 00b1 +- " ² 42 2 178 00b2 ³ 42 2 179 00b3 ´ 48 2 180 00b4 aa " µ 70 1 181 00b5 ¶ 60 3 182 00b6 · 36 0 183 00b7 ¸ 47 1 184 00b8 ¹ 42 2 185 00b9 º 54 2 186 00ba » 61 0 187 00bb ¼ 98 2 188 00bc ½ 98 2 189 00bd ¾ 98 2 190 00be ¿ 55 2 191 00bf À 73 2 192 00c0 Á 73 2 193 00c1  73 2 194 00c2 à 73 2 195 00c3 Ä 73 2 196 00c4 Å 73 2 197 00c5 Æ 103 2 198 00c6 Ç 70 3 199 00c7 È 65 2 200 00c8 É 65 2 201 00c9 Ê 65 2 202 00ca Ë 65 2 203 00cb Ì 35 2 204 00cc Í 36 2 205 00cd Î 35 2 206 00ce Ï 35 2 207 00cf Ð 79 2 208 00d0 Ñ 79 2 209 00d1 Ò 81 2 210 00d2 Ó 81 2 211 00d3 Ô 81 2 212 00d4 Õ 81 2 213 00d5 Ö 81 2 214 00d6 × 80 2 215 00d7 mu " Ø 81 2 216 00d8 Ù 77 2 217 00d9 Ú 77 2 218 00da Û 77 2 219 00db Ü 77 2 220 00dc Ý 69 2 221 00dd Þ 70 2 222 00de ß 69 2 223 00df à 64 2 224 00e0 á 64 2 225 00e1 â 64 2 226 00e2 ã 64 2 227 00e3 ä 64 2 228 00e4 å 64 2 229 00e5 æ 100 0 230 00e6 ç 56 1 231 00e7 è 64 2 232 00e8 é 64 2 233 00e9 ê 64 2 234 00ea ë 64 2 235 00eb ì 32 2 236 00ec í 33 2 237 00ed î 33 2 238 00ee ï 33 2 239 00ef ð 65 2 240 00f0 ñ 68 2 241 00f1 ò 65 2 242 00f2 ó 65 2 243 00f3 ô 65 2 244 00f4 õ 65 2 245 00f5 ö 65 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 65 0 248 00f8 ù 68 2 249 00f9 ú 68 2 250 00fa û 68 2 251 00fb ü 68 2 252 00fc ý 62 3 253 00fd þ 68 3 254 00fe ÿ 62 3 255 00ff ā 64 2 257 0101 Ă 73 2 258 0102 ă 64 2 259 0103 Ą 74 3 260 0104 ą 64 1 261 0105 Ć 70 2 262 0106 ć 56 2 263 0107 Ĉ 70 2 264 0108 ĉ 56 2 265 0109 Ċ 70 2 266 010a ċ 56 2 267 010b Č 70 2 268 010c č 56 2 269 010d Ď 79 2 270 010e ď 69 2 271 010f Đ 79 2 272 0110 đ 68 2 273 0111 Ē 65 2 274 0112 ē 64 2 275 0113 Ĕ 65 2 276 0114 ĕ 64 2 277 0115 Ė 65 2 278 0116 ė 64 2 279 0117 Ę 65 3 280 0118 ę 64 1 281 0119 Ě 65 2 282 011a ě 64 2 283 011b Ĝ 78 2 284 011c ĝ 68 3 285 011d Ğ 78 2 286 011e ğ 68 3 287 011f Ġ 78 2 288 0120 ġ 68 3 289 0121 Ģ 78 3 290 0122 ģ 68 3 291 0123 Ĥ 79 2 292 0124 ĥ 67 2 293 0125 Ħ 92 2 294 0126 ħ 75 2 295 0127 Ĩ 35 2 296 0128 ĩ 33 2 297 0129 Ī 35 2 298 012a ī 33 2 299 012b Ĭ 35 2 300 012c ĭ 33 2 301 012d Į 36 3 302 012e į 33 3 303 012f İ 35 2 304 0130 ı 33 0 305 0131 IJ 71 3 306 0132 ij 65 3 307 0133 Ĵ 35 3 308 0134 ĵ 32 3 309 0135 Ķ 74 3 310 0136 ķ 64 3 311 0137 ĸ 64 0 312 0138 Ĺ 61 2 313 0139 ĺ 33 2 314 013a Ļ 61 3 315 013b ļ 33 3 316 013c Ľ 61 2 317 013d ľ 46 2 318 013e Ŀ 61 2 319 013f ŀ 53 2 320 0140 Ł 61 2 321 0141 ł 35 2 322 0142 Ń 79 2 323 0143 ń 68 2 324 0144 Ņ 79 3 325 0145 ņ 68 1 326 0146 Ň 79 2 327 0147 ň 68 2 328 0148 ʼn 93 2 329 0149 Ŋ 79 3 330 014a ŋ 68 1 331 014b Ō 81 2 332 014c ō 65 2 333 014d Ŏ 81 2 334 014e ŏ 65 2 335 014f Ő 81 2 336 0150 ő 65 2 337 0151 Œ 111 2 338 0152 œ 104 0 339 0153 Ŕ 73 2 340 0154 ŕ 47 2 341 0155 Ŗ 73 3 342 0156 ŗ 47 1 343 0157 Ř 73 2 344 0158 ř 47 2 345 0159 Ś 68 2 346 015a ś 57 2 347 015b Ŝ 68 2 348 015c ŝ 57 2 349 015d Ş 68 3 350 015e ş 57 1 351 015f Š 68 2 352 0160 š 57 2 353 0161 Ţ 65 3 354 0162 ţ 45 3 355 0163 Ť 65 2 356 0164 ť 46 2 357 0165 Ŧ 65 2 358 0166 ŧ 45 2 359 0167 Ũ 77 2 360 0168 ũ 68 2 361 0169 Ū 77 2 362 016a ū 68 2 363 016b Ŭ 77 2 364 016c ŭ 68 2 365 016d Ů 77 2 366 016e ů 68 2 367 016f Ű 77 2 368 0170 ű 68 2 369 0171 Ų 77 3 370 0172 ų 68 1 371 0173 Ŵ 105 2 372 0174 ŵ 88 2 373 0175 Ŷ 69 2 374 0176 ŷ 62 3 375 0177 Ÿ 69 2 376 0178 Ź 69 2 377 0179 ź 55 2 378 017a Ż 69 2 379 017b ż 55 2 380 017c Ž 69 2 381 017d ž 55 2 382 017e ſ 41 2 383 017f ƀ 68 2 384 0180 Ɓ 76 2 385 0181 Ƃ 73 2 386 0182 ƃ 68 2 387 0183 Ƅ 72 2 388 0184 ƅ 68 2 389 0185 Ɔ 70 2 390 0186 Ƈ 70 2 391 0187 ƈ 57 2 392 0188 Ɖ 79 2 393 0189 Ɗ 83 2 394 018a Ƌ 73 2 395 018b ƌ 68 2 396 018c ƍ 65 1 397 018d Ǝ 65 2 398 018e Ə 81 2 399 018f Ɛ 66 2 400 0190 Ƒ 64 3 401 0191 ƒ 41 3 402 0192 Ɠ 78 2 403 0193 Ɣ 71 3 404 0194 ƕ 99 2 405 0195 Ɩ 42 2 406 0196 Ɨ 37 2 407 0197 Ƙ 74 2 408 0198 ƙ 64 2 409 0199 ƚ 34 2 410 019a ƛ 56 2 411 019b Ɯ 99 2 412 019c Ɲ 79 3 413 019d ƞ 68 1 414 019e Ɵ 81 2 415 019f Ơ 81 2 416 01a0 ơ 66 0 417 01a1 Ƣ 106 2 418 01a2 ƣ 91 1 419 01a3 Ƥ 74 2 420 01a4 ƥ 68 3 421 01a5 Ʀ 71 3 422 01a6 Ƨ 68 2 423 01a7 ƨ 56 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 52 3 426 01aa ƫ 45 3 427 01ab Ƭ 67 2 428 01ac ƭ 45 2 429 01ad Ʈ 65 3 430 01ae Ư 78 2 431 01af ư 68 0 432 01b0 Ʊ 73 2 433 01b1 Ʋ 77 2 434 01b2 Ƴ 69 2 435 01b3 ƴ 62 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 55 0 438 01b6 Ʒ 73 2 439 01b7 Ƹ 73 2 440 01b8 ƹ 61 1 441 01b9 ƻ 66 2 443 01bb Ƽ 73 2 444 01bc ƽ 61 1 445 01bd ƾ 54 2 446 01be ǀ 35 3 448 01c0 ǁ 71 3 449 01c1 ǂ 52 3 450 01c2 ǃ 35 2 451 01c3 DŽ 83 2 452 01c4 Dž 82 2 453 01c5 dž 71 2 454 01c6 LJ 62 3 455 01c7 Lj 62 3 456 01c8 lj 34 3 457 01c9 NJ 81 3 458 01ca Nj 81 3 459 01cb nj 69 3 460 01cc Ǎ 73 2 461 01cd ǎ 64 2 462 01ce Ǐ 35 2 463 01cf ǐ 33 2 464 01d0 Ǒ 81 2 465 01d1 ǒ 65 2 466 01d2 Ǔ 77 2 467 01d3 ǔ 68 2 468 01d4 ǖ 68 2 470 01d6 Ǘ 79 2 471 01d7 ǘ 70 2 472 01d8 Ǚ 79 2 473 01d9 ǚ 70 2 474 01da Ǜ 79 2 475 01db ǜ 69 2 476 01dc ǝ 64 0 477 01dd ǟ 64 2 479 01df Ǣ 103 2 482 01e2 ǣ 100 2 483 01e3 Ǫ 81 3 490 01ea ǫ 65 1 491 01eb Ǭ 81 3 492 01ec ǭ 65 3 493 01ed DZ 148 2 497 01f1 Dz 134 2 498 01f2 dz 123 2 499 01f3 Ƕ 122 2 502 01f6 Ș 68 3 536 0218 ș 57 1 537 0219 Ț 65 3 538 021a ț 45 3 539 021b Ȥ 69 3 548 0224 ȥ 55 1 549 0225 ȫ 65 2 555 022b ȭ 65 2 557 022d Ȯ 81 2 558 022e ȯ 65 2 559 022f ȱ 65 2 561 0231 Ȳ 69 2 562 0232 ȳ 62 3 563 0233 ȷ 32 1 567 0237 ȸ 103 2 568 0238 ȹ 103 1 569 0239 Ⱥ 73 2 570 023a Ȼ 70 2 571 023b ȼ 56 0 572 023c Ƚ 60 2 573 023d Ⱦ 65 2 574 023e ȿ 57 1 575 023f ɀ 56 1 576 0240 Ɂ 74 2 577 0241 ɐ 64 0 592 0250 ɑ 68 0 593 0251 ɒ 68 0 594 0252 ɓ 68 2 595 0253 ɔ 56 0 596 0254 ɕ 56 0 597 0255 ɖ 68 2 598 0256 ɗ 75 2 599 0257 ɘ 64 0 600 0258 ə 64 0 601 0259 ɚ 84 0 602 025a ɛ 52 0 603 025b ɜ 52 0 604 025c ɝ 74 0 605 025d ɞ 65 0 606 025e ɟ 32 1 607 025f ɠ 75 3 608 0260 ɡ 68 1 609 0261 ɢ 59 0 610 0262 ɣ 70 1 611 0263 ɤ 60 1 612 0264 ɥ 68 1 613 0265 ɦ 68 2 614 0266 ɧ 68 3 615 0267 ɨ 52 2 616 0268 ɩ 42 0 617 0269 ɪ 52 0 618 026a ɫ 53 2 619 026b ɬ 66 2 620 026c ɭ 33 3 621 026d ɮ 68 3 622 026e ɯ 99 0 623 026f ɰ 99 1 624 0270 ɱ 99 1 625 0271 ɲ 67 1 626 0272 ɳ 76 1 627 0273 ɴ 61 0 628 0274 ɵ 65 0 629 0275 ɶ 86 0 630 0276 ɷ 64 0 631 0277 ɸ 73 3 632 0278 ɹ 51 0 633 0279 ɺ 51 2 634 027a ɻ 62 1 635 027b ɼ 47 1 636 027c ɽ 47 1 637 027d ɾ 47 0 638 027e ɿ 47 0 639 027f ʀ 61 0 640 0280 ʁ 61 0 641 0281 ʂ 57 1 642 0282 ʃ 39 3 643 0283 ʄ 41 3 644 0284 ʅ 58 1 645 0285 ʆ 52 3 646 0286 ʇ 45 1 647 0287 ʈ 45 3 648 0288 ʉ 87 0 649 0289 ʊ 72 1 650 028a ʋ 64 0 651 028b ʌ 62 0 652 028c ʍ 88 0 653 028d ʎ 62 2 654 028e ʏ 68 0 655 028f ʐ 66 1 656 0290 ʑ 55 0 657 0291 ʒ 61 1 658 0292 ʓ 61 1 659 0293 ʔ 54 2 660 0294 ʕ 54 2 661 0295 ʖ 54 2 662 0296 ʗ 54 3 663 0297 ʘ 63 0 664 0298 ʙ 61 0 665 0299 ʚ 66 0 666 029a ʛ 65 2 667 029b ʜ 61 0 668 029c ʝ 32 3 669 029d ʞ 70 1 670 029e ʟ 47 0 671 029f ʠ 75 3 672 02a0 ʡ 54 2 673 02a1 ʢ 54 2 674 02a2 ʣ 110 2 675 02a3 ʤ 115 3 676 02a4 ʥ 110 3 677 02a5 ʦ 92 2 678 02a6 ʧ 73 3 679 02a7 ʨ 88 3 680 02a8 ʩ 97 3 681 02a9 ʪ 75 2 682 02aa ʫ 74 2 683 02ab ʬ 56 2 684 02ac ʭ 39 2 685 02ad ʮ 64 3 686 02ae ʯ 75 3 687 02af ʰ 43 2 688 02b0 ʱ 43 2 689 02b1 ʲ 20 2 690 02b2 ʳ 30 2 691 02b3 ʴ 30 2 692 02b4 ʵ 31 2 693 02b5 ʶ 39 2 694 02b6 ʷ 56 2 695 02b7 ʸ 40 2 696 02b8 ʻ 36 2 699 02bb ʼ 36 2 700 02bc ʾ 35 2 702 02be ʿ 35 2 703 02bf ˀ 31 2 704 02c0 ˁ 31 2 705 02c1 ˆ 47 2 710 02c6 ˇ 47 2 711 02c7 ˈ 29 2 712 02c8 ˌ 29 1 716 02cc ː 32 0 720 02d0 ˑ 32 0 721 02d1 ˒ 35 2 722 02d2 ˓ 35 0 723 02d3 ˖ 47 0 726 02d6 ˘ 47 2 728 02d8 ˙ 47 2 729 02d9 ˚ 47 2 730 02da ˛ 48 1 731 02db ˜ 47 2 732 02dc ˝ 48 2 733 02dd ˞ 33 0 734 02de ˠ 39 2 736 02e0 ˡ 21 2 737 02e1 ˢ 36 2 738 02e2 ˣ 39 2 739 02e3 ˤ 31 2 740 02e4 ˥ 48 2 741 02e5 ˦ 48 2 742 02e6 ˧ 48 2 743 02e7 ˨ 48 2 744 02e8 ˩ 48 2 745 02e9 ́ 48 2 769 0301 ̂ 47 2 770 0302 ̃ 47 2 771 0303 ̄ 47 2 772 0304 ̅ 0 2 773 0305 ̆ 47 2 774 0306 ̇ 47 2 775 0307 ̈ 47 2 776 0308 ̉ 0 2 777 0309 ̊ 47 2 778 030a ̋ 48 2 779 030b ̌ 47 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 36 0 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 69 1 801 0321 ̢ 69 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 29 2 884 0374 ͵ 29 1 885 0375 ͺ 48 1 890 037a ; 32 1 894 037e ΄ 43 2 900 0384 ΅ 48 2 901 0385 Ά 76 2 902 0386 · 36 0 903 0387 Έ 80 2 904 0388 Ή 95 2 905 0389 Ί 53 2 906 038a Ό 84 2 908 038c Ύ 93 2 910 038e Ώ 82 2 911 038f ΐ 37 2 912 0390 Α 73 2 913 0391 Β 73 2 914 0392 Γ 61 2 915 0393 Δ 73 2 916 0394 Ε 65 2 917 0395 Ζ 69 2 918 0396 Η 79 2 919 0397 Θ 81 2 920 0398 Ι 35 2 921 0399 Κ 74 2 922 039a Λ 73 2 923 039b Μ 95 2 924 039c Ν 79 2 925 039d Ξ 60 2 926 039e Ο 81 2 927 039f Π 79 2 928 03a0 Ρ 70 2 929 03a1 Σ 60 2 931 03a3 Τ 65 2 932 03a4 Υ 69 2 933 03a5 Φ 81 2 934 03a6 Χ 73 2 935 03a7 Ψ 75 2 936 03a8 Ω 73 2 937 03a9 Ϊ 38 2 938 03aa Ϋ 70 2 939 03ab ά 65 2 940 03ac έ 53 2 941 03ad ή 68 3 942 03ae ί 37 2 943 03af ΰ 58 2 944 03b0 α 65 0 945 03b1 β 64 3 946 03b2 γ 65 1 947 03b3 δ 65 2 948 03b4 ε 53 0 949 03b5 ζ 60 3 950 03b6 η 68 1 951 03b7 θ 64 2 952 03b8 ι 37 0 953 03b9 κ 68 0 954 03ba λ 60 2 955 03bb μ 70 1 956 03bc ν 65 0 957 03bd ξ 56 3 958 03be ο 65 0 959 03bf π 75 0 960 03c0 ρ 68 1 961 03c1 ς 56 1 962 03c2 σ 74 0 963 03c3 τ 55 0 964 03c4 υ 58 0 965 03c5 φ 74 1 966 03c6 χ 61 1 967 03c7 ψ 75 1 968 03c8 ω 79 0 969 03c9 ϊ 37 2 970 03ca ϋ 58 2 971 03cb ό 65 2 972 03cc ύ 58 2 973 03cd ώ 79 2 974 03ce ϐ 62 2 976 03d0 ϑ 63 2 977 03d1 ϒ 71 2 978 03d2 ϓ 93 2 979 03d3 ϔ 72 2 980 03d4 ϕ 76 3 981 03d5 ϖ 79 0 982 03d6 ϗ 71 1 983 03d7 Ϙ 81 3 984 03d8 ϙ 65 1 985 03d9 Ϛ 70 3 986 03da ϛ 56 1 987 03db Ϝ 65 2 988 03dc ϝ 46 3 989 03dd Ϟ 67 2 990 03de ϟ 63 2 991 03df Ϡ 87 3 992 03e0 ϡ 59 1 993 03e1 ϰ 71 0 1008 03f0 ϱ 68 1 1009 03f1 ϲ 56 0 1010 03f2 ϳ 32 3 1011 03f3 ϴ 81 2 1012 03f4 ϵ 61 0 1013 03f5 ϶ 61 0 1014 03f6 Ϸ 70 2 1015 03f7 ϸ 68 3 1016 03f8 Ϲ 70 2 1017 03f9 Ϻ 95 2 1018 03fa ϻ 69 1 1019 03fb ϼ 68 1 1020 03fc Ͻ 66 2 1021 03fd Ͼ 70 2 1022 03fe Ͽ 66 2 1023 03ff Ё 65 2 1025 0401 Ђ 83 3 1026 0402 Ѓ 61 2 1027 0403 Є 70 2 1028 0404 Ѕ 68 2 1029 0405 І 35 2 1030 0406 Ї 35 2 1031 0407 Ј 35 3 1032 0408 Љ 110 2 1033 0409 Њ 107 2 1034 040a Ћ 83 2 1035 040b Ќ 74 2 1036 040c Ѝ 79 2 1037 040d Ў 73 2 1038 040e Џ 79 3 1039 040f А 73 2 1040 0410 Б 73 2 1041 0411 В 73 2 1042 0412 Г 61 2 1043 0413 Д 91 3 1044 0414 Е 65 2 1045 0415 Ж 96 2 1046 0416 З 66 2 1047 0417 И 79 2 1048 0418 Й 79 2 1049 0419 К 74 2 1050 041a Л 79 2 1051 041b М 95 2 1052 041c Н 79 2 1053 041d О 81 2 1054 041e П 79 2 1055 041f Р 70 2 1056 0420 С 70 2 1057 0421 Т 65 2 1058 0422 У 73 2 1059 0423 Ф 81 2 1060 0424 Х 73 2 1061 0425 Ц 91 3 1062 0426 Ч 77 2 1063 0427 Ш 111 2 1064 0428 Щ 123 3 1065 0429 Ъ 89 2 1066 042a Ы 98 2 1067 042b Ь 73 2 1068 042c Э 70 2 1069 042d Ю 108 2 1070 042e Я 73 2 1071 042f а 64 0 1072 0430 б 65 2 1073 0431 в 58 0 1074 0432 г 50 0 1075 0433 д 78 1 1076 0434 е 64 0 1077 0435 ж 78 0 1078 0436 з 53 0 1079 0437 и 66 0 1080 0438 й 66 2 1081 0439 к 60 0 1082 043a л 65 0 1083 043b м 78 0 1084 043c н 66 0 1085 043d о 65 0 1086 043e п 66 0 1087 043f р 68 1 1088 0440 с 56 0 1089 0441 т 55 0 1090 0442 у 62 1 1091 0443 ф 87 3 1092 0444 х 61 0 1093 0445 ц 77 1 1094 0446 ч 65 0 1095 0447 ш 91 0 1096 0448 щ 102 1 1097 0449 ъ 71 0 1098 044a ы 82 0 1099 044b ь 58 0 1100 044c э 61 0 1101 044d ю 87 0 1102 044e я 61 0 1103 044f ѐ 64 2 1104 0450 ё 64 2 1105 0451 ђ 67 3 1106 0452 ѓ 50 2 1107 0453 є 61 0 1108 0454 ѕ 57 0 1109 0455 і 33 2 1110 0456 ї 33 2 1111 0457 ј 32 3 1112 0458 љ 91 0 1113 0459 њ 91 0 1114 045a ћ 67 2 1115 045b ќ 60 2 1116 045c ѝ 66 2 1117 045d ў 62 3 1118 045e џ 66 1 1119 045f Ѥ 96 2 1124 0464 ѥ 80 0 1125 0465 Ҋ 92 3 1162 048a ҋ 77 3 1163 048b Ҍ 72 2 1164 048c ҍ 58 2 1165 048d Ґ 61 2 1168 0490 ґ 50 2 1169 0491 Ғ 60 2 1170 0492 ғ 50 0 1171 0493 Ҕ 77 3 1172 0494 ҕ 64 1 1173 0495 Җ 99 3 1174 0496 җ 82 1 1175 0497 Ҙ 66 3 1176 0498 ҙ 53 1 1177 0499 Қ 74 3 1178 049a қ 60 1 1179 049b Ҡ 93 2 1184 04a0 ҡ 74 0 1185 04a1 Ң 91 3 1186 04a2 ң 77 1 1187 04a3 Ҥ 105 2 1188 04a4 ҥ 83 0 1189 04a5 Ҧ 121 3 1190 04a6 ҧ 97 1 1191 04a7 Ҫ 70 3 1194 04aa ҫ 56 1 1195 04ab Ҭ 65 3 1196 04ac ҭ 55 1 1197 04ad Ү 69 2 1198 04ae ү 62 1 1199 04af Ұ 69 2 1200 04b0 ұ 62 1 1201 04b1 Ҳ 73 3 1202 04b2 ҳ 61 1 1203 04b3 Ҵ 106 3 1204 04b4 ҵ 95 1 1205 04b5 Ҷ 78 3 1206 04b6 ҷ 66 1 1207 04b7 Һ 77 2 1210 04ba һ 65 0 1211 04bb Ӏ 33 2 1216 04c0 Ӂ 97 2 1217 04c1 ӂ 78 2 1218 04c2 Ӆ 90 3 1221 04c5 ӆ 66 1 1222 04c6 Ӈ 79 3 1223 04c7 ӈ 66 1 1224 04c8 Ӊ 91 3 1225 04c9 ӊ 77 1 1226 04ca Ӌ 77 3 1227 04cb ӌ 65 1 1228 04cc Ӎ 106 3 1229 04cd ӎ 89 1 1230 04ce Ӑ 73 2 1232 04d0 ӑ 64 2 1233 04d1 Ӓ 75 2 1234 04d2 ӓ 64 2 1235 04d3 Ӕ 103 2 1236 04d4 ӕ 100 0 1237 04d5 Ӗ 67 2 1238 04d6 ӗ 64 2 1239 04d7 Ә 81 2 1240 04d8 ә 64 0 1241 04d9 Ӛ 82 2 1242 04da ӛ 64 2 1243 04db Ӝ 97 2 1244 04dc ӝ 78 2 1245 04dd Ӟ 68 2 1246 04de ӟ 53 2 1247 04df Ӡ 73 2 1248 04e0 ӡ 61 1 1249 04e1 Ӣ 79 2 1250 04e2 ӣ 66 2 1251 04e3 Ӥ 81 2 1252 04e4 ӥ 66 2 1253 04e5 Ӧ 82 2 1254 04e6 ӧ 65 2 1255 04e7 Ө 81 2 1256 04e8 ө 65 0 1257 04e9 Ӫ 82 2 1258 04ea ӫ 65 2 1259 04eb Ӭ 71 2 1260 04ec ӭ 58 2 1261 04ed Ӯ 73 2 1262 04ee ӯ 62 3 1263 04ef Ӱ 75 2 1264 04f0 ӱ 62 3 1265 04f1 Ӳ 75 2 1266 04f2 ӳ 62 3 1267 04f3 Ӵ 79 2 1268 04f4 ӵ 65 2 1269 04f5 Ӷ 61 3 1270 04f6 ӷ 50 1 1271 04f7 Ӹ 100 2 1272 04f8 ӹ 82 2 1273 04f9 Ա 94 2 1329 0531 Բ 77 2 1330 0532 Գ 94 2 1331 0533 Դ 94 2 1332 0534 Ե 77 2 1333 0535 Զ 74 3 1334 0536 Է 77 3 1335 0537 Ը 77 3 1336 0538 Թ 93 2 1337 0539 Ժ 94 2 1338 053a Ի 77 2 1339 053b Լ 68 3 1340 053c Խ 102 2 1341 053d Ծ 108 2 1342 053e Կ 77 2 1343 053f Հ 68 3 1344 0540 Ձ 72 2 1345 0541 Ղ 94 3 1346 0542 Ճ 83 2 1347 0543 Մ 94 2 1348 0544 Յ 75 2 1349 0545 Ն 93 2 1350 0546 Շ 77 2 1351 0547 Ո 77 2 1352 0548 Չ 77 3 1353 0549 Պ 91 2 1354 054a Ջ 74 3 1355 054b Ռ 94 2 1356 054c Ս 77 2 1357 054d Վ 94 3 1358 054e Տ 68 2 1359 054f Ր 77 2 1360 0550 Ց 75 2 1361 0551 Ւ 85 2 1362 0552 Փ 81 2 1363 0553 Ք 89 2 1364 0554 Օ 81 2 1365 0555 Ֆ 68 2 1366 0556 ՙ 35 2 1369 0559 ՚ 36 2 1370 055a ՛ 52 2 1371 055b ՜ 52 2 1372 055c ՝ 36 2 1373 055d ՞ 52 2 1374 055e ՟ 49 2 1375 055f ա 99 0 1377 0561 բ 68 1 1378 0562 գ 78 1 1379 0563 դ 78 1 1380 0564 զ 78 1 1382 0566 է 62 3 1383 0567 ը 68 1 1384 0568 թ 77 1 1385 0569 ժ 78 2 1386 056a ի 68 3 1387 056b լ 48 1 1388 056c խ 99 3 1389 056d ծ 68 2 1390 056e կ 68 3 1391 056f հ 68 2 1392 0570 ձ 68 2 1393 0571 ղ 78 1 1394 0572 ճ 68 2 1395 0573 մ 72 2 1396 0574 յ 32 1 1397 0575 ն 83 2 1398 0576 շ 53 1 1399 0577 ո 68 0 1400 0578 չ 53 1 1401 0579 պ 99 1 1402 057a ջ 53 1 1403 057b ռ 68 0 1404 057c ս 68 0 1405 057d վ 77 3 1406 057e տ 99 0 1407 057f ր 68 1 1408 0580 ց 68 1 1409 0581 ւ 48 0 1410 0582 փ 99 3 1411 0583 ք 74 1 1412 0584 օ 65 0 1413 0585 ֆ 68 3 1414 0586 և 82 2 1415 0587 ։ 38 0 1417 0589 ֊ 51 0 1418 058a ᴂ 100 0 7426 1d02 ᴈ 53 0 7432 1d08 ᴉ 33 1 7433 1d09 ᴔ 104 0 7444 1d14 ᴖ 58 0 7446 1d16 ᴗ 58 0 7447 1d17 ᴝ 70 0 7453 1d1d ᴞ 90 0 7454 1d1e ᴟ 66 1 7455 1d1f ᵃ 43 2 7491 1d43 ᵄ 43 2 7492 1d44 ᵅ 45 2 7493 1d45 ᵆ 68 2 7494 1d46 ᵇ 45 2 7495 1d47 ᵈ 45 2 7496 1d48 ᵉ 45 2 7497 1d49 ᵊ 45 2 7498 1d4a ᵋ 37 2 7499 1d4b ᵌ 37 2 7500 1d4c ᵍ 45 2 7501 1d4d ᵎ 21 2 7502 1d4e ᵏ 46 2 7503 1d4f ᵐ 63 2 7504 1d50 ᵑ 43 2 7505 1d51 ᵒ 46 2 7506 1d52 ᵓ 39 2 7507 1d53 ᵔ 46 2 7508 1d54 ᵕ 46 0 7509 1d55 ᵖ 45 2 7510 1d56 ᵗ 37 2 7511 1d57 ᵘ 43 2 7512 1d58 ᵙ 44 2 7513 1d59 ᵚ 63 2 7514 1d5a ᵛ 48 2 7515 1d5b ᵷ 68 1 7543 1d77 ᵻ 35 0 7547 1d7b ᶅ 49 3 7557 1d85 ᶛ 45 2 7579 1d9b ᶜ 39 2 7580 1d9c ᶝ 39 2 7581 1d9d ᶞ 46 2 7582 1d9e ᶟ 37 2 7583 1d9f ᶠ 36 2 7584 1da0 ᶡ 33 2 7585 1da1 ᶢ 45 2 7586 1da2 ᶣ 43 2 7587 1da3 ᶤ 33 2 7588 1da4 ᶥ 27 2 7589 1da5 ᶦ 33 2 7590 1da6 ᶧ 33 2 7591 1da7 ᶨ 41 2 7592 1da8 ᶩ 31 2 7593 1da9 ᶪ 31 2 7594 1daa ᶫ 35 2 7595 1dab ᶬ 63 2 7596 1dac ᶭ 63 2 7597 1dad ᶮ 53 2 7598 1dae ᶯ 53 2 7599 1daf ᶰ 43 2 7600 1db0 ᶱ 46 2 7601 1db1 ᶲ 51 2 7602 1db2 ᶳ 40 2 7603 1db3 ᶴ 38 2 7604 1db4 ᶵ 37 2 7605 1db5 ᶶ 55 2 7606 1db6 ᶷ 47 2 7607 1db7 ᶹ 43 2 7609 1db9 ᶺ 48 2 7610 1dba ᶻ 40 2 7611 1dbb ᶼ 50 2 7612 1dbc ᶽ 45 2 7613 1dbd ᶾ 43 2 7614 1dbe ᶿ 40 2 7615 1dbf Ḍ 79 3 7692 1e0c ḍ 68 3 7693 1e0d Ḓ 79 3 7698 1e12 ḓ 68 3 7699 1e13 Ḥ 79 3 7716 1e24 ḥ 68 3 7717 1e25 Ḷ 61 3 7734 1e36 ḷ 33 3 7735 1e37 Ḹ 61 3 7736 1e38 ḹ 33 3 7737 1e39 Ḽ 61 3 7740 1e3c ḽ 33 3 7741 1e3d ṁ 99 2 7745 1e41 Ṃ 95 3 7746 1e42 ṃ 99 1 7747 1e43 Ṅ 79 2 7748 1e44 ṅ 68 2 7749 1e45 Ṇ 79 3 7750 1e46 ṇ 68 1 7751 1e47 Ṋ 79 3 7754 1e4a ṋ 68 1 7755 1e4b ṗ 68 3 7767 1e57 Ṛ 73 3 7770 1e5a ṛ 47 1 7771 1e5b Ṝ 73 3 7772 1e5c ṝ 47 3 7773 1e5d ṡ 57 2 7777 1e61 Ṣ 68 3 7778 1e62 ṣ 57 1 7779 1e63 Ṭ 65 3 7788 1e6c ṭ 45 3 7789 1e6d Ṱ 65 3 7792 1e70 ṱ 45 3 7793 1e71 Ṿ 73 3 7806 1e7e ṿ 62 1 7807 1e7f Ẁ 105 2 7808 1e80 ẁ 88 2 7809 1e81 Ẃ 105 2 7810 1e82 ẃ 88 2 7811 1e83 Ẅ 105 2 7812 1e84 ẅ 88 2 7813 1e85 Ẹ 65 3 7864 1eb8 ẹ 64 1 7865 1eb9 Ị 35 3 7882 1eca ị 33 3 7883 1ecb Ọ 81 3 7884 1ecc ọ 65 1 7885 1ecd Ụ 77 3 7908 1ee4 ụ 68 1 7909 1ee5 Ỳ 69 2 7922 1ef2 ỳ 62 3 7923 1ef3 ἁ 65 2 7937 1f01 ἂ 65 2 7938 1f02 ἃ 65 2 7939 1f03 ἄ 65 2 7940 1f04 ἅ 65 2 7941 1f05 ἆ 65 2 7942 1f06 ἇ 65 2 7943 1f07 Ἀ 73 2 7944 1f08 Ἁ 73 2 7945 1f09 Ἂ 98 2 7946 1f0a Ἃ 99 2 7947 1f0b Ἄ 88 2 7948 1f0c Ἅ 91 2 7949 1f0d Ἆ 79 2 7950 1f0e Ἇ 81 2 7951 1f0f ἐ 53 2 7952 1f10 ἑ 53 2 7953 1f11 ἒ 53 2 7954 1f12 ἓ 53 2 7955 1f13 ἔ 53 2 7956 1f14 ἕ 53 2 7957 1f15 Ἐ 75 2 7960 1f18 Ἑ 75 2 7961 1f19 Ἒ 104 2 7962 1f1a Ἓ 104 2 7963 1f1b Ἔ 97 2 7964 1f1c Ἕ 99 2 7965 1f1d ἠ 68 3 7968 1f20 ἡ 68 3 7969 1f21 ἢ 68 3 7970 1f22 ἣ 68 3 7971 1f23 ἤ 68 3 7972 1f24 ἥ 68 3 7973 1f25 ἦ 68 3 7974 1f26 ἧ 68 3 7975 1f27 Ἠ 89 2 7976 1f28 Ἡ 90 2 7977 1f29 Ἢ 118 2 7978 1f2a Ἣ 118 2 7979 1f2b Ἤ 111 2 7980 1f2c Ἥ 114 2 7981 1f2d Ἦ 99 2 7982 1f2e Ἧ 100 2 7983 1f2f ἰ 37 2 7984 1f30 ἱ 37 2 7985 1f31 ἲ 37 2 7986 1f32 ἳ 37 2 7987 1f33 ἴ 37 2 7988 1f34 ἵ 37 2 7989 1f35 ἶ 37 2 7990 1f36 ἷ 37 2 7991 1f37 Ἰ 45 2 7992 1f38 Ἱ 46 2 7993 1f39 Ἲ 73 2 7994 1f3a Ἳ 74 2 7995 1f3b Ἴ 67 2 7996 1f3c Ἵ 70 2 7997 1f3d Ἶ 57 2 7998 1f3e Ἷ 57 2 7999 1f3f ὀ 65 2 8000 1f40 ὁ 65 2 8001 1f41 ὂ 65 2 8002 1f42 ὃ 65 2 8003 1f43 ὄ 65 2 8004 1f44 ὅ 65 2 8005 1f45 Ὀ 84 2 8008 1f48 Ὁ 88 2 8009 1f49 Ὂ 115 2 8010 1f4a Ὃ 116 2 8011 1f4b Ὄ 99 2 8012 1f4c Ὅ 102 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 58 2 8020 1f54 ὕ 58 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 88 2 8025 1f59 Ὓ 112 2 8027 1f5b Ὕ 114 2 8029 1f5d Ὗ 99 2 8031 1f5f ὠ 79 2 8032 1f60 ὡ 79 2 8033 1f61 ὢ 79 2 8034 1f62 ὣ 79 2 8035 1f63 ὤ 79 2 8036 1f64 ὥ 79 2 8037 1f65 ὦ 79 2 8038 1f66 ὧ 79 2 8039 1f67 Ὠ 78 2 8040 1f68 Ὡ 83 2 8041 1f69 Ὢ 110 2 8042 1f6a Ὣ 111 2 8043 1f6b Ὤ 94 2 8044 1f6c Ὥ 97 2 8045 1f6d Ὦ 90 2 8046 1f6e Ὧ 94 2 8047 1f6f ὰ 65 2 8048 1f70 ά 65 2 8049 1f71 ὲ 53 2 8050 1f72 έ 53 2 8051 1f73 ὴ 68 3 8052 1f74 ή 68 3 8053 1f75 ὶ 37 2 8054 1f76 ί 37 2 8055 1f77 ὸ 65 2 8056 1f78 ό 65 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 79 2 8060 1f7c ώ 79 2 8061 1f7d ᾀ 65 3 8064 1f80 ᾁ 65 3 8065 1f81 ᾂ 65 3 8066 1f82 ᾃ 65 3 8067 1f83 ᾄ 65 3 8068 1f84 ᾅ 65 3 8069 1f85 ᾆ 65 3 8070 1f86 ᾇ 65 3 8071 1f87 ᾈ 73 3 8072 1f88 ᾉ 73 3 8073 1f89 ᾊ 98 3 8074 1f8a ᾋ 99 3 8075 1f8b ᾌ 88 3 8076 1f8c ᾍ 91 3 8077 1f8d ᾎ 79 3 8078 1f8e ᾏ 81 3 8079 1f8f ᾐ 68 3 8080 1f90 ᾑ 68 3 8081 1f91 ᾒ 67 3 8082 1f92 ᾓ 68 3 8083 1f93 ᾔ 68 3 8084 1f94 ᾕ 68 3 8085 1f95 ᾖ 68 3 8086 1f96 ᾗ 68 3 8087 1f97 ᾘ 89 3 8088 1f98 ᾙ 90 3 8089 1f99 ᾚ 118 3 8090 1f9a ᾛ 118 3 8091 1f9b ᾜ 111 3 8092 1f9c ᾝ 114 3 8093 1f9d ᾞ 99 3 8094 1f9e ᾟ 100 3 8095 1f9f ᾠ 79 3 8096 1fa0 ᾡ 79 3 8097 1fa1 ᾢ 79 3 8098 1fa2 ᾣ 79 3 8099 1fa3 ᾤ 79 3 8100 1fa4 ᾥ 79 3 8101 1fa5 ᾦ 79 3 8102 1fa6 ᾧ 79 3 8103 1fa7 ᾨ 78 3 8104 1fa8 ᾩ 83 3 8105 1fa9 ᾪ 110 3 8106 1faa ᾫ 111 3 8107 1fab ᾬ 94 3 8108 1fac ᾭ 97 3 8109 1fad ᾮ 90 3 8110 1fae ᾯ 94 3 8111 1faf ᾰ 65 2 8112 1fb0 ᾱ 65 2 8113 1fb1 ᾲ 65 3 8114 1fb2 ᾳ 65 1 8115 1fb3 ᾴ 65 3 8116 1fb4 ᾶ 65 2 8118 1fb6 ᾷ 65 3 8119 1fb7 Ᾰ 75 2 8120 1fb8 Ᾱ 73 2 8121 1fb9 Ὰ 83 2 8122 1fba Ά 76 2 8123 1fbb ᾼ 73 3 8124 1fbc ᾽ 47 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 47 2 8127 1fbf ῀ 47 2 8128 1fc0 ῁ 47 2 8129 1fc1 ῂ 68 3 8130 1fc2 ῃ 68 1 8131 1fc3 ῄ 68 3 8132 1fc4 ῆ 68 3 8134 1fc6 ῇ 68 3 8135 1fc7 Ὲ 88 2 8136 1fc8 Έ 80 2 8137 1fc9 Ὴ 102 2 8138 1fca Ή 95 2 8139 1fcb ῌ 79 3 8140 1fcc ῍ 47 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 47 2 8143 1fcf ῐ 37 2 8144 1fd0 ῑ 37 2 8145 1fd1 ῒ 37 2 8146 1fd2 ΐ 37 2 8147 1fd3 ῖ 37 2 8150 1fd6 ῗ 37 2 8151 1fd7 Ῐ 38 2 8152 1fd8 Ῑ 35 2 8153 1fd9 Ὶ 58 2 8154 1fda Ί 53 2 8155 1fdb ῝ 47 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 47 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 68 3 8164 1fe4 ῥ 68 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 71 2 8168 1fe8 Ῡ 69 2 8169 1fe9 Ὺ 97 2 8170 1fea Ύ 93 2 8171 1feb Ῥ 79 2 8172 1fec ῭ 47 2 8173 1fed ΅ 48 2 8174 1fee ` 47 2 8175 1fef ῲ 79 3 8178 1ff2 ῳ 79 1 8179 1ff3 ῴ 79 3 8180 1ff4 ῶ 79 2 8182 1ff6 ῷ 79 3 8183 1ff7 Ὸ 101 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 95 2 8186 1ffa Ώ 82 2 8187 1ffb ῼ 73 3 8188 1ffc ´ 48 2 8189 1ffd ῾ 47 2 8190 1ffe ‐ 39 0 8208 2010 ‑ 39 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 36 2 8216 2018 ` " ‘ " ’ 36 2 8217 2019 ' " ’ " ‚ 36 1 8218 201a ‛ 36 2 8219 201b “ 62 2 8220 201c ” 62 2 8221 201d „ 62 1 8222 201e ‟ 62 2 8223 201f † 47 3 8224 2020 ‡ 47 3 8225 2021 • 61 0 8226 2022 ‣ 61 0 8227 2023 ․ 32 0 8228 2024 ‥ 63 0 8229 2025 … 95 0 8230 2026 ‰ 137 2 8240 2030 ‱ 179 2 8241 2031 ‹ 39 0 8249 2039 › 39 0 8250 203a ‼ 60 2 8252 203c ‽ 55 2 8253 203d ‾ 47 2 8254 203e ⁇ 98 2 8263 2047 ⁈ 79 2 8264 2048 ⁉ 79 2 8265 2049 ⁰ 42 2 8304 2070 ⁴ 42 2 8308 2074 ⁵ 42 2 8309 2075 ⁶ 42 2 8310 2076 ⁷ 42 2 8311 2077 ⁸ 42 2 8312 2078 ⁹ 42 2 8313 2079 ⁿ 43 2 8319 207f ₦ 79 2 8358 20a6 € 66 2 8364 20ac ₵ 66 3 8373 20b5 ℃ 115 2 8451 2103 № 128 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 73 2 8486 2126 ℧ 73 2 8487 2127 K 74 2 8490 212a Å 73 2 8491 212b Ⅎ 65 2 8498 2132 ⅋ 83 2 8523 214b Ⅰ 35 2 8544 2160 Ⅱ 63 2 8545 2161 Ⅲ 90 2 8546 2162 Ⅳ 105 2 8547 2163 Ⅴ 73 2 8548 2164 Ⅵ 104 2 8549 2165 Ⅶ 131 2 8550 2166 Ⅷ 159 2 8551 2167 Ⅸ 107 2 8552 2168 Ⅹ 73 2 8553 2169 Ⅺ 106 2 8554 216a Ⅻ 133 2 8555 216b Ⅼ 61 2 8556 216c Ⅽ 70 2 8557 216d Ⅾ 79 2 8558 216e Ⅿ 95 2 8559 216f ⅰ 33 2 8560 2170 ⅱ 58 2 8561 2171 ⅲ 83 2 8562 2172 ⅳ 94 2 8563 2173 ⅴ 62 0 8564 2174 ⅵ 91 2 8565 2175 ⅶ 116 2 8566 2176 ⅷ 141 2 8567 2177 ⅸ 92 2 8568 2178 ⅹ 61 0 8569 2179 ⅺ 92 2 8570 217a ⅻ 117 2 8571 217b ⅼ 33 2 8572 217c ⅽ 56 0 8573 217d ⅾ 68 2 8574 217e ⅿ 99 0 8575 217f ↀ 122 2 8576 2180 Ↄ 70 2 8579 2183 ∂ 52 2 8706 2202 pd " ∃ 60 2 8707 2203 te " ∆ 66 2 8710 2206 ∇ 66 2 8711 2207 gr " ∊ 75 0 8714 220a ∍ 75 0 8717 220d st " ∏ 75 3 8719 220f ∐ 75 3 8720 2210 ∑ 68 3 8721 2211 − 80 0 8722 2212 ∓ 80 2 8723 2213 ∕ 16 2 8725 2215 ∗ 59 0 8727 2217 ** " ∘ 59 0 8728 2218 ∙ 36 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 77 0 8743 2227 l∧ 77 0 8743 2227 " ∨ 77 0 8744 2228 l| " ∩ 77 0 8745 2229 ca " ∪ 77 0 8746 222a cu " ∫ 58 3 8747 222b is " ∬ 95 3 8748 222c ∭ 132 3 8749 222d ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≣ 80 3 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ⌂ 68 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 88 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 59 3 8992 2320 ⌡ 57 3 8993 2321 ⌥ 95 2 8997 2325 〈 44 3 9001 2329 〉 43 3 9002 232a ⍽ 82 1 9085 237d ⎮ 58 3 9134 23ae ⏏ 73 0 9167 23cf ␢ 67 2 9250 2422 ␣ 68 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 61 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 61 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⚀ 83 2 9856 2680 ⚁ 83 2 9857 2681 ⚂ 83 2 9858 2682 ⚃ 83 2 9859 2683 ⚄ 83 2 9860 2684 ⚅ 83 2 9861 2685 ⟠ 47 3 10208 27e0 ⟨ 44 3 10216 27e8 ⟩ 43 3 10217 27e9 ⟪ 69 3 10218 27ea ⟫ 68 3 10219 27eb ⧫ 47 3 10731 29eb ⨌ 169 3 10764 2a0c ⨍ 58 3 10765 2a0d ⨎ 58 3 10766 2a0e ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 70 2 64257 fb01 fl 70 2 64258 fb02 ffi 106 2 64259 fb03 ffl 106 2 64260 fb04 ﬓ 132 2 64275 fb13 ﬔ 131 2 64276 fb14 ﬕ 131 3 64277 fb15 ﬖ 131 3 64278 fb16 ﬗ 163 3 64279 fb17 � 106 3 65533 fffd 9base-6/troff/font/devutf/DejaVuMonoSans0000644000175000017500000005604111402154555017716 0ustar anselmanselmname DejaVuMonoSans fontname DejaVuMonoSans spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 0 60 003c = 60 0 61 003d > 60 0 62 003e ? 60 2 63 003f @ 60 3 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e   60 0 160 00a0 ¡ 60 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 0 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 3 188 00bc ½ 60 3 189 00bd ¾ 60 3 190 00be ¿ 60 2 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 0 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f Ɓ 60 2 385 0181 Ƃ 60 2 386 0182 ƃ 60 2 387 0183 Ƅ 60 2 388 0184 ƅ 60 2 389 0185 Ɔ 60 2 390 0186 Ƈ 60 2 391 0187 ƈ 60 2 392 0188 Ɖ 60 2 393 0189 Ɗ 60 2 394 018a Ƌ 60 2 395 018b ƌ 60 2 396 018c ƍ 60 1 397 018d Ǝ 60 2 398 018e Ə 60 2 399 018f Ɛ 60 2 400 0190 Ƒ 60 3 401 0191 ƒ 60 3 402 0192 Ɠ 60 2 403 0193 Ɣ 60 3 404 0194 ƕ 60 2 405 0195 Ɩ 60 2 406 0196 Ɨ 60 2 407 0197 Ƙ 60 2 408 0198 ƙ 60 2 409 0199 ƚ 60 2 410 019a ƛ 60 2 411 019b Ɯ 60 2 412 019c Ɲ 60 3 413 019d ƞ 60 1 414 019e Ɵ 60 2 415 019f Ơ 60 2 416 01a0 ơ 60 0 417 01a1 Ƣ 60 2 418 01a2 ƣ 60 1 419 01a3 Ƥ 60 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 60 3 426 01aa ƫ 60 3 427 01ab Ƭ 60 2 428 01ac ƭ 60 2 429 01ad Ʈ 60 3 430 01ae Ư 60 2 431 01af ư 60 0 432 01b0 Ʊ 60 2 433 01b1 Ʋ 60 2 434 01b2 Ƴ 60 2 435 01b3 ƴ 60 1 436 01b4 Ƶ 60 2 437 01b5 ƶ 60 0 438 01b6 Ʒ 60 2 439 01b7 Ƹ 60 2 440 01b8 ƹ 60 1 441 01b9 ƻ 60 2 443 01bb Ƽ 60 2 444 01bc ƽ 60 1 445 01bd ƾ 60 2 446 01be ǀ 60 2 448 01c0 ǁ 60 2 449 01c1 ǂ 60 2 450 01c2 ǃ 60 2 451 01c3 Ǎ 60 2 461 01cd ǎ 60 2 462 01ce Ǐ 60 2 463 01cf ǐ 60 2 464 01d0 Ǒ 60 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 60 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 60 2 471 01d7 ǘ 60 2 472 01d8 Ǚ 60 2 473 01d9 ǚ 60 2 474 01da Ǜ 60 2 475 01db ǜ 60 2 476 01dc ǝ 60 0 477 01dd ǟ 60 2 479 01df Ǣ 60 2 482 01e2 ǣ 60 2 483 01e3 Ǫ 60 3 490 01ea ǫ 60 1 491 01eb Ǭ 60 3 492 01ec ǭ 60 3 493 01ed Ƕ 60 2 502 01f6 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b Ȥ 60 3 548 0224 ȥ 60 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 60 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 60 2 562 0232 ȳ 60 3 563 0233 ȷ 60 1 567 0237 ȸ 60 2 568 0238 ȹ 60 1 569 0239 Ⱥ 60 2 570 023a Ȼ 60 2 571 023b ȼ 60 0 572 023c Ƚ 60 2 573 023d Ⱦ 60 2 574 023e ȿ 60 1 575 023f ɀ 60 1 576 0240 Ɂ 60 2 577 0241 ɐ 60 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 60 0 596 0254 ɕ 60 1 597 0255 ɖ 60 3 598 0256 ɗ 60 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 60 0 602 025a ɛ 60 0 603 025b ɜ 60 0 604 025c ɝ 60 0 605 025d ɞ 60 0 606 025e ɟ 60 1 607 025f ɠ 60 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 60 1 611 0263 ɤ 60 0 612 0264 ɥ 60 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 60 2 616 0268 ɩ 60 0 617 0269 ɪ 60 0 618 026a ɫ 60 2 619 026b ɬ 60 2 620 026c ɭ 60 3 621 026d ɮ 60 3 622 026e ɯ 60 0 623 026f ɰ 60 1 624 0270 ɱ 60 1 625 0271 ɲ 60 1 626 0272 ɳ 60 1 627 0273 ɴ 60 0 628 0274 ɵ 60 0 629 0275 ɶ 60 0 630 0276 ɷ 60 0 631 0277 ɸ 60 3 632 0278 ɹ 60 0 633 0279 ɺ 60 1 634 027a ɻ 60 1 635 027b ɼ 60 1 636 027c ɽ 60 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 60 1 642 0282 ʃ 60 3 643 0283 ʄ 60 3 644 0284 ʅ 60 1 645 0285 ʆ 60 3 646 0286 ʇ 60 1 647 0287 ʈ 60 3 648 0288 ʉ 60 0 649 0289 ʊ 60 0 650 028a ʋ 60 0 651 028b ʌ 60 0 652 028c ʍ 60 0 653 028d ʎ 60 2 654 028e ʏ 60 0 655 028f ʐ 60 1 656 0290 ʑ 60 1 657 0291 ʒ 60 1 658 0292 ʓ 60 1 659 0293 ʔ 60 2 660 0294 ʕ 60 2 661 0295 ʖ 60 2 662 0296 ʗ 60 3 663 0297 ʘ 60 0 664 0298 ʙ 60 0 665 0299 ʚ 60 0 666 029a ʛ 60 2 667 029b ʜ 60 0 668 029c ʝ 60 3 669 029d ʞ 60 1 670 029e ʟ 60 0 671 029f ʠ 60 3 672 02a0 ʡ 60 2 673 02a1 ʢ 60 2 674 02a2 ʣ 60 2 675 02a3 ʤ 60 3 676 02a4 ʥ 60 3 677 02a5 ʦ 60 2 678 02a6 ʧ 60 3 679 02a7 ʨ 60 3 680 02a8 ʩ 60 3 681 02a9 ʪ 60 2 682 02aa ʫ 60 2 683 02ab ʬ 60 2 684 02ac ʭ 60 2 685 02ad ʮ 60 3 686 02ae ʯ 60 3 687 02af ʰ 60 2 688 02b0 ʱ 60 2 689 02b1 ʲ 60 2 690 02b2 ʳ 60 2 691 02b3 ʴ 60 2 692 02b4 ʵ 60 2 693 02b5 ʶ 60 2 694 02b6 ʷ 60 2 695 02b7 ʸ 60 2 696 02b8 ʻ 60 2 699 02bb ʼ 60 2 700 02bc ʾ 60 2 702 02be ʿ 60 2 703 02bf ˀ 60 2 704 02c0 ˁ 60 2 705 02c1 ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˈ 60 2 712 02c8 ˌ 60 1 716 02cc ː 60 0 720 02d0 ˑ 60 0 721 02d1 ˒ 60 0 722 02d2 ˓ 60 0 723 02d3 ˖ 60 0 726 02d6 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ˞ 60 0 734 02de ˠ 60 2 736 02e0 ˡ 60 2 737 02e1 ˢ 60 2 738 02e2 ˣ 60 2 739 02e3 ˤ 60 2 740 02e4 ˥ 60 2 741 02e5 ˦ 60 2 742 02e6 ˧ 60 2 743 02e7 ˨ 60 2 744 02e8 ˩ 60 2 745 02e9 ́ 60 2 769 0301 ̂ 60 2 770 0302 ̃ 60 2 771 0303 ̄ 60 2 772 0304 ̅ 60 2 773 0305 ̆ 60 2 774 0306 ̇ 60 2 775 0307 ̈ 60 2 776 0308 ̉ 60 2 777 0309 ̊ 60 2 778 030a ̋ 60 2 779 030b ̌ 60 2 780 030c ̍ 60 2 781 030d ̎ 60 2 782 030e ̏ 60 2 783 030f ̐ 60 2 784 0310 ̑ 60 2 785 0311 ̒ 60 2 786 0312 ̓ 60 2 787 0313 ̔ 60 2 788 0314 ̕ 60 2 789 0315 ̖ 60 1 790 0316 ̗ 60 1 791 0317 ̘ 60 1 792 0318 ̙ 60 1 793 0319 ̚ 60 2 794 031a ̛ 60 0 795 031b ̜ 60 1 796 031c ̝ 60 1 797 031d ̞ 60 1 798 031e ̟ 60 1 799 031f ̠ 60 1 800 0320 ̡ 60 1 801 0321 ̢ 60 1 802 0322 ̣ 60 1 803 0323 ̤ 60 1 804 0324 ̥ 60 1 805 0325 ̦ 60 1 806 0326 ̧ 60 1 807 0327 ̨ 60 1 808 0328 ̩ 60 1 809 0329 ̪ 60 1 810 032a ̫ 60 1 811 032b ̬ 60 1 812 032c ̭ 60 1 813 032d ̮ 60 1 814 032e ̯ 60 1 815 032f ̰ 60 1 816 0330 ̱ 60 1 817 0331 ̲ 60 1 818 0332 ̳ 60 1 819 0333 ̴ 60 0 820 0334 ̵ 60 0 821 0335 ̶ 60 0 822 0336 ̷ 60 0 823 0337 ̸ 60 2 824 0338 ̹ 60 1 825 0339 ̺ 60 1 826 033a ̻ 60 1 827 033b ̼ 60 1 828 033c ̽ 60 2 829 033d ̾ 60 2 830 033e ̿ 60 2 831 033f ͘ 60 2 856 0358 ͡ 60 2 865 0361 ʹ 60 2 884 0374 ͵ 60 1 885 0375 ͺ 60 1 890 037a ; 60 1 894 037e ΄ 60 2 900 0384 ΅ 60 2 901 0385 Ά 60 2 902 0386 · 60 0 903 0387 Έ 60 2 904 0388 Ή 60 2 905 0389 Ί 60 2 906 038a Ό 60 2 908 038c Ύ 60 2 910 038e Ώ 60 2 911 038f ΐ 60 2 912 0390 Α 60 2 913 0391 Β 60 2 914 0392 Γ 60 2 915 0393 Δ 60 2 916 0394 Ε 60 2 917 0395 Ζ 60 2 918 0396 Η 60 2 919 0397 Θ 60 2 920 0398 Ι 60 2 921 0399 Κ 60 2 922 039a Λ 60 2 923 039b Μ 60 2 924 039c Ν 60 2 925 039d Ξ 60 2 926 039e Ο 60 2 927 039f Π 60 2 928 03a0 Ρ 60 2 929 03a1 Σ 60 2 931 03a3 Τ 60 2 932 03a4 Υ 60 2 933 03a5 Φ 60 2 934 03a6 Χ 60 2 935 03a7 Ψ 60 2 936 03a8 Ω 60 2 937 03a9 Ϊ 60 2 938 03aa Ϋ 60 2 939 03ab ά 60 2 940 03ac έ 60 2 941 03ad ή 60 3 942 03ae ί 60 2 943 03af ΰ 60 2 944 03b0 α 60 0 945 03b1 β 60 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 60 0 949 03b5 ζ 60 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 60 0 953 03b9 κ 60 0 954 03ba λ 60 2 955 03bb μ 60 1 956 03bc ν 60 0 957 03bd ξ 60 3 958 03be ο 60 0 959 03bf π 60 0 960 03c0 ρ 60 1 961 03c1 ς 60 1 962 03c2 σ 60 0 963 03c3 τ 60 0 964 03c4 υ 60 0 965 03c5 φ 60 1 966 03c6 χ 60 1 967 03c7 ψ 60 1 968 03c8 ω 60 0 969 03c9 ϊ 60 2 970 03ca ϋ 60 2 971 03cb ό 60 2 972 03cc ύ 60 2 973 03cd ώ 60 2 974 03ce ϐ 60 2 976 03d0 ϑ 60 2 977 03d1 ϒ 60 2 978 03d2 ϓ 60 2 979 03d3 ϔ 60 2 980 03d4 ϕ 60 3 981 03d5 ϖ 60 0 982 03d6 ϗ 60 1 983 03d7 Ϙ 60 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 60 3 986 03da ϛ 60 1 987 03db Ϝ 60 2 988 03dc ϝ 60 3 989 03dd Ϟ 60 2 990 03de ϟ 60 2 991 03df Ϡ 60 3 992 03e0 ϡ 60 1 993 03e1 ϰ 60 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 60 0 1010 03f2 ϳ 60 3 1011 03f3 ϴ 60 2 1012 03f4 ϵ 60 0 1013 03f5 ϶ 60 0 1014 03f6 Ϸ 60 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 60 2 1017 03f9 Ϻ 60 2 1018 03fa ϻ 60 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 60 2 1021 03fd Ͼ 60 2 1022 03fe Ͽ 60 2 1023 03ff Ё 60 2 1025 0401 Ђ 60 3 1026 0402 Ѓ 60 2 1027 0403 Є 60 2 1028 0404 Ѕ 60 2 1029 0405 І 60 2 1030 0406 Ї 60 2 1031 0407 Ј 60 2 1032 0408 Љ 60 2 1033 0409 Њ 60 2 1034 040a Ћ 60 2 1035 040b Ќ 60 2 1036 040c Ѝ 60 2 1037 040d Ў 60 2 1038 040e Џ 60 3 1039 040f А 60 2 1040 0410 Б 60 2 1041 0411 В 60 2 1042 0412 Г 60 2 1043 0413 Д 60 3 1044 0414 Е 60 2 1045 0415 Ж 60 2 1046 0416 З 60 2 1047 0417 И 60 2 1048 0418 Й 60 2 1049 0419 К 60 2 1050 041a Л 60 2 1051 041b М 60 2 1052 041c Н 60 2 1053 041d О 60 2 1054 041e П 60 2 1055 041f Р 60 2 1056 0420 С 60 2 1057 0421 Т 60 2 1058 0422 У 60 2 1059 0423 Ф 60 3 1060 0424 Х 60 2 1061 0425 Ц 60 3 1062 0426 Ч 60 2 1063 0427 Ш 60 2 1064 0428 Щ 60 3 1065 0429 Ъ 60 2 1066 042a Ы 60 2 1067 042b Ь 60 2 1068 042c Э 60 2 1069 042d Ю 60 2 1070 042e Я 60 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 60 0 1074 0432 г 60 0 1075 0433 д 60 1 1076 0434 е 60 0 1077 0435 ж 60 0 1078 0436 з 60 0 1079 0437 и 60 0 1080 0438 й 60 2 1081 0439 к 60 0 1082 043a л 60 0 1083 043b м 60 0 1084 043c н 60 0 1085 043d о 60 0 1086 043e п 60 0 1087 043f р 60 1 1088 0440 с 60 0 1089 0441 т 60 0 1090 0442 у 60 1 1091 0443 ф 60 3 1092 0444 х 60 0 1093 0445 ц 60 1 1094 0446 ч 60 0 1095 0447 ш 60 0 1096 0448 щ 60 1 1097 0449 ъ 60 0 1098 044a ы 60 0 1099 044b ь 60 0 1100 044c э 60 0 1101 044d ю 60 0 1102 044e я 60 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 60 3 1106 0452 ѓ 60 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 60 2 1110 0456 ї 60 2 1111 0457 ј 60 3 1112 0458 љ 60 0 1113 0459 њ 60 0 1114 045a ћ 60 2 1115 045b ќ 60 2 1116 045c ѝ 60 2 1117 045d ў 60 3 1118 045e џ 60 1 1119 045f Ґ 60 2 1168 0490 ґ 60 2 1169 0491 Ғ 60 2 1170 0492 ғ 60 0 1171 0493 Қ 60 3 1178 049a қ 60 1 1179 049b Ҳ 60 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 60 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 60 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 60 2 1236 04d4 ӕ 60 0 1237 04d5 Ӗ 60 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 60 2 1248 04e0 ӡ 60 1 1249 04e1 Ӧ 60 2 1254 04e6 ӧ 60 2 1255 04e7 ᴂ 60 0 7426 1d02 ᴈ 60 0 7432 1d08 ᴉ 60 1 7433 1d09 ᴔ 60 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 60 0 7453 1d1d ᴞ 60 0 7454 1d1e ᴟ 60 0 7455 1d1f ᵃ 60 2 7491 1d43 ᵄ 60 2 7492 1d44 ᵅ 60 2 7493 1d45 ᵆ 60 2 7494 1d46 ᵇ 60 2 7495 1d47 ᵈ 60 2 7496 1d48 ᵉ 60 2 7497 1d49 ᵊ 60 2 7498 1d4a ᵋ 60 2 7499 1d4b ᵌ 60 2 7500 1d4c ᵍ 60 2 7501 1d4d ᵎ 60 2 7502 1d4e ᵏ 60 2 7503 1d4f ᵐ 60 2 7504 1d50 ᵑ 60 2 7505 1d51 ᵒ 60 2 7506 1d52 ᵓ 60 2 7507 1d53 ᵔ 60 2 7508 1d54 ᵕ 60 0 7509 1d55 ᵖ 60 2 7510 1d56 ᵗ 60 2 7511 1d57 ᵘ 60 2 7512 1d58 ᵙ 60 0 7513 1d59 ᵚ 60 2 7514 1d5a ᵛ 60 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 60 0 7547 1d7b ᶅ 60 3 7557 1d85 ᶛ 60 2 7579 1d9b ᶜ 60 2 7580 1d9c ᶝ 60 2 7581 1d9d ᶞ 60 2 7582 1d9e ᶟ 60 2 7583 1d9f ᶠ 60 2 7584 1da0 ᶡ 60 2 7585 1da1 ᶢ 60 2 7586 1da2 ᶣ 60 2 7587 1da3 ᶤ 60 2 7588 1da4 ᶥ 60 2 7589 1da5 ᶦ 60 2 7590 1da6 ᶧ 60 2 7591 1da7 ᶨ 60 2 7592 1da8 ᶩ 60 2 7593 1da9 ᶪ 60 2 7594 1daa ᶫ 60 2 7595 1dab ᶬ 60 2 7596 1dac ᶭ 60 2 7597 1dad ᶮ 60 2 7598 1dae ᶯ 60 2 7599 1daf ᶰ 60 2 7600 1db0 ᶱ 60 2 7601 1db1 ᶲ 60 2 7602 1db2 ᶳ 60 2 7603 1db3 ᶴ 60 2 7604 1db4 ᶵ 60 2 7605 1db5 ᶶ 60 2 7606 1db6 ᶷ 60 2 7607 1db7 ᶹ 60 2 7609 1db9 ᶺ 60 2 7610 1dba ᶻ 60 2 7611 1dbb ᶼ 60 2 7612 1dbc ᶽ 60 2 7613 1dbd ᶾ 60 2 7614 1dbe ᶿ 60 2 7615 1dbf Ḍ 60 3 7692 1e0c ḍ 60 3 7693 1e0d Ḓ 60 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 60 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 60 3 7734 1e36 ḷ 60 3 7735 1e37 Ḹ 60 3 7736 1e38 ḹ 60 3 7737 1e39 Ḽ 60 3 7740 1e3c ḽ 60 3 7741 1e3d ṁ 60 2 7745 1e41 Ṃ 60 3 7746 1e42 ṃ 60 1 7747 1e43 Ṅ 60 2 7748 1e44 ṅ 60 2 7749 1e45 Ṇ 60 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 60 3 7754 1e4a ṋ 60 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 60 3 7770 1e5a ṛ 60 1 7771 1e5b Ṝ 60 3 7772 1e5c ṝ 60 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 60 3 7788 1e6c ṭ 60 3 7789 1e6d Ṱ 60 3 7792 1e70 ṱ 60 3 7793 1e71 Ṿ 60 3 7806 1e7e ṿ 60 1 7807 1e7f Ẁ 60 2 7808 1e80 ẁ 60 2 7809 1e81 Ẃ 60 2 7810 1e82 ẃ 60 2 7811 1e83 Ẅ 60 2 7812 1e84 ẅ 60 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 60 3 7882 1eca ị 60 3 7883 1ecb Ọ 60 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 60 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 60 2 7922 1ef2 ỳ 60 3 7923 1ef3 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‗ 60 1 8215 2017 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 2 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e ‟ 60 2 8223 201f † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 ‣ 60 0 8227 2023 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‱ 60 2 8241 2031 ‹ 60 0 8249 2039 › 60 0 8250 203a ‼ 60 2 8252 203c ‾ 60 2 8254 203e ⁇ 60 2 8263 2047 ⁈ 60 2 8264 2048 ⁉ 60 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 60 2 8319 207f ₦ 60 2 8358 20a6 € 60 2 8364 20ac ₵ 60 3 8373 20b5 ™ 60 2 8482 2122 tm " Ω 60 2 8486 2126 K 60 2 8490 212a Å 60 2 8491 212b ∂ 60 2 8706 2202 pd " ∆ 60 2 8710 2206 ∇ 60 2 8711 2207 gr " ∏ 60 3 8719 220f ∑ 60 3 8721 2211 − 60 0 8722 2212 ∕ 60 3 8725 2215 ∙ 60 0 8729 2219 bu " √ 60 2 8730 221a sr " ∝ 60 0 8733 221d pt " ∞ 60 0 8734 221e if " ∟ 60 2 8735 221f ∠ 60 2 8736 2220 an " ∧ 60 0 8743 2227 l∧ 60 0 8743 2227 " ∨ 60 0 8744 2228 l| " ∩ 60 0 8745 2229 ca " ∪ 60 0 8746 222a cu " ∫ 60 3 8747 222b is " ≈ 60 0 8776 2248 ~~ " ≠ 60 2 8800 2260 != " ≡ 60 0 8801 2261 == " ≤ 60 0 8804 2264 ≥ 60 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 60 0 8976 2310 ⌑ 60 2 8977 2311 ⌙ 60 0 8985 2319 ⌠ 60 3 8992 2320 ⌡ 60 3 8993 2321 ⍽ 60 1 9085 237d ⎮ 60 3 9134 23ae ⏏ 60 0 9167 23cf ␣ 60 1 9251 2423 ━ 60 0 9473 2501 │ 60 3 9474 2502 ┃ 60 3 9475 2503 ┄ 60 0 9476 2504 ┅ 60 0 9477 2505 ┆ 60 3 9478 2506 ┇ 60 3 9479 2507 ┈ 60 0 9480 2508 ┉ 60 0 9481 2509 ┊ 60 3 9482 250a ┋ 60 3 9483 250b ┌ 60 1 9484 250c ┍ 60 1 9485 250d ┎ 60 1 9486 250e ┏ 60 1 9487 250f ┐ 60 1 9488 2510 ┑ 60 1 9489 2511 ┒ 60 1 9490 2512 ┓ 60 1 9491 2513 └ 60 2 9492 2514 ┕ 60 2 9493 2515 ┖ 60 2 9494 2516 ┗ 60 2 9495 2517 ┘ 60 2 9496 2518 ┙ 60 2 9497 2519 ┚ 60 2 9498 251a ┛ 60 2 9499 251b ├ 60 3 9500 251c ┝ 60 3 9501 251d ┞ 60 3 9502 251e ┟ 60 3 9503 251f ┠ 60 3 9504 2520 ┡ 60 3 9505 2521 ┢ 60 3 9506 2522 ┣ 60 3 9507 2523 ┤ 60 3 9508 2524 ┥ 60 3 9509 2525 ┦ 60 3 9510 2526 ┧ 60 3 9511 2527 ┨ 60 3 9512 2528 ┩ 60 3 9513 2529 ┪ 60 3 9514 252a ┫ 60 3 9515 252b ┬ 60 1 9516 252c ┭ 60 1 9517 252d ┮ 60 1 9518 252e ┯ 60 1 9519 252f ┰ 60 1 9520 2530 ┱ 60 1 9521 2531 ┲ 60 1 9522 2532 ┳ 60 1 9523 2533 ┴ 60 2 9524 2534 ┵ 60 2 9525 2535 ┶ 60 2 9526 2536 ┷ 60 2 9527 2537 ┸ 60 2 9528 2538 ┹ 60 2 9529 2539 ┺ 60 2 9530 253a ┻ 60 2 9531 253b ┼ 60 3 9532 253c ┽ 60 3 9533 253d ┾ 60 3 9534 253e ┿ 60 3 9535 253f ╀ 60 3 9536 2540 ╁ 60 3 9537 2541 ╂ 60 3 9538 2542 ╃ 60 3 9539 2543 ╄ 60 3 9540 2544 ╅ 60 3 9541 2545 ╆ 60 3 9542 2546 ╇ 60 3 9543 2547 ╈ 60 3 9544 2548 ╉ 60 3 9545 2549 ╊ 60 3 9546 254a ╋ 60 3 9547 254b ╌ 60 0 9548 254c ╍ 60 0 9549 254d ╎ 60 3 9550 254e ╏ 60 3 9551 254f ═ 60 0 9552 2550 ║ 60 3 9553 2551 ╒ 60 1 9554 2552 ╓ 60 1 9555 2553 ╔ 60 1 9556 2554 ╕ 60 1 9557 2555 ╖ 60 1 9558 2556 ╗ 60 1 9559 2557 ╘ 60 2 9560 2558 ╙ 60 2 9561 2559 ╚ 60 2 9562 255a ╛ 60 2 9563 255b ╜ 60 2 9564 255c ╝ 60 2 9565 255d ╞ 60 3 9566 255e ╟ 60 3 9567 255f ╠ 60 3 9568 2560 ╡ 60 3 9569 2561 ╢ 60 3 9570 2562 ╣ 60 3 9571 2563 ╤ 60 1 9572 2564 ╥ 60 1 9573 2565 ╦ 60 1 9574 2566 ╧ 60 2 9575 2567 ╨ 60 2 9576 2568 ╩ 60 2 9577 2569 ╪ 60 3 9578 256a ╫ 60 3 9579 256b ╬ 60 3 9580 256c ╭ 60 1 9581 256d ╮ 60 1 9582 256e ╯ 60 2 9583 256f ╰ 60 2 9584 2570 ╱ 60 3 9585 2571 ╲ 60 3 9586 2572 ╳ 60 3 9587 2573 ╴ 60 0 9588 2574 ╵ 60 2 9589 2575 ╶ 60 0 9590 2576 ╷ 60 1 9591 2577 ╸ 60 0 9592 2578 ╹ 60 2 9593 2579 ╺ 60 0 9594 257a ╻ 60 1 9595 257b ╼ 60 0 9596 257c ╽ 60 3 9597 257d ╾ 60 0 9598 257e ╿ 60 3 9599 257f ▀ 60 2 9600 2580 ▁ 60 1 9601 2581 ▂ 60 1 9602 2582 ▃ 60 1 9603 2583 ▄ 60 1 9604 2584 ▅ 60 1 9605 2585 ▆ 60 1 9606 2586 ▇ 60 3 9607 2587 █ 60 3 9608 2588 ▉ 60 3 9609 2589 ▊ 60 3 9610 258a ▋ 60 3 9611 258b ▌ 60 3 9612 258c ▍ 60 3 9613 258d ▎ 60 3 9614 258e ▏ 60 3 9615 258f ▐ 60 3 9616 2590 ░ 60 3 9617 2591 ▒ 60 3 9618 2592 ▓ 60 3 9619 2593 ▔ 60 2 9620 2594 ▕ 60 3 9621 2595 ▖ 60 1 9622 2596 ▗ 60 1 9623 2597 ▘ 60 2 9624 2598 ▙ 60 3 9625 2599 ▚ 60 3 9626 259a ▛ 60 3 9627 259b ▜ 60 3 9628 259c ▝ 60 2 9629 259d ▞ 60 3 9630 259e ▟ 60 3 9631 259f ■ 60 0 9632 25a0 □ 60 0 9633 25a1 ▢ 60 0 9634 25a2 ▣ 60 0 9635 25a3 ▤ 60 0 9636 25a4 ▥ 60 0 9637 25a5 ▦ 60 0 9638 25a6 ▧ 60 0 9639 25a7 ▨ 60 0 9640 25a8 ▩ 60 0 9641 25a9 ▪ 60 0 9642 25aa ▫ 60 0 9643 25ab ▬ 60 0 9644 25ac ▭ 60 0 9645 25ad ▮ 60 0 9646 25ae ▯ 60 0 9647 25af ▰ 60 0 9648 25b0 ▱ 60 0 9649 25b1 ▲ 60 0 9650 25b2 △ 60 0 9651 25b3 ▴ 60 0 9652 25b4 ▵ 60 0 9653 25b5 ▶ 60 0 9654 25b6 ▷ 60 0 9655 25b7 ▸ 60 0 9656 25b8 ▹ 60 0 9657 25b9 ► 60 0 9658 25ba ▻ 60 0 9659 25bb ▼ 60 0 9660 25bc ▽ 60 0 9661 25bd ▾ 60 0 9662 25be ▿ 60 0 9663 25bf ◀ 60 0 9664 25c0 ◁ 60 0 9665 25c1 ◂ 60 0 9666 25c2 ◃ 60 0 9667 25c3 ◄ 60 0 9668 25c4 ◅ 60 0 9669 25c5 ◆ 60 0 9670 25c6 ◇ 60 0 9671 25c7 ◈ 60 0 9672 25c8 ◉ 60 0 9673 25c9 ◊ 60 3 9674 25ca ○ 60 0 9675 25cb ◌ 60 0 9676 25cc ◍ 60 0 9677 25cd ◎ 60 0 9678 25ce ● 60 0 9679 25cf ◐ 60 0 9680 25d0 ◑ 60 0 9681 25d1 ◒ 60 0 9682 25d2 ◓ 60 0 9683 25d3 ◔ 60 0 9684 25d4 ◕ 60 0 9685 25d5 ◖ 60 0 9686 25d6 ◗ 60 0 9687 25d7 ◘ 60 2 9688 25d8 ◙ 60 3 9689 25d9 ◚ 60 2 9690 25da ◛ 60 1 9691 25db ◜ 60 0 9692 25dc ◝ 60 0 9693 25dd ◞ 60 0 9694 25de ◟ 60 0 9695 25df ◠ 60 0 9696 25e0 ◡ 60 0 9697 25e1 ◢ 60 0 9698 25e2 ◣ 60 0 9699 25e3 ◤ 60 0 9700 25e4 ◥ 60 0 9701 25e5 ◦ 60 0 9702 25e6 ◧ 60 0 9703 25e7 ◨ 60 0 9704 25e8 ◩ 60 0 9705 25e9 ◪ 60 0 9706 25ea ◫ 60 0 9707 25eb ◬ 60 0 9708 25ec ◭ 60 0 9709 25ed ◮ 60 0 9710 25ee ◯ 60 1 9711 25ef ◰ 60 0 9712 25f0 ◱ 60 0 9713 25f1 ◲ 60 0 9714 25f2 ◳ 60 0 9715 25f3 ◴ 60 0 9716 25f4 ◵ 60 0 9717 25f5 ◶ 60 0 9718 25f6 ◷ 60 0 9719 25f7 ◸ 60 0 9720 25f8 ◹ 60 0 9721 25f9 ◺ 60 0 9722 25fa ◻ 60 0 9723 25fb ◼ 60 0 9724 25fc ◽ 60 0 9725 25fd ◾ 60 0 9726 25fe ◿ 60 0 9727 25ff ☸ 60 2 9784 2638 ⟠ 60 3 10208 27e0 ⧫ 60 3 10731 29eb ⬒ 60 0 11026 2b12 ⬓ 60 0 11027 2b13 fi 60 2 64257 fb01 fl 60 2 64258 fb02 � 60 3 65533 fffd 9base-6/troff/font/devutf/Syntax0000644000175000017500000000200111402154555016333 0ustar anselmanselmname Syntax fontname Syntax-Roman spacewidth 28 charset ! 33 0 33 " 56 0 34 # 56 0 35 $ 56 0 36 % 100 0 37 & 72 0 38 ' 28 0 39 ( 33 0 40 ) 33 0 41 * 56 0 42 + 60 0 43 , 28 0 44 - 39 0 45 . 28 0 46 / 44 0 47 0 56 0 48 1 56 0 49 2 56 0 50 3 56 0 51 4 56 0 52 5 56 0 53 6 56 0 54 7 56 0 55 8 56 0 56 9 56 0 57 : 28 0 58 ; 28 0 59 < 60 0 60 = 60 0 61 > 60 0 62 ? 50 0 63 @ 80 0 64 A 67 0 65 B 56 0 66 C 67 0 67 D 72 0 68 E 50 0 69 F 50 0 70 G 72 0 71 H 72 0 72 I 28 0 73 J 33 0 74 K 61 0 75 L 50 0 76 M 94 0 77 N 72 0 78 O 83 0 79 P 56 0 80 Q 83 0 81 R 61 0 82 S 50 0 83 T 56 0 84 U 72 0 85 V 67 0 86 W 100 0 87 X 61 0 88 Y 61 0 89 Z 56 0 90 [ 33 0 91 \ 44 0 92 ] 33 0 93 ^ 60 0 94 _ 50 0 95 ` 28 0 96 a 50 0 97 b 56 0 98 c 44 0 99 d 56 0 100 e 50 0 101 f 33 0 102 g 56 0 103 h 56 0 104 i 22 0 105 j 22 0 106 k 50 0 107 l 22 0 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 0 112 q 56 0 113 r 33 0 114 s 39 0 115 t 33 0 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 0 121 z 44 0 122 { 33 0 123 | 22 0 124 } 33 0 125 ~ 60 0 126 9base-6/troff/font/devutf/DejaVuSansOblique0000644000175000017500000007301511402154555020406 0ustar anselmanselmname DejaVuSansOblique fontname DejaVuSansOblique spacewidth 32 charset ! 40 2 33 0021 " 46 2 34 0022 dq " dq " # 84 2 35 0023 $ 64 3 36 0024 % 95 2 37 0025 & 78 2 38 0026 ( 39 3 40 0028 ) 39 3 41 0029 * 50 2 42 002a + 84 2 43 002b , 32 1 44 002c - 36 0 45 002d . 32 0 46 002e / 34 3 47 002f 0 64 2 48 0030 1 64 2 49 0031 2 64 2 50 0032 3 64 2 51 0033 4 64 2 52 0034 5 64 2 53 0035 6 64 2 54 0036 7 64 2 55 0037 8 64 2 56 0038 9 64 2 57 0039 : 34 0 58 003a ; 34 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 53 2 63 003f @ 100 3 64 0040 A 68 2 65 0041 B 69 2 66 0042 C 70 2 67 0043 D 77 2 68 0044 E 63 2 69 0045 F 58 2 70 0046 G 77 2 71 0047 H 75 2 72 0048 I 29 2 73 0049 J 29 3 74 004a K 66 2 75 004b L 56 2 76 004c M 86 2 77 004d N 75 2 78 004e O 79 2 79 004f P 60 2 80 0050 Q 79 3 81 0051 R 69 2 82 0052 S 63 2 83 0053 T 61 2 84 0054 U 73 2 85 0055 V 68 2 86 0056 W 99 2 87 0057 X 69 2 88 0058 Y 61 2 89 0059 Z 69 2 90 005a [ 39 3 91 005b \ 34 3 92 005c bs " ] 39 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 61 0 97 0061 b 63 2 98 0062 c 55 0 99 0063 d 63 2 100 0064 e 62 0 101 0065 f 35 2 102 0066 g 63 1 103 0067 h 63 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 58 2 107 006b l 28 2 108 006c m 97 0 109 006d n 63 0 110 006e o 61 0 111 006f p 63 1 112 0070 q 63 1 113 0071 r 41 0 114 0072 s 52 0 115 0073 t 39 2 116 0074 u 63 0 117 0075 v 59 0 118 0076 w 82 0 119 0077 x 59 0 120 0078 y 59 1 121 0079 z 52 0 122 007a { 64 3 123 007b | 34 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   64 0 160 00a0 ¡ 40 2 161 00a1 ¢ 64 3 162 00a2 £ 64 2 163 00a3 ¤ 64 0 164 00a4 ¥ 64 2 165 00a5 ¦ 34 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 47 2 170 00aa « 62 0 171 00ab ¬ 84 0 172 00ac ­ 36 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 40 2 178 00b2 ³ 40 2 179 00b3 ´ 50 2 180 00b4 aa " µ 64 1 181 00b5 ¶ 64 3 182 00b6 · 32 0 183 00b7 ¸ 50 1 184 00b8 ¹ 40 2 185 00b9 º 47 2 186 00ba » 62 0 187 00bb ¼ 97 2 188 00bc ½ 97 2 189 00bd ¾ 97 2 190 00be ¿ 53 2 191 00bf À 68 2 192 00c0 Á 68 2 193 00c1  68 2 194 00c2 à 68 2 195 00c3 Ä 68 2 196 00c4 Å 68 2 197 00c5 Æ 97 2 198 00c6 Ç 70 3 199 00c7 È 63 2 200 00c8 É 63 2 201 00c9 Ê 63 2 202 00ca Ë 63 2 203 00cb Ì 29 2 204 00cc Í 29 2 205 00cd Î 29 2 206 00ce Ï 29 2 207 00cf Ð 77 2 208 00d0 Ñ 75 2 209 00d1 Ò 79 2 210 00d2 Ó 79 2 211 00d3 Ô 79 2 212 00d4 Õ 79 2 213 00d5 Ö 79 2 214 00d6 × 134 0 215 00d7 mu " Ø 79 2 216 00d8 Ù 73 2 217 00d9 Ú 73 2 218 00da Û 73 2 219 00db Ü 73 2 220 00dc Ý 61 2 221 00dd Þ 61 2 222 00de ß 63 2 223 00df à 61 2 224 00e0 á 61 2 225 00e1 â 61 2 226 00e2 ã 61 2 227 00e3 ä 61 2 228 00e4 å 61 2 229 00e5 æ 100 0 230 00e6 ç 55 1 231 00e7 è 62 2 232 00e8 é 62 2 233 00e9 ê 62 2 234 00ea ë 62 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 61 2 240 00f0 ñ 63 2 241 00f1 ò 61 2 242 00f2 ó 61 2 243 00f3 ô 61 2 244 00f4 õ 61 2 245 00f5 ö 61 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 63 2 249 00f9 ú 63 2 250 00fa û 63 2 251 00fb ü 63 2 252 00fc ý 59 3 253 00fd þ 63 3 254 00fe ÿ 59 3 255 00ff ā 61 2 257 0101 Ă 68 2 258 0102 ă 61 2 259 0103 Ą 68 3 260 0104 ą 61 1 261 0105 Ć 70 2 262 0106 ć 55 2 263 0107 Ĉ 70 2 264 0108 ĉ 55 2 265 0109 Ċ 70 2 266 010a ċ 55 2 267 010b Č 70 2 268 010c č 55 2 269 010d Ď 77 2 270 010e ď 63 2 271 010f Đ 77 2 272 0110 đ 63 2 273 0111 Ē 63 2 274 0112 ē 62 2 275 0113 Ĕ 63 2 276 0114 ĕ 62 2 277 0115 Ė 63 2 278 0116 ė 62 2 279 0117 Ę 63 3 280 0118 ę 62 1 281 0119 Ě 63 2 282 011a ě 62 2 283 011b Ĝ 77 2 284 011c ĝ 63 3 285 011d Ğ 77 2 286 011e ğ 63 3 287 011f Ġ 77 2 288 0120 ġ 63 3 289 0121 Ģ 77 3 290 0122 ģ 63 3 291 0123 Ĥ 75 2 292 0124 ĥ 63 2 293 0125 Ħ 92 2 294 0126 ħ 69 2 295 0127 Ĩ 29 2 296 0128 ĩ 28 2 297 0129 Ī 29 2 298 012a ī 28 2 299 012b Ĭ 29 2 300 012c ĭ 28 2 301 012d Į 29 3 302 012e į 28 3 303 012f İ 29 2 304 0130 ı 28 0 305 0131 IJ 59 3 306 0132 ij 56 3 307 0133 Ĵ 29 3 308 0134 ĵ 28 3 309 0135 Ķ 66 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 56 2 313 0139 ĺ 28 2 314 013a Ļ 56 3 315 013b ļ 28 3 316 013c Ľ 56 2 317 013d ľ 33 2 318 013e Ŀ 56 2 319 013f ŀ 60 2 320 0140 Ł 56 2 321 0141 ł 29 2 322 0142 Ń 75 2 323 0143 ń 63 2 324 0144 Ņ 75 3 325 0145 ņ 63 1 326 0146 Ň 75 2 327 0147 ň 63 2 328 0148 ʼn 81 2 329 0149 Ŋ 75 3 330 014a ŋ 63 1 331 014b Ō 79 2 332 014c ō 61 2 333 014d Ŏ 79 2 334 014e ŏ 61 2 335 014f Ő 79 2 336 0150 ő 61 2 337 0151 Œ 107 2 338 0152 œ 103 0 339 0153 Ŕ 69 2 340 0154 ŕ 41 2 341 0155 Ŗ 69 3 342 0156 ŗ 41 1 343 0157 Ř 69 2 344 0158 ř 41 2 345 0159 Ś 63 2 346 015a ś 52 2 347 015b Ŝ 63 2 348 015c ŝ 52 2 349 015d Ş 63 3 350 015e ş 52 1 351 015f Š 63 2 352 0160 š 52 2 353 0161 Ţ 61 3 354 0162 ţ 39 3 355 0163 Ť 61 2 356 0164 ť 39 2 357 0165 Ŧ 61 2 358 0166 ŧ 39 2 359 0167 Ũ 73 2 360 0168 ũ 63 2 361 0169 Ū 73 2 362 016a ū 63 2 363 016b Ŭ 73 2 364 016c ŭ 63 2 365 016d Ů 73 2 366 016e ů 63 2 367 016f Ű 73 2 368 0170 ű 63 2 369 0171 Ų 73 3 370 0172 ų 63 1 371 0173 Ŵ 99 2 372 0174 ŵ 82 2 373 0175 Ŷ 61 2 374 0176 ŷ 59 3 375 0177 Ÿ 61 2 376 0178 Ź 69 2 377 0179 ź 52 2 378 017a Ż 69 2 379 017b ż 52 2 380 017c Ž 69 2 381 017d ž 52 2 382 017e ſ 35 2 383 017f ƀ 63 2 384 0180 Ɓ 73 2 385 0181 Ƃ 69 2 386 0182 ƃ 63 2 387 0183 Ƅ 69 2 388 0184 ƅ 63 2 389 0185 Ɔ 70 2 390 0186 Ƈ 70 2 391 0187 ƈ 55 2 392 0188 Ɖ 77 2 393 0189 Ɗ 82 2 394 018a Ƌ 69 2 395 018b ƌ 63 2 396 018c ƍ 61 1 397 018d Ǝ 63 2 398 018e Ə 79 2 399 018f Ɛ 64 2 400 0190 Ƒ 58 3 401 0191 ƒ 35 3 402 0192 Ɠ 77 2 403 0193 Ɣ 69 3 404 0194 ƕ 96 2 405 0195 Ɩ 35 2 406 0196 Ɨ 29 2 407 0197 Ƙ 69 2 408 0198 ƙ 58 2 409 0199 ƚ 28 2 410 019a ƛ 59 2 411 019b Ɯ 97 2 412 019c Ɲ 75 3 413 019d ƞ 63 1 414 019e Ɵ 79 2 415 019f Ơ 79 2 416 01a0 ơ 61 0 417 01a1 Ƣ 94 2 418 01a2 ƣ 74 1 419 01a3 Ƥ 65 2 420 01a4 ƥ 63 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 63 2 423 01a7 ƨ 52 0 424 01a8 Ʃ 63 2 425 01a9 ƪ 34 3 426 01aa ƫ 39 3 427 01ab Ƭ 61 2 428 01ac ƭ 39 2 429 01ad Ʈ 61 3 430 01ae Ư 73 2 431 01af ư 63 0 432 01b0 Ʊ 76 2 433 01b1 Ʋ 72 2 434 01b2 Ƴ 70 2 435 01b3 ƴ 80 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 52 0 438 01b6 Ʒ 67 2 439 01b7 Ƹ 67 2 440 01b8 ƹ 58 1 441 01b9 ƻ 64 2 443 01bb Ƽ 67 2 444 01bc ƽ 58 1 445 01bd ƾ 51 2 446 01be ǀ 29 3 448 01c0 ǁ 49 3 449 01c1 ǂ 46 3 450 01c2 ǃ 30 2 451 01c3 DŽ 146 2 452 01c4 Dž 129 2 453 01c5 dž 116 2 454 01c6 LJ 85 3 455 01c7 Lj 83 3 456 01c8 lj 56 3 457 01c9 NJ 104 3 458 01ca Nj 103 3 459 01cb nj 91 3 460 01cc Ǎ 68 2 461 01cd ǎ 61 2 462 01ce Ǐ 29 2 463 01cf ǐ 28 2 464 01d0 Ǒ 79 2 465 01d1 ǒ 61 2 466 01d2 Ǔ 73 2 467 01d3 ǔ 63 2 468 01d4 ǖ 63 2 470 01d6 Ǘ 73 2 471 01d7 ǘ 63 2 472 01d8 Ǚ 73 2 473 01d9 ǚ 63 2 474 01da Ǜ 73 2 475 01db ǜ 63 2 476 01dc ǝ 62 0 477 01dd ǟ 61 2 479 01df Ǣ 97 2 482 01e2 ǣ 100 2 483 01e3 Ǫ 79 3 490 01ea ǫ 61 1 491 01eb Ǭ 79 3 492 01ec ǭ 61 3 493 01ed DZ 146 2 497 01f1 Dz 129 2 498 01f2 dz 116 2 499 01f3 Ƕ 111 2 502 01f6 Ș 63 3 536 0218 ș 52 1 537 0219 Ț 61 3 538 021a ț 39 3 539 021b Ȥ 69 3 548 0224 ȥ 52 1 549 0225 ȫ 61 2 555 022b ȭ 61 2 557 022d Ȯ 79 2 558 022e ȯ 61 2 559 022f ȱ 61 2 561 0231 Ȳ 61 2 562 0232 ȳ 59 3 563 0233 ȷ 28 1 567 0237 ȸ 100 2 568 0238 ȹ 100 1 569 0239 Ⱥ 68 2 570 023a Ȼ 70 2 571 023b ȼ 55 0 572 023c Ƚ 56 2 573 023d Ⱦ 61 2 574 023e ȿ 52 1 575 023f ɀ 52 1 576 0240 Ɂ 51 2 577 0241 ɐ 61 0 592 0250 ɑ 63 0 593 0251 ɒ 63 0 594 0252 ɓ 63 2 595 0253 ɔ 55 0 596 0254 ɕ 55 1 597 0255 ɖ 63 3 598 0256 ɗ 73 2 599 0257 ɘ 62 0 600 0258 ə 62 0 601 0259 ɚ 80 0 602 025a ɛ 54 0 603 025b ɜ 54 0 604 025c ɝ 77 0 605 025d ɞ 68 0 606 025e ɟ 33 1 607 025f ɠ 64 3 608 0260 ɡ 63 1 609 0261 ɢ 63 0 610 0262 ɣ 69 1 611 0263 ɤ 59 0 612 0264 ɥ 63 1 613 0265 ɦ 63 2 614 0266 ɧ 63 3 615 0267 ɨ 37 2 616 0268 ɩ 39 0 617 0269 ɪ 37 0 618 026a ɫ 49 2 619 026b ɬ 49 2 620 026c ɭ 28 3 621 026d ɮ 71 3 622 026e ɯ 97 0 623 026f ɰ 97 1 624 0270 ɱ 97 1 625 0271 ɲ 65 1 626 0272 ɳ 64 1 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 86 0 630 0276 ɷ 73 0 631 0277 ɸ 61 3 632 0278 ɹ 47 0 633 0279 ɺ 47 2 634 027a ɻ 47 1 635 027b ɼ 47 1 636 027c ɽ 47 1 637 027d ɾ 53 0 638 027e ɿ 53 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 52 1 642 0282 ʃ 34 3 643 0283 ʄ 38 3 644 0284 ʅ 46 1 645 0285 ʆ 34 3 646 0286 ʇ 39 1 647 0287 ʈ 39 3 648 0288 ʉ 63 0 649 0289 ʊ 62 0 650 028a ʋ 60 0 651 028b ʌ 59 0 652 028c ʍ 82 0 653 028d ʎ 59 2 654 028e ʏ 61 0 655 028f ʐ 52 1 656 0290 ʑ 52 1 657 0291 ʒ 58 1 658 0292 ʓ 58 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 51 3 663 0297 ʘ 60 0 664 0298 ʙ 58 0 665 0299 ʚ 68 0 666 029a ʛ 71 2 667 029b ʜ 66 0 668 029c ʝ 37 3 669 029d ʞ 67 1 670 029e ʟ 58 0 671 029f ʠ 73 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 101 2 675 02a3 ʤ 106 3 676 02a4 ʥ 101 3 677 02a5 ʦ 82 2 678 02a6 ʧ 61 3 679 02a7 ʨ 78 3 680 02a8 ʩ 85 3 681 02a9 ʪ 64 2 682 02aa ʫ 65 2 683 02ab ʬ 52 2 684 02ac ʭ 52 2 685 02ad ʮ 57 3 686 02ae ʯ 66 3 687 02af ʰ 40 2 688 02b0 ʱ 40 2 689 02b1 ʲ 17 2 690 02b2 ʳ 26 2 691 02b3 ʴ 30 2 692 02b4 ʵ 30 2 693 02b5 ʶ 38 2 694 02b6 ʷ 52 2 695 02b7 ʸ 37 2 696 02b8 ʻ 32 2 699 02bb ʼ 32 2 700 02bc ʾ 31 2 702 02be ʿ 31 2 703 02bf ˀ 37 2 704 02c0 ˁ 37 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 31 0 722 02d2 ˓ 31 0 723 02d3 ˖ 41 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 32 0 734 02de ˠ 43 2 736 02e0 ˡ 17 2 737 02e1 ˢ 37 2 738 02e2 ˣ 44 2 739 02e3 ˤ 37 2 740 02e4 ˥ 49 2 741 02e5 ˦ 49 2 742 02e6 ˧ 49 2 743 02e7 ˨ 49 2 744 02e8 ˩ 49 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 28 2 884 0374 ͵ 28 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 70 2 902 0386 · 32 0 903 0387 Έ 77 2 904 0388 Ή 90 2 905 0389 Ί 43 2 906 038a Ό 84 2 908 038c Ύ 86 2 910 038e Ώ 90 2 911 038f ΐ 34 2 912 0390 Α 68 2 913 0391 Β 69 2 914 0392 Γ 56 2 915 0393 Δ 68 2 916 0394 Ε 63 2 917 0395 Ζ 69 2 918 0396 Η 75 2 919 0397 Θ 79 2 920 0398 Ι 29 2 921 0399 Κ 66 2 922 039a Λ 68 2 923 039b Μ 86 2 924 039c Ν 75 2 925 039d Ξ 63 2 926 039e Ο 79 2 927 039f Π 75 2 928 03a0 Ρ 60 2 929 03a1 Σ 63 2 931 03a3 Τ 61 2 932 03a4 Υ 61 2 933 03a5 Φ 79 2 934 03a6 Χ 69 2 935 03a7 Ψ 79 2 936 03a8 Ω 76 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 61 2 939 03ab ά 66 2 940 03ac έ 54 2 941 03ad ή 63 3 942 03ae ί 34 2 943 03af ΰ 58 2 944 03b0 α 66 0 945 03b1 β 64 3 946 03b2 γ 59 1 947 03b3 δ 61 2 948 03b4 ε 54 0 949 03b5 ζ 54 3 950 03b6 η 63 1 951 03b7 θ 61 2 952 03b8 ι 34 0 953 03b9 κ 59 0 954 03ba λ 59 2 955 03bb μ 64 1 956 03bc ν 56 0 957 03bd ξ 56 3 958 03be ο 61 0 959 03bf π 60 0 960 03c0 ρ 63 1 961 03c1 ς 59 1 962 03c2 σ 63 0 963 03c3 τ 60 0 964 03c4 υ 58 0 965 03c5 φ 66 1 966 03c6 χ 59 1 967 03c7 ψ 66 1 968 03c8 ω 84 0 969 03c9 ϊ 34 2 970 03ca ϋ 58 2 971 03cb ό 61 2 972 03cc ύ 58 2 973 03cd ώ 84 2 974 03ce ϐ 61 2 976 03d0 ϑ 62 2 977 03d1 ϒ 70 2 978 03d2 ϓ 84 2 979 03d3 ϔ 70 2 980 03d4 ϕ 66 3 981 03d5 ϖ 84 0 982 03d6 ϗ 66 1 983 03d7 Ϙ 79 3 984 03d8 ϙ 61 1 985 03d9 Ϛ 65 3 986 03da ϛ 59 1 987 03db Ϝ 58 2 988 03dc ϝ 46 3 989 03dd Ϟ 66 2 990 03de ϟ 66 2 991 03df Ϡ 87 3 992 03e0 ϡ 63 1 993 03e1 ϰ 66 0 1008 03f0 ϱ 63 1 1009 03f1 ϲ 55 0 1010 03f2 ϳ 28 3 1011 03f3 ϴ 79 2 1012 03f4 ϵ 62 0 1013 03f5 ϶ 62 0 1014 03f6 Ϸ 61 2 1015 03f7 ϸ 63 3 1016 03f8 Ϲ 70 2 1017 03f9 Ϻ 86 2 1018 03fa ϻ 65 1 1019 03fb ϼ 63 1 1020 03fc Ͻ 70 2 1021 03fd Ͼ 70 2 1022 03fe Ͽ 70 2 1023 03ff Ё 63 2 1025 0401 Ђ 79 3 1026 0402 Ѓ 56 2 1027 0403 Є 70 2 1028 0404 Ѕ 63 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 29 3 1032 0408 Љ 109 2 1033 0409 Њ 104 2 1034 040a Ћ 79 2 1035 040b Ќ 66 2 1036 040c Ѝ 75 2 1037 040d Ў 61 2 1038 040e Џ 75 3 1039 040f А 68 2 1040 0410 Б 69 2 1041 0411 В 69 2 1042 0412 Г 56 2 1043 0413 Д 78 3 1044 0414 Е 63 2 1045 0415 Ж 86 2 1046 0416 З 64 2 1047 0417 И 75 2 1048 0418 Й 75 2 1049 0419 К 66 2 1050 041a Л 75 2 1051 041b М 86 2 1052 041c Н 75 2 1053 041d О 79 2 1054 041e П 75 2 1055 041f Р 60 2 1056 0420 С 70 2 1057 0421 Т 61 2 1058 0422 У 61 2 1059 0423 Ф 79 2 1060 0424 Х 69 2 1061 0425 Ц 78 3 1062 0426 Ч 69 2 1063 0427 Ш 100 2 1064 0428 Щ 103 3 1065 0429 Ъ 83 2 1066 042a Ы 82 2 1067 042b Ь 69 2 1068 042c Э 70 2 1069 042d Ю 103 2 1070 042e Я 69 2 1071 042f а 61 0 1072 0430 б 61 2 1073 0431 в 59 0 1074 0432 г 49 0 1075 0433 д 67 1 1076 0434 е 62 0 1077 0435 ж 73 0 1078 0436 з 54 0 1079 0437 и 66 0 1080 0438 й 66 2 1081 0439 к 60 0 1082 043a л 64 0 1083 043b м 75 0 1084 043c н 66 0 1085 043d о 61 0 1086 043e п 66 0 1087 043f р 63 1 1088 0440 с 55 0 1089 0441 т 53 0 1090 0442 у 59 1 1091 0443 ф 92 3 1092 0444 х 59 0 1093 0445 ц 68 1 1094 0446 ч 59 0 1095 0447 ш 87 0 1096 0448 щ 89 1 1097 0449 ъ 70 0 1098 044a ы 77 0 1099 044b ь 59 0 1100 044c э 50 0 1101 044d ю 81 0 1102 044e я 60 0 1103 044f ѐ 62 2 1104 0450 ё 62 2 1105 0451 ђ 64 3 1106 0452 ѓ 49 2 1107 0453 є 53 0 1108 0454 ѕ 52 0 1109 0455 і 28 2 1110 0456 ї 28 2 1111 0457 ј 28 3 1112 0458 љ 90 0 1113 0459 њ 89 0 1114 045a ћ 64 2 1115 045b ќ 60 2 1116 045c ѝ 66 2 1117 045d ў 59 3 1118 045e џ 66 1 1119 045f Ѥ 94 2 1124 0464 ѥ 75 0 1125 0465 Ҋ 75 3 1162 048a ҋ 66 3 1163 048b Ҍ 69 2 1164 048c ҍ 59 2 1165 048d Ґ 56 2 1168 0490 ґ 51 2 1169 0491 Ғ 56 2 1170 0492 ғ 49 0 1171 0493 Ҕ 56 3 1172 0494 ҕ 49 1 1173 0495 Җ 86 3 1174 0496 җ 73 1 1175 0497 Ҙ 64 3 1176 0498 ҙ 54 1 1177 0499 Қ 66 3 1178 049a қ 60 1 1179 049b Ҡ 80 2 1184 04a0 ҡ 72 0 1185 04a1 Ң 75 3 1186 04a2 ң 66 1 1187 04a3 Ҥ 101 2 1188 04a4 ҥ 88 0 1189 04a5 Ҧ 111 3 1190 04a6 ҧ 95 1 1191 04a7 Ҫ 70 3 1194 04aa ҫ 55 1 1195 04ab Ҭ 61 3 1196 04ac ҭ 53 1 1197 04ad Ү 61 2 1198 04ae ү 59 1 1199 04af Ұ 61 2 1200 04b0 ұ 59 1 1201 04b1 Ҳ 69 3 1202 04b2 ҳ 59 1 1203 04b3 Ҵ 90 3 1204 04b4 ҵ 81 1 1205 04b5 Ҷ 69 3 1206 04b6 ҷ 59 1 1207 04b7 Һ 69 2 1210 04ba һ 63 2 1211 04bb Ӏ 28 2 1216 04c0 Ӂ 86 2 1217 04c1 ӂ 73 2 1218 04c2 Ӆ 75 3 1221 04c5 ӆ 64 1 1222 04c6 Ӈ 75 3 1223 04c7 ӈ 66 1 1224 04c8 Ӊ 75 3 1225 04c9 ӊ 66 1 1226 04ca Ӌ 69 3 1227 04cb ӌ 59 1 1228 04cc Ӎ 86 3 1229 04cd ӎ 75 1 1230 04ce Ӑ 68 2 1232 04d0 ӑ 61 2 1233 04d1 Ӓ 68 2 1234 04d2 ӓ 61 2 1235 04d3 Ӕ 97 2 1236 04d4 ӕ 100 0 1237 04d5 Ӗ 63 2 1238 04d6 ӗ 62 2 1239 04d7 Ә 79 2 1240 04d8 ә 62 0 1241 04d9 Ӛ 79 2 1242 04da ӛ 62 2 1243 04db Ӝ 86 2 1244 04dc ӝ 73 2 1245 04dd Ӟ 64 2 1246 04de ӟ 54 2 1247 04df Ӡ 67 2 1248 04e0 ӡ 58 1 1249 04e1 Ӣ 75 2 1250 04e2 ӣ 66 2 1251 04e3 Ӥ 75 2 1252 04e4 ӥ 66 2 1253 04e5 Ӧ 79 2 1254 04e6 ӧ 61 2 1255 04e7 Ө 79 2 1256 04e8 ө 61 0 1257 04e9 Ӫ 79 2 1258 04ea ӫ 61 2 1259 04eb Ӭ 70 2 1260 04ec ӭ 50 2 1261 04ed Ӯ 61 2 1262 04ee ӯ 59 3 1263 04ef Ӱ 61 2 1264 04f0 ӱ 59 3 1265 04f1 Ӳ 61 2 1266 04f2 ӳ 59 3 1267 04f3 Ӵ 69 2 1268 04f4 ӵ 59 2 1269 04f5 Ӷ 56 3 1270 04f6 ӷ 49 1 1271 04f7 Ӹ 82 2 1272 04f8 ӹ 77 2 1273 04f9 Ա 87 2 1329 0531 Բ 73 2 1330 0532 Գ 88 2 1331 0533 Դ 88 2 1332 0534 Ե 73 2 1333 0535 Զ 64 3 1334 0536 Է 73 3 1335 0537 Ը 73 3 1336 0538 Թ 85 2 1337 0539 Ժ 88 2 1338 053a Ի 73 2 1339 053b Լ 63 3 1340 053c Խ 82 2 1341 053d Ծ 99 2 1342 053e Կ 73 2 1343 053f Հ 71 3 1344 0540 Ձ 64 2 1345 0541 Ղ 88 3 1346 0542 Ճ 78 2 1347 0543 Մ 88 2 1348 0544 Յ 73 2 1349 0545 Ն 84 2 1350 0546 Շ 73 2 1351 0547 Ո 73 2 1352 0548 Չ 73 3 1353 0549 Պ 79 2 1354 054a Ջ 64 3 1355 054b Ռ 88 2 1356 054c Ս 73 2 1357 054d Վ 88 3 1358 054e Տ 63 2 1359 054f Ր 73 2 1360 0550 Ց 73 2 1361 0551 Ւ 80 2 1362 0552 Փ 79 2 1363 0553 Ք 79 2 1364 0554 Օ 79 2 1365 0555 Ֆ 63 2 1366 0556 ՙ 31 2 1369 0559 ՚ 32 2 1370 055a ՛ 50 2 1371 055b ՜ 50 2 1372 055c ՝ 39 2 1373 055d ՞ 53 2 1374 055e ՟ 50 2 1375 055f ա 97 0 1377 0561 բ 63 1 1378 0562 գ 66 1 1379 0563 դ 67 1 1380 0564 զ 66 1 1382 0566 է 55 3 1383 0567 ը 63 1 1384 0568 թ 68 1 1385 0569 ժ 67 2 1386 056a ի 63 3 1387 056b լ 38 1 1388 056c խ 97 3 1389 056d ծ 63 2 1390 056e կ 63 3 1391 056f հ 63 2 1392 0570 ձ 63 2 1393 0571 ղ 67 1 1394 0572 ճ 63 2 1395 0573 մ 66 2 1396 0574 յ 28 1 1397 0575 ն 76 2 1398 0576 շ 52 1 1399 0577 ո 63 0 1400 0578 չ 45 1 1401 0579 պ 97 1 1402 057a ջ 52 1 1403 057b ռ 63 0 1404 057c ս 63 0 1405 057d վ 66 3 1406 057e տ 97 0 1407 057f ր 63 1 1408 0580 ց 63 1 1409 0581 ւ 38 0 1410 0582 փ 97 3 1411 0583 ք 65 1 1412 0584 օ 61 0 1413 0585 ֆ 61 3 1414 0586 և 70 2 1415 0587 ։ 34 0 1417 0589 ֊ 53 0 1418 058a ᴂ 98 0 7426 1d02 ᴈ 54 0 7432 1d08 ᴉ 28 1 7433 1d09 ᴔ 102 0 7444 1d14 ᴖ 61 0 7446 1d16 ᴗ 61 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 64 1 7455 1d1f ᵃ 48 2 7491 1d43 ᵄ 48 2 7492 1d44 ᵅ 49 2 7493 1d45 ᵆ 74 2 7494 1d46 ᵇ 52 2 7495 1d47 ᵈ 49 2 7496 1d48 ᵉ 50 2 7497 1d49 ᵊ 50 2 7498 1d4a ᵋ 45 2 7499 1d4b ᵌ 45 2 7500 1d4c ᵍ 49 2 7501 1d4d ᵎ 27 2 7502 1d4e ᵏ 51 2 7503 1d4f ᵐ 71 2 7504 1d50 ᵑ 50 2 7505 1d51 ᵒ 50 2 7506 1d52 ᵓ 46 2 7507 1d53 ᵔ 50 2 7508 1d54 ᵕ 50 0 7509 1d55 ᵖ 52 2 7510 1d56 ᵗ 38 2 7511 1d57 ᵘ 49 2 7512 1d58 ᵙ 56 2 7513 1d59 ᵚ 71 2 7514 1d5a ᵛ 50 2 7515 1d5b ᵷ 63 1 7543 1d77 ᵻ 37 0 7547 1d7b ᶅ 28 3 7557 1d85 ᶛ 49 2 7579 1d9b ᶜ 46 2 7580 1d9c ᶝ 46 2 7581 1d9d ᶞ 50 2 7582 1d9e ᶟ 45 2 7583 1d9f ᶠ 38 2 7584 1da0 ᶡ 32 2 7585 1da1 ᶢ 49 2 7586 1da2 ᶣ 49 2 7587 1da3 ᶤ 35 2 7588 1da4 ᶥ 34 2 7589 1da5 ᶦ 35 2 7590 1da6 ᶧ 35 2 7591 1da7 ᶨ 32 2 7592 1da8 ᶩ 34 2 7593 1da9 ᶪ 32 2 7594 1daa ᶫ 46 2 7595 1dab ᶬ 71 2 7596 1dac ᶭ 71 2 7597 1dad ᶮ 50 2 7598 1dae ᶯ 57 2 7599 1daf ᶰ 50 2 7600 1db0 ᶱ 50 2 7601 1db1 ᶲ 50 2 7602 1db2 ᶳ 45 2 7603 1db3 ᶴ 37 2 7604 1db4 ᶵ 38 2 7605 1db5 ᶶ 60 2 7606 1db6 ᶷ 51 2 7607 1db7 ᶹ 49 2 7609 1db9 ᶺ 50 2 7610 1dba ᶻ 45 2 7611 1dbb ᶼ 52 2 7612 1dbc ᶽ 45 2 7613 1dbd ᶾ 48 2 7614 1dbe ᶿ 50 2 7615 1dbf Ḍ 77 3 7692 1e0c ḍ 63 3 7693 1e0d Ḓ 77 3 7698 1e12 ḓ 63 3 7699 1e13 Ḥ 75 3 7716 1e24 ḥ 63 3 7717 1e25 Ḷ 56 3 7734 1e36 ḷ 28 3 7735 1e37 Ḹ 56 3 7736 1e38 ḹ 28 3 7737 1e39 Ḽ 56 3 7740 1e3c ḽ 28 3 7741 1e3d ṁ 97 2 7745 1e41 Ṃ 86 3 7746 1e42 ṃ 97 1 7747 1e43 Ṅ 75 2 7748 1e44 ṅ 63 2 7749 1e45 Ṇ 75 3 7750 1e46 ṇ 63 1 7751 1e47 Ṋ 75 3 7754 1e4a ṋ 63 1 7755 1e4b ṗ 63 3 7767 1e57 Ṛ 69 3 7770 1e5a ṛ 41 1 7771 1e5b Ṝ 69 3 7772 1e5c ṝ 41 3 7773 1e5d ṡ 52 2 7777 1e61 Ṣ 63 3 7778 1e62 ṣ 52 1 7779 1e63 Ṭ 61 3 7788 1e6c ṭ 39 3 7789 1e6d Ṱ 61 3 7792 1e70 ṱ 39 3 7793 1e71 Ṿ 68 3 7806 1e7e ṿ 59 1 7807 1e7f Ẁ 99 2 7808 1e80 ẁ 82 2 7809 1e81 Ẃ 99 2 7810 1e82 ẃ 82 2 7811 1e83 Ẅ 99 2 7812 1e84 ẅ 82 2 7813 1e85 Ẹ 63 3 7864 1eb8 ẹ 62 1 7865 1eb9 Ị 29 3 7882 1eca ị 28 3 7883 1ecb Ọ 79 3 7884 1ecc ọ 61 1 7885 1ecd Ụ 73 3 7908 1ee4 ụ 63 1 7909 1ee5 Ỳ 61 2 7922 1ef2 ỳ 59 3 7923 1ef3 ἁ 66 2 7937 1f01 ἂ 66 2 7938 1f02 ἃ 66 2 7939 1f03 ἄ 66 2 7940 1f04 ἅ 66 2 7941 1f05 ἆ 66 2 7942 1f06 ἇ 66 2 7943 1f07 Ἀ 68 2 7944 1f08 Ἁ 68 2 7945 1f09 Ἂ 88 2 7946 1f0a Ἃ 88 2 7947 1f0b Ἄ 77 2 7948 1f0c Ἅ 80 2 7949 1f0d Ἆ 71 2 7950 1f0e Ἇ 74 2 7951 1f0f ἐ 54 2 7952 1f10 ἑ 54 2 7953 1f11 ἒ 54 2 7954 1f12 ἓ 54 2 7955 1f13 ἔ 54 2 7956 1f14 ἕ 54 2 7957 1f15 Ἐ 71 2 7960 1f18 Ἑ 71 2 7961 1f19 Ἒ 97 2 7962 1f1a Ἓ 97 2 7963 1f1b Ἔ 90 2 7964 1f1c Ἕ 93 2 7965 1f1d ἠ 63 3 7968 1f20 ἡ 63 3 7969 1f21 ἢ 63 3 7970 1f22 ἣ 63 3 7971 1f23 ἤ 63 3 7972 1f24 ἥ 63 3 7973 1f25 ἦ 63 3 7974 1f26 ἧ 63 3 7975 1f27 Ἠ 84 2 7976 1f28 Ἡ 84 2 7977 1f29 Ἢ 109 2 7978 1f2a Ἣ 109 2 7979 1f2b Ἤ 103 2 7980 1f2c Ἥ 105 2 7981 1f2d Ἦ 93 2 7982 1f2e Ἧ 95 2 7983 1f2f ἰ 34 2 7984 1f30 ἱ 34 2 7985 1f31 ἲ 34 2 7986 1f32 ἳ 34 2 7987 1f33 ἴ 34 2 7988 1f34 ἵ 34 2 7989 1f35 ἶ 34 2 7990 1f36 ἷ 34 2 7991 1f37 Ἰ 38 2 7992 1f38 Ἱ 37 2 7993 1f39 Ἲ 63 2 7994 1f3a Ἳ 63 2 7995 1f3b Ἴ 57 2 7996 1f3c Ἵ 60 2 7997 1f3d Ἶ 49 2 7998 1f3e Ἷ 49 2 7999 1f3f ὀ 61 2 8000 1f40 ὁ 61 2 8001 1f41 ὂ 61 2 8002 1f42 ὃ 61 2 8003 1f43 ὄ 61 2 8004 1f44 ὅ 61 2 8005 1f45 Ὀ 80 2 8008 1f48 Ὁ 85 2 8009 1f49 Ὂ 109 2 8010 1f4a Ὃ 110 2 8011 1f4b Ὄ 94 2 8012 1f4c Ὅ 97 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 58 2 8020 1f54 ὕ 58 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 78 2 8025 1f59 Ὓ 100 2 8027 1f5b Ὕ 101 2 8029 1f5d Ὗ 90 2 8031 1f5f ὠ 84 2 8032 1f60 ὡ 84 2 8033 1f61 ὢ 84 2 8034 1f62 ὣ 84 2 8035 1f63 ὤ 84 2 8036 1f64 ὥ 84 2 8037 1f65 ὦ 84 2 8038 1f66 ὧ 84 2 8039 1f67 Ὠ 80 2 8040 1f68 Ὡ 84 2 8041 1f69 Ὢ 109 2 8042 1f6a Ὣ 110 2 8043 1f6b Ὤ 95 2 8044 1f6c Ὥ 97 2 8045 1f6d Ὦ 92 2 8046 1f6e Ὧ 95 2 8047 1f6f ὰ 66 2 8048 1f70 ά 66 2 8049 1f71 ὲ 54 2 8050 1f72 έ 55 2 8051 1f73 ὴ 63 3 8052 1f74 ή 65 3 8053 1f75 ὶ 34 2 8054 1f76 ί 34 2 8055 1f77 ὸ 61 2 8056 1f78 ό 61 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 84 2 8060 1f7c ώ 84 2 8061 1f7d ᾀ 66 3 8064 1f80 ᾁ 66 3 8065 1f81 ᾂ 66 3 8066 1f82 ᾃ 66 3 8067 1f83 ᾄ 66 3 8068 1f84 ᾅ 66 3 8069 1f85 ᾆ 66 3 8070 1f86 ᾇ 66 3 8071 1f87 ᾈ 68 3 8072 1f88 ᾉ 68 3 8073 1f89 ᾊ 88 3 8074 1f8a ᾋ 88 3 8075 1f8b ᾌ 77 3 8076 1f8c ᾍ 80 3 8077 1f8d ᾎ 71 3 8078 1f8e ᾏ 74 3 8079 1f8f ᾐ 63 3 8080 1f90 ᾑ 63 3 8081 1f91 ᾒ 63 3 8082 1f92 ᾓ 63 3 8083 1f93 ᾔ 63 3 8084 1f94 ᾕ 63 3 8085 1f95 ᾖ 63 3 8086 1f96 ᾗ 63 3 8087 1f97 ᾘ 84 3 8088 1f98 ᾙ 84 3 8089 1f99 ᾚ 109 3 8090 1f9a ᾛ 109 3 8091 1f9b ᾜ 103 3 8092 1f9c ᾝ 105 3 8093 1f9d ᾞ 93 3 8094 1f9e ᾟ 95 3 8095 1f9f ᾠ 84 3 8096 1fa0 ᾡ 84 3 8097 1fa1 ᾢ 84 3 8098 1fa2 ᾣ 84 3 8099 1fa3 ᾤ 84 3 8100 1fa4 ᾥ 84 3 8101 1fa5 ᾦ 84 3 8102 1fa6 ᾧ 84 3 8103 1fa7 ᾨ 80 3 8104 1fa8 ᾩ 84 3 8105 1fa9 ᾪ 109 3 8106 1faa ᾫ 110 3 8107 1fab ᾬ 95 3 8108 1fac ᾭ 97 3 8109 1fad ᾮ 92 3 8110 1fae ᾯ 95 3 8111 1faf ᾰ 66 2 8112 1fb0 ᾱ 66 2 8113 1fb1 ᾲ 66 3 8114 1fb2 ᾳ 66 1 8115 1fb3 ᾴ 66 3 8116 1fb4 ᾶ 66 2 8118 1fb6 ᾷ 66 3 8119 1fb7 Ᾰ 68 2 8120 1fb8 Ᾱ 68 2 8121 1fb9 Ὰ 72 2 8122 1fba Ά 69 2 8123 1fbb ᾼ 68 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 63 3 8130 1fc2 ῃ 63 1 8131 1fc3 ῄ 65 3 8132 1fc4 ῆ 63 3 8134 1fc6 ῇ 63 3 8135 1fc7 Ὲ 80 2 8136 1fc8 Έ 75 2 8137 1fc9 Ὴ 93 2 8138 1fca Ή 87 2 8139 1fcb ῌ 75 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 34 2 8144 1fd0 ῑ 34 2 8145 1fd1 ῒ 34 2 8146 1fd2 ΐ 34 2 8147 1fd3 ῖ 34 2 8150 1fd6 ῗ 34 2 8151 1fd7 Ῐ 29 2 8152 1fd8 Ῑ 29 2 8153 1fd9 Ὶ 48 2 8154 1fda Ί 41 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 63 3 8164 1fe4 ῥ 63 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 61 2 8168 1fe8 Ῡ 61 2 8169 1fe9 Ὺ 85 2 8170 1fea Ύ 82 2 8171 1feb Ῥ 69 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 84 3 8178 1ff2 ῳ 84 1 8179 1ff3 ῴ 84 3 8180 1ff4 ῶ 84 2 8182 1ff6 ῷ 84 3 8183 1ff7 Ὸ 94 2 8184 1ff8 Ό 81 2 8185 1ff9 Ὼ 92 2 8186 1ffa Ώ 83 2 8187 1ffb ῼ 76 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 36 0 8208 2010 ‑ 36 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 32 2 8216 2018 ` " ‘ " ’ 32 2 8217 2019 ' " ’ " ‚ 32 1 8218 201a ‛ 32 2 8219 201b “ 52 2 8220 201c ” 52 2 8221 201d „ 52 1 8222 201e ‟ 52 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 59 0 8226 2022 ‣ 59 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‰ 135 2 8240 2030 ‱ 169 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 49 2 8252 203c ‽ 53 2 8253 203d ‾ 50 2 8254 203e ⁇ 92 2 8263 2047 ⁈ 73 2 8264 2048 ⁉ 73 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 40 2 8319 207f ₦ 75 2 8358 20a6 € 64 2 8364 20ac ₵ 64 3 8373 20b5 ℃ 112 2 8451 2103 № 116 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 76 2 8486 2126 ℧ 76 2 8487 2127 K 66 2 8490 212a Å 68 2 8491 212b Ⅎ 58 2 8498 2132 ⅋ 78 2 8523 214b Ⅰ 29 2 8544 2160 Ⅱ 49 2 8545 2161 Ⅲ 69 2 8546 2162 Ⅳ 92 2 8547 2163 Ⅴ 68 2 8548 2164 Ⅵ 92 2 8549 2165 Ⅶ 112 2 8550 2166 Ⅷ 132 2 8551 2167 Ⅸ 92 2 8552 2168 Ⅹ 69 2 8553 2169 Ⅺ 93 2 8554 216a Ⅻ 113 2 8555 216b Ⅼ 56 2 8556 216c Ⅽ 70 2 8557 216d Ⅾ 77 2 8558 216e Ⅿ 86 2 8559 216f ⅰ 28 2 8560 2170 ⅱ 46 2 8561 2171 ⅲ 64 2 8562 2172 ⅳ 81 2 8563 2173 ⅴ 59 0 8564 2174 ⅵ 81 2 8565 2175 ⅶ 99 2 8566 2176 ⅷ 117 2 8567 2177 ⅸ 82 2 8568 2178 ⅹ 59 0 8569 2179 ⅺ 82 2 8570 217a ⅻ 100 2 8571 217b ⅼ 28 2 8572 217c ⅽ 55 0 8573 217d ⅾ 63 2 8574 217e ⅿ 97 0 8575 217f ↀ 125 2 8576 2180 Ↄ 70 2 8579 2183 ∂ 52 2 8706 2202 pd " ∃ 63 2 8707 2203 te " ∆ 67 2 8710 2206 ∇ 67 2 8711 2207 gr " ∊ 79 0 8714 220a ∍ 79 0 8717 220d st " ∏ 76 3 8719 220f ∐ 76 3 8720 2210 ∑ 67 3 8721 2211 − 84 0 8722 2212 ∓ 84 2 8723 2213 ∕ 17 2 8725 2215 ∗ 63 0 8727 2217 ** " ∘ 63 0 8728 2218 ∙ 32 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 68 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 73 0 8743 2227 l∧ 73 0 8743 2227 " ∨ 73 0 8744 2228 l| " ∩ 73 0 8745 2229 ca " ∪ 73 0 8746 222a cu " ∫ 52 3 8747 222b is " ∬ 85 3 8748 222c ∭ 118 3 8749 222d ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≣ 84 2 8803 2263 ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 63 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 100 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 52 3 8992 2320 ⌡ 52 3 8993 2321 ⌥ 100 2 8997 2325 〈 39 3 9001 2329 〉 39 3 9002 232a ⍽ 76 1 9085 237d ⎮ 52 3 9134 23ae ⏏ 77 0 9167 23cf ␢ 63 2 9250 2422 ␣ 63 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 59 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 59 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⚀ 87 2 9856 2680 ⚁ 87 2 9857 2681 ⚂ 87 2 9858 2682 ⚃ 87 2 9859 2683 ⚄ 87 2 9860 2684 ⚅ 87 2 9861 2685 ⟠ 49 3 10208 27e0 ⟨ 39 3 10216 27e8 ⟩ 39 3 10217 27e9 ⟪ 56 3 10218 27ea ⟫ 56 3 10219 27eb ⧫ 49 3 10731 29eb ⨌ 151 3 10764 2a0c ⨍ 52 3 10765 2a0d ⨎ 52 3 10766 2a0e ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 65 2 64257 fb01 fl 65 2 64258 fb02 ffi 97 2 64259 fb03 ffl 97 2 64260 fb04 ﬓ 120 2 64275 fb13 ﬔ 120 2 64276 fb14 ﬕ 120 3 64277 fb15 ﬖ 119 3 64278 fb16 ﬗ 153 3 64279 fb17 � 103 3 65533 fffd 9base-6/troff/font/devutf/NI0000644000175000017500000000534211402154555015366 0ustar anselmanselmname NI fontname NewCenturySchlbk-Italic named in prologue spacewidth 28 charset ! 33 2 33 " 40 2 34 dq " # 56 2 35 $ 56 3 36 % 83 2 37 & 85 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 61 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 61 2 74 K 74 2 75 L 67 2 76 M 94 2 77 N 82 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 74 2 82 S 67 2 83 T 69 2 84 U 82 2 85 V 70 2 86 W 93 2 87 X 70 2 88 Y 69 2 89 Z 67 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 57 0 97 b 56 2 98 c 44 0 99 d 61 2 100 e 44 0 101 f 33 3 102 g 54 1 103 h 61 2 104 i 33 2 105 j 32 3 106 k 56 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 44 0 115 t 35 2 116 u 61 0 117 v 52 0 118 w 78 0 119 x 50 0 120 y 50 1 121 z 46 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 3 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 42 2 170 ª " << 43 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 61 1 181 µ " P! 65 2 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 37 2 186 º " >> 43 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 44 3 191 ¿ " A` 70 2 192 À " A' 70 2 193 Á " A^ 70 2 194  " A~ 70 2 195 à " A" 70 2 196 Ä " A* 70 2 197 Å " AE 87 2 198 Æ " C, 72 3 199 Ç " E` 72 2 200 È " E' 72 2 201 É " E^ 72 2 202 Ê " E" 72 2 203 Ë " I` 41 2 204 Ì " I' 41 2 205 Í " I^ 41 2 206 Î " I" 41 2 207 Ï " D- 78 2 208 Ð " N~ 82 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 61 0 215 × " O/ 78 2 216 Ø " U` 82 2 217 Ù " U' 82 2 218 Ú " U^ 82 2 219 Û " U" 82 2 220 Ü " Y' 69 2 221 Ý " TH 67 2 222 Þ " ss 56 3 223 ß " a` 57 2 224 à " a' 57 2 225 á " a^ 57 2 226 â " a~ 57 2 227 ã " a" 57 2 228 ä " a* 57 2 229 å " ae 72 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 33 2 236 ì " i' 33 2 237 í " i^ 33 2 238 î " i" 33 2 239 ï " d- 50 2 240 ð " n~ 61 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 61 0 247 ÷ " o/ 50 3 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 50 3 253 ý " th 57 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/LuxiSerif-Bold0000644000175000017500000001431711402154555017652 0ustar anselmanselmname LuxiSerif-Bold fontname LuxiSerif-Bold spacewidth 25 charset ! 33 2 33 0021 " 56 2 34 0022 dq " dq " # 50 2 35 0023 $ 50 3 36 0024 % 100 2 37 0025 & 83 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 50 2 42 002a + 57 0 43 002b , 25 1 44 002c - 33 0 45 002d . 25 0 46 002e / 28 3 47 002f 0 50 2 48 0030 1 50 2 49 0031 2 50 2 50 0032 3 50 2 51 0033 4 50 2 52 0034 5 50 2 53 0035 6 50 2 54 0036 7 50 2 55 0037 8 50 2 56 0038 9 50 2 57 0039 : 33 0 58 003a ; 33 1 59 003b < 57 0 60 003c = 57 0 61 003d > 57 0 62 003e ? 50 2 63 003f @ 93 2 64 0040 A 72 2 65 0041 B 67 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 78 2 72 0048 I 39 2 73 0049 J 50 3 74 004a K 78 2 75 004b L 67 2 76 004c M 94 2 77 004d N 72 2 78 004e O 78 2 79 004f P 61 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 56 2 83 0053 T 67 2 84 0054 U 72 2 85 0055 V 72 2 86 0056 W 100 2 87 0057 X 72 2 88 0058 Y 72 2 89 0059 Z 67 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 58 2 94 005e _ 50 1 95 005f a 50 0 97 0061 b 56 2 98 0062 c 44 0 99 0063 d 56 2 100 0064 e 44 0 101 0065 f 33 2 102 0066 g 50 1 103 0067 h 56 2 104 0068 i 28 2 105 0069 j 33 3 106 006a k 56 2 107 006b l 28 2 108 006c m 83 0 109 006d n 56 0 110 006e o 50 0 111 006f p 56 1 112 0070 q 56 1 113 0071 r 44 0 114 0072 s 39 0 115 0073 t 33 2 116 0074 u 56 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 44 0 122 007a { 39 3 123 007b | 22 3 124 007c } 39 3 125 007d ~ 52 0 126 007e € 50 2 128 0080   25 0 160 00a0 ¡ 33 1 161 00a1 ¢ 50 2 162 00a2 £ 50 2 163 00a3 ¤ 50 0 164 00a4 ¥ 50 2 165 00a5 ¦ 22 3 166 00a6 § 50 3 167 00a7 ¨ 33 2 168 00a8 © 75 2 169 00a9 ª 30 2 170 00aa « 50 0 171 00ab ¬ 57 0 172 00ac ­ 33 0 173 00ad hy " ® 75 2 174 00ae rg " ¯ 50 2 175 00af ° 40 2 176 00b0 ± 57 0 177 00b1 +- " ² 30 2 178 00b2 ³ 30 2 179 00b3 ´ 33 2 180 00b4 aa " µ 56 1 181 00b5 ¶ 54 3 182 00b6 · 25 0 183 00b7 ¸ 33 1 184 00b8 ¹ 30 2 185 00b9 º 33 2 186 00ba » 50 0 187 00bb ¼ 75 2 188 00bc ½ 75 2 189 00bd ¾ 75 2 190 00be ¿ 50 1 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 39 2 204 00cc Í 39 2 205 00cd Î 39 2 206 00ce Ï 39 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 57 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 72 2 221 00dd Þ 61 2 222 00de ß 56 2 223 00df à 50 2 224 00e0 á 50 2 225 00e1 â 50 2 226 00e2 ã 50 2 227 00e3 ä 50 2 228 00e4 å 50 2 229 00e5 æ 72 0 230 00e6 ç 44 1 231 00e7 è 44 2 232 00e8 é 44 2 233 00e9 ê 44 2 234 00ea ë 44 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 50 2 240 00f0 ñ 56 2 241 00f1 ò 50 2 242 00f2 ó 50 2 243 00f3 ô 50 2 244 00f4 õ 50 2 245 00f5 ö 50 2 246 00f6 ÷ 57 0 247 00f7 -: " di " ø 50 0 248 00f8 ù 56 2 249 00f9 ú 56 2 250 00fa û 56 2 251 00fb ü 56 2 252 00fc ý 50 3 253 00fd þ 56 3 254 00fe ÿ 50 3 255 00ff ā 50 2 257 0101 Ă 72 2 258 0102 ă 50 2 259 0103 Ą 72 3 260 0104 ą 50 1 261 0105 Ć 72 2 262 0106 ć 44 2 263 0107 Ĉ 72 2 264 0108 ĉ 45 2 265 0109 Ċ 72 2 266 010a ċ 44 2 267 010b Č 72 2 268 010c č 44 2 269 010d Ď 72 2 270 010e ď 73 2 271 010f Đ 72 2 272 0110 đ 56 2 273 0111 Ē 67 2 274 0112 ē 44 2 275 0113 Ĕ 67 2 276 0114 ĕ 44 2 277 0115 Ė 67 2 278 0116 ė 44 2 279 0117 Ę 67 3 280 0118 ę 44 1 281 0119 Ě 67 2 282 011a ě 44 2 283 011b Ĝ 78 2 284 011c ĝ 50 3 285 011d Ğ 78 2 286 011e ğ 50 3 287 011f Ġ 78 2 288 0120 ġ 50 3 289 0121 Ģ 78 3 290 0122 ģ 50 3 291 0123 Ĥ 78 2 292 0124 ĥ 56 2 293 0125 Ħ 78 2 294 0126 ħ 56 2 295 0127 Ĩ 39 2 296 0128 ĩ 28 2 297 0129 Ī 39 2 298 012a ī 28 2 299 012b Ĭ 39 2 300 012c ĭ 28 2 301 012d Į 39 3 302 012e į 28 3 303 012f İ 39 2 304 0130 ı 28 0 305 0131 IJ 82 3 306 0132 ij 55 3 307 0133 Ĵ 50 3 308 0134 ĵ 33 3 309 0135 Ķ 78 3 310 0136 ķ 56 3 311 0137 ĸ 56 0 312 0138 Ĺ 67 2 313 0139 ĺ 28 2 314 013a Ļ 67 3 315 013b ļ 28 3 316 013c Ľ 67 2 317 013d ľ 47 2 318 013e Ŀ 67 2 319 013f ŀ 40 2 320 0140 Ł 67 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 56 2 324 0144 Ņ 72 3 325 0145 ņ 56 1 326 0146 Ň 72 2 327 0147 ň 56 2 328 0148 ʼn 73 2 329 0149 Ŋ 72 3 330 014a ŋ 56 1 331 014b Ō 78 2 332 014c ō 50 2 333 014d Ŏ 78 2 334 014e ŏ 50 2 335 014f Ő 78 2 336 0150 ő 50 2 337 0151 Œ 100 2 338 0152 œ 72 0 339 0153 Ŕ 72 2 340 0154 ŕ 44 2 341 0155 Ŗ 72 3 342 0156 ŗ 44 1 343 0157 Ř 72 2 344 0158 ř 44 2 345 0159 Ś 56 2 346 015a ś 39 2 347 015b Ŝ 56 2 348 015c ŝ 39 2 349 015d Ş 56 3 350 015e ş 39 1 351 015f Š 56 2 352 0160 š 39 2 353 0161 Ţ 67 3 354 0162 ţ 33 3 355 0163 Ť 67 2 356 0164 ť 52 2 357 0165 Ŧ 67 2 358 0166 ŧ 33 2 359 0167 Ũ 72 2 360 0168 ũ 56 2 361 0169 Ū 72 2 362 016a ū 56 2 363 016b Ŭ 72 2 364 016c ŭ 56 2 365 016d Ů 72 2 366 016e ů 56 2 367 016f Ű 72 2 368 0170 ű 56 2 369 0171 Ų 72 3 370 0172 ų 56 1 371 0173 Ŵ 100 2 372 0174 ŵ 72 2 373 0175 Ŷ 72 2 374 0176 ŷ 50 3 375 0177 Ÿ 72 2 376 0178 Ź 67 2 377 0179 ź 44 2 378 017a Ż 67 2 379 017b ż 44 2 380 017c Ž 67 2 381 017d ž 44 2 382 017e ſ 28 2 383 017f ƒ 50 3 402 0192 Ș 56 3 536 0218 ș 39 1 537 0219 Ț 67 3 538 021a ț 33 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 33 1 894 037e · 25 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 25 0 8219 201b “ 50 2 8220 201c ” 50 2 8221 201d „ 50 1 8222 201e † 50 3 8224 2020 ‡ 50 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 50 2 8254 203e ⁄ 17 2 8260 2044 € 50 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 44 0 8494 212e − 79 0 8722 2212 ∕ 17 2 8725 2215 ∙ 25 0 8729 2219 bu " ⋅ 25 0 8901 22c5  56 2 59905 ea01  56 2 59906 ea02  30 2 61444 f004  33 3 63166 f6be fi 56 2 64257 fb01 fl 56 2 64258 fb02 9base-6/troff/font/devutf/DejaVuCondensedSerifBoldOblique0000644000175000017500000006225211402154555023177 0ustar anselmanselmname DejaVuCondensedSerifBoldOblique fontname DejaVuCondensedSerifBoldOblique spacewidth 31 charset ! 42 2 33 0021 " 49 2 34 0022 dq " dq " # 80 2 35 0023 $ 66 3 36 0024 % 90 2 37 0025 & 86 2 38 0026 ( 46 3 40 0028 ) 44 3 41 0029 * 50 2 42 002a + 80 2 43 002b , 33 1 44 002c - 39 0 45 002d . 33 0 46 002e / 35 3 47 002f 0 66 2 48 0030 1 66 2 49 0031 2 66 2 50 0032 3 66 2 51 0033 4 66 2 52 0034 5 66 2 53 0035 6 66 2 54 0036 7 67 2 55 0037 8 66 2 56 0038 9 66 2 57 0039 : 35 0 58 003a ; 35 1 59 003b < 80 0 60 003c = 80 0 61 003d > 79 0 62 003e ? 56 2 63 003f @ 95 3 64 0040 A 73 2 65 0041 B 80 2 66 0042 C 76 2 67 0043 D 82 2 68 0044 E 72 2 69 0045 F 68 2 70 0046 G 81 2 71 0047 H 90 2 72 0048 I 44 2 73 0049 J 44 3 74 004a K 83 2 75 004b L 66 2 76 004c M 105 2 77 004d N 87 2 78 004e O 83 2 79 004f P 71 2 80 0050 Q 83 3 81 0051 R 79 2 82 0052 S 68 2 83 0053 T 71 2 84 0054 U 84 2 85 0055 V 74 2 86 0056 W 107 2 87 0057 X 74 2 88 0058 Y 68 2 89 0059 Z 69 2 90 005a [ 45 3 91 005b \ 35 3 92 005c bs " ] 45 3 93 005d ^ 79 2 94 005e _ 47 1 95 005f a 61 0 97 0061 b 66 2 98 0062 c 58 0 99 0063 d 66 2 100 0064 e 60 0 101 0065 f 41 3 102 0066 g 67 1 103 0067 h 68 2 104 0068 i 36 2 105 0069 j 33 3 106 006a k 66 2 107 006b l 36 2 108 006c m 100 0 109 006d n 69 0 110 006e o 63 0 111 006f p 66 1 112 0070 q 67 1 113 0071 r 50 0 114 0072 s 53 0 115 0073 t 44 2 116 0074 u 69 0 117 0075 v 56 0 118 0076 w 82 0 119 0077 x 57 0 120 0078 y 56 1 121 0079 z 54 0 122 007a { 61 3 123 007b | 35 3 124 007c } 61 3 125 007d ~ 80 0 126 007e   63 0 160 00a0 ¡ 42 2 161 00a1 ¢ 66 3 162 00a2 £ 66 2 163 00a3 ¤ 60 0 164 00a4 ¥ 66 2 165 00a5 ¦ 35 3 166 00a6 § 50 3 167 00a7 ¨ 48 2 168 00a8 © 95 2 169 00a9 ª 46 2 170 00aa « 59 0 171 00ab ¬ 80 0 172 00ac ­ 39 0 173 00ad hy " ® 95 2 174 00ae rg " ¯ 48 2 175 00af ° 47 2 176 00b0 ± 79 2 177 00b1 +- " ² 41 2 178 00b2 ³ 41 2 179 00b3 ´ 49 2 180 00b4 aa " µ 69 1 181 00b5 ¶ 61 3 182 00b6 · 33 0 183 00b7 ¸ 47 1 184 00b8 ¹ 41 2 185 00b9 º 47 2 186 00ba » 59 0 187 00bb ¼ 99 2 188 00bc ½ 99 2 189 00bd ¾ 99 2 190 00be ¿ 55 2 191 00bf À 73 2 192 00c0 Á 73 2 193 00c1  73 2 194 00c2 à 73 2 195 00c3 Ä 73 2 196 00c4 Å 73 2 197 00c5 Æ 98 2 198 00c6 Ç 76 3 199 00c7 È 72 2 200 00c8 É 72 2 201 00c9 Ê 72 2 202 00ca Ë 72 2 203 00cb Ì 44 2 204 00cc Í 45 2 205 00cd Î 45 2 206 00ce Ï 45 2 207 00cf Ð 83 2 208 00d0 Ñ 87 2 209 00d1 Ò 83 2 210 00d2 Ó 83 2 211 00d3 Ô 83 2 212 00d4 Õ 83 2 213 00d5 Ö 83 2 214 00d6 × 80 2 215 00d7 mu " Ø 83 2 216 00d8 Ù 84 2 217 00d9 Ú 84 2 218 00da Û 84 2 219 00db Ü 84 2 220 00dc Ý 68 2 221 00dd Þ 72 2 222 00de ß 72 2 223 00df à 61 2 224 00e0 á 61 2 225 00e1 â 61 2 226 00e2 ã 61 2 227 00e3 ä 61 2 228 00e4 å 61 2 229 00e5 æ 92 0 230 00e6 ç 58 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 36 2 236 00ec í 36 2 237 00ed î 36 2 238 00ee ï 36 2 239 00ef ð 63 2 240 00f0 ñ 69 2 241 00f1 ò 63 2 242 00f2 ó 63 2 243 00f3 ô 63 2 244 00f4 õ 63 2 245 00f5 ö 63 2 246 00f6 ÷ 80 0 247 00f7 -: " di " ø 63 0 248 00f8 ù 69 2 249 00f9 ú 69 2 250 00fa û 69 2 251 00fb ü 69 2 252 00fc ý 56 3 253 00fd þ 66 3 254 00fe ÿ 56 3 255 00ff ā 61 2 257 0101 Ă 73 2 258 0102 ă 61 2 259 0103 Ą 73 3 260 0104 ą 61 1 261 0105 Ć 76 2 262 0106 ć 58 2 263 0107 Ĉ 76 2 264 0108 ĉ 58 2 265 0109 Ċ 76 2 266 010a ċ 58 2 267 010b Č 76 2 268 010c č 58 2 269 010d Ď 82 2 270 010e ď 68 2 271 010f Đ 83 2 272 0110 đ 67 2 273 0111 Ē 72 2 274 0112 ē 60 2 275 0113 Ĕ 72 2 276 0114 ĕ 60 2 277 0115 Ė 72 2 278 0116 ė 60 2 279 0117 Ę 72 3 280 0118 ę 60 1 281 0119 Ě 72 2 282 011a ě 60 2 283 011b Ĝ 81 2 284 011c ĝ 67 3 285 011d Ğ 81 2 286 011e ğ 67 3 287 011f Ġ 81 2 288 0120 ġ 67 3 289 0121 Ģ 81 3 290 0122 ģ 67 3 291 0123 Ĥ 90 2 292 0124 ĥ 68 2 293 0125 Ħ 90 2 294 0126 ħ 68 2 295 0127 Ĩ 45 2 296 0128 ĩ 36 2 297 0129 Ī 44 2 298 012a ī 36 2 299 012b Ĭ 45 2 300 012c ĭ 36 2 301 012d Į 45 3 302 012e į 36 3 303 012f İ 44 2 304 0130 ı 36 0 305 0131 IJ 90 3 306 0132 ij 71 3 307 0133 Ĵ 44 3 308 0134 ĵ 34 3 309 0135 Ķ 83 3 310 0136 ķ 66 3 311 0137 ĸ 66 0 312 0138 Ĺ 66 2 313 0139 ĺ 36 2 314 013a Ļ 66 3 315 013b ļ 36 3 316 013c Ľ 67 2 317 013d ľ 49 2 318 013e Ŀ 67 2 319 013f ŀ 53 2 320 0140 Ł 67 2 321 0141 ł 36 2 322 0142 Ń 87 2 323 0143 ń 69 2 324 0144 Ņ 87 3 325 0145 ņ 69 1 326 0146 Ň 87 2 327 0147 ň 69 2 328 0148 ʼn 95 2 329 0149 Ŋ 87 3 330 014a ŋ 69 1 331 014b Ō 83 2 332 014c ō 63 2 333 014d Ŏ 83 2 334 014e ŏ 63 2 335 014f Ő 83 2 336 0150 ő 64 2 337 0151 Œ 112 2 338 0152 œ 98 0 339 0153 Ŕ 79 2 340 0154 ŕ 50 2 341 0155 Ŗ 79 3 342 0156 ŗ 50 1 343 0157 Ř 79 2 344 0158 ř 50 2 345 0159 Ś 69 2 346 015a ś 54 2 347 015b Ŝ 68 2 348 015c ŝ 53 2 349 015d Ş 68 3 350 015e ş 53 1 351 015f Š 69 2 352 0160 š 54 2 353 0161 Ţ 71 3 354 0162 ţ 44 3 355 0163 Ť 71 2 356 0164 ť 45 2 357 0165 Ŧ 71 2 358 0166 ŧ 44 2 359 0167 Ũ 84 2 360 0168 ũ 69 2 361 0169 Ū 84 2 362 016a ū 69 2 363 016b Ŭ 84 2 364 016c ŭ 69 2 365 016d Ů 84 2 366 016e ů 69 2 367 016f Ű 84 2 368 0170 ű 69 2 369 0171 Ų 84 3 370 0172 ų 69 1 371 0173 Ŵ 107 2 372 0174 ŵ 82 2 373 0175 Ŷ 68 2 374 0176 ŷ 56 3 375 0177 Ÿ 68 2 376 0178 Ź 69 2 377 0179 ź 54 2 378 017a Ż 69 2 379 017b ż 54 2 380 017c Ž 69 2 381 017d ž 54 2 382 017e ſ 41 3 383 017f Ɓ 79 2 385 0181 Ƃ 81 2 386 0182 ƃ 66 2 387 0183 Ƅ 81 2 388 0184 ƅ 66 2 389 0185 Ɔ 75 2 390 0186 Ƈ 77 2 391 0187 ƈ 59 2 392 0188 Ɖ 83 2 393 0189 Ɗ 82 2 394 018a Ƌ 81 2 395 018b ƌ 67 2 396 018c ƍ 63 1 397 018d Ǝ 72 2 398 018e Ə 83 2 399 018f Ɛ 66 2 400 0190 Ƒ 67 3 401 0191 ƒ 66 3 402 0192 Ɠ 82 2 403 0193 Ɣ 74 3 404 0194 ƕ 99 2 405 0195 Ɩ 45 2 406 0196 Ɨ 44 2 407 0197 Ƙ 83 2 408 0198 ƙ 66 2 409 0199 ƚ 36 2 410 019a ƛ 66 2 411 019b Ɯ 101 2 412 019c Ɲ 86 3 413 019d ƞ 69 1 414 019e Ɵ 83 2 415 019f Ơ 83 2 416 01a0 ơ 64 0 417 01a1 Ƣ 114 3 418 01a2 ƣ 90 1 419 01a3 Ƥ 71 2 420 01a4 ƥ 66 3 421 01a5 Ʀ 80 3 422 01a6 Ƨ 69 2 423 01a7 ƨ 53 0 424 01a8 Ʃ 67 2 425 01a9 ƪ 32 3 426 01aa ƫ 44 3 427 01ab Ƭ 71 2 428 01ac ƭ 44 2 429 01ad Ʈ 71 3 430 01ae Ư 84 2 431 01af ư 70 0 432 01b0 Ʊ 85 2 433 01b1 Ʋ 85 2 434 01b2 Ƴ 69 2 435 01b3 ƴ 67 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 54 0 438 01b6 Ʒ 54 2 439 01b7 Ƹ 54 2 440 01b8 ƹ 54 1 441 01b9 ƻ 66 2 443 01bb Ƽ 72 2 444 01bc ƽ 54 1 445 01bd ƾ 50 2 446 01be ǀ 28 2 448 01c0 ǁ 47 2 449 01c1 ǂ 44 2 450 01c2 ǃ 36 2 451 01c3 Ǎ 73 2 461 01cd ǎ 61 2 462 01ce Ǐ 45 2 463 01cf ǐ 36 2 464 01d0 Ǒ 83 2 465 01d1 ǒ 63 2 466 01d2 Ǔ 84 2 467 01d3 ǔ 69 2 468 01d4 ǖ 69 2 470 01d6 Ǘ 85 2 471 01d7 ǘ 72 2 472 01d8 Ǚ 85 2 473 01d9 ǚ 72 2 474 01da Ǜ 85 2 475 01db ǜ 71 2 476 01dc ǝ 60 0 477 01dd ǟ 61 2 479 01df Ǣ 98 2 482 01e2 ǣ 92 2 483 01e3 Ǫ 83 3 490 01ea ǫ 63 1 491 01eb Ǭ 83 3 492 01ec ǭ 63 3 493 01ed Ƕ 116 2 502 01f6 Ș 68 3 536 0218 ș 53 1 537 0219 Ț 71 3 538 021a ț 44 3 539 021b Ȥ 70 3 548 0224 ȥ 54 1 549 0225 ȫ 63 2 555 022b ȭ 63 2 557 022d Ȯ 83 2 558 022e ȯ 63 2 559 022f ȱ 63 2 561 0231 Ȳ 68 2 562 0232 ȳ 56 3 563 0233 ȷ 34 1 567 0237 ȸ 98 2 568 0238 ȹ 98 1 569 0239 Ⱥ 74 2 570 023a Ȼ 76 2 571 023b ȼ 58 0 572 023c Ƚ 66 2 573 023d Ⱦ 71 2 574 023e ȿ 54 1 575 023f ɀ 54 1 576 0240 Ɂ 63 2 577 0241 ɐ 62 0 592 0250 ɑ 67 0 593 0251 ɒ 66 0 594 0252 ɓ 66 2 595 0253 ɔ 58 0 596 0254 ɕ 58 1 597 0255 ɖ 67 3 598 0256 ɗ 70 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 86 0 602 025a ɛ 53 0 603 025b ɜ 53 0 604 025c ɝ 86 0 605 025d ɞ 68 0 606 025e ɟ 36 1 607 025f ɠ 67 3 608 0260 ɡ 67 1 609 0261 ɢ 60 0 610 0262 ɣ 68 1 611 0263 ɤ 60 0 612 0264 ɥ 69 1 613 0265 ɦ 68 2 614 0266 ɧ 69 3 615 0267 ɨ 36 2 616 0268 ɩ 36 2 617 0269 ɪ 36 0 618 026a ɫ 39 2 619 026b ɬ 49 2 620 026c ɭ 36 3 621 026d ɮ 69 3 622 026e ɯ 101 0 623 026f ɰ 101 1 624 0270 ɱ 100 1 625 0271 ɲ 68 1 626 0272 ɳ 69 1 627 0273 ɴ 68 0 628 0274 ɵ 63 0 629 0275 ɶ 101 0 630 0276 ɷ 71 0 631 0277 ɸ 63 3 632 0278 ɹ 54 0 633 0279 ɺ 54 2 634 027a ɻ 54 1 635 027b ɼ 50 1 636 027c ɽ 51 1 637 027d ɾ 43 0 638 027e ɿ 46 0 639 027f ʀ 76 0 640 0280 ʁ 76 0 641 0281 ʂ 53 1 642 0282 ʃ 31 3 643 0283 ʄ 41 3 644 0284 ʅ 51 1 645 0285 ʆ 31 3 646 0286 ʇ 47 1 647 0287 ʈ 44 3 648 0288 ʉ 69 0 649 0289 ʊ 65 0 650 028a ʋ 66 0 651 028b ʌ 61 0 652 028c ʍ 86 0 653 028d ʎ 60 2 654 028e ʏ 69 0 655 028f ʐ 54 1 656 0290 ʑ 54 1 657 0291 ʒ 54 1 658 0292 ʓ 54 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 52 3 663 0297 ʘ 68 0 664 0298 ʙ 69 0 665 0299 ʚ 68 0 666 029a ʛ 61 2 667 029b ʜ 69 0 668 029c ʝ 36 3 669 029d ʞ 71 1 670 029e ʟ 61 0 671 029f ʠ 67 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 106 2 675 02a3 ʤ 112 3 676 02a4 ʥ 106 3 677 02a5 ʦ 87 2 678 02a6 ʧ 69 3 679 02a7 ʨ 87 3 680 02a8 ʩ 99 3 681 02a9 ʪ 75 2 682 02aa ʫ 75 2 683 02ab ʬ 63 2 684 02ac ʭ 42 2 685 02ad ʮ 58 3 686 02ae ʯ 68 3 687 02af ʰ 49 2 688 02b0 ʱ 49 2 689 02b1 ʲ 30 2 690 02b2 ʳ 39 2 691 02b3 ʴ 39 2 692 02b4 ʵ 45 2 693 02b5 ʶ 50 2 694 02b6 ʷ 63 2 695 02b7 ʸ 46 2 696 02b8 ʻ 33 2 699 02bb ʼ 33 2 700 02bc ʾ 35 2 702 02be ʿ 35 2 703 02bf ˀ 30 2 704 02c0 ˁ 30 2 705 02c1 ˆ 48 2 710 02c6 ˇ 48 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 35 0 720 02d0 ˑ 35 0 721 02d1 ˒ 34 2 722 02d2 ˓ 35 0 723 02d3 ˖ 37 0 726 02d6 ˘ 48 2 728 02d8 ˙ 48 2 729 02d9 ˚ 48 2 730 02da ˛ 48 1 731 02db ˜ 48 2 732 02dc ˝ 49 2 733 02dd ˞ 40 0 734 02de ˠ 44 2 736 02e0 ˡ 27 2 737 02e1 ˢ 37 2 738 02e2 ˣ 45 2 739 02e3 ˤ 30 2 740 02e4 ˥ 47 2 741 02e5 ˦ 46 2 742 02e6 ˧ 46 2 743 02e7 ˨ 46 2 744 02e8 ˩ 46 2 745 02e9 ́ 59 2 769 0301 ̂ 58 2 770 0302 ̃ 58 2 771 0303 ̄ 58 2 772 0304 ̅ 0 2 773 0305 ̆ 58 2 774 0306 ̇ 58 2 775 0307 ̈ 58 2 776 0308 ̉ 0 2 777 0309 ̊ 58 2 778 030a ̋ 58 2 779 030b ̌ 58 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 33 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 69 1 801 0321 ̢ 68 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 1 2 856 0358 ͡ 1 2 865 0361 ʹ 29 2 884 0374 ͵ 30 1 885 0375 ͺ 48 1 890 037a ; 35 1 894 037e ΄ 49 2 900 0384 ΅ 49 2 901 0385 Ά 73 2 902 0386 · 33 0 903 0387 Έ 90 2 904 0388 Ή 108 2 905 0389 Ί 63 2 906 038a Ό 84 2 908 038c Ύ 91 2 910 038e Ώ 86 2 911 038f ΐ 46 2 912 0390 Α 73 2 913 0391 Β 80 2 914 0392 Γ 68 2 915 0393 Δ 73 2 916 0394 Ε 72 2 917 0395 Ζ 69 2 918 0396 Η 90 2 919 0397 Θ 83 2 920 0398 Ι 44 2 921 0399 Κ 83 2 922 039a Λ 73 2 923 039b Μ 105 2 924 039c Ν 87 2 925 039d Ξ 67 2 926 039e Ο 83 2 927 039f Π 90 2 928 03a0 Ρ 71 2 929 03a1 Σ 67 2 931 03a3 Τ 71 2 932 03a4 Υ 68 2 933 03a5 Φ 83 2 934 03a6 Χ 74 2 935 03a7 Ψ 87 2 936 03a8 Ω 84 2 937 03a9 Ϊ 45 2 938 03aa Ϋ 68 2 939 03ab ά 73 2 940 03ac έ 58 2 941 03ad ή 69 3 942 03ae ί 46 2 943 03af ΰ 66 2 944 03b0 α 73 0 945 03b1 β 63 3 946 03b2 γ 63 1 947 03b3 δ 63 2 948 03b4 ε 58 0 949 03b5 ζ 57 3 950 03b6 η 69 1 951 03b7 θ 63 2 952 03b8 ι 46 0 953 03b9 κ 71 0 954 03ba λ 66 2 955 03bb μ 69 1 956 03bc ν 66 0 957 03bd ξ 57 3 958 03be ο 63 0 959 03bf π 70 0 960 03c0 ρ 63 1 961 03c1 ς 58 1 962 03c2 σ 70 0 963 03c3 τ 64 0 964 03c4 υ 66 0 965 03c5 φ 86 1 966 03c6 χ 62 1 967 03c7 ψ 90 1 968 03c8 ω 90 0 969 03c9 ϊ 46 2 970 03ca ϋ 66 2 971 03cb ό 63 2 972 03cc ύ 66 2 973 03cd ώ 90 2 974 03ce ϐ 63 2 976 03d0 ϑ 81 2 977 03d1 ϒ 73 2 978 03d2 ϓ 92 2 979 03d3 ϔ 75 2 980 03d4 ϕ 89 3 981 03d5 ϖ 91 0 982 03d6 ϗ 62 1 983 03d7 Ϙ 83 3 984 03d8 ϙ 64 1 985 03d9 Ϛ 76 3 986 03da ϛ 58 3 987 03db Ϝ 68 2 988 03dc ϝ 49 3 989 03dd Ϟ 56 2 990 03de ϟ 63 2 991 03df Ϡ 75 3 992 03e0 ϡ 63 1 993 03e1 ϰ 62 0 1008 03f0 ϱ 63 1 1009 03f1 ϲ 58 0 1010 03f2 ϳ 33 3 1011 03f3 ϴ 83 2 1012 03f4 ϵ 58 0 1013 03f5 ϶ 58 0 1014 03f6 Ϸ 72 2 1015 03f7 ϸ 66 3 1016 03f8 Ϲ 76 2 1017 03f9 Ϻ 105 2 1018 03fa ϻ 82 1 1019 03fb ϼ 66 1 1020 03fc Ͻ 75 2 1021 03fd Ͼ 76 2 1022 03fe Ͽ 75 2 1023 03ff Ё 72 2 1025 0401 Ђ 85 3 1026 0402 Ѓ 68 2 1027 0403 Є 76 2 1028 0404 Ѕ 68 2 1029 0405 І 44 2 1030 0406 Ї 45 2 1031 0407 Ј 44 3 1032 0408 Љ 119 2 1033 0409 Њ 119 2 1034 040a Ћ 91 2 1035 040b Ќ 83 2 1036 040c Ѝ 90 2 1037 040d Ў 78 2 1038 040e Џ 90 3 1039 040f А 73 2 1040 0410 Б 81 2 1041 0411 В 80 2 1042 0412 Г 68 2 1043 0413 Д 90 3 1044 0414 Е 72 2 1045 0415 Ж 125 2 1046 0416 З 66 2 1047 0417 И 90 2 1048 0418 Й 90 2 1049 0419 К 83 2 1050 041a Л 89 2 1051 041b М 105 2 1052 041c Н 90 2 1053 041d О 83 2 1054 041e П 90 2 1055 041f Р 71 2 1056 0420 С 76 2 1057 0421 Т 71 2 1058 0422 У 78 2 1059 0423 Ф 100 3 1060 0424 Х 74 2 1061 0425 Ц 90 3 1062 0426 Ч 87 2 1063 0427 Ш 106 2 1064 0428 Щ 108 3 1065 0429 Ъ 83 2 1066 042a Ы 113 2 1067 042b Ь 75 2 1068 042c Э 75 2 1069 042d Ю 122 2 1070 042e Я 79 2 1071 042f а 61 0 1072 0430 б 63 2 1073 0431 в 69 0 1074 0432 г 60 0 1075 0433 д 83 1 1076 0434 е 60 0 1077 0435 ж 101 0 1078 0436 з 57 0 1079 0437 и 70 0 1080 0438 й 70 2 1081 0439 к 66 0 1082 043a л 69 0 1083 043b м 101 0 1084 043c н 70 0 1085 043d о 63 0 1086 043e п 70 0 1087 043f р 66 1 1088 0440 с 58 0 1089 0441 т 59 0 1090 0442 у 56 1 1091 0443 ф 78 3 1092 0444 х 57 0 1093 0445 ц 70 1 1094 0446 ч 70 0 1095 0447 ш 95 0 1096 0448 щ 97 1 1097 0449 ъ 65 0 1098 044a ы 95 0 1099 044b ь 63 0 1100 044c э 58 0 1101 044d ю 97 0 1102 044e я 76 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 66 3 1106 0452 ѓ 60 2 1107 0453 є 58 0 1108 0454 ѕ 53 0 1109 0455 і 36 2 1110 0456 ї 36 2 1111 0457 ј 33 3 1112 0458 љ 94 0 1113 0459 њ 94 0 1114 045a ћ 68 2 1115 045b ќ 66 2 1116 045c ѝ 70 2 1117 045d ў 56 3 1118 045e џ 70 1 1119 045f Ґ 68 2 1168 0490 ґ 60 2 1169 0491 Ғ 68 2 1170 0492 ғ 60 0 1171 0493 Қ 83 3 1178 049a қ 66 1 1179 049b Ҳ 74 3 1202 04b2 ҳ 57 1 1203 04b3 Ӑ 73 2 1232 04d0 ӑ 61 2 1233 04d1 Ӓ 75 2 1234 04d2 ӓ 61 2 1235 04d3 Ӕ 98 2 1236 04d4 ӕ 92 0 1237 04d5 Ӗ 74 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 54 2 1248 04e0 ӡ 54 1 1249 04e1 Ӧ 85 2 1254 04e6 ӧ 63 2 1255 04e7 Ө 83 2 1256 04e8 ө 63 0 1257 04e9 Ӫ 85 2 1258 04ea ӫ 63 2 1259 04eb ᴂ 89 0 7426 1d02 ᴈ 48 0 7432 1d08 ᴉ 30 1 7433 1d09 ᴔ 94 0 7444 1d14 ᴖ 64 0 7446 1d16 ᴗ 64 0 7447 1d17 ᴝ 71 2 7453 1d1d ᴞ 91 2 7454 1d1e ᴟ 90 3 7455 1d1f ᵃ 44 2 7491 1d43 ᵄ 44 2 7492 1d44 ᵅ 47 2 7493 1d45 ᵆ 62 2 7494 1d46 ᵇ 47 2 7495 1d47 ᵈ 47 2 7496 1d48 ᵉ 42 2 7497 1d49 ᵊ 42 2 7498 1d4a ᵋ 39 2 7499 1d4b ᵌ 39 2 7500 1d4c ᵍ 47 2 7501 1d4d ᵎ 28 2 7502 1d4e ᵏ 49 2 7503 1d4f ᵐ 69 2 7504 1d50 ᵑ 45 2 7505 1d51 ᵒ 44 2 7506 1d52 ᵓ 40 2 7507 1d53 ᵔ 45 2 7508 1d54 ᵕ 45 0 7509 1d55 ᵖ 47 2 7510 1d56 ᵗ 35 2 7511 1d57 ᵘ 49 2 7512 1d58 ᵙ 41 2 7513 1d59 ᵚ 69 2 7514 1d5a ᵛ 47 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 36 0 7547 1d7b ᶅ 36 3 7557 1d85 ᶛ 47 2 7579 1d9b ᶜ 41 2 7580 1d9c ᶝ 41 2 7581 1d9d ᶞ 44 2 7582 1d9e ᶟ 39 2 7583 1d9f ᶠ 36 2 7584 1da0 ᶡ 35 2 7585 1da1 ᶢ 47 2 7586 1da2 ᶣ 50 2 7587 1da3 ᶤ 28 2 7588 1da4 ᶥ 29 2 7589 1da5 ᶦ 28 2 7590 1da6 ᶧ 29 2 7591 1da7 ᶨ 35 2 7592 1da8 ᶩ 35 2 7593 1da9 ᶪ 30 2 7594 1daa ᶫ 41 2 7595 1dab ᶬ 65 2 7596 1dac ᶭ 70 2 7597 1dad ᶮ 55 2 7598 1dae ᶯ 55 2 7599 1daf ᶰ 45 2 7600 1db0 ᶱ 44 2 7601 1db1 ᶲ 50 2 7602 1db2 ᶳ 38 2 7603 1db3 ᶴ 37 2 7604 1db4 ᶵ 35 2 7605 1db5 ᶶ 49 2 7606 1db6 ᶷ 45 2 7607 1db7 ᶹ 46 2 7609 1db9 ᶺ 46 2 7610 1dba ᶻ 39 2 7611 1dbb ᶼ 50 2 7612 1dbc ᶽ 39 2 7613 1dbd ᶾ 43 2 7614 1dbe ᶿ 44 2 7615 1dbf Ḍ 82 3 7692 1e0c ḍ 66 3 7693 1e0d Ḓ 83 3 7698 1e12 ḓ 67 3 7699 1e13 Ḥ 90 3 7716 1e24 ḥ 69 3 7717 1e25 Ḷ 66 3 7734 1e36 ḷ 36 3 7735 1e37 Ḹ 66 3 7736 1e38 ḹ 36 3 7737 1e39 Ḽ 65 3 7740 1e3c ḽ 40 3 7741 1e3d ṁ 100 2 7745 1e41 Ṃ 105 3 7746 1e42 ṃ 100 1 7747 1e43 Ṅ 84 2 7748 1e44 ṅ 71 2 7749 1e45 Ṇ 87 3 7750 1e46 ṇ 69 1 7751 1e47 Ṋ 84 3 7754 1e4a ṋ 70 1 7755 1e4b ṗ 66 3 7767 1e57 Ṛ 79 3 7770 1e5a ṛ 50 1 7771 1e5b Ṝ 79 3 7772 1e5c ṝ 50 3 7773 1e5d ṡ 53 2 7777 1e61 Ṣ 68 3 7778 1e62 ṣ 53 1 7779 1e63 Ṭ 71 3 7788 1e6c ṭ 44 3 7789 1e6d Ṱ 70 3 7792 1e70 ṱ 47 3 7793 1e71 Ṿ 74 3 7806 1e7e ṿ 55 1 7807 1e7f Ẁ 107 2 7808 1e80 ẁ 82 2 7809 1e81 Ẃ 107 2 7810 1e82 ẃ 82 2 7811 1e83 Ẅ 107 2 7812 1e84 ẅ 82 2 7813 1e85 Ẹ 72 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 44 3 7882 1eca ị 36 3 7883 1ecb Ọ 83 3 7884 1ecc ọ 63 1 7885 1ecd Ụ 84 3 7908 1ee4 ụ 69 1 7909 1ee5 Ỳ 68 2 7922 1ef2 ỳ 56 3 7923 1ef3 ἁ 73 2 7937 1f01 ἂ 73 2 7938 1f02 ἃ 73 2 7939 1f03 ἄ 73 2 7940 1f04 ἅ 73 2 7941 1f05 ἆ 73 2 7942 1f06 ἇ 73 2 7943 1f07 Ἀ 73 2 7944 1f08 Ἁ 73 2 7945 1f09 Ἂ 93 2 7946 1f0a Ἃ 93 2 7947 1f0b Ἄ 79 2 7948 1f0c Ἅ 80 2 7949 1f0d Ἆ 73 2 7950 1f0e Ἇ 73 2 7951 1f0f ἐ 58 2 7952 1f10 ἑ 58 2 7953 1f11 ἒ 58 2 7954 1f12 ἓ 58 2 7955 1f13 ἔ 58 2 7956 1f14 ἕ 58 2 7957 1f15 Ἐ 87 2 7960 1f18 Ἑ 86 2 7961 1f19 Ἒ 111 2 7962 1f1a Ἓ 111 2 7963 1f1b Ἔ 104 2 7964 1f1c Ἕ 106 2 7965 1f1d ἠ 69 3 7968 1f20 ἡ 69 3 7969 1f21 ἢ 69 3 7970 1f22 ἣ 69 3 7971 1f23 ἤ 69 3 7972 1f24 ἥ 69 3 7973 1f25 ἦ 69 3 7974 1f26 ἧ 69 3 7975 1f27 Ἠ 105 2 7976 1f28 Ἡ 104 2 7977 1f29 Ἢ 129 2 7978 1f2a Ἣ 129 2 7979 1f2b Ἤ 122 2 7980 1f2c Ἥ 124 2 7981 1f2d Ἦ 114 2 7982 1f2e Ἧ 114 2 7983 1f2f ἰ 46 2 7984 1f30 ἱ 46 2 7985 1f31 ἲ 46 2 7986 1f32 ἳ 46 2 7987 1f33 ἴ 46 2 7988 1f34 ἵ 46 2 7989 1f35 ἶ 46 2 7990 1f36 ἷ 46 2 7991 1f37 Ἰ 60 2 7992 1f38 Ἱ 59 2 7993 1f39 Ἲ 84 2 7994 1f3a Ἳ 84 2 7995 1f3b Ἴ 76 2 7996 1f3c Ἵ 79 2 7997 1f3d Ἶ 69 2 7998 1f3e Ἷ 68 2 7999 1f3f ὀ 63 2 8000 1f40 ὁ 63 2 8001 1f41 ὂ 63 2 8002 1f42 ὃ 63 2 8003 1f43 ὄ 64 2 8004 1f44 ὅ 64 2 8005 1f45 Ὀ 85 2 8008 1f48 Ὁ 89 2 8009 1f49 Ὂ 118 2 8010 1f4a Ὃ 117 2 8011 1f4b Ὄ 98 2 8012 1f4c Ὅ 101 2 8013 1f4d ὐ 66 2 8016 1f50 ὑ 66 2 8017 1f51 ὒ 66 2 8018 1f52 ὓ 66 2 8019 1f53 ὔ 66 2 8020 1f54 ὕ 66 2 8021 1f55 ὖ 66 2 8022 1f56 ὗ 66 2 8023 1f57 Ὑ 88 2 8025 1f59 Ὓ 113 2 8027 1f5b Ὕ 108 2 8029 1f5d Ὗ 98 2 8031 1f5f ὠ 90 2 8032 1f60 ὡ 90 2 8033 1f61 ὢ 90 2 8034 1f62 ὣ 90 2 8035 1f63 ὤ 90 2 8036 1f64 ὥ 90 2 8037 1f65 ὦ 90 2 8038 1f66 ὧ 90 2 8039 1f67 Ὠ 88 2 8040 1f68 Ὡ 91 2 8041 1f69 Ὢ 120 2 8042 1f6a Ὣ 121 2 8043 1f6b Ὤ 100 2 8044 1f6c Ὥ 103 2 8045 1f6d Ὦ 97 2 8046 1f6e Ὧ 101 2 8047 1f6f ὰ 73 2 8048 1f70 ά 73 2 8049 1f71 ὲ 58 2 8050 1f72 έ 58 2 8051 1f73 ὴ 69 3 8052 1f74 ή 69 3 8053 1f75 ὶ 46 2 8054 1f76 ί 46 2 8055 1f77 ὸ 63 2 8056 1f78 ό 63 2 8057 1f79 ὺ 66 2 8058 1f7a ύ 66 2 8059 1f7b ὼ 90 2 8060 1f7c ώ 90 2 8061 1f7d ᾀ 73 3 8064 1f80 ᾁ 73 3 8065 1f81 ᾂ 73 3 8066 1f82 ᾃ 73 3 8067 1f83 ᾄ 73 3 8068 1f84 ᾅ 73 3 8069 1f85 ᾆ 73 3 8070 1f86 ᾇ 73 3 8071 1f87 ᾈ 73 3 8072 1f88 ᾉ 73 3 8073 1f89 ᾊ 93 3 8074 1f8a ᾋ 93 3 8075 1f8b ᾌ 79 3 8076 1f8c ᾍ 80 3 8077 1f8d ᾎ 73 3 8078 1f8e ᾏ 73 3 8079 1f8f ᾐ 69 3 8080 1f90 ᾑ 69 3 8081 1f91 ᾒ 69 3 8082 1f92 ᾓ 69 3 8083 1f93 ᾔ 69 3 8084 1f94 ᾕ 69 3 8085 1f95 ᾖ 69 3 8086 1f96 ᾗ 69 3 8087 1f97 ᾘ 105 3 8088 1f98 ᾙ 104 3 8089 1f99 ᾚ 129 3 8090 1f9a ᾛ 129 3 8091 1f9b ᾜ 121 3 8092 1f9c ᾝ 124 3 8093 1f9d ᾞ 114 3 8094 1f9e ᾟ 114 3 8095 1f9f ᾠ 90 3 8096 1fa0 ᾡ 90 3 8097 1fa1 ᾢ 90 3 8098 1fa2 ᾣ 90 3 8099 1fa3 ᾤ 90 3 8100 1fa4 ᾥ 90 3 8101 1fa5 ᾦ 90 3 8102 1fa6 ᾧ 90 3 8103 1fa7 ᾨ 88 3 8104 1fa8 ᾩ 91 3 8105 1fa9 ᾪ 120 3 8106 1faa ᾫ 121 3 8107 1fab ᾬ 100 3 8108 1fac ᾭ 103 3 8109 1fad ᾮ 97 3 8110 1fae ᾯ 101 3 8111 1faf ᾰ 73 2 8112 1fb0 ᾱ 73 2 8113 1fb1 ᾲ 73 3 8114 1fb2 ᾳ 73 1 8115 1fb3 ᾴ 73 3 8116 1fb4 ᾶ 73 2 8118 1fb6 ᾷ 73 3 8119 1fb7 Ᾰ 73 2 8120 1fb8 Ᾱ 73 2 8121 1fb9 Ὰ 77 2 8122 1fba Ά 73 2 8123 1fbb ᾼ 73 3 8124 1fbc ᾽ 48 2 8125 1fbd ι 48 1 8126 1fbe ᾿ 48 2 8127 1fbf ῀ 48 2 8128 1fc0 ῁ 49 2 8129 1fc1 ῂ 69 3 8130 1fc2 ῃ 69 1 8131 1fc3 ῄ 69 3 8132 1fc4 ῆ 69 3 8134 1fc6 ῇ 69 3 8135 1fc7 Ὲ 95 2 8136 1fc8 Έ 90 2 8137 1fc9 Ὴ 113 2 8138 1fca Ή 106 2 8139 1fcb ῌ 90 3 8140 1fcc ῍ 48 2 8141 1fcd ῎ 48 2 8142 1fce ῏ 49 2 8143 1fcf ῐ 46 2 8144 1fd0 ῑ 46 2 8145 1fd1 ῒ 46 2 8146 1fd2 ΐ 47 2 8147 1fd3 ῖ 46 2 8150 1fd6 ῗ 46 2 8151 1fd7 Ῐ 47 2 8152 1fd8 Ῑ 44 2 8153 1fd9 Ὶ 68 2 8154 1fda Ί 63 2 8155 1fdb ῝ 48 2 8157 1fdd ῞ 48 2 8158 1fde ῟ 49 2 8159 1fdf ῠ 66 2 8160 1fe0 ῡ 66 2 8161 1fe1 ῢ 66 2 8162 1fe2 ΰ 66 2 8163 1fe3 ῤ 63 3 8164 1fe4 ῥ 63 3 8165 1fe5 ῦ 66 2 8166 1fe6 ῧ 66 2 8167 1fe7 Ῠ 70 2 8168 1fe8 Ῡ 68 2 8169 1fe9 Ὺ 97 2 8170 1fea Ύ 91 2 8171 1feb Ῥ 87 2 8172 1fec ῭ 48 2 8173 1fed ΅ 49 2 8174 1fee ` 47 2 8175 1fef ῲ 90 3 8178 1ff2 ῳ 90 1 8179 1ff3 ῴ 90 3 8180 1ff4 ῶ 90 2 8182 1ff6 ῷ 90 3 8183 1ff7 Ὸ 102 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 105 2 8186 1ffa Ώ 86 2 8187 1ffb ῼ 84 3 8188 1ffc ´ 49 2 8189 1ffd ῾ 48 2 8190 1ffe ‐ 39 0 8208 2010 ‑ 39 0 8209 2011 ‒ 47 0 8210 2012 – 47 0 8211 2013 en " \- " — 95 0 8212 2014 em " -- " ― 95 0 8213 2015 ‗ 47 1 8215 2017 ‘ 33 2 8216 2018 ` " ‘ " ’ 33 2 8217 2019 ' " ’ " ‚ 33 1 8218 201a ‛ 33 2 8219 201b “ 55 2 8220 201c ” 55 2 8221 201d „ 54 1 8222 201e ‟ 55 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 61 0 8226 2022 ‣ 61 0 8227 2023 … 95 0 8230 2026 ‰ 132 2 8240 2030 ‱ 172 2 8241 2031 ‹ 38 0 8249 2039 › 38 0 8250 203a ‼ 60 2 8252 203c ‾ 47 2 8254 203e ⁇ 103 2 8263 2047 ⁈ 82 2 8264 2048 ⁉ 81 2 8265 2049 ⁰ 42 2 8304 2070 ⁴ 41 2 8308 2074 ⁵ 41 2 8309 2075 ⁶ 42 2 8310 2076 ⁷ 42 2 8311 2077 ⁸ 42 2 8312 2078 ⁹ 42 2 8313 2079 ⁿ 49 2 8319 207f ₦ 66 2 8358 20a6 € 66 2 8364 20ac ₵ 66 3 8373 20b5 № 130 2 8470 2116 ™ 95 2 8482 2122 tm " Ω 84 2 8486 2126 K 83 2 8490 212a Å 73 2 8491 212b ∂ 51 2 8706 2202 pd " ∆ 71 2 8710 2206 ∇ 72 2 8711 2207 gr " ∏ 80 3 8719 220f ∑ 71 3 8721 2211 − 80 0 8722 2212 ∕ 16 2 8725 2215 ∙ 33 0 8729 2219 bu " √ 63 2 8730 221a sr " ∝ 64 0 8733 221d pt " ∞ 79 0 8734 221e if " ∟ 80 2 8735 221f ∠ 80 2 8736 2220 an " ∧ 77 0 8743 2227 l∧ 77 0 8743 2227 " ∨ 77 0 8744 2228 l| " ∩ 77 0 8745 2229 ca " ∪ 77 0 8746 222a cu " ∫ 55 3 8747 222b is " ≈ 80 0 8776 2248 ~~ " ≠ 80 2 8800 2260 != " ≡ 80 0 8801 2261 == " ≤ 80 0 8804 2264 ≥ 79 0 8805 2265 ⌂ 79 0 8962 2302 ⌐ 80 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 88 2 8984 2318 ⌙ 80 0 8985 2319 ⌠ 56 3 8992 2320 ⌡ 54 3 8993 2321 ⌥ 95 2 8997 2325 ⍽ 96 1 9085 237d ⎮ 55 3 9134 23ae ⏏ 73 0 9167 23cf ␣ 79 1 9251 2423 ▀ 73 2 9600 2580 ▁ 73 1 9601 2581 ▂ 73 1 9602 2582 ▃ 73 1 9603 2583 ▄ 73 1 9604 2584 ▅ 73 1 9605 2585 ▆ 73 1 9606 2586 ▇ 73 3 9607 2587 █ 73 3 9608 2588 ▉ 73 3 9609 2589 ▊ 73 3 9610 258a ▋ 73 3 9611 258b ▌ 73 3 9612 258c ▍ 73 3 9613 258d ▎ 73 3 9614 258e ▏ 73 3 9615 258f ▐ 73 3 9616 2590 ░ 73 3 9617 2591 ▒ 73 3 9618 2592 ▓ 73 3 9619 2593 ▔ 73 2 9620 2594 ▕ 73 3 9621 2595 ▖ 73 1 9622 2596 ▗ 73 1 9623 2597 ▘ 73 2 9624 2598 ▙ 73 3 9625 2599 ▚ 73 3 9626 259a ▛ 73 3 9627 259b ▜ 73 3 9628 259c ▝ 73 2 9629 259d ▞ 73 3 9630 259e ▟ 73 3 9631 259f ■ 73 3 9632 25a0 □ 73 3 9633 25a1 ▢ 73 3 9634 25a2 ▣ 73 3 9635 25a3 ▤ 73 3 9636 25a4 ▥ 73 3 9637 25a5 ▦ 73 3 9638 25a6 ▧ 73 3 9639 25a7 ▨ 73 3 9640 25a8 ▩ 73 3 9641 25a9 ▪ 48 0 9642 25aa ▫ 48 0 9643 25ab ▬ 73 0 9644 25ac ▭ 73 0 9645 25ad ▮ 36 3 9646 25ae ▯ 36 3 9647 25af ▰ 73 0 9648 25b0 ▱ 73 0 9649 25b1 ▲ 73 3 9650 25b2 △ 73 3 9651 25b3 ▴ 48 0 9652 25b4 ▵ 48 0 9653 25b5 ▶ 73 3 9654 25b6 ▷ 73 3 9655 25b7 ▸ 48 0 9656 25b8 ▹ 48 0 9657 25b9 ► 73 0 9658 25ba ▻ 73 0 9659 25bb ▼ 73 3 9660 25bc ▽ 73 3 9661 25bd ▾ 48 0 9662 25be ▿ 48 0 9663 25bf ◀ 73 3 9664 25c0 ◁ 73 3 9665 25c1 ◂ 48 0 9666 25c2 ◃ 48 0 9667 25c3 ◄ 73 0 9668 25c4 ◅ 73 0 9669 25c5 ◆ 73 3 9670 25c6 ◇ 73 3 9671 25c7 ◈ 73 3 9672 25c8 ◉ 73 3 9673 25c9 ◊ 47 3 9674 25ca ○ 73 3 9675 25cb ◌ 73 3 9676 25cc ◍ 73 3 9677 25cd ◎ 73 3 9678 25ce ● 73 3 9679 25cf ◐ 73 3 9680 25d0 ◑ 73 3 9681 25d1 ◒ 73 3 9682 25d2 ◓ 73 3 9683 25d3 ◔ 73 3 9684 25d4 ◕ 73 3 9685 25d5 ◖ 37 3 9686 25d6 ◗ 37 3 9687 25d7 ◘ 61 2 9688 25d8 ◙ 73 3 9689 25d9 ◚ 73 2 9690 25da ◛ 73 1 9691 25db ◜ 37 2 9692 25dc ◝ 37 2 9693 25dd ◞ 37 1 9694 25de ◟ 37 1 9695 25df ◠ 73 2 9696 25e0 ◡ 73 1 9697 25e1 ◢ 73 3 9698 25e2 ◣ 73 3 9699 25e3 ◤ 73 3 9700 25e4 ◥ 73 3 9701 25e5 ◦ 61 0 9702 25e6 ◧ 73 3 9703 25e7 ◨ 73 3 9704 25e8 ◩ 73 3 9705 25e9 ◪ 73 3 9706 25ea ◫ 73 3 9707 25eb ◬ 73 3 9708 25ec ◭ 73 3 9709 25ed ◮ 73 3 9710 25ee ◯ 94 3 9711 25ef ◰ 73 3 9712 25f0 ◱ 73 3 9713 25f1 ◲ 73 3 9714 25f2 ◳ 73 3 9715 25f3 ◴ 73 3 9716 25f4 ◵ 73 3 9717 25f5 ◶ 73 3 9718 25f6 ◷ 73 3 9719 25f7 ◸ 73 3 9720 25f8 ◹ 73 3 9721 25f9 ◺ 73 3 9722 25fa ◻ 62 1 9723 25fb ◼ 62 1 9724 25fc ◽ 53 0 9725 25fd ◾ 53 0 9726 25fe ◿ 73 3 9727 25ff ☸ 86 2 9784 2638 ⟠ 47 3 10208 27e0 ⧫ 47 3 10731 29eb ⬒ 73 3 11026 2b12 ⬓ 73 3 11027 2b13 fi 69 3 64257 fb01 fl 69 3 64258 fb02 � 107 3 65533 fffd 9base-6/troff/font/devutf/DejaVuMonoSansBoldOblique0000644000175000017500000005131211402154555022034 0ustar anselmanselmname DejaVuMonoSansBoldOblique fontname DejaVuMonoSansBoldOblique spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 0 60 003c = 60 0 61 003d > 60 0 62 003e ? 60 2 63 003f @ 60 3 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e   60 0 160 00a0 ¡ 60 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 2 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 3 188 00bc ½ 60 3 189 00bd ¾ 60 3 190 00be ¿ 60 2 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 0 247 00f7 -: " di " ø 60 3 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f Ɓ 60 2 385 0181 Ƃ 60 2 386 0182 ƃ 60 2 387 0183 Ƅ 60 2 388 0184 ƅ 60 2 389 0185 Ɔ 60 2 390 0186 Ƈ 60 2 391 0187 ƈ 60 2 392 0188 Ɖ 60 2 393 0189 Ɗ 60 2 394 018a Ƌ 60 2 395 018b ƌ 60 2 396 018c ƍ 60 1 397 018d Ǝ 60 2 398 018e Ə 60 2 399 018f Ɛ 60 2 400 0190 Ƒ 60 3 401 0191 ƒ 60 3 402 0192 Ɠ 60 2 403 0193 Ɣ 60 3 404 0194 ƕ 60 2 405 0195 Ɩ 60 2 406 0196 Ɨ 60 2 407 0197 Ƙ 60 2 408 0198 ƙ 60 2 409 0199 ƚ 60 2 410 019a ƛ 60 2 411 019b Ɯ 60 2 412 019c Ɲ 60 3 413 019d ƞ 60 1 414 019e Ɵ 60 2 415 019f Ơ 60 2 416 01a0 ơ 60 0 417 01a1 Ƣ 60 2 418 01a2 ƣ 60 1 419 01a3 Ƥ 60 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 60 3 426 01aa ƫ 60 3 427 01ab Ƭ 60 2 428 01ac ƭ 60 2 429 01ad Ʈ 60 3 430 01ae Ư 60 2 431 01af ư 60 0 432 01b0 Ʊ 60 2 433 01b1 Ʋ 60 2 434 01b2 Ƴ 60 2 435 01b3 ƴ 60 1 436 01b4 Ƶ 60 2 437 01b5 ƶ 60 0 438 01b6 Ʒ 60 2 439 01b7 Ƹ 60 2 440 01b8 ƹ 60 1 441 01b9 ƻ 60 2 443 01bb Ƽ 60 2 444 01bc ƽ 60 1 445 01bd ƾ 60 2 446 01be ǀ 60 2 448 01c0 ǁ 60 2 449 01c1 ǂ 60 2 450 01c2 ǃ 60 2 451 01c3 Ǎ 60 2 461 01cd ǎ 60 2 462 01ce Ǐ 60 2 463 01cf ǐ 60 2 464 01d0 Ǒ 60 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 60 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 60 2 471 01d7 ǘ 60 2 472 01d8 Ǚ 60 2 473 01d9 ǚ 60 2 474 01da Ǜ 60 2 475 01db ǜ 60 2 476 01dc ǝ 60 0 477 01dd ǟ 60 2 479 01df Ǣ 60 2 482 01e2 ǣ 60 2 483 01e3 Ǫ 60 3 490 01ea ǫ 60 1 491 01eb Ǭ 60 3 492 01ec ǭ 60 3 493 01ed Ƕ 60 2 502 01f6 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b Ȥ 60 3 548 0224 ȥ 60 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 60 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 60 2 562 0232 ȳ 60 3 563 0233 ȷ 60 1 567 0237 ȸ 60 2 568 0238 ȹ 60 1 569 0239 Ⱥ 60 2 570 023a Ȼ 60 2 571 023b ȼ 60 3 572 023c Ƚ 60 2 573 023d Ⱦ 60 2 574 023e ȿ 60 1 575 023f ɀ 60 1 576 0240 Ɂ 60 2 577 0241 ɐ 60 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 60 0 596 0254 ɕ 60 1 597 0255 ɖ 60 3 598 0256 ɗ 60 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 60 0 602 025a ɛ 60 0 603 025b ɜ 60 0 604 025c ɝ 60 0 605 025d ɞ 60 0 606 025e ɟ 60 1 607 025f ɠ 60 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 60 1 611 0263 ɤ 60 1 612 0264 ɥ 60 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 60 2 616 0268 ɩ 60 0 617 0269 ɪ 60 0 618 026a ɫ 60 2 619 026b ɬ 60 2 620 026c ɭ 60 3 621 026d ɮ 60 3 622 026e ɯ 60 0 623 026f ɰ 60 1 624 0270 ɱ 60 1 625 0271 ɲ 60 1 626 0272 ɳ 60 1 627 0273 ɴ 60 0 628 0274 ɵ 60 0 629 0275 ɶ 60 0 630 0276 ɷ 60 0 631 0277 ɸ 60 3 632 0278 ɹ 60 0 633 0279 ɺ 60 2 634 027a ɻ 60 1 635 027b ɼ 60 1 636 027c ɽ 60 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 60 1 642 0282 ʃ 60 3 643 0283 ʄ 60 3 644 0284 ʅ 60 3 645 0285 ʆ 60 3 646 0286 ʇ 60 1 647 0287 ʈ 60 3 648 0288 ʉ 60 0 649 0289 ʊ 60 1 650 028a ʋ 60 0 651 028b ʌ 60 0 652 028c ʍ 60 0 653 028d ʎ 60 2 654 028e ʏ 60 0 655 028f ʐ 60 1 656 0290 ʑ 60 1 657 0291 ʒ 60 1 658 0292 ʓ 60 1 659 0293 ʔ 60 2 660 0294 ʕ 60 2 661 0295 ʖ 60 2 662 0296 ʗ 60 3 663 0297 ʘ 60 0 664 0298 ʙ 60 0 665 0299 ʚ 60 0 666 029a ʛ 60 2 667 029b ʜ 60 0 668 029c ʝ 60 3 669 029d ʞ 60 1 670 029e ʟ 60 0 671 029f ʠ 60 3 672 02a0 ʡ 60 2 673 02a1 ʢ 60 2 674 02a2 ʣ 60 2 675 02a3 ʤ 60 3 676 02a4 ʥ 60 3 677 02a5 ʦ 60 2 678 02a6 ʧ 60 3 679 02a7 ʨ 60 3 680 02a8 ʩ 60 3 681 02a9 ʪ 60 2 682 02aa ʫ 60 2 683 02ab ʬ 60 2 684 02ac ʭ 60 2 685 02ad ʮ 60 3 686 02ae ʯ 60 3 687 02af ʰ 60 2 688 02b0 ʱ 60 2 689 02b1 ʲ 60 2 690 02b2 ʳ 60 2 691 02b3 ʴ 60 2 692 02b4 ʵ 60 2 693 02b5 ʶ 60 2 694 02b6 ʷ 60 2 695 02b7 ʸ 60 2 696 02b8 ʻ 60 2 699 02bb ʼ 60 2 700 02bc ʾ 60 2 702 02be ʿ 60 2 703 02bf ˀ 60 2 704 02c0 ˁ 60 2 705 02c1 ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˈ 60 2 712 02c8 ˌ 60 1 716 02cc ː 60 0 720 02d0 ˑ 60 0 721 02d1 ˒ 60 0 722 02d2 ˓ 60 0 723 02d3 ˖ 60 0 726 02d6 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ˞ 60 0 734 02de ˠ 60 2 736 02e0 ˡ 60 2 737 02e1 ˢ 60 2 738 02e2 ˣ 60 2 739 02e3 ˤ 60 2 740 02e4 ˥ 60 2 741 02e5 ˦ 60 2 742 02e6 ˧ 60 2 743 02e7 ˨ 60 2 744 02e8 ˩ 60 2 745 02e9 ́ 60 2 769 0301 ̂ 60 2 770 0302 ̃ 60 2 771 0303 ̄ 60 2 772 0304 ̅ 60 2 773 0305 ̆ 60 2 774 0306 ̇ 60 2 775 0307 ̈ 60 2 776 0308 ̉ 60 2 777 0309 ̊ 60 2 778 030a ̋ 60 2 779 030b ̌ 60 2 780 030c ̍ 60 2 781 030d ̎ 60 2 782 030e ̏ 60 2 783 030f ̐ 60 2 784 0310 ̑ 60 2 785 0311 ̒ 60 0 786 0312 ̓ 60 2 787 0313 ̔ 60 2 788 0314 ̕ 60 2 789 0315 ̖ 60 1 790 0316 ̗ 60 1 791 0317 ̘ 60 1 792 0318 ̙ 60 1 793 0319 ̚ 60 2 794 031a ̛ 60 0 795 031b ̜ 60 1 796 031c ̝ 60 1 797 031d ̞ 60 1 798 031e ̟ 60 1 799 031f ̠ 60 1 800 0320 ̡ 60 1 801 0321 ̢ 60 1 802 0322 ̣ 60 1 803 0323 ̤ 60 1 804 0324 ̥ 60 1 805 0325 ̦ 60 1 806 0326 ̧ 60 1 807 0327 ̨ 60 1 808 0328 ̩ 60 1 809 0329 ̪ 60 1 810 032a ̫ 60 1 811 032b ̬ 60 1 812 032c ̭ 60 1 813 032d ̮ 60 1 814 032e ̯ 60 1 815 032f ̰ 60 1 816 0330 ̱ 60 1 817 0331 ̲ 60 1 818 0332 ̳ 60 1 819 0333 ̴ 60 0 820 0334 ̵ 60 0 821 0335 ̶ 60 0 822 0336 ̷ 60 3 823 0337 ̸ 60 2 824 0338 ̹ 60 1 825 0339 ̺ 60 1 826 033a ̻ 60 1 827 033b ̼ 60 1 828 033c ̽ 60 2 829 033d ̾ 60 2 830 033e ̿ 60 2 831 033f ͘ 60 2 856 0358 ͡ 60 2 865 0361 ʹ 60 2 884 0374 ͵ 60 1 885 0375 ͺ 60 1 890 037a ; 60 1 894 037e ΄ 60 2 900 0384 ΅ 60 2 901 0385 Ά 60 2 902 0386 · 60 0 903 0387 Έ 60 2 904 0388 Ή 60 2 905 0389 Ί 60 2 906 038a Ό 60 2 908 038c Ύ 60 2 910 038e Ώ 60 2 911 038f ΐ 60 2 912 0390 Α 60 2 913 0391 Β 60 2 914 0392 Γ 60 2 915 0393 Δ 60 2 916 0394 Ε 60 2 917 0395 Ζ 60 2 918 0396 Η 60 2 919 0397 Θ 60 2 920 0398 Ι 60 2 921 0399 Κ 60 2 922 039a Λ 60 2 923 039b Μ 60 2 924 039c Ν 60 2 925 039d Ξ 60 2 926 039e Ο 60 2 927 039f Π 60 2 928 03a0 Ρ 60 2 929 03a1 Σ 60 2 931 03a3 Τ 60 2 932 03a4 Υ 60 2 933 03a5 Φ 60 2 934 03a6 Χ 60 2 935 03a7 Ψ 60 2 936 03a8 Ω 60 2 937 03a9 Ϊ 60 2 938 03aa Ϋ 60 2 939 03ab ά 60 2 940 03ac έ 60 2 941 03ad ή 60 3 942 03ae ί 60 2 943 03af ΰ 60 2 944 03b0 α 60 0 945 03b1 β 60 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 60 0 949 03b5 ζ 60 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 60 0 953 03b9 κ 60 0 954 03ba λ 60 2 955 03bb μ 60 1 956 03bc ν 60 0 957 03bd ξ 60 3 958 03be ο 60 0 959 03bf π 60 0 960 03c0 ρ 60 1 961 03c1 ς 60 1 962 03c2 σ 60 0 963 03c3 τ 60 0 964 03c4 υ 60 0 965 03c5 φ 60 1 966 03c6 χ 60 1 967 03c7 ψ 60 1 968 03c8 ω 60 0 969 03c9 ϊ 60 2 970 03ca ϋ 60 2 971 03cb ό 60 2 972 03cc ύ 60 2 973 03cd ώ 60 2 974 03ce ϐ 60 2 976 03d0 ϑ 60 2 977 03d1 ϒ 60 2 978 03d2 ϓ 60 2 979 03d3 ϔ 60 2 980 03d4 ϕ 60 3 981 03d5 ϖ 60 0 982 03d6 ϗ 60 1 983 03d7 Ϙ 60 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 60 3 986 03da ϛ 60 1 987 03db Ϝ 60 2 988 03dc ϝ 60 3 989 03dd Ϟ 60 2 990 03de ϟ 60 2 991 03df Ϡ 60 3 992 03e0 ϡ 60 1 993 03e1 ϰ 60 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 60 0 1010 03f2 ϳ 60 3 1011 03f3 ϴ 60 2 1012 03f4 ϵ 60 0 1013 03f5 ϶ 60 0 1014 03f6 Ϸ 60 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 60 2 1017 03f9 Ϻ 60 2 1018 03fa ϻ 60 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 60 2 1021 03fd Ͼ 60 2 1022 03fe Ͽ 60 2 1023 03ff Ё 60 2 1025 0401 Ђ 60 3 1026 0402 Ѓ 60 2 1027 0403 Є 60 2 1028 0404 Ѕ 60 2 1029 0405 І 60 2 1030 0406 Ї 60 2 1031 0407 Ј 60 2 1032 0408 Љ 60 2 1033 0409 Њ 60 2 1034 040a Ћ 60 2 1035 040b Ќ 60 2 1036 040c Ѝ 60 2 1037 040d Ў 60 2 1038 040e Џ 60 3 1039 040f А 60 2 1040 0410 Б 60 2 1041 0411 В 60 2 1042 0412 Г 60 2 1043 0413 Д 60 3 1044 0414 Е 60 2 1045 0415 Ж 60 2 1046 0416 З 60 2 1047 0417 И 60 2 1048 0418 Й 60 2 1049 0419 К 60 2 1050 041a Л 60 2 1051 041b М 60 2 1052 041c Н 60 2 1053 041d О 60 2 1054 041e П 60 2 1055 041f Р 60 2 1056 0420 С 60 2 1057 0421 Т 60 2 1058 0422 У 60 2 1059 0423 Ф 60 3 1060 0424 Х 60 2 1061 0425 Ц 60 3 1062 0426 Ч 60 2 1063 0427 Ш 60 2 1064 0428 Щ 60 3 1065 0429 Ъ 60 2 1066 042a Ы 60 2 1067 042b Ь 60 2 1068 042c Э 60 2 1069 042d Ю 60 2 1070 042e Я 60 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 60 0 1074 0432 г 60 0 1075 0433 д 60 1 1076 0434 е 60 0 1077 0435 ж 60 0 1078 0436 з 60 0 1079 0437 и 60 0 1080 0438 й 60 2 1081 0439 к 60 0 1082 043a л 60 0 1083 043b м 60 0 1084 043c н 60 0 1085 043d о 60 0 1086 043e п 60 0 1087 043f р 60 1 1088 0440 с 60 0 1089 0441 т 60 0 1090 0442 у 60 1 1091 0443 ф 60 3 1092 0444 х 60 0 1093 0445 ц 60 1 1094 0446 ч 60 0 1095 0447 ш 60 0 1096 0448 щ 60 1 1097 0449 ъ 60 0 1098 044a ы 60 0 1099 044b ь 60 0 1100 044c э 60 0 1101 044d ю 60 0 1102 044e я 60 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 60 3 1106 0452 ѓ 60 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 60 2 1110 0456 ї 60 2 1111 0457 ј 60 3 1112 0458 љ 60 0 1113 0459 њ 60 0 1114 045a ћ 60 2 1115 045b ќ 60 2 1116 045c ѝ 60 2 1117 045d ў 60 3 1118 045e џ 60 1 1119 045f Ґ 60 2 1168 0490 ґ 60 2 1169 0491 Ғ 60 2 1170 0492 ғ 60 0 1171 0493 Қ 60 3 1178 049a қ 60 1 1179 049b Ҳ 60 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 60 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 60 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 60 2 1236 04d4 ӕ 60 0 1237 04d5 Ӗ 60 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 60 2 1248 04e0 ӡ 60 1 1249 04e1 Ӧ 60 2 1254 04e6 ӧ 60 2 1255 04e7 ᴂ 60 0 7426 1d02 ᴈ 60 0 7432 1d08 ᴉ 60 1 7433 1d09 ᴔ 60 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 60 0 7453 1d1d ᴞ 60 0 7454 1d1e ᴟ 60 0 7455 1d1f ᵃ 60 2 7491 1d43 ᵄ 60 2 7492 1d44 ᵅ 60 2 7493 1d45 ᵆ 60 2 7494 1d46 ᵇ 60 2 7495 1d47 ᵈ 60 2 7496 1d48 ᵉ 60 2 7497 1d49 ᵊ 60 2 7498 1d4a ᵋ 60 2 7499 1d4b ᵌ 60 2 7500 1d4c ᵍ 60 2 7501 1d4d ᵎ 60 2 7502 1d4e ᵏ 60 2 7503 1d4f ᵐ 60 2 7504 1d50 ᵑ 60 2 7505 1d51 ᵒ 60 2 7506 1d52 ᵓ 60 2 7507 1d53 ᵔ 60 2 7508 1d54 ᵕ 60 0 7509 1d55 ᵖ 60 2 7510 1d56 ᵗ 60 2 7511 1d57 ᵘ 60 2 7512 1d58 ᵙ 60 0 7513 1d59 ᵚ 60 2 7514 1d5a ᵛ 60 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 60 0 7547 1d7b ᶅ 60 3 7557 1d85 ᶛ 60 2 7579 1d9b ᶜ 60 2 7580 1d9c ᶝ 60 2 7581 1d9d ᶞ 60 2 7582 1d9e ᶟ 60 2 7583 1d9f ᶠ 60 2 7584 1da0 ᶡ 60 2 7585 1da1 ᶢ 60 2 7586 1da2 ᶣ 60 2 7587 1da3 ᶤ 60 2 7588 1da4 ᶥ 60 2 7589 1da5 ᶦ 60 2 7590 1da6 ᶧ 60 2 7591 1da7 ᶨ 60 2 7592 1da8 ᶩ 60 2 7593 1da9 ᶪ 60 2 7594 1daa ᶫ 60 2 7595 1dab ᶬ 60 2 7596 1dac ᶭ 60 2 7597 1dad ᶮ 60 2 7598 1dae ᶯ 60 2 7599 1daf ᶰ 60 2 7600 1db0 ᶱ 60 2 7601 1db1 ᶲ 60 2 7602 1db2 ᶳ 60 2 7603 1db3 ᶴ 60 2 7604 1db4 ᶵ 60 2 7605 1db5 ᶶ 60 2 7606 1db6 ᶷ 60 2 7607 1db7 ᶹ 60 2 7609 1db9 ᶺ 60 2 7610 1dba ᶻ 60 2 7611 1dbb ᶼ 60 2 7612 1dbc ᶽ 60 2 7613 1dbd ᶾ 60 2 7614 1dbe ᶿ 60 2 7615 1dbf Ḍ 60 3 7692 1e0c ḍ 60 3 7693 1e0d Ḓ 60 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 60 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 60 3 7734 1e36 ḷ 60 3 7735 1e37 Ḹ 60 3 7736 1e38 ḹ 60 3 7737 1e39 Ḽ 60 3 7740 1e3c ḽ 60 3 7741 1e3d ṁ 60 2 7745 1e41 Ṃ 60 3 7746 1e42 ṃ 60 1 7747 1e43 Ṅ 60 2 7748 1e44 ṅ 60 2 7749 1e45 Ṇ 60 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 60 3 7754 1e4a ṋ 60 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 60 3 7770 1e5a ṛ 60 1 7771 1e5b Ṝ 60 3 7772 1e5c ṝ 60 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 60 3 7788 1e6c ṭ 60 3 7789 1e6d Ṱ 60 3 7792 1e70 ṱ 60 3 7793 1e71 Ṿ 60 3 7806 1e7e ṿ 60 1 7807 1e7f Ẁ 60 2 7808 1e80 ẁ 60 2 7809 1e81 Ẃ 60 2 7810 1e82 ẃ 60 2 7811 1e83 Ẅ 60 2 7812 1e84 ẅ 60 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 60 3 7882 1eca ị 60 3 7883 1ecb Ọ 60 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 60 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 60 2 7922 1ef2 ỳ 60 3 7923 1ef3 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‗ 60 1 8215 2017 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 2 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e ‟ 60 2 8223 201f † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 ‣ 60 0 8227 2023 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‱ 60 2 8241 2031 ‹ 60 0 8249 2039 › 60 0 8250 203a ‼ 60 2 8252 203c ‾ 60 2 8254 203e ⁇ 60 2 8263 2047 ⁈ 60 2 8264 2048 ⁉ 60 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 60 2 8319 207f ₦ 60 2 8358 20a6 € 60 2 8364 20ac ₵ 60 3 8373 20b5 ™ 60 2 8482 2122 tm " Ω 60 2 8486 2126 K 60 2 8490 212a Å 60 2 8491 212b ∂ 60 2 8706 2202 pd " ∆ 60 2 8710 2206 ∇ 60 2 8711 2207 gr " ∏ 60 3 8719 220f ∑ 60 3 8721 2211 − 60 0 8722 2212 ∕ 60 3 8725 2215 ∙ 60 0 8729 2219 bu " √ 60 2 8730 221a sr " ∝ 60 0 8733 221d pt " ∞ 60 0 8734 221e if " ∟ 60 2 8735 221f ∠ 60 2 8736 2220 an " ∧ 60 0 8743 2227 l∧ 60 0 8743 2227 " ∨ 60 0 8744 2228 l| " ∩ 60 0 8745 2229 ca " ∪ 60 0 8746 222a cu " ∫ 60 3 8747 222b is " ≈ 60 0 8776 2248 ~~ " ≠ 60 2 8800 2260 != " ≡ 60 0 8801 2261 == " ≤ 60 0 8804 2264 ≥ 60 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 60 0 8976 2310 ⌑ 60 2 8977 2311 ⌙ 60 0 8985 2319 ⌠ 60 3 8992 2320 ⌡ 60 3 8993 2321 ⍽ 60 1 9085 237d ⎮ 60 3 9134 23ae ⏏ 60 0 9167 23cf ␣ 60 1 9251 2423 ▀ 60 2 9600 2580 ▁ 60 1 9601 2581 ▂ 60 1 9602 2582 ▃ 60 1 9603 2583 ▄ 60 1 9604 2584 ▅ 60 1 9605 2585 ▆ 60 1 9606 2586 ▇ 60 3 9607 2587 █ 60 3 9608 2588 ▉ 60 3 9609 2589 ▊ 60 3 9610 258a ▋ 60 3 9611 258b ▌ 60 3 9612 258c ▍ 60 3 9613 258d ▎ 60 3 9614 258e ▏ 60 3 9615 258f ▐ 60 3 9616 2590 ░ 60 3 9617 2591 ▒ 60 3 9618 2592 ▓ 60 3 9619 2593 ▔ 60 2 9620 2594 ▕ 60 3 9621 2595 ▖ 60 1 9622 2596 ▗ 60 1 9623 2597 ▘ 60 2 9624 2598 ▙ 60 3 9625 2599 ▚ 60 3 9626 259a ▛ 60 3 9627 259b ▜ 60 3 9628 259c ▝ 60 2 9629 259d ▞ 60 3 9630 259e ▟ 60 3 9631 259f ■ 60 0 9632 25a0 □ 60 0 9633 25a1 ▢ 60 0 9634 25a2 ▣ 60 0 9635 25a3 ▤ 60 0 9636 25a4 ▥ 60 0 9637 25a5 ▦ 60 0 9638 25a6 ▧ 60 0 9639 25a7 ▨ 60 0 9640 25a8 ▩ 60 0 9641 25a9 ▪ 60 0 9642 25aa ▫ 60 0 9643 25ab ▬ 60 0 9644 25ac ▭ 60 0 9645 25ad ▮ 60 0 9646 25ae ▯ 60 0 9647 25af ▰ 60 0 9648 25b0 ▱ 60 0 9649 25b1 ▲ 60 0 9650 25b2 △ 60 0 9651 25b3 ▴ 60 0 9652 25b4 ▵ 60 0 9653 25b5 ▶ 60 0 9654 25b6 ▷ 60 0 9655 25b7 ▸ 60 0 9656 25b8 ▹ 60 0 9657 25b9 ► 60 0 9658 25ba ▻ 60 0 9659 25bb ▼ 60 0 9660 25bc ▽ 60 0 9661 25bd ▾ 60 0 9662 25be ▿ 60 0 9663 25bf ◀ 60 0 9664 25c0 ◁ 60 0 9665 25c1 ◂ 60 0 9666 25c2 ◃ 60 0 9667 25c3 ◄ 60 0 9668 25c4 ◅ 60 0 9669 25c5 ◆ 60 0 9670 25c6 ◇ 60 0 9671 25c7 ◈ 60 0 9672 25c8 ◉ 60 0 9673 25c9 ◊ 60 3 9674 25ca ○ 60 0 9675 25cb ◌ 60 0 9676 25cc ◍ 60 0 9677 25cd ◎ 60 0 9678 25ce ● 60 0 9679 25cf ◐ 60 0 9680 25d0 ◑ 60 0 9681 25d1 ◒ 60 0 9682 25d2 ◓ 60 0 9683 25d3 ◔ 60 0 9684 25d4 ◕ 60 0 9685 25d5 ◖ 60 0 9686 25d6 ◗ 60 0 9687 25d7 ◘ 60 2 9688 25d8 ◙ 60 3 9689 25d9 ◚ 60 2 9690 25da ◛ 60 1 9691 25db ◜ 60 0 9692 25dc ◝ 60 0 9693 25dd ◞ 60 0 9694 25de ◟ 60 0 9695 25df ◠ 60 0 9696 25e0 ◡ 60 0 9697 25e1 ◢ 60 0 9698 25e2 ◣ 60 0 9699 25e3 ◤ 60 0 9700 25e4 ◥ 60 0 9701 25e5 ◦ 60 0 9702 25e6 ◧ 60 0 9703 25e7 ◨ 60 0 9704 25e8 ◩ 60 0 9705 25e9 ◪ 60 0 9706 25ea ◫ 60 0 9707 25eb ◬ 60 0 9708 25ec ◭ 60 0 9709 25ed ◮ 60 0 9710 25ee ◯ 60 1 9711 25ef ◰ 60 0 9712 25f0 ◱ 60 0 9713 25f1 ◲ 60 0 9714 25f2 ◳ 60 0 9715 25f3 ◴ 60 0 9716 25f4 ◵ 60 0 9717 25f5 ◶ 60 0 9718 25f6 ◷ 60 0 9719 25f7 ◸ 60 0 9720 25f8 ◹ 60 0 9721 25f9 ◺ 60 0 9722 25fa ◻ 60 0 9723 25fb ◼ 60 0 9724 25fc ◽ 60 0 9725 25fd ◾ 60 0 9726 25fe ◿ 60 0 9727 25ff ☸ 60 2 9784 2638 ⟠ 60 3 10208 27e0 ⧫ 60 3 10731 29eb ⬒ 60 0 11026 2b12 ⬓ 60 0 11027 2b13 fi 60 2 64257 fb01 fl 60 2 64258 fb02 � 60 3 65533 fffd 9base-6/troff/font/devutf/R0000644000175000017500000007505511402154555015271 0ustar anselmanselmname R fontname Times-Roman named in prologue spacewidth 25 charset ! 33 2 33 " 41 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 56 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 < 56 2 60 = 56 0 61 > 56 2 62 ? 44 2 63 @ 92 3 64 A 72 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 56 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 47 2 94 --- 50 1 95 ` 33 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 48 3 123 --- 20 2 124 } 48 3 125 ~ 33 2 148 --- 54 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 50 3 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 20 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 76 2 169 © " a_ 28 2 170 ª " << 50 0 171 « " -, 56 0 172 hy 33 0 173 -- 56 0 45 ­ " ro 76 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 56 2 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 50 1 181 µ " P! 45 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 31 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 44 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 89 2 198 Æ " C, 67 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 33 2 204 Ì " I' 33 2 205 Í " I^ 33 2 206 Î " I" 33 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 72 2 210 Ò " O' 72 2 211 Ó " O^ 72 2 212 Ô " O~ 72 2 213 Õ " O" 72 2 214 Ö " xx 56 0 215 × " O/ 72 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 72 2 221 Ý " TH 56 2 222 Þ " ss 50 2 223 ß " a` 44 2 224 à " a' 44 2 225 á " a^ 44 2 226 â " a~ 44 2 227 ã " a" 44 2 228 ä " a* 44 2 229 å " ae 67 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 50 2 240 ð " n~ 50 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 56 0 247 ÷ " o/ 50 2 248 ø " u` 50 2 249 ù " u' 50 2 250 ú " u^ 50 2 251 û " u" 50 2 252 ü " y' 50 3 253 ý " th 50 3 254 þ " y" 50 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/utfmap0000644000175000017500000000222411402154555016350 0ustar anselmanselm¡ !! ¢ c$ £ l$ ¤ g$ ¥ y$ ¦ || § SS ¨ "" © cO ª sa « << ¬ no ­ -- ® rO ¯ __ ° de ± +- ² s2 ³ s3 ´ '' µ mi ¶ pg · .. ¸ ,, ¹ s1 º s0 » >> ¼ 14 ½ 12 ¾ 34 ¿ ?? À `A Á 'A  ^A à ~A Ä "A Å oA Æ AE Ç ,C È `E É 'E Ê ^E Ë "E Ì `I Í 'I Î ^I Ï "I Ð D- Ñ ~N Ò `O Ó 'O Ô ^O Õ ~O Ö "O × mu Ø /O Ù `U Ú 'U Û ^U Ü "U Ý 'Y Þ |P ß ss à `a á 'a â ^a ã ~a ä "a å oa æ ae ç ,c è `e é 'e ê ^e ë "e ì `i í 'i î ^i ï "i ð d- ñ ~n ò `o ó 'o ô ^o õ ~o ö "o ÷ -: ø /o ù `u ú 'u û ^u ü "u ý 'y þ |p ÿ "y α *a β *b γ *g δ *d ε *e ζ *z η *y θ *h ι *i κ *k λ *l *m μ ν *n ξ *c ο *o π *p ρ *r ς ts σ *s τ *t υ *u φ *f χ *x ψ *q ω *w Α *A Β *B Γ *G Δ *D Ε *E Ζ *Z Η *Y Θ *H Ι *I Κ *K Λ *L Μ *M Ν *N Ξ *C Ο *O Π *P Ρ *R Σ *S Τ *T Υ *U Φ *F Χ *X Ψ *Q Ω *W ← <- ↑ ua → -> ↓ da ↔ ab ∀ fa ∃ te ∂ pd ∅ es ∆ *D ∇ gr ∉ !m ∍ st ∗ ** ∙ bu √ sr ∝ pt ∞ if ∠ an ∧ l& ∨ l| ∩ ca ∪ cu ∫ is ∴ tf ≃ ~= ≅ cg ≈ ~~ ≠ != ≡ == ≦ <= ≧ >= ⊂ sb ⊃ sp ⊄ !b ⊆ ib ⊇ ip ⊕ O+ ⊖ O- ⊗ Ox ⊢ tu ⊨ Tu ⋄ lz ⋯ el 9base-6/troff/font/devutf/AX0000644000175000017500000000534211402154555015370 0ustar anselmanselmname AX fontname AvantGarde-DemiOblique named in prologue spacewidth 28 charset ! 28 2 33 " 36 2 34 dq " # 56 2 35 $ 56 2 36 % 86 2 37 & 68 2 38 ' 28 2 39 ( 38 3 40 ) 38 3 41 * 44 2 42 + 60 0 43 , 28 1 44 - 42 0 173 . 28 0 46 / 46 3 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 56 2 63 @ 74 2 64 A 74 2 65 B 58 2 66 C 78 2 67 D 70 2 68 E 52 2 69 F 48 2 70 G 84 2 71 H 68 2 72 I 28 2 73 J 48 2 74 K 62 2 75 L 44 2 76 M 90 2 77 N 74 2 78 O 84 2 79 P 56 2 80 Q 84 2 81 R 58 2 82 S 52 2 83 T 42 2 84 U 64 2 85 V 70 2 86 W 90 2 87 X 68 2 88 Y 62 2 89 Z 50 2 90 [ 32 3 91 \ 64 2 92 bs " ] 32 3 93 ^ 54 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 66 0 97 b 66 2 98 c 64 0 99 d 66 2 100 e 64 0 101 f 28 2 102 g 66 1 103 h 60 2 104 i 24 2 105 j 26 3 106 k 58 2 107 l 24 2 108 m 94 0 109 n 60 0 110 o 64 0 111 p 66 1 112 q 66 1 113 r 32 0 114 s 44 0 115 t 30 2 116 u 60 0 117 v 56 0 118 w 80 0 119 x 56 0 120 y 58 1 121 z 46 0 122 { 34 3 123 --- 60 2 124 } 34 3 125 ~ 48 2 148 --- 60 0 126 \` 42 2 145 ga " !! 28 1 161 ¡ " c| 56 2 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 60 2 166 ¦ " so 56 3 167 sc " § " "" 50 2 168 ¨ " :a " co 74 2 169 © " a_ 36 2 170 ª " << 46 0 171 « " -, 60 0 172 hy 42 0 173 -- 60 0 45 ­ " ro 74 2 174 rg " ® " -^ 42 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 0 177 ± " 2^ 34 2 178 ² " 3^ 34 2 179 ³ " \' 42 2 180 aa " ´ " /u 58 1 181 µ " P! 60 3 182 pg " ¶ " .^ 28 0 183 · " ,, 34 1 184 ¸ " ,a " 1^ 34 2 185 ¹ " o_ 36 2 186 º " >> 46 0 187 » " 14 84 2 188 ¼ " 12 84 2 189 ½ " 34 84 2 190 ¾ " ?? 56 1 191 ¿ " A` 74 2 192 À " A' 74 2 193 Á " A^ 74 2 194  " A~ 74 2 195 à " A" 74 2 196 Ä " A* 74 2 197 Å " AE 90 2 198 Æ " C, 78 3 199 Ç " E` 52 2 200 È " E' 52 2 201 É " E^ 52 2 202 Ê " E" 52 2 203 Ë " I` 28 2 204 Ì " I' 28 2 205 Í " I^ 28 2 206 Î " I" 28 2 207 Ï " D- 74 2 208 Ð " N~ 74 2 209 Ñ " O` 84 2 210 Ò " O' 84 2 211 Ó " O^ 84 2 212 Ô " O~ 84 2 213 Õ " O" 84 2 214 Ö " xx 60 0 215 × " O/ 84 2 216 Ø " U` 64 2 217 Ù " U' 64 2 218 Ú " U^ 64 2 219 Û " U" 64 2 220 Ü " Y' 62 2 221 Ý " TH 56 2 222 Þ " ss 60 2 223 ß " a` 66 2 224 à " a' 66 2 225 á " a^ 66 2 226 â " a~ 66 2 227 ã " a" 66 2 228 ä " a* 66 2 229 å " ae 108 0 230 æ " c, 64 1 231 ç " e` 64 2 232 è " e' 64 2 233 é " e^ 64 2 234 ê " e" 64 2 235 ë " i` 24 2 236 ì " i' 24 2 237 í " i^ 24 2 238 î " i" 24 2 239 ï " d- 64 2 240 ð " n~ 60 2 241 ñ " o` 64 2 242 ò " o' 64 2 243 ó " o^ 64 2 244 ô " o~ 64 2 245 õ " o" 64 2 246 ö " -: 60 0 247 ÷ " o/ 66 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 58 3 253 ý " th 66 3 254 þ " y" 58 3 255 ÿ " 9base-6/troff/font/devutf/CY0000644000175000017500000000373511402154555015377 0ustar anselmanselm# Cyrillic, utf encoding name CyrillicTranslit spacewidth 33 charset а 50 0 97 a б 48 0 98 be в 48 0 118 ve г 45 0 103 ge д 56 0 100 de е 49 0 101 e ё 49 0 92 e" ж 90 0 39 zhe з 42 0 122 ze и 53 0 105 i й 53 0 106 j / i kratkoe к 50 0 107 ke л 56 0 108 el м 59 0 109 em н 53 0 110 en о 55 0 111 o п 53 0 112 pe р 54 0 114 er с 48 0 115 es т 48 0 116 te у 58 0 117 u ф 64 0 102 ef х 53 0 120 kha ц 54 0 99 tse ч 53 0 104 che ш 67 0 119 sha щ 67 0 93 shch ъ 58 0 61 tverdyj znak lc b with hook to left ы 61 0 121 y ь 50 0 59 mjagkij znak э 49 0 96 eh ю 66 0 91 yu я 53 0 113 ya А 63 0 65 A Б 64 0 66 BE В 52 0 86 VE Г 56 0 71 GE Д 65 0 68 DE Е 50 0 69 E Ё 50 0 124 E" Ж 90 0 34 ZHE З 46 0 90 ZE И 58 0 73 I Й 58 0 74 I KRAT К 57 0 75 KE Л 67 0 76 EL М 73 0 77 EM Н 58 0 78 EN О 57 0 79 O П 58 0 80 PE Р 53 0 82 ER С 53 0 83 ES Т 57 0 84 TE У 62 0 85 U Ф 73 0 70 EF Х 60 0 88 KHA Ц 58 0 67 TSE Ч 58 0 72 CHE Ш 82 0 87 SHA Щ 82 0 125 SHCH Ъ 74 0 43 tverdyj znak hook Ы 73 0 89 Y Ь 58 0 58 mjagkij znak Э 51 0 126 EH Ю 77 0 123 YU Я 58 0 81 YA 1 50 0 49 2 50 0 50 3 50 0 51 4 50 0 52 5 50 0 53 6 50 0 54 7 50 0 55 8 50 0 56 9 50 0 57 0 50 0 48 . 12 0 77 , 14 0 78 : 12 0 79 ; 14 0 80 / 18 0 81 ? 23 0 82 ! 13 0 83 ( 19 0 84 ) 17 0 85 - 16 0 86 ' 11 0 87 ` 11 0 88 em 55 0 89 en 27 0 90 $ 24 0 91 no 52 0 92 % 49 0 93 sl 15 0 94 £ 26 0 95 & 43 0 96 [ 16 0 97 ] 13 0 98 * 22 0 99 § 23 0 100 dg 24 0 101 dd 24 0 102 < 14 0 103 > 14 0 104 « 24 0 105 << » 25 0 106 >> І 19 0 107 I Ѵ 41 0 108 V ´ 15 0 109 ga 12 0 110 є 26 0 111 eps == je Є 37 0 112 EPS == JE ї 15 0 113 i.. == yi Ukrainian Ї 19 0 114 I.. і 14 0 115 i І 19 0 116 I ґ 23 0 117 funny gamma Ґ 32 0 118 funny cap gamma ћ 29 0 119 hbar Ћ 47 0 120 Th == cj ђ 27 0 121 h curved bar == dj Ђ 42 0 122 Th curved == DJ џ 29 0 123 dzh Џ 44 0 124 DZH ј 13 0 125 j Ј 23 0 126 J љ 40 0 127 lj Љ 51 0 128 LJ њ 40 0 129 Hb == nj Њ 51 0 130 uc HB == NJ ѕ 19 0 131 s Ѕ 27 0 132 S 9base-6/troff/font/devutf/Helvetica-Narrow-Oblique0000644000175000017500000000534311402154555021631 0ustar anselmanselmname Hi fontname Helvetica-Narrow-Oblique named in prologue spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 ^ 27 2 147 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 ¡ " c| 46 3 162 ct " ¢ " L- 46 2 163 £ " ps " xo 46 0 164 ¤ " cr " Y- 46 2 165 ¥ " yn " || 21 3 166 ¦ " so 46 3 167 sc " § " "" 27 2 168 ¨ " :a " co 60 2 169 © " a_ 30 2 170 ª " << 46 0 171 « " -, 48 0 172 hy 27 0 173 -- 48 0 45 ­ " ro 60 2 174 rg " ® " -^ 27 2 175 -a " ¯ " 0^ 33 2 176 ° " +- 48 2 177 ± " 2^ 27 2 178 ² " 3^ 27 2 179 ³ " \' 27 2 180 aa " ´ " /u 46 1 181 µ " P! 44 3 182 pg " ¶ " .^ 23 0 183 · " ,, 27 1 184 ¸ " ,a " 1^ 27 2 185 ¹ " o_ 30 2 186 º " >> 46 0 187 » " 14 68 2 188 ¼ " 12 68 2 189 ½ " 34 68 2 190 ¾ " ?? 50 1 191 ¿ " A` 55 2 192 À " A' 55 2 193 Á " A^ 55 2 194  " A~ 55 2 195 à " A" 55 2 196 Ä " A* 55 2 197 Å " AE 82 2 198 Æ " C, 59 3 199 Ç " E` 55 2 200 È " E' 55 2 201 É " E^ 55 2 202 Ê " E" 55 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 59 2 208 Ð " N~ 59 2 209 Ñ " O` 64 2 210 Ò " O' 64 2 211 Ó " O^ 64 2 212 Ô " O~ 64 2 213 Õ " O" 64 2 214 Ö " xx 48 0 215 × " O/ 64 2 216 Ø " U` 59 2 217 Ù " U' 59 2 218 Ú " U^ 59 2 219 Û " U" 59 2 220 Ü " Y' 55 2 221 Ý " TH 55 2 222 Þ " ss 50 2 223 ß " a` 46 2 224 à " a' 46 2 225 á " a^ 46 2 226 â " a~ 46 2 227 ã " a" 46 2 228 ä " a* 46 2 229 å " ae 73 0 230 æ " c, 41 1 231 ç " e` 46 2 232 è " e' 46 2 233 é " e^ 46 2 234 ê " e" 46 2 235 ë " i` 23 2 236 ì " i' 23 2 237 í " i^ 23 2 238 î " i" 23 2 239 ï " d- 46 2 240 ð " n~ 46 2 241 ñ " o` 46 2 242 ò " o' 46 2 243 ó " o^ 46 2 244 ô " o~ 46 2 245 õ " o" 46 2 246 ö " -: 48 0 247 ÷ " o/ 50 0 248 ø " u` 46 2 249 ù " u' 46 2 250 ú " u^ 46 2 251 û " u" 46 2 252 ü " y' 41 3 253 ý " th 46 3 254 þ " y" 41 3 255 ÿ " 9base-6/troff/font/devutf/ZI0000644000175000017500000000535611402154555015407 0ustar anselmanselmname ZI fontname ZapfChancery-MediumItalic named in prologue spacewidth 22 charset ! 28 2 33 " 22 2 34 dq " # 44 2 35 $ 44 3 36 % 68 2 37 & 78 2 38 ' 24 2 39 ( 26 3 40 ) 22 3 41 * 42 2 42 + 52 0 43 , 22 0 44 - 28 0 173 ­ " . 22 0 46 / 34 3 47 0 44 2 48 1 44 2 49 2 44 2 50 3 44 2 51 4 44 2 52 5 44 2 53 6 44 2 54 7 44 2 55 8 44 2 56 9 44 2 57 : 26 0 58 ; 24 0 59 --- 52 0 60 = 52 0 61 --- 52 0 62 ? 38 2 63 @ 70 2 64 A 62 2 65 B 60 2 66 C 52 2 67 D 70 2 68 E 62 2 69 F 58 2 70 G 62 3 71 H 68 2 72 I 38 2 73 J 40 2 74 K 66 3 75 L 58 2 76 M 84 2 77 N 70 3 78 O 60 2 79 P 54 2 80 Q 60 3 81 R 60 3 82 S 46 2 83 T 50 2 84 U 74 2 85 V 64 2 86 W 88 2 87 X 56 2 88 Y 56 3 89 Z 62 2 90 [ 24 3 91 \ 48 2 92 bs " ] 32 3 93 ^ 34 2 147 --- 52 2 94 --- 50 1 95 ` 24 2 96 a 42 0 97 b 42 2 98 c 34 0 99 d 44 2 100 e 34 0 101 f 32 3 102 g 40 1 103 h 44 2 104 i 24 2 105 j 22 3 106 k 44 3 107 l 24 2 108 m 62 0 109 n 46 0 110 o 40 0 111 p 44 1 112 q 40 3 113 r 30 0 114 s 32 0 115 t 32 2 116 u 46 0 117 v 44 0 118 w 68 0 119 x 42 1 120 y 40 1 121 z 44 0 122 { 24 3 123 --- 52 2 124 } 24 3 125 ~ 44 2 148 --- 52 0 126 \` 22 2 145 ga " !! 28 1 161 ¡ " c| 44 2 162 ¢ " ct " L- 44 2 163 £ " ps " xo 44 2 164 ¤ " cr " Y- 44 2 165 ¥ " yn " || 52 2 166 ¦ " so 42 3 167 § " sc " "" 36 2 168 ¨ " :a " co 74 2 169 © " a_ 26 2 170 ª " << 34 0 171 « " -, 52 0 172 ¬ " hy 28 0 173 ­ " -- 52 0 45 ro 74 2 174 ® " rg " -^ 44 2 175 ¯ " -a " 0^ 40 2 176 ° " +- 52 0 177 ± " 2^ 26 2 178 ² " 3^ 26 2 179 ³ " \' 30 2 180 ´ " aa " /u 46 1 181 µ " P! 50 3 182 ¶ " pg " .^ 22 0 183 · " ,, 30 1 184 ¸ " ,a " 1^ 26 2 185 ¹ " o_ 26 2 186 º " >> 38 0 187 » " 14 66 2 188 ¼ " 12 66 2 189 ½ " 34 66 2 190 ¾ " ?? 40 1 191 ¿ " A` 62 2 192 À " A' 62 2 193 Á " A^ 62 2 194  " A~ 62 2 195 à " A" 62 2 196 Ä " A* 62 2 197 Å " AE 74 2 198 Æ " C, 52 3 199 Ç " E` 62 2 200 È " E' 62 2 201 É " E^ 62 2 202 Ê " E" 62 2 203 Ë " I` 38 2 204 Ì " I' 38 2 205 Í " I^ 38 2 206 Î " I" 38 2 207 Ï " D- 70 2 208 Ð " N~ 70 3 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 52 0 215 × " O/ 66 3 216 Ø " U` 74 2 217 Ù " U' 74 2 218 Ú " U^ 74 2 219 Û " U" 74 2 220 Ü " Y' 56 3 221 Ý " TH 54 2 222 Þ " ss 42 3 223 ß " a` 42 2 224 à " a' 42 2 225 á " a^ 42 2 226 â " a~ 42 2 227 ã " a" 42 2 228 ä " a* 42 2 229 å " ae 54 0 230 æ " c, 34 1 231 ç " e` 34 2 232 è " e' 34 2 233 é " e^ 34 2 234 ê " e" 34 2 235 ë " i` 24 2 236 ì " i' 24 2 237 í " i^ 24 2 238 î " i" 24 2 239 ï " d- 40 2 240 ð " n~ 46 2 241 ñ " o` 40 2 242 ò " o' 40 2 243 ó " o^ 40 2 244 ô " o~ 40 2 245 õ " o" 40 2 246 ö " -: 52 0 247 ÷ " o/ 44 3 248 ø " u` 46 2 249 ù " u' 46 2 250 ú " u^ 46 2 251 û " u" 46 2 252 ü " y' 40 3 253 ý " th 44 3 254 þ " y" 40 3 255 ÿ " 9base-6/troff/font/devutf/DESC0000644000175000017500000000227711402154555015602 0ustar anselmanselm#Device Description - utf character set PDL PostScript Encoding Latin1 fonts 10 R I B BI CW H HI HB S1 S sizes 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 38 40 42 44 46 48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115 120 125 130 135 140 145 150 155 160 0 res 720 hor 1 vert 1 unitwidth 10 charset dq bs \` ga !! c| ct L- ps xo cr Y- yn || so sc "" :a co a_ << -, hy -- ro rg -^ -a 0^ +- 2^ 3^ \' aa /u P! pg .^ ,, ,a 1^ o_ >> 14 12 34 ?? A` A' A^ A~ A" A* AE C, E` E' E^ E" I` I' I^ I" D- N~ O` O' O^ O~ O" xx O/ U` U' U^ U" Y' TH ss a` a' a^ a~ a" a* ae c, e` e' e^ e" i` i' i^ i" d- n~ o` o' o^ o~ o" -: o/ u` u' u^ u" y' th y" ^a ~a Ua .a oa "a Ca va fa te st ** pl mi sl eq cg *A *B *X *D *E *F *G *Y *I *K *L *M *N *O *P *H *R *S *T *U ts *W *C *Q *Z tf pp ul rn *a *b *x *d *e *f *g *y *i *k *l *m *n *o *p *h *r *s *t *u *w *c *q *z or ap fm <= fr if fn ab <- ua -> da de >= mu pt pd bu di != == ~~ el av ah CR af If Rf ws Ox O+ O- es ca cu sp ip !b sb ib mo !m an gr tm sr c. no l& l| lz b< RG CO TM LT br LX LB lc lx lf lt lk lb bv b> is RT RX RB rc rx rf rt rk rb ~= ru '' `` dg dd en \- em bx ob ci sq Sl L1 LA LV LH lh rh lH rH PC DG tu Tu 9base-6/troff/font/devutf/KR0000644000175000017500000000533111402154555015372 0ustar anselmanselmname KR fontname Bookman-Light named in prologue spacewidth 32 charset ! 30 2 33 " 38 2 34 dq " # 60 2 35 $ 62 2 36 % 90 2 37 & 80 2 38 ' 22 2 39 ( 30 3 40 ) 30 3 41 * 44 2 42 + 60 0 43 , 32 1 44 - 40 0 173 . 32 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 32 0 58 ; 32 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 54 2 63 @ 82 2 64 A 68 2 65 B 74 2 66 C 74 2 67 D 80 2 68 E 72 2 69 F 64 2 70 G 80 2 71 H 80 2 72 I 34 2 73 J 60 2 74 K 72 2 75 L 60 2 76 M 92 2 77 N 74 2 78 O 80 2 79 P 62 2 80 Q 82 3 81 R 72 2 82 S 66 2 83 T 62 2 84 U 78 2 85 V 70 2 86 W 96 2 87 X 72 2 88 Y 64 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 ^ 42 2 147 --- 60 2 94 --- 50 1 95 ` 22 2 96 a 58 0 97 b 62 2 98 c 52 0 99 d 62 2 100 e 52 0 101 f 32 2 102 g 54 3 103 h 66 2 104 i 30 2 105 j 30 3 106 k 62 2 107 l 30 2 108 m 94 0 109 n 66 0 110 o 56 0 111 p 62 1 112 q 58 1 113 r 44 0 114 s 52 0 115 t 38 2 116 u 68 0 117 v 52 0 118 w 78 0 119 x 56 0 120 y 54 1 121 z 48 0 122 { 28 3 123 --- 60 2 124 } 28 3 125 ~ 44 2 148 --- 60 0 126 \` 34 2 145 ga " !! 30 1 161 ¡ " c| 62 2 162 ct " ¢ " L- 62 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 62 2 165 ¥ " yn " || 60 2 166 ¦ " so 52 3 167 sc " § " "" 42 2 168 ¨ " :a " co 74 2 169 © " a_ 42 2 170 ª " << 36 0 171 « " -, 60 0 172 hy 40 0 173 -- 60 0 45 ­ " ro 74 2 174 rg " ® " -^ 44 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 0 177 ± " 2^ 37 2 178 ² " 3^ 37 2 179 ³ " \' 34 2 180 aa " ´ " /u 68 1 181 µ " P! 60 2 182 pg " ¶ " .^ 32 0 183 · " ,, 32 1 184 ¸ " ,a " 1^ 37 2 185 ¹ " o_ 42 2 186 º " >> 36 0 187 » " 14 93 2 188 ¼ " 12 93 2 189 ½ " 34 93 2 190 ¾ " ?? 54 1 191 ¿ " A` 68 2 192 À " A' 68 2 193 Á " A^ 68 2 194  " A~ 68 2 195 à " A" 68 2 196 Ä " A* 68 2 197 Å " AE 126 2 198 Æ " C, 74 3 199 Ç " E` 72 2 200 È " E' 72 2 201 É " E^ 72 2 202 Ê " E" 72 2 203 Ë " I` 34 2 204 Ì " I' 34 2 205 Í " I^ 34 2 206 Î " I" 34 2 207 Ï " D- 80 2 208 Ð " N~ 74 2 209 Ñ " O` 80 2 210 Ò " O' 80 2 211 Ó " O^ 80 2 212 Ô " O~ 80 2 213 Õ " O" 80 2 214 Ö " xx 60 0 215 × " O/ 80 2 216 Ø " U` 78 2 217 Ù " U' 78 2 218 Ú " U^ 78 2 219 Û " U" 78 2 220 Ü " Y' 64 2 221 Ý " TH 62 2 222 Þ " ss 66 2 223 ß " a` 58 2 224 à " a' 58 2 225 á " a^ 58 2 226 â " a~ 58 2 227 ã " a" 58 2 228 ä " a* 58 2 229 å " ae 86 0 230 æ " c, 52 1 231 ç " e` 52 2 232 è " e' 52 2 233 é " e^ 52 2 234 ê " e" 52 2 235 ë " i` 30 2 236 ì " i' 30 2 237 í " i^ 30 2 238 î " i" 30 2 239 ï " d- 56 2 240 ð " n~ 66 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 60 0 247 ÷ " o/ 56 0 248 ø " u` 68 2 249 ù " u' 68 2 250 ú " u^ 68 2 251 û " u" 68 2 252 ü " y' 54 3 253 ý " th 62 3 254 þ " y" 54 3 255 ÿ " 9base-6/troff/font/devutf/SyntaxI0000644000175000017500000000200311402154555016446 0ustar anselmanselmname SyntaxI fontname Syntax-Italic spacewidth 28 charset ! 33 0 33 " 56 0 34 # 56 0 35 $ 56 0 36 % 100 0 37 & 72 0 38 ' 28 0 39 ( 33 0 40 ) 33 0 41 * 56 0 42 + 60 0 43 , 28 0 44 - 39 0 45 . 28 0 46 / 44 0 47 0 56 0 48 1 56 0 49 2 56 0 50 3 56 0 51 4 56 0 52 5 56 0 53 6 56 0 54 7 56 0 55 8 56 0 56 9 56 0 57 : 28 0 58 ; 28 0 59 < 60 0 60 = 60 0 61 > 60 0 62 ? 50 0 63 @ 80 0 64 A 67 0 65 B 61 0 66 C 67 0 67 D 72 0 68 E 50 0 69 F 50 0 70 G 72 0 71 H 72 0 72 I 28 0 73 J 39 0 74 K 61 0 75 L 50 0 76 M 94 0 77 N 72 0 78 O 83 0 79 P 56 0 80 Q 83 0 81 R 61 0 82 S 50 0 83 T 56 0 84 U 72 0 85 V 67 0 86 W 100 0 87 X 61 0 88 Y 61 0 89 Z 56 0 90 [ 33 0 91 \ 44 0 92 ] 33 0 93 ^ 60 0 94 _ 50 0 95 ` 28 0 96 a 50 0 97 b 56 0 98 c 44 0 99 d 56 0 100 e 50 0 101 f 33 0 102 g 50 0 103 h 56 0 104 i 28 0 105 j 28 0 106 k 50 0 107 l 28 0 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 0 112 q 56 0 113 r 33 0 114 s 39 0 115 t 33 0 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 0 121 z 44 0 122 { 33 0 123 | 22 0 124 } 33 0 125 ~ 60 0 126 9base-6/troff/font/devutf/Helvetica-Narrow-Bold0000644000175000017500000000534011402154555021106 0ustar anselmanselmname Hb fontname Helvetica-Narrow-Bold named in prologue spacewidth 23 charset ! 27 2 33 " 39 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 59 2 38 ' 23 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 27 0 58 ; 27 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 50 2 63 @ 80 3 64 A 59 2 65 B 59 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 46 2 74 K 59 2 75 L 50 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 27 3 91 \ 23 2 92 bs " ] 27 3 93 ^ 27 2 147 --- 48 2 94 --- 46 1 95 ` 23 2 96 a 46 0 97 b 50 2 98 c 46 0 99 d 50 2 100 e 46 0 101 f 27 2 102 g 50 1 103 h 50 2 104 i 23 2 105 j 23 3 106 k 46 2 107 l 23 2 108 m 73 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 32 0 114 s 46 0 115 t 27 2 116 u 50 0 117 v 46 0 118 w 64 0 119 x 46 0 120 y 46 1 121 z 41 0 122 { 32 3 123 --- 23 3 124 } 32 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 ¡ " c| 46 3 162 ct " ¢ " L- 46 2 163 £ " ps " xo 46 2 164 ¤ " cr " Y- 46 2 165 ¥ " yn " || 23 3 166 ¦ " so 46 3 167 sc " § " "" 27 2 168 ¨ " :a " co 60 2 169 © " a_ 30 2 170 ª " << 46 0 171 « " -, 48 0 172 hy 27 0 173 -- 48 0 45 ­ " ro 60 2 174 rg " ® " -^ 27 2 175 -a " ¯ " 0^ 33 2 176 ° " +- 48 2 177 ± " 2^ 27 2 178 ² " 3^ 27 2 179 ³ " \' 27 2 180 aa " ´ " /u 50 1 181 µ " P! 46 3 182 pg " ¶ " .^ 23 0 183 · " ,, 27 1 184 ¸ " ,a " 1^ 27 2 185 ¹ " o_ 30 2 186 º " >> 46 0 187 » " 14 68 2 188 ¼ " 12 68 2 189 ½ " 34 68 2 190 ¾ " ?? 50 1 191 ¿ " A` 59 2 192 À " A' 59 2 193 Á " A^ 59 2 194  " A~ 59 2 195 à " A" 59 2 196 Ä " A* 59 2 197 Å " AE 82 2 198 Æ " C, 59 3 199 Ç " E` 55 2 200 È " E' 55 2 201 É " E^ 55 2 202 Ê " E" 55 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 59 2 208 Ð " N~ 59 2 209 Ñ " O` 64 2 210 Ò " O' 64 2 211 Ó " O^ 64 2 212 Ô " O~ 64 2 213 Õ " O" 64 2 214 Ö " xx 48 0 215 × " O/ 64 2 216 Ø " U` 59 2 217 Ù " U' 59 2 218 Ú " U^ 59 2 219 Û " U" 59 2 220 Ü " Y' 55 2 221 Ý " TH 55 2 222 Þ " ss 50 2 223 ß " a` 46 2 224 à " a' 46 2 225 á " a^ 46 2 226 â " a~ 46 2 227 ã " a" 46 2 228 ä " a* 46 2 229 å " ae 73 0 230 æ " c, 46 1 231 ç " e` 46 2 232 è " e' 46 2 233 é " e^ 46 2 234 ê " e" 46 2 235 ë " i` 23 2 236 ì " i' 23 2 237 í " i^ 23 2 238 î " i" 23 2 239 ï " d- 50 2 240 ð " n~ 50 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 48 0 247 ÷ " o/ 50 0 248 ø " u` 50 2 249 ù " u' 50 2 250 ú " u^ 50 2 251 û " u" 50 2 252 ü " y' 46 3 253 ý " th 50 3 254 þ " y" 46 3 255 ÿ " 9base-6/troff/font/devutf/DejaVuSansBold0000644000175000017500000007313011402154555017664 0ustar anselmanselmname DejaVuSansBold fontname DejaVuSansBold spacewidth 35 charset ! 46 2 33 0021 " 52 2 34 0022 dq " dq " # 84 2 35 0023 $ 70 3 36 0024 % 100 2 37 0025 & 87 2 38 0026 ( 46 3 40 0028 ) 46 3 41 0029 * 52 2 42 002a + 84 2 43 002b , 38 1 44 002c - 42 0 45 002d . 38 0 46 002e / 37 3 47 002f 0 70 2 48 0030 1 70 2 49 0031 2 70 2 50 0032 3 70 2 51 0033 4 70 2 52 0034 5 70 2 53 0035 6 70 2 54 0036 7 70 2 55 0037 8 70 2 56 0038 9 70 2 57 0039 : 40 0 58 003a ; 40 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 58 2 63 003f @ 100 3 64 0040 A 77 2 65 0041 B 76 2 66 0042 C 73 2 67 0043 D 83 2 68 0044 E 68 2 69 0045 F 68 2 70 0046 G 82 2 71 0047 H 84 2 72 0048 I 37 2 73 0049 J 37 3 74 004a K 77 2 75 004b L 64 2 76 004c M 100 2 77 004d N 84 2 78 004e O 85 2 79 004f P 73 2 80 0050 Q 85 3 81 0051 R 77 2 82 0052 S 72 2 83 0053 T 68 2 84 0054 U 81 2 85 0055 V 77 2 86 0056 W 110 2 87 0057 X 77 2 88 0058 Y 72 2 89 0059 Z 73 2 90 005a [ 46 3 91 005b \ 37 3 92 005c bs " ] 46 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 67 0 97 0061 b 72 2 98 0062 c 59 0 99 0063 d 72 2 100 0064 e 68 0 101 0065 f 44 2 102 0066 g 72 1 103 0067 h 71 2 104 0068 i 34 2 105 0069 j 34 3 106 006a k 67 2 107 006b l 34 2 108 006c m 104 0 109 006d n 71 0 110 006e o 69 0 111 006f p 72 1 112 0070 q 72 1 113 0071 r 49 0 114 0072 s 60 0 115 0073 t 48 2 116 0074 u 71 0 117 0075 v 65 0 118 0076 w 92 0 119 0077 x 65 0 120 0078 y 65 1 121 0079 z 58 0 122 007a { 71 3 123 007b | 37 3 124 007c } 71 3 125 007d ~ 84 0 126 007e   70 0 160 00a0 ¡ 46 2 161 00a1 ¢ 70 3 162 00a2 £ 70 2 163 00a3 ¤ 64 0 164 00a4 ¥ 70 2 165 00a5 ¦ 37 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 56 2 170 00aa « 65 0 171 00ab ¬ 84 0 172 00ac ­ 42 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 44 2 178 00b2 ³ 44 2 179 00b3 ´ 50 2 180 00b4 aa " µ 74 1 181 00b5 ¶ 64 3 182 00b6 · 38 0 183 00b7 ¸ 50 1 184 00b8 ¹ 44 2 185 00b9 º 56 2 186 00ba » 65 0 187 00bb ¼ 104 2 188 00bc ½ 104 2 189 00bd ¾ 104 2 190 00be ¿ 58 2 191 00bf À 77 2 192 00c0 Á 77 2 193 00c1  77 2 194 00c2 à 77 2 195 00c3 Ä 77 2 196 00c4 Å 77 2 197 00c5 Æ 108 2 198 00c6 Ç 73 3 199 00c7 È 68 2 200 00c8 É 68 2 201 00c9 Ê 68 2 202 00ca Ë 68 2 203 00cb Ì 37 2 204 00cc Í 37 2 205 00cd Î 37 2 206 00ce Ï 37 2 207 00cf Ð 84 2 208 00d0 Ñ 84 2 209 00d1 Ò 85 2 210 00d2 Ó 85 2 211 00d3 Ô 85 2 212 00d4 Õ 85 2 213 00d5 Ö 85 2 214 00d6 × 84 2 215 00d7 mu " Ø 85 2 216 00d8 Ù 81 2 217 00d9 Ú 81 2 218 00da Û 81 2 219 00db Ü 81 2 220 00dc Ý 72 2 221 00dd Þ 74 2 222 00de ß 72 2 223 00df à 67 2 224 00e0 á 67 2 225 00e1 â 67 2 226 00e2 ã 67 2 227 00e3 ä 67 2 228 00e4 å 67 2 229 00e5 æ 105 0 230 00e6 ç 59 1 231 00e7 è 68 2 232 00e8 é 68 2 233 00e9 ê 68 2 234 00ea ë 68 2 235 00eb ì 34 2 236 00ec í 34 2 237 00ed î 34 2 238 00ee ï 34 2 239 00ef ð 69 2 240 00f0 ñ 71 2 241 00f1 ò 69 2 242 00f2 ó 69 2 243 00f3 ô 69 2 244 00f4 õ 69 2 245 00f5 ö 69 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 69 0 248 00f8 ù 71 2 249 00f9 ú 71 2 250 00fa û 71 2 251 00fb ü 71 2 252 00fc ý 65 3 253 00fd þ 72 3 254 00fe ÿ 65 3 255 00ff ā 67 2 257 0101 Ă 77 2 258 0102 ă 67 2 259 0103 Ą 77 3 260 0104 ą 67 1 261 0105 Ć 73 2 262 0106 ć 59 2 263 0107 Ĉ 73 2 264 0108 ĉ 59 2 265 0109 Ċ 73 2 266 010a ċ 59 2 267 010b Č 73 2 268 010c č 59 2 269 010d Ď 83 2 270 010e ď 72 2 271 010f Đ 84 2 272 0110 đ 72 2 273 0111 Ē 68 2 274 0112 ē 68 2 275 0113 Ĕ 68 2 276 0114 ĕ 68 2 277 0115 Ė 68 2 278 0116 ė 68 2 279 0117 Ę 68 3 280 0118 ę 68 1 281 0119 Ě 68 2 282 011a ě 68 2 283 011b Ĝ 82 2 284 011c ĝ 72 3 285 011d Ğ 82 2 286 011e ğ 72 3 287 011f Ġ 82 2 288 0120 ġ 72 3 289 0121 Ģ 82 3 290 0122 ģ 72 3 291 0123 Ĥ 84 2 292 0124 ĥ 71 2 293 0125 Ħ 97 2 294 0126 ħ 79 2 295 0127 Ĩ 37 2 296 0128 ĩ 34 2 297 0129 Ī 37 2 298 012a ī 34 2 299 012b Ĭ 37 2 300 012c ĭ 34 2 301 012d Į 37 3 302 012e į 34 3 303 012f İ 37 2 304 0130 ı 34 0 305 0131 IJ 74 3 306 0132 ij 69 3 307 0133 Ĵ 37 3 308 0134 ĵ 34 3 309 0135 Ķ 77 3 310 0136 ķ 67 3 311 0137 ĸ 67 0 312 0138 Ĺ 64 2 313 0139 ĺ 34 2 314 013a Ļ 64 3 315 013b ļ 34 3 316 013c Ľ 64 2 317 013d ľ 48 2 318 013e Ŀ 64 2 319 013f ŀ 56 2 320 0140 Ł 64 2 321 0141 ł 37 2 322 0142 Ń 84 2 323 0143 ń 71 2 324 0144 Ņ 84 3 325 0145 ņ 71 1 326 0146 Ň 84 2 327 0147 ň 71 2 328 0148 ʼn 98 2 329 0149 Ŋ 84 3 330 014a ŋ 71 1 331 014b Ō 85 2 332 014c ō 69 2 333 014d Ŏ 85 2 334 014e ŏ 69 2 335 014f Ő 85 2 336 0150 ő 69 2 337 0151 Œ 117 2 338 0152 œ 109 0 339 0153 Ŕ 77 2 340 0154 ŕ 49 2 341 0155 Ŗ 77 3 342 0156 ŗ 49 1 343 0157 Ř 77 2 344 0158 ř 49 2 345 0159 Ś 72 2 346 015a ś 60 2 347 015b Ŝ 72 2 348 015c ŝ 60 2 349 015d Ş 72 3 350 015e ş 60 1 351 015f Š 72 2 352 0160 š 60 2 353 0161 Ţ 68 3 354 0162 ţ 48 3 355 0163 Ť 68 2 356 0164 ť 48 2 357 0165 Ŧ 68 2 358 0166 ŧ 48 2 359 0167 Ũ 81 2 360 0168 ũ 71 2 361 0169 Ū 81 2 362 016a ū 71 2 363 016b Ŭ 81 2 364 016c ŭ 71 2 365 016d Ů 81 2 366 016e ů 71 2 367 016f Ű 81 2 368 0170 ű 71 2 369 0171 Ų 81 3 370 0172 ų 71 1 371 0173 Ŵ 110 2 372 0174 ŵ 92 2 373 0175 Ŷ 72 2 374 0176 ŷ 65 3 375 0177 Ÿ 72 2 376 0178 Ź 73 2 377 0179 ź 58 2 378 017a Ż 73 2 379 017b ż 58 2 380 017c Ž 73 2 381 017d ž 58 2 382 017e ſ 44 2 383 017f ƀ 72 2 384 0180 Ɓ 81 2 385 0181 Ƃ 76 2 386 0182 ƃ 72 2 387 0183 Ƅ 76 2 388 0184 ƅ 72 2 389 0185 Ɔ 73 2 390 0186 Ƈ 73 2 391 0187 ƈ 59 2 392 0188 Ɖ 84 2 393 0189 Ɗ 88 2 394 018a Ƌ 76 2 395 018b ƌ 72 2 396 018c ƍ 69 1 397 018d Ǝ 68 2 398 018e Ə 85 2 399 018f Ɛ 70 2 400 0190 Ƒ 68 3 401 0191 ƒ 44 3 402 0192 Ɠ 82 2 403 0193 Ɣ 75 3 404 0194 ƕ 104 2 405 0195 Ɩ 44 2 406 0196 Ɨ 39 2 407 0197 Ƙ 77 2 408 0198 ƙ 67 2 409 0199 ƚ 36 2 410 019a ƛ 59 2 411 019b Ɯ 104 2 412 019c Ɲ 84 3 413 019d ƞ 71 1 414 019e Ɵ 85 2 415 019f Ơ 85 2 416 01a0 ơ 69 0 417 01a1 Ƣ 111 2 418 01a2 ƣ 96 1 419 01a3 Ƥ 78 2 420 01a4 ƥ 72 3 421 01a5 Ʀ 74 3 422 01a6 Ƨ 72 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 63 2 425 01a9 ƪ 55 3 426 01aa ƫ 48 3 427 01ab Ƭ 71 2 428 01ac ƭ 48 2 429 01ad Ʈ 68 3 430 01ae Ư 81 2 431 01af ư 71 0 432 01b0 Ʊ 77 2 433 01b1 Ʋ 81 2 434 01b2 Ƴ 72 2 435 01b3 ƴ 73 1 436 01b4 Ƶ 73 2 437 01b5 ƶ 58 0 438 01b6 Ʒ 77 2 439 01b7 Ƹ 77 2 440 01b8 ƹ 64 1 441 01b9 ƻ 70 2 443 01bb Ƽ 77 2 444 01bc ƽ 64 1 445 01bd ƾ 57 2 446 01be ǀ 37 3 448 01c0 ǁ 66 3 449 01c1 ǂ 54 3 450 01c2 ǃ 37 2 451 01c3 DŽ 156 2 452 01c4 Dž 141 2 453 01c5 dž 130 2 454 01c6 LJ 101 3 455 01c7 Lj 98 3 456 01c8 lj 69 3 457 01c9 NJ 121 3 458 01ca Nj 118 3 459 01cb nj 105 3 460 01cc Ǎ 77 2 461 01cd ǎ 67 2 462 01ce Ǐ 37 2 463 01cf ǐ 34 2 464 01d0 Ǒ 85 2 465 01d1 ǒ 69 2 466 01d2 Ǔ 81 2 467 01d3 ǔ 71 2 468 01d4 ǖ 71 2 470 01d6 Ǘ 81 2 471 01d7 ǘ 71 2 472 01d8 Ǚ 81 2 473 01d9 ǚ 71 2 474 01da Ǜ 81 2 475 01db ǜ 71 2 476 01dc ǝ 68 0 477 01dd ǟ 67 2 479 01df Ǣ 108 2 482 01e2 ǣ 105 2 483 01e3 Ǫ 85 3 490 01ea ǫ 69 1 491 01eb Ǭ 85 3 492 01ec ǭ 69 3 493 01ed DZ 156 2 497 01f1 Dz 141 2 498 01f2 dz 130 2 499 01f3 Ƕ 129 2 502 01f6 Ș 72 3 536 0218 ș 60 1 537 0219 Ț 68 3 538 021a ț 48 3 539 021b Ȥ 73 3 548 0224 ȥ 58 1 549 0225 ȫ 69 2 555 022b ȭ 69 2 557 022d Ȯ 85 2 558 022e ȯ 69 2 559 022f ȱ 69 2 561 0231 Ȳ 72 2 562 0232 ȳ 65 3 563 0233 ȷ 34 1 567 0237 ȸ 109 2 568 0238 ȹ 109 1 569 0239 Ⱥ 77 2 570 023a Ȼ 73 2 571 023b ȼ 59 0 572 023c Ƚ 64 2 573 023d Ⱦ 68 2 574 023e ȿ 60 1 575 023f ɀ 58 1 576 0240 Ɂ 78 2 577 0241 ɐ 67 0 592 0250 ɑ 72 0 593 0251 ɒ 72 0 594 0252 ɓ 72 2 595 0253 ɔ 59 0 596 0254 ɕ 59 1 597 0255 ɖ 79 3 598 0256 ɗ 79 2 599 0257 ɘ 68 0 600 0258 ə 68 0 601 0259 ɚ 88 0 602 025a ɛ 56 0 603 025b ɜ 54 0 604 025c ɝ 81 0 605 025d ɞ 68 0 606 025e ɟ 34 1 607 025f ɠ 79 3 608 0260 ɡ 72 1 609 0261 ɢ 63 0 610 0262 ɣ 73 1 611 0263 ɤ 64 1 612 0264 ɥ 71 1 613 0265 ɦ 71 2 614 0266 ɧ 71 3 615 0267 ɨ 55 2 616 0268 ɩ 44 0 617 0269 ɪ 55 0 618 026a ɫ 56 2 619 026b ɬ 69 2 620 026c ɭ 34 3 621 026d ɮ 84 3 622 026e ɯ 104 0 623 026f ɰ 104 1 624 0270 ɱ 104 1 625 0271 ɲ 71 1 626 0272 ɳ 79 1 627 0273 ɴ 64 0 628 0274 ɵ 69 0 629 0275 ɶ 91 0 630 0276 ɷ 68 0 631 0277 ɸ 77 3 632 0278 ɹ 54 0 633 0279 ɺ 54 2 634 027a ɻ 65 1 635 027b ɼ 49 1 636 027c ɽ 49 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 64 0 640 0280 ʁ 64 0 641 0281 ʂ 60 1 642 0282 ʃ 42 3 643 0283 ʄ 44 3 644 0284 ʅ 60 1 645 0285 ʆ 55 3 646 0286 ʇ 48 1 647 0287 ʈ 48 3 648 0288 ʉ 92 0 649 0289 ʊ 77 1 650 028a ʋ 67 0 651 028b ʌ 65 0 652 028c ʍ 92 0 653 028d ʎ 65 2 654 028e ʏ 72 0 655 028f ʐ 69 1 656 0290 ʑ 68 1 657 0291 ʒ 64 1 658 0292 ʓ 64 1 659 0293 ʔ 57 2 660 0294 ʕ 57 2 661 0295 ʖ 57 2 662 0296 ʗ 57 3 663 0297 ʘ 67 0 664 0298 ʙ 61 0 665 0299 ʚ 70 0 666 029a ʛ 68 2 667 029b ʜ 69 0 668 029c ʝ 34 3 669 029d ʞ 73 1 670 029e ʟ 54 0 671 029f ʠ 79 3 672 02a0 ʡ 57 2 673 02a1 ʢ 57 2 674 02a2 ʣ 116 2 675 02a3 ʤ 121 3 676 02a4 ʥ 115 3 677 02a5 ʦ 97 2 678 02a6 ʧ 77 3 679 02a7 ʨ 93 3 680 02a8 ʩ 103 3 681 02a9 ʪ 79 2 682 02aa ʫ 78 2 683 02ab ʬ 59 2 684 02ac ʭ 42 2 685 02ad ʮ 68 3 686 02ae ʯ 79 3 687 02af ʰ 46 2 688 02b0 ʱ 46 2 689 02b1 ʲ 22 2 690 02b2 ʳ 32 2 691 02b3 ʴ 32 2 692 02b4 ʵ 32 2 693 02b5 ʶ 41 2 694 02b6 ʷ 59 2 695 02b7 ʸ 42 2 696 02b8 ʻ 38 2 699 02bb ʼ 38 2 700 02bc ʾ 37 2 702 02be ʿ 37 2 703 02bf ˀ 33 2 704 02c0 ˁ 33 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 31 2 712 02c8 ˌ 31 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 37 0 722 02d2 ˓ 37 0 723 02d3 ˖ 50 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 35 0 734 02de ˠ 41 2 736 02e0 ˡ 22 2 737 02e1 ˢ 38 2 738 02e2 ˣ 41 2 739 02e3 ˤ 33 2 740 02e4 ˥ 50 2 741 02e5 ˦ 50 2 742 02e6 ˧ 50 2 743 02e7 ˨ 50 2 744 02e8 ˩ 50 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 0 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 30 2 884 0374 ͵ 30 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 44 2 900 0384 ΅ 50 2 901 0385 Ά 80 2 902 0386 · 38 0 903 0387 Έ 85 2 904 0388 Ή 101 2 905 0389 Ί 56 2 906 038a Ό 89 2 908 038c Ύ 98 2 910 038e Ώ 87 2 911 038f ΐ 39 2 912 0390 Α 77 2 913 0391 Β 76 2 914 0392 Γ 64 2 915 0393 Δ 77 2 916 0394 Ε 68 2 917 0395 Ζ 73 2 918 0396 Η 84 2 919 0397 Θ 85 2 920 0398 Ι 37 2 921 0399 Κ 77 2 922 039a Λ 77 2 923 039b Μ 100 2 924 039c Ν 84 2 925 039d Ξ 63 2 926 039e Ο 85 2 927 039f Π 84 2 928 03a0 Ρ 73 2 929 03a1 Σ 63 2 931 03a3 Τ 68 2 932 03a4 Υ 72 2 933 03a5 Φ 85 2 934 03a6 Χ 77 2 935 03a7 Ψ 79 2 936 03a8 Ω 77 2 937 03a9 Ϊ 37 2 938 03aa Ϋ 72 2 939 03ab ά 69 2 940 03ac έ 56 2 941 03ad ή 71 3 942 03ae ί 39 2 943 03af ΰ 61 2 944 03b0 α 69 0 945 03b1 β 67 3 946 03b2 γ 68 1 947 03b3 δ 69 2 948 03b4 ε 56 0 949 03b5 ζ 63 3 950 03b6 η 71 1 951 03b7 θ 67 2 952 03b8 ι 39 0 953 03b9 κ 71 0 954 03ba λ 63 2 955 03bb μ 74 1 956 03bc ν 68 0 957 03bd ξ 59 3 958 03be ο 69 0 959 03bf π 79 0 960 03c0 ρ 72 1 961 03c1 ς 59 1 962 03c2 σ 78 0 963 03c3 τ 58 0 964 03c4 υ 61 0 965 03c5 φ 78 1 966 03c6 χ 65 1 967 03c7 ψ 79 1 968 03c8 ω 84 0 969 03c9 ϊ 39 2 970 03ca ϋ 61 2 971 03cb ό 69 2 972 03cc ύ 61 2 973 03cd ώ 84 2 974 03ce ϐ 65 2 976 03d0 ϑ 66 2 977 03d1 ϒ 75 2 978 03d2 ϓ 98 2 979 03d3 ϔ 75 2 980 03d4 ϕ 80 3 981 03d5 ϖ 84 0 982 03d6 ϗ 74 1 983 03d7 Ϙ 85 3 984 03d8 ϙ 69 1 985 03d9 Ϛ 73 3 986 03da ϛ 59 1 987 03db Ϝ 68 2 988 03dc ϝ 49 3 989 03dd Ϟ 70 2 990 03de ϟ 66 2 991 03df Ϡ 92 3 992 03e0 ϡ 63 1 993 03e1 ϰ 74 0 1008 03f0 ϱ 72 1 1009 03f1 ϲ 59 0 1010 03f2 ϳ 34 3 1011 03f3 ϴ 85 2 1012 03f4 ϵ 64 0 1013 03f5 ϶ 64 0 1014 03f6 Ϸ 74 2 1015 03f7 ϸ 72 3 1016 03f8 Ϲ 73 2 1017 03f9 Ϻ 100 2 1018 03fa ϻ 73 1 1019 03fb ϼ 72 1 1020 03fc Ͻ 70 2 1021 03fd Ͼ 73 2 1022 03fe Ͽ 70 2 1023 03ff Ё 68 2 1025 0401 Ђ 88 3 1026 0402 Ѓ 64 2 1027 0403 Є 73 2 1028 0404 Ѕ 72 2 1029 0405 І 37 2 1030 0406 Ї 37 2 1031 0407 Ј 37 3 1032 0408 Љ 115 2 1033 0409 Њ 113 2 1034 040a Ћ 88 2 1035 040b Ќ 77 2 1036 040c Ѝ 84 2 1037 040d Ў 77 2 1038 040e Џ 84 3 1039 040f А 77 2 1040 0410 Б 76 2 1041 0411 В 76 2 1042 0412 Г 64 2 1043 0413 Д 95 3 1044 0414 Е 68 2 1045 0415 Ж 101 2 1046 0416 З 70 2 1047 0417 И 84 2 1048 0418 Й 84 2 1049 0419 К 77 2 1050 041a Л 83 2 1051 041b М 100 2 1052 041c Н 84 2 1053 041d О 85 2 1054 041e П 84 2 1055 041f Р 73 2 1056 0420 С 73 2 1057 0421 Т 68 2 1058 0422 У 77 2 1059 0423 Ф 85 2 1060 0424 Х 77 2 1061 0425 Ц 96 3 1062 0426 Ч 81 2 1063 0427 Ш 117 2 1064 0428 Щ 129 3 1065 0429 Ъ 94 2 1066 042a Ы 104 2 1067 042b Ь 76 2 1068 042c Э 73 2 1069 042d Ю 113 2 1070 042e Я 77 2 1071 042f а 67 0 1072 0430 б 69 2 1073 0431 в 61 0 1074 0432 г 52 0 1075 0433 д 82 1 1076 0434 е 68 0 1077 0435 ж 82 0 1078 0436 з 56 0 1079 0437 и 69 0 1080 0438 й 69 2 1081 0439 к 63 0 1082 043a л 69 0 1083 043b м 82 0 1084 043c н 69 0 1085 043d о 69 0 1086 043e п 69 0 1087 043f р 72 1 1088 0440 с 59 0 1089 0441 т 58 0 1090 0442 у 65 1 1091 0443 ф 92 3 1092 0444 х 65 0 1093 0445 ц 81 1 1094 0446 ч 69 0 1095 0447 ш 96 0 1096 0448 щ 107 1 1097 0449 ъ 75 0 1098 044a ы 86 0 1099 044b ь 61 0 1100 044c э 60 0 1101 044d ю 92 0 1102 044e я 64 0 1103 044f ѐ 68 2 1104 0450 ё 68 2 1105 0451 ђ 71 3 1106 0452 ѓ 52 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 34 2 1110 0456 ї 34 2 1111 0457 ј 34 3 1112 0458 љ 96 0 1113 0459 њ 96 0 1114 045a ћ 71 2 1115 045b ќ 63 2 1116 045c ѝ 69 2 1117 045d ў 65 3 1118 045e џ 69 1 1119 045f Ѥ 101 2 1124 0464 ѥ 84 0 1125 0465 Ҋ 96 3 1162 048a ҋ 81 3 1163 048b Ҍ 76 2 1164 048c ҍ 61 2 1165 048d Ґ 64 2 1168 0490 ґ 52 2 1169 0491 Ғ 64 2 1170 0492 ғ 52 0 1171 0493 Ҕ 81 3 1172 0494 ҕ 67 1 1173 0495 Җ 104 3 1174 0496 җ 87 1 1175 0497 Ҙ 70 3 1176 0498 ҙ 56 1 1177 0499 Қ 77 3 1178 049a қ 63 1 1179 049b Ҡ 97 2 1184 04a0 ҡ 78 0 1185 04a1 Ң 96 3 1186 04a2 ң 81 1 1187 04a3 Ҥ 110 2 1188 04a4 ҥ 87 0 1189 04a5 Ҧ 127 3 1190 04a6 ҧ 102 1 1191 04a7 Ҫ 73 3 1194 04aa ҫ 59 1 1195 04ab Ҭ 68 3 1196 04ac ҭ 58 1 1197 04ad Ү 72 2 1198 04ae ү 65 1 1199 04af Ұ 72 2 1200 04b0 ұ 65 1 1201 04b1 Ҳ 77 3 1202 04b2 ҳ 65 1 1203 04b3 Ҵ 111 3 1204 04b4 ҵ 100 1 1205 04b5 Ҷ 81 3 1206 04b6 ҷ 69 1 1207 04b7 Һ 81 2 1210 04ba һ 71 2 1211 04bb Ӏ 34 2 1216 04c0 Ӂ 101 2 1217 04c1 ӂ 82 2 1218 04c2 Ӆ 95 3 1221 04c5 ӆ 81 1 1222 04c6 Ӈ 84 3 1223 04c7 ӈ 69 1 1224 04c8 Ӊ 96 3 1225 04c9 ӊ 81 1 1226 04ca Ӌ 81 3 1227 04cb ӌ 69 1 1228 04cc Ӎ 111 3 1229 04cd ӎ 93 1 1230 04ce Ӑ 77 2 1232 04d0 ӑ 67 2 1233 04d1 Ӓ 77 2 1234 04d2 ӓ 67 2 1235 04d3 Ӕ 108 2 1236 04d4 ӕ 105 0 1237 04d5 Ӗ 68 2 1238 04d6 ӗ 68 2 1239 04d7 Ә 85 2 1240 04d8 ә 68 0 1241 04d9 Ӛ 85 2 1242 04da ӛ 68 2 1243 04db Ӝ 101 2 1244 04dc ӝ 82 2 1245 04dd Ӟ 70 2 1246 04de ӟ 56 2 1247 04df Ӡ 77 2 1248 04e0 ӡ 64 1 1249 04e1 Ӣ 84 2 1250 04e2 ӣ 69 2 1251 04e3 Ӥ 84 2 1252 04e4 ӥ 69 2 1253 04e5 Ӧ 85 2 1254 04e6 ӧ 69 2 1255 04e7 Ө 85 2 1256 04e8 ө 69 0 1257 04e9 Ӫ 85 2 1258 04ea ӫ 69 2 1259 04eb Ӭ 73 2 1260 04ec ӭ 60 2 1261 04ed Ӯ 77 2 1262 04ee ӯ 65 3 1263 04ef Ӱ 77 2 1264 04f0 ӱ 65 3 1265 04f1 Ӳ 77 2 1266 04f2 ӳ 65 3 1267 04f3 Ӵ 81 2 1268 04f4 ӵ 69 2 1269 04f5 Ӷ 64 3 1270 04f6 ӷ 52 1 1271 04f7 Ӹ 104 2 1272 04f8 ӹ 86 2 1273 04f9 Ա 98 2 1329 0531 Բ 81 2 1330 0532 Գ 98 2 1331 0533 Դ 98 2 1332 0534 Ե 81 2 1333 0535 Զ 78 3 1334 0536 Է 81 3 1335 0537 Ը 81 3 1336 0538 Թ 97 2 1337 0539 Ժ 98 2 1338 053a Ի 81 2 1339 053b Լ 71 3 1340 053c Խ 108 2 1341 053d Ծ 114 2 1342 053e Կ 81 2 1343 053f Հ 71 3 1344 0540 Ձ 76 2 1345 0541 Ղ 98 3 1346 0542 Ճ 88 2 1347 0543 Մ 98 2 1348 0544 Յ 79 2 1349 0545 Ն 98 2 1350 0546 Շ 81 2 1351 0547 Ո 81 2 1352 0548 Չ 81 3 1353 0549 Պ 96 2 1354 054a Ջ 78 3 1355 054b Ռ 98 2 1356 054c Ս 81 2 1357 054d Վ 98 3 1358 054e Տ 72 2 1359 054f Ր 81 2 1360 0550 Ց 79 2 1361 0551 Ւ 89 2 1362 0552 Փ 85 2 1363 0553 Ք 94 2 1364 0554 Օ 85 2 1365 0555 Ֆ 72 2 1366 0556 ՙ 37 2 1369 0559 ՚ 38 2 1370 055a ՛ 55 2 1371 055b ՜ 55 2 1372 055c ՝ 38 2 1373 055d ՞ 55 2 1374 055e ՟ 52 2 1375 055f ա 104 0 1377 0561 բ 71 1 1378 0562 գ 82 1 1379 0563 դ 82 1 1380 0564 զ 82 1 1382 0566 է 65 3 1383 0567 ը 71 1 1384 0568 թ 81 1 1385 0569 ժ 82 2 1386 056a ի 71 3 1387 056b լ 50 1 1388 056c խ 104 3 1389 056d ծ 72 2 1390 056e կ 71 3 1391 056f հ 71 2 1392 0570 ձ 72 2 1393 0571 ղ 82 1 1394 0572 ճ 71 2 1395 0573 մ 75 2 1396 0574 յ 34 1 1397 0575 ն 88 2 1398 0576 շ 56 1 1399 0577 ո 71 0 1400 0578 չ 56 1 1401 0579 պ 104 1 1402 057a ջ 56 1 1403 057b ռ 71 0 1404 057c ս 71 0 1405 057d վ 81 3 1406 057e տ 104 0 1407 057f ր 71 1 1408 0580 ց 72 1 1409 0581 ւ 50 0 1410 0582 փ 104 3 1411 0583 ք 78 1 1412 0584 օ 69 0 1413 0585 ֆ 72 3 1414 0586 և 86 2 1415 0587 ։ 40 0 1417 0589 ֊ 54 0 1418 058a ᴂ 105 0 7426 1d02 ᴈ 56 0 7432 1d08 ᴉ 34 1 7433 1d09 ᴔ 109 0 7444 1d14 ᴖ 61 0 7446 1d16 ᴗ 61 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 69 1 7455 1d1f ᵃ 46 2 7491 1d43 ᵄ 46 2 7492 1d44 ᵅ 48 2 7493 1d45 ᵆ 71 2 7494 1d46 ᵇ 48 2 7495 1d47 ᵈ 48 2 7496 1d48 ᵉ 48 2 7497 1d49 ᵊ 48 2 7498 1d4a ᵋ 39 2 7499 1d4b ᵌ 39 2 7500 1d4c ᵍ 48 2 7501 1d4d ᵎ 22 2 7502 1d4e ᵏ 49 2 7503 1d4f ᵐ 66 2 7504 1d50 ᵑ 46 2 7505 1d51 ᵒ 49 2 7506 1d52 ᵓ 41 2 7507 1d53 ᵔ 49 2 7508 1d54 ᵕ 49 0 7509 1d55 ᵖ 48 2 7510 1d56 ᵗ 39 2 7511 1d57 ᵘ 46 2 7512 1d58 ᵙ 46 2 7513 1d59 ᵚ 66 2 7514 1d5a ᵛ 50 2 7515 1d5b ᵷ 72 1 7543 1d77 ᵻ 55 0 7547 1d7b ᶅ 51 3 7557 1d85 ᶛ 48 2 7579 1d9b ᶜ 41 2 7580 1d9c ᶝ 41 2 7581 1d9d ᶞ 49 2 7582 1d9e ᶟ 39 2 7583 1d9f ᶠ 38 2 7584 1da0 ᶡ 35 2 7585 1da1 ᶢ 48 2 7586 1da2 ᶣ 46 2 7587 1da3 ᶤ 35 2 7588 1da4 ᶥ 28 2 7589 1da5 ᶦ 35 2 7590 1da6 ᶧ 35 2 7591 1da7 ᶨ 43 2 7592 1da8 ᶩ 33 2 7593 1da9 ᶪ 33 2 7594 1daa ᶫ 37 2 7595 1dab ᶬ 66 2 7596 1dac ᶭ 66 2 7597 1dad ᶮ 56 2 7598 1dae ᶯ 56 2 7599 1daf ᶰ 45 2 7600 1db0 ᶱ 49 2 7601 1db1 ᶲ 54 2 7602 1db2 ᶳ 42 2 7603 1db3 ᶴ 40 2 7604 1db4 ᶵ 39 2 7605 1db5 ᶶ 58 2 7606 1db6 ᶷ 49 2 7607 1db7 ᶹ 45 2 7609 1db9 ᶺ 50 2 7610 1dba ᶻ 42 2 7611 1dbb ᶼ 52 2 7612 1dbc ᶽ 47 2 7613 1dbd ᶾ 46 2 7614 1dbe ᶿ 43 2 7615 1dbf Ḍ 83 3 7692 1e0c ḍ 72 3 7693 1e0d Ḓ 83 3 7698 1e12 ḓ 72 3 7699 1e13 Ḥ 84 3 7716 1e24 ḥ 71 3 7717 1e25 Ḷ 64 3 7734 1e36 ḷ 34 3 7735 1e37 Ḹ 64 3 7736 1e38 ḹ 34 3 7737 1e39 Ḽ 64 3 7740 1e3c ḽ 34 3 7741 1e3d ṁ 104 2 7745 1e41 Ṃ 100 3 7746 1e42 ṃ 104 1 7747 1e43 Ṅ 84 2 7748 1e44 ṅ 71 2 7749 1e45 Ṇ 84 3 7750 1e46 ṇ 71 1 7751 1e47 Ṋ 84 3 7754 1e4a ṋ 71 1 7755 1e4b ṗ 72 3 7767 1e57 Ṛ 77 3 7770 1e5a ṛ 49 1 7771 1e5b Ṝ 77 3 7772 1e5c ṝ 49 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 72 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 68 3 7788 1e6c ṭ 48 3 7789 1e6d Ṱ 68 3 7792 1e70 ṱ 48 3 7793 1e71 Ṿ 77 3 7806 1e7e ṿ 65 1 7807 1e7f Ẁ 110 2 7808 1e80 ẁ 92 2 7809 1e81 Ẃ 110 2 7810 1e82 ẃ 92 2 7811 1e83 Ẅ 110 2 7812 1e84 ẅ 92 2 7813 1e85 Ẹ 68 3 7864 1eb8 ẹ 68 1 7865 1eb9 Ị 37 3 7882 1eca ị 34 3 7883 1ecb Ọ 85 3 7884 1ecc ọ 69 1 7885 1ecd Ụ 81 3 7908 1ee4 ụ 71 1 7909 1ee5 Ỳ 72 2 7922 1ef2 ỳ 65 3 7923 1ef3 ἁ 69 2 7937 1f01 ἂ 69 2 7938 1f02 ἃ 69 2 7939 1f03 ἄ 69 2 7940 1f04 ἅ 69 2 7941 1f05 ἆ 69 2 7942 1f06 ἇ 69 2 7943 1f07 Ἀ 77 2 7944 1f08 Ἁ 77 2 7945 1f09 Ἂ 104 2 7946 1f0a Ἃ 104 2 7947 1f0b Ἄ 94 2 7948 1f0c Ἅ 96 2 7949 1f0d Ἆ 84 2 7950 1f0e Ἇ 86 2 7951 1f0f ἐ 56 2 7952 1f10 ἑ 56 2 7953 1f11 ἒ 56 2 7954 1f12 ἓ 56 2 7955 1f13 ἔ 56 2 7956 1f14 ἕ 56 2 7957 1f15 Ἐ 79 2 7960 1f18 Ἑ 79 2 7961 1f19 Ἒ 110 2 7962 1f1a Ἓ 110 2 7963 1f1b Ἔ 102 2 7964 1f1c Ἕ 105 2 7965 1f1d ἠ 71 3 7968 1f20 ἡ 71 3 7969 1f21 ἢ 71 3 7970 1f22 ἣ 71 3 7971 1f23 ἤ 71 3 7972 1f24 ἥ 71 3 7973 1f25 ἦ 71 3 7974 1f26 ἧ 71 3 7975 1f27 Ἠ 95 2 7976 1f28 Ἡ 95 2 7977 1f29 Ἢ 125 2 7978 1f2a Ἣ 125 2 7979 1f2b Ἤ 118 2 7980 1f2c Ἥ 121 2 7981 1f2d Ἦ 105 2 7982 1f2e Ἧ 106 2 7983 1f2f ἰ 39 2 7984 1f30 ἱ 39 2 7985 1f31 ἲ 39 2 7986 1f32 ἳ 39 2 7987 1f33 ἴ 39 2 7988 1f34 ἵ 39 2 7989 1f35 ἶ 39 2 7990 1f36 ἷ 39 2 7991 1f37 Ἰ 48 2 7992 1f38 Ἱ 49 2 7993 1f39 Ἲ 78 2 7994 1f3a Ἳ 79 2 7995 1f3b Ἴ 71 2 7996 1f3c Ἵ 74 2 7997 1f3d Ἶ 60 2 7998 1f3e Ἷ 60 2 7999 1f3f ὀ 69 2 8000 1f40 ὁ 69 2 8001 1f41 ὂ 69 2 8002 1f42 ὃ 69 2 8003 1f43 ὄ 69 2 8004 1f44 ὅ 69 2 8005 1f45 Ὀ 89 2 8008 1f48 Ὁ 93 2 8009 1f49 Ὂ 122 2 8010 1f4a Ὃ 122 2 8011 1f4b Ὄ 105 2 8012 1f4c Ὅ 108 2 8013 1f4d ὐ 61 2 8016 1f50 ὑ 61 2 8017 1f51 ὒ 61 2 8018 1f52 ὓ 61 2 8019 1f53 ὔ 61 2 8020 1f54 ὕ 61 2 8021 1f55 ὖ 61 2 8022 1f56 ὗ 61 2 8023 1f57 Ὑ 93 2 8025 1f59 Ὓ 118 2 8027 1f5b Ὕ 120 2 8029 1f5d Ὗ 105 2 8031 1f5f ὠ 84 2 8032 1f60 ὡ 84 2 8033 1f61 ὢ 84 2 8034 1f62 ὣ 84 2 8035 1f63 ὤ 84 2 8036 1f64 ὥ 84 2 8037 1f65 ὦ 84 2 8038 1f66 ὧ 84 2 8039 1f67 Ὠ 83 2 8040 1f68 Ὡ 88 2 8041 1f69 Ὢ 117 2 8042 1f6a Ὣ 117 2 8043 1f6b Ὤ 99 2 8044 1f6c Ὥ 102 2 8045 1f6d Ὦ 95 2 8046 1f6e Ὧ 99 2 8047 1f6f ὰ 69 2 8048 1f70 ά 69 2 8049 1f71 ὲ 56 2 8050 1f72 έ 56 2 8051 1f73 ὴ 71 3 8052 1f74 ή 71 3 8053 1f75 ὶ 39 2 8054 1f76 ί 39 2 8055 1f77 ὸ 69 2 8056 1f78 ό 69 2 8057 1f79 ὺ 61 2 8058 1f7a ύ 61 2 8059 1f7b ὼ 84 2 8060 1f7c ώ 84 2 8061 1f7d ᾀ 69 3 8064 1f80 ᾁ 69 3 8065 1f81 ᾂ 69 3 8066 1f82 ᾃ 69 3 8067 1f83 ᾄ 69 3 8068 1f84 ᾅ 69 3 8069 1f85 ᾆ 69 3 8070 1f86 ᾇ 69 3 8071 1f87 ᾈ 77 3 8072 1f88 ᾉ 77 3 8073 1f89 ᾊ 104 3 8074 1f8a ᾋ 104 3 8075 1f8b ᾌ 94 3 8076 1f8c ᾍ 96 3 8077 1f8d ᾎ 84 3 8078 1f8e ᾏ 86 3 8079 1f8f ᾐ 71 3 8080 1f90 ᾑ 71 3 8081 1f91 ᾒ 71 3 8082 1f92 ᾓ 71 3 8083 1f93 ᾔ 71 3 8084 1f94 ᾕ 71 3 8085 1f95 ᾖ 71 3 8086 1f96 ᾗ 71 3 8087 1f97 ᾘ 95 3 8088 1f98 ᾙ 95 3 8089 1f99 ᾚ 125 3 8090 1f9a ᾛ 125 3 8091 1f9b ᾜ 118 3 8092 1f9c ᾝ 121 3 8093 1f9d ᾞ 105 3 8094 1f9e ᾟ 106 3 8095 1f9f ᾠ 84 3 8096 1fa0 ᾡ 84 3 8097 1fa1 ᾢ 84 3 8098 1fa2 ᾣ 84 3 8099 1fa3 ᾤ 84 3 8100 1fa4 ᾥ 84 3 8101 1fa5 ᾦ 84 3 8102 1fa6 ᾧ 84 3 8103 1fa7 ᾨ 83 3 8104 1fa8 ᾩ 88 3 8105 1fa9 ᾪ 117 3 8106 1faa ᾫ 117 3 8107 1fab ᾬ 99 3 8108 1fac ᾭ 102 3 8109 1fad ᾮ 95 3 8110 1fae ᾯ 99 3 8111 1faf ᾰ 69 2 8112 1fb0 ᾱ 69 2 8113 1fb1 ᾲ 69 3 8114 1fb2 ᾳ 69 1 8115 1fb3 ᾴ 69 3 8116 1fb4 ᾶ 69 2 8118 1fb6 ᾷ 69 3 8119 1fb7 Ᾰ 77 2 8120 1fb8 Ᾱ 77 2 8121 1fb9 Ὰ 88 2 8122 1fba Ά 80 2 8123 1fbb ᾼ 77 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 71 3 8130 1fc2 ῃ 71 1 8131 1fc3 ῄ 71 3 8132 1fc4 ῆ 71 3 8134 1fc6 ῇ 71 3 8135 1fc7 Ὲ 93 2 8136 1fc8 Έ 85 2 8137 1fc9 Ὴ 108 2 8138 1fca Ή 101 2 8139 1fcb ῌ 84 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 39 2 8144 1fd0 ῑ 39 2 8145 1fd1 ῒ 39 2 8146 1fd2 ΐ 39 2 8147 1fd3 ῖ 39 2 8150 1fd6 ῗ 39 2 8151 1fd7 Ῐ 37 2 8152 1fd8 Ῑ 37 2 8153 1fd9 Ὶ 62 2 8154 1fda Ί 56 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 61 2 8160 1fe0 ῡ 61 2 8161 1fe1 ῢ 61 2 8162 1fe2 ΰ 61 2 8163 1fe3 ῤ 72 3 8164 1fe4 ῥ 72 3 8165 1fe5 ῦ 61 2 8166 1fe6 ῧ 61 2 8167 1fe7 Ῠ 72 2 8168 1fe8 Ῡ 72 2 8169 1fe9 Ὺ 102 2 8170 1fea Ύ 98 2 8171 1feb Ῥ 84 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 84 3 8178 1ff2 ῳ 84 1 8179 1ff3 ῴ 84 3 8180 1ff4 ῶ 84 2 8182 1ff6 ῷ 84 3 8183 1ff7 Ὸ 106 2 8184 1ff8 Ό 89 2 8185 1ff9 Ὼ 100 2 8186 1ffa Ώ 87 2 8187 1ffb ῼ 77 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 42 0 8208 2010 ‑ 42 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 38 2 8216 2018 ` " ‘ " ’ 38 2 8217 2019 ' " ’ " ‚ 38 1 8218 201a ‛ 38 2 8219 201b “ 66 2 8220 201c ” 66 2 8221 201d „ 66 1 8222 201e ‟ 66 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 64 0 8226 2022 ‣ 64 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‰ 144 2 8240 2030 ‱ 189 2 8241 2031 ‹ 41 0 8249 2039 › 41 0 8250 203a ‼ 63 2 8252 203c ‽ 58 2 8253 203d ‾ 50 2 8254 203e ⁇ 103 2 8263 2047 ⁈ 83 2 8264 2048 ⁉ 83 2 8265 2049 ⁰ 44 2 8304 2070 ⁴ 44 2 8308 2074 ⁵ 44 2 8309 2075 ⁶ 44 2 8310 2076 ⁷ 44 2 8311 2077 ⁸ 44 2 8312 2078 ⁹ 44 2 8313 2079 ⁿ 46 2 8319 207f ₦ 84 2 8358 20a6 € 70 2 8364 20ac ₵ 70 3 8373 20b5 ℃ 121 2 8451 2103 № 135 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 77 2 8486 2126 ℧ 77 2 8487 2127 K 77 2 8490 212a Å 77 2 8491 212b Ⅎ 68 2 8498 2132 ⅋ 87 2 8523 214b Ⅰ 37 2 8544 2160 Ⅱ 66 2 8545 2161 Ⅲ 95 2 8546 2162 Ⅳ 110 2 8547 2163 Ⅴ 77 2 8548 2164 Ⅵ 110 2 8549 2165 Ⅶ 139 2 8550 2166 Ⅷ 167 2 8551 2167 Ⅸ 112 2 8552 2168 Ⅹ 77 2 8553 2169 Ⅺ 112 2 8554 216a Ⅻ 141 2 8555 216b Ⅼ 64 2 8556 216c Ⅽ 73 2 8557 216d Ⅾ 83 2 8558 216e Ⅿ 100 2 8559 216f ⅰ 34 2 8560 2170 ⅱ 61 2 8561 2171 ⅲ 87 2 8562 2172 ⅳ 98 2 8563 2173 ⅴ 65 0 8564 2174 ⅵ 96 2 8565 2175 ⅶ 123 2 8566 2176 ⅷ 149 2 8567 2177 ⅸ 97 2 8568 2178 ⅹ 65 0 8569 2179 ⅺ 97 2 8570 217a ⅻ 123 2 8571 217b ⅼ 34 2 8572 217c ⅽ 59 0 8573 217d ⅾ 72 2 8574 217e ⅿ 104 0 8575 217f ↀ 129 2 8576 2180 Ↄ 73 2 8579 2183 ∂ 54 2 8706 2202 pd " ∃ 68 2 8707 2203 te " ∆ 70 2 8710 2206 ∇ 70 2 8711 2207 gr " ∊ 79 0 8714 220a ∍ 79 0 8717 220d st " ∏ 79 3 8719 220f ∐ 79 3 8720 2210 ∑ 72 3 8721 2211 − 84 0 8722 2212 ∓ 84 2 8723 2213 ∕ 17 2 8725 2215 ∗ 63 0 8727 2217 ** " ∘ 63 0 8728 2218 ∙ 38 0 8729 2219 bu " √ 67 2 8730 221a sr " ∝ 67 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 81 0 8743 2227 l∧ 81 0 8743 2227 " ∨ 81 0 8744 2228 l| " ∩ 81 0 8745 2229 ca " ∪ 81 0 8746 222a cu " ∫ 61 3 8747 222b is " ∬ 100 3 8748 222c ∭ 139 3 8749 222d ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≣ 84 3 8803 2263 ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 72 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 54 2 8977 2311 ⌘ 93 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 61 3 8992 2320 ⌡ 61 3 8993 2321 ⌥ 100 2 8997 2325 〈 46 3 9001 2329 〉 46 3 9002 232a ⍽ 86 1 9085 237d ⎮ 61 3 9134 23ae ⏏ 77 0 9167 23cf ␢ 72 2 9250 2422 ␣ 72 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 64 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 64 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⚀ 87 2 9856 2680 ⚁ 87 2 9857 2681 ⚂ 87 2 9858 2682 ⚃ 87 2 9859 2683 ⚄ 87 2 9860 2684 ⚅ 87 2 9861 2685 ⟠ 49 3 10208 27e0 ⟨ 46 3 10216 27e8 ⟩ 46 3 10217 27e9 ⟪ 72 3 10218 27ea ⟫ 72 3 10219 27eb ⧫ 49 3 10731 29eb ⨌ 178 3 10764 2a0c ⨍ 61 3 10765 2a0d ⨎ 61 3 10766 2a0e ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 74 2 64257 fb01 fl 74 2 64258 fb02 ffi 112 2 64259 fb03 ffl 112 2 64260 fb04 ﬓ 139 2 64275 fb13 ﬔ 138 2 64276 fb14 ﬕ 138 3 64277 fb15 ﬖ 138 3 64278 fb16 ﬗ 171 3 64279 fb17 � 111 3 65533 fffd 9base-6/troff/font/devutf/DejaVuSerifBoldOblique0000644000175000017500000006225311402154555021355 0ustar anselmanselmname DejaVuSerifBoldOblique fontname DejaVuSerifBoldOblique spacewidth 35 charset ! 44 2 33 0021 " 52 2 34 0022 dq " dq " # 84 2 35 0023 $ 70 3 36 0024 % 95 2 37 0025 & 90 2 38 0026 ( 47 3 40 0028 ) 47 3 41 0029 * 52 2 42 002a + 84 2 43 002b , 35 1 44 002c - 42 0 45 002d . 35 0 46 002e / 37 3 47 002f 0 70 2 48 0030 1 70 2 49 0031 2 70 2 50 0032 3 70 2 51 0033 4 70 2 52 0034 5 70 2 53 0035 6 70 2 54 0036 7 70 2 55 0037 8 70 2 56 0038 9 70 2 57 0039 : 37 0 58 003a ; 37 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 59 2 63 003f @ 100 3 64 0040 A 78 2 65 0041 B 85 2 66 0042 C 80 2 67 0043 D 87 2 68 0044 E 76 2 69 0045 F 71 2 70 0046 G 85 2 71 0047 H 94 2 72 0048 I 47 2 73 0049 J 47 3 74 004a K 87 2 75 004b L 70 2 76 004c M 111 2 77 004d N 91 2 78 004e O 87 2 79 004f P 75 2 80 0050 Q 87 3 81 0051 R 83 2 82 0052 S 72 2 83 0053 T 74 2 84 0054 U 87 2 85 0055 V 78 2 86 0056 W 112 2 87 0057 X 78 2 88 0058 Y 71 2 89 0059 Z 73 2 90 005a [ 47 3 91 005b \ 37 3 92 005c bs " ] 47 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 65 0 97 0061 b 70 2 98 0062 c 61 0 99 0063 d 70 2 100 0064 e 64 0 101 0065 f 43 3 102 0066 g 70 1 103 0067 h 73 2 104 0068 i 38 2 105 0069 j 36 3 106 006a k 69 2 107 006b l 38 2 108 006c m 106 0 109 006d n 73 0 110 006e o 67 0 111 006f p 70 1 112 0070 q 70 1 113 0071 r 53 0 114 0072 s 56 0 115 0073 t 46 2 116 0074 u 73 0 117 0075 v 58 0 118 0076 w 86 0 119 0077 x 60 0 120 0078 y 58 1 121 0079 z 57 0 122 007a { 64 3 123 007b | 36 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   70 0 160 00a0 ¡ 44 2 161 00a1 ¢ 70 3 162 00a2 £ 70 2 163 00a3 ¤ 64 0 164 00a4 ¥ 70 2 165 00a5 ¦ 36 3 166 00a6 § 52 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 49 2 170 00aa « 63 0 171 00ab ¬ 84 0 172 00ac ­ 42 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 44 2 178 00b2 ³ 44 2 179 00b3 ´ 50 2 180 00b4 aa " µ 73 1 181 00b5 ¶ 64 3 182 00b6 · 35 0 183 00b7 ¸ 50 1 184 00b8 ¹ 44 2 185 00b9 º 50 2 186 00ba » 63 0 187 00bb ¼ 104 2 188 00bc ½ 104 2 189 00bd ¾ 104 2 190 00be ¿ 59 2 191 00bf À 78 2 192 00c0 Á 78 2 193 00c1  78 2 194 00c2 à 78 2 195 00c3 Ä 78 2 196 00c4 Å 78 2 197 00c5 Æ 103 2 198 00c6 Ç 80 3 199 00c7 È 76 2 200 00c8 É 76 2 201 00c9 Ê 76 2 202 00ca Ë 76 2 203 00cb Ì 47 2 204 00cc Í 47 2 205 00cd Î 47 2 206 00ce Ï 47 2 207 00cf Ð 87 2 208 00d0 Ñ 91 2 209 00d1 Ò 87 2 210 00d2 Ó 87 2 211 00d3 Ô 87 2 212 00d4 Õ 87 2 213 00d5 Ö 87 2 214 00d6 × 84 2 215 00d7 mu " Ø 87 2 216 00d8 Ù 87 2 217 00d9 Ú 87 2 218 00da Û 87 2 219 00db Ü 87 2 220 00dc Ý 71 2 221 00dd Þ 76 2 222 00de ß 76 2 223 00df à 65 2 224 00e0 á 65 2 225 00e1 â 65 2 226 00e2 ã 65 2 227 00e3 ä 65 2 228 00e4 å 65 2 229 00e5 æ 98 0 230 00e6 ç 61 1 231 00e7 è 64 2 232 00e8 é 64 2 233 00e9 ê 64 2 234 00ea ë 64 2 235 00eb ì 38 2 236 00ec í 38 2 237 00ed î 38 2 238 00ee ï 38 2 239 00ef ð 67 2 240 00f0 ñ 73 2 241 00f1 ò 67 2 242 00f2 ó 67 2 243 00f3 ô 67 2 244 00f4 õ 67 2 245 00f5 ö 67 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 67 0 248 00f8 ù 73 2 249 00f9 ú 73 2 250 00fa û 73 2 251 00fb ü 73 2 252 00fc ý 58 3 253 00fd þ 70 3 254 00fe ÿ 58 3 255 00ff ā 65 2 257 0101 Ă 78 2 258 0102 ă 65 2 259 0103 Ą 78 3 260 0104 ą 65 1 261 0105 Ć 80 2 262 0106 ć 61 2 263 0107 Ĉ 80 2 264 0108 ĉ 61 2 265 0109 Ċ 80 2 266 010a ċ 61 2 267 010b Č 80 2 268 010c č 61 2 269 010d Ď 87 2 270 010e ď 70 2 271 010f Đ 87 2 272 0110 đ 70 2 273 0111 Ē 76 2 274 0112 ē 64 2 275 0113 Ĕ 76 2 276 0114 ĕ 64 2 277 0115 Ė 76 2 278 0116 ė 64 2 279 0117 Ę 76 3 280 0118 ę 64 1 281 0119 Ě 76 2 282 011a ě 64 2 283 011b Ĝ 85 2 284 011c ĝ 70 3 285 011d Ğ 85 2 286 011e ğ 70 3 287 011f Ġ 85 2 288 0120 ġ 70 3 289 0121 Ģ 85 3 290 0122 ģ 70 3 291 0123 Ĥ 94 2 292 0124 ĥ 73 2 293 0125 Ħ 94 2 294 0126 ħ 73 2 295 0127 Ĩ 47 2 296 0128 ĩ 38 2 297 0129 Ī 47 2 298 012a ī 38 2 299 012b Ĭ 47 2 300 012c ĭ 38 2 301 012d Į 47 3 302 012e į 38 3 303 012f İ 47 2 304 0130 ı 38 0 305 0131 IJ 94 3 306 0132 ij 75 3 307 0133 Ĵ 47 3 308 0134 ĵ 36 3 309 0135 Ķ 87 3 310 0136 ķ 69 3 311 0137 ĸ 69 0 312 0138 Ĺ 70 2 313 0139 ĺ 38 2 314 013a Ļ 70 3 315 013b ļ 38 3 316 013c Ľ 70 2 317 013d ľ 51 2 318 013e Ŀ 70 2 319 013f ŀ 56 2 320 0140 Ł 71 2 321 0141 ł 38 2 322 0142 Ń 91 2 323 0143 ń 73 2 324 0144 Ņ 91 3 325 0145 ņ 73 1 326 0146 Ň 91 2 327 0147 ň 73 2 328 0148 ʼn 101 2 329 0149 Ŋ 91 3 330 014a ŋ 73 1 331 014b Ō 87 2 332 014c ō 67 2 333 014d Ŏ 87 2 334 014e ŏ 67 2 335 014f Ő 87 2 336 0150 ő 67 2 337 0151 Œ 118 2 338 0152 œ 103 0 339 0153 Ŕ 83 2 340 0154 ŕ 53 2 341 0155 Ŗ 83 3 342 0156 ŗ 53 1 343 0157 Ř 83 2 344 0158 ř 53 2 345 0159 Ś 72 2 346 015a ś 56 2 347 015b Ŝ 72 2 348 015c ŝ 56 2 349 015d Ş 72 3 350 015e ş 56 1 351 015f Š 72 2 352 0160 š 56 2 353 0161 Ţ 74 3 354 0162 ţ 46 3 355 0163 Ť 74 2 356 0164 ť 46 2 357 0165 Ŧ 74 2 358 0166 ŧ 46 2 359 0167 Ũ 87 2 360 0168 ũ 73 2 361 0169 Ū 87 2 362 016a ū 73 2 363 016b Ŭ 87 2 364 016c ŭ 73 2 365 016d Ů 87 2 366 016e ů 73 2 367 016f Ű 87 2 368 0170 ű 73 2 369 0171 Ų 87 3 370 0172 ų 73 1 371 0173 Ŵ 112 2 372 0174 ŵ 86 2 373 0175 Ŷ 71 2 374 0176 ŷ 58 3 375 0177 Ÿ 71 2 376 0178 Ź 73 2 377 0179 ź 57 2 378 017a Ż 73 2 379 017b ż 57 2 380 017c Ž 73 2 381 017d ž 57 2 382 017e ſ 43 3 383 017f Ɓ 85 2 385 0181 Ƃ 85 2 386 0182 ƃ 70 2 387 0183 Ƅ 85 2 388 0184 ƅ 70 2 389 0185 Ɔ 80 2 390 0186 Ƈ 80 2 391 0187 ƈ 61 2 392 0188 Ɖ 87 2 393 0189 Ɗ 87 2 394 018a Ƌ 85 2 395 018b ƌ 70 2 396 018c ƍ 67 1 397 018d Ǝ 76 2 398 018e Ə 87 2 399 018f Ɛ 70 2 400 0190 Ƒ 71 3 401 0191 ƒ 43 3 402 0192 Ɠ 85 2 403 0193 Ɣ 77 3 404 0194 ƕ 104 2 405 0195 Ɩ 47 2 406 0196 Ɨ 47 2 407 0197 Ƙ 87 2 408 0198 ƙ 69 2 409 0199 ƚ 38 2 410 019a ƛ 70 2 411 019b Ɯ 106 2 412 019c Ɲ 91 3 413 019d ƞ 73 1 414 019e Ɵ 87 2 415 019f Ơ 87 2 416 01a0 ơ 67 0 417 01a1 Ƣ 120 3 418 01a2 ƣ 94 1 419 01a3 Ƥ 75 2 420 01a4 ƥ 70 3 421 01a5 Ʀ 84 3 422 01a6 Ƨ 72 2 423 01a7 ƨ 56 0 424 01a8 Ʃ 71 2 425 01a9 ƪ 33 3 426 01aa ƫ 46 3 427 01ab Ƭ 74 2 428 01ac ƭ 46 2 429 01ad Ʈ 74 3 430 01ae Ư 87 2 431 01af ư 73 0 432 01b0 Ʊ 89 2 433 01b1 Ʋ 89 2 434 01b2 Ƴ 71 2 435 01b3 ƴ 70 1 436 01b4 Ƶ 73 2 437 01b5 ƶ 57 0 438 01b6 Ʒ 57 2 439 01b7 Ƹ 57 2 440 01b8 ƹ 57 1 441 01b9 ƻ 70 2 443 01bb Ƽ 75 2 444 01bc ƽ 57 1 445 01bd ƾ 54 2 446 01be ǀ 29 2 448 01c0 ǁ 49 2 449 01c1 ǂ 46 2 450 01c2 ǃ 29 2 451 01c3 Ǎ 78 2 461 01cd ǎ 65 2 462 01ce Ǐ 47 2 463 01cf ǐ 38 2 464 01d0 Ǒ 87 2 465 01d1 ǒ 67 2 466 01d2 Ǔ 87 2 467 01d3 ǔ 73 2 468 01d4 ǖ 73 2 470 01d6 Ǘ 87 2 471 01d7 ǘ 73 2 472 01d8 Ǚ 87 2 473 01d9 ǚ 73 2 474 01da Ǜ 87 2 475 01db ǜ 73 2 476 01dc ǝ 64 0 477 01dd ǟ 65 2 479 01df Ǣ 103 2 482 01e2 ǣ 98 2 483 01e3 Ǫ 87 3 490 01ea ǫ 67 1 491 01eb Ǭ 87 3 492 01ec ǭ 67 3 493 01ed Ƕ 122 2 502 01f6 Ș 72 3 536 0218 ș 56 1 537 0219 Ț 74 3 538 021a ț 46 3 539 021b Ȥ 73 3 548 0224 ȥ 57 1 549 0225 ȫ 67 2 555 022b ȭ 67 2 557 022d Ȯ 87 2 558 022e ȯ 67 2 559 022f ȱ 67 2 561 0231 Ȳ 71 2 562 0232 ȳ 58 3 563 0233 ȷ 36 1 567 0237 ȸ 103 2 568 0238 ȹ 103 1 569 0239 Ⱥ 78 2 570 023a Ȼ 80 2 571 023b ȼ 61 0 572 023c Ƚ 70 2 573 023d Ⱦ 74 2 574 023e ȿ 56 1 575 023f ɀ 57 1 576 0240 Ɂ 66 2 577 0241 ɐ 65 0 592 0250 ɑ 70 0 593 0251 ɒ 70 0 594 0252 ɓ 70 2 595 0253 ɔ 61 0 596 0254 ɕ 61 1 597 0255 ɖ 70 3 598 0256 ɗ 73 2 599 0257 ɘ 64 0 600 0258 ə 64 0 601 0259 ɚ 91 0 602 025a ɛ 61 0 603 025b ɜ 61 0 604 025c ɝ 91 0 605 025d ɞ 72 0 606 025e ɟ 39 1 607 025f ɠ 70 3 608 0260 ɡ 70 1 609 0261 ɢ 63 0 610 0262 ɣ 71 1 611 0263 ɤ 63 0 612 0264 ɥ 73 1 613 0265 ɦ 73 2 614 0266 ɧ 73 3 615 0267 ɨ 38 2 616 0268 ɩ 38 0 617 0269 ɪ 38 0 618 026a ɫ 41 2 619 026b ɬ 51 2 620 026c ɭ 38 3 621 026d ɮ 80 3 622 026e ɯ 106 0 623 026f ɰ 106 1 624 0270 ɱ 106 1 625 0271 ɲ 73 1 626 0272 ɳ 73 1 627 0273 ɴ 71 0 628 0274 ɵ 67 0 629 0275 ɶ 106 0 630 0276 ɷ 75 0 631 0277 ɸ 67 3 632 0278 ɹ 57 0 633 0279 ɺ 57 2 634 027a ɻ 57 1 635 027b ɼ 53 1 636 027c ɽ 53 1 637 027d ɾ 45 0 638 027e ɿ 49 0 639 027f ʀ 80 0 640 0280 ʁ 80 0 641 0281 ʂ 56 1 642 0282 ʃ 33 3 643 0283 ʄ 43 3 644 0284 ʅ 54 1 645 0285 ʆ 33 3 646 0286 ʇ 49 1 647 0287 ʈ 46 3 648 0288 ʉ 73 0 649 0289 ʊ 68 0 650 028a ʋ 69 0 651 028b ʌ 64 0 652 028c ʍ 91 0 653 028d ʎ 64 2 654 028e ʏ 73 0 655 028f ʐ 57 1 656 0290 ʑ 57 1 657 0291 ʒ 57 1 658 0292 ʓ 57 1 659 0293 ʔ 54 2 660 0294 ʕ 54 2 661 0295 ʖ 54 2 662 0296 ʗ 54 3 663 0297 ʘ 72 0 664 0298 ʙ 73 0 665 0299 ʚ 72 0 666 029a ʛ 63 2 667 029b ʜ 73 0 668 029c ʝ 38 3 669 029d ʞ 74 1 670 029e ʟ 65 0 671 029f ʠ 70 3 672 02a0 ʡ 54 2 673 02a1 ʢ 54 2 674 02a2 ʣ 112 2 675 02a3 ʤ 118 3 676 02a4 ʥ 112 3 677 02a5 ʦ 91 2 678 02a6 ʧ 71 3 679 02a7 ʨ 91 3 680 02a8 ʩ 104 3 681 02a9 ʪ 79 2 682 02aa ʫ 80 2 683 02ab ʬ 66 2 684 02ac ʭ 44 2 685 02ad ʮ 61 3 686 02ae ʯ 72 3 687 02af ʰ 52 2 688 02b0 ʱ 52 2 689 02b1 ʲ 31 2 690 02b2 ʳ 41 2 691 02b3 ʴ 41 2 692 02b4 ʵ 48 2 693 02b5 ʶ 53 2 694 02b6 ʷ 66 0 695 02b7 ʸ 48 0 696 02b8 ʻ 35 2 699 02bb ʼ 35 2 700 02bc ʾ 37 2 702 02be ʿ 37 2 703 02bf ˀ 31 2 704 02c0 ˁ 31 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 28 2 712 02c8 ˌ 28 1 716 02cc ː 37 0 720 02d0 ˑ 37 0 721 02d1 ˒ 37 0 722 02d2 ˓ 37 0 723 02d3 ˖ 39 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 42 0 734 02de ˠ 46 2 736 02e0 ˡ 29 2 737 02e1 ˢ 39 2 738 02e2 ˣ 48 2 739 02e3 ˤ 31 2 740 02e4 ˥ 48 2 741 02e5 ˦ 48 2 742 02e6 ˧ 48 2 743 02e7 ˨ 48 2 744 02e8 ˩ 48 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 30 2 884 0374 ͵ 30 1 885 0375 ͺ 50 1 890 037a ; 37 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 78 2 902 0386 · 35 0 903 0387 Έ 95 2 904 0388 Ή 114 2 905 0389 Ί 66 2 906 038a Ό 89 2 908 038c Ύ 95 2 910 038e Ώ 91 2 911 038f ΐ 48 2 912 0390 Α 78 2 913 0391 Β 85 2 914 0392 Γ 71 2 915 0393 Δ 78 2 916 0394 Ε 76 2 917 0395 Ζ 73 2 918 0396 Η 94 2 919 0397 Θ 87 2 920 0398 Ι 47 2 921 0399 Κ 87 2 922 039a Λ 78 2 923 039b Μ 111 2 924 039c Ν 91 2 925 039d Ξ 70 2 926 039e Ο 87 2 927 039f Π 94 2 928 03a0 Ρ 75 2 929 03a1 Σ 71 2 931 03a3 Τ 74 2 932 03a4 Υ 71 2 933 03a5 Φ 87 2 934 03a6 Χ 78 2 935 03a7 Ψ 91 2 936 03a8 Ω 89 2 937 03a9 Ϊ 47 2 938 03aa Ϋ 71 2 939 03ab ά 77 2 940 03ac έ 61 2 941 03ad ή 73 3 942 03ae ί 48 2 943 03af ΰ 69 2 944 03b0 α 77 0 945 03b1 β 66 3 946 03b2 γ 66 1 947 03b3 δ 67 2 948 03b4 ε 61 0 949 03b5 ζ 59 3 950 03b6 η 73 1 951 03b7 θ 67 2 952 03b8 ι 48 0 953 03b9 κ 75 0 954 03ba λ 70 2 955 03bb μ 73 1 956 03bc ν 69 0 957 03bd ξ 59 3 958 03be ο 67 0 959 03bf π 73 0 960 03c0 ρ 67 1 961 03c1 ς 61 1 962 03c2 σ 74 0 963 03c3 τ 67 0 964 03c4 υ 69 0 965 03c5 φ 90 1 966 03c6 χ 66 1 967 03c7 ψ 94 1 968 03c8 ω 95 0 969 03c9 ϊ 48 2 970 03ca ϋ 69 2 971 03cb ό 67 2 972 03cc ύ 69 2 973 03cd ώ 95 2 974 03ce ϐ 67 2 976 03d0 ϑ 85 2 977 03d1 ϒ 76 2 978 03d2 ϓ 97 2 979 03d3 ϔ 76 2 980 03d4 ϕ 94 3 981 03d5 ϖ 95 0 982 03d6 ϗ 65 1 983 03d7 Ϙ 87 3 984 03d8 ϙ 67 1 985 03d9 Ϛ 80 3 986 03da ϛ 61 3 987 03db Ϝ 71 2 988 03dc ϝ 53 3 989 03dd Ϟ 59 2 990 03de ϟ 66 2 991 03df Ϡ 80 3 992 03e0 ϡ 67 1 993 03e1 ϰ 65 0 1008 03f0 ϱ 67 1 1009 03f1 ϲ 61 0 1010 03f2 ϳ 36 3 1011 03f3 ϴ 87 2 1012 03f4 ϵ 61 0 1013 03f5 ϶ 61 0 1014 03f6 Ϸ 76 2 1015 03f7 ϸ 70 3 1016 03f8 Ϲ 80 2 1017 03f9 Ϻ 111 2 1018 03fa ϻ 86 1 1019 03fb ϼ 69 1 1020 03fc Ͻ 80 2 1021 03fd Ͼ 80 2 1022 03fe Ͽ 80 2 1023 03ff Ё 76 2 1025 0401 Ђ 90 3 1026 0402 Ѓ 71 2 1027 0403 Є 80 2 1028 0404 Ѕ 72 2 1029 0405 І 47 2 1030 0406 Ї 47 2 1031 0407 Ј 47 3 1032 0408 Љ 126 2 1033 0409 Њ 126 2 1034 040a Ћ 96 2 1035 040b Ќ 87 2 1036 040c Ѝ 94 2 1037 040d Ў 81 2 1038 040e Џ 94 3 1039 040f А 78 2 1040 0410 Б 85 2 1041 0411 В 85 2 1042 0412 Г 71 2 1043 0413 Д 94 3 1044 0414 Е 76 2 1045 0415 Ж 132 2 1046 0416 З 70 2 1047 0417 И 94 2 1048 0418 Й 94 2 1049 0419 К 87 2 1050 041a Л 94 2 1051 041b М 111 2 1052 041c Н 94 2 1053 041d О 87 2 1054 041e П 94 2 1055 041f Р 75 2 1056 0420 С 80 2 1057 0421 Т 74 2 1058 0422 У 81 2 1059 0423 Ф 105 3 1060 0424 Х 78 2 1061 0425 Ц 94 3 1062 0426 Ч 91 2 1063 0427 Ш 112 2 1064 0428 Щ 113 3 1065 0429 Ъ 88 2 1066 042a Ы 119 2 1067 042b Ь 79 2 1068 042c Э 80 2 1069 042d Ю 129 2 1070 042e Я 83 2 1071 042f а 65 0 1072 0430 б 67 2 1073 0431 в 73 0 1074 0432 г 64 0 1075 0433 д 87 1 1076 0434 е 64 0 1077 0435 ж 106 0 1078 0436 з 61 0 1079 0437 и 73 0 1080 0438 й 73 2 1081 0439 к 69 0 1082 043a л 73 0 1083 043b м 106 0 1084 043c н 73 0 1085 043d о 67 0 1086 043e п 73 0 1087 043f р 70 1 1088 0440 с 61 0 1089 0441 т 62 0 1090 0442 у 58 1 1091 0443 ф 82 3 1092 0444 х 60 0 1093 0445 ц 73 1 1094 0446 ч 73 0 1095 0447 ш 100 0 1096 0448 щ 102 1 1097 0449 ъ 69 0 1098 044a ы 100 0 1099 044b ь 66 0 1100 044c э 61 0 1101 044d ю 103 0 1102 044e я 80 0 1103 044f ѐ 64 2 1104 0450 ё 64 2 1105 0451 ђ 70 3 1106 0452 ѓ 64 2 1107 0453 є 61 0 1108 0454 ѕ 56 0 1109 0455 і 38 2 1110 0456 ї 38 2 1111 0457 ј 36 3 1112 0458 љ 100 0 1113 0459 њ 99 0 1114 045a ћ 73 2 1115 045b ќ 69 2 1116 045c ѝ 73 2 1117 045d ў 58 3 1118 045e џ 73 1 1119 045f Ґ 71 2 1168 0490 ґ 64 2 1169 0491 Ғ 71 2 1170 0492 ғ 64 0 1171 0493 Қ 87 3 1178 049a қ 69 1 1179 049b Ҳ 78 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 78 2 1232 04d0 ӑ 65 2 1233 04d1 Ӓ 78 2 1234 04d2 ӓ 65 2 1235 04d3 Ӕ 103 2 1236 04d4 ӕ 98 0 1237 04d5 Ӗ 76 2 1238 04d6 ӗ 64 2 1239 04d7 Ӡ 57 2 1248 04e0 ӡ 57 1 1249 04e1 Ӧ 87 2 1254 04e6 ӧ 67 2 1255 04e7 Ө 87 2 1256 04e8 ө 67 0 1257 04e9 Ӫ 87 2 1258 04ea ӫ 67 2 1259 04eb ᴂ 94 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 32 1 7433 1d09 ᴔ 99 0 7444 1d14 ᴖ 67 0 7446 1d16 ᴗ 67 0 7447 1d17 ᴝ 74 2 7453 1d1d ᴞ 95 2 7454 1d1e ᴟ 95 3 7455 1d1f ᵃ 47 2 7491 1d43 ᵄ 47 2 7492 1d44 ᵅ 50 2 7493 1d45 ᵆ 66 2 7494 1d46 ᵇ 50 2 7495 1d47 ᵈ 50 2 7496 1d48 ᵉ 44 2 7497 1d49 ᵊ 44 2 7498 1d4a ᵋ 41 2 7499 1d4b ᵌ 41 2 7500 1d4c ᵍ 50 2 7501 1d4d ᵎ 30 2 7502 1d4e ᵏ 52 2 7503 1d4f ᵐ 73 2 7504 1d50 ᵑ 47 2 7505 1d51 ᵒ 47 2 7506 1d52 ᵓ 43 2 7507 1d53 ᵔ 47 2 7508 1d54 ᵕ 47 0 7509 1d55 ᵖ 50 2 7510 1d56 ᵗ 37 2 7511 1d57 ᵘ 52 2 7512 1d58 ᵙ 43 2 7513 1d59 ᵚ 73 2 7514 1d5a ᵛ 49 2 7515 1d5b ᵷ 64 1 7543 1d77 ᵻ 38 0 7547 1d7b ᶅ 38 3 7557 1d85 ᶛ 50 2 7579 1d9b ᶜ 43 2 7580 1d9c ᶝ 43 2 7581 1d9d ᶞ 47 2 7582 1d9e ᶟ 41 2 7583 1d9f ᶠ 38 2 7584 1da0 ᶡ 37 2 7585 1da1 ᶢ 50 2 7586 1da2 ᶣ 52 2 7587 1da3 ᶤ 30 2 7588 1da4 ᶥ 31 2 7589 1da5 ᶦ 30 2 7590 1da6 ᶧ 30 2 7591 1da7 ᶨ 37 2 7592 1da8 ᶩ 37 2 7593 1da9 ᶪ 32 2 7594 1daa ᶫ 43 2 7595 1dab ᶬ 68 2 7596 1dac ᶭ 73 2 7597 1dad ᶮ 59 2 7598 1dae ᶯ 59 2 7599 1daf ᶰ 47 2 7600 1db0 ᶱ 47 2 7601 1db1 ᶲ 52 2 7602 1db2 ᶳ 40 2 7603 1db3 ᶴ 39 2 7604 1db4 ᶵ 37 2 7605 1db5 ᶶ 52 2 7606 1db6 ᶷ 48 2 7607 1db7 ᶹ 49 2 7609 1db9 ᶺ 49 2 7610 1dba ᶻ 41 2 7611 1dbb ᶼ 53 2 7612 1dbc ᶽ 41 2 7613 1dbd ᶾ 45 2 7614 1dbe ᶿ 47 2 7615 1dbf Ḍ 87 3 7692 1e0c ḍ 70 3 7693 1e0d Ḓ 87 3 7698 1e12 ḓ 70 3 7699 1e13 Ḥ 94 3 7716 1e24 ḥ 73 3 7717 1e25 Ḷ 70 3 7734 1e36 ḷ 38 3 7735 1e37 Ḹ 70 3 7736 1e38 ḹ 38 3 7737 1e39 Ḽ 70 3 7740 1e3c ḽ 38 3 7741 1e3d ṁ 106 2 7745 1e41 Ṃ 111 3 7746 1e42 ṃ 106 1 7747 1e43 Ṅ 91 2 7748 1e44 ṅ 73 2 7749 1e45 Ṇ 91 3 7750 1e46 ṇ 73 1 7751 1e47 Ṋ 91 3 7754 1e4a ṋ 73 1 7755 1e4b ṗ 70 3 7767 1e57 Ṛ 83 3 7770 1e5a ṛ 53 1 7771 1e5b Ṝ 83 3 7772 1e5c ṝ 53 3 7773 1e5d ṡ 56 2 7777 1e61 Ṣ 72 3 7778 1e62 ṣ 56 1 7779 1e63 Ṭ 74 3 7788 1e6c ṭ 46 3 7789 1e6d Ṱ 74 3 7792 1e70 ṱ 46 3 7793 1e71 Ṿ 78 3 7806 1e7e ṿ 58 1 7807 1e7f Ẁ 112 2 7808 1e80 ẁ 86 2 7809 1e81 Ẃ 112 2 7810 1e82 ẃ 86 2 7811 1e83 Ẅ 112 2 7812 1e84 ẅ 86 2 7813 1e85 Ẹ 76 3 7864 1eb8 ẹ 64 1 7865 1eb9 Ị 47 3 7882 1eca ị 38 3 7883 1ecb Ọ 87 3 7884 1ecc ọ 67 1 7885 1ecd Ụ 87 3 7908 1ee4 ụ 73 1 7909 1ee5 Ỳ 71 2 7922 1ef2 ỳ 58 3 7923 1ef3 ἁ 77 2 7937 1f01 ἂ 77 2 7938 1f02 ἃ 77 2 7939 1f03 ἄ 77 2 7940 1f04 ἅ 77 2 7941 1f05 ἆ 77 2 7942 1f06 ἇ 77 2 7943 1f07 Ἀ 78 2 7944 1f08 Ἁ 78 2 7945 1f09 Ἂ 98 2 7946 1f0a Ἃ 98 2 7947 1f0b Ἄ 83 2 7948 1f0c Ἅ 85 2 7949 1f0d Ἆ 78 2 7950 1f0e Ἇ 78 2 7951 1f0f ἐ 61 2 7952 1f10 ἑ 61 2 7953 1f11 ἒ 61 2 7954 1f12 ἓ 61 2 7955 1f13 ἔ 61 2 7956 1f14 ἕ 61 2 7957 1f15 Ἐ 92 2 7960 1f18 Ἑ 91 2 7961 1f19 Ἒ 117 2 7962 1f1a Ἓ 117 2 7963 1f1b Ἔ 109 2 7964 1f1c Ἕ 112 2 7965 1f1d ἠ 73 3 7968 1f20 ἡ 73 3 7969 1f21 ἢ 73 3 7970 1f22 ἣ 73 3 7971 1f23 ἤ 73 3 7972 1f24 ἥ 73 3 7973 1f25 ἦ 73 3 7974 1f26 ἧ 73 3 7975 1f27 Ἠ 110 2 7976 1f28 Ἡ 109 2 7977 1f29 Ἢ 136 2 7978 1f2a Ἣ 136 2 7979 1f2b Ἤ 128 2 7980 1f2c Ἥ 131 2 7981 1f2d Ἦ 120 2 7982 1f2e Ἧ 119 2 7983 1f2f ἰ 48 2 7984 1f30 ἱ 48 2 7985 1f31 ἲ 48 2 7986 1f32 ἳ 48 2 7987 1f33 ἴ 48 2 7988 1f34 ἵ 48 2 7989 1f35 ἶ 48 2 7990 1f36 ἷ 48 2 7991 1f37 Ἰ 63 2 7992 1f38 Ἱ 62 2 7993 1f39 Ἲ 88 2 7994 1f3a Ἳ 88 2 7995 1f3b Ἴ 80 2 7996 1f3c Ἵ 83 2 7997 1f3d Ἶ 72 2 7998 1f3e Ἷ 71 2 7999 1f3f ὀ 67 2 8000 1f40 ὁ 67 2 8001 1f41 ὂ 67 2 8002 1f42 ὃ 67 2 8003 1f43 ὄ 67 2 8004 1f44 ὅ 67 2 8005 1f45 Ὀ 90 2 8008 1f48 Ὁ 93 2 8009 1f49 Ὂ 124 2 8010 1f4a Ὃ 124 2 8011 1f4b Ὄ 103 2 8012 1f4c Ὅ 107 2 8013 1f4d ὐ 69 2 8016 1f50 ὑ 69 2 8017 1f51 ὒ 69 2 8018 1f52 ὓ 69 2 8019 1f53 ὔ 69 2 8020 1f54 ὕ 69 2 8021 1f55 ὖ 69 2 8022 1f56 ὗ 69 2 8023 1f57 Ὑ 92 2 8025 1f59 Ὓ 119 2 8027 1f5b Ὕ 113 2 8029 1f5d Ὗ 102 2 8031 1f5f ὠ 95 2 8032 1f60 ὡ 95 2 8033 1f61 ὢ 95 2 8034 1f62 ὣ 95 2 8035 1f63 ὤ 95 2 8036 1f64 ὥ 95 2 8037 1f65 ὦ 95 2 8038 1f66 ὧ 95 2 8039 1f67 Ὠ 93 2 8040 1f68 Ὡ 96 2 8041 1f69 Ὢ 127 2 8042 1f6a Ὣ 127 2 8043 1f6b Ὤ 105 2 8044 1f6c Ὥ 109 2 8045 1f6d Ὦ 102 2 8046 1f6e Ὧ 106 2 8047 1f6f ὰ 77 2 8048 1f70 ά 77 2 8049 1f71 ὲ 61 2 8050 1f72 έ 61 2 8051 1f73 ὴ 73 3 8052 1f74 ή 73 3 8053 1f75 ὶ 48 2 8054 1f76 ί 48 2 8055 1f77 ὸ 67 2 8056 1f78 ό 67 2 8057 1f79 ὺ 69 2 8058 1f7a ύ 69 2 8059 1f7b ὼ 95 2 8060 1f7c ώ 95 2 8061 1f7d ᾀ 77 3 8064 1f80 ᾁ 77 3 8065 1f81 ᾂ 77 3 8066 1f82 ᾃ 77 3 8067 1f83 ᾄ 77 3 8068 1f84 ᾅ 77 3 8069 1f85 ᾆ 77 3 8070 1f86 ᾇ 77 3 8071 1f87 ᾈ 78 3 8072 1f88 ᾉ 78 3 8073 1f89 ᾊ 98 3 8074 1f8a ᾋ 98 3 8075 1f8b ᾌ 83 3 8076 1f8c ᾍ 85 3 8077 1f8d ᾎ 78 3 8078 1f8e ᾏ 78 3 8079 1f8f ᾐ 73 3 8080 1f90 ᾑ 73 3 8081 1f91 ᾒ 73 3 8082 1f92 ᾓ 73 3 8083 1f93 ᾔ 73 3 8084 1f94 ᾕ 73 3 8085 1f95 ᾖ 73 3 8086 1f96 ᾗ 73 3 8087 1f97 ᾘ 110 3 8088 1f98 ᾙ 109 3 8089 1f99 ᾚ 136 3 8090 1f9a ᾛ 136 3 8091 1f9b ᾜ 128 3 8092 1f9c ᾝ 131 3 8093 1f9d ᾞ 120 3 8094 1f9e ᾟ 119 3 8095 1f9f ᾠ 95 3 8096 1fa0 ᾡ 95 3 8097 1fa1 ᾢ 95 3 8098 1fa2 ᾣ 95 3 8099 1fa3 ᾤ 95 3 8100 1fa4 ᾥ 95 3 8101 1fa5 ᾦ 95 3 8102 1fa6 ᾧ 95 3 8103 1fa7 ᾨ 93 3 8104 1fa8 ᾩ 96 3 8105 1fa9 ᾪ 127 3 8106 1faa ᾫ 127 3 8107 1fab ᾬ 105 3 8108 1fac ᾭ 109 3 8109 1fad ᾮ 102 3 8110 1fae ᾯ 106 3 8111 1faf ᾰ 77 2 8112 1fb0 ᾱ 77 2 8113 1fb1 ᾲ 77 3 8114 1fb2 ᾳ 77 1 8115 1fb3 ᾴ 77 3 8116 1fb4 ᾶ 77 2 8118 1fb6 ᾷ 77 3 8119 1fb7 Ᾰ 78 2 8120 1fb8 Ᾱ 78 2 8121 1fb9 Ὰ 81 2 8122 1fba Ά 78 2 8123 1fbb ᾼ 78 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 73 3 8130 1fc2 ῃ 73 1 8131 1fc3 ῄ 73 3 8132 1fc4 ῆ 73 3 8134 1fc6 ῇ 73 3 8135 1fc7 Ὲ 100 2 8136 1fc8 Έ 95 2 8137 1fc9 Ὴ 119 2 8138 1fca Ή 112 2 8139 1fcb ῌ 94 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 48 2 8144 1fd0 ῑ 48 2 8145 1fd1 ῒ 48 2 8146 1fd2 ΐ 48 2 8147 1fd3 ῖ 48 2 8150 1fd6 ῗ 48 2 8151 1fd7 Ῐ 47 2 8152 1fd8 Ῑ 47 2 8153 1fd9 Ὶ 71 2 8154 1fda Ί 66 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 69 2 8160 1fe0 ῡ 69 2 8161 1fe1 ῢ 69 2 8162 1fe2 ΰ 69 2 8163 1fe3 ῤ 67 3 8164 1fe4 ῥ 67 3 8165 1fe5 ῦ 69 2 8166 1fe6 ῧ 69 2 8167 1fe7 Ῠ 71 2 8168 1fe8 Ῡ 71 2 8169 1fe9 Ὺ 102 2 8170 1fea Ύ 95 2 8171 1feb Ῥ 91 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 95 3 8178 1ff2 ῳ 95 1 8179 1ff3 ῴ 95 3 8180 1ff4 ῶ 95 2 8182 1ff6 ῷ 95 3 8183 1ff7 Ὸ 107 2 8184 1ff8 Ό 89 2 8185 1ff9 Ὼ 110 2 8186 1ffa Ώ 91 2 8187 1ffb ῼ 89 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 42 0 8208 2010 ‑ 42 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 35 2 8216 2018 ` " ‘ " ’ 35 2 8217 2019 ' " ’ " ‚ 35 1 8218 201a ‛ 35 2 8219 201b “ 58 2 8220 201c ” 58 2 8221 201d „ 58 1 8222 201e ‟ 58 2 8223 201f † 52 3 8224 2020 ‡ 52 3 8225 2021 • 64 0 8226 2022 ‣ 64 0 8227 2023 … 100 0 8230 2026 ‰ 138 2 8240 2030 ‱ 181 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 63 2 8252 203c ‾ 50 2 8254 203e ⁇ 108 2 8263 2047 ⁈ 86 2 8264 2048 ⁉ 86 2 8265 2049 ⁰ 44 2 8304 2070 ⁴ 44 2 8308 2074 ⁵ 44 2 8309 2075 ⁶ 44 2 8310 2076 ⁷ 44 2 8311 2077 ⁸ 44 2 8312 2078 ⁹ 44 2 8313 2079 ⁿ 52 2 8319 207f ₦ 70 2 8358 20a6 € 70 2 8364 20ac ₵ 70 3 8373 20b5 № 137 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 89 2 8486 2126 K 87 2 8490 212a Å 78 2 8491 212b ∂ 53 2 8706 2202 pd " ∆ 75 2 8710 2206 ∇ 75 2 8711 2207 gr " ∏ 84 3 8719 220f ∑ 75 3 8721 2211 − 84 0 8722 2212 ∕ 17 2 8725 2215 ∙ 35 0 8729 2219 bu " √ 66 2 8730 221a sr " ∝ 67 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 81 0 8743 2227 l∧ 81 0 8743 2227 " ∨ 81 0 8744 2228 l| " ∩ 81 0 8745 2229 ca " ∪ 81 0 8746 222a cu " ∫ 58 3 8747 222b is " ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 83 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 54 2 8977 2311 ⌘ 93 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 58 3 8992 2320 ⌡ 58 3 8993 2321 ⌥ 100 2 8997 2325 ⍽ 101 1 9085 237d ⎮ 58 3 9134 23ae ⏏ 77 0 9167 23cf ␣ 83 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 64 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 64 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⟠ 49 3 10208 27e0 ⧫ 49 3 10731 29eb ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 73 3 64257 fb01 fl 73 3 64258 fb02 � 111 3 65533 fffd 9base-6/troff/font/devutf/UnivMath40000644000175000017500000000243611402154555016700 0ustar anselmanselmname UnivMath4 fontname Universal-MathFour charset --- 83 2 33 --- 83 2 34 --- 83 2 35 --- 83 2 36 --- 83 2 37 --- 83 2 38 --- 83 2 39 --- 83 2 40 --- 83 2 41 --- 83 2 42 --- 83 2 43 --- 83 2 44 --- 50 2 45 --- 83 2 46 --- 28 2 47 --- 33 2 48 --- 83 2 49 --- 83 2 50 --- 83 2 51 --- 83 2 52 --- 83 2 53 --- 83 2 54 --- 83 2 55 --- 33 2 56 --- 33 2 57 --- 83 2 58 --- 83 2 59 --- 83 2 60 --- 72 2 61 --- 83 2 62 --- 33 2 63 --- 83 2 64 --- 78 2 65 --- 72 2 66 --- 94 2 67 --- 72 2 68 --- 72 2 69 --- 83 2 70 --- 67 2 71 --- 83 2 72 --- 44 2 73 --- 78 2 74 --- 78 2 75 --- 78 2 76 --- 94 2 77 --- 78 2 78 --- 83 2 79 --- 83 2 80 --- 83 2 81 --- 72 2 82 --- 72 2 83 --- 72 2 84 --- 83 2 85 --- 89 2 86 --- 56 2 87 --- 78 2 88 --- 78 2 89 --- 67 2 90 --- 83 2 91 --- 83 2 92 --- 83 2 93 --- 83 2 94 --- 83 2 95 --- 83 2 96 --- 67 2 97 --- 67 2 98 --- 72 2 99 --- 56 2 100 --- 50 2 101 --- 78 2 102 --- 61 2 103 --- 67 2 104 --- 39 2 105 --- 50 2 106 --- 61 2 107 --- 61 2 108 --- 72 2 109 --- 56 2 110 --- 56 2 111 --- 72 2 112 --- 72 2 113 --- 56 2 114 --- 72 2 115 --- 50 2 116 --- 56 2 117 --- 78 2 118 --- 67 2 119 --- 61 2 120 --- 61 2 121 --- 44 2 122 --- 67 2 123 --- 28 2 124 --- 67 2 125 --- 83 2 126 --- 50 2 167 --- 56 2 171 --- 61 2 173 --- 94 2 195 --- 61 2 198 --- 83 2 248 --- 83 2 249 --- 61 2 251 9base-6/troff/font/devutf/LucidaSansI0000644000175000017500000000570111402154555017216 0ustar anselmanselmname LucidaSansI fontname LucidaSans-Italic spacewidth 32 charset ! 32 2 33 " 36 2 34 # 63 2 35 $ 63 2 36 % 74 2 37 & 70 2 38 ' 32 2 39 ( 33 2 40 ) 33 2 41 * 47 2 42 + 63 0 43 , 32 1 44 - 63 0 45 . 32 0 46 / 48 2 47 0 63 2 48 1 63 2 49 2 63 2 50 3 63 2 51 4 63 2 52 5 63 2 53 6 63 2 54 7 63 2 55 8 63 2 56 9 63 2 57 : 32 0 58 ; 32 1 59 < 63 2 60 = 63 0 61 > 63 2 62 ? 46 2 63 @ 86 3 64 A 69 2 65 B 59 2 66 C 68 2 67 D 74 2 68 E 55 2 69 F 54 2 70 G 70 2 71 H 74 2 72 I 29 2 73 J 41 2 74 K 64 2 75 L 55 2 76 M 83 2 77 N 74 2 78 O 78 2 79 P 58 2 80 Q 78 3 81 R 63 2 82 S 55 2 83 T 62 2 84 U 69 2 85 V 69 2 86 W 89 2 87 X 62 2 88 Y 61 2 89 Z 58 2 90 [ 33 3 91 \ 48 2 92 ] 33 3 93 ^ 63 2 94 _ 50 1 95 ` 32 2 96 a 61 0 97 b 61 2 98 c 50 0 99 d 61 2 100 e 53 0 101 f 38 2 102 g 61 1 103 h 62 2 104 i 29 2 105 j 33 3 106 k 58 2 107 l 29 2 108 m 93 0 109 n 62 0 110 o 57 0 111 p 61 1 112 q 61 1 113 r 48 0 114 s 49 0 115 t 38 2 116 u 62 0 117 v 54 0 118 w 78 0 119 x 54 0 120 y 55 1 121 z 54 0 122 { 33 3 123 | 23 3 124 } 33 3 125 ~ 63 2 126 ¡ 32 1 161 exclamdown ¢ 63 3 162 cent £ 63 2 163 sterling ¤ 63 2 164 currency ¥ 63 2 165 yen ¦ 23 2 166 brokenbar § 63 3 167 section ¨ 57 2 168 dieresis © 86 2 169 copyright ª 39 2 170 ordfeminine « 53 0 171 guillemotleft ¬ 63 0 172 logicalnot ­ 31 0 173 hyphen hy " ® 63 2 174 registered ¯ 57 2 175 macron ° 27 2 176 degree ± 63 2 177 plusminus ² 39 2 178 twosuperior ³ 39 2 179 threesuperior ´ 57 2 180 acute µ 63 1 181 mu ¶ 63 3 182 paragraph · 63 0 183 periodcentered ¸ 57 1 184 cedilla ¹ 39 2 185 onesuperior º 39 2 186 ordmasculine » 53 0 187 guillemotright ¼ 86 2 188 onequarter ½ 86 2 189 onehalf ¾ 86 2 190 threequarters ¿ 46 1 191 questiondown À 69 2 192 Agrave Á 69 2 193 Aacute  69 2 194 Acircumflex à 69 2 195 Atilde Ä 69 2 196 Adieresis Å 69 2 197 Aring Æ 89 2 198 AE Ç 68 3 199 Ccedilla È 55 2 200 Egrave É 55 2 201 Eacute Ê 55 2 202 Ecircumflex Ë 55 2 203 Edieresis Ì 29 2 204 Igrave Í 29 2 205 Iacute Î 29 2 206 Icircumflex Ï 29 2 207 Idieresis Ð 74 2 208 Eth Ñ 74 2 209 Ntilde Ò 78 2 210 Ograve Ó 78 2 211 Oacute Ô 78 2 212 Ocircumflex Õ 78 2 213 Otilde Ö 78 2 214 Odieresis × 63 0 215 multiply Ø 78 2 216 Oslash Ù 69 2 217 Ugrave Ú 69 2 218 Uacute Û 69 2 219 Ucircumflex Ü 69 2 220 Udieresis Ý 61 2 221 Yacute Þ 58 2 222 Thorn ß 60 2 223 germandbls à 61 2 224 agrave á 61 2 225 aacute â 61 2 226 acircumflex ã 61 2 227 atilde ä 61 2 228 adieresis å 61 2 229 aring æ 89 0 230 ae ç 50 1 231 ccedilla è 53 2 232 egrave é 53 2 233 eacute ê 53 2 234 ecircumflex ë 53 2 235 edieresis ì 29 2 236 igrave í 29 2 237 iacute î 29 2 238 icircumflex ï 29 2 239 idieresis ð 56 2 240 eth ñ 62 2 241 ntilde ò 57 2 242 ograve ó 57 2 243 oacute ô 57 2 244 ocircumflex õ 57 2 245 otilde ö 57 2 246 odieresis ÷ 63 0 247 divide ø 57 2 248 oslash ù 62 2 249 ugrave ú 62 2 250 uacute û 62 2 251 ucircumflex ü 62 2 252 udieresis ý 55 3 253 yacute þ 61 3 254 thorn ÿ 55 3 255 ydieresis 9base-6/troff/font/devutf/DejaVuSans0000644000175000017500000007277111402154555017075 0ustar anselmanselmname DejaVuSans fontname DejaVuSans spacewidth 32 charset ! 40 2 33 0021 " 46 2 34 0022 dq " dq " # 84 2 35 0023 $ 64 3 36 0024 % 95 2 37 0025 & 78 2 38 0026 ( 39 3 40 0028 ) 39 3 41 0029 * 50 2 42 002a + 84 2 43 002b , 32 1 44 002c - 36 0 45 002d . 32 0 46 002e / 34 3 47 002f 0 64 2 48 0030 1 64 2 49 0031 2 64 2 50 0032 3 64 2 51 0033 4 64 2 52 0034 5 64 2 53 0035 6 64 2 54 0036 7 64 2 55 0037 8 64 2 56 0038 9 64 2 57 0039 : 34 0 58 003a ; 34 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 53 2 63 003f @ 100 3 64 0040 A 68 2 65 0041 B 69 2 66 0042 C 70 2 67 0043 D 77 2 68 0044 E 63 2 69 0045 F 58 2 70 0046 G 77 2 71 0047 H 75 2 72 0048 I 29 2 73 0049 J 29 3 74 004a K 66 2 75 004b L 56 2 76 004c M 86 2 77 004d N 75 2 78 004e O 79 2 79 004f P 60 2 80 0050 Q 79 3 81 0051 R 69 2 82 0052 S 63 2 83 0053 T 61 2 84 0054 U 73 2 85 0055 V 68 2 86 0056 W 99 2 87 0057 X 69 2 88 0058 Y 61 2 89 0059 Z 69 2 90 005a [ 39 3 91 005b \ 34 3 92 005c bs " ] 39 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 61 0 97 0061 b 63 2 98 0062 c 55 0 99 0063 d 63 2 100 0064 e 62 0 101 0065 f 35 2 102 0066 g 63 1 103 0067 h 63 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 58 2 107 006b l 28 2 108 006c m 97 0 109 006d n 63 0 110 006e o 61 0 111 006f p 63 1 112 0070 q 63 1 113 0071 r 41 0 114 0072 s 52 0 115 0073 t 39 2 116 0074 u 63 0 117 0075 v 59 0 118 0076 w 82 0 119 0077 x 59 0 120 0078 y 59 1 121 0079 z 52 0 122 007a { 64 3 123 007b | 34 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   64 0 160 00a0 ¡ 40 2 161 00a1 ¢ 64 3 162 00a2 £ 64 2 163 00a3 ¤ 64 0 164 00a4 ¥ 64 2 165 00a5 ¦ 34 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 47 2 170 00aa « 61 0 171 00ab ¬ 84 0 172 00ac ­ 36 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 40 2 178 00b2 ³ 40 2 179 00b3 ´ 50 2 180 00b4 aa " µ 64 1 181 00b5 ¶ 64 3 182 00b6 · 32 0 183 00b7 ¸ 50 1 184 00b8 ¹ 40 2 185 00b9 º 47 2 186 00ba » 61 0 187 00bb ¼ 97 2 188 00bc ½ 97 2 189 00bd ¾ 97 2 190 00be ¿ 53 2 191 00bf À 68 2 192 00c0 Á 68 2 193 00c1  68 2 194 00c2 à 68 2 195 00c3 Ä 68 2 196 00c4 Å 68 2 197 00c5 Æ 97 2 198 00c6 Ç 70 3 199 00c7 È 63 2 200 00c8 É 63 2 201 00c9 Ê 63 2 202 00ca Ë 63 2 203 00cb Ì 29 2 204 00cc Í 29 2 205 00cd Î 29 2 206 00ce Ï 29 2 207 00cf Ð 77 2 208 00d0 Ñ 75 2 209 00d1 Ò 79 2 210 00d2 Ó 79 2 211 00d3 Ô 79 2 212 00d4 Õ 79 2 213 00d5 Ö 79 2 214 00d6 × 84 0 215 00d7 mu " Ø 79 2 216 00d8 Ù 73 2 217 00d9 Ú 73 2 218 00da Û 73 2 219 00db Ü 73 2 220 00dc Ý 61 2 221 00dd Þ 60 2 222 00de ß 63 2 223 00df à 61 2 224 00e0 á 61 2 225 00e1 â 61 2 226 00e2 ã 61 2 227 00e3 ä 61 2 228 00e4 å 61 2 229 00e5 æ 98 0 230 00e6 ç 55 1 231 00e7 è 62 2 232 00e8 é 62 2 233 00e9 ê 62 2 234 00ea ë 62 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 61 2 240 00f0 ñ 63 2 241 00f1 ò 61 2 242 00f2 ó 61 2 243 00f3 ô 61 2 244 00f4 õ 61 2 245 00f5 ö 61 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 63 2 249 00f9 ú 63 2 250 00fa û 63 2 251 00fb ü 63 2 252 00fc ý 59 3 253 00fd þ 63 3 254 00fe ÿ 59 3 255 00ff ā 61 2 257 0101 Ă 68 2 258 0102 ă 61 2 259 0103 Ą 68 3 260 0104 ą 61 1 261 0105 Ć 70 2 262 0106 ć 55 2 263 0107 Ĉ 70 2 264 0108 ĉ 55 2 265 0109 Ċ 70 2 266 010a ċ 55 2 267 010b Č 70 2 268 010c č 55 2 269 010d Ď 77 2 270 010e ď 63 2 271 010f Đ 77 2 272 0110 đ 63 2 273 0111 Ē 63 2 274 0112 ē 62 2 275 0113 Ĕ 63 2 276 0114 ĕ 62 2 277 0115 Ė 63 2 278 0116 ė 62 2 279 0117 Ę 63 3 280 0118 ę 62 1 281 0119 Ě 63 2 282 011a ě 62 2 283 011b Ĝ 77 2 284 011c ĝ 63 3 285 011d Ğ 77 2 286 011e ğ 63 3 287 011f Ġ 77 2 288 0120 ġ 63 3 289 0121 Ģ 77 3 290 0122 ģ 63 3 291 0123 Ĥ 75 2 292 0124 ĥ 63 2 293 0125 Ħ 92 2 294 0126 ħ 69 2 295 0127 Ĩ 29 2 296 0128 ĩ 28 2 297 0129 Ī 29 2 298 012a ī 28 2 299 012b Ĭ 29 2 300 012c ĭ 28 2 301 012d Į 29 3 302 012e į 28 3 303 012f İ 29 2 304 0130 ı 28 0 305 0131 IJ 59 3 306 0132 ij 56 3 307 0133 Ĵ 29 3 308 0134 ĵ 28 3 309 0135 Ķ 66 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 56 2 313 0139 ĺ 29 2 314 013a Ļ 56 3 315 013b ļ 28 3 316 013c Ľ 56 2 317 013d ľ 38 2 318 013e Ŀ 56 2 319 013f ŀ 34 2 320 0140 Ł 56 2 321 0141 ł 28 2 322 0142 Ń 75 2 323 0143 ń 63 2 324 0144 Ņ 75 3 325 0145 ņ 63 1 326 0146 Ň 75 2 327 0147 ň 63 2 328 0148 ʼn 81 2 329 0149 Ŋ 75 3 330 014a ŋ 63 1 331 014b Ō 79 2 332 014c ō 61 2 333 014d Ŏ 79 2 334 014e ŏ 61 2 335 014f Ő 79 2 336 0150 ő 61 2 337 0151 Œ 107 2 338 0152 œ 102 0 339 0153 Ŕ 69 2 340 0154 ŕ 41 2 341 0155 Ŗ 69 3 342 0156 ŗ 41 1 343 0157 Ř 69 2 344 0158 ř 41 2 345 0159 Ś 63 2 346 015a ś 52 2 347 015b Ŝ 63 2 348 015c ŝ 52 2 349 015d Ş 63 3 350 015e ş 52 1 351 015f Š 63 2 352 0160 š 52 2 353 0161 Ţ 61 3 354 0162 ţ 39 3 355 0163 Ť 61 2 356 0164 ť 39 2 357 0165 Ŧ 61 2 358 0166 ŧ 39 2 359 0167 Ũ 73 2 360 0168 ũ 63 2 361 0169 Ū 73 2 362 016a ū 63 2 363 016b Ŭ 73 2 364 016c ŭ 63 2 365 016d Ů 73 2 366 016e ů 63 2 367 016f Ű 73 2 368 0170 ű 63 2 369 0171 Ų 73 3 370 0172 ų 63 1 371 0173 Ŵ 99 2 372 0174 ŵ 82 2 373 0175 Ŷ 61 2 374 0176 ŷ 59 3 375 0177 Ÿ 61 2 376 0178 Ź 69 2 377 0179 ź 52 2 378 017a Ż 69 2 379 017b ż 52 2 380 017c Ž 69 2 381 017d ž 52 2 382 017e ſ 35 2 383 017f ƀ 63 2 384 0180 Ɓ 73 2 385 0181 Ƃ 69 2 386 0182 ƃ 63 2 387 0183 Ƅ 69 2 388 0184 ƅ 63 2 389 0185 Ɔ 70 2 390 0186 Ƈ 70 2 391 0187 ƈ 55 2 392 0188 Ɖ 77 2 393 0189 Ɗ 82 2 394 018a Ƌ 69 2 395 018b ƌ 63 2 396 018c ƍ 61 1 397 018d Ǝ 63 2 398 018e Ə 79 2 399 018f Ɛ 64 2 400 0190 Ƒ 58 3 401 0191 ƒ 35 3 402 0192 Ɠ 77 2 403 0193 Ɣ 69 3 404 0194 ƕ 96 2 405 0195 Ɩ 35 2 406 0196 Ɨ 29 2 407 0197 Ƙ 69 2 408 0198 ƙ 58 2 409 0199 ƚ 28 2 410 019a ƛ 59 2 411 019b Ɯ 97 2 412 019c Ɲ 75 3 413 019d ƞ 63 1 414 019e Ɵ 79 2 415 019f Ơ 79 2 416 01a0 ơ 61 0 417 01a1 Ƣ 94 2 418 01a2 ƣ 74 1 419 01a3 Ƥ 65 2 420 01a4 ƥ 63 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 63 2 423 01a7 ƨ 52 0 424 01a8 Ʃ 63 2 425 01a9 ƪ 34 3 426 01aa ƫ 39 3 427 01ab Ƭ 61 2 428 01ac ƭ 39 2 429 01ad Ʈ 61 3 430 01ae Ư 73 2 431 01af ư 63 0 432 01b0 Ʊ 76 2 433 01b1 Ʋ 72 2 434 01b2 Ƴ 70 2 435 01b3 ƴ 80 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 52 0 438 01b6 Ʒ 67 2 439 01b7 Ƹ 67 2 440 01b8 ƹ 58 1 441 01b9 ƻ 64 2 443 01bb Ƽ 67 2 444 01bc ƽ 58 1 445 01bd ƾ 51 2 446 01be ǀ 29 3 448 01c0 ǁ 49 3 449 01c1 ǂ 46 3 450 01c2 ǃ 30 2 451 01c3 DŽ 142 2 452 01c4 Dž 130 2 453 01c5 dž 115 2 454 01c6 LJ 84 3 455 01c7 Lj 79 3 456 01c8 lj 46 3 457 01c9 NJ 93 3 458 01ca Nj 92 3 459 01cb nj 80 3 460 01cc Ǎ 68 2 461 01cd ǎ 61 2 462 01ce Ǐ 29 2 463 01cf ǐ 28 2 464 01d0 Ǒ 79 2 465 01d1 ǒ 61 2 466 01d2 Ǔ 73 2 467 01d3 ǔ 63 2 468 01d4 ǖ 63 2 470 01d6 Ǘ 73 2 471 01d7 ǘ 63 2 472 01d8 Ǚ 73 2 473 01d9 ǚ 63 2 474 01da Ǜ 73 2 475 01db ǜ 63 2 476 01dc ǝ 62 0 477 01dd ǟ 61 2 479 01df Ǣ 97 2 482 01e2 ǣ 98 2 483 01e3 Ǫ 79 3 490 01ea ǫ 61 1 491 01eb Ǭ 79 3 492 01ec ǭ 61 3 493 01ed DZ 142 2 497 01f1 Dz 130 2 498 01f2 dz 115 2 499 01f3 Ƕ 111 2 502 01f6 Ș 63 3 536 0218 ș 52 1 537 0219 Ț 61 3 538 021a ț 39 3 539 021b Ȥ 69 3 548 0224 ȥ 52 1 549 0225 ȫ 61 2 555 022b ȭ 61 2 557 022d Ȯ 79 2 558 022e ȯ 61 2 559 022f ȱ 61 2 561 0231 Ȳ 61 2 562 0232 ȳ 59 3 563 0233 ȷ 28 1 567 0237 ȸ 100 2 568 0238 ȹ 100 1 569 0239 Ⱥ 68 2 570 023a Ȼ 70 2 571 023b ȼ 55 0 572 023c Ƚ 56 2 573 023d Ⱦ 61 2 574 023e ȿ 52 1 575 023f ɀ 52 1 576 0240 Ɂ 51 2 577 0241 ɐ 61 0 592 0250 ɑ 63 0 593 0251 ɒ 63 0 594 0252 ɓ 63 2 595 0253 ɔ 55 0 596 0254 ɕ 55 1 597 0255 ɖ 63 3 598 0256 ɗ 73 2 599 0257 ɘ 62 0 600 0258 ə 62 0 601 0259 ɚ 80 0 602 025a ɛ 54 0 603 025b ɜ 54 0 604 025c ɝ 77 0 605 025d ɞ 68 0 606 025e ɟ 33 1 607 025f ɠ 64 3 608 0260 ɡ 63 1 609 0261 ɢ 63 0 610 0262 ɣ 69 1 611 0263 ɤ 59 0 612 0264 ɥ 63 1 613 0265 ɦ 63 2 614 0266 ɧ 63 3 615 0267 ɨ 37 2 616 0268 ɩ 39 0 617 0269 ɪ 37 0 618 026a ɫ 49 2 619 026b ɬ 49 2 620 026c ɭ 28 3 621 026d ɮ 71 3 622 026e ɯ 97 0 623 026f ɰ 97 1 624 0270 ɱ 97 1 625 0271 ɲ 65 1 626 0272 ɳ 64 1 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 86 0 630 0276 ɷ 73 0 631 0277 ɸ 61 3 632 0278 ɹ 47 0 633 0279 ɺ 47 2 634 027a ɻ 47 1 635 027b ɼ 47 1 636 027c ɽ 47 1 637 027d ɾ 53 0 638 027e ɿ 53 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 52 1 642 0282 ʃ 34 3 643 0283 ʄ 38 3 644 0284 ʅ 46 1 645 0285 ʆ 34 3 646 0286 ʇ 39 1 647 0287 ʈ 39 3 648 0288 ʉ 63 0 649 0289 ʊ 62 0 650 028a ʋ 60 0 651 028b ʌ 59 0 652 028c ʍ 82 0 653 028d ʎ 59 2 654 028e ʏ 61 0 655 028f ʐ 52 1 656 0290 ʑ 52 1 657 0291 ʒ 58 1 658 0292 ʓ 58 1 659 0293 ʔ 51 2 660 0294 ʕ 51 2 661 0295 ʖ 51 2 662 0296 ʗ 51 3 663 0297 ʘ 60 0 664 0298 ʙ 58 0 665 0299 ʚ 68 0 666 029a ʛ 71 2 667 029b ʜ 66 0 668 029c ʝ 37 3 669 029d ʞ 67 1 670 029e ʟ 58 0 671 029f ʠ 73 3 672 02a0 ʡ 51 2 673 02a1 ʢ 51 2 674 02a2 ʣ 101 2 675 02a3 ʤ 106 3 676 02a4 ʥ 101 3 677 02a5 ʦ 82 2 678 02a6 ʧ 61 3 679 02a7 ʨ 78 3 680 02a8 ʩ 85 3 681 02a9 ʪ 64 2 682 02aa ʫ 65 2 683 02ab ʬ 52 2 684 02ac ʭ 52 2 685 02ad ʮ 57 3 686 02ae ʯ 66 3 687 02af ʰ 40 2 688 02b0 ʱ 40 2 689 02b1 ʲ 17 2 690 02b2 ʳ 26 2 691 02b3 ʴ 30 2 692 02b4 ʵ 30 2 693 02b5 ʶ 38 2 694 02b6 ʷ 52 2 695 02b7 ʸ 37 2 696 02b8 ʻ 32 2 699 02bb ʼ 32 2 700 02bc ʾ 31 2 702 02be ʿ 31 2 703 02bf ˀ 37 2 704 02c0 ˁ 37 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 27 2 712 02c8 ˌ 27 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 31 0 722 02d2 ˓ 31 0 723 02d3 ˖ 41 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 32 0 734 02de ˠ 43 2 736 02e0 ˡ 17 2 737 02e1 ˢ 37 2 738 02e2 ˣ 44 2 739 02e3 ˤ 37 2 740 02e4 ˥ 49 2 741 02e5 ˦ 49 2 742 02e6 ˧ 49 2 743 02e7 ˨ 49 2 744 02e8 ˩ 49 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 28 2 884 0374 ͵ 28 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 69 2 902 0386 · 32 0 903 0387 Έ 75 2 904 0388 Ή 87 2 905 0389 Ί 41 2 906 038a Ό 81 2 908 038c Ύ 82 2 910 038e Ώ 83 2 911 038f ΐ 34 2 912 0390 Α 68 2 913 0391 Β 69 2 914 0392 Γ 56 2 915 0393 Δ 68 2 916 0394 Ε 63 2 917 0395 Ζ 69 2 918 0396 Η 75 2 919 0397 Θ 79 2 920 0398 Ι 29 2 921 0399 Κ 66 2 922 039a Λ 68 2 923 039b Μ 86 2 924 039c Ν 75 2 925 039d Ξ 63 2 926 039e Ο 79 2 927 039f Π 75 2 928 03a0 Ρ 60 2 929 03a1 Σ 63 2 931 03a3 Τ 61 2 932 03a4 Υ 61 2 933 03a5 Φ 79 2 934 03a6 Χ 69 2 935 03a7 Ψ 79 2 936 03a8 Ω 76 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 61 2 939 03ab ά 66 2 940 03ac έ 55 2 941 03ad ή 65 3 942 03ae ί 34 2 943 03af ΰ 58 2 944 03b0 α 66 0 945 03b1 β 64 3 946 03b2 γ 59 1 947 03b3 δ 61 2 948 03b4 ε 54 0 949 03b5 ζ 54 3 950 03b6 η 63 1 951 03b7 θ 61 2 952 03b8 ι 34 0 953 03b9 κ 59 0 954 03ba λ 59 2 955 03bb μ 64 1 956 03bc ν 56 0 957 03bd ξ 56 3 958 03be ο 61 0 959 03bf π 60 0 960 03c0 ρ 63 1 961 03c1 ς 59 1 962 03c2 σ 63 0 963 03c3 τ 60 0 964 03c4 υ 58 0 965 03c5 φ 66 1 966 03c6 χ 59 1 967 03c7 ψ 66 1 968 03c8 ω 84 0 969 03c9 ϊ 34 2 970 03ca ϋ 58 2 971 03cb ό 61 2 972 03cc ύ 58 2 973 03cd ώ 84 2 974 03ce ϐ 61 2 976 03d0 ϑ 62 2 977 03d1 ϒ 70 2 978 03d2 ϓ 84 2 979 03d3 ϔ 70 2 980 03d4 ϕ 66 3 981 03d5 ϖ 84 0 982 03d6 ϗ 66 1 983 03d7 Ϙ 79 3 984 03d8 ϙ 61 1 985 03d9 Ϛ 65 3 986 03da ϛ 59 1 987 03db Ϝ 58 2 988 03dc ϝ 46 3 989 03dd Ϟ 66 2 990 03de ϟ 66 2 991 03df Ϡ 87 3 992 03e0 ϡ 63 1 993 03e1 ϰ 66 0 1008 03f0 ϱ 63 1 1009 03f1 ϲ 55 0 1010 03f2 ϳ 28 3 1011 03f3 ϴ 79 2 1012 03f4 ϵ 62 0 1013 03f5 ϶ 62 0 1014 03f6 Ϸ 60 2 1015 03f7 ϸ 63 3 1016 03f8 Ϲ 70 2 1017 03f9 Ϻ 86 2 1018 03fa ϻ 65 1 1019 03fb ϼ 63 1 1020 03fc Ͻ 70 2 1021 03fd Ͼ 70 2 1022 03fe Ͽ 70 2 1023 03ff Ё 63 2 1025 0401 Ђ 79 3 1026 0402 Ѓ 56 2 1027 0403 Є 70 2 1028 0404 Ѕ 63 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 29 3 1032 0408 Љ 109 2 1033 0409 Њ 104 2 1034 040a Ћ 79 2 1035 040b Ќ 66 2 1036 040c Ѝ 75 2 1037 040d Ў 61 2 1038 040e Џ 75 3 1039 040f А 68 2 1040 0410 Б 69 2 1041 0411 В 69 2 1042 0412 Г 56 2 1043 0413 Д 78 3 1044 0414 Е 63 2 1045 0415 Ж 86 2 1046 0416 З 64 2 1047 0417 И 75 2 1048 0418 Й 75 2 1049 0419 К 66 2 1050 041a Л 75 2 1051 041b М 86 2 1052 041c Н 75 2 1053 041d О 79 2 1054 041e П 75 2 1055 041f Р 60 2 1056 0420 С 70 2 1057 0421 Т 61 2 1058 0422 У 61 2 1059 0423 Ф 79 2 1060 0424 Х 69 2 1061 0425 Ц 78 3 1062 0426 Ч 69 2 1063 0427 Ш 100 2 1064 0428 Щ 103 3 1065 0429 Ъ 83 2 1066 042a Ы 88 2 1067 042b Ь 69 2 1068 042c Э 70 2 1069 042d Ю 103 2 1070 042e Я 69 2 1071 042f а 61 0 1072 0430 б 61 2 1073 0431 в 59 0 1074 0432 г 49 0 1075 0433 д 67 1 1076 0434 е 62 0 1077 0435 ж 73 0 1078 0436 з 54 0 1079 0437 и 66 0 1080 0438 й 66 2 1081 0439 к 60 0 1082 043a л 64 0 1083 043b м 75 0 1084 043c н 66 0 1085 043d о 61 0 1086 043e п 66 0 1087 043f р 63 1 1088 0440 с 55 0 1089 0441 т 53 0 1090 0442 у 59 1 1091 0443 ф 92 3 1092 0444 х 59 0 1093 0445 ц 68 1 1094 0446 ч 59 0 1095 0447 ш 87 0 1096 0448 щ 89 1 1097 0449 ъ 70 0 1098 044a ы 77 0 1099 044b ь 59 0 1100 044c э 55 0 1101 044d ю 81 0 1102 044e я 60 0 1103 044f ѐ 62 2 1104 0450 ё 62 2 1105 0451 ђ 64 3 1106 0452 ѓ 49 2 1107 0453 є 55 0 1108 0454 ѕ 52 0 1109 0455 і 28 2 1110 0456 ї 28 2 1111 0457 ј 28 3 1112 0458 љ 90 0 1113 0459 њ 89 0 1114 045a ћ 64 2 1115 045b ќ 60 2 1116 045c ѝ 66 2 1117 045d ў 59 3 1118 045e џ 66 1 1119 045f Ѥ 94 2 1124 0464 ѥ 75 0 1125 0465 Ҋ 77 3 1162 048a ҋ 68 3 1163 048b Ҍ 69 2 1164 048c ҍ 59 2 1165 048d Ґ 56 2 1168 0490 ґ 49 2 1169 0491 Ғ 56 2 1170 0492 ғ 49 0 1171 0493 Ҕ 62 3 1172 0494 ҕ 53 1 1173 0495 Җ 86 3 1174 0496 җ 73 1 1175 0497 Ҙ 64 3 1176 0498 ҙ 54 1 1177 0499 Қ 66 3 1178 049a қ 60 1 1179 049b Ҡ 80 2 1184 04a0 ҡ 72 0 1185 04a1 Ң 75 3 1186 04a2 ң 66 1 1187 04a3 Ҥ 101 2 1188 04a4 ҥ 88 0 1189 04a5 Ҧ 108 3 1190 04a6 ҧ 92 1 1191 04a7 Ҫ 70 3 1194 04aa ҫ 55 1 1195 04ab Ҭ 61 3 1196 04ac ҭ 53 1 1197 04ad Ү 61 2 1198 04ae ү 59 1 1199 04af Ұ 61 2 1200 04b0 ұ 59 1 1201 04b1 Ҳ 69 3 1202 04b2 ҳ 59 1 1203 04b3 Ҵ 93 3 1204 04b4 ҵ 81 1 1205 04b5 Ҷ 69 3 1206 04b6 ҷ 59 1 1207 04b7 Һ 69 2 1210 04ba һ 63 2 1211 04bb Ӏ 28 2 1216 04c0 Ӂ 86 2 1217 04c1 ӂ 73 2 1218 04c2 Ӆ 78 3 1221 04c5 ӆ 67 1 1222 04c6 Ӈ 75 3 1223 04c7 ӈ 66 1 1224 04c8 Ӊ 78 3 1225 04c9 ӊ 68 1 1226 04ca Ӌ 69 3 1227 04cb ӌ 59 1 1228 04cc Ӎ 89 3 1229 04cd ӎ 77 1 1230 04ce Ӑ 68 2 1232 04d0 ӑ 61 2 1233 04d1 Ӓ 68 2 1234 04d2 ӓ 61 2 1235 04d3 Ӕ 97 2 1236 04d4 ӕ 98 0 1237 04d5 Ӗ 63 2 1238 04d6 ӗ 62 2 1239 04d7 Ә 79 2 1240 04d8 ә 62 0 1241 04d9 Ӛ 79 2 1242 04da ӛ 62 2 1243 04db Ӝ 86 2 1244 04dc ӝ 73 2 1245 04dd Ӟ 64 2 1246 04de ӟ 54 2 1247 04df Ӡ 67 2 1248 04e0 ӡ 58 1 1249 04e1 Ӣ 75 2 1250 04e2 ӣ 66 2 1251 04e3 Ӥ 75 2 1252 04e4 ӥ 66 2 1253 04e5 Ӧ 79 2 1254 04e6 ӧ 61 2 1255 04e7 Ө 79 2 1256 04e8 ө 61 0 1257 04e9 Ӫ 79 2 1258 04ea ӫ 61 2 1259 04eb Ӭ 70 2 1260 04ec ӭ 55 2 1261 04ed Ӯ 61 2 1262 04ee ӯ 59 3 1263 04ef Ӱ 61 2 1264 04f0 ӱ 59 3 1265 04f1 Ӳ 61 2 1266 04f2 ӳ 59 3 1267 04f3 Ӵ 69 2 1268 04f4 ӵ 59 2 1269 04f5 Ӷ 56 3 1270 04f6 ӷ 49 1 1271 04f7 Ӹ 88 2 1272 04f8 ӹ 77 2 1273 04f9 Ա 87 2 1329 0531 Բ 73 2 1330 0532 Գ 88 2 1331 0533 Դ 88 2 1332 0534 Ե 73 2 1333 0535 Զ 64 3 1334 0536 Է 73 3 1335 0537 Ը 73 3 1336 0538 Թ 85 2 1337 0539 Ժ 88 2 1338 053a Ի 73 2 1339 053b Լ 63 3 1340 053c Խ 82 2 1341 053d Ծ 99 2 1342 053e Կ 73 2 1343 053f Հ 71 3 1344 0540 Ձ 64 2 1345 0541 Ղ 88 3 1346 0542 Ճ 78 2 1347 0543 Մ 88 2 1348 0544 Յ 73 2 1349 0545 Ն 84 2 1350 0546 Շ 73 2 1351 0547 Ո 73 2 1352 0548 Չ 73 3 1353 0549 Պ 79 2 1354 054a Ջ 64 3 1355 054b Ռ 88 2 1356 054c Ս 73 2 1357 054d Վ 88 3 1358 054e Տ 63 2 1359 054f Ր 73 2 1360 0550 Ց 73 2 1361 0551 Ւ 80 2 1362 0552 Փ 79 2 1363 0553 Ք 79 2 1364 0554 Օ 79 2 1365 0555 Ֆ 63 2 1366 0556 ՙ 31 2 1369 0559 ՚ 32 2 1370 055a ՛ 50 2 1371 055b ՜ 50 2 1372 055c ՝ 39 2 1373 055d ՞ 53 2 1374 055e ՟ 50 2 1375 055f ա 97 0 1377 0561 բ 63 1 1378 0562 գ 66 1 1379 0563 դ 67 1 1380 0564 զ 66 1 1382 0566 է 55 3 1383 0567 ը 63 1 1384 0568 թ 68 1 1385 0569 ժ 67 2 1386 056a ի 63 3 1387 056b լ 38 1 1388 056c խ 97 3 1389 056d ծ 63 2 1390 056e կ 63 3 1391 056f հ 63 2 1392 0570 ձ 63 2 1393 0571 ղ 67 1 1394 0572 ճ 63 2 1395 0573 մ 66 2 1396 0574 յ 28 1 1397 0575 ն 76 2 1398 0576 շ 52 1 1399 0577 ո 63 0 1400 0578 չ 45 1 1401 0579 պ 97 1 1402 057a ջ 52 1 1403 057b ռ 63 0 1404 057c ս 63 0 1405 057d վ 66 3 1406 057e տ 97 0 1407 057f ր 63 1 1408 0580 ց 63 1 1409 0581 ւ 38 0 1410 0582 փ 97 3 1411 0583 ք 65 1 1412 0584 օ 61 0 1413 0585 ֆ 61 3 1414 0586 և 70 2 1415 0587 ։ 34 0 1417 0589 ֊ 53 0 1418 058a ᴂ 98 0 7426 1d02 ᴈ 54 0 7432 1d08 ᴉ 28 1 7433 1d09 ᴔ 102 0 7444 1d14 ᴖ 61 0 7446 1d16 ᴗ 61 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 64 1 7455 1d1f ᵃ 39 2 7491 1d43 ᵄ 39 2 7492 1d44 ᵅ 41 2 7493 1d45 ᵆ 65 2 7494 1d46 ᵇ 43 2 7495 1d47 ᵈ 41 2 7496 1d48 ᵉ 42 2 7497 1d49 ᵊ 42 2 7498 1d4a ᵋ 36 2 7499 1d4b ᵌ 36 2 7500 1d4c ᵍ 41 2 7501 1d4d ᵎ 18 2 7502 1d4e ᵏ 43 2 7503 1d4f ᵐ 62 2 7504 1d50 ᵑ 41 2 7505 1d51 ᵒ 41 2 7506 1d52 ᵓ 37 2 7507 1d53 ᵔ 41 2 7508 1d54 ᵕ 41 0 7509 1d55 ᵖ 43 2 7510 1d56 ᵗ 29 2 7511 1d57 ᵘ 40 2 7512 1d58 ᵙ 47 2 7513 1d59 ᵚ 62 2 7514 1d5a ᵛ 42 2 7515 1d5b ᵷ 63 1 7543 1d77 ᵻ 37 0 7547 1d7b ᶅ 28 3 7557 1d85 ᶛ 41 2 7579 1d9b ᶜ 37 2 7580 1d9c ᶝ 37 2 7581 1d9d ᶞ 41 2 7582 1d9e ᶟ 36 2 7583 1d9f ᶠ 30 2 7584 1da0 ᶡ 23 2 7585 1da1 ᶢ 41 2 7586 1da2 ᶣ 40 2 7587 1da3 ᶤ 26 2 7588 1da4 ᶥ 25 2 7589 1da5 ᶦ 26 2 7590 1da6 ᶧ 26 2 7591 1da7 ᶨ 23 2 7592 1da8 ᶩ 25 2 7593 1da9 ᶪ 23 2 7594 1daa ᶫ 38 2 7595 1dab ᶬ 62 2 7596 1dac ᶭ 62 2 7597 1dad ᶮ 41 2 7598 1dae ᶯ 48 2 7599 1daf ᶰ 41 2 7600 1db0 ᶱ 41 2 7601 1db1 ᶲ 41 2 7602 1db2 ᶳ 36 2 7603 1db3 ᶴ 29 2 7604 1db4 ᶵ 29 2 7605 1db5 ᶶ 51 2 7606 1db6 ᶷ 42 2 7607 1db7 ᶹ 41 2 7609 1db9 ᶺ 42 2 7610 1dba ᶻ 37 2 7611 1dbb ᶼ 44 2 7612 1dbc ᶽ 37 2 7613 1dbd ᶾ 39 2 7614 1dbe ᶿ 41 2 7615 1dbf Ḍ 77 3 7692 1e0c ḍ 63 3 7693 1e0d Ḓ 77 3 7698 1e12 ḓ 63 3 7699 1e13 Ḥ 75 3 7716 1e24 ḥ 63 3 7717 1e25 Ḷ 56 3 7734 1e36 ḷ 28 3 7735 1e37 Ḹ 56 3 7736 1e38 ḹ 28 3 7737 1e39 Ḽ 56 3 7740 1e3c ḽ 28 3 7741 1e3d ṁ 97 2 7745 1e41 Ṃ 86 3 7746 1e42 ṃ 97 1 7747 1e43 Ṅ 75 2 7748 1e44 ṅ 63 2 7749 1e45 Ṇ 75 3 7750 1e46 ṇ 63 1 7751 1e47 Ṋ 75 3 7754 1e4a ṋ 63 1 7755 1e4b ṗ 63 3 7767 1e57 Ṛ 69 3 7770 1e5a ṛ 41 1 7771 1e5b Ṝ 69 3 7772 1e5c ṝ 41 3 7773 1e5d ṡ 52 2 7777 1e61 Ṣ 63 3 7778 1e62 ṣ 52 1 7779 1e63 Ṭ 61 3 7788 1e6c ṭ 39 3 7789 1e6d Ṱ 61 3 7792 1e70 ṱ 39 3 7793 1e71 Ṿ 68 3 7806 1e7e ṿ 59 1 7807 1e7f Ẁ 99 2 7808 1e80 ẁ 82 2 7809 1e81 Ẃ 99 2 7810 1e82 ẃ 82 2 7811 1e83 Ẅ 99 2 7812 1e84 ẅ 82 2 7813 1e85 Ẹ 63 3 7864 1eb8 ẹ 62 1 7865 1eb9 Ị 29 3 7882 1eca ị 28 3 7883 1ecb Ọ 79 3 7884 1ecc ọ 61 1 7885 1ecd Ụ 73 3 7908 1ee4 ụ 63 1 7909 1ee5 Ỳ 61 2 7922 1ef2 ỳ 59 3 7923 1ef3 ἁ 66 2 7937 1f01 ἂ 66 2 7938 1f02 ἃ 66 2 7939 1f03 ἄ 66 2 7940 1f04 ἅ 66 2 7941 1f05 ἆ 66 2 7942 1f06 ἇ 66 2 7943 1f07 Ἀ 68 2 7944 1f08 Ἁ 68 2 7945 1f09 Ἂ 88 2 7946 1f0a Ἃ 88 2 7947 1f0b Ἄ 77 2 7948 1f0c Ἅ 80 2 7949 1f0d Ἆ 71 2 7950 1f0e Ἇ 74 2 7951 1f0f ἐ 54 2 7952 1f10 ἑ 54 2 7953 1f11 ἒ 54 2 7954 1f12 ἓ 54 2 7955 1f13 ἔ 54 2 7956 1f14 ἕ 54 2 7957 1f15 Ἐ 71 2 7960 1f18 Ἑ 71 2 7961 1f19 Ἒ 97 2 7962 1f1a Ἓ 97 2 7963 1f1b Ἔ 90 2 7964 1f1c Ἕ 93 2 7965 1f1d ἠ 63 3 7968 1f20 ἡ 63 3 7969 1f21 ἢ 63 3 7970 1f22 ἣ 63 3 7971 1f23 ἤ 63 3 7972 1f24 ἥ 63 3 7973 1f25 ἦ 63 3 7974 1f26 ἧ 63 3 7975 1f27 Ἠ 84 2 7976 1f28 Ἡ 84 2 7977 1f29 Ἢ 109 2 7978 1f2a Ἣ 109 2 7979 1f2b Ἤ 103 2 7980 1f2c Ἥ 105 2 7981 1f2d Ἦ 93 2 7982 1f2e Ἧ 95 2 7983 1f2f ἰ 34 2 7984 1f30 ἱ 34 2 7985 1f31 ἲ 34 2 7986 1f32 ἳ 34 2 7987 1f33 ἴ 34 2 7988 1f34 ἵ 34 2 7989 1f35 ἶ 34 2 7990 1f36 ἷ 34 2 7991 1f37 Ἰ 38 2 7992 1f38 Ἱ 37 2 7993 1f39 Ἲ 63 2 7994 1f3a Ἳ 63 2 7995 1f3b Ἴ 57 2 7996 1f3c Ἵ 60 2 7997 1f3d Ἶ 49 2 7998 1f3e Ἷ 49 2 7999 1f3f ὀ 61 2 8000 1f40 ὁ 61 2 8001 1f41 ὂ 61 2 8002 1f42 ὃ 61 2 8003 1f43 ὄ 61 2 8004 1f44 ὅ 61 2 8005 1f45 Ὀ 80 2 8008 1f48 Ὁ 85 2 8009 1f49 Ὂ 109 2 8010 1f4a Ὃ 110 2 8011 1f4b Ὄ 94 2 8012 1f4c Ὅ 97 2 8013 1f4d ὐ 58 2 8016 1f50 ὑ 58 2 8017 1f51 ὒ 58 2 8018 1f52 ὓ 58 2 8019 1f53 ὔ 58 2 8020 1f54 ὕ 58 2 8021 1f55 ὖ 58 2 8022 1f56 ὗ 58 2 8023 1f57 Ὑ 78 2 8025 1f59 Ὓ 100 2 8027 1f5b Ὕ 101 2 8029 1f5d Ὗ 90 2 8031 1f5f ὠ 84 2 8032 1f60 ὡ 84 2 8033 1f61 ὢ 84 2 8034 1f62 ὣ 84 2 8035 1f63 ὤ 84 2 8036 1f64 ὥ 84 2 8037 1f65 ὦ 84 2 8038 1f66 ὧ 84 2 8039 1f67 Ὠ 80 2 8040 1f68 Ὡ 84 2 8041 1f69 Ὢ 109 2 8042 1f6a Ὣ 110 2 8043 1f6b Ὤ 95 2 8044 1f6c Ὥ 97 2 8045 1f6d Ὦ 92 2 8046 1f6e Ὧ 95 2 8047 1f6f ὰ 66 2 8048 1f70 ά 66 2 8049 1f71 ὲ 54 2 8050 1f72 έ 55 2 8051 1f73 ὴ 63 3 8052 1f74 ή 65 3 8053 1f75 ὶ 34 2 8054 1f76 ί 34 2 8055 1f77 ὸ 61 2 8056 1f78 ό 61 2 8057 1f79 ὺ 58 2 8058 1f7a ύ 58 2 8059 1f7b ὼ 84 2 8060 1f7c ώ 84 2 8061 1f7d ᾀ 66 3 8064 1f80 ᾁ 66 3 8065 1f81 ᾂ 66 3 8066 1f82 ᾃ 66 3 8067 1f83 ᾄ 66 3 8068 1f84 ᾅ 66 3 8069 1f85 ᾆ 66 3 8070 1f86 ᾇ 66 3 8071 1f87 ᾈ 68 3 8072 1f88 ᾉ 68 3 8073 1f89 ᾊ 88 3 8074 1f8a ᾋ 88 3 8075 1f8b ᾌ 77 3 8076 1f8c ᾍ 80 3 8077 1f8d ᾎ 71 3 8078 1f8e ᾏ 74 3 8079 1f8f ᾐ 63 3 8080 1f90 ᾑ 63 3 8081 1f91 ᾒ 63 3 8082 1f92 ᾓ 63 3 8083 1f93 ᾔ 63 3 8084 1f94 ᾕ 63 3 8085 1f95 ᾖ 63 3 8086 1f96 ᾗ 63 3 8087 1f97 ᾘ 84 3 8088 1f98 ᾙ 84 3 8089 1f99 ᾚ 109 3 8090 1f9a ᾛ 109 3 8091 1f9b ᾜ 103 3 8092 1f9c ᾝ 105 3 8093 1f9d ᾞ 93 3 8094 1f9e ᾟ 95 3 8095 1f9f ᾠ 84 3 8096 1fa0 ᾡ 84 3 8097 1fa1 ᾢ 84 3 8098 1fa2 ᾣ 84 3 8099 1fa3 ᾤ 84 3 8100 1fa4 ᾥ 84 3 8101 1fa5 ᾦ 84 3 8102 1fa6 ᾧ 84 3 8103 1fa7 ᾨ 80 3 8104 1fa8 ᾩ 84 3 8105 1fa9 ᾪ 109 3 8106 1faa ᾫ 110 3 8107 1fab ᾬ 95 3 8108 1fac ᾭ 97 3 8109 1fad ᾮ 92 3 8110 1fae ᾯ 95 3 8111 1faf ᾰ 66 2 8112 1fb0 ᾱ 66 2 8113 1fb1 ᾲ 66 3 8114 1fb2 ᾳ 66 1 8115 1fb3 ᾴ 66 3 8116 1fb4 ᾶ 66 2 8118 1fb6 ᾷ 66 3 8119 1fb7 Ᾰ 68 2 8120 1fb8 Ᾱ 68 2 8121 1fb9 Ὰ 72 2 8122 1fba Ά 69 2 8123 1fbb ᾼ 68 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 63 3 8130 1fc2 ῃ 63 1 8131 1fc3 ῄ 65 3 8132 1fc4 ῆ 63 3 8134 1fc6 ῇ 63 3 8135 1fc7 Ὲ 80 2 8136 1fc8 Έ 75 2 8137 1fc9 Ὴ 93 2 8138 1fca Ή 87 2 8139 1fcb ῌ 75 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 34 2 8144 1fd0 ῑ 34 2 8145 1fd1 ῒ 34 2 8146 1fd2 ΐ 34 2 8147 1fd3 ῖ 34 2 8150 1fd6 ῗ 34 2 8151 1fd7 Ῐ 29 2 8152 1fd8 Ῑ 29 2 8153 1fd9 Ὶ 48 2 8154 1fda Ί 41 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 58 2 8160 1fe0 ῡ 58 2 8161 1fe1 ῢ 58 2 8162 1fe2 ΰ 58 2 8163 1fe3 ῤ 63 3 8164 1fe4 ῥ 63 3 8165 1fe5 ῦ 58 2 8166 1fe6 ῧ 58 2 8167 1fe7 Ῠ 61 2 8168 1fe8 Ῡ 61 2 8169 1fe9 Ὺ 85 2 8170 1fea Ύ 82 2 8171 1feb Ῥ 69 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 84 3 8178 1ff2 ῳ 84 1 8179 1ff3 ῴ 84 3 8180 1ff4 ῶ 84 2 8182 1ff6 ῷ 84 3 8183 1ff7 Ὸ 94 2 8184 1ff8 Ό 81 2 8185 1ff9 Ὼ 92 2 8186 1ffa Ώ 83 2 8187 1ffb ῼ 76 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 36 0 8208 2010 ‑ 36 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 32 2 8216 2018 ` " ‘ " ’ 32 2 8217 2019 ' " ’ " ‚ 32 1 8218 201a ‛ 32 2 8219 201b “ 52 2 8220 201c ” 52 2 8221 201d „ 52 1 8222 201e ‟ 52 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 59 0 8226 2022 ‣ 59 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‰ 134 2 8240 2030 ‱ 174 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 49 2 8252 203c ‽ 53 2 8253 203d ‾ 50 2 8254 203e ⁇ 92 2 8263 2047 ⁈ 73 2 8264 2048 ⁉ 73 2 8265 2049 ⁰ 40 2 8304 2070 ⁴ 40 2 8308 2074 ⁵ 40 2 8309 2075 ⁶ 40 2 8310 2076 ⁷ 40 2 8311 2077 ⁸ 40 2 8312 2078 ⁹ 40 2 8313 2079 ⁿ 40 2 8319 207f ₦ 75 2 8358 20a6 € 64 2 8364 20ac ₵ 64 3 8373 20b5 ℃ 112 2 8451 2103 № 116 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 76 2 8486 2126 ℧ 76 2 8487 2127 K 66 2 8490 212a Å 68 2 8491 212b Ⅎ 58 2 8498 2132 ⅋ 78 2 8523 214b Ⅰ 29 2 8544 2160 Ⅱ 49 2 8545 2161 Ⅲ 69 2 8546 2162 Ⅳ 92 2 8547 2163 Ⅴ 68 2 8548 2164 Ⅵ 92 2 8549 2165 Ⅶ 112 2 8550 2166 Ⅷ 132 2 8551 2167 Ⅸ 92 2 8552 2168 Ⅹ 69 2 8553 2169 Ⅺ 93 2 8554 216a Ⅻ 113 2 8555 216b Ⅼ 56 2 8556 216c Ⅽ 70 2 8557 216d Ⅾ 77 2 8558 216e Ⅿ 86 2 8559 216f ⅰ 28 2 8560 2170 ⅱ 46 2 8561 2171 ⅲ 64 2 8562 2172 ⅳ 81 2 8563 2173 ⅴ 59 0 8564 2174 ⅵ 81 2 8565 2175 ⅶ 99 2 8566 2176 ⅷ 117 2 8567 2177 ⅸ 82 2 8568 2178 ⅹ 59 0 8569 2179 ⅺ 82 2 8570 217a ⅻ 100 2 8571 217b ⅼ 28 2 8572 217c ⅽ 55 0 8573 217d ⅾ 63 2 8574 217e ⅿ 97 0 8575 217f ↀ 125 2 8576 2180 Ↄ 70 2 8579 2183 ∂ 52 2 8706 2202 pd " ∃ 63 2 8707 2203 te " ∆ 67 2 8710 2206 ∇ 67 2 8711 2207 gr " ∊ 79 0 8714 220a ∍ 79 0 8717 220d st " ∏ 76 3 8719 220f ∐ 76 3 8720 2210 ∑ 67 3 8721 2211 − 84 0 8722 2212 ∓ 84 2 8723 2213 ∕ 17 2 8725 2215 ∗ 63 0 8727 2217 ** " ∘ 63 0 8728 2218 ∙ 32 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 68 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 73 0 8743 2227 l∧ 73 0 8743 2227 " ∨ 73 0 8744 2228 l| " ∩ 73 0 8745 2229 ca " ∪ 73 0 8746 222a cu " ∫ 52 3 8747 222b is " ∬ 85 3 8748 222c ∭ 118 3 8749 222d ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≣ 84 2 8803 2263 ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 63 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 100 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 52 3 8992 2320 ⌡ 52 3 8993 2321 ⌥ 100 2 8997 2325 〈 39 3 9001 2329 〉 39 3 9002 232a ⍽ 76 1 9085 237d ⎮ 52 3 9134 23ae ⏏ 77 0 9167 23cf ␢ 63 2 9250 2422 ␣ 63 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 59 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 59 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⚀ 87 2 9856 2680 ⚁ 87 2 9857 2681 ⚂ 87 2 9858 2682 ⚃ 87 2 9859 2683 ⚄ 87 2 9860 2684 ⚅ 87 2 9861 2685 ⟠ 49 3 10208 27e0 ⟨ 39 3 10216 27e8 ⟩ 39 3 10217 27e9 ⟪ 56 3 10218 27ea ⟫ 56 3 10219 27eb ⧫ 49 3 10731 29eb ⨌ 151 3 10764 2a0c ⨍ 52 3 10765 2a0d ⨎ 52 3 10766 2a0e ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 63 2 64257 fb01 fl 63 2 64258 fb02 ffi 97 2 64259 fb03 ffl 97 2 64260 fb04 ﬓ 120 2 64275 fb13 ﬔ 120 2 64276 fb14 ﬕ 120 3 64277 fb15 ﬖ 119 3 64278 fb16 ﬗ 153 3 64279 fb17 � 103 3 65533 fffd 9base-6/troff/font/devutf/DejaVuMonoSansBold0000644000175000017500000005075511402154555020525 0ustar anselmanselmname DejaVuMonoSansBold fontname DejaVuMonoSansBold ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 0 60 003c = 60 0 61 003d > 60 0 62 003e ? 60 2 63 003f @ 60 3 64 0040 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e   60 0 160 00a0 ¡ 60 2 161 00a1 ¢ 60 3 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 2 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 3 188 00bc ½ 60 3 189 00bd ¾ 60 3 190 00be ¿ 60 2 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 0 247 00f7 -: " di " ø 60 3 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f Ɓ 60 2 385 0181 Ƃ 60 2 386 0182 ƃ 60 2 387 0183 Ƅ 60 2 388 0184 ƅ 60 2 389 0185 Ɔ 60 2 390 0186 Ƈ 60 2 391 0187 ƈ 60 2 392 0188 Ɖ 60 2 393 0189 Ɗ 60 2 394 018a Ƌ 60 2 395 018b ƌ 60 2 396 018c ƍ 60 1 397 018d Ǝ 60 2 398 018e Ə 60 2 399 018f Ɛ 60 2 400 0190 Ƒ 60 3 401 0191 ƒ 60 3 402 0192 Ɠ 60 2 403 0193 Ɣ 60 3 404 0194 ƕ 60 2 405 0195 Ɩ 60 2 406 0196 Ɨ 60 2 407 0197 Ƙ 60 2 408 0198 ƙ 60 2 409 0199 ƚ 60 2 410 019a ƛ 60 2 411 019b Ɯ 60 2 412 019c Ɲ 60 3 413 019d ƞ 60 1 414 019e Ɵ 60 2 415 019f Ơ 60 2 416 01a0 ơ 60 0 417 01a1 Ƣ 60 2 418 01a2 ƣ 60 1 419 01a3 Ƥ 60 2 420 01a4 ƥ 60 3 421 01a5 Ʀ 60 3 422 01a6 Ƨ 60 2 423 01a7 ƨ 60 0 424 01a8 Ʃ 60 2 425 01a9 ƪ 60 3 426 01aa ƫ 60 3 427 01ab Ƭ 60 2 428 01ac ƭ 60 2 429 01ad Ʈ 60 3 430 01ae Ư 60 2 431 01af ư 60 0 432 01b0 Ʊ 60 2 433 01b1 Ʋ 60 2 434 01b2 Ƴ 60 2 435 01b3 ƴ 60 1 436 01b4 Ƶ 60 2 437 01b5 ƶ 60 0 438 01b6 Ʒ 60 2 439 01b7 Ƹ 60 2 440 01b8 ƹ 60 1 441 01b9 ƻ 60 2 443 01bb Ƽ 60 2 444 01bc ƽ 60 1 445 01bd ƾ 60 2 446 01be ǀ 60 2 448 01c0 ǁ 60 2 449 01c1 ǂ 60 2 450 01c2 ǃ 60 2 451 01c3 Ǎ 60 2 461 01cd ǎ 60 2 462 01ce Ǐ 60 2 463 01cf ǐ 60 2 464 01d0 Ǒ 60 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 60 2 467 01d3 ǔ 60 2 468 01d4 ǖ 60 2 470 01d6 Ǘ 60 2 471 01d7 ǘ 60 2 472 01d8 Ǚ 60 2 473 01d9 ǚ 60 2 474 01da Ǜ 60 2 475 01db ǜ 60 2 476 01dc ǝ 60 0 477 01dd ǟ 60 2 479 01df Ǣ 60 2 482 01e2 ǣ 60 2 483 01e3 Ǫ 60 3 490 01ea ǫ 60 1 491 01eb Ǭ 60 3 492 01ec ǭ 60 3 493 01ed Ƕ 60 2 502 01f6 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b Ȥ 60 3 548 0224 ȥ 60 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 60 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 60 2 562 0232 ȳ 60 3 563 0233 ȷ 60 1 567 0237 ȸ 60 2 568 0238 ȹ 60 1 569 0239 Ⱥ 60 2 570 023a Ȼ 60 2 571 023b ȼ 60 3 572 023c Ƚ 60 2 573 023d Ⱦ 60 2 574 023e ȿ 60 1 575 023f ɀ 60 1 576 0240 Ɂ 60 2 577 0241 ɐ 60 0 592 0250 ɑ 60 0 593 0251 ɒ 60 0 594 0252 ɓ 60 2 595 0253 ɔ 60 0 596 0254 ɕ 60 1 597 0255 ɖ 60 3 598 0256 ɗ 60 2 599 0257 ɘ 60 0 600 0258 ə 60 0 601 0259 ɚ 60 0 602 025a ɛ 60 0 603 025b ɜ 60 0 604 025c ɝ 60 0 605 025d ɞ 60 0 606 025e ɟ 60 1 607 025f ɠ 60 3 608 0260 ɡ 60 1 609 0261 ɢ 60 0 610 0262 ɣ 60 1 611 0263 ɤ 60 1 612 0264 ɥ 60 1 613 0265 ɦ 60 2 614 0266 ɧ 60 3 615 0267 ɨ 60 2 616 0268 ɩ 60 0 617 0269 ɪ 60 0 618 026a ɫ 60 2 619 026b ɬ 60 2 620 026c ɭ 60 3 621 026d ɮ 60 3 622 026e ɯ 60 0 623 026f ɰ 60 1 624 0270 ɱ 60 1 625 0271 ɲ 60 1 626 0272 ɳ 60 1 627 0273 ɴ 60 0 628 0274 ɵ 60 0 629 0275 ɶ 60 0 630 0276 ɷ 60 0 631 0277 ɸ 60 3 632 0278 ɹ 60 0 633 0279 ɺ 60 2 634 027a ɻ 60 1 635 027b ɼ 60 1 636 027c ɽ 60 1 637 027d ɾ 60 0 638 027e ɿ 60 0 639 027f ʀ 60 0 640 0280 ʁ 60 0 641 0281 ʂ 60 1 642 0282 ʃ 60 3 643 0283 ʄ 60 3 644 0284 ʅ 60 3 645 0285 ʆ 60 3 646 0286 ʇ 60 1 647 0287 ʈ 60 3 648 0288 ʉ 60 0 649 0289 ʊ 60 1 650 028a ʋ 60 0 651 028b ʌ 60 0 652 028c ʍ 60 0 653 028d ʎ 60 2 654 028e ʏ 60 0 655 028f ʐ 60 1 656 0290 ʑ 60 1 657 0291 ʒ 60 1 658 0292 ʓ 60 1 659 0293 ʔ 60 2 660 0294 ʕ 60 2 661 0295 ʖ 60 2 662 0296 ʗ 60 3 663 0297 ʘ 60 0 664 0298 ʙ 60 0 665 0299 ʚ 60 0 666 029a ʛ 60 2 667 029b ʜ 60 0 668 029c ʝ 60 3 669 029d ʞ 60 1 670 029e ʟ 60 0 671 029f ʠ 60 3 672 02a0 ʡ 60 2 673 02a1 ʢ 60 2 674 02a2 ʣ 60 2 675 02a3 ʤ 60 3 676 02a4 ʥ 60 3 677 02a5 ʦ 60 2 678 02a6 ʧ 60 3 679 02a7 ʨ 60 3 680 02a8 ʩ 60 3 681 02a9 ʪ 60 2 682 02aa ʫ 60 2 683 02ab ʬ 60 2 684 02ac ʭ 60 2 685 02ad ʮ 60 3 686 02ae ʯ 60 3 687 02af ʰ 60 2 688 02b0 ʱ 60 2 689 02b1 ʲ 60 2 690 02b2 ʳ 60 2 691 02b3 ʴ 60 2 692 02b4 ʵ 60 2 693 02b5 ʶ 60 2 694 02b6 ʷ 60 2 695 02b7 ʸ 60 2 696 02b8 ʻ 60 2 699 02bb ʼ 60 2 700 02bc ʾ 60 2 702 02be ʿ 60 2 703 02bf ˀ 60 2 704 02c0 ˁ 60 2 705 02c1 ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˈ 60 2 712 02c8 ˌ 60 1 716 02cc ː 60 0 720 02d0 ˑ 60 0 721 02d1 ˒ 60 0 722 02d2 ˓ 60 0 723 02d3 ˖ 60 0 726 02d6 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ˞ 60 0 734 02de ˠ 60 2 736 02e0 ˡ 60 2 737 02e1 ˢ 60 2 738 02e2 ˣ 60 2 739 02e3 ˤ 60 2 740 02e4 ˥ 60 2 741 02e5 ˦ 60 2 742 02e6 ˧ 60 2 743 02e7 ˨ 60 2 744 02e8 ˩ 60 2 745 02e9 ́ 60 2 769 0301 ̂ 60 2 770 0302 ̃ 60 2 771 0303 ̄ 60 2 772 0304 ̅ 60 2 773 0305 ̆ 60 2 774 0306 ̇ 60 2 775 0307 ̈ 60 2 776 0308 ̉ 60 2 777 0309 ̊ 60 2 778 030a ̋ 60 2 779 030b ̌ 60 2 780 030c ̍ 60 2 781 030d ̎ 60 2 782 030e ̏ 60 2 783 030f ̐ 60 2 784 0310 ̑ 60 2 785 0311 ̒ 60 0 786 0312 ̓ 60 2 787 0313 ̔ 60 2 788 0314 ̕ 60 2 789 0315 ̖ 60 1 790 0316 ̗ 60 1 791 0317 ̘ 60 1 792 0318 ̙ 60 1 793 0319 ̚ 60 2 794 031a ̛ 60 0 795 031b ̜ 60 1 796 031c ̝ 60 1 797 031d ̞ 60 1 798 031e ̟ 60 1 799 031f ̠ 60 1 800 0320 ̡ 60 1 801 0321 ̢ 60 1 802 0322 ̣ 60 1 803 0323 ̤ 60 1 804 0324 ̥ 60 1 805 0325 ̦ 60 1 806 0326 ̧ 60 1 807 0327 ̨ 60 1 808 0328 ̩ 60 1 809 0329 ̪ 60 1 810 032a ̫ 60 1 811 032b ̬ 60 1 812 032c ̭ 60 1 813 032d ̮ 60 1 814 032e ̯ 60 1 815 032f ̰ 60 1 816 0330 ̱ 60 1 817 0331 ̲ 60 1 818 0332 ̳ 60 1 819 0333 ̴ 60 0 820 0334 ̵ 60 0 821 0335 ̶ 60 0 822 0336 ̷ 60 3 823 0337 ̸ 60 2 824 0338 ̹ 60 1 825 0339 ̺ 60 1 826 033a ̻ 60 1 827 033b ̼ 60 1 828 033c ̽ 60 2 829 033d ̾ 60 2 830 033e ̿ 60 2 831 033f ͘ 60 2 856 0358 ͡ 60 2 865 0361 ʹ 60 2 884 0374 ͵ 60 1 885 0375 ͺ 60 1 890 037a ; 60 1 894 037e ΄ 60 2 900 0384 ΅ 60 2 901 0385 Ά 60 2 902 0386 · 60 0 903 0387 Έ 60 2 904 0388 Ή 60 2 905 0389 Ί 60 2 906 038a Ό 60 2 908 038c Ύ 60 2 910 038e Ώ 60 2 911 038f ΐ 60 2 912 0390 Α 60 2 913 0391 Β 60 2 914 0392 Γ 60 2 915 0393 Δ 60 2 916 0394 Ε 60 2 917 0395 Ζ 60 2 918 0396 Η 60 2 919 0397 Θ 60 2 920 0398 Ι 60 2 921 0399 Κ 60 2 922 039a Λ 60 2 923 039b Μ 60 2 924 039c Ν 60 2 925 039d Ξ 60 2 926 039e Ο 60 2 927 039f Π 60 2 928 03a0 Ρ 60 2 929 03a1 Σ 60 2 931 03a3 Τ 60 2 932 03a4 Υ 60 2 933 03a5 Φ 60 2 934 03a6 Χ 60 2 935 03a7 Ψ 60 2 936 03a8 Ω 60 2 937 03a9 Ϊ 60 2 938 03aa Ϋ 60 2 939 03ab ά 60 2 940 03ac έ 60 2 941 03ad ή 60 3 942 03ae ί 60 2 943 03af ΰ 60 2 944 03b0 α 60 0 945 03b1 β 60 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 60 0 949 03b5 ζ 60 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 60 0 953 03b9 κ 60 0 954 03ba λ 60 2 955 03bb μ 60 1 956 03bc ν 60 0 957 03bd ξ 60 3 958 03be ο 60 0 959 03bf π 60 0 960 03c0 ρ 60 1 961 03c1 ς 60 1 962 03c2 σ 60 0 963 03c3 τ 60 0 964 03c4 υ 60 0 965 03c5 φ 60 1 966 03c6 χ 60 1 967 03c7 ψ 60 1 968 03c8 ω 60 0 969 03c9 ϊ 60 2 970 03ca ϋ 60 2 971 03cb ό 60 2 972 03cc ύ 60 2 973 03cd ώ 60 2 974 03ce ϐ 60 2 976 03d0 ϑ 60 2 977 03d1 ϒ 60 2 978 03d2 ϓ 60 2 979 03d3 ϔ 60 2 980 03d4 ϕ 60 3 981 03d5 ϖ 60 0 982 03d6 ϗ 60 1 983 03d7 Ϙ 60 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 60 3 986 03da ϛ 60 1 987 03db Ϝ 60 2 988 03dc ϝ 60 3 989 03dd Ϟ 60 2 990 03de ϟ 60 2 991 03df Ϡ 60 3 992 03e0 ϡ 60 1 993 03e1 ϰ 60 0 1008 03f0 ϱ 60 1 1009 03f1 ϲ 60 0 1010 03f2 ϳ 60 3 1011 03f3 ϴ 60 2 1012 03f4 ϵ 60 0 1013 03f5 ϶ 60 0 1014 03f6 Ϸ 60 2 1015 03f7 ϸ 60 3 1016 03f8 Ϲ 60 2 1017 03f9 Ϻ 60 2 1018 03fa ϻ 60 1 1019 03fb ϼ 60 1 1020 03fc Ͻ 60 2 1021 03fd Ͼ 60 2 1022 03fe Ͽ 60 2 1023 03ff Ё 60 2 1025 0401 Ђ 60 3 1026 0402 Ѓ 60 2 1027 0403 Є 60 2 1028 0404 Ѕ 60 2 1029 0405 І 60 2 1030 0406 Ї 60 2 1031 0407 Ј 60 2 1032 0408 Љ 60 2 1033 0409 Њ 60 2 1034 040a Ћ 60 2 1035 040b Ќ 60 2 1036 040c Ѝ 60 2 1037 040d Ў 60 2 1038 040e Џ 60 3 1039 040f А 60 2 1040 0410 Б 60 2 1041 0411 В 60 2 1042 0412 Г 60 2 1043 0413 Д 60 3 1044 0414 Е 60 2 1045 0415 Ж 60 2 1046 0416 З 60 2 1047 0417 И 60 2 1048 0418 Й 60 2 1049 0419 К 60 2 1050 041a Л 60 2 1051 041b М 60 2 1052 041c Н 60 2 1053 041d О 60 2 1054 041e П 60 2 1055 041f Р 60 2 1056 0420 С 60 2 1057 0421 Т 60 2 1058 0422 У 60 2 1059 0423 Ф 60 3 1060 0424 Х 60 2 1061 0425 Ц 60 3 1062 0426 Ч 60 2 1063 0427 Ш 60 2 1064 0428 Щ 60 3 1065 0429 Ъ 60 2 1066 042a Ы 60 2 1067 042b Ь 60 2 1068 042c Э 60 2 1069 042d Ю 60 2 1070 042e Я 60 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 60 0 1074 0432 г 60 0 1075 0433 д 60 1 1076 0434 е 60 0 1077 0435 ж 60 0 1078 0436 з 60 0 1079 0437 и 60 0 1080 0438 й 60 2 1081 0439 к 60 0 1082 043a л 60 0 1083 043b м 60 0 1084 043c н 60 0 1085 043d о 60 0 1086 043e п 60 0 1087 043f р 60 1 1088 0440 с 60 0 1089 0441 т 60 0 1090 0442 у 60 1 1091 0443 ф 60 3 1092 0444 х 60 0 1093 0445 ц 60 1 1094 0446 ч 60 0 1095 0447 ш 60 0 1096 0448 щ 60 1 1097 0449 ъ 60 0 1098 044a ы 60 0 1099 044b ь 60 0 1100 044c э 60 0 1101 044d ю 60 0 1102 044e я 60 0 1103 044f ѐ 60 2 1104 0450 ё 60 2 1105 0451 ђ 60 3 1106 0452 ѓ 60 2 1107 0453 є 60 0 1108 0454 ѕ 60 0 1109 0455 і 60 2 1110 0456 ї 60 2 1111 0457 ј 60 3 1112 0458 љ 60 0 1113 0459 њ 60 0 1114 045a ћ 60 2 1115 045b ќ 60 2 1116 045c ѝ 60 2 1117 045d ў 60 3 1118 045e џ 60 1 1119 045f Ґ 60 2 1168 0490 ґ 60 2 1169 0491 Ғ 60 2 1170 0492 ғ 60 0 1171 0493 Қ 60 3 1178 049a қ 60 1 1179 049b Ҳ 60 3 1202 04b2 ҳ 60 1 1203 04b3 Ӑ 60 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 60 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 60 2 1236 04d4 ӕ 60 0 1237 04d5 Ӗ 60 2 1238 04d6 ӗ 60 2 1239 04d7 Ӡ 60 2 1248 04e0 ӡ 60 1 1249 04e1 Ӧ 60 2 1254 04e6 ӧ 60 2 1255 04e7 ᴂ 60 0 7426 1d02 ᴈ 60 0 7432 1d08 ᴉ 60 1 7433 1d09 ᴔ 60 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 60 0 7453 1d1d ᴞ 60 0 7454 1d1e ᴟ 60 0 7455 1d1f ᵃ 60 2 7491 1d43 ᵄ 60 2 7492 1d44 ᵅ 60 2 7493 1d45 ᵆ 60 2 7494 1d46 ᵇ 60 2 7495 1d47 ᵈ 60 2 7496 1d48 ᵉ 60 2 7497 1d49 ᵊ 60 2 7498 1d4a ᵋ 60 2 7499 1d4b ᵌ 60 2 7500 1d4c ᵍ 60 2 7501 1d4d ᵎ 60 2 7502 1d4e ᵏ 60 2 7503 1d4f ᵐ 60 2 7504 1d50 ᵑ 60 2 7505 1d51 ᵒ 60 2 7506 1d52 ᵓ 60 2 7507 1d53 ᵔ 60 2 7508 1d54 ᵕ 60 0 7509 1d55 ᵖ 60 2 7510 1d56 ᵗ 60 2 7511 1d57 ᵘ 60 2 7512 1d58 ᵙ 60 0 7513 1d59 ᵚ 60 2 7514 1d5a ᵛ 60 2 7515 1d5b ᵷ 60 1 7543 1d77 ᵻ 60 0 7547 1d7b ᶅ 60 3 7557 1d85 ᶛ 60 2 7579 1d9b ᶜ 60 2 7580 1d9c ᶝ 60 2 7581 1d9d ᶞ 60 2 7582 1d9e ᶟ 60 2 7583 1d9f ᶠ 60 2 7584 1da0 ᶡ 60 2 7585 1da1 ᶢ 60 2 7586 1da2 ᶣ 60 2 7587 1da3 ᶤ 60 2 7588 1da4 ᶥ 60 2 7589 1da5 ᶦ 60 2 7590 1da6 ᶧ 60 2 7591 1da7 ᶨ 60 2 7592 1da8 ᶩ 60 2 7593 1da9 ᶪ 60 2 7594 1daa ᶫ 60 2 7595 1dab ᶬ 60 2 7596 1dac ᶭ 60 2 7597 1dad ᶮ 60 2 7598 1dae ᶯ 60 2 7599 1daf ᶰ 60 2 7600 1db0 ᶱ 60 2 7601 1db1 ᶲ 60 2 7602 1db2 ᶳ 60 2 7603 1db3 ᶴ 60 2 7604 1db4 ᶵ 60 2 7605 1db5 ᶶ 60 2 7606 1db6 ᶷ 60 2 7607 1db7 ᶹ 60 2 7609 1db9 ᶺ 60 2 7610 1dba ᶻ 60 2 7611 1dbb ᶼ 60 2 7612 1dbc ᶽ 60 2 7613 1dbd ᶾ 60 2 7614 1dbe ᶿ 60 2 7615 1dbf Ḍ 60 3 7692 1e0c ḍ 60 3 7693 1e0d Ḓ 60 3 7698 1e12 ḓ 60 3 7699 1e13 Ḥ 60 3 7716 1e24 ḥ 60 3 7717 1e25 Ḷ 60 3 7734 1e36 ḷ 60 3 7735 1e37 Ḹ 60 3 7736 1e38 ḹ 60 3 7737 1e39 Ḽ 60 3 7740 1e3c ḽ 60 3 7741 1e3d ṁ 60 2 7745 1e41 Ṃ 60 3 7746 1e42 ṃ 60 1 7747 1e43 Ṅ 60 2 7748 1e44 ṅ 60 2 7749 1e45 Ṇ 60 3 7750 1e46 ṇ 60 1 7751 1e47 Ṋ 60 3 7754 1e4a ṋ 60 1 7755 1e4b ṗ 60 3 7767 1e57 Ṛ 60 3 7770 1e5a ṛ 60 1 7771 1e5b Ṝ 60 3 7772 1e5c ṝ 60 3 7773 1e5d ṡ 60 2 7777 1e61 Ṣ 60 3 7778 1e62 ṣ 60 1 7779 1e63 Ṭ 60 3 7788 1e6c ṭ 60 3 7789 1e6d Ṱ 60 3 7792 1e70 ṱ 60 3 7793 1e71 Ṿ 60 3 7806 1e7e ṿ 60 1 7807 1e7f Ẁ 60 2 7808 1e80 ẁ 60 2 7809 1e81 Ẃ 60 2 7810 1e82 ẃ 60 2 7811 1e83 Ẅ 60 2 7812 1e84 ẅ 60 2 7813 1e85 Ẹ 60 3 7864 1eb8 ẹ 60 1 7865 1eb9 Ị 60 3 7882 1eca ị 60 3 7883 1ecb Ọ 60 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 60 3 7908 1ee4 ụ 60 1 7909 1ee5 Ỳ 60 2 7922 1ef2 ỳ 60 3 7923 1ef3 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‗ 60 1 8215 2017 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 2 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e ‟ 60 2 8223 201f † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 ‣ 60 0 8227 2023 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‱ 60 2 8241 2031 ‹ 60 0 8249 2039 › 60 0 8250 203a ‼ 60 2 8252 203c ‾ 60 2 8254 203e ⁇ 60 2 8263 2047 ⁈ 60 2 8264 2048 ⁉ 60 2 8265 2049 ⁰ 60 2 8304 2070 ⁴ 60 2 8308 2074 ⁵ 60 2 8309 2075 ⁶ 60 2 8310 2076 ⁷ 60 2 8311 2077 ⁸ 60 2 8312 2078 ⁹ 60 2 8313 2079 ⁿ 60 2 8319 207f ₦ 60 2 8358 20a6 € 60 2 8364 20ac ₵ 60 3 8373 20b5 ™ 60 2 8482 2122 tm " Ω 60 2 8486 2126 K 60 2 8490 212a Å 60 2 8491 212b ∂ 60 2 8706 2202 pd " ∆ 60 2 8710 2206 ∇ 60 2 8711 2207 gr " ∏ 60 3 8719 220f ∑ 60 3 8721 2211 − 60 0 8722 2212 ∕ 60 3 8725 2215 ∙ 60 0 8729 2219 bu " √ 60 2 8730 221a sr " ∝ 60 0 8733 221d pt " ∞ 60 0 8734 221e if " ∟ 60 2 8735 221f ∠ 60 2 8736 2220 an " ∧ 60 0 8743 2227 l∧ 60 0 8743 2227 " ∨ 60 0 8744 2228 l| " ∩ 60 0 8745 2229 ca " ∪ 60 0 8746 222a cu " ∫ 60 3 8747 222b is " ≈ 60 0 8776 2248 ~~ " ≠ 60 2 8800 2260 != " ≡ 60 0 8801 2261 == " ≤ 60 0 8804 2264 ≥ 60 0 8805 2265 ⌂ 60 0 8962 2302 ⌐ 60 0 8976 2310 ⌑ 60 2 8977 2311 ⌙ 60 0 8985 2319 ⌠ 60 3 8992 2320 ⌡ 60 3 8993 2321 ⍽ 60 1 9085 237d ⎮ 60 3 9134 23ae ⏏ 60 0 9167 23cf ␣ 60 1 9251 2423 ▀ 60 2 9600 2580 ▁ 60 1 9601 2581 ▂ 60 1 9602 2582 ▃ 60 1 9603 2583 ▄ 60 1 9604 2584 ▅ 60 1 9605 2585 ▆ 60 1 9606 2586 ▇ 60 3 9607 2587 █ 60 3 9608 2588 ▉ 60 3 9609 2589 ▊ 60 3 9610 258a ▋ 60 3 9611 258b ▌ 60 3 9612 258c ▍ 60 3 9613 258d ▎ 60 3 9614 258e ▏ 60 3 9615 258f ▐ 60 3 9616 2590 ░ 60 3 9617 2591 ▒ 60 3 9618 2592 ▓ 60 3 9619 2593 ▔ 60 2 9620 2594 ▕ 60 3 9621 2595 ▖ 60 1 9622 2596 ▗ 60 1 9623 2597 ▘ 60 2 9624 2598 ▙ 60 3 9625 2599 ▚ 60 3 9626 259a ▛ 60 3 9627 259b ▜ 60 3 9628 259c ▝ 60 2 9629 259d ▞ 60 3 9630 259e ▟ 60 3 9631 259f ■ 60 0 9632 25a0 □ 60 0 9633 25a1 ▢ 60 0 9634 25a2 ▣ 60 0 9635 25a3 ▤ 60 0 9636 25a4 ▥ 60 0 9637 25a5 ▦ 60 0 9638 25a6 ▧ 60 0 9639 25a7 ▨ 60 0 9640 25a8 ▩ 60 0 9641 25a9 ▪ 60 0 9642 25aa ▫ 60 0 9643 25ab ▬ 60 0 9644 25ac ▭ 60 0 9645 25ad ▮ 60 0 9646 25ae ▯ 60 0 9647 25af ▰ 60 0 9648 25b0 ▱ 60 0 9649 25b1 ▲ 60 0 9650 25b2 △ 60 0 9651 25b3 ▴ 60 0 9652 25b4 ▵ 60 0 9653 25b5 ▶ 60 0 9654 25b6 ▷ 60 0 9655 25b7 ▸ 60 0 9656 25b8 ▹ 60 0 9657 25b9 ► 60 0 9658 25ba ▻ 60 0 9659 25bb ▼ 60 0 9660 25bc ▽ 60 0 9661 25bd ▾ 60 0 9662 25be ▿ 60 0 9663 25bf ◀ 60 0 9664 25c0 ◁ 60 0 9665 25c1 ◂ 60 0 9666 25c2 ◃ 60 0 9667 25c3 ◄ 60 0 9668 25c4 ◅ 60 0 9669 25c5 ◆ 60 0 9670 25c6 ◇ 60 0 9671 25c7 ◈ 60 0 9672 25c8 ◉ 60 0 9673 25c9 ◊ 60 3 9674 25ca ○ 60 0 9675 25cb ◌ 60 0 9676 25cc ◍ 60 0 9677 25cd ◎ 60 0 9678 25ce ● 60 0 9679 25cf ◐ 60 0 9680 25d0 ◑ 60 0 9681 25d1 ◒ 60 0 9682 25d2 ◓ 60 0 9683 25d3 ◔ 60 0 9684 25d4 ◕ 60 0 9685 25d5 ◖ 60 0 9686 25d6 ◗ 60 0 9687 25d7 ◘ 60 2 9688 25d8 ◙ 60 3 9689 25d9 ◚ 60 2 9690 25da ◛ 60 1 9691 25db ◜ 60 0 9692 25dc ◝ 60 0 9693 25dd ◞ 60 0 9694 25de ◟ 60 0 9695 25df ◠ 60 0 9696 25e0 ◡ 60 0 9697 25e1 ◢ 60 0 9698 25e2 ◣ 60 0 9699 25e3 ◤ 60 0 9700 25e4 ◥ 60 0 9701 25e5 ◦ 60 0 9702 25e6 ◧ 60 0 9703 25e7 ◨ 60 0 9704 25e8 ◩ 60 0 9705 25e9 ◪ 60 0 9706 25ea ◫ 60 0 9707 25eb ◬ 60 0 9708 25ec ◭ 60 0 9709 25ed ◮ 60 0 9710 25ee ◯ 60 1 9711 25ef ◰ 60 0 9712 25f0 ◱ 60 0 9713 25f1 ◲ 60 0 9714 25f2 ◳ 60 0 9715 25f3 ◴ 60 0 9716 25f4 ◵ 60 0 9717 25f5 ◶ 60 0 9718 25f6 ◷ 60 0 9719 25f7 ◸ 60 0 9720 25f8 ◹ 60 0 9721 25f9 ◺ 60 0 9722 25fa ◻ 60 0 9723 25fb ◼ 60 0 9724 25fc ◽ 60 0 9725 25fd ◾ 60 0 9726 25fe ◿ 60 0 9727 25ff ☸ 60 2 9784 2638 ⟠ 60 3 10208 27e0 ⧫ 60 3 10731 29eb ⬒ 60 0 11026 2b12 ⬓ 60 0 11027 2b13 fi 60 2 64257 fb01 fl 60 2 64258 fb02 � 60 3 65533 fffd 9base-6/troff/font/devutf/LuxiSans-Bold0000644000175000017500000001431211402154555017501 0ustar anselmanselmname LuxiSans-Bold fontname LuxiSans-Bold spacewidth 28 charset ! 33 2 33 0021 " 47 2 34 0022 dq " dq " # 56 2 35 0023 $ 56 3 36 0024 % 89 2 37 0025 & 72 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 39 2 42 002a + 58 0 43 002b , 28 1 44 002c - 33 0 45 002d . 28 0 46 002e / 28 3 47 002f 0 56 2 48 0030 1 56 2 49 0031 2 56 2 50 0032 3 56 2 51 0033 4 56 2 52 0034 5 56 2 53 0035 6 56 2 54 0036 7 56 2 55 0037 8 56 2 56 0038 9 56 2 57 0039 : 33 0 58 003a ; 33 1 59 003b < 58 0 60 003c = 58 0 61 003d > 58 0 62 003e ? 61 2 63 003f @ 98 2 64 0040 A 72 2 65 0041 B 72 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 72 2 72 0048 I 28 2 73 0049 J 56 3 74 004a K 72 2 75 004b L 61 2 76 004c M 83 2 77 004d N 72 2 78 004e O 78 2 79 004f P 67 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 67 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 67 2 86 0056 W 94 2 87 0057 X 67 2 88 0058 Y 67 2 89 0059 Z 61 2 90 005a [ 33 3 91 005b \ 28 3 92 005c bs " ] 33 3 93 005d ^ 58 2 94 005e _ 56 1 95 005f a 56 0 97 0061 b 61 2 98 0062 c 56 0 99 0063 d 61 2 100 0064 e 56 0 101 0065 f 33 2 102 0066 g 61 1 103 0067 h 61 2 104 0068 i 28 2 105 0069 j 28 3 106 006a k 56 2 107 006b l 28 2 108 006c m 89 0 109 006d n 61 0 110 006e o 61 0 111 006f p 61 1 112 0070 q 61 1 113 0071 r 39 0 114 0072 s 56 0 115 0073 t 33 2 116 0074 u 61 0 117 0075 v 56 0 118 0076 w 78 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 50 0 122 007a { 39 3 123 007b | 28 3 124 007c } 39 3 125 007d ~ 58 0 126 007e € 56 2 128 0080   28 0 160 00a0 ¡ 33 2 161 00a1 ¢ 56 2 162 00a2 £ 56 2 163 00a3 ¤ 56 2 164 00a4 ¥ 56 2 165 00a5 ¦ 39 3 166 00a6 § 56 3 167 00a7 ¨ 33 2 168 00a8 © 74 2 169 00a9 ª 37 2 170 00aa « 56 0 171 00ab ¬ 58 0 172 00ac ­ 33 0 173 00ad hy " ® 74 2 174 00ae rg " ¯ 56 2 175 00af ° 40 2 176 00b0 ± 58 0 177 00b1 +- " ² 33 2 178 00b2 ³ 33 2 179 00b3 ´ 33 2 180 00b4 aa " µ 61 1 181 00b5 ¶ 56 3 182 00b6 · 28 0 183 00b7 ¸ 33 1 184 00b8 ¹ 33 2 185 00b9 º 37 2 186 00ba » 56 0 187 00bb ¼ 83 2 188 00bc ½ 83 2 189 00bd ¾ 83 2 190 00be ¿ 61 1 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 28 2 204 00cc Í 28 2 205 00cd Î 28 2 206 00ce Ï 28 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 58 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 67 2 221 00dd Þ 67 2 222 00de ß 61 2 223 00df à 56 2 224 00e0 á 56 2 225 00e1 â 56 2 226 00e2 ã 56 2 227 00e3 ä 56 2 228 00e4 å 56 2 229 00e5 æ 89 0 230 00e6 ç 56 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 28 2 236 00ec í 28 2 237 00ed î 28 2 238 00ee ï 28 2 239 00ef ð 61 2 240 00f0 ñ 61 2 241 00f1 ò 61 2 242 00f2 ó 61 2 243 00f3 ô 61 2 244 00f4 õ 61 2 245 00f5 ö 61 2 246 00f6 ÷ 58 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 61 2 249 00f9 ú 61 2 250 00fa û 61 2 251 00fb ü 61 2 252 00fc ý 56 3 253 00fd þ 61 3 254 00fe ÿ 56 3 255 00ff ā 56 2 257 0101 Ă 72 2 258 0102 ă 56 2 259 0103 Ą 72 3 260 0104 ą 56 1 261 0105 Ć 72 2 262 0106 ć 56 2 263 0107 Ĉ 72 2 264 0108 ĉ 56 2 265 0109 Ċ 72 2 266 010a ċ 56 2 267 010b Č 72 2 268 010c č 56 2 269 010d Ď 72 2 270 010e ď 72 2 271 010f Đ 72 2 272 0110 đ 61 2 273 0111 Ē 67 2 274 0112 ē 56 2 275 0113 Ĕ 67 2 276 0114 ĕ 56 2 277 0115 Ė 67 2 278 0116 ė 56 2 279 0117 Ę 67 3 280 0118 ę 56 1 281 0119 Ě 67 2 282 011a ě 56 2 283 011b Ĝ 78 2 284 011c ĝ 61 3 285 011d Ğ 78 2 286 011e ğ 61 3 287 011f Ġ 78 2 288 0120 ġ 61 3 289 0121 Ģ 78 3 290 0122 ģ 61 3 291 0123 Ĥ 72 2 292 0124 ĥ 61 2 293 0125 Ħ 72 2 294 0126 ħ 61 2 295 0127 Ĩ 28 2 296 0128 ĩ 28 2 297 0129 Ī 28 2 298 012a ī 28 2 299 012b Ĭ 28 2 300 012c ĭ 28 2 301 012d Į 28 3 302 012e į 28 3 303 012f İ 28 2 304 0130 ı 28 0 305 0131 IJ 78 3 306 0132 ij 56 3 307 0133 Ĵ 56 3 308 0134 ĵ 28 3 309 0135 Ķ 72 3 310 0136 ķ 56 3 311 0137 ĸ 56 0 312 0138 Ĺ 61 2 313 0139 ĺ 28 2 314 013a Ļ 61 3 315 013b ļ 28 3 316 013c Ľ 61 2 317 013d ľ 39 2 318 013e Ŀ 61 2 319 013f ŀ 48 2 320 0140 Ł 61 2 321 0141 ł 28 2 322 0142 Ń 72 2 323 0143 ń 61 2 324 0144 Ņ 72 3 325 0145 ņ 61 1 326 0146 Ň 72 2 327 0147 ň 61 2 328 0148 ʼn 71 2 329 0149 Ŋ 72 3 330 014a ŋ 61 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 94 0 339 0153 Ŕ 72 2 340 0154 ŕ 39 2 341 0155 Ŗ 72 3 342 0156 ŗ 39 1 343 0157 Ř 72 2 344 0158 ř 39 2 345 0159 Ś 67 2 346 015a ś 56 2 347 015b Ŝ 67 2 348 015c ŝ 56 2 349 015d Ş 67 3 350 015e ş 56 1 351 015f Š 67 2 352 0160 š 56 2 353 0161 Ţ 61 3 354 0162 ţ 33 3 355 0163 Ť 61 2 356 0164 ť 48 2 357 0165 Ŧ 61 2 358 0166 ŧ 33 2 359 0167 Ũ 72 2 360 0168 ũ 61 2 361 0169 Ū 72 2 362 016a ū 61 2 363 016b Ŭ 72 2 364 016c ŭ 61 2 365 016d Ů 72 2 366 016e ů 61 2 367 016f Ű 72 2 368 0170 ű 61 2 369 0171 Ų 72 3 370 0172 ų 61 1 371 0173 Ŵ 94 2 372 0174 ŵ 78 2 373 0175 Ŷ 67 2 374 0176 ŷ 56 3 375 0177 Ÿ 67 2 376 0178 Ź 61 2 377 0179 ź 50 2 378 017a Ż 61 2 379 017b ż 50 2 380 017c Ž 61 2 381 017d ž 50 2 382 017e ſ 31 2 383 017f ƒ 56 3 402 0192 Ș 67 3 536 0218 ș 56 1 537 0219 Ț 61 3 538 021a ț 33 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 33 1 894 037e · 28 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 56 0 8210 2012 – 56 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 28 2 8216 2018 ` " ‘ " ’ 28 2 8217 2019 ' " ’ " ‚ 28 1 8218 201a ‛ 28 0 8219 201b “ 50 2 8220 201c ” 50 2 8221 201d „ 50 1 8222 201e † 56 3 8224 2020 ‡ 56 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 56 2 8254 203e ⁄ 17 2 8260 2044 € 56 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 56 0 8494 212e − 58 0 8722 2212 ∕ 17 2 8725 2215 ∙ 28 0 8729 2219 bu " ⋅ 28 0 8901 22c5  61 2 59905 ea01  61 2 59906 ea02  33 2 61444 f004  28 1 63166 f6be fi 61 2 64257 fb01 fl 61 2 64258 fb02 9base-6/troff/font/devutf/LuxiMono0000644000175000017500000001441111402154555016627 0ustar anselmanselmname LuxiMono fontname LuxiMono spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 2 60 003c = 60 0 61 003d > 60 2 62 003e ? 60 2 63 003f @ 60 2 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e € 60 2 128 0080   60 0 160 00a0 ¡ 60 1 161 00a1 ¢ 60 2 162 00a2 £ 60 2 163 00a3 ¤ 60 0 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 2 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 2 188 00bc ½ 60 2 189 00bd ¾ 60 2 190 00be ¿ 60 1 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 2 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f ƒ 60 3 402 0192 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˉ 60 2 713 02c9 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ̦ 60 1 806 0326 ; 60 1 894 037e · 60 0 903 0387 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 60 1 8218 201a ‛ 60 0 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 60 1 8222 201e † 60 3 8224 2020 ‡ 60 3 8225 2021 • 60 0 8226 2022 … 60 0 8230 2026 ‰ 60 2 8240 2030 ‹ 60 0 8249 2039 › 60 0 8250 203a ‾ 60 2 8254 203e ⁄ 60 2 8260 2044 € 60 2 8364 20ac ™ 60 2 8482 2122 tm " ℮ 60 0 8494 212e − 60 0 8722 2212 ∕ 60 2 8725 2215 ∙ 60 0 8729 2219 bu " ⋅ 60 0 8901 22c5  60 2 59905 ea01  60 2 59906 ea02  60 2 61444 f004  60 2 61445 f005  60 2 61446 f006  60 2 61447 f007  60 2 61448 f008  60 1 63166 f6be fi 60 2 64257 fb01 fl 60 2 64258 fb02 9base-6/troff/font/devutf/PB0000644000175000017500000000533311402154555015361 0ustar anselmanselmname PB fontname Palatino-Bold named in prologue spacewidth 25 charset ! 28 2 33 " 40 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 30 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 75 2 64 A 78 2 65 B 67 2 66 C 72 2 67 D 83 2 68 E 61 2 69 F 56 2 70 G 83 2 71 H 83 2 72 I 39 2 73 J 39 3 74 K 78 2 75 L 61 2 76 M 100 2 77 N 83 2 78 O 83 2 79 P 61 2 80 Q 83 3 81 R 72 2 82 S 61 2 83 T 67 2 84 U 78 2 85 V 78 2 86 W 100 2 87 X 67 2 88 Y 67 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 50 0 97 b 61 2 98 c 44 0 99 d 61 2 100 e 50 0 101 f 39 2 102 g 56 1 103 h 61 2 104 i 33 2 105 j 33 3 106 k 61 2 107 l 33 2 108 m 89 0 109 n 61 0 110 o 56 0 111 p 61 1 112 q 61 1 113 r 39 0 114 s 44 0 115 t 33 2 116 u 61 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 31 2 123 --- 61 2 124 } 31 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 28 1 161 ¡ " c| 50 2 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 44 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 61 1 181 µ " P! 64 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 49 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 44 1 191 ¿ " A` 78 2 192 À " A' 78 2 193 Á " A^ 78 2 194  " A~ 78 2 195 à " A" 78 2 196 Ä " A* 78 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 39 2 204 Ì " I' 39 2 205 Í " I^ 39 2 206 Î " I" 39 2 207 Ï " D- 83 2 208 Ð " N~ 83 2 209 Ñ " O` 83 2 210 Ò " O' 83 2 211 Ó " O^ 83 2 212 Ô " O~ 83 2 213 Õ " O" 83 2 214 Ö " xx 61 0 215 × " O/ 83 2 216 Ø " U` 78 2 217 Ù " U' 78 2 218 Ú " U^ 78 2 219 Û " U" 78 2 220 Ü " Y' 67 2 221 Ý " TH 61 2 222 Þ " ss 61 2 223 ß " a` 50 2 224 à " a' 50 2 225 á " a^ 50 2 226 â " a~ 50 2 227 ã " a" 50 2 228 ä " a* 50 2 229 å " ae 78 0 230 æ " c, 44 1 231 ç " e` 50 2 232 è " e' 50 2 233 é " e^ 50 2 234 ê " e" 50 2 235 ë " i` 33 2 236 ì " i' 33 2 237 í " i^ 33 2 238 î " i" 33 2 239 ï " d- 56 2 240 ð " n~ 61 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 61 0 247 ÷ " o/ 56 0 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 56 3 253 ý " th 61 3 254 þ " y" 56 3 255 ÿ " 9base-6/troff/font/devutf/0100to25ff0000644000175000017500000006753411402154555016501 0ustar anselmanselmĀ 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/B0000644000175000017500000000532711402154555015244 0ustar anselmanselmname B fontname Times-Bold named in prologue spacewidth 25 charset ! 33 2 33 " 56 2 34 dq " # 50 2 35 $ 50 3 36 % 100 2 37 & 83 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 57 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 33 0 58 ; 33 1 59 --- 57 0 60 = 57 0 61 --- 57 0 62 ? 50 2 63 @ 93 3 64 A 72 2 65 B 67 2 66 C 72 2 67 D 72 2 68 E 67 2 69 F 61 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 50 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 72 2 78 O 78 2 79 P 61 2 80 Q 78 3 81 R 72 2 82 S 56 2 83 T 67 2 84 U 72 2 85 V 72 2 86 W 100 2 87 X 72 2 88 Y 72 2 89 Z 67 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 58 2 94 --- 50 1 95 ` 33 2 96 a 50 0 97 b 56 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 56 2 104 i 28 2 105 j 33 3 106 k 56 2 107 l 28 2 108 m 83 0 109 n 56 0 110 o 50 0 111 p 56 1 112 q 56 1 113 r 44 0 114 s 39 0 115 t 33 2 116 u 56 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 39 3 123 --- 22 3 124 } 39 3 125 ~ 33 2 148 --- 52 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 50 3 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 22 3 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 30 2 170 ª " << 50 0 171 « " -, 57 0 172 hy 33 0 173 -- 57 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 57 2 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 54 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 33 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 50 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 67 2 200 È " E' 67 2 201 É " E^ 67 2 202 Ê " E" 67 2 203 Ë " I` 39 2 204 Ì " I' 39 2 205 Í " I^ 39 2 206 Î " I" 39 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 57 0 215 × " O/ 78 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 72 2 221 Ý " TH 61 2 222 Þ " ss 56 2 223 ß " a` 50 2 224 à " a' 50 2 225 á " a^ 50 2 226 â " a~ 50 2 227 ã " a" 50 2 228 ä " a* 50 2 229 å " ae 72 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 50 2 240 ð " n~ 56 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 57 0 247 ÷ " o/ 50 2 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 50 3 253 ý " th 56 3 254 þ " y" 50 3 255 ÿ " 9base-6/troff/font/devutf/UnivMath20000644000175000017500000000424411402154555016675 0ustar anselmanselmname UnivMath2 fontname Universal-MathTwo charset *A 83 2 33 Script A *B 83 2 64 Script B *C 72 2 35 Script C *D 78 2 36 Script D *E 67 2 37 Script E *F 78 2 94 Script F *G 67 2 38 Script G *H 83 2 42 Script H *I 67 2 40 Script I *J 67 3 41 Script J *K 78 2 95 Script K *L 78 2 43 Script L *M 89 2 125 Script M *N 78 2 49 Script N *O 61 2 50 Script O *P 78 2 51 Script P *Q 67 2 52 Script Q *R 83 2 53 Script R *S 72 2 54 Script S *T 78 2 55 Script T *U 83 2 56 Script U *V 78 2 57 Script V *W 100 2 48 Script W *X 72 2 45 Script X *Y 78 2 61 Script Y *Z 72 2 93 Script Z A 78 2 65 Fraktur A B 83 2 66 Fraktur B C 72 2 67 Fraktur C D 94 2 68 Fraktur D E 78 2 69 Fraktur E F 72 3 70 Fraktur F G 89 2 71 Fraktur G H 78 3 72 Fraktur H I 72 2 73 Fraktur I J 72 3 74 Fraktur J K 78 2 75 Fraktur K L 67 2 76 Fraktur L M 100 2 77 Fraktur M N 83 2 78 Fraktur N O 89 2 79 Fraktur O P 83 3 80 Fraktur P Q 94 2 81 Fraktur Q R 83 2 82 Fraktur R S 89 2 83 Fraktur S T 78 2 84 Fraktur T U 72 2 85 Fraktur U V 83 2 86 Fraktur V W 100 2 87 Fraktur W X 72 2 88 Fraktur X Y 72 3 89 Fraktur Y Z 72 3 90 Fraktur Z --- 61 2 34 bold script h sl 50 2 44 script l --- 50 2 46 script l bar --- 44 1 47 script z --- 50 1 58 bold script g --- 50 1 59 script g --- 50 2 60 bold script l --- 50 2 62 bold script l bar --- 44 1 63 bold script z --- 100 2 91 ccw-over --- 100 2 92 ccw-under --- 100 2 96 ccw-over-plus a 56 0 97 Fraktur a b 56 2 98 Fraktur b c 39 0 99 Fraktur c d 56 2 100 Fraktur d e 44 0 101 Fraktur e f 39 3 102 Fraktur f g 56 1 103 Fraktur g h 56 3 104 Fraktur h i 33 2 105 Fraktur i j 33 3 106 Fraktur j k 33 2 107 Fraktur k l 33 2 108 Fraktur l m 89 0 109 Fraktur m n 61 0 110 Fraktur n o 56 0 111 Fraktur o p 56 1 112 Fraktur p q 56 1 113 Fraktur q r 44 0 114 Fraktur r s 56 2 115 Fraktur s t 39 2 116 Fraktur t u 61 0 117 Fraktur u v 56 0 118 Fraktur v w 83 0 119 Fraktur w x 44 1 120 Fraktur x y 56 1 121 Fraktur y z 44 1 122 Fraktur z --- 100 2 123 cw-over --- 100 2 124 cw-under --- 100 2 126 cw-over-minus --- 100 3 130 dotted backslash --- 100 3 131 dotted slash --- 100 0 138 dotted horiz --- 56 3 141 big C --- 100 0 144 |---> --- 100 3 161 dotted vert --- 50 2 248 bold script l --- 50 2 249 bold script l bar 9base-6/troff/font/devutf/Helvetica-Narrow0000644000175000017500000000533311402154555020232 0ustar anselmanselmname Hr fontname Helvetica-Narrow named in prologue spacewidth 23 charset ! 23 2 33 " 29 2 34 dq " # 46 2 35 $ 46 3 36 % 73 2 37 & 55 2 38 ' 18 2 39 ( 27 3 40 ) 27 3 41 * 32 2 42 + 48 0 43 , 23 1 44 - 27 0 173 . 23 0 46 / 23 2 47 0 46 2 48 1 46 2 49 2 46 2 50 3 46 2 51 4 46 2 52 5 46 2 53 6 46 2 54 7 46 2 55 8 46 2 56 9 46 2 57 : 23 0 58 ; 23 1 59 --- 48 0 60 = 48 0 61 --- 48 0 62 ? 46 2 63 @ 83 3 64 A 55 2 65 B 55 2 66 C 59 2 67 D 59 2 68 E 55 2 69 F 50 2 70 G 64 2 71 H 59 2 72 I 23 2 73 J 41 2 74 K 55 2 75 L 46 2 76 M 68 2 77 N 59 2 78 O 64 2 79 P 55 2 80 Q 64 2 81 R 59 2 82 S 55 2 83 T 50 2 84 U 59 2 85 V 55 2 86 W 77 2 87 X 55 2 88 Y 55 2 89 Z 50 2 90 [ 23 3 91 \ 23 2 92 bs " ] 23 3 93 ^ 27 2 147 --- 38 2 94 --- 46 1 95 ` 18 2 96 a 46 0 97 b 46 2 98 c 41 0 99 d 46 2 100 e 46 0 101 f 23 2 102 g 46 1 103 h 46 2 104 i 18 2 105 j 18 3 106 k 41 2 107 l 18 2 108 m 68 0 109 n 46 0 110 o 46 0 111 p 46 1 112 q 46 1 113 r 27 0 114 s 41 0 115 t 23 2 116 u 46 0 117 v 41 0 118 w 59 0 119 x 41 0 120 y 41 1 121 z 41 0 122 { 27 3 123 --- 21 3 124 } 27 3 125 ~ 27 2 148 --- 48 0 126 \` 27 2 145 ga " !! 27 1 161 ¡ " c| 46 3 162 ct " ¢ " L- 46 2 163 £ " ps " xo 46 0 164 ¤ " cr " Y- 46 2 165 ¥ " yn " || 21 3 166 ¦ " so 46 3 167 sc " § " "" 27 2 168 ¨ " :a " co 60 2 169 © " a_ 30 2 170 ª " << 46 0 171 « " -, 48 0 172 hy 27 0 173 -- 48 0 45 ­ " ro 60 2 174 rg " ® " -^ 27 2 175 -a " ¯ " 0^ 33 2 176 ° " +- 48 2 177 ± " 2^ 27 2 178 ² " 3^ 27 2 179 ³ " \' 27 2 180 aa " ´ " /u 46 1 181 µ " P! 44 3 182 pg " ¶ " .^ 23 0 183 · " ,, 27 1 184 ¸ " ,a " 1^ 27 2 185 ¹ " o_ 30 2 186 º " >> 46 0 187 » " 14 68 2 188 ¼ " 12 68 2 189 ½ " 34 68 2 190 ¾ " ?? 50 1 191 ¿ " A` 55 2 192 À " A' 55 2 193 Á " A^ 55 2 194  " A~ 55 2 195 à " A" 55 2 196 Ä " A* 55 2 197 Å " AE 82 2 198 Æ " C, 59 3 199 Ç " E` 55 2 200 È " E' 55 2 201 É " E^ 55 2 202 Ê " E" 55 2 203 Ë " I` 23 2 204 Ì " I' 23 2 205 Í " I^ 23 2 206 Î " I" 23 2 207 Ï " D- 59 2 208 Ð " N~ 59 2 209 Ñ " O` 64 2 210 Ò " O' 64 2 211 Ó " O^ 64 2 212 Ô " O~ 64 2 213 Õ " O" 64 2 214 Ö " xx 48 0 215 × " O/ 64 2 216 Ø " U` 59 2 217 Ù " U' 59 2 218 Ú " U^ 59 2 219 Û " U" 59 2 220 Ü " Y' 55 2 221 Ý " TH 55 2 222 Þ " ss 50 2 223 ß " a` 46 2 224 à " a' 46 2 225 á " a^ 46 2 226 â " a~ 46 2 227 ã " a" 46 2 228 ä " a* 46 2 229 å " ae 73 0 230 æ " c, 41 1 231 ç " e` 46 2 232 è " e' 46 2 233 é " e^ 46 2 234 ê " e" 46 2 235 ë " i` 23 2 236 ì " i' 23 2 237 í " i^ 23 2 238 î " i" 23 2 239 ï " d- 46 2 240 ð " n~ 46 2 241 ñ " o` 46 2 242 ò " o' 46 2 243 ó " o^ 46 2 244 ô " o~ 46 2 245 õ " o" 46 2 246 ö " -: 48 0 247 ÷ " o/ 50 0 248 ø " u` 46 2 249 ù " u' 46 2 250 ú " u^ 46 2 251 û " u" 46 2 252 ü " y' 41 3 253 ý " th 46 3 254 þ " y" 41 3 255 ÿ " 9base-6/troff/font/devutf/SyntaxB0000644000175000017500000000200111402154555016435 0ustar anselmanselmname SyntaxB fontname Syntax-Bold spacewidth 28 charset ! 33 0 33 " 33 0 34 # 56 0 35 $ 56 0 36 % 100 0 37 & 72 0 38 ' 28 0 39 ( 33 0 40 ) 33 0 41 * 56 0 42 + 60 0 43 , 28 0 44 - 39 0 45 . 28 0 46 / 44 0 47 0 56 0 48 1 56 0 49 2 56 0 50 3 56 0 51 4 56 0 52 5 56 0 53 6 56 0 54 7 56 0 55 8 56 0 56 9 56 0 57 : 28 0 58 ; 28 0 59 < 60 0 60 = 60 0 61 > 60 0 62 ? 50 0 63 @ 80 0 64 A 67 0 65 B 61 0 66 C 67 0 67 D 72 0 68 E 50 0 69 F 50 0 70 G 72 0 71 H 72 0 72 I 28 0 73 J 39 0 74 K 61 0 75 L 50 0 76 M 94 0 77 N 72 0 78 O 83 0 79 P 56 0 80 Q 83 0 81 R 61 0 82 S 50 0 83 T 56 0 84 U 72 0 85 V 67 0 86 W 100 0 87 X 61 0 88 Y 61 0 89 Z 56 0 90 [ 33 0 91 \ 44 0 92 ] 33 0 93 ^ 60 0 94 _ 50 0 95 ` 28 0 96 a 50 0 97 b 56 0 98 c 44 0 99 d 56 0 100 e 50 0 101 f 33 0 102 g 56 0 103 h 56 0 104 i 28 0 105 j 28 0 106 k 50 0 107 l 28 0 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 0 112 q 56 0 113 r 33 0 114 s 44 0 115 t 33 0 116 u 56 0 117 v 50 0 118 w 78 0 119 x 50 0 120 y 50 0 121 z 44 0 122 { 33 0 123 | 22 0 124 } 33 0 125 ~ 60 0 126 9base-6/troff/font/devutf/NR0000644000175000017500000000534211402154555015377 0ustar anselmanselmname NR fontname NewCenturySchlbk-Roman named in prologue spacewidth 28 charset ! 30 2 33 " 39 2 34 dq " # 56 2 35 $ 56 3 36 % 83 2 37 & 82 2 38 ' 20 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 61 0 43 , 28 1 44 - 33 0 173 . 28 0 46 / 28 2 47 0 56 2 48 1 56 2 49 2 56 2 50 3 56 2 51 4 56 2 52 5 56 2 53 6 56 2 54 7 56 2 55 8 56 2 56 9 56 2 57 : 28 0 58 ; 28 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 74 2 64 A 72 2 65 B 72 2 66 C 72 2 67 D 78 2 68 E 72 2 69 F 67 2 70 G 78 2 71 H 83 2 72 I 41 2 73 J 56 2 74 K 78 2 75 L 67 2 76 M 94 2 77 N 82 2 78 O 78 2 79 P 67 2 80 Q 78 3 81 R 72 2 82 S 63 2 83 T 67 2 84 U 82 2 85 V 72 2 86 W 98 2 87 X 70 2 88 Y 70 2 89 Z 61 2 90 [ 33 3 91 \ 61 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 20 2 96 a 56 0 97 b 56 2 98 c 44 0 99 d 57 2 100 e 50 0 101 f 33 2 102 g 54 1 103 h 61 2 104 i 32 2 105 j 30 3 106 k 59 2 107 l 32 2 108 m 89 0 109 n 61 0 110 o 50 0 111 p 57 1 112 q 56 1 113 r 44 0 114 s 46 0 115 t 39 2 116 u 61 0 117 v 54 0 118 w 78 0 119 x 54 0 120 y 54 1 121 z 48 0 122 { 33 3 123 --- 61 2 124 } 33 3 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 30 3 161 ¡ " c| 56 3 162 ct " ¢ " L- 56 2 163 £ " ps " xo 56 2 164 ¤ " cr " Y- 56 2 165 ¥ " yn " || 61 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 74 2 169 © " a_ 33 2 170 ª " << 43 0 171 « " -, 61 0 172 hy 33 0 173 -- 61 0 45 ­ " ro 74 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 33 2 178 ² " 3^ 33 2 179 ³ " \' 33 2 180 aa " ´ " /u 61 1 181 µ " P! 61 3 182 pg " ¶ " .^ 28 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 33 2 185 ¹ " o_ 30 2 186 º " >> 43 0 187 » " 14 83 2 188 ¼ " 12 83 2 189 ½ " 34 83 2 190 ¾ " ?? 44 3 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 100 2 198 Æ " C, 72 3 199 Ç " E` 72 2 200 È " E' 72 2 201 É " E^ 72 2 202 Ê " E" 72 2 203 Ë " I` 41 2 204 Ì " I' 41 2 205 Í " I^ 41 2 206 Î " I" 41 2 207 Ï " D- 78 2 208 Ð " N~ 82 2 209 Ñ " O` 78 2 210 Ò " O' 78 2 211 Ó " O^ 78 2 212 Ô " O~ 78 2 213 Õ " O" 78 2 214 Ö " xx 61 0 215 × " O/ 78 2 216 Ø " U` 82 2 217 Ù " U' 82 2 218 Ú " U^ 82 2 219 Û " U" 82 2 220 Ü " Y' 70 2 221 Ý " TH 67 2 222 Þ " ss 57 2 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 80 0 230 æ " c, 44 1 231 ç " e` 50 2 232 è " e' 50 2 233 é " e^ 50 2 234 ê " e" 50 2 235 ë " i` 32 2 236 ì " i' 32 2 237 í " i^ 32 2 238 î " i" 32 2 239 ï " d- 50 2 240 ð " n~ 61 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 61 0 247 ÷ " o/ 50 2 248 ø " u` 61 2 249 ù " u' 61 2 250 ú " u^ 61 2 251 û " u" 61 2 252 ü " y' 54 3 253 ý " th 57 3 254 þ " y" 54 3 255 ÿ " 9base-6/troff/font/devutf/LuxiMono-Bold0000644000175000017500000001442311402154555017510 0ustar anselmanselmname LuxiMono-Bold fontname LuxiMono-Bold spacewidth 60 charset ! 60 2 33 0021 " 60 2 34 0022 dq " dq " # 60 2 35 0023 $ 60 3 36 0024 % 60 2 37 0025 & 60 2 38 0026 ( 60 3 40 0028 ) 60 3 41 0029 * 60 2 42 002a + 60 0 43 002b , 60 1 44 002c - 60 0 45 002d hy " . 60 0 46 002e / 60 3 47 002f 0 60 2 48 0030 1 60 2 49 0031 2 60 2 50 0032 3 60 2 51 0033 4 60 2 52 0034 5 60 2 53 0035 6 60 2 54 0036 7 60 2 55 0037 8 60 2 56 0038 9 60 2 57 0039 : 60 0 58 003a ; 60 1 59 003b < 60 2 60 003c = 60 0 61 003d > 60 2 62 003e ? 60 2 63 003f @ 60 2 64 0040 A 60 2 65 0041 B 60 2 66 0042 C 60 2 67 0043 D 60 2 68 0044 E 60 2 69 0045 F 60 2 70 0046 G 60 2 71 0047 H 60 2 72 0048 I 60 2 73 0049 J 60 2 74 004a K 60 2 75 004b L 60 2 76 004c M 60 2 77 004d N 60 2 78 004e O 60 2 79 004f P 60 2 80 0050 Q 60 3 81 0051 R 60 2 82 0052 S 60 2 83 0053 T 60 2 84 0054 U 60 2 85 0055 V 60 2 86 0056 W 60 2 87 0057 X 60 2 88 0058 Y 60 2 89 0059 Z 60 2 90 005a [ 60 3 91 005b \ 60 3 92 005c bs " ] 60 3 93 005d ^ 60 2 94 005e _ 60 1 95 005f a 60 0 97 0061 b 60 2 98 0062 c 60 0 99 0063 d 60 2 100 0064 e 60 0 101 0065 f 60 2 102 0066 g 60 1 103 0067 h 60 2 104 0068 i 60 2 105 0069 j 60 3 106 006a k 60 2 107 006b l 60 2 108 006c m 60 0 109 006d n 60 0 110 006e o 60 0 111 006f p 60 1 112 0070 q 60 1 113 0071 r 60 0 114 0072 s 60 0 115 0073 t 60 2 116 0074 u 60 0 117 0075 v 60 0 118 0076 w 60 0 119 0077 x 60 0 120 0078 y 60 1 121 0079 z 60 0 122 007a { 60 3 123 007b | 60 3 124 007c } 60 3 125 007d ~ 60 0 126 007e € 60 2 128 0080   60 0 160 00a0 ¡ 60 1 161 00a1 ¢ 60 2 162 00a2 £ 60 2 163 00a3 ¤ 60 2 164 00a4 ¥ 60 2 165 00a5 ¦ 60 3 166 00a6 § 60 3 167 00a7 ¨ 60 2 168 00a8 © 60 2 169 00a9 ª 60 2 170 00aa « 60 0 171 00ab ¬ 60 0 172 00ac ­ 60 0 173 00ad ® 60 2 174 00ae rg " ¯ 60 2 175 00af ° 60 2 176 00b0 ± 60 0 177 00b1 +- " ² 60 2 178 00b2 ³ 60 2 179 00b3 ´ 60 2 180 00b4 aa " µ 60 1 181 00b5 ¶ 60 3 182 00b6 · 60 0 183 00b7 ¸ 60 1 184 00b8 ¹ 60 2 185 00b9 º 60 2 186 00ba » 60 0 187 00bb ¼ 60 2 188 00bc ½ 60 2 189 00bd ¾ 60 2 190 00be ¿ 60 1 191 00bf À 60 2 192 00c0 Á 60 2 193 00c1  60 2 194 00c2 à 60 2 195 00c3 Ä 60 2 196 00c4 Å 60 2 197 00c5 Æ 60 2 198 00c6 Ç 60 3 199 00c7 È 60 2 200 00c8 É 60 2 201 00c9 Ê 60 2 202 00ca Ë 60 2 203 00cb Ì 60 2 204 00cc Í 60 2 205 00cd Î 60 2 206 00ce Ï 60 2 207 00cf Ð 60 2 208 00d0 Ñ 60 2 209 00d1 Ò 60 2 210 00d2 Ó 60 2 211 00d3 Ô 60 2 212 00d4 Õ 60 2 213 00d5 Ö 60 2 214 00d6 × 60 0 215 00d7 mu " Ø 60 2 216 00d8 Ù 60 2 217 00d9 Ú 60 2 218 00da Û 60 2 219 00db Ü 60 2 220 00dc Ý 60 2 221 00dd Þ 60 2 222 00de ß 60 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 60 0 230 00e6 ç 60 1 231 00e7 è 60 2 232 00e8 é 60 2 233 00e9 ê 60 2 234 00ea ë 60 2 235 00eb ì 60 2 236 00ec í 60 2 237 00ed î 60 2 238 00ee ï 60 2 239 00ef ð 60 2 240 00f0 ñ 60 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 60 2 247 00f7 -: " di " ø 60 0 248 00f8 ù 60 2 249 00f9 ú 60 2 250 00fa û 60 2 251 00fb ü 60 2 252 00fc ý 60 3 253 00fd þ 60 3 254 00fe ÿ 60 3 255 00ff ā 60 2 257 0101 Ă 60 2 258 0102 ă 60 2 259 0103 Ą 60 3 260 0104 ą 60 1 261 0105 Ć 60 2 262 0106 ć 60 2 263 0107 Ĉ 60 2 264 0108 ĉ 60 2 265 0109 Ċ 60 2 266 010a ċ 60 2 267 010b Č 60 2 268 010c č 60 2 269 010d Ď 60 2 270 010e ď 60 2 271 010f Đ 60 2 272 0110 đ 60 2 273 0111 Ē 60 2 274 0112 ē 60 2 275 0113 Ĕ 60 2 276 0114 ĕ 60 2 277 0115 Ė 60 2 278 0116 ė 60 2 279 0117 Ę 60 3 280 0118 ę 60 1 281 0119 Ě 60 2 282 011a ě 60 2 283 011b Ĝ 60 2 284 011c ĝ 60 3 285 011d Ğ 60 2 286 011e ğ 60 3 287 011f Ġ 60 2 288 0120 ġ 60 3 289 0121 Ģ 60 3 290 0122 ģ 60 3 291 0123 Ĥ 60 2 292 0124 ĥ 60 2 293 0125 Ħ 60 2 294 0126 ħ 60 2 295 0127 Ĩ 60 2 296 0128 ĩ 60 2 297 0129 Ī 60 2 298 012a ī 60 2 299 012b Ĭ 60 2 300 012c ĭ 60 2 301 012d Į 60 3 302 012e į 60 3 303 012f İ 60 2 304 0130 ı 60 0 305 0131 IJ 60 2 306 0132 ij 60 3 307 0133 Ĵ 60 2 308 0134 ĵ 60 3 309 0135 Ķ 60 3 310 0136 ķ 60 3 311 0137 ĸ 60 0 312 0138 Ĺ 60 2 313 0139 ĺ 60 2 314 013a Ļ 60 3 315 013b ļ 60 3 316 013c Ľ 60 2 317 013d ľ 60 2 318 013e Ŀ 60 2 319 013f ŀ 60 2 320 0140 Ł 60 2 321 0141 ł 60 2 322 0142 Ń 60 2 323 0143 ń 60 2 324 0144 Ņ 60 3 325 0145 ņ 60 1 326 0146 Ň 60 2 327 0147 ň 60 2 328 0148 ʼn 60 2 329 0149 Ŋ 60 3 330 014a ŋ 60 1 331 014b Ō 60 2 332 014c ō 60 2 333 014d Ŏ 60 2 334 014e ŏ 60 2 335 014f Ő 60 2 336 0150 ő 60 2 337 0151 Œ 60 2 338 0152 œ 60 0 339 0153 Ŕ 60 2 340 0154 ŕ 60 2 341 0155 Ŗ 60 3 342 0156 ŗ 60 1 343 0157 Ř 60 2 344 0158 ř 60 2 345 0159 Ś 60 2 346 015a ś 60 2 347 015b Ŝ 60 2 348 015c ŝ 60 2 349 015d Ş 60 3 350 015e ş 60 1 351 015f Š 60 2 352 0160 š 60 2 353 0161 Ţ 60 3 354 0162 ţ 60 3 355 0163 Ť 60 2 356 0164 ť 60 2 357 0165 Ŧ 60 2 358 0166 ŧ 60 2 359 0167 Ũ 60 2 360 0168 ũ 60 2 361 0169 Ū 60 2 362 016a ū 60 2 363 016b Ŭ 60 2 364 016c ŭ 60 2 365 016d Ů 60 2 366 016e ů 60 2 367 016f Ű 60 2 368 0170 ű 60 2 369 0171 Ų 60 3 370 0172 ų 60 1 371 0173 Ŵ 60 2 372 0174 ŵ 60 2 373 0175 Ŷ 60 2 374 0176 ŷ 60 3 375 0177 Ÿ 60 2 376 0178 Ź 60 2 377 0179 ź 60 2 378 017a Ż 60 2 379 017b ż 60 2 380 017c Ž 60 2 381 017d ž 60 2 382 017e ſ 60 2 383 017f ƒ 60 3 402 0192 Ș 60 3 536 0218 ș 60 1 537 0219 Ț 60 3 538 021a ț 60 3 539 021b ˆ 60 2 710 02c6 ˇ 60 2 711 02c7 ˉ 60 2 713 02c9 ˘ 60 2 728 02d8 ˙ 60 2 729 02d9 ˚ 60 2 730 02da ˛ 60 1 731 02db ˜ 60 2 732 02dc ˝ 60 2 733 02dd ̦ 33 1 806 0326 ; 60 1 894 037e · 60 0 903 0387 ‐ 60 0 8208 2010 ‑ 60 0 8209 2011 ‒ 60 0 8210 2012 – 60 0 8211 2013 en " \- " — 60 0 8212 2014 em " -- " ― 60 0 8213 2015 ‘ 60 2 8216 2018 ` " ‘ " ’ 60 2 8217 2019 ' " ’ " ‚ 65 1 8218 201a ‛ 60 0 8219 201b “ 60 2 8220 201c ” 60 2 8221 201d „ 65 1 8222 201e † 60 3 8224 2020 ‡ 65 3 8225 2021 • 60 0 8226 2022 … 60 0 8230 2026 ‰ 65 2 8240 2030 ‹ 60 0 8249 2039 › 60 0 8250 203a ‾ 60 2 8254 203e ⁄ 60 2 8260 2044 € 60 2 8364 20ac ™ 60 2 8482 2122 tm " ℮ 60 0 8494 212e − 60 0 8722 2212 ∕ 60 2 8725 2215 ∙ 60 0 8729 2219 bu " ⋅ 60 0 8901 22c5  60 2 59905 ea01  60 2 59906 ea02  60 2 61444 f004  60 2 61445 f005  60 2 61446 f006  60 2 61447 f007  60 2 61448 f008  60 1 63166 f6be fi 60 2 64257 fb01 fl 60 2 64258 fb02 9base-6/troff/font/devutf/CX0000644000175000017500000000527411402154555015376 0ustar anselmanselmname CX fontname Courier-BoldOblique named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/UnivMath50000644000175000017500000000244211402154555016676 0ustar anselmanselmname UnivMath5 fontname Universal-MathFive charset --- 33 3 33 --- 83 3 34 --- 33 3 35 --- 33 3 36 --- 33 3 37 --- 83 3 38 --- 83 3 39 --- 33 3 40 --- 33 3 41 --- 33 3 42 --- 67 3 43 --- 83 3 44 --- 83 3 45 --- 83 3 46 --- 83 3 47 --- 83 3 48 --- 83 3 49 --- 83 3 50 --- 83 3 51 --- 83 3 52 --- 83 3 53 --- 83 3 54 --- 83 3 55 --- 83 3 56 --- 83 3 57 --- 83 3 58 --- 83 3 59 --- 83 3 60 --- 83 3 61 --- 83 3 62 --- 83 3 63 --- 33 3 64 --- 83 3 65 --- 61 3 66 --- 100 3 67 --- 33 3 68 --- 33 3 69 --- 33 3 70 --- 33 3 71 --- 33 3 72 --- 33 3 73 --- 33 3 74 --- 33 3 75 --- 33 3 76 --- 100 3 77 --- 100 3 78 --- 33 3 79 --- 83 3 80 --- 39 3 81 --- 33 3 82 --- 83 3 83 --- 39 3 84 --- 44 3 85 --- 100 3 86 --- 39 3 87 --- 67 3 88 --- 39 3 89 --- 83 3 90 --- 94 3 91 --- 67 3 92 --- 50 3 93 --- 56 3 94 --- 33 3 95 --- 61 3 96 --- 83 3 97 --- 83 3 98 --- 83 3 99 --- 83 3 100 --- 83 3 101 --- 83 3 102 --- 83 3 103 --- 83 3 104 --- 83 3 105 --- 83 3 106 --- 83 3 107 --- 56 3 108 --- 83 3 109 --- 83 3 110 --- 83 3 111 --- 83 3 112 --- 83 3 113 --- 83 3 114 --- 83 3 115 --- 83 3 116 --- 83 3 117 --- 83 3 118 --- 83 3 119 --- 83 3 120 --- 83 3 121 --- 83 3 122 --- 94 3 123 --- 61 3 124 --- 83 3 125 --- 33 3 126 --- 39 3 162 --- 50 3 163 --- 56 3 164 --- 39 3 170 --- 67 3 176 --- 33 3 217 --- 83 3 248 --- 83 3 249 9base-6/troff/font/devutf/KB0000644000175000017500000000533111402154555015352 0ustar anselmanselmname KB fontname Bookman-Demi named in prologue spacewidth 34 charset ! 36 2 33 " 42 2 34 dq " # 60 2 35 $ 66 3 36 % 94 2 37 & 80 2 38 ' 32 2 39 ( 32 3 40 ) 32 3 41 * 46 2 42 + 60 0 43 , 34 1 44 - 36 0 173 . 34 0 46 / 60 3 47 0 66 2 48 1 66 2 49 2 66 2 50 3 66 2 51 4 66 2 52 5 66 2 53 6 66 2 54 7 66 2 55 8 66 2 56 9 66 2 57 : 34 0 58 ; 34 1 59 --- 60 0 60 = 60 0 61 --- 60 0 62 ? 66 2 63 @ 82 2 64 A 72 2 65 B 72 2 66 C 74 2 67 D 78 2 68 E 72 2 69 F 68 2 70 G 78 2 71 H 82 2 72 I 40 2 73 J 64 2 74 K 80 2 75 L 64 2 76 M 94 2 77 N 74 2 78 O 80 2 79 P 66 2 80 Q 80 3 81 R 78 2 82 S 66 2 83 T 70 2 84 U 74 2 85 V 72 2 86 W 94 2 87 X 78 2 88 Y 70 2 89 Z 64 2 90 [ 30 3 91 \ 60 2 92 bs " ] 30 3 93 ^ 50 2 147 --- 60 2 94 --- 50 1 95 ` 32 2 96 a 58 0 97 b 60 2 98 c 58 0 99 d 64 2 100 e 58 0 101 f 38 2 102 g 58 3 103 h 68 2 104 i 36 2 105 j 34 3 106 k 66 2 107 l 34 2 108 m 100 0 109 n 68 0 110 o 62 0 111 p 64 1 112 q 62 1 113 r 46 0 114 s 52 0 115 t 46 2 116 u 66 0 117 v 60 0 118 w 80 0 119 x 60 0 120 y 62 1 121 z 56 0 122 { 32 3 123 --- 60 2 124 } 32 3 125 ~ 48 2 148 --- 60 0 126 \` 40 2 145 ga " !! 36 1 161 ¡ " c| 66 2 162 ct " ¢ " L- 66 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 66 2 165 ¥ " yn " || 60 2 166 ¦ " so 60 3 167 sc " § " "" 50 2 168 ¨ " :a " co 74 2 169 © " a_ 40 2 170 ª " << 40 0 171 « " -, 60 0 172 hy 36 0 173 -- 60 0 45 ­ " ro 74 2 174 rg " ® " -^ 46 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 0 177 ± " 2^ 40 2 178 ² " 3^ 40 2 179 ³ " \' 40 2 180 aa " ´ " /u 66 1 181 µ " P! 80 2 182 pg " ¶ " .^ 34 0 183 · " ,, 36 1 184 ¸ " ,a " 1^ 40 2 185 ¹ " o_ 40 2 186 º " >> 40 0 187 » " 14 99 2 188 ¼ " 12 99 2 189 ½ " 34 99 2 190 ¾ " ?? 66 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 114 2 198 Æ " C, 74 3 199 Ç " E` 72 2 200 È " E' 72 2 201 É " E^ 72 2 202 Ê " E" 72 2 203 Ë " I` 40 2 204 Ì " I' 40 2 205 Í " I^ 40 2 206 Î " I" 40 2 207 Ï " D- 78 2 208 Ð " N~ 74 2 209 Ñ " O` 80 2 210 Ò " O' 80 2 211 Ó " O^ 80 2 212 Ô " O~ 80 2 213 Õ " O" 80 2 214 Ö " xx 60 0 215 × " O/ 80 3 216 Ø " U` 74 2 217 Ù " U' 74 2 218 Ú " U^ 74 2 219 Û " U" 74 2 220 Ü " Y' 70 2 221 Ý " TH 66 2 222 Þ " ss 66 2 223 ß " a` 58 2 224 à " a' 58 2 225 á " a^ 58 2 226 â " a~ 58 2 227 ã " a" 58 2 228 ä " a* 58 2 229 å " ae 88 0 230 æ " c, 58 1 231 ç " e` 58 2 232 è " e' 58 2 233 é " e^ 58 2 234 ê " e" 58 2 235 ë " i` 36 2 236 ì " i' 36 2 237 í " i^ 36 2 238 î " i" 36 2 239 ï " d- 62 2 240 ð " n~ 68 2 241 ñ " o` 62 2 242 ò " o' 62 2 243 ó " o^ 62 2 244 ô " o~ 62 2 245 õ " o" 62 2 246 ö " -: 60 0 247 ÷ " o/ 62 0 248 ø " u` 66 2 249 ù " u' 66 2 250 ú " u^ 66 2 251 û " u" 66 2 252 ü " y' 62 3 253 ý " th 64 3 254 þ " y" 62 3 255 ÿ " 9base-6/troff/font/devutf/R.nomath0000644000175000017500000006105111402154555016545 0ustar anselmanselmname R.nomath fontname Times-Roman named in prologue spacewidth 25 charset ! 33 2 33 " 41 2 34 dq " # 50 2 35 $ 50 2 36 % 83 2 37 & 78 2 38 ' 33 2 39 ( 33 3 40 ) 33 3 41 * 50 2 42 + 56 0 43 , 25 1 44 - 33 0 173 . 25 0 46 / 28 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 28 0 58 ; 28 1 59 < 56 2 60 = 56 0 61 > 56 2 62 ? 44 2 63 @ 92 3 64 A 72 2 65 B 67 2 66 C 67 2 67 D 72 2 68 E 61 2 69 F 56 2 70 G 72 2 71 H 72 2 72 I 33 2 73 J 39 2 74 K 72 2 75 L 61 2 76 M 89 2 77 N 72 2 78 O 72 2 79 P 56 2 80 Q 72 3 81 R 67 2 82 S 56 2 83 T 61 2 84 U 72 2 85 V 72 2 86 W 94 2 87 X 72 2 88 Y 72 2 89 Z 61 2 90 [ 33 3 91 \ 28 2 92 bs " ] 33 3 93 ^ 33 2 147 --- 47 2 94 --- 50 1 95 ` 33 2 96 a 44 0 97 b 50 2 98 c 44 0 99 d 50 2 100 e 44 0 101 f 33 2 102 g 50 1 103 h 50 2 104 i 28 2 105 j 28 3 106 k 50 2 107 l 28 2 108 m 78 0 109 n 50 0 110 o 50 0 111 p 50 1 112 q 50 1 113 r 33 0 114 s 39 0 115 t 28 2 116 u 50 0 117 v 50 0 118 w 72 0 119 x 50 0 120 y 50 1 121 z 44 0 122 { 48 3 123 --- 20 2 124 } 48 3 125 ~ 33 2 148 --- 54 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 50 3 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 20 2 166 ¦ " so 50 3 167 sc " § " "" 33 2 168 ¨ " :a " co 76 2 169 © " a_ 28 2 170 ª " << 50 0 171 « " -, 56 0 172 hy 33 0 173 -- 56 0 45 ­ " ro 76 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 56 2 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 50 1 181 µ " P! 45 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 31 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 44 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 89 2 198 Æ " C, 67 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 33 2 204 Ì " I' 33 2 205 Í " I^ 33 2 206 Î " I" 33 2 207 Ï " D- 72 2 208 Ð " N~ 72 2 209 Ñ " O` 72 2 210 Ò " O' 72 2 211 Ó " O^ 72 2 212 Ô " O~ 72 2 213 Õ " O" 72 2 214 Ö " xx 56 0 215 × " O/ 72 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 72 2 221 Ý " TH 56 2 222 Þ " ss 50 2 223 ß " a` 44 2 224 à " a' 44 2 225 á " a^ 44 2 226 â " a~ 44 2 227 ã " a" 44 2 228 ä " a* 44 2 229 å " ae 67 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 50 2 240 ð " n~ 50 2 241 ñ " o` 50 2 242 ò " o' 50 2 243 ó " o^ 50 2 244 ô " o~ 50 2 245 õ " o" 50 2 246 ö " -: 56 0 247 ÷ " o/ 50 2 248 ø " u` 50 2 249 ù " u' 50 2 250 ú " u^ 50 2 251 û " u" 50 2 252 ü " y' 50 3 253 ý " th 50 3 254 þ " y" 50 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/KI0000644000175000017500000000533711402154555015367 0ustar anselmanselmname KI fontname Bookman-LightItalic named in prologue spacewidth 30 charset ! 32 2 33 " 36 2 34 dq " # 60 2 35 $ 62 2 36 % 80 2 37 & 82 2 38 ' 28 2 39 ( 28 3 40 ) 28 3 41 * 44 2 42 + 60 2 43 , 30 1 44 - 32 0 173 . 30 0 46 / 60 3 47 0 62 2 48 1 62 2 49 2 62 2 50 3 62 2 51 4 62 2 52 5 62 2 53 6 62 2 54 7 62 2 55 8 62 2 56 9 62 2 57 : 30 0 58 ; 30 1 59 --- 60 2 60 = 60 0 61 --- 60 2 62 ? 54 2 63 @ 78 2 64 A 70 2 65 B 72 2 66 C 72 2 67 D 74 2 68 E 68 2 69 F 62 2 70 G 76 2 71 H 80 2 72 I 32 2 73 J 56 2 74 K 72 2 75 L 58 2 76 M 86 2 77 N 72 2 78 O 76 2 79 P 60 2 80 Q 78 3 81 R 70 2 82 S 64 2 83 T 60 2 84 U 72 2 85 V 68 2 86 W 96 2 87 X 70 2 88 Y 66 2 89 Z 58 2 90 [ 26 3 91 \ 60 2 92 bs " ] 26 3 93 ^ 44 2 147 --- 60 2 94 --- 50 1 95 ` 28 2 96 a 62 0 97 b 60 2 98 c 48 0 99 d 64 2 100 e 54 0 101 f 34 3 102 g 56 1 103 h 62 2 104 i 28 2 105 j 28 3 106 k 60 2 107 l 28 2 108 m 88 0 109 n 62 0 110 o 54 0 111 p 60 1 112 q 56 1 113 r 40 0 114 s 54 0 115 t 34 2 116 u 62 0 117 v 54 0 118 w 88 0 119 x 54 0 120 y 60 1 121 z 52 0 122 { 36 3 123 --- 60 2 124 } 38 3 125 ~ 44 2 148 --- 60 0 126 \` 34 2 145 ga " !! 32 1 161 ¡ " c| 62 2 162 ct " ¢ " L- 62 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 62 2 165 ¥ " yn " || 60 2 166 ¦ " so 62 3 167 sc " § " "" 42 2 168 ¨ " :a " co 74 2 169 © " a_ 44 2 170 ª " << 30 0 171 « " -, 60 0 172 hy 32 0 173 -- 60 0 45 ­ " ro 74 2 174 rg " ® " -^ 44 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 60 2 177 ± " 2^ 37 2 178 ² " 3^ 37 2 179 ³ " \' 32 2 180 aa " ´ " /u 62 1 181 µ " P! 62 2 182 pg " ¶ " .^ 30 0 183 · " ,, 32 1 184 ¸ " ,a " 1^ 37 2 185 ¹ " o_ 40 2 186 º " >> 30 0 187 » " 14 93 2 188 ¼ " 12 93 2 189 ½ " 34 93 2 190 ¾ " ?? 54 1 191 ¿ " A` 70 2 192 À " A' 70 2 193 Á " A^ 70 2 194  " A~ 70 2 195 à " A" 70 2 196 Ä " A* 70 2 197 Å " AE 122 2 198 Æ " C, 72 3 199 Ç " E` 68 2 200 È " E' 68 2 201 É " E^ 68 2 202 Ê " E" 68 2 203 Ë " I` 32 2 204 Ì " I' 32 2 205 Í " I^ 32 2 206 Î " I" 32 2 207 Ï " D- 74 2 208 Ð " N~ 72 2 209 Ñ " O` 76 2 210 Ò " O' 76 2 211 Ó " O^ 76 2 212 Ô " O~ 76 2 213 Õ " O" 76 2 214 Ö " xx 60 2 215 × " O/ 76 2 216 Ø " U` 72 2 217 Ù " U' 72 2 218 Ú " U^ 72 2 219 Û " U" 72 2 220 Ü " Y' 66 2 221 Ý " TH 60 2 222 Þ " ss 62 3 223 ß " a` 62 2 224 à " a' 62 2 225 á " a^ 62 2 226 â " a~ 62 2 227 ã " a" 62 2 228 ä " a* 62 2 229 å " ae 88 0 230 æ " c, 48 1 231 ç " e` 54 2 232 è " e' 54 2 233 é " e^ 54 2 234 ê " e" 54 2 235 ë " i` 28 2 236 ì " i' 28 2 237 í " i^ 28 2 238 î " i" 28 2 239 ï " d- 54 2 240 ð " n~ 62 2 241 ñ " o` 54 2 242 ò " o' 54 2 243 ó " o^ 54 2 244 ô " o~ 54 2 245 õ " o" 54 2 246 ö " -: 60 2 247 ÷ " o/ 54 0 248 ø " u` 62 2 249 ù " u' 62 2 250 ú " u^ 62 2 251 û " u" 62 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " 9base-6/troff/font/devutf/C0000644000175000017500000007501411402154555015245 0ustar anselmanselmname CW fontname Courier named in prologue spacewidth 60 charset ! 60 2 33 " 60 2 34 dq " # 60 2 35 $ 60 2 36 % 60 2 37 & 60 2 38 ' 60 2 39 ( 60 3 40 ) 60 3 41 * 60 2 42 + 60 2 43 , 60 1 44 - 60 0 173 . 60 0 46 / 60 2 47 0 60 2 48 1 60 2 49 2 60 2 50 3 60 2 51 4 60 2 52 5 60 2 53 6 60 2 54 7 60 2 55 8 60 2 56 9 60 2 57 : 60 0 58 ; 60 0 59 < 60 2 60 = 60 0 61 > 60 2 62 ? 60 2 63 @ 60 2 64 A 60 2 65 B 60 2 66 C 60 2 67 D 60 2 68 E 60 2 69 F 60 2 70 G 60 2 71 H 60 2 72 I 60 2 73 J 60 2 74 K 60 2 75 L 60 2 76 M 60 2 77 N 60 2 78 O 60 2 79 P 60 2 80 Q 60 3 81 R 60 2 82 S 60 2 83 T 60 2 84 U 60 2 85 V 60 2 86 W 60 2 87 X 60 2 88 Y 60 2 89 Z 60 2 90 [ 60 3 91 \ 60 2 92 bs " ] 60 3 93 ^ 60 2 94 _ 60 1 95 ` 60 2 96 a 60 0 97 b 60 2 98 c 60 0 99 d 60 2 100 e 60 0 101 f 60 2 102 g 60 1 103 h 60 2 104 i 60 2 105 j 60 3 106 k 60 2 107 l 60 2 108 m 60 0 109 n 60 0 110 o 60 0 111 p 60 1 112 q 60 1 113 r 60 0 114 s 60 0 115 t 60 2 116 u 60 0 117 v 60 0 118 w 60 0 119 x 60 0 120 y 60 1 121 z 60 0 122 { 60 3 123 | 60 3 124 } 60 3 125 ~ 60 0 126 \` 60 2 145 ga " !! 60 1 161 ¡ " c| 60 2 162 ct " ¢ " L- 60 2 163 £ " ps " xo 60 2 164 ¤ " cr " Y- 60 2 165 ¥ " yn " || 60 3 166 ¦ " so 60 2 167 sc " § " "" 60 2 168 ¨ " :a " co 60 2 169 © " a_ 60 2 170 ª " << 60 0 171 « " -, 60 0 172 hy 60 0 173 -- 60 0 45 ­ " ro 60 2 174 rg " ® " -^ 60 2 175 -a " ¯ " 0^ 60 2 176 ° " +- 60 2 177 ± " 2^ 60 2 178 ² " 3^ 60 2 179 ³ " \' 60 2 180 aa " ´ " /u 60 1 181 µ " P! 60 2 182 pg " ¶ " .^ 60 0 183 · " ,, 60 1 184 ¸ " ,a " 1^ 60 2 185 ¹ " o_ 60 2 186 º " >> 60 0 187 » " 14 60 2 188 ¼ " 12 60 2 189 ½ " 34 60 2 190 ¾ " ?? 60 1 191 ¿ " A` 60 2 192 À " A' 60 2 193 Á " A^ 60 2 194  " A~ 60 2 195 à " A" 60 2 196 Ä " A* 60 2 197 Å " AE 60 2 198 Æ " C, 60 3 199 Ç " E` 60 2 200 È " E' 60 2 201 É " E^ 60 2 202 Ê " E" 60 2 203 Ë " I` 60 2 204 Ì " I' 60 2 205 Í " I^ 60 2 206 Î " I" 60 2 207 Ï " D- 60 2 208 Ð " N~ 60 2 209 Ñ " O` 60 2 210 Ò " O' 60 2 211 Ó " O^ 60 2 212 Ô " O~ 60 2 213 Õ " O" 60 2 214 Ö " xx 60 0 215 × " O/ 60 2 216 Ø " U` 60 2 217 Ù " U' 60 2 218 Ú " U^ 60 2 219 Û " U" 60 2 220 Ü " Y' 60 2 221 Ý " TH 60 2 222 Þ " ss 60 2 223 ß " a` 60 2 224 à " a' 60 2 225 á " a^ 60 2 226 â " a~ 60 2 227 ã " a" 60 2 228 ä " a* 60 2 229 å " ae 60 0 230 æ " c, 60 1 231 ç " e` 60 2 232 è " e' 60 2 233 é " e^ 60 2 234 ê " e" 60 2 235 ë " i` 60 2 236 ì " i' 60 2 237 í " i^ 60 2 238 î " i" 60 2 239 ï " d- 60 2 240 ð " n~ 60 2 241 ñ " o` 60 2 242 ò " o' 60 2 243 ó " o^ 60 2 244 ô " o~ 60 2 245 õ " o" 60 2 246 ö " -: 60 2 247 ÷ " o/ 60 0 248 ø " u` 60 2 249 ù " u' 60 2 250 ú " u^ 60 2 251 û " u" 60 2 252 ü " y' 60 3 253 ý " th 60 3 254 þ " y" 60 3 255 ÿ " Ā 69 2 256 0100 ā 55 2 257 0101 Ă 69 2 258 0102 ă 55 2 259 0103 Ą 69 3 260 0104 ą 55 1 261 0105 Ć 69 2 262 0106 ć 51 2 263 0107 Ĉ 69 2 264 0108 ĉ 51 2 265 0109 Ċ 69 2 266 010a ċ 51 2 267 010b Č 69 2 268 010c č 51 2 269 010d Ď 75 2 270 010e ď 72 2 271 010f Đ 75 2 272 0110 đ 63 2 273 0111 Ē 54 2 274 0112 ē 56 2 275 0113 Ĕ 54 2 276 0114 ĕ 56 2 277 0115 Ė 54 2 278 0116 ė 56 2 279 0117 Ę 54 2 280 0118 ę 56 1 281 0119 Ě 54 2 282 011a ě 56 2 283 011b Ĝ 72 2 284 011c ĝ 62 3 285 011d Ğ 72 2 286 011e ğ 62 3 287 011f Ġ 72 2 288 0120 ġ 62 3 289 0121 Ģ 72 3 290 0122 ģ 62 3 291 0123 Ĥ 74 2 292 0124 ĥ 62 2 293 0125 Ħ 79 2 294 0126 ħ 62 2 295 0127 Ĩ 29 2 296 0128 ĩ 29 2 297 0129 Ī 29 2 298 012a ī 29 2 299 012b Ĭ 29 2 300 012c ĭ 29 2 301 012d Į 29 2 302 012e į 29 2 303 012f İ 29 2 304 0130 ı 29 2 305 0131 IJ 29 2 306 0132 ij 29 3 307 0133 Ĵ 31 2 308 0134 ĵ 30 3 309 0135 Ķ 65 3 310 0136 ķ 58 3 311 0137 ĸ 58 0 312 0138 Ĺ 53 2 313 0139 ĺ 29 2 314 013a Ļ 53 3 315 013b ļ 29 3 316 013c Ľ 53 2 317 013d ľ 38 2 318 013e Ŀ 53 2 319 013f ŀ 29 2 320 0140 Ł 53 2 321 0141 ł 29 2 322 0142 Ń 74 2 323 0143 ń 62 2 324 0144 Ņ 74 3 325 0145 ņ 62 1 326 0146 Ň 74 2 327 0147 ň 62 2 328 0148 ʼn 74 2 329 0149 Ŋ 74 3 330 014a ŋ 62 1 331 014b Ō 78 2 332 014c ō 61 2 333 014d Ŏ 78 2 334 014e ŏ 61 2 335 014f Ő 78 2 336 0150 ő 61 2 337 0151 Œ 100 2 338 0152 œ 93 0 339 0153 Ŕ 63 2 340 0154 ŕ 41 2 341 0155 Ŗ 63 3 342 0156 ŗ 41 1 343 0157 Ř 63 2 344 0158 ř 41 2 345 0159 Ś 54 2 346 015a ś 51 2 347 015b Ŝ 54 2 348 015c ŝ 51 2 349 015d Ş 54 3 350 015e ş 51 1 351 015f Š 54 0 352 0160 š 51 2 353 0161 Ţ 63 3 354 0162 ţ 37 3 355 0163 Ť 63 2 356 0164 ť 38 2 357 0165 Ŧ 63 2 358 0166 ŧ 37 2 359 0167 Ũ 69 2 360 0168 ũ 62 2 361 0169 Ū 69 2 362 016a ū 62 2 363 016b Ŭ 69 2 364 016c ŭ 62 2 365 016d Ů 69 2 366 016e ů 62 2 367 016f Ű 69 2 368 0170 ű 62 2 369 0171 Ų 69 3 370 0172 ų 62 1 371 0173 Ŵ 86 2 372 0174 ŵ 77 2 373 0175 Ŷ 62 2 374 0176 ŷ 52 3 375 0177 Ÿ 62 2 376 0178 Ź 61 2 377 0179 ź 57 2 378 017a Ż 61 2 379 017b ż 57 2 380 017c Ž 61 2 381 017d ž 57 2 382 017e ƀ 63 0 384 0180 Ɓ 70 0 385 0181 Ƃ 58 0 386 0182 ƃ 63 0 387 0183 Ƅ 57 0 388 0184 ƅ 49 0 389 0185 Ɔ 69 0 390 0186 Ƈ 69 0 391 0187 ƈ 53 0 392 0188 Ɖ 75 0 393 0189 Ɗ 87 0 394 018a Ƌ 58 0 395 018b ƌ 63 0 396 018c ƍ 59 0 397 018d Ǝ 54 0 398 018e Ə 68 0 399 018f Ɛ 53 0 400 0190 Ƒ 54 0 401 0191 ƒ 39 0 402 0192 Ɠ 72 0 403 0193 Ɣ 66 0 404 0194 ƕ 91 0 405 0195 Ɩ 40 0 406 0196 Ɨ 37 0 407 0197 Ƙ 66 0 408 0198 ƙ 58 0 409 0199 ƚ 36 0 410 019a ƛ 59 0 411 019b Ɯ 106 0 412 019c Ɲ 74 0 413 019d ƞ 62 0 414 019e Ɵ 78 0 415 019f Ơ 78 0 416 01a0 ơ 63 0 417 01a1 Ƣ 106 0 418 01a2 ƣ 89 0 419 01a3 Ƥ 68 0 420 01a4 ƥ 63 0 421 01a5 Ʀ 64 0 422 01a6 Ƨ 54 0 423 01a7 ƨ 51 0 424 01a8 Ʃ 58 0 425 01a9 ƪ 53 0 426 01aa ƫ 37 0 427 01ab Ƭ 67 0 428 01ac ƭ 37 0 429 01ad Ʈ 63 0 430 01ae Ư 82 0 431 01af ư 73 0 432 01b0 Ʊ 78 0 433 01b1 Ʋ 71 0 434 01b2 Ƴ 64 0 435 01b3 ƴ 67 0 436 01b4 Ƶ 61 0 437 01b5 ƶ 57 0 438 01b6 Ʒ 56 0 439 01b7 Ƹ 56 0 440 01b8 ƹ 51 0 441 01b9 ƺ 52 0 442 01ba ƻ 63 0 443 01bb Ƽ 63 0 444 01bc ƽ 48 0 445 01bd ƾ 46 0 446 01be ƿ 61 0 447 01bf ǀ 28 0 448 01c0 ǁ 45 0 449 01c1 ǂ 65 0 450 01c2 ǃ 32 0 451 01c3 DŽ 127 0 452 01c4 Dž 129 0 453 01c5 dž 114 0 454 01c6 LJ 53 0 455 01c7 Lj 53 0 456 01c8 lj 29 0 457 01c9 NJ 74 0 458 01ca Nj 74 0 459 01cb nj 62 0 460 01cc Ǎ 69 0 461 01cd ǎ 55 0 462 01ce Ǐ 29 0 463 01cf ǐ 29 0 464 01d0 Ǒ 78 0 465 01d1 ǒ 61 0 466 01d2 Ǔ 69 0 467 01d3 ǔ 62 0 468 01d4 Ǖ 69 0 469 01d5 ǖ 62 0 470 01d6 Ǘ 69 0 471 01d7 ǘ 62 0 472 01d8 Ǚ 69 0 473 01d9 ǚ 62 0 474 01da Ǜ 69 0 475 01db ǜ 62 0 476 01dc ǝ 56 0 477 01dd Ǟ 69 0 478 01de ǟ 55 0 479 01df Ǡ 69 0 480 01e0 ǡ 55 0 481 01e1 Ǣ 91 0 482 01e2 ǣ 85 0 483 01e3 Ǥ 81 0 484 01e4 ǥ 70 0 485 01e5 Ǧ 72 0 486 01e6 ǧ 62 0 487 01e7 Ǩ 65 0 488 01e8 ǩ 58 0 489 01e9 Ǫ 78 0 490 01ea ǫ 61 0 491 01eb Ǭ 78 0 492 01ec ǭ 61 0 493 01ed Ǯ 56 0 494 01ee ǯ 51 0 495 01ef ǰ 30 0 496 01f0 ɐ 55 0 592 0250 ɑ 61 0 593 0251 ɒ 61 0 594 0252 ɓ 63 2 595 0253 ɔ 51 0 596 0254 ɕ 56 0 597 0255 ɖ 63 2 598 0256 ɗ 63 2 599 0257 ɘ 56 0 600 0258 ə 56 0 601 0259 ɚ 79 0 602 025a ɛ 48 0 603 025b ɜ 48 0 604 025c ɝ 67 0 605 025d ɞ 58 0 606 025e ɟ 40 1 607 025f ɠ 62 1 608 0260 ɡ 62 1 609 0261 ɢ 59 0 610 0262 ɣ 54 0 611 0263 ɤ 53 0 612 0264 ɥ 62 0 613 0265 ɦ 62 0 614 0266 ɧ 62 0 615 0267 ɨ 39 0 616 0268 ɩ 37 0 617 0269 ɪ 41 0 618 026a ɫ 51 0 619 026b ɬ 52 0 620 026c ɭ 30 0 621 026d ɮ 66 0 622 026e ɯ 93 0 623 026f ɰ 93 0 624 0270 ɱ 93 0 625 0271 ɲ 63 0 626 0272 ɳ 63 0 627 0273 ɴ 63 0 628 0274 ɵ 61 0 629 0275 ɶ 81 0 630 0276 ɷ 81 0 631 0277 ɸ 76 0 632 0278 ɹ 41 0 633 0279 ɺ 41 0 634 027a ɻ 43 0 635 027b ɼ 41 0 636 027c ɽ 41 0 637 027d ɾ 41 0 638 027e ɿ 41 0 639 027f ʀ 55 0 640 0280 ʁ 55 0 641 0281 ʂ 51 0 642 0282 ʃ 43 0 643 0283 ʄ 43 0 644 0284 ʅ 45 0 645 0285 ʆ 52 0 646 0286 ʇ 37 0 647 0287 ʈ 37 0 648 0288 ʉ 66 0 649 0289 ʊ 66 0 650 028a ʋ 60 0 651 028b ʌ 52 0 652 028c ʍ 77 0 653 028d ʎ 52 0 654 028e ʏ 49 0 655 028f ʐ 57 0 656 0290 ʑ 70 0 657 0291 ʒ 51 0 658 0292 ʓ 54 0 659 0293 ʔ 44 0 660 0294 ʕ 44 0 661 0295 ʖ 44 0 662 0296 ʗ 49 0 663 0297 ʘ 66 0 664 0298 ʙ 53 0 665 0299 ʚ 58 0 666 029a ʛ 59 0 667 029b ʜ 62 0 668 029c ʝ 49 0 669 029d ʞ 58 0 670 029e ʟ 46 0 671 029f ʠ 63 0 672 02a0 ʡ 46 0 673 02a1 ʢ 46 0 674 02a2 ʣ 104 0 675 02a3 ʤ 100 0 676 02a4 ʥ 117 0 677 02a5 ʦ 79 0 678 02a6 ʧ 70 0 679 02a7 ʨ 88 0 680 02a8 ʰ 38 0 688 02b0 ʱ 38 0 689 02b1 ʲ 25 0 690 02b2 ʳ 26 0 691 02b3 ʴ 27 0 692 02b4 ʵ 32 0 693 02b5 ʶ 35 0 694 02b6 ʷ 49 0 695 02b7 ʸ 33 0 696 02b8 ʹ 29 0 697 02b9 ʺ 51 0 698 02ba ʻ 32 0 699 02bb ʼ 32 0 700 02bc ʽ 32 0 701 02bd ʾ 31 0 702 02be ʿ 31 0 703 02bf ˀ 33 0 704 02c0 ˁ 33 0 705 02c1 ˂ 40 0 706 02c2 ˃ 40 0 707 02c3 ˄ 40 0 708 02c4 ˅ 40 0 709 02c5 ˆ 61 0 710 02c6 ˇ 61 0 711 02c7 ˈ 24 0 712 02c8 ˉ 61 0 713 02c9 ˊ 61 0 714 02ca ˋ 61 0 715 02cb ˌ 24 0 716 02cc ˍ 61 0 717 02cd ˎ 61 0 718 02ce ˏ 61 0 719 02cf ː 41 0 720 02d0 ˑ 41 0 721 02d1 ˒ 29 0 722 02d2 ˓ 29 0 723 02d3 ˔ 47 0 724 02d4 ˕ 47 0 725 02d5 ˖ 47 0 726 02d6 ˗ 47 0 727 02d7 ˘ 61 0 728 02d8 ˙ 61 0 729 02d9 ˚ 61 0 730 02da ˛ 61 0 731 02db ˜ 61 0 732 02dc ˝ 61 0 733 02dd ˞ 26 0 734 02de ˟ 61 0 735 02df ˠ 38 0 736 02e0 ˡ 18 0 737 02e1 ˢ 35 0 738 02e2 ˣ 42 0 739 02e3 ˤ 33 0 740 02e4 ˥ 44 0 741 02e5 ˦ 44 0 742 02e6 ˧ 44 0 743 02e7 ˨ 44 0 744 02e8 ˩ 44 0 745 02e9 ̀ 0 0 768 0300 ́ 0 0 769 0301 ̂ 0 0 770 0302 ̃ 0 0 771 0303 ̄ 0 0 772 0304 ̅ 0 0 773 0305 ̆ 0 0 774 0306 ̇ 0 0 775 0307 ̈ 0 0 776 0308 ̉ 0 0 777 0309 ̊ 0 0 778 030a ̋ 0 0 779 030b ̌ 0 0 780 030c ̍ 0 0 781 030d ̎ 0 0 782 030e ̏ 0 0 783 030f ̐ 0 0 784 0310 ̑ 0 0 785 0311 ̒ 0 0 786 0312 ̓ 0 0 787 0313 ̔ 0 0 788 0314 ̕ 0 0 789 0315 ̖ 0 0 790 0316 ̗ 0 0 791 0317 ̘ 0 0 792 0318 ̙ 0 0 793 0319 ̚ 0 0 794 031a ̛ 0 0 795 031b ̜ 0 0 796 031c ̝ 0 0 797 031d ̞ 0 0 798 031e ̟ 0 0 799 031f ̠ 0 0 800 0320 ̡ 0 0 801 0321 ̢ 0 0 802 0322 ̣ 0 0 803 0323 ̤ 0 0 804 0324 ̥ 0 0 805 0325 ̦ 0 0 806 0326 ̧ 0 0 807 0327 ̨ 0 0 808 0328 ̩ 0 0 809 0329 ̪ 0 0 810 032a ̫ 0 0 811 032b ̬ 0 0 812 032c ̭ 0 0 813 032d ̮ 0 0 814 032e ̯ 0 0 815 032f ̰ 0 0 816 0330 ̱ 0 0 817 0331 ̲ 0 0 818 0332 ̳ 0 0 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 0 824 0338 ̹ 0 0 825 0339 ̺ 0 0 826 033a ̻ 0 0 827 033b ̼ 0 0 828 033c ̽ 0 0 829 033d ̾ 0 0 830 033e ̿ 0 0 831 033f ̀ 0 0 832 0340 ́ 0 0 833 0341 ̈́ 0 0 836 0344 ͅ 0 0 837 0345 ͱ 0 0 881 0371 Ͳ 0 0 882 0372 ʹ 33 0 884 0374 ͵ 33 0 885 0375 ͺ 61 0 890 037a ; 32 0 894 037e ΄ 61 0 900 0384 ΅ 61 0 901 0385 Ά 69 2 902 0386 Έ 65 2 904 0388 Ή 84 2 905 0389 Ί 40 2 906 038a Ό 86 2 908 038c Ύ 82 2 910 038e Ώ 87 2 911 038f ΐ 37 2 912 0390 Α 69 2 913 0391 Β 58 2 914 0392 Γ 51 2 915 0393 Δ 70 2 916 0394 Ε 54 2 917 0395 Ζ 61 2 918 0396 Η 74 2 919 0397 Θ 78 2 920 0398 Ι 29 2 921 0399 Κ 65 2 922 039a Λ 65 2 923 039b Μ 86 2 924 039c Ν 74 2 925 039d Ξ 61 2 926 039e Ο 78 2 927 039f Π 74 2 928 03a0 Ρ 55 2 929 03a1 Σ 59 2 931 03a3 Τ 63 2 932 03a4 Υ 64 2 933 03a5 Φ 71 2 934 03a6 Χ 63 2 935 03a7 Ψ 73 2 936 03a8 Ω 80 2 937 03a9 Ϊ 29 2 938 03aa Ϋ 64 2 939 03ab ά 72 2 940 03ac έ 53 2 941 03ad ή 62 2 942 03ae ί 37 2 943 03af ΰ 61 2 944 03b0 α 72 0 945 03b1 β 60 3 946 03b2 γ 57 1 947 03b3 δ 59 2 948 03b4 ε 53 0 949 03b5 ζ 64 3 950 03b6 η 62 0 951 03b7 θ 61 0 952 03b8 ι 37 0 953 03b9 κ 55 0 954 03ba λ 59 2 955 03bb μ 63 0 956 03bc ν 55 0 957 03bd ξ 58 3 958 03be ο 61 0 959 03bf π 78 0 960 03c0 ρ 62 0 961 03c1 ς 58 1 962 03c2 σ 67 0 963 03c3 τ 54 0 964 03c4 υ 61 0 965 03c5 φ 77 0 966 03c6 χ 55 2 967 03c7 ψ 79 2 968 03c8 ω 90 0 969 03c9 ϊ 37 2 970 03ca ϋ 61 2 971 03cb ό 61 2 972 03cc ύ 61 2 973 03cd ώ 90 2 974 03ce ϐ 52 2 976 03d0 ϑ 62 2 977 03d1 ϒ 64 2 978 03d2 ϓ 82 2 979 03d3 ϔ 64 2 980 03d4 ϕ 85 0 981 03d5 ϖ 89 0 982 03d6 Ϛ 67 3 986 03da Ϝ 54 2 988 03dc Ϟ 53 3 990 03de Ϡ 63 2 992 03e0 Ϯ 63 2 1006 03ee ϯ 55 0 1007 03ef ϰ 55 0 1008 03f0 ϱ 60 0 1009 03f1 ϲ 51 0 1010 03f2 Ё 54 2 1025 0401 Ђ 80 2 1026 0402 Ѓ 51 2 1027 0403 Є 60 2 1028 0404 Ѕ 54 2 1029 0405 І 29 2 1030 0406 Ї 29 2 1031 0407 Ј 31 2 1032 0408 Љ 98 2 1033 0409 Њ 97 2 1034 040a Ћ 76 2 1035 040b Ќ 59 2 1036 040c Ў 64 2 1038 040e Џ 74 3 1039 040f А 69 2 1040 0410 Б 58 2 1041 0411 В 58 2 1042 0412 Г 51 2 1043 0413 Д 76 2 1044 0414 Е 54 2 1045 0415 Ж 82 2 1046 0416 З 54 2 1047 0417 И 74 2 1048 0418 Й 74 2 1049 0419 К 59 2 1050 041a Л 70 2 1051 041b М 86 2 1052 041c Н 74 2 1053 041d О 78 2 1054 041e П 74 2 1055 041f Р 55 2 1056 0420 С 69 2 1057 0421 Т 63 2 1058 0422 У 64 1 1059 0423 Ф 69 0 1060 0424 Х 63 2 1061 0425 Ц 77 2 1062 0426 Ч 63 2 1063 0427 Ш 95 2 1064 0428 Щ 99 2 1065 0429 Ъ 68 2 1066 042a Ы 80 2 1067 042b Ь 57 2 1068 042c Э 60 2 1069 042d Ю 97 2 1070 042e Я 62 2 1071 042f а 55 0 1072 0430 б 60 2 1073 0431 в 53 0 1074 0432 г 49 0 1075 0433 д 67 0 1076 0434 е 56 0 1077 0435 ж 73 0 1078 0436 з 48 0 1079 0437 и 63 0 1080 0438 й 63 0 1081 0439 к 54 0 1082 043a л 59 0 1083 043b м 73 0 1084 043c н 63 0 1085 043d о 61 0 1086 043e п 63 0 1087 043f р 63 0 1088 0440 с 51 0 1089 0441 т 49 0 1090 0442 у 53 0 1091 0443 ф 81 0 1092 0444 х 61 0 1093 0445 ц 67 0 1094 0446 ч 52 0 1095 0447 ш 84 0 1096 0448 щ 89 0 1097 0449 ъ 56 0 1098 044a ы 72 0 1099 044b ь 51 0 1100 044c э 51 0 1101 044d ю 81 0 1102 044e я 51 0 1103 044f ё 56 0 1105 0451 ђ 62 0 1106 0452 ѓ 49 0 1107 0453 є 51 0 1108 0454 ѕ 51 0 1109 0455 і 29 0 1110 0456 ї 29 0 1111 0457 ј 30 0 1112 0458 љ 80 0 1113 0459 њ 84 0 1114 045a ћ 62 0 1115 045b ќ 54 0 1116 045c ў 53 0 1118 045e џ 63 0 1119 045f Ѣ 66 0 1122 0462 ѣ 55 0 1123 0463 Ѫ 81 0 1130 046a ѫ 70 0 1131 046b Ґ 51 0 1168 0490 ґ 49 0 1169 0491 Ғ 56 0 1170 0492 ғ 49 0 1171 0493 Ҕ 63 0 1172 0494 ҕ 55 0 1173 0495 Җ 87 0 1174 0496 җ 78 0 1175 0497 Ҙ 54 0 1176 0498 ҙ 48 0 1177 0499 Қ 64 0 1178 049a қ 57 0 1179 049b Ҝ 73 0 1180 049c ҝ 67 0 1181 049d Ҟ 61 0 1182 049e ҟ 54 0 1183 049f Ҡ 69 0 1184 04a0 ҡ 59 0 1185 04a1 Ң 77 0 1186 04a2 ң 66 0 1187 04a3 Ҥ 85 0 1188 04a4 ҥ 69 0 1189 04a5 Ҧ 102 0 1190 04a6 ҧ 88 0 1191 04a7 Ҩ 77 0 1192 04a8 ҩ 62 0 1193 04a9 Ҫ 69 0 1194 04aa ҫ 51 0 1195 04ab Ҭ 63 0 1196 04ac ҭ 49 0 1197 04ad Ү 62 0 1198 04ae ү 49 0 1199 04af Ұ 62 0 1200 04b0 ұ 49 0 1201 04b1 Ҳ 66 0 1202 04b2 ҳ 63 0 1203 04b3 Ҵ 87 0 1204 04b4 ҵ 69 0 1205 04b5 Ҷ 66 0 1206 04b6 ҷ 56 0 1207 04b7 Ҹ 63 0 1208 04b8 ҹ 52 0 1209 04b9 Һ 63 0 1210 04ba һ 52 0 1211 04bb Ҽ 86 0 1212 04bc ҽ 72 0 1213 04bd Ҿ 86 0 1214 04be ҿ 72 0 1215 04bf Ӏ 29 0 1216 04c0 Ӂ 82 0 1217 04c1 ӂ 73 0 1218 04c2 Ӄ 60 0 1219 04c3 ӄ 54 0 1220 04c4 Ӆ 59 0 1221 04c5 ӆ 54 0 1222 04c6 Ӈ 74 0 1223 04c7 ӈ 63 0 1224 04c8 Ӊ 63 0 1225 04c9 ӊ 61 0 1226 04ca Ӌ 63 0 1227 04cb ӌ 52 0 1228 04cc ְ 0 0 1456 05b0 ֱ 0 0 1457 05b1 ֲ 0 0 1458 05b2 ֳ 0 0 1459 05b3 ִ 0 0 1460 05b4 ֵ 0 0 1461 05b5 ֶ 0 0 1462 05b6 ַ 0 0 1463 05b7 ָ 0 0 1464 05b8 ֹ 0 0 1465 05b9 ֻ 0 0 1467 05bb ּ 0 0 1468 05bc ֽ 0 0 1469 05bd ־ 42 0 1470 05be ֿ 0 0 1471 05bf ׀ 25 0 1472 05c0 ׁ 0 0 1473 05c1 ׂ 0 0 1474 05c2 ׃ 25 0 1475 05c3 א 65 0 1488 05d0 ב 56 0 1489 05d1 ג 43 0 1490 05d2 ד 50 0 1491 05d3 ה 71 0 1492 05d4 ו 32 0 1493 05d5 ז 32 0 1494 05d6 ח 71 0 1495 05d7 ט 64 0 1496 05d8 י 32 0 1497 05d9 ך 53 0 1498 05da כ 57 0 1499 05db ל 53 0 1500 05dc ם 71 0 1501 05dd מ 66 0 1502 05de ן 31 0 1503 05df נ 41 0 1504 05e0 ס 67 0 1505 05e1 ע 60 0 1506 05e2 ף 52 0 1507 05e3 פ 57 0 1508 05e4 ץ 49 0 1509 05e5 צ 58 0 1510 05e6 ק 67 0 1511 05e7 ר 51 0 1512 05e8 ש 72 0 1513 05e9 ת 69 0 1514 05ea װ 62 0 1520 05f0 ױ 62 0 1521 05f1 ײ 60 0 1522 05f2 ׳ 28 0 1523 05f3 ״ 48 0 1524 05f4 ׵ 0 0 1525 05f5   50 0 8192 2000   100 0 8193 2001   50 0 8194 2002   100 0 8195 2003   33 0 8196 2004   25 0 8197 2005   17 0 8198 2006   63 0 8199 2007   32 0 8200 2008   13 0 8201 2009   6 0 8202 200a ​ 0 0 8203 200b ‌ 0 0 8204 200c ‍ 0 0 8205 200d ‎ 0 0 8206 200e ‏ 0 0 8207 200f ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 63 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‖ 58 0 8214 2016 ‗ 50 0 8215 2017 ‚ 32 0 8218 201a ‛ 32 0 8219 201b “ 37 0 8220 201c ” 37 0 8221 201d „ 37 0 8222 201e ‟ 37 0 8223 201f † 63 0 8224 2020 ‡ 63 0 8225 2021 • 56 0 8226 2022 ‣ 36 0 8227 2023 ․ 33 0 8228 2024 ‥ 67 0 8229 2025 … 100 0 8230 2026 ‧ 33 0 8231 2027 
 0 0 8232 2028 
 0 0 8233 2029 ‪ 0 0 8234 202a ‫ 0 0 8235 202b ‬ 0 0 8236 202c ‭ 0 0 8237 202d ‮ 0 0 8238 202e ‰ 101 0 8240 2030 ‱ 136 0 8241 2031 ′ 33 0 8242 2032 ″ 54 0 8243 2033 ‴ 76 0 8244 2034 ‵ 33 0 8245 2035 ‶ 54 0 8246 2036 ‷ 76 0 8247 2037 ‸ 35 0 8248 2038 ‹ 33 0 8249 2039 › 33 0 8250 203a ※ 72 0 8251 203b ‼ 52 0 8252 203c ‽ 42 0 8253 203d ‾ 50 0 8254 203e ⁀ 59 0 8256 2040 ⁁ 47 0 8257 2041 ⁂ 92 0 8258 2042 ⁃ 33 0 8259 2043 ⁄ 0 0 8260 2044 ⁅ 60 0 8261 2045 ⁰ 42 0 8304 2070 ⁱ 42 0 8305 2071 ⁲ 42 0 8306 2072 ⁳ 42 0 8307 2073 ⁴ 42 0 8308 2074 ⁵ 42 0 8309 2075 ⁶ 42 0 8310 2076 ⁷ 42 0 8311 2077 ⁸ 42 0 8312 2078 ⁹ 42 0 8313 2079 ⁺ 42 0 8314 207a ⁻ 42 0 8315 207b ⁼ 42 0 8316 207c ⁽ 23 0 8317 207d ⁾ 23 0 8318 207e ⁿ 38 0 8319 207f ₀ 42 0 8320 2080 ₁ 42 0 8321 2081 ₂ 42 0 8322 2082 ₃ 42 0 8323 2083 ₄ 42 0 8324 2084 ₅ 42 0 8325 2085 ₆ 42 0 8326 2086 ₇ 42 0 8327 2087 ₈ 42 0 8328 2088 ₉ 42 0 8329 2089 ₊ 42 0 8330 208a ₋ 42 0 8331 208b ₌ 42 0 8332 208c ₍ 23 0 8333 208d ₎ 23 0 8334 208e ₠ 70 0 8352 20a0 ₡ 71 0 8353 20a1 ₢ 69 0 8354 20a2 ₣ 63 0 8355 20a3 ₤ 63 0 8356 20a4 ₥ 93 0 8357 20a5 ₦ 82 0 8358 20a6 ₧ 132 0 8359 20a7 ₨ 101 0 8360 20a8 ₩ 105 0 8361 20a9 ₪ 106 0 8362 20aa ℀ 75 0 8448 2100 ℁ 75 0 8449 2101 ℂ 74 0 8450 2102 ℃ 92 0 8451 2103 ℄ 65 0 8452 2104 ℅ 75 0 8453 2105 ℆ 75 0 8454 2106 ℇ 63 0 8455 2107 ℈ 60 0 8456 2108 ℉ 78 0 8457 2109 ℊ 77 0 8458 210a ℋ 112 0 8459 210b ℌ 64 0 8460 210c ℍ 88 0 8461 210d ℎ 70 0 8462 210e ℏ 70 0 8463 210f ℐ 68 0 8464 2110 ℑ 70 0 8465 2111 ℒ 79 0 8466 2112 ℓ 59 0 8467 2113 ℔ 98 0 8468 2114 ℕ 82 0 8469 2115 № 97 0 8470 2116 ℗ 86 0 8471 2117 ℘ 73 0 8472 2118 ℙ 71 0 8473 2119 ℚ 90 0 8474 211a ℛ 94 0 8475 211b ℜ 91 0 8476 211c ℝ 78 0 8477 211d ℞ 63 0 8478 211e ℟ 63 0 8479 211f ℠ 81 0 8480 2120 ℡ 148 0 8481 2121 ™ 81 0 8482 2122 tm " ℣ 65 0 8483 2123 ℤ 65 0 8484 2124 ℥ 51 0 8485 2125 Ω 88 0 8486 2126 ℧ 88 0 8487 2127 ℨ 58 0 8488 2128 ℩ 40 0 8489 2129 K 65 0 8490 212a Å 69 0 8491 212b ℬ 80 0 8492 212c ℭ 68 0 8493 212d ℮ 85 0 8494 212e ℯ 49 0 8495 212f ℰ 57 0 8496 2130 ℱ 83 0 8497 2131 Ⅎ 66 0 8498 2132 ℳ 104 0 8499 2133 ℴ 57 0 8500 2134 ℵ 68 0 8501 2135 ℶ 67 0 8502 2136 ℷ 46 0 8503 2137 ℸ 61 0 8504 2138 ← 94 0 8592 2190 <- " ↑ 53 0 8593 2191 ua " → 94 0 8594 2192 -> " ↓ 53 0 8595 2193 da " ↔ 121 0 8596 2194 ab " ↕ 53 0 8597 2195 ↖ 75 0 8598 2196 ↗ 75 0 8599 2197 ↘ 75 0 8600 2198 ↙ 75 0 8601 2199 ↚ 94 0 8602 219a ↛ 94 0 8603 219b ↜ 80 0 8604 219c ↝ 80 0 8605 219d ↞ 94 0 8606 219e ↟ 53 0 8607 219f ↠ 94 0 8608 21a0 ↡ 53 0 8609 21a1 ↢ 94 0 8610 21a2 ↣ 94 0 8611 21a3 ↤ 94 0 8612 21a4 ↥ 53 0 8613 21a5 ↦ 94 0 8614 21a6 ↧ 53 0 8615 21a7 ↨ 53 0 8616 21a8 ↩ 94 0 8617 21a9 ↪ 94 0 8618 21aa ↫ 94 0 8619 21ab ↬ 94 0 8620 21ac ↭ 122 0 8621 21ad ↮ 121 0 8622 21ae ↯ 66 0 8623 21af ↰ 69 0 8624 21b0 ↱ 69 0 8625 21b1 ↲ 69 0 8626 21b2 ↳ 69 0 8627 21b3 ↴ 69 0 8628 21b4 ↵ 94 0 8629 21b5 ↶ 98 0 8630 21b6 ↷ 98 0 8631 21b7 ↸ 94 0 8632 21b8 ↹ 94 0 8633 21b9 ↺ 94 0 8634 21ba ↻ 94 0 8635 21bb ↼ 94 0 8636 21bc ↽ 94 0 8637 21bd ↾ 43 0 8638 21be ↿ 43 0 8639 21bf ⇀ 94 0 8640 21c0 ⇁ 94 0 8641 21c1 ⇂ 43 0 8642 21c2 ⇃ 43 0 8643 21c3 ⇄ 94 0 8644 21c4 ⇅ 77 0 8645 21c5 ⇆ 94 0 8646 21c6 ⇇ 94 0 8647 21c7 ⇈ 77 0 8648 21c8 ⇉ 94 0 8649 21c9 ⇊ 77 0 8650 21ca ⇋ 94 0 8651 21cb ⇌ 94 0 8652 21cc ⇍ 94 0 8653 21cd ⇎ 121 0 8654 21ce ⇏ 94 0 8655 21cf ⇐ 94 0 8656 21d0 ⇑ 77 0 8657 21d1 ⇒ 94 0 8658 21d2 ⇓ 77 0 8659 21d3 ⇔ 121 0 8660 21d4 ⇕ 77 0 8661 21d5 ⇖ 81 0 8662 21d6 ⇗ 81 0 8663 21d7 ⇘ 81 0 8664 21d8 ⇙ 81 0 8665 21d9 ⇚ 94 0 8666 21da ⇛ 94 0 8667 21db ⇜ 121 0 8668 21dc ⇝ 121 0 8669 21dd ⇞ 53 0 8670 21de ⇟ 53 0 8671 21df ⇠ 94 0 8672 21e0 ⇡ 53 0 8673 21e1 ⇢ 94 0 8674 21e2 ⇣ 53 0 8675 21e3 ⇤ 94 0 8676 21e4 ⇥ 94 0 8677 21e5 ⇦ 94 0 8678 21e6 ⇧ 77 0 8679 21e7 ⇨ 94 0 8680 21e8 ⇩ 77 0 8681 21e9 ⇪ 77 0 8682 21ea ∀ 89 0 8704 2200 fa " ∁ 72 0 8705 2201 ∂ 66 0 8706 2202 pd " ∃ 66 0 8707 2203 te " ∄ 66 0 8708 2204 ∅ 98 0 8709 2205 es " ∆ 89 0 8710 2206 ∇ 89 0 8711 2207 gr " ∈ 80 0 8712 2208 ∉ 80 0 8713 2209 !m " ∊ 67 0 8714 220a ∋ 80 0 8715 220b ∌ 80 0 8716 220c ∍ 67 0 8717 220d st " ∎ 80 0 8718 220e ∏ 93 0 8719 220f ∐ 93 0 8720 2210 ∑ 81 0 8721 2211 − 80 0 8722 2212 ∓ 80 0 8723 2213 ∔ 80 0 8724 2214 ∕ 53 0 8725 2215 ∖ 53 0 8726 2216 ∗ 80 0 8727 2217 ** " ∘ 56 0 8728 2218 ∙ 56 0 8729 2219 bu " √ 81 0 8730 221a sr " ∛ 81 0 8731 221b ∜ 81 0 8732 221c ∝ 94 0 8733 221d pt " ∞ 94 0 8734 221e if " ∟ 80 0 8735 221f ∠ 80 0 8736 2220 an " ∡ 80 0 8737 2221 ∢ 80 0 8738 2222 ∣ 37 0 8739 2223 ∤ 51 0 8740 2224 ∥ 58 0 8741 2225 ∦ 71 0 8742 2226 ∧ 80 0 8743 2227 l& " ∨ 80 0 8744 2228 l| " ∩ 80 0 8745 2229 ca " ∪ 80 0 8746 222a cu " ∫ 58 0 8747 222b is " ∬ 86 0 8748 222c ∭ 113 0 8749 222d ∮ 61 0 8750 222e ∯ 89 0 8751 222f ∰ 117 0 8752 2230 ∱ 61 0 8753 2231 ∲ 61 0 8754 2232 ∳ 61 0 8755 2233 ∴ 80 0 8756 2234 tf " ∵ 80 0 8757 2235 ∶ 42 0 8758 2236 ∷ 80 0 8759 2237 ∸ 80 0 8760 2238 ∹ 80 0 8761 2239 ∺ 80 0 8762 223a ∻ 80 0 8763 223b ∼ 80 0 8764 223c ∽ 80 0 8765 223d ∾ 80 0 8766 223e ∿ 80 0 8767 223f ≀ 49 0 8768 2240 ≁ 80 0 8769 2241 ≂ 80 0 8770 2242 ≃ 80 0 8771 2243 ~= " ≄ 80 0 8772 2244 ≅ 80 0 8773 2245 cg " ≆ 80 0 8774 2246 ≇ 80 0 8775 2247 ≈ 80 0 8776 2248 ~~ " ≉ 80 0 8777 2249 ≊ 80 0 8778 224a ≋ 80 0 8779 224b ≌ 80 0 8780 224c ≍ 80 0 8781 224d ≎ 80 0 8782 224e ≏ 80 0 8783 224f ≐ 80 0 8784 2250 ≑ 80 0 8785 2251 ≒ 80 0 8786 2252 ≓ 80 0 8787 2253 ≔ 80 0 8788 2254 ≕ 80 0 8789 2255 ≖ 80 0 8790 2256 ≗ 80 0 8791 2257 ≘ 80 0 8792 2258 ≙ 80 0 8793 2259 ≚ 80 0 8794 225a ≛ 80 0 8795 225b ≜ 80 0 8796 225c ≝ 80 0 8797 225d ≞ 80 0 8798 225e ≟ 80 0 8799 225f ≠ 80 0 8800 2260 != " ≡ 80 0 8801 2261 == " ≢ 80 0 8802 2262 ≣ 80 0 8803 2263 ≤ 80 0 8804 2264 ≥ 80 0 8805 2265 ≦ 80 0 8806 2266 <= " ≧ 80 0 8807 2267 >= " ≨ 80 0 8808 2268 ≩ 80 0 8809 2269 ≪ 112 0 8810 226a ≫ 112 0 8811 226b ≬ 55 0 8812 226c ≭ 80 0 8813 226d ≮ 80 0 8814 226e ≯ 80 0 8815 226f ≰ 80 0 8816 2270 ≱ 80 0 8817 2271 ≲ 80 0 8818 2272 ≳ 80 0 8819 2273 ≴ 80 0 8820 2274 ≵ 80 0 8821 2275 ≶ 80 0 8822 2276 ≷ 80 0 8823 2277 ≸ 80 0 8824 2278 ≹ 80 0 8825 2279 ≺ 80 0 8826 227a ≻ 80 0 8827 227b ≼ 80 0 8828 227c ≽ 80 0 8829 227d ≾ 80 0 8830 227e ≿ 80 0 8831 227f ⊀ 80 0 8832 2280 ⊁ 80 0 8833 2281 ⊂ 80 0 8834 2282 sb " ⊃ 80 0 8835 2283 sp " ⊄ 80 0 8836 2284 !b " ⊅ 80 0 8837 2285 ⊆ 80 0 8838 2286 ib " ⊇ 80 0 8839 2287 ip " ⊈ 80 0 8840 2288 ⊉ 80 0 8841 2289 ⊊ 80 0 8842 228a ⊋ 80 0 8843 228b ⊌ 80 0 8844 228c ⊍ 80 0 8845 228d ⊎ 80 0 8846 228e ⊏ 80 0 8847 228f ⊐ 80 0 8848 2290 ⊑ 80 0 8849 2291 ⊒ 80 0 8850 2292 ⊓ 80 0 8851 2293 ⊔ 80 0 8852 2294 ⊕ 80 0 8853 2295 O+ " ⊖ 80 0 8854 2296 O- " ⊗ 80 0 8855 2297 Ox " ⊘ 80 0 8856 2298 ⊙ 80 0 8857 2299 ⊚ 80 0 8858 229a ⊛ 80 0 8859 229b ⊜ 80 0 8860 229c ⊝ 80 0 8861 229d ⊞ 80 0 8862 229e ⊟ 80 0 8863 229f ⊠ 80 0 8864 22a0 ⊡ 80 0 8865 22a1 ⊢ 80 0 8866 22a2 tu " ⊣ 80 0 8867 22a3 ⊤ 80 0 8868 22a4 ⊥ 80 0 8869 22a5 ⊦ 58 0 8870 22a6 ⊧ 58 0 8871 22a7 ⊨ 80 0 8872 22a8 Tu " ⊩ 80 0 8873 22a9 ⊪ 80 0 8874 22aa ⊫ 80 0 8875 22ab ⊬ 80 0 8876 22ac ⊭ 80 0 8877 22ad ⊮ 80 0 8878 22ae ⊯ 80 0 8879 22af ⊰ 80 0 8880 22b0 ⊱ 80 0 8881 22b1 ⊲ 80 0 8882 22b2 ⊳ 80 0 8883 22b3 ⊴ 80 0 8884 22b4 ⊵ 80 0 8885 22b5 ⊶ 94 0 8886 22b6 ⊷ 94 0 8887 22b7 ⊸ 80 0 8888 22b8 ⊹ 80 0 8889 22b9 ⊺ 63 0 8890 22ba ⊻ 80 0 8891 22bb ⊼ 80 0 8892 22bc ⊽ 80 0 8893 22bd ⊾ 80 0 8894 22be ⊿ 80 0 8895 22bf ⋀ 80 0 8896 22c0 ⋁ 80 0 8897 22c1 ⋂ 80 0 8898 22c2 ⋃ 80 0 8899 22c3 ⋄ 80 0 8900 22c4 lz " ⋅ 45 0 8901 22c5 ⋆ 80 0 8902 22c6 ⋇ 80 0 8903 22c7 ⋈ 100 0 8904 22c8 ⋉ 80 0 8905 22c9 ⋊ 80 0 8906 22ca ⋋ 80 0 8907 22cb ⋌ 80 0 8908 22cc ⋍ 80 0 8909 22cd ⋎ 80 0 8910 22ce ⋏ 80 0 8911 22cf ⋐ 80 0 8912 22d0 ⋑ 80 0 8913 22d1 ⋒ 80 0 8914 22d2 ⋓ 80 0 8915 22d3 ⋔ 80 0 8916 22d4 ⋕ 80 0 8917 22d5 ⋖ 80 0 8918 22d6 ⋗ 80 0 8919 22d7 ⋘ 144 0 8920 22d8 ⋙ 144 0 8921 22d9 ⋚ 80 0 8922 22da ⋛ 80 0 8923 22db ⋜ 80 0 8924 22dc ⋝ 80 0 8925 22dd ⋞ 80 0 8926 22de ⋟ 80 0 8927 22df ⋠ 80 0 8928 22e0 ⋡ 80 0 8929 22e1 ⋢ 80 0 8930 22e2 ⋣ 80 0 8931 22e3 ⋤ 80 0 8932 22e4 ⋥ 80 0 8933 22e5 ⋦ 80 0 8934 22e6 ⋧ 80 0 8935 22e7 ⋨ 80 0 8936 22e8 ⋩ 80 0 8937 22e9 ⋪ 80 0 8938 22ea ⋫ 80 0 8939 22eb ⋬ 80 0 8940 22ec ⋭ 80 0 8941 22ed ⋮ 80 0 8942 22ee ⋯ 80 0 8943 22ef el " ⋰ 80 0 8944 22f0 ⋱ 80 0 8945 22f1 ␀ 100 0 9216 2400 ␁ 100 0 9217 2401 ␂ 100 0 9218 2402 ␃ 100 0 9219 2403 ␄ 100 0 9220 2404 ␅ 100 0 9221 2405 ␆ 100 0 9222 2406 ␇ 100 0 9223 2407 ␈ 100 0 9224 2408 ␉ 100 0 9225 2409 ␊ 100 0 9226 240a ␋ 89 0 9227 240b ␌ 100 0 9228 240c ␍ 100 0 9229 240d ␎ 100 0 9230 240e ␏ 100 0 9231 240f ␐ 100 0 9232 2410 ␑ 100 0 9233 2411 ␒ 100 0 9234 2412 ␓ 100 0 9235 2413 ␔ 100 0 9236 2414 ␕ 100 0 9237 2415 ␖ 100 0 9238 2416 ␗ 100 0 9239 2417 ␘ 100 0 9240 2418 ␙ 100 0 9241 2419 ␚ 100 0 9242 241a ␛ 100 0 9243 241b ␜ 100 0 9244 241c ␝ 100 0 9245 241d ␞ 100 0 9246 241e ␟ 100 0 9247 241f ␠ 100 0 9248 2420 ␡ 100 0 9249 2421 ␢ 100 0 9250 2422 ␣ 32 0 9251 2423 ␤ 100 0 9252 2424 ─ 100 0 9472 2500 ━ 100 0 9473 2501 │ 100 0 9474 2502 ┃ 100 0 9475 2503 ┄ 100 0 9476 2504 ┅ 100 0 9477 2505 ┆ 100 0 9478 2506 ┇ 100 0 9479 2507 ┈ 100 0 9480 2508 ┉ 100 0 9481 2509 ┊ 100 0 9482 250a ┋ 100 0 9483 250b ┌ 100 0 9484 250c ┍ 100 0 9485 250d ┎ 100 0 9486 250e ┏ 100 0 9487 250f ┐ 100 0 9488 2510 ┑ 100 0 9489 2511 ┒ 100 0 9490 2512 ┓ 100 0 9491 2513 └ 100 0 9492 2514 ┕ 100 0 9493 2515 ┖ 100 0 9494 2516 ┗ 100 0 9495 2517 ┘ 100 0 9496 2518 ┙ 100 0 9497 2519 ┚ 100 0 9498 251a ┛ 100 0 9499 251b ├ 100 0 9500 251c ┝ 100 0 9501 251d ┞ 100 0 9502 251e ┟ 100 0 9503 251f ┠ 100 0 9504 2520 ┡ 100 0 9505 2521 ┢ 100 0 9506 2522 ┣ 100 0 9507 2523 ┤ 100 0 9508 2524 ┥ 100 0 9509 2525 ┦ 100 0 9510 2526 ┧ 100 0 9511 2527 ┨ 100 0 9512 2528 ┩ 100 0 9513 2529 ┪ 100 0 9514 252a ┫ 100 0 9515 252b ┬ 100 0 9516 252c ┭ 100 0 9517 252d ┮ 100 0 9518 252e ┯ 100 0 9519 252f ┰ 100 0 9520 2530 ┱ 100 0 9521 2531 ┲ 100 0 9522 2532 ┳ 100 0 9523 2533 ┴ 100 0 9524 2534 ┵ 100 0 9525 2535 ┶ 100 0 9526 2536 ┷ 100 0 9527 2537 ┸ 100 0 9528 2538 ┹ 100 0 9529 2539 ┺ 100 0 9530 253a ┻ 100 0 9531 253b ┼ 100 0 9532 253c ┽ 100 0 9533 253d ┾ 100 0 9534 253e ┿ 100 0 9535 253f ╀ 100 0 9536 2540 ╁ 100 0 9537 2541 ╂ 100 0 9538 2542 ╃ 100 0 9539 2543 ╄ 100 0 9540 2544 ╅ 100 0 9541 2545 ╆ 100 0 9542 2546 ╇ 100 0 9543 2547 ╈ 100 0 9544 2548 ╉ 100 0 9545 2549 ╊ 100 0 9546 254a ╋ 100 0 9547 254b ╌ 100 0 9548 254c ╍ 100 0 9549 254d ╎ 100 0 9550 254e ╏ 100 0 9551 254f ═ 100 0 9552 2550 ║ 100 0 9553 2551 ╒ 100 0 9554 2552 ╓ 100 0 9555 2553 ╔ 100 0 9556 2554 ╕ 100 0 9557 2555 ╖ 100 0 9558 2556 ╗ 100 0 9559 2557 ╘ 100 0 9560 2558 ╙ 100 0 9561 2559 ╚ 100 0 9562 255a ╛ 100 0 9563 255b ╜ 100 0 9564 255c ╝ 100 0 9565 255d ╞ 100 0 9566 255e ╟ 100 0 9567 255f ╠ 100 0 9568 2560 ╡ 100 0 9569 2561 ╢ 100 0 9570 2562 ╣ 100 0 9571 2563 ╤ 100 0 9572 2564 ╥ 100 0 9573 2565 ╦ 100 0 9574 2566 ╧ 100 0 9575 2567 ╨ 100 0 9576 2568 ╩ 100 0 9577 2569 ╪ 100 0 9578 256a ╫ 100 0 9579 256b ╬ 100 0 9580 256c ╭ 100 0 9581 256d ╮ 100 0 9582 256e ╯ 100 0 9583 256f ╰ 100 0 9584 2570 ╱ 100 0 9585 2571 ╲ 100 0 9586 2572 ╳ 100 0 9587 2573 ╴ 100 0 9588 2574 ╵ 100 0 9589 2575 ╶ 100 0 9590 2576 ╷ 100 0 9591 2577 ╸ 100 0 9592 2578 ╹ 100 0 9593 2579 ╺ 100 0 9594 257a ╻ 100 0 9595 257b ╼ 100 0 9596 257c ╽ 100 0 9597 257d ╾ 100 0 9598 257e ╿ 100 0 9599 257f ▀ 100 0 9600 2580 ▁ 100 0 9601 2581 ▂ 100 0 9602 2582 ▃ 100 0 9603 2583 ▄ 100 0 9604 2584 ▅ 100 0 9605 2585 ▆ 100 0 9606 2586 ▇ 100 0 9607 2587 █ 100 0 9608 2588 ▉ 100 0 9609 2589 ▊ 100 0 9610 258a ▋ 100 0 9611 258b ▌ 100 0 9612 258c ▍ 100 0 9613 258d ▎ 100 0 9614 258e ▏ 100 0 9615 258f ▐ 100 0 9616 2590 ░ 100 0 9617 2591 ▒ 100 0 9618 2592 ▓ 100 0 9619 2593 ▔ 100 0 9620 2594 ▕ 100 0 9621 2595 ■ 80 0 9632 25a0 □ 80 0 9633 25a1 ▢ 80 0 9634 25a2 ▣ 80 0 9635 25a3 ▤ 80 0 9636 25a4 ▥ 80 0 9637 25a5 ▦ 80 0 9638 25a6 ▧ 80 0 9639 25a7 ▨ 80 0 9640 25a8 ▩ 80 0 9641 25a9 ▪ 51 0 9642 25aa ▫ 51 0 9643 25ab ▬ 80 0 9644 25ac ▭ 80 0 9645 25ad ▮ 51 0 9646 25ae ▯ 51 0 9647 25af ▰ 80 0 9648 25b0 ▱ 80 0 9649 25b1 ▲ 80 0 9650 25b2 △ 80 0 9651 25b3 ▴ 55 0 9652 25b4 ▵ 55 0 9653 25b5 ▶ 80 0 9654 25b6 ▷ 80 0 9655 25b7 ▸ 55 0 9656 25b8 ▹ 55 0 9657 25b9 ► 89 0 9658 25ba ▻ 89 0 9659 25bb ▼ 80 0 9660 25bc ▽ 80 0 9661 25bd ▾ 55 0 9662 25be ▿ 55 0 9663 25bf ◀ 80 0 9664 25c0 ◁ 80 0 9665 25c1 ◂ 55 0 9666 25c2 ◃ 55 0 9667 25c3 ◄ 89 0 9668 25c4 ◅ 89 0 9669 25c5 ◆ 80 0 9670 25c6 ◇ 80 0 9671 25c7 ◈ 80 0 9672 25c8 ◉ 80 0 9673 25c9 ◊ 75 0 9674 25ca ○ 80 0 9675 25cb ◌ 80 0 9676 25cc ◍ 80 0 9677 25cd ◎ 80 0 9678 25ce ● 80 0 9679 25cf ◐ 80 0 9680 25d0 ◑ 80 0 9681 25d1 ◒ 80 0 9682 25d2 ◓ 80 0 9683 25d3 ◔ 80 0 9684 25d4 ◕ 80 0 9685 25d5 ◖ 51 0 9686 25d6 ◗ 51 0 9687 25d7 ◘ 100 0 9688 25d8 ◙ 100 0 9689 25d9 ◚ 100 0 9690 25da ◛ 100 0 9691 25db ◜ 59 0 9692 25dc ◝ 59 0 9693 25dd ◞ 59 0 9694 25de ◟ 59 0 9695 25df ◠ 100 0 9696 25e0 ◡ 100 0 9697 25e1 ◢ 80 0 9698 25e2 ◣ 80 0 9699 25e3 ◤ 80 0 9700 25e4 ◥ 80 0 9701 25e5 ◦ 56 0 9702 25e6 ◧ 80 0 9703 25e7 ◨ 80 0 9704 25e8 ◩ 80 0 9705 25e9 ◪ 80 0 9706 25ea ◫ 80 0 9707 25eb ◬ 80 0 9708 25ec ◭ 80 0 9709 25ed ◮ 80 0 9710 25ee ◯ 61 0 9711 25ef  85 0 63504 f810  63 0 63505 f811  53 0 63506 f812  29 0 63507 f813  80 0 63508 f814  37 0 63509 f815  54 0 63510 f816  51 0 63511 f817  63 0 63512 f818  37 0 63513 f819  62 0 63514 f81a  63 0 63515 f81b  65 0 63516 f81c  58 0 63517 f81d  53 0 63518 f81e  29 0 63519 f81f  66 0 63520 f820  100 0 63521 f821  100 0 63522 f822  100 0 63523 f823  72 0 63536 f830  74 0 63537 f831  62 0 63538 f832  63 0 63539 f833  41 0 63540 f834  0 0 65279 feff 9base-6/troff/font/devutf/DejaVuSerifOblique0000644000175000017500000006217011402154555020552 0ustar anselmanselmname DejaVuSerifOblique fontname DejaVuSerifOblique spacewidth 32 charset ! 40 2 33 0021 " 46 2 34 0022 dq " dq " # 84 2 35 0023 $ 64 3 36 0024 % 95 2 37 0025 & 89 2 38 0026 ( 39 3 40 0028 ) 39 3 41 0029 * 50 2 42 002a + 84 2 43 002b , 32 1 44 002c - 34 0 45 002d . 32 0 46 002e / 34 3 47 002f 0 64 2 48 0030 1 64 2 49 0031 2 64 2 50 0032 3 64 2 51 0033 4 64 2 52 0034 5 64 2 53 0035 6 64 2 54 0036 7 64 2 55 0037 8 64 2 56 0038 9 64 2 57 0039 : 34 0 58 003a ; 34 1 59 003b < 84 0 60 003c = 84 0 61 003d > 84 0 62 003e ? 54 2 63 003f @ 100 3 64 0040 A 72 2 65 0041 B 73 2 66 0042 C 77 2 67 0043 D 80 2 68 0044 E 73 2 69 0045 F 69 2 70 0046 G 80 2 71 0047 H 87 2 72 0048 I 40 2 73 0049 J 40 3 74 004a K 75 2 75 004b L 66 2 76 004c M 102 2 77 004d N 88 2 78 004e O 82 2 79 004f P 67 2 80 0050 Q 82 3 81 0051 R 75 2 82 0052 S 69 2 83 0053 T 67 2 84 0054 U 84 2 85 0055 V 72 2 86 0056 W 103 2 87 0057 X 71 2 88 0058 Y 66 2 89 0059 Z 69 2 90 005a [ 39 3 91 005b \ 34 3 92 005c bs " ] 39 3 93 005d ^ 84 2 94 005e _ 50 1 95 005f a 60 0 97 0061 b 64 2 98 0062 c 56 0 99 0063 d 64 2 100 0064 e 59 0 101 0065 f 37 3 102 0066 g 64 1 103 0067 h 64 2 104 0068 i 32 2 105 0069 j 31 3 106 006a k 61 2 107 006b l 32 2 108 006c m 95 0 109 006d n 64 0 110 006e o 60 0 111 006f p 64 1 112 0070 q 64 1 113 0071 r 48 0 114 0072 s 51 0 115 0073 t 40 2 116 0074 u 64 0 117 0075 v 56 0 118 0076 w 86 0 119 0077 x 56 0 120 0078 y 56 1 121 0079 z 53 0 122 007a { 64 3 123 007b | 34 3 124 007c } 64 3 125 007d ~ 84 0 126 007e   64 0 160 00a0 ¡ 40 2 161 00a1 ¢ 64 3 162 00a2 £ 64 2 163 00a3 ¤ 64 0 164 00a4 ¥ 64 2 165 00a5 ¦ 34 3 166 00a6 § 50 3 167 00a7 ¨ 50 2 168 00a8 © 100 2 169 00a9 ª 48 2 170 00aa « 61 0 171 00ab ¬ 84 0 172 00ac ­ 34 0 173 00ad hy " ® 100 2 174 00ae rg " ¯ 50 2 175 00af ° 50 2 176 00b0 ± 84 2 177 00b1 +- " ² 40 2 178 00b2 ³ 40 2 179 00b3 ´ 50 2 180 00b4 aa " µ 65 1 181 00b5 ¶ 64 3 182 00b6 · 32 0 183 00b7 ¸ 50 1 184 00b8 ¹ 40 2 185 00b9 º 47 2 186 00ba » 61 0 187 00bb ¼ 97 2 188 00bc ½ 97 2 189 00bd ¾ 97 2 190 00be ¿ 54 2 191 00bf À 72 2 192 00c0 Á 72 2 193 00c1  72 2 194 00c2 à 72 2 195 00c3 Ä 72 2 196 00c4 Å 72 2 197 00c5 Æ 100 2 198 00c6 Ç 77 3 199 00c7 È 73 2 200 00c8 É 73 2 201 00c9 Ê 73 2 202 00ca Ë 73 2 203 00cb Ì 40 2 204 00cc Í 40 2 205 00cd Î 40 2 206 00ce Ï 40 2 207 00cf Ð 81 2 208 00d0 Ñ 88 2 209 00d1 Ò 82 2 210 00d2 Ó 82 2 211 00d3 Ô 82 2 212 00d4 Õ 82 2 213 00d5 Ö 82 2 214 00d6 × 84 0 215 00d7 mu " Ø 82 2 216 00d8 Ù 84 2 217 00d9 Ú 84 2 218 00da Û 84 2 219 00db Ü 84 2 220 00dc Ý 66 2 221 00dd Þ 68 2 222 00de ß 67 2 223 00df à 60 2 224 00e0 á 60 2 225 00e1 â 60 2 226 00e2 ã 60 2 227 00e3 ä 60 2 228 00e4 å 60 2 229 00e5 æ 94 0 230 00e6 ç 56 1 231 00e7 è 59 2 232 00e8 é 59 2 233 00e9 ê 59 2 234 00ea ë 59 2 235 00eb ì 32 2 236 00ec í 32 2 237 00ed î 32 2 238 00ee ï 32 2 239 00ef ð 60 2 240 00f0 ñ 64 2 241 00f1 ò 60 2 242 00f2 ó 60 2 243 00f3 ô 60 2 244 00f4 õ 60 2 245 00f5 ö 60 2 246 00f6 ÷ 84 0 247 00f7 -: " di " ø 60 0 248 00f8 ù 64 2 249 00f9 ú 64 2 250 00fa û 64 2 251 00fb ü 64 2 252 00fc ý 56 3 253 00fd þ 64 3 254 00fe ÿ 56 3 255 00ff ā 60 2 257 0101 Ă 72 2 258 0102 ă 60 2 259 0103 Ą 72 3 260 0104 ą 60 1 261 0105 Ć 77 2 262 0106 ć 56 2 263 0107 Ĉ 77 2 264 0108 ĉ 56 2 265 0109 Ċ 77 2 266 010a ċ 56 2 267 010b Č 77 2 268 010c č 56 2 269 010d Ď 80 2 270 010e ď 64 2 271 010f Đ 81 2 272 0110 đ 64 2 273 0111 Ē 73 2 274 0112 ē 59 2 275 0113 Ĕ 73 2 276 0114 ĕ 59 2 277 0115 Ė 73 2 278 0116 ė 59 2 279 0117 Ę 73 3 280 0118 ę 59 1 281 0119 Ě 73 2 282 011a ě 59 2 283 011b Ĝ 80 2 284 011c ĝ 64 3 285 011d Ğ 80 2 286 011e ğ 64 3 287 011f Ġ 80 2 288 0120 ġ 64 3 289 0121 Ģ 80 3 290 0122 ģ 64 3 291 0123 Ĥ 87 2 292 0124 ĥ 64 2 293 0125 Ħ 87 2 294 0126 ħ 64 2 295 0127 Ĩ 40 2 296 0128 ĩ 32 2 297 0129 Ī 40 2 298 012a ī 32 2 299 012b Ĭ 40 2 300 012c ĭ 32 2 301 012d Į 40 3 302 012e į 32 3 303 012f İ 40 2 304 0130 ı 32 0 305 0131 IJ 80 3 306 0132 ij 53 3 307 0133 Ĵ 40 3 308 0134 ĵ 31 3 309 0135 Ķ 75 3 310 0136 ķ 61 3 311 0137 ĸ 61 0 312 0138 Ĺ 66 2 313 0139 ĺ 32 2 314 013a Ļ 66 3 315 013b ļ 32 3 316 013c Ľ 66 2 317 013d ľ 40 2 318 013e Ŀ 67 2 319 013f ŀ 46 2 320 0140 Ł 67 2 321 0141 ł 32 2 322 0142 Ń 88 2 323 0143 ń 64 2 324 0144 Ņ 88 3 325 0145 ņ 64 1 326 0146 Ň 88 2 327 0147 ň 64 2 328 0148 ʼn 87 2 329 0149 Ŋ 88 3 330 014a ŋ 64 1 331 014b Ō 82 2 332 014c ō 60 2 333 014d Ŏ 82 2 334 014e ŏ 60 2 335 014f Ő 82 2 336 0150 ő 60 2 337 0151 Œ 114 2 338 0152 œ 99 0 339 0153 Ŕ 75 2 340 0154 ŕ 48 2 341 0155 Ŗ 75 3 342 0156 ŗ 48 1 343 0157 Ř 75 2 344 0158 ř 48 2 345 0159 Ś 69 2 346 015a ś 51 2 347 015b Ŝ 69 2 348 015c ŝ 51 2 349 015d Ş 69 3 350 015e ş 51 1 351 015f Š 69 2 352 0160 š 51 2 353 0161 Ţ 67 3 354 0162 ţ 40 3 355 0163 Ť 67 2 356 0164 ť 40 2 357 0165 Ŧ 67 2 358 0166 ŧ 40 2 359 0167 Ũ 84 2 360 0168 ũ 64 2 361 0169 Ū 84 2 362 016a ū 64 2 363 016b Ŭ 84 2 364 016c ŭ 64 2 365 016d Ů 84 2 366 016e ů 64 2 367 016f Ű 84 2 368 0170 ű 64 2 369 0171 Ų 84 3 370 0172 ų 64 1 371 0173 Ŵ 103 2 372 0174 ŵ 86 2 373 0175 Ŷ 66 2 374 0176 ŷ 56 3 375 0177 Ÿ 66 2 376 0178 Ź 69 2 377 0179 ź 53 2 378 017a Ż 69 2 379 017b ż 53 2 380 017c Ž 69 2 381 017d ž 53 2 382 017e ſ 37 3 383 017f Ɓ 73 2 385 0181 Ƃ 73 2 386 0182 ƃ 64 2 387 0183 Ƅ 73 2 388 0184 ƅ 64 2 389 0185 Ɔ 77 2 390 0186 Ƈ 77 2 391 0187 ƈ 56 2 392 0188 Ɖ 81 2 393 0189 Ɗ 80 2 394 018a Ƌ 73 2 395 018b ƌ 64 2 396 018c ƍ 60 1 397 018d Ǝ 73 2 398 018e Ə 82 2 399 018f Ɛ 64 2 400 0190 Ƒ 69 3 401 0191 ƒ 37 3 402 0192 Ɠ 80 2 403 0193 Ɣ 71 3 404 0194 ƕ 93 2 405 0195 Ɩ 40 2 406 0196 Ɨ 40 2 407 0197 Ƙ 75 2 408 0198 ƙ 61 2 409 0199 ƚ 32 2 410 019a ƛ 63 2 411 019b Ɯ 95 2 412 019c Ɲ 88 3 413 019d ƞ 64 1 414 019e Ɵ 82 2 415 019f Ơ 82 2 416 01a0 ơ 60 0 417 01a1 Ƣ 104 3 418 01a2 ƣ 81 1 419 01a3 Ƥ 67 2 420 01a4 ƥ 64 3 421 01a5 Ʀ 71 3 422 01a6 Ƨ 69 2 423 01a7 ƨ 51 0 424 01a8 Ʃ 71 2 425 01a9 ƪ 32 3 426 01aa ƫ 40 3 427 01ab Ƭ 67 2 428 01ac ƭ 40 2 429 01ad Ʈ 67 3 430 01ae Ư 84 2 431 01af ư 64 0 432 01b0 Ʊ 83 2 433 01b1 Ʋ 76 2 434 01b2 Ƴ 74 2 435 01b3 ƴ 74 1 436 01b4 Ƶ 69 2 437 01b5 ƶ 53 0 438 01b6 Ʒ 56 2 439 01b7 Ƹ 56 2 440 01b8 ƹ 56 1 441 01b9 ƻ 64 2 443 01bb Ƽ 69 2 444 01bc ƽ 56 1 445 01bd ƾ 54 2 446 01be ǀ 29 2 448 01c0 ǁ 49 2 449 01c1 ǂ 46 2 450 01c2 ǃ 29 2 451 01c3 Ǎ 72 2 461 01cd ǎ 60 2 462 01ce Ǐ 40 2 463 01cf ǐ 32 2 464 01d0 Ǒ 82 2 465 01d1 ǒ 60 2 466 01d2 Ǔ 84 2 467 01d3 ǔ 64 2 468 01d4 ǖ 64 2 470 01d6 Ǘ 84 2 471 01d7 ǘ 64 2 472 01d8 Ǚ 84 2 473 01d9 ǚ 64 2 474 01da Ǜ 84 2 475 01db ǜ 64 2 476 01dc ǝ 59 0 477 01dd ǟ 60 2 479 01df Ǣ 100 2 482 01e2 ǣ 94 2 483 01e3 Ǫ 82 3 490 01ea ǫ 60 1 491 01eb Ǭ 82 3 492 01ec ǭ 60 3 493 01ed Ƕ 115 2 502 01f6 Ș 69 3 536 0218 ș 51 1 537 0219 Ț 67 3 538 021a ț 40 3 539 021b Ȥ 69 3 548 0224 ȥ 53 1 549 0225 ȫ 60 2 555 022b ȭ 60 2 557 022d Ȯ 82 2 558 022e ȯ 60 2 559 022f ȱ 60 2 561 0231 Ȳ 66 2 562 0232 ȳ 56 3 563 0233 ȷ 31 1 567 0237 ȸ 96 2 568 0238 ȹ 96 1 569 0239 Ⱥ 72 2 570 023a Ȼ 77 2 571 023b ȼ 56 0 572 023c Ƚ 66 2 573 023d Ⱦ 67 2 574 023e ȿ 51 1 575 023f ɀ 53 1 576 0240 Ɂ 58 2 577 0241 ɐ 60 0 592 0250 ɑ 64 0 593 0251 ɒ 64 0 594 0252 ɓ 64 2 595 0253 ɔ 56 0 596 0254 ɕ 56 1 597 0255 ɖ 65 3 598 0256 ɗ 68 2 599 0257 ɘ 59 0 600 0258 ə 59 0 601 0259 ɚ 84 0 602 025a ɛ 51 0 603 025b ɜ 51 0 604 025c ɝ 77 0 605 025d ɞ 61 0 606 025e ɟ 31 1 607 025f ɠ 68 3 608 0260 ɡ 64 1 609 0261 ɢ 54 0 610 0262 ɣ 71 1 611 0263 ɤ 56 0 612 0264 ɥ 64 1 613 0265 ɦ 64 2 614 0266 ɧ 64 3 615 0267 ɨ 32 2 616 0268 ɩ 39 0 617 0269 ɪ 32 0 618 026a ɫ 38 2 619 026b ɬ 45 2 620 026c ɭ 36 3 621 026d ɮ 70 3 622 026e ɯ 95 0 623 026f ɰ 95 1 624 0270 ɱ 95 1 625 0271 ɲ 64 1 626 0272 ɳ 69 1 627 0273 ɴ 65 0 628 0274 ɵ 60 0 629 0275 ɶ 79 0 630 0276 ɷ 65 0 631 0277 ɸ 60 3 632 0278 ɹ 50 0 633 0279 ɺ 50 2 634 027a ɻ 55 1 635 027b ɼ 48 1 636 027c ɽ 48 1 637 027d ɾ 45 0 638 027e ɿ 45 0 639 027f ʀ 59 0 640 0280 ʁ 59 0 641 0281 ʂ 51 1 642 0282 ʃ 27 3 643 0283 ʄ 37 3 644 0284 ʅ 49 1 645 0285 ʆ 32 3 646 0286 ʇ 40 1 647 0287 ʈ 40 3 648 0288 ʉ 64 0 649 0289 ʊ 62 0 650 028a ʋ 61 0 651 028b ʌ 56 0 652 028c ʍ 86 0 653 028d ʎ 56 2 654 028e ʏ 66 0 655 028f ʐ 60 1 656 0290 ʑ 56 1 657 0291 ʒ 56 1 658 0292 ʓ 56 1 659 0293 ʔ 54 2 660 0294 ʕ 54 2 661 0295 ʖ 54 2 662 0296 ʗ 51 3 663 0297 ʘ 72 0 664 0298 ʙ 56 0 665 0299 ʚ 61 0 666 029a ʛ 65 2 667 029b ʜ 67 0 668 029c ʝ 37 3 669 029d ʞ 61 1 670 029e ʟ 65 0 671 029f ʠ 68 3 672 02a0 ʡ 54 2 673 02a1 ʢ 54 2 674 02a2 ʣ 100 2 675 02a3 ʤ 103 3 676 02a4 ʥ 100 3 677 02a5 ʦ 81 2 678 02a6 ʧ 60 3 679 02a7 ʨ 78 3 680 02a8 ʩ 89 3 681 02a9 ʪ 65 2 682 02aa ʫ 68 2 683 02ab ʬ 60 2 684 02ac ʭ 44 2 685 02ad ʮ 78 3 686 02ae ʯ 77 3 687 02af ʰ 43 2 688 02b0 ʱ 43 2 689 02b1 ʲ 26 2 690 02b2 ʳ 35 2 691 02b3 ʴ 35 2 692 02b4 ʵ 43 2 693 02b5 ʶ 39 2 694 02b6 ʷ 59 2 695 02b7 ʸ 42 2 696 02b8 ʻ 32 2 699 02bb ʼ 32 2 700 02bc ʾ 31 2 702 02be ʿ 31 2 703 02bf ˀ 28 2 704 02c0 ˁ 28 2 705 02c1 ˆ 50 2 710 02c6 ˇ 50 2 711 02c7 ˈ 28 2 712 02c8 ˌ 28 1 716 02cc ː 34 0 720 02d0 ˑ 34 0 721 02d1 ˒ 31 0 722 02d2 ˓ 31 0 723 02d3 ˖ 39 0 726 02d6 ˘ 50 2 728 02d8 ˙ 50 2 729 02d9 ˚ 50 2 730 02da ˛ 50 1 731 02db ˜ 50 2 732 02dc ˝ 50 2 733 02dd ˞ 42 0 734 02de ˠ 45 2 736 02e0 ˡ 24 2 737 02e1 ˢ 34 2 738 02e2 ˣ 42 2 739 02e3 ˤ 28 2 740 02e4 ˥ 48 2 741 02e5 ˦ 48 2 742 02e6 ˧ 48 2 743 02e7 ˨ 48 2 744 02e8 ˩ 48 2 745 02e9 ́ 0 2 769 0301 ̂ 0 2 770 0302 ̃ 0 2 771 0303 ̄ 0 2 772 0304 ̅ 0 2 773 0305 ̆ 0 2 774 0306 ̇ 0 2 775 0307 ̈ 0 2 776 0308 ̉ 0 2 777 0309 ̊ 0 2 778 030a ̋ 0 2 779 030b ̌ 0 2 780 030c ̍ 0 2 781 030d ̎ 0 2 782 030e ̏ 0 2 783 030f ̐ 0 2 784 0310 ̑ 0 2 785 0311 ̒ 0 2 786 0312 ̓ 0 2 787 0313 ̔ 0 2 788 0314 ̕ 0 2 789 0315 ̖ 0 1 790 0316 ̗ 0 1 791 0317 ̘ 0 1 792 0318 ̙ 0 1 793 0319 ̚ 0 2 794 031a ̛ 0 0 795 031b ̜ 0 1 796 031c ̝ 0 1 797 031d ̞ 0 1 798 031e ̟ 0 1 799 031f ̠ 0 1 800 0320 ̡ 0 1 801 0321 ̢ 0 1 802 0322 ̣ 0 1 803 0323 ̤ 0 1 804 0324 ̥ 0 1 805 0325 ̦ 0 1 806 0326 ̧ 0 1 807 0327 ̨ 0 1 808 0328 ̩ 0 1 809 0329 ̪ 0 1 810 032a ̫ 0 1 811 032b ̬ 0 1 812 032c ̭ 0 1 813 032d ̮ 0 1 814 032e ̯ 0 1 815 032f ̰ 0 1 816 0330 ̱ 0 1 817 0331 ̲ 0 1 818 0332 ̳ 0 1 819 0333 ̴ 0 0 820 0334 ̵ 0 0 821 0335 ̶ 0 0 822 0336 ̷ 0 0 823 0337 ̸ 0 2 824 0338 ̹ 0 1 825 0339 ̺ 0 1 826 033a ̻ 0 1 827 033b ̼ 0 1 828 033c ̽ 0 2 829 033d ̾ 0 2 830 033e ̿ 0 2 831 033f ͘ 0 2 856 0358 ͡ 0 2 865 0361 ʹ 28 2 884 0374 ͵ 28 1 885 0375 ͺ 50 1 890 037a ; 34 1 894 037e ΄ 50 2 900 0384 ΅ 50 2 901 0385 Ά 72 2 902 0386 · 32 0 903 0387 Έ 90 2 904 0388 Ή 104 2 905 0389 Ί 56 2 906 038a Ό 84 2 908 038c Ύ 90 2 910 038e Ώ 85 2 911 038f ΐ 39 2 912 0390 Α 72 2 913 0391 Β 73 2 914 0392 Γ 69 2 915 0393 Δ 72 2 916 0394 Ε 73 2 917 0395 Ζ 69 2 918 0396 Η 87 2 919 0397 Θ 82 2 920 0398 Ι 40 2 921 0399 Κ 75 2 922 039a Λ 72 2 923 039b Μ 102 2 924 039c Ν 88 2 925 039d Ξ 70 2 926 039e Ο 82 2 927 039f Π 87 2 928 03a0 Ρ 67 2 929 03a1 Σ 71 2 931 03a3 Τ 67 2 932 03a4 Υ 66 2 933 03a5 Φ 82 2 934 03a6 Χ 71 2 935 03a7 Ψ 88 2 936 03a8 Ω 83 2 937 03a9 Ϊ 40 2 938 03aa Ϋ 66 2 939 03ab ά 68 2 940 03ac έ 54 2 941 03ad ή 60 3 942 03ae ί 39 2 943 03af ΰ 61 2 944 03b0 α 68 0 945 03b1 β 58 3 946 03b2 γ 60 1 947 03b3 δ 60 2 948 03b4 ε 54 0 949 03b5 ζ 54 3 950 03b6 η 60 1 951 03b7 θ 60 2 952 03b8 ι 39 0 953 03b9 κ 66 0 954 03ba λ 63 2 955 03bb μ 65 1 956 03bc ν 61 0 957 03bd ξ 55 3 958 03be ο 60 0 959 03bf π 66 0 960 03c0 ρ 59 1 961 03c1 ς 56 1 962 03c2 σ 68 0 963 03c3 τ 55 0 964 03c4 υ 61 0 965 03c5 φ 70 1 966 03c6 χ 61 1 967 03c7 ψ 78 1 968 03c8 ω 82 0 969 03c9 ϊ 39 2 970 03ca ϋ 61 2 971 03cb ό 60 2 972 03cc ύ 61 2 973 03cd ώ 82 2 974 03ce ϐ 58 2 976 03d0 ϑ 71 2 977 03d1 ϒ 69 2 978 03d2 ϓ 87 2 979 03d3 ϔ 69 2 980 03d4 ϕ 68 3 981 03d5 ϖ 82 0 982 03d6 ϗ 62 1 983 03d7 Ϙ 82 3 984 03d8 ϙ 60 1 985 03d9 Ϛ 77 3 986 03da ϛ 56 3 987 03db Ϝ 69 2 988 03dc ϝ 46 3 989 03dd Ϟ 59 2 990 03de ϟ 66 2 991 03df Ϡ 78 3 992 03e0 ϡ 58 1 993 03e1 ϰ 62 0 1008 03f0 ϱ 59 1 1009 03f1 ϲ 56 0 1010 03f2 ϳ 31 3 1011 03f3 ϴ 82 2 1012 03f4 ϵ 56 0 1013 03f5 ϶ 56 0 1014 03f6 Ϸ 68 2 1015 03f7 ϸ 64 3 1016 03f8 Ϲ 77 2 1017 03f9 Ϻ 102 2 1018 03fa ϻ 71 1 1019 03fb ϼ 59 1 1020 03fc Ͻ 77 2 1021 03fd Ͼ 77 2 1022 03fe Ͽ 77 2 1023 03ff Ё 73 2 1025 0401 Ђ 80 3 1026 0402 Ѓ 69 2 1027 0403 Є 77 2 1028 0404 Ѕ 69 2 1029 0405 І 40 2 1030 0406 Ї 40 2 1031 0407 Ј 40 3 1032 0408 Љ 107 2 1033 0409 Њ 112 2 1034 040a Ћ 87 2 1035 040b Ќ 75 2 1036 040c Ѝ 87 2 1037 040d Ў 75 2 1038 040e Џ 87 3 1039 040f А 72 2 1040 0410 Б 73 2 1041 0411 В 73 2 1042 0412 Г 69 2 1043 0413 Д 87 3 1044 0414 Е 73 2 1045 0415 Ж 111 2 1046 0416 З 64 2 1047 0417 И 87 2 1048 0418 Й 87 2 1049 0419 К 75 2 1050 041a Л 87 2 1051 041b М 102 2 1052 041c Н 87 2 1053 041d О 82 2 1054 041e П 87 2 1055 041f Р 67 2 1056 0420 С 77 2 1057 0421 Т 67 2 1058 0422 У 75 2 1059 0423 Ф 98 3 1060 0424 Х 71 2 1061 0425 Ц 87 3 1062 0426 Ч 75 2 1063 0427 Ш 102 2 1064 0428 Щ 105 3 1065 0429 Ъ 76 2 1066 042a Ы 104 2 1067 042b Ь 69 2 1068 042c Э 77 2 1069 042d Ю 119 2 1070 042e Я 84 2 1071 042f а 60 0 1072 0430 б 60 2 1073 0431 в 56 0 1074 0432 г 54 0 1075 0433 д 68 1 1076 0434 е 59 0 1077 0435 ж 85 0 1078 0436 з 54 0 1079 0437 и 67 0 1080 0438 й 67 2 1081 0439 к 61 0 1082 043a л 62 0 1083 043b м 84 0 1084 043c н 67 0 1085 043d о 60 0 1086 043e п 67 0 1087 043f р 64 1 1088 0440 с 56 0 1089 0441 т 55 0 1090 0442 у 56 1 1091 0443 ф 74 3 1092 0444 х 56 0 1093 0445 ц 69 1 1094 0446 ч 67 0 1095 0447 ш 85 0 1096 0448 щ 90 1 1097 0449 ъ 55 0 1098 044a ы 74 0 1099 044b ь 49 0 1100 044c э 56 0 1101 044d ю 87 0 1102 044e я 65 0 1103 044f ѐ 59 2 1104 0450 ё 59 2 1105 0451 ђ 62 3 1106 0452 ѓ 54 2 1107 0453 є 56 0 1108 0454 ѕ 51 0 1109 0455 і 32 2 1110 0456 ї 32 2 1111 0457 ј 31 3 1112 0458 љ 78 0 1113 0459 њ 80 0 1114 045a ћ 64 2 1115 045b ќ 61 2 1116 045c ѝ 67 2 1117 045d ў 56 3 1118 045e џ 66 1 1119 045f Ґ 69 2 1168 0490 ґ 54 2 1169 0491 Ғ 69 2 1170 0492 ғ 54 0 1171 0493 Қ 75 3 1178 049a қ 61 1 1179 049b Ҳ 71 3 1202 04b2 ҳ 56 1 1203 04b3 Ӑ 72 2 1232 04d0 ӑ 60 2 1233 04d1 Ӓ 72 2 1234 04d2 ӓ 60 2 1235 04d3 Ӕ 100 2 1236 04d4 ӕ 94 0 1237 04d5 Ӗ 73 2 1238 04d6 ӗ 59 2 1239 04d7 Ӡ 56 2 1248 04e0 ӡ 56 1 1249 04e1 Ӧ 82 2 1254 04e6 ӧ 60 2 1255 04e7 Ө 82 2 1256 04e8 ө 60 0 1257 04e9 Ӫ 82 2 1258 04ea ӫ 60 2 1259 04eb ᴂ 94 0 7426 1d02 ᴈ 51 0 7432 1d08 ᴉ 32 1 7433 1d09 ᴔ 99 0 7444 1d14 ᴖ 60 0 7446 1d16 ᴗ 60 0 7447 1d17 ᴝ 74 0 7453 1d1d ᴞ 95 0 7454 1d1e ᴟ 95 3 7455 1d1f ᵃ 47 2 7491 1d43 ᵄ 33 2 7492 1d44 ᵅ 49 2 7493 1d45 ᵆ 71 2 7494 1d46 ᵇ 49 2 7495 1d47 ᵈ 49 2 7496 1d48 ᵉ 48 2 7497 1d49 ᵊ 48 2 7498 1d4a ᵋ 43 2 7499 1d4b ᵌ 43 2 7500 1d4c ᵍ 49 2 7501 1d4d ᵎ 26 2 7502 1d4e ᵏ 45 2 7503 1d4f ᵐ 70 2 7504 1d50 ᵑ 49 2 7505 1d51 ᵒ 47 2 7506 1d52 ᵓ 43 2 7507 1d53 ᵔ 47 2 7508 1d54 ᵕ 47 0 7509 1d55 ᵖ 49 2 7510 1d56 ᵗ 33 2 7511 1d57 ᵘ 49 2 7512 1d58 ᵙ 55 2 7513 1d59 ᵚ 70 2 7514 1d5a ᵛ 46 2 7515 1d5b ᵷ 64 1 7543 1d77 ᵻ 37 0 7547 1d7b ᶅ 32 3 7557 1d85 ᶛ 49 2 7579 1d9b ᶜ 43 2 7580 1d9c ᶝ 43 2 7581 1d9d ᶞ 47 2 7582 1d9e ᶟ 43 2 7583 1d9f ᶠ 31 2 7584 1da0 ᶡ 32 2 7585 1da1 ᶢ 49 2 7586 1da2 ᶣ 49 2 7587 1da3 ᶤ 32 2 7588 1da4 ᶥ 33 2 7589 1da5 ᶦ 32 2 7590 1da6 ᶧ 32 2 7591 1da7 ᶨ 32 2 7592 1da8 ᶩ 26 2 7593 1da9 ᶪ 26 2 7594 1daa ᶫ 46 2 7595 1dab ᶬ 70 2 7596 1dac ᶭ 70 2 7597 1dad ᶮ 49 2 7598 1dae ᶯ 49 2 7599 1daf ᶰ 49 2 7600 1db0 ᶱ 47 2 7601 1db1 ᶲ 47 2 7602 1db2 ᶳ 42 2 7603 1db3 ᶴ 30 2 7604 1db4 ᶵ 33 2 7605 1db5 ᶶ 49 2 7606 1db6 ᶷ 48 2 7607 1db7 ᶹ 46 2 7609 1db9 ᶺ 46 2 7610 1dba ᶻ 42 2 7611 1dbb ᶼ 42 2 7612 1dbc ᶽ 42 2 7613 1dbd ᶾ 45 2 7614 1dbe ᶿ 47 2 7615 1dbf Ḍ 80 3 7692 1e0c ḍ 64 3 7693 1e0d Ḓ 80 3 7698 1e12 ḓ 64 3 7699 1e13 Ḥ 87 3 7716 1e24 ḥ 64 3 7717 1e25 Ḷ 66 3 7734 1e36 ḷ 32 3 7735 1e37 Ḹ 66 3 7736 1e38 ḹ 32 3 7737 1e39 Ḽ 66 3 7740 1e3c ḽ 32 3 7741 1e3d ṁ 95 2 7745 1e41 Ṃ 102 3 7746 1e42 ṃ 95 1 7747 1e43 Ṅ 88 2 7748 1e44 ṅ 64 2 7749 1e45 Ṇ 88 3 7750 1e46 ṇ 64 1 7751 1e47 Ṋ 88 3 7754 1e4a ṋ 64 1 7755 1e4b ṗ 64 3 7767 1e57 Ṛ 75 3 7770 1e5a ṛ 48 1 7771 1e5b Ṝ 75 3 7772 1e5c ṝ 48 3 7773 1e5d ṡ 51 2 7777 1e61 Ṣ 69 3 7778 1e62 ṣ 51 1 7779 1e63 Ṭ 67 3 7788 1e6c ṭ 40 3 7789 1e6d Ṱ 67 3 7792 1e70 ṱ 40 3 7793 1e71 Ṿ 72 3 7806 1e7e ṿ 56 1 7807 1e7f Ẁ 103 2 7808 1e80 ẁ 86 2 7809 1e81 Ẃ 103 2 7810 1e82 ẃ 86 2 7811 1e83 Ẅ 103 2 7812 1e84 ẅ 86 2 7813 1e85 Ẹ 73 3 7864 1eb8 ẹ 59 1 7865 1eb9 Ị 40 3 7882 1eca ị 32 3 7883 1ecb Ọ 82 3 7884 1ecc ọ 60 1 7885 1ecd Ụ 84 3 7908 1ee4 ụ 64 1 7909 1ee5 Ỳ 66 2 7922 1ef2 ỳ 56 3 7923 1ef3 ἁ 68 2 7937 1f01 ἂ 68 2 7938 1f02 ἃ 68 2 7939 1f03 ἄ 68 2 7940 1f04 ἅ 68 2 7941 1f05 ἆ 68 2 7942 1f06 ἇ 68 2 7943 1f07 Ἀ 72 2 7944 1f08 Ἁ 72 2 7945 1f09 Ἂ 87 2 7946 1f0a Ἃ 87 2 7947 1f0b Ἄ 73 2 7948 1f0c Ἅ 76 2 7949 1f0d Ἆ 72 2 7950 1f0e Ἇ 72 2 7951 1f0f ἐ 54 2 7952 1f10 ἑ 54 2 7953 1f11 ἒ 54 2 7954 1f12 ἓ 54 2 7955 1f13 ἔ 54 2 7956 1f14 ἕ 54 2 7957 1f15 Ἐ 85 2 7960 1f18 Ἑ 84 2 7961 1f19 Ἒ 107 2 7962 1f1a Ἓ 108 2 7963 1f1b Ἔ 101 2 7964 1f1c Ἕ 103 2 7965 1f1d ἠ 60 3 7968 1f20 ἡ 60 3 7969 1f21 ἢ 60 3 7970 1f22 ἣ 60 3 7971 1f23 ἤ 60 3 7972 1f24 ἥ 60 3 7973 1f25 ἦ 60 3 7974 1f26 ἧ 60 3 7975 1f27 Ἠ 100 2 7976 1f28 Ἡ 99 2 7977 1f29 Ἢ 121 2 7978 1f2a Ἣ 122 2 7979 1f2b Ἤ 116 2 7980 1f2c Ἥ 118 2 7981 1f2d Ἦ 110 2 7982 1f2e Ἧ 109 2 7983 1f2f ἰ 39 2 7984 1f30 ἱ 39 2 7985 1f31 ἲ 39 2 7986 1f32 ἳ 39 2 7987 1f33 ἴ 39 2 7988 1f34 ἵ 39 2 7989 1f35 ἶ 39 2 7990 1f36 ἷ 39 2 7991 1f37 Ἰ 52 2 7992 1f38 Ἱ 51 2 7993 1f39 Ἲ 73 2 7994 1f3a Ἳ 74 2 7995 1f3b Ἴ 68 2 7996 1f3c Ἵ 71 2 7997 1f3d Ἶ 62 2 7998 1f3e Ἷ 61 2 7999 1f3f ὀ 60 2 8000 1f40 ὁ 60 2 8001 1f41 ὂ 60 2 8002 1f42 ὃ 60 2 8003 1f43 ὄ 60 2 8004 1f44 ὅ 60 2 8005 1f45 Ὀ 82 2 8008 1f48 Ὁ 86 2 8009 1f49 Ὂ 112 2 8010 1f4a Ὃ 113 2 8011 1f4b Ὄ 94 2 8012 1f4c Ὅ 96 2 8013 1f4d ὐ 61 2 8016 1f50 ὑ 61 2 8017 1f51 ὒ 61 2 8018 1f52 ὓ 61 2 8019 1f53 ὔ 61 2 8020 1f54 ὕ 61 2 8021 1f55 ὖ 61 2 8022 1f56 ὗ 61 2 8023 1f57 Ὑ 85 2 8025 1f59 Ὓ 108 2 8027 1f5b Ὕ 104 2 8029 1f5d Ὗ 95 2 8031 1f5f ὠ 82 2 8032 1f60 ὡ 82 2 8033 1f61 ὢ 82 2 8034 1f62 ὣ 82 2 8035 1f63 ὤ 82 2 8036 1f64 ὥ 82 2 8037 1f65 ὦ 82 2 8038 1f66 ὧ 82 2 8039 1f67 Ὠ 83 2 8040 1f68 Ὡ 87 2 8041 1f69 Ὢ 113 2 8042 1f6a Ὣ 114 2 8043 1f6b Ὤ 95 2 8044 1f6c Ὥ 98 2 8045 1f6d Ὦ 94 2 8046 1f6e Ὧ 97 2 8047 1f6f ὰ 68 2 8048 1f70 ά 68 2 8049 1f71 ὲ 54 2 8050 1f72 έ 54 2 8051 1f73 ὴ 60 3 8052 1f74 ή 60 3 8053 1f75 ὶ 39 2 8054 1f76 ί 39 2 8055 1f77 ὸ 60 2 8056 1f78 ό 60 2 8057 1f79 ὺ 61 2 8058 1f7a ύ 61 2 8059 1f7b ὼ 82 2 8060 1f7c ώ 82 2 8061 1f7d ᾀ 68 3 8064 1f80 ᾁ 68 3 8065 1f81 ᾂ 68 3 8066 1f82 ᾃ 68 3 8067 1f83 ᾄ 68 3 8068 1f84 ᾅ 68 3 8069 1f85 ᾆ 68 3 8070 1f86 ᾇ 68 3 8071 1f87 ᾈ 72 3 8072 1f88 ᾉ 72 3 8073 1f89 ᾊ 87 3 8074 1f8a ᾋ 87 3 8075 1f8b ᾌ 73 3 8076 1f8c ᾍ 76 3 8077 1f8d ᾎ 72 3 8078 1f8e ᾏ 72 3 8079 1f8f ᾐ 60 3 8080 1f90 ᾑ 60 3 8081 1f91 ᾒ 60 3 8082 1f92 ᾓ 60 3 8083 1f93 ᾔ 60 3 8084 1f94 ᾕ 60 3 8085 1f95 ᾖ 60 3 8086 1f96 ᾗ 60 3 8087 1f97 ᾘ 100 3 8088 1f98 ᾙ 99 3 8089 1f99 ᾚ 121 3 8090 1f9a ᾛ 122 3 8091 1f9b ᾜ 116 3 8092 1f9c ᾝ 118 3 8093 1f9d ᾞ 110 3 8094 1f9e ᾟ 109 3 8095 1f9f ᾠ 82 3 8096 1fa0 ᾡ 82 3 8097 1fa1 ᾢ 82 3 8098 1fa2 ᾣ 82 3 8099 1fa3 ᾤ 82 3 8100 1fa4 ᾥ 82 3 8101 1fa5 ᾦ 82 3 8102 1fa6 ᾧ 82 3 8103 1fa7 ᾨ 83 3 8104 1fa8 ᾩ 87 3 8105 1fa9 ᾪ 113 3 8106 1faa ᾫ 114 3 8107 1fab ᾬ 95 3 8108 1fac ᾭ 98 3 8109 1fad ᾮ 94 3 8110 1fae ᾯ 97 3 8111 1faf ᾰ 68 2 8112 1fb0 ᾱ 68 2 8113 1fb1 ᾲ 68 3 8114 1fb2 ᾳ 68 1 8115 1fb3 ᾴ 68 3 8116 1fb4 ᾶ 68 2 8118 1fb6 ᾷ 68 3 8119 1fb7 Ᾰ 72 2 8120 1fb8 Ᾱ 72 2 8121 1fb9 Ὰ 72 2 8122 1fba Ά 72 2 8123 1fbb ᾼ 72 3 8124 1fbc ᾽ 50 2 8125 1fbd ι 50 1 8126 1fbe ᾿ 50 2 8127 1fbf ῀ 50 2 8128 1fc0 ῁ 50 2 8129 1fc1 ῂ 60 3 8130 1fc2 ῃ 60 1 8131 1fc3 ῄ 60 3 8132 1fc4 ῆ 60 3 8134 1fc6 ῇ 60 3 8135 1fc7 Ὲ 91 2 8136 1fc8 Έ 90 2 8137 1fc9 Ὴ 106 2 8138 1fca Ή 104 2 8139 1fcb ῌ 87 3 8140 1fcc ῍ 50 2 8141 1fcd ῎ 50 2 8142 1fce ῏ 50 2 8143 1fcf ῐ 39 2 8144 1fd0 ῑ 39 2 8145 1fd1 ῒ 39 2 8146 1fd2 ΐ 39 2 8147 1fd3 ῖ 39 2 8150 1fd6 ῗ 39 2 8151 1fd7 Ῐ 40 2 8152 1fd8 Ῑ 40 2 8153 1fd9 Ὶ 59 2 8154 1fda Ί 56 2 8155 1fdb ῝ 50 2 8157 1fdd ῞ 50 2 8158 1fde ῟ 50 2 8159 1fdf ῠ 61 2 8160 1fe0 ῡ 61 2 8161 1fe1 ῢ 61 2 8162 1fe2 ΰ 61 2 8163 1fe3 ῤ 59 3 8164 1fe4 ῥ 59 3 8165 1fe5 ῦ 61 2 8166 1fe6 ῧ 61 2 8167 1fe7 Ῠ 66 2 8168 1fe8 Ῡ 66 2 8169 1fe9 Ὺ 92 2 8170 1fea Ύ 90 2 8171 1feb Ῥ 79 2 8172 1fec ῭ 50 2 8173 1fed ΅ 50 2 8174 1fee ` 50 2 8175 1fef ῲ 82 3 8178 1ff2 ῳ 82 1 8179 1ff3 ῴ 82 3 8180 1ff4 ῶ 82 2 8182 1ff6 ῷ 82 3 8183 1ff7 Ὸ 96 2 8184 1ff8 Ό 84 2 8185 1ff9 Ὼ 98 2 8186 1ffa Ώ 85 2 8187 1ffb ῼ 83 3 8188 1ffc ´ 50 2 8189 1ffd ῾ 50 2 8190 1ffe ‐ 34 0 8208 2010 ‑ 34 0 8209 2011 ‒ 50 0 8210 2012 – 50 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‗ 50 1 8215 2017 ‘ 32 2 8216 2018 ` " ‘ " ’ 32 2 8217 2019 ' " ’ " ‚ 32 1 8218 201a ‛ 32 2 8219 201b “ 51 2 8220 201c ” 51 2 8221 201d „ 52 1 8222 201e ‟ 51 2 8223 201f † 50 3 8224 2020 ‡ 50 3 8225 2021 • 59 0 8226 2022 ‣ 59 0 8227 2023 … 100 0 8230 2026 ‰ 134 2 8240 2030 ‱ 173 2 8241 2031 ‹ 40 0 8249 2039 › 40 0 8250 203a ‼ 53 2 8252 203c ‾ 50 2 8254 203e ⁇ 98 2 8263 2047 ⁈ 75 2 8264 2048 ⁉ 75 2 8265 2049 ⁰ 40 2 8304 2070 ⁴ 40 2 8308 2074 ⁵ 40 2 8309 2075 ⁶ 40 2 8310 2076 ⁷ 40 2 8311 2077 ⁸ 40 2 8312 2078 ⁹ 40 2 8313 2079 ⁿ 43 2 8319 207f ₦ 66 2 8358 20a6 € 64 2 8364 20ac ₵ 64 3 8373 20b5 № 128 2 8470 2116 ™ 100 2 8482 2122 tm " Ω 83 2 8486 2126 K 75 2 8490 212a Å 72 2 8491 212b ∂ 52 2 8706 2202 pd " ∆ 70 2 8710 2206 ∇ 70 2 8711 2207 gr " ∏ 80 3 8719 220f ∑ 71 3 8721 2211 − 84 0 8722 2212 ∕ 17 2 8725 2215 ∙ 32 0 8729 2219 bu " √ 64 2 8730 221a sr " ∝ 68 0 8733 221d pt " ∞ 83 0 8734 221e if " ∟ 84 2 8735 221f ∠ 84 2 8736 2220 an " ∧ 73 0 8743 2227 l∧ 73 0 8743 2227 " ∨ 73 0 8744 2228 l| " ∩ 73 0 8745 2229 ca " ∪ 73 0 8746 222a cu " ∫ 52 3 8747 222b is " ≈ 84 0 8776 2248 ~~ " ≠ 84 2 8800 2260 != " ≡ 84 0 8801 2261 == " ≤ 84 0 8804 2264 ≥ 84 0 8805 2265 ⌂ 76 0 8962 2302 ⌐ 84 0 8976 2310 ⌑ 51 2 8977 2311 ⌘ 100 2 8984 2318 ⌙ 84 0 8985 2319 ⌠ 52 3 8992 2320 ⌡ 52 3 8993 2321 ⌥ 100 2 8997 2325 ⍽ 92 1 9085 237d ⎮ 52 3 9134 23ae ⏏ 77 0 9167 23cf ␣ 76 1 9251 2423 ▀ 77 2 9600 2580 ▁ 77 1 9601 2581 ▂ 77 1 9602 2582 ▃ 77 1 9603 2583 ▄ 77 1 9604 2584 ▅ 77 1 9605 2585 ▆ 77 1 9606 2586 ▇ 77 3 9607 2587 █ 77 3 9608 2588 ▉ 77 3 9609 2589 ▊ 77 3 9610 258a ▋ 77 3 9611 258b ▌ 77 3 9612 258c ▍ 77 3 9613 258d ▎ 77 3 9614 258e ▏ 77 3 9615 258f ▐ 77 3 9616 2590 ░ 77 3 9617 2591 ▒ 77 3 9618 2592 ▓ 77 3 9619 2593 ▔ 77 2 9620 2594 ▕ 77 3 9621 2595 ▖ 77 1 9622 2596 ▗ 77 1 9623 2597 ▘ 77 2 9624 2598 ▙ 77 3 9625 2599 ▚ 77 3 9626 259a ▛ 77 3 9627 259b ▜ 77 3 9628 259c ▝ 77 2 9629 259d ▞ 77 3 9630 259e ▟ 77 3 9631 259f ■ 77 3 9632 25a0 □ 77 3 9633 25a1 ▢ 77 3 9634 25a2 ▣ 77 3 9635 25a3 ▤ 77 3 9636 25a4 ▥ 77 3 9637 25a5 ▦ 77 3 9638 25a6 ▧ 77 3 9639 25a7 ▨ 77 3 9640 25a8 ▩ 77 3 9641 25a9 ▪ 50 0 9642 25aa ▫ 50 0 9643 25ab ▬ 77 0 9644 25ac ▭ 77 0 9645 25ad ▮ 37 3 9646 25ae ▯ 37 3 9647 25af ▰ 77 0 9648 25b0 ▱ 77 0 9649 25b1 ▲ 77 3 9650 25b2 △ 77 3 9651 25b3 ▴ 50 0 9652 25b4 ▵ 50 0 9653 25b5 ▶ 77 3 9654 25b6 ▷ 77 3 9655 25b7 ▸ 50 0 9656 25b8 ▹ 50 0 9657 25b9 ► 77 0 9658 25ba ▻ 77 0 9659 25bb ▼ 77 3 9660 25bc ▽ 77 3 9661 25bd ▾ 50 0 9662 25be ▿ 50 0 9663 25bf ◀ 77 3 9664 25c0 ◁ 77 3 9665 25c1 ◂ 50 0 9666 25c2 ◃ 50 0 9667 25c3 ◄ 77 0 9668 25c4 ◅ 77 0 9669 25c5 ◆ 77 3 9670 25c6 ◇ 77 3 9671 25c7 ◈ 77 3 9672 25c8 ◉ 77 3 9673 25c9 ◊ 49 3 9674 25ca ○ 77 3 9675 25cb ◌ 77 3 9676 25cc ◍ 77 3 9677 25cd ◎ 77 3 9678 25ce ● 77 3 9679 25cf ◐ 77 3 9680 25d0 ◑ 77 3 9681 25d1 ◒ 77 3 9682 25d2 ◓ 77 3 9683 25d3 ◔ 77 3 9684 25d4 ◕ 77 3 9685 25d5 ◖ 39 3 9686 25d6 ◗ 39 3 9687 25d7 ◘ 59 2 9688 25d8 ◙ 77 3 9689 25d9 ◚ 77 2 9690 25da ◛ 77 1 9691 25db ◜ 39 2 9692 25dc ◝ 39 2 9693 25dd ◞ 39 1 9694 25de ◟ 39 1 9695 25df ◠ 77 2 9696 25e0 ◡ 77 1 9697 25e1 ◢ 77 3 9698 25e2 ◣ 77 3 9699 25e3 ◤ 77 3 9700 25e4 ◥ 77 3 9701 25e5 ◦ 59 0 9702 25e6 ◧ 77 3 9703 25e7 ◨ 77 3 9704 25e8 ◩ 77 3 9705 25e9 ◪ 77 3 9706 25ea ◫ 77 3 9707 25eb ◬ 77 3 9708 25ec ◭ 77 3 9709 25ed ◮ 77 3 9710 25ee ◯ 99 3 9711 25ef ◰ 77 3 9712 25f0 ◱ 77 3 9713 25f1 ◲ 77 3 9714 25f2 ◳ 77 3 9715 25f3 ◴ 77 3 9716 25f4 ◵ 77 3 9717 25f5 ◶ 77 3 9718 25f6 ◷ 77 3 9719 25f7 ◸ 77 3 9720 25f8 ◹ 77 3 9721 25f9 ◺ 77 3 9722 25fa ◻ 65 1 9723 25fb ◼ 65 1 9724 25fc ◽ 56 0 9725 25fd ◾ 56 0 9726 25fe ◿ 77 3 9727 25ff ☸ 90 2 9784 2638 ⟠ 49 3 10208 27e0 ⧫ 49 3 10731 29eb ⬒ 77 3 11026 2b12 ⬓ 77 3 11027 2b13 fi 67 3 64257 fb01 fl 67 3 64258 fb02 � 103 3 65533 fffd 9base-6/troff/font/devutf/LuxiSans-Oblique0000644000175000017500000001432111402154555020221 0ustar anselmanselmname LuxiSans-Oblique fontname LuxiSans-Oblique spacewidth 28 charset ! 28 2 33 0021 " 35 2 34 0022 dq " dq " # 56 2 35 0023 $ 56 3 36 0024 % 89 2 37 0025 & 67 2 38 0026 ( 33 3 40 0028 ) 33 3 41 0029 * 39 2 42 002a + 58 0 43 002b , 28 1 44 002c - 33 0 45 002d . 28 0 46 002e / 28 3 47 002f 0 56 2 48 0030 1 56 2 49 0031 2 56 2 50 0032 3 56 2 51 0033 4 56 2 52 0034 5 56 2 53 0035 6 56 2 54 0036 7 56 2 55 0037 8 56 2 56 0038 9 56 2 57 0039 : 28 0 58 003a ; 28 1 59 003b < 58 0 60 003c = 58 0 61 003d > 58 0 62 003e ? 56 2 63 003f @ 102 2 64 0040 A 67 2 65 0041 B 67 2 66 0042 C 72 2 67 0043 D 72 2 68 0044 E 67 2 69 0045 F 61 2 70 0046 G 78 2 71 0047 H 72 2 72 0048 I 28 2 73 0049 J 50 3 74 004a K 67 2 75 004b L 56 2 76 004c M 83 2 77 004d N 72 2 78 004e O 78 2 79 004f P 67 2 80 0050 Q 78 3 81 0051 R 72 2 82 0052 S 67 2 83 0053 T 61 2 84 0054 U 72 2 85 0055 V 67 2 86 0056 W 94 2 87 0057 X 67 2 88 0058 Y 67 2 89 0059 Z 61 2 90 005a [ 28 3 91 005b \ 28 3 92 005c bs " ] 28 3 93 005d ^ 47 2 94 005e _ 56 1 95 005f a 56 0 97 0061 b 56 2 98 0062 c 50 0 99 0063 d 56 2 100 0064 e 56 0 101 0065 f 28 2 102 0066 g 56 1 103 0067 h 56 2 104 0068 i 22 2 105 0069 j 22 3 106 006a k 50 2 107 006b l 22 2 108 006c m 83 0 109 006d n 56 0 110 006e o 56 0 111 006f p 56 1 112 0070 q 56 1 113 0071 r 33 0 114 0072 s 50 0 115 0073 t 28 2 116 0074 u 56 0 117 0075 v 50 0 118 0076 w 72 0 119 0077 x 50 0 120 0078 y 50 1 121 0079 z 50 0 122 007a { 33 3 123 007b | 26 3 124 007c } 33 3 125 007d ~ 58 0 126 007e € 56 2 128 0080   28 0 160 00a0 ¡ 33 1 161 00a1 ¢ 56 2 162 00a2 £ 56 2 163 00a3 ¤ 56 0 164 00a4 ¥ 56 2 165 00a5 ¦ 26 3 166 00a6 § 56 3 167 00a7 ¨ 33 2 168 00a8 © 74 2 169 00a9 ª 37 2 170 00aa « 56 0 171 00ab ¬ 58 0 172 00ac ­ 33 0 173 00ad hy " ® 74 2 174 00ae rg " ¯ 56 2 175 00af ° 40 2 176 00b0 ± 58 0 177 00b1 +- " ² 33 2 178 00b2 ³ 33 2 179 00b3 ´ 33 2 180 00b4 aa " µ 56 1 181 00b5 ¶ 54 3 182 00b6 · 28 0 183 00b7 ¸ 33 1 184 00b8 ¹ 33 2 185 00b9 º 37 2 186 00ba » 56 0 187 00bb ¼ 83 2 188 00bc ½ 83 2 189 00bd ¾ 83 2 190 00be ¿ 61 1 191 00bf À 67 2 192 00c0 Á 67 2 193 00c1  67 2 194 00c2 à 67 2 195 00c3 Ä 67 2 196 00c4 Å 67 2 197 00c5 Æ 100 2 198 00c6 Ç 72 3 199 00c7 È 67 2 200 00c8 É 67 2 201 00c9 Ê 67 2 202 00ca Ë 67 2 203 00cb Ì 28 2 204 00cc Í 28 2 205 00cd Î 28 2 206 00ce Ï 28 2 207 00cf Ð 72 2 208 00d0 Ñ 72 2 209 00d1 Ò 78 2 210 00d2 Ó 78 2 211 00d3 Ô 78 2 212 00d4 Õ 78 2 213 00d5 Ö 78 2 214 00d6 × 58 0 215 00d7 mu " Ø 78 2 216 00d8 Ù 72 2 217 00d9 Ú 72 2 218 00da Û 72 2 219 00db Ü 72 2 220 00dc Ý 67 2 221 00dd Þ 67 2 222 00de ß 61 2 223 00df à 56 2 224 00e0 á 56 2 225 00e1 â 56 2 226 00e2 ã 56 2 227 00e3 ä 56 2 228 00e4 å 56 2 229 00e5 æ 89 0 230 00e6 ç 50 1 231 00e7 è 56 2 232 00e8 é 56 2 233 00e9 ê 56 2 234 00ea ë 56 2 235 00eb ì 22 2 236 00ec í 22 2 237 00ed î 22 2 238 00ee ï 22 2 239 00ef ð 56 2 240 00f0 ñ 56 2 241 00f1 ò 56 2 242 00f2 ó 56 2 243 00f3 ô 56 2 244 00f4 õ 56 2 245 00f5 ö 56 2 246 00f6 ÷ 58 0 247 00f7 -: " di " ø 61 0 248 00f8 ù 56 2 249 00f9 ú 56 2 250 00fa û 56 2 251 00fb ü 56 2 252 00fc ý 50 3 253 00fd þ 56 3 254 00fe ÿ 50 3 255 00ff ā 56 2 257 0101 Ă 67 2 258 0102 ă 56 2 259 0103 Ą 67 3 260 0104 ą 56 1 261 0105 Ć 72 2 262 0106 ć 50 2 263 0107 Ĉ 72 2 264 0108 ĉ 50 2 265 0109 Ċ 72 2 266 010a ċ 50 2 267 010b Č 72 2 268 010c č 50 2 269 010d Ď 72 2 270 010e ď 61 2 271 010f Đ 72 2 272 0110 đ 56 2 273 0111 Ē 67 2 274 0112 ē 56 2 275 0113 Ĕ 67 2 276 0114 ĕ 56 2 277 0115 Ė 67 2 278 0116 ė 56 2 279 0117 Ę 67 3 280 0118 ę 56 1 281 0119 Ě 67 2 282 011a ě 56 2 283 011b Ĝ 78 2 284 011c ĝ 56 3 285 011d Ğ 78 2 286 011e ğ 56 3 287 011f Ġ 78 2 288 0120 ġ 56 3 289 0121 Ģ 78 3 290 0122 ģ 56 3 291 0123 Ĥ 72 2 292 0124 ĥ 56 2 293 0125 Ħ 72 2 294 0126 ħ 56 2 295 0127 Ĩ 28 2 296 0128 ĩ 22 2 297 0129 Ī 28 2 298 012a ī 22 2 299 012b Ĭ 28 2 300 012c ĭ 22 2 301 012d Į 28 3 302 012e į 22 3 303 012f İ 28 2 304 0130 ı 22 0 305 0131 IJ 73 3 306 0132 ij 44 3 307 0133 Ĵ 50 3 308 0134 ĵ 22 3 309 0135 Ķ 67 3 310 0136 ķ 50 3 311 0137 ĸ 50 0 312 0138 Ĺ 56 2 313 0139 ĺ 22 2 314 013a Ļ 56 3 315 013b ļ 22 3 316 013c Ľ 56 2 317 013d ľ 29 2 318 013e Ŀ 56 2 319 013f ŀ 33 2 320 0140 Ł 56 2 321 0141 ł 22 2 322 0142 Ń 72 2 323 0143 ń 56 2 324 0144 Ņ 72 3 325 0145 ņ 56 1 326 0146 Ň 72 2 327 0147 ň 56 2 328 0148 ʼn 60 2 329 0149 Ŋ 72 3 330 014a ŋ 56 1 331 014b Ō 78 2 332 014c ō 56 2 333 014d Ŏ 78 2 334 014e ŏ 56 2 335 014f Ő 78 2 336 0150 ő 56 2 337 0151 Œ 100 2 338 0152 œ 94 0 339 0153 Ŕ 72 2 340 0154 ŕ 33 2 341 0155 Ŗ 72 3 342 0156 ŗ 33 1 343 0157 Ř 72 2 344 0158 ř 33 2 345 0159 Ś 67 2 346 015a ś 50 2 347 015b Ŝ 67 2 348 015c ŝ 50 2 349 015d Ş 67 3 350 015e ş 50 1 351 015f Š 67 2 352 0160 š 50 2 353 0161 Ţ 61 3 354 0162 ţ 28 3 355 0163 Ť 61 2 356 0164 ť 38 2 357 0165 Ŧ 61 2 358 0166 ŧ 28 2 359 0167 Ũ 72 2 360 0168 ũ 56 2 361 0169 Ū 72 2 362 016a ū 56 2 363 016b Ŭ 72 2 364 016c ŭ 56 2 365 016d Ů 72 2 366 016e ů 56 2 367 016f Ű 72 2 368 0170 ű 56 2 369 0171 Ų 72 3 370 0172 ų 56 1 371 0173 Ŵ 94 2 372 0174 ŵ 72 2 373 0175 Ŷ 67 2 374 0176 ŷ 50 3 375 0177 Ÿ 67 2 376 0178 Ź 61 2 377 0179 ź 50 2 378 017a Ż 61 2 379 017b ż 50 2 380 017c Ž 61 2 381 017d ž 50 2 382 017e ſ 22 2 383 017f ƒ 56 3 402 0192 Ș 67 3 536 0218 ș 50 1 537 0219 Ț 61 3 538 021a ț 28 3 539 021b ˆ 33 2 710 02c6 ˇ 33 2 711 02c7 ˉ 33 2 713 02c9 ˘ 33 2 728 02d8 ˙ 33 2 729 02d9 ˚ 33 2 730 02da ˛ 33 1 731 02db ˜ 33 2 732 02dc ˝ 33 2 733 02dd ̦ 33 1 806 0326 ; 28 1 894 037e · 28 0 903 0387 ‐ 33 0 8208 2010 ‑ 33 0 8209 2011 ‒ 56 0 8210 2012 – 56 0 8211 2013 en " \- " — 100 0 8212 2014 em " -- " ― 100 0 8213 2015 ‘ 22 2 8216 2018 ` " ‘ " ’ 22 2 8217 2019 ' " ’ " ‚ 22 1 8218 201a ‛ 28 0 8219 201b “ 33 2 8220 201c ” 33 2 8221 201d „ 33 1 8222 201e † 56 3 8224 2020 ‡ 56 3 8225 2021 • 35 0 8226 2022 … 100 0 8230 2026 ‰ 100 2 8240 2030 ‹ 33 0 8249 2039 › 33 0 8250 203a ‾ 56 2 8254 203e ⁄ 17 2 8260 2044 € 56 2 8364 20ac ™ 100 2 8482 2122 tm " ℮ 56 0 8494 212e − 58 0 8722 2212 ∕ 17 2 8725 2215 ∙ 28 0 8729 2219 bu " ⋅ 28 0 8901 22c5  50 2 59905 ea01  50 2 59906 ea02  33 2 61444 f004  22 1 63166 f6be fi 50 2 64257 fb01 fl 50 2 64258 fb02 9base-6/troff/font/devutf/UnivMath60000644000175000017500000000330411402154555016675 0ustar anselmanselmname UnivMath6 fontname Universal-MathSix charset --- 100 2 33 --- 83 2 34 --- 100 2 35 --- 100 2 36 --- 83 2 37 --- 83 2 38 --- 83 2 39 --- 83 2 40 --- 83 2 41 --- 83 2 42 --- 33 2 43 --- 83 2 44 --- 83 2 45 --- 83 2 46 --- 83 2 47 --- 83 2 48 --- 83 2 49 --- 83 2 50 --- 83 2 51 --- 83 2 52 --- 83 2 53 --- 83 2 54 --- 83 2 55 --- 83 2 56 --- 83 2 57 --- 50 2 58 --- 50 2 59 --- 83 2 60 --- 83 2 61 --- 72 2 62 --- 83 2 63 --- 100 2 64 A 72 2 65 Blackboard Bold A B 72 2 66 Blackboard Bold B C 72 2 67 Blackboard Bold C D 78 2 68 Blackboard Bold D E 56 2 69 Blackboard Bold E F 56 2 70 Blackboard Bold F G 78 2 71 Blackboard Bold G H 78 2 72 Blackboard Bold H I 33 2 73 Blackboard Bold I J 56 2 74 Blackboard Bold J K 78 2 75 Blackboard Bold K L 56 2 76 Blackboard Bold L M 94 2 77 Blackboard Bold M N 78 2 78 Blackboard Bold N O 83 2 79 Blackboard Bold O P 72 2 80 Blackboard Bold P Q 83 2 81 Blackboard Bold Q R 72 2 82 Blackboard Bold R S 72 2 83 Blackboard Bold S T 67 2 84 Blackboard Bold T U 72 2 85 Blackboard Bold U V 72 2 86 Blackboard Bold V W 100 2 87 Blackboard Bold W X 72 2 88 Blackboard Bold X Y 72 2 89 Blackboard Bold Y Z 67 2 90 Blackboard Bold Z --- 67 2 91 --- 83 2 92 --- 83 2 93 --- 83 2 94 --- 83 2 95 --- 100 2 96 --- 83 2 97 --- 83 2 98 --- 83 2 99 --- 83 2 100 --- 83 2 101 --- 83 2 102 --- 83 2 103 --- 83 2 104 --- 83 2 105 --- 83 2 106 --- 83 2 107 --- 83 2 108 --- 83 2 109 --- 83 2 110 --- 83 2 111 --- 50 2 112 --- 83 2 113 --- 83 2 114 --- 83 2 115 --- 83 2 116 --- 83 2 117 --- 83 2 118 --- 83 2 119 --- 83 2 120 --- 83 2 121 --- 67 2 122 --- 67 2 123 --- 83 2 124 --- 83 2 125 --- 100 2 126 --- 50 2 162 --- 50 2 163 --- 83 2 164 --- 72 2 170 --- 83 2 176 --- 83 2 193 --- 83 2 248 --- 72 2 249 9base-6/troff/font/devutf/PX0000644000175000017500000000533711402154555015413 0ustar anselmanselmname PX fontname Palatino-BoldItalic named in prologue spacewidth 25 charset ! 33 2 33 " 50 2 34 dq " # 50 2 35 $ 50 2 36 % 89 2 37 & 83 2 38 ' 28 2 39 ( 33 2 40 ) 33 2 41 * 44 2 42 + 61 0 43 , 25 1 44 - 39 0 173 . 25 0 46 / 32 2 47 0 50 2 48 1 50 2 49 2 50 2 50 3 50 2 51 4 50 2 52 5 50 2 53 6 50 2 54 7 50 2 55 8 50 2 56 9 50 2 57 : 25 0 58 ; 25 1 59 --- 61 0 60 = 61 0 61 --- 61 0 62 ? 44 2 63 @ 83 2 64 A 72 2 65 B 67 2 66 C 69 2 67 D 78 2 68 E 61 2 69 F 56 2 70 G 78 2 71 H 78 2 72 I 39 2 73 J 39 3 74 K 72 2 75 L 61 2 76 M 94 2 77 N 78 2 78 O 83 2 79 P 67 2 80 Q 83 3 81 R 72 2 82 S 56 2 83 T 61 2 84 U 78 2 85 V 67 2 86 W 100 2 87 X 72 2 88 Y 61 2 89 Z 67 2 90 [ 33 2 91 \ 61 2 92 bs " ] 33 2 93 ^ 33 2 147 --- 61 2 94 --- 50 1 95 ` 28 2 96 a 56 0 97 b 54 2 98 c 44 0 99 d 56 2 100 e 44 0 101 f 33 3 102 g 50 1 103 h 56 2 104 i 33 2 105 j 33 3 106 k 56 2 107 l 33 2 108 m 83 0 109 n 56 0 110 o 56 0 111 p 56 1 112 q 54 1 113 r 39 0 114 s 44 0 115 t 39 2 116 u 56 0 117 v 56 0 118 w 83 0 119 x 50 0 120 y 56 1 121 z 50 0 122 { 33 2 123 --- 61 2 124 } 33 2 125 ~ 33 2 148 --- 61 0 126 \` 33 2 145 ga " !! 33 1 161 ¡ " c| 50 2 162 ct " ¢ " L- 50 2 163 £ " ps " xo 50 2 164 ¤ " cr " Y- 50 2 165 ¥ " yn " || 61 2 166 ¦ " so 56 3 167 sc " § " "" 33 2 168 ¨ " :a " co 75 2 169 © " a_ 33 2 170 ª " << 50 0 171 « " -, 61 0 172 hy 39 0 173 -- 61 0 45 ­ " ro 75 2 174 rg " ® " -^ 33 2 175 -a " ¯ " 0^ 40 2 176 ° " +- 61 0 177 ± " 2^ 30 2 178 ² " 3^ 30 2 179 ³ " \' 33 2 180 aa " ´ " /u 56 1 181 µ " P! 56 3 182 pg " ¶ " .^ 25 0 183 · " ,, 33 1 184 ¸ " ,a " 1^ 30 2 185 ¹ " o_ 33 2 186 º " >> 50 0 187 » " 14 75 2 188 ¼ " 12 75 2 189 ½ " 34 75 2 190 ¾ " ?? 44 1 191 ¿ " A` 72 2 192 À " A' 72 2 193 Á " A^ 72 2 194  " A~ 72 2 195 à " A" 72 2 196 Ä " A* 72 2 197 Å " AE 94 2 198 Æ " C, 69 3 199 Ç " E` 61 2 200 È " E' 61 2 201 É " E^ 61 2 202 Ê " E" 61 2 203 Ë " I` 39 2 204 Ì " I' 39 2 205 Í " I^ 39 2 206 Î " I" 39 2 207 Ï " D- 78 2 208 Ð " N~ 78 2 209 Ñ " O` 83 2 210 Ò " O' 83 2 211 Ó " O^ 83 2 212 Ô " O~ 83 2 213 Õ " O" 83 2 214 Ö " xx 61 0 215 × " O/ 83 2 216 Ø " U` 78 2 217 Ù " U' 78 2 218 Ú " U^ 78 2 219 Û " U" 78 2 220 Ü " Y' 61 2 221 Ý " TH 67 2 222 Þ " ss 56 3 223 ß " a` 56 2 224 à " a' 56 2 225 á " a^ 56 2 226 â " a~ 56 2 227 ã " a" 56 2 228 ä " a* 56 2 229 å " ae 74 0 230 æ " c, 44 1 231 ç " e` 44 2 232 è " e' 44 2 233 é " e^ 44 2 234 ê " e" 44 2 235 ë " i` 33 2 236 ì " i' 33 2 237 í " i^ 33 2 238 î " i" 33 2 239 ï " d- 56 2 240 ð " n~ 56 2 241 ñ " o` 56 2 242 ò " o' 56 2 243 ó " o^ 56 2 244 ô " o~ 56 2 245 õ " o" 56 2 246 ö " -: 61 0 247 ÷ " o/ 56 0 248 ø " u` 56 2 249 ù " u' 56 2 250 ú " u^ 56 2 251 û " u" 56 2 252 ü " y' 56 3 253 ý " th 56 3 254 þ " y" 56 3 255 ÿ " 9base-6/troff/font/devutf/charlib/0000755000175000017500000000000011402154555016535 5ustar anselmanselm9base-6/troff/font/devutf/charlib/_c_i0000644000175000017500000000022111402154555017344 0ustar anselmanselm/build_ci { pop size 3 mul 8 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 9base-6/troff/font/devutf/charlib/LA0000644000175000017500000000172511402154555016761 0ustar anselmanselm/LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LA { pop LOGO-dict-mm begin gsave currentpoint translate size 2.56 div dup scale % was size 2.75 div dup scale .02 0 translate ATT fill grestore end } def 9base-6/troff/font/devutf/charlib/#263a0000644000175000017500000000072411402154555017201 0ustar anselmanselm/build_X263a{ pop gsave currentpoint translate 7.44 7.68 scale ptsize dup scale 31 32 true [31 0 0 -32 2 31] {< 0007c000 007ff800 01c00600 03000180 060000c0 08000060 18000030 30000018 20000008 4000000c 40183004 c0183006 80183002 80000002 80000002 80000002 860000c2 8e0000e2 8e0000e2 9a0001e2 c3000186 41800304 41c0060c 60f01c08 303ff818 101fe030 08000060 040000c0 03000180 01c00700 007cfc00 000fe000 >} imagemask grestore } def 9base-6/troff/font/devutf/charlib/_r_h0000644000175000017500000000417111402154555017372 0ustar anselmanselm/build_rh { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto stroke 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto stroke 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto stroke grestore } def 9base-6/troff/font/devutf/charlib/_l_h0000644000175000017500000000441211402154555017362 0ustar anselmanselm/build_lh { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto stroke 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto stroke 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto stroke grestore } def 9base-6/troff/font/devutf/charlib/_s_q0000644000175000017500000000032011402154555017374 0ustar anselmanselm/build_sq { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath font B eq {fill} {stroke} ifelse } def 9base-6/troff/font/devutf/charlib/_l_f0000644000175000017500000000171211402154555017360 0ustar anselmanselm% % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 9base-6/troff/font/devutf/charlib/LH0000644000175000017500000016615711402154555017003 0ustar anselmanselm%!PS /build_LH { LucentLogo begin /LHwidth exch def gsave .01 .01 scale currentpoint translate size 50 div dup scale 1.0356 1.0356 scale ptsize 26 le { % Small-Size Signature gsave 1.32 dup scale 0 2280 LucentTechnologies 5588 735 BellLabs grestore 25500 7399 Ring } { % Primary Signature 0 2280 LucentTechnologies 5588 735 BellLabs 20836 7399 Ring } ifelse grestore end } def % dictionary sharing between various Lucent Technology logos and % color printer detection by Matthijs Melchior, Lucent Technologies, Hilversum, NL /LucentLogo dup where not { 100 dict dup 3 1 roll def } { pop load } ifelse begin /LucentRed { statusdict /processcolors known { statusdict /processcolors get exec 2 le } { true } ifelse % boolean on stack: true==b&w, false==color { 0 setgray } { 0 0.91 0.76 0.06 setcmykcolor } ifelse }bind def /C /closepath load def /f /fill load def /c /rcurveto load def /l /rlineto load def /m /rmoveto load def /n { translate 0 0 moveto }bind def /W{ currentrgbcolor currentpoint 1 setgray fill moveto setrgbcolor }bind def /B{ currentpoint fill moveto }bind def /LucentTechnologies{ gsave moveto currentpoint translate Line1.1 Line1.2 Line1.3 Line1.4 grestore }bind def /BellLabs{ gsave moveto currentpoint translate Line2.1 Line2.2 Line2.3 Line2.4 grestore }bind def /Ring{ gsave LucentRed moveto currentpoint translate 1 1 51 { ( ) cvs cvn load exec } for grestore }bind def /Line1.1{ 275 0 l 0 -828 l 426 0 l 0 -204 l -701 0 l 0 1032 l C f 1623 -1032 n -243 0 l 0 142 l -3 0 l -53 -111 -160 -160 -281 -160 c -210 0 -294 148 -294 308 c 0 481 l 266 0 l 0 -373 l 0 -145 50 -194 123 -194 c 109 0 166 75 166 241 c 0 325 l 266 0 l 0 -771 l C f 742 550 n -49 30 -98 43 -161 43 c -115 0 -204 -80 -204 -213 c 0 -123 104 -203 219 -203 c 61 0 121 13 166 37 c 6 -198 l -67 -22 -146 -34 -217 -34 c -254 0 -448 148 -448 402 c 0 256 194 404 448 404 c 80 0 151 -13 211 -43 c -19 -195 l C f 339 -243 n 15 -106 96 -148 226 -148 c 72 0 155 16 235 59 c 0 -188 l -86 -34 -183 -49 -282 -49 c -254 0 -448 149 -448 404 c 0 254 173 402 413 402 c 285 0 389 -203 389 -432 c 0 -49 l -532 0 l C 293 151 m 0 89 -41 161 -148 161 c -96 0 -142 -72 -148 -161 c 296 0 l C f 625 463 n 243 0 l 0 -142 l 3 0 l 53 111 160 160 281 160 c 210 0 294 -148 294 -308 c 0 -481 l -266 0 l 0 373 l 0 145 -50 194 -123 194 c -109 0 -166 -75 -166 -241 c 0 -325 l -266 0 l 0 771 l C f 891 0 n 157 0 l 0 173 l 262 81 l 0 -254 l 186 0 l 0 -186 l -186 0 l 0 -284 l 0 -93 22 -141 106 -141 c }def /Line1.2{ 27 0 55 6 81 10 c 9 -173 l -50 -6 -101 -15 -167 -15 c -238 0 -296 105 -296 288 c 0 314 l -152 0 l 0 186 l C f 1368 58 n -254 0 l 0 204 l 784 0 l 0 -204 l -254 0 l 0 -828 l -275 0 l 0 828 l C f 747 -521 n 15 -106 96 -148 226 -148 c 72 0 155 16 235 59 c 0 -188 l -86 -34 -183 -49 -283 -49 c -254 0 -448 149 -448 404 c 0 254 173 402 413 402 c 285 0 389 -203 389 -432 c 0 -49 l -532 0 l C 293 151 m 0 89 -41 161 -148 161 c -96 0 -142 -72 -148 -161 c 296 0 l C f 1260 243 n -49 30 -98 43 -161 43 c -115 0 -204 -80 -204 -213 c 0 -123 104 -203 219 -203 c 61 0 121 13 166 37 c 6 -198 l -67 -22 -146 -34 -217 -34 c -254 0 -448 148 -448 402 c 0 256 194 404 448 404 c 80 0 151 -13 212 -43 c -19 -195 l C f 136 559 n 266 0 l 0 -453 l 3 0 l 58 80 142 132 257 132 c 210 0 294 -148 294 -308 c 0 -481 l -266 0 l 0 373 l 0 145 -50 194 -123 194 c -109 0 -166 -75 -166 -241 c 0 -325 l -266 0 l 0 1109 l C f 942 -339 n 243 0 l 0 -142 l 3 0 l 53 111 160 160 281 160 c 210 0 294 -148 294 -308 c 0 -481 l -266 0 l 0 373 l 0 145 -50 194 -123 194 c -109 0 -166 -75 -166 -241 c 0 -325 l -266 0 l 0 771 l }def /Line1.3{ C f 905 -386 n 0 256 194 404 448 404 c 254 0 448 -148 448 -404 c 0 -254 -194 -402 -448 -402 c -254 0 -448 148 -448 402 c C 621 0 m 0 115 -50 217 -173 217 c -123 0 -173 -102 -173 -217 c 0 -114 50 -216 173 -216 c 123 0 173 102 173 216 c C f 982 725 n 266 0 l 0 -1109 l -266 0 l 0 1109 l C f 367 -725 n 0 256 194 404 448 404 c 254 0 448 -148 448 -404 c 0 -254 -194 -402 -448 -402 c -254 0 -448 148 -448 402 c C 621 0 m 0 115 -50 217 -173 217 c -123 0 -173 -102 -173 -217 c 0 -114 50 -216 173 -216 c 123 0 173 102 173 216 c C f 1827 -294 n 0 -317 -154 -419 -464 -419 c -127 0 -232 27 -294 49 c 13 210 l 81 -40 149 -64 260 -64 c 154 0 237 72 237 223 c 0 41 l -3 0 l -64 -90 -152 -132 -259 -132 c -212 0 -343 160 -343 388 c 0 229 108 401 348 401 c 114 0 206 -62 262 -157 c 3 0 l 0 139 l 241 0 l 0 -680 l C -427 114 m 95 0 170 80 170 198 c 0 86 -50 182 -170 182 c -99 0 -151 -87 -151 -192 c 0 -120 71 -188 151 -188 c C f 143 680 n 266 0 l 0 -771 l -266 0 l 0 771 l C 266 126 m -266 0 l 0 195 l 266 0 l 0 -195 l C f 636 -463 n 15 -106 96 -148 226 -148 c 72 0 155 16 235 59 c 0 -188 l -86 -34 -183 -49 -282 -49 c -254 0 -448 149 -448 404 c 0 254 173 402 413 402 c 285 0 389 -203 389 -432 c }def /Line1.4{ 0 -49 l -532 0 l C 293 151 m 0 89 -41 161 -148 161 c -96 0 -142 -72 -148 -161 c 296 0 l C f 642 -95 n 62 -27 154 -53 250 -53 c 55 0 108 9 108 62 c 0 130 -379 38 -379 317 c 0 177 175 250 328 250 c 92 0 185 -10 271 -44 c -21 -185 l -56 34 -141 52 -207 52 c -58 0 -123 -10 -123 -53 c 0 -120 396 -25 396 -318 c 0 -206 -185 -257 -359 -257 c -120 0 -201 12 -280 37 c 15 194 l C f }def /Line2.1{ 190 0 l 146 0 246 -47 246 -177 c 0 -97 -56 -145 -145 -167 c 0 -2 l 96 -8 163 -70 163 -169 c 0 -151 -125 -187 -268 -187 c -187 0 l 0 702 l C 101 -620 m 75 0 l 91 0 172 19 172 114 c 0 109 -96 124 -182 124 c -65 0 l 0 -237 l C 0 320 m 55 0 l 98 0 180 9 180 113 c 0 83 -71 105 -130 105 c -106 0 l 0 -217 l C f 964 -681 n -36 -13 -77 -33 -162 -33 c -182 0 -266 111 -266 278 c 0 152 96 259 240 259 c 171 0 226 -125 226 -290 c -366 0 l 0 -102 79 -171 169 -171 c 62 0 135 32 158 51 c 0 -95 l C -61 285 m 0 78 -46 143 -128 143 c -93 0 -131 -76 -138 -143 c 266 0 l C f 158 733 n 95 0 l 0 -754 l -95 0 l 0 754 l C f 258 0 n 95 0 l 0 -754 l -95 0 l 0 754 l C f 509 -52 n 101 0 l 0 -614 l 294 0 l 0 -89 l -394 0 l 0 702 l C f 514 -225 n 47 28 104 48 169 48 c 147 0 206 -72 206 -212 c 0 -212 l 0 -58 2 -85 4 -101 c -89 0 l 0 66 l -2 0 l -22 -31 -72 -78 -159 -78 c -111 0 -188 48 -188 160 c 0 129 141 169 238 169 c 37 0 63 0 101 -2 c 0 89 -32 134 -127 134 c -53 0 -111 -20 -149 -52 c -5 80 l C 281 -232 m }def /Line2.2{ -20 0 -40 2 -60 2 c -51 0 -178 -8 -178 -99 c 0 -54 52 -83 96 -83 c 94 0 143 58 143 135 c 0 45 l C f 495 278 n 95 0 l 0 -312 l 2 0 l 29 47 80 82 170 82 c 149 0 221 -122 221 -259 c 0 -141 -65 -278 -220 -278 c -92 0 -150 46 -175 84 c -2 0 l 0 -72 l -91 0 l 0 754 l C 246 -306 m -103 0 -152 -98 -152 -193 c 0 -85 44 -191 151 -191 c 102 0 144 114 142 194 c 2 93 -38 190 -141 190 c C f 566 -654 n 37 -24 91 -36 118 -36 c 43 0 97 18 97 73 c 0 94 -222 85 -222 229 c 0 107 79 158 181 158 c 44 0 80 -9 118 -20 c -8 -83 l -21 13 -77 26 -100 26 c -48 0 -91 -20 -91 -62 c 0 -105 222 -74 222 -238 c 0 -110 -87 -160 -179 -160 c -48 0 -98 5 -141 28 c 5 84 l C f 678 601 n 101 0 l 0 -702 l -101 0 l 0 702 l C f 243 -189 n 92 0 l 0 -81 l 2 0 l 28 58 97 94 168 94 c 133 0 192 -82 192 -220 c 0 -305 l -95 0 l 0 266 l 0 120 -26 178 -109 183 c -108 0 -156 -87 -156 -211 c 0 -237 l -95 0 l 0 513 l C f 571 0 n 92 0 l 0 -81 l 2 0 l 28 58 97 94 168 94 c 133 0 192 -82 192 -220 c 0 -305 l -95 0 l 0 266 l 0 120 -26 178 -109 183 c -108 0 -156 -87 -156 -211 c 0 -237 l -95 0 l 0 513 l C }def /Line2.3{ f 807 12 n 156 0 261 -113 261 -269 c 0 -147 -107 -269 -261 -269 c -155 0 -262 122 -262 269 c 0 156 105 269 262 269 c C 0 -461 m 111 0 160 101 160 192 c 0 98 -59 192 -160 192 c -102 0 -161 -95 -161 -192 c 0 -92 49 -192 161 -192 c C f 584 -525 n -113 0 l -184 513 l 104 0 l 139 -418 l 2 0 l 142 418 l 95 0 l -184 -513 l C f 270 477 n 47 28 104 48 169 48 c 147 0 206 -72 206 -212 c 0 -212 l 0 -58 2 -85 4 -101 c -89 0 l 0 66 l -2 0 l -22 -31 -72 -78 -159 -78 c -111 0 -188 48 -188 160 c 0 129 141 169 238 169 c 37 0 63 0 101 -2 c 0 89 -32 134 -127 134 c -53 0 -111 -20 -149 -52 c -5 80 l C 281 -232 m -20 0 -40 2 -60 2 c -51 0 -178 -8 -178 -99 c 0 -54 52 -83 96 -83 c 94 0 143 58 143 135 c 0 45 l C f 788 -40 n -136 0 l 0 -281 l 0 -59 36 -92 79 -92 c 29 0 50 9 64 18 c 0 -80 l -21 -6 -50 -14 -80 -14 c -98 0 -158 46 -158 149 c 0 300 l -116 0 l 0 76 l 116 0 l 0 119 l 95 30 l 0 -149 l 136 0 l 0 -76 l C f 121 76 n 95 0 l 0 -513 l -95 0 l 0 513 l C 101 115 m -107 0 l 0 107 l 107 0 l 0 -107 l C }def /Line2.4{ f 446 12 n 156 0 260 -113 260 -269 c 0 -147 -107 -269 -260 -269 c -155 0 -262 122 -262 269 c 0 156 105 269 262 269 c C 0 -461 m 111 0 160 101 160 192 c 0 98 -59 192 -160 192 c -102 0 -161 -95 -161 -192 c 0 -92 49 -192 161 -192 c C f 352 -12 n 92 0 l 0 -81 l 2 0 l 28 58 97 94 168 94 c 133 0 192 -82 192 -220 c 0 -305 l -95 0 l 0 266 l 0 120 -26 178 -109 183 c -108 0 -156 -87 -156 -211 c 0 -237 l -95 0 l 0 513 l C f 556 -412 n 37 -24 91 -36 118 -36 c 43 0 97 18 97 73 c 0 94 -222 85 -222 229 c 0 107 79 158 181 158 c 44 0 80 -9 118 -20 c -8 -83 l -21 13 -77 26 -100 26 c -48 0 -91 -20 -91 -62 c 0 -105 222 -74 222 -238 c 0 -110 -88 -160 -179 -160 c -48 0 -98 5 -141 28 c 5 84 l C f }def /1{ 12 -19 -11 -40 13 -52 c 27 18 43 -19 69 -9 c 22 -9 8 -51 40 -46 c 4 6 14 12 12 21 c 8 3 17 1 25 -7 c 40 22 88 1 118 42 c 28 -11 65 24 88 -11 c 113 17 l 18 10 -5 32 17 37 c 21 -11 35 9 52 13 c 15 -22 33 -45 63 -39 c 15 6 8 39 31 24 c 7 -14 -17 -44 8 -56 c 25 31 58 -7 84 13 c 41 6 79 23 96 61 c 55 -9 104 57 137 -12 c 45 -33 82 30 129 6 c -5 -15 -34 -17 -27 -39 c 33 -12 88 12 114 -31 c 15 -20 27 6 38 11 c 3 6 l 13 -8 2 -38 26 -34 c 22 14 10 -18 22 -21 c -9 -12 l 33 -26 66 12 99 -14 c 27 4 l -18 -10 -50 -25 -54 -51 c -11 -16 l 27 -27 58 -52 97 -39 c 19 -21 37 -6 57 0 c 4 8 6 18 16 21 c 17 -11 l -14 -12 l 32 -9 47 30 77 36 c 50 -46 123 31 157 -52 c -18 -20 17 -34 17 -56 c 40 20 67 -45 119 -20 c 6 -25 -35 -30 -24 -57 c -11 -9 -31 11 -44 -7 c -7 -8 -11 -17 -9 -29 c 44 -59 94 21 143 -21 c 29 -8 62 32 91 4 c -6 -42 44 -26 42 -61 c -26 -9 -26 34 -57 21 c -5 -9 -16 -18 -9 -31 c 27 -30 64 -46 100 -52 c 23 -26 73 -4 89 -49 c 28 11 40 -3 57 -21 c 0 -24 38 -13 34 -41 c 26 -13 58 -60 93 -29 c 4 6 17 1 24 -7 c -3 -13 -19 -20 -35 -19 c 0 -35 l -19 -25 -43 19 -54 -17 c 1 -19 4 -39 25 -39 c 7 -2 7 -9 7 -14 c -9 -7 -25 -9 -31 -24 c -2 -12 12 -19 19 -25 c 29 11 49 -37 77 -9 c 17 35 67 24 97 55 c }def /2{ 39 27 86 49 125 62 c 22 -21 l -18 13 -75 -18 -109 -36 c 14 -25 -16 -33 -28 -44 c -26 -7 -66 2 -82 -26 c 15 -18 41 -18 63 -28 c 36 21 73 56 113 7 c 21 -2 53 24 64 -9 c -19 -25 -49 1 -62 -34 c -15 -28 30 -27 19 -54 c 29 -8 20 -61 60 -39 c 8 -28 52 -13 50 -44 c -19 -3 -39 8 -54 0 c -12 -23 -33 -31 -34 -57 c 26 1 44 -17 54 -35 c 21 -21 87 17 78 -36 c 13 -8 21 -16 27 -30 c 1 -55 91 29 79 -45 c 13 -17 39 3 47 -22 c -11 -16 -65 -19 -44 -50 c 8 -7 17 -11 29 -9 c 8 6 13 19 21 22 c 15 -8 -10 -24 5 -32 c 13 -26 41 -18 59 -34 c -4 -9 -17 -15 -12 -26 c 22 -17 64 12 72 -29 c -18 -15 -44 -19 -39 -49 c 24 -10 17 -41 36 -57 c -7 -10 -18 -20 -20 -31 c 22 -19 44 -5 73 -4 c 15 -43 45 34 51 -16 c -24 -33 -91 17 -91 -38 c 17 -35 47 -14 74 -8 c 29 -1 46 -41 77 -31 c 23 -24 l -6 -15 -23 -28 -44 -27 c -17 53 -47 -7 -78 -1 c -23 -5 -60 17 -73 -16 c 17 -18 17 -54 51 -54 c 43 24 54 -82 94 -18 c 5 -8 14 -12 12 -22 c -11 -9 -33 -10 -34 -29 c 32 -14 61 -48 103 -38 c 15 26 l 15 -6 -5 -15 -1 -24 c -16 -21 -53 -25 -48 -59 c 15 -20 27 4 42 6 c 22 26 58 5 84 16 c 38 -32 l -33 4 -85 13 -109 -11 c 37 -18 83 -67 128 -48 c -14 -7 -30 -10 -39 -25 c 23 -15 5 -65 44 -42 c 16 33 63 29 82 61 c 43 -12 67 -64 92 -102 c -26 10 -44 40 -74 23 c -25 8 -63 20 -86 -4 c 1 -5 l -21 4 -26 10 -43 -1 c -2 -12 13 -19 -1 -28 c }def /3{ -14 1 -23 12 -28 23 c -17 -34 -107 -10 -72 -63 c 35 28 95 -55 108 20 c 28 22 36 -22 56 -24 c 36 -33 -77 -71 8 -85 c 15 -17 -15 -25 -8 -39 c 19 -11 43 -12 52 13 c 29 -6 62 -8 81 -33 c -20 -17 -35 -18 -59 -18 c -15 10 -36 -12 -33 -29 c -2 -7 7 -9 10 -12 c 28 -15 52 44 59 -1 c -9 2 -9 -7 -14 -11 c 25 -26 41 -52 77 -61 c -15 -25 0 -35 8 -56 c 34 47 38 -32 79 -9 c 8 -6 21 -12 35 -14 c 15 -31 -51 -41 -14 -64 c -22 9 -62 -15 -86 1 c -6 -8 -16 -18 -9 -29 c 10 -18 43 -9 35 -38 c -4 -8 -12 -12 -7 -20 c 29 -9 48 -43 80 -50 c -12 -23 23 -29 34 -43 c 13 7 11 -7 18 -13 c -10 -14 -41 6 -39 -25 c 8 -6 22 -19 28 -4 c 5 4 l 13 -8 36 -20 25 -39 c 11 -29 -24 -23 -38 -33 c -14 0 -29 11 -36 -11 c 12 -12 21 -26 21 -45 c -11 -9 -38 -9 -23 -31 c 43 -56 82 54 117 -17 c 13 7 21 -4 31 -9 c 3 -6 -4 -11 -8 -17 c -15 -2 -37 17 -46 -7 c 13 -17 -23 -50 15 -44 c 16 9 -1 40 30 32 c 13 -3 11 -16 13 -26 c -8 -6 -19 -12 -24 -24 c 24 -10 65 3 71 -32 c -12 -14 -32 -17 -48 -26 c -43 11 16 44 -27 55 c -10 -12 -58 -5 -47 -42 c -32 -26 -59 57 -77 4 c 6 -16 18 -30 33 -38 c 17 1 29 11 47 11 c 17 -9 14 -58 43 -31 c 16 11 38 32 56 19 c -8 -13 -22 -24 -13 -42 c 18 -15 51 -53 69 -12 c 11 5 17 -8 26 -12 c -9 -32 39 -37 10 -66 c -11 -7 -42 -17 -58 -4 c -7 1 -8 -6 -12 -12 c 30 -25 -27 -106 43 -99 c 21 0 47 -27 64 1 c 2 -34 43 -21 63 -39 c 0 -12 -12 -21 -19 -32 c }def /4{ -39 -18 -87 92 -97 1 c -9 11 -26 -8 -34 9 c 3 14 -14 24 -23 26 c -9 2 -13 -7 -17 -13 c 35 -24 -16 -56 17 -79 c 28 9 51 18 80 7 c -13 -16 -8 -39 -2 -54 c 27 -10 -1 -28 -2 -43 c -7 2 -9 -7 -14 -11 c 15 1 23 -24 42 -13 c 4 6 8 13 17 11 c 4 -24 l -7 2 -9 -7 -14 -11 c 3 -10 0 -22 9 -28 c -27 -18 -72 -25 -103 -16 c -12 -3 -28 3 -31 -13 c -6 -18 14 -22 24 -31 c 24 -1 44 -5 65 15 c -1 -14 7 -25 19 -32 c 39 35 51 -41 94 -13 c 14 -36 0 -78 -22 -105 c 53 3 20 -54 31 -82 c -7 -25 l -17 30 -32 -5 -50 13 c -8 -25 -41 -15 -58 -30 c -17 9 -33 21 -54 13 c -4 -9 -18 -15 -12 -26 c 29 1 16 -34 36 -43 c 21 -12 57 23 69 -14 c -33 -19 3 -41 -25 -61 c 21 -16 33 -33 34 -62 c 29 -1 l 5 -32 -22 -59 -55 -46 c -42 26 l -15 -18 -17 -46 -47 -40 c -18 -15 -38 -42 -19 -65 c 2 -15 l 22 -9 56 19 46 -21 c 13 -3 20 13 21 22 c 25 4 46 -7 65 -19 c -24 -33 -72 -13 -97 -53 c 31 -23 61 21 92 -2 c 19 -33 -48 -57 -6 -87 c -2 -12 -16 -18 -32 -19 c -18 15 -37 18 -53 40 c -9 2 -13 -7 -17 -13 c 8 -7 10 -21 18 -30 c -22 -2 -22 -22 -18 -41 c 22 -45 41 15 68 -5 c 8 3 17 3 25 -5 c 12 -19 -13 -30 -9 -45 c -11 14 -33 16 -53 11 c -1 -38 -78 -34 -36 -78 c 42 22 15 -39 57 -24 c 9 -23 22 -67 -14 -69 c -28 -23 -34 40 -54 0 c 8 -32 -12 -54 -26 -80 c 10 -19 30 5 40 -13 c -4 -8 -12 -9 -16 -18 c 22 -19 53 -28 42 -61 c }def /5{ -4 -16 18 -16 15 -31 c -16 -8 -42 6 -50 -21 c 7 -14 l -12 -2 -19 -8 -25 -18 c 12 -24 44 -2 61 -25 c 40 -46 -50 -89 7 -113 c 18 15 43 3 63 4 c 2 -10 l -13 8 -29 -1 -38 -9 c -4 -8 -12 -14 -10 -22 c 28 -11 22 -29 26 -48 c -13 -49 -41 -79 -69 -111 c -13 15 -5 46 -32 52 c -26 1 -40 -30 -44 -50 c 12 -33 27 -74 -16 -89 c -27 -2 -31 -25 -58 -28 c -5 -32 22 -64 45 -79 c -20 -15 -56 -28 -53 -62 c -19 -20 6 -37 8 -56 c 6 -6 15 -10 13 -17 c -24 -24 -49 41 -73 3 c -1 -14 -1 -42 -10 -59 c 23 -17 32 -26 45 -47 c -11 -16 -26 1 -39 4 c -1 8 14 21 1 28 c -9 2 -16 11 -25 7 c -7 -8 -21 -22 -6 -30 c -23 -40 -89 -86 -55 -138 c -24 1 -46 -28 -56 -52 c 2 -12 12 -19 10 -31 c -23 -5 -40 -34 -43 -55 c 4 -5 l 12 0 -41 -1 -39 -30 c 2 -26 -21 -43 -27 -72 c -22 7 -15 -18 -20 -27 c 8 -6 8 -18 9 -26 c -28 -34 l 14 -15 -7 -30 -3 -49 c -38 -35 -110 9 -119 -67 c 34 -41 -48 -26 -14 -64 c 12 -22 38 -3 47 -26 c -6 -16 -27 -15 -28 -34 c -21 12 22 62 -26 44 c -11 -7 -8 -24 -1 -29 c -41 -49 l -12 2 -18 27 -35 14 c -29 -25 -1 -47 -18 -74 c 6 -8 15 -10 25 -7 c 2 -10 l -60 -13 l 10 -42 -58 -40 -51 -86 c -29 -13 -80 -9 -97 -53 c -12 9 -24 -4 -31 -10 c -16 -11 -13 -30 1 -38 c -30 -6 -72 -2 -69 -43 c -25 -6 -19 -31 -22 -48 c -22 9 -44 -5 -59 -18 c -25 -18 -2 -35 -11 -55 c 21 -11 l -13 -14 -47 -21 -52 -46 c }def /6{ 2 -10 17 -10 14 -22 c -9 -12 -22 -24 -36 -11 c -17 11 -26 -9 -38 -14 c -43 -3 l -1 8 -10 12 -16 17 c -24 -23 -39 -30 -70 -38 c -12 -21 37 -38 3 -53 c -39 -8 -47 -42 -90 -43 c -14 -12 -32 -19 -42 -39 c -39 -28 -85 -29 -126 -43 c -13 -16 -11 -31 6 -42 c 8 -7 22 0 33 0 c -4 -9 -17 -25 -25 -28 c 7 10 -16 29 -24 12 c 0 -55 -113 -41 -74 -113 c -8 -17 5 -44 -16 -54 c -53 28 -72 -39 -119 -37 c -30 -39 -30 -86 -87 -96 c -20 -26 l 22 2 -2 -21 15 -27 c 30 -2 33 41 66 34 c 3 -6 -5 -13 -1 -19 c 14 -15 32 -24 56 -31 c 30 30 l -1 -21 l 8 1 17 -2 20 6 c 4 8 -7 12 3 18 c 35 26 82 18 113 47 c 20 28 58 15 78 38 c 25 -6 37 23 60 27 c -56 -64 -119 -50 -164 -118 c -45 -18 -60 -95 -126 -75 c 6 -18 -54 -3 -66 -13 c -5 32 l 11 16 4 20 19 32 c -6 8 -16 1 -24 1 c -31 -48 -106 -9 -125 -62 c -23 -31 -66 4 -80 -42 c -8 16 -36 20 -55 21 c -10 -15 -21 -24 -35 -30 c -28 23 -47 0 -74 -11 c -8 -27 -42 -20 -59 -19 c -22 40 -50 -1 -77 -7 c -32 -26 -84 10 -100 -34 c -49 -16 -93 43 -143 -3 c -30 13 -60 -4 -84 -18 c -17 -11 -30 -32 -27 -52 c -33 0 l 11 16 33 24 37 44 c -17 34 -59 3 -82 27 c -11 -17 l -6 4 -12 12 -20 7 c -3 -14 -10 -34 2 -48 c 14 -3 14 -25 32 -19 c -43 -33 -75 51 -122 6 c -18 -17 -59 -18 -43 -55 c 20 -6 l -23 -19 -75 -27 -108 -17 c 6 15 l -31 21 -62 1 -95 -1 c }def /7{ 30 20 72 23 107 22 c 17 35 63 3 64 53 c -29 -1 -55 -15 -84 6 c -3 19 l 21 12 52 -9 70 16 c -36 7 -62 11 -91 -4 c 12 -10 -16 -40 17 -41 c -3 -4 -4 -7 -9 -7 c -29 41 -70 -19 -107 -22 c -19 11 -42 28 -64 9 c -12 12 -3 29 -16 46 c -32 5 -62 35 -92 5 c -11 -5 -14 -21 -10 -34 c -8 4 -19 2 -28 1 c -42 -31 25 -70 -47 -75 c -8 -5 -1 -14 -1 -19 c -40 -18 -78 -19 -117 -28 c -3 10 -16 13 -22 21 c -53 -24 -112 23 -174 6 c -8 7 -17 9 -25 7 c B 243 -8121 n -20 -27 l -6 4 l 25 37 -27 5 -36 22 c -11 -33 -43 -45 -69 -57 c -57 12 -103 5 -154 -23 c -18 18 -51 6 -59 34 c -22 -14 -22 -50 -53 -27 c 7 56 142 6 81 88 c -31 9 -68 2 -97 14 c -14 -21 -32 -26 -56 -19 c -11 14 -24 8 -35 14 c -18 -10 0 -22 0 -33 c -33 -19 -41 18 -75 -6 c -20 -3 -40 -10 -58 -5 c -12 22 26 9 14 32 c -23 24 -60 20 -84 22 c -20 -27 -46 10 -70 17 c -2 5 2 7 4 11 c -21 -22 -94 25 -69 -26 c -15 6 -56 -29 -59 15 c -21 33 -68 17 -85 49 c -18 -8 -33 -31 -53 -27 c -23 -28 -66 -22 -94 -42 c 4 39 58 73 7 112 c -28 27 -51 -39 -85 -10 c -9 -10 l 6 -4 l -10 -2 l -2 10 l -30 2 -63 -18 -88 11 c 17 13 38 21 47 40 c -21 16 l 6 4 1 14 1 19 c -10 9 l -4 -21 -27 -35 -44 -31 c -32 7 -72 27 -100 -1 c -27 6 -15 41 -41 42 c -38 3 -86 -34 -117 6 c }def /8{ 17 23 -20 30 -29 44 c -57 22 -85 -65 -137 -16 c 4 20 29 36 45 54 c 16 6 39 -17 51 8 c 3 13 -11 14 -17 22 c 6 6 16 11 16 21 c -21 12 -57 0 -62 30 c -12 21 -39 4 -49 6 c -2 -33 -16 -63 -20 -95 c 8 -7 21 -11 22 -21 c -49 -28 -83 46 -120 63 c 11 7 8 24 1 29 c 29 15 40 63 76 31 c 17 -11 l 11 40 67 12 79 50 c -43 -1 l -14 48 -65 51 -102 71 c -41 -12 l 21 -16 l -32 -15 -53 30 -73 37 c -18 6 -11 -16 -25 -18 c -32 4 -70 -7 -87 -29 c -26 0 -10 21 -15 32 c 8 5 2 12 2 19 c 16 -13 45 -3 62 4 c 18 18 -10 33 -16 51 c -22 10 -51 37 -19 54 c -9 14 -27 6 -35 0 c -5 -25 -8 -48 -33 -64 c 7 -46 l -24 -11 -26 25 -53 11 c -49 17 -22 66 -44 94 c -33 -2 -70 -40 -99 -5 c 15 23 -18 40 -36 41 c -26 0 -34 29 -58 40 c 44 31 100 14 147 9 c 7 -9 12 -21 23 -26 c 53 27 l -15 29 -30 -8 -50 8 c -8 32 -16 68 -55 78 c -8 -1 -17 -4 -20 -13 c 5 -8 20 -9 17 -22 c -34 -2 -40 44 -75 51 c -30 6 -70 5 -87 35 c -28 15 -52 -23 -78 -1 c 4 20 33 33 26 56 c -19 23 -51 27 -80 17 c -25 26 34 57 -11 74 c -17 -3 -37 -18 -37 -39 c -35 5 -59 36 -98 42 c -8 -13 18 -37 -13 -40 c -17 8 6 27 -14 36 c 7 11 30 5 29 23 c 2 12 -8 21 -17 22 c -28 -1 -41 -34 -70 -19 c 8 58 -70 83 -92 124 c 14 2 40 -4 57 9 c 27 -5 55 -18 76 -32 c 3 4 6 6 4 11 c -22 7 -8 20 -14 36 c }def /9{ -23 36 -82 19 -88 68 c -15 20 -35 24 -56 26 c -10 -5 -15 -14 -21 -22 c 15 -22 1 -43 23 -59 c -9 -12 l -4 5 l -8 -25 -59 0 -61 -39 c 26 0 19 -37 48 -31 c -17 -16 11 -47 -16 -56 c 41 -18 41 -68 89 -87 c -5 -11 0 -26 -14 -35 c -26 12 -58 15 -76 35 c -9 -10 l -6 4 l 13 14 29 36 11 53 c -21 12 -25 41 -28 58 c -15 18 -42 14 -59 10 c -14 -2 -11 -17 -15 -25 c 0 21 -27 20 -30 39 c 12 10 60 6 38 33 c -20 30 -35 62 -62 87 c -21 -21 24 -33 9 -57 c 8 -6 25 -15 14 -25 c -15 -2 l 0 9 -6 18 1 24 c -40 27 -32 71 -59 105 c 17 34 -35 24 -37 53 c -24 34 -46 72 -68 109 c 9 -2 11 7 17 13 c -10 23 -18 49 -40 66 c 4 39 -6 73 -18 116 c -36 8 -18 47 -47 60 c 1 24 -19 33 -36 46 c -14 -2 -18 -39 -36 -14 c 1 29 l 12 -2 31 -23 38 1 c -20 18 -12 55 -47 60 c -26 -20 -28 23 -48 31 c -17 46 -2 67 13 107 c -30 18 -72 32 -66 81 c -17 11 -16 39 -14 55 c 4 6 l -53 9 18 51 -16 70 c -3 12 3 28 -13 31 c -9 0 -14 -12 -20 -3 c 17 22 43 38 54 62 c 7 58 -77 52 -57 111 c -25 15 -20 49 -47 60 c -49 -9 -90 -22 -120 -62 c -17 8 -15 32 -12 46 c 4 6 l -21 11 l 21 57 74 146 139 185 c 24 23 14 45 5 72 c -11 2 -19 9 -27 17 c 26 42 l -10 18 -29 -3 -39 8 c -6 16 -11 28 -2 48 c -18 13 -57 -23 -56 16 c 15 16 71 -3 47 40 c }def /10{ -6 4 l 2 9 13 5 18 8 c 29 -34 l 31 36 -29 78 16 111 c -27 51 -16 93 -35 140 c -9 4 -12 12 -14 22 c 30 55 -22 112 -44 161 c 20 26 66 20 69 59 c -14 -2 -41 -5 -50 -22 c -9 23 5 72 -42 59 c -28 -8 l -5 35 32 64 -9 90 c 3 38 -43 52 -19 92 c -22 21 l -14 55 -5 115 -39 162 c 11 17 l -22 10 -25 39 -23 59 c 12 48 -33 93 -7 137 c -18 2 -31 32 -52 21 c -2 -9 -10 -15 -5 -25 c -13 -16 -28 1 -41 9 c 19 13 -9 59 27 47 c 25 -51 43 33 77 -4 c 16 -1 23 10 32 15 c -10 54 -85 -8 -94 48 c -36 7 0 35 -23 48 c -13 38 -96 18 -62 68 c 10 2 22 5 30 -6 c 15 37 52 63 49 109 c -24 -26 -57 12 -87 6 c -11 17 l 19 -2 47 35 72 6 c 5 13 21 24 13 40 c -6 20 -53 7 -24 31 c 17 13 22 -17 39 -4 c 16 30 29 48 40 79 c -39 39 34 92 -32 116 c -6 15 1 26 14 30 c 14 -3 12 12 16 18 c -6 8 -24 10 -23 24 c 4 6 l -17 32 -92 -7 -64 47 c 32 15 58 -17 86 -1 c 9 -14 14 -1 24 4 c 15 16 -1 38 0 57 c -33 11 -86 1 -94 50 c -51 3 -67 62 -111 73 c 0 24 l 28 6 66 -14 84 18 c 18 -2 27 -20 34 -33 c -4 -6 l 6 -3 10 -11 17 -8 c 3 6 l 25 -15 -26 -33 7 -47 c 26 13 55 22 65 50 c 0 21 7 56 -19 68 c -23 -5 -40 4 -60 11 c 5 44 4 75 6 120 c 3 16 27 27 17 46 c -38 -1 -8 39 -27 49 c }def /11{ 10 2 22 24 32 5 c -8 -24 29 -32 32 -54 c 14 12 49 6 38 35 c -38 11 -15 55 -20 73 c 26 -37 45 22 56 38 c -2 38 19 70 16 108 c 4 51 82 -6 46 50 c -35 -5 -66 24 -92 34 c -3 31 68 43 39 84 c 48 2 l 14 -25 -18 -18 -23 -33 c 14 -13 35 -24 59 -15 c 9 8 8 17 10 26 c 10 2 l -1 -5 3 -6 6 -8 c 8 1 11 10 17 16 c 4 21 -23 2 -22 21 c 55 27 -1 110 67 129 c -18 15 -46 19 -67 30 c -1 26 15 59 41 72 c 31 12 56 -41 60 14 c 47 -1 43 67 88 57 c 7 11 -1 26 3 38 c -35 2 -21 49 -29 63 c 4 11 5 23 14 32 c 9 -4 21 -2 29 -1 c -2 -23 -21 -41 -8 -69 c 39 3 -1 -42 35 -38 c 11 40 72 27 59 76 c -39 30 16 51 23 76 c 46 -8 50 77 99 44 c 20 19 -7 34 -13 50 c -30 14 -12 31 -8 52 c 28 18 41 -40 58 4 c 31 46 -22 112 63 120 c 14 23 -27 39 -26 69 c -30 4 -25 15 -29 42 c 7 13 27 4 36 16 c 7 13 -3 29 13 40 c 22 -5 38 25 56 3 c 49 44 129 35 185 20 c 23 28 11 66 38 92 c -3 6 -7 13 -7 23 c 13 16 26 42 46 36 c 5 1 l 24 -24 -14 -54 11 -71 c 21 20 30 -28 52 -2 c 13 18 l -17 11 l 38 37 96 63 122 119 c 17 15 45 14 64 25 c 24 16 -1 53 35 52 c 3 37 -11 62 20 86 c 34 -22 56 50 77 1 c 1 -19 -20 -17 -32 -14 c -15 -26 -50 -32 -52 -67 c 15 -18 35 -15 55 -11 c 18 8 0 35 24 33 c 12 -12 26 -20 45 -12 c 8 29 22 57 44 83 c }def /12{ 23 7 60 -20 69 21 c -9 35 25 42 41 69 c -16 3 -31 23 -14 36 c 17 35 64 25 88 48 c 7 -2 7 -9 7 -14 c -39 -13 -54 -53 -74 -82 c 20 -18 -11 -31 -17 -46 c 13 -15 34 -21 50 -8 c 22 3 5 46 34 29 c 49 -6 30 94 82 61 c 32 62 134 -18 122 81 c 9 8 23 9 29 23 c 17 -11 l 44 19 85 44 121 76 c 9 -5 8 -18 9 -28 c -26 -42 -109 -36 -95 -101 c 23 -15 64 -68 85 -15 c 26 9 l 11 17 -8 30 -12 45 c 31 36 103 47 95 101 c 29 23 0 78 52 80 c -21 11 -49 27 -70 38 c 10 14 10 34 28 42 c 20 -16 36 4 49 18 c 31 38 30 87 68 121 c 11 -24 25 -6 42 -14 c -4 -20 -46 -26 -26 -56 c 15 -8 35 -15 49 -3 c 9 17 22 22 23 43 c 7 11 21 1 29 -6 c -20 -13 l 12 -10 20 -28 38 -32 c 19 1 33 9 45 22 c 0 14 -7 23 -20 30 c -3 -1 -12 0 -13 -7 c -2 3 -6 4 -7 9 c 19 12 63 8 60 47 c 5 9 18 6 28 9 c 4 -15 18 -47 36 -24 c 25 26 -7 80 46 85 c 10 -12 24 -12 36 -19 c 9 10 l -24 8 -27 39 -59 34 c 8 18 -23 17 -10 33 c 15 2 l 9 -4 0 -14 -2 -19 c 23 -35 44 26 69 -8 c 28 11 43 38 52 65 c -42 26 -87 -32 -129 -1 c -38 -14 -84 -15 -115 -42 c 11 -14 28 -4 32 -19 c -4 -11 -24 0 -22 -17 c -36 -2 -81 -14 -103 -50 c -4 -20 23 -5 19 -25 c -46 -12 -91 43 -129 -6 c -40 -1 l 22 15 0 48 32 53 c 25 -8 51 30 67 0 c 19 -2 32 -5 45 12 c -10 7 -8 26 6 30 c }def /13{ 21 1 3 -29 24 -31 c 15 13 33 33 35 54 c -11 7 l -3 -4 l -6 18 -26 10 -35 3 c -41 -15 -103 8 -122 -46 c -13 -7 -22 0 -33 4 c -22 -17 -9 -65 -52 -46 c -5 35 -43 11 -58 40 c -17 1 -26 -13 -34 -24 c -38 -13 -83 20 -108 -17 c -55 7 -68 -50 -123 -40 c -7 -22 -21 -46 -35 -62 c -21 11 l -29 -36 -37 -85 -24 -128 c 4 -25 -11 -52 -22 -71 c -10 -22 -22 -62 -58 -61 c -15 10 -34 29 -50 11 c -18 -15 17 -65 -30 -53 c -10 7 -7 25 -11 36 c -2 22 47 33 16 51 c 22 14 4 42 27 52 c 3 -22 30 -27 45 -12 c 3 4 5 13 12 10 c 5 -8 15 -31 26 -15 c 58 16 -10 68 18 94 c -17 11 -31 25 -16 46 c 24 23 l -12 31 -43 33 -70 19 c -11 -10 -21 -24 -40 -22 c -2 3 -6 4 -5 10 c 11 33 43 3 51 41 c 14 -3 20 -7 33 0 c 39 16 83 33 120 42 c 60 23 130 32 181 67 c 23 -12 48 11 74 15 c 37 26 90 10 107 56 c -14 36 -56 -26 -46 21 c 26 -10 l 29 46 80 10 124 38 c 55 12 109 46 169 60 c 32 29 67 34 118 41 c 35 21 93 2 115 42 c 25 -26 28 22 55 14 c 11 9 8 18 6 30 c 28 -11 58 -15 89 -16 c 18 65 84 35 135 55 c 70 49 163 8 233 44 c 29 -21 43 34 74 22 c 10 34 33 59 65 72 c -4 -39 36 -19 54 -35 c 30 -4 69 2 87 32 c -11 7 -7 26 4 30 c 11 -7 29 1 39 -10 c -11 -7 -27 -13 -28 -29 c -2 -35 32 -14 50 -11 c 43 26 73 132 133 69 c B -1995 7014 n -44 -7 -69 -47 -106 -65 c }def /14{ -10 0 -27 -7 -20 -19 c 37 -18 81 0 112 14 c 28 11 34 38 25 61 c -12 9 l C -890 -462 m 21 -36 l 32 29 60 -34 91 -10 c 5 47 -62 -4 -54 50 c -11 -5 -11 -31 -31 -24 c -14 -7 -21 11 -27 20 c C 3151 1532 m -4 -18 -38 -2 -28 -29 c 24 4 63 -25 73 16 c -8 19 -28 16 -45 12 c C -638 -346 m -1 -29 l -16 -42 -55 -46 -91 -57 c -1 -24 17 -35 27 -53 c -9 -10 -14 -25 -25 -28 c -46 7 -76 -36 -117 -47 c -21 16 -46 29 -61 48 c -11 -16 -26 3 -39 4 c -14 -19 -31 -20 -42 -44 c -25 -14 -63 -30 -88 -24 c 16 -58 78 12 108 -16 c 4 -27 -14 -56 -36 -68 c -12 -2 -23 -7 -30 4 c -13 -4 -31 -1 -41 -11 c -26 -9 -106 3 -84 -51 c 29 4 l 30 -49 47 30 76 3 c 30 29 l 32 3 59 -33 90 -21 c 40 -23 39 39 67 59 c 15 6 21 -11 32 -14 c 31 15 78 -11 102 24 c 183 33 l 23 -17 47 11 65 -19 c 9 -59 -62 -13 -87 -32 c -28 23 -44 -17 -70 -16 c -25 26 -37 -16 -48 -26 c -1 -14 7 -23 18 -30 c 0 -10 7 -21 -1 -29 c -32 -7 -80 -50 -122 -19 c -50 11 -93 -16 -137 17 c -40 -8 -78 -19 -96 -61 c -47 0 -74 46 -103 74 c -17 1 -34 -28 -52 -8 c -6 -42 -40 -22 -71 -33 c -25 -52 -88 2 -102 -59 c -44 -3 -106 -20 -147 -47 c -42 -6 -78 -33 -114 -36 c -27 -40 -81 -35 -104 -80 c -27 8 -36 -26 -60 -13 c -15 -49 -62 -22 -92 -30 c 49 -48 -49 -51 -25 -85 c 8 6 16 8 22 17 c }def /15{ 15 4 29 4 39 -8 c 16 -58 -62 -11 -85 -46 c -14 -23 -31 11 -26 15 c -40 -46 -99 -39 -119 -105 c 13 -52 l -4 -9 -12 -12 -22 -12 c -17 -11 -22 9 -27 18 c -5 -15 1 -31 -12 -45 c -8 6 -18 -8 -26 -13 c 4 -13 -20 -31 6 -37 c 34 3 65 26 107 20 c 31 48 l 13 -8 31 -11 49 -6 c 2 7 10 12 6 20 c -9 0 -17 11 -26 15 c -3 22 -30 35 -22 55 c 42 -6 69 55 101 29 c -17 -16 l 24 -41 -51 -39 -12 -80 c 27 13 52 30 73 54 c 11 -7 l 46 28 92 11 140 25 c 44 -17 51 51 89 53 c 24 12 41 6 65 19 c 28 -25 41 25 72 6 c 24 49 79 16 105 59 c 18 10 23 -5 37 -13 c 29 -8 20 26 38 35 c 22 -19 40 10 67 5 c 40 44 110 25 170 50 c 23 50 84 -18 93 49 c 43 10 106 32 150 61 c 29 48 83 23 127 19 c 82 28 161 -3 246 19 c 28 46 79 -7 108 20 c 22 0 62 22 86 -1 c 22 35 47 -14 77 3 c 34 -17 66 -38 105 -32 c 49 -37 117 -29 169 -66 c 19 8 37 -3 46 -17 c 19 -13 29 13 46 17 c 36 -31 88 -33 137 -27 c 13 7 19 24 37 19 c 9 -4 23 -2 26 -15 c -2 -9 -13 -5 -19 -8 c -12 -3 -32 -17 -14 -30 c 39 4 76 31 120 37 c 57 -67 -75 -18 -72 -73 c 33 -16 58 5 92 -2 c 26 -20 78 -35 76 -59 c 15 2 29 23 43 1 c 10 -109 83 46 134 -28 c 20 26 34 -17 59 -1 c 4 9 15 18 15 26 c -45 10 -5 55 -49 60 c -1 5 -2 12 3 16 c 38 -22 63 17 92 33 c 6 -6 14 -10 11 -17 c 14 -12 30 5 32 19 c 50 15 79 -19 112 -45 c }def /16{ 24 12 52 -9 76 -23 c 8 -21 -25 -16 -20 -31 c 5 -23 -17 -49 -4 -78 c 44 -4 13 -60 57 -54 c 4 -60 64 -13 90 -48 c 22 -17 32 26 51 3 c 12 -31 39 -10 59 -10 c 5 9 14 12 22 14 c 25 -7 0 -24 11 -38 c 43 3 l 39 -42 70 26 108 -18 c 6 -41 -30 -6 -49 -18 c -25 -14 -40 -41 -29 -67 c -27 8 -60 -13 -87 2 c 3 -39 l -30 -5 -44 30 -65 44 c -29 -22 -97 2 -104 -45 c 14 -38 44 -4 65 -9 c 12 -2 25 -14 23 -29 c 25 -15 43 0 67 0 c 1 -15 9 -33 2 -48 c 6 -18 24 0 31 10 c 9 12 7 24 -5 34 c 38 37 54 -26 87 -35 c 39 25 -20 64 20 95 c 60 -29 123 -12 183 4 c -26 25 -50 -9 -75 16 c -6 18 0 33 1 49 c 1 52 -58 41 -57 93 c -56 26 -46 83 -89 119 c -24 12 -66 38 -64 68 c -7 33 -49 24 -69 14 c -12 19 -30 4 -45 12 c 82 144 -142 149 -191 244 c -70 50 -155 54 -218 117 c -41 -1 -58 17 -95 43 c -47 14 -106 13 -139 60 c -58 -16 -64 80 -127 48 c -68 7 -125 60 -193 67 c -18 51 -76 25 -113 16 c -18 18 -44 30 -72 27 c -51 41 -102 10 -155 44 c -43 -3 -78 23 -121 11 c -14 15 -32 18 -50 11 c -30 16 -71 -7 -96 29 c -17 -4 -38 -2 -50 -13 c 2 -14 l 16 -24 29 15 50 13 c -1 -38 39 -10 52 -21 c -3 -45 61 -29 93 -43 c 4 6 l 20 3 26 -20 37 -29 c 17 16 l 48 68 69 -36 111 -35 c 38 -25 24 38 60 28 c 52 -9 -9 -43 -5 -68 c 9 -11 20 -7 30 -4 c 11 -7 20 -18 19 -32 c -4 -6 -8 -15 -17 -13 c -26 15 -56 -3 -82 8 c }def /17{ -7 13 11 17 9 29 c -23 62 -80 15 -117 44 c -51 -75 -87 40 -143 32 c -48 32 -83 -23 -120 -42 c -18 8 -50 13 -53 40 c -32 7 -43 -34 -59 -52 c -16 6 -42 -5 -51 16 c 4 6 8 15 17 16 c -22 -2 -49 -9 -69 -24 c -44 17 -62 -58 -101 -31 c -5 8 3 14 7 22 c -6 3 l 3 14 1 28 8 41 c 22 3 33 22 55 27 c 21 0 20 -28 30 -35 c -1 8 -8 19 0 24 c 37 18 79 -7 114 9 c -1 43 l 13 64 53 -11 82 26 c -3 12 -11 24 -23 26 c -51 -27 -110 7 -170 -17 c -26 13 -39 10 -68 5 c C 1210 -31 m -8 -17 l 41 -99 154 -44 214 -111 c 28 6 49 -17 72 -32 c -6 -15 -1 -50 25 -39 c 21 33 51 16 73 -3 c 16 -56 86 -20 109 -61 c 53 13 65 -31 100 -57 c 47 30 102 -2 157 10 c -12 -36 -74 -13 -70 -54 c 6 -8 16 -1 24 -1 c 34 -7 22 -45 42 -61 c 30 -13 46 -41 87 -30 c 10 2 20 26 32 5 c -10 -12 -17 -27 -18 -41 c -41 -56 60 -39 44 -99 c 55 27 69 -55 117 -74 c 10 -30 51 -30 78 -36 c 5 -13 -11 -21 -14 -30 c 4 -5 l 30 18 35 -17 45 -31 c 5 4 l 10 2 21 7 28 -4 c 52 11 29 -42 67 -52 c -31 -46 33 -47 35 -81 c 28 -23 -14 -30 -21 -43 c 15 -22 50 -1 71 -22 c -11 -43 28 -61 57 -88 c 74 25 45 -81 117 -74 c 11 -17 57 14 41 -21 c 11 -7 20 -16 19 -32 c 26 -36 63 -65 104 -84 c 42 -4 46 38 73 65 c -19 42 -68 17 -96 51 c 4 6 l -11 17 -33 2 -49 3 c -9 2 -26 10 -23 24 c }def /18{ 20 3 72 16 95 11 c -21 16 l -1 5 -6 15 2 19 c 7 22 -4 48 -30 58 c 17 35 -26 60 -28 96 c -14 20 -41 30 -58 40 c -47 24 -7 92 -60 112 c -15 17 16 21 3 38 c -20 19 -49 17 -75 18 c -26 36 45 43 47 75 c -7 2 -10 18 -21 11 c -45 -57 -77 18 -124 19 c -36 43 -101 81 -79 147 c -8 7 -17 8 -25 5 c -30 47 -93 53 -109 115 c -18 -6 -48 -6 -68 3 c -9 23 31 22 17 46 c -50 10 -54 68 -91 97 c -66 14 -136 29 -204 12 c -27 29 -53 42 -89 49 c 9 52 -60 29 -82 63 c -39 9 -26 -25 -36 -44 c -18 13 l -17 -4 -31 -13 -42 -27 c 4 -5 13 -8 11 -17 c -45 -10 -60 62 -104 57 c -11 4 -12 14 -19 21 c -37 -4 -71 -35 -119 -32 c -20 9 -29 30 -21 49 c -16 36 -49 15 -79 7 c -31 42 -81 31 -120 40 c C 1238 -1227 m -1 -38 53 -63 40 -104 c 58 -20 59 -84 99 -120 c 6 -30 35 -69 -6 -87 c 27 -20 l 56 41 68 -36 120 -30 c -6 -27 -27 5 -36 -14 c -10 -26 -11 -53 16 -70 c 22 -29 56 -19 70 -51 c 17 16 l -12 9 l 20 13 7 36 22 50 c -2 50 -52 59 -76 90 c -10 42 -45 69 -47 117 c -35 12 -34 52 -75 51 c -42 6 -32 49 -49 74 c -25 5 -49 25 -51 51 c -10 23 -40 35 -60 39 c C -522 -159 m 26 9 31 -26 55 -29 c 2 10 10 20 5 35 c -18 26 -53 26 -60 -6 c C 406 -147 m -1 -17 7 -35 20 -40 c -1 15 14 35 -2 48 c -9 2 -11 -9 -18 -8 c }def /19{ C -195 -69 m 2 -13 l 15 2 l -1 8 l -4 6 -11 3 -16 3 c C 656 -1702 m -51 -23 25 -39 24 -66 c 25 -33 -22 -57 -39 -77 c 39 -2 63 -33 100 -46 c 14 33 -3 50 -13 83 c 4 16 -3 42 22 46 c -35 10 -53 70 -94 60 c C 1436 -244 m -10 -2 -26 0 -33 -9 c 10 -7 24 0 35 0 c -1 8 l C -191 -1330 m 15 -8 -1 -19 -1 -29 c 32 -7 8 -61 48 -31 c -13 27 l 11 33 38 -25 45 12 c -15 6 l -5 22 -53 30 -64 14 c C -2885 -2712 m 4 -1 8 -4 6 -8 c 23 -17 32 17 50 27 c -30 25 -30 -20 -56 -19 c C -1035 6852 m -7 -33 -56 -20 -54 -59 c -33 14 -65 -30 -106 -16 c -17 -30 -72 -25 -77 -69 c 18 -21 52 -11 78 -20 c 33 25 107 8 138 48 c 11 5 28 18 39 3 c 28 28 -35 52 2 75 c -11 8 -2 22 0 34 c -7 2 -13 10 -19 5 c C 99 -8 m 12 -37 -38 -19 -51 -35 c 40 13 61 -45 106 -18 c 15 -6 15 -20 23 -29 c 24 7 3 34 6 52 c -25 10 -51 43 -84 29 c W 933 -261 n -25 -24 -101 8 -86 -59 c -13 -14 -33 -7 -46 1 c -38 -38 -77 14 -116 16 c -26 1 -20 -27 -36 -39 c 26 -15 l -9 -27 -33 3 -45 -17 c -5 -9 -5 -31 11 -36 c 48 29 109 -4 158 6 c }def /20{ -5 1 -6 9 -7 12 c 35 71 90 -5 137 -1 c 38 62 106 -26 144 41 c 15 16 34 0 44 -9 c 38 -40 38 36 75 30 c 42 -43 101 15 149 -20 c 3 -11 2 -35 17 -43 c -25 -4 -48 -29 -68 -21 c -72 -16 -129 38 -201 -2 c -21 -30 -51 -13 -69 -44 c 8 -7 16 -25 0 -32 c -3 -1 -10 -3 -14 3 c -22 36 -38 -18 -63 -20 c -8 -5 -17 2 -15 11 c -13 10 -33 27 -45 17 c 0 -32 l -14 1 -19 -10 -31 -10 c -34 12 -84 19 -113 -4 c -95 -1 -151 -67 -225 -104 c 51 21 96 23 142 54 c 9 -16 37 -21 31 -46 c 25 2 51 11 74 6 c 0 -14 -2 -31 -16 -36 c -83 -13 -157 -12 -222 -66 c -55 30 -92 -60 -141 2 c -22 -25 -26 -53 -43 -83 c -24 -10 -42 21 -63 1 c 2 -34 l 6 -6 15 -8 24 -5 c 32 -32 -19 -52 -27 -80 c -12 -12 -30 -3 -43 4 c -24 -29 -84 -16 -74 -67 c 32 -22 -15 -34 -15 -60 c -19 -8 -40 4 -55 -3 c -2 -22 -25 -24 -37 -38 c 4 -13 17 -11 26 -16 c -11 -19 -36 -11 -53 -17 c -9 -5 -16 -14 -11 -25 c 30 -9 43 -36 56 -57 c -8 -13 -31 0 -34 -19 c -5 3 l -38 8 -45 -26 -67 -48 c -23 15 l -19 -6 -43 -15 -51 -35 c -5 8 -17 21 -31 14 c 1 -59 -65 -73 -90 -122 c -23 -5 -52 -5 -72 -16 c -7 -11 -26 -7 -25 -22 c -4 -28 -34 -34 -54 -42 c 2 -25 -31 -8 -32 -32 c -12 -12 5 -21 13 -27 c -11 -27 -50 -16 -66 -24 c -10 -10 7 -26 -10 -35 c -65 26 -17 -65 -75 -62 c -13 -24 1 -37 6 -60 c -21 -18 -41 -64 -39 -87 c -4 -9 -2 -22 -15 -26 c -1 -14 13 -32 -4 -43 c -3 6 -9 4 -14 3 c -20 -13 5 -23 6 -36 c }def /21{ -10 -24 3 -61 -31 -71 c 41 -58 -52 -82 -15 -143 c -31 -20 -3 -55 -27 -75 c -18 -4 -31 5 -45 17 c -3 -5 l 49 -25 -2 -63 33 -93 c -3 -24 -23 3 -27 -14 c 31 5 61 -20 90 0 c 17 -19 19 11 36 11 c 8 -7 20 -12 22 -20 c 100 20 -22 69 30 116 c 5 -3 l 25 -6 65 -17 72 19 c 16 6 26 -16 42 -17 c 25 16 72 6 72 50 c 9 -4 17 -2 25 -11 c 37 -21 27 35 55 37 c 6 -9 24 -12 23 -25 c -4 -18 5 -43 -21 -51 c 18 -18 12 -37 41 -50 c 8 1 20 1 26 9 c 23 -7 43 -27 32 -53 c 31 -26 25 26 54 24 c 21 -19 -9 -44 4 -60 c -4 -4 -5 -13 -12 -12 c 0 -22 28 -14 25 -39 c -60 4 -84 -70 -137 -87 c -2 -29 29 -16 43 -36 c 4 -28 -13 -70 -43 -86 c 2 -10 5 -21 -6 -30 c 8 -7 10 -20 22 -20 c 2 -27 3 -67 -4 -99 c -19 -10 -17 -25 -26 -41 c 15 -43 -40 -50 -48 -84 c -32 12 -54 -42 -84 -13 c -19 -55 32 -109 16 -162 c 12 -12 26 -16 40 -18 c 10 -21 28 -36 9 -60 c -28 -8 -14 -43 -38 -58 c 11 -7 l 5 -13 -3 -23 0 -34 c 10 -24 28 -31 50 -48 c 7 -21 -17 -35 -24 -51 c -8 -27 26 -4 23 -29 c -14 -11 -21 -27 -38 -29 c 6 -16 -6 -26 11 -37 c 2 -47 36 -113 85 -133 c -13 -26 -46 -19 -64 -37 c 14 -15 -13 -38 20 -39 c -29 -43 20 -75 23 -115 c 5 -3 8 -11 14 -6 c -8 21 l 6 26 32 15 42 3 c 12 -32 4 -69 -7 -101 c -11 -5 -16 8 -25 11 c 3 -20 -17 -33 -10 -54 c 37 1 11 -59 47 -64 c 80 9 -29 -43 15 -67 c 12 -22 23 -29 39 -47 c -8 -15 -19 -20 -27 -33 c }def /22{ 21 -5 19 -33 34 -46 c 35 -18 26 -72 49 -101 c 0 -25 -32 -13 -44 -25 c -29 -23 27 -33 -1 -58 c 9 -16 25 2 35 -8 c 15 -45 55 -63 81 -101 c 9 -26 41 -24 45 -54 c 30 -7 9 -51 41 -55 c 28 -52 80 -81 126 -118 c 3 -30 44 -24 50 -53 c 38 -18 73 -65 109 -95 c 46 9 47 -50 80 -59 c 3 5 l 9 -4 19 -2 25 -11 c -7 -30 33 -5 44 -31 c 27 14 34 -20 50 -30 c 5 -69 92 -23 123 -66 c 6 -16 -18 -25 -13 -39 c 32 -7 39 -67 79 -30 c 10 -31 53 -22 47 -55 c -17 -11 -24 13 -36 15 c 1 -8 -6 -14 -10 -22 c -6 -19 20 -17 28 -28 c 15 -23 17 -35 28 -62 c 35 16 58 -23 86 -39 c -11 -49 49 -13 71 -31 c 6 -14 -3 -27 -13 -39 c -4 -9 -5 -31 11 -36 c 20 1 38 4 47 26 c 45 48 100 2 148 -6 c 23 -5 5 -23 7 -26 c 12 -12 21 -17 37 -18 c 3 -17 -15 -26 -9 -44 c 14 7 l 35 -22 72 -30 103 -66 c 16 -6 41 6 50 -16 c 10 -2 14 9 22 13 c 39 33 53 -17 80 -25 c 22 0 50 -4 55 -29 c 52 23 82 -37 128 -4 c 4 -23 l 23 -27 42 1 67 -8 c 16 18 2 31 3 46 c 23 -5 47 -8 69 -22 c 10 -65 89 -29 120 -76 c 54 13 l 30 -43 45 7 78 7 c 30 35 72 30 114 33 c 26 -35 52 3 82 -16 c 62 -4 118 -11 177 14 c 11 -7 14 -16 23 -25 c 3 5 27 21 37 1 c -12 -10 7 -12 8 -22 c 20 1 54 -10 66 25 c 23 -5 47 4 66 -19 c 23 7 43 18 59 38 c 30 1 54 35 81 21 c 25 -10 46 12 62 25 c 9 -16 23 -5 35 -5 c -4 23 l }def /23{ 7 57 56 2 74 6 c 19 42 72 25 95 57 c 74 3 90 76 124 122 c 13 17 34 -2 46 7 c 2 21 25 23 36 39 c 16 58 48 -23 85 -2 c 28 28 69 61 113 60 c 0 -3 l -47 -26 -62 -84 -75 -130 c 14 -1 20 10 32 10 c 13 36 69 38 74 72 c 14 17 27 33 51 32 c -3 18 l -15 18 -33 15 -52 11 c -9 5 -14 13 -13 22 c 26 6 20 35 29 52 c 17 1 29 -14 44 -12 c 29 13 53 22 57 56 c 17 11 24 -13 36 -15 c 9 30 l 22 10 42 44 41 72 c -24 -21 -65 -18 -77 -49 c -20 9 -37 21 -52 29 c 0 -10 -21 -29 1 -37 c -8 -5 -11 -15 -22 -13 c -6 9 -26 6 -27 25 c 31 17 -14 35 10 54 c 51 11 91 38 126 75 c 29 1 49 21 59 46 c 21 29 48 -40 59 14 c 32 -24 l 45 -5 69 48 101 73 c 10 35 61 35 65 71 c 13 5 23 -3 33 -5 c -21 59 37 90 55 135 c -3 33 23 61 14 97 c -13 5 -20 22 -36 13 c -10 0 -33 5 -27 25 c -37 -11 -41 33 -51 58 c -25 6 -42 -12 -67 3 c 9 10 l 13 14 36 17 50 4 c 15 -1 24 7 31 18 c -30 19 0 54 -34 69 c 15 23 l 17 -2 38 -4 46 -22 c 39 21 48 -35 87 -15 c 28 18 83 2 82 50 c 5 1 11 3 14 -1 c -3 -11 -1 -27 -14 -31 c -5 -19 22 -20 24 -34 c 22 0 57 -7 68 19 c -11 8 l -1 8 8 15 12 20 c 6 -4 13 -8 11 -17 c 3 2 4 6 9 6 c 1 26 -4 35 -1 61 c 61 42 8 104 53 149 c -13 -2 l -24 -29 -66 2 -91 -27 c }def /24{ -6 4 -8 11 -13 17 c 67 70 -56 56 -76 97 c -27 -11 -60 4 -87 19 c -7 14 15 21 5 35 c 15 33 60 7 76 25 c -1 49 10 90 27 131 c 54 12 23 103 90 85 c -16 30 -62 4 -72 41 c -15 21 -8 51 8 71 c -42 29 17 79 -17 111 c 9 6 12 24 25 23 c -8 21 21 32 5 53 c 9 20 26 43 51 45 c -12 0 -33 5 -27 25 c 36 9 69 14 103 38 c 18 28 -2 32 -23 49 c 3 27 -28 52 -12 78 c -39 53 12 124 -30 175 c 5 43 -3 96 -2 137 c -27 23 -7 56 1 85 c -4 13 -29 14 -24 34 c 80 22 -12 90 41 128 c -48 47 -40 95 -53 156 c -21 12 -24 35 -33 58 c -37 21 -23 76 -31 112 c -52 41 -40 143 -118 165 c -7 11 3 16 5 24 c 9 32 -31 48 -40 75 c -7 14 -20 51 13 48 c 20 -9 24 -34 26 -47 c 39 -13 29 -90 78 -54 c 37 45 -57 71 -8 116 c -11 14 -8 41 -30 43 c -18 19 -1 40 10 59 c 4 38 -28 52 -22 90 c -33 8 -47 -36 -75 -6 c 3 45 59 34 79 68 c 2 76 -85 50 -126 84 c -35 7 -39 57 -78 46 c -20 -15 -11 -37 -10 -59 c 0 -22 44 -47 6 -60 c -22 9 -25 28 -28 48 c -38 13 -19 60 -61 70 c -9 26 24 29 36 43 c 34 -2 76 15 108 3 c 21 -2 46 12 61 33 c -5 33 -43 37 -57 62 c -16 25 -67 19 -46 59 c -57 51 -97 126 -177 137 c -10 24 24 9 29 23 c -16 16 l -5 65 -71 67 -90 123 c -37 18 -49 52 -73 79 c -15 74 -105 91 -144 147 c 10 20 l -16 8 -28 26 -20 44 c 22 -12 51 11 71 24 c 15 -8 23 -20 29 -33 c 14 -5 38 -6 46 10 c -3 54 -29 77 -67 108 c }def /25{ -1 17 26 26 15 45 c -3 8 -13 20 -24 15 c -40 60 -133 81 -143 161 c -42 -12 -70 37 -116 16 c -27 31 -90 37 -81 96 c -29 46 -47 -26 -81 -23 c 3 -10 0 -24 10 -31 c 1 -18 -19 -18 -30 -15 c -16 -18 -18 -37 -26 -55 c 30 -43 80 -12 117 -24 c 11 -14 24 -12 39 -9 c 28 4 46 -27 36 -50 c -10 -22 -47 -5 -57 -27 c -2 -12 8 -21 17 -21 c -15 -78 80 -27 102 -83 c 27 35 31 -26 56 -25 c -9 -20 -9 -50 -25 -60 c -26 23 -64 -25 -95 4 c -13 -16 4 -48 -19 -55 c -18 4 -6 16 -9 27 c -73 43 -160 70 -227 135 c -23 -2 -46 -32 -65 -5 c -2 5 1 7 4 9 c 9 66 -64 65 -104 92 c -17 13 -28 -16 -43 4 c -43 -17 -70 45 -113 30 c -27 30 -74 31 -83 77 c -16 -16 -41 2 -59 -14 c -33 30 -79 18 -118 33 c -35 61 -90 3 -130 56 c -31 0 -23 -41 -49 -45 c -52 41 -38 -62 -100 -36 c -26 16 15 36 6 59 c -7 1 -9 -8 -13 -12 c -49 -35 -66 36 -96 51 c -8 50 -76 2 -90 57 c -30 -35 -82 -16 -123 -24 c -35 22 -82 -9 -115 20 c -10 0 -18 -3 -22 -12 c -31 14 -71 -9 -105 -2 c -16 8 -10 32 -32 32 c -16 -18 -62 4 -56 -32 c -40 6 -70 6 -108 -1 c -26 45 -37 -24 -66 -2 c -40 -15 -85 4 -121 -3 c -9 17 -32 31 -29 56 c -39 -2 -81 -21 -115 -9 c W 0 0 n f -363 1279 n 6 -8 -3 -23 -15 -26 c -14 -2 l -8 21 20 19 28 29 c C f 667 -3 n 9 -16 -10 -14 -16 -21 c -2 1 -6 4 -9 2 c -3 12 -2 15 6 20 c }def /26{ 7 1 14 7 19 -1 c C f 1557 122 n -17 -11 -43 -21 -65 -15 c 10 36 l 19 1 43 -7 55 -21 c C f 486 -199 n -38 -14 -78 35 -103 55 c 1 5 13 18 23 9 c 26 -22 51 -53 81 -64 c C f -3049 -438 n 0 -14 -24 -14 -34 -24 c -26 -7 -56 -17 -66 -43 c -11 -29 16 -36 10 -66 c 19 3 35 -14 24 -31 c -11 -21 -8 -50 -41 -49 c -17 11 -10 42 -34 43 c -6 -3 -14 -7 -23 -9 c -9 4 -6 15 -9 23 c 5 11 15 16 27 18 c 6 -3 l 5 13 12 26 13 40 c -27 20 -53 -37 -82 -4 c -44 -15 l 10 36 78 55 51 105 c 5 11 24 2 31 13 c 15 -8 0 -22 0 -33 c 34 5 57 43 99 43 c 20 26 62 11 74 -8 c C f -568 -82 n -11 -16 -30 -20 -50 -22 c -16 3 -14 22 -10 31 c 22 5 52 10 60 -10 c C f -100 -15 n 9 -12 17 -35 4 -48 c -5 -1 l -11 3 -2 14 2 19 c -20 4 -13 27 -1 29 c C f 122 -6 n 2 -5 7 -23 -6 -30 c -15 8 l 0 9 8 24 21 22 c C f -141 -51 n 11 -16 -9 -22 -21 -22 c -15 -2 l 1 5 -3 6 -5 10 c 12 0 26 9 41 15 c }def /27{ C f 52 -1 n 2 -10 l -7 2 -8 -6 -12 -10 c -3 -13 11 -14 17 -22 c 23 9 l -21 -52 -84 -52 -94 -111 c -14 15 -69 34 -34 67 c 9 32 36 16 56 17 c 22 14 19 60 43 60 c C f 73 -4 n 2 -14 l -36 8 l -8 32 23 19 34 5 c C f 241 28 n -1 -14 -20 -17 -31 -24 c 21 -12 31 -23 32 -49 c -15 -18 -31 -34 -57 -33 c -34 43 41 58 28 101 c 10 3 19 20 29 4 c C f 3765 503 n -5 -22 -33 -21 -46 -16 c -18 16 -37 38 -34 62 c 20 6 40 41 56 3 c 0 -26 29 -21 23 -50 c C f -4374 -731 n 18 -15 32 -4 48 2 c 4 6 l 17 -11 -5 -22 -5 -34 c -31 -10 -57 -21 -89 -14 c -2 -7 -10 -14 -6 -20 c 6 -4 9 -11 15 -8 c 2 -13 l -28 23 -57 -66 -64 9 c -5 8 -14 1 -19 2 c -6 -16 -33 -33 -6 -49 c 4 -17 -18 -27 -18 -42 c 17 -18 34 5 51 8 c 15 26 l 24 -21 l -70 -4 -70 -76 -124 -105 c 16 -11 l -27 -13 8 -32 -1 -49 c 10 -7 l -17 -15 -36 8 -53 11 c 7 -21 -17 -34 -34 -40 c -20 -5 -34 19 -58 7 c -24 -38 l 13 -26 42 -18 59 -5 c 3 -22 20 -19 33 -33 c -2 -9 -17 -15 -10 -26 c }def /28{ 6 -4 l -23 -21 -71 -20 -68 -64 c -17 -11 -37 -26 -44 -50 c 21 -16 15 -41 18 -59 c -9 -10 -28 3 -34 10 c 3 13 -12 14 -17 22 c -64 2 -79 -57 -147 -47 c -23 2 -45 -43 -71 -11 c -20 -15 -24 -35 -41 -46 c -51 60 -126 33 -187 25 c -70 -2 22 -107 -53 -81 c 11 28 -34 50 -3 77 c 42 8 61 65 107 54 c 6 16 40 11 27 37 c -4 6 -14 10 -12 19 c 7 11 18 20 29 23 c 1 -15 7 -25 20 -31 c 20 14 l -11 -17 11 -26 16 -36 c 6 -8 15 -10 25 -6 c 25 19 -1 41 -4 62 c 22 17 13 71 48 61 c 1 -21 -45 -42 -23 -66 c 19 -33 36 -1 63 -6 c 10 14 19 32 38 35 c 7 -11 21 -26 36 -24 c 54 31 -19 113 56 110 c 22 14 -13 17 -10 31 c 36 16 22 59 24 90 c -38 -9 -25 38 -46 50 c 36 33 48 -22 83 -10 c 13 -15 -32 -50 13 -52 c 10 22 30 27 47 40 c -14 -30 33 -36 51 -20 c 2 18 16 42 36 49 c -10 7 -29 28 -22 45 c 26 11 22 -21 39 -29 c 10 12 21 31 7 44 c 10 3 28 6 29 23 c 7 23 -18 16 -26 25 c 49 6 23 67 68 86 c -23 48 32 48 57 67 c 26 11 4 28 6 49 c 30 -14 43 -47 72 -67 c C f 2058 358 n -7 -22 -23 -10 -36 -11 c -39 39 29 13 34 24 c 7 -1 9 -11 2 -14 c C f 510 88 n -14 -32 8 -56 -15 -85 c -39 -4 -81 20 -120 30 c -2 10 l 38 1 80 17 109 44 c 8 -6 19 -1 28 1 c C f }def /29{ -327 -90 n 3 -6 -4 -9 -8 -15 c -18 -5 -39 -8 -53 11 c 5 23 51 28 62 4 c C f -2021 -318 n -14 -12 -28 -41 -10 -59 c 35 -24 29 37 66 29 c -2 -35 -51 -39 -64 -77 c -12 -10 -35 -43 -53 -27 c 13 19 0 48 14 64 c -23 28 -64 9 -85 15 c 32 36 85 99 132 55 c C f 419 83 n -16 -11 -24 -56 -51 -41 c 14 12 25 50 51 41 c C f 4242 557 n -5 -13 -15 -26 -9 -45 c -8 -1 -31 -10 -44 4 c -10 23 12 45 -13 60 c -9 -8 -21 -10 -26 -23 c -27 20 l 6 3 4 9 3 14 c 38 -13 56 28 92 0 c 9 -11 7 -25 24 -31 c C f -4155 -684 n -22 -35 -68 -9 -97 -23 c 20 51 l 28 -58 68 54 77 -28 c C f 135 55 n 3 -22 -20 -29 -37 -44 c -12 9 -24 24 -6 37 c 18 -4 27 18 42 6 c C f 2065 257 n 4 -3 13 -5 12 -12 c -16 -21 -45 -24 -70 -19 c -16 3 -10 19 -15 31 c 24 33 44 -26 72 1 c C f -1112 -173 n -1 -7 6 -15 -2 -19 c -11 -7 -20 4 -29 9 c -4 24 l 14 7 30 -2 35 -14 c C f 737 116 n 3 -12 -18 -15 -26 -23 c }def /30{ -4 -9 -14 0 -19 2 c 2 19 28 29 45 21 c C f -882 -206 n -15 18 18 39 15 59 c -6 -20 8 -51 -15 -59 c C f 118 56 n 8 -18 -19 -34 10 -42 c 9 0 20 6 24 -1 c -10 -38 -54 2 -79 -17 c -7 -13 -21 -20 -25 -31 c 17 1 30 -14 45 -12 c 2 -10 l -34 5 -69 -9 -97 -23 c -18 6 -19 25 -30 39 c 13 28 45 12 68 29 c 26 23 55 48 75 74 c 6 -4 l C f -2343 -382 n -10 -22 -33 -41 -54 -51 c -12 9 l 29 4 38 47 66 43 c C f 2147 304 n 3 -8 1 -17 -5 -25 c -11 -5 -17 8 -26 12 c -8 18 25 30 31 13 c C f 3011 441 n 2 -14 l -24 12 -39 -6 -60 -14 c -1 21 28 22 37 39 c 6 -4 14 -3 21 -11 c C f -2789 -445 n 1 -17 -12 -12 -21 -22 c -10 7 l 1 14 17 34 31 15 c C f -268 -65 n -11 -5 -23 2 -26 10 c 8 6 9 22 21 19 c 4 -29 l C f 2537 398 n 5 -34 l -20 4 -39 29 -50 46 c 19 13 32 -14 45 -12 c C f }def /31{ 106 30 n 7 -13 -6 -27 -14 -32 c -10 0 -21 -7 -29 1 c 1 17 23 29 44 31 c C f -2734 -432 n 2 -10 l -25 5 -32 -27 -55 -14 c 1 26 34 36 53 24 c C f 2085 303 n 5 -13 -2 -23 -4 -33 c -21 11 l -3 -6 -9 -7 -14 -7 c 0 12 23 31 23 43 c 16 -13 l C f -2167 -331 n 5 -13 -11 -21 -14 -30 c -14 1 -21 -8 -32 -15 c -14 25 23 45 47 45 c C f -1887 -292 n 6 -15 11 -38 0 -54 c -10 0 -21 -7 -29 1 c 8 17 13 42 30 53 c C f 3802 541 n -14 -9 -35 17 -51 -3 c -4 24 l 24 2 40 -4 55 -21 c C f 1507 230 n 11 9 7 32 25 19 c 6 -15 16 -25 26 -36 c -9 -10 -25 -7 -38 -9 c -6 3 -12 10 -20 6 c -8 -6 -6 -17 -10 -26 c -11 4 -24 12 -35 0 c -3 19 20 5 21 22 c -41 18 l 7 43 53 24 72 6 c C f -3525 -534 n -12 -12 l 10 -7 l -10 -15 -30 -39 -53 -27 c -5 8 -16 11 -9 23 c 22 -28 34 5 51 16 c -7 14 l 8 5 14 -3 20 -7 c C f }def /32{ 2081 329 n 5 -8 -4 -11 -6 -16 c -13 5 -29 1 -43 -1 c 9 19 33 12 49 18 c C f -127 -54 n -22 -24 -55 -26 -79 -50 c -19 33 37 39 60 47 c 2 7 14 9 19 3 c C f 1718 233 n -18 -10 -46 -14 -66 -10 c -3 32 41 15 47 42 c 14 2 l 5 -34 l C f -5661 -841 n -2 -7 6 -8 10 -12 c 6 3 16 -1 18 8 c 5 -10 14 -15 22 -21 c -18 -37 -55 -5 -81 -4 c -4 17 13 30 30 29 c C f 4123 603 n -22 -12 -56 4 -77 7 c -1 8 l 23 -15 62 10 78 -16 c C f 206 40 n 1 -8 l -64 -1 l -3 19 l 22 0 41 -11 65 -9 c C f -2403 -372 n 13 -7 3 -20 -4 -28 c -6 -4 -11 4 -17 6 c 2 12 7 20 21 22 c C f 2145 295 n -23 -9 -60 -14 -81 -37 c -27 30 -66 -19 -82 26 c 26 -12 37 16 55 27 c 32 -19 75 -18 108 -16 c C f -1906 -286 n -3 -13 -19 -20 -35 -21 c -7 13 -34 19 -19 37 c 20 3 50 11 54 -16 c C f 2983 461 n }def /33{ -13 -18 -44 -19 -65 -15 c -3 19 l 26 13 45 -10 68 -3 c C f -57 -33 n -15 -18 -45 -19 -65 -15 c -21 16 l 18 8 62 23 86 -1 c C f -3258 -552 n -1 -5 -8 -6 -13 -7 c -19 13 10 26 4 40 c 31 15 7 -23 9 -33 c C f 2528 367 n 28 -3 42 17 56 38 c 21 -12 45 -2 64 -14 c -12 -33 -62 -25 -72 -59 c -37 -31 -66 23 -101 28 c -13 27 -52 13 -76 32 c 16 -1 26 32 49 18 c 23 -26 57 -12 79 -42 c C f 843 167 n 3 -6 -4 -9 -6 -15 c -10 -2 l -4 24 l 8 5 14 -3 20 -7 c C f 564 19 n -8 -6 -25 8 -33 0 c -2 10 -2 22 10 26 c 15 1 13 -19 23 -26 c C f -5982 -914 n -8 -36 -42 -53 -49 -89 c -15 -2 -13 15 -9 23 c 23 17 -28 37 6 49 c 22 -22 33 10 51 16 c C f 5854 871 n 14 -10 21 -23 22 -40 c -22 -17 -43 12 -68 5 c 8 13 -3 34 -21 35 c -7 -1 -18 -5 -20 7 c 32 -5 60 16 87 -7 c C f -1057 -219 n -13 -19 -37 -32 -58 -28 c -6 4 -8 19 -21 11 c 16 6 49 18 73 30 c 5 -13 l }def /34{ C f -4739 -749 n -2 -11 -15 -23 -27 -13 c -5 -1 l -2 14 l 12 0 25 7 35 0 c C f -103 -49 n -28 -23 -51 8 -81 -4 c 0 26 44 20 64 20 c 4 -6 15 -8 16 -16 c C f 79 12 n 6 -15 -3 -40 17 -46 c 9 41 45 9 66 34 c 6 -4 l -9 -10 -35 -45 -1 -49 c 30 8 21 -35 21 -49 c -8 -17 l -22 31 -48 -16 -72 8 c -10 33 l -44 5 -76 -31 -107 -54 c 5 -30 -47 -19 -35 -54 c -13 -30 -44 -43 -74 -49 c -4 -7 -12 -14 -10 -22 c -7 1 -15 -6 -21 2 c -7 14 6 27 16 32 c 13 -3 18 10 25 18 c -14 32 -54 38 -72 67 c 25 4 51 -37 73 -4 c 9 69 69 2 92 54 c 11 28 50 32 57 66 c 5 15 -3 29 13 40 c 10 3 19 3 25 -5 c C f 6179 824 n -1 -5 -8 -6 -13 -7 c -14 25 -46 7 -58 31 c -11 -17 -36 -24 -36 -49 c 14 -24 28 -3 43 1 c 2 -15 -21 -22 -34 -29 c -18 3 -42 1 -52 21 c -1 8 l 17 -9 32 7 40 22 c -37 29 15 25 21 55 c 35 -14 56 -28 89 -54 c C f 77 -61 n 3 -19 l -17 -3 -46 -7 -64 9 c 0 33 52 32 61 9 c C f -6067 -922 n 5 -11 -2 -21 -12 -26 c }def /35{ -11 -5 -17 8 -26 12 c -7 21 27 28 38 14 c C f -46 -50 n 5 -22 -35 -50 9 -61 c 10 15 20 29 39 30 c 4 -17 7 -37 -12 -45 c -41 -1 -70 20 -104 46 c -8 51 43 22 68 29 c C f 5582 805 n -12 -11 -35 -7 -41 9 c 9 8 28 11 39 6 c 2 -15 l C f -2523 -400 n -2 -11 -19 -24 -31 -13 c -17 11 l 5 22 33 9 48 2 c C f 2468 372 n -3 19 l 40 -13 l -37 -6 l C f -5872 -941 n -5 -4 -5 -13 -12 -10 c -2 24 -39 15 -36 43 c 21 22 l 25 -5 19 -37 27 -55 c C f 6027 902 n 1 -8 l -15 -13 -35 3 -53 6 c -4 13 13 7 16 16 c 14 2 25 -3 35 -14 c C f -6222 -951 n -31 -36 51 -72 -15 -83 c -46 15 12 57 -32 71 c 5 22 32 29 46 12 c C f 367 -6 n -5 -13 -17 -13 -27 -15 c -6 4 l -4 -6 -8 -13 -17 -11 c 31 48 l 8 -7 21 -12 20 -26 c C f 6396 997 n 1 -8 l }def /36{ -15 -2 -33 -9 -48 12 c 16 -11 32 17 47 -3 c C f -492 -105 n 1 -8 l -81 -12 l -1 8 l 38 -24 48 56 81 12 c C f -6220 -973 n -27 -4 -11 -60 -38 -35 c -10 21 17 25 24 36 c 5 1 12 3 14 -1 c C f -118 -129 n 6 -15 -1 -36 -2 -54 c -20 7 l 8 15 -9 49 22 47 c C f 55 -78 n 12 -10 6 -25 -5 -35 c -8 -5 -13 3 -20 7 c -9 16 11 29 25 28 c C f 35 -105 n -23 -17 -13 -42 -23 -62 c -9 11 -27 8 -33 24 c 35 0 22 81 56 38 c C f -109 -46 n -4 -40 -51 -30 -82 -31 c 7 25 49 16 60 47 c 7 23 36 4 21 -16 c C f 7026 1036 n 10 2 13 16 27 13 c 6 -37 l -29 1 -55 11 -77 31 c 0 12 1 26 14 32 c 21 -2 4 -36 30 -39 c C f -6956 -1107 n 24 -10 30 -37 32 -54 c -27 -18 l 12 -9 4 -24 0 -33 c 20 -18 57 -31 44 -61 c -10 -10 -14 -21 -10 -36 c 10 0 20 -9 19 -21 c -45 -24 -47 45 -85 16 c -15 6 -22 22 -14 36 c 30 43 -7 82 33 121 c 10 34 -24 67 21 90 c }def /37{ 10 -12 -3 -28 -13 -40 c C f -52 -13 n -12 -9 -15 6 -21 11 c -9 16 12 14 15 26 c 6 -37 l C f -220 -96 n 5 -34 l -16 1 -26 22 -40 34 c 1 14 32 19 35 0 c C f -54 -89 n -9 -12 l -3 17 -27 44 -10 66 c 14 -13 24 -34 19 -54 c C f 150 56 n -29 -4 l -5 10 5 23 16 21 c 7 -4 9 -11 13 -17 c C f 7205 1048 n -8 -5 -2 -12 -2 -19 c 36 0 28 -37 48 -55 c -14 -11 -34 -38 -46 -12 c 6 53 -47 27 -59 69 c -22 -3 -40 -46 -65 -15 c -2 10 -5 22 6 30 c 11 -4 21 -12 34 -10 c 2 45 63 41 84 13 c C f 164 3 n -19 -10 -37 -40 -61 -20 c -10 9 l 14 32 40 10 70 14 c 0 -3 l C f -838 -177 n -1 -7 -8 -6 -13 -7 c -12 9 l 5 9 18 6 24 -1 c C f 791 105 n -1 -7 8 -7 12 -12 c -16 -11 -10 -27 -13 -40 c -22 21 -41 -15 -62 -1 c -6 15 0 26 8 36 c 25 -7 29 22 54 17 c C f -7369 -1208 n }def /38{ 14 -12 27 -20 45 -12 c 10 12 -1 31 14 45 c 26 -25 l -31 -24 -1 -62 -24 -90 c 3 -8 21 -16 9 -26 c -18 -6 -21 16 -33 23 c 4 6 l -18 6 -54 -7 -69 14 c 20 15 -32 49 11 55 c -14 13 -34 19 -44 40 c 33 41 39 -15 61 -29 c C f 6583 1041 n 2 -15 l -7 -11 -21 -1 -29 6 c 8 1 16 20 26 9 c C f 851 58 n -12 -12 -38 -11 -39 8 c -6 8 2 23 15 26 c 14 -3 17 -22 24 -34 c C f -815 -100 n 2 -10 l -19 -3 l -5 11 4 8 8 17 c 3 1 7 -2 9 -4 c C f -6553 -1166 n -2 -12 -12 -21 -20 -31 c -9 4 -23 2 -26 15 c 15 6 27 16 46 16 c C f -4 -77 n -2 -7 -12 -12 -11 -21 c -20 30 -38 -33 -49 6 c 22 5 43 79 60 14 c C f 70 -267 n -7 -13 -16 -20 -30 -20 c -6 6 -15 8 -13 17 c 9 12 l -13 7 -20 16 -20 30 c 34 29 38 -24 54 -38 c C f -3 -68 n -14 -9 -6 -29 -25 -28 c -12 12 -11 36 7 44 c 11 -4 19 -2 18 -16 c C f -169 -93 n 5 -8 -3 -14 -7 -20 c }def /39{ -25 -7 -24 19 -33 33 c 3 38 27 -6 40 -13 c C f 7858 1153 n 3 -6 -5 -11 -8 -15 c -30 -6 -41 30 -63 37 c 3 14 0 33 13 42 c 16 -25 22 -62 58 -64 c C f -7710 -1111 n 2 -14 17 -41 -6 -54 c -5 -1 l -13 17 15 37 0 54 c 10 2 l C f 17 -108 n 7 -13 -4 -33 -18 -41 c -6 -4 -11 3 -15 6 c -5 22 20 27 33 34 c C f -172 -70 n -15 -2 -35 3 -45 12 c -1 5 l 19 -13 55 22 46 -17 c C f -1 -86 n -4 -6 l -21 24 -36 1 -59 10 c 5 34 37 4 56 8 c 7 -1 6 -8 7 -13 c C f 182 28 n 0 -10 -15 -23 -25 -14 c -15 8 1 19 -1 29 c 11 5 23 -7 26 -15 c C f -191 -126 n -11 -9 -30 4 -44 4 c -6 27 26 21 40 20 c 4 -24 l C f 227 30 n 11 -4 11 -16 13 -26 c -25 -18 -54 37 -76 2 c -8 -5 -14 3 -22 7 c 3 13 15 25 31 24 c 18 -25 30 -6 55 -7 c C f 7756 1186 n 18 -15 -12 -45 22 -54 c 7 -1 15 6 19 -2 c }def /40{ -32 -17 -69 14 -96 9 c -13 3 -15 20 -9 28 c 17 35 46 -16 65 19 c C f -7966 -1418 n -3 -6 -11 -9 -8 -17 c 6 -3 l -16 -6 -45 -2 -57 0 c 17 16 44 -5 53 24 c 6 -4 l C f 202 -133 n -11 -16 -28 1 -39 9 c 11 9 -10 31 9 29 c 10 -12 26 -22 30 -39 c C f 106 32 n -23 -19 41 -44 -5 -54 c -11 4 -12 14 -9 23 c 4 6 l -18 4 -21 26 -17 41 c 14 11 l 5 -8 14 -15 13 -26 c C f -260 -50 n -13 -16 -3 -37 -16 -51 c -13 7 -24 19 -15 32 c 10 5 18 17 32 19 c C f 296 -184 n -7 -13 -19 -24 -31 -15 c 1 17 -14 32 0 54 c 21 -2 26 -24 30 -39 c C f -1 -83 n -9 -10 l 5 -8 17 -1 18 -13 c -3 -6 -10 -5 -15 -6 c 18 42 -74 8 -30 47 c 18 8 43 1 36 -19 c C f 48 -122 n 4 -5 l -15 -25 l 33 -24 l -8 -13 -25 -14 -41 -17 c -35 14 -1 50 -39 61 c 9 12 7 32 24 38 c -5 -13 14 -38 34 -29 c C f 7766 1154 n -17 -25 -38 -13 -61 -9 c }def /41{ -4 13 13 7 17 16 c 15 4 34 3 44 -7 c C f -7745 -1289 n -5 -13 -17 -13 -27 -15 c -6 6 -15 8 -13 17 c 10 12 30 10 40 -2 c C f -81 -66 n 11 -36 -38 -32 -54 -32 c -7 9 -24 10 -23 26 c 5 46 65 50 77 7 c C f 119 37 n -5 -13 -50 -9 -33 -34 c 29 -30 103 30 120 -25 c 9 -14 25 -19 9 -37 c -21 0 -57 -14 -59 15 c 4 8 12 12 7 20 c -30 16 -110 -38 -102 33 c -2 1 -6 4 -11 3 c -7 11 8 13 12 21 c 20 6 37 -5 56 3 c C f -101 -188 n 14 -15 32 -16 50 -11 c -5 -15 0 -35 -18 -41 c -19 -3 l 6 20 -17 46 -41 45 c -15 18 -42 -6 -59 10 c 3 26 39 15 47 42 c 30 10 20 -31 39 -42 c C f 196 6 n 1 -15 -9 -34 -23 -42 c -11 -7 -16 6 -26 10 c -8 30 35 28 49 32 c C f 7636 1033 n 3 -12 -6 -20 0 -33 c -53 -3 l -6 18 1 40 13 49 c 16 9 28 -3 40 -13 c C f -7727 -1195 n 5 -22 30 -49 -4 -63 c -10 -2 -21 -7 -30 4 c -4 -28 29 -46 45 -69 c 9 -5 23 -3 26 -15 c -25 -7 -54 -39 -81 -12 c -3 20 18 55 -13 60 c -8 -6 -9 -20 -22 -17 c -9 4 -14 12 -14 22 c }def /42{ 27 -5 30 39 55 27 c -11 14 -7 58 -43 56 c -10 -5 -27 -2 -26 10 c 30 27 76 13 106 -3 c C f 7781 873 n 8 -44 -34 -2 -46 -12 c 15 2 36 45 46 12 c C f -7619 -1300 n -19 -3 -40 -10 -50 11 c 16 -1 40 10 50 -11 c C f 17 -75 n -5 -13 -17 -11 -27 -13 c -12 10 -6 30 4 39 c 18 8 15 -17 23 -26 c C f 7536 1090 n -16 4 -32 5 -44 4 c 10 12 5 32 18 41 c -4 -32 57 -10 26 -44 c C f -7556 -1145 n -6 -15 -1 -40 -18 -42 c -15 6 -8 30 -6 42 c 5 11 18 6 24 0 c C f -83 -23 n 19 -13 -9 -34 20 -40 c 5 -53 l -5 -1 l -6 27 -25 64 -30 92 c 10 2 l C f 7658 1070 n -13 -18 -40 -18 -60 -14 c 5 15 25 16 35 30 c 8 -6 23 -3 25 -15 c C f -82 -52 n 5 -13 -3 -14 -12 -21 c -10 11 -44 7 -29 30 c -1 28 28 23 43 34 c 8 -9 -4 -28 -2 -43 c C f 55 -235 n -13 -18 -32 7 -53 -5 c -4 15 -1 21 12 26 c 7 -1 7 8 12 12 c -16 17 l }def /43{ 17 22 60 -20 46 -50 c C f -2184 -795 n -12 -9 -35 -31 -53 -27 c 11 21 26 56 53 27 c C f -48 -61 n 11 -26 -24 -24 -31 -43 c -22 -15 -33 16 -51 16 c 36 4 53 27 74 44 c 8 -18 l C f -343 -109 n -4 -9 -13 -5 -19 -8 c -2 10 l 7 -1 15 6 21 -2 c C f 2205 121 n -6 -6 -10 -15 -17 -13 c -22 9 -6 28 -6 42 c 8 -6 28 -13 23 -29 c C f -133 -203 n 8 -19 -20 -19 -19 -36 c 4 -3 8 -4 7 -9 c -29 -4 l 16 20 12 45 41 49 c C f -6190 -1090 n 1 -15 -13 -30 -18 -37 c -16 13 -33 23 -52 21 c -3 19 -5 41 -4 62 c 37 16 41 -40 74 -46 c C f 2324 5814 n -9 -20 -8 -49 -3 -67 c -21 -17 -51 21 -69 -11 c -13 -2 l -5 23 11 47 -19 55 c -1 42 59 24 89 36 c 15 -11 l C f 299 -76 n -32 -24 -64 22 -92 13 c -7 4 -18 6 -21 17 c 26 41 69 -6 92 41 c 35 -10 36 -45 21 -71 c C f -495 -62 n 43 5 65 52 112 41 c 19 -14 73 11 61 -33 c }def /44{ 33 5 l 7 -21 -51 -21 -27 -46 c -36 23 -52 -23 -89 -3 c -4 3 l -5 -21 -16 -38 -35 -48 c 1 -8 l -6 -8 -18 -3 -24 5 c -13 42 -70 40 -107 50 c -19 24 -50 -4 -70 23 c -24 -9 -21 -39 -49 -13 c 1 19 18 38 35 48 c 52 -11 113 26 163 -23 c C f 370 80 n 2 -10 l -11 -14 -26 1 -39 -1 c -2 5 -17 14 -4 23 c 15 1 33 5 41 -12 c C f -827 -192 n -10 -15 -9 -42 -34 -29 c -4 4 l 12 7 20 25 39 25 c C f 56 -34 n -1 -2 -4 -6 -8 -6 c -11 8 l 11 15 l 9 -2 7 -11 8 -17 c C f 147 -10 n -30 6 -55 -29 -84 -23 c 19 50 69 38 100 76 c -6 -18 6 -38 -16 -53 c C f 263 44 n 9 -4 12 -12 12 -20 c -38 4 -82 25 -113 10 c 28 -7 7 32 42 25 c 17 -14 46 -13 60 -15 c C f 381 68 n 5 -13 l -28 -19 -56 -2 -85 1 c -5 11 6 6 8 15 c 27 14 45 -8 72 -3 c C f 170 -40 n -11 -15 -37 -4 -53 5 c 13 24 38 7 53 -5 c C f -1441 -244 n }def /45{ 8 3 12 20 22 8 c 2 -13 l -13 0 -29 11 -36 -11 c -6 -38 -18 -79 -41 -109 c -33 5 -61 -33 -89 -5 c 9 39 103 34 64 81 c 18 18 46 31 47 60 c 12 2 27 2 30 -11 c C f 291 36 n -32 -10 -31 -44 -64 -44 c -9 -64 -55 14 -80 -31 c -4 4 l -8 -28 -45 -17 -59 -24 c 22 0 31 32 55 19 c 26 43 99 15 121 74 c 10 2 23 7 32 2 c C f -256 -105 n 2 -10 l -10 -3 -22 0 -27 -9 c -5 3 -6 9 -7 14 c 9 5 24 22 33 5 c C f -235 -93 n 8 -19 -3 -36 -17 -45 c -8 -1 -15 8 -20 12 c -14 23 17 45 37 33 c C f 2910 408 n 3 -8 -11 -5 -17 -8 c 3 16 l 15 -8 l C f -2934 -472 n 9 -12 -5 -24 -14 -29 c -5 -1 l -11 8 -5 23 5 33 c 5 1 11 3 14 -3 c C f 3077 438 n 3 -11 -1 -27 15 -32 c 22 -2 38 29 60 9 c 37 -64 l -21 -15 -22 24 -42 31 c -32 0 -58 23 -92 13 c -26 15 -6 50 22 42 c C f -3160 -512 n 6 -7 -1 -26 -14 -31 c -10 -1 -24 0 -21 15 c 10 10 26 9 35 15 c C }def /46{ f 3168 302 n -3 -24 29 -23 30 -43 c -6 -4 -25 -2 -30 9 c 2 19 -35 18 -20 39 c 8 5 14 -3 19 -5 c C f 308 -442 n -13 -14 -32 0 -48 1 c 6 30 38 14 48 -1 c C f 84 -87 n 1 -8 l -9 -6 -29 -9 -39 2 c -3 22 35 27 38 6 c C f -66 -34 n -30 -3 -62 -18 -92 -19 c 24 19 66 64 92 19 c C f 230 -364 n 2 -13 l -8 -15 -19 1 -29 -1 c 4 6 15 23 27 14 c C f -4113 -1113 n -7 -1 4 -37 -19 -32 c -10 9 l -2 13 14 33 29 23 c C f -6 -85 n 2 -10 l -6 -15 -15 1 -24 1 c -5 11 6 6 8 15 c 6 4 9 -4 15 -6 c C f 4206 501 n -10 -2 l -11 14 11 27 18 40 c 12 -10 11 -37 -8 -38 c C f -4207 -680 n -39 -20 -26 35 -7 46 c 7 -46 l C f 13 -144 n 1 -7 -1 -15 8 -17 c -15 -11 -25 6 -37 18 c -6 28 28 18 29 -1 c C f }def /47{ 4274 635 n -5 -19 22 -20 24 -35 c -14 -22 -49 -23 -72 -19 c -11 5 -16 15 -18 26 c 25 4 41 23 65 29 c C f 80 -27 n 4 -6 -3 -12 -7 -20 c -6 -3 -9 5 -15 8 c 6 15 l 4 -4 11 -3 16 -3 c C f -4308 -874 n -20 -3 l -1 3 l 7 1 14 6 20 0 c C f 4347 429 n -7 -11 -9 -28 1 -39 c 20 -10 l -2 -19 -33 -7 -43 -20 c -4 6 2 12 5 19 c -41 5 15 45 -27 57 c 8 15 35 2 43 -7 c C f -59 -43 n -4 -6 -12 -12 -10 -20 c 20 -7 l 6 -28 -27 -19 -44 -25 c -9 2 -5 13 -8 17 c 39 3 3 58 42 35 c C f -4152 -790 n -36 -6 l -1 5 -4 6 -6 9 c 7 21 26 4 41 11 c 2 -15 l C f 4137 125 n -6 -30 -38 -9 -55 -14 c -7 16 11 14 15 21 c 14 6 28 3 40 -7 c C f -166 -401 n 4 -6 -3 -11 -6 -16 c -35 -4 -11 25 -34 37 c 23 24 28 -9 40 -21 c C f -82 -73 n 2 -10 1 -18 -6 -25 c -24 5 l -4 15 16 38 31 20 c }def /48{ C f 7 -324 n -9 -22 9 -29 15 -45 c -1 -49 -79 -48 -60 -94 c -14 1 -29 -13 -39 2 c 6 28 -27 31 -39 46 c 17 53 101 36 101 100 c 12 9 15 -6 22 -10 c C f -317 -86 n 2 -27 -44 -30 -28 -62 c -5 -9 -14 -11 -21 -17 c -10 7 -7 21 -10 31 c 21 18 3 46 28 62 c 15 1 16 -15 31 -14 c C f -156 -90 n -2 -19 -15 -33 -5 -53 c -14 -6 -36 3 -40 -16 c 1 -3 0 -10 5 -13 c 5 1 l 1 -15 -19 -11 -25 -22 c 24 -44 -44 -30 -61 -57 c -14 16 15 24 21 37 c 41 42 18 125 100 124 c C f 173 -55 n -12 -7 -42 -5 -45 17 c 41 6 l 4 -23 l C f -2046 -350 n -13 -5 -23 -17 -40 -15 c -7 16 -23 -2 -33 8 c 31 6 63 8 74 6 c C f 1665 226 n -7 -23 -30 -45 -23 -73 c -13 -2 l -12 24 21 37 4 62 c 11 5 20 23 32 13 c C f -1539 -278 n -3 -14 l -12 -7 -19 11 -30 9 c -3 20 30 25 33 5 c C f 1679 257 n 3 -11 3 -30 -17 -25 c -8 7 -27 23 -9 36 c 11 5 21 -2 25 -11 c C }def /49{ f -276 -46 n -6 -16 -22 -34 -43 -30 c -9 26 23 37 43 30 c C f -1046 -245 n -30 17 -67 5 -99 7 c -9 16 9 6 11 17 c 30 -16 74 15 88 -24 c C f 1206 184 n 15 -23 -16 -26 -17 -42 c -46 23 -48 -73 -78 -12 c -31 -8 -46 -63 -84 -40 c -7 23 15 34 30 47 c 60 -6 80 54 131 62 c 18 -16 l C f -702 -128 n -10 -12 -7 -35 -31 -42 c -6 4 l 6 18 22 31 37 38 c C f -234 -63 n -15 -26 -54 0 -60 -38 c -10 0 -21 -7 -29 1 c 12 10 30 23 47 36 c 13 0 29 8 42 1 c C f 437 67 n -25 -4 -26 -53 -56 -32 c 9 22 35 34 56 32 c C f -3331 -915 n 7 -1 6 -8 7 -13 c -28 11 -49 -28 -69 9 c 11 21 l 20 5 36 -31 51 -16 c C f 121 -68 n 1 -5 l -25 -16 -24 19 -47 27 c 3 14 l 20 1 34 -21 44 -37 c C f -238 -50 n -7 -11 l -16 13 -40 22 -44 42 c 6 6 19 8 27 4 c 9 -12 22 -21 24 -34 c C f }def /50{ 292 -23 n -12 0 -30 4 -36 19 c -3 12 -4 27 9 29 c 1 -15 25 -27 26 -48 c C f -190 -48 n 5 -34 70 -41 42 -80 c 20 3 26 -20 37 -29 c 9 -11 -7 -13 -11 -21 c -27 18 -55 45 -91 64 c 15 39 -89 64 -25 96 c 6 -20 28 -46 48 -31 c C f 110 -153 n 1 -31 40 -4 44 -31 c 26 -1 41 -18 39 -42 c 22 -33 89 -30 88 -76 c 25 -53 98 -40 116 -93 c 105 -76 199 -135 307 -190 c 35 -52 106 -29 137 -84 c -117 -2 -176 99 -283 124 c -49 48 -116 67 -170 105 c 0 31 -34 17 -49 36 c -55 35 -74 103 -143 122 c -10 11 -8 28 -12 41 c -39 -6 -51 49 -92 34 c -7 13 6 39 -3 51 c 19 3 l C f 310 -106 n -2 -11 -22 -15 -33 -9 c 3 14 l 11 5 20 -4 30 -6 c C f 686 -500 n 1 -5 l -28 -6 -65 21 -97 4 c -13 7 1 17 1 24 c 38 20 58 -31 95 -23 c C f 135 -36 n 18 -27 46 -10 66 -24 c -15 -18 -50 11 -77 7 c -34 17 -70 17 -102 33 c 42 17 72 -27 113 -16 c C f 1413 24 n 2 -5 0 -9 -4 -11 c -19 -3 -33 23 -47 22 c 18 5 36 2 50 -11 c C f 545 87 n -6 -20 -32 -19 -42 -20 c }def /51{ -8 19 15 13 21 22 c 7 -1 15 6 21 -2 c C f 1827 525 n -2 -22 -33 -61 -60 -56 c 60 56 l C f }def end 9base-6/troff/font/devutf/charlib/~=0000644000175000017500000000013011402154555017024 0ustar anselmanselm/build_~= { pop (\176) stringwidth pop neg size -.15 mul (\176\055) ashow } def 9base-6/troff/font/devutf/charlib/FA0000644000175000017500000013474011402154555016757 0ustar anselmanselm% From fuwutai!falco Mon Feb 19 17:47 EST 1996 % From: falco@fuwutai.wh.att.com (Steven A Falco +1 +1 201 386 4865) % Date: 19 Feb 96 17:42:00 -0500 /Logo_Dict 100 dict dup begin /showpage {} def end def /build_FA { % don't bind this procedure Logo_Dict begin gsave /charwidth exch def currentpoint translate resolution 72 div dup scale ptsize 36 div dup scale gsave 142.2222 20.0 scale 512 72 1 [512 0 0 -72 0 72] { < ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbaffffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff807ffffffffffffffffffc01fffffffffffffffd1fffffffffffffffffffffffffffff 007fffffffffffffffffffffffffffffffffffffffffffffffffffffff807ffffffffffffffffff801ffffffffffffffe00fffffffffffffffffffffffffffff 007fffffffffffffffffffffffffffffffcfffff8000007fffffffffff807ffffffffffffffffff801ffffffffffffffe00fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffffe07ffff8000007fffffffffff807ffffffffffffffffff803ffffffffffffffe00fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffff807ffff8000007fffffffffff807ffffffffffffffffff801ffffffffffffffe00fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffff007ffff8000007fffffffffff807ffffffffffffffffff803ffffffffffffffe00fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffff007ffff8000007fffffffffff807ffffffffffffffffff801ffffffffffffffe00fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffff007ffff8000007fffffffffff807ffffffffffffffffff803fffffffffffffffe1fffffffffffffffffffffffffffff 007ffffffffffffffffffffffffffffff007fffff00008ffffffffffff807ffffffffffffffffff801ffffffffffffffffffffffffffffffffffffffffffffff 007ffff6ffeefffc07ffe07fffffc1ffe005ffffff007fffd7fffff07f807e9fffffe1ffffec7ff801fff8fffffe7fffffffffffffffffffffffffffffffffff 007fff807f803fe0007f0007f806003e00003fffff003ff8003fff8003803003f807001fff000ff801ff0007ffe00700e00ffc007ffe007fffffffffffffffff 007fff807f803f80007c0003f800001e00003fffff003fe0001ffc0003800001f800001ff80003f801fc0003ffc00300e00ff0003ff0000fffffffffffffffff 007fff807f803f0000780000f800000600003fffff007fc00007fc0003800000f000000ff00000f801f00000ff000000e00fc0000fe0000fffffffffffffffff 007fff807f803e0000700000f800000600003fffff003f800007f0000380000070000007e000007803e00000fe000000e00f80000fc0001fffffffffffffffff 007fff807f803c00006000007800000200003fffff003f800003f0000380000030000003c000003801c000003e000000e00f000007c0001fffffffffffffffff 007fff807f80380000e002003800000200003fffff003f005003e00003800000300000038000003801c000003c000000e00f00000780001fffffffffffffffff 007fff807f80380030c00f8038000003e007ffffff003e00fc01e0008780000030000003800f001803800b001c000000e00e003803803e1fffffffffffffffff 007fff807f803800ffc01fc03800e003e007ffffff003e007e01c007ff800c0030006003801f801803801f8018007800e00e00fc03803fffffffffffffffffff 007fff807f803803ffc000003801f003f007ffffff003e003c01c00fff801f003000f003003f801801801fc00c00fc00e00e00fc018003ffffffffffffffffff 007fff807f803803ffc000003801f003e007ffffff003e000001801fff801f001001f803003fc01801003fc00800fc00e00e0000018000ffffffffffffffffff 007fff807f803003ffc000001803f803f007ffffff003c000000801fff803f001001f803003fc01801003fc00801fe00e00c00000180001fffffffffffffffff 007fff803f003003ffc000001803f803e007ffffff003c000000801fff803f803003f803003fc01801003fc00801fe00e00c000001c0000fffffffffffffffff 007fff803f003803ffc000001803f803e007ffffff003c000000801fff803f801003f803007fc00801003fc00801fe00e00c000001e0000fffffffffffffffff 007fff803f003003ffc000001807f803e007ffffff003e000001c01fff803f801003f803003fc01801003fc00c01fc00e00c000001f8000fffffffffffffffff 007fff801e003801ffc00ffff807f803f007ffffff003e000ce5c01fff807f801003fc03003fc01801803fc00c00fc00e00c000001fc0007ffffffffffffffff 007fff800c003800ffc00ffff807f803e007ffffff003e007fffc007ff807f803003f803003f801803801fc008007800e00e00ffffffc007ffffffffffffffff 00000180000038001c4007f8f807f803f003ffffff003e007fc7c001f3807f801003f803801f001803800f801c000000e00e007fffffe007ffffffffffffffff 000001000000380000600000f007f803f001ffffff003f000e07c00003807f803003fc0380040038038006001c000000e00e001f0780e00fffffffffffffffff 0000018000003c00006000007807f803f0001fffff003f000007e00003807f801003f8038000003803c000003e000000e00f000007800007ffffffffffffffff 0000018000003e00007000007807f803f0003fffff007f800007f00003807f801003f803c000007803e000003e000000e00f00000780000fffffffffffffffff 000001c000003e0000780000f807f803f8001fffff003fc00007f80003807f801003fc03e000007801f000007f000000e00f80000780000fffffffffffffffff 000001e000003f80007c0000f807f803f8001fffff007fe00007fc0003007f801003f803f00000f803f80000ff800000e00fc0000780001fffffffffffffffff 000001f001c03fe0007f8000f807f803fc001fffff003ff80007ff0003807f801003fc03fc0003f803fe0003ffc00600e00ff0000780003fffffffffffffffff 802013fc17e27ffe03ffe01ff807fc07ff803fffff007fff007fffa007807f803007fc03ff000ff803ff000ffff00c01e00ffc000f8000ffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffc00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9ff001ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018001ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000001ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800003ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000003ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000007ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000fffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00003fffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc787fffffffffe1fffffffffffffffffffffffffffffffffc7ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff01ffffffc787ff8ffffffe1ffffffff8ffffffffffffffffffffffffc3ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff001fffffc787ff0ffffffe1ffffffff0ffffffffffffffffffffffff87ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0007ffffc787ff0ffffffe1ffffffff87fffffffffffffffffffff1f83ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0007ffffc787ff0ffffffe1ffffffff0fffffffffffffffffffffe1fc7ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0703ffffc787ff0ffffffe1ffffffff8fffffffffffffffffffffe1fffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0f87ffffc787ff07fffffe1ffffffff0fffffffffffffffffffffe1fffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0f83f81fc787ff07ffe0fe003fe0fff8e101f8c4fff0fc7fcfc3f003c7fcffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0f83c00fc787ff07ff003e000f807ff06000f0007f00183f0e00600187c00f8003f01fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0707c007c787ff07ff001e0007803ff0600070003e000c3f0c0060018380038001e00fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00078003c787ff0fff001e0007007ff0600070003c000c3f0c0030038300038001c01fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000f87c3c787ff0fff3e0e07820ffff06078303c1c1f041e0e783e1f83078181e0c1ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000f07c3c787ff0fffff0e0f8207fff060fc307e183f061e1ffc1e1f820fe183e0c1ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00070003c787ff0fffe00e1fc301fff060fc307e183f821e1f801e1f820fe083f0c07fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0e030001c787ff0fff000e1fc300fff060fc307e187f820c1e001e1f860fe183f0c03fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0f830001c787ff0ffe000e1fc3807ff0e0fc307e187f830c38001e1f860fe183f0e01fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0fc1077fc787ff0ffe000e1fc3c03ff0e1fc30fe187f830838001e1f860fe187f0f00fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0fc107ffc787ff0ffe1f0e1fc3f03ff8e1fc30ff183f8700383c1e1f860fe087f8fc0fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0f8307ffc787ff0ffc1e0e0f83f83ff0e1fc30fe183f0780707c1e1f820fe087f0ff0fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff010301e7c787ff07fc1e0e0703f83ff8e1fc30fe1c1e078070781e0f8707c183f8ff07ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00038007c787ff0004000e0006003ff0e1fc30fe1c040f80f8001e0183010387f0c00fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00078007c787ff0006000e000e003ff8e1fc30fe1e001fc0f8001f0187800387f0c00fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff001fe007c787ff0006000e000e007ff0e1fc30fe1f003fc0fc001f0187c00787f0c00fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff01fff81fc787ff0007c38e303f81fff8e1fc30ff1fe07fc1ff041fc187f01f87f8f03fffffffffffffffff > } image grestore gsave 125 -10 translate 63.3780 60.00 scale 394 373 1 [394 0 0 -373 0 373] { < fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1fffffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffffffffffc3ffffffffc00fffffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffffffffff03ffffe13f8003ffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffffffffffffff001ffff801e0000ffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffffffffffff9e0007f00000000000fffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffffffe0000010000000000003ffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffefffffff3c0000000000000000001ffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffffffffff18000000000000000000000ffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffffc00000000000000000000018ffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000003c3fffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000003ffffe1fffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000001e007e0fffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffc000000000000000000000000000003f0fffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000001f1ffff87fffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000001ffffff03fffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000007fffff81fffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000007ffffe3fffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffff800000000000000000000000000000000007ffffe3fffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000007fffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffff000000000000000fc00000000000000000001ffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffff8000000000000000fc0000000000000000000001ffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffe00000000000000019400000000000100000000007fffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffe00000e0000000000000000000000001c000000003fffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffc0000c0000000000000018000000000040000000023ffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffc00000c000000000000003e0007f0000007807000003ffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffe000001c00000000000301ffbe07fc000003e1f80000ff3ffffffffffffffffffffc0 fffffffffffffffffffffffffffffff0000007c0000000001c701ffff03ff000001f3f800003e043ffffffffffffffffffc0 ffffffffffffffffffffffffffffffc030001f80000000400ff01ffff03ffe00001fff800001e007ffffffffffffffffffc0 fffffffffffffffffffffffffffffe0300003e000000018f07fe7ffffffffff00001f11be000219fffffffffffffffffffc0 ffffffffffffffffffffffffffffe00f0041f8000000001f9fc7fffffffffff80000f1bffe0007ffffffffffffffffffffc0 ffffffffffffffffffffffffffff803e01f870000000007ff001fffc1ffffffe000019fffe000fffffffffffffffffffffc0 fffffffffffffffffffffffffff8003e03f00000000000798001fffc1fffffff800001ffff0007ffffffffffffffffffffc0 fffffffffffffffffffffffffff030fc07e00000000000f0000fffff3ffffff3c00000ffc38000ffffffffffffffffffffc0 ffffffffffffffffffffffffffc870d803e000000000002003fe3ffffffffff1fc0000000fc0007e7fffffffffffffffffc0 ffffffffffffffffffffffffffcc719f81c000000000000003ffffffffffffe3ff8000013e80001fffffffffffffffffffc0 ffffffffffffffffffffffffff00781f818000000000000001fffffffffe43ffffe00003fff00007dfffffffffffffffffc0 ffffffffffffffffffffffffff00f80f800000000000000001fffffffffe03f83ff00001fff803820fffffffffffffffffc0 ffffffffffffffffffffffffff83f80fe00000000000000007fffffffffe70fdfffc0001fffc01c03fffffffffffffffffc0 ffffffffffffffffffffffffff03000ffe000000000040fddffffffffff008ffffff0000fffe01e0ffffffffffffffffffc0 fffffffffffffffffffffffffe070087ff000000000c61ffffffffffffe007ffffffc0007fff01c0ffffffffffffffffffc0 fffffffffffffffffffffffffe0e018fff0000000018fffffffffcdffff807f020fff00007ff8001ffffffffffffffffffc0 fffffffffffffffffffffffffe3e03ffff00000001807fffffff0003fff80ff800fff8000fffc0003e7fffffffffffffffc0 fffffffffffffffffffffff3f83e03ffe200000003807fffd38000007ffffffc01fffc000fffc000041fffffffffffffffc0 ffffffffffffffffffffffe0f0243ff0e200000079807fff000000000fffffff03ffff0007ffe000000fffffffffffffffc0 ffffffffffffffffffffffc0000c7fe002000007f1007ff80000000001ffffffefffff8007ffe000184fffffffffffffffc0 ffffffffffffffffffffff80000fffe00400000fe703ffe000000000007fffffff87ffc003fff000107fffffffffffffffc0 ffffffffffffffffffffff80fc1fffe00000003ee7cfff8000000000000003bfff0ffff000fff8000cf0ffffffffffffffc0 ffffffffffffffffffffff01fc3fffe02000007cfffffe00000000000000001ffffffff8007ffc0007f9ffffffffffffffc0 ffffffffffffffffffffff03fc7fffe0e00000c7ffffe000000000000000003fffc03ff8003fff8001ffffffffffffffffc0 fffffffffffffffffffffe03fffe1fc0600006cffffe0000000000000000003ffe0007f0000fffc000ffffffffffffffffc0 fffffffffffffffffffffc03fffc180000003c7ffff800000000000000000007fc0003f00003ffe000ffffffffffffffffc0 fffffffffffffffffffffc07fffc30000000787eff8000000000000000000003fe0003f80001ffe003ffffffffffffffffc0 fffffffffffffffffffff80ffffc6000000039f87800000000000000000000007f0003ff8000fff003ffffffffffffffffc0 fffffffffffffffffffff01ffffc0000000013f8e00000000000000000000000020007ffc00078fc01ffffffffffffffffc0 fffffffffffffffffffff03ffff80000000013ff800000000000000000000000000007ffc00011fc00ffffffffffffffffc0 ffffffffffffffffffe3f07ffff000000000fff0000000000000000000000000000003fff0000bfe003fffffffffffffffc0 ffffffffffffffffffc1b07ff1c000000003ffe0000000000030000000000000000003fff8000fce001fffffffffffffffc0 fffffffffffffffff9e0007fc180000000303f800000000003f0000000000000000001fff800078e000fffffffffffffffc0 fffffffffffffffff3e0007fc300000000403000000000000780000000000000000000fffc0007fe0001ffffffffffffffc0 ffffffffffffffffe7f000ffc0000000004000000000000006000000000000000000003ffc0003f10000ffffffffffffffc0 fffffffffffffffffff007ffc000000000600000000000000000000000000000000000003e0003c180007fffffffffffffc0 fffffffffffffffffe6007ff8000000000600000000000000000000000000000000000000e0003ffe0007fffffffffffffc0 fffffffffffffffffe6003ff0000000000c0000000000000000000000000000000000000000000fff0007fffffffffffffc0 fffffffffffffffffc6003fe000000000380000000f000000000000000000000000000000000007ff0003fffffffffffffc0 ffffffffffffffffffc003f8000000000600000007fc000400000000000000000000000001c0007ff0001fffffffffffffc0 fffffffffffffffc27c007f0000000000000000007fc000c1f89c000000000000000000003e0003ff0000fffffffffffffc0 fffffffffffffffc07c00fe00000000000000003c7f800081ff0e000000000000000000007e0001ff80003ffffffffffffc0 fffffffffffffffcc60013c00000000000000007c00000081fc0700000000000020000043c000007fc0001ffffffffffffc0 fffffffffffffffcc00023800000000000000000000000081f007801000000000700000778000003f80003ffffffffffffc0 fffffffffffffff80000210000000000000000000000001c1f00fe03e00000000f800001c8000001f00003ffffffffffffc0 fffffffffffffff80000200000000000000000000001c0e03fffff0ffc0000000fe0000000000000000003ffffffffffffc0 fffffffffffffff00000000000000000000000000003800001ffff9fffa0000007fe000000000000000003ffffffffffffc0 ffffffffffffffe00004000000000000000000000007000001fffffffff80000003f0000000000001c0001c3ffffffffffc0 ffffffffffffff00007f80000000000000000000001f00003f3ffffffffc0000000f8000000000000f000183ffffffffffc0 fffffffffffffe0202400000000000000000000003fffc00fe0fffffffff8000001fc000000000000380000fffffffffffc0 ffffffffffffe21fce0000000000000000000001ffffff07fe1f1ffffffff000000fc000000000000000001fffffffffffc0 ffffffffffffc23ffc0000000000000000000003fffdfc0fffffbfffffffff00001ff000000000000000001fffffffffffc0 ffffffffffffc63ff80000000000000000000003e3f8f81fffffffffffffffc0003f90000000000000000007ffffffffffc0 ffffffffffffe63ff0000000000000000000000004e1ff3fffffffffffffffe0001f00000000000000000001ffffffffffc0 fffffffffffffcfff800000000000000000000007fc1fffffffffffffffffff0000700000000000000000001ffffffffffc0 ffffffffffff08fff800000000000000000000007fc7fffffffffffffffffff0000000000000004000000001ffffffffffc0 fffffffffffe080ffc000000000000000000000fffffffffffffffffffffffff0000780000000000000000c1ffffffffffc0 fffffffffffff80ffc000000000000000000003fffffffffffffffffffffffff80007f000000000000000080f3ffffffffc0 fffffffffffff00ffc00000000000000000000ffffffffffffffffffffffffffe0007f80000000000000008061ffffffffc0 ffffffffffffe00ff80000000000000000001ffffffffffffffffffffffffffff000fe0000000008000000003fffffffffc0 ffffffffffff000ff8000000000000000001fff8fffffffffffffffffffffffffe01f8000000000e0000000403ffffffffc0 fffffffffffe070ff00000000000000000010ff1ffffffffffffffffffffffffff1f9000000000060000000403ffffffffc0 ffffffffffe40ffdf000000000000000000e0fc3ffffffffffffffffffffffffffbf8000000000070000000603ffffffffc0 fffffffffff01ff8c00000000000000000061c07ffffffffffffffffffffffffffff000000000007000000007fffffffffc0 fffffffffff03ffd80000000000000000004187fffffffffffffffffffffffffffffc00000000000000000007cffffffffc0 fffffffffff83fc3800000000000000000040ffffffffffffffffffffffffffffffff800000000000000000000ffffffffc0 fffffffffff8ff80800000000000000000005ffffffffffffffffffffffffffffffffc00000000000000000001ffffffffc0 fffffffffff9ffc0800000000000000000007fffffffffffffffffffffffffffffffff00000000000000000003ffffffffc0 ffffffffffffffe080000000000000000061ffffffffffffffffffffffffffffffffff0000000000200000000fffffffffc0 ffffffffffffffff0000000000000000003fffffffffffffffffffffffffffffffffff80000000000000000001ffffffffc0 ffffffffffe3fffc0000000000000000003fffffffffffffffffffffffffffffffffffc00000000000000000018fffffffc0 ffffffffffe1fff80000000000000000007fffffffffffffffffffffffffffffffffffc000000000000000000103ffffffc0 fffffffffff1ff380000000000000000007fffffffffffffffffffffffffffffffffffe000000000000000000003ffffffc0 fffffffffff3fe300000000000000000067ffffffffffffffffffffffffffffffffffff000000000000000000001ffffffc0 ffffffffe7ffe23000000000000000001ffffffffffffffffffffffffffffffffffffffc000000000000000000f1ffffffc0 ffffffffe3ffe230000000000000000007fffffffffffffffffffffffffffffffffffffc000000000000000001ffffffffc0 ffffffffe3fffe00000000000000000007fffffffffffffffffffffffffffffffffffffe000000000000000010ffffffffc0 ffffffffe1ffff0000000000000000004fffffffffffffffffffffffffffffffffffffff0000000000000000007fffffffc0 ffffffffe0fffe0000000000000000003fffffffffffffffffffffffffffffffffffffff8000000000000000007fffffffc0 fffffffff8fffc0000000000000000001fffffffffffffffffffffffffffffffffffffff8000000000000000007fffffffc0 fffffffff9fff80000000000000000003fffffffffffffffffffffffffffffffffffffff8000000000000000007fffffffc0 ffffffffffffc0000000000000000000fffffffffffffffffffffffffffffffffffffffc0000000000000000003fffffffc0 ffffffffffff80000000000000000003fffffffffffffffffffffffffffffffffffffffcc0000000000000000007ffffffc0 ffffffffffff0000000000000000000ffffffffffffffffffffffffffffffffffffffffff0000000000000000001ffffffc0 ffffffffbfff000000000000000000fffffffffffffffffffffffffffffffffffffffffff8000000000000000003ffffffc0 ffffffff9fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffcc000000000000000007ffffffc0 ffffffff9fff800000000000000001fffffffffffffffffffffffffffffffffffffffffc06000000000000000003ffffffc0 ffffffffe7ff800000000000000003fffffffffffffffffffffffffffffffffffffffff03f000000000000000003ffffffc0 ffffffffe7ff800000000000000007fffffffffffffffffffffffffffffffffffffffff0ff800000000000000001ffffffc0 ffffffffe7ff80000000000000001fffffffffffffffffffffffffffffffffffffffffffff8000000000000000007fffffc0 ffffffffffff00000000000000007fffffffffffffffffffffffffffffffffffffffffffffc000000000000000007fffffc0 ffffffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffff000000000000000003cffffc0 fffffffff1f00000000000000003fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000ffffc0 ffffffff31e00000000000000007ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000007fffc0 fffffffe23e00000000000000007fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000027fffc0 fffffffc33c00000000000000007fffffffffffffffffffffffffffffffffffffffffffff800000000000000000003ffffc0 ffffffff3380000000000000001ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000007ffffc0 ffffffff93c0000000000000007ffffffffffffffffffffffffffffffffffffffffffffff80000000000000000003fffffc0 ffffffff83f0000000000000007ffffffffffffffffffffffffffffffffffffffffffffffc2000000000000000001fffffc0 fffffffff3e000000000000000fffffffffffffffffffffffffffffffffffffffffffffffc3c00000000000000001fffffc0 ffffffffe3e000000000000001fffffffffffffffffffffffffffffffffffffffffffffffe3f00000000000000000fffffc0 ffffffffe3e000000000000001fffffffffffffffffffffffffffffffffffffffffffffffe3f800000000000000007ffffc0 fffffcffc3e000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffff800000000000000001ffffc0 fffffe67c1c000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffee000000000000000001ffffc0 fffff267c1c000000000000003ffffffffffffffffffffffffffffffffffffffffffffffff8c000000000000000000ffffc0 fffffbffc1c000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000041ffc0 fffff1ffc18000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000043ffc0 fffffbffc00000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000070ffc0 fffffffff10000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000007fffc0 fffffffff1000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000007fffc0 fffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000001ffffc0 fffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000001ffffc0 ffffff3ff8000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000bfffc0 fffffe11f0000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000001fffc0 ffffff01f0000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffe6000000000000000000fffc0 ffffff83f0000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffc20000000000000000007ffc0 ffffff03f0000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000007ffc0 ffffff03f0000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000007ffc0 ffffffc3f0000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000003ffc0 ffffffe3f0000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000001ffc0 ffffffffee000000000000007fff9fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000063ffc0 fffffffe07000000000000007ffc1fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000003ffc0 ffffffe007000000000000007ff01fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003ffc0 ffffffe202000000000000007c001fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003ffc0 ffffffe30000000000000000f8001fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000ffc0 ffffffe38000000000000001f0000fffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000003fc0 ffffffc7e000000000000001f80003fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000003fc0 fffffffff000000000000000f800003ffffffffffffffffffffffffffffffffffffffffffffff80000000000000000003fc0 fffffffff8000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffff8000000000000000001ffc0 fffffffffe000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffff8000000000000000001ffc0 fffffffff4000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffff8000000000000000001ffc0 ffffffffe0000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffc000000000000000001ffc0 ffffffffe0000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003fc0 fffffffff800000000000000000000fffffffffffffffffffffffffffffffffffffffffffffefc00000000000000000007c0 fffffffffc00000000000000000001fffffffffffffffffffffffffffffffffffffffffffffcfe00000000000000000003c0 fffffffcfc00000000000000000007fffffffffffffffffffffffffffffffffffffffffffffdfe00000000000000000003c0 fffffff87800000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000001f7c0 fffffffc7800000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000001ffc0 fffffffcfc00000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000003fc0 fffffffefe00000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000003fc0 fffffffcfc00000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000037c0 fffffffcfc0000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000003c0 fffffffffc0000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000007c0 fffffffcfc00000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000fc0 fffffc7cf000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffe038000000000000000000fc0 fffffeffe000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffe03c000000000000000000fc0 ffffffffe000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffff0fc000000000000000001fc0 fffffffe6000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000003fc0 fffffffc000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000fc0 fffffe7c000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff80020000000000000007c0 fffffc7fc00000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffffff00000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffffff00000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffdfc600000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffff87cc00000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffc7f800000000000000000039fffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000001c0 ffffffffc0000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffdfc000000000000000000039fffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000001c0 fffffcfc100000000000000000039fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000001c0 fffffefff8000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003c0 fffffffff8000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000004fc0 fffffffffc000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000079c0 fffffffff0000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000010c0 ffffffffe00000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000c0 ffffffffe00000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffdc000000000000000000fc0 fffffffff60000000000000000009ffffffffffffffffffffffffffffffffffffffffffffffff86000000000000000000fc0 fffffffffe000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff86000000000000000000fc0 fffffffffe000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffe06000000000000000000fc0 fffffc7ffe000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffe160000000000000000007c0 fffffcfffe000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffe3e0000000000000000003c0 ffffffffff0000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000003c0 fffffffff90000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000cfc0 fffffffe710000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001ffc0 fffffffe390000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001ffc0 fffffffe390000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000003fc0 ffffff9ffb0000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000fc0 ffffff1fff8000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000e00 ffffffbfff800000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000003fc0 ffffffffff800000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000fc0 ffffffffff8000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000fc0 ffffffffffc000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000fc0 fffffffffec000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000fc0 fffffffffcc000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000fc0 fffffffffc6000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003fc0 fffffffffde000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000007fc0 ffffffffffe000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000fc0 fffffffff86000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000fc0 fffffffffc7000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000001bc0 fffffffffef000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000f1c0 fffffffffff000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000ffc0 fffffffffff000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000ffc0 fffffffffe3e000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000003fc0 fffffffffe1e000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000003dc0 fffffffffe1e000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000030c0 fffffffffe0e000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000001c0 ffffffffff0c000000000000000007fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000010fc0 fffffffffffe00000000000000000fffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000038fc0 ffffffffffde00000000000000001fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000003cfc0 ffffffffff0f00000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001ffc0 ffffffffff0700000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001ffc0 fffffffff182000000000000000007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000ffc0 ffffffffe0800000000000000000018fffffffffffffffffffffffffffffffffffffffffffffc00000000000000000007fc0 ffffffffe080000000000000000003dfffffffffffffffffffffffffffffffffffffffffffff800000000000000000007fc0 fffffffff7f0000000000000000003ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000007fc0 fffffffffffc000000000000000001ffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000f3c0 ffffffffffff800000000000000001ffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000001e1c0 fffffffff8ffc00000000000000001fffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000e3c0 fffffffff07e400000000000000001fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000007fc0 fffffffff03c000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000007fc0 fffffffffc1c400000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000007fc0 ffffffffff3dc000000000000000007fffffffffffffffffffffffffffffffffffffffffffffff8000000000000000007fc0 ffffffffff7fc000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffe000000000000000003fc0 ffffffffffff0000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000fc0 ffffffffffff0000000000000000003fffffffffffffffffffffffffffffffffffffffffffe7ffe000000000000000001fc0 ffffffffff0c0000000000000000007fffffffffffffffffffffffffffffffffffffffffffc7ffe000000000000000001fc0 ffffffffff000000000000000000007ffffffffffffffffffffffffffffffffffffffffffff7ffc000000000000000001fc0 ffffffffff03000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000001fc0 ffffffffff83800000000000000000fffffffffffffffffffffffffffffffffffffffffffff3f8c000000000000000001fc0 ffffffffff878000000000000000003ffffffffffffffffffffffffffffffffffffffffffe60018000000000000000003fc0 ffffffffff078000000000000000001fffffffffffffffffffffffffffffffffffffffffffe0000000000000000000007fc0 ffffffffff038000000000000000001ffffffffffffffffffffffffffffffffffffffffffff0000000000000000000047fc0 ffffffffffc1c000000000000000000ffffffffffffffffffffffffffffffffffffffffffff000000000000000000006ffc0 ffffffffffc3c0000000000000000007ffffffffffffffffffffffffffffffffffffffffff8000000000000000000007ffc0 ffffffffffffc0000000000000000003ffffffffffffffffffffffffffffffffffffffffffc000000000000000000007ffc0 ffffffffffff80000000000000000003fffffffffffffffffffffffffffffffffffffffffff00000000000000000000fffc0 ffffffffffff00000000000000000000fffffffffffffffffffffffffffffffffffffffffff00000000000000000001fffc0 fffffffffffe00000000000000000000fffffffffffffffffffffffffffffffffffffffffffc0000000000000000003fffc0 fffffffffffc000000000000000000007ffffffffffffffffffffffffffffffffffffffffffc0000000000000000003fffc0 fffffffffffc000000000000000000003fffffffffffffffffffffffffffffffffffffffffff0000000000000000001fffc0 fffffffffff8000000000000000000001fffffffffffffffffffffffffffffffffffffffffff0000000000000000001fffc0 fffffffffff8000000000000000000000fffffffffffffffffffffffffffffffffffffffffff0000000000000000001fffc0 fffffffffff00000000000000000000007ffffffffffffffffffffffffffffffffffffffffff0000000000000000003fffc0 fffffffffff00000000000000000000003ffffffffffffffffffffffffffffffffffffffff3e0000000000000000007fffc0 fffffffffff80000000000000000000001fffffffffffffffffffffffffffffffffffffffe1e0000000000000000007fffc0 fffffffffff80000000000000000000000fffffffffffffffffffffffffffffffffffffff81c0000000000000000007fffc0 ffffffffffffc0000000000000000000007ffffffffffffffffffffffffffffffffffffff01c0000000000000000003fffc0 ffffffffffffe0000000000000000000003fffffffffffffffffffffffffffffffffff8ff03c0000000000000000007fffc0 ffffffffffffe0000000000000000000000fffffffffffffffffffffffffffffffffff8ff070000000000000000003ffffc0 ffffffffffffc4000000000000000000000fffffffffffffffffffffffffffffffffff1ff8e0000000000000000003ffffc0 ffffffffffffce0000000000000000000003ffffffffffffffffffffffffffffffffff3ffdc0000000000000000001ffffc0 ffffffffffffc40000000000000000000001ffffffffffffffffffffffffffffffffe7ffff80000000000000000000ffffc0 fffffffffffe4800000000000000000000007fffffffffffffffffffffffffffffff87cfdf80000000000000000007ffffc0 fffffffffffe6800000000000000000000001fffffffffffffffffffffffffffffff8787870000000000000000001fffffc0 fffffffffffe7800000000000000000000000fffffffffffffffffffffffffffffff0fff0000000000000000000013ffffc0 fffffffffffe7c000000000000000000000007ffffffffffffffffffffffffffffff1fff0000000000000000000033ffffc0 ffffffffffff7c000000000000000000000001fffffffffffffffffffffffffffffe1ffc0000000000000000000033ffffc0 fffffffffffffc000000000000000000000001fffffffffffffffffffffffffffffc1ff8000000000000000000003fffffc0 fffffffffffffc0000000000000000000000007ffffffffffffffffffffffffffffc3ff0000000000000000000007fffffc0 fffffffffffffc0000000000000000000000001ffffffffffffffffffffffffffffc3f8000000000000000000000ffffffc0 fffffffffffffe0000000000000000000000000fffffffffffffffffffffffffff8e3f00000000000000000000007fffffc0 fffffffffffffe00000000000000000000000007ffffffffffffffffffffffffff9f3f00000000000000000000007fffffc0 fffffffffffffe00000000000000000000000001ffffffffffffffffffffffffff9fff0000000000000000000000ffffffc0 ffffffffffffff00000000000000000000000000ffffffffffffffffffffffffc7ffff0800000000000000000001ffffffc0 ffffffffffffff800000000000000000000000003fffffffffffffffffffffffffcffff000000000000000000001ffffffc0 ffffffffffffffc00000000000000000000000007fffffffffffffffffffffffff07ffe000000000000000000000ffffffc0 ffffffffffffffc00000000000000000000000007ffffffffffffffffffffffffc0ffe0000000000000000000001ffffffc0 ffffffffffffffc00000000000000000000000007ffffffffffffffffffffffff00ffe000000000000000000000fffffffc0 ffffffffffffffc00000000000000000000000003ffffffffffffffffffffffff03ffc000000000000000000000fffffffc0 ffffffffffffffc00000000000000000000000000ffffffeffffffffffffffffe1fffc000000000000000000001fffffffc0 ffffffffffffffc000000000000000000000000007fffffcffffffffffffffffffffe0000000000000000000001fffffffc0 ffffffffffffffe000000000000000000000000007ffffffffffffffffefe3ffffffc3000000000000000000001fffffffc0 fffffffffffffff0000000000000000000000000007ffffff1ff8fffffc7c7fffff806000000000000000000003fffffffc0 fffffffffffffff0000000000000000000000000007fffffffffc7ffffefffffffe004000000000000000000003fffffffc0 fffffffffffffff00000000000000000000000000041fffffffffffe3fffffffff8000000000000000000000003fffffffc0 fffffffffffffff000000000000000000000000000007ffffffffffcffffffffff0000000000000000000000007fffffffc0 fffffffffffffffe00000000000000000000000000001fffffffffffffffffffff000000000000000000000003ffffffffc0 fffffffffffffffe00000000000000000000000000001ffffffffffffffffffffe000000000000000000000007ffffffffc0 ffffffffffffffff00000000000000000000000000000ffffffffffffffffffffc000000000000000000000007ffffffffc0 ffffffffffffffff800000000000000000000000000007fffffffffffffffffff0000000000000000000000007ffffffffc0 ffffffffffffffffc00000000000000000000000000001ffffffffffffffffffc0000000000000000000000003ffffffffc0 ffffffffffffffffc00000000000000000000000000000ffffffffffffffffff80000000000000000000000003ffffffffc0 ffffffffffffffffc0000000000000000000000000000000fffffffffffffff000000000000000000000000007ffffffffc0 ffffffffffffffffc00000000000000000000000000000007ffffffffffffff00000000000000000000000001fffffffffc0 ffffffffffffffffc00000000000000000000000000000000187ffffffffffc00000000000000000000000003fffffffffc0 ffffffffffffffffe00000000000000000000000000000000003fff3fffff800000000000000000000000000ffffffffffc0 ffffffffffffffffe00000000000000000000000000000000000ff80100fe000000000000000000000000000ffffffffffc0 ffffffffffffffffe00000000000000000000000000000000000300000000000000000000000000000000000ffffffffffc0 ffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000ffffffffffc0 fffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000003ffffffffffc0 fffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000007ffffffffffc0 fffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000fffffffffffc0 fffffffffffffffffc000000000000000000000000000000000000000000000000000000000000000000001fffffffffffc0 fffffffffffffffffc000000000000000000000000000000000000000000000000000000000000000000003fffffffffffc0 fffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000ffffffffffffc0 ffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000001ffffffffffffc0 ffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000003ffffffffffffc0 ffffffffffffffffff80040000000000000000000000000000000000000000000000000000000000000007ffffffffffffc0 ffffffffffffffffff8006000000000000000000000000000000000000000000000000000000000000001fffffffffffffc0 ffffffffffffffffffc000000000000000000000000000000000000000000000000000000000000000001fffffffffffffc0 ffffffffffffffffffc010000000000000000000000000000000000000000000000000000000000000003fffffffffffffc0 ffffffffffffffffffe008000000000000000000000000000000000000000000000000000000000000007fffffffffffffc0 fffffffffffffffffff00c00000000000000000000000000000000000000000000000000000000000001ffffffffffffffc0 fffffffffffffffffff00e00000000000000000000000000000000000000000000000000000000000001ffffffffffffffc0 fffffffffffffffffff10f00000000000000000000000000000000000000000000000000000000000001ffffffffffffffc0 ffffffffffffffffffff0700000000000000000000000000000000000000000000000000000000000001ffffffffffffffc0 ffffffffffffffffffff8380000000000000000000000000000000000000000000000000000000000003ffffffffffffffc0 ffffffffffffffffffff81e0000000000000000000000000000000000000000000000000000000000003ffffffffffffffc0 ffffffffffffffffffff81e4000000000000000000000000000000000000000000000000000000000007ffffffffffffffc0 ffffffffffffffffffff81ffc0000000000000000000000000000000000000000000000000000000023fffffffffffffffc0 fffffffffffffffffffffdfce000000000000000000000000000000000000000000000000000000007ffffffffffffffffc0 fffffffffffffffffffffcf83800000000000000000000000000000000000000000000000000000007ffffffffffffffffc0 fffffffffffffffffffffc383800000000000000000000000000000000000000000000000000000007ffffffffffffffffc0 fffffffffffffffffffffc1ff00000000000000000000000000000000000000000000000000000000fffffffffffffffffc0 fffffffffffffffffffffc1fe18000000000000000000000000000000000000000000000000000003fffffffffffffffffc0 fffffffffffffffffffffe0ff9c00000000000000000000000000000000000000000000000000001ffffffffffffffffffc0 ffffffffffffffffffffff8ffcf80000000000000000000000000000000000000000000000000003ffffffffffffffffffc0 ffffffffffffffffffffffcffc7e000000000000000000000000000000000000000000000000000fffffffffffffffffffc0 fffffffffffffffffffffff9fffc800000000000000000000000000000000000000000000000007fffffffffffffffffffc0 fffffffffffffffffffffff07fe0000000000000000000000000000000000000000000000000003fffffffffffffffffffc0 fffffffffffffffffffffff03fe0000000000000000000000000000000000000000000000000003fffffffffffffffffffc0 fffffffffffffffffffffff81ff0000000000000000000000000000000000000000000000000007fffffffffffffffffffc0 fffffffffffffffffffffffc1ff800000000000000000000000000000000000000000000000000ffffffffffffffffffffc0 fffffffffffffffffffffffc1ffc00000000000000000000000000000000000000000000000003ffffffffffffffffffffc0 fffffffffffffffffffffffe0ffe00000000000000000000000000000000000000000000000007ffffffffffffffffffffc0 ffffffffffffffffffffffff0fffe0000000000000000000000000000000000000000000000007ffffffffffffffffffffc0 ffffffffffffffffffffffffc7fff0600000000000000000000000000000000000000000000007ffffffffffffffffffffc0 ffffffffffffffffffffffffe1fff0400000000000000000000000000000000000000000000007ffffffffffffffffffffc0 ffffffffffffffffffffffffe07ffc00000000000000000000000000000000000000000000000ffe7fffffffffffffffffc0 ffffffffffffffffffffffffe03fff80000000000000000000000000000000000000000000007ffcffffffffffffffffffc0 fffffffffffffffffffffffff01fff8738000000000000000000000000000000000000000001ffffffffffffffffffffffc0 fffffffffffffffffffffffffe0f9ffffc000000000000000000000000000000000000000001ffc7ffffffffffffffffffc0 ffffffffffffffffffffffffff079ffffc000000000000000000000000000000000000000003ff0fffffffffffffffffffc0 ffffffffffffffffffffffffff03ffffe0000000000000000000000000000000000000000007fc3fffffffffffffffffffc0 ffffffffffffffffffffffffff81ffffc0000000000000000000000000000000000000000007e07fffffffffffffffffffc0 ffffffffffffffffffffffffffe07fffc000000000000000000000000000000000000000000300ffffffffffffffffffffc0 ffffffffffffffffffffffffffe03fffc0e0000000000000000000000000000000000000000003ffffffffffffffffffffc0 fffffffffffffffffffffffffff81fffc0c0000000000000000000000000000000000000000003ffffffffffffffffffffc0 fffffffffffffffffffffffffffc0fffe000000000000000000000000000000000000000000007ffffffffffffffffffffc0 fffffffffffffffffffffffffffe03fff80000000000000000000000000000000000000000701fffffffffffffffffffffc0 ffffffffffffffffffffffffffff80fffe0400000000000000000000000000000000000000fd7fffffffffffffffffffffc0 ffffffffffffffffffffffffffff807fff1e00000000000000000000000000000000000007ffffffffffffffffffffffffc0 fffffffffffffffffffffffffffff01fffff000000000000000000000000000000000000ffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffff80ffffff8000000000000000000000000000000000fffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffe03ffffffd0000000000000000000000000000003ffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffff80fffffff000000000000000000000000000041fffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffe03ffffff000000000000000000000000000ffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffff01ffffff870000000000000000018000010ffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffc07fffffff0000000000000000038000011ffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffff03fffffff020000000000000007c0e063fffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffc3fffffff0f820000000000000fdf007ffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffffff3fe78000000000000f1e007ffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffbffffffffffc01e00000000fffc5fffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffff0ffffffffffc0fe0000c003ffffffffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffff03ffffffffffffc0001ff9fffffffffffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffff80fffffffffff80171ffffffffffffffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffe03fffffffffff8fffffffffffffffffffffffffffffffffffffffffffffffc0 fffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0 > } image grestore showpage grestore end } def 9base-6/troff/font/devutf/charlib/_f_f0000644000175000017500000000007411402154555017352 0ustar anselmanselm/build_ff { pop size .05 mul neg 0 (ff) ashow } def 9base-6/troff/font/devutf/charlib/F_i0000644000175000017500000000007511402154555017157 0ustar anselmanselm/build_Fi { pop size .05 mul neg 0 (ffi) ashow } def 9base-6/troff/font/devutf/charlib/PC0000644000175000017500000000073511402154555016767 0ustar anselmanselm% % UMDS pencil - needs to be cleaned up. % /build_PC { pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale newpath 0 setlinecap 1 setlinejoin 2 setlinewidth 0 1 moveto 12 0 rlineto stroke 0 5 moveto 12 0 rlineto stroke 0 9 moveto 12 0 rlineto stroke 1 setlinewidth 12 .5 moveto 21.27362 5 lineto 12 9.5 lineto stroke 21.27362 5 moveto .4 9.27362 mul neg .4 4 mul rlineto 0 .8 4 mul neg rlineto closepath fill grestore } def 9base-6/troff/font/devutf/charlib/S_l0000644000175000017500000000263111402154555017177 0ustar anselmanselm/build_Sl { pop gsave size .0022 mul dup scale currentpoint translate 14 93 moveto 14 96 lineto 29 110 lineto 44 121 lineto 54 127 lineto 55 132 lineto 57 146 lineto 59 157 lineto 62 171 lineto 66 186 lineto 70 199 lineto 75 213 lineto 81 228 lineto 88 243 lineto 96 257 lineto 106 272 lineto 118 287 lineto 133 300 lineto 148 307 lineto 163 308 lineto 178 304 lineto 191 293 lineto 197 281 lineto 198 277 lineto 198 260 lineto 194 246 lineto 187 231 lineto 179 217 lineto 168 202 lineto 155 187 lineto 141 172 lineto 126 158 lineto 111 146 lineto 96 136 lineto 94 131 lineto 93 123 lineto 92 112 lineto 91 103 lineto 90 93 lineto 89 81 lineto 89 40 lineto 92 28 lineto 97 18 lineto 108 10 lineto 122 10 lineto 134 18 lineto 145 33 lineto 152 48 lineto 158 62 lineto 168 58 lineto 168 59 lineto 163 45 lineto 157 31 lineto 148 16 lineto 133 3 lineto 118 -1 lineto 103 0 lineto 88 5 lineto 73 18 lineto 64 31 lineto 58 46 lineto 55 59 lineto 53 73 lineto 52 111 lineto 37 101 lineto 22 86 lineto 14 93 lineto 97 152 moveto 97 153 lineto 99 166 lineto 101 178 lineto 103 190 lineto 106 205 lineto 109 218 lineto 113 232 lineto 118 246 lineto 124 261 lineto 132 275 lineto 144 290 lineto 157 298 lineto 171 298 lineto 181 291 lineto 186 283 lineto 187 279 lineto 187 264 lineto 186 260 lineto 181 246 lineto 174 233 lineto 165 218 lineto 155 204 lineto 142 190 lineto 127 175 lineto 112 162 lineto 97 152 lineto eofill grestore } def 9base-6/troff/font/devutf/charlib/_l_c0000644000175000017500000000171611402154555017361 0ustar anselmanselm% % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_lc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 0 get bvbbox 1 get moveto bvbbox 0 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul add dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul 0 rlineto 0 exch neg rlineto 8 mul neg 0 rlineto closepath clip eofill grestore } def 9base-6/troff/font/devutf/charlib/_lH0000644000175000017500000000440411402154555017164 0ustar anselmanselm/build_lH { pop gsave size .0022 mul dup scale currentpoint translate 16 177 moveto 16 188 lineto 21 193 lineto 30 193 lineto 34 189 lineto 36 183 lineto 36 180 lineto 34 174 lineto 27 170 lineto 19 172 lineto 16 177 lineto fill 38 194 moveto 38 196 lineto 53 199 lineto 68 201 lineto 83 202 lineto 98 203 lineto 113 204 lineto 128 204 lineto 143 205 lineto 158 205 lineto 173 205 lineto 188 204 lineto 203 203 lineto 218 202 lineto 233 200 lineto 248 198 lineto 263 196 lineto 278 194 lineto 293 190 lineto 308 186 lineto 323 181 lineto 338 176 lineto 353 168 lineto 361 162 lineto 364 153 lineto 366 138 lineto 367 126 lineto 368 106 lineto 369 80 lineto 369 74 lineto 368 60 lineto 367 54 lineto 362 43 lineto 348 34 lineto 333 28 lineto 318 25 lineto 303 26 lineto 288 29 lineto 273 31 lineto 258 32 lineto 243 32 lineto 228 30 lineto 213 27 lineto 198 24 lineto 183 23 lineto 168 23 lineto 153 27 lineto 148 34 lineto 148 47 lineto 153 54 lineto 168 58 lineto 183 58 lineto 198 58 lineto 213 59 lineto 226 60 lineto 228 62 lineto 228 67 lineto 223 71 lineto 208 71 lineto 193 70 lineto 178 70 lineto 163 70 lineto 148 70 lineto 133 71 lineto 123 76 lineto 120 84 lineto 120 91 lineto 122 98 lineto 129 104 lineto 144 106 lineto 159 107 lineto 174 107 lineto 189 107 lineto 202 108 lineto 204 110 lineto 204 117 lineto 201 119 lineto 186 119 lineto 171 119 lineto 156 119 lineto 141 119 lineto 126 119 lineto 111 121 lineto 103 128 lineto 101 137 lineto 101 142 lineto 103 150 lineto 111 158 lineto 126 161 lineto 141 161 lineto 156 162 lineto 171 163 lineto 186 163 lineto 191 165 lineto 192 167 lineto 192 171 lineto 190 174 lineto 176 175 lineto 161 175 lineto 146 175 lineto 131 174 lineto 116 174 lineto 101 174 lineto 86 173 lineto 71 172 lineto 56 171 lineto 41 171 lineto 41 174 lineto 43 178 lineto 43 187 lineto 38 194 lineto fill 373 169 moveto 373 176 lineto 375 182 lineto 386 190 lineto 401 193 lineto 408 191 lineto 411 185 lineto 412 181 lineto 414 167 lineto 415 158 lineto 416 144 lineto 417 128 lineto 418 110 lineto 418 60 lineto 417 45 lineto 415 37 lineto 409 34 lineto 394 31 lineto 381 35 lineto 379 42 lineto 379 52 lineto 380 67 lineto 380 77 lineto 379 77 lineto 378 106 lineto 377 121 lineto 376 133 lineto 375 147 lineto 374 158 lineto 373 169 lineto fill grestore } def 9base-6/troff/font/devutf/charlib/LV0000644000175000017500000001472611402154555017013 0ustar anselmanselm% % PostScript 12 and 8 line logos - vertical configuration. Switch occurs % automatically below point size 29. Code from Matthijs Melchior. % /LOGO-dict-mm where not { 64 dict /LOGO-dict-mm exch def }{pop} ifelse LOGO-dict-mm begin % initialize dictionary /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def /l { lineto } def /rl { rlineto } def /m { moveto } def /rm { rmoveto } def /C { closepath } def /c { curveto } def /rc { rcurveto } def /T { m 0 29 rl -9.5 0 rl 0 7 rl 29 0 rl 0 -7 rl -9.5 0 rl 0 -29 rl C } def /ATT { newpath 1 36 div dup scale 0 0 m 12 36 rl 8 0 rl -11 -36 rl C 25 0 m -11 36 rl 8 0 rl 12 -36 rl C 10 7 m 0 7 rl 14 0 rl 0 -7 rl C 36 0 T 80 6 m -3 0 -5 1.2 -6 2 rc -12 10 rl -2.4 2 -2.7 6 0 6 rc 1 0 2 -1 2 -2 rc 0 -4 rl 7 0 rl 0 4 rl 0 5 -3 7 -9 7 rc -6 0 -9 -3 -9 -7 rc 0 -2 0 -3.6 2 -6 rc 12 -10 rl 6 -5 10 -6 13 -6 rc C 71 18 m 0 -6 rl 0 -5 -3 -7 -7 -7 rc -3 0 -5 2 -5 4 rc 0 1 0 3 2 4 rc -4 5 rl -4 -2 -6 -6 -6 -9 rc 0 -7 6 -10 13 -10 rc 9 0 14 6 14 11 rc 0 8 rl C 82 0 T 36 dup scale } def end /build_LV { % standard ATT logo LOGO-dict-mm begin /w exch def ptsize 29 lt % select globe, # lines depends on point size { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale gsave 1.02 1 transform round exch round exch itransform translate globe fill grestore gsave %2.15 .62 translate -0.1 -1.0 translate .78 dup scale ATT fill grestore grestore end } def 9base-6/troff/font/devutf/charlib/LH.example0000644000175000017500000001052111402154555020414 0ustar anselmanselm% % An example logo character. Building the PostScript program that prints % your company logo is not addressed here; we assume you already have % such a program, that it's relatively simple, and that it prints the % logo by itself on a page. What you'll find here are instructions for % converting that logo program into a character that can be accessed by % troff and dpost. % % Building a new charlib character involves some PostScript programming. % We've tried to isolate parameters that you'll need to change (Xoffset, % Yoffset, and Scaling), but we can't guarantee things will work properly % with every logo program. PostScript is a complex language and subtle % interactions between your logo program and what we've done here can % cause problems. % % Tuning the new character is an iterative process. You may want to adjust % the size of the logo (via Scaling), it's position relative to adjacent % characters and the baseline (Xoffset and Yoffset), and the distance troff % moves after printing the character (width field in file ../S1). The steps % to follow are: % % 1: Create a simple troff test file for the new character. Something % like, % % .sp 1i % .ps 10 % size 10: \(LH % .sp 1i % .ps 18 % size 18: \(LH % .sp 1i % .ps 36 % size 36: \(LH % .sp 1i % .ps 10 % four logo characters: \(LH\(LH\(LH\(LH % % is sufficient. The test file can go anywhere. % % 2: Change into directory /usr/lib/font/devpost/charlib. All file % pathnames will be relative to that directory. % % 3: Save a copy of the working LH logo file. Then replace LH with % this file (i.e. LH.example). Changes described below should be % be made in the new LH file (not in LH.example). % % 4: Your PostScript logo program will eventually replace whatever % you find between the <> and <> comment lines % in the PostScript build_LH procedure (below). What's there now % prints an example logo that you can use until you understand the % remaining steps. % % 5: Print your troff test file using (assuming your making changes % in the devpost charlib directory), % % troff -Tpost testfile | dpost | lp ... % % 6: Adjust the logo positioning by changing the numbers assigned to % Xoffset and Yoffset (below). Both are in units of 72 per inch. % Positive offsets should move the logo to the right and up the % page. % % 7: Adjust the logo size by changing the the number assigned to % Scaling. Unitsize also controls scaling, but there's no good % reason to change both Scaling and Unitsize. % % 8: Control the horizontal distance troff moves after printing the % new LH character by changing the width (i.e. the number in the % second column) assigned to LH in file ../S1. Character width % adjustments should probably wait until you're satisfied with % the Scaling set in step 7. % % 9: Back to step 5 until your satisfied with the output. % % The remaining steps are suggested but not required: % % 10: Delete PostScript comments in your new LH charlib file - comments % start with % and go to the end of the line. % % 11: Update the width field assigned to LH in file ../shell.lib. The % new width should reflect what's currently in your S1 font file. % % 12: Make a similiar set of changes in /usr/lib/font/devLatin1/charlib. % You can use the devpost version of LH to devLatin1/charlib/LH, % but changes to files devLatin1/S1 and devLatin1/shell.lib must be % entered by hand. % /Logo_Dict 100 dict dup begin /Xoffset 0 def % 72 dpi with positive to the right /Yoffset 0 def % 72 dpi with positive up the page /Scaling 1.0 def % adjust this number to change the size /Unitsize 36 def % for point size scaling - leave it be /showpage {} def end def /build_LH { % don't bind this procedure Logo_Dict begin gsave /charwidth exch def currentpoint translate resolution 72 div dup scale Xoffset Yoffset translate Scaling Scaling scale ptsize Unitsize div dup scale %% Replace everything between the <> and <> %% comment lines by the PostScript program that prints your %% logo. %% <> newpath .5 .5 scale 0 0 moveto 100 0 lineto 100 100 lineto closepath .5 setgray fill 0 setgray 10 10 translate 45 rotate 0 5 moveto /Helvetica findfont 18 scalefont setfont (Example Logo) show %% <> grestore end } def 9base-6/troff/font/devutf/charlib/F_l0000644000175000017500000000007511402154555017162 0ustar anselmanselm/build_Fl { pop size .05 mul neg 0 (ffl) ashow } def 9base-6/troff/font/devutf/charlib/140000644000175000017500000000042111402154555016701 0ustar anselmanselm/build_14 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 9base-6/troff/font/devutf/charlib/L10000644000175000017500000001253611402154555016743 0ustar anselmanselm/LOGO-dict-mm dup where not { dup 64 dict def currentdict } if exch get begin /globesetup { /r exch def /N exch def /d 2 N r mul N 1 sub add div def /h d r mul def } def /mkabs { /yp exch def /xl exch def dup dup 0 get xl mul 0 exch put dup dup 1 get h mul yp add 1 exch put dup dup 2 get xl mul 2 exch put dup dup 3 get h mul yp add 3 exch put dup dup 4 get xl mul 4 exch put dup dup 5 get h mul yp add 5 exch put } def /topsegment { /n exch def /y n r mul n .5 add add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 180 a sub /arc load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /botsegment { /n exch 1 add def /y n r mul n .5 sub add d mul def /a y 1 y dup mul sub sqrt atan def /x a cos def /c2 exch x y mkabs def /ly1 exch h mul y add def /lx1 exch x abs mul def /c1 exch x y mkabs def x y /moveto load 0 0 1 a 540 a sub /arcn load c1 aload pop /curveto load lx1 ly1 /lineto load c2 aload pop /curveto load /closepath load } def /segment { /n exch def /dh exch 1 exch sub 2 div def /ylb n r mul n 0.5 add add d mul def /ylt ylb h add def /yrb ylb h dh mul add def /yrt ylt h dh mul sub def /alb ylb 1 ylb dup mul sub sqrt atan def /alt ylt 1 ylt dup mul sub sqrt atan def /arb yrb 1 yrb dup mul sub sqrt atan 180 exch sub def /art yrt 1 yrt dup mul sub sqrt atan 180 exch sub def /xlb alb cos def /xlt alt cos def /xrb arb cos def /xrt art cos def /c4 exch xrb abs ylb mkabs def /ly2 exch h mul ylb add def /lx2 exch xrb abs mul def /c3 exch xrb abs ylb mkabs def /c2 exch xrt abs ylt mkabs def /ly1 exch h mul ylt add def /lx1 exch xrt abs mul def /c1 exch xrt abs ylt mkabs def xlb ylb /moveto load 0 0 1 alb alt /arc load c2 4 get c2 5 get /lineto load c2 2 get c2 3 get c2 0 get c2 1 get lx1 ly1 /curveto load c1 4 get c1 5 get /lineto load c1 2 get c1 3 get c1 0 get c1 1 get xrt yrt /curveto load 0 0 1 art arb /arc load c3 aload pop /curveto load lx2 ly2 /lineto load c4 aload pop /curveto load /closepath load } def 8 2.5 globesetup /globe8 [ /newpath load [ -.9 .1 -.6 .2 -.5 .2 ] -.5 .2 [ -.4 .2 .0 .0 .4 .0 ] 3 topsegment [ -.9 -.35 -.85 -.35 -.8 -.35 ] -.1 -.35 [ .1 -.35 .3 .0 .5 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] -.1 .35 [ .1 .35 .4 .0 .55 .0 ] .55 2 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .05 -.35 [ .2 -.35 .4 .0 .55 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .05 .35 [ .2 .35 .45 .0 .6 .0 ] .7 1 segment [ -.8 -.35 -.75 -.35 -.7 -.35 ] .0 -.35 [ .15 -.35 .4 .0 .6 .0 ] [ -.8 .35 -.75 .35 -.7 .35 ] .0 .35 [ .15 .35 .4 .0 .6 .0 ] .7 0 segment [ -.7 -.35 -.65 -.35 -.6 -.35 ] -.1 -.35 [ .05 -.35 .35 .0 .55 .0 ] [ -.7 .35 -.65 .35 -.6 .35 ] -.1 .35 [ .05 .35 .25 .0 .4 .0 ] .8 -1 segment [ -.65 -.2 -.55 -.2 -.45 -.2 ] -.3 -.2 [ -.2 -.2 .2 .0 .3 .0 ] [ -.65 .1 -.55 .1 -.45 .1 ] -.45 .1 [ -.3 .1 -.1 .0 .0 .0 ] .96 -2 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -4 botsegment ] cvx def 12 3 globesetup /globe12 [ /newpath load [ -.8 .2 -.7 .25 -.5 .25 ] -.4 .25 [ -.2 .25 .0 .0 .2 .0 ] 5 topsegment [ -.7 -.35 -.7 -.35 -.6 -.35 ] -.3 -.35 [ -.1 -.35 .3 .0 .55 .0 ] [ -.7 .35 -.7 .35 -.6 .35 ] -.25 .35 [ -.05 .35 .4 .0 .55 .0 ] .6 4 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] -.1 -.35 [ .1 -.35 .4 .0 .5 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] -.1 .35 [ .1 .35 .4 .0 .5 .0 ] .7 3 segment [ -.8 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.8 .35 -.7 .35 -.6 .35 ] .0 .35 [ .15 .35 .4 .0 .5 .0 ] .8 2 segment [ -.75 -.35 -.7 -.35 -.6 -.35 ] .0 -.35 [ .2 -.35 .4 .0 .5 .0 ] [ -.75 .35 -.7 .35 -.6 .35 ] .0 .35 [ .2 .35 .45 .0 .55 .0 ] .9 1 segment [ -.7 -.35 -.6 -.35 -.55 -.35 ] .0 -.35 [ .1 -.35 .45 .0 .55 .0 ] [ -.7 .35 -.6 .35 -.55 .35 ] .0 .35 [ .1 .35 .5 .0 .6 .0 ] .9 0 segment ] cvx [ [ -.7 -.35 -.6 -.35 -.5 -.35 ] -.15 -.35 [ .0 -.35 .4 .0 .5 .0 ] [ -.65 .35 -.55 .35 -.45 .35 ] -.15 .35 [ .0 .35 .35 .0 .45 .0 ] .9 -1 segment [ -.8 -.1 -.5 -.3 -.4 -.3 ] -.2 -.3 [ .0 -.3 .3 .0 .4 .0 ] [ -.8 .1 -.5 .3 -.4 .3 ] -.2 .3 [ .0 .3 .2 .0 .3 .0 ] 1 -2 segment [ -.7 -.1 -.5 -.15 -.4 -.15 ] -.3 -.15 [ -.2 -.15 .0 .0 .2 .0 ] [ -.7 .05 -.5 .1 -.4 .1 ] -.4 .1 [ -.3 .1 .0 .0 .2 .0 ] 1 -3 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -4 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] 1 -5 segment [ .0 .0 .0 .0 .0 .0 ] .0 .0 [ .0 .0 .0 .0 .0 .0 ] -6 botsegment ] cvx 4 array cvx dup 0 5 -1 roll put dup 1 /exec load put dup 2 4 -1 roll put dup 3 /exec load put def end /build_L1 { pop LOGO-dict-mm begin ptsize 29 lt { /globe /globe8 load def } { /globe /globe12 load def } ifelse gsave currentpoint translate size 2 div dup scale 1.02 1 transform round exch round exch itransform translate globe fill grestore end } def 9base-6/troff/font/devutf/charlib/_o_b0000644000175000017500000000022211402154555017352 0ustar anselmanselm/build_ob { pop size 3 mul 16 div /rad exch def currentpoint newpath rad add exch rad add exch rad 0 360 arc stroke } def 9base-6/troff/font/devutf/charlib/120000644000175000017500000000042111402154555016677 0ustar anselmanselm/build_12 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (1) show rmoveto optsize R f (\244) show f (2) show optsize ofont f } def 9base-6/troff/font/devutf/charlib/_r_f0000644000175000017500000000171211402154555017366 0ustar anselmanselm% % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rf { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 1 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 9base-6/troff/font/devutf/charlib/340000644000175000017500000000042111402154555016703 0ustar anselmanselm/build_34 { pop /optsize ptsize def /osize size def /ofont font def optsize 2 div dup R exch R f 0 size 2 mul 3 div dup neg exch 0 exch rmoveto (3) show rmoveto optsize R f (\244) show f (4) show optsize ofont f } def 9base-6/troff/font/devutf/charlib/DG0000644000175000017500000000105111402154555016747 0ustar anselmanselm% % UMDS danger sign - needs to be cleaned up! % /build_DG { /x0 1.5 6 div 72 mul def % triangle length pop gsave currentpoint translate 1 scaling div ptsize 10 div mul dup scale 2 setlinewidth 0 setlinecap newpath 0 0 moveto x0 0 lineto x0 2 div x0 3 sqrt 2 div mul lineto closepath fill 1 setgray /Helvetica-Bold findfont 12 scalefont setfont 0 0 moveto (!) false charpath pathbbox exch 4 -1 roll add 2 div x0 2 div exch sub 0 moveto exch sub x0 3 sqrt 2 div mul exch sub 3 div 0 exch rmoveto (!) show grestore } def 9base-6/troff/font/devutf/charlib/README0000644000175000017500000000117311402154555017417 0ustar anselmanselmPostscript definitions for special troff characters. File names are the two character troff names. Each defines a PostScript procedure that begins with build_ and ends with the character's name. The build_?? procedure is called with the character width as it's only argument. The .map files contain extra character data (e.g. image data) that dpost downloads immediately after the build_?? call, if the character's font table code field is 2 (rather than 1). The following PostScript variables are available: font current font ptsize current point size size actual font size - scaled up from ptsize Don't overuse this stuff! 9base-6/troff/font/devutf/charlib/_b_x0000644000175000017500000000026411402154555017371 0ustar anselmanselm/build_bx { pop size 2 div /side exch def currentpoint newpath moveto 0 side rlineto side 0 rlineto 0 side neg rlineto closepath fill } def 9base-6/troff/font/devutf/charlib/_rH0000644000175000017500000000416311402154555017174 0ustar anselmanselm/build_rH { pop gsave size .0022 mul dup scale currentpoint translate 15 66 moveto 15 86 lineto 16 131 lineto 17 146 lineto 18 158 lineto 19 167 lineto 21 181 lineto 24 190 lineto 34 193 lineto 49 189 lineto 58 182 lineto 60 177 lineto 60 166 lineto 59 156 lineto 58 143 lineto 57 130 lineto 56 117 lineto 55 102 lineto 54 42 lineto 53 39 lineto 49 35 lineto 34 34 lineto 19 39 lineto 16 47 lineto 15 66 lineto fill 65 60 moveto 65 111 lineto 66 127 lineto 67 139 lineto 69 153 lineto 72 163 lineto 83 171 lineto 98 177 lineto 113 182 lineto 128 187 lineto 143 190 lineto 158 194 lineto 173 196 lineto 188 199 lineto 203 201 lineto 218 203 lineto 233 205 lineto 248 205 lineto 263 206 lineto 278 206 lineto 293 206 lineto 308 206 lineto 323 206 lineto 338 205 lineto 353 203 lineto 368 202 lineto 383 200 lineto 394 197 lineto 389 190 lineto 389 180 lineto 391 176 lineto 391 173 lineto 380 173 lineto 365 173 lineto 350 174 lineto 335 175 lineto 320 176 lineto 305 176 lineto 290 176 lineto 275 177 lineto 260 177 lineto 245 177 lineto 240 173 lineto 240 170 lineto 245 165 lineto 260 164 lineto 275 164 lineto 290 164 lineto 305 163 lineto 320 160 lineto 327 155 lineto 330 149 lineto 330 134 lineto 328 129 lineto 323 124 lineto 309 121 lineto 294 121 lineto 279 121 lineto 264 121 lineto 249 121 lineto 234 121 lineto 228 118 lineto 228 112 lineto 234 109 lineto 249 109 lineto 264 109 lineto 279 108 lineto 294 108 lineto 306 104 lineto 311 97 lineto 312 91 lineto 312 88 lineto 311 82 lineto 305 74 lineto 290 72 lineto 275 72 lineto 260 72 lineto 245 73 lineto 230 73 lineto 215 73 lineto 205 70 lineto 205 63 lineto 217 60 lineto 232 60 lineto 247 60 lineto 262 60 lineto 277 57 lineto 283 52 lineto 285 44 lineto 285 41 lineto 284 35 lineto 280 30 lineto 268 26 lineto 253 25 lineto 238 26 lineto 223 28 lineto 208 31 lineto 193 33 lineto 178 34 lineto 163 33 lineto 148 31 lineto 133 28 lineto 118 27 lineto 103 28 lineto 88 34 lineto 73 43 lineto 67 52 lineto 65 60 lineto fill 396 180 moveto 396 188 lineto 399 194 lineto 410 196 lineto 416 190 lineto 416 180 lineto 415 177 lineto 411 173 lineto 400 173 lineto 396 180 lineto fill grestore } def 9base-6/troff/font/devutf/charlib/_p_w0000644000175000017500000000610311402154555017404 0ustar anselmanselm%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 1 -1 199 258 %%Creator: MetaPost %%CreationDate: 1994.06.28:1046 /pjw1{ 37 211 moveto 37 206 lineto 41 206 lineto 43 212 lineto 44 212 46 212 46 210 curveto 41 198 35 186 35 174 curveto 50 174 66 175 81 173 curveto 81 171 lineto 61 171 lineto 61 170 lineto 86 170 lineto 88 168 89 166 90 164 curveto 101 164 111 169 122 172 curveto 139 172 lineto 125 194 115 219 93 233 curveto 87 234 80 236 74 235 curveto 64 229 54 224 46 217 curveto 45 217 44 217 44 218 curveto 61 242 lineto 67 248 72 258 82 258 curveto 94 257 107 256 119 254 curveto 134 247 147 239 161 231 curveto 180 231 lineto 180 226 174 228 171 226 curveto 178 220 185 214 192 207 curveto 189 207 187 207 187 205 curveto 190 205 193 204 196 203 curveto 198 193 202 181 193 181 curveto 193 177 198 175 198 171 curveto 196 171 194 171 194 169 curveto 195 165 196 161 198 157 curveto 194 147 193 135 184 130 curveto 180 130 lineto 169 107 lineto 171 103 176 104 180 104 curveto 180 93 176 81 166 76 curveto 162 76 157 77 155 80 curveto 153 80 152 80 151 80 curveto 151 71 lineto 155 71 lineto 155 68 153 65 152 63 curveto 145 62 lineto 141 47 144 31 144 15 curveto 141 0 lineto 124 0 107 -1 90 1 curveto 72 36 lineto 86 48 105 49 122 54 curveto 122 54 lineto 110 61 97 65 84 69 curveto 81 71 78 73 78 76 curveto 86 77 93 77 101 77 curveto 106 79 113 79 113 84 curveto 95 86 77 87 59 89 curveto 59 92 61 95 64 95 curveto 69 88 80 92 89 92 curveto 95 92 104 90 104 96 curveto 93 97 lineto 87 103 82 109 77 115 curveto 89 116 101 117 113 118 curveto 99 154 lineto 90 154 87 144 82 138 curveto 77 132 73 124 66 120 curveto 63 120 59 119 59 122 curveto 62 123 66 123 66 126 curveto 58 126 50 127 42 128 curveto 34 137 lineto 34 140 34 144 31 144 curveto 30 135 31 125 31 116 curveto 25 116 22 122 19 127 curveto 16 131 15 136 12 139 curveto 5 139 15 127 9 127 curveto 3 133 3 142 1 150 curveto 1 158 6 166 9 173 curveto 18 186 25 199 35 211 curveto closepath } bind def /pjw2{ 27 112 moveto 40 75 lineto 40 74 38 73 37 73 curveto 25 87 lineto 17 112 lineto closepath 43 154 moveto 43 167 lineto 41 167 38 167 39 169 curveto 57 171 lineto 74 167 lineto 74 166 73 165 72 165 curveto 64 164 56 162 49 158 curveto 48 154 45 149 49 149 curveto 51 151 53 152 55 154 curveto 87 153 lineto 87 144 80 136 74 129 curveto 64 128 53 126 43 129 curveto 37 135 lineto 37 138 36 141 36 145 curveto 40 145 lineto 41 148 42 151 43 154 curveto closepath 108 145 moveto 119 145 130 143 141 140 curveto 146 134 155 129 149 126 curveto 138 124 126 123 116 129 curveto 113 134 108 139 108 145 curveto closepath 114 96 moveto 116 103 118 110 121 117 curveto 128 117 134 112 139 107 curveto 139 101 137 96 132 93 curveto closepath 134 162 moveto 115 162 lineto 115 162 115 163 115 164 curveto 134 164 lineto closepath 117 73 moveto 115 78 121 81 125 85 curveto 129 85 lineto 130 83 131 81 131 79 curveto 128 74 lineto 124 74 121 73 117 73 curveto closepath 141 119 moveto 134 119 126 117 126 123 curveto 131 123 136 122 141 121 curveto closepath } bind def /build_pw { pop gsave size .0028 mul dup scale currentpoint translate pjw1 pjw2 eofill grestore } bind def 9base-6/troff/font/devutf/charlib/_r_c0000644000175000017500000000171611402154555017367 0ustar anselmanselm% % This stuff has gotten terribly complicated - sorry. % currentdict /bvbbox known not {/bvbbox [0 0 0 0 0 0 0] def} if /build_rc { pop gsave currentpoint translate newpath bvbbox 6 get size ne { gsave initgraphics scaling scaling scale 0 0 moveto (\357) false charpath flattenpath pathbbox 0 0 size bvbbox astore pop 0 1 idtransform dup mul exch dup mul add sqrt dup bvbbox 1 get add bvbbox 1 3 -1 roll put bvbbox 3 get exch sub bvbbox 3 3 -1 roll put bvbbox 2 get bvbbox 0 get sub bvbbox 4 3 -1 roll put bvbbox 2 get bvbbox 0 get add 2 div bvbbox 5 3 -1 roll put grestore } if bvbbox 2 get bvbbox 1 get moveto bvbbox 2 get bvbbox 3 get lineto bvbbox 5 get bvbbox 4 get 8 mul sub dup bvbbox 3 get lineto bvbbox 1 get lineto closepath clip newpath 0 0 moveto (\357) show bvbbox 5 get bvbbox 3 get moveto bvbbox 4 get dup dup 8 mul neg 0 rlineto 0 exch neg rlineto 8 mul 0 rlineto closepath clip eofill grestore } def 9base-6/troff/font/devutf/charlib/RC0000644000175000017500000000032711402154555016766 0ustar anselmanselm/build_RC { pop size 4 div /side exch def currentpoint newpath moveto 0 side 1.5 mul rmoveto 0 side rlineto side 2.5 mul 0 rlineto 0 side neg rlineto closepath fill } def 9base-6/troff/ni.c0000644000175000017500000002044011402154555013440 0ustar anselmanselm#include #include "tdef.h" #include "fns.h" #include "ext.h" char termtab[NS]; /* term type added in ptinit() */ char fontdir[NS]; /* added in casefp; not used by nroff */ char devname[20]; /* default output device */ Numtab numtab[NN] = { { PAIR('%', 0) }, { PAIR('n', 'l') }, { PAIR('y', 'r') }, { PAIR('h', 'p') }, { PAIR('c', 't') }, { PAIR('d', 'n') }, { PAIR('m', 'o') }, { PAIR('d', 'y') }, { PAIR('d', 'w') }, { PAIR('l', 'n') }, { PAIR('d', 'l') }, { PAIR('s', 't') }, { PAIR('s', 'b') }, { PAIR('c', '.') }, { PAIR('$', '$') } }; int alphabet = 256; /* latin-1 */ int pto = 10000; int pfrom = 1; int print = 1; char nextf[NS] = TMACDIR; char mfiles[NMF][NS]; int nmfi = 0; int oldbits = -1; int init = 1; int fc = IMP; /* field character */ int eschar = '\\'; int pl; int po; FILE *ptid; int dfact = 1; int dfactd = 1; int res = 1; int smnt = 0; /* beginning of special fonts */ int ascii = 0; /* ascii normally off for troff, on for nroff; -a turns on */ int lg; int pnlist[NPN] = { -1 }; int *pnp = pnlist; int npn = 1; int npnflg = 1; int dpn = -1; int totout = 1; int ulfont = ULFONT; int tabch = TAB; int ldrch = LEADER; Contab contab[NM] = { C(PAIR('d', 's'), caseds), C(PAIR('a', 's'), caseas), C(PAIR('s', 'p'), casesp), C(PAIR('f', 't'), caseft), C(PAIR('p', 's'), caseps), C(PAIR('v', 's'), casevs), C(PAIR('n', 'r'), casenr), C(PAIR('i', 'f'), caseif), C(PAIR('i', 'e'), caseie), C(PAIR('e', 'l'), caseel), C(PAIR('p', 'o'), casepo), C(PAIR('t', 'l'), casetl), C(PAIR('t', 'm'), casetm), C(PAIR('f', 'm'), casefm), C(PAIR('b', 'p'), casebp), C(PAIR('c', 'h'), casech), C(PAIR('p', 'n'), casepn), C(PAIR('b', 'r'), tbreak), C(PAIR('t', 'i'), caseti), C(PAIR('n', 'e'), casene), C(PAIR('n', 'f'), casenf), C(PAIR('c', 'e'), casece), C(PAIR('f', 'i'), casefi), C(PAIR('i', 'n'), casein), C(PAIR('l', 'l'), casell), C(PAIR('n', 's'), casens), C(PAIR('m', 'k'), casemk), C(PAIR('r', 't'), casert), C(PAIR('a', 'm'), caseam), C(PAIR('d', 'e'), casede), C(PAIR('d', 'i'), casedi), C(PAIR('d', 'a'), caseda), C(PAIR('w', 'h'), casewh), C(PAIR('d', 't'), casedt), C(PAIR('i', 't'), caseit), C(PAIR('r', 'm'), caserm), C(PAIR('r', 'r'), caserr), C(PAIR('r', 'n'), casern), C(PAIR('a', 'd'), casead), C(PAIR('r', 's'), casers), C(PAIR('n', 'a'), casena), C(PAIR('p', 'l'), casepl), C(PAIR('t', 'a'), caseta), C(PAIR('t', 'r'), casetr), C(PAIR('u', 'l'), caseul), C(PAIR('c', 'u'), casecu), C(PAIR('l', 't'), caselt), C(PAIR('n', 'x'), casenx), C(PAIR('s', 'o'), caseso), C(PAIR('i', 'g'), caseig), C(PAIR('t', 'c'), casetc), C(PAIR('f', 'c'), casefc), C(PAIR('e', 'c'), caseec), C(PAIR('e', 'o'), caseeo), C(PAIR('l', 'c'), caselc), C(PAIR('e', 'v'), caseev), C(PAIR('r', 'd'), caserd), C(PAIR('a', 'b'), caseab), C(PAIR('f', 'l'), casefl), C(PAIR('e', 'x'), caseex), C(PAIR('s', 's'), casess), C(PAIR('f', 'p'), casefp), C(PAIR('c', 's'), casecs), C(PAIR('b', 'd'), casebd), C(PAIR('l', 'g'), caselg), C(PAIR('h', 'c'), casehc), C(PAIR('h', 'y'), casehy), C(PAIR('n', 'h'), casenh), C(PAIR('n', 'm'), casenm), C(PAIR('n', 'n'), casenn), C(PAIR('s', 'v'), casesv), C(PAIR('o', 's'), caseos), C(PAIR('l', 's'), casels), C(PAIR('c', 'c'), casecc), C(PAIR('c', '2'), casec2), C(PAIR('e', 'm'), caseem), C(PAIR('a', 'f'), caseaf), C(PAIR('h', 'a'), caseha), C(PAIR('h', 'w'), casehw), C(PAIR('m', 'c'), casemc), C(PAIR('p', 'm'), casepm), C(PAIR('p', 'i'), casepi), C(PAIR('u', 'f'), caseuf), C(PAIR('p', 'c'), casepc), C(PAIR('h', 't'), caseht), C(PAIR('c', 'f'), casecf), C(PAIR('s', 'y'), casesy), C(PAIR('l', 'f'), caself), C(PAIR('p', 't'), casept), C(PAIR('g', 'd'), casegd) }; Tbuf _oline; /* * troff environment block */ Env env[NEV] = { { /* this sets up env[0] */ /* int ics */ 0, /* insertion character space, set by .mc */ /* int sps */ 0, /* int spacesz */ 0, /* int lss */ 0, /* int lss1 */ 0, /* int ll */ 0, /* int ll1 */ 0, /* int lt */ 0, /* int lt1 */ 0, /* Tchar ic */ 0, /* insertion character (= margin character) */ /* int icf */ 0, /* insertion character flag */ /* Tchar chbits */ 0, /* size+font bits for current character */ /* Tchar spbits */ 0, /* Tchar nmbits */ 0, /* size+font bits for number from .nm */ /* int apts */ PS, /* actual point size -- as requested by user */ /* int apts1 */ PS, /* need not match an existent size */ /* int pts */ PS, /* hence, this is the size that really exists */ /* int pts1 */ PS, /* int font */ FT, /* int font1 */ FT, /* int ls */ 1, /* int ls1 */ 1, /* int ad */ 1, /* int nms */ 1, /* .nm multiplier */ /* int ndf */ 1, /* .nm separator */ /* int nmwid */ 3, /* max width of .nm numbers */ /* int fi */ 1, /* int cc */ '.', /* int c2 */ '\'', /* int ohc */ OHC, /* int tdelim */ IMP, /* int hyf */ 1, /* int hyoff */ 0, /* int hyphalg */ HYPHALG, /* int un1 */ -1, /* int tabc */ 0, /* int dotc */ '.', /* int adsp */ 0, /* add this much space to each padding point */ /* int adrem */ 0, /* excess space to add until it runs out */ /* int lastl */ 0, /* last text on current output line */ /* int nel */ 0, /* how much space left on current output line */ /* int admod */ 0, /* adjust mode */ /* Tchar *wordp */ 0, /* int spflg */ 0, /* probably to indicate space after punctuation needed */ /* Tchar *linep */ 0, /* Tchar *wdend */ 0, /* Tchar *wdstart */ 0, /* int wne */ 0, /* int ne */ 0, /* how much space taken on current output line */ /* int nc */ 0, /* #characters (incl blank) on output line */ /* int nb */ 0, /* int lnmod */ 0, /* line number mode, set by .nm */ /* int nwd */ 0, /* number of words on current output line */ /* int nn */ 0, /* from .nn command */ /* int ni */ 0, /* indent of .nm numbers, probably */ /* int ul */ 0, /* int cu */ 0, /* int ce */ 0, /* int in */ 0, /* indent and previous value */ /* int in1 */ 0, /* int un */ 0, /* unindent of left margin in some way */ /* int wch */ 0, /* int pendt */ 0, /* Tchar *pendw */ (Tchar *)0, /* int pendnf */ 0, /* int spread */ 0, /* int it */ 0, /* input trap count */ /* int itmac */ 0 } }; Env *envp = env; /* start off in env 0 */ Numerr numerr; Stack *frame, *stk, *ejl; Stack *nxf; int pipeflg; int hflg; /* used in nroff only */ int eqflg; /* used in nroff only */ int xpts; int ppts; int pfont; int mpts; int mfont; int cs; int ccs; int bd; int stdi; int quiet; int stop; char ibuf[IBUFSZ]; char xbuf[IBUFSZ]; char *ibufp; char *xbufp; char *eibuf; char *xeibuf; Tchar pbbuf[NC]; /* pushback buffer for arguments, \n, etc. */ Tchar *pbp = pbbuf; /* next free slot in pbbuf */ Tchar *lastpbp = pbbuf; /* pbp in previous stack frame */ int nx; int mflg; Tchar ch = 0; int ibf; int ifi; int iflg; int rargc; char **argp; Ushort trtab[NTRTAB]; int lgf; int copyf; Offset ip; int nlflg; int donef; int nflush; int nfo; int padc; int raw; int flss; int nonumb; int trap; int tflg; int ejf; int dilev; Offset offset; int em; int ds; Offset woff; int app; int ndone; int lead; int ralss; Offset nextb; Tchar nrbits; int nform; int oldmn; int newmn; int macerr; Offset apptr; int diflg; int evi; int vflag; int noscale; int po1; int nlist[NTRAP]; int mlist[NTRAP]; int evlist[EVLSZ]; int ev; int tty; int sfont = FT; /* appears to be "standard" font; used by .ul */ int sv; int esc; int widthp; int xfont; int setwdf; int over; int nhyp; Tchar **hyp; Tchar *olinep; int dotT; char *unlkp; Wcache widcache[NWIDCACHE]; Diver d[NDI]; Diver *dip; int c_hyphen; int c_emdash; int c_rule; int c_minus; int c_fi; int c_fl; int c_ff; int c_ffi; int c_ffl; int c_acute; int c_grave; int c_under; int c_rooten; int c_boxrule; int c_lefthand; int c_dagger; int c_isalnum; Spnames spnames[] = { &c_hyphen, "hy", &c_emdash, "em", &c_rule, "ru", &c_minus, "\\-", &c_fi, "fi", &c_fl, "fl", &c_ff, "ff", &c_ffi, "Fi", &c_ffl, "Fl", &c_acute, "aa", &c_grave, "ga", &c_under, "ul", &c_rooten, "rn", &c_boxrule, "br", &c_lefthand, "lh", &c_dagger, "dg", /* not in nroff?? */ &c_isalnum, "__", 0, 0 }; Tchar (*hmot)(void); Tchar (*makem)(int i); Tchar (*setabs)(void); Tchar (*setch)(int c); Tchar (*sethl)(int k); Tchar (*setht)(void); Tchar (*setslant)(void); Tchar (*vmot)(void); Tchar (*xlss)(void); int (*findft)(int i); int (*width)(Tchar j); void (*mchbits)(void); void (*ptlead)(void); void (*ptout)(Tchar i); void (*ptpause)(void); void (*setfont)(int a); void (*setps)(void); void (*setwd)(void); 9base-6/troff/cvt0000644000175000017500000000165211402154555013411 0ustar anselmanselm awk ' /^{/ { if (prev != "") { # comments can be trouble (e.g. ffree()) if ( (c = match(prev, /\/\*.*\*\/$/)) != 0 ) { comment = substr(prev, c) sub(/\/\*.*\*\/$/, "", prev) } else comment = "" x = prev # isolate argument list sub(/^[^(]*\(/, "", x) sub(/\)[^)]*$/, "", x) # find the names in it n = split(x, args) arglist = "" for (i = 2; i <= n; i += 2) arglist = arglist args[i] gsub(/\(\*f\)\(Tchar\)/, "f", arglist) # special case for n4.c gsub(/\[[0-9]+\]/, "", arglist) # for n8.c gsub(/[*()\[\]]/, "", arglist) # discard noise characters *()[] gsub(/,/, ", ", arglist) # space nicely sub(/\(.*\)/, "(" arglist ")", prev) # reconstruct print prev comment # argument declarations gsub(/,/, ";", x) gsub(/\(\*f\)\(Tchar\)/, "(*f)()", x) # special case for n4.c if (x != "") print "\t" x ";" } prev = $0 next } { print prev prev = $0 } END { print prev } ' $* 9base-6/troff/dwbinit.h0000644000175000017500000000075311402154555014504 0ustar anselmanselm/* * * A structure used to adjust pathnames in DWB C code. Pointers * set the address field, arrays use the value field and must * also set length to the number elements in the array. Pointers * are always reallocated and then reinitialized; arrays are only * reinitialized, if there's room. * */ typedef struct { char **address; char *value; int length; } dwbinit; extern void DWBinit(char *, dwbinit *); extern char* DWBhome(void); extern void DWBprefix(char *, char *, int); 9base-6/troff/suftab.c0000644000175000017500000004561011402154555014324 0ustar anselmanselm/* * Suffix table */ typedef unsigned char Uchar; static Uchar sufa[] = { 02,0200+'t', /* -TA */ 02,0200+'s', /* -SA */ 03,0200+'t','r', /* -TRA */ 03,0200+'d','r', /* -DRA */ 03,0200+'b','r', /* -BRA */ 02,0200+'p', /* -PA */ 02,0200+'n', /* -NA */ 02,0200+'m', /* -MA */ 03,0200+'p','l', /* -PLA */ 02,0200+'l', /* -LA */ 02,0200+'k', /* -KA */ 03,0200+'t','h', /* -THA */ 03,0200+'s','h', /* -SHA */ 02,0200+'g', /* -GA */ 02,0200+'d', /* -DA */ 02,0200+'c', /* -CA */ 02,0200+'b', /* -BA */ 00 }; static Uchar sufc[] = { 04,'e','t',0200+'i', /* ET-IC */ 07,'a','l',0200+'i','s',0200+'t','i', /* AL-IS-TIC */ 04,'s',0200+'t','i', /* S-TIC */ 04,'p',0200+'t','i', /* P-TIC */ 05,0200+'l','y','t',0200+'i', /* -LYT-IC */ 04,'o','t',0200+'i', /* OT-IC */ 05,'a','n',0200+'t','i', /* AN-TIC */ 04,'n',0200+'t','i', /* N-TIC */ 04,'c',0200+'t','i', /* C-TIC */ 04,'a','t',0200+'i', /* AT-IC */ 04,'h',0200+'n','i', /* H-NIC */ 03,'n',0200+'i', /* N-IC */ 03,'m',0200+'i', /* M-IC */ 04,'l',0200+'l','i', /* L-LIC */ 04,'b',0200+'l','i', /* B-LIC */ 04,0200+'c','l','i', /* -CLIC */ 03,'l',0200+'i', /* L-IC */ 03,'h',0200+'i', /* H-IC */ 03,'f',0200+'i', /* F-IC */ 03,'d',0200+'i', /* D-IC */ 03,0200+'b','i', /* -BIC */ 03,'a',0200+'i', /* A-IC */ 03,0200+'m','a', /* -MAC */ 03,'i',0200+'a', /* I-AC */ 00 }; static Uchar sufd[] = { 04,0200+'w','o','r', /* -WORD */ 04,0200+'l','o','r', /* -LORD */ 04,0200+'f','o','r', /* -FORD */ 04,0200+'y','a','r', /* -YARD */ 04,0200+'w','a','r', /* -WARD */ 05,0200+'g','u','a','r', /* -GUARD */ 04,0200+'t','a','r', /* -TARD */ 05,0200+'b','o','a','r', /* -BOARD */ 04,0200+'n','a','r', /* -NARD */ 05,0200+'l','i','a','r', /* -LIARD */ 04,0200+'i','a','r', /* -IARD */ 04,0200+'g','a','r', /* -GARD */ 04,0200+'b','a','r', /* -BARD */ 03,0200+'r','o', /* -ROD */ 04,0200+'w','o','o', /* -WOOD */ 04,0200+'h','o','o', /* -HOOD */ 04,0200+'m','o','n', /* -MOND */ 04,0200+'t','e','n', /* -TEND */ 05,0200+'s','t','a','n', /* -STAND */ 04,0200+'l','a','n', /* -LAND */ 04,0200+'h','a','n', /* -HAND */ 04,0200+'h','o','l', /* -HOLD */ 04,0200+'f','o','l', /* -FOLD */ 05,0200+'f','i','e','l', /* -FIELD */ 03,0200+'v','i', /* -VID */ 03,0200+'c','i', /* -CID */ 04,0200+'s','a','i', /* -SAID */ 04,0200+'m','a','i', /* -MAID */ 04,'t',0200+'t','e', /* T-TED */ 03,'t',0200+'e', /* T-ED */ 04,0200+'d','r','e', /* -DRED */ 04,0200+'c','r','e', /* -CRED */ 04,0200+'b','r','e', /* -BRED */ 05,'v',0200+'e','l','e', /* V-ELED */ 0100+04,'a','l',0200+'e', /* AL/ED */ 0140+03,0200+'e','e', /* /EED */ 040+05,'e','d',0200+'d','e', /* ED-DED */ 04,'d',0200+'d','e', /* D-DED */ 040+04,'e','d',0200+'e', /* ED-ED */ 03,'d',0200+'e', /* D-ED */ 05,0200+'d','u','c','e', /* -DUCED */ 0300+02,'e', /* E/D */ 05,0200+'s','t','e','a', /* -STEAD */ 05,0200+'a','h','e','a', /* -AHEAD */ 04,0200+'h','e','a', /* -HEAD */ 00 }; static Uchar sufe[] = { 05,'a','r',0200+'i','z', /* AR-IZE */ 05,'a','n',0200+'i','z', /* AN-IZE */ 05,'a','l',0200+'i','z', /* AL-IZE */ 06,0200+'a','r','d',0200+'i','z', /* -ARD-IZE */ 05,0200+'s','e','l','v', /* -SELVE */ 05,0200+'k','n','i','v', /* -KNIVE */ 05,0200+'l','i','e','v', /* -LIEVE */ 0100+03,0200+'q','u', /* /QUE */ 07,'o','n',0200+'t','i','n',0200+'u', /* ON-TIN-UE */ 03,0200+'n','u', /* -NUE */ 03,0200+'d','u', /* -DUE */ 0300+02,'u', /* U/E */ 0300+05,'q','u','a','t', /* QUAT/E */ 04,'u',0200+'a','t', /* U-ATE */ 05,0200+'s','t','a','t', /* -STATE */ 04,0200+'t','a','t', /* -TATE */ 06,0200+'t','o','r',0200+'a','t', /* -TOR-ATE */ 05,'e','n',0200+'a','t', /* EN-ATE */ 04,0200+'m','a','t', /* -MATE */ 05,0200+'h','o','u','s', /* -HOUSE */ 05,0200+'c','l','o','s', /* -CLOSE */ 04,'i',0200+'o','s', /* I-OSE */ 04,0200+'w','i','s', /* -WISE */ 05,'a','s',0200+'u','r', /* AS-URE */ 040+04,0200+'s','u','r', /* -SURE */ 06,0200+'f','i','g',0200+'u','r', /* -FIG-URE */ 040+03,0200+'t','r', /* -TRE */ 05,0200+'s','t','o','r', /* -STORE */ 04,0200+'f','o','r', /* -FORE */ 05,0200+'w','h','e','r', /* -WHERE */ 06,0200+'s','p','h','e','r', /* -SPHERE */ 03,0200+'d','r', /* -DRE */ 03,0200+'c','r', /* -CRE */ 03,0200+'b','r', /* -BRE */ 05,0200+'s','c','o','p', /* -SCOPE */ 04,'y',0200+'o','n', /* Y-ONE */ 05,0200+'s','t','o','n', /* -STONE */ 05,0200+'p','h','o','n', /* -PHONE */ 04,0200+'g','o','n', /* -GONE */ 04,'e',0200+'o','n', /* E-ONE */ 040+04,0200+'e','n','n', /* -ENNE */ 040+05,'a',0200+'r','i','n', /* A-RINE */ 05,0200+'c','l','i','n', /* -CLINE */ 04,0200+'l','i','n', /* -LINE */ 007,00200+'r','o','u',00200+'t','i','n', /*-ROU-TINE */ 04,0200+'s','o','m', /* -SOME */ 04,0200+'c','o','m', /* -COME */ 04,0200+'t','i','m', /* -TIME */ 03,0200+'z','l', /* -ZLE */ 03,0200+'t','l', /* -TLE */ 03,0200+'s','l', /* -SLE */ 03,0200+'p','l', /* -PLE */ 05,0200+'v','i','l','l', /* -VILLE */ 04,'c','k',0200+'l', /* CK-LE */ 03,0200+'k','l', /* -KLE */ 03,0200+'g','l', /* -GLE */ 03,0200+'f','l', /* -FLE */ 03,0200+'d','l', /* -DLE */ 03,0200+'c','l', /* -CLE */ 05,0200+'p','a',0200+'b','l', /* -PA-BLE */ 05,'f','a',0200+'b','l', /* FA-BLE */ 05,0200+'c','a',0200+'b','l', /* -CA-BLE */ 06,0200+'s','t','a','b','l', /* -STABLE */ 04,0200+'a','b','l', /* -ABLE */ 03,0200+'b','l', /* -BLE */ 04,0200+'d','a','l', /* -DALE */ 04,0200+'m','a','l', /* -MALE */ 04,0200+'s','a','l', /* -SALE */ 04,0200+'l','i','k', /* -LIKE */ 0340+05,'g',0200+'u','a','g', /* -G/UAGE */ 05,0200+'r','i','a','g', /* -RIAGE */ 05,'e','r',0200+'a','g', /* ER-AGE */ 04,'m',0200+'a','g', /* M-AGE */ 04,'k',0200+'a','g', /* K-AGE */ 04,'d',0200+'a','g', /* D-AGE */ 04,0200+'w','i','f', /* -WIFE */ 05,0200+'k','n','i','f', /* -KNIFE */ 03,0200+'s','e', /* -SEE */ 04,0200+'f','r','e', /* -FREE */ 0340+02,'e', /* EE */ 04,0200+'w','i','d', /* -WIDE */ 04,0200+'t','i','d', /* -TIDE */ 04,0200+'s','i','d', /* -SIDE */ 06,0200+'q','u','e','n','c', /* -QUENCE */ 07,0200+'f','l','u',0200+'e','n','c', /* -FLU-ENCE */ 040+06,'e','s',0200+'e','n','c', /* ES-ENCE */ 06,'e','r',0200+'e','n','c', /* ER-ENCE */ 05,'i',0200+'e','n','c', /* I-ENCE */ 040+05,0200+'s','a','n','c', /* -SANCE */ 06,'e','r',0200+'a','n','c', /* ER-ANCE */ 06,'a','r',0200+'a','n','c', /* AR-ANCE */ 05,0200+'n','a','n','c', /* -NANCE */ 07,0200+'b','a','l',0200+'a','n','c', /* -BAL-ANCE */ 05,'i',0200+'a','n','c', /* I-ANCE */ 07,0200+'j','u','s',0200+'t','i','c', /* -JUS-TICE */ 05,0200+'s','t','i','c', /* -STICE */ 06,0200+'n','o','v',0200+'i','c', /* NOV-ICE */ 04,0200+'v','i','c', /* -VICE */ 05,0200+'p','i','e','c', /* -PIECE */ 05,0200+'p','l','a','c', /* -PLACE */ 0340+01, /* /E */ 00 }; static Uchar suff[] = { 03,0200+'o','f', /* -OFF */ 05,0200+'p','r','o','o', /* -PROOF */ 04,0200+'s','e','l', /* -SELF */ 03,0200+'r','i', /* -RIF */ 040+04,0200+'l','i','e', /* -LIEF */ 00 }; static Uchar sufg[] = { 03,0200+'l','o', /* -LOG */ 04,0200+'l','o','n', /* -LONG */ 05,'t',0200+'t','i','n', /* T-TING */ 06,0200+'s','t','r','i','n', /* -STRING */ 05,'r',0200+'r','i','n', /* R-RING */ 05,'p',0200+'p','i','n', /* P-PING */ 05,'n',0200+'n','i','n', /* N-NING */ 05,'m',0200+'m','i','n', /* M-MING */ 05,'l',0200+'l','i','n', /* L-LING */ 05,0200+'z','l','i','n', /* -ZLING */ 05,0200+'t','l','i','n', /* -TLING */ 040+05,'s',0200+'l','i','n', /* S-LING */ 05,'r',0200+'l','i','n', /* R-LING */ 05,0200+'p','l','i','n', /* -PLING */ 06,'n',0200+'k','l','i','n', /* N-KLING */ 05,'k',0200+'l','i','n', /* K-LING */ 05,0200+'g','l','i','n', /* -GLING */ 05,0200+'f','l','i','n', /* -FLING */ 05,0200+'d','l','i','n', /* -DLING */ 05,0200+'c','l','i','n', /* -CLING */ 05,0200+'b','l','i','n', /* -BLING */ 06,'y',0200+'t','h','i','n', /* Y-THING */ 07,'e','e','t','h',0200+'i','n', /* EETH-ING */ 06,'e',0200+'t','h','i','n', /* E-THING */ 05,'g',0200+'g','i','n', /* G-GING */ 05,'d',0200+'d','i','n', /* D-DING */ 05,'b',0200+'b','i','n', /* B-BING */ 03,0200+'i','n', /* -ING */ 00 }; static Uchar sufh[] = { 05,0200+'m','o','u','t', /* -MOUTH */ 05,0200+'w','o','r','t', /* -WORTH */ 04,0200+'w','i','t', /* -WITH */ 05,'t',0200+'t','i','s', /* T-TISH */ 05,'e',0200+'t','i','s', /* E-TISH */ 05,'p',0200+'p','i','s', /* P-PISH */ 05,'r',0200+'n','i','s', /* R-NISH */ 05,'n',0200+'n','i','s', /* N-NISH */ 05,0200+'p','l','i','s', /* -PLISH */ 05,0200+'g','u','i','s', /* -GUISH */ 05,0200+'g','l','i','s', /* -GLISH */ 05,'b',0200+'l','i','s', /* B-LISH */ 05,'g',0200+'g','i','s', /* G-GISH */ 05,'d',0200+'d','i','s', /* D-DISH */ 03,0200+'i','s', /* -ISH */ 05,0200+'g','r','a','p', /* -GRAPH */ 07,0200+'b','o','r',0200+'o','u','g', /* -BOR-OUGH */ 05,0200+'b','u','r','g', /* -BURGH */ 04,0200+'v','i','c', /* -VICH */ 03,0200+'n','a', /* -NAH */ 03,0200+'l','a', /* -LAH */ 04,0200+'m','i',0200+'a', /* -MI-AH */ 00 }; static Uchar sufi[] = { 03,0200+'t','r', /* -TRI */ 03,0200+'c','h', /* -CHI */ 0200+03,'i','f', /* IF-I */ 0200+03,'e','d', /* ED-I */ 05,0200+'a','s','c','i', /* -ASCII */ 04,0200+'s','e','m', /* -SEMI */ 00 }; static Uchar sufk[] = { 04,0200+'w','o','r', /* -WORK */ 04,0200+'m','a','r', /* -MARK */ 04,0200+'b','o','o', /* -BOOK */ 04,0200+'w','a','l', /* -WALK */ 05,0200+'c','r','a','c', /* -CRACK */ 04,0200+'b','a','c', /* -BACK */ 00 }; static Uchar sufl[] = { 03,0200+'f','u', /* -FUL */ 05,'s',0200+'w','e','l', /* S-WELL */ 04,0200+'t','e','l', /* -TELL */ 05,0200+'s','h','e','l', /* -SHELL */ 05,0200+'s','t','a','l', /* -STALL */ 04,'s',0200+'t','a', /* S-TAL */ 04,0200+'b','a','l', /* -BALL */ 04,0200+'c','a','l', /* -CALL */ 03,'v',0200+'e', /* V-EL */ 03,'u',0200+'e', /* U-EL */ 03,'k',0200+'e', /* K-EL */ 04,'t','h',0200+'e', /* TH-EL */ 05,'t','c','h',0200+'e', /* TCH-EL */ 03,'a',0200+'e', /* A-EL */ 0140+04,0200+'q','u','a', /* /QUAL */ 040+03,'u',0200+'a', /* U-AL */ 03,0200+'t','a', /* -TAL */ 04,'u','r',0200+'a', /* UR-AL */ 040+05,'g',0200+'o',0200+'n','a', /* G-O-NAL */ 04,'o','n',0200+'a', /* ON-AL */ 03,0200+'n','a', /* -NAL */ 04,0200+'t','i','a', /* -TIAL */ 04,0200+'s','i','a', /* -SIAL */ 040+05,0200+'t','r','i',0200+'a', /* -TRI-AL */ 04,'r','i',0200+'a', /* RI-AL */ 04,0200+'n','i',0200+'a', /* -NI-AL */ 04,0200+'d','i',0200+'a', /* -DI-AL */ 04,0200+'c','i','a', /* -CIAL */ 03,0200+'g','a', /* -GAL */ 04,0200+'m','e','a', /* -MEAL */ /* 040+04,0200+'r','e',0200+'a', /* -RE-AL */ 040+04,0200+'r','e','a', /* -REAL */ 06,'c',0200+'t','i',0200+'c','a', /* C-TI-CAL */ 05,0200+'s','i',0200+'c','a', /* -SI-CAL */ 04,0200+'i',0200+'c','a', /* -I-CAL */ 03,0200+'c','a', /* -CAL */ 03,0200+'b','a', /* -BAL */ 06,0200+'n','o',0200+'m','i',0200+'a', /* -NO-MI-AL */ 00 }; static Uchar sufm[] = { 03,0200+'n','u', /* -NUM */ 05,'o',0200+'r','i',0200+'u', /* O-RI-UM */ 040+03,'i',0200+'u', /* I-UM */ 040+03,'e',0200+'u', /* E-UM */ 05,'i','v',0200+'i','s', /* IV-ISM */ 04,0200+'t','i','s', /* -TISM */ 05,'i',0200+'m','i','s', /* I-MISM */ 05,'a','l',0200+'i','s', /* AL-ISM */ 040+04,'e',0200+'i','s', /* E-ISM */ 040+04,'a',0200+'i','s', /* A-ISM */ 04,0200+'r','o','o', /* -ROOM */ 03,0200+'d','o', /* -DOM */ 03,0200+'h','a', /* -HAM */ 06,0200+'a',0200+'r','i','t','h', /* -A-RITHM */ 05,0200+'r','i','t','h', /* -RITHM */ 00 }; static Uchar sufn[] = { 05,0200+'k','n','o','w', /* -KNOWN */ 04,0200+'t','o','w', /* -TOWN */ 04,0200+'d','o','w', /* -DOWN */ 04,0200+'t','u','r', /* -TURN */ 05,0200+'s','p','o','o', /* -SPOON */ 04,0200+'n','o','o', /* -NOON */ 04,0200+'m','o','o', /* -MOON */ 011,'a','l',0200+'i',0200+'z','a',0200+'t','i','o', /* AL-I-ZA-TION */ 07,0200+'i',0200+'z','a',0200+'t','i','o', /* -I-ZA-TION */ 07,'l',0200+'i',0200+'a',0200+'t','i','o', /* L-I-A-TION */ 04,0200+'t','i','o', /* -TION */ 040+05,'s',0200+'s','i','o', /* S-SION */ 04,0200+'s','i','o', /* -SION */ 04,'n',0200+'i','o', /* N-ION */ 04,0200+'g','i','o', /* -GION */ 04,0200+'c','i','o', /* -CION */ 03,0200+'c','o', /* -CON */ 05,0200+'c','o','l','o', /* -COLON */ 03,0200+'t','o', /* -TON */ 04,'i','s',0200+'o', /* IS-ON */ 03,0200+'s','o', /* -SON */ 03,0200+'r','i', /* -RIN */ 03,0200+'p','i', /* -PIN */ 03,0200+'n','i', /* -NIN */ 03,0200+'m','i', /* -MIN */ 03,0200+'l','i', /* -LIN */ 03,0200+'k','i', /* -KIN */ 05,0200+'s','t','e','i', /* -STEIN */ 04,0200+'t','a','i', /* -TAIN */ 05,'g','h','t',0200+'e', /* GHT-EN */ 05,0200+'w','o','m',0200+'e', /* -WOM-EN */ 03,0200+'m','e', /* -MEN */ 04,'o',0200+'k','e', /* O-KEN */ 03,'k',0200+'e', /* K-EN */ 04,0200+'t','e','e', /* -TEEN */ 04,0200+'s','e','e', /* -SEEN */ 040+03,0200+'s','a', /* -SAN */ 05,0200+'w','o','m',0200+'a', /* -WOM-AN */ 03,0200+'m','a', /* -MAN */ 04,0200+'t','i','a', /* -TIAN */ 04,0200+'s','i','a', /* -SIAN */ 040+04,'e',0200+'i','a', /* E-IAN */ 04,0200+'c','i','a', /* -CIAN */ 0300+03,'i','a', /* IA/N */ 05,0200+'c','l','e','a', /* -CLEAN */ 04,0200+'m','e','a', /* -MEAN */ 040+03,'e',0200+'a', /* E-AN */ 00 }; static Uchar sufo[] = { 05,0200+'m','a','c',0200+'r', /* -MAC-RO */ 00 }; static Uchar sufp[] = { 05,0200+'g','r','o','u', /* -GROUP */ 02,0200+'u', /* -UP */ 04,0200+'s','h','i', /* -SHIP */ 04,0200+'k','e','e', /* -KEEP */ 00 }; static Uchar sufr[] = { 04,0200+'z','a','r', /* -ZARR */ 0300+02,'r', /* R/R */ 03,0200+'t','o', /* -TOR */ 040+03,0200+'s','o', /* -SOR */ 040+04,0200+'r','i',0200+'o', /* -RI-OR */ 04,'i','z',0200+'e', /* IZ-ER */ 05,0200+'c','o','v',0200+'e', /* -COV-ER */ 04,0200+'o','v','e', /* -OVER */ 04,0200+'e','v',0200+'e', /* -EV-ER */ 8,0200+'c','o','m',0200+'p','u','t',0200+'e', /* -COM-PUT-ER */ 040+05,'u','s',0200+'t','e', /* US-TER */ 05,'o','s','t',0200+'e', /* OST-ER */ 040+05,0200+'a','c',0200+'t','e', /* -AC-TER */ 06,0200+'w','r','i','t',0200+'e', /* -WRIT-ER */ 040+05,'i','s',0200+'t','e', /* IS-TER */ 040+05,'e','s',0200+'t','e', /* ES-TER */ 040+05,'a','s',0200+'t','e', /* AS-TER */ 04,0200+'s','t','e', /* -STER */ 05,'a','r',0200+'t','e', /* AR-TER */ 04,'r','t',0200+'e', /* RT-ER */ 040+05,'m',0200+'e',0200+'t','e', /* M-E-TER */ 05,0200+'w','a',0200+'t','e', /* -WA-TER */ 03,'r',0200+'e', /* R-ER */ 04,'o','p',0200+'e', /* OP-ER */ 05,0200+'p','a',0200+'p','e', /* -PA-PER */ 04,'w','n',0200+'e', /* WN-ER */ 040+04,'s',0200+'n','e', /* S-NER */ 04,'o','n',0200+'e', /* ON-ER */ 04,'r','m',0200+'e', /* RM-ER */ 03,0200+'m','e', /* -MER */ 04,'l','l',0200+'e', /* LL-ER */ 05,'d',0200+'d','l','e', /* D-DLER */ 04,0200+'b','l','e', /* -BLER */ 03,'k',0200+'e', /* K-ER */ 05,'n',0200+'t','h','e', /* N-THER */ 06,0200+'f','a',0200+'t','h','e', /* -FA-THER */ 06,'e','i',0200+'t','h','e', /* EI-THER */ 04,'t','h',0200+'e', /* TH-ER */ 04,'s','h',0200+'e', /* SH-ER */ 04,0200+'p','h','e', /* -PHER */ 04,'c','h',0200+'e', /* CH-ER */ 04,'d','g',0200+'e', /* DG-ER */ 04,'r','d',0200+'e', /* RD-ER */ 06,'o','u','n','d',0200+'e', /* OUND-ER */ 04,'l','d',0200+'e', /* LD-ER */ 04,'i','d',0200+'e', /* ID-ER */ 05,0200+'d','u','c',0200+'e', /* -DUC-ER */ 04,'n','c',0200+'e', /* NC-ER */ 0100+02, 0200+'e', /* /ER */ 03,0200+'s','a', /* -SAR */ 040+06,'a','c',0200+'u',0200+'l','a', /* AC-U-LAR */ 040+06,'e','c',0200+'u',0200+'l','a', /* EC-U-LAR */ 040+06,'i','c',0200+'u',0200+'l','a', /* IC-U-LAR */ 040+06,'e','g',0200+'u',0200+'l','a', /* EG-U-LAR */ 00 }; static Uchar sufs[] = { 040+04,'u',0200+'o','u', /* U-OUS */ 05,0200+'t','i','o','u', /* -TIOUS */ 05,0200+'g','i','o','u', /* -GIOUS */ 05,0200+'c','i','o','u', /* -CIOUS */ 040+04,'i',0200+'o','u', /* I-OUS */ 05,0200+'g','e','o','u', /* -GEOUS */ 05,0200+'c','e','o','u', /* -CEOUS */ 04,'e',0200+'o','u', /* E-OUS */ 0140+02,0200+'u', /* /US */ 04,0200+'n','e','s', /* -NESS */ 04,0200+'l','e','s', /* -LESS */ 0140+02,0200+'s', /* /SS */ 040+05,'p',0200+'o',0200+'l','i', /* P-O-LIS */ 0140+02,0200+'i', /* /IS */ 0100+03,0200+'x','e', /* X/ES */ 0100+03,0200+'s','e', /* S/ES */ 0100+04,'s','h',0200+'e', /* SH/ES */ 0100+04,'c','h',0200+'e', /* CH/ES */ 0300+01, /* /S */ 00 }; static Uchar suft[] = { 05,0200+'l','i','m',0200+'i', /* -LIM-IT */ 06,'i','o','n',0200+'i','s', /* ION-IST */ 05,'i','n',0200+'i','s', /* IN-IST */ 05,'a','l',0200+'i','s', /* AL-IST */ 06,'l',0200+'o',0200+'g','i','s', /* L-O-GIST */ 05,'h','t',0200+'e','s', /* HT-EST */ 04,'i',0200+'e','s', /* I-EST */ 05,'g',0200+'g','e','s', /* G-GEST */ 04,'g',0200+'e','s', /* G-EST */ 05,'d',0200+'d','e','s', /* D-DEST */ 04,'d',0200+'e','s', /* D-EST */ 04,0200+'c','a','s', /* -CAST */ 05,0200+'h','e','a','r', /* -HEART */ 04,0200+'f','o','o', /* -FOOT */ 03,'i',0200+'o', /* I-OT */ 05,0200+'f','r','o','n', /* -FRONT */ 05,0200+'p','r','i','n', /* -PRINT */ 04,0200+'m','e','n', /* -MENT */ 05,0200+'c','i','e','n', /* -CIENT */ 04,'i',0200+'a','n', /* I-ANT */ 06,0200+'w','r','i','g','h', /* -WRIGHT */ 06,0200+'b','r','i','g','h', /* -BRIGHT */ 06,0200+'f','l','i','g','h', /* -FLIGHT */ 06,0200+'w','e','i','g','h', /* -WEIGHT */ 05,0200+'s','h','i','f', /* -SHIFT */ 05,0200+'c','r','a','f', /* -CRAFT */ 040+04,'d','g',0200+'e', /* DG-ET */ 04,0200+'g','o','a', /* -GOAT */ 04,0200+'c','o','a', /* -COAT */ 04,0200+'b','o','a', /* -BOAT */ 04,0200+'w','h','a', /* -WHAT */ 04,0200+'c','u','i', /* -CUIT */ 00 }; static Uchar sufy[] = { 040+04,'e','s',0200+'t', /* ES-TY */ 040+05,'q','u','i',0200+'t', /* QUI-TY */ 04,0200+'t','i',0200+'t', /* -TI-TY */ 040+05,'o','s',0200+'i',0200+'t', /* OS-I-TY */ 04,0200+'s','i',0200+'t', /* -SI-TY */ 05,'i','n',0200+'i',0200+'t', /* IN-I-TY */ 04,'n','i',0200+'t', /* NI-TY */ 040+010,'f','a',0200+'b','i','l',0200+'i',0200+'t', /* FA-BIL-I-TY */ 010,0200+'c','a',0200+'b','i','l',0200+'i',0200+'t', /* -CA-BIL-I-TY */ 010,0200+'p','a',0200+'b','i','l',0200+'i',0200+'t', /* -PA-BIL-I-TY */ 06,0200+'b','i','l',0200+'i',0200+'t', /* -BIL-I-TY */ 03,'i',0200+'t', /* I-TY */ 04,0200+'b','u','r', /* -BUR-Y */ 04,0200+'t','o',0200+'r', /* -TO-RY */ 05,0200+'q','u','a','r', /* -QUAR-Y */ 040+04,'u',0200+'a','r', /* U-ARY */ 07,0200+'m','e','n',0200+'t','a',0200+'r', /* -MEN-TA-RY */ 06,'i','o','n',0200+'a','r', /* ION-ARY */ 04,'i',0200+'a','r', /* I-ARY */ 04,'n',0200+'o',0200+'m', /* N-O-MY */ 03,0200+'p','l', /* -PLY */ 04,'g',0200+'g','l', /* G-GLY */ 05,0200+'p','a',0200+'b','l', /* -PA-BLY */ 05,'f','a',0200+'b','l', /* FA-BLY */ 05,0200+'c','a',0200+'b','l', /* -CA-BLY */ 04,0200+'a','b','l', /* -ABLY */ 03,0200+'b','l', /* -BLY */ 02,0200+'l', /* -LY */ 03,0200+'s','k', /* -SKY */ 040+06,'g',0200+'r','a',0200+'p','h', /* G-RA-PHY */ 04,'l',0200+'o',0200+'g', /* L-O-GY */ 02,0200+'f', /* -FY */ 03,0200+'n','e', /* -NEY */ 03,0200+'l','e', /* -LEY */ 04,'c','k',0200+'e', /* CK-EY */ 03,0200+'k','e', /* -KEY */ 04,0200+'b','o','d', /* -BODY */ 05,0200+'s','t','u','d', /* -STUDY */ 0340+04,'e','e','d', /* EEDY */ 02,0200+'b', /* -BY */ 03,0200+'w','a', /* -WAY */ 03,0200+'d','a', /* -DAY */ 00 }; Uchar *suftab[] = { sufa, 0, sufc, sufd, sufe, suff, sufg, sufh, sufi, 0, sufk, sufl, sufm, sufn, sufo, sufp, 0, sufr, sufs, suft, 0, 0, 0, 0, sufy, 0 }; 9base-6/troff/tmac/0000755000175000017500000000000011402154555013612 5ustar anselmanselm9base-6/troff/tmac/tmac.pm0000644000175000017500000004246711402154555015111 0ustar anselmanselm.\" 10/22/92 activate next line before installing .pi /home/anselm/plan9port/bin/auxpm . . \" IZ - initialization .de IZ .fp 10 S \" force a font out into prefix .nr PS 10 \" point size .nr VS 12 \" line spacing .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .nr LL 6i \" line length .ll \\n(LLu .nr LT \\n(.l \" title length .lt \\n(LTu .if !\\n(HM .nr HM 1i \" top of page .if !\\n(FM .nr FM 1i \" footer margin .if !\\n(FO .nr FO \\n(.p-\\n(FM \" bottom of page . \" to set text ht to N, set FO to N + \n(HM. default is 10i .pl 32767u \" safety first: big pages for pm .if !\\n(PO .nr PO \\n(.ou \" page offset .nr PI 5n \" .PP paragraph indent .nr QI 5n \" .QS indent .nr DI 5n \" .DS indent .nr PD 0.3v \" paragraph vertical separation .nr TS 0.5v \" space around tables .nr Kf 0.5v \" space around .KF/.KE .nr Ks 0.5v \" space around .KS/.KE . .nr P1 .4i \" indent for .P1/.P2 .nr dP 1 \" delta point size for programs in .P1/.P2 .nr dV 2p \" delta vertical for programs .nr dT 8 \" delta tab stop for programs .nr DV .5v \" space before start of program .nr IP 0 \" ? .nr IR 0 \" ? .nr I1 \\n(PIu .ev 1 .if !\\n(FL .nr FL \\n(LLu \" footnote length .ll \\n(FLu .ps 8 \" text size & leading in footnote .vs 10p .ev .if \\*(CH .ds CH "\(hy \\\\n(PN \(hy .ds # #\\\\n(.c \\\\n(.F . . .ME \" initialize date strings .rm ME . \" accents: \*'e \*`e \*:u \*^e \*~n \*va \*,c .ds ' \h'\w'e'u*4/10'\z\(aa\h'-\w'e'u*4/10' .ds ` \h'\w'e'u*4/10'\z\(ga\h'-\w'e'u*4/10' .ds : \\v'-0.6m'\\h'(1u-(\\\\n(.fu%2u))*0.13m+0.00m'\\z.\\h'0.2m'\\z.\\h'-((1u-(\\\\n(.fu%2u))*0.13m+0.20m)'\\v'0.6m' .ds ^ \\\\k:\\h'-\\\\n(.fu+1u/2u*2u+\\\\n(.fu-1u*0.13m+0.06m'\\z^\\h'|\\\\n:u' .ds ~ \\\\k:\\h'-\\\\n(.fu+1u/2u*2u+\\\\n(.fu-1u*0.13m+0.06m'\\z~\\h'|\\\\n:u' .ds v \\\\k:\\\\h'+\\\\w'e'u/4u'\\\\v'-0.6m'\\\\s6v\\\\s0\\\\v'0.6m'\\\\h'|\\\\n:u' .ds , \\\\k:\\\\h'\\\\w'c'u*0.4u'\\\\z,\\\\h'|\\\\n:u' .. . . . \" SP - generate paddable space .de SP .br .nr X 1v .if \\n(.$ .nr X \\$1v .ie '\\$2'exactly' \{\ \v'\\nXu'\ \h'-\w'\ 'u'\c .sp \\$1\} .el .X "SP \\nX \\$2" .. . \" NE - need space on this page .de NE .nr X 1v .if \\n(.$ .nr X \\$1v .X "NE \\nX \\$2" .. . \" BP, FL, FC - begin page, flush figures, flush column .de BP .br .X CMD BP .. .de FL .br .X CMD FL .. .de FC .br .X CMD FC .. . \" X - generate an x X ... command in the output .de X ....ie '\\n(.z'' \\!x X \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ....el \\!.X "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ... .if !'\\n(.z'' .if \\n(.$=1 \\!.X "\\$1 .if !'\\n(.z'' .if \\n(.$=2 \\!.X "\\$1 \\$2 .if !'\\n(.z'' .if \\n(.$=3 \\!.X "\\$1 \\$2 \\$3 .if !'\\n(.z'' .if \\n(.$>3 \\!.X "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .if '\\n(.z'' .if \\n(.$=1 \\!x X \\$1 \\*# .if '\\n(.z'' .if \\n(.$=2 \\!x X \\$1 \\$2 \\*# .if '\\n(.z'' .if \\n(.$=3 \\!x X \\$1 \\$2 \\$3 \\*# .if '\\n(.z'' .if \\n(.$=4 \\!x X \\$1 \\$2 \\$3 \\$4 \\*# .if '\\n(.z'' .if \\n(.$>4 \\!x X \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 \\*# .. . \" DA - force date .de DA .if \\n(.$ .ds DY \\$1 \\$2 \\$3 \\$4 .ds CF \\*(DY .. . \" ND - set new or no date .de ND .ds DY \\$1 \\$2 \\$3 \\$4 .rm CF .. .de ME \" ME - set month strings .if \\n(mo-0 .ds MO January .if \\n(mo-1 .ds MO February .if \\n(mo-2 .ds MO March .if \\n(mo-3 .ds MO April .if \\n(mo-4 .ds MO May .if \\n(mo-5 .ds MO June .if \\n(mo-6 .ds MO July .if \\n(mo-7 .ds MO August .if \\n(mo-8 .ds MO September .if \\n(mo-9 .ds MO October .if \\n(mo-10 .ds MO November .if \\n(mo-11 .ds MO December .if \\n(dw-0 .ds DW Sunday .if \\n(dw-1 .ds DW Monday .if \\n(dw-2 .ds DW Tuesday .if \\n(dw-3 .ds DW Wednesday .if \\n(dw-4 .ds DW Thursday .if \\n(dw-5 .ds DW Friday .if \\n(dw-6 .ds DW Saturday .if "\\*(DY"" .ds DY \\*(MO \\n(dy, 19\\n(yr .. . \" FP - font position for a family .de FP .if '\\$1'palatino'\{\ . fp 1 PA . fp 2 PI . fp 3 PB . fp 4 PX\} .if '\\$1'lucidasans'\{\ . fp 1 R LucidaSans . fp 2 I LucidaSansI . fp 3 B LucidaSansB . fp 5 CW LucidaCW\} .if '\\$1'century'\{\ . ie '\\*(.T'202'\{\ . fp 1 NR Centsb . fp 2 NI CentI . fp 3 NB CentB . fp 4 NX CentBI\} . el \{\ . fp 1 NR . fp 2 NI . fp 3 NB . fp 4 NX\}\} .if '\\$1'helvetica'\{\ . fp 1 H . fp 2 HI . fp 3 HB . fp 4 HX\} .if '\\$1'bembo'\{\ . ie '\\*(.T'202'\{\ . fp 1 B1 Bembo . fp 2 B2 BemboI . fp 3 B3 BemboB . fp 4 B4 BemboBI\} . el \{\ . fp 1 B1 . fp 2 B2 . fp 3 B3 . fp 4 B4\}\} .if '\\$1'optima'\{\ . fp 1 R Optima . fp 2 I OptimaI . fp 3 B OptimaB . fp 4 BI OptimaBI\} .if '\\$1'souvenir'\{\ . fp 1 R Souvenir . fp 2 I SouvenirI . fp 3 B SouvenirB . fp 4 BI SouvenirBI\} .if '\\$1'melior'\{\ . fp 1 R Melior . fp 2 I MeliorI . fp 3 B MeliorB . fp 4 BI MeliorBI\} .if '\\$1'times'\{\ . fp 1 R . fp 2 I . fp 3 B . fp 4 BI\} .. . \" TL - title .de TL .br .if !\\n(1T .BG ....hy 0 .ft 3 .ps \\n(PS+2p .vs \\n(VS+2p .ll \\n(LLu .ce 100 \" turned off in .RT .sp .5i .. . \" AU - remember author(s) .de AU .ft 1 .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .SP .5 .. . \" AI - author's institution .de AI .SP .25 .ft 2 .. . \" AB - begin abstract .de AB .nr AB 1 \" we're in abstract .if !\\n(1T .BG .ft 1 .ps \\n(PS .vs \\n(VSp .ce .in +\\n(.lu/12u .ll -\\n(.lu/12u .SP 1 .ie \\n(.$ \\$1 .el ABSTRACT .SP .75 .RT .. . \" AE - end of abstract .de AE .br .nr AB 0 .in 0 .ll \\n(LLu .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .SP .. . \" 2C - 2 columns .de 2C .MC 2 .. . \" 1C - 1 column .de 1C .MC 1 .. . \" MC - multiple columns .de MC .br .if \\n(1T .RT .if \\n(1T .NP .if !\\n(OL .nr OL \\n(LL .if \\n(CW=0 .nr CW \\n(LL*7/15 .if \\n(GW=0 .nr GW \\n(LL-(2*\\n(CW) .nr x \\n(CW+\\n(GW .if "\\$1"" .MC 2 .if \\$1=1 \{\ . X MC 1 0 . nr LL \\n(OLu\} .if \\$1=2 \{\ . X MC 2 \\nx . nr LL \\n(CWu\} .ll \\n(LLu .if \\$1>2 .tm -mpm can't handle more than two columns .if \\n(1T .RT .. . \" TS - table start, TE - table end; also TC, TQ, TH .de TS .br .if !\\n(1T .RT .SP \\n(TSu TS .X "US TS .if \\$1H .TQ .nr IX 1 .. .de TC .nr TZ \\n(.lu .if \\n(.$ .nr TZ \\$1n .ta \\n(TZuR .. .de TD .LP .nr TZ 0 .. .de TQ .di TT .nr IT 1 .. .de TH .if \\n(.d>0.5v \{\ . nr T. 0 . T# 0\} .di .nr TQ \\n(.i .nr HT 1 .in 0 .mk #a .mk #b .mk #c .mk #d .mk #e .mk #f .TT .in \\n(TQu .mk #T .. . \" TE - table end .de TE .nr IX 0 .if \\n(IT .if !\\n(HT \{\ . di . nr EF \\n(.u . nf . TT . if \\n(EF .fi\} .nr IT 0 .nr HT 0 .rm a+ b+ c+ d+ e+ f+ g+ h+ i+ j+ k+ l+ n+ m+ .rr 32 33 34 35 36 37 38 40 79 80 81 82 .rr a| b| c| d| e| f| g| h| i| j| k| l| m| .rr a- b- c- d- e- f- g- h- i- j- k- l- m- .X "END US TE .SP \\n(TSu TE .bp .. . \" EQ - equation, breakout and display .de EQ .nr EF \\n(.u .rm EE .nr LE 1 \" 1 is center .ds EL \\$1 .if "\\$1"L" \{\ . ds EL \\$2 . nr LE 0\} .if "\\$1"C" .ds EL \\$2 .if "\\$1"R" \{\ . ds EL \\$2 \" 2 is right adjust . nr LE 2\} .if "\\$1"I" \{\ . nr LE 0 . if "\\$3"" .ds EE \\h'|10n' . el .ds EE \\h'\\$3' . ds EL \\$2\} .if \\n(YE .nf .di EZ .. . \" EN - end of equation .de EN .br .di .rm EZ .nr ZN \\n(dn .if \\n(ZN .if !\\n(YE .LP .if !\\n(ZN .if !"\\*(EL"" .nr ZN 1 .if \\n(ZN \{\ . SP .5v EQ . X "US EQ"\} 'pc .if \\n(BD .nr LE 0 \" don't center if block display or mark/lineup .if \\n(MK \{\ . if \\n(LE=1 .ds EE \\h'|10n' . nr LE 0\} 'lt \\n(.lu .if !\\n(EP .if \\n(ZN \{\ . if \\n(LE=1 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts . if \\n(LE=2 .tl \(ts\(ts\(ts\\*(10\\*(EL\(ts . if !\\n(LE \{\ . if !\\n(BD .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts . if \\n(BD .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts . if \\n(BD \!\\*(10\\t\\*(EL\}\} .if \\n(EP .if \\n(ZN \{\ . if \\n(LE=1 .tl \(ts\\*(EL\(ts\\*(10\(ts\(ts . if \\n(LE=2 .tl \(ts\\*(EL\(ts\(ts\\*(10\(ts . if !\\n(LE \{\ . if !\\n(BD .tl \(ts\\*(EL\\*(EE\\*(10\(ts\(ts\(ts . if \\n(BD .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts . if \\n(BD \!\\h'-\\\\n(.iu'\\*(EL\\h'|0'\\*(10\}\} 'lt \\n(LLu 'pc % .if \\n(YE .if \\n(EF .fi .if \\n(ZN .X "END US EQ" .if \\n(ZN .SP .5v EN .if \\n(ZN .bp .. . \" PS - start picture .de PS \" $1 is height, $2 is width, in inches .br .nr X 0.35v .if \\$1>0 .X "SP \\nX PS" .ie \\$1>0 .nr $1 \\$1 .el .nr $1 0 .X "US PS \\$1 .in (\\n(.lu-\\$2)/2u .. . \" PE - end of picture .de PE .in .X "END US PE .nr X .65v .if \\n($1>0 .X "SP \\nX PE" .bp .. .de IS \" for -mpm only .KS .. .de IE .KE .bp .. . \" NP - new page .de NP .ev 2 .bp .if \\n(KF=0 \{\ . nr PX \\n(.s . nr PF \\n(.f . nr PV \\n(.v . lt \\n(LTu . ps \\n(PS . vs \\n(PS+2 . ft 1 . if \\n(PO .po \\n(POu \" why isn't this reset??? . PT \\$1 . bp . rs . BT . bp . nr %# +1 . ps \\n(PX . vs \\n(PVu . ft \\n(PF \} .ev .. . .ds %e .tl '\\*(LH'\\*(CH'\\*(RH' .ds %o .tl '\\*(LH'\\*(CH'\\*(RH' .ds %E .tl '\\*(LF'\\*(CF'\\*(RF' .ds %O .tl '\\*(LF'\\*(CF'\\*(RF' . . \" PT - page title .de PT .nr PN \\n(%# .X "PT \\n(%# .sp \\n(HMu/2u .if \\n(OL .lt \\n(OLu \" why isn't this reset??? .if \\n(BT>0 .if \\n(%#%2 \\*(%o .if \\n(BT>0 .if !\\n(%#%2 \\*(%e .if \\n(BT=0 .tl '\0''' \" put out something or spacing is curdled .X "END PT \\n(%# .. . \" BT - bottom title .de BT .X "BT \\n(%# .sp |\\n(FMu/2u+\\n(FOu-1v .if \\n(%#%2 \\*(%O .if !\\n(%#%2 \\*(%E .nr BT \\n(BT+1 .X "END BT \\n(%# .. . \" KS - non-floating keep .de KS .br .if "\\n(.z"" .NP \" defends poorly against including ht of page stuff in diversion for .B1 .X "US KS 0 .nr KS +1 .SP \\n(Ksu .. . \" KF - floating keep .de KF .ev 1 .br .if \\n(KS>0 .tm KF won't work inside KS, line \\n(.c, file \\n(.F .if \\n(KF>0 .tm KF won't work inside KF, line \\n(.c, file \\n(.F .nr KF 1 .nr 10 0 . if !'\\$1'' .nr 10 \\$1u . if '\\$1'bottom' .nr 10 \\n(FOu-1u . if '\\$1'top' .nr 10 \\n(HM . if \\n(10 .X "UF \\n(10 KF" . if !\\n(10 .X "UF \\n(HM KF" . nr X \\n(FOu-2u . if \\n(10 .X "UF \\n(10 KF" . if !\\n(10 .X "UF \\nX KF" .nr SJ \\n(.u .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .ll \\n(LLu .lt \\n(LTu .SP \\n(Kfu .. . \" KE - end of KS/KF .de KE .bp .ie \\n(KS>0 \{\ . SP \\n(Ksu . X "END US KS . nr KS -1 \} .el .ie \\n(KF>0 \{\ . SP \\n(Kfu . nr KF 0 . X "END UF KF" . if \\n(SJ .fi . ev \} .el .tm .KE without preceding .KS or .KF, line \\n(.c, file \\n(.F .. . . \" DS - display. .DS C center; L left-adjust; I indent (default) .de DS \" $2 = amount of indent .KS .nf .\\$1D \\$2 \\$1 .ft 1 .if !\\n(IF \{\ . ps \\n(PS . if \\n(VS>40 .vs \\n(VSu . if \\n(VS<=39 .vs \\n(VSp\} .. .de D .ID \\$1 .. .de CD .XD .ce 1000 .. .de ID .XD .if \\n(.$=0 .in +\\n(DIu .if \\n(.$=1 .if "\\$1"I" .in +\\n(DIu .if \\n(.$=1 .if !"\\$1"I" .in +\\$1n .if \\n(.$>1 .in +\\$2n .....in +0.5i .....if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in \\n(DIu .....if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in +\\$1n .. .de LD .XD .. .de XD .nf .nr OI \\n(.i .SP \\n(DVu .. . \" BD - block display: save everything, then center it. .de BD .XD .nr BD 1 .nf .in \\n(OIu .di DD .. . \" DE - display end .de DE .ce 0 .if \\n(BD>0 .XF .nr BD 0 .in \\n(OIu .SP \\n(DVu .KE .fi .. . \" XF - finish a block display to be recentered. .de XF .di .if \\n(dl>\\n(BD .nr BD \\n(dl .if \\n(BD<\\n(.l .in (\\n(.lu-\\n(BDu)/2u .nr EI \\n(.l-\\n(.i .ta \\n(EIuR .nf .DD .in \\n(OIu .. . . . \" SH - (unnumbered) section heading .de SH .RT .nr X 1v .nr Y 3v .if \\n(1T .NP .if \\n(1T .X "NE \\nY SH" \" should these be reversed, change Y to 4v .if \\n(1T .X "SP \\nX SH .ft 3 .. . \" NH - numbered heading .de NH .RT .nr X 1v .nr Y 3v .if \\n(1T .NP .if \\n(1T .X "NE \\nY NH" \" should these be reversed, change Y to 4v .if \\n(1T .X "SP \\nX NH .ft 3 .nr NS \\$1 .if !\\n(.$ .nr NS 1 .if !\\n(NS .nr NS 1 .nr H\\n(NS +1 .if !\\n(NS-4 .nr H5 0 .if !\\n(NS-3 .nr H4 0 .if !\\n(NS-2 .nr H3 0 .if !\\n(NS-1 .nr H2 0 .if !\\$1 .if \\n(.$ .nr H1 1 .ds SN \\n(H1. .if \\n(NS-1 .as SN \\n(H2. .if \\n(NS-2 .as SN \\n(H3. .if \\n(NS-3 .as SN \\n(H4. .if \\n(NS-4 .as SN \\n(H5. \\*(SN .. . \" RT - reset at beginning of each PP, LP, etc. .de RT .if !\\n(AB .if !\\n(1T .BG .ce 0 .if !\\n(AB .if !\\n(KF .if !\\n(IF .if !\\n(IX .if !\\n(BE .di .if \\n(QP \{\ . ll +\\n(QIu . in -\\n(QIu . nr QP -1\} .if !\\n(AB \{\ . ll \\n(LLu\} .if !\\n(IF .if !\\n(AB \{\ . ps \\n(PS . ie \\n(VS>=41 .vs \\n(VSu . el .vs \\n(VSp\} .ie \\n(IP \{\ . in \\n(I\\n(IRu . nr IP -1\} .el .if !\\n(IR \{\ . nr I1 \\n(PIu . nr I2 0 . nr I3 0 . nr I4 0 . nr I5 0\} .if !\\n(AB .ft 1 .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n .fi .. . \" BG - begin, execute at first TL, AB, NH, SH, PP, etc. .de BG \" IZ has been called, so registers have some value .br .if \\n(CW>0 .if \\n(LL=0 .nr LL \\n(CW+\\n(CW+\\n(GW .ll \\n(LLu .lt \\n(LLu .po \\n(POu .nr YE 1 \" ok to cause break in .EQ (earlier ones won't) .ev 0 .hy 14 .ev .ev 1 .hy 14 .ev .ev 2 .hy 14 .ev .nr 1T 1 .X "PARM NP \\n(HM .X "PARM FO \\n(FO .if !\\n(%# .nr %# 1 .. . \" PP - paragraph .de PP .RT .if \\n(1T .NP .if \\n(1T .X "SP \\n(PD PP" .if \\n(1T .X "BS 2 PP" .ti +\\n(PIu .. . \" LP - left aligned paragraph .de LP .RT .if \\n(1T .NP .if \\n(1T .X "SP \\n(PD LP" .if \\n(1T .X "BS 2 LP" .. . \" IP - indented paragraph .de IP .RT .if !\\n(IP .nr IP +1 .if \\n(1T .NP .if \\n(1T .X "SP \\n(PD PP" .if \\n(1T .X "BS 2 IP" .nr IU \\n(IR+1 .if \\n(.$>1 .nr I\\n(IU \\$2n+\\n(I\\n(IRu .if \\n(I\\n(IU=0 .nr I\\n(IU \\n(PIu+\\n(I\\n(IRu .in \\n(I\\n(IUu .nr TY \\n(TZ-\\n(.i .nr JQ \\n(I\\n(IU-\\n(I\\n(IR .ta \\n(JQu \\n(TYuR .if \\n(.$ \{\ .ti \\n(I\\n(IRu \&\\$1\t\c\} .. . \" QP - quoted paragraph (within IP) .de QP .RT .if \\n(1T .NP .if \\n(1T .X "SP \\n(PD QP" .if \\n(1T .X "BS 2 QP" .nr QP 1 .in +\\n(QIu .ll -\\n(QIu .ti \\n(.iu .. . \" RS - prepare for double indenting .de RS .nr IS \\n(IP .RT .nr IP \\n(IS .nr IU \\n(IR .nr IR +1 .if !\\n(I\\n(IR .nr I\\n(IR \\n(I\\n(IU+\\n(PIu .in \\n(I\\n(IRu .nr TY \\n(TZ-\\n(.i .ta \\n(TYuR .. . \" RE - retreat to the left .de RE .nr IS \\n(IP .RT .nr IP \\n(IS .if \\n(IR>0 .nr IR -1 .in \\n(I\\n(IRu .. . \" B - bold font .de B .nr PQ \\n(.f .ft 3 .if \\n(.$ \&\\$1\\f\\n(PQ\\$2 .. . \" BI - bold italic .de BI .nr PQ \\n(.f .ft 4 .if \\n(.$ \&\\$1\\f\\n(PQ\\$2 .. . \" R - Roman font .de R .nr PQ \\n(.f .ft 1 .if \\n(.$ \&\\$1\f\\n(PQ\\$2 .. . \" I - italic font .de I .nr PQ \\n(.f .ft 2 .if \\n(.$ \&\\$1\^\f\\n(PQ\\$2 .. . \" CW - constant width font from -ms .de CW .nr PQ \\n(.f .if \\n(.$=0 .ft CW .if \\n(.$>0 \%\&\\$3\f(CW\\$1\\f\\n(PQ\\$2 .. .de IT \" ditto to italicize argument .nr Sf \\n(.f \%\&\\$3\f2\\$1\f\\n(Sf\&\\$2 .. . \" TA - tabs set in ens or chars .de TA .ta \\$1n \\$2n \\$3n \\$4n \\$5n \\$6n \\$7n \\$8n \\$9n .. . \" SM - make smaller size .de SM .ie \\n(.$ \&\\$3\s-2\\$1\s0\\$2 .el .ps -2 .. . \" LG - make larger size .de LG .ie \\n(.$ \&\\$3\s+2\\$1\s0\\$2 .el .ps +2 .. . \" NL - return to normal size .de NL .ps \\n(PS .. . \" FS - begin footnote .de FS .if \\n(IF>0 .tm .FS within .FS/.FE, line \\n(.c, file \\n(.F .if \\n(KF>0 .tm .FS won't work inside .KF, line \\n(.c, file \\n(.F .if \\n(KS>0 .tm .FS won't work inside .KS, line \\n(.c, file \\n(.F .nr IF 1 .ev 1 .ps \\n(PS-2 .ie \\n(VS>=41 .vs \\n(VSu-2p .el .vs \\n(VSp-2p .ll \\n(LLu .br .nr X \\n(FOu .X "BF \\nX FS .SP .3v ....FA \" deleted by authority of cvw, 10/17/88 .. . \" FE - end footnote .de FE .if !\\n(IF .tm .FE without .FS, line \\n(.c, file \\n(.F .br .X "END BF FE .bp .ev .nr IF 0 .. . \" FA - the line for a footnote .de FA \l'1i' .br .. . \" Tm - message to be passed on .de Tm .ev 2 .if \\n(.$=1 .X "TM \\$1 .if \\n(.$=2 .X "TM \\$1 \\$2 .if \\n(.$=3 .X "TM \\$1 \\$2 \\$3 .if \\n(.$=4 .X "TM \\$1 \\$2 \\$3 \\$4 .if \\n(.$=5 .X "TM \\$1 \\$2 \\$3 \\$4 \\$5 .if \\n(.$=6 .X "TM \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .if \\n(.$=7 .X "TM \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 .if \\n(.$=8 .X "TM \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 .if \\n(.$=9 .X "TM \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .br .ev .. .de MH AT&T Bell Laboratories Murray Hill, New Jersey 07974 .. .de HO AT&T Bell Laboratories Holmdel, New Jersey 07733 .. .de WH AT&T Bell Laboratories Whippany, New Jersey 07981 .. .de IH AT&T Bell Laboratories Naperville, Illinois 60540 .. . \" UL - underline argument, don't italicize .de UL \\$1\l'|0\(ul'\\$2 .. . \" UX - print $2 UNIX $1 .de UX .ie \\n(UX \\$2\s-1UNIX\s0\\$1 .el \{\ \\$2\s-1UNIX\\s0\\$1\(rg .nr UX 1\} .. . \" QS - start quote .de QS .br .LP .in +\\n(QIu .ll -\\n(QIu .. . \" QE - end quote .de QE .br .ll +\\n(QIu .in -\\n(QIu .LP .. . \" B1 - begin boxed stuff .de B1 .br .di BB .nr BC 0 .if "\\$1"C" .nr BC 1 .nr BE 1 .. . \" B2 - end boxed stuff .de B2 .br .nr BI 1n .if \\n(.$>0 .nr BI \\$1n .di .nr BE 0 .nr BW \\n(dl .nr BH \\n(dn .ne \\n(BHu+\\n(.Vu .nr BQ \\n(.j .nf .ti 0 .if \\n(BC>0 .in +(\\n(.lu-\\n(BWu)/2u .in +\\n(BIu .ls 1 .BB .ls .in -\\n(BIu .nr BW +2*\\n(BI .sp -1 \l'\\n(BWu\(ul'\L'-\\n(BHu'\l'|0\(ul'\h'|0'\L'\\n(BHu' .if \\n(BC>0 .in -(\\n(.lu-\\n(BWu)/2u .if \\n(BQ .fi .br .. . \" BX - boxed stuff .de BX \(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul' .. . . \" macros for programs, etc. . .ig programs are displayed between .P1/.P2 pairs default is to indent by 1/2 inch, nofill, dP smaller .P1 x causes an indent of x instead. .P3 can be used to specify optional page-break points inside .P1/.P2 .. . . \" P1 - start of program .de P1 .nr $1 \\n(P1 .if \\n(.$ .nr $1 \\$1n .br .X "SP \\n(DV P1" .X "US P1" .in \\n($1u .nf .nr v \\n(.v .ps -\\n(dP .vs -\\n(dVu .ft CW .nr t \\n(dT*\\w'x'u .ta 1u*\\ntu 2u*\\ntu 3u*\\ntu 4u*\\ntu 5u*\\ntu 6u*\\ntu 7u*\\ntu 8u*\\ntu 9u*\\ntu 10u*\\ntu 11u*\\ntu 12u*\\ntu 13u*\\ntu 14u*\\ntu .. . \" P2 - end of program .de P2 .br .ps \\n(PS .vs \\nvu .ft 1 .in .X "END US P1 .X "SP \\n(DV P2" .fi .. . \" P3 - provides optional unpadded break in P1/P2 .de P3 .nr x \\n(DV .nr DV 0 .P2 .P1 \\n($1u .nr DV \\nx .. .de [ [ .. .de ] ] .. .IZ .rm IZ .so /home/anselm/plan9port/tmac/tmac.srefs 9base-6/troff/tmac/tmac.soft0000644000175000017500000004056011402154555015440 0ustar anselmanselm.\" From mel Sat Sep 16 14:46:23 1978 .\" the GE macro places figures. .\" G8 is zero until the figure is placed .\" G5 is non-zero if there was an argument .\" on GS which specifies .\" 1 - top .\" 2 - bottom .\" 3 - next page .\" 4 - at this point .\" the macros HN - top next pge .\" HT - top this page .\" HB - bottom this page .\" HH : here on this page .\" The current algorithm is: if it does not fit, .\" top next page; otherwise if no arg to GS .\" put it at top or bottom of this page, whichever .\" is closer (there is a threshold of half the figure .\" size or something) .\" if arg to GS is given it governs. .\" .de Vx \" volume, number, Month, year, page 1, page n, top title(s) in one blast (bwk) .\" also needs DY for date received as 31 July 1978 .ds VN \\$1 .ds NU \\$2 .ds mo \\$3 .if "\\$3"January" .ds MO JANUARY .if "\\$3"February" .ds MO FEBRUARY .if "\\$3"March" .ds MO MARCH .if "\\$3"April" .ds MO APRIL .if "\\$3"May" .ds MO MAY .if "\\$3"June" .ds MO JUNE .if "\\$3"July" .ds MO JULY .if "\\$3"August" .ds MO AUGUST .if "\\$3"September" .ds MO SEPTEMBER .if "\\$3"October" .ds MO OCTOBER .if "\\$3"November" .ds MO NOVEMBER .if "\\$3"December" .ds MO DECEMBER .nr yr \\$4 .nr P \\$5-1 .nr P< \\$5 .pn \\$5 .nr P> \\$6 .ds Tl \\$7 .ds Tr \\$8 .. .de PS \" start picture (bwk) . \" $1 is height, $2 is width in units .if t .SP .3 .in (\\n(.lu-\\$2u)/2u .ne \\$1u .. .de PE \" end of picture .in .if t .SP .6 .. .di XX .nr Q1 0 .rn ne NE .de ne .nr NB \\$1v .if \\n(.t<\\n(NB \{\ .dt \\n(.du+4u \\*(DT .sp\} .. .ds Co \s12\v'.2m'\(co\v'-.2m'\s0 20\\n(yr by John Wiley & Sons, Ltd. .de CO .ps 8 .vs 9p .nf SOFTWARE\(emPRACTICE AND EXPERIENCE, VOL. \\*(VN(\\*(NU), \\n(P<-\\n(P> (\\*(MO 20\\n(yr) .fi .ft 1 .lt \\n(LLu .ps \\n(PS .vs \\n(VSp .. .nr BS 1 .de IZ .if \\n(PS=0 .nr PS 10 .if \\n(VS=0 .nr VS 12 .if \\n(PL=0 .nr PL 10.25i .if \\n(LP=0 .nr LP 8i .if \\n(LL=0 .nr LL 5.6i .if \\n(LS=0 .nr LS 0.9v .if \\n(JS=0 .nr JS 0.5v .nr ZI 0.3i .nr ZJ 0.3i .ps \\n(PS .vs \\n(VSp .pl \\n(PLu .ll \\n(LLu .nr L4 \\n(LPu-\\n(LSu .dt \\n(L4u EP .ds DT EP .em EM .. .de TL .IZ .rm IZ .CO .SP .5i .ps 16 .ft 1 .vs 30p .br .if \\n(.d=0 .nr TP 1 .if \\n(.t<4v .nr TO 1 .di TX .nr FR 0 .nr IT 1 .na .ll \\n(LLu-.5i .. .de ET .br .di .dt \\n(L4u \\*(DT .ad .ll \\n(LLu .ce 100 .nf .TX .rm TX .fi .nr IT 0 .. .de AU .if \\n(IT>0 .ET .ft 1 .br .sp .6 .ps 8 .vs \\n(VSp .ce 100 .. .de AI .sp 3p .ps 8 .ft 2 .ce 100 .. .de RD .ps -1 .ce .if \\n(.n>\\n(.l .tm Too many authors on a line .. .de AB .ce 0 .nr AB 1 .ft 3 .ce .SP .2i SUMMARY .ps \\n(PS .vs \\n(VSp .SP .5v .. .de AE .ft 1 .nr AB 0 .nr FR 0 .nr HI 1 .SP .8v .. .de OK .br .ft 1 .ps 6 KEY WORDS \c .ps 7 .. .de PP .RT .if \\n(.i>0 .SP \\n(JSu .in 0 .if \\n(FR=0 .ps \\n(PS .ti +2n .if \\n(AB=0 .ft 1 .nr FR 1 .. .de LP .RT .if \\n(.i>0 .SP \\n(JSu .in 0 .if \\n(FR=0 .ps \\n(PS .nr FR 1 .if \\n(AB=0 .ft 1 .. .de IP .ce 0 .if \\n(FR=0 .ps \\n(PS .nr FR 1 .if \\n(.i=0 .SP .5v .in \\n(ZJu .ti -\\n(ZIu \\$1\h'|\\n(ZIu'\c .. .de JP .ce 0 .\".if \\n(.d>0 .if \\n(.d<1.5v .if \\n(HI=0 .tm Top widow page \\n% (JP) .if \\n(FR=0 .ps \\n(PS .nr FR 1 .if \\n(.i=0 .SP \\n(JSu .in \\n(ZJu .ti -.4i .if \\n(.f=1 \h'0.3i-\w"(\f2\\$1\|\fP)"u'(\f2\\$1\|\fP)\h'|.4i'\c .if \\n(.f=2 \h'0.3i-\w"(\f2\\$1\^\fP)"u'(\f2\\$1\^\fP)\h'|.4i'\c .. .de SH .nr HQ \\n(HI .RT .in 0 .nr HI \\n(HQ .ne 2v+\\n(.Vu .ft 3 .if \\n(HI=0 .if \\n(.d>0 .SP 1.25v .if \\n(HI>0 .if \\n(.d>0 .if \\n(FR>0 .sp 1 .nr FR 1 .nr HI 1 .. .de EP .di .nr L1 \\n(dn .ev 1 .ce 0 .ll \\n(LLu .br .rs .sp .75i-1v .if \\n(TP=0 .PT .if \\n(TP>0 .sp .nr TO 0 .sp 1 .nr P1 \\n(LP-\\n(L1 .nf .nr P1 -\\n(G1 .nr P1 -\\n(G2 .if \\n(P1<0 .nr Q1 0 .if \\n(EX=1 .nr Q1 0 \" don't pad on last page of article .nr P3 \\n(P1 .if \\n(G1>0 .GT .if \\n(G1>0 .if \\n(EX=0 .sp \\n(P1u .if \\n(G1>0 .if \\n(EX=0 .nr P1 0 .rm GT .if \\n(G1>0 .nr Q1 0 \" if top figure, pad below .if \\n(G2>0 .nr Q1 0 \" if bottom figure pad above .if \\nB .tm Page \\n%: pad \\n(P3 space \\n(Q1 places, top \\n(G1, bot \\n(G2 .XX .nf .if \\n(G2>0 .if \\n(P1>0 .sp \\n(P1u .if \\n(G2>0 .nr P1 0 .if \\n(G2>0 .GB .nr G1 0 .nr G2 0 .if \\n(EX>0 .if \\n(P1>0 .sp \\n(P1u .if \\nB .tm Bottom of page \\n% at \\n(nl .rm GB .PF .bp .nr TQ \\n(TP .nr TP 0 .nr G1 \\n(G3 .rn GN GT .nr G3 0 .ev .nr FP 0 .nr Q1 0 .nr L4 \\n(LPu-\\n(LSu .if \\n(G1>(\\n(L4-1i) .FB \" full page figure .nr L4 -\\n(G1 .nr LX \\n% .af LX 1 .ie \\n(LX<=26 .af LX a .el \{.nr LX -26 .af LX A\} .nr L4 -\\n(C\\n(LXu .di XX .dt \\n(L4u EP .ds DT EP .. .de FB .if \\nB .tm Full page figure on page \\n% .ev 1 .rs .sp .75i-1v .PT .rs .GT .rm GT .nr G1 0 .PF .bp .ev .. .de CP \" cut text on page arg1 by arg2 .nr C2 \\$2v .nr C1 \\$1 .af C1 1 .if \\n(C1>52 .tm Page>52, gok what happens. .ie \\n(C1<=26 .af C1 a .el \{.nr C1 -26 .af C1 A\} .if \\n(C2>0 .nr C\\n(C1 \\n(C2 .. .de SP .if \\n(.t<\\$1 .\\*(DT .if \\n(.d>0 .ST \\$1 .. .de ST .sp \\$1 .nr Q1 +1 \!.FI .. .de FI .nr P4 0 .if \\n(Q1>0 .nr P4 3*((\\n(P1/3)/\\n(Q1) .sp \\n(P4u .if \\n(P4>1v .tm Padding of \\n(P4u exceeds one space page \\n% .nr P1 -\\n(P4 .nr Q1 -1 .. .de CL \" change length: add/sub lines this page .nr CN \\$1v .nr L4 \\n(L4+\\n(CN .dt \\n(L4u EP .. .de GS . \"argument positions: 1 top here, 2 bottom here, 3 next page, 4 right here .if \\n(.$>0 .if \\$1=4 .br .ev 1 .di GD .ll \\n(LLu .if \n(KK=0 .ps \\n(PS-2 .if \n(KK=0 .vs \\n(VSp-4p .nr G5 0 .if \\n(.$>0 .nr G5 \\$1 .fi .. .de GE .br .di .nf .nr G0 \\n(dn .nr G0 +1v .nr G8 0 \" not placed .if \\n(KG=0 .if \\n(G8=0 .if \\n(G0>\\n(.t .HN .if \\n(G8=0 .if \\n(G5=0 .if \\n(G0>2*\\n(.d .if \\n(G1=0 .HT .if \\n(G8=0 .if \\n(G5=0 .if 3*\\n(G0>2*\\n(.t .if \\n(G2=0 .HB .if \\n(G8=0 .if \\n(G5=0 .HH .if \\n(G8=0 .if \\n(G5=1 .HT .if \\n(G8=0 .if \\n(G5=2 .HB .if \\n(G8=0 .if \\n(G5=3 .HN .if \\n(G8=0 .if \\n(G5=4 .HH .rm GD .ps \\n(PS .vs \\n(VSp .ev .. .de FS .GS 2 .br .if \\n(FP=0 \{\ .vs 2p .br \l'.75i' .vs .sp 2p .nr FP 1 .br\} .. .de FE .GE .. .de KS .if \\n(KK=0 .GS 4 .nr KK 1 .nr KG 1 .. .de KE .if \\n(KK>0 .GE .nr KK 0 .nr KG 0 \" KG on if not a floating display .. .de HN .if \\n(G3>0 .tm Two figures pushed to next page. .da GN .GD .sp 1 .di .nr G3 \\n(dn .nr G8 1 .. .de HT .nr L4 -\\n(G0 .dt \\n(L4u \\*(DT .da GT .GD .sp .di .nr G1 +\\n(dn .nr G8 1 .. .de HB .da GB .if \\n(FP=0 .sp .GD .di .nr G2 +\\n(dn .nr G8 1 .nr L4 -\\n(dn .dt \\n(L4u \\*(DT .. .de HH .SP .5v .if \\n(G0>\\n(.t .if \\n(KK>0 .sp 10i .GD .SP .5v .nr G8 1 .. .de RR .ce 0 .if \\n(FR=0 .ps \\n(PS .nr FR 1 .ft 1 .in .3i .if \\n(.$ .ti -.3i .if \\n(.$ \\$1\ \ \c .. .de RF .SP 2v .ps \\n(PS-2 .vs \\n(VS-3 .ne 3v .ce .ps -1 REFERENCES .sp 3p .. .de PT .if \\n(PF>0 .af % 1 .if \\n(Pf>0 .if o .tl ""\s7\\*(Tr\s0"\s10\\n%" .if \\n(Pf>0 .if e .tl "\s10\\n%"\s7\\*(Tl\s0"" .. .de PF .sp 1v .lt \\n(.lu .nr Ss \\n(.s .nr Sf \\n(.f .ps 9 .af NU 01 .af VN 01 .af P< 0001 .nr VN \\*(VN .nr NU \\*(NU .\" price = 1.00 if <= 10 pages, otherwise .10/page. .nr p1 (1+\\n(P>-\\n(P<)*10 .if \\n(p1<100 .nr p1 100 .nr p2 \\n(p1%100 .nr p1 \\n(p1/100 .ds pr \\n(p1.\\n(p2 .if \\n(Pf=0 .tl "\s90038-0644/\\n(yr/\\n(NU\\n(VN-\\n(P<$0\\*(pr""\f2Received \\*(DY\f1\s0" .if \\n(Pf=0 \s9\\*(Co\s0 .af % 1 .nr Pf \\n(Pf+1 .ft \\n(Sf .ps \\n(Ss .. .de EQ \"equation, breakout and display .nr EF \\n(.u .ds EE \\h'.5i' \" default for indent is .5 inch .nr LE 1 \" 1 is center, 0 is I or L .ds EL \\$1 .if "\\$1"L" .ds EL \\$2 .if "\\$1"L" .nr LE 0 .if "\\$1"C" .ds EL \\$2 .if "\\$1"I" .nr LE 0 .if "\\$1"I" .ds EE \\h'.5i' .if "\\$1"I" .if !"\\$3"" .ds EE \\h'\\$3' .if "\\$1"I" .ds EL \\$2 .ev 1 .di EZ .. .\" ----------------------------- .de EN \" end of a displayed equation .if !"\\n(.z"EZ" .tm EN not preceded by EQ, disaster follows. .br .ce 0 .di .rm EZ .ev .nr ZN 1 .if "\\*(10"" .nr ZN 0 .if \\n(ZN=0 .if !"\\*(EL"" .nr ZN 1 .lt \\n(.lu .br .if \\n(ZN>0 .if !\\n(.d=\\n(PE .SP 0.5 .pc .if \\n(BD>0 .nr LE 0 \" can't mean centering in this case. .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\*(10\\\\t\\*(EL .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w'\\*(10' .nr BD \\w'\\*(10' .lt \\n(LLu .pc % .br .if \\n(ZN>0 .if \\n(EF>0 .fi .rm EL .if \\n(ZN>0 .SP 0.5 .nr PE \\n(.d .rm 10 .. .de B .if \\n(.$>0 \\$3\f3\\$1\fP\\$2 .if \\n(.$=0 .ft 3 .. .de I .if \\n(.$>0 \\$3\f2\\$1\fP\^\\$2 .if \\n(.$=0 .ft 2 .. .de R .ft 1 .. .de EM .br .nr EX 1 .wh -1p .CM .sp 100 .. .de TS .nf .sp .5v .. .de TE .fi .sp .5v .. .de CM .po 0 .tl '\(ru''' .po .. .wh 0 CM .de RT .br .\".if \\n(.d>0 .if \\n(.d<1.5v .if \\n(HI=0 .tm Top widow page \\n% .IZ .rm IZ .if "\\n(.z"PA" .tm Warning: are you missing a .P2? .if \\n(IT>0 .ET .ps \\n(PS .vs \\n(VSp .if \\n(HI .sp .5v .if \\n(HI .if \\n(.d<=1.5v .if \\n(G1=0 .sp .5v .nr HI 0 .ce 0 .. . \"ACCENTS say \*'e or \*`e to get e acute or e grave .ds ' \h'\w'e'u*4/10'\z\(aa\h'-\w'e'u*4/10' .ds ` \h'\w'e'u*4/10'\z\(ga\h'-\w'e'u*4/10' . \"UMLAUT \*:u, etc. .ds : \v'-0.6m'\h'(1u-(\\n(.fu%2u))*0.13m+0.06m'\z.\h'0.2m'\z.\h'-((1u-(\\n(.fu%2u))*0.13m+0.26m)'\v'0.6m' . \"TILDE and CIRCUMFLEX .ds ^ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z^\h'|\\n:u' .ds ~ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z~\h'|\\n:u' . \"dotted arrow .ds > \v'-.1m'\s-4---\z-\v'.1m'\h'-.3m'\z>\s+4 . \"czech symbol as in kucera & francis .ds C \h'.1m'\v'-0.6m'\s6\zv\s0\v'0.6m'\h'-.1m' .. . \"NH - numbered heading .de NH .nr HQ \\n(HI .RT .nr HI \\n(HQ .ne 2v+\\n(.Vu .ft 1 .if \\n(Nh=0 .SP 1.2v .nr Nh \\n(Nh+1 .if \\n(HI=0 .if \\n(.d>0 .SP 1.5v .if \\n(HI>0 .if \\n(.d>0 .if \\n(FR>0 .sp 1 .nr FR 1 .nr HI 1 .ce 100 \\n(Nh. \c .. . \"Ch - centered, unnumbered heading .de Ch .RT .ne 2v+\\n(.Vu .sp 1 .ft 1 .ce 100 .. . \"Lh - left-justified, unnumbered heading .de Lh .RT .ne 2v+\\n(.Vu .sp 1 .ft 3 .. .de IH .nr H4 +1 .ft 2 \\n(H1.\\n(H2.\\n(H3.\\n(H4 \\$1 .ft 1 .. .de UX .ie \\n(GA>0 \\$2\s-2UNIX\s0\\$1 .el \{\ .if n \\$2UNIX\(dg\\$1 .if t \\$2\s-2UNIX\s0\(dg\\$1 .FS \(dg \s-2UNIX\s0 is a registered trademark of X/Open. .FE .nr GA 1\} .. .de Ux \" cap-small cap, not used .\" .ie \\n(GA>0 \\$2U\s-2NIX\s0\\$1 .ie \\n(GA>0 \\$2\s-2UNIX\s0\\$1 .el \{\ .if n \\$2UNIX*\\$1 .\".if t \\$2U\s-2NIX\s0*\\$1 .if t \\$2\s-2UNIX\s0*\\$1 .FS * \s-2UNIX\s0 is a registered trademark of X/Open. .FE .nr GA 1\} .. .de US the .UX operating system .. .so /usr/lib/tmac/tmac.sdisp .de KF .if \\n(KK=0 .GS .nr KK 1 .. .tr |\(or .de UL .if n .ul \&\\$3\f3\\$1\fP\&\\$2 .. .de UC \&\\$3\s-2\\$1\\s+2\&\\$2 .. .de Uc \" cap-small cap, not used .\" \&\\$4\\$1\s-2\\$2\s+2\&\\$3 \&\\$4\s-2\\$1\\$2\s+2\&\\$3 .. .de IT .if n .ul \&\\$3\f2\\$1\fP\|\&\\$2 .. .de UP \&\\$3\\f3\s-2\\$1\s+2\f1\&\\$2 .. .de P1 .nr PC \\n(.i .nf .di PA .lg 0 .if n .ls 1 .if n .ta 5 10 15 20 25 30 35 40 45 50 55 60 .if t .ta .4i .8i 1.2i 1.6i 2i 2.4i 2.8i 3.2i 3.6i 4i 4.4i 4.8i 5.2i 5.6i .if t .tr -\-|\(bv'\(fm*\(** .if t .tr ~\(ap .tr _\(ru .if t .ss 20 .ft 3 .lg 0 .ps 9 .vs 12p .in 0 .. .de P2 .if t .ss 12 .ft R .if n .ls 2 .tr --''^^!!** .lg .in \\n(PCu .di .if \\n(dl>(\\n(.l-\\n(.i) .tm Page \\n% program fragment too wide .nr PB \\n(.l-\\n(dl-\\n(.i-2n .if \\n(PB<0 .nr PB 0 .nr PB \\n(PB/2 . \" indent; don't center .nr PB .5i .in +\\n(PBu .nf .SP .5v .PA .SP .5v .in -\\n(PBu .fi .ps \\n(PS .vs \\n(VSp .. .de X .ul \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de Y .ti \\n(.yu*2u .ul \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de QH .NH 2 .ti 0 .ft 2 .. .de PN .nr NQ \\n(.f \&\\$3\\f3\\$1\f\\n(NQ\\$2 .. .de ][ .\".if \\n(.d>0 .if \\n(.d<1.5v .tm Top widow page \\n% .if \\$1>5 .tm Bad arg to ][ .Fx \\*([D .[\\$1 .. .if n .ds [. [ .if t .ds [. \s-2\v'-.4m'\f1 .if n .ds .] ] .if t .ds .] \v'.4m'\s+2\fP .if n .ds [o "" .if n .ds [c "" .if t .ds [o ` .if t .ds [c ' .de [5 \" tm style .QP "\\*([F.\0" \\*([A, unpublished work (\\*([D). .in 0 .RT .. .de [0 \" other .QP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\f2\\*([T\\f1\c .if !"\\*([T"" .if !"\\*([O"" ,\ .ie !"\\*([O"" \\*([O .el .if !"\\*([T"" \&. .if !"\\*([D"" \\*([D. .in 0 .RT .. .de [1 \" journal article .if "\\*([Q"This issue" .rm [V [N [D .if !"\\*([R"" .rm [C .QP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\*([o\\*([T,\\*([c .ft 2 .if "\\*([V"" .if !"\\*([C"" \\*([J, .if "\\*([V"" .if "\\*([C"" .if !"\\*([Q"This issue" \\*([J .if "\\*([V"" .if "\\*([C"" .if "\\*([Q"This issue" \\*([J, .if !"\\*([V"" \\*([J, .ft 1 .if !"\\*([V"" \{.if n Vol.\& \\f3\\*([V\\f1,\} .if !"\\*([N"" \\*([N, .if !"\\*([C"" \\*([C .if !"\\*([P"" \\*([P .if !"\\*([D"" (\\*([D). .in 0 .RT .. .de [2 \" book .QP "\\*([F.\0" .if !"\\*([A"" \\*([A, \\f2\\*([T,\\f1 \\*([I, .if !"\\*([D"" \\*([D\c .if !"\\*([Q"NP" \&. .if !"\\*([G"" Gov't. ordering no. \\*([G .if !"\\*([O"" \\*([O .in 0 .RT .. .de [4 \" report .if "\\*([I"Bell Laboratories" .rm [C .QP "\\*([F.\0" \\*([A, \\*([o\\*([T,\\*([c \\*([R\c .if !"\\*([G"" \& (\\*([G)\c .if !"\\*([I"" , \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \\0(\\*([D)\c .if !"\\*([Q"NP" \&. .if !"\\*([O"" \\*([O .in 0 .RT .. .de [3 \" article in book .QP "\\*([F.\0" \\*([A, \\*([o\\*([T,\\*([c in \\f2\\*([B\\f1\c .if !"\\*([E"" , ed. \\*([E\c .if "\\*([E"" ,\c .if !"\\*([I"" \ \\*([I,\c .if !"\\*([P"" \ \\*([P .if !"\\*([D"" \ (\\*([D). .in 0 .RT .. .de ]< .SP 2v .ti 0 .nf .ps -1 .ce REFERENCES .ps .nr PS 8 .nr VS 8 .nr PI \w'\s8\0\0.\0' .sp .5v .fi .LP .rn RP IP .. .de Fx \" fix date to discard all but year .ds [D \\$\\n(.$ .. .de ]> .sp .. .de ]- .rm [V [P [A [T [N [C [B [O [R [I [E [Q [D [Q .. .de QP .LP .in \\n(PIu .ta \\n(PIuR .ti 0 \t\\$1\\c .. .de LB .RT .nr ZB .4i .if !"\\$2"" .nr ZB \\$2n .in \\n(ZJu .ti -\\n(ZBu .ta \\n(ZBu \\$1\t\\c .. .de RS .nr ZJ +.3i .. .de RE .nr ZJ -.3i .. .de RP .ce 0 .if \\n(FR=0 .ps \\n(PS .nr FR 1 .in .4i .ta .2i .if \\n(.$>0 .ti 0-.1i-\h'\w'\\$1'u' .if \\n(.$>0 \\$1\h'|.4i'\c .. .ds s \s-2 .de MH Bell Labs, 600 Mountain Avenue, Murray Hill, New Jersey 07974, U. S. A. .. .de HO Bell Labs, Holmdel, New Jersey 07733, U. S. A. .. .de WH Bell Labs, Whippany, New Jersey 07981, U. S. A. .. .ds n \s+2 .\" REFER macros .... citations .de [] .][ \\$1 .. .de ][ .if \\$1>5 .tm Bad arg to [] .[\\$1 .. .if n .ds [. [ .if t .ds [. \s-2\v'-.4m'\f1 .if n .ds .] ] .if t .ds .] \v'.4m'\s+2\fP .if n .ds [o "" .if n .ds [c "" .if t .ds [o ` .if t .ds [c ' .\" the next lines deal with the problem of .[1] or [1]. .\" refer will write "linexxx\*(<.[1]\*(>. .\" and either "<." or ">." should produce the .; .\" similarly for , .if n .ds >. . .if t .ds <. . .if n .ds >, , .if t .ds <, , .de [5 \" tm style .FS .IP "\\*([F.\0" .nr %T 2 \\*([A, \\f2\\*([T\\f1, .ie \\n(TN \\*([M. .el Bell Laboratories internal memorandum (\\*([D). .RT .FE .. .de [0 \" other .FS .nr [: 0 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \{.nr [: 1 \\*([A\c\} .if !"\\*([T"" \{.if \\n([:>0 , .nr [: 1 \\f2\\*([T\\f1\c\} .if !"\\*([O""\{.if \\n([:>0 , .nr [: 1 .if \\n([O>0 .nr [: 0 \\*([O\c .if \\n([O>0 \& \c\} .if !"\\*([D"" \{.if \\n([:>0 , .nr [: 1 \\*([D\c\} .if \\n([:>0 \&. .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [1 \" journal article .nr %T 1 \" title font .FS .if !"\\*([R"" .rm [C .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\*([o\\*([T\\*([c, \\f2\\*([J\\f1\c .if !"\\*([C"" , \\*([C\c .if !"\\*([V"" .if n ,\& Vol.\&\c .if !"\\*([V"" ,\& \\f3\\*([V\\f1\c .if !"\\*([P"" \{\ .ie \\n([P>0 , \&\c .el , \ \&\c \\*([P\c\} .if !"\\*([I"" .if "\\*([R"" , \\*([I\c .if !"\\*([O"" .if \\n([O=0 , \\*([O\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" .if \\n([O>0 \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [2 \" book .FS .nr %T 2 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\f2\\*([T,\\f1 \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([G"" Gov't. ordering no. \\*([G. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [4 \" report .FS .if !"\\*([F"" .IP "\\*([F.\0" .nr %T 1 \\*([A, \\*([o\\*([T\\*([c, \\*([R\c .if !"\\*([G"" \& (\\*([G)\c .if !"\\*([I"" , \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [3 \" article in book .FS .nr %T 1 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\*([o\\*([T,\\*([c .if !"\\*([P"" \\*([P in \\f2\\*([B\\f1\c .if !"\\*([E"" , ed. \\*([E\c .if !"\\*([I"" , \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de ]< .[< .. .de [< .LP .rm FS FE .. .de [> .]> .. .de ]> .sp .. .de ]- .[- .. .de [- .rm [V [P [A [T .rm [N [C [B [O .rm [R [I [E [D .rm [G [% .. .de ]] .\"this is never executed and just uses up an end-of-file bug. .. 9base-6/troff/tmac/cover.11270000644000175000017500000000007011402154555015241 0ustar anselmanselmArun Netravali Department Heads 1121, 1127 D. Dinella 9base-6/troff/tmac/tmac.org0000644000175000017500000000007111402154555015245 0ustar anselmanselm'''\" TMAC.ORG @(#)tmacs.src 1.7 .so /usr/lib/macros/org 9base-6/troff/tmac/tmac.antimes0000644000175000017500000001723511402154555016130 0ustar anselmanselm'''\" PWB Manual Entry Macros - 1.36 of 11/11/80 '''\" Nroff/Troff Version @(#)1.36 '''\" Option -rs1 short (9") pages '''\" Option -rp# set no. of first page, put no. of pgs. on stderr '''\" Option -rd1 give modified date instead of printed date ... temporary fixes for neat manual printing... .deth .tmwrong version of man entry macros - use -man6 .ab .. .ifn .ds Tm \uTM\d .ift .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m' .de}E .}f .in\\n()Ru+\\n(INu .ll\\n(LLu .lt\\n(LLu .pl\\n()Lu .. .deDT .ift .ta 3.6m 7.2m 10.8m 14.4m 18m 21.6m 25.2m 28.8m 32.4m 36m 39.6m 43.2m 46.8m .ifn .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n .. .de HY .hy14 .. .de}f .ift .vs \\n()Vp .ps\\n()S .ft1 .. .de}H .ev1 .}C .}E .ie\\n()s 'sp |2v .el'sp |3v .".ps\\n()S-1 .tl \\*(]H\\*(]L\\*(]H .ft1 .ps\\n()S .ie\\n()s 'sp 1.5v .el'sp 3v .ev .ns .if \\n(CL .2C .. .de}F .ev1 .}E .if\\n()s 'sp |\\n(.pu-1v-1p .if\\n()t 'sp |\\n(.pu-3v .ifn 'sp |\\n(.pu-4v .ifn .tl Page %\\*(]D\\*(]W .ift .tl % .ev 'bp .. .ifn .ig .de}C .if "\\*(.T"aps"\{\ . po0i . lt7.5i . if\\n()s .tl \l0.25i\l0.25i\h1i\l0.25i . if\\n()t .tl \l0.25i\l0.25i . lt . po\} .. .de}M .}N .wh-.5p }C .ll\\n(LLu .}P .. .de}K .}N .pl1 .ll\\n(LLu .. .de}P .nr )P \\n%+1-\\np .if \\nq .tm \\n(.F \\n()P \\np .bp .if \\nq .nr p \\n% .. .deTH .PD .nrIN \\n()Mu .ift .ds ]H \\$1\^(\^\\$2\^) .ifn .ds ]H \\$1(\\$2) .if\\n()s .ds ]D .if\\n()t .ds ]D Plan 9 .ifn .ds ]D Plan 9 .ds]L .if!\\$3 .ds ]L (\^\\$3\^) .if!\\$4 .ds ]D \\$4 .wh0 }H .wh-\\n(:mu }F .em}M .if\\n(nl .}P .nr)I \\n()Mu .nr)R 0 .}E .DT .ifn \{.na .nh\} .ift \{.bd S 3 3 .HY \} .. .deSH .PD .}X 0 "\\$1" smaller .nr)E 2 \&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 .. .deSS .PD .}X 3n "" "" .nr)E 2 \&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 .. .de}X .}E .ti\\$1 .sp\\n(PDu .ne1.1v .nr)R 0 .fi '''ss12 '''if\\$2SYNOPSIS .ss 18 .it1 }N .if!\\$3 .SM .ft 3 .. .de}2 .nr)E 0 .}E .nr)I \\n()Mu .ns .ft1 .. .deSM .nh .ps\\n()S-1 .if!\\$1 \&\\$1 .if!\\$2 \&\\$2 .if!\\$3 \&\\$3 .if!\\$4 \&\\$4 .if!\\$5 \&\\$5 .if!\\$6 \&\\$6 .if!\\$1 .ps \\n()S .if\\$1 .it 1 }N .HY .. .deI .nh .ft2 .it1 }N .if!\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .HY .. .deB .nh .it1 }N .ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .el .ft5 .HY .. .deL .nh .it1 }N .ift \{.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .el .ft5 \} .ifn \{.ft5 .if!\\$1 \{.ie\\$2 `\\$1' .el .ie\\$3 `\\$1 \\$2' .el .ie\\$4 `\\$1 \\$2 \\$3' .el .ie\\$5 `\\$1 \\$2 \\$3 \\$4' .el .ie\\$6 `\\$1 \\$2 \\$3 \\$4 \\$5' .el `\\$1 \\$2 \\$3 \\$4 \\$5 \\$6'\}\} .HY .. .deRI .nh .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .deIR .nh .}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .deIB .nh .ift .}S 2 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .ifn .}S 2 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .deRB .nh .ift .}S 1 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .deBR .nh .ift .}S 5 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .ifn .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .deBI .nh .ift .}S 5 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .ifn .}S 1 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de LR .nh .ift \%\&\f5\\$1\f1\\$2 .ifn \%`\\$1'\\$2 .HY .. .de RL .nh .ift \%\&\f1\\$1\\f5\\$2\\f1\\$3 .ifn \%\\$1`\\$2'\\$3 .HY .. .de}S .ds]F .if\\$12 .if !\\$5 .ds ]F \^ .if\\$22 .if !\\$5 .ds ]F \^ .ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" .el\\$3 .}f .. .deEX .ift .ft5 .nf .. .deEE .ft1 .fi .. .dePP .sp\\n(PDu .ne1.1v .}E .nr)I \\n()Mu .ns .. .deP .PP .. .deLP .PP .. .dePD .ift .nr PD .4v .ifn .nr PD 1v .if!\\$1 .nr PD \\$1v .. .deHP .sp\\n(PDu .ne1.1v .if!\\$1 .nr )I \\$1n .ll\\n(LLu .in\\n()Ru+\\n(INu+\\n()Iu .ti\\n()Ru+\\n(INu .}f .. .deIP .ie!\\$1 \{.TP "\\$2" \&\\$1\} .el\{.sp\\n(PDu .ne1.1v .if!\\$2 .nr )I \\$2n .}f .ll\\n(LLu .in\\n()Ru+\\n(INu+\\n()Iu .lg\} .. .deTP .if!\\$1 \{.nr )I \\$1n .if\\$10 .nr )I \\n()M\} .sp\\n(PDu .ne1.1v .in\\n()Ru .lg0 .ns .it1 }N .nr)E 1 .di]B .. .deTF .IP "" "\w'\f5\\$1\ \ \fP'u" .PD0 .. .de}1 .ds]X \&\\*(]B\\ .rm]B .nr)E 0 .if!\\$1 .nr )I \\$1n .}f .ll\\n(LLu .in\\n()Ru+\\n(INu+\\n()Iu .ti\\n(INu .ie!\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X .br\} .el\\*(]X\h|\\n()Iu+\\n()Ru\c .}f .lg .. .de}N .if\\n()E .br .if\\n()E1 .di .if\\n()E0 .}f .if\\n()E1 .}1 .if\\n()E2 .}2 .. .deRS .nr]\\n+()p \\n()I .nr)\\n()p \\n()R .ie!\\$1 .nr )R +\\$1n .el.nr )R +\\n()I .nr)I \\n()Mu .}E .. .deRE .if!\\$1 \{.ie \\$10 .nr )p 1 1 .el.nr )p \\$1 1 \} .ds]i \\*(]I\\n()p .ds]r \\*(]R\\n()p .nr)I \\*(]i .nr)R \\*(]r .if\\n()p .nr )p -1 .}E .. '''\" .2C begin 2-column display, by diversion '''\" CC=amount of text that will fit on page '''\" CL=1 multicolumn in effect, else 0 '''\" CI saved indent '''\" CB contains diverted text .de 2C .ne 2 .nf .nr CC \\n(.t/1v*2v .nr CI \\n(IN .nr IN 0 .di CB .nr CL 1 .}E .dt \\n(CCu C1 .. '''\" .1C return to 1-column .de 1C .nr CL 0 .C1 .fi .. '''\" end of diversion, at end of page or return to 1-column '''\" CC=pos of nominal column end .de C1 .dt \!.C3 .di .if \\n(dn \{.nr CC \\n(dnu/2u+\\n(nlu .wh \\n(CCu C2 .mk .nf .nr IN \\n(CIu .}E .CB \} .. '''\" end of first column retrieved from diversion '''\" CC=pos of actual column end .de C2 .wh \\n(CCu .mk CC .po +(\\n(LLu/2u)u .rt .if \\n(dn>1v .ns .. '''\" end of second column .de C3 .br .po -(\\n(LLu/2u)u .if \\n(CC>\\n(nl .sp |\\n(CCu .ne 2 .. .dePM .if\\$1 .nr !K 0 .if\w\\$1 \{\ .ie\\$1P .nr !K 1 .el.ie \\$1BP .nr !K 3 .el.ie \\$1BR .nr !K 4 .el.nr !K 2 \} .if\\n(!K .wh -(\\n(:mu+5v) )G .. .de)G .if\\n(!K 'sp 2v .ie\\n(!K=1 \{\ .iet .bd1 3 .el.bd1 0 .tlPRIVATE .bd1 .tlThis information should not be disclosed to unauthorized persons. .tlIt is meant solely for use by authorized Bell System employees. \} .el.ie \\n(!K=3 \{\ .iet .bd1 3 .el.bd1 0 .tlBELL LABORATORIES PROPRIETARY .bd1 .tlNot for use or disclosure outside Bell Laboratories except by .tlwritten approval of the director of the distributing organization. \} .el.ie \\n(!K=4 \{\ .iet .bd1 3 .el.bd1 0 .tlBELL LABORATORIES RESTRICTED .bd1 .tlThe information herein is meant solely for use by authorized .tlBell Laboratories employees and is not to be disclosed to others. \} .el.if \\n(!K=2 \{\ .iet .bd1 3 .el.bd1 0 .tlNOTICE .bd1 .tlNot for use or disclosure outside the .tlBell System except under written agreement. \} .. .nr)s 0 .ift .if \ns .nr )s 1 .nr)t 0 .ift .if !\ns .nr )t 1 .if\n()s \{.nr )L 9i .nrLL 4.75i .nr)O .75i .nr)S 9 .nr)V 10 \} .if\n()t \{.nr )L 11i .nrLL 6.5i .nr)O 1i .nr)S 10 .nr)V 12 \} .ift \{.ds R \(rg .dsS \s\n()S ..\} .ifn \{.nr )L 11i .nrLL 6.5i .nr)O .463i .if '\*(.T'think' \{.nrLL 80n .nr)O 0\} .if '\*(.T'thinksmall' \{.nrLL 142n .vs 9p .nr)O 0\} .dsR (Reg.) .dsS ..\} .if\nT .nr LL 80n .if\nV>1 \{ .nrLL 82n .nr)L 84v .rmul \} .nr)p 0 1 .ds]I \\\\n(] .ds]R \\\\n() .if\nd0 .nr m \n(mo-1 .if\nm0 .ds ]m January .if\nm1 .ds ]m February .if\nm2 .ds ]m March .if\nm3 .ds ]m April .if\nm4 .ds ]m May .if\nm5 .ds ]m June .if\nm6 .ds ]m July .if\nm7 .ds ]m August .if\nm8 .ds ]m September .if\nm9 .ds ]m October .if\nm10 .ds ]m November .if\nm11 .ds ]m December .ifn \{.nr m \nm+1 .nr yD (\n(yr%100 .af yD 01 .ie\nd .ds ]W (last mod. \nm/\nd/\ny) .el.ds ]W (printed \n(mo/\n(dy/\n(yD) ..\} .if\n()s .ds ]W .if\n()t \{.ie \nd .ds ]W \*(]m \nd, 20\ny .el.ds ]W \*(]m \n(dy, 20\n(yr ..\} .pl\n()Lu .ll\n(LLu .lt\n(LLu .po\n()Ou .fp 5 L CW .ift .tr \``\'' .}f .if\n()s .nr :m 3.5v .if\n()t .nr :m 6v .ifn .nr :m 7v .ift .nr )M 3.6m .ifn .nr )M 5n .em}K .nr q \np .if!\np .nr p 1 .pn \np 9base-6/troff/tmac/tmac.rscover0000644000175000017500000000402611402154555016145 0ustar anselmanselm.de CZ .br .if !"\\$1"" \\$1 .br .if !"\\$2"" \\$2 .br .if !"\\$3"" \\$3 .br .if !"\\$4"" \\$4 .br .if !"\\$5"" \\$5 .br .if !"\\$6"" \\$6 .br .if !"\\$7"" \\$7 .br .if !"\\$8"" \\$8 .br .if !"\\$9"" \\$9 .. .ds AZ \f(HBA\h'-.2m'T\h'-.15m'\s-3&\s0\h'-.15m'T\fP . \"S1 - tm style .de S1 .br .sp |.5i .ta 4.75i 5.25i .ll 80 .ps 36 .br .ie !'\*(Lb'' \t\(Lb\h'-.53i'\fH\s10Bell Laboratories .el \t\(L1\s16\v'-.8'\\*(AZ\v'.8'\h'-\w'\\*(AZ'u'\fH\s10Bell Laboratories .br .sp 2 .ps 12 .br .nr SJ \\n(.j .na .br .ps 8 .vs 12p .sp 2v .mk .ll .ll 4.0i Subject: .ft 3 .br .rt .in +\w'Subject: 'u .ps '''\".nf .fi .hy 0 .WT .hy 14 .ft 1 .br .fi .in 0 .vs 10 .if \\n(MC>0 \\s8Work Program- \\*(X1\\s10 .if \\n(MG>0 --\\s8 File- \\*(F1\\s10 .br .if \\n(MC>1 \\s8\\h'\\w'Work Program- 'u'\\*(X2\\s10 .if \\n(MG>1 \\h'\\w'--\\s8 File- 'u'\\s8\\*(F2\\s10 .br .if \\n(MC>2 \\s8\\h'\\w'Work Program- 'u'\\*(X3\\s10 .if \\n(MG>2 \\h'\\w'--\\s8 File- 'u'\\s8\\*(F3\\s10 .br .if \\n(MC>3 \\s8\\h'\\w'Work Program- 'u'\\*(X4\\s10 .if \\n(MG>3 \\h'\\w'--\\s8 File- 'u'\\s8\\*(F4\\s10 .br .if \\n(MC>4 \\s8\\h'\\w'Work Program- 'u'\\*(X5\\s10 .if \\n(MG>4 \\h'\\w'--\\s8 File- 'u'\\s8\\*(F5\\s10 .br .if \\n(TO>0 \{\ .ps 8 .nf .sp To: .in +\w'Subject: 'u .sp -1v .ps .nf .1T .in \} .vs .rt .ll 6.5i .in 5.10i .ps 8 .ti -6n .ta 6n date:\t\\s\\n(PS\\f3\\*(DY .sp .ft 1 .ps 8 .mk .ti -6n from: .ps .br .rt .nf .ft 3 .A1 .if \\n(TO>0 \{\ \\*(D1 \\*(1L .br \} .if \\n(NA>1 .A2 .if \\n(NA>2 .A3 .if \\n(NA>3 .A4 .if \\n(NA>4 .A5 .if \\n(NA>5 .A6 .if \\n(NA>6 .A7 .if \\n(NA>7 .A8 .if \\n(NA>8 .A9 .ft 1 .sp .mk .ps 8 .ti -6n .ft 1 .if \\n(IM=0 .if \\n(MM .if "\\*(MQ"" \{\ .if \\n(MN=0 .ds MQ TM: .if \\n(MN=1 .ds MQ MF: .if \\n(MN=2 .ds MQ MR: .if \\n(MN=3 .ds MQ EN:\} \\*(MQ .br .ti \\n(.iu .rt .ps .ft 3 .hy 0 .ll 20i .ll 7.75i-\\n(.ou .fi .na .if \\n(MM .CZ \\*(MN .\" ditched .CZ .hy 14 .nf .ft 1 .ll \\n(LLu .in .sp |\\n(.hu .if \\n(IM=0 .sp .ad \\n(SJ .ce .ft 2 .if \\n(IM=0 \\*(QF .ft 1 .ce 0 .if \\n(IM=0 .sp .fi .. .de TL .br .di WT .. .de AB .br .di .rm WT TL AB AU .. .de AU .. .nr YE 1 9base-6/troff/tmac/tmac.anhtml0000644000175000017500000000024711402154555015746 0ustar anselmanselm.so /home/anselm/plan9port/tmac/tmac.an .de }H .. .de }F .. .hy 0 .nr HT 1 .de HY .hy 0 .. .nr LL 20i .dePP \Xhtml manPP .}p .. .am TH \Xhtml manhead \\$1 \\$2 .. 9base-6/troff/tmac/tmac.nihongo0000644000175000017500000000003011402154555016112 0ustar anselmanselm.pi $PLAN9/bin/mnihongo 9base-6/troff/tmac/tmac.skeep0000644000175000017500000000254411402154555015574 0ustar anselmanselm. \"KS keep - for keep release features. As in IFM .de KS .nr KN \\n(.u .if \\n(IK=0 .if \\n(IF=0 .KQ .nr IK +1 .. . \"KQ - real keep processor .de KQ .br .nr KI \\n(.i .ev 2 .br .in \\n(KIu .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .ll \\n(LLu .lt \\n(LTu .if \\n(NX>1 .ll \\n(CWu .if \\n(NX>1 .lt \\n(CWu .di KK .nr TB 0 .nr KV 0 .. . \"KF - floating keep .de KF .nr KN \\n(.u .if !\\n(IK .FQ .nr IK +1 .. . \"FQ real floating keep processor .de FQ .nr KI \\n(.i .ev 2 .br .in \\n(KIu .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .ll \\n(LLu .lt \\n(LTu .if \\n(NX>1 .ll \\n(CWu .if \\n(NX>1 .lt \\n(CWu .di KK .nr TB 1 .nr KV 0 .. . \"KP - keep full page .de KP .nr KV 1 .. . \"KE release - everything between keep and release is together .de KE .if \\n(IK .if !\\n(IK-1 .if \\n(IF=0 .RQ .if \\n(IK .nr IK -1 .. . \"RQ real release .de RQ .br .nr KI \\n(.i .di .nr NF 0 .if \\n(dn-\\n(.t .nr NF 1 .if \\n(TC .nr NF 1 .if \\n(KV .nr NF 1 \" if KV on full page needed, doesn't fit .if \\n(NF .if !\\n(TB .sp 11i .if !\\n(NF .if \\n(TB .nr TB 0 .nf .rs .nr TC 5 .in 0 .ls 1 .if \\n(TB=0 .ev .if \\n(TB=0 .KX .if \\n(TB=0 .br .if \\n(TB=0 .ev 2 .if \\n(TB=0 .KK .ls .ce 0 .if \\n(TB=0 .rm KK .if \\n(TB=0 .KY .if \\n(TB .da KJ .if \\n(TB \!.KD \\n(dn \\n(KV .if \\n(TB .KK .if \\n(TB .di .nr TC \\n(TB .if \\n(KN .fi .in .ev .in \\n(KIu .. 9base-6/troff/tmac/sendcover0000644000175000017500000000006211402154555015523 0ustar anselmanselm#!/bin/rc T=/tmp/cs$pid cstrans $T $1 rc $T rm $T 9base-6/troff/tmac/tmac.pictures0000644000175000017500000001034011402154555016314 0ustar anselmanselm.de PI \" Picture Include . \" $1=file(page) $2=height,width,yoff,xoff $3=flags . \" Height, width, xoff, and yoff are for the frame, flags is for the . \" picture. Default dimensions are inches. \\X'PI:\\n(.o:\\n(.i:\\n(.l:\\n(.t:\\$1:\\$2:\\$3:'\\c .. .nr FT 0 .de BP \" Begin a Picture . \" . \" $1=file(page) $2=height $3=width $4=position $5=offset $6=flags $7=label . \" . \" Height, width, position, and offset are for the frame, flags is for . \" the picture. The postion flag should be l, c, r, or "". Omitting the . \" position argument is also allowed for compatibility with the original . \" version of the macro. In that case offset is taken relative to your . \" left margin. .if \\n(FT>1 .EP . \" Need these when we switch environments. .nr Ov \\n(.v .nr Oi \\n(.i .nr Ol \\n(.l . \" Remember the arguments - sometimes as both a string and number register. .nr $2 \\$2i .nr $3 \\$3i .nr $4 \\$4i .ds $4 \\$4 .nr $5 \\$5i .ds $5 \\$6 .ds $6 \\$7 . \" Accept a few unadvertised position flags. .if '\\*($4'L' .ds $4 l .if '\\*($4'C' .ds $4 c .if '\\*($4'R' .ds $4 r . \" A null with more than three arguments means l. .if \\n(.$>3 .if '\\*($4'' .ds $4 l . \" Default frame dimensions if missing, zero, or null. .if !\\n($2>0 .nr $2 3.0i .if !\\n($3>0 .nr $3 \\n(.lu-\\n(.iu-\\n($4u .if !\\n($3>0 .nr $3 \\n($2u . \" Figure out the offset that will be used the rest of the way. .if '\\*($4'l' .nr $4 \\n($5u .if '\\*($4'c' .nr $4 (\\n(.lu-\\n(.iu-\\n($3u)/2u+\\n($5u .if '\\*($4'r' .nr $4 \\n(.lu-\\n(.iu-\\n($3u+\\n($5u . \" If we haven't recognized the position flag assume it wasn't given and . \" treat argument four as an offset from the left. .if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $5 \\$5 .if !'\\*($4'l' .if !'\\*($4'c' .if !'\\*($4'r' .ds $6 \\$6 . \" Set increments for line length and indent. .nr Ii \\n($3u+\\n($4u+.1i .nr Il \\n(.lu-\\n(.iu-\\n($4u+.1i . \" Set the frame type to one of: . \" 0 - frame is as wide as a line of text - skip over it. . \" 1 - fits in left or right margins . \" 2 - fill with text on the right . \" 3 - on the left . \" 4 - or on both sides of the frame . \" 5 - only set in EP if FT was 4 and now filling on the right. . \" Assume the frame is as wide as a line of text, then check dimensions . \" to see what's really true. The order of these tests is important! .nr FT 0 .if \\n($4u>1.0i .nr FT 3 .if \\n($4u+\\n(.iu>=\\n(.lu .nr FT 1 .if \\n($3u+\\n($4u+\\n(.iu+1.0i<\\n(.lu .nr FT 2 .if \\n($3u+\\n($4u<=0 .nr FT 1 .if \\n(FT=2 .if \\n($4u>1.0i .nr FT 4 . \" Ask for some vertical space - labeled pictures need a little extra, . \" margin pictures a little less. .if \\n(FT=1 .if '\\*($6'' .ne \\n($2u .if \\n(FT=1 .if !'\\*($6'' .ne \\n($2u+2v .if !\\n(FT=1 .if '\\*($6'' .ne \\n($2u+3v .if !\\n(FT=1 .if !'\\*($6'' .ne \\n($2u+5v . \" Save our place, draw the picture, label it, and return. Need precise . \" control of when \X'...' is put out - thus the new environment. .mk Oh .ev 1 .in \\n(Oiu .ll \\n(Olu .vs \\n(Ovu .if \\n(FT=1 .sp -1v .if \\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u t\\*($5 .if !\\n(FT=1 .PI \\$1 \\n($2u,\\n($3u,\\n(.vu,\\n($4u \\*($5 .in .ll .vs .ev .lt \\n($3u .tl \(ts\(ts\\h'\\n($4u+\\n(.iu'\\v'\\n($2u+1.5v'\\*($6\\v'-\\n($2u-1.5v'\\h'-\\n($4u-\\n(.iu'\(ts\(ts .lt 'sp |\\n(Ohu . \" Figure out what to do with the text that follows. .if !'\\*($6'' .nr $2 +2v .if \\n(FT=0 .sp \\n($2u+2v .if \\n(FT=1 .nr FT 0 .if \\n(FT=2 'in +\\n(Iiu .if \\n(FT>2 .ll -\\n(Ilu .if \\n(FT>1 .di BB .if \\n(FT>1 .dt \\n($2u+2v+1u EP . \" Clean things up. .rr $2 .rr $3 .rr $4 .rm $4 .rr $5 .rm $5 .rm $6 .rr Oh .rr Oi .rr Ol .rr Ov .if \\n(FT=0 .EP .. .de EP \" End the Picture - Normally called from a trap, although it can be used . \" on its own to mark the end of a picture. .nr Ot 0 .if \\n(.tu<\\n(.pu .nr Ot \\n(.tu .if \\n(Ot>0 .if \\n(FT=4 .nr FT 3 .if \\n(FT<2 .nr Ot 0 .if \\n(Ot>0 .br .if \\n(FT=5 .nr Ot 0 .if \\n(FT>1 \{\ . ev 1 . eo . br . di . nf . in 0 . BB . in . fi . ec . ev . rm BB\} .if \\n(FT=5 \{\ . nr FT 2 ' sp |\\n(Nhu+1v\} .if \\n(FT=4 \{\ . mk Nh . nr Nh -1v . nr FT 5 ' sp -\\n(dnu+1v ' in +\\n(Iiu . ll +\\n(Ilu . di BB . dt \\n(dnu-2v+1u EP\} .if \\n(FT=2 'in -\\n(Iiu .if \\n(FT=3 .ll +\\n(Ilu .if \\n(FT<4 .nr FT 0 .if \\n(Ot>0 .sp \\n(Otu .rr Ot .if \\n(FT=0 \{\ . rr Nh . rr Ii . rr Il\} .. 9base-6/troff/tmac/name.sed0000644000175000017500000000007611402154555015232 0ustar anselmanselms/\([A-Z]\)\./\1/g s/\([A-Z]\)[a-z]*/\1/g s/ //g s/^/.ds T1 / 9base-6/troff/tmac/strings.mm0000644000175000017500000000414211402154555015637 0ustar anselmanselm'\" Copyright (c) 1997 Lucent '\" All Rights Reserved '\" '\"#ident "@(#)macros:strings.mm 3.1" '\" UNIX Memorandum Macros, DWB 3.1, April 1990 '\" Company-specifics: Lucent Bell Laboratories '''\" '''\"tab begins comments. '''\" No comments should appear on the same line as the string definition. '''\" '''\" The following string is used by the macro MT. '''\" ]S defined as logo character .ds ]S \s36\(LH\s0 '''\" }Z defined as Company Name .ds }Z Lucent Bell Laboratories '''\" '''\" Strings for proprietary markings at bottom of page. '''\" Free Strings: ]Q ]R ]H ]L ]V ]W ]X ]k ]l '''\" '''\" Register ;V = user-specified year for copyright date .nr ;V \n(yr '''\" LUCENT PROPRIETARY MARKINGS '''\" The following strings are used by the macro PM: '''\" '''\" Marking Type: PROPRIETARY '''\" Invocation: .PM 1 or .PM P '''\" Strings: ]M ]O .ds ]M \f2LUCENT \- PROPRIETARY\fP .ds ]O \f1Use pursuant to Company Instructions.\fP '''\" '''\" Marking Type: RESTRICTED '''\" Invocation: .PM 2 or .PM RS '''\" Strings: ]A ]F ]G .ds ]A \f2LUCENT \- PROPRIETARY (RESTRICTED)\fP .ds ]F \f1Solely for authorized persons having a need to know .ds ]G pursuant to Company Instructions.\fP '''\" '''\" Marking Type: REGISTERED '''\" Invocation: .PM 3 or .PM RG '''\" Strings: ]I ]J ]K .ds ]I \f2LUCENT \- PROPRIETARY (REGISTERED)\fP .ds ]J \f1Solely for authorized persons having a need to know .ds ]K and subject to cover sheet instructions.\fP '''\" '''\" Marking Type: SEE COVER PAGE '''\" Invocation: .PM 4 or .PM CP '''\" Strings: ]U .ds ]U \f1SEE PROPRIETARY NOTICE ON COVER PAGE\fP '''\" '''\" Marking Type: COPYRIGHT '''\" Invocation: .PM 5 or .PM CR '''\" Strings: ]i ]j .ds ]i \f1Copyright \(co 20\\n(;V Lucent\fP .ds ]j \f1All Rights Reserved.\fP '''\" '''\" Marking Type: UNPUBLISHED WORK '''\" Invocation: .PM 6 or .PM UW '''\" Strings: ]M ]m ]o ]p ]i ]q ]j .ds ]m \f1THIS DOCUMENT CONTAINS PROPRIETARY INFORMATION OF .ds ]o LUCENT AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN .ds ]p ACCORDANCE WITH APPLICABLE AGREEMENTS.\fP .ds ]q \f1Unpublished & Not for Publication\fP 9base-6/troff/tmac/tmac.v0000644000175000017500000001733311402154555014734 0ustar anselmanselm'\" Copyright (c) 1984 AT&T '\" All Rights Reserved '\"#ident "@(#)macros:vmca.src 1.17" .ifn .ds Tm \uTM\d .ift .ds Tm \v'-0.5m'\s-8TM\s+8\v'0.5m' .deVS .)j .nr)K 0i .nr)L 0i .nr)U 8i .nr)X 18 .nr)H 0 .nr)W 0 .nr)O 0i .nr)M 0 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deVh .)j .nr)K 0.9i .nr)L 1i .nr)U 8i .nr)X 14 .nr)H 1 .nr)W 0 .nr)O 0.2i .nr)M 0 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deSh .)j .nr)K 1.1i .nr)L 1i .nr)U 8i .nr)X 14 .nr)H 1 .nr)W 0 .nr)O 0.2i .nr)M 1 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deVw .)j .nr)K 0i .nr)L 0i .nr)U 6i .nr)X 14 .nr)H 0 .nr)W 1 .nr)O 0.2i .nr)M 0 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deSw .)j .nr)K 0i .nr)L 0i .nr)U 6i .nr)X 14 .nr)H 0 .nr)W 1 .nr)O 0.2i .nr)M 1 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deVH .)j .nr)K 0i .nr)L 0i .nr)U 10i .nr)X 18 .nr)H 1 .nr)W 0 .nr)O 0.5i .nr)M 0 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deSH .)j .nr)K 0.5i .nr)L 0i .nr)U 10i .nr)X 18 .nr)H 1 .nr)W 0 .nr)O 0.5i .nr)M 1 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deVW .)j .nr)K 0i .nr)L 0i .nr)U 6.44i .nr)X 14 .nr)H 0 .nr)W 1 .nr)O 0.4i .nr)M 0 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .deSW .)j .nr)K 0i .nr)L 0i .nr)U 6.44i .nr)X 14 .nr)H 0 .nr)W 1 .nr)O 0.4i .nr)M 1 .if!\\n(.$ .)V .if\\n(.$ .if !\\n(.$-1 .)V "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .)V "\\$1" "\\$2" .if\\n(.$-2 .)V "\\$1" "\\$2" "\\$3" .. .de)V .fc .wh0i .if\\nX .wh -0.5i .nr)o 0u .if\\n()i .nr )o 10p .nr)U +\\n()ou .pl\\n()Uu+1.5i .if\\nX .if \\n(.pu-\\n()Gu .pl \\n()Gu .na .fi .nh .lg0 .ta0.5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i .ce0 .in0i .ll7.54i .po0i .lt7.68i .if\\n()i .)t "'\(da cut \(da''\(da cut \(da'" 1 .nr)i 0 .)t "'\l'0.38i'''\l'0.38i''" 1 .sp0.5v .po0.23i .lt7.06i .if\\n(.$-1 .ds )N "\\$2 .if\\n(.$-2 .ds )Y "\\$3 .tl\\*()Y .tl\\*()N .if\\n(.$ .tl \\*()F \\$1 .if!\\n(.$ .tl \\*()F % .po .sp|0.68i+\\n()ou .po0.26i+\\n()Lu+\\n()Ou .lt7.03i-\\n()Lu-\\n()Lu-\\n()Ou-\\n()Ou .if\\n()H .)t "'|''|'" .po .sp|1i+\\n()Ou+\\n()ou .if!\\n(.A .)e .po0.1i .lt7.4i .if\\n()W .)t "'_''_'" .po .sp|1i+\\n()ou .if!\\n(.A .)e .po0.23i+\\n()Lu .lt7.06i-\\n()Lu-\\n()Lu .tl++ .sp-3p .if\\n()M .if \\n()W .sp \\n()Ou .po .nr)J \\n()Uu .if\\n()M .if \\n()W .nr )J \\n()Uu-\\n()Ou .nr)E \\n()Ju .wh\\n()Eu )Z .S \\n()X 6i-\\n()Ku-\\n()Ku .I "" A no-space .sp.5v .nr)n \\n(nlu .. .de)Z .wh\\n()Eu .nr)w 0 .ev1 .)g 'sp|\\n()Uu .if!\\n(.A .)e .po0.23i+\\n()Lu .lt7.06i-\\n()Lu-\\n()Lu .tl++ .po 'sp|\\n()Uu-\\n()Ou .if!\\n(.A .)e .po0.1i .lt7.4i .if\\n()W .)t "'_''_'" .po 'sp|\\n()Uu+0.32i .po0.26i+\\n()Lu+\\n()Ou .lt7.03i-\\n()Lu-\\n()Lu-\\n()Ou-\\n()Ou .if\\n()H .)t "'|''|'" .po .if!\\n()H 'sp 1v 'sp1v .ev .if\\nX .pl \\n()Gu .if\\nX .wh -0.5i )m .wh0i )P .. .de)m .bp .. .de)z .pl\\n(.pu+2i .br .if\\n()i \{.ps 10 .lt6i .tl*** No input or no ``foil start'' macro in input. \} .if!\\n()i \{.nr )x \\n(.vu+\\n()Eu-\\n(nlu/\\n(.vu .nr)v \\n()w .sp|\\n(.pu-2.8i .if\\nX .wh -0.5i .if\\nX .pl \\n(.pu+2i \& .br .)g .po0i .ll6i .ce0 .in0i .if\\n(.A .sp -1.1v .if\\n(.A .sp 0.1v .if\\n(.A .if \\n()v ==> Approximately \\n()x blank line(s) \ left to bottom of previous foil. .if\\n(.A .if !\\n()v ==> *** Previous foil full; \ check for overflow. .sp|\\n(.pu-2i .lt7.68i .)t "'\l'0.38i'''\l'0.38i''" 1 .)t "'\(ua cut \(ua''\(ua cut \(ua'" 1 \} .. .de)t .if!\\n(.A .if \\n(.$-1 .)e .if!\\n(.A .tl \\$1 .. .de)e .po0i .lt1i .tl'\ ''' 'sp-1v .po .lt .. .de)P .pl2i .if\\nX .pl \\n()Gu .. .de)j .br .if\\n()i .if \\n(nl \{.ps 10 .lt6i .tl*** Text before ``foil start'' macro in input. \} .if!\\n()i \{.nr )x \\n(.vu+\\n()Eu-\\n(nlu/\\n(.vu .nr)v \\n()w .sp|\\n(.pu-0.8i \& .br\} .)g .if!\\n()i \{.po 0i .ll6i .ce0 .in0i .if\\n(.A .sp -1.1v .if\\n(.A .sp 0.1v .if\\n(.A .if \\n()v ==> Approximately \\n()x blank line(s) \ left to bottom of previous foil. .if\\n(.A .if !\\n()v ==> *** Previous foil full; \ check for overflow. .br .ll .po\} .if\\n(nl .bp .nr)w 1 .. .de)g .ft\\*()f .cs\\*()f .ps8 .vs10p .ss16 .. .deT .br .if\\n(nlu-\\n()nu .sp .5v .nr]a \\n(.s .ps .nr]b \\n(.s .ps .nr)u \\n(.iu .in0i .ps+4 .ce \&\\$1 .in\\n()uu .ps\\n(]b .ps\\n(]a .sp.5v .nr)n \\n(nlu .. .deS .if!\w\\$1 .ps .if\w\\$1 .if !\\$1+1 .ps \\$1 .if\w\\$1 .if \\$1 .nr )y \\n(.s .if\w\\$1 .if \\$1 .nr )y \\$1 .if\w\\$1 .if \\$1-99 .nr )y \\n()X .if\w\\$1 .if \\$1 .ps \\n()y .vs\\n(.sp*5u/4u .ss16 .nr)a .8i+\\n()Ku .nr]c \\n(.s .ps .nr]d \\n(.s .ps .nr)A \\n(.s*\\n()Q/\\n(]X .ps\\n()A .nr)b \w\\*()B\ u .ps .nr)A \\n(.s*\\n()R/\\n(]X .ps\\n()A .nr)c \\n()bu+\w\\*()C\ u .ps .nr)A \\n(.s*\\n()S/\\n(]X .ps\\n()A .nr)d \\n()cu+\w\\*()D\ u .ps\\n(]d .ps\\n(]c .if\\n(.$-1 .nr )u \\$2 .if\\n(.$-1 .if !\\n()uu-7u .nr )p \\$2i .if\\n(.$-1 .if \\n()uu-7u .nr )p \\$2 .nr)q \\n()pu-0i .nr)r \\n()qu-0i .nr)s \\n()ru-0i .nr)T \\n(.sp*5u/4u .nr)E \\n()Ju-\\n()Tu .ch)Z \\n()Eu .. .deI .if!\w\\$1u .nr )k 0i .if\w\\$1u .if !\\$1 .nr )u 0i-\\$1 .if\w\\$1u .if \\$1 .nr )u \\$1 .if\w\\$1u .if !\\n()uu-7u .nr )k \\$1i .if\w\\$1u .if \\n()uu-7u .nr )k \\$1 .if\\n(.$-1 .A \\$3 .. .deA .br .if!\\n(.$ .if \\n(nlu-\\n()nu .sp \\*(]Au .nr)n \\n(nlu .po\\n()au .in0u+\\n()ku .ll\\n()pu .lt\\n()pu .. .deB .br .if\\n(nlu-\\n()nu .sp \\*(]Bu .nr)n \\n(nlu .in\\n()bu+\\n()ku .ll\\n()qu .lt\\n()qu .nr)l 0 .nr]x \\n()bu .if!\\n(.$ .)I \\*()B \\n()Q .if\\n(.$ .if !\\n(.$-1 .)I "\\$1" 0 .if\\n(.$-1 .if \\$2-99 .)I "\\$1\ \|" \\n()Q .if\\n(.$-1 .if !\\$2-99 .nr )l 1 .if\\n(.$-1 .if !\\$2-99 .)I "\\$1" "\\$2" .. .deC .br .if\\n(nlu-\\n()nu .sp \\*(]Cu .nr)n \\n(nlu .in\\n()cu+\\n()ku .ll\\n()ru .lt\\n()ru .nr)l 0 .nr]x \\n()cu-\\n()bu .if!\\n(.$ .)I \\*()C \\n()R .if\\n(.$ .if !\\n(.$-1 .)I "\\$1" 0 .if\\n(.$-1 .if \\$2-99 .)I "\\$1\ \|" \\n()R .if\\n(.$-1 .if !\\$2-99 .nr )l 1 .if\\n(.$-1 .if !\\$2-99 .)I "\\$1" "\\$2" .. .deD .br .if\\n(nlu-\\n()nu .sp \\*(]Du .nr)n \\n(nlu .in\\n()du+\\n()ku .ll\\n()su .lt\\n()su .nr)l 0 .nr]x \\n()du-\\n()cu .if!\\n(.$ .)I \\*()D \\n()S .if\\n(.$ .if !\\n(.$-1 .)I "\\$1" 0 .if\\n(.$-1 .if \\$2-99 .)I "\\$1\ \|" \\n()S .if\\n(.$-1 .if !\\$2-99 .nr )l 1 .if\\n(.$-1 .if !\\$2-99 .)I "\\$1" "\\$2" .. .de)I .nr]a \\n(.s .ps .nr]b \\n(.s .ps .if!\\n()l .if !\\$2 .nr )A \\n(.s .if!\\n()l .if \\$2 .nr )A \\n(.s*\\$2/\\n(]X .if\\n()l .nr )A \\n(.s+\\$2 .ps\\n()A .ti-\w\\$1\ u \&\\$1\ \&\c .ps\\n(]b .ps\\n(]a .. .deU .if!\w\\$1u-.46m \&\\$1\v'.55m'\l'|0\(hy'\v'-.55m'\\$2 .if\w\\$1u-.46m \&\\$1\v'.09m'\l'|0\(ul'\v'-.09m'\\$2 .. .deDV .if\w\\$1 .ds ]A \\$1 .if\w\\$2 .ds ]B \\$2 .if\w\\$3 .ds ]C \\$3 .if\w\\$4 .ds ]D \\$4 .. .deDF .if\\n(.$-1 .ds )f "\\$2 .if\\n(.$-1 .fp \\$1 \\$2 .if\\n(.$-1 .ft \\$2 .if\\n(.$-3 .fp \\$3 \\$4 .if\\n(.$-5 .fp \\$5 \\$6 .if\\n(.$-7 .fp \\$7 \\$8 .. .deSP .sp\\$1 .. .deBR .br .. .deTA 'ta\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .deCE .ce\\$1 .. .deTI .ti\\$1 .. .deFI .fi .. .deNF .nf .. .deAD 'ad\\$1 .. .deNA 'na .. .deHY 'hy\\$1 .. .deNH 'nh .. .deSO 'so\\$1 .. .deNX 'nx\\$1 .. .ds)F FOIL .if\n(.A .ds )F FOIL .ds)N Bell\ Labs .ds)Y \n(mo/\n(dy/\n(yr .ds)B \(bu\ \| .ds)C \(em\ \| .ds)D \(bu\ \| .ds]A .5v .ds]B .5v .ds]C .5v .ds]D 0v .nr)G 11i-7.5p .nr)Q 5 .nr)R 5 .nr)S 3 .nr]X 6 .nr)i 1 .nr)w 0 .em)z .DF 1 H 9base-6/troff/tmac/tmac.cs0000644000175000017500000005151411402154555015073 0ustar anselmanselm'''\" coversheet to match version 8/06/87 '''\" from comp center 1.30 7/20/87 '''\" 1/22/97 spacing change in addresses; '''\" email on separate line - mdm '''\" registers '''\" a - abstract continuation flag - 0 (no), >0 (yes) '''\" b - mercury selections counter '''\" c - distribution continuation flag - 0 (no), 1 (yes) '''\" d - flag for length calculation '''\" e - complete copy basic distribution length '''\" g - complete copy overflow distribution length '''\" h - cover sheet basic distribution length '''\" i - cover sheet overflow distribution length '''\" k - keyword flag - 0 (none), 1 (some) - reused as scratch '''\" l - number of vertical units per line - troff '''\" m - memorandum type flag - 1 TM, 2 IM, 3 TC '''\" n - document number counter '''\" o - title flag - 0 (no), 1 (yes - vertical size of title diversion) '''\" p - proprietary notice flag - 0 (none), 1 (default), 2(BR) '''\" r - security flag - 0 (no), 1 (yes) '''\" s - software flag - 0 (no), 1 (yes) '''\" t - mark title position '''\" u - author count '''\" q v w x y z- scratch - but remembered '''\" aa - ship to itds '''\" strings '''\" a) b)- mercury info '''\" d) - date '''\" k) - keywords '''\" N1 - first document number '''\" p) q) r)- proprietary 1 '''\" s) - time stamp string '''\" t) - memo type (TM, IM, TC) '''\" v) - document nos '''\" w) - filing case nos '''\" x) - work project nos '''\" e( - earlier document '''\" m( n( o( p(- authors 1-3 sig '''\" r( - responsible person '''\" s( - S software string '''\" t( - memo type ("for Technical Memorandum", etc.) '''\" x( - Mailing Label or DRAFT '''\" N2 N3- 2nd 3rd document number '''\" Fi - up to 3 filing cases '''\" Xi - up to 3 work program numbers '''\" diversions '''\" WB - abstract '''\" ZI - author info section '''\" ZC - complete copy addressee primary '''\" ZO - complete copy addressee overflow '''\" ZS - cover sheet addressee primary '''\" ZD - cover sheet addressee overflow '''\" ZN - document number info '''\" WT - title '''\" '''\" initialization '''\" '''\" get ms if not loaded .if !\n(PS .so /usr/lib/tmac/tmac.s . \" to foil ms .if !'\*(d)'' \{\ . tm You're trying to load the coversheet macros twice - havoc will result . tm I'm quitting to keep you from wasting paper . ex \} .rn FE F6 .nr ST 0 .nr CS 1 .ch NP 16i .ch FO 16i .ch FX 16i .ch BT 16i .nr FM .01i .nr 1T 1 .nr BE 1 .nr PI 5n .if !\n(PD .nr PD 0.3v .pl 11i .de FT .fp 1 H .fp 2 HI .fp 3 HB .fp 4 HX .ps 10 .vs 12 .. .de FB .ie !'\\*(TF'' .FP \\*(TF .el .FP times .ps 10 .vs 12 .. .FT .de FE .F6 .nr F4 +\\n(FP .. .nr a 0 1 .nr b 0 1 .nr c 0 .nr d 0 .nr e 0 .nr g 0 .nr h 6 .nr i 0 .nr k 0 .nr m 0 .nr n 0 1 .nr o 0 .nr p 1 .nr q 0 .nr r 0 .nr s 0 .nr t 0 .nr u 0 1 .nr v 0 .nr w 0 .nr x 0 .nr y 0 .nr z 0 .nr dv 0 .if '\*(.T'aps' .nr dv 1 '''\" initialize units per vertical space .nr l 120 .nr lp 66 .nr np 2 1 .af np i .nr tp 2 1 .nr tc 2 .af tc i .nr la 0 .nr a1 0 .nr a2 0 .nr ar 0 .nr u! 1 .nr ud 1 .nr ra 1 .di ZI .di .di ZN .di .di ZC .di .di ZO .di .di ZS .di .di ZD .di '''\"initialize date string - keep for 1st pg of tm .if \n(mo-0 .ds d) January .if \n(mo-1 .ds d) February .if \n(mo-2 .ds d) March .if \n(mo-3 .ds d) April .if \n(mo-4 .ds d) May .if \n(mo-5 .ds d) June .if \n(mo-6 .ds d) July .if \n(mo-7 .ds d) August .if \n(mo-8 .ds d) September .if \n(mo-9 .ds d) October .if \n(mo-10 .ds d) November .if \n(mo-11 .ds d) December .as d) " \n(dy, 20\n(yr .ds DY \*(d) ''' \" initialize strings .ds m! .ds m( .ds n! .ds n( .ds o! .ds o( .ds x! .ds y! .ds z! ''' \" initialize proprietary notice .ds o) "Lucent Technologies \(em PROPRIETARY .ds p) "Use pursuant to Company Instructions .ds q) .ds r) ''' \" initialize trademark symbol .ds MT \v'-0.5m'\s-4TM\s+4\v'0.5m' .ds s) 0 ''' \"initialize csmacro version string .ds ve MCSL (07/12/90) ....in 0 '''\" ''' \" macros to collect information '''\" .de DT \" macro for date '''\" store date if non-empty .if !'\\$1'' .ds d) \\$1 \\$2 \\$3 \\$4 .ds DY \\$1 \\$2 \\$3 \\$4 .. .de TI \" macro for title -TI = mm(TL) .br .nr aa 0 .nr TV 1 .ds x( "Mailing Label \} .in 0 .fi .ll 4.25i '''\" diversion for title ZT = mm(tI) .di WT .. .de AH \" macro for author info AH = mm(AU) '''\" name loc dept ext room mail_addr company '''\" don't count author unless non-empty .br .di .if !'\\$1'' .nr u \\n+u .nr AV \\nu .if \\nu=1 \{\ . br '''\" end title diversion on first author . di . nr o \\n(dn . ll . nf . ds d! \\$3 . nr m2 \\$3/10 \} .ta 0.3i 3.i 4i 5.5i .br .ds D\\nu \\$2 \\$3 .ds \\nuL \\$5, x\\$4 '''\" append to author list ZI = mm(aV) .da ZI \\$1 \\$2 \\$5 \\$4 \\$7 .br .da .if !'\\$6'' \{\ .da ZI (\\$6) .br .da \} '''\" end append; info for signature lines .AA \\nu "\\$1" \\$3 \\$2 "\\$4" \\$5 \\$6 .ta 0.5i 1.0i 1.5i 2.0i 2.5i .. .de AA .\"ft 3 .di M\\$1 \\$2 .di .di A\\$1 \\$2 .if !'\\$3'' Org. \\$3 .if !'\\$4'' \\$4 \\$6 .if !'\\$5'' \\$5 .if !'\\$7'' \\$7 .sp .05i .br .di .ft .sy echo \\$2 >/tmp/tt\\n($$ .sy sed -f /usr/lib/tmac/name.sed /tmp/tt\\n($$ >/tmp/tx\\n($$ .so /tmp/tx\\n($$ .sy rm /tmp/tx\\n($$ /tmp/tt\\n($$ .if \\$1<2 .ds T1 \\*(T1-gre .da G9 \\$4-\\$3-\\*(T1 .br .da .if !'\\*(d!'\\$3' \{\ . nr u! \\n(u!+1 . nr m3 \\$3/10 . if !\\n(m2=\\n(m3 .nr ud \\n(ud+1 \} .ie \\$1<4 \{\ . as m! \\l'2.25i' . as m( \\$2 \} .el .ie \\$1<7 \{\ . as n! \\l'2.25i' . as n( \\$2 \} .el \{\ . as o! \\l'2.25i' . as o( \\$2 \} .. .de TO \"begin list of im to people .nr TO 1 .di 1T .. .de ET \"end list of im to people & output pg .di .SR .. .de AP \" at&t responsible person AP = mm(rP) .br .di .if !'\\$1'' .ds r( \\$1 .rm AP .. .de SA \" macro for abstract info SA = mm(AS) .br .ie \\n(.$ \{\ .ds a( \\$1 .if '\\$1'no' .ds a(\} .el .ds a( ABSTRACT .nr CS 0 .di .fi .nr LL 7.0i .FB .ft 1 .di WB \" WB = mm(aS) .. .de SE \" macro for end of abstract info SE = mm(AE) .br .di .nr la \\n(dn .nr CS 1 .ll .FT .ft 1 .nf .. .de KW \" macro for keyword info KW = mm(OK) .ds k) .if !'\\$1'' .as k) \\$1 .if !'\\$2'' .as k); \\$2 .if !'\\$3'' .as k); \\$3 .if !'\\$4'' .as k); \\$4 .if !'\\$5'' .as k); \\$5 .if !'\\$6'' .as k); \\$6 .if !'\\$7'' .as k); \\$7 .if !'\\$8'' .as k); \\$8 .if !'\\$9'' .as k); \\$9 '''\" set k flag if we have some keywords .ie !'\\*(k)'' .nr k 1 .el .nr k 0 .. .de TY \" macro for document type TY = mm(MT) .if '\\$1'TM' \{\ . nr m 1 . ds t) TM . ds QF TECHNICAL MEMORANDUM . ds t( "for Technical Memorandum \} .if '\\$1'IM' \{\ . nr m 2 . ds t) IM . ds QF INTERNAL MEMORANDUM . ds t( "for Internal Memorandum \} .if '\\$1'TC' \{\ . nr m 3 . ds t) TC . ds QF TECHNICAL CORRESPONDENCE . ds t( "for Technical Correspondence \} .ie '\\$2'y' .nr s 1 .el .nr s 0 .. .de NU \" macro for document number info NU = mm(dN fC wP) .ie \\ns=1 .ds s( S .el .ds s( .ie \\n(wp=0 \{\ . ie '\\$5'' .ds CX 000000-0000 . el .ds CX \\$5 . ds X1 \\*(CX . nr wp \\n(wp+1 \} .el \{\ . ds CX \\$5 . if !'\\$5'' \{\ . if \\n(wp=1 .ds X2 \\*(CX . if \\n(wp=2 .ds X3 \\*(CX . if \\n(wp=3 .ds X4 \\*(CX . if \\n(wp=4 .ds X5 \\*(CX . nr wp \\n(wp+1 . ds x) s\}\} .if !'\\$4'' \{\ . ie !\\n(fc=0 \{\ . if \\n(fc=1 .ds F2 \\$4 . if \\n(fc=2 .ds F3 \\$4 . if \\n(fc=3 .ds F4 \\$4 . if \\n(fc=4 .ds F5 \\$4 . ds w) s . nr fc \\n(fc+1 \} . el \{\ . ds F1 \\$4 . nr fc \\n(fc+1 \} \} .ie !'\\$1'' \{\ . ds NN \\$1-\\$2-\\$3\\*(t)\\*(s( . if \\nn=0 .ds N1 \\*(NN . if \\nn=1 \{\ . ds v) s . ds N2 \\*(NN\} . if \\nn=2 .ds N3 \\*(NN . if \\nn=3 .ds N4 \\*(NN . if \\nn=4 .ds N5 \\*(NN . ie \\nn<4 .as x! \\l'2.25i' . el ie \\nn<7 .as y! \\l'2.25i' . el .as z! \\l'2.25i' . nr n \\n+n \} .if !'\\$6'' \{\ . ie !\\n(a!=0 \{\ . if \\n(a!=1 .as Z1 " \\$6 . if \\n(a!=2 .as Z1 \\$6 . nr a! \\n(a!+1 \} . el \{\ . ds Z1 " \\$6 . nr a! \\n(a!+1 \} \} .el .ds NN .ta 0.8i 3.5i 5.55i .br .da ZN \" ZN = mm(dM fC wO) \\*(NN \\$4 \\*(CX .br .da .ta 0.5i 1.0i 1.5i .. .de MY \" macro for mercury selections MY = mm(mE) .ds a) .ds b) .if '\\$1'y' \{\ . as a) " CHM - Chemistry and Materials . nr b \\n+b \} .if '\\$2'y' \{\ . as a) " CMM - Communications . nr b \\n+b \} .if '\\$3'y' \{\ . as a) " CMP - Computing . nr b \\n+b . if \\nb=3 .rn a) b) \} .if '\\$4'y' \{\ . as a) " ELC - Electronics . nr b \\n+b . if \\nb=3 .rn a) b) \} .if '\\$5'y' \{\ . as a) " LFS - Life Sciences . nr b \\n+b . if \\nb=3 .rn a) b) \} .if '\\$6'y' \{\ . as a) " MAS - Mathematics and Statistics . nr b \\n+b . if \\nb=3 .rn a) b) \} . if \\nb<6 \{\ . if '\\$7'y' \{\ . as a) " PHY - Physics . nr b \\n+b . if \\nb=3 .rn a) b) \} \} . if \\nb<6 \{\ . if '\\$8'y' \{\ . as a) " MAN - Manufacturing . nr b \\n+b \} \} .if \\nb=3 .rn b) a) .. .de RL \" lucent distribution ok RL = mm(rA or fA) .if '\\$1'n' .nr ra 2 .rm RL .. .de ED \" earlier document number ED = mm(eD) .if !'\\$1'' .ds e( \\$1 .rm ED .. .de PR \" macro for proprietary marking PR = mm(PM) .if '\\$1'BP' .nr p 1 .if '\\$1'BR' \{\ . nr p 2 . ds o) "Lucent Technologies \(em PROPRIETARY (RESTRICTED) . ds p) "Solely for authorized persons having a need to know . ds q) " pursuant to Company Instructions \} .if '\\$1'0' .nr p 0 .. .de GS \" GS = mm(gS) .nr r 1 .. .de CI .. .de XE '''\" basic distribution leng-to be tailored-set e & h .if \\nd=0 \{\ . nr d 1 . if \\nr=0 .nr e \\ne+2 . if \\nu<=3 .nr e \\ne+3 . if \\nu<=6 .nr e \\ne+3 . if \\nu<=9 .nr e \\ne+3 . if \\nn<=3 .nr e \\ne+2 . if \\nn<=6 .nr e \\ne+2 . if \\nn<=9 .nr e \\ne+2 . if \\n(ra<=2 .nr e \\ne-3 . nr e \\ne+27 . nr h \\ne \} .. .de CO \" macro for complete copy addressees CO = mm(cC) .XE .ta 2.0i .nf .br .ie \\ne>0 \{\ . da ZC \" ZC = mm(cA) . ds y( \\$1 . ie '\\$1'y' .so /usr/lib/tmac/complet.1127 . el .if !'\\$1'' .so /usr/lib/tmac/complet.\\*(y( . dt \\ne OC \} .el .da ZC .. .de OC \" macro for complete copy overflow - OC = mm(cD) .ta 2.0i .br .da .da ZO \" ZO = mm(cO) .ie \\n(ar>0 .dt \\n(arv ZW .el .dt 55 ZW .. .de ZW .br .da .ie \\n(dn>0 .g (\\n(dn)/\\nl+4 .da CZ .. .de CV \" macro for cover sheet only addresses CV = mm(cS) .XE .ta 2.0i .nf .br .ie \\nh>0 \{\ . da ZS \" ZS = mm(dA) . ds y( \\$1 . ie '\\$1'y' .so /usr/lib/tmac/cover.1127 . el .if !'\\$1'' .so /usr/lib/tmac/cover.\\*(y( . dt \\nh OV \} .el .da ZD .. .de OV \" macro for cover sheet only overflow OV = mm(cT) .ta 2.0i .br .da .da ZD \" ZD = mm(cO) .ie \\n(ar>0 .dt \\n(arv WW .el .dt 55 WW .. .de WW .br .da .if \\n(dn>0 .nr i (\\n(dn)/\\nl+4 \" was ie with no el .da DZ .. .de CE \" ending all distribution diversions CE = mm(cE) .br .if "\\n(.z"ZC" \{\ . nr g 0 . rm OC \} .if "\\n(.z"ZO" \{\ . nr g -1 . rm OC \} .if "\\n(.z"CZ" \{\ . nr g -2 . rm OC \} .if "\\n(.z"ZS" \{\ . nr i 0 . rm OV \} .if "\\n(.z"ZD" \{\ . nr i -1 . rm OV \} .if "\\n(.z"DZ" \{\ . nr i -2 . rm )V \} .da .if \\ng=-1 \{\ . ie \\n(dn>0 .nr g (\\n(dn)/\\nl+4 . el .nr g 0 \} .if \\ni=-1 \{\ . ie \\n(dn>0 .nr i (\\n(dn)/\\nl+4 . el .nr i 0 \} .. '''\" '''\" macros to help format document '''\" .de HD .po .5i \"was .25 .if "\\*(.T"aps" .tl '--''--' .sp|0.2i .. .de FC \" footer macro FC = mm(fO) .pl 11.0i 'bp .. .de ST \" macro for abstract overflow trap ST = mm(yY) .ZB .rm ST \" ZB = mm(aT) .. .de ZB .ch ST 16i \" macro for abstract overflow trap ZB = mm(aT) .if \\na>0 \{\ . ft 2 . ce (continued) . ft 1 \} .pl 11.0i .nr a \\n+a .rn ZB XX 'bp .rn XX ZB .wh -0.35i ZB .HC \" HC = mm(cH) .HX \" HX = mm(tH) 'sp 0.05i .ce .ft 3 Abstract (continued) .ft 1 .in 0.2i 'sp 1 .FB .. .de TK \" macro for thick lines TKK = mm(tK) .ps 24 \l'7.5i' .ps .. .de HX \" macro for Title headings and text HX = mm(tH) .TK 'sp 0.05i '''\" mark t - Title heading .mk t .ft 3 Title: .ft 'sp|\\ntu .in 0.7i .WT .in 0 .ta 0.5i .nr q \\no/\\nl .ie \\nq>2 'sp|\\ntu+\\nq .el 'sp|\\ntu+2 .TK . \" m1 - mark end of title section - save .mk m1 .. .de HC \" macro for continuation header HC = mm(cH) .nr np \\n+(np .nf .in 0 .FT .ft 3 .ta 4.80i .nr tc \\n(tp \\*(N1\f2 (page \\n(np of \\n(tc) .sp 0.1i .. .de DL \" macro for distribution list headers DL = mm(dH) .ft 3 .ta 1.0i 4.75i \\$1 \\$2 .sp 0.05i .ft 1 .ta 0.5i 1.0i .. .de EJ \" macro for ejecting continuation page EJ = mm(eP) 'bp .wh 0 HD '''\" put out continuation page header & title section .HC .HX .. .de CP \" macro for continuation page CP = mm(cP) '''\" calc vert. units for cc overflow (if any) .ie \\nv<=\\n(.t .nr v 1 .el .nr v 0 .if \\nv=1 .if \\nw<=\\n(.t .nr v 2 . \" check if cont page needs to be ejected .in 0 .if \\nc=1 \{\ . \" - if no abstract overflow . if \\na=0 .EJ . if \\na>0 \{\ . \"or if abstract over but no room for list overfl . ie \\nv<2 .EJ . \" just tk line if abstract over & room for list . el .TK \} . FT . ie \\ne=0 \{\ . if \\ng>4 .if \\ni>4 .DL "Complete Copy" "Cover Sheet Only" . if \\ng>4 .if !\\ni>4 .DL "Complete Copy" "" . if !\\ng>4 .if \\ni>4 .DL "" "Cover Sheet Only" \} . el \{\ . if \\ng>4 .if \\ni>4 .DL "Complete Copy (continued)" "Cover Sheet Only (continued)"1 . if \\ng>4 .if !\\ni>4 .DL "Complete Copy (continued)" "" . if !\\ng>4 .if \\ni>4 .DL "" "Cover Sheet Only (continued)" \} . mk z . nr q \\n(.t/\\nl '''\" put out complete copy list overflow . in 0.2i . ZO . in 0 . mk x . sp|\\nzu . in 4i '''\" put out cover sheet list overflow . ZD . mk y . in 0 . if \\nx-\\ny .sp|\\nxu . TK \} .. .de ZP \"compute total pages and diversion lengths '''\" calculate vert. units for cc overflow (if any) .ie \\ng>4 .nr v (\\ng)*\\nl .el .nr v 0 '''\" also for cs overflow (if any) .ie \\ni>4 .nr w (\\ni)*\\nl .el .nr w 0 .ie \\nv>\\nw .nr j \\nv .el .nr j \\nw . \" set c=1 if either g or i >0 .if \\ng>4 .nr c 1 .if \\ni>4 .nr c 1 . \" calculate total pages in job (default 2) . \" a1 - page 1 portion abstract (units) .nr a1 \\nyu-\\nxu-1v .ie \\n(la>\\n(a1 \{\ . \" ar - remainder abstract (units) . nr ar \\n(la-\\n(a1 . nr tp \\n+(tp . \" a2 - available continuation page space . \" m1 is mark after tk line after title . \" 2v for Abstract (continued) + one blank . nr a2 11.0i-\\n(m1-2v . ZZ \} .el .if \\nc>0 .nr tp \\n+(tp .. .de ZZ \" ZZ = mm(t1) .ie \\n(ar>\\n(a2 \{\ . nr ar \\n(ar-\\n(a2 . nr tp \\n+(tp . ZZ \} .el .if \\n(ar+\\nj>\\n(a2 .nr tp \\n+(tp .. '''\" '''\" main macro to handle output of cover sheet '''\" mm(CS) .de SC .nr CS 0 .nr ST 1 .if \\nu=0 \{\ . tm WARNING: author must be supplied \} .if \\no=0 \{\ . tm WARNING: document title must be supplied \} .if \\nm=0 \{\ . tm WARNING: memorandum type undefined or unknown \} .if \\nm=1 .if \\nb=0 \{\ . tm WARNING: technical memoranda must have at least one mercury class \} .if \\nn=0 \{\ . tm WARNING: document number must be supplied \} .XE .ll 7.5i .ft 1 .if \\n(nl .bp .in 0 .HD '''\" the rs is to restore spacing - ditches big space at top .rs .sp1 .sp 0.05i .nf .ps 16 .ft 3 .ta 4.85i . \" put out page 1 heading Document Cover Sheet .wh 0 HD .sp 0.1i .ta 0.15i 4.55i \s36\(FA\s0 \\*(t( .ft .ps 10 .HX .sp 0.05i .ft 3 .ie \\nu>1 .ds u) s .el .ds u) .ta 0.5i 3.0i 3.95i 5.25i Author\\*(u) (Computer Address) Location Phone Number Company (if other than BL) .ft '''\" output author info .ZI .if !'\\*(r('' \{\ . ta 0.3i 2.6i \\*(r( (Responsible BL Person) \} .TK .sp 0.05i .ft 3 .ta 1.0i 3.3i 5.55i Document No\\*(v). Filing Case No\\*(w). Project No\\*(x). .ft .sp 0.05i '''\" output document number .ZN .TK '''\" output keywords if they exist .if \\nk>0 \{\ . ft 3 Keywords: . ft . sp 0.05i . ti 0.2i \\*(k) . TK \} '''\" output mercury info if it exists .if \\nb>0 \{\ . ft 3 MERCURY Announcement Bulletin Sections . ft . sp 0.05i . ta 0.6i 3.1i 5.6i . ps 8 . if \\nb>3 \\*(b) \\*(a) . ps . TK \} .ft 3 Abstract .ft .mk x .nr b1 \\nx/\\n(.v+1 .nr b2 (\\n(b1*\\n(.v)-\\nx .sp \\n(b2u .mk x '''\" calculate position (19v includes 2v to print version at bottom of page) .nr y \\n(lpv-19v .if \\n(F4>0 .nr y \\ny-\\n(F4 .sp|\\nyu .sp -1 .ZP '''\" handle abstract page 1 continuation .ie \\n(la>\\n(a1 \{\ . ce . ft2 (continued on page iii) . ft1 . br \} .el .sp1 .if \\n(F4>0 \{\ . FA . FG \} .TK .ps 8 .vs 10 .nr qq \\$1+\\$2+\\n(tp \f3Total Pages\f1 (including document cover sheet): \\s+2\\n(qq\\s-2 .ie !'\\*(e('' \{\ Supersedes or amends document number \\*(e(. \} .el .sp .ps .vs .mk z .sp .67i '''\" output proprietary notice if it exists .if \\np>0 \{\ .ft 2 .ti (4i-\\w'\\*(o)'u)/2u \\*(o) .ft .ti (4i-\\w'\\*(p)'u)/2u \\*(p) .ti (4i-\\w'\\*(q)'u)/2u \\*(q) \} .sp |\\nzu+11v .ta 5.35i \\s8\\*(ve\\s0 .ie !'\\*(s)'' \{\ \s8Timestamp: \\*(s)\s0 BELL LABORATORIES \} .el \{\ BELL LABORATORIES \} .sp|\\nzu .sp 1 .ft 3 .ti 5.25i \\*(x( .ft .sp|\\nxu .in 0.2i .nf '''\" abstract .if !\\n(la=\\n(a1 \{\ . wh -0.25i ST \} .pl \\nyu .ta 0.5i 1.0i 1.5i 2.0i 2.5i .FB .ft 1 '''\" output the abstract .WB .if \\n(la=\\n(a1 .sp-1 .rn ZB XX .wh -0.25i FC '''\" output continuation page .CP 'bp .FT .ft 1 .in 0 .wh 0 HD .nf .ft 3 .ta 5.00i .nr tc \\n(tp Initial Distribution Specifications \\*(N1\f2 (page ii of \\n(tc)\f3 .ft 1 .TK .if \\ne>0 \{\ . DL " Complete Copy" " Cover Sheet Only" . mk z '''\" put out complete copy list . in 0.2i . ZC . in 0 . if !\\ng=0 \{\ . ft 2 . ti 1.25i (continued) . ft 1 \} . sp|\\nzu . in 4i '''\" put out cover sheet list . ZS . if !\\ni=0 \{\ . ft 2 . ti 4.75i (continued) . ft 1 \} . in 0 '''\" starter space value - then tailor . sp|5 . sp \\ne . TK \} .if \\nr=1 \{\ \f3Government Security Classified\f1 . ft 1 . sp -0.05i . TK \} \f3Future Lucent Technologies Distribution by ITDS\f1 .ti 0.5i .sp 0.05i .ie \\n(ra=2 \{\ \f3DO NOT RELEASE\f1 to any Lucent Technologies employee without appropriate approval for each request. \} .el \{\ \f3RELEASE\f1 to any Lucent Technologies employee (excluding contract employees). \} .TK '''\" put out author signature section .ft 3 Author Signature\\*(u) .ft 1 .sp1 .ta 2.635i 5.25i \\*(m! .ta 0.25i 2.875i 5.5i \\*(m( .if \\nu>3 \{\ . sp 0.1i . ta 2.635i 5.25i \\*(n! . ta 0.25i 2.875i 5.5i \\*(n( \} .if \\nu>6 \{\ . sp 0.1i . ta 2.635i 5.25i \\*(o! . ta 0.25i 2.875i 5.5i \\*(o( \} .sp -0.1i .TK '''\" output organizational approval section .ie \\np>1 \{\ \f3Organizational Approval\f1 (Department Head approval \f3required\ff1 for \f2\\*(o)\f1.) \} .el \{\ \f3Organizational Approval\f1 (Optional) \} .sp 1 .ta 2.635i 5.25i \\*(x! . ta 0.25i 2.875i 5.5i \\*(Z1 .if \\nn>3 \{\ . sp .1i .ta 2.635i 5.25i \\*(y! \} .if \\nn>6 \{\ . sp .1i \\*(z! \} .sp -0.1i .TK '''\" recipient section always output .ft 3 For Use by Recipient of Cover Sheet: .ft 1 .ps -3 .vs -4 .sp.05i .mk z Computing network users may order copies via the \f2library \-k\f1 command; for information, type \f2man library\f1 after the UNIX prompt. '''.sp1 .rn fo xx Otherwise: Enter PAN if BL (or SS# if non-BL). \l'1.5i' Return this sheet to any ITDS location. .sp|\\nzu .in 4i Internal Technical Document Service '''.sp1 .ta 1i 2i 3i ( ) AK 2H-28 ( ) IH 7M-103 ( ) DR 2F-19 ( ) NW-ITDS ( ) ALC 1B-102 ( ) MV 1L-19 ( ) INH 1C-114 ( ) PR 5-2120 ( ) CB 30-2011 ( ) WH 3E-204 ( ) IW 2Z-156 ( ) HO 4F-112 ( ) MT 3B-117 .in .ps .vs .SR .. . \"IZ - initialization .de IZ .FB .nr TN 0 .em EM .po 1i .nr PO 1i .if \\n(FM=0 .nr FM 1i .nr YY 0-\\n(FMu .if !\\n(PD .if n nr PD 1v .if t .if !\\n(PD .nr PD 0.3v .wh 0 NP .wh \\n(.pu-\\n(FMu FO .ch FO 16i .wh \\n(.pu-\\n(FMu FX .ch FO \\n(.pu-\\n(FMu .if t .wh -\\n(FMu/2u BT .if n .wh -\\n(FMu/2u-1v BT .. .\" macro to restore ms foiling .de SR .nr BE 0 .nr 1T 1 .nr FM 0 .nr PD 0 .nr HM 0 .nr KG 0 .nr FP 0 .nr GA 0 .nr FP 0 .\" changed rn F5 FE added rn FJ FS .rn FK FE .rn FJ FS .if '\\$1'' .bp .if !'\\$1'' \{\ .di ZA .ce \\*(a( .sp .WB .di .rn ZA WB\} .nr FC -1 .nr % 1 .IZ .rm IZ .if '\\$1'' .RT .ds MN \\*(N1 \\*(N2 \\*(N3 \\*(N4 \\*(N5 .nr MM \\nn .nr MC \\n(fc .nr MG \\n(wp .nr NA \\nu .if '\\n(ST'1' \{\ '''.so /usr/lib/tmac/tmac.rscover XXX .so \*(.P/lib/tmac/tmac.rscover . \" a line for troff to eat .S1 \} .ll 6i .nr LL 6i .rr a b c d e f g h i j k .rr l m n o p q r s t u .rr v w x y z np tp nc tc .rr ud u! m2 dv .rr lp np la a1 a2 ar wp fc m1 .rm DT TI AH SE KW TY NU MY .rm PR CI CO OC CV OV CE HD .rm FC ST TK HX HC DL EJ .rm CP SC a) b) k) N1 p) q) r) .rm N2 N3 N4 N5 X1 X2 X3 X4 X5 .rm X1 X2 X3 X4 X5 F1 F2 F3 F4 .rm F5 .rm d) o) s) ve m! n! o! e( r( .rm x! y! z! x( d! ve u) .rm t) w) x) y) z) a( b( c( m( .rm n( o( p( s( t( SA ZI ZC ZO .rm ZS ZD ZN FT FB CX NN GS .rm ZB XX ZP ZZ .rm TM IM MF MR LT OK RP TR .rm TX AU AX AI AE SY S2 S0 .rm S3 .. .de RP .nr ST 2 .SS .. .de TR .nr ST 3 .ds MN \\$1 .SS .. .de SS \"RP or TR rename the world so old macros called .rm SG .nr CS 0 .nr BE 0 .nr 1T 0 .nr FM 0 .nr PD 0 .nr HM 0 .nr KG 0 .nr FP 0 .nr GA 0 .nr FP 0 .ll 6i .nr LL 6i .\" changed rn F5 FE added rn FJ FS .rn F6 FE .nr FC -1 .nr % 1 .IZ .rm IZ .pn 0 .de TI .TL \\.. .de SA .AB \\\\$1 \\.. .de SE .AE \\.. .de AH .AU \\\\$1 \\.. .de DT .ND \\\\$1 \\\\$2 \\\\$3 \\.. .br .rr a b c d e f g h i j k .rr l m n o p q r s t u .rr v w x y z np tp nc tc .rr ud u! m2 dv .rr lp np la a1 a2 ar wp fc m1 .rm DT KW TY NU MY .rm PR CI OC OV HD .rm FC ST TK HX HC DL EJ .rm CP SC a) b) k) N1 p) q) r) .rm d) o) s) ve m! n! o! e( r( .rm x! y! z! x( d! ve u) .rm t) w) x) y) z) a( b( c( m( .rm n( o( p( s( t( ZI ZC ZO .rm ZS ZD ZN FT FB CX NN GS .rm ZB XX ZP ZZ .rm TM IM MF MR LT .. 9base-6/troff/tmac/tmac.scover0000644000175000017500000001101011402154555015752 0ustar anselmanselm. \"OK - "other keywords" for cover sheet. .de OK .br .di .di OD .nf .ft 3 .. . \"CS - spew out cover sheet .de CS .br .if \\n(AJ>0 .tm Abstract not finished, AE assumed. .if \\n(AJ>0 .AE .di .if t .po 0.5i .ft 2 .nr IB \\n(.b .ft P .nr K1 1 .if t .sp |.4i .if t .lg .ll 7.0i .vs 12p .nf .if t \{ .if \\n(ZZ<1 \h'7n'\s24\(FA\s12\f3 Bell Laboratories \s16\f1Cover Sheet for Technical Memorandum .if \\n(ZZ>=1 \h'7n'\s24\(FA\s12\f3 Bell Laboratories \s16\f1Cover Sheet for Technical Memorandum\} .if n Bell Laboratories Cover Sheet for Technical Memorandum .if t .sp .5v .if n .sp .if t \s6\l'7i' .fi .ps 9 .ft 2 .if \\n(.$<=6 The information contained herein is for the use of employees of Bell Laboratories and is not for publication. (See GEI 13.9-3)\p .if \\n(.$>6 Warning: studying this document may cause drowsiness. Do not read before driving or operating machinery. (See GEI 13.9-3)\p .ft 1 .nf .if \\n(IB>0 .bd 2 \\n(IB .vs 5p .if t \s6\l'7i' .vs .if t .sp .5v .if n .sp .if t .ll 4.0i .if n .ll 30 .if t .po 1.0i .ps 9 .if t .ta 0.5i 4.5i 4.9i .if n .ta 9 39 46 .mk Title- \f3\s10 .rt .if t .in 0.5i .if n .in 10 .hy 0 .WT .hy 14 .br .rt .ll \\n(LLu .if t .in 4.5i .if n .in 40 .nf \s9\f1Date- \s10\f3 .rt .if t .in 4.9i .if n .in 47 \\*(DY .sp .if t .ti 4.5i .if n .ti 40 .mk \s9\f1TM- \f3\s10 .br .rt .CZ \\*(MN .in 0 .if n .sp |\\n(.hu+1v .if t .sp |\\n(.hu+.3v .mk \s9\f1Other Keywords- \f3 .rt .if t .in 1.1i .if n .in 20 .OD .in 0 .if t .sp .3i .if n .sp 3 .ps 9 .if t .ta 1.8i 3.3i 4.3i .if n .ta 19 34 44 .ft 1 .mk .fi .ll 6.7i .in 4.6i .ti 0 .nr SJ \\n(.j .na Author Location Extension Charging Case- \s10\f3\\*(CA .ps 10 .ti 4.3i \f1\s9Filing Case- \s10\f3\\*(CC .nf .in 0 .ad \\n(SJ .rt .sp 1 .CB 1 .if \\n(NA-1 .CB 2 .if \\n(NA-2 .CB 3 .if \\n(NA-3 .CB 4 .if \\n(NA-4 .CB 5 .if \\n(NA-5 .CB 6 .if \\n(NA-6 .CB 7 .if \\n(NA-7 .CB 8 .if \\n(NA-8 .CB 9 .ft 1 .rm OK OD R1 E1 R2 E2 R3 E3 R4 E4 AB AE .ds K1 \\$1 .ds K2 \\$2 .ds K3 \\$3 .ds K4 \\$4 .ds K5 \\$5 .ds K6 \\$6 .if t .wh 9.8i CG .if n .wh 9i CG .ch FO 16i .if t .sp .4i .if n .sp 2 .ls 1 .pn 2 .WB .rm WB .ls .br .if 9.7i-\\n(nlu-\\n(FPu-1v>0 .sp 9.7i-\\n(nlu-\\n(FPu-1v .if \\n(FP>0 .FA .FG .nr K1 0 .if \\n(GA=1 .nr GA 2 .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .bp 1 .rm CG .if t .po \\n(POu .. . \" CG - write bottom box on cover sheet .de CG .if t .po 0.5i .vs 12p .ch FO 12i .ch FX 12i .if t .ll 7i .br .if t \l'7i' .if t .ta 1.4i 2.8i 4.2i .if n .ta 14 29 44 .if t .sp 8p .if n .sp Pages Text \\*(K1 Other \\*(K2 Total \\*(K3 .if t .sp 8p .if n .sp .if t .po .5i .if t No. Figures \\*(K4 No. Tables \\*(K5 No. Refs. \\*(K6 \b'|||||\ \ ' .if n No. Figures \\*(K4 No. Tables \\*(K5 No. Refs. \\*(K6 .br .if t .po .5i .if t \l'7i' .ps 7 .br .if n .sp .rm K1 .rm K2 .rm K3 .rm K4 .rm K5 .rm K6 .if t .po .5i .if t .tl 'E-1932-U (6-73)'SEE REVERSE SIDE FOR DISTRIBUTION LIST'' .if n .tl 'E-1932-U (6-73) SEE REVERSE SIDE FOR DISTRIBUTION LIST''' .if t .po 0.5i .ll \\n(LLu .ps 10 .ch CG 12i .if \\n(K1>0 .bp .. . \"CB - help with cover sheet .de CB .br .mk .A\\$1 .rt \& \\*(R\\$1 \\*(E\\$1 .br .. .de CZ .br .if !"\\$1"" \\$1 .br .if !"\\$2"" \\$2 .br .if !"\\$3"" \\$3 .br .if !"\\$4"" \\$4 .br .if !"\\$5"" \\$5 .br .if !"\\$6"" \\$6 .br .if !"\\$7"" \\$7 .br .if !"\\$8"" \\$8 .br .if !"\\$9"" \\$9 .. . \"S1 - tm style .de S1 .br .if t .ta 4.25i .if n .ta 43 .ll 80 .ps 36 .br .if t .vs .15i .if t \{ .if \\n(ZZ<1 \t\s36\(FA\s0 .if \\n(ZZ>=1 \t\s36\(FA\s0\} .br .if n .sp 24p \s11\l'7i'\s0 .ps 10 .br .if \\n(IM=1 \f(HBBell Laboratories\fP .ft 1 .nr SJ \\n(.j .na .br .ps 8 .vs 12p .sp 2v .mk .ll .ll 4.0i \fHsubject:\fP .ft 3 .br .rt .if n .in +9 .if t .in +\w'\fHsubject:\fP 'u .ps .nf .hy 0 .WT .hy 14 .ft 1 .fi .in 0 .if !\\(IM .if \\n(MC>0 \\s8Case- \\*(CA\\s10 .if !\\(IM .if \\n(MG>0 --\s8 File- \\*(CC\\s10 .br .rt .if n .ll 70 .if t .ll 6.5i .if t .in 4.25i+6n .if n .in 52 .ps 8 .ti -6n .ta 6n \fHdate:\fP\t\\s\\n(PS\\f3\\*(DY .sp .ft 1 .ps 8 .mk .ti -6n \fHfrom:\fP .ps .br .rt .nf .ft 3 .A1 .if \\n(NA>1 .A2 .if \\n(NA>2 .A3 .if \\n(NA>3 .A4 .if \\n(NA>4 .A5 .if \\n(NA>5 .A6 .if \\n(NA>6 .A7 .if \\n(NA>7 .A8 .if \\n(NA>8 .A9 .ft 1 .sp .mk .ps 8 .ti -6n .ft 1 .if \\n(IM=0 .if \\n(MM .if "\\*(MQ"" \{\ .if \\n(MN=0 .ds MQ TM: .if \\n(MN=1 .ds MQ MF: .if \\n(MN=2 .ds MQ MR: .if \\n(MN=3 .ds MQ EN:\} \\*(MQ .br .ti \\n(.iu .rt .ps .ft 3 .hy 0 .ll 20i .if t .ll 7.75i-\\n(.ou .fi .na .if \\n(MM .CZ \\*(MN .hy 14 .nf .ft 1 .ll \\n(LLu .in .sp |\\n(.hu .if \\n(IM=0 .sp .ad \\n(SJ .ce .ft 2 .if \\n(IM=0 \\*(QF .ft 1 .ce 0 .if \\n(IM=0 .sp .fi .. 9base-6/troff/tmac/complet.11270000644000175000017500000000011511402154555015566 0ustar anselmanselmExecutive Director 112 Directors 112 Department Heads 1127 A. N. Netravali 9base-6/troff/tmac/tmac.sdisp0000644000175000017500000000154011402154555015602 0ustar anselmanselm. \"DS - display. If .DS C, center; L, left-adjust; I, indent. .de DS .KS .nf .\\$1D \\$2 \\$1 .ft 1 .if !\\n(IF \{\ . ps \\n(PS . ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n . ie \\n(VS>=41 .vs \\n(VSu . el .vs \\n(VSp\} .. .de D .ID \\$1 .. .de CD .XD .ce 1000 .. .de ID .XD .if t .in +0.5i .if n .in +8 .if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in \\n(OIu .if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in +\\$1n .. .de LD .XD .. .de XD .nf .nr OI \\n(.i .sp \\n(DVu .. .de BD \" block display: save everything, then center it. .XD .nr BD 1 .nf .in \\n(OIu .di DD .. . \"DE - display end .de DE .ce 0 .if \\n(BD>0 .DF .nr BD 0 .in \\n(OIu .KE .sp \\n(DVu .fi .. .de DF \" finish a block display to be recentered. .di .if \\n(dl>\\n(BD .nr BD \\n(dl .if \\n(BD<\\n(.l .in (\\n(.lu-\\n(BDu)/2u .nr EI \\n(.l-\\n(.i .ta \\n(EIuR .nf .DD .in \\n(OIu .. 9base-6/troff/tmac/mmt0000644000175000017500000011771611402154555014347 0ustar anselmanselm'\" Copyright (c) 1984 AT&T '\" All Rights Reserved '\"#ident "@(#)macros:mmt.src 16.47a" .nr:a 0 1 .nr:b 0 .nr:c 0 .nr:d 0 .nr:e 0 .nr:f 0 .nr:g 0 1 .nr:h 1 .nr:u 0 .nr;p 1 .nr!0 0 .nr!1 0 .nr!2 0 .nr!3 0 .nr!N 0 .nr;F 0 .nr!V 0 .nr!Y 0 .nr!6 0 .nr!8 0 .nr!9 0 .nr!M 0 .so #9/tmac/strings.mm .if\*(]S .ds ]S \s14\f3\*(}Z\fP\s0 .dsBU \s-2\(bu\s0 .dsEM \(em .dsF \v'-.4m'\s-3\\n+(:p\s0\v'.4m' .dsHF 2 2 2 2 2 2 2 .dsLf LIST OF FIGURES .dsLt LIST OF TABLES .dsLx LIST OF EXHIBITS .dsLe LIST OF EQUATIONS .dsRE 16.29 .dsRf \v'-.4m'\s-3[\\n+(:R]\s0\v'.4m' .dsRp REFERENCES .dsTm \v'-0.5m'\s-4TM\s+4\v'0.5m' .nrAu 1 .nrCp 0 .nrCl 2 .nrDs 1v .nrEc 0 1 .nrEq 0 .nrEx 0 1 .nrDe 0 .nrDf 5 .nrFg 0 1 .nrFs 1 .nrH1 0 1 .nrH2 0 1 .nrH3 0 1 .nrH4 0 1 .nrH5 0 1 .nrH6 0 1 .nrH7 0 1 .nrHb 2 .nrHi 1 .nrHs 2 .nrHu 2 .nrHy 0 .nrLe 0 .nrLf 1 .nrLi 5 .nrLs 6 .nrLt 1 .nrLx 1 .nrNp 0 .nrOc 0 .nrOf 0 .nr!4 0 1 .af!4 01 .nrPi 3 .nrPs 1 .nrPt 0 .nrPv 0 .nrRf 0 .nrSi 3 .nrTb 0 1 .deRD 'fl .di}w .rd\\$1 .br .di .ie\w\\$3 \{\ .di}x .ds\\$3 "\\*(}w .br .di 'br\} .if\w\\$2 .rn }w \\$2 .rm}w }x .. .deB .ie\\n(.$ .nr ;G \\n(.f .el.ft 3 .if\\n(.$ .if !\\n(.$-2 \&\f3\\$1\fP\\$2 .if\\n(.$-2 \{.ds }i .if\\n(.f2 .ds }i \^ .ds}I \&\f3\\$1\fP\\$2\\*(}i 'br\} .if\\n(.$-2 .if !\\n(.$-4 \\*(}I\f3\\$3\fP\\$4 .if\\n(.$-4 .if !\\n(.$-6 \\*(}I\f3\\$3\fP\\$4\\*(}i\f3\\$5\fP\\$6 .if\\n(.$ .ft \\n(;G .. .deI .ie\\n(.$ .nr ;G \\n(.f .el.ft 2 .if\\n(.$ .if !\\n(.$-1 \&\f2\\$1 .if\\n(.$-1 \{.ds }i \^ .if\\n(.f2 .ds }i .ds}I \& .if\w\\$1 .ds }I \&\f2\\$1\fP\\*(}i 'br\} .if\\n(.$-1 .if !\\n(.$-3 \\*(}I\\$2\f2\\$3 .if\\n(.$-3 .if !\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5 .if\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5\fP\\*(}i\\$6 .if\\n(.$ .ft \\n(;G .. .deRI .nr;G \\n(.f .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deRB .nr;G \\n(.f .}S 1 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deIR .nr;G \\n(.f .}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deIB .nr;G \\n(.f .}S 2 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deBR .nr;G \\n(.f .}S 3 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deBI .nr;G \\n(.f .}S 3 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .de}S .ds}i .if\\$12 .if !\\$5 .ds }i\^ .ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(}i" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" .el\\$3 .ft\\n(;G .. .deSM .ie\\n(.$-2 \&\\$1\s-1\\$2\s0\\$3 .el\&\s-1\\$1\s0\\$2 .. .deR .ft1 .ul0 .. .deEQ .if\\n%>0 .br .ds]E \\$1 .di>E .. .deEN \!.br .br .di .rm>E .lt\\n(.lu .pc .if\w\\*(10\\*(}E \{\ .ie!\\n(Eq \{\ .ie\\n(:Y>0 \{.if \\n(:Y<\w\\*(10 .nr :Y \w\\*(10 \!\\*(10\h'\\\\n(.lu-\w\\*(10\\*(]Eu-\\\\n(.iu'\\*(]E .br\} .el.ie \\n(:B=2 .tl \(ts\(ts\\*(10\(ts\\*(]E\(ts .el.ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(10\(ts\(ts\\*(]E\(ts .el.if \\n(:B=0 .tl \(ts\\*(10\(ts\(ts\\*(]E\(ts 'br\} .el\{\ .ie\\n(:Y>0 \{.if \\n(:Y<\w\\*(10 .nr :Y \w\\*(10 \!\\\\h'-\\\\n(.iu'\\*(]E\\\\h'\\\\n(.iu-\\w\\*(]Eu'\\*(10 .br\} .el.ie \\n(:B=2 .tl \(ts\\*(]E\(ts\\*(10\(ts\(ts .el.ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(]E\(ts\(ts\\*(10\(ts .el.if \\n(:B=0 .tl \(ts\\*(]E\(ts\(ts\\*(10\(ts 'br\} \} .pc% .lt .rm]E 10 .rr:E .. .deHC .ev0 .hc\\$1 .ev .ev1 .hc\\$1 .ev .ev2 .hc\\$1 .ev .. .deH .if\\n(:F .)D "H:missing FE" .if\\n(:y .)D "H:missing DE" .if!\\n(.$ .)D "H:missing arg" .nr;0 0 .if\\$1-7 .nr ;0 1 .if\w\\$1-\w'0'u .nr ;0 1 .if\\n(;0 .)D "H:bad arg:\\$1" .LC 0 .br .)R .nr;1 0\\$1 .if!0\\$1 .nr ;1 \\n(Hu .if!\\n(;1 .)D "H:bad arg:\\$1" .if2-\\n(;1 .nr H2 0 1 .if3-\\n(;1 .nr H3 0 1 .if4-\\n(;1 .nr H4 0 1 .if5-\\n(;1 .nr H5 0 1 .if6-\\n(;1 .nr H6 0 1 .if7-\\n(;1 .nr H7 0 1 .if2-\\n(;1 \{.if \\n(:S .)w .if\\n(:C .nr :p 0 1 \} .SP .5 .nr:u 0 .if\\n(;1-1 .nr H\\n(;1 +1 .if!\\n(;1-1 \{.nr :u 1 .SP 1 \} .if\\n(;1-1 .if (\\n(Ej+1-\\n(;1)&(\\n(;L\{\ .bp .nr;L 0\} .if\\n(;1-1 .if (\\n(Ej+1-\\n(;1)&(\\n(nl-\\n(:J) \{.if \\n(;C .nr ;C 2 .bp\} .if!\\n(;1-1 \{.if (\\n(Ej+\\n(:S)&(\\n(nl-\\n(:J) \{.if \\n(;C .nr ;C 2 .bp\} .if!\\n(:u-1 .nr H1 +1 .if(\\n(:u=1)&(\\n(:S=1) .nr P 1 \} .nr:u 0 .ds}0 \\n(H1. .if0\\$1-1 .as }0 \\n(H2 .if0\\$1-2 .as }0 .\\n(H3 .if0\\$1-3 .as }0 .\\n(H4 .if0\\$1-4 .as }0 .\\n(H5 .if0\\$1-5 .as }0 .\\n(H6 .if0\\$1-6 .as }0 .\\n(H7 .if\\n(Ht \{.)I \\n(;1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .ds}0 \\*(}3. 'br\} .as}0 \ \ .if!0\\$1 .ds }0 .nr;0 0 .if!\\n(;1-\\n(Hb .nr ;0 1 .if!\\n(;1-\\n(Hs .nr ;0 2 .ds}2 .if!\\n(;0 .if \w\\$2 .ds }2 " .nr;3 2v .HX \\n(;1 0\\$1 "\\$2\\$3" .if\\$1<3 .nr !5 0 1 .af!5 01 .if(\\$1=1)&(\\n(Np=1) .nr !4 0 .di>A \&\\*(}0\\$2\\$3\\*(}2 .br .di .rm>A .if\\n(;0-1 .nr ;3 +.5v .ne\\n(;3u+\\n(dnu+.5p-1v .HY \\n(;1 0\\$1 "\\$2\\$3" .if\\n(;0 .na .)I \\n(;1 \\*(HF .nr;3 1 .nr;3 \\*(}3 .ft\\n(;3 .nr:I \\n(.s .)I \\n(;1 \\*(HP .if((\\*(}3=0):(\w\\*(}3>0))&(\\n(;3=3)&(\\n(;0>0) .ps -1 .if!\\*(}3 .if !\\*(}30 .ps \\*(}3 .nr;2 \w\\*(}0 .if\\n(;0 \{.in+\\n(;2u .ti-\\n(;2u \} .nr;2 \\n(.i .if!\\n(;1-\\n(Hc .if \\n(;0 .ce \\*(}0\&\c .if\\n(;0 \&\\$2\\$3 .if!\\n(;0 \&\\$2\\$3\\*(}2\&\c .ft1 .ps\\n(:Ip .if\\n(;0 'in .if!\\n(;1-\\n(Cl .if \w\\$2 .)E \\$1 "\\$2" .SA .if\\n(;0 .br .if\\n(;0-1 .SP .5 .if\\n(;0*\\n(Hi*\\n(Pt .if !\\n(Hi-1+\\n(Pt-1 .ti+\\n(Pin .if0\\$1*\\n(;0 .if \\n(Hi-1 .ti\\n(;2u .nr:I 1 .nr!D \\n(nl .nr!Z \\n(.k .if(\\$1=1)&(\\nN=5) \{\ .nrFg 0 .nrTb 0 .nrEc 0 .nrEx 0 \} .HZ \\n(;1 0\\$1 "\\$2\\$3" .. .deHM .afH1 \\$1 1 .afH2 \\$2 1 .afH3 \\$3 1 .afH4 \\$4 1 .afH5 \\$5 1 .afH6 \\$6 1 .afH7 \\$7 1 .. .deHU .if!\\n(.$ .)D "HU:missing arg" .H 0 "\\$1" "\\$2" .. .deLB .if4-\\n(.$ .)D "LB:missing arg(s)" .)L 0\\$1n 0\\$2n 0\\$3n "\\$4" "\\$5" "\\$6" "\\$7" .. .de)L .if\\n(:g>5 .)D "LB:too many nested lists" .if\\n(:g .)A .if!\\n+(:g-1 .ds ]b \\n(.i .nr:b \\n(.iu+0\\$1u .nr:c \\n(.iu+0\\$2u .nr:d 0\\$3 .nr:e 0\\$4 .nr:f 0\\$6 .if!\w\\$6 .nr :f 1 .ds]g \\$5 .if!\w\\$5 \{.ds ]g \& .if\\n(:e .ds ]g 1 'br\} .nr:a 0 1 .if0\\$4 .af :a \\$5 1 .if(\\n(:g<=\\n(Ls)&(0\\$7) .SP .5 .fi .in\\n(:bu .ti\\n(:bu .. .deLC .if\\n(:g-0\\$1 .)B .if\\n(:g-0\\$1 .LC 0\\$1 .. .deLE .if(\\n(:I>1)&(\\n(nl-\\n(:J) .nr :I 0 .if\\n(:I<2 .nr :I 0 .ie\\n(:g<1 .)D "LE:mismatched" .el.)B .if(\\n(:g<=\\n(Ls)&(\\n(.$>0) .SP .5 .nr:J \\n(nl .. .deLI .if!\\n(:g .)D "LI:no lists active" .if(\\n(:g<=\\n(Ls)&(\\n(:f>0) .SP .5 .in\\n(:bu .if(\\n(:f)&(\\n(:D<1) .ne1v+.5p .ds}0 \\*(]g .if\\n(:e .ds }0 \\n+(:a. .if\\n(:e-1 .ds }0 \\n(:a) .if\\n(:e-2 .ds }0 (\\n(:a) .if\\n(:e-3 .ds }0 [\\n(:a] .if\\n(:e-4 .ds }0 <\\n(:a> .if\\n(:e-5 .ds }0 {\\n(:a} .if\\n(.$-1 .ds }0 \\$1\ \\*(}0 .if\\n(.$=1 .ds }0 \\$1 .nr;0 \w\\*(}0 .nr;1 \\n(:c .if\\n(:d .nr ;1 \\n(:bu-\\n(:du-\\n(;0u .if!\\n(;1 .nr ;1 0 .nr;0 \\n(:bu-\\n(;1u-\\n(;0u .ti\\n(;1u .if!\\n(;0 .nr ;0 \w u .if\w\\*(}0 \&\\*(}0\h\\n(;0u\&\c .. .deAL .nr!D 0 .if!\\n(.$-1 .)L \\n(Lin 0 2n 1 "\\$1" .if\\n(.$-1 .if !\\n(.$-2 .LB 0\\$2 0 2 1 "\\$1" .if\\n(.$-2 .if !\w\\$2 .)L \\n(Lin 0 2n 1 "\\$1" 0 1 .if\\n(.$-2 .if \w\\$2 .LB 0\\$2 0 2 1 "\\$1" 0 1 .. .deBL .if\\n(.$<1 .)L \\n(Pin 0 1n 0 \\*(BU .if\\n(.$=1 .LB 0\\$1 0 1 0 \\*(BU .if\\n(.$>1 \{.ie !\w\\$1 .)L \\n(Pin 0 1n 0 \\*(BU 0 1 .el.LB 0\\$1 0 1 0 \\*(BU 0 1 \} .. .deDL .if\\n(.$<1 .)L \\n(Pin 0 1n 0 \(em .if\\n(.$=1 .LB 0\\$1 0 1 0 \(em .if\\n(.$>1 \{.ie !\w\\$1 .)L \\n(Pin 0 1n 0 \(em 0 1 .el.LB 0\\$1 0 1 0 \(em 0 1 \} .. .deML .if\\n(.$<1 .)D "ML:missing arg" .nr;0 \w\\$1u/3u/\\n(.su+1u .ie\\n(.$<2 .LB \\n(;0 0 1 0 "\\$1" .el.if \\n(.$<3 .LB 0\\$2 0 1 0 "\\$1" .if\\n(.$>2 \{.ie !\w\\$2 .LB \\n(;0 0 1 0 "\\$1" 0 1 .el.LB 0\\$2 0 1 0 "\\$1" 0 1 \} .. .deRL .if\\n(.$<1 .LB 6 0 2 4 .if\\n(.$=1 .LB 0\\$1 0 2 4 .if\\n(.$>1 \{.ie !\w\\$1 .LB 6 0 2 4 1 0 1 .el.LB 0\\$1 0 2 4 1 0 1 \} .. .deVL .if\\n(.$<1 .)D "VL:missing arg" .ie\\n(.$<3 .LB 0\\$1 0\\$2 0 0 .el.LB 0\\$1 0\\$2 0 0 \& 0 1 .. .deP .if!(((\\n(!D=\\n(nl):(\\n(!D=(\\n(nl-.5v)))&(\\n(!Z=\\n(.k)&(\\n(Np=0)) \{\ .br .nr;1 \\n(:J .nr;2 \\n(nl .SP \\n(Psu*.5 .if!\\n(:D .ne 1v+.5p .ie!\\n(;1-\\n(:J .nr ;2 \\n(;2-\\n(:J .el.nr ;2 \\n(nl-\\n(:J .nr:J \\n(;2 .if\\n(.$>0&(0\\$1) .ti+\\n(Pin .if\\n(.$=0 \{\ .if\\n(Pt=1 .ti+\\n(Pin .if\\n(Pt>1&(\\n(:I) .ti+\\n(Pin .if\\n(Pt>1&(\\n(:I=0)&(\\n(:J>0) .ti+\\n(Pin \} .if\\n(Np \{\ \\n(H1.\\n+(!4\ \ \c 'br\} .nr:I 1 \} .nr:u 0 .. .denP .P 0 .de)p 'ti6n .de)p 'ti0 .rm)p .wh\\n(.du+\\n(.L+\\n(.L \\\\.. .ch)p \\n(.du+\\n(.L+\\n(.L \\.. .wh\\n(.du+\\n(.L )p \\n(H2.\\n+(!5\h'|6n'\\c .. .deS .if!\\n(:Q .nr :Q \\nS .if!\\n(.$ .nr ;0 \\n(:Q .if\\n(.$ .if !\w\\$1 \{\ .nr;J 2 .nr;0 \\n(:P \} .if\w\\$1 \{\ .ie\\$1D \{\ .nr;J 1 .nr;0 \\nS \} .el\{\ .ie\\$1C \{\ .nr;J 2 .nr;0 \\n(:P \} .el\{\ .ie\\$1P \{\ .nr;J 3 .nr;0 \\n(:Q \} .el\{.if !\\n(;J \{\ .nr;0 \\n(:P .nr;0 \\$1 \}\}\}\}\} .if0\\$1-99 .nr ;0 \\nS .if!\\n(;0 .)D "S:bad arg \\$1" .nr:Q \\n(:P .nr:P \\n(;0 .ps\\n(:Pp .nr;J 0 .if!\\n(!Q .nr !Q \\nS+2 .if!\\n(.$-1 \{\ .ie\\n(.$ \{\ .nr;K 1 .nr;7 \\n(.s+2 \} .el\{\ .nr;K 3 .nr;7 \\n(!Q \}\} .if\\n(.$-1 .if !\w\\$2 \{\ .nr;K 2 .nr;7 \\n(!P \} .if\w\\$2 \{\ .ie\\$2D \{\ .nr;K 1 .nr;7 \\n(.s+2 \} .el\{\ .ie\\$2C \{\ .nr;K 2 .nr;7 \\n(!P \} .el\{\ .ie\\$2P \{\ .nr;K 3 .nr;7 \\n(!Q \} .el\{.if !\\n(;K \{\ .nr;7 \\n(!P .nr;7 \\$2 \}\}\}\}\} .if0\\$2-99 .nr ;7 \\n(.s+2 .if!\\n(;7 .)D "S:bad arg \\$2" .nr!Q \\n(!P .nr!P \\n(;7 .vs\\n(!Pp .nr;K 0 .. .rnpn ]N .depn .nr:Z 1 .]N \\$1 .. .deSA .if\\n(.$ \{.if \\$1-1 .)D "SA:bad arg:\\$1" .nr:h 0\\$1 \} 'na .if\\n(:h 'ad .. .deSK .br .nr;d 1 .bp .nr;9 0\\$1-1 .if\\n(;9+1 .rs .if\\n(;9+1 .SK \\n(;9 .rr;9 .nr;d 0 .. .deOP .SK .if!\\nP%2 .SK 1 .. .deSP .br .ie\\n(:D .)S \\$1 .el.ie !'\\n(.z'' .)S \\$1 .el\{.rr ;D ;E .nr;4 1v .if\\n(.$ .nr ;4 \\$1v .if!(\\n(nl=\\n(:N) .nr :A 0 .nr;4 -\\n(:Au .if\\n(;4 \{.sp\\n(;4u .nr:A +\\n(;4u \} .nr:N \\n(nl \} .. .de)S .br .if!'\\n(.z'\\*(}D' .rr ;D ;E .nr;4 1v .if\\n(.$ .nr ;4 \\$1v .if!(\\n(.d=\\n(;D) .nr ;E 0 .nr;4 -\\n(;Eu .if\\n(;4 \{.sp\\n(;4u .nr;E +\\n(;4u \} .nr;D \\n(.d .ds}D \\n(.z .. .deTS .if(\\n(:D=0)&(\\n(Ds>0) .SP .if\\$1H \{.br 'ne5v .wh\\n(nlu+\\n(.tu-2v #f .di>t .nr;A 1 \} .. .deTH .if\\n(.du>0.5v \{.nr T. 0 .T# 0 \} .br .di .nr;I \\n(.i .nr;B 1 .if\\n(;T .if !\\$1N .nr ;T 0 .in0 .mk#a .mk#b .mk#c .mk#d .mk#e .mk#f .if\\n(;T=0 \{\ .>t .nr;T 1 \} .in\\n(;Iu .mk#T .. .deTE .if(\\n(:D=0)&(\\n(Ds>0) .SP .if(\\n(;A>0)&(\\n(;B=0) \{.br .di .)D "TE: used TS H but no TH" \} .rr;A ;B ;h ;D ;E .rmT# .rr#a .rma+ b+ c+ d+ e+ f+ g+ h+ i+ j+ k+ l+ n+ m+ .rr32 33 34 35 36 37 38 40 79 80 81 82 .rra| b| c| d| e| f| g| h| i| j| k| l| m| .rra- b- c- d- e- f- g- h- i- j- k- l- m- .. .de)A .af:a 1 .ds]a \\n(:a \\*(]a .ds]b \\n(:b \\*(]b .ds]c \\n(:c \\*(]c .ds]d \\n(:d \\*(]d .ds]e \\n(:e \\*(]e .ds]f \\n(:f \\*(]f .ds]h \\*(]g \\*(]h .. .de)B .br .nr:g -1 .)C nr :a ]a \\*(]a .)C nr :b ]b \\*(]b 'in\\n(:bu 'ti\\n(:bu .)C nr :c ]c \\*(]c .)C nr :d ]d \\*(]d .)C nr :e ]e \\*(]e .)C nr :f ]f \\*(]f .)C ds ]g ]h \\*(]h .af:a 1 .if\\n(:e .af :a \\*(]g .. .de)C .\\$1 \\$2 \\$4 .ds\\$3 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de)D 'di 'di .nr:D 0 .fl ******************** .br ERROR:(\\n(.F)input line \\n(.c:\\$1 .br ******************** .tm******************** .tmERROR:(\\n(.F)input line \\n(.c:\\$1 .tm******************** .if!\\nD .ab \& .. .deTB .nr!1 1 .ie\\nN=5 .)F TABLE 1 \\n+(Tb "\\$1" "\\n(H1-" 0 .el.)F TABLE 1 \\n+(Tb "\\$1" "\\$2" 0\\$3 .. .deEC .nr!2 1 .ie\\nN=5 .)F Equation 2 \\n+(Ec "\\$1" "\\n(H1-" 0 .el.)F Equation 2 \\n+(Ec "\\$1" "\\$2" 0\\$3 .. .deEX .nr!3 1 .ie\\nN=5 .)F Exhibit 3 \\n+(Ex "\\$1" "\\n(H1-" 0 .el.)F Exhibit 3 \\n+(Ex "\\$1" "\\$2" 0\\$3 .. .deFG .nr!0 1 .ie\\nN=5 .)F Figure 0 \\n+(Fg "\\$1" "\\n(H1-" 0 .el.)F Figure 0 \\n+(Fg "\\$1" "\\$2" 0\\$3 .. .de)F .nr;0 \w\\$5 .nr;1 0 .nr;1 0\\$6 .ds}0 \\$3 .if\\n(;0 .ds }0 \\$5\\$3 .if\\n(;1*\\n(;0 .ds }0 \\$3\\$5 .if\\n(;1-1*\\n(;0 .ds }0 \\$5 .ds}0 \\$1\ \\*(}0 .ie(\w\\$4)&(\\n(Of=0) .as }0 .\ \ .el.if \\n(Of .as }0 " -\ .nr;0 \w\\*(}0 .ll\\nWu .nr;1 \\n(.lu-\\n(;0u-\w\\$4u+1u .if(\\n(:B<2)&(\\n(;1>0) \{\ .in0 .ce\} .if!\\n(;1 \{\ .if!\\n(.u .nr ;U 1 .if\\n(:B=2 .ce 0 .fi .in\\n(;0u .ti-\\n(;0u \} \f3\\*(}0\fP\\$4 .ll .in .if\\n(:B=2 .ce 9999 .if\\n(;U \{\ .nf .nr;U 0 \} .if(\\n(Lf=1&(\\$2=0)):(\\n(Lt=1&(\\$2=1)):\ (\\n(Le=1&(\\$2=2)):(\\n(Lx=1&(\\$2=3)) \{\ .ds}3 .if\\n(:S .ds }3 \\n(H1 .ie\\n(:y=1 \{\ .ie\\n(:B=3 \{\ \!\\!.am >L \!\\!.if \\$2=\\\\\\\\\\\\\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\\\\\\\nP \\*(}3 \!\\!\\\\.. 'br\} .el\{\ \!.am >L \!.if \\$2=\\\\\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\\\nP \\*(}3 \!\\\\.. 'br\} \} .el\{\ .am>L .if\\$2=\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\nP \\*(}3 \\.. \} \} .. .de)I .nr;9 0\\$1+1 .ds}3 \\$\\n(;9 .rr;9 .. .de)E .ds}3 .if\\n(:S .ds }3 \\n(H1 .am>C .)T \\n(;1 \\$1 "\\*(}0" "\\$2" \\nP \\*(}3 \\.. .. .de)T .nr;0 \w\\$5 .if\w\\$6 .nr ;0 +\w'-'u+\w\\$6u .if\\n(;0-\\n(:a .nr :a \\n(;0 .)I \\$1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .if\w\\$3-\\*(}3 .nr H\\$1 \w\\$3 .. .de)U .if!0\\$1-\\n(:b .sp\\n(:cu*.5v .)I \\$1 \\*(}0 .nr;0 \\*(}3 .)I \\$1 \\*(Ci .nr;1 \\*(}3 .)I \\$1 \\*(}2 .nr;2 \\*(}3 .ds}3 \\$5 .if\\n(.$-5 .ds }3 \\$6\(hy\\$5 .nr:e \\n(:au-\w\\*(}3u+2n .ds}3 \h\\n(:eu\\*(}3 .ds}y .nr;0 -\w\\$3 .if\\n(;0 .as }y \h\\n(;0u .if2-0\\$1 .as }y "\\$3 .if0\\$1-1 .ds }y "\\$3\\*(}y .if!0\\$2 .ds }y .ll\\nWu-\\n(:au-3n .in\\n(;2u .if!0\\$2 .in\\n(;1u .ti\\n(;1u .fi .di>A \!.cs 3 48 .if!0\\$1-\\n(:d .if !\\n(:f \\*(}y\\$4\\\\f3\\a\\\\fP\\*(}3 .if!0\\$1-\\n(:d .if \\n(:f \\*(}y\\$4\\t\\*(}3 .if0\\$1-\\n(:d \\*(}y\\$4\\*(}3 .br \!.br \!.cs 3 .di .br .ll\\nWu .ne\\n(dnu+.5p-1v .ta\\nWu-\\n(:au-2n .nf .in0 .na .>A .. .de)Z .in0 .ie!\\n(Cp \{\ .SK .rs .sp3v .ce1 \} .el.sp 2v \\$1 .sp1v .nr:a 0 .nrH1 0 .afH1 1 .>L \\$2 .rn)T )V .rn)U )T .ds}0 \\n(H1 .dsCi 0 .ds}2 \\n(H1 .>L \\$2 .rn)T )U .rn)V )T .. .deTC .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .)w .if\\n(;R .RP 0 1 .)R .rm)E )F DE DF DS FD FE FG FS H HU TB .if!\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b .if!\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 .rm}t }e }o .rs .if\\n(;C .nr ;C 2 .bp .ie\\n(Oc .nr P 1 .el\{\ .rm}f }p .nr;g 1 1 .af;g i .ds}b ''- \\\\n(;g -'' .am)b .nr;g +1 \\.. 'br\} .nrN 0 .rs .if!\\n(.$-4 .TX .if\\n(;C .ll \\n(:Lu .if!\\n(.$-4 .TY .ce99 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .if\\n(.$-4 .sp .ce0 .sp .if\\n(;C .ll \\n(:lu .nr;m \\n(.hu+2v .nr:b 1 .if\w\\$1 .nr :b 0\\$1 .nr:c 1 .if\w\\$2 .nr :c 0\\$2 .nr:d 2 .if\w\\$3 .nr :d 0\\$3 .nr:f 0 .if\w\\$4 .nr :f 0\\$4 .nrH1 0 .afH1 1 .nrH2 0 .afH2 1 .nrH3 0 .afH3 1 .nrH4 0 .afH4 1 .nrH5 0 .afH5 1 .nrH6 0 .afH6 1 .nrH7 0 .afH7 1 .nr:a 0 .>C .rn)T )V .rn)U )T .ds}0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .nrH2 +\\n(H1 .nrH3 +\\n(H2 .nrH4 +\\n(H3 .nrH5 +\\n(H4 .nrH6 +\\n(H5 .nrH7 +\\n(H6 .if!\w'\\*(Ci' .ds Ci 0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 .ds}2 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .>C .rm>C HX .rn)T )U .rn)V )T .if(\\n(Lf=1)&(\\n(!0>0) .)Z "\\*(Lf" 0 .if(\\n(Lt=1)&(\\n(!1>0) .)Z "\\*(Lt" 1 .if(\\n(Lx=1)&(\\n(!3>0) .)Z "\\*(Lx" 3 .if(\\n(Le=1)&(\\n(!2>0) .)Z "\\*(Le" 2 .)R .. .deTY .ce CONTENTS .. .deTL .nr:D 2 .nr;c 2 .nr;z 0 .nr:V 0 .nr:1 \\n(.i .if\\nC=4 .ls 1 .if\\nC=5 .ls 1 .ds>1 \\$1 .ds>2 \\$2 'nr;y 1 .eo 'de>T AU .. .deAU .ec .nr:D 1 .nr;c 1 .if!\\n(;y 'nf .if\\n(;y .>9 .rmTL .ll\\nWu .da>z 'if\\nE 'ft 3 .if(\\n(;z>0)&(\\n(Au>0) .sp \\$1 .if\\n(Au>0 \{.if \w\\$3 .ie \\$3HP HP\ \&\c .el\\$3\ \&\c .if\w\\$4 \\$4 .if\w\\$3 .if !\w\\$4 \& .if\w\\$6 \\$6\ \&\c .if\w\\$5 x\\$5 .if\w\\$6 .if !\w\\$5 \& 'br\} .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .br 'if\\nE 'ft1 .di .nr;z +\\n(dn .nrdn 0 'in\\n(:1u .if!\\n(:V .ds }v \\$3-\\$4-\\$2 .if\\n(:V .as }v /\\$2 .da>v 'if\\nE 'ft 3 .sp3 \\$1 .br 'if\\nE 'ft1 .di .nr:V +\\n(dnu .nrdn 0 .nr:H 0 .ds}L \\$3 .if'\\$3'AL' .ds }L }B .if'\\$3'ALC' .ds }L }B .if'\\$3'CP' .ds }L PY .if'\\$3'FJ' .ds }L HO .if'\\$3'HK' .ds }L HL .if'\\$3'HOH' .ds }L HO .if'\\$3'HOH' .nr :H 1 .if'\\$3'HP' .ds }L }A .if'\\$3'HR' .ds }L RR .if'\\$3'INH' .ds }L }I .if'\\$3'IW' .ds }L IH .if'\\$3'IX' .ds }L IH .if'\\$3'LC' .ds }L WV .if'\\$3'LZ' .ds }L }K .if'\\$3'MO' .ds }L }M .if'\\$3'MT' .ds }L RR .if'\\$3'PK' .ds }L }P .if'\\$3'RD' .ds }L }E .if'\\$3'RR' .ds }L PY .if'\\$3'SF' .ds }L CP .if'\\$3'SZ' .ds }L }F .if'\\$3'WI' .ds }L }W .am>4 .ps+1 .ft2 \\$1 .br .ps .ft1 .if\\\\n(:2 .sp .5v .if\\\\n(:2 \\*(}Z .if\\\\n(:2 .if \\n(:H \\\\*(}H .if\\\\n(:2 \\\\*(\\*(}L .if\\\\n(:2 .sp .5v .ds}z \\\\*(\\*(}L \\.. .. .de>9 .di}z 'll\\nWu-34n 'nh 'na 'fi 'if\\nE 'ft 3 .>T .if(\w'\\*(>1')&(\w'\\*(>2') \{\ .ie'\\*(>1'\\*(>2' \{\ .br Work Project No. and Filing Case \\*(>1 .br\} .el\{\ .br Work Project No. \\*(>1 .br File Case \\*(>2 .br\} \} .if(\w'\\*(>1'=0):(\w'\\*(>2'=0) \{\ .ie\w'\\*(>1' \{\ - Work\ Project\ No.\ \\*(>1 .br\} .el.ie \w'\\*(>2' \{\ - Case\ \\*(>2 .br\} .el.br \} .ll\\nWu .di .if\\nE .ft1 .nr:9 \\n(dn .nrdn 0 .nr;y 0 'nf .rm>9 .. .deAT .da>v 'if\\nE 'ft 3 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .br 'if\\nE 'ft .di .nr:V +\\n(dnu .nrdn 0 .. .deOK .nr:D 1 .nr;c 1 .de>7 .ps-1 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .ps \\.. .rmOK .. .deTM .nr:D 1 .nr;c 1 .de>8 .if\\nE .ft 3 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .if\\nE .ft1 \\.. .nr;x \\n(.$+1 .rmTM .. .deAS .nr:D 3 .nr;c 3 .rmTL .nr:t 0\\$1 .if\\n(:t=1 .nr ;s \\n(:s .nr:3 0 .if\\n(.$-1 .nr :3 0\\$2n .nr;N \\n(:1 'in\\n(:1u 'fi .SA 'nh 'if\\n(Hy 'hy 14 .di>3 .ll0u-2u*\\n(:3u+\\nWu .ce .ul .ie'\\$3'ER' ERRATA .el.ie '\\$3'AD' ADDENDUM .elABSTRACT .SP 1.5 .ns .nr:I 1 .rmAS .. .deAE .br .di 'nf 'nh .nr;3 \\n(dn .nr;6 \\n(;3 .ll\\nWu 'in\\n(:1u .if\\n(:t=1 .nr :s \\n(;s .rmAE .. .deMT .if\\n(!N=1 .NE .nr:D 0 .nr;c 0 .if!\\n(;y 'nf .rmTL TM OK AS AE AF AU .ll\\nWu .rnTP >Y .in\\n(:1u .rn>Y TP .rn)K >Y .ie\w\\$1u<2n .if !0\\$1=4 .if \\n(.$=2 .ds ]n \\$2 .el.if \\n(.$=2 .ds ]n \\$2 .if!\\n(.$ .>6 .if\\n(.$ .if \w\\$1u-\w'0'u .>6 "\\$1" .if\\n(.$ .nr ;y 0\\$1 .if\\n(.$ .if !\\n(;y .>6 "" .if\\n(.$ .if \\n(;y-4 .>x .if\\n(.$ .if \\n(;y-3 .>5 "\\$2" .if\\n(.$ .if \\n(;y-2 .>6 "ADMINISTRATIVE MEMORANDUM" .if\\n(.$ .if \\n(;y-1 .>6 "INTERNAL MEMORANDUM" .if\\n(.$ .if \\n(;y .>6 "TECHNICAL MEMORANDUM" .)R .ft1 .ft1 .ta.5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i .ns .if\\nC=4 .ls 2 .if\\nC=5 .ls 2 .>Y .]N \\nP+1 .rm>Y MT .. .de>x .rm>6 >5 )Y )X .ta\\nWu-1.4i .br .rs .sp1 .if\\n(Pv \{\ .ce PRIVATE\h'-\w'PRIVATE'u'\l'\w'PRIVATE'u' .sp\} .sp|4v .}z .br .rs .mk:2 .sp|12v .in\\nWu-1.4i .ti+6 .ie\\nE \{\ \f3\\*(DT\fP 'br\} .el\{\ \\*(DT 'br\} .if\\n(:2u-\\n(nlu .sp |\\n(:2u .sp2v .rm>x .. .de>6 .rm>5 >x )Y .di]t .ta\\nWu-1.75i .br .rs .sp1 .if\\n(Pv \{\ .ce PRIVATE\h'-\w'PRIVATE'u'\l'\w'PRIVATE'u' .sp\} .sp|1.25i .ie!(\\nA=3) \t\\*(]S .el.if \w\\*(}Z \t\s16\f3\\*(}Z\fP\s0 .vs12p .sp|1.9i .mk:2 \!.po -\w'\s8subject:\s0'u+1n \s8subject:\s0 .rt-1 \!.po .}z .br .rt\\n(:2u .in\\nWu-1.4i .ps8 .ti-6n date: .ps .rt-1 .ie\\nE \{\ \f3\\*(DT\fP 'br\} .el\{\ \\*(DT 'br\} .sp .ps8 .ti-6n from: .ps .rt-1 .if\\nE .ft 3 .>z .if\\nE .ft .in\\n(:1u .if\\n(;x \{.sp .in\\nWu-1.4i .>8 .in\\n(:1u \} .br .if\\n(:9u-\\n(;zu-2v-\\n(;xv .sp \\n(:9u-\\n(;zu-2v-\\n(;xv .sp3 .di .rs .ie\\n(;3 \{\ .ie\\n(:t=2 \{\ .af!S \\gP .afP i .]t .in+\\n(:3u .>3 .sp3 .)N .in-\\n(:3u .wh0 )k .bp .nrP 1 .afP \\g(!S .]t .wh0 )h .if\\n(:G \{\ .nr:s +1 .da>y .>d \!. br .di 'nrdn +4v+.5p 'nr:o +\\n(dnu .nrdn 0 'if!\\n(.pu-\\n(nlu-.5p-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5p 'if!\\n(:ou-\\n(:mu 'nr :o \\n(:mu 'ch)f -\\n(:ou 'br\} .tmWARNING: Approved ITDS Document Cover Sheet not available with this package. .rmCS \} .el.ie \\n(:t=1 .]t .el\{\ .]t .in+\\n(:3u .>3 .sp3 .in-\\n(:3u \} \} .el.]t .ns .ne10 .ce .ul .if!\\n(.$ TECHNICAL MEMORANDUM .if\\n(.$ .if \w\\$1 \\$1 .SP 3 .ce0 .ul0 .if!\\n(:t=2 .)X .nr;M 1 .rm)X >6 .. .de>5 .rm>6 >x )X .br .rs .sp1 .ie\\n(Pv \{\ .ce PRIVATE\h'-\w'PRIVATE'u'\l'\w'PRIVATE'u' .sp4\} .el'sp 5 .in0 .ds}A "South Plainfield, New Jersey 07080 .ds}B "Allentown, Pennsylvania 18103 .ds}E "Reading, Pennsylvania 19604 .ds}F "Springfield, New Jersey 07081 .ds}H "Crawford Hill Laboratory .ds}I "Indianapolis, Indiana 46250 .ds}K "Lincroft, New Jersey 07738 .ds}M "Morristown, New Jersey 07960 .ds}P "Parsippany, New Jersey 07054 .ds}W "Ward Hill, Massachusetts 01830 .dsAK "Norcross, Georgia 30071 .dsCB "Columbus, Ohio 43213 .dsCH "Chester, New Jersey 07930 .dsCP "Summit, New Jersey 07901 .dsDR "Denver, Colorado 80234 .dsHL "Short Hills, New Jersey 07078 .dsHO "Holmdel, New Jersey 07733 .dsIH "Naperville, Illinois 60566 .dsIN "Indianapolis, Indiana 46206 .dsMH "Murray Hill, New Jersey 07974 .dsMV "North Andover, Massachusetts 01845 .dsPY "Piscataway, New Jersey 08854 .dsRR "Middletown, New Jersey 07748 .dsWB "West Long Branch, New Jersey 07764 .dsWH "Whippany, New Jersey 07981 .dsWV "Warren, New Jersey 07060 .ll\\nWu .fi .na .nh .di>6 .ps+2 .vs\\n(.sp+4p .if\\nE .ft3 .nr;X 1 .>T .nr;X 0 .ps .vs\\n(.sp+2p .if\\nE .ft1 .br .di .nf .ce1000 .>6 .nr:2 0 .if\w\\$1 .nr :2 1 .ul0 .sp.5v .>4 .br .if!\\n(:2 .sp.5v .if!\\n(:2 \\*(}Z .if!\\n(:2 .if \\n(:H \\*(}H .if!\\n(:2 \\*(}z .ce0 .sp .if\\n(;3 .if !\\n(:t .in +\\n(:3u .if\\n(;3 .if !\\n(:t .>3 .if\\n(;3 .if !\\n(:t .in -\\n(:3u .if\\n(;3 .if !\\n(:t .sp .ns .br .)Y .rm)Y >6 PY MH WH HO RR }H WB }A }B }E HL }I .rmAK CP CH CB DR IN IH MV WV SG )N )M .rm}P }M }W }F }K .deNS .br .di .di>Y \\.. .deNE .br .di \\.. .rm>5 .. .de)K .ie(\\n(;F=5)&(\\n(:D) .)D "check WA, WE, IA, IE, LT sequence" .el.if \\n(:D .ie !\\n(:t=2 .)D "check TL, AU, AS, AE, MT sequence" .el.)D "check TL, AU, AS, AE, NS, NE, MT sequence" .rm)X )Y >T >x >z >1 >2 >3 >4 >5 >6 >7 >8 >9 }z .rr;x ;y ;z :D :1 :2 :3 :9 ;0 ;1 ;2 ;3 .rmTL AU TM AF AS AE OK .rm)K .. .de)X .di>S \!.tm WARNING: Approved ITDS Document Cover Sheet not available with this package. .di .. .de)Y .di>S \!.bp \!.in 0 \!.ce 1000 \!.ul 1000 .>6 \!.ul 0 \!.sp .5v .>4 \!.br \!.if \\n(:2=0 .sp.5v \!.if \\n(:2=0 \\*(}Z \!.if \\n(:2=0 .if \\n(:H \\*(}H \!.if \\n(:2=0 \\*(}z \!.ce 0 \!.sp \!.in 0 \!.in +\\n(:3u .>3 \!.in -\\n(:3u \!.nr ;0 1 .di .di>b .nf .na .>c .br .di .rm>b .if\\n(dn \{\ .nr;c \\n(.pu-\\n(dnu-8v .da>S \!.ie \\n(;cu-\\\\n(nlu .sp \\n(;cu-\\\\n(nlu \!.el .sp .5v .nr;c 0 \l'60p' .>c .di .br\} .. .deCS .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .)w .if\\n(;R .RP 0 1 .if!\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b .if!\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 .rm}t }e }o .rm}b }f }p .br .)R .ll\\nWu .in0 .nr!O \\nO .nr!W \\nW .br .rs .nf .>S .nrO \\n(!O .nrW \\n(!W .po\\nOu .ll\\nWu .lt\\nWu .)R .ta.5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i .nr;0 0 .nr;1 0 .nr;2 0 .rm>S .. .deFC .)w .nf .ls1 .in(\\n(.lu/2u) .rs .ne\\n(:Vu+3v+.5p .rmLT .ie\\n(;F \{\ .sp2 .ie\\n(;F<3 \{\ .ie\\n(.$ \\$1 .elYours very truly, \} .el.if \\n(;F=3 \{\ .in0 .ie\\n(.$ \\$1 .elYours very truly, \} \} .el\{\ .sp .ie\\n(.$ \\$1 .elYours very truly, \} .in .fi .. .deSG .if\\n(:F .)D "SG:missing FE" .if\\n(:y .)D "SG:missing DE" .LC 0 .)w .)R .in0 .nf .ls1 .ne5v+.5p .rs .ie\\n(;F \{\ .ie\\n(;F<4 \{\ .sp3 .if\\n(;F<3 .in (\\n(.lu/2u) \\*(}8 .if\w\\*(}9 \\*(}9 \} .el\{\ .sp2 .br .traAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ .ie\w\\*(}9 \\*(}8, \\*(}9 .el\\*(}8 .traabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz\} .in0 .sp \\$1\} .el\{\ .if!\\n(:V .)D "SG:no authors" .if\w\\$1 .as }v -\\$1 .if\\n(.$>1 \{\ .sp3 \\*(}v .sp-4 \} .in(\\n(.lu/2u) .>v .in .if\\n(.$=1 \{\ .sp-1 \\*(}v 'br\} .rm>v .fi\} .. .deNS .if\\n(!N=1 .di .if\\n(;M .br .)R .nr:D 1 .ds}4 "Copy to .nr;0 0\\$1 .if\w\\$1u-\w'\0\0'u .nr ;0 50 .if\\n(;0 .ds }4 "Copy (with att.) to .if\\n(;0-1 .ds }4 "Copy (without att.) to .if\\n(;0-2 .ds }4 "Att. .if\\n(;0-3 .ds }4 "Atts. .if\\n(;0-4 .ds }4 "Enc. .if\\n(;0-5 .ds }4 "Encs. .if\\n(;0-6 .ds }4 "U.S.C. .if\\n(;0-7 .ds }4 "Letter to .if\\n(;0-8 .ds }4 "Memorandum to .if\\n(;0-9 .ds }4 "Copy (with atts.) to .if\\n(;0-10 .ds }4 "Copy (without atts.) to .if\\n(;0-11 .ds }4 "Abstract only to .if\\n(;0-12 .ds }4 "Complete memorandum to .if\\n(;0-13 .ds }4 "Copy (\\$1) to .if\\n(.$-1 .ds }4 \&\\$1 'in\\n(;N .if!\\n(!N .ds }5 \\*(}4 .if\\n(!N .da }C .if!\\n(!N .di }C .if\\n(!N .if !\\n(;F .sp \!.ds }4 \\*(}4 \\*(}4 .nf .nr!N 1 .. .de)N .br .rr!N .di]v .}C .br .di .rm]v .nr;0 \\n(dn .if\\n(;0 .)M .. .de)M .nf .if!\\n(;F .sp .ne2v .if\\n(.tu<=2v \{\ \&\\*(}5 .ie!\\n(;C See next page .elSee next column 'br\} .nr!U \\n(;0>=\\n(.tu .if\\n(!U \{\ .ie!\\n(;C .ds ]w Continued next page .el.ds ]w Continued next column .ds]x \\\\*(}4\ \-\ contd. .ch)f -(\\n(:ou+1v) \} .}C .if\\n(!U \{\ .rm]w ]x .ch)f -\\n(:ou \} .rm}C .. .deNE .br .if\\n(!N=1 .di .nr:D 0 .nr!N 2 .if\\n(;M .)N .)R .. .deAV .ne6v .in0 .nf .if\\n(.$<2 \{\ .sp APPROVED: 'br\} .sp2 \l'3i'\h'.3i\l'1.5i' \\$1\h'|4i-(\w'Da'u)'Date .in .fi .. .deND .if!\\n(.$ .)D "ND:missing arg" .dsDT "\\$1 .. .deAF .ds}Z "\\$1 .if\w\\n(}Z .nr A 3 ' .. .de)h 'ev0 'nh 'if\\n(Hy 'hy 14 'ev 'ev2 .nr;8 1 .)k .rr;8 .)R .nrP +1 .if\\n(:Z \{.nr P \\n% .rr:Z \} .if\\n(:u*\\n(:S .nr P 1 .if\\n(:u=1 \{.nr H1 +1 .nr:u 2 \} 'sp\\n(!X .TP .br .)R 'ev .nr:I 2 .nr:J \\n(nl 'ns 'if\\n(:q .)l 'nr:q 0 .mk;r .mk;m .nr!B 0 .if\\n(;d=0&\\n(:z>0 \{\ 'ie\\n(Df>3 \{')z ')s \} 'el'if \\n(Df>1 ')z \} .nr:I 3 .nr!C \\n(.h .PX 'ns .if!((\\n(!C=\\n(.h)&(\\n(!B=0)) .mk ;m .nr;T 0 .if\\n(;A>0 \{.nr ;h \\n(.i .in0 .>t .nr;T 1 .in\\n(;hu \} .mk#T .nr:J \\n(nl .if!\\*(]x \\*(]x .. .de)f .if!\\*(]w \\*(]w .nr!D 0 .nr:N 0 'nrdn 0 'nr;y \\n(.pu-\\n(nlu-\\n(:mu 'if\\n(:s \{'ie \\n(;y-4v .)o 'el.)m \} 'nr:s 0 'nr:o \\n(:mu .ie\\n(;C=0 \{\ .if\\n(;e \&\c 'bp\} .el.ie \\n(;C=2 .)2 .el.)1 .rr;f .ie\\*(]w 'ch )f -\\n(:ou .el'ch )f -(\\n(:ou+1v) .. .dePH .ds}t "\\$1 .. .deEH .ds}e "\\$1 .. .deOH .ds}o "\\$1 .. .dePF .ds}b "\\$1 .. .deEF .ds}f "\\$1 .. .deOF .ds}p "\\$1 .. .deTP 'sp .)K .af;P \\gP .afP 1 .nr;P \\nP .afP \\g(;P .af;P 1 .ie\\n(Pv \{\ .ie(\\n(Pv=1)&(\\n(;P>1) 'sp 2 .el\{\ .ce PRIVATE\h'-\w'PRIVATE'u'\l'\w'PRIVATE'u' .sp\} \} .el'sp 2 .if!\\n(;P-1 .if \\nN 'sp .if!\\n(;P-1 .if \\n(:S .tl \\*(}t .if!\\n(;P-1 .if !\\nN .tl \\*(}t .if\\n(;P-1 .ie \w'\\*(]n' .tl '\\*(]n - \\nP''' .el.tl \\*(}t 'if!\\n(;P%2 'tl \\*(}e 'if\\n(;P%2 'tl \\*(}o 'sp2 .. .dePM .ie\\$1 . nr ;t 0 .el.ie \\$1PM6 . nr ;t 6 .el.ie \\$1ILL . nr ;t 5 .el.ie \\$1PM5 . nr ;t 5 .el.ie \\$1RS . nr ;t 4 .el.ie \\$1PM4 . nr ;t 4 .el.ie \\$1CP . nr ;t 3 .el.ie \\$1PM3 . nr ;t 3 .el.ie \\$1RG . nr ;t 2 .el.ie \\$1PM2 . nr ;t 2 .el.nr ;t 1 .ie\\n(;t=0 \{\ .(B .(E 2 0 .(B .(E 3 0 \} .el.ie \\n(;t=6 \{\ .(B \!. tl \\*(]m \!. tl \\*(]o \!. tl \\*(]p \!. tl \\*(]q .(E 2 4v \} .el.ie \\n(;t=5 \{\ .(B \!. tl \\*(]i \!. tl \\*(]j \!. tl \\*(]k \!. tl \\*(]l .(E 3 4v \} .el.ie \\n(;t=4 \{\ .(B \!. tl \\*(]U \!. tl \\*(]V \!. tl \\*(]W \!. tl \\*(]X .(E 3 4v \} .el.ie \\n(;t=3 \{\ .(B \!. tl \\*(]I \!. tl \\*(]J \!. tl \\*(]K \!. tl \\*(]L .(E 3 4v \} .el.ie \\n(;t=2 \{\ .(B \!. tl \\*(]A \!. tl \\*(]F \!. tl \\*(]G \!. tl \\*(]H .(E 3 4v \} .el\{\ .(B \!. tl \\*(]M \!. tl \\*(]O \!. tl \\*(]Q \!. tl \\*(]R .(E 3 4v \} .. .de)b 'ev2 .nf .?1 .?2 .?3 .?4 .?5 .br .)R .af;P \\gP .afP 1 .nr;P \\nP .afP \\g(;P .af;P 1 .ie!\\n(;P%2 .tl \\*(}f .el.tl \\*(}p .ie\\n(;P=1 \{\ .ie\\nN=1 .tl \\*(}t .el.tl \\*(}b \} .el.tl \\*(}b .if\\nC .tl \\*(]C .)R 'ev .. .de)2 .po\\nOu .nr;C 1 'bp .. .de)1 .rt\\n(;mu .po+\\n(;ou .nr;C 2 .nr:I 2 .nr:J \\n(nl 'ns 'if\\n(:q .)l 'nr:q 0 'if\\n(;d=0&\\n(:z>0 \{\ 'ie\\n(Df>3 \{')z ')s \} 'el'if \\n(Df>1 ')z \} .nr:I 3 .nr;T 0 .if\\n(;A>0 \{.nr ;h \\n(.i .in0 .>t .nr;T 1 .in\\n(;hu \} .mk#T .nr:J \\n(nl .if\\n(;C&\\n(;a=1&\\n(!K=1 'wh \\n(!Eu+1v )a .. .de2C .if\\n(;C=0 \{\ .br .)R .nr;C 1 .if!\\n(.$ .nr ;l \\n(.lu*8u/17u .if!\\n(.$ .nr ;o \\n(.lu*9u/17u .if\\n(.$ .nr ;l \\$1u*1.3n .if\\n(.$ .nr ;o \\nWu-\\n(;lu .ev1 .ll\\n(;lu .lt\\n(;lu .ev .ll\\n(;lu .lt\\n(;lu .nr:L \\nW .nrW \\n(.lu .SP .ns .mk;m \} .. .de1C .if\\n(;C \{\ .br .if\\n(;C>1 .sp |\\n(.hu .po\\nOu .rr;C .)R .nrW \\n(:Lu .rr:L .ev1 .ll\\nWu .lt\\nWu .ev .ll\\nWu .lt\\nWu .SP .5 .ns\} .. .de)a 'sp\\n(:0u 'sp1 .ch)a .nr!E 0 .rr!E !K .. .deWC .if\\n(.$ \{\ .ie\\$1N \{.nr ;a 0 .nr;b 0 .nr;j 0 .nr;p 1 \} .el.ie \\$1WD .nr ;a 1 .el.ie \\$1WF .nr ;b 1 .el.ie \\$1FF .nr ;j 1 .el.ie \\$1FB .nr ;p 1 .el.ie \\$1-WD .nr ;a 0 .el.ie \\$1-WF .nr ;b 0 .el.ie \\$1-FF .nr ;j 0 .el.ie \\$1-FB .nr ;p 0 .el')D "WC: unknown option" .if\\n(.$ .WC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 'br\} .. .de>W .if\\n(;C \{\ .ev1 .ll\\n(:Lu .lt\\n(:Lu .ev .nrW \\n(:Lu .nr;W 1 \} .. .de>N .if(\\n(;l>0)&(\\n(;C=0) \{\ .ev1 .ll\\n(;lu .lt\\n(;lu .ev .nrW \\n(;lu .nr;W 2 \} .. .de>R .ie\\n(;W=1 .nr W \\n(;lu .el.if \\n(;W=2 .nr W \\n(:Lu .if\\n(;W \{\ .ev1 .ll\\nWu .lt\\nWu .ev .nr;W 0 \} .. .de)Q .ch)Q 200v .rs 'sp70 .. .deBS .(B .. .deBE .(E 4 .. .deVM .ie0\\$1>=0 .nr !X 0\\$1 .el.nr !X 0 .if0\\$2>=0 \{\ .(B .rs .sp0\\$2v .(E 5 0\\$2 \} .. .de(B .ev1 .)R .di>K .. .de(E .br .di .)R .ev .ie(\\n(dn=0)&(0\\$2=0) \{\ .nr?\\$1 0 .rm>K ?\\$1 'br\} .el\{\ .ie0\\$2>0 .nr ?\\$1 0\\$2 .el.nr ?\\$1 \\n(dn \} .nr?0 \\n(:Uu .nr:U \\n(?1+\\n(?2+\\n(?3+\\n(?4+\\n(?5+1v .if(\\n(:Uu+\\n(:Mu)>(\\n(.pu-\\n(nlu-.5v) .SK .rn>K ?\\$1 .nr:o +(\\n(:Uu-\\n(?0u) .ch)n -\\n(:ou .ch)f -\\n(:ou .nr:m \\n(:Mu+\\n(:Uu .ch)b -(\\n(:mu-2v) .. .deFS 'nr:s +1 .if\\n(:F .)D "FS:missing FE" .if\\n(:F .FE .if\\n(:y .)D "FS:missing DE" .if\\n(:y .DE .nr:F 1 .if!\\n(!F \{\ .ie\\n(;C .nr !F 2 .el.nr !F 1 \} .ie(\\n(;C>0)&((\\n(;b=1):((\\n(;j=1)&(\\n(!F=1))) \{\ .nr!F 1 .>W \} .el.if ((\\n(;C=0)&(\\n(;j=1)&(\\n(!F=2)) .>N 'ev1 'di>b .nr:D 1 .)R 'nh 'if\\n(:i 'hy 14 'ad 'if\\n(:j 'na 'ps-2 'vs\\n(.sp+1p 'sp\\n(Fsu*3p 'if\\n(.$ 'ds }y \\$1\ 'if!\\n(.$ 'ds }y \\*(]y.\ 'if\\n(:k \\*(}y\&\c 'if!\\n(:k 'nr ;v \w\0\0.\  'if!\\n(:k 'nr ;u \w\\*(}y 'if!\\n(:k 'in +\\n(;vu 'if!\\n(:k 'if !\\n(:l 'ti -\\n(;vu 'if!\\n(:k 'if !\\n(:l 'if !\\n(;u-\\n(;v \\*(}y\h\\n(;vu-\\n(;uu\&\c 'if!\\n(:k 'if !\\n(:l 'if \\n(;u-\\n(;v \\*(}y\&\c 'if!\\n(:k 'if \\n(:l 'if \\n(;v-\\n(;u 'ti -\\n(;uu 'if!\\n(:k 'if \\n(:l 'if !\\n(;v-\\n(;u 'ti -\\n(;vu 'if!\\n(:k 'if \\n(:l \\*(}y\&\c .. .deFE .if!\\n(:F .)D "FE:no FS active" .br 'di .nr:D 0 .if\\n(;c .nr :D \\n(;c 'in0 'nf 'na .if!\\n% \{\ 'da>c .>b \!. br 'di .if!(\\n(:D=3) \{\ .nr:G 1 .da>d .>b \!. br .di 'br\} 'br\} .if!((\\n%=0)*(\\n(:D=3)*(\\n(:t=1):(\\n(;X)) \{\ 'da>y .>b \!. br 'di 'br\} 'rm>b .)R 'ev .nr:F 0 .>R .if!((\\n%=0)*(\\n(:D=3)*(\\n(:t=1):(\\n(;X)) \{\ .if!((\\n(!A=1):((\\n(;C=2)&(\\n(!F=1))) \{\ 'if!\\n(:s-1 'nr dn +4v+.5p 'nr:o +\\n(dnu .nrdn 0 'if!\\n(.pu-\\n(nlu-.5p-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5p 'if!\\n(:ou-\\n(:mu 'nr :o \\n(:mu 'ch)f -\\n(:ou 'br\}\} .. .de)o .ie(\\n(!F=1)&(\\n(;C=1) \{\ .nr!A 1 \} .el.nr !A 0 'ev1 .)R 'ps-2 'vs\\n(.sp+1p 'nf 'nr;5 \\n(.pu-\\n(:ou+.5p .if!\\n(!H 'if \\n(;5u>\\n(nlu 'sp |\\n(;5u+.5p 'nr;5 \\n(.pu-\\n(nlu-1v-\\n(:mu .ie\\n(;5u>0 \{\ 'sp .ti0 .ie\\n(:n=0 \{.ie \n(.A=0 \l'72p' .el__________ \} .el\{.ie \n(.A=0 \l\\n(.lu .el_____________________________ \} 'nr:n 0 .br .if\\n(!A .wh (\\n(nlu-2v) )Q 'br\} .el'sp 15i .rr;5 'nr;Z 1 'nrdn 0 'ps 'vs\\n(.sp+2p .>y .br 'di .if\\n(dn=1v .nr dn 0 .nr:n \\n(dn 'nr;Z 0 .if!\\n(;C=1 \{\ .rr!A .if\\n(dn=0 .rr !F \} 'rm>y 'nr:q \\n(dnu 'nrdn 0 'nr:s 0 .)R 'ev .. .de)n 'if\\n(;Z \{ 'di>x 'sp\\n(Fs \} .. .de)m 'ev1 .)R 'ps-2 'vs\\n(.sp+1p .nf 'di>w .>y .br 'di 'rm>y 'nr:q \\n(dn 'nrdn 0 'nr:s 0 .if!\\(;C=1 .rr !A .)R 'ps 'vs\\n(.sp+2p 'ev .. .de)l 'nr:s 1 'di 'ev1 'di>b .)R 'ps-2 'vs\\n(.sp+1p 'nh 'nf .>x .>w .nr:F 1 .FE 'rm>x 'rm>w .. .deFD 'nr:i 0 'nr:j 0 'nr:k 0 'nr:l 0 'nr;z 0 'if\\n(.$ 'nr ;z \\$1 'if\\n(;z-11 'nr ;z 0 'if\\n(;z-7 'nr :l 1 'if\\n(;z-7 'nr ;z -8 'if\\n(;z-3 'nr :k 1 'if\\n(;z-3 'nr ;z -4 'if\\n(;z-1 'nr :j 1 'if\\n(;z-1 'nr ;z -2 'if\\n(;z 'nr :i 1 'if\\n(.$-1 .nr :C 1 .. .deDS .nr:t 0 .nr!K 1 .)J "\\$1" "\\$2" "\\$3" .. .deDF .nr:t 1 .nr!K 0 .)J "\\$1" "\\$2" "\\$3" .. .de)J .nr;i \\n(.i .nr;q \\n(.u 'di .if\\n(:D>1 \{.ie \\n(:t=0 .)D "DS:illegal inside TL or AS" .el.)D "DF:illegal inside TL or AS" \} .if\\n(:F \{.ie \\n(:t=0 .)D "DS:missing FE" .el.)D "DF:missing FE" .FE \} .if\\n(:y \{.ie \\n(:t=0 .)D "DS:missing DE" .el.)D "DF:missing DE" .DE \} .nr:y 1 .if(\\n(;C>0)&(\\n(;a=1) .>W .if(\\n(;C=2&\\n(;a=1)&\\n(!K 'bp .ev1 .)R 'di>0 .nr:D 1 .nr;z 0+0\\$1 .if\\$1L .nr ;z 0 .if\\$1I .nr ;z 1 .if\\$1C .nr ;z 2 .if\\$1CB .nr ;z 3 .if\\n(;z>3 .nr ;z 3 .nr:B \\n(;z .if\\n(:t=0 .if \\n(;z<2 .ll -\\n(;iu .if\\n(;z=1 .in +\\n(Sin .if\\n(;z=2 \{.ce 9999 .nr:t +2 \} .if\\n(:B=3 \{.nr :Y 1 .nr:t +2 .nr:X \\n(.i .di>X \} .nr;z 0+0\\$2 .if\\$2N .nr ;z 0 .if\\$2F .nr ;z 1 .nf .if\\n(;z .fi .ll-0\\$3 .. .de)z .nr;w \\n(:x+1%26+1 .if!((\\n(;C=2)&(\\n(!\\n(;w=1)) \{\ .nr;d 1 .ev1 .SP .5 .)R 'nf 'rs .nr:x \\n(:x+1%26 .?\\n(;w .if\\n(!\\n(;w=1 .nr !B 1 .rm?\\n(;w .rr?\\n(;w !\\n(;w .)R .if\\n(De \{\ .if\\n(;e \&\c .bp .nr!B 0 \} .ie\\n(:I>1 \{\ .if\\n(nl>\\n(:J .nr :I 0 \} .el.nr :I 0 .SP .5 .nr:J \\n(nl .ev 'nr:z -1 .nr;d 0 .ne2 \} .. .de)y 'if\\n(:z \{\ 'nr;w \\n(:x+1%26+1 'nr;z \\n(?\\n(;w .ie(\\nC=4):(\\nC=5) .nr ;Q 2 .el.nr ;Q 1 .if(\\n(:I=2):(\\n(;z+\\n(;pv+\\n(;Qv<\\n(.t):\ ((\\n(;z>(\\n(.p-\\n(;r-\\n(:m))&(\\n(nl<(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\ 'ie\\n(:I<2 .if \\n(;p .br 'el.if \\n(:Ju<\\n(nlu .if \\n(;p .br ')z \}\} .. .de)x 'nr:v \\n(:z ')y 'if\\n(:v=\\n(:z \{\ 'nr;d 1 \&\c 'SP \\n(.tu+1v 'nr;d 0 ')z \} .. .de)w 'if\\n(:z \{\ ')x ')w \} .. .de)u 'if\\n+(:z>25 ')D "DF: too many displays" 'nr:w \\n(:w+1%26 'nr;w \\n(:w+1 'rn>0 ?\\n(;w .nr!\\n(;w 1 .if(\\n(;C>0)&(\\n(;a=0) .nr !\\n(;w 2 .nr?\\n(;w \\n(:0 'if!((\\n(;C>0)&(\\n(!\\n(;w=1)) 'if (\\n(:z=1)&((\\n(Df%2=1):(\\n(Df>5)) ')y .. .de)s 'nr:v \\n(:z 'nr;Y \\n(:I 'nr:I 3 ')y 'ie\\n(:v>\\n(:z ')s 'el'nr :I \\n(;Y .. .de)t .br .nr!L \\n(.L .ls1 .)r .ti\\n(.iu .nf .if\\n(:t>1 .in -\\n(;iu .rs .nr;d 1 .>0 .)R .nr;d 0 .ie\\n(:I>1 \{\ .if\\n(nl>\\n(:J .nr :I 0 \} .el.nr :I 0 .ls\\n(!L .in\\n(;iu .if!\\n(;q .nf .if\\n(Ds .SP .5 .nr:J \\n(nl .. .de)r .if\\n(Ds .SP .5 .if(\\n(:0>=\\n(.t)&((\\n(:0<(\\n(.p-\\n(;r-\\n(:m)):\ (\\n(nl>(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\ .if\\n(;e \&\c .ne\\n(.tu+1v .if\\n(:I<2 .)r \} .. .deDE .if!\\n(:y .)D "DE:no DS or DF active" .nr!E \\n(nl .if\\n(:B=3 \{.br .di .if\\n(dl>\\n(:Y .nr :Y \\n(dl .if\\n(:Y<\\n(.l .in (\\n(.lu-\\n(:Yu)/2u .nf .>X .fi .rm>X .in\\n(:Xu .rr:X \} .ce0 .br 'di .rr:D ;D ;E :B .)R .ll\\nWu .ev 'nr:0 \\n(dn 'nrdn 0 .nr;x \\n(:t .if\\n(:t-1 .nr ;x -2 .>R .if!\\n(;x .)t .if\\n(;x .)u .nr:y 0 .nr:Y 0 .nr;L 1 .. .de)R 'fi 'na .if\\n(:h 'ad 'nh 'if\\n(Hy 'hy 14 'in0 'ti0 'ps\\n(:Pp 'vs\\n(!Pp .. .deRS .if\\n(;R=2 .)D "RS:missing RF" .nr;R 2 .nrRf +1 .if\\n(.$ .ds \\$1 \v'-.4m'\s-3[\\n(:R]\s0\v'.4m' .ie\\n(;C .ev 1 .el.ev 2 .)R 'in\w\0\0.\ u 'ti-\w\\*(]r.\ u .nr:D 1 .da>r \!.ne 2 \\*(]r.\ \&\c .. .deRF .if!(\\n(;R=2) .)D "RF: no RS active" .nr;R 1 .br \!.if \\\\n(Ls .sp .5 .di 'in .nr:D 0 .ev .. .deRP .if\\n(;R=2 .)D "RP: missing RF" .if\\n(;R \{\ .nr;R 0 .if!(0\\$1) .nr :R 0 1 .)R .ie(0\\$2=2):(0\\$2=3) \{\ .if\\n(;e \&\c 'ne8 .sp1 \} .el\{\ .ie\\n(;e .SK .el\{\ \&\c .bp 'br\} \} .ce1 .ul \\*(Rp .if\w\\*(Rp \{ .am>C .)T 1 0 "" "\\*(Rp" \\nP \\.. 'br\} .nf .>r .br .rm>r .)R .if(0\\$2=0):(0\\$2=2) .SK 'br\} .. .de)q .br .nr;e 1 .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .nr;x 0 .if\\n(;R .RP 0 1 \&\c .if(\\n(;C>0)&(\\n(:z>0) 'bp .)w \& 'nr:0 \\n(.pu-\\n(nlu-\\n(:ou 'if\\n(:s 'if (\\n(:0<=0):((\\n(;C=2)&(\\n(!F=1)) 'nr ;x 1 'if\\n(:q 'nr ;x 1 'if\\n(;x \&\c 'if\\n(;x 'bp .di]B .>y .di .nr!H \\n(dn .if\\n(!H\{\ .nr!J \\n(.pu-\\n(dnu-\\n(:mu-4v .ie\\n(!J>\\n(nlu .ch )f \\n(!Ju .el'bp \} .wh-.5p )k .nr;e 0 .. .deWA .nr:D 2 .rm2C AF AS AE AT AU AV CS OK TC TL TM MT .nr;F 5 .)W WA .ds}8 \\$1 .ds}9 \\$2 .di]s .nf .. .deWE .)W WE .br .di .nr!R \\n(dn .. .deIA .nr:D 1 .)W IA .ds}6 \\$1 .ds}7 \\$2 .di]u .nf .. .deIE .)W IE .br .di .. .deLO .rm2C AF AS AE AT AU AV CS OK TC TL TM MT .ie\\$1 .)D "Required argument missing" .el.ie \\$1SA \{\ .nr!V 1 .ie\w\\$2 .ds }a \\$2 .el.ds }a To Whom It May Concern:\} .el.ie \\$1AT \{\ .ds}j ATTENTION: \\$2 .nr!Y 1 \} .el.ie \\$1RN \{\ .ds}k In reference to: \\$2 .nr!6 1 \} .el.ie \\$1CN \{\ .nr!9 1 .ie\w\\$2 .ds }l \\$2 .el.ds }l CONFIDENTIAL \} .el.ie \\$1SJ \{\ .ds}m \\$2 .nr!M 1 \} .el.)D "LO argument not recognized" .. .deLT .nr:D 0 .)W LT .rnTP >Y .br .rn>Y TP .ie\\$1 .(1 .el. ie \\$1BL . (1 .el.ie \\$1SB . (2 .el.ie \\$1FB . (3 .el.ie \\$1SP . (4 .el.)D "LT argument not recognized." .nr;M 1 .. .de(1 .nr;F 1 .rm(2 (3 (4 .nf .in(\\n(.lu/2u) .rs .sp11 .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp .in0 \\*(}l \} .if\\n(!6 \{\ .sp .in(\\n(.lu/2u) \\*(}k \} .ie(\\n(!9:\\n(!6) .sp 2 .el.sp 4 .in0 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp SUBJECT: \\*(}m \} .rmWA WE IA IE LO .fi .. .de(2 .nr;F 2 .rm(1 (3 (4 .rs .sp11 .nf .in(\\n(.lu/2u) .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .in0 .sp \\*(}l \} .if\\n(!6 \{\ .sp .in(\\n(.lu/2u) \\*(}k \} .ie(\\n(!9:\\n(!6) .sp 2 .el.sp 4 .in0 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp .ti5 SUBJECT: \\*(}m \} .rmWA WE IA IE LO .nrPt 1 .fi .. .de(3 .nr;F 3 .rm(2 (1 (4 .rs .sp11 .nf .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp \\*(}l \} .if\\n(!6 \{\ .sp \\*(}k \} .ie(\\n!9:\\n!6) .sp 2 .el.sp 4 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp SUBJECT: \\*(}m \} .rmWA WE IA IE LO .fi .. .de(4 .nr;F 4 .rm(2 (3 (1 .rs .sp11 .br .nf .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp \\*(}l \} .if\\n(!6 \{\ .sp \\*(}k \} .ie(\\n!9:\\n!6) .sp 2 .el.sp 4 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j\} .if\\n(!M \{\ .sp2 .br .traAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ \\*(}m .br .traabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz .sp\} .rmWA WE IA IE LO .fi .. .de)W .ie\\$1WA .nr !8 1 .el.ie \\$1WE \{\ .ie\\n(!8=1 .nr !8 2 .el.)D "WA macro missing"\} .el.ie \\$1IA \{\ .ie\\n(!8=2 .nr !8 3 .el.)D "WA or WE macro missing"\} .el.ie \\$1IE \{\ .ie\\n(!8=3 .nr !8 4 .el.)D "WA, WE, or IA macro missing"\} .el.if \\$1LT \{\ .ie\\n(!8=4 .nr !8 0 .el.)D "WA, WE, or IE macro missing"\} .. .de)k .if "\\*(.T"aps"\{\ . po0 . lt7.5i . ps10 . vs10p . ft1 . tl'--''--' . ft . vs . po . ps . lt\} .. .nr:r .6i .nr:m .8i 'nr:i 0 'nr:j 0 'nr:k 0 'nr:l 0 .nr:n 0 .nr:p 0 1 .nr:o 0 .nr:z 0 1 .nr:y 0 .nr:x 0 .af;w a .nr:w 0 .nr:F 0 .nr:R 0 1 .ds]r \\n(:R .ds]y \\n(:p 'wh0 )h .nr:o \n(:mu 'wh-\n(:mu )f 'ch)f 15i 'wh-\n(:mu )n 'ch)f -\n(:mu 'wh-\n(:ru )b .nr:M \n(:mu .if\*(]ZMM DEFINED \{\ .tmERROR: MM package read twice .ab \} .ds]Z MM DEFINED .if!\w'\gE' .nr E 1 .if!\nL .nr L 11i .pl\nLu .if!\w'\gO' .nr O 1.3i .po\nOu .if\nP .nr P -1 .nrP \nP 1 .if!\nS .nr S 10 .if!\nW .nr W 6i .if\n(mo-0 .ds DT January .if\n(mo-1 .ds DT February .if\n(mo-2 .ds DT March .if\n(mo-3 .ds DT April .if\n(mo-4 .ds DT May .if\n(mo-5 .ds DT June .if\n(mo-6 .ds DT July .if\n(mo-7 .ds DT August .if\n(mo-8 .ds DT September .if\n(mo-9 .ds DT October .if\n(mo-10 .ds DT November .if\n(mo-11 .ds DT December .asDT " \n(dy, 20\n(yr .S D D 'ev0 .)R .ll\nWu .lt\nWu 'ev 'ev1 .)R .ll\nWu .lt\nWu 'ev 'ev2 .)R .ll\nWu .lt\nWu 'ev .PH "''- \\\\nP -'' .if\nC=3 \{.ds ]C D\ R\ A\ F\ T .PF "''\\\\*(DT'' \} .if\nC=4 \{.ds ]C D\ R\ A\ F\ T .PF "''\\\\*(DT'' .ls2 .nrPt 1 .nrPi 10 \} .if\nC=5 .ls 2 .if\nC=2 .ds ]C ''DATE FILE COPY'' .if\nC=1 .ds ]C ''OFFICIAL FILE COPY'' .if(\nN=3):(\nN=5) \{.nr :S 1 .PF "''\\\\n(H1-\\\\nP''" .PH \} .if\nN=4 \{.PH .nrN 0 \} .if\nD .PH "'\\*(RE line # \\\\n(.c'- \\\\nP -'' .if\nA=1 .AF 'em)q .ds` \\k:\h-\\n(.wu*8u/10u\h\\n(.fu/2u*2u+1u-\\n(.fu*.2m\(ga\h|\\n:u .ds' \\k:\h-\\n(.wu*8u/10u\h\\n(.fu/2u*2u+1u-\\n(.fu*.2m+.07m\(aa\h|\\n:u .ds^ \\k:\h-\\n(.wu*8u/10u\h\\n(.fu/2u*2u+1u-\\n(.fu*.15m-.07m\ \h\\n(.fu-1u/2u*.02m^\h|\\n:u .ds~ \\k:\h-\\n(.wu*8u/10u\h\\n(.fu/2u*2u+1u-\\n(.fu*.2m-.07m\ \h\\n(.fu-1u/2u*.05m~\h|\\n:u .ds, \\k:\h-\\n(.wu*85u/100u\v.07m,\v-.07m\h|\\n:u .ds: \\k:\h-\\n(.wu*85u/100u\h\\n(.fu/2u*2u+1u-\\n(.fu*3u*.06m\ \h3u-\\n(.fu/2u*.05m-.1m\ \v-.6m\z.\h\\n(.fu-1u/2u*.05m+.2m.\v.6m\h|\\n:u .ds; \\k:\h-\\n(.wu*75u/100u\h\\n(.fu/2u*2u+1u-\\n(.fu*3u*.09m\ \h3u-\\n(.fu/2u*.06m-.15m\h\\n(.fu-1u/2u*.04m\ \v-.85m\z.\h.3m.\v.85m\h|\\n:u .if!\*(.Taps .rm )k 9base-6/troff/tmac/tmac.twb0000644000175000017500000000352611402154555015262 0ustar anselmanselm.de CO \" Set type color; no value => reset .ie '\\$1'' .ds oC \\*(pC .el \{\ .ds pC \\*(oC .ds oC \\$1 \\$2 \\$3 \\$4 ...\} \\X'color \\*(oC'\c .. .de BC \" Set background color; no value => reset .ie '\\$1'' .ds oB \\*(pB .el \{\ .ds pB \\*(oB .ds oB \\$1 \\$2 \\$3 \\$4 ...\} \\X'bgcolor \\*(oB'\c .. .de CL \\X'clear'\c .. .de IN \" Include picture $1 with ul corner at ($2,$3) .nr xc \\$2i .nr yc \\$3i \\X'picfile \\$1 \\n(xc \\n(yc'\c .. .de CW \" clear window ($1,$2) is ul ($3,$4) is lr, uses bg color .nr x0 \\$1i .nr y0 \\$2i .nr x1 \\$3i .nr x2 \\$4i \\X'clrwin \\n(x0 \\n(y0 \\n(x1 \\n(y1 .. .de BW \" window border ($1,$2) is ul ($3,$4) is lr, uses fg color .nr x0 \\$1i .nr y0 \\$2i .nr x1 \\$3i .nr x2 \\$4i \\X'border \\n(x0 \\n(y0 \\n(x1 \\n(y1 .. .de SL \" start slide, args are optional title .bp .ce 0 .ft B .nf .if !'\\$1'' \{\ .ps 36p .vs 36p \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ...\} .ps 30p .vs 30p .. .de PS \" Start pic picture . \" $1 is height, $2 is width, both in inches .sp .3 .in (\\n(.lu-\\$2)/2u .ne \\$1 .. .de PE \" End pic picture .in .sp .6 .. .de IS \" Start ideal picture . \" $1 is width, $2 is height, both in inches . \" in ideal, however, we see two IS's for each picture, . \" and only the second one has the goods .nr ID 0 .ie !'\\$1'' \{\ .sp .3 .nr ID 1 .in (\\n(.lu-\\$1)/2u .ne \\$2 ...\} .. .de IE \" End ideal picture .if \\n(ID .in .if \\n(ID .if t .sp .6 .. .ds oC 255 255 255 255 \" type color .ds oB 0 0 0 0 \" background color .pl 4.8i \" page length .po .1i \" left margin .ll 6.2i \" line length .ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i .nf .ps 30p .vs 30p .fp 1 R Lucida .fp 2 I LucidaI .fp 3 B LucidaB .fp 4 BI LucidaBI .fp 5 S LucidaS .fp 6 SB LucidaSB .fp 7 SI LucidaSI .fp 8 SK LucidaSBI .fp 9 CW LucidaCW .ft B 9base-6/troff/tmac/tmac.spe0000644000175000017500000000440511402154555015252 0ustar anselmanselm..... July 1, 1991 .so #9/tmac/tmac.pm . .ig .nr VN 1 \" VN -- volume .nr NU 1 \" NU -- number .nr P< 1 \" P< -- starting page number .nr P> 1 \" P> -- ending page number . \" month of issue, date received, date revised .ds MO February .ds DY December 31, 1990 .ds DR January 1, 1991 .TL "RUNNING TITLE" "RUNNING AUTHOR NAMES" Title .AU AUTHOR AND AUTHOR .AI Institution .AU AND .AU THIRD AUTHOR .AI HER INSTITUTION .AB .LP abstract .AE .OK "Word Phrase or word Another word" .SH LEVEL ONE HEADING .PP xxx .SH 2 Level 2 heading .PP zzz .Rf .IP 1. J. Author... .. . .nr LL 34P .ll \n(LLu .lt \n(LLu .nr LT \n(LLu .nr FO 49P+1i-1P \" FO -- bottom of last line of text .nr HM .6i \" HM -- header margin .nr PD 1u .nr PI .15i . .de TL \" TL -- title .ps 7 SOFTWARE\(emPRACTICE AND EXPERIENCE, VOL. \\n(VN(\\n(NU), \\n(P<-\\n(P> (\\*(MO 20\\n(yr) .sp 6P-2v .ps 18 .vs 21p .ce 100 . \" $1 is title running head, $2 is author running head .ds %o .tl '\s11\\\\n(%#\s0'\s8\\$1\s0'' .ds %e .tl ''\s8\\$2\s0'\s11\\\\n(%#\s0' .nr OL 0 \" undo pm .ev 2 .lt \\n(LLu .ev .. .de AU \" AU -- JOE AUTHOR AND MARY AUTHOR .ie \\n(AU=0 .sp 3.25P-.5v .el .SP .nr AU +1 .ps 8 .vs 12p .ft R .. . \" use .AU JOE // AND // .AU MARY if separate institutions. .de AI \" AI -- author institution .ps 9 .vs 10p .ft I .. .de MH \" MH -- us Bell Labs, Murray Hill, New Jersey 07974, U.S.A. .. .de AB \" AB -- abstract/summary .sp 3P-0V .nr PS 9 .nr VS 10 .ft B SUMMARY .SP .4P .ce 0 .nr AB 1 .. .de AE \" AE -- end of abstract .nr AB 0 .nr PS 11 .nr VS 12 .XX \" do the goo on the bottom of page 1 .. .de OK \" OK -- other keywords .ft 1 .sp .5P \s6KEY WORDS\s0 \s8\\$1\s0 .fl .. .de XX .KF bottom .SP 1.5P .lt \\n(LLu .nr x \\n(P>-\\n(P<+1 .af P< 0000 .if \\n(BT=0 .tl "0038-0644/\\n(yr/\\n(NU\\n(P<-\\nx$05.00""\f2Received \\*(DY\f1" .if \\n(BT=0 .tl '\(CO 20\\n(yr by John Wiley & Sons, Ltd.''\f2Revised \\*(DR\fP' .KE .. .am SH \" SH -- unnumbered sub-heading .sp 2.5P-2V .if \\n(.$=0 .ce 100 .if \\$1=1 .ce 100 .if \\n(.$=0 .ft 1 .if \\$1=1 .ft 1 .if \\$1=2 .ft B .if \\$1>2 .ft I .nr SH 1 .. .am PP \" PP -- fix up to add space, no indent. doesn't work .if \\n(SH .SP .5 .if \\n(SH .in 0 .nr SH 0 .. . \" Rf - start references .de Rf .SH \s9REFERENCES\s0 .nr PS 9 .nr VS 10 .LP .nr PI .15i .. . .nr PS 11 .nr VS 12 9base-6/troff/tmac/tmac.psychrefs0000644000175000017500000000114011402154555016462 0ustar anselmanselm.de [1 .in 3n .ti 0 \\*([A\c .ie \\n([A=0 \&. \& .el \& \& \\*([T. \f2\\*([J,\f1 \\*([D, .if !"\\*([N"" .if !"\\*([V"" \\f3\\*([V\\f1 (\\*([N), .if "\\*([N"" .if !"\\*([V"" \\f3\\*([V\\f1, \\*([P. .. .de [2 .in 3n .ti 0 \\*([A\c .ie \\n([A=0 \&. \& .el \& \& \\f2\\*([T.\\f1 \\*([C: \\*([I, \\*([D. .. .de [3 .in 3n .ti 0 \\*([A\c .ie \\n([A=0 \&. \& .el \& \& \\*([T. In \\*([E (Ed.), \\f2\\*([B\\f1. \\*([C: \\*([I, \\*([D. .. .de [5 .in 3n .ti 0 \\*([A\c .ie \\n([A=0 \&. \& .el \& \& \\*([T, \\*([M. .. .de [4 .in 3n .ti 0 \\*([A\c .ie \\n([A=0 \&. \& .el \& \& \\*([T. Report \\*([R, \\*([I, \\*([D. .. 9base-6/troff/tmac/tmac.an0000644000175000017500000002105211402154555015056 0ustar anselmanselm.fp 1 R LuxiSans .fp 2 I LuxiSans-Oblique .fp 3 B LuxiSans-Bold .fp 4 BI LuxiSans-BoldOblique .fp 5 L LuxiMono .ds 9 /home/anselm/plan9port .if n .uf 4 .if n .bd 3 .if n .rm bd '''\" PWB Manual Entry Macros - 1.36 of 11/11/80 '''\" Nroff/Troff Version @(#)1.36 '''\" Option -rs1 short (9") pages '''\" Option -rp# set no. of first page, put no. of pgs. on stderr '''\" Option -rd1 give modified date instead of printed date ... temporary fixes for neat manual printing... .de th .tm wrong version of man entry macros - use -man6 .ab  .. .if n .ds Tm \uTM\d .if t .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m' .de }E .}f .in \\n()Ru+\\n(INu .ll \\n(LLu .lt \\n(LLu .pl \\n()Lu .. .de DT .if t .ta 3.6m 7.2m 10.8m 14.4m 18m 21.6m 25.2m 28.8m 32.4m 36m 39.6m 43.2m 46.8m .if n .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n .. .de HY .hy 14 .. .de }f .if t .vs \\n()Vp .ps \\n()S .ft 1 .. .de }H .ev 1 .}C .}E .ie \\n()s 'sp |2v .el 'sp |3v .". ps\\n()S-1 .tl \\*(]H\\*(]L\\*(]H .ft 1 .ps \\n()S .ie \\n()s 'sp 1.5v .el 'sp 3v .ev .ns .if \\n(CL .2C .. .de }F .ev 1 .}E .if \\n()s 'sp |\\n(.pu-1v-1p .if \\n()t 'sp |\\n(.pu-3v .if n 'sp |\\n(.pu-4v .if n .tl Page %\\*(]D\\*(]W .if t .tl % .ev 'bp .. .if n .ig .de }C .if "\\*(.T"aps"\{\ . p o0i . l t7.5i . i f\\n()s .tl \l0.25i\l0.25i\h1i\l0.25i . i f\\n()t .tl \l0.25i\l0.25i . l t . p o\} .. .de }M .}N .wh -.5p }C .ll \\n(LLu .}P .. .de }K .}N .pl 1 .ll \\n(LLu .. .de }P .nr )P \\n%+1-\\np .if \\nq .tm \\n(.F \\n()P \\np .bp .if \\nq .nr p \\n% .. .de TH .PD .nr IN \\n()Mu .if t .ds ]H \\$1\^(\^\\$2\^) .if n .ds ]H \\$1(\\$2) .if \\n()s .ds ]D .if \\n()t .ds ]D Plan 9 .if n .ds ]D Plan 9 .ds ]L .if !\\$3 .ds ]L (\^\\$3\^) .if !\\$4 .ds ]D \\$4 .wh 0 }H .wh -\\n(:mu }F .em }M .if \\n(nl .}P .nr )I \\n()Mu .nr )R 0 .}E .DT .if n \{.na .nh \} .if t \{.bd S 3 3 .HY \} \Xhtml  \Xhtml [manual index] \Xhtml [section index] \Xhtml  .. .de HR .ie '\\$2'' \\$4\X'html href \\$1'\fL\\$1\fP\X'html /href'\\$3 .el \\$4\X'html href \\$1'\\$2\X'html /href'\\$3 .. .de SH .PD .}X 0 "\\$1" .nr )E 2 \&\Xhtml

\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6\Xhtml

 .. .de SS .PD .}X 3n "" "" .nr )E 2 \Xhtml

\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6\Xhtml

 .. .de }X .}E .ti \\$1 .sp \\n(PDu .ne 1.1v .nr )R 0 .fi '''ss12 '''if\\$2SYNOPSIS .ss 18 .it 1 }N .if !\\$3 .SM .ft 3 .. .de }2 .nr )E 0 .}E .nr )I \\n()Mu .ns .ft 1 .. .de SM .nh .ps \\n()S-1 .if !\\$1 \&\\$1 .if !\\$2 \&\\$2 .if !\\$3 \&\\$3 .if !\\$4 \&\\$4 .if !\\$5 \&\\$5 .if !\\$6 \&\\$6 .if !\\$1 .ps \\n()S .if \\$1 .it 1 }N .HY .. .de I .nh .ft 2 .it 1 }N .if !\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .HY .. .de B .nh .it 1 }N .ie !\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .el .ft5 .HY .. .de L .nh .it 1 }N .if t \{.ie!\\$1 \%\&\f5\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 .el .ft5 \} .if n \{.ft5 .if !\\$1 \{.ie\\$2 `\\$1' .el .ie\\$3 `\\$1 \\$2' .el .ie\\$4 `\\$1 \\$2 \\$3' .el .ie\\$5 `\\$1 \\$2 \\$3 \\$4' .el .ie\\$6 `\\$1 \\$2 \\$3 \\$4 \\$5' .el `\\$1 \\$2 \\$3 \\$4 \\$5 \\$6'\}\} .HY .. .de RI .nh .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de IR .nh .}S 2 1 \& "\Xhtml manref start \\$1 \\$2\\$1" "\\$2\Xhtml manref end \\$1 \\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de IB .nh .if t .}S 2 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .if n .}S 2 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de RB .nh .if t .}S 1 5 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .if n .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de BR .nh .if t .}S 5 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .if n .}S 1 1 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de BI .nh .if t .}S 5 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .if n .}S 1 2 \%\& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .HY .}f .. .de LR .nh .if t \%\&\f5\\$1\f1\\$2 .if n \%`\\$1'\\$2 .HY .. .de RL .nh .if t \%\&\f1\\$1\\f5\\$2\\f1\\$3 .if n \%\\$1`\\$2'\\$3 .HY .. .de }S .ds ]F .if \\$12 .if !\\$5 .ds ]F \^ .if \\$22 .if !\\$5 .ds ]F \^ .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" .el \\$3 .}f .. .de EX .if t .ft5 .nf .. .de EE .ft 1 .fi .. .de }p .sp \\n(PDu .ne 1.1v .}E .nr )I \\n()Mu .ns .. .de PP \"indirect PP so we can attach html - see tmac.anhtml .}p .. .de P .PP .. .de LP .PP .. .de PD .if t .nr PD .4v .if n .nr PD 1v .if !\\$1 .nr PD \\$1v .. .de HP .sp \\n(PDu .ne 1.1v .if !\\$1 .nr )I \\$1n .ll \\n(LLu .in \\n()Ru+\\n(INu+\\n()Iu .ti \\n()Ru+\\n(INu .}f .. .de IP .ie !\\$1 \{.TP "\\$2" \&\\$1\} .el \{.sp\\n(PDu .ne 1.1v .if !\\$2 .nr )I \\$2n .}f .ll \\n(LLu .in \\n()Ru+\\n(INu+\\n()Iu .lg \} .. .de TP .if !\\$1 \{.nr )I \\$1n .if \\$10 .nr )I \\n()M\} .sp \\n(PDu .ne 1.1v .in \\n()Ru .lg 0 .ns .it 1 }N .nr )E 1 .di ]B .. .de TF .IP "" "\w'\f5\\$1\ \ \fP'u" .PD 0 .. .de }1 .ds ]X \&\\*(]B\\ .rm ]B .nr )E 0 .if !\\$1 .nr )I \\$1n .}f .ll \\n(LLu .in \\n()Ru+\\n(INu+\\n()Iu .ti \\n(INu .ie !\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X .br \} .el \\*(]X\h|\\n()Iu+\\n()Ru\c .}f .lg .. .de }N .if \\n()E .br .if \\n()E1 .di .if \\n()E0 .}f .if \\n()E1 .}1 .if \\n()E2 .}2 .. .de RS .nr ]\\n+()p \\n()I .nr )\\n()p \\n()R .ie !\\$1 .nr )R +\\$1n .el .nr )R +\\n()I .nr )I \\n()Mu .}E .. .de RE .if !\\$1 \{.ie \\$10 .nr )p 1 1 .el .nr )p \\$1 1 \} .ds ]i \\*(]I\\n()p .ds ]r \\*(]R\\n()p .nr )I \\*(]i .nr )R \\*(]r .if \\n()p .nr )p -1 .}E .. '''\" .2C begin 2-column display, by diversion '''\" CC=amount of text that will fit on page '''\" CL=1 multicolumn in effect, else 0 '''\" CI saved indent '''\" CB contains diverted text .de 2C .ne 2 .nf .nr CC \\n(.t/1v*2v .nr CI \\n(IN .nr IN 0 .di CB .nr CL 1 .}E .dt \\n(CCu C1 .. '''\" .1C return to 1-column .de 1C .nr CL 0 .C1 .fi .. '''\" end of diversion, at end of page or return to 1-column '''\" CC=pos of nominal column end .de C1 .dt \!.C3 .di .if \\n(dn \{.nr CC \\n(dnu/2u+\\n(nlu .wh \\n(CCu C2 .mk .nf .nr IN \\n(CIu .}E .CB \} .. '''\" end of first column retrieved from diversion '''\" CC=pos of actual column end .de C2 .wh \\n(CCu .mk CC .po +(\\n(LLu/2u)u .rt .if \\n(dn>1v .ns .. '''\" end of second column .de C3 .br .po -(\\n(LLu/2u)u .if \\n(CC>\\n(nl .sp |\\n(CCu .ne 2 .. .de PM .if \\$1 .nr !K 0 .if \w\\$1 \{\ .ie \\$1P .nr !K 1 .el .ie \\$1BP .nr !K 3 .el .ie \\$1BR .nr !K 4 .el .nr !K 2 \} .if \\n(!K .wh -(\\n(:mu+5v) )G .. .de )G .if \\n(!K 'sp 2v .ie \\n(!K=1 \{\ .ie t .bd1 3 .el .bd1 0 .tl PRIVATE .bd 1 .tl This information should not be disclosed to unauthorized persons. .tl It is meant solely for use by authorized Bell System employees. \} .el .ie \\n(!K=3 \{\ .ie t .bd1 3 .el .bd1 0 .tl BELL LABORATORIES PROPRIETARY .bd 1 .tl Not for use or disclosure outside Bell Laboratories except by .tl written approval of the director of the distributing organization. \} .el .ie \\n(!K=4 \{\ .ie t .bd1 3 .el .bd1 0 .tl BELL LABORATORIES RESTRICTED .bd 1 .tl The information herein is meant solely for use by authorized .tl Bell Laboratories employees and is not to be disclosed to others. \} .el .if \\n(!K=2 \{\ .ie t .bd1 3 .el .bd1 0 .tl NOTICE .bd 1 .tl Not for use or disclosure outside the .tl Bell System except under written agreement. \} .. .nr )s 0 .if t .if \ns .nr )s 1 .nr )t 0 .if t .if !\ns .nr )t 1 .if \n()s \{.nr )L 9i .nr LL 4.75i .nr )O .75i .nr )S 8 .nr )V 9 \} .if \n()t \{.nr )L 11i .nr LL 6.5i .nr )O 1i .nr )S 9 .nr )V 11 \} .if t \{.ds R ® .ds S \s\n()S ..\} .if n \{.nr )L 11i .nr LL 6.5i .nr )O .463i .if '\*(.T'think' \{.nrLL 80n .nr )O 0\} .if '\*(.T'thinksmall' \{.nrLL 142n .vs 9p .nr )O 0\} .ds R (Reg.) .ds S ..\} .if \nT .nr LL 80n .if \nV>1 \{ .nr LL 82n .nr )L 84v .rm ul \} .nr )p 0 1 .ds ]I \\\\n(] .ds ]R \\\\n() .if \nd0 .nr m \n(mo-1 .if \nm0 .ds ]m January .if \nm1 .ds ]m February .if \nm2 .ds ]m March .if \nm3 .ds ]m April .if \nm4 .ds ]m May .if \nm5 .ds ]m June .if \nm6 .ds ]m July .if \nm7 .ds ]m August .if \nm8 .ds ]m September .if \nm9 .ds ]m October .if \nm10 .ds ]m November .if \nm11 .ds ]m December .if n \{.nr m \nm+1 .nr yD (\n(yr%100 .af yD 01 .ie \nd .ds ]W (last mod. \nm/\nd/\ny) .el .ds ]W (printed \n(mo/\n(dy/\n(yD) ..\} .if \n()s .ds ]W .if \n()t \{.ie \nd .ds ]W \*(]m \nd, 20\ny .el .ds ]W \*(]m \n(dy, 20\n(yr ..\} .pl \n()Lu .ll \n(LLu .lt \n(LLu .po \n()Ou .if t .tr \``\'' .}f .if \n()s .nr :m 3.5v .if \n()t .nr :m 6v .if n .nr :m 7v .if t .nr )M 3.6m .if n .nr )M 5n .em }K .nr q \np .if !\np .nr p 1 .pn \np 9base-6/troff/tmac/tmac.e0000644000175000017500000002732211402154555014712 0ustar anselmanselm.nr _0 \n(.c .\"********************************************************************** .\"* * .\"* ****** - M E N R O F F / T R O F F M A C R O S ****** * .\"* * .\"* Produced for your edification and enjoyment by: * .\"* Eric Allman * .\"* Electronics Research Laboratory * .\"* U.C. Berkeley. * .\"* * .\"* VERSION 2.9 First Release: 11 Sept 1978 * .\"* See file \*(||/revisions for revision history * .\"* * .\"* Documentation is available. * .\"* * .\"********************************************************************** .\" .\" @(#)tmac.e 2.9 12/10/80 .\" This version has had comments stripped; an unstripped version is available. .if !\n(.V .tm You are using the wrong version of NROFF/TROFF!! .if !\n(.V .tm This macro package works only on the version seven .if !\n(.V .tm release of NROFF and TROFF. .if !\n(.V .ex .if \n(pf \ . nx \*(||/null.me .de @C .nr _S \\n(.s .nr _V \\n(.v .nr _F \\n(.f .nr _I \\n(.i .ev \\$1 .ps \\n(_Su .vs \\n(_Vu .ft \\n(_F 'in \\n(_Iu .xl \\n($lu .lt \\n($lu .rr _S .rr _V .rr _F .rr _I .ls 1 'ce 0 .. .de @D .ds |p "\\$3 .nr _d \\$1 .ie "\\$2"C" \ . nr _d 1 .el .ie "\\$2"L" \ . nr _d 2 .el .ie "\\$2"I" \ . nr _d 3 .el .ie "\\$2"M" \ . nr _d 4 .el \ . ds |p "\\$2 .. .de @z .if !"\\n(.z"" \ \{\ . tm Line \\n(c. -- Unclosed block, footnote, or other diversion (\\n(.z) . di . ex .\} .if \\n(?a \ . bp .rm bp .rm @b .if t \ . wh -1p @m .br .. .de @I .rm th .rm ac .rm lo .rm sc .rm @I .. .de he .ie !\\n(.$ \ \{\ . rm |4 . rm |5 .\} .el \ \{\ . ds |4 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 . ds |5 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .\} .. .de eh .ie !\\n(.$ \ . rm |4 .el \ . ds |4 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de oh .ie !\\n(.$ \ . rm |5 .el \ . ds |5 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de fo .ie !\\n(.$ \ \{\ . rm |6 . rm |7 .\} .el \ \{\ . ds |6 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 . ds |7 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .\} .. .de ef .ie !\\n(.$ \ . rm |6 .el \ . ds |6 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de of .ie !\\n(.$ \ . rm |7 .el \ . ds |7 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de ep .if \\n(nl>0 \ \{\ . wh 0 . rs . @b .\} .. .de @h .if (\\n(.i+\\n(.o)>=\\n(.l \ . tm Line \\n(c. -- Offset + indent exceeds line length .if t .if (\\n(.l+\\n(.o)>7.75i \ . tm Line \\n(c. -- Offset + line length exceeds paper width .nr ?h \\n(?H .rr ?H .nr ?c \\n(?C .rr ?C .rn |4 |0 .rn |5 |1 .rn |6 |2 .rn |7 |3 .nr _w 0 .nr ?W 0 .nr ?I 1 .ev 2 .rs .if t .@m .if \\n(hm>0 \ . sp |\\n(hmu .if \\n($T=2 \\!. .@t $h .if \\n(tm<=0 \ . nr tm \n(.Vu .sp |\\n(tmu .ev .mk _k .if \\n(?n .nm 1 .nr $c 1 .ie \\n(?s \ \{\ . rr ?s . rs ' @b .\} .el \ . @n .. .de @m .@O 0 .lt 7.5i .tl '\(rn''\(rn' .@O .lt .. .de @n .if \\n(bm<=0 \ . nr bm \\n(.Vu .if (\\n(_w<=\\n($l)&(\\n(?W=0) \ \{\ . nr _b (\\n(ppu*\\n($ru)/2u . if \\n(_bu>((\\n(bmu-\\n(fmu-(\\n(tpu*\\n($ru))/2u) \ . nr _b (\\n(ppu*\\n($ru)-\n(.Vu . nr _b +\\n(bmu .\} .nr _B \\n(_bu .ch @f .wh -\\n(_bu @f .nr ?f 0 .if \\n(?o \ \{\ . (f _ . nf . |o . fi . )f . rm |o .\} .nr ?o 0 .if \\n(?T \ \{\ . nr _i \\n(.i . in \\n($iu . |h . in \\n(_iu . rr _i . mk #T . ns .\} .if (\\n(?a)&((\\n($c<2):(\\n(?w=0)) \ \{\ . nr ?a 0 . @k |t . if \\n(?w \ . mk _k . nr ?w 0 .\} .os .$H .ns .. .de @f .ec .if \\n(?T \ \{\ . nr T. 1 . T# 1 . br .\} .ev 2 .ce 0 .if \\n(?b \ \{\ . nr ?b 0 . @k |b .\} .if \\n(?f \ . @o .ie \\n($c<\\n($m \ . @c .el \ . @e .ev .. .de @o .nf .ls 1 .in 0 .wh -\\n(_Bu @r .|f .fi .if \\n(?o \ . di . if \\n(dn=0 \ \{\ . rm |o . nr ?o 0 . \} . nr dn \\n(_D . rr _D .\} .rm |f .ch @r .. .de @c .rs .sp |\\n(_ku .@O +\\n($lu+\\n($su .nr $c +1 .@n .. .de @e .@O \\n(_ou .rs .sp |\\n(.pu-\\n(fmu-(\\n(tpu*\\n($ru) .@t $f .nr ?h 0 .bp .. .de @t .if !\\n(?h \ \{\ . sz \\n(tp . @F \\n(tf . lt \\n(_Lu . nf . \\$1 . br .\} .. .de $h .rm |z .if !\\n(?c \ \{\ . if e .ds |z "\\*(|0 . if o .ds |z "\\*(|1 .\} .if !\(ts\\*(|z\(ts\(ts \ ' tl \\*(|z .rm |z .. .de $f .rm |z .if \\n(?c \ \{\ . if e .ds |z "\\*(|0 . if o .ds |z "\\*(|1 .\} .if \(ts\\*(|z\(ts\(ts \ \{\ . if e .ds |z "\\*(|2 . if o .ds |z "\\*(|3 .\} .if !\(ts\\*(|z\(ts\(ts \ ' tl \\*(|z .rm |z .. .de @r .di |o .nr ?o 1 .nr _D \\n(dn .ns .. .rn bp @b .de bp .nr $c \\n($m .ie \\n(nl>0 \ . @b \\$1 .el \ \{\ . if \\n(.$>0 \ . pn \\$1 . if \\n(?I \ . @h .\} .br .wh 0 @h .. .rn ll xl .de ll .xl \\$1 .lt \\$1 .nr $l \\n(.l .if (\\n($m<=1):(\\n($l>\\n(_L) \ . nr _L \\n(.l .. .rn po @O .de po .@O \\$1 .nr _o \\n(.o .. .de hx .nr ?H 1 .. .de ix 'in \\$1 .. .de bl .br .ne \\$1 .rs .sp \\$1 .. .de n1 .nm 1 .xl -\w'0000'u .nr ?n 1 .. .de n2 .nm \\$1 .ie \\n(.$ \ . xl -\w'0000'u .el \ . xl \\n($lu .. .de pa .bp \\$1 .. .de ro .af % i .. .de ar .af % 1 .. .de m1 .nr _0 \\n(hmu .nr hm \\$1v .nr tm +\\n(hmu-\\n(_0u .rr _0 .. .de m2 .nr tm \\n(hmu+\\n(tpp+\\$1v .. .de m3 .nr bm \\n(fmu+\\n(tpp+\\$1v .. .de m4 .nr _0 \\n(fmu .nr fm \\$1v .nr bm +\\n(fmu-\\n(_0u .. .de sk .if \\n(.$>0 \ . tm Line \\n(c. -- I cannot skip multiple pages .nr ?s 1 .. .de re .ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i .. .if t .ig .de re .ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i .. .de ba .ie \\n(.$ \ . nr $i \\$1n .el \ . nr $i \\n(siu*\\n($0u .. .de hl .br \l'\\n(.lu-\\n(.iu' .sp .. .de pp .lp \\n(piu .. .de lp .@p .if \\n(.$ \ . ti +\\$1 .nr $p 0 1 .. .de ip .if (\\n(ii>0)&(\\n(ii<1n) \ . nr ii \\n(iin .nr _0 \\n(ii .if \\n(.$>1 \ . nr _0 \\$2n .@p \\n(_0u .if \\w"\\$1" \ \{\ . ti -\\n(_0u . ie \\w"\\$1">=\\n(_0 \ \{\ \&\\$1 . br . \} . el \&\\$1\h'|\\n(_0u'\c .\} .rr _0 .. .de np .nr $p +1 .ip (\\n($p) .. .de @p .@I .if "\\n(.z"|e" .tm Line \\n(c. -- Unmatched continued equation .in \\n($iu+\\n(pou .if \\n(.$ \ . in +\\$1n .ce 0 .fi .@F \\n(pf .sz \\n(ppu .sp \\n(psu .ne \\n(.Lv+\\n(.Vu .ns .. .de sh .rn sh @T .so \\*(||/sh.me .sh "\\$1" "\\$2" \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 .rm @T .. .de $p .if (\\n(si>0)&(\\n(.$>2) \ . nr $i \\$3*\\n(si .in \\n($iu .ie !"\\$1\\$2"" \ \{\ . sp \\n(ssu . ne \\n(.Lv+\\n(.Vu+\\n(psu+(\\n(spu*\\n($ru*\\n(.Lu) . ie \\n(.$>2 \ . ti -(\\n(siu-\\n(sou) . el \ . ti +\\n(sou . @F \\n(sf . sz \\n(spu . if \\$3>0 \ . $\\$3 . if \w"\\$2">0 \\$2. . if \w"\\$1">0 \\$1\f1\ \ \" .\} .el \ . sp \\n(psu .@F \\n(pf .sz \\n(ppu .. .de uh .rn uh @T .so \\*(||/sh.me .uh "\\$1" .rm @T .. .de 2c .br .if \\n($m>1 \ . 1c .nr $c 1 .nr $m 2 .if \\n(.$>1 \ . nr $m \\$2 .if \\n(.$>0 \ . nr $s \\$1n .nr $l (\\n(.l-((\\n($m-1)*\\n($s))/\\n($m .xl \\n($lu .mk _k .ns .. .de 1c .br .nr $c 1 .nr $m 1 .ll \\n(_Lu .sp |\\n(.hu .@O \\n(_ou .. .de bc .sp 24i .. .de (z .rn (z @V .so \\*(||/float.me .(z \\$1 \\$2 .rm @V .. .de )z .tm Line \\n(c. -- unmatched .)z .. .de (t .(z \\$1 \\$2 .. .de )t .)z \\$1 \\$2 .. .de (b .br .@D 3 \\$1 \\$2 .sp \\n(bsu .@( .. .de )b .br .@) .if (\\n(bt=0):(\\n(.t<\\n(bt) \ . ne \\n(dnu .ls 1 .nf .|k .ec .fi .in 0 .xl \\n($lu .ev .rm |k .sp \\n(bsu+\\n(.Lv-1v .. .de @( .if !"\\n(.z"" .tm Line \\n(c. -- Illegal nested keep \\n(.z .@M .di |k \!'rs .. .de @M .nr ?k 1 .@C 1 .@F \\n(df .vs \\n(.su*\\n($Ru .nf .if "\\*(|p"F" \ . fi .if \\n(_d=4 \ . in 0 .if \\n(_d=3 \ \{\ . in +\\n(biu . xl -\\n(biu .\} .if \\n(_d=1 \ . ce 10000 .. .de @) .br .if !"\\n(.z"|k" .tm Line \\n(c. -- Close of a keep which has never been opened .nr ?k 0 .di .in 0 .ce 0 .. .de (c .if "\\n(.z"|c" .tm Line \\n(c. -- Nested .(c requests .di |c .. .de )c .if !"\\n(.z"|c" .tm Line \\n(c. -- Unmatched .)c .br .di .ev 1 .ls 1 .in (\\n(.lu-\\n(.iu-\\n(dlu)/2u .nf .|c .ec .in .ls .ev .rm |c .. .de (q .br .@C 1 .fi .sp \\n(qsu .in +\\n(qiu .xl -\\n(qiu .sz \\n(qp .. .de )q .br .ev .sp \\n(qsu+\\n(.Lv-1v .nr ?k 0 .. .de (l .br .sp \\n(bsu .@D 3 \\$1 \\$2 .@M .. .de )l .br .ev .sp \\n(bsu+\\n(.Lv-1v .nr ?k 0 .. .de EQ .rn EQ @T .so \\*(||/eqn.me .EQ \\$1 \\$2 .rm @T .. .de TS .rn TS @W .so \\*(||/tbl.me .TS \\$1 \\$2 .rm @W .. .de sz .ps \\$1 .vs \\n(.su*\\n($ru .bd S B \\n(.su/3u .. .de r .nr _F \\n(.f .ul 0 .ft 1 .if \\n(.$ \&\\$1\f\\n(_F\\$2 .rr _F .. .de i .nr _F \\n(.f .ul 0 .ft 2 .if \\n(.$ \&\\$1\f\\n(_F\\$2 .rr _F .. .de b .nr _F \\n(.f .ul 0 .ie t \ . ft 3 .el \ . ul 10000 .if \\n(.$ \&\\$1\f\\n(_F\\$2 .if \\n(.$ \ . ul 0 .rr _F .. .de rb .nr _F \\n(.f .ul 0 .ft 3 .if \\n(.$ \&\\$1\f\\n(_F\\$2 .rr _F .. .de u \&\\$1\l'|0\(ul'\\$2 .. .de q \&\\*(lq\\$1\\*(rq\\$2 .. .de bi .ft 2 .ie t \&\k~\\$1\h'|\\n~u+(\\n(.su/3u)'\\$1\fP\\$2 .el \&\\$1\fP\\$2 .. .de bx .ie \\n($T \&\f2\\$1\fP\\$2 .el \k~\(br\|\\$1\|\(br\l'|\\n~u\(rn'\l'|\\n~u\(ul'\^\\$2 .. .de @F .nr ~ \\$1 .if \\n~>0 \ \{\ . ul 0 . ie \\n~>4 \ \{\ . if n .ul 10000 . if t .ft 3 . \} . el \ . ft \\n~ .\} .rr ~ .. .de (f .rn (f @U .so \\*(||/footnote.me .(f \\$1 \\$2 .rm @U .. .de )f .tm Line \\n(c. -- unmatched .)f .. .de $s \l'2i' .if n \ . sp 0.3 .. .de (d .rn (d @U .so \\*(||/deltext.me .(d \\$1 \\$2 .rm @U .. .de )d .tm Line \\n(c. -- unmatched .)d .. .de (x .rn (x @U .so \\*(||/index.me .(x \\$1 \\$2 .rm @U .. .de )x .tm Line \\n(c. -- unmatched .)x .. .de th .so \\*(||/thesis.me .rm th .. .de +c .ep .if \\n(?o:\\n(?a \ \{\ . bp . rs . ep .\} .nr ?C 1 .nr $f 1 1 .ds * \\*[1\\*]\k* .if \\n(?R \ . pn 1 .bp .in \\n($iu .rs .ie \\n(.$ \ . $c "\\$1" .el \ . sp 3 .. .de ++ .nr _0 0 .if "\\$1"C" \ . nr _0 1 .if "\\$1"RC" \ . nr _0 11 .if "\\$1"A" \ . nr _0 2 .if "\\$1"RA" \ . nr _0 12 .if "\\$1"P" \ . nr _0 3 .if "\\$1"B" \ . nr _0 4 .if "\\$1"AB" \ . nr _0 5 .if \\n(_0=0 \ . tm Line \\n(c. -- Bad mode to .++ .nr ?R 0 .if \\n(_0>10 \ .\{ . nr ?R 1 . nr _0 -10 .\} .nr ch 0 1 .if (\\n(_0=3):(\\n(_0=5) \ . pn 1 .ep .if \\n(_0=1 \ \{\ . af ch 1 . af % 1 .\} .if \\n(_0=2 \ \{\ . af ch A . af % 1 .\} .if \\n(_0=3 \ . af % i .if \\n(_0=4 \ . af % 1 .if \\n(_0=5 \ . af % 1 .if \\n(.$>1 \ . he \\$2 .if !\\n(_0=\\n(_M .if \\n(_M=3 \ . pn 1 .nr _M \\n(_0 .rr _0 .. .de $c .sz 12 .ft B .ce 1000 .if \\n(_M<3 \ . nr ch +1 .ie \\n(_M=1 CHAPTER\ \ \\n(ch .el .if \\n(_M=2 APPENDIX\ \ \\n(ch .if \w"\\$1" .sp 3-\\n(.L .if \w"\\$1" \\$1 .if (\\n(_M<3):(\w"\\$1") \ . sp 4-\\n(.L .ce 0 .ft .sz .ie \\n(_M=1 \ . $C Chapter \\n(ch "\\$1" .el .if \\n(_M=2 \ . $C Appendix \\n(ch "\\$1" .. .de tp .hx .bp .br .rs .pn \\n% .. .de ac .rn ac @T .so \\*(||/acm.me .ac "\\$1" "\\$2" .rm @T .. .de lo .so \\*(||/local.me .rm lo .. .if \n(mo=1 .ds mo January .if \n(mo=2 .ds mo February .if \n(mo=3 .ds mo March .if \n(mo=4 .ds mo April .if \n(mo=5 .ds mo May .if \n(mo=6 .ds mo June .if \n(mo=7 .ds mo July .if \n(mo=8 .ds mo August .if \n(mo=9 .ds mo September .if \n(mo=10 .ds mo October .if \n(mo=11 .ds mo November .if \n(mo=12 .ds mo December .if \n(dw=1 .ds dw Sunday .if \n(dw=2 .ds dw Monday .if \n(dw=3 .ds dw Tuesday .if \n(dw=4 .ds dw Wednesday .if \n(dw=5 .ds dw Thursday .if \n(dw=6 .ds dw Friday .if \n(dw=7 .ds dw Saturday .ds td \*(mo \n(dy, 20\n(yr .if (1m<0.1i)&(\nx!=0) \ . vs 9p .rr x .nr $r \n(.v/\n(.s .nr $R \n($r .nr hm 4v .nr tm 7v .nr bm 6v .nr fm 3v .nr tf 3 .nr tp 10 .hy 14 .nr bi 4n .nr pi 5n .nr pf 1 .nr pp 10 .nr qi 4n .nr qp -1 .nr ii 5n .nr $m 1 .nr $s 4n .ds || #9/tmac/me .bd S B 3 .ds [ \u\x'-0.25v' .ds ] \d .ds < \d\x'0.25v' .ds > \u .ds - -- .if t \ \{\ . ds [ \v'-0.4m'\x'-0.2m'\s-3 . ds ] \s0\v'0.4m' . ds < \v'0.4m'\x'0.2m'\s-3 . ds > \s0\v'-0.4m' . ds - \- . nr fi 0.3i .\} .if n \ \{\ . nr fi 3n .\} .nr _o \n(.o .if n .po 1i .if \n(.V=1v \ . nr $T 2 .if \n(.T=0 \ . nr $T 1 .if t \ \{\ . nr $T 0 . po -0.5i .\} .if \nv \ . po 1i .if \n($T \ \{\ . if \n($T=1 \ . po 0 . ds [ [ . ds ] ] . ds < < . ds > > .\} .nr ps 0.5v .if \n($T \ . nr ps 1v .if t .nr ps 0.35v .nr bs \n(ps .nr qs \n(ps .nr zs 1v .nr xs 0.2v .nr fs 0.2v .if \n($T \ . nr fs 0 .if n .nr es 1v .if t .nr es 0.5v .wh 0 @h .nr $l \n(.lu .nr _L \n(.lu .nr $c 1 .nr $f 1 1 .ds * \*[1\*]\k*\" .nr $d 1 1 .ds # [1]\k#\" .nr _M 1 .ds lq \&"\" .ds rq \&"\" .if t \ . ds lq `` .if t \ . ds rq '' .em @z .de sc .so \\*(||/chars.me .rm sc .. .ll 6.0i .lt 6.0i 9base-6/troff/tmac/tmac.ptx0000644000175000017500000000051211402154555015271 0ustar anselmanselm'''\" ptx.src (@(#)ptx.src 1.1) - format permuted index macro .tr ~ .nr)y \n(.lu-.65i .nr)x \n()yu/2u .dss2 ~~~ .dss4 ~ .dss5 ~ .dexx .dss1 .if\w\\$2 .ds s1 ~\| .dss3 .if\w\\$4 .ds s3 ~\| .dsy \\*(s4\f3\a\fP\\*(s5 .ta\\n()yu-\w\\*(s5u \h\\n()xu-\w\\$1\\*(s1\\$2\\*(s2u\\$1\\*(s1\\$2\\*(s2\\$3\\*(s3\\$4\\*y\\$5 .. .nf 9base-6/troff/tmac/me/0000755000175000017500000000000011402154555014213 5ustar anselmanselm9base-6/troff/tmac/me/tbl.me0000644000175000017500000000161211402154555015317 0ustar anselmanselm.nr _0 \n(c. .\" @(#)tbl.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de TS .sp \\n(bsu .@C 1 .if "\\$1"H" \ \{\ . di |h . nr ?T 1 .\} .ls 1 .ch @f -(\\n(_bu+1v) .. .de TH .nr T. 0 .T# 0 .di .nr _i \\n(.i .in 0 .|h .in \\n(_iu .rr _i .mk #T .. .de TE .nr ?T 0 .ch @f -\\n(_bu .ev .sp \\n(bsu+\\n(.Lv-1v .re .rr 31 .rr 32 .rr 33 .rr 34 .rr 35 .rr 36 .rr 37 .rr 38 .rr 39 .rr 40 .rr 41 .rr 42 .rr 43 .rr 44 .rr 45 .rr 46 .rr 47 .rr 48 .rr 49 .rr 50 .rr 51 .rr 52 .rr 53 .rr 54 .rr 55 .rr 56 .rr 57 .rr 58 .rr 59 .rr 60 .rr 61 .rr 62 .rr 63 .rr 64 .rr 65 .rr 66 .rr 67 .rr 68 .rr 69 .rr 70 .rr 71 .rr 72 .rr 73 .rr 74 .rr 75 .rr 76 .rr 77 .rr 78 .rr 79 .rr 80 .rr 81 .rr 82 .rr 83 .rr 84 .rr 85 .rr 86 .rr 87 .rr 88 .rr 89 .rr 90 .rr 91 .rr 92 .rr 93 .rr 94 .rr 95 .rr 96 .rr 97 .rr 98 .rr 99 .rr #I .rr #T .rr #a .rr ## .rr #- .rr #^ .rr T. .. .nr c. \n(_0 9base-6/troff/tmac/me/index.me0000644000175000017500000000142011402154555015642 0ustar anselmanselm.nr _0 \n(c. .\" @(#)index.me 2.6 12/10/80 .\" This version has had comments stripped; an unstripped version is available. .de (x .ie !"\\n(.z"" \ \{\ . ev 2 \!\\!.(x \\$1 .\} .el \ \{\ . ds |X x . if \\n(.$ \ . ds |X \\$1 . am %\\*(|X )x . sp \\n(xsu .\} .. .de )x .ie "\\n(.z"" \ \{\ . ds |x \\n% . if \\n(.$ \ . ds |x \\$1 . if "\\*(|x"_" \ . ig .. . am %\\*(|X .. . if \w"\\$2">(\\n(.l-\\n(.i-\\n(.k) \ . ti +\\n(xuu \\\\a\\\\t\\$2\\*(|x ... . rm |x . rm |X .\} .el \ \{\ \!\\!.)x \\$1 \\$2 . br . ev .\} .. .de xp .br .@C 2 .ls 1 .vs \\n(.su*\\n($Ru .fi .ds |X x .if \\n(.$ \ . ds |X \\$1 .xl -(\\n(xuu+\w'...'u) .di |x .%\\*(|X .br .di .rm %\\*(|X .xl \\n($lu .rm |X .ev .nf .in 0 .ta \\n(.lu-\\n(xuuR \\n(.luR .|x .fi .in .rm |x .. .if \n(xu<=0 \ . nr xu 0.5i .nr c. \n(_0 9base-6/troff/tmac/me/float.me0000644000175000017500000000136711402154555015652 0ustar anselmanselm.nr _0 \n(c. .\" @(#)float.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de (z .@D 4 \\$1 \\$2 .@( .nr ?T 0 .. .de )z .sp \\n(zsu .@) .rr _0 .if !\\n(?b \ . nr dn +(\\n(ppu*\\n($ru)/2u+\\n(zsu .nr dl -\n(.H .ie ((\\n(dn+\n(.V)>=\\n(.t):(\\n(?a):((\\n(dl>\\n($l)&(\\n($c>1)) \ \{\ . nr ?a 1 . if (\\n(dl>\\n($l)&(\\n($m>1) \ . nr ?w 1 . ds |x |t .\} .el \ \{\ . nr ?b 1 . if (\\n(dl>\\n($l)&(\\n($m>1) \ . nr ?W 1 . nr _b +\\n(dnu . ch @f -\\n(_bu . ds |x |b .\} .da \\*(|x .nf .ls 1 .nr ?k 1 \!.if \\\\n(nl>(\\\\n(tm+2v) .ne \\n(dnu-\\n(zsu .eo .cc @ @|k @cc .ec .nr ?k 0 .rm |k .da .in 0 .ls 1 .xl \\n($lu .ev .. .de @k .ev 1 .nf .ls 1 .in 0 .sp \\n(zsu .\\$1 .ec .br .rm \\$1 .ev .nr ?T 0 .. .nr c. \n(_0 9base-6/troff/tmac/me/chars.me0000644000175000017500000000270211402154555015637 0ustar anselmanselm.nr _0 \n(c. .\" @(#)chars.me 2.2 8/29/80 .\" This version has had comments stripped; an unstripped version is available. .if n \ \{\ . ds #[ \f1 . ds #] \fP . ds #h 0 . ds #v 0.8m . ds #f 0.3m .\} .if t \ \{\ . ds #[ \& . ds #] \& . ds #h ((1u-(\\\\n(.fu%2u))*0.13m) . ds #v 0.6m . ds #f 0 .\} .ds ' \k_\h'-(\\n(.wu*8/10-\*(#h)'\*(#[\(aa\h'|\\n_u'\*(#] .ds ` \k_\h'-(\\n(.wu*7/10-\*(#h)'\*(#[\(ga\h'|\\n_u'\*(#] .ds : \k_\h'-(\\n(.wu*8/10-\*(#h+0.1m+\*(#f)'\v'-\*(#v'\*(#[\z.\h'0.2m+\*(#f'.\h'|\\n_u'\v'\*(#v'\*(#] .ds ^ \k_\h'-(\\n(.wu-\*(#h-0.05m)'\*(#[^\h'|\\n_u'\*(#] .ds ~ \k_\h'-(\\n(.wu-\*(#h-0.05m)'\*(#[~\h'|\\n_u'\*(#] .ds , \k_\h'-(\\n(.wu)'\*(#[,\h'|\\n_u'\*(#] .ds v \k_\h'-(\\n(.wu*9/10-\*(#h)'\v'-\*(#v'\*(#[\s-4v\s0\v'\*(#v'\h'|\\n_u'\*(#] .ds o \k_\h'-(\\n(.wu+\w'\(de'u-\*(#h)/2u'\v'-0.4n'\*(#[\z\(de\v'0.4n'\h'|\\n_u'\*(#] .ds qe \*(#[\v'0.5m'\z\(em\v'-0.65m'\z\(em\v'-0.65m'\z\(em\v'0.8m'\h'0.3m'|\h'-0.3m'\*(#] .ds qa \*(#[\h'-0.24m'\z\e\h'0.48m'\z\(sl\h'-0.24m'\v'-0.15m'\(em\v'0.15m'\*(#] .if t \ \{\ . ds qe \s-2\v'0.45m'\z\(em\v'-0.625m'\z\(em\v'-0.625m'\(em\v'0.8m'\s0\h'-0.1m'\v'-0.05m'\(br\v'0.05m'\h'0.1m' . ds qa \z\e\h'0.35m'\z\(sl\h'-0.33m'\v'-0.3m'\s-4\(em\s0\v'0.3m'\h'0.15m' .\} .if \n($T \ \{\ . ds ' \*(#[\h'-1'\(aa\*(#] . ds ` \*(#[\h'-1'\(ga\*(#] . ds : \& . ds ^ \*(#[\h'-1'^\*(#] . ds ~ \*(#[\h'-1'~\*(#] . ds , \*(#[\h'-1',\*(#] . ds v \& . ds o \& . ds qe EXISTS . ds qa FORALL .\} .rm #[ .rm #] .rm #h .rm #v .rm #f .nr c. \n(_0 9base-6/troff/tmac/me/local.me0000644000175000017500000000067111402154555015634 0ustar anselmanselm.nr _0 \n(c. .\" this file may contain local macros, which are initialized with .\" the ".lo" request. All macros and number registers in this file .\" should be named ".*X", where X is any letter (upper or lower case) .\" or digit, to avoid naming conflicts. .\" .\" @(#)local.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. . \" *** insert new definitions before this line *** .nr c. \n(_0 9base-6/troff/tmac/me/thesis.me0000644000175000017500000000070711402154555016041 0ustar anselmanselm.nr _0 \n(c. .\" Setup for thesis. .\" This file should be modified to keep up with the standard .\" for a doctoral thesis at Berkeley. Other macros which may .\" be useful for a thesis are defined here. .\" @(#)thesis.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .nr tf 1 .he '''%' .if n .if \n(_o \ . po 1.5i .if t .po 1.125i .ll 5.75i .if n .if 1n=0.1i \ . ll 5.8i .m1 1i .nr ?t 1 .ls 2 .nr c. \n(_0 9base-6/troff/tmac/me/null.me0000644000175000017500000000016211402154555015507 0ustar anselmanselm.\" @(#)null.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .cc . 9base-6/troff/tmac/me/revisions0000644000175000017500000001103711402154555016161 0ustar anselmanselm2.9 10 Dec 80 -- More stuff to make indices inside keeps work correctly. 2.8 10 Nov 80 -- Had .)c do a .br to insure that the final line is forced out. 2.7 24 Sep 80 -- Fixed bug in 2.6 2.6 23 Sep 80 -- Fixed problem introduced by 2.2 which occured in footnotes and index entries in filled keeps 2.5 29 Aug 80 -- Changed umlaut to not be so tricky -- it seems to backfire. 2.4 25 Aug 80 -- Fixed bug in indices caused by 2.2. 2.3 20 Aug 80 -- Fixed bug in footnotes caused by 2.2. -- Changed temp file names that macros that do dynamic loading rename themselves to. For example, if you say '.TS ... .(f' when both of them have been used for the first time, the @T macro got used twice. 2.2 18 Aug 80 -- Suspended footnote & index processing until final output (so that they will work properly in keeps). 2.1 18 Aug 80 -- Release 2. No changes. Mod 28 18 Aug 80 -- If \nv is set on entry, handle .po differently (for vtroff). -- Allow ".nr fi 0". Mod 27 30 Jun 80 -- Put in a cludge to try to make multi-columned output work with wide floating keeps. Moves all wide keeps to the top of the next real page. Mod 26 9 Nov 79 -- Fixed footnote bug that caused the first line of footnotes that were broken across a page to be indented. Mod 25 1 Oct 79 -- Fixed footnote bug that caused footnotes invoked at the top of pages to come out in bold font. -- Fixed equation bug that caused equations at the top of page to be improperly centered. Mod 24 27 Sep 79 -- Changed delimiter in all \w's to " from ', to allow for apostrophes in labels. -- Increased footnote fudge factor. -- Changed \x factor in \*[ & \*< to be one half previous value. Mod 23 24 Aug 79 -- Changed .ip to start new line if the tag is too long for the space provided. Mod 22 11 Jul 79 -- Changed .ac to handle new paper (with second parameter == "*"). Mod 21 24 Apr 79 -- Changed \*[ and \*< to use \x -- to avoid line overlap. Mod 20 6 Apr 79 -- Changed 12-pitch DTC terminals to still space 1/6 inch (instead of 1/8 inch), unless the 'x' register is non-zero -- do-able with the -rx1 option on the nroff command line. Mod 19 28 Mar 79 -- Had .ep do a .rs, to avoid occasional problems (like with .+c (again). -- Added the 'X' register: if non-zero on startup on a 12-pitch terminal, it outputs 6 LPI instead of 8 LPI. Mod 18 26 Mar 79 -- Had .+c reset indent, to solve problems of prelim material after a .ip (as with references) Mod 17 19 Mar 79 -- Fixed a bug in .++ which caused it to renumber pages incorrectly, the result of nroff starting a new page immediately upon reaching the end of the previous page (damn!). Mod 16 8 Mar 79 -- Fixed a bug in .++ which caused it to change page number formats before forcing out the page. -- Changed tmac.e so that extra '.so's to the package will next to 'null.me'. -- Changed .sh so that a title of "_" will cause section depth change side-effects only (base indent will remain the same, and no output will occur). Mod 15a 7 Mar 79 -- Fixed a bug in Mod 15 which caused .ip's to fail. Mod 15 2 Mar 79 -- Changed .@p to do paragraph indents normally in keeps, which will override the indent parameter in keeps with paragraph forms in them (use .ba to fix this). Mod 14 23 Feb 79 -- Fixed .ip so it would hyphenate correctly. Mod 13 16 Feb 79 -- Added .rs before eqn title output to fix vertical centering problem. Mod 12 15 Feb 79 -- Changed NROFF bold font to be regular .ul (.cu is a pain). -- Changed .sh to output regular spaces instead of unpaddable spaces. -- Fixed bug in .1c with bad line length (didn't reset \n($l). Mod 11 13 Feb 79 -- Added hook to .$c to call .$C (for index entries or whatever). Mod 10 12 Feb 79 -- Had .xp print in current environment and not reset to single spacing, to allow more control over output format. Mod 9 26 Dec 78 -- Fixed yet another problem with equation spacing. Mod 8 18 Dec 78 -- Fixed .@q to solve a problem with \n(dn getting lost on equations at top of page. Mod 7 11 Dec 78 -- Had .@q (equation output) move to end of equation after equation output (eqn doesn't seem to space quite right). Mod 6 27 Nov 78 -- Fixed the umlaut on DTC output to be prettier. Mod 5 5 Nov 78 -- Fixed a bug with the second parameter to .ip. Mod 4 2 Nov 78 -- Added .uh command (unnumbered heading). -- Changed .$p and .sh accordingly. Mod 3 2 Oct 78 -- Fixed .ne command in .$p (print section headings). Mod 2 25 Sep 78 -- Changed .np to use () instead of []. Mod 1 12 Sep 78 -- Fixed footnote fudge factor (curse NROFF!!) -- Put "needs" on .(z, .)z. Mod 0 11 Sep 78 9base-6/troff/tmac/me/deltext.me0000644000175000017500000000041611402154555016210 0ustar anselmanselm.nr _0 \n(c. .\" @(#)deltext.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de (d .am |d )d .sp \\n(bsu .. .de )d .if \\n# \ . nr $d +1 .ds # [\\n($d]\k# .rr # .. .de pd .|d .rm |d .nr $d 1 1 .ds # [1]\k# .. .nr c. \n(_0 9base-6/troff/tmac/me/acm.me0000644000175000017500000000123411402154555015276 0ustar anselmanselm.nr _0 \n(c. .\" @(#)acm.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de ac .ll 8.9i .nr $s 0.5i .if !\\n($T \ . po 1.0i .ie "\\$2"*" \ \{\ . nr hm 0.375i . nr tm 1.125i . pl 14.25i . nr bm 1.5i . de $h .. . tl ''%'' ... . rm $f .\} .el \ \{\ . nr hm 0 . nr tm 0 . pl 15i . nr bm 3i . nr fm 0.9i . de $f .. . ti 0 \h'|0.5i'\\\\n%\h'|1.25i'\\$2\h'|3i'\\$1 . br ... . rm $h .\} .bp .rs .sp 0.75i .rm ac .. .if t .tm Line \n(c. -- macro .ac will not work in TROFF -- request ignored. .if t .rm ac .de +c .if \\n(?A \ \{\ . nr ch 0 1 . pn 1 . ep . af % 1 . bp .\} .nr ?A 0 .sp 1i .if \\n(.$ \ . $c "\\$1" .. .nr c. \n(_0 9base-6/troff/tmac/me/eqn.me0000644000175000017500000000161211402154555015321 0ustar anselmanselm.nr _0 \n(c. .\" @(#)eqn.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de EQ .ec .if !\\n(?e \ \{\ . if "\\n(.z"|e" .tm Line \\n(c. -- Nested .EQ request . @D 1 "\\$1" "\\$2" . @C 2 . di |e .\} .ls 1 .in 0 .nf .. .de EN .br .ie "\\$1"C" \ \{\ . nr ?e 1 . sp \\n(esu .\} .el \ \{\ . nr ?e 0 . di . if \\n(dn \ . @q . rm |e . rm 10 . rm 11 . rm 12 . rm 13 . rm 14 . rm 15 . rm 16 . rm 17 . rm 18 . rm 19 . rm 20 . rm 21 . rm 22 . rm 23 . ev .\} .. .de @q .nr _Q \\n(dnu .ev .sp \\n(esu .@C 2 .ie \\n(_d=1 \ . in (\\n(.lu+\\n($iu-\\n(dlu)/2u .el .ie \\n(_d=2 \ . in \\n($iu .el .ie \\n(_d=3 \ . in \\n(biu+\\n($iu .el .if \\n(_d=4 \ . in 0 .if !"\\n(.z"" \!.ne \\n(_Qu .ne \\n(_Qu+\n(.Vu .mk _q .if !"\\*(|p"" \ \{\ . rs . sp (\\n(_Qu-\\n(.vu)/2u . tl """\\*(|p" . rt \\n(_qu .\} .|e .sp |\\n(_qu+\\n(_Qu .sp \\n(esu+\\n(.Lv-1v .rr _q .rr _Q .. .nr c. \n(_0 9base-6/troff/tmac/me/sh.me0000644000175000017500000000272111402154555015152 0ustar anselmanselm.nr _0 \n(c. .\" @(#)sh.me 2.1 8/18/80 .\" This version has had comments stripped; an unstripped version is available. .de sh .if (\\n(si>0)&(\\n(si<1n) \ . nr si \\n(sin .ce 0 .@d "\\$1" +1 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 .if !"\\$2"_" \ \{\ . ds |x \&\\$2 . $p "\\*(|x" "\\*($n" \\n($0 . $0 "\\*(|x" "\\*($n" \\n($0 . rm |x .\} .nr $p 0 1 .. .de @d .if !""\\$1" \ . nr $0 \\$1 .if \\n($0&(\\n(.$>1) \ . nr $\\n($0 \\$2 .ds $n \&\" .ie \\n($0>=1 \ \{\ . if \\n($1=0 \ . nr $1 1 . if (\\n(.$>=3) .if !"\\$3"-" \ . nr $1 \\$3 . as $n \\n($1 .\} .el \ . nr $1 0 .ie \\n($0>=2 \ \{\ . if \\n($2=0 \ . nr $2 1 . if (\\n(.$>=4) .if !"\\$4"-" \ . nr $2 \\$4 . as $n .\\n($2 .\} .el \ . nr $2 0 .ie \\n($0>=3 \ \{\ . if \\n($3=0 \ . nr $3 1 . if (\\n(.$>=5) .if !"\\$5"-" \ . nr $3 \\$5 . as $n .\\n($3 .\} .el \ . nr $3 0 .ie \\n($0>=4 \ \{\ . if \\n($4=0 \ . nr $4 1 . if (\\n(.$>=6) .if !"\\$6"-" \ . nr $4 \\$6 . as $n .\\n($4 .\} .el \ . nr $4 0 .ie \\n($0>=5 \ \{\ . if \\n($5=0 \ . nr $5 1 . if (\\n(.$>=7) .if !"\\$7"-" \ . nr $5 \\$7 . as $n .\\n($5 .\} .el \ . nr $5 0 .ie \\n($0>=6 \ \{\ . if \\n($6=0 \ . nr $6 1 . if (\\n(.$>=8) .if !"\\$8"-" \ . nr $6 \\$8 . as $n .\\n($6 .\} .el \ . nr $6 0 .. .de sx .ce 0 .ul 0 .nr _0 \\n($0-1 .if \\n(.$ .nr _0 +1 .if \\n(.$ .nr _0 \\$1 .@d \\n(_0 .rr _0 .$p "" "" \\n($0 .nr $p 0 1 .. .de uh .$p "\\$1" .$0 "\\$1" .. .if \n(sf<=0 \ . nr sf 8 .if \n(sp<=0 \ . nr sp 10 .if \n(ss<=0 \ . nr ss 12p .if \n(si<=0 \ . nr si 0 .nr c. \n(_0 9base-6/troff/tmac/me/footnote.me0000644000175000017500000000204111402154555016370 0ustar anselmanselm.nr _0 \n(c. .\" @(#)footnote.me 2.4 9/23/80 .\" This version has had comments stripped; an unstripped version is available. .de (f .ec .if "\\n(.z"|f" .tm Line \\n(c. -- Illegal footnote nesting .ie "\\n(.z"" \ \{\ . nr _D \\n(dn . nr _0 1v+\\n(nlu . ev 2 . da |f . in 0 . xl \\n($lu-\\n(fuu . @F \\n(ff . sz \\n(fpu . vs \\n(.su*\\n($Ru . if !\\n(?f \ \{\ . nr _b +2u*\n(.Vu . $s . \} . br . if \\n(.p-\\n(_b-\\n(_0-\\n(.h-1v-\\n(fs<0 \ \{\ . da\" . bc . if !\\n(?f \ . rm |f . da |f . in 0 . xl \\n($lu-\\n(fuu . @F \\n(ff . sz \\n(fpu . vs \\n(.su*\\n($Ru . if !\\n(?f \ . $s . br . \} . rr _0 . sp \\n(fsu . nr ?f 1 . fi . if !"\\$1"_" \ . ti \\n(fiu .\} .el \ \{\ . ev 2 \!.(f \\$1 .\} .. .de )f .ie "\\n(.z"|f" \ \{\ . if \\n* \ . nr $f +1 . ds * \\*[\\n($f\\*]\k* . rr * . in 0 . da . ev . if \\n(_w<\\n(dl \ . nr _w \\n(dl . nr _b +\\n(dn . ch @f -\\n(_bu . if \\n(.p-\\n(_b<=\\n(nl \ . ch @f \\n(nlu+\n(.Vu . nr dn _D . rr _D .\} .el \ \{\ . br \!.)f . ev .\} .. .if \n(ff<=0 \ . nr ff 1 .if \n(fp<=0 \ . nr fp 8 .nr c. \n(_0 9base-6/troff/tmac/tmac.jsdisp0000644000175000017500000000147411402154555015762 0ustar anselmanselm. \" DS - display. If .DS C, center; L, left-adjust; I, indent. .de DS .KS .nf .\\$1D \\$2 \\$1 .ft 1 .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .. .de D .ID \\$1 .. .de CD .XD .ce 1000 .. .de ID .XD .if t .in +0.5i .if n .in +8 .if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in \\n(OIu .if \\n(.$ .if !"\\$1"I" .if !"\\$1"" .in +\\$1n .. .de LD .XD .. .de XD .nf .nr OI \\n(.i .SP \\n(DVu .sp \\n(DVu .. . \" BD - block display: save everything, then center it. .de BD .XD .nr BD 1 .nf .in \\n(OIu .di DD .. . \"DE - display end .de DE .ce 0 .if \\n(BD>0 .DF .nr BD 0 .in \\n(OIu .KE .SP \\n(DVu .sp \\n(DVu .fi .. . \" DF - finish a block display to be recentered. .de DF .di .if \\n(dl>\\n(BD .nr BD \\n(dl .if \\n(BD<\\n(.l .in (\\n(.lu-\\n(BDu)/2u .nr EI \\n(.l-\\n(.i .ta \\n(EIuR .nf .DD .in \\n(OIu .. 9base-6/troff/tmac/tmac.bits0000644000175000017500000000210111402154555015413 0ustar anselmanselm.ds Bf b \" default format; use i for icons and faces .ds Bn /tmp/btroff\n($$ \" temporary file, reused on each macro call .ds Bp /usr/lib/btroff \" bitmap filter .de BM .if \\n(.$=1 .ds Bf \\$1 .if \\n(.$=2 \{. \" copy request, perhaps diverted .ie '\\n(.z'' .Bm \\$1 \\$2 .el \!.BM \\$1 \\$2\} .if \\n(.$=4 \{. \" size request, numerator only .nr Bz \\$2 .sy \\*(Bp -s -\\*(Bf -d\\n(Bz \\$1 | awk '{\ print ".nr \\$3 " $1; \ print ".nr \\$4 " $2; \ exit }' >\\*(Bn .so \\*(Bn .sy /bin/rm -f \\*(Bn \} .if \\n(.$=5 \{. \" size request, numerator and denominator .nr Bz \\$2 .sy \\*(Bp -s -\\*(Bf -d\\n(Bz \\$1 | awk '{\ print ".nr \\$4 " $1 "/\\$3"; \ print ".nr \\$5 " $2 "/\\$3"; \ exit }' >\\*(Bn .so \\*(Bn .sy /bin/rm -f \\*(Bn \} .. .de Bm \" copy request, for real .if \\n(.P>0 \{. \" maybe .fl .ie '\\$2'0' \{. \" ask driver to read the bits .br \\X'Bitmap \\$1' .sp -1 \} .el \{. \" use the Bitmap font .sy \\*(Bp -\\*(Bf -d\\$2 \\$1 >\\*(Bn .fp 9 BM Bitmap .ft 9 .ps \\$2 .cf \\*(Bn \" next line is for pm to consume \!n0 1 .ft .ps .sy /bin/rm -f \\*(Bn \} .fl \} .. 9base-6/troff/tmac/tmac.srefs0000644000175000017500000000521311402154555015603 0ustar anselmanselm.\" REFER macros .... citations .de [] .][ \\$1 .. .de ][ .if \\$1>5 .tm Bad arg to [] .[\\$1 .. .if n .ds [. [ .if t .ds [. \s-2\v'-.4m'\f1 .if n .ds .] ] .if t .ds .] \v'.4m'\s+2\fP .if n .ds [o "" .if n .ds [c "" .if t .ds [o `` .if t .ds [c '' .\" the next lines deal with the problem of .[1] or [1]. .\" refer will write "linexxx\*(<.[1]\*(>. .\" and either "<." or ">." should produce the .; .\" similarly for , .if n .ds >. . .if t .ds <. . .if n .ds >, , .if t .ds <, , .de [5 \" tm style .FS .IP "\\*([F.\0" .nr %T 2 \\*([A, \\f2\\*([T\\f1, .ie \\n(TN \\*([M. .el Bell Laboratories internal memorandum (\\*([D). .RT .FE .. .de [0 \" other .FS .nr [: 0 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \{.nr [: 1 \\*([A\c\} .if !"\\*([T"" \{.if \\n([:>0 , .nr [: 1 \\f2\\*([T\\f1\c\} .if !"\\*([O""\{.if \\n([:>0 , .nr [: 1 .if \\n([O>0 .nr [: 0 \\*([O\c .if \\n([O>0 \& \c\} .if !"\\*([D"" \{.if \\n([:>0 , .nr [: 1 \\*([D\c\} .if \\n([:>0 \&. .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [1 \" journal article .nr %T 1 \" title font .FS .if !"\\*([R"" .rm [C .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\*([o\\*([T,\\*([c \\f2\\*([J\\f1\c .if !"\\*([C"" , \\*([C\c .if !"\\*([V"" .if n ,\& Vol.\&\c .if !"\\*([V"" \& \\f3\\*([V\\f1\c .if !"\\*([N"" (\\*([N)\c .if !"\\*([P"" \{\ .ie \\n([P>0 , pp.\ \&\c .el , p.\ \&\c \\*([P\c\} .if !"\\*([I"" .if "\\*([R"" , \\*([I\c .if !"\\*([O"" .if \\n([O=0 , \\*([O\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" .if \\n([O>0 \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [2 \" book .FS .nr %T 2 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\f2\\*([T,\\f1 \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([G"" Gov't. ordering no. \\*([G. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [4 \" report .FS .if !"\\*([F"" .IP "\\*([F.\0" .nr %T 1 \\*([A, \\*([o\\*([T,\\*([c \\*([R\c .if !"\\*([G"" \& (\\*([G)\c .if !"\\*([I"" , \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de [3 \" article in book .FS .nr %T 1 .if !"\\*([F"" .IP "\\*([F.\0" .if !"\\*([A"" \\*([A, .if !"\\*([T"" \\*([o\\*([T,\\*([c .if !"\\*([P"" pp. \\*([P in \\f2\\*([B\\f1\c .if !"\\*([E"" , ed. \\*([E\c .if !"\\*([I"" , \\*([I\c .if !"\\*([C"" , \\*([C\c .if !"\\*([D"" \& (\\*([D)\c \&. .if !"\\*([O"" \\*([O .if !"\\*([%"" Cited p. \\*([%. .RT .FE .. .de ]< .[< .. .de [< .LP .rm FS FE .. .de [> .]> .. .de ]> .sp .. .de ]- .[- .. .de [- .rm [V [P [A [T .rm [N [C [B [O .rm [R [I [E [D .rm [G [% .. .de ]] .\"this is never executed and just uses up an end-of-file bug. .. 9base-6/troff/tmac/tmac.s0000644000175000017500000005575411402154555014742 0ustar anselmanselm.lg 0 .ds sd #9/tmac .\" RT - reset everything to normal state .de RT .if \\n(CS \{\ .SR 1 .BG\} .if !\\n(1T .BG .ce 0 .if !\\n(IK .if !\\n(IF .if !\\n(IX .if !\\n(BE .if !\\n(FT .di .ul 0 .if \\n(QP \{\ . ll +\\n(QIu . in -\\n(QIu . nr QP -1\} .if \\n(NX<=1 .if \\n(AJ=0 .if \\n(FT=0 .ll \\n(LLu .if !\\n(IF \{\ . ps \\n(PS . ie \\n(VS>=41 .vs \\n(VSu . el .vs \\n(VSp\} .ie \\n(IP \{\ . in \\n(I\\n(IRu . nr IP -1\} .el .if !\\n(IR \{\ . nr I1 \\n(PIu . nr I2 0 . nr I3 0 . nr I4 0 . nr I5 0\} .ft 1 .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n .hy \\n(HY .fi .. . \"IZ - initialization .de IZ .so \\*(sd/tmac.sdisp .nr TN 0 .em EM . \" ACCENTS say \*'e or \*`e to get e acute or e grave both were 4/10 .ds ' \h'\w'e'u*1/10'\z\(aa\h'-\w'e'u*1/10' .ds ` \h'\w'e'u*2/10'\z\(ga\h'-\w'e'u*2/10' . \" UMLAUT \*:u, etc. .if t .ds : \\v'-0.6m'\\h'(1u-(\\\\n(.fu%2u))*0.13m+0.00m'\\z.\\h'0.2m'\\z.\\h'-((1u-(\\\\n(.fu%2u))*0.13m+0.20m)'\\v'0.6m' .if n .ds : \z" . \" TILDE and CIRCUMFLEX .ds ^ \\\\k:\\h'-\\\\n(.fu+1u/2u*2u+\\\\n(.fu-1u*0.13m+0.06m'\\z^\\h'|\\\\n:u' .ds ~ \\\\k:\\h'-\\\\n(.fu+1u/2u*2u+\\\\n(.fu-1u*0.13m+0.06m'\\z~\\h'|\\\\n:u' . \" czech v symbol .ds v \\\\k:\\\\h'+\\\\w'e'u/4u'\\\\v'-0.6m'\\\\s6v\\\\s0\\\\v'0.6m'\\\\h'|\\\\n:u' . \" cedilla .ds , \\\\k:\\\\h'\\\\w'c'u*0.4u'\\\\z,\\\\h'|\\\\n:u' .so \\*(sd/tmac.srefs .ch FO \\n(YYu .if !\\n(FM .nr FM 1i .nr YY -\\n(FMu .nr XX 0 1 .nr IP 0 .nr PI 5n .nr QI 5n .nr I0 \\n(PIu .nr PS 10 .nr VS 12 .nr HY 14 .ie n \{\ . if !\\n(PD .nr PD 1v . nr DV 1v\} .el \{\ . if !\\n(PD .nr PD 0.3v . nr DV .5v\} .nr ML 3v .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .nr IR 0 .nr I0 0 .nr I1 \\n(PIu .nr TB 0 .nr SJ \\n(.j .nr LL 6i .ll \\n(LLu .nr LT \\n(.l .lt \\n(LTu .ev 1 .if !\\n(FL .nr FL \\n(LLu*11u/12u .ll \\n(FLu .ps 8 .vs 10p .ev .if \\*(CH .ds CH "\(hy \\\\n(PN \(hy .wh 0 NP .wh -\\n(FMu FO .ch FO 16i .wh -\\n(FMu FX .ch FO -\\n(FMu .if t .wh -\\n(FMu/2u BT .if n .wh -\\n(FMu/2u-1v BT . \" no overstriking bold or italic; switch underlining to bold italic . \" (sad historical botch, the .uf font must be 2, 3, or 4) .if n .uf 4 .if n .bd 3 .nr CW 0-1 .nr GW 0-1 .. .de TM .if !\\n(IM .if !\\n(MN .pn 0 .so \\*(sd/tmac.scover .if !\\n(IM .if !\\n(MN .rm IM MF MR .if n .if !\\n(.T .pi /usr/bin/col .nr ST 1 .ds QF TECHNICAL MEMORANDUM .br .ds MN \\$1 .if !"\\$1"" .nr MM 1 .if !"\\$2"" .nr MC 1 .if !"\\$3"" .nr MG 1 .nr TN 1 .if \\n(.$-1 .ds CA \\$2 .if \\n(.$-2 .ds CC \\$3 .rm RP S0 S2 AX .. . \" IM - internal memorandum .de IM .nr IM 1 .TM "\\$1" "\\$2" "\\$3" .rm QF .RA .rm RA RP MF MR .. . \" MF - memorandum for file. .de MF .nr MN 1 .TM "\\$1" "\\$2" "\\$3" .rm MR .rm IM .RA .rm RA RP TM .. . \" MR - memo for record .de MR .nr MN 2 .TM "\\$1" "\\$2" "\\$3" .ds QF MEMORANDUM FOR RECORD .rm MF .RA .rm RA RP IM TM .. . \" LT - letter .de LT .if !\\n(PO .ie n .nr PO 1.5i .el .nr PO 1.3i .po \\n(POu .LP .rs .if !"\\$1"" \{\ . vs -2p .if "\\$1"LT" .ta 3.9i 4.45i .if !"\\$1"LT" .ta 3.9i 4.45i . sp .2i . nf . if "\\$1"LT" \s36\(FA\s0 . if !"\\$1"LT" \s36\(LH\s0 . br \s7\l'7i'\s0 .sp . br . if !"\\$2"" .ds xR " \\$2 . ds xP 908-582-3000 . if !"\\$3"" .ds xP \\$3 . if "\\$1"LT" \s8\f(HBBell Laboratories\fP \fH600 Mountain Avenue . if !"\\$1"LT" \s8\f(HBBell Laboratories\fP \fH600 Mountain Avenue . if !"\\$2"" \\*(xR Murray Hill, NJ 07974-0636 \\*(xP . if !"\\$4"" \\$4 . if !"\\$5"" \\$5 . if !"\\$6"" \\$6 . if !"\\$7"" \\$7 .ft 1 .ps . sp -.75i . vs . fi \} .if n \{\ . sp 1i . in 4.55i\} .if t \{\ . sp 1.45i . in 3.5i\} .ll 8i \\*(DY .ll .in 0 .br .if t .sp 3 .if n \{\ . sp . na\} .nf .rm CF .de SG \" nested defn .sp 2 .ta 3.5i Sincerely, .sp 3 \\\\$1 .ds CH \\.. .. .de OK .br .di .di OD .. .de RP \" released paper .nr ST 2 .pn 0 .rm SG CS TM QF IM MR MF EG .br .. .de TR \" Comp. Sci. Tech Rept series. .nr ST 3 .pn 0 .ds MN \\$1 .rm SG CS TM QF IM MR M EG .br .. . \"FP - font position for a family .de FP .ds TF \\$1 .if '\\$1'palatino'\{\ . fp 1 R PA . fp 2 I PI . fp 3 B PB . fp 4 BI PX\} .if '\\$1'lucidabright'\{\ . fp 1 R LucidaBright . fp 2 I LucidaBright-Italic . fp 3 B LucidaBright-Demi . fp 4 BI LucidaBright-DemiItalic . fp 5 CW LucidaSansCW\} .if '\\$1'lucidasans'\{\ . fp 1 R LucidaSans . fp 2 I LucidaSansI . fp 3 B LucidaSansB . fp 5 CW LucidaCW\} .if '\\$1'luxisans'\{\ . fp 1 R LuxiSans . fp 2 I LuxiSans-Oblique . fp 3 B LuxiSans-Bold . fp 4 BI LuxiSans-BoldOblique . fp 5 CW LuxiMono\} .if '\\$1'dejavu'\{\ . fp 1 R DejaVuSerif . fp 2 I DejaVuSerifOblique . fp 3 B DejaVuSerifBold . fp 4 BI DejaVuSerifBoldOblique . fp 5 CW DejaVuMonoSans\} .if '\\$1'dejavusans'\{\ . fp 1 R DejaVuSans . fp 2 I DejaVuSansOblique . fp 3 B DejaVuSansBold . fp 4 BI DejaVuSansBoldOblique . fp 5 CW DejaVuMonoSans\} .if '\\$1'syntax'\{\ . fp 1 R Syntax . fp 2 I SyntaxI . fp 3 B SyntaxB . fp 5 CW LucidaCW\} .if '\\$1'century'\{\ . ie '\\*(.T'202'\{\ . fp 1 NR Centsb . fp 2 NI CentI . fp 3 NB CentB . fp 4 NX CentBI\} . el \{\ . fp 1 NR . fp 2 NI . fp 3 NB . fp 4 NX\}\} .if '\\$1'helvetica'\{\ . fp 1 H . fp 2 HI . fp 3 HB . fp 4 HX\} .if '\\$1'bembo'\{\ . ie '\\*(.T'202'\{\ . fp 1 B1 Bembo . fp 2 B2 BemboI . fp 3 B3 BemboB . fp 4 B4 BemboBI\} . el \{\ . fp 1 B1 . fp 2 B2 . fp 3 B3 . fp 4 B4\}\} .if '\\$1'optima'\{\ . fp 1 R Optima . fp 2 I OptimaI . fp 3 B OptimaB . fp 4 BI OptimaBI\} .if '\\$1'souvenir'\{\ . fp 1 R Souvenir . fp 2 I SouvenirI . fp 3 B SouvenirB . fp 4 BI SouvenirBI\} .if '\\$1'melior'\{\ . fp 1 R Melior . fp 2 I MeliorI . fp 3 B MeliorB . fp 4 BI MeliorBI\} .if '\\$1'times'\{\ . fp 1 R . fp 2 I . fp 3 B . fp 4 BI\} .. . \"TL - title and initialization .de TL .br .nr TV 1 .if \\n(IM .rm CS .if \\n(MN .rm CS .ME .rm ME .di WT .na .fi .ie h .ll \\n(LLu .el \{\ .ll 5.0i .if n .if \\n(TN .ll 29 .if t .if \\n(TN .ll 3.5i \} .ft 3 .ps \\n(PS .if !\\n(TN \{\ . ps +2 . vs \\n(.s+2 . rm CS\} .hy 0 .if h .ce 999 .. .de TX .rs .sp .5i .ce 1000 .if n .ul 1000 .ps 12 .ft 3 .vs 15p .ne 4 .hy 0 .WT .hy \\n(HY .ce 0 .ul 0 .. . \" AU - author(s) .de AU .nr AV 1 .ad \\n(SJ .br .di .br .nf .nr NA +1 .ds R\\n(NA \\$1 .ds E\\n(NA \\$2 .di A\\n(NA .ll \\n(LLu .ie t \{\ . ie !\\n(TN .ft 2 . el \{\ . ft 3 . ll 1.4i\}\} .el \{\ . ie !\\n(TN .ft 1 . el \{\ . ft 3 . ll 16\}\} .ps \\n(PS .if h .ce 999 .. .de AX .ft 1 .rs .ce 1000 .if n .ul 0 .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .if t \{\ . sp . A1 . sp 0.5 . ns . I1 . if \\n(NA-1 .sp . A2 . if \\n(NA-1 .sp 0.5 . ns . I2 . if \\n(NA-2 .sp . A3 . if \\n(NA-2 .sp 0.5 . ns . I3 . if \\n(NA-3 .sp . A4 . if \\n(NA-3 .sp 0.5 . ns . I4 . if \\n(NA-4 .sp . A5 . if \\n(NA-4 .sp 0.5 . ns . I5 . if \\n(NA-5 .sp . A6 . if \\n(NA-5 .sp 0.5 . ns . I6 . if \\n(NA-6 .sp . A7 . if \\n(NA-6 .sp 0.5 . ns . I7 . if \\n(NA-7 .sp . A8 . if \\n(NA-7 .sp 0.5 . ns . I8 . if \\n(NA-8 .sp . A9 . if \\n(NA-8 .sp 0.5 . ns . I9\} .if n \{\ . sp 2 . A1 . sp . ns . I1 . if \\n(NA-1 .sp 2 . A2 . if \\n(NA-1 .sp . ns . I2 . if \\n(NA-2 .sp 2 . A3 . if \\n(NA-2 .sp . ns . I3 . if \\n(NA-3 .sp 2 . A4 . if \\n(NA-3 .sp . ns . I4 . if \\n(NA-4 .sp 2 . A5 . if \\n(NA-4 .sp . ns . I5 . if \\n(NA-5 .sp 2 . A6 . if \\n(NA-5 .sp . ns . I6 . if \\n(NA-6 .sp 2 . A7 . if \\n(NA-6 .sp . ns . I7 . if \\n(NA-7 .sp 2 . A8 . if \\n(NA-7 .sp . ns . I8 . if \\n(NA-8 .sp 2 . A9 . if \\n(NA-8 .sp . ns . I9\} .. . \"AI - authors institution .de AI .br .ft 1 .di .di I\\n(NA .nf .. . \"AB - begin an abstract .de AB .br .di .ul 0 .ce 0 .nr 1T 1 .nr IK 1 .nr KI 1 .di WB .rs .nr AJ 1 .ce 1 .ft 2 .if n .ul .ll \\n(LLu .ie \\n(.$ \{\ . if !"\\$1"-" .if !"\\$1"no" \\$1 . if !"\\$1"-" .if !"\\$1"no" .sp\} .el \{\ ABSTRACT .sp\} .hy \\n(HY .ul 0 .ce 0 .fi .ft 1 .nr OJ \\n(.i .in +\\n(.lu/12u .ll -\\n(.lu/12u .br .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .ti +\\n(PIu .. . \"AE - end of an abstract .de AE .br .di .ll \\n(LLu .ps \\n(PS .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp .nr 1T 0 .nr IK 0 .in \\n(OJu .nr AJ 0 .di .ce 0 .if \\n(ST=2 .SY .if \\n(ST<3 .rm SY .. . \"S2 - release paper style . \"SY - cover sheet of released paper .de SY .ll \\n(LLu .ns .if \\n(TV .TX .if \\n(AV .AX .rs .ce 0 .nf .sp 3 .ls 1 .pn 2 .WB .ls .sp 3v \\*(DY .sp |9i .if \\n(FP .FA .FG .if \\n(GA=1 .nr GA 2 .fi .. . \"S2 - first text page, released paper format .de S2 .ce 0 .br .SY .rm SY .bp 1 .if \\n(TV .TX .if \\n(AV .AX .rs .ce 0 .ft 1 .ad \\n(SJ .. . \"S0- mike lesk conserve paper style .de S0 .ce 0 .br .ll \\n(LLu .if \\n(TV+\\n(AV .ns .if \\n(TV .TX .if \\n(AV .AX .if \\n(TV+\\n(AV .rs .ce 0 .if \\n(TV .sp 2 .ls 1 .if \\n(FP \{\ . FJ . nf . FG . fi . FK . nr FP 0\} .nf .WB .ls .fi .ad \\n(SJ .. . \"S3 - CSTR style .de S3 .rs .sp |2.25i .ce 1000 .I1 .if \\n(NA>1 \{\ . sp .5 . I2\} .if \\n(NA>2 \{\ . sp .5 . I3\} .if \\n(NA>3 \{\ . sp .5 . I4\} .if \\n(NA>4 \{\ . sp .5 . I5\} .if \\n(NA>5 \{\ . sp .5 . I6\} .if \\n(NA>6 \{\ . sp .5 . I7\} .if \\n(NA>7 \{\ . sp .5 . I8\} .if \\n(NA>8 \{\ . sp .5 . I9\} .sp |4i . \"check how long title is: can space extra .25 inch if short .di EZ .WT .di .if \\n(dn<1.5v .if \\n(NA=1 .sp .25i .ft 1 Computing Science Technical Report No. \\*(MN .sp .if t .ft 3 .if n .ul 100 .ps 12 .vs 15p .hy 0 .WT .hy \\n(HY .ft 1 .if n .ul 0 .ps 10 .vs 12p .sp .ft 1 .A1 .A2 .A3 .A4 .A5 .A6 .A7 .A8 .A9 .ce 0 .sp |8.5i .ce 0 \\*(DY .DZ .bp 0 .ft 1 .S2 .. . \"SG - signature .de SG .br .KS .in +2u*\\n(.lu/3u .sp 4 .A1 .if \\n(NA>1 .sp 4 .A2 .if \\n(NA>2 .sp 4 .A3 .if \\n(NA>3 .sp 4 .A4 .if \\n(NA>4 .sp 4 .A5 .if \\n(NA>5 .sp 4 .A6 .if \\n(NA>6 .sp 4 .A7 .if \\n(NA>7 .sp 4 .A8 .if \\n(NA>8 .sp 4 .A9 .in .nf .if \\n(.$<1 .G9 .sp -1 .if \\n(.$>=1 \\$1 .if \\n(.$>=2 \\$2 .if \\n(.$>=3 \\$3 .if \\n(.$>=4 \\$4 .if \\n(.$>=5 \\$5 .if \\n(.$>=6 \\$6 .if \\n(.$>=7 \\$7 .if \\n(.$>=8 \\$8 .if \\n(.$>=9 \\$9 .fi .br .KE .. . \"Tables. TS - table start, TE - table end .de TS .br .if !\\n(1T .RT .ul 0 .ti \\n(.iu .if t .sp 0.5 .if n .sp .if \\$1H .TQ .nr IX 1 .. .de TQ .di TT .nr IT 1 .. .de TH .if \\n(.d>0.5v \{\ . nr T. 0 . T# 0\} .di .nr TQ \\n(.i .nr HT 1 .in 0 .mk #a .mk #b .mk #c .mk #d .mk #e .mk #f .TT .in \\n(TQu .mk #T .. .de TE .nr IX 0 .if \\n(IT .if !\\n(HT \{\ . di . nr EF \\n(.u . nf . TT . if \\n(EF .fi\} .nr IT 0 .nr HT 0 .if n .sp 1 .if t .sp 0.5 .rm a+ b+ c+ d+ e+ f+ g+ h+ i+ j+ k+ l+ n+ m+ .rr 32 33 34 35 36 37 38 40 79 80 81 82 .rr a| b| c| d| e| f| g| h| i| j| k| l| m| .rr a- b- c- d- e- f- g- h- i- j- k- l- m- .. .so \*(sd/tmac.skeep .de EQ \"equation, breakout and display .nr EF \\n(.u .rm EE .nr LE 1 \" 1 is center .ds EL \\$1 .if "\\$1"L" \{\ . ds EL \\$2 . nr LE 0\} .if "\\$1"C" .ds EL \\$2 .if "\\$1"R" \{\ . ds EL \\$2 \" 2 is right adjust . nr LE 2\} .if "\\$1"I" \{\ . nr LE 0 . if "\\$3"" .ds EE \\h'|10n' . el .ds EE \\h'\\$3' . ds EL \\$2\} .if \\n(YE .nf .di EZ .. .de EN \" end of a displayed equation .br .di .rm EZ .nr ZN \\n(dn .if \\n(ZN .if !\\n(YE .LP .if !\\n(ZN .if !"\\*(EL"" .nr ZN 1 .if \\n(ZN \{\ . ie "\\n(.z"" \{\ . if t .if !\\n(nl=\\n(PE .sp .5 . if n .if !\\n(nl=\\n(PE .sp 1\} . el \{\ . if t .if !\\n(.d=\\n(PE .sp .5 . if n .if !\\n(.d=\\n(PE .sp 1\}\} 'pc .if \\n(BD .nr LE 0 \" don't center if block display or mark/lineup .if \\n(MK \{\ . if \\n(LE=1 .ds EE \\h'|10n' . nr LE 0\} 'lt \\n(.lu .if !\\n(EP .if \\n(ZN \{\ . if \\n(LE=1 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts . if \\n(LE=2 .tl \(ts\(ts\(ts\\*(10\\*(EL\(ts . if !\\n(LE \{\ . if !\\n(BD .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts . if \\n(BD .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts . if \\n(BD \!\\*(10\\t\\*(EL\}\} .if \\n(EP .if \\n(ZN \{\ . if \\n(LE=1 .tl \(ts\\*(EL\(ts\\*(10\(ts\(ts . if \\n(LE=2 .tl \(ts\\*(EL\(ts\(ts\\*(10\(ts . if !\\n(LE \{\ . if !\\n(BD .tl \(ts\\*(EL\\*(EE\\*(10\(ts\(ts\(ts . if \\n(BD .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts . if \\n(BD \!\\h'-\\\\n(.iu'\\*(EL\\h'|0'\\*(10\}\} 'lt \\n(LLu 'pc % .if \\n(YE .if \\n(EF .fi .if t .if \\n(ZN .sp .5 .if n .if \\n(ZN .sp .ie "\\n(.z"" .nr PE \\n(nl .el .nr PE \\n(.d .. .de PS \" start picture . \" $1 is height, $2 is width, both in inches .if \\$1>0 .sp .35 .ie \\$1>0 .nr $1 \\$1 .el .nr $1 0 .in (\\n(.lu-\\$2)/2u .ne \\$1 .. .de PE \" end of picture .in .if \\n($1>0 .sp .65 .. . \" .P1/.P2 macros for programs . .nr XP 1 \" delta point size for program .nr XV 1p \" delta vertical for programs .nr XT 8 \" delta tab stop for programs .nr DV .5v \" space before start of program . .de P1 .nr P1 .4i \" program indent in .P1 .if \\n(.$ .nr P1 \\$1 .br .nr v \\n(.v .di p1 .in \\n(P1u .nf .ps -\\n(XP .vs -\\n(XVu .ft CW .nr t \\n(XT*\\w'x'u .ta 1u*\\ntu 2u*\\ntu 3u*\\ntu 4u*\\ntu 5u*\\ntu 6u*\\ntu 7u*\\ntu 8u*\\ntu 9u*\\ntu 10u*\\ntu 11u*\\ntu 12u*\\ntu 13u*\\ntu 14u*\\ntu .. . .de P2 .br .ps \\n(PS .vs \\n(VSp .vs \\nvu .ft 1 .in -\\n(P1u .di .br .sp \\n(DVu .br .if \\n(.$=0 .ne \\n(dnu \" -\\n(DVu .nf .p1 .sp \\n(DVu .br .fi .. . .de ME .nr SJ \\n(.j .if \\n(LL .nr LT \\n(LL .nr YE 1 .if !\\n(PO .nr PO \\n(.o .if \\n(mo-0 .ds MO January .if \\n(mo-1 .ds MO February .if \\n(mo-2 .ds MO March .if \\n(mo-3 .ds MO April .if \\n(mo-4 .ds MO May .if \\n(mo-5 .ds MO June .if \\n(mo-6 .ds MO July .if \\n(mo-7 .ds MO August .if \\n(mo-8 .ds MO September .if \\n(mo-9 .ds MO October .if \\n(mo-10 .ds MO November .if \\n(mo-11 .ds MO December .if \\n(dw-0 .ds DW Sunday .if \\n(dw-1 .ds DW Monday .if \\n(dw-2 .ds DW Tuesday .if \\n(dw-3 .ds DW Wednesday .if \\n(dw-4 .ds DW Thursday .if \\n(dw-5 .ds DW Friday .if \\n(dw-6 .ds DW Saturday .nr yP (\\n(yr+2000)/100) .nr yD (\\n(yr%100 .af yD 01 .if "\\*(DY"" .ds DY \\*(MO \\n(dy, \\n(yP\\n(yD .if "\\*(CF"" .if n .ds CF "\\*(DY .. . \"EM end up macro - process left over keep-release .de EM .br .if \\n(AJ .tm Syntax error: no .AE .if \\n(IF .ab Missing .FE somewhere .if t .if \\n(TB=0 .wh -1p CM .if \\n(TB \{\&\c ' bp . NP . ch CM 160\} .. . \"NP new page .de NP .rr PE .if \\n(FM+\\n(HM>=\\n(.p \{\ . tm Margins bigger than page length. . ab . ex\} .if t .CM .if !\\n(HM .nr HM 1i 'sp \\n(HMu/2u .ev 1 .nr PX \\n(.s .nr PF \\n(.f .nr PV \\n(.v .lt \\n(LTu .ps \\n(PS .vs \\n(PS+2 .ft 1 .if \\n(PO .po \\n(POu .PT .ps \\n(PX .vs \\n(PVu .ft \\n(PF .ev 'sp |\\n(HMu .nr XX 0 1 .nr YY 0-\\n(FMu .ch FO 16i .ch FX 17i .ch FO \\n(.pu-\\n(FMu .ch FX \\n(.pu-\\n(FMu .if \\n(MF .FV .nr MF 0 .mk .os .ev 1 .if !\\n(TD .if \\n(TC<5 .XK .nr TC 0 .ns .ev .nr TQ \\n(.i .nr TK \\n(.u .if \\n(IT \{\ . in 0 . nf . TT . in \\n(TQu . if \\n(TK .fi\ \} .mk #T ....if t .if \\n(.o+\\n(LL>7.75i .tm Offset + line length exceeds 7.75 inches, too wide .. .de XK .nr TD 1 .nf .ls 1 .in 0 .rn KJ KL .KL .rm KL .if "\\n(.z"KJ" .di .nr TB 0 .if "\\n(.z"KJ" .nr TB 1 .br .in .ls .fi .if (\\n(nl+1v)>(\\n(.p-\\n(FM) \{\ . if \\n(NX>1 .RC . if \\n(NX<1 .bp\} .nr TD 0 .. .de KD .nr KM 0 .if "\\n(.z"" .if \\$2>0 .if \\n(nl>\\n(HM \{\ . if (\\n(nl+1v)<(\\n(.p-\\n(FM) .di KJ \" full page figure must have new page . sp 15i\} .if "\\n(.z"" .if \\n(nl>\\n(HM .if \\$2=0 .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .sp 15i .if "\\n(.z"KJ" .nr KM 1 \" KM is 1 if in a rediversion of keeps .if \\n(KM>0 \!.KD \\$1 \\$2 .nr KR \\n(.t .if \\n(nl<=\\n(HM .nr KR 32767 .if \\n(KM=0 \{\ . if \\n(KR<\\$1 \{\ . di KJ . nr KM 1\} . if \\$2>0 .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .sp 15i\} .rs .if \\n(KM=0 .if \\$2>0 .sp \\n(.tu-\\$1u .. .de PT .lt \\n(LLu .pc % .nr PN \\n% .if \\n%-1 .tl \\*(LH\\*(CH\\*(RH .lt \\n(.lu .. . \"FO - footer of page .de FO .rn FO FZ .if \\n(IT>0 \{\ . nr T. 1 . if \\n(FC=0 .T# 1 . br\} .nr FC +1 .if \\n(NX<2 .nr WF 0 .nr dn 0 .if \\n(FC<=1 .if \\n(XX .XF .rn FZ FO .nr MF 0 .if \\n(dn .nr MF 1 .if !\\n(WF \{\ . nr YY 0-\\n(FMu . ch FO \\n(YYu\} .if !\\n(dn .nr WF 0 .if \\n(FC<=1 .if \\n(XX=0 \{\ . if \\n(NX>1 .RC . if \\n(NX<1 'bp\} .nr FC -1 .if \\n(ML>0 .ne \\n(MLu .. . \"2C - begin double column .de 2C .MC \" default MC is double column .. .de MC \" multiple columns- arg is line length .nr L1 \\n(LL*7/15 .if \\n(CW>=0 .nr L1 \\n(CWu .if \\n(.$ .nr L1 \\$1n .if \\n(GW>=0 .nr GW \\n(GWu .if \\n(.$>1 .nr GW \\$2n .nr NQ \\n(LL/\\n(L1 .if \\n(NQ<1 .nr NQ 1 .if \\n(NQ>2 .if (\\n(LL%\\n(L1)=0 .nr NQ -1 .if !\\n(1T \{\ . BG . if n .sp 4 . if t .sp 2\} .if \\n(NX=0 .nr NX 1 .if !\\n(NX=\\n(NQ \{\ . RT . if \\n(NX>1 .bp . mk . nr NC 1 . po \\n(POu\} .if \\n(NQ>1 .hy \\n(HY .nr NX \\n(NQ .if \\n(NX>1 .nr CW \\n(L1 .ll \\n(L1u .nr FL \\n(L1u*11u/12u .if \\n(NX>1 .if \\n(GW<0 .nr GW (\\n(LL-(\\n(NX*\\n(L1))/(\\n(NX-1) .nr RO \\n(L1+\\n(GW .ns .. .de RC .ie \\n(NC>=\\n(NX .C2 .el .C1 .. .de C1 .rt .po +\\n(ROu .nr NC +1 .if \\n(NC>\\n(NX .nr NC 1 .nr XX 0 1 .nr YY 0-\\n(FMu .if \\n(MF .FV .ch FX \\n(.pu-\\n(FMu .ev 1 .if \\n(TB .XK .nr TC 0 .ev .nr TQ \\n(.i .if \\n(IT \{\ . in 0 . TT . in \\n(TQu\} .mk #T .ns .. .de C2 .po \\n(POu .nr NC +1 .if \\n(NC>\\n(NX .nr NC 1 'bp .. . \"1C - return to single column format .de 1C .MC \\n(LLu .hy \\n(HY .. .de MH Bell Laboratories Murray Hill, New Jersey 07974 .. .de PY Bell Laboratories Piscataway, New Jersey 08854 .. .de BT .nr PX \\n(.s .nr PF \\n(.f .ft 1 .ps \\n(PS 'lt \\n(LTu .po \\n(POu .if \\n%>0 .tl \(ts\\*(LF\(ts\\*(CF\(ts\\*(RF\(ts .ft \\n(PF .ps \\n(PX .. . \"PP - paragraph .de PP .RT .if \\n(1T .sp \\n(PDu .ti +\\n(PIu .. . \"SH - (unnumbered) section heading .de SH .ti \\n(.iu .RT .ie \\n(1T .sp 1 .el .BG .RT .ne 4 .ft 3 .if n .ul 1000 .. . \"NH - numbered heading .de N{ .RT .ie \\n(1T .sp 1 .el .BG .RT .ne 4 .ft 3 .if n .ul 1000 .nr NS \\$1 .if !\\n(.$ .nr NS 1 .if !\\n(NS .nr NS 1 .nr H\\n(NS +1 .if !\\n(NS-4 .nr H5 0 .if !\\n(NS-3 .nr H4 0 .if !\\n(NS-2 .nr H3 0 .if !\\n(NS-1 .nr H2 0 .if !\\$1 .if \\n(.$ .nr H1 1 .ds SN \\n(H1. .ti \\n(.iu .if \\n(NS-1 .as SN \\n(H2. .if \\n(NS-2 .as SN \\n(H3. .if \\n(NS-3 .as SN \\n(H4. .if \\n(NS-4 .as SN \\n(H5. .. .de NH .N{ \\$1 \\*(SN .. . \"BG - begin, execute at first PP .de BG .br .ME .rm ME .di .ce 0 .nr KI 0 .hy \\n(HY .nr 1T 1 .nr CS 0 .S\\n(ST .rm S0 S1 S2 S3 OD OK TX AX WT CS TM IM MF MR RP I1 I2 I3 I4 I5 CB E1 E2 .de TL .ft 3 .sp .if n .ul 100 .ce 100 .ps +2 \\.. .de AU .ft 2 .if n .ul 0 .ce 100 .sp .NL \\.. .de AI .ft 1 .ce 100 .if n .ul 0 .if n .sp .if t .sp .5 .NL \\.. .RA .rm RA .rn FJ FS .rn FK FE .nf .ev 1 .ps \\n(PS-2 .vs \\n(.s+2p .ev .if !\\n(KG .nr FP 0 .if \\n(GA>1 .if \\n(KG=0 .nr GA 0 \" next UNIX must be flagged. .nr KG 0 .if \\n(FP \{\ . FS . FG . FE\} .br .if n .if \\n(TV .sp 2 .if t .if \\n(TV .sp 1 .fi .ll \\n(LLu .ev 1 .if !\\n(FL .nr FL \\n(LLu*11u/12u .ll \\n(FLu .ev .. .de RA \"redefine abstract macros .de AB .br .if !\\n(1T .BG .ce 1 .sp 1 .ie \\n(.$ \{\ . if !"\\$1"-" .if !"\\$1"no" \{\ \\$1 .sp\}\} .el \{\ ABSTRACT .sp\} .sp 1 .nr AJ 1 .in +\\n(.lu/12u .ll -\\n(.lu/12u .RT \\.. .de AE .nr AJ 0 .br .in 0 .ll \\n(LLu .ie \\n(VS>=41 .vs \\n(VSu .el .vs \\n(VSp \\.. .. . \"IP - indented paragraph .de IP .RT .if !\\n(IP .nr IP +1 .ie \\n(ID>0 .sp \\n(IDu .el .sp \\n(PDu .nr IU \\n(IR+1 .if \\n(.$>1 .nr I\\n(IU \\$2n+\\n(I\\n(IRu .if \\n(I\\n(IU=0 .nr I\\n(IU \\n(PIu+\\n(I\\n(IRu .in \\n(I\\n(IUu .nr TY \\n(TZ-\\n(.i .nr JQ \\n(I\\n(IU-\\n(I\\n(IR .ta \\n(JQu \\n(TYuR .if \\n(.$ \{\ .ti \\n(I\\n(IRu \&\\$1\t\c .\} .. . \"LP - left aligned (block) paragraph .de LP .ti \\n(.iu .RT .if \\n(1T .sp \\n(PDu .. .de QP .ti \\n(.iu .RT .if \\n(1T .sp \\n(PDu .ne 1.1 .nr QP 1 .in +\\n(QIu .ll -\\n(QIu .ti \\n(.iu .. . \"IE - synonym for .LP .de IE .LP .. . \"RS - prepare for double indenting .de RS .nr IS \\n(IP .RT .nr IP \\n(IS .nr IU \\n(IR .nr IR +1 .if !\\n(I\\n(IR .nr I\\n(IR \\n(I\\n(IU+\\n(PIu .in \\n(I\\n(IRu .nr TY \\n(TZ-\\n(.i .ta \\n(TYuR .. . \"RE - retreat to the left .de RE .nr IS \\n(IP .RT .nr IP \\n(IS .if \\n(IR>0 .nr IR -1 .in \\n(I\\n(IRu .. .de TC .nr TZ \\n(.lu .if \\n(.$ .nr TZ \\$1n .ta \\n(TZuR .. .de TD .LP .nr TZ 0 .. . \"CM - cut mark .de CM .po 0 .lt 7.6i .ft 1 .ps 10 .vs 4p .if "\\*(.T"aps" .tl '--''--' .po .vs .lt .ps .ft .. . \" fontname(CW) fontstr(\f(CW) first_arg goes_after goes_before .de OF \" this is completely WRONG if any argument contains "'s .nr PQ \\n(.f .hy 0 .if t .if "\\$3"" .ft \\$1 .if t .if !"\\$3"" \{\ \&\\$5\\$2\\$3\\f\\n(PQ\\$4 .hy \\n(HY\} .if n \{\ . if \\n(.$=5 \&\\$5 . ie "\\$3"" .ul 1000 . el .ul 1 . if \\n(.$=3 \&\\$3 . if \\n(.$>3 \&\\$3\\c . if \\n(.$>3 \&\\$4 . hy \\n(HY\} .. . \"B - bold font .de B .OF 3 \\f3 "\\$1" "\\$2" "\\$3" .. .de BI \" bold italic -- only on 202 .OF 4 \\f4 "\\$1" "\\$2" "\\$3" .. . \"R - Roman font .de R .nr PQ \\n(.f .ft 1 .ie \\n(.$>0 \&\\$1\f\\n(PQ\\$2 .el .if n .ul 0 .. . \"I - italic font .de I .OF 2 \\f2 "\\$1" "\\$2" "\\$3" .. . \"CW - constant width font .de CW .nr PQ \\n(.f .if t .if \\n(.$>0 \%\&\\$3\f(CW\\$1\f\\n(PQ\&\\$2 .if t .if \\n(.$=0 .OF CW \\f(CW "\\$1" "\\$2" "\\$3" .if n .OF CW \\f(CW "\\$1" "\\$2" "\\$3" .. . \"TA - tabs set in ens or chars .de TA .ta \\$1n \\$2n \\$3n \\$4n \\$5n \\$6n \\$7n \\$8n \\$9n .. . \"SM - make smaller size .de SM .ie \\n(.$ \&\\$3\s-2\\$1\s0\\$2 .el .ps -2 .. . \"LG - make larger size .de LG .ps +2 .. . \"NL - return to normal size .de NL .ps \\n(PS .. . \"DA - force date; ND - no date or new date. .de DA .if \\n(.$ .ds DY \\$1 \\$2 \\$3 \\$4 .ds CF \\*(DY .. .de ND .ME .rm ME .ds DY \\$1 \\$2 \\$3 \\$4 .rm CF .. .de FN .FS .. . \"FS - begin footnote .de FJ 'ce 0 .nr IA \\n(IP .nr IB \\n(.i .ev1 .ll \\n(FLu .da FF .br .if \\n(IF \{\ . tm Footnote within footnote-illegal. . ab\} .nr IF 1 .if !\\n+(XX-1 .FA .. . \"FE - footnote end .de FK .br .in 0 .nr IF 0 .di .ev .if !\\n(XX-1 .nr dn +\\n(.v .nr YY -\\n(dn .if !\\n(NX .nr WF 1 .if \\n(dl>\\n(CW .nr WF 1 .ie (\\n(nl+\\n(.v)<=(\\n(.p+\\n(YY) .ch FO \\n(YYu .el \{\ . if \\n(nl>(\\n(HM+1.5v) .ch FO \\n(nlu+\\n(.vu . if \\n(nl+\\n(FM+1v>\\n(.p .ch FX \\n(.pu-\\n(FMu+2v . if \\n(nl<=(\\n(HM+1.5v) .ch FO \\n(HMu+(4u*\\n(.vu)\} .nr IP \\n(IA 'in \\n(IBu .. .\" First page footer. .de FS .ev1 .br .ll \\n(FLu .da FG .. .de FE .br .di .nr FP \\n(dn .if !\\n(1T .nr KG 1 \"not in abstract repeat next page. .if "\\n(.z"OD" .nr KG 0 \" if in OK, don't repeat. .ev .. .de FA .if n __________________________ .if t \l'1i' .br .. .de FV .FS .nf .ls 1 .FY .ls .fi .FE .. .de FX .if \\n(XX \{\ . di FY . ns\} .. .de XF .if \\n(nlu+1v>(\\n(.pu-\\n(FMu) .ch FX \\n(nlu+1.9v .ev1 .nf .ls 1 .FF .rm FF .nr XX 0 1 .br .ls .di .fi .ev .. .de FL .ev1 .nr FL \\$1n .ll \\$1 .ev .. .de HO Bell Laboratories Holmdel, New Jersey 07733 .. .de WH Bell Laboratories Whippany, New Jersey 07981 .. .de IH Bell Laboratories Naperville, Illinois 60540 .. .de UL \" underline argument, don't italicize .ie t \\$1\l'|0\(ul'\\$2 .el .I "\\$1" "\\$2" .. .de UX .ie \\n(GA \\$2\s-1UNIX\s0\\$1 .el \{\ .ie n \{\\$2UNIX\\$1* .FS * UNIX is a .ie \\$3=1 Footnote .el registered trademark of X/Open. .FE\} .el \\$2\s-1UNIX\\s0\\$1\\f1\(rg\\fP .nr GA 1\} .. .de US the .UX operating system\\$1 .. .de QS .br .LP .in +\\n(QIu .ll -\\n(QIu .. .de QE .br .ll +\\n(QIu .in -\\n(QIu .LP .. .de B1 \" begin boxed stuff .br .di BB .nr BC 0 .if "\\$1"C" .nr BC 1 .nr BE 1 .. .de B2 \" end boxed stuff .br .nr BI 1n .if \\n(.$>0 .nr BI \\$1n .di .nr BE 0 .nr BW \\n(dl .nr BH \\n(dn .ne \\n(BHu+\\n(.Vu .nr BQ \\n(.j .nf .ti 0 .if \\n(BC>0 .in +(\\n(.lu-\\n(BWu)/2u .in +\\n(BIu .ls 1 .BB .ls .in -\\n(BIu .nr BW +2*\\n(BI .sp -1 \l'\\n(BWu\(ul'\L'-\\n(BHu'\l'|0\(ul'\h'|0'\L'\\n(BHu' .nr BW -2*\\n(BI .if \\n(BC>0 .in -(\\n(.lu-\\n(BWu)/2u .if \\n(BQ .fi .br .. .de AT .nf .sp .ne 2 Attached: .. .de CT .nf .sp .ne 2 .ie \\n(.$ Copy to \\$1: .el Copy to: .. .de BX .ie t \(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul' .el \(br\\kA\|\\$1\|\\kB\(br\v'-1v'\h'|\\nBu'\l'|\\nAu'\v'1v'\l'|\\nAu' .. .IZ .rm IZ .de [ [ .. .de ] ] .. 9base-6/troff/tmac/mmn0000644000175000017500000011724111402154555014332 0ustar anselmanselm'\" Copyright (c) 1984 AT&T '\" All Rights Reserved '\"#ident "@(#)macros:mmn.src 11.45a" .nr:a 0 1 .nr:b 0 .nr:c 0 .nr:d 0 .nr:e 0 .nr:f 0 .nr:g 0 1 .nr:h 1 .nr:u 0 .nr!X 0 .nr;p 1 .nr!0 0 .nr!1 0 .nr!2 0 .nr!3 0 .nr!N 0 .nr;X 0 .nr!V 0 .nr!Y 0 .nr!6 0 .nr!8 0 .nr!9 0 .nr!M 0 .so #9/tmac/strings.mm .if\*(]S .ds ]S \*(}Z .dsBU \(bu .dsEM \%-- .dsF \u\\n+(:p\d .dsHF 2 2 2 2 2 2 2 .dsLf LIST OF FIGURES .dsLt LIST OF TABLES .dsLx LIST OF EXHIBITS .dsLe LIST OF EQUATIONS .dsRE 10.129 .dsRf \u[\\n+(:R]\d .dsRp REFERENCES .dsTm \uTM\d .nrAu 1 .nrCp 0 .nrCl 2 .nrDs 1v .nrEc 0 1 .nrEq 0 .nrEx 0 1 .nrDe 0 .nrDf 5 .nrFg 0 1 .nrFs 1 .nrH1 0 1 .nrH2 0 1 .nrH3 0 1 .nrH4 0 1 .nrH5 0 1 .nrH6 0 1 .nrH7 0 1 .nrHb 2 .nrHi 1 .nrHs 2 .nrHu 2 .nrHy 0 .nrLe 0 .nrLf 1 .nrLi 6 .nrLs 6 .nrLt 1 .nrLx 1 .nrNp 0 .nrOc 0 .nrOf 0 .nr!4 0 1 .af!4 01 .nrPi 5 .nrPs 1 .nrPt 0 .nrPv 0 .nrRf 0 .nrSi 5 .nrTb 0 1 .deRD 'fl .di}w .rd\\$1 .br .di .ie\w\\$3 \{\ .di}x .ds\\$3 "\\*(}w .br .di 'br\} .if\w\\$2 .rn }w \\$2 .rm}w }x .. .deB .ie\\n(.$ .nr ;G \\n(.f .el.ft 3 .if\\n(.$ .if !\\n(.$-2 \&\f3\\$1\fP\\$2 .if\\n(.$-2 \{.ds }i .if\\n(.f2 .ds }i \^ .ds}I \&\f3\\$1\fP\\$2\\*(}i 'br\} .if\\n(.$-2 .if !\\n(.$-4 \\*(}I\f3\\$3\fP\\$4 .if\\n(.$-4 \\*(}I\f3\\$3\fP\\$4\\*(}i\f3\\$5\fP\\$6\\$7\\$8\\$9 .if\\n(.$ .ft \\n(;G .. .deI .ie\\n(.$ .nr ;G \\n(.f .el.ft 2 .if\\n(.$ .if !\\n(.$-1 \&\f2\\$1 .if\\n(.$-1 \{.ds }i \^ .if\\n(.f2 .ds }i .ds}I \& .if\w\\$1 .ds }I \&\f2\\$1\fP\\*(}i 'br\} .if\\n(.$-1 .if !\\n(.$-3 \\*(}I\\$2\f2\\$3 .if\\n(.$-3 .if !\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5 .if\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5\fP\\*(}i\\$6\\$7\\$8\\$9 .if\\n(.$ .ft \\n(;G .. .deRI .nr;G \\n(.f .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .deRB .nr;G \\n(.f .}S 1 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .deIR .nr;G \\n(.f .}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .deIB .nr;G \\n(.f .}S 2 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .deBR .nr;G \\n(.f .}S 3 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .deBI .nr;G \\n(.f .}S 3 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6\\$7\\$8\\$9" .. .de}S .ds}i .if\\$12 .if !\\$5 .ds }i\^ .ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(}i" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" .el\\$3 .ft\\n(;G .. .deSM .nr;S \\n(.s .ps .nr;G \\n(.s .ps .ie\\n(.$-2 \&\\$1\s-1\\$2\s+1\\$3 .el\&\s-1\\$1\s+1\\$2 .ps\\n(;G .ps\\n(;S .. .deR .ft1 .ul0 .. .deEQ .if\\n%>0 .br .ds]E \\$1 .di>E .. .deEN \!.br .br .di .rm>E .lt\\n(.lu .pc .if\w\\*(10\\*(}E \{\ .ie!\\n(Eq \{\ .ie\\n(:Y>0 \{.if \\n(:Y<\w\\*(10 .nr :Y \w\\*(10 \!\\*(10\h'\\\\n(.lu-\w\\*(10\\*(]Eu-\\\\n(.iu'\\*(]E .br\} .el.ie \\n(:B=2 .tl \(ts\(ts\\*(10\(ts\\*(]E\(ts .el.ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(10\(ts\(ts\\*(]E\(ts .el.if \\n(:B=0 .tl \(ts\\*(10\(ts\(ts\\*(]E\(ts 'br\} .el\{\ .ie\\n(:Y>0 \{.if \\n(:Y<\w\\*(10 .nr :Y \w\\*(10 \!\\\\h'-\\\\n(.iu'\\*(]E\\\\h'\\\\n(.iu-\\w\\*(]Eu'\\*(10 .br\} .el.ie \\n(:B=2 .tl \(ts\\*(]E\(ts\\*(10\(ts\(ts .el.ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(]E\(ts\(ts\\*(10\(ts .el.if \\n(:B=0 .tl \(ts\\*(]E\(ts\(ts\\*(10\(ts 'br\} \} .pc% .lt .rm]E 10 .rr:E .. .deHC .ev0 .hc\\$1 .ev .ev1 .hc\\$1 .ev .ev2 .hc\\$1 .ev .. .deH .if\\n(:F .)D "H:missing FE" .if\\n(:y .)D "H:missing DE" .if!\\n(.$ .)D "H:missing arg" .nr;0 0 .if\\$1-7 .nr ;0 1 .if\w\\$1-\w'0'u .nr ;0 1 .if\\n(;0 .)D "H:bad arg:\\$1" .LC 0 .br .)R .nr;1 0\\$1 .if!0\\$1 .nr ;1 \\n(Hu .if!\\n(;1 .)D "H:bad arg:\\$1" .if2-\\n(;1 .nr H2 0 1 .if3-\\n(;1 .nr H3 0 1 .if4-\\n(;1 .nr H4 0 1 .if5-\\n(;1 .nr H5 0 1 .if6-\\n(;1 .nr H6 0 1 .if7-\\n(;1 .nr H7 0 1 .if2-\\n(;1 \{.if \\n(:S .)w .if\\n(:C .nr :p 0 1 \} .SP .nr:u 0 .if\\n(;1-1 .nr H\\n(;1 +1 .if!\\n(;1-1 \{.nr :u 1 .SP 2 \} .if\\n(;1-1 .if (\\n(Ej+1-\\n(;1)&(\\n(;L) \{ .bp .nr;L 0\} .if\\n(;1-1 .if (\\n(Ej+1-\\n(;1)&(\\n(nl-\\n(:J) \{.if \\n(;C .nr ;C 2 .bp\} .if!\\n(;1-1 \{.if (\\n(Ej+\\n(:S)&(\\n(nl-\\n(:J) \{.if \\n(;C .nr ;C 2 .bp\} .if!\\n(:u-1 .nr H1 +1 .if(\\n(:u=1)&(\\n(:S=1) .nr P 1 \} .nr:u 0 .ds}0 \\n(H1. .if0\\$1-1 .as }0 \\n(H2 .if0\\$1-2 .as }0 .\\n(H3 .if0\\$1-3 .as }0 .\\n(H4 .if0\\$1-4 .as }0 .\\n(H5 .if0\\$1-5 .as }0 .\\n(H6 .if0\\$1-6 .as }0 .\\n(H7 .if\\n(Ht \{.)I \\n(;1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .ds}0 \\*(}3. 'br\} .as}0 \ \ .if!0\\$1 .ds }0 .nr;0 0 .if!\\n(;1-\\n(Hb .nr ;0 1 .if!\\n(;1-\\n(Hs .nr ;0 2 .ds}2 .if!\\n(;0 .if \w\\$2 .ds }2 " .nr;3 2v .HX \\n(;1 0\\$1 "\\$2\\$3" .if\\$1<3 .nr !5 0 1 .af!5 01 .if(\\$1=1)&(\\n(Np=1) .nr !4 0 .di>A \&\\*(}0\\$2\\$3\\*(}2 .br .di .rm>A .if\\n(;0-1 .nr ;3 +1v .ne\\n(;3u+\\n(dnu+\\n(;0v .HY \\n(;1 0\\$1 "\\$2\\$3" .if\\n(;0 .na .)I \\n(;1 \\*(HF .nr;3 1 .nr;3 \\*(}3-1 .nr;2 \w\\*(}0 .if\\n(;0 \{.in+\\n(;2u .ti-\\n(;2u \} .nr;2 \\n(.i .if!\\n(;1-\\n(Hc .if \\n(;0 .ce \\*(}0\&\c .ds}1 cu .if\\nU .ds }1 ul .if\w\\*(}0\\$2-\\n(.l .ds }1 ul .if\w\\*(}0\\$2u>166m .ds }1 ul .if!\\n(;3 .ds }1 .nr;s \\n(.f .if\\n(;3=2 .ds }1 "ft 3 '\\*(}1 .ie\\n(;0 \{\ \&\\$2\\$3 'in 'br\} .el\{\&\\$2\&\c \&\\$3\\*(}2\&\c 'br\} .if\\n(;3=2 .ft \\n(;s .if(\\n(;1<=\\n(Cl)&(\w\\$2>0) .)E \\$1 "\\$2" 'na .if\\n(:h 'ad .if\\n(;0 .br .if\\n(;0-1 .SP .if\\n(;0*\\n(Hi*\\n(Pt .if !\\n(Hi-1+\\n(Pt-1 .ti+\\n(Pin .if0\\$1*\\n(;0 .if \\n(Hi-1 .ti\\n(;2u .nr:I 1 .nr!D \\n(nl .nr!Z \\n(.k .if(0\\$1=1)&(\\nN=5) \{\ .nrFg 0 .nrTb 0 .nrEc 0 .nrEx 0 \} .HZ \\n(;1 0\\$1 "\\$2\\$3" .ft1 .. .deHM .afH1 \\$1 1 .afH2 \\$2 1 .afH3 \\$3 1 .afH4 \\$4 1 .afH5 \\$5 1 .afH6 \\$6 1 .afH7 \\$7 1 .. .deHU .if!\\n(.$ .)D "HU:missing arg" .H 0 "\\$1" "\\$2" .. .deLB .if4-\\n(.$ .)D "LB:missing arg(s)" .)L 0\\$1n 0\\$2n 0\\$3n "\\$4" "\\$5" "\\$6" "\\$7" .. .de)L .if\\n(:g>5 .)D "LB:too many nested lists" .if\\n(:g .)A .if!\\n+(:g-1 .ds ]b \\n(.i .nr:b \\n(.iu+0\\$1u .nr:c \\n(.iu+0\\$2u .nr:d 0\\$3 .nr:e 0\\$4 .nr:f 0\\$6 .if!\w\\$6 .nr :f 1 .ds]g \\$5 .if!\w\\$5 \{.ds ]g \& .if\\n(:e .ds ]g 1 'br\} .nr:a 0 1 .if0\\$4 .af :a \\$5 1 .if(\\n(:g<=\\n(Ls)&(0\\$7) .SP .fi .in\\n(:bu .ti\\n(:bu .. .deLC .if\\n(:g-0\\$1 .)B .if\\n(:g-0\\$1 .LC 0\\$1 .. .deLE .if(\\n(:I>1)&(\\n(nl-\\n(:J) .nr :I 0 .if\\n(:I<2 .nr :I 0 .ie\\n(:g<1 .)D "LE:mismatched" .el.)B .if(\\n(:g<=\\n(Ls)&(\\n(.$>0) .SP .nr:J \\n(nl .. .deLI .if!\\n(:g .)D "LI:no lists active" .if(\\n(:g<=\\n(Ls)&(\\n(:f>0) .SP .in\\n(:bu .if\\n(:F 'in 0 .if(\\n(:f>0)&(\\n(:D<1) .ne2v .ds}0 \\*(]g .if\\n(:e .ds }0 \\n+(:a. .if\\n(:e-1 .ds }0 \\n(:a) .if\\n(:e-2 .ds }0 (\\n(:a) .if\\n(:e-3 .ds }0 [\\n(:a] .if\\n(:e-4 .ds }0 <\\n(:a> .if\\n(:e-5 .ds }0 {\\n(:a} .if\\n(.$-1 .ds }0 \\$1\ \\*(}0 .if\\n(.$=1 .ds }0 \\$1 .nr;0 \w\\*(}0 .nr;1 \\n(:c .if\\n(:d .nr ;1 \\n(:bu-\\n(:du-\\n(;0u .if!\\n(;1 .nr ;1 0 .nr;0 \\n(:bu-\\n(;1u-\\n(;0u .ti\\n(;1u .if!\\n(;0 .nr ;0 \w u .if\w\\*(}0 \&\\*(}0\h\\n(;0u\&\c .. .deAL .nr!D 0 .if!\\$1 .if !\\$11 .if !\\$1a .if !\\$1A .if !\\$1I .if !\\$1i .)D "AL:bad arg:\\$1" .if\\n(.$<3 \{.ie \w\\$2=0 .)L \\n(Lin 0 2n 1 "\\$1" .el.LB 0\\$2 0 2 1 "\\$1" \} .if\\n(.$>2 \{.ie \w\\$2=0 .)L \\n(Lin 0 2n 1 "\\$1" 0 1 .el.LB 0\\$2 0 2 1 "\\$1" 0 1 \} .. .deBL .nr;0 \\n(Pi .if(\\n(.$>0)&(\w\\$1>0) .nr ;0 0\\$1 .ie\\n(.$<2 .LB \\n(;0 0 1 0 \\*(BU .el.LB \\n(;0 0 1 0 \\*(BU 0 1 .rr;0 .. .deDL .nr;0 \\n(Pi .if(\\n(.$>0)&(\w\\$1>0) .nr ;0 0\\$1 .ie\\n(.$<2 .LB \\n(;0 0 1 0 \(em .el.LB \\n(;0 0 1 0 \(em 0 1 .rr;0 .. .deML .if\\n(.$<1 .)D "ML:missing arg" .nr;0 \w\\$1u/3u/\\n(.su+1u .ie\\n(.$<2 .LB \\n(;0 0 1 0 "\\$1" .el.if \\n(.$=2 .LB 0\\$2 0 1 0 "\\$1" .if\\n(.$>2 \{.if !\w\\$2 .LB \\n(;0 0 1 0 "\\$1" 0 1 .if\w\\$2 .LB 0\\$2 0 1 0 "\\$1" 0 1 \} .. .deRL .nr;0 6 .if(\\n(.$>0)&(\w\\$1>0).nr ;0 0\\$1 .ie\\n(.$<2 .LB \\n(;0 0 2 4 .el.LB \\n(;0 0 2 4 1 0 1 .rr;0 .. .deVL .if\\n(.$<1 .)D "VL:missing arg" .ie\\n(.$<3 .LB 0\\$1 0\\$2 0 0 .el.LB 0\\$1 0\\$2 0 0 \& 0 1 .. .deP .if!((\\n(!D=\\n(nl)&(\\n(!Z=\\n(.k)&(\\n(Np=0)) \{\ .br .nr;1 \\n(:J .nr;2 \\n(nl .SP \\n(Psu*1 .if!\\n(:D .ne 2 .ie!\\n(;1-\\n(:J .nr ;2 \\n(;2-\\n(:J .el.nr ;2 \\n(nl-\\n(:J .nr:J \\n(;2 .if\\n(.$>0&(0\\$1) .ti+\\n(Pin .if\\n(.$=0 \{\ .if\\n(Pt=1 .ti+\\n(Pin .if\\n(Pt>1&(\\n(:I) .ti+\\n(Pin .if\\n(Pt>1&(\\n(:I=0)&(\\n(:J>0) .ti+\\n(Pin \} .if\\n(Np \{\ \\n(H1.\\n+(!4\ \ \c 'br\} .nr:I 1 \} .nr:u 0 .. .denP .P 0 .de)p 'ti6n .de)p 'ti0 .rm)p .wh\\n(.du+\\n(.L+\\n(.L \\\\.. .ch)p \\n(.du+\\n(.L+\\n(.L \\.. .wh\\n(.du+\\n(.L )p \\n(H2.\\n+(!5\h'|6n'\\c .. .deS .if!\\n(:Q .nr :Q \\nS .if!\\n(.$ .nr ;0 \\n(:Q .if\\n(.$ .if !\w\\$1 \{\ .nr;J 2 .nr;0 \\n(:P \} .if\w\\$1 \{\ .ie\\$1D \{\ .nr;J 1 .nr;0 \\nS \} .el\{\ .ie\\$1C \{\ .nr;J 2 .nr;0 \\n(:P \} .el\{\ .ie\\$1P \{\ .nr;J 3 .nr;0 \\n(:Q \} .el\{.if !\\n(;J \{\ .nr;0 \\n(:P .nr;0 \\$1 \}\}\}\}\} .if0\\$1-99 .nr ;0 \\nS .if!\\n(;0 .)D "S:bad arg \\$1" .nr:Q \\n(:P .nr:P \\n(;0 .ps\\n(:Pp .nr;J 0 .if!\\n(!Q .nr !Q \\nS+2 .if!\\n(.$-1 \{\ .ie\\n(.$ \{\ .nr;K 1 .nr;7 \\n(.s+2 \} .el\{\ .nr;K 3 .nr;7 \\n(!Q \}\} .if\\n(.$-1 .if !\w\\$2 \{\ .nr;K 2 .nr;7 \\n(!P \} .if\w\\$2 \{\ .ie\\$2D \{\ .nr;K 1 .nr;7 \\n(.s+2 \} .el\{\ .ie\\$2C \{\ .nr;K 2 .nr;7 \\n(!P \} .el\{\ .ie\\$2P \{\ .nr;K 3 .nr;7 \\n(!Q \} .el\{.if !\\n(;K \{\ .nr;7 \\n(!P .nr;7 \\$2 \}\}\}\}\} .if0\\$2-99 .nr ;7 \\n(.s+2 .if!\\n(;7 .)D "S:bad arg \\$2" .nr!Q \\n(!P .nr!P \\n(;7 .vs\\n(!Pp .nr;K 0 .. .rnpn ]N .depn .nr:Z 1 .]N \\$1 .. .deSA .if\\n(.$ \{.if \\$1-1 .)D "SA:bad arg:\\$1" .nr:h 0\\$1 \} 'na .if\\n(:h 'ad .. .deSK .br .nr;d 1 .bp .nr;9 0\\$1-1 .if\\n(;9+1 .rs .if\\n(;9+1 .SK \\n(;9 .rr;9 .nr;d 0 .. .deOP .SK .if!\\nP%2 .SK 1 .. .deSP .br .ie\\n(:D .)S \\$1 .el.ie !'\\n(.z'' .)S \\$1 .el\{.rr ;D ;E .nr;4 1v .if\\n(.$ .nr ;4 \\$1v .if!(\\n(nl=\\n(:N) .nr :A 0 .nr;4 -\\n(:Au .if\\n(;4 \{.sp\\n(;4u .nr:A +\\n(;4u \} .nr:N \\n(nl \} .. .de)S .br .if!'\\n(.z'\\*(}D' .rr ;D ;E .nr;4 1v .if\\n(.$ .nr ;4 \\$1v .if!(\\n(.d=\\n(;D) .nr ;E 0 .nr;4 -\\n(;Eu .if\\n(;4 \{.sp\\n(;4u .nr;E +\\n(;4u \} .nr;D \\n(.d .ds}D \\n(.z .. .deTS .if(\\n(:D=0)&(\\n(Ds>0) .SP .if\\$1H \{.br 'ne5v .wh\\n(nlu+\\n(.tu-2v #f .di>t .nr;A 1 \} .. .deTH .if\\n(.du>0.5v \{.nr T. 0 .T# 0 \} .br .di .nr;I \\n(.i .nr;B 1 .if\\n(;T .if !\\$1N .nr ;T 0 .in0 .mk#a .mk#b .mk#c .mk#d .mk#e .mk#f .if\\n(;T=0 \{\ .>t .nr;T 1 \} .in\\n(;Iu .mk#T .. .deTE .if(\\n(:D=0)&(\\n(Ds>0) .SP .if(\\n(;A>0)&(\\n(;B=0) \{.br .di .)D "TE: used TS H but no TH" \} .rr;A ;B ;h ;D ;E .rmT# .rr#a .rma+ b+ c+ d+ e+ f+ g+ h+ i+ j+ k+ l+ n+ m+ .rr32 33 34 35 36 37 38 40 79 80 81 82 .rra| b| c| d| e| f| g| h| i| j| k| l| m| .rra- b- c- d- e- f- g- h- i- j- k- l- m- .. .de)A .af:a 1 .ds]a \\n(:a \\*(]a .ds]b \\n(:b \\*(]b .ds]c \\n(:c \\*(]c .ds]d \\n(:d \\*(]d .ds]e \\n(:e \\*(]e .ds]f \\n(:f \\*(]f .ds]h \\*(]g \\*(]h .. .de)B .br .nr:g -1 .)C nr :a ]a \\*(]a .)C nr :b ]b \\*(]b 'in\\n(:bu 'ti\\n(:bu .)C nr :c ]c \\*(]c .)C nr :d ]d \\*(]d .)C nr :e ]e \\*(]e .)C nr :f ]f \\*(]f .)C ds ]g ]h \\*(]h .af:a 1 .if\\n(:e .af :a \\*(]g .. .de)C .\\$1 \\$2 \\$4 .ds\\$3 \\$5 \\$6 \\$7 \\$8 \\$9 .. .de)D 'di 'di .nr:D 0 .fl ******************** .br ERROR:(\\n(.F)input line \\n(.c:\\$1 .br ******************** .tm******************** .tmERROR:(\\n(.F)input line \\n(.c:\\$1 .tm******************** .if!\\nD .ab \& .. .deEC .nr!2 1 .ie\\nN=5 .)F Equation 2 \\n+(Ec "\\$1" "\\n(H1-" 0 .el.)F Equation 2 \\n+(Ec "\\$1" "\\$2" 0\\$3 .. .deEX .nr!3 1 .ie\\nN=5 .)F Exhibit 3 \\n+(Ex "\\$1" "\\n(H1-" 0 .el.)F Exhibit 3 \\n+(Ex "\\$1" "\\$2" 0\\$3 .. .deFG .nr!0 1 .ie\\nN=5 .)F Figure 0 \\n+(Fg "\\$1" "\\n(H1-" 0 .el.)F Figure 0 \\n+(Fg "\\$1" "\\$2" 0\\$3 .. .deTB .nr!1 1 .ie\\nN=5 .)F TABLE 1 \\n+(Tb "\\$1" "\\n(H1-" 0 .el.)F TABLE 1 \\n+(Tb "\\$1" "\\$2" 0\\$3 .. .de)F .nr;0 \w\\$5 .nr;1 0 .nr;1 0\\$6 .ds}0 \\$3 .if\\n(;0 .ds }0 \\$5\\$3 .if\\n(;1*\\n(;0 .ds }0 \\$3\\$5 .if\\n(;1-1*\\n(;0 .ds }0 \\$5 .ds}0 \\$1\ \\*(}0 .ie(\w\\$4)&(\\n(Of=0) .as }0 .\ \ .el.if \\n(Of .as }0 " -\ .nr;0 \w\\*(}0 .ll\\nWu .nr;1 \\n(.lu-\\n(;0u-\w\\$4u+1u .if(\\n(:B<2)&(\\n(;1>0) \{\ .in0 .ce\} .if!\\n(;1 \{\ .if!\\n(.u .nr ;U 1 .if\\n(:B=2 .ce 0 .fi .in\\n(;0u .ti-\\n(;0u \} \f3\\*(}0\fP\\$4 .ll .in .if\\n(:B=2 .ce 9999 .if\\n(;U \{\ .nf .nr;U 0 \} .if(\\n(Lf=1&(\\$2=0)):(\\n(Lt=1&(\\$2=1)):\ (\\n(Le=1&(\\$2=2)):(\\n(Lx=1&(\\$2=3)) \{\ .ds}3 .if\\n(:S .ds }3 \\n(H1 .ie\\n(:y=1 \{\ .ie\\n(:B=3 \{\ \!\\!.am >L \!\\!.if \\$2=\\\\\\\\\\\\\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\\\\\\\nP \\*(}3 \!\\!\\\\.. 'br\} .el\{\ \!.am >L \!.if \\$2=\\\\\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\\\nP \\*(}3 \!\\\\.. 'br\} \} .el\{\ .am>L .if\\$2=\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\nP \\*(}3 \\.. \} \} .. .de)I .nr;3 0\\$1+1 .ds}3 \\$\\n(;3 .. .de)E .ds}3 .if\\n(:S .ds }3 \\n(H1 .am>C .)T \\n(;1 \\$1 "\\*(}0" "\\$2" \\nP \\*(}3 \\.. .. .de)T .nr;0 \w\\$5 .if\w\\$6 .nr ;0 +\w'-'u+\w\\$6u .if\\n(;0-\\n(:a .nr :a \\n(;0 .)I \\$1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .if\w\\$3-\\*(}3 .nr H\\$1 \w\\$3 .. .de)U .if!0\\$1-\\n(:b .sp\\n(:c .)I \\$1 \\*(}0 .nr;0 \\*(}3 .)I \\$1 \\*(Ci .nr;1 \\*(}3 .)I \\$1 \\*(}2 .nr;2 \\*(}3 .ds}3 \\$5 .if\\n(.$-5 .ds }3 \\$6\-\\$5 .nr:e \\n(:au-\w\\*(}3u+2n .ds}3 \h\\n(:eu\\*(}3 .ds}y .nr;0 -\w\\$3 .if\\n(;0 .as }y \h\\n(;0u .if2-0\\$1 .as }y "\\$3 .if0\\$1-1 .ds }y "\\$3\\*(}y .if!0\\$2 .ds }y .ll\\nWu-\\n(:au-3n .in\\n(;2u .if!0\\$2 .in\\n(;1u .ti\\n(;1u .fi .di>A .if!0\\$1-\\n(:d .if !\\n(:f \\*(}y\\$4\\a\\*(}3 .if!0\\$1-\\n(:d .if \\n(:f \\*(}y\\$4\\t\\*(}3 .if0\\$1-\\n(:d \\*(}y\\$4\\*(}3 .br \!.br .di .br .ll\\nWu .ne\\n(dnu .ta\\nWu-\\n(:au-2n .nf .in0 .na .>A .. .de)Z .in0 .ie!\\n(Cp \{\ .SK .rs .sp3v .ce1 \} .el.sp 2v \\$1 .sp1v .nr:a 0 .nrH1 0 .afH1 1 .>L \\$2 .rn)T )V .rn)U )T .ds}0 \\n(H1 .dsCi 0 .ds}2 \\n(H1 .>L \\$2 .rn)T )U .rn)V )T .. .deTC .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .)w .if\\n(;R .RP 0 1 .)R .rm)E )F DE DF DS FD FE FG FS H HU TB .if!\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b .if!\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 .rm}t }e }o .rs .if\\n(;C .nr ;C 2 .bp .ie\\n(Oc .nr P 1 .el\{\ .rm}f }p .nr;g 1 1 .af;g i .ds}b ''- \\\\n(;g -'' .am)b .nr;g +1 \\.. 'br\} .nrN 0 .rs .if!\\n(.$-4 .TX .if\\n(;C .ll \\n(:Lu .if!\\n(.$-4 .TY .ce99 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .if\\n(.$-4 .sp .ce0 .sp .if\\n(;C .ll \\n(:lu .nr;m \\n(.hu+2v .nr:b 1 .if\w\\$1 .nr :b 0\\$1 .nr:c 1 .if\w\\$2 .nr :c 0\\$2 .nr:d 2 .if\w\\$3 .nr :d 0\\$3 .nr:f 0 .if\w\\$4 .nr :f 0\\$4 .nrH1 0 .afH1 1 .nrH2 0 .afH2 1 .nrH3 0 .afH3 1 .nrH4 0 .afH4 1 .nrH5 0 .afH5 1 .nrH6 0 .afH6 1 .nrH7 0 .afH7 1 .nr:a 0 .>C .rn)T )V .rn)U )T .ds}0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .nrH2 +\\n(H1 .nrH3 +\\n(H2 .nrH4 +\\n(H3 .nrH5 +\\n(H4 .nrH6 +\\n(H5 .nrH7 +\\n(H6 .if!\w'\\*(Ci' .ds Ci 0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 .ds}2 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7 .>C .rm>C HX .rn)T )U .rn)V )T .if(\\n(Lf=1)&(\\n(!0>0) .)Z "\\*(Lf" 0 .if(\\n(Lt=1)&(\\n(!1>0) .)Z "\\*(Lt" 1 .if(\\n(Lx=1)&(\\n(!3>0) .)Z "\\*(Lx" 3 .if(\\n(Le=1)&(\\n(!2>0) .)Z "\\*(Le" 2 .)R .. .deTY .ce CONTENTS .. .deTL .rmWA WE IA IE LO LT .nr:D 2 .nr;c 2 .nr;z 0 .nr:V 0 .nr:1 \\n(.i .if\\nC=4 .ls 1 .if\\nC=5 .ls 1 .ds>1 \\$1 .ds>2 \\$2 'nr;y 1 .ie\\nA=1 'll \\nWu-24n .el'll \\nWu-34n 'nh 'na 'fi 'if\\nE 'ft 3 'di>T .. .deAU .nr:D 1 .nr;c 1 'nf .if\\n(;y .>9 .rmTL .ll\\nWu .da>z 'if\\nE 'ft 3 .if(\\n(;z>0)&(\\n(Au>0) .sp \\$1 .if\\n(Au>0 \{.if \w\\$3 .ie \\$3HP HP\ \&\c .el\\$3\ \&\c .if\w\\$4 \\$4 .if\w\\$3 .if !\w\\$4 \& .if\w\\$6 \\$6\ \&\c .if\w\\$5 x\\$5 .if\w\\$6 .if !\w\\$5 \& 'br\} .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .br 'if\\nE 'ft .di .nr;z +\\n(dn .nrdn 0 'in\\n(:1u .if!\\n(:V .ds }v \\$3-\\$4-\\$2 .if\\n(:V .as }v /\\$2 .da>v 'if\\nE 'ft 3 .sp3 \\$1 .br 'if\\nE 'ft .di .nr:V +\\n(dnu .nrdn 0 .nr:H 0 .ds}L \\$3 .if'\\$3'AL' .ds }L }B .if'\\$3'ALC' .ds }L }B .if'\\$3'CP' .ds }L PY .if'\\$3'FJ' .ds }L HO .if'\\$3'HK' .ds }L HL .if'\\$3'HOH' .ds }L HO .if'\\$3'HOH' .nr :H 1 .if'\\$3'HP' .ds }L }A .if'\\$3'HR' .ds }L RR .if'\\$3'INH' .ds }L }I .if'\\$3'IW' .ds }L IH .if'\\$3'IX' .ds }L IH .if'\\$3'LC' .ds }L WV .if'\\$3'LZ' .ds }L }K .if'\\$3'MO' .ds }L }M .if'\\$3'MT' .ds }L RR .if'\\$3'PK' .ds }L }P .if'\\$3'RD' .ds }L }E .if'\\$3'RR' .ds }L PY .if'\\$3'SF' .ds }L CP .if'\\$3'SZ' .ds }L }F .if'\\$3'WI' .ds }L }W .am>4 .sp1 \\$1 .if\\\\n(:2 .sp .if\\\\n(:2 \\*(}Z .if\\\\n(:2 .if \\n(:H \\\\*(}H .if\\\\n(:2 \\\\*(\\*(}L .ds}z \\\\*(\\*(}L \\.. .. .de>9 .br .di .di}z .>T .if(\w'\\*(>1')&(\w'\\*(>2') \{\ .ie'\\*(>1'\\*(>2' \{\ .br Work Project No. and Filing Case \\*(>1 .br\} .el\{\ .br Work Project No. \\*(>1 .br File Case \\*(>2 .br\} \} .if(\w'\\*(>1'=0):(\w'\\*(>2'=0) \{\ .ie\w'\\*(>1' \{\ - Work\ Project\ No.\ \\*(>1 .br\} .el.ie \w'\\*(>2' \{\ - Case\ \\*(>2 .br\} .el.br \} .di 'if\\nE 'ft 1 .nr:9 \\n(dn .nrdn 0 .nr;y 0 'nf .rm>9 .. .deAT .da>v 'if\\nE 'ft 3 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .br 'if\\nE 'ft .di .nr:V +\\n(dnu .nrdn 0 .. .deOK .nr:D 1 .nr;c 1 .de>7 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 \\.. .rmOK .. .deTM .nr:D 1 .nr;c 1 .de>8 .if\\nE .ft 3 .if\\n(.$-0 \\$1 .if\\n(.$-1 \\$2 .if\\n(.$-2 \\$3 .if\\n(.$-3 \\$4 .if\\n(.$-4 \\$5 .if\\n(.$-5 \\$6 .if\\n(.$-6 \\$7 .if\\n(.$-7 \\$8 .if\\n(.$-8 \\$9 .if\\nE .ft \\.. .nr;x \\n(.$+1 .rmTM .. .deAS .nr:D 3 .nr;c 3 .if\\n(;y .>9 .rmTL .nr:t 0\\$1 .if\\n(:t=1 .nr ;5 \\n(:s .nr:3 0 .if\\n(.$-1 .nr :3 0\\$2n .nr;N \\n(:1 'in\\n(:1u 'fi .SA 'nh 'if\\n(Hy 'hy 14 .di>3 .ll0u-2u*\\n(:3u+\\nWu .ce .ul .ie'\\$3'ER' ERRATA .el.ie '\\$3'AD' ADDENDUM .elABSTRACT .SP 3 .ns .nr:I 1 .rmAS .. .deAE .br .di 'nf 'nh .nr;3 \\n(dn .nr;6 \\n(;3 .ll\\nWu 'in\\n(:1u .if\\n(:t=1 .nr :s \\n(;5 .rmAE .. .deMT .if\\n(!N=1 .NE .nr:D 0 .nr;c 0 .if!\\n(;y 'nf .if\\n(;y .>9 .rmTL TM OK AS AE AF AU .ll\\nWu .rnTP >Y .in\\n(:1u .rn>Y TP .rn)K >Y .ie\\nE .nr :W \\nWu-\w'\f3September 33, 1999\fP'+3n .el.nr :W \\nWu-\w'September 33, 1999'+3n .ie\w\\$1u<2n .if !0\\$1=4 .if \\n(.$=2 .ds ]n \\$2 .el.if \\n(.$=2 .ds ]n \\$2 .if!\\n(.$ .>6 .if\\n(.$ .if \w\\$1u-\w'0'u .>6 "\\$1" .if\\n(.$ .nr ;y 0\\$1 .if\\n(.$ .if !\\n(;y .>6 "" .if\\n(.$ .if \\n(;y-4 .>x .if\\n(.$ .if \\n(;y-3 .>5 "\\$2" .if\\n(.$ .if \\n(;y-2 .>6 "ADMINISTRATIVE MEMORANDUM" .if\\n(.$ .if \\n(;y-1 .>6 "INTERNAL MEMORANDUM" .if\\n(.$ .if \\n(;y .>6 "TECHNICAL MEMORANDUM" .)R .ta.8i 1.6i 2.4i 3.2i 4i 4.8i 5.6i 6.4i 7.2i 8i 8.8i 9.6i .ns .if\\nC=4 .ls 2 .if\\nC=5 .ls 2 .>Y .]N \\nP+1 .nr;M 1 .rm>Y MT .. .de>x .rm>6 >5 )Y )X .ta\\n(:Wu-6n .br .rs .sp1 .ie\\n(Pv \{\ .ce .ul PRIVATE .sp\} .el.sp 2 .ie\\nA=2 \{\ \t\(bs .sp.5i .if\w\\*(}Z \t\s16\f3\\*(}Z\fP\s0 'br\} .el\{\ .sp|4v .}z .br\} .rs .mk:2 .sp|12v .in\\n(:Wu .ie\\nE \{\ \f3\\*(DT\fP 'br\} .el\{\ \\*(DT 'br\} .if\\n(:2u-\\n(nlu .sp |\\n(:2u .sp2v .rm>x .. .de>6 .rm>5 >x )Y .di]t .if\\n(;n \{\ .nr;W \\nWu .nrW 6.5i .ll\\nWu .lt\\nWu \} .ta\\n(:Wu-6n .br .rs .sp1 .ie\\n(Pv \{\ .ce .ul PRIVATE .sp\} .el.sp 2 .if\\nA=2 \{\ \t\(bs .sp.5i \} .ie\w\\*(}Z \t\s16\f3\\*(}Z\fP\s0 .el.sp2 .sp3 .if\\n(;n .sp .mk:2 .if!\\n(;n \{\s8subject:\s0 .rt\\n(:2u .in\w'\s8subject:\s0'u+1n \} .}z .br .rt\\n(:2u .in\\n(:Wu .if\\n(;n .in 0n-8n*\\nWu/35n+\\nWu-100u .if!\\n(;n \{.ps 8 .ti-6n date: .ps .rt\\n(:2u \} .ie\\nE \{\ \f3\\*(DT\fP 'br\} .el\{\ \\*(DT 'br\} .sp .if!\\n(;n \{.mk :2 .ps8 .ti-6n from: .ps .rt\\n(:2u \} .if\\nE .ft 3 .>z .if\\nE .ft .in\\n(:1u .in\\n(:1u .if\\n(;x \{.sp .mk:2 .in\\n(:Wu .if\\n(;n .in 0n-8n*\\nWu/35n+\\nWu-100u .>8 .in\\n(:1u \} .br .if\\n(:9u-\\n(;zu-2v-\\n(;xv .sp \\n(:9u-\\n(;zu-2v-\\n(;xv .sp3 .di .rs .ie\\n(;3 \{\ .nr!I \\n(dn .di]B .}C .br .di .rm]B .nr;H \\n(dn .ie\\n(:t=2 \{\ .ie(\\n(;6+\\n(!I+\\n(;H)=\\n(.t .nr :8 1 .el.nr :8 0 .if\\n(:8 .wh 0 .af!S \\gP .afP i .]t .in+\\n(:3u .>3 .sp3 .)N .in-\\n(:3u .wh0 .if!\\n(:8 .bp .nrP 1 .afP \\g(!S .]t .wh0 )h .if\\n(:G \{\ .nr:s +1 .da>y .>d \!. br .di 'nrdn +4v 'nr:o +\\n(dnu .nrdn 0 'if!\\n(.pu-\\n(nlu-.5v-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5v 'if!\\n(:ou-\\n(:mu 'nr :o \\n(:mu 'ch)f -\\n(:ou 'br\} .tmWARNING: Approved ITDS Document Cover Sheet not available with this package. .rmCS \} .el.ie \\n(:t=1 .]t .el\{\ .]t .in+\\n(:3u .>3 .sp3 .in-\\n(:3u \} \} .el.]t .if\\n(;n \{\ .nrW \\n(;Wu .ll\\nWu .lt\\nWu \} .ns .ne10 .ce .ie\\nU .ul .el.cu .ie!\\n(.$ TECHNICAL MEMORANDUM .el.if \w\\$1 \\$1 .SP 3 .ce0 .ie\\nU .ul 0 .el.cu 0 .if!\\n(:t=2 .)X .rm)X >6 .. .de>5 .rm>6 >x )X .br .rs .sp1 .ie\\n(Pv \{\ .ce .ul PRIVATE .sp\} .el.sp 2 .in0 .ds}A "South Plainfield, New Jersey 07080 .ds}B "Allentown, Pennsylvania 18103 .ds}E "Reading, Pennsylvania 19604 .ds}F "Springfield, New Jersey 07081 .ds}H "Crawford Hill Laboratory .ds}I "Indianapolis, Indiana 46250 .ds}K "Lincroft, New Jersey 07738 .ds}M "Morristown, New Jersey 07960 .ds}P "Parsippany, New Jersey 07054 .ds}W "Ward Hill, Massachusetts 01830 .dsAK "Norcross, Georgia 30071 .dsCB "Columbus, Ohio 43213 .dsCH "Chester, New Jersey 07930 .dsCP "Summit, New Jersey 07901 .dsDR "Denver, Colorado 80234 .dsHL "Short Hills, New Jersey 07078 .dsHO "Holmdel, New Jersey 07733 .dsIH "Naperville, Illinois 60566 .dsIN "Indianapolis, Indiana 46206 .dsMH "Murray Hill, New Jersey 07974 .dsMV "North Andover, Massachusetts 01845 .dsPY "Piscataway, New Jersey 08854 .dsRR "Middletown, New Jersey 07748 .dsWB "West Long Branch, New Jersey 07764 .dsWH "Whippany, New Jersey 07981 .dsWV "Warren, New Jersey 07060 '''.ll \\nWu-20n .ll\\nWu .fi .na .nh .di>6 .>T .br .di .ll\\nWu .nf .ce1000 .ul1000 .>6 .nr:2 0 .if\w\\$1 .nr :2 1 .ul0 .>4 .br .if!\\n(:2 .sp .if!\\n(:2 \\*(}Z .if!\\n(:2 .if \\n(:H \\*(}H .if!\\n(:2 \\*(}z .ce0 .sp .if\\n(;3 .if !\\n(:t .in +\\n(:3u .if\\n(;3 .if !\\n(:t .>3 .if\\n(;3 .if !\\n(:t .in -\\n(:3u .if\\n(;3 .if !\\n(:t .sp .ns .)Y .rm)Y >6 PY MH WH HO RR }H WB }A }B }E HL }I .rmAK CP CH CB DR IN IH MV WV SG )N )M .rm}P }M }W }F }K .deNS .br .di .di>Y \\.. .deNE .br .di \\.. .rm>5 .. .de)K .ie(\\n(;X=5)&(\\n(:D) .)D "check WA, WE, IA, IE, LT sequence" .el.if \\n(:D .ie !\\n(:t=2 .)D "check TL, AU, AS, AE, MT sequence" .el.)D "check TL, AU, AS, AE, NS, NE, MT sequence" .rm)X )Y >T >x >z >1 >2 >3 >4 >5 >6 >7 >8 >9 }z .rr;x ;y ;z :D :1 :2 :3 :9 ;0 ;1 ;n ;3 .rmTL AU TM AF AS AE OK .rm)K .. .de)X .di>S \!.tm WARNING: Approved ITDS Document Cover Sheet not available with this package. .di .. .de)Y .di>S \!.bp \!.in 0 \!.ce 1000 \!.ul 1000 .>6 \!.ul 0 \!.sp .5v .>4 \!.br \!.if \\n(:2=0 .sp.5v \!.if \\n(:2=0 \\*(}Z \!.if \\n(:2=0 .if \\n(:H \\*(}H \!.if \\n(:2=0 \\*(}z \!.ce 0 \!.sp \!.in 0 \!.in +\\n(:3u .>3 \!.in -\\n(:3u \!.nr ;0 1 .di .di>b .nf .na .>c .br .di .if\\n(dn \{\ .nr;c \\n(.pu-\\n(:mu-\\n(dnu .da>S \!.ie \\n(;c-\\\\n(nlu .sp \\n(;cu-\\\\n(nlu-2v \!.el .sp 1v .nr;c 0 \l'60p' .>c .di 'br\} .. .deCS .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .)w .if\\n(;R .RP 0 1 .if!\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b .if!\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 .rm}t }e }o .rm}b }f }p .br .)R .ll\\nWu .in0 .br .nr!O \\nO .nr!W \\nW .rs .nf .>S .nrO \\n(!O .nrW \\n(!W .po\\nOu .ll\\nWu .lt\\nWu .)R .ta.8i 1.6i 2.4i 3.2i 4i 4.8i 5.6i 6.4i 7.2i 8i 8.8i 9.6i .rr;0 ;1 ;2 .rm>S .. .deFC .)w .nf .ls1 .in(\\n(.lu/2u) .rs .ne\\n(:Vu+3v+.5p .rmLT .ie\\n(;X \{\ .sp2 .ie\\n(;X<3 \{\ .ie\\n(.$ \\$1 .elYours very truly, \} .el.if \\n(;X=3 \{\ .in0 .ie\\n(.$ \\$1 .elYours very truly, \} \} .el\{\ .sp .ie\\n(.$ \\$1 .elYours very truly, \} .in .fi .. .deSG .if\\n(:F .)D "SG:missing FE" .if\\n(:y .)D "SG:missing DE" .LC 0 .)w .)R .in0 .nf .ls1 .ne5v+.5p .rs .ie\\n(;X \{\ .ie\\n(;X<4 \{\ .sp3 .if\\n(;X<3 .in (\\n(.lu/2u) \\*(}8 .if\w\\*(}9 \\*(}9 \} .el\{\ .sp2 .br .traAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ .ie\w\\*(}9 \\*(}8, \\*(}9 .el\\*(}8 .traabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz\} .in0 .sp \\$1\} .el\{\ .if!\\n(:V .)D "SG:no authors" .if\w\\$1 .as }v -\\$1 .if\\n(.$>1 \{\ .sp3 \\*(}v .sp-4 \} .in(\\n(.lu/2u) .>v .in .if\\n(.$=1 \{\ .sp-1 \\*(}v 'br\} .rm>v .fi\} .. .deNS .if\\n(!N=1 .di .if\\n(;M .br .)R .nr:D 1 .ds}4 "Copy to .nr;0 0\\$1 .if\w\\$1u-\w'\0\0'u .nr ;0 50 .if\\n(;0 .ds }4 "Copy (with att.) to .if\\n(;0-1 .ds }4 "Copy (without att.) to .if\\n(;0-2 .ds }4 "Att. .if\\n(;0-3 .ds }4 "Atts. .if\\n(;0-4 .ds }4 "Enc. .if\\n(;0-5 .ds }4 "Encs. .if\\n(;0-6 .ds }4 "U.S.C. .if\\n(;0-7 .ds }4 "Letter to .if\\n(;0-8 .ds }4 "Memorandum to .if\\n(;0-9 .ds }4 "Copy (with atts.) to .if\\n(;0-10 .ds }4 "Copy (without atts.) to .if\\n(;0-11 .ds }4 "Abstract only to .if\\n(;0-12 .ds }4 "Complete memorandum to .if\\n(;0-13 .ds }4 "Copy (\\$1) to .if\\n(.$-1 .ds }4 \&\\$1 'in\\n(;N .if!\\n(!N .ds }5 \\*(}4 .if\\n(!N .da }C .if!\\n(!N .di }C .if\\n(!N .if !\\n(;X .sp \!.ds }4 \\*(}4 \\*(}4 .nf .nr!N 1 .. .de)N .br .rr!N .di]v .}C .br .di .rm]v .nr;0 \\n(dn .if\\n(;0 .)M .. .de)M .nf .if!\\n(;X .sp .ne2v .if\\n(.tu<=2v \{\ \&\\*(}5 .ie!\\n(;C See next page .elSee next column 'br\} .nr!U \\n(;0>=\\n(.tu .if\\n(!U \{\ .ie!\\n(;C .ds ]w Continued next page .el.ds ]w Continued next column .ds]x \\\\*(}4\ \-\ contd. .ch)f -(\\n(:ou+1v) \} .}C .if\\n(!U \{\ .rm]w ]x .ch)f -\\n(:ou \} .rm}C .. .deNE .br .if\\n(!N=1 .di .nr:D 0 .nr!N 2 .if\\n(;M .)N .)R .. .deAV .ne6v .in0 .nf .if\\n(.$<2 \{\ .sp APPROVED: 'br\} .sp2 \l'3i'\h'.3i\l'1.5i' \\$1\h'|4i-(\w'Da'u)'Date .in .fi .. .deND .if!\\n(.$ .)D "ND:missing arg" .dsDT "\\$1 .. .deAF .if\\n(;y .>9 .if!\\n(.$ \{\ .nr;n 1 .nrO 1i .po\\nOu .nrW 5.8i .ev0 .ll\\nWu .lt\\nWu .ev .ev1 .ll\\nWu .lt\\nWu .ev .ev2 .ll\\nWu .lt\\nWu .ev 'br\} .ds}Z "\\$1 .. .de)h 'ev0 'nh 'if\\n(Hy 'hy 14 'ev 'ev2 .)R .nrP +1 .if\\n(:Z \{.nr P \\n% .rr:Z \} .if\\n(:u*\\n(:S .nr P 1 .if\\n(:u=1 \{.nr H1 +1 .nr:u 2 \} 'sp\\n(!X .TP .br .)R 'ev .nr:I 2 .nr:J \\n(nl 'ns 'if\\n(:q .)l 'nr:q 0 .mk;r .mk;m .nr!B 0 .if\\n(;d=0&\\n(:z>0 \{\ 'ie\\n(Df>3 \{')z ')s \} 'el'if \\n(Df>1 ')z \} .nr:I 3 .nr!C \\n(.h .PX 'ns .if!((\\n(!C=\\n(.h)&(\\n(!B=0)) .mk ;m .nr;T 0 .if\\n(;A>0 \{.nr ;h \\n(.i .in0 .>t .nr;T 1 .in\\n(;hu \} .mk#T .nr:J \\n(nl .if!\\*(]x \\*(]x .. .de)f .if!\\*(]w \\*(]w .nr!D 0 .nr:N 0 'nrdn 0 'nr;y \\n(.pu-\\n(nlu-\\n(:mu-1v 'if\\n(:s \{'ie \\n(;y-4v .)o 'el.)m \} 'nr:s 0 'nr:o \\n(:mu .ie\\n(;C=0 \{\ .if\\n(;e \&\c 'bp\} .el.ie \\n(;C=2 .)2 .el.)1 .rr;f .ie\\*(]w 'ch )f -\\n(:ou .el'ch )f -(\\n(:ou+1v) .. .dePH .ds}t "\\$1 .. .deEH .ds}e "\\$1 .. .deOH .ds}o "\\$1 .. .dePF .ds}b "\\$1 .. .deEF .ds}f "\\$1 .. .deOF .ds}p "\\$1 .. .deTP 'sp .)K .af;P \\gP .afP 1 .nr;P \\nP .afP \\g(;P .af;P 1 .ie\\n(Pv \{\ .ie(\\n(Pv=1)&(\\n(;P>1) 'sp 2 .el\{\ .ce .ul PRIVATE .sp\} \} .el'sp 2 .if!\\n(;P-1 .if \\nN 'sp .if!\\n(;P-1 .if \\n(:S .tl \\*(}t .if!\\n(;P-1 .if !\\nN .tl \\*(}t .if\\n(;P-1 .ie \w'\\*(]n' .tl '\\*(]n - \\nP''' .el.tl \\*(}t 'if!\\n(;P%2 'tl \\*(}e 'if\\n(;P%2 'tl \\*(}o 'sp2 .. .dePM .ie\\$1 . nr ;t 0 .el.ie \\$1PM6 . nr ;t 6 .el.ie \\$1ILL . nr ;t 5 .el.ie \\$1PM5 . nr ;t 5 .el.ie \\$1RS . nr ;t 4 .el.ie \\$1PM4 . nr ;t 4 .el.ie \\$1CP . nr ;t 3 .el.ie \\$1PM3 . nr ;t 3 .el.ie \\$1RG . nr ;t 2 .el.ie \\$1PM2 . nr ;t 2 .el.nr ;t 1 .ie\\n(;t=0 \{\ .(B .(E 2 0 .(B .(E 3 0 \} .el.ie \\n(;t=6 \{\ .(B \!. tl \\*(]m \!. tl \\*(]o \!. tl \\*(]p \!. tl \\*(]q .(E 2 4v \} .el.ie \\n(;t=5 \{\ .(B \!. tl \\*(]i \!. tl \\*(]j \!. tl \\*(]k \!. tl \\*(]l .(E 3 4v \} .el.ie \\n(;t=4 \{\ .(B \!. tl \\*(]U \!. tl \\*(]V \!. tl \\*(]W \!. tl \\*(]X .(E 3 4v \} .el.ie \\n(;t=3 \{\ .(B \!. tl \\*(]I \!. tl \\*(]J \!. tl \\*(]K \!. tl \\*(]L .(E 3 4v \} .el.ie \\n(;t=2 \{\ .(B \!. tl \\*(]A \!. tl \\*(]F \!. tl \\*(]G \!. tl \\*(]H .(E 3 4v \} .el\{\ .(B \!. tl \\*(]M \!. tl \\*(]O \!. tl \\*(]Q \!. tl \\*(]R .(E 3 4v \} .. .de)b 'ev2 .nf .?1 .?2 .?3 .?4 .?5 .br .)R .af;P \\gP .afP 1 .nr;P \\nP .afP \\g(;P .af;P 1 .ie!\\n(;P%2 .tl \\*(}f .el.tl \\*(}p .ie\\n(;P=1 \{\ .ie\\nN=1 .tl \\*(}t .el.tl \\*(}b \} .el.tl \\*(}b .if\\nC .tl \\*(]C .)R 'ev .. .de)2 .po\\nOu .nr;C 1 .if\\n(;e \&\c 'bp .. .de)1 .rt\\n(;mu .po+\\n(;ou .nr;C 2 .if\\n(;a=1&\\n(:t=0&\\n(!K .wh \\n(!Eu )a .nr:I 2 .nr:J \\n(nl 'ns 'if\\n(:q .)l 'nr:q 0 'if\\n(;d=0&\\n(:z>0 \{\ 'ie\\n(Df>3 \{')z ')s \} 'el'if \\n(Df>1 ')z \} .nr:I 3 .nr;T 0 .if\\n(;A>0 \{.nr ;h \\n(.i .in0 .>t .nr;T 1 .in\\n(;hu \} .mk#T .nr:J \\n(nl .. .de2C .if\\n(;C=0 \{\ .br .)R .nr;C 1 .if!\\n(.$ .nr ;l \\n(.lu*8u/17u .if!\\n(.$ .nr ;o \\n(.lu*9u/17u .if\\n(.$ .nr ;l \\$1u*1.3n .if\\n(.$ .nr ;o \\nWu-\\n(;lu .ev1 .ll\\n(;lu .lt\\n(;lu .ev .ll\\n(;lu .lt\\n(;lu .nr:L \\nW .nrW \\n(.lu .SP .ns .mk;m \} .. .de1C .if\\n(;C \{\ .br .nr;O \\n(.hu-2v .if\\n(;C>1 .sp |\\n(;Ou .po\\nOu .)R .nrW \\n(:Lu .rr:L ;O ;C .ev1 .ll\\nWu .lt\\nWu .ev .ll\\nWu .lt\\nWu .SP .ns\} .. .de)a .sp\\n(:0u .sp2 .ch)a .rr!E !K .rm)a .. .deWC .if\\n(.$ \{\ .ie\\$1N \{.nr ;a 0 .nr;b 0 .nr;j 0 .nr;p 1 \} .el.ie \\$1WD .nr ;a 1 .el.ie \\$1WF .nr ;b 1 .el.ie \\$1FF .nr ;j 1 .el.ie \\$1FB .nr ;p 1 .el.ie \\$1-WD .nr ;a 0 .el.ie \\$1-WF .nr ;b 0 .el.ie \\$1-FF .nr ;j 0 .el.ie \\$1-FB .nr ;p 0 .el')D "WC: unknown option" .if\\n(.$>1 .WC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 'br\} .. .de>W .if\\n(;C \{\ .ev1 .ll\\n(:Lu .lt\\n(:Lu .ev .nrW \\n(:Lu .nr;W 1 \} .. .de>N .if(\\n(;l>0)&(\\n(;C=0) \{\ .ev1 .ll\\n(;lu .lt\\n(;lu .ev .nrW \\n(;lu .nr;W 2 \} .. .de>R .ie\\n(;W=1 .nr W \\n(;lu .el.if \\n(;W=2 .nr W \\n(:Lu .if\\n(;W \{\ .ev1 .ll\\nWu .lt\\nWu .ev .nr;W 0 \} .. .de)Q .ch)Q 200v .rs 'sp70 .. .deBS .(B .. .deBE .(E 4 .. .deVM .ie0\\$1>=0 .nr !X 0\\$1 .el.nr !X 0 .if0\\$2>=0 \{\ .(B .rs .sp0\\$2v .(E 5 0\\$2 \} .. .de(B .ev1 .)R .di>K .. .de(E .br .di .)R .ev .ie(\\n(dn=0)&(0\\$2=0) \{\ .nr?\\$1 0 .rm>K ?\\$1 'br\} .el\{\ .ie0\\$2>0 .nr ?\\$1 0\\$2 .el.nr ?\\$1 \\n(dn \} .nr?0 \\n(:Uu .nr:U \\n(?1+\\n(?2+\\n(?3+\\n(?4+\\n(?5+1v .if(\\n(:Uu+\\n(:Mu)>(\\n(.pu-\\n(nlu-.5v) .SK .rn>K ?\\$1 .nr:o +(\\n(:Uu-\\n(?0u) .ch)n -\\n(:ou .ch)f -\\n(:ou .nr:m \\n(:Mu+\\n(:Uu .ch)b -(\\n(:mu-2v) .. .deFS 'nr:s +1 .if\\n(:F .)D "FS:missing FE" .if\\n(:F .FE .if\\n(:y .)D "FS:missing DE" .if\\n(:y .DE .nr:F 1 .if!\\n(!F \{\ .ie\\n(;C .nr !F 2 .el.nr !F 1 \} .ie(\\n(;C>0)&((\\n(;b=1):((\\n(;j=1)&(\\n(!F=1))) \{\ .nr!F 1 .>W \} .el.if ((\\n(;C=0)&(\\n(;j=1)&(\\n(!F=2)) .>N 'ev1 'di>b .nr:D 1 .)R 'nh 'if\\n(:i 'hy 14 'ad 'if\\n(:j 'na 'sp\\n(Fs 'if\\n(.$ 'ds }y \\$1\ 'if!\\n(.$ 'ds }y \\*(]y.\ 'if\\n(:k \\*(}y\&\c 'if!\\n(:k 'nr ;v \w\0\0.\  'if!\\n(:k 'nr ;u \w\\*(}y 'if!\\n(:k 'in +\\n(;vu 'if!\\n(:k 'if !\\n(:l 'ti -\\n(;vu 'if!\\n(:k 'if !\\n(:l 'if !\\n(;u-\\n(;v \\*(}y\h\\n(;vu-\\n(;uu\&\c 'if!\\n(:k 'if !\\n(:l 'if \\n(;u-\\n(;v \\*(}y\&\c 'if!\\n(:k 'if \\n(:l 'if \\n(;v-\\n(;u 'ti -\\n(;uu 'if!\\n(:k 'if \\n(:l 'if !\\n(;v-\\n(;u 'ti -\\n(;vu 'if!\\n(:k 'if \\n(:l \\*(}y\&\c .. .deFE .if!\\n(:F .)D "FE:no FS active" .br 'di .nr:D 0 .if\\n(;c .nr :D \\n(;c 'in 'nf 'na .if!\\n% \{\ 'da>c .>b \!. br 'di .if!(\\n(:D=3) \{\ .nr:G 1 .da>d .>b \!. br .di 'br\} 'br\} .if!((\\n%=0)*(\\n(:D=3)*(\\n(:t=1)) \{\ 'da>y .>b \!. br 'di 'br\} .rm>b .)R 'ev .nr:F 0 .>R 'if!((\\n%=0)*(\\n(:D=3)*(\\n(:t=1)) \{\ .if!((\\n(!A=1):((\\n(;C=2)&(\\n(!F=1))) \{\ 'if!\\n(:s-1 'nr dn +4v 'nr:o +\\n(dnu .nrdn 0 'if!\\n(.pu-\\n(nlu-.5v-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5v 'if!\\n(:ou-\\n(:mu 'nr :o \\n(:mu 'ch)f -\\n(:ou 'br\}\} .. .de)o .ie(\\n(!F=1)&(\\n(;C=1) \{\ .nr!A 1 \} .el.nr !A 0 'ev1 .)R 'nf 'sp2 .ti0 .if!\\n(:n \l'72p' .if\\n(:n \l\\n(.lu 'nr:n 0 .br .if\\n(!A .wh (\\n(nlu-2v) )Q 'nr;Z 1 'nrdn 0 .>y .br 'di .if\\n(dn=1v .nr dn 0 .nr:n \\n(dn 'nr;Z 0 .if!\\n(;C=1 \{\ .rr!A .if\\n(dn=0 .rr !F \} 'rm>y 'nr:q \\n(dnu 'nrdn 0 'nr:s 0 .)R 'ev .. .de)n 'if\\n(;Z \{\ 'di>x 'sp\\n(Fs \} .. .de)m 'ev1 .)R .nf 'di>w .>y .br 'di 'rm>y 'nr:q \\n(dn 'nrdn 0 'nr:s 0 .if!\\n(;C=1 .rr !A .)R 'ev .. .de)l 'nr:s 1 'di 'ev1 'di>b .)R 'nh 'nf .>x .>w .nr:F 1 .FE 'rm>x 'rm>w .. .deFD 'nr:i 0 'nr:j 0 'nr:k 0 'nr:l 0 'nr;z 0 'if!\\n(.$ 'nr ;z 10 'if\\n(.$ 'if !\w\\$1 'nr ;z 10 'if\\n(.$ 'nr ;z \\$1 'if\\n(;z-11 'nr ;z 0 'if\\n(;z-7 'nr :l 1 'if\\n(;z-7 'nr ;z -8 'if\\n(;z-3 'nr :k 1 'if\\n(;z-3 'nr ;z -4 'if\\n(;z-1 'nr :j 1 'if\\n(;z-1 'nr ;z -2 'if\\n(;z 'nr :i 1 'if\\n(.$-1 .nr :C 1 .. .deDS .nr:t 0 .nr!K 1 .)J "\\$1" "\\$2" "\\$3" .. .deDF .nr:t 1 .nr!K 0 .)J "\\$1" "\\$2" "\\$3" .. .de)J .nr;i \\n(.i .nr;q \\n(.u 'di .if\\n(:D>1 \{.ie \\n(:t=0 .)D "DS:illegal inside TL or AS" .el.)D "DF:illegal inside TL or AS" \} .if\\n(:F \{.ie \\n(:t=0 .)D "DS:missing FE" .el.)D "DF:missing FE" .FE \} .if\\n(:y \{.ie \\n(:t=0 .)D "DS:missing DE" .el.)D "DF:missing DE" .DE \} .nr:y 1 .if(\\n(;C>0)&(\\n(;a=1) .>W .if\\n(;C=2&\\n(;a=1&\\n(!K 'bp .ev1 .)R 'di>0 .nr:D 1 .nr;z 0+0\\$1 .if\\$1L .nr ;z 0 .if\\$1I .nr ;z 1 .if\\$1C .nr ;z 2 .if\\$1CB .nr ;z 3 .if\\n(;z>3 .nr ;z 3 .nr:B \\n(;z .if\\n(:t=0 .if \\n(;z<2 .ll -\\n(;iu .if\\n(;z=1 .in +\\n(Sin .if\\n(;z=2 \{.ce 9999 .nr:t +2 \} .if\\n(:B=3 \{.nr :Y 1 .nr:t +2 .nr:X \\n(.i .di>X \} .nr;z 0+0\\$2 .if\\$2N .nr ;z 0 .if\\$2F .nr ;z 1 .nf .if\\n(;z .fi .ll-0\\$3n .. .de)z .nr;w \\n(:x+1%26+1 .if!((\\n(;C=2)&(\\n(!\\n(;w=1)) \{\ 'nr;d 1 .ev1 .SP .)R 'nf 'rs .nr:x \\n(:x+1%26 .?\\n(;w .if\\n(!\\n(;w=1 .nr !B 1 .rm?\\n(;w .rr?\\n(;w !\\n(;w .)R .if\\n(De \{\ .if\\n(;e \&\c .bp .nr!B 0 \} .ie\\n(:I>1 \{\ .if\\n(nl>\\n(:J .nr :I 0 \} .el.nr :I 0 .SP .nr:J \\n(nl .ev 'nr:z -1 'nr;d 0 .ne2 \} .. .de)y 'if\\n(:z \{\ 'nr;w \\n(:x+1%26+1 'nr;z \\n(?\\n(;w .ie(\\nC=4):(\\nC=5) .nr ;Q 2 .el.nr ;Q 1 .if(\\n(:I=2):(\\n(;z+\\n(;pv+\\n(;Qv<\\n(.t):\ ((\\n(;z>(\\n(.p-\\n(;r-\\n(:m))&(\\n(nl<(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\ 'ie\\n(:I<2 .if \\n(;p .br 'el.if \\n(:Ju<\\n(nlu .if \\n(;p .br ')z \}\} .. .de)x 'nr:v \\n(:z ')y 'if\\n(:v=\\n(:z \{\ 'nr;d 1 \&\c 'SP \\n(.tu+1v 'nr;d 0 ')z \} .. .de)w 'if\\n(:z \{\ ')x ')w \} .. .de)u 'if\\n+(:z>25 ')D "DF: too many displays" 'nr:w \\n(:w+1%26 'nr;w \\n(:w+1 'rn>0 ?\\n(;w .nr!\\n(;w 1 .if(\\n(;C>0)&(\\n(;a=0) .nr !\\n(;w 2 .nr?\\n(;w \\n(:0 'if!((\\n(;C>0)&(\\n(!\\n(;w=1)) 'if (\\n(:z=1)&((\\n(Df%2=1):(\\n(Df>5)) ')y .. .de)s 'nr:v \\n(:z 'nr;Y \\n(:I 'nr:I 3 ')y 'ie\\n(:v>\\n(:z ')s 'el'nr :I \\n(;Y .. .de)t .br .nr!L \\n(.L .ls1 .)r .ti\\n(.iu .nf .if\\n(:t>1 .in -\\n(;iu .rs .nr;d 1 .>0 .)R .nr;d 0 .ie\\n(:I>1 \{\ .if\\n(nl>\\n(:J .nr :I 0 \} .el.nr :I 0 .ls\\n(!L .in\\n(;iu .if!\\n(;q .nf .if\\n(Ds .SP .nr:J \\n(nl .. .de)r .if\\n(Ds .SP .if(\\n(:0>=\\n(.t)&((\\n(:0<(\\n(.p-\\n(;r-\\n(:m)):\ (\\n(nl>(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\ .if\\n(;e \&\c .ne\\n(.tu+1v .if\\n(:I<2 .)r \} .. .deDE .if!\\n(:y .)D "DE:no DS or DF active" .nr!E \\n(nl .if\\n(:B=3 \{.br .di .if\\n(dl>\\n(:Y .nr :Y \\n(dl .if\\n(:Y<\\n(.l .in (\\n(.lu-\\n(:Yu)/2u .nf .>X .fi .rm>X .in\\n(:Xu .rr:X \} .ce0 .br 'di .rr:D ;D ;E :B .)R .ll\\nWu .ev 'nr:0 \\n(dn 'nrdn 0 .nr;x \\n(:t .if\\n(:t-1 .nr ;x -2 .>R .if!\\n(;x .)t .if\\n(;x .)u .nr:y 0 .nr:Y 0 .nr;L 1 .. .de)R 'fi 'na .if\\n(:h 'ad 'nh 'if\\n(Hy 'hy 14 'in0 'ti0 .. .deCW .DS I .. .deCN .DE .. .deRS .if\\n(;R=2 .)D "RS:missing RF" .nr;R 2 .nrRf +1 .if\\n(.$ .ds \\$1 \u[\\n(:R]\d .ie\\n(;C .ev 1 .el.ev 2 .)R 'in\w\0\0.\ u 'ti-\w\\*(]r.\ u .nr:D 1 .da>r \!.ne 2 \\*(]r.\ \&\c .. .deRF .if!(\\n(;R=2) .)D "RF: no RS active" .nr;R 1 .br \!.if \\\\n(Ls .sp .di 'in .nr:D 0 .ev .. .deRP .if\\n(;R=2 .)D "RP: missing RF" .if\\n(;R \{\ .nr;R 0 .if!(0\\$1) .nr :R 0 1 .)R .ie(0\\$2=2):(0\\$2=3) \{\ .if\\n(;e \&\c 'ne8 .sp1 \} .el\{\ .ie\\n(;e .SK .el\{\ \&\c .bp 'br\} \} .ce1 .ul \\*(Rp .if\w\\*(Rp \{ .am>C .)T 1 0 "" "\\*(Rp" \\nP \\.. 'br\} .sp2v .nf .>r .br .rm>r .)R .if(0\\$2=0):(0\\$2=2) .SK 'br\} .. .de)q .nr;e 1 .br .LC 0 .if\\n(:F .FE .if\\n(:y .DE .if\\n(!N=1 .NE .)N .nr;x 0 .if\\n(;R .RP 0 1 \&\c .if(\\n(;C>0)&(\\n(:z>0) 'bp .)w \& 'nr:0 \\n(.pu-\\n(nlu-\\n(:ou 'if\\n(:s 'if (\\n(:0<=0):((\\n(;C=2)&(\\n(!F=1)) 'nr ;x 1 'if\\n(:q 'nr ;x 1 'if\\n(;x \&\c 'if\\n(;x 'bp .di]B .>y .di .nr:T \\n(dnu .if\\n(:T \{ .nr!G \\n(.pu-\\n(:T-\\n(:mu-4v .ie\\n(!G>\\n(nl .ch )f \\n(!Gu .el'bp \} .nr;e 0 .. .deWA .nr:D 2 .rm1C 2C >W WC )Q AF AS AE AT AU AV CS OK TC TL TM MT .rm)2 )1 )a .nr;X 5 .)W WA .ds}8 \\$1 .ds}9 \\$2 .di]s .nf .. .deWE .)W WE .br .di .nr!R \\n(dn .. .deIA .nr:D 1 .)W IA .ds}6 \\$1 .ds}7 \\$2 .di]u .nf .. .deIE .)W IE .br .di .. .deLO .rm2C AF AS AE AT AU AV CS OK TC TL TM MT .ie\\$1 .)D "Required argument missing" .el.ie \\$1SA \{\ .nr!V 1 .ie\w\\$2 .ds }a \\$2 .el.ds }a To Whom It May Concern:\} .el.ie \\$1AT \{\ .ds}j ATTENTION: \\$2 .nr!Y 1 \} .el.ie \\$1RN \{\ .ds}k In reference to: \\$2 .nr!6 1 \} .el.ie \\$1CN \{\ .nr!9 1 .ie\w\\$2 .ds }l \\$2 .el.ds }l CONFIDENTIAL \} .el.ie \\$1SJ \{\ .ds}m \\$2 .nr!M 1 \} .el.)D "LO argument not recognized" .. .deLT .nr:D 0 .)W LT .rnTP >Y .br .rn>Y TP .ie\\$1 .(1 .el. ie \\$1BL . (1 .el.ie \\$1SB . (2 .el.ie \\$1FB . (3 .el.ie \\$1SP . (4 .el.)D "LT argument not recognized." .nr;M 1 .. .de(1 .nr;X 1 .rm(2 (3 (4 .nf .in(\\n(.lu/2u) .rs .sp11 .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp .in0 \\*(}l \} .if\\n(!6 \{\ .sp .in(\\n(.lu/2u) \\*(}k \} .ie(\\n(!9:\\n(!6) .sp 2 .el.sp 4 .in0 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp SUBJECT: \\*(}m \} .rmWA WE IA IE LO .fi .. .de(2 .nr;X 2 .rm(1 (3 (4 .rs .sp11 .nf .in(\\n(.lu/2u) .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .in0 .sp \\*(}l \} .if\\n(!6 \{\ .sp .in(\\n(.lu/2u) \\*(}k \} .ie(\\n(!9:\\n(!6) .sp 2 .el.sp 4 .in0 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp .ti5 SUBJECT: \\*(}m \} .rmWA WE IA IE LO .nrPt 1 .fi .. .de(3 .nr;X 3 .rm(2 (1 (4 .rs .sp11 .nf .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp \\*(}l \} .if\\n(!6 \{\ .sp \\*(}k \} .ie(\\n!9:\\n!6) .sp 2 .el.sp 4 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j \} .if\\n(!V \{\ .sp \\*(}a \} .if\\n(!M \{\ .sp SUBJECT: \\*(}m \} .rmWA WE IA IE LO .fi .. .de(4 .nr;X 4 .rm(2 (3 (1 .rs .sp11 .br .nf .ie\\n(!R .]s .el.sp 3 \\*(DT .if\\n(!9 \{\ .sp \\*(}l \} .if\\n(!6 \{\ .sp \\*(}k \} .ie(\\n!9:\\n!6) .sp 2 .el.sp 4 .if\w\\*(}6 \\*(}6 .if\w\\*(}7 \\*(}7 .]u .if\\n(!Y \{\ .sp \\*(}j\} .if\\n(!M \{\ .sp2 .br .traAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ \\*(}m .br .traabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz .sp\} .rmWA WE IA IE LO .fi .. .de)W .ie\\$1WA .nr !8 1 .el.ie \\$1WE \{\ .ie\\n(!8=1 .nr !8 2 .el.)D "WA macro missing"\} .el.ie \\$1IA \{\ .ie\\n(!8=2 .nr !8 3 .el.)D "WA or WE macro missing"\} .el.ie \\$1IE \{\ .ie\\n(!8=3 .nr !8 4 .el.)D "WA, WE, or IA macro missing"\} .el.if \\$1LT \{\ .ie\\n(!8=4 .nr !8 0 .el.)D "WA, WE, or IE macro missing"\} .. .nr:r 6v .nr:m 8v .nr:n 0 .nr:p 0 1 .nr:o 0 .nr:z 0 1 .nr:y 0 .nr:x 0 .af;w a .nr:w 0 .nr:F 0 .nr:R 0 1 .ds]r \\n(:R .ds]y \\n(:p 'wh0 )h .nr:o \n(:mu 'wh-\n(:mu )f 'ch)f 15i 'wh-\n(:mu )n 'ch)f -\n(:mu 'wh-\n(:ru )b .nr:M \n(:mu 'nr:i 0 'nr:j 1 'nr:k 0 'nr:l 1 'nr;z 0 .SA 0 .if\*(]ZMM DEFINED \{\ .tmERROR: MM package read twice .ab \} .ds]Z MM DEFINED .if\nT=1 \{.if \nW=0 .nr W 80 .if\nO=0 .nr O 3 \} .if\nT=2 \{.nr L 84 .dsBU o .rmul .rmcu \} .if!\w'\gE' .nr E 0 .ie\nL .nr L \nLv .el.nr L 11i .pl\nLu .ie\w'\gO' .nr O \nOn .el.ie \nA .nr O 1i .el.nr O .75i .po\nOu .if\nP .nr P -1 .nrP \nP 1 .if!\nS .nr S 10 .ie\nW .nr W \nWn .el.ie \nA .nr W 5.8i .el.nr W 6.0i .if\n(mo-0 .ds DT January .if\n(mo-1 .ds DT February .if\n(mo-2 .ds DT March .if\n(mo-3 .ds DT April .if\n(mo-4 .ds DT May .if\n(mo-5 .ds DT June .if\n(mo-6 .ds DT July .if\n(mo-7 .ds DT August .if\n(mo-8 .ds DT September .if\n(mo-9 .ds DT October .if\n(mo-10 .ds DT November .if\n(mo-11 .ds DT December .asDT " \n(dy, 20\n(yr .S D D 'ev0 .)R .ll\nWu .lt\nWu 'ev 'ev1 .)R .ll\nWu .lt\nWu 'ev 'ev2 .)R .ll\nWu .lt\nWu 'ev .PH "''- \\\\nP -'' .if\nC=3 \{.ds ]C D\ R\ A\ F\ T .PF "''\\\\*(DT'' \} .if\nC=4 \{.ds ]C D\ R\ A\ F\ T .PF "''\\\\*(DT'' .ls2 .nrPt 1 .nrPi 10 \} .if\nC=5 .ls 2 .if\nC=2 .ds ]C ''DATE FILE COPY'' .if\nC=1 .ds ]C ''OFFICIAL FILE COPY'' .if(\nN=3):(\nN=5) \{.nr :S 1 .PF "''\\\\n(H1-\\\\nP''" .PH \} .if\nN=4 \{.PH .nrN 0 \} .if\nD .PH "'\\*(RE line # \\\\n(.c'- \\\\nP -'' .if\nA=1 \{.nr ;n 1 .ds}Z 'br\} 'em)q .ds' ' .ds` ` .ds^ ^ .ds~ ~ .ds, , .ds: " .ds; \u"\d 9base-6/troff/tmac/tmac.uni0000644000175000017500000000231011402154555015247 0ustar anselmanselm.if t \{ .tr ♔\(wk .tr ♕\(wq .tr ♖\(wr .tr ♗\(wb .tr ♘\(wn .tr ♙\(wp .tr ♚\(bk .tr ♛\(bq .tr ♜\(br .tr ♝\(bb .tr ♞\(bn .tr ♟\(bp .tr α\(*a .tr β\(*b .tr γ\(*g .tr δ\(*d .tr ε\(*e .tr ζ\(*z .tr η\(*y .tr θ\(*h .tr ι\(*i .tr κ\(*k .tr λ\(*l .tr ν\(*n .tr ξ\(*c .tr ο\(*o .tr π\(*p .tr ρ\(*r .tr ς\(ts .tr σ\(*s .tr τ\(*t .tr υ\(*u .tr φ\(*f .tr χ\(*x .tr ψ\(*q .tr ω\(*w .tr Α\(*A .tr Β\(*B .tr Γ\(*G .tr Δ\(*D .tr Ε\(*E .tr Ζ\(*Z .tr Η\(*Y .tr Θ\(*H .tr Ι\(*I .tr Κ\(*K .tr Λ\(*L .tr Μ\(*M .tr Ν\(*N .tr Ξ\(*C .tr Ο\(*O .tr Π\(*P .tr Ρ\(*R .tr Σ\(*S .tr Τ\(*T .tr Υ\(*U .tr Φ\(*F .tr Χ\(*X .tr Ψ\(*Q .tr Ω\(*W .tr ←\(<- .tr ↑\(ua .tr →\(-> .tr ↓\(da .tr ↔\(ab .tr ∀\(fa .tr ∃\(te .tr ∂\(pd .tr ∅\(es .tr ∆\(*D .tr ∇\(gr .tr ∈\(mo .tr ∉\(!m .tr ∍\(st .tr ∗\(** .tr ∙\(bu .tr √\(sr .tr ∝\(pt .tr ∞\(if .tr ∠\(an .tr ∧\(l& .tr ∨\(l| .tr ∩\(ca .tr ∪\(cu .tr ∫\(is .tr ∴\(tf .tr ≃\(~= .tr ≅\(cg .tr ≈\(~~ .tr ≠\(!= .tr ≡\(== .tr ≦\(<= .tr ≧\(>= .tr ⊂\(sb .tr ⊃\(sp .tr ⊄\(!b .tr ⊆\(ib .tr ⊇\(ip .tr ⊕\(O+ .tr ⊖\(O- .tr ⊗\(Ox .tr ⊢\(tu .tr ⊨\(Tu .tr ⋄\(lz .tr ⋯\(el \} 9base-6/troff/tmac/tmac.html0000644000175000017500000000363611402154555015434 0ustar anselmanselm.de HTML \! \ \! \ .html html .html head .if !'\\$1'' .html title \\$1 .HEAD .html head .html body .. .de FSFIRST .de NOTES xx ._NOTES .rm _NOTES xx .em NOTES .da _NOTES .sp .B "Notes .sp .da .. .de FS .FSFIRST .rm FSFIRST .da _NOTES .. .de FE .sp .da .. .nr png -1 1 .de TS .ds pngbase "\\*[basename] .if '\\*[pngbase]'' .ds pngbase \\n(.B .ds pngfile \\*[pngbase]\\n+[png].png .html -
.\" The .inputpipe must be the last line of the macro! .inputpipe .TE troff2png >\\*[pngfile] .. .de TE .. .de PS .ds pngbase "\\*[basename] .if '\\*[pngbase]'' .ds pngbase \\n(.B .ds pngfile \\*[pngbase]\\n+[png].png .html -
.inputpipe .PE troff2png >\\*[pngfile] .. .de PE .. .de B1 .margin 0 .nr TW 10 .nr TW1 80 .if !'\\$1'' .nr TW \\$1 .if !'\\$2'' .nr TW1 \\$2 .html box \
\ \ \ \ \ .html box0 .html box1 \ \ .html box .margin 1 .. 9base-6/troff/tmac/tmac.mcs0000644000175000017500000012407311402154555015251 0ustar anselmanselm'''\" @(#)dcs:csmacros 2.3 5/2/89 '''\" registers '''\" a - abstract continuation flag - 0 (no), >0 (yes - number of overflow pages) '''\" b - mercury selections counter '''\" c - distribution continuation flag - 0 (no), 1 (yes) '''\" d - distribution length calculation flag - 0 (no), 1 (yes) '''\" e - complete copy basic distribution length '''\" g - complete copy overflow distribution length '''\" h - cover sheet basic distribution length '''\" i - cover sheet overflow distribution length '''\" j - scratch '''\" k - keyword flag - 0 (none), 1 (some) '''\" l - number of vertical units per line - troff and nroff '''\" m - memorandum type flag - 1 TM, 2 IM, 3 TC '''\" n - document number counter '''\" o - title flag - 0 (no), 1 (yes - vertical size of title diversion) '''\" p - proprietary notice flag - 0 (none), 1 (default notice), 2(BR) '''\" q - scratch '''\" r - security flag - 0 (no), 1 (yes) '''\" s - software flag - 0 (no), 1 (yes) '''\" t - mark title position '''\" u - author count '''\" v - scratch '''\" w - scratch '''\" x - mark scratch position '''\" y - mark scratch position '''\" z - mark scratch position '''\" ra - release to Lucent flag - 0 (no decision), 1 (yes), 2 (no) '''\" an - length abstract footnote diversion '''\" fn - length footnote diversion '''\" as - "in abstract" flag - 0 (no), 1 (yes) '''\" ds - "in display" flag - 0 (no), 1 (yes) '''\" fs - "in footnote" flag - 0 (no), 1 (yes) '''\" bd - block center display flag - 0 (no), 1 (yes) '''\" dv - device flag - 0 (default), 1 (APS-5), 2 (i10), 3 (xerox), 4 (i300), 5 (qms1200), 6 (postscript) '''\" lp - lines per page (nroff - xerox) '''\" tp - total pages (decimal) '''\" tc - total pages (in small roman) '''\" np - page number this page (decimal) '''\" nc - page number this page (in small roman) '''\" lt - vertical size of title diversion (in lines) '''\" lo - vertical size of copy overflow trap (in lines) '''\" la - vertical size of abstract diversion '''\" a1 - vertical size of page 1 portion of abstract '''\" a2 - vertical size of overflow page portion of abstract '''\" ar - vertical size remainder of abstract '''\" fi - save current fill/no-fill (.u) '''\" in - save current indent (.i) '''\" si - standard indent - ens (for paragraphs, displays & equations) '''\" ps - initial point size (.s) '''\" ts - temp point size (only in S macro) '''\" vs - initial vertical spacing (.v) '''\" tv - temp vertical spacing (only in S macro) '''\" b1, b2 - scratch calculations '''\" g1, g2, g3, g4, g5 - complete copy overflow - additional diversion lengths '''\" i1, i2, i3, i4, i5 - cover sheet only overflow - additional diversionlengths '''\" m1 - mark scratch position '''\" :b, :c, :d, :e - scratch (lists only) '''\" :h - SA macro only '''\" ls - nested list level (lists only) '''\" dt - display type (displays & equations) '''\" fc - filing case flag '''\" wp - work project number flag '''\" en - entity flag - 1 (BL), 2 (IS), 3 (TI), 4 (CH) '''\" lg - Lucent logo flag - 0 (not defined), 1 (defined) '''\" oa - organizational approval name counter '''\" aa - ship to itds '''\" strings '''\" a) - mercury info '''\" b) - mercury info '''\" c) - mercury info '''\" e) - equation label '''\" k) - keywords '''\" m) - Mailing Label/DRAFT '''\" n) - first document number '''\" o) - proprietary classification heading '''\" p) - proprietary string 1 '''\" q) - " " 2 '''\" r) - " " 3 '''\" s) - timestamp string '''\" t) - memo type (TM, IM, TC) '''\" u) - trailing s if multiple author '''\" v) - trailing s if multiple document number '''\" w) - trailing s if multiple filing case '''\" x) - trailing s if multiple work project number '''\" y) - used in lists '''\" z) - used in lists '''\" a( - '''\" e( - earlier document number '''\" m( - authors 1-3 sig '''\" n( - authors 4-6 sig '''\" o( - authors 7-9 sig '''\" p( - authors 10-12 sig '''\" r( - responsible person '''\" s( - S software string '''\" t( - memo type ("for Technical Memorandum", etc.) '''\" u( - organizational approval 1-3 sig '''\" v( - organizational approval 4-6 sig '''\" w( - organizational approval 7-9 sig '''\" x( - organizational approval 10-12 sig '''\" Tm - trademark '''\" lG - Lucent logo '''\" 10 - used in equations '''\" ve - csmacros version '''\" e1,e2,e3,e4 - entity info '''\" diversions '''\" aS - abstract '''\" aV - author info section '''\" cA - complete copy addressee primary '''\" cO - complete copy addressee overflow '''\" cU, cV, cW, cX, cY, cZ - complete copy addressee overflow (previously lost) '''\" dA - cover sheet addressee primary '''\" dO - cover sheet addressee overflow '''\" dU, dV, dW, dX, dY, dZ - cover sheet only addressee overflow (previously lost) '''\" dM - document number info '''\" dS - display '''\" eQ - equation '''\" fB - filing case info '''\" tI - title '''\" wO - work project number info '''\" aN - abstract footnote '''\" fN - footnote '''\" '''\" macros to collect information '''\" aC - Lucent company '''\" tS - timestamp '''\" TL - title '''\" AU - author '''\" FS - footnote start '''\" FE - footnote end '''\" AS - abstract start '''\" AE - abstract end '''\" OK - keyword info '''\" MT - document type '''\" dN - document number info '''\" oA - organization approval name '''\" eD - earlier document number '''\" fC - filing case '''\" fD - full date '''\" wP - work project info '''\" mE - mercury selections (7 argument version) '''\" mC - mercury codes (three argument version) '''\" Mc - mercury codes (one argument version) '''\" PM - proprietary marking '''\" gS - government security '''\" rA - release to Lucent employees (superceded by fA) '''\" fA - future Lucent distribution (supercedes rA) '''\" sF - software-related '''\" cC - complete copy addressee list start '''\" cD - complete copy overflow '''\" cS - cover sheet only addressee list start '''\" cT - cover sheet only overflow '''\" zZ - complete copy overflow (previously lost) '''\" fF - complete copy overflow (aux) '''\" wW - cover sheet overflow (previously lost) '''\" gG - cover sheet only overflow (aux) '''\" cE - addressee list end '''\" eE - addressee list end (aux) '''\" macros to help format document '''\" B - change to bold font '''\" I - change to italic font '''\" R - change to roman font '''\" S - set point size and vertical spacing '''\" sP - space 1 vertical space '''\" P - paragraph '''\" HC - set hyphenation indicator '''\" iN - font and size re-initialization '''\" DS - display start '''\" DE - display end '''\" EQ - equation start '''\" EN - equation end '''\" VL - variable-item list '''\" ML - marked list '''\" LI - list item '''\" LE - list end '''\" hD - header '''\" fO - footer '''\" yY - abstract overflow '''\" aT - abstract overflow trap '''\" tK - thick lines '''\" bE - empty box '''\" bX - box with X '''\" tH - title heading '''\" cH - continuation header '''\" dH - distribution list headers '''\" oH - overflow distribution list headers '''\" eP - eject distribution continuation page '''\" cP - continuation page '''\" dP - continuation page (aux) '''\" tP - compute pages and diversion lengths '''\" t1 - " " '''\" dL - compute basic distribution length '''\" CS - output cover sheet '''\" initialization '''\" '''\" registers .nr a 0 1 .nr b 0 1 .nr c 0 .nr d 0 .nr e 0 .nr g 0 .nr g1 0 .nr g2 0 .nr g3 0 .nr g4 0 .nr g5 0 .nr h 6 .nr i 0 .nr i1 0 .nr i2 0 .nr i3 0 .nr i4 0 .nr i5 0 .nr j 0 .nr k 0 .nr m 0 .nr n 0 1 .nr o 0 .nr p 1 .nr q 0 .nr r 0 .nr s 0 .nr t 0 .nr u 0 1 .nr v 0 .nr w 0 .nr x 0 .nr y 0 .nr z 0 .nr an 0 .nr fn 0 .nr as 0 .nr ds 0 .nr fs 0 .nr bd 0 .nr tp 0 .nr tc 0 .af tc i .nr np 2 .nr nc 2 .af nc i .nr la 0 .nr a1 0 .nr a2 0 .nr ar 0 .nr fi 0 .nr in 0 .nr :b 0 .nr :c 0 .nr :d 0 .nr :e 0 .nr :h 0 .nr ls 0 1 .nr dt 0 .nr fc 0 1 .nr wp 0 1 .nr en 1 .nr lg 0 .nr ra 0 .nr oa 0 1 '''\" initialize lines per page .nr lp 66 .if n .nr lp 65 '''\" initialize device register .nr dv 0 .if '\*(.T'aps' .nr dv 1 .if '\*(.T'i10' .nr dv 2 .if '\*(.T'X97.tim10p' .nr dv 3 .if '\*(.T'X97.tim12p' .nr dv 3 .if '\*(.T'X97.ti10p' .nr dv 3 .if '\*(.T'X97.ti12p' .nr dv 3 .if '\*(.T'i300' .nr dv 4 .if '\*(.T'qms' .nr dv 5 .if '\*(.T'post' .nr dv 6 '''\" initialize font positions .ie \n(dv=3 \{\ .fp 1 R .fp 2 I .fp 3 B .fp 4 I \} .el .ie \n(dv=5 \{\ .fp 1 R .fp 2 I .fp 3 B .fp 4 S \} .el \{\ .fp 1 H .fp 2 HI .fp 3 HB .fp 4 HX \} '''\" initialize units per vertical space .if t .nr l 120 .if \n(dv=2 .nr l 40 .if \n(dv=3 .nr l 50 .if \n(dv=5 .nr l 50 .if n .nr l 40 '''\" initialize standard indent .nr si 5 '''\" diversions .di aV .di .di dM .di .di cA .di .di cO .di .di cU .di .di cV .di .di cW .di .di cX .di .di cY .di .di cZ .di .di dA .di .di dO .di .di dU .di .di dV .di .di dW .di .di dX .di .di dY .di .di dZ .di .di fB .di .di wO .di '''\" initialize Lucent logo '''\" eventually substitute LH for Lb (DWB 2) .ie \n(dv=5 .ds lG \s10\f(ATx\fP\f\\nv\fP\s0 .el .ds lG \s36\(LH\s0 '''\" initialize entity strings .ds e1 "LUCENT-BL .ds e2 "LUCENT .ds e3 "LUCENT BELL LABORATORIES .ds e4 "Department Head '''\" initialize trademark symbol string .if t .ds Tm \v'-0.5m'\s-4TM\s+4\v'0.5m' .if n .ds Tm \uTM\d '''\" initialize timestamp string .ds s) 0 '''\" initialize responsible person string .ds r( 0 '''\" initialize earlier document number string .ds e( 0 '''\" initialize csmacro version string .ds ve MCS (04/30/89) '''\" initialize point size, vertical space & indent .nr ps 10 .ps \\n(ps .nr vs 12 .if t .vs \\n(vsp .in 0 '''\" '''\" macros to collect information '''\" .de aC \" macro for Lucent company (entity) . \" set en=1 if BL (default) . \" set en=2 if IS . \" set en=3 if TI . \" set en=4 if CH (Corporate Headquarters) .if '\\$1'BL' .nr en 1 .if '\\$1'IS' .nr en 2 .if '\\$1'TI' .nr en 3 .if '\\$1'CH' .nr en 4 .if \\n(en=1 \{\ .ds e1 "LUCENT-BL .ds e2 "LUCENT .ds e3 "LUCENT BELL LABORATORIES .ds e4 "Department Head .br\} .if \\n(en=2 \{\ .ds e1 "LUCENT-IS .ds e2 "LUCENT .ds e3 "LUCENT INFORMATION SYSTEMS .ds e4 "Department Head .br\} .if \\n(en=3 \{\ .ds e1 "Lucent Technologies, Inc. .ds e2 "Lucent .ds e3 "LUCENT TECHNOLOGIES, INC. .ds e4 "Manager .br\} .if \\n(en=4 \{\ .ds e1 "Lucent .ds e2 "Lucent .ds e3 " Lucent .ds e4 "Department Head .br \} .rm aC .. .de tS \" macro for timestamp '''\" if timestamp string=0, store arg #1 if non-empty. .if '\\*(s)'0' \{\ .if !'\\$1'' \{\ .ie '\\$2'1' .ds s) "D R A F T .el .ds s) "Timestamp: \\$1 \} \} .. .de TL \" macro for title .if \\nu>0 \{\ .tm ERROR: coversheet file set up incorrectly - document title must be supplied before author .ab \} .br .fi .nr aa 1 \" set default to send cover to ITDS .ie !'\\n(.F'stdin' \{\ . ie !'\\n(.F'-' \{\ . sy /usr/lib/tmac/timestamp \\n(.F>/tmp/tp\\n($$ . so /tmp/tp\\n($$ . sy /bin/rm /tmp/tp\\n($$ . br \} \" don't remove br - gets around troff bug . el \{\ . nr aa 0 . tm Coversheet not sent to library. input is '-' \} \} .el \{\ . nr aa 0 . tm Coversheet not sent to library. input is 'stdin' \} .ie '\\$1'' \{\ . ds m) "Mailing Label \} .el \{ . nr aa 0 . tm Coversheet not sent to library. DRAFT document . ds m) \\s+2DRAFT\\s-2 \} \} .ll 6.0i '''\" diversion for title .di tI .rm TL .. .de AU \" macro for author info '''\" don't count author unless non-empty .if !\\$1 .nr u \\n+u .if \\nu=1 \{\ .br '''\" end title diversion on first author .di .nr lt (\\n(dn)/(\\nl) .nr o \\n(dn .ll .nf \} .ta 0.3i 2.6i 3.0i 4.0i 5.4i .br '''\" append to author list .da aV \\$1 \\$3 \\$6 \\$5 \\$7 .br .da '''\" end append; info for signature lines .if \\nu=1 .ds m( \\$1 .if \\nu=2 .as m( \\$1 .if \\nu=3 .as m( \\$1 .if \\nu=4 .ds n( \\$1 .if \\nu=5 .as n( \\$1 .if \\nu=6 .as n( \\$1 .if \\nu=7 .ds o( \\$1 .if \\nu=8 .as o( \\$1 .if \\nu=9 .as o( \\$1 .if \\nu=10 .ds p( \\$1 .if \\nu=11 .as p( \\$1 .if \\nu=12 .as p( \\$1 .. .de rP \" macro for responsible person .if !'\\$1'' .ds r( \\$1 .rm rP .. .de FS \" macro for footnote start .if \\n(fs>0 \{\ .tm Footnote within footnote - illegal. .FE \} .if \\n(ds>0 \{\ .tm Footnote within display - illegal. .FE \} .nr fs 1 .ev 1 .br .ll 6.4i .ps 8 .if t .vs 10p .fi .ie \\n(as>0 .da aN .el \{\ .da fN .if \\n(fn=0 \{\ .br .if n __________ .if t \l'1i' .br \} \} .if \\n(.$=1 \\$1 .. .de FE \" macro for footnote end .br .da .ie \\n(as>0 .nr an \\n(dn+\\n(an .el .nr fn \\n(dn+\\n(fn .ev .nr fs 0 .. .de AS \" macro for abstract info .nr as 1 .br .fi .ll 7.0i .ta 0.5i 1.0i 1.5i .di aS .rm AS .. .de AE \" macro for end of abstract info .br .di .nr la \\n(dn .iN .if \\n(an>0 \{\ .br .da aS .br .if n __________ .if t \l'1i' .br .nf .aN .rm aN .br .da .nr la \\n(la+\\n(dn \} .iN .rm iN .ll .nf .nr as 0 .rm DS DE EQ EN VL ML LI LE .rm dS eQ .rm B I R S sP P .rm FS FE AE .. .de OK \" macro for keyword info .ds k) .if !\\$1 .as k) \\$1 .if !\\$2 .as k); \\$2 .if !\\$3 .as k); \\$3 .if !\\$4 .as k); \\$4 .if !\\$5 .as k); \\$5 .if !\\$6 .as k); \\$6 .if !\\$7 .as k); \\$7 .if !\\$8 .as k); \\$8 .if !\\$9 .as k); \\$9 '''\" set k flag if we have some keywords .ie !\\*(k) .nr k 1 .el .nr k 0 .rm OK .. .de MT \" macro for document type .if '\\$1'1' \{\ .nr m 1 .ds t) TM .ds t( "for Technical Memorandum\} .if '\\$1'2' \{\ .nr m 2 .ds t) IM .ds t( "for Internal Memorandum\} .if '\\$1'3' \{\ .nr m 3 .ds t) TC .ds t( "for Technical Correspondence\} .rm MT .. .de dN \" macro for document number info .ie \\ns=1 .ds s( S .el .ds s( .ta 0.8i .br .da dM .if !'\\$1'' \{\ \\$1\\*(t)\\*(s( .nr n \\n+n '''\" \" save first document number .if \\nn=1 .ds n) \\$1\\*(t)\\*(s( \} .br .da .. .de oA \" macro for organizational approval names(s) .nr oa \\n+(oa .if \\n(oa=1 .ds u( \\$1 .if \\n(oa=2 .as u( \\$1 .if \\n(oa=3 .as u( \\$1 .if \\n(oa=4 .ds v( \\$1 .if \\n(oa=5 .as v( \\$1 .if \\n(oa=6 .as v( \\$1 .if \\n(oa=7 .ds w( \\$1 .if \\n(oa=8 .as w( \\$1 .if \\n(oa=9 .as w( \\$1 .if \\n(oa=10 .ds x( \\$1 .if \\n(oa=11 .as x( \\$1 .if \\n(oa=12 .as x( \\$1 .. .de fC \" macro for filing case info .ta 3.5i .br .da fB .if !'\\$1'' \{\ .nr fc \\n+(fc \\$1 \} .br .da .. .de fD \" macro for full date info .if !'\\$1'' .fC \\$1 \" use .fC macro underneath .. .de wP \" macro for work project info .ta 5.5i .br .da wO .if !'\\$1'' \{\ .nr wp \\n+(wp \\$1 \} .br .da .. .de mC \" macro for mercury selections - three argument version .if !'\\$1'' .Mc \\$1 .if !'\\$2'' .Mc \\$2 .if !'\\$3'' .Mc \\$3 .. .de Mc \" macro for mercury selections - one argument .ds c) .if \\nb<3 \{\ .ie '\\$1'CHM' .ds c) " CHM - Chemistry and Materials .el .ie '\\$1'chm' .ds c) " CHM - Chemistry and Materials .el .ie '\\$1'CMM' .ds c) " CMM - Communications .el .ie '\\$1'cmm' .ds c) " CMM - Communications .el .ie '\\$1'CMP' .ds c) " CMP - Computing .el .ie '\\$1'cmp' .ds c) " CMP - Computing .el .ie '\\$1'ELC' .ds c) " ELC - Electronics .el .ie '\\$1'elc' .ds c) " ELC - Electronics .el .ie '\\$1'LFS' .ds c) " LFS - Life Sciences .el .ie '\\$1'lfs' .ds c) " LFS - Life Sciences .el .ie '\\$1'MAN' .ds c) " MAN - Manufacturing .el .ie '\\$1'man' .ds c) " MAN - Manufacturing .el .ie '\\$1'MAS' .ds c) " MAS - Mathematics and Statistics .el .ie '\\$1'mas' .ds c) " MAS - Mathematics and Statistics .el .ie '\\$1'MKT' .ds c) " MKT - Marketing .el .ie '\\$1'mkt' .ds c) " MKT - Marketing .el .ie '\\$1'PHY' .ds c) " PHY - Physics .el .ie '\\$1'phy' .ds c) " PHY - Physics .el .ie '\\$1'STD' .ds c) " STD - Standards .el .ie '\\$1'std' .ds c) " STD - Standards .el .ie '\\$1'PRP' .ds c) " PRP - Product Realization Process .el .ie '\\$1'prp' .ds c) " PRP - Product Realization Process .el .ie '\\$1'QLT' .ds c) " QLT - Quality .el .if '\\$1'qlt' .ds c) " QLT - Quality .ie '\\*(c)'' .tm WARNING: \\$1 - unknown mercury selection .el \{\ .nr b \\n+b .if t .as a) \\*(c) .if n \{\ .ie \\nb=3 \{\ .rn a) b) .ds a) \\*(c) \} .el .as a) \\*(c)\}\}\} .. .de mE \" macro for mercury selections .ds a) .ds b) .ds c) '''\" either 'y' or '1' arguments honored .nr q 0 .if '\\$1'y' .nr q 1 .if '\\$1'1' .nr q 1 .if \\nq=1 \{\ .as a) " CHM - Chemistry and Materials .nr b \\n+b \} .nr q 0 .if '\\$2'y' .nr q 1 .if '\\$2'1' .nr q 1 .if \\nq=1 \{\ .as a) " CMM - Communications .nr b \\n+b .if n \{\ .if \\nb=2 .rn a) b) \} \} .nr q 0 .if '\\$3'y' .nr q 1 .if '\\$3'1' .nr q 1 .if \\nq=1 \{\ .as a) " CMP - Computing .nr b \\n+b .if t \{\ .if \\nb=3 .rn a) b) \} .if n \{\ .if \\nb=2 .rn a) b) \} \} .nr q 0 .if '\\$4'y' .nr q 1 .if '\\$4'1' .nr q 1 .if \\nq=1 \{\ .as a) " ELC - Electronics .nr b \\n+b .if t \{\ .if \\nb=3 .rn a) b) \} .if n \{\ .if \\nb=4 \{\ .rn b) c) .rn a) b) \} .if \\nb=2 .rn a) b) \} \} .nr q 0 .if '\\$5'y' .nr q 1 .if '\\$5'1' .nr q 1 .if \\nq=1 \{\ .as a) " LFS - Life Sciences .nr b \\n+b .if t \{\ .if \\nb=3 .rn a) b) \} .if n \{\ .if \\nb=4 \{\ .rn b) c) .rn a) b) \} .if \\nb=2 .rn a) b) \} \} .nr q 0 .if '\\$6'y' .nr q 1 .if '\\$6'1' .nr q 1 .if \\nq=1 \{\ .as a) " MAS - Mathematics and Statistics .nr b \\n+b .if t \{\ .if \\nb=3 .rn a) b) \} .if n \{\ .if \\nb=4 \{\ .rn b) c) .rn a) b) \} .if \\nb=2 .rn a) b) \} \} .if \\nb<6 \{\ .nr q 0 .if '\\$7'y' .nr q 1 .if '\\$7'1' .nr q 1 .if \\nq=1 \{\ .as a) " PHY - Physics .nr b \\n+b .if t \{\ .if \\nb=3 .rn a) b) \} .if n \{\ .if \\nb=4 \{\ .rn b) c) .rn a) b) \} .if \\nb=2 .rn a) b) \} \} \} .if t \{\ .if \\nb=3 .rn b) a) \} .if n \{\ .if \\nb=4 \{\ .rn b) a) .rn c) b) \} .if \\nb=2 .rn b) a) \} .rm mE .. .de eD \" macro for earlier document number .if !'\\$1'' .ds e( \\$1 .rm eD .. .de PM \" macro for proprietary marking . \" arg 1 - RS or BR or IR or TR or R - restricted .if '\\$1'RS' .nr p 2 .if '\\$1'BR' .nr p 2 .if '\\$1'IR' .nr p 2 .if '\\$1'TR' .nr p 2 .if '\\$1'R' .nr p 2 .rm PM .. .de gS \" macro for government security classified .nr r 1 .rm gS .. .de rA \" macros for release to Lucent employees . \" superceded by .fA macro 072087 .nr ra 1 .rm rA .. .de fA \" macro for future Lucent distribution . \" arg 1 = 'y' or 'Y' or 'n' or 'N' .if '\\$1'y' .nr ra 1 .if '\\$1'Y' .nr ra 1 .if '\\$1'n' .nr ra 2 .if '\\$1'N' .nr ra 2 .rm fA .. .de sF \" macro for software-related document .nr s 1 .rm sF .. .de cI .rm cI .. .de dL \" macro for calculating basic distribution length '''\" call once only - from .cC, .cS, or .CS .if \\nd=0 \{\ .nr d 1 '''\" calculate space considerations '''\" basic distribution length - to be tailored - set e and h .if \\nr=0 .nr e \\ne+2 .if \\nu<=3 .nr e \\ne+3 .if \\nu<=6 .nr e \\ne+3 .if \\nu<=9 .nr e \\ne+3 .if (((\\n(oa>0)&(\\n(oa<=3)):((\\nn<=3)&(\\n(oa=0))) .nr e \\ne+3 .if (((\\n(oa>0)&(\\n(oa<=6)):((\\nn<=6)&(\\n(oa=0))) .nr e \\ne+3 .if (((\\n(oa>0)&(\\n(oa<=9)):((\\nn<=9)&(\\n(oa=0))) .nr e \\ne+3 '''\" nroff: if p=2, 1 extra line under Org Approval .if n .if \\np=2 .nr e \\ne-1 '''\" Future Lucent Distribution handling .if ((\\n(ra<2)&(\\np=2)) \{\ .nr ra 2 .tm WARNING: Future Lucent Distribution by ITDS - PROPRIETARY (RESTRICTED) document MAY NOT BE RELEASED without appropriate approval for each request; coversheet has been modified accordingly\} .if \\n(ra=0 \{\ .tm WARNING: Future Lucent Distribution by ITDS: missing or invalid .fA macro; indicate desired action by checking yes or no box on page 2 of coversheet; next time include .fA macro with y or n argument \} '''\" at least 3 lines for Future Lucent Distribution section (more for nroff negative and ra=0) '''\" \" next 2 lines for yes/no boxes; remove when .fA macro becomes mandatory .if t .if \\n(ra=0 .nr e \\ne-4 .if n .if \\n(ra=0 .nr e \\ne-5 .if \\n(ra=1 .nr e \\ne-3 .if t .if \\n(ra=2 .nr e \\ne-3 .if n .if \\n(ra=2 .nr e \\ne-4 '''\" increment number on next two lines to drop text lower on page 2 .if t .nr e \\ne+23 .if n .nr e \\ne+21 .if n \{\ '''\" if page 2 text changes, change values in next 3 lines .if \\ne<4 \{\ .tm ERROR: insufficient space to format cover sheet; use "docsend -Taps" \ for APS-5, "docsend -Ti10" for imagen, or "docsend -TX97" - \ or use stockroom cover sheet .ab \} .ie \\ne<8 .nr e 0 .el .nr e \\ne-7 \} .nr h \\ne .br \} .rm dL .. .de cC \" macro for handling complete copy addressees .dL .ta 2.0i .nf .br .ie \\ne>0 \{\ .da cA .dt \\nev cD \} .el .da cO .rm cC .. .de cD \" macro for handling complete copy address overflow .ta 2.0i .br .da .da cO .nr lo 56-\\n(lt .dt \\n(lo zZ .. .de zZ \" macro for handling previously lost complete copy address overflow . \" provide 5 additional continuation pages (6 in all - approx 350 names) .ie "\\n(.z"cO" .fF "g" "cU" .el .ie "\\n(.z"cU" .fF "g1" "cV" .el .ie "\\n(.z"cV" .fF "g2" "cW" .el .ie "\\n(.z"cW" .fF "g3" "cX" .el .ie "\\n(.z"cX" .fF "g4" "cY" .el .if "\\n(.z"cY" .fF "g5" "cZ" .. .de fF \" aux macro for handling previously lost complete copy address overflow .ta 2.0i .br .da .ie \\n(dn>0 \{\ .nr \\$1 (\\n(dn)/\\nl+4 .da \\$2 .nr lo 56-\\n(lt .dt \\n(lo zZ \} .el \{\ .nr \\$1 0 .da cZ \} .. .de cS \" macro for handling cover sheet only addresses .dL .ta 2.0i .nf .br .ie \\nh>0 \{\ .da dA .dt \\nhv cT \} .el .da dO .rm cS .. .de cT \" macro for handling cover sheet address overflow .ta 2.0i .br .da .da dO .nr lo 56-\\n(lt .dt \\n(lo wW .. .de wW \" macro for handling previously lost cover sheet only address overflow . \" provide 5 additional continuation pages (6 in all - approx 350 names) .ie "\\n(.z"dO" .gG "i" "dU" .el .ie "\\n(.z"dU" .gG "i1" "dV" .el .ie "\\n(.z"dV" .gG "i2" "dW" .el .ie "\\n(.z"dW" .gG "i3" "dX" .el .ie "\\n(.z"dX" .gG "i4" "dY" .el .if "\\n(.z"dY" .gG "i5" "dZ" .. .de gG \" aux macro for handling previously lost cover sheet only address overflow .ta 2.0i .br .da .ie \\n(dn>0 \{\ .nr \\$1 (\\n(dn)/\\nl+4 .da \\$2 .nr lo 56-\\n(lt .dt \\n(lo wW \} .el \{\ .nr \\$1 0 .da dZ \} .. .de cE \" macro for ending all distribution diversions .br .ie "\\n(.z"cA" \{\ .da .rm cD \} .el .ie "\\n(.z"cO" .eE "g" "cD" .el .ie "\\n(.z"cU" .eE "g1" "cD" .el .ie "\\n(.z"cV" .eE "g2" "cD" .el .ie "\\n(.z"cW" .eE "g3" "cD" .el .ie "\\n(.z"cX" .eE "g4" "cD" .el .ie "\\n(.z"cY" .eE "g5" "cD" .el .ie "\\n(.z"cZ" \{\ .da .rm cD \} .el .ie "\\n(.z"dA" \{\ .da .rm cT \} .el .ie "\\n(.z"dO" .eE "i" "cT" .el .ie "\\n(.z"dU" .eE "i1" "cT" .el .ie "\\n(.z"dV" .eE "i2" "cT" .el .ie "\\n(.z"dW" .eE "i3" "cT" .el .ie "\\n(.z"dX" .eE "i4" "cT" .el .ie "\\n(.z"dY" .eE "i5" "cT" .el .if "\\n(.z"dZ" \{\ .da .rm cT \} .. .de eE \" aux macro for ending all distribution diversions .da .ie \\n(dn>0 .nr \\$1 (\\n(dn)/\\nl+4 .el .nr \\$1 0 .rm \\$2 .. '''\" '''\" macros to help format document '''\" .deB .ie\\n(.$ .nr ;G \\n(.f .el.ft 3 .if\\n(.$ .if !\\n(.$-2 \&\f3\\$1\fP\\$2 .if\\n(.$-2 \{.ds }i .if\\n(.f2 .ds }i \^ .ds}I \&\f3\\$1\fP\\$2\\*(}i 'br\} .if\\n(.$-2 .if !\\n(.$-4 \\*(}I\f3\\$3\fP\\$4 .if\\n(.$-4 .if !\\n(.$-6 \\*(}I\f3\\$3\fP\\$4\\*(}i\f3\\$5\fP\\$6 .if\\n(.$ .ft \\n(;G .. .deI .ie\\n(.$ .nr ;G \\n(.f .el.ft 2 .if\\n(.$ .if !\\n(.$-1 \&\f2\\$1 .if\\n(.$-1 \{.ds }i \^ .if\\n(.f2 .ds }i .ds}I \& .if\w\\$1 .ds }I \&\f2\\$1\fP\\*(}i 'br\} .if\\n(.$-1 .if !\\n(.$-3 \\*(}I\\$2\f2\\$3 .if\\n(.$-3 .if !\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5 .if\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5\fP\\*(}i\\$6 .if\\n(.$ .ft \\n(;G .. .deRI .nr;G \\n(.f .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deRB .nr;G \\n(.f .}S 1 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deIR .nr;G \\n(.f .}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deIB .nr;G \\n(.f .}S 2 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deBR .nr;G \\n(.f .}S 3 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .deBI .nr;G \\n(.f .}S 3 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" .. .de}S .ds}i .if\\$12 .if !\\$5 .ds }i\^ .ie!\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(}i" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" .el\\$3 .ft\\n(;G .. .deR .ft1 .ul0 .. .de S \" set point size and vertical spacing .ie \\n(.$=0 \{\ .ps .if t .vs \} .el \{\ .ie \w\(ts\\$1\(ts \{\ .ie 0\\$1-99 .nr ts \\n(ps .el .nr ts \\$1 \} .el .nr ts \\n(.s .ps \\n(ts .if \\n(.$=1 .if t \{\ .nr tv \\n(.s+2 .vs \\n(tvp \} .if \\n(.$>1 .if t \{\ .ie \w\(ts\\$2\(ts \{\ .ie 0\\$2-99 .nr tv \\n(.s+2 .el .nr tv \\$2 \} .el .nr tv \\n(.v .vs \\n(tvp \} \} .. .de sP \" space 1 blank line (vertical space) .if n .sp 1 .if t .sp 0.5 .. .de P \" paragraph - (default - left-adjusted) . \" arg #1=0 - left-adjusted . \" arg #1=1 - indent standard amount .ne 1.1 .sP .if (\\n(.$>0)&(0\\$1=1) .ti +\\n(sin .. .de HC \" set hyphenation indicator .ev0 .hc\\$1 .ev .ev1 .hc\\$1 .ev .ev2 .hc\\$1 .ev .. .de SA \" macro for right-adjustment .if \\n(.$ \{\ .if \\$1-1 .tm WARNING: SA: bad arg:\\$1 .nr :h 0\\$1 \} 'na .if \\n(:h 'ad .. .de iN \" macro for font and size re-initialization .ft 1 .ps \\n(ps .if t .vs \\n(vsp .. .de DS \" macro for display start .if \\n(ds>0 \{\ .tm Display within display - illegal. .DE \} .if \\n(fs>0 \{\ .tm Display within footnote - illegal. .FE \} .nr in \\n(.i .nr fi \\n(.u .br .ev 2 .br .ll 7.0i .nf .in \\n(inu .sP .if \\n(.$>1 \{\ .if '\\$2'F' .nr dt 4 .if '\\$2'1' .nr dt 4 .if \\n(dt=4 .fi \} .if \\n(.$>2 .ll-0\\$3 .nr dt 0 .nr bd 0 .if '\\$1'I' .nr dt 1 .if '\\$1'1' .nr dt 1 .if \\n(dt=1 .in \\n(sin .if '\\$1'C' .nr dt 2 .if '\\$1'2' .nr dt 2 .if \\n(dt=2 .ce 1000 .if '\\$1'CB' .nr dt 3 .if '\\$1'3' .nr dt 3 .if \\n(dt=3 \{\ .nr bd 1 .di dS \} .nr ds 1 .. .de DE \" macro for display end .br .ie \\n(ds=0 .tm DE: no active DS .el \{\ .ce 0 .if \\n(bd>0 \{\ .di .if \\n(dl>\\n(bd .nr bd \\n(dl .if \\n(bd<\\n(.l .in (\\n(.lu-\\n(bdu)/2u .nr dt \\n(.l-\\n(.i .ta \\n(dtuR .dS .br \} .nr bd 0 .nr ds 0 .nr dt 0 .ev .in \\n(inu .sP .ie \\n(fi=0 .nf .el .fi \} .. .de EQ \" macro for equation start .ds e) \\$1 .di eQ .. .de EN \" macro for equation end \!.br .br .di .lt \\n(.lu .pc .if \w\(ts\\*(10\\*(e)\(ts \{\ .ie \\n(bd>0 \{\ .if \\n(bd<\w\(ts\\*(10\(ts .nr bd \w\(ts\\*(10\(ts \!\\*(10\h'\\\\n(.lu-\w\(ts\\*(10\\*(e)u\(ts-\\\\n(.iu'\\*(e) .br \} .el .ie \\n(dt=2 .tl \(ts\(ts\\*(10\(ts\\*(e)\(ts .el .ie \\n(dt=1 .tl \(ts\h'\\n(sin'\\*(10\(ts\(ts\\*(e)\(ts .el .if \\n(dt=0 .tl \(ts\\*(10\(ts\(ts\\*(e)\(ts 'br\} .pc% .lt .. .de VL \" macro for variable-item lists .if \\n(ls>0 \{\ .tm VL: lists may not be nested .LE \} .ie \\n(.$<1 .tm WARNING: VL: text-indent not defined .el \{\ .nr in \\n(.i .nr :b \\n(.iu+0\\$1n .nr :c \\n(.iu+0\\$2n .ds y) \& .ie \\n(.$=3 .nr :d 1 .el .nr :d 0 .if \\n(:d=1 .sP .fi .nr ls +1 .br \} .. .de ML \" macro for marked list .if \\n(ls>0 \{\ .tm ML: lists may not be nexted .LE \} .ie \\n(.$<1 .tm ML: mark not defined .el \{\ .nr in \\n(.i .ds y) \\$1 .ie (\\n(.$>1)&(\\$2>0) .nr :b \\n(.iu+0\\$2n .el .nr :b \\n(.iu+\w\(ts\\*(y)\(tsu+1n .nr :c \\n(:bu-1n-\w\(ts\\*(y)\(tsu .ie \\n(.$=3 .nr :d 1 .el .nr :d 0 .if \\n(:d=1 .sP .fi .in \\n(:bu .nr ls +1 .br \} .. .de BL \" macro for bullet list - using marked list .ie \\n(.$=2 .ML \\(bu \\$1 \\$2 .el .ie \\n(.$=1 .ML \\(bu \\$1 .el .ML \\(bu .. .de LI \" macro for list item .ie \\n(ls=0 .tm LI: no active lists .el \{\ .ds z) \\*(y) .if \\n(.$=1 .ds z) \\$1 .if \\n(.$=2 .ds z) \\$1\&\\*(z) .if \\n(:d=0 .sP .in \\n(:bu .ti \\n(:cu .nr :e \w\(ts\\*(z)\(ts \\*(z)\h'\\n(:bu-\\n(:cu-\\n(:eu'\c \} .. .de LE \" macro for list end .ie \\n(ls=0 .tm LE: no active list .el \{\ .br .nr ls -1 'in \\n(inu 'ti \\n(inu .if \\n(.$>0 .sP \} .. .de hD \" header macro '''\" page offset 0.6i for XEROX & DASI; 0.25i for all other devices '''\" cut marks for APS only .po 0.25i .if \\n(dv=3 .po 0.6i .if n .po 0.6i .if \\n(dv=1 .tl '\(rn''\(rn' .if t 'sp|0.2i .if n 'sp|1 .. .de fO \" footer macro .if t .pl 11.0i .if n .pl \\n(lp 'bp .. .de yY \" macro for abstract overflow - line -1 .aT .rm yY .. .de aT \" macro for abstract overflow trap . \" register a counts overflow pages .if \\na>0 \{\ .ft 2 .ce (continued) .ft 1 \} .if t .pl 11.0i .if n .pl \\n(lp .nr a \\n+a .rn aT xX 'bp .rn xX aT .if n .wh -2 aT .if t .wh -0.55i aT .cH .tH .if t 'sp 0.05i .ce .ft 3 Abstract (continued) .ft 1 .in 0.2i 'sp 1 .. .de tK \" macro for thick lines .ps 24 \l'7.5i' .ps .. .de bE \" macro for empty box .ps 12 .if t \\(sq .if n [ ] .ps .. .de bX \" macro for box with x .ps 12 .if t \\o'\(mu\(sq' .if n [x] .ps .. .de tH \" macro for Title heading and text . \" called from aT and eP and CS .tK .if t 'sp 0.05i '''\" mark t - Title heading .mk t .ft 3 Title: .ft 1 'sp|\\ntu .in 0.7i .tI .in 0 .ta 0.5i .nr q \\no/\\nl .ie \\nq>2 'sp|\\ntu+\\nq .el 'sp|\\ntu+2 .tK . \" m1 - mark end of title section - save .mk m1 .. .de cH \" macro for abstract or distribution list continuation header . \" called from aT and eP . \" calculate this page number .nr np \\n(np+1 .nf .in 0 .ft 3 .ta 7.5iR .nr tc \\n(tp .nr nc \\n(np \\*(n)\f2 (page \\n(nc of \\n(tc) .ft1 .if t 'sp 0.1i .. .de dH \" macro for distribution list headers . \" called from cP and CS .ft 3 .ta 1.0i 4.75i \\$1 \\$2 .if t .sp 0.05i .ft 1 .ta 0.5i 1.0i .. .de oH \" macro for final overflow distribution list headers . \" called from cP .if \\$1>4 .if \\$2>4 .dH "Complete Copy (continued)" "Cover Sheet Only (continued)" .if \\$1>4 .if !\\$2>4 .dH "Complete Copy (continued)" "" .if !\\$1>4 .if \\$2>4 .dH "" "Cover Sheet Only (continued)" .. .de eP \" macro for ejecting distribution continuation page . \" called from cP 'bp .wh 0 hD '''\" put out continuation page header & title section .cH .tH .. .de cP \" macro for continuation (distribution list) page . \" called from CS . \" if any distribution overflow will fit before next trap, set v=2 .ie \\nv<=\\n(.t .nr v 1 .el .nr v 0 .if \\nv=1 .if \\nw<=\\n(.t .nr v 2 . \" check whether continuation page needs to be ejected .in 0 .if \\nc=1 \{\ . \" - if no abstract overflow .if \\na=0 .eP .if \\na>0 \{\ . \" - or if abstract overflow - but not enough room for list overflow .ie \\nv<2 .eP . \" just a thick line if abstract overflow AND enough room for list .el .tK \} .ie \\ne=0 \{\ .if \\ng>4 .if \\ni>4 .dH "Complete Copy" "Cover Sheet Only" .if \\ng>4 .if !\\ni>4 .dH "Complete Copy" "" .if !\\ng>4 .if \\ni>4 .dH "" "Cover Sheet Only" \} .el .oH \\ng \\ni .mk z .nr q \\n(.t/\\nl '''\" put out complete copy list overflow .in 0.2i .cO .in 0 .rm cO .if !\\n(g1=0 \{\ .ft 2 .ti 1.25i (continued) .ft 1 \} .mk x .sp|\\nzu .in 4.0i '''\" put out cover sheet list overflow .dO .rm dO .if !\\n(i1=0 \{\ .ft 2 .ti 5.00i (continued) .ft 1 \} .mk y .if ((\\n(g1>0):(\\n(i1>0)) .dP "\\n(g1" "\\n(i1" "cU" "\\n(g2" "dU" "\\n(i2" .if ((\\n(g2>0):(\\n(i2>0)) .dP "\\n(g2" "\\n(i2" "cV" "\\n(g3" "dV" "\\n(i3" .if ((\\n(g3>0):(\\n(i3>0)) .dP "\\n(g3" "\\n(i3" "cW" "\\n(g4" "dW" "\\n(i4" .if ((\\n(g4>0):(\\n(i4>0)) .dP "\\n(g4" "\\n(i4" "cX" "\\n(g5" "dX" "\\n(i5" .if ((\\n(g5>0):(\\n(i5>0)) \{\ .eP .oH \\n(g5 \\n(i5 .mk z .in 0.2i .cY .in 0 .rm cY .mk x .sp|\\nzu .in 4.0i .dY .rm dY .mk y \} .in 0 .if \\nx-\\ny .sp|\\nxu .tK \} .. .de dP \" macro to handle one continuation page .eP .oH \\$1 \\$2 .mk z .in 0.2i .\\$3 .in 0 .rm \\$3 .if !\\$4=0 \{\ .ft 2 .ti 1.25i (continued) .ft 1 \} .mk x .sp|\\nzu .in 4.0i .\\$5 .rm \\$5 .if !\\$6=0 \{\ .ft 2 .ti 5.00i (continued) .ft 1 \} .mk y .. .de tP \" macro to compute total pages and diversion lengths '''\" calculate vert. units needed to handle cc overflow (if any) '''\" called from CS macro .ie \\ng>4 .nr v (\\ng)*\\nl .el .nr v 0 '''\" also for cs overflow (if any) .ie \\ni>4 .nr w (\\ni)*\\nl .el .nr w 0 .ie \\nv>\\nw .nr j \\nv .el .nr j \\nw . \" set c=1 if either g or i >0 .if \\ng>4 .nr c 1 .if \\ni>4 .nr c 1 . \" calculate total pages in job (default 2) .nr tp 2 . \" a1 - page 1 portion abstract (units) .nr a1 \\nyu-\\nxu-1v .ie \\n(la>\\n(a1 \{\ . \" ar - remainder abstract (units) .nr ar \\n(la-\\n(a1 .nr tp \\n(tp+1 . \" a2 - available continuation page space . \" m1 is mark after thick line following title/date . \" 2v are lines for Abstract (continued) and one blank line .if t .nr a2 11.0i-\\n(m1-3v .if n .nr a2 \\n(lpv-\\n(m1-3v .t1 \} .el .if \\nc>0 .nr tp \\n(tp+1 .if ((\\n(g1>4):(\\n(i1>4)) .nr tp \\n(tp+1 .if ((\\n(g2>4):(\\n(i2>4)) .nr tp \\n(tp+1 .if ((\\n(g3>4):(\\n(i3>4)) .nr tp \\n(tp+1 .if ((\\n(g4>4):(\\n(i4>4)) .nr tp \\n(tp+1 .if ((\\n(g5>4):(\\n(i5>4)) .nr tp \\n(tp+1 .. .de t1 .ie \\n(ar>\\n(a2 \{\ .nr ar \\n(ar-\\n(a2 .nr tp \\n(tp+1 .t1 \} .el .if \\n(ar+\\nj>\\n(a2 .nr tp \\n(tp+1 .. '''\" '''\" main macro to handle output of cover sheet '''\" .de CS .if \\nu=0 \{\ .tm ERROR: author must be supplied .ab \} .if \\no=0 \{\ .tm ERROR: document title must be supplied .ab \} .if \\nm=0 \{\ .tm ERROR: memorandum type undefined or unknown .ab \} .if ((\\nm=1)&(\\np=1)) .if \\nb=0 \{\ .tm ERROR: must have at least one mercury classification with technical memorandum .ab \} .if \\nn=0 \{\ .tm ERROR: document number must be supplied .ab \} .if \\n(la=0 .if \\nm<3 \{\ .tm ERROR: abstract must be supplied for technical and internal memoranda .ab \} .if \\nb>3 \{\ .tm ERROR: no more than 3 mercury classifications may be selected .ab \} .if \\n(fc=0 \{\ .if \\n(en<3 \{\ .tm ERROR: filing case must be supplied .ab \} .if \\n(en=3 \{\ .tm ERROR: full date must be supplied .ab \}\} .if \\n(wp=0 \{\ .tm ERROR: work project number must be supplied .ab \} .dL .ll 7.5i .iN .if \\n(nl .bp .in 0 .hD '''\" put out 1 blank line where timestamp used to be .sp1 .if t .sp 0.05i .nf .ps 16 .ft 3 . \" put out page 1 heading '''\" if Lucent logo not defined, put out Lucent string '''\" also put out memorandum type .ie ((\\n(dv=5)) \{\ .ie '\f(AT'' .nr lg 0 .el .nr lg 1 \} .el \{\ .ie '\*(lG'' .nr lg 0 .el .nr lg 1 \} .ie ((\\n(lg=0)) \{\ .ta 7.5iR \\*(e2 Document Cover Sheet .wh 0 hD .if t .sp 0.1i \\*(t(\} .el \{\ .ta 7.5iR Document Cover Sheet .wh 0 hD .if t .sp 0.1i .if \\n(dv=5 \{\ .ft P .nr v \n(.f .ft P \} .ta 0.25i 7.5iR \\*(lG \\*(t(\} .ft 1 .ps 10 .tH .if t .sp 0.05i .ft 3 .ie \\nu>1 .ds u) s .el .ds u) .if !\\n(en=3 \{\ .ta 0.5i 2.75i 4.0i 4.7i Author\\*(u) Location Ext. Company (if other than \\*(e1) .br \} .if \\n(en=3 \{\ .ta 0.5i 2.75i 4.0i 5.0i Author\\*(u) Location Ext. Company (if other than .if t \\*(e3) .if n \\*(e3) .br \} .ft 1 '''\" output author info .aV .if !'\\*(r('0' \{\ .ta 0.3i 2.6i \\*(r( (Responsible \\*(e1 Person)\} .rm aV AU .tK .if t .sp 0.05i .ft 3 .ie \\nn>1 .ds v) s .el .ds v) .ie \\n(fc>1 .ds w) s .el .ds w) .ie \\n(wp>1 .ds x) s .el .ds x) .ta 1.0i 3.3i 5.55i .if \\n(en=1 \{\ Document No\\*(v). Filing Case No\\*(w). Project No\\*(x). .br \} .if \\n(en=2 \{\ Document No\\*(v). Filing Case No\\*(w). Project No\\*(x). .br \} .if \\n(en=3 \{\ .if t .ta 1.0i 3.4i 4.7i .if n .ta 1.0i 3.4i 4.5i Document No\\*(v). Full Date Time Charge (or Project Code) No\\*(x). .br \} .if \\n(en=4 \{\ .if t .ta 1.0i 3.4i 5.2i .if n .ta 1.0i 3.4i 5.0i Document No\\*(v). Filing Case No\\*(w). Time Charge (or Case) No\\*(x). .br \} .ft 1 .if t .sp 0.05i .mk t '''\" output document number .dM .rm dN dM .mk x .sp|\\ntu '''\" output filing case info (or full date) .fB .rm fB fC .mk y .sp|\\ntu '''\" output work project number info .wO .rm wO wP .mk z .if \\ny>\\nx .nr x \\ny .if \\nz>\\nx .nr x \\nz .sp|\\nxu .tK '''\" output keywords if they exist .if \\nk>0 \{\ .ft 3 Keywords: .ft 1 .if t .sp 0.05i .in 0.2i .fi \\*(k) .nf .in 0 .tK \} '''\" output mercury info if it exists .if \\nb>0 \{\ .ft 3 MERCURY Announcement Bulletin Sections .ft 1 .if t \{\ .sp 0.05i .ta 0.6i 3.1i 5.6i .ps 8 \\*(a) .ps \} .if n \{\ .ta 0.5i 4.1i .if \\nb>2 \\*(b) \\*(a) .ps \} .tK \} .ps 10 .ft 3 Abstract .ft 1 .mk x .if t \{\ .nr b1 \\nx/\\n(.v+1 .nr b2 (\\n(b1*\\n(.v)-\\nx .sp \\n(b2u .mk x \} '''\" calculate position (19v includes 2v to print version at bottom of page) '''\" followed by timestamp and 1v line .nr y \\n(lpv-19v-\\n(fnu .sp|\\nyu .sp -1 .tP '''\" handle abstract page 1 continuation .ie \\n(la>\\n(a1 \{\ .ce .ft2 (continued on page iii) .ft1 .br \} .el .sp1 .tK .ps 8 .if t .vs 10p .nr z 0 .if '\\$1'' .nr z 1 .if !'\\$2'' .nr z 1 .if !'\\$3'' .nr z 1 .if !'\\$4'' .nr z 1 .if !'\\$5'' .nr z 1 .if !'\\$6'' .nr z 1 .if \\nz=1 \{\ .tm WARNING: provide total document page count in first argument of .CS macro; all other arguments ignored; do NOT include coversheet pages in this count. \} .nr z 0 .if !'\\$1'' .nr z \\nz+\\$1 .nr z \\nz+\\n(tp .tm Total Pages = \\nz .ie '\*(.T'X97.tim10p'\{\ Total Pages (including document cover sheet): \\s+2\\nz\\s-2 .if !\\*(e('0' \{\ Supersedes or amends document number \\*(e(. \} .el .sp1 \} .el \{\ \f3Total Pages\f1 (including document cover sheet): \\s+2\\nz\\s-2 .if !'\\*(e('0' \{\ \f3Supersedes\f1 or amends document number \\*(e(. \} .el .sp1 \} .ps .if t .vs .if \\n(fn>0 \{\ .br .nf .fN .rm fN .br \} .mk z .if t .sp 0.67i .if n .sp 4 '''\" output proprietary notice if it exists .if \\np=1 \{\ .ds o) LUCENT \- PROPRIETARY .ds p) "Use pursuant to Company Instructions .ds q) .ds r) .ft 2 .if n .ti 14 .if t .ti 1.65i \\*(o) .ft 1 .if n .ti 5 .if t .ti 1.25i \\*(p) \} .if \\np=2 \{\ .ds o) LUCENT \- PROPRIETARY (RESTRICTED) .ds p) "Solely for authorized persons having a need to know .ds q) "pursuant to Company Instructions .ft 2 .if n .ti 10 .if t .ti 1.25i \\*(o) .ft 1 .if n .ti 0 .if t .ti 0.875i \\*(p) .if n .ti 10 .if t .ti 1.375i \\*(q) \} '''\" output csmacros version .sp |\\nzu+11v .ta 7.5iR \\s8\\*(ve\\s0 '''\" put out timestamp (if non-empty) and company identifier .ie !'\\*(s)'0' \{\ \\s8\\*(s)\\s0 \\*(e3 \} .el " \\*(e3 .sp|\\nzu .sp1 .ft 3 .ti 5.25i \\*(m) .ft 1 .sp|\\nxu .in 0.2i .nf '''\" abstract .if \\n(la>\\n(a1 \{\ .if n .wh -1 yY .if t .wh -0.25i yY \} .pl \\nyu .ta 0.5i 1.0i 1.5i 2.0i 2.5i '''\" output the abstract .aS .rm aS .if !\\n(la>\\n(a1 .sp-1 .rn aT xX .if t .wh -0.25i fO .if n .wh -1 fO '''\" output continuation pages .cP 'bp .ft 1 .in 0 .wh 0 hD .nf .ft 3 .ta 7.5iR .nr tc \\n(tp Initial Distribution Specifications \\*(n)\f2 (page ii of \\n(tc)\f3 .ft 1 .tK .if \\ne>0 \{\ .dH " Complete Copy" " Cover Sheet Only" .mk z '''\" put out complete copy list .in 0.2i .cA .in 0 .rm cA .if !\\ng=0 \{\ .ft 2 .ti 1.25i (continued) .ft 1 \} .sp|\\nzu .in 4.0i '''\" put out cover sheet list .dA .rm dA .if !\\ni=0 \{\ .ft 2 .ti 5.00i (continued) .ft 1 \} .in 0 '''\" starter space value - then tailor according to basic distribution length .sp|5 .sp \\ne .tK \} '''\" put out security section if selected .if \\nr=1 \{\ \f3Government Security Classified\f1 .ft 1 .if t .sp -0.05i .tK \} \f3Future Lucent Distribution by ITDS\f1 .if \\n(ra>0 \{\ .ti 0.5i .if t .sp 0.05i .ie \\n(ra=2 \{\ .if t \f3DO NOT RELEASE\f1 to any Lucent employee without appropriate approval for each request. .if n \{\ \f3DO NOT RELEASE\f1 to any Lucent employee without appropriate approval .br .ti 1.0i for each request.\}\} .el \{\ \f3RELEASE\f1 to any Lucent employee (excluding contract employees). .br \}\} '''\" next 41 lines for yes/no boxes; remove when .fA macro becomes mandatory .if \\n(ra=0 \{\ .if t \{\ .mk z .ti 0.1i .bE .sp|\\nzu .ti 0.25i Yes, \f3RELEASE\f1 to any Lucent employee (excluding .sp|\\nzu .ti 4.1i .bE .sp|\\nzu .ti 4.25i No, \f3DO NOT RELEASE\f1 to any Lucent employee .mk z .ti 0.35i contract employees). .sp|\\nzu .ti 4.35i without obtaining appropriate approval.\} .if n \{\ .mk z .ti 0.1i .bE .sp|\\nzu .ti 0.4i Yes, \f3RELEASE\f1 to any Lucent employee .sp|\\nzu .ti 4.1i .bE .sp|\\nzu .ti 4.4i No, \f3DO NOT RELEASE\f1 to any Lucent .mk z .ti 0.5i (except contract employees). .ti 4.5i .sp|\\nzu employee without obtaining .ti 4.5i appropriate approval.\}\} .if t .sp -0.05i .tK .ft 3 Author Signature\\*(u) .ft 1 .sp1 .ta 2.625i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(m( .if \\nu>3 \{\ .sp1 .ta 2.635i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(n( \} .if \\nu>6 \{\ .sp1 .ta 2.635i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(o( \} .if \\nu>9 \{\ .sp1 .ta 2.635i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(p( \} .if t .sp -0.1i .tK '''\" output organizational approval section .ie \\np>1 \{\ .if t \{\ \f3Organizational Approval\f1 (\\*(e4 approval \f3required\f1 for \f2\\*(o)\f1.) \} .if n \{\ \f3Organizational Approval\f1 .ti 0.5i \\*(e4 approval \f3required\f1 for \f2\\*(o)\f1. \} .br \} .el \{\ \f3Organizational Approval\f1 (Optional) \} .sp 1 .ta 2.625i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(u( .if ((\\n(oa>3):((\\nn>3)&(\\n(oa=0))) \{\ .sp1 .ta 2.625i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(v( \} .if ((\\n(oa>6):((\\nn>6)&(\\n(oa=0))) \{\ .sp 1 .ta 2.625i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(w( \} .if ((\\n(oa>9):((\\nn>9)&(\\n(oa=0))) \{\ .sp 1 .ta 2.625i 5.25i \l'2.25i' \l'2.25i' \l'2.25i' .ta 0.25i 2.875i 5.5i \\*(x( \} .if t .sp -0.1i .tK '''\" recipient section always output .ft 3 For Use by Recipient of Cover Sheet: .ft 1 .if t \{\ .ps-3 .vs-4 .sp1 .mk z Computing network users may order copies via the \f2library -1\f1 command; for information, type \f2man library\f1 after the UNIX\(rg system prompt. .sp1 .rn fo xx Otherwise: Enter PAN if Lucent-BL (or SS# if non-Lucent-BL). \l'1.5i' Return this sheet to any ITDS location. .sp|\\nzu .in 4.0i Internal Technical Document Service .sp1 .ta 0.9i 1.8i 2.7i ( ) AK 2H-28 ( ) IH 7M-103 ( ) DR 2F-19 ( ) NW-ITDS ( ) ALC 1B-102 ( ) MV 3L-19 ( ) INH 1C-114 ( ) PR 5-2120 ( ) CB 1L-220 ( ) WH 3E-204 ( ) IW 2Z-156 ( ) HO 4F-112 ( ) MT 2C-131 .br \} .if n \{\ Computing network users may order copies via the \f2library -1\f1 command; for information, type \f2man library\f1 after the UNIX system prompt. Otherwise: .sp1 .mk z .rn fo xx 1 Enter PAN if Lucent-BL (or SS# if non-Lucent-BL). \l'2.0i' 2 Return this sheet to any ITDS location. .sp|\\nzu .in 4.0i Internal Technical Document Service .sp1 .ta 1.75i .if \\n(en=1 \{\ ( ) AK 2H-28 ( ) IH 7M-103 ( ) ALC 1B-102 ( ) MV 3L-19 ( ) CB 1L-220 ( ) WH 3E-204 ( ) HO 4F-112 \} .if \\n(en=2 \{\ ( ) DR 2F-19 ( ) INH 1C-114 ( ) IW 2Z-156 ( ) MT 2C-131 \} .if \\n(en=3 \{\ ( ) NW-ITDS \} .if \\n(en=4 \{\ ( ) PR5-2120 \} .br \} .if \\n(aa \{\ . sy pwd >/tmp/sx\\n($$ . sy sed "s/^/cd /" /tmp/sx\\n($$ >/tmp/sc\\n($$ . sy echo "/usr/lib/tmac/sendcover" \\n(.F \\n(qq >>/tmp/sc\\n($$ . sy echo "rm" /tmp/sx\\n($$ /tmp/sc\\n($$>>/tmp/sc\\n($$ . sy sh /tmp/sc\\n($$& . br \} .rr a b c e g h i j k .rr l m n o p q r s t .rr u v w x y z .rr an fn as ds fs bd dv lp .rr tp np la a1 a2 ar fi .rr in si ps ts vs tv b1 b2 m1 .rr :b :c :d :e ls dt fc wp .rr g1 g2 g3 g4 g5 i1 i2 i3 i4 i5 .rm a) b) c) e) k) n) o) p) q) .rm r) s) t) u) v) w) x) y) z) .rm a( b( m( n( o( p( s( t( .rm tc nc Tm 10 ve .rm hD fO aT tK bE bX tH cH .rm dH eP cP tP t1 CS tI tS cE .rm cZ dZ eE fF gG oH dP .. '''\" end of csmacros 9base-6/troff/tmac/tmac.m0000644000175000017500000000011311402154555014707 0ustar anselmanselm'''\" TMAC.M @(#)tmacs.src 1.7 .if n .so #9/tmac/mmn .if t .so #9/tmac/mmt 9base-6/troff/dwbinit.c0000644000175000017500000002200311402154555014467 0ustar anselmanselm/* * * Pathname management routines for DWB C programs. * * Applications should initialize a dwbinit array with the string * pointers and arrays that need to be updated, and then hand that * array to DWBinit before much else happens in their main program. * DWBinit calls DWBhome to get the current home directory. DWBhome * uses the last definition of DWBENV (usually "DWBHOME") in file * DWBCONFIG (e.g., /usr/lib/dwb3.4) or the value assigned to that * variable in the environment if the DWBCONFIG file doesn't exist, * can't be read, or doesn't define DWBENV. * * DWBCONFIG must be a simple shell script - comments, a definition * of DWBHOME, and perhaps an export or echo is about all that's * allowed. The parsing in DWBhome is simple and makes no attempt * to duplicate the shell. It only looks for DWBHOME= as the first * non-white space string on a line, so * * # * # A sample DWBCONFIG shell script * # * * DWBHOME=/usr/add-on/dwb3.4 * export DWBHOME * * means DWBhome would return "/usr/add-on/dwb3.4" for the DWB home * directory. A DWBCONFIG file means there can only be one working * copy of a DWB release on a system, which seems like a good idea. * Using DWBCONFIG also means programs will always include correct * versions of files (e.g., prologues or macro packages). * * Relying on an environment variable guarantees nothing. You could * execute a version of dpost, but your environment might point at * incorrect font tables or prologues. Despite the obvious problems * we've also implemented an environment variable approach, but it's * only used if there's no DWBCONFIG file. * * DWBinit calls DWBhome to get the DWB home directory prefix and * then marches through its dwbinit argument, removing the default * home directory and prepending the new home. DWBinit stops when * it reaches an element that has NULL for its address and value * fields. Pointers in a dwbinit array are reallocated and properly * initialized; arrays are simply reinitialized if there's room. * All pathnames that are to be adjusted should be relative. For * example, * * char *fontdir = "lib/font"; * char xyzzy[25] = "etc/xyzzy"; * * would be represented in a dwbinit array as, * * dwbinit allpaths[] = { * &fontdir, NULL, 0, * NULL, xyzzy, sizeof(xyzzy), * NULL, NULL, 0 * }; * * The last element must have NULL entries for the address and * value fields. The main() routine would then do, * * #include "dwbinit.h" * * main() { * * DWBinit("program name", allpaths); * ... * } * * Debugging is enabled if DWBDEBUG is in the environment and has * the value ON. Output is occasionally useful and probably should * be documented. * */ #include #include #include #include #include #include "dwbinit.h" #ifndef DWBCONFIG #define DWBCONFIG "/dev/null" #endif #ifndef DWBENV #define DWBENV "DWBHOME" #endif #ifndef DWBHOME #define DWBHOME "" #endif #ifndef DWBDEBUG #define DWBDEBUG "DWBDEBUG" #endif #ifndef DWBPREFIX #define DWBPREFIX "\\*(.P" #endif /*****************************************************************************/ void DWBdebug(dwbinit *ptr, int level) { char *path; char *home; static char *debug = NULL; /* * * Debugging output, but only if DWBDEBUG is defined to be ON in the * environment. Dumps general info the first time through. * */ if ( debug == NULL && (debug = getenv(DWBDEBUG)) == NULL ) debug = "OFF"; if ( strcmp(debug, "ON") == 0 ) { if ( level == 0 ) { fprintf(stderr, "Environment variable: %s\n", DWBENV); fprintf(stderr, "Configuration file: %s\n", DWBCONFIG); fprintf(stderr, "Default home: %s\n", DWBHOME); if ( (home = DWBhome()) != NULL ) fprintf(stderr, "Current home: %s\n", home); } /* End if */ fprintf(stderr, "\n%s pathnames:\n", level == 0 ? "Original" : "Final"); for ( ; ptr->value != NULL || ptr->address != NULL; ptr++ ) { if ( (path = ptr->value) == NULL ) { path = *ptr->address; fprintf(stderr, " pointer: %s\n", path); } else fprintf(stderr, " array[%d]: %s\n", ptr->length, path); if ( level == 0 && *path == '/' ) fprintf(stderr, " WARNING - absolute path\n"); } /* End for */ } /* End if */ } /* End of DWBdebug */ /*****************************************************************************/ extern char *unsharp(char*); char *DWBhome(void) { FILE *fp; char *ptr; char *path; int len; char buf[200]; char *home = NULL; /* * * Return the DWB home directory. Uses the last definition of DWBENV * (usually "DWBHOME") in file DWBCONFIG (perhaps /usr/lib/dwb3.4) or * the value assigned to the variable named by the DWBENV string in * the environment if DWBCONFIG doesn't exist or doesn't define DWBENV. * Skips the file lookup if DWBCONFIG can't be read. Returns NULL if * there's no home directory. * */ if ( (fp = fopen(DWBCONFIG, "r")) != NULL ) { len = strlen(DWBENV); while ( fgets(buf, sizeof(buf), fp) != NULL ) { for ( ptr = buf; isspace((uchar)*ptr); ptr++ ) ; if ( strncmp(ptr, DWBENV, len) == 0 && *(ptr+len) == '=' ) { path = ptr + len + 1; for ( ptr = path; !isspace((uchar)*ptr) && *ptr != ';'; ptr++ ) ; *ptr = '\0'; if ( home != NULL ) free(home); if ( (home = malloc(strlen(path)+1)) != NULL ) strcpy(home, path); } /* End if */ } /* End while */ fclose(fp); } /* End if */ if ( home == NULL ) { if ( (home = getenv(DWBENV)) == NULL ) { if ( (home = DWBHOME) == NULL || *home == '\0' || *home == ' ' ) home = NULL; } /* End if */ if ( home != NULL ) home = unsharp(home); } /* End if */ while (home && *home == '/' && *(home +1) == '/') /* remove extra slashes */ home++; return(home); } /* End of DWBhome */ /*****************************************************************************/ void DWBinit(char *prog, dwbinit *paths) { char *prefix; char *value; char *path; int plen; int length; dwbinit *opaths = paths; /* * * Adjust the pathnames listed in paths, using the home directory * returned by DWBhome(). Stops when it reaches an element that has * NULL address and value fields. Assumes pathnames are relative, * but changes everything. DWBdebug issues a warning if an original * path begins with a /. * * A non-NULL address refers to a pointer, which is reallocated and * then reinitialized. A NULL address implies a non-NULL value field * and describes a character array that we only reinitialize. The * length field for an array is the size of that array. The length * field of a pointer is an increment that's added to the length * required to store the new pathname string - should help when we * want to change character arrays to pointers in applications like * troff. * */ if ( (prefix = DWBhome()) == NULL ) { fprintf(stderr, "%s: no DWB home directory\n", prog); exit(1); } /* End if */ DWBdebug(opaths, 0); plen = strlen(prefix); for ( ; paths->value != NULL || paths->address != NULL; paths++ ) { if ( paths->address == NULL ) { length = 0; value = paths->value; } else { length = paths->length; value = *paths->address; } /* End else */ length += plen + 1 + strlen(value); /* +1 is for the '/' */ if ( (path = malloc(length+1)) == NULL ) { fprintf(stderr, "%s: can't allocate pathname memory\n", prog); exit(1); } /* End if */ if ( *value != '\0' ) { char *eop = prefix; while(*eop++) ; eop -= 2; if (*value != '/' && *eop != '/') { sprintf(path, "%s/%s", prefix, value); } else if (*value == '/' && *eop == '/') { value++; sprintf(path, "%s%s", prefix, value); } else sprintf(path, "%s%s", prefix, value); } else sprintf(path, "%s", prefix); if ( paths->address == NULL ) { if ( strlen(path) >= paths->length ) { fprintf(stderr, "%s: no room for %s\n", prog, path); exit(1); } /* End if */ strcpy(paths->value, path); free(path); } else *paths->address = path; } /* End for */ DWBdebug(opaths, 1); } /* End of DWBinit */ /*****************************************************************************/ void DWBprefix( char *prog, char *path, int length) { char *home; char buf[512]; int len = strlen(DWBPREFIX); /* * * Replace a leading DWBPREFIX string in path by the current DWBhome(). * Used by programs that pretend to handle .so requests. Assumes path * is an array with room for length characters. The implementation is * not great, but should be good enough for now. Also probably should * have DWBhome() only do the lookup once, and remember the value if * called again. * */ if ( strncmp(path, DWBPREFIX, len) == 0 ) { if ( (home = DWBhome()) != NULL ) { if ( strlen(home) + strlen(path+len) < length ) { sprintf(buf, "%s%s", home, path+len); strcpy(path, buf); /* assuming there's room in path */ } else fprintf(stderr, "%s: no room to grow path %s", prog, path); } /* End if */ } /* End if */ } /* End of DWBprefix */ /*****************************************************************************/ 9base-6/troff/n1.c0000644000175000017500000004755311402154555013366 0ustar anselmanselm/* * n1.c * * consume options, initialization, main loop, * input routines, escape function calling */ #include #include "tdef.h" #include "fns.h" #include "ext.h" #include "dwbinit.h" #include #include char *Version = "March 11, 1994"; #ifndef DWBVERSION #define DWBVERSION "???" #endif char *DWBfontdir = FONTDIR; char *DWBntermdir = NTERMDIR; char *DWBalthyphens = ALTHYPHENS; char *DWBhomedir = ""; dwbinit dwbpaths[] = { &DWBfontdir, NULL, 0, &DWBntermdir, NULL, 0, &DWBalthyphens, NULL, 0, &DWBhomedir, NULL, 0, NULL, nextf, NS, NULL, NULL, 0 }; int TROFF = 1; /* assume we started in troff... */ jmp_buf sjbuf; Offset ipl[NSO]; static FILE *ifile; static FILE *ifl[NSO]; /* open input file pointers */ char cfname[NSO+1][NS] = { "stdin" }; /* file name stack */ int cfline[NSO]; /* input line count stack */ char *progname; /* program name (troff or nroff) */ int trace = 0; /* tracing mode: default off */ int trace1 = 0; int main(int argc, char *argv[]) { char *p; int j; Tchar i; char buf[100]; ifile = stdin; /* gcc */ ptid = stdout; buf[0] = '\0'; /* make sure it's empty (silly 3b2) */ progname = argv[0]; if ((p = strrchr(progname, '/')) == NULL) p = progname; else p++; DWBinit(progname, dwbpaths); if (strcmp(p, "nroff") == 0) TROFF = 0; #ifdef UNICODE alphabet = 128; /* unicode for plan 9 */ #endif /*UNICODE*/ mnspace(); nnspace(); mrehash(); nrehash(); numtabp[NL].val = -1; while (--argc > 0 && (++argv)[0][0] == '-') switch (argv[0][1]) { case 'N': /* ought to be used first... */ TROFF = 0; break; case 'd': fprintf(stderr, "troff/nroff version %s\n", Version); break; case 'F': /* switch font tables from default */ if (argv[0][2] != '\0') { strcpy(termtab, &argv[0][2]); strcpy(fontdir, &argv[0][2]); } else { argv++; argc--; strcpy(termtab, argv[0]); strcpy(fontdir, argv[0]); } break; case 0: goto start; case 'i': stdi++; break; case 'n': npn = atoi(&argv[0][2]); break; case 'u': /* set emboldening amount */ bdtab[3] = atoi(&argv[0][2]); if (bdtab[3] < 0 || bdtab[3] > 50) bdtab[3] = 0; break; case 's': if (!(stop = atoi(&argv[0][2]))) stop++; break; case 'r': sprintf(buf + strlen(buf), ".nr %c %s\n", argv[0][2], &argv[0][3]); /* not yet cpushback(buf);*/ /* dotnr(&argv[0][2], &argv[0][3]); */ break; case 'm': if (mflg++ >= NMF) { ERROR "Too many macro packages: %s", argv[0] WARN; break; } strcpy(mfiles[nmfi], nextf); strcat(mfiles[nmfi++], &argv[0][2]); break; case 'o': getpn(&argv[0][2]); break; case 'T': strcpy(devname, &argv[0][2]); dotT++; break; case 'a': ascii = 1; break; case 'h': hflg++; break; case 'e': eqflg++; break; case 'q': quiet++; save_tty(); break; case 'V': fprintf(stdout, "%croff: DWB %s\n", TROFF ? 't' : 'n', DWBVERSION); exit(0); case 't': if (argv[0][2] != '\0') trace = trace1 = argv[0][2]; break; /* for the sake of compatibility */ default: ERROR "unknown option %s", argv[0] WARN; done(02); } start: /* * cpushback maintains a LIFO, so push pack the -r arguments * in reverse order to maintain a FIFO in case someone did -rC1 -rC3 */ if (buf[0]) { char *p = buf; while(*p++) ; while(p > buf) { while(strncmp(p, ".nr", 3) != 0) p--; cpushback(p); *p-- = '\0'; } } argp = argv; rargc = argc; nmfi = 0; init2(); setjmp(sjbuf); loop: copyf = lgf = nb = nflush = nlflg = 0; if (ip && rbf0(ip) == 0 && ejf && frame->pframe <= ejl && dip == d) { nflush++; trap = 0; eject((Stack *)0); goto loop; } i = getch(); if (pendt) goto Lt; if ((j = cbits(i)) == XPAR) { copyf++; tflg++; while (cbits(i) != '\n') pchar(i = getch()); tflg = 0; copyf--; goto loop; } if (j == cc || j == c2) { if (j == c2) nb++; copyf++; while ((j = cbits(i = getch())) == ' ' || j == '\t') ; ch = i; copyf--; control(getrq(), 1); flushi(); goto loop; } Lt: ch = i; text(); if (nlflg) numtabp[HP].val = 0; goto loop; } void init2(void) { int i; char buf[100]; for (i = NTRTAB; --i; ) trtab[i] = i; trtab[UNPAD] = ' '; iflg = 0; obufp = obuf; if (TROFF) t_ptinit(); else n_ptinit(); mchbits(); cvtime(); numtabp[PID].val = getpid(); numtabp[HP].val = init = 0; numtabp[NL].val = -1; nfo = 0; copyf = raw = 0; sprintf(buf, ".ds .T %s\n", devname); cpushback(buf); sprintf(buf, ".ds .P %s\n", DWBhomedir); cpushback(buf); numtabp[CD].val = -1; /* compensation */ nx = mflg; frame = stk = (Stack *)setbrk(STACKSIZE); dip = &d[0]; nxf = frame + 1; for (i = 1; i < NEV; i++) /* propagate the environment */ envcopy(&env[i], &env[0]); for (i = 0; i < NEV; i++) { if ((env[i]._word._bufp = (Tchar *)calloc(WDSIZE, sizeof(Tchar))) == NULL) { ERROR "not enough room for word buffers" WARN; done2(1); } env[i]._word._size = WDSIZE; if ((env[i]._line._bufp = (Tchar *)calloc(LNSIZE, sizeof(Tchar))) == NULL) { ERROR "not enough room for line buffers" WARN; done2(1); } env[i]._line._size = LNSIZE; } if ((oline = (Tchar *)calloc(OLNSIZE, sizeof(Tchar))) == NULL) { ERROR "not enough room for line buffers" WARN; done2(1); } olinep = oline; olnsize = OLNSIZE; blockinit(); } void cvtime(void) { time_t tt; struct tm *ltime; time(&tt); ltime = localtime(&tt); numtabp[YR].val = ltime->tm_year % 100; numtabp[YR].fmt = 2; numtabp[MO].val = ltime->tm_mon + 1; /* troff uses 1..12 */ numtabp[DY].val = ltime->tm_mday; numtabp[DW].val = ltime->tm_wday + 1; /* troff uses 1..7 */ } char errbuf[200]; void errprint(void) /* error message printer */ { int savecd = numtabp[CD].val; if (!nlflg) numtabp[CD].val++; fprintf(stderr, "%s: ", progname); fputs(errbuf, stderr); if (cfname[ifi][0]) fprintf(stderr, "; %s:%d", cfname[ifi], numtabp[CD].val); fputs("\n", stderr); if (cfname[ifi][0]) stackdump(); numtabp[CD].val = savecd; } int control(int a, int b) { int j, k; extern Contab *contabp; numerr.type = RQERR; numerr.req = a; if (a == 0 || (j = findmn(a)) == -1) return(0); if (contabp[j].f == 0) { if (trace & TRMAC) fprintf(stderr, "invoke macro %s\n", unpair(a)); if (dip != d) for (k = dilev; k; k--) if (d[k].curd == a) { ERROR "diversion %s invokes itself during diversion", unpair(a) WARN; edone(0100); } nxf->nargs = 0; if (b) collect(); flushi(); return pushi(contabp[j].mx, a); /* BUG??? all that matters is 0/!0 */ } if (b) { if (trace & TRREQ) fprintf(stderr, "invoke request %s\n", unpair(a)); (*contabp[j].f)(); } return(0); } void casept(void) { int i; noscale++; if (skip()) i = trace1; else { i = max(inumb(&trace), 0); if (nonumb) i = trace1; } trace1 = trace; trace = i; noscale = 0; } int getrq(void) { int i, j; if ((i = getach()) == 0 || (j = getach()) == 0) goto rtn; i = PAIR(i, j); rtn: return(i); } /* * table encodes some special characters, to speed up tests * in getch, viz FLSS, RPT, f, \b, \n, fc, tabch, ldrch */ char gchtab[NCHARS] = { 000,004,000,000,010,000,000,000, /* fc, ldr */ 001,002,001,000,001,000,000,000, /* \b, tab, nl, RPT */ 000,000,000,000,000,000,000,000, 000,001,000,001,000,000,000,000, /* FLSS, ESC */ 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,001,000, /* f */ 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000 }; int realcbits(Tchar c) /* return character bits, or MOTCH if motion */ { if (ismot(c)) return MOTCH; else return c & 0xFFFF; } Tchar getch(void) { int k; Tchar i, j; g0: if (ch) { i = ch; if (cbits(i) == '\n') nlflg++; ch = 0; return(i); } if (nlflg) return('\n'); i = getch0(); if (ismot(i)) return(i); k = cbits(i); if (k >= sizeof(gchtab)/sizeof(gchtab[0]) || gchtab[k] == 0) /* nothing special */ return(i); if (k != ESC) { if (k == '\n') { nlflg++; if (ip == 0) numtabp[CD].val++; /* line number */ return(k); } if (k == FLSS) { copyf++; raw++; i = getch0(); if (!fi) flss = i; copyf--; raw--; goto g0; } if (k == RPT) { setrpt(); goto g0; } if (!copyf) { if (k == 'f' && lg && !lgf) { i = getlg(i); return(i); } if (k == fc || k == tabch || k == ldrch) { if ((i = setfield(k)) == 0) goto g0; else return(i); } if (k == '\b') { i = makem(-width(' ' | chbits)); return(i); } } return(i); } k = cbits(j = getch0()); if (ismot(j)) return(j); switch (k) { case 'n': /* number register */ setn(); goto g0; case '$': /* argument indicator */ seta(); goto g0; case '*': /* string indicator */ setstr(); goto g0; case '{': /* LEFT */ i = LEFT; goto gx; case '}': /* RIGHT */ i = RIGHT; goto gx; case '"': /* comment */ while (cbits(i = getch0()) != '\n') ; if (ip == 0) numtabp[CD].val++; /* line number */ nlflg++; return(i); /* experiment: put it here instead of copy mode */ case '(': /* special char name \(xx */ case 'C': /* \C'...' */ if ((i = setch(k)) == 0) goto g0; goto gx; case ESC: /* double backslash */ i = eschar; goto gx; case 'e': /* printable version of current eschar */ i = PRESC; goto gx; case '\n': /* concealed newline */ numtabp[CD].val++; goto g0; case ' ': /* unpaddable space */ i = UNPAD; goto gx; case '\'': /* \(aa */ i = ACUTE; goto gx; case '`': /* \(ga */ i = GRAVE; goto gx; case '_': /* \(ul */ i = UNDERLINE; goto gx; case '-': /* current font minus */ i = MINUS; goto gx; case '&': /* filler */ i = FILLER; goto gx; case 'c': /* to be continued */ i = CONT; goto gx; case '!': /* transparent indicator */ i = XPAR; goto gx; case 't': /* tab */ i = '\t'; return(i); case 'a': /* leader (SOH) */ /* old: *pbp++ = LEADER; goto g0; */ i = LEADER; return i; case '%': /* ohc */ i = OHC; return(i); case 'g': /* return format of a number register */ setaf(); /* should this really be in copy mode??? */ goto g0; case '.': /* . */ i = '.'; gx: setsfbits(i, sfbits(j)); return(i); } if (copyf) { *pbp++ = j; return(eschar); } switch (k) { case 'f': /* font indicator */ setfont(0); goto g0; case 's': /* size indicator */ setps(); goto g0; case 'v': /* vert mot */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = vmot()) { return(i); } goto g0; case 'h': /* horiz mot */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = hmot()) return(i); goto g0; case '|': /* narrow space */ if (NROFF) goto g0; return(makem((int)(EM)/6)); case '^': /* half narrow space */ if (NROFF) goto g0; return(makem((int)(EM)/12)); case 'w': /* width function */ setwd(); goto g0; case 'p': /* spread */ spread++; goto g0; case 'N': /* absolute character number */ numerr.type = numerr.escarg = 0; numerr.esc = k; if ((i = setabs()) == 0) goto g0; return i; case 'H': /* character height */ numerr.type = numerr.escarg = 0; numerr.esc = k; return(setht()); case 'S': /* slant */ numerr.type = numerr.escarg = 0; numerr.esc = k; return(setslant()); case 'z': /* zero with char */ return(setz()); case 'l': /* hor line */ numerr.type = numerr.escarg = 0; numerr.esc = k; setline(); goto g0; case 'L': /* vert line */ numerr.type = numerr.escarg = 0; numerr.esc = k; setvline(); goto g0; case 'D': /* drawing function */ numerr.type = numerr.escarg = 0; numerr.esc = k; setdraw(); goto g0; case 'X': /* \X'...' for copy through */ setxon(); goto g0; case 'b': /* bracket */ setbra(); goto g0; case 'o': /* overstrike */ setov(); goto g0; case 'k': /* mark hor place */ if ((k = findr(getsn())) != -1) { numtabp[k].val = numtabp[HP].val; } goto g0; case '0': /* number space */ return(makem(width('0' | chbits))); case 'x': /* extra line space */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = xlss()) return(i); goto g0; case 'u': /* half em up */ case 'r': /* full em up */ case 'd': /* half em down */ return(sethl(k)); default: return(j); } /* NOTREACHED */ } void setxon(void) /* \X'...' for copy through */ { Tchar xbuf[NC]; Tchar *i; Tchar c; int delim, k; if (ismot(c = getch())) return; delim = cbits(c); i = xbuf; *i++ = XON | chbits; while ((k = cbits(c = getch())) != delim && k != '\n' && i < xbuf+NC-1) { if (k == ' ') setcbits(c, WORDSP); *i++ = c | ZBIT; } *i++ = XOFF | chbits; *i = 0; pushback(xbuf); } char ifilt[32] = { 0, 001, 002, 003, 0, 005, 006, 007, 010, 011, 012 }; Tchar getch0(void) { Tchar i; again: if (pbp > lastpbp) i = *--pbp; else if (ip) { /* i = rbf(); */ i = rbf0(ip); if (i == 0) i = rbf(); else { ++ip; if (pastend(ip)) { --ip; rbf(); } } } else { if (donef || ndone) done(0); if (nx || 1) { /* BUG: was ibufp >= eibuf, so EOF test is wrong */ if (nfo < 0) ERROR "in getch0, nfo = %d", nfo WARN; if (nfo == 0) { g0: if (nextfile()) { if (ip) goto again; } } nx = 0; #ifdef UNICODE if (MB_CUR_MAX > 1) i = get1ch(ifile); else #endif /*UNICODE*/ i = getc(ifile); if (i == EOF) goto g0; if (ip) goto again; } /*g2: */ if (i >= 040) /* zapped: && i < 0177 */ goto g4; i = ifilt[i]; } if (cbits(i) == IMP && !raw) goto again; if (i == 0 && !init && !raw) { /* zapped: || i == 0177 */ goto again; } g4: if (ismot(i)) return i; if (copyf == 0 && sfbits(i) == 0) i |= chbits; if (cbits(i) == eschar && !raw) setcbits(i, ESC); return(i); } #ifdef UNICODE Tchar get1ch(FILE *fp) /* get one "character" from input, figure out what alphabet */ { wchar_t wc; char buf[100], *p; int i, n, c; for (i = 0, p = buf; i < MB_CUR_MAX; i++) { if ((c = getc(fp)) == EOF) return c; *p++ = c; if ((n = mbtowc(&wc, buf, p-buf)) >= 0) break; } if (n == 1) /* real ascii, presumably */ return wc; if (n == 0) return p[-1]; /* illegal, but what else to do? */ if (c == EOF) return EOF; *p = 0; return chadd(buf, MBchar, Install); /* add name even if haven't seen it */ } #endif /*UNICODE*/ void pushback(Tchar *b) { Tchar *ob = b; while (*b++) ; b--; while (b > ob && pbp < &pbbuf[NC-3]) *pbp++ = *--b; if (pbp >= &pbbuf[NC-3]) { ERROR "pushback overflow" WARN; done(2); } } void cpushback(char *b) { char *ob = b; while (*b++) ; b--; while (b > ob && pbp < &pbbuf[NC-3]) *pbp++ = *--b; if (pbp >= &pbbuf[NC-3]) { ERROR "cpushback overflow" WARN; done(2); } } int nextfile(void) { char *p; n0: if (ifile != stdin) fclose(ifile); if (ifi > 0 && !nx) { if (popf()) goto n0; /* popf error */ return(1); /* popf ok */ } if (nx || nmfi < mflg) { p = mfiles[nmfi++]; if (*p != 0) goto n1; } if (rargc-- <= 0) { if ((nfo -= mflg) && !stdi) { done(0); } nfo++; numtabp[CD].val = stdi = mflg = 0; ifile = stdin; strcpy(cfname[ifi], "stdin"); return(0); } p = (argp++)[0]; if (rargc >= 0) cfname[ifi][0] = 0; n1: numtabp[CD].val = 0; if (p[0] == '-' && p[1] == 0) { ifile = stdin; strcpy(cfname[ifi], "stdin"); } else if ((ifile = fopen(unsharp(p), "r")) == NULL) { ERROR "cannot open file %s", p WARN; nfo -= mflg; done(02); } else strcpy(cfname[ifi],p); nfo++; return(0); } int popf(void) { --ifi; if (ifi < 0) { ERROR "popf went negative" WARN; return 1; } numtabp[CD].val = cfline[ifi]; /* restore line counter */ ip = ipl[ifi]; /* input pointer */ ifile = ifl[ifi]; /* input FILE * */ return(0); } void flushi(void) { if (nflush) return; ch = 0; copyf++; while (!nlflg) { if (donef && frame == stk) break; getch(); } copyf--; } /* * return 16-bit, ascii/alphabetic character, ignore chars with more bits, * (internal names), spaces and special cookies (below 040). * Leave STX ETX ENQ ACK and BELL in to maintain compatibility with v7 troff. */ int getach(void) { Tchar i; int j; lgf++; j = cbits(i = getch()); if (ismot(i) || j > SHORTMASK || (j <= 040 && j != 002 /*STX*/ && j != 003 /*ETX*/ && j != 005 /*ENQ*/ && j != 006 /*ACK*/ && j != 007)) { /*BELL*/ ch = i; j = 0; } lgf--; return j; } void casenx(void) { lgf++; skip(); getname(); nx++; if (nmfi > 0) nmfi--; strcpy(mfiles[nmfi], nextf); nextfile(); nlflg++; ip = 0; pendt = 0; frame = stk; nxf = frame + 1; } int getname(void) { int j, k; lgf++; for (k = 0; k < NS - 1; k++) { j = getach(); if (!j) break; nextf[k] = j; } nextf[k] = 0; lgf--; return(nextf[0]); } void caseso(void) { FILE *fp = 0; lgf++; nextf[0] = 0; if (skip() || !getname() || (fp = fopen(unsharp(nextf), "r")) == NULL || ifi >= NSO) { ERROR "can't open file %s", nextf WARN; done(02); } strcpy(cfname[ifi+1], nextf); cfline[ifi] = numtabp[CD].val; /*hold line counter*/ numtabp[CD].val = 0; flushi(); ifl[ifi] = ifile; ifile = fp; ipl[ifi] = ip; ip = 0; nx++; nflush++; ifi++; } void caself(void) /* set line number and file */ { int n; if (skip()) return; n = atoi0(); if (!nonumb) cfline[ifi] = numtabp[CD].val = n - 1; if (!skip()) if (getname()) { /* eats '\n' ? */ strcpy(cfname[ifi], nextf); if (!nonumb) numtabp[CD].val--; } } void cpout(FILE *fin, char *token) { int n; char buf[1024]; if (token) { /* BUG: There should be no NULL bytes in input */ char *newl = buf; while ((fgets(buf, sizeof buf, fin)) != NULL) { if (newl) { numtabp[CD].val++; /* line number */ if (strcmp(token, buf) == 0) return; } newl = strchr(buf, '\n'); fputs(buf, ptid); } } else { while ((n = fread(buf, sizeof *buf, sizeof buf, fin)) > 0) fwrite(buf, n, 1, ptid); fclose(fin); } } void casecf(void) { /* copy file without change */ FILE *fd; char *eof, *p; extern int hpos, esc, po; /* this may not make much sense in nroff... */ lgf++; nextf[0] = 0; if (!skip() && getname()) { if (strncmp("<<", nextf, 2) != 0) { if ((fd = fopen(unsharp(nextf), "r")) == NULL) { ERROR "can't open file %s", nextf WARN; done(02); } eof = (char *) NULL; } else { /* current file */ if (pbp > lastpbp || ip) { ERROR "casecf: not reading from file" WARN; done(02); } eof = &nextf[2]; if (!*eof) { ERROR "casecf: missing end of input token" WARN; done(02); } p = eof; while(*++p) ; *p++ = '\n'; *p = 0; fd = ifile; } } else { ERROR "casecf: no argument" WARN; lgf--; return; } lgf--; /* make it into a clean state, be sure that everything is out */ tbreak(); hpos = po; esc = 0; ptesc(); /* to left margin */ esc = un; ptesc(); ptlead(); ptps(); ptfont(); flusho(); cpout(fd, eof); ptps(); ptfont(); } void getline(char *s, int n) /* get rest of input line into s */ { int i; lgf++; copyf++; skip(); for (i = 0; i < n-1; i++) if ((s[i] = cbits(getch())) == '\n' || s[i] == RIGHT) break; s[i] = 0; copyf--; lgf--; } void casesy(void) /* call system */ { char sybuf[NTM]; getline(sybuf, NTM); system(sybuf); } void getpn(char *a) { int n, neg; if (*a == 0) return; neg = 0; for ( ; *a; a++) switch (*a) { case '+': case ',': continue; case '-': neg = 1; continue; default: n = 0; if (isdigit((uchar)*a)) { do n = 10 * n + *a++ - '0'; while (isdigit((uchar)*a)); a--; } else n = 9999; *pnp++ = neg ? -n : n; neg = 0; if (pnp >= &pnlist[NPN-2]) { ERROR "too many page numbers" WARN; done3(-3); } } if (neg) *pnp++ = -9999; *pnp = -INT_MAX; print = 0; pnp = pnlist; if (*pnp != -INT_MAX) chkpn(); } void setrpt(void) { Tchar i, j; copyf++; raw++; i = getch0(); copyf--; raw--; if ((long) i < 0 || cbits(j = getch0()) == RPT) return; while (i > 0 && pbp < &pbbuf[NC-3]) { i--; *pbp++ = j; } } 9base-6/troff/n6.c0000644000175000017500000001140611402154555013357 0ustar anselmanselm#include "tdef.h" #include "ext.h" #include "fns.h" #include /* * n6.c -- width functions, sizes and fonts */ int n_width(Tchar j) { int i, k; if (iszbit(j)) return 0; if (ismot(j)) { if (isvmot(j)) return(0); k = absmot(j); if (isnmot(j)) k = -k; return(k); } i = cbits(j); if (i < ' ') { if (i == '\b') return(-widthp); if (i == PRESC) i = eschar; else if (i == HX) return(0); } if (i == ohc) return(0); i = trtab[i]; if (i < ' ') return(0); if (i >= t.tfont.nchars) /* not on the font */ k = t.Char; /* really ought to check properly */ else k = t.tfont.wp[i].wid * t.Char; widthp = k; return(k); } Tchar n_setch(int c) { return t_setch(c); } Tchar n_setabs(void) /* set absolute char from \N'...' */ { /* for now, a no-op */ return t_setabs(); } int n_findft(int i) { int k; if ((k = i - '0') >= 0 && k <= nfonts && k < smnt) return(k); for (k = 0; fontlab[k] != i; k++) if (k > nfonts) return(-1); return(k); } void n_mchbits(void) { chbits = 0; setfbits(chbits, font); sps = width(' ' | chbits); } void n_setps(void ) { int i, j; i = cbits(getch()); if (isdigit(i)) { /* \sd or \sdd */ i -= '0'; if (i == 0) /* \s0 */ ; else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) { /* \sdd */ ch = 0; } } else if (i == '(') { /* \s(dd */ getch(); getch(); } else if (i == '+' || i == '-') { /* \s+, \s- */ j = cbits(getch()); if (isdigit(j)) { /* \s+d, \s-d */ ; } else if (j == '(') { /* \s+(dd, \s-(dd */ getch(); getch(); } } } Tchar n_setht(void) /* set character height from \H'...' */ { getch(); inumb(&apts); getch(); return(0); } Tchar n_setslant(void) /* set slant from \S'...' */ { int n; getch(); n = 0; n = inumb(&n); getch(); return(0); } void n_caseft(void) { skip(); setfont(1); } void n_setfont(int a) { int i, j; if (a) i = getrq(); else i = getsn(); if (!i || i == 'P') { j = font1; goto s0; } if (i == 'S' || i == '0') return; if ((j = findft(i)) == -1) return; s0: font1 = font; font = j; mchbits(); } void n_setwd(void) { int base, wid; Tchar i; int delim, emsz, k; int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1; base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0; if (ismot(i = getch())) return; delim = cbits(i); savhp = numtabp[HP].val; numtabp[HP].val = 0; savapts = apts; savapts1 = apts1; savfont = font; savfont1 = font1; savpts = pts; savpts1 = pts1; setwdf++; while (cbits(i = getch()) != delim && !nlflg) { k = width(i); wid += k; numtabp[HP].val += k; if (!ismot(i)) { emsz = (INCH * pts + 36) / 72; } else if (isvmot(i)) { k = absmot(i); if (isnmot(i)) k = -k; base -= k; emsz = 0; } else continue; if (base < numtabp[SB].val) numtabp[SB].val = base; if ((k = base + emsz) > numtabp[ST].val) numtabp[ST].val = k; } setn1(wid, 0, (Tchar) 0); numtabp[HP].val = savhp; apts = savapts; apts1 = savapts1; font = savfont; font1 = savfont1; pts = savpts; pts1 = savpts1; mchbits(); setwdf = 0; } Tchar n_vmot(void) { dfact = lss; vflag++; return n_mot(); } Tchar n_hmot(void) { dfact = EM; return n_mot(); } Tchar n_mot(void) { int j, n; Tchar i; j = HOR; getch(); /*eat delim*/ if (n = atoi0()) { if (vflag) j = VERT; i = makem(quant(n, j)); } else i = 0; getch(); vflag = 0; dfact = 1; return(i); } Tchar n_sethl(int k) { int j; Tchar i; j = t.Halfline; if (k == 'u') j = -j; else if (k == 'r') j = -2 * j; vflag++; i = makem(j); vflag = 0; return(i); } Tchar n_makem(int i) { Tchar j; if (i >= 0) j = i; else j = -i; j |= MOT; if (i < 0) j |= NMOT; if (vflag) j |= VMOT; return(j); } void n_casefp(void) { int i, j; skip(); if ((i = cbits(getch()) - '0') < 0 || i > nfonts) return; if (skip() || !(j = getrq())) return; fontlab[i] = j; } void n_casebd(void) { int i, j, k; j = k = 0; bd0: if (skip() || !(i = getrq()) || (j = findft(i)) == -1) { if (k) goto bd1; else return; } if (j == smnt) { k = smnt; goto bd0; } if (k) { sbold = j; j = k; } bd1: skip(); noscale++; bdtab[j] = atoi0(); noscale = 0; } void n_casevs(void) { int i; skip(); vflag++; dfact = INCH; /*default scaling is points!*/ dfactd = 72; res = VERT; i = inumb(&lss); if (nonumb) i = lss1; if (i < VERT) i = VERT; /* was VERT */ lss1 = lss; lss = i; } Tchar n_xlss(void) { /* stores \x'...' into /* two successive Tchars. /* the first contains HX, the second the value, /* encoded as a vertical motion. /* decoding is done in n2.c by pchar(). */ int i; getch(); dfact = lss; i = quant(atoi0(), VERT); dfact = 1; getch(); if (i >= 0) *pbp++ = MOT | VMOT | i; else *pbp++ = MOT | VMOT | NMOT | -i; return(HX); } 9base-6/troff/n8.c0000644000175000017500000002412011402154555013356 0ustar anselmanselm#include #include "tdef.h" #include "fns.h" #include "ext.h" #define HY_BIT 0200 /* stuff in here only works for 7-bit ascii */ /* this value is used (as a literal) in suftab.c */ /* to encode possible hyphenation points in suffixes. */ /* it could be changed, by widening the tables */ /* to be shorts instead of chars. */ /* * troff8.c * * hyphenation */ int hexsize = 0; /* hyphenation exception list size */ char *hbufp = NULL; /* base of list */ char *nexth = NULL; /* first free slot in list */ Tchar *hyend; #define THRESH 160 /* digram goodness threshold */ int thresh = THRESH; int texhyphen(void); static int alpha(Tchar); void hyphen(Tchar *wp) { int j; Tchar *i; i = wp; while (punct((*i++))) ; if (!alpha(*--i)) return; wdstart = i++; while (alpha(*i++)) ; hyend = wdend = --i - 1; while (punct((*i++))) ; if (*--i) return; if (wdend - wdstart < 4) /* 4 chars is too short to hyphenate */ return; hyp = hyptr; *hyp = 0; hyoff = 2; /* for now, try exceptions first, then tex (if hyphalg is non-zero), then suffix and digram if tex didn't hyphenate it at all. */ if (!exword() && !texhyphen() && !suffix()) digram(); /* this appears to sort hyphenation points into increasing order */ *hyp++ = 0; if (*hyptr) for (j = 1; j; ) { j = 0; for (hyp = hyptr + 1; *hyp != 0; hyp++) { if (*(hyp - 1) > *hyp) { j++; i = *hyp; *hyp = *(hyp - 1); *(hyp - 1) = i; } } } } static int alpha(Tchar i) /* non-zero if really alphabetic */ { if (ismot(i)) return 0; else if (cbits(i) >= ALPHABET) /* this isn't very elegant, but there's */ return 0; /* no good way to make sure i is in range for */ else /* the call of isalpha */ return isalpha(cbits(i)); } int punct(Tchar i) { if (!i || alpha(i)) return(0); else return(1); } void caseha(void) /* set hyphenation algorithm */ { hyphalg = HYPHALG; if (skip()) return; noscale++; hyphalg = atoi0(); noscale = 0; } void caseht(void) /* set hyphenation threshold; not in manual! */ { thresh = THRESH; if (skip()) return; noscale++; thresh = atoi0(); noscale = 0; } char *growh(char *where) { char *new; hexsize += NHEX; if ((new = grow(hbufp, hexsize, sizeof(char))) == NULL) return NULL; if (new == hbufp) { return where; } else { int diff; diff = where - hbufp; hbufp = new; return new + diff; } } void casehw(void) { int i, k; char *j; Tchar t; if (nexth == NULL) { if ((nexth = hbufp = grow(hbufp, NHEX, sizeof(char))) == NULL) { ERROR "No space for exception word list." WARN; return; } hexsize = NHEX; } k = 0; while (!skip()) { if ((j = nexth) >= hbufp + hexsize - 2) if ((j = nexth = growh(j)) == NULL) goto full; for (;;) { if (ismot(t = getch())) continue; i = cbits(t); if (i == ' ' || i == '\n') { *j++ = 0; nexth = j; *j = 0; if (i == ' ') break; else return; } if (i == '-') { k = HY_BIT; continue; } *j++ = maplow(i) | k; k = 0; if (j >= hbufp + hexsize - 2) if ((j = growh(j)) == NULL) goto full; } } return; full: ERROR "Cannot grow exception word list." WARN; *nexth = 0; } int exword(void) { Tchar *w; char *e, *save; e = hbufp; while (1) { save = e; if (e == NULL || *e == 0) return(0); w = wdstart; while (*e && w <= hyend && (*e & 0177) == maplow(cbits(*w))) { e++; w++; } if (!*e) { if (w-1 == hyend || (w == wdend && maplow(cbits(*w)) == 's')) { w = wdstart; for (e = save; *e; e++) { if (*e & HY_BIT) *hyp++ = w; if (hyp > hyptr + NHYP - 1) hyp = hyptr + NHYP - 1; w++; } return(1); } else { e++; continue; } } else while (*e++) ; } } int suffix(void) { Tchar *w; char *s, *s0; Tchar i; extern char *suftab[]; again: i = cbits(*hyend); if (!alpha(i)) return(0); if (i < 'a') i -= 'A' - 'a'; if ((s0 = suftab[i-'a']) == 0) return(0); for (;;) { if ((i = *s0 & 017) == 0) return(0); s = s0 + i - 1; w = hyend - 1; while (s > s0 && w >= wdstart && (*s & 0177) == maplow(cbits(*w))) { s--; w--; } if (s == s0) break; s0 += i; } s = s0 + i - 1; w = hyend; if (*s0 & HY_BIT) goto mark; while (s > s0) { w--; if (*s-- & HY_BIT) { mark: hyend = w - 1; if (*s0 & 0100) /* 0100 used in suftab to encode something too */ continue; if (!chkvow(w)) return(0); *hyp++ = w; } } if (*s0 & 040) return(0); if (exword()) return(1); goto again; } int maplow(int i) { if (isupper(i)) i = tolower(i); return(i); } int vowel(int i) { switch (i) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': case 'y': case 'Y': return(1); default: return(0); } } Tchar *chkvow(Tchar *w) { while (--w >= wdstart) if (vowel(cbits(*w))) return(w); return(0); } void digram(void) { Tchar *w; int val; Tchar *nhyend, *maxw; int maxval; extern char bxh[26][13], bxxh[26][13], xxh[26][13], xhx[26][13], hxx[26][13]; maxw = 0; again: if (!(w = chkvow(hyend + 1))) return; hyend = w; if (!(w = chkvow(hyend))) return; nhyend = w; maxval = 0; w--; while (++w < hyend && w < wdend - 1) { val = 1; if (w == wdstart) val *= dilook('a', cbits(*w), bxh); else if (w == wdstart + 1) val *= dilook(cbits(*(w-1)), cbits(*w), bxxh); else val *= dilook(cbits(*(w-1)), cbits(*w), xxh); val *= dilook(cbits(*w), cbits(*(w+1)), xhx); val *= dilook(cbits(*(w+1)), cbits(*(w+2)), hxx); if (val > maxval) { maxval = val; maxw = w + 1; } } hyend = nhyend; if (maxval > thresh) *hyp++ = maxw; goto again; } int dilook(int a, int b, char t[26][13]) { int i, j; i = t[maplow(a)-'a'][(j = maplow(b)-'a')/2]; if (!(j & 01)) i >>= 4; return(i & 017); } /* here beginneth the tex hyphenation code, as interpreted freely */ /* the main difference is that there is no attempt to squeeze space */ /* as tightly at tex does. */ static int texit(Tchar *, Tchar *); static int readpats(void); static void install(char *); static void fixup(void); static int trieindex(int, int); static char pats[50000]; /* size ought to be computed dynamically */ static char *nextpat = pats; static char *trie[27*27]; /* english-specific sizes */ int texhyphen(void) { static int loaded = 0; /* -1: couldn't find tex file */ if (hyphalg == 0 || loaded == -1) /* non-zero => tex for now */ return 0; if (loaded == 0) { if (readpats()) loaded = 1; else loaded = -1; } return texit(wdstart, wdend); } static int texit(Tchar *start, Tchar *end) /* hyphenate as in tex, return # found */ { int nw, i, k, equal, cnt[500]; char w[500+1], *np, *pp, *wp, *xpp, *xwp; w[0] = '.'; for (nw = 1; start <= end && nw < 500-1; nw++, start++) w[nw] = maplow(tolower(cbits(*start))); start -= (nw - 1); w[nw++] = '.'; w[nw] = 0; /* * printf("try %s\n", w); */ for (i = 0; i <= nw; i++) cnt[i] = '0'; for (wp = w; wp+1 < w+nw; wp++) { for (pp = trie[trieindex(*wp, *(wp+1))]; pp < nextpat; ) { if (pp == 0 /* no trie entry */ || *pp != *wp /* no match on 1st letter */ || *(pp+1) != *(wp+1)) /* no match on 2nd letter */ break; /* so move to next letter of word */ equal = 1; for (xpp = pp+2, xwp = wp+2; *xpp; ) if (*xpp++ != *xwp++) { equal = 0; break; } if (equal) { np = xpp+1; /* numpat */ for (k = wp-w; *np; k++, np++) if (*np > cnt[k]) cnt[k] = *np; /* * printf("match: %s %s\n", pp, xpp+1); */ } pp += *(pp-1); /* skip over pattern and numbers to next */ } } /* * for (i = 0; i < nw; i++) printf("%c", w[i]); * printf(" "); * for (i = 0; i <= nw; i++) printf("%c", cnt[i]); * printf("\n"); */ /* * for (i = 1; i < nw - 1; i++) { * if (i > 2 && i < nw - 3 && cnt[i] % 2) * printf("-"); * if (cbits(start[i-1]) != '.') * printf("%c", cbits(start[i-1])); * } * printf("\n"); */ for (i = 1; i < nw -1; i++) if (i > 2 && i < nw - 3 && cnt[i] % 2) *hyp++ = start + i - 1; return hyp - hyptr; /* non-zero if a hyphen was found */ } /* This code assumes that hyphen.tex looks like % some comments \patterns{ % more comments pat5ter4ns, 1 per line, SORTED, nothing else } more goo \hyphenation{ % more comments ex-cep-tions, one per line; i ignore this part for now } this code is NOT robust against variations. unfortunately, it looks like every local language version of this file has a different format. i have also made no provision for weird characters. sigh. */ static int readpats(void) { FILE *fp; char buf[200], buf1[200]; if ((fp = fopen(unsharp(TEXHYPHENS), "r")) == NULL && (fp = fopen(unsharp(DWBalthyphens), "r")) == NULL) { ERROR "warning: can't find hyphen.tex" WARN; return 0; } while (fgets(buf, sizeof buf, fp) != NULL) { sscanf(buf, "%s", buf1); if (strcmp(buf1, "\\patterns{") == 0) break; } while (fgets(buf, sizeof buf, fp) != NULL) { if (buf[0] == '}') break; install(buf); } fclose(fp); fixup(); return 1; } static void install(char *s) /* map ab4c5de to: 12 abcde \0 00405 \0 */ { int npat, lastpat; char num[500], *onextpat = nextpat; num[0] = '0'; *nextpat++ = ' '; /* fill in with count later */ for (npat = lastpat = 0; *s != '\n' && *s != '\0'; s++) { if (isdigit((uchar)*s)) { num[npat] = *s; lastpat = npat; } else { *nextpat++ = *s; npat++; num[npat] = '0'; } } *nextpat++ = 0; if (nextpat > pats + sizeof(pats)-20) { ERROR "tex hyphenation table overflow, tail end ignored" WARN; nextpat = onextpat; } num[lastpat+1] = 0; strcat(nextpat, num); nextpat += strlen(nextpat) + 1; } static void fixup(void) /* build indexes of where . a b c ... start */ { char *p, *lastc; int n; for (lastc = pats, p = pats+1; p < nextpat; p++) if (*p == ' ') { *lastc = p - lastc; lastc = p; } *lastc = p - lastc; for (p = pats+1; p < nextpat; ) { n = trieindex(p[0], p[1]); if (trie[n] == 0) trie[n] = p; p += p[-1]; } /* printf("pats = %d\n", nextpat - pats); */ } static int trieindex(int d1, int d2) { int z; z = 27 * (d1 == '.' ? 0 : d1 - 'a' + 1) + (d2 == '.' ? 0 : d2 - 'a' + 1); assert(z >= 0 && z < 27*27); return z; } 9base-6/troff/mbwc.h0000644000175000017500000000017611402154555013773 0ustar anselmanselm#define mblen p9mblen #define mbtowc p9mbtowc #define mbstowcs p9mbstowcs #define wctomb p9wctomb #define wcstombs p9wcstombs 9base-6/troff/n10.c0000644000175000017500000002651711402154555013443 0ustar anselmanselm/* n10.c Device interfaces */ #include #include "tdef.h" #include "ext.h" #include "fns.h" #include Term t; /* terminal characteristics */ int dtab; int plotmode; int esct; enum { Notype = 0, Type = 1 }; static char *parse(char *s, int typeit) /* convert \0, etc to nroff driving table format */ { /* typeit => add a type id to the front for later use */ static char buf[100], *t, *obuf; int quote = 0; wchar_t wc; obuf = typeit == Type ? buf : buf+1; #ifdef UNICODE if (mbtowc(&wc, s, strlen(s)) > 1) { /* it's multibyte, */ buf[0] = MBchar; strcpy(buf+1, s); return obuf; } /* so just hand it back */ #endif /*UNICODE*/ buf[0] = Troffchar; t = buf + 1; if (*s == '"') { s++; quote = 1; } for (;;) { if (quote && *s == '"') { s++; break; } if (!quote && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\0')) break; if (*s != '\\') *t++ = *s++; else { s++; /* skip \\ */ if (isdigit((uchar)s[0]) && isdigit((uchar)s[1]) && isdigit((uchar)s[2])) { *t++ = (s[0]-'0')<<6 | (s[1]-'0')<<3 | s[2]-'0'; s += 2; } else if (isdigit((uchar)s[0])) { *t++ = *s - '0'; } else if (*s == 'b') { *t++ = '\b'; } else if (*s == 'n') { *t++ = '\n'; } else if (*s == 'r') { *t++ = '\r'; } else if (*s == 't') { *t++ = '\t'; } else { *t++ = *s; } s++; } } *t = '\0'; return obuf; } static int getnrfont(FILE *fp) /* read the nroff description file */ { Chwid chtemp[NCHARS]; static Chwid chinit; int i, nw, n, wid, code, type; char buf[100], ch[100], s1[100], s2[100]; wchar_t wc; code = 0; chinit.wid = 1; chinit.str = ""; for (i = 0; i < ALPHABET; i++) { chtemp[i] = chinit; /* zero out to begin with */ chtemp[i].num = chtemp[i].code = i; /* every alphabetic character is itself */ chtemp[i].wid = 1; /* default ascii widths */ } skipline(fp); nw = ALPHABET; while (fgets(buf, sizeof buf, fp) != NULL) { sscanf(buf, "%s %s %[^\n]", ch, s1, s2); if (!eq(s1, "\"")) { /* genuine new character */ sscanf(s1, "%d", &wid); } /* else it's a synonym for prev character, */ /* so leave previous values intact */ /* decide what kind of alphabet it might come from */ if (strlen(ch) == 1) { /* it's ascii */ n = ch[0]; /* origin includes non-graphics */ chtemp[n].num = ch[0]; } else if (ch[0] == '\\' && ch[1] == '0') { n = strtol(ch+1, 0, 0); /* \0octal or \0xhex */ chtemp[n].num = n; #ifdef UNICODE } else if (mbtowc(&wc, ch, strlen(ch)) > 1) { chtemp[nw].num = chadd(ch, MBchar, Install); n = nw; nw++; #endif /*UNICODE*/ } else { if (strcmp(ch, "---") == 0) { /* no name */ sprintf(ch, "%d", code); type = Number; } else type = Troffchar; /* BUG in here somewhere when same character occurs twice in table */ chtemp[nw].num = chadd(ch, type, Install); n = nw; nw++; } chtemp[n].wid = wid; chtemp[n].str = strdupl(parse(s2, Type)); } t.tfont.nchars = nw; t.tfont.wp = (Chwid *) malloc(nw * sizeof(Chwid)); if (t.tfont.wp == NULL) return -1; for (i = 0; i < nw; i++) t.tfont.wp[i] = chtemp[i]; return 1; } void n_ptinit(void) { int i; char *p; char opt[50], cmd[100]; FILE *fp; hmot = n_hmot; makem = n_makem; setabs = n_setabs; setch = n_setch; sethl = n_sethl; setht = n_setht; setslant = n_setslant; vmot = n_vmot; xlss = n_xlss; findft = n_findft; width = n_width; mchbits = n_mchbits; ptlead = n_ptlead; ptout = n_ptout; ptpause = n_ptpause; setfont = n_setfont; setps = n_setps; setwd = n_setwd; if ((p = getenv("NROFFTERM")) != 0) strcpy(devname, p); if (termtab[0] == 0) strcpy(termtab,DWBntermdir); if (fontdir[0] == 0) strcpy(fontdir, ""); if (devname[0] == 0) strcpy(devname, NDEVNAME); pl = 11*INCH; po = PO; hyf = 0; ascii = 1; lg = 0; fontlab[1] = 'R'; fontlab[2] = 'I'; fontlab[3] = 'B'; fontlab[4] = PAIR('B','I'); fontlab[5] = 'D'; bdtab[3] = 3; bdtab[4] = 3; /* hyphalg = 0; /* for testing */ strcat(termtab, devname); if ((fp = fopen(unsharp(termtab), "r")) == NULL) { ERROR "cannot open %s", termtab WARN; exit(-1); } /* this loop isn't robust about input format errors. */ /* it assumes name, name-value pairs..., charset */ /* god help us if we get out of sync. */ fscanf(fp, "%s", cmd); /* should be device name... */ if (!is(devname) && trace) ERROR "wrong terminal name: saw %s, wanted %s", cmd, devname WARN; for (;;) { fscanf(fp, "%s", cmd); if (is("charset")) break; fscanf(fp, " %[^\n]", opt); if (is("bset")) t.bset = atoi(opt); else if (is("breset")) t.breset = atoi(opt); else if (is("Hor")) t.Hor = atoi(opt); else if (is("Vert")) t.Vert = atoi(opt); else if (is("Newline")) t.Newline = atoi(opt); else if (is("Char")) t.Char = atoi(opt); else if (is("Em")) t.Em = atoi(opt); else if (is("Halfline")) t.Halfline = atoi(opt); else if (is("Adj")) t.Adj = atoi(opt); else if (is("twinit")) t.twinit = strdupl(parse(opt, Notype)); else if (is("twrest")) t.twrest = strdupl(parse(opt, Notype)); else if (is("twnl")) t.twnl = strdupl(parse(opt, Notype)); else if (is("hlr")) t.hlr = strdupl(parse(opt, Notype)); else if (is("hlf")) t.hlf = strdupl(parse(opt, Notype)); else if (is("flr")) t.flr = strdupl(parse(opt, Notype)); else if (is("bdon")) t.bdon = strdupl(parse(opt, Notype)); else if (is("bdoff")) t.bdoff = strdupl(parse(opt, Notype)); else if (is("iton")) t.iton = strdupl(parse(opt, Notype)); else if (is("itoff")) t.itoff = strdupl(parse(opt, Notype)); else if (is("ploton")) t.ploton = strdupl(parse(opt, Notype)); else if (is("plotoff")) t.plotoff = strdupl(parse(opt, Notype)); else if (is("up")) t.up = strdupl(parse(opt, Notype)); else if (is("down")) t.down = strdupl(parse(opt, Notype)); else if (is("right")) t.right = strdupl(parse(opt, Notype)); else if (is("left")) t.left = strdupl(parse(opt, Notype)); else ERROR "bad tab.%s file, %s %s", devname, cmd, opt WARN; } getnrfont(fp); fclose(fp); sps = EM; ics = EM * 2; dtab = 8 * t.Em; for (i = 0; i < 16; i++) tabtab[i] = dtab * (i + 1); pl = 11 * INCH; po = PO; spacesz = SS; lss = lss1 = VS; ll = ll1 = lt = lt1 = LL; smnt = nfonts = 5; /* R I B BI S */ n_specnames(); /* install names like "hyphen", etc. */ if (eqflg) t.Adj = t.Hor; } void n_specnames(void) { int i; for (i = 0; spnames[i].n; i++) *spnames[i].n = chadd(spnames[i].v, Troffchar, Install); if (c_isalnum == 0) c_isalnum = NROFFCHARS; } void twdone(void) { if (!TROFF && t.twrest) { obufp = obuf; oputs(t.twrest); flusho(); if (pipeflg) { pclose(ptid); } restore_tty(); } } void n_ptout(Tchar i) { *olinep++ = i; if (olinep >= &oline[LNSIZE]) olinep--; if (cbits(i) != '\n') return; olinep--; lead += dip->blss + lss - t.Newline; dip->blss = 0; esct = esc = 0; if (olinep > oline) { move(); ptout1(); oputs(t.twnl); } else { lead += t.Newline; move(); } lead += dip->alss; dip->alss = 0; olinep = oline; } void ptout1(void) { int k; char *codep; int w, j, phyw; Tchar *q, i; static int oxfont = FT; /* start off in roman */ for (q = oline; q < olinep; q++) { i = *q; if (ismot(i)) { j = absmot(i); if (isnmot(i)) j = -j; if (isvmot(i)) lead += j; else esc += j; continue; } if ((k = cbits(i)) <= ' ') { switch (k) { case ' ': /*space*/ esc += t.Char; break; case '\033': case '\007': case '\016': case '\017': oput(k); break; } continue; } phyw = w = t.Char * t.tfont.wp[k].wid; if (iszbit(i)) w = 0; if (esc || lead) move(); esct += w; xfont = fbits(i); if (xfont != oxfont) { switch (oxfont) { case ULFONT: oputs(t.itoff); break; case BDFONT: oputs(t.bdoff); break; case BIFONT: oputs(t.itoff); oputs(t.bdoff); break; } switch (xfont) { case ULFONT: if (*t.iton & 0377) oputs(t.iton); break; case BDFONT: if (*t.bdon & 0377) oputs(t.bdon); break; case BIFONT: if (*t.bdon & 0377) oputs(t.bdon); if (*t.iton & 0377) oputs(t.iton); break; } oxfont = xfont; } if ((xfont == ulfont || xfont == BIFONT) && !(*t.iton & 0377)) { for (j = w / t.Char; j > 0; j--) oput('_'); for (j = w / t.Char; j > 0; j--) oput('\b'); } if (!(*t.bdon & 0377) && ((j = bdtab[xfont]) || xfont == BDFONT || xfont == BIFONT)) j++; else j = 1; /* number of overstrikes for bold */ if (k < ALPHABET) { /* ordinary ascii */ oput(k); while (--j > 0) { oput('\b'); oput(k); } } else if (k >= t.tfont.nchars) { /* BUG -- not really understood */ /* fprintf(stderr, "big char %d, name %s\n", k, chname(k)); /* */ oputs(chname(k)+1); /* BUG: should separate Troffchar and MBchar... */ } else if (t.tfont.wp[k].str == 0) { /* fprintf(stderr, "nostr char %d, name %s\n", k, chname(k)); /* */ oputs(chname(k)+1); /* BUG: should separate Troffchar and MBchar... */ } else if (t.tfont.wp[k].str[0] == MBchar) { /* parse() puts this on */ /* fprintf(stderr, "MBstr char %d, name %s\n", k, chname(k)); /* */ oputs(t.tfont.wp[k].str+1); } else { int oj = j; /* fprintf(stderr, "str char %d, name %s\n", k, chname(k)); /* */ codep = t.tfont.wp[k].str+1; /* Troffchar by default */ while (*codep != 0) { if (*codep & 0200) { codep = plot(codep); oput(' '); } else { if (*codep == '%') /* escape */ codep++; oput(*codep); if (*codep == '\033') oput(*++codep); else if (*codep != '\b') for (j = oj; --j > 0; ) { oput('\b'); oput(*codep); } codep++; } } } if (!w) for (j = phyw / t.Char; j > 0; j--) oput('\b'); } } char *plot(char *x) { int i; char *j, *k; oputs(t.ploton); k = x; if ((*k & 0377) == 0200) k++; for (; *k; k++) { if (*k == '%') { /* quote char within plot mode */ oput(*++k); } else if (*k & 0200) { if (*k & 0100) { if (*k & 040) j = t.up; else j = t.down; } else { if (*k & 040) j = t.left; else j = t.right; } if ((i = *k & 037) == 0) { /* 2nd 0200 turns it off */ ++k; break; } while (i--) oputs(j); } else oput(*k); } oputs(t.plotoff); return(k); } void move(void) { int k; char *i, *j; char *p, *q; int iesct, dt; iesct = esct; if (esct += esc) i = "\0"; else i = "\n\0"; j = t.hlf; p = t.right; q = t.down; if (lead) { if (lead < 0) { lead = -lead; i = t.flr; /* if(!esct)i = t.flr; else i = "\0";*/ j = t.hlr; q = t.up; } if (*i & 0377) { k = lead / t.Newline; lead = lead % t.Newline; while (k--) oputs(i); } if (*j & 0377) { k = lead / t.Halfline; lead = lead % t.Halfline; while (k--) oputs(j); } else { /* no half-line forward, not at line begining */ k = lead / t.Newline; lead = lead % t.Newline; if (k > 0) esc = esct; i = "\n"; while (k--) oputs(i); } } if (esc) { if (esc < 0) { esc = -esc; j = "\b"; p = t.left; } else { j = " "; if (hflg) while ((dt = dtab - (iesct % dtab)) <= esc) { if (dt % t.Em) break; oput(TAB); esc -= dt; iesct += dt; } } k = esc / t.Em; esc = esc % t.Em; while (k--) oputs(j); } if ((*t.ploton & 0377) && (esc || lead)) { oputs(t.ploton); esc /= t.Hor; lead /= t.Vert; while (esc--) oputs(p); while (lead--) oputs(q); oputs(t.plotoff); } esc = lead = 0; } void n_ptlead(void) { move(); } void n_ptpause(void ) { char junk; flusho(); read(2, &junk, 1); } 9base-6/troff/README0000644000175000017500000000222011402154555013542 0ustar anselmanselmTo make troff (actually a.out): make You will also need to write a driver for your favorite output device. d202.c provides a model, although it is specialized to a machine no one has. There are also a variety of postscript drivers that are the best thing to use if you have a postscript device. You will also have to make a DESC file for your typesetter and some font description files; see dev202 for examples. These describe the named characters, widths, kerning information, and output codes. Nroff is the same program as troff, so you should cp a.out /usr/bin/troff ln /usr/bin/troff /usr/bin/nroff or the equivalent. You will also need terminal description files for your terminals; see tab.37, tab.450 and tab.lp for examples. Troff uses files that are normally stored in /usr/lib/font; macro packages are in /usr/lib/tmac; and nroff tables are in /usr/lib/term. You can edit tdef.h to change these assumptions. There have been a few features since the last version, and a number of significant internal changes. Not all are improvements, of course. Most of the more recent changes, including bug fixes, are in FIXES, which you should read also. 9base-6/troff/fns.h0000644000175000017500000001637211402154555013636 0ustar anselmanselm#define getline p9getline #include "mbwc.h" /* * other */ #ifdef NOTDEF int pclose(FILE*); long filesize(int fd); int open(char *, int); int read(int, char *, int); int lseek(int, long, int); int close(int); int getpid(void); #endif char *unsharp(char*); /* * c1.c */ void init0(void); void init2(void); void cvtime(void); void errprint(void); int control(int a, int b); void casept(void); int getrq(void); Tchar getch(void); void setxon(void); Tchar getch0(void); Tchar get1ch(FILE *); void pushback(Tchar *b); void cpushback(char *b); int nextfile(void); int popf(void); void flushi(void); int getach(void); void casenx(void); int getname(void); void caseso(void); void caself(void); void casecf(void); void getline(char *s, int n); void casesy(void); void getpn(char *a); void setrpt(void); /* * n2.c */ int pchar(Tchar i); void pchar1(Tchar i); int pchar2(Tchar i); int flusho(void); void casedone(void); void caseex(void); void done(int x); void done1(int x); void done2(int x); void done3(int x); void edone(int x); void casepi(void); /* * c3.c */ void blockinit(void); char* grow(char *, int, int); void mnspace(void); void caseig(void); void casern(void); void maddhash(Contab *rp); void munhash(Contab *mp); void mrehash(void); void caserm(void); void caseas(void); void caseds(void); void caseam(void); void casede(void); int findmn(int i); void clrmn(int i); Offset finds(int mn); int skip(void); int copyb(void); void copys(void); Offset alloc(void); void ffree(Offset i); void wbf(Tchar i); Tchar rbf(void); Tchar popi(void); Offset pushi(Offset newip, int mname); void* setbrk(int x); int getsn(void); Offset setstr(void); void collect(void); void seta(void); void caseda(void); void casegd(void); void casedi(void); void casedt(void); void casetl(void); void casepc(void); void casepm(void); void stackdump(void); /* * c4.c */ void setn(void); int wrc(Tchar i); void setn1(int i, int form, Tchar bits); void nnspace(void); void nrehash(void); void nunhash(Numtab *rp); int findr(int i); int usedr(int i); int fnumb(int i, int (*f)(Tchar)); int decml(int i, int (*f)(Tchar)); int roman(int i, int (*f)(Tchar)); int roman0(int i, int (*f)(Tchar), char *onesp, char *fivesp); int abc(int i, int (*f)(Tchar)); int abc0(int i, int (*f)(Tchar)); long atoi0(void); long ckph(void); long atoi1(Tchar ii); void caserr(void); void casenr(void); void caseaf(void); void setaf(void); int vnumb(int *i); int hnumb(int *i); int inumb(int *n); int quant(int n, int m); /* * c5.c */ void casead(void); void casena(void); void casefi(void); void casenf(void); void casers(void); void casens(void); int chget(int c); void casecc(void); void casec2(void); void casehc(void); void casetc(void); void caselc(void); void casehy(void); int max(int aa, int bb); void casenh(void); void casece(void); void casein(void); void casell(void); void caselt(void); void caseti(void); void casels(void); void casepo(void); void casepl(void); void casewh(void); void casech(void); int findn(int i); void casepn(void); void casebp(void); void casextm(void); void casetm(void); void casefm(void); void casetm1(int ab, FILE *out); void casesp(void); void casesp1(int a); void casert(void); void caseem(void); void casefl(void); void caseev(void); void envcopy(Env *e1, Env *e2); void caseel(void); void caseie(void); void casexif(void); void caseif(void); void caseif1(int); void eatblk(int inblk); int cmpstr(Tchar c); void caserd(void); int rdtty(void); void caseec(void); void caseeo(void); void caseta(void); void casene(void); void casetr(void); void casecu(void); void caseul(void); void caseuf(void); void caseit(void); void casemc(void); void casemk(void); void casesv(void); void caseos(void); void casenm(void); void getnm(int *p, int min); void casenn(void); void caseab(void); void save_tty(void); void restore_tty(void); void set_tty(void); void echo_off(void); void echo_on(void); /* * t6.c */ int t_width(Tchar j); void zapwcache(int s); int onfont(int n, int f); int getcw(int i); void xbits(Tchar i, int bitf); Tchar t_setch(int c); Tchar t_setabs(void); int t_findft(int i); void caseps(void); void casps1(int i); int findps(int i); void t_mchbits(void); void t_setps(void); Tchar t_setht(void); Tchar t_setslant(void); void caseft(void); void t_setfont(int a); void t_setwd(void); Tchar t_vmot(void); Tchar t_hmot(void); Tchar t_mot(void); Tchar t_sethl(int k); Tchar t_makem(int i); Tchar getlg(Tchar i); void caselg(void); void casefp(void); char *strdupl(const char *); int setfp(int pos, int f, char *truename, int print); void casecs(void); void casebd(void); void casevs(void); void casess(void); Tchar t_xlss(void); Uchar* unpair(int i); void outascii(Tchar i); /* * c7.c */ void tbreak(void); void donum(void); void text(void); void nofill(void); void callsp(void); void ckul(void); void storeline(Tchar c, int w); void newline(int a); int findn1(int a); void chkpn(void); int findt(int a); int findt1(void); void eject(Stack *a); int movword(void); void horiz(int i); void setnel(void); int getword(int x); void storeword(Tchar c, int w); Tchar gettch(void); /* * c8.c */ void hyphen(Tchar *wp); int punct(Tchar i); int alph(int i); void caseha(void); void caseht(void); void casehw(void); int exword(void); int suffix(void); int maplow(int i); int vowel(int i); Tchar* chkvow(Tchar *w); void digram(void); int dilook(int a, int b, char t[26][13]); /* * c9.c */ Tchar setz(void); void setline(void); int eat(int c); void setov(void); void setbra(void); void setvline(void); void setdraw(void); void casefc(void); Tchar setfield(int x); /* * t10.c */ void t_ptinit(void); void t_specnames(void); void t_ptout(Tchar i); int ptout0(Tchar *pi); void ptchname(int); void ptflush(void); void ptps(void); void ptfont(void); void ptfpcmd(int f, char *s, char *fn); void t_ptlead(void); void ptesc(void); void ptpage(int n); void pttrailer(void); void ptstop(void); void t_ptpause(void); /* * t11.c */ int getdesc(char *name); int getfont(char *name, int pos); int chadd(char *s, int, int); char* chname(int n); int getlig(FILE *fin); /* * n6.c */ int n_width(Tchar j); Tchar n_setch(int c); Tchar n_setabs(void); int n_findft(int i); void n_mchbits(void); void n_setps(void); Tchar n_setht(void); Tchar n_setslant(void); void n_caseft(void); void n_setfont(int a); void n_setwd(void); Tchar n_vmot(void); Tchar n_hmot(void); Tchar n_mot(void); Tchar n_sethl(int k); Tchar n_makem(int i); void n_casefp(void); void n_casebd(void); void n_casevs(void); Tchar n_xlss(void); /* * n10.c */ void n_ptinit(void); char* skipstr(char *s); char* getstr(char *s, char *t); char* getint(char *s, int *pn); void twdone(void); void n_specnames(void); int findch(char *s); void n_ptout(Tchar i); void ptout1(void); char* plot(char *x); void move(void); void n_ptlead(void); void n_ptpause(void); /* * indirect calls on TROFF/!TROFF. these are variables! */ extern Tchar (*hmot)(void); extern Tchar (*makem)(int i); extern Tchar (*setabs)(void); extern Tchar (*setch)(int c); extern Tchar (*sethl)(int k); extern Tchar (*setht)(void); extern Tchar (*setslant)(void); extern Tchar (*vmot)(void); extern Tchar (*xlss)(void); extern int (*findft)(int i); extern int (*width)(Tchar j); extern void (*mchbits)(void); extern void (*ptlead)(void); extern void (*ptout)(Tchar i); extern void (*ptpause)(void); extern void (*setfont)(int a); extern void (*setps)(void); extern void (*setwd)(void); 9base-6/getflags/0000755000175000017500000000000011402154555013342 5ustar anselmanselm9base-6/getflags/getflags.c0000644000175000017500000000252011402154555015301 0ustar anselmanselm#include #include void usage(void) { print("status=usage\n"); exits(0); } char* findarg(char *flags, Rune r) { char *p; Rune rr; for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){ chartorune(&rr, p); if(rr == r) return p; } return nil; } int countargs(char *p) { int n; n = 1; while(*p == ' ') p++; for(; *p && *p != ','; p++) if(*p == ' ' && *(p-1) != ' ') n++; return n; } void main(int argc, char *argv[]) { char *flags, *p, buf[512]; int i, n; Fmt fmt; quotefmtinstall(); argv0 = argv[0]; /* for sysfatal */ flags = getenv("flagfmt"); if(flags == nil){ fprint(2, "$flagfmt not set\n"); print("exit 'missing flagfmt'"); exits(0); } fmtfdinit(&fmt, 1, buf, sizeof buf); for(p=flags; p!=(char*)1; p=strchr(p, ',')+1) fmtprint(&fmt, "flag%.1s=()\n", p); ARGBEGIN{ default: if((p = findarg(flags, ARGC())) == nil) usage(); p += runelen(ARGC()); if(*p == ',' || *p == 0){ fmtprint(&fmt, "flag%C=1\n", ARGC()); break; } n = countargs(p); fmtprint(&fmt, "flag%C=(", ARGC()); for(i=0; i x .TP .BI = x .PD Pop and compare the top two elements of the stack. Register .I x is executed if they obey the stated relation. .TP .B v Replace the top element on the stack by its square root. Any existing fractional part of the argument is taken into account, but otherwise the scale factor is ignored. .TP .B ! Interpret the rest of the line as a shell command. .TP .B c Clear the stack. .TP .B i The top value on the stack is popped and used as the number base for further input. .TP .B I Push the input base on the top of the stack. .TP .B o The top value on the stack is popped and used as the number base for further output. In bases larger than 10, each `digit' prints as a group of decimal digits. .TP .B O Push the output base on the top of the stack. .TP .B k Pop the top of the stack, and use that value as a non-negative scale factor: the appropriate number of places are printed on output, and maintained during multiplication, division, and exponentiation. The interaction of scale factor, input base, and output base will be reasonable if all are changed together. .TP .B z Push the stack level onto the stack. .TP .B Z Replace the number on the top of the stack with its length. .TP .B ? A line of input is taken from the input source (usually the terminal) and executed. .TP .B "; :" Used by .I bc for array operations. .PP The scale factor set by .B k determines how many digits are kept to the right of the decimal point. If .I s is the current scale factor, .I sa is the scale of the first operand, .I sb is the scale of the second, and .I b is the (integer) second operand, results are truncated to the following scales. .IP .nf \fL+\fR,\fL-\fR max(\fIsa,sb\fR) \fL*\fR min(\fIsa\fR+\fIsb \fR, max\fR(\fIs,sa,sb\fR)) \fL/\fI s \fL%\fR so that dividend = divisor*quotient + remainder; remainder has sign of dividend \fL^\fR min(\fIsa\fR\(mu|\fIb\fR|, max(\fIs,sa\fR)) \fLv\fR max(\fIs,sa\fR) .fi .SH EXAMPLES .LP Print the first ten values of .IR n ! .IP .EX [la1+dsa*pla10>y]sy 0sa1 lyx .EE .SH SOURCE .B \*9/src/cmd/dc.c .SH "SEE ALSO" .IR bc (1), .IR hoc (1) .SH DIAGNOSTICS .I x .LR "is unimplemented" , where .I x is an octal number: an internal error. .br `Out of headers' for too many numbers being kept around. .br `Nesting depth' for too many levels of nested execution. .SH BUGS When the input base exceeds 16, there is no notation for digits greater than .BR F . .PP Past its time. 9base-6/dc/dc.c0000644000175000017500000010702711402154555012675 0ustar anselmanselm#include #include #include typedef void* pointer; #define div dcdiv #define FATAL 0 #define NFATAL 1 #define BLK sizeof(Blk) #define PTRSZ sizeof(int*) #define HEADSZ 1024 #define STKSZ 100 #define RDSKSZ 100 #define TBLSZ 256 #define ARRAYST 221 #define MAXIND 2048 #define NL 1 #define NG 2 #define NE 3 #define length(p) ((p)->wt-(p)->beg) #define rewind(p) (p)->rd=(p)->beg #undef create #define create(p) (p)->rd = (p)->wt = (p)->beg #define fsfile(p) (p)->rd = (p)->wt #define truncate(p) (p)->wt = (p)->rd #define sfeof(p) (((p)->rd==(p)->wt)?1:0) #define sfbeg(p) (((p)->rd==(p)->beg)?1:0) #define sungetc(p,c) *(--(p)->rd)=c #define sgetc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd++) #define skipc(p) {if((p)->rd<(p)->wt)(p)->rd++;} #define slookc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd) #define sbackc(p) (((p)->rd==(p)->beg)?-1:*(--(p)->rd)) #define backc(p) {if((p)->rd>(p)->beg) --(p)->rd;} #define sputc(p,c) {if((p)->wt==(p)->last)more(p);\ *(p)->wt++ = c; } #define salterc(p,c) {if((p)->rd==(p)->last)more(p);\ *(p)->rd++ = c;\ if((p)->rd>(p)->wt)(p)->wt=(p)->rd;} #define sunputc(p) (*((p)->rd = --(p)->wt)) #define sclobber(p) ((p)->rd = --(p)->wt) #define zero(p) for(pp=(p)->beg;pp<(p)->last;)\ *pp++='\0' #define OUTC(x) {Bputc(&bout,x); if(--count == 0){Bprint(&bout,"\\\n"); count=ll;} } #define TEST2 {if((count -= 2) <=0){Bprint(&bout,"\\\n");count=ll;}} #define EMPTY if(stkerr != 0){Bprint(&bout,"stack empty\n"); continue; } #define EMPTYR(x) if(stkerr!=0){pushp(x);Bprint(&bout,"stack empty\n");continue;} #define EMPTYS if(stkerr != 0){Bprint(&bout,"stack empty\n"); return(1);} #define EMPTYSR(x) if(stkerr !=0){Bprint(&bout,"stack empty\n");pushp(x);return(1);} #define error(p) {Bprint(&bout,p); continue; } #define errorrt(p) {Bprint(&bout,p); return(1); } #define LASTFUN 026 typedef struct Blk Blk; struct Blk { char *rd; char *wt; char *beg; char *last; }; typedef struct Sym Sym; struct Sym { Sym *next; Blk *val; }; typedef struct Wblk Wblk; struct Wblk { Blk **rdw; Blk **wtw; Blk **begw; Blk **lastw; }; Biobuf *curfile, *fsave; Blk *arg1, *arg2; uchar savk; int dbg; int ifile; Blk *scalptr, *basptr, *tenptr, *inbas; Blk *sqtemp, *chptr, *strptr, *divxyz; Blk *stack[STKSZ]; Blk **stkptr,**stkbeg; Blk **stkend; Blk *hfree; int stkerr; int lastchar; Blk *readstk[RDSKSZ]; Blk **readptr; Blk *rem; int k; Blk *irem; int skd,skr; int neg; Sym symlst[TBLSZ]; Sym *stable[TBLSZ]; Sym *sptr, *sfree; long rel; long nbytes; long all; long headmor; long obase; int fw,fw1,ll; void (*outdit)(Blk *p, int flg); int logo; int logten; int count; char *pp; char *dummy; long longest, maxsize, active; int lall, lrel, lcopy, lmore, lbytes; int inside; Biobuf bin; Biobuf bout; void main(int argc, char *argv[]); void commnds(void); Blk* readin(void); Blk* div(Blk *ddivd, Blk *ddivr); int dscale(void); Blk* removr(Blk *p, int n); Blk* dcsqrt(Blk *p); void init(int argc, char *argv[]); void onintr(void); void pushp(Blk *p); Blk* pop(void); Blk* readin(void); Blk* add0(Blk *p, int ct); Blk* mult(Blk *p, Blk *q); void chsign(Blk *p); int readc(void); void unreadc(char c); void binop(char c); void dcprint(Blk *hptr); Blk* dcexp(Blk *base, Blk *ex); Blk* getdec(Blk *p, int sc); void tenot(Blk *p, int sc); void oneot(Blk *p, int sc, char ch); void hexot(Blk *p, int flg); void bigot(Blk *p, int flg); Blk* add(Blk *a1, Blk *a2); int eqk(void); Blk* removc(Blk *p, int n); Blk* scalint(Blk *p); Blk* scale(Blk *p, int n); int subt(void); int command(void); int cond(char c); void load(void); #define log2 dclog2 int log2(long n); Blk* salloc(int size); Blk* morehd(void); Blk* copy(Blk *hptr, int size); void sdump(char *s1, Blk *hptr); void seekc(Blk *hptr, int n); void salterwd(Blk *hptr, Blk *n); void more(Blk *hptr); void ospace(char *s); void garbage(char *s); void release(Blk *p); Blk* dcgetwd(Blk *p); void putwd(Blk *p, Blk *c); Blk* lookwd(Blk *p); int getstk(void); /********debug only**/ void tpr(char *cp, Blk *bp) { print("%s-> ", cp); print("beg: %lx rd: %lx wt: %lx last: %lx\n", bp->beg, bp->rd, bp->wt, bp->last); for (cp = bp->beg; cp != bp->wt; cp++) { print("%d", *cp); if (cp != bp->wt-1) print("/"); } print("\n"); } /************/ void main(int argc, char *argv[]) { Binit(&bin, 0, OREAD); Binit(&bout, 1, OWRITE); init(argc,argv); commnds(); exits(0); } void commnds(void) { Blk *p, *q, **ptr, *s, *t; long l; Sym *sp; int sk, sk1, sk2, c, sign, n, d; while(1) { Bflush(&bout); if(((c = readc())>='0' && c <= '9') || (c>='A' && c <='F') || c == '.') { unreadc(c); p = readin(); pushp(p); continue; } switch(c) { case ' ': case '\n': case -1: continue; case 'Y': sdump("stk",*stkptr); Bprint(&bout, "all %ld rel %ld headmor %ld\n",all,rel,headmor); Bprint(&bout, "nbytes %ld\n",nbytes); Bprint(&bout, "longest %ld active %ld maxsize %ld\n", longest, active, maxsize); Bprint(&bout, "new all %d rel %d copy %d more %d lbytes %d\n", lall, lrel, lcopy, lmore, lbytes); lall = lrel = lcopy = lmore = lbytes = 0; continue; case '_': p = readin(); savk = sunputc(p); chsign(p); sputc(p,savk); pushp(p); continue; case '-': subt(); continue; case '+': if(eqk() != 0) continue; binop('+'); continue; case '*': arg1 = pop(); EMPTY; arg2 = pop(); EMPTYR(arg1); sk1 = sunputc(arg1); sk2 = sunputc(arg2); savk = sk1+sk2; binop('*'); p = pop(); if(savk>k && savk>sk1 && savk>sk2) { sclobber(p); sk = sk1; if(sk=3) { error("exp too big\n"); } savk = sunputc(arg2); p = dcexp(arg2,arg1); release(arg2); rewind(arg1); c = sgetc(arg1); if(c == -1) c = 0; else if(sfeof(arg1) == 0) c = sgetc(arg1)*100 + c; d = c*savk; release(arg1); /* if(neg == 0) { removed to fix -exp bug*/ if(k>=savk) n = k; else n = savk; if(n= 100) { sputc(p,n/100); n %= 100; } sputc(p,n); sputc(p,0); pushp(p); continue; case 'Z': p = pop(); EMPTY; n = (length(p)-1)<<1; fsfile(p); backc(p); if(sfbeg(p) == 0) { if((c = sbackc(p))<0) { n -= 2; if(sfbeg(p) == 1) n++; else { if((c = sbackc(p)) == 0) n++; else if(c > 90) n--; } } else if(c < 10) n--; } release(p); q = salloc(1); if(n >= 100) { sputc(q,n%100); n /= 100; } sputc(q,n); sputc(q,0); pushp(q); continue; case 'i': p = pop(); EMPTY; p = scalint(p); release(inbas); inbas = p; continue; case 'I': p = copy(inbas,length(inbas)+1); sputc(p,0); pushp(p); continue; case 'o': p = pop(); EMPTY; p = scalint(p); sign = 0; n = length(p); q = copy(p,n); fsfile(q); l = c = sbackc(q); if(n != 1) { if(c<0) { sign = 1; chsign(q); n = length(q); fsfile(q); l = c = sbackc(q); } if(n != 1) { while(sfbeg(q) == 0) l = l*100+sbackc(q); } } logo = log2(l); obase = l; release(basptr); if(sign == 1) obase = -l; basptr = p; outdit = bigot; if(n == 1 && sign == 0) { if(c <= 16) { outdit = hexot; fw = 1; fw1 = 0; ll = 70; release(q); continue; } } n = 0; if(sign == 1) n++; p = salloc(1); sputc(p,-1); t = add(p,q); n += length(t)*2; fsfile(t); if(sbackc(t)>9) n++; release(t); release(q); release(p); fw = n; fw1 = n-1; ll = 70; if(fw>=ll) continue; ll = (70/fw)*fw; continue; case 'O': p = copy(basptr,length(basptr)+1); sputc(p,0); pushp(p); continue; case '[': n = 0; p = salloc(0); for(;;) { if((c = readc()) == ']') { if(n == 0) break; n--; } sputc(p,c); if(c == '[') n++; } pushp(p); continue; case 'k': p = pop(); EMPTY; p = scalint(p); if(length(p)>1) { error("scale too big\n"); } rewind(p); k = 0; if(!sfeof(p)) k = sgetc(p); release(scalptr); scalptr = p; continue; case 'K': p = copy(scalptr,length(scalptr)+1); sputc(p,0); pushp(p); continue; case 'X': p = pop(); EMPTY; fsfile(p); n = sbackc(p); release(p); p = salloc(2); sputc(p,n); sputc(p,0); pushp(p); continue; case 'Q': p = pop(); EMPTY; if(length(p)>2) { error("Q?\n"); } rewind(p); if((c = sgetc(p))<0) { error("neg Q\n"); } release(p); while(c-- > 0) { if(readptr == &readstk[0]) { error("readstk?\n"); } if(*readptr != 0) release(*readptr); readptr--; } continue; case 'q': if(readptr <= &readstk[1]) exits(0); if(*readptr != 0) release(*readptr); readptr--; if(*readptr != 0) release(*readptr); readptr--; continue; case 'f': if(stkptr == &stack[0]) Bprint(&bout,"empty stack\n"); else { for(ptr = stkptr; ptr > &stack[0];) { dcprint(*ptr--); } } continue; case 'p': if(stkptr == &stack[0]) Bprint(&bout,"empty stack\n"); else { dcprint(*stkptr); } continue; case 'P': p = pop(); EMPTY; sputc(p,0); Bprint(&bout,"%s",p->beg); release(p); continue; case 'd': if(stkptr == &stack[0]) { Bprint(&bout,"empty stack\n"); continue; } q = *stkptr; n = length(q); p = copy(*stkptr,n); pushp(p); continue; case 'c': while(stkerr == 0) { p = pop(); if(stkerr == 0) release(p); } continue; case 'S': if(stkptr == &stack[0]) { error("save: args\n"); } c = getstk() & 0377; sptr = stable[c]; sp = stable[c] = sfree; sfree = sfree->next; if(sfree == 0) goto sempty; sp->next = sptr; p = pop(); EMPTY; if(c >= ARRAYST) { q = copy(p,length(p)+PTRSZ); for(n = 0;n < PTRSZ;n++) { sputc(q,0); } release(p); p = q; } sp->val = p; continue; sempty: error("symbol table overflow\n"); case 's': if(stkptr == &stack[0]) { error("save:args\n"); } c = getstk() & 0377; sptr = stable[c]; if(sptr != 0) { p = sptr->val; if(c >= ARRAYST) { rewind(p); while(sfeof(p) == 0) release(dcgetwd(p)); } release(p); } else { sptr = stable[c] = sfree; sfree = sfree->next; if(sfree == 0) goto sempty; sptr->next = 0; } p = pop(); sptr->val = p; continue; case 'l': load(); continue; case 'L': c = getstk() & 0377; sptr = stable[c]; if(sptr == 0) { error("L?\n"); } stable[c] = sptr->next; sptr->next = sfree; sfree = sptr; p = sptr->val; if(c >= ARRAYST) { rewind(p); while(sfeof(p) == 0) { q = dcgetwd(p); if(q != 0) release(q); } } pushp(p); continue; case ':': p = pop(); EMPTY; q = scalint(p); fsfile(q); c = 0; if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) { error("neg index\n"); } if(length(q)>2) { error("index too big\n"); } if(sfbeg(q) == 0) c = c*100+sbackc(q); if(c >= MAXIND) { error("index too big\n"); } release(q); n = getstk() & 0377; sptr = stable[n]; if(sptr == 0) { sptr = stable[n] = sfree; sfree = sfree->next; if(sfree == 0) goto sempty; sptr->next = 0; p = salloc((c+PTRSZ)*PTRSZ); zero(p); } else { p = sptr->val; if(length(p)-PTRSZ < c*PTRSZ) { q = copy(p,(c+PTRSZ)*PTRSZ); release(p); p = q; } } seekc(p,c*PTRSZ); q = lookwd(p); if(q!=0) release(q); s = pop(); EMPTY; salterwd(p, s); sptr->val = p; continue; case ';': p = pop(); EMPTY; q = scalint(p); fsfile(q); c = 0; if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) { error("neg index\n"); } if(length(q)>2) { error("index too big\n"); } if(sfbeg(q) == 0) c = c*100+sbackc(q); if(c >= MAXIND) { error("index too big\n"); } release(q); n = getstk() & 0377; sptr = stable[n]; if(sptr != 0){ p = sptr->val; if(length(p)-PTRSZ >= c*PTRSZ) { seekc(p,c*PTRSZ); s = dcgetwd(p); if(s != 0) { q = copy(s,length(s)); pushp(q); continue; } } } q = salloc(1); /*so uninitialized array elt prints as 0*/ sputc(q, 0); pushp(q); continue; case 'x': execute: p = pop(); EMPTY; if((readptr != &readstk[0]) && (*readptr != 0)) { if((*readptr)->rd == (*readptr)->wt) release(*readptr); else { if(readptr++ == &readstk[RDSKSZ]) { error("nesting depth\n"); } } } else readptr++; *readptr = p; if(p != 0) rewind(p); else { if((c = readc()) != '\n') unreadc(c); } continue; case '?': if(++readptr == &readstk[RDSKSZ]) { error("nesting depth\n"); } *readptr = 0; fsave = curfile; curfile = &bin; while((c = readc()) == '!') command(); p = salloc(0); sputc(p,c); while((c = readc()) != '\n') { sputc(p,c); if(c == '\\') sputc(p,readc()); } curfile = fsave; *readptr = p; continue; case '!': if(command() == 1) goto execute; continue; case '<': case '>': case '=': if(cond(c) == 1) goto execute; continue; default: Bprint(&bout,"%o is unimplemented\n",c); } } } Blk* div(Blk *ddivd, Blk *ddivr) { int divsign, remsign, offset, divcarry, carry, dig, magic, d, dd, under, first; long c, td, cc; Blk *ps, *px, *p, *divd, *divr; dig = 0; under = 0; divcarry = 0; rem = 0; p = salloc(0); if(length(ddivr) == 0) { pushp(ddivr); Bprint(&bout,"divide by 0\n"); return(p); } divsign = remsign = first = 0; divr = ddivr; fsfile(divr); if(sbackc(divr) == -1) { divr = copy(ddivr,length(ddivr)); chsign(divr); divsign = ~divsign; } divd = copy(ddivd,length(ddivd)); fsfile(divd); if(sfbeg(divd) == 0 && sbackc(divd) == -1) { chsign(divd); divsign = ~divsign; remsign = ~remsign; } offset = length(divd) - length(divr); if(offset < 0) goto ddone; seekc(p,offset+1); sputc(divd,0); magic = 0; fsfile(divr); c = sbackc(divr); if(c < 10) magic++; c = c * 100 + (sfbeg(divr)?0:sbackc(divr)); if(magic>0){ c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2; c /= 25; } while(offset >= 0) { first++; fsfile(divd); td = sbackc(divd) * 100; dd = sfbeg(divd)?0:sbackc(divd); td = (td + dd) * 100; dd = sfbeg(divd)?0:sbackc(divd); td = td + dd; cc = c; if(offset == 0) td++; else cc++; if(magic != 0) td = td<<3; dig = td/cc; under=0; if(td%cc < 8 && dig > 0 && magic) { dig--; under=1; } rewind(divr); rewind(divxyz); carry = 0; while(sfeof(divr) == 0) { d = sgetc(divr)*dig+carry; carry = d / 100; salterc(divxyz,d%100); } salterc(divxyz,carry); rewind(divxyz); seekc(divd,offset); carry = 0; while(sfeof(divd) == 0) { d = slookc(divd); d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry; carry = 0; if(d < 0) { d += 100; carry = 1; } salterc(divd,d); } divcarry = carry; backc(p); salterc(p,dig); backc(p); fsfile(divd); d=sbackc(divd); if((d != 0) && /*!divcarry*/ (offset != 0)) { d = sbackc(divd) + 100; salterc(divd,d); } if(--offset >= 0) divd->wt--; } if(under) { /* undershot last - adjust*/ px = copy(divr,length(divr)); /*11/88 don't corrupt ddivr*/ chsign(px); ps = add(px,divd); fsfile(ps); if(length(ps) > 0 && sbackc(ps) < 0) { release(ps); /*only adjust in really undershot*/ } else { release(divd); salterc(p, dig+1); divd=ps; } } if(divcarry != 0) { salterc(p,dig-1); salterc(divd,-1); ps = add(divr,divd); release(divd); divd = ps; } rewind(p); divcarry = 0; while(sfeof(p) == 0){ d = slookc(p)+divcarry; divcarry = 0; if(d >= 100){ d -= 100; divcarry = 1; } salterc(p,d); } if(divcarry != 0)salterc(p,divcarry); fsfile(p); while(sfbeg(p) == 0) { if(sbackc(p) != 0) break; truncate(p); } if(divsign < 0) chsign(p); fsfile(divd); while(sfbeg(divd) == 0) { if(sbackc(divd) != 0) break; truncate(divd); } ddone: if(remsign<0) chsign(divd); if(divr != ddivr) release(divr); rem = divd; return(p); } int dscale(void) { Blk *dd, *dr, *r; int c; dr = pop(); EMPTYS; dd = pop(); EMPTYSR(dr); fsfile(dd); skd = sunputc(dd); fsfile(dr); skr = sunputc(dr); if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)) { sputc(dr,skr); pushp(dr); Bprint(&bout,"divide by 0\n"); return(1); } if(sfbeg(dd) == 1 || (sfbeg(dd) == 0 && sbackc(dd) == 0)) { sputc(dd,skd); pushp(dd); return(1); } c = k-skd+skr; if(c < 0) r = removr(dd,-c); else { r = add0(dd,c); irem = 0; } arg1 = r; arg2 = dr; savk = k; return(0); } Blk* removr(Blk *p, int n) { int nn, neg; Blk *q, *s, *r; fsfile(p); neg = sbackc(p); if(neg < 0) chsign(p); rewind(p); nn = (n+1)/2; q = salloc(nn); while(n>1) { sputc(q,sgetc(p)); n -= 2; } r = salloc(2); while(sfeof(p) == 0) sputc(r,sgetc(p)); release(p); if(n == 1){ s = div(r,tenptr); release(r); rewind(rem); if(sfeof(rem) == 0) sputc(q,sgetc(rem)); release(rem); if(neg < 0){ chsign(s); chsign(q); irem = q; return(s); } irem = q; return(s); } if(neg < 0) { chsign(r); chsign(q); irem = q; return(r); } irem = q; return(r); } Blk* dcsqrt(Blk *p) { Blk *t, *r, *q, *s; int c, n, nn; n = length(p); fsfile(p); c = sbackc(p); if((n&1) != 1) c = c*100+(sfbeg(p)?0:sbackc(p)); n = (n+1)>>1; r = salloc(n); zero(r); seekc(r,n); nn=1; while((c -= nn)>=0) nn+=2; c=(nn+1)>>1; fsfile(r); backc(r); if(c>=100) { c -= 100; salterc(r,c); sputc(r,1); } else salterc(r,c); for(;;){ q = div(p,r); s = add(q,r); release(q); release(rem); q = div(s,sqtemp); release(s); release(rem); s = copy(r,length(r)); chsign(s); t = add(s,q); release(s); fsfile(t); nn = sfbeg(t)?0:sbackc(t); if(nn>=0) break; release(r); release(t); r = q; } release(t); release(q); release(p); return(r); } Blk* dcexp(Blk *base, Blk *ex) { Blk *r, *e, *p, *e1, *t, *cp; int temp, c, n; r = salloc(1); sputc(r,1); p = copy(base,length(base)); e = copy(ex,length(ex)); fsfile(e); if(sfbeg(e) != 0) goto edone; temp=0; c = sbackc(e); if(c<0) { temp++; chsign(e); } while(length(e) != 0) { e1=div(e,sqtemp); release(e); e = e1; n = length(rem); release(rem); if(n != 0) { e1=mult(p,r); release(r); r = e1; } t = copy(p,length(p)); cp = mult(p,t); release(p); release(t); p = cp; } if(temp != 0) { if((c = length(base)) == 0) { goto edone; } if(c>1) create(r); else { rewind(base); if((c = sgetc(base))<=1) { create(r); sputc(r,c); } else create(r); } } edone: release(p); release(e); return(r); } void init(int argc, char *argv[]) { Sym *sp; Dir *d; ARGBEGIN { default: dbg = 1; break; } ARGEND ifile = 1; curfile = &bin; if(*argv){ d = dirstat(*argv); if(d == nil) { fprint(2, "dc: can't open file %s\n", *argv); exits("open"); } if(d->mode & DMDIR) { fprint(2, "dc: file %s is a directory\n", *argv); exits("open"); } free(d); if((curfile = Bopen(*argv, OREAD)) == 0) { fprint(2,"dc: can't open file %s\n", *argv); exits("open"); } } /* dummy = malloc(0); *//* prepare for garbage-collection */ scalptr = salloc(1); sputc(scalptr,0); basptr = salloc(1); sputc(basptr,10); obase=10; logten=log2(10L); ll=70; fw=1; fw1=0; tenptr = salloc(1); sputc(tenptr,10); obase=10; inbas = salloc(1); sputc(inbas,10); sqtemp = salloc(1); sputc(sqtemp,2); chptr = salloc(0); strptr = salloc(0); divxyz = salloc(0); stkbeg = stkptr = &stack[0]; stkend = &stack[STKSZ]; stkerr = 0; readptr = &readstk[0]; k=0; sp = sptr = &symlst[0]; while(sptr < &symlst[TBLSZ-1]) { sptr->next = ++sp; sptr++; } sptr->next=0; sfree = &symlst[0]; } void pushp(Blk *p) { if(stkptr == stkend) { Bprint(&bout,"out of stack space\n"); return; } stkerr=0; *++stkptr = p; return; } Blk* pop(void) { if(stkptr == stack) { stkerr=1; return(0); } return(*stkptr--); } Blk* readin(void) { Blk *p, *q; int dp, dpct, c; dp = dpct=0; p = salloc(0); for(;;){ c = readc(); switch(c) { case '.': if(dp != 0) goto gotnum; dp++; continue; case '\\': readc(); continue; default: if(c >= 'A' && c <= 'F') c = c - 'A' + 10; else if(c >= '0' && c <= '9') c -= '0'; else goto gotnum; if(dp != 0) { if(dpct >= 99) continue; dpct++; } create(chptr); if(c != 0) sputc(chptr,c); q = mult(p,inbas); release(p); p = add(chptr,q); release(q); } } gotnum: unreadc(c); if(dp == 0) { sputc(p,0); return(p); } else { q = scale(p,dpct); return(q); } } /* * returns pointer to struct with ct 0's & p */ Blk* add0(Blk *p, int ct) { Blk *q, *t; q = salloc(length(p)+(ct+1)/2); while(ct>1) { sputc(q,0); ct -= 2; } rewind(p); while(sfeof(p) == 0) { sputc(q,sgetc(p)); } release(p); if(ct == 1) { t = mult(tenptr,q); release(q); return(t); } return(q); } Blk* mult(Blk *p, Blk *q) { Blk *mp, *mq, *mr; int sign, offset, carry; int cq, cp, mt, mcr; offset = sign = 0; fsfile(p); mp = p; if(sfbeg(p) == 0) { if(sbackc(p)<0) { mp = copy(p,length(p)); chsign(mp); sign = ~sign; } } fsfile(q); mq = q; if(sfbeg(q) == 0){ if(sbackc(q)<0) { mq = copy(q,length(q)); chsign(mq); sign = ~sign; } } mr = salloc(length(mp)+length(mq)); zero(mr); rewind(mq); while(sfeof(mq) == 0) { cq = sgetc(mq); rewind(mp); rewind(mr); mr->rd += offset; carry=0; while(sfeof(mp) == 0) { cp = sgetc(mp); mcr = sfeof(mr)?0:slookc(mr); mt = cp*cq + carry + mcr; carry = mt/100; salterc(mr,mt%100); } offset++; if(carry != 0) { mcr = sfeof(mr)?0:slookc(mr); salterc(mr,mcr+carry); } } if(sign < 0) { chsign(mr); } if(mp != p) release(mp); if(mq != q) release(mq); return(mr); } void chsign(Blk *p) { int carry; char ct; carry=0; rewind(p); while(sfeof(p) == 0) { ct=100-slookc(p)-carry; carry=1; if(ct>=100) { ct -= 100; carry=0; } salterc(p,ct); } if(carry != 0) { sputc(p,-1); fsfile(p); backc(p); ct = sbackc(p); if(ct == 99 /*&& !sfbeg(p)*/) { truncate(p); sputc(p,-1); } } else{ fsfile(p); ct = sbackc(p); if(ct == 0) truncate(p); } return; } int readc(void) { loop: if((readptr != &readstk[0]) && (*readptr != 0)) { if(sfeof(*readptr) == 0) return(lastchar = sgetc(*readptr)); release(*readptr); readptr--; goto loop; } lastchar = Bgetc(curfile); if(lastchar != -1) return(lastchar); if(readptr != &readptr[0]) { readptr--; if(*readptr == 0) curfile = &bin; goto loop; } if(curfile != &bin) { Bterm(curfile); curfile = &bin; goto loop; } exits(0); return 0; /* shut up ken */ } void unreadc(char c) { if((readptr != &readstk[0]) && (*readptr != 0)) { sungetc(*readptr,c); } else Bungetc(curfile); return; } void binop(char c) { Blk *r; r = 0; switch(c) { case '+': r = add(arg1,arg2); break; case '*': r = mult(arg1,arg2); break; case '/': r = div(arg1,arg2); break; } release(arg1); release(arg2); sputc(r,savk); pushp(r); } void dcprint(Blk *hptr) { Blk *p, *q, *dec; int dig, dout, ct, sc; rewind(hptr); while(sfeof(hptr) == 0) { if(sgetc(hptr)>99) { rewind(hptr); while(sfeof(hptr) == 0) { Bprint(&bout,"%c",sgetc(hptr)); } Bprint(&bout,"\n"); return; } } fsfile(hptr); sc = sbackc(hptr); if(sfbeg(hptr) != 0) { Bprint(&bout,"0\n"); return; } count = ll; p = copy(hptr,length(hptr)); sclobber(p); fsfile(p); if(sbackc(p)<0) { chsign(p); OUTC('-'); } if((obase == 0) || (obase == -1)) { oneot(p,sc,'d'); return; } if(obase == 1) { oneot(p,sc,'1'); return; } if(obase == 10) { tenot(p,sc); return; } /* sleazy hack to scale top of stack - divide by 1 */ pushp(p); sputc(p, sc); p=salloc(0); create(p); sputc(p, 1); sputc(p, 0); pushp(p); if(dscale() != 0) return; p = div(arg1, arg2); release(arg1); release(arg2); sc = savk; create(strptr); dig = logten*sc; dout = ((dig/10) + dig) / logo; dec = getdec(p,sc); p = removc(p,sc); while(length(p) != 0) { q = div(p,basptr); release(p); p = q; (*outdit)(rem,0); } release(p); fsfile(strptr); while(sfbeg(strptr) == 0) OUTC(sbackc(strptr)); if(sc == 0) { release(dec); Bprint(&bout,"\n"); return; } create(strptr); OUTC('.'); ct=0; do { q = mult(basptr,dec); release(dec); dec = getdec(q,sc); p = removc(q,sc); (*outdit)(p,1); } while(++ct < dout); release(dec); rewind(strptr); while(sfeof(strptr) == 0) OUTC(sgetc(strptr)); Bprint(&bout,"\n"); } Blk* getdec(Blk *p, int sc) { int cc; Blk *q, *t, *s; rewind(p); if(length(p)*2 < sc) { q = copy(p,length(p)); return(q); } q = salloc(length(p)); while(sc >= 1) { sputc(q,sgetc(p)); sc -= 2; } if(sc != 0) { t = mult(q,tenptr); s = salloc(cc = length(q)); release(q); rewind(t); while(cc-- > 0) sputc(s,sgetc(t)); sputc(s,0); release(t); t = div(s,tenptr); release(s); release(rem); return(t); } return(q); } void tenot(Blk *p, int sc) { int c, f; fsfile(p); f=0; while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)) { c = sbackc(p); if((c<10) && (f == 1)) Bprint(&bout,"0%d",c); else Bprint(&bout,"%d",c); f=1; TEST2; } if(sc == 0) { Bprint(&bout,"\n"); release(p); return; } if((p->rd-p->beg)*2 > sc) { c = sbackc(p); Bprint(&bout,"%d.",c/10); TEST2; OUTC(c%10 +'0'); sc--; } else { OUTC('.'); } while(sc>(p->rd-p->beg)*2) { OUTC('0'); sc--; } while(sc > 1) { c = sbackc(p); if(c<10) Bprint(&bout,"0%d",c); else Bprint(&bout,"%d",c); sc -= 2; TEST2; } if(sc == 1) { OUTC(sbackc(p)/10 +'0'); } Bprint(&bout,"\n"); release(p); } void oneot(Blk *p, int sc, char ch) { Blk *q; q = removc(p,sc); create(strptr); sputc(strptr,-1); while(length(q)>0) { p = add(strptr,q); release(q); q = p; OUTC(ch); } release(q); Bprint(&bout,"\n"); } void hexot(Blk *p, int flg) { int c; USED(flg); rewind(p); if(sfeof(p) != 0) { sputc(strptr,'0'); release(p); return; } c = sgetc(p); release(p); if(c >= 16) { Bprint(&bout,"hex digit > 16"); return; } sputc(strptr,c<10?c+'0':c-10+'a'); } void bigot(Blk *p, int flg) { Blk *t, *q; int neg, l; if(flg == 1) { t = salloc(0); l = 0; } else { t = strptr; l = length(strptr)+fw-1; } neg=0; if(length(p) != 0) { fsfile(p); if(sbackc(p)<0) { neg=1; chsign(p); } while(length(p) != 0) { q = div(p,tenptr); release(p); p = q; rewind(rem); sputc(t,sfeof(rem)?'0':sgetc(rem)+'0'); release(rem); } } release(p); if(flg == 1) { l = fw1-length(t); if(neg != 0) { l--; sputc(strptr,'-'); } fsfile(t); while(l-- > 0) sputc(strptr,'0'); while(sfbeg(t) == 0) sputc(strptr,sbackc(t)); release(t); } else { l -= length(strptr); while(l-- > 0) sputc(strptr,'0'); if(neg != 0) { sclobber(strptr); sputc(strptr,'-'); } } sputc(strptr,' '); } Blk* add(Blk *a1, Blk *a2) { Blk *p; int carry, n, size, c, n1, n2; size = length(a1)>length(a2)?length(a1):length(a2); p = salloc(size); rewind(a1); rewind(a2); carry=0; while(--size >= 0) { n1 = sfeof(a1)?0:sgetc(a1); n2 = sfeof(a2)?0:sgetc(a2); n = n1 + n2 + carry; if(n>=100) { carry=1; n -= 100; } else if(n<0) { carry = -1; n += 100; } else carry = 0; sputc(p,n); } if(carry != 0) sputc(p,carry); fsfile(p); if(sfbeg(p) == 0) { c = 0; while(sfbeg(p) == 0 && (c = sbackc(p)) == 0) ; if(c != 0) salterc(p,c); truncate(p); } fsfile(p); if(sfbeg(p) == 0 && sbackc(p) == -1) { while((c = sbackc(p)) == 99) { if(c == -1) break; } skipc(p); salterc(p,-1); truncate(p); } return(p); } int eqk(void) { Blk *p, *q; int skp, skq; p = pop(); EMPTYS; q = pop(); EMPTYSR(p); skp = sunputc(p); skq = sunputc(q); if(skp == skq) { arg1=p; arg2=q; savk = skp; return(0); } if(skp < skq) { savk = skq; p = add0(p,skq-skp); } else { savk = skp; q = add0(q,skp-skq); } arg1=p; arg2=q; return(0); } Blk* removc(Blk *p, int n) { Blk *q, *r; rewind(p); while(n>1) { skipc(p); n -= 2; } q = salloc(2); while(sfeof(p) == 0) sputc(q,sgetc(p)); if(n == 1) { r = div(q,tenptr); release(q); release(rem); q = r; } release(p); return(q); } Blk* scalint(Blk *p) { int n; n = sunputc(p); p = removc(p,n); return(p); } Blk* scale(Blk *p, int n) { Blk *q, *s, *t; t = add0(p,n); q = salloc(1); sputc(q,n); s = dcexp(inbas,q); release(q); q = div(t,s); release(t); release(s); release(rem); sputc(q,n); return(q); } int subt(void) { arg1=pop(); EMPTYS; savk = sunputc(arg1); chsign(arg1); sputc(arg1,savk); pushp(arg1); if(eqk() != 0) return(1); binop('+'); return(0); } int command(void) { char line[100], *sl; int pid, p, c; switch(c = readc()) { case '<': return(cond(NL)); case '>': return(cond(NG)); case '=': return(cond(NE)); default: sl = line; *sl++ = c; while((c = readc()) != '\n') *sl++ = c; *sl = 0; if((pid = fork()) == 0) { execl("/bin/rc","rc","-c",line,0); exits("shell"); } for(;;) { if((p = waitpid()) < 0) break; if(p== pid) break; } Bprint(&bout,"!\n"); return(0); } } int cond(char c) { Blk *p; int cc; if(subt() != 0) return(1); p = pop(); sclobber(p); if(length(p) == 0) { release(p); if(c == '<' || c == '>' || c == NE) { getstk(); return(0); } load(); return(1); } if(c == '='){ release(p); getstk(); return(0); } if(c == NE) { release(p); load(); return(1); } fsfile(p); cc = sbackc(p); release(p); if((cc<0 && (c == '<' || c == NG)) || (cc >0) && (c == '>' || c == NL)) { getstk(); return(0); } load(); return(1); } void load(void) { int c; Blk *p, *q, *t, *s; c = getstk() & 0377; sptr = stable[c]; if(sptr != 0) { p = sptr->val; if(c >= ARRAYST) { q = salloc(length(p)); rewind(p); while(sfeof(p) == 0) { s = dcgetwd(p); if(s == 0) { putwd(q, (Blk*)0); } else { t = copy(s,length(s)); putwd(q,t); } } pushp(q); } else { q = copy(p,length(p)); pushp(q); } } else { q = salloc(1); if(c <= LASTFUN) { Bprint(&bout,"function %c undefined\n",c+'a'-1); sputc(q,'c'); sputc(q,'0'); sputc(q,' '); sputc(q,'1'); sputc(q,'Q'); } else sputc(q,0); pushp(q); } } int log2(long n) { int i; if(n == 0) return(0); i=31; if(n<0) return(i); while((n= n<<1) >0) i--; return i-1; } Blk* salloc(int size) { Blk *hdr; char *ptr; all++; lall++; if(all - rel > active) active = all - rel; nbytes += size; lbytes += size; if(nbytes >maxsize) maxsize = nbytes; if(size > longest) longest = size; ptr = malloc((unsigned)size); if(ptr == 0){ garbage("salloc"); if((ptr = malloc((unsigned)size)) == 0) ospace("salloc"); } if((hdr = hfree) == 0) hdr = morehd(); hfree = (Blk *)hdr->rd; hdr->rd = hdr->wt = hdr->beg = ptr; hdr->last = ptr+size; return(hdr); } Blk* morehd(void) { Blk *h, *kk; headmor++; nbytes += HEADSZ; hfree = h = (Blk *)malloc(HEADSZ); if(hfree == 0) { garbage("morehd"); if((hfree = h = (Blk*)malloc(HEADSZ)) == 0) ospace("headers"); } kk = h; while(hrd = (char*)++kk; (h-1)->rd=0; return(hfree); } Blk* copy(Blk *hptr, int size) { Blk *hdr; unsigned sz; char *ptr; all++; lall++; lcopy++; nbytes += size; lbytes += size; if(size > longest) longest = size; if(size > maxsize) maxsize = size; sz = length(hptr); ptr = malloc(size); if(ptr == 0) { Bprint(&bout,"copy size %d\n",size); ospace("copy"); } memmove(ptr, hptr->beg, sz); memset(ptr+sz, 0, size-sz); if((hdr = hfree) == 0) hdr = morehd(); hfree = (Blk *)hdr->rd; hdr->rd = hdr->beg = ptr; hdr->last = ptr+size; hdr->wt = ptr+sz; ptr = hdr->wt; while(ptrlast) *ptr++ = '\0'; return(hdr); } void sdump(char *s1, Blk *hptr) { char *p; Bprint(&bout,"%s %lx rd %lx wt %lx beg %lx last %lx\n", s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last); p = hptr->beg; while(p < hptr->wt) Bprint(&bout,"%d ",*p++); Bprint(&bout,"\n"); } void seekc(Blk *hptr, int n) { char *nn,*p; nn = hptr->beg+n; if(nn > hptr->last) { nbytes += nn - hptr->last; if(nbytes > maxsize) maxsize = nbytes; lbytes += nn - hptr->last; if(n > longest) longest = n; /* free(hptr->beg); */ p = realloc(hptr->beg, n); if(p == 0) { /* hptr->beg = realloc(hptr->beg, hptr->last-hptr->beg); ** garbage("seekc"); ** if((p = realloc(hptr->beg, n)) == 0) */ ospace("seekc"); } hptr->beg = p; hptr->wt = hptr->last = hptr->rd = p+n; return; } hptr->rd = nn; if(nn>hptr->wt) hptr->wt = nn; } void salterwd(Blk *ahptr, Blk *n) { Wblk *hptr; hptr = (Wblk*)ahptr; if(hptr->rdw == hptr->lastw) more(ahptr); *hptr->rdw++ = n; if(hptr->rdw > hptr->wtw) hptr->wtw = hptr->rdw; } void more(Blk *hptr) { unsigned size; char *p; if((size=(hptr->last-hptr->beg)*2) == 0) size=2; nbytes += size/2; if(nbytes > maxsize) maxsize = nbytes; if(size > longest) longest = size; lbytes += size/2; lmore++; /* free(hptr->beg);*/ p = realloc(hptr->beg, size); if(p == 0) { /* hptr->beg = realloc(hptr->beg, (hptr->last-hptr->beg)); ** garbage("more"); ** if((p = realloc(hptr->beg,size)) == 0) */ ospace("more"); } hptr->rd = p + (hptr->rd - hptr->beg); hptr->wt = p + (hptr->wt - hptr->beg); hptr->beg = p; hptr->last = p+size; } void ospace(char *s) { Bprint(&bout,"out of space: %s\n",s); Bprint(&bout,"all %ld rel %ld headmor %ld\n",all,rel,headmor); Bprint(&bout,"nbytes %ld\n",nbytes); sdump("stk",*stkptr); abort(); } void garbage(char *s) { USED(s); } void release(Blk *p) { rel++; lrel++; nbytes -= p->last - p->beg; p->rd = (char*)hfree; hfree = p; free(p->beg); } Blk* dcgetwd(Blk *p) { Wblk *wp; wp = (Wblk*)p; if(wp->rdw == wp->wtw) return(0); return(*wp->rdw++); } void putwd(Blk *p, Blk *c) { Wblk *wp; wp = (Wblk*)p; if(wp->wtw == wp->lastw) more(p); *wp->wtw++ = c; } Blk* lookwd(Blk *p) { Wblk *wp; wp = (Wblk*)p; if(wp->rdw == wp->wtw) return(0); return(*wp->rdw); } int getstk(void) { int n; uchar c; c = readc(); if(c != '<') return c; n = 0; while(1) { c = readc(); if(c == '>') break; n = n*10+c-'0'; } return n; } 9base-6/read/0000755000175000017500000000000011402154555012461 5ustar anselmanselm9base-6/read/read.10000644000175000017500000000316411402154555013462 0ustar anselmanselm.TH CAT 1 .SH NAME cat, read, nobs \- catenate files .SH SYNOPSIS .B cat [ .I file ... ] .br .B read [ .B -m ] [ .B -n .I nline ] [ .I file ... ] .br .B nobs [ .I file ... ] .SH DESCRIPTION .I Cat reads each .I file in sequence and writes it on the standard output. Thus .IP .L cat file .LP prints a file and .IP .L cat file1 file2 >file3 .LP concatenates the first two files and places the result on the third. .PP If no .I file is given, .I cat reads from the standard input. Output is buffered in blocks matching the input. .PP .I Read copies to standard output exactly one line from the named .IR file , default standard input. It is useful in interactive .IR rc (1) scripts. .PP The .B -m flag causes it to continue reading and writing multiple lines until end of file; .B -n causes it to read no more than .I nline lines. .PP .I Read always executes a single .B write for each line of input, which can be helpful when preparing input to programs that expect line-at-a-time data. It never reads any more data from the input than it prints to the output. .PP .I Nobs copies the named files to standard output except that it removes all backspace characters and the characters that precede them. It is useful to use as .B $PAGER with the Unix version of .IR man (1) when run inside a .I win (see .IR acme (1)) window. .SH SOURCE .B \*9/src/cmd/cat.c .br .B \*9/src/cmd/read.c .br .B \*9/bin/nobs .SH SEE ALSO .IR cp (1) .SH DIAGNOSTICS .I Read exits with status .B eof on end of file or, in the .B -n case, if it doesn't read .I nlines lines. .SH BUGS Beware of .L "cat a b >a" and .LR "cat a b >b" , which destroy input files before reading them. 9base-6/read/Makefile0000644000175000017500000000017411402154555014123 0ustar anselmanselm# read - read unix port from plan9 # Depends on ../lib9 TARG = read include ../std.mk pre-uninstall: post-install: 9base-6/read/read.c0000644000175000017500000000237611402154555013550 0ustar anselmanselm#include #include int multi; int nlines; char *status = nil; int line(int fd, char *file) { char c; int m, n, nalloc; char *buf; nalloc = 0; buf = nil; for(m=0; ; ){ n = read(fd, &c, 1); if(n < 0){ fprint(2, "read: error reading %s: %r\n", file); exits("read error"); } if(n == 0){ if(m == 0) status = "eof"; break; } if(m == nalloc){ nalloc += 1024; buf = realloc(buf, nalloc); if(buf == nil){ fprint(2, "read: malloc error: %r\n"); exits("malloc"); } } buf[m++] = c; if(c == '\n') break; } if(m > 0) write(1, buf, m); free(buf); return m; } void lines(int fd, char *file) { do{ if(line(fd, file) == 0) break; }while(multi || --nlines>0); } void main(int argc, char *argv[]) { int i, fd; char *s; ARGBEGIN{ case 'm': multi = 1; break; case 'n': s = ARGF(); if(s){ nlines = atoi(s); break; } /* fall through */ default: fprint(2, "usage: read [-m] [-n nlines] [files...]\n"); exits("usage"); }ARGEND if(argc == 0) lines(0, ""); else for(i=0; i #include char *e; ulong mode = 0777L; void usage(void) { fprint(2, "usage: mkdir [-p] [-m mode] dir...\n"); exits("usage"); } int makedir(char *s) { int f; if(access(s, AEXIST) == 0){ fprint(2, "mkdir: %s already exists\n", s); e = "error"; return -1; } f = create(s, OREAD, DMDIR | mode); if(f < 0){ fprint(2, "mkdir: can't create %s: %r\n", s); e = "error"; return -1; } close(f); return 0; } void mkdirp(char *s) { char *p; for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){ *p = 0; if(access(s, AEXIST) != 0 && makedir(s) < 0) return; *p = '/'; } if(access(s, AEXIST) != 0) makedir(s); } void main(int argc, char *argv[]) { int i, pflag; char *m; pflag = 0; ARGBEGIN{ default: usage(); case 'm': m = ARGF(); if(m == nil) usage(); mode = strtoul(m, &m, 8); if(mode > 0777) usage(); break; case 'p': pflag = 1; break; }ARGEND for(i=0; i #include #include #define MAXBASE 36 void usage(void); void put(int); void putn(int, int); void puttext(char *); void putnum(char *); int btoi(char *); int value(int, int); int isnum(char *); char *str[256]={ "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs ", "ht ", "nl ", "vt ", "np ", "cr ", "so ", "si ", "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb", "can", "em ", "sub", "esc", "fs ", "gs ", "rs ", "us ", "sp ", " ! ", " \" ", " # ", " $ ", " % ", " & ", " ' ", " ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ", " 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ", " @ ", " A ", " B ", " C ", " D ", " E ", " F ", " G ", " H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ", " P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ", " X ", " Y ", " Z ", " [ ", " \\ ", " ] ", " ^ ", " _ ", " ` ", " a ", " b ", " c ", " d ", " e ", " f ", " g ", " h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ", " p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ", " x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "del", "x80", "x81", "x82", "x83", "x84", "x85", "x86", "x87", "x88", "x89", "x8a", "x8b", "x8c", "x8d", "x8e", "x8f", "x90", "x91", "x92", "x93", "x94", "x95", "x96", "x97", "x98", "x99", "x9a", "x9b", "x9c", "x9d", "x9e", "x9f", "xa0", " ¡ ", " ¢ ", " £ ", " ¤ ", " ¥ ", " ¦ ", " § ", " ¨ ", " © ", " ª ", " « ", " ¬ ", " ­ ", " ® ", " ¯ ", " ° ", " ± ", " ² ", " ³ ", " ´ ", " µ ", " ¶ ", " · ", " ¸ ", " ¹ ", " º ", " » ", " ¼ ", " ½ ", " ¾ ", " ¿ ", " À ", " Á ", " Â ", " Ã ", " Ä ", " Å ", " Æ ", " Ç ", " È ", " É ", " Ê ", " Ë ", " Ì ", " Í ", " Î ", " Ï ", " Ð ", " Ñ ", " Ò ", " Ó ", " Ô ", " Õ ", " Ö ", " × ", " Ø ", " Ù ", " Ú ", " Û ", " Ü ", " Ý ", " Þ ", " ß ", " à ", " á ", " â ", " ã ", " ä ", " å ", " æ ", " ç ", " è ", " é ", " ê ", " ë ", " ì ", " í ", " î ", " ï ", " ð ", " ñ ", " ò ", " ó ", " ô ", " õ ", " ö ", " ÷ ", " ø ", " ù ", " ú ", " û ", " ü ", " ý ", " þ ", " ÿ " }; char Ncol[]={ 0,0,7,5,4,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, }; int nchars=128; int base=16; int ncol; int text=1; int strip=0; Biobuf bin; void main(int argc, char **argv) { int i; Binit(&bin, 1, OWRITE); ARGBEGIN{ case '8': nchars=256; break; case 'x': base=16; break; case 'o': base=8; break; case 'd': base=10; break; case 'b': base=strtoul(EARGF(usage()), 0, 0); if(base<2||base>MAXBASE) usage(); break; case 'n': text=0; break; case 't': strip=1; /* fall through */ case 'c': text=2; break; default: usage(); }ARGEND ncol=Ncol[base]; if(argc==0){ for(i=0;i expr prog %type expr0 expr1 expr2 expr3 expr4 %token LCLASS %token LCHAR %token LLPAREN LRPAREN LALT LSTAR LPLUS LQUES %token LBEGIN LEND LDOT LBAD LNEWLINE %% prog: expr newlines { $$.beg = ral(Tend); $$.end = $$.beg; $$ = re2cat(re2star(re2or(re2char(0x00, '\n'-1), re2char('\n'+1, 0xff))), $$); $$ = re2cat($1, $$); $$ = re2cat(re2star(re2char(0x00, 0xff)), $$); topre = $$; } expr: expr0 | expr newlines expr0 { $$ = re2or($1, $3); } expr0: expr1 | LSTAR { literal = 1; } expr1 { $$ = $3; } expr1: expr2 | expr1 LALT expr2 { $$ = re2or($1, $3); } expr2: expr3 | expr2 expr3 { $$ = re2cat($1, $2); } expr3: expr4 | expr3 LSTAR { $$ = re2star($1); } | expr3 LPLUS { $$.beg = ral(Talt); patchnext($1.end, $$.beg); $$.beg->u.alt = $1.beg; $$.end = $$.beg; $$.beg = $1.beg; } | expr3 LQUES { $$.beg = ral(Talt); $$.beg->u.alt = $1.beg; $$.end = $1.end; appendnext($$.end, $$.beg); } expr4: LCHAR { $$.beg = ral(Tclass); $$.beg->u.x.lo = $1; $$.beg->u.x.hi = $1; $$.end = $$.beg; } | LBEGIN { $$.beg = ral(Tbegin); $$.end = $$.beg; } | LEND { $$.beg = ral(Tend); $$.end = $$.beg; } | LDOT { $$ = re2class("^\n"); } | LCLASS { $$ = re2class($1); } | LLPAREN expr1 LRPAREN { $$ = $2; } newlines: LNEWLINE | newlines LNEWLINE %% void yyerror(char *e, ...) { if(filename) fprint(2, "grep: %s:%ld: %s\n", filename, lineno, e); else fprint(2, "grep: %s\n", e); exits("syntax"); } int yylex(void) { char *q, *eq; int c, s; if(peekc) { s = peekc; peekc = 0; return s; } c = getrec(); if(literal) { if(c != 0 && c != '\n') { yylval.val = c; return LCHAR; } literal = 0; } switch(c) { default: yylval.val = c; s = LCHAR; break; case '\\': c = getrec(); yylval.val = c; s = LCHAR; if(c == '\n') s = LNEWLINE; break; case '[': goto getclass; case '(': s = LLPAREN; break; case ')': s = LRPAREN; break; case '|': s = LALT; break; case '*': s = LSTAR; break; case '+': s = LPLUS; break; case '?': s = LQUES; break; case '^': s = LBEGIN; break; case '$': s = LEND; break; case '.': s = LDOT; break; case 0: peekc = -1; case '\n': s = LNEWLINE; break; } return s; getclass: q = u.string; eq = q + nelem(u.string) - 5; c = getrec(); if(c == '^') { q[0] = '^'; q[1] = '\n'; q[2] = '-'; q[3] = '\n'; q += 4; c = getrec(); } for(;;) { if(q >= eq) error("class too long"); if(c == ']' || c == 0) break; if(c == '\\') { *q++ = c; c = getrec(); if(c == 0) break; } *q++ = c; c = getrec(); } *q = 0; if(c == 0) return LBAD; yylval.str = u.string; return LCLASS; } 9base-6/grep/grep.h0000644000175000017500000000426011402154555013613 0ustar anselmanselm#include #include #include #ifndef EXTERN #define EXTERN extern #endif typedef struct Re Re; typedef struct Re2 Re2; typedef struct State State; struct State { int count; int match; Re** re; State* linkleft; State* linkright; State* next[256]; }; struct Re2 { Re* beg; Re* end; }; struct Re { uchar type; ushort gen; union { Re* alt; /* Talt */ Re** cases; /* case */ struct /* class */ { Rune lo; Rune hi; } x; Rune val; /* char */ } u; Re* next; }; enum { Talt = 1, Tbegin, Tcase, Tclass, Tend, Tor, Caselim = 7, Nhunk = 1<<16, Cbegin = 0x10000, Flshcnt = (1<<9)-1, Cflag = 1<<0, Hflag = 1<<1, Iflag = 1<<2, Llflag = 1<<3, LLflag = 1<<4, Nflag = 1<<5, Sflag = 1<<6, Vflag = 1<<7, Bflag = 1<<8 }; EXTERN union { char string[16*1024]; struct { /* * if a line requires multiple reads, we keep shifting * buf down into pre and then do another read into * buf. so you'll get the last 16-32k of the matching line. * if h were smaller than buf you'd get a suffix of the * line with a hole cut out. */ uchar pre[16*1024]; /* to save to previous '\n' */ uchar buf[16*1024]; /* input buffer */ } u; } u; EXTERN char *filename; EXTERN Biobuf bout; EXTERN char flags[256]; EXTERN Re** follow; EXTERN ushort gen; EXTERN char* input; EXTERN long lineno; EXTERN int literal; EXTERN int matched; EXTERN long maxfollow; EXTERN long nfollow; EXTERN int peekc; EXTERN Biobuf* rein; EXTERN State* state0; EXTERN Re2 topre; extern Re* addcase(Re*); extern void appendnext(Re*, Re*); extern void error(char*); extern int fcmp(const void*, const void*); /* (Re**, Re**) */ extern void fol1(Re*, int); extern int getrec(void); extern void increment(State*, int); #define initstate grepinitstate extern State* initstate(Re*); extern void* mal(int); extern void patchnext(Re*, Re*); extern Re* ral(int); extern Re2 re2cat(Re2, Re2); extern Re2 re2class(char*); extern Re2 re2or(Re2, Re2); extern Re2 re2char(int, int); extern Re2 re2star(Re2); extern State* sal(int); extern int search(char*, int); extern void str2top(char*); extern int yyparse(void); extern void reprint(char*, Re*); extern void yyerror(char*, ...); 9base-6/grep/sub.c0000644000175000017500000000760511402154555013450 0ustar anselmanselm#include "grep.h" void* mal(int n) { static char *s; static int m = 0; void *v; n = (n+3) & ~3; if(m < n) { if(n > Nhunk) { v = sbrk(n); memset(v, 0, n); return v; } s = sbrk(Nhunk); m = Nhunk; } v = s; s += n; m -= n; memset(v, 0, n); return v; } State* sal(int n) { State *s; s = mal(sizeof(*s)); /* s->next = mal(256*sizeof(*s->next)); */ s->count = n; s->re = mal(n*sizeof(*state0->re)); return s; } Re* ral(int type) { Re *r; r = mal(sizeof(*r)); r->type = type; maxfollow++; return r; } void error(char *s) { fprint(2, "grep: internal error: %s\n", s); exits(s); } int countor(Re *r) { int n; n = 0; loop: switch(r->type) { case Tor: n += countor(r->u.alt); r = r->next; goto loop; case Tclass: return n + r->u.x.hi - r->u.x.lo + 1; } return n; } Re* oralloc(int t, Re *r, Re *b) { Re *a; if(b == 0) return r; a = ral(t); a->u.alt = r; a->next = b; return a; } void case1(Re *c, Re *r) { int n; loop: switch(r->type) { case Tor: case1(c, r->u.alt); r = r->next; goto loop; case Tclass: /* add to character */ for(n=r->u.x.lo; n<=r->u.x.hi; n++) c->u.cases[n] = oralloc(Tor, r->next, c->u.cases[n]); break; default: /* add everything unknown to next */ c->next = oralloc(Talt, r, c->next); break; } } Re* addcase(Re *r) { int i, n; Re *a; if(r->gen == gen) return r; r->gen = gen; switch(r->type) { default: error("addcase"); case Tor: n = countor(r); if(n >= Caselim) { a = ral(Tcase); a->u.cases = mal(256*sizeof(*a->u.cases)); case1(a, r); for(i=0; i<256; i++) if(a->u.cases[i]) { r = a->u.cases[i]; if(countor(r) < n) a->u.cases[i] = addcase(r); } return a; } return r; case Talt: r->next = addcase(r->next); r->u.alt = addcase(r->u.alt); return r; case Tbegin: case Tend: case Tclass: return r; } } void str2top(char *p) { Re2 oldtop; oldtop = topre; input = p; topre.beg = 0; topre.end = 0; yyparse(); gen++; if(topre.beg == 0) yyerror("syntax"); if(oldtop.beg) topre = re2or(oldtop, topre); } void appendnext(Re *a, Re *b) { Re *n; while(n = a->next) a = n; a->next = b; } void patchnext(Re *a, Re *b) { Re *n; while(a) { n = a->next; a->next = b; a = n; } } int getrec(void) { int c; if(flags['f']) { c = Bgetc(rein); if(c <= 0) return 0; } else c = *input++ & 0xff; if(flags['i'] && c >= 'A' && c <= 'Z') c += 'a'-'A'; if(c == '\n') lineno++; return c; } Re2 re2cat(Re2 a, Re2 b) { Re2 c; c.beg = a.beg; c.end = b.end; patchnext(a.end, b.beg); return c; } Re2 re2star(Re2 a) { Re2 c; c.beg = ral(Talt); c.beg->u.alt = a.beg; patchnext(a.end, c.beg); c.end = c.beg; return c; } Re2 re2or(Re2 a, Re2 b) { Re2 c; c.beg = ral(Tor); c.beg->u.alt = b.beg; c.beg->next = a.beg; c.end = b.end; appendnext(c.end, a.end); return c; } Re2 re2char(int c0, int c1) { Re2 c; c.beg = ral(Tclass); c.beg->u.x.lo = c0 & 0xff; c.beg->u.x.hi = c1 & 0xff; c.end = c.beg; return c; } void reprint1(Re *a) { int i, j; loop: if(a == 0) return; if(a->gen == gen) return; a->gen = gen; print("%p: ", a); switch(a->type) { default: print("type %d\n", a->type); error("print1 type"); case Tcase: print("case ->%p\n", a->next); for(i=0; i<256; i++) if(a->u.cases[i]) { for(j=i+1; j<256; j++) if(a->u.cases[i] != a->u.cases[j]) break; print(" [%.2x-%.2x] ->%p\n", i, j-1, a->u.cases[i]); i = j-1; } for(i=0; i<256; i++) reprint1(a->u.cases[i]); break; case Tbegin: print("^ ->%p\n", a->next); break; case Tend: print("$ ->%p\n", a->next); break; case Tclass: print("[%.2x-%.2x] ->%p\n", a->u.x.lo, a->u.x.hi, a->next); break; case Tor: case Talt: print("| %p ->%p\n", a->u.alt, a->next); reprint1(a->u.alt); break; } a = a->next; goto loop; } void reprint(char *s, Re *r) { print("%s:\n", s); gen++; reprint1(r); print("\n\n"); } 9base-6/grep/Makefile0000644000175000017500000000025411402154555014144 0ustar anselmanselm# grep - grep unix port from plan9 # Depends on ../lib9 TARG = grep OFILES = y.tab.o main.o comp.o sub.o YFILES = grep.y MANFILES = grep.1 include ../yacc.mk 9base-6/grep/main.c0000644000175000017500000001134011402154555013572 0ustar anselmanselm#define EXTERN #include "grep.h" char *validflags = "bchiLlnsv"; void usage(void) { fprint(2, "usage: grep [-%s] [-f file] [-e expr] [file ...]\n", validflags); exits("usage"); } void main(int argc, char *argv[]) { int i, status; ARGBEGIN { default: if(utfrune(validflags, ARGC()) == nil) usage(); flags[ARGC()]++; break; case 'q': /* gnu grep -q means plan 9 grep -s */ flags['s']++; break; case 'E': /* ignore, turns gnu grep into egrep */ break; case 'e': flags['e']++; lineno = 0; str2top(ARGF()); break; case 'f': flags['f']++; filename = ARGF(); rein = Bopen(filename, OREAD); if(rein == 0) { fprint(2, "grep: can't open %s: %r\n", filename); exits("open"); } lineno = 1; str2top(filename); break; } ARGEND if(flags['f'] == 0 && flags['e'] == 0) { if(argc <= 0) usage(); str2top(argv[0]); argc--; argv++; } follow = mal(maxfollow*sizeof(*follow)); state0 = initstate(topre.beg); Binit(&bout, 1, OWRITE); switch(argc) { case 0: status = search(0, 0); break; case 1: status = search(argv[0], 0); break; default: status = 0; for(i=0; i sizeof(u.u.pre)) n = sizeof(u.u.pre); memmove(u.u.buf-n, bol, n); bol = u.u.buf-n; n = read(fid, u.u.buf, sizeof(u.u.buf)); /* if file has no final newline, simulate one to emit matches to last line */ if(n > 0) { empty = 0; nl = u.u.buf[n-1]=='\n'; } else { if(n < 0){ fprint(2, "grep: read error on %s: %r\n", file); return count != 0; } if(!eof && !nl && !empty) { u.u.buf[0] = '\n'; n = 1; eof = 1; } } if(n <= 0) { close(fid); if(flag & Cflag) { if(flag & Hflag) Bprint(&bout, "%s:", file); Bprint(&bout, "%ld\n", count); } if(((flag&Llflag) && count != 0) || ((flag&LLflag) && count == 0)) Bprint(&bout, "%s\n", file); Bflush(&bout); return count != 0; } lp = u.u.buf; elp = lp+n; if(flag & Iflag) goto loopi; /* * normal character loop */ loop: c = *lp; ns = s->next[c]; if(ns == 0) { increment(s, c); goto loop; } /* if(flags['2']) */ /* if(s->match) */ /* print("%d: %.2x**\n", s, c); */ /* else */ /* print("%d: %.2x\n", s, c); */ lp++; s = ns; if(c == '\n') { lineno++; if(!!s->match == !(flag&Vflag)) { count++; if(flag & (Cflag|Sflag|Llflag|LLflag)) goto cont; if(flag & Hflag) Bprint(&bout, "%s:", file); if(flag & Nflag) Bprint(&bout, "%ld: ", lineno); /* suppress extra newline at EOF unless we are labeling matches with file name */ Bwrite(&bout, bol, lp-bol-(eof && !(flag&Hflag))); if(flag & Bflag) Bflush(&bout); } if((lineno & Flshcnt) == 0) Bflush(&bout); cont: bol = lp; } if(lp != elp) goto loop; goto loop0; /* * character loop for -i flag * for speed */ loopi: c = *lp; if(c >= 'A' && c <= 'Z') c += 'a'-'A'; ns = s->next[c]; if(ns == 0) { increment(s, c); goto loopi; } lp++; s = ns; if(c == '\n') { lineno++; if(!!s->match == !(flag&Vflag)) { count++; if(flag & (Cflag|Sflag|Llflag|LLflag)) goto conti; if(flag & Hflag) Bprint(&bout, "%s:", file); if(flag & Nflag) Bprint(&bout, "%ld: ", lineno); /* suppress extra newline at EOF unless we are labeling matches with file name */ Bwrite(&bout, bol, lp-bol-(eof && !(flag&Hflag))); if(flag & Bflag) Bflush(&bout); } if((lineno & Flshcnt) == 0) Bflush(&bout); conti: bol = lp; } if(lp != elp) goto loopi; goto loop0; } State* initstate(Re *r) { State *s; int i; addcase(r); if(flags['1']) reprint("r", r); nfollow = 0; gen++; fol1(r, Cbegin); follow[nfollow++] = r; qsort(follow, nfollow, sizeof(*follow), fcmp); s = sal(nfollow); for(i=0; ire[i] = follow[i]; return s; } 9base-6/grep/grep.10000644000175000017500000000471111402154555013525 0ustar anselmanselm.TH GREP 1 .SH NAME grep, g \- search a file for a pattern .SH SYNOPSIS .B grep [ .I option ... ] .I pattern [ .I file ... ] .PP .B g [ .I option ... ] .I pattern [ .I file ... ] .SH DESCRIPTION .I Grep\^ searches the input .I files\^ (standard input default) for lines that match the .IR pattern , a regular expression as defined in .IR regexp (7) with the addition of a newline character as an alternative (substitute for .BR | ) with lowest precedence. Normally, each line matching the pattern is `selected', and each selected line is copied to the standard output. The options are .TP .B -c Print only a count of matching lines. .PD 0 .TP .B -h Do not print file name tags (headers) with output lines. .TP .B -e The following argument is taken as a .IR pattern . This option makes it easy to specify patterns that might confuse argument parsing, such as .BR -n . .TP .B -i Ignore alphabetic case distinctions. The implementation folds into lower case all letters in the pattern and input before interpretation. Matched lines are printed in their original form. .TP .B -l (ell) Print the names of files with selected lines; don't print the lines. .TP .B -L Print the names of files with no selected lines; the converse of .BR -l . .TP .B -n Mark each printed line with its line number counted in its file. .TP .B -s Produce no output, but return status. .TP .B -v Reverse: print lines that do not match the pattern. .TP .B -f The pattern argument is the name of a file containing regular expressions one per line. .TP .B -b Don't buffer the output: write each output line as soon as it is discovered. .PD .PP Output lines are tagged by file name when there is more than one input file. (To force this tagging, include .B /dev/null as a file name argument.) .PP Care should be taken when using the shell metacharacters .B $*[^|()=\e and newline in .IR pattern ; it is safest to enclose the entire expression in single quotes .BR \&\|' \|.\|.\|.\| ' . An expression starting with '*' will treat the rest of the expression as literal characters. .PP .I G invokes grep with .B -n and forces tagging of output lines by file name. If no files are listed, it searches all files matching .IP .EX *.C *.b *.c *.h *.m *.cc *.java *.cgi *.pl *.py *.tex *.ms .EE .SH SOURCE .B \*9/src/cmd/grep .br .B \*9/bin/g .SH SEE ALSO .IR ed (1), .IR awk (1), .IR sed (1), .IR sam (1), .IR regexp (7) .SH DIAGNOSTICS Exit status is null if any lines are selected, or non-null when no lines are selected or an error occurs. 9base-6/grep/comp.c0000644000175000017500000001010511402154555013602 0ustar anselmanselm#include "grep.h" /* * incremental compiler. * add the branch c to the * state s. */ void increment(State *s, int c) { int i; State *t, **tt; Re *re1, *re2; nfollow = 0; gen++; matched = 0; for(i=0; icount; i++) fol1(s->re[i], c); qsort(follow, nfollow, sizeof(*follow), fcmp); for(tt=&state0; t = *tt;) { if(t->count > nfollow) { tt = &t->linkleft; goto cont; } if(t->count < nfollow) { tt = &t->linkright; goto cont; } for(i=0; ire[i]; re2 = follow[i]; if(re1 > re2) { tt = &t->linkleft; goto cont; } if(re1 < re2) { tt = &t->linkright; goto cont; } } if(!!matched && !t->match) { tt = &t->linkleft; goto cont; } if(!matched && !!t->match) { tt = &t->linkright; goto cont; } s->next[c] = t; return; cont:; } t = sal(nfollow); *tt = t; for(i=0; ire[i] = re1; } s->next[c] = t; t->match = matched; } int fcmp(const void *va, const void *vb) { Re **aa, **bb; Re *a, *b; aa = (Re**)va; bb = (Re**)vb; a = *aa; b = *bb; if(a > b) return 1; if(a < b) return -1; return 0; } void fol1(Re *r, int c) { Re *r1; loop: if(r->gen == gen) return; if(nfollow >= maxfollow) error("nfollow"); r->gen = gen; switch(r->type) { default: error("fol1"); case Tcase: if(c >= 0 && c < 256) if(r1 = r->u.cases[c]) follow[nfollow++] = r1; if(r = r->next) goto loop; break; case Talt: case Tor: fol1(r->u.alt, c); r = r->next; goto loop; case Tbegin: if(c == '\n' || c == Cbegin) follow[nfollow++] = r->next; break; case Tend: if(c == '\n') matched = 1; break; case Tclass: if(c >= r->u.x.lo && c <= r->u.x.hi) follow[nfollow++] = r->next; break; } } Rune tab1[] = { 0x007f, 0x07ff }; Rune tab2[] = { 0x003f, 0x0fff }; Re2 rclass(Rune p0, Rune p1) { char xc0[6], xc1[6]; int i, n, m; Re2 x; if(p0 > p1) return re2char(0xff, 0xff); /* no match */ /* * bust range into same length * character sequences */ for(i=0; i m) return re2or(rclass(p0, m), rclass(m+1, p1)); } /* * bust range into part of a single page * or into full pages */ for(i=0; i p[1]) continue; if(p[0] > q[1] || p[1] < q[0]) { q[2] = p[0]; q[3] = p[1]; q += 2; continue; } if(p[0] < q[0]) q[0] = p[0]; if(p[1] > q[1]) q[1] = p[1]; } q[2] = 0; p = pairs; if(nc) { x = rclass(0, p[0]-1); ov = p[1]+1; for(p+=2; *p; p+=2) { x = re2or(x, rclass(ov, p[0]-1)); ov = p[1]+1; } x = re2or(x, rclass(ov, 0xffff)); } else { x = rclass(p[0], p[1]); for(p+=2; *p; p+=2) x = re2or(x, rclass(p[0], p[1])); } return x; } 9base-6/sam/0000755000175000017500000000000011402154555012326 5ustar anselmanselm9base-6/sam/list.c0000644000175000017500000000263511402154555013453 0ustar anselmanselm#include "sam.h" /* * Check that list has room for one more element. */ static void growlist(List *l, int esize) { uchar *p; if(l->listptr == nil || l->nalloc == 0){ l->nalloc = INCR; l->listptr = emalloc(INCR*esize); l->nused = 0; } else if(l->nused == l->nalloc){ p = erealloc(l->listptr, (l->nalloc+INCR)*esize); l->listptr = p; memset(p+l->nalloc*esize, 0, INCR*esize); l->nalloc += INCR; } } /* * Remove the ith element from the list */ void dellist(List *l, int i) { Posn *pp; void **vpp; l->nused--; switch(l->type){ case 'P': pp = l->posnptr+i; memmove(pp, pp+1, (l->nused-i)*sizeof(*pp)); break; case 'p': vpp = l->voidpptr+i; memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp)); break; } } /* * Add a new element, whose position is i, to the list */ void inslist(List *l, int i, ...) { Posn *pp; void **vpp; va_list list; va_start(list, i); switch(l->type){ case 'P': growlist(l, sizeof(*pp)); pp = l->posnptr+i; memmove(pp+1, pp, (l->nused-i)*sizeof(*pp)); *pp = va_arg(list, Posn); break; case 'p': growlist(l, sizeof(*vpp)); vpp = l->voidpptr+i; memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp)); *vpp = va_arg(list, void*); break; } va_end(list); l->nused++; } void listfree(List *l) { free(l->listptr); free(l); } List* listalloc(int type) { List *l; l = emalloc(sizeof(List)); l->type = type; l->nalloc = 0; l->nused = 0; return l; } 9base-6/sam/errors.h0000644000175000017500000000126511402154555014017 0ustar anselmanselmtypedef enum Err{ /* error_s */ Eopen, Ecreate, Emenu, Emodified, Eio, Ewseq, /* error_c */ Eunk, Emissop, Edelim, /* error */ Efork, Eintr, Eaddress, Esearch, Epattern, Enewline, Eblank, Enopattern, EnestXY, Enolbrace, Enoaddr, Eoverlap, Enosub, Elongrhs, Ebadrhs, Erange, Esequence, Eorder, Enoname, Eleftpar, Erightpar, Ebadclass, Ebadregexp, Eoverflow, Enocmd, Epipe, Enofile, Etoolong, Echanges, Eempty, Efsearch, Emanyfiles, Elongtag, Esubexp, Etmpovfl, Eappend, Ecantplumb, Ebufload }Err; typedef enum Warn{ /* warn_s */ Wdupname, Wfile, Wdate, /* warn_ss */ Wdupfile, /* warn */ Wnulls, Wpwd, Wnotnewline, Wbadstatus }Warn; 9base-6/sam/multi.c0000644000175000017500000000346411402154555013633 0ustar anselmanselm#include "sam.h" List file = { 'p' }; ushort tag; File * newfile(void) { File *f; f = fileopen(); inslist(&file, 0, f); f->tag = tag++; if(downloaded) outTs(Hnewname, f->tag); /* already sorted; file name is "" */ return f; } int whichmenu(File *f) { int i; for(i=0; itag); dellist(&file, w); fileclose(f); } void fullname(String *name) { if(name->n > 0 && name->s[0]!='/' && name->s[0]!=0) Strinsert(name, &curwd, (Posn)0); } void fixname(String *name) { String *t; char *s; fullname(name); s = Strtoc(name); if(strlen(s) > 0) s = cleanname(s); t = tmpcstr(s); Strduplstr(name, t); free(s); freetmpstr(t); if(Strispre(&curwd, name)) Strdelete(name, 0, curwd.n); } void sortname(File *f) { int i, cmp, w; int dupwarned; w = whichmenu(f); dupwarned = FALSE; dellist(&file, w); if(f == cmd) i = 0; else{ for(i=0; iname, &file.filepptr[i]->name); if(cmp==0 && !dupwarned){ dupwarned = TRUE; warn_S(Wdupname, &f->name); }else if(cmp<0 && (i>0 || cmd==0)) break; } } inslist(&file, i, f); if(downloaded) outTsS(Hmovname, f->tag, &f->name); } void state(File *f, int cleandirty) { if(f == cmd) return; f->unread = FALSE; if(downloaded && whichmenu(f)>=0){ /* else flist or menu */ if(f->mod && cleandirty!=Dirty) outTs(Hclean, f->tag); else if(!f->mod && cleandirty==Dirty) outTs(Hdirty, f->tag); } if(cleandirty == Clean) f->mod = FALSE; else f->mod = TRUE; } File * lookfile(String *s) { int i; for(i=0; iname, s) == 0) return file.filepptr[i]; return 0; } 9base-6/sam/buff.c0000644000175000017500000001206211402154555013415 0ustar anselmanselm#include "sam.h" enum { Slop = 100 /* room to grow with reallocation */ }; static void sizecache(Buffer *b, uint n) { if(n <= b->cmax) return; b->cmax = n+Slop; b->c = runerealloc(b->c, b->cmax); } static void addblock(Buffer *b, uint i, uint n) { if(i > b->nbl) panic("internal error: addblock"); b->bl = realloc(b->bl, (b->nbl+1)*sizeof b->bl[0]); if(i < b->nbl) memmove(b->bl+i+1, b->bl+i, (b->nbl-i)*sizeof(Block*)); b->bl[i] = disknewblock(disk, n); b->nbl++; } static void delblock(Buffer *b, uint i) { if(i >= b->nbl) panic("internal error: delblock"); diskrelease(disk, b->bl[i]); b->nbl--; if(i < b->nbl) memmove(b->bl+i, b->bl+i+1, (b->nbl-i)*sizeof(Block*)); b->bl = realloc(b->bl, b->nbl*sizeof b->bl[0]); } /* * Move cache so b->cq <= q0 < b->cq+b->cnc. * If at very end, q0 will fall on end of cache block. */ static void flush(Buffer *b) { if(b->cdirty || b->cnc==0){ if(b->cnc == 0) delblock(b, b->cbi); else diskwrite(disk, &b->bl[b->cbi], b->c, b->cnc); b->cdirty = FALSE; } } static void setcache(Buffer *b, uint q0) { Block **blp, *bl; uint i, q; if(q0 > b->nc) panic("internal error: setcache"); /* * flush and reload if q0 is not in cache. */ if(b->nc == 0 || (b->cq<=q0 && q0cq+b->cnc)) return; /* * if q0 is at end of file and end of cache, continue to grow this block */ if(q0==b->nc && q0==b->cq+b->cnc && b->cnc<=Maxblock) return; flush(b); /* find block */ if(q0 < b->cq){ q = 0; i = 0; }else{ q = b->cq; i = b->cbi; } blp = &b->bl[i]; while(q+(*blp)->u.n <= q0 && q+(*blp)->u.n < b->nc){ q += (*blp)->u.n; i++; blp++; if(i >= b->nbl) panic("block not found"); } bl = *blp; /* remember position */ b->cbi = i; b->cq = q; sizecache(b, bl->u.n); b->cnc = bl->u.n; /*read block*/ diskread(disk, bl, b->c, b->cnc); } void bufinsert(Buffer *b, uint q0, Rune *s, uint n) { uint i, m, t, off; if(q0 > b->nc) panic("internal error: bufinsert"); while(n > 0){ setcache(b, q0); off = q0-b->cq; if(b->cnc+n <= Maxblock){ /* Everything fits in one block. */ t = b->cnc+n; m = n; if(b->bl == nil){ /* allocate */ if(b->cnc != 0) panic("internal error: bufinsert1 cnc!=0"); addblock(b, 0, t); b->cbi = 0; } sizecache(b, t); runemove(b->c+off+m, b->c+off, b->cnc-off); runemove(b->c+off, s, m); b->cnc = t; goto Tail; } /* * We must make a new block. If q0 is at * the very beginning or end of this block, * just make a new block and fill it. */ if(q0==b->cq || q0==b->cq+b->cnc){ if(b->cdirty) flush(b); m = min(n, Maxblock); if(b->bl == nil){ /* allocate */ if(b->cnc != 0) panic("internal error: bufinsert2 cnc!=0"); i = 0; }else{ i = b->cbi; if(q0 > b->cq) i++; } addblock(b, i, m); sizecache(b, m); runemove(b->c, s, m); b->cq = q0; b->cbi = i; b->cnc = m; goto Tail; } /* * Split the block; cut off the right side and * let go of it. */ m = b->cnc-off; if(m > 0){ i = b->cbi+1; addblock(b, i, m); diskwrite(disk, &b->bl[i], b->c+off, m); b->cnc -= m; } /* * Now at end of block. Take as much input * as possible and tack it on end of block. */ m = min(n, Maxblock-b->cnc); sizecache(b, b->cnc+m); runemove(b->c+b->cnc, s, m); b->cnc += m; Tail: b->nc += m; q0 += m; s += m; n -= m; b->cdirty = TRUE; } } void bufdelete(Buffer *b, uint q0, uint q1) { uint m, n, off; if(!(q0<=q1 && q0<=b->nc && q1<=b->nc)) panic("internal error: bufdelete"); while(q1 > q0){ setcache(b, q0); off = q0-b->cq; if(q1 > b->cq+b->cnc) n = b->cnc - off; else n = q1-q0; m = b->cnc - (off+n); if(m > 0) runemove(b->c+off, b->c+off+n, m); b->cnc -= n; b->cdirty = TRUE; q1 -= n; b->nc -= n; } } uint bufload(Buffer *b, uint q0, int fd, int *nulls) { char *p; Rune *r; int l, m, n, nb, nr; uint q1; if(q0 > b->nc) panic("internal error: bufload"); p = malloc((Maxblock+UTFmax+1)*sizeof p[0]); if(p == nil) panic("bufload: malloc failed"); r = runemalloc(Maxblock); m = 0; n = 1; q1 = q0; /* * At top of loop, may have m bytes left over from * last pass, possibly representing a partial rune. */ while(n > 0){ n = read(fd, p+m, Maxblock); if(n < 0){ error(Ebufload); break; } m += n; p[m] = 0; l = m; if(n > 0) l -= UTFmax; cvttorunes(p, l, r, &nb, &nr, nulls); memmove(p, p+nb, m-nb); m -= nb; bufinsert(b, q1, r, nr); q1 += nr; } free(p); free(r); return q1-q0; } void bufread(Buffer *b, uint q0, Rune *s, uint n) { uint m; if(!(q0<=b->nc && q0+n<=b->nc)) panic("bufread: internal error"); while(n > 0){ setcache(b, q0); m = min(n, b->cnc-(q0-b->cq)); runemove(s, b->c+(q0-b->cq), m); q0 += m; s += m; n -= m; } } void bufreset(Buffer *b) { int i; b->nc = 0; b->cnc = 0; b->cq = 0; b->cdirty = 0; b->cbi = 0; /* delete backwards to avoid n² behavior */ for(i=b->nbl-1; --i>=0; ) delblock(b, i); } void bufclose(Buffer *b) { bufreset(b); free(b->c); b->c = nil; b->cnc = 0; free(b->bl); b->bl = nil; b->nbl = 0; } 9base-6/sam/util.c0000644000175000017500000000137611402154555013456 0ustar anselmanselm#include "sam.h" void cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls) { uchar *q; Rune *s; int j, w; /* * Always guaranteed that n bytes may be interpreted * without worrying about partial runes. This may mean * reading up to UTFmax-1 more bytes than n; the caller * knows this. If n is a firm limit, the caller should * set p[n] = 0. */ q = (uchar*)p; s = r; for(j=0; jname.n, f->name.s); else buf[0] = 0; putenv("samfile", buf); } int plan9(File *f, int type, String *s, int nest) { long l; int m; int volatile pid; int fd; int retcode; int pipe1[2], pipe2[2]; if(s->s[0]==0 && plan9cmd.s[0]==0) error(Enocmd); else if(s->s[0]) Strduplstr(&plan9cmd, s); if(downloaded){ samerr(errfile); remove(errfile); } if(type!='!' && pipe(pipe1)==-1) error(Epipe); if(type=='|') snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1); if((pid=fork()) == 0){ setname(f); if(downloaded){ /* also put nasty fd's into errfile */ fd = create(errfile, 1, 0666L); if(fd < 0) fd = create("/dev/null", 1, 0666L); dup(fd, 2); close(fd); /* 2 now points at err file */ if(type == '>') dup(2, 1); else if(type=='!'){ dup(2, 1); fd = open("/dev/null", 0); dup(fd, 0); close(fd); } } if(type != '!') { if(type=='<' || type=='|') dup(pipe1[1], 1); else if(type == '>') dup(pipe1[0], 0); close(pipe1[0]); close(pipe1[1]); } if(type == '|'){ if(pipe(pipe2) == -1) exits("pipe"); if((pid = fork())==0){ /* * It's ok if we get SIGPIPE here */ close(pipe2[0]); io = pipe2[1]; if(retcode=!setjmp(mainloop)){ /* assignment = */ char *c; for(l = 0; lBLOCKSIZE-1) m = BLOCKSIZE-1; bufread(&plan9buf, l, genbuf, m); genbuf[m] = 0; c = Strtoc(tmprstr(genbuf, m+1)); Write(pipe2[1], c, strlen(c)); free(c); } } exits(retcode? "error" : 0); } if(pid==-1){ fprint(2, "Can't fork?!\n"); exits("fork"); } dup(pipe2[0], 0); close(pipe2[0]); close(pipe2[1]); } if(type=='<'){ close(0); /* so it won't read from terminal */ open("/dev/null", 0); } execl(SHPATH, SH, "-c", Strtoc(&plan9cmd), (char *)0); exits("exec"); } if(pid == -1) error(Efork); if(type=='<' || type=='|'){ int nulls; if(downloaded && addr.r.p1 != addr.r.p2) outTl(Hsnarflen, addr.r.p2-addr.r.p1); snarf(f, addr.r.p1, addr.r.p2, &snarfbuf, 0); logdelete(f, addr.r.p1, addr.r.p2); close(pipe1[1]); io = pipe1[0]; f->tdot.p1 = -1; f->ndot.r.p2 = addr.r.p2+readio(f, &nulls, 0, FALSE); f->ndot.r.p1 = addr.r.p2; closeio((Posn)-1); }else if(type=='>'){ close(pipe1[0]); io = pipe1[1]; bpipeok = 1; writeio(f); bpipeok = 0; closeio((Posn)-1); } retcode = waitfor(pid); if(type=='|' || type=='<') if(retcode!=0) warn(Wbadstatus); if(downloaded) checkerrs(); if(!nest) dprint("!\n"); return retcode; } void checkerrs(void) { char buf[BLOCKSIZE-10]; int f, n, nl; char *p; long l; if(statfile(errfile, 0, 0, 0, &l, 0) > 0 && l != 0){ if((f=open(errfile, 0)) != -1){ if((n=read(f, buf, sizeof buf-1)) > 0){ for(nl=0,p=buf; nl<25 && p<&buf[n]; p++) if(*p=='\n') nl++; *p = 0; dprint("%s", buf); if(p-buf < l-1) dprint("(sam: more in %s)\n", errfile); } close(f); } }else remove(errfile); } 9base-6/sam/sam.h0000644000175000017500000002262111402154555013262 0ustar anselmanselm#include #include #include #include "errors.h" #undef waitfor #define waitfor samwaitfor #undef warn #define warn samwarn /* * BLOCKSIZE is relatively small to keep memory consumption down. */ #define BLOCKSIZE 2048 #define RUNESIZE sizeof(Rune) #define NDISC 5 #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+NDISC*(transcript+buf) */ #define NSUBEXP 10 #define TRUE 1 #define FALSE 0 #undef INFINITY /* Darwin declares this as HUGE_VAL */ #define INFINITY 0x7FFFFFFFL #define INCR 25 #define STRSIZE (2*BLOCKSIZE) typedef long Posn; /* file position or address */ typedef ushort Mod; /* modification number */ typedef struct Address Address; typedef struct Block Block; typedef struct Buffer Buffer; typedef struct Disk Disk; typedef struct Discdesc Discdesc; typedef struct File File; typedef struct List List; typedef struct Range Range; typedef struct Rangeset Rangeset; typedef struct String String; enum State { Clean = ' ', Dirty = '\'', Unread = '-' }; struct Range { Posn p1, p2; }; struct Rangeset { Range p[NSUBEXP]; }; struct Address { Range r; File *f; }; struct String { short n; short size; Rune *s; }; struct List /* code depends on a long being able to hold a pointer */ { int type; /* 'p' for pointer, 'P' for Posn */ int nalloc; int nused; union{ void* listp; void** voidp; Posn* posnp; String**stringp; File** filep; }g; }; #define listptr g.listp #define voidpptr g.voidp #define posnptr g.posnp #define stringpptr g.stringp #define filepptr g.filep enum { Blockincr = 256, Maxblock = 8*1024, BUFSIZE = Maxblock, /* size from fbufalloc() */ RBUFSIZE = BUFSIZE/sizeof(Rune) }; enum { Null = '-', Delete = 'd', Insert = 'i', Filename = 'f', Dot = 'D', Mark = 'm' }; struct Block { uint addr; /* disk address in bytes */ union { uint n; /* number of used runes in block */ Block *next; /* pointer to next in free list */ } u; }; struct Disk { int fd; uint addr; /* length of temp file */ Block *free[Maxblock/Blockincr+1]; }; Disk* diskinit(void); Block* disknewblock(Disk*, uint); void diskrelease(Disk*, Block*); void diskread(Disk*, Block*, Rune*, uint); void diskwrite(Disk*, Block**, Rune*, uint); struct Buffer { uint nc; Rune *c; /* cache */ uint cnc; /* bytes in cache */ uint cmax; /* size of allocated cache */ uint cq; /* position of cache */ int cdirty; /* cache needs to be written */ uint cbi; /* index of cache Block */ Block **bl; /* array of blocks */ uint nbl; /* number of blocks */ }; void bufinsert(Buffer*, uint, Rune*, uint); void bufdelete(Buffer*, uint, uint); uint bufload(Buffer*, uint, int, int*); void bufread(Buffer*, uint, Rune*, uint); void bufclose(Buffer*); void bufreset(Buffer*); struct File { Buffer b; /* the data */ Buffer delta; /* transcript of changes */ Buffer epsilon; /* inversion of delta for redo */ String name; /* name of associated file */ uvlong qidpath; /* of file when read */ uint mtime; /* of file when read */ int dev; /* of file when read */ int unread; /* file has not been read from disk */ long seq; /* if seq==0, File acts like Buffer */ long cleanseq; /* f->seq at last read/write of file */ int mod; /* file appears modified in menu */ char rescuing; /* sam exiting; this file unusable */ #if 0 // Text *curtext; /* most recently used associated text */ // Text **text; /* list of associated texts */ // int ntext; // int dumpid; /* used in dumping zeroxed windows */ #endif Posn hiposn; /* highest address touched this Mod */ Address dot; /* current position */ Address ndot; /* new current position after update */ Range tdot; /* what terminal thinks is current range */ Range mark; /* tagged spot in text (don't confuse with Mark) */ List *rasp; /* map of what terminal's got */ short tag; /* for communicating with terminal */ char closeok; /* ok to close file? */ char deleted; /* delete at completion of command */ Range prevdot; /* state before start of change */ Range prevmark; long prevseq; int prevmod; }; /*File* fileaddtext(File*, Text*); */ void fileclose(File*); void filedelete(File*, uint, uint); /*void filedeltext(File*, Text*); */ void fileinsert(File*, uint, Rune*, uint); uint fileload(File*, uint, int, int*); void filemark(File*); void filereset(File*); void filesetname(File*, String*); void fileundelete(File*, Buffer*, uint, uint); void fileuninsert(File*, Buffer*, uint, uint); void fileunsetname(File*, Buffer*); void fileundo(File*, int, int, uint*, uint*, int); int fileupdate(File*, int, int); int filereadc(File*, uint); File *fileopen(void); void loginsert(File*, uint, Rune*, uint); void logdelete(File*, uint, uint); void logsetname(File*, String*); int fileisdirty(File*); long undoseq(File*, int); long prevseq(Buffer*); void raspload(File*); void raspstart(File*); void raspdelete(File*, uint, uint, int); void raspinsert(File*, uint, Rune*, uint, int); void raspdone(File*, int); void raspflush(File*); /* * acme fns */ void* fbufalloc(void); void fbuffree(void*); uint min(uint, uint); void cvttorunes(char*, int, Rune*, int*, int*, int*); #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune)) #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune)) #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune)) int alnum(int); int Read(int, void*, int); void Seek(int, long, int); int plan9(File*, int, String*, int); int Write(int, void*, int); int bexecute(File*, Posn); void cd(String*); void closefiles(File*, String*); void closeio(Posn); void cmdloop(void); void cmdupdate(void); void compile(String*); void copy(File*, Address); File *current(File*); void delete(File*); void delfile(File*); void dellist(List*, int); void doubleclick(File*, Posn); void dprint(char*, ...); void edit(File*, int); void *emalloc(ulong); void *erealloc(void*, ulong); void error(Err); void error_c(Err, int); void error_r(Err, char*); void error_s(Err, char*); int execute(File*, Posn, Posn); int filematch(File*, String*); void filename(File*); void fixname(String*); void fullname(String*); void getcurwd(void); File *getfile(String*); int getname(File*, String*, int); long getnum(int); void hiccough(char*); void inslist(List*, int, ...); Address lineaddr(Posn, Address, int); List *listalloc(int); void listfree(List*); void load(File*); File *lookfile(String*); void lookorigin(File*, Posn, Posn); int lookup(int); void move(File*, Address); void moveto(File*, Range); File *newfile(void); void nextmatch(File*, String*, Posn, int); int newtmp(int); void notifyf(void*, char*); void panic(char*); void printposn(File*, int); void print_ss(char*, String*, String*); void print_s(char*, String*); int rcv(void); Range rdata(List*, Posn, Posn); Posn readio(File*, int*, int, int); void rescue(void); void resetcmd(void); void resetsys(void); void resetxec(void); void rgrow(List*, Posn, Posn); void samerr(char*); void settempfile(void); int skipbl(void); void snarf(File*, Posn, Posn, Buffer*, int); void sortname(File*); void startup(char*, int, char**, char**); void state(File*, int); int statfd(int, ulong*, uvlong*, long*, long*, long*); int statfile(char*, ulong*, uvlong*, long*, long*, long*); void Straddc(String*, int); void Strclose(String*); int Strcmp(String*, String*); void Strdelete(String*, Posn, Posn); void Strdupl(String*, Rune*); void Strduplstr(String*, String*); void Strinit(String*); void Strinit0(String*); void Strinsert(String*, String*, Posn); void Strinsure(String*, ulong); int Strispre(String*, String*); void Strzero(String*); int Strlen(Rune*); char *Strtoc(String*); void syserror(char*); void telldot(File*); void tellpat(void); String *tmpcstr(char*); String *tmprstr(Rune*, int); void freetmpstr(String*); void termcommand(void); void termwrite(char*); File *tofile(String*); void trytoclose(File*); void trytoquit(void); int undo(int); void update(void); int waitfor(int); void warn(Warn); void warn_s(Warn, char*); void warn_SS(Warn, String*, String*); void warn_S(Warn, String*); int whichmenu(File*); void writef(File*); Posn writeio(File*); Discdesc *Dstart(void); extern Rune samname[]; /* compiler dependent */ extern Rune *left[]; extern Rune *right[]; extern char RSAM[]; /* system dependent */ extern char SAMTERM[]; extern char HOME[]; extern char TMPDIR[]; extern char SH[]; extern char SHPATH[]; extern char RX[]; extern char RXPATH[]; /* * acme globals */ extern long seq; extern Disk *disk; extern char *rsamname; /* globals */ extern char *samterm; extern Rune genbuf[]; extern char *genc; extern int io; extern int patset; extern int quitok; extern Address addr; extern Buffer snarfbuf; extern Buffer plan9buf; extern List file; extern List tempfile; extern File *cmd; extern File *curfile; extern File *lastfile; extern Mod modnum; extern Posn cmdpt; extern Posn cmdptadv; extern Rangeset sel; extern String curwd; extern String cmdstr; extern String genstr; extern String lastpat; extern String lastregexp; extern String plan9cmd; extern int downloaded; extern int eof; extern int bpipeok; extern int panicking; extern Rune empty[]; extern int termlocked; extern int outbuffered; #include "mesg.h" void outTs(Hmesg, int); void outT0(Hmesg); void outTl(Hmesg, long); void outTslS(Hmesg, int, long, String*); void outTS(Hmesg, String*); void outTsS(Hmesg, int, String*); void outTsllS(Hmesg, int, long, long, String*); void outTsll(Hmesg, int, long, long); void outTsl(Hmesg, int, long); void outTsv(Hmesg, int, vlong); void outflush(void); int needoutflush(void); 9base-6/sam/plumb.h0000644000175000017500000000047011402154555013617 0ustar anselmanselmtypedef struct Plumbmsg Plumbmsg; struct Plumbmsg { char *src; char *dst; char *wdir; char *type; char *attr; char *data; int ndata; }; char *plumbunpackattr(char*); char *plumbpack(Plumbmsg *, int *); int plumbfree(Plumbmsg *); char *cleanname(char*); 9base-6/sam/sam.10000644000175000017500000004420311402154555013173 0ustar anselmanselm.TH SAM 1 .ds a \fR*\ \fP .SH NAME sam, B, E, sam.save, samterm, samsave \- screen editor with structural regular expressions .SH SYNOPSIS .B sam [ .I option ... ] [ .I files ] .PP .B sam .B -r .I machine .PP .B sam.save .PP .B B .IB file \fR[\fP: line \fR] \&... .PP .B E .I file .SH DESCRIPTION .I Sam is a multi-file editor. It modifies a local copy of an external file. The copy is here called a .IR file . The files are listed in a menu available through mouse button 3 or the .B n command. Each file has an associated name, usually the name of the external file from which it was read, and a `modified' bit that indicates whether the editor's file agrees with the external file. The external file is not read into the editor's file until it first becomes the current file\(emthat to which editing commands apply\(emwhereupon its menu entry is printed. The options are .TF -rmachine .TP .B -a Autoindent. In this mode, when a newline character is typed in the terminal interface, .I samterm copies leading white space on the current line to the new line. .TP .B -d Do not `download' the terminal part of .IR sam . Editing will be done with the command language only, as in .IR ed (1). .TP .BI -r " machine Run the host part remotely on the specified machine, the terminal part locally. .TP .BI -s " path Start the host part from the specified file on the remote host. Only meaningful with the .BI -r option. .TP .BI -t " path Start the terminal part from the specified file. Useful for debugging. .PD .SS Regular expressions Regular expressions are as in .IR regexp (7) with the addition of .BR \en to represent newlines. A regular expression may never contain a literal newline character. The empty regular expression stands for the last complete expression encountered. A regular expression in .I sam matches the longest leftmost substring formally matched by the expression. Searching in the reverse direction is equivalent to searching backwards with the catenation operations reversed in the expression. .SS Addresses An address identifies a substring in a file. In the following, `character .IR n ' means the null string after the .IR n -th character in the file, with 1 the first character in the file. `Line .IR n ' means the .IR n -th match, starting at the beginning of the file, of the regular expression .LR .*\en? . All files always have a current substring, called dot, that is the default address. .SS Simple Addresses .PD 0 .TP .BI # n The empty string after character .IR n ; .B #0 is the beginning of the file. .TP .I n Line .IR n ; .B 0 is the beginning of the file. .TP .BI / regexp / .PD 0 .TP .BI ? regexp ? The substring that matches the regular expression, found by looking toward the end .RB ( / ) or beginning .RB ( ? ) of the file, and if necessary continuing the search from the other end to the starting point of the search. The matched substring may straddle the starting point. When entering a pattern containing a literal question mark for a backward search, the question mark should be specified as a member of a class. .PD .TP .B 0 The string before the first full line. This is not necessarily the null string; see .B + and .B - below. .TP .B $ The null string at the end of the file. .TP .B . Dot. .TP .B \&' The mark in the file (see the .B k command below). .TP \fB"\f2regexp\fB"\f1\f1 Preceding a simple address (default .BR . ), refers to the address evaluated in the unique file whose menu line matches the regular expression. .PD .SS Compound Addresses In the following, .I a1 and .I a2 are addresses. .TF a1+a2 .TP .IB a1 + a2 The address .I a2 evaluated starting at the end of .IR a1 . .TP .IB a1 - a2 The address .I a2 evaluated looking in the reverse direction starting at the beginning of .IR a1 . .TP .IB a1 , a2 The substring from the beginning of .I a1 to the end of .IR a2 . If .I a1 is missing, .B 0 is substituted. If .I a2 is missing, .B $ is substituted. .TP .IB a1 ; a2 Like .IB a1 , a2\f1, but with .I a2 evaluated at the end of, and dot set to, .IR a1 . .PD .PP The operators .B + and .B - are high precedence, while .B , and .B ; are low precedence. .PP In both .B + and .B - forms, if .I a2 is a line or character address with a missing number, the number defaults to 1. If .I a1 is missing, .L . is substituted. If both .I a1 and .I a2 are present and distinguishable, .B + may be elided. .I a2 may be a regular expression; if it is delimited by .LR ? 's, the effect of the .B + or .B - is reversed. .PP It is an error for a compound address to represent a malformed substring. Some useful idioms: .IB a1 +- \%(\f2a1\fB-+\f1) selects the line containing the end (beginning) of a1. .BI 0/ regexp / locates the first match of the expression in the file. (The form .B 0;// sets dot unnecessarily.) .BI ./ regexp /// finds the second following occurrence of the expression, and .BI .,/ regexp / extends dot. .SS Commands In the following, text demarcated by slashes represents text delimited by any printable character except alphanumerics. Any number of trailing delimiters may be elided, with multiple elisions then representing null strings, but the first delimiter must always be present. In any delimited text, newline may not appear literally; .B \en may be typed for newline; and .B \e/ quotes the delimiter, here .LR / . Backslash is otherwise interpreted literally, except in .B s commands. .PP Most commands may be prefixed by an address to indicate their range of operation. Those that may not are marked with a .L * below. If a command takes an address and none is supplied, dot is used. The sole exception is the .B w command, which defaults to .BR 0,$ . In the description, `range' is used to represent whatever address is supplied. Many commands set the value of dot as a side effect. If so, it is always set to the `result' of the change: the empty string for a deletion, the new text for an insertion, etc. (but see the .B s and .B e commands). .br .ne 1.2i .SS Text commands .PD 0 .TP .BI a/ text / .TP or .TP .B a .TP .I lines of text .TP .B . Insert the text into the file after the range. Set dot. .PD .TP .B c\fP .br .ns .TP .B i\fP Same as .BR a , but .B c replaces the text, while .B i inserts .I before the range. .TP .B d Delete the text in the range. Set dot. .TP .BI s/ regexp / text / Substitute .I text for the first match to the regular expression in the range. Set dot to the modified range. In .I text the character .B & stands for the string that matched the expression. Backslash behaves as usual unless followed by a digit: .BI \e d stands for the string that matched the subexpression begun by the .IR d -th left parenthesis. If .I s is followed immediately by a number .IR n , as in .BR s2/x/y/ , the .IR n -th match in the range is substituted. If the command is followed by a .BR g , as in .BR s/x/y/g , all matches in the range are substituted. .TP .BI m " a1 .br .ns .TP .BI t " a1 Move .RB ( m ) or copy .RB ( t ) the range to after .IR a1 . Set dot. .SS Display commands .PD 0 .TP .B p Print the text in the range. Set dot. .TP .B = Print the line address and character address of the range. .TP .B =# Print just the character address of the range. .PD .SS File commands .PD 0 .TP .BI \*ab " file-list Set the current file to the first file named in the list that .I sam also has in its menu. The list may be expressed .BI < "Plan 9 command" in which case the file names are taken as words (in the shell sense) generated by the Plan 9 command. .TP .BI \*aB " file-list Same as .BR b , except that file names not in the menu are entered there, and all file names in the list are examined. .TP .B \*an Print a menu of files. The format is: .RS .TP 11 .BR ' " or blank indicating the file is modified or clean, .TP 11 .BR - " or \&" + indicating the file is unread or has been read (in the terminal, .B * means more than one window is open), .TP 11 .BR . " or blank indicating the current file, .TP 11 a blank, .TP 11 and the file name. .RE .TP 0 .BI \*aD " file-list Delete the named files from the menu. If no files are named, the current file is deleted. It is an error to .B D a modified file, but a subsequent .B D will delete such a file. .PD .SS I/O Commands .PD 0 .TP .BI \*ae " filename Replace the file by the contents of the named external file. Set dot to the beginning of the file. .TP .BI r " filename Replace the text in the range by the contents of the named external file. Set dot. .TP .BI w " filename Write the range (default .BR 0,$ ) to the named external file. .TP .BI \*af " filename Set the file name and print the resulting menu entry. .PP If the file name is absent from any of these, the current file name is used. .B e always sets the file name; .B r and .B w do so if the file has no name. .TP .BI < " Plan 9-command Replace the range by the standard output of the Plan 9 command. .TP .BI > " Plan 9-command Send the range to the standard input of the Plan 9 command. .TP .BI | " Plan 9-command Send the range to the standard input, and replace it by the standard output, of the Plan 9 command. .TP .BI \*a! " Plan 9-command Run the Plan 9 command. .TP .BI \*acd " directory Change working directory. If no directory is specified, .B $home is used. .PD .PP In any of .BR < , .BR > , .B | or .BR ! , if the .I Plan 9 command is omitted the last .I Plan 9 command (of any type) is substituted. If .I sam is .I downloaded (using the mouse and raster display, i.e. not using option .BR -d ), .B ! sets standard input to .BR /dev/null , and otherwise unassigned output .RB ( stdout for .B ! and .BR > , .B stderr for all) is placed in .B /tmp/sam.err and the first few lines are printed. .SS Loops and Conditionals .PD 0 .TP .BI x/ regexp / " command For each match of the regular expression in the range, run the command with dot set to the match. Set dot to the last match. If the regular expression and its slashes are omitted, .L /.*\en/ is assumed. Null string matches potentially occur before every character of the range and at the end of the range. .TP .BI y/ regexp / " command Like .BR x , but run the command for each substring that lies before, between, or after the matches that would be generated by .BR x . There is no default regular expression. Null substrings potentially occur before every character in the range. .TP .BI \*aX/ regexp / " command For each file whose menu entry matches the regular expression, make that the current file and run the command. If the expression is omitted, the command is run in every file. .TP .BI \*aY/ regexp / " command Same as .BR X , but for files that do not match the regular expression, and the expression is required. .TP .BI g/ regexp / " command .br .ns .TP .BI v/ regexp / " command If the range contains .RB ( g ) or does not contain .RB ( v ) a match for the expression, set dot to the range and run the command. .PP These may be nested arbitrarily deeply, but only one instance of either .B X or .B Y may appear in a \%single command. An empty command in an .B x or .B y defaults to .BR p ; an empty command in .B X or .B Y defaults to .BR f . .B g and .B v do not have defaults. .PD .SS Miscellany .TF (empty) .TP .B k Set the current file's mark to the range. Does not set dot. .TP .B \*aq Quit. It is an error to quit with modified files, but a second .B q will succeed. .TP .BI \*au " n Undo the last .I n (default 1) top-level commands that changed the contents or name of the current file, and any other file whose most recent change was simultaneous with the current file's change. Successive .BR u 's move further back in time. The only commands for which u is ineffective are .BR cd , .BR u , .BR q , .B w and .BR D . If .I n is negative, .B u `redoes,' undoing the undo, going forwards in time again. .TP (empty) If the range is explicit, set dot to the range. If .I sam is downloaded, the resulting dot is selected on the screen; otherwise it is printed. If no address is specified (the command is a newline) dot is extended in either direction to line boundaries and printed. If dot is thereby unchanged, it is set to .B .+1 and printed. .PD .SS Grouping and multiple changes Commands may be grouped by enclosing them in braces .BR {} . Commands within the braces must appear on separate lines (no backslashes are required between commands). Semantically, an opening brace is like a command: it takes an (optional) address and sets dot for each sub-command. Commands within the braces are executed sequentially, but changes made by one command are not visible to other commands (see the next paragraph). Braces may be nested arbitrarily. .PP When a command makes a number of changes to a file, as in .BR x/re/c/text/ , the addresses of all changes to the file are computed in the original file. If the changes are in sequence, they are applied to the file. Successive insertions at the same address are catenated into a single insertion composed of the several insertions in the order applied. .SS The terminal What follows refers to behavior of .I sam when downloaded, that is, when operating as a display editor on a raster display. This is the default behavior; invoking .I sam with the .B -d (no download) option provides access to the command language only. .PP Each file may have zero or more windows open. Each window is equivalent and is updated simultaneously with changes in other windows on the same file. Each window has an independent value of dot, indicated by a highlighted substring on the display. Dot may be in a region not within the window. There is usually a `current window', marked with a dark border, to which typed text and editing commands apply. Text may be typed and edited as in .IR rio (1); also the escape key (ESC) selects (sets dot to) text typed since the last mouse button hit. .PP The button 3 menu controls window operations. The top of the menu provides the following operators, each of which uses one or more .IR rio -like cursors to prompt for selection of a window or sweeping of a rectangle. `Sweeping' a null rectangle gets a large window, disjoint from the command window or the whole screen, depending on where the null rectangle is. .TF resize .TP .B new Create a new, empty file. .TP .B zerox Create a copy of an existing window. .TP .B resize As in .IR rio . .TP .B close Delete the window. In the last window of a file, .B close is equivalent to a .B D for the file. .TP .B write Equivalent to a .B w for the file. .PD .PP Below these operators is a list of available files, starting with .BR ~~sam~~ , the command window. Selecting a file from the list makes the most recently used window on that file current, unless it is already current, in which case selections cycle through the open windows. If no windows are open on the file, the user is prompted to open one. Files other than .B ~~sam~~ are marked with one of the characters .B -+* according as zero, one, or more windows are open on the file. A further mark .L . appears on the file in the current window and a single quote, .BR ' , on a file modified since last write. .PP The command window, created automatically when .B sam starts, is an ordinary window except that text typed to it is interpreted as commands for the editor rather than passive text, and text printed by editor commands appears in it. The behavior is like .IR rio , with an `output point' that separates commands being typed from previous output. Commands typed in the command window apply to the current open file\(emthe file in the most recently current window. .SS Manipulating text Button 1 changes selection, much like .IR rio . Pointing to a non-current window with button 1 makes it current; within the current window, button 1 selects text, thus setting dot. Double-clicking selects text to the boundaries of words, lines, quoted strings or bracketed strings, depending on the text at the click. .PP Button 2 provides a menu of editing commands: .TF /regexp .TP .B cut Delete dot and save the deleted text in the snarf buffer. .TP .B paste Replace the text in dot by the contents of the snarf buffer. .TP .B snarf Save the text in dot in the snarf buffer. .TP .B plumb Send the text in the selection as a plumb message. If the selection is empty, the white-space-delimited block of text is sent as a plumb message with a .B click attribute defining where the selection lies (see .IR plumb (7)). .TP .B look Search forward for the next occurrence of the literal text in dot. If dot is the null string, the text in the snarf buffer is used. The snarf buffer is unaffected. .TP .B Exchange snarf buffers with .IR rio . .TP .BI / regexp Search forward for the next match of the last regular expression typed in a command. (Not in command window.) .TP .B send Send the text in dot, or the snarf buffer if dot is the null string, as if it were typed to the command window. Saves the sent text in the snarf buffer. (Command window only.) .PD .SS External communication .I Sam listens to the .B edit plumb port. If plumbing is not active, on invocation .I sam creates a named pipe .BI /srv/sam. user which acts as an additional source of commands. Characters written to the named pipe are treated as if they had been typed in the command window. .PP .I B is a shell-level command that causes an instance of .I sam running on the same terminal to load the named .IR files . .I B uses either plumbing or the named pipe, whichever service is available. If plumbing is not enabled, the option allows a line number to be specified for the initial position to display in the last named file (plumbing provides a more general mechanism for this ability). .PP .I E is a shell-level command that can be used as .B $EDITOR in a Unix environment. It runs .I B on .I file and then does not exit until .I file is changed, which is taken as a signal that .I file is done being edited. .SS Abnormal termination If .I sam terminates other than by a .B q command (by hangup, deleting its window, etc.), modified files are saved in an executable file, .BR $HOME/sam.save . This program, when executed, asks whether to write each file back to a external file. The answer .L y causes writing; anything else skips the file. .SH FILES .TF $HOME/sam.save .TP .B $HOME/sam.save .TP .B $HOME/sam.err .TP .B \*9/bin/samsave the program called to unpack .BR $HOME/sam.save . .SH SOURCE .TF \*9/src/cmd/samterm .TP .B \*9/src/cmd/sam source for .I sam itself .TP .B \*9/src/cmd/samterm source for the separate terminal part .TP .B \*9/bin/B .TP .B \*9/bin/E .SH SEE ALSO .IR ed (1), .IR sed (1), .IR grep (1), .IR rio (1), .IR regexp (7). .PP Rob Pike, ``The text editor sam''. 9base-6/sam/parse.h0000644000175000017500000000356511402154555013622 0ustar anselmanselmtypedef struct Addr Addr; typedef struct Cmd Cmd; struct Addr { char type; /* # (char addr), l (line addr), / ? . $ + - , ; */ union{ String *re; Addr *aleft; /* left side of , and ; */ } g; Posn num; Addr *next; /* or right side of , and ; */ }; #define are g.re #define left g.aleft struct Cmd { Addr *addr; /* address (range of text) */ String *re; /* regular expression for e.g. 'x' */ union{ Cmd *cmd; /* target of x, g, {, etc. */ String *text; /* text of a, c, i; rhs of s */ Addr *addr; /* address for m, t */ } g; Cmd *next; /* pointer to next element in {} */ short num; ushort flag; /* whatever */ ushort cmdc; /* command character; 'x' etc. */ }; #define ccmd g.cmd #define ctext g.text #define caddr g.addr extern struct cmdtab{ ushort cmdc; /* command character */ uchar text; /* takes a textual argument? */ uchar regexp; /* takes a regular expression? */ uchar addr; /* takes an address (m or t)? */ uchar defcmd; /* default command; 0==>none */ uchar defaddr; /* default address */ uchar count; /* takes a count e.g. s2/// */ char *token; /* takes text terminated by one of these */ int (*fn)(File*, Cmd*); /* function to call with parse tree */ }cmdtab[]; enum Defaddr{ /* default addresses */ aNo, aDot, aAll }; int nl_cmd(File*, Cmd*), a_cmd(File*, Cmd*), b_cmd(File*, Cmd*); int c_cmd(File*, Cmd*), cd_cmd(File*, Cmd*), d_cmd(File*, Cmd*); int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*); int f_cmd(File*, Cmd*), g_cmd(File*, Cmd*), i_cmd(File*, Cmd*); int k_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*); int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*); int s_cmd(File*, Cmd*), u_cmd(File*, Cmd*), w_cmd(File*, Cmd*); int x_cmd(File*, Cmd*), X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*); int eq_cmd(File*, Cmd*); String *getregexp(int); Addr *newaddr(void); Address address(Addr*, Address, int); int cmdexec(File*, Cmd*); 9base-6/sam/sys.c0000644000175000017500000000135111402154555013310 0ustar anselmanselm#include "sam.h" static int inerror=FALSE; /* * A reasonable interface to the system calls */ void resetsys(void) { inerror = FALSE; } void syserror(char *a) { char buf[ERRMAX]; if(!inerror){ inerror=TRUE; errstr(buf, sizeof buf); dprint("%s: ", a); error_s(Eio, buf); } } int Read(int f, void *a, int n) { char buf[ERRMAX]; if(read(f, (char *)a, n)!=n) { if (lastfile) lastfile->rescuing = 1; errstr(buf, sizeof buf); if (downloaded) fprint(2, "read error: %s\n", buf); rescue(); exits("read"); } return n; } int Write(int f, void *a, int n) { int m; if((m=write(f, (char *)a, n))!=n) syserror("write"); return m; } void Seek(int f, long n, int w) { if(seek(f, n, w)==-1) syserror("seek"); } 9base-6/sam/Makefile0000644000175000017500000000164311402154555013772 0ustar anselmanselm# sam - sam shell unix port from plan9 # Depends on ../lib9 TARG = sam OFILES= sam.o address.o buff.o cmd.o disk.o error.o file.o\ io.o list.o mesg.o moveto.o multi.o rasp.o regexp.o\ shell.o string.o sys.o unix.o util.o xec.o MANFILES = sam.1 include ../config.mk all: ${TARG} @strip ${TARG} @echo built ${TARG} install: ${TARG} @mkdir -p ${DESTDIR}${PREFIX}/bin @cp -f ${TARG} ${DESTDIR}${PREFIX}/bin/ @chmod 755 ${DESTDIR}${PREFIX}/bin/${TARG} @mkdir -p ${DESTDIR}${MANPREFIX}/man1 @cp -f ${MANFILES} ${DESTDIR}${MANPREFIX}/man1 @chmod 444 ${DESTDIR}${MANPREFIX}/man1/${MANFILES} uninstall: rm -f ${DESTDIR}${PREFIX}/bin/${TARG} rm -f ${DESTDIR}${MANPREFIX}/man1/${MANFILES} .c.o: @echo CC $*.c @${CC} ${CFLAGS} -I../lib9 -I${PREFIX}/include -I../lib9 $*.c clean: rm -f ${OFILES} ${TARG} ${TARG}: ${OFILES} @echo LD ${TARG} @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L${PREFIX}/lib -L../lib9 -l9 9base-6/sam/plan9.c0000644000175000017500000000536311402154555013524 0ustar anselmanselm#include "sam.h" Rune samname[] = L"~~sam~~"; Rune *left[]= { L"{[(<«", L"\n", L"'\"`", 0 }; Rune *right[]= { L"}])>»", L"\n", L"'\"`", 0 }; char RSAM[] = "sam"; char SAMTERM[] = "/bin/aux/samterm"; char HOME[] = "HOME"; char TMPDIR[] = "/tmp"; char SH[] = "rc"; char SHPATH[] = "/bin/rc"; char RX[] = "rx"; char RXPATH[] = "/bin/rx"; char SAMSAVECMD[] = "/bin/rc\n/sys/lib/samsave"; void dprint(char *z, ...) { char buf[BLOCKSIZE]; va_list arg; va_start(arg, z); vseprint(buf, &buf[BLOCKSIZE], z, arg); va_end(arg); termwrite(buf); } void print_ss(char *s, String *a, String *b) { dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s); } void print_s(char *s, String *a) { dprint("?warning: %s `%.*S'\n", s, a->n, a->s); } char* getuser(void) { static char user[64]; int fd; if(user[0] == 0){ fd = open("/dev/user", 0); if(fd<0 || read(fd, user, sizeof user-1)<=0) strcpy(user, "none"); close(fd); } return user; } int statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) { Dir *dirb; dirb = dirstat(name); if(dirb == nil) return -1; if(dev) *dev = dirb->type|(dirb->dev<<16); if(id) *id = dirb->qid.path; if(time) *time = dirb->mtime; if(length) *length = dirb->length; if(appendonly) *appendonly = dirb->mode & DMAPPEND; free(dirb); return 1; } int statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) { Dir *dirb; dirb = dirfstat(fd); if(dirb == nil) return -1; if(dev) *dev = dirb->type|(dirb->dev<<16); if(id) *id = dirb->qid.path; if(time) *time = dirb->mtime; if(length) *length = dirb->length; if(appendonly) *appendonly = dirb->mode & DMAPPEND; free(dirb); return 1; } void notifyf(void *a, char *s) { USED(a); if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0) noted(NCONT); if(strcmp(s, "interrupt") == 0) noted(NCONT); panicking = 1; rescue(); noted(NDFLT); } int newtmp(int num) { int i, fd; static char tempnam[30]; i = getpid(); do snprint(tempnam, sizeof tempnam, "%s/%d%.4s%dsam", TMPDIR, num, getuser(), i++); while(access(tempnam, 0) == 0); fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000); if(fd < 0){ remove(tempnam); fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000); } return fd; } int waitfor(int pid) { int msg; Waitmsg *w; while((w = wait()) != nil){ if(w->pid != pid){ free(w); continue; } msg = (w->msg[0] != '\0'); free(w); return msg; } return -1; } void samerr(char *buf) { sprint(buf, "%s/sam.err", TMPDIR); } void* emalloc(ulong n) { void *p; p = malloc(n); if(p == 0) panic("malloc fails"); memset(p, 0, n); return p; } void* erealloc(void *p, ulong n) { p = realloc(p, n); if(p == 0) panic("realloc fails"); return p; } 9base-6/sam/file.c0000644000175000017500000002472511402154555013423 0ustar anselmanselm#include "sam.h" /* * Structure of Undo list: * The Undo structure follows any associated data, so the list * can be read backwards: read the structure, then read whatever * data is associated (insert string, file name) and precedes it. * The structure includes the previous value of the modify bit * and a sequence number; successive Undo structures with the * same sequence number represent simultaneous changes. */ typedef struct Undo Undo; typedef struct Merge Merge; struct Undo { short type; /* Delete, Insert, Filename, Dot, Mark */ short mod; /* modify bit */ uint seq; /* sequence number */ uint p0; /* location of change (unused in f) */ uint n; /* # runes in string or file name */ }; struct Merge { File *f; uint seq; /* of logged change */ uint p0; /* location of change (unused in f) */ uint n; /* # runes to delete */ uint nbuf; /* # runes to insert */ Rune buf[RBUFSIZE]; }; enum { Maxmerge = 50, Undosize = sizeof(Undo)/sizeof(Rune) }; static Merge merge; File* fileopen(void) { File *f; f = emalloc(sizeof(File)); f->dot.f = f; f->ndot.f = f; f->seq = 0; f->mod = FALSE; f->unread = TRUE; Strinit0(&f->name); return f; } int fileisdirty(File *f) { return f->seq != f->cleanseq; } static void wrinsert(Buffer *delta, int seq, int mod, uint p0, Rune *s, uint ns) { Undo u; u.type = Insert; u.mod = mod; u.seq = seq; u.p0 = p0; u.n = ns; bufinsert(delta, delta->nc, s, ns); bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } static void wrdelete(Buffer *delta, int seq, int mod, uint p0, uint p1) { Undo u; u.type = Delete; u.mod = mod; u.seq = seq; u.p0 = p0; u.n = p1 - p0; bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } void flushmerge(void) { File *f; f = merge.f; if(f == nil) return; if(merge.seq != f->seq) panic("flushmerge seq mismatch"); if(merge.n != 0) wrdelete(&f->epsilon, f->seq, TRUE, merge.p0, merge.p0+merge.n); if(merge.nbuf != 0) wrinsert(&f->epsilon, f->seq, TRUE, merge.p0+merge.n, merge.buf, merge.nbuf); merge.f = nil; merge.n = 0; merge.nbuf = 0; } void mergeextend(File *f, uint p0) { uint mp0n; mp0n = merge.p0+merge.n; if(mp0n != p0){ bufread(&f->b, mp0n, merge.buf+merge.nbuf, p0-mp0n); merge.nbuf += p0-mp0n; merge.n = p0-merge.p0; } } /* * like fileundelete, but get the data from arguments */ void loginsert(File *f, uint p0, Rune *s, uint ns) { if(f->rescuing) return; if(ns == 0) return; if(ns<0 || ns>STRSIZE) panic("loginsert"); if(f->seq < seq) filemark(f); if(p0 < f->hiposn) error(Esequence); if(merge.f != f || p0-(merge.p0+merge.n)>Maxmerge /* too far */ || merge.nbuf+((p0+ns)-(merge.p0+merge.n))>=RBUFSIZE) /* too long */ flushmerge(); if(ns>=RBUFSIZE){ if(!(merge.n == 0 && merge.nbuf == 0 && merge.f == nil)) panic("loginsert bad merge state"); wrinsert(&f->epsilon, f->seq, TRUE, p0, s, ns); }else{ if(merge.f != f){ merge.f = f; merge.p0 = p0; merge.seq = f->seq; } mergeextend(f, p0); /* append string to merge */ runemove(merge.buf+merge.nbuf, s, ns); merge.nbuf += ns; } f->hiposn = p0; if(!f->unread && !f->mod) state(f, Dirty); } void logdelete(File *f, uint p0, uint p1) { if(f->rescuing) return; if(p0 == p1) return; if(f->seq < seq) filemark(f); if(p0 < f->hiposn) error(Esequence); if(merge.f != f || p0-(merge.p0+merge.n)>Maxmerge /* too far */ || merge.nbuf+(p0-(merge.p0+merge.n))>=RBUFSIZE){ /* too long */ flushmerge(); merge.f = f; merge.p0 = p0; merge.seq = f->seq; } mergeextend(f, p0); /* add to deletion */ merge.n = p1-merge.p0; f->hiposn = p1; if(!f->unread && !f->mod) state(f, Dirty); } /* * like fileunsetname, but get the data from arguments */ void logsetname(File *f, String *s) { Undo u; Buffer *delta; if(f->rescuing) return; if(f->unread){ /* This is setting initial file name */ filesetname(f, s); return; } if(f->seq < seq) filemark(f); /* undo a file name change by restoring old name */ delta = &f->epsilon; u.type = Filename; u.mod = TRUE; u.seq = f->seq; u.p0 = 0; /* unused */ u.n = s->n; if(s->n) bufinsert(delta, delta->nc, s->s, s->n); bufinsert(delta, delta->nc, (Rune*)&u, Undosize); if(!f->unread && !f->mod) state(f, Dirty); } #ifdef NOTEXT File* fileaddtext(File *f, Text *t) { if(f == nil){ f = emalloc(sizeof(File)); f->unread = TRUE; } f->text = realloc(f->text, (f->ntext+1)*sizeof(Text*)); f->text[f->ntext++] = t; f->curtext = t; return f; } void filedeltext(File *f, Text *t) { int i; for(i=0; intext; i++) if(f->text[i] == t) goto Found; panic("can't find text in filedeltext"); Found: f->ntext--; if(f->ntext == 0){ fileclose(f); return; } memmove(f->text+i, f->text+i+1, (f->ntext-i)*sizeof(Text*)); if(f->curtext == t) f->curtext = f->text[0]; } #endif void fileuninsert(File *f, Buffer *delta, uint p0, uint ns) { Undo u; /* undo an insertion by deleting */ u.type = Delete; u.mod = f->mod; u.seq = f->seq; u.p0 = p0; u.n = ns; bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } void fileundelete(File *f, Buffer *delta, uint p0, uint p1) { Undo u; Rune *buf; uint i, n; /* undo a deletion by inserting */ u.type = Insert; u.mod = f->mod; u.seq = f->seq; u.p0 = p0; u.n = p1-p0; buf = fbufalloc(); for(i=p0; i RBUFSIZE) n = RBUFSIZE; bufread(&f->b, i, buf, n); bufinsert(delta, delta->nc, buf, n); } fbuffree(buf); bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } int filereadc(File *f, uint q) { Rune r; if(q >= f->b.nc) return -1; bufread(&f->b, q, &r, 1); return r; } void filesetname(File *f, String *s) { if(!f->unread) /* This is setting initial file name */ fileunsetname(f, &f->delta); Strduplstr(&f->name, s); sortname(f); f->unread = TRUE; } void fileunsetname(File *f, Buffer *delta) { String s; Undo u; /* undo a file name change by restoring old name */ u.type = Filename; u.mod = f->mod; u.seq = f->seq; u.p0 = 0; /* unused */ Strinit(&s); Strduplstr(&s, &f->name); fullname(&s); u.n = s.n; if(s.n) bufinsert(delta, delta->nc, s.s, s.n); bufinsert(delta, delta->nc, (Rune*)&u, Undosize); Strclose(&s); } void fileunsetdot(File *f, Buffer *delta, Range dot) { Undo u; u.type = Dot; u.mod = f->mod; u.seq = f->seq; u.p0 = dot.p1; u.n = dot.p2 - dot.p1; bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } void fileunsetmark(File *f, Buffer *delta, Range mark) { Undo u; u.type = Mark; u.mod = f->mod; u.seq = f->seq; u.p0 = mark.p1; u.n = mark.p2 - mark.p1; bufinsert(delta, delta->nc, (Rune*)&u, Undosize); } uint fileload(File *f, uint p0, int fd, int *nulls) { if(f->seq > 0) panic("undo in file.load unimplemented"); return bufload(&f->b, p0, fd, nulls); } int fileupdate(File *f, int notrans, int toterm) { uint p1, p2; int mod; if(f->rescuing) return FALSE; flushmerge(); /* * fix the modification bit * subtle point: don't save it away in the log. * * if another change is made, the correct f->mod * state is saved in the undo log by filemark * when setting the dot and mark. * * if the change is undone, the correct state is * saved from f in the fileun... routines. */ mod = f->mod; f->mod = f->prevmod; if(f == cmd) notrans = TRUE; else{ fileunsetdot(f, &f->delta, f->prevdot); fileunsetmark(f, &f->delta, f->prevmark); } f->dot = f->ndot; fileundo(f, FALSE, !notrans, &p1, &p2, toterm); f->mod = mod; if(f->delta.nc == 0) f->seq = 0; if(f == cmd) return FALSE; if(f->mod){ f->closeok = 0; quitok = 0; }else f->closeok = 1; return TRUE; } long prevseq(Buffer *b) { Undo u; uint up; up = b->nc; if(up == 0) return 0; up -= Undosize; bufread(b, up, (Rune*)&u, Undosize); return u.seq; } long undoseq(File *f, int isundo) { if(isundo) return f->seq; return prevseq(&f->epsilon); } void fileundo(File *f, int isundo, int canredo, uint *q0p, uint *q1p, int flag) { Undo u; Rune *buf; uint i, n, up; uint stop; Buffer *delta, *epsilon; if(isundo){ /* undo; reverse delta onto epsilon, seq decreases */ delta = &f->delta; epsilon = &f->epsilon; stop = f->seq; }else{ /* redo; reverse epsilon onto delta, seq increases */ delta = &f->epsilon; epsilon = &f->delta; stop = 0; /* don't know yet */ } raspstart(f); while(delta->nc > 0){ /* rasp and buffer are in sync; sync with wire if needed */ if(needoutflush()) raspflush(f); up = delta->nc-Undosize; bufread(delta, up, (Rune*)&u, Undosize); if(isundo){ if(u.seq < stop){ f->seq = u.seq; raspdone(f, flag); return; } }else{ if(stop == 0) stop = u.seq; if(u.seq > stop){ raspdone(f, flag); return; } } switch(u.type){ default: panic("undo unknown u.type"); break; case Delete: f->seq = u.seq; if(canredo) fileundelete(f, epsilon, u.p0, u.p0+u.n); f->mod = u.mod; bufdelete(&f->b, u.p0, u.p0+u.n); raspdelete(f, u.p0, u.p0+u.n, flag); *q0p = u.p0; *q1p = u.p0; break; case Insert: f->seq = u.seq; if(canredo) fileuninsert(f, epsilon, u.p0, u.n); f->mod = u.mod; up -= u.n; buf = fbufalloc(); for(i=0; i RBUFSIZE) n = RBUFSIZE; bufread(delta, up+i, buf, n); bufinsert(&f->b, u.p0+i, buf, n); raspinsert(f, u.p0+i, buf, n, flag); } fbuffree(buf); *q0p = u.p0; *q1p = u.p0+u.n; break; case Filename: f->seq = u.seq; if(canredo) fileunsetname(f, epsilon); f->mod = u.mod; up -= u.n; Strinsure(&f->name, u.n+1); bufread(delta, up, f->name.s, u.n); f->name.s[u.n] = 0; f->name.n = u.n; fixname(&f->name); sortname(f); break; case Dot: f->seq = u.seq; if(canredo) fileunsetdot(f, epsilon, f->dot.r); f->mod = u.mod; f->dot.r.p1 = u.p0; f->dot.r.p2 = u.p0 + u.n; break; case Mark: f->seq = u.seq; if(canredo) fileunsetmark(f, epsilon, f->mark); f->mod = u.mod; f->mark.p1 = u.p0; f->mark.p2 = u.p0 + u.n; break; } bufdelete(delta, up, delta->nc); } if(isundo) f->seq = 0; raspdone(f, flag); } void filereset(File *f) { bufreset(&f->delta); bufreset(&f->epsilon); f->seq = 0; } void fileclose(File *f) { Strclose(&f->name); bufclose(&f->b); bufclose(&f->delta); bufclose(&f->epsilon); if(f->rasp) listfree(f->rasp); free(f); } void filemark(File *f) { if(f->unread) return; if(f->epsilon.nc) bufdelete(&f->epsilon, 0, f->epsilon.nc); if(f != cmd){ f->prevdot = f->dot.r; f->prevmark = f->mark; f->prevseq = f->seq; f->prevmod = f->mod; } f->ndot = f->dot; f->seq = seq; f->hiposn = 0; } 9base-6/sam/moveto.c0000644000175000017500000000523011402154555014003 0ustar anselmanselm#include "sam.h" void moveto(File *f, Range r) { Posn p1 = r.p1, p2 = r.p2; f->dot.r.p1 = p1; f->dot.r.p2 = p2; if(f->rasp){ telldot(f); outTsl(Hmoveto, f->tag, f->dot.r.p1); } } void telldot(File *f) { if(f->rasp == 0) panic("telldot"); if(f->dot.r.p1==f->tdot.p1 && f->dot.r.p2==f->tdot.p2) return; outTsll(Hsetdot, f->tag, f->dot.r.p1, f->dot.r.p2); f->tdot = f->dot.r; } void tellpat(void) { outTS(Hsetpat, &lastpat); patset = FALSE; } #define CHARSHIFT 128 void lookorigin(File *f, Posn p0, Posn ls) { int nl, nc, c; Posn p, oldp0; if(p0 > f->b.nc) p0 = f->b.nc; oldp0 = p0; p = p0; for(nl=nc=c=0; c!=-1 && nl=CHARSHIFT/2) p0-=CHARSHIFT/2; else p0 = 0; }else p0 = oldp0; outTsl(Horigin, f->tag, p0); } int alnum(int c) { /* * Hard to get absolutely right. Use what we know about ASCII * and assume anything above the Latin control characters is * potentially an alphanumeric. */ if(c<=' ') return 0; if(0x7F<=c && c<=0xA0) return 0; if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c)) return 0; return 1; } int clickmatch(File *f, int cl, int cr, int dir, Posn *p) { int c; int nest = 1; for(;;){ if(dir > 0){ if(*p >= f->b.nc) break; c = filereadc(f, (*p)++); }else{ if(*p == 0) break; c = filereadc(f, --(*p)); } if(c == cr){ if(--nest==0) return 1; }else if(c == cl) nest++; } return cl=='\n' && nest==1; } Rune* strrune(Rune *s, Rune c) { Rune c1; if(c == 0) { while(*s++) ; return s-1; } while(c1 = *s++) if(c1 == c) return s-1; return 0; } void doubleclick(File *f, Posn p1) { int c, i; Rune *r, *l; Posn p; if(p1 > f->b.nc) return; f->dot.r.p1 = f->dot.r.p2 = p1; for(i=0; left[i]; i++){ l = left[i]; r = right[i]; /* try left match */ p = p1; if(p1 == 0) c = '\n'; else c = filereadc(f, p - 1); if(strrune(l, c)){ if(clickmatch(f, c, r[strrune(l, c)-l], 1, &p)){ f->dot.r.p1 = p1; f->dot.r.p2 = p-(c!='\n'); } return; } /* try right match */ p = p1; if(p1 == f->b.nc) c = '\n'; else c = filereadc(f, p); if(strrune(r, c)){ if(clickmatch(f, c, l[strrune(r, c)-r], -1, &p)){ f->dot.r.p1 = p; if(c!='\n' || p!=0 || filereadc(f, 0)=='\n') f->dot.r.p1++; f->dot.r.p2 = p1+(p1b.nc && c=='\n'); } return; } } /* try filling out word to right */ p = p1; while(p < f->b.nc && alnum(filereadc(f, p++))) f->dot.r.p2++; /* try filling out word to left */ p = p1; while(--p >= 0 && alnum(filereadc(f, p))) f->dot.r.p1--; } 9base-6/sam/string.c0000644000175000017500000000531611402154555014005 0ustar anselmanselm#include "sam.h" #define MINSIZE 16 /* minimum number of chars allocated */ #define MAXSIZE 256 /* maximum number of chars for an empty string */ void Strinit(String *p) { p->s = emalloc(MINSIZE*RUNESIZE); p->n = 0; p->size = MINSIZE; } void Strinit0(String *p) { p->s = emalloc(MINSIZE*RUNESIZE); p->s[0] = 0; p->n = 1; p->size = MINSIZE; } void Strclose(String *p) { free(p->s); } void Strzero(String *p) { if(p->size > MAXSIZE){ p->s = erealloc(p->s, RUNESIZE*MAXSIZE); /* throw away the garbage */ p->size = MAXSIZE; } p->n = 0; } int Strlen(Rune *r) { Rune *s; for(s=r; *s; s++) ; return s-r; } void Strdupl(String *p, Rune *s) /* copies the null */ { p->n = Strlen(s)+1; Strinsure(p, p->n); memmove(p->s, s, p->n*RUNESIZE); } void Strduplstr(String *p, String *q) /* will copy the null if there's one there */ { Strinsure(p, q->n); p->n = q->n; memmove(p->s, q->s, q->n*RUNESIZE); } void Straddc(String *p, int c) { Strinsure(p, p->n+1); p->s[p->n++] = c; } void Strinsure(String *p, ulong n) { if(n > STRSIZE) error(Etoolong); if(p->size < n){ /* p needs to grow */ n += 100; p->s = erealloc(p->s, n*RUNESIZE); p->size = n; } } void Strinsert(String *p, String *q, Posn p0) { Strinsure(p, p->n+q->n); memmove(p->s+p0+q->n, p->s+p0, (p->n-p0)*RUNESIZE); memmove(p->s+p0, q->s, q->n*RUNESIZE); p->n += q->n; } void Strdelete(String *p, Posn p1, Posn p2) { memmove(p->s+p1, p->s+p2, (p->n-p2)*RUNESIZE); p->n -= p2-p1; } int Strcmp(String *a, String *b) { int i, c; for(i=0; in && in; i++) if(c = (a->s[i] - b->s[i])) /* assign = */ return c; /* damn NULs confuse everything */ i = a->n - b->n; if(i == 1){ if(a->s[a->n-1] == 0) return 0; }else if(i == -1){ if(b->s[b->n-1] == 0) return 0; } return i; } int Strispre(String *a, String *b) { int i; for(i=0; in && in; i++){ if(a->s[i] - b->s[i]){ /* assign = */ if(a->s[i] == 0) return 1; return 0; } } return i == a->n; } char* Strtoc(String *s) { int i; char *c, *d; Rune *r; c = emalloc(s->n*UTFmax + 1); /* worst case UTFmax bytes per rune, plus NUL */ d = c; r = s->s; for(i=0; in; i++) d += runetochar(d, r++); if(d==c || d[-1]!=0) *d = 0; return c; } /* * Build very temporary String from Rune* */ String* tmprstr(Rune *r, int n) { static String p; p.s = r; p.n = n; p.size = n; return &p; } /* * Convert null-terminated char* into String */ String* tmpcstr(char *s) { String *p; Rune *r; int i, n; n = utflen(s); /* don't include NUL */ p = emalloc(sizeof(String)); r = emalloc(n*RUNESIZE); p->s = r; for(i=0; in = n; p->size = n; return p; } void freetmpstr(String *s) { free(s->s); free(s); } 9base-6/sam/rasp.c0000644000175000017500000001332111402154555013437 0ustar anselmanselm#include "sam.h" /* * GROWDATASIZE must be big enough that all errors go out as Hgrowdata's, * so they will be scrolled into visibility in the ~~sam~~ window (yuck!). */ #define GROWDATASIZE 50 /* if size is <= this, send data with grow */ void rcut(List*, Posn, Posn); int rterm(List*, Posn); void rgrow(List*, Posn, Posn); static Posn growpos; static Posn grown; static Posn shrinkpos; static Posn shrunk; /* * rasp routines inform the terminal of changes to the file. * * a rasp is a list of spans within the file, and an indication * of whether the terminal knows about the span. * * optimize by coalescing multiple updates to the same span * if it is not known by the terminal. * * other possible optimizations: flush terminal's rasp by cut everything, * insert everything if rasp gets too large. */ /* * only called for initial load of file */ void raspload(File *f) { if(f->rasp == nil) return; grown = f->b.nc; growpos = 0; if(f->b.nc) rgrow(f->rasp, 0, f->b.nc); raspdone(f, 1); } void raspstart(File *f) { if(f->rasp == nil) return; grown = 0; shrunk = 0; outbuffered = 1; } void raspdone(File *f, int toterm) { if(f->dot.r.p1 > f->b.nc) f->dot.r.p1 = f->b.nc; if(f->dot.r.p2 > f->b.nc) f->dot.r.p2 = f->b.nc; if(f->mark.p1 > f->b.nc) f->mark.p1 = f->b.nc; if(f->mark.p2 > f->b.nc) f->mark.p2 = f->b.nc; if(f->rasp == nil) return; if(grown) outTsll(Hgrow, f->tag, growpos, grown); else if(shrunk) outTsll(Hcut, f->tag, shrinkpos, shrunk); if(toterm) outTs(Hcheck0, f->tag); outflush(); outbuffered = 0; if(f == cmd){ cmdpt += cmdptadv; cmdptadv = 0; } } void raspflush(File *f) { if(grown){ outTsll(Hgrow, f->tag, growpos, grown); grown = 0; } else if(shrunk){ outTsll(Hcut, f->tag, shrinkpos, shrunk); shrunk = 0; } outflush(); } void raspdelete(File *f, uint p1, uint p2, int toterm) { long n; n = p2 - p1; if(n == 0) return; if(p2 <= f->dot.r.p1){ f->dot.r.p1 -= n; f->dot.r.p2 -= n; } if(p2 <= f->mark.p1){ f->mark.p1 -= n; f->mark.p2 -= n; } if(f->rasp == nil) return; if(f==cmd && p1tag, growpos, grown); grown = 0; }else if(shrunk && shrinkpos!=p1 && shrinkpos!=p2){ outTsll(Hcut, f->tag, shrinkpos, shrunk); shrunk = 0; } if(!shrunk || shrinkpos==p2) shrinkpos = p1; shrunk += n; } rcut(f->rasp, p1, p2); } void raspinsert(File *f, uint p1, Rune *buf, uint n, int toterm) { Range r; if(n == 0) return; if(p1 < f->dot.r.p1){ f->dot.r.p1 += n; f->dot.r.p2 += n; } if(p1 < f->mark.p1){ f->mark.p1 += n; f->mark.p2 += n; } if(f->rasp == nil) return; if(f==cmd && p1tag, shrinkpos, shrunk); shrunk = 0; } if(n>GROWDATASIZE || !rterm(f->rasp, p1)){ rgrow(f->rasp, p1, n); if(grown && growpos+grown!=p1 && growpos!=p1){ outTsll(Hgrow, f->tag, growpos, grown); grown = 0; } if(!grown) growpos = p1; grown += n; }else{ if(grown){ outTsll(Hgrow, f->tag, growpos, grown); grown = 0; } rgrow(f->rasp, p1, n); r = rdata(f->rasp, p1, n); if(r.p1!=p1 || r.p2!=p1+n) panic("rdata in toterminal"); outTsllS(Hgrowdata, f->tag, p1, n, tmprstr(buf, n)); } }else{ rgrow(f->rasp, p1, n); r = rdata(f->rasp, p1, n); if(r.p1!=p1 || r.p2!=p1+n) panic("rdata in toterminal"); } } #define M 0x80000000L #define P(i) r->posnptr[i] #define T(i) (P(i)&M) /* in terminal */ #define L(i) (P(i)&~M) /* length of this piece */ void rcut(List *r, Posn p1, Posn p2) { Posn p, x; int i; if(p1 == p2) panic("rcut 0"); for(p=0,i=0; inused && p+L(i)<=p1; p+=L(i++)) ; if(i == r->nused) panic("rcut 1"); if(p < p1){ /* chop this piece */ if(p+L(i) < p2){ x = p1-p; p += L(i); }else{ x = L(i)-(p2-p1); p = p2; } if(T(i)) P(i) = x|M; else P(i) = x; i++; } while(inused && p+L(i)<=p2){ p += L(i); dellist(r, i); } if(p < p2){ if(i == r->nused) panic("rcut 2"); x = L(i)-(p2-p); if(T(i)) P(i) = x|M; else P(i) = x; } /* can we merge i and i-1 ? */ if(i>0 && inused && T(i-1)==T(i)){ x = L(i-1)+L(i); dellist(r, i--); if(T(i)) P(i)=x|M; else P(i)=x; } } void rgrow(List *r, Posn p1, Posn n) { Posn p; int i; if(n == 0) panic("rgrow 0"); for(p=0,i=0; inused && p+L(i)<=p1; p+=L(i++)) ; if(i == r->nused){ /* stick on end of file */ if(p!=p1) panic("rgrow 1"); if(i>0 && !T(i-1)) P(i-1)+=n; else inslist(r, i, n); }else if(!T(i)) /* goes in this empty piece */ P(i)+=n; else if(p==p1 && i>0 && !T(i-1)) /* special case; simplifies life */ P(i-1)+=n; else if(p==p1) inslist(r, i, n); else{ /* must break piece in terminal */ inslist(r, i+1, (L(i)-(p1-p))|M); inslist(r, i+1, n); P(i) = (p1-p)|M; } } int rterm(List *r, Posn p1) { Posn p; int i; for(p = 0,i = 0; inused && p+L(i)<=p1; p+=L(i++)) ; if(i==r->nused && (i==0 || !T(i-1))) return 0; return T(i); } Range rdata(List *r, Posn p1, Posn n) { Posn p; int i; Range rg; if(n==0) panic("rdata 0"); for(p = 0,i = 0; inused && p+L(i)<=p1; p+=L(i++)) ; if(i==r->nused) panic("rdata 1"); if(T(i)){ n-=L(i)-(p1-p); if(n<=0){ rg.p1 = rg.p2 = p1; return rg; } p+=L(i++); p1 = p; } if(T(i) || i==r->nused) panic("rdata 2"); if(p+L(i)nused-1 && T(i+1)){ P(i)=(n+=L(i+1))|M; dellist(r, i+1); } if(i>0 && T(i-1)){ P(i)=(n+L(i-1))|M; dellist(r, i-1); } return rg; } 9base-6/sam/address.c0000644000175000017500000000765311402154555014132 0ustar anselmanselm#include "sam.h" #include "parse.h" Address addr; String lastpat; int patset; File *menu; File *matchfile(String*); Address charaddr(Posn, Address, int); Address address(Addr *ap, Address a, int sign) { File *f = a.f; Address a1, a2; do{ switch(ap->type){ case 'l': case '#': a = (*(ap->type=='#'?charaddr:lineaddr))(ap->num, a, sign); break; case '.': a = f->dot; break; case '$': a.r.p1 = a.r.p2 = f->b.nc; break; case '\'': a.r = f->mark; break; case '?': sign = -sign; if(sign == 0) sign = -1; /* fall through */ case '/': nextmatch(f, ap->are, sign>=0? a.r.p2 : a.r.p1, sign); a.r = sel.p[0]; break; case '"': a = matchfile(ap->are)->dot; f = a.f; if(f->unread) load(f); break; case '*': a.r.p1 = 0, a.r.p2 = f->b.nc; return a; case ',': case ';': if(ap->left) a1 = address(ap->left, a, 0); else a1.f = a.f, a1.r.p1 = a1.r.p2 = 0; if(ap->type == ';'){ f = a1.f; a = a1; f->dot = a1; } if(ap->next) a2 = address(ap->next, a, 0); else a2.f = a.f, a2.r.p1 = a2.r.p2 = f->b.nc; if(a1.f != a2.f) error(Eorder); a.f = a1.f, a.r.p1 = a1.r.p1, a.r.p2 = a2.r.p2; if(a.r.p2 < a.r.p1) error(Eorder); return a; case '+': case '-': sign = 1; if(ap->type == '-') sign = -1; if(ap->next==0 || ap->next->type=='+' || ap->next->type=='-') a = lineaddr(1L, a, sign); break; default: panic("address"); return a; } }while(ap = ap->next); /* assign = */ return a; } void nextmatch(File *f, String *r, Posn p, int sign) { compile(r); if(sign >= 0){ if(!execute(f, p, INFINITY)) error(Esearch); if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p1==p){ if(++p>f->b.nc) p = 0; if(!execute(f, p, INFINITY)) panic("address"); } }else{ if(!bexecute(f, p)) error(Esearch); if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p2==p){ if(--p<0) p = f->b.nc; if(!bexecute(f, p)) panic("address"); } } } File * matchfile(String *r) { File *f; File *match = 0; int i; for(i = 0; iname); sprint(buf, "%c%c%c %s\n", " '"[f->mod], "-+"[f->rasp!=0], " ."[f==curfile], c); free(c); t = tmpcstr(buf); Strduplstr(&genstr, t); freetmpstr(t); /* A little dirty... */ if(menu == 0) menu = fileopen(); bufreset(&menu->b); bufinsert(&menu->b, 0, genstr.s, genstr.n); compile(r); return execute(menu, 0, menu->b.nc); } Address charaddr(Posn l, Address addr, int sign) { if(sign == 0) addr.r.p1 = addr.r.p2 = l; else if(sign < 0) addr.r.p2 = addr.r.p1-=l; else if(sign > 0) addr.r.p1 = addr.r.p2+=l; if(addr.r.p1<0 || addr.r.p2>addr.f->b.nc) error(Erange); return addr; } Address lineaddr(Posn l, Address addr, int sign) { int n; int c; File *f = addr.f; Address a; Posn p; a.f = f; if(sign >= 0){ if(l == 0){ if(sign==0 || addr.r.p2==0){ a.r.p1 = a.r.p2 = 0; return a; } a.r.p1 = addr.r.p2; p = addr.r.p2-1; }else{ if(sign==0 || addr.r.p2==0){ p = (Posn)0; n = 1; }else{ p = addr.r.p2-1; n = filereadc(f, p++)=='\n'; } while(n < l){ if(p >= f->b.nc) error(Erange); if(filereadc(f, p++) == '\n') n++; } a.r.p1 = p; } while(p < f->b.nc && filereadc(f, p++)!='\n') ; a.r.p2 = p; }else{ p = addr.r.p1; if(l == 0) a.r.p2 = addr.r.p1; else{ for(n = 0; n 0) p--; } while(p > 0 && filereadc(f, p-1)!='\n') /* lines start after a newline */ p--; a.r.p1 = p; } return a; } 9base-6/sam/cmd.c0000644000175000017500000002512111402154555013236 0ustar anselmanselm#include "sam.h" #include "parse.h" static char linex[]="\n"; static char wordx[]=" \t\n"; struct cmdtab cmdtab[]={ /* cmdc text regexp addr defcmd defaddr count token fn */ '\n', 0, 0, 0, 0, aDot, 0, 0, nl_cmd, 'a', 1, 0, 0, 0, aDot, 0, 0, a_cmd, 'b', 0, 0, 0, 0, aNo, 0, linex, b_cmd, 'B', 0, 0, 0, 0, aNo, 0, linex, b_cmd, 'c', 1, 0, 0, 0, aDot, 0, 0, c_cmd, 'd', 0, 0, 0, 0, aDot, 0, 0, d_cmd, 'D', 0, 0, 0, 0, aNo, 0, linex, D_cmd, 'e', 0, 0, 0, 0, aNo, 0, wordx, e_cmd, 'f', 0, 0, 0, 0, aNo, 0, wordx, f_cmd, 'g', 0, 1, 0, 'p', aDot, 0, 0, g_cmd, 'i', 1, 0, 0, 0, aDot, 0, 0, i_cmd, 'k', 0, 0, 0, 0, aDot, 0, 0, k_cmd, 'm', 0, 0, 1, 0, aDot, 0, 0, m_cmd, 'n', 0, 0, 0, 0, aNo, 0, 0, n_cmd, 'p', 0, 0, 0, 0, aDot, 0, 0, p_cmd, 'q', 0, 0, 0, 0, aNo, 0, 0, q_cmd, 'r', 0, 0, 0, 0, aDot, 0, wordx, e_cmd, 's', 0, 1, 0, 0, aDot, 1, 0, s_cmd, 't', 0, 0, 1, 0, aDot, 0, 0, m_cmd, 'u', 0, 0, 0, 0, aNo, 2, 0, u_cmd, 'v', 0, 1, 0, 'p', aDot, 0, 0, g_cmd, 'w', 0, 0, 0, 0, aAll, 0, wordx, w_cmd, 'x', 0, 1, 0, 'p', aDot, 0, 0, x_cmd, 'y', 0, 1, 0, 'p', aDot, 0, 0, x_cmd, 'X', 0, 1, 0, 'f', aNo, 0, 0, X_cmd, 'Y', 0, 1, 0, 'f', aNo, 0, 0, X_cmd, '!', 0, 0, 0, 0, aNo, 0, linex, plan9_cmd, '>', 0, 0, 0, 0, aDot, 0, linex, plan9_cmd, '<', 0, 0, 0, 0, aDot, 0, linex, plan9_cmd, '|', 0, 0, 0, 0, aDot, 0, linex, plan9_cmd, '=', 0, 0, 0, 0, aDot, 0, linex, eq_cmd, 'c'|0x100,0, 0, 0, 0, aNo, 0, wordx, cd_cmd, 0, 0, 0, 0, 0, 0, 0, 0 }; Cmd *parsecmd(int); Addr *compoundaddr(void); Addr *simpleaddr(void); void freecmd(void); void okdelim(int); Rune line[BLOCKSIZE]; Rune termline[BLOCKSIZE]; Rune *linep = line; Rune *terminp = termline; Rune *termoutp = termline; List cmdlist = { 'p' }; List addrlist = { 'p' }; List relist = { 'p' }; List stringlist = { 'p' }; int eof; void resetcmd(void) { linep = line; *linep = 0; terminp = termoutp = termline; freecmd(); } int inputc(void) { int n, nbuf; char buf[UTFmax]; Rune r; Again: nbuf = 0; if(downloaded){ while(termoutp == terminp){ cmdupdate(); if(patset) tellpat(); while(termlocked > 0){ outT0(Hunlock); termlocked--; } if(rcv() == 0) return -1; } r = *termoutp++; if(termoutp == terminp) terminp = termoutp = termline; }else{ do{ n = read(0, buf+nbuf, 1); if(n <= 0) return -1; nbuf += n; }while(!fullrune(buf, nbuf)); chartorune(&r, buf); } if(r == 0){ warn(Wnulls); goto Again; } return r; } int inputline(void) { int i, c, start; /* * Could set linep = line and i = 0 here and just * error(Etoolong) below, but this way we keep * old input buffer history around for a while. * This is useful only for debugging. */ i = linep - line; do{ if((c = inputc())<=0) return -1; if(i == nelem(line)-1){ if(linep == line) error(Etoolong); start = linep - line; runemove(line, linep, i-start); i -= start; linep = line; } }while((line[i++]=c) != '\n'); line[i] = 0; return 1; } int getch(void) { if(eof) return -1; if(*linep==0 && inputline()<0){ eof = TRUE; return -1; } return *linep++; } int nextc(void) { if(*linep == 0) return -1; return *linep; } void ungetch(void) { if(--linep < line) panic("ungetch"); } Posn getnum(int signok) { Posn n=0; int c, sign; sign = 1; if(signok>1 && nextc()=='-'){ sign = -1; getch(); } if((c=nextc())<'0' || '9'= 0) ungetch(); return c; } void termcommand(void) { Posn p; for(p=cmdpt; pb.nc; p++){ if(terminp >= &termline[BLOCKSIZE]){ cmdpt = cmd->b.nc; error(Etoolong); } *terminp++ = filereadc(cmd, p); } cmdpt = cmd->b.nc; } void cmdloop(void) { Cmd *cmdp; File *ocurfile; int loaded; for(;;){ if(!downloaded && curfile && curfile->unread) load(curfile); if((cmdp = parsecmd(0))==0){ if(downloaded){ rescue(); exits("eof"); } break; } ocurfile = curfile; loaded = curfile && !curfile->unread; if(cmdexec(curfile, cmdp) == 0) break; freecmd(); cmdupdate(); update(); if(downloaded && curfile && (ocurfile!=curfile || (!loaded && !curfile->unread))) outTs(Hcurrent, curfile->tag); /* don't allow type ahead on files that aren't bound */ if(downloaded && curfile && curfile->rasp == 0) terminp = termoutp; } } Cmd * newcmd(void){ Cmd *p; p = emalloc(sizeof(Cmd)); inslist(&cmdlist, cmdlist.nused, (long)p); return p; } Addr* newaddr(void) { Addr *p; p = emalloc(sizeof(Addr)); inslist(&addrlist, addrlist.nused, (long)p); return p; } String* newre(void) { String *p; p = emalloc(sizeof(String)); inslist(&relist, relist.nused, (long)p); Strinit(p); return p; } String* newstring(void) { String *p; p = emalloc(sizeof(String)); inslist(&stringlist, stringlist.nused, (long)p); Strinit(p); return p; } void freecmd(void) { int i; while(cmdlist.nused > 0) free(cmdlist.voidpptr[--cmdlist.nused]); while(addrlist.nused > 0) free(addrlist.voidpptr[--addrlist.nused]); while(relist.nused > 0){ i = --relist.nused; Strclose(relist.stringpptr[i]); free(relist.stringpptr[i]); } while(stringlist.nused>0){ i = --stringlist.nused; Strclose(stringlist.stringpptr[i]); free(stringlist.stringpptr[i]); } } int lookup(int c) { int i; for(i=0; cmdtab[i].cmdc; i++) if(cmdtab[i].cmdc == c) return i; return -1; } void okdelim(int c) { if(c=='\\' || ('a'<=c && c<='z') || ('A'<=c && c<='Z') || ('0'<=c && c<='9')) error_c(Edelim, c); } void atnl(void) { skipbl(); if(getch() != '\n') error(Enewline); } void getrhs(String *s, int delim, int cmd) { int c; while((c = getch())>0 && c!=delim && c!='\n'){ if(c == '\\'){ if((c=getch()) <= 0) error(Ebadrhs); if(c == '\n'){ ungetch(); c='\\'; }else if(c == 'n') c='\n'; else if(c!=delim && (cmd=='s' || c!='\\')) /* s does its own */ Straddc(s, '\\'); } Straddc(s, c); } ungetch(); /* let client read whether delimeter, '\n' or whatever */ } String * collecttoken(char *end) { String *s = newstring(); int c; while((c=nextc())==' ' || c=='\t') Straddc(s, getch()); /* blanks significant for getname() */ while((c=getch())>0 && utfrune(end, c)==0) Straddc(s, c); Straddc(s, 0); if(c != '\n') atnl(); return s; } String * collecttext(void) { String *s = newstring(); int begline, i, c, delim; if(skipbl()=='\n'){ getch(); i = 0; do{ begline = i; while((c = getch())>0 && c!='\n') i++, Straddc(s, c); i++, Straddc(s, '\n'); if(c < 0) goto Return; }while(s->s[begline]!='.' || s->s[begline+1]!='\n'); Strdelete(s, s->n-2, s->n); }else{ okdelim(delim = getch()); getrhs(s, delim, 'a'); if(nextc()==delim) getch(); atnl(); } Return: Straddc(s, 0); /* JUST FOR CMDPRINT() */ return s; } Cmd * parsecmd(int nest) { int i, c; struct cmdtab *ct; Cmd *cp, *ncp; Cmd cmd; cmd.next = cmd.ccmd = 0; cmd.re = 0; cmd.flag = cmd.num = 0; cmd.addr = compoundaddr(); if(skipbl() == -1) return 0; if((c=getch())==-1) return 0; cmd.cmdc = c; if(cmd.cmdc=='c' && nextc()=='d'){ /* sleazy two-character case */ getch(); /* the 'd' */ cmd.cmdc='c'|0x100; } i = lookup(cmd.cmdc); if(i >= 0){ if(cmd.cmdc == '\n') goto Return; /* let nl_cmd work it all out */ ct = &cmdtab[i]; if(ct->defaddr==aNo && cmd.addr) error(Enoaddr); if(ct->count) cmd.num = getnum(ct->count); if(ct->regexp){ /* x without pattern -> .*\n, indicated by cmd.re==0 */ /* X without pattern is all files */ if((ct->cmdc!='x' && ct->cmdc!='X') || ((c = nextc())!=' ' && c!='\t' && c!='\n')){ skipbl(); if((c = getch())=='\n' || c<0) error(Enopattern); okdelim(c); cmd.re = getregexp(c); if(ct->cmdc == 's'){ cmd.ctext = newstring(); getrhs(cmd.ctext, c, 's'); if(nextc() == c){ getch(); if(nextc() == 'g') cmd.flag = getch(); } } } } if(ct->addr && (cmd.caddr=simpleaddr())==0) error(Eaddress); if(ct->defcmd){ if(skipbl() == '\n'){ getch(); cmd.ccmd = newcmd(); cmd.ccmd->cmdc = ct->defcmd; }else if((cmd.ccmd = parsecmd(nest))==0) panic("defcmd"); }else if(ct->text) cmd.ctext = collecttext(); else if(ct->token) cmd.ctext = collecttoken(ct->token); else atnl(); }else switch(cmd.cmdc){ case '{': cp = 0; do{ if(skipbl()=='\n') getch(); ncp = parsecmd(nest+1); if(cp) cp->next = ncp; else cmd.ccmd = ncp; }while(cp = ncp); break; case '}': atnl(); if(nest==0) error(Enolbrace); return 0; default: error_c(Eunk, cmd.cmdc); } Return: cp = newcmd(); *cp = cmd; return cp; } String* /* BUGGERED */ getregexp(int delim) { String *r = newre(); int c; for(Strzero(&genstr); ; Straddc(&genstr, c)) if((c = getch())=='\\'){ if(nextc()==delim) c = getch(); else if(nextc()=='\\'){ Straddc(&genstr, c); c = getch(); } }else if(c==delim || c=='\n') break; if(c!=delim && c) ungetch(); if(genstr.n > 0){ patset = TRUE; Strduplstr(&lastpat, &genstr); Straddc(&lastpat, '\0'); } if(lastpat.n <= 1) error(Epattern); Strduplstr(r, &lastpat); return r; } Addr * simpleaddr(void) { Addr addr; Addr *ap, *nap; addr.next = 0; addr.left = 0; addr.num = 0; switch(skipbl()){ case '#': addr.type = getch(); addr.num = getnum(1); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': addr.num = getnum(1); addr.type='l'; break; case '/': case '?': case '"': addr.are = getregexp(addr.type = getch()); break; case '.': case '$': case '+': case '-': case '\'': addr.type = getch(); break; default: return 0; } if(addr.next = simpleaddr()) switch(addr.next->type){ case '.': case '$': case '\'': if(addr.type!='"') case '"': error(Eaddress); break; case 'l': case '#': if(addr.type=='"') break; /* fall through */ case '/': case '?': if(addr.type!='+' && addr.type!='-'){ /* insert the missing '+' */ nap = newaddr(); nap->type='+'; nap->next = addr.next; addr.next = nap; } break; case '+': case '-': break; default: panic("simpleaddr"); } ap = newaddr(); *ap = addr; return ap; } Addr * compoundaddr(void) { Addr addr; Addr *ap, *next; addr.left = simpleaddr(); if((addr.type = skipbl())!=',' && addr.type!=';') return addr.left; getch(); next = addr.next = compoundaddr(); if(next && (next->type==',' || next->type==';') && next->left==0) error(Eaddress); ap = newaddr(); *ap = addr; return ap; } 9base-6/sam/err0000644000175000017500000000427411402154555013050 0ustar anselmanselmaddress.c: In function `filematch': address.c:159: warning: passing arg 1 of `bufreset' from incompatible pointer type address.c:160: warning: passing arg 1 of `bufinsert' from incompatible pointer type file.c: In function `mergeextend': file.c:117: warning: passing arg 1 of `bufread' from incompatible pointer type file.c: In function `fileinsert': file.c:275: warning: passing arg 1 of `bufinsert' from incompatible pointer type file.c: In function `filedelete': file.c:301: warning: passing arg 1 of `bufdelete' from incompatible pointer type file.c: In function `fileundelete': file.c:324: warning: passing arg 1 of `bufread' from incompatible pointer type file.c: In function `filereadc': file.c:339: warning: passing arg 1 of `bufread' from incompatible pointer type file.c: In function `fileload': file.c:405: warning: passing arg 1 of `bufload' from incompatible pointer type file.c: In function `fileundo': file.c:528: warning: passing arg 1 of `bufdelete' from incompatible pointer type file.c:546: warning: passing arg 1 of `bufinsert' from incompatible pointer type file.c: In function `fileclose': file.c:604: warning: passing arg 1 of `bufclose' from incompatible pointer type io.c: In function `readio': io.c:90: warning: passing arg 1 of `bufload' from incompatible pointer type io.c: In function `writeio': io.c:152: warning: passing arg 1 of `bufread' from incompatible pointer type mesg.c: In function `inmesg': mesg.c:248: warning: passing arg 1 of `bufread' from incompatible pointer type mesg.c: In function `snarf': mesg.c:568: warning: passing arg 1 of `bufread' from incompatible pointer type mesg.c: In function `setgenstr': mesg.c:612: warning: passing arg 1 of `bufread' from incompatible pointer type sam.c: In function `readcmd': sam.c:496: warning: passing arg 1 of `bufread' from incompatible pointer type sam.c: In function `copy': sam.c:676: warning: passing arg 1 of `bufread' from incompatible pointer type xec.c: In function `s_cmd': xec.c:234: warning: passing arg 1 of `bufread' from incompatible pointer type xec.c:243: warning: passing arg 1 of `bufread' from incompatible pointer type xec.c: In function `display': xec.c:401: warning: passing arg 1 of `bufread' from incompatible pointer type 9base-6/sam/sam.c0000644000175000017500000003042711402154555013260 0ustar anselmanselm#include "sam.h" Rune genbuf[BLOCKSIZE]; int io; int panicking; int rescuing; String genstr; String rhs; String curwd; String cmdstr; Rune empty[] = { 0 }; char *genc; File *curfile; File *flist; File *cmd; jmp_buf mainloop; List tempfile = { 'p' }; int quitok = TRUE; int downloaded; int dflag; int Rflag; char *machine; char *home; int bpipeok; int termlocked; char *samterm = SAMTERM; char *rsamname = RSAM; File *lastfile; Disk *disk; long seq; char *winsize; Rune baddir[] = { '<', 'b', 'a', 'd', 'd', 'i', 'r', '>', '\n'}; void usage(void); extern int notify(void(*)(void*,char*)); void main(int _argc, char **_argv) { volatile int i, argc; char **volatile argv; String *t; char *termargs[10], **ap; argc = _argc; argv = _argv; ap = termargs; *ap++ = "samterm"; ARGBEGIN{ case 'd': dflag++; break; case 'r': machine = EARGF(usage()); break; case 'R': Rflag++; break; case 't': samterm = EARGF(usage()); break; case 's': rsamname = EARGF(usage()); break; default: dprint("sam: unknown flag %c\n", ARGC()); usage(); /* options for samterm */ case 'a': *ap++ = "-a"; break; case 'W': *ap++ = "-W"; *ap++ = EARGF(usage()); break; }ARGEND *ap = nil; Strinit(&cmdstr); Strinit0(&lastpat); Strinit0(&lastregexp); Strinit0(&genstr); Strinit0(&rhs); Strinit0(&curwd); Strinit0(&plan9cmd); home = getenv(HOME); disk = diskinit(); if(home == 0) home = "/"; if(!dflag) startup(machine, Rflag, termargs, (char**)argv); notify(notifyf); getcurwd(); if(argc>0){ for(i=0; ib.nc==0 || !fileisdirty(f)) continue; if(io == -1){ sprint(buf, "%s/sam.save", home); io = create(buf, 1, 0777); if(io<0) return; } if(f->name.s[0]){ c = Strtoc(&f->name); strncpy(buf, c, sizeof buf-1); buf[sizeof buf-1] = 0; free(c); }else sprint(buf, "nameless.%d", nblank++); root = getenv("PLAN9"); if(root == nil) root = "/usr/local/plan9"; fprint(io, "#!/bin/sh\n%s/bin/samsave '%s' $* <<'---%s'\n", root, buf, buf); addr.r.p1 = 0, addr.r.p2 = f->b.nc; writeio(f); fprint(io, "\n---%s\n", (char *)buf); } } void panic(char *s) { int wasd; if(!panicking++ && !setjmp(mainloop)){ wasd = downloaded; downloaded = 0; dprint("sam: panic: %s: %r\n", s); if(wasd) fprint(2, "sam: panic: %s: %r\n", s); rescue(); abort(); } } void hiccough(char *s) { File *f; int i; if(rescuing) exits("rescue"); if(s) dprint("%s\n", s); resetcmd(); resetxec(); resetsys(); if(io > 0) close(io); /* * back out any logged changes & restore old sequences */ for(i=0; iseq==seq){ bufdelete(&f->epsilon, 0, f->epsilon.nc); f->seq = f->prevseq; f->dot.r = f->prevdot; f->mark = f->prevmark; state(f, f->prevmod ? Dirty: Clean); } } update(); if (curfile) { if (curfile->unread) curfile->unread = FALSE; else if (downloaded) outTs(Hcurrent, curfile->tag); } longjmp(mainloop, 1); } void intr(void) { error(Eintr); } void trytoclose(File *f) { char *t; char buf[256]; if(f == cmd) /* possible? */ return; if(f->deleted) return; if(fileisdirty(f) && !f->closeok){ f->closeok = TRUE; if(f->name.s[0]){ t = Strtoc(&f->name); strncpy(buf, t, sizeof buf-1); free(t); }else strcpy(buf, "nameless file"); error_s(Emodified, buf); } f->deleted = TRUE; } void trytoquit(void) { int c; File *f; if(!quitok){ for(c = 0; cname); filename(f); if(f->name.s[0]){ saveaddr = addr; edit(f, 'I'); addr = saveaddr; }else{ f->unread = 0; f->cleanseq = f->seq; } fileupdate(f, TRUE, TRUE); } void cmdupdate(void) { if(cmd && cmd->seq!=0){ fileupdate(cmd, FALSE, downloaded); cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc; telldot(cmd); } } void delete(File *f) { if(downloaded && f->rasp) outTs(Hclose, f->tag); delfile(f); if(f == curfile) current(0); } void update(void) { int i, anymod; File *f; settempfile(); for(anymod = i=0; ideleted) { delete(f); continue; } if(f->seq==seq && fileupdate(f, FALSE, downloaded)) anymod++; if(f->rasp) telldot(f); } if(anymod) seq++; } File * current(File *f) { return curfile = f; } void edit(File *f, int cmd) { int empty = TRUE; Posn p; int nulls; if(cmd == 'r') logdelete(f, addr.r.p1, addr.r.p2); if(cmd=='e' || cmd=='I'){ logdelete(f, (Posn)0, f->b.nc); addr.r.p2 = f->b.nc; }else if(f->b.nc!=0 || (f->name.s[0] && Strcmp(&genstr, &f->name)!=0)) empty = FALSE; if((io = open(genc, OREAD))<0) { if (curfile && curfile->unread) curfile->unread = FALSE; error_r(Eopen, genc); } p = readio(f, &nulls, empty, TRUE); closeio((cmd=='e' || cmd=='I')? -1 : p); if(cmd == 'r') f->ndot.r.p1 = addr.r.p2, f->ndot.r.p2 = addr.r.p2+p; else f->ndot.r.p1 = f->ndot.r.p2 = 0; f->closeok = empty; if (quitok) quitok = empty; else quitok = FALSE; state(f, empty && !nulls? Clean : Dirty); if(empty && !nulls) f->cleanseq = f->seq; if(cmd == 'e') filename(f); } int getname(File *f, String *s, int save) { int c, i; Strzero(&genstr); if(genc){ free(genc); genc = 0; } if(s==0 || (c = s->s[0])==0){ /* no name provided */ if(f) Strduplstr(&genstr, &f->name); goto Return; } if(c!=' ' && c!='\t') error(Eblank); for(i=0; (c=s->s[i])==' ' || c=='\t'; i++) ; while(s->s[i] > ' ') Straddc(&genstr, s->s[i++]); if(s->s[i]) error(Enewline); fixname(&genstr); if(f && (save || f->name.s[0]==0)){ logsetname(f, &genstr); if(Strcmp(&f->name, &genstr)){ quitok = f->closeok = FALSE; f->qidpath = 0; f->mtime = 0; state(f, Dirty); /* if it's 'e', fix later */ } } Return: genc = Strtoc(&genstr); i = genstr.n; if(i && genstr.s[i-1]==0) i--; return i; /* strlen(name) */ } void filename(File *f) { if(genc) free(genc); genc = Strtoc(&genstr); dprint("%c%c%c %s\n", " '"[f->mod], "-+"[f->rasp!=0], " ."[f==curfile], genc); } void undostep(File *f, int isundo) { uint p1, p2; int mod; mod = f->mod; fileundo(f, isundo, 1, &p1, &p2, TRUE); f->ndot = f->dot; if(f->mod){ f->closeok = 0; quitok = 0; }else f->closeok = 1; if(f->mod != mod){ f->mod = mod; if(mod) mod = Clean; else mod = Dirty; state(f, mod); } } int undo(int isundo) { File *f; int i; Mod max; max = undoseq(curfile, isundo); if(max == 0) return 0; settempfile(); for(i = 0; ib.nc; retcode = plan9(flist, '<', s, FALSE); fileupdate(flist, FALSE, FALSE); flist->seq = 0; if (flist->b.nc > BLOCKSIZE) error(Etoolong); Strzero(&genstr); Strinsure(&genstr, flist->b.nc); bufread(&flist->b, (Posn)0, genbuf, flist->b.nc); memmove(genstr.s, genbuf, flist->b.nc*RUNESIZE); genstr.n = flist->b.nc; Straddc(&genstr, '\0'); return retcode; } void getcurwd(void) { String *t; char buf[256]; buf[0] = 0; getwd(buf, sizeof(buf)); t = tmpcstr(buf); Strduplstr(&curwd, t); freetmpstr(t); if(curwd.n == 0) warn(Wpwd); else if(curwd.s[curwd.n-1] != '/') Straddc(&curwd, '/'); } void cd(String *str) { int i, fd; char *s; File *f; String owd; getcurwd(); if(getname((File *)0, str, FALSE)) s = genc; else s = home; if(chdir(s)) syserror("chdir"); fd = open("/dev/wdir", OWRITE); if(fd > 0) write(fd, s, strlen(s)); dprint("!\n"); Strinit(&owd); Strduplstr(&owd, &curwd); getcurwd(); settempfile(); /* * Two passes so that if we have open * /a/foo.c and /b/foo.c and cd from /b to /a, * we don't ever have two foo.c simultaneously. */ for(i=0; iname.s[0]!='/' && f->name.s[0]!=0){ Strinsert(&f->name, &owd, (Posn)0); fixname(&f->name); sortname(f); } } for(i=0; iname)){ fixname(&f->name); sortname(f); } } Strclose(&owd); } int loadflist(String *s) { int c, i; c = s->s[0]; for(i = 0; s->s[i]==' ' || s->s[i]=='\t'; i++) ; if((c==' ' || c=='\t') && s->s[i]!='\n'){ if(s->s[i]=='<'){ Strdelete(s, 0L, (long)i+1); readcmd(s); }else{ Strzero(&genstr); while((c = s->s[i++]) && c!='\n') Straddc(&genstr, c); Straddc(&genstr, '\0'); } }else{ if(c != '\n') error(Eblank); Strdupl(&genstr, empty); } if(genc) free(genc); genc = Strtoc(&genstr); return genstr.s[0]; } File * readflist(int readall, int delete) { Posn i; int c; File *f; String t; Strinit(&t); for(i=0,f=0; f==0 || readall || delete; i++){ /* ++ skips blank */ Strdelete(&genstr, (Posn)0, i); for(i=0; (c = genstr.s[i])==' ' || c=='\t' || c=='\n'; i++) ; if(i >= genstr.n) break; Strdelete(&genstr, (Posn)0, i); for(i=0; (c=genstr.s[i]) && c!=' ' && c!='\t' && c!='\n'; i++) ; if(i == 0) break; genstr.s[i] = 0; Strduplstr(&t, tmprstr(genstr.s, i+1)); fixname(&t); f = lookfile(&t); if(delete){ if(f == 0) warn_S(Wfile, &t); else trytoclose(f); }else if(f==0 && readall) logsetname(f = newfile(), &t); } Strclose(&t); return f; } File * tofile(String *s) { File *f; if(s->s[0] != ' ') error(Eblank); if(loadflist(s) == 0){ f = lookfile(&genstr); /* empty string ==> nameless file */ if(f == 0) error_s(Emenu, genc); }else if((f=readflist(FALSE, FALSE)) == 0) error_s(Emenu, genc); return current(f); } File * getfile(String *s) { File *f; if(loadflist(s) == 0) logsetname(f = newfile(), &genstr); else if((f=readflist(TRUE, FALSE)) == 0) error(Eblank); return current(f); } void closefiles(File *f, String *s) { if(s->s[0] == 0){ if(f == 0) error(Enofile); trytoclose(f); return; } if(s->s[0] != ' ') error(Eblank); if(loadflist(s) == 0) error(Enewline); readflist(FALSE, TRUE); } void copy(File *f, Address addr2) { Posn p; int ni; for(p=addr.r.p1; p BLOCKSIZE) ni = BLOCKSIZE; bufread(&f->b, p, genbuf, ni); loginsert(addr2.f, addr2.r.p2, tmprstr(genbuf, ni)->s, ni); } addr2.f->ndot.r.p2 = addr2.r.p2+(f->dot.r.p2-f->dot.r.p1); addr2.f->ndot.r.p1 = addr2.r.p2; } void move(File *f, Address addr2) { if(addr.r.p2 <= addr2.r.p2){ logdelete(f, addr.r.p1, addr.r.p2); copy(f, addr2); }else if(addr.r.p1 >= addr2.r.p2){ copy(f, addr2); logdelete(f, addr.r.p1, addr.r.p2); }else error(Eoverlap); } Posn nlcount(File *f, Posn p0, Posn p1) { Posn nl = 0; while(p0 < p1) if(filereadc(f, p0++)=='\n') nl++; return nl; } void printposn(File *f, int charsonly) { Posn l1, l2; if(!charsonly){ l1 = 1+nlcount(f, (Posn)0, addr.r.p1); l2 = l1+nlcount(f, addr.r.p1, addr.r.p2); /* check if addr ends with '\n' */ if(addr.r.p2>0 && addr.r.p2>addr.r.p1 && filereadc(f, addr.r.p2-1)=='\n') --l2; dprint("%lud", l1); if(l2 != l1) dprint(",%lud", l2); dprint("; "); } dprint("#%lud", addr.r.p1); if(addr.r.p2 != addr.r.p1) dprint(",#%lud", addr.r.p2); dprint("\n"); } void settempfile(void) { if(tempfile.nalloc < file.nused){ if(tempfile.filepptr) free(tempfile.filepptr); tempfile.filepptr = emalloc(sizeof(File*)*file.nused); tempfile.nalloc = file.nused; } memmove(tempfile.filepptr, file.filepptr, sizeof(File*)*file.nused); tempfile.nused = file.nused; } 9base-6/sam/_libc.h0000644000175000017500000000122411402154555013546 0ustar anselmanselm#define __USE_UNIX98 // for pread/pwrite, supposedly #include #include #include #include #include #include #include #include #include #include #include "utf.h" #include "fmt.h" #define nil 0 #define dup dup2 #define exec execv #define seek lseek #define getwd getcwd #define USED(a) #define SET(a) enum { OREAD = 0, OWRITE = 1, ORDWR = 2, OCEXEC = 4, ORCLOSE = 8 }; enum { ERRMAX = 255 }; void exits(const char *); void _exits(const char *); int notify (void(*f)(void *, char *)); int create(char *, int, int); int errstr(char *, int); 9base-6/sam/unix.c0000644000175000017500000000773111402154555013465 0ustar anselmanselm#include #include #include #include #include #include #include #include #include "sam.h" Rune samname[] = { '~', '~', 's', 'a', 'm', '~', '~', 0 }; static Rune l1[] = { '{', '[', '(', '<', 0253, 0}; static Rune l2[] = { '\n', 0}; static Rune l3[] = { '\'', '"', '`', 0}; Rune *left[]= { l1, l2, l3, 0}; static Rune r1[] = {'}', ']', ')', '>', 0273, 0}; static Rune r2[] = {'\n', 0}; static Rune r3[] = {'\'', '"', '`', 0}; Rune *right[]= { r1, r2, r3, 0}; #ifndef SAMTERMNAME #define SAMTERMNAME "samterm" #endif #ifndef TMPDIRNAME #define TMPDIRNAME "/tmp" #endif #ifndef SHNAME #define SHNAME "sh" #endif #ifndef SHPATHNAME #define SHPATHNAME "/bin/sh" #endif #ifndef RXNAME #define RXNAME "ssh" #endif #ifndef RXPATHNAME #define RXPATHNAME "ssh" #endif char RSAM[] = "sam"; char SAMTERM[] = SAMTERMNAME; char HOME[] = "HOME"; char TMPDIR[] = TMPDIRNAME; char SH[] = SHNAME; char SHPATH[] = SHPATHNAME; char RX[] = RXNAME; char RXPATH[] = RXPATHNAME; void dprint(char *z, ...) { char buf[BLOCKSIZE]; va_list arg; va_start(arg, z); vseprint(buf, &buf[BLOCKSIZE], z, arg); va_end(arg); termwrite(buf); } void print_ss(char *s, String *a, String *b) { dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s); } void print_s(char *s, String *a) { dprint("?warning: %s `%.*S'\n", s, a->n, a->s); } char* getuser(void) { static char user[64]; if(user[0] == 0){ struct passwd *pw = getpwuid(getuid()); strcpy(user, pw ? pw->pw_name : "nobody"); } return user; } int statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) { struct stat dirb; if (stat(name, &dirb) == -1) return -1; if (dev) *dev = dirb.st_dev; if (id) *id = dirb.st_ino; if (time) *time = dirb.st_mtime; if (length) *length = dirb.st_size; if(appendonly) *appendonly = 0; return 1; } int statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) { struct stat dirb; if (fstat(fd, &dirb) == -1) return -1; if (dev) *dev = dirb.st_dev; if (id) *id = dirb.st_ino; if (time) *time = dirb.st_mtime; if (length) *length = dirb.st_size; if(appendonly) *appendonly = 0; return 1; } void hup(int sig) { panicking = 1; /* ??? */ rescue(); exit(1); } int notify(void(*f)(void *, char *)) { signal(SIGINT, SIG_IGN); signal(SIGPIPE, SIG_IGN); /* XXX - bpipeok? */ signal(SIGHUP, hup); return 1; } void notifyf(void *a, char *b) /* never called; hup is instead */ { } static int temp_file(char *buf, int bufsize) { char *tmp; int n, fd; tmp = getenv("TMPDIR"); if (!tmp) tmp = TMPDIR; n = snprint(buf, bufsize, "%s/sam.%d.XXXXXXX", tmp, getuid()); if (bufsize <= n) return -1; if ((fd = mkstemp(buf)) < 0) /* SES - linux sometimes uses mode 0666 */ return -1; if (fcntl(fd, F_SETFD, fcntl(fd,F_GETFD,0) | FD_CLOEXEC) < 0) return -1; return fd; } int tempdisk(void) { char buf[4096]; int fd = temp_file(buf, sizeof buf); if (fd >= 0) remove(buf); return fd; } #undef waitfor int samwaitfor(int pid) { int r; Waitmsg *w; w = p9waitfor(pid); if(w == nil) return -1; r = atoi(w->msg); free(w); return r; } void samerr(char *buf) { sprint(buf, "%s/sam.%s.err", TMPDIR, getuser()); } void* emalloc(ulong n) { void *p; p = malloc(n); if(p == 0) panic("malloc fails"); memset(p, 0, n); return p; } void* erealloc(void *p, ulong n) { p = realloc(p, n); if(p == 0) panic("realloc fails"); return p; } 9base-6/sam/regexp.c0000644000175000017500000003613511402154555013774 0ustar anselmanselm#include "sam.h" Rangeset sel; String lastregexp; /* * Machine Information */ typedef struct Inst Inst; struct Inst { long type; /* < 0x10000 ==> literal, otherwise action */ union { int rsid; int rsubid; int class; struct Inst *rother; struct Inst *rright; } r; union{ struct Inst *lleft; struct Inst *lnext; } l; }; #define sid r.rsid #define subid r.rsubid #define rclass r.class #define other r.rother #define right r.rright #define left l.lleft #define next l.lnext #define NPROG 1024 Inst program[NPROG]; Inst *progp; Inst *startinst; /* First inst. of program; might not be program[0] */ Inst *bstartinst; /* same for backwards machine */ typedef struct Ilist Ilist; struct Ilist { Inst *inst; /* Instruction of the thread */ Rangeset se; Posn startp; /* first char of match */ }; #define NLIST 127 Ilist *tl, *nl; /* This list, next list */ Ilist list[2][NLIST+1]; /* +1 for trailing null */ static Rangeset sempty; /* * Actions and Tokens * * 0x100xx are operators, value == precedence * 0x200xx are tokens, i.e. operands for operators */ #define OPERATOR 0x10000 /* Bitmask of all operators */ #define START 0x10000 /* Start, used for marker on stack */ #define RBRA 0x10001 /* Right bracket, ) */ #define LBRA 0x10002 /* Left bracket, ( */ #define OR 0x10003 /* Alternation, | */ #define CAT 0x10004 /* Concatentation, implicit operator */ #define STAR 0x10005 /* Closure, * */ #define PLUS 0x10006 /* a+ == aa* */ #define QUEST 0x10007 /* a? == a|nothing, i.e. 0 or 1 a's */ #define ANY 0x20000 /* Any character but newline, . */ #define NOP 0x20001 /* No operation, internal use only */ #define BOL 0x20002 /* Beginning of line, ^ */ #define EOL 0x20003 /* End of line, $ */ #define CCLASS 0x20004 /* Character class, [] */ #define NCCLASS 0x20005 /* Negated character class, [^] */ #define END 0x20077 /* Terminate: match found */ #define ISATOR 0x10000 #define ISAND 0x20000 /* * Parser Information */ typedef struct Node Node; struct Node { Inst *first; Inst *last; }; #define NSTACK 20 Node andstack[NSTACK]; Node *andp; int atorstack[NSTACK]; int *atorp; int lastwasand; /* Last token was operand */ int cursubid; int subidstack[NSTACK]; int *subidp; int backwards; int nbra; Rune *exprp; /* pointer to next character in source expression */ #define DCLASS 10 /* allocation increment */ int nclass; /* number active */ int Nclass; /* high water mark */ Rune **class; int negateclass; int addinst(Ilist *l, Inst *inst, Rangeset *sep); void newmatch(Rangeset*); void bnewmatch(Rangeset*); void pushand(Inst*, Inst*); void pushator(int); Node *popand(int); int popator(void); void startlex(Rune*); int lex(void); void operator(int); void operand(int); void evaluntil(int); void optimize(Inst*); void bldcclass(void); void regerror(Err e) { Strzero(&lastregexp); error(e); } void regerror_c(Err e, int c) { Strzero(&lastregexp); error_c(e, c); } Inst * newinst(int t) { if(progp >= &program[NPROG]) regerror(Etoolong); progp->type = t; progp->left = 0; progp->right = 0; return progp++; } Inst * realcompile(Rune *s) { int token; startlex(s); atorp = atorstack; andp = andstack; subidp = subidstack; cursubid = 0; lastwasand = FALSE; /* Start with a low priority operator to prime parser */ pushator(START-1); while((token=lex()) != END){ if((token&ISATOR) == OPERATOR) operator(token); else operand(token); } /* Close with a low priority operator */ evaluntil(START); /* Force END */ operand(END); evaluntil(START); if(nbra) regerror(Eleftpar); --andp; /* points to first and only operand */ return andp->first; } void compile(String *s) { int i; Inst *oprogp; if(Strcmp(s, &lastregexp)==0) return; for(i=0; is); optimize(program); oprogp = progp; backwards = TRUE; bstartinst = realcompile(s->s); optimize(oprogp); Strduplstr(&lastregexp, s); } void operand(int t) { Inst *i; if(lastwasand) operator(CAT); /* catenate is implicit */ i = newinst(t); if(t == CCLASS){ if(negateclass) i->type = NCCLASS; /* UGH */ i->rclass = nclass-1; /* UGH */ } pushand(i, i); lastwasand = TRUE; } void operator(int t) { if(t==RBRA && --nbra<0) regerror(Erightpar); if(t==LBRA){ /* * if(++cursubid >= NSUBEXP) * regerror(Esubexp); */ cursubid++; /* silently ignored */ nbra++; if(lastwasand) operator(CAT); }else evaluntil(t); if(t!=RBRA) pushator(t); lastwasand = FALSE; if(t==STAR || t==QUEST || t==PLUS || t==RBRA) lastwasand = TRUE; /* these look like operands */ } void cant(char *s) { char buf[100]; sprint(buf, "regexp: can't happen: %s", s); panic(buf); } void pushand(Inst *f, Inst *l) { if(andp >= &andstack[NSTACK]) cant("operand stack overflow"); andp->first = f; andp->last = l; andp++; } void pushator(int t) { if(atorp >= &atorstack[NSTACK]) cant("operator stack overflow"); *atorp++=t; if(cursubid >= NSUBEXP) *subidp++= -1; else *subidp++=cursubid; } Node * popand(int op) { if(andp <= &andstack[0]) if(op) regerror_c(Emissop, op); else regerror(Ebadregexp); return --andp; } int popator(void) { if(atorp <= &atorstack[0]) cant("operator stack underflow"); --subidp; return *--atorp; } void evaluntil(int pri) { Node *op1, *op2, *t; Inst *inst1, *inst2; while(pri==RBRA || atorp[-1]>=pri){ switch(popator()){ case LBRA: op1 = popand('('); inst2 = newinst(RBRA); inst2->subid = *subidp; op1->last->next = inst2; inst1 = newinst(LBRA); inst1->subid = *subidp; inst1->next = op1->first; pushand(inst1, inst2); return; /* must have been RBRA */ default: panic("unknown regexp operator"); break; case OR: op2 = popand('|'); op1 = popand('|'); inst2 = newinst(NOP); op2->last->next = inst2; op1->last->next = inst2; inst1 = newinst(OR); inst1->right = op1->first; inst1->left = op2->first; pushand(inst1, inst2); break; case CAT: op2 = popand(0); op1 = popand(0); if(backwards && op2->first->type!=END) t = op1, op1 = op2, op2 = t; op1->last->next = op2->first; pushand(op1->first, op2->last); break; case STAR: op2 = popand('*'); inst1 = newinst(OR); op2->last->next = inst1; inst1->right = op2->first; pushand(inst1, inst1); break; case PLUS: op2 = popand('+'); inst1 = newinst(OR); op2->last->next = inst1; inst1->right = op2->first; pushand(op2->first, inst1); break; case QUEST: op2 = popand('?'); inst1 = newinst(OR); inst2 = newinst(NOP); inst1->left = inst2; inst1->right = op2->first; op2->last->next = inst2; pushand(inst1, inst2); break; } } } void optimize(Inst *start) { Inst *inst, *target; for(inst=start; inst->type!=END; inst++){ target = inst->next; while(target->type == NOP) target = target->next; inst->next = target; } } #ifdef DEBUG void dumpstack(void){ Node *stk; int *ip; dprint("operators\n"); for(ip = atorstack; ipfirst->type, stk->last->type); } void dump(void){ Inst *l; l = program; do{ dprint("%d:\t0%o\t%d\t%d\n", l-program, l->type, l->left-program, l->right-program); }while(l++->type); } #endif void startlex(Rune *s) { exprp = s; nbra = 0; } int lex(void){ int c= *exprp++; switch(c){ case '\\': if(*exprp) if((c= *exprp++)=='n') c='\n'; break; case 0: c = END; --exprp; /* In case we come here again */ break; case '*': c = STAR; break; case '?': c = QUEST; break; case '+': c = PLUS; break; case '|': c = OR; break; case '.': c = ANY; break; case '(': c = LBRA; break; case ')': c = RBRA; break; case '^': c = BOL; break; case '$': c = EOL; break; case '[': c = CCLASS; bldcclass(); break; } return c; } long nextrec(void){ if(exprp[0]==0 || (exprp[0]=='\\' && exprp[1]==0)) regerror(Ebadclass); if(exprp[0] == '\\'){ exprp++; if(*exprp=='n'){ exprp++; return '\n'; } return *exprp++|0x10000; } return *exprp++; } void bldcclass(void) { long c1, c2, n, na; Rune *classp; classp = emalloc(DCLASS*RUNESIZE); n = 0; na = DCLASS; /* we have already seen the '[' */ if(*exprp == '^'){ classp[n++] = '\n'; /* don't match newline in negate case */ negateclass = TRUE; exprp++; }else negateclass = FALSE; while((c1 = nextrec()) != ']'){ if(c1 == '-'){ Error: free(classp); regerror(Ebadclass); } if(n+4 >= na){ /* 3 runes plus NUL */ na += DCLASS; classp = erealloc(classp, na*RUNESIZE); } if(*exprp == '-'){ exprp++; /* eat '-' */ if((c2 = nextrec()) == ']') goto Error; classp[n+0] = Runemax; classp[n+1] = c1; classp[n+2] = c2; n += 3; }else classp[n++] = c1; } classp[n] = 0; if(nclass == Nclass){ Nclass += DCLASS; class = erealloc(class, Nclass*sizeof(Rune*)); } class[nclass++] = classp; } int classmatch(int classno, int c, int negate) { Rune *p; p = class[classno]; while(*p){ if(*p == Runemax){ if(p[1]<=c && c<=p[2]) return !negate; p += 3; }else if(*p++ == c) return !negate; } return negate; } /* * Note optimization in addinst: * *l must be pending when addinst called; if *l has been looked * at already, the optimization is a bug. */ int addinst(Ilist *l, Inst *inst, Rangeset *sep) { Ilist *p; for(p = l; p->inst; p++){ if(p->inst==inst){ if((sep)->p[0].p1 < p->se.p[0].p1) p->se= *sep; /* this would be bug */ return 0; /* It's already there */ } } p->inst = inst; p->se= *sep; (p+1)->inst = 0; return 1; } int execute(File *f, Posn startp, Posn eof) { int flag = 0; Inst *inst; Ilist *tlp; Posn p = startp; int nnl = 0, ntl; int c; int wrapped = 0; int startchar = startinst->typetype : 0; list[0][0].inst = list[1][0].inst = 0; sel.p[0].p1 = -1; /* Execute machine once for each character */ for(;;p++){ doloop: c = filereadc(f, p); if(p>=eof || c<0){ switch(wrapped++){ case 0: /* let loop run one more click */ case 2: break; case 1: /* expired; wrap to beginning */ if(sel.p[0].p1>=0 || eof!=INFINITY) goto Return; list[0][0].inst = list[1][0].inst = 0; p = 0; goto doloop; default: goto Return; } }else if(((wrapped && p>=startp) || sel.p[0].p1>0) && nnl==0) break; /* fast check for first char */ if(startchar && nnl==0 && c!=startchar) continue; tl = list[flag]; nl = list[flag^=1]; nl->inst = 0; ntl = nnl; nnl = 0; if(sel.p[0].p1<0 && (!wrapped || p= NLIST) Overflow: error(Eoverflow); } /* Execute machine until this list is empty */ for(tlp = tl; inst = tlp->inst; tlp++){ /* assignment = */ Switchstmt: switch(inst->type){ default: /* regular character */ if(inst->type==c){ Addinst: if(addinst(nl, inst->next, &tlp->se)) if(++nnl >= NLIST) goto Overflow; } break; case LBRA: if(inst->subid>=0) tlp->se.p[inst->subid].p1 = p; inst = inst->next; goto Switchstmt; case RBRA: if(inst->subid>=0) tlp->se.p[inst->subid].p2 = p; inst = inst->next; goto Switchstmt; case ANY: if(c!='\n') goto Addinst; break; case BOL: if(p==0 || filereadc(f, p - 1)=='\n'){ Step: inst = inst->next; goto Switchstmt; } break; case EOL: if(c == '\n') goto Step; break; case CCLASS: if(c>=0 && classmatch(inst->rclass, c, 0)) goto Addinst; break; case NCCLASS: if(c>=0 && classmatch(inst->rclass, c, 1)) goto Addinst; break; case OR: /* evaluate right choice later */ if(addinst(tl, inst->right, &tlp->se)) if(++ntl >= NLIST) goto Overflow; /* efficiency: advance and re-evaluate */ inst = inst->left; goto Switchstmt; case END: /* Match! */ tlp->se.p[0].p2 = p; newmatch(&tlp->se); break; } } } Return: return sel.p[0].p1>=0; } void newmatch(Rangeset *sp) { int i; if(sel.p[0].p1<0 || sp->p[0].p1p[0].p1==sel.p[0].p1 && sp->p[0].p2>sel.p[0].p2)) for(i = 0; ip[i]; } int bexecute(File *f, Posn startp) { int flag = 0; Inst *inst; Ilist *tlp; Posn p = startp; int nnl = 0, ntl; int c; int wrapped = 0; int startchar = bstartinst->typetype : 0; list[0][0].inst = list[1][0].inst = 0; sel.p[0].p1= -1; /* Execute machine once for each character, including terminal NUL */ for(;;--p){ doloop: if((c = filereadc(f, p - 1))==-1){ switch(wrapped++){ case 0: /* let loop run one more click */ case 2: break; case 1: /* expired; wrap to end */ if(sel.p[0].p1>=0) case 3: goto Return; list[0][0].inst = list[1][0].inst = 0; p = f->b.nc; goto doloop; default: goto Return; } }else if(((wrapped && p<=startp) || sel.p[0].p1>0) && nnl==0) break; /* fast check for first char */ if(startchar && nnl==0 && c!=startchar) continue; tl = list[flag]; nl = list[flag^=1]; nl->inst = 0; ntl = nnl; nnl = 0; if(sel.p[0].p1<0 && (!wrapped || p>startp)){ /* Add first instruction to this list */ /* the minus is so the optimizations in addinst work */ sempty.p[0].p1 = -p; if(addinst(tl, bstartinst, &sempty)) if(++ntl >= NLIST) Overflow: error(Eoverflow); } /* Execute machine until this list is empty */ for(tlp = tl; inst = tlp->inst; tlp++){ /* assignment = */ Switchstmt: switch(inst->type){ default: /* regular character */ if(inst->type == c){ Addinst: if(addinst(nl, inst->next, &tlp->se)) if(++nnl >= NLIST) goto Overflow; } break; case LBRA: if(inst->subid>=0) tlp->se.p[inst->subid].p1 = p; inst = inst->next; goto Switchstmt; case RBRA: if(inst->subid >= 0) tlp->se.p[inst->subid].p2 = p; inst = inst->next; goto Switchstmt; case ANY: if(c != '\n') goto Addinst; break; case BOL: if(c=='\n' || p==0){ Step: inst = inst->next; goto Switchstmt; } break; case EOL: if(p==f->b.nc || filereadc(f, p)=='\n') goto Step; break; case CCLASS: if(c>=0 && classmatch(inst->rclass, c, 0)) goto Addinst; break; case NCCLASS: if(c>=0 && classmatch(inst->rclass, c, 1)) goto Addinst; break; case OR: /* evaluate right choice later */ if(addinst(tlp, inst->right, &tlp->se)) if(++ntl >= NLIST) goto Overflow; /* efficiency: advance and re-evaluate */ inst = inst->left; goto Switchstmt; case END: /* Match! */ tlp->se.p[0].p1 = -tlp->se.p[0].p1; /* minus sign */ tlp->se.p[0].p2 = p; bnewmatch(&tlp->se); break; } } } Return: return sel.p[0].p1>=0; } void bnewmatch(Rangeset *sp) { int i; if(sel.p[0].p1<0 || sp->p[0].p1>sel.p[0].p2 || (sp->p[0].p1==sel.p[0].p2 && sp->p[0].p2p[i].p2; sel.p[i].p2 = sp->p[i].p1; } } 9base-6/sam/xec.c0000644000175000017500000002052111402154555013251 0ustar anselmanselm#include "sam.h" #include "parse.h" int Glooping; int nest; int append(File*, Cmd*, Posn); int display(File*); void looper(File*, Cmd*, int); void filelooper(Cmd*, int); void linelooper(File*, Cmd*); void resetxec(void) { Glooping = nest = 0; } int cmdexec(File *f, Cmd *cp) { int i; Addr *ap; Address a; if(f && f->unread) load(f); if(f==0 && (cp->addr==0 || cp->addr->type!='"') && !utfrune("bBnqUXY!", cp->cmdc) && cp->cmdc!=('c'|0x100) && !(cp->cmdc=='D' && cp->ctext)) error(Enofile); i = lookup(cp->cmdc); if(i >= 0 && cmdtab[i].defaddr != aNo){ if((ap=cp->addr)==0 && cp->cmdc!='\n'){ cp->addr = ap = newaddr(); ap->type = '.'; if(cmdtab[i].defaddr == aAll) ap->type = '*'; }else if(ap && ap->type=='"' && ap->next==0 && cp->cmdc!='\n'){ ap->next = newaddr(); ap->next->type = '.'; if(cmdtab[i].defaddr == aAll) ap->next->type = '*'; } if(cp->addr){ /* may be false for '\n' (only) */ static Address none = {0,0,0}; if(f) addr = address(ap, f->dot, 0); else /* a " */ addr = address(ap, none, 0); f = addr.f; } } current(f); switch(cp->cmdc){ case '{': a = cp->addr? address(cp->addr, f->dot, 0): f->dot; for(cp = cp->ccmd; cp; cp = cp->next){ a.f->dot = a; cmdexec(a.f, cp); } break; default: i=(*cmdtab[i].fn)(f, cp); return i; } return 1; } int a_cmd(File *f, Cmd *cp) { return append(f, cp, addr.r.p2); } int b_cmd(File *f, Cmd *cp) { USED(f); f = cp->cmdc=='b'? tofile(cp->ctext) : getfile(cp->ctext); if(f->unread) load(f); else if(nest == 0) filename(f); return TRUE; } int c_cmd(File *f, Cmd *cp) { logdelete(f, addr.r.p1, addr.r.p2); f->ndot.r.p1 = f->ndot.r.p2 = addr.r.p2; return append(f, cp, addr.r.p2); } int d_cmd(File *f, Cmd *cp) { USED(cp); logdelete(f, addr.r.p1, addr.r.p2); f->ndot.r.p1 = f->ndot.r.p2 = addr.r.p1; return TRUE; } int D_cmd(File *f, Cmd *cp) { closefiles(f, cp->ctext); return TRUE; } int e_cmd(File *f, Cmd *cp) { if(getname(f, cp->ctext, cp->cmdc=='e')==0) error(Enoname); edit(f, cp->cmdc); return TRUE; } int f_cmd(File *f, Cmd *cp) { getname(f, cp->ctext, TRUE); filename(f); return TRUE; } int g_cmd(File *f, Cmd *cp) { if(f!=addr.f)panic("g_cmd f!=addr.f"); compile(cp->re); if(execute(f, addr.r.p1, addr.r.p2) ^ cp->cmdc=='v'){ f->dot = addr; return cmdexec(f, cp->ccmd); } return TRUE; } int i_cmd(File *f, Cmd *cp) { return append(f, cp, addr.r.p1); } int k_cmd(File *f, Cmd *cp) { USED(cp); f->mark = addr.r; return TRUE; } int m_cmd(File *f, Cmd *cp) { Address addr2; addr2 = address(cp->caddr, f->dot, 0); if(cp->cmdc=='m') move(f, addr2); else copy(f, addr2); return TRUE; } int n_cmd(File *f, Cmd *cp) { int i; USED(f); USED(cp); for(i = 0; iname); filename(f); } return TRUE; } int p_cmd(File *f, Cmd *cp) { USED(cp); return display(f); } int q_cmd(File *f, Cmd *cp) { USED(cp); USED(f); trytoquit(); if(downloaded){ outT0(Hexit); return TRUE; } return FALSE; } int s_cmd(File *f, Cmd *cp) { int i, j, c, n; Posn p1, op, didsub = 0, delta = 0; n = cp->num; op= -1; compile(cp->re); for(p1 = addr.r.p1; p1<=addr.r.p2 && execute(f, p1, addr.r.p2); ){ if(sel.p[0].p1==sel.p[0].p2){ /* empty match? */ if(sel.p[0].p1==op){ p1++; continue; } p1 = sel.p[0].p2+1; }else p1 = sel.p[0].p2; op = sel.p[0].p2; if(--n>0) continue; Strzero(&genstr); for(i = 0; ictext->n; i++) if((c = cp->ctext->s[i])=='\\' && ictext->n-1){ c = cp->ctext->s[++i]; if('1'<=c && c<='9') { j = c-'0'; if(sel.p[j].p2-sel.p[j].p1>BLOCKSIZE) error(Elongtag); bufread(&f->b, sel.p[j].p1, genbuf, sel.p[j].p2-sel.p[j].p1); Strinsert(&genstr, tmprstr(genbuf, (sel.p[j].p2-sel.p[j].p1)), genstr.n); }else Straddc(&genstr, c); }else if(c!='&') Straddc(&genstr, c); else{ if(sel.p[0].p2-sel.p[0].p1>BLOCKSIZE) error(Elongrhs); bufread(&f->b, sel.p[0].p1, genbuf, sel.p[0].p2-sel.p[0].p1); Strinsert(&genstr, tmprstr(genbuf, (int)(sel.p[0].p2-sel.p[0].p1)), genstr.n); } if(sel.p[0].p1!=sel.p[0].p2){ logdelete(f, sel.p[0].p1, sel.p[0].p2); delta-=sel.p[0].p2-sel.p[0].p1; } if(genstr.n){ loginsert(f, sel.p[0].p2, genstr.s, genstr.n); delta+=genstr.n; } didsub = 1; if(!cp->flag) break; } if(!didsub && nest==0) error(Enosub); f->ndot.r.p1 = addr.r.p1, f->ndot.r.p2 = addr.r.p2+delta; return TRUE; } int u_cmd(File *f, Cmd *cp) { int n; USED(f); USED(cp); n = cp->num; if(n >= 0) while(n-- && undo(TRUE)) ; else while(n++ && undo(FALSE)) ; return TRUE; } int w_cmd(File *f, Cmd *cp) { int fseq; fseq = f->seq; if(getname(f, cp->ctext, FALSE)==0) error(Enoname); if(fseq == seq) error_s(Ewseq, genc); writef(f); return TRUE; } int x_cmd(File *f, Cmd *cp) { if(cp->re) looper(f, cp, cp->cmdc=='x'); else linelooper(f, cp); return TRUE; } int X_cmd(File *f, Cmd *cp) { USED(f); filelooper(cp, cp->cmdc=='X'); return TRUE; } int plan9_cmd(File *f, Cmd *cp) { plan9(f, cp->cmdc, cp->ctext, nest); return TRUE; } int eq_cmd(File *f, Cmd *cp) { int charsonly; switch(cp->ctext->n){ case 1: charsonly = FALSE; break; case 2: if(cp->ctext->s[0]=='#'){ charsonly = TRUE; break; } default: SET(charsonly); error(Enewline); } printposn(f, charsonly); return TRUE; } int nl_cmd(File *f, Cmd *cp) { Address a; if(cp->addr == 0){ /* First put it on newline boundaries */ addr = lineaddr((Posn)0, f->dot, -1); a = lineaddr((Posn)0, f->dot, 1); addr.r.p2 = a.r.p2; if(addr.r.p1==f->dot.r.p1 && addr.r.p2==f->dot.r.p2) addr = lineaddr((Posn)1, f->dot, 1); display(f); }else if(downloaded) moveto(f, addr.r); else display(f); return TRUE; } int cd_cmd(File *f, Cmd *cp) { USED(f); cd(cp->ctext); return TRUE; } int append(File *f, Cmd *cp, Posn p) { if(cp->ctext->n>0 && cp->ctext->s[cp->ctext->n-1]==0) --cp->ctext->n; if(cp->ctext->n>0) loginsert(f, p, cp->ctext->s, cp->ctext->n); f->ndot.r.p1 = p; f->ndot.r.p2 = p+cp->ctext->n; return TRUE; } int display(File *f) { Posn p1, p2; int np; char *c; p1 = addr.r.p1; p2 = addr.r.p2; if(p2 > f->b.nc){ fprint(2, "bad display addr p1=%ld p2=%ld f->b.nc=%d\n", p1, p2, f->b.nc); /*ZZZ should never happen, can remove */ p2 = f->b.nc; } while(p1 < p2){ np = p2-p1; if(np>BLOCKSIZE-1) np = BLOCKSIZE-1; bufread(&f->b, p1, genbuf, np); genbuf[np] = 0; c = Strtoc(tmprstr(genbuf, np+1)); if(downloaded) termwrite(c); else Write(1, c, strlen(c)); free(c); p1 += np; } f->dot = addr; return TRUE; } void looper(File *f, Cmd *cp, int xy) { Posn p, op; Range r; r = addr.r; op= xy? -1 : r.p1; nest++; compile(cp->re); for(p = r.p1; p<=r.p2; ){ if(!execute(f, p, r.p2)){ /* no match, but y should still run */ if(xy || op>r.p2) break; f->dot.r.p1 = op, f->dot.r.p2 = r.p2; p = r.p2+1; /* exit next loop */ }else{ if(sel.p[0].p1==sel.p[0].p2){ /* empty match? */ if(sel.p[0].p1==op){ p++; continue; } p = sel.p[0].p2+1; }else p = sel.p[0].p2; if(xy) f->dot.r = sel.p[0]; else f->dot.r.p1 = op, f->dot.r.p2 = sel.p[0].p1; } op = sel.p[0].p2; cmdexec(f, cp->ccmd); compile(cp->re); } --nest; } void linelooper(File *f, Cmd *cp) { Posn p; Range r, linesel; Address a, a3; nest++; r = addr.r; a3.f = f; a3.r.p1 = a3.r.p2 = r.p1; for(p = r.p1; p= r.p2) break; if(linesel.p2 >= r.p2) linesel.p2 = r.p2; if(linesel.p2 > linesel.p1) if(linesel.p1>=a3.r.p2 && linesel.p2>a3.r.p2){ f->dot.r = linesel; cmdexec(f, cp->ccmd); a3.r = linesel; continue; } break; } --nest; } void filelooper(Cmd *cp, int XY) { File *f, *cur; int i; if(Glooping++) error(EnestXY); nest++; settempfile(); cur = curfile; for(i = 0; ire==0 || filematch(f, cp->re)==XY) cmdexec(f, cp->ccmd); } if(cur && whichmenu(cur)>=0) /* check that cur is still a file */ current(cur); --Glooping; --nest; } 9base-6/sam/error.c0000644000175000017500000000426211402154555013627 0ustar anselmanselm#include "sam.h" static char *emsg[]={ /* error_s */ "can't open", "can't create", "not in menu:", "changes to", "I/O error:", "can't write while changing:", /* error_c */ "unknown command", "no operand for", "bad delimiter", /* error */ "can't fork", "interrupt", "address", "search", "pattern", "newline expected", "blank expected", "pattern expected", "can't nest X or Y", "unmatched `}'", "command takes no address", "addresses overlap", "substitution", "& match too long", "bad \\ in rhs", "address range", "changes not in sequence", "addresses out of order", "no file name", "unmatched `('", "unmatched `)'", "malformed `[]'", "malformed regexp", "reg. exp. list overflow", "plan 9 command", "can't pipe", "no current file", "string too long", "changed files", "empty string", "file search", "non-unique match for \"\"", "tag match too long", "too many subexpressions", "temporary file too large", "file is append-only", "no destination for plumb message", "internal read error in buffer load" }; static char *wmsg[]={ /* warn_s */ "duplicate file name", "no such file", "write might change good version of", /* warn_S */ "files might be aliased", /* warn */ "null characters elided", "can't run pwd", "last char not newline", "exit status not 0" }; void error(Err s) { char buf[512]; sprint(buf, "?%s", emsg[s]); hiccough(buf); } void error_s(Err s, char *a) { char buf[512]; sprint(buf, "?%s \"%s\"", emsg[s], a); hiccough(buf); } void error_r(Err s, char *a) { char buf[512]; sprint(buf, "?%s \"%s\": %r", emsg[s], a); hiccough(buf); } void error_c(Err s, int c) { char buf[512]; sprint(buf, "?%s `%C'", emsg[s], c); hiccough(buf); } void warn(Warn s) { dprint("?warning: %s\n", wmsg[s]); } void warn_S(Warn s, String *a) { print_s(wmsg[s], a); } void warn_SS(Warn s, String *a, String *b) { print_ss(wmsg[s], a, b); } void warn_s(Warn s, char *a) { dprint("?warning: %s `%s'\n", wmsg[s], a); } void termwrite(char *s) { String *p; if(downloaded){ p = tmpcstr(s); if(cmd) loginsert(cmd, cmdpt, p->s, p->n); else Strinsert(&cmdstr, p, cmdstr.n); cmdptadv += p->n; free(p); }else Write(2, s, strlen(s)); } 9base-6/sam/io.c0000644000175000017500000001113711402154555013104 0ustar anselmanselm#include "sam.h" #define NSYSFILE 3 #define NOFILE 128 void checkqid(File *f) { int i, w; File *g; w = whichmenu(f); for(i=1; idev==g->dev && f->qidpath==g->qidpath) warn_SS(Wdupfile, &f->name, &g->name); } } void writef(File *f) { Posn n; char *name; int i, samename, newfile; ulong dev; uvlong qid; long mtime, appendonly, length; newfile = 0; samename = Strcmp(&genstr, &f->name) == 0; name = Strtoc(&f->name); i = statfile(name, &dev, &qid, &mtime, 0, 0); if(i == -1) newfile++; else if(samename && (f->dev!=dev || f->qidpath!=qid || f->mtimedev = dev; f->qidpath = qid; f->mtime = mtime; warn_S(Wdate, &genstr); return; } if(genc) free(genc); genc = Strtoc(&genstr); if((io=create(genc, 1, 0666L)) < 0) error_r(Ecreate, genc); dprint("%s: ", genc); if(statfd(io, 0, 0, 0, &length, &appendonly) > 0 && appendonly && length>0) error(Eappend); n = writeio(f); if(f->name.s[0]==0 || samename){ if(addr.r.p1==0 && addr.r.p2==f->b.nc) f->cleanseq = f->seq; state(f, f->cleanseq==f->seq? Clean : Dirty); } if(newfile) dprint("(new file) "); if(addr.r.p2>0 && filereadc(f, addr.r.p2-1)!='\n') warn(Wnotnewline); closeio(n); if(f->name.s[0]==0 || samename){ if(statfile(name, &dev, &qid, &mtime, 0, 0) > 0){ f->dev = dev; f->qidpath = qid; f->mtime = mtime; checkqid(f); } } } Posn readio(File *f, int *nulls, int setdate, int toterm) { int n, b, w; Rune *r; Posn nt; Posn p = addr.r.p2; ulong dev; uvlong qid; long mtime; char buf[BLOCKSIZE+1], *s; *nulls = FALSE; b = 0; if(f->unread){ nt = bufload(&f->b, 0, io, nulls); if(toterm) raspload(f); }else for(nt = 0; (n = read(io, buf+b, BLOCKSIZE-b))>0; nt+=(r-genbuf)){ n += b; b = 0; r = genbuf; s = buf; while(n > 0){ if((*r = *(uchar*)s) < Runeself){ if(*r) r++; else *nulls = TRUE; --n; s++; continue; } if(fullrune(s, n)){ w = chartorune(r, s); if(*r) r++; else *nulls = TRUE; n -= w; s += w; continue; } b = n; memmove(buf, s, b); break; } loginsert(f, p, genbuf, r-genbuf); } if(b) *nulls = TRUE; if(*nulls) warn(Wnulls); if(setdate){ if(statfd(io, &dev, &qid, &mtime, 0, 0) > 0){ f->dev = dev; f->qidpath = qid; f->mtime = mtime; checkqid(f); } } return nt; } Posn writeio(File *f) { int m, n; Posn p = addr.r.p1; char *c; while(p < addr.r.p2){ if(addr.r.p2-p>BLOCKSIZE) n = BLOCKSIZE; else n = addr.r.p2-p; bufread(&f->b, p, genbuf, n); c = Strtoc(tmprstr(genbuf, n)); m = strlen(c); if(Write(io, c, m) != m){ free(c); if(p > 0) p += n; break; } free(c); p += n; } return p-addr.r.p1; } void closeio(Posn p) { close(io); io = 0; if(p >= 0) dprint("#%lud\n", p); } int remotefd0 = 0; int remotefd1 = 1; void bootterm(char *machine, char **argv) { int ph2t[2], pt2h[2]; if(machine){ dup(remotefd0, 0); dup(remotefd1, 1); close(remotefd0); close(remotefd1); argv[0] = "samterm"; execvp(samterm, argv); fprint(2, "can't exec %s: %r\n", samterm); _exits("damn"); } if(pipe(ph2t)==-1 || pipe(pt2h)==-1) panic("pipe"); switch(fork()){ case 0: dup(ph2t[0], 0); dup(pt2h[1], 1); close(ph2t[0]); close(ph2t[1]); close(pt2h[0]); close(pt2h[1]); argv[0] = "samterm"; execvp(samterm, argv); fprint(2, "can't exec: "); perror(samterm); _exits("damn"); case -1: panic("can't fork samterm"); } dup(pt2h[0], 0); dup(ph2t[1], 1); close(ph2t[0]); close(ph2t[1]); close(pt2h[0]); close(pt2h[1]); } void connectto(char *machine, char **argv) { int p1[2], p2[2]; char **av; int ac; /* count args */ for(av = argv; *av; av++) ; av = malloc(sizeof(char*)*((av-argv) + 5)); if(av == nil){ dprint("out of memory\n"); exits("fork/exec"); } ac = 0; av[ac++] = RX; av[ac++] = machine; av[ac++] = rsamname; av[ac++] = "-R"; while(*argv) av[ac++] = *argv++; av[ac] = 0; if(pipe(p1)<0 || pipe(p2)<0){ dprint("can't pipe\n"); exits("pipe"); } remotefd0 = p1[0]; remotefd1 = p2[1]; switch(fork()){ case 0: dup(p2[0], 0); dup(p1[1], 1); close(p1[0]); close(p1[1]); close(p2[0]); close(p2[1]); execvp(RXPATH, av); dprint("can't exec %s\n", RXPATH); exits("exec"); case -1: dprint("can't fork\n"); exits("fork"); } free(av); close(p1[1]); close(p2[0]); } void startup(char *machine, int Rflag, char **argv, char **files) { if(machine) connectto(machine, files); if(!Rflag) bootterm(machine, argv); downloaded = 1; outTs(Hversion, VERSION); } 9base-6/sam/mesg.h0000644000175000017500000000730711402154555013441 0ustar anselmanselm/* VERSION 1 introduces plumbing 2 increases SNARFSIZE from 4096 to 32000 */ #define VERSION 2 #define TBLOCKSIZE 512 /* largest piece of text sent to terminal */ #define DATASIZE (UTFmax*TBLOCKSIZE+30) /* ... including protocol header stuff */ #define SNARFSIZE 32000 /* maximum length of exchanged snarf buffer, must fit in 15 bits */ /* * Messages originating at the terminal */ typedef enum Tmesg { Tversion, /* version */ Tstartcmdfile, /* terminal just opened command frame */ Tcheck, /* ask host to poke with Hcheck */ Trequest, /* request data to fill a hole */ Torigin, /* gimme an Horigin near here */ Tstartfile, /* terminal just opened a file's frame */ Tworkfile, /* set file to which commands apply */ Ttype, /* add some characters, but terminal already knows */ Tcut, Tpaste, Tsnarf, Tstartnewfile, /* terminal just opened a new frame */ Twrite, /* write file */ Tclose, /* terminal requests file close; check mod. status */ Tlook, /* search for literal current text */ Tsearch, /* search for last regular expression */ Tsend, /* pretend he typed stuff */ Tdclick, /* double click */ Tstartsnarf, /* initiate snarf buffer exchange */ Tsetsnarf, /* remember string in snarf buffer */ Tack, /* acknowledge Hack */ Texit, /* exit */ Tplumb, /* send plumb message */ TMAX }Tmesg; /* * Messages originating at the host */ typedef enum Hmesg { Hversion, /* version */ Hbindname, /* attach name[0] to text in terminal */ Hcurrent, /* make named file the typing file */ Hnewname, /* create "" name in menu */ Hmovname, /* move file name in menu */ Hgrow, /* insert space in rasp */ Hcheck0, /* see below */ Hcheck, /* ask terminal to check whether it needs more data */ Hunlock, /* command is finished; user can do things */ Hdata, /* store this data in previously allocated space */ Horigin, /* set origin of file/frame in terminal */ Hunlockfile, /* unlock file in terminal */ Hsetdot, /* set dot in terminal */ Hgrowdata, /* Hgrow + Hdata folded together */ Hmoveto, /* scrolling, context search, etc. */ Hclean, /* named file is now 'clean' */ Hdirty, /* named file is now 'dirty' */ Hcut, /* remove space from rasp */ Hsetpat, /* set remembered regular expression */ Hdelname, /* delete file name from menu */ Hclose, /* close file and remove from menu */ Hsetsnarf, /* remember string in snarf buffer */ Hsnarflen, /* report length of implicit snarf */ Hack, /* request acknowledgement */ Hexit, Hplumb, /* return plumb message to terminal - version 1 */ HMAX }Hmesg; typedef struct Header{ uchar type; /* one of the above */ uchar count0; /* low bits of data size */ uchar count1; /* high bits of data size */ uchar data[1]; /* variable size */ }Header; /* * File transfer protocol schematic, a la Holzmann * #define N 6 * * chan h = [4] of { mtype }; * chan t = [4] of { mtype }; * * mtype = { Hgrow, Hdata, * Hcheck, Hcheck0, * Trequest, Tcheck, * }; * * active proctype host() * { byte n; * * do * :: n < N -> n++; t!Hgrow * :: n == N -> n++; t!Hcheck0 * * :: h?Trequest -> t!Hdata * :: h?Tcheck -> t!Hcheck * od * } * * active proctype term() * { * do * :: t?Hgrow -> h!Trequest * :: t?Hdata -> skip * :: t?Hcheck0 -> h!Tcheck * :: t?Hcheck -> * if * :: h!Trequest -> progress: h!Tcheck * :: break * fi * od; * printf("term exits\n") * } * * From: gerard@research.bell-labs.com * Date: Tue Jul 17 13:47:23 EDT 2001 * To: rob@research.bell-labs.com * * spin -c (or -a) spec * pcc -DNP -o pan pan.c * pan -l * * proves that there are no non-progress cycles * (infinite executions *not* passing through * the statement marked with a label starting * with the prefix "progress") * */ 9base-6/sam/mesg.c0000644000175000017500000003415211402154555013432 0ustar anselmanselm#include "sam.h" Header h; uchar indata[DATASIZE]; uchar outdata[2*DATASIZE+3]; /* room for overflow message */ uchar *inp; uchar *outp; uchar *outmsg = outdata; Posn cmdpt; Posn cmdptadv; Buffer snarfbuf; int waitack; int outbuffered; int tversion; int inshort(void); long inlong(void); vlong invlong(void); int inmesg(Tmesg); void outshort(int); void outlong(long); void outvlong(vlong); void outcopy(int, void*); void outsend(void); void outstart(Hmesg); void setgenstr(File*, Posn, Posn); #ifdef DEBUG char *hname[] = { [Hversion] "Hversion", [Hbindname] "Hbindname", [Hcurrent] "Hcurrent", [Hnewname] "Hnewname", [Hmovname] "Hmovname", [Hgrow] "Hgrow", [Hcheck0] "Hcheck0", [Hcheck] "Hcheck", [Hunlock] "Hunlock", [Hdata] "Hdata", [Horigin] "Horigin", [Hunlockfile] "Hunlockfile", [Hsetdot] "Hsetdot", [Hgrowdata] "Hgrowdata", [Hmoveto] "Hmoveto", [Hclean] "Hclean", [Hdirty] "Hdirty", [Hcut] "Hcut", [Hsetpat] "Hsetpat", [Hdelname] "Hdelname", [Hclose] "Hclose", [Hsetsnarf] "Hsetsnarf", [Hsnarflen] "Hsnarflen", [Hack] "Hack", [Hexit] "Hexit", // [Hplumb] "Hplumb" }; char *tname[] = { [Tversion] "Tversion", [Tstartcmdfile] "Tstartcmdfile", [Tcheck] "Tcheck", [Trequest] "Trequest", [Torigin] "Torigin", [Tstartfile] "Tstartfile", [Tworkfile] "Tworkfile", [Ttype] "Ttype", [Tcut] "Tcut", [Tpaste] "Tpaste", [Tsnarf] "Tsnarf", [Tstartnewfile] "Tstartnewfile", [Twrite] "Twrite", [Tclose] "Tclose", [Tlook] "Tlook", [Tsearch] "Tsearch", [Tsend] "Tsend", [Tdclick] "Tdclick", [Tstartsnarf] "Tstartsnarf", [Tsetsnarf] "Tsetsnarf", [Tack] "Tack", [Texit] "Texit", // [Tplumb] "Tplumb" }; void journal(int out, char *s) { static int fd = 0; if(fd <= 0) fd = create("/tmp/sam.out", 1, 0666L); fprint(fd, "%s%s\n", out? "out: " : "in: ", s); } void journaln(int out, long n) { char buf[32]; snprint(buf, sizeof buf, "%ld", n); journal(out, buf); } void journalv(int out, vlong v) { char buf[32]; snprint(buf, sizeof buf, "%lld", v); journal(out, buf); } #else #define journal(a, b) #define journaln(a, b) #endif int rcvchar(void){ static uchar buf[64]; static int i, nleft = 0; if(nleft <= 0){ nleft = read(0, (char *)buf, sizeof buf); if(nleft <= 0) return -1; i = 0; } --nleft; return buf[i++]; } int rcv(void){ int c; static int state = 0; static int count = 0; static int i = 0; while((c=rcvchar()) != -1) switch(state){ case 0: h.type = c; state++; break; case 1: h.count0 = c; state++; break; case 2: h.count1 = c; count = h.count0|(h.count1<<8); i = 0; if(count > DATASIZE) panic("count>DATASIZE"); if(count == 0) goto zerocount; state++; break; case 3: indata[i++] = c; if(i == count){ zerocount: indata[i] = 0; state = count = 0; return inmesg(h.type); } break; } return 0; } File * whichfile(int tag) { int i; for(i = 0; itag==tag) return file.filepptr[i]; hiccough((char *)0); return 0; } int inmesg(Tmesg type) { Rune buf[1025]; char cbuf[64]; int i, m; short s; long l, l1; vlong v; File *f; Posn p0, p1, p; Range r; String *str; char *c, *wdir; Rune *rp; Plumbmsg *pm; if(type > TMAX) panic("inmesg"); journal(0, tname[type]); inp = indata; switch(type){ case -1: panic("rcv error"); default: fprint(2, "unknown type %d\n", type); panic("rcv unknown"); case Tversion: tversion = inshort(); journaln(0, tversion); break; case Tstartcmdfile: v = invlong(); /* for 64-bit pointers */ journaln(0, v); Strdupl(&genstr, samname); cmd = newfile(); cmd->unread = 0; outTsv(Hbindname, cmd->tag, v); outTs(Hcurrent, cmd->tag); logsetname(cmd, &genstr); cmd->rasp = listalloc('P'); cmd->mod = 0; if(cmdstr.n){ loginsert(cmd, 0L, cmdstr.s, cmdstr.n); Strdelete(&cmdstr, 0L, (Posn)cmdstr.n); } fileupdate(cmd, FALSE, TRUE); outT0(Hunlock); break; case Tcheck: /* go through whichfile to check the tag */ outTs(Hcheck, whichfile(inshort())->tag); break; case Trequest: f = whichfile(inshort()); p0 = inlong(); p1 = p0+inshort(); journaln(0, p0); journaln(0, p1-p0); if(f->unread) panic("Trequest: unread"); if(p1>f->b.nc) p1 = f->b.nc; if(p0>f->b.nc) /* can happen e.g. scrolling during command */ p0 = f->b.nc; if(p0 == p1){ i = 0; r.p1 = r.p2 = p0; }else{ r = rdata(f->rasp, p0, p1-p0); i = r.p2-r.p1; bufread(&f->b, r.p1, buf, i); } buf[i]=0; outTslS(Hdata, f->tag, r.p1, tmprstr(buf, i+1)); break; case Torigin: s = inshort(); l = inlong(); l1 = inlong(); journaln(0, l1); lookorigin(whichfile(s), l, l1); break; case Tstartfile: termlocked++; f = whichfile(inshort()); if(!f->rasp) /* this might be a duplicate message */ f->rasp = listalloc('P'); current(f); outTsv(Hbindname, f->tag, invlong()); /* for 64-bit pointers */ outTs(Hcurrent, f->tag); journaln(0, f->tag); if(f->unread) load(f); else{ if(f->b.nc>0){ rgrow(f->rasp, 0L, f->b.nc); outTsll(Hgrow, f->tag, 0L, f->b.nc); } outTs(Hcheck0, f->tag); moveto(f, f->dot.r); } break; case Tworkfile: i = inshort(); f = whichfile(i); current(f); f->dot.r.p1 = inlong(); f->dot.r.p2 = inlong(); f->tdot = f->dot.r; journaln(0, i); journaln(0, f->dot.r.p1); journaln(0, f->dot.r.p2); break; case Ttype: f = whichfile(inshort()); p0 = inlong(); journaln(0, p0); journal(0, (char*)inp); str = tmpcstr((char*)inp); i = str->n; loginsert(f, p0, str->s, str->n); if(fileupdate(f, FALSE, FALSE)) seq++; if(f==cmd && p0==f->b.nc-i && i>0 && str->s[i-1]=='\n'){ freetmpstr(str); termlocked++; termcommand(); }else freetmpstr(str); f->dot.r.p1 = f->dot.r.p2 = p0+i; /* terminal knows this already */ f->tdot = f->dot.r; break; case Tcut: f = whichfile(inshort()); p0 = inlong(); p1 = inlong(); journaln(0, p0); journaln(0, p1); logdelete(f, p0, p1); if(fileupdate(f, FALSE, FALSE)) seq++; f->dot.r.p1 = f->dot.r.p2 = p0; f->tdot = f->dot.r; /* terminal knows the value of dot already */ break; case Tpaste: f = whichfile(inshort()); p0 = inlong(); journaln(0, p0); for(l=0; lBLOCKSIZE) m = BLOCKSIZE; bufread(&snarfbuf, l, genbuf, m); loginsert(f, p0, tmprstr(genbuf, m)->s, m); } if(fileupdate(f, FALSE, TRUE)) seq++; f->dot.r.p1 = p0; f->dot.r.p2 = p0+snarfbuf.nc; f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */ telldot(f); outTs(Hunlockfile, f->tag); break; case Tsnarf: i = inshort(); p0 = inlong(); p1 = inlong(); snarf(whichfile(i), p0, p1, &snarfbuf, 0); break; case Tstartnewfile: v = invlong(); Strdupl(&genstr, empty); f = newfile(); f->rasp = listalloc('P'); outTsv(Hbindname, f->tag, v); logsetname(f, &genstr); outTs(Hcurrent, f->tag); current(f); load(f); break; case Twrite: termlocked++; i = inshort(); journaln(0, i); f = whichfile(i); addr.r.p1 = 0; addr.r.p2 = f->b.nc; if(f->name.s[0] == 0) error(Enoname); Strduplstr(&genstr, &f->name); writef(f); break; case Tclose: termlocked++; i = inshort(); journaln(0, i); f = whichfile(i); current(f); trytoclose(f); /* if trytoclose fails, will error out */ delete(f); break; case Tlook: f = whichfile(inshort()); termlocked++; p0 = inlong(); p1 = inlong(); journaln(0, p0); journaln(0, p1); setgenstr(f, p0, p1); for(l = 0; ldot.r.p2, 1); moveto(curfile, sel.p[0]); break; case Tsend: termlocked++; inshort(); /* ignored */ p0 = inlong(); p1 = inlong(); setgenstr(cmd, p0, p1); bufreset(&snarfbuf); bufinsert(&snarfbuf, (Posn)0, genstr.s, genstr.n); outTl(Hsnarflen, genstr.n); if(genstr.s[genstr.n-1] != '\n') Straddc(&genstr, '\n'); loginsert(cmd, cmd->b.nc, genstr.s, genstr.n); fileupdate(cmd, FALSE, TRUE); cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc; telldot(cmd); termcommand(); break; case Tdclick: f = whichfile(inshort()); p1 = inlong(); doubleclick(f, p1); f->tdot.p1 = f->tdot.p2 = p1; telldot(f); outTs(Hunlockfile, f->tag); break; case Tstartsnarf: if (snarfbuf.nc <= 0) { /* nothing to export */ outTs(Hsetsnarf, 0); break; } c = 0; i = 0; m = snarfbuf.nc; if(m > SNARFSIZE) { m = SNARFSIZE; dprint("?warning: snarf buffer truncated\n"); } rp = malloc(m*sizeof(Rune)); if(rp){ bufread(&snarfbuf, 0, rp, m); c = Strtoc(tmprstr(rp, m)); free(rp); i = strlen(c); } outTs(Hsetsnarf, i); if(c){ Write(1, c, i); free(c); } else dprint("snarf buffer too long\n"); break; case Tsetsnarf: m = inshort(); if(m > SNARFSIZE) error(Etoolong); c = malloc(m+1); if(c){ for(i=0; is, str->n); freetmpstr(str); outT0(Hunlock); } break; case Tack: waitack = 0; break; #if 0 case Tplumb: f = whichfile(inshort()); p0 = inlong(); p1 = inlong(); pm = emalloc(sizeof(Plumbmsg)); pm->src = strdup("sam"); pm->dst = 0; /* construct current directory */ c = Strtoc(&f->name); if(c[0] == '/') pm->wdir = c; else{ wdir = emalloc(1024); getwd(wdir, 1024); pm->wdir = emalloc(1024); snprint(pm->wdir, 1024, "%s/%s", wdir, c); cleanname(pm->wdir); free(wdir); free(c); } c = strrchr(pm->wdir, '/'); if(c) *c = '\0'; pm->type = strdup("text"); if(p1 > p0) pm->attr = nil; else{ p = p0; while(p0>0 && (i=filereadc(f, p0 - 1))!=' ' && i!='\t' && i!='\n') p0--; while(p1b.nc && (i=filereadc(f, p1))!=' ' && i!='\t' && i!='\n') p1++; sprint(cbuf, "click=%ld", p-p0); pm->attr = plumbunpackattr(cbuf); } if(p0==p1 || p1-p0>=BLOCKSIZE){ plumbfree(pm); break; } setgenstr(f, p0, p1); pm->data = Strtoc(&genstr); pm->ndata = strlen(pm->data); c = plumbpack(pm, &i); if(c != 0){ outTs(Hplumb, i); Write(1, c, i); free(c); } plumbfree(pm); break; #endif case Texit: exits(0); } return TRUE; } void snarf(File *f, Posn p1, Posn p2, Buffer *buf, int emptyok) { Posn l; int i; if(!emptyok && p1==p2) return; bufreset(buf); /* Stage through genbuf to avoid compaction problems (vestigial) */ if(p2 > f->b.nc){ fprint(2, "bad snarf addr p1=%ld p2=%ld f->b.nc=%d\n", p1, p2, f->b.nc); /*ZZZ should never happen, can remove */ p2 = f->b.nc; } for(l=p1; lBLOCKSIZE? BLOCKSIZE : p2-l; bufread(&f->b, l, genbuf, i); bufinsert(buf, buf->nc, tmprstr(genbuf, i)->s, i); } } int inshort(void) { ushort n; n = inp[0] | (inp[1]<<8); inp += 2; return n; } long inlong(void) { ulong n; n = inp[0] | (inp[1]<<8) | (inp[2]<<16) | (inp[3]<<24); inp += 4; return n; } vlong invlong(void) { vlong v; v = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4]; v = (v<<16) | (inp[3]<<8) | inp[2]; v = (v<<16) | (inp[1]<<8) | inp[0]; inp += 8; return v; } void setgenstr(File *f, Posn p0, Posn p1) { if(p0 != p1){ if(p1-p0 >= TBLOCKSIZE) error(Etoolong); Strinsure(&genstr, p1-p0); bufread(&f->b, p0, genbuf, p1-p0); memmove(genstr.s, genbuf, RUNESIZE*(p1-p0)); genstr.n = p1-p0; }else{ if(snarfbuf.nc == 0) error(Eempty); if(snarfbuf.nc > TBLOCKSIZE) error(Etoolong); bufread(&snarfbuf, (Posn)0, genbuf, snarfbuf.nc); Strinsure(&genstr, snarfbuf.nc); memmove(genstr.s, genbuf, RUNESIZE*snarfbuf.nc); genstr.n = snarfbuf.nc; } } void outT0(Hmesg type) { outstart(type); outsend(); } void outTl(Hmesg type, long l) { outstart(type); outlong(l); outsend(); } void outTs(Hmesg type, int s) { outstart(type); journaln(1, s); outshort(s); outsend(); } void outS(String *s) { char *c; int i; c = Strtoc(s); i = strlen(c); outcopy(i, c); if(i > 99) c[99] = 0; journaln(1, i); journal(1, c); free(c); } void outTsS(Hmesg type, int s1, String *s) { outstart(type); outshort(s1); outS(s); outsend(); } void outTslS(Hmesg type, int s1, Posn l1, String *s) { outstart(type); outshort(s1); journaln(1, s1); outlong(l1); journaln(1, l1); outS(s); outsend(); } void outTS(Hmesg type, String *s) { outstart(type); outS(s); outsend(); } void outTsllS(Hmesg type, int s1, Posn l1, Posn l2, String *s) { outstart(type); outshort(s1); outlong(l1); outlong(l2); journaln(1, l1); journaln(1, l2); outS(s); outsend(); } void outTsll(Hmesg type, int s, Posn l1, Posn l2) { outstart(type); outshort(s); outlong(l1); outlong(l2); journaln(1, l1); journaln(1, l2); outsend(); } void outTsl(Hmesg type, int s, Posn l) { outstart(type); outshort(s); outlong(l); journaln(1, l); outsend(); } void outTsv(Hmesg type, int s, vlong v) { outstart(type); outshort(s); outvlong(v); journaln(1, v); outsend(); } void outstart(Hmesg type) { journal(1, hname[type]); outmsg[0] = type; outp = outmsg+3; } void outcopy(int count, void *data) { memmove(outp, data, count); outp += count; } void outshort(int s) { *outp++ = s; *outp++ = s>>8; } void outlong(long l) { *outp++ = l; *outp++ = l>>8; *outp++ = l>>16; *outp++ = l>>24; } void outvlong(vlong v) { int i; for(i = 0; i < 8; i++){ *outp++ = v; v >>= 8; } } void outsend(void) { int outcount; if(outp >= outdata+nelem(outdata)) panic("outsend"); outcount = outp-outmsg; outcount -= 3; outmsg[1] = outcount; outmsg[2] = outcount>>8; outmsg = outp; if(!outbuffered){ outcount = outmsg-outdata; if (write(1, (char*) outdata, outcount) != outcount) rescue(); outmsg = outdata; return; } } int needoutflush(void) { return outmsg >= outdata+DATASIZE; } void outflush(void) { if(outmsg == outdata) return; outbuffered = 0; /* flow control */ outT0(Hack); waitack = 1; do if(rcv() == 0){ rescue(); exits("eof"); } while(waitack); outmsg = outdata; outbuffered = 1; } 9base-6/sam/disk.c0000644000175000017500000000401211402154555013421 0ustar anselmanselm#include "sam.h" static Block *blist; #if 0 static int tempdisk(void) { char buf[128]; int i, fd; snprint(buf, sizeof buf, "/tmp/X%d.%.4ssam", getpid(), getuser()); for(i='A'; i<='Z'; i++){ buf[5] = i; if(access(buf, AEXIST) == 0) continue; fd = create(buf, ORDWR|ORCLOSE|OCEXEC, 0600); if(fd >= 0) return fd; } return -1; } #else extern int tempdisk(void); #endif Disk* diskinit(void) { Disk *d; d = emalloc(sizeof(Disk)); d->fd = tempdisk(); if(d->fd < 0){ fprint(2, "sam: can't create temp file: %r\n"); exits("diskinit"); } return d; } static uint ntosize(uint n, uint *ip) { uint size; if(n > Maxblock) panic("internal error: ntosize"); size = n; if(size & (Blockincr-1)) size += Blockincr - (size & (Blockincr-1)); /* last bucket holds blocks of exactly Maxblock */ if(ip) *ip = size/Blockincr; return size * sizeof(Rune); } Block* disknewblock(Disk *d, uint n) { uint i, j, size; Block *b; size = ntosize(n, &i); b = d->free[i]; if(b) d->free[i] = b->u.next; else{ /* allocate in chunks to reduce malloc overhead */ if(blist == nil){ blist = emalloc(100*sizeof(Block)); for(j=0; j<100-1; j++) blist[j].u.next = &blist[j+1]; } b = blist; blist = b->u.next; b->addr = d->addr; d->addr += size; } b->u.n = n; return b; } void diskrelease(Disk *d, Block *b) { uint i; ntosize(b->u.n, &i); b->u.next = d->free[i]; d->free[i] = b; } void diskwrite(Disk *d, Block **bp, Rune *r, uint n) { int size, nsize; Block *b; b = *bp; size = ntosize(b->u.n, nil); nsize = ntosize(n, nil); if(size != nsize){ diskrelease(d, b); b = disknewblock(d, n); *bp = b; } if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune)) panic("write error to temp file"); b->u.n = n; } void diskread(Disk *d, Block *b, Rune *r, uint n) { if(n > b->u.n) panic("internal error: diskread"); ntosize(b->u.n, nil); /* called only for sanity check on Maxblock */ if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune)) panic("read error from temp file"); } 9base-6/sam/README0000644000175000017500000000235111402154555013207 0ustar anselmanselmThis is sam (not including samterm) from the 4th edition of Plan 9, with changes so that it can be compiled under unix. (Tested on Solaris 7 and Debian 3.0r1.) Some extra libraries are needed. First, fetch libutf-2.0 and libfmt-2.0 from http://pdos.lcs.mit.edu/~rsc/software/ (Beware that in libfmt/fmt.c there is a line that says: 'u', __ifmt, /* in Plan 9, __flagfmt */ Thus, sam will have to fmtinstall the other thing. Other ported programs may have to do the same. The fmt library should probably print messages about bad format characters to stderr, since no one seems to check the return codes.) Compile and install those two libraries. Set PREFIX in the Makefile to match, then compile sam. Your C compiler will emit many complaints of the form: sam.c:496: warning: passing arg 1 of `bufread' from incompatible pointer type This is because the Plan 9 compiler has a slightly different (better, ala Oberon) type system than ISO C. Popular compilers generate the right code, so in an act of civil disobediance I changed just enough to get it to compile, but left the type errors in. Now the next C standard can adopt this extension, because at least one important C program uses it! -- Scott Schwartz, 4 July 2003 9base-6/tail/0000755000175000017500000000000011402154555012477 5ustar anselmanselm9base-6/tail/tail.c0000644000175000017500000001317111402154555013577 0ustar anselmanselm#include #include #include #include /* * tail command, posix plus v10 option -r. * the simple command tail -c, legal in v10, is illegal */ vlong count; int anycount; int follow; int file = 0; char* umsg = "usage: tail [-n N] [-c N] [-f] [-r] [+-N[bc][fr]] [file]"; Biobuf bout; enum { BEG, END } origin = END; enum { CHARS, LINES } units = LINES; enum { FWD, REV } dir = FWD; extern void copy(void); extern void fatal(char*); extern int getnumber(char*); extern void keep(void); extern void reverse(void); extern void skip(void); extern void suffix(char*); extern long tread(char*, long); #define trunc tailtrunc extern void trunc(Dir*, Dir**); extern vlong tseek(vlong, int); extern void twrite(char*, long); extern void usage(void); #define JUMP(o,p) tseek(o,p), copy() void main(int argc, char **argv) { int seekable, c; Binit(&bout, 1, OWRITE); for(; argc > 1 && ((c=*argv[1])=='-'||c=='+'); argc--,argv++ ) { if(getnumber(argv[1])) { suffix(argv[1]); continue; } else if(c == '-') switch(argv[1][1]) { case 'c': units = CHARS; case 'n': if(getnumber(argv[1]+2)) continue; else if(argc > 2 && getnumber(argv[2])) { argc--, argv++; continue; } else usage(); case 'r': dir = REV; continue; case 'f': follow++; continue; case '-': argc--, argv++; } break; } if(dir==REV && (units==CHARS || follow || origin==BEG)) fatal("incompatible options"); if(!anycount) count = dir==REV? ~0ULL>>1: 10; if(origin==BEG && units==LINES && count>0) count--; if(argc > 2) usage(); if(argc > 1 && (file=open(argv[1],0)) < 0) fatal(argv[1]); seekable = seek(file,0L,0) == 0; if(!seekable && origin==END) keep(); else if(!seekable && origin==BEG) skip(); else if(units==CHARS && origin==END) JUMP(-count, 2); else if(units==CHARS && origin==BEG) JUMP(count, 0); else if(units==LINES && origin==END) reverse(); else if(units==LINES && origin==BEG) skip(); if(follow && seekable) for(;;) { static Dir *sb0, *sb1; trunc(sb1, &sb0); copy(); trunc(sb0, &sb1); sleep(5000); } exits(0); } void trunc(Dir *old, Dir **new) { Dir *d; vlong olength; d = dirfstat(file); if(d == nil) return; olength = 0; if(old) olength = old->length; if(d->length < olength) d->length = tseek(0L, 0); free(*new); *new = d; } void suffix(char *s) { while(*s && strchr("0123456789+-", *s)) s++; switch(*s) { case 'b': if((count *= 1024) < 0) fatal("too big"); case 'c': units = CHARS; case 'l': s++; } switch(*s) { case 'r': dir = REV; return; case 'f': follow++; return; case 0: return; } usage(); } /* * read past head of the file to find tail */ void skip(void) { int i; long n; char buf[Bsize]; if(units == CHARS) { for( ; count>0; count -=n) { n = count 0) { if(!(n = tread(buf, Bsize))) return; for(i=0; i0; i++) if(buf[i]=='\n') count--; } twrite(buf+i, n-i); } copy(); } void copy(void) { long n; char buf[Bsize]; while((n=tread(buf, Bsize)) > 0) { twrite(buf, n); Bflush(&bout); /* for FWD on pipe; else harmless */ } } /* * read whole file, keeping the tail * complexity is length(file)*length(tail). * could be linear. */ void keep(void) { int len = 0; long bufsiz = 0; char *buf = 0; int j, k, n; for(n=1; n;) { if(len+Bsize > bufsiz) { bufsiz += 2*Bsize; if(!(buf = realloc(buf, bufsiz+1))) fatal("out of space"); } for(; n && len= len) continue; if(units == CHARS) j = len - count; else { /* units == LINES */ j = buf[len-1]=='\n'? len-1: len; for(k=0; j>0; j--) if(buf[j-1] == '\n') if(++k >= count) break; } memmove(buf, buf+j, len-=j); } if(dir == REV) { if(len>0 && buf[len-1]!='\n') buf[len++] = '\n'; for(j=len-1 ; j>0; j--) if(buf[j-1] == '\n') { twrite(buf+j, len-j); if(--count <= 0) return; len = j; } } if(count > 0) twrite(buf, len); } /* * count backward and print tail of file */ void reverse(void) { int first; long len = 0; long n = 0; long bufsiz = 0; char *buf = 0; vlong pos = tseek(0L, 2); for(first=1; pos>0 && count>0; first=0) { n = pos>Bsize? Bsize: (int)pos; pos -= n; if(len+n > bufsiz) { bufsiz += 2*Bsize; if(!(buf = realloc(buf, bufsiz+1))) fatal("out of space"); } memmove(buf+n, buf, len); len += n; tseek(pos, 0); if(tread(buf, n) != n) fatal("length error"); if(first && buf[len-1]!='\n') buf[len++] = '\n'; for(n=len-1 ; n>0 && count>0; n--) if(buf[n-1] == '\n') { count--; if(dir == REV) twrite(buf+n, len-n); len = n; } } if(dir == FWD) { tseek(n==0? 0 : pos+n+1, 0); copy(); } else if(count > 0) twrite(buf, len); } vlong tseek(vlong o, int p) { o = seek(file, o, p); if(o == -1) fatal(""); return o; } long tread(char *buf, long n) { int r = read(file, buf, n); if(r == -1) fatal(""); return r; } void twrite(char *s, long n) { if(Bwrite(&bout, s, n) != n) fatal(""); } int getnumber(char *s) { if(*s=='-' || *s=='+') s++; if(!isdigit((uchar)*s)) return 0; if(s[-1] == '+') origin = BEG; if(anycount++) fatal("excess option"); count = atol(s); /* check range of count */ if(count < 0 || (int)count != count) fatal("too big"); return 1; } void fatal(char *s) { char buf[ERRMAX]; errstr(buf, sizeof buf); fprint(2, "tail: %s: %s\n", s, buf); exits(s); } void usage(void) { fprint(2, "%s\n", umsg); exits("usage"); } 9base-6/tail/Makefile0000644000175000017500000000017611402154555014143 0ustar anselmanselm# tail - tail unix port from plan9 # # Depends on ../lib9 TARG = tail include ../std.mk pre-uninstall: post-install: 9base-6/tail/tail.10000644000175000017500000000260411402154555013514 0ustar anselmanselm.TH TAIL 1 .SH NAME tail \- deliver the last part of a file .SH SYNOPSIS .B tail [ .BR +- \fInumber\fP[ lbc ][ rf ] ] [ .I file ] .PP .B tail [ .B -fr ] [ .B -n .I nlines ] [ .B -c .I nbytes ] [ .I file ] .SH DESCRIPTION .I Tail copies the named file to the standard output beginning at a designated place. If no file is named, the standard input is copied. .PP Copying begins at position .BI + number measured from the beginning, or .BI - number from the end of the input. .I Number is counted in lines, 1K blocks or bytes, according to the appended flag .LR l , .LR b , or .LR c . Default is .B -10l (ten ell). .PP The further flag .L r causes tail to print lines from the end of the file in reverse order; .L f (follow) causes .IR tail , after printing to the end, to keep watch and print further data as it appears. .PP The second syntax is that promulgated by POSIX, where the .I numbers rather than the options are signed. .SH EXAMPLES .TP .B tail file Print the last 10 lines of a file. .TP .B tail +0f file Print a file, and continue to watch data accumulate as it grows. .TP .B sed 10q file Print the first 10 lines of a file. .SH SOURCE .B \*9/src/cmd/tail.c .SH BUGS Tails relative to the end of the file are treasured up in a buffer, and thus are limited in length. .PP According to custom, option .BI + number counts lines from 1, and counts blocks and bytes from 0. .PP .I Tail is ignorant of UTF. 9base-6/split/0000755000175000017500000000000011402154555012701 5ustar anselmanselm9base-6/split/split.c0000644000175000017500000000627111402154555014206 0ustar anselmanselm#include #include #include #include #include char digit[] = "0123456789"; char *suffix = ""; char *stem = "x"; char suff[] = "aa"; char name[200]; Biobuf bout; Biobuf *output = &bout; extern int nextfile(void); extern int matchfile(Resub*); extern void openf(void); extern char *fold(char*,int); extern void usage(void); extern void badexp(void); void main(int argc, char *argv[]) { Reprog *exp; char *pattern = 0; int n = 1000; char *line; int xflag = 0; int iflag = 0; Biobuf bin; Biobuf *b = &bin; char buf[256]; ARGBEGIN { case 'l': case 'n': n=atoi(EARGF(usage())); break; case 'e': pattern = strdup(EARGF(usage())); break; case 'f': stem = strdup(EARGF(usage())); break; case 's': suffix = strdup(EARGF(usage())); break; case 'x': xflag++; break; case 'i': iflag++; break; default: usage(); break; } ARGEND; if(argc < 0 || argc > 1) usage(); if(argc != 0) { b = Bopen(argv[0], OREAD); if(b == nil) { fprint(2, "split: can't open %s: %r\n", argv[0]); exits("open"); } } else Binit(b, 0, OREAD); if(pattern) { if(!(exp = regcomp(iflag? fold(pattern,strlen(pattern)): pattern))) badexp(); while((line=Brdline(b,'\n')) != 0) { Resub match[2]; memset(match, 0, sizeof match); line[Blinelen(b)-1] = 0; if(regexec(exp,iflag?fold(line,Blinelen(b)-1):line,match,2)) { if(matchfile(match) && xflag) continue; } else if(output == 0) nextfile(); /* at most once */ Bwrite(output, line, Blinelen(b)-1); Bputc(output, '\n'); } } else { int linecnt = n; while((line=Brdline(b,'\n')) != 0) { if(++linecnt > n) { nextfile(); linecnt = 1; } Bwrite(output, line, Blinelen(b)); } /* * in case we didn't end with a newline, tack whatever's * left onto the last file */ while((n = Bread(b, buf, sizeof(buf))) > 0) Bwrite(output, buf, n); } if(b != nil) Bterm(b); exits(0); } int nextfile(void) { static int canopen = 1; if(suff[0] > 'z') { if(canopen) fprint(2, "split: file %szz not split\n",stem); canopen = 0; } else { strcpy(name, stem); strcat(name, suff); if(++suff[1] > 'z') suff[1] = 'a', ++suff[0]; openf(); } return canopen; } int matchfile(Resub *match) { if(match[1].s.sp) { int len = match[1].e.ep - match[1].s.sp; strncpy(name, match[1].s.sp, len); strcpy(name+len, suffix); openf(); return 1; } return nextfile(); } void openf(void) { static int fd = 0; Bflush(output); Bterm(output); if(fd > 0) close(fd); fd = create(name,OWRITE,0666); if(fd < 0) { fprint(2, "grep: can't create %s: %r\n", name); exits("create"); } Binit(output, fd, OWRITE); } char * fold(char *s, int n) { static char *fline; static int linesize = 0; char *t; if(linesize < n+1){ fline = realloc(fline,n+1); linesize = n+1; } for(t=fline; *t++ = tolower((uchar)*s++); ) continue; /* we assume the 'A'-'Z' only appear as themselves * in a utf encoding. */ return fline; } void usage(void) { fprint(2, "usage: split [-n num] [-e exp] [-f stem] [-s suff] [-x] [-i] [file]\n"); exits("usage"); } void badexp(void) { fprint(2, "split: bad regular expression\n"); exits("bad regular expression"); } 9base-6/split/split.10000644000175000017500000000222211402154555014114 0ustar anselmanselm.TH SPLIT 1 .CT 1 files .SH NAME split \- split a file into pieces .SH SYNOPSIS .B split [ .I option ... ] [ .I file ] .SH DESCRIPTION .I Split reads .I file (standard input by default) and writes it in pieces of 1000 lines per output file. The names of the output files are .BR xaa , .BR xab , and so on to .BR xzz . The options are .TP .BI -n " n" Split into .IR n -line pieces. .TP .BI -l " n" Synonym for .B -n .IR n , a nod to Unix's syntax. .TP .BI -e " expression" File divisions occur at each line that matches a regular .IR expression ; see .IR regexp (7). Multiple .B -e options may appear. If a subexpression of .I expression is contained in parentheses .BR ( ... ) , the output file name is the portion of the line which matches the subexpression. .TP .BI -f " stem Use .I stem instead of .B x in output file names. .TP .BI -s " suffix Append .I suffix to names identified under .BR -e . .TP .B -x Exclude the matched input line from the output file. .TP .B -i Ignore case in option .BR -e ; force output file names (excluding the suffix) to lower case. .SH SOURCE .B \*9/src/cmd/split.c .SH SEE ALSO .IR sed (1), .IR awk (1), .IR grep (1), .IR regexp (7) 9base-6/split/Makefile0000644000175000017500000000017711402154555014346 0ustar anselmanselm# split - split unix port from plan9 # Depends on ../lib9 TARG = split include ../std.mk pre-uninstall: post-install: 9base-6/date/0000755000175000017500000000000011402154555012463 5ustar anselmanselm9base-6/date/date.10000644000175000017500000000207011402154555013461 0ustar anselmanselm.TH DATE 1 .SH NAME date \- date and time .SH SYNOPSIS .B date [ .I option ] [ .I seconds ] .\" .br .\" .B clock .SH DESCRIPTION Print the date, in the format .PP .B Tue Aug 16 17:03:52 CDT 1977 .PP The options are .TP .B -u Report Greenwich Mean Time (GMT) rather than local time. .TP .B -n Report the date as the number of seconds since the epoch, 00:00:00 GMT, January 1, 1970. .PP The conversion from Greenwich Mean Time to local time depends on the .B $timezone environment variable; see .IR ctime (3). .PP If the optional argument .I seconds is present, it is used as the time to convert rather than the real time. .\" .SH FILES .\" .TF /adm/timezone/local .\" .TP .\" .B /env/timezone .\" Current timezone name and adjustments. .\" .TP .\" .B /adm/timezone .\" A directory containing timezone tables. .\" .TP .\" .B /adm/timezone/local .\" Default timezone file, copied by .\" .IR init (8) .\" into .\" .BR /env/timezone . .\" .PD .\" .PP .\" .I Clock .\" draws a simple analog clock in its window. .SH SOURCE .B \*9/src/cmd/date.c .\" .br .\" .B \*9/src/cmd/draw/clock.c 9base-6/date/Makefile0000644000175000017500000000017411402154555014125 0ustar anselmanselm# date - date unix port from plan9 # Depends on ../lib9 TARG = date include ../std.mk pre-uninstall: post-install: 9base-6/date/date.c0000644000175000017500000000070111402154555013542 0ustar anselmanselm#include #include int uflg, nflg; void main(int argc, char *argv[]) { ulong now; ARGBEGIN{ case 'n': nflg = 1; break; case 'u': uflg = 1; break; default: fprint(2, "usage: date [-un] [seconds]\n"); exits("usage"); }ARGEND if(argc == 1) now = strtoul(*argv, 0, 0); else now = time(0); if(nflg) print("%ld\n", now); else if(uflg) print("%s", asctime(gmtime(now))); else print("%s", ctime(now)); exits(0); } 9base-6/README0000644000175000017500000000113511402154555012426 0ustar anselmanselmAbstract -------- This is a port of various original Plan 9 tools for Unix, based on plan9port[1]. See the LICENSE file for license details. Installation ------------ Edit config.mk to match your local setup and execute 'make install' (if necessary as root). By default, 9base is installed into its own hierarchy, /usr/local/plan9. This is done to avoid conflicts with the standard tools of your system. Credits ------- Many thanks go to Lucent, the Bell Labs which developed this fine stuff and to Russ Cox for his plan9port. References ---------- [1] http://swtch.com/plan9port/ --Anselm R Garbe 9base-6/factor/0000755000175000017500000000000011402154555013024 5ustar anselmanselm9base-6/factor/factor.10000644000175000017500000000177111402154555014372 0ustar anselmanselm.TH FACTOR 1 .CT 1 numbers .SH NAME factor, primes \- factor a number, generate large primes .SH SYNOPSIS .B factor [ .I number ] .PP .B primes [ .I start [ .I finish ] ] .SH DESCRIPTION .I Factor prints .I number and its prime factors, each repeated the proper number of times. The number must be positive and less than .if n 2**54 .if t 2\u\s754\s0\d (about .if n 1.8e16) .if t 1.8\(mu10\u\s716\s0\d\|). .PP If no .I number is given, .I factor reads a stream of numbers from the standard input and factors them. It exits on any input not a positive integer. Maximum running time is proportional to .if n sqrt(n). .if t .I \(sr\o'n\(rn'\f1. .PP .PP .I Primes prints the prime numbers ranging from .I start to .IR finish , where .I start and .I finish are positive numbers less than .if n 2**56. .if t 2\u\s756\s0\d. If .I finish is missing, .I primes prints without end; if .I start is missing, it reads the starting number from the standard input. .SH SOURCE .B \*9/src/cmd/factor.c .br .B \*9/src/cmd/primes.c 9base-6/factor/factor.c0000644000175000017500000000250411402154555014447 0ustar anselmanselm#include #include #include #define whsiz (sizeof(wheel)/sizeof(wheel[0])) double wheel[] = { 2,10, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 4, 2,10, }; Biobuf bin; void factor(double); void main(int argc, char *argv[]) { double n; int i; char *l; if(argc > 1) { for(i=1; i= whsiz) { i = 0; if(d > s) break; } } if(n > 1) print(" %.0f\n",n); print("\n"); } 9base-6/factor/Makefile0000644000175000017500000000017511402154555014467 0ustar anselmanselm# factor - unix port from plan9 # # Depends on ../lib9 TARG = factor include ../std.mk pre-uninstall: post-install: 9base-6/unicode/0000755000175000017500000000000011402154555013174 5ustar anselmanselm9base-6/unicode/unicode.10000644000175000017500000000000011402154555014672 0ustar anselmanselm9base-6/unicode/unicode.c0000644000175000017500000000364411402154555014775 0ustar anselmanselm#include #include #include char usage[] = "unicode { [-t] hex hex ... | hexmin-hexmax ... | [-n] char ... }"; char hex[] = "0123456789abcdefABCDEF"; int numout = 0; int text = 0; char *err; Biobuf bout; char *range(char*[]); char *nums(char*[]); char *chars(char*[]); void main(int argc, char *argv[]) { ARGBEGIN{ case 'n': numout = 1; break; case 't': text = 1; break; }ARGEND Binit(&bout, 1, OWRITE); if(argc == 0){ fprint(2, "usage: %s\n", usage); exits("usage"); } if(!numout && utfrune(argv[0], '-')) exits(range(argv)); if(numout || strchr(hex, argv[0][0])==0) exits(nums(argv)); exits(chars(argv)); } char* range(char *argv[]) { char *q; int min, max; int i; while(*argv){ q = *argv; if(strchr(hex, q[0]) == 0){ err: fprint(2, "unicode: bad range %s\n", *argv); return "bad range"; } min = strtoul(q, &q, 16); if(min<0 || min>Runemax || *q!='-') goto err; q++; if(strchr(hex, *q) == 0) goto err; max = strtoul(q, &q, 16); if(max<0 || max>Runemax || maxRunemax || *q!=0) goto err; Bprint(&bout, "%C", m); if(!text) Bprint(&bout, "\n"); argv++; } return 0; } 9base-6/unicode/Makefile0000644000175000017500000000020511402154555014631 0ustar anselmanselm# unicode - unicode unix port from plan9 # Depends on ../lib9 TARG = unicode include ../std.mk pre-uninstall: post-install: 9base-6/tee/0000755000175000017500000000000011402154555012323 5ustar anselmanselm9base-6/tee/tee.10000644000175000017500000000053611402154555013166 0ustar anselmanselm.TH TEE 1 .SH NAME tee \- pipe fitting .SH SYNOPSIS .B tee [ .B -i ] [ .B -a ] .I files .SH DESCRIPTION .I Tee transcribes the standard input to the standard output and makes copies in the .IR files . The options are .TP .B -i Ignore interrupts. .TP .B -a Append the output to the .I files rather than rewriting them. .SH SOURCE .B \*9/src/cmd/tee.c 9base-6/tee/Makefile0000644000175000017500000000017111402154555013762 0ustar anselmanselm# tee - tee unix port from plan9 # Depends on ../lib9 TARG = tee include ../std.mk pre-uninstall: post-install: 9base-6/tee/tee.c0000644000175000017500000000204611402154555013246 0ustar anselmanselm/* * tee-- pipe fitting */ #include #include int uflag; int aflag; int openf[100]; char in[8192]; int intignore(void*, char*); void main(int argc, char **argv) { int i; int r, n; ARGBEGIN { case 'a': aflag++; break; case 'i': atnotify(intignore, 1); break; case 'u': uflag++; /* uflag is ignored and undocumented; it's a relic from Unix */ break; default: fprint(2, "usage: tee [-ai] [file ...]\n"); exits("usage"); } ARGEND USED(argc); n = 0; while(*argv) { if(aflag) { openf[n] = open(argv[0], OWRITE); if(openf[n] < 0) openf[n] = create(argv[0], OWRITE, 0666); seek(openf[n], 0L, 2); } else openf[n] = create(argv[0], OWRITE, 0666); if(openf[n] < 0) { fprint(2, "tee: cannot open %s: %r\n", argv[0]); } else n++; argv++; } openf[n++] = 1; for(;;) { r = read(0, in, sizeof in); if(r <= 0) exits(nil); for(i=0; i directive. .TP .BI -u " url Use .I url as the base URL for the document when displaying anchors; sets .BI -a . .SH SOURCE .B \*9/src/cmd/fmt.c .PP .B \*9/src/cmd/htmlfmt .SH BUGS .I Htmlfmt makes no attempt to render the two-dimensional geometry of tables; it just treats the table entries as plain, to-be-formatted text. 9base-6/fmt/fmt.c0000644000175000017500000000776511402154555013305 0ustar anselmanselm#include #include #include #include /* * block up paragraphs, possibly with indentation */ int extraindent = 0; /* how many spaces to indent all lines */ int indent = 0; /* current value of indent, before extra indent */ int length = 70; /* how many columns per output line */ int join = 1; /* can lines be joined? */ int maxtab = 8; Biobuf bin; Biobuf bout; typedef struct Word Word; struct Word{ int bol; int indent; char text[1]; }; void fmt(void); void usage(void) { fprint(2, "usage: %s [-j] [-i indent] [-l length] [file...]\n", argv0); exits("usage"); } void main(int argc, char **argv) { int i, f; char *s, *err; ARGBEGIN{ case 'i': extraindent = atoi(EARGF(usage())); break; case 'j': join = 0; break; case 'w': case 'l': length = atoi(EARGF(usage())); break; default: usage(); }ARGEND if(length <= indent){ fprint(2, "%s: line length<=indentation\n", argv0); exits("length"); } s=getenv("tabstop"); if(s!=nil && atoi(s)>0) maxtab=atoi(s); err = nil; Binit(&bout, 1, OWRITE); if(argc <= 0){ Binit(&bin, 0, OREAD); fmt(); }else{ for(i=0; itext, s, l); w->text[l] = '\0'; w->indent = indent; w->bol = bol; words = realloc(words, (*nwordp+1)*sizeof(Word*)); words[(*nwordp)++] = w; return words; } Word** parseline(char *line, Word **words, int *nwordp) { int ind, l, bol; ind = indentof(&line); indent = ind; bol = 1; for(;;){ /* find next word */ while(*line==' ' || *line=='\t') line++; if(*line == '\0'){ if(bol) return addword(words, nwordp, "", 0, -1, bol); break; } /* how long is this word? */ for(l=0; line[l]; l++) if(line[l]==' ' || line[l]=='\t') break; words = addword(words, nwordp, line, l, indent, bol); bol = 0; line += l; } return words; } void printindent(int w) { while(w >= maxtab){ Bputc(&bout, '\t'); w -= maxtab; } while(w > 0){ Bputc(&bout, ' '); w--; } } /* give extra space if word ends with period, etc. */ int nspaceafter(char *s) { int n; n = strlen(s); if(n < 2) return 1; if(isupper((uchar)s[0]) && n < 4) return 1; if(strchr(".!?", s[n-1]) != nil) return 2; return 1; } void printwords(Word **w, int nw) { int i, j, n, col, nsp; /* one output line per loop */ for(i=0; iindent == -1){ Bputc(&bout, '\n'); if(++i == nw) /* out of words */ break; } /* emit leading indent */ col = extraindent+w[i]->indent; printindent(col); /* emit words until overflow; always emit at least one word */ for(n=0;; n++){ Bprint(&bout, "%s", w[i]->text); col += utflen(w[i]->text); if(++i == nw) break; /* out of words */ if(w[i]->indent != w[i-1]->indent) break; /* indent change */ nsp = nspaceafter(w[i-1]->text); if(col+nsp+utflen(w[i]->text) > extraindent+length) break; /* fold line */ if(!join && w[i]->bol) break; for(j=0; j #include #include #include static int digestfmt(Fmt *fmt) { char buf[SHA1dlen*2+1]; uchar *p; int i; p = va_arg(fmt->args, uchar*); for(i=0; i 0) sha1(buf, n, nil, s); sha1(nil, 0, digest, s); if(name == nil) print("%M\n", digest); else print("%M\t%s\n", digest, name); } void main(int argc, char *argv[]) { int i, fd; ARGBEGIN{ default: fprint(2, "usage: sha1sum [file...]\n"); exits("usage"); }ARGEND fmtinstall('M', digestfmt); if(argc == 0) sum(0, nil); else for(i = 0; i < argc; i++){ fd = open(argv[i], OREAD); if(fd < 0){ fprint(2, "sha1sum: can't open %s: %r\n", argv[i]); continue; } sum(fd, argv[i]); close(fd); } exits(nil); } 9base-6/tr/0000755000175000017500000000000011402154555012173 5ustar anselmanselm9base-6/tr/Makefile0000644000175000017500000000016611402154555013636 0ustar anselmanselm# tr - tr unix port from plan9 # Depends on ../lib9 TARG = tr include ../std.mk pre-uninstall: post-install: 9base-6/tr/tr.c0000644000175000017500000001357011402154555012772 0ustar anselmanselm#include #include typedef struct PCB /* Control block controlling specification parse */ { char *base; /* start of specification */ char *current; /* current parse point */ long last; /* last Rune returned */ long final; /* final Rune in a span */ } Pcb; uchar bits[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; #define SETBIT(a, c) ((a)[(c)/8] |= bits[(c)&07]) #define CLEARBIT(a,c) ((a)[(c)/8] &= ~bits[(c)&07]) #define BITSET(a,c) ((a)[(c)/8] & bits[(c)&07]) #define MAXRUNE 0xFFFF uchar f[(MAXRUNE+1)/8]; uchar t[(MAXRUNE+1)/8]; char wbuf[4096]; char *wptr; Pcb pfrom, pto; int cflag; int dflag; int sflag; void complement(void); void delete(void); void squeeze(void); void translit(void); void error(char*); long canon(Pcb*); char *getrune(char*, Rune*); void Pinit(Pcb*, char*); void Prewind(Pcb *p); int readrune(int, long*); void wflush(int); void writerune(int, Rune); void main(int argc, char **argv) { ARGBEGIN{ case 's': sflag++; break; case 'd': dflag++; break; case 'c': cflag++; break; default: error("bad option"); }ARGEND if(argc>0) Pinit(&pfrom, argv[0]); if(argc>1) Pinit(&pto, argv[1]); if(argc>2) error("arg count"); if(dflag) { if ((sflag && argc != 2) || (!sflag && argc != 1)) error("arg count"); delete(); } else { if (argc != 2) error("arg count"); if (cflag) complement(); else translit(); } exits(0); } void delete(void) { long c, last; if (cflag) { memset((char *) f, 0xff, sizeof f); while ((c = canon(&pfrom)) >= 0) CLEARBIT(f, c); } else { while ((c = canon(&pfrom)) >= 0) SETBIT(f, c); } if (sflag) { while ((c = canon(&pto)) >= 0) SETBIT(t, c); } last = 0x10000; while (readrune(0, &c) > 0) { if(!BITSET(f, c) && (c != last || !BITSET(t,c))) { last = c; writerune(1, (Rune) c); } } wflush(1); } void complement(void) { Rune *p; int i; long from, to, lastc, high; lastc = 0; high = 0; while ((from = canon(&pfrom)) >= 0) { if (from > high) high = from; SETBIT(f, from); } while ((to = canon(&pto)) > 0) { if (to > high) high = to; SETBIT(t,to); } Prewind(&pto); if ((p = (Rune *) malloc((high+1)*sizeof(Rune))) == 0) error("can't allocate memory"); for (i = 0; i <= high; i++){ if (!BITSET(f,i)) { if ((to = canon(&pto)) < 0) to = lastc; else lastc = to; p[i] = to; } else p[i] = i; } if (sflag){ lastc = 0x10000; while (readrune(0, &from) > 0) { if (from > high) from = to; else from = p[from]; if (from != lastc || !BITSET(t,from)) { lastc = from; writerune(1, (Rune) from); } } } else { while (readrune(0, &from) > 0){ if (from > high) from = to; else from = p[from]; writerune(1, (Rune) from); } } wflush(1); } void translit(void) { Rune *p; int i; long from, to, lastc, high; lastc = 0; high = 0; while ((from = canon(&pfrom)) >= 0) if (from > high) high = from; Prewind(&pfrom); if ((p = (Rune *) malloc((high+1)*sizeof(Rune))) == 0) error("can't allocate memory"); for (i = 0; i <= high; i++) p[i] = i; while ((from = canon(&pfrom)) >= 0) { if ((to = canon(&pto)) < 0) to = lastc; else lastc = to; if (BITSET(f,from) && p[from] != to) error("ambiguous translation"); SETBIT(f,from); p[from] = to; SETBIT(t,to); } while ((to = canon(&pto)) >= 0) { SETBIT(t,to); } if (sflag){ lastc = 0x10000; while (readrune(0, &from) > 0) { if (from <= high) from = p[from]; if (from != lastc || !BITSET(t,from)) { lastc = from; writerune(1, (Rune) from); } } } else { while (readrune(0, &from) > 0) { if (from <= high) from = p[from]; writerune(1, (Rune) from); } } wflush(1); } int readrune(int fd, long *rp) { Rune r; int j; static int i, n; static char buf[4096]; j = i; for (;;) { if (i >= n) { wflush(1); if (j != i) memcpy(buf, buf+j, n-j); i = n-j; n = read(fd, &buf[i], sizeof(buf)-i); if (n < 0) error("read error"); if (n == 0) return 0; j = 0; n += i; } i++; if (fullrune(&buf[j], i-j)) break; } chartorune(&r, &buf[j]); *rp = r; return 1; } void writerune(int fd, Rune r) { char buf[UTFmax]; int n; if (!wptr) wptr = wbuf; n = runetochar(buf, (Rune*)&r); if (wptr+n >= wbuf+sizeof(wbuf)) wflush(fd); memcpy(wptr, buf, n); wptr += n; } void wflush(int fd) { if (wptr && wptr > wbuf) if (write(fd, wbuf, wptr-wbuf) != wptr-wbuf) error("write error"); wptr = wbuf; } char * getrune(char *s, Rune *rp) { Rune r; char *save; int i, n; s += chartorune(rp, s); if((r = *rp) == '\\' && *s){ n = 0; if (*s == 'x') { s++; for (i = 0; i < 4; i++) { save = s; s += chartorune(&r, s); if ('0' <= r && r <= '9') n = 16*n + r - '0'; else if ('a' <= r && r <= 'f') n = 16*n + r - 'a' + 10; else if ('A' <= r && r <= 'F') n = 16*n + r - 'A' + 10; else { if (i == 0) *rp = 'x'; else *rp = n; return save; } } } else { for(i = 0; i < 3; i++) { save = s; s += chartorune(&r, s); if('0' <= r && r <= '7') n = 8*n + r - '0'; else { if (i == 0) { *rp = r; return s; } *rp = n; return save; } } if(n > 0377) error("char>0377"); } *rp = n; } return s; } long canon(Pcb *p) { Rune r; if (p->final >= 0) { if (p->last < p->final) return ++p->last; p->final = -1; } if (*p->current == '\0') return -1; if(*p->current == '-' && p->last >= 0 && p->current[1]){ p->current = getrune(p->current+1, &r); if (r < p->last) error ("Invalid range specification"); if (r > p->last) { p->final = r; return ++p->last; } } p->current = getrune(p->current, &r); p->last = r; return p->last; } void Pinit(Pcb *p, char *cp) { p->current = p->base = cp; p->last = p->final = -1; } void Prewind(Pcb *p) { p->current = p->base; p->last = p->final = -1; } void error(char *s) { fprint(2, "%s: %s\n", argv0, s); exits(s); } 9base-6/tr/tr.10000644000175000017500000000330111402154555012677 0ustar anselmanselm.TH TR 1 .SH NAME tr \- translate characters .SH SYNOPSIS .B tr [ .B -cds ] [ .I string1 [ .I string2 ] ] .SH DESCRIPTION .I Tr copies the standard input to the standard output with substitution or deletion of selected characters (runes). Input characters found in .I string1 are mapped into the corresponding characters of .IR string2 . When .I string2 is short it is padded to the length of .I string1 by duplicating its last character. Any combination of the options .B -cds may be used: .TP .B -c Complement .IR string1 : replace it with a lexicographically ordered list of all other characters. .TP .B -d Delete from input all characters in .IR string1 . .TP .B -s Squeeze repeated output characters that occur in .I string2 to single characters. .PP In either string a noninitial sequence .BI - x\f1, where .I x is any character (possibly quoted), stands for a range of characters: a possibly empty sequence of codes running from the successor of the previous code up through the code for .IR x . The character .L \e followed by 1, 2 or 3 octal digits stands for the character whose 16-bit value is given by those digits. The character sequence .L \ex followed by 1, 2, 3, or 4 hexadecimal digits stands for the character whose 16-bit value is given by those digits. A .L \e followed by any other character stands for that character. .SH EXAMPLES Replace all upper-case .SM ASCII letters by lower-case. .IP .EX tr A-Z a-z lower .EE .PP Create a list of all the words in .L file1 one per line in .LR file2 , where a word is taken to be a maximal string of alphabetics. .I String2 is given as a quoted newline. .IP .EX tr -cs A-Za-z ' \&' file2 .EE .SH SOURCE .B \*9/src/cmd/tr.c .SH "SEE ALSO" .IR sed (1) 9base-6/mk/0000755000175000017500000000000011402154555012155 5ustar anselmanselm9base-6/mk/sys.std.h0000644000175000017500000000114611402154555013737 0ustar anselmanselm#include #include #include #include #include #include #include #include #include #include #include #define OREAD O_RDONLY #define OWRITE O_WRONLY #define ORDWR O_RDWR #define nil 0 #define nelem(x) (sizeof(x)/sizeof((x)[0])) #define seek lseek #define remove unlink #define exits(x) exit(x && *(char*)x ? 1 : 0) #define USED(x) if(x){}else #define create(name, mode, perm) open(name, mode|O_CREAT, perm) #define ERRMAX 256 typedef uintptr_t uintptr; #define uchar mk_uchar typedef unsigned char uchar; 9base-6/mk/shell.c0000644000175000017500000000210511402154555013426 0ustar anselmanselm#include "mk.h" static Shell *shells[] = { &rcshell, &shshell }; Shell *shelldefault = &shshell; Shell *shellt; Word *shellcmd; typedef struct Shellstack Shellstack; struct Shellstack { Shell *t; Word *w; Shellstack *next; }; Shellstack *shellstack; char* setshell(Word *w) { int i; if(w->s == nil) return "shell name not found on line"; for(i=0; imatchname(w->s)) break; if(i == nelem(shells)) return "cannot determine shell type"; shellt = shells[i]; shellcmd = w; return nil; } void initshell(void) { shellcmd = stow(shelldefault->name); shellt = shelldefault; setvar("MKSHELL", shellcmd); } void pushshell(void) { Shellstack *s; /* save */ s = Malloc(sizeof *s); s->t = shellt; s->w = shellcmd; s->next = shellstack; shellstack = s; initshell(); /* reset to defaults */ } void popshell(void) { Shellstack *s; if(shellstack == nil){ fprint(2, "internal shellstack error\n"); Exit(); } s = shellstack; shellstack = s->next; shellt = s->t; shellcmd = s->w; setvar("MKSHELL", shellcmd); free(s); } 9base-6/mk/archive.c0000644000175000017500000001112111402154555013736 0ustar anselmanselm#include "mk.h" #define ARMAG "!\n" #define SARMAG 8 #define ARFMAG "`\n" #define SARNAME 16 struct ar_hdr { char name[SARNAME]; char date[12]; char uid[6]; char gid[6]; char mode[8]; char size[10]; char fmag[2]; }; #define SAR_HDR (SARNAME+44) static int dolong = 1; static void atimes(char *); static char *split(char*, char**); long readn(int f, void *av, long n) { char *a; long m, t; a = av; t = 0; while(t < n){ m = read(f, a+t, n-t); if(m <= 0){ if(t == 0) return m; break; } t += m; } return t; } long atimeof(int force, char *name) { Symtab *sym; long t; char *archive, *member, buf[512]; archive = split(name, &member); if(archive == 0) Exit(); t = mtime(archive); sym = symlook(archive, S_AGG, 0); if(sym){ if(force || (t > sym->u.value)){ atimes(archive); sym->u.value = t; } } else{ atimes(archive); /* mark the aggegate as having been done */ symlook(strdup(archive), S_AGG, "")->u.value = t; } /* truncate long member name to sizeof of name field in archive header */ if(dolong) snprint(buf, sizeof(buf), "%s(%s)", archive, member); else snprint(buf, sizeof(buf), "%s(%.*s)", archive, SARNAME, member); sym = symlook(buf, S_TIME, 0); if (sym) return sym->u.value; return 0; } void atouch(char *name) { char *archive, *member; int fd, i; struct ar_hdr h; long t; archive = split(name, &member); if(archive == 0) Exit(); fd = open(archive, ORDWR); if(fd < 0){ fd = create(archive, OWRITE, 0666); if(fd < 0){ fprint(2, "create %s: %r\n", archive); Exit(); } write(fd, ARMAG, SARMAG); } if(symlook(name, S_TIME, 0)){ /* hoon off and change it in situ */ LSEEK(fd, SARMAG, 0); while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){ for(i = SARNAME-1; i > 0 && h.name[i] == ' '; i--) ; h.name[i+1]=0; if(strcmp(member, h.name) == 0){ t = SARNAME-sizeof(h); /* ughgghh */ LSEEK(fd, t, 1); fprint(fd, "%-12ld", time(0)); break; } t = atol(h.size); if(t&01) t++; LSEEK(fd, t, 1); } } close(fd); } static void atimes(char *ar) { struct ar_hdr h; long t; int fd, i, namelen; char buf[2048], *p, *strings; char name[1024]; Symtab *sym; strings = nil; fd = open(ar, OREAD); if(fd < 0) return; if(read(fd, buf, SARMAG) != SARMAG){ close(fd); return; } while(readn(fd, (char *)&h, sizeof(h)) == sizeof(h)){ t = atol(h.date); if(t == 0) /* as it sometimes happens; thanks ken */ t = 1; namelen = 0; if(memcmp(h.name, "#1/", 3) == 0){ /* BSD */ namelen = atoi(h.name+3); if(namelen >= sizeof name){ namelen = 0; goto skip; } if(readn(fd, name, namelen) != namelen) break; name[namelen] = 0; }else if(memcmp(h.name, "// ", 2) == 0){ /* GNU */ /* date, uid, gid, mode all ' ' */ for(i=2; i<16+12+6+6+8; i++) if(h.name[i] != ' ') goto skip; t = atol(h.size); if(t&01) t++; free(strings); strings = malloc(t+1); if(strings){ if(readn(fd, strings, t) != t){ free(strings); strings = nil; break; } strings[t] = 0; continue; } goto skip; }else if(strings && h.name[0]=='/' && isdigit((uchar)h.name[1])){ i = strtol(h.name+1, &p, 10); if(*p != ' ' || i >= strlen(strings)) goto skip; p = strings+i; for(; *p && *p != '/'; p++) ; namelen = p-(strings+i); if(namelen >= sizeof name){ namelen = 0; goto skip; } memmove(name, strings+i, namelen); name[namelen] = 0; namelen = 0; }else{ strncpy(name, h.name, sizeof(h.name)); for(i = sizeof(h.name)-1; i > 0 && name[i] == ' '; i--) ; if(name[i] == '/') /* system V bug */ i--; name[i+1]=0; } snprint(buf, sizeof buf, "%s(%s)", ar, name); sym = symlook(strdup(buf), S_TIME, (void *)t); sym->u.value = t; skip: t = atol(h.size); if(t&01) t++; t -= namelen; LSEEK(fd, t, 1); } close(fd); free(strings); } static int type(char *file) { int fd; char buf[SARMAG]; fd = open(file, OREAD); if(fd < 0){ if(symlook(file, S_BITCH, 0) == 0){ if(strlen(file) < 2 || strcmp(file+strlen(file)-2, ".a") != 0) Bprint(&bout, "%s doesn't exist: assuming it will be an archive\n", file); symlook(file, S_BITCH, (void *)file); } return 1; } if(read(fd, buf, SARMAG) != SARMAG){ close(fd); return 0; } close(fd); return !strncmp(ARMAG, buf, SARMAG); } static char* split(char *name, char **member) { char *p, *q; p = strdup(name); q = utfrune(p, '('); if(q){ *q++ = 0; if(member) *member = q; q = utfrune(q, ')'); if (q) *q = 0; if(type(p)) return p; free(p); fprint(2, "mk: '%s' is not an archive\n", name); } return 0; } 9base-6/mk/mkfile.test0000644000175000017500000000017311402154555014326 0ustar anselmanselmMKSHELL=$PLAN9/bin/rc use-rc:V: for(i in a b c) echo $i MKSHELL=/bin/sh use-sh:V: for i in a b c do echo $i done 9base-6/mk/varsub.c0000644000175000017500000001032711402154555013626 0ustar anselmanselm#include "mk.h" static Word *subsub(Word*, char*, char*); static Word *expandvar(char**); static Bufblock *varname(char**); static Word *extractpat(char*, char**, char*, char*); static int submatch(char*, Word*, Word*, int*, char**); static Word *varmatch(char *); Word * varsub(char **s) { Bufblock *b; Word *w; if(**s == '{') /* either ${name} or ${name: A%B==C%D}*/ return expandvar(s); b = varname(s); if(b == 0) return 0; w = varmatch(b->start); freebuf(b); return w; } /* * extract a variable name */ static Bufblock* varname(char **s) { Bufblock *b; char *cp; Rune r; int n; b = newbuf(); cp = *s; for(;;){ n = chartorune(&r, cp); if (!WORDCHR(r)) break; rinsert(b, r); cp += n; } if (b->current == b->start){ SYNERR(-1); fprint(2, "missing variable name <%s>\n", *s); freebuf(b); return 0; } *s = cp; insert(b, 0); return b; } static Word* varmatch(char *name) { Word *w; Symtab *sym; sym = symlook(name, S_VAR, 0); if(sym){ /* check for at least one non-NULL value */ for (w = sym->u.ptr; w; w = w->next) if(w->s && *w->s) return wdup(w); } return 0; } static Word* expandvar(char **s) { Word *w; Bufblock *buf; Symtab *sym; char *cp, *begin, *end; begin = *s; (*s)++; /* skip the '{' */ buf = varname(s); if (buf == 0) return 0; cp = *s; if (*cp == '}') { /* ${name} variant*/ (*s)++; /* skip the '}' */ w = varmatch(buf->start); freebuf(buf); return w; } if (*cp != ':') { SYNERR(-1); fprint(2, "bad variable name <%s>\n", buf->start); freebuf(buf); return 0; } cp++; end = shellt->charin(cp , "}"); if(end == 0){ SYNERR(-1); fprint(2, "missing '}': %s\n", begin); Exit(); } *end = 0; *s = end+1; sym = symlook(buf->start, S_VAR, 0); if(sym == 0 || sym->u.ptr == 0) w = newword(buf->start); else w = subsub(sym->u.ptr, cp, end); freebuf(buf); return w; } static Word* extractpat(char *s, char **r, char *term, char *end) { int save; char *cp; Word *w; cp = shellt->charin(s, term); if(cp){ *r = cp; if(cp == s) return 0; save = *cp; *cp = 0; w = stow(s); *cp = save; } else { *r = end; w = stow(s); } return w; } static Word* subsub(Word *v, char *s, char *end) { int nmid; Word *head, *tail, *w, *h; Word *a, *b, *c, *d; Bufblock *buf; char *cp, *enda; a = extractpat(s, &cp, "=%&", end); b = c = d = 0; if(PERCENT(*cp)) b = extractpat(cp+1, &cp, "=", end); if(*cp == '=') c = extractpat(cp+1, &cp, "&%", end); if(PERCENT(*cp)) d = stow(cp+1); else if(*cp) d = stow(cp); head = tail = 0; buf = newbuf(); for(; v; v = v->next){ h = w = 0; if(submatch(v->s, a, b, &nmid, &enda)){ /* enda points to end of A match in source; * nmid = number of chars between end of A and start of B */ if(c){ h = w = wdup(c); while(w->next) w = w->next; } if(PERCENT(*cp) && nmid > 0){ if(w){ bufcpy(buf, w->s, strlen(w->s)); bufcpy(buf, enda, nmid); insert(buf, 0); free(w->s); w->s = strdup(buf->start); } else { bufcpy(buf, enda, nmid); insert(buf, 0); h = w = newword(buf->start); } buf->current = buf->start; } if(d && *d->s){ if(w){ bufcpy(buf, w->s, strlen(w->s)); bufcpy(buf, d->s, strlen(d->s)); insert(buf, 0); free(w->s); w->s = strdup(buf->start); w->next = wdup(d->next); while(w->next) w = w->next; buf->current = buf->start; } else h = w = wdup(d); } } if(w == 0) h = w = newword(v->s); if(head == 0) head = h; else tail->next = h; tail = w; } freebuf(buf); delword(a); delword(b); delword(c); delword(d); return head; } static int submatch(char *s, Word *a, Word *b, int *nmid, char **enda) { Word *w; int n; char *end; n = 0; for(w = a; w; w = w->next){ n = strlen(w->s); if(strncmp(s, w->s, n) == 0) break; } if(a && w == 0) /* a == NULL matches everything*/ return 0; *enda = s+n; /* pointer to end a A part match */ *nmid = strlen(s)-n; /* size of remainder of source */ end = *enda+*nmid; for(w = b; w; w = w->next){ n = strlen(w->s); if(strcmp(w->s, end-n) == 0){ *nmid -= n; break; } } if(b && w == 0) /* b == NULL matches everything */ return 0; return 1; } 9base-6/mk/var.c0000644000175000017500000000101411402154555013105 0ustar anselmanselm#include "mk.h" void setvar(char *name, void *ptr) { symlook(name, S_VAR, ptr)->u.ptr = ptr; symlook(name, S_MAKEVAR, (void*)""); } static void print1(Symtab *s) { Word *w; Bprint(&bout, "\t%s=", s->name); for (w = s->u.ptr; w; w = w->next) Bprint(&bout, "'%s'", w->s); Bprint(&bout, "\n"); } void dumpv(char *s) { Bprint(&bout, "%s:\n", s); symtraverse(S_VAR, print1); } char * shname(char *a) { Rune r; int n; while (*a) { n = chartorune(&r, a); if (!WORDCHR(r)) break; a += n; } return a; } 9base-6/mk/sh.c0000644000175000017500000000654311402154555012743 0ustar anselmanselm#include "mk.h" /* * This file contains functions that depend on the shell's syntax. Most * of the routines extract strings observing the shell's escape conventions. */ /* * skip a token in quotes. */ static char * squote(char *cp, int c) { Rune r; int n; while(*cp){ n = chartorune(&r, cp); if(r == c) return cp; if(r == '\\') n += chartorune(&r, cp+n); cp += n; } SYNERR(-1); /* should never occur */ fprint(2, "missing closing '\n"); return 0; } /* * search a string for unescaped characters in a pattern set */ static char * shcharin(char *cp, char *pat) { Rune r; int n, vargen; vargen = 0; while(*cp){ n = chartorune(&r, cp); switch(r){ case '\\': /* skip escaped char */ cp += n; n = chartorune(&r, cp); break; case '\'': /* skip quoted string */ case '"': cp = squote(cp+1, r); /* n must = 1 */ if(!cp) return 0; break; case '$': if(*(cp+1) == '{') vargen = 1; break; case '}': if(vargen) vargen = 0; else if(utfrune(pat, r)) return cp; break; default: if(vargen == 0 && utfrune(pat, r)) return cp; break; } cp += n; } if(vargen){ SYNERR(-1); fprint(2, "missing closing } in pattern generator\n"); } return 0; } /* * extract an escaped token. Possible escape chars are single-quote, * double-quote,and backslash. */ static char* shexpandquote(char *s, Rune esc, Bufblock *b) { Rune r; if (esc == '\\') { s += chartorune(&r, s); rinsert(b, r); return s; } while(*s){ s += chartorune(&r, s); if(r == esc) return s; if (r == '\\') { rinsert(b, r); s += chartorune(&r, s); } rinsert(b, r); } return 0; } /* * Input an escaped token. Possible escape chars are single-quote, * double-quote and backslash. */ static int shescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) { int c, line; if(esc == '\\') { c = Bgetrune(bp); if(c == '\r') c = Bgetrune(bp); if (c == '\n') mkinline++; rinsert(buf, c); return 1; } line = mkinline; while((c = nextrune(bp, 0)) >= 0){ if(c == esc){ if(preserve) rinsert(buf, c); return 1; } if(c == '\\') { rinsert(buf, c); c = Bgetrune(bp); if(c == '\r') c = Bgetrune(bp); if (c < 0) break; if (c == '\n') mkinline++; } rinsert(buf, c); } SYNERR(line); fprint(2, "missing closing %c\n", esc); return 0; } /* * copy a quoted string; s points to char after opening quote */ static char * copysingle(char *s, Rune q, Bufblock *buf) { Rune r; while(*s){ s += chartorune(&r, s); rinsert(buf, r); if(r == q) break; } return s; } /* * check for quoted strings. backquotes are handled here; single quotes above. * s points to char after opening quote, q. */ static char * shcopyq(char *s, Rune q, Bufblock *buf) { if(q == '\'' || q == '"') /* copy quoted string */ return copysingle(s, q, buf); if(q != '`') /* not quoted */ return s; while(*s){ /* copy backquoted string */ s += chartorune(&q, s); rinsert(buf, q); if(q == '`') break; if(q == '\'' || q == '"') s = copysingle(s, q, buf); /* copy quoted string */ } return s; } static int shmatchname(char *name) { USED(name); return 1; } Shell shshell = { "sh", "\"'= \t", /*used in parse.c to isolate assignment attribute*/ ' ', /* inter-word separator in env */ shcharin, shexpandquote, shescapetoken, shcopyq, shmatchname }; 9base-6/mk/rc.c0000644000175000017500000000630711402154555012733 0ustar anselmanselm#include "mk.h" /* * This file contains functions that depend on rc's syntax. Most * of the routines extract strings observing rc's escape conventions */ /* * skip a token in single quotes. */ static char * squote(char *cp) { Rune r; int n; while(*cp){ n = chartorune(&r, cp); if(r == '\'') { n += chartorune(&r, cp+n); if(r != '\'') return(cp); } cp += n; } SYNERR(-1); /* should never occur */ fprint(2, "missing closing '\n"); return 0; } /* * search a string for characters in a pattern set * characters in quotes and variable generators are escaped */ char * rccharin(char *cp, char *pat) { Rune r; int n, vargen; vargen = 0; while(*cp){ n = chartorune(&r, cp); switch(r){ case '\'': /* skip quoted string */ cp = squote(cp+1); /* n must = 1 */ if(!cp) return 0; break; case '$': if(*(cp+1) == '{') vargen = 1; break; case '}': if(vargen) vargen = 0; else if(utfrune(pat, r)) return cp; break; default: if(vargen == 0 && utfrune(pat, r)) return cp; break; } cp += n; } if(vargen){ SYNERR(-1); fprint(2, "missing closing } in pattern generator\n"); } return 0; } /* * extract an escaped token. Possible escape chars are single-quote, * double-quote,and backslash. Only the first is valid for rc. the * others are just inserted into the receiving buffer. */ char* rcexpandquote(char *s, Rune r, Bufblock *b) { if (r != '\'') { rinsert(b, r); return s; } while(*s){ s += chartorune(&r, s); if(r == '\'') { if(*s == '\'') s++; else return s; } rinsert(b, r); } return 0; } /* * Input an escaped token. Possible escape chars are single-quote, * double-quote and backslash. Only the first is a valid escape for * rc; the others are just inserted into the receiving buffer. */ int rcescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) { int c, line; if(esc != '\'') return 1; line = mkinline; while((c = nextrune(bp, 0)) > 0){ if(c == '\''){ if(preserve) rinsert(buf, c); c = Bgetrune(bp); if (c < 0) break; if(c != '\''){ Bungetrune(bp); return 1; } } rinsert(buf, c); } SYNERR(line); fprint(2, "missing closing %c\n", esc); return 0; } /* * copy a single-quoted string; s points to char after opening quote */ static char * copysingle(char *s, Bufblock *buf) { Rune r; while(*s){ s += chartorune(&r, s); rinsert(buf, r); if(r == '\'') break; } return s; } /* * check for quoted strings. backquotes are handled here; single quotes above. * s points to char after opening quote, q. */ char * rccopyq(char *s, Rune q, Bufblock *buf) { if(q == '\'') /* copy quoted string */ return copysingle(s, buf); if(q != '`') /* not quoted */ return s; while(*s){ /* copy backquoted string */ s += chartorune(&q, s); rinsert(buf, q); if(q == '}') break; if(q == '\'') s = copysingle(s, buf); /* copy quoted string */ } return s; } static int rcmatchname(char *name) { char *p; if((p = strrchr(name, '/')) != nil) name = p+1; if(name[0] == 'r' && name[1] == 'c') return 1; return 0; } Shell rcshell = { "rc", "'= \t", '\1', rccharin, rcexpandquote, rcescapetoken, rccopyq, rcmatchname }; 9base-6/mk/NOTICE0000644000175000017500000000311711402154555013063 0ustar anselmanselmCopyright © 1994-1999 Lucent Technologies Inc. All rights reserved. Portions Copyright © 1995-1997 C H Forsyth (forsyth@caldo.demon.co.uk). All rights reserved. Portions Copyright © 1997-1999 Vita Nuova Limited. All rights reserved. Portions Copyright © 2000-2002 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved. Under a licence agreement with Lucent Technologies Inc. effective 1st March 2000, Vita Nuova Holdings Limited has the right to determine (within a specified scope) the form and content of sublicences for this software. Vita Nuova Holdings Limited now makes this software available as Free Software under the terms of the `GNU General Public LIcense, Version 2' (see the file LICENCE or http://www.fsf.org/copyleft/gpl.html for the full terms and conditions). One of the conditions of that licence is that you must keep intact all notices that refer to that licence and to the absence of of any warranty: for this software, note that includes this NOTICE file in particular. This suite of programs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the `GNU General Public License' for more details. This copyright NOTICE applies to all files in this directory and subdirectories, unless another copyright notice appears in a given file or subdirectory. If you take code from this software to use in other programs, you must somehow include with it an appropriate copyright notice that includes the copyright notice and the other notices above. 9base-6/mk/graph.c0000644000175000017500000001331111402154555013421 0ustar anselmanselm#include "mk.h" static Node *applyrules(char *, char *); static void togo(Node *); static int vacuous(Node *); static Node *newnode(char *); static void trace(char *, Arc *); static void cyclechk(Node *); static void ambiguous(Node *); static void attribute(Node *); Node * graph(char *target) { Node *node; char *cnt; cnt = rulecnt(); node = applyrules(target, cnt); free(cnt); cyclechk(node); node->flags |= PROBABLE; /* make sure it doesn't get deleted */ vacuous(node); ambiguous(node); attribute(node); return(node); } static Node * applyrules(char *target, char *cnt) { Symtab *sym; Node *node; Rule *r; Arc head, *a = &head; Word *w; char stem[NAMEBLOCK], buf[NAMEBLOCK]; Resub rmatch[NREGEXP]; /* print("applyrules(%lux='%s')\n", target, target); */ sym = symlook(target, S_NODE, 0); if(sym) return sym->u.ptr; target = strdup(target); node = newnode(target); head.n = 0; head.next = 0; sym = symlook(target, S_TARGET, 0); memset((char*)rmatch, 0, sizeof(rmatch)); for(r = sym? sym->u.ptr:0; r; r = r->chain){ if(r->attr&META) continue; if(strcmp(target, r->target)) continue; if((!r->recipe || !*r->recipe) && (!r->tail || !r->tail->s || !*r->tail->s)) continue; /* no effect; ignore */ if(cnt[r->rule] >= nreps) continue; cnt[r->rule]++; node->flags |= PROBABLE; /* if(r->attr&VIR) * node->flags |= VIRTUAL; * if(r->attr&NOREC) * node->flags |= NORECIPE; * if(r->attr&DEL) * node->flags |= DELETE; */ if(!r->tail || !r->tail->s || !*r->tail->s) { a->next = newarc((Node *)0, r, "", rmatch); a = a->next; } else for(w = r->tail; w; w = w->next){ a->next = newarc(applyrules(w->s, cnt), r, "", rmatch); a = a->next; } cnt[r->rule]--; head.n = node; } for(r = metarules; r; r = r->next){ if((!r->recipe || !*r->recipe) && (!r->tail || !r->tail->s || !*r->tail->s)) continue; /* no effect; ignore */ if ((r->attr&NOVIRT) && a != &head && (a->r->attr&VIR)) continue; if(r->attr®EXP){ stem[0] = 0; patrule = r; memset((char*)rmatch, 0, sizeof(rmatch)); if(regexec(r->pat, node->name, rmatch, NREGEXP) == 0) continue; } else { if(!match(node->name, r->target, stem, r->shellt)) continue; } if(cnt[r->rule] >= nreps) continue; cnt[r->rule]++; /* if(r->attr&VIR) * node->flags |= VIRTUAL; * if(r->attr&NOREC) * node->flags |= NORECIPE; * if(r->attr&DEL) * node->flags |= DELETE; */ if(!r->tail || !r->tail->s || !*r->tail->s) { a->next = newarc((Node *)0, r, stem, rmatch); a = a->next; } else for(w = r->tail; w; w = w->next){ if(r->attr®EXP) regsub(w->s, buf, sizeof buf, rmatch, NREGEXP); else subst(stem, w->s, buf); a->next = newarc(applyrules(buf, cnt), r, stem, rmatch); a = a->next; } cnt[r->rule]--; } a->next = node->prereqs; node->prereqs = head.next; return(node); } static void togo(Node *node) { Arc *la, *a; /* delete them now */ la = 0; for(a = node->prereqs; a; la = a, a = a->next) if(a->flag&TOGO){ if(a == node->prereqs) node->prereqs = a->next; else la->next = a->next, a = la; } } static int vacuous(Node *node) { Arc *la, *a; int vac = !(node->flags&PROBABLE); if(node->flags&READY) return(node->flags&VACUOUS); node->flags |= READY; for(a = node->prereqs; a; a = a->next) if(a->n && vacuous(a->n) && (a->r->attr&META)) a->flag |= TOGO; else vac = 0; /* if a rule generated arcs that DON'T go; no others from that rule go */ for(a = node->prereqs; a; a = a->next) if((a->flag&TOGO) == 0) for(la = node->prereqs; la; la = la->next) if((la->flag&TOGO) && (la->r == a->r)){ la->flag &= ~TOGO; } togo(node); if(vac) node->flags |= VACUOUS; return(vac); } static Node * newnode(char *name) { register Node *node; node = (Node *)Malloc(sizeof(Node)); symlook(name, S_NODE, (void *)node); node->name = name; node->time = timeof(name, 0); node->prereqs = 0; node->flags = node->time? PROBABLE : 0; node->next = 0; return(node); } void dumpn(char *s, Node *n) { char buf[1024]; Arc *a; snprint(buf, sizeof buf, "%s ", (*s == ' ')? s:""); Bprint(&bout, "%s%s@%ld: time=%ld flags=0x%x next=%ld\n", s, n->name, n, n->time, n->flags, n->next); for(a = n->prereqs; a; a = a->next) dumpa(buf, a); } static void trace(char *s, Arc *a) { fprint(2, "\t%s", s); while(a){ fprint(2, " <-(%s:%d)- %s", a->r->file, a->r->line, a->n? a->n->name:""); if(a->n){ for(a = a->n->prereqs; a; a = a->next) if(*a->r->recipe) break; } else a = 0; } fprint(2, "\n"); } static void cyclechk(Node *n) { Arc *a; if((n->flags&CYCLE) && n->prereqs){ fprint(2, "mk: cycle in graph detected at target %s\n", n->name); Exit(); } n->flags |= CYCLE; for(a = n->prereqs; a; a = a->next) if(a->n) cyclechk(a->n); n->flags &= ~CYCLE; } static void ambiguous(Node *n) { Arc *a; Rule *r = 0; Arc *la; int bad = 0; la = 0; for(a = n->prereqs; a; a = a->next){ if(a->n) ambiguous(a->n); if(*a->r->recipe == 0) continue; if(r == 0) r = a->r, la = a; else{ if(r->recipe != a->r->recipe){ if((r->attr&META) && !(a->r->attr&META)){ la->flag |= TOGO; r = a->r, la = a; } else if(!(r->attr&META) && (a->r->attr&META)){ a->flag |= TOGO; continue; } } if(r->recipe != a->r->recipe){ if(bad == 0){ fprint(2, "mk: ambiguous recipes for %s:\n", n->name); bad = 1; trace(n->name, la); } trace(n->name, a); } } } if(bad) Exit(); togo(n); } static void attribute(Node *n) { register Arc *a; for(a = n->prereqs; a; a = a->next){ if(a->r->attr&VIR) n->flags |= VIRTUAL; if(a->r->attr&NOREC) n->flags |= NORECIPE; if(a->r->attr&DEL) n->flags |= DELETE; if(a->n) attribute(a->n); } if(n->flags&VIRTUAL) n->time = 0; } 9base-6/mk/arc.c0000644000175000017500000000147211402154555013072 0ustar anselmanselm#include "mk.h" Arc * newarc(Node *n, Rule *r, char *stem, Resub *match) { Arc *a; a = (Arc *)Malloc(sizeof(Arc)); a->n = n; a->r = r; a->stem = strdup(stem); rcopy(a->match, match, NREGEXP); a->next = 0; a->flag = 0; a->prog = r->prog; return(a); } void dumpa(char *s, Arc *a) { char buf[1024]; Bprint(&bout, "%sArc@%p: n=%p r=%p flag=0x%x stem='%s'", s, a, a->n, a->r, a->flag, a->stem); if(a->prog) Bprint(&bout, " prog='%s'", a->prog); Bprint(&bout, "\n"); if(a->n){ snprint(buf, sizeof(buf), "%s ", (*s == ' ')? s:""); dumpn(buf, a->n); } } void nrep(void) { Symtab *sym; Word *w; sym = symlook("NREP", S_VAR, 0); if(sym){ w = sym->u.ptr; if (w && w->s && *w->s) nreps = atoi(w->s); } if(nreps < 1) nreps = 1; if(DEBUG(D_GRAPH)) Bprint(&bout, "nreps = %d\n", nreps); } 9base-6/mk/rule.c0000644000175000017500000000407611402154555013277 0ustar anselmanselm#include "mk.h" static Rule *lr, *lmr; static int rcmp(Rule *r, char *target, Word *tail); static int nrules = 0; void addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, char *prog) { Rule *r; Rule *rr; Symtab *sym; int reuse; r = 0; reuse = 0; if(sym = symlook(head, S_TARGET, 0)){ for(r = sym->u.ptr; r; r = r->chain) if(rcmp(r, head, tail) == 0){ reuse = 1; break; } } if(r == 0) r = (Rule *)Malloc(sizeof(Rule)); r->shellt = shellt; r->shellcmd = shellcmd; r->target = head; r->tail = tail; r->recipe = body; r->line = hline; r->file = infile; r->attr = attr; r->alltargets = ahead; r->prog = prog; r->rule = nrules++; if(!reuse){ rr = symlook(head, S_TARGET, (void *)r)->u.ptr; if(rr != r){ r->chain = rr->chain; rr->chain = r; } else r->chain = 0; } if(!reuse) r->next = 0; if((attr®EXP) || shellt->charin(head, "%&")){ r->attr |= META; if(reuse) return; if(attr®EXP){ patrule = r; r->pat = regcomp(head); } if(metarules == 0) metarules = lmr = r; else { lmr->next = r; lmr = r; } } else { if(reuse) return; r->pat = 0; if(rules == 0) rules = lr = r; else { lr->next = r; lr = r; } } } void dumpr(char *s, Rule *r) { if(r == nil) return; Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n", s, r, r->shellt->name, wtos(r->shellcmd, ' ')); for(; r; r = r->next){ Bprint(&bout, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'", r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets, ' ')); if(r->prog) Bprint(&bout, " prog='%s'", r->prog); Bprint(&bout, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail, ' ')); Bprint(&bout, "\trecipe@%ld='%s'\n", r->recipe, r->recipe); } } static int rcmp(Rule *r, char *target, Word *tail) { Word *w; if(strcmp(r->target, target)) return 1; for(w = r->tail; w && tail; w = w->next, tail = tail->next) if(strcmp(w->s, tail->s)) return 1; return(w || tail); } char * rulecnt(void) { char *s; s = Malloc(nrules); memset(s, 0, nrules); return(s); } 9base-6/mk/symtab.c0000644000175000017500000000311211402154555013615 0ustar anselmanselm#include "mk.h" #define NHASH 4099 #define HASHMUL 79L /* this is a good value */ static Symtab *hash[NHASH]; void syminit(void) { Symtab **s, *ss, *next; for(s = hash; s < &hash[NHASH]; s++){ for(ss = *s; ss; ss = next){ next = ss->next; free((char *)ss); } *s = 0; } } Symtab * symlook(char *sym, int space, void *install) { long h; char *p; Symtab *s; for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; if(h < 0) h = ~h; h %= NHASH; for(s = hash[h]; s; s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)) return(s); if(install == 0) return(0); s = (Symtab *)Malloc(sizeof(Symtab)); s->space = space; s->name = sym; s->u.ptr = install; s->next = hash[h]; hash[h] = s; return(s); } void symdel(char *sym, int space) { long h; char *p; Symtab *s, *ls; /* multiple memory leaks */ for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; if(h < 0) h = ~h; h %= NHASH; for(s = hash[h], ls = 0; s; ls = s, s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)){ if(ls) ls->next = s->next; else hash[h] = s->next; free((char *)s); } } void symtraverse(int space, void (*fn)(Symtab*)) { Symtab **s, *ss; for(s = hash; s < &hash[NHASH]; s++) for(ss = *s; ss; ss = ss->next) if(ss->space == space) (*fn)(ss); } void symstat(void) { Symtab **s, *ss; int n; int l[1000]; memset((char *)l, 0, sizeof(l)); for(s = hash; s < &hash[NHASH]; s++){ for(ss = *s, n = 0; ss; ss = ss->next) n++; l[n]++; } for(n = 0; n < 1000; n++) if(l[n]) Bprint(&bout, "%ld of length %d\n", l[n], n); } 9base-6/mk/lex.c0000644000175000017500000000471111402154555013114 0ustar anselmanselm#include "mk.h" static int bquote(Biobuf*, Bufblock*); /* * Assemble a line skipping blank lines, comments, and eliding * escaped newlines */ int assline(Biobuf *bp, Bufblock *buf) { int c; int lastc; buf->current=buf->start; while ((c = nextrune(bp, 1)) >= 0){ switch(c) { case '\r': /* consumes CRs for Win95 */ continue; case '\n': if (buf->current != buf->start) { insert(buf, 0); return 1; } break; /* skip empty lines */ case '\\': case '\'': case '"': rinsert(buf, c); if (shellt->escapetoken(bp, buf, 1, c) == 0) Exit(); break; case '`': if (bquote(bp, buf) == 0) Exit(); break; case '#': lastc = '#'; while ((c = Bgetc(bp)) != '\n') { if (c < 0) goto eof; if(c != '\r') lastc = c; } mkinline++; if (lastc == '\\') break; /* propagate escaped newlines??*/ if (buf->current != buf->start) { insert(buf, 0); return 1; } break; default: rinsert(buf, c); break; } } eof: insert(buf, 0); return *buf->start != 0; } /* * assemble a back-quoted shell command into a buffer */ static int bquote(Biobuf *bp, Bufblock *buf) { int c, line, term; int start; line = mkinline; while((c = Bgetrune(bp)) == ' ' || c == '\t') ; if(c == '{'){ term = '}'; /* rc style */ while((c = Bgetrune(bp)) == ' ' || c == '\t') ; } else term = '`'; /* sh style */ start = buf->current-buf->start; for(;c > 0; c = nextrune(bp, 0)){ if(c == term){ insert(buf, '\n'); insert(buf,0); buf->current = buf->start+start; execinit(); execsh(0, buf->current, buf, envy, shellt, shellcmd); return 1; } if(c == '\n') break; if(c == '\'' || c == '"' || c == '\\'){ insert(buf, c); if(!shellt->escapetoken(bp, buf, 1, c)) return 0; continue; } rinsert(buf, c); } SYNERR(line); fprint(2, "missing closing %c after `\n", term); return 0; } /* * get next character stripping escaped newlines * the flag specifies whether escaped newlines are to be elided or * replaced with a blank. */ int nextrune(Biobuf *bp, int elide) { int c, c2; static int savec; if(savec){ c = savec; savec = 0; return c; } for (;;) { c = Bgetrune(bp); if (c == '\\') { c2 = Bgetrune(bp); if(c2 == '\r'){ savec = c2; c2 = Bgetrune(bp); } if (c2 == '\n') { savec = 0; mkinline++; if (elide) continue; return ' '; } Bungetrune(bp); } if (c == '\n') mkinline++; return c; } } 9base-6/mk/shprint.c0000644000175000017500000000365311402154555014017 0ustar anselmanselm#include "mk.h" static char *vexpand(char*, Envy*, Bufblock*); #define getfields mkgetfields static int getfields(char *str, char **args, int max, int mflag, char *set) { Rune r; int nr, intok, narg; if(max <= 0) return 0; narg = 0; args[narg] = str; if(!mflag) narg++; intok = 0; for(;; str += nr) { nr = chartorune(&r, str); if(r == 0) break; if(utfrune(set, r)) { if(narg >= max) break; *str = 0; intok = 0; args[narg] = str + nr; if(!mflag) narg++; } else { if(!intok && mflag) narg++; intok = 1; } } return narg; } void shprint(char *s, Envy *env, Bufblock *buf, Shell *sh) { int n; Rune r; while(*s) { n = chartorune(&r, s); if (r == '$') s = vexpand(s, env, buf); else { rinsert(buf, r); s += n; s = sh->copyq(s, r, buf); /*handle quoted strings*/ } } insert(buf, 0); } static char * mygetenv(char *name, Envy *env) { if (!env) return 0; if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0) return 0; /* only resolve internal variables and variables we've set */ for(; env->name; env++){ if (strcmp(env->name, name) == 0) return wtos(env->values, ' '); } return 0; } static char * vexpand(char *w, Envy *env, Bufblock *buf) { char *s, carry, *p, *q; assert("vexpand no $", *w == '$'); p = w+1; /* skip dollar sign */ if(*p == '{') { p++; q = utfrune(p, '}'); if (!q) q = strchr(p, 0); } else q = shname(p); carry = *q; *q = 0; s = mygetenv(p, env); *q = carry; if (carry == '}') q++; if (s) { bufcpy(buf, s, strlen(s)); free(s); } else /* copy name intact*/ bufcpy(buf, w, q-w); return(q); } void front(char *s) { char *t, *q; int i, j; char *flds[512]; q = strdup(s); i = getfields(q, flds, 512, 0, " \t\n"); if(i > 5){ flds[4] = flds[i-1]; flds[3] = "..."; i = 5; } t = s; for(j = 0; j < i; j++){ for(s = flds[j]; *s; *t++ = *s++); *t++ = ' '; } *t = 0; free(q); } 9base-6/mk/Makefile0000644000175000017500000000055711402154555013624 0ustar anselmanselm# mk - mk unix port from plan9 # Depends on ../lib9 TARG = mk OFILES = arc.o archive.o bufblock.o env.o file.o graph.o job.o lex.o \ main.o match.o mk.o parse.o recipe.o rc.o rule.o run.o sh.o \ shell.o shprint.o symtab.o var.o varsub.o word.o unix.o MANFILES = mk.1 include ../std.mk post-install: pre-uninstall: post-install: 9base-6/mk/parse.c0000644000175000017500000001273111402154555013437 0ustar anselmanselm#include "mk.h" char *infile; int mkinline; static int rhead(char *, Word **, Word **, int *, char **); static char *rbody(Biobuf*); extern Word *target1; void parse(char *f, int fd, int varoverride) { int hline; char *body; Word *head, *tail; int attr, set, pid; char *prog, *p; int newfd; Biobuf in; Bufblock *buf; char *err; if(fd < 0){ fprint(2, "open %s: %r\n", f); Exit(); } pushshell(); ipush(); infile = strdup(f); mkinline = 1; Binit(&in, fd, OREAD); buf = newbuf(); while(assline(&in, buf)){ hline = mkinline; switch(rhead(buf->start, &head, &tail, &attr, &prog)) { case '<': p = wtos(tail, ' '); if(*p == 0){ SYNERR(-1); fprint(2, "missing include file name\n"); Exit(); } newfd = open(p, OREAD); if(newfd < 0){ fprint(2, "warning: skipping missing include file %s: %r\n", p); } else parse(p, newfd, 0); break; case '|': p = wtos(tail, ' '); if(*p == 0){ SYNERR(-1); fprint(2, "missing include program name\n"); Exit(); } execinit(); pid=pipecmd(p, envy, &newfd, shellt, shellcmd); if(newfd < 0){ fprint(2, "warning: skipping missing program file %s: %r\n", p); } else parse(p, newfd, 0); while(waitup(-3, &pid) >= 0) ; if(pid != 0){ fprint(2, "bad include program status\n"); Exit(); } break; case ':': body = rbody(&in); addrules(head, tail, body, attr, hline, prog); break; case '=': if(head->next){ SYNERR(-1); fprint(2, "multiple vars on left side of assignment\n"); Exit(); } if(symlook(head->s, S_OVERRIDE, 0)){ set = varoverride; } else { set = 1; if(varoverride) symlook(head->s, S_OVERRIDE, (void *)""); } if(set){ /* char *cp; dumpw("tail", tail); cp = wtos(tail, ' '); print("assign %s to %s\n", head->s, cp); free(cp); */ setvar(head->s, (void *) tail); symlook(head->s, S_WESET, (void *)""); if(strcmp(head->s, "MKSHELL") == 0){ if((err = setshell(tail)) != nil){ SYNERR(hline); fprint(2, "%s\n", err); Exit(); break; } } } if(attr) symlook(head->s, S_NOEXPORT, (void *)""); break; default: SYNERR(hline); fprint(2, "expected one of :<=\n"); Exit(); break; } } close(fd); freebuf(buf); ipop(); popshell(); } void addrules(Word *head, Word *tail, char *body, int attr, int hline, char *prog) { Word *w; assert("addrules args", head && body); /* tuck away first non-meta rule as default target*/ if(target1 == 0 && !(attr®EXP)){ for(w = head; w; w = w->next) if(shellt->charin(w->s, "%&")) break; if(w == 0) target1 = wdup(head); } for(w = head; w; w = w->next) addrule(w->s, tail, body, head, attr, hline, prog); } static int rhead(char *line, Word **h, Word **t, int *attr, char **prog) { char *p; char *pp; int sep; Rune r; int n; Word *w; p = shellt->charin(line,":=<"); if(p == 0) return('?'); sep = *p; *p++ = 0; if(sep == '<' && *p == '|'){ sep = '|'; p++; } *attr = 0; *prog = 0; if(sep == '='){ pp = shellt->charin(p, shellt->termchars); /* termchars is shell-dependent */ if (pp && *pp == '=') { while (p != pp) { n = chartorune(&r, p); switch(r) { default: SYNERR(-1); fprint(2, "unknown attribute '%c'\n",*p); Exit(); case 'U': *attr = 1; break; } p += n; } p++; /* skip trailing '=' */ } } if((sep == ':') && *p && (*p != ' ') && (*p != '\t')){ while (*p) { n = chartorune(&r, p); if (r == ':') break; p += n; switch(r) { default: SYNERR(-1); fprint(2, "unknown attribute '%c'\n", p[-1]); Exit(); case 'D': *attr |= DEL; break; case 'E': *attr |= NOMINUSE; break; case 'n': *attr |= NOVIRT; break; case 'N': *attr |= NOREC; break; case 'P': pp = utfrune(p, ':'); if (pp == 0 || *pp == 0) goto eos; *pp = 0; *prog = strdup(p); *pp = ':'; p = pp; break; case 'Q': *attr |= QUIET; break; case 'R': *attr |= REGEXP; break; case 'U': *attr |= UPD; break; case 'V': *attr |= VIR; break; } } if (*p++ != ':') { eos: SYNERR(-1); fprint(2, "missing trailing :\n"); Exit(); } } *h = w = stow(line); if(*w->s == 0 && sep != '<' && sep != '|' && sep != 'S') { SYNERR(mkinline-1); fprint(2, "no var on left side of assignment/rule\n"); Exit(); } *t = stow(p); return(sep); } static char * rbody(Biobuf *in) { Bufblock *buf; int r, lastr; char *p; lastr = '\n'; buf = newbuf(); for(;;){ r = Bgetrune(in); if (r < 0) break; if (lastr == '\n') { if (r == '#') rinsert(buf, r); else if (r != ' ' && r != '\t') { Bungetrune(in); break; } } else rinsert(buf, r); lastr = r; if (r == '\n') mkinline++; } insert(buf, 0); p = strdup(buf->start); freebuf(buf); return p; } struct input { char *file; int line; struct input *next; }; static struct input *inputs = 0; void ipush(void) { struct input *in, *me; me = (struct input *)Malloc(sizeof(*me)); me->file = infile; me->line = mkinline; me->next = 0; if(inputs == 0) inputs = me; else { for(in = inputs; in->next; ) in = in->next; in->next = me; } } void ipop(void) { struct input *in, *me; assert("pop input list", inputs != 0); if(inputs->next == 0){ me = inputs; inputs = 0; } else { for(in = inputs; in->next->next; ) in = in->next; me = in->next; in->next = 0; } infile = me->file; mkinline = me->line; free((char *)me); } 9base-6/mk/file.c0000644000175000017500000000244411402154555013244 0ustar anselmanselm#include "mk.h" /* table-driven version in bootes dump of 12/31/96 */ long mtime(char *name) { return mkmtime(name); } long timeof(char *name, int force) { Symtab *sym; long t; if(utfrune(name, '(')) return atimeof(force, name); /* archive */ if(force) return mtime(name); sym = symlook(name, S_TIME, 0); if (sym) return sym->u.value; t = mtime(name); if(t == 0) return 0; symlook(name, S_TIME, (void*)t); /* install time in cache */ return t; } void touch(char *name) { Bprint(&bout, "touch(%s)\n", name); if(nflag) return; if(utfrune(name, '(')) atouch(name); /* archive */ else if(chgtime(name) < 0) { fprint(2, "%s: %r\n", name); Exit(); } } void delete(char *name) { if(utfrune(name, '(') == 0) { /* file */ if(remove(name) < 0) fprint(2, "remove %s: %r\n", name); } else fprint(2, "hoon off; mk can'tdelete archive members\n"); } void timeinit(char *s) { long t; char *cp; Rune r; int c, n; t = time(0); while (*s) { cp = s; do{ n = chartorune(&r, s); if (r == ' ' || r == ',' || r == '\n') break; s += n; } while(*s); c = *s; *s = 0; symlook(strdup(cp), S_TIME, (void *)t)->u.value = t; if (c) *s++ = c; while(*s){ n = chartorune(&r, s); if(r != ' ' && r != ',' && r != '\n') break; s += n; } } } 9base-6/mk/mk.c0000644000175000017500000001220111402154555012724 0ustar anselmanselm#include "mk.h" int runerrs; void mk(char *target) { Node *node; int did = 0; nproc(); /* it can be updated dynamically */ nrep(); /* it can be updated dynamically */ runerrs = 0; node = graph(target); if(DEBUG(D_GRAPH)){ dumpn("new target\n", node); Bflush(&bout); } clrmade(node); while(node->flags&NOTMADE){ if(work(node, (Node *)0, (Arc *)0)) did = 1; /* found something to do */ else { if(waitup(1, (int *)0) > 0){ if(node->flags&(NOTMADE|BEINGMADE)){ assert("must be run errors", runerrs); break; /* nothing more waiting */ } } } } if(node->flags&BEINGMADE) waitup(-1, (int *)0); while(jobs) waitup(-2, (int *)0); assert("target didn't get done", runerrs || (node->flags&MADE)); if(did == 0) Bprint(&bout, "mk: '%s' is up to date\n", node->name); } void clrmade(Node *n) { Arc *a; n->flags &= ~(CANPRETEND|PRETENDING); if(strchr(n->name, '(') ==0 || n->time) n->flags |= CANPRETEND; MADESET(n, NOTMADE); for(a = n->prereqs; a; a = a->next) if(a->n) clrmade(a->n); } static void unpretend(Node *n) { MADESET(n, NOTMADE); n->flags &= ~(CANPRETEND|PRETENDING); n->time = 0; } static char* dir(void) { static char buf[1024]; return getcwd(buf, sizeof buf); } int work(Node *node, Node *p, Arc *parc) { Arc *a, *ra; int weoutofdate; int ready; int did = 0; /*print("work(%s) flags=0x%x time=%ld\n", node->name, node->flags, node->time); */ if(node->flags&BEINGMADE) return(did); if((node->flags&MADE) && (node->flags&PRETENDING) && p && outofdate(p, parc, 0)){ if(explain) fprint(1, "unpretending %s(%ld) because %s is out of date(%ld)\n", node->name, node->time, p->name, p->time); unpretend(node); } /* have a look if we are pretending in case someone has been unpretended out from underneath us */ if(node->flags&MADE){ if(node->flags&PRETENDING){ node->time = 0; }else return(did); } /* consider no prerequsite case */ if(node->prereqs == 0){ if(node->time == 0){ fprint(2, "mk: don't know how to make '%s' in %s\n", node->name, dir()); if(kflag){ node->flags |= BEINGMADE; runerrs++; } else Exit(); } else MADESET(node, MADE); return(did); } /* now see if we are out of date or what */ ready = 1; weoutofdate = aflag; ra = 0; for(a = node->prereqs; a; a = a->next) if(a->n){ did = work(a->n, node, a) || did; if(a->n->flags&(NOTMADE|BEINGMADE)) ready = 0; if(outofdate(node, a, 0)){ weoutofdate = 1; if((ra == 0) || (ra->n == 0) || (ra->n->time < a->n->time)) ra = a; } } else { if(node->time == 0){ if(ra == 0) ra = a; weoutofdate = 1; } } if(ready == 0) /* can't do anything now */ return(did); if(weoutofdate == 0){ MADESET(node, MADE); return(did); } /* can we pretend to be made? */ if((iflag == 0) && (node->time == 0) && (node->flags&(PRETENDING|CANPRETEND)) && p && ra->n && !outofdate(p, ra, 0)){ node->flags &= ~CANPRETEND; MADESET(node, MADE); if(explain && ((node->flags&PRETENDING) == 0)) fprint(1, "pretending %s has time %ld\n", node->name, node->time); node->flags |= PRETENDING; return(did); } /* node is out of date and we REALLY do have to do something. quickly rescan for pretenders */ for(a = node->prereqs; a; a = a->next) if(a->n && (a->n->flags&PRETENDING)){ if(explain) Bprint(&bout, "unpretending %s because of %s because of %s\n", a->n->name, node->name, ra->n? ra->n->name : "rule with no prerequisites"); unpretend(a->n); did = work(a->n, node, a) || did; ready = 0; } if(ready == 0) /* try later unless nothing has happened for -k's sake */ return(did || work(node, p, parc)); did = dorecipe(node) || did; return(did); } void update(int fake, Node *node) { Arc *a; MADESET(node, fake? BEINGMADE : MADE); if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){ node->time = timeof(node->name, 1); node->flags &= ~(CANPRETEND|PRETENDING); for(a = node->prereqs; a; a = a->next) if(a->prog) outofdate(node, a, 1); } else { node->time = 1; for(a = node->prereqs; a; a = a->next) if(a->n && outofdate(node, a, 1)) node->time = a->n->time; } /* print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);*/ } static int pcmp(char *prog, char *p, char *q, Shell *sh, Word *shcmd) { char buf[3*NAMEBLOCK]; int pid; Bflush(&bout); snprint(buf, sizeof buf, "%s '%s' '%s'\n", prog, p, q); pid = pipecmd(buf, 0, 0, sh, shcmd); while(waitup(-3, &pid) >= 0) ; return(pid? 2:1); } int outofdate(Node *node, Arc *arc, int eval) { char buf[3*NAMEBLOCK], *str; Symtab *sym; int ret; str = 0; if(arc->prog){ snprint(buf, sizeof buf, "%s%c%s", node->name, 0377, arc->n->name); sym = symlook(buf, S_OUTOFDATE, 0); if(sym == 0 || eval){ if(sym == 0) str = strdup(buf); ret = pcmp(arc->prog, node->name, arc->n->name, arc->r->shellt, arc->r->shellcmd); if(sym) sym->u.value = ret; else symlook(str, S_OUTOFDATE, (void *)(uintptr)ret); } else ret = sym->u.value; return(ret-1); } else if(strchr(arc->n->name, '(') && arc->n->time == 0) /* missing archive member */ return 1; else return node->time <= arc->n->time; } 9base-6/mk/run.c0000644000175000017500000001175711402154555013140 0ustar anselmanselm#include "mk.h" typedef struct Event { int pid; Job *job; } Event; static Event *events; static int nevents, nrunning, nproclimit; typedef struct Process { int pid; int status; struct Process *b, *f; } Process; static Process *phead, *pfree; static void sched(void); static void pnew(int, int), pdelete(Process *); int pidslot(int); void run(Job *j) { Job *jj; if(jobs){ for(jj = jobs; jj->next; jj = jj->next) ; jj->next = j; } else jobs = j; j->next = 0; /* this code also in waitup after parse redirect */ if(nrunning < nproclimit) sched(); } static void sched(void) { char *flags; Job *j; Bufblock *buf; int slot; Node *n; Envy *e; if(jobs == 0){ usage(); return; } j = jobs; jobs = j->next; if(DEBUG(D_EXEC)) fprint(1, "firing up job for target %s\n", wtos(j->t, ' ')); slot = nextslot(); events[slot].job = j; buf = newbuf(); e = buildenv(j, slot); shprint(j->r->recipe, e, buf, j->r->shellt); if(!tflag && (nflag || !(j->r->attr&QUIET))) Bwrite(&bout, buf->start, (long)strlen(buf->start)); freebuf(buf); if(nflag||tflag){ for(n = j->n; n; n = n->next){ if(tflag){ if(!(n->flags&VIRTUAL)) touch(n->name); else if(explain) Bprint(&bout, "no touch of virtual '%s'\n", n->name); } n->time = time((long *)0); MADESET(n, MADE); } } else { if(DEBUG(D_EXEC)) fprint(1, "recipe='%s'", j->r->recipe);/**/ Bflush(&bout); if(j->r->attr&NOMINUSE) flags = 0; else flags = "-e"; events[slot].pid = execsh(flags, j->r->recipe, 0, e, j->r->shellt, j->r->shellcmd); usage(); nrunning++; if(DEBUG(D_EXEC)) fprint(1, "pid for target %s = %d\n", wtos(j->t, ' '), events[slot].pid); } } int waitup(int echildok, int *retstatus) { Envy *e; int pid; int slot; Symtab *s; Word *w; Job *j; char buf[ERRMAX]; Bufblock *bp; int uarg = 0; int done; Node *n; Process *p; extern int runerrs; /* first check against the proces slist */ if(retstatus) for(p = phead; p; p = p->f) if(p->pid == *retstatus){ *retstatus = p->status; pdelete(p); return(-1); } again: /* rogue processes */ pid = waitfor(buf); if(pid == -1){ if(echildok > 0) return(1); else { fprint(2, "mk: (waitup %d): %r\n", echildok); Exit(); } } if(DEBUG(D_EXEC)) fprint(1, "waitup got pid=%d, status='%s'\n", pid, buf); if(retstatus && pid == *retstatus){ *retstatus = buf[0]? 1:0; return(-1); } slot = pidslot(pid); if(slot < 0){ if(DEBUG(D_EXEC)) fprint(2, "mk: wait returned unexpected process %d\n", pid); pnew(pid, buf[0]? 1:0); goto again; } j = events[slot].job; usage(); nrunning--; events[slot].pid = -1; if(buf[0]){ e = buildenv(j, slot); bp = newbuf(); shprint(j->r->recipe, e, bp, j->r->shellt); front(bp->start); fprint(2, "mk: %s: exit status=%s", bp->start, buf); freebuf(bp); for(n = j->n, done = 0; n; n = n->next) if(n->flags&DELETE){ if(done++ == 0) fprint(2, ", deleting"); fprint(2, " '%s'", n->name); delete(n->name); } fprint(2, "\n"); if(kflag){ runerrs++; uarg = 1; } else { jobs = 0; Exit(); } } for(w = j->t; w; w = w->next){ if((s = symlook(w->s, S_NODE, 0)) == 0) continue; /* not interested in this node */ update(uarg, s->u.ptr); } if(nrunning < nproclimit) sched(); return(0); } void nproc(void) { Symtab *sym; Word *w; if(sym = symlook("NPROC", S_VAR, 0)) { w = sym->u.ptr; if (w && w->s && w->s[0]) nproclimit = atoi(w->s); } if(nproclimit < 1) nproclimit = 1; if(DEBUG(D_EXEC)) fprint(1, "nprocs = %d\n", nproclimit); if(nproclimit > nevents){ if(nevents) events = (Event *)Realloc((char *)events, nproclimit*sizeof(Event)); else events = (Event *)Malloc(nproclimit*sizeof(Event)); while(nevents < nproclimit) events[nevents++].pid = 0; } } int nextslot(void) { int i; for(i = 0; i < nproclimit; i++) if(events[i].pid <= 0) return i; assert("out of slots!!", 0); return 0; /* cyntax */ } int pidslot(int pid) { int i; for(i = 0; i < nevents; i++) if(events[i].pid == pid) return(i); if(DEBUG(D_EXEC)) fprint(2, "mk: wait returned unexpected process %d\n", pid); return(-1); } static void pnew(int pid, int status) { Process *p; if(pfree){ p = pfree; pfree = p->f; } else p = (Process *)Malloc(sizeof(Process)); p->pid = pid; p->status = status; p->f = phead; phead = p; if(p->f) p->f->b = p; p->b = 0; } static void pdelete(Process *p) { if(p->f) p->f->b = p->b; if(p->b) p->b->f = p->f; else phead = p->f; p->f = pfree; pfree = p; } void killchildren(char *msg) { Process *p; kflag = 1; /* to make sure waitup doesn't exit */ jobs = 0; /* make sure no more get scheduled */ for(p = phead; p; p = p->f) expunge(p->pid, msg); while(waitup(1, (int *)0) == 0) ; Bprint(&bout, "mk: %s\n", msg); Exit(); } static long tslot[1000]; static long tick; void usage(void) { long t; time(&t); if(tick) tslot[nrunning] += (t-tick); tick = t; } void prusage(void) { int i; usage(); for(i = 0; i <= nevents; i++) fprint(1, "%d: %ld\n", i, tslot[i]); } 9base-6/mk/match.c0000644000175000017500000000141711402154555013420 0ustar anselmanselm#include "mk.h" int match(char *name, char *template, char *stem, Shell *sh) { Rune r; int n; while(*name && *template){ n = chartorune(&r, template); if (PERCENT(r)) break; while (n--) if(*name++ != *template++) return 0; } if(!PERCENT(*template)) return 0; n = strlen(name)-strlen(template+1); if (n < 0) return 0; if (strcmp(template+1, name+n)) return 0; strncpy(stem, name, n); stem[n] = 0; if(*template == '&') return !sh->charin(stem, "./"); return 1; } void subst(char *stem, char *template, char *dest) { Rune r; char *s; int n; while(*template){ n = chartorune(&r, template); if (PERCENT(r)) { template += n; for (s = stem; *s; s++) *dest++ = *s; } else while (n--) *dest++ = *template++; } *dest = 0; } 9base-6/mk/main.c0000644000175000017500000001126711402154555013254 0ustar anselmanselm#include "mk.h" #define MKFILE "mkfile" int debug; Rule *rules, *metarules; int nflag = 0; int tflag = 0; int iflag = 0; int kflag = 0; int aflag = 0; int uflag = 0; char *explain = 0; Word *target1; int nreps = 1; Job *jobs; Biobuf bout; Rule *patrule; void badusage(void); #ifdef PROF short buf[10000]; #endif int main(int argc, char **argv) { Word *w; char *s, *temp; char *files[256], **f = files, **ff; int sflag = 0; int i; int tfd = -1; Biobuf tb; Bufblock *buf; Bufblock *whatif; /* * start with a copy of the current environment variables * instead of sharing them */ Binit(&bout, 1, OWRITE); buf = newbuf(); whatif = 0; USED(argc); for(argv++; *argv && (**argv == '-'); argv++) { bufcpy(buf, argv[0], strlen(argv[0])); insert(buf, ' '); switch(argv[0][1]) { case 'a': aflag = 1; break; case 'd': if(*(s = &argv[0][2])) while(*s) switch(*s++) { case 'p': debug |= D_PARSE; break; case 'g': debug |= D_GRAPH; break; case 'e': debug |= D_EXEC; break; } else debug = 0xFFFF; break; case 'e': explain = &argv[0][2]; break; case 'f': if(*++argv == 0) badusage(); *f++ = *argv; bufcpy(buf, argv[0], strlen(argv[0])); insert(buf, ' '); break; case 'i': iflag = 1; break; case 'k': kflag = 1; break; case 'n': nflag = 1; break; case 's': sflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; case 'w': if(whatif == 0) whatif = newbuf(); else insert(whatif, ' '); if(argv[0][2]) bufcpy(whatif, &argv[0][2], strlen(&argv[0][2])); else { if(*++argv == 0) badusage(); bufcpy(whatif, &argv[0][0], strlen(&argv[0][0])); } break; default: badusage(); } } #ifdef PROF { extern etext(); monitor(main, etext, buf, sizeof buf, 300); } #endif if(aflag) iflag = 1; usage(); syminit(); initshell(); initenv(); usage(); /* assignment args become null strings */ temp = 0; for(i = 0; argv[i]; i++) if(utfrune(argv[i], '=')){ bufcpy(buf, argv[i], strlen(argv[i])); insert(buf, ' '); if(tfd < 0){ temp = maketmp(&tfd); if(temp == 0) { fprint(2, "temp file: %r\n"); Exit(); } Binit(&tb, tfd, OWRITE); } Bprint(&tb, "%s\n", argv[i]); *argv[i] = 0; } if(tfd >= 0){ Bflush(&tb); LSEEK(tfd, 0L, 0); parse("command line args", tfd, 1); remove(temp); } if (buf->current != buf->start) { buf->current--; insert(buf, 0); } symlook("MKFLAGS", S_VAR, (void *) stow(buf->start)); buf->current = buf->start; for(i = 0; argv[i]; i++){ if(*argv[i] == 0) continue; if(i) insert(buf, ' '); bufcpy(buf, argv[i], strlen(argv[i])); } insert(buf, 0); symlook("MKARGS", S_VAR, (void *) stow(buf->start)); freebuf(buf); if(f == files){ if(access(MKFILE, 4) == 0) parse(MKFILE, open(MKFILE, 0), 0); } else for(ff = files; ff < f; ff++) parse(*ff, open(*ff, 0), 0); if(DEBUG(D_PARSE)){ dumpw("default targets", target1); dumpr("rules", rules); dumpr("metarules", metarules); dumpv("variables"); } if(whatif){ insert(whatif, 0); timeinit(whatif->start); freebuf(whatif); } execinit(); /* skip assignment args */ while(*argv && (**argv == 0)) argv++; catchnotes(); if(*argv == 0){ if(target1) for(w = target1; w; w = w->next) mk(w->s); else { fprint(2, "mk: nothing to mk\n"); Exit(); } } else { if(sflag){ for(; *argv; argv++) if(**argv) mk(*argv); } else { Word *head, *tail, *t; /* fake a new rule with all the args as prereqs */ tail = 0; t = 0; for(; *argv; argv++) if(**argv){ if(tail == 0) tail = t = newword(*argv); else { t->next = newword(*argv); t = t->next; } } if(tail->next == 0) mk(tail->s); else { head = newword("command line arguments"); addrules(head, tail, strdup(""), VIR, mkinline, 0); mk(head->s); } } } if(uflag) prusage(); exits(0); return 0; } void badusage(void) { fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n"); Exit(); } void * Malloc(int n) { register void *s; s = malloc(n); if(!s) { fprint(2, "mk: cannot alloc %d bytes\n", n); Exit(); } return(s); } void * Realloc(void *s, int n) { if(s) s = realloc(s, n); else s = malloc(n); if(!s) { fprint(2, "mk: cannot alloc %d bytes\n", n); Exit(); } return(s); } void assert(char *s, int n) { if(!n){ fprint(2, "mk: Assertion ``%s'' failed.\n", s); Exit(); } } void regerror(char *s) { if(patrule) fprint(2, "mk: %s:%d: regular expression error; %s\n", patrule->file, patrule->line, s); else fprint(2, "mk: %s:%d: regular expression error; %s\n", infile, mkinline, s); Exit(); } 9base-6/mk/bufblock.c0000644000175000017500000000247211402154555014115 0ustar anselmanselm#include "mk.h" static Bufblock *freelist; #define QUANTA 4096 Bufblock * newbuf(void) { Bufblock *p; if (freelist) { p = freelist; freelist = freelist->next; } else { p = (Bufblock *) Malloc(sizeof(Bufblock)); p->start = Malloc(QUANTA*sizeof(*p->start)); p->end = p->start+QUANTA; } p->current = p->start; *p->start = 0; p->next = 0; return p; } void freebuf(Bufblock *p) { p->next = freelist; freelist = p; } void growbuf(Bufblock *p) { int n; Bufblock *f; char *cp; n = p->end-p->start+QUANTA; /* search the free list for a big buffer */ for (f = freelist; f; f = f->next) { if (f->end-f->start >= n) { memcpy(f->start, p->start, p->end-p->start); cp = f->start; f->start = p->start; p->start = cp; cp = f->end; f->end = p->end; p->end = cp; f->current = f->start; break; } } if (!f) { /* not found - grow it */ p->start = Realloc(p->start, n); p->end = p->start+n; } p->current = p->start+n-QUANTA; } void bufcpy(Bufblock *buf, char *cp, int n) { while (n--) insert(buf, *cp++); } void insert(Bufblock *buf, int c) { if (buf->current >= buf->end) growbuf(buf); *buf->current++ = c; } void rinsert(Bufblock *buf, Rune r) { int n; n = runelen(r); if (buf->current+n > buf->end) growbuf(buf); runetochar(buf->current, &r); buf->current += n; } 9base-6/mk/recipe.c0000644000175000017500000000453111402154555013573 0ustar anselmanselm#include "mk.h" int dorecipe(Node *node) { char buf[BIGBLOCK]; register Node *n; Rule *r = 0; Arc *a, *aa; Word head, ahead, lp, ln, *w, *ww, *aw; Symtab *s; int did = 0; aa = 0; /* pick up the rule */ for(a = node->prereqs; a; a = a->next) if(*a->r->recipe) r = (aa = a)->r; /* no recipe? go to buggery! */ if(r == 0){ if(!(node->flags&VIRTUAL) && !(node->flags&NORECIPE)){ fprint(2, "mk: no recipe to make '%s'\n", node->name); Exit(); } if(strchr(node->name, '(') && node->time == 0) MADESET(node, MADE); else update(0, node); if(tflag){ if(!(node->flags&VIRTUAL)) touch(node->name); else if(explain) Bprint(&bout, "no touch of virtual '%s'\n", node->name); } return(did); } /* build the node list */ node->next = 0; head.next = 0; ww = &head; ahead.next = 0; aw = &ahead; if(r->attr®EXP){ ww->next = newword(node->name); aw->next = newword(node->name); } else { for(w = r->alltargets; w; w = w->next){ if(r->attr&META) subst(aa->stem, w->s, buf); else strcpy(buf, w->s); aw->next = newword(buf); aw = aw->next; if((s = symlook(buf, S_NODE, 0)) == 0) continue; /* not a node we are interested in */ n = s->u.ptr; if(aflag == 0 && n->time) { for(a = n->prereqs; a; a = a->next) if(a->n && outofdate(n, a, 0)) break; if(a == 0) continue; } ww->next = newword(buf); ww = ww->next; if(n == node) continue; n->next = node->next; node->next = n; } } for(n = node; n; n = n->next) if((n->flags&READY) == 0) return(did); /* gather the params for the job */ lp.next = ln.next = 0; for(n = node; n; n = n->next){ for(a = n->prereqs; a; a = a->next){ if(a->n){ addw(&lp, a->n->name); if(outofdate(n, a, 0)){ addw(&ln, a->n->name); if(explain) fprint(1, "%s(%ld) < %s(%ld)\n", n->name, n->time, a->n->name, a->n->time); } } else { if(explain) fprint(1, "%s has no prerequisites\n", n->name); } } MADESET(n, BEINGMADE); } /*print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));*/ run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next)); return(1); } void addw(Word *w, char *s) { Word *lw; for(lw = w; w = w->next; lw = w){ if(strcmp(s, w->s) == 0) return; } lw->next = newword(s); } 9base-6/mk/mk.h0000644000175000017500000001024211402154555012734 0ustar anselmanselm#include "sys.h" #undef assert #define assert mkassert extern Biobuf bout; typedef struct Bufblock { struct Bufblock *next; char *start; char *end; char *current; } Bufblock; typedef struct Word { char *s; struct Word *next; } Word; typedef struct Envy { char *name; Word *values; } Envy; extern Envy *envy; typedef struct Shell { char *name; char *termchars; /* used in parse.c to isolate assignment attribute */ int iws; /* inter-word separator in environment */ char *(*charin)(char*, char*); /* search for unescaped characters */ char *(*expandquote)(char*, Rune, Bufblock*); /* extract escaped token */ int (*escapetoken)(Biobuf*, Bufblock*, int, int); /* input escaped token */ char *(*copyq)(char*, Rune, Bufblock*); /* check for quoted strings */ int (*matchname)(char*); /* does name match */ } Shell; typedef struct Rule { char *target; /* one target */ Word *tail; /* constituents of targets */ char *recipe; /* do it ! */ short attr; /* attributes */ short line; /* source line */ char *file; /* source file */ Word *alltargets; /* all the targets */ int rule; /* rule number */ Reprog *pat; /* reg exp goo */ char *prog; /* to use in out of date */ struct Rule *chain; /* hashed per target */ struct Rule *next; Shell *shellt; /* shell to use with this rule */ Word *shellcmd; } Rule; extern Rule *rules, *metarules, *patrule; /* Rule.attr */ #define META 0x0001 #define UNUSED 0x0002 #define UPD 0x0004 #define QUIET 0x0008 #define VIR 0x0010 #define REGEXP 0x0020 #define NOREC 0x0040 #define DEL 0x0080 #define NOVIRT 0x0100 #define NREGEXP 10 typedef struct Arc { short flag; struct Node *n; Rule *r; char *stem; char *prog; char *match[NREGEXP]; struct Arc *next; } Arc; /* Arc.flag */ #define TOGO 1 typedef struct Node { char *name; long time; unsigned short flags; Arc *prereqs; struct Node *next; /* list for a rule */ } Node; /* Node.flags */ #define VIRTUAL 0x0001 #define CYCLE 0x0002 #define READY 0x0004 #define CANPRETEND 0x0008 #define PRETENDING 0x0010 #define NOTMADE 0x0020 #define BEINGMADE 0x0040 #define MADE 0x0080 #define MADESET(n,m) n->flags = (n->flags&~(NOTMADE|BEINGMADE|MADE))|(m) #define PROBABLE 0x0100 #define VACUOUS 0x0200 #define NORECIPE 0x0400 #define DELETE 0x0800 #define NOMINUSE 0x1000 typedef struct Job { Rule *r; /* master rule for job */ Node *n; /* list of node targets */ char *stem; char **match; Word *p; /* prerequistes */ Word *np; /* new prerequistes */ Word *t; /* targets */ Word *at; /* all targets */ int nproc; /* slot number */ struct Job *next; } Job; extern Job *jobs; typedef struct Symtab { short space; char *name; union { void *ptr; uintptr value; } u; struct Symtab *next; } Symtab; enum { S_VAR, /* variable -> value */ S_TARGET, /* target -> rule */ S_TIME, /* file -> time */ S_PID, /* pid -> products */ S_NODE, /* target name -> node */ S_AGG, /* aggregate -> time */ S_BITCH, /* bitched about aggregate not there */ S_NOEXPORT, /* var -> noexport */ S_OVERRIDE, /* can't override */ S_OUTOFDATE, /* n1\377n2 -> 2(outofdate) or 1(not outofdate) */ S_MAKEFILE, /* target -> node */ S_MAKEVAR, /* dumpable mk variable */ S_EXPORTED, /* var -> current exported value */ S_WESET, /* variable; we set in the mkfile */ S_INTERNAL /* an internal mk variable (e.g., stem, target) */ }; extern int debug; extern int nflag, tflag, iflag, kflag, aflag, mflag; extern int mkinline; extern char *infile; extern int nreps; extern char *explain; extern Shell *shellt; extern Word *shellcmd; extern Shell shshell, rcshell; #define SYNERR(l) (fprint(2, "mk: %s:%d: syntax error; ", infile, ((l)>=0)?(l):mkinline)) #define RERR(r) (fprint(2, "mk: %s:%d: rule error; ", (r)->file, (r)->line)) #define NAMEBLOCK 1000 #define BIGBLOCK 20000 #define SEP(c) (((c)==' ')||((c)=='\t')||((c)=='\n')) #define WORDCHR(r) ((r) > ' ' && !utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", (r))) #define DEBUG(x) (debug&(x)) #define D_PARSE 0x01 #define D_GRAPH 0x02 #define D_EXEC 0x04 #define LSEEK(f,o,p) seek(f,o,p) #define PERCENT(ch) (((ch) == '%') || ((ch) == '&')) #include "fns.h" 9base-6/mk/job.c0000644000175000017500000000126711402154555013101 0ustar anselmanselm#include "mk.h" Job * newjob(Rule *r, Node *nlist, char *stem, char **match, Word *pre, Word *npre, Word *tar, Word *atar) { register Job *j; j = (Job *)Malloc(sizeof(Job)); j->r = r; j->n = nlist; j->stem = stem; j->match = match; j->p = pre; j->np = npre; j->t = tar; j->at = atar; j->nproc = -1; j->next = 0; return(j); } void dumpj(char *s, Job *j, int all) { Bprint(&bout, "%s\n", s); while(j){ Bprint(&bout, "job@%ld: r=%ld n=%ld stem='%s' nproc=%d\n", j, j->r, j->n, j->stem, j->nproc); Bprint(&bout, "\ttarget='%s' alltarget='%s' prereq='%s' nprereq='%s'\n", wtos(j->t, ' '), wtos(j->at, ' '), wtos(j->p, ' '), wtos(j->np, ' ')); j = all? j->next : 0; } } 9base-6/mk/unix.c0000644000175000017500000001225211402154555013306 0ustar anselmanselm#define NOPLAN9DEFINES #include "mk.h" #include #include #include #include char *shell = "/bin/sh"; char *shellname = "sh"; extern char **environ; static void mkperror(char *s) { fprint(2, "%s: %r\n", s); } void readenv(void) { char **p, *s; Word *w; for(p = environ; *p; p++){ /* rsc 5/5/2004 -- This misparses fn#cd={whatever} s = shname(*p); if(*s == '=') { *s = 0; w = newword(s+1); } else w = newword(""); */ s = strchr(*p, '='); if(s){ *s = 0; w = newword(s+1); } else w = newword(""); if (symlook(*p, S_INTERNAL, 0)) continue; s = strdup(*p); setvar(s, (void *)w); symlook(s, S_EXPORTED, (void*)"")->u.ptr = ""; } } /* * done on child side of fork, so parent's env is not affected * and we don't care about freeing memory because we're going * to exec immediately after this. */ void exportenv(Envy *e, Shell *sh) { int i; char **p; static char buf[16384]; p = 0; for(i = 0; e->name; e++, i++) { p = (char**) Realloc(p, (i+2)*sizeof(char*)); if(e->values) snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws)); else snprint(buf, sizeof buf, "%s=", e->name); p[i] = strdup(buf); } p[i] = 0; environ = p; } int waitfor(char *msg) { int status; int pid; *msg = 0; pid = wait(&status); if(pid > 0) { if(status&0x7f) { if(status&0x80) snprint(msg, ERRMAX, "signal %d, core dumped", status&0x7f); else snprint(msg, ERRMAX, "signal %d", status&0x7f); } else if(status&0xff00) snprint(msg, ERRMAX, "exit(%d)", (status>>8)&0xff); } return pid; } void expunge(int pid, char *msg) { if(strcmp(msg, "interrupt")) kill(pid, SIGINT); else kill(pid, SIGHUP); } int mypid; int shargv(Word *cmd, int extra, char ***pargv) { char **argv; int i, n; Word *w; n = 0; for(w=cmd; w; w=w->next) n++; argv = Malloc((n+extra+1)*sizeof(argv[0])); i = 0; for(w=cmd; w; w=w->next) argv[i++] = w->s; argv[n] = 0; *pargv = argv; return n; } int execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd) { char *p, **argv; int tot, n, pid, in[2], out[2]; if(buf && pipe(out) < 0){ mkperror("pipe"); Exit(); } pid = fork(); mypid = getpid(); if(pid < 0){ mkperror("mk fork"); Exit(); } if(pid == 0){ if(buf) close(out[0]); if(pipe(in) < 0){ mkperror("pipe"); Exit(); } pid = fork(); if(pid < 0){ mkperror("mk fork"); Exit(); } if(pid != 0){ dup2(in[0], 0); if(buf){ dup2(out[1], 1); close(out[1]); } close(in[0]); close(in[1]); if (e) exportenv(e, sh); n = shargv(shellcmd, 1, &argv); argv[n++] = args; argv[n] = 0; execvp(argv[0], argv); mkperror(shell); _exit(1); } close(out[1]); close(in[0]); if(DEBUG(D_EXEC)) fprint(1, "starting: %s\n", cmd); p = cmd+strlen(cmd); while(cmd < p){ n = write(in[1], cmd, p-cmd); if(n < 0) break; cmd += n; } close(in[1]); _exit(0); } if(buf){ close(out[1]); tot = 0; for(;;){ if (buf->current >= buf->end) growbuf(buf); n = read(out[0], buf->current, buf->end-buf->current); if(n <= 0) break; buf->current += n; tot += n; } if (tot && buf->current[-1] == '\n') buf->current--; close(out[0]); } return pid; } int pipecmd(char *cmd, Envy *e, int *fd, Shell *sh, Word *shellcmd) { int pid, pfd[2]; int n; char **argv; if(DEBUG(D_EXEC)) fprint(1, "pipecmd='%s'\n", cmd);/**/ if(fd && pipe(pfd) < 0){ mkperror("pipe"); Exit(); } pid = fork(); if(pid < 0){ mkperror("mk fork"); Exit(); } if(pid == 0){ if(fd){ close(pfd[0]); dup2(pfd[1], 1); close(pfd[1]); } if(e) exportenv(e, sh); n = shargv(shellcmd, 2, &argv); argv[n++] = "-c"; argv[n++] = cmd; argv[n] = 0; execvp(argv[0], argv); mkperror(shell); _exit(1); } if(fd){ close(pfd[1]); *fd = pfd[0]; } return pid; } void Exit(void) { while(wait(0) >= 0) ; exits("error"); } static struct { int sig; char *msg; } sigmsgs[] = { SIGALRM, "alarm", SIGFPE, "sys: fp: fptrap", SIGPIPE, "sys: write on closed pipe", SIGILL, "sys: trap: illegal instruction", /* SIGSEGV, "sys: segmentation violation", */ 0, 0 }; static void notifyf(int sig) { int i; for(i = 0; sigmsgs[i].msg; i++) if(sigmsgs[i].sig == sig) killchildren(sigmsgs[i].msg); /* should never happen */ signal(sig, SIG_DFL); kill(getpid(), sig); } void catchnotes(void) { int i; for(i = 0; sigmsgs[i].msg; i++) signal(sigmsgs[i].sig, notifyf); } char* maketmp(int *pfd) { static char temp[] = "/tmp/mkargXXXXXX"; static char buf[100]; int fd; strcpy(buf, temp); fd = mkstemp(buf); if(fd < 0) return 0; *pfd = fd; return buf; } int chgtime(char *name) { if(access(name, 0) >= 0) return utimes(name, 0); return close(creat(name, 0666)); } void rcopy(char **to, Resub *match, int n) { int c; char *p; *to = match->s.sp; /* stem0 matches complete target */ for(to++, match++; --n > 0; to++, match++){ if(match->s.sp && match->e.ep){ p = match->e.ep; c = *p; *p = 0; *to = strdup(match->s.sp); *p = c; } else *to = 0; } } unsigned long mkmtime(char *name) { struct stat st; if(stat(name, &st) < 0) return 0; return st.st_mtime; } 9base-6/mk/sys.h0000644000175000017500000000010711402154555013142 0ustar anselmanselm#include #include #include #include 9base-6/mk/word.c0000644000175000017500000000523511402154555013301 0ustar anselmanselm#include "mk.h" static Word *nextword(char**); Word* newword(char *s) { Word *w; w = (Word *)Malloc(sizeof(Word)); w->s = strdup(s); w->next = 0; return(w); } Word * stow(char *s) { Word *head, *w, *new; w = head = 0; while(*s){ new = nextword(&s); if(new == 0) break; if (w) w->next = new; else head = w = new; while(w->next) w = w->next; } if (!head) head = newword(""); return(head); } char * wtos(Word *w, int sep) { Bufblock *buf; char *cp; buf = newbuf(); for(; w; w = w->next){ for(cp = w->s; *cp; cp++) insert(buf, *cp); if(w->next) insert(buf, sep); } insert(buf, 0); cp = strdup(buf->start); freebuf(buf); return(cp); } Word* wdup(Word *w) { Word *v, *new, *base; v = base = 0; while(w){ new = newword(w->s); if(v) v->next = new; else base = new; v = new; w = w->next; } return base; } void delword(Word *w) { Word *v; while(v = w){ w = w->next; if(v->s) free(v->s); free(v); } } /* * break out a word from a string handling quotes, executions, * and variable expansions. */ static Word* nextword(char **s) { Bufblock *b; Word *head, *tail, *w; Rune r; char *cp; int empty; cp = *s; b = newbuf(); restart: head = tail = 0; while(*cp == ' ' || *cp == '\t') /* leading white space */ cp++; empty = 1; while(*cp){ cp += chartorune(&r, cp); switch(r) { case ' ': case '\t': case '\n': goto out; case '\\': case '\'': case '"': empty = 0; cp = shellt->expandquote(cp, r, b); if(cp == 0){ fprint(2, "missing closing quote: %s\n", *s); Exit(); } break; case '$': w = varsub(&cp); if(w == 0){ if(empty) goto restart; break; } empty = 0; if(b->current != b->start){ bufcpy(b, w->s, strlen(w->s)); insert(b, 0); free(w->s); w->s = strdup(b->start); b->current = b->start; } if(head){ bufcpy(b, tail->s, strlen(tail->s)); bufcpy(b, w->s, strlen(w->s)); insert(b, 0); free(tail->s); tail->s = strdup(b->start); tail->next = w->next; free(w->s); free(w); b->current = b->start; } else tail = head = w; while(tail->next) tail = tail->next; break; default: empty = 0; rinsert(b, r); break; } } out: *s = cp; if(b->current != b->start){ if(head){ cp = b->current; bufcpy(b, tail->s, strlen(tail->s)); bufcpy(b, b->start, cp-b->start); insert(b, 0); free(tail->s); tail->s = strdup(cp); } else { insert(b, 0); head = newword(b->start); } } freebuf(b); return head; } void dumpw(char *s, Word *w) { Bprint(&bout, "%s", s); for(; w; w = w->next) Bprint(&bout, " '%s'", w->s); Bputc(&bout, '\n'); } 9base-6/mk/env.c0000644000175000017500000000435011402154555013113 0ustar anselmanselm#include "mk.h" enum { ENVQUANTA=10 }; Envy *envy; static int nextv; static char *myenv[] = { "target", "stem", "prereq", "pid", "nproc", "newprereq", "alltarget", "newmember", "stem0", /* must be in order from here */ "stem1", "stem2", "stem3", "stem4", "stem5", "stem6", "stem7", "stem8", "stem9", 0 }; void initenv(void) { char **p; for(p = myenv; *p; p++) symlook(*p, S_INTERNAL, (void *)""); readenv(); /* o.s. dependent */ } static void envinsert(char *name, Word *value) { static int envsize; if (nextv >= envsize) { envsize += ENVQUANTA; envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy)); } envy[nextv].name = name; envy[nextv++].values = value; } static void envupd(char *name, Word *value) { Envy *e; for(e = envy; e->name; e++) if(strcmp(name, e->name) == 0){ delword(e->values); e->values = value; return; } e->name = name; e->values = value; envinsert(0,0); } static void ecopy(Symtab *s) { char **p; if(symlook(s->name, S_NOEXPORT, 0)) return; for(p = myenv; *p; p++) if(strcmp(*p, s->name) == 0) return; envinsert(s->name, s->u.ptr); } void execinit(void) { char **p; nextv = 0; for(p = myenv; *p; p++) envinsert(*p, stow("")); symtraverse(S_VAR, ecopy); envinsert(0, 0); } Envy* buildenv(Job *j, int slot) { char **p, *cp, *qp; Word *w, *v, **l; int i; char buf[256]; envupd("target", wdup(j->t)); if(j->r->attr®EXP) envupd("stem",newword("")); else envupd("stem", newword(j->stem)); envupd("prereq", wdup(j->p)); sprint(buf, "%d", getpid()); envupd("pid", newword(buf)); sprint(buf, "%d", slot); envupd("nproc", newword(buf)); envupd("newprereq", wdup(j->np)); envupd("alltarget", wdup(j->at)); l = &v; v = w = wdup(j->np); while(w){ cp = strchr(w->s, '('); if(cp){ qp = strchr(cp+1, ')'); if(qp){ *qp = 0; strcpy(w->s, cp+1); l = &w->next; w = w->next; continue; } } *l = w->next; free(w->s); free(w); w = *l; } envupd("newmember", v); /* update stem0 -> stem9 */ for(p = myenv; *p; p++) if(strcmp(*p, "stem0") == 0) break; for(i = 0; *p; i++, p++){ if((j->r->attr®EXP) && j->match[i]) envupd(*p, newword(j->match[i])); else envupd(*p, newword("")); } return envy; } 9base-6/mk/README0000644000175000017500000000032111402154555013031 0ustar anselmanselmThis is a Unix port of mk, originally done for the Inferno operating system. Russ Cox repackaged this to build as a standalone Unix program. Send comments about packaging to Russ Cox 9base-6/mk/mk.10000644000175000017500000003361011402154555012651 0ustar anselmanselm.TH MK 1 .SH NAME mk \- maintain (make) related files .SH SYNOPSIS .B mk [ .B -f .I mkfile ] ... [ .I option ... ] [ .I target ... ] .SH DESCRIPTION .I Mk uses the dependency rules specified in .I mkfile to control the update (usually by compilation) of .I targets (usually files) from the source files upon which they depend. The .I mkfile (default .LR mkfile ) contains a .I rule for each target that identifies the files and other targets upon which it depends and an .IR sh (1) script, a .IR recipe , to update the target. The script is run if the target does not exist or if it is older than any of the files it depends on. .I Mkfile may also contain .I meta-rules that define actions for updating implicit targets. If no .I target is specified, the target of the first rule (not meta-rule) in .I mkfile is updated. .PP The environment variable .B $NPROC determines how many targets may be updated simultaneously; Some operating systems, e.g., Plan 9, set .B $NPROC automatically to the number of CPUs on the current machine. .PP Options are: .TP \w'\fL-d[egp]\ 'u .B -a Assume all targets to be out of date. Thus, everything is updated. .PD 0 .TP .BR -d [ egp ] Produce debugging output .RB ( p is for parsing, .B g for graph building, .B e for execution). .TP .B -e Explain why each target is made. .TP .B -i Force any missing intermediate targets to be made. .TP .B -k Do as much work as possible in the face of errors. .TP .B -n Print, but do not execute, the commands needed to update the targets. .TP .B -s Make the command line arguments sequentially rather than in parallel. .TP .B -t Touch (update the modified date of) file targets, without executing any recipes. .TP .BI -w target1 , target2,... Pretend the modify time for each .I target is the current time; useful in conjunction with .B -n to learn what updates would be triggered by modifying the .IR targets . .PD .SS The \fLmkfile\fP A .I mkfile consists of .I assignments (described under `Environment') and .IR rules . A rule contains .I targets and a .IR tail . A target is a literal string and is normally a file name. The tail contains zero or more .I prerequisites and an optional .IR recipe , which is an .B shell script. Each line of the recipe must begin with white space. A rule takes the form .IP .EX target: prereq1 prereq2 \f2recipe using\fP prereq1, prereq2 \f2to build\fP target .EE .PP When the recipe is executed, the first character on every line is elided. .PP After the colon on the target line, a rule may specify .IR attributes , described below. .PP A .I meta-rule has a target of the form .IB A % B where .I A and .I B are (possibly empty) strings. A meta-rule acts as a rule for any potential target whose name matches .IB A % B with .B % replaced by an arbitrary string, called the .IR stem . In interpreting a meta-rule, the stem is substituted for all occurrences of .B % in the prerequisite names. In the recipe of a meta-rule, the environment variable .B $stem contains the string matched by the .BR % . For example, a meta-rule to compile a C program using .IR 9c (1) might be: .IP .EX %: %.c 9c -c $stem.c 9l -o $stem $stem.o .EE .PP Meta-rules may contain an ampersand .B & rather than a percent sign .BR % . A .B % matches a maximal length string of any characters; an .B & matches a maximal length string of any characters except period or slash. .PP The text of the .I mkfile is processed as follows. Lines beginning with .B < followed by a file name are replaced by the contents of the named file. Lines beginning with .B "<|" followed by a file name are replaced by the output of the execution of the named file. Blank lines and comments, which run from unquoted .B # characters to the following newline, are deleted. The character sequence backslash-newline is deleted, so long lines in .I mkfile may be folded. Non-recipe lines are processed by substituting for .BI `{ command } the output of the .I command when run by .IR sh . References to variables are replaced by the variables' values. Special characters may be quoted using single quotes .BR \&'' as in .IR sh (1). .PP Assignments and rules are distinguished by the first unquoted occurrence of .B : (rule) or .B = (assignment). .PP A later rule may modify or override an existing rule under the following conditions: .TP \- If the targets of the rules exactly match and one rule contains only a prerequisite clause and no recipe, the clause is added to the prerequisites of the other rule. If either or both targets are virtual, the recipe is always executed. .TP \- If the targets of the rules match exactly and the prerequisites do not match and both rules contain recipes, .I mk reports an ``ambiguous recipe'' error. .TP \- If the target and prerequisites of both rules match exactly, the second rule overrides the first. .SS Environment Rules may make use of shell environment variables. A legal reference of the form .B $OBJ or .B ${name} is expanded as in .IR sh (1). A reference of the form .BI ${name: A % B = C\fL%\fID\fL}\fR, where .I A, B, C, D are (possibly empty) strings, has the value formed by expanding .B $name and substituting .I C for .I A and .I D for .I B in each word in .B $name that matches pattern .IB A % B\f1. .PP Variables can be set by assignments of the form .I var\fL=\fR[\fIattr\fL=\fR]\fIvalue\fR .br Blanks in the .I value break it into words. Such variables are exported to the environment of recipes as they are executed, unless .BR U , the only legal attribute .IR attr , is present. The initial value of a variable is taken from (in increasing order of precedence) the default values below, .I mk's environment, the .IR mkfiles , and any command line assignment as an argument to .IR mk . A variable assignment argument overrides the first (but not any subsequent) assignment to that variable. .PP The variable .B MKFLAGS contains all the option arguments (arguments starting with .L - or containing .LR = ) and .B MKARGS contains all the targets in the call to .IR mk . .PP The variable .B MKSHELL contains the shell command line .I mk uses to run recipes. If the first word of the command ends in .B rc or .BR rcsh , .I mk uses .IR rc (1)'s quoting rules; otherwise it uses .IR sh (1)'s. The .B MKSHELL variable is consulted when the mkfile is read, not when it is executed, so that different shells can be used within a single mkfile: .IP .EX MKSHELL=$PLAN9/bin/rc use-rc:V: for(i in a b c) echo $i MKSHELL=sh use-sh:V: for i in a b c; do echo $i; done .EE .LP Mkfiles included via .B < or .B <| .RI ( q.v. ) see their own private copy of .BR MKSHELL , which always starts set to .B sh . .PP Dynamic information may be included in the mkfile by using a line of the form .IP \fR<|\fIcommand\fR \fIargs\fR .LP This runs the command .I command with the given arguments .I args and pipes its standard output to .I mk to be included as part of the mkfile. For instance, the Inferno kernels use this technique to run a shell command with an awk script and a configuration file as arguments in order for the .I awk script to process the file and output a set of variables and their values. .SS Execution .PP During execution, .I mk determines which targets must be updated, and in what order, to build the .I names specified on the command line. It then runs the associated recipes. .PP A target is considered up to date if it has no prerequisites or if all its prerequisites are up to date and it is newer than all its prerequisites. Once the recipe for a target has executed, the target is considered up to date. .PP The date stamp used to determine if a target is up to date is computed differently for different types of targets. If a target is .I virtual (the target of a rule with the .B V attribute), its date stamp is initially zero; when the target is updated the date stamp is set to the most recent date stamp of its prerequisites. Otherwise, if a target does not exist as a file, its date stamp is set to the most recent date stamp of its prerequisites, or zero if it has no prerequisites. Otherwise, the target is the name of a file and the target's date stamp is always that file's modification date. The date stamp is computed when the target is needed in the execution of a rule; it is not a static value. .PP Nonexistent targets that have prerequisites and are themselves prerequisites are treated specially. Such a target .I t is given the date stamp of its most recent prerequisite and if this causes all the targets which have .I t as a prerequisite to be up to date, .I t is considered up to date. Otherwise, .I t is made in the normal fashion. The .B -i flag overrides this special treatment. .PP Files may be made in any order that respects the preceding restrictions. .PP A recipe is executed by supplying the recipe as standard input to the command .BR /bin/sh . (Note that unlike .IR make , .I mk feeds the entire recipe to the shell rather than running each line of the recipe separately.) The environment is augmented by the following variables: .TP 14 .B $alltarget all the targets of this rule. .TP .B $newprereq the prerequisites that caused this rule to execute. .TP .B $newmember the prerequisites that are members of an aggregate that caused this rule to execute. When the prerequisites of a rule are members of an aggregate, .B $newprereq contains the name of the aggregate and out of date members, while .B $newmember contains only the name of the members. .TP .B $nproc the process slot for this recipe. It satisfies .RB 0≤ $nproc < $NPROC . .TP .B $pid the process id for the .I mk executing the recipe. .TP .B $prereq all the prerequisites for this rule. .TP .B $stem if this is a meta-rule, .B $stem is the string that matched .B % or .BR & . Otherwise, it is empty. For regular expression meta-rules (see below), the variables .LR stem0 ", ...," .L stem9 are set to the corresponding subexpressions. .TP .B $target the targets for this rule that need to be remade. .PP These variables are available only during the execution of a recipe, not while evaluating the .IR mkfile . .PP Unless the rule has the .B Q attribute, the recipe is printed prior to execution with recognizable environment variables expanded. Commands returning error status cause .I mk to terminate. .PP Recipes and backquoted .B rc commands in places such as assignments execute in a copy of .I mk's environment; changes they make to environment variables are not visible from .IR mk . .PP Variable substitution in a rule is done when the rule is read; variable substitution in the recipe is done when the recipe is executed. For example: .IP .EX bar=a.c foo: $bar $CC -o foo $bar bar=b.c .EE .PP will compile .B b.c into .BR foo , if .B a.c is newer than .BR foo . .SS Aggregates Names of the form .IR a ( b ) refer to member .I b of the aggregate .IR a . Currently, the only aggregates supported are .I 9ar (see .IR 9c (1)) archives. .SS Attributes The colon separating the target from the prerequisites may be immediately followed by .I attributes and another colon. The attributes are: .TP .B D If the recipe exits with a non-null status, the target is deleted. .TP .B E Continue execution if the recipe draws errors. .TP .B N If there is no recipe, the target has its time updated. .TP .B n The rule is a meta-rule that cannot be a target of a virtual rule. Only files match the pattern in the target. .TP .B P The characters after the .B P until the terminating .B : are taken as a program name. It will be invoked as .B "sh -c prog 'arg1' 'arg2'" and should return a zero exit status if and only if arg1 is up to date with respect to arg2. Date stamps are still propagated in the normal way. .TP .B Q The recipe is not printed prior to execution. .TP .B R The rule is a meta-rule using regular expressions. In the rule, .B % has no special meaning. The target is interpreted as a regular expression as defined in .IR regexp (7). The prerequisites may contain references to subexpressions in form .BI \e n\f1, as in the substitute command of .IR sed (1). .TP .B U The targets are considered to have been updated even if the recipe did not do so. .TP .B V The targets of this rule are marked as virtual. They are distinct from files of the same name. .PD .SH EXAMPLES A simple mkfile to compile a program: .IP .EX .ta 8n +8n +8n +8n +8n +8n +8n . .SH SOURCE .B \*9/src/cmd/sort.c .SH SEE ALSO .IR uniq (1), .IR look (1) .SH DIAGNOSTICS .I Sort comments and exits with non-null status for various trouble conditions and for disorder discovered under option .BR -c . .SH BUGS An external null character can be confused with an internally generated end-of-field character. The result can make a sub-field not sort less than a longer field. .PP Some of the options, e.g. .B -i and .BR -M , are hopelessly provincial. 9base-6/sort/Makefile0000644000175000017500000000017411402154555014177 0ustar anselmanselm# sort - sort unix port from plan9 # Depends on ../lib9 TARG = sort include ../std.mk pre-uninstall: post-install: 9base-6/sort/sort.c0000644000175000017500000007154511402154555013704 0ustar anselmanselm#include #include #include /* bugs: 00/ff for end of file can conflict with 00/ff characters */ enum { Nline = 500000, /* default max number of lines saved in memory */ Nmerge = 10, /* max number of temporary files merged */ Nfield = 20, /* max number of argument fields */ Bflag = 1<<0, /* flags per field */ B1flag = 1<<1, Dflag = 1<<2, Fflag = 1<<3, Gflag = 1<<4, Iflag = 1<<5, Mflag = 1<<6, Nflag = 1<<7, Rflag = 1<<8, Wflag = 1<<9, NSstart = 0, /* states for number to key decoding */ NSsign, NSzero, NSdigit, NSpoint, NSfract, NSzerofract, NSexp, NSexpsign, NSexpdigit }; typedef struct Line Line; typedef struct Key Key; typedef struct Merge Merge; typedef struct Field Field; struct Line { Key* key; int llen; /* always >= 1 */ uchar line[1]; /* always ends in '\n' */ }; struct Merge { Key* key; /* copy of line->key so (Line*) looks like (Merge*) */ Line* line; /* line at the head of a merged temp file */ int fd; /* file descriptor */ Biobuf b; /* iobuf for reading a temp file */ }; struct Key { int klen; uchar key[1]; }; struct Field { int beg1; int beg2; int end1; int end2; long flags; uchar mapto[256]; void (*dokey)(Key*, uchar*, uchar*, Field*); }; struct args { char* ofile; char* tname; Rune tabchar; char cflag; char uflag; char vflag; int nfield; int nfile; Field field[Nfield]; Line** linep; long nline; /* number of lines in this temp file */ long lineno; /* overall ordinal for -s option */ int ntemp; long mline; /* max lines per file */ } args; extern int latinmap[]; extern Rune* month[12]; void buildkey(Line*); void doargs(int, char*[]); void dofield(char*, int*, int*, int, int); void dofile(Biobuf*); void dokey_(Key*, uchar*, uchar*, Field*); void dokey_dfi(Key*, uchar*, uchar*, Field*); void dokey_gn(Key*, uchar*, uchar*, Field*); void dokey_m(Key*, uchar*, uchar*, Field*); void dokey_r(Key*, uchar*, uchar*, Field*); void done(char*); int kcmp(Key*, Key*); void makemapd(Field*); void makemapm(Field*); void mergefiles(int, int, Biobuf*); void mergeout(Biobuf*); void newfield(void); Line* newline(Biobuf*); void nomem(void); void notifyf(void*, char*); void printargs(void); void printout(Biobuf*); void setfield(int, int); uchar* skip(uchar*, int, int, int, int); void sort4(void*, ulong); char* tempfile(int); void tempout(void); void lineout(Biobuf*, Line*); void main(int argc, char *argv[]) { int i, f; char *s; Biobuf bbuf; notify(notifyf); /**/ doargs(argc, argv); if(args.vflag) printargs(); for(i=1; ikey, l->key); if(n > 0 || (n == 0 && args.uflag)) { fprint(2, "sort: -c file not in sort\n"); /**/ done("order"); } free(ol->key); free(ol); ol = l; } return; } if(args.linep == 0) { args.linep = malloc(args.mline * sizeof(args.linep)); if(args.linep == 0) nomem(); } for(;;) { l = newline(b); if(l == 0) break; if(args.nline >= args.mline) tempout(); args.linep[args.nline] = l; args.nline++; args.lineno++; } } void notifyf(void *a, char *s) { USED(a); if(strcmp(s, "interrupt") == 0) done(0); if(strcmp(s, "hangup") == 0) done(0); if(strcmp(s, "kill") == 0) done(0); if(strncmp(s, "sys: write on closed pipe", 25) == 0) done(0); noted(NDFLT); } Line* newline(Biobuf *b) { Line *l; char *p; int n, c; p = Brdline(b, '\n'); n = Blinelen(b); if(p == 0) { if(n == 0) return 0; l = 0; for(n=0;;) { if((n & 31) == 0) { l = realloc(l, sizeof(Line) + (n+31)*sizeof(l->line[0])); if(l == 0) nomem(); } c = Bgetc(b); if(c < 0) { fprint(2, "sort: newline added\n"); c = '\n'; } l->line[n++] = c; if(c == '\n') break; } l->llen = n; buildkey(l); return l; } l = malloc(sizeof(Line) + (n-1)*sizeof(l->line[0])); if(l == 0) nomem(); l->llen = n; memmove(l->line, p, n); buildkey(l); return l; } void lineout(Biobuf *b, Line *l) { int n, m; n = l->llen; m = Bwrite(b, l->line, n); if(n != m) exits("write"); } void tempout(void) { long n; Line **lp, *l; char *tf; int f; Biobuf tb; sort4(args.linep, args.nline); tf = tempfile(args.ntemp); args.ntemp++; f = create(tf, OWRITE, 0666); if(f < 0) { fprint(2, "sort: create %s: %r\n", tf); done("create"); } Binit(&tb, f, OWRITE); lp = args.linep; for(n=args.nline; n>0; n--) { l = *lp++; lineout(&tb, l); free(l->key); free(l); } args.nline = 0; Bterm(&tb); close(f); } void done(char *xs) { int i; for(i=0; i= nelem(file)-20) { fprint(2, "temp file directory name is too long: %s\n", dir); done("tdir"); } if(pid == 0) { pid = getpid(); if(pid == 0) { pid = time(0); if(pid == 0) pid = 1; } } sprint(file, "%s/sort.%.4d.%.4d", dir, pid%10000, n); return file; } void mergeout(Biobuf *b) { int n, i, f; char *tf; Biobuf tb; for(i=0; i Nmerge) { tf = tempfile(args.ntemp); args.ntemp++; f = create(tf, OWRITE, 0666); if(f < 0) { fprint(2, "sort: create %s: %r\n", tf); done("create"); } Binit(&tb, f, OWRITE); n = Nmerge; mergefiles(i, n, &tb); Bterm(&tb); close(f); } else mergefiles(i, n, b); } } void mergefiles(int t, int n, Biobuf *b) { Merge *m, *mp, **mmp; Key *ok; Line *l; char *tf; int i, f, nn; mmp = malloc(n*sizeof(*mmp)); mp = malloc(n*sizeof(*mp)); if(mmp == 0 || mp == 0) nomem(); nn = 0; m = mp; for(i=0; ifd = f; Binit(&m->b, f, OREAD); mmp[nn] = m; l = newline(&m->b); if(l == 0) continue; nn++; m->line = l; m->key = l->key; } ok = 0; for(;;) { sort4(mmp, nn); m = *mmp; if(nn == 0) break; for(;;) { l = m->line; if(args.uflag && ok && kcmp(ok, l->key) == 0) { free(l->key); free(l); } else { lineout(b, l); if(ok) free(ok); ok = l->key; free(l); } l = newline(&m->b); if(l == 0) { nn--; mmp[0] = mmp[nn]; break; } m->line = l; m->key = l->key; if(nn > 1 && kcmp(mmp[0]->key, mmp[1]->key) > 0) break; } } if(ok) free(ok); m = mp; for(i=0; ib); close(m->fd); } free(mp); free(mmp); } int kcmp(Key *ka, Key *kb) { int n, m; /* * set n to length of smaller key */ n = ka->klen; m = kb->klen; if(n > m) n = m; return memcmp(ka->key, kb->key, n); } void printout(Biobuf *b) { long n; Line **lp, *l; Key *ok; sort4(args.linep, args.nline); lp = args.linep; ok = 0; for(n=args.nline; n>0; n--) { l = *lp++; if(args.uflag && ok && kcmp(ok, l->key) == 0) continue; lineout(b, l); ok = l->key; } } void setfield(int n, int c) { Field *f; f = &args.field[n]; switch(c) { default: fprint(2, "sort: unknown option: field.%C\n", c); done("option"); case 'b': /* skip blanks */ f->flags |= Bflag; break; case 'd': /* directory order */ f->flags |= Dflag; break; case 'f': /* fold case */ f->flags |= Fflag; break; case 'g': /* floating point -n case */ f->flags |= Gflag; break; case 'i': /* ignore non-ascii */ f->flags |= Iflag; break; case 'M': /* month */ f->flags |= Mflag; break; case 'n': /* numbers */ f->flags |= Nflag; break; case 'r': /* reverse */ f->flags |= Rflag; break; case 'w': /* ignore white */ f->flags |= Wflag; break; } } void dofield(char *s, int *n1, int *n2, int off1, int off2) { int c, n; c = *s++; if(c >= '0' && c <= '9') { n = 0; while(c >= '0' && c <= '9') { n = n*10 + (c-'0'); c = *s++; } n -= off1; /* posix committee: rot in hell */ if(n < 0) { fprint(2, "sort: field offset must be positive\n"); done("option"); } *n1 = n; } if(c == '.') { c = *s++; if(c >= '0' && c <= '9') { n = 0; while(c >= '0' && c <= '9') { n = n*10 + (c-'0'); c = *s++; } n -= off2; if(n < 0) { fprint(2, "sort: character offset must be positive\n"); done("option"); } *n2 = n; } } while(c != 0) { setfield(args.nfield, c); c = *s++; } } void printargs(void) { int i, n; Field *f; char *prefix; fprint(2, "sort"); for(i=0; i<=args.nfield; i++) { f = &args.field[i]; prefix = " -"; if(i) { n = f->beg1; if(n >= 0) fprint(2, " +%d", n); else fprint(2, " +*"); n = f->beg2; if(n >= 0) fprint(2, ".%d", n); else fprint(2, ".*"); if(f->flags & B1flag) fprint(2, "b"); n = f->end1; if(n >= 0) fprint(2, " -%d", n); else fprint(2, " -*"); n = f->end2; if(n >= 0) fprint(2, ".%d", n); else fprint(2, ".*"); prefix = ""; } if(f->flags & Bflag) fprint(2, "%sb", prefix); if(f->flags & Dflag) fprint(2, "%sd", prefix); if(f->flags & Fflag) fprint(2, "%sf", prefix); if(f->flags & Gflag) fprint(2, "%sg", prefix); if(f->flags & Iflag) fprint(2, "%si", prefix); if(f->flags & Mflag) fprint(2, "%sM", prefix); if(f->flags & Nflag) fprint(2, "%sn", prefix); if(f->flags & Rflag) fprint(2, "%sr", prefix); if(f->flags & Wflag) fprint(2, "%sw", prefix); } if(args.cflag) fprint(2, " -c"); if(args.uflag) fprint(2, " -u"); if(args.ofile) fprint(2, " -o %s", args.ofile); if(args.mline != Nline) fprint(2, " -l %ld", args.mline); fprint(2, "\n"); } void newfield(void) { int n; Field *f; n = args.nfield + 1; if(n >= Nfield) { fprint(2, "sort: too many fields specified\n"); done("option"); } args.nfield = n; f = &args.field[n]; f->beg1 = -1; f->beg2 = -1; f->end1 = -1; f->end2 = -1; } void doargs(int argc, char *argv[]) { int i, c, hadplus; char *s, *p, *q; Field *f; hadplus = 0; args.mline = Nline; for(i=1; i= '0' && c <= '9')) { if(!hadplus) newfield(); f = &args.field[args.nfield]; dofield(s, &f->end1, &f->end2, 0, 0); hadplus = 0; continue; } while(c = *s++) switch(c) { case '-': /* end of options */ i = argc; continue; case 'T': /* temp directory */ if(*s == 0) { i++; if(i < argc) { args.tname = argv[i]; argv[i] = 0; } } else args.tname = s; s = strchr(s, 0); break; case 'o': /* output file */ if(*s == 0) { i++; if(i < argc) { args.ofile = argv[i]; argv[i] = 0; } } else args.ofile = s; s = strchr(s, 0); break; case 'k': /* posix key (what were they thinking?) */ p = 0; if(*s == 0) { i++; if(i < argc) { p = argv[i]; argv[i] = 0; } } else p = s; s = strchr(s, 0); if(p == 0) break; newfield(); q = strchr(p, ','); if(q) *q++ = 0; f = &args.field[args.nfield]; dofield(p, &f->beg1, &f->beg2, 1, 1); if(f->flags & Bflag) { f->flags |= B1flag; f->flags &= ~Bflag; } if(q) { dofield(q, &f->end1, &f->end2, 1, 0); if(f->end2 <= 0) f->end1++; } hadplus = 0; break; case 't': /* tab character */ if(*s == 0) { i++; if(i < argc) { chartorune(&args.tabchar, argv[i]); argv[i] = 0; } } else s += chartorune(&args.tabchar, s); if(args.tabchar == '\n') { fprint(2, "aw come on, rob\n"); done("rob"); } break; case 'c': /* check order */ args.cflag = 1; break; case 'u': /* unique */ args.uflag = 1; break; case 'v': /* debugging noise */ args.vflag = 1; break; case 'l': if(*s == 0) { i++; if(i < argc) { args.mline = atol(argv[i]); argv[i] = 0; } } else args.mline = atol(s); s = strchr(s, 0); break; case 'M': /* month */ case 'b': /* skip blanks */ case 'd': /* directory order */ case 'f': /* fold case */ case 'g': /* floating numbers */ case 'i': /* ignore non-ascii */ case 'n': /* numbers */ case 'r': /* reverse */ case 'w': /* ignore white */ if(args.nfield > 0) fprint(2, "sort: global field set after -k\n"); setfield(0, c); break; case 'm': /* option m silently ignored but required by posix */ break; default: fprint(2, "sort: unknown option: -%C\n", c); done("option"); } continue; } if(c == '+') { argv[i] = 0; /* clobber args processed */ c = *s; if(c == '.' || (c >= '0' && c <= '9')) { newfield(); f = &args.field[args.nfield]; dofield(s, &f->beg1, &f->beg2, 0, 0); if(f->flags & Bflag) { f->flags |= B1flag; f->flags &= ~Bflag; } hadplus = 1; continue; } fprint(2, "sort: unknown option: +%C\n", c); done("option"); } args.nfile++; } for(i=0; i<=args.nfield; i++) { f = &args.field[i]; /* * global options apply to fields that * specify no options */ if(f->flags == 0) { f->flags = args.field[0].flags; if(args.field[0].flags & Bflag) f->flags |= B1flag; } /* * build buildkey specification */ switch(f->flags & ~(Bflag|B1flag)) { default: fprint(2, "sort: illegal combination of flags: %lx\n", f->flags); done("option"); case 0: f->dokey = dokey_; break; case Rflag: f->dokey = dokey_r; break; case Gflag: case Nflag: case Gflag|Nflag: case Gflag|Rflag: case Nflag|Rflag: case Gflag|Nflag|Rflag: f->dokey = dokey_gn; break; case Mflag: case Mflag|Rflag: f->dokey = dokey_m; makemapm(f); break; case Dflag: case Dflag|Fflag: case Dflag|Fflag|Iflag: case Dflag|Fflag|Iflag|Rflag: case Dflag|Fflag|Iflag|Rflag|Wflag: case Dflag|Fflag|Iflag|Wflag: case Dflag|Fflag|Rflag: case Dflag|Fflag|Rflag|Wflag: case Dflag|Fflag|Wflag: case Dflag|Iflag: case Dflag|Iflag|Rflag: case Dflag|Iflag|Rflag|Wflag: case Dflag|Iflag|Wflag: case Dflag|Rflag: case Dflag|Rflag|Wflag: case Dflag|Wflag: case Fflag: case Fflag|Iflag: case Fflag|Iflag|Rflag: case Fflag|Iflag|Rflag|Wflag: case Fflag|Iflag|Wflag: case Fflag|Rflag: case Fflag|Rflag|Wflag: case Fflag|Wflag: case Iflag: case Iflag|Rflag: case Iflag|Rflag|Wflag: case Iflag|Wflag: case Wflag: f->dokey = dokey_dfi; makemapd(f); break; } } /* * random spot checks */ if(args.nfile > 1 && args.cflag) { fprint(2, "sort: -c can have at most one input file\n"); done("option"); } return; } uchar* skip(uchar *l, int n1, int n2, int bflag, int endfield) { int i, c, tc; Rune r; if(endfield && n1 < 0) return 0; c = *l++; tc = args.tabchar; if(tc) { if(tc < Runeself) { for(i=n1; i>0; i--) { while(c != tc) { if(c == '\n') return 0; c = *l++; } if(!(endfield && i == 1)) c = *l++; } } else { l--; l += chartorune(&r, (char*)l); for(i=n1; i>0; i--) { while(r != tc) { if(r == '\n') return 0; l += chartorune(&r, (char*)l); } if(!(endfield && i == 1)) l += chartorune(&r, (char*)l); } c = r; } } else { for(i=n1; i>0; i--) { while(c == ' ' || c == '\t') c = *l++; while(c != ' ' && c != '\t') { if(c == '\n') return 0; c = *l++; } } } if(bflag) while(c == ' ' || c == '\t') c = *l++; l--; for(i=n2; i>0; i--) { c = *l; if(c < Runeself) { if(c == '\n') return 0; l++; continue; } l += chartorune(&r, (char*)l); } return l; } void dokey_gn(Key *k, uchar *lp, uchar *lpe, Field *f) { uchar *kp; int c, cl, dp; int state, nzero, exp, expsign, rflag; cl = k->klen + 3; kp = k->key + cl; /* skip place for sign, exponent[2] */ nzero = 0; /* number of trailing zeros */ exp = 0; /* value of the exponent */ expsign = 0; /* sign of the exponent */ dp = 0x4040; /* location of decimal point */ rflag = f->flags&Rflag; /* xor of rflag and - sign */ state = NSstart; for(;; lp++) { if(lp >= lpe) break; c = *lp; if(c == ' ' || c == '\t') { switch(state) { case NSstart: case NSsign: continue; } break; } if(c == '+' || c == '-') { switch(state) { case NSstart: state = NSsign; if(c == '-') rflag = !rflag; continue; case NSexp: state = NSexpsign; if(c == '-') expsign = 1; continue; } break; } if(c == '0') { switch(state) { case NSdigit: if(rflag) c = ~c; *kp++ = c; cl++; nzero++; dp++; state = NSdigit; continue; case NSfract: if(rflag) c = ~c; *kp++ = c; cl++; nzero++; state = NSfract; continue; case NSstart: case NSsign: case NSzero: state = NSzero; continue; case NSzerofract: case NSpoint: dp--; state = NSzerofract; continue; case NSexpsign: case NSexp: case NSexpdigit: exp = exp*10 + (c - '0'); state = NSexpdigit; continue; } break; } if(c >= '1' && c <= '9') { switch(state) { case NSzero: case NSstart: case NSsign: case NSdigit: if(rflag) c = ~c; *kp++ = c; cl++; nzero = 0; dp++; state = NSdigit; continue; case NSzerofract: case NSpoint: case NSfract: if(rflag) c = ~c; *kp++ = c; cl++; nzero = 0; state = NSfract; continue; case NSexpsign: case NSexp: case NSexpdigit: exp = exp*10 + (c - '0'); state = NSexpdigit; continue; } break; } if(c == '.') { switch(state) { case NSstart: case NSsign: state = NSpoint; continue; case NSzero: state = NSzerofract; continue; case NSdigit: state = NSfract; continue; } break; } if((f->flags & Gflag) && (c == 'e' || c == 'E')) { switch(state) { case NSdigit: case NSfract: state = NSexp; continue; } break; } break; } switch(state) { /* * result is zero */ case NSstart: case NSsign: case NSzero: case NSzerofract: case NSpoint: kp = k->key + k->klen; k->klen += 2; kp[0] = 0x20; /* between + and - */ kp[1] = 0; return; /* * result has exponent */ case NSexpsign: case NSexp: case NSexpdigit: if(expsign) exp = -exp; dp += exp; /* * result is fixed point number */ case NSdigit: case NSfract: kp -= nzero; cl -= nzero; break; } /* * end of number */ c = 0; if(rflag) c = ~c; *kp = c; /* * sign and exponent */ c = 0x30; if(rflag) { c = 0x10; dp = ~dp; } kp = k->key + k->klen; kp[0] = c; kp[1] = (dp >> 8); kp[2] = dp; k->klen = cl+1; } void dokey_m(Key *k, uchar *lp, uchar *lpe, Field *f) { uchar *kp; Rune r, place[3]; int c, cl, pc; int rflag; rflag = f->flags&Rflag; pc = 0; cl = k->klen; kp = k->key + cl; for(;;) { /* * get the character */ if(lp >= lpe) break; c = *lp; if(c >= Runeself) { lp += chartorune(&r, (char*)lp); c = r; } else lp++; if(c < nelem(f->mapto)) { c = f->mapto[c]; if(c == 0) continue; } place[pc++] = c; if(pc < 3) continue; for(c=11; c>=0; c--) if(memcmp(month[c], place, sizeof(place)) == 0) break; c += 10; if(rflag) c = ~c; *kp++ = c; cl++; break; } c = 0; if(rflag) c = ~c; *kp = c; k->klen = cl+1; } void dokey_dfi(Key *k, uchar *lp, uchar *lpe, Field *f) { uchar *kp; Rune r; int c, cl, n, rflag; cl = k->klen; kp = k->key + cl; rflag = f->flags & Rflag; for(;;) { /* * get the character */ if(lp >= lpe) break; c = *lp; if(c >= Runeself) { lp += chartorune(&r, (char*)lp); c = r; } else lp++; /* * do the various mappings. * the common case is handled * completely by the table. */ if(c != 0 && c < Runeself) { c = f->mapto[c]; if(c) { *kp++ = c; cl++; } continue; } /* * for characters out of range, * the table does not do Rflag. * ignore is based on mapto[255] */ if(c != 0 && c < nelem(f->mapto)) { c = f->mapto[c]; if(c == 0) continue; } else if(f->mapto[nelem(f->mapto)-1] == 0) continue; /* * put it in the key */ r = c; n = runetochar((char*)kp, &r); kp += n; cl += n; if(rflag) while(n > 0) { kp[-n] = ~kp[-n]; n--; } } /* * end of key */ k->klen = cl+1; if(rflag) { *kp = ~0; return; } *kp = 0; } void dokey_r(Key *k, uchar *lp, uchar *lpe, Field *f) { int cl, n; uchar *kp; USED(f); n = lpe - lp; if(n < 0) n = 0; cl = k->klen; kp = k->key + cl; k->klen = cl+n+1; lpe -= 3; while(lp < lpe) { kp[0] = ~lp[0]; kp[1] = ~lp[1]; kp[2] = ~lp[2]; kp[3] = ~lp[3]; kp += 4; lp += 4; } lpe += 3; while(lp < lpe) *kp++ = ~*lp++; *kp = ~0; } void dokey_(Key *k, uchar *lp, uchar *lpe, Field *f) { int n, cl; uchar *kp; USED(f); n = lpe - lp; if(n < 0) n = 0; cl = k->klen; kp = k->key + cl; k->klen = cl+n+1; memmove(kp, lp, n); kp[n] = 0; } void buildkey(Line *l) { Key *k; uchar *lp, *lpe; int ll, kl, cl, i, n; Field *f; ll = l->llen - 1; kl = 0; /* allocated length */ cl = 0; /* current length */ k = 0; for(i=1; i<=args.nfield; i++) { f = &args.field[i]; lp = skip(l->line, f->beg1, f->beg2, f->flags&B1flag, 0); if(lp == 0) lp = l->line + ll; lpe = skip(l->line, f->end1, f->end2, f->flags&Bflag, 1); if(lpe == 0) lpe = l->line + ll; n = (lpe - lp) + 1; if(n <= 0) n = 1; if(cl+(n+4) > kl) { kl = cl+(n+4); k = realloc(k, sizeof(Key) + (kl-1)*sizeof(k->key[0])); if(k == 0) nomem(); } k->klen = cl; (*f->dokey)(k, lp, lpe, f); cl = k->klen; } /* * global comparisons */ if(!(args.uflag && cl > 0)) { f = &args.field[0]; if(cl+(ll+4) > kl) { kl = cl+(ll+4); k = realloc(k, sizeof(Key) + (kl-1)*sizeof(k->key[0])); if(k == 0) nomem(); } k->klen = cl; (*f->dokey)(k, l->line, l->line+ll, f); cl = k->klen; } l->key = k; k->klen = cl; if(args.vflag) { write(2, l->line, l->llen); for(i=0; iklen; i++) { fprint(2, " %.2x", k->key[i]); if(k->key[i] == 0x00 || k->key[i] == 0xff) fprint(2, "\n"); } } } void makemapm(Field *f) { int i, c; for(i=0; imapto); i++) { c = 1; if(i == ' ' || i == '\t') c = 0; if(i >= 'a' && i <= 'z') c = i + ('A' - 'a'); if(i >= 'A' && i <= 'Z') c = i; f->mapto[i] = c; if(args.vflag) { if((i & 15) == 0) fprint(2, " "); fprint(2, " %.2x", c); if((i & 15) == 15) fprint(2, "\n"); } } } void makemapd(Field *f) { int i, j, c; for(i=0; imapto); i++) { c = i; if(f->flags & Iflag) if(c < 040 || c > 0176) c = -1; if((f->flags & Wflag) && c >= 0) if(c == ' ' || c == '\t') c = -1; if((f->flags & Dflag) && c >= 0) if(!(c == ' ' || c == '\t' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) { for(j=0; latinmap[j]; j+=3) if(c == latinmap[j+0] || c == latinmap[j+1]) break; if(latinmap[j] == 0) c = -1; } if((f->flags & Fflag) && c >= 0) { if(c >= 'a' && c <= 'z') c += 'A' - 'a'; for(j=0; latinmap[j]; j+=3) if(c == latinmap[j+0] || c == latinmap[j+1]) { c = latinmap[j+2]; break; } } if((f->flags & Rflag) && c >= 0 && i > 0 && i < Runeself) c = ~c & 0xff; if(c < 0) c = 0; f->mapto[i] = c; if(args.vflag) { if((i & 15) == 0) fprint(2, " "); fprint(2, " %.2x", c); if((i & 15) == 15) fprint(2, "\n"); } } } int latinmap[] = { /* lcase ucase fold */ 0xe0, 0xc0, 0x41, /* L'à', L'À', L'A', */ 0xe1, 0xc1, 0x41, /* L'á', L'Á', L'A', */ 0xe2, 0xc2, 0x41, /* L'â', L'Â', L'A', */ 0xe4, 0xc4, 0x41, /* L'ä', L'Ä', L'A', */ 0xe3, 0xc3, 0x41, /* L'ã', L'Ã', L'A', */ 0xe5, 0xc5, 0x41, /* L'å', L'Å', L'A', */ 0xe8, 0xc8, 0x45, /* L'è', L'È', L'E', */ 0xe9, 0xc9, 0x45, /* L'é', L'É', L'E', */ 0xea, 0xca, 0x45, /* L'ê', L'Ê', L'E', */ 0xeb, 0xcb, 0x45, /* L'ë', L'Ë', L'E', */ 0xec, 0xcc, 0x49, /* L'ì', L'Ì', L'I', */ 0xed, 0xcd, 0x49, /* L'í', L'Í', L'I', */ 0xee, 0xce, 0x49, /* L'î', L'Î', L'I', */ 0xef, 0xcf, 0x49, /* L'ï', L'Ï', L'I', */ 0xf2, 0xd2, 0x4f, /* L'ò', L'Ò', L'O', */ 0xf3, 0xd3, 0x4f, /* L'ó', L'Ó', L'O', */ 0xf4, 0xd4, 0x4f, /* L'ô', L'Ô', L'O', */ 0xf6, 0xd6, 0x4f, /* L'ö', L'Ö', L'O', */ 0xf5, 0xd5, 0x4f, /* L'õ', L'Õ', L'O', */ 0xf8, 0xd8, 0x4f, /* L'ø', L'Ø', L'O', */ 0xf9, 0xd9, 0x55, /* L'ù', L'Ù', L'U', */ 0xfa, 0xda, 0x55, /* L'ú', L'Ú', L'U', */ 0xfb, 0xdb, 0x55, /* L'û', L'Û', L'U', */ 0xfc, 0xdc, 0x55, /* L'ü', L'Ü', L'U', */ 0xe6, 0xc6, 0x41, /* L'æ', L'Æ', L'A', */ 0xf0, 0xd0, 0x44, /* L'ð', L'Ð', L'D', */ 0xf1, 0xd1, 0x4e, /* L'ñ', L'Ñ', L'N', */ 0xfd, 0xdd, 0x59, /* L'ý', L'Ý', L'Y', */ 0xe7, 0xc7, 0x43, /* L'ç', L'Ç', L'C', */ 0, }; Rune LJAN[] = { 'J', 'A', 'N', 0 }; Rune LFEB[] = { 'F', 'E', 'B', 0 }; Rune LMAR[] = { 'M', 'A', 'R', 0 }; Rune LAPR[] = { 'A', 'P', 'R', 0 }; Rune LMAY[] = { 'M', 'A', 'Y', 0 }; Rune LJUN[] = { 'J', 'U', 'N', 0 }; Rune LJUL[] = { 'J', 'U', 'L', 0 }; Rune LAUG[] = { 'A', 'U', 'G', 0 }; Rune LSEP[] = { 'S', 'E', 'P', 0 }; Rune LOCT[] = { 'O', 'C', 'T', 0 }; Rune LNOV[] = { 'N', 'O', 'V', 0 }; Rune LDEC[] = { 'D', 'E', 'C', 0 }; Rune* month[12] = { LJAN, LFEB, LMAR, LAPR, LMAY, LJUN, LJUL, LAUG, LSEP, LOCT, LNOV, LDEC, }; /************** radix sort ***********/ enum { Threshold = 14 }; void rsort4(Key***, ulong, int); void bsort4(Key***, ulong, int); void sort4(void *a, ulong n) { if(n > Threshold) rsort4((Key***)a, n, 0); else bsort4((Key***)a, n, 0); } void rsort4(Key ***a, ulong n, int b) { Key ***ea, ***t, ***u, **t1, **u1, *k; Key ***part[257]; static long count[257]; long clist[257+257], *cp, *cp1; int c, lowc, higc; /* * pass 1 over all keys, * count the number of each key[b]. * find low count and high count. */ lowc = 256; higc = 0; ea = a+n; for(t=a; tklen; if(b >= n) { count[256]++; continue; } c = k->key[b]; n = count[c]++; if(n == 0) { if(c < lowc) lowc = c; if(c > higc) higc = c; } } /* * pass 2 over all counts, * put partition pointers in part[c]. * save compacted indexes and counts * in clist[]. */ t = a; n = count[256]; clist[0] = n; part[256] = t; t += n; cp1 = clist+1; cp = count+lowc; for(c=lowc; c<=higc; c++,cp++) { n = *cp; if(n) { cp1[0] = n; cp1[1] = c; cp1 += 2; part[c] = t; t += n; } } *cp1 = 0; /* * pass 3 over all counts. * chase lowest pointer in each partition * around a permutation until it comes * back and is stored where it started. * static array, count[], should be * reduced to zero entries except maybe * count[256]. */ for(cp1=clist+1; cp1[0]; cp1+=2) { c = cp1[1]; cp = count+c; while(*cp) { t1 = *part[c]; for(;;) { k = *t1; n = 256; if(b < k->klen) n = k->key[b]; u = part[n]++; count[n]--; u1 = *u; *u = t1; if(n == c) break; t1 = u1; } } } /* * pass 4 over all partitions. * call recursively. */ b++; t = a + clist[0]; count[256] = 0; for(cp1=clist+1; n=cp1[0]; cp1+=2) { if(n > Threshold) rsort4(t, n, b); else if(n > 1) bsort4(t, n, b); t += n; } } /* * bubble sort to pick up * the pieces. */ void bsort4(Key ***a, ulong n, int b) { Key ***i, ***j, ***k, ***l, **t; Key *ka, *kb; int n1, n2; l = a+n; j = a; loop: i = j; j++; if(j >= l) return; ka = **i; kb = **j; n1 = ka->klen - b; n2 = kb->klen - b; if(n1 > n2) n1 = n2; if(n1 <= 0) goto loop; n2 = ka->key[b] - kb->key[b]; if(n2 == 0) n2 = memcmp(ka->key+b, kb->key+b, n1); if(n2 <= 0) goto loop; for(;;) { k = i+1; t = *k; *k = *i; *i = t; if(i <= a) goto loop; i--; ka = **i; kb = *t; n1 = ka->klen - b; n2 = kb->klen - b; if(n1 > n2) n1 = n2; if(n1 <= 0) goto loop; n2 = ka->key[b] - kb->key[b]; if(n2 == 0) n2 = memcmp(ka->key+b, kb->key+b, n1); if(n2 <= 0) goto loop; } }
\ \ \ \ \
\ \ \ \ \
.. .de B2 .html box1 .html box0
\ \ \
\ \ \ \ \