1 | MODULE m_count |
---|
2 | ! |
---|
3 | ! Contributed by Jon Wakelin |
---|
4 | ! |
---|
5 | |
---|
6 | USE flib_sax |
---|
7 | |
---|
8 | IMPLICIT NONE |
---|
9 | |
---|
10 | private |
---|
11 | PUBLIC :: begin_element_handler, end_element_handler, pcdata_chunk_handler |
---|
12 | |
---|
13 | TYPE, public :: hash |
---|
14 | CHARACTER(len=50) :: elm |
---|
15 | INTEGER :: num |
---|
16 | END TYPE hash |
---|
17 | |
---|
18 | TYPE(hash), DIMENSION(50), public :: element_hash |
---|
19 | INTEGER, public, save :: nhash = 0 |
---|
20 | |
---|
21 | INTEGER, private, save :: n = 0 |
---|
22 | |
---|
23 | !-------------------------------------------------------- |
---|
24 | CONTAINS |
---|
25 | |
---|
26 | SUBROUTINE begin_element_handler(name,attributes) |
---|
27 | character(len=*), intent(in) :: name |
---|
28 | TYPE(dictionary_t), INTENT(in) :: attributes |
---|
29 | |
---|
30 | LOGICAL :: match |
---|
31 | INTEGER :: pmatch |
---|
32 | INTEGER :: i |
---|
33 | |
---|
34 | match = .false. |
---|
35 | |
---|
36 | !!! First time through loop element must be unique... |
---|
37 | IF (n == 0) THEN |
---|
38 | element_hash(n+1)%elm = name |
---|
39 | element_hash(n+1)%num = 1 |
---|
40 | nhash=nhash+1 |
---|
41 | ELSE |
---|
42 | |
---|
43 | !!! ...thereafter we will have to check if it is unique |
---|
44 | DO i=1,nhash |
---|
45 | IF (name == element_hash(i)%elm) THEN |
---|
46 | match = .true. ! set .true. if element already exists |
---|
47 | pmatch = i ! and record the position at which the match occured |
---|
48 | ! NB there can only ever be 1 or 0 matches |
---|
49 | ENDIF |
---|
50 | ENDDO |
---|
51 | |
---|
52 | !!! If element already exists increment the counter for THIS element |
---|
53 | IF (match) THEN |
---|
54 | element_hash(pmatch)%num = element_hash(pmatch)%num + 1 |
---|
55 | ELSE |
---|
56 | !!! Otherwise make a new entry in the hash |
---|
57 | element_hash(n+1)%elm = name |
---|
58 | element_hash(n+1)%num = 1 |
---|
59 | nhash=nhash+1 |
---|
60 | ENDIF |
---|
61 | ENDIF |
---|
62 | n=nhash |
---|
63 | |
---|
64 | END SUBROUTINE begin_element_handler |
---|
65 | |
---|
66 | |
---|
67 | !-------------------------------------------------------------------------- |
---|
68 | ! End tag handler |
---|
69 | SUBROUTINE end_element_handler(name) |
---|
70 | character(len=*), intent(in) :: name |
---|
71 | END SUBROUTINE end_element_handler |
---|
72 | |
---|
73 | ! PCDATA handler |
---|
74 | SUBROUTINE pcdata_chunk_handler(chunk) |
---|
75 | CHARACTER(len=*), INTENT(in) :: chunk |
---|
76 | END SUBROUTINE pcdata_chunk_handler |
---|
77 | |
---|
78 | END MODULE m_count |
---|