PROG7.MOD 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. MODULE prog7;
  2. (* Sorts lines of a file into order, deleting duplicates *)
  3. IMPORT IO, FIO, Lib, Storage, Str;
  4. TYPE
  5. StringType = ARRAY [0..255] OF CHAR;
  6. StringPointerType = POINTER TO StringType;
  7. VAR
  8. p : ARRAY [1..10000] OF StringPointerType;
  9. PROCEDURE Less(i,j:CARDINAL):BOOLEAN;
  10. BEGIN
  11. RETURN Str.Compare(p[i]^, p[j]^) < 0 ;
  12. END Less;
  13. PROCEDURE Swap(i,j:CARDINAL);
  14. VAR tmp:StringPointerType;
  15. BEGIN
  16. tmp := p[i]; p[i] := p[j]; p[j] := tmp;
  17. END Swap;
  18. VAR s: StringType;
  19. len:CARDINAL;
  20. i,n:CARDINAL;
  21. InFile,OutFile:FIO.File;
  22. buffer:ARRAY [1..512+FIO.BufferOverhead] OF BYTE;
  23. BEGIN
  24. (* check parameters *)
  25. IF Lib.ParamCount() <> 2 THEN
  26. IO.WrStr('Try again : prog7 input-file output-file');
  27. IO.WrLn;
  28. HALT;
  29. END;
  30. (* read file in *)
  31. Lib.ParamStr(s, 1); InFile := FIO.Open(s);
  32. FIO.AssignBuffer(InFile, buffer);
  33. n := 0;
  34. LOOP
  35. FIO.RdStr(InFile, s);
  36. IF FIO.EOF THEN
  37. EXIT;
  38. END;
  39. IF n = HIGH(p) THEN
  40. IO.WrStr('Too many lines!');
  41. IO.WrLn;
  42. EXIT;
  43. END;
  44. INC(n);
  45. len := Str.Length(s);
  46. Storage.ALLOCATE(p[n], len + 1);
  47. Lib.Move(ADR(s), ADR(p[n]^), len + 1);
  48. END;
  49. FIO.Close(InFile);
  50. (* sort file in memory *)
  51. Lib.HSort(n, Less, Swap);
  52. (* write file out *)
  53. Lib.ParamStr(s, 2); OutFile := FIO.Create(s);
  54. FIO.AssignBuffer(OutFile, buffer);
  55. FOR i := 1 TO n DO
  56. IF (i = 1) OR (Str.Compare(p[i]^, p[i-1]^) <> 0) THEN
  57. FIO.WrStr(OutFile, p[i]^);
  58. FIO.WrLn(OutFile);
  59. END;
  60. END;
  61. FIO.Close(OutFile);
  62. END prog7.
  63.