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