fortplot_figure_utilities.f90 Source File


Source Code

module fortplot_figure_utilities
    !! Utility functions for figure operations
    !! 
    !! This module contains utility functions that support figure operations
    !! including environment detection and user input handling.

    use, intrinsic :: iso_fortran_env, only: output_unit
    implicit none

    public :: is_interactive_environment, wait_for_user_input

contains

    function is_interactive_environment() result(interactive)
        !! Determine if we're running in an interactive environment
        !! Returns false for CI, batch, or piped environments
        logical :: interactive
        character(len=256) :: env_var
        integer :: status
        
        interactive = .false.
        
        ! Check for common CI environment variables
        call get_environment_variable("CI", env_var, status=status)
        if (status == 0) return  ! CI detected, non-interactive
        
        call get_environment_variable("GITHUB_ACTIONS", env_var, status=status) 
        if (status == 0) return  ! GitHub Actions detected, non-interactive
        
        call get_environment_variable("JENKINS_URL", env_var, status=status)
        if (status == 0) return  ! Jenkins detected, non-interactive
        
        call get_environment_variable("BUILDKITE", env_var, status=status)
        if (status == 0) return  ! Buildkite detected, non-interactive
        
        ! Check if stdin is a terminal (basic heuristic)
        ! In non-interactive environments, stdin is often redirected
        call get_environment_variable("TERM", env_var, status=status)
        if (status /= 0 .or. len_trim(env_var) == 0) return
        
        ! Default to interactive if no CI detected and TERM is set
        interactive = .true.
    end function is_interactive_environment

    subroutine wait_for_user_input()
        !! Wait for user input when blocking=true
        !! Reads a single character or line from stdin to pause execution
        !! This prevents the program from continuing until user interaction
        character(len=1) :: dummy_char
        integer :: iostat
        
        ! Prompt user for input to continue
        write(output_unit, '(A)', advance='no') 'Press Enter to continue...'
        flush(output_unit)
        
        ! Read from stdin to block until user presses Enter
        read(*, '(A)', iostat=iostat) dummy_char
        
        ! If read fails (e.g., EOF or pipe), just return without hanging
        if (iostat /= 0) then
            write(output_unit, '(A)') ' (non-interactive mode detected)'
        end if
    end subroutine wait_for_user_input

end module fortplot_figure_utilities