1implement Digest; 2 3# 4# read a classifier example file and write its digest 5# 6 7include "sys.m"; 8 sys: Sys; 9 10include "draw.m"; 11 12include "bufio.m"; 13 bufio: Bufio; 14 Iobuf: import bufio; 15 16include "strokes.m"; 17 strokes: Strokes; 18 Classifier, Penpoint, Stroke: import strokes; 19 readstrokes: Readstrokes; 20 writestrokes: Writestrokes; 21 22include "arg.m"; 23 24Digest: module 25{ 26 init: fn(nil: ref Draw->Context, nil: list of string); 27}; 28 29usage() 30{ 31 sys->fprint(sys->fildes(2), "Usage: digest [file.cl ...]\n"); 32 raise "fail:usage"; 33} 34 35init(nil: ref Draw->Context, args: list of string) 36{ 37 sys = load Sys Sys->PATH; 38 bufio = load Bufio Bufio->PATH; 39 strokes = load Strokes Strokes->PATH; 40 if(strokes == nil) 41 nomod(Strokes->PATH); 42 strokes->init(); 43 readstrokes = load Readstrokes Readstrokes->PATH; 44 if(readstrokes == nil) 45 nomod(Readstrokes->PATH); 46 readstrokes->init(strokes); 47 writestrokes = load Writestrokes Writestrokes->PATH; 48 if(writestrokes == nil) 49 nomod(Writestrokes->PATH); 50 writestrokes->init(strokes); 51 52 arg := load Arg Arg->PATH; 53 if(arg == nil) 54 nomod(Arg->PATH); 55 arg->init(args); 56 while((opt := arg->opt()) != 0) 57 case opt { 58 * => 59 usage(); 60 } 61 args = arg->argv(); 62 arg = nil; 63 64 for(; args != nil; args = tl args){ 65 ofile := file := hd args; 66 n := len file; 67 if(n >= 3 && ofile[n-3:] == ".cl") 68 ofile = ofile[0:n-3]; 69 ofile += ".clx"; 70 (err, rec) := readstrokes->read_classifier(hd args, 1, 0); 71 if(err != nil) 72 error(sys->sprint("error reading classifier from %s: %s", file, err)); 73 fd := sys->create(ofile, Sys->OWRITE, 8r666); 74 if(fd == nil) 75 error(sys->sprint("can't create %s: %r", file)); 76 err = writestrokes->write_digest(fd, rec.cnames, rec.dompts); 77 if(err != nil) 78 error(sys->sprint("error writing digest to %s: %s", file, err)); 79 } 80} 81 82nomod(s: string) 83{ 84 error(sys->sprint("can't load %s: %r", s)); 85} 86 87error(s: string) 88{ 89 sys->fprint(sys->fildes(2), "digest: %s\n", s); 90 raise "fail:error"; 91} 92