module layout implicit none integer, parameter::line_type_text = 1 integer, parameter::line_type_preformatted = 2 integer, parameter::line_type_link = 3 integer, parameter::line_type_indicator = 99 type::line character(len=:), allocatable::text integer::line_type type(line), pointer::next end type line contains subroutine layout_lines(first_line, rendering_engine) use render implicit none type(line), pointer::first_line class(renderer)::rendering_engine type(line), pointer::walker logical::laying_out walker => first_line laying_out = .true. call rendering_engine%prepare_for_layout() do while(laying_out) select case (walker%line_type) case (line_type_text) call render_proportional(rendering_engine, walker%text) case (line_type_preformatted) call render_preformatted(rendering_engine, walker%text) case (line_type_link) call render_link(rendering_engine, walker%text) end select laying_out = associated(walker%next) if(laying_out) then walker => walker%next end if end do end subroutine layout_lines subroutine free_lines(first_line) implicit none type(line), intent(inout), pointer::first_line type(line), pointer::walker, past walker => first_line do while(associated(walker)) if(allocated(walker%text)) then deallocate(walker%text) end if past => walker walker => walker%next deallocate(past) end do first_line => null() end subroutine free_lines end module layout