%externalstring(31)%fnspec ITOS     (%integer I,places)
%externalintegerfnspec     IN POS
%external %routine %spec   SEEKINPUT(%integer byte)
%external %routine %spec   TO UPPER (%string(*)%name s)
%external %predicate %spec EXISTS   (%string(31) filename)
%external %routine %spec   ALIAS    (%string(*)%name s)
%system   %routine %spec   LET      (%string(63) old, new)
%system %integer %spec     SKIPPING      {Set nonzero to turn off BCI}
%system %integer %spec     ECHO OBEY

%own %integer level = 0                  { $IF nesting level }
%own %integer active level               { level of last cond tested }

!Batch command processor procedures,  ADC

%integer %fn StoI (%string(31) s)
   %integer j, k = 0, d
   %for j = 1,1,length(s) %cycle
      d = char no(s,j)
      k = 10*k + (d-'0') %if d # ' '
   %repeat
   %result = k
%end

%predicate true cond (%string(63)%name cond)
   %string(63) x
   cond = x.cond %while cond -> x.(" ").cond
   To upper (cond)
   %if cond -> ("EXISTS").cond %start
      %true %if exists(cond)
      %false
   %finish
   %if cond -> x.(".EQ.").cond %start
      %true %if x = cond
      %false
   %finish
   Print string (cond."
Syntax?")
   %false
%end

%system %routine EXIT (%string(63) parm)
   %signal 9                             {Simulate end of obeyfile}
%end

%System %routine IF (%string(63) parm)
   %if skipping = 0 %start
      skipping = -1 %unless true cond(parm)
      active level = level
   %finish
   level = level + 1
%end

%System %routine UNLESS (%string(63) parm)
   %if skipping = 0 %start
      skipping = -1 %if true cond(parm)
      active level = level
   %finish
   level = level + 1
%end

%System %routine ELSE (%string(63) parm)
   skipping = ~skipping %if active level = level-1
%end

%System %routine FINISH (%string(63) parm)
   level = level - 1
   skipping = 0 %if level = active level
%end

%System %routine INC (%string(63) parm)
   %string(63) var
   To upper(parm)
   var = parm
   Alias(parm)
   parm = ItoS(StoI(parm)+1,0)
   Let (var,parm)
%end

%System %routine DEC (%string(63) parm)
   %string(63) var
   To upper(parm)
   var = parm
   Alias(parm)
   parm = ItoS(StoI(parm)-1,0)
   Let (var,parm)
%end

%System %routine REPORT (%string(63) parm)
   Print string (parm)
   Newline
%end

%System %routine VERIFY (%string(63) parm)
   To upper (parm)
   ECHO OBEY = 0
   ECHO OBEY = 1 %if parm = "ON"
%end

%const %integer max label = 50
%own %integer %array lab def(1:max label) = -1(*)
%own %string(7) %array lab text(1:max label) = ""(*)
%own %integer defined = 0
%own %integer pend jump = 0

%integer %map lookup (%string(63)%name L)
   %integer j
   To upper (L)
   %for j = 1,1,defined %cycle
      %result == lab def(j) %if lab text(j) = L
   %repeat
   defined = defined + 1
   lab text(defined) = L
   %result == lab def(defined)
%end

%System %routine LABEL (%string(63) parm)
   %integer %name L == look up(parm)
   %if L < 0 %start
      L = in pos                      {Define L as here in command stream}
      SKIPPING = 0 %if addr(L) = pend jump  {Got there}
   %else
      Print string (parm." already defined")
      Newline
      %signal 9
   %finish
%end

%System %routine GOTO (%string(63) parm)
   %integer %name L == look up(parm)
   %if L < 0 %start                      {Undefined as yet}
      SKIPPING = 1                       {Till we hit it}
      pend jump = addr(L)
   %else                                 {Jump backwards}
      Seek input (L)
   %finish
%end

%end %of %file
