diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
commit | a5fdebc5f6375078ec1763850a4ca23ec7fe6458 (patch) | |
tree | bcf0a25c3d45a209a6e3ac37b233a4812f29c732 /ace/ARGV.cpp | |
download | ATCD-a5fdebc5f6375078ec1763850a4ca23ec7fe6458.tar.gz |
Initial revision
Diffstat (limited to 'ace/ARGV.cpp')
-rw-r--r-- | ace/ARGV.cpp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/ace/ARGV.cpp b/ace/ARGV.cpp new file mode 100644 index 00000000000..2c54a2e9c25 --- /dev/null +++ b/ace/ARGV.cpp @@ -0,0 +1,202 @@ +// ARGV.cpp +// $Id$ + +// Transforms a string BUF into an ARGV-style vector of strings. + +#define ACE_BUILD_DLL +#include "ace/Log_Msg.h" +#include "ace/ARGV.h" + +#if !defined (__ACE_INLINE__) +#include "ace/ARGV.i" +#endif /* __ACE_INLINE__ */ + +ACE_ALLOC_HOOK_DEFINE(ACE_ARGV) + +void +ACE_ARGV::dump (void) const +{ + ACE_TRACE ("ACE_ARGV::dump"); + + ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this)); + ACE_DEBUG ((LM_DEBUG, "argc_ = %d", this->argc_)); + + for (size_t i = 0; i < this->argc_; i++) + ACE_DEBUG ((LM_DEBUG, "\nargv_[%i] = %s", i, this->argv_[i])); + + ACE_DEBUG ((LM_DEBUG, "\nbuf = %s\n")); + ACE_DEBUG ((LM_DEBUG, "\n")); + ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP)); +} + +ACE_ARGV::ACE_ARGV (char buf[], + int substitute_env_args) + : argv_ (0), + argc_ (0), + buf_ (0) +{ + ACE_TRACE ("ACE_ARGV::ACE_ARGV"); + + if (buf == 0) + return; + + char *cp = buf; + + // First pass: count arguments. + + // '#' is the start-comment token.. + while (*cp != '\0' && *cp != '#') + { + // Skip whitespace.. + while (isspace (*cp)) + cp++; + + // Increment count and move to next whitespace.. + if (*cp != '\0') + this->argc_++; + + // Grok quotes.... + if (*cp == '\'' || *cp == '"') + { + char quote = *cp; + + // Scan past the string.. + for (cp++; *cp != '\0' && *cp != quote; cp++) + continue; + + // '\0' implies unmatched quote.. + if (*cp == '\0') + { + ACE_ERROR ((LM_ERROR, + "unmatched %c detected\n", quote)); + this->argc_--; + break; + } + else + cp++; + } + else // Skip over non-whitespace.... + while (*cp != '\0' && !isspace (*cp)) + cp++; + } + + // Second pass: copy arguments.. + char arg[BUFSIZ]; + + // Make a new argv vector of argc + 1 elements. + ACE_NEW (this->argv_, char *[this->argc_ + 1]); + + for (size_t i = 0; i < this->argc_; i++) + { + // Skip whitespace.. + while (isspace (*buf)) + buf++; + + // Copy next argument and move to next whitespace.. + if (*buf == '\'' || *buf == '"') + { + char quote = *buf++; + + for (cp = arg; + *buf != '\0' && *buf != quote; + buf++, cp++) + if (cp - arg < sizeof arg) + *cp = *buf; + + *cp = '\0'; + if (*buf == quote) + buf++; + } + else + { + for (cp = arg; + *buf && !isspace (*buf); + buf++, cp++) + if (cp - arg < sizeof arg) + *cp = *buf; + *cp = '\0'; + } + + // Check for environment variable substitution here. + if (substitute_env_args) + this->argv_[i] = ACE::strenvdup (arg); + else + this->argv_[i] = ACE_OS::strdup (arg); + } + + this->argv_[this->argc_] = 0; +} + +ACE_ARGV::ACE_ARGV (char *argv[], + int substitute_env_args) + : argv_ (0), + argc_ (0), + buf_ (0) +{ + ACE_TRACE ("ACE_ARGV::ACE_ARGV"); + + if (argv == 0 || argv[0] == 0) + return; + + int buf_len = 0; + + // Determine the length of the buffer. + + for (int i = 0; argv[i] != 0; i++) + { + char *temp; + + // Account for environment variables. + if (substitute_env_args + && (argv[i][0] == '$' + && (temp = ACE_OS::getenv (&argv[i][1])) != 0)) + buf_len += ACE_OS::strlen (temp); + else + buf_len += ACE_OS::strlen (argv[i]); + + // Add one for the extra space between each string. + buf_len++; + } + + // Step through all argv params and copy each one into buf; separate + // each param with white space. + + ACE_NEW (this->buf_, char[buf_len]); + + char *end = this->buf_; + + for (int j = 0; argv[j] != 0; j++) + { + char *temp; + + // Account for environment variables. + if (substitute_env_args + && (argv[j][0] == '$' + && (temp = ACE_OS::getenv (&argv[j][1])) != 0)) + end = ACE::strecpy (end, temp); + else + end = ACE::strecpy (end, argv[j]); + + // Add white space and advance the pointer. + *end++ = ' '; + } + + // Null terminate the string. + *end = '\0'; +} + +// Free up the space allocated by the constructor.. + +ACE_ARGV::~ACE_ARGV (void) +{ + ACE_TRACE ("ACE_ARGV::~ACE_ARGV"); + if (this->argv_ == 0) + return; + + for (int i = 0; this->argv_[i] != 0; i++) + ACE_OS::free ((void *) this->argv_[i]); + + ACE_OS::free ((void *) this->argv_); + delete this->buf_; +} + |