index c26b4512184c1319f14404374441bc0a1bc4f35a..32d2bc2865f250b2100246e59e8a07cf9a9a308f 100644 (file)
{
- $Id: ImagingIO.pas 100 2007-06-28 21:09:52Z galfar $
Vampyre Imaging Library
by Marek Mauder
http://imaginglib.sourceforge.net
function GetInputSize(IOFunctions: TIOFunctions; Handle: TImagingHandle): LongInt;
{ Helper function that initializes TMemoryIORec with given params.}
function PrepareMemIO(Data: Pointer; Size: LongInt): TMemoryIORec;
+{ Reads one text line from input (CR+LF, CR, or LF as line delimiter).}
+function ReadLine(IOFunctions: TIOFunctions; Handle: TImagingHandle;
+ out Line: AnsiString; FailOnControlChars: Boolean = False): Boolean;
+{ Writes one text line to input with optional line delimiter.}
+procedure WriteLine(IOFunctions: TIOFunctions; Handle: TImagingHandle;
+ const Line: AnsiString; const LineEnding: AnsiString = sLineBreak);
implementation
type
{ Based on TaaBufferedStream
Copyright (c) Julian M Bucknall 1997, 1999 }
- TBufferedStream = class(TObject)
+ TBufferedStream = class
private
FBuffer: PByteArray;
FBufSize: Integer;
{ File IO functions }
-function FileOpenRead(FileName: PChar): TImagingHandle; cdecl;
+function FileOpen(FileName: PChar; Mode: TOpenMode): TImagingHandle; cdecl;
+var
+ Stream: TStream;
begin
- Result := TBufferedStream.Create(TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite));
-end;
+ Stream := nil;
-function FileOpenWrite(FileName: PChar): TImagingHandle; cdecl;
-begin
- Result := TBufferedStream.Create(TFileStream.Create(FileName, fmCreate or fmShareDenyWrite));
+ case Mode of
+ omReadOnly: Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
+ omCreate: Stream := TFileStream.Create(FileName, fmCreate);
+ omReadWrite:
+ begin
+ if FileExists(FileName) then
+ Stream := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive)
+ else
+ Stream := TFileStream.Create(FileName, fmCreate);
+ end;
+ end;
+
+ Assert(Stream <> nil);
+ Result := TBufferedStream.Create(Stream);
end;
procedure FileClose(Handle: TImagingHandle); cdecl;
{ Stream IO functions }
-function StreamOpenRead(FileName: PChar): TImagingHandle; cdecl;
-begin
- Result := FileName;
-end;
-
-function StreamOpenWrite(FileName: PChar): TImagingHandle; cdecl;
+function StreamOpen(FileName: PChar; Mode: TOpenMode): TImagingHandle; cdecl;
begin
Result := FileName;
end;
{ Memory IO functions }
-function MemoryOpenRead(FileName: PChar): TImagingHandle; cdecl;
-begin
- Result := FileName;
-end;
-
-function MemoryOpenWrite(FileName: PChar): TImagingHandle; cdecl;
+function MemoryOpen(FileName: PChar; Mode: TOpenMode): TImagingHandle; cdecl;
begin
Result := FileName;
end;
Result.Size := Size;
end;
+function ReadLine(IOFunctions: TIOFunctions; Handle: TImagingHandle;
+ out Line: AnsiString; FailOnControlChars: Boolean): Boolean;
+const
+ MaxLine = 1024;
+var
+ EolPos, Pos: Integer;
+ C: AnsiChar;
+ EolReached: Boolean;
+ Endings: set of AnsiChar;
+begin
+ Line := '';
+ Pos := 0;
+ EolPos := 0;
+ EolReached := False;
+ Endings := [#10, #13];
+ Result := True;
+
+ while not IOFunctions.Eof(Handle) do
+ begin
+ IOFunctions.Read(Handle, @C, SizeOf(C));
+
+ if FailOnControlChars and (Byte(C) < $20) then
+ begin
+ Break;
+ end;
+
+ if not (C in Endings) then
+ begin
+ if EolReached then
+ begin
+ IOFunctions.Seek(Handle, EolPos, smFromBeginning);
+ Exit;
+ end
+ else
+ begin
+ SetLength(Line, Length(Line) + 1);
+ Line[Length(Line)] := C;
+ end;
+ end
+ else if not EolReached then
+ begin
+ EolReached := True;
+ EolPos := IOFunctions.Tell(Handle);
+ end;
+
+ Inc(Pos);
+ if Pos >= MaxLine then
+ begin
+ Break;
+ end;
+ end;
+
+ Result := False;
+ IOFunctions.Seek(Handle, -Pos, smFromCurrent);
+end;
+
+procedure WriteLine(IOFunctions: TIOFunctions; Handle: TImagingHandle;
+ const Line: AnsiString; const LineEnding: AnsiString);
+var
+ ToWrite: AnsiString;
+begin
+ ToWrite := Line + LineEnding;
+ IOFunctions.Write(Handle, @ToWrite[1], Length(ToWrite));
+end;
+
initialization
- OriginalFileIO.OpenRead := FileOpenRead;
- OriginalFileIO.OpenWrite := FileOpenWrite;
+ OriginalFileIO.Open := FileOpen;
OriginalFileIO.Close := FileClose;
OriginalFileIO.Eof := FileEof;
OriginalFileIO.Seek := FileSeek;
OriginalFileIO.Read := FileRead;
OriginalFileIO.Write := FileWrite;
- StreamIO.OpenRead := StreamOpenRead;
- StreamIO.OpenWrite := StreamOpenWrite;
+ StreamIO.Open := StreamOpen;
StreamIO.Close := StreamClose;
StreamIO.Eof := StreamEof;
StreamIO.Seek := StreamSeek;
StreamIO.Read := StreamRead;
StreamIO.Write := StreamWrite;
- MemoryIO.OpenRead := MemoryOpenRead;
- MemoryIO.OpenWrite := MemoryOpenWrite;
+ MemoryIO.Open := MemoryOpen;
MemoryIO.Close := MemoryClose;
MemoryIO.Eof := MemoryEof;
MemoryIO.Seek := MemorySeek;
-- TODOS ----------------------------------------------------
- nothing now
+ -- 0.77.1 ---------------------------------------------------
+ - Updated IO Open functions according to changes in ImagingTypes.
+ - Added ReadLine and WriteLine functions.
+
-- 0.23 Changes/Bug Fixes -----------------------------------
- Added merge between buffered read-only and write-only file
stream adapters - TIFF saving needed both reading and writing.