/*REXX*/
/* QT.rex
 This is the 'query time' example program from TRL-2 p172
 which tells the current time in English.

 usage:
  r4 qt [_ _ hh:mm:ss]
*/

        /* validate arguments */

parse arg parm . testtime .

select
  when parm='?' then
    call tell
  when parm='' then
    nop
  otherwise
    say 'only "?" is a valid argument to QT. The argument'
    say 'that you supplied ("'parm'") has been ignored.'
    call tell
  end

        /* establish time to display */

if testtime = '' then
  now = time()                  /* show current time */
else
  now = testtime                /* show specific time */

        /* prepare nearby time clauses */

near.0 = ''
near.1 = ' just gone'
near.2 = ' just after'
near.3 = ' nearly'
near.4 = ' almost'

        /* get hour, minute, and second */

parse var now hour':'min':'sec

        /* round minutes */

if sec > 29 then
  min=min+1

        /* determine REMAINDER of minutes divided by 5 */

mod = min // 5

out = "It's"near.mod    /* begin with nearby time clause */

        /* round hour */

if min > 32 then
  hour = hour + 1

        /* increment minutes by nearby interval */

min = min + 2

        /* show noon or midnight */

if hour // 12 = 0 & min // 60 <= 4 then do
  if hour=12 then
    say out 'Noon.'
  else
    say out 'Midnight.'
  exit
  end

        /* reduce minutes to 5 minute interval base */

min = min - ( min // 5 )

if hour > 12 then
  hour = hour - 12              /* reduce PM times by 12 hours */
else if hour = 0 then
  hour = 12                             /* midnight to one am */

        /* prepare 5 minute interval clauses */

select
  when min = 0  then nop
  when min = 60 then min = 0
  when min = 5  then out = out 'five past'
  when min = 10 then out = out 'ten past'
  when min = 15 then out = out 'a quarter past'
  when min = 20 then out = out 'twenty past'
  when min = 25 then out = out 'twenty-five past'
  when min = 30 then out = out 'half past'
  when min = 35 then out = out 'twenty-five to'
  when min = 40 then out = out 'twenty to'
  when min = 45 then out = out 'a quarter to'
  when min = 50 then out = out 'ten to'
  when min = 55 then out = out 'five to'
  end

        /* hour numbers */

numbers = 'one two three four five six',
 'seven eight nine ten eleven twelve'

out = out word( numbers, hour )

if min = 0 then
  out = out "o'clock"   /* add exact hour clause */

say out'.'                              /* show entire time clause */

exit

        /* TELL procedure
         * shows usage information
         */

tell:
  say 'Usage:'
  say '  r4 QT [_ _ hh:mm:ss]'
  say
  return