# test type conversion and error handling in entab/detab procedure main () s := "rutabaga" if entab('1987') ~== "1789" then write ("oops 1") if detab('1492') ~== "1249" then write ("oops 2") if entab(" ","3") ~== "\t\t" then write ("oops 3") if detab("\t\t","3") ~== " " then write ("oops 4") ferr (103, entab, []) ferr (103, detab, []) ferr (103, entab, [[]]) ferr (103, detab, [[]]) ferr (101, entab, [s,2,3,&lcase]) ferr (101, detab, [s,4,5,&ucase]) ferr (216, entab, [s,7,4]) ferr (216, entab, [s,6,6]) ferr (216, detab, [s,8,5]) ferr (216, detab, [s,3,3]) end # ferr(err,func,arglst) -- call func(args), verify that error "err" is produced procedure ferr (err, func, args) msg := "oops -- " || image(func) || "(" || image (val) || ") " &error := 1 if invoke (func, args) then write (msg, "succeeded") else if &error ~= 0 then write (msg, "failed but no error") else if &errornumber ~= err then write (msg, "got error ",&errornumber," instead of ",err) &error := 0 return end procedure invoke (func, a) # invoke a function with a list of up to 10 args return case *a of { 0: func () 1: func (a[1]) 2: func (a[1], a[2]) 3: func (a[1], a[2], a[3]) 4: func (a[1], a[2], a[3], a[4]) 5: func (a[1], a[2], a[3], a[4], a[5]) 6: func (a[1], a[2], a[3], a[4], a[5], a[6]) 7: func (a[1], a[2], a[3], a[4], a[5], a[6], a[7]) 8: func (a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) 9: func (a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]) 10: func (a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]) default: stop ("too many args for invoke") } end