#include <ARGV.h>
Collaboration diagram for ACE_ARGV_T< CHAR_TYPE >:
Public Member Functions | |
ACE_ARGV_T (const CHAR_TYPE buf[], bool substitute_env_args=true) | |
ACE_ARGV_T (CHAR_TYPE *argv[], bool substitute_env_args=true, bool quote_args=false) | |
ACE_ARGV_T (CHAR_TYPE *first_argv[], CHAR_TYPE *second_argv[], bool substitute_env_args=true, bool quote_args=false) | |
ACE_ARGV_T (bool substitute_env_args=true) | |
~ACE_ARGV_T (void) | |
Destructor. | |
void | dump (void) const |
Dump the state of this object. | |
int | add (const CHAR_TYPE *next_arg, bool quote_arg=false) |
int | add (CHAR_TYPE *argv[], bool quote_args=false) |
Accessor methods | |
These methods access the argument vector contained in this object. | |
const CHAR_TYPE * | operator[] (size_t index) |
CHAR_TYPE ** | argv (void) |
int | argc (void) const |
Returns the current number of arguments. | |
const CHAR_TYPE * | buf (void) |
Public Attributes | |
ACE_ALLOC_HOOK_DECLARE | |
Private Member Functions | |
ACE_ARGV_T (const ACE_ARGV_T< CHAR_TYPE > &) | |
Copy constructor not implemented. | |
ACE_ARGV_T | operator= (const ACE_ARGV_T< CHAR_TYPE > &) |
Assignment operator not implemented. | |
int | create_buf_from_queue (void) |
Creates buf_ from the queue of added args, deletes previous buf_. | |
int | string_to_argv (void) |
Converts buf_ into the CHAR_TYPE *argv[] format. | |
Private Attributes | |
bool | substitute_env_args_ |
Replace args with environment variable values? | |
bool | iterative_ |
int | argc_ |
Number of arguments in the ARGV array. | |
CHAR_TYPE ** | argv_ |
The array of string arguments. | |
CHAR_TYPE * | buf_ |
Buffer containing the contents. | |
size_t | length_ |
ACE_Unbounded_Queue< ACE_ARGV_Queue_Entry_T< CHAR_TYPE > > | queue_ |
This class can substitute environment variable values for tokens that are environment variable references (e.g., $VAR
). This only works if the token is an environment variable reference and nothing else; it doesn't substitute environment variable references within a token. For example, $HOME/file
will not substitute the value of the HOME environment variable.
Definition at line 95 of file ARGV.h.
|
Splits the specified string into an argument vector. Arguments in the string are delimited by whitespace. Whitespace-containing arguments must be enclosed in quotes, either single (') or double (").
Definition at line 79 of file ARGV.cpp. References ACE_ERROR, ACE_NEW, ACE_TEXT, ACE_TRACE, LM_ERROR, ACE_OS::strcpy(), and ACE_ARGV_T< CHAR_TYPE >::string_to_argv().
00081 : substitute_env_args_ (substitute_env_args), 00082 iterative_ (false), 00083 argc_ (0), 00084 argv_ (0), 00085 buf_ (0), 00086 length_ (0), 00087 queue_ () 00088 { 00089 ACE_TRACE ("ACE_ARGV_T::ACE_ARGV_T CHAR_TYPE[] to CHAR_TYPE *[]"); 00090 00091 if (buf == 0 || buf[0] == 0) 00092 return; 00093 00094 // Make an internal copy of the string. 00095 ACE_NEW (this->buf_, 00096 CHAR_TYPE[ACE_OS::strlen (buf) + 1]); 00097 ACE_OS::strcpy (this->buf_, buf); 00098 00099 // Create this->argv_. 00100 if (this->string_to_argv () == -1) 00101 ACE_ERROR ((LM_ERROR, 00102 ACE_TEXT ("%p\n"), 00103 ACE_TEXT ("string_to_argv"))); 00104 } |
|
Initializes the argument vector from a set of arguments. Any environment variable references are translated (if applicable) during execution of this method.
Definition at line 107 of file ARGV.cpp. References ACE_TRACE, and ACE_OS::argv_to_string().
00110 : substitute_env_args_ (substitute_env_args), 00111 iterative_ (false), 00112 argc_ (0), 00113 argv_ (0), 00114 buf_ (0), 00115 length_ (0), 00116 queue_ () 00117 { 00118 ACE_TRACE ("ACE_ARGV_T::ACE_ARGV_T CHAR_TYPE*[] to CHAR_TYPE[]"); 00119 00120 if (argv == 0 || argv[0] == 0) 00121 return; 00122 00123 this->argc_ = ACE_OS::argv_to_string (argv, 00124 this->buf_, 00125 substitute_env_args, 00126 quote_arg); 00127 } |
|
Initializes the argument vector from two combined argument vectors.
Definition at line 130 of file ARGV.cpp. References ACE_NEW, ACE_TRACE, ACE_OS::argv_to_string(), ACE_OS::strcat(), ACE_OS::strcpy(), and ACE_OS::strlen().
00134 : substitute_env_args_ (substitute_env_args), 00135 iterative_ (false), 00136 argc_ (0), 00137 argv_ (0), 00138 buf_ (0), 00139 length_ (0), 00140 queue_ () 00141 { 00142 ACE_TRACE ("ACE_ARGV_T::ACE_ARGV_T CHAR_TYPE*[] + CHAR_TYPE *[] to CHAR_TYPE[]"); 00143 00144 int first_argc = 0; 00145 int second_argc = 0; 00146 00147 CHAR_TYPE *first_buf = 0; 00148 CHAR_TYPE *second_buf = 0; 00149 00150 // convert the first argv to a string 00151 if (first_argv != 0 && first_argv[0] != 0) 00152 { 00153 first_argc = ACE_OS::argv_to_string (first_argv, 00154 first_buf, 00155 substitute_env_args, 00156 quote_args); 00157 } 00158 00159 // convert the second argv to a string 00160 if (second_argv != 0 && second_argv[0] != 0) 00161 { 00162 second_argc = ACE_OS::argv_to_string (second_argv, 00163 second_buf, 00164 substitute_env_args, 00165 quote_args); 00166 } 00167 00168 // Add the number of arguments in both the argvs. 00169 this->argc_ = first_argc + second_argc; 00170 00171 size_t buf_len = 00172 ACE_OS::strlen (first_buf) + ACE_OS::strlen (second_buf) + 1; 00173 00174 // Allocate memory to the lenght of the combined argv string. 00175 ACE_NEW (this->buf_, 00176 CHAR_TYPE[buf_len + 1]); 00177 00178 // copy the first argv string to the buffer 00179 ACE_OS::strcpy (this->buf_, first_buf); 00180 00181 // concatenate the second argv string to the buffer 00182 ACE_OS::strcat (this->buf_, second_buf); 00183 00184 // Delete the first and second buffers 00185 delete [] first_buf; 00186 delete [] second_buf; 00187 } |
|
Initialize this object so arguments can be added later using one of the add methods. This is referred to as the iterative method of adding arguments to this object. Definition at line 190 of file ARGV.cpp. References ACE_TRACE.
00191 : substitute_env_args_ (substitute_env_args), 00192 iterative_ (true), 00193 argc_ (0), 00194 argv_ (0), 00195 buf_ (0), 00196 length_ (0), 00197 queue_ () 00198 { 00199 ACE_TRACE ("ACE_ARGV_T::ACE_ARGV_T Iterative"); 00200 00201 // Nothing to do yet -- the user puts in arguments via add () 00202 } |
|
Destructor.
Definition at line 268 of file ARGV.cpp. References ACE_TRACE, ACE_ARGV_T< CHAR_TYPE >::buf_, and ACE_OS::free().
|
|
Copy constructor not implemented.
|
|
Add an array of arguments. This only works in the iterative mode.
Definition at line 256 of file ARGV.cpp. References ACE_ARGV_T< CHAR_TYPE >::add().
00257 { 00258 for (int i = 0; argv[i] != 0; i++) 00259 if (this->add (argv[i], quote_args) == -1) 00260 return -1; 00261 00262 return 0; 00263 } |
|
Add another argument. This only works in the iterative mode.
Definition at line 206 of file ARGV.cpp. References ACE_ERROR_RETURN, ACE_TEXT, ACE_ARGV_T< CHAR_TYPE >::buf_, ACE_Unbounded_Queue< ACE_ARGV_Queue_Entry_T< CHAR_TYPE > >::enqueue_tail(), ACE_OS::free(), ACE_ARGV_T< CHAR_TYPE >::iterative_, ACE_ARGV_T< CHAR_TYPE >::length_, LM_ERROR, ACE_OS::strchr(), and ACE_OS::strlen(). Referenced by ACE_ARGV_T< CHAR_TYPE >::add(), and ACE_Service_Config::parse_args_i().
00207 { 00208 // Only allow this to work in the "iterative" verion -- the 00209 // ACE_ARGVs created with the one argument constructor. 00210 if (!this->iterative_) 00211 { 00212 errno = EINVAL; 00213 return -1; 00214 } 00215 00216 this->length_ += ACE_OS::strlen (next_arg); 00217 if (quote_arg && ACE_OS::strchr (next_arg, ' ') != 0) 00218 { 00219 this->length_ += 2; 00220 if (ACE_OS::strchr (next_arg, '"') != 0) 00221 for (const CHAR_TYPE * p = next_arg; *p != '\0'; ++p) 00222 if (*p == '"') ++this->length_; 00223 } 00224 else 00225 { 00226 quote_arg = false; 00227 } 00228 00229 // Put the new argument at the end of the queue. 00230 if (this->queue_.enqueue_tail (ACE_ARGV_Queue_Entry_T<CHAR_TYPE> (next_arg, quote_arg)) == -1) 00231 ACE_ERROR_RETURN ((LM_ERROR, 00232 ACE_TEXT ("Can't add more to ARGV queue")), 00233 -1); 00234 00235 ++this->argc_; 00236 00237 // Wipe argv_ and buf_ away so that they will be recreated if the 00238 // user calls argv () or buf (). 00239 if (this->argv_ != 0) 00240 { 00241 for (int i = 0; this->argv_[i] != 0; i++) 00242 ACE_OS::free ((void *) this->argv_[i]); 00243 00244 delete [] this->argv_; 00245 this->argv_ = 0; 00246 } 00247 00248 delete [] this->buf_; 00249 this->buf_ = 0; 00250 00251 return 0; 00252 } |
|
Returns the current number of arguments.
Definition at line 43 of file ARGV.inl. References ACE_TRACE, and ACE_ARGV_T< CHAR_TYPE >::argv(). Referenced by ace_yyparse(), ACE_Service_Gestalt::initialize(), ACE_Service_Gestalt::initialize_i(), and ACE_Service_Config::parse_args_i().
00044 { 00045 ACE_TRACE ("ACE_ARGV_T::argc"); 00046 // Try to create the argv_ if it isn't there 00047 ACE_ARGV_T<CHAR_TYPE> *nonconst_this = 00048 const_cast <ACE_ARGV_T<CHAR_TYPE> *> (this); 00049 (void) nonconst_this->argv (); 00050 return this->argc_; 00051 } |
|
Returns the current argument vector. The returned pointers are to data maintained internally to this class. Do not change or delete either the pointers or the memory to which they refer. Definition at line 70 of file ARGV.inl. References ACE_TRACE, ACE_ARGV_T< CHAR_TYPE >::buf_, ACE_ARGV_T< CHAR_TYPE >::create_buf_from_queue(), ACE_ARGV_T< CHAR_TYPE >::iterative_, and ACE_ARGV_T< CHAR_TYPE >::string_to_argv(). Referenced by ace_yyparse(), ACE_ARGV_T< CHAR_TYPE >::argc(), ACE_ARGV_T< CHAR_TYPE >::dump(), ACE_Service_Gestalt::initialize(), ACE_Service_Gestalt::initialize_i(), ACE_ARGV_T< CHAR_TYPE >::operator[](), and ACE_Service_Config::parse_args_i().
00071 { 00072 ACE_TRACE ("ACE_ARGV_T::argv"); 00073 00074 // Try to create the argv_ if it isn't there 00075 if (this->argv_ == 0) 00076 { 00077 if (this->iterative_ && this->buf_ == 0) 00078 this->create_buf_from_queue (); 00079 00080 // Convert buf_ to argv_ 00081 if (this->string_to_argv () == -1) 00082 return (CHAR_TYPE **) 0; 00083 } 00084 00085 return (CHAR_TYPE **) this->argv_; 00086 } |
|
Returns a single string form of the current arguments. The returned pointer refers to memory maintained internally to this class. Do not change or delete it. Definition at line 56 of file ARGV.inl. References ACE_TRACE, ACE_ARGV_T< CHAR_TYPE >::buf_, ACE_ARGV_T< CHAR_TYPE >::create_buf_from_queue(), and ACE_ARGV_T< CHAR_TYPE >::iterative_.
00057 { 00058 ACE_TRACE ("ACE_ARGV_T::buf"); 00059 00060 if (this->buf_ == 0 && this->iterative_) 00061 this->create_buf_from_queue (); 00062 00063 return (const CHAR_TYPE *) this->buf_; 00064 } |
|
Creates buf_ from the queue of added args, deletes previous buf_.
Definition at line 285 of file ARGV.cpp. References ACE_NEW_RETURN, ACE_TRACE, ACE_Unbounded_Queue_Iterator< T >::advance(), ACE_ARGV_Queue_Entry_T< CHAR_TYPE >::arg_, ACE_ARGV_T< CHAR_TYPE >::buf_, ACE_Unbounded_Queue_Iterator< T >::done(), ACE_OS::memcpy(), ACE_Unbounded_Queue_Iterator< T >::next(), ACE_ARGV_Queue_Entry_T< CHAR_TYPE >::quote_arg_, ACE_OS::strchr(), and ACE_OS::strlen(). Referenced by ACE_ARGV_T< CHAR_TYPE >::argv(), and ACE_ARGV_T< CHAR_TYPE >::buf().
00286 { 00287 ACE_TRACE ("ACE_ARGV_T::create_buf_from_queue"); 00288 00289 // If the are no arguments, don't do anything 00290 if (this->argc_ <= 0) 00291 return -1; 00292 00293 delete [] this->buf_; 00294 00295 ACE_NEW_RETURN (this->buf_, 00296 CHAR_TYPE[this->length_ + this->argc_], 00297 -1); 00298 00299 // Get an iterator over the queue 00300 ACE_Unbounded_Queue_Iterator<ACE_ARGV_Queue_Entry_T<CHAR_TYPE> > iter (this->queue_); 00301 00302 ACE_ARGV_Queue_Entry_T<CHAR_TYPE> *arg = 0; 00303 CHAR_TYPE *ptr = this->buf_; 00304 size_t len; 00305 00306 while (!iter.done ()) 00307 { 00308 // Get next argument from the queue. 00309 iter.next (arg); 00310 iter.advance (); 00311 00312 if (arg->quote_arg_) 00313 { 00314 *ptr++ = '"'; 00315 if (ACE_OS::strchr (arg->arg_, '"') != 0) 00316 { 00317 for (const CHAR_TYPE * p = arg->arg_; *p != '\0'; ++p) 00318 { 00319 if (*p == '"') *ptr++ = '\\'; 00320 *ptr++ = *p; 00321 } 00322 } 00323 else 00324 { 00325 len = ACE_OS::strlen (arg->arg_); 00326 // Copy the argument into buf_ 00327 ACE_OS::memcpy ((void *) ptr, 00328 (const void *) (arg->arg_), 00329 len * sizeof (CHAR_TYPE)); 00330 // Move the pointer down. 00331 ptr += len; 00332 } 00333 *ptr++ = '"'; 00334 } 00335 else 00336 { 00337 len = ACE_OS::strlen (arg->arg_); 00338 // Copy the argument into buf_ 00339 ACE_OS::memcpy ((void *) ptr, 00340 (const void *) (arg->arg_), 00341 len * sizeof (CHAR_TYPE)); 00342 // Move the pointer down. 00343 ptr += len; 00344 } 00345 00346 // Put in an argument separating space. 00347 *ptr++ = ' '; 00348 } 00349 00350 // Put in the NUL terminator 00351 ptr[-1] = '\0'; 00352 00353 return 0; 00354 } |
|
Dump the state of this object.
Definition at line 39 of file ARGV.cpp. References ACE_ARGV, ACE_BEGIN_DUMP, ACE_DEBUG, ACE_END_DUMP, ACE_TEXT, ACE_TRACE, ACE_ARGV_T< CHAR_TYPE >::argv(), and LM_DEBUG.
00040 { 00041 #if defined (ACE_HAS_DUMP) 00042 ACE_TRACE ("ACE_ARGV_T::dump"); 00043 00044 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this)); 00045 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("argc_ = %d"), this->argc_)); 00046 00047 ACE_ARGV *this_obj = const_cast<ACE_ARGV *> (this); 00048 00049 for (int i = 0; i < this->argc_; i++) 00050 ACE_DEBUG ((LM_DEBUG, 00051 ACE_TEXT ("\nargv_[%i] = %s"), 00052 i, 00053 this_obj->argv ()[i])); 00054 00055 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nbuf = %s\n"), this->buf_)); 00056 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n"))); 00057 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP)); 00058 #endif /* ACE_HAS_DUMP */ 00059 } |
|
Assignment operator not implemented.
|
|
Returns the specified element of the current argument vector.
Definition at line 92 of file ARGV.inl. References ACE_TRACE, and ACE_ARGV_T< CHAR_TYPE >::argv().
|
|
Converts buf_ into the CHAR_TYPE *argv[] format.
Definition at line 68 of file ARGV.cpp. References ACE_TRACE, and ACE_OS::string_to_argv(). Referenced by ACE_ARGV_T< CHAR_TYPE >::ACE_ARGV_T(), and ACE_ARGV_T< CHAR_TYPE >::argv().
00069 { 00070 ACE_TRACE ("ACE_ARGV_T::string_to_argv"); 00071 00072 return ACE_OS::string_to_argv (this->buf_, 00073 this->argc_, 00074 this->argv_, 00075 this->substitute_env_args_); 00076 } |
|
|
|
Number of arguments in the ARGV array.
|
|
The array of string arguments.
|
|
Buffer containing the contents.
Definition at line 275 of file ARGV.h. Referenced by ACE_ARGV_T< CHAR_TYPE >::add(), ACE_ARGV_T< CHAR_TYPE >::argv(), ACE_ARGV_T< CHAR_TYPE >::buf(), ACE_ARGV_T< CHAR_TYPE >::create_buf_from_queue(), and ACE_ARGV_T< CHAR_TYPE >::~ACE_ARGV_T(). |
|
Definition at line 266 of file ARGV.h. Referenced by ACE_ARGV_T< CHAR_TYPE >::add(), ACE_ARGV_T< CHAR_TYPE >::argv(), and ACE_ARGV_T< CHAR_TYPE >::buf(). |
|
Total length of the arguments in the queue, not counting separating spaces Definition at line 279 of file ARGV.h. Referenced by ACE_ARGV_T< CHAR_TYPE >::add(). |
|
Queue which keeps user supplied arguments. This is only active in the "iterative" mode. |
|
Replace args with environment variable values?
|