1*37da2899SCharles.Forsythimplement Zeros; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsyth sys: Sys; 5*37da2899SCharles.Forsythinclude "arg.m"; 6*37da2899SCharles.Forsyth arg: Arg; 7*37da2899SCharles.Forsythinclude "string.m"; 8*37da2899SCharles.Forsyth str: String; 9*37da2899SCharles.Forsythinclude "keyring.m"; 10*37da2899SCharles.Forsythinclude "security.m"; 11*37da2899SCharles.Forsyth random: Random; 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsythinclude "draw.m"; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.ForsythZeros: module 16*37da2899SCharles.Forsyth{ 17*37da2899SCharles.Forsyth init: fn(nil: ref Draw->Context, argv: list of string); 18*37da2899SCharles.Forsyth}; 19*37da2899SCharles.Forsyth 20*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string) 21*37da2899SCharles.Forsyth{ 22*37da2899SCharles.Forsyth z: array of byte; 23*37da2899SCharles.Forsyth i: int; 24*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 25*37da2899SCharles.Forsyth arg = load Arg Arg->PATH; 26*37da2899SCharles.Forsyth str = load String String->PATH; 27*37da2899SCharles.Forsyth 28*37da2899SCharles.Forsyth if(sys == nil || arg == nil) 29*37da2899SCharles.Forsyth return; 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth bs := 0; 32*37da2899SCharles.Forsyth n := 0; 33*37da2899SCharles.Forsyth val := 0; 34*37da2899SCharles.Forsyth rflag := 0; 35*37da2899SCharles.Forsyth arg->init(argv); 36*37da2899SCharles.Forsyth while ((c := arg->opt()) != 0) 37*37da2899SCharles.Forsyth case c { 38*37da2899SCharles.Forsyth 'r' => rflag = 1; 39*37da2899SCharles.Forsyth 'v' => (val, nil) = str->toint(arg->arg(), 16); 40*37da2899SCharles.Forsyth * => raise sys->sprint("fail:unknown option (%c)\n", c); 41*37da2899SCharles.Forsyth } 42*37da2899SCharles.Forsyth argv = arg->argv(); 43*37da2899SCharles.Forsyth if(len argv >= 1) 44*37da2899SCharles.Forsyth bs = int hd argv; 45*37da2899SCharles.Forsyth else 46*37da2899SCharles.Forsyth bs = 1; 47*37da2899SCharles.Forsyth if (len argv >= 2) 48*37da2899SCharles.Forsyth n = int hd tl argv; 49*37da2899SCharles.Forsyth else 50*37da2899SCharles.Forsyth n = 1; 51*37da2899SCharles.Forsyth if(bs == 0 || n == 0) { 52*37da2899SCharles.Forsyth sys->fprint(sys->fildes(2), "usage: zeros [-r] [-v value] blocksize [number]\n"); 53*37da2899SCharles.Forsyth raise "fail:usage"; 54*37da2899SCharles.Forsyth } 55*37da2899SCharles.Forsyth if (rflag) { 56*37da2899SCharles.Forsyth random = load Random Random->PATH; 57*37da2899SCharles.Forsyth if (random == nil) 58*37da2899SCharles.Forsyth raise "fail:no security module\n"; 59*37da2899SCharles.Forsyth z = random->randombuf(random->NotQuiteRandom, bs); 60*37da2899SCharles.Forsyth } 61*37da2899SCharles.Forsyth else { 62*37da2899SCharles.Forsyth z = array[bs] of byte; 63*37da2899SCharles.Forsyth for(i=0;i<bs;i++) 64*37da2899SCharles.Forsyth z[i] = byte val; 65*37da2899SCharles.Forsyth } 66*37da2899SCharles.Forsyth for(i=0;i<n;i++) 67*37da2899SCharles.Forsyth sys->write(sys->fildes(1), z, bs); 68*37da2899SCharles.Forsyth} 69