%SYSTEM %INTEGER %FN SIZE OF (%NAME X) ! Needed for 'straight' code: ! %CONST %BYTE %INTEGER %ARRAY BYTES (0:7) = 1(4),2,4,8,16 %INTEGER I *LSS_(%LNB+5) *ST_I %IF I&X'C2000000'#0 %THEN %RESULT = I&X'00FFFFFF' ! 'Straight' code: ! I = (I>>27) & 7 ! %RESULT = BYTES (I) ! 'Bit-twiddling' equivalent: %RESULT = ((X'000000F0'<<((I>>27) & 7))>>11) + 1 %END %SYSTEM %STRING (255) %FN SUBSTRING (%STRING %NAME S, %INTEGER I, J) %STRING (255) HOLDS %IF I<1 %OR I>J+1 %OR J>LENGTH(S) %THEN %SIGNAL %EVENT 5,7 ! For strict compatibility with IMP 77, we should also %SIGNAL if ! I = LENGTH(S) + 1. J = J - I + 1 LENGTH (HOLDS) = J MOVE (J, ADDR(S)+I, ADDR(HOLDS)+1) %RESULT = HOLDS %END