home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / Strings.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  5.8 KB  |  228 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Library Module: Strings              Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1992 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE Strings;
  10.  
  11. IMPORT s := SYSTEM, u := Utility;
  12.  
  13. PROCEDURE Length*(str: ARRAY OF CHAR): LONGINT; (* $EntryExitCode- *)
  14. BEGIN
  15. s.INLINE(0225FH,                  (*     MOVEA.L     (A7)+,A1       *)
  16.          0201FH,                  (*     MOVE.L      (A7)+,D0       *)
  17.          0205FH,                  (*     MOVEA.L     (A7)+,A0       *)
  18.          05380H,                  (*     SUBQ.L      #1,D0          *)
  19.          02200H,                  (*     MOVE.L      D0,D1          *)
  20.          04A18H,                  (* l:  TST.B       (A0)+          *)
  21.          057C9H,0FFFCH,           (*     DBEQ        D1,l           *)
  22.          06708H,                  (*     BEQ         e              *)
  23.          00481H,00001H,00000H,    (*     SUBI.L      #00010000H,D1  *)
  24.          06AF0H,                  (*     BPL         l              *)
  25.          09081H,                  (* e:  SUB.L       D1,D0          *)
  26.          04ED1H);                 (*     JMP         (A1)           *)
  27. END Length;
  28.  
  29.  
  30. PROCEDURE Append*(VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR); (* $CopyArrays- *)
  31. (* hängt s2 an s1 an *)
  32.  
  33. VAR l,p,q: LONGINT;
  34. BEGIN
  35.   p := Length(s1);
  36.   l := Length(s2);
  37.   q := 0;
  38.   WHILE (p<LEN(s1)) & (q<l) DO
  39.     s1[p] := s2[q];
  40.     INC(p); INC(q);
  41.   END;
  42.   IF p<LEN(s1) THEN s1[p] := 0X END;
  43. END Append;
  44.  
  45.  
  46. PROCEDURE Occurs*(VAR  s: ARRAY OF CHAR;
  47.                   search: ARRAY OF CHAR): LONGINT;  (* $CopyArrays- *)
  48. (* prüft, ob search in s vorkommt und gibt die Position oder -1 zurück *)
  49.  
  50. VAR l,L,i,j,start: LONGINT;
  51.  
  52. BEGIN
  53.   l := Length(s); L := Length(search); start := 0;
  54.   WHILE start<=l-L DO
  55.     j := 0; i := start;
  56.     WHILE (j<L) & (search[j]=s[i]) DO
  57.       INC(j); INC(i);
  58.     END;
  59.     IF j=L THEN RETURN i-L END;
  60.     INC(start);
  61.   END;
  62.   RETURN -1;
  63. END Occurs;
  64.  
  65.  
  66. PROCEDURE OccursPos*(VAR  s: ARRAY OF CHAR;
  67.                      search: ARRAY OF CHAR;
  68.                       start: LONGINT): LONGINT;  (* $CopyArrays- *)
  69. (* prüft, ob search ab Zeichen Nummer start in s vorkommt und gibt die
  70. Position oder -1 zurück *)
  71.  
  72. VAR l,L,i,j: LONGINT;
  73.  
  74. BEGIN
  75.   l := Length(s); L := Length(search);
  76.   WHILE start<l DO
  77.     j := 0; i := start;
  78.     WHILE (j<L) & (search[j]=s[i]) DO
  79.       INC(j); INC(i);
  80.     END;
  81.     IF j=L THEN RETURN i-L END;
  82.     INC(start);
  83.   END;
  84.   RETURN -1;
  85. END OccursPos;
  86.  
  87.  
  88. PROCEDURE Cut*(VAR  s: ARRAY OF CHAR; from,cnt: LONGINT;
  89.                VAR to: ARRAY OF CHAR);
  90. (* kopiert von Zeichen from ausgehend cnt Zeichen nach to *)
  91.  
  92. VAR i: LONGINT;
  93.  
  94. BEGIN
  95.   i := 0;
  96.   WHILE (i<cnt) & (from<LEN(s)) & (i<LEN(to)) DO
  97.     to[i] := s[from];
  98.     INC(i);
  99.     INC(from);
  100.   END;
  101.   IF i<LEN(to) THEN to[i] := 0X END;
  102. END Cut;
  103.  
  104.  
  105. PROCEDURE Upper*(VAR s: ARRAY OF CHAR);
  106. (* wandelt alle Buchstaben in Großbuchstaben um. Ist für Caseinsensitives
  107.    Vergleichen nützlich *)
  108.  
  109. VAR i: LONGINT;
  110. BEGIN
  111.   i := 0;
  112.   WHILE (i<LEN(s)) & (s[i]#0X) DO s[i] := CAP(s[i]); INC(i) END;
  113. END Upper;
  114.  
  115.  
  116. PROCEDURE CapIntl*(c: CHAR): CHAR;
  117. (* wandelt c in einen Großbuchstaben um.
  118.  * Im Gegensatz zur Standardprozedur CAP werden hier auch die
  119.  * internationalen Zeichen wie 'ä' oder 'ú' umgewandelt.
  120.  *)
  121.  
  122. BEGIN
  123.   IF u.base#NIL THEN
  124.     RETURN u.ToUpper(c);
  125.   ELSE
  126.     CASE c OF
  127.     | "a".."z","à".."ö","ø".."þ": DEC(c,32)
  128.     ELSE END;
  129.     RETURN c;
  130.   END;
  131. END CapIntl;
  132.  
  133.  
  134. PROCEDURE UpperIntl*(VAR s: ARRAY OF CHAR);
  135. (* wandelt alle Buchstaben in Großbuchstaben um. Ist für Caseinsensitives
  136.  * Vergleichen nützlich: Im Gegensatz zu Upper werden hier auch die
  137.  * internationalen Zeichen wie 'ä' oder 'ú' umgewandelt.
  138.  *)
  139.  
  140. VAR i: LONGINT;
  141. BEGIN
  142.   i := 0;
  143.   WHILE (i<LEN(s)) & (s[i]#0X) DO
  144.     s[i] := CapIntl(s[i]);
  145.     INC(i);
  146.   END;
  147. END UpperIntl;
  148.  
  149.  
  150. PROCEDURE Insert*(VAR s: ARRAY OF CHAR;   (* $CopyArrays- *)
  151.                      at: LONGINT;
  152.                     str: ARRAY OF CHAR);
  153. (* fügt str in s an der Stelle at eine. Beispiel:
  154.    s = "Hallo"; Insert(s,3,"liHal");
  155.      dies ergibt "HalliHallo". *)
  156.  
  157. VAR l1,l2,i: LONGINT;
  158. BEGIN
  159.   l1 := Length(s);
  160.   l2 := Length(str);
  161.   i := l1; WHILE (i>=at) DO         s[i+l2] := s  [i]; DEC(i) END;
  162.   i := l2; WHILE (i>  0) DO DEC(i); s[at+i] := str[i]         END;
  163. END Insert;
  164.  
  165.  
  166. PROCEDURE Delete*(VAR s: ARRAY OF CHAR; at, cnt: LONGINT);
  167. (* löscht n Zeichen aus s ab der Stelle at.
  168.    Beispiel Delete("abcdefg",3,3) ergibt "abcg". *)
  169. VAR l: LONGINT;
  170. BEGIN
  171.   l := Length(s)-cnt;
  172.   WHILE at<l DO
  173.     s[at] := s[at+cnt];
  174.     INC(at);
  175.   END;
  176.   IF at<LEN(s) THEN s[at] := 0X END;
  177. END Delete;
  178.  
  179.  
  180. PROCEDURE AppendChar*(VAR s: ARRAY OF CHAR; c: CHAR);
  181. (* hängt c an s1 an *)
  182.  
  183. VAR l: LONGINT;
  184. BEGIN
  185.   l := Length(s);
  186.   s[l] := c; INC(l);
  187.   IF l<LEN(s) THEN s[l] := 0X END;
  188. END AppendChar;
  189.  
  190.  
  191. PROCEDURE InsertChar*(VAR s: ARRAY OF CHAR;
  192.                          at: LONGINT;
  193.                           c: CHAR);
  194. (* fügt c in s an der Stelle at eine. Beispiel:
  195.    s = "Halo"; Insert(s,3,"l");
  196.      dies ergibt "Hallo". *)
  197.  
  198. VAR i: LONGINT;
  199. BEGIN
  200.   i := Length(s);
  201.   WHILE (i>=at) DO s[i+1] := s[i]; DEC(i) END;
  202.   s[at] := c;
  203. END InsertChar;
  204.  
  205.  
  206. PROCEDURE OverWrite*(VAR string: ARRAY OF CHAR; (* $CopyArrays- *)
  207.                         overlay: ARRAY OF CHAR;
  208.                             pos: LONGINT);
  209. VAR
  210.   i, len: LONGINT;
  211. BEGIN
  212.   len := Length(overlay)-1;
  213.   IF pos+len > LEN(string) THEN
  214.     len := LEN(string)-pos;
  215.   END;
  216.   i := 0;
  217.   WHILE i <= len DO
  218.     string[pos] := overlay[i];
  219.     INC(pos); INC(i);
  220.   END;
  221. END OverWrite;
  222.  
  223.  
  224. END Strings.
  225.  
  226.  
  227.  
  228.