5 * Revision 1.1.1.1 1996/02/15 17:49:49 mclareni
9 #include "kerngen/pilot.h"
10 SUBROUTINE SORCHA (A,ICH1,ICH2,NPOINT,ITYPE)
12 C CERN PROGLIB# M104 SORCHA .VERSION KERNFOR 4.08 840613
13 C ORIG. 29/05/84 H.RENSHALL/CERN
15 C FORTRAN 77 SUBROUTINE TO DO SLOW LINEAR SORT OF A CHARACTER ARRAY
16 C INTO ITSELF IN ASCENDING OR DESCENDING ORDER USING EITHER THE
17 C LOGICAL COLLATION SEQUENCE FUNCTIONS (LLE,LGE) OR THE RELATIONAL
18 C FUNCTIONS (LE,GE). ON CDC AND VAX THE RESULTS ARE THE SAME AND
19 C MATCH THE COLLATION SEQUENCE ORDERING ON IBM IN WHICH BLANK IS
20 C LESS THAN NUMBERS WHICH ARE LESS THAN LETTERS. THE SORT MAY BE
21 C DONE ON ARRAYS OF UP TO LENGTH 256 CHARACTERS PER ARRAY ELEMENT
22 C AND MAY BE DONE ON ANY POSITIONS IN THE CHARACTER FIELD.
24 C A = INPUT CHARACTER ARRAY OF DIMENSION NPOINT TO BE SORTED.
25 C MAXIMUM LENGTH OF A IS CHARACTER*256
26 C ICH1 = FIRST CHARACTER POSTION IN EACH ELEMENT OF A
27 C OF THE FIELD TO BE SORTED
28 C ICH2 = LAST CHARACTER POSITION IN EACH ELEMENT OF A
29 C OF THE FIELD TO BE SORTED
30 C NPOINT= THE FIRST NPOINT ELEMENTS OF A WILL BE SORTED INTO THEMSELVES
31 C ITYPE = INTEGER BETWEEN 1 AND 4 CONTROLLING THE TYPE OF SORT.
32 C 1 = ASCENDING SORT (A(1) WILL BE LOWER THAN A(2))
33 C USING COLLATING SEQUENCE
34 C 2 = DESCENDING SORT (A(2) WILL BE LOWER THAN A(1))
35 C USING COLLATING SEQUENCE
36 C 3 = ASCENDING SORT (A(1) WILL BE LOWER THAN A(2))
37 C USING RELATIONAL SEQUENCE
38 C 4 = DESCENDING SORT (A(2) WILL BE LOWER THAN A(1))
39 C USING RELATIONALIEQUENCE
40 C FOR PORTABLE RESULTS ITYPE= 1 OR 2 SHOULD BE USED.
41 C ON SOME MACHINES (CDC/FTN5 AND VAX/VMS) RESULTS
42 C ARE THE SAME AS ITYPE= 3 OR 4. NOTE THAT ITYPE= 3 OR 4
43 C MAY BE SUBSTANTIALLY FASTER THAN ITYPE= 1 OR 2.
45 CHARACTER*(*) A(NPOINT),STORE*256
47 GO TO (5,25,45,75),ITYPE
50 C ASCENDING COLLATION SEQUENCE SORT USING LLE FUNCTION
51 C ON MOST MACHINES THIS IS THE ASCII ORDER WHERE
52 C BLANK IS LESS THAN NUMBERS IS LESS THAN LETTERS
53 C THIS IS TRUE ON IBM/FACOM COMPILER, CDC/FTN5 AND VAX/VMS.
59 IF(LLE(A(I)(ICH1:ICH2),A(J)(ICH1:ICH2))) GO TO 10
63 A(IPOINT)= STORE(1:LENA)
68 C DESCENDING COLLATION SEQUENCE SORT USING LGE FUNCTION
69 C ON MOST MACHINES THIS IS THE ASCII ORDER WHERE
70 C BLANK IS LESS THAN NUMBERS IS LESS THAN LETTERS
71 C THIS IS TRUE ON IBM/FACOM COMPILER, CDC/FTN5 AND VAX/VMS.
77 IF(LGE(A(I)(ICH1:ICH2),A(J)(ICH1:ICH2))) GO TO 30
81 A(IPOINT)= STORE(1:LENA)
86 C ASCENDING RELATIONAL SEQUENCE SORT USING LE RELATION
87 C ON MANY MACHINES THIS IS THE ASCII ORDER WHERE
88 C BLANK IS LESS THAN NUMBERS IS LESS THAN LETTERS
89 C THIS IS TRUE ON CDC/FTN5 AND VAX/VMS.
90 C ON IBM/FACOM COMPILER HOWEVER THE EBCDIC ORDER IS USED WHERE
91 C BLANK IS LESS THAN LETTERS IS LESS THAN NUMBERS
97 IF(A(I)(ICH1:ICH2).LE.A(J)(ICH1:ICH2)) GO TO 50
101 A(IPOINT)= STORE(1:LENA)
106 C DESCENDING RELATIONAL SEQUENCE SORT USING GE RELATION
107 C ON MANY MACHINES THIS IS THE ASCII ORDER WHERE
108 C BLANK IS LESS THAN NUMBERS IS LESS THAN LETTERS
109 C THIS IS TRUE ON CDC/FTN5 AND VAX/VMS.
110 C ON IBM/FACOM COMPILER HOWEVER THE EBCDIC ORDER IS USED WHERE
111 C BLANK IS LESS THAN LETTERS IS LESS THAN NUMBERS
117 IF(A(I)(ICH1:ICH2).GE.A(J)(ICH1:ICH2)) GO TO 80
121 A(IPOINT)= STORE(1:LENA)