* 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