summaryrefslogtreecommitdiff
path: root/ace/OS_NS_unistd_T.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ace/OS_NS_unistd_T.inl')
-rw-r--r--ace/OS_NS_unistd_T.inl140
1 files changed, 140 insertions, 0 deletions
diff --git a/ace/OS_NS_unistd_T.inl b/ace/OS_NS_unistd_T.inl
new file mode 100644
index 00000000000..b56eb16a3c4
--- /dev/null
+++ b/ace/OS_NS_unistd_T.inl
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/OS_NS_ctype.h"
+#include "ace/Default_Constants.h"
+#include "ace/os_include/os_errno.h"
+#include "ace/OS_Memory.h"
+
+template <typename CHAR_TYPE> int
+ACE_OS::string_to_argv (CHAR_TYPE *buf,
+ int &argc,
+ CHAR_TYPE **&argv,
+ int substitute_env_args)
+{
+ // Reset the number of arguments
+ argc = 0;
+
+ if (buf == 0)
+ return -1;
+
+ CHAR_TYPE *cp = buf;
+
+ // First pass: count arguments.
+
+ // '#' is the start-comment token..
+ while (*cp != CHAR_TYPE ('\0') && *cp != CHAR_TYPE ('#'))
+ {
+ // Skip whitespace..
+ while (ACE_OS::ace_isspace (*cp))
+ cp++;
+
+ // Increment count and move to next whitespace..
+ if (*cp != CHAR_TYPE ('\0'))
+ argc++;
+
+ while (*cp != CHAR_TYPE ('\0') && !ACE_OS::ace_isspace (*cp))
+ {
+ // Grok quotes....
+ if (*cp == CHAR_TYPE ('\'') || *cp == CHAR_TYPE ('"'))
+ {
+ CHAR_TYPE quote = *cp;
+
+ // Scan past the string..
+ for (cp++; *cp != CHAR_TYPE ('\0') && *cp != quote; cp++)
+ continue;
+
+ // '\0' implies unmatched quote..
+ if (*cp == CHAR_TYPE ('\0'))
+ {
+ argc--;
+ break;
+ }
+ else
+ cp++;
+ }
+ else
+ cp++;
+ }
+ }
+
+ // Second pass: copy arguments.
+ CHAR_TYPE arg[ACE_DEFAULT_ARGV_BUFSIZ];
+ CHAR_TYPE *argp = arg;
+
+ // Make sure that the buffer we're copying into is always large
+ // enough.
+ if (cp - buf >= ACE_DEFAULT_ARGV_BUFSIZ)
+ ACE_NEW_RETURN (argp,
+ CHAR_TYPE[cp - buf + 1],
+ -1);
+
+ // Make a new argv vector of argc + 1 elements.
+ ACE_NEW_RETURN (argv,
+ CHAR_TYPE *[argc + 1],
+ -1);
+
+ CHAR_TYPE *ptr = buf;
+
+ for (int i = 0; i < argc; i++)
+ {
+ // Skip whitespace..
+ while (ACE_OS::ace_isspace (*ptr))
+ ptr++;
+
+ // Copy next argument and move to next whitespace..
+ cp = argp;
+ while (*ptr != CHAR_TYPE ('\0') && !ACE_OS::ace_isspace (*ptr))
+ if (*ptr == CHAR_TYPE ('\'') || *ptr == CHAR_TYPE ('"'))
+ {
+ CHAR_TYPE quote = *ptr++;
+
+ while (*ptr != CHAR_TYPE ('\0') && *ptr != quote)
+ *cp++ = *ptr++;
+
+ if (*ptr == quote)
+ ptr++;
+ }
+ else
+ *cp++ = *ptr++;
+
+ *cp = CHAR_TYPE ('\0');
+
+#if !defined (ACE_LACKS_ENV)
+ // Check for environment variable substitution here.
+ if (substitute_env_args)
+ {
+ ACE_TCHAR* dup = ACE_OS::strenvdup(ACE_TEXT_TO_TCHAR_IN(argp));
+ argv[i] = ACE::String_Conversion::Convert_Out< CHAR_TYPE >(dup).c_str();
+ delete[] dup;
+
+ if (argv[i] == 0)
+ {
+ if (argp != arg)
+ delete [] argp;
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ else
+#endif /* ACE_LACKS_ENV */
+ {
+ argv[i] = ACE_OS::strdup(argp);
+
+ if (argv[i] == 0)
+ {
+ if (argp != arg)
+ delete [] argp;
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ }
+
+ if (argp != arg)
+ delete [] argp;
+
+ argv[argc] = 0;
+ return 0;
+}