Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <bio.h>
4
 
5
#define	MAXBASE	36
6
 
7
void	usage(void);
8
void	put(int);
9
void	putn(int, int);
10
void	puttext(char *);
11
void	putnum(char *);
12
int	btoi(char *);
13
int	value(int, int);
14
int	isnum(char *);
15
 
16
char *str[256]={
17
	"nul",	"soh",	"stx",	"etx",	"eot",	"enq",	"ack",	"bel",
18
	"bs ",	"ht ",	"nl ",	"vt ",	"np ",	"cr ",	"so ",	"si ",
19
	"dle",	"dc1",	"dc2",	"dc3",	"dc4",	"nak",	"syn",	"etb",
20
	"can",	"em ",	"sub",	"esc",	"fs ",	"gs ",	"rs ",	"us ",
21
	"sp ",	" ! ",	" \" ",	" # ",	" $ ",	" % ",	" & ",	" ' ",
22
	" ( ",	" ) ",	" * ",	" + ",	" , ",	" - ",	" . ",	" / ",
23
	" 0 ",	" 1 ",	" 2 ",	" 3 ",	" 4 ",	" 5 ",	" 6 ",	" 7 ",
24
	" 8 ",	" 9 ",	" : ",	" ; ",	" < ",	" = ",	" > ",	" ? ",
25
	" @ ",	" A ",	" B ",	" C ",	" D ",	" E ",	" F ",	" G ",
26
	" H ",	" I ",	" J ",	" K ",	" L ",	" M ",	" N ",	" O ",
27
	" P ",	" Q ",	" R ",	" S ",	" T ",	" U ",	" V ",	" W ",
28
	" X ",	" Y ",	" Z ",	" [ ",	" \\ ",	" ] ",	" ^ ",	" _ ",
29
	" ` ",	" a ",	" b ",	" c ",	" d ",	" e ",	" f ",	" g ",
30
	" h ",	" i ",	" j ",	" k ",	" l ",	" m ",	" n ",	" o ",
31
	" p ",	" q ",	" r ",	" s ",	" t ",	" u ",	" v ",	" w ",
32
	" x ",	" y ",	" z ",	" { ",	" | ",	" } ",	" ~ ",	"del",
33
	"x80",	"x81",	"x82",	"x83",	"x84",	"x85",	"x86",	"x87",
34
	"x88",	"x89",	"x8a",	"x8b",	"x8c",	"x8d",	"x8e",	"x8f",
35
	"x90",	"x91",	"x92",	"x93",	"x94",	"x95",	"x96",	"x97",
36
	"x98",	"x99",	"x9a",	"x9b",	"x9c",	"x9d",	"x9e",	"x9f",
37
	"xa0",	" ¡ ",	" ¢ ",	" £ ",	" ¤ ",	" ¥ ",	" ¦ ",	" § ",
38
	" ¨ ",	" © ",	" ª ",	" « ",	" ¬ ",	" ­ ",	" ® ",	" ¯ ",
39
	" ° ",	" ± ",	" ² ",	" ³ ",	" ´ ",	" µ ",	" ¶ ",	" · ",
40
	" ¸ ",	" ¹ ",	" º ",	" » ",	" ¼ ",	" ½ ",	" ¾ ",	" ¿ ",
41
	" À ",	" Á ",	" Â ",	" Ã ",	" Ä ",	" Å ",	" Æ ",	" Ç ",
42
	" È ",	" É ",	" Ê ",	" Ë ",	" Ì ",	" Í ",	" Î ",	" Ï ",
43
	" Ð ",	" Ñ ",	" Ò ",	" Ó ",	" Ô ",	" Õ ",	" Ö ",	" × ",
44
	" Ø ",	" Ù ",	" Ú ",	" Û ",	" Ü ",	" Ý ",	" Þ ",	" ß ",
45
	" à ",	" á ",	" â ",	" ã ",	" ä ",	" å ",	" æ ",	" ç ",
46
	" è ",	" é ",	" ê ",	" ë ",	" ì ",	" í ",	" î ",	" ï ",
47
	" ð ",	" ñ ",	" ò ",	" ó ",	" ô ",	" õ ",	" ö ",	" ÷ ",
48
	" ø ",	" ù ",	" ú ",	" û ",	" ü ",	" ý ",	" þ ",	" ÿ "
49
};
50
 
51
char Ncol[]={
52
    0,0,7,5,4,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
53
};
54
 
55
int 	nchars=128;
56
int 	base=16;
57
int 	ncol;
58
int 	text=1;
59
int	strip=0;
60
Biobuf	bin;
61
 
62
void
63
main(int argc, char **argv)
64
{
65
	int i;
66
 
67
	Binit(&bin, 1, OWRITE);
68
	ARGBEGIN{
69
	case '8':
70
		nchars=256; break;
71
	case 'x':
72
		base=16; break;
73
	case 'o':
74
		base=8; break;
75
	case 'd':
76
		base=10; break;
77
	case 'b':
78
		base=strtoul(EARGF(usage()), 0, 0);
79
		if(base<2||base>MAXBASE)
80
			usage();
81
		break;
82
	case 'n':
83
		text=0; break;
84
	case 't':
85
		strip=1;
86
		/* fall through */
87
	case 'c':
88
		text=2; break;
89
	default:
90
		usage();
91
	}ARGEND
92
 
93
	ncol=Ncol[base];
94
	if(argc==0){
95
		for(i=0;i<nchars;i++){
96
			put(i);
97
			if((i&7)==7)
98
				Bprint(&bin, "|\n");
99
		}
100
	}else{
101
		if(text==1)
102
			text=isnum(argv[0]);
103
		while(argc--)
104
			if(text)
105
				puttext(*argv++);
106
			else
107
				putnum(*argv++);
108
	}
109
	Bputc(&bin, '\n');
110
	exits(0);
111
}
112
void
113
usage(void)
114
{
115
	fprint(2, "usage: %s [-8cnt] [-dox | -b n] [text]\n", argv0);
116
	exits("usage");
117
}
118
void
119
put(int i)
120
{
121
	Bputc(&bin, '|');
122
	putn(i, ncol);
123
	Bprint(&bin, " %s", str[i]);
124
}
125
char dig[]="0123456789abcdefghijklmnopqrstuvwxyz";
126
void
127
putn(int n, int ndig)
128
{
129
	if(ndig==0)
130
		return;
131
	putn(n/base, ndig-1);
132
	Bputc(&bin, dig[n%base]);
133
}
134
void
135
puttext(char *s)
136
{
137
	int n;
138
	n=btoi(s)&0377;
139
	if(strip)
140
		Bputc(&bin, n);
141
	else
142
		Bprint(&bin, "%s\n", str[n]);
143
}
144
void
145
putnum(char *s)
146
{
147
	while(*s){
148
		putn(*s++&0377, ncol);
149
		Bputc(&bin, '\n');
150
	}
151
}
152
int
153
btoi(char *s)
154
{
155
	int n;
156
	n=0;
157
	while(*s)
158
		n=n*base+value(*s++, 0);
159
	return(n);
160
}
161
int
162
value(int c, int f)
163
{
164
	char *s;
165
	for(s=dig; s<dig+base; s++)
166
		if(*s==c)
167
			return(s-dig);
168
	if(f)
169
		return(-1);
170
	fprint(2, "%s: bad input char %c\n", argv0, c);
171
	exits("bad");
172
	return 0;	/* to keep ken happy */
173
}
174
int
175
isnum(char *s)
176
{
177
	while(*s)
178
		if(value(*s++, 1)==-1)
179
			return(0);
180
	return(1);
181
}