xref: /inferno-os/appl/cmd/unicode.b (revision 5139a0a1c6f3b5a03c2e3eeb56e20a81cda5619a)
137da2899SCharles.Forsythimplement Unicode;
237da2899SCharles.Forsyth
337da2899SCharles.Forsythinclude "sys.m";
437da2899SCharles.Forsythsys: Sys;
537da2899SCharles.Forsyth
637da2899SCharles.Forsythinclude "draw.m";
737da2899SCharles.Forsyth
837da2899SCharles.Forsythinclude "string.m";
937da2899SCharles.Forsyth	str: String;
1037da2899SCharles.Forsyth
1137da2899SCharles.Forsythinclude "bufio.m";
1237da2899SCharles.Forsyth	bufio: Bufio;
1337da2899SCharles.Forsyth	Iobuf: import bufio;
1437da2899SCharles.Forsyth
1537da2899SCharles.Forsyth
1637da2899SCharles.ForsythUnicode: module
1737da2899SCharles.Forsyth{
1837da2899SCharles.Forsyth	init: fn(c: ref Draw->Context, v: list of string);
1937da2899SCharles.Forsyth};
2037da2899SCharles.Forsyth
2137da2899SCharles.Forsythusage: con "unicode { [-t] hex hex ... | hexmin-hexmax ... | [-n] char ... }";
2237da2899SCharles.Forsythhex: con "0123456789abcdefABCDEF";
2337da2899SCharles.Forsythnumout:= 0;
2437da2899SCharles.Forsythtext:= 0;
2537da2899SCharles.Forsythout: ref Bufio->Iobuf;
2637da2899SCharles.Forsythstderr: ref sys->FD;
2737da2899SCharles.Forsyth
2837da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
2937da2899SCharles.Forsyth{
3037da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
3137da2899SCharles.Forsyth	str = load String String->PATH;
3237da2899SCharles.Forsyth	bufio = load Bufio Bufio->PATH;
3337da2899SCharles.Forsyth
3437da2899SCharles.Forsyth	stderr = sys->fildes(2);
3537da2899SCharles.Forsyth
3637da2899SCharles.Forsyth	if(str==nil || bufio==nil){
3737da2899SCharles.Forsyth		sys->fprint(stderr, "unicode: can't load String or Bufio module: %r\n");
3837da2899SCharles.Forsyth		return;
3937da2899SCharles.Forsyth	}
4037da2899SCharles.Forsyth
4137da2899SCharles.Forsyth	if(argv == nil){
4237da2899SCharles.Forsyth		sys->fprint(stderr, "usage: %s\n", usage);
4337da2899SCharles.Forsyth		return;
4437da2899SCharles.Forsyth	}
4537da2899SCharles.Forsyth	argv = tl argv;
4637da2899SCharles.Forsyth	while(argv != nil) {
4737da2899SCharles.Forsyth		s := hd argv;
4837da2899SCharles.Forsyth		if(s != nil && s[0] != '-')
4937da2899SCharles.Forsyth			break;
5037da2899SCharles.Forsyth		case s{
5137da2899SCharles.Forsyth		"-n" =>
5237da2899SCharles.Forsyth			numout = 1;
5337da2899SCharles.Forsyth		"-t" =>
5437da2899SCharles.Forsyth			text = 1;
5537da2899SCharles.Forsyth		}
5637da2899SCharles.Forsyth		argv = tl argv;
5737da2899SCharles.Forsyth	}
5837da2899SCharles.Forsyth	if(argv == nil){
5937da2899SCharles.Forsyth		sys->fprint(stderr, "usage: %s\n", usage);
6037da2899SCharles.Forsyth		return;
6137da2899SCharles.Forsyth	}
6237da2899SCharles.Forsyth
6337da2899SCharles.Forsyth	out = bufio->fopen(sys->fildes(1), Bufio->OWRITE);
6437da2899SCharles.Forsyth
6537da2899SCharles.Forsyth	if(!numout && oneof(hd argv, '-'))
6637da2899SCharles.Forsyth		range(argv);
6737da2899SCharles.Forsyth	else if(numout || oneof(hex, (hd argv)[0]) == 0)
6837da2899SCharles.Forsyth		nums(argv);
6937da2899SCharles.Forsyth	else
7037da2899SCharles.Forsyth		chars(argv);
7137da2899SCharles.Forsyth	out.flush();
7237da2899SCharles.Forsyth}
7337da2899SCharles.Forsyth
7437da2899SCharles.Forsythoneof(s: string, c: int): int
7537da2899SCharles.Forsyth{
7637da2899SCharles.Forsyth	for(i:=0; i<len s; i++)
7737da2899SCharles.Forsyth		if(s[i] == c)
7837da2899SCharles.Forsyth			return 1;
7937da2899SCharles.Forsyth	return 0;
8037da2899SCharles.Forsyth}
8137da2899SCharles.Forsyth
8237da2899SCharles.Forsythbadrange(q: string)
8337da2899SCharles.Forsyth{
8437da2899SCharles.Forsyth	sys->fprint(stderr, "unicode: bad range %s\n", q);
8537da2899SCharles.Forsyth}
8637da2899SCharles.Forsyth
8737da2899SCharles.Forsythrange(argv: list of string)
8837da2899SCharles.Forsyth{
8937da2899SCharles.Forsyth	min, max: int;
9037da2899SCharles.Forsyth
9137da2899SCharles.Forsyth	while(argv != nil){
9237da2899SCharles.Forsyth		q := hd argv;
9337da2899SCharles.Forsyth		if(oneof(hex, q[0]) == 0){
9437da2899SCharles.Forsyth			badrange(q);
9537da2899SCharles.Forsyth			return;
9637da2899SCharles.Forsyth		}
9737da2899SCharles.Forsyth		(min, q) = str->toint(q,16);
98*5139a0a1SCharles Forsyth		if(min<0 || min>Sys->Runemax || len q==0 || q[0]!='-'){
9937da2899SCharles.Forsyth			badrange(hd argv);
10037da2899SCharles.Forsyth			return;
10137da2899SCharles.Forsyth		}
10237da2899SCharles.Forsyth		q = q[1:];
10337da2899SCharles.Forsyth		if(oneof(hex, q[0]) == 0){
10437da2899SCharles.Forsyth			badrange(hd argv);
10537da2899SCharles.Forsyth			return;
10637da2899SCharles.Forsyth		}
10737da2899SCharles.Forsyth		(max, q) = str->toint(q,16);
108*5139a0a1SCharles Forsyth		if(max<0 || max>Sys->Runemax || max<min || len q>0){
10937da2899SCharles.Forsyth			badrange(hd argv);
11037da2899SCharles.Forsyth			return;
11137da2899SCharles.Forsyth		}
11237da2899SCharles.Forsyth		i := 0;
11337da2899SCharles.Forsyth		do{
11437da2899SCharles.Forsyth			out.puts(sys->sprint("%.4x %c", min, min));
11537da2899SCharles.Forsyth			i++;
11637da2899SCharles.Forsyth			if(min==max || (i&7)==0)
11737da2899SCharles.Forsyth				out.puts("\n");
11837da2899SCharles.Forsyth			else
11937da2899SCharles.Forsyth				out.puts("\t");
12037da2899SCharles.Forsyth			min++;
12137da2899SCharles.Forsyth		}while(min<=max);
12237da2899SCharles.Forsyth		argv = tl argv;
12337da2899SCharles.Forsyth	}
12437da2899SCharles.Forsyth}
12537da2899SCharles.Forsyth
12637da2899SCharles.Forsyth
12737da2899SCharles.Forsythnums(argv: list of string)
12837da2899SCharles.Forsyth{
12937da2899SCharles.Forsyth	while(argv != nil){
13037da2899SCharles.Forsyth		q := hd argv;
13137da2899SCharles.Forsyth		for(i:=0; i<len q; i++)
13237da2899SCharles.Forsyth			out.puts(sys->sprint("%.4x\n", q[i]));
13337da2899SCharles.Forsyth		argv = tl argv;
13437da2899SCharles.Forsyth	}
13537da2899SCharles.Forsyth}
13637da2899SCharles.Forsyth
13737da2899SCharles.Forsythbadvalue(s: string)
13837da2899SCharles.Forsyth{
13937da2899SCharles.Forsyth	sys->fprint(stderr, "unicode: bad unicode value %s\n", s);
14037da2899SCharles.Forsyth}
14137da2899SCharles.Forsyth
14237da2899SCharles.Forsythchars(argv: list of string)
14337da2899SCharles.Forsyth{
14437da2899SCharles.Forsyth	m: int;
14537da2899SCharles.Forsyth
14637da2899SCharles.Forsyth	while(argv != nil){
14737da2899SCharles.Forsyth		q := hd argv;
14837da2899SCharles.Forsyth		if(oneof(hex, q[0]) == 0){
14937da2899SCharles.Forsyth			badvalue(hd argv);
15037da2899SCharles.Forsyth			return;
15137da2899SCharles.Forsyth		}
15237da2899SCharles.Forsyth		(m, q) = str->toint(q, 16);
153*5139a0a1SCharles Forsyth		if(m<0 || m>Sys->Runemax || len q>0){
15437da2899SCharles.Forsyth			badvalue(hd argv);
15537da2899SCharles.Forsyth			return;
15637da2899SCharles.Forsyth		}
15737da2899SCharles.Forsyth		out.puts(sys->sprint("%c", m));
15837da2899SCharles.Forsyth		if(!text)
15937da2899SCharles.Forsyth			out.puts("\n");
16037da2899SCharles.Forsyth		argv = tl argv;
16137da2899SCharles.Forsyth	}
16237da2899SCharles.Forsyth}
163