1implement Arg; 2 3# 4# Copyright © 1997 Roger Peppe 5# 6 7include "sys.m"; 8include "arg.m"; 9 10name:= ""; 11args: list of string; 12usagemsg:=""; 13printusage := 1; 14 15curropt: string; 16 17init(argv: list of string) 18{ 19 (curropt, args, name) = (nil, nil, nil); 20 if (argv == nil) 21 return; 22 name = hd argv; 23 args = tl argv; 24} 25 26setusage(u: string) 27{ 28 usagemsg = u; 29 printusage = u != nil; 30} 31 32progname(): string 33{ 34 return name; 35} 36 37# don't allow any more options after this function is invoked 38argv(): list of string 39{ 40 ret := args; 41 args = nil; 42 return ret; 43} 44 45earg(): string 46{ 47 if (curropt != nil) { 48 ret := curropt; 49 curropt = nil; 50 return ret; 51 } 52 53 if (args == nil) 54 usage(); 55 56 ret := hd args; 57 args = tl args; 58 return ret; 59} 60 61# get next option argument 62arg(): string 63{ 64 if (curropt != nil) { 65 ret := curropt; 66 curropt = nil; 67 return ret; 68 } 69 70 if (args == nil) 71 return nil; 72 73 ret := hd args; 74 args = tl args; 75 return ret; 76} 77 78# get next option letter 79# return 0 at end of options 80opt(): int 81{ 82 if (curropt != nil) { 83 opt := curropt[0]; 84 curropt = curropt[1:]; 85 return opt; 86 } 87 88 if (args == nil) 89 return 0; 90 91 nextarg := hd args; 92 if (len nextarg < 2 || nextarg[0] != '-') 93 return 0; 94 95 if (nextarg == "--") { 96 args = tl args; 97 return 0; 98 } 99 100 opt := nextarg[1]; 101 if (len nextarg > 2) 102 curropt = nextarg[2:]; 103 args = tl args; 104 return opt; 105} 106 107usage() 108{ 109 if(printusage){ 110 if(usagemsg != nil) 111 u := "usage: "+usagemsg; 112 else 113 u = name + ": argument expected"; 114 sys := load Sys Sys->PATH; 115 sys->fprint(sys->fildes(2), "%s\n", u); 116 } 117 raise "fail:usage"; 118} 119