home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Pascal / Source□ / Talk Source / Talkd ƒ / Tables.p < prev    next >
Encoding:
Text File  |  1992-04-20  |  4.7 KB  |  219 lines  |  [TEXT/PJMM]

  1. unit Tables;
  2.  
  3. { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
  4.  
  5. interface
  6.  
  7.     uses
  8.         MyLists, TalkdTypes;
  9.  
  10.     procedure InitTables;
  11.     procedure FinishTables;
  12.     function NewID: longInt;
  13.     function FindIndexedAnnounce (index: integer): ctlMsgPtr;
  14.     function FindMatch (var request: ctlMsg): ctlMsgPtr;
  15.     function FindRequest (var request: ctlMsg): ctlMsgPtr;
  16.     function InsertTable (var request: ctlMsg): answers;
  17.     function DeleteInvite (id_num: longInt): answers;
  18.     procedure DumpTable;
  19.     procedure DumpRequest (r: ctlMsg);
  20.     procedure DumpAddr (a: osockaddr);
  21.  
  22. implementation
  23.  
  24.     type
  25.         entryRecord = record
  26.                 request: ctlMsg;
  27.                 time: longInt;
  28.             end;
  29.         entryPtr = ^entryRecord;
  30.  
  31.     var
  32.         table: listHead;
  33.         currentID: longInt;
  34.  
  35.     procedure InitTables;
  36.     begin
  37.         CreateList(table);
  38.         currentID := 0;
  39.     end;
  40.  
  41.     procedure FinishTables;
  42.         var
  43.             item: listItem;
  44.             ret: entryPtr;
  45.     begin
  46.         ReturnHead(table, item);
  47.         while not IsTail(item) do begin
  48.             DeleteItem(item, ret);
  49.             DisposPtr(ptr(ret));
  50.         end;
  51.         DestroyList(table, false);
  52.     end;
  53.  
  54.     function NewID: longInt;
  55.     begin
  56.         currentID := currentID + 1;
  57.         NewID := currentID;
  58.     end;
  59.  
  60.     procedure ZotOldMessages;
  61.         var
  62.             curtime: longInt;
  63.             item: listItem;
  64.             ret: entryPtr;
  65.     begin
  66.         GetDateTime(curtime);
  67.         ReturnHead(table, item);
  68.         while not IsTail(item) do begin
  69.             Fetch(item, ret);
  70.             if curtime - ret^.time > MAX_LIFE then
  71.                 DeleteItem(item, ret)
  72.             else
  73.                 MoveToNext(item);
  74.         end;
  75.     end;
  76.  
  77.     function FindIndexedAnnounce (index: integer): ctlMsgPtr;
  78.         var
  79.             item: listItem;
  80.             ret: entryPtr;
  81.     begin
  82.         if index = 1 then
  83.             ZotOldMessages; { that way we don't muck up the order quite as much }
  84.         ReturnHead(table, item);
  85.         while not IsTail(item) do begin
  86.             Fetch(item, ret);
  87.             if ret^.request.typ = CT_announce then begin
  88.                 if index = 1 then begin
  89.                     FindIndexedAnnounce := @ret^.request;
  90.                     exit(FindIndexedAnnounce);
  91.                 end;
  92.                 index := index - 1;
  93.             end;
  94.             MoveToNext(item);
  95.         end;
  96.         FindIndexedAnnounce := nil;
  97.     end;
  98.  
  99.     function UpCase (ch: char): char;
  100.     begin
  101.         if ('a' <= ch) and (ch <= 'z') then
  102.             ch := chr(ord(ch) - $20);
  103.         UpCase := ch;
  104.     end;
  105.  
  106.     function CEqualStr (s1, s2: userStr): boolean;
  107.         var
  108.             i: integer;
  109.     begin
  110.         i := 1;
  111.         while (i <= name_size) & (UpCase(s1[i]) = UpCase(s2[i])) & (s1[i] <> chr(0)) & (s2[i] <> chr(0)) do
  112.             i := i + 1;
  113.         CEqualStr := (i > name_size) | (UpCase(s1[i]) = UpCase(s2[i]));
  114.     end;
  115.  
  116.     function FindEntry (typ: ctlTypes; l_name, r_name: userStr; touch: boolean): ctlMsgPtr;
  117.         var
  118.             item: listItem;
  119.             ret: entryPtr;
  120.     begin
  121.         ZotOldMessages;
  122.         ReturnHead(table, item);
  123.         while not IsTail(item) do begin
  124.             Fetch(item, ret);
  125.             if (ret^.request.typ = typ) & CEqualStr(l_name, ret^.request.l_name) & CEqualStr(r_name, ret^.request.r_name) then begin
  126.                 FindEntry := @ret^.request;
  127.                 if touch then
  128.                     GetDateTime(ret^.time);
  129.                 exit(FindEntry);
  130.             end;
  131.             MoveToNext(item);
  132.         end;
  133.         FindEntry := nil;
  134.     end;
  135.  
  136.     function FindMatch (var request: ctlMsg): ctlMsgPtr;
  137.     begin
  138.         FindMatch := FindEntry(CT_leave_invite, request.r_name, request.l_name, false);
  139.     end;
  140.  
  141.     function FindRequest (var request: ctlMsg): ctlMsgPtr;
  142.     begin
  143.         FindRequest := FindEntry(request.typ, request.l_name, request.r_name, true);
  144.     end;
  145.  
  146.     function InsertTable (var request: ctlMsg): answers;
  147.         var
  148.             item, temp: listItem;
  149.             ret: entryPtr;
  150.     begin
  151.         request.id_num := NewID;
  152.         ret := entryPtr(NewPtr(SizeOf(entryRecord)));
  153.         if ret <> nil then begin
  154.             GetDateTime(ret^.time);
  155.             ret^.request := request;
  156.             AddTail(table, ret);
  157.             InsertTable := A_success;
  158.         end
  159.         else
  160.             InsertTable := A_failed;
  161.     end;
  162.  
  163.     function DeleteInvite (id_num: longInt): answers;
  164.         var
  165.             item: listItem;
  166.             ret: entryPtr;
  167.     begin
  168.         ReturnHead(table, item);
  169.         while not IsTail(item) do begin
  170.             Fetch(item, ret);
  171.             if ret^.request.id_num = id_num then begin
  172.                 DeleteItem(item, ret);
  173.                 DisposPtr(ptr(ret));
  174.                 DeleteInvite := A_success;
  175.                 exit(DeleteInvite);
  176.             end;
  177.             MoveToNext(item);
  178.         end;
  179.         DeleteInvite := A_not_here;
  180.     end;
  181.  
  182.     procedure DumpAddr (a: osockaddr);
  183.     begin
  184.         with a do begin
  185.             writeln('(', family : 1, ':', pointer(ip), ' ', port : 1, ')');
  186.         end;
  187.     end;
  188.  
  189.     procedure DumpRequest (r: ctlMsg);
  190.     begin
  191.         with r do begin
  192.             writeln('vers=', vers : 1, ', typ=', typ, ', answer=', answer, ', id_num=', id_num : 1);
  193.             write('addr=');
  194.             DumpAddr(addr);
  195.             write('ctl_addr=');
  196.             DumpAddr(ctl_addr);
  197.             writeln('l_name=', l_name, ', r_name=', r_name, ', r_tty=', r_tty);
  198.         end;
  199.     end;
  200.  
  201.     procedure DumpTable;
  202.         var
  203.             item: listItem;
  204.             ret: entryPtr;
  205.             t: longInt;
  206.     begin
  207.         ReturnHead(table, item);
  208.         GetDateTime(t);
  209.         writeln('Table dump at time ', t);
  210.         while not IsTail(item) do begin
  211.             Fetch(item, ret);
  212.             writeln('Entry ', ret, 'at time ', ret^.time);
  213.             DumpRequest(ret^.request);
  214.             MoveToNext(item);
  215.         end;
  216.         writeln;
  217.     end;
  218.  
  219. end.