home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / modula2 / 1105 < prev    next >
Encoding:
Internet Message Format  |  1992-09-04  |  7.0 KB

  1. Path: sparky!uunet!mcsun!Germany.EU.net!unidui!flyer!easix!tron.gun.de!g_dotzel
  2. From: g_dotzel@tron.gun.de (Guenter Dotzel)
  3. Newsgroups: comp.lang.modula2
  4. Subject: Oberon-2 random file access w ISO M2 Std
  5. Message-ID: <28V6036D0D@tron.gun.de>
  6. Organization: TRON Public Mailbox, Neurath, Germany
  7. Date: Mon, 31 Aug 92 17:24:00 +0200
  8. Lines: 220
  9.  
  10.  
  11. MODULE TestPos;
  12. (* Oberon-2 test program for random file access using the 
  13.    ISO Modula-2 I/O-Library. 
  14.    This program runs on VAX/VMS using
  15.    ModulaWare's Oberon-2 Compiler V1.0F and 
  16.    ModulaWare's ISO M2 Std Lib implementation written in Modula-2.
  17.  
  18.    (c) 1992 by ModulaWare GmbH, written by Elmar Baumgart 10-Mar-1992,
  19.      27-Mar-1992 (skip multiple blank lines)
  20.  
  21.   - TestPos takes three command line parameters (file names):
  22.     DATA, INSERT and SEARCH
  23.   - If at the start of the program the hash table file DATA does not
  24.     exist, a new file is created and initialized.
  25.     Otherwise, the existing file called DATA is used (random read/write
  26.     access mode).
  27.   - The program reads two files called INSERT and SEARCH. Both files
  28.     may have any text file format.
  29.   - inserts token strings from file INSERT into a hash-table file DATA
  30.   - searches token strings from file SEARCH in file DATA
  31. *)
  32. IMPORT ProgramArgs, STextIO, SWholeIO, IOResult, TextIO, SeqFile, RawIO, 
  33.   RndFile, CTR, Strings;
  34.  
  35. CONST
  36.   ITEMLENGTH = 40;
  37.   ITEMS = 3877;  (*prime*)   (*creates ITEMS * ITEMLENGTH hash-table on disk*)
  38.   DATA = 0; INSERT = 1; SEARCH = 2;
  39.  
  40. TYPE
  41.   WCproc = PROCEDURE(n: CTR.CARDINAL; w: CTR.CARDINAL);
  42.   WSproc = PROCEDURE(s: ARRAY OF CHAR);
  43.   ItemType = ARRAY ITEMLENGTH OF CHAR;
  44.   fnam = ARRAY 255 OF CHAR;
  45.   Args = ARRAY 3 OF fnam;
  46.  
  47. VAR
  48.   ores: RndFile.OpenResults;
  49.   empty: ItemType;
  50.   i: CTR.INTEGER; wrongArgs: BOOLEAN;
  51.  
  52.   WC: WCproc; WS: WSproc; NL: PROCEDURE;
  53.   data, ins, sea: RndFile.ChanId;
  54.   free: CTR.INTEGER;
  55.   file: Args;
  56.   startPos: RndFile.FilePos;
  57.  
  58. PROCEDURE CalcPos(Key: CTR.CARDINAL): RndFile.FilePos;
  59. BEGIN
  60.   RETURN RndFile.NewPos(data, Key, ITEMLENGTH, startPos);
  61. END CalcPos;
  62.  
  63. PROCEDURE CalcKey(item: ARRAY OF CHAR): CTR.CARDINAL;
  64. VAR len, i, key: CTR.CARDINAL;
  65. BEGIN
  66.   len:= Strings.Length(item);
  67.   key:= 1;
  68.   IF len > 0 THEN
  69.     FOR i:= 0 TO len-1 DO
  70.       key:= (key * (ORD(item[i]) MOD 26 + 1)) MOD ITEMS;
  71.     END;
  72.   END;
  73.   RETURN key;
  74. END CalcKey;
  75.  
  76. PROCEDURE EQUAL(old, new: ARRAY OF CHAR): BOOLEAN;
  77. VAR i: CTR.INTEGER; eq: BOOLEAN; len: CTR.INTEGER;
  78. BEGIN
  79.   i:= 0; eq:= TRUE; len:= Strings.Length(new);
  80.   WHILE (i < len) & eq DO
  81.     eq:= old[i] = new[i]; INC(i);
  82.   END;
  83.   RETURN eq;
  84. END EQUAL;
  85.  
  86. PROCEDURE Insert(item: ARRAY OF CHAR);
  87. VAR Key, offset: CTR.CARDINAL; atPos: ItemType; eq: BOOLEAN;
  88. BEGIN
  89.   IF free > 0 THEN
  90.     Key:= CalcKey(item);
  91.     RndFile.SetPos(data, CalcPos(Key));
  92.     RawIO.Read(data, atPos); offset:= 0; 
  93.     eq:= EQUAL(atPos, item);
  94.     WHILE ~ eq & (atPos[0] # 0X) & (offset < ITEMS) DO
  95.       IF IOResult.ReadResult(data) = IOResult.endOfInput THEN
  96.         RndFile.SetPos(data, startPos);
  97.       END;
  98.       RawIO.Read(data, atPos);
  99.       eq:= EQUAL(atPos, item); INC(offset);
  100.     END;
  101.     IF eq THEN WS('already inserted');
  102.     ELSE
  103.       RndFile.SetPos(data, CalcPos((Key + offset) MOD ITEMS));
  104.       RawIO.Write(data, item);
  105.       WS('        inserted');
  106.       DEC(free);
  107.     END;
  108.     WC(offset, 4); WS(' "'); WS(item); WS('"'); NL;
  109.   ELSE WS('-table full-'); NL;
  110.   END;
  111. END Insert;
  112.  
  113. PROCEDURE Search(item: ARRAY OF CHAR);
  114. VAR Key, offset: CTR.CARDINAL; atPos: ItemType; eq: BOOLEAN;
  115. BEGIN
  116.   Key:= CalcKey(item);
  117.   RndFile.SetPos(data, CalcPos(Key));
  118.   RawIO.Read(data, atPos); offset:= 0; 
  119.   eq:= EQUAL(atPos, item);
  120.   WHILE ~ eq & (atPos[0] # 0X) & (offset < ITEMS) DO 
  121.     IF IOResult.ReadResult(data) = IOResult.endOfInput THEN
  122.       RndFile.SetPos(data, startPos);
  123.     END;
  124.     RawIO.Read(data, atPos);
  125.     eq:= EQUAL(atPos, item); INC(offset);
  126.   END;
  127.   IF offset >= ITEMS THEN eq:= FALSE;
  128.   END;
  129.   IF eq THEN WS('    found');
  130.   ELSE WS('not found');
  131.   END;
  132.   WC(offset, 4); WS(' "'); WS(item); WS('"'); NL;
  133. END Search;
  134.  
  135. PROCEDURE InsertIt;
  136. VAR item: ItemType;
  137. BEGIN
  138.   SeqFile.OpenRead(ins, file[INSERT], RndFile.text, ores);
  139.   IF ores # RndFile.opened THEN WS('failed to open '); WS(file[INSERT]); NL;
  140.   ELSE
  141.     WS('Inserting token strings from file '); WS(file[INSERT]); NL;
  142.     TextIO.ReadToken(ins, item);
  143.     WHILE IOResult.ReadResult(ins) # IOResult.endOfInput DO
  144.       Insert(item);
  145.       TextIO.ReadToken(ins, item);
  146.       WHILE IOResult.ReadResult(ins) = IOResult.endOfLine DO 
  147.         TextIO.SkipLine(ins);
  148.         TextIO.ReadToken(ins, item);
  149.       END;
  150.     END;
  151.     SeqFile.Close(ins);
  152.   END;
  153. END InsertIt;
  154.  
  155. PROCEDURE SearchIt;
  156. VAR item: ItemType;
  157. BEGIN
  158.   SeqFile.OpenRead(sea, file[SEARCH], RndFile.text, ores);
  159.   IF ores # RndFile.opened THEN WS('failed to open '); WS(file[SEARCH]); NL;
  160.   ELSE
  161.     WS('Searching token strings from file '); WS(file[SEARCH]); NL;
  162.     TextIO.ReadToken(sea, item);
  163.     WHILE IOResult.ReadResult(sea) # IOResult.endOfInput DO
  164.       Search(item);
  165.       TextIO.ReadToken(sea, item);
  166.       WHILE IOResult.ReadResult(sea) = IOResult.endOfLine DO 
  167.         TextIO.SkipLine(sea);
  168.         TextIO.ReadToken(sea, item);
  169.       END;
  170.     END;
  171.     SeqFile.Close(sea);
  172.   END;
  173. END SearchIt;
  174.  
  175. PROCEDURE TestIt;
  176. BEGIN
  177.   InsertIt; NL;
  178.   SearchIt;
  179. END TestIt;
  180.  
  181.  
  182. BEGIN
  183.   free:= ITEMS;
  184.   FOR i:= 0 TO ITEMLENGTH-1 DO empty[i]:= 0X;
  185.   END;
  186.   WC:= SWholeIO.WriteCard; WS:= STextIO.WriteString; NL:= STextIO.WriteLn;
  187.   i:= 0;
  188.   WHILE (IOResult.ReadResult(ProgramArgs.ArgChan()) # IOResult.endOfInput) & (i <= SEARCH) DO
  189.     TextIO.ReadToken(ProgramArgs.ArgChan(), file[i]); INC(i);
  190.   END;
  191.  
  192.   IF (IOResult.ReadResult(ProgramArgs.ArgChan()) # IOResult.endOfInput) & (i > SEARCH) THEN
  193.     RndFile.OpenOld(data, file[DATA], 
  194.       RndFile.read + RndFile.write + RndFile.binary, ores);
  195.     IF ores = RndFile.noSuchFile THEN
  196.       RndFile.OpenClean(data, file[DATA], 
  197.         RndFile.read + RndFile.write + RndFile.binary, ores); 
  198.       IF ores = RndFile.opened THEN
  199.         FOR i:= 1 TO ITEMS DO RawIO.Write(data, empty);
  200.         END;
  201.         startPos:= RndFile.StartPos(data);
  202.         TestIt;
  203.         RndFile.Close(data);
  204.       ELSE WS('data file not present, create failed'); NL;
  205.       END;
  206.     ELSIF ores = RndFile.opened THEN
  207.       startPos:= RndFile.StartPos(data);
  208.       i:= 0; RawIO.Read(data, empty);
  209.       WHILE IOResult.ReadResult(data) # IOResult.endOfInput DO
  210.         INC(i); RawIO.Read(data, empty);
  211.         IF empty[0] # 0X THEN DEC(free);
  212.         END;
  213.       END;
  214.       IF i # ITEMS THEN WS(file[DATA]); WS(' is of illegal size'); NL;
  215.       ELSE TestIt; 
  216.       END;
  217.       RndFile.Close(data);
  218.     ELSE WS('data file present, access failed'); NL;
  219.     END;
  220.     WC(free, 1); WS(' entries free in '); WS(file[DATA]); NL;
  221.   ELSE WS('  TESTPOS hash-file insert-file search-file '); NL;
  222.   END;
  223. END TestPos.
  224.  
  225. Guenter Dotzel, ModulaWare GmbH, Wilhelmstr. 17A, D-W 8520 Erlangen/F.R.Germany
  226. Modula-2 & Oberon-2 Compiler Manufactur (VAX/VMS, OS/2 and Unix-Platforms)
  227. Tel. +49 (9131) 208395, Fax +49 (9131) 28205.
  228. E-mail/Internet: 100023.2527@compuserve.com
  229.                  g_dotzel@ame.nbg.sub.org
  230.