TEAM-ADA Archives

Team Ada: Ada Programming Language Advocacy


Options: Use Classic View

Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Topic: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Matthew Heaney <[log in to unmask]>
Tue, 20 Apr 1999 04:48:59 -0700
text/plain (46 lines)
"David C. Hoos, Sr." <[log in to unmask]> writes:

> Matthew Heaney's solution works if the environment variable exists,
> but raises an exception if it does not.

True, but that's a consequence of the decision to return an Ada string
as the return type.  Better is to return chars_ptr type, and let the
caller test the return value himself.

I illustrated how to do this in my follow-up post.

> This binding has the Boolean function
> POSIX.Process_Environment.Is_Environment_Variable
> which permits testing for existence before getting the value
> with a call to POSIX.Process_Environment.Environment_Value_Of.

This is the wrong way to use those functions, because you'd be
translating the env var twice (maybe - depends how it's implemented).

The proper way to handle this is to use the optional parameter (called
"Default", I think) of Env_Val_Of, to specify the value to return if the
env var isn't defined.

I use this technique all the time.  For example,


  Env_Name : constant POSIX_String := To_POSIX_String ("DELAY_TIME");

  Default : constant POSIX_String := To_POSIX_String ("5.0");

  Env_Val_As_PString : constant POSIX_String :=
    Environment_Value_Of (Env_Name, Default);

  Env_Val : constant String := To_String (Env_Val_As_PString);


  Delay_Time := Duration'Value (Env_Val);


You do not need to call Is_Env_Var.