ReplaceFileData [Bug Corrected]

Share your advanced PureBasic knowledge/code with the community.
ABBKlaus
Addict
Addict
Posts: 1143
Joined: Sat Apr 10, 2004 1:20 pm
Location: Germany

ReplaceFileData [Bug Corrected]

Post by ABBKlaus »

Code updated for 5.20+

i found a bug in the ReplaceFileData routine http://www.purearea.net/pb/CodeArchiv/F ... ileData.pb

@Andre if you read this then please update the codearchiv

Code: Select all

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=3102&highlight=
; Author: Froggerprogger
; Date: 11. December 2003

; Function:
; Replaces data in a file. The data can be in any form (array, memory, string)
; and different lengths.

; Funktion:
; Ersetzt in einer Datei Daten. Diese können in irgendeiner Form vorliegen
; (Array, Memory, Strings) und unterschiedliche Längen haben.


;- 10.11.2003 by Froggerprogger
;-
;- ReplaceFileData:
;- filename.s       : Dateiname der Input-Datei
;- outputfilename.s : Dateiname der Output-Datei - kann auch mit der Input-Datei übereinstimmen
;- *searchdata      : ein Pointer auf die Daten die zu suchen sind, z.B. @"TEST" oder @myArray oder *mem etc..
;- searchdataLen    : Länge der Suchdaten in Bytes
;- *replacedata     : ein Pointer auf die Daten mit denen zu ersetzen ist, z.B. @"Testing" oder @myArray2 oder *mem2 etc..
;- replacedataLen   : Länge der Daten, mit denen ersetzt wird
;-
;- Die Funktion liefert die Anzahl der Ersetzungen zurück oder einen Wert < 0, falls ein
;- Fehler auftauchte:
;- Fehlercodes:  -1 = Länge der Input-Datei ist < 1 oder ist ein Verzeichnis oder nicht gefunden (kann mit FileSize(spezifiziert werden))
;-               -2 = die Input-Datei konnte nicht geöffnet werden
;-               -3 = die Output-Datei konnte nicht geöffnet/erstellt werden

#TempFile = 0

Procedure ReplaceFileData(filename.s, outputfilename.s, *searchdata, searchdataLen, *replacedata, replacedataLen)
  Protected templ
  Protected *tempmem
  Protected fileLen
  Protected numResults
   
  fileLen = FileSize(filename) 
  If fileLen < 1 Or searchdataLen < 1
    ProcedureReturn -1
  EndIf
 
  If OpenFile(#TempFile, filename)
    *tempmem = AllocateMemory(fileLen)
    ReadData(#TempFile, *tempmem, fileLen)
    CloseFile(#TempFile)
   
    If CreateFile(#TempFile, outputfilename)
      i = 0
      While i <= fileLen - 1
        If PeekB(*tempmem + i) <> PeekB(*searchdata)
          WriteByte(#TempFile, PeekB(*tempmem + i))
          i + 1
        Else
          same = #True : j=1
          While same = #True And j < searchdataLen
            If PeekB(*tempmem + i + j) <> PeekB(*searchdata + j)
              same = #False
            Else
              j+1
            EndIf
          Wend
          If same = #True
            WriteData(#TempFile, *replacedata, replacedataLen)
            numResults + 1
            i + j            ; <- New
          Else
            WriteByte(#TempFile, PeekB(*tempmem + i)) ;<- New
            ; WriteData(*tempmem + i, j) ; <- Removed
            i + 1             ; <- New
          EndIf
          ; i + j ; <- Removed
        EndIf
      Wend
     
      CloseFile(#TempFile)
    Else
      numResults = -3 ; <- New
    EndIf
    FreeMemory(*tempmem) ; <- New
  Else
    numResults = -2 ; <- New
  EndIf
 
  ProcedureReturn numResults
EndProcedure