Example #1
0
QString toSQLParse::indentStatement(statement &stat, int level/*SQLITEMAN, toSyntaxAnalyzer &syntax*/)
{
	QString ret;

	switch (stat.Type)
	{
	default:
		{
			QMessageBox::warning(QApplication::activeWindow(), "Sqliteman",
								 "toSQLparse: Internal error in toSQLParse, should never get here");
		}
	case statement::Block:
	{
		ret = IndentComment(level, 0, stat.Comment, false);
		int exc = 0;
		for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin();
				i != stat.subTokens().end();
				i++)
		{
			int add
			= 0;
			std::list<toSQLParse::statement>::iterator j = i;
			j++;
			if (i != stat.subTokens().begin() &&
					j != stat.subTokens().end())
				add
				= Settings.IndentLevel;
			else
				exc = 0;

			QString t;
			if ((*i).subTokens().begin() != (*i).subTokens().
					end())
				t = (*(*i).subTokens().begin()).String.toUpper();
			if (t == ("BEGIN") || t == ("WHEN") || t == ("ELSE") || t == ("ELSIF"))
				add
				= 0;
			if ((*i).Type == statement::List)
				ret += indentString(level + add
									+ exc);
			ret += indentStatement(*i, level + add
								   + exc/*SQLITEMAN , syntax*/);
			if ((*i).Type == statement::List)
			{
				int i;
				for (i = ret.length() - 1;i >= 0 && ret[i].isSpace();i--)
					;
				ret = ret.mid(0, std::max(i + 1, 0));
				ret += ("\n");
				ret += indentString(level + exc);
			}
			if (t == ("EXCEPTION"))
				exc = Settings.IndentLevel * 2;
		}
		if (Settings.EndBlockNewline && level != 0)
			ret += ("\n");
	}
	break;
	case statement::List:
	case statement::Statement:
		int maxlev = 0;
		int maxlevorig = 0;
		bool useMaxLev = false;
		bool any = true;
		int current;
		bool first;
		bool noKeyBreak = false;
		bool lineList = false;
		QString comment;
		if (stat.Type == statement::Statement)
		{
			ret = IndentComment(level, 0, stat.Comment, false);
			useMaxLev = true;
			first = true;
			current = 0;
		}
		else
		{
			for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin();
					i != stat.subTokens().end();)
			{
				if ((*i).Type != statement::Keyword)
					noKeyBreak = true;
				else
					useMaxLev = true;
				break;
			}
			current = level;
			first = true;
		}
		if (useMaxLev)
		{
			int count = 0;
			for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin();
					i != stat.subTokens().end();
					i++)
			{
				if (any)
				{
					QString upp = (*i).String.toUpper();
					if ((*i).Type == statement::Keyword &&
							upp != ("LOOP") &&
							upp != ("DO") &&
							upp != ("THEN") &&
							upp != ("AS") &&
							upp != ("IS"))
					{
						if (int((*i).String.length()) + 1 > maxlev)
							maxlev = (*i).String.length() + 1;
						count++;
						any = false;
					}
					else if (i == stat.subTokens().begin())
					{
						noKeyBreak = true;
						break;
					}
				}
				else if ((*i).Type == statement::Token)
					any = true;
				if ((*i).Type == statement::List)
					count++;
			}
			if (count <= 1 && maxlev > 0)
				maxlev--;
			maxlevorig = maxlev;
			any = true;
		}

		for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin();
				i != stat.subTokens().end();
				i++)
		{
			comment = AddComment(comment, (*i).Comment);
			QString upp = (*i).String.toUpper();

#ifdef TOPARSE_DEBUG
			printf("%s\n", (const char*)(*i).String.toUtf8());
#endif

			if ((*i).Type == statement::List)
			{
				if (Settings.OperatorSpace)
				{
					ret += (" ");
					current++;
				}
				QString t = indentStatement(*i, current/*SQLITEMAN, syntax*/);
				if (t.indexOf(("\n")) >= 0)
					current = CurrentColumn(t);
				else
					current += CurrentColumn(t);
				ret += t;
				any = true;
			}
			else if ((*i).String == (","))
			{
				if (Settings.CommaBefore)
				{
					ret += IndentComment(Settings.CommentColumn, current, comment, true);
					comment = QString::null;
					ret += indentString(level + maxlev - (Settings.OperatorSpace ? 2 : 1));
					ret += (",");
				}
				else
				{
					ret += (",");
					ret += IndentComment(Settings.CommentColumn, current + 1, comment, true);
					comment = QString::null;
					ret += indentString(level + maxlev);
				}
				current = level + maxlev;
				any = false;
				lineList = true;
			}
			else if ((*i).Type == statement::Keyword && (upp == ("LOOP") ||
					 upp == ("DO") ||
					 upp == ("THEN") ||
					 upp == ("AS") ||
					 upp == ("IS")))
			{
				if (!Settings.BlockOpenLine)
				{
					if (ret.length() > 0)
					{
						if (toIsIdent(ret.at(ret.length() - 1)) ||
								ret.at(ret.length() - 1) == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ ||
								ret.at(ret.length() - 1) == '\'' ||
								Settings.OperatorSpace)
						{
							ret += (" ");
							current++;
						}
					}
					ret += Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String;
					current += (*i).String.length();
				}
				else
				{
					ret += IndentComment(Settings.CommentColumn, current, comment, true);
					comment = QString::null;
					ret += indentString(level);
					ret += Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String;
					current = level + (*i).String.length();
				}
				any = false;
			}
			else if (any && (*i).Type == statement::Keyword && !noKeyBreak)
			{
				if (first)
					first = false;
				else
				{
					ret += IndentComment(Settings.CommentColumn, current, comment, true);
					current = 0;
					comment = QString::null;
				}
				if (current == 0)
				{
					ret += indentString(level);
					current = level;
				}
				else
					while (current < level)
					{
						ret += (" ");
						current++;
					}
				maxlev = maxlevorig;
				QString word = Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String;
				if (ret.length())
				{
					ret += QString("%1").arg(word,
											 Settings.RightSeparator ? maxlev - 1 : 1 - maxlev);
					current = level + std::max(int(word.length()), maxlev - 1);
				}
				else
				{
					ret += word;
					current = level + word.length();
				}
				any = false;
				lineList = false;
			}
			else
			{
				QString t = (*i).String;
				bool add
				= false;
				if ((*i).Type == statement::Keyword)
				{
					if (!lineList &&
							!any &&
							(*i).Type == statement::Keyword &&
							!noKeyBreak &&
							upp == ("BY"))
						add
						= true;
				}
				else
				{
					any = true;
				}
				if (isKeyword(upp) /*SQLITEMAN syntax.reservedWord(upp)*/ && Settings.KeywordUpper)
					t = upp;

				int extra;
				if (first)
				{
					first = false;
					any = false;
					extra = 0;
				}
				else
				{
					if (ret.length() > 0 &&
							!ret.at(ret.length() - 1).isSpace() &&
							(Settings.OperatorSpace || ((toIsIdent(t[0]) ||
														 t[0] == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ || t[0] == '\'') &&
														(toIsIdent(ret.at(ret.length() - 1)) ||
														 ret.at(ret.length() - 1) == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ ||
														 ret.at(ret.length() - 1) == '\'')
													   )
							)
					   )
					{
						if (t != (";") &&
								t != (".") &&
								ret.at(ret.length() - 1) != '.' &&
								current != 0)
						{
							current++;
							ret += (" ");
						}
					}
					else if (ret.length() > 2 && ret.at(ret.length() - 2) == '*' && ret.at(ret.length() - 1) == '/')
					{
						current++;
						ret += (" ");
					}
					extra = maxlev;
				}
				if (current < level + maxlev)
				{
					if (current == 0)
						ret += indentString(level + maxlev);
					else
						while (current < level + maxlev)
						{
							ret += (" ");
							current++;
						}
					current = level + maxlev;
				}
				ret += t;
				current += t.length();
				if (t.startsWith(("<<")))
				{
					ret += ("\n");
					current = 0;
				}

				if (add
				   )
					maxlev += t.length() + 1;
			}
		}
		if (stat.Type == statement::Statement)
		{
			ret += IndentComment(Settings.CommentColumn, current, comment, true);
			comment = QString::null;
			if (Settings.EndBlockNewline &&
					level == 0 &&
					stat.subTokens().begin() != stat.subTokens().end() &&
					(*stat.subTokens().rbegin()).String == (";"))
				ret += ("\n");
		}
		else if (!comment.isEmpty())
		{
			ret += IndentComment(Settings.CommentColumn, current, comment, true);
			comment = QString::null;
			ret += indentString(level - (Settings.OperatorSpace ? 2 : 1));
		}
		break;
	}
	return ret;
}
Example #2
0
int Indent_C(EBuffer *B, int Line, int PosCursor) {
    int I;
    hsState *StateMap = NULL;
    int StateLen = 0;
    int OI;

    OI = I = B->LineIndented(Line);
    if (Line == 0) {
        I = 0;
    } else {
        if (I != 0) B->IndentLine(Line, 0);
        if (B->GetMap(Line, &StateLen, &StateMap) == 0) return 0;

        switch (B->RLine(Line - 1)->StateE) {
        case hsC_Comment:
        case hsC_CPP_Comm:
            I = IndentComment(B, Line, StateLen, StateMap);
            break;
        case hsC_CPP:
            /*case hsC_CPP_Comm:*/
        case hsC_CPP_String1:
        case hsC_CPP_String2:
        case hsC_CPP_ABrace:
            I = C_INDENT;
            break;
        default:
            if (StateLen > 0) {                 // line is not empty
                if (StateMap[0] == hsC_CPP || StateMap[0] == hsC_CPP_Comm ||
                    StateMap[0] == hsC_CPP_String1 || StateMap[0] == hsC_CPP_String2 ||
                    StateMap[0] == hsC_CPP_ABrace)
                {
                    I = IndentCPP(B, Line, StateLen, 0);
                } else {
                    I = IndentNormal(B, Line, StateLen, StateMap);
		    if ((StateMap[0] == hsC_Comment
			 || StateMap[0] == hsC_CommentL
			 || StateMap[0] == hsC_CPP_Comm)
			&& ((LookAt(B, Line, 0, "/*", hsC_Comment, 0)
                             || LookAt(B, Line, 0, "/*", hsC_CPP_Comm, 0)
                             || LookAt(B, Line, 0, "//", hsC_CommentL, 0))))
                    {
                        I += C_COMMENT_OFS;
                    } else if (CheckLabel(B, Line)) {
                        if (LookAt(B, Line, 0, "case", hsC_Keyword) ||
                            LookAt(B, Line, 0, "default", hsC_Keyword) ||
                            LookAt(B, Line, 0, "public:", hsC_Keyword, 0) ||
                            LookAt(B, Line, 0, "private:", hsC_Keyword, 0) ||
                            LookAt(B, Line, 0, "protected:", hsC_Keyword, 0))
                            ;
                        else
                            I += C_COLON_OFS;
                    } //else if (LookAt(B, Line, 0, "{", hsC_Normal, 0)) {
                    //    I -= C_INDENT - C_BRACE_OFS;
                    //}
                }
            } else {
                I = IndentNormal(B, Line, 0, NULL);
            }
            break;
        }
    }
    if (StateMap)
        free(StateMap);
    if (I >= 0)
        B->IndentLine(Line, I);
    else
        I = 0;
    if (PosCursor == 1) {
        int X = B->CP.Col;

        X = X - OI + I;
        if (X < I) X = I;
        if (X < 0) X = 0;
        if (X > B->LineLen(Line)) {
            X = B->LineLen(Line);
            if (X < I) X = I;
        }
        if (B->SetPosR(X, Line) == 0) return 0;
    } else if (PosCursor == 2) {
        if (B->SetPosR(I, Line) == 0) return 0;
    }
    return 1;
}
Example #3
0
//------------------------------------------------------------------------------
const wxString& BeginScript::GetGeneratingString(Gmat::WriteMode mode,
                                                    const wxString &prefix,
                                                    const wxString &useName)
{
   //Note: This method is called only once from the ScriptInterpreter::WriteScript()
   // So all nested ScriptEvent generating string should be handled here
   
   wxString gen;
   wxString indent;
   wxString commentLine = GetCommentLine();
   wxString inlineComment = GetInlineComment();
   wxString beginPrefix = prefix;

   if (mode != Gmat::GUI_EDITOR)
   {
      if (mode == Gmat::NO_COMMENTS)
      {
         gen << prefix << wxT("BeginScript") << wxT("\n");
      }
      else
      {
         IndentComment(gen, commentLine, prefix);
         gen << prefix << wxT("BeginScript");   
         
         if (inlineComment != wxT(""))
            gen << inlineComment << wxT("\n");
         else
            gen << wxT("\n");
      }
   }
   
   #if DBGLVL_GEN_STRING
   MessageInterface::ShowMessage
      (wxT("BeginScript::GetGeneratingString() this=(%p)%s, mode=%d, prefix='%s', ")
       wxT("useName='%s'\n"), this, this->GetTypeName().c_str(), mode, prefix.c_str(),
       useName.c_str());
   #endif
   
   if (mode == Gmat::GUI_EDITOR)
      indent = wxT("");
   else
      indent = wxT("   ");
   
   GmatCommand *current = next;
   while (current != NULL)
   {      
      #if DBGLVL_GEN_STRING > 1
      MessageInterface::ShowMessage
         (wxT("BeginScript::GetGeneratingString() current=(%p)%s\n"), current,
          current->GetTypeName().c_str());
      #endif
      
      if (current->GetTypeName() != wxT("EndScript"))
      {
         // Indent whole block within Begin/EndScript
         IndentChildString(gen, current, indent, mode, prefix, useName, false);
         
         // Get command after EndScript
         current = GmatCommandUtil::GetNextCommand(current);
         
         if (current == NULL)
            IndentChildString(gen, current, indent, mode, beginPrefix, useName, true);
      }
      else
      {
         if (mode != Gmat::GUI_EDITOR)
         {
            // Indent whole block within Begin/EndScript
            IndentChildString(gen, current, indent, mode, beginPrefix, useName, true);
         }
         current = NULL;
      }
   }
   
   generatingString = gen;
   
   #if DBGLVL_GEN_STRING
   MessageInterface::ShowMessage
      (wxT("BeginScript::GetGeneratingString() returnning generatingString\n"));
   MessageInterface::ShowMessage(wxT("<<<\n%s>>>\n\n"), generatingString.c_str());
   #endif
   
   return generatingString;
}
Example #4
0
//------------------------------------------------------------------------------
const std::string& BeginScript::GetGeneratingString(Gmat::WriteMode mode,
                                                    const std::string &prefix,
                                                    const std::string &useName)
{
   //Note: This method is called only once from the ScriptInterpreter::WriteScript(),
   // so all nested ScriptEvent generating strings should be handled here.
   
   std::stringstream gen;
   std::string indent;
   std::string commentLine = GetCommentLine();
   std::string inlineComment = GetInlineComment();
   std::string beginPrefix = prefix;

   if (mode != Gmat::GUI_EDITOR)
   {
      if (mode == Gmat::NO_COMMENTS)
      {
         gen << prefix << "BeginScript" << "\n";
      }
      else
      {
         IndentComment(gen, commentLine, prefix);
         
         // Insert command name (Fix for GMT-2612, LOJ: 2012.10.22)
         //gen << prefix << "BeginScript";
         std::string tempString = prefix + "BeginScript";
         
         InsertCommandName(tempString);
         gen << tempString;
         
         if (inlineComment != "")
            gen << inlineComment << "\n";
         else
            gen << "\n";
      }
   }
   
   #if DBGLVL_GEN_STRING
   MessageInterface::ShowMessage
      ("BeginScript::GetGeneratingString() this=(%p)%s, mode=%d, prefix='%s', "
       "useName='%s'\n", this, this->GetTypeName().c_str(), mode, prefix.c_str(),
       useName.c_str());
   #endif
   
   if (mode == Gmat::GUI_EDITOR)
      indent = "";
   else
      indent = "   ";
   
   GmatCommand *current = next;
   while (current != NULL)
   {      
      #if DBGLVL_GEN_STRING > 1
      MessageInterface::ShowMessage
         ("BeginScript::GetGeneratingString() current=(%p)%s\n", current,
          current->GetTypeName().c_str());
      #endif
      
      if (current->GetTypeName() != "EndScript")
      {
         // Indent whole block within Begin/EndScript
         IndentChildString(gen, current, indent, mode, prefix, useName, false);
         
         // Get command after EndScript
         current = GmatCommandUtil::GetNextCommand(current);
         
         if (current == NULL)
            IndentChildString(gen, current, indent, mode, beginPrefix, useName, true);
      }
      else
      {
         if (mode != Gmat::GUI_EDITOR)
         {
            // Indent whole block within Begin/EndScript
            IndentChildString(gen, current, indent, mode, beginPrefix, useName, true);
         }
         else
         {
            std::string comment = current->GetCommentLine();
            #if DBGLVL_GEN_STRING
            MessageInterface::ShowMessage("   EndScript comment = '%s'\n", comment.c_str());
            #endif
            // Only indent inline comment of EndScript (LOJ: 2013.03.27)
            gen << indent << comment;
         }
         current = NULL;
      }
   }
   
   generatingString = gen.str();
   
   #if DBGLVL_GEN_STRING
   MessageInterface::ShowMessage
      ("BeginScript::GetGeneratingString() returnning generatingString\n");
   MessageInterface::ShowMessage("<<<\n%s>>>\n\n", generatingString.c_str());
   #endif
   
   return generatingString;
}