home *** CD-ROM | disk | FTP | other *** search
- unit GS_DB_FL;
-
- { GS_DB_FL Copyright (c) Richard F. Griffin
-
- 8 January 1990
-
- 102 Molded Stone Pl
- Warner Robins, GA 31088
-
- -------------------------------------------------------------
- This unit handles the objects for all dBase III fields,
- including memo (.DBT) fields.
-
- }
-
- interface
- uses GS_dBase, printer;
-
- const
- GS_dBase_MaxMemoBytes = 16384;
- GS_dBase_MaxMemoRec = 512;
-
-
- type
- GS_dBase_FldPtr = ^ GS_dBase_Field;
-
- GS_dBase_FL = object
- Loc_Field : GS_dBase_FldPtr;
- Loc_Record : GS_dBase_dRec;
- OffSet : Integer;
- procedure Init(LF, LR : pointer);
- function FieldName : string;
- function FieldSize : integer;
- function FieldType : char;
- end;
-
- GS_dBase_FL_C = object(GS_dBase_FL)
- function GetField : string;
- procedure PutField(Arg : string);
- end;
-
- GS_dBase_FL_I = object(GS_dBase_FL)
- function GetField : longint;
- procedure PutField(Arg : longint);
- end;
-
- GS_dBase_FL_R = object(GS_dBase_FL)
- function GetField : real;
- procedure PutField(Arg : real);
- function Decimals : integer;
- end;
-
- GS_dBase_FL_D = object(GS_dBase_FL)
- function GetField : string;
- procedure PutField(Arg : string);
- end;
-
- GS_dBase_FL_L = object(GS_dBase_FL)
- function GetField : boolean;
- procedure PutField(Arg : boolean);
- end;
-
- GS_dBase_dMemo = ^GS_dBase_MemoRecord;
- GS_dBase_MemoRecord = array [0..GS_dBase_MaxMemoBytes] of byte;
-
- GS_dBase_FL_M = object(GS_dBase_FL)
- File_ptr : ^file;
- dbtError : integer;
- dbtOK : boolean;
- Memo_Store : GS_dBase_MemoRecord;
- Memo_Width : integer;
- Memo_Lines : integer;
- function GetField : string;
- function GetMemo(linenum : integer) : string;
- procedure Init(LF, LR : pointer);
- { procedure PutField;}
- end;
-
- implementation
-
- procedure GS_dBase_FL.Init(LF, LR : pointer);
- begin
- Loc_Field := LF;
- Loc_Record := LR;
- end;
-
- procedure GS_dBase_FL_M.Init(LF, LR : pointer);
- begin
- Memo_Width := 50;
- Memo_Lines := 0;
- GS_dBase_FL.Init(LF, LR);
- end;
-
-
- function GS_dBase_FL.FieldName : string;
- var
- i,j : integer;
- k : byte;
- data : string[32];
- begin
- k := 0;
- j := 11;
- move(Loc_Field^.FieldName, data[1], j);
- for i := 1 to j do
- if data[i] <> #0 then k := i;
- data[0] := char(k);
- FieldName := data;
- end;
-
- function GS_dBase_FL.FieldType : char;
- begin
- FieldType := Loc_Field^.FieldType;
- end;
-
- function GS_dBase_FL.FieldSize : integer;
- begin
- FieldSize := Loc_Field^.FieldLen;
- end;
-
-
-
- function GS_dBase_FL_C.GetField : string;
- var
- i,j : integer;
- data : string[255];
- begin
- j := Loc_Field^.FieldLen;
- move(Loc_Record^, data[1], j);
- data[0] := char(j);
- GetField := data;
- end;
-
- function GS_dBase_FL_D.GetField : string;
- var
- i,j : integer;
- k : byte;
- data : string[10];
- begin
- move(Loc_Record^[4], data[1], 2);
- move(Loc_Record^[6], data[4], 2);
- move(Loc_Record^[2], data[7], 2);
- data[3] := '/';
- data[6] := '/';
- data[0] := #8;
- GetField := data;
- end;
-
- function GS_dBase_FL_L.GetField : boolean;
- var
- data : char;
- begin
- data := char(Loc_Record^[0]);
- if data in ['T','t','Y','y'] then GetField := true
- else GetField := false;
- end;
-
- function GS_dBase_FL_I.GetField : longint;
- var
- i,j : integer;
- r : longint;
- data : string[32];
- begin
- j := Loc_Field^.FieldLen;
- move(Loc_Record^, data[1], j);
- data[0] := char(j);
- val(data, r, i);
- GetField := r;
- end;
-
- function GS_dBase_FL_R.GetField : real;
- var
- i,j : integer;
- r : real;
- data : string[32];
- begin
- j := Loc_Field^.FieldLen;
- move(Loc_Record^, data[1], j);
- data[0] := char(j);
- val(data, r, i);
- GetField := r;
- end;
-
- function GS_dBase_FL_R.Decimals : integer;
- begin
- Decimals := Loc_Field^.FieldDec;
- end;
-
-
- Function GS_dBase_FL_M.GetField : string;
- const
- EOFMark : byte = $1A;
-
- var
- cnt,
- lCnt,
- mCnt : longint;
- Result : integer;
- done : boolean;
- i,j : integer;
- loc : longint;
- data : string[32];
- Mem_Block : array [0..512] of byte;
- BEGIN { Get Memo Field }
- GetField := ' memo ';
- j := Loc_Field^.FieldLen;
- move(Loc_Record^, data[1], j);
- data[0] := char(j);
- val(data, loc, i);
- Memo_Lines := 0;
- if (loc = 0) or (i <> 0) then
- begin
- Memo_Store[0] := EOFMark;
- exit;
- end;
- done := false;
- cnt := 0;
- lCnt := 0;
- {$I-} Seek(File_ptr^,loc); {$I+}
- dbtError := IOResult;
- dbtOK := (dbtError = 0);
- IF dbtError = 0 THEN
- BEGIN
- while not done do
- begin
- {$I-} BlockRead(File_ptr^,Mem_Block,1, Result); {$I+}
- dbtError := IOResult;
- dbtOK := (dbtError = 0);
- if not dbtOK then exit;
- mCnt := 0;
- while (mCnt < 512) and (done = false) do
- begin
- if lCnt > Memo_Width then
- begin
- i := cnt;
- dec(cnt);
- if (Mem_Block[mCnt] <> $20) and
- (Mem_Block[mCnt] <> $2D) then
- while (Memo_Store[cnt] <> $20) and
- (Memo_Store[cnt] <> $2D) and
- (lCnt > 0) do
- begin
- dec(cnt);
- dec(lCnt);
- end;
- inc(cnt);
- if (lCnt = 0) or (cnt > i) then cnt := i;
- if cnt <> i then
- for j := i downto cnt do Memo_Store[j+1] := Memo_Store[j];
- Memo_Store[cnt] := $8A;
- inc(i);
- lCnt := i - cnt;
- cnt := i;
- inc(Memo_Lines);
- end;
- case Mem_Block[mCnt] of
- $1A : done := true;
- $8D,
- $0A : begin
- end;
- $0D : begin
- if (cnt > 0) and
- (Memo_Store[cnt-1] = $8A) then dec(cnt);
- Memo_Store[cnt] := $0A;
- inc(cnt);
- lCnt := 0;
- inc(Memo_Lines);
- end;
- $20 : begin
- if (cnt = 0) or
- (Memo_Store[cnt-1] <> $8A) then
- begin
- Memo_Store[cnt] := Mem_Block[mCnt];
- inc(cnt);
- inc(lCnt);
- end;
- end;
- else
- begin
- Memo_Store[cnt] := Mem_Block[mCnt];
- inc(cnt);
- inc(lCnt);
- end;
- end;
- inc(mCnt);
- end;
- END;
- if cnt > 0 then
- if (Memo_Store[cnt-1] <> $0A) and
- (Memo_Store[cnt-1] <> $8A) then inc(Memo_Lines);
- Memo_Store[cnt] := EOFMark;
- end;
- dbtOK := (dbtError = 0);
- END; { Get Memo Field }
-
- procedure GS_dBase_FL_C.PutField(Arg : string);
- var
- i,j : integer;
- begin
- j := Loc_Field^.FieldLen;
- FillChar(Loc_Record^, j, ' ');
- i := length(Arg);
- Move(Arg[1], Loc_Record^, i);
- end;
-
- procedure GS_dBase_FL_D.PutField(Arg : string);
- var
- i,j : integer;
- valu : string[2];
- begin
- j := Loc_Field^.FieldLen;
- FillChar(Loc_Record^, j, ' ');
- Move(Arg[1], Loc_Record^[4], 2);
- Move(Arg[4], Loc_Record^[6], 2);
- Move(Arg[7], Loc_Record^[2], 2);
- valu := '19';
- Move(valu[1], Loc_Record^, 2);
- end;
-
- procedure GS_dBase_FL_L.PutField(Arg : Boolean);
- var
- valu : string[1];
- begin
- if Arg then valu := 'T' else valu := 'F';
- Move(valu[1], Loc_Record^, 1);
- end;
-
- procedure GS_dBase_FL_I.PutField(Arg : LongInt);
- var
- i,j : integer;
- valu : string[64];
- begin
- j := Loc_Field^.FieldLen;
- Str(Arg:j, valu);
- Move(valu[1], Loc_Record^, j);
- end;
-
- procedure GS_dBase_FL_R.PutField(Arg : real);
- var
- i,j : integer;
- valu : string[64];
- begin
- j := Loc_Field^.FieldLen;
- Str(Arg:j:Decimals, valu);
- Move(valu[1], Loc_Record^, j);
- end;
-
-
- function GS_dBase_FL_M.GetMemo(linenum : integer) : string;
- var
- P_Line : string[255];
- mCnt : longint;
- Cnt,lcnt,
- i, j, k, l : integer;
- begin
- cnt := 0;
- lCnt := 1;
- P_Line := '';
- while (lcnt <> linenum) and (memo_store[cnt] <> $1A) do
- begin
- if (Memo_Store[cnt] = $0A) or (Memo_Store[cnt] = $8A) then inc(lcnt);
- if (memo_store[cnt] <> $1A) then inc(cnt);
- end;
- while (memo_store[cnt] <> $1A) and
- (Memo_Store[cnt] <> $0A) and
- (Memo_Store[cnt] <> $8A) do
- begin
- P_Line := P_Line + chr(Memo_Store[cnt]);
- inc(cnt);
- end;
- GetMemo := P_Line;
- end;
-
- end.