!*********************************************************************** !* !* The SLEEP command !* !* Copyright (C) R.D. Eager University of Kent MCMLXXXIV !* !*********************************************************************** ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! constantinteger quantum = 10; ! Seconds per doze ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! systemstringfunctionspec failuremessage(integer mess) systemintegerfunctionspec parmap externalroutinespec prompt(string (255) s) systemintegerfunctionspec pstoi(string (63) s) systemroutinespec setfname(string (63) s) systemroutinespec setpar(string (255) s) externalroutinespec set return code(integer i) systemstringfunctionspec spar(integer n) ! ! !*********************************************************************** !* !* Director references !* !*********************************************************************** ! externalintegerfunctionspec ddelay(integer secs) ! ! !*********************************************************************** !* !* Service routines !* !*********************************************************************** ! routine readline(stringname s) integer c ! s = "" cycle cycle readsymbol(c) exit if c = nl s <- s.tostring(c) repeat while length(s) > 0 and charno(s,length(s)) = ' ' cycle length(s) = length(s) - 1 repeat exit unless s = "" repeat end ; ! of readline ! ! !*********************************************************************** !* !* S L E E P !* !*********************************************************************** ! externalroutine sleep(string (255) parms) integer flag,seconds,interval string (255) secstring ! setpar(parms) if parmap > 1 then start flag = 263; ! Wrong number of parameters -> err finish ! if parmap = 1 and spar(1) = "?" then start printstring("There is one parameter: the number of seconds to sleep") newline set return code(0) return finish ! if parmap = 0 then start prompt("Seconds: ") readline(secstring) else secstring = spar(1) finish ! seconds = pstoi(secstring) unless 1 <= seconds <= 7200 then start setfname(secstring) flag = 202; ! Invalid parameter -> err finish ! ! Since the 'ddelay' call may not be interrupted, the sleep is broken ! into 'dozes' of maximum length 'quantum' seconds. The user will have ! to wait a maximum of 'quantum' seconds (until the end of the current ! doze) before an interrupt will take effect. ! while seconds > 0 cycle ; ! Once round for each doze if seconds < quantum then interval = seconds else interval = quantum flag = ddelay(interval) -> err if flag # 0 seconds = seconds - interval repeat ! set return code(0) return ! err: set return code(flag) newline printstring("SLEEP fails -".failuremessage(flag)) stop end ; ! of sleep endoffile