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

📄 asbeautifier.cpp

📁 c语言格式化源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   ASBeautifier.cpp * *   This file is a part of "Artistic Style" - an indentation and *   reformatting tool for C, C++, C# and Java source files. *   http://astyle.sourceforge.net * *   The "Artistic Style" project, including all files needed to *   compile it, is free software; you can redistribute it and/or *   modify it under the terms of the GNU Lesser General Public *   License as published by the Free Software Foundation; either *   version 2.1 of the License, or (at your option) any later *   version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU Lesser General Public License for more details. * *   You should have received a copy of the GNU Lesser General Public *   License along with this project; if not, write to the *   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *   Boston, MA  02110-1301, USA. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */#include "astyle.h"#include <algorithm>#include <iostream>#define INIT_CONTAINER(container, value)     {if ( (container) != NULL ) delete (container); (container) = (value); }#define DELETE_CONTAINER(container)          {if ( (container) != NULL ) delete (container); }namespace astyle{vector<const string*> ASBeautifier::headers;vector<const string*> ASBeautifier::nonParenHeaders;vector<const string*> ASBeautifier::preBlockStatements;vector<const string*> ASBeautifier::assignmentOperators;vector<const string*> ASBeautifier::nonAssignmentOperators;/* * initialize the static vars */void ASBeautifier::initStatic(){	static int beautifierFileType = 9;     // initialized with an invalid type	if (fileType == beautifierFileType)    // don't build unless necessary		return;	beautifierFileType = fileType;	headers.clear();	nonParenHeaders.clear();	assignmentOperators.clear();	nonAssignmentOperators.clear();	preBlockStatements.clear();	ASResource::buildHeaders(headers, fileType, true);	ASResource::buildNonParenHeaders(nonParenHeaders, fileType, true);	ASResource::buildAssignmentOperators(assignmentOperators);	ASResource::buildNonAssignmentOperators(nonAssignmentOperators);	ASResource::buildPreBlockStatements(preBlockStatements);}/** * ASBeautifier's constructor */ASBeautifier::ASBeautifier(){	waitingBeautifierStack = NULL;	activeBeautifierStack = NULL;	waitingBeautifierStackLengthStack = NULL;	activeBeautifierStackLengthStack = NULL;	headerStack  = NULL;	tempStacks = NULL;	blockParenDepthStack = NULL;	blockStatementStack = NULL;	parenStatementStack = NULL;	bracketBlockStateStack = NULL;	inStatementIndentStack = NULL;	inStatementIndentStackSizeStack = NULL;	parenIndentStack = NULL;	sourceIterator = NULL;	isMinimalConditinalIndentSet = false;	shouldForceTabIndentation = false;	setSpaceIndentation(4);	setMaxInStatementIndentLength(40);	setClassIndent(false);	setSwitchIndent(false);	setCaseIndent(false);	setBlockIndent(false);	setBracketIndent(false);	setNamespaceIndent(false);	setLabelIndent(false);	setEmptyLineFill(false);	fileType = C_TYPE;	setCStyle();	setPreprocessorIndent(false);}/** * ASBeautifier's copy constructor */ASBeautifier::ASBeautifier(const ASBeautifier &other){	// vector '=' operator performs a DEEP copy of all elements in the vector	waitingBeautifierStack  = new vector<ASBeautifier*>;	*waitingBeautifierStack = *other.waitingBeautifierStack;	activeBeautifierStack  = new vector<ASBeautifier*>;	*activeBeautifierStack = *other.activeBeautifierStack;	waitingBeautifierStackLengthStack  = new vector<int>;	*waitingBeautifierStackLengthStack = *other.waitingBeautifierStackLengthStack;	activeBeautifierStackLengthStack  = new vector<int>;	*activeBeautifierStackLengthStack = *other.activeBeautifierStackLengthStack;	headerStack  = new vector<const string*>;	*headerStack = *other.headerStack;	tempStacks = new vector<vector<const string*>*>;	vector<vector<const string*>*>::iterator iter;	for (iter = other.tempStacks->begin();	        iter != other.tempStacks->end();	        ++iter)	{		vector<const string*> *newVec = new vector<const string*>;		*newVec = **iter;		tempStacks->push_back(newVec);	}	blockParenDepthStack = new vector<int>;	*blockParenDepthStack = *other.blockParenDepthStack;	blockStatementStack = new vector<bool>;	*blockStatementStack = *other.blockStatementStack;	parenStatementStack =  new vector<bool>;	*parenStatementStack = *other.parenStatementStack;	bracketBlockStateStack = new vector<bool>;	*bracketBlockStateStack = *other.bracketBlockStateStack;	inStatementIndentStack = new vector<int>;	*inStatementIndentStack = *other.inStatementIndentStack;	inStatementIndentStackSizeStack = new vector<int>;	*inStatementIndentStackSizeStack = *other.inStatementIndentStackSizeStack;	parenIndentStack = new vector<int>;	*parenIndentStack = *other.parenIndentStack;	sourceIterator = other.sourceIterator;	// protected variables	fileType = other.fileType;	isCStyle = other.isCStyle;	isJavaStyle = other.isJavaStyle;	isSharpStyle = other.isSharpStyle;	// variables set by ASFormatter	// must also be updated in activeBeautifierStack	inLineNumber = other.inLineNumber;	lineCommentNoBeautify = other.lineCommentNoBeautify;	isNonInStatementArray = other.isNonInStatementArray;	isSharpAccessor = other.isSharpAccessor;	// private variables	indentString = other.indentString;	currentHeader = other.currentHeader;	previousLastLineHeader = other.previousLastLineHeader;	immediatelyPreviousAssignmentOp = other.immediatelyPreviousAssignmentOp;	probationHeader = other.probationHeader;	isInQuote = other.isInQuote;	isInVerbatimQuote = other.isInVerbatimQuote;	haveLineContinuationChar = other.haveLineContinuationChar;	isInComment = other.isInComment;	isInCase = other.isInCase;	isInQuestion = other.isInQuestion;	isInStatement = other.isInStatement;	isInHeader = other.isInHeader;	isInOperator = other.isInOperator;	isInTemplate = other.isInTemplate;	isInDefine = other.isInDefine;	isInDefineDefinition = other.isInDefineDefinition;	classIndent = other.classIndent;	isInClassHeader = other.isInClassHeader;	isInClassHeaderTab = other.isInClassHeaderTab;	switchIndent = other.switchIndent;	caseIndent = other.caseIndent;	namespaceIndent = other.namespaceIndent;	bracketIndent = other.bracketIndent;	blockIndent = other.blockIndent;	labelIndent = other.labelIndent;	preprocessorIndent = other.preprocessorIndent;	isInConditional = other.isInConditional;	isMinimalConditinalIndentSet = other.isMinimalConditinalIndentSet;	shouldForceTabIndentation = other.shouldForceTabIndentation;	emptyLineFill = other.emptyLineFill;	backslashEndsPrevLine = other.backslashEndsPrevLine;	blockCommentNoIndent = other.blockCommentNoIndent;	blockCommentNoBeautify = other.blockCommentNoBeautify;	previousLineProbationTab = other.previousLineProbationTab;	minConditionalIndent = other.minConditionalIndent;	parenDepth = other.parenDepth;	indentLength = other.indentLength;	blockTabCount = other.blockTabCount;	leadingWhiteSpaces = other.leadingWhiteSpaces;	maxInStatementIndent = other.maxInStatementIndent;	templateDepth = other.templateDepth;	prevFinalLineSpaceTabCount = other.prevFinalLineSpaceTabCount;	prevFinalLineTabCount = other.prevFinalLineTabCount;	defineTabCount = other.defineTabCount;	quoteChar = other.quoteChar;	prevNonSpaceCh = other.prevNonSpaceCh;	currentNonSpaceCh = other.currentNonSpaceCh;	currentNonLegalCh = other.currentNonLegalCh;	prevNonLegalCh = other.prevNonLegalCh;}/** * ASBeautifier's destructor */ASBeautifier::~ASBeautifier(){	DELETE_CONTAINER(waitingBeautifierStack);	DELETE_CONTAINER(activeBeautifierStack);	DELETE_CONTAINER(waitingBeautifierStackLengthStack);	DELETE_CONTAINER(activeBeautifierStackLengthStack);	DELETE_CONTAINER(headerStack);	DELETE_CONTAINER(tempStacks);	DELETE_CONTAINER(blockParenDepthStack);	DELETE_CONTAINER(blockStatementStack);	DELETE_CONTAINER(parenStatementStack);	DELETE_CONTAINER(bracketBlockStateStack);	DELETE_CONTAINER(inStatementIndentStack);	DELETE_CONTAINER(inStatementIndentStackSizeStack);	DELETE_CONTAINER(parenIndentStack);}/** * initialize the ASBeautifier. * * init() should be called every time a ABeautifier object is to start * beautifying a NEW source file. * init() recieves a pointer to a DYNAMICALLY CREATED ASSourceIterator object * that will be used to iterate through the source code. This object will be * deleted during the ASBeautifier's destruction, and thus should not be * deleted elsewhere. * * @param iter     a pointer to the DYNAMICALLY CREATED ASSourceIterator object. */void ASBeautifier::init(ASSourceIterator *iter){	sourceIterator = iter;	init();}/** * initialize the ASBeautifier. */void ASBeautifier::init(){	initStatic();	INIT_CONTAINER(waitingBeautifierStack,  new vector<ASBeautifier*>);	INIT_CONTAINER(activeBeautifierStack,  new vector<ASBeautifier*>);	INIT_CONTAINER(waitingBeautifierStackLengthStack, new vector<int>);	INIT_CONTAINER(activeBeautifierStackLengthStack, new vector<int>);	INIT_CONTAINER(headerStack,  new vector<const string*>);	INIT_CONTAINER(tempStacks, new vector<vector<const string*>*>);	tempStacks->push_back(new vector<const string*>);	INIT_CONTAINER(blockParenDepthStack, new vector<int>);	INIT_CONTAINER(blockStatementStack, new vector<bool>);	INIT_CONTAINER(parenStatementStack, new vector<bool>);	INIT_CONTAINER(bracketBlockStateStack, new vector<bool>);	bracketBlockStateStack->push_back(true);	INIT_CONTAINER(inStatementIndentStack, new vector<int>);	INIT_CONTAINER(inStatementIndentStackSizeStack, new vector<int>);	inStatementIndentStackSizeStack->push_back(0);	INIT_CONTAINER(parenIndentStack, new vector<int>);	immediatelyPreviousAssignmentOp = NULL;	previousLastLineHeader = NULL;	currentHeader = NULL;	isInQuote = false;	isInVerbatimQuote = false;	haveLineContinuationChar = false;	isInComment = false;	isInStatement = false;	isInCase = false;	isInQuestion = false;	isInClassHeader = false;	isInClassHeaderTab = false;	isInHeader = false;	isInOperator = false;	isInTemplate = false;	isInConditional = false;	templateDepth = 0;	parenDepth = 0;	blockTabCount = 0;	leadingWhiteSpaces = 0;	prevNonSpaceCh = '{';	currentNonSpaceCh = '{';	prevNonLegalCh = '{';	currentNonLegalCh = '{';	quoteChar = ' ';	prevFinalLineSpaceTabCount = 0;	prevFinalLineTabCount = 0;	probationHeader = NULL;	backslashEndsPrevLine = false;	isInDefine = false;	isInDefineDefinition = false;	defineTabCount = 0;	lineCommentNoBeautify = false;	blockCommentNoIndent = false;	blockCommentNoBeautify = false;	previousLineProbationTab = false;	isNonInStatementArray = false;	isSharpAccessor = false;	inLineNumber = 0;}/** * set indentation style to C/C++. */void ASBeautifier::setCStyle(){	fileType = C_TYPE;	isCStyle     = true;	isJavaStyle  = false;	isSharpStyle = false;}/** * set indentation style to Java. */void ASBeautifier::setJavaStyle(){	fileType = JAVA_TYPE;	isJavaStyle  = true;	isCStyle     = false;	isSharpStyle = false;}/** * set indentation style to C#. */void ASBeautifier::setSharpStyle(){	fileType = SHARP_TYPE;	isSharpStyle = true;	isCStyle     = false;	isJavaStyle  = false;}/** * indent using one tab per indentation */void ASBeautifier::setTabIndentation(int length, bool forceTabs){	indentString = "\t";	indentLength = length;	shouldForceTabIndentation = forceTabs;	if (!isMinimalConditinalIndentSet)		minConditionalIndent = indentLength * 2;}/** * indent using a number of spaces per indentation. * * @param   length     number of spaces per indent. */void ASBeautifier::setSpaceIndentation(int length){	indentString = string(length, ' ');	indentLength = length;	if (!isMinimalConditinalIndentSet)		minConditionalIndent = indentLength * 2;}/** * set the maximum indentation between two lines in a multi-line statement. * * @param   max     maximum indentation length. */void ASBeautifier::setMaxInStatementIndentLength(int max){	maxInStatementIndent = max;}/** * set the minimum indentation between two lines in a multi-line condition. * * @param   min     minimal indentation length. */void ASBeautifier::setMinConditionalIndentLength(int min){	minConditionalIndent = min;	isMinimalConditinalIndentSet = true;}/** * set the state of the bracket indentation option. If true, brackets will * be indented one additional indent. * * @param   state             state of option. */void ASBeautifier::setBracketIndent(bool state){	bracketIndent = state;}/** * set the state of the block indentation option. If true, entire blocks * will be indented one additional indent, similar to the GNU indent style. * * @param   state             state of option. */void ASBeautifier::setBlockIndent(bool state){	if (state)		setBracketIndent(false); // so that we don't have both bracket and block indent	blockIndent = state;}/** * set the state of the class indentation option. If true, C++ class * definitions will be indented one additional indent. * * @param   state             state of option. */void ASBeautifier::setClassIndent(bool state){	classIndent = state;}/** * set the state of the switch indentation option. If true, blocks of 'switch' * statements will be indented one additional indent. * * @param   state             state of option. */void ASBeautifier::setSwitchIndent(bool state){	switchIndent = state;}/** * set the state of the case indentation option. If true, lines of 'case' * statements will be indented one additional indent. * * @param   state             state of option. */void ASBeautifier::setCaseIndent(bool state){	caseIndent = state;}/** * set the state of the namespace indentation option. * If true, blocks of 'namespace' statements will be indented one * additional indent. Otherwise, NO indentation will be added. * * @param   state             state of option. */void ASBeautifier::setNamespaceIndent(bool state){	namespaceIndent = state;}/** * set the state of the label indentation option. * If true, labels will be indented one indent LESS than the * current indentation level. * If false, labels will be flushed to the left with NO * indent at all. * * @param   state             state of option. */void ASBeautifier::setLabelIndent(bool state){

⌨️ 快捷键说明

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