diff options
author | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
---|---|---|
committer | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
commit | 1dd3124a9770e11b6684e5dd1e6bc15a0aa3bc67 (patch) | |
tree | 87a171383266dd1f64196589af081bc2f8e497c3 /tests/examplefiles/example.cpp | |
parent | f1c080e184dc1bbc36eaa7cd729ff3a499de568a (diff) | |
download | pygments-master.tar.gz |
Diffstat (limited to 'tests/examplefiles/example.cpp')
-rw-r--r-- | tests/examplefiles/example.cpp | 2363 |
1 files changed, 0 insertions, 2363 deletions
diff --git a/tests/examplefiles/example.cpp b/tests/examplefiles/example.cpp deleted file mode 100644 index 334e7ca7..00000000 --- a/tests/examplefiles/example.cpp +++ /dev/null @@ -1,2363 +0,0 @@ -/*************************************************************************** - ansigenerator.cpp - description - ------------------- - begin : Jul 5 2004 - copyright : (C) 2004 by André Simon - email : andre.simon1@gmx.de - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "ansigenerator.h" - -using namespace std; - -namespace highlight { - - -string AnsiGenerator::getOpenTag(const string&font, - const string&fgCol, const string&bgCol) { - ostringstream s; - s << "\033["<<font; - if (!fgCol.empty()) - s<<";"<<fgCol; - if (!bgCol.empty()) - s<<";"<<bgCol; - s << "m"; - return s.str(); -} - - -AnsiGenerator::AnsiGenerator(const string &colourTheme) - : CodeGenerator(colourTheme) { - styleTagOpen.push_back(""); - styleTagOpen.push_back(getOpenTag("00", "31")); //str - styleTagOpen.push_back(getOpenTag("00", "34"));//number - styleTagOpen.push_back(getOpenTag("00", "34"));//sl comment - styleTagOpen.push_back(getOpenTag("00", "34"));//ml comment - styleTagOpen.push_back(getOpenTag("00", "35"));//escapeChar - styleTagOpen.push_back(getOpenTag("00", "35"));//directive - styleTagOpen.push_back(getOpenTag("01", "31"));//directive string - styleTagOpen.push_back(getOpenTag("00", "30"));//linenum - styleTagOpen.push_back(getOpenTag("01", "00"));//symbol - - styleTagClose.push_back(""); - for (int i=1;i<NUMBER_BUILTIN_STYLES; i++) { - styleTagClose.push_back("\033[m"); - } - newLineTag = "\n"; - spacer = " "; -} - -AnsiGenerator::AnsiGenerator() {} -AnsiGenerator::~AnsiGenerator() {} - -string AnsiGenerator::getHeader(const string & title) { - return string(); -} - -void AnsiGenerator::printBody() { - processRootState(); -} - -string AnsiGenerator::getFooter() { - return string(); -} - -string AnsiGenerator::maskCharacter(unsigned char c) { - string m; - m+=c; - return m; -} - -string AnsiGenerator::getMatchingOpenTag(unsigned int styleID) { - return (styleID)?getOpenTag("01", "32", ""):getOpenTag("00", "33"); -} - -string AnsiGenerator::getMatchingCloseTag(unsigned int styleID) { - return "\033[m"; -} - -} -/*************************************************************************** - ansicode.h - description - ------------------- - begin : Jul 5 2004 - copyright : (C) 2004 by Andre Simon - email : andre.simon1@gmx.de - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef ANSIGENERATOR_H -#define ANSIGENERATOR_H - -#include <iostream> -#include <fstream> -#include <string> -#include <sstream> - -#include "codegenerator.h" -#include "charcodes.h" -#include "version.h" - -namespace highlight { - -/** - \brief This class generates ANSI escape sequences. - - It contains information about the resulting document structure (document - header and footer), the colour system, white space handling and text - formatting attributes. - -* @author Andre Simon -*/ - -class AnsiGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - */ - AnsiGenerator( const string &colourTheme); - AnsiGenerator(); - ~AnsiGenerator(); - - /** prints document header - \param title Title of the document - */ - string getHeader(const string & title); - - /** Prints document footer*/ - string getFooter(); - - /** Prints document body*/ - void printBody(); - - private: - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - - /** gibt ANSI-"Tags" zurueck (Farbindex+bold+kursiv)*/ - string getOpenTag(const string&font, - const string&fgCol, const string&bgCol=""); - - - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - }; - -} -#endif -/* - * Copyright (c) 1998,1999,2000,2001,2002 Tal Davidson. All rights reserved. - * - * ASBeautifier.cpp - * by Tal Davidson (davidsont@bigfoot.com) - * This file is a part of "Artistic Style" - an indentater and reformatter - * of C, C, C# and Java source files. - * - * The "Artistic Style" project, including all files needed to compile it, - * is free software; you can redistribute it and/or use it and/or modify it - * under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2 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. - * - * You should have received a copy of the GNU General Public - * License along with this program. - * - * Patches: - * 18 March 1999 - Brian Rampel - - * Fixed inverse insertion of spaces vs. tabs when in -t mode. - * 08 may 2004 - * applied ASBeautifier.cpp.BITFIELD.patch.bz2 - */ - -#include "compiler_defines.h" -#include "ASBeautifier.h" - -#include <vector> -#include <string> -#include <cctype> -#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) ; } - -#ifdef USES_NAMESPACE -using namespace std; -#endif - - - - -#ifdef USES_NAMESPACE -namespace astyle - { -#endif - - bool ASBeautifier::calledInitStatic = false; - - 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() - { - if (calledInitStatic) - return; - - calledInitStatic = true; - - headers.push_back(&AS_IF); - headers.push_back(&AS_ELSE); - headers.push_back(&AS_FOR); - headers.push_back(&AS_WHILE); - headers.push_back(&AS_DO); - headers.push_back(&AS_TRY); - headers.push_back(&AS_CATCH); - headers.push_back(&AS_FINALLY); - headers.push_back(&AS_SYNCHRONIZED); - headers.push_back(&AS_SWITCH); - headers.push_back(&AS_CASE); - headers.push_back(&AS_DEFAULT); - headers.push_back(&AS_FOREACH); - headers.push_back(&AS_LOCK); - headers.push_back(&AS_UNSAFE); - headers.push_back(&AS_FIXED); - headers.push_back(&AS_GET); - headers.push_back(&AS_SET); - headers.push_back(&AS_ADD); - headers.push_back(&AS_REMOVE); - //headers.push_back(&AS_PUBLIC); - //headers.push_back(&AS_PRIVATE); - //headers.push_back(&AS_PROTECTED); - - //headers.push_back(&AS_OPERATOR); - headers.push_back(&AS_TEMPLATE); - headers.push_back(&AS_CONST); - /**/ - headers.push_back(&AS_STATIC); - headers.push_back(&AS_EXTERN); - - nonParenHeaders.push_back(&AS_ELSE); - nonParenHeaders.push_back(&AS_DO); - nonParenHeaders.push_back(&AS_TRY); - nonParenHeaders.push_back(&AS_FINALLY); - nonParenHeaders.push_back(&AS_STATIC); - nonParenHeaders.push_back(&AS_CONST); - nonParenHeaders.push_back(&AS_EXTERN); - nonParenHeaders.push_back(&AS_CASE); - nonParenHeaders.push_back(&AS_DEFAULT); - nonParenHeaders.push_back(&AS_UNSAFE); - nonParenHeaders.push_back(&AS_GET); - nonParenHeaders.push_back(&AS_SET); - nonParenHeaders.push_back(&AS_ADD); - nonParenHeaders.push_back(&AS_REMOVE); - - - - nonParenHeaders.push_back(&AS_PUBLIC); - nonParenHeaders.push_back(&AS_PRIVATE); - nonParenHeaders.push_back(&AS_PROTECTED); - nonParenHeaders.push_back(&AS_TEMPLATE); - nonParenHeaders.push_back(&AS_CONST); - /// nonParenHeaders.push_back(&AS_ASM); - - preBlockStatements.push_back(&AS_CLASS); - preBlockStatements.push_back(&AS_STRUCT); - preBlockStatements.push_back(&AS_UNION); - preBlockStatements.push_back(&AS_INTERFACE); - preBlockStatements.push_back(&AS_NAMESPACE); - preBlockStatements.push_back(&AS_THROWS); - preBlockStatements.push_back(&AS_EXTERN); - - assignmentOperators.push_back(&AS_ASSIGN); - assignmentOperators.push_back(&AS_PLUS_ASSIGN); - assignmentOperators.push_back(&AS_MINUS_ASSIGN); - assignmentOperators.push_back(&AS_MULT_ASSIGN); - assignmentOperators.push_back(&AS_DIV_ASSIGN); - assignmentOperators.push_back(&AS_MOD_ASSIGN); - assignmentOperators.push_back(&AS_OR_ASSIGN); - assignmentOperators.push_back(&AS_AND_ASSIGN); - assignmentOperators.push_back(&AS_XOR_ASSIGN); - assignmentOperators.push_back(&AS_GR_GR_GR_ASSIGN); - assignmentOperators.push_back(&AS_GR_GR_ASSIGN); - assignmentOperators.push_back(&AS_LS_LS_LS_ASSIGN); - assignmentOperators.push_back(&AS_LS_LS_ASSIGN); - - assignmentOperators.push_back(&AS_RETURN); - - nonAssignmentOperators.push_back(&AS_EQUAL); - nonAssignmentOperators.push_back(&AS_PLUS_PLUS); - nonAssignmentOperators.push_back(&AS_MINUS_MINUS); - nonAssignmentOperators.push_back(&AS_NOT_EQUAL); - nonAssignmentOperators.push_back(&AS_GR_EQUAL); - nonAssignmentOperators.push_back(&AS_GR_GR_GR); - nonAssignmentOperators.push_back(&AS_GR_GR); - nonAssignmentOperators.push_back(&AS_LS_EQUAL); - nonAssignmentOperators.push_back(&AS_LS_LS_LS); - nonAssignmentOperators.push_back(&AS_LS_LS); - nonAssignmentOperators.push_back(&AS_ARROW); - nonAssignmentOperators.push_back(&AS_AND); - nonAssignmentOperators.push_back(&AS_OR); - } - - /** - * ASBeautifier's constructor - */ - ASBeautifier::ASBeautifier() - { - initStatic(); - - 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); - setCStyle(); - setPreprocessorIndent(false); - } - - ASBeautifier::ASBeautifier(const ASBeautifier &other) - { - waitingBeautifierStack = NULL; - activeBeautifierStack = NULL; - waitingBeautifierStackLengthStack = NULL; - activeBeautifierStackLengthStack = NULL; - - 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; - - indentString = other.indentString; - currentHeader = other.currentHeader; - previousLastLineHeader = other.previousLastLineHeader; - immediatelyPreviousAssignmentOp = other.immediatelyPreviousAssignmentOp; - isInQuote = other.isInQuote; - isInComment = other.isInComment; - isInCase = other.isInCase; - isInQuestion = other.isInQuestion; - isInStatement =other. isInStatement; - isInHeader = other.isInHeader; - isCStyle = other.isCStyle; - isInOperator = other.isInOperator; - isInTemplate = other.isInTemplate; - isInConst = other.isInConst; - 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; - parenDepth = other.parenDepth; - indentLength = other.indentLength; - blockTabCount = other.blockTabCount; - leadingWhiteSpaces = other.leadingWhiteSpaces; - maxInStatementIndent = other.maxInStatementIndent; - templateDepth = other.templateDepth; - quoteChar = other.quoteChar; - prevNonSpaceCh = other.prevNonSpaceCh; - currentNonSpaceCh = other.currentNonSpaceCh; - currentNonLegalCh = other.currentNonLegalCh; - prevNonLegalCh = other.prevNonLegalCh; - isInConditional = other.isInConditional; - minConditionalIndent = other.minConditionalIndent; - prevFinalLineSpaceTabCount = other.prevFinalLineSpaceTabCount; - prevFinalLineTabCount = other.prevFinalLineTabCount; - emptyLineFill = other.emptyLineFill; - probationHeader = other.probationHeader; - isInDefine = other.isInDefine; - isInDefineDefinition = other.isInDefineDefinition; - backslashEndsPrevLine = other.backslashEndsPrevLine; - defineTabCount = other.defineTabCount; - } - - /** - * ASBeautifier's destructor - */ - ASBeautifier::~ASBeautifier() - { - 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 ); - - // DELETE_CONTAINER( sourceIterator ); - } - - /** - * 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() - { - 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; - - isInQuote = false; - isInComment = false; - isInStatement = false; - isInCase = false; - isInQuestion = false; - isInClassHeader = false; - isInClassHeaderTab = false; - isInHeader = false; - isInOperator = false; - isInTemplate = false; - isInConst = false; - isInConditional = false; - templateDepth = 0; - parenDepth=0; - blockTabCount = 0; - leadingWhiteSpaces = 0; - prevNonSpaceCh = '{'; - currentNonSpaceCh = '{'; - prevNonLegalCh = '{'; - currentNonLegalCh = '{'; - prevFinalLineSpaceTabCount = 0; - prevFinalLineTabCount = 0; - probationHeader = NULL; - backslashEndsPrevLine = false; - isInDefine = false; - isInDefineDefinition = false; - defineTabCount = 0; - } - - /** - * set indentation style to ANSI C/C++. - */ - void ASBeautifier::setCStyle() - { - isCStyle = true; - } - - /** - * set indentation style to Java / K&R. - */ - void ASBeautifier::setJavaStyle() - { - isCStyle = 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) - { - labelIndent = state; - } - - /** - * set the state of the preprocessor indentation option. - * If true, multiline #define statements will be indented. - * - * @param state state of option. - */ - void ASBeautifier::setPreprocessorIndent(bool state) - { - preprocessorIndent = state; - } - - /** - * set the state of the empty line fill option. - * If true, empty lines will be filled with the whitespace. - * of their previous lines. - * If false, these lines will remain empty. - * - * @param state state of option. - */ - void ASBeautifier::setEmptyLineFill(bool state) - { - emptyLineFill = state; - } - - /** - * check if there are any indented lines ready to be read by nextLine() - * - * @return are there any indented lines ready? - */ - bool ASBeautifier::hasMoreLines() const - { - return sourceIterator->hasMoreLines(); - } - - /** - * get the next indented line. - * - * @return indented line. - */ - string ASBeautifier::nextLine() - { - return beautify(sourceIterator->nextLine()); - } - - /** - * beautify a line of source code. - * every line of source code in a source code file should be sent - * one after the other to the beautify method. - * - * @return the indented line. - * @param originalLine the original unindented line. - */ - string ASBeautifier::beautify(const string &originalLine) - { - string line; - bool isInLineComment = false; - bool lineStartsInComment = false; - bool isInClass = false; - bool isInSwitch = false; - bool isImmediatelyAfterConst = false; - bool isSpecialChar = false; - - char ch = ' '; - char prevCh; - string outBuffer; // the newly idented line is bufferd here - int tabCount = 0; - const string *lastLineHeader = NULL; - bool closingBracketReached = false; - int spaceTabCount = 0; - char tempCh; - unsigned int headerStackSize = headerStack->size(); - //bool isLineInStatement = isInStatement; - bool shouldIndentBrackettedLine = true; - int lineOpeningBlocksNum = 0; - int lineClosingBlocksNum = 0; - bool previousLineProbation = (probationHeader != NULL); - unsigned int i; - - currentHeader = NULL; - - lineStartsInComment = isInComment; - - // handle and remove white spaces around the line: - // If not in comment, first find out size of white space before line, - // so that possible comments starting in the line continue in - // relation to the preliminary white-space. - if (!isInComment) - { - leadingWhiteSpaces = 0; - while (leadingWhiteSpaces<originalLine.length() && originalLine[leadingWhiteSpaces] <= 0x20) - leadingWhiteSpaces++; - - line = trim(originalLine); - } - else - { - unsigned int trimSize; - for (trimSize=0; - trimSize < originalLine.length() && trimSize<leadingWhiteSpaces && originalLine[trimSize] <= 0x20 ; - trimSize++) - ; - line = originalLine.substr(trimSize); - } - - - if (line.length() == 0) - { - if (emptyLineFill) - return preLineWS(prevFinalLineSpaceTabCount, prevFinalLineTabCount); - else - return line; - } - - // handle preprocessor commands - - if (isCStyle && !isInComment && (line[0] == '#' || backslashEndsPrevLine)) - { - if (line[0] == '#') - { - string preproc = trim(string(line.c_str() + 1)); - - - // When finding a multi-lined #define statement, the original beautifier - // 1. sets its isInDefineDefinition flag - // 2. clones a new beautifier that will be used for the actual indentation - // of the #define. This clone is put into the activeBeautifierStack in order - // to be called for the actual indentation. - // The original beautifier will have isInDefineDefinition = true, isInDefine = false - // The cloned beautifier will have isInDefineDefinition = true, isInDefine = true - if (preprocessorIndent && preproc.COMPARE(0, 6, string("define")) == 0 && line[line.length() - 1] == '\\') - { - if (!isInDefineDefinition) - { - ASBeautifier *defineBeautifier; - - // this is the original beautifier - isInDefineDefinition = true; - - // push a new beautifier into the active stack - // this breautifier will be used for the indentation of this define - defineBeautifier = new ASBeautifier(*this); - //defineBeautifier->init(); - //defineBeautifier->isInDefineDefinition = true; - //defineBeautifier->beautify(""); - activeBeautifierStack->push_back(defineBeautifier); - } - else - { - // the is the cloned beautifier that is in charge of indenting the #define. - isInDefine = true; - } - } - else if (preproc.COMPARE(0, 2, string("if")) == 0) - { - // push a new beautifier into the stack - waitingBeautifierStackLengthStack->push_back(waitingBeautifierStack->size()); - activeBeautifierStackLengthStack->push_back(activeBeautifierStack->size()); - waitingBeautifierStack->push_back(new ASBeautifier(*this)); - } - else if (preproc.COMPARE(0, 4/*2*/, string("else")) == 0) - { - if (!waitingBeautifierStack->empty()) - { - // MOVE current waiting beautifier to active stack. - activeBeautifierStack->push_back(waitingBeautifierStack->back()); - waitingBeautifierStack->pop_back(); - } - } - else if (preproc.COMPARE(0, 4, string("elif")) == 0) - { - if (!waitingBeautifierStack->empty()) - { - // append a COPY current waiting beautifier to active stack, WITHOUT deleting the original. - activeBeautifierStack->push_back( new ASBeautifier( *(waitingBeautifierStack->back()) ) ); - } - } - else if (preproc.COMPARE(0, 5, string("endif")) == 0) - { - unsigned int stackLength; - ASBeautifier *beautifier; - - if (!waitingBeautifierStackLengthStack->empty()) - { - stackLength = waitingBeautifierStackLengthStack->back(); - waitingBeautifierStackLengthStack->pop_back(); - while (waitingBeautifierStack->size() > stackLength) - { - beautifier = waitingBeautifierStack->back(); - waitingBeautifierStack->pop_back(); - delete beautifier; - } - } - - if (!activeBeautifierStackLengthStack->empty()) - { - stackLength = activeBeautifierStackLengthStack->back(); - activeBeautifierStackLengthStack->pop_back(); - while (activeBeautifierStack->size() > stackLength) - { - beautifier = activeBeautifierStack->back(); - activeBeautifierStack->pop_back(); - delete beautifier; - } - } - - - } - } - - // check if the last char is a backslash - if(line.length() > 0) - backslashEndsPrevLine = (line[line.length() - 1] == '\\'); - else - backslashEndsPrevLine = false; - - // check if this line ends a multi-line #define - // if so, use the #define's cloned beautifier for the line's indentation - // and then remove it from the active beautifier stack and delete it. - if (!backslashEndsPrevLine && isInDefineDefinition && !isInDefine) - { - string beautifiedLine; - ASBeautifier *defineBeautifier; - - isInDefineDefinition = false; - defineBeautifier = activeBeautifierStack->back(); - activeBeautifierStack->pop_back(); - - beautifiedLine = defineBeautifier->beautify(line); - delete defineBeautifier; - return beautifiedLine; - } - - // unless this is a multi-line #define, return this precompiler line as is. - if (!isInDefine && !isInDefineDefinition) - return originalLine; - } - - // if there exists any worker beautifier in the activeBeautifierStack, - // then use it instead of me to indent the current line. - if (!isInDefine && activeBeautifierStack != NULL && !activeBeautifierStack->empty()) - { - return activeBeautifierStack->back()->beautify(line); - } - - // calculate preliminary indentation based on data from past lines - if (!inStatementIndentStack->empty()) - spaceTabCount = inStatementIndentStack->back(); - - - for (i=0; i<headerStackSize; i++) - { - isInClass = false; - - if (blockIndent || (!(i>0 && (*headerStack)[i-1] != &AS_OPEN_BRACKET - && (*headerStack)[i] == &AS_OPEN_BRACKET))) - ++tabCount; - - if (isCStyle && !namespaceIndent && i >= 1 - && (*headerStack)[i-1] == &AS_NAMESPACE - && (*headerStack)[i] == &AS_OPEN_BRACKET) - --tabCount; - - if (isCStyle && i >= 1 - && (*headerStack)[i-1] == &AS_CLASS - && (*headerStack)[i] == &AS_OPEN_BRACKET ) - { - if (classIndent) - ++tabCount; - isInClass = true; - } - - // is the switchIndent option is on, indent switch statements an additional indent. - else if (switchIndent && i > 1 && - (*headerStack)[i-1] == &AS_SWITCH && - (*headerStack)[i] == &AS_OPEN_BRACKET - ) - { - ++tabCount; - isInSwitch = true; - } - - } - - if (!lineStartsInComment - && isCStyle - && isInClass - && classIndent - && headerStackSize >= 2 - &&(*headerStack)[headerStackSize-2] == &AS_CLASS - && (*headerStack)[headerStackSize-1] == &AS_OPEN_BRACKET - && line[0] == '}') - --tabCount; - - else if (!lineStartsInComment - && isInSwitch - && switchIndent - && headerStackSize >= 2 - && (*headerStack)[headerStackSize-2] == &AS_SWITCH - && (*headerStack)[headerStackSize-1] == &AS_OPEN_BRACKET - && line[0] == '}') - --tabCount; - - if (isInClassHeader) - { - isInClassHeaderTab = true; - tabCount += 2; - } - - if (isInConditional) - { - --tabCount; - } - - - // parse characters in the current line. - - for (i=0; i<line.length(); i++) - { - tempCh = line[i]; - - prevCh = ch; - ch = tempCh; - - outBuffer.append(1, ch); - - if (isWhiteSpace(ch)) - continue; - - - // handle special characters (i.e. backslash+character such as \n, \t, ...) - if (isSpecialChar) - { - isSpecialChar = false; - continue; - } - if (!(isInComment || isInLineComment) && line.COMPARE(i, 2, string("\\\\")) == 0) - { - outBuffer.append(1, '\\'); - i++; - continue; - } - if (!(isInComment || isInLineComment) && ch=='\\') - { - isSpecialChar = true; - continue; - } - - // handle quotes (such as 'x' and "Hello Dolly") - if (!(isInComment || isInLineComment) && (ch=='"' || ch=='\'')) - if (!isInQuote) - { - quoteChar = ch; - isInQuote = true; - } - else if (quoteChar == ch) - { - isInQuote = false; - isInStatement = true; - continue; - } - if (isInQuote) - continue; - - // handle comments - - if ( !(isInComment || isInLineComment) && line.COMPARE(i, 2, AS_OPEN_LINE_COMMENT) == 0 ) - { - isInLineComment = true; - outBuffer.append(1, '/'); - i++; - continue; - } - else if ( !(isInComment || isInLineComment) && line.COMPARE(i, 2, AS_OPEN_COMMENT) == 0 ) - { - isInComment = true; - outBuffer.append(1, '*'); - i++; - continue; - } - else if ( (isInComment || isInLineComment) && line.COMPARE(i, 2, AS_CLOSE_COMMENT) == 0 ) - { - isInComment = false; - outBuffer.append(1, '/'); - i++; - continue; - } - - if (isInComment||isInLineComment) - continue; - - // if we have reached this far then we are NOT in a comment or string of special character... - - if (probationHeader != NULL) - { - if ( ((probationHeader == &AS_STATIC || probationHeader == &AS_CONST) && ch == '{') - || (probationHeader == &AS_SYNCHRONIZED && ch == '(')) - { - // insert the probation header as a new header - isInHeader = true; - headerStack->push_back(probationHeader); - - // handle the specific probation header - isInConditional = (probationHeader == &AS_SYNCHRONIZED); - if (probationHeader == &AS_CONST) - isImmediatelyAfterConst = true; - // isInConst = true; - /* TODO: - * There is actually no more need for the global isInConst variable. - * The only reason for checking const is to see if there is a const - * immediately before an open-bracket. - * Since CONST is now put into probation and is checked during itspost-char, - * isImmediatelyAfterConst can be set by its own... - */ - - isInStatement = false; - // if the probation comes from the previous line, then indent by 1 tab count. - if (previousLineProbation && ch == '{') - tabCount++; - previousLineProbation = false; - } - - // dismiss the probation header - probationHeader = NULL; - } - - prevNonSpaceCh = currentNonSpaceCh; - currentNonSpaceCh = ch; - if (!isLegalNameChar(ch) && ch != ',' && ch != ';' ) - { - prevNonLegalCh = currentNonLegalCh; - currentNonLegalCh = ch; - } - - //if (isInConst) - //{ - // isInConst = false; - // isImmediatelyAfterConst = true; - //} - - if (isInHeader) - { - isInHeader = false; - currentHeader = headerStack->back(); - } - else - currentHeader = NULL; - - if (isCStyle && isInTemplate - && (ch == '<' || ch == '>') - && findHeader(line, i, nonAssignmentOperators) == NULL) //; - { - if (ch == '<') - { - ++templateDepth; - } - else if (ch == '>') - { - if (--templateDepth <= 0) - { - if (isInTemplate) - ch = ';'; - else - ch = 't'; - isInTemplate = false; - templateDepth = 0; - } - - } - } - - // handle parenthesies - if (ch == '(' || ch == '[' || ch == ')' || ch == ']') - { - if (ch == '(' || ch == '[') - { - if (parenDepth == 0) - { - parenStatementStack->push_back(isInStatement); - isInStatement = true; - } - parenDepth++; - - inStatementIndentStackSizeStack->push_back(inStatementIndentStack->size()); - - if (currentHeader != NULL) - registerInStatementIndent(line, i, spaceTabCount, minConditionalIndent/*indentLength*2*/, true); - else - registerInStatementIndent(line, i, spaceTabCount, 0, true); - } - else if (ch == ')' || ch == ']') - { - parenDepth--; - if (parenDepth == 0) - { - isInStatement = parenStatementStack->back(); - parenStatementStack->pop_back(); - ch = ' '; - - isInConditional = false; - } - - if (!inStatementIndentStackSizeStack->empty()) - { - unsigned int previousIndentStackSize = inStatementIndentStackSizeStack->back(); - inStatementIndentStackSizeStack->pop_back(); - while (previousIndentStackSize < inStatementIndentStack->size()) - inStatementIndentStack->pop_back(); - - if (!parenIndentStack->empty()) - { - int poppedIndent = parenIndentStack->back(); - parenIndentStack->pop_back(); - - if (i == 0) - spaceTabCount = poppedIndent; - } - } - } - - continue; - } - - - if (ch == '{') - { - bool isBlockOpener = false; - - // first, check if '{' is a block-opener or an static-array opener - isBlockOpener = ( (prevNonSpaceCh == '{' && bracketBlockStateStack->back()) - || prevNonSpaceCh == '}' - || prevNonSpaceCh == ')' - || prevNonSpaceCh == ';' - || isInClassHeader - || isBlockOpener - || isImmediatelyAfterConst - || (isInDefine && - (prevNonSpaceCh == '(' - || prevNonSpaceCh == '_' - || isalnum(prevNonSpaceCh))) ); - - isInClassHeader = false; - if (!isBlockOpener && currentHeader != NULL) - { - for (unsigned int n=0; n < nonParenHeaders.size(); n++) - if (currentHeader == nonParenHeaders[n]) - { - isBlockOpener = true; - break; - } - } - bracketBlockStateStack->push_back(isBlockOpener); - if (!isBlockOpener) - { - inStatementIndentStackSizeStack->push_back(inStatementIndentStack->size()); - registerInStatementIndent(line, i, spaceTabCount, 0, true); - parenDepth++; - if (i == 0) - shouldIndentBrackettedLine = false; - - continue; - } - - // this bracket is a block opener... - - ++lineOpeningBlocksNum; - - if (isInClassHeader) - isInClassHeader = false; - if (isInClassHeaderTab) - { - isInClassHeaderTab = false; - tabCount -= 2; - } - - blockParenDepthStack->push_back(parenDepth); - blockStatementStack->push_back(isInStatement); - - inStatementIndentStackSizeStack->push_back(inStatementIndentStack->size()); - - blockTabCount += isInStatement? 1 : 0; - parenDepth = 0; - isInStatement = false; - - tempStacks->push_back(new vector<const string*>); - headerStack->push_back(&AS_OPEN_BRACKET); - lastLineHeader = &AS_OPEN_BRACKET; // <------ - - continue; - } - - //check if a header has been reached - if (prevCh == ' ') - { - bool isIndentableHeader = true; - const string *newHeader = findHeader(line, i, headers); - if (newHeader != NULL) - { - // if we reached here, then this is a header... - isInHeader = true; - - vector<const string*> *lastTempStack; - if (tempStacks->empty()) - lastTempStack = NULL; - else - lastTempStack = tempStacks->back(); - - // if a new block is opened, push a new stack into tempStacks to hold the - // future list of headers in the new block. - - // take care of the special case: 'else if (...)' - if (newHeader == &AS_IF && lastLineHeader == &AS_ELSE) - { - //spaceTabCount += indentLength; // to counter the opposite addition that occurs when the 'if' is registered below... - headerStack->pop_back(); - } - - // take care of 'else' - else if (newHeader == &AS_ELSE) - { - if (lastTempStack != NULL) - { - int indexOfIf = indexOf(*lastTempStack, &AS_IF); // <--- - if (indexOfIf != -1) - { - // recreate the header list in headerStack up to the previous 'if' - // from the temporary snapshot stored in lastTempStack. - int restackSize = lastTempStack->size() - indexOfIf - 1; - for (int r=0; r<restackSize; r++) - { - headerStack->push_back(lastTempStack->back()); - lastTempStack->pop_back(); - } - if (!closingBracketReached) - tabCount += restackSize; - } - /* - * If the above if is not true, i.e. no 'if' before the 'else', - * then nothing beautiful will come out of this... - * I should think about inserting an Exception here to notify the caller of this... - */ - } - } - - // check if 'while' closes a previous 'do' - else if (newHeader == &AS_WHILE) - { - if (lastTempStack != NULL) - { - int indexOfDo = indexOf(*lastTempStack, &AS_DO); // <--- - if (indexOfDo != -1) - { - // recreate the header list in headerStack up to the previous 'do' - // from the temporary snapshot stored in lastTempStack. - int restackSize = lastTempStack->size() - indexOfDo - 1; - for (int r=0; r<restackSize; r++) - { - headerStack->push_back(lastTempStack->back()); - lastTempStack->pop_back(); - } - if (!closingBracketReached) - tabCount += restackSize; - } - } - } - // check if 'catch' closes a previous 'try' or 'catch' - else if (newHeader == &AS_CATCH || newHeader == &AS_FINALLY) - { - if (lastTempStack != NULL) - { - int indexOfTry = indexOf(*lastTempStack, &AS_TRY); - if (indexOfTry == -1) - indexOfTry = indexOf(*lastTempStack, &AS_CATCH); - if (indexOfTry != -1) - { - // recreate the header list in headerStack up to the previous 'try' - // from the temporary snapshot stored in lastTempStack. - int restackSize = lastTempStack->size() - indexOfTry - 1; - for (int r=0; r<restackSize; r++) - { - headerStack->push_back(lastTempStack->back()); - lastTempStack->pop_back(); - } - - if (!closingBracketReached) - tabCount += restackSize; - } - } - } - else if (newHeader == &AS_CASE) - { - isInCase = true; - if (!caseIndent) - --tabCount; - } - else if(newHeader == &AS_DEFAULT) - { - isInCase = true; - if (!caseIndent) - --tabCount; - } - else if (newHeader == &AS_PUBLIC || newHeader == &AS_PROTECTED || newHeader == &AS_PRIVATE) - { - if (isCStyle && !isInClassHeader) - --tabCount; - isIndentableHeader = false; - } - //else if ((newHeader == &STATIC || newHeader == &SYNCHRONIZED) && - // !headerStack->empty() && - // (headerStack->back() == &STATIC || headerStack->back() == &SYNCHRONIZED)) - //{ - // isIndentableHeader = false; - //} - else if (newHeader == &AS_STATIC - || newHeader == &AS_SYNCHRONIZED - || (newHeader == &AS_CONST && isCStyle)) - { - if (!headerStack->empty() && - (headerStack->back() == &AS_STATIC - || headerStack->back() == &AS_SYNCHRONIZED - || headerStack->back() == &AS_CONST)) - { - isIndentableHeader = false; - } - else - { - isIndentableHeader = false; - probationHeader = newHeader; - } - } - else if (newHeader == &AS_CONST) - { - // this will be entered only if NOT in C style - // since otherwise the CONST would be found to be a probstion header... - - //if (isCStyle) - // isInConst = true; - isIndentableHeader = false; - } - /* - else if (newHeader == &OPERATOR) - { - if (isCStyle) - isInOperator = true; - isIndentableHeader = false; - } - */ - else if (newHeader == &AS_TEMPLATE) - { - if (isCStyle) - isInTemplate = true; - isIndentableHeader = false; - } - - - if (isIndentableHeader) - { - // 3.2.99 - //spaceTabCount-=indentLength; - headerStack->push_back(newHeader); - isInStatement = false; - if (indexOf(nonParenHeaders, newHeader) == -1) - { - isInConditional = true; - } - lastLineHeader = newHeader; - } - else - isInHeader = false; - - //lastLineHeader = newHeader; - - outBuffer.append(newHeader->substr(1)); - i += newHeader->length() - 1; - - continue; - } - } - - if (isCStyle && !isalpha(prevCh) - && line.COMPARE(i, 8, AS_OPERATOR) == 0 && !isalnum(line[i+8])) - { - isInOperator = true; - outBuffer.append(AS_OPERATOR.substr(1)); - i += 7; - continue; - } - - if (ch == '?') - isInQuestion = true; - - - // special handling of 'case' statements - if (ch == ':') - { - if (line.length() > i+1 && line[i+1] == ':') // look for :: - { - ++i; - outBuffer.append(1, ':'); - ch = ' '; - continue; - } - - else if (isCStyle && isInClass && prevNonSpaceCh != ')') - { - // BEGIN Content of ASBeautifier.cpp.BITFIELD.patch: - - unsigned int chIndex; - char nextCh = 0; - for (chIndex = i+1; chIndex < line.length(); chIndex++) - if (!isWhiteSpace(line[chIndex])) - break; - if (chIndex< line.length()) - nextCh = line[chIndex]; - int nWord =0; - for (chIndex = 0; chIndex < i; chIndex++) - { - if (!isWhiteSpace(line[chIndex])) - { - nWord ++; - while (!isWhiteSpace(line[++chIndex])); - } - } - if ((nextCh >= '0' && nextCh <= '9') || (nWord >1)) - continue; - // END Content of ASBeautifier.cpp.BITFIELD.patch: - - --tabCount; - // found a 'private:' or 'public:' inside a class definition - // so do nothing special - } - - else if (isCStyle && isInClassHeader) - { - - // found a 'class A : public B' definition - // so do nothing special - } - - else if (isInQuestion) - { - isInQuestion = false; - } - else if (isCStyle && prevNonSpaceCh == ')') - { - isInClassHeader = true; - if (i==0) - tabCount += 2; - } - else - { - currentNonSpaceCh = ';'; // so that brackets after the ':' will appear as block-openers - if (isInCase) - { - isInCase = false; - ch = ';'; // from here on, treat char as ';' - } - // BEGIN content of ASBeautifier.cpp.BITFIELD.patch.bz2 - else // bitfield or labels - { - unsigned int chIndex; - char nextCh = 0; - for (chIndex = i+1; (isCStyle && chIndex < line.length()); chIndex++) - if (!isWhiteSpace(line[chIndex])) - break; - if (chIndex< line.length()) - nextCh = line[chIndex]; - - int nWord =0; - for (chIndex = 0; chIndex < i; chIndex++) - { - if (!isWhiteSpace(line[chIndex])) - { - nWord ++; - while (!isWhiteSpace(line[++chIndex])); - } - } - if (isCStyle && (nextCh >= '0' && nextCh <= '9') || (nWord >1)) - { - continue; - } - // END content of ASASBeautifier.cpp.BITFIELD.patch.bz2 - - else // is in a label (e.g. 'label1:') - { - if (labelIndent) - --tabCount; // unindent label by one indent - else - tabCount = 0; // completely flush indent to left - } - - // BEGIN content of ASASBeautifier.cpp.BITFIELD.patch.bz2 - } - // END content of ASASBeautifier.cpp.BITFIELD.patch.bz2 - - } - } - - if ((ch == ';' || (parenDepth>0 && ch == ',')) && !inStatementIndentStackSizeStack->empty()) - while ((unsigned int)inStatementIndentStackSizeStack->back() + (parenDepth>0 ? 1 : 0) < inStatementIndentStack->size()) - inStatementIndentStack->pop_back(); - - - // handle ends of statements - if ( (ch == ';' && parenDepth == 0) || ch == '}'/* || (ch == ',' && parenDepth == 0)*/) - { - if (ch == '}') - { - // first check if this '}' closes a previous block, or a static array... - if (!bracketBlockStateStack->empty()) - { - bool bracketBlockState = bracketBlockStateStack->back(); - bracketBlockStateStack->pop_back(); - if (!bracketBlockState) - { - if (!inStatementIndentStackSizeStack->empty()) - { - // this bracket is a static array - - unsigned int previousIndentStackSize = inStatementIndentStackSizeStack->back(); - inStatementIndentStackSizeStack->pop_back(); - while (previousIndentStackSize < inStatementIndentStack->size()) - inStatementIndentStack->pop_back(); - parenDepth--; - if (i == 0) - shouldIndentBrackettedLine = false; - - if (!parenIndentStack->empty()) - { - int poppedIndent = parenIndentStack->back(); - parenIndentStack->pop_back(); - if (i == 0) - spaceTabCount = poppedIndent; - } - } - continue; - } - } - - // this bracket is block closer... - - ++lineClosingBlocksNum; - - if(!inStatementIndentStackSizeStack->empty()) - inStatementIndentStackSizeStack->pop_back(); - - if (!blockParenDepthStack->empty()) - { - parenDepth = blockParenDepthStack->back(); - blockParenDepthStack->pop_back(); - isInStatement = blockStatementStack->back(); - blockStatementStack->pop_back(); - - if (isInStatement) - blockTabCount--; - } - - closingBracketReached = true; - int headerPlace = indexOf(*headerStack, &AS_OPEN_BRACKET); // <--- - if (headerPlace != -1) - { - const string *popped = headerStack->back(); - while (popped != &AS_OPEN_BRACKET) - { - headerStack->pop_back(); - popped = headerStack->back(); - } - headerStack->pop_back(); - - if (!tempStacks->empty()) - { - vector<const string*> *temp = tempStacks->back(); - tempStacks->pop_back(); - delete temp; - } - } - - - ch = ' '; // needed due to cases such as '}else{', so that headers ('else' tn tih case) will be identified... - } - - /* - * Create a temporary snapshot of the current block's header-list in the - * uppermost inner stack in tempStacks, and clear the headerStack up to - * the begining of the block. - * Thus, the next future statement will think it comes one indent past - * the block's '{' unless it specifically checks for a companion-header - * (such as a previous 'if' for an 'else' header) within the tempStacks, - * and recreates the temporary snapshot by manipulating the tempStacks. - */ - if (!tempStacks->back()->empty()) - while (!tempStacks->back()->empty()) - tempStacks->back()->pop_back(); - while (!headerStack->empty() && headerStack->back() != &AS_OPEN_BRACKET) - { - tempStacks->back()->push_back(headerStack->back()); - headerStack->pop_back(); - } - - if (parenDepth == 0 && ch == ';') - isInStatement=false; - - isInClassHeader = false; - - continue; - } - - - // check for preBlockStatements ONLY if not within parenthesies - // (otherwise 'struct XXX' statements would be wrongly interpreted...) - if (prevCh == ' ' && !isInTemplate && parenDepth == 0) - { - const string *newHeader = findHeader(line, i, preBlockStatements); - if (newHeader != NULL) - { - isInClassHeader = true; - outBuffer.append(newHeader->substr(1)); - i += newHeader->length() - 1; - //if (isCStyle) - headerStack->push_back(newHeader); - } - } - - // Handle operators - // - - //// // PRECHECK if a '==' or '--' or '++' operator was reached. - //// // If not, then register an indent IF an assignment operator was reached. - //// // The precheck is important, so that statements such as 'i--==2' are not recognized - //// // to have assignment operators (here, '-=') in them . . . - - const string *foundAssignmentOp = NULL; - const string *foundNonAssignmentOp = NULL; - - immediatelyPreviousAssignmentOp = NULL; - - // Check if an operator has been reached. - foundAssignmentOp = findHeader(line, i, assignmentOperators, false); - foundNonAssignmentOp = findHeader(line, i, nonAssignmentOperators, false); - - // Since findHeader's boundry checking was not used above, it is possible - // that both an assignment op and a non-assignment op where found, - // e.g. '>>' and '>>='. If this is the case, treat the LONGER one as the - // found operator. - if (foundAssignmentOp != NULL && foundNonAssignmentOp != NULL) - if (foundAssignmentOp->length() < foundNonAssignmentOp->length()) - foundAssignmentOp = NULL; - else - foundNonAssignmentOp = NULL; - - if (foundNonAssignmentOp != NULL) - { - if (foundNonAssignmentOp->length() > 1) - { - outBuffer.append(foundNonAssignmentOp->substr(1)); - i += foundNonAssignmentOp->length() - 1; - } - } - - else if (foundAssignmentOp != NULL) - - { - if (foundAssignmentOp->length() > 1) - { - outBuffer.append(foundAssignmentOp->substr(1)); - i += foundAssignmentOp->length() - 1; - } - - if (!isInOperator && !isInTemplate) - { - registerInStatementIndent(line, i, spaceTabCount, 0, false); - immediatelyPreviousAssignmentOp = foundAssignmentOp; - isInStatement = true; - } - } - - /* - immediatelyPreviousAssignmentOp = NULL; - bool isNonAssingmentOperator = false; - for (int n = 0; n < nonAssignmentOperators.size(); n++) - if (line.COMPARE(i, nonAssignmentOperators[n]->length(), *(nonAssignmentOperators[n])) == 0) - { - if (nonAssignmentOperators[n]->length() > 1) - { - outBuffer.append(nonAssignmentOperators[n]->substr(1)); - i += nonAssignmentOperators[n]->length() - 1; - } - isNonAssingmentOperator = true; - break; - } - if (!isNonAssingmentOperator) - { - for (int a = 0; a < assignmentOperators.size(); a++) - if (line.COMPARE(i, assignmentOperators[a]->length(), *(assignmentOperators[a])) == 0) - { - if (assignmentOperators[a]->length() > 1) - { - outBuffer.append(assignmentOperators[a]->substr(1)); - i += assignmentOperators[a]->length() - 1; - } - - if (!isInOperator && !isInTemplate) - { - registerInStatementIndent(line, i, spaceTabCount, 0, false); - immediatelyPreviousAssignmentOp = assignmentOperators[a]; - isInStatement = true; - } - break; - } - } - */ - - if (isInOperator) - isInOperator = false; - } - - // handle special cases of unindentation: - - /* - * if '{' doesn't follow an immediately previous '{' in the headerStack - * (but rather another header such as "for" or "if", then unindent it - * by one indentation relative to its block. - */ - // cerr << endl << lineOpeningBlocksNum << " " << lineClosingBlocksNum << " " << previousLastLineHeader << endl; - - // indent #define lines with one less tab - //if (isInDefine) - // tabCount -= defineTabCount-1; - - - if (!lineStartsInComment - && !blockIndent - && outBuffer.length()>0 - && outBuffer[0]=='{' - && !(lineOpeningBlocksNum > 0 && lineOpeningBlocksNum == lineClosingBlocksNum) - && !(headerStack->size() > 1 && (*headerStack)[headerStack->size()-2] == &AS_OPEN_BRACKET) - && shouldIndentBrackettedLine) - --tabCount; - - else if (!lineStartsInComment - && outBuffer.length()>0 - && outBuffer[0]=='}' - && shouldIndentBrackettedLine ) - --tabCount; - - // correctly indent one-line-blocks... - else if (!lineStartsInComment - && outBuffer.length()>0 - && lineOpeningBlocksNum > 0 - && lineOpeningBlocksNum == lineClosingBlocksNum - && previousLastLineHeader != NULL - && previousLastLineHeader != &AS_OPEN_BRACKET) - tabCount -= 1; //lineOpeningBlocksNum - (blockIndent ? 1 : 0); - - if (tabCount < 0) - tabCount = 0; - - // take care of extra bracket indentatation option... - if (bracketIndent && outBuffer.length()>0 && shouldIndentBrackettedLine) - if (outBuffer[0]=='{' || outBuffer[0]=='}') - tabCount++; - - - if (isInDefine) - { - if (outBuffer[0] == '#') - { - string preproc = trim(string(outBuffer.c_str() + 1)); - if (preproc.COMPARE(0, 6, string("define")) == 0) - { - if (!inStatementIndentStack->empty() - && inStatementIndentStack->back() > 0) - { - defineTabCount = tabCount; - } - else - { - defineTabCount = tabCount - 1; - tabCount--; - } - } - } - - tabCount -= defineTabCount; - } - - if (tabCount < 0) - tabCount = 0; - - - // finally, insert indentations into begining of line - - prevFinalLineSpaceTabCount = spaceTabCount; - prevFinalLineTabCount = tabCount; - - if (shouldForceTabIndentation) - { - tabCount += spaceTabCount / indentLength; - spaceTabCount = spaceTabCount % indentLength; - } - - outBuffer = preLineWS(spaceTabCount,tabCount) + outBuffer; - - if (lastLineHeader != NULL) - previousLastLineHeader = lastLineHeader; - - return outBuffer; - } - - - string ASBeautifier::preLineWS(int spaceTabCount, int tabCount) - { - string ws; - - for (int i=0; i<tabCount; i++) - ws += indentString; - - while ((spaceTabCount--) > 0) - ws += string(" "); - - return ws; - - } - - /** - * register an in-statement indent. - */ - void ASBeautifier::registerInStatementIndent(const string &line, int i, int spaceTabCount, - int minIndent, bool updateParenStack) - { - int inStatementIndent; - int remainingCharNum = line.length() - i; - int nextNonWSChar = 1; - - nextNonWSChar = getNextProgramCharDistance(line, i); - - // if indent is around the last char in the line, indent instead 2 spaces from the previous indent - if (nextNonWSChar == remainingCharNum) - { - int previousIndent = spaceTabCount; - if (!inStatementIndentStack->empty()) - previousIndent = inStatementIndentStack->back(); - - inStatementIndentStack->push_back(/*2*/ indentLength + previousIndent ); - if (updateParenStack) - parenIndentStack->push_back( previousIndent ); - return; - } - - if (updateParenStack) - parenIndentStack->push_back(i+spaceTabCount); - - inStatementIndent = i + nextNonWSChar + spaceTabCount; - - if (i + nextNonWSChar < minIndent) - inStatementIndent = minIndent + spaceTabCount; - - if (i + nextNonWSChar > maxInStatementIndent) - inStatementIndent = indentLength*2 + spaceTabCount; - - - - if (!inStatementIndentStack->empty() && - inStatementIndent < inStatementIndentStack->back()) - inStatementIndent = inStatementIndentStack->back(); - - inStatementIndentStack->push_back(inStatementIndent); - } - - /** - * get distance to the next non-white sspace, non-comment character in the line. - * if no such character exists, return the length remaining to the end of the line. - */ - int ASBeautifier::getNextProgramCharDistance(const string &line, int i) - { - bool inComment = false; - int remainingCharNum = line.length() - i; - int charDistance = 1; - int ch; - - for (charDistance = 1; charDistance < remainingCharNum; charDistance++) - { - ch = line[i + charDistance]; - if (inComment) - { - if (line.COMPARE(i + charDistance, 2, AS_CLOSE_COMMENT) == 0) - { - charDistance++; - inComment = false; - } - continue; - } - else if (isWhiteSpace(ch)) - continue; - else if (ch == '/') - { - if (line.COMPARE(i + charDistance, 2, AS_OPEN_LINE_COMMENT) == 0) - return remainingCharNum; - else if (line.COMPARE(i + charDistance, 2, AS_OPEN_COMMENT) == 0) - { - charDistance++; - inComment = true; - } - } - else - return charDistance; - } - - return charDistance; - } - - - /** - * check if a specific character can be used in a legal variable/method/class name - * - * @return legality of the char. - * @param ch the character to be checked. - */ - bool ASBeautifier::isLegalNameChar(char ch) const - { - return (isalnum(ch) //(ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || (ch>='0' && ch<='9') || - || ch=='.' || ch=='_' || (!isCStyle && ch=='$') || (isCStyle && ch=='~')); - } - - - /** - * check if a specific line position contains a header, out of several possible headers. - * - * @return a pointer to the found header. if no header was found then return NULL. - */ - const string *ASBeautifier::findHeader(const string &line, int i, const vector<const string*> &possibleHeaders, bool checkBoundry) - { - int maxHeaders = possibleHeaders.size(); - const string *header = NULL; - int p; - - for (p=0; p < maxHeaders; p++) - { - header = possibleHeaders[p]; - - if (line.COMPARE(i, header->length(), *header) == 0) - { - // check that this is a header and not a part of a longer word - // (e.g. not at its begining, not at its middle...) - - int lineLength = line.length(); - int headerEnd = i + header->length(); - char startCh = (*header)[0]; // first char of header - char endCh = 0; // char just after header - char prevCh = 0; // char just before header - - if (headerEnd < lineLength) - { - endCh = line[headerEnd]; - } - if (i > 0) - { - prevCh = line[i-1]; - } - - if (!checkBoundry) - { - return header; - } - else if (prevCh != 0 - && isLegalNameChar(startCh) - && isLegalNameChar(prevCh)) - { - return NULL; - } - else if (headerEnd >= lineLength - || !isLegalNameChar(startCh) - || !isLegalNameChar(endCh)) - { - return header; - } - else - { - return NULL; - } - } - } - - return NULL; - } - - - /** - * check if a specific character can be used in a legal variable/method/class name - * - * @return legality of the char. - * @param ch the character to be checked. - */ - bool ASBeautifier::isWhiteSpace(char ch) const - { - return (ch == ' ' || ch == '\t'); - } - - /** - * find the index number of a string element in a container of strings - * - * @return the index number of element in the ocntainer. -1 if element not found. - * @param container a vector of strings. - * @param element the element to find . - */ - int ASBeautifier::indexOf(vector<const string*> &container, const string *element) - { - vector<const string*>::const_iterator where; - - where= find(container.begin(), container.end(), element); - if (where == container.end()) - return -1; - else - return where - container.begin(); - } - - /** - * trim removes the white space surrounding a line. - * - * @return the trimmed line. - * @param str the line to trim. - */ - string ASBeautifier::trim(const string &str) - { - - int start = 0; - int end = str.length() - 1; - - while (start < end && isWhiteSpace(str[start])) - start++; - - while (start <= end && isWhiteSpace(str[end])) - end--; - - string returnStr(str, start, end+1-start); - return returnStr; - } - -#ifdef USES_NAMESPACE -} -#endif -/* - * Copyright (c) 1998,1999,2000,2001,2002 Tal Davidson. All rights reserved. - * - * compiler_defines.h (1 January 1999) - * by Tal Davidson (davidsont@bigfoot.com) - * This file is a part of "Artistic Style" - an indentater and reformatter - * of C, C++, C# and Java source files. - * - * The "Artistic Style" project, including all files needed to compile it, - * is free software; you can redistribute it and/or use it and/or modify it - * under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2 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. - * - * You should have received a copy of the GNU General Public - * License along with this program. - */ - - -#ifndef ASBEAUTIFIER_H -#define ASBEAUTIFIER_H - -#include "ASResource.h" -#include "compiler_defines.h" -#include "ASSourceIterator.h" - -#include <string> -#include <vector> - - -using namespace std; - -namespace astyle - { - - enum BracketMode { NONE_MODE, ATTACH_MODE, BREAK_MODE, BDAC_MODE }; - enum BracketType { NULL_TYPE = 0, - DEFINITION_TYPE = 1, - COMMAND_TYPE = 2, - ARRAY_TYPE = 4, - SINGLE_LINE_TYPE = 8}; - - - class ASBeautifier : protected ASResource - { - public: - ASBeautifier(); - virtual ~ASBeautifier(); - virtual void init(ASSourceIterator* iter); // pointer to dynamically created iterator. - virtual void init(); - virtual bool hasMoreLines() const; - virtual string nextLine(); - virtual string beautify(const string &line); - void setTabIndentation(int length = 4, bool forceTabs = false); - void setSpaceIndentation(int length = 4); - void setMaxInStatementIndentLength(int max); - void setMinConditionalIndentLength(int min); - void setClassIndent(bool state); - void setSwitchIndent(bool state); - void setCaseIndent(bool state); - void setBracketIndent(bool state); - void setBlockIndent(bool state); - void setNamespaceIndent(bool state); - void setLabelIndent(bool state); - void setCStyle(); - void setJavaStyle(); - void setEmptyLineFill(bool state); - void setPreprocessorIndent(bool state); - - - protected: - int getNextProgramCharDistance(const string &line, int i); - bool isLegalNameChar(char ch) const; - bool isWhiteSpace(char ch) const; - const string *findHeader(const string &line, int i, - const vector<const string*> &possibleHeaders, - bool checkBoundry = true); - string trim(const string &str); - int indexOf(vector<const string*> &container, const string *element); - - private: - ASBeautifier(const ASBeautifier ©); - void operator=(ASBeautifier&); // not to be implemented - - void initStatic(); - void registerInStatementIndent(const string &line, int i, int spaceTabCount, - int minIndent, bool updateParenStack); - string preLineWS(int spaceTabCount, int tabCount); - - static vector<const string*> headers; - static vector<const string*> nonParenHeaders; - static vector<const string*> preprocessorHeaders; - static vector<const string*> preBlockStatements; - static vector<const string*> assignmentOperators; - static vector<const string*> nonAssignmentOperators; - - static bool calledInitStatic; - - ASSourceIterator *sourceIterator; - vector<ASBeautifier*> *waitingBeautifierStack; - vector<ASBeautifier*> *activeBeautifierStack; - vector<int> *waitingBeautifierStackLengthStack; - vector<int> *activeBeautifierStackLengthStack; - vector<const string*> *headerStack; - vector< vector<const string*>* > *tempStacks; - vector<int> *blockParenDepthStack; - vector<bool> *blockStatementStack; - vector<bool> *parenStatementStack; - vector<int> *inStatementIndentStack; - vector<int> *inStatementIndentStackSizeStack; - vector<int> *parenIndentStack; - vector<bool> *bracketBlockStateStack; - string indentString; - const string *currentHeader; - const string *previousLastLineHeader; - const string *immediatelyPreviousAssignmentOp; - const string *probationHeader; - bool isInQuote; - bool isInComment; - bool isInCase; - bool isInQuestion; - bool isInStatement; - bool isInHeader; - bool isCStyle; - bool isInOperator; - bool isInTemplate; - bool isInConst; - bool isInDefine; - bool isInDefineDefinition; - bool classIndent; - bool isInClassHeader; - bool isInClassHeaderTab; - bool switchIndent; - bool caseIndent; - bool namespaceIndent; - bool bracketIndent; - bool blockIndent; - bool labelIndent; - bool preprocessorIndent; - bool isInConditional; - bool isMinimalConditinalIndentSet; - bool shouldForceTabIndentation; - int minConditionalIndent; - int parenDepth; - int indentLength; - int blockTabCount; - unsigned int leadingWhiteSpaces; - int maxInStatementIndent; - int templateDepth; - char quoteChar; - char prevNonSpaceCh; - char currentNonSpaceCh; - char currentNonLegalCh; - char prevNonLegalCh; - int prevFinalLineSpaceTabCount; - int prevFinalLineTabCount; - bool emptyLineFill; - bool backslashEndsPrevLine; - int defineTabCount; - }; -} - -#endif -/* - * Copyright (c) 1998,1999,2000,2001,2002 Tal Davidson. All rights reserved. - * - * ASFormatter.cpp - * by Tal Davidson (davidsont@bigfoot.com) - * This file is a part of "Artistic Style" - an indentater and reformatter - * of C, C++, C# and Java source files. - * - * The "Artistic Style" project, including all files needed to compile it, - * is free software; you can redistribute it and/or use it and/or modify it - * under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2 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. - * - * You should have received a copy of the GNU General Public - * License along with this program. - * - * - * Patches: - * 26 November 1998 - Richard Bullington - - * A correction of line-breaking in headers following '}', - - * was created using a variation of a patch by Richard Bullington. - * 08 May 2004 - * applied ASFormatter450670.patch.bz2, ASFormatter.cpp.patch.bz2, - * patch1_ssvb_patch.tar.gz - */ - -#include "compiler_defines.h" -#include "ASFormatter.h" - - -#include <string> -#include <cctype> -#include <vector> -#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) ; } -#define IS_A(a,b) ( ((a) & (b)) == (b)) -#ifdef USES_NAMESPACE -using namespace std; - |