|
|
1.1 root 1: #include <fio.h>
2:
3: unsigned char odata[16];
4: unsigned char data[16];
5: int ndata;
6: unsigned long addr;
7: Fbuffer buf;
8: int repeats;
9: int swizzle;
10: int abase=2;
11:
12: enum{
13: Narg=10
14: };
15: typedef struct Arg Arg;
16: struct Arg{
17: int ascii; /* 0==none, 1==ascii */
18: int loglen; /* 0==1, 1==2, 2==4 */
19: int base; /* 0==8, 1==10, 2==16 */
20: int (*fn)(); /* function to call with data */
21: char *afmt; /* format to use to print address */
22: char *fmt; /* format to use to print data */
23: }arg[Narg];
24: int narg;
25:
26: extern int fmt0(), fmt1(), fmt2(), fmtc();
27:
28: int (*fmt[3])()={
29: fmt0, fmt1, fmt2,
30: };
31: char *dfmt[3][3]={
32: " %.3uo", " %.3ud", " %.2ux",
33: " %.6uo", " %.5ud", " %.4ux",
34: " %.11luo", " %.10lud", " %.8lux",
35: };
36: char *cfmt[3][3]={
37: " %c", " %c", " %c",
38: " %.3s", " %.3s", " %.2s",
39: " %.3uo", " %.3ud", " %.2ux",
40: };
41: char *afmt[2][3]={
42: "%.7luo ", "%.7lud ", "%.7lux ",
43: "%7luo ", "%7lud ", "%7lux ",
44: };
45: main(argc, argv)
46: char *argv[];
47: {
48: int err=0;
49: register Arg *ap;
50: while(argc>1 && argv[1][0]=='-' && argv[1][1]){
51: --argc;
52: argv++;
53: argv[0]++;
54: if(argv[0][0]=='r'){
55: repeats=1;
56: if(argv[0][1])
57: goto Usage;
58: continue;
59: }
60: if(argv[0][0]=='s'){
61: swizzle=1;
62: if(argv[0][1])
63: goto Usage;
64: continue;
65: }
66: if(argv[0][0]=='a'){
67: argv[0]++;
68: switch(argv[0][0]){
69: case 'o':
70: abase=0;
71: break;
72: case 'd':
73: abase=1;
74: break;
75: case 'x':
76: abase=2;
77: break;
78: default:
79: goto Usage;
80: }
81: if(argv[0][1])
82: goto Usage;
83: continue;
84: }
85: ap=&arg[narg];
86: initarg();
87: while(argv[0][0]){
88: switch(argv[0][0]){
89: case 'c':
90: ap->ascii=1;
91: ap->loglen=0;
92: if(argv[0][1] || argv[0][-1]!='-')
93: goto Usage;
94: break;
95: case 'o':
96: ap->base=0;
97: break;
98: case 'd':
99: ap->base=1;
100: break;
101: case 'x':
102: ap->base=2;
103: break;
104: case 'b':
105: case '1':
106: ap->loglen=0;
107: break;
108: case 'w':
109: case '2':
110: ap->loglen=1;
111: break;
112: case 'l':
113: case '4':
114: ap->loglen=2;
115: break;
116: default:
117: Usage:
118: fprint(2, "usage: xd [-r] [-s] [-a{odx}] [-c|{b1w2l4}{odx}] ... file ...\n");
119: return 1;
120: }
121: argv[0]++;
122: }
123: if(ap->ascii)
124: ap->fn=fmtc;
125: else
126: ap->fn=fmt[ap->loglen];
127: ap->fmt=dfmt[ap->loglen][ap->base];
128: ap->afmt=afmt[ap>arg][abase];
129: }
130: if(narg==0)
131: initarg();
132: if(argc==1)
133: err=xd((char *)0, 0);
134: else if(argc==2)
135: err=xd(argv[1], 0);
136: else while(argc-->1)
137: err|=xd(argv[1], 1);
138: return err;
139: }
140: initarg(){
141: register Arg *ap;
142: ap=&arg[narg++];
143: if(narg>=Narg){
144: fprint(2, "xd: too many formats (max %d)\n", Narg);
145: exit(1);
146: }
147: ap->ascii=0;
148: ap->loglen=2;
149: ap->base=2;
150: ap->fn=fmt2;
151: ap->fmt=dfmt[ap->loglen][ap->base];
152: ap->afmt=afmt[narg>1][abase];
153: }
154: xd(name, title)
155: char *name;
156: int title;
157: {
158: register fd=name? open(name, 0) : 0;
159: register i, star;
160: register Arg *ap;
161: if(fd<0){
162: fprint(2, "xd: can't open %s\n", name);
163: return 1;
164: }
165: if(title)
166: Fprint(1, "%s\n", name);
167: Finit(fd, &buf);
168: addr=0;
169: star=0;
170: while((ndata=Fread(fd, data, 16L))>=0){
171: if(ndata<16)
172: for(i=ndata; i<16; i++)
173: data[i]=0;
174: if(swizzle)
175: swizz();
176: if(ndata==16 && repeats){
177: if(addr>0 && data[0]==odata[0]){
178: for(i=1; i<16; i++)
179: if(data[i]!=odata[i])
180: break;
181: if(i==16){
182: addr+=16;
183: if(star==0){
184: star++;
185: Fprint(1, "*\n");
186: }
187: continue;
188: }
189: }
190: for(i=0; i<16; i++)
191: odata[i]=data[i];
192: star=0;
193: }
194: for(ap=arg; ap<&arg[narg]; ap++){
195: Fprint(1, ap->afmt, addr);
196: (*ap->fn)(ap->fmt);
197: Fprint(1, "\n");
198: }
199: addr+=ndata;
200: if(ndata<16){
201: Fprint(1, afmt[0][abase], addr);
202: Fprint(1, "\n");
203: break;
204: }
205: }
206: return 0;
207: }
208: swizz(){
209: unsigned char *p, *q;
210: int i;
211: unsigned char swdata[16];
212: p=data;
213: q=swdata;
214: for(i=0; i<16; i++)
215: *q++=*p++;
216: p=data;
217: q=swdata;
218: for(i=0; i<4; i++, q+=4){
219: *p++=q[3];
220: *p++=q[2];
221: *p++=q[1];
222: *p++=q[0];
223: }
224: }
225: fmt0(f)
226: char *f;
227: {
228: register i;
229: for(i=0; i<ndata; i++)
230: Fprint(1, f, data[i]);
231: }
232: fmt1(f)
233: char *f;
234: {
235: register i;
236: for(i=0; i<ndata; i+=sizeof(unsigned short))
237: Fprint(1, f, *(unsigned short *)&data[i]);
238: }
239: fmt2(f)
240: char *f;
241: {
242: register i;
243: for(i=0; i<ndata; i+=sizeof(unsigned long))
244: Fprint(1, f, *(unsigned long *)&data[i]);
245: }
246: fmtc()
247: {
248: register i;
249: for(i=0; i<ndata; i++)
250: switch(data[i]){
251: case '\t':
252: Fprint(1, cfmt[1][2], "\\t");
253: break;
254: case '\r':
255: Fprint(1, cfmt[1][2], "\\r");
256: break;
257: case '\n':
258: Fprint(1, cfmt[1][2], "\\n");
259: break;
260: case '\b':
261: Fprint(1, cfmt[1][2], "\\b");
262: break;
263: default:
264: if(data[i]>=0x7F || ' '>data[i])
265: Fprint(1, cfmt[2][2], data[i]);
266: else
267: Fprint(1, cfmt[0][2], data[i]);
268: break;
269: }
270: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.