home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / String.mod < prev    next >
Text File  |  1997-01-03  |  7KB  |  369 lines

  1. IMPLEMENTATION MODULE String;
  2.  
  3. (* (C) Copyright 1994 Marcel Timmermans. All rights reserved. *)
  4.  
  5. FROM SYSTEM IMPORT ASSEMBLE;
  6.  
  7. PROCEDURE Length(s:ARRAY OF CHAR):INTEGER;
  8. (*$ EntryExitCode- *)
  9. BEGIN
  10.   ASSEMBLE(
  11.     MOVE.L  (A7)+,A0 (* return address *)
  12.     MOVE.L  (A7)+,A1 (* s *)
  13.     MOVE.L  (A7)+,D0 (* HIGH(s) *)
  14.     MOVE.L  D0,D1
  15.   l:
  16.     TST.B   (A1)+
  17.     DBEQ    D1,l
  18.     SUB.W   D1,D0     (* len:=HIGH(s)-D1 *)
  19.     JMP     (A0)
  20.   END);
  21. END Length;
  22.  
  23. PROCEDURE Compare(a,b: ARRAY OF CHAR): INTEGER;
  24. (*$ EntryExitCode- *)
  25. BEGIN 
  26. ASSEMBLE(
  27.         MOVEM.L    D2-D7,-(A7)
  28.         LEA    4+24(A7),A2
  29.         MOVE.L    (A2)+,A0    (* b *)
  30.         MOVE.L    (A2)+,D6    (* HIGH(b) *)
  31.         MOVE.L    (A2)+,A1    (* a *)
  32.         MOVE.L    (A2)+,D7    (* HIGH(a) *)
  33.  
  34.             MOVE.W    D7,D4
  35.             SUB.W    D6,D4
  36.             MOVE.W    D4,D5
  37.             TST.W    D5
  38.             BLT.S    c1
  39.             MOVE.W    D6,D7
  40. c1:
  41.             MOVEQ    #0,D6
  42. loop:
  43.             CMP.W    D7,D6
  44.             BGT.S    exit
  45.             MOVE.B    0(A1,D6.W),D3
  46.             MOVE.B    0(A0,D6.W),D2
  47.             SUB.B    D2,D3
  48.             TST.B    D3
  49.             BNE.S    c2
  50.             TST.B    0(A1,D6.W)
  51.             BNE.S    c3
  52. c2:
  53.                 MOVEQ   #0,D0
  54.             MOVE.B    D3,D0
  55.             BRA.S    end
  56. c3:
  57.             ADDQ.W    #1,D6
  58.             BVC.S    loop
  59. exit:
  60.             ADDQ.W    #1,D7
  61.             TST.W    D5
  62.             BGE.S    c5
  63.             TST.B    0(A0,D7.W)
  64.             BEQ.S    c5
  65.             BRA.S    c7
  66. c5:
  67.             TST.W    D5
  68.             BLE.S    c6
  69.             TST.B    0(A1,D7.W)
  70.             BEQ.S    c6
  71.             BRA.S    c7
  72. c6:
  73.             MOVEQ    #0,D0
  74.             BRA.S    end
  75. c7:
  76.             MOVE.W    D5,D0
  77.             EXT.L    D0
  78. end:
  79.         MOVEM.L    (A7)+,D2-D7
  80.                 MOVE.L    (A7)+,A0
  81.                 LEA    16(A7),A7
  82.                 JMP    (A0)
  83.                 
  84. END);
  85. END Compare;
  86.  
  87.  
  88. PROCEDURE Copy(VAR dest:ARRAY OF CHAR; src:ARRAY OF CHAR);
  89. (*$ EntryExitCode- *)
  90. BEGIN
  91.   ASSEMBLE(
  92.     MOVE.L  4(A7),A0    (* dest *)
  93.     MOVE.L  8(A7),D0    (* HIGH(dest) *)     
  94.     MOVE.L  12(A7),A1   (* src *)
  95.     MOVE.L  16(A7),D1   (* HIGH(src) *)
  96.     CMP.L   D1,D0
  97.     BLE.S   n
  98.     MOVE.L  D1,D0
  99.   n:
  100.     MOVE.B  (A0)+,(A1)+
  101.     DBEQ    D0,n
  102.     CLR.B  (A1)
  103.     MOVEA.L (A7)+,A0
  104.     LEA     4*4(A7),A7
  105.     JMP        (A0)
  106.   END);  
  107. END Copy;
  108.  
  109. PROCEDURE Delete(VAR s:ARRAY OF CHAR; start,len: INTEGER);
  110. (*$ EntryExitCode- *)
  111. BEGIN
  112. ASSEMBLE(
  113.         MOVEM.L D2-D4/A2,-(A7)
  114.         LEA     4*4+4(A7),A0    
  115.         MOVE.W  (A0)+,D2    (* len *)
  116.         MOVE.W  (A0)+,D1    (* start *)
  117.         MOVE.L  (A0)+,A1    (* s *)
  118.         MOVE.L  (A0)+,D0    (* HIGH(s) *)
  119.  
  120.     ADD.W    D1,D2
  121. L0:
  122.     CMP.W    D0,D2
  123.     BGT.S    L2
  124.     MOVE.B    0(A1,D2.W),0(A1,D1.W)
  125.     TST.B    0(A1,D2.W)
  126.     BNE.S    L1
  127.     BRA.S    L3
  128. L1:
  129.     ADDQ.W    #1,D1
  130.     ADDQ.W    #1,D2
  131.     BRA.S    L0
  132. L2:
  133.     CMP.W    D0,D1
  134.     BGT.S    L3
  135.     CLR.B    0(A1,D1.W)
  136. L3:
  137.         MOVEM.L (A7)+,D2-D4/A2
  138.         MOVE.L  (A7)+,A0        (* return address *)
  139.         LEA     8+2+2(A7),A7    (* fix stack *)
  140.         JMP     (A0)
  141.         END);
  142.  
  143. END Delete;
  144.  
  145. PROCEDURE Concat(VAR s1:ARRAY OF CHAR; s2:ARRAY OF CHAR);
  146. (*$ EntryExitCode- *)
  147. BEGIN
  148.   ASSEMBLE(
  149.     LINK    A5,#0
  150.     MOVEM.L D4-D7/A2-A3,-(A7)
  151.     MOVE.L    20(A5),D4
  152.     MOVEA.L 16(A5),A3
  153.     MOVE.L    D4,-(A7)
  154.     MOVE.L  A3,-(A7)
  155.     BSR        Length
  156.     MOVE.W    D0,D6
  157.     MOVE.L    12(A5),-(A7)
  158.     MOVEA.L 8(A5),A2
  159.     MOVE.L    A2,-(A7)
  160.     BSR        Length
  161.     MOVE.W    D0,D5
  162.     MOVEQ    #0,D7
  163.     EXT.L    D6
  164. n:
  165.     CMP.L    D4,D6
  166.     BGE.S    n1
  167.     CMP.W    D5,D7
  168.     BGE.S    n1
  169.     MOVE.B    0(A2,D7.W),0(A3,D6.W)
  170.     ADDQ.W    #1,D6
  171.     ADDQ.W    #1,D7
  172.     BRA.S    n
  173. n1:
  174.     CMP.L    D4,D6
  175.     BGE.S    end
  176.     CLR.B    0(A3,D6.W)
  177. end:
  178.     MOVEM.L (A7)+,D5-D7/A2-A3
  179.     UNLK    A5
  180.     MOVEA.L (A7)+,A0
  181.     LEA    16(A7),A7
  182.     JMP    (A0)
  183.   END);
  184. END Concat;
  185.  
  186. PROCEDURE Occurs(VAR s:ARRAY OF CHAR; subs:ARRAY OF CHAR):INTEGER;
  187. (*$  EntryExitCode- *)
  188. (*  CopyDyn-  *)
  189. (* VAR len,start,sublen,i{7},j{6}:INTEGER; *)
  190. BEGIN
  191.   ASSEMBLE(
  192.     LINK    A5,#-6
  193.     MOVEM.L D4-D7/A2-A3,-(A7)
  194.     MOVE.L    20(A5),-(A7)
  195.     MOVE.L    16(A5),-(A7)
  196.     BSR     Length
  197.     MOVE.W    D0,-2(A5)
  198.     MOVE.L    12(A5),-(A7)
  199.     MOVE.L    8(A5),-(A7)
  200.     BSR        Length
  201.     MOVE.W  D0,-6(A5)
  202.     CLR.W   -4(A5)
  203.     MOVEA.L 16(A5),A3
  204.     MOVEA.L 8(A5),A2
  205.   lp:
  206.     MOVE.W -2(A5),D5
  207.     SUB.W  -6(A5),D5
  208.     MOVE.W -4(A5),D4
  209.     CMP.W  D5,D4
  210.     BGT.S     n4
  211.     MOVE.W -4(A5),D7
  212.     MOVEQ  #0,D6
  213. n1:
  214.     CMP.W     -6(A5),D6
  215.     BGE.S     n2
  216.     MOVE.B 0(A3,D7.W),D5 
  217.     CMP.B     (A2,D6.W),D5
  218.     BNE.S     n2
  219.     ADDQ.W #1,D7
  220.     ADDQ.W #1,D6
  221.     BRA.S     n1
  222. n2:
  223.     CMP.W    -6(A5),D6
  224.     BNE.S    n3
  225.     MOVE.W    -4(A5),D0
  226.     EXT.L    D0
  227.     BRA.S    end
  228. n3:
  229.     ADDQ.W    #1,-4(A5)
  230.     BRA.S    lp
  231. n4:
  232.     MOVEQ    #-1,D0
  233. end:
  234.     MOVEM.L (A7)+,D4-D7/A2-A3
  235.     UNLK    A5
  236.     MOVEA.L (A7)+,A0
  237.     LEA    16(A7),A7
  238.     JMP    (A0)
  239.   END);
  240. (*
  241.  len:=Length(s); sublen:=Length(subs); start:=0;
  242.  WHILE start<=len-sublen DO
  243.   i:=start; j:=0;
  244.   WHILE (j<sublen) & (s[i]=subs[j]) DO INC(i); INC(j); END;
  245.   IF j=sublen THEN RETURN start; END;
  246.   INC(start);
  247.  END;
  248.  RETURN NoOccur; *)
  249. END Occurs;
  250.  
  251. PROCEDURE Insert(VAR s:ARRAY OF CHAR; at:INTEGER; str:ARRAY OF CHAR);
  252. (*$  EntryExitCode- *)
  253. BEGIN
  254. ASSEMBLE(
  255.         MOVEM.L D2-D7/A2/A3,-(A7)
  256.         LEA     8*4+4(A7),A0
  257.         MOVE.L  (A0)+,A3        (* str *)
  258.         MOVE.L  (A0)+,D2        (* HIGH(str) *)
  259.         MOVE.W  (A0)+,D7        (* at *)
  260.         MOVE.L  (A0)+,A2        (* s *)
  261.         MOVE.L  (A0)+,D3        (* HIGH s *)        
  262.  
  263.         MOVE.L  D2,-(A7)
  264.         MOVE.L  A3,-(A7)
  265.         BSR     Length
  266.         MOVE.L  D0,D4
  267.         MOVE.L  D3,-(A7)
  268.         MOVE.L  A2,-(A7)
  269.         BSR     Length
  270.         ADD.W   D4,D0           (* D4 = Distance *)
  271.         MOVE.W  D0,D5           (* D5 = End *)
  272.         CMP.W   D3,D5
  273.         BLE.S   L2
  274.         MOVE.W  D3,D5
  275. L2:
  276.         MOVE.W  D5,D6
  277.         SUB.W   D4,D6           (* D6 = Start *)
  278. L3:
  279.         CMP.W   D7,D6
  280.         BLT.S   L4
  281.         MOVE.B  0(A2,D6.W),0(A2,D5.W)
  282.         SUBQ.W  #1,D5
  283.         SUBQ.W  #1,D6
  284.         BVC.S   L3
  285. L4:
  286.         SUBQ.W  #1,D4
  287.         MOVE.W  D7,D0
  288.         ADD.W   D4,D0
  289.         CMP.W   D3,D0
  290.         BLE.S   L5
  291.         MOVE.W  D3,D4
  292.         SUB.W   D7,D4
  293. L5:
  294.         MOVEQ   #0,D6
  295. L6:
  296.         CMP.W   D4,D6
  297.         BGT.S   L7
  298.         MOVE.B  0(A3,D6.W),0(A2,D7.W)
  299.         ADDQ.W  #1,D7
  300.         ADDQ.W  #1,D6
  301.         BVC.S   L6
  302. L7:
  303.         MOVEM.L (A7)+,D2-D7/A2/A3
  304.         MOVE.L  (A7)+,A0        (* return address *)
  305.         LEA     8+2+8(A7),A7    (* fix stack *)
  306.         JMP     (A0)
  307.      END);
  308. END Insert;
  309.  
  310.  
  311. PROCEDURE AppendChar(VAR String:ARRAY OF CHAR;Char:CHAR);
  312. VAR
  313.   Len:INTEGER;
  314. BEGIN
  315.   Len:=Length(String);
  316.   IF Len<=HIGH(String) THEN
  317.    String[Len]:=Char;
  318.    IF Len<HIGH(String) THEN
  319.      String[Len+1]:=0C;
  320.    END;
  321.   END;
  322. END AppendChar;
  323.  
  324. PROCEDURE CapIntl(VAR Char:CHAR);
  325. BEGIN
  326.  CASE Char OF
  327.   |"a".."z", "à".."ö","ø".."þ": DEC(Char,32);
  328.  ELSE
  329.  END;
  330. END CapIntl;
  331.  
  332. PROCEDURE Upper(VAR s:ARRAY OF CHAR);
  333. VAR
  334.   i:INTEGER;
  335. BEGIN
  336.   i:=0;
  337.   WHILE (i<=HIGH(s)) AND (s[i]#0C) DO s[i]:=CAP(s[i]); INC(i); END;
  338. END Upper;
  339.  
  340. PROCEDURE UpperIntl(VAR s:ARRAY OF CHAR);
  341. VAR
  342.   i:INTEGER;
  343. BEGIN
  344.   i:=0;
  345.   WHILE (i<=HIGH(s)) AND (s[i]#0C) DO CapIntl(s[i]);INC(i); END;
  346. END UpperIntl;
  347.  
  348. PROCEDURE FindChar(s:ARRAY OF CHAR;ch:CHAR;Start:INTEGER):INTEGER;
  349. (*$ CopyDyn- *)
  350. VAR
  351.   Step:INTEGER;
  352. BEGIN
  353.   IF Start<0 THEN
  354.     Start:=-Start;
  355.     Step:=-1;
  356.   ELSE
  357.     Step:=1;
  358.   END;
  359.   WHILE (Start<=HIGH(s)) AND (Start>=0) AND (s[Start]#0C) DO
  360.     IF s[Start]=ch THEN
  361.       RETURN Start
  362.     END;
  363.     INC(Start,Step);
  364.   END;
  365.   RETURN -1;
  366. END FindChar;
  367.  
  368. END String.
  369.