pure_stop_and_print Program

Uses

  • program~~pure_stop_and_print~~UsesGraph program~pure_stop_and_print pure_stop_and_print module~julienne_m julienne_m program~pure_stop_and_print->module~julienne_m module~write_stuff_m write_stuff_m program~pure_stop_and_print->module~write_stuff_m module~julienne_assert_m julienne_assert_m module~julienne_m->module~julienne_assert_m module~julienne_bin_m julienne_bin_m module~julienne_m->module~julienne_bin_m module~julienne_command_line_m julienne_command_line_m module~julienne_m->module~julienne_command_line_m module~julienne_file_m julienne_file_m module~julienne_m->module~julienne_file_m module~julienne_formats_m julienne_formats_m module~julienne_m->module~julienne_formats_m module~julienne_github_ci_m julienne_github_ci_m module~julienne_m->module~julienne_github_ci_m module~julienne_multi_image_m julienne_multi_image_m module~julienne_m->module~julienne_multi_image_m module~julienne_stop_and_print_m julienne_stop_and_print_m module~julienne_m->module~julienne_stop_and_print_m module~julienne_string_m julienne_string_m module~julienne_m->module~julienne_string_m module~julienne_test_description_m julienne_test_description_m module~julienne_m->module~julienne_test_description_m module~julienne_test_diagnosis_m julienne_test_diagnosis_m module~julienne_m->module~julienne_test_diagnosis_m module~julienne_test_fixture_m julienne_test_fixture_m module~julienne_m->module~julienne_test_fixture_m module~julienne_test_harness_m julienne_test_harness_m module~julienne_m->module~julienne_test_harness_m module~julienne_test_m julienne_test_m module~julienne_m->module~julienne_test_m module~julienne_test_result_m julienne_test_result_m module~julienne_m->module~julienne_test_result_m module~julienne_test_suite_m julienne_test_suite_m module~julienne_m->module~julienne_test_suite_m module~write_stuff_m->module~julienne_m module~julienne_assert_m->module~julienne_test_diagnosis_m module~julienne_command_line_m->module~julienne_string_m module~julienne_file_m->module~julienne_string_m module~julienne_stop_and_print_m->module~julienne_string_m iso_c_binding iso_c_binding module~julienne_string_m->iso_c_binding module~julienne_test_description_m->module~julienne_string_m module~julienne_test_description_m->module~julienne_test_diagnosis_m module~julienne_test_description_m->module~julienne_test_result_m module~julienne_test_description_m->iso_c_binding module~julienne_test_diagnosis_m->module~julienne_string_m module~julienne_test_diagnosis_m->iso_c_binding iso_fortran_env iso_fortran_env module~julienne_test_diagnosis_m->iso_fortran_env module~julienne_test_fixture_m->module~julienne_test_m module~julienne_test_harness_m->module~julienne_test_fixture_m module~julienne_test_m->module~julienne_command_line_m module~julienne_test_m->module~julienne_test_description_m module~julienne_test_m->module~julienne_test_result_m module~julienne_test_result_m->module~julienne_string_m module~julienne_test_result_m->module~julienne_test_diagnosis_m module~julienne_test_suite_m->module~julienne_file_m module~julienne_test_suite_m->module~julienne_string_m

Demonstrate Julienne's support for printing during error termination inside pure procedures


Calls

program~~pure_stop_and_print~~CallsGraph program~pure_stop_and_print pure_stop_and_print interface~string_argument_present command_line_t%string_argument_present program~pure_stop_and_print->interface~string_argument_present none~argument_present command_line_t%argument_present program~pure_stop_and_print->none~argument_present none~flag_value command_line_t%flag_value program~pure_stop_and_print->none~flag_value proc~pure_subroutine pure_subroutine program~pure_stop_and_print->proc~pure_subroutine proc~usage_info usage_info program~pure_stop_and_print->proc~usage_info none~argument_present->interface~string_argument_present interface~character_argument_present command_line_t%character_argument_present none~argument_present->interface~character_argument_present interface~character_flag_value command_line_t%character_flag_value none~flag_value->interface~character_flag_value interface~string_flag_value command_line_t%string_flag_value none~flag_value->interface~string_flag_value interface~stop_and_print stop_and_print proc~pure_subroutine->interface~stop_and_print

Variables

Type Attributes Name Initial
type(command_line_t) :: command_line
character(len=:), allocatable :: file_name
character(len=:), allocatable :: stop_code

Functions

pure function usage_info() result(message)

Arguments

None

Return Value character(len=:), allocatable


Subroutines

pure subroutine pure_subroutine(print_array, print_derived_type, file)

Arguments

Type IntentOptional Attributes Name
logical, intent(in) :: print_array
logical, intent(in) :: print_derived_type
type(file_t), intent(in), optional :: file

Source Code

program pure_stop_and_print
#if HAVE_STOP_AND_PRINT_SUPPORT
  !! Demonstrate Julienne's support for printing during error termination inside pure procedures
  use julienne_m, only : &
     command_line_t &
    ,file_t &
    ,stop_and_print &
    ,string_t
  use write_stuff_m, only : write_stuff_t
  implicit none

  type(command_line_t) command_line
  character(len=:), allocatable :: stop_code, file_name

  stop_code = usage_info()
  if (      command_line%string_argument_present( [string_t("--help"), string_t("-h")                                 ] ))       stop stop_code
  if (.not. command_line%string_argument_present( [string_t("--file"), string_t("--array"), string_t("--derived-type")] )) error stop stop_code

  file_name = command_line%flag_value("--file")
  if (len(file_name) > 0) then
    call pure_subroutine(.false., .false., file_t(file_name))
  end if
  call pure_subroutine(command_line%argument_present(["--array"]), command_line%argument_present(["--derived-type"]))

contains

  pure subroutine pure_subroutine(print_array, print_derived_type, file)
    logical, intent(in) :: print_array, print_derived_type
    type(file_t), intent(in), optional :: file
    if (present(file))      call stop_and_print(header = "______________", data = file, footer = "______________")
    if (print_array)        call stop_and_print(reshape([111,211,121,221, 112,212,122,222], [2,2,2]))
    if (print_derived_type) call stop_and_print(write_stuff_t())
  end subroutine

  pure function usage_info() result(message)
    character(len=:), allocatable :: message
    message = new_line('') // new_line('') &
      // 'Usage:' // new_line('') // new_line('') &
      // '  fpm run \'  // new_line('') &
      // '     --example pure-stop-and-print \'  // new_line('') &
      // '     --compiler flang --profile release \' // new_line('') &
      // '     -- [-h|--help] | [--file <name>] | [--array] | [--derived-type]' // new_line('') // new_line('') &
      // 'where pipes (|) separate alternatives, square brackets ([]) delimit' // new_line('') &
      // 'optional arguments, and angular brackets (<>) delimit user input.' // new_line('')
   end function

#else
  error stop "Julienne's stop_and_print feature is not supported on this compiler"
#endif
end program pure_stop_and_print