implement Tr; include "sys.m"; sys: Sys; print, sprint: import sys; include "draw.m"; Tr: module { init: fn(ctxt: ref Draw->Context, argv: list of string); }; MAXRUNE: con 16rFFFF; init(nil: ref Draw->Context, nil: list of string) { sys = load Sys Sys->PATH; print("%s\n", tr("qwertyuiop", "QWERTYUIOP", "typewriter")); print("%s\n", tr("a-z", "A-Z", "typewriter")); print("%s\n", tr("-a-z", "-A-X", "vw-xyz")); print("%s\n", tr("a-", "AZ", "plan-9")); print("%s\n", tr("a-e", "あ-お", "audio")); } tr(orig, subst, str: string): string { tab := array[MAXRUNE] of int; for(i := 0; i < len tab; i++) tab[i] = 0; orig = expand(orig); subst = expand(subst); compile(tab, orig, subst); for(i = 0; i < len str; i++) if(tab[str[i]] != 0) str[i]= tab[str[i]]; return str; } expand(s: string): string { lastc := 0; r := ""; for(i := 0; i < len s; i++){ if(s[i] == '-' && lastc != 0 && i < len s-1){ # a-z for(c := lastc+1; c <= s[i+1]; c++) r += sprint("%c", c); i++; }else r += sprint("%c", s[i]); lastc = s[i]; } return r; } compile(tab: array of int, orig, subst: string) { n := len orig; if(n > len subst) n = len subst; for(i := 0; i < n; i++) tab[orig[i]] = subst[i]; }