1.1new file mode 100755 1.2--- /dev/null 1.3+++ b/sys/lib/acid/386 1.4@@ -0,0 +1,163 @@ 1.5+// 386 support 1.6+ 1.7+defn acidinit() // Called after all the init modules are loaded 1.8+{ 1.9+ bplist = {}; 1.10+ bpfmt = 'b'; 1.11+ 1.12+ srcpath = { 1.13+ "./", 1.14+ "/sys/src/libc/port/", 1.15+ "/sys/src/libc/9sys/", 1.16+ "/sys/src/libc/386/" 1.17+ }; 1.18+ 1.19+ srcfiles = {}; // list of loaded files 1.20+ srctext = {}; // the text of the files 1.21+} 1.22+ 1.23+defn linkreg(addr) 1.24+{ 1.25+ return 0; 1.26+} 1.27+ 1.28+defn stk() // trace 1.29+{ 1.30+ _stk(*PC, *SP, 0, 0); 1.31+} 1.32+ 1.33+defn lstk() // trace with locals 1.34+{ 1.35+ _stk(*PC, *SP, 0, 1); 1.36+} 1.37+ 1.38+defn gpr() // print general(hah hah!) purpose registers 1.39+{ 1.40+ print("AX\t", *AX, " BX\t", *BX, " CX\t", *CX, " DX\t", *DX, "\n"); 1.41+ print("DI\t", *DI, " SI\t", *SI, " BP\t", *BP, "\n"); 1.42+} 1.43+ 1.44+defn spr() // print special processor registers 1.45+{ 1.46+ local pc; 1.47+ local cause; 1.48+ 1.49+ pc = *PC; 1.50+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 1.51+ pfl(pc); 1.52+ print("SP\t", *SP, " ECODE ", *ECODE, " EFLAG ", *EFLAGS, "\n"); 1.53+ print("CS\t", *CS, " DS\t ", *DS, " SS\t", *SS, "\n"); 1.54+ print("GS\t", *GS, " FS\t ", *FS, " ES\t", *ES, "\n"); 1.55+ 1.56+ cause = *TRAP; 1.57+ print("TRAP\t", cause, " ", reason(cause), "\n"); 1.58+} 1.59+ 1.60+defn regs() // print all registers 1.61+{ 1.62+ spr(); 1.63+ gpr(); 1.64+} 1.65+ 1.66+defn fpr() 1.67+{ 1.68+ print("F0\t", *F0, "\n"); 1.69+ print("F1\t", *F1, "\n"); 1.70+ print("F2\t", *F2, "\n"); 1.71+ print("F3\t", *F3, "\n"); 1.72+ print("F4\t", *F4, "\n"); 1.73+ print("F5\t", *F5, "\n"); 1.74+ print("F6\t", *F6, "\n"); 1.75+ print("F7\t", *F7, "\n"); 1.76+ print("control\t", *fmt(E0, 'x'), "\n"); 1.77+ print("status\t", *fmt(E1, 'x'), "\n"); 1.78+ print("tag\t", *fmt(E2, 'x'), "\n"); 1.79+ print("ip offset\t", *fmt(E3, 'X'), "\n"); 1.80+ print("cs selector\t", *fmt(E4, 'x'), "\n"); 1.81+ print("opcode\t", *fmt(E4>>8, 'x'), "\n"); 1.82+ print("data operand offset\t", *fmt(E5, 'x'), "\n"); 1.83+ print("operand selector\t", *fmt(E6, 'x'), "\n"); 1.84+} 1.85+ 1.86+defn mmregs() 1.87+{ 1.88+ print("MM0\t", *MM0, " MM1\t", *MM1, "\n"); 1.89+ print("MM2\t", *MM2, " MM3\t", *MM3, "\n"); 1.90+ print("MM4\t", *MM4, " MM5\t", *MM5, "\n"); 1.91+ print("MM6\t", *MM6, " MM7\t", *MM7, "\n"); 1.92+} 1.93+ 1.94+defn pstop(pid) 1.95+{ 1.96+ local l; 1.97+ local pc; 1.98+ 1.99+ pc = *PC; 1.100+ 1.101+ print(pid,": ", reason(*TRAP), "\t"); 1.102+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 1.103+ 1.104+ if notes then { 1.105+ if notes[0] != "sys: breakpoint" then { 1.106+ print("Notes pending:\n"); 1.107+ l = notes; 1.108+ while l do { 1.109+ print("\t", head l, "\n"); 1.110+ l = tail l; 1.111+ } 1.112+ } 1.113+ } 1.114+} 1.115+ 1.116+aggr Ureg 1.117+{ 1.118+ 'X' 0 di; 1.119+ 'X' 4 si; 1.120+ 'X' 8 bp; 1.121+ 'X' 12 nsp; 1.122+ 'X' 16 bx; 1.123+ 'X' 20 dx; 1.124+ 'X' 24 cx; 1.125+ 'X' 28 ax; 1.126+ 'X' 32 gs; 1.127+ 'X' 36 fs; 1.128+ 'X' 40 es; 1.129+ 'X' 44 ds; 1.130+ 'X' 48 trap; 1.131+ 'X' 52 ecode; 1.132+ 'X' 56 pc; 1.133+ 'X' 60 cs; 1.134+ 'X' 64 flags; 1.135+ { 1.136+ 'X' 68 usp; 1.137+ 'X' 68 sp; 1.138+ }; 1.139+ 'X' 72 ss; 1.140+}; 1.141+ 1.142+defn 1.143+Ureg(addr) { 1.144+ complex Ureg addr; 1.145+ print(" di ", addr.di, "\n"); 1.146+ print(" si ", addr.si, "\n"); 1.147+ print(" bp ", addr.bp, "\n"); 1.148+ print(" nsp ", addr.nsp, "\n"); 1.149+ print(" bx ", addr.bx, "\n"); 1.150+ print(" dx ", addr.dx, "\n"); 1.151+ print(" cx ", addr.cx, "\n"); 1.152+ print(" ax ", addr.ax, "\n"); 1.153+ print(" gs ", addr.gs, "\n"); 1.154+ print(" fs ", addr.fs, "\n"); 1.155+ print(" es ", addr.es, "\n"); 1.156+ print(" ds ", addr.ds, "\n"); 1.157+ print(" trap ", addr.trap, "\n"); 1.158+ print(" ecode ", addr.ecode, "\n"); 1.159+ print(" pc ", addr.pc, "\n"); 1.160+ print(" cs ", addr.cs, "\n"); 1.161+ print(" flags ", addr.flags, "\n"); 1.162+ print(" sp ", addr.sp, "\n"); 1.163+ print(" ss ", addr.ss, "\n"); 1.164+}; 1.165+sizeofUreg = 76; 1.166+ 1.167+print("/sys/lib/acid/386");
2.1new file mode 100755 2.2--- /dev/null 2.3+++ b/sys/lib/acid/68020 2.4@@ -0,0 +1,137 @@ 2.5+// 68020 support 2.6+ 2.7+defn acidinit() // Called after all the init modules are loaded 2.8+{ 2.9+ bplist = {}; 2.10+ bpfmt = 'x'; 2.11+ 2.12+ srcpath = { 2.13+ "./", 2.14+ "/sys/src/libc/port/", 2.15+ "/sys/src/libc/9sys/", 2.16+ "/sys/src/libc/68020/" 2.17+ }; 2.18+ 2.19+ srcfiles = {}; // list of loaded files 2.20+ srctext = {}; // the text of the files 2.21+} 2.22+ 2.23+defn linkreg(addr) 2.24+{ 2.25+ return 0; 2.26+} 2.27+ 2.28+defn stk() // trace 2.29+{ 2.30+ _stk(*PC, *A7, 0, 0); 2.31+} 2.32+ 2.33+defn lstk() // trace with locals 2.34+{ 2.35+ _stk(*PC, *A7, 0, 1); 2.36+} 2.37+ 2.38+defn gpr() // print general purpose registers 2.39+{ 2.40+ print("R0\t", *R0, "R1\t", *R1, "R2\t", *R2, "R3\t", *R3, "\n"); 2.41+ print("R4\t", *R4, "R5\t", *R5, "R6\t", *R6, "R7\t", *R7, "\n"); 2.42+ print("A0\t", *A0, "A1\t", *A1, "A2\t", *A2, "A3\t", *A3, "\n"); 2.43+ print("A4\t", *A4, "A5\t", *A5, "A6\t", *A6, "A7\t", *A7, "\n"); 2.44+} 2.45+ 2.46+defn spr() // print special processor registers 2.47+{ 2.48+ local pc; 2.49+ local cause; 2.50+ 2.51+ pc = *PC; 2.52+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 2.53+ pfl(pc); 2.54+ print("SP\t", *A7, " MAGIC\t", *MAGIC, "\n"); 2.55+ 2.56+ cause = *VO; 2.57+ print("SR\t", *SR, "VO ", cause, " ", reason(cause), "\n"); 2.58+} 2.59+ 2.60+defn regs() // print all registers 2.61+{ 2.62+ spr(); 2.63+ gpr(); 2.64+} 2.65+ 2.66+defn pstop(pid) 2.67+{ 2.68+ local l; 2.69+ local pc; 2.70+ 2.71+ pc = *PC; 2.72+ 2.73+ print(pid,": ", reason(*VO), "\t"); 2.74+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 2.75+ 2.76+ if notes then { 2.77+ if notes[0] != "sys: breakpoint" then { 2.78+ print("Notes pending:\n"); 2.79+ l = notes; 2.80+ while l do { 2.81+ print("\t", head l, "\n"); 2.82+ l = tail l; 2.83+ } 2.84+ } 2.85+ } 2.86+} 2.87+ 2.88+aggr Ureg 2.89+{ 2.90+ 'U' 0 r0; 2.91+ 'U' 4 r1; 2.92+ 'U' 8 r2; 2.93+ 'U' 12 r3; 2.94+ 'U' 16 r4; 2.95+ 'U' 20 r5; 2.96+ 'U' 24 r6; 2.97+ 'U' 28 r7; 2.98+ 'U' 32 a0; 2.99+ 'U' 36 a1; 2.100+ 'U' 40 a2; 2.101+ 'U' 44 a3; 2.102+ 'U' 48 a4; 2.103+ 'U' 52 a5; 2.104+ 'U' 56 a6; 2.105+ 'U' 60 sp; 2.106+ 'U' 64 usp; 2.107+ 'U' 68 magic; 2.108+ 'u' 72 sr; 2.109+ 'U' 74 pc; 2.110+ 'u' 78 vo; 2.111+ 'a' 80 microstate; 2.112+}; 2.113+ 2.114+defn 2.115+Ureg(addr) { 2.116+ complex Ureg addr; 2.117+ print(" r0 ", addr.r0, "\n"); 2.118+ print(" r1 ", addr.r1, "\n"); 2.119+ print(" r2 ", addr.r2, "\n"); 2.120+ print(" r3 ", addr.r3, "\n"); 2.121+ print(" r4 ", addr.r4, "\n"); 2.122+ print(" r5 ", addr.r5, "\n"); 2.123+ print(" r6 ", addr.r6, "\n"); 2.124+ print(" r7 ", addr.r7, "\n"); 2.125+ print(" a0 ", addr.a0, "\n"); 2.126+ print(" a1 ", addr.a1, "\n"); 2.127+ print(" a2 ", addr.a2, "\n"); 2.128+ print(" a3 ", addr.a3, "\n"); 2.129+ print(" a4 ", addr.a4, "\n"); 2.130+ print(" a5 ", addr.a5, "\n"); 2.131+ print(" a6 ", addr.a6, "\n"); 2.132+ print(" sp ", addr.sp, "\n"); 2.133+ print(" usp ", addr.usp, "\n"); 2.134+ print(" magic ", addr.magic, "\n"); 2.135+ print(" sr ", addr.sr, "\n"); 2.136+ print(" pc ", addr.pc, "\n"); 2.137+ print(" vo ", addr.vo, "\n"); 2.138+ print(" microstate ", addr.microstate, "\n"); 2.139+}; 2.140+ 2.141+print("/sys/lib/acid/68020");
3.1new file mode 100755 3.2--- /dev/null 3.3+++ b/sys/lib/acid/acme 3.4@@ -0,0 +1,133 @@ 3.5+// support for acme; acid must be run with /acme/acid/$cputype/Acid 3.6+ 3.7+ 3.8+defn w(*code) 3.9+{ 3.10+ local dir; 3.11+ 3.12+ printto("/tmp/acme.acid", eval code); 3.13+ rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'"); 3.14+} 3.15+ 3.16+defn procstk(pid, name) 3.17+{ 3.18+ local dir; 3.19+ 3.20+ printto("/tmp/acme.acid", stk()); 3.21+ rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'"); 3.22+} 3.23+ 3.24+defn taskstk(tid, name) 3.25+{ 3.26+ local dir; 3.27+ 3.28+ printto("/tmp/acme.acid", threadstk(tid)); 3.29+ rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'"); 3.30+} 3.31+ 3.32+defn _stk(pc, sp, link, dolocals) 3.33+{ 3.34+ local stk; 3.35+ 3.36+ print("At pc:", pc, ":", fmt(pc, 'a'), " "); 3.37+ pfl(pc); 3.38+ 3.39+ stk = strace(pc, sp, link); 3.40+ 3.41+ while stk do { 3.42+ frame = head stk; 3.43+ print(fmt(frame[0], 'a'), "("); 3.44+ params(frame[2], frame[0]); 3.45+ print(") "); 3.46+ print("\n\tcalled from ", fmt(frame[1], 'a'), " "); 3.47+ pfl(frame[1]); 3.48+ stk = tail stk; 3.49+ if dolocals then 3.50+ locals(frame[3], frame[0]); 3.51+ } 3.52+} 3.53+ 3.54+//defn _stk(pc, sp, dolocals) 3.55+//{ 3.56+// w(__stk(pc, sp, dolocals)); 3.57+//} 3.58+ 3.59+ 3.60+defn params(param, name) 3.61+{ 3.62+ while param do { 3.63+ sym = head param; 3.64+ print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]); 3.65+ param = tail param; 3.66+ if param then 3.67+ print (","); 3.68+ } 3.69+} 3.70+ 3.71+defn locals(l, name) 3.72+{ 3.73+ local sym; 3.74+ 3.75+ while l do { 3.76+ sym = head l; 3.77+ print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n"); 3.78+ l = tail l; 3.79+ } 3.80+} 3.81+ 3.82+defn bptab() // print a table of breakpoints 3.83+{ 3.84+ local lst, addr; 3.85+ 3.86+ lst = bplist; 3.87+ while lst do { 3.88+ addr = head lst; 3.89+ print("\tbpdel(", fmt(addr, 'a'), ")\n"); 3.90+ lst = tail lst; 3.91+ } 3.92+} 3.93+ 3.94+defn procs() // print status of processes 3.95+{ 3.96+ local c, lst, cpid; 3.97+ 3.98+ cpid = pid; 3.99+ lst = proclist; 3.100+ while lst do { 3.101+ np = head lst; 3.102+ setproc(np); 3.103+ if np == cpid then 3.104+ print(">"); 3.105+ print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n"); 3.106+ lst = tail lst; 3.107+ } 3.108+ pid = cpid; 3.109+ if pid != 0 then 3.110+ setproc(pid); 3.111+} 3.112+ 3.113+defn allstacks() // print stacks of processes and threads 3.114+{ 3.115+ complex Proc P; 3.116+ local T, Tq; 3.117+ local c, lst, cpid; 3.118+ 3.119+ cpid = pid; 3.120+ P = (Proc)pq.$head; 3.121+ while P != 0 do{ 3.122+ Tq = (Tqueue)P.threads; 3.123+ T = (Thread)Tq.$head; 3.124+ setproc(P.pid); 3.125+ while T != 0 do{ 3.126+ if(T.cmdname == 0) then taskstk(T, "unknown"); 3.127+ else taskstk(T, *(T.cmdname\s)); 3.128+ T = T.nextt; 3.129+ } 3.130+ P = P.next; 3.131+ } 3.132+ pid = cpid; 3.133+ if pid != 0 then 3.134+ setproc(pid); 3.135+} 3.136+ 3.137+print("/sys/lib/acid/acme");
4.1new file mode 100755 4.2--- /dev/null 4.3+++ b/sys/lib/acid/alef 4.4@@ -0,0 +1,147 @@ 4.5+// runtime library definitions 4.6+if objtype=="mips2" then objtype="mips"; 4.7+ 4.8+include("/sys/src/alef/lib/"+objtype+"/acid"); 4.9+ 4.10+defn 4.11+pchan(addr) 4.12+{ 4.13+ local l, n; 4.14+ 4.15+ complex Chan addr; 4.16+ 4.17+ if addr.sva then 4.18+ print("Sender waiting: buffer ", addr.sva, "\n"); 4.19+ else 4.20+ print("No sender\n"); 4.21+ 4.22+ if addr.rva then 4.23+ print("Receiver waiting: buffer ", addr.rva, "\n"); 4.24+ else 4.25+ print("No receiver\n"); 4.26+ 4.27+ if addr.async then { 4.28+ n = 0; 4.29+ l = addr.qh; 4.30+ while l do { 4.31+ n = n+1; 4.32+ l = l.next; 4.33+ } 4.34+ print("Async channel\n\t", n\D, " messsages queued\n\t"); 4.35+ l = addr.free; 4.36+ while l do { 4.37+ n = n+1; 4.38+ l = l.next; 4.39+ } 4.40+ print(n\D, " free buffers\n"); 4.41+ } 4.42+ 4.43+ if addr.selt then { 4.44+ l = "send"; 4.45+ if addr.selt then 4.46+ l = "receive"; 4.47+ print("In select ", l, ": task ", addr.selt\X, "\n"); 4.48+ labstk(addr.selt); 4.49+ } 4.50+} 4.51+ 4.52+defn 4.53+tdb() 4.54+{ 4.55+ local ta, tq; 4.56+ 4.57+ // Private proc tdb pointer 4.58+ ta = *{ 0x7fffe000, 4.59+ 0x0ffdf000, 4.60+ 0xbfff5000 }[match(objtype, {"mips", "sparc", "386"})]; 4.61+ 4.62+ complex Tdb ta; 4.63+ 4.64+ print("tdb ", ta.ntask, " tasks:"); 4.65+ if *ta then 4.66+ print("locked\n"); 4.67+ else 4.68+ print("unlocked\n"); 4.69+ 4.70+ if ta.ctask then { 4.71+ print("current task ", ta.ctask, "\n"); 4.72+ Task(ta.ctask); 4.73+ } 4.74+ else 4.75+ print("proc is idle\n"); 4.76+ 4.77+ tq = (Task)ta.runhd; 4.78+ if tq == 0 then 4.79+ return {}; 4.80+ 4.81+ print("Tasks ready to run:\n"); 4.82+ while tq != 0 do { 4.83+ print("Task(", tq, ")\n"); 4.84+ tq = tq.link; 4.85+ } 4.86+} 4.87+ 4.88+defn 4.89+lselect(addr) 4.90+{ 4.91+ local c; 4.92+ 4.93+ complex Task addr; 4.94+ complex Chan c; 4.95+ 4.96+ c = addr.slist; 4.97+ if c == 0 then { 4.98+ print("No select pending\n"); 4.99+ return {}; 4.100+ } 4.101+ while c do { 4.102+ print("pchan(", c\X, ")\n"); 4.103+ c = c.sellink; 4.104+ } 4.105+} 4.106+ 4.107+defn 4.108+pqlock(addr) 4.109+{ 4.110+ local t; 4.111+ 4.112+ complex QLock addr; 4.113+ 4.114+ if *addr then 4.115+ print("QLock is under modification\n"); 4.116+ if addr.used == 0 then 4.117+ return {}; 4.118+ 4.119+ print("QLock is held\n"); 4.120+ t = addr.queue; 4.121+ complex Task t; 4.122+ if t == 0 then { 4.123+ print("No tasks waiting\n"); 4.124+ return {}; 4.125+ } 4.126+ print("Tasks waiting:\n"); 4.127+ while t do { 4.128+ print("Task(", t, ")\n"); 4.129+ tq = tq.qlink; 4.130+ } 4.131+} 4.132+ 4.133+srcpath = { 4.134+ "./", 4.135+ "/sys/src/alef/lib/port/", 4.136+ "/sys/src/alef/lib/p9/", 4.137+ "/sys/src/alef/lib/"+objtype+"/" 4.138+}; 4.139+ 4.140+defn labstk(l) 4.141+{ 4.142+ if objtype == "386" then 4.143+ _stk(ALEF_switch, *l, linkreg(0), 0); 4.144+ else 4.145+ _stk(*(l+4), *l, linkreg(0), 0); 4.146+} 4.147+ 4.148+print("/sys/lib/acid/alef"); 4.149+ 4.150+include("/sys/src/alef/lib/port/acid."+objtype); 4.151+include("/sys/src/alef/lib/p9/acid."+objtype);
5.1new file mode 100755 5.2--- /dev/null 5.3+++ b/sys/lib/acid/alpha 5.4@@ -0,0 +1,205 @@ 5.5+// Alpha support 5.6+ 5.7+defn acidinit() // Called after all the init modules are loaded 5.8+{ 5.9+ bplist = {}; 5.10+ bpfmt = 'X'; 5.11+ 5.12+ srcpath = { 5.13+ "./", 5.14+ "/sys/src/libc/port/", 5.15+ "/sys/src/libc/9sys/", 5.16+ "/sys/src/libc/alpha/" 5.17+ }; 5.18+ 5.19+ srcfiles = {}; // list of loaded files 5.20+ srctext = {}; // the text of the files 5.21+} 5.22+ 5.23+defn stk() // trace 5.24+{ 5.25+ _stk(*PC, *SP, linkreg(0), 0); 5.26+} 5.27+ 5.28+defn lstk() // trace with locals 5.29+{ 5.30+ _stk(*PC, *SP, linkreg(0), 1); 5.31+} 5.32+ 5.33+defn gpr() // print general purpose registers 5.34+{ 5.35+ print("R0\t", *R0, "\n"); 5.36+ print("R1\t", *R1, " R2\t", *R2, " R3\t", *R3, "\n"); 5.37+ print("R4\t", *R4, " R5\t", *R5, " R6\t", *R6, "\n"); 5.38+ print("R7\t", *R7, " R8\t", *R8, " R9\t", *R9, "\n"); 5.39+ print("R10\t", *R10, " R11\t", *R11, " R12\t", *R12, "\n"); 5.40+ print("R13\t", *R13, " R14\t", *R14, " R15\t", *R15, "\n"); 5.41+ print("R16\t", *R16, " R17\t", *R17, " R18\t", *R18, "\n"); 5.42+ print("R19\t", *R19, " R20\t", *R20, " R21\t", *R21, "\n"); 5.43+ print("R22\t", *R22, " R23\t", *R23, " R24\t", *R24, "\n"); 5.44+ print("R25\t", *R25, " R26\t", *R26, " R27\t", *R27, "\n"); 5.45+ print("R28\t", *R28, " R29\t", *R29, " R30\t", *SP\Y, "\n"); 5.46+} 5.47+ 5.48+defn fpr() 5.49+{ 5.50+ print("F0\t", *fmt(F0, 'G'), "\tF1\t", *fmt(F1, 'G'), "\n"); 5.51+ print("F2\t", *fmt(F2, 'G'), "\tF3\t", *fmt(F3, 'G'), "\n"); 5.52+ print("F4\t", *fmt(F4, 'G'), "\tF5\t", *fmt(F5, 'G'), "\n"); 5.53+ print("F6\t", *fmt(F6, 'G'), "\tF7\t", *fmt(F7, 'G'), "\n"); 5.54+ print("F8\t", *fmt(F8, 'G'), "\tF9\t", *fmt(F9, 'G'), "\n"); 5.55+ print("F10\t", *fmt(F10, 'G'), "\tF11\t", *fmt(F11, 'G'), "\n"); 5.56+ print("F12\t", *fmt(F12, 'G'), "\tF13\t", *fmt(F13, 'G'), "\n"); 5.57+ print("F14\t", *fmt(F14, 'G'), "\tF15\t", *fmt(F15, 'G'), "\n"); 5.58+ print("F16\t", *fmt(F16, 'G'), "\tF17\t", *fmt(F17, 'G'), "\n"); 5.59+ print("F18\t", *fmt(F18, 'G'), "\tF19\t", *fmt(F19, 'G'), "\n"); 5.60+ print("F20\t", *fmt(F20, 'G'), "\tF21\t", *fmt(F21, 'G'), "\n"); 5.61+ print("F22\t", *fmt(F22, 'G'), "\tF23\t", *fmt(F23, 'G'), "\n"); 5.62+ print("F24\t", *fmt(F24, 'G'), "\tF25\t", *fmt(F25, 'G'), "\n"); 5.63+ print("F26\t", *fmt(F26, 'G'), "\tF27\t", *fmt(F27, 'G'), "\n"); 5.64+ print("F28\t", *fmt(F28, 'G'), "\tF29\t", *fmt(F29, 'G'), "\n"); 5.65+ print("F30\t", *fmt(F30, 'G'), "\tF31\t", *fmt(F31, 'G'), "\n"); 5.66+} 5.67+ 5.68+defn spr() // print special processor registers 5.69+{ 5.70+ local pc, link, cause; 5.71+ 5.72+ pc = *PC; 5.73+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 5.74+ pfl(pc); 5.75+ 5.76+ link = *R26; 5.77+ print("SP\t", *SP, "\tLINK\t", link, " ", fmt(link, 'a'), " "); 5.78+ pfl(link); 5.79+ 5.80+ cause = *TYPE; 5.81+ print("STATUS\t", *STATUS, "\tTYPE\t", cause, " ", reason(cause), "\n"); 5.82+ print("A0\t", *A0, " A1\t", *A1, " A2\t", *A2, "\n"); 5.83+} 5.84+ 5.85+defn regs() // print all registers 5.86+{ 5.87+ spr(); 5.88+ gpr(); 5.89+} 5.90+ 5.91+defn pstop(pid) 5.92+{ 5.93+ local l, pc; 5.94+ 5.95+ pc = *PC; 5.96+ 5.97+ print(pid,": ", reason(*TYPE), "\t"); 5.98+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 5.99+ 5.100+ if notes then { 5.101+ if notes[0] != "sys: breakpoint" then { 5.102+ print("Notes pending:\n"); 5.103+ l = notes; 5.104+ while l do { 5.105+ print("\t", head l, "\n"); 5.106+ l = tail l; 5.107+ } 5.108+ } 5.109+ } 5.110+} 5.111+ 5.112+sizeofUreg = 296; 5.113+aggr Ureg 5.114+{ 5.115+ 'W' 0 type; 5.116+ 'W' 8 a0; 5.117+ 'W' 16 a1; 5.118+ 'W' 24 a2; 5.119+ 'W' 32 r0; 5.120+ 'W' 40 r1; 5.121+ 'W' 48 r2; 5.122+ 'W' 56 r3; 5.123+ 'W' 64 r4; 5.124+ 'W' 72 r5; 5.125+ 'W' 80 r6; 5.126+ 'W' 88 r7; 5.127+ 'W' 96 r8; 5.128+ 'W' 104 r9; 5.129+ 'W' 112 r10; 5.130+ 'W' 120 r11; 5.131+ 'W' 128 r12; 5.132+ 'W' 136 r13; 5.133+ 'W' 144 r14; 5.134+ 'W' 152 r15; 5.135+ 'W' 160 r19; 5.136+ 'W' 168 r20; 5.137+ 'W' 176 r21; 5.138+ 'W' 184 r22; 5.139+ 'W' 192 r23; 5.140+ 'W' 200 r24; 5.141+ 'W' 208 r25; 5.142+ 'W' 216 r26; 5.143+ 'W' 224 r27; 5.144+ 'W' 232 r28; 5.145+ { 5.146+ 'W' 240 r30; 5.147+ 'W' 240 usp; 5.148+ 'W' 240 sp; 5.149+ }; 5.150+ 'W' 248 status; 5.151+ 'W' 256 pc; 5.152+ 'W' 264 r29; 5.153+ 'W' 272 r16; 5.154+ 'W' 280 r17; 5.155+ 'W' 288 r18; 5.156+}; 5.157+ 5.158+defn 5.159+Ureg(addr) { 5.160+ complex Ureg addr; 5.161+ print(" type ", addr.type, "\n"); 5.162+ print(" a0 ", addr.a0, "\n"); 5.163+ print(" a1 ", addr.a1, "\n"); 5.164+ print(" a2 ", addr.a2, "\n"); 5.165+ print(" r0 ", addr.r0, "\n"); 5.166+ print(" r1 ", addr.r1, "\n"); 5.167+ print(" r2 ", addr.r2, "\n"); 5.168+ print(" r3 ", addr.r3, "\n"); 5.169+ print(" r4 ", addr.r4, "\n"); 5.170+ print(" r5 ", addr.r5, "\n"); 5.171+ print(" r6 ", addr.r6, "\n"); 5.172+ print(" r7 ", addr.r7, "\n"); 5.173+ print(" r8 ", addr.r8, "\n"); 5.174+ print(" r9 ", addr.r9, "\n"); 5.175+ print(" r10 ", addr.r10, "\n"); 5.176+ print(" r11 ", addr.r11, "\n"); 5.177+ print(" r12 ", addr.r12, "\n"); 5.178+ print(" r13 ", addr.r13, "\n"); 5.179+ print(" r14 ", addr.r14, "\n"); 5.180+ print(" r15 ", addr.r15, "\n"); 5.181+ print(" r19 ", addr.r19, "\n"); 5.182+ print(" r20 ", addr.r20, "\n"); 5.183+ print(" r21 ", addr.r21, "\n"); 5.184+ print(" r22 ", addr.r22, "\n"); 5.185+ print(" r23 ", addr.r23, "\n"); 5.186+ print(" r24 ", addr.r24, "\n"); 5.187+ print(" r25 ", addr.r25, "\n"); 5.188+ print(" r26 ", addr.r26, "\n"); 5.189+ print(" r27 ", addr.r27, "\n"); 5.190+ print(" r28 ", addr.r28, "\n"); 5.191+ print("_12_ {\n"); 5.192+ _12_(addr+240); 5.193+ print("}\n"); 5.194+ print(" status ", addr.status, "\n"); 5.195+ print(" pc ", addr.pc, "\n"); 5.196+ print(" r29 ", addr.r29, "\n"); 5.197+ print(" r16 ", addr.r16, "\n"); 5.198+ print(" r17 ", addr.r17, "\n"); 5.199+ print(" r18 ", addr.r18, "\n"); 5.200+}; 5.201+ 5.202+defn linkreg(addr) 5.203+{ 5.204+ complex Ureg addr; 5.205+ return addr.r26\X; 5.206+} 5.207+ 5.208+print("/sys/lib/acid/alpha"); 5.209+
6.1new file mode 100755 6.2--- /dev/null 6.3+++ b/sys/lib/acid/arm 6.4@@ -0,0 +1,116 @@ 6.5+// ARM support 6.6+ 6.7+defn acidinit() // Called after all the init modules are loaded 6.8+{ 6.9+ bplist = {}; 6.10+ bpfmt = 'X'; 6.11+ 6.12+ srcpath = { 6.13+ "./", 6.14+ "/sys/src/libc/port/", 6.15+ "/sys/src/libc/9sys/", 6.16+ "/sys/src/libc/arm/" 6.17+ }; 6.18+ 6.19+ srcfiles = {}; // list of loaded files 6.20+ srctext = {}; // the text of the files 6.21+} 6.22+ 6.23+defn linkreg(addr) 6.24+{ 6.25+ return *R14; 6.26+} 6.27+ 6.28+defn stk() // trace 6.29+{ 6.30+ _stk(*PC, *SP, linkreg(0), 0); 6.31+} 6.32+ 6.33+defn lstk() // trace with locals 6.34+{ 6.35+ _stk(*PC, *SP, linkreg(0), 1); 6.36+} 6.37+ 6.38+defn gpr() // print general purpose registers 6.39+{ 6.40+ print("R0\t", *R0, " R1\t", *R1, " R2\t", *R2, "\n"); 6.41+ print("R3\t", *R3, " R4\t", *R4, " R5\t", *R5, "\n"); 6.42+ print("R6\t", *R6, " R7\t", *R7, " R8\t", *R8, "\n"); 6.43+ print("R9\t", *R9, " R10\t", *R10, " R11\t", *R11, "\n"); 6.44+ print("R12\t", *R12, " R13\t", *R13, " R14\t", *R14, "\n"); 6.45+ print("R15\t", *R15, "\n"); 6.46+} 6.47+ 6.48+defn regs() // print all registers 6.49+{ 6.50+ gpr(); 6.51+} 6.52+ 6.53+defn pstop(pid) 6.54+{ 6.55+ local l; 6.56+ local pc; 6.57+ 6.58+ pc = *PC; 6.59+ 6.60+ print(pid,": ", reason(*TYPE), "\t"); 6.61+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 6.62+ 6.63+ if notes then { 6.64+ if notes[0] != "sys: breakpoint" then { 6.65+ print("Notes pending:\n"); 6.66+ l = notes; 6.67+ while l do { 6.68+ print("\t", head l, "\n"); 6.69+ l = tail l; 6.70+ } 6.71+ } 6.72+ } 6.73+} 6.74+ 6.75+aggr Ureg 6.76+{ 6.77+ 'U' 0 r0; 6.78+ 'U' 4 r1; 6.79+ 'U' 8 r2; 6.80+ 'U' 12 r3; 6.81+ 'U' 16 r4; 6.82+ 'U' 20 r5; 6.83+ 'U' 24 r6; 6.84+ 'U' 28 r7; 6.85+ 'U' 32 r8; 6.86+ 'U' 36 r9; 6.87+ 'U' 40 r10; 6.88+ 'U' 44 r11; 6.89+ 'U' 48 r12; 6.90+ 'U' 52 r13; 6.91+ 'U' 56 r14; 6.92+ 'U' 60 type; 6.93+ 'U' 64 psr; 6.94+ 'U' 68 pc; 6.95+}; 6.96+ 6.97+defn 6.98+Ureg(addr) { 6.99+ complex Ureg addr; 6.100+ print(" r0 ", addr.r0, "\n"); 6.101+ print(" r1 ", addr.r1, "\n"); 6.102+ print(" r2 ", addr.r2, "\n"); 6.103+ print(" r3 ", addr.r3, "\n"); 6.104+ print(" r4 ", addr.r4, "\n"); 6.105+ print(" r5 ", addr.r5, "\n"); 6.106+ print(" r6 ", addr.r6, "\n"); 6.107+ print(" r7 ", addr.r7, "\n"); 6.108+ print(" r8 ", addr.r8, "\n"); 6.109+ print(" r9 ", addr.r9, "\n"); 6.110+ print(" r10 ", addr.r10, "\n"); 6.111+ print(" r11 ", addr.r11, "\n"); 6.112+ print(" r12 ", addr.r12, "\n"); 6.113+ print(" r13 ", addr.r13, "\n"); 6.114+ print(" r14 ", addr.r14, "\n"); 6.115+ print(" type ", addr.type, "\n"); 6.116+ print(" psr ", addr.psr, "\n"); 6.117+ print(" pc ", addr.pc, "\n"); 6.118+}; 6.119+ 6.120+print("/sys/lib/acid/arm");
7.1new file mode 100755 7.2--- /dev/null 7.3+++ b/sys/lib/acid/coverage 7.4@@ -0,0 +1,128 @@ 7.5+// Coverage library 7.6+ 7.7+defn coverage() 7.8+{ 7.9+ local lmap, lp, e, pc, n, l; 7.10+ 7.11+ new(); 7.12+ 7.13+ bblock = {}; 7.14+ 7.15+ // find the first location in the text 7.16+ e = (map()[0][1])\i; 7.17+ 7.18+ while e < etext-4 do { 7.19+ l = follow(e); 7.20+ if tail l != {} then { 7.21+ if match(l[0], bblock) < 0 then 7.22+ bblock = append bblock, l[0]; 7.23+ if match(l[1], bblock) < 0 then 7.24+ bblock = append bblock, l[1]; 7.25+ } 7.26+ e++; 7.27+ } 7.28+ 7.29+ l = bblock; 7.30+ while l != {} do { 7.31+ *fmt(head l, bpfmt) = bpinst; 7.32+ l = tail l; 7.33+ } 7.34+ 7.35+ while 1 do { 7.36+ cont(); 7.37+ pc = *PC; 7.38+ n = match(pc, bblock); 7.39+ if n >= 0 then { 7.40+ pc = fmt(pc, bpfmt); 7.41+ *pc = @pc; 7.42+ bblock = delete bblock, n; 7.43+ } 7.44+ else { 7.45+ pstop(pid); 7.46+ return {}; 7.47+ } 7.48+ } 7.49+} 7.50+ 7.51+defn eblock(addr) 7.52+{ 7.53+ addr = addr\i; 7.54+ 7.55+ while addr < etext do { 7.56+ if (tail follow(addr)) != {} then 7.57+ return pcline(addr); 7.58+ addr++; 7.59+ } 7.60+ return 0; 7.61+} 7.62+ 7.63+defn basic(stsrc, ensrc, file) 7.64+{ 7.65+ local src, text; 7.66+ 7.67+ if stsrc >= ensrc then 7.68+ return {}; 7.69+ 7.70+ print(file, ":", stsrc, ",", ensrc, "\n"); 7.71+ src = match(file, srcfiles); 7.72+ 7.73+ if src >= 0 then 7.74+ src = srctext[src]; 7.75+ else 7.76+ src = findsrc(file); 7.77+ 7.78+ if src == {} then 7.79+ print("no source for ", file, "\n"); 7.80+ else { 7.81+ while stsrc <= ensrc do { 7.82+ text = src[stsrc]; 7.83+ if text != {} then 7.84+ print("\t", stsrc, ":", text, "\n"); 7.85+ stsrc = stsrc+1; 7.86+ } 7.87+ } 7.88+} 7.89+ 7.90+defn analyse(fnaddr) 7.91+{ 7.92+ local addr, l, tfn; 7.93+ 7.94+ new(); 7.95+ 7.96+ tfn = fnbound(fnaddr); 7.97+ 7.98+ l = bblock; 7.99+ while l do { 7.100+ addr = head l; 7.101+ 7.102+ if addr >= tfn[0] && addr < tfn[1] then 7.103+ basic(pcline(addr), eblock(addr), pcfile(addr)); 7.104+ 7.105+ l = tail l; 7.106+ } 7.107+ kill(pid); 7.108+} 7.109+ 7.110+defn report() 7.111+{ 7.112+ local addr, l; 7.113+ 7.114+ new(); 7.115+ 7.116+ l = bblock; 7.117+ while l do { 7.118+ addr = head l; 7.119+ 7.120+ basic(pcline(addr), eblock(addr), pcfile(addr)); 7.121+ 7.122+ l = tail l; 7.123+ } 7.124+ kill(pid); 7.125+} 7.126+ 7.127+defn stopped(pid) 7.128+{ 7.129+ return {}; 7.130+} 7.131+ 7.132+print("/sys/lib/acid/coverage");
8.1new file mode 100755 8.2--- /dev/null 8.3+++ b/sys/lib/acid/kernel 8.4@@ -0,0 +1,387 @@ 8.5+include("/sys/lib/acid/syscall"); 8.6+ 8.7+// print various /proc files 8.8+defn fd() { 8.9+ rc("cat /proc/"+itoa(pid)+"/fd"); 8.10+} 8.11+ 8.12+defn segment() { 8.13+ rc("cat /proc/"+itoa(pid)+"/segment"); 8.14+} 8.15+ 8.16+defn ns() { 8.17+ rc("cat /proc/"+itoa(pid)+"/ns"); 8.18+} 8.19+ 8.20+defn qid(qid) { 8.21+ complex Qid qid; 8.22+ return itoa(qid.path\X)+"."+itoa(qid.vers\X); 8.23+} 8.24+ 8.25+defn path(p) { 8.26+ complex Path p; 8.27+ if p != 0 then { 8.28+ return *(p.s\s); 8.29+ } else 8.30+ return "<null>"; 8.31+} 8.32+ 8.33+// print Image cache contents 8.34+// requires include("/sys/src/9/xxx/segment.acid") 8.35+IHASHSIZE = 64; 8.36+defn imagecacheline(h) { 8.37+ while h != 0 do { 8.38+ complex Image h; 8.39+ print (h\X, " ", qid(h.qid), " type ", h.type\D, " ref ", h.ref, " next ", h.next\X, " ", cname(h.c.name), "\n"); 8.40+ h = h.hash; 8.41+ } 8.42+} 8.43+ 8.44+defn imagecache() { 8.45+ local i; 8.46+ 8.47+ i=0; loop 1,IHASHSIZE do { 8.48+ imagecacheline(imagealloc.free[i]); 8.49+ i = i+1; 8.50+ } 8.51+} 8.52+ 8.53+// dump channels 8.54+defn chan(c) { 8.55+ local d, q; 8.56+ 8.57+ c = (Chan)c; 8.58+ d=(Dev)(*(devtab+4*c.type)); 8.59+ q=c.qid; 8.60+ print("chan(", c\X, "): ref=", c.ref\D, " #", d.dc\r, c.dev\D, " (", q.path, " ", q.vers\D, " ", q.type\X, ")"); 8.61+ print(" fid=", c.fid\D, " iounit=", c.iounit\D); 8.62+ if c.ref != 0 then { 8.63+ print(" ", cname(c.name), " mchan=", c.mchan\X); 8.64+ if c.mchan != 0 then { 8.65+ print(" ", cname(c.mchan.name)); 8.66+ } 8.67+ } 8.68+ print("\n"); 8.69+} 8.70+ 8.71+defn chans() { 8.72+ local c; 8.73+ 8.74+ c = (Chan)chanalloc.list; 8.75+ while c != 0 do { 8.76+ if c.ref != 0 then 8.77+ chan(c); 8.78+ c=(Chan)c.link; 8.79+ } 8.80+} 8.81+ 8.82+defn nchans() { 8.83+ local c, n; 8.84+ 8.85+ n = 0; 8.86+ c = (Chan)chanalloc.list; 8.87+ while c != 0 do { 8.88+ if c.ref != 0 then 8.89+ n++; 8.90+ c = (Chan)c.link; 8.91+ } 8.92+ return n; 8.93+} 8.94+ 8.95+defn activechanlist() { 8.96+ local l, n; 8.97+ 8.98+ l = {}; 8.99+ c = (Chan)chanalloc.list; 8.100+ while c != 0 do { 8.101+ if c.ref != 0 then 8.102+ l = append l,c; 8.103+ c = (Chan)c.link; 8.104+ } 8.105+ return l; 8.106+} 8.107+ 8.108+defn difflist(a, b) { 8.109+ local l, x; 8.110+ 8.111+ l = {}; 8.112+ while a != {} do { 8.113+ x = head a; 8.114+ if match(x, b) == -1 then 8.115+ l = append l, x; 8.116+ a = tail a; 8.117+ } 8.118+ return l; 8.119+} 8.120+ 8.121+_active_chan_list = {}; 8.122+defn newchans() { 8.123+ local l, new; 8.124+ 8.125+ l = activechanlist(); 8.126+ if _active_chan_list != {} then 8.127+ newerchans(_active_chan_list); 8.128+ _active_chan_list = l; 8.129+} 8.130+ 8.131+defn newerchans(oldlist){ 8.132+ local new; 8.133+ 8.134+ new = difflist(activechanlist(), oldlist); 8.135+ while new != {} do { 8.136+ chan(head new); 8.137+ new = tail new; 8.138+ } 8.139+} 8.140+ 8.141+// look for channels that refer to themselves 8.142+defn badchans() { 8.143+ local bad, c, i, len, mtpt, p; 8.144+ 8.145+ c = (Chan)chanalloc.list; 8.146+ while c != 0 do { 8.147+ if c.ref != 0 then { 8.148+ bad = ""; 8.149+ p = (Path)c.path; 8.150+ if p != 0 then { 8.151+ path(p); 8.152+ mtpt = p.mtpt; 8.153+ len = p.mlen; 8.154+ i=0; loop 1,len do { 8.155+ if mtpt[i] == c then 8.156+ bad = bad+" mtpt self-ref"; 8.157+ i = i+1; 8.158+ } 8.159+ } 8.160+ if bad != "" then 8.161+ print("chan(", c\X, "):", bad, "\n"); 8.162+ } 8.163+ c = (Chan)c.link; 8.164+ } 8.165+} 8.166+ 8.167+// manipulate processes 8.168+defn proctab(x) { 8.169+ return procalloc.arena+sizeofProc*x; 8.170+} 8.171+ 8.172+defn proc(p) { 8.173+ complex Proc p; 8.174+ local s, i; 8.175+ 8.176+ if p.state != 0 && p.pid != 0 && p.text != 0 then { // 0 is Dead 8.177+ s = p.psstate; 8.178+ if s == 0 then { 8.179+ s = "kproc"; 8.180+ } else { 8.181+ s = *(s\s); 8.182+ } 8.183+ print(p\X, " ", p.pid, ": ", *(p.text\s), " ", *(p.user\s), " pc ", p.pc\X, " ", s, " (", *(statename[p.state]\s), ") ut ", p.time[0]\D, " st ", p.time[1]\D, " qpc ", p.qpc\X, "\n"); 8.184+ } 8.185+} 8.186+ 8.187+defn procenv(p) { 8.188+ complex Proc p; 8.189+ local e, v; 8.190+ 8.191+ e = p.egrp; 8.192+ complex Egrp e; 8.193+ v = e.entries; 8.194+ while v != 0 do { 8.195+ complex Evalue v; 8.196+ print(*(v.name\s), "="); 8.197+ printstringn(v.value, v.len); 8.198+ print("\n"); 8.199+ v = v.link; 8.200+ } 8.201+} 8.202+ 8.203+KSTACK=4096; 8.204+ 8.205+defn procstksize(p) { 8.206+ complex Proc p; 8.207+ local top, sp; 8.208+ 8.209+ if p.state != 0 then { // 0 is Dead 8.210+ top = p.kstack+KSTACK; 8.211+ sp = *p.sched; 8.212+ print(top-sp\D, "\n"); 8.213+ } 8.214+} 8.215+ 8.216+defn procstk(p) { 8.217+ complex Proc p; 8.218+ local l; 8.219+ 8.220+ if p.state != 0 then { // 0 is Dead 8.221+ l = p.sched; 8.222+ if objtype=="386" then 8.223+ _stk(gotolabel, *l, linkreg(0), 0); 8.224+ else 8.225+ _stk(*(l+4), *l, linkreg(0), 0); 8.226+ } 8.227+} 8.228+ 8.229+defn procs() { 8.230+ local i; 8.231+ 8.232+ i=0; loop 1,conf.nproc do { 8.233+ proc(proctab(i)); 8.234+ i = i+1; 8.235+ } 8.236+} 8.237+ 8.238+defn stacks() { 8.239+ local i, p; 8.240+ 8.241+ i=0; loop 1,conf.nproc do { 8.242+ p = (Proc)proctab(i); 8.243+ if p.state != 0 then { 8.244+ print("=========================================================\n"); 8.245+ proc(p); 8.246+ procstk(p); 8.247+ } 8.248+ i = i+1; 8.249+ } 8.250+} 8.251+ 8.252+defn stacksizes() { 8.253+ local i; 8.254+ 8.255+ i=0; loop 1,conf.nproc do { 8.256+ procstksize(proctab(i)); 8.257+ i = i+1; 8.258+ } 8.259+} 8.260+ 8.261+// segment-related 8.262+defn procsegs(p) { 8.263+ complex Proc p; 8.264+ local i; 8.265+ 8.266+ i=0; loop 1,NSEG do { 8.267+ psegment(p.seg[i]); 8.268+ i = i+1; 8.269+ } 8.270+} 8.271+ 8.272+segtypes = { "text", "data", "bss", "stack", "shared", "physical", "shdata", "map" }; 8.273+defn psegment(s) { 8.274+ complex Segment s; 8.275+ 8.276+ if s != 0 then { 8.277+ print(s\X, " ", segtypes[s.type&SG_TYPE], " ", s.base\X, "-", s.top\X, " image ", s.image\X, "\n"); 8.278+ } 8.279+} 8.280+ 8.281+// find physical address for an address in a given process 8.282+defn procaddr(p, a) { 8.283+ complex Proc p; 8.284+ local i, s, r; 8.285+ 8.286+ r = 0; 8.287+ i=0; loop 1,NSEG do { 8.288+ s = p.seg[i]; 8.289+ if s != 0 then { 8.290+ complex Segment s; 8.291+ if s.base <= a && a < s.top then { 8.292+ r = segaddr(s, a); 8.293+ } 8.294+ } 8.295+ i = i+1; 8.296+ } 8.297+ return r; 8.298+} 8.299+ 8.300+// find an address in a given segment 8.301+defn segaddr(s, a) { 8.302+ complex Segment s; 8.303+ local pte, pg; 8.304+ 8.305+ a = a - s.base; 8.306+ if s.map == 0 || s.mapsize < a/PTEMAPMEM then { 8.307+ return 0; 8.308+ } 8.309+ 8.310+ pte = s.map[a/PTEMAPMEM]; 8.311+ if pte == 0 then { 8.312+ return 0; 8.313+ } 8.314+ 8.315+ complex Pte pte; 8.316+ pg = pte.pages[(a%PTEMAPMEM)/BY2PG]; 8.317+ if pg == 0 then { 8.318+ return 0; 8.319+ } 8.320+ 8.321+ if pg & 1 then { // swapped out, return disk address 8.322+ return pg&~1; 8.323+ } 8.324+ 8.325+ complex Page pg; 8.326+ return (KZERO|(pg.pa+(a%BY2PG)))\X; 8.327+} 8.328+ 8.329+defn kzero() { 8.330+ return main - (main & 0x0FFFFFFF); 8.331+} 8.332+ 8.333+// PC only 8.334+PTEMAPMEM = (1024*1024); 8.335+BY2PG = 4096; 8.336+PTEPERTAB = (PTEMAPMEM/BY2PG); 8.337+defn up() { 8.338+ local mach; 8.339+ 8.340+ MACHADDR = KZERO+0x4000; 8.341+ mach = MACHADDR; 8.342+ complex Mach mach; 8.343+ return mach.externup; 8.344+} 8.345+ 8.346+defn intrcount() { 8.347+ local p, pp, t, i, j; 8.348+ 8.349+ p = intrtimes; 8.350+ i=0; 8.351+ loop 1,256 do { 8.352+ pp = p[i]; 8.353+ i=i+1; 8.354+ if pp != 0 then { 8.355+ j=0; 8.356+ t=0; 8.357+ loop 1,1000 do { 8.358+ t = t+pp[j]; 8.359+ j=j+1; 8.360+ } 8.361+ print(itoa(i, "%5d"), " ", itoa(t, "%11d"), "\n"); 8.362+ } 8.363+ } 8.364+} 8.365+ 8.366+print("/sys/lib/acid/kernel"); 8.367+ 8.368+defn needacid(s){ 8.369+ print("\trc(\"cd /sys/src/9/", kdir, "; mk ", s, ".acid\")\n"); 8.370+ print("\tinclude(\"/sys/src/9/", kdir, "/", s, ".acid\")\n"); 8.371+} 8.372+ 8.373+defn kinit() { 8.374+if (map()[2]) != {} then { // map has more than two elements -> active proc 8.375+ kdir = "unknown"; 8.376+ KZERO = kzero(); 8.377+ 8.378+ if objtype == "386" then { 8.379+ map({"*data", KZERO, 0xffffffff, KZERO}); 8.380+ kdir="pc"; 8.381+ } 8.382+ if (objtype == "mips" || objtype == "mips2") then { 8.383+ kdir = "ch"; 8.384+ } 8.385+ if objtype == "alpha" then { 8.386+ map({"*data", KZERO, 0xffffffff, KZERO}); 8.387+ kdir = "alpha"; 8.388+ } 8.389+ needacid("proc"); 8.390+} 8.391+}
9.1new file mode 100755 9.2--- /dev/null 9.3+++ b/sys/lib/acid/leak 9.4@@ -0,0 +1,188 @@ 9.5+// 9.6+// usage: acid -l pool -l leak 9.7+// 9.8+include("/sys/src/libc/port/pool.acid"); 9.9+ 9.10+defn 9.11+dumppool(p, sum) 9.12+{ 9.13+ complex Pool p; 9.14+ a = p.arenalist; 9.15+ 9.16+ print("A: ", p.arenalist\X, "\n"); 9.17+ while a != 0 && a < 0xff000000 do { 9.18+ complex Arena a; 9.19+ dumparena(a, sum); 9.20+ a = a.down; 9.21+ } 9.22+} 9.23+ 9.24+defn 9.25+dumparena(arena, sum) 9.26+{ 9.27+ local atail, b, nb; 9.28+ 9.29+ atail = A2TB(arena); 9.30+ complex Bhdr arena; 9.31+ b = a; 9.32+ print("B: ", b\X, " ", atail\X, "\n"); 9.33+ while b < atail && b.magic != ARENATAIL_MAGIC do { 9.34+ dumpblock(b, sum); 9.35+ nb = B2NB(b); 9.36+ if nb == b then { 9.37+ print("B2NB(", b\X, ") = b\n"); 9.38+ b = atail; // end loop 9.39+ } 9.40+ if nb > atail then { 9.41+ b = (Bhdr)(b+4); 9.42+ print("lost at block ", (b-4)\X, ", scanning forward\n"); 9.43+ while b < atail && b.magic != ALLOC_MAGIC && b.magic != FREE_MAGIC do 9.44+ b = (Bhdr)(b+4); 9.45+ print("stopped at ", b\X, " ", *b\X, "\n"); 9.46+ }else 9.47+ b = nb; 9.48+ } 9.49+ if b != atail then 9.50+ print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n"); 9.51+} 9.52+ 9.53+defn 9.54+isptr(a) 9.55+{ 9.56+ if end <= a && a < xbloc then 9.57+ return 1; 9.58+ if 0xdefff000 <= a && a < 0xdffff000 then 9.59+ return 1; 9.60+ return 0; 9.61+} 9.62+ 9.63+lastalloc = 0; 9.64+lastcount = 0; 9.65+lastsize = 0; 9.66+defn 9.67+emitsum() 9.68+{ 9.69+ if lastalloc then 9.70+ print("summary ", lastalloc\a, " ", lastcount\D, " ", lastsize\D, "\n"); 9.71+ lastalloc = 0; 9.72+ lastcount = 0; 9.73+ lastsize = 0; 9.74+} 9.75+ 9.76+defn 9.77+dumpblock(addr, sum) 9.78+{ 9.79+ complex Bhdr addr; 9.80+ 9.81+ if addr.magic == ALLOC_MAGIC || (!sum && addr.magic == FREE_MAGIC) then { 9.82+ local a, x, s; 9.83+ 9.84+ a = addr; 9.85+ complex Alloc a; 9.86+ 9.87+ x = addr+8; 9.88+ if sum then { 9.89+ if *(addr+8) != lastalloc then { 9.90+ emitsum(); 9.91+ lastalloc = *(addr+8); 9.92+ } 9.93+ lastcount = lastcount+1; 9.94+ lastsize = lastsize+a.size; 9.95+ }else{ 9.96+ if addr.magic == ALLOC_MAGIC then 9.97+ s = "block"; 9.98+ else 9.99+ s = "free"; 9.100+ print(s, " ", addr\X, " ", a.size\X, " "); 9.101+ print(*(addr+8)\X, " ", *(addr+12)\X, " ", 9.102+ *(addr+8)\a, " ", *(addr+12)\a, "\n"); 9.103+ } 9.104+ } 9.105+} 9.106+ 9.107+defn 9.108+dumprange(s, e, type) 9.109+{ 9.110+ local x, y; 9.111+ 9.112+ print("range ", type, " ", s\X, " ", e\X, "\n"); 9.113+ x = s; 9.114+ while x < e do { 9.115+ y = *(x\X); 9.116+ if isptr(y) then print("data ", x\X, " ", y\X, " ", type, "\n"); 9.117+ x = x + 4; 9.118+ } 9.119+} 9.120+ 9.121+defn 9.122+stacktop() 9.123+{ 9.124+ local e, m; 9.125+ 9.126+ m = map(); 9.127+ while m != {} do { 9.128+ e = head m; 9.129+ if e[0] == "*data" then 9.130+ return e[2]; 9.131+ m = tail m; 9.132+ } 9.133+ return 0xdffff000; 9.134+} 9.135+ 9.136+defn 9.137+dumpmem() 9.138+{ 9.139+ local s, top; 9.140+ 9.141+ xbloc = *bloc; 9.142+ // assume map()[1] is "data" 9.143+ dumprange(map()[1][1], end, "bss"); // bss 9.144+ dumprange(end, xbloc, "alloc"); // allocated 9.145+ 9.146+ top = stacktop() - 8; 9.147+ if top-0x01000000 < *SP && *SP < top then 9.148+ s = *SP; 9.149+ else 9.150+ s = top-32*1024; 9.151+ 9.152+ dumprange(s, top, "stack"); 9.153+} 9.154+ 9.155+defn 9.156+dumpregs() 9.157+{ 9.158+ dumprange(0, sizeofUreg, "reg"); 9.159+} 9.160+ 9.161+ 9.162+defn 9.163+leakdump(l) 9.164+{ 9.165+ print("==LEAK BEGIN==\n"); 9.166+ dumppool(*mainmem, 0); 9.167+ dumpmem(); 9.168+ dumpregs(); 9.169+ while l != {} do { 9.170+ setproc(head l); 9.171+ dumpregs(); 9.172+ l = tail l; 9.173+ } 9.174+ print("==LEAK END==\n"); 9.175+} 9.176+ 9.177+defn 9.178+blockdump() 9.179+{ 9.180+ print("==BLOCK BEGIN==\n"); 9.181+ dumppool(*mainmem, 0); 9.182+ print("==BLOCK END==\n"); 9.183+} 9.184+ 9.185+defn 9.186+blocksummary() 9.187+{ 9.188+ print("==BLOCK BEGIN==\n"); 9.189+ dumppool(*mainmem, 1); 9.190+ emitsum(); 9.191+ print("==BLOCK END==\n"); 9.192+}
10.1new file mode 100755 10.2--- /dev/null 10.3+++ b/sys/lib/acid/mips 10.4@@ -0,0 +1,217 @@ 10.5+// Mips support 10.6+ 10.7+defn acidinit() // Called after all the init modules are loaded 10.8+{ 10.9+ bplist = {}; 10.10+ bpfmt = 'X'; 10.11+ 10.12+ srcpath = { 10.13+ "./", 10.14+ "/sys/src/libc/port/", 10.15+ "/sys/src/libc/9sys/", 10.16+ "/sys/src/libc/mips/" 10.17+ }; 10.18+ 10.19+ srcfiles = {}; // list of loaded files 10.20+ srctext = {}; // the text of the files 10.21+} 10.22+ 10.23+defn stk() // trace 10.24+{ 10.25+ _stk(*PC, *SP, linkreg(0), 0); 10.26+} 10.27+ 10.28+defn lstk() // trace with locals 10.29+{ 10.30+ _stk(*PC, *SP, linkreg(0), 1); 10.31+} 10.32+ 10.33+defn gpr() // print general purpose registers 10.34+{ 10.35+ print("R1\t", *R1, " R2\t", *R2, " R3\t", *R3, "\n"); 10.36+ print("R4\t", *R4, " R5\t", *R5, " R6\t", *R6, "\n"); 10.37+ print("R7\t", *R7, " R8\t", *R8, " R9\t", *R9, "\n"); 10.38+ print("R10\t", *R10, " R11\t", *R11, " R12\t", *R12, "\n"); 10.39+ print("R13\t", *R13, " R14\t", *R14, " R15\t", *R15, "\n"); 10.40+ print("R16\t", *R16, " R17\t", *R17, " R18\t", *R18, "\n"); 10.41+ print("R19\t", *R19, " R20\t", *R20, " R21\t", *R21, "\n"); 10.42+ print("R22\t", *R22, " R23\t", *R23, " R24\t", *R24, "\n"); 10.43+ print("R25\t", *R25, " R26\t", *R26, " R27\t", *R27, "\n"); 10.44+ print("R28\t", *R28, " R29\t", *SP, " R30\t", *R30, "\n"); 10.45+ print("R31\t", *R31, "\n"); 10.46+} 10.47+ 10.48+defn Fpr() 10.49+{ 10.50+ print("F0\t", *fmt(F0, 'G'), "\tF2\t", *fmt(F2, 'G'), "\n"); 10.51+ print("F4\t", *fmt(F4, 'G'), "\tF6\t", *fmt(F6, 'G'), "\n"); 10.52+ print("F8\t", *fmt(F8, 'G'), "\tF10\t", *fmt(F10, 'G'), "\n"); 10.53+ print("F12\t", *fmt(F12, 'G'), "\tF14\t", *fmt(F14, 'G'), "\n"); 10.54+ print("F16\t", *fmt(F16, 'G'), "\tF18\t", *fmt(F18, 'G'), "\n"); 10.55+ print("F20\t", *fmt(F20, 'G'), "\tF22\t", *fmt(F22, 'G'), "\n"); 10.56+ print("F24\t", *fmt(F24, 'G'), "\tF26\t", *fmt(F26, 'G'), "\n"); 10.57+ print("F28\t", *fmt(F28, 'G'), "\tF30\t", *fmt(F30, 'G'), "\n"); 10.58+} 10.59+ 10.60+defn fpr() 10.61+{ 10.62+ print("F0\t", *fmt(F0, 'g'), "\tF1\t", *fmt(F1, 'g'), "\n"); 10.63+ print("F2\t", *fmt(F2, 'g'), "\tF3\t", *fmt(F3, 'g'), "\n"); 10.64+ print("F4\t", *fmt(F4, 'g'), "\tF5\t", *fmt(F5, 'g'), "\n"); 10.65+ print("F6\t", *fmt(F6, 'g'), "\tF7\t", *fmt(F7, 'g'), "\n"); 10.66+ print("F8\t", *fmt(F8, 'g'), "\tF9\t", *fmt(F9, 'g'), "\n"); 10.67+ print("F10\t", *fmt(F10, 'g'), "\tF11\t", *fmt(F11, 'g'), "\n"); 10.68+ print("F12\t", *fmt(F12, 'g'), "\tF13\t", *fmt(F13, 'g'), "\n"); 10.69+ print("F14\t", *fmt(F14, 'g'), "\tF15\t", *fmt(F15, 'g'), "\n"); 10.70+ print("F16\t", *fmt(F16, 'g'), "\tF17\t", *fmt(F17, 'g'), "\n"); 10.71+ print("F18\t", *fmt(F18, 'g'), "\tF19\t", *fmt(F19, 'g'), "\n"); 10.72+ print("F20\t", *fmt(F20, 'g'), "\tF21\t", *fmt(F21, 'g'), "\n"); 10.73+ print("F22\t", *fmt(F22, 'g'), "\tF23\t", *fmt(F23, 'g'), "\n"); 10.74+ print("F24\t", *fmt(F24, 'g'), "\tF25\t", *fmt(F25, 'g'), "\n"); 10.75+ print("F26\t", *fmt(F26, 'g'), "\tF27\t", *fmt(F27, 'g'), "\n"); 10.76+ print("F28\t", *fmt(F28, 'g'), "\tF29\t", *fmt(F29, 'g'), "\n"); 10.77+ print("F30\t", *fmt(F30, 'g'), "\tF31\t", *fmt(F31, 'g'), "\n"); 10.78+} 10.79+ 10.80+defn spr() // print special processor registers 10.81+{ 10.82+ local pc, link, cause; 10.83+ 10.84+ pc = *PC; 10.85+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 10.86+ pfl(pc); 10.87+ 10.88+ link = *R31; 10.89+ print("SP\t", *SP, "\tLINK\t", link, " ", fmt(link, 'a'), " "); 10.90+ pfl(link); 10.91+ 10.92+ cause = *CAUSE; 10.93+ print("STATUS\t", *STATUS, "\tCAUSE\t", cause, " ", reason(cause), "\n"); 10.94+ print("TLBVIR\t", *TLBVIRT, "\tBADVADR\t", *BADVADDR, "\n"); 10.95+ 10.96+ print("HI\t", *HI, "\tLO\t", *LO, "\n"); 10.97+} 10.98+ 10.99+defn regs() // print all registers 10.100+{ 10.101+ spr(); 10.102+ gpr(); 10.103+} 10.104+ 10.105+defn pstop(pid) 10.106+{ 10.107+ local l, pc; 10.108+ 10.109+ pc = *PC; 10.110+ 10.111+ print(pid,": ", reason(*CAUSE), "\t"); 10.112+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 10.113+ 10.114+ if notes then { 10.115+ if notes[0] != "sys: breakpoint" then { 10.116+ print("Notes pending:\n"); 10.117+ l = notes; 10.118+ while l do { 10.119+ print("\t", head l, "\n"); 10.120+ l = tail l; 10.121+ } 10.122+ } 10.123+ } 10.124+} 10.125+ 10.126+sizeofUreg = 152; 10.127+aggr Ureg 10.128+{ 10.129+ 'X' 0 status; 10.130+ 'X' 4 pc; 10.131+ { 10.132+ 'X' 8 sp; 10.133+ 'X' 8 usp; 10.134+ }; 10.135+ 'X' 12 cause; 10.136+ 'X' 16 badvaddr; 10.137+ 'X' 20 tlbvirt; 10.138+ 'X' 24 hi; 10.139+ 'X' 28 lo; 10.140+ 'X' 32 r31; 10.141+ 'X' 36 r30; 10.142+ 'X' 40 r28; 10.143+ 'X' 44 r27; 10.144+ 'X' 48 r26; 10.145+ 'X' 52 r25; 10.146+ 'X' 56 r24; 10.147+ 'X' 60 r23; 10.148+ 'X' 64 r22; 10.149+ 'X' 68 r21; 10.150+ 'X' 72 r20; 10.151+ 'X' 76 r19; 10.152+ 'X' 80 r18; 10.153+ 'X' 84 r17; 10.154+ 'X' 88 r16; 10.155+ 'X' 92 r15; 10.156+ 'X' 96 r14; 10.157+ 'X' 100 r13; 10.158+ 'X' 104 r12; 10.159+ 'X' 108 r11; 10.160+ 'X' 112 r10; 10.161+ 'X' 116 r9; 10.162+ 'X' 120 r8; 10.163+ 'X' 124 r7; 10.164+ 'X' 128 r6; 10.165+ 'X' 132 r5; 10.166+ 'X' 136 r4; 10.167+ 'X' 140 r3; 10.168+ 'X' 144 r2; 10.169+ 'X' 148 r1; 10.170+}; 10.171+ 10.172+defn 10.173+Ureg(addr) { 10.174+ complex Ureg addr; 10.175+ print(" status ", addr.status, "\n"); 10.176+ print(" pc ", addr.pc, "\n"); 10.177+ print(" sp ", addr.sp, "\n"); 10.178+ print(" cause ", addr.cause, "\n"); 10.179+ print(" badvaddr ", addr.badvaddr, "\n"); 10.180+ print(" tlbvirt ", addr.tlbvirt, "\n"); 10.181+ print(" hi ", addr.hi, "\n"); 10.182+ print(" lo ", addr.lo, "\n"); 10.183+ print(" r31 ", addr.r31, "\n"); 10.184+ print(" r30 ", addr.r30, "\n"); 10.185+ print(" r28 ", addr.r28, "\n"); 10.186+ print(" r27 ", addr.r27, "\n"); 10.187+ print(" r26 ", addr.r26, "\n"); 10.188+ print(" r25 ", addr.r25, "\n"); 10.189+ print(" r24 ", addr.r24, "\n"); 10.190+ print(" r23 ", addr.r23, "\n"); 10.191+ print(" r22 ", addr.r22, "\n"); 10.192+ print(" r21 ", addr.r21, "\n"); 10.193+ print(" r20 ", addr.r20, "\n"); 10.194+ print(" r19 ", addr.r19, "\n"); 10.195+ print(" r18 ", addr.r18, "\n"); 10.196+ print(" r17 ", addr.r17, "\n"); 10.197+ print(" r16 ", addr.r16, "\n"); 10.198+ print(" r15 ", addr.r15, "\n"); 10.199+ print(" r14 ", addr.r14, "\n"); 10.200+ print(" r13 ", addr.r13, "\n"); 10.201+ print(" r12 ", addr.r12, "\n"); 10.202+ print(" r11 ", addr.r11, "\n"); 10.203+ print(" r10 ", addr.r10, "\n"); 10.204+ print(" r9 ", addr.r9, "\n"); 10.205+ print(" r8 ", addr.r8, "\n"); 10.206+ print(" r7 ", addr.r7, "\n"); 10.207+ print(" r6 ", addr.r6, "\n"); 10.208+ print(" r5 ", addr.r5, "\n"); 10.209+ print(" r4 ", addr.r4, "\n"); 10.210+ print(" r3 ", addr.r3, "\n"); 10.211+ print(" r2 ", addr.r2, "\n"); 10.212+ print(" r1 ", addr.r1, "\n"); 10.213+}; 10.214+ 10.215+defn linkreg(addr) 10.216+{ 10.217+ complex Ureg addr; 10.218+ return addr.r31\X; 10.219+} 10.220+ 10.221+print("/sys/lib/acid/mips");
11.1new file mode 100755 11.2--- /dev/null 11.3+++ b/sys/lib/acid/network 11.4@@ -0,0 +1,169 @@ 11.5+_ni=0; // network indent level 11.6+ 11.7+defn 11.8+_ni() { 11.9+ loop 1,_ni do { 11.10+ print("\t"); 11.11+ } 11.12+} 11.13+ 11.14+defn 11.15+ipdev(n) { 11.16+ _ipfs(*(ipfs+4*n)); 11.17+} 11.18+ 11.19+// the funny _foo/foo pairs exist so that if we get 11.20+// interrupted in the middle of one of these, _ni will 11.21+// get reset to 0 next time an external call happens. 11.22+ 11.23+defn 11.24+_ipfs(fs) { 11.25+ complex Fs fs; 11.26+ local i; 11.27+ 11.28+ print("ipfs(", fs\X, ") #I", fs.dev\D, "\n"); 11.29+ i=0; 11.30+ _ni = _ni+1; 11.31+ while i < fs.np do { 11.32+ _proto(*(fs.p+i*4)); 11.33+ i = i + 1; 11.34+ } 11.35+ _ni = _ni-1; 11.36+} 11.37+ 11.38+defn 11.39+ipfs(fs) { 11.40+ _ni = 0; 11.41+ _ipfs(fs); 11.42+} 11.43+ 11.44+defn 11.45+_proto(p) { 11.46+ local c; 11.47+ complex Proto p; 11.48+ _ni(); 11.49+ print("proto(", p\X, ") ", *(p.name\s), "\n"); 11.50+ _ni = _ni+1; 11.51+ local i; 11.52+ i = 0; 11.53+ while i < p.nc do { 11.54+ c = *(p.conv+i*4); 11.55+ complex Conv c; 11.56+ if c != 0 && c.inuse then 11.57+ _conv(*(p.conv+i*4)); 11.58+ i = i + 1; 11.59+ } 11.60+ _ni = _ni - 1; 11.61+} 11.62+ 11.63+defn 11.64+proto(p) { 11.65+ _ni = 0; 11.66+ _proto(p); 11.67+} 11.68+ 11.69+defn 11.70+_conv(c) { 11.71+ complex Conv c; 11.72+ _ni(); 11.73+ local p; 11.74+ p = c.p; 11.75+ complex Proto p; 11.76+ print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ", 11.77+ iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)), 11.78+ "!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq), 11.79+ " eq ", qtostr(c.eq), "\n"); 11.80+} 11.81+ 11.82+defn 11.83+conv(c) { 11.84+ _ni = 0; 11.85+ _conv(c); 11.86+} 11.87+ 11.88+defn 11.89+iptostr(a) 11.90+{ 11.91+ // BUG: little endian 11.92+ return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF); 11.93+} 11.94+ 11.95+defn 11.96+qtostr(q) 11.97+{ 11.98+ complex Queue q; 11.99+ 11.100+ return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]"; 11.101+} 11.102+ 11.103+defn 11.104+qblocks(q) 11.105+{ 11.106+ complex Queue q; 11.107+ local b, n; 11.108+ 11.109+ b = q.bfirst; 11.110+ n = 0; 11.111+ while b != 0 do { 11.112+ n = n + 1; 11.113+ complex Block b; 11.114+ b = b.next; 11.115+ } 11.116+ return n; 11.117+} 11.118+ 11.119+defn 11.120+_queue(q) 11.121+{ 11.122+ complex Queue q; 11.123+ local b; 11.124+ 11.125+ print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D); 11.126+ if q.state & Qstarve then 11.127+ print(" starve"); 11.128+ if q.state & Qmsg then 11.129+ print(" msg"); 11.130+ if q.state & Qclosed then 11.131+ print(" closed"); 11.132+ if q.state & Qflow then 11.133+ print(" flow"); 11.134+ if q.state & Qcoalesce then 11.135+ print(" coalesce"); 11.136+ print("\n"); 11.137+ 11.138+ b = q.bfirst; 11.139+ _ni = _ni+1; 11.140+ while b != 0 do { 11.141+ _block(b); 11.142+ complex Block b; 11.143+ b = b.next; 11.144+ } 11.145+ _ni = _ni - 1; 11.146+} 11.147+ 11.148+defn 11.149+queue(q) 11.150+{ 11.151+ _ni = 0; 11.152+ _queue(q); 11.153+} 11.154+ 11.155+defn 11.156+_block(b) 11.157+{ 11.158+ complex Block b; 11.159+ 11.160+ _ni(); 11.161+ print("block(", b\X, ") base ", b.base\X, " rp ", b.rp\X, "/", b.rp-b.base\D, " wp ", b.wp\X, "/", b.wp-b.base\D, " lim ", b.lim\X, "/", b.lim-b.base\D, "\n"); 11.162+} 11.163+ 11.164+defn 11.165+block(b) 11.166+{ 11.167+ _ni = 0; 11.168+ block(b); 11.169+} 11.170+ 11.171+print("/sys/lib/acid/network"); 11.172+needacid("tcp"); 11.173+needacid("qio");
12.1new file mode 100755 12.2--- /dev/null 12.3+++ b/sys/lib/acid/pool 12.4@@ -0,0 +1,306 @@ 12.5+include("/sys/src/libc/port/pool.acid"); 12.6+ 12.7+aggr Byte { 12.8+ 'b' 0 byte; 12.9+}; 12.10+ 12.11+defn 12.12+byteat(addr) 12.13+{ 12.14+ local x; 12.15+ complex Byte addr; 12.16+ x = addr.byte; 12.17+ return x\d; 12.18+} 12.19+ 12.20+defn 12.21+B2T(addr) { 12.22+ complex Bhdr addr; 12.23+ addr = addr+addr.size-sizeofBtail; 12.24+ complex Btail addr; 12.25+ return addr; 12.26+} 12.27+ 12.28+defn 12.29+B2D(addr) { 12.30+ local x; 12.31+ x = addr+sizeofBhdr; 12.32+ return x\X; 12.33+} 12.34+ 12.35+defn 12.36+D2B(addr) { 12.37+ local x; 12.38+ x = addr-sizeofBhdr; 12.39+ complex Bhdr x; 12.40+ return x; 12.41+} 12.42+ 12.43+defn 12.44+B2NB(addr) { 12.45+ complex Bhdr addr; 12.46+ addr = addr+addr.size; 12.47+ complex Bhdr addr; 12.48+ return addr; 12.49+} 12.50+ 12.51+defn 12.52+A2TB(addr) { 12.53+ local b; 12.54+ complex Arena addr; 12.55+ b = addr+addr.asize-sizeofBhdr; 12.56+ complex Bhdr b; 12.57+ return b; 12.58+} 12.59+ 12.60+defn 12.61+A2B(addr) { 12.62+ return B2NB(addr); 12.63+} 12.64+ 12.65+defn 12.66+B2PT(addr) { 12.67+ complex Bhdr addr; 12.68+ addr = addr-sizeofBtail; 12.69+ complex Btail addr; 12.70+ return addr; 12.71+} 12.72+ 12.73+defn 12.74+SHORT(addr) { 12.75+ local hi, lo; 12.76+ 12.77+ hi = byteat(addr); 12.78+ lo = byteat(addr+1); 12.79+ return lo+hi*256; 12.80+} 12.81+ 12.82+defn 12.83+Btail(addr) { 12.84+ complex Btail addr; 12.85+ print(" magic0 ", addr.magic0, "\n"); 12.86+ print(" datadiff ", SHORT(addr.datasize), "\n"); 12.87+ print(" magic1 ", addr.magic1, "\n"); 12.88+ print(" size ", addr.size\X, "\n"); 12.89+ print(" hdr ", addr+sizeofBtail-addr.size\X, "\n"); 12.90+}; 12.91+ 12.92+defn 12.93+Tail(addr) 12.94+{ 12.95+ print(" ", B2T(addr)\X, "\n"); 12.96+ Btail(B2T(addr)); 12.97+} 12.98+ 12.99+defn 12.100+Magic(m) 12.101+{ 12.102+ if m == FREE_MAGIC then 12.103+ return "free"; 12.104+ if m == ARENA_MAGIC then 12.105+ return "arena"; 12.106+ if m == UNKEMPT_MAGIC then 12.107+ return "unkempt"; 12.108+ if m == KEMPT_MAGIC then 12.109+ return "kempt"; 12.110+ if m == ARENATAIL_MAGIC then 12.111+ return "arenatail"; 12.112+ if m == DEAD_MAGIC then 12.113+ return "dead"; 12.114+ return "unknown magic"; 12.115+} 12.116+ 12.117+defn 12.118+Block(addr) 12.119+{ 12.120+ complex Bhdr addr; 12.121+ print(" ", Magic(addr.magic), "\n"); 12.122+ print(" data ", B2D(addr), "\n"); 12.123+ print(" datasize ", getdsize(addr), "\n"); 12.124+ Bhdr(addr); 12.125+ Tail(addr); 12.126+} 12.127+ 12.128+defn 12.129+getdsize(addr) 12.130+{ 12.131+ complex Bhdr addr; 12.132+ local x; 12.133+ 12.134+ x = addr.size\d; 12.135+ x = x-SHORT(B2T(addr).datasize); 12.136+ return x\d; 12.137+} 12.138+ 12.139+defn 12.140+datamagic(x) 12.141+{ 12.142+ x = x%4; 12.143+ if x == 0 then return 0xFE; 12.144+ if x == 1 then return 0xF1; 12.145+ if x == 2 then return 0xF0; 12.146+ if x == 3 then return 0xFA; 12.147+} 12.148+ 12.149+defn 12.150+checkblock(addr) 12.151+{ 12.152+ local badmagic, datamagic, a, b, t, q, n, dsize, taddr, checked; 12.153+ complex Bhdr addr; 12.154+ taddr = B2T(addr); 12.155+ complex Btail taddr; 12.156+ 12.157+ if addr.magic == FREE_MAGIC || addr.magic == UNKEMPT_MAGIC then { 12.158+ if taddr.magic0 != TAIL_MAGIC0 || taddr.magic1 != TAIL_MAGIC1 then 12.159+ print(addr\X, " corrupt tail magic\n"); 12.160+ if taddr.size != addr.size then 12.161+ print(addr\X, " corrupt tail header pointer\n"); 12.162+ } 12.163+ 12.164+ if addr.magic == ARENA_MAGIC then { 12.165+ taddr = A2TB(addr); 12.166+ if taddr.magic != ARENATAIL_MAGIC then 12.167+ print(addr\X, " arena with bad tail block\n"); 12.168+ else 12.169+ addr = taddr; 12.170+ } 12.171+ 12.172+ if addr.magic == ARENATAIL_MAGIC then { 12.173+ if addr.size != 0 then 12.174+ print(addr\X, " bad size in arena tail\n"); 12.175+ } 12.176+ 12.177+ if addr.magic == KEMPT_MAGIC then { 12.178+ a = addr; 12.179+ complex Alloc a; 12.180+ if a.size > 1024*1024*1024 then 12.181+ print(addr\X, " block ridiculously large\n"); 12.182+ t = B2T(addr); 12.183+ if t.magic0 != TAIL_MAGIC0 || t.magic1 != TAIL_MAGIC1 then 12.184+ print(addr\X, " bad tail magic\n"); 12.185+ if t.size != addr.size then 12.186+ print(addr\X, " bad tail pointer\n"); 12.187+ dsize = getdsize(a); 12.188+ if dsize > a.size then 12.189+ print(addr\X, " too much data in block\n"); 12.190+ q = B2D(a)\X+dsize; 12.191+ n = 4; 12.192+ if q+4 > t then 12.193+ n = t-q; 12.194+ badmagic = 0; 12.195+ loop 0,n-1 do { 12.196+ if byteat(q) != datamagic(q) then { 12.197+ badmagic=1; 12.198+ } 12.199+ q = q+1; 12.200+ } 12.201+ if badmagic then 12.202+ print(addr\X, " size ", dsize, " user has overwritten boundary\n"); 12.203+ } 12.204+} 12.205+ 12.206+defn 12.207+checkarena(arena) 12.208+{ 12.209+ local atail, b; 12.210+ 12.211+ atail = A2TB(arena); 12.212+ complex Bhdr arena; 12.213+ b = arena; 12.214+ while b.magic != ARENATAIL_MAGIC && b < atail do { 12.215+ checkblock(b); 12.216+ if B2NB(b) == b then { 12.217+ print("B2NB(", b\X, ") = b\n"); 12.218+ b = atail; // end loop 12.219+ } 12.220+ b = B2NB(b); 12.221+ } 12.222+ 12.223+ checkblock(b); 12.224+ if b != atail then 12.225+ print("found wrong tail to arena ", arena\X, "\n"); 12.226+} 12.227+ 12.228+defn 12.229+checkpool(p) 12.230+{ 12.231+ complex Pool p; 12.232+ local a; 12.233+ a = p.arenalist; 12.234+ 12.235+ while a != 0 do { 12.236+ complex Arena a; 12.237+ checkarena(a); 12.238+ a = a.down; 12.239+ } 12.240+} 12.241+ 12.242+defn 12.243+gendumptree(f, in, s) 12.244+{ 12.245+ complex Free f; 12.246+ 12.247+ loop 1,in do {print(" ");} 12.248+ print(s, " size ", f.size\D, " left ", f.left\X, " right ", f.right\X, "\n"); 12.249+ if f.left != 0 && f.left < 0x7FFFFFFF then 12.250+ gendumptree(f.left, in+1, "l"); 12.251+ if f.right != 0 && f.right < 0x7FFFFFFF then 12.252+ gendumptree(f.right, in+1, "r"); 12.253+} 12.254+ 12.255+defn 12.256+dumptree(f) 12.257+{ 12.258+ gendumptree(f, 0, "*"); 12.259+} 12.260+ 12.261+defn 12.262+poolwhopointsat(p, addr) 12.263+{ 12.264+ complex Pool p; 12.265+ local a; 12.266+ 12.267+ a = p.arenalist; 12.268+ while a != 0 do { 12.269+ complex Arena a; 12.270+ arenawhopointsat(a, addr); 12.271+ a = a.down; 12.272+ } 12.273+} 12.274+ 12.275+defn 12.276+arenawhopointsat(arena, addr) 12.277+{ 12.278+ local atail, b; 12.279+ 12.280+ atail = A2TB(arena); 12.281+ complex Bhdr arena; 12.282+ b = arena; 12.283+ while b < atail do { 12.284+ if *b == addr then 12.285+ print(b\X, "\n"); 12.286+ b = b+4; 12.287+ } 12.288+} 12.289+ 12.290+defn 12.291+whopointsat(addr) 12.292+{ 12.293+ poolwhopointsat(*mainmem, addr); 12.294+} 12.295+ 12.296+defn 12.297+blockhdr(addr) 12.298+{ 12.299+ addr = addr & ~3; 12.300+ 12.301+ while *addr != FREE_MAGIC 12.302+ && *addr != ARENA_MAGIC 12.303+ && *addr != UNKEMPT_MAGIC 12.304+ && *addr != KEMPT_MAGIC 12.305+ && *addr != ARENATAIL_MAGIC 12.306+ do 12.307+ addr = addr-4; 12.308+ return addr; 12.309+} 12.310+
13.1new file mode 100755 13.2--- /dev/null 13.3+++ b/sys/lib/acid/port 13.4@@ -0,0 +1,574 @@ 13.5+// portable acid for all architectures 13.6+ 13.7+defn pfl(addr) 13.8+{ 13.9+ print(pcfile(addr), ":", pcline(addr), "\n"); 13.10+} 13.11+ 13.12+defn 13.13+notestk(addr) 13.14+{ 13.15+ local pc, sp; 13.16+ complex Ureg addr; 13.17+ 13.18+ pc = addr.pc\X; 13.19+ sp = addr.sp\X; 13.20+ 13.21+ print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " "); 13.22+ pfl(pc); 13.23+ _stk(pc, sp, linkreg(addr), 1); 13.24+} 13.25+ 13.26+defn 13.27+notelstk(addr) 13.28+{ 13.29+ local pc, sp; 13.30+ complex Ureg addr; 13.31+ 13.32+ pc = addr.pc\X; 13.33+ sp = addr.sp\X; 13.34+ 13.35+ print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " "); 13.36+ pfl(pc); 13.37+ _stk(pc, sp, linkreg(addr), 1); 13.38+} 13.39+ 13.40+defn labstk(l) // trace from a label 13.41+{ 13.42+ _stk(*(l+4), *l, linkreg(0), 0); 13.43+} 13.44+ 13.45+defn params(param) 13.46+{ 13.47+ while param do { 13.48+ sym = head param; 13.49+ print(sym[0], "=", itoa(sym[1], "%ux")); 13.50+ param = tail param; 13.51+ if param then 13.52+ print (","); 13.53+ } 13.54+} 13.55+ 13.56+stkprefix = ""; 13.57+stkignore = {}; 13.58+stkend = 0; 13.59+ 13.60+defn locals(l) 13.61+{ 13.62+ local sym; 13.63+ 13.64+ while l do { 13.65+ sym = head l; 13.66+ print(stkprefix, "\t", sym[0], "=", itoa(sym[1], "%ux"), "\n"); 13.67+ l = tail l; 13.68+ } 13.69+} 13.70+ 13.71+defn _stkign(file) 13.72+{ 13.73+ s = stkignore; 13.74+ while s do { 13.75+ if regexp(head s, file) then 13.76+ return 1; 13.77+ s = tail s; 13.78+ } 13.79+ return 0; 13.80+} 13.81+ 13.82+// print a stack trace 13.83+// 13.84+// in a run of leading frames in files matched by regexps in stkignore, 13.85+// only print the last one. 13.86+defn _stk(pc, sp, link, dolocals) 13.87+{ 13.88+ local stk, ign, last, lastpc; 13.89+ 13.90+ stk = strace(pc, sp, link); 13.91+ if stkignore then 13.92+ ign = 1; 13.93+ else 13.94+ ign = 0; 13.95+ last = stk; 13.96+ lastpc = pc; 13.97+ while stk do { 13.98+ if ign then { 13.99+ if !_stkign(pcfile(pc)) then { 13.100+ ign = 0; 13.101+ stk = last; 13.102+ pc = lastpc; 13.103+ } 13.104+ } 13.105+ frame = head stk; 13.106+ if !ign then { 13.107+ print(stkprefix, fmt(frame[0], 'a'), "("); 13.108+ params(frame[2]); 13.109+ print(")+", itoa(pc-frame[0], "%ux"), " "); 13.110+ pfl(pc); 13.111+ if dolocals then 13.112+ locals(frame[3]); 13.113+ } 13.114+ last = stk; 13.115+ lastpc = pc; 13.116+ stk = tail stk; 13.117+ pc = frame[1]; 13.118+ } 13.119+ print(stkprefix, fmt(pc, 'a'), " "); 13.120+ pfl(pc); 13.121+} 13.122+ 13.123+defn findsrc(file) 13.124+{ 13.125+ local lst, src; 13.126+ 13.127+ if file[0] == '/' then { 13.128+ src = file(file); 13.129+ if src != {} then { 13.130+ srcfiles = append srcfiles, file; 13.131+ srctext = append srctext, src; 13.132+ return src; 13.133+ } 13.134+ return {}; 13.135+ } 13.136+ 13.137+ lst = srcpath; 13.138+ while head lst do { 13.139+ src = file(head lst+file); 13.140+ if src != {} then { 13.141+ srcfiles = append srcfiles, file; 13.142+ srctext = append srctext, src; 13.143+ return src; 13.144+ } 13.145+ lst = tail lst; 13.146+ } 13.147+} 13.148+ 13.149+defn line(addr) 13.150+{ 13.151+ local src, file; 13.152+ 13.153+ file = pcfile(addr); 13.154+ src = match(file, srcfiles); 13.155+ 13.156+ if src >= 0 then 13.157+ src = srctext[src]; 13.158+ else 13.159+ src = findsrc(file); 13.160+ 13.161+ if src == {} then { 13.162+ print("no source for ", file, "\n"); 13.163+ return {}; 13.164+ } 13.165+ line = pcline(addr)-1; 13.166+ print(file, ":", src[line], "\n"); 13.167+} 13.168+ 13.169+defn addsrcdir(dir) 13.170+{ 13.171+ dir = dir+"/"; 13.172+ 13.173+ if match(dir, srcpath) >= 0 then { 13.174+ print("already in srcpath\n"); 13.175+ return {}; 13.176+ } 13.177+ 13.178+ srcpath = {dir}+srcpath; 13.179+} 13.180+ 13.181+defn source() 13.182+{ 13.183+ local l; 13.184+ 13.185+ l = srcpath; 13.186+ while l do { 13.187+ print(head l, "\n"); 13.188+ l = tail l; 13.189+ } 13.190+ l = srcfiles; 13.191+ 13.192+ while l do { 13.193+ print("\t", head l, "\n"); 13.194+ l = tail l; 13.195+ } 13.196+} 13.197+ 13.198+defn Bsrc(addr) 13.199+{ 13.200+ local lst; 13.201+ 13.202+ lst = srcpath; 13.203+ file = pcfile(addr); 13.204+ if file[0] == '/' && access(file) then { 13.205+ rc("B "+file+":"+itoa(pcline(addr))); 13.206+ return {}; 13.207+ } 13.208+ while head lst do { 13.209+ name = head lst+file; 13.210+ if access(name) then { 13.211+ rc("B "+name+":"+itoa(pcline(addr))); 13.212+ return {}; 13.213+ } 13.214+ lst = tail lst; 13.215+ } 13.216+ print("no source for ", file, "\n"); 13.217+} 13.218+ 13.219+defn srcline(addr) 13.220+{ 13.221+ local text, cline, line, file, src; 13.222+ file = pcfile(addr); 13.223+ src = match(file,srcfiles); 13.224+ if (src>=0) then 13.225+ src = srctext[src]; 13.226+ else 13.227+ src = findsrc(file); 13.228+ if (src=={}) then 13.229+ { 13.230+ return "(no source)"; 13.231+ } 13.232+ return src[pcline(addr)-1]; 13.233+} 13.234+ 13.235+defn src(addr) 13.236+{ 13.237+ local src, file, line, cline, text; 13.238+ 13.239+ file = pcfile(addr); 13.240+ src = match(file, srcfiles); 13.241+ 13.242+ if src >= 0 then 13.243+ src = srctext[src]; 13.244+ else 13.245+ src = findsrc(file); 13.246+ 13.247+ if src == {} then { 13.248+ print("no source for ", file, "\n"); 13.249+ return {}; 13.250+ } 13.251+ 13.252+ cline = pcline(addr)-1; 13.253+ print(file, ":", cline+1, "\n"); 13.254+ line = cline-5; 13.255+ loop 0,10 do { 13.256+ if line >= 0 then { 13.257+ text = src[line]; 13.258+ if text == {} then 13.259+ return {}; 13.260+ if line == cline then 13.261+ print(">"); 13.262+ else 13.263+ print(" "); 13.264+ print(line+1, "\t", text, "\n"); 13.265+ } 13.266+ line = line+1; 13.267+ } 13.268+} 13.269+ 13.270+defn step() // single step the process 13.271+{ 13.272+ local lst, lpl, addr, bput; 13.273+ 13.274+ bput = 0; 13.275+ if match(*PC, bplist) >= 0 then { // Sitting on a breakpoint 13.276+ bput = fmt(*PC, bpfmt); 13.277+ *bput = @bput; 13.278+ } 13.279+ 13.280+ lst = follow(*PC); 13.281+ 13.282+ lpl = lst; 13.283+ while lpl do { // place break points 13.284+ *(head lpl) = bpinst; 13.285+ lpl = tail lpl; 13.286+ } 13.287+ 13.288+ startstop(pid); // do the step 13.289+ 13.290+ while lst do { // remove the breakpoints 13.291+ addr = fmt(head lst, bpfmt); 13.292+ *addr = @addr; 13.293+ lst = tail lst; 13.294+ } 13.295+ if bput != 0 then 13.296+ *bput = bpinst; 13.297+} 13.298+ 13.299+defn bpset(addr) // set a breakpoint 13.300+{ 13.301+ if status(pid) != "Stopped" then { 13.302+ print("Waiting...\n"); 13.303+ stop(pid); 13.304+ } 13.305+ if match(addr, bplist) >= 0 then 13.306+ print("breakpoint already set at ", fmt(addr, 'a'), "\n"); 13.307+ else { 13.308+ *fmt(addr, bpfmt) = bpinst; 13.309+ bplist = append bplist, addr; 13.310+ } 13.311+} 13.312+ 13.313+defn bptab() // print a table of breakpoints 13.314+{ 13.315+ local lst, addr; 13.316+ 13.317+ lst = bplist; 13.318+ while lst do { 13.319+ addr = head lst; 13.320+ print("\t", fmt(addr, 'X'), " ", fmt(addr, 'a'), " ", fmt(addr, 'i'), "\n"); 13.321+ lst = tail lst; 13.322+ } 13.323+} 13.324+ 13.325+defn bpdel(addr) // delete a breakpoint 13.326+{ 13.327+ local n, pc, nbplist; 13.328+ 13.329+ n = match(addr, bplist); 13.330+ if n < 0 then { 13.331+ print("no breakpoint at ", fmt(addr, 'a'), "\n"); 13.332+ return {}; 13.333+ } 13.334+ 13.335+ addr = fmt(addr, bpfmt); 13.336+ *addr = @addr; 13.337+ 13.338+ nbplist = {}; // delete from list 13.339+ while bplist do { 13.340+ pc = head bplist; 13.341+ if pc != addr then 13.342+ nbplist = append nbplist, pc; 13.343+ bplist = tail bplist; 13.344+ } 13.345+ bplist = nbplist; // delete from memory 13.346+} 13.347+ 13.348+defn cont() // continue execution 13.349+{ 13.350+ local addr; 13.351+ 13.352+ addr = fmt(*PC, bpfmt); 13.353+ if match(addr, bplist) >= 0 then { // Sitting on a breakpoint 13.354+ *addr = @addr; 13.355+ step(); // Step over 13.356+ *addr = bpinst; 13.357+ } 13.358+ startstop(pid); // Run 13.359+} 13.360+ 13.361+defn stopped(pid) // called from acid when a process changes state 13.362+{ 13.363+ pstop(pid); // stub so this is easy to replace 13.364+} 13.365+ 13.366+defn procs() // print status of processes 13.367+{ 13.368+ local c, lst, cpid; 13.369+ 13.370+ cpid = pid; 13.371+ lst = proclist; 13.372+ while lst do { 13.373+ np = head lst; 13.374+ setproc(np); 13.375+ if np == cpid then 13.376+ c = '>'; 13.377+ else 13.378+ c = ' '; 13.379+ print(fmt(c, 'c'), np, ": ", status(np), " at ", fmt(*PC, 'a'), " setproc(", np, ")\n"); 13.380+ lst = tail lst; 13.381+ } 13.382+ pid = cpid; 13.383+ if pid != 0 then 13.384+ setproc(pid); 13.385+} 13.386+ 13.387+_asmlines = 30; 13.388+ 13.389+defn asm(addr) 13.390+{ 13.391+ local bound; 13.392+ 13.393+ bound = fnbound(addr); 13.394+ 13.395+ addr = fmt(addr, 'i'); 13.396+ loop 1,_asmlines do { 13.397+ print(fmt(addr, 'a'), " ", fmt(addr, 'X')); 13.398+ print("\t", @addr++, "\n"); 13.399+ if bound != {} && addr > bound[1] then { 13.400+ lasmaddr = addr; 13.401+ return {}; 13.402+ } 13.403+ } 13.404+ lasmaddr = addr; 13.405+} 13.406+ 13.407+defn casm() 13.408+{ 13.409+ asm(lasmaddr); 13.410+} 13.411+ 13.412+defn win() 13.413+{ 13.414+ local npid, estr; 13.415+ 13.416+ bplist = {}; 13.417+ notes = {}; 13.418+ 13.419+ estr = "/sys/lib/acid/window '0 0 600 400' "+textfile; 13.420+ if progargs != "" then 13.421+ estr = estr+" "+progargs; 13.422+ 13.423+ npid = rc(estr); 13.424+ npid = atoi(npid); 13.425+ if npid == 0 then 13.426+ error("win failed to create process"); 13.427+ 13.428+ setproc(npid); 13.429+ stopped(npid); 13.430+} 13.431+ 13.432+defn win2() 13.433+{ 13.434+ local npid, estr; 13.435+ 13.436+ bplist = {}; 13.437+ notes = {}; 13.438+ 13.439+ estr = "/sys/lib/acid/transcript '0 0 600 400' '100 100 700 500' "+textfile; 13.440+ if progargs != "" then 13.441+ estr = estr+" "+progargs; 13.442+ 13.443+ npid = rc(estr); 13.444+ npid = atoi(npid); 13.445+ if npid == 0 then 13.446+ error("win failed to create process"); 13.447+ 13.448+ setproc(npid); 13.449+ stopped(npid); 13.450+} 13.451+ 13.452+defn new() 13.453+{ 13.454+ bplist = {}; 13.455+ newproc(progargs); 13.456+ // Dont miss the delay slot calls 13.457+ bpset(follow(main)[0]); 13.458+ cont(); 13.459+ bpdel(*PC); 13.460+} 13.461+ 13.462+defn stmnt() // step one statement 13.463+{ 13.464+ local line; 13.465+ 13.466+ line = pcline(*PC); 13.467+ while 1 do { 13.468+ step(); 13.469+ if line != pcline(*PC) then { 13.470+ src(*PC); 13.471+ return {}; 13.472+ } 13.473+ } 13.474+} 13.475+ 13.476+defn func() // step until we leave the current function 13.477+{ 13.478+ local bound, end, start, pc; 13.479+ 13.480+ bound = fnbound(*PC); 13.481+ if bound == {} then { 13.482+ print("cannot locate text symbol\n"); 13.483+ return {}; 13.484+ } 13.485+ 13.486+ pc = *PC; 13.487+ start = bound[0]; 13.488+ end = bound[1]; 13.489+ while pc >= start && pc < end do { 13.490+ step(); 13.491+ pc = *PC; 13.492+ } 13.493+} 13.494+ 13.495+defn next() 13.496+{ 13.497+ local sp, bound; 13.498+ 13.499+ sp = *SP; 13.500+ bound = fnbound(*PC); 13.501+ stmnt(); 13.502+ pc = *PC; 13.503+ if pc >= bound[0] && pc < bound[1] then 13.504+ return {}; 13.505+ 13.506+ while (pc < bound[0] || pc > bound[1]) && sp >= *SP do { 13.507+ step(); 13.508+ pc = *PC; 13.509+ } 13.510+ src(*PC); 13.511+} 13.512+ 13.513+defn dump(addr, n, fmt) 13.514+{ 13.515+ // see definition of dump in acid manual: it does n+1 iterations 13.516+ loop 0, n do { 13.517+ print(fmt(addr, 'X'), ": "); 13.518+ addr = mem(addr, fmt); 13.519+ } 13.520+} 13.521+ 13.522+defn mem(addr, fmt) 13.523+{ 13.524+ 13.525+ local i, c, n; 13.526+ 13.527+ i = 0; 13.528+ while fmt[i] != 0 do { 13.529+ c = fmt[i]; 13.530+ n = 0; 13.531+ while '0' <= fmt[i] && fmt[i] <= '9' do { 13.532+ n = 10*n + fmt[i]-'0'; 13.533+ i = i+1; 13.534+ } 13.535+ if n <= 0 then n = 1; 13.536+ addr = fmt(addr, fmt[i]); 13.537+ while n > 0 do { 13.538+ print(*addr++, " "); 13.539+ n = n-1; 13.540+ } 13.541+ i = i+1; 13.542+ } 13.543+ print("\n"); 13.544+ return addr; 13.545+} 13.546+ 13.547+defn symbols(pattern) 13.548+{ 13.549+ local l, s; 13.550+ 13.551+ l = symbols; 13.552+ while l do { 13.553+ s = head l; 13.554+ if regexp(pattern, s[0]) then 13.555+ print(s[0], "\t", s[1], "\t", s[2], "\n"); 13.556+ l = tail l; 13.557+ } 13.558+} 13.559+ 13.560+defn spsrch(len) 13.561+{ 13.562+ local addr, a, s, e; 13.563+ 13.564+ addr = *SP; 13.565+ s = origin & 0x7fffffff; 13.566+ e = etext & 0x7fffffff; 13.567+ loop 1, len do { 13.568+ a = *addr++; 13.569+ c = a & 0x7fffffff; 13.570+ if c > s && c < e then { 13.571+ print("src(", a, ")\n"); 13.572+ pfl(a); 13.573+ } 13.574+ } 13.575+} 13.576+ 13.577+progargs=""; 13.578+print("/sys/lib/acid/port");
14.1new file mode 100755 14.2--- /dev/null 14.3+++ b/sys/lib/acid/power 14.4@@ -0,0 +1,120 @@ 14.5+// Power PC support 14.6+ 14.7+defn acidinit() // Called after all the init modules are loaded 14.8+{ 14.9+ bplist = {}; 14.10+ bpfmt = 'X'; 14.11+ 14.12+ srcpath = { 14.13+ "./", 14.14+ "/sys/src/libc/port/", 14.15+ "/sys/src/libc/9sys/", 14.16+ "/sys/src/libc/power/" 14.17+ }; 14.18+ 14.19+ srcfiles = {}; // list of loaded files 14.20+ srctext = {}; // the text of the files 14.21+} 14.22+ 14.23+defn stk() // trace 14.24+{ 14.25+ _stk(*PC, *SP, linkreg(0), 0); 14.26+} 14.27+ 14.28+defn lstk() // trace with locals 14.29+{ 14.30+ _stk(*PC, *SP, linkreg(0), 1); 14.31+} 14.32+ 14.33+defn gpr() // print general purpose registers 14.34+{ 14.35+ print("SP\t", *SP, " R2\t", *R2, " R3\t", *R3, "\n"); 14.36+ print("R4\t", *R4, " R5\t", *R5, " R6\t", *R6, "\n"); 14.37+ print("R7\t", *R7, " R8\t", *R8, " R9\t", *R9, "\n"); 14.38+ print("R10\t", *R10, " R11\t", *R11, " R12\t", *R12, "\n"); 14.39+ print("R13\t", *R13, " R14\t", *R14, " R15\t", *R15, "\n"); 14.40+ print("R16\t", *R16, " R17\t", *R17, " R18\t", *R18, "\n"); 14.41+ print("R19\t", *R19, " R20\t", *R20, " R21\t", *R21, "\n"); 14.42+ print("R22\t", *R22, " R23\t", *R23, " R24\t", *R24, "\n"); 14.43+ print("R25\t", *R25, " R26\t", *R26, " R27\t", *R27, "\n"); 14.44+ print("R28\t", *R28, " R29\t", *R29, " R30\t", *R30, "\n"); 14.45+ print("R31\t", *R31, "\n"); 14.46+} 14.47+ 14.48+defn Fpr() 14.49+{ 14.50+ fpr(); 14.51+} 14.52+ 14.53+defn fpr() 14.54+{ 14.55+ print("F0\t", *fmt(F0, 'G'), "\tF1\t", *fmt(F1, 'G'), "\n"); 14.56+ print("F2\t", *fmt(F2, 'G'), "\tF3\t", *fmt(F3, 'G'), "\n"); 14.57+ print("F4\t", *fmt(F4, 'G'), "\tF5\t", *fmt(F5, 'G'), "\n"); 14.58+ print("F6\t", *fmt(F6, 'G'), "\tF7\t", *fmt(F7, 'G'), "\n"); 14.59+ print("F8\t", *fmt(F8, 'G'), "\tF9\t", *fmt(F9, 'G'), "\n"); 14.60+ print("F10\t", *fmt(F10, 'G'), "\tF11\t", *fmt(F11, 'G'), "\n"); 14.61+ print("F12\t", *fmt(F12, 'G'), "\tF13\t", *fmt(F13, 'G'), "\n"); 14.62+ print("F14\t", *fmt(F14, 'G'), "\tF15\t", *fmt(F15, 'G'), "\n"); 14.63+ print("F16\t", *fmt(F16, 'G'), "\tF17\t", *fmt(F17, 'G'), "\n"); 14.64+ print("F18\t", *fmt(F18, 'G'), "\tF19\t", *fmt(F19, 'G'), "\n"); 14.65+ print("F20\t", *fmt(F20, 'G'), "\tF21\t", *fmt(F21, 'G'), "\n"); 14.66+ print("F22\t", *fmt(F22, 'G'), "\tF23\t", *fmt(F23, 'G'), "\n"); 14.67+ print("F24\t", *fmt(F24, 'G'), "\tF25\t", *fmt(F25, 'G'), "\n"); 14.68+ print("F26\t", *fmt(F26, 'G'), "\tF27\t", *fmt(F27, 'G'), "\n"); 14.69+ print("F28\t", *fmt(F28, 'G'), "\tF29\t", *fmt(F29, 'G'), "\n"); 14.70+ print("F30\t", *fmt(F30, 'G'), "\tF31\t", *fmt(F31, 'G'), "\n"); 14.71+} 14.72+ 14.73+defn spr() // print special processor registers 14.74+{ 14.75+ local pc, link, cause; 14.76+ 14.77+ pc = *PC; 14.78+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 14.79+ pfl(pc); 14.80+ 14.81+ link = *R31; 14.82+ print("SP\t", *SP, "\tLINK\t", link, " ", fmt(link, 'a'), " "); 14.83+ pfl(link); 14.84+ 14.85+ cause = *CAUSE; 14.86+ print("SRR1\t", *SRR1, "\tCAUSE\t", cause, " ", reason(cause), "\n"); 14.87+ print("LR\t", *LR, "\tCR\t", *CR, "\n"); 14.88+ 14.89+ print("XER\t", *XER, "\tCTR\t", *CTR, "\n"); 14.90+} 14.91+ 14.92+defn regs() // print all registers 14.93+{ 14.94+ spr(); 14.95+ gpr(); 14.96+} 14.97+ 14.98+defn pstop(pid) 14.99+{ 14.100+ local l, pc; 14.101+ 14.102+ pc = *PC; 14.103+ 14.104+ print(pid,": ", reason(*CAUSE), "\t"); 14.105+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 14.106+ 14.107+ if notes then { 14.108+ if notes[0] != "sys: breakpoint" then { 14.109+ print("Notes pending:\n"); 14.110+ l = notes; 14.111+ while l do { 14.112+ print("\t", head l, "\n"); 14.113+ l = tail l; 14.114+ } 14.115+ } 14.116+ } 14.117+} 14.118+ 14.119+defn linkreg(addr) 14.120+{ 14.121+ return *LR; 14.122+} 14.123+ 14.124+print("/sys/lib/acid/power");
15.1new file mode 100755 15.2--- /dev/null 15.3+++ b/sys/lib/acid/sparc 15.4@@ -0,0 +1,218 @@ 15.5+// Sparc support 15.6+ 15.7+defn acidinit() // Called after all the init modules are loaded 15.8+{ 15.9+ bplist = {}; 15.10+ bpfmt = 'X'; 15.11+ 15.12+ srcpath = { 15.13+ "./", 15.14+ "/sys/src/libc/port/", 15.15+ "/sys/src/libc/9sys/", 15.16+ "/sys/src/libc/sparc/" 15.17+ }; 15.18+ 15.19+ srcfiles = {}; // list of loaded files 15.20+ srctext = {}; // the text of the files 15.21+} 15.22+ 15.23+defn stk() // trace 15.24+{ 15.25+ _stk(*PC, *R1, linkreg(0), 0); 15.26+} 15.27+ 15.28+defn lstk() // trace with locals 15.29+{ 15.30+ _stk(*PC, *R1, linkreg(0), 1); 15.31+} 15.32+ 15.33+defn gpr() // print general purpose registers 15.34+{ 15.35+ print("R1\t", *R1, "R2\t", *R2, "R3\t", *R3, "\n"); 15.36+ print("R4\t", *R4, "R5\t", *R5, "R6\t", *R6, "\n"); 15.37+ print("R7\t", *R7, "R8\t", *R8, "R9\t", *R9, "\n"); 15.38+ print("R10\t", *R10, "R11\t", *R11, "R12\t", *R12, "\n"); 15.39+ print("R13\t", *R13, "R14\t", *R14, "R15\t", *R15, "\n"); 15.40+ print("R16\t", *R16, "R17\t", *R17, "R18\t", *R18, "\n"); 15.41+ print("R19\t", *R19, "R20\t", *R20, "R21\t", *R21, "\n"); 15.42+ print("R22\t", *R22, "R23\t", *R23, "R24\t", *R24, "\n"); 15.43+ print("R25\t", *R25, "R26\t", *R26, "R27\t", *R27, "\n"); 15.44+ print("R28\t", *R28, "R29\t", *R29, "R30\t", *R30, "\n"); 15.45+ print("R31\t", *R31, "\n"); 15.46+} 15.47+ 15.48+defn spr() // print special processor registers 15.49+{ 15.50+ local pc; 15.51+ local link; 15.52+ local cause; 15.53+ 15.54+ pc = *PC; 15.55+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 15.56+ pfl(pc); 15.57+ print("PSR\t", *PSR, "\n"); 15.58+ 15.59+ link = *R15; 15.60+ print("SP\t", *R1, "\tLINK\t\t", link, " ", fmt(link, 'a')); 15.61+ pfl(link); 15.62+ 15.63+ cause = *TBR; 15.64+ print("Y\t", *Y, "\tCAUSE\t", *Y, cause, " ", reason(cause), "\n"); 15.65+} 15.66+ 15.67+defn Fpr() 15.68+{ 15.69+ print("F0\t", *fmt(F0, 'G'), "\tF2\t", *fmt(F2, 'G'), "\n"); 15.70+ print("F4\t", *fmt(F4, 'G'), "\tF6\t", *fmt(F6, 'G'), "\n"); 15.71+ print("F8\t", *fmt(F8, 'G'), "\tF10\t", *fmt(F10, 'G'), "\n"); 15.72+ print("F12\t", *fmt(F12, 'G'), "\tF14\t", *fmt(F14, 'G'), "\n"); 15.73+ print("F16\t", *fmt(F16, 'G'), "\tF18\t", *fmt(F18, 'G'), "\n"); 15.74+ print("F20\t", *fmt(F20, 'G'), "\tF22\t", *fmt(F22, 'G'), "\n"); 15.75+ print("F24\t", *fmt(F24, 'G'), "\tF26\t", *fmt(F26, 'G'), "\n"); 15.76+ print("F28\t", *fmt(F28, 'G'), "\tF30\t", *fmt(F30, 'G'), "\n"); 15.77+} 15.78+ 15.79+defn fpr() 15.80+{ 15.81+ print("F0\t", *fmt(F0, 'g'), "\tF1\t", *fmt(F1, 'g'), "\n"); 15.82+ print("F2\t", *fmt(F2, 'g'), "\tF3\t", *fmt(F3, 'g'), "\n"); 15.83+ print("F4\t", *fmt(F4, 'g'), "\tF5\t", *fmt(F5, 'g'), "\n"); 15.84+ print("F6\t", *fmt(F6, 'g'), "\tF7\t", *fmt(F7, 'g'), "\n"); 15.85+ print("F8\t", *fmt(F8, 'g'), "\tF9\t", *fmt(F9, 'g'), "\n"); 15.86+ print("F10\t", *fmt(F10, 'g'), "\tF11\t", *fmt(F11, 'g'), "\n"); 15.87+ print("F12\t", *fmt(F12, 'g'), "\tF13\t", *fmt(F13, 'g'), "\n"); 15.88+ print("F14\t", *fmt(F14, 'g'), "\tF15\t", *fmt(F15, 'g'), "\n"); 15.89+ print("F16\t", *fmt(F16, 'g'), "\tF17\t", *fmt(F17, 'g'), "\n"); 15.90+ print("F18\t", *fmt(F18, 'g'), "\tF19\t", *fmt(F19, 'g'), "\n"); 15.91+ print("F20\t", *fmt(F20, 'g'), "\tF21\t", *fmt(F21, 'g'), "\n"); 15.92+ print("F22\t", *fmt(F22, 'g'), "\tF23\t", *fmt(F23, 'g'), "\n"); 15.93+ print("F24\t", *fmt(F24, 'g'), "\tF25\t", *fmt(F25, 'g'), "\n"); 15.94+ print("F26\t", *fmt(F26, 'g'), "\tF27\t", *fmt(F27, 'g'), "\n"); 15.95+ print("F28\t", *fmt(F28, 'g'), "\tF29\t", *fmt(F29, 'g'), "\n"); 15.96+ print("F30\t", *fmt(F30, 'g'), "\tF31\t", *fmt(F31, 'g'), "\n"); 15.97+} 15.98+ 15.99+defn regs() // print all registers 15.100+{ 15.101+ spr(); 15.102+ gpr(); 15.103+} 15.104+ 15.105+defn pstop(pid) 15.106+{ 15.107+ local l; 15.108+ local pc; 15.109+ 15.110+ pc = *PC; 15.111+ 15.112+ print(pid,": ", reason(*TBR), "\t"); 15.113+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 15.114+ 15.115+ if notes then { 15.116+ if notes[0] != "sys: breakpoint" then { 15.117+ print("Notes pending:\n"); 15.118+ l = notes; 15.119+ while l do { 15.120+ print("\t", head l, "\n"); 15.121+ l = tail l; 15.122+ } 15.123+ } 15.124+ } 15.125+} 15.126+ 15.127+aggr Ureg 15.128+{ 15.129+ 'U' 0 r0; 15.130+ { 15.131+ 'U' 4 sp; 15.132+ 'U' 4 usp; 15.133+ 'U' 4 r1; 15.134+ }; 15.135+ 'U' 8 r2; 15.136+ 'U' 12 r3; 15.137+ 'U' 16 r4; 15.138+ 'U' 20 r5; 15.139+ 'U' 24 r6; 15.140+ 'U' 28 r7; 15.141+ 'U' 32 r8; 15.142+ 'U' 36 r9; 15.143+ 'U' 40 r10; 15.144+ 'U' 44 r11; 15.145+ 'U' 48 r12; 15.146+ 'U' 52 r13; 15.147+ 'U' 56 r14; 15.148+ 'U' 60 r15; 15.149+ 'U' 64 r16; 15.150+ 'U' 68 r17; 15.151+ 'U' 72 r18; 15.152+ 'U' 76 r19; 15.153+ 'U' 80 r20; 15.154+ 'U' 84 r21; 15.155+ 'U' 88 r22; 15.156+ 'U' 92 r23; 15.157+ 'U' 96 r24; 15.158+ 'U' 100 r25; 15.159+ 'U' 104 r26; 15.160+ 'U' 108 r27; 15.161+ 'U' 112 r28; 15.162+ 'U' 116 r29; 15.163+ 'U' 120 r30; 15.164+ 'U' 124 r31; 15.165+ 'U' 128 y; 15.166+ 'U' 132 tbr; 15.167+ 'U' 136 psr; 15.168+ 'U' 140 npc; 15.169+ 'U' 144 pc; 15.170+ 'U' 148 pad; 15.171+}; 15.172+ 15.173+defn 15.174+Ureg(addr) { 15.175+ complex Ureg addr; 15.176+ print(" r0 ", addr.r0, "\n"); 15.177+ print(" sp ", addr.sp, "\n"); 15.178+ print(" r2 ", addr.r2, "\n"); 15.179+ print(" r3 ", addr.r3, "\n"); 15.180+ print(" r4 ", addr.r4, "\n"); 15.181+ print(" r5 ", addr.r5, "\n"); 15.182+ print(" r6 ", addr.r6, "\n"); 15.183+ print(" r7 ", addr.r7, "\n"); 15.184+ print(" r8 ", addr.r8, "\n"); 15.185+ print(" r9 ", addr.r9, "\n"); 15.186+ print(" r10 ", addr.r10, "\n"); 15.187+ print(" r11 ", addr.r11, "\n"); 15.188+ print(" r12 ", addr.r12, "\n"); 15.189+ print(" r13 ", addr.r13, "\n"); 15.190+ print(" r14 ", addr.r14, "\n"); 15.191+ print(" r15 ", addr.r15, "\n"); 15.192+ print(" r16 ", addr.r16, "\n"); 15.193+ print(" r17 ", addr.r17, "\n"); 15.194+ print(" r18 ", addr.r18, "\n"); 15.195+ print(" r19 ", addr.r19, "\n"); 15.196+ print(" r20 ", addr.r20, "\n"); 15.197+ print(" r21 ", addr.r21, "\n"); 15.198+ print(" r22 ", addr.r22, "\n"); 15.199+ print(" r23 ", addr.r23, "\n"); 15.200+ print(" r24 ", addr.r24, "\n"); 15.201+ print(" r25 ", addr.r25, "\n"); 15.202+ print(" r26 ", addr.r26, "\n"); 15.203+ print(" r27 ", addr.r27, "\n"); 15.204+ print(" r28 ", addr.r28, "\n"); 15.205+ print(" r29 ", addr.r29, "\n"); 15.206+ print(" r30 ", addr.r30, "\n"); 15.207+ print(" r31 ", addr.r31, "\n"); 15.208+ print(" y ", addr.y, "\n"); 15.209+ print(" tbr ", addr.tbr, "\n"); 15.210+ print(" psr ", addr.psr, "\n"); 15.211+ print(" npc ", addr.npc, "\n"); 15.212+ print(" pc ", addr.pc, "\n"); 15.213+ print(" pad ", addr.pad, "\n"); 15.214+}; 15.215+ 15.216+defn linkreg(addr) 15.217+{ 15.218+ complex Ureg addr; 15.219+ return addr.r15\X; 15.220+} 15.221+ 15.222+print("/sys/lib/acid/sparc");
16.1new file mode 100755 16.2--- /dev/null 16.3+++ b/sys/lib/acid/sparc64 16.4@@ -0,0 +1,222 @@ 16.5+// Sparc64 support 16.6+ 16.7+defn acidinit() // Called after all the init modules are loaded 16.8+{ 16.9+ bplist = {}; 16.10+ bpfmt = 'X'; 16.11+ 16.12+ srcpath = { 16.13+ "./", 16.14+ "/sys/src/libc/port/", 16.15+ "/sys/src/libc/9sys/", 16.16+ "/sys/src/libc/sparc64/" 16.17+ }; 16.18+ 16.19+ srcfiles = {}; // list of loaded files 16.20+ srctext = {}; // the text of the files 16.21+} 16.22+ 16.23+defn linkreg(addr) 16.24+{ 16.25+ complex Ureg addr; 16.26+ return addr.r15\X; 16.27+} 16.28+ 16.29+defn stk() // trace 16.30+{ 16.31+ _stk(*PC, *SP, linkreg(0), 0); 16.32+} 16.33+ 16.34+defn lstk() // trace with locals 16.35+{ 16.36+ _stk(*PC, *SP, linkreg(0), 1); 16.37+} 16.38+ 16.39+defn gpr() // print general purpose registers 16.40+{ 16.41+ print("SP\t", *SP, "R2\t", *R2, "R3\t", *R3, "\n"); 16.42+ print("R4\t", *R4, "R5\t", *R5, "R6\t", *R6, "\n"); 16.43+ print("R7\t", *R7, "R8\t", *R8, "R9\t", *R9, "\n"); 16.44+ print("R10\t", *R10, "R11\t", *R11, "R12\t", *R12, "\n"); 16.45+ print("R13\t", *R13, "R14\t", *R14, "R15\t", *R15, "\n"); 16.46+ print("R16\t", *R16, "R17\t", *R17, "R18\t", *R18, "\n"); 16.47+ print("R19\t", *R19, "R20\t", *R20, "R21\t", *R21, "\n"); 16.48+ print("R22\t", *R22, "R23\t", *R23, "R24\t", *R24, "\n"); 16.49+ print("R25\t", *R25, "R26\t", *R26, "R27\t", *R27, "\n"); 16.50+ print("R28\t", *R28, "R29\t", *R29, "R30\t", *R30, "\n"); 16.51+ print("R31\t", *R31, "\n"); 16.52+} 16.53+ 16.54+defn spr() // print special processor registers 16.55+{ 16.56+ local pc; 16.57+ local link; 16.58+ local cause; 16.59+ 16.60+ pc = *PC; 16.61+ npc = *NPC; 16.62+ print("PC\t", pc, " ", fmt(pc, 'a'), " "); 16.63+ pfl(pc); 16.64+ print("NPC\t", npc, " ", fmt(npc, 'a'), " "); 16.65+ pfl(npc); 16.66+ print("PSTATE\t", *PSTATE, "\n"); 16.67+ 16.68+ link = *R15; 16.69+ print("SP\t", *SP, "\tLINK\t\t", link, " ", fmt(link, 'a')); 16.70+ pfl(link); 16.71+ 16.72+ cause = *TT; 16.73+ print("Y\t", *Y, "\tCAUSE\t", cause, " ", reason(cause), "\n"); 16.74+} 16.75+ 16.76+defn Fpr() 16.77+{ 16.78+ print("F0\t", *fmt(F0, 'G'), "\tF2\t", *fmt(F2, 'G'), "\n"); 16.79+ print("F4\t", *fmt(F4, 'G'), "\tF6\t", *fmt(F6, 'G'), "\n"); 16.80+ print("F8\t", *fmt(F8, 'G'), "\tF10\t", *fmt(F10, 'G'), "\n"); 16.81+ print("F12\t", *fmt(F12, 'G'), "\tF14\t", *fmt(F14, 'G'), "\n"); 16.82+ print("F16\t", *fmt(F16, 'G'), "\tF18\t", *fmt(F18, 'G'), "\n"); 16.83+ print("F20\t", *fmt(F20, 'G'), "\tF22\t", *fmt(F22, 'G'), "\n"); 16.84+ print("F24\t", *fmt(F24, 'G'), "\tF26\t", *fmt(F26, 'G'), "\n"); 16.85+ print("F28\t", *fmt(F28, 'G'), "\tF30\t", *fmt(F30, 'G'), "\n"); 16.86+} 16.87+ 16.88+defn fpr() 16.89+{ 16.90+ print("F0\t", *fmt(F0, 'g'), "\tF1\t", *fmt(F1, 'g'), "\n"); 16.91+ print("F2\t", *fmt(F2, 'g'), "\tF3\t", *fmt(F3, 'g'), "\n"); 16.92+ print("F4\t", *fmt(F4, 'g'), "\tF5\t", *fmt(F5, 'g'), "\n"); 16.93+ print("F6\t", *fmt(F6, 'g'), "\tF7\t", *fmt(F7, 'g'), "\n"); 16.94+ print("F8\t", *fmt(F8, 'g'), "\tF9\t", *fmt(F9, 'g'), "\n"); 16.95+ print("F10\t", *fmt(F10, 'g'), "\tF11\t", *fmt(F11, 'g'), "\n"); 16.96+ print("F12\t", *fmt(F12, 'g'), "\tF13\t", *fmt(F13, 'g'), "\n"); 16.97+ print("F14\t", *fmt(F14, 'g'), "\tF15\t", *fmt(F15, 'g'), "\n"); 16.98+ print("F16\t", *fmt(F16, 'g'), "\tF17\t", *fmt(F17, 'g'), "\n"); 16.99+ print("F18\t", *fmt(F18, 'g'), "\tF19\t", *fmt(F19, 'g'), "\n"); 16.100+ print("F20\t", *fmt(F20, 'g'), "\tF21\t", *fmt(F21, 'g'), "\n"); 16.101+ print("F22\t", *fmt(F22, 'g'), "\tF23\t", *fmt(F23, 'g'), "\n"); 16.102+ print("F24\t", *fmt(F24, 'g'), "\tF25\t", *fmt(F25, 'g'), "\n"); 16.103+ print("F26\t", *fmt(F26, 'g'), "\tF27\t", *fmt(F27, 'g'), "\n"); 16.104+ print("F28\t", *fmt(F28, 'g'), "\tF29\t", *fmt(F29, 'g'), "\n"); 16.105+ print("F30\t", *fmt(F30, 'g'), "\tF31\t", *fmt(F31, 'g'), "\n"); 16.106+} 16.107+ 16.108+defn regs() // print all registers 16.109+{ 16.110+ spr(); 16.111+ gpr(); 16.112+} 16.113+ 16.114+defn pstop(pid) 16.115+{ 16.116+ local l; 16.117+ local pc; 16.118+ 16.119+ pc = *PC; 16.120+ 16.121+ print(pid,": ", reason(*TT), "\t"); 16.122+ print(fmt(pc, 'a'), "\t", fmt(pc, 'i'), "\n"); 16.123+ 16.124+ if notes then { 16.125+ if notes[0] != "sys: breakpoint" then { 16.126+ print("Notes pending:\n"); 16.127+ l = notes; 16.128+ while l do { 16.129+ print("\t", head l, "\n"); 16.130+ l = tail l; 16.131+ } 16.132+ } 16.133+ } 16.134+} 16.135+ 16.136+aggr Ureg 16.137+{ 16.138+ 'U' 0 r0; 16.139+ { 16.140+ 'U' 4 sp; 16.141+ 'U' 4 usp; 16.142+ 'U' 4 r1; 16.143+ }; 16.144+ 'U' 8 r2; 16.145+ 'U' 12 r3; 16.146+ 'U' 16 r4; 16.147+ 'U' 20 r5; 16.148+ 'U' 24 r6; 16.149+ 'U' 28 r7; 16.150+ 'U' 32 r8; 16.151+ 'U' 36 r9; 16.152+ 'U' 40 r10; 16.153+ 'U' 44 r11; 16.154+ 'U' 48 r12; 16.155+ 'U' 52 r13; 16.156+ 'U' 56 r14; 16.157+ 'U' 60 r15; 16.158+ 'U' 64 r16; 16.159+ 'U' 68 r17; 16.160+ 'U' 72 r18; 16.161+ 'U' 76 r19; 16.162+ 'U' 80 r20; 16.163+ 'U' 84 r21; 16.164+ 'U' 88 r22; 16.165+ 'U' 92 r23; 16.166+ 'U' 96 r24; 16.167+ 'U' 100 r25; 16.168+ 'U' 104 r26; 16.169+ 'U' 108 r27; 16.170+ 'U' 112 r28; 16.171+ 'U' 116 r29; 16.172+ 'U' 120 r30; 16.173+ 'U' 124 r31; 16.174+ 'U' 128 y; 16.175+ 'U' 132 tt; 16.176+ 'U' 136 pstate; 16.177+ 'U' 140 npc; 16.178+ 'U' 144 pc; 16.179+ 'U' 148 pad; 16.180+}; 16.181+ 16.182+defn 16.183+Ureg(addr) { 16.184+ complex Ureg addr; 16.185+ print(" r0 ", addr.r0, "\n"); 16.186+ print(" sp ", addr.sp, "\n"); 16.187+ print(" r2 ", addr.r2, "\n"); 16.188+ print(" r3 ", addr.r3, "\n"); 16.189+ print(" r4 ", addr.r4, "\n"); 16.190+ print(" r5 ", addr.r5, "\n"); 16.191+ print(" r6 ", addr.r6, "\n"); 16.192+ print(" r7 ", addr.r7, "\n"); 16.193+ print(" r8 ", addr.r8, "\n"); 16.194+ print(" r9 ", addr.r9, "\n"); 16.195+ print(" r10 ", addr.r10, "\n"); 16.196+ print(" r11 ", addr.r11, "\n"); 16.197+ print(" r12 ", addr.r12, "\n"); 16.198+ print(" r13 ", addr.r13, "\n"); 16.199+ print(" r14 ", addr.r14, "\n"); 16.200+ print(" r15 ", addr.r15, "\n"); 16.201+ print(" r16 ", addr.r16, "\n"); 16.202+ print(" r17 ", addr.r17, "\n"); 16.203+ print(" r18 ", addr.r18, "\n"); 16.204+ print(" r19 ", addr.r19, "\n"); 16.205+ print(" r20 ", addr.r20, "\n"); 16.206+ print(" r21 ", addr.r21, "\n"); 16.207+ print(" r22 ", addr.r22, "\n"); 16.208+ print(" r23 ", addr.r23, "\n"); 16.209+ print(" r24 ", addr.r24, "\n"); 16.210+ print(" r25 ", addr.r25, "\n"); 16.211+ print(" r26 ", addr.r26, "\n"); 16.212+ print(" r27 ", addr.r27, "\n"); 16.213+ print(" r28 ", addr.r28, "\n"); 16.214+ print(" r29 ", addr.r29, "\n"); 16.215+ print(" r30 ", addr.r30, "\n"); 16.216+ print(" r31 ", addr.r31, "\n"); 16.217+ print(" y ", addr.y, "\n"); 16.218+ print(" tt ", addr.tt, "\n"); 16.219+ print(" pstate ", addr.pstate, "\n"); 16.220+ print(" npc ", addr.npc, "\n"); 16.221+ print(" pc ", addr.pc, "\n"); 16.222+ print(" pad ", addr.pad, "\n"); 16.223+}; 16.224+sizeofUreg = 152; 16.225+ 16.226+print("/sys/lib/acid/sparc64");
17.1new file mode 100755 17.2--- /dev/null 17.3+++ b/sys/lib/acid/syscall 17.4@@ -0,0 +1,196 @@ 17.5+// print system calls 17.6+defn printstring(s) 17.7+{ 17.8+ print("\"", s, "\""); 17.9+} 17.10+ 17.11+defn printtextordata(addr, n) 17.12+{ 17.13+ local a, i; 17.14+ 17.15+ a = addr\c; 17.16+ i = 0; 17.17+ loop 1, n do { 17.18+ if (a[i]>=127) then { 17.19+ print(fmt(addr, 'X'), ", ", n\D); 17.20+ return {}; 17.21+ } 17.22+ i = i+1; 17.23+ } 17.24+ 17.25+ print("\""); 17.26+ printstringn(addr, n); 17.27+ print("\""); 17.28+} 17.29+ 17.30+defn printstringn(s, n) 17.31+{ 17.32+ local m; 17.33+ 17.34+ m = n; 17.35+ if (m > 100) then m = 100; 17.36+ loop 1,m do { 17.37+ print(*(s\c)); s=s+1; 17.38+ } 17.39+ if(m != n) then print("..."); 17.40+} 17.41+ 17.42+defn printsyscall(name, fmt, arg) { 17.43+ local f, i, a, argp, sl; 17.44+ 17.45+ print(name, "("); 17.46+ i = 0; 17.47+ a = eval arg; 17.48+ while fmt[i] != 0 do { 17.49+ if fmt[i] == 's' then { 17.50+ if *a == 0 then 17.51+ print("nil"); 17.52+ else 17.53+ printstring(*(*a\s)); 17.54+ } else if fmt[i] == 'S' then { 17.55+ argp = *a; 17.56+ argl = {}; 17.57+ while *argp != 0 do { 17.58+ argl = append argl, *(*argp\s); 17.59+ argp++; 17.60+ } 17.61+ print(argl); 17.62+ } else if (fmt[i] == 'Z') && (~*a == 0) then { 17.63+ print("-1"); 17.64+ a++; // advance extra word for quadword 17.65+ } else if (fmt[i] == 'Y') || (fmt[i] == 'V') then { 17.66+ print(fmt(*a, fmt[i])); 17.67+ a++; // advance extra word for quadword 17.68+ } else if (fmt[i] == 'T') then { 17.69+ if *a == 0 then 17.70+ print("nil"); 17.71+ else 17.72+ printtextordata(*a, a[1]); 17.73+ } else 17.74+ print(fmt(*a, fmt[i])); 17.75+ if fmt[i+1] != 0 then 17.76+ print(", "); 17.77+ i = i+1; 17.78+ a++; 17.79+ } 17.80+ print(")\n"); 17.81+} 17.82+ 17.83+defn code(*e) { return e; } 17.84+ 17.85+syscalls = { 17.86+ { 0, {"sysr1", "s", code(0)}}, 17.87+ { 1, {"_errstr", "s", code(*sys_errstr:arg)}}, 17.88+ { 2, {"bind", "ssX", code(*sysbind:arg)}}, 17.89+ { 3, {"chdir", "s", code(*sysbind:arg)}}, 17.90+ { 4, {"close", "D", code(*sysclose:arg)}}, 17.91+ { 5, {"dup", "DD", code(*sysdup:arg)}}, 17.92+ { 6, {"alarm", "D", code(*sysalarm:arg)}}, 17.93+ { 7, {"exec", "sS", code(*sysexec:arg)}}, 17.94+ { 8, {"exits", "s", code(*sysexits:arg)}}, 17.95+ { 9, {"_fsession", "DX", code(*sys_fsession:arg)}}, 17.96+ {10, {"fauth", "DX", code(*sysfauth:arg)}}, 17.97+ {11, {"_fstat", "DX", code(*sys_fstat:arg)}}, 17.98+ {12, {"segbrk", "XX", code(*syssegbrk:arg)}}, 17.99+ {13, {"_mount", "DsXs", code(*sys_mount:arg)}}, 17.100+ {14, {"open", "sD", code(*sysopen:arg)}}, 17.101+ {15, {"_read", "DXD", code(*sys_read:arg)}}, 17.102+ {16, {"oseek", "DDD", code(*sysoseek:arg)}}, 17.103+ {17, {"sleep", "D", code(*syssleep:arg)}}, 17.104+ {18, {"_stat", "sX", code(*sys_stat:arg)}}, 17.105+ {19, {"rfork", "X", code(*sysstat:arg)}}, 17.106+ {20, {"_write", "DXD", code(*sys_write:arg)}}, 17.107+ {21, {"pipe", "X", code(*syspipe:arg)}}, 17.108+ {22, {"create", "sDO", code(*syscreate:arg)}}, 17.109+ {23, {"fd2path", "DXD", code(*sysfd2path:arg)}}, 17.110+ {24, {"brk_", "X", code(*sysbrk_:arg)}}, 17.111+ {25, {"remove", "s", code(*sysremove:arg)}}, 17.112+ {26, {"_wstat", "sX", code(*sys_wstat:arg)}}, 17.113+ {27, {"_fwstat", "DX", code(*sys_fwstat:arg)}}, 17.114+ {28, {"notify", "X", code(*sysnotify:arg)}}, 17.115+ {29, {"noted", "D", code(*sysnoted:arg)}}, 17.116+ {30, {"segattach", "DsXD", code(*syssegattach:arg)}}, 17.117+ {31, {"segdetach", "X", code(*syssegdetach:arg)}}, 17.118+ {32, {"segfree", "XD", code(*syssegfree:arg)}}, 17.119+ {33, {"segflush", "XD", code(*syssegflush:arg)}}, 17.120+ {34, {"rendezvous", "XX", code(*sysrendezvous:arg)}}, 17.121+ {35, {"unmount", "ss", code(*sysunmount:arg)}}, 17.122+ {36, {"_wait", "X", code(*sys_wait:arg)}}, 17.123+ {39, {"seek", "XDVD", code(*sysseek:arg)}}, 17.124+ {40, {"fversion", "DDsD", code(*sysfversion:arg)}}, 17.125+ {41, {"errstr", "TD", code(*syserrstr:arg)}}, 17.126+ {42, {"stat", "sXD", code(*sysstat:arg)}}, 17.127+ {43, {"fstat", "DXD", code(*sysfstat:arg)}}, 17.128+ {44, {"wstat", "sXD", code(*syswstat:arg)}}, 17.129+ {45, {"fwstat", "DXD", code(*sysfwstat:arg)}}, 17.130+ {46, {"mount", "DDsXs", code(*sysmount:arg)}}, 17.131+ {47, {"await", "TD", code(*sysawait:arg)}}, 17.132+ {50, {"pread", "DXDZ", code(*syspread:arg)}}, 17.133+ {51, {"pwrite", "DTDZ", code(*syspwrite:arg)}}, 17.134+}; 17.135+ 17.136+defn syscall() { 17.137+ local n, sl, h, p; 17.138+ 17.139+ map({"*data", 0, 0xffffffff, 0}); 17.140+ n = *syscall:scallnr; 17.141+ sl = syscalls; 17.142+ while sl != {} do { 17.143+ h = head sl; 17.144+ sl = tail sl; 17.145+ 17.146+ if n == h[0] then { 17.147+ p = h[1]; 17.148+ printsyscall(p[0], p[1], p[2]); 17.149+ } 17.150+ } 17.151+} 17.152+ 17.153+defn UPCSPRET() { 17.154+ // return sys call number, address of first argument, location of syscall return value 17.155+ if objtype == "386" then 17.156+ return { code(*(*PC-4)), code(*SP+4), code(*AX) }; 17.157+ if (objtype == "mips") || (objtype == "mips2") then 17.158+ return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R1) }; 17.159+ if objtype == "arm" then 17.160+ return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 17.161+ if objtype == "alpha" then 17.162+ return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 17.163+} 17.164+ 17.165+defn trapoffset() { 17.166+ // return offset from entry point to trap instr 17.167+ if objtype == "386" then return 5; 17.168+ if objtype == "mips" then return 8; 17.169+ if objtype == "mips2" then return 8; 17.170+ if objtype == "arm" then return 8; // untested 17.171+ if objtype == "alpha" then return 8; // untested 17.172+} 17.173+ 17.174+defn trapreason() { 17.175+ // return reason for trap 17.176+ if objtype == "386" then return reason(*TRAP); 17.177+ if objtype == "mips" then return reason(*CAUSE); 17.178+ if objtype == "mips2" then return reason(*CAUSE); 17.179+ if objtype == "arm" then return "unknown trap"; // untested 17.180+ if objtype == "alpha" then return reason(cause); // untested 17.181+} 17.182+ 17.183+ 17.184+defn usyscall() { // gives args for system call in user level; not useful with -k 17.185+ local n, sl, h, p; 17.186+ 17.187+ // stopped at TRAP instruction in system call library 17.188+ pcsp = UPCSPRET(); 17.189+ n = eval pcsp[0]; 17.190+ sl = syscalls; 17.191+ while sl != {} do { 17.192+ h = head sl; 17.193+ sl = tail sl; 17.194+ 17.195+ if n == h[0] then { 17.196+ p = h[1]; 17.197+ printsyscall(p[0], p[1], pcsp[1]); 17.198+ } 17.199+ } 17.200+}
18.1new file mode 100755 18.2--- /dev/null 18.3+++ b/sys/lib/acid/thread 18.4@@ -0,0 +1,374 @@ 18.5+include("/sys/src/libthread/sched.acid"); 18.6+ 18.7+defn labpc(l) 18.8+{ 18.9+ if objtype == "386" then 18.10+ return longjmp; 18.11+ return *(l+4); 18.12+} 18.13+ 18.14+defn labsp(l) 18.15+{ 18.16+ return *l; 18.17+} 18.18+ 18.19+defn labstk(l) 18.20+{ 18.21+ _stk(labpc(l), labsp(l), 0, 0); 18.22+} 18.23+ 18.24+defn lablstk(l) 18.25+{ 18.26+ _stk(labpc(l), labsp(l), 0, 1); 18.27+} 18.28+ 18.29+defn altfmt(A){ 18.30+ local i, s, yes; 18.31+ complex Alt A; 18.32+ 18.33+ s = "alt("; 18.34+ s = s + "tag(*" + itoa(A.tag, "%x") + "=" + itoa(*A.tag, "%x") + ") "; 18.35+ i = 0; 18.36+ yes = 0; 18.37+ while A.op != CHANEND && A.op != CHANNOBLK do{ 18.38+ if A.op != CHANNOP then{ 18.39+ if yes then s = s + " "; 18.40+ s = s + itoa(i, "%d"); 18.41+ s = s + ":"; 18.42+ if A.op == CHANSND then s = s + "send"; 18.43+ if A.op == CHANRCV then s = s + "recv"; 18.44+ s = s + "(channel("; 18.45+ s = s + itoa(A.c, "%x"); 18.46+ s = s + "))"; 18.47+ yes = 1; 18.48+ } 18.49+ i = i + 1; 18.50+ A = (Alt)(A + sizeofAlt); 18.51+ } 18.52+ if A.op==CHANNOBLK then{ 18.53+ if yes then s = s + " "; 18.54+ s = s + "noblock"; 18.55+ } 18.56+ s = s + ")"; 18.57+ return s; 18.58+} 18.59+ 18.60+defn alt(A){ 18.61+ print(altfmt(A), "\n"); 18.62+} 18.63+ 18.64+threadignsrc = { 18.65+ "^/sys/src/libc", 18.66+ "^/sys/src/libthread", 18.67+}; 18.68+ 18.69+defn fnname(a){ 18.70+ local sym, s; 18.71+ 18.72+ s = symbols; 18.73+ while s do { 18.74+ sym = head s; 18.75+ if sym[2] == a then 18.76+ return sym[0]; 18.77+ s = tail s; 18.78+ } 18.79+ if a == {} then 18.80+ return "{}"; 18.81+ return itoa(a\X, "%x"); 18.82+} 18.83+ 18.84+stkignorelist = {}; 18.85+ 18.86+defn stkignore(s){ 18.87+ append stkignorelist, s; 18.88+} 18.89+ 18.90+defn threadstkline(T){ 18.91+ local ostk, stk, frame, pc, pc0, file, lastpc0, s, sym, i, stop; 18.92+ 18.93+ if T.state == Running then{ 18.94+ pc = *PC; 18.95+ stk = strace(*PC, *SP, linkreg(0)); 18.96+ }else{ 18.97+ pc = labpc(T.sched); 18.98+ stk = strace(labpc(T.sched), labsp(T.sched), 0); 18.99+ } 18.100+ firstpc = pc; 18.101+ lastpc0 = 0; 18.102+ pc0 = 0; 18.103+ stop = 0; 18.104+ ostk = stk; 18.105+ while stk && !stop do { 18.106+ file = pcfile(pc); 18.107+ if !regexp("^/sys/src/libc/", file) 18.108+ && !regexp("^/sys/src/libthread/", file) 18.109+ && match(file, stkignore)==-1 then 18.110+ stop = 1; 18.111+ else if stk[0][1] == 0xfefefefe then { 18.112+ pc = ostk[0][1]; 18.113+ pc0 = ostk[1][0]; 18.114+ stop = 1; 18.115+ }else{ 18.116+ lastpc0 = pc0; 18.117+ frame = head stk; 18.118+ stk = tail stk; 18.119+ nextframe = head stk; 18.120+ pc = frame[1]; 18.121+ pc0 = nextframe[0]; 18.122+ } 18.123+ } 18.124+ file = pcfile(pc); 18.125+ s = file+":"+itoa(pcline(pc), "%d"); 18.126+ if pc0 != 0 then 18.127+ s = s + " "+fnname(pc0); 18.128+ return s; 18.129+} 18.130+ 18.131+defn threadfmt(T){ 18.132+ complex Thread T; 18.133+ local A, yes, i, P, s; 18.134+ 18.135+ P = (Proc)T.proc; 18.136+ s = "t=(Thread)"+itoa(T, "%-10x")+" "; 18.137+ 18.138+ if T.state == Running then 18.139+ s = s + "Running "; 18.140+ else if T.state == Ready then 18.141+ s = s + "Ready "; 18.142+ else if T.state == Rendezvous then 18.143+ s = s + "Rendez "; 18.144+ else 18.145+ s = s + "Bad state "+itoa(T.state, "%x")+" "; 18.146+ 18.147+ A = (Alt)T.alt; 18.148+ if 1 then 18.149+ s = s + threadstkline(T); 18.150+ else if T.chan == Chanalt then 18.151+ s = s + altfmt(T.alt); 18.152+ else if T.chan == Chansend then 18.153+ s = s + "send(Channel("+itoa(A.c, "%x")+"))"; 18.154+ else if T.chan == Chanrecv then 18.155+ s = s + "recv(Channel("+itoa(A.c, "%x")+"))"; 18.156+ else 18.157+ s = s + threadstkline(T); 18.158+ 18.159+ if T.moribund == 1 then 18.160+ s = s + " Moribund"; 18.161+ if T.cmdname != 0 then 18.162+ s = s + " ["+*(T.cmdname\s)+"]"; 18.163+ return s; 18.164+} 18.165+ 18.166+defn thread(T){ 18.167+ print(threadfmt(T), "\n"); 18.168+} 18.169+ 18.170+defn pthreads(P){ 18.171+ complex Proc P; 18.172+ local T, Tq, mainpid; 18.173+ 18.174+ mainpid = pid; 18.175+ setproc(P.pid); 18.176+ Tq = (Tqueue)P.threads; 18.177+ T = (Thread)Tq.$head; 18.178+ while T != 0 do{ 18.179+ print("\t"); 18.180+ thread(T); 18.181+ T = T.nextt; 18.182+ } 18.183+ setproc(mainpid); 18.184+} 18.185+ 18.186+defn threads(){ 18.187+ local P; 18.188+ 18.189+ P = (Proc)_threadpq.$head; 18.190+ while P != 0 do{ 18.191+ if P != (Proc)_threadpq.$head then print("\n"); 18.192+ lproc(P); 18.193+ P = P.next; 18.194+ } 18.195+} 18.196+ 18.197+defn stacks(){ 18.198+ local P, mainpid; 18.199+ 18.200+ mainpid = pid; 18.201+ P = (Proc)_threadpq.$head; 18.202+ while P != 0 do{ 18.203+ proc(P); 18.204+ // setproc(P.pid); 18.205+ // if P.thread==0 then{ 18.206+ // print("=== thread scheduler stack\n"); 18.207+ // stk(); 18.208+ // } 18.209+ // print("threadstks(", P\X, ")\n"); 18.210+ threadstks(P); 18.211+ P = P.next; 18.212+ print("\n"); 18.213+ } 18.214+ setproc(mainpid); 18.215+} 18.216+ 18.217+defn stacksizes(){ 18.218+ local P, T, Tq, top, sp, mainpid; 18.219+ 18.220+ mainpid = pid; 18.221+ P = (Proc)_threadpq.$head; 18.222+ while P != 0 do{ 18.223+ P = (Proc)P; 18.224+ Tq = (Tqueue)P.threads; 18.225+ T = (Thread)Tq.$head; 18.226+ while T != 0 do{ 18.227+ top = T.stk+T.stksize; 18.228+ if T.state==Running then { 18.229+ sp = *SP; 18.230+ }else{ 18.231+ sp = *(T.sched); 18.232+ } 18.233+ sp = *(T.sched); 18.234+ print(top-sp\D, " / ", T.stksize\D, "\n"); 18.235+ T = T.nextt; 18.236+ } 18.237+ P = P.next; 18.238+ } 18.239+ setproc(mainpid); 18.240+} 18.241+ 18.242+defn lproc(P){ 18.243+ proc(P); 18.244+ pthreads(P); 18.245+} 18.246+ 18.247+defn threadstks(P){ 18.248+ complex Proc P; 18.249+ local T, Tq, mainpid, pref, ign; 18.250+ 18.251+ mainpid = pid; 18.252+ pref = stkprefix; 18.253+ stkprefix = pref+"\t\t"; 18.254+ ign = stkignore; 18.255+ stkignore = { 18.256+ "^/sys/src/libthread/", 18.257+ "^/sys/src/libc/(386|arm|alpha|sparc|power|mips)/" 18.258+ }; 18.259+ setproc(P.pid); 18.260+ Tq = (Tqueue)P.threads; 18.261+ T = (Thread)Tq.$head; 18.262+ while T != 0 do{ 18.263+ // print("=============================\n"); 18.264+ // print(" thread(", T\X, ")\n"); 18.265+ print("\t"); 18.266+ thread(T); 18.267+ threadstk(T); 18.268+ T = T.nextt; 18.269+ print("\n"); 18.270+ } 18.271+ setproc(mainpid); 18.272+ stkprefix = pref; 18.273+ stkignore = ign; 18.274+} 18.275+ 18.276+defn proc(P){ 18.277+ complex Proc P; 18.278+ 18.279+ print("p=(Proc)", itoa(P, "%-10x"), " pid ", P.pid\D, " "); 18.280+ if P.thread==0 then 18.281+ print(" Sched"); 18.282+ else 18.283+ print(" Running"); 18.284+ print("\n"); 18.285+} 18.286+ 18.287+defn procs(){ 18.288+ local P; 18.289+ 18.290+ P = (Proc)_threadpq.$head; 18.291+ while P != 0 do{ 18.292+ proc(P); 18.293+ P = P.next; 18.294+ } 18.295+} 18.296+ 18.297+defn threadlstk(T){ 18.298+ complex Thread T; 18.299+ local P, mainpid; 18.300+ 18.301+ P = (Proc)T.proc; 18.302+ mainpid = pid; 18.303+ setproc(P.pid); 18.304+ 18.305+ if T.state == Running then{ 18.306+ lstk(); 18.307+ } else { 18.308+ lablstk(T.sched); 18.309+ } 18.310+ setproc(mainpid); 18.311+} 18.312+ 18.313+defn threadstk(T){ 18.314+ complex Thread T; 18.315+ local P, mainpid; 18.316+ 18.317+ P = (Proc)T.proc; 18.318+ mainpid = pid; 18.319+ setproc(P.pid); 18.320+ 18.321+ if T.state == Running then{ 18.322+ stk(); 18.323+ } else { 18.324+ labstk(T.sched); 18.325+ } 18.326+ setproc(mainpid); 18.327+} 18.328+ 18.329+defn tqueue(Q) { 18.330+ complex Tqueue Q; 18.331+ 18.332+ while Q != 0 do { 18.333+ print(Q.$head\X, " "); 18.334+ Q = *(Q.$tail); 18.335+ 18.336+ } 18.337+ print("#\n"); 18.338+} 18.339+ 18.340+defn channel(C) { 18.341+ complex Channel C; 18.342+ local i, p; 18.343+ 18.344+ print("channel ", C\X); 18.345+ if C.freed then { 18.346+ print(" (moribund)"); 18.347+ } 18.348+ print("\n"); 18.349+ print("\telementsize=", C.e\D, " buffersize=", C.s, "\n"); 18.350+ if C.s then { 18.351+ print("\t", C.n\D, " values in channel:\n"); 18.352+ print("\t"); 18.353+ p = C.v+C.e*(C.f%C.s); 18.354+ loop 1,C.n do { 18.355+ if C.e==4 then { 18.356+ print((*p)\X, " "); 18.357+ }else { 18.358+ print("data(", (*p)\X, ") "); 18.359+ } 18.360+ p = p+C.e; 18.361+ if p == C.v+C.s*C.e then { 18.362+ p = C.v; 18.363+ } 18.364+ } 18.365+ } 18.366+ print("\n"); 18.367+ print(C.nentry\D, " queue slots:\n"); 18.368+ i=0; 18.369+ loop 1,C.nentry do { 18.370+ if C.qentry[i] then 18.371+ print("\t", altfmt(C.qentry[i]), "\n"); 18.372+ else 18.373+ print("\t<empty>\n"); 18.374+ i=i+1; 18.375+ } 18.376+} 18.377+ 18.378+print("/sys/lib/acid/thread");
19.1new file mode 100755 19.2--- /dev/null 19.3+++ b/sys/lib/acid/transcript 19.4@@ -0,0 +1,33 @@ 19.5+#!/bin/rc 19.6+switch($#*){ 19.7+case 0 1 2 19.8+ echo usage: window '''minx miny maxx maxy''' '''minx miny maxx maxy''' cmd args ... 19.9+ exit usage 19.10+} 19.11+ 19.12+rfork ns 19.13+ 19.14+if(mount $wsys /mnt/acid N`{{echo $pid $1 }| sed 's/^ //g;s/ +/,/g'}){ 19.15+ winid=`{cat /dev/winid} 19.16+ echo transcript > /mnt/acid/label 19.17+ echo transcript > /mnt/acid/cons 19.18+ shift 19.19+} 19.20+if not exit 0 19.21+ 19.22+if(mount $wsys /mnt/wsys N`{{echo $pid $1 }| sed 's/^ //g;s/ +/,/g'}){ 19.23+ shift 19.24+ bind -b /mnt/wsys /dev 19.25+} 19.26+if not exit 0 19.27+ 19.28+echo -n `{basename $1} > /dev/label >[2] /dev/null 19.29+@{ 19.30+ echo hang > /proc/^`{cat /dev/ppid}^/ctl 19.31+ $* < /dev/$winid/cons > /dev/$winid/cons >[2] /dev/$winid/cons & 19.32+ exit $apid 19.33+} 19.34+ostatus = `{echo $status | sed 's/.*://'} 19.35+echo waitstop > /proc/$ostatus/ctl 19.36+echo nohang > /proc/$ostatus/ctl 19.37+exit $ostatus
20.1new file mode 100755 20.2--- /dev/null 20.3+++ b/sys/lib/acid/trump 20.4@@ -0,0 +1,171 @@ 20.5+// trace user malloc pool - trace malloc, realloc, and free calls 20.6+// if trumpsbrk is set, we trace sbrkalloc and sbrkmerge too. 20.7+ 20.8+_stoprunning = 0; 20.9+trumphexaddrs = 0; 20.10+trumpsbrk = 0; 20.11+ 20.12+defn stopped(pid) { 20.13+ local l; 20.14+ local pc; 20.15+ pc = *PC; 20.16+ if notes then { 20.17+ if (notes[0]!="sys: breakpoint") then 20.18+ { 20.19+ print(pid,": ",reason(*TRAP),"\t"); 20.20+ print(fmt(pc,97),"\t",fmt(pc,105),"\n"); 20.21+ print("Notes pending:\n"); 20.22+ l = notes; 20.23+ while l do 20.24+ { 20.25+ print("\t",head l,"\n"); 20.26+ l = tail l; 20.27+ } 20.28+ _stoprunning = 1; 20.29+ } 20.30+ } 20.31+} 20.32+ 20.33+defn printstack() { 20.34+ local frame, stk, pcs, lst, x; 20.35+ 20.36+ pcs = {*PC}; 20.37+ stk = strace(*PC,*SP,0); 20.38+ while stk do { 20.39+ pcs = append pcs, stk[0][1]; 20.40+ stk = tail stk; 20.41+ } 20.42+ 20.43+ print(" #"); 20.44+ lst = pcs; 20.45+ while lst do { 20.46+ if trumphexaddrs != 0 then 20.47+ x = lst[0]\X; 20.48+ else 20.49+ x = lst[0]\a; 20.50+ print(" src(", x, ");"); 20.51+ lst = tail lst; 20.52+ } 20.53+ print("\n"); 20.54+} 20.55+ 20.56+defn setuptrump() { 20.57+ mallocPC = malloc; 20.58+ malloczPC = mallocz; 20.59+ freePC = free; 20.60+ reallocPC = realloc; 20.61+ sbrkallocPC = sbrkalloc; 20.62+ sbrkmergePC = sbrkmerge; 20.63+ 20.64+ // linker might fill delay slot with first instruction 20.65+ if objtype == "mips" then { 20.66+ mallocPC = mallocPC+4; 20.67+ malloczPC = malloczPC+4; 20.68+ freePC = freePC+4; 20.69+ reallocPC = reallocPC+4; 20.70+ sbrkallocPC = sbrkallocPC+4; 20.71+ sbrkmergePC = sbrkmergePC+4; 20.72+ } 20.73+ 20.74+ bpset(mallocPC); 20.75+ bpset(malloczPC); 20.76+ bpset(freePC); 20.77+ bpset(reallocPC); 20.78+ if trumpsbrk then { 20.79+ bpset(sbrkallocPC); 20.80+ bpset(sbrkmergePC); 20.81+ } 20.82+} 20.83+ 20.84+defn cleantrump() { 20.85+ stop(pid); 20.86+ 20.87+ bpdel(mallocPC); 20.88+ bpdel(malloczPC); 20.89+ bpdel(freePC); 20.90+ bpdel(reallocPC); 20.91+ bpdel(sbrkallocPC); 20.92+ bpdel(sbrkmergePC); 20.93+} 20.94+ 20.95+defn trumpflush() { 20.96+ stop(pid); // already stopped, but flushes output 20.97+} 20.98+ 20.99+defn new() { 20.100+ bplist = {}; 20.101+ newproc(progargs); 20.102+ bpset(follow(main)[0]); 20.103+ cont(); 20.104+ bpdel(*PC); 20.105+ // clear the hang bit, which is left set by newproc, so programs we fork/exec don't hang 20.106+ printto("/proc/"+itoa(pid)+"/ctl", "nohang"); 20.107+} 20.108+ 20.109+defn trumpfninfo() { 20.110+ local arg0, arg1, stk, retpc, params; 20.111+ 20.112+ stk = strace(*PC, *SP, 0); 20.113+ retpc = stk[0][1]; 20.114+ params = stk[0][2]; 20.115+ arg0 = params[0][1]; 20.116+ arg1 = 0; 20.117+ if tail params != {} then 20.118+ arg1 = params[1][1]; 20.119+ return {arg0, arg1, retpc}; 20.120+} 20.121+ 20.122+defn trumpretval() { 20.123+ if objtype=="386" then 20.124+ return *AX; 20.125+ if objtype=="mips" then 20.126+ return *R1; 20.127+ if objtype=="power" || objtype=="alpha" then 20.128+ return *R0; 20.129+} 20.130+ 20.131+defn trump() { 20.132+ local arg0, arg1, pc, ret, x; 20.133+ 20.134+ stop(pid); 20.135+ _stoprunning = 0; 20.136+ setuptrump(); 20.137+ while !_stoprunning do { 20.138+ cont(); 20.139+ if notes[0]!="sys: breakpoint" then { 20.140+ cleantrump(); 20.141+ return {}; 20.142+ } 20.143+ 20.144+ pc = *PC; 20.145+ x = trumpfninfo(); 20.146+ arg0 = x[0]; 20.147+ if pc == reallocPC || pc == sbrkmergePC then 20.148+ arg1 = x[1]; 20.149+ bpset(x[2]); 20.150+ cont(); 20.151+ bpdel(x[2]); 20.152+ ret = trumpretval(); 20.153+ if pc == mallocPC then 20.154+ print(ret\X, " malloc ", arg0\D); 20.155+ if pc == malloczPC then 20.156+ print(ret\X, " mallocz ", arg0\D); 20.157+ if pc == freePC then 20.158+ print(arg0\X, " free"); 20.159+ if pc == reallocPC then 20.160+ print(ret\X, " realloc ", arg0\X, " ", arg1\D); 20.161+ if pc == sbrkallocPC then 20.162+ print(ret\X, " sbrkalloc ", arg0\D); 20.163+ if pc == sbrkmergePC then 20.164+ print("sbrkmerge ", arg0\X, " ", arg1\X, " = ", ret\D); 20.165+ printstack(); 20.166+ trumpflush(); 20.167+ } 20.168+} 20.169+ 20.170+defn untrump() { 20.171+ cleantrump(); 20.172+ start(pid); 20.173+} 20.174+ 20.175+print("/sys/lib/acid/trump");
21.1new file mode 100755 21.2--- /dev/null 21.3+++ b/sys/lib/acid/truss 21.4@@ -0,0 +1,283 @@ 21.5+// poor emulation of SVR5 truss command - traces system calls 21.6+ 21.7+include("/sys/lib/acid/syscall"); 21.8+ 21.9+_stoprunning = 0; 21.10+ 21.11+defn stopped(pid) { 21.12+ local l; 21.13+ local pc; 21.14+ pc = *PC; 21.15+ if notes then { 21.16+ if (notes[0]!="sys: breakpoint") then 21.17+ { 21.18+ print(pid,": ",trapreason(),"\t"); 21.19+ print(fmt(pc,97),"\t",fmt(pc,105),"\n"); 21.20+ print("Notes pending:\n"); 21.21+ l = notes; 21.22+ while l do 21.23+ { 21.24+ print("\t",head l,"\n"); 21.25+ l = tail l; 21.26+ } 21.27+ _stoprunning = 1; 21.28+ } 21.29+ } 21.30+} 21.31+ 21.32+defn _addressof(pattern) { 21.33+ local s, l; 21.34+ l = symbols; 21.35+ pattern = "^\\$*"+pattern+"$"; 21.36+ while l do 21.37+ { 21.38+ s = head l; 21.39+ if regexp(pattern, s[0]) && ((s[1] == 'T') || (s[1] == 'L')) then 21.40+ return s[2]; 21.41+ l = tail l; 21.42+ } 21.43+ return 0; 21.44+} 21.45+ 21.46+stopPC = {}; 21.47+readPC = {}; 21.48+fd2pathPC = {}; 21.49+errstrPC = {}; 21.50+awaitPC = {}; 21.51+_waitPC = {}; 21.52+_errstrPC = {}; 21.53+trusscalls = { 21.54+ "sysr1", 21.55+ "_errstr", 21.56+ "bind", 21.57+ "chdir", 21.58+ "close", 21.59+ "dup", 21.60+ "alarm", 21.61+ "exec", 21.62+ "_exits", 21.63+ "_fsession", 21.64+ "fauth", 21.65+ "_fstat", 21.66+ "segbrk", 21.67+ "_mount", 21.68+ "open", 21.69+ "_read", 21.70+ "oseek", 21.71+ "sleep", 21.72+ "_stat", 21.73+ "rfork", 21.74+ "_write", 21.75+ "pipe", 21.76+ "create", 21.77+ "fd2path", 21.78+ "brk_", 21.79+ "remove", 21.80+ "_wstat", 21.81+ "_fwstat", 21.82+ "notify", 21.83+ "noted", 21.84+ "segattach", 21.85+ "segdetach", 21.86+ "segfree", 21.87+ "segflush", 21.88+ "rendezvous", 21.89+ "unmount", 21.90+ "_wait", 21.91+ "seek", 21.92+ "fversion", 21.93+ "errstr", 21.94+ "stat", 21.95+ "fstat", 21.96+ "wstat", 21.97+ "fwstat", 21.98+ "mount", 21.99+ "await", 21.100+ "pread", 21.101+ "pwrite", 21.102+ }; 21.103+ 21.104+trussapecalls = { 21.105+ "_SYSR1", 21.106+ "__ERRSTR", 21.107+ "_BIND", 21.108+ "_CHDIR", 21.109+ "_CLOSE", 21.110+ "_DUP", 21.111+ "_ALARM", 21.112+ "_EXEC", 21.113+ "_EXITS", 21.114+ "__FSESSION", 21.115+ "_FAUTH", 21.116+ "__FSTAT", 21.117+ "_SEGBRK", 21.118+ "__MOUNT", 21.119+ "_OPEN", 21.120+ "__READ", 21.121+ "_OSEEK", 21.122+ "_SLEEP", 21.123+ "__STAT", 21.124+ "_RFORK", 21.125+ "__WRITE", 21.126+ "_PIPE", 21.127+ "_CREATE", 21.128+ "_FD2PATH", 21.129+ "_BRK_", 21.130+ "_REMOVE", 21.131+ "__WSTAT", 21.132+ "__FWSTAT", 21.133+ "_NOTIFY", 21.134+ "_NOTED", 21.135+ "_SEGATTACH", 21.136+ "_SEGDETACH", 21.137+ "_SEGFREE", 21.138+ "_SEGFLUSH", 21.139+ "_RENDEZVOUS", 21.140+ "_UNMOUNT", 21.141+ "__WAIT", 21.142+ "_SEEK", 21.143+ "__NFVERSION", 21.144+ "__NERRSTR", 21.145+ "_STAT", 21.146+ "__NFSTAT", 21.147+ "__NWSTAT", 21.148+ "__NFWSTAT", 21.149+ "__NMOUNT", 21.150+ "__NAWAIT", 21.151+ "_PREAD", 21.152+ "_PWRITE", 21.153+ }; 21.154+ 21.155+defn addressof(pattern) { 21.156+ // translate to ape system calls if we have an ape binary 21.157+ if _addressof("_EXITS") == 0 then 21.158+ return _addressof(pattern); 21.159+ return _addressof(trussapecalls[match(pattern, trusscalls)]); 21.160+} 21.161+ 21.162+defn setuptruss() { 21.163+ local lst, offset, name, addr; 21.164+ 21.165+ trussbpt = {}; 21.166+ offset = trapoffset(); 21.167+ lst = trusscalls; 21.168+ while lst do 21.169+ { 21.170+ name = head lst; 21.171+ lst = tail lst; 21.172+ addr = addressof(name); 21.173+ if addr then 21.174+ { 21.175+ bpset(addr+offset); 21.176+ trussbpt = append trussbpt, (addr+offset); 21.177+ // sometimes _exits is renamed $_exits 21.178+ if(regexp("exits|exec", name)) then stopPC = append stopPC, (addr+offset); 21.179+ if(regexp("read", name)) then readPC = append readPC, (addr+offset); 21.180+ if(regexp("fd2path", name)) then fd2pathPC = append fd2pathPC, (addr+offset); 21.181+ if(regexp("^\\$*await", name)) then awaitPC = append awaitPC, (addr+offset); 21.182+ if(regexp("^\\$*errstr", name)) then errstrPC = append errstrPC, (addr+offset); 21.183+ // compatibility hacks for old kernel 21.184+ if(regexp("_wait", name)) then _waitPC = append _waitPC, (addr+offset); 21.185+ if(regexp("_errstr", name)) then _errstrPC = append _errstrPC, (addr+offset); 21.186+ } 21.187+ } 21.188+} 21.189+ 21.190+defn trussflush() { 21.191+ stop(pid); // already stopped, but flushes output 21.192+} 21.193+ 21.194+defn new() { 21.195+ bplist = {}; 21.196+ newproc(progargs); 21.197+ bpset(follow(main)[0]); 21.198+ cont(); 21.199+ bpdel(*PC); 21.200+ // clear the hang bit, which is left set by newproc, so programs we fork/exec don't hang 21.201+ printto("/proc/"+itoa(pid)+"/ctl", "nohang"); 21.202+} 21.203+ 21.204+defn truss() { 21.205+ local pc, lst, offset, prevpc, pcspret, ret; 21.206+ 21.207+ offset = trapoffset(); 21.208+ 21.209+ stop(pid); 21.210+ _stoprunning = 0; 21.211+ setuptruss(); 21.212+ pcspret = UPCSPRET(); 21.213+ 21.214+ while !_stoprunning do { 21.215+ cont(); 21.216+ if notes[0]!="sys: breakpoint" then { 21.217+ cleantruss(); 21.218+ return {}; 21.219+ } 21.220+ pc = *PC; 21.221+ if match(*PC, stopPC)>=0 then { 21.222+ print(pid,": ",trapreason(),"\t"); 21.223+ print(fmt(pc,'a'),"\t",fmt(pc,'i'),"\n"); 21.224+ cleantruss(); 21.225+ return {}; 21.226+ } 21.227+ if match(*PC, trussbpt)>=0 then { 21.228+ usyscall(); 21.229+ trussflush(); 21.230+ prevpc = *PC; 21.231+ step(); 21.232+ ret = eval pcspret[2]; 21.233+ print("\treturn value: ", ret\D, "\n"); 21.234+ if (ret>=0) && (match(prevpc, readPC)>=0) then { 21.235+ print("\tdata: "); 21.236+ printtextordata(*((eval pcspret[1])+4), ret); 21.237+ print("\n"); 21.238+ } 21.239+ if (ret>=0) && (match(prevpc, fd2pathPC)>=0) then { 21.240+ print("\tdata: \"", *(*((eval pcspret[1])+4)\s), "\"\n"); 21.241+ } 21.242+ if (ret>=0) && (match(prevpc, errstrPC)>=0) then { 21.243+ print("\tdata: \"", *(*(eval pcspret[1])\s), "\"\n"); 21.244+ } 21.245+ if (ret>=0) && (match(prevpc, awaitPC)>=0) then { 21.246+ print("\tdata: "); 21.247+ printtextordata(*(eval pcspret[1]), ret); 21.248+ print("\n"); 21.249+ } 21.250+ // compatibility hacks for old kernel: 21.251+ if (ret>=0) && (match(prevpc, _waitPC)>=0) then { 21.252+ print("\tdata: "); 21.253+ printtextordata(*(eval pcspret[1]), 12+3*12+64); 21.254+ print("\n"); 21.255+ } 21.256+ if (ret>=0) && (match(prevpc, _errstrPC)>=0) then { 21.257+ print("\tdata: "); 21.258+ printtextordata(*(eval pcspret[1]), 64); 21.259+ print("\n"); 21.260+ } 21.261+ } 21.262+ trussflush(); 21.263+ } 21.264+} 21.265+ 21.266+defn cleantruss() { 21.267+ local lst, offset, addr; 21.268+ 21.269+ stop(pid); 21.270+ offset = trapoffset(); 21.271+ lst = trussbpt; 21.272+ while lst do 21.273+ { 21.274+ addr = head lst; 21.275+ lst = tail lst; 21.276+ bpdel(addr); 21.277+ } 21.278+ trussbpt = {}; 21.279+ **PC = @*PC; // repair current instruction 21.280+} 21.281+ 21.282+defn untruss() { 21.283+ cleantruss(); 21.284+ start(pid); 21.285+} 21.286+ 21.287+print("/sys/lib/acid/truss");
22.1new file mode 100755 22.2--- /dev/null 22.3+++ b/sys/lib/acid/window 22.4@@ -0,0 +1,23 @@ 22.5+#!/bin/rc 22.6+switch($#*){ 22.7+case 0 1 22.8+ echo usage: window '''minx miny maxx maxy''' cmd args ... 22.9+ exit usage 22.10+} 22.11+ 22.12+rfork ns 22.13+if(mount $wsys /mnt/wsys N`{{echo $pid $1 }| sed 's/^ //g;s/ +/,/g'}){ 22.14+ shift 22.15+ bind -b /mnt/wsys /dev 22.16+ echo -n `{basename $1} > /dev/label >[2] /dev/null 22.17+ @{ 22.18+ echo hang > /proc/^`{cat /dev/ppid}^/ctl 22.19+ $* < /dev/cons > /dev/cons >[2] /dev/cons & 22.20+ exit $apid 22.21+ } 22.22+ ostatus = `{echo $status | sed 's/.*://'} 22.23+ echo waitstop > /proc/$ostatus/ctl 22.24+ echo nohang > /proc/$ostatus/ctl 22.25+ exit $ostatus 22.26+} 22.27+exit 0
23.1new file mode 100755 23.2--- /dev/null 23.3+++ b/sys/lib/agent.config 23.4@@ -0,0 +1,36 @@ 23.5+# an ssh key, as in the .secret file produced by aux/ssh_genkey 23.6+sshkey="1024 2D 5FD276869B5257F506CD32A5EF9CC8D5F691B1B15B17E59ED01691160828D1E0DF192AB82451684DBC74668874C557C81C89396C5EFCA155FE88E1AD6A3C27BFD34B6F6D0A30958B79872CA73A10401B3B85F8E430646B7FD3F36C2BFA47B0581FF101C207E654F1FF23E37BFEAA36D8381FC17315BC77292A6D4E46B68CEE64 A5D892105B985D28159E3A1F3267F9238D373D64315A97441962227EBF5A578F0BFA53C88DA096FCB27AB176052E2B9F4514E362F32B660124D937D386A3311C6DB5497DEF131A1BE5BFA7C88C204D25DB6F6C8181D4826239E52788745B0801F7CB86725A5137E358FEE99852CD50B1B470BA413C35333C26F5D8A3B9D57DF2 A322062C0B47115FBE09721ABBB027719F09C87ED29664AB5A1777D97CBCB099D00A305C8E895C1065DC397D0777DEFB4E216C602A5F4098E6E71701804050B0 10441EEC665DA685E72E9CADB27054098CB879C9F2068ED8104A860C55049A63217DB493247F448CDA5DABA13750775402C8E7F1009C0FD0362EF1C9DFDA141E2 1D005C1E95EA803E882F30BACC088F8BAA7EE510DB7B729B9E3D0F9E218DA23D7A5174AFBE514EF1D93837BB3487169313942A05B7E36C31F029152816CCDB24 2E449C3A06BABD389CF65CF3C2AB99B4C378D1E366790DC74AC899BCAD8FF008E7CBF641D3E72963232C92DBA30703C7245D996EF0AAD7A5946EC6827CBBF4F4 9E0E0FE3DAA204E387DD556667CC3B431B01084DDA9AF5461EBE8700BC213F7D2DEF799915B17B596172CB6859E9775AC902D0A285E0D9491ED2642DF6D818DF" 23.7+ 23.8+# plan 9 password 23.9+plan9password = "secret" 23.10+ 23.11+# inferno/pop password 23.12+apoppassword = "terces" 23.13+ 23.14+# plaintext non-secure password 23.15+plaintext = "guessme" 23.16+ 23.17+# serve your ssh key 23.18+file /ssh/you 23.19+protocol ssh-rsa 23.20+data $sshkey 23.21+ 23.22+# make "rdwr /mnt/auth/netkey/your.host/you" a workalike for netkey. 23.23+file /netkey/your.host/you 23.24+protocol netkey 23.25+data $plan9password 23.26+ 23.27+# md5 apop challenge-response 23.28+file /apop/your.host/you 23.29+protocol apop 23.30+data $apoppassword 23.31+ 23.32+# raw access to password for pop or imap 23.33+file /pop/your.host/you 23.34+protocol raw 23.35+data $plaintext 23.36+ 23.37+file /imap/your.host/you 23.38+protocol raw 23.39+data $plaintext 23.40+
24.1new file mode 100755 24.2index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c7b0023b40604bab2e51622b477628d372a6767f 24.3GIT binary patch literal 169218 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%0A3$=)Md*Pe6XiAPK5e!HLoP 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μ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%0AtQtt@Cq$X6BSI1 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�`{Pt{4e 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
25.1new file mode 100755 25.2--- /dev/null 25.3+++ b/sys/lib/antiword/8859-1.txt 25.4@@ -0,0 +1,303 @@ 25.5+# 25.6+# Name: ISO/IEC 8859-1:1998 to Unicode 25.7+# Unicode version: 3.0 25.8+# Table version: 1.0 25.9+# Table format: Format A 25.10+# Date: 1999 July 27 25.11+# Authors: Ken Whistler <kenw@sybase.com> 25.12+# 25.13+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. 25.14+# 25.15+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 25.16+# No claims are made as to fitness for any particular purpose. No 25.17+# warranties of any kind are expressed or implied. The recipient 25.18+# agrees to determine applicability of information provided. If this 25.19+# file has been provided on optical media by Unicode, Inc., the sole 25.20+# remedy for any claim will be exchange of defective media within 90 25.21+# days of receipt. 25.22+# 25.23+# Unicode, Inc. hereby grants the right to freely use the information 25.24+# supplied in this file in the creation of products supporting the 25.25+# Unicode Standard, and to make copies of this file in any form for 25.26+# internal or external distribution as long as this notice remains 25.27+# attached. 25.28+# 25.29+# General notes: 25.30+# 25.31+# This table contains the data the Unicode Consortium has on how 25.32+# ISO/IEC 8859-1:1998 characters map into Unicode. 25.33+# 25.34+# Format: Three tab-separated columns 25.35+# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX) 25.36+# Column #2 is the Unicode (in hex as 0xXXXX) 25.37+# Column #3 the Unicode name (follows a comment sign, '#') 25.38+# 25.39+# The entries are in ISO/IEC 8859-1 order. 25.40+# 25.41+# Version history 25.42+# 1.0 version updates 0.1 version by adding mappings for all 25.43+# control characters. 25.44+# 25.45+# Updated versions of this file may be found in: 25.46+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 25.47+# 25.48+# Any comments or problems, contact <errata@unicode.org> 25.49+# Please note that <errata@unicode.org> is an archival address; 25.50+# notices will be checked, but do not expect an immediate response. 25.51+# 25.52+0x00 0x0000 # NULL 25.53+0x01 0x0001 # START OF HEADING 25.54+0x02 0x0002 # START OF TEXT 25.55+0x03 0x0003 # END OF TEXT 25.56+0x04 0x0004 # END OF TRANSMISSION 25.57+0x05 0x0005 # ENQUIRY 25.58+0x06 0x0006 # ACKNOWLEDGE 25.59+0x07 0x0007 # BELL 25.60+0x08 0x0008 # BACKSPACE 25.61+0x09 0x0009 # HORIZONTAL TABULATION 25.62+0x0A 0x000A # LINE FEED 25.63+0x0B 0x000B # VERTICAL TABULATION 25.64+0x0C 0x000C # FORM FEED 25.65+0x0D 0x000D # CARRIAGE RETURN 25.66+0x0E 0x000E # SHIFT OUT 25.67+0x0F 0x000F # SHIFT IN 25.68+0x10 0x0010 # DATA LINK ESCAPE 25.69+0x11 0x0011 # DEVICE CONTROL ONE 25.70+0x12 0x0012 # DEVICE CONTROL TWO 25.71+0x13 0x0013 # DEVICE CONTROL THREE 25.72+0x14 0x0014 # DEVICE CONTROL FOUR 25.73+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 25.74+0x16 0x0016 # SYNCHRONOUS IDLE 25.75+0x17 0x0017 # END OF TRANSMISSION BLOCK 25.76+0x18 0x0018 # CANCEL 25.77+0x19 0x0019 # END OF MEDIUM 25.78+0x1A 0x001A # SUBSTITUTE 25.79+0x1B 0x001B # ESCAPE 25.80+0x1C 0x001C # FILE SEPARATOR 25.81+0x1D 0x001D # GROUP SEPARATOR 25.82+0x1E 0x001E # RECORD SEPARATOR 25.83+0x1F 0x001F # UNIT SEPARATOR 25.84+0x20 0x0020 # SPACE 25.85+0x21 0x0021 # EXCLAMATION MARK 25.86+0x22 0x0022 # QUOTATION MARK 25.87+0x23 0x0023 # NUMBER SIGN 25.88+0x24 0x0024 # DOLLAR SIGN 25.89+0x25 0x0025 # PERCENT SIGN 25.90+0x26 0x0026 # AMPERSAND 25.91+0x27 0x0027 # APOSTROPHE 25.92+0x28 0x0028 # LEFT PARENTHESIS 25.93+0x29 0x0029 # RIGHT PARENTHESIS 25.94+0x2A 0x002A # ASTERISK 25.95+0x2B 0x002B # PLUS SIGN 25.96+0x2C 0x002C # COMMA 25.97+0x2D 0x002D # HYPHEN-MINUS 25.98+0x2E 0x002E # FULL STOP 25.99+0x2F 0x002F # SOLIDUS 25.100+0x30 0x0030 # DIGIT ZERO 25.101+0x31 0x0031 # DIGIT ONE 25.102+0x32 0x0032 # DIGIT TWO 25.103+0x33 0x0033 # DIGIT THREE 25.104+0x34 0x0034 # DIGIT FOUR 25.105+0x35 0x0035 # DIGIT FIVE 25.106+0x36 0x0036 # DIGIT SIX 25.107+0x37 0x0037 # DIGIT SEVEN 25.108+0x38 0x0038 # DIGIT EIGHT 25.109+0x39 0x0039 # DIGIT NINE 25.110+0x3A 0x003A # COLON 25.111+0x3B 0x003B # SEMICOLON 25.112+0x3C 0x003C # LESS-THAN SIGN 25.113+0x3D 0x003D # EQUALS SIGN 25.114+0x3E 0x003E # GREATER-THAN SIGN 25.115+0x3F 0x003F # QUESTION MARK 25.116+0x40 0x0040 # COMMERCIAL AT 25.117+0x41 0x0041 # LATIN CAPITAL LETTER A 25.118+0x42 0x0042 # LATIN CAPITAL LETTER B 25.119+0x43 0x0043 # LATIN CAPITAL LETTER C 25.120+0x44 0x0044 # LATIN CAPITAL LETTER D 25.121+0x45 0x0045 # LATIN CAPITAL LETTER E 25.122+0x46 0x0046 # LATIN CAPITAL LETTER F 25.123+0x47 0x0047 # LATIN CAPITAL LETTER G 25.124+0x48 0x0048 # LATIN CAPITAL LETTER H 25.125+0x49 0x0049 # LATIN CAPITAL LETTER I 25.126+0x4A 0x004A # LATIN CAPITAL LETTER J 25.127+0x4B 0x004B # LATIN CAPITAL LETTER K 25.128+0x4C 0x004C # LATIN CAPITAL LETTER L 25.129+0x4D 0x004D # LATIN CAPITAL LETTER M 25.130+0x4E 0x004E # LATIN CAPITAL LETTER N 25.131+0x4F 0x004F # LATIN CAPITAL LETTER O 25.132+0x50 0x0050 # LATIN CAPITAL LETTER P 25.133+0x51 0x0051 # LATIN CAPITAL LETTER Q 25.134+0x52 0x0052 # LATIN CAPITAL LETTER R 25.135+0x53 0x0053 # LATIN CAPITAL LETTER S 25.136+0x54 0x0054 # LATIN CAPITAL LETTER T 25.137+0x55 0x0055 # LATIN CAPITAL LETTER U 25.138+0x56 0x0056 # LATIN CAPITAL LETTER V 25.139+0x57 0x0057 # LATIN CAPITAL LETTER W 25.140+0x58 0x0058 # LATIN CAPITAL LETTER X 25.141+0x59 0x0059 # LATIN CAPITAL LETTER Y 25.142+0x5A 0x005A # LATIN CAPITAL LETTER Z 25.143+0x5B 0x005B # LEFT SQUARE BRACKET 25.144+0x5C 0x005C # REVERSE SOLIDUS 25.145+0x5D 0x005D # RIGHT SQUARE BRACKET 25.146+0x5E 0x005E # CIRCUMFLEX ACCENT 25.147+0x5F 0x005F # LOW LINE 25.148+0x60 0x0060 # GRAVE ACCENT 25.149+0x61 0x0061 # LATIN SMALL LETTER A 25.150+0x62 0x0062 # LATIN SMALL LETTER B 25.151+0x63 0x0063 # LATIN SMALL LETTER C 25.152+0x64 0x0064 # LATIN SMALL LETTER D 25.153+0x65 0x0065 # LATIN SMALL LETTER E 25.154+0x66 0x0066 # LATIN SMALL LETTER F 25.155+0x67 0x0067 # LATIN SMALL LETTER G 25.156+0x68 0x0068 # LATIN SMALL LETTER H 25.157+0x69 0x0069 # LATIN SMALL LETTER I 25.158+0x6A 0x006A # LATIN SMALL LETTER J 25.159+0x6B 0x006B # LATIN SMALL LETTER K 25.160+0x6C 0x006C # LATIN SMALL LETTER L 25.161+0x6D 0x006D # LATIN SMALL LETTER M 25.162+0x6E 0x006E # LATIN SMALL LETTER N 25.163+0x6F 0x006F # LATIN SMALL LETTER O 25.164+0x70 0x0070 # LATIN SMALL LETTER P 25.165+0x71 0x0071 # LATIN SMALL LETTER Q 25.166+0x72 0x0072 # LATIN SMALL LETTER R 25.167+0x73 0x0073 # LATIN SMALL LETTER S 25.168+0x74 0x0074 # LATIN SMALL LETTER T 25.169+0x75 0x0075 # LATIN SMALL LETTER U 25.170+0x76 0x0076 # LATIN SMALL LETTER V 25.171+0x77 0x0077 # LATIN SMALL LETTER W 25.172+0x78 0x0078 # LATIN SMALL LETTER X 25.173+0x79 0x0079 # LATIN SMALL LETTER Y 25.174+0x7A 0x007A # LATIN SMALL LETTER Z 25.175+0x7B 0x007B # LEFT CURLY BRACKET 25.176+0x7C 0x007C # VERTICAL LINE 25.177+0x7D 0x007D # RIGHT CURLY BRACKET 25.178+0x7E 0x007E # TILDE 25.179+0x7F 0x007F # DELETE 25.180+0x80 0x0080 # <control> 25.181+0x81 0x0081 # <control> 25.182+0x82 0x0082 # <control> 25.183+0x83 0x0083 # <control> 25.184+0x84 0x0084 # <control> 25.185+0x85 0x0085 # <control> 25.186+0x86 0x0086 # <control> 25.187+0x87 0x0087 # <control> 25.188+0x88 0x0088 # <control> 25.189+0x89 0x0089 # <control> 25.190+0x8A 0x008A # <control> 25.191+0x8B 0x008B # <control> 25.192+0x8C 0x008C # <control> 25.193+0x8D 0x008D # <control> 25.194+0x8E 0x008E # <control> 25.195+0x8F 0x008F # <control> 25.196+0x90 0x0090 # <control> 25.197+0x91 0x0091 # <control> 25.198+0x92 0x0092 # <control> 25.199+0x93 0x0093 # <control> 25.200+0x94 0x0094 # <control> 25.201+0x95 0x0095 # <control> 25.202+0x96 0x0096 # <control> 25.203+0x97 0x0097 # <control> 25.204+0x98 0x0098 # <control> 25.205+0x99 0x0099 # <control> 25.206+0x9A 0x009A # <control> 25.207+0x9B 0x009B # <control> 25.208+0x9C 0x009C # <control> 25.209+0x9D 0x009D # <control> 25.210+0x9E 0x009E # <control> 25.211+0x9F 0x009F # <control> 25.212+0xA0 0x00A0 # NO-BREAK SPACE 25.213+0xA1 0x00A1 # INVERTED EXCLAMATION MARK 25.214+0xA2 0x00A2 # CENT SIGN 25.215+0xA3 0x00A3 # POUND SIGN 25.216+0xA4 0x00A4 # CURRENCY SIGN 25.217+0xA5 0x00A5 # YEN SIGN 25.218+0xA6 0x00A6 # BROKEN BAR 25.219+0xA7 0x00A7 # SECTION SIGN 25.220+0xA8 0x00A8 # DIAERESIS 25.221+0xA9 0x00A9 # COPYRIGHT SIGN 25.222+0xAA 0x00AA # FEMININE ORDINAL INDICATOR 25.223+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 25.224+0xAC 0x00AC # NOT SIGN 25.225+0xAD 0x00AD # SOFT HYPHEN 25.226+0xAE 0x00AE # REGISTERED SIGN 25.227+0xAF 0x00AF # MACRON 25.228+0xB0 0x00B0 # DEGREE SIGN 25.229+0xB1 0x00B1 # PLUS-MINUS SIGN 25.230+0xB2 0x00B2 # SUPERSCRIPT TWO 25.231+0xB3 0x00B3 # SUPERSCRIPT THREE 25.232+0xB4 0x00B4 # ACUTE ACCENT 25.233+0xB5 0x00B5 # MICRO SIGN 25.234+0xB6 0x00B6 # PILCROW SIGN 25.235+0xB7 0x00B7 # MIDDLE DOT 25.236+0xB8 0x00B8 # CEDILLA 25.237+0xB9 0x00B9 # SUPERSCRIPT ONE 25.238+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR 25.239+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 25.240+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER 25.241+0xBD 0x00BD # VULGAR FRACTION ONE HALF 25.242+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS 25.243+0xBF 0x00BF # INVERTED QUESTION MARK 25.244+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE 25.245+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 25.246+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 25.247+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE 25.248+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 25.249+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 25.250+0xC6 0x00C6 # LATIN CAPITAL LETTER AE 25.251+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 25.252+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE 25.253+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 25.254+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 25.255+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 25.256+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE 25.257+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 25.258+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 25.259+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 25.260+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) 25.261+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE 25.262+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE 25.263+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 25.264+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 25.265+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 25.266+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 25.267+0xD7 0x00D7 # MULTIPLICATION SIGN 25.268+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 25.269+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE 25.270+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 25.271+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 25.272+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 25.273+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 25.274+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) 25.275+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) 25.276+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE 25.277+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 25.278+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 25.279+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE 25.280+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 25.281+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 25.282+0xE6 0x00E6 # LATIN SMALL LETTER AE 25.283+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 25.284+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE 25.285+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 25.286+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX 25.287+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 25.288+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE 25.289+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 25.290+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 25.291+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 25.292+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) 25.293+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE 25.294+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE 25.295+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 25.296+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 25.297+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 25.298+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 25.299+0xF7 0x00F7 # DIVISION SIGN 25.300+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 25.301+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE 25.302+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 25.303+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 25.304+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 25.305+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 25.306+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) 25.307+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
26.1new file mode 100755 26.2--- /dev/null 26.3+++ b/sys/lib/antiword/8859-10.txt 26.4@@ -0,0 +1,303 @@ 26.5+# 26.6+# Name: ISO/IEC 8859-10:1998 to Unicode 26.7+# Unicode version: 3.0 26.8+# Table version: 1.1 26.9+# Table format: Format A 26.10+# Date: 1999 October 11 26.11+# Authors: Ken Whistler <kenw@sybase.com> 26.12+# 26.13+# Copyright (c) 1999 Unicode, Inc. All Rights reserved. 26.14+# 26.15+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 26.16+# No claims are made as to fitness for any particular purpose. No 26.17+# warranties of any kind are expressed or implied. The recipient 26.18+# agrees to determine applicability of information provided. If this 26.19+# file has been provided on optical media by Unicode, Inc., the sole 26.20+# remedy for any claim will be exchange of defective media within 90 26.21+# days of receipt. 26.22+# 26.23+# Unicode, Inc. hereby grants the right to freely use the information 26.24+# supplied in this file in the creation of products supporting the 26.25+# Unicode Standard, and to make copies of this file in any form for 26.26+# internal or external distribution as long as this notice remains 26.27+# attached. 26.28+# 26.29+# General notes: 26.30+# 26.31+# This table contains the data the Unicode Consortium has on how 26.32+# ISO/IEC 8859-10:1998 characters map into Unicode. 26.33+# 26.34+# Format: Three tab-separated columns 26.35+# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX) 26.36+# Column #2 is the Unicode (in hex as 0xXXXX) 26.37+# Column #3 the Unicode name (follows a comment sign, '#') 26.38+# 26.39+# The entries are in ISO/IEC 8859-10 order. 26.40+# 26.41+# Version history 26.42+# 1.0 version new. 26.43+# 1.1 corrected mistake in mapping of 0xA4 26.44+# 26.45+# Updated versions of this file may be found in: 26.46+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 26.47+# 26.48+# Any comments or problems, contact <errata@unicode.org> 26.49+# Please note that <errata@unicode.org> is an archival address; 26.50+# notices will be checked, but do not expect an immediate response. 26.51+# 26.52+0x00 0x0000 # NULL 26.53+0x01 0x0001 # START OF HEADING 26.54+0x02 0x0002 # START OF TEXT 26.55+0x03 0x0003 # END OF TEXT 26.56+0x04 0x0004 # END OF TRANSMISSION 26.57+0x05 0x0005 # ENQUIRY 26.58+0x06 0x0006 # ACKNOWLEDGE 26.59+0x07 0x0007 # BELL 26.60+0x08 0x0008 # BACKSPACE 26.61+0x09 0x0009 # HORIZONTAL TABULATION 26.62+0x0A 0x000A # LINE FEED 26.63+0x0B 0x000B # VERTICAL TABULATION 26.64+0x0C 0x000C # FORM FEED 26.65+0x0D 0x000D # CARRIAGE RETURN 26.66+0x0E 0x000E # SHIFT OUT 26.67+0x0F 0x000F # SHIFT IN 26.68+0x10 0x0010 # DATA LINK ESCAPE 26.69+0x11 0x0011 # DEVICE CONTROL ONE 26.70+0x12 0x0012 # DEVICE CONTROL TWO 26.71+0x13 0x0013 # DEVICE CONTROL THREE 26.72+0x14 0x0014 # DEVICE CONTROL FOUR 26.73+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 26.74+0x16 0x0016 # SYNCHRONOUS IDLE 26.75+0x17 0x0017 # END OF TRANSMISSION BLOCK 26.76+0x18 0x0018 # CANCEL 26.77+0x19 0x0019 # END OF MEDIUM 26.78+0x1A 0x001A # SUBSTITUTE 26.79+0x1B 0x001B # ESCAPE 26.80+0x1C 0x001C # FILE SEPARATOR 26.81+0x1D 0x001D # GROUP SEPARATOR 26.82+0x1E 0x001E # RECORD SEPARATOR 26.83+0x1F 0x001F # UNIT SEPARATOR 26.84+0x20 0x0020 # SPACE 26.85+0x21 0x0021 # EXCLAMATION MARK 26.86+0x22 0x0022 # QUOTATION MARK 26.87+0x23 0x0023 # NUMBER SIGN 26.88+0x24 0x0024 # DOLLAR SIGN 26.89+0x25 0x0025 # PERCENT SIGN 26.90+0x26 0x0026 # AMPERSAND 26.91+0x27 0x0027 # APOSTROPHE 26.92+0x28 0x0028 # LEFT PARENTHESIS 26.93+0x29 0x0029 # RIGHT PARENTHESIS 26.94+0x2A 0x002A # ASTERISK 26.95+0x2B 0x002B # PLUS SIGN 26.96+0x2C 0x002C # COMMA 26.97+0x2D 0x002D # HYPHEN-MINUS 26.98+0x2E 0x002E # FULL STOP 26.99+0x2F 0x002F # SOLIDUS 26.100+0x30 0x0030 # DIGIT ZERO 26.101+0x31 0x0031 # DIGIT ONE 26.102+0x32 0x0032 # DIGIT TWO 26.103+0x33 0x0033 # DIGIT THREE 26.104+0x34 0x0034 # DIGIT FOUR 26.105+0x35 0x0035 # DIGIT FIVE 26.106+0x36 0x0036 # DIGIT SIX 26.107+0x37 0x0037 # DIGIT SEVEN 26.108+0x38 0x0038 # DIGIT EIGHT 26.109+0x39 0x0039 # DIGIT NINE 26.110+0x3A 0x003A # COLON 26.111+0x3B 0x003B # SEMICOLON 26.112+0x3C 0x003C # LESS-THAN SIGN 26.113+0x3D 0x003D # EQUALS SIGN 26.114+0x3E 0x003E # GREATER-THAN SIGN 26.115+0x3F 0x003F # QUESTION MARK 26.116+0x40 0x0040 # COMMERCIAL AT 26.117+0x41 0x0041 # LATIN CAPITAL LETTER A 26.118+0x42 0x0042 # LATIN CAPITAL LETTER B 26.119+0x43 0x0043 # LATIN CAPITAL LETTER C 26.120+0x44 0x0044 # LATIN CAPITAL LETTER D 26.121+0x45 0x0045 # LATIN CAPITAL LETTER E 26.122+0x46 0x0046 # LATIN CAPITAL LETTER F 26.123+0x47 0x0047 # LATIN CAPITAL LETTER G 26.124+0x48 0x0048 # LATIN CAPITAL LETTER H 26.125+0x49 0x0049 # LATIN CAPITAL LETTER I 26.126+0x4A 0x004A # LATIN CAPITAL LETTER J 26.127+0x4B 0x004B # LATIN CAPITAL LETTER K 26.128+0x4C 0x004C # LATIN CAPITAL LETTER L 26.129+0x4D 0x004D # LATIN CAPITAL LETTER M 26.130+0x4E 0x004E # LATIN CAPITAL LETTER N 26.131+0x4F 0x004F # LATIN CAPITAL LETTER O 26.132+0x50 0x0050 # LATIN CAPITAL LETTER P 26.133+0x51 0x0051 # LATIN CAPITAL LETTER Q 26.134+0x52 0x0052 # LATIN CAPITAL LETTER R 26.135+0x53 0x0053 # LATIN CAPITAL LETTER S 26.136+0x54 0x0054 # LATIN CAPITAL LETTER T 26.137+0x55 0x0055 # LATIN CAPITAL LETTER U 26.138+0x56 0x0056 # LATIN CAPITAL LETTER V 26.139+0x57 0x0057 # LATIN CAPITAL LETTER W 26.140+0x58 0x0058 # LATIN CAPITAL LETTER X 26.141+0x59 0x0059 # LATIN CAPITAL LETTER Y 26.142+0x5A 0x005A # LATIN CAPITAL LETTER Z 26.143+0x5B 0x005B # LEFT SQUARE BRACKET 26.144+0x5C 0x005C # REVERSE SOLIDUS 26.145+0x5D 0x005D # RIGHT SQUARE BRACKET 26.146+0x5E 0x005E # CIRCUMFLEX ACCENT 26.147+0x5F 0x005F # LOW LINE 26.148+0x60 0x0060 # GRAVE ACCENT 26.149+0x61 0x0061 # LATIN SMALL LETTER A 26.150+0x62 0x0062 # LATIN SMALL LETTER B 26.151+0x63 0x0063 # LATIN SMALL LETTER C 26.152+0x64 0x0064 # LATIN SMALL LETTER D 26.153+0x65 0x0065 # LATIN SMALL LETTER E 26.154+0x66 0x0066 # LATIN SMALL LETTER F 26.155+0x67 0x0067 # LATIN SMALL LETTER G 26.156+0x68 0x0068 # LATIN SMALL LETTER H 26.157+0x69 0x0069 # LATIN SMALL LETTER I 26.158+0x6A 0x006A # LATIN SMALL LETTER J 26.159+0x6B 0x006B # LATIN SMALL LETTER K 26.160+0x6C 0x006C # LATIN SMALL LETTER L 26.161+0x6D 0x006D # LATIN SMALL LETTER M 26.162+0x6E 0x006E # LATIN SMALL LETTER N 26.163+0x6F 0x006F # LATIN SMALL LETTER O 26.164+0x70 0x0070 # LATIN SMALL LETTER P 26.165+0x71 0x0071 # LATIN SMALL LETTER Q 26.166+0x72 0x0072 # LATIN SMALL LETTER R 26.167+0x73 0x0073 # LATIN SMALL LETTER S 26.168+0x74 0x0074 # LATIN SMALL LETTER T 26.169+0x75 0x0075 # LATIN SMALL LETTER U 26.170+0x76 0x0076 # LATIN SMALL LETTER V 26.171+0x77 0x0077 # LATIN SMALL LETTER W 26.172+0x78 0x0078 # LATIN SMALL LETTER X 26.173+0x79 0x0079 # LATIN SMALL LETTER Y 26.174+0x7A 0x007A # LATIN SMALL LETTER Z 26.175+0x7B 0x007B # LEFT CURLY BRACKET 26.176+0x7C 0x007C # VERTICAL LINE 26.177+0x7D 0x007D # RIGHT CURLY BRACKET 26.178+0x7E 0x007E # TILDE 26.179+0x7F 0x007F # DELETE 26.180+0x80 0x0080 # <control> 26.181+0x81 0x0081 # <control> 26.182+0x82 0x0082 # <control> 26.183+0x83 0x0083 # <control> 26.184+0x84 0x0084 # <control> 26.185+0x85 0x0085 # <control> 26.186+0x86 0x0086 # <control> 26.187+0x87 0x0087 # <control> 26.188+0x88 0x0088 # <control> 26.189+0x89 0x0089 # <control> 26.190+0x8A 0x008A # <control> 26.191+0x8B 0x008B # <control> 26.192+0x8C 0x008C # <control> 26.193+0x8D 0x008D # <control> 26.194+0x8E 0x008E # <control> 26.195+0x8F 0x008F # <control> 26.196+0x90 0x0090 # <control> 26.197+0x91 0x0091 # <control> 26.198+0x92 0x0092 # <control> 26.199+0x93 0x0093 # <control> 26.200+0x94 0x0094 # <control> 26.201+0x95 0x0095 # <control> 26.202+0x96 0x0096 # <control> 26.203+0x97 0x0097 # <control> 26.204+0x98 0x0098 # <control> 26.205+0x99 0x0099 # <control> 26.206+0x9A 0x009A # <control> 26.207+0x9B 0x009B # <control> 26.208+0x9C 0x009C # <control> 26.209+0x9D 0x009D # <control> 26.210+0x9E 0x009E # <control> 26.211+0x9F 0x009F # <control> 26.212+0xA0 0x00A0 # NO-BREAK SPACE 26.213+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK 26.214+0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON 26.215+0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA 26.216+0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON 26.217+0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE 26.218+0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA 26.219+0xA7 0x00A7 # SECTION SIGN 26.220+0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA 26.221+0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE 26.222+0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON 26.223+0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE 26.224+0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON 26.225+0xAD 0x00AD # SOFT HYPHEN 26.226+0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON 26.227+0xAF 0x014A # LATIN CAPITAL LETTER ENG 26.228+0xB0 0x00B0 # DEGREE SIGN 26.229+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK 26.230+0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON 26.231+0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA 26.232+0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON 26.233+0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE 26.234+0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA 26.235+0xB7 0x00B7 # MIDDLE DOT 26.236+0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA 26.237+0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE 26.238+0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON 26.239+0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE 26.240+0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON 26.241+0xBD 0x2015 # HORIZONTAL BAR 26.242+0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON 26.243+0xBF 0x014B # LATIN SMALL LETTER ENG 26.244+0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON 26.245+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 26.246+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 26.247+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE 26.248+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 26.249+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 26.250+0xC6 0x00C6 # LATIN CAPITAL LETTER AE 26.251+0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK 26.252+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON 26.253+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 26.254+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK 26.255+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 26.256+0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE 26.257+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 26.258+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 26.259+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 26.260+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) 26.261+0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA 26.262+0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON 26.263+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 26.264+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 26.265+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 26.266+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 26.267+0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE 26.268+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 26.269+0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK 26.270+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 26.271+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 26.272+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 26.273+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 26.274+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) 26.275+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) 26.276+0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON 26.277+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 26.278+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 26.279+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE 26.280+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 26.281+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 26.282+0xE6 0x00E6 # LATIN SMALL LETTER AE 26.283+0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK 26.284+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON 26.285+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 26.286+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK 26.287+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 26.288+0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE 26.289+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 26.290+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 26.291+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 26.292+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) 26.293+0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA 26.294+0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON 26.295+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 26.296+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 26.297+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 26.298+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 26.299+0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE 26.300+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 26.301+0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK 26.302+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 26.303+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 26.304+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 26.305+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 26.306+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) 26.307+0xFF 0x0138 # LATIN SMALL LETTER KRA
27.1new file mode 100755 27.2--- /dev/null 27.3+++ b/sys/lib/antiword/8859-13.txt 27.4@@ -0,0 +1,299 @@ 27.5+# 27.6+# Name: ISO/IEC 8859-13:1998 to Unicode 27.7+# Unicode version: 3.0 27.8+# Table version: 1.0 27.9+# Table format: Format A 27.10+# Date: 1999 July 27 27.11+# Authors: Ken Whistler <kenw@sybase.com> 27.12+# 27.13+# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. 27.14+# 27.15+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 27.16+# No claims are made as to fitness for any particular purpose. No 27.17+# warranties of any kind are expressed or implied. The recipient 27.18+# agrees to determine applicability of information provided. If this 27.19+# file has been provided on optical media by Unicode, Inc., the sole 27.20+# remedy for any claim will be exchange of defective media within 90 27.21+# days of receipt. 27.22+# 27.23+# Unicode, Inc. hereby grants the right to freely use the information 27.24+# supplied in this file in the creation of products supporting the 27.25+# Unicode Standard, and to make copies of this file in any form for 27.26+# internal or external distribution as long as this notice remains 27.27+# attached. 27.28+# 27.29+# General notes: 27.30+# 27.31+# This table contains the data the Unicode Consortium has on how 27.32+# ISO/IEC 8859-13:1998 characters map into Unicode. 27.33+# 27.34+# Format: Three tab-separated columns 27.35+# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX) 27.36+# Column #2 is the Unicode (in hex as 0xXXXX) 27.37+# Column #3 the Unicode name (follows a comment sign, '#') 27.38+# 27.39+# The entries are in ISO/IEC 8859-13 order. 27.40+# 27.41+# Updated versions of this file may be found in: 27.42+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 27.43+# 27.44+# Any comments or problems, contact <errata@unicode.org> 27.45+# Please note that <errata@unicode.org> is an archival address; 27.46+# notices will be checked, but do not expect an immediate response. 27.47+# 27.48+0x00 0x0000 # NULL 27.49+0x01 0x0001 # START OF HEADING 27.50+0x02 0x0002 # START OF TEXT 27.51+0x03 0x0003 # END OF TEXT 27.52+0x04 0x0004 # END OF TRANSMISSION 27.53+0x05 0x0005 # ENQUIRY 27.54+0x06 0x0006 # ACKNOWLEDGE 27.55+0x07 0x0007 # BELL 27.56+0x08 0x0008 # BACKSPACE 27.57+0x09 0x0009 # HORIZONTAL TABULATION 27.58+0x0A 0x000A # LINE FEED 27.59+0x0B 0x000B # VERTICAL TABULATION 27.60+0x0C 0x000C # FORM FEED 27.61+0x0D 0x000D # CARRIAGE RETURN 27.62+0x0E 0x000E # SHIFT OUT 27.63+0x0F 0x000F # SHIFT IN 27.64+0x10 0x0010 # DATA LINK ESCAPE 27.65+0x11 0x0011 # DEVICE CONTROL ONE 27.66+0x12 0x0012 # DEVICE CONTROL TWO 27.67+0x13 0x0013 # DEVICE CONTROL THREE 27.68+0x14 0x0014 # DEVICE CONTROL FOUR 27.69+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 27.70+0x16 0x0016 # SYNCHRONOUS IDLE 27.71+0x17 0x0017 # END OF TRANSMISSION BLOCK 27.72+0x18 0x0018 # CANCEL 27.73+0x19 0x0019 # END OF MEDIUM 27.74+0x1A 0x001A # SUBSTITUTE 27.75+0x1B 0x001B # ESCAPE 27.76+0x1C 0x001C # FILE SEPARATOR 27.77+0x1D 0x001D # GROUP SEPARATOR 27.78+0x1E 0x001E # RECORD SEPARATOR 27.79+0x1F 0x001F # UNIT SEPARATOR 27.80+0x20 0x0020 # SPACE 27.81+0x21 0x0021 # EXCLAMATION MARK 27.82+0x22 0x0022 # QUOTATION MARK 27.83+0x23 0x0023 # NUMBER SIGN 27.84+0x24 0x0024 # DOLLAR SIGN 27.85+0x25 0x0025 # PERCENT SIGN 27.86+0x26 0x0026 # AMPERSAND 27.87+0x27 0x0027 # APOSTROPHE 27.88+0x28 0x0028 # LEFT PARENTHESIS 27.89+0x29 0x0029 # RIGHT PARENTHESIS 27.90+0x2A 0x002A # ASTERISK 27.91+0x2B 0x002B # PLUS SIGN 27.92+0x2C 0x002C # COMMA 27.93+0x2D 0x002D # HYPHEN-MINUS 27.94+0x2E 0x002E # FULL STOP 27.95+0x2F 0x002F # SOLIDUS 27.96+0x30 0x0030 # DIGIT ZERO 27.97+0x31 0x0031 # DIGIT ONE 27.98+0x32 0x0032 # DIGIT TWO 27.99+0x33 0x0033 # DIGIT THREE 27.100+0x34 0x0034 # DIGIT FOUR 27.101+0x35 0x0035 # DIGIT FIVE 27.102+0x36 0x0036 # DIGIT SIX 27.103+0x37 0x0037 # DIGIT SEVEN 27.104+0x38 0x0038 # DIGIT EIGHT 27.105+0x39 0x0039 # DIGIT NINE 27.106+0x3A 0x003A # COLON 27.107+0x3B 0x003B # SEMICOLON 27.108+0x3C 0x003C # LESS-THAN SIGN 27.109+0x3D 0x003D # EQUALS SIGN 27.110+0x3E 0x003E # GREATER-THAN SIGN 27.111+0x3F 0x003F # QUESTION MARK 27.112+0x40 0x0040 # COMMERCIAL AT 27.113+0x41 0x0041 # LATIN CAPITAL LETTER A 27.114+0x42 0x0042 # LATIN CAPITAL LETTER B 27.115+0x43 0x0043 # LATIN CAPITAL LETTER C 27.116+0x44 0x0044 # LATIN CAPITAL LETTER D 27.117+0x45 0x0045 # LATIN CAPITAL LETTER E 27.118+0x46 0x0046 # LATIN CAPITAL LETTER F 27.119+0x47 0x0047 # LATIN CAPITAL LETTER G 27.120+0x48 0x0048 # LATIN CAPITAL LETTER H 27.121+0x49 0x0049 # LATIN CAPITAL LETTER I 27.122+0x4A 0x004A # LATIN CAPITAL LETTER J 27.123+0x4B 0x004B # LATIN CAPITAL LETTER K 27.124+0x4C 0x004C # LATIN CAPITAL LETTER L 27.125+0x4D 0x004D # LATIN CAPITAL LETTER M 27.126+0x4E 0x004E # LATIN CAPITAL LETTER N 27.127+0x4F 0x004F # LATIN CAPITAL LETTER O 27.128+0x50 0x0050 # LATIN CAPITAL LETTER P 27.129+0x51 0x0051 # LATIN CAPITAL LETTER Q 27.130+0x52 0x0052 # LATIN CAPITAL LETTER R 27.131+0x53 0x0053 # LATIN CAPITAL LETTER S 27.132+0x54 0x0054 # LATIN CAPITAL LETTER T 27.133+0x55 0x0055 # LATIN CAPITAL LETTER U 27.134+0x56 0x0056 # LATIN CAPITAL LETTER V 27.135+0x57 0x0057 # LATIN CAPITAL LETTER W 27.136+0x58 0x0058 # LATIN CAPITAL LETTER X 27.137+0x59 0x0059 # LATIN CAPITAL LETTER Y 27.138+0x5A 0x005A # LATIN CAPITAL LETTER Z 27.139+0x5B 0x005B # LEFT SQUARE BRACKET 27.140+0x5C 0x005C # REVERSE SOLIDUS 27.141+0x5D 0x005D # RIGHT SQUARE BRACKET 27.142+0x5E 0x005E # CIRCUMFLEX ACCENT 27.143+0x5F 0x005F # LOW LINE 27.144+0x60 0x0060 # GRAVE ACCENT 27.145+0x61 0x0061 # LATIN SMALL LETTER A 27.146+0x62 0x0062 # LATIN SMALL LETTER B 27.147+0x63 0x0063 # LATIN SMALL LETTER C 27.148+0x64 0x0064 # LATIN SMALL LETTER D 27.149+0x65 0x0065 # LATIN SMALL LETTER E 27.150+0x66 0x0066 # LATIN SMALL LETTER F 27.151+0x67 0x0067 # LATIN SMALL LETTER G 27.152+0x68 0x0068 # LATIN SMALL LETTER H 27.153+0x69 0x0069 # LATIN SMALL LETTER I 27.154+0x6A 0x006A # LATIN SMALL LETTER J 27.155+0x6B 0x006B # LATIN SMALL LETTER K 27.156+0x6C 0x006C # LATIN SMALL LETTER L 27.157+0x6D 0x006D # LATIN SMALL LETTER M 27.158+0x6E 0x006E # LATIN SMALL LETTER N 27.159+0x6F 0x006F # LATIN SMALL LETTER O 27.160+0x70 0x0070 # LATIN SMALL LETTER P 27.161+0x71 0x0071 # LATIN SMALL LETTER Q 27.162+0x72 0x0072 # LATIN SMALL LETTER R 27.163+0x73 0x0073 # LATIN SMALL LETTER S 27.164+0x74 0x0074 # LATIN SMALL LETTER T 27.165+0x75 0x0075 # LATIN SMALL LETTER U 27.166+0x76 0x0076 # LATIN SMALL LETTER V 27.167+0x77 0x0077 # LATIN SMALL LETTER W 27.168+0x78 0x0078 # LATIN SMALL LETTER X 27.169+0x79 0x0079 # LATIN SMALL LETTER Y 27.170+0x7A 0x007A # LATIN SMALL LETTER Z 27.171+0x7B 0x007B # LEFT CURLY BRACKET 27.172+0x7C 0x007C # VERTICAL LINE 27.173+0x7D 0x007D # RIGHT CURLY BRACKET 27.174+0x7E 0x007E # TILDE 27.175+0x7F 0x007F # DELETE 27.176+0x80 0x0080 # <control> 27.177+0x81 0x0081 # <control> 27.178+0x82 0x0082 # <control> 27.179+0x83 0x0083 # <control> 27.180+0x84 0x0084 # <control> 27.181+0x85 0x0085 # <control> 27.182+0x86 0x0086 # <control> 27.183+0x87 0x0087 # <control> 27.184+0x88 0x0088 # <control> 27.185+0x89 0x0089 # <control> 27.186+0x8A 0x008A # <control> 27.187+0x8B 0x008B # <control> 27.188+0x8C 0x008C # <control> 27.189+0x8D 0x008D # <control> 27.190+0x8E 0x008E # <control> 27.191+0x8F 0x008F # <control> 27.192+0x90 0x0090 # <control> 27.193+0x91 0x0091 # <control> 27.194+0x92 0x0092 # <control> 27.195+0x93 0x0093 # <control> 27.196+0x94 0x0094 # <control> 27.197+0x95 0x0095 # <control> 27.198+0x96 0x0096 # <control> 27.199+0x97 0x0097 # <control> 27.200+0x98 0x0098 # <control> 27.201+0x99 0x0099 # <control> 27.202+0x9A 0x009A # <control> 27.203+0x9B 0x009B # <control> 27.204+0x9C 0x009C # <control> 27.205+0x9D 0x009D # <control> 27.206+0x9E 0x009E # <control> 27.207+0x9F 0x009F # <control> 27.208+0xA0 0x00A0 # NO-BREAK SPACE 27.209+0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK 27.210+0xA2 0x00A2 # CENT SIGN 27.211+0xA3 0x00A3 # POUND SIGN 27.212+0xA4 0x00A4 # CURRENCY SIGN 27.213+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK 27.214+0xA6 0x00A6 # BROKEN BAR 27.215+0xA7 0x00A7 # SECTION SIGN 27.216+0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 27.217+0xA9 0x00A9 # COPYRIGHT SIGN 27.218+0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA 27.219+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 27.220+0xAC 0x00AC # NOT SIGN 27.221+0xAD 0x00AD # SOFT HYPHEN 27.222+0xAE 0x00AE # REGISTERED SIGN 27.223+0xAF 0x00C6 # LATIN CAPITAL LETTER AE 27.224+0xB0 0x00B0 # DEGREE SIGN 27.225+0xB1 0x00B1 # PLUS-MINUS SIGN 27.226+0xB2 0x00B2 # SUPERSCRIPT TWO 27.227+0xB3 0x00B3 # SUPERSCRIPT THREE 27.228+0xB4 0x201C # LEFT DOUBLE QUOTATION MARK 27.229+0xB5 0x00B5 # MICRO SIGN 27.230+0xB6 0x00B6 # PILCROW SIGN 27.231+0xB7 0x00B7 # MIDDLE DOT 27.232+0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 27.233+0xB9 0x00B9 # SUPERSCRIPT ONE 27.234+0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA 27.235+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 27.236+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER 27.237+0xBD 0x00BD # VULGAR FRACTION ONE HALF 27.238+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS 27.239+0xBF 0x00E6 # LATIN SMALL LETTER AE 27.240+0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK 27.241+0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK 27.242+0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON 27.243+0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE 27.244+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 27.245+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 27.246+0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK 27.247+0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON 27.248+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON 27.249+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 27.250+0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE 27.251+0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE 27.252+0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA 27.253+0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA 27.254+0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON 27.255+0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA 27.256+0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON 27.257+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE 27.258+0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA 27.259+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 27.260+0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON 27.261+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 27.262+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 27.263+0xD7 0x00D7 # MULTIPLICATION SIGN 27.264+0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK 27.265+0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE 27.266+0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE 27.267+0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON 27.268+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 27.269+0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE 27.270+0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON 27.271+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) 27.272+0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK 27.273+0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK 27.274+0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON 27.275+0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE 27.276+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 27.277+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 27.278+0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK 27.279+0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON 27.280+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON 27.281+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 27.282+0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE 27.283+0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE 27.284+0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA 27.285+0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA 27.286+0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON 27.287+0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA 27.288+0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON 27.289+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE 27.290+0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA 27.291+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 27.292+0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON 27.293+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 27.294+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 27.295+0xF7 0x00F7 # DIVISION SIGN 27.296+0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK 27.297+0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE 27.298+0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE 27.299+0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON 27.300+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 27.301+0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE 27.302+0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON 27.303+0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK
28.1new file mode 100755 28.2--- /dev/null 28.3+++ b/sys/lib/antiword/8859-14.txt 28.4@@ -0,0 +1,301 @@ 28.5+# 28.6+# Name: ISO/IEC 8859-14:1998 to Unicode 28.7+# Unicode version: 3.0 28.8+# Table version: 1.0 28.9+# Table format: Format A 28.10+# Date: 1999 July 27 28.11+# Authors: Markus Kuhn <mkuhn@acm.org> 28.12+# Ken Whistler <kenw@sybase.com> 28.13+# 28.14+# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. 28.15+# 28.16+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 28.17+# No claims are made as to fitness for any particular purpose. No 28.18+# warranties of any kind are expressed or implied. The recipient 28.19+# agrees to determine applicability of information provided. If this 28.20+# file has been provided on optical media by Unicode, Inc., the sole 28.21+# remedy for any claim will be exchange of defective media within 90 28.22+# days of receipt. 28.23+# 28.24+# Unicode, Inc. hereby grants the right to freely use the information 28.25+# supplied in this file in the creation of products supporting the 28.26+# Unicode Standard, and to make copies of this file in any form for 28.27+# internal or external distribution as long as this notice remains 28.28+# attached. 28.29+# 28.30+# General notes: 28.31+# 28.32+# This table contains the data the Unicode Consortium has on how 28.33+# ISO/IEC 8859-14:1998 characters map into Unicode. 28.34+# 28.35+# Format: Three tab-separated columns 28.36+# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX) 28.37+# Column #2 is the Unicode (in hex as 0xXXXX) 28.38+# Column #3 the Unicode name (follows a comment sign, '#') 28.39+# 28.40+# The entries are in ISO/IEC 8859-14 order. 28.41+# 28.42+# Updated versions of this file may be found in: 28.43+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 28.44+# 28.45+# Any comments or problems, contact <errata@unicode.org> 28.46+# Please note that <errata@unicode.org> is an archival address; 28.47+# notices will be checked, but do not expect an immediate response. 28.48+# 28.49+0x00 0x0000 # NULL 28.50+0x01 0x0001 # START OF HEADING 28.51+0x02 0x0002 # START OF TEXT 28.52+0x03 0x0003 # END OF TEXT 28.53+0x04 0x0004 # END OF TRANSMISSION 28.54+0x05 0x0005 # ENQUIRY 28.55+0x06 0x0006 # ACKNOWLEDGE 28.56+0x07 0x0007 # BELL 28.57+0x08 0x0008 # BACKSPACE 28.58+0x09 0x0009 # HORIZONTAL TABULATION 28.59+0x0A 0x000A # LINE FEED 28.60+0x0B 0x000B # VERTICAL TABULATION 28.61+0x0C 0x000C # FORM FEED 28.62+0x0D 0x000D # CARRIAGE RETURN 28.63+0x0E 0x000E # SHIFT OUT 28.64+0x0F 0x000F # SHIFT IN 28.65+0x10 0x0010 # DATA LINK ESCAPE 28.66+0x11 0x0011 # DEVICE CONTROL ONE 28.67+0x12 0x0012 # DEVICE CONTROL TWO 28.68+0x13 0x0013 # DEVICE CONTROL THREE 28.69+0x14 0x0014 # DEVICE CONTROL FOUR 28.70+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 28.71+0x16 0x0016 # SYNCHRONOUS IDLE 28.72+0x17 0x0017 # END OF TRANSMISSION BLOCK 28.73+0x18 0x0018 # CANCEL 28.74+0x19 0x0019 # END OF MEDIUM 28.75+0x1A 0x001A # SUBSTITUTE 28.76+0x1B 0x001B # ESCAPE 28.77+0x1C 0x001C # FILE SEPARATOR 28.78+0x1D 0x001D # GROUP SEPARATOR 28.79+0x1E 0x001E # RECORD SEPARATOR 28.80+0x1F 0x001F # UNIT SEPARATOR 28.81+0x20 0x0020 # SPACE 28.82+0x21 0x0021 # EXCLAMATION MARK 28.83+0x22 0x0022 # QUOTATION MARK 28.84+0x23 0x0023 # NUMBER SIGN 28.85+0x24 0x0024 # DOLLAR SIGN 28.86+0x25 0x0025 # PERCENT SIGN 28.87+0x26 0x0026 # AMPERSAND 28.88+0x27 0x0027 # APOSTROPHE 28.89+0x28 0x0028 # LEFT PARENTHESIS 28.90+0x29 0x0029 # RIGHT PARENTHESIS 28.91+0x2A 0x002A # ASTERISK 28.92+0x2B 0x002B # PLUS SIGN 28.93+0x2C 0x002C # COMMA 28.94+0x2D 0x002D # HYPHEN-MINUS 28.95+0x2E 0x002E # FULL STOP 28.96+0x2F 0x002F # SOLIDUS 28.97+0x30 0x0030 # DIGIT ZERO 28.98+0x31 0x0031 # DIGIT ONE 28.99+0x32 0x0032 # DIGIT TWO 28.100+0x33 0x0033 # DIGIT THREE 28.101+0x34 0x0034 # DIGIT FOUR 28.102+0x35 0x0035 # DIGIT FIVE 28.103+0x36 0x0036 # DIGIT SIX 28.104+0x37 0x0037 # DIGIT SEVEN 28.105+0x38 0x0038 # DIGIT EIGHT 28.106+0x39 0x0039 # DIGIT NINE 28.107+0x3A 0x003A # COLON 28.108+0x3B 0x003B # SEMICOLON 28.109+0x3C 0x003C # LESS-THAN SIGN 28.110+0x3D 0x003D # EQUALS SIGN 28.111+0x3E 0x003E # GREATER-THAN SIGN 28.112+0x3F 0x003F # QUESTION MARK 28.113+0x40 0x0040 # COMMERCIAL AT 28.114+0x41 0x0041 # LATIN CAPITAL LETTER A 28.115+0x42 0x0042 # LATIN CAPITAL LETTER B 28.116+0x43 0x0043 # LATIN CAPITAL LETTER C 28.117+0x44 0x0044 # LATIN CAPITAL LETTER D 28.118+0x45 0x0045 # LATIN CAPITAL LETTER E 28.119+0x46 0x0046 # LATIN CAPITAL LETTER F 28.120+0x47 0x0047 # LATIN CAPITAL LETTER G 28.121+0x48 0x0048 # LATIN CAPITAL LETTER H 28.122+0x49 0x0049 # LATIN CAPITAL LETTER I 28.123+0x4A 0x004A # LATIN CAPITAL LETTER J 28.124+0x4B 0x004B # LATIN CAPITAL LETTER K 28.125+0x4C 0x004C # LATIN CAPITAL LETTER L 28.126+0x4D 0x004D # LATIN CAPITAL LETTER M 28.127+0x4E 0x004E # LATIN CAPITAL LETTER N 28.128+0x4F 0x004F # LATIN CAPITAL LETTER O 28.129+0x50 0x0050 # LATIN CAPITAL LETTER P 28.130+0x51 0x0051 # LATIN CAPITAL LETTER Q 28.131+0x52 0x0052 # LATIN CAPITAL LETTER R 28.132+0x53 0x0053 # LATIN CAPITAL LETTER S 28.133+0x54 0x0054 # LATIN CAPITAL LETTER T 28.134+0x55 0x0055 # LATIN CAPITAL LETTER U 28.135+0x56 0x0056 # LATIN CAPITAL LETTER V 28.136+0x57 0x0057 # LATIN CAPITAL LETTER W 28.137+0x58 0x0058 # LATIN CAPITAL LETTER X 28.138+0x59 0x0059 # LATIN CAPITAL LETTER Y 28.139+0x5A 0x005A # LATIN CAPITAL LETTER Z 28.140+0x5B 0x005B # LEFT SQUARE BRACKET 28.141+0x5C 0x005C # REVERSE SOLIDUS 28.142+0x5D 0x005D # RIGHT SQUARE BRACKET 28.143+0x5E 0x005E # CIRCUMFLEX ACCENT 28.144+0x5F 0x005F # LOW LINE 28.145+0x60 0x0060 # GRAVE ACCENT 28.146+0x61 0x0061 # LATIN SMALL LETTER A 28.147+0x62 0x0062 # LATIN SMALL LETTER B 28.148+0x63 0x0063 # LATIN SMALL LETTER C 28.149+0x64 0x0064 # LATIN SMALL LETTER D 28.150+0x65 0x0065 # LATIN SMALL LETTER E 28.151+0x66 0x0066 # LATIN SMALL LETTER F 28.152+0x67 0x0067 # LATIN SMALL LETTER G 28.153+0x68 0x0068 # LATIN SMALL LETTER H 28.154+0x69 0x0069 # LATIN SMALL LETTER I 28.155+0x6A 0x006A # LATIN SMALL LETTER J 28.156+0x6B 0x006B # LATIN SMALL LETTER K 28.157+0x6C 0x006C # LATIN SMALL LETTER L 28.158+0x6D 0x006D # LATIN SMALL LETTER M 28.159+0x6E 0x006E # LATIN SMALL LETTER N 28.160+0x6F 0x006F # LATIN SMALL LETTER O 28.161+0x70 0x0070 # LATIN SMALL LETTER P 28.162+0x71 0x0071 # LATIN SMALL LETTER Q 28.163+0x72 0x0072 # LATIN SMALL LETTER R 28.164+0x73 0x0073 # LATIN SMALL LETTER S 28.165+0x74 0x0074 # LATIN SMALL LETTER T 28.166+0x75 0x0075 # LATIN SMALL LETTER U 28.167+0x76 0x0076 # LATIN SMALL LETTER V 28.168+0x77 0x0077 # LATIN SMALL LETTER W 28.169+0x78 0x0078 # LATIN SMALL LETTER X 28.170+0x79 0x0079 # LATIN SMALL LETTER Y 28.171+0x7A 0x007A # LATIN SMALL LETTER Z 28.172+0x7B 0x007B # LEFT CURLY BRACKET 28.173+0x7C 0x007C # VERTICAL LINE 28.174+0x7D 0x007D # RIGHT CURLY BRACKET 28.175+0x7E 0x007E # TILDE 28.176+0x7F 0x007F # DELETE 28.177+0x80 0x0080 # <control> 28.178+0x81 0x0081 # <control> 28.179+0x82 0x0082 # <control> 28.180+0x83 0x0083 # <control> 28.181+0x84 0x0084 # <control> 28.182+0x85 0x0085 # <control> 28.183+0x86 0x0086 # <control> 28.184+0x87 0x0087 # <control> 28.185+0x88 0x0088 # <control> 28.186+0x89 0x0089 # <control> 28.187+0x8A 0x008A # <control> 28.188+0x8B 0x008B # <control> 28.189+0x8C 0x008C # <control> 28.190+0x8D 0x008D # <control> 28.191+0x8E 0x008E # <control> 28.192+0x8F 0x008F # <control> 28.193+0x90 0x0090 # <control> 28.194+0x91 0x0091 # <control> 28.195+0x92 0x0092 # <control> 28.196+0x93 0x0093 # <control> 28.197+0x94 0x0094 # <control> 28.198+0x95 0x0095 # <control> 28.199+0x96 0x0096 # <control> 28.200+0x97 0x0097 # <control> 28.201+0x98 0x0098 # <control> 28.202+0x99 0x0099 # <control> 28.203+0x9A 0x009A # <control> 28.204+0x9B 0x009B # <control> 28.205+0x9C 0x009C # <control> 28.206+0x9D 0x009D # <control> 28.207+0x9E 0x009E # <control> 28.208+0x9F 0x009F # <control> 28.209+0xA0 0x00A0 # NO-BREAK SPACE 28.210+0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE 28.211+0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE 28.212+0xA3 0x00A3 # POUND SIGN 28.213+0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE 28.214+0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE 28.215+0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE 28.216+0xA7 0x00A7 # SECTION SIGN 28.217+0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE 28.218+0xA9 0x00A9 # COPYRIGHT SIGN 28.219+0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE 28.220+0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE 28.221+0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE 28.222+0xAD 0x00AD # SOFT HYPHEN 28.223+0xAE 0x00AE # REGISTERED SIGN 28.224+0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS 28.225+0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE 28.226+0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE 28.227+0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE 28.228+0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE 28.229+0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE 28.230+0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE 28.231+0xB6 0x00B6 # PILCROW SIGN 28.232+0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE 28.233+0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE 28.234+0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE 28.235+0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE 28.236+0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE 28.237+0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE 28.238+0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS 28.239+0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS 28.240+0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE 28.241+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE 28.242+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 28.243+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 28.244+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE 28.245+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 28.246+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 28.247+0xC6 0x00C6 # LATIN CAPITAL LETTER AE 28.248+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 28.249+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE 28.250+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 28.251+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 28.252+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 28.253+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE 28.254+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 28.255+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 28.256+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 28.257+0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX 28.258+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE 28.259+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE 28.260+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 28.261+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 28.262+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 28.263+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 28.264+0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE 28.265+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 28.266+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE 28.267+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 28.268+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 28.269+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 28.270+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 28.271+0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 28.272+0xDF 0x00DF # LATIN SMALL LETTER SHARP S 28.273+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE 28.274+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 28.275+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 28.276+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE 28.277+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 28.278+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 28.279+0xE6 0x00E6 # LATIN SMALL LETTER AE 28.280+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 28.281+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE 28.282+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 28.283+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX 28.284+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 28.285+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE 28.286+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 28.287+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 28.288+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 28.289+0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX 28.290+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE 28.291+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE 28.292+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 28.293+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 28.294+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 28.295+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 28.296+0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE 28.297+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 28.298+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE 28.299+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 28.300+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 28.301+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 28.302+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 28.303+0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX 28.304+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS 28.305+
29.1new file mode 100755 29.2--- /dev/null 29.3+++ b/sys/lib/antiword/8859-15.txt 29.4@@ -0,0 +1,303 @@ 29.5+# 29.6+# Name: ISO/IEC 8859-15:1999 to Unicode 29.7+# Unicode version: 3.0 29.8+# Table version: 1.0 29.9+# Table format: Format A 29.10+# Date: 1999 July 27 29.11+# Authors: Markus Kuhn <mkuhn@acm.org> 29.12+# Ken Whistler <kenw@sybase.com> 29.13+# 29.14+# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. 29.15+# 29.16+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 29.17+# No claims are made as to fitness for any particular purpose. No 29.18+# warranties of any kind are expressed or implied. The recipient 29.19+# agrees to determine applicability of information provided. If this 29.20+# file has been provided on optical media by Unicode, Inc., the sole 29.21+# remedy for any claim will be exchange of defective media within 90 29.22+# days of receipt. 29.23+# 29.24+# Unicode, Inc. hereby grants the right to freely use the information 29.25+# supplied in this file in the creation of products supporting the 29.26+# Unicode Standard, and to make copies of this file in any form for 29.27+# internal or external distribution as long as this notice remains 29.28+# attached. 29.29+# 29.30+# General notes: 29.31+# 29.32+# This table contains the data the Unicode Consortium has on how 29.33+# ISO/IEC 8859-15:1999 characters map into Unicode. 29.34+# 29.35+# Format: Three tab-separated columns 29.36+# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX) 29.37+# Column #2 is the Unicode (in hex as 0xXXXX) 29.38+# Column #3 the Unicode name (follows a comment sign, '#') 29.39+# 29.40+# The entries are in ISO/IEC 8859-15 order. 29.41+# 29.42+# Version history 29.43+# 29.44+# Updated versions of this file may be found in: 29.45+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 29.46+# 29.47+# Any comments or problems, contact <errata@unicode.org> 29.48+# Please note that <errata@unicode.org> is an archival address; 29.49+# notices will be checked, but do not expect an immediate response. 29.50+# 29.51+0x00 0x0000 # NULL 29.52+0x01 0x0001 # START OF HEADING 29.53+0x02 0x0002 # START OF TEXT 29.54+0x03 0x0003 # END OF TEXT 29.55+0x04 0x0004 # END OF TRANSMISSION 29.56+0x05 0x0005 # ENQUIRY 29.57+0x06 0x0006 # ACKNOWLEDGE 29.58+0x07 0x0007 # BELL 29.59+0x08 0x0008 # BACKSPACE 29.60+0x09 0x0009 # HORIZONTAL TABULATION 29.61+0x0A 0x000A # LINE FEED 29.62+0x0B 0x000B # VERTICAL TABULATION 29.63+0x0C 0x000C # FORM FEED 29.64+0x0D 0x000D # CARRIAGE RETURN 29.65+0x0E 0x000E # SHIFT OUT 29.66+0x0F 0x000F # SHIFT IN 29.67+0x10 0x0010 # DATA LINK ESCAPE 29.68+0x11 0x0011 # DEVICE CONTROL ONE 29.69+0x12 0x0012 # DEVICE CONTROL TWO 29.70+0x13 0x0013 # DEVICE CONTROL THREE 29.71+0x14 0x0014 # DEVICE CONTROL FOUR 29.72+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 29.73+0x16 0x0016 # SYNCHRONOUS IDLE 29.74+0x17 0x0017 # END OF TRANSMISSION BLOCK 29.75+0x18 0x0018 # CANCEL 29.76+0x19 0x0019 # END OF MEDIUM 29.77+0x1A 0x001A # SUBSTITUTE 29.78+0x1B 0x001B # ESCAPE 29.79+0x1C 0x001C # FILE SEPARATOR 29.80+0x1D 0x001D # GROUP SEPARATOR 29.81+0x1E 0x001E # RECORD SEPARATOR 29.82+0x1F 0x001F # UNIT SEPARATOR 29.83+0x20 0x0020 # SPACE 29.84+0x21 0x0021 # EXCLAMATION MARK 29.85+0x22 0x0022 # QUOTATION MARK 29.86+0x23 0x0023 # NUMBER SIGN 29.87+0x24 0x0024 # DOLLAR SIGN 29.88+0x25 0x0025 # PERCENT SIGN 29.89+0x26 0x0026 # AMPERSAND 29.90+0x27 0x0027 # APOSTROPHE 29.91+0x28 0x0028 # LEFT PARENTHESIS 29.92+0x29 0x0029 # RIGHT PARENTHESIS 29.93+0x2A 0x002A # ASTERISK 29.94+0x2B 0x002B # PLUS SIGN 29.95+0x2C 0x002C # COMMA 29.96+0x2D 0x002D # HYPHEN-MINUS 29.97+0x2E 0x002E # FULL STOP 29.98+0x2F 0x002F # SOLIDUS 29.99+0x30 0x0030 # DIGIT ZERO 29.100+0x31 0x0031 # DIGIT ONE 29.101+0x32 0x0032 # DIGIT TWO 29.102+0x33 0x0033 # DIGIT THREE 29.103+0x34 0x0034 # DIGIT FOUR 29.104+0x35 0x0035 # DIGIT FIVE 29.105+0x36 0x0036 # DIGIT SIX 29.106+0x37 0x0037 # DIGIT SEVEN 29.107+0x38 0x0038 # DIGIT EIGHT 29.108+0x39 0x0039 # DIGIT NINE 29.109+0x3A 0x003A # COLON 29.110+0x3B 0x003B # SEMICOLON 29.111+0x3C 0x003C # LESS-THAN SIGN 29.112+0x3D 0x003D # EQUALS SIGN 29.113+0x3E 0x003E # GREATER-THAN SIGN 29.114+0x3F 0x003F # QUESTION MARK 29.115+0x40 0x0040 # COMMERCIAL AT 29.116+0x41 0x0041 # LATIN CAPITAL LETTER A 29.117+0x42 0x0042 # LATIN CAPITAL LETTER B 29.118+0x43 0x0043 # LATIN CAPITAL LETTER C 29.119+0x44 0x0044 # LATIN CAPITAL LETTER D 29.120+0x45 0x0045 # LATIN CAPITAL LETTER E 29.121+0x46 0x0046 # LATIN CAPITAL LETTER F 29.122+0x47 0x0047 # LATIN CAPITAL LETTER G 29.123+0x48 0x0048 # LATIN CAPITAL LETTER H 29.124+0x49 0x0049 # LATIN CAPITAL LETTER I 29.125+0x4A 0x004A # LATIN CAPITAL LETTER J 29.126+0x4B 0x004B # LATIN CAPITAL LETTER K 29.127+0x4C 0x004C # LATIN CAPITAL LETTER L 29.128+0x4D 0x004D # LATIN CAPITAL LETTER M 29.129+0x4E 0x004E # LATIN CAPITAL LETTER N 29.130+0x4F 0x004F # LATIN CAPITAL LETTER O 29.131+0x50 0x0050 # LATIN CAPITAL LETTER P 29.132+0x51 0x0051 # LATIN CAPITAL LETTER Q 29.133+0x52 0x0052 # LATIN CAPITAL LETTER R 29.134+0x53 0x0053 # LATIN CAPITAL LETTER S 29.135+0x54 0x0054 # LATIN CAPITAL LETTER T 29.136+0x55 0x0055 # LATIN CAPITAL LETTER U 29.137+0x56 0x0056 # LATIN CAPITAL LETTER V 29.138+0x57 0x0057 # LATIN CAPITAL LETTER W 29.139+0x58 0x0058 # LATIN CAPITAL LETTER X 29.140+0x59 0x0059 # LATIN CAPITAL LETTER Y 29.141+0x5A 0x005A # LATIN CAPITAL LETTER Z 29.142+0x5B 0x005B # LEFT SQUARE BRACKET 29.143+0x5C 0x005C # REVERSE SOLIDUS 29.144+0x5D 0x005D # RIGHT SQUARE BRACKET 29.145+0x5E 0x005E # CIRCUMFLEX ACCENT 29.146+0x5F 0x005F # LOW LINE 29.147+0x60 0x0060 # GRAVE ACCENT 29.148+0x61 0x0061 # LATIN SMALL LETTER A 29.149+0x62 0x0062 # LATIN SMALL LETTER B 29.150+0x63 0x0063 # LATIN SMALL LETTER C 29.151+0x64 0x0064 # LATIN SMALL LETTER D 29.152+0x65 0x0065 # LATIN SMALL LETTER E 29.153+0x66 0x0066 # LATIN SMALL LETTER F 29.154+0x67 0x0067 # LATIN SMALL LETTER G 29.155+0x68 0x0068 # LATIN SMALL LETTER H 29.156+0x69 0x0069 # LATIN SMALL LETTER I 29.157+0x6A 0x006A # LATIN SMALL LETTER J 29.158+0x6B 0x006B # LATIN SMALL LETTER K 29.159+0x6C 0x006C # LATIN SMALL LETTER L 29.160+0x6D 0x006D # LATIN SMALL LETTER M 29.161+0x6E 0x006E # LATIN SMALL LETTER N 29.162+0x6F 0x006F # LATIN SMALL LETTER O 29.163+0x70 0x0070 # LATIN SMALL LETTER P 29.164+0x71 0x0071 # LATIN SMALL LETTER Q 29.165+0x72 0x0072 # LATIN SMALL LETTER R 29.166+0x73 0x0073 # LATIN SMALL LETTER S 29.167+0x74 0x0074 # LATIN SMALL LETTER T 29.168+0x75 0x0075 # LATIN SMALL LETTER U 29.169+0x76 0x0076 # LATIN SMALL LETTER V 29.170+0x77 0x0077 # LATIN SMALL LETTER W 29.171+0x78 0x0078 # LATIN SMALL LETTER X 29.172+0x79 0x0079 # LATIN SMALL LETTER Y 29.173+0x7A 0x007A # LATIN SMALL LETTER Z 29.174+0x7B 0x007B # LEFT CURLY BRACKET 29.175+0x7C 0x007C # VERTICAL LINE 29.176+0x7D 0x007D # RIGHT CURLY BRACKET 29.177+0x7E 0x007E # TILDE 29.178+0x7F 0x007F # DELETE 29.179+0x80 0x0080 # <control> 29.180+0x81 0x0081 # <control> 29.181+0x82 0x0082 # <control> 29.182+0x83 0x0083 # <control> 29.183+0x84 0x0084 # <control> 29.184+0x85 0x0085 # <control> 29.185+0x86 0x0086 # <control> 29.186+0x87 0x0087 # <control> 29.187+0x88 0x0088 # <control> 29.188+0x89 0x0089 # <control> 29.189+0x8A 0x008A # <control> 29.190+0x8B 0x008B # <control> 29.191+0x8C 0x008C # <control> 29.192+0x8D 0x008D # <control> 29.193+0x8E 0x008E # <control> 29.194+0x8F 0x008F # <control> 29.195+0x90 0x0090 # <control> 29.196+0x91 0x0091 # <control> 29.197+0x92 0x0092 # <control> 29.198+0x93 0x0093 # <control> 29.199+0x94 0x0094 # <control> 29.200+0x95 0x0095 # <control> 29.201+0x96 0x0096 # <control> 29.202+0x97 0x0097 # <control> 29.203+0x98 0x0098 # <control> 29.204+0x99 0x0099 # <control> 29.205+0x9A 0x009A # <control> 29.206+0x9B 0x009B # <control> 29.207+0x9C 0x009C # <control> 29.208+0x9D 0x009D # <control> 29.209+0x9E 0x009E # <control> 29.210+0x9F 0x009F # <control> 29.211+0xA0 0x00A0 # NO-BREAK SPACE 29.212+0xA1 0x00A1 # INVERTED EXCLAMATION MARK 29.213+0xA2 0x00A2 # CENT SIGN 29.214+0xA3 0x00A3 # POUND SIGN 29.215+0xA4 0x20AC # EURO SIGN 29.216+0xA5 0x00A5 # YEN SIGN 29.217+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON 29.218+0xA7 0x00A7 # SECTION SIGN 29.219+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON 29.220+0xA9 0x00A9 # COPYRIGHT SIGN 29.221+0xAA 0x00AA # FEMININE ORDINAL INDICATOR 29.222+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 29.223+0xAC 0x00AC # NOT SIGN 29.224+0xAD 0x00AD # SOFT HYPHEN 29.225+0xAE 0x00AE # REGISTERED SIGN 29.226+0xAF 0x00AF # MACRON 29.227+0xB0 0x00B0 # DEGREE SIGN 29.228+0xB1 0x00B1 # PLUS-MINUS SIGN 29.229+0xB2 0x00B2 # SUPERSCRIPT TWO 29.230+0xB3 0x00B3 # SUPERSCRIPT THREE 29.231+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON 29.232+0xB5 0x00B5 # MICRO SIGN 29.233+0xB6 0x00B6 # PILCROW SIGN 29.234+0xB7 0x00B7 # MIDDLE DOT 29.235+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON 29.236+0xB9 0x00B9 # SUPERSCRIPT ONE 29.237+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR 29.238+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 29.239+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE 29.240+0xBD 0x0153 # LATIN SMALL LIGATURE OE 29.241+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS 29.242+0xBF 0x00BF # INVERTED QUESTION MARK 29.243+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE 29.244+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 29.245+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 29.246+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE 29.247+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 29.248+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 29.249+0xC6 0x00C6 # LATIN CAPITAL LETTER AE 29.250+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 29.251+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE 29.252+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 29.253+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 29.254+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 29.255+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE 29.256+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 29.257+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 29.258+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 29.259+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH 29.260+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE 29.261+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE 29.262+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 29.263+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 29.264+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 29.265+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 29.266+0xD7 0x00D7 # MULTIPLICATION SIGN 29.267+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 29.268+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE 29.269+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 29.270+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 29.271+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 29.272+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 29.273+0xDE 0x00DE # LATIN CAPITAL LETTER THORN 29.274+0xDF 0x00DF # LATIN SMALL LETTER SHARP S 29.275+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE 29.276+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 29.277+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 29.278+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE 29.279+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 29.280+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 29.281+0xE6 0x00E6 # LATIN SMALL LETTER AE 29.282+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 29.283+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE 29.284+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 29.285+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX 29.286+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 29.287+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE 29.288+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 29.289+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 29.290+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 29.291+0xF0 0x00F0 # LATIN SMALL LETTER ETH 29.292+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE 29.293+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE 29.294+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 29.295+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 29.296+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 29.297+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 29.298+0xF7 0x00F7 # DIVISION SIGN 29.299+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 29.300+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE 29.301+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 29.302+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 29.303+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 29.304+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 29.305+0xFE 0x00FE # LATIN SMALL LETTER THORN 29.306+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS 29.307+
30.1new file mode 100755 30.2--- /dev/null 30.3+++ b/sys/lib/antiword/8859-16.txt 30.4@@ -0,0 +1,299 @@ 30.5+# 30.6+# Name: ISO/IEC 8859-16:2001 to Unicode 30.7+# Unicode version: 3.0 30.8+# Table version: 1.0 30.9+# Table format: Format A 30.10+# Date: 2001 July 26 30.11+# Authors: Markus Kuhn <mkuhn@acm.org> 30.12+# 30.13+# Copyright (c) 1999-2001 Unicode, Inc. All Rights reserved. 30.14+# 30.15+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 30.16+# No claims are made as to fitness for any particular purpose. No 30.17+# warranties of any kind are expressed or implied. The recipient 30.18+# agrees to determine applicability of information provided. If this 30.19+# file has been provided on optical media by Unicode, Inc., the sole 30.20+# remedy for any claim will be exchange of defective media within 90 30.21+# days of receipt. 30.22+# 30.23+# Unicode, Inc. hereby grants the right to freely use the information 30.24+# supplied in this file in the creation of products supporting the 30.25+# Unicode Standard, and to make copies of this file in any form for 30.26+# internal or external distribution as long as this notice remains 30.27+# attached. 30.28+# 30.29+# General notes: 30.30+# 30.31+# This table contains the data the Unicode Consortium has on how 30.32+# ISO/IEC 8859-16:2001 characters map into Unicode. 30.33+# 30.34+# Format: Three tab-separated columns 30.35+# Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX) 30.36+# Column #2 is the Unicode (in hex as 0xXXXX) 30.37+# Column #3 the Unicode name (follows a comment sign, '#') 30.38+# 30.39+# The entries are in ISO/IEC 8859-16 order. 30.40+# 30.41+# Updated versions of this file may be found in: 30.42+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 30.43+# 30.44+# Any comments or problems, contact <errata@unicode.org> 30.45+# Please note that <errata@unicode.org> is an archival address; 30.46+# notices will be checked, but do not expect an immediate response. 30.47+# 30.48+0x00 0x0000 # NULL 30.49+0x01 0x0001 # START OF HEADING 30.50+0x02 0x0002 # START OF TEXT 30.51+0x03 0x0003 # END OF TEXT 30.52+0x04 0x0004 # END OF TRANSMISSION 30.53+0x05 0x0005 # ENQUIRY 30.54+0x06 0x0006 # ACKNOWLEDGE 30.55+0x07 0x0007 # BELL 30.56+0x08 0x0008 # BACKSPACE 30.57+0x09 0x0009 # HORIZONTAL TABULATION 30.58+0x0A 0x000A # LINE FEED 30.59+0x0B 0x000B # VERTICAL TABULATION 30.60+0x0C 0x000C # FORM FEED 30.61+0x0D 0x000D # CARRIAGE RETURN 30.62+0x0E 0x000E # SHIFT OUT 30.63+0x0F 0x000F # SHIFT IN 30.64+0x10 0x0010 # DATA LINK ESCAPE 30.65+0x11 0x0011 # DEVICE CONTROL ONE 30.66+0x12 0x0012 # DEVICE CONTROL TWO 30.67+0x13 0x0013 # DEVICE CONTROL THREE 30.68+0x14 0x0014 # DEVICE CONTROL FOUR 30.69+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 30.70+0x16 0x0016 # SYNCHRONOUS IDLE 30.71+0x17 0x0017 # END OF TRANSMISSION BLOCK 30.72+0x18 0x0018 # CANCEL 30.73+0x19 0x0019 # END OF MEDIUM 30.74+0x1A 0x001A # SUBSTITUTE 30.75+0x1B 0x001B # ESCAPE 30.76+0x1C 0x001C # FILE SEPARATOR 30.77+0x1D 0x001D # GROUP SEPARATOR 30.78+0x1E 0x001E # RECORD SEPARATOR 30.79+0x1F 0x001F # UNIT SEPARATOR 30.80+0x20 0x0020 # SPACE 30.81+0x21 0x0021 # EXCLAMATION MARK 30.82+0x22 0x0022 # QUOTATION MARK 30.83+0x23 0x0023 # NUMBER SIGN 30.84+0x24 0x0024 # DOLLAR SIGN 30.85+0x25 0x0025 # PERCENT SIGN 30.86+0x26 0x0026 # AMPERSAND 30.87+0x27 0x0027 # APOSTROPHE 30.88+0x28 0x0028 # LEFT PARENTHESIS 30.89+0x29 0x0029 # RIGHT PARENTHESIS 30.90+0x2A 0x002A # ASTERISK 30.91+0x2B 0x002B # PLUS SIGN 30.92+0x2C 0x002C # COMMA 30.93+0x2D 0x002D # HYPHEN-MINUS 30.94+0x2E 0x002E # FULL STOP 30.95+0x2F 0x002F # SOLIDUS 30.96+0x30 0x0030 # DIGIT ZERO 30.97+0x31 0x0031 # DIGIT ONE 30.98+0x32 0x0032 # DIGIT TWO 30.99+0x33 0x0033 # DIGIT THREE 30.100+0x34 0x0034 # DIGIT FOUR 30.101+0x35 0x0035 # DIGIT FIVE 30.102+0x36 0x0036 # DIGIT SIX 30.103+0x37 0x0037 # DIGIT SEVEN 30.104+0x38 0x0038 # DIGIT EIGHT 30.105+0x39 0x0039 # DIGIT NINE 30.106+0x3A 0x003A # COLON 30.107+0x3B 0x003B # SEMICOLON 30.108+0x3C 0x003C # LESS-THAN SIGN 30.109+0x3D 0x003D # EQUALS SIGN 30.110+0x3E 0x003E # GREATER-THAN SIGN 30.111+0x3F 0x003F # QUESTION MARK 30.112+0x40 0x0040 # COMMERCIAL AT 30.113+0x41 0x0041 # LATIN CAPITAL LETTER A 30.114+0x42 0x0042 # LATIN CAPITAL LETTER B 30.115+0x43 0x0043 # LATIN CAPITAL LETTER C 30.116+0x44 0x0044 # LATIN CAPITAL LETTER D 30.117+0x45 0x0045 # LATIN CAPITAL LETTER E 30.118+0x46 0x0046 # LATIN CAPITAL LETTER F 30.119+0x47 0x0047 # LATIN CAPITAL LETTER G 30.120+0x48 0x0048 # LATIN CAPITAL LETTER H 30.121+0x49 0x0049 # LATIN CAPITAL LETTER I 30.122+0x4A 0x004A # LATIN CAPITAL LETTER J 30.123+0x4B 0x004B # LATIN CAPITAL LETTER K 30.124+0x4C 0x004C # LATIN CAPITAL LETTER L 30.125+0x4D 0x004D # LATIN CAPITAL LETTER M 30.126+0x4E 0x004E # LATIN CAPITAL LETTER N 30.127+0x4F 0x004F # LATIN CAPITAL LETTER O 30.128+0x50 0x0050 # LATIN CAPITAL LETTER P 30.129+0x51 0x0051 # LATIN CAPITAL LETTER Q 30.130+0x52 0x0052 # LATIN CAPITAL LETTER R 30.131+0x53 0x0053 # LATIN CAPITAL LETTER S 30.132+0x54 0x0054 # LATIN CAPITAL LETTER T 30.133+0x55 0x0055 # LATIN CAPITAL LETTER U 30.134+0x56 0x0056 # LATIN CAPITAL LETTER V 30.135+0x57 0x0057 # LATIN CAPITAL LETTER W 30.136+0x58 0x0058 # LATIN CAPITAL LETTER X 30.137+0x59 0x0059 # LATIN CAPITAL LETTER Y 30.138+0x5A 0x005A # LATIN CAPITAL LETTER Z 30.139+0x5B 0x005B # LEFT SQUARE BRACKET 30.140+0x5C 0x005C # REVERSE SOLIDUS 30.141+0x5D 0x005D # RIGHT SQUARE BRACKET 30.142+0x5E 0x005E # CIRCUMFLEX ACCENT 30.143+0x5F 0x005F # LOW LINE 30.144+0x60 0x0060 # GRAVE ACCENT 30.145+0x61 0x0061 # LATIN SMALL LETTER A 30.146+0x62 0x0062 # LATIN SMALL LETTER B 30.147+0x63 0x0063 # LATIN SMALL LETTER C 30.148+0x64 0x0064 # LATIN SMALL LETTER D 30.149+0x65 0x0065 # LATIN SMALL LETTER E 30.150+0x66 0x0066 # LATIN SMALL LETTER F 30.151+0x67 0x0067 # LATIN SMALL LETTER G 30.152+0x68 0x0068 # LATIN SMALL LETTER H 30.153+0x69 0x0069 # LATIN SMALL LETTER I 30.154+0x6A 0x006A # LATIN SMALL LETTER J 30.155+0x6B 0x006B # LATIN SMALL LETTER K 30.156+0x6C 0x006C # LATIN SMALL LETTER L 30.157+0x6D 0x006D # LATIN SMALL LETTER M 30.158+0x6E 0x006E # LATIN SMALL LETTER N 30.159+0x6F 0x006F # LATIN SMALL LETTER O 30.160+0x70 0x0070 # LATIN SMALL LETTER P 30.161+0x71 0x0071 # LATIN SMALL LETTER Q 30.162+0x72 0x0072 # LATIN SMALL LETTER R 30.163+0x73 0x0073 # LATIN SMALL LETTER S 30.164+0x74 0x0074 # LATIN SMALL LETTER T 30.165+0x75 0x0075 # LATIN SMALL LETTER U 30.166+0x76 0x0076 # LATIN SMALL LETTER V 30.167+0x77 0x0077 # LATIN SMALL LETTER W 30.168+0x78 0x0078 # LATIN SMALL LETTER X 30.169+0x79 0x0079 # LATIN SMALL LETTER Y 30.170+0x7A 0x007A # LATIN SMALL LETTER Z 30.171+0x7B 0x007B # LEFT CURLY BRACKET 30.172+0x7C 0x007C # VERTICAL LINE 30.173+0x7D 0x007D # RIGHT CURLY BRACKET 30.174+0x7E 0x007E # TILDE 30.175+0x7F 0x007F # DELETE 30.176+0x80 0x0080 # <control> 30.177+0x81 0x0081 # <control> 30.178+0x82 0x0082 # <control> 30.179+0x83 0x0083 # <control> 30.180+0x84 0x0084 # <control> 30.181+0x85 0x0085 # <control> 30.182+0x86 0x0086 # <control> 30.183+0x87 0x0087 # <control> 30.184+0x88 0x0088 # <control> 30.185+0x89 0x0089 # <control> 30.186+0x8A 0x008A # <control> 30.187+0x8B 0x008B # <control> 30.188+0x8C 0x008C # <control> 30.189+0x8D 0x008D # <control> 30.190+0x8E 0x008E # <control> 30.191+0x8F 0x008F # <control> 30.192+0x90 0x0090 # <control> 30.193+0x91 0x0091 # <control> 30.194+0x92 0x0092 # <control> 30.195+0x93 0x0093 # <control> 30.196+0x94 0x0094 # <control> 30.197+0x95 0x0095 # <control> 30.198+0x96 0x0096 # <control> 30.199+0x97 0x0097 # <control> 30.200+0x98 0x0098 # <control> 30.201+0x99 0x0099 # <control> 30.202+0x9A 0x009A # <control> 30.203+0x9B 0x009B # <control> 30.204+0x9C 0x009C # <control> 30.205+0x9D 0x009D # <control> 30.206+0x9E 0x009E # <control> 30.207+0x9F 0x009F # <control> 30.208+0xA0 0x00A0 # NO-BREAK SPACE 30.209+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK 30.210+0xA2 0x0105 # LATIN SMALL LETTER A WITH OGONEK 30.211+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE 30.212+0xA4 0x20AC # EURO SIGN 30.213+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK 30.214+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON 30.215+0xA7 0x00A7 # SECTION SIGN 30.216+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON 30.217+0xA9 0x00A9 # COPYRIGHT SIGN 30.218+0xAA 0x0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW 30.219+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 30.220+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE 30.221+0xAD 0x00AD # SOFT HYPHEN 30.222+0xAE 0x017A # LATIN SMALL LETTER Z WITH ACUTE 30.223+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE 30.224+0xB0 0x00B0 # DEGREE SIGN 30.225+0xB1 0x00B1 # PLUS-MINUS SIGN 30.226+0xB2 0x010C # LATIN CAPITAL LETTER C WITH CARON 30.227+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE 30.228+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON 30.229+0xB5 0x201D # RIGHT DOUBLE QUOTATION MARK 30.230+0xB6 0x00B6 # PILCROW SIGN 30.231+0xB7 0x00B7 # MIDDLE DOT 30.232+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON 30.233+0xB9 0x010D # LATIN SMALL LETTER C WITH CARON 30.234+0xBA 0x0219 # LATIN SMALL LETTER S WITH COMMA BELOW 30.235+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 30.236+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE 30.237+0xBD 0x0153 # LATIN SMALL LIGATURE OE 30.238+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS 30.239+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE 30.240+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE 30.241+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 30.242+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 30.243+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE 30.244+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 30.245+0xC5 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE 30.246+0xC6 0x00C6 # LATIN CAPITAL LETTER AE 30.247+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 30.248+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE 30.249+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 30.250+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 30.251+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 30.252+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE 30.253+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 30.254+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 30.255+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 30.256+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE 30.257+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE 30.258+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE 30.259+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 30.260+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 30.261+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 30.262+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 30.263+0xD7 0x015A # LATIN CAPITAL LETTER S WITH ACUTE 30.264+0xD8 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 30.265+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE 30.266+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 30.267+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 30.268+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 30.269+0xDD 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK 30.270+0xDE 0x021A # LATIN CAPITAL LETTER T WITH COMMA BELOW 30.271+0xDF 0x00DF # LATIN SMALL LETTER SHARP S 30.272+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE 30.273+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 30.274+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 30.275+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE 30.276+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 30.277+0xE5 0x0107 # LATIN SMALL LETTER C WITH ACUTE 30.278+0xE6 0x00E6 # LATIN SMALL LETTER AE 30.279+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 30.280+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE 30.281+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 30.282+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX 30.283+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 30.284+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE 30.285+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 30.286+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 30.287+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 30.288+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE 30.289+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE 30.290+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE 30.291+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 30.292+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 30.293+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE 30.294+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 30.295+0xF7 0x015B # LATIN SMALL LETTER S WITH ACUTE 30.296+0xF8 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE 30.297+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE 30.298+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 30.299+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 30.300+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 30.301+0xFD 0x0119 # LATIN SMALL LETTER E WITH OGONEK 30.302+0xFE 0x021B # LATIN SMALL LETTER T WITH COMMA BELOW 30.303+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
31.1new file mode 100755 31.2--- /dev/null 31.3+++ b/sys/lib/antiword/8859-2.txt 31.4@@ -0,0 +1,303 @@ 31.5+# 31.6+# Name: ISO 8859-2:1999 to Unicode 31.7+# Unicode version: 3.0 31.8+# Table version: 1.0 31.9+# Table format: Format A 31.10+# Date: 1999 July 27 31.11+# Authors: Ken Whistler <kenw@sybase.com> 31.12+# 31.13+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. 31.14+# 31.15+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). 31.16+# No claims are made as to fitness for any particular purpose. No 31.17+# warranties of any kind are expressed or implied. The recipient 31.18+# agrees to determine applicability of information provided. If this 31.19+# file has been provided on optical media by Unicode, Inc., the sole 31.20+# remedy for any claim will be exchange of defective media within 90 31.21+# days of receipt. 31.22+# 31.23+# Unicode, Inc. hereby grants the right to freely use the information 31.24+# supplied in this file in the creation of products supporting the 31.25+# Unicode Standard, and to make copies of this file in any form for 31.26+# internal or external distribution as long as this notice remains 31.27+# attached. 31.28+# 31.29+# General notes: 31.30+# 31.31+# This table contains the data the Unicode Consortium has on how 31.32+# ISO/IEC 8859-2:1999 characters map into Unicode. 31.33+# 31.34+# Format: Three tab-separated columns 31.35+# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) 31.36+# Column #2 is the Unicode (in hex as 0xXXXX) 31.37+# Column #3 the Unicode name (follows a comment sign, '#') 31.38+# 31.39+# The entries are in ISO/IEC 8859-2 order. 31.40+# 31.41+# Version history 31.42+# 1.0 version updates 0.1 version by adding mappings for all 31.43+# control characters. 31.44+# 31.45+# Updated versions of this file may be found in: 31.46+# <ftp://ftp.unicode.org/Public/MAPPINGS/> 31.47+# 31.48+# Any comments or problems, contact <errata@unicode.org> 31.49+# Please note that <errata@unicode.org> is an archival address; 31.50+# notices will be checked, but do not expect an immediate response. 31.51+# 31.52+0x00 0x0000 # NULL 31.53+0x01 0x0001 # START OF HEADING 31.54+0x02 0x0002 # START OF TEXT 31.55+0x03 0x0003 # END OF TEXT 31.56+0x04 0x0004 # END OF TRANSMISSION 31.57+0x05 0x0005 # ENQUIRY 31.58+0x06 0x0006 # ACKNOWLEDGE 31.59+0x07 0x0007 # BELL 31.60+0x08 0x0008 # BACKSPACE 31.61+0x09 0x0009 # HORIZONTAL TABULATION 31.62+0x0A 0x000A # LINE FEED 31.63+0x0B 0x000B # VERTICAL TABULATION 31.64+0x0C 0x000C # FORM FEED 31.65+0x0D 0x000D # CARRIAGE RETURN 31.66+0x0E 0x000E # SHIFT OUT 31.67+0x0F 0x000F # SHIFT IN 31.68+0x10 0x0010 # DATA LINK ESCAPE 31.69+0x11 0x0011 # DEVICE CONTROL ONE 31.70+0x12 0x0012 # DEVICE CONTROL TWO 31.71+0x13 0x0013 # DEVICE CONTROL THREE 31.72+0x14 0x0014 # DEVICE CONTROL FOUR 31.73+0x15 0x0015 # NEGATIVE ACKNOWLEDGE 31.74+0x16 0x0016 # SYNCHRONOUS IDLE 31.75+0x17 0x0017 # END OF TRANSMISSION BLOCK 31.76+0x18 0x0018 # CANCEL 31.77+0x19 0x0019 # END OF MEDIUM 31.78+0x1A 0x001A # SUBSTITUTE 31.79+0x1B 0x001B # ESCAPE 31.80+0x1C 0x001C # FILE SEPARATOR 31.81+0x1D 0x001D # GROUP SEPARATOR 31.82+0x1E 0x001E # RECORD SEPARATOR 31.83+0x1F 0x001F # UNIT SEPARATOR 31.84+0x20 0x0020 # SPACE 31.85+0x21 0x0021 # EXCLAMATION MARK 31.86+0x22 0x0022 # QUOTATION MARK 31.87+0x23 0x0023 # NUMBER SIGN 31.88+0x24 0x0024 # DOLLAR SIGN 31.89+0x25 0x0025 # PERCENT SIGN 31.90+0x26 0x0026 # AMPERSAND 31.91+0x27 0x0027 # APOSTROPHE 31.92+0x28 0x0028 # LEFT PARENTHESIS 31.93+0x29 0x0029 # RIGHT PARENTHESIS 31.94+0x2A 0x002A # ASTERISK 31.95+0x2B 0x002B # PLUS SIGN 31.96+0x2C 0x002C # COMMA 31.97+0x2D 0x002D # HYPHEN-MINUS 31.98+0x2E 0x002E # FULL STOP 31.99+0x2F 0x002F # SOLIDUS 31.100+0x30 0x0030 # DIGIT ZERO 31.101+0x31 0x0031 # DIGIT ONE 31.102+0x32 0x0032 # DIGIT TWO 31.103+0x33 0x0033 # DIGIT THREE 31.104+0x34 0x0034 # DIGIT FOUR 31.105+0x35 0x0035 # DIGIT FIVE 31.106+0x36 0x0036 # DIGIT SIX 31.107+0x37 0x0037 # DIGIT SEVEN 31.108+0x38 0x0038 # DIGIT EIGHT 31.109+0x39 0x0039 # DIGIT NINE 31.110+0x3A 0x003A # COLON 31.111+0x3B 0x003B # SEMICOLON 31.112+0x3C 0x003C # LESS-THAN SIGN 31.113+0x3D 0x003D # EQUALS SIGN 31.114+0x3E 0x003E # GREATER-THAN SIGN 31.115+0x3F 0x003F # QUESTION MARK 31.116+0x40 0x0040 # COMMERCIAL AT 31.117+0x41 0x0041 # LATIN CAPITAL LETTER A 31.118+0x42 0x0042 # LATIN CAPITAL LETTER B 31.119+0x43 0x0043 # LATIN CAPITAL LETTER C 31.120+0x44 0x0044 # LATIN CAPITAL LETTER D 31.121+0x45 0x0045 # LATIN CAPITAL LETTER E 31.122+0x46 0x0046 # LATIN CAPITAL LETTER F 31.123+0x47 0x0047 # LATIN CAPITAL LETTER G 31.124+0x48 0x0048 # LATIN CAPITAL LETTER H 31.125+0x49 0x0049 # LATIN CAPITAL LETTER I 31.126+0x4A 0x004A # LATIN CAPITAL LETTER J 31.127+0x4B 0x004B # LATIN CAPITAL LETTER K 31.128+0x4C 0x004C # LATIN CAPITAL LETTER L 31.129+0x4D 0x004D # LATIN CAPITAL LETTER M 31.130+0x4E 0x004E # LATIN CAPITAL LETTER N 31.131+0x4F 0x004F # LATIN CAPITAL LETTER O 31.132+0x50 0x0050 # LATIN CAPITAL LETTER P 31.133+0x51 0x0051 # LATIN CAPITAL LETTER Q 31.134+0x52 0x0052 # LATIN CAPITAL LETTER R 31.135+0x53 0x0053 # LATIN CAPITAL LETTER S 31.136+0x54 0x0054 # LATIN CAPITAL LETTER T 31.137+0x55 0x0055 # LATIN CAPITAL LETTER U 31.138+0x56 0x0056 # LATIN CAPITAL LETTER V 31.139+0x57 0x0057 # LATIN CAPITAL LETTER W 31.140+0x58 0x0058 # LATIN CAPITAL LETTER X 31.141+0x59 0x0059 # LATIN CAPITAL LETTER Y 31.142+0x5A 0x005A # LATIN CAPITAL LETTER Z 31.143+0x5B 0x005B # LEFT SQUARE BRACKET 31.144+0x5C 0x005C # REVERSE SOLIDUS 31.145+0x5D 0x005D # RIGHT SQUARE BRACKET 31.146+0x5E 0x005E # CIRCUMFLEX ACCENT 31.147+0x5F 0x005F # LOW LINE 31.148+0x60 0x0060 # GRAVE ACCENT 31.149+0x61 0x0061 # LATIN SMALL LETTER A 31.150+0x62 0x0062 # LATIN SMALL LETTER B 31.151+0x63 0x0063 # LATIN SMALL LETTER C 31.152+0x64 0x0064 # LATIN SMALL LETTER D 31.153+0x65 0x0065 # LATIN SMALL LETTER E 31.154+0x66 0x0066 # LATIN SMALL LETTER F 31.155+0x67 0x0067 # LATIN SMALL LETTER G 31.156+0x68 0x0068 # LATIN SMALL LETTER H 31.157+0x69 0x0069 # LATIN SMALL LETTER I 31.158+0x6A 0x006A # LATIN SMALL LETTER J 31.159+0x6B 0x006B # LATIN SMALL LETTER K 31.160+0x6C 0x006C # LATIN SMALL LETTER L 31.161+0x6D 0x006D # LATIN SMALL LETTER M 31.162+0x6E 0x006E # LATIN SMALL LETTER N 31.163+0x6F 0x006F # LATIN SMALL LETTER O 31.164+0x70 0x0070 # LATIN SMALL LETTER P 31.165+0x71 0x0071 # LATIN SMALL LETTER Q 31.166+0x72 0x0072 # LATIN SMALL LETTER R 31.167+0x73 0x0073 # LATIN SMALL LETTER S 31.168+0x74 0x0074 # LATIN SMALL LETTER T 31.169+0x75 0x0075 # LATIN SMALL LETTER U 31.170+0x76 0x0076 # LATIN SMALL LETTER V 31.171+0x77 0x0077 # LATIN SMALL LETTER W 31.172+0x78 0x0078 # LATIN SMALL LETTER X 31.173+0x79 0x0079 # LATIN SMALL LETTER Y 31.174+0x7A 0x007A # LATIN SMALL LETTER Z 31.175+0x7B 0x007B # LEFT CURLY BRACKET 31.176+0x7C 0x007C # VERTICAL LINE 31.177+0x7D 0x007D # RIGHT CURLY BRACKET 31.178+0x7E 0x007E # TILDE 31.179+0x7F 0x007F # DELETE 31.180+0x80 0x0080 # <control> 31.181+0x81 0x0081 # <control> 31.182+0x82 0x0082 # <control> 31.183+0x83 0x0083 # <control> 31.184+0x84 0x0084 # <control> 31.185+0x85 0x0085 # <control> 31.186+0x86 0x0086 # <control> 31.187+0x87 0x0087 # <control> 31.188+0x88 0x0088 # <control> 31.189+0x89 0x0089 # <control> 31.190+0x8A 0x008A # <control> 31.191+0x8B 0x008B # <control> 31.192+0x8C 0x008C # <control> 31.193+0x8D 0x008D # <control> 31.194+0x8E 0x008E # <control> 31.195+0x8F 0x008F # <control> 31.196+0x90 0x0090 # <control> 31.197+0x91 0x0091 # <control> 31.198+0x92 0x0092 # <control> 31.199+0x93 0x0093 # <control> 31.200+0x94 0x0094 # <control> 31.201+0x95 0x0095 # <control> 31.202+0x96 0x0096 # <control> 31.203+0x97 0x0097 # <control> 31.204+0x98 0x0098 # <control> 31.205+0x99 0x0099 # <control> 31.206+0x9A 0x009A # <control> 31.207+0x9B 0x009B # <control> 31.208+0x9C 0x009C # <control> 31.209+0x9D 0x009D # <control> 31.210+0x9E 0x009E # <control> 31.211+0x9F 0x009F # <control> 31.212+0xA0 0x00A0 # NO-BREAK SPACE 31.213+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK 31.214+0xA2 0x02D8 # BREVE 31.215+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE 31.216+0xA4 0x00A4 # CURRENCY SIGN 31.217+0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON 31.218+0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE 31.219+0xA7 0x00A7 # SECTION SIGN 31.220+0xA8 0x00A8 # DIAERESIS 31.221+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON 31.222+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA 31.223+0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON 31.224+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE 31.225+0xAD 0x00AD # SOFT HYPHEN 31.226+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON 31.227+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE 31.228+0xB0 0x00B0 # DEGREE SIGN 31.229+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK 31.230+0xB2 0x02DB # OGONEK 31.231+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE 31.232+0xB4 0x00B4 # ACUTE ACCENT 31.233+0xB5 0x013E # LATIN SMALL LETTER L WITH CARON 31.234+0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE 31.235+0xB7 0x02C7 # CARON 31.236+0xB8 0x00B8 # CEDILLA 31.237+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON 31.238+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA