home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mod201j.zip / modula2.exe / os2demo / filosoof / queue.mod < prev    next >
Text File  |  1996-01-04  |  2KB  |  79 lines

  1. (********************************************************************
  2.   QUEUE.MOD   
  3.  
  4.   Copyright (c) 1995 by Johan Terryn (CompuServe 100421,3024)
  5. *********************************************************************)
  6.  
  7. IMPLEMENTATION MODULE Queue;
  8. FROM   InOut     IMPORT   WriteString;
  9. FROM   SYSTEM    IMPORT   ADDRESS;
  10. FROM   Storage   IMPORT   ALLOCATE, DEALLOCATE;
  11.  
  12.  
  13.  
  14. CONST queuesize = 100;
  15.       queuemax  = queuesize+1;
  16.  
  17. TYPE queuerange = [0..queuesize];
  18.      queue = POINTER TO RECORD
  19.        space : ARRAY queuerange OF ADDRESS;
  20.        front, rear : queuerange;
  21.      END;
  22.  
  23. PROCEDURE makeempty(VAR q : queue);
  24.  
  25. BEGIN
  26.   IF q = NIL THEN NEW(q) END;
  27.     q^.front := 0;
  28.     q^.rear  := 0;
  29. END makeempty;
  30.  
  31. PROCEDURE empty(q:queue):BOOLEAN;
  32. (* Internal calls to this module fail, external calls work *)
  33. BEGIN
  34.   RETURN q^.front = q^.rear
  35. END empty;
  36.  
  37. PROCEDURE full(q:queue):BOOLEAN;
  38. BEGIN
  39.   RETURN q^.front = (q^.rear+1) MOD queuemax
  40. END full;
  41.  
  42. PROCEDURE insert(VAR q:queue; item :ADDRESS);
  43. BEGIN
  44.   IF NOT full(q) THEN
  45.     q^.rear := (q^.rear+1) MOD queuemax;
  46.     q^.space[q^.rear] := item
  47.   ELSE
  48.     WriteString("Overflow")
  49.   END
  50. END insert;
  51.  
  52. PROCEDURE remove(VAR q :queue; VAR item :ADDRESS);
  53.  
  54. BEGIN
  55.   (* This one fails *)
  56.   IF empty(q) THEN
  57.   (* this one works
  58.   IF q^.front = q^.rear THEN *)
  59.     WriteString("Underflow")
  60.   ELSE
  61.     q^.front :=(q^.front+1) MOD queuemax;
  62.     item := q^.space[q^.front]
  63.   END;
  64. END remove;
  65.  
  66. PROCEDURE define(VAR q :queue);
  67. BEGIN
  68.   q := NIL
  69. END define;
  70.  
  71.  
  72. PROCEDURE destroy(VAR q :queue);
  73. BEGIN
  74.   DISPOSE(q);
  75.   q := NIL;
  76. END destroy;
  77.  
  78. END Queue.
  79.