From fd9077056f7f33c60b218636ead0644d42e75a09 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Sat, 27 Mar 2021 16:50:20 -0400 Subject: Minor cleanup of the template code. Started on main program handling requests. --- captain/template.f90 | 97 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 19 deletions(-) (limited to 'captain/template.f90') diff --git a/captain/template.f90 b/captain/template.f90 index 9543c42..6b5429d 100644 --- a/captain/template.f90 +++ b/captain/template.f90 @@ -3,7 +3,8 @@ implicit none integer, parameter::VTYPE_NONE = 0, & VTYPE_STRING = 1, & - VTYPE_INTEGER = 2 + VTYPE_INTEGER = 2, & + VTYPE_LOGICAL = 3 type :: variable @@ -21,8 +22,9 @@ implicit none procedure :: set_string_value => variable_set_string_value procedure :: assign_integer => variable_assign_integer procedure :: assign_string => variable_assign_string + procedure :: assign_logical => variable_assign_logical - generic :: assign => assign_integer, assign_string + generic :: assign => assign_integer, assign_string, assign_logical end type type :: template @@ -36,12 +38,13 @@ implicit none procedure :: destroy => template_destroy procedure :: assign_integer => template_assign_integer procedure :: assign_string => template_assign_string + procedure :: assign_logical => template_assign_logical procedure :: render_unit => template_render_unit procedure :: render_filename => template_render_filename procedure :: evaluate => template_evaluate generic :: render => render_unit, render_filename - generic :: assign => assign_integer, assign_string + generic :: assign => assign_integer, assign_string, assign_logical end type contains @@ -147,6 +150,25 @@ contains call self%set_string_value(str) end subroutine variable_assign_string + + subroutine variable_assign_logical(self, name, lg) + implicit none + + class(variable)::self + character(*), intent(in)::name + logical, intent(in)::lg + + call self%set_name(name) + self%vtype = VTYPE_LOGICAL + if(lg) then + self%vint = 1 + call self%set_string_value("True") + else + self%vint = 0 + call self%set_string_value("False") + end if + + end subroutine variable_assign_logical subroutine template_init(self, filename) implicit none @@ -228,6 +250,19 @@ contains end subroutine template_assign_string + subroutine template_assign_logical(self, name, value) + implicit none + + class(template)::self + character(*), intent(in)::name + logical, intent(in)::value + integer::i + + i = template_available_variable_index(self) + call self%variables(i)%assign(name, value) + + end subroutine template_assign_logical + subroutine template_render_filename(self, filename) implicit none @@ -250,50 +285,74 @@ contains integer, intent(in)::unum character::this_char, last_char + character(len=2)::running_pair, closing_pair character(256)::brace_internals character(len=:), pointer::replacement + integer(kind=8)::input_position + + logical::writing_now + integer::input, istat, i open(newunit=input, file=self%base_filename, status="old", form="formatted", action="read") + writing_now = .true. + last_char = ' ' read(input, '(A1)', iostat=istat) this_char do while(istat == 0) - if(this_char /= '{') then - if(last_char == '{') then - write(unum, '(A1)', advance='no') last_char - end if - write(unum, '(A1)', advance='no') this_char - - ! Two curly braces - else if(last_char == '{') then + + running_pair = last_char//this_char + if(running_pair == '{{') then + + ! Future expansion + if(running_pair == '{{') then + closing_pair = '}}' + end if + brace_internals = ' ' read(input, '(A1)', iostat=istat) this_char i = 1 - do while(istat == 0 .and. .not. (this_char == '}' .and. last_char == '}')) + do while(istat == 0 .and. .not. (running_pair /= closing_pair)) brace_internals(i:i) = this_char i = i + 1 last_char = this_char read(input, '(A1)', iostat=istat) this_char + running_pair = last_char//this_char end do brace_internals(i:i) = ' ' ! Remove trailing bracket brace_internals = adjustl(brace_internals) - replacement => self%evaluate(brace_internals) + ! Simple variable + if(closing_pair == '}}') then + replacement => self%evaluate(brace_internals) + + if(associated(replacement)) then + do i=1, len_trim(replacement) + write(unum, '(A1)', advance='no') replacement(i:i) + end do + replacement => null() ! do not free - internal strings + end if + + ! Expression + else - if(associated(replacement)) then - do i=1, len_trim(replacement) - write(unum, '(A1)', advance='no') replacement(i:i) - end do - replacement => null() ! do not free - internal strings + end if + else if(last_char == '{') then + write(unum, '(A1)', advance='no') last_char + write(unum, '(A1)', advance='no') this_char + + else + write(unum, '(A1)', advance='no') this_char + end if - + last_char = this_char read(input, '(A1)', iostat=istat) this_char end do -- cgit v1.2.3