|
|
1.1 root 1: static char *sccsid = "@(#)od.c 4.2 (Berkeley) 2/7/81";
2: /*
3: * od -- octal (also hex, decimal, and character) dump
4: */
5:
6: #include <stdio.h>
7:
8: typedef unsigned long ulong;
9:
10: unsigned short word[16];
11: unsigned short lastword[16];
12: short nword = 8;
13: int conv;
14: int base = 010;
15: int max;
16: ulong addr;
17: #define DWORD 0700 /* bitmask for double word output formats */
18:
19: main(argc, argv)
20: char **argv;
21: {
22: register char *p;
23: register n, f, same;
24: char outbuf[BUFSIZ];
25:
26: #ifdef STANDALONE
27: if (argv[0][0] == '\0')
28: argc = getargv("od", &argv, 0);
29: #else
30: setbuf(stdout, outbuf);
31: #endif
32:
33: argv++;
34: f = 0;
35: if(argc > 1)
36: {
37: p = *argv;
38: if(*p == '-')
39: {
40: while(*p != '\0')
41: {
42: switch(*p++)
43: {
44: case 'o':
45: conv |= 001;
46: f = 6;
47: break;
48: case 'd':
49: conv |= 002;
50: f = 5;
51: break;
52: case 'x':
53: case 'h':
54: conv |= 010;
55: f = 4;
56: break;
57: case 'c':
58: conv |= 020;
59: f = 7;
60: break;
61: case 'b':
62: conv |= 040;
63: f = 7;
64: break;
65: case 'O':
66: conv |= 0100;
67: f = 6;
68: break;
69: case 'D':
70: conv |= 0200;
71: f = 5;
72: break;
73: case 'H':
74: case 'X':
75: conv |= 0400;
76: f = 4;
77: break;
78: case 'w':
79: nword = 16;
80: break;
81: }
82: if(f > max)
83: max = f;
84: }
85: argc--;
86: argv++;
87: }
88: }
89: if(!conv)
90: {
91: max = 6;
92: conv = 1;
93: }
94: if(argc > 1)
95: if(**argv != '+')
96: {
97: if (freopen(*argv, "r", stdin) == NULL)
98: {
99: fprintf(stderr, "od: cannot open %s\n", *argv);
100: exit(2);
101: }
102: argv++;
103: argc--;
104: }
105: if(argc > 1)
106: offset(*argv);
107:
108: same = -1;
109: for ( ; (n = fread((char *)word, 1, sizeof(word[0])*nword, stdin)) > 0; addr += n)
110: {
111: if (same>=0)
112: {
113: for (f=0; f<nword; f++)
114: if (lastword[f] != word[f])
115: goto notsame;
116: if (same==0)
117: {
118: printf("*\n");
119: same = 1;
120: }
121: continue;
122: }
123: notsame:
124: line(addr, word, (n+sizeof(word[0])-1)/sizeof(word[0]));
125: same = 0;
126: for (f=0; f<nword; f++)
127: lastword[f] = word[f];
128: for (f=0; f<nword; f++)
129: word[f] = 0;
130: }
131: putn(addr, base, 7);
132: putchar('\n');
133: exit(0);
134: }
135:
136: line(a, w, n)
137: ulong a;
138: unsigned short *w;
139: {
140: register i, f, c;
141:
142: f = 1;
143: for(c=1; c; c<<=1)
144: {
145: if((c&conv) == 0)
146: continue;
147: if(f)
148: {
149: putn(a, base, 7);
150: putchar(' ');
151: f = 0;
152: }
153: else
154: putchar('\t');
155: if ( c&DWORD && conv&~DWORD )
156: putchar(' ');
157: for (i=0; i<n; i++)
158: {
159: if(c&DWORD)
160: {
161: if ((i&01) == 0)
162: putlx((ulong *)(w+i), c);
163: }
164: else
165: putx(w[i], c);
166: putchar(i==n-1? '\n': ' ');
167: }
168: }
169: }
170:
171: putx(n, c)
172: unsigned n;
173: {
174:
175: switch(c)
176: {
177: case 001:
178: pre(6);
179: putn((ulong)n, 8, 6);
180: break;
181: case 002:
182: pre(5);
183: putn((ulong)n, 10, 5);
184: break;
185: case 010:
186: pre(4);
187: putn((ulong)n, 16, 4);
188: break;
189: case 020:
190: pre(7);
191: {
192: unsigned short sn = n;
193: cput(*(char *)&sn);
194: putchar(' ');
195: cput(*((char *)&sn + 1));
196: break;
197: }
198: case 040:
199: pre(7);
200: {
201: unsigned short sn = n;
202: putn((ulong)(*(char *)&sn)&0377, 8, 3);
203: putchar(' ');
204: putn((ulong)(*((char *)&sn + 1))&0377, 8, 3);
205: break;
206: }
207: }
208: }
209:
210: putlx(n, c)
211: ulong *n;
212: {
213: switch(c)
214: {
215: case 0100:
216: pre(6); pre(6);
217: putn(*n, 8, 12);
218: break;
219: case 0200:
220: pre(5); pre(5);
221: putn(*n, 10, 10);
222: break;
223: case 0400:
224: pre(4); pre(4);
225: putn(*n, 16, 8);
226: break;
227: }
228: }
229:
230: cput(c)
231: {
232: c &= 0377;
233: if(c>037 && c<0177)
234: {
235: printf(" ");
236: putchar(c);
237: return;
238: }
239: switch(c)
240: {
241: case '\0':
242: printf(" \\0");
243: break;
244: case '\b':
245: printf(" \\b");
246: break;
247: case '\f':
248: printf(" \\f");
249: break;
250: case '\n':
251: printf(" \\n");
252: break;
253: case '\r':
254: printf(" \\r");
255: break;
256: case '\t':
257: printf(" \\t");
258: break;
259: default:
260: putn((ulong)c, 8, 3);
261: }
262: }
263:
264: putn(n, b, c)
265: ulong n;
266: unsigned b;
267: {
268: unsigned d;
269:
270: if(!c)
271: return;
272: putn(n/b, b, c-1);
273: d = n%b;
274: if (d > 9)
275: putchar(d-10+'a');
276: else
277: putchar(d+'0');
278: }
279:
280: pre(n)
281: {
282: int i;
283:
284: for(i=n; i<max; i++)
285: putchar(' ');
286: }
287:
288: offset(s)
289: register char *s;
290: {
291: register char *p;
292: ulong a;
293: register int d;
294:
295: if (*s=='+')
296: s++;
297: if (*s=='x')
298: {
299: s++;
300: base = 16;
301: }
302: else if (*s=='0' && s[1]=='x')
303: {
304: s += 2;
305: base = 16;
306: }
307: else if (*s == '0')
308: base = 8;
309: p = s;
310: while(*p)
311: {
312: if (*p++=='.')
313: base = 10;
314: }
315: for (a=0; *s; s++)
316: {
317: d = *s;
318: if(d>='0' && d<='9')
319: a = a*base + d - '0';
320: else if (d>='a' && d<='f' && base==16)
321: a = a*base + d + 10 - 'a';
322: else
323: break;
324: }
325: if (*s == '.')
326: s++;
327: if(*s=='b' || *s=='B')
328: a *= 512;
329: fseek(stdin, a, 0);
330: addr = a;
331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.