SplitV1.mod 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. IMPLEMENTATION MODULE SplitV1;
  2. IMPORT Strings;
  3. FROM InOut IMPORT Write, WriteString, WriteCard, WriteLn;
  4. VAR
  5. j : CARDINAL;
  6. PROCEDURE Ltrim (VAR src : ARRAY OF CHAR; separator : CHAR );
  7. VAR
  8. longueur : CARDINAL;
  9. BEGIN
  10. REPEAT
  11. longueur := LENGTH(src);
  12. IF src[0] = separator THEN
  13. (*PROCEDURE Delete (VAR stringVar: ARRAY OF CHAR; startIndex, numberToDelete:CARDINAL);*)
  14. (* Deletes at most numberToDelete characters from stringVar, starting at position startIndex.*)
  15. Strings.Delete(src,0,1);
  16. END;
  17. UNTIL (src[0] # separator) OR (longueur = 0)
  18. END Ltrim;
  19. PROCEDURE Rtrim ( VAR src : ARRAY OF CHAR ; separator : CHAR );
  20. VAR
  21. longueur : CARDINAL;
  22. BEGIN
  23. longueur := LENGTH(src);
  24. REPEAT
  25. longueur := LENGTH(src);
  26. IF src[longueur - 1] = separator THEN
  27. (*PROCEDURE Delete (VAR stringVar: ARRAY OF CHAR; startIndex, numberToDelete:CARDINAL);*)
  28. (* Deletes at most numberToDelete characters from stringVar, starting at position startIndex.*)
  29. Strings.Delete(src,longueur - 1,1);
  30. END;
  31. longueur := LENGTH(src);
  32. UNTIL (src[longueur - 1] # separator) OR (longueur =0 )
  33. END Rtrim;
  34. PROCEDURE removeDuplicate ( VAR src : ARRAY OF CHAR ; separator : CHAR );
  35. VAR
  36. longueur : CARDINAL;
  37. pos : CARDINAL;
  38. BEGIN
  39. pos := 0;
  40. longueur := LENGTH(src);
  41. LOOP
  42. IF (longueur = 0 ) OR (pos = longueur ) THEN
  43. RETURN
  44. END;
  45. (*Write(src[pos]);Write(" ");*)
  46. IF src[pos] = separator THEN
  47. pos := pos + 1;
  48. WHILE src[pos] = separator DO
  49. Strings.Delete(src,pos,1);
  50. END;
  51. ELSE
  52. INC(pos)
  53. END;
  54. longueur := LENGTH(src);
  55. END; (* end loop*)
  56. END removeDuplicate;
  57. PROCEDURE SplitStr(s : ARRAY OF CHAR; separator : CHAR; VAR out : Structure) ;
  58. (*
  59. There are several cases to take account for :
  60. - standard case : s begin with an element ans end with an element
  61. - s begins with a separator and end with an element
  62. - s begins with a separator and ends with a separators
  63. - there are consecutive separators inside s
  64. - there are consecutive separators at the beginning
  65. - there are consecutive separators at the end
  66. *)
  67. VAR
  68. i : CARDINAL;
  69. indice : CARDINAL;
  70. longueur : CARDINAL;
  71. resultat : ARRAY[0..255] OF CHAR;
  72. deja : BOOLEAN;
  73. c : CHAR;
  74. BEGIN
  75. indice := 0;
  76. (* modes de fonctionnement *)
  77. (* trimMode : BOOLEAN;
  78. allTrimMode : BOOLEAN;
  79. noDupMode : BOOLEAN;
  80. rtrim : BOOLEAN;
  81. ltrim : BOOLEAN;*)
  82. IF trimMode THEN
  83. Rtrim ( s, separator);
  84. Ltrim ( s, separator);
  85. END;
  86. IF ltrim THEN
  87. Ltrim ( s, separator);
  88. END;
  89. IF rtrim THEN
  90. Rtrim ( s, separator);
  91. END;
  92. IF noDupMode THEN
  93. removeDuplicate ( s, separator);
  94. END;
  95. IF allTrimMode THEN
  96. Rtrim ( s, separator);
  97. Ltrim ( s, separator);
  98. removeDuplicate ( s, separator);
  99. END;
  100. longueur := LENGTH(s);
  101. resultat := "";
  102. deja := FALSE;
  103. FOR i := 0 TO longueur -1 DO
  104. c := s[i]; (* the first character of the string s *)
  105. IF c # separator THEN (* the character belongs to an element *)
  106. Strings.Append(Strings.String1(c),resultat);
  107. ELSE
  108. out[indice].element := resultat;
  109. resultat := "";
  110. INC(indice);
  111. END;
  112. out[indice].element := resultat;
  113. END;
  114. FOR i := indice + 1 TO HIGH(out) DO
  115. out[i].pos := MAX(CARDINAL);
  116. END;
  117. END SplitStr;
  118. PROCEDURE InitStructure ( VAR out : Structure);
  119. VAR
  120. i : CARDINAL;
  121. BEGIN
  122. FOR i := 0 TO HIGH(out) DO
  123. out[i].pos := i;
  124. out[i].element := "";
  125. END;
  126. END InitStructure;
  127. BEGIN
  128. trimMode := FALSE;
  129. allTrimMode := FALSE;
  130. noDupMode := FALSE;
  131. ltrim := FALSE;
  132. rtrim := FALSE;
  133. END SplitV1.