SVNUtil.Mod 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. MODULE SVNUtil; (** AUTHOR "rstoll"; *)
  2. IMPORT
  3. Files, Strings, MD5,
  4. SVNOutput,
  5. Dates;
  6. TYPE
  7. (* only look for one match *)
  8. FSItemSearch* = OBJECT ( Files.Enumerator ) (** not shareable *)
  9. VAR
  10. adding, found: BOOLEAN;
  11. name0 : Files.FileName;
  12. path, mask : Strings.String;
  13. flags0: SET;
  14. time0, date0, size0 : LONGINT;
  15. PROCEDURE &Init*;
  16. BEGIN
  17. found := FALSE;
  18. adding := FALSE;
  19. NEW ( path, 512 );
  20. NEW ( mask, 512 );
  21. END Init;
  22. PROCEDURE Exists* () : BOOLEAN;
  23. BEGIN
  24. RETURN found;
  25. END Exists;
  26. PROCEDURE FileExists* () : BOOLEAN;
  27. BEGIN
  28. RETURN found & (Files.Old ( mask^ ) # NIL);
  29. END FileExists;
  30. PROCEDURE Open*(m: ARRAY OF CHAR; flags: SET);
  31. BEGIN
  32. (* remove path delimiter at the end *)
  33. IF Strings.EndsWith ( Files.PathDelimiter, m ) THEN
  34. m[Strings.Length(m)-1] := 0X;
  35. END;
  36. COPY ( m, mask^ );
  37. Files.SplitPath ( mask^, path^, name0 );
  38. Strings.Append ( path^, "/*" );
  39. found := FALSE;
  40. adding := TRUE;
  41. Open^ ( path^, flags ); (* since i can't call the internal enumerator.. use the old Open procedure *)
  42. adding := FALSE;
  43. END Open;
  44. PROCEDURE GetEntry*(VAR name: ARRAY OF CHAR; VAR flags: SET; VAR time, date, size: LONGINT): BOOLEAN;
  45. BEGIN
  46. IF found THEN
  47. COPY ( name0, name );
  48. flags := flags0;
  49. time := time0;
  50. date := date0;
  51. size := size0;
  52. END;
  53. RETURN found;
  54. END GetEntry;
  55. (** For internal use only. *)
  56. PROCEDURE PutEntry*(VAR name: ARRAY OF CHAR; flags: SET; time, date, size: LONGINT);
  57. BEGIN
  58. ASSERT(adding);
  59. IF ~found & (name = mask^) THEN
  60. name[0] := name[0];
  61. found := TRUE;
  62. flags := flags0;
  63. time := time0;
  64. date := date0;
  65. size := size0;
  66. END;
  67. END PutEntry;
  68. END FSItemSearch;
  69. PROCEDURE GetChecksum* ( CONST file : ARRAY OF CHAR ) : Strings.String;
  70. CONST
  71. bufSize = 512;
  72. VAR
  73. read, len : LONGINT;
  74. tmp, res : Strings.String;
  75. md5context : MD5.Context;
  76. md5digest : MD5.Digest;
  77. r : Files.Reader;
  78. f : Files.File;
  79. BEGIN
  80. NEW ( tmp, bufSize );
  81. NEW ( res, 35 );
  82. f := Files.Old ( file );
  83. ASSERT ( f # NIL );
  84. Files.OpenReader ( r, f, 0 );
  85. md5context := MD5.New();
  86. read := 0;
  87. LOOP
  88. r.Bytes ( tmp^, read, bufSize, len );
  89. MD5.WriteBytes ( md5context, tmp^, len );
  90. IF len < bufSize THEN EXIT END;
  91. END;
  92. MD5.Close ( md5context, md5digest );
  93. MD5.ToString ( md5digest, res^ );
  94. RETURN res;
  95. END GetChecksum;
  96. PROCEDURE CheckChecksum* ( CONST file, checksum : ARRAY OF CHAR ) : BOOLEAN;
  97. VAR
  98. s : Strings.String;
  99. BEGIN
  100. s := GetChecksum ( file );
  101. RETURN s^ = checksum;
  102. END CheckChecksum;
  103. PROCEDURE GetUUID* () : Strings.String;
  104. VAR
  105. md5context : MD5.Context;
  106. md5digest : MD5.Digest;
  107. tmp : Strings.String;
  108. BEGIN
  109. NEW ( tmp, 40 );
  110. md5context := MD5.New();
  111. Strings.FormatDateTime ( SVNOutput.DateFormat, Dates.Now(), tmp^ );
  112. MD5.WriteBytes ( md5context, tmp^, Strings.Length ( tmp^ ) );
  113. MD5.Close ( md5context, md5digest );
  114. MD5.ToString ( md5digest, tmp^ );
  115. RETURN tmp;
  116. END GetUUID;
  117. PROCEDURE FileExists* ( CONST file : ARRAY OF CHAR ) : BOOLEAN;
  118. BEGIN
  119. RETURN Files.Old ( file ) # NIL;
  120. END FileExists;
  121. (* simplistic url encoder/decoder stuff *)
  122. PROCEDURE UrlEncode* ( CONST input : ARRAY OF CHAR; VAR output : ARRAY OF CHAR );
  123. CONST
  124. unsafe = " <>#%[]|\^~[]'"; (* what about " *)
  125. VAR
  126. i, j : LONGINT;
  127. tmp : ARRAY 3 OF CHAR;
  128. BEGIN
  129. i := 0; j := 0;
  130. WHILE input[i] # 0X DO
  131. IF Strings.Find ( unsafe, 0, input[i] ) = -1 THEN
  132. output[j] := input[i];
  133. INC ( j );
  134. ELSE
  135. output[j] := '%'; INC ( j );
  136. Strings.IntToHexStr ( ORD(input[i]), 1, tmp );
  137. output[j] := tmp[0]; INC ( j );
  138. output[j] := tmp[1]; INC ( j );
  139. END;
  140. INC ( i );
  141. END;
  142. output[j] := 0X;
  143. END UrlEncode;
  144. PROCEDURE UrlDecode* (CONST input : ARRAY OF CHAR; VAR output : ARRAY OF CHAR );
  145. VAR
  146. i, j, value: LONGINT; res: WORD;
  147. tmp : ARRAY 3 OF CHAR;
  148. BEGIN
  149. i := 0; j := 0;
  150. tmp[2] := 0X;
  151. WHILE input[i] # 0X DO
  152. IF input[i] = '%' THEN
  153. INC ( i );
  154. tmp[0] := input[i]; INC ( i );
  155. tmp[1] := input [i]; INC ( i );
  156. Strings.HexStrToInt ( tmp, value, res ); ASSERT ( res = Strings.Ok );
  157. output[j] := CHR ( value ); INC ( j );
  158. ELSE
  159. output[j] := input[i];
  160. INC ( j ); INC ( i );
  161. END;
  162. END;
  163. output[j] := 0X;
  164. END UrlDecode;
  165. PROCEDURE RemoveFileDelimiterAtEnd* ( VAR s : ARRAY OF CHAR );
  166. BEGIN
  167. IF Strings.EndsWith ( Files.PathDelimiter, s ) THEN
  168. s[Strings.Length(s)-1] := 0X;
  169. END;
  170. END RemoveFileDelimiterAtEnd;
  171. END SVNUtil.