⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asformatter.cpp

📁 c语言格式化源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 * Unless disabled (via canBreakLine == false), first check if a * line-break has been registered, and if so break the * formatted line, and only then append the character into * the next formatted line. * * @param ch               the character to append. * @param canBreakLine     if true, a registered line-break */void ASFormatter::appendChar(char ch, bool canBreakLine){	if (canBreakLine && isInLineBreak)		breakLine();	formattedLine.append(1, ch);}/** * append a string sequence to the current formatted line. * Unless disabled (via canBreakLine == false), first check if a * line-break has been registered, and if so break the * formatted line, and only then append the sequence into * the next formatted line. * * @param sequence         the sequence to append. * @param canBreakLine     if true, a registered line-break */void ASFormatter::appendSequence(const string &sequence, bool canBreakLine){	if (canBreakLine && isInLineBreak)		breakLine();	formattedLine.append(sequence);}/** * append a space to the current formattedline, UNLESS the * last character is already a white-space character. */void ASFormatter::appendSpacePad(){	int len = formattedLine.length();	if (len > 0 && !isWhiteSpace(formattedLine[len-1]))	{		formattedLine.append(1, ' ');		spacePadNum++;	}}/** * append a space to the current formattedline, UNLESS the * next character is already a white-space character. */void ASFormatter::appendSpaceAfter(){	int len = currentLine.length();	if (charNum + 1 < len && !isWhiteSpace(currentLine[charNum+1]))	{		formattedLine.append(1, ' ');		spacePadNum++;	}}/** * register a line break for the formatted line. */void ASFormatter::breakLine(){	isLineReady = true;	isInLineBreak = false;	spacePadNum = 0;	formattedLineCommentNum = string::npos;	// queue an empty line prepend request if one exists	prependEmptyLine = isPrependPostBlockEmptyLineRequested;	readyFormattedLine =  formattedLine;	if (isAppendPostBlockEmptyLineRequested)	{		isAppendPostBlockEmptyLineRequested = false;		isPrependPostBlockEmptyLineRequested = true;	}	else	{		isPrependPostBlockEmptyLineRequested = false;	}	formattedLine = "";}/** * check if the currently reached open-bracket (i.e. '{') * opens a: * - a definition type block (such as a class or namespace), * - a command block (such as a method block) * - a static array * this method takes for granted that the current character * is an opening bracket. * * @return    the type of the opened block. */BracketType ASFormatter::getBracketType(){	BracketType returnVal;	if (previousNonWSChar == '=')		returnVal = ARRAY_TYPE;	else if (foundPreDefinitionHeader)	{		returnVal = DEFINITION_TYPE;		if (foundNamespaceHeader)			returnVal = (BracketType)(returnVal | NAMESPACE_TYPE);		else if (foundClassHeader)			returnVal = (BracketType)(returnVal | CLASS_TYPE);	}	else	{		bool isCommandType = (foundPreCommandHeader		                      || (currentHeader != NULL && isNonParenHeader)		                      || (previousCommandChar == ')')		                      || (previousCommandChar == ':' && !foundQuestionMark)		                      || (previousCommandChar == ';')		                      || ((previousCommandChar == '{' ||  previousCommandChar == '}')		                          && isPreviousBracketBlockRelated));		if (!isCommandType && isSharpStyle && isNextWordSharpAccessor())		{			isCommandType = true;			isSharpAccessor = true;		}		returnVal = (isCommandType ? COMMAND_TYPE : ARRAY_TYPE);	}	if (isOneLineBlockReached())		returnVal = (BracketType)(returnVal | SINGLE_LINE_TYPE);	TRbracket(returnVal);	return returnVal;}/** * check if the currently reached  '*' or '&' character is * a pointer-or-reference symbol, or another operator. * this method takes for granted that the current character * is either a '*' or '&'. * * @return        whether current character is a reference-or-pointer */bool ASFormatter::isPointerOrReference() const{	bool isPR;	isPR = (!isInPotentialCalculation	        || IS_A(bracketTypeStack->back(), DEFINITION_TYPE)	        || (!isLegalNameChar(previousNonWSChar)	            && previousNonWSChar != ')'	            && previousNonWSChar != ']')	       );	if (!isPR)	{		char nextChar = peekNextChar();		isPR |= (!isWhiteSpace(nextChar)		         && nextChar != '-'		         && nextChar != '('		         && nextChar != '['		         && !isLegalNameChar(nextChar));	}	return isPR;}/** * check if the currently reached '-' character is * a unary minus * this method takes for granted that the current character * is a '-'. * * @return        whether the current '-' is a unary minus. */bool ASFormatter::isUnaryMinus() const{	return ((previousOperator == &AS_RETURN || !isalnum(previousCommandChar))	        && previousCommandChar != '.'	        && previousCommandChar != ')'	        && previousCommandChar != ']');}/** * check if the currently reached '-' or '+' character is * part of an exponent, i.e. 0.2E-5. * this method takes for granted that the current character * is a '-' or '+'. * * @return        whether the current '-' is in an exponent. */bool ASFormatter::isInExponent() const{	int formattedLineLength = formattedLine.length();	if (formattedLineLength >= 2)	{		char prevPrevFormattedChar = formattedLine[formattedLineLength - 2];		char prevFormattedChar = formattedLine[formattedLineLength - 1];		return ((prevFormattedChar == 'e' || prevFormattedChar == 'E')		        && (prevPrevFormattedChar == '.' || isdigit(prevPrevFormattedChar)));	}	else		return false;}/** * check if a one-line bracket has been reached, * i.e. if the currently reached '{' character is closed * with a complimentry '}' elsewhere on the current line, *. * @return        has a one-line bracket been reached? */bool ASFormatter::isOneLineBlockReached() const{	bool isInComment = false;	bool isInQuote = false;	int bracketCount = 1;	int currentLineLength = currentLine.length();	char quoteChar = ' ';	for (int i = charNum + 1; i < currentLineLength; ++i)	{		char ch = currentLine[i];		if (isInComment)		{			if (currentLine.compare(i, 2, "*/") == 0)			{				isInComment = false;				++i;			}			continue;		}		if (ch == '\\')		{			++i;			continue;		}		if (isInQuote)		{			if (ch == quoteChar)				isInQuote = false;			continue;		}		if (ch == '"' || ch == '\'')		{			isInQuote = true;			quoteChar = ch;			continue;		}		if (currentLine.compare(i, 2, "//") == 0)			break;		if (currentLine.compare(i, 2, "/*") == 0)		{			isInComment = true;			++i;			continue;		}		if (ch == '{')			++bracketCount;		else if (ch == '}')			--bracketCount;		if (bracketCount == 0)			return true;	}	return false;}/** * check if one of a set of headers has been reached in the * current position of the current line. * * @return             a pointer to the found header. Or a NULL if no header has been reached. * @param headers      a vector of headers. * @param checkBoundry */const string *ASFormatter::findHeader(const vector<const string*> &headers, bool checkBoundry){	return ASBeautifier::findHeader(currentLine, charNum, headers, checkBoundry);}/** * check if a line begins with the specified character * i.e. if the current line begins with a open bracket. * * @return        true or false */bool ASFormatter::lineBeginsWith(char charToCheck) const{	bool beginsWith = false;	size_t i = currentLine.find_first_not_of(" \t");	if (i != string::npos)		if (currentLine[i] == charToCheck && (int) i == charNum)			beginsWith = true;	return beginsWith;}/*** peek at the next word to determine if it is a C# accessor.* will look ahead in the input file if necessary.** @return     	true if the next word is get or set.*/bool ASFormatter::isNextWordSharpAccessor() const{	bool retVal = false;	string nextLine;	size_t firstChar;	firstChar = currentLine.find_first_not_of(" \t", charNum + 1);	if (firstChar != string::npos)	{		nextLine = currentLine.substr(firstChar);		firstChar = 0;	}	else	{		// find the first non-blank line		while (hasMoreLines())		{			nextLine = sourceIterator->peekNextLine();			firstChar = nextLine.find_first_not_of(" \t");			if (firstChar != string::npos)				break;		}		sourceIterator->peekReset();	}	if (hasMoreLines())		if (findKeyword(nextLine, firstChar, "get") || findKeyword(nextLine, firstChar, "set"))			retVal = true;	return retVal;}/** * adjust comment position because of adding or deleting spaces * the spaces are added or deleted to formattedLine * spacePadNum contains the adjustment */void ASFormatter::adjustComments(void){	assert(spacePadNum != 0);	assert(currentLine.compare(charNum, 2, "//") == 0	       || currentLine.compare(charNum, 2, "/*") == 0);	// block comment must be closed on this line with nothing after it	if (currentLine.compare(charNum, 2, "/*") == 0)	{		size_t endNum = currentLine.find("*/", charNum + 2);		if (endNum == string::npos)			return;		if (currentLine.find_first_not_of(" \t", endNum + 2) != string::npos)			return;	}	size_t len = formattedLine.length();	// if spaces were removed, need to add spaces before the comment	if (spacePadNum < 0)	{		int adjust = -spacePadNum;          // make the number positive		if (formattedLine[len-1] != '\t')   // don't adjust if a tab			formattedLine.append(adjust, ' ');//		else								// comment out to avoid compiler warning//			adjust = 0;//		TRcomment(adjust);                  // trace macro	}	// if spaces were added, need to delete spaces before the comment, if possible	else if (spacePadNum > 0)	{		int adjust = spacePadNum;		if (formattedLine.find_last_not_of(' ') < len - adjust - 1		        && formattedLine[len-1] != '\t')    // don't adjust a tab			formattedLine.resize(len - adjust);		// the following are commented out to avoid a Borland compiler warning		//else		//    adjust = 0;		TRcomment(-adjust);                 // trace macro	}}/** * append the current bracket inside the end of line comments * currentChar contains the bracket, it will be appended to formattedLine * formattedLineCommentNum is the comment location on formattedLine */void ASFormatter::appendCharInsideComments(void){	if (formattedLineCommentNum == string::npos		// does the comment start on the previous line?	        || isBeforeComment())					// does a comment follow on this line?	{		appendCurrentChar();						// don't attach		return;	}	assert(formattedLine.compare(formattedLineCommentNum, 2, "//") == 0	       || formattedLine.compare(formattedLineCommentNum, 2, "/*") == 0);	// find the previous non space char	size_t end = formattedLineCommentNum;	size_t beg = formattedLine.find_last_not_of(" \t", end-1);	if (beg == string::npos)				// is the previous line comment only?	{		appendCurrentChar();				// don't attach		return;	}	beg++;	// insert the bracket	if (end - beg < 3)						// is there room to insert?		formattedLine.insert(beg, 3-end+beg, ' ');	if (formattedLine[beg] == '\t')			// don't pad with a tab		formattedLine.insert(beg, 1, ' ');	formattedLine[beg+1] = currentChar;}/** * add or remove space padding to operators * currentChar contains the paren * the operators and necessary padding will be appended to formattedLine * the calling function should have a continue statement after calling this method * * @param *newOperator     the operator to be padded */void ASFormatter::padOperators(const string *newOperator){	assert (shouldPadOperators);	assert(newOperator != NULL);	bool shouldPad = (newOperator != &AS_COLON_COLON	                  && newOperator != &AS_PAREN_PAREN	                  && newOperator != &AS_BLPAREN_BLPAREN	                  && newOperator != &AS_PLUS_PLUS	                  && newOperator != &AS_MINUS_MINUS	                  && newOperator != &AS_NOT	                  && newOperator != &AS_BIT_NOT	                  && newOperator != &AS_ARROW	                  && newOperator != &AS_OPERATOR	                  && newOperator != &AS_RETURN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -