aboutsummaryrefslogtreecommitdiff
path: root/captain/template.f90
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-03-27 16:50:20 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-03-27 16:50:20 -0400
commitfd9077056f7f33c60b218636ead0644d42e75a09 (patch)
tree9010b2d5ed8d22fa1e571cdec79f8a6f0c30d66c /captain/template.f90
parent0b8ec300ca4f2f2c3ce09d14ac1eed5478ea6420 (diff)
downloadlevitating-fd9077056f7f33c60b218636ead0644d42e75a09.tar.gz
levitating-fd9077056f7f33c60b218636ead0644d42e75a09.zip
Minor cleanup of the template code. Started on main program handling requests.
Diffstat (limited to 'captain/template.f90')
-rw-r--r--captain/template.f9097
1 files changed, 78 insertions, 19 deletions
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