!!!!!!!!!!!!!!!!!!!!   String procedures  !!!!!!!!!!!!!!!!!!!!!!!!

%string(255)%fn SUBSTRING(%string(255) s, %integer from,to)
%string(255) t
  t = ""
  %while from <= to %cycle
    t = t.tostring(charno(s,from));  from = from+1
  %repeat
  %result = t
%end

%integerfn INDEX(%string(*)%name var, %string(255) match)
!Return index position of first occurrence of match within string
%integer i=0,j,l;  l=length(match)
  %cycle
    %result = 0 %if i > length(var)-l
    i = i+1
    j = 0
    %cycle
      %result = i %if j = l
      j = j+1
    %repeat %until charno(var,i+j-1) # charno(match,j)
  %repeat
%end

%predicate RESOLVE(%string(*)%name var, %string(255) match,
                   %string(*)%name fore,aft)
!Test for (first) occurrence of MATCH within VAR
! and assign preceding part to FORE and following part to AFT.
! So "%if RESOLVE(A,B,C,D)" equates to "%if A -> B.(C).D"
%integer i
%routine do aft
  aft = substring(var,i+length(match),length(var))
%end
  i = index(var,match)
  %false %if i = 0
  %if addr(fore) # addr(var) %start
    fore = substring(var,1,i-1)
    do aft
  %finish %else %start
    do aft
    length(var) = i-1
  %finish
  %true
%end

%string(127)%fn ITOS(%integer v,p)
%integer vv,q,pos
%byteintegerarray store(0:127)
  vv = v;  vv = -vv %if vv > 0
  pos = 127
  %while vv <= -10 %cycle
    q = vv//10
    store(pos) = q*10-vv+'0';  pos = pos-1
    vv = q
  %repeat
  store(pos) = '0'-vv
  pos = pos-1 %and store(pos) = '-' %if v < 0
  %if p <= 0 %start
    p = pos-128-p
  %finish %else %start
    p = pos-128+p;  p = 0 %if p < 0
    p = p+1 %if v >= 0
  %finish
  %while p > 0 %cycle
    pos = pos-1;  store(pos) = ' ';  p = p-1
  %repeat
  pos = pos-1;  store(pos) = 127-pos
  %result = string(addr(store(pos)))
%end

