Blame


1 7285a491 2004-06-17 devnull #include <u.h>
2 7285a491 2004-06-17 devnull #include <libc.h>
3 7285a491 2004-06-17 devnull #include <bio.h>
4 7285a491 2004-06-17 devnull #include <libsec.h>
5 7285a491 2004-06-17 devnull #include <ctype.h>
6 7285a491 2004-06-17 devnull #include "iso9660.h"
7 7285a491 2004-06-17 devnull
8 7285a491 2004-06-17 devnull /*
9 7285a491 2004-06-17 devnull * We keep an array sorted by bad atom pointer.
10 7285a491 2004-06-17 devnull * The theory is that since we don't free memory very often,
11 7285a491 2004-06-17 devnull * the array will be mostly sorted already and insertions will
12 7285a491 2004-06-17 devnull * usually be near the end, so we won't spend much time
13 7285a491 2004-06-17 devnull * keeping it sorted.
14 7285a491 2004-06-17 devnull */
15 7285a491 2004-06-17 devnull
16 7285a491 2004-06-17 devnull /*
17 7285a491 2004-06-17 devnull * Binary search a Tx list.
18 7285a491 2004-06-17 devnull * If no entry is found, return a pointer to
19 7285a491 2004-06-17 devnull * where a new such entry would go.
20 7285a491 2004-06-17 devnull */
21 7285a491 2004-06-17 devnull static Tx*
22 7285a491 2004-06-17 devnull txsearch(char *atom, Tx *t, int n)
23 7285a491 2004-06-17 devnull {
24 7285a491 2004-06-17 devnull while(n > 0) {
25 7285a491 2004-06-17 devnull if(atom < t[n/2].bad)
26 7285a491 2004-06-17 devnull n = n/2;
27 7285a491 2004-06-17 devnull else if(atom > t[n/2].bad) {
28 7285a491 2004-06-17 devnull t += n/2+1;
29 7285a491 2004-06-17 devnull n -= (n/2+1);
30 7285a491 2004-06-17 devnull } else
31 7285a491 2004-06-17 devnull return &t[n/2];
32 7285a491 2004-06-17 devnull }
33 7285a491 2004-06-17 devnull return t;
34 7285a491 2004-06-17 devnull }
35 7285a491 2004-06-17 devnull
36 7285a491 2004-06-17 devnull void
37 7285a491 2004-06-17 devnull addtx(char *b, char *g)
38 7285a491 2004-06-17 devnull {
39 7285a491 2004-06-17 devnull Tx *t;
40 7285a491 2004-06-17 devnull Conform *c;
41 7285a491 2004-06-17 devnull
42 7285a491 2004-06-17 devnull if(map == nil)
43 7285a491 2004-06-17 devnull map = emalloc(sizeof(*map));
44 7285a491 2004-06-17 devnull c = map;
45 7285a491 2004-06-17 devnull
46 7285a491 2004-06-17 devnull if(c->nt%32 == 0)
47 7285a491 2004-06-17 devnull c->t = erealloc(c->t, (c->nt+32)*sizeof(c->t[0]));
48 7285a491 2004-06-17 devnull t = txsearch(b, c->t, c->nt);
49 7285a491 2004-06-17 devnull if(t < c->t+c->nt && t->bad == b) {
50 7285a491 2004-06-17 devnull fprint(2, "warning: duplicate entry for %s in _conform.map\n", b);
51 7285a491 2004-06-17 devnull return;
52 7285a491 2004-06-17 devnull }
53 7285a491 2004-06-17 devnull
54 7285a491 2004-06-17 devnull if(t != c->t+c->nt)
55 7285a491 2004-06-17 devnull memmove(t+1, t, (c->t+c->nt - t)*sizeof(Tx));
56 7285a491 2004-06-17 devnull t->bad = b;
57 7285a491 2004-06-17 devnull t->good = g;
58 7285a491 2004-06-17 devnull c->nt++;
59 7285a491 2004-06-17 devnull }
60 7285a491 2004-06-17 devnull
61 7285a491 2004-06-17 devnull char*
62 7285a491 2004-06-17 devnull conform(char *s, int isdir)
63 7285a491 2004-06-17 devnull {
64 7285a491 2004-06-17 devnull Tx *t;
65 7285a491 2004-06-17 devnull char buf[10], *g;
66 7285a491 2004-06-17 devnull Conform *c;
67 7285a491 2004-06-17 devnull
68 7285a491 2004-06-17 devnull c = map;
69 7285a491 2004-06-17 devnull s = atom(s);
70 7285a491 2004-06-17 devnull if(c){
71 7285a491 2004-06-17 devnull t = txsearch(s, c->t, c->nt);
72 7285a491 2004-06-17 devnull if(t < c->t+c->nt && t->bad == s)
73 7285a491 2004-06-17 devnull return t->good;
74 7285a491 2004-06-17 devnull }
75 7285a491 2004-06-17 devnull
76 7285a491 2004-06-17 devnull sprint(buf, "%c%.6d", isdir ? 'D' : 'F', c ? c->nt : 0);
77 7285a491 2004-06-17 devnull g = atom(buf);
78 7285a491 2004-06-17 devnull addtx(s, g);
79 7285a491 2004-06-17 devnull return g;
80 7285a491 2004-06-17 devnull }
81 7285a491 2004-06-17 devnull
82 7285a491 2004-06-17 devnull #ifdef NOTUSED
83 7285a491 2004-06-17 devnull static int
84 7285a491 2004-06-17 devnull isalldigit(char *s)
85 7285a491 2004-06-17 devnull {
86 7285a491 2004-06-17 devnull while(*s)
87 7285a491 2004-06-17 devnull if(!isdigit(*s++))
88 7285a491 2004-06-17 devnull return 0;
89 7285a491 2004-06-17 devnull return 1;
90 7285a491 2004-06-17 devnull }
91 7285a491 2004-06-17 devnull #endif
92 7285a491 2004-06-17 devnull
93 7285a491 2004-06-17 devnull static int
94 7285a491 2004-06-17 devnull goodcmp(const void *va, const void *vb)
95 7285a491 2004-06-17 devnull {
96 7285a491 2004-06-17 devnull Tx *a, *b;
97 7285a491 2004-06-17 devnull
98 7285a491 2004-06-17 devnull a = (Tx*)va;
99 7285a491 2004-06-17 devnull b = (Tx*)vb;
100 7285a491 2004-06-17 devnull return strcmp(a->good, b->good);
101 7285a491 2004-06-17 devnull }
102 7285a491 2004-06-17 devnull
103 7285a491 2004-06-17 devnull static int
104 7285a491 2004-06-17 devnull badatomcmp(const void *va, const void *vb)
105 7285a491 2004-06-17 devnull {
106 7285a491 2004-06-17 devnull Tx *a, *b;
107 7285a491 2004-06-17 devnull
108 7285a491 2004-06-17 devnull a = (Tx*)va;
109 7285a491 2004-06-17 devnull b = (Tx*)vb;
110 7285a491 2004-06-17 devnull if(a->good < b->good)
111 7285a491 2004-06-17 devnull return -1;
112 7285a491 2004-06-17 devnull if(a->good > b->good)
113 7285a491 2004-06-17 devnull return 1;
114 7285a491 2004-06-17 devnull return 0;
115 7285a491 2004-06-17 devnull }
116 7285a491 2004-06-17 devnull
117 7285a491 2004-06-17 devnull void
118 7285a491 2004-06-17 devnull wrconform(Cdimg *cd, int n, ulong *pblock, ulong *plength)
119 7285a491 2004-06-17 devnull {
120 7285a491 2004-06-17 devnull char buf[1024];
121 7285a491 2004-06-17 devnull int i;
122 7285a491 2004-06-17 devnull Conform *c;
123 7285a491 2004-06-17 devnull
124 7285a491 2004-06-17 devnull c = map;
125 7285a491 2004-06-17 devnull *pblock = cd->nextblock;
126 7285a491 2004-06-17 devnull if(c==nil || n==c->nt){
127 7285a491 2004-06-17 devnull *plength = 0;
128 7285a491 2004-06-17 devnull return;
129 7285a491 2004-06-17 devnull }
130 7285a491 2004-06-17 devnull
131 7285a491 2004-06-17 devnull Cwseek(cd, cd->nextblock*Blocksize);
132 7285a491 2004-06-17 devnull qsort(c->t, c->nt, sizeof(c->t[0]), goodcmp);
133 7285a491 2004-06-17 devnull for(i=n; i<c->nt; i++) {
134 7285a491 2004-06-17 devnull snprint(buf, sizeof buf, "%s %s\n", c->t[i].good, c->t[i].bad);
135 7285a491 2004-06-17 devnull Cwrite(cd, buf, strlen(buf));
136 7285a491 2004-06-17 devnull }
137 7285a491 2004-06-17 devnull qsort(c->t, c->nt, sizeof(c->t[0]), badatomcmp);
138 7285a491 2004-06-17 devnull *plength = Cwoffset(cd) - *pblock*Blocksize;
139 7285a491 2004-06-17 devnull chat("write _conform.map at %lud+%lud\n", *pblock, *plength);
140 7285a491 2004-06-17 devnull Cpadblock(cd);
141 7285a491 2004-06-17 devnull }