Mercurial > hg > toybox
annotate toys/od.c @ 613:4601e408223b
Longer usage line and combine ascii[] into a single string.
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 26 Jun 2012 20:45:56 -0500 |
parents | 1121e0f42132 |
children | 488032f4394a |
rev | line source |
---|---|
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* vi: set sw=4 ts=4: |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * od.c - Provide octal/hex dumps of data |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * Copyright 2012 Andre Renaud <andre@bluewatersys.com> |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/od.html |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 USE_OD(NEWTOY(od, "j#vN#xsodbA:t*", TOYFLAG_USR|TOYFLAG_BIN)) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 config OD |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 bool "od" |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 default y |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 help |
613
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
15 usage: od [-bdosxv] [-j #] [-N #] [-A arg] [-t arg] |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 */ |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 #include "toys.h" |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #define OD_BLOCK_SIZE 16 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 #define FLAG_t (1 << 0) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 #define FLAG_A (1 << 1) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 #define FLAG_b (1 << 2) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 #define FLAG_d (1 << 3) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 #define FLAG_o (1 << 4) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 #define FLAG_s (1 << 5) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 #define FLAG_x (1 << 6) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 #define FLAG_N (1 << 7) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 #define FLAG_v (1 << 8) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 DEFINE_GLOBALS( |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 struct arg_list *output_base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 char *address_base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 long max_count; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 long jump_bytes; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 ) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 #define TT this.od |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 |
613
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
42 static const char *ascii = "nulsohstxetceotenqackbel bs ht nl vt ff cr so si" |
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
43 "deldc1dc2dc3dc4naksynetbcan emsubesc fs gs rs us sp"; |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 static void display_line_1(char base, off_t offset, uint8_t *line, int len) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 while (len--) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 switch (base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 case 'a': { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 int ch = *line & 0x7f; |
613
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
51 if (ch <= 32) printf(" %.3s", ascii+(3*ch)); |
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
52 else if (ch == 127) printf(" del"); |
4601e408223b
Longer usage line and combine ascii[] into a single string.
Rob Landley <rob@landley.net>
parents:
612
diff
changeset
|
53 else printf("%4c", ch); |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 case 'o': printf(" %3.3o", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 case 'x': printf(" %2.2x", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 case 'd': printf(" %4d", *(int8_t *)line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 case 'u': printf(" %3u", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 line++; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 static void display_line_2(char base, off_t offset, uint16_t *line, int len) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 while (len--) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 switch (base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 case 'o': printf(" %6.6o", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 case 'x': printf(" %4.4x", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 case 'd': printf(" %6d", *(int16_t*)line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 case 'u': printf(" %5u", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 line++; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 static void display_line_4(char base, off_t offset, uint32_t *line, int len) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 while (len--) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 switch (base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 case 'o': printf(" %11.11o", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 case 'x': printf(" %8.8x", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 case 'd': printf(" %11d", *(int32_t *)line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 case 'u': printf(" %10u", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 case 'f': printf(" %15g", *(float *)line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 line++; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 static void display_line_8(char base, off_t offset, uint64_t *line, int len) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 while (len--) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 switch (base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 //case 'o': printf(" %22.22o", *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 case 'x': printf(" %16.16" PRIx64, *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 case 'd': printf(" %21" PRId64, *(int64_t *)line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 case 'u': printf(" %20" PRIu64, *line); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 case 'f': printf(" %23g", *(double *)line); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 line++; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 static void display_line(off_t offset, uint8_t *line, int len) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 struct arg_list *output = TT.output_base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 switch (*TT.address_base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 case 'o': printf("%8.8zo", offset); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 case 'd': printf("%7.7zd", offset); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 case 'x': printf("%6.6zx", offset); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 case 'n': |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 default: |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 while (output) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 char base = *output->arg; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 int width = atoi(&output->arg[1]); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 switch (width) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 case 1: display_line_1(base, offset, line, len); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 case 2: display_line_2(base, offset, (uint16_t *)line, |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 (len + 1) / 2); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 case 4: display_line_4(base, offset, (uint32_t *)line, |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 (len + 3) / 4); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 case 8: display_line_8(base, offset, (uint64_t *)line, |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 (len + 7) / 8); break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 output = output->next; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 printf("\n"); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 static void do_od(int fd, char *name) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 uint8_t *block[2]; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 int index = 0; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 off_t offset = 0; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 int last_match = 0; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 block[0] = (uint8_t *)toybuf; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 block[1] = (uint8_t *)&toybuf[OD_BLOCK_SIZE]; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 if (TT.jump_bytes) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 xlseek(fd, TT.jump_bytes, SEEK_SET); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 offset = TT.jump_bytes; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
151 for (;;) { |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 int len; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 int max_len = OD_BLOCK_SIZE; |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
154 if ((toys.optflags & FLAG_N) && offset + OD_BLOCK_SIZE > TT.max_count) |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 max_len = TT.max_count - offset; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 len = xread(fd, block[index], max_len); |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
157 if (!len) break; |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 memset(&block[index][len], 0, OD_BLOCK_SIZE - len); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
161 if (!(toys.optflags & FLAG_v) && offset > 0 && |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
162 memcmp(block[0], block[1], OD_BLOCK_SIZE) == 0) |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
163 { |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
164 if (!last_match) puts("*"); |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 last_match = 1; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 } else { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 display_line(offset, block[index], len); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 last_match = 0; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 offset += len; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 index = !index; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
173 if (len != OD_BLOCK_SIZE) break; |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
174 } |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 if (!(toys.optflags & FLAG_N) && offset != TT.max_count) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 display_line(offset, NULL, 0); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 static void append_base(char *base) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 struct arg_list *arg, *prev; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 arg = xmalloc(sizeof(struct arg_list)); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 prev = TT.output_base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 TT.output_base = arg; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 arg->arg = base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 arg->next = prev; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 static void valid_bases(void) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 struct arg_list *arg = TT.output_base; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 while (arg) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 char base = arg->arg[0]; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 int width = 1; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 if (arg->arg[1]) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 width = atoi(&arg->arg[1]); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 switch (base) { |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 case 'a': |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 if (width != 1) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 error_exit("invalid width for ascii base"); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 case 'd': case 'x': case 'o': case'u': |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
204 if (width != 1 && width != 2 && width != 4 && width != 8) |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
205 error_exit("this system doesn't provide a %d-byte type", width); |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 case 'f': |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 if (width != 4 && width != 8) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 error_exit("this system doesn't provide a %d-byte floating point type", |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 width); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 break; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 default: |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 error_exit("invalid base '%c'", base); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 arg = arg->next; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 }; |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 } |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 void od_main(void) |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 { |
612
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
222 if (!TT.address_base) TT.address_base = "o"; |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
223 if (toys.optflags & FLAG_b) append_base("o1"); |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
224 if (toys.optflags & FLAG_d) append_base("u2"); |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
225 if (toys.optflags & FLAG_o) append_base("o2"); |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
226 if (toys.optflags & FLAG_s) append_base("d2"); |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
227 if (toys.optflags & FLAG_x) append_base("x2"); |
1121e0f42132
Some refactoring, shouldn't affect the generated code.
Rob Landley <rob@landley.net>
parents:
611
diff
changeset
|
228 if (!TT.output_base) append_base("o2"); |
611
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 valid_bases(); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 loopfiles(toys.optargs, do_od); |
c9865aadb9fc
First drop of od, from Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 } |