home *** CD-ROM | disk | FTP | other *** search
- program MergeHashFiles(HashFile, NewHashFile, input, output);
-
- const
- maxwd = 20;
- hashsize = 2003;
- blank = ' ';
-
- type
- word = packed array[1..maxwd] of char;
- reference = record
- wd: word;
- pg: integer
- end;
- hashentry = 1..hashsize;
-
- var
- HashFile,
- NewHashFile: text;
- blankword: word;
- i: integer;
-
- procedure UpdateHashFile;
- {reads in old hash table, inserts file of new entries; writes out to HashFile}
- {Updated version, uses hash tables of reference (not word) and hash files of
- type text (not word).}
- var
- hash: array[hashentry] of reference;
- x: hashentry;
- NewFile,
- w: word;
-
- function HashAddress(w: word): hashentry;
- {calculates the location in hash table of word w, or, if not there,
- returns pointing to the blank word where w should go}
-
- var
- x, {calculated location}
- inc: integer; {increment for open addressing}
- begin {function HashAddress}
- x := abs(ord(w[1])*ord(w[2])+ord(w[4])+ord(w[6])) mod hashsize + 1;
- {Hash function assumes long word length. For short word machines
- we must ensure that the result is non-negative, and worry about overflow.}
-
- if (hash[x].wd <> w) and (hash[x].wd <> blankword) then
- begin
- inc := (abs(ord(w[3])-95) mod 29);
- {A key dependent increment is used to avoid clustering.}
- repeat
- inc := inc + 1;
- if inc > hashsize then
- writeln(w,' causes hash table to become full, infinite loop.');
- x := x + inc;
- if x > hashsize then x := x - hashsize;
- until (w = hash[x].wd) or (blankword = hash[x].wd)
- end;
- HashAddress := x
- end; {function HashAddress}
-
-
- begin {procedure UpdateHashFile}
- reset(HashFile);
- if eof(HashFile) then {Error handler}
- for x := 1 to hashsize do {HashFile is empty; create new table.}
- begin
- hash[x].wd := blankword;
- hash[x].pg := 0
- end
- else
- for x := 1 to hashsize do
- begin
- read(HashFile, hash[x].pg);
- while (HashFile^ = ' ') and not eoln(HashFile) do
- get(HashFile);
- readln(HashFile, hash[x].wd)
- end;
-
- reset(NewHashFile);
- while not eof(NewHashFile) do
- begin
- readln(NewHashFile, w);
- hash[HashAddress(w)].wd := w
- {An identical hash function as used in phase 1 will be used.
- Overflow is a possibility.}
- end;
-
- close(HashFile);
- { In some system it may be necessary to close file HashFile at this point.}
-
- write('File name for updated hashfile?');
- readln(NewFile);
- open(HashFile, NewFile, new);
- rewrite(HashFile);
-
- for x := 1 to hashsize do
- with hash[x] do
- begin
- write(HashFile, pg:4, ' ');
- if wd <> blankword then
- write(HashFile, wd);
- writeln(HashFile)
- end
- end; {procedure UpdateHashFile}
-
- begin {main program MergeHashFiles}
- for i := 1 to maxwd do
- blankword[i] := blank;
- UpdateHashFile;
- end. {main program MergeHashFiles}
-