B.5.3 Valid_State_Character Procedure

The main documentation of the Valid_State_Character Procedure contains additional explanation of this code listing.

  define([REPLICATE_ROUTINE],[
    ifelse(POINTER_TOGGLE, [TRUE], [
      pushdef([TYPE], [character,*,$1])
      pushdef([Valid_State_Character_P_DIM], expand(Valid_State_Character_P_$1))
      pushdef([POINTER_ONLY], [])
      pushdef([NONPOINTER_ONLY], [!])
    ],[
      pushdef([TYPE], [character,*,$1,np])
      pushdef([Valid_State_Character_P_DIM], expand(Valid_State_Character_NP_$1))
      pushdef([POINTER_ONLY], [!])
      pushdef([NONPOINTER_ONLY], [])
    ])
    
    function Valid_State_Character_P_DIM (C) result(Valid)
  
      ! Use association information.
  
      SCALAR_ONLY use Caesar_Flags_Module, only: finalize_character_flag
  
      ! Input variable.
  
      type(TYPE) :: C              ! Variable to be checked.
                                   
      ! Output variable.           
                                   
      type(logical) :: Valid       ! Logical state.
  
      !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
      ! Start out true.
  
      Valid = .true.
  
      ! First, make sure that the variable has been allocated.
  
      POINTER_ONLY ARRAY_ONLY Valid = Valid .and. ASSOCIATED(C)
      POINTER_ONLY ARRAY_ONLY if (.not.Valid) return
  
      ! Make sure the variable has not been finalized.
  
      SCALAR_ONLY Valid = Valid .and. C /= finalize_character_flag

      ! Quiet compiler warnings by making sure C is always referenced.
      ! Note the 'or' which means that this test has no effect.

      !NONPOINTER_ONLY ARRAY_ONLY Valid = Valid .or. LEN(C) /= 0
  
      return
    end function Valid_State_Character_P_DIM

    popdef([TYPE])
    popdef([Valid_State_Character_P_DIM])
    popdef([POINTER_ONLY])
    popdef([NONPOINTER_ONLY])
  ])

  define([POINTER_TOGGLE], [TRUE])
  REPLICATE

  define([POINTER_TOGGLE], [FALSE])
  REPLICATE



Michael L. Hall