TreeMig Code
Loading...
Searching...
No Matches
ISO_varying_string.f90
Go to the documentation of this file.
1
36
38
39! No implicit typing
40
41 IMPLICIT NONE
42
43! Parameter definitions
44
45 INTEGER, parameter, private :: GET_BUFFER_LEN = 256
46
47! Type definitions
48
49 TYPE, public :: varying_string
50 private
51 character(LEN=1), dimension(:), allocatable :: chars
52 end TYPE varying_string
53
54! Interface blocks
55
56 interface assignment(=)
57 module procedure op_assign_ch_vs
58 module procedure op_assign_vs_ch
59 end interface assignment(=)
60
61 interface operator(//)
62 module procedure op_concat_vs_vs
63 module procedure op_concat_ch_vs
64 module procedure op_concat_vs_ch
65 end interface operator(//)
66
67 interface operator(==)
68 module procedure op_eq_vs_vs
69 module procedure op_eq_ch_vs
70 module procedure op_eq_vs_ch
71 end interface operator(==)
72
73 interface operator(/=)
74 module procedure op_ne_vs_vs
75 module procedure op_ne_ch_vs
76 module procedure op_ne_vs_ch
77 end interface operator (/=)
78
79 interface operator(<)
80 module procedure op_lt_vs_vs
81 module procedure op_lt_ch_vs
82 module procedure op_lt_vs_ch
83 end interface operator (<)
84
85 interface operator(<=)
86 module procedure op_le_vs_vs
87 module procedure op_le_ch_vs
88 module procedure op_le_vs_ch
89 end interface operator (<=)
90
91 interface operator(>=)
92 module procedure op_ge_vs_vs
93 module procedure op_ge_ch_vs
94 module procedure op_ge_vs_ch
95 end interface operator (>=)
96
97 interface operator(>)
98 module procedure op_gt_vs_vs
99 module procedure op_gt_ch_vs
100 module procedure op_gt_vs_ch
101 end interface operator (>)
102
103 interface adjustl
104 module procedure adjustl_
105 end interface adjustl
106
107 interface adjustr
108 module procedure adjustr_
109 end interface adjustr
110
111 interface char
112 module procedure char_auto
113 module procedure char_fixed
114 end interface char
115
116 interface iachar
117 module procedure iachar_
118 end interface iachar
119
120 interface ichar
121 module procedure ichar_
122 end interface ichar
123
124 interface index
125 module procedure index_vs_vs
126 module procedure index_ch_vs
127 module procedure index_vs_ch
128 end interface index
129
130 interface len
131 module procedure len_
132 end interface len
133
134 interface len_trim
135 module procedure len_trim_
136 end interface len_trim
137
138 interface lge
139 module procedure lge_vs_vs
140 module procedure lge_ch_vs
141 module procedure lge_vs_ch
142 end interface lge
143
144 interface lgt
145 module procedure lgt_vs_vs
146 module procedure lgt_ch_vs
147 module procedure lgt_vs_ch
148 end interface lgt
149
150 interface lle
151 module procedure lle_vs_vs
152 module procedure lle_ch_vs
153 module procedure lle_vs_ch
154 end interface lle
155
156 interface llt
157 module procedure llt_vs_vs
158 module procedure llt_ch_vs
159 module procedure llt_vs_ch
160 end interface llt
161
162 interface repeat
163 module procedure repeat_
164 end interface repeat
165
166 interface scan
167 module procedure scan_vs_vs
168 module procedure scan_ch_vs
169 module procedure scan_vs_ch
170 end interface scan
171
172 interface trim
173 module procedure trim_
174 end interface trim
175
176 interface verify
177 module procedure verify_vs_vs
178 module procedure verify_ch_vs
179 module procedure verify_vs_ch
180 end interface verify
181
182 interface var_str
183 module procedure var_str_
184 end interface var_str
185
186 interface get
187 module procedure get_
188 module procedure get_unit
189 module procedure get_set_vs
190 module procedure get_set_ch
191 module procedure get_unit_set_vs
192 module procedure get_unit_set_ch
193 end interface get
194
195 interface put
196 module procedure put_vs
197 module procedure put_ch
198 module procedure put_unit_vs
199 module procedure put_unit_ch
200 end interface put
201
202 interface put_line
203 module procedure put_line_vs
204 module procedure put_line_ch
205 module procedure put_line_unit_vs
206 module procedure put_line_unit_ch
207 end interface put_line
208
209 interface extract
210 module procedure extract_vs
211 module procedure extract_ch
212 end interface extract
213
214 interface insert
215 module procedure insert_vs_vs
216 module procedure insert_ch_vs
217 module procedure insert_vs_ch
218 module procedure insert_ch_ch
219 end interface insert
220
221 interface remove
222 module procedure remove_vs
223 module procedure remove_ch
224 end interface remove
225
226 interface replace
227 module procedure replace_vs_vs_auto
228 module procedure replace_ch_vs_auto
229 module procedure replace_vs_ch_auto
230 module procedure replace_ch_ch_auto
231 module procedure replace_vs_vs_fixed
232 module procedure replace_ch_vs_fixed
233 module procedure replace_vs_ch_fixed
234 module procedure replace_ch_ch_fixed
235 module procedure replace_vs_vs_vs_target
236 module procedure replace_ch_vs_vs_target
237 module procedure replace_vs_ch_vs_target
238 module procedure replace_ch_ch_vs_target
239 module procedure replace_vs_vs_ch_target
240 module procedure replace_ch_vs_ch_target
241 module procedure replace_vs_ch_ch_target
242 module procedure replace_ch_ch_ch_target
243 end interface
244
245 interface split
246 module procedure split_vs
247 module procedure split_ch
248 end interface split
249
250! Access specifiers
251
252 public :: assignment(=)
253 public :: operator(//)
254 public :: operator(==)
255 public :: operator(/=)
256 public :: operator(<)
257 public :: operator(<=)
258 public :: operator(>=)
259 public :: operator(>)
260 public :: adjustl
261 public :: adjustr
262 public :: char
263 public :: iachar
264 public :: ichar
265 public :: index
266 public :: len
267 public :: len_trim
268 public :: lge
269 public :: lgt
270 public :: lle
271 public :: llt
272 public :: repeat
273 public :: scan
274 public :: trim
275 public :: verify
276 public :: var_str
277 public :: get
278 public :: put
279 public :: put_line
280 public :: extract
281 public :: insert
282 public :: remove
283 public :: replace
284 public :: split
285
286 private :: op_assign_ch_vs
287 private :: op_assign_vs_ch
288 private :: op_concat_vs_vs
289 private :: op_concat_ch_vs
290 private :: op_concat_vs_ch
291 private :: op_eq_vs_vs
292 private :: op_eq_ch_vs
293 private :: op_eq_vs_ch
294 private :: op_ne_vs_vs
295 private :: op_ne_ch_vs
296 private :: op_ne_vs_ch
297 private :: op_lt_vs_vs
298 private :: op_lt_ch_vs
299 private :: op_lt_vs_ch
300 private :: op_le_vs_vs
301 private :: op_le_ch_vs
302 private :: op_le_vs_ch
303 private :: op_ge_vs_vs
304 private :: op_ge_ch_vs
305 private :: op_ge_vs_ch
306 private :: op_gt_vs_vs
307 private :: op_gt_ch_vs
308 private :: op_gt_vs_ch
309 private :: adjustl_
310 private :: adjustr_
311 private :: char_auto
312 private :: char_fixed
313 private :: iachar_
314 private :: ichar_
315 private :: index_vs_vs
316 private :: index_ch_vs
317 private :: index_vs_ch
318 private :: len_
319 private :: len_trim_
320 private :: lge_vs_vs
321 private :: lge_ch_vs
322 private :: lge_vs_ch
323 private :: lgt_vs_vs
324 private :: lgt_ch_vs
325 private :: lgt_vs_ch
326 private :: lle_vs_vs
327 private :: lle_ch_vs
328 private :: lle_vs_ch
329 private :: llt_vs_vs
330 private :: llt_ch_vs
331 private :: llt_vs_ch
332 private :: repeat_
333 private :: scan_vs_vs
334 private :: scan_ch_vs
335 private :: scan_vs_ch
336 private :: trim_
337 private :: verify_vs_vs
338 private :: verify_ch_vs
339 private :: verify_vs_ch
340 private :: var_str_
341 private :: get_
342 private :: get_unit
343 private :: get_set_vs
344 private :: get_set_ch
345 private :: get_unit_set_vs
346 private :: get_unit_set_ch
347 private :: put_vs
348 private :: put_ch
349 private :: put_unit_vs
350 private :: put_unit_ch
351 private :: put_line_vs
352 private :: put_line_ch
353 private :: put_line_unit_vs
354 private :: put_line_unit_ch
355 private :: extract_vs
356 private :: extract_ch
357 private :: insert_vs_vs
358 private :: insert_ch_vs
359 private :: insert_vs_ch
360 private :: insert_ch_ch
361 private :: remove_vs
362 private :: remove_ch
363 private :: replace_vs_vs_auto
364 private :: replace_ch_vs_auto
365 private :: replace_vs_ch_auto
366 private :: replace_ch_ch_auto
367 private :: replace_vs_vs_fixed
368 private :: replace_ch_vs_fixed
369 private :: replace_vs_ch_fixed
370 private :: replace_ch_ch_fixed
371 private :: replace_vs_vs_vs_target
372 private :: replace_ch_vs_vs_target
373 private :: replace_vs_ch_vs_target
374 private :: replace_ch_ch_vs_target
375 private :: replace_vs_vs_ch_target
376 private :: replace_ch_vs_ch_target
377 private :: replace_vs_ch_ch_target
378 private :: replace_ch_ch_ch_target
379 private :: split_vs
380 private :: split_ch
381
382! Procedures
383
384contains
385
386!
387
388 elemental SUBROUTINE op_assign_ch_vs (var, exp)
389
390 character(LEN= ), INTENT(out) :: var
391 TYPE(varying_string), INTENT(in) :: exp
392
393! Assign a varying string to a character string
394
395 var = char(exp)
396
397! Finish
398
399 return
400
401 end SUBROUTINE op_assign_ch_vs
402
403!
404
405 elemental SUBROUTINE op_assign_vs_ch (var, exp)
406
407 TYPE(varying_string), INTENT(out) :: var
408 character(LEN= ), INTENT(in) :: exp
409
410! Assign a character string to a varying string
411
412 var = var_str(exp)
413
414! Finish
415
416 return
417
418 end SUBROUTINE op_assign_vs_ch
419
420!
421
422 elemental function op_concat_vs_vs (string_a, string_b) result (concat_string)
423
424 TYPE(varying_string), INTENT(in) :: string_a
425 TYPE(varying_string), INTENT(in) :: string_b
426 TYPE(varying_string) :: concat_string
427
428 INTEGER :: len_string_a
429
430! Concatenate two varying strings
431
432 len_string_a = len(string_a)
433
434 ALLOCATE(concat_string%chars(len_string_a+len(string_b)))
435
436 concat_string%chars(:len_string_a) = string_a%chars
437 concat_string%chars(len_string_a+1:) = string_b%chars
438
439! Finish
440
441 return
442
443 end function op_concat_vs_vs
444
445!
446
447 elemental function op_concat_ch_vs (string_a, string_b) result (concat_string)
448
449 character(LEN= ), INTENT(in) :: string_a
450 TYPE(varying_string), INTENT(in) :: string_b
451 TYPE(varying_string) :: concat_string
452
453! Concatenate a character string and a varying
454! string
455
456 concat_string = op_concat_vs_vs(var_str(string_a), string_b)
457
458! Finish
459
460 return
461
462 end function op_concat_ch_vs
463
464!
465
466 elemental function op_concat_vs_ch (string_a, string_b) result (concat_string)
467
468 TYPE(varying_string), INTENT(in) :: string_a
469 character(LEN= ), INTENT(in) :: string_b
470 TYPE(varying_string) :: concat_string
471
472! Concatenate a varying string and a character
473! string
474
475 concat_string = op_concat_vs_vs(string_a, var_str(string_b))
476
477! Finish
478
479 return
480
481 end function op_concat_vs_ch
482
483!
484
485 elemental function op_eq_vs_vs (string_a, string_b) result (op_eq)
486
487 TYPE(varying_string), INTENT(in) :: string_a
488 TYPE(varying_string), INTENT(in) :: string_b
489 LOGICAL :: op_eq
490
491! Compare (==) two varying strings
492
493 op_eq = char(string_a) == char(string_b)
494
495! Finish
496
497 return
498
499 end function op_eq_vs_vs
500
501!
502
503 elemental function op_eq_ch_vs (string_a, string_b) result (op_eq)
504
505 character(LEN= ), INTENT(in) :: string_a
506 TYPE(varying_string), INTENT(in) :: string_b
507 LOGICAL :: op_eq
508
509! Compare (==) a character string and a varying
510! string
511
512 op_eq = string_a == char(string_b)
513
514! Finish
515
516 return
517
518 end function op_eq_ch_vs
519
520!
521
522 elemental function op_eq_vs_ch (string_a, string_b) result (op_eq)
523
524 TYPE(varying_string), INTENT(in) :: string_a
525 character(LEN= ), INTENT(in) :: string_b
526 LOGICAL :: op_eq
527
528! Compare (==) a varying string and a character
529! string
530
531 op_eq = char(string_a) == string_b
532
533! Finish
534
535 return
536
537 end function op_eq_vs_ch
538
539!
540
541 elemental function op_ne_vs_vs (string_a, string_b) result (op_ne)
542
543 TYPE(varying_string), INTENT(in) :: string_a
544 TYPE(varying_string), INTENT(in) :: string_b
545 LOGICAL :: op_ne
546
547! Compare (/=) two varying strings
548
549 op_ne = char(string_a) /= char(string_b)
550
551! Finish
552
553 return
554
555 end function op_ne_vs_vs
556
557!
558
559 elemental function op_ne_ch_vs (string_a, string_b) result (op_ne)
560
561 character(LEN= ), INTENT(in) :: string_a
562 TYPE(varying_string), INTENT(in) :: string_b
563 LOGICAL :: op_ne
564
565! Compare (/=) a character string and a varying
566! string
567
568 op_ne = string_a /= char(string_b)
569
570! Finish
571
572 return
573
574 end function op_ne_ch_vs
575
576!
577
578 elemental function op_ne_vs_ch (string_a, string_b) result (op_ne)
579
580 TYPE(varying_string), INTENT(in) :: string_a
581 character(LEN= ), INTENT(in) :: string_b
582 LOGICAL :: op_ne
583
584! Compare (/=) a varying string and a character
585! string
586
587 op_ne = char(string_a) /= string_b
588
589! Finish
590
591 return
592
593 end function op_ne_vs_ch
594
595!
596
597 elemental function op_lt_vs_vs (string_a, string_b) result (op_lt)
598
599 TYPE(varying_string), INTENT(in) :: string_a
600 TYPE(varying_string), INTENT(in) :: string_b
601 LOGICAL :: op_lt
602
603! Compare (<) two varying strings
604
605 op_lt = char(string_a) < char(string_b)
606
607! Finish
608
609 return
610
611 end function op_lt_vs_vs
612
613!
614
615 elemental function op_lt_ch_vs (string_a, string_b) result (op_lt)
616
617 character(LEN= ), INTENT(in) :: string_a
618 TYPE(varying_string), INTENT(in) :: string_b
619 LOGICAL :: op_lt
620
621! Compare (<) a character string and a varying
622! string
623
624 op_lt = string_a < char(string_b)
625
626! Finish
627
628 return
629
630 end function op_lt_ch_vs
631
632!
633
634 elemental function op_lt_vs_ch (string_a, string_b) result (op_lt)
635
636 TYPE(varying_string), INTENT(in) :: string_a
637 character(LEN= ), INTENT(in) :: string_b
638 LOGICAL :: op_lt
639
640! Compare (<) a varying string and a character
641! string
642
643 op_lt = char(string_a) < string_b
644
645! Finish
646
647 return
648
649 end function op_lt_vs_ch
650
651!
652
653 elemental function op_le_vs_vs (string_a, string_b) result (op_le)
654
655 TYPE(varying_string), INTENT(in) :: string_a
656 TYPE(varying_string), INTENT(in) :: string_b
657 LOGICAL :: op_le
658
659! Compare (<=) two varying strings
660
661 op_le = char(string_a) <= char(string_b)
662
663! Finish
664
665 return
666
667 end function op_le_vs_vs
668
669!
670
671 elemental function op_le_ch_vs (string_a, string_b) result (op_le)
672
673 character(LEN= ), INTENT(in) :: string_a
674 TYPE(varying_string), INTENT(in) :: string_b
675 LOGICAL :: op_le
676
677! Compare (<=) a character string and a varying
678! string
679
680 op_le = string_a <= char(string_b)
681
682! Finish
683
684 return
685
686 end function op_le_ch_vs
687
688!
689
690 elemental function op_le_vs_ch (string_a, string_b) result (op_le)
691
692 TYPE(varying_string), INTENT(in) :: string_a
693 character(LEN= ), INTENT(in) :: string_b
694 LOGICAL :: op_le
695
696! Compare (<=) a varying string and a character
697! string
698
699 op_le = char(string_a) <= string_b
700
701! Finish
702
703 return
704
705 end function op_le_vs_ch
706
707!
708
709 elemental function op_ge_vs_vs (string_a, string_b) result (op_ge)
710
711 TYPE(varying_string), INTENT(in) :: string_a
712 TYPE(varying_string), INTENT(in) :: string_b
713 LOGICAL :: op_ge
714
715! Compare (>=) two varying strings
716
717 op_ge = char(string_a) >= char(string_b)
718
719! Finish
720
721 return
722
723 end function op_ge_vs_vs
724
725!
726
727 elemental function op_ge_ch_vs (string_a, string_b) result (op_ge)
728
729 character(LEN= ), INTENT(in) :: string_a
730 TYPE(varying_string), INTENT(in) :: string_b
731 LOGICAL :: op_ge
732
733! Compare (>=) a character string and a varying
734! string
735
736 op_ge = string_a >= char(string_b)
737
738! Finish
739
740 return
741
742 end function op_ge_ch_vs
743
744!
745
746 elemental function op_ge_vs_ch (string_a, string_b) result (op_ge)
747
748 TYPE(varying_string), INTENT(in) :: string_a
749 character(LEN= ), INTENT(in) :: string_b
750 LOGICAL :: op_ge
751
752! Compare (>=) a varying string and a character
753! string
754
755 op_ge = char(string_a) >= string_b
756
757! Finish
758
759 return
760
761 end function op_ge_vs_ch
762
763!
764
765 elemental function op_gt_vs_vs (string_a, string_b) result (op_gt)
766
767 TYPE(varying_string), INTENT(in) :: string_a
768 TYPE(varying_string), INTENT(in) :: string_b
769 LOGICAL :: op_gt
770
771! Compare (>) two varying strings
772
773 op_gt = char(string_a) > char(string_b)
774
775! Finish
776
777 return
778
779 end function op_gt_vs_vs
780
781!
782
783 elemental function op_gt_ch_vs (string_a, string_b) result (op_gt)
784
785 character(LEN= ), INTENT(in) :: string_a
786 TYPE(varying_string), INTENT(in) :: string_b
787 LOGICAL :: op_gt
788
789! Compare (>) a character string and a varying
790! string
791
792 op_gt = string_a > char(string_b)
793
794! Finish
795
796 return
797
798 end function op_gt_ch_vs
799
800!
801
802 elemental function op_gt_vs_ch (string_a, string_b) result (op_gt)
803
804 TYPE(varying_string), INTENT(in) :: string_a
805 character(LEN= ), INTENT(in) :: string_b
806 LOGICAL :: op_gt
807
808! Compare (>) a varying string and a character
809! string
810
811 op_gt = char(string_a) > string_b
812
813! Finish
814
815 return
816
817 end function op_gt_vs_ch
818
819!
820
821 elemental function adjustl_ (string) result (adjustl_string)
822
823 TYPE(varying_string), INTENT(in) :: string
824 TYPE(varying_string) :: adjustl_string
825
826! Adjust the varying string to the left
827
828 adjustl_string = adjustl(char(string))
829
830! Finish
831
832 return
833
834 end function adjustl_
835
836!
837
838 elemental function adjustr_ (string) result (adjustr_string)
839
840 TYPE(varying_string), INTENT(in) :: string
841 TYPE(varying_string) :: adjustr_string
842
843! Adjust the varying string to the right
844
845 adjustr_string = adjustr(char(string))
846
847! Finish
848
849 return
850
851 end function adjustr_
852
853!
854
855 pure function char_auto (string) result (char_string)
856
857 TYPE(varying_string), INTENT(in) :: string
858 character(LEN=len(string)) :: char_string
859
860 INTEGER :: i_char
861
862! Convert a varying string into a character string
863! (automatic length)
864
865 forall(i_char = 1:len(string))
866 char_string(i_char:i_char) = string%chars(i_char)
867 end forall
868
869! Finish
870
871 return
872
873 end function char_auto
874
875!
876
877 pure function char_fixed (string, length) result (char_string)
878
879 TYPE(varying_string), INTENT(in) :: string
880 INTEGER, INTENT(in) :: length
881 character(LEN=length) :: char_string
882
883! Convert a varying string into a character string
884! (fixed length)
885
886 char_string = char(string)
887
888! Finish
889
890 return
891
892 end function char_fixed
893
894!
895
896 elemental function iachar_ (c) result (i)
897
898 TYPE(varying_string), INTENT(in) :: c
899 INTEGER :: i
900
901! Get the position in the ISO 646 collating sequence
902! of a varying string character
903
904 i = ichar(char(c))
905
906! Finish
907
908 return
909
910 end function iachar_
911
912!
913
914 elemental function ichar_ (c) result (i)
915
916 TYPE(varying_string), INTENT(in) :: c
917 INTEGER :: i
918
919! Get the position in the processor collating
920! sequence of a varying string character
921
922 i = ichar(char(c))
923
924! Finish
925
926 return
927
928 end function ichar_
929
930!
931
932 elemental function index_vs_vs (string, substring, back) result (i_substring)
933
934 TYPE(varying_string), INTENT(in) :: string
935 TYPE(varying_string), INTENT(in) :: substring
936 LOGICAL, INTENT(in), optional :: back
937 INTEGER :: i_substring
938
939! Get the index of a varying substring within a
940! varying string
941
942 i_substring = index(char(string), char(substring), back)
943
944! Finish
945
946 return
947
948 end function index_vs_vs
949
950!
951
952 elemental function index_ch_vs (string, substring, back) result (i_substring)
953
954 character(LEN= ), INTENT(in) :: string
955 TYPE(varying_string), INTENT(in) :: substring
956 LOGICAL, INTENT(in), optional :: back
957 INTEGER :: i_substring
958
959! Get the index of a varying substring within a
960! character string
961
962 i_substring = index(string, char(substring), back)
963
964! Finish
965
966 return
967
968 end function index_ch_vs
969
970!
971
972 elemental function index_vs_ch (string, substring, back) result (i_substring)
973
974 TYPE(varying_string), INTENT(in) :: string
975 character(LEN= ), INTENT(in) :: substring
976 LOGICAL, INTENT(in), optional :: back
977 INTEGER :: i_substring
978
979! Get the index of a character substring within a
980! varying string
981
982 i_substring = index(char(string), substring, back)
983
984! Finish
985
986 return
987
988 end function index_vs_ch
989
990!
991
992 elemental function len_ (string) result (length)
993
994 TYPE(varying_string), INTENT(in) :: string
995 INTEGER :: length
996
997! Get the length of a varying string
998
999 if(ALLOCATED(string%chars)) then
1000 length = SIZE(string%chars)
1001 else
1002 length = 0
1003 end if
1004
1005! Finish
1006
1007 return
1008
1009 end function len_
1010
1011!
1012
1013 elemental function len_trim_ (string) result (length)
1014
1015 TYPE(varying_string), INTENT(in) :: string
1016 INTEGER :: length
1017
1018! Get the trimmed length of a varying string
1019
1020 if(ALLOCATED(string%chars)) then
1021 length = len_trim(char(string))
1022 else
1023 length = 0
1024 end if
1025
1026! Finish
1027
1028 return
1029
1030 end function len_trim_
1031
1032!
1033
1034 elemental function lge_vs_vs (string_a, string_b) result (comp)
1035
1036 TYPE(varying_string), INTENT(in) :: string_a
1037 TYPE(varying_string), INTENT(in) :: string_b
1038 LOGICAL :: comp
1039
1040! Compare (LGE) two varying strings
1041
1042 comp = (char(string_a) >= char(string_b))
1043
1044! Finish
1045
1046 return
1047
1048 end function lge_vs_vs
1049
1050!
1051
1052 elemental function lge_ch_vs (string_a, string_b) result (comp)
1053
1054 character(LEN= ), INTENT(in) :: string_a
1055 TYPE(varying_string), INTENT(in) :: string_b
1056 LOGICAL :: comp
1057
1058! Compare (LGE) a character string and a varying
1059! string
1060
1061 comp = (string_a >= char(string_b))
1062
1063! Finish
1064
1065 return
1066
1067 end function lge_ch_vs
1068
1069!
1070
1071 elemental function lge_vs_ch (string_a, string_b) result (comp)
1072
1073 TYPE(varying_string), INTENT(in) :: string_a
1074 character(LEN= ), INTENT(in) :: string_b
1075 LOGICAL :: comp
1076
1077! Compare (LGE) a varying string and a character
1078! string
1079
1080 comp = (char(string_a) >= string_b)
1081
1082! Finish
1083
1084 return
1085
1086 end function lge_vs_ch
1087
1088!
1089
1090 elemental function lgt_vs_vs (string_a, string_b) result (comp)
1091
1092 TYPE(varying_string), INTENT(in) :: string_a
1093 TYPE(varying_string), INTENT(in) :: string_b
1094 LOGICAL :: comp
1095
1096! Compare (LGT) two varying strings
1097
1098 comp = (char(string_a) > char(string_b))
1099
1100! Finish
1101
1102 return
1103
1104 end function lgt_vs_vs
1105
1106!
1107
1108 elemental function lgt_ch_vs (string_a, string_b) result (comp)
1109
1110 character(LEN= ), INTENT(in) :: string_a
1111 TYPE(varying_string), INTENT(in) :: string_b
1112 LOGICAL :: comp
1113
1114! Compare (LGT) a character string and a varying
1115! string
1116
1117 comp = (string_a > char(string_b))
1118
1119! Finish
1120
1121 return
1122
1123 end function lgt_ch_vs
1124
1125!
1126
1127 elemental function lgt_vs_ch (string_a, string_b) result (comp)
1128
1129 TYPE(varying_string), INTENT(in) :: string_a
1130 character(LEN= ), INTENT(in) :: string_b
1131 LOGICAL :: comp
1132
1133! Compare (LGT) a varying string and a character
1134! string
1135
1136 comp = (char(string_a) > string_b)
1137
1138! Finish
1139
1140 return
1141
1142 end function lgt_vs_ch
1143
1144!
1145
1146 elemental function lle_vs_vs (string_a, string_b) result (comp)
1147
1148 TYPE(varying_string), INTENT(in) :: string_a
1149 TYPE(varying_string), INTENT(in) :: string_b
1150 LOGICAL :: comp
1151
1152! Compare (LLE) two varying strings
1153
1154 comp = (char(string_a) <= char(string_b))
1155
1156! Finish
1157
1158 return
1159
1160 end function lle_vs_vs
1161
1162!
1163
1164 elemental function lle_ch_vs (string_a, string_b) result (comp)
1165
1166 character(LEN= ), INTENT(in) :: string_a
1167 TYPE(varying_string), INTENT(in) :: string_b
1168 LOGICAL :: comp
1169
1170! Compare (LLE) a character string and a varying
1171! string
1172
1173 comp = (string_a <= char(string_b))
1174
1175! Finish
1176
1177 return
1178
1179 end function lle_ch_vs
1180
1181!
1182
1183 elemental function lle_vs_ch (string_a, string_b) result (comp)
1184
1185 TYPE(varying_string), INTENT(in) :: string_a
1186 character(LEN= ), INTENT(in) :: string_b
1187 LOGICAL :: comp
1188
1189! Compare (LLE) a varying string and a character
1190! string
1191
1192 comp = (char(string_a) <= string_b)
1193
1194! Finish
1195
1196 return
1197
1198 end function lle_vs_ch
1199
1200!
1201
1202 elemental function llt_vs_vs (string_a, string_b) result (comp)
1203
1204 TYPE(varying_string), INTENT(in) :: string_a
1205 TYPE(varying_string), INTENT(in) :: string_b
1206 LOGICAL :: comp
1207
1208! Compare (LLT) two varying strings
1209
1210 comp = (char(string_a) < char(string_b))
1211
1212! Finish
1213
1214 return
1215
1216 end function llt_vs_vs
1217
1218!
1219
1220 elemental function llt_ch_vs (string_a, string_b) result (comp)
1221
1222 character(LEN= ), INTENT(in) :: string_a
1223 TYPE(varying_string), INTENT(in) :: string_b
1224 LOGICAL :: comp
1225
1226! Compare (LLT) a character string and a varying
1227! string
1228
1229 comp = (string_a < char(string_b))
1230
1231! Finish
1232
1233 return
1234
1235 end function llt_ch_vs
1236
1237!
1238
1239 elemental function llt_vs_ch (string_a, string_b) result (comp)
1240
1241 TYPE(varying_string), INTENT(in) :: string_a
1242 character(LEN= ), INTENT(in) :: string_b
1243 LOGICAL :: comp
1244
1245! Compare (LLT) a varying string and a character
1246! string
1247
1248 comp = (char(string_a) < string_b)
1249
1250! Finish
1251
1252 return
1253
1254 end function llt_vs_ch
1255
1256!
1257
1258 elemental function repeat_ (string, ncopies) result (repeat_string)
1259
1260 TYPE(varying_string), INTENT(in) :: string
1261 INTEGER, INTENT(in) :: ncopies
1262 TYPE(varying_string) :: repeat_string
1263
1264! Concatenate several copies of a varying string
1265
1266 repeat_string = var_str(repeat(char(string), ncopies))
1267
1268! Finish
1269
1270 return
1271
1272 end function repeat_
1273
1274!
1275
1276 elemental function scan_vs_vs (string, set, back) result (i)
1277
1278 TYPE(varying_string), INTENT(in) :: string
1279 TYPE(varying_string), INTENT(in) :: set
1280 LOGICAL, INTENT(in), optional :: back
1281 INTEGER :: i
1282
1283! Scan a varying string for occurrences of
1284! characters in a varying-string set
1285
1286 i = scan(char(string), char(set), back)
1287
1288! Finish
1289
1290 return
1291
1292 end function scan_vs_vs
1293
1294!
1295
1296 elemental function scan_ch_vs (string, set, back) result (i)
1297
1298 character(LEN= ), INTENT(in) :: string
1299 TYPE(varying_string), INTENT(in) :: set
1300 LOGICAL, INTENT(in), optional :: back
1301 INTEGER :: i
1302
1303! Scan a character string for occurrences of
1304! characters in a varying-string set
1305
1306 i = scan(string, char(set), back)
1307
1308! Finish
1309
1310 return
1311
1312 end function scan_ch_vs
1313
1314!
1315
1316 elemental function scan_vs_ch (string, set, back) result (i)
1317
1318 TYPE(varying_string), INTENT(in) :: string
1319 character(LEN= ), INTENT(in) :: set
1320 LOGICAL, INTENT(in), optional :: back
1321 INTEGER :: i
1322
1323! Scan a varying string for occurrences of
1324! characters in a character-string set
1325
1326 i = scan(char(string), set, back)
1327
1328! Finish
1329
1330 return
1331
1332 end function scan_vs_ch
1333
1334!
1335
1336 elemental function trim_ (string) result (trim_string)
1337
1338 TYPE(varying_string), INTENT(in) :: string
1339 TYPE(varying_string) :: trim_string
1340
1341! Remove trailing blanks from a varying string
1342
1343 trim_string = trim(char(string))
1344
1345! Finish
1346
1347 return
1348
1349 end function trim_
1350
1351!
1352
1353 elemental function verify_vs_vs (string, set, back) result (i)
1354
1355 TYPE(varying_string), INTENT(in) :: string
1356 TYPE(varying_string), INTENT(in) :: set
1357 LOGICAL, INTENT(in), optional :: back
1358 INTEGER :: i
1359
1360! Verify a varying string for occurrences of
1361! characters in a varying-string set
1362
1363 i = verify(char(string), char(set), back)
1364
1365! Finish
1366
1367 return
1368
1369 end function verify_vs_vs
1370
1371!
1372
1373 elemental function verify_ch_vs (string, set, back) result (i)
1374
1375 character(LEN= ), INTENT(in) :: string
1376 TYPE(varying_string), INTENT(in) :: set
1377 LOGICAL, INTENT(in), optional :: back
1378 INTEGER :: i
1379
1380! Verify a character string for occurrences of
1381! characters in a varying-string set
1382
1383 i = verify(string, char(set), back)
1384
1385! Finish
1386
1387 return
1388
1389 end function verify_ch_vs
1390
1391!
1392
1393 elemental function verify_vs_ch (string, set, back) result (i)
1394
1395 TYPE(varying_string), INTENT(in) :: string
1396 character(LEN= ), INTENT(in) :: set
1397 LOGICAL, INTENT(in), optional :: back
1398 INTEGER :: i
1399
1400! Verify a varying string for occurrences of
1401! characters in a character-string set
1402
1403 i = verify(char(string), set, back)
1404
1405! Finish
1406
1407 return
1408
1409 end function verify_vs_ch
1410
1411!
1412
1413 elemental function var_str_ (char) result (string)
1414
1415 character(LEN= ), INTENT(in) :: char
1416 TYPE(varying_string) :: string
1417
1418 INTEGER :: length
1419 INTEGER :: i_char
1420
1421! Convert a character string to a varying string
1422
1423 length = len(char)
1424
1425 ALLOCATE(string%chars(length))
1426
1427 forall(i_char = 1:length)
1428 string%chars(i_char) = char(i_char:i_char)
1429 end forall
1430
1431! Finish
1432
1433 return
1434
1435 end function var_str_
1436
1437!
1438
1439 SUBROUTINE get_ (string, maxlen, iostat)
1440
1441 TYPE(varying_string), INTENT(out) :: string
1442 INTEGER, INTENT(in), optional :: maxlen
1443 INTEGER, INTENT(out), optional :: iostat
1444
1445 INTEGER :: n_chars_remain
1446 INTEGER :: n_chars_read
1447 character(LEN=GET_BUFFER_LEN) :: buffer
1448 INTEGER :: local_iostat
1449
1450! Read from the default unit into a varying string
1451
1452 string = ""
1453
1454 if(PRESENT(maxlen)) then
1455 n_chars_remain = maxlen
1456 else
1457 n_chars_remain = huge(1)
1458 end if
1459
1460 read_loop : do
1461
1462 if(n_chars_remain <= 0) return
1463
1464 n_chars_read = min(n_chars_remain, get_buffer_len)
1465
1466 if(PRESENT(iostat)) then
1467 read(unit= , fmt="(A)", advance="NO", &
1468 iostat=iostat, size=n_chars_read) buffer(:n_chars_read)
1469 if(iostat < 0) exit read_loop
1470 if(iostat > 0) return
1471 else
1472 read(unit= , fmt="(A)", advance="NO", &
1473 iostat=local_iostat, size=n_chars_read) buffer(:n_chars_read)
1474 if(local_iostat < 0) exit read_loop
1475 end if
1476
1477 string = string//buffer(:n_chars_read)
1478 n_chars_remain = n_chars_remain - n_chars_read
1479
1480 end do read_loop
1481
1482 string = string//buffer(:n_chars_read)
1483
1484! Finish (end-of-record)
1485
1486 return
1487
1488 end SUBROUTINE get_
1489
1490!
1491
1492 SUBROUTINE get_unit (unit, string, maxlen, iostat)
1493
1494 INTEGER, INTENT(in) :: unit
1495 TYPE(varying_string), INTENT(out) :: string
1496 INTEGER, INTENT(in), optional :: maxlen
1497 INTEGER, INTENT(out), optional :: iostat
1498
1499 INTEGER :: n_chars_remain
1500 INTEGER :: n_chars_read
1501 character(LEN=GET_BUFFER_LEN) :: buffer
1502 INTEGER :: local_iostat
1503
1504! Read from the specified unit into a varying string
1505
1506 string = ""
1507
1508 if(PRESENT(maxlen)) then
1509 n_chars_remain = maxlen
1510 else
1511 n_chars_remain = huge(1)
1512 end if
1513
1514 read_loop : do
1515
1516 if(n_chars_remain <= 0) return
1517
1518 n_chars_read = min(n_chars_remain, get_buffer_len)
1519
1520 if(PRESENT(iostat)) then
1521 read(unit=unit, fmt="(A)", advance="NO", &
1522 iostat=iostat, size=n_chars_read) buffer(:n_chars_read)
1523 if(iostat < 0) exit read_loop
1524 if(iostat > 0) return
1525 else
1526 read(unit=unit, fmt="(A)", advance="NO", &
1527 iostat=local_iostat, size=n_chars_read) buffer(:n_chars_read)
1528 if(local_iostat < 0) exit read_loop
1529 end if
1530
1531 string = string//buffer(:n_chars_read)
1532 n_chars_remain = n_chars_remain - n_chars_read
1533
1534 end do read_loop
1535
1536 string = string//buffer(:n_chars_read)
1537
1538! Finish (end-of-record)
1539
1540 return
1541
1542 end SUBROUTINE get_unit
1543
1544!
1545
1546 SUBROUTINE get_set_vs (string, set, separator, maxlen, iostat)
1547
1548 TYPE(varying_string), INTENT(out) :: string
1549 TYPE(varying_string), INTENT(in) :: set
1550 TYPE(varying_string), INTENT(out), optional :: separator
1551 INTEGER, INTENT(in), optional :: maxlen
1552 INTEGER, INTENT(out), optional :: iostat
1553
1554! Read from the default unit into a varying string,
1555! with a custom varying-string separator
1556
1557 call get(string, char(set), separator, maxlen, iostat)
1558
1559! Finish
1560
1561 return
1562
1563 end SUBROUTINE get_set_vs
1564
1565!
1566
1567 SUBROUTINE get_set_ch (string, set, separator, maxlen, iostat)
1568
1569 TYPE(varying_string), INTENT(out) :: string
1570 character(LEN= ), INTENT(in) :: set
1571 TYPE(varying_string), INTENT(out), optional :: separator
1572 INTEGER, INTENT(in), optional :: maxlen
1573 INTEGER, INTENT(out), optional :: iostat
1574
1575 INTEGER :: n_chars_remain
1576 character(LEN=1) :: buffer
1577 INTEGER :: i_set
1578 INTEGER :: local_iostat
1579
1580! Read from the default unit into a varying string,
1581! with a custom character-string separator
1582
1583 string = ""
1584
1585 if(PRESENT(maxlen)) then
1586 n_chars_remain = maxlen
1587 else
1588 n_chars_remain = huge(1)
1589 end if
1590
1591 if(PRESENT(separator)) separator = ""
1592
1593 read_loop : do
1594
1595 if(n_chars_remain <= 0) return
1596
1597 if(PRESENT(iostat)) then
1598 read(unit= , fmt="(A1)", advance="NO", iostat=iostat) buffer
1599 if(iostat /= 0) exit read_loop
1600 else
1601 read(unit= , fmt="(A1)", advance="NO", iostat=local_iostat) buffer
1602 if(local_iostat /= 0) exit read_loop
1603 end if
1604
1605 i_set = scan(buffer, set)
1606
1607 if(i_set == 1) then
1608 if(PRESENT(separator)) separator = buffer
1609 exit read_loop
1610 end if
1611
1612 string = string//buffer
1613 n_chars_remain = n_chars_remain - 1
1614
1615 end do read_loop
1616
1617! Finish
1618
1619 return
1620
1621 end SUBROUTINE get_set_ch
1622
1623!
1624
1625 SUBROUTINE get_unit_set_vs (unit, string, set, separator, maxlen, iostat)
1626
1627 INTEGER, INTENT(in) :: unit
1628 TYPE(varying_string), INTENT(out) :: string
1629 TYPE(varying_string), INTENT(in) :: set
1630 TYPE(varying_string), INTENT(out), optional :: separator
1631 INTEGER, INTENT(in), optional :: maxlen
1632 INTEGER, INTENT(out), optional :: iostat
1633
1634! Read from the specified unit into a varying string,
1635! with a custom varying-string separator
1636
1637 call get(unit, string, char(set), separator, maxlen, iostat)
1638
1639! Finish
1640
1641 return
1642
1643 end SUBROUTINE get_unit_set_vs
1644
1645!
1646
1647 SUBROUTINE get_unit_set_ch (unit, string, set, separator, maxlen, iostat)
1648
1649 INTEGER, INTENT(in) :: unit
1650 TYPE(varying_string), INTENT(out) :: string
1651 character(LEN= ), INTENT(in) :: set
1652 TYPE(varying_string), INTENT(out), optional :: separator
1653 INTEGER, INTENT(in), optional :: maxlen
1654 INTEGER, INTENT(out), optional :: iostat
1655
1656 INTEGER :: n_chars_remain
1657 character(LEN=1) :: buffer
1658 INTEGER :: i_set
1659 INTEGER :: local_iostat
1660
1661! Read from the default unit into a varying string,
1662! with a custom character-string separator
1663
1664 string = ""
1665
1666 if(PRESENT(maxlen)) then
1667 n_chars_remain = maxlen
1668 else
1669 n_chars_remain = huge(1)
1670 end if
1671
1672 if(PRESENT(separator)) separator = ""
1673
1674 read_loop : do
1675
1676 if(n_chars_remain <= 0) return
1677
1678 if(PRESENT(iostat)) then
1679 read(unit=unit, fmt="(A1)", advance="NO", iostat=iostat) buffer
1680 if(iostat /= 0) exit read_loop
1681 else
1682 read(unit=unit, fmt="(A1)", advance="NO", iostat=local_iostat) buffer
1683 if(local_iostat /= 0) exit read_loop
1684 end if
1685
1686 i_set = scan(buffer, set)
1687
1688 if(i_set == 1) then
1689 if(PRESENT(separator)) separator = buffer
1690 exit read_loop
1691 end if
1692
1693 string = string//buffer
1694 n_chars_remain = n_chars_remain - 1
1695
1696 end do read_loop
1697
1698! Finish
1699
1700 return
1701
1702 end SUBROUTINE get_unit_set_ch
1703
1704!
1705
1706 SUBROUTINE put_vs (string, iostat)
1707
1708 TYPE(varying_string), INTENT(in) :: string
1709 INTEGER, INTENT(out), optional :: iostat
1710
1711! Append a varying string to the current record of
1712! the default unit
1713
1714 call put(char(string), iostat)
1715
1716! Finish
1717
1718 end SUBROUTINE put_vs
1719
1720!
1721
1722 SUBROUTINE put_ch (string, iostat)
1723
1724 character(LEN= ), INTENT(in) :: string
1725 INTEGER, INTENT(out), optional :: iostat
1726
1727! Append a character string to the current record of
1728! the default unit
1729
1730 if(PRESENT(iostat)) then
1731 write(unit= , fmt="(A)", advance="NO", iostat=iostat) string
1732 else
1733 write(unit= , fmt="(A)", advance="NO") string
1734 end if
1735
1736! Finish
1737
1738 end SUBROUTINE put_ch
1739
1740!
1741
1742 SUBROUTINE put_unit_vs (unit, string, iostat)
1743
1744 INTEGER, INTENT(in) :: unit
1745 TYPE(varying_string), INTENT(in) :: string
1746 INTEGER, INTENT(out), optional :: iostat
1747
1748! Append a varying string to the current record of
1749! the specified unit
1750
1751 call put(unit, char(string), iostat)
1752
1753! Finish
1754
1755 return
1756
1757 end SUBROUTINE put_unit_vs
1758
1759!
1760
1761 SUBROUTINE put_unit_ch (unit, string, iostat)
1762
1763 INTEGER, INTENT(in) :: unit
1764 character(LEN= ), INTENT(in) :: string
1765 INTEGER, INTENT(out), optional :: iostat
1766
1767! Append a character string to the current record of
1768! the specified unit
1769
1770 if(PRESENT(iostat)) then
1771 write(unit=unit, fmt="(A)", advance="NO", iostat=iostat) string
1772 else
1773 write(unit=unit, fmt="(A)", advance="NO") string
1774 end if
1775
1776! Finish
1777
1778 return
1779
1780 end SUBROUTINE put_unit_ch
1781
1782!
1783
1784 SUBROUTINE put_line_vs (string, iostat)
1785
1786 TYPE(varying_string), INTENT(in) :: string
1787 INTEGER, INTENT(out), optional :: iostat
1788
1789! Append a varying string to the current record of
1790! the default unit, terminating the record
1791
1792 call put_line(char(string), iostat)
1793
1794! Finish
1795
1796 return
1797
1798 end SUBROUTINE put_line_vs
1799
1800!
1801
1802 SUBROUTINE put_line_ch (string, iostat)
1803
1804 character(LEN= ), INTENT(in) :: string
1805 INTEGER, INTENT(out), optional :: iostat
1806
1807! Append a varying string to the current record of
1808! the default unit, terminating the record
1809
1810 if(PRESENT(iostat)) then
1811 write(unit= , fmt="(A,/)", advance="NO", iostat=iostat) string
1812 else
1813 write(unit= , fmt="(A,/)", advance="NO") string
1814 end if
1815
1816! Finish
1817
1818 return
1819
1820 end SUBROUTINE put_line_ch
1821
1822!
1823
1824 SUBROUTINE put_line_unit_vs (unit, string, iostat)
1825
1826 INTEGER, INTENT(in) :: unit
1827 TYPE(varying_string), INTENT(in) :: string
1828 INTEGER, INTENT(out), optional :: iostat
1829
1830! Append a varying string to the current record of
1831! the specified unit, terminating the record
1832
1833 call put_line(unit, char(string), iostat)
1834
1835! Finish
1836
1837 return
1838
1839 end SUBROUTINE put_line_unit_vs
1840
1841!
1842
1843 SUBROUTINE put_line_unit_ch (unit, string, iostat)
1844
1845 INTEGER, INTENT(in) :: unit
1846 character(LEN= ), INTENT(in) :: string
1847 INTEGER, INTENT(out), optional :: iostat
1848
1849! Append a varying string to the current record of
1850! the specified unit, terminating the record
1851
1852 if(PRESENT(iostat)) then
1853 write(unit=unit, fmt="(A,/)", advance="NO", iostat=iostat) string
1854 else
1855 write(unit=unit, fmt="(A,/)", advance="NO") string
1856 end if
1857
1858! Finish
1859
1860 return
1861
1862 end SUBROUTINE put_line_unit_ch
1863
1864!
1865
1866 elemental function extract_vs (string, start, finish) result (ext_string)
1867
1868 TYPE(varying_string), INTENT(in) :: string
1869 INTEGER, INTENT(in), optional :: start
1870 INTEGER, INTENT(in), optional :: finish
1871 TYPE(varying_string) :: ext_string
1872
1873! Extract a varying substring from a varying string
1874
1875 ext_string = extract(char(string), start, finish)
1876
1877! Finish
1878
1879 return
1880
1881 end function extract_vs
1882
1883!
1884
1885 elemental function extract_ch (string, start, finish) result (ext_string)
1886
1887 character(LEN= ), INTENT(in) :: string
1888 INTEGER, INTENT(in), optional :: start
1889 INTEGER, INTENT(in), optional :: finish
1890 TYPE(varying_string) :: ext_string
1891
1892 INTEGER :: start_
1893 INTEGER :: finish_
1894
1895! Extract a varying substring from a character string
1896
1897 if(PRESENT(start)) then
1898 start_ = max(1, start)
1899 else
1900 start_ = 1
1901 end if
1902
1903 if(PRESENT(finish)) then
1904 finish_ = min(len(string), finish)
1905 else
1906 finish_ = len(string)
1907 end if
1908
1909 ext_string = var_str(string(start_:finish_))
1910
1911! Finish
1912
1913 return
1914
1915 end function extract_ch
1916
1917!
1918
1919 elemental function insert_vs_vs (string, start, substring) result (ins_string)
1920
1921 TYPE(varying_string), INTENT(in) :: string
1922 INTEGER, INTENT(in) :: start
1923 TYPE(varying_string), INTENT(in) :: substring
1924 TYPE(varying_string) :: ins_string
1925
1926! Insert a varying substring into a varying string
1927
1928 ins_string = insert(char(string), start, char(substring))
1929
1930! Finish
1931
1932 return
1933
1934 end function insert_vs_vs
1935
1936!
1937
1938 elemental function insert_ch_vs (string, start, substring) result (ins_string)
1939
1940 character(LEN= ), INTENT(in) :: string
1941 INTEGER, INTENT(in) :: start
1942 TYPE(varying_string), INTENT(in) :: substring
1943 TYPE(varying_string) :: ins_string
1944
1945! Insert a varying substring into a character string
1946
1947 ins_string = insert(string, start, char(substring))
1948
1949! Finish
1950
1951 return
1952
1953 end function insert_ch_vs
1954
1955!
1956
1957 elemental function insert_vs_ch (string, start, substring) result (ins_string)
1958
1959 TYPE(varying_string), INTENT(in) :: string
1960 INTEGER, INTENT(in) :: start
1961 character(LEN= ), INTENT(in) :: substring
1962 TYPE(varying_string) :: ins_string
1963
1964! Insert a character substring into a varying string
1965
1966 ins_string = insert(char(string), start, substring)
1967
1968! Finish
1969
1970 return
1971
1972 end function insert_vs_ch
1973
1974!
1975
1976 elemental function insert_ch_ch (string, start, substring) result (ins_string)
1977
1978 character(LEN= ), INTENT(in) :: string
1979 INTEGER, INTENT(in) :: start
1980 character(LEN= ), INTENT(in) :: substring
1981 TYPE(varying_string) :: ins_string
1982
1983 INTEGER :: start_
1984
1985! Insert a character substring into a character
1986! string
1987
1988 start_ = max(1, min(start, len(string)+1))
1989
1990 ins_string = var_str(string(:start_-1)//substring//string(start_:))
1991
1992! Finish
1993
1994 return
1995
1996 end function insert_ch_ch
1997
1998!
1999
2000 elemental function remove_vs (string, start, finish) result (rem_string)
2001
2002 TYPE(varying_string), INTENT(in) :: string
2003 INTEGER, INTENT(in), optional :: start
2004 INTEGER, INTENT(in), optional :: finish
2005 TYPE(varying_string) :: rem_string
2006
2007! Remove a substring from a varying string
2008
2009 rem_string = remove(char(string), start, finish)
2010
2011! Finish
2012
2013 return
2014
2015 end function remove_vs
2016
2017!
2018
2019 elemental function remove_ch (string, start, finish) result (rem_string)
2020
2021 character(LEN= ), INTENT(in) :: string
2022 INTEGER, INTENT(in), optional :: start
2023 INTEGER, INTENT(in), optional :: finish
2024 TYPE(varying_string) :: rem_string
2025
2026 INTEGER :: start_
2027 INTEGER :: finish_
2028
2029! Remove a substring from a character string
2030
2031 if(PRESENT(start)) then
2032 start_ = max(1, start)
2033 else
2034 start_ = 1
2035 end if
2036
2037 if(PRESENT(finish)) then
2038 finish_ = min(len(string), finish)
2039 else
2040 finish_ = len(string)
2041 end if
2042
2043 if(finish_ >= start_) then
2044 rem_string = var_str(string(:start_-1)//string(finish_+1:))
2045 else
2046 rem_string = string
2047 end if
2048
2049! Finish
2050
2051 return
2052
2053 end function remove_ch
2054
2055!
2056
2057 elemental function replace_vs_vs_auto (string, start, substring) result (rep_string)
2058
2059 TYPE(varying_string), INTENT(in) :: string
2060 INTEGER, INTENT(in) :: start
2061 TYPE(varying_string), INTENT(in) :: substring
2062 TYPE(varying_string) :: rep_string
2063
2064! Replace part of a varying string with a varying
2065! substring
2066
2067 rep_string = replace(char(string), start, max(start, 1)+len(substring)-1, char(substring))
2068
2069! Finish
2070
2071 return
2072
2073 end function replace_vs_vs_auto
2074
2075!
2076
2077 elemental function replace_ch_vs_auto (string, start, substring) result (rep_string)
2078
2079 character(LEN= ), INTENT(in) :: string
2080 INTEGER, INTENT(in) :: start
2081 TYPE(varying_string), INTENT(in) :: substring
2082 TYPE(varying_string) :: rep_string
2083
2084! Replace part of a character string with a varying
2085! substring
2086
2087 rep_string = replace(string, start, max(start, 1)+len(substring)-1, char(substring))
2088
2089! Finish
2090
2091 return
2092
2093 end function replace_ch_vs_auto
2094
2095!
2096
2097 elemental function replace_vs_ch_auto (string, start, substring) result (rep_string)
2098
2099 TYPE(varying_string), INTENT(in) :: string
2100 INTEGER, INTENT(in) :: start
2101 character(LEN= ), INTENT(in) :: substring
2102 TYPE(varying_string) :: rep_string
2103
2104! Replace part of a varying string with a character
2105! substring
2106
2107 rep_string = replace(char(string), start, max(start, 1)+len(substring)-1, substring)
2108
2109! Finish
2110
2111 return
2112
2113 end function replace_vs_ch_auto
2114
2115!
2116
2117 elemental function replace_ch_ch_auto (string, start, substring) result (rep_string)
2118
2119 character(LEN= ), INTENT(in) :: string
2120 INTEGER, INTENT(in) :: start
2121 character(LEN= ), INTENT(in) :: substring
2122 TYPE(varying_string) :: rep_string
2123
2124! Replace part of a character string with a character
2125! substring
2126
2127 rep_string = replace(string, start, max(start, 1)+len(substring)-1, substring)
2128
2129! Finish
2130
2131 return
2132
2133 end function replace_ch_ch_auto
2134
2135!
2136
2137 elemental function replace_vs_vs_fixed (string, start, finish, substring) result (rep_string)
2138
2139 TYPE(varying_string), INTENT(in) :: string
2140 INTEGER, INTENT(in) :: start
2141 INTEGER, INTENT(in) :: finish
2142 TYPE(varying_string), INTENT(in) :: substring
2143 TYPE(varying_string) :: rep_string
2144
2145! Replace part of a varying string with a varying
2146! substring
2147
2148 rep_string = replace(char(string), start, finish, char(substring))
2149
2150! Finish
2151
2152 return
2153
2154 end function replace_vs_vs_fixed
2155
2156!
2157
2158!
2159
2160 elemental function replace_ch_vs_fixed (string, start, finish, substring) result (rep_string)
2161
2162 character(LEN= ), INTENT(in) :: string
2163 INTEGER, INTENT(in) :: start
2164 INTEGER, INTENT(in) :: finish
2165 TYPE(varying_string), INTENT(in) :: substring
2166 TYPE(varying_string) :: rep_string
2167
2168! Replace part of a character string with a varying
2169! substring
2170
2171 rep_string = replace(string, start, finish, char(substring))
2172
2173! Finish
2174
2175 return
2176
2177 end function replace_ch_vs_fixed
2178
2179!
2180
2181 elemental function replace_vs_ch_fixed (string, start, finish, substring) result (rep_string)
2182
2183 TYPE(varying_string), INTENT(in) :: string
2184 INTEGER, INTENT(in) :: start
2185 INTEGER, INTENT(in) :: finish
2186 character(LEN= ), INTENT(in) :: substring
2187 TYPE(varying_string) :: rep_string
2188
2189! Replace part of a varying string with a character
2190! substring
2191
2192 rep_string = replace(char(string), start, finish, substring)
2193
2194! Finish
2195
2196 return
2197
2198 end function replace_vs_ch_fixed
2199
2200!
2201
2202 elemental function replace_ch_ch_fixed (string, start, finish, substring) result (rep_string)
2203
2204 character(LEN= ), INTENT(in) :: string
2205 INTEGER, INTENT(in) :: start
2206 INTEGER, INTENT(in) :: finish
2207 character(LEN= ), INTENT(in) :: substring
2208 TYPE(varying_string) :: rep_string
2209
2210 INTEGER :: start_
2211 INTEGER :: finish_
2212
2213! Replace part of a character string with a character
2214! substring
2215
2216 start_ = max(1, start)
2217 finish_ = min(len(string), finish)
2218
2219 if(finish_ < start_) then
2220 rep_string = insert(string, start_, substring)
2221 else
2222 rep_string = var_str(string(:start_-1)//substring//string(finish_+1:))
2223 end if
2224
2225! Finish
2226
2227 return
2228
2229 end function replace_ch_ch_fixed
2230
2231!
2232
2233 elemental function replace_vs_vs_vs_target (string, target, substring, every, back) result (rep_string)
2234
2235 TYPE(varying_string), INTENT(in) :: string
2236 TYPE(varying_string), INTENT(in) :: target
2237 TYPE(varying_string), INTENT(in) :: substring
2238 LOGICAL, INTENT(in), optional :: every
2239 LOGICAL, INTENT(in), optional :: back
2240 TYPE(varying_string) :: rep_string
2241
2242! Replace part of a varying string with a varying
2243! substring, at a location matching a varying-
2244! string target
2245
2246 rep_string = replace(char(string), char(target), char(substring), every, back)
2247
2248! Finish
2249
2250 return
2251
2252 end function replace_vs_vs_vs_target
2253
2254!
2255
2256 elemental function replace_ch_vs_vs_target (string, target, substring, every, back) result (rep_string)
2257
2258 character(LEN= ), INTENT(in) :: string
2259 TYPE(varying_string), INTENT(in) :: target
2260 TYPE(varying_string), INTENT(in) :: substring
2261 LOGICAL, INTENT(in), optional :: every
2262 LOGICAL, INTENT(in), optional :: back
2263 TYPE(varying_string) :: rep_string
2264
2265! Replace part of a character string with a varying
2266! substring, at a location matching a varying-
2267! string target
2268
2269 rep_string = replace(string, char(target), char(substring), every, back)
2270
2271! Finish
2272
2273 return
2274
2275 end function replace_ch_vs_vs_target
2276
2277!
2278
2279 elemental function replace_vs_ch_vs_target (string, target, substring, every, back) result (rep_string)
2280
2281 TYPE(varying_string), INTENT(in) :: string
2282 character(LEN= ), INTENT(in) :: target
2283 TYPE(varying_string), INTENT(in) :: substring
2284 LOGICAL, INTENT(in), optional :: every
2285 LOGICAL, INTENT(in), optional :: back
2286 TYPE(varying_string) :: rep_string
2287
2288! Replace part of a character string with a varying
2289! substring, at a location matching a character-
2290! string target
2291
2292 rep_string = replace(char(string), target, char(substring), every, back)
2293
2294! Finish
2295
2296 return
2297
2298 end function replace_vs_ch_vs_target
2299
2300!
2301
2302 elemental function replace_ch_ch_vs_target (string, target, substring, every, back) result (rep_string)
2303
2304 character(LEN= ), INTENT(in) :: string
2305 character(LEN= ), INTENT(in) :: target
2306 TYPE(varying_string), INTENT(in) :: substring
2307 LOGICAL, INTENT(in), optional :: every
2308 LOGICAL, INTENT(in), optional :: back
2309 TYPE(varying_string) :: rep_string
2310
2311! Replace part of a character string with a varying
2312! substring, at a location matching a character-
2313! string target
2314
2315 rep_string = replace(string, target, char(substring), every, back)
2316
2317! Finish
2318
2319 return
2320
2321 end function replace_ch_ch_vs_target
2322
2323!
2324
2325 elemental function replace_vs_vs_ch_target (string, target, substring, every, back) result (rep_string)
2326
2327 TYPE(varying_string), INTENT(in) :: string
2328 TYPE(varying_string), INTENT(in) :: target
2329 character(LEN= ), INTENT(in) :: substring
2330 LOGICAL, INTENT(in), optional :: every
2331 LOGICAL, INTENT(in), optional :: back
2332 TYPE(varying_string) :: rep_string
2333
2334! Replace part of a varying string with a character
2335! substring, at a location matching a varying-
2336! string target
2337
2338 rep_string = replace(char(string), char(target), substring, every, back)
2339
2340! Finish
2341
2342 return
2343
2344 end function replace_vs_vs_ch_target
2345
2346!
2347
2348 elemental function replace_ch_vs_ch_target (string, target, substring, every, back) result (rep_string)
2349
2350 character(LEN= ), INTENT(in) :: string
2351 TYPE(varying_string), INTENT(in) :: target
2352 character(LEN= ), INTENT(in) :: substring
2353 LOGICAL, INTENT(in), optional :: every
2354 LOGICAL, INTENT(in), optional :: back
2355 TYPE(varying_string) :: rep_string
2356
2357! Replace part of a character string with a character
2358! substring, at a location matching a varying-
2359! string target
2360
2361 rep_string = replace(string, char(target), substring, every, back)
2362
2363! Finish
2364
2365 return
2366
2367 end function replace_ch_vs_ch_target
2368
2369!
2370
2371 elemental function replace_vs_ch_ch_target (string, target, substring, every, back) result (rep_string)
2372
2373 TYPE(varying_string), INTENT(in) :: string
2374 character(LEN= ), INTENT(in) :: target
2375 character(LEN= ), INTENT(in) :: substring
2376 LOGICAL, INTENT(in), optional :: every
2377 LOGICAL, INTENT(in), optional :: back
2378 TYPE(varying_string) :: rep_string
2379
2380! Replace part of a varying string with a character
2381! substring, at a location matching a character-
2382! string target
2383
2384 rep_string = replace(char(string), target, substring, every, back)
2385
2386! Finish
2387
2388 return
2389
2390 end function replace_vs_ch_ch_target
2391
2392!
2393
2394 elemental function replace_ch_ch_ch_target (string, target, substring, every, back) result (rep_string)
2395
2396 character(LEN= ), INTENT(in) :: string
2397 character(LEN= ), INTENT(in) :: target
2398 character(LEN= ), INTENT(in) :: substring
2399 LOGICAL, INTENT(in), optional :: every
2400 LOGICAL, INTENT(in), optional :: back
2401 TYPE(varying_string) :: rep_string
2402
2403 LOGICAL :: every_
2404 LOGICAL :: back_
2405 TYPE(varying_string) :: work_string
2406 INTEGER :: length_target
2407 INTEGER :: i_target
2408
2409! Handle special cases when LEN(target) == 0. Such
2410! instances are prohibited by the standard, but
2411! since this function is elemental, no error can be
2412! thrown. Therefore, it makes sense to handle them
2413! in a sensible manner
2414
2415 if(len(target) == 0) then
2416 if(len(string) /= 0) then
2417 rep_string = string
2418 else
2419 rep_string = substring
2420 end if
2421 return
2422 end if
2423
2424! Replace part of a character string with a character
2425! substring, at a location matching a character-
2426! string target
2427
2428 if(PRESENT(every)) then
2429 every_ = every
2430 else
2431 every_ = .false.
2432 end if
2433
2434 if(PRESENT(back)) then
2435 back_ = back
2436 else
2437 back_ = .false.
2438 end if
2439
2440 rep_string = ""
2441
2442 work_string = string
2443
2444 length_target = len(target)
2445
2446 replace_loop : do
2447
2448 i_target = index(work_string, target, back_)
2449
2450 if(i_target == 0) exit replace_loop
2451
2452 if(back_) then
2453 rep_string = substring//extract(work_string, start=i_target+length_target)//rep_string
2454 work_string = extract(work_string, finish=i_target-1)
2455 else
2456 rep_string = rep_string//extract(work_string, finish=i_target-1)//substring
2457 work_string = extract(work_string, start=i_target+length_target)
2458 end if
2459
2460 if(.NOT. every_) exit replace_loop
2461
2462 end do replace_loop
2463
2464 if(back_) then
2465 rep_string = work_string//rep_string
2466 else
2467 rep_string = rep_string//work_string
2468 end if
2469
2470! Finish
2471
2472 return
2473
2474 end function replace_ch_ch_ch_target
2475
2476!
2477
2478 elemental SUBROUTINE split_vs (string, word, set, separator, back)
2479
2480 TYPE(varying_string), INTENT(inout) :: string
2481 TYPE(varying_string), INTENT(out) :: word
2482 TYPE(varying_string), INTENT(in) :: set
2483 TYPE(varying_string), INTENT(out), optional :: separator
2484 LOGICAL, INTENT(in), optional :: back
2485
2486! Split a varying string into two verying strings
2487
2488 call split_ch(string, word, char(set), separator, back)
2489
2490! Finish
2491
2492 return
2493
2494 end SUBROUTINE split_vs
2495
2496!
2497
2498 elemental SUBROUTINE split_ch (string, word, set, separator, back)
2499
2500 TYPE(varying_string), INTENT(inout) :: string
2501 TYPE(varying_string), INTENT(out) :: word
2502 character(LEN= ), INTENT(in) :: set
2503 TYPE(varying_string), INTENT(out), optional :: separator
2504 LOGICAL, INTENT(in), optional :: back
2505
2506 LOGICAL :: back_
2507 INTEGER :: i_separator
2508
2509! Split a varying string into two verying strings
2510
2511 if(PRESENT(back)) then
2512 back_ = back
2513 else
2514 back_ = .false.
2515 end if
2516
2517 i_separator = scan(string, set, back_)
2518
2519 if(i_separator /= 0) then
2520
2521 if(back_) then
2522 word = extract(string, start=i_separator+1)
2523 if(PRESENT(separator)) separator = extract(string, start=i_separator, finish=i_separator)
2524 string = extract(string, finish=i_separator-1)
2525 else
2526 word = extract(string, finish=i_separator-1)
2527 if(PRESENT(separator)) separator = extract(string, start=i_separator, finish=i_separator)
2528 string = extract(string, start=i_separator+1)
2529 end if
2530
2531 else
2532
2533 word = string
2534 if(PRESENT(separator)) separator = ""
2535 string = ""
2536
2537 end if
2538
2539! Finish
2540
2541 return
2542
2543 end SUBROUTINE split_ch
2544
2545end module iso_varying_string
2546
Synopsis : Definition of iso_varying_string module, conformant to the API specified in ISO/IEC 1539-2...