home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / turbo55 / install / oopdemos.arc / OBJECTS.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-02  |  9KB  |  459 lines

  1.  
  2. { Turbo Objects }
  3. { Copyright (c) 1989 by Borland International, Inc. }
  4.  
  5. unit Objects;
  6. { Turbo Pascal 5.5 object-oriented example.
  7.   This unit defines some basic object types.
  8.   Refer to OOPDEMOS.DOC for an overview of this unit.
  9. }
  10.  
  11. {$S-}
  12.  
  13. interface
  14.  
  15. const
  16.  
  17. { Stream access modes }
  18.  
  19.   SCreate    = $3C00;           { Create new file }
  20.   SOpenRead  = $3D00;           { Read access only }
  21.   SOpenWrite = $3D01;           { Write access only }
  22.   SOpen      = $3D02;           { Read and write access }
  23.  
  24. { SetPos positioning modes }
  25.  
  26.   PosAbs = 0;                   { Relative to beginning }
  27.   PosCur = 1;                   { Relative to current position }
  28.   PosEnd = 2;                   { Relative to end }
  29.  
  30. type
  31.  
  32. { General conversion types }
  33.  
  34.   WordRec = record
  35.     Lo, Hi: Byte;
  36.   end;
  37.  
  38.   LongRec = record
  39.     Lo, Hi: Word;
  40.   end;
  41.  
  42.   PtrRec = record
  43.     Ofs, Seg: Word;
  44.   end;
  45.  
  46. { Abstract base object type }
  47.  
  48.   BasePtr = ^Base;
  49.   Base = object
  50.     destructor Done; virtual;
  51.   end;
  52.  
  53. { Stream type list }
  54.  
  55.   STypeListPtr = ^STypeList;
  56.   STypeList = array[1..256] of Word;
  57.  
  58. { Stream I/O procedure record }
  59.  
  60.   SProc = object
  61.     StoreProc: Pointer;
  62.     LoadProc: Pointer;
  63.   end;
  64.  
  65. { Stream I/O procedure list }
  66.  
  67.   SProcListPtr = ^SProcList;
  68.   SProcList = array[1..256] of SProc;
  69.  
  70. { Abstract stream object type }
  71.  
  72.   StreamPtr = ^Stream;
  73.   Stream = object(Base)
  74.     TypeCount: Word;
  75.     TypeList: STypeListPtr;
  76.     ProcList: SProcListPtr;
  77.     Status: Integer;
  78.     constructor Init;
  79.     destructor Done; virtual;
  80.     procedure Error(Code: Integer); virtual;
  81.     procedure Flush; virtual;
  82.     function GetPos: Longint; virtual;
  83.     procedure Read(var Buf; Count: Word); virtual;
  84.     procedure RegisterTypes; virtual;
  85.     procedure SetPos(Pos: Longint; Mode: Byte); virtual;
  86.     procedure Truncate; virtual;
  87.     procedure Write(var Buf; Count: Word); virtual;
  88.     function Get: BasePtr;
  89.     function GetSize: Longint;
  90.     procedure Put(B: BasePtr);
  91.     procedure Register(TypePtr, StorePtr, LoadPtr: Pointer);
  92.     procedure Seek(Pos: Longint);
  93.   end;
  94.  
  95. { DOS file name string }
  96.  
  97.   FNameStr = string[79];
  98.  
  99. { Unbuffered DOS stream }
  100.  
  101.   DosStreamPtr = ^DosStream;
  102.   DosStream = object(Stream)
  103.     Handle: Word;
  104.     constructor Init(FileName: FNameStr; Mode: Word);
  105.     destructor Done; virtual;
  106.     function GetPos: Longint; virtual;
  107.     procedure Read(var Buf; Count: Word); virtual;
  108.     procedure SetPos(Pos: Longint; Mode: Byte); virtual;
  109.     procedure Truncate; virtual;
  110.     procedure Write(var Buf; Count: Word); virtual;
  111.     procedure Close;
  112.     procedure Open(var Name; Mode: Word);
  113.   end;
  114.  
  115. { Buffered DOS stream }
  116.  
  117.   BufStreamPtr = ^BufStream;
  118.   BufStream = object(DosStream)
  119.     Buffer: Pointer;
  120.     BufSize: Word;
  121.     BufPtr: Word;
  122.     BufEnd: Word;
  123.     constructor Init(FileName: FNameStr; Mode, Size: Word);
  124.     destructor Done; virtual;
  125.     procedure Flush; virtual;
  126.     function GetPos: Longint; virtual;
  127.     procedure Read(var Buf; Count: Word); virtual;
  128.     procedure Write(var Buf; Count: Word); virtual;
  129.   end;
  130.  
  131. { Abstract linked list node type }
  132.  
  133.   NodePtr = ^Node;
  134.   Node = object(Base)
  135.     Next: NodePtr;
  136.     function Prev: NodePtr;
  137.   end;
  138.  
  139. { Linked list type }
  140.  
  141.   ListPtr = ^List;
  142.   List = object
  143.     Last: NodePtr;
  144.     procedure Append(N: NodePtr);
  145.     procedure Clear;
  146.     procedure Delete;
  147.     function Empty: Boolean;
  148.     function First: NodePtr;
  149.     procedure Insert(N: NodePtr);
  150.     procedure Load(var S: Stream);
  151.     function Next(N: NodePtr): NodePtr;
  152.     function Prev(N: NodePtr): NodePtr;
  153.     procedure Remove(N: NodePtr);
  154.     procedure Store(var S: Stream);
  155.   end;
  156.  
  157. { Abstract notification procedure }
  158.  
  159. procedure Abstract;
  160.  
  161. implementation
  162.  
  163. {$L STREAM}    { Stream externals }
  164. {$L DOSSTM}    { DosStream externals }
  165. {$L BUFSTM}    { BufStream externals }
  166.  
  167. procedure StreamError; external {STREAM};
  168.  
  169. { Base }
  170.  
  171. destructor Base.Done;
  172. begin
  173. end;
  174.  
  175. { Stream }
  176.  
  177. constructor Stream.Init;
  178. begin
  179.   TypeCount := 0;
  180.   TypeList := nil;
  181.   ProcList := nil;
  182.   Status := 0;
  183.   RegisterTypes;
  184.   GetMem(TypeList, TypeCount * SizeOf(Word));
  185.   if TypeList = nil then Fail;
  186.   GetMem(ProcList, TypeCount * SizeOf(SProc));
  187.   if ProcList = nil then
  188.   begin
  189.     FreeMem(TypeList, TypeCount * SizeOf(Word));
  190.     Fail;
  191.   end;
  192.   TypeCount := 0;
  193.   RegisterTypes;
  194. end;
  195.  
  196. destructor Stream.Done;
  197. begin
  198.   FreeMem(ProcList, TypeCount * SizeOf(SProc));
  199.   FreeMem(TypeList, TypeCount * SizeOf(Word));
  200. end;
  201.  
  202. procedure Stream.Error(Code: Integer);
  203. begin
  204.   Status := Code;
  205. end;
  206.  
  207. procedure Stream.Flush;
  208. begin
  209. end;
  210.  
  211. function Stream.GetPos: Longint;
  212. begin
  213.   Abstract;
  214. end;
  215.  
  216. procedure Stream.Read(var Buf; Count: Word);
  217. begin
  218.   Abstract;
  219. end;
  220.  
  221. procedure Stream.RegisterTypes;
  222. begin
  223. end;
  224.  
  225. procedure Stream.SetPos(Pos: Longint; Mode: Byte);
  226. begin
  227.   Abstract;
  228. end;
  229.  
  230. procedure Stream.Truncate;
  231. begin
  232.   Abstract;
  233. end;
  234.  
  235. procedure Stream.Write(var Buf; Count: Word);
  236. begin
  237.   Abstract;
  238. end;
  239.  
  240. function Stream.Get: BasePtr;
  241. external {STREAM};
  242.  
  243. function Stream.GetSize: Longint;
  244. var
  245.   P: Longint;
  246. begin
  247.   P := GetPos;
  248.   SetPos(0, PosEnd);
  249.   GetSize := GetPos;
  250.   SetPos(P, PosAbs);
  251. end;
  252.  
  253. procedure Stream.Put(B: BasePtr);
  254. external {STREAM};
  255.  
  256. procedure Stream.Register(TypePtr, StorePtr, LoadPtr: Pointer);
  257. begin
  258.   Inc(TypeCount);
  259.   if TypeList <> nil then
  260.   begin
  261.     TypeList^[TypeCount] := PtrRec(TypePtr).Ofs;
  262.     with ProcList^[TypeCount] do
  263.     begin
  264.       StoreProc := StorePtr;
  265.       LoadProc := LoadPtr;
  266.     end;
  267.   end;
  268. end;
  269.  
  270. procedure Stream.Seek(Pos: Longint);
  271. begin
  272.   SetPos(Pos, PosAbs);
  273. end;
  274.  
  275. { DosStream }
  276.  
  277. constructor DosStream.Init(FileName: FNameStr; Mode: Word);
  278. var
  279.   L: Integer;
  280. begin
  281.   if not Stream.Init then Fail;
  282.   L := Length(FileName);
  283.   Move(FileName[1], FileName[0], L);
  284.   FileName[L] := #0;
  285.   Open(FileName, Mode);
  286. end;
  287.  
  288. destructor DosStream.Done;
  289. begin
  290.   Close;
  291.   Stream.Done;
  292. end;
  293.  
  294. function DosStream.GetPos: Longint;
  295. external {DOSSTM};
  296.  
  297. procedure DosStream.Read(var Buf; Count: Word);
  298. external {DOSSTM};
  299.  
  300. procedure DosStream.SetPos(Pos: Longint; Mode: Byte);
  301. external {DOSSTM};
  302.  
  303. procedure DosStream.Truncate;
  304. external {DOSSTM};
  305.  
  306. procedure DosStream.Write(var Buf; Count: Word);
  307. external {DOSSTM};
  308.  
  309. procedure DosStream.Close;
  310. external {DOSSTM};
  311.  
  312. procedure DosStream.Open(var Name; Mode: Word);
  313. external {DOSSTM};
  314.  
  315. { BufStream }
  316.  
  317. constructor BufStream.Init(FileName: FNameStr; Mode, Size: Word);
  318. begin
  319.   GetMem(Buffer, Size);
  320.   if Buffer = nil then Fail;
  321.   if not DosStream.Init(FileName, Mode) then
  322.   begin
  323.     FreeMem(Buffer, Size);
  324.     Fail;
  325.   end;
  326.   BufSize := Size;
  327.   BufPtr := 0;
  328.   BufEnd := 0;
  329. end;
  330.  
  331. destructor BufStream.Done;
  332. begin
  333.   DosStream.Done;
  334.   FreeMem(Buffer, BufSize);
  335. end;
  336.  
  337. procedure BufStream.Flush;
  338. external {BUFSTM};
  339.  
  340. function BufStream.GetPos: Longint;
  341. external {BUFSTM};
  342.  
  343. procedure BufStream.Read(var Buf; Count: Word);
  344. external {BUFSTM};
  345.  
  346. procedure BufStream.Write(var Buf; Count: Word);
  347. external {BUFSTM};
  348.  
  349. { Node }
  350.  
  351. function Node.Prev: NodePtr;
  352. var
  353.   P: NodePtr;
  354. begin
  355.   P := @Self;
  356.   while P^.Next <> @Self do P := P^.Next;
  357.   Prev := P;
  358. end;
  359.  
  360. { List }
  361.  
  362. procedure List.Append(N: NodePtr);
  363. begin
  364.   Insert(N);
  365.   Last := N;
  366. end;
  367.  
  368. procedure List.Clear;
  369. begin
  370.   Last := nil;
  371. end;
  372.  
  373. procedure List.Delete;
  374. var
  375.   P: NodePtr;
  376. begin
  377.   while not Empty do
  378.   begin
  379.     P := First;
  380.     Remove(P);
  381.     Dispose(P, Done);
  382.   end;
  383. end;
  384.  
  385. function List.Empty: Boolean;
  386. begin
  387.   Empty := Last = nil;
  388. end;
  389.  
  390. function List.First: NodePtr;
  391. begin
  392.   if Last = nil then First := nil else First := Last^.Next;
  393. end;
  394.  
  395. procedure List.Insert(N: NodePtr);
  396. begin
  397.   if Last = nil then Last := N else N^.Next := Last^.Next;
  398.   Last^.Next := N;
  399. end;
  400.  
  401. procedure List.Load(var S: Stream);
  402. var
  403.   P: NodePtr;
  404. begin
  405.   Clear;
  406.   P := NodePtr(S.Get);
  407.   while P <> nil do
  408.   begin
  409.     Append(P);
  410.     P := NodePtr(S.Get);
  411.   end;
  412. end;
  413.  
  414. function List.Next(N: NodePtr): NodePtr;
  415. begin
  416.   if N = Last then Next := nil else Next := N^.Next;
  417. end;
  418.  
  419. function List.Prev(N: NodePtr): NodePtr;
  420. begin
  421.   if N = First then Prev := nil else Prev := N^.Prev;
  422. end;
  423.  
  424. procedure List.Remove(N: NodePtr);
  425. var
  426.   P: NodePtr;
  427. begin
  428.   if Last <> nil then
  429.   begin
  430.     P := Last;
  431.     while (P^.Next <> N) and (P^.Next <> Last) do P := P^.Next;
  432.     if P^.Next = N then
  433.     begin
  434.       P^.Next := N^.Next;
  435.       if Last = N then if P = N then Last := nil else Last := P;
  436.     end;
  437.   end;
  438. end;
  439.  
  440. procedure List.Store(var S: Stream);
  441. var
  442.   P: NodePtr;
  443. begin
  444.   P := First;
  445.   while P <> nil do
  446.   begin
  447.     S.Put(P);
  448.     P := Next(P);
  449.   end;
  450.   S.Put(nil);
  451. end;
  452.  
  453. procedure Abstract;
  454. begin
  455.   RunError(211);
  456. end;
  457.  
  458. end.
  459.