home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
fortran
/
ratfor.lbr
/
TRNLIT.RTF
< prev
next >
Wrap
Text File
|
1986-04-27
|
6KB
|
241 lines
#========= translit program from chapter 2 ==========
include "b:ratdefn.rtf"
define(MAXARR,100)
define(MAXSET,100)
define(ESCAPE,ATSIGN)
define(DASH,MINUS)
define(NOT,BANG)
# addset - put c in set(j) if it fits, increment j
integer function addset(c, set, j, maxsiz)
integer j, maxsiz
character c, set(maxsiz)
if (j > maxsiz)
addset = NO
else {
set(j) = c
j = j + 1
addset = YES
}
return
end
# dodash - expand array(i-1)-array(i+1) into set(j)... from valid
subroutine dodash(valid, array, i, set, j, maxset)
character esc
integer addset, index
integer i, j, junk, k, limit, maxset
character array(ARB), set(maxset), valid(ARB)
i = i + 1
j = j - 1
limit = index(valid, esc(array, i))
for (k = index(valid, set(j)); k <= limit; k = k + 1)
junk = addset(valid(k), set, j, maxset)
return
end
# esc - map array(i) into escaped character if appropriate
character function esc(array, i)
character array(ARB)
integer i
if (array(i) ^= ESCAPE)
esc = array(i)
else if (array(i+1) == EOS) # \*a not special at end
esc = ESCAPE
else {
i = i + 1
if (array(i) == LETN)
esc = NEWLINE
else if (array(i) == LETT)
esc = TAB
else
esc = array(i)
}
return
end
# filset - expand set at array(i) into set(j), stop at delim
subroutine filset(delim, array, i, set, j, maxset)
character esc
integer addset, index
integer i, j, junk, maxset
character array(ARB), delim, set(maxset)
# string digits "0123456789"
character digits(11)
# string lowalf "abcdefghijklmnopqrstuvwxyz"
character lowalf(27)
# string upalf "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
character upalf(27)
data digits(1)/DIG0/, digits(2)/DIG1/, digits(3)/DIG2/
data digits(4)/DIG3/, digits(5)/DIG4/, digits(6)/DIG5/
data digits(7)/DIG6/, digits(8)/DIG7/, digits(9)/DIG8/
data digits(10)/DIG9/, digits(11)/EOS/
data lowalf(01)/LETA/
data lowalf(02)/LETB/
data lowalf(03)/LETC/
data lowalf(04)/LETD/
data lowalf(05)/LETE/
data lowalf(06)/LETF/
data lowalf(07)/LETG/
data lowalf(08)/LETH/
data lowalf(09)/LETI/
data lowalf(10)/LETJ/
data lowalf(11)/LETK/
data lowalf(12)/LETL/
data lowalf(13)/LETM/
data lowalf(14)/LETN/
data lowalf(15)/LETO/
data lowalf(16)/LETP/
data lowalf(17)/LETQ/
data lowalf(18)/LETR/
data lowalf(19)/LETS/
data lowalf(20)/LETT/
data lowalf(21)/LETU/
data lowalf(22)/LETV/
data lowalf(23)/LETW/
data lowalf(24)/LETX/
data lowalf(25)/LETY/
data lowalf(26)/LETZ/
data lowalf(27)/EOS/
data upalf(01) /BIGA/
data upalf(02) /BIGB/
data upalf(03) /BIGC/
data upalf(04) /BIGD/
data upalf(05) /BIGE/
data upalf(06) /BIGF/
data upalf(07) /BIGG/
data upalf(08) /BIGH/
data upalf(09) /BIGI/
data upalf(10) /BIGJ/
data upalf(11) /BIGK/
data upalf(12) /BIGL/
data upalf(13) /BIGM/
data upalf(14) /BIGN/
data upalf(15) /BIGO/
data upalf(16) /BIGP/
data upalf(17) /BIGQ/
data upalf(18) /BIGR/
data upalf(19) /BIGS/
data upalf(20) /BIGT/
data upalf(21) /BIGU/
data upalf(22) /BIGV/
data upalf(23) /BIGW/
data upalf(24) /BIGX/
data upalf(25) /BIGY/
data upalf(26) /BIGZ/
data upalf(27) /EOS/
for ( ; array(i) ^= delim & array(i) ^= EOS; i = i + 1)
if (array(i) == ESCAPE)
junk = addset(esc(array, i), set, j, maxset)
else if (array(i) ^= DASH)
junk = addset(array(i), set, j, maxset)
else if (j <= 1 | array(i+1) == EOS) # literal -
junk = addset(DASH, set, j, maxset)
else if (index(digits, set(j-1)) > 0)
call dodash(digits, array, i, set, j, maxset)
else if (index(lowalf, set(j-1)) > 0)
call dodash(lowalf, array, i, set, j, maxset)
else if (index(upalf, set(j-1)) > 0)
call dodash(upalf, array, i, set, j, maxset)
else
junk = addset(DASH, set, j, maxset)
return
end
# makset - make set from array(k) in set
integer function makset(array, k, set, size)
integer addset
integer i, j, k, size
character array(ARB), set(size)
i = k
j = 1
call filset(EOS, array, i, set, j, size)
makset = addset(EOS, set, j, size)
return
end
# translit - map characters
character getc
character arg(MAXARR), c, from(MAXSET), to(MAXSET)
integer getarg, length, makset, xindex
integer allbut, collap, i, lastto
call initio
if (getarg(1, arg, MAXARR) == EOF)
call error("usage: translit from to.")
else if (arg(1) == NOT) {
allbut = YES
if (makset(arg, 2, from, MAXSET) == NO)
call error("from: too large.")
}
else {
allbut = NO
if (makset(arg, 1, from, MAXSET) == NO)
call error("from: too large.")
}
if (getarg(2, arg, MAXARR) == EOF)
to(1) = EOS
else if (makset(arg, 1, to, MAXSET) == NO)
call error("to: too large.")
lastto = length(to)
if (length(from) > lastto | allbut == YES)
collap = YES
else
collap = NO
repeat {
i = xindex(from, getc(c), allbut, lastto)
if (collap == YES & i >= lastto & lastto > 0) { # collapse
call putc(to(lastto))
repeat
i = xindex(from, getc(c), allbut, lastto)
until (i < lastto)
}
if (c == EOF)
{ call putc(EOF)
break }
if (i > 0 & lastto > 0) # translate
call putc(to(i))
else if (i == 0) # copy
call putc(c)
# else delete
}
stop
end
# xindex - invert condition returned by index
integer function xindex(array, c, allbut, lastto)
character array(ARB), c
integer index
integer allbut, lastto
if (c == EOF)
xindex = 0
else if (allbut == NO)
xindex = index(array, c)
else if (index(array, c) > 0)
xindex = 0
else
xindex = lastto + 1
return
end