* RailFence
* Simple transposition cipher
* Note: Not very secure
* Syntax: do Caesar with <Text or File> [,Shift] [,Decrypt]
parameter sText, nShift, xDeCrypt
do case
case parameters() =0
=Ww('Must specify text',3)
return .f.
case parameters() =1
nShift =1
lDecrypt =.f.
case parameters() =2
* nShift given
lDecrypt =.f.
case parameters() =3
if type('xDeCrypt') ='L'
lDecrypt =xDeCrypt
else
lDecrypt =.t.
endif
endcase
private nX, lFile
if empty(sText)
return sText
endif
if '.TXT' $ upper(sText)
if file(sText)
*_KeyBoard =.f.
cFile =sText
=Ww(iif(lDecrypt,'DeCrypting ','EnCrypting ')
+cFile,1)
nHandle =fopen(cFile)
nLength =fseek(nHandle,0,2)
&& Number of byes
nFileTop =fseek(nHandle,0)
&& Move pointer
to BOF
if nLength <= 0
&& Is file empty?
=Ww('This file is
empty!',3)
if fclose(nHandle) =.f.
=Ww(cFile +' could not be closed',3)
endif
return .f.
else
sText =fread(nHandle,
nLength)
endif
if fclose(nHandle) =.f.
=Ww(cFile +' could not
be closed',3)
endif
lFile =.t.
endif
else
nLength =len(sText)
lFile =.f.
endif
sText =sText +sText
cResult =''
for nX =1 to nLength
cCharacter =substr(sText,nX,1)
if lDecrypt =.f.
cCharacter =substr(sText, nX +nShift, 1)
else
cCharacter =substr(sText, nX -nShift, 1)
endif
cResult =cResult +cCharacter
endfor
if lFile =.t.
erase &cFile
if file(cFile)
=ww('did not erase ' +cFile,3)
endif
nHandle =fcreate(cFile)
nLength2 =fwrite(nHandle, cResult)
lClosed =fclose(nHandle)
if nLength2 <> nLength or lClosed =.f.
=Ww('Something wrong happened',3)
endif
=Beeps('u2')
else
return cResult
endif