+ int iReturn = 0;
+
+ if (argc > 1 && (strcmp(s_szProgramName, fileBasename (argv[0])) == 0 || strcmp(s_szProgramName2, fileBasename (argv[0])) == 0)) {
+ argv++;
+ argc--;
+ iReturn = processCommand (argc, argv);
+ } else if (argc > 1){
+ iReturn = processCommand (argc, argv);
+ } else {
+ s_bInteractive = true;
+ char szPrompt[] = "CTSim> ";
+ std::cout << "CTSim Text Shell (Type \"quit\" to end)\n\n";
+
+ while (1) {
+#ifdef HAVE_READLINE
+ char* pszInputLine = readline (szPrompt);
+ if (! pszInputLine)
+ break;
+ if (*pszInputLine != EOS)
+ add_history (pszInputLine);
+
+#else // DONT_HAVE_READLINE
+
+ static const int s_MaxLineLength = 1024;
+ char* pszInputLine = new char [s_MaxLineLength+1];
+ std::cout << szPrompt;
+ std::cin.getline (pszInputLine, s_MaxLineLength);
+
+#ifdef DEBUG
+ std::cout << "#" << pszInputLine << "#\n";
+#endif
+
+ std::cout << std::flush;
+ std::cout << "\n";
+#endif // DONT_HAVE_READLINE
+
+ if (strncasecmp (pszInputLine, "quit", 4) == 0)
+ break;
+
+ convertStringToArgcv (pszInputLine, &argc, &argv);
+#ifdef DEBUG
+ for (unsigned int i = 0; i < argc; i++)
+ std::cout << "Token " << i << ": " << argv[i] << "\n";
+#endif
+ iReturn = processCommand (argc, argv);
+
+ delete pszInputLine;
+ }
+ }
+
+
+ return iReturn;
+}
+
+static void
+convertStringToArgcv (char* pszLine, int* piArgc, char*** pppArgv)
+{
+ char* pCurrentPos = pszLine;
+ int nTokens = 0;
+ std::vector<char*> vecpszToken;
+
+ // Process line
+ bool bInDoubleQuote = false;
+ bool bInSingleQuote = false;
+ bool bInToken = false;
+
+ while (*pCurrentPos) {
+ if (isspace (*pCurrentPos)) {
+ if (! bInToken)
+ *pCurrentPos = 0;
+ else if (bInSingleQuote || bInDoubleQuote)
+ ;
+ else { // in non-quote token
+ *pCurrentPos = 0;
+ bInToken = false;
+ }
+ }
+ else if (*pCurrentPos == '\"') {
+ if (bInSingleQuote) {
+ bInSingleQuote = false;
+ *pCurrentPos = 0;
+ } else {
+ bInSingleQuote = true;
+ if (! bInToken) {
+ bInToken = true;
+ nTokens++;
+ vecpszToken.push_back (pCurrentPos+1);
+ }
+ }
+ } else if (*pCurrentPos == '\'') {
+ if (bInDoubleQuote) {
+ bInDoubleQuote = false;
+ *pCurrentPos = 0;
+ } else {
+ bInDoubleQuote = true;
+ if (! bInToken) {
+ bInToken = true;
+ nTokens++;
+ vecpszToken.push_back (pCurrentPos+1);
+ }
+ }
+ } else if (! bInToken) { // nonwhite, non-quote character
+ bInToken = true;
+ nTokens++;
+ vecpszToken.push_back (pCurrentPos);
+ }
+
+ pCurrentPos++;