ReplaceFileData [Bug Corrected]
Posted: Tue Jul 05, 2005 4:52 pm
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
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