Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
4 bc7cb1a1 2003-11-23 devnull
5 bc7cb1a1 2003-11-23 devnull unsigned char odata[16];
6 c665ab76 2017-10-01 0intro unsigned char data[32];
7 bc7cb1a1 2003-11-23 devnull int ndata;
8 c665ab76 2017-10-01 0intro int nread;
9 bc7cb1a1 2003-11-23 devnull unsigned long addr;
10 bc7cb1a1 2003-11-23 devnull int repeats;
11 bc7cb1a1 2003-11-23 devnull int swizzle;
12 01e3847b 2013-03-11 rsc int swizzle8;
13 bc7cb1a1 2003-11-23 devnull int flush;
14 bc7cb1a1 2003-11-23 devnull int abase=2;
15 bc7cb1a1 2003-11-23 devnull int xd(char *, int);
16 c665ab76 2017-10-01 0intro void xprint(char *, ...);
17 075c3bdc 2013-09-26 0intro void initarg(void), swizz(void), swizz8(void);
18 bc7cb1a1 2003-11-23 devnull enum{
19 c665ab76 2017-10-01 0intro Narg=10,
20 c665ab76 2017-10-01 0intro
21 c665ab76 2017-10-01 0intro TNone=0,
22 c665ab76 2017-10-01 0intro TAscii,
23 c665ab76 2017-10-01 0intro TRune,
24 bc7cb1a1 2003-11-23 devnull };
25 bc7cb1a1 2003-11-23 devnull typedef struct Arg Arg;
26 bc7cb1a1 2003-11-23 devnull typedef void fmtfn(char *);
27 bc7cb1a1 2003-11-23 devnull struct Arg
28 bc7cb1a1 2003-11-23 devnull {
29 c665ab76 2017-10-01 0intro int chartype; /* TNone, TAscii, TRunes */
30 bc7cb1a1 2003-11-23 devnull int loglen; /* 0==1, 1==2, 2==4, 3==8 */
31 bc7cb1a1 2003-11-23 devnull int base; /* 0==8, 1==10, 2==16 */
32 bc7cb1a1 2003-11-23 devnull fmtfn *fn; /* function to call with data */
33 bc7cb1a1 2003-11-23 devnull char *afmt; /* format to use to print address */
34 bc7cb1a1 2003-11-23 devnull char *fmt; /* format to use to print data */
35 bc7cb1a1 2003-11-23 devnull }arg[Narg];
36 bc7cb1a1 2003-11-23 devnull int narg;
37 bc7cb1a1 2003-11-23 devnull
38 c665ab76 2017-10-01 0intro fmtfn fmt0, fmt1, fmt2, fmt3, fmtc, fmtr;
39 bc7cb1a1 2003-11-23 devnull fmtfn *fmt[4] = {
40 bc7cb1a1 2003-11-23 devnull fmt0,
41 bc7cb1a1 2003-11-23 devnull fmt1,
42 bc7cb1a1 2003-11-23 devnull fmt2,
43 bc7cb1a1 2003-11-23 devnull fmt3
44 bc7cb1a1 2003-11-23 devnull };
45 bc7cb1a1 2003-11-23 devnull
46 bc7cb1a1 2003-11-23 devnull char *dfmt[4][3] = {
47 bc7cb1a1 2003-11-23 devnull " %.3uo", " %.3ud", " %.2ux",
48 bc7cb1a1 2003-11-23 devnull " %.6uo", " %.5ud", " %.4ux",
49 bc7cb1a1 2003-11-23 devnull " %.11luo", " %.10lud", " %.8lux",
50 bc7cb1a1 2003-11-23 devnull " %.22lluo", " %.20llud", " %.16llux",
51 bc7cb1a1 2003-11-23 devnull };
52 bc7cb1a1 2003-11-23 devnull
53 bc7cb1a1 2003-11-23 devnull char *cfmt[3][3] = {
54 c665ab76 2017-10-01 0intro " %c", " %c", " %c",
55 bc7cb1a1 2003-11-23 devnull " %.3s", " %.3s", " %.2s",
56 bc7cb1a1 2003-11-23 devnull " %.3uo", " %.3ud", " %.2ux",
57 bc7cb1a1 2003-11-23 devnull };
58 bc7cb1a1 2003-11-23 devnull
59 c665ab76 2017-10-01 0intro char *rfmt[1][1] = {
60 c665ab76 2017-10-01 0intro " %2.2C",
61 c665ab76 2017-10-01 0intro };
62 c665ab76 2017-10-01 0intro
63 bc7cb1a1 2003-11-23 devnull char *afmt[2][3] = {
64 bc7cb1a1 2003-11-23 devnull "%.7luo ", "%.7lud ", "%.7lux ",
65 bc7cb1a1 2003-11-23 devnull "%7luo ", "%7lud ", "%7lux ",
66 bc7cb1a1 2003-11-23 devnull };
67 bc7cb1a1 2003-11-23 devnull
68 bc7cb1a1 2003-11-23 devnull Biobuf bin;
69 bc7cb1a1 2003-11-23 devnull Biobuf bout;
70 bc7cb1a1 2003-11-23 devnull
71 bc7cb1a1 2003-11-23 devnull void
72 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
73 bc7cb1a1 2003-11-23 devnull {
74 bc7cb1a1 2003-11-23 devnull int i, err;
75 bc7cb1a1 2003-11-23 devnull Arg *ap;
76 bc7cb1a1 2003-11-23 devnull
77 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
78 bc7cb1a1 2003-11-23 devnull err = 0;
79 bc7cb1a1 2003-11-23 devnull ap = 0;
80 bc7cb1a1 2003-11-23 devnull while(argc>1 && argv[1][0]=='-' && argv[1][1]){
81 bc7cb1a1 2003-11-23 devnull --argc;
82 bc7cb1a1 2003-11-23 devnull argv++;
83 bc7cb1a1 2003-11-23 devnull argv[0]++;
84 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'r'){
85 bc7cb1a1 2003-11-23 devnull repeats = 1;
86 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
87 bc7cb1a1 2003-11-23 devnull goto Usage;
88 bc7cb1a1 2003-11-23 devnull continue;
89 bc7cb1a1 2003-11-23 devnull }
90 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 's'){
91 bc7cb1a1 2003-11-23 devnull swizzle = 1;
92 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
93 bc7cb1a1 2003-11-23 devnull goto Usage;
94 bc7cb1a1 2003-11-23 devnull continue;
95 bc7cb1a1 2003-11-23 devnull }
96 01e3847b 2013-03-11 rsc if(argv[0][0] == 'S'){
97 01e3847b 2013-03-11 rsc swizzle8 = 1;
98 01e3847b 2013-03-11 rsc if(argv[0][1])
99 01e3847b 2013-03-11 rsc goto Usage;
100 01e3847b 2013-03-11 rsc continue;
101 01e3847b 2013-03-11 rsc }
102 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'u'){
103 bc7cb1a1 2003-11-23 devnull flush = 1;
104 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
105 bc7cb1a1 2003-11-23 devnull goto Usage;
106 bc7cb1a1 2003-11-23 devnull continue;
107 bc7cb1a1 2003-11-23 devnull }
108 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'a'){
109 bc7cb1a1 2003-11-23 devnull argv[0]++;
110 bc7cb1a1 2003-11-23 devnull switch(argv[0][0]){
111 bc7cb1a1 2003-11-23 devnull case 'o':
112 bc7cb1a1 2003-11-23 devnull abase = 0;
113 bc7cb1a1 2003-11-23 devnull break;
114 bc7cb1a1 2003-11-23 devnull case 'd':
115 bc7cb1a1 2003-11-23 devnull abase = 1;
116 bc7cb1a1 2003-11-23 devnull break;
117 bc7cb1a1 2003-11-23 devnull case 'x':
118 bc7cb1a1 2003-11-23 devnull abase = 2;
119 bc7cb1a1 2003-11-23 devnull break;
120 bc7cb1a1 2003-11-23 devnull default:
121 bc7cb1a1 2003-11-23 devnull goto Usage;
122 bc7cb1a1 2003-11-23 devnull }
123 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
124 bc7cb1a1 2003-11-23 devnull goto Usage;
125 bc7cb1a1 2003-11-23 devnull continue;
126 bc7cb1a1 2003-11-23 devnull }
127 bc7cb1a1 2003-11-23 devnull ap = &arg[narg];
128 bc7cb1a1 2003-11-23 devnull initarg();
129 bc7cb1a1 2003-11-23 devnull while(argv[0][0]){
130 bc7cb1a1 2003-11-23 devnull switch(argv[0][0]){
131 bc7cb1a1 2003-11-23 devnull case 'c':
132 c665ab76 2017-10-01 0intro ap->chartype = TAscii;
133 bc7cb1a1 2003-11-23 devnull ap->loglen = 0;
134 bc7cb1a1 2003-11-23 devnull if(argv[0][1] || argv[0][-1]!='-')
135 bc7cb1a1 2003-11-23 devnull goto Usage;
136 bc7cb1a1 2003-11-23 devnull break;
137 c665ab76 2017-10-01 0intro case 'R':
138 c665ab76 2017-10-01 0intro ap->chartype = TRune;
139 c665ab76 2017-10-01 0intro ap->loglen = 0;
140 c665ab76 2017-10-01 0intro if(argv[0][1] || argv[0][-1]!='-')
141 c665ab76 2017-10-01 0intro goto Usage;
142 c665ab76 2017-10-01 0intro break;
143 bc7cb1a1 2003-11-23 devnull case 'o':
144 bc7cb1a1 2003-11-23 devnull ap->base = 0;
145 bc7cb1a1 2003-11-23 devnull break;
146 bc7cb1a1 2003-11-23 devnull case 'd':
147 bc7cb1a1 2003-11-23 devnull ap->base = 1;
148 bc7cb1a1 2003-11-23 devnull break;
149 bc7cb1a1 2003-11-23 devnull case 'x':
150 bc7cb1a1 2003-11-23 devnull ap->base = 2;
151 bc7cb1a1 2003-11-23 devnull break;
152 bc7cb1a1 2003-11-23 devnull case 'b':
153 bc7cb1a1 2003-11-23 devnull case '1':
154 bc7cb1a1 2003-11-23 devnull ap->loglen = 0;
155 bc7cb1a1 2003-11-23 devnull break;
156 bc7cb1a1 2003-11-23 devnull case 'w':
157 bc7cb1a1 2003-11-23 devnull case '2':
158 bc7cb1a1 2003-11-23 devnull ap->loglen = 1;
159 bc7cb1a1 2003-11-23 devnull break;
160 bc7cb1a1 2003-11-23 devnull case 'l':
161 bc7cb1a1 2003-11-23 devnull case '4':
162 bc7cb1a1 2003-11-23 devnull ap->loglen = 2;
163 bc7cb1a1 2003-11-23 devnull break;
164 bc7cb1a1 2003-11-23 devnull case 'v':
165 bc7cb1a1 2003-11-23 devnull case '8':
166 bc7cb1a1 2003-11-23 devnull ap->loglen = 3;
167 bc7cb1a1 2003-11-23 devnull break;
168 bc7cb1a1 2003-11-23 devnull default:
169 bc7cb1a1 2003-11-23 devnull Usage:
170 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n");
171 bc7cb1a1 2003-11-23 devnull exits("usage");
172 bc7cb1a1 2003-11-23 devnull }
173 bc7cb1a1 2003-11-23 devnull argv[0]++;
174 bc7cb1a1 2003-11-23 devnull }
175 c665ab76 2017-10-01 0intro if(ap->chartype == TRune)
176 c665ab76 2017-10-01 0intro ap->fn = fmtr;
177 c665ab76 2017-10-01 0intro else if(ap->chartype == TAscii)
178 bc7cb1a1 2003-11-23 devnull ap->fn = fmtc;
179 bc7cb1a1 2003-11-23 devnull else
180 bc7cb1a1 2003-11-23 devnull ap->fn = fmt[ap->loglen];
181 bc7cb1a1 2003-11-23 devnull ap->fmt = dfmt[ap->loglen][ap->base];
182 bc7cb1a1 2003-11-23 devnull ap->afmt = afmt[ap>arg][abase];
183 bc7cb1a1 2003-11-23 devnull }
184 bc7cb1a1 2003-11-23 devnull if(narg == 0)
185 bc7cb1a1 2003-11-23 devnull initarg();
186 bc7cb1a1 2003-11-23 devnull if(argc == 1)
187 bc7cb1a1 2003-11-23 devnull err = xd(0, 0);
188 bc7cb1a1 2003-11-23 devnull else if(argc == 2)
189 bc7cb1a1 2003-11-23 devnull err = xd(argv[1], 0);
190 bc7cb1a1 2003-11-23 devnull else for(i=1; i<argc; i++)
191 bc7cb1a1 2003-11-23 devnull err |= xd(argv[i], 1);
192 bc7cb1a1 2003-11-23 devnull exits(err? "error" : 0);
193 bc7cb1a1 2003-11-23 devnull }
194 bc7cb1a1 2003-11-23 devnull
195 bc7cb1a1 2003-11-23 devnull void
196 bc7cb1a1 2003-11-23 devnull initarg(void)
197 bc7cb1a1 2003-11-23 devnull {
198 bc7cb1a1 2003-11-23 devnull Arg *ap;
199 bc7cb1a1 2003-11-23 devnull
200 bc7cb1a1 2003-11-23 devnull ap = &arg[narg++];
201 bc7cb1a1 2003-11-23 devnull if(narg >= Narg){
202 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: too many formats (max %d)\n", Narg);
203 bc7cb1a1 2003-11-23 devnull exits("usage");
204 bc7cb1a1 2003-11-23 devnull }
205 c665ab76 2017-10-01 0intro ap->chartype = TNone;
206 bc7cb1a1 2003-11-23 devnull ap->loglen = 2;
207 bc7cb1a1 2003-11-23 devnull ap->base = 2;
208 bc7cb1a1 2003-11-23 devnull ap->fn = fmt2;
209 bc7cb1a1 2003-11-23 devnull ap->fmt = dfmt[ap->loglen][ap->base];
210 bc7cb1a1 2003-11-23 devnull ap->afmt = afmt[narg>1][abase];
211 bc7cb1a1 2003-11-23 devnull }
212 bc7cb1a1 2003-11-23 devnull
213 bc7cb1a1 2003-11-23 devnull int
214 bc7cb1a1 2003-11-23 devnull xd(char *name, int title)
215 bc7cb1a1 2003-11-23 devnull {
216 bc7cb1a1 2003-11-23 devnull int fd;
217 c665ab76 2017-10-01 0intro int i, star, nsee, nleft;
218 bc7cb1a1 2003-11-23 devnull Arg *ap;
219 bc7cb1a1 2003-11-23 devnull Biobuf *bp;
220 bc7cb1a1 2003-11-23 devnull
221 bc7cb1a1 2003-11-23 devnull fd = 0;
222 bc7cb1a1 2003-11-23 devnull if(name){
223 bc7cb1a1 2003-11-23 devnull bp = Bopen(name, OREAD);
224 bc7cb1a1 2003-11-23 devnull if(bp == 0){
225 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: can't open %s\n", name);
226 bc7cb1a1 2003-11-23 devnull return 1;
227 bc7cb1a1 2003-11-23 devnull }
228 bc7cb1a1 2003-11-23 devnull }else{
229 bc7cb1a1 2003-11-23 devnull bp = &bin;
230 bc7cb1a1 2003-11-23 devnull Binit(bp, fd, OREAD);
231 bc7cb1a1 2003-11-23 devnull }
232 bc7cb1a1 2003-11-23 devnull if(title)
233 bc7cb1a1 2003-11-23 devnull xprint("%s\n", (long)name);
234 bc7cb1a1 2003-11-23 devnull addr = 0;
235 bc7cb1a1 2003-11-23 devnull star = 0;
236 c665ab76 2017-10-01 0intro nsee = 16;
237 c665ab76 2017-10-01 0intro nleft = 0;
238 c665ab76 2017-10-01 0intro /* read 32 but see only 16 so that runes are happy */
239 c665ab76 2017-10-01 0intro while((ndata=Bread(bp, data + nleft, 32 - nleft)) >= 0){
240 c665ab76 2017-10-01 0intro ndata += nleft;
241 c665ab76 2017-10-01 0intro nleft = 0;
242 c665ab76 2017-10-01 0intro nread = ndata;
243 c665ab76 2017-10-01 0intro if(ndata>nsee)
244 c665ab76 2017-10-01 0intro ndata = nsee;
245 c665ab76 2017-10-01 0intro else if(ndata<nsee)
246 c665ab76 2017-10-01 0intro for(i=ndata; i<nsee; i++)
247 bc7cb1a1 2003-11-23 devnull data[i] = 0;
248 bc7cb1a1 2003-11-23 devnull if(swizzle)
249 bc7cb1a1 2003-11-23 devnull swizz();
250 01e3847b 2013-03-11 rsc if(swizzle8)
251 01e3847b 2013-03-11 rsc swizz8();
252 c665ab76 2017-10-01 0intro if(ndata==nsee && repeats){
253 bc7cb1a1 2003-11-23 devnull if(addr>0 && data[0]==odata[0]){
254 c665ab76 2017-10-01 0intro for(i=1; i<nsee; i++)
255 bc7cb1a1 2003-11-23 devnull if(data[i] != odata[i])
256 bc7cb1a1 2003-11-23 devnull break;
257 c665ab76 2017-10-01 0intro if(i == nsee){
258 c665ab76 2017-10-01 0intro addr += nsee;
259 bc7cb1a1 2003-11-23 devnull if(star == 0){
260 bc7cb1a1 2003-11-23 devnull star++;
261 bc7cb1a1 2003-11-23 devnull xprint("*\n", 0);
262 bc7cb1a1 2003-11-23 devnull }
263 bc7cb1a1 2003-11-23 devnull continue;
264 bc7cb1a1 2003-11-23 devnull }
265 bc7cb1a1 2003-11-23 devnull }
266 c665ab76 2017-10-01 0intro for(i=0; i<nsee; i++)
267 bc7cb1a1 2003-11-23 devnull odata[i] = data[i];
268 bc7cb1a1 2003-11-23 devnull star = 0;
269 bc7cb1a1 2003-11-23 devnull }
270 bc7cb1a1 2003-11-23 devnull for(ap=arg; ap<&arg[narg]; ap++){
271 bc7cb1a1 2003-11-23 devnull xprint(ap->afmt, addr);
272 bc7cb1a1 2003-11-23 devnull (*ap->fn)(ap->fmt);
273 bc7cb1a1 2003-11-23 devnull xprint("\n", 0);
274 bc7cb1a1 2003-11-23 devnull if(flush)
275 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
276 bc7cb1a1 2003-11-23 devnull }
277 bc7cb1a1 2003-11-23 devnull addr += ndata;
278 c665ab76 2017-10-01 0intro if(ndata<nsee){
279 bc7cb1a1 2003-11-23 devnull xprint(afmt[0][abase], addr);
280 bc7cb1a1 2003-11-23 devnull xprint("\n", 0);
281 bc7cb1a1 2003-11-23 devnull if(flush)
282 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
283 bc7cb1a1 2003-11-23 devnull break;
284 bc7cb1a1 2003-11-23 devnull }
285 c665ab76 2017-10-01 0intro if(nread>nsee){
286 c665ab76 2017-10-01 0intro nleft = nread - nsee;
287 c665ab76 2017-10-01 0intro memmove(data, data + nsee, nleft);
288 c665ab76 2017-10-01 0intro }
289 bc7cb1a1 2003-11-23 devnull }
290 bc7cb1a1 2003-11-23 devnull Bterm(bp);
291 bc7cb1a1 2003-11-23 devnull return 0;
292 bc7cb1a1 2003-11-23 devnull }
293 bc7cb1a1 2003-11-23 devnull
294 bc7cb1a1 2003-11-23 devnull void
295 bc7cb1a1 2003-11-23 devnull swizz(void)
296 bc7cb1a1 2003-11-23 devnull {
297 bc7cb1a1 2003-11-23 devnull uchar *p, *q;
298 bc7cb1a1 2003-11-23 devnull int i;
299 bc7cb1a1 2003-11-23 devnull uchar swdata[16];
300 bc7cb1a1 2003-11-23 devnull
301 bc7cb1a1 2003-11-23 devnull p = data;
302 bc7cb1a1 2003-11-23 devnull q = swdata;
303 bc7cb1a1 2003-11-23 devnull for(i=0; i<16; i++)
304 bc7cb1a1 2003-11-23 devnull *q++ = *p++;
305 bc7cb1a1 2003-11-23 devnull p = data;
306 bc7cb1a1 2003-11-23 devnull q = swdata;
307 bc7cb1a1 2003-11-23 devnull for(i=0; i<4; i++){
308 bc7cb1a1 2003-11-23 devnull p[0] = q[3];
309 bc7cb1a1 2003-11-23 devnull p[1] = q[2];
310 bc7cb1a1 2003-11-23 devnull p[2] = q[1];
311 bc7cb1a1 2003-11-23 devnull p[3] = q[0];
312 bc7cb1a1 2003-11-23 devnull p += 4;
313 bc7cb1a1 2003-11-23 devnull q += 4;
314 01e3847b 2013-03-11 rsc }
315 01e3847b 2013-03-11 rsc }
316 01e3847b 2013-03-11 rsc
317 01e3847b 2013-03-11 rsc void
318 01e3847b 2013-03-11 rsc swizz8(void)
319 01e3847b 2013-03-11 rsc {
320 01e3847b 2013-03-11 rsc uchar *p, *q;
321 01e3847b 2013-03-11 rsc int i;
322 01e3847b 2013-03-11 rsc uchar swdata[16];
323 01e3847b 2013-03-11 rsc
324 01e3847b 2013-03-11 rsc p = data;
325 01e3847b 2013-03-11 rsc q = swdata;
326 01e3847b 2013-03-11 rsc for(i=0; i<16; i++)
327 01e3847b 2013-03-11 rsc *q++ = *p++;
328 01e3847b 2013-03-11 rsc p = data;
329 01e3847b 2013-03-11 rsc q = swdata;
330 20c14efa 2021-01-29 crossd for(i=0; i<2; i++){
331 01e3847b 2013-03-11 rsc p[0] = q[7];
332 01e3847b 2013-03-11 rsc p[1] = q[6];
333 01e3847b 2013-03-11 rsc p[2] = q[5];
334 01e3847b 2013-03-11 rsc p[3] = q[4];
335 01e3847b 2013-03-11 rsc p[4] = q[3];
336 01e3847b 2013-03-11 rsc p[5] = q[2];
337 01e3847b 2013-03-11 rsc p[6] = q[1];
338 01e3847b 2013-03-11 rsc p[7] = q[0];
339 01e3847b 2013-03-11 rsc p += 8;
340 01e3847b 2013-03-11 rsc q += 8;
341 bc7cb1a1 2003-11-23 devnull }
342 bc7cb1a1 2003-11-23 devnull }
343 bc7cb1a1 2003-11-23 devnull
344 bc7cb1a1 2003-11-23 devnull void
345 bc7cb1a1 2003-11-23 devnull fmt0(char *f)
346 bc7cb1a1 2003-11-23 devnull {
347 bc7cb1a1 2003-11-23 devnull int i;
348 bc7cb1a1 2003-11-23 devnull for(i=0; i<ndata; i++)
349 bc7cb1a1 2003-11-23 devnull xprint(f, data[i]);
350 bc7cb1a1 2003-11-23 devnull }
351 bc7cb1a1 2003-11-23 devnull
352 bc7cb1a1 2003-11-23 devnull void
353 bc7cb1a1 2003-11-23 devnull fmt1(char *f)
354 bc7cb1a1 2003-11-23 devnull {
355 bc7cb1a1 2003-11-23 devnull int i;
356 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=2)
357 bc7cb1a1 2003-11-23 devnull xprint(f, (data[i]<<8)|data[i+1]);
358 bc7cb1a1 2003-11-23 devnull }
359 bc7cb1a1 2003-11-23 devnull
360 bc7cb1a1 2003-11-23 devnull void
361 bc7cb1a1 2003-11-23 devnull fmt2(char *f)
362 bc7cb1a1 2003-11-23 devnull {
363 bc7cb1a1 2003-11-23 devnull int i;
364 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=4)
365 54dd92be 2008-01-30 rsc xprint(f, (u32int)((data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]));
366 bc7cb1a1 2003-11-23 devnull }
367 bc7cb1a1 2003-11-23 devnull
368 bc7cb1a1 2003-11-23 devnull void
369 bc7cb1a1 2003-11-23 devnull fmt3(char *f)
370 bc7cb1a1 2003-11-23 devnull {
371 bc7cb1a1 2003-11-23 devnull int i;
372 bc7cb1a1 2003-11-23 devnull unsigned long long v;
373 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=8){
374 bc7cb1a1 2003-11-23 devnull v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
375 bc7cb1a1 2003-11-23 devnull v <<= 32;
376 bc7cb1a1 2003-11-23 devnull v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
377 bc7cb1a1 2003-11-23 devnull if(Bprint(&bout, f, v)<0){
378 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: i/o error\n");
379 bc7cb1a1 2003-11-23 devnull exits("i/o error");
380 bc7cb1a1 2003-11-23 devnull }
381 bc7cb1a1 2003-11-23 devnull }
382 bc7cb1a1 2003-11-23 devnull }
383 bc7cb1a1 2003-11-23 devnull
384 bc7cb1a1 2003-11-23 devnull void
385 c665ab76 2017-10-01 0intro onefmtc(uchar c)
386 c665ab76 2017-10-01 0intro {
387 c665ab76 2017-10-01 0intro switch(c){
388 c665ab76 2017-10-01 0intro case '\t':
389 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\t");
390 c665ab76 2017-10-01 0intro break;
391 c665ab76 2017-10-01 0intro case '\r':
392 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\r");
393 c665ab76 2017-10-01 0intro break;
394 c665ab76 2017-10-01 0intro case '\n':
395 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\n");
396 c665ab76 2017-10-01 0intro break;
397 c665ab76 2017-10-01 0intro case '\b':
398 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\b");
399 c665ab76 2017-10-01 0intro break;
400 c665ab76 2017-10-01 0intro default:
401 c665ab76 2017-10-01 0intro if(c>=0x7F || ' '>c)
402 c665ab76 2017-10-01 0intro xprint(cfmt[2][2], c);
403 c665ab76 2017-10-01 0intro else
404 c665ab76 2017-10-01 0intro xprint(cfmt[0][2], c);
405 c665ab76 2017-10-01 0intro break;
406 c665ab76 2017-10-01 0intro }
407 c665ab76 2017-10-01 0intro }
408 c665ab76 2017-10-01 0intro
409 c665ab76 2017-10-01 0intro void
410 bc7cb1a1 2003-11-23 devnull fmtc(char *f)
411 bc7cb1a1 2003-11-23 devnull {
412 bc7cb1a1 2003-11-23 devnull int i;
413 bc7cb1a1 2003-11-23 devnull
414 bc7cb1a1 2003-11-23 devnull USED(f);
415 bc7cb1a1 2003-11-23 devnull for(i=0; i<ndata; i++)
416 c665ab76 2017-10-01 0intro onefmtc(data[i]);
417 c665ab76 2017-10-01 0intro }
418 c665ab76 2017-10-01 0intro
419 c665ab76 2017-10-01 0intro void
420 c665ab76 2017-10-01 0intro fmtr(char *f)
421 c665ab76 2017-10-01 0intro {
422 c665ab76 2017-10-01 0intro int i, w, cw;
423 c665ab76 2017-10-01 0intro Rune r;
424 c665ab76 2017-10-01 0intro static int nstart;
425 c665ab76 2017-10-01 0intro
426 c665ab76 2017-10-01 0intro USED(f);
427 c665ab76 2017-10-01 0intro if(nstart)
428 c665ab76 2017-10-01 0intro xprint("%*c", 3*nstart, ' ');
429 c665ab76 2017-10-01 0intro for(i=nstart; i<ndata; )
430 c665ab76 2017-10-01 0intro if(data[i] < Runeself)
431 c665ab76 2017-10-01 0intro onefmtc(data[i++]);
432 c665ab76 2017-10-01 0intro else{
433 c665ab76 2017-10-01 0intro w = chartorune(&r, (char *)data+i);
434 c665ab76 2017-10-01 0intro if(w == 1 || i + w>nread)
435 c665ab76 2017-10-01 0intro onefmtc(data[i++]);
436 c665ab76 2017-10-01 0intro else{
437 c665ab76 2017-10-01 0intro cw = w;
438 c665ab76 2017-10-01 0intro if(i + w>ndata)
439 c665ab76 2017-10-01 0intro cw = ndata - i;
440 c665ab76 2017-10-01 0intro xprint(rfmt[0][0], r);
441 c665ab76 2017-10-01 0intro xprint("%*c", 3*cw-3, ' ');
442 c665ab76 2017-10-01 0intro i += w;
443 c665ab76 2017-10-01 0intro }
444 bc7cb1a1 2003-11-23 devnull }
445 c665ab76 2017-10-01 0intro if(i > ndata)
446 c665ab76 2017-10-01 0intro nstart = i - ndata;
447 c665ab76 2017-10-01 0intro else
448 c665ab76 2017-10-01 0intro nstart = 0;
449 bc7cb1a1 2003-11-23 devnull }
450 bc7cb1a1 2003-11-23 devnull
451 bc7cb1a1 2003-11-23 devnull void
452 c665ab76 2017-10-01 0intro xprint(char *fmt, ...)
453 bc7cb1a1 2003-11-23 devnull {
454 c665ab76 2017-10-01 0intro va_list arglist;
455 c665ab76 2017-10-01 0intro
456 c665ab76 2017-10-01 0intro va_start(arglist, fmt);
457 c665ab76 2017-10-01 0intro if(Bvprint(&bout, fmt, arglist)<0){
458 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: i/o error\n");
459 bc7cb1a1 2003-11-23 devnull exits("i/o error");
460 bc7cb1a1 2003-11-23 devnull }
461 c665ab76 2017-10-01 0intro va_end(arglist);
462 bc7cb1a1 2003-11-23 devnull }