%OWNINTEGER NIL = -1
%OWNINTEGER STRING DESC = X'58000000'
%OWNINTEGER LONG DESC = X'30000000'
!
%SYSTEMROUTINESPEC ITOE(%INTEGER AD, LEN)
!
%EXTERNALINTEGERFNSPEC CTM JS BEGIN(%LONGINTEGER DUMMY)
%EXTERNALINTEGERFNSPEC CTM JS END(%LONGINTEGER DUMMY)
%EXTERNALINTEGERFNSPEC CTM JS WRITE(%INTEGER NAME0, NAME1,  %C
      INT0, INT1, STR0, STR1, BOOL0, BOOL1)
%EXTERNALINTEGERFNSPEC CTM JS READ(%INTEGER NAME0, NAME1,  %C
      INT0, INT1, STR0, STR1, BOOL0, BOOL1)
%EXTERNALINTEGERFNSPEC CTM ASSIGN FILE(%INTEGER ROUTE0, ROUTE1,  %C
      LOCAL0, LOCAL1, NAME0, NAME1, ACC, LOCK, A,B,C,D,E,  %C
      %LONGINTEGER F,G, %INTEGER H,I,J,K)
%EXTERNALROUTINESPEC CTM DUMP
!
%ROUTINE ERROR(%INTEGER I)
SELECT OUTPUT(0)
NEW LINE
PRINT STRING(" CTM error code:");  WRITE(I,0);  NEW LINE
%END
!
%INTEGERFN STOI(%STRING(15) S)
!
%INTEGER I, J, X
!
%IF LENGTH(S) = 0 %THEN %RESULT = 0
I = 0
%CYCLE J = 1, 1, LENGTH(S)
      X = CHARNO(S,J)
      %IF X # ' ' %THEN %START
         %UNLESS '0' <= X <= '9' %THEN %RESULT = 0
         I = I*10 + X - '0'
         %FINISH
      %REPEAT
%RESULT = I
%END
!
%EXTERNALROUTINE XBEGIN(%STRING(255) S)
%INTEGER I
I = CTM JS BEGIN(0)
%IF I # 0 %THEN ERROR(I)
%END
!
%EXTERNALROUTINE XEND(%STRING(255) S)
%INTEGER I
I = CTM JS END(0)
%IF I # 0 %THEN ERROR(I)
%END
!
%EXTERNALROUTINE XINT(%STRING(255) S)
%STRING(31) NAME, VALUE
%INTEGER I, N0, N1, I0, I1
%LONGINTEGER IVALUE
%UNLESS S -> NAME.("=").VALUE %THEN ERROR(1)
IVALUE = STOI(VALUE)
N0 = STRING DESC ! LENGTH(NAME)
N1 = ADDR(NAME) + 1
ITOE(N1,LENGTH(NAME))
I0 = LONG DESC ! 1
I1 = ADDR(IVALUE)
I = CTM JS WRITE(N0,N1,I0,I1,NIL,NIL,NIL,NIL)
%IF I # 0 %THEN ERROR(I)
%END
!
%EXTERNALROUTINE XASSIGN(%STRING(255) S)
%STRING(31) FILE, LOCAL, ACCESS
%INTEGER I, ACC
%UNLESS S -> FILE.(",").S %THEN FILE = S %AND S = ""
%UNLESS S -> LOCAL.(",").S %THEN LOCAL = S %AND S = ""
ACCESS = S
ITOE(ADDR(FILE)+1,LENGTH(FILE))
ACC = 1
%IF ACCESS = "W" %THEN ACC = 3
%IF ACCESS = "A" %THEN ACC = 4
ITOE(ADDR(LOCAL)+1,LENGTH(LOCAL))
I = CTM ASSIGN FILE(NIL,NIL,STRING DESC!LENGTH(LOCAL),  %C
      ADDR(LOCAL)+1,STRING DESC!LENGTH(FILE),ADDR(FILE)+1,  %C
      ACC,0,0,NIL,NIL,0,0,0,0,NIL,NIL,NIL,NIL)
%IF I # 0 %THEN ERROR(I)
%END
!
%EXTERNALROUTINE XDUMP(%STRING(255) S)
CTM DUMP
%END
!
%ENDOFFILE