Wilson WindowWare Tech Support

WinBatch WinBatch+Compiler WebBatch
Home | Tech Database | Tech BBS | White Papers | Purchase


Manipulate screen or file data

Keywords:   Manipulate screen or file data

;***************************************************************************************
; Program Title:          ScreenFileUtility                                            *
;                                                                                      *
; Author                  Steffen Fraas, sfraas@zoo.co.uk                              *
;                                                                                      *
; Date:                   30/12/2001                                                   *
;                                                                                      *
; Synopsis:               Manipulate screen or file data                               *
;                                                                                      *
; Functions:              See panel.                                                   *
;                                                                                      *
; CALLed routines/modules  Screenfileutility.wbt                                       *
;                                                                                      *
; Input/Output files:                                                                  *
;                                                                                      *
; Documentation File:                                                                  *
;                                                                                      *
; Notes:                  Incorporates FileMath functions                              *
;                                                                                      *
; Installation            Save this file in WinBatch.exe's directory                   *
;                                                                                      *
; For screen data manipulation add next two lines into wspopup.mnu                     *
;                                                                                      *
;      ScreenFileUtilities         \ {F7}                     ; must start in column 1 *
;          Call(StrCat(Dirhome(),"Screenfileutility.wbt"),"") ; must start in column 5 *
;                                                                                      *
;    To process a range of lines in WinBatch Studio, first highlight lines before      *
;      invoking utility. Default is all lines.                                         *
;                                                                                      *
;                                                                                      *
; For file data manipulation add a shortcut to desktop pointing at this file           *
;                                                                                      *
;                                                                                      *
;***************************************************************************************

;New Utility
         vers="Utility v1.0"

         gosub initudfs
         gosub saveinput
         gosub request
         gosub processrequest

         exit

;--------------------------------------------------------------------------------------------------
:request                                                   ;{{{:request}}}

         Intcontrol(28,1,0,0,0)                            ; Fixed font.
         Intcontrol(63,100,10,890,990)                     ; Stretch panel.
         if batchu then x=AskItemList(StrCat(vers," - ","Batch Utility - UDF loaded count=",Intcontrol(77,90,0,0,0)),batch,@Tab,@Unsorted,@Single) ; Get function name selected.
          else x=AskItemList(StrCat(vers," - ","Screen Utility - UDF loaded count=",Intcontrol(77,90,0,0,0)),screen,@Tab,@Unsorted,@Single) ; Get function name selected.
         sf=StrTrim(StrLower(StrSub(x,1,2)))               ; Get function code.
         if sf=="x" || x=="" || cancel then return         ; Exit/cancel - same thing here.
         if StrSub(sf,1,1)==";" then goto request

         function=ItemExtract(sf,functs,@Tab)
         if StrTrim(function)=="" then Message("Unimplemented function",x)
           then return

         if !ItemLocate(function,Intcontrol(77,103,0,0,0),@Tab) then gosub %function%

         file3=%function%(batchu,file1)

         return
;--------------------------------------------------------------------------------------------------
:processrequest                                            ;{{{:processrequest}}}
         if file3<>""
            if FileSize(file3)<>0
               if !batchu
                  buf=BinaryAlloc(FileSize(file3))
                  BinaryRead(buf,file3)
                  if !crlf && BinaryPeekStr(buf,FileSize(file3)-2,2)==@CrLf then BinaryEodSet(buf,BinaryEodGet(buf)-2)
                  ClipPut("")
                  BinaryClipPut(buf,1)
                  wPaste()
                  BinaryFree(buf)
                else
                  Run(StrCat(DirHome(),"Browser.exe"),FileNameShort(file3))
                endif
             else
               Run(StrCat(DirHome(),"Browser.exe"),FileNameShort(file3))
             endif
          endif
         if !batchu then wClearSel()
         drop(batch,batchu,buf,cancel,crlf,file1,file2,file3,function,functs,logudf,screen,sf,size)
         drop(udflist,udfs,vers,x,xx)
         return
;--------------------------------------------------------------------------------------------------
:saveinput                                                 ;{{{:saveinput}}}
         if batchu
            file1=AskFileName("Select File",FilePath(Intcontrol(1004,0,0,0,0)),"All Files|*.*","*.*",1)
          else
            file1=FileNameLong(FileCreateTemp("UF1"))
            batchu=0
            if !wGetSelState() then wSelectAll()
            wCopy()
            size=BinaryClipGet(0,1)
            buf=BinaryAlloc(size)
            BinaryClipGet(buf,1)
            if size<3 then crlf=0
            if size>2 then if BinaryPeekStr(buf,size-2,2)<>@CrLf then crlf=0
            BinaryWrite(buf,file1)
            BinaryFree(buf)
          endif
         return
;--------------------------------------------------------------------------------------------------
:initudfs                                                  ;{{{:initudfs}}}
         ;@fmADD=1
         ;@fmSUBTRACT=2
         ;@fmOR=3
         ;@fmXOR=4
         ;@fmAND=5
         file1=""
         file2=""
         file3=""
         Intcontrol(72,2,0,0,0)                            ; Cancel and return.
         cancel=0                                          ; Reset.
         crlf=1
         batchu=0
         if RtStatus()==1 || RtStatus()==0 then batchu=1   ; Interpreter or .exe.

         xx=0
         functs=""
         if batchu
            xx=xx+1
            functs=StrCat(functs,"Datainformation",@Tab)
            batch=StrCat(StrFix(xx," ",4),"File - data information",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Charactercount",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Character Count",@Tab)

            batch=StrCat(batch,";******************************   FileMath functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Sortascending",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Sort (Ascending)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Sortdescending",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Sort (Descending)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"ColumnSort",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Column Sort ",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Removeduplicatelines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Remove Duplicate lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Getduplicatelines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Get Duplicate lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Addlines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - ADD (Makes a combination of both input files. Not sorted.  Dups may exist)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Subtractlines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - SUBTRACT (Subtracts line in second file from the first file. Sorted. Dups may exist)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Orlines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - OR (Returns lines found in both files. Sorted.  No dups)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Xorlines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - XOR (Returns lines not found in both file)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Andlines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - AND (Returns lines only found in both files)",@Tab)

            batch=StrCat(batch,";******************************   Column manipulation functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"ShiftColumns",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Shift columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"DeleteColumns",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Delete columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"SaveColumns",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Save columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"InsertColumns",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Insert columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"InsertData",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Insert data",@Tab)

            batch=StrCat(batch,";******************************   Line manipulation functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Dropblanklines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Drop blank lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"WrapLines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Wrap lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"CentreLines",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Centre/Align lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Appenddata",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Append data to lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Prependdata",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Prepend data to lines",@Tab)

            batch=StrCat(batch,";******************************   Hex manipulation functions   *******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"HextoHex",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Hex for Hex replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"HextoString",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Hex for String replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"StringtoHex",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - String for Hex replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"MultipleHex",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Multiple Hex deletions",@Tab)

            xx=xx+1
            functs=StrCat(functs,"DisplayHex",@Tab)
            batch=StrCat(batch,StrFix(xx," ",4),"File - Display Hex",@Tab)

            batch=StrCat(batch,";******************************   End of function list   ******************************",@Tab)

            batch=StrCat(batch,@Tab,@Tab,"X  Exit")

          else
            xx=xx+1
            functs=StrCat(functs,"Datainformation",@Tab)
            screen=StrCat(StrFix(xx," ",4),"Screen - data information",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Charactercount",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Character Count",@Tab)

            screen=StrCat(screen,";******************************   FileMath functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Sortascending",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Sort (Ascending)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Sortdescending",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Sort (Descending)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"ColumnSort",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Column Sort ",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Removeduplicatelines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Remove Duplicate lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Getduplicatelines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Get Duplicate lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Addlines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - ADD (Makes a combination of both input files. Not sorted.  Dups may exist)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Subtractlines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - SUBTRACT (Subtracts line in second file from the first file. Sorted. Dups may exist)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Orlines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - OR (Returns lines found in both files. Sorted.  No dups)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Xorlines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - XOR (Returns lines not found in both file)",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Andlines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - AND (Returns lines only found in both files)",@Tab)

            screen=StrCat(screen,";******************************   Column manipulation functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"ShiftColumns",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Shift columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"DeleteColumns",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Delete columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"SaveColumns",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Save columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"InsertColumns",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Insert columns",@Tab)

            xx=xx+1
            functs=StrCat(functs,"InsertData",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Insert Data",@Tab)

            screen=StrCat(screen,";******************************   Line manipulation functions   ******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"DropBlankLines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Drop blank lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"WrapLines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Wrap lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"CentreLines",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Centre/Align lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Appenddata",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Append data to lines",@Tab)

            xx=xx+1
            functs=StrCat(functs,"Prependdata",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Prepend data to lines",@Tab)

            screen=StrCat(screen,";******************************   Hex manipulation functions   *******************************",@Tab)

            xx=xx+1
            functs=StrCat(functs,"HextoHex",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Hex for Hex replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"HextoString",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Hex for String replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"StringtoHex",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - String for Hex replacement",@Tab)

            xx=xx+1
            functs=StrCat(functs,"MultipleHex",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Mulitple Hex deletions",@Tab)

            xx=xx+1
            functs=StrCat(functs,"DisplayHex",@Tab)
            screen=StrCat(screen,StrFix(xx," ",4),"Screen - Display Hex",@Tab)

            screen=StrCat(screen,";******************************   End of function list   ******************************",@Tab)

            screen=StrCat(screen,@Tab,@Tab,"X  Exit")
          endif

         functs=StrLower(functs)

         udfs=StrCat(" ",StrReplace(Intcontrol(77,103,0,0,0),@Tab," ")," ")
         udflist="fmfilemath fmgetdups fmgetfileobject fmremovedups fmsortfile fmsortfilereverse fmverifyfileobject fmcolumnsort"
         for x=1 to ItemCount(udflist," ")
            if ItemLocate(ItemExtract(x,udflist," "),udfs," ") then continue
            logudf=ItemExtract(x,udflist," ")
            gosub %logudf%
          next
         return
;------------------------------------------------------------------------------------------------------------
:datainformation                                           ;{{{:datainformation}}}
         #definefunction Datainformation(batchu,file1)     ;{{{#definefunction Datainformation}}}
            if !batchu then wClearSel()
            sub1max1=0                                     ; Length of longest line.
            sub1max1l=0                                    ; Line # of longest line.
            sub1tbar=0                                     ; No of lines in file.
            sub1bx1=0                                      ; No of blanks.
            sub1tsf=0                                      ; Current line no.
            sub1f=FileOpen(file1,"Read")
            while @True
               sub1line=FileRead(sub1f)
               if sub1line=="*EOF*" then break
               sub1tsf=sub1tsf+1
               if sub1max1maxsize || ec<1 || ec>maxsize || ec5), "fmFileMath Error","param4 is not 1 2 3 4 or 5")
   ;Hack to optimize ADD(1)
            if optype==1
               FileCopy(filea[0],fileout[0],0)
               FileAppend(fileb[0], fileout[0])
               fileout[1]=FileSize(fileout[0])
               fileout[2]=filea[2]+fileb[2]                ; Recordcount.
               fileout[3]=Max(filea[3],fileb[3])           ; Maxsize.
               fileout[5]=0                                ; Sorted=false.
               fileout[6]=0                                ; 'deduped=false.
               return
             endif
   ;Hack to optimize "OR"
            if optype==3                                   ; OR.
               tempout=fmGetFileObject(FileNameLong(FileCreateTemp("~fm")),0)
               fmFileMath(filea,fileb,tempout,1)
               fmRemoveDups(tempout,fileout)
               FileDelete(tempout[0])
       ;sorted and deduped status set by fmRemoveDups routine
               return
             endif
            switch optype
;       case 1  ; add                 ; ADD optimized above
             case 2                                        ; Subtract.
               tempa=fmGetFileObject(FileNameLong(FileCreateTemp("~fm")),0)
               tempb=fmGetFileObject(FileNameLong(FileCreateTemp("~fm")),0)
               fmSortFile(filea,tempa)
               fmSortFile(fileb,tempb)
               fileout[5]=1                                ; Sorted.
               fileout[6]=0                                ; Deduped.
               break
;       case 3  ; OR                  ; OR optimized above
             case 4                                        ; XOR.
             case 5                                        ; AND.
               tempa=fmGetFileObject(FileNameLong(FileCreateTemp("~fm")),0)
               tempb=fmGetFileObject(FileNameLong(FileCreateTemp("~fm")),0)
               fmRemoveDups(filea,tempa)
               fmRemoveDups(fileb,tempb)
               fileout[5]=1                                ; Sorted.
               fileout[6]=1                                ; Deduped.
             endswitch
            handlea=FileOpen(tempa[0],"READ")
            handleb=FileOpen(tempb[0],"READ")
            out=FileOpen(fileout[0],"WRITE")
   ;state machine    0 need both lines
   ;                 1 compare 2 lines
            reccount=0
            maxsize=0
            state=optype
            while 1
               switch state


;       case 1       ;ADD   ; ADD replaced by optimization above
;
                case 2                                     ; SUBTRACT.
                  linea=StrTrim(FileRead(handlea))
                  lineb=StrTrim(FileRead(handleb))

:xsubtract                                                 ;{{{:xsubtract}}}
                  if linea=="*EOF*"
                     state = 99                            ; All done.
                     continue
                   endif
                  if lineb=="*EOF*"
                     FileWrite(out, linea)
                     reccount=reccount+1
                     maxsize=Max(maxsize,StrLen(linea))
                     state=98                              ; No more minus lines.
                     continue
                   endif

                  test=StrCmp(linea,lineb)
                  if test==0                               ; Lines match.  toast both of them.
                     linea=StrTrim(FileRead(handlea))
                     lineb=StrTrim(FileRead(handleb))
                   else
                     if test > 0                           ; LineA > lineB  Need new lineB.
                        lineb=FileRead(handleb)
                      else                                 ; LineA < lineB.
                        FileWrite(out,linea)
                        reccount=reccount+1
                        maxsize=Max(maxsize,StrLen(linea))
                        linea=FileRead(handlea)
                        state=optype
                      endif
                   endif
                  goto xsubtract                           ; NB   No structure levels being crossed.  DON'T USE GOTOs!!!!!!
                  break


;       case 3      ; OR    ; OR replace by optimization aboce

                case 4                                     ; XOR.
                  linea=StrTrim(FileRead(handlea))
                  lineb=StrTrim(FileRead(handleb))
:xxor                                                      ;{{{:xxor}}}
                  if linea=="*EOF*"
                     if lineb!="*EOF*"
                        FileWrite(out,lineb)
                        reccount=reccount+1
                        maxsize=Max(maxsize,StrLen(lineb))
                        state = 97                         ; Dump rest of B.
                        continue
                      endif
                     state=99
                     continue
                   endif
                  if lineb=="*EOF*"
                     FileWrite(out,linea)
                     reccount=reccount+1
                     maxsize=Max(maxsize,StrLen(linea))
                     state=98                              ; Dump rest of A.
                     continue
                   endif

                  test=StrCmp(linea,lineb)
                  if test==0                               ; Lines match.  toast both of them.
                     linea=StrTrim(FileRead(handlea))
                     lineb=StrTrim(FileRead(handleb))
                   else
                     if test > 0                           ; LineA > lineB  Need new lineB.
                        FileWrite(out,lineb)
                        reccount=reccount+1
                        maxsize=Max(maxsize,StrLen(lineb))
                        lineb=FileRead(handleb)
                      else                                 ; LineA < lineB.
                        FileWrite(out,linea)
                        reccount=reccount+1
                        maxsize=Max(maxsize,StrLen(linea))
                        linea=FileRead(handlea)
                      endif
                   endif
                  goto xxor                                ; NB   No structure levels being crossed.  DON'T USE GOTOs!!!!!!
                  break
                case 5                                     ; AND.
                  linea=StrTrim(FileRead(handlea))
                  lineb=StrTrim(FileRead(handleb))
:xand                                                      ;{{{:xand}}}
                  if linea=="*EOF*"
                     state = 99
                     continue
                   endif
                  if lineb=="*EOF*"
                     state = 99
                     continue
                   endif

                  test=StrCmp(linea,lineb)
                  if test==0                               ; Lines match.  the only case where we write a line.
                     FileWrite(out,linea)
                     reccount=reccount+1
                     maxsize=Max(maxsize,StrLen(linea))
                     linea=StrTrim(FileRead(handlea))
                     lineb=StrTrim(FileRead(handleb))
                   else
                     if test > 0                           ; LineA > lineB  Need new lineB.
                        lineb=FileRead(handleb)
                      else                                 ; LineA < lineB.
                        linea=FileRead(handlea)
                      endif
                   endif
                  goto xand                                ; NB   No structure levels being crossed.  DON'T USE GOTOs!!!!!!
                  break
                case 97                                    ; Dump rest of B to the outfile.
                  while 1
                     lineb=FileRead(handleb)
                     if lineb=="*EOF*" then break
                     FileWrite(out,lineb)
                     reccount=reccount+1
                     maxsize=Max(maxsize,StrLen(lineb))
                   endwhile
                  state=99
                  break
                case 98                                    ; Dump rest of A to the outfile.
                  while 1
                     linea=FileRead(handlea)
                     if linea=="*EOF*" then break
                     FileWrite(out,linea)
                     reccount=reccount+1
                     maxsize=Max(maxsize,StrLen(linea))
                   endwhile
                  state=99
                  break
                endswitch
               if state==99 then break
             endwhile

            FileClose(handlea)
            FileClose(handleb)
            FileClose(out)
            if optype!=1                                   ; Not for adds.
               FileDelete(tempa[0])
               FileDelete(tempb[0])
             endif
            fileout[1]=FileSize(fileout[0])
            fileout[2]=reccount
            fileout[3]=maxsize
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:shiftcolumns                                              ;{{{:shiftcolumns}}}
         #definefunction Shiftcolumns(batchu,file1)        ;{{{#definefunction Shiftcolumns}}}
            sc9=1
            cm9=5
            Intcontrol(72,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            while @True
               shiftcformat=`WWWDLGED,5.0`
               shiftccaption=`Shift Columns`
               shiftcx=450
               shiftcy=10
               shiftcwidth=100
               shiftcheight=78
               shiftcnumcontrols=8
               shiftc01=`2,4,160,DEFAULT,STATICTEXT,DEFAULT,"Shift column  x  +/- y  positions"`
               shiftc02=`2,16,64,DEFAULT,STATICTEXT,DEFAULT,""`
               shiftc03=`4,33,30,DEFAULT,STATICTEXT,DEFAULT,"Column"`
               shiftc04=`32,30,15,DEFAULT,EDITBOX,sc9,""`
               shiftc05=`50,30,15,DEFAULT,EDITBOX,cm9,""`
               shiftc06=`070,32,36,DEFAULT,STATICTEXT,DEFAULT,"positions"`
               shiftc07=`08,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Move",1`
               shiftc08=`53,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               shcbp=Dialog("Shiftc")
               if cancel || shcbp==2 then break            ; Cancel requested.
               if !IsNumber(sc9) || !IsNumber(cm9) || sc9<1 then continue
               break
             endwhile
            if cancel || shcbp==2 then return ""           ; Cancel requested.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               dl9=StrLen(line)                            ; Handy constant.
               if cm9<0 then goto left9                    ; Left cm5.
               if sc9==0 then line=StrCat(StrFill(" ",cm9),line) ; Shift all rightwards.
                else line=StrCat(StrSub(line,1,sc9-1),StrFill(" ",cm9),StrSub(line,sc9,-1)) ; Part old line, filler, rest.
               goto writeout                               ; Write out line.
:left9                                                     ;{{{:left9}}}
               if dl9 < sc9 then line=""                   ; Line long enough, no, column disappears.
                 then goto writeout
               if sc9==0 then line=StrSub(line,Abs(cm9)+1,-1) ; Simple left move ? Start at 'cm5' rightwards.
                 then goto writeout
               nc9=sc9-Abs(cm9)                            ; Work out old col 1 to 'cm9'.
               if nc9>0 then line=StrCat(StrSub(line,1,nc9-1),StrSub(line,sc9,-1)) ; Old part, chop, remainder.
                else line=StrSub(line,Abs(cm9)+1,-1)       ; From 'cm9' rightwards.
:writeout                                                  ;{{{:writeout}}}
               FileWrite(f3,line)
             endwhile
            FileClose(f1)
            FileClose(f3)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:deletecolumns                                             ;{{{:deletecolumns}}}
         #definefunction Deletecolumns(batchu,file1)       ;{{{#definefunction Deletecolumns}}}
            Intcontrol(72,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            sc13=1
            ec13=5
            while @True
               deleteformat=`WWWDLGED,5.0`
               deletecaption=`Delete Columns`
               deletex=300
               deletey=50
               deletewidth=85
               deleteheight=78
               deletenumcontrols=8
               delete01=`2,4,100,DEFAULT,STATICTEXT,DEFAULT,"Delete columns:"`
               delete02=`2,16,100,DEFAULT,STATICTEXT,DEFAULT,"Enter start and end column"`
               delete03=`4,33,30,DEFAULT,STATICTEXT,DEFAULT,"Column x,y"`
               delete04=`32,30,15,DEFAULT,EDITBOX,Sc13,""`
               delete05=`50,30,15,DEFAULT,EDITBOX,Ec13,""`
               delete06=`01,58,20,DEFAULT,PUSHBUTTON,DEFAULT,"&Delete",1`
               delete07=`25,58,30,DEFAULT,PUSHBUTTON,DEFAULT,"&Save&&Del",3`
               delete08=`60,58,20,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               dbp=Dialog("Delete")
               if cancel || dbp==2 then break              ; Cancel requested.
               if !IsNumber(sc13) || !IsNumber(ec13) || sc13<1 || ec13"" then FileClose(f4)
              then Display(2,"Listing of DELETED columns",file4)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:savecolumns                                               ;{{{:savecolumns}}}
         #definefunction Savecolumns(batchu,file1)         ;{{{#definefunction Savecolumns}}}
            Intcontrol(72,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            sc13=1
            ec13=5
            while @True
               saveformat=`WWWDLGED,5.0`
               savecaption=`Save Columns`
               savex=300
               savey=50
               savewidth=85
               saveheight=78
               savenumcontrols=7
               save01=`2,4,100,DEFAULT,STATICTEXT,DEFAULT,"Save columns:"`
               save02=`2,16,100,DEFAULT,STATICTEXT,DEFAULT,"Enter start and end column"`
               save03=`4,33,30,DEFAULT,STATICTEXT,DEFAULT,"Column x,y"`
               save04=`32,30,15,DEFAULT,EDITBOX,Sc13,""`
               save05=`50,30,15,DEFAULT,EDITBOX,Ec13,""`
               save06=`01,58,20,DEFAULT,PUSHBUTTON,DEFAULT,"&Save",1`
               save07=`60,58,20,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               dbp=Dialog("Save")
               if cancel || dbp==2 then break              ; Cancel requested.
               if !IsNumber(sc13) || !IsNumber(ec13) || sc13<1 || ec13"*EOF*" then gosub write
                   else line4eof=1
                   else line4=""
                endif
               FileWrite(f3,line)
             endwhile
            FileClose(f1)
            FileClose(f4)
            FileClose(f3)
            return file3
:write                                                     ;{{{:write}}}
            line1=StrLen(line)                             ; Length of line receiving insert data.
            if line1"" then line=StrCat(line,StrFill(" ",sc17-line1)) ; Line short, pad it out first.
            if !sc17 then line=StrCat(line4,line)          ; Just join them if column is zero.
             else line=StrCat(StrSub(line,1,sc17),line4,StrSub(line,sc17+1,-1)) ; Insert Line4 in between columns.
            return
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;------------------------------------------------------------------------------------------------------------
:insertdata                                                ;{{{:insertdata}}}
         #definefunction Insertdata(batchu,file1)          ;{{{#definefunction Insertdata}}}
            Intcontrol(72,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            sc17=1
            while @True
               insertformat=`WWWDLGED,5.0`
               insertcaption=`Insert Data`
               insertx=300
               inserty=50
               insertwidth=100
               insertheight=78
               insertnumcontrols=6
               insert01=`2,4,100,DEFAULT,STATICTEXT,DEFAULT,"Insert Data at column x "`
               insert02=`4,25,30,DEFAULT,STATICTEXT,DEFAULT,"Column x"`
               insert03=`40,22,15,DEFAULT,EDITBOX,Sc17,""`
               insert04=`10,40,70,DEFAULT,EDITBOX,Data,""`
               insert05=`08,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Insert",1`
               insert06=`53,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               ibp=Dialog("Insert")
               if cancel || ibp==2 then break              ; Cancel requested.
               if !IsNumber(sc17) then continue
               if sc17<1 then continue
               sc17=sc17-1
               break
             endwhile
            if cancel || ibp==2 || data=="" then return "" ; Cancel requested.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               line1=StrLen(line)                          ; Length of line receiving insert data.
               if line12 || StrLen(hexb)<>2 || hexa=="00" || hexb=="00" then continue
               if !StrScan(StrSub(hexa,1,1),hexs,1,@Fwdscan) || !StrScan(StrSub(hexa,2,1),hexs,1,@Fwdscan) then continue
               if !StrScan(StrSub(hexb,1,1),hexs,1,@Fwdscan) || !StrScan(StrSub(hexb,2,1),hexs,1,@Fwdscan) then continue
               a=xBaseConvert(hexa,16,10)
               b=xBaseConvert(hexb,16,10)
               break
             endwhile
            if cancel || hexc==2 then return ""            ; Cancel requested.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               FileWrite(f3,StrReplace(line,Num2Char(a),Num2Char(b)))
             endwhile
            FileClose(f1)
            FileClose(f3)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:hextostring                                               ;{{{:hextostring}}}
         #definefunction Hextostring(batchu,file1)         ;{{{#definefunction Hextostring}}}
            if !StrIndexNc(Intcontrol(77,42,0,0,0),"wilx34i.dll",1,@Fwdscan) then  AddExtender("wilx34i.dll")
            Intcontrol(73,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            hexa="00"
            hexs="0123456789abcdef"
            hexb=""
            while @True
               hexcformat=`WWWDLGED,5.0`
               hexccaption=`Hex String replacement`
               hexcx=450
               hexcy=10
               hexcwidth=100
               hexcheight=78
               hexcnumcontrols=7
               hexc01=`2,4,160,DEFAULT,STATICTEXT,DEFAULT,"Replace Hex byte with string"`
               hexc02=`2,16,64,DEFAULT,STATICTEXT,DEFAULT,""`
               hexc03=`4,33,30,DEFAULT,STATICTEXT,DEFAULT,"Byte "`
               hexc04=`32,30,15,DEFAULT,EDITBOX,Hexa,""`
               hexc05=`50,30,40,DEFAULT,EDITBOX,Hexb,""`
               hexc06=`08,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Swap",1`
               hexc07=`53,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               hexc=Dialog("Hexc")
               if cancel || hexc==2 then break             ; Cancel requested.
               hexa=StrLower(hexa)
               if StrLen(hexa)<>2 || hexa=="00" then continue
               if !StrScan(StrSub(hexa,1,1),hexs,1,@Fwdscan) || !StrScan(StrSub(hexa,2,1),hexs,1,@Fwdscan) then continue
               a=xBaseConvert(hexa,16,10)
               break
             endwhile
            if cancel || hexc==2 then return ""            ; Cancel requested.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               FileWrite(f3,StrReplace(line,Num2Char(a),hexb)) ; Swap byte with string.
             endwhile
            FileClose(f1)
            FileClose(f3)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:stringtohex                                               ;{{{:stringtohex}}}
         #definefunction Stringtohex(batchu,file1)         ;{{{#definefunction Stringtohex}}}
            if !StrIndexNc(Intcontrol(77,42,0,0,0),"wilx34i.dll",1,@Fwdscan) then  AddExtender("wilx34i.dll")
            Intcontrol(73,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            hexa=""
            hexs="0123456789abcdef"
            while @True
               hexcformat=`WWWDLGED,5.0`
               hexccaption=`String with hex replacement`
               hexcx=450
               hexcy=10
               hexcwidth=100
               hexcheight=78
               hexcnumcontrols=7
               hexc01=`2,4,160,DEFAULT,STATICTEXT,DEFAULT,"Replace string with hex byte"`
               hexc02=`2,16,64,DEFAULT,STATICTEXT,DEFAULT,""`
               hexc03=`4,33,30,DEFAULT,STATICTEXT,DEFAULT,"String "`
               hexc04=`32,30,40,DEFAULT,EDITBOX,Hexa,""`
               hexc05=`75,30,20,DEFAULT,EDITBOX,Hexb,""`
               hexc06=`08,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Swap",1`
               hexc07=`53,58,36,DEFAULT,PUSHBUTTON,DEFAULT,"&Exit",2`
               hexc=Dialog("Hexc")
               if cancel || hexc==2 then break             ; Cancel requested.
               if hexa=="" then continue
               hexb=StrLower(hexb)
               if hexb=="" then break
               if StrLen(hexb)<>2 || hexb=="00" then continue
               if !StrScan(StrSub(hexb,1,1),hexs,1,@Fwdscan) || !StrScan(StrSub(hexb,2,1),hexs,1,@Fwdscan) then continue
               b=xBaseConvert(hexb,16,10)
               break
             endwhile
            if cancel || hexc==2 then return ""            ; Cancel requested.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               if hexb<>"" then FileWrite(f3,StrReplace(StrLower(line),StrLower(hexa),Num2Char(b))) ; Replace string with hex byte.
                else FileWrite(f3,StrReplace(StrLower(line),StrLower(hexa),"")) ; Delete string.
             endwhile
            FileClose(f1)
            FileClose(f3)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:multiplehex                                               ;{{{:multiplehex}}}
         #definefunction Multiplehex(batchu,file1)         ;{{{#definefunction Multiplehex}}}
            if !StrIndexNc(Intcontrol(77,42,0,0,0),"wilx34i.dll",1,@Fwdscan) then  AddExtender("wilx34i.dll")
            Intcontrol(73,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            Intcontrol(28,2,0,0,0)                         ; Fixed font.
            Intcontrol(63,200,10,690,990)                  ; Stretch panel.
            Intcontrol(72,2,0,0,0)                         ; Cancel and return.
            x=""                                           ; Init.
            output=0                                       ; In case of problems.
            hexdel=StrCat("01",@Tab,"02",@Tab,"03",@Tab,"04",@Tab,"05",@Tab,"06",@Tab,"07",@Tab,"08",@Tab,"09",@Tab,"0a",@Tab,"0b",@Tab,"0c",@Tab,"0d",@Tab,"0e",@Tab,"0f",@Tab,"10",@Tab)
            hexdel=StrCat(hexdel,"10",@Tab,"11",@Tab,"12",@Tab,"13",@Tab,"14",@Tab,"15",@Tab,"16",@Tab,"17",@Tab,"18",@Tab,"19",@Tab,"1a",@Tab,"1b",@Tab,"1c",@Tab,"1d",@Tab,"1e",@Tab,"1f",@Tab)
            hexdel=StrCat(hexdel,"20",@Tab,"21",@Tab,"22",@Tab,"23",@Tab,"24",@Tab,"25",@Tab,"26",@Tab,"27",@Tab,"28",@Tab,"29",@Tab,"2a",@Tab,"2b",@Tab,"2c",@Tab,"2d",@Tab,"2e",@Tab,"2f",@Tab)
            hexdel=StrCat(hexdel,"30",@Tab,"31",@Tab,"32",@Tab,"33",@Tab,"34",@Tab,"35",@Tab,"36",@Tab,"37",@Tab,"38",@Tab,"39",@Tab,"3a",@Tab,"3b",@Tab,"3c",@Tab,"3d",@Tab,"3e",@Tab,"3f",@Tab)
            hexdel=StrCat(hexdel,"40",@Tab,"41",@Tab,"42",@Tab,"43",@Tab,"44",@Tab,"45",@Tab,"46",@Tab,"47",@Tab,"48",@Tab,"49",@Tab,"4a",@Tab,"4b",@Tab,"4c",@Tab,"4d",@Tab,"4e",@Tab,"4f",@Tab)
            hexdel=StrCat(hexdel,"50",@Tab,"51",@Tab,"52",@Tab,"53",@Tab,"54",@Tab,"55",@Tab,"56",@Tab,"57",@Tab,"58",@Tab,"59",@Tab,"5a",@Tab,"5b",@Tab,"5c",@Tab,"5d",@Tab,"5e",@Tab,"5f",@Tab)
            hexdel=StrCat(hexdel,"60",@Tab,"61",@Tab,"62",@Tab,"63",@Tab,"64",@Tab,"65",@Tab,"66",@Tab,"67",@Tab,"68",@Tab,"69",@Tab,"6a",@Tab,"6b",@Tab,"6c",@Tab,"6d",@Tab,"6e",@Tab,"6f",@Tab)
            hexdel=StrCat(hexdel,"70",@Tab,"71",@Tab,"72",@Tab,"73",@Tab,"74",@Tab,"75",@Tab,"76",@Tab,"77",@Tab,"78",@Tab,"79",@Tab,"7a",@Tab,"7b",@Tab,"7c",@Tab,"7d",@Tab,"7e",@Tab,"7f",@Tab)
            hexdel=StrCat(hexdel,"80",@Tab,"81",@Tab,"82",@Tab,"83",@Tab,"84",@Tab,"85",@Tab,"86",@Tab,"87",@Tab,"88",@Tab,"89",@Tab,"8a",@Tab,"8b",@Tab,"8c",@Tab,"8d",@Tab,"8e",@Tab,"8f",@Tab)
            hexdel=StrCat(hexdel,"90",@Tab,"91",@Tab,"92",@Tab,"93",@Tab,"94",@Tab,"95",@Tab,"96",@Tab,"97",@Tab,"98",@Tab,"99",@Tab,"9a",@Tab,"9b",@Tab,"9c",@Tab,"9d",@Tab,"9e",@Tab,"9f",@Tab)
            hexdel=StrCat(hexdel,"a0",@Tab,"a1",@Tab,"a2",@Tab,"a3",@Tab,"a4",@Tab,"a5",@Tab,"a6",@Tab,"a7",@Tab,"a8",@Tab,"a9",@Tab,"aa",@Tab,"ab",@Tab,"ac",@Tab,"ad",@Tab,"ae",@Tab,"af",@Tab)
            hexdel=StrCat(hexdel,"b0",@Tab,"b1",@Tab,"b2",@Tab,"b3",@Tab,"b4",@Tab,"b5",@Tab,"b6",@Tab,"b7",@Tab,"b8",@Tab,"b9",@Tab,"ba",@Tab,"bb",@Tab,"bc",@Tab,"bd",@Tab,"be",@Tab,"bf",@Tab)
            hexdel=StrCat(hexdel,"c0",@Tab,"c1",@Tab,"c2",@Tab,"c3",@Tab,"c4",@Tab,"c5",@Tab,"c6",@Tab,"c7",@Tab,"c8",@Tab,"c9",@Tab,"ca",@Tab,"cb",@Tab,"cc",@Tab,"cd",@Tab,"ce",@Tab,"cf",@Tab)
            hexdel=StrCat(hexdel,"d0",@Tab,"d1",@Tab,"d2",@Tab,"d3",@Tab,"d4",@Tab,"d5",@Tab,"d6",@Tab,"d7",@Tab,"d8",@Tab,"d9",@Tab,"da",@Tab,"db",@Tab,"dc",@Tab,"dd",@Tab,"de",@Tab,"df",@Tab)
            hexdel=StrCat(hexdel,"e0",@Tab,"e1",@Tab,"e2",@Tab,"e3",@Tab,"e4",@Tab,"e5",@Tab,"e6",@Tab,"e7",@Tab,"e8",@Tab,"e9",@Tab,"ea",@Tab,"eb",@Tab,"ec",@Tab,"ed",@Tab,"ee",@Tab,"ef",@Tab)
            hexdel=StrCat(hexdel,"f0",@Tab,"f1",@Tab,"f2",@Tab,"f3",@Tab,"f4",@Tab,"f5",@Tab,"f6",@Tab,"f7",@Tab,"f8",@Tab,"f9",@Tab,"fa",@Tab,"fb",@Tab,"fc",@Tab,"fd",@Tab,"fe",@Tab,"ff",@Tab)
            x=AskItemList("Select hex byte/s to be deleted ",hexdel,@Tab,@Unsorted,@Multiple) ; Get hex bytes for deletion.
            if x==0 || cancel then return ""               ; Exit/cancel - same thing here.
            f1=FileOpen(file1,"Read")
            file3=FileNameLong(FileCreateTemp("UF3"))
            f3=FileOpen(file3,"Write")
            while @True
               line=FileRead(f1)
               if line=="*EOF*" then break
               for y=1 to ItemCount(x,@Tab)
                  z=xBaseConvert(ItemExtract(y,x,@Tab),16,10)
                  line=StrReplace(line,Num2Char(z),"")     ; Delete hex byte.
                next
               FileWrite(f3,line)                          ; Line with deleted hex.
             endwhile
            FileClose(f1)
            FileClose(f3)
            return file3
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------
:displayhex                                                ;{{{:displayhex}}}
         #definefunction Displayhex(batchu,file1)          ;{{{#definefunction Displayhex}}}
            Intcontrol(73,2,0,0,0)                         ; Cancel and return.
            cancel=0                                       ; Reset.
            browser=StrCat(DirHome(),"Browser.exe")
            if FileExist(browser)<>1 then browser=StrLower(AskFileName("Browser not found - Select a Browser for hex viewing", DirHome(),"Program|*.exe|All Files|*.*|", "*.exe", 1)) ; Get a hex browser.
            if cancel then return ""
            Run(`%Browser%`,FileNameShort(file1))          ; Call Browser for 'work' file.
            if StrLower(browser)==StrLower(StrCat(DirHome(),"browser.exe")) then WinWaitExist("~Browser - ",5) ; Wait for it...
              then SendMenusTo("~Browser - ", "View Hex")  ; Select Hex view option.
            return ""
:cancel                                                    ;{{{:cancel}}}
            cancel=1
            return
          #endfunction
         return
;---------------------------------------------------------------------------------------------------