--- /dev/null
+// astyle.h
+// Copyright (c) 2017 by Jim Pattee <jimp03@email.com>.
+// This code is licensed under the MIT License.
+// License.md describes the conditions under which this software may be distributed.
+
+#ifndef ASTYLE_H
+#define ASTYLE_H
+
+//-----------------------------------------------------------------------------
+// headers
+//-----------------------------------------------------------------------------
+
+#ifdef __VMS
+ #define __USE_STD_IOSTREAM 1
+ #include <assert>
+#else
+ #include <cassert>
+#endif
+
+#include <cctype>
+#include <iostream> // for cout
+#include <memory>
+#include <string>
+#include <vector>
+
+#ifdef __GNUC__
+ #include <cstring> // need both string and cstring for GCC
+#endif
+
+//-----------------------------------------------------------------------------
+// declarations
+//-----------------------------------------------------------------------------
+
+#ifdef _MSC_VER
+ #pragma warning(disable: 4267) // conversion from size_t to int
+#endif
+
+#ifdef __BORLANDC__
+ #pragma warn -8004 // variable is assigned a value that is never used
+#endif
+
+#ifdef __INTEL_COMPILER
+ #pragma warning(disable: 383) // value copied to temporary, reference to temporary used
+ #pragma warning(disable: 981) // operands are evaluated in unspecified order
+#endif
+
+#ifdef __clang__
+ #pragma clang diagnostic ignored "-Wshorten-64-to-32"
+#endif
+
+//-----------------------------------------------------------------------------
+// astyle namespace
+//-----------------------------------------------------------------------------
+
+namespace astyle {
+//
+using namespace std;
+
+//----------------------------------------------------------------------------
+// definitions
+//----------------------------------------------------------------------------
+
+enum FileType { C_TYPE = 0, JAVA_TYPE = 1, SHARP_TYPE = 2 };
+
+/* The enums below are not recognized by 'vectors' in Microsoft Visual C++
+ V5 when they are part of a namespace!!! Use Visual C++ V6 or higher.
+*/
+enum FormatStyle
+{
+ STYLE_NONE,
+ STYLE_ALLMAN,
+ STYLE_JAVA,
+ STYLE_KR,
+ STYLE_STROUSTRUP,
+ STYLE_WHITESMITH,
+ STYLE_VTK,
+ STYLE_BANNER,
+ STYLE_GNU,
+ STYLE_LINUX,
+ STYLE_HORSTMANN,
+ STYLE_1TBS,
+ STYLE_GOOGLE,
+ STYLE_MOZILLA,
+ STYLE_PICO,
+ STYLE_LISP
+};
+
+enum BraceMode
+{
+ NONE_MODE,
+ ATTACH_MODE,
+ BREAK_MODE,
+ LINUX_MODE,
+ RUN_IN_MODE // broken braces
+};
+
+// maximun value for int is 16,384 (total value of 32,767)
+enum BraceType
+{
+ NULL_TYPE = 0,
+ NAMESPACE_TYPE = 1, // also a DEFINITION_TYPE
+ CLASS_TYPE = 2, // also a DEFINITION_TYPE
+ STRUCT_TYPE = 4, // also a DEFINITION_TYPE
+ INTERFACE_TYPE = 8, // also a DEFINITION_TYPE
+ DEFINITION_TYPE = 16,
+ COMMAND_TYPE = 32,
+ ARRAY_NIS_TYPE = 64, // also an ARRAY_TYPE
+ ENUM_TYPE = 128, // also an ARRAY_TYPE
+ INIT_TYPE = 256, // also an ARRAY_TYPE
+ ARRAY_TYPE = 512,
+ EXTERN_TYPE = 1024, // extern "C", not a command type extern
+ EMPTY_BLOCK_TYPE = 2048, // also a SINGLE_LINE_TYPE
+ BREAK_BLOCK_TYPE = 4096, // also a SINGLE_LINE_TYPE
+ SINGLE_LINE_TYPE = 8192
+};
+
+enum MinConditional
+{
+ MINCOND_ZERO,
+ MINCOND_ONE,
+ MINCOND_TWO,
+ MINCOND_ONEHALF,
+ MINCOND_END
+};
+
+enum ObjCColonPad
+{
+ COLON_PAD_NO_CHANGE,
+ COLON_PAD_NONE,
+ COLON_PAD_ALL,
+ COLON_PAD_AFTER,
+ COLON_PAD_BEFORE
+};
+
+enum PointerAlign
+{
+ PTR_ALIGN_NONE,
+ PTR_ALIGN_TYPE,
+ PTR_ALIGN_MIDDLE,
+ PTR_ALIGN_NAME
+};
+
+enum ReferenceAlign
+{
+ REF_ALIGN_NONE = PTR_ALIGN_NONE,
+ REF_ALIGN_TYPE = PTR_ALIGN_TYPE,
+ REF_ALIGN_MIDDLE = PTR_ALIGN_MIDDLE,
+ REF_ALIGN_NAME = PTR_ALIGN_NAME,
+ REF_SAME_AS_PTR
+};
+
+enum FileEncoding
+{
+ ENCODING_8BIT,
+ UTF_16BE,
+ UTF_16LE, // Windows default
+ UTF_32BE,
+ UTF_32LE
+};
+
+enum LineEndFormat
+{
+ LINEEND_DEFAULT, // Use line break that matches most of the file
+ LINEEND_WINDOWS,
+ LINEEND_LINUX,
+ LINEEND_MACOLD,
+ LINEEND_CRLF = LINEEND_WINDOWS,
+ LINEEND_LF = LINEEND_LINUX,
+ LINEEND_CR = LINEEND_MACOLD
+};
+
+//-----------------------------------------------------------------------------
+// Class ASSourceIterator
+// A pure virtual class is used by ASFormatter and ASBeautifier instead of
+// ASStreamIterator. This allows programs using AStyle as a plug-in to define
+// their own ASStreamIterator. The ASStreamIterator class must inherit
+// this class.
+//-----------------------------------------------------------------------------
+
+class ASSourceIterator
+{
+public:
+ ASSourceIterator() {}
+ virtual ~ASSourceIterator() {}
+ virtual int getStreamLength() const = 0;
+ virtual bool hasMoreLines() const = 0;
+ virtual string nextLine(bool emptyLineWasDeleted = false) = 0;
+ virtual string peekNextLine() = 0;
+ virtual void peekReset() = 0;
+ virtual streamoff tellg() = 0;
+};
+
+//-----------------------------------------------------------------------------
+// Class ASPeekStream
+// A small class using RAII to peek ahead in the ASSourceIterator stream
+// and to reset the ASSourceIterator pointer in the destructor.
+// It enables a return from anywhere in the method.
+//-----------------------------------------------------------------------------
+
+class ASPeekStream
+{
+private:
+ ASSourceIterator* sourceIterator;
+ bool needReset; // reset sourceIterator to the original position
+
+public:
+ explicit ASPeekStream(ASSourceIterator* sourceIterator_)
+ { sourceIterator = sourceIterator_; needReset = false; }
+
+ ~ASPeekStream()
+ { if (needReset) sourceIterator->peekReset(); }
+
+ bool hasMoreLines() const
+ { return sourceIterator->hasMoreLines(); }
+
+ string peekNextLine()
+ { needReset = true; return sourceIterator->peekNextLine(); }
+};
+
+
+//-----------------------------------------------------------------------------
+// Class ASResource
+//-----------------------------------------------------------------------------
+
+class ASResource
+{
+public:
+ void buildAssignmentOperators(vector<const string*>* assignmentOperators);
+ void buildCastOperators(vector<const string*>* castOperators);
+ void buildHeaders(vector<const string*>* headers, int fileType, bool beautifier = false);
+ void buildIndentableMacros(vector<const pair<const string, const string>* >* indentableMacros);
+ void buildIndentableHeaders(vector<const string*>* indentableHeaders);
+ void buildNonAssignmentOperators(vector<const string*>* nonAssignmentOperators);
+ void buildNonParenHeaders(vector<const string*>* nonParenHeaders, int fileType, bool beautifier = false);
+ void buildOperators(vector<const string*>* operators, int fileType);
+ void buildPreBlockStatements(vector<const string*>* preBlockStatements, int fileType);
+ void buildPreCommandHeaders(vector<const string*>* preCommandHeaders, int fileType);
+ void buildPreDefinitionHeaders(vector<const string*>* preDefinitionHeaders, int fileType);
+
+public:
+ static const string AS_IF, AS_ELSE;
+ static const string AS_DO, AS_WHILE;
+ static const string AS_FOR;
+ static const string AS_SWITCH, AS_CASE, AS_DEFAULT;
+ static const string AS_TRY, AS_CATCH, AS_THROW, AS_THROWS, AS_FINALLY, AS_USING;
+ static const string _AS_TRY, _AS_FINALLY, _AS_EXCEPT;
+ static const string AS_PUBLIC, AS_PROTECTED, AS_PRIVATE;
+ static const string AS_CLASS, AS_STRUCT, AS_UNION, AS_INTERFACE, AS_NAMESPACE;
+ static const string AS_MODULE;
+ static const string AS_END;
+ static const string AS_SELECTOR;
+ static const string AS_EXTERN, AS_ENUM;
+ static const string AS_STATIC, AS_CONST, AS_SEALED, AS_OVERRIDE, AS_VOLATILE, AS_NEW, AS_DELETE;
+ static const string AS_NOEXCEPT, AS_INTERRUPT, AS_AUTORELEASEPOOL;
+ static const string AS_WHERE, AS_LET, AS_SYNCHRONIZED;
+ static const string AS_OPERATOR, AS_TEMPLATE;
+ static const string AS_OPEN_BRACE, AS_CLOSE_BRACE;
+ static const string AS_OPEN_LINE_COMMENT, AS_OPEN_COMMENT, AS_CLOSE_COMMENT;
+ static const string AS_BAR_DEFINE, AS_BAR_INCLUDE, AS_BAR_IF, AS_BAR_EL, AS_BAR_ENDIF;
+ static const string AS_AUTO, AS_RETURN;
+ static const string AS_CIN, AS_COUT, AS_CERR;
+ static const string AS_ASSIGN, AS_PLUS_ASSIGN, AS_MINUS_ASSIGN, AS_MULT_ASSIGN;
+ static const string AS_DIV_ASSIGN, AS_MOD_ASSIGN, AS_XOR_ASSIGN, AS_OR_ASSIGN, AS_AND_ASSIGN;
+ static const string AS_GR_GR_ASSIGN, AS_LS_LS_ASSIGN, AS_GR_GR_GR_ASSIGN, AS_LS_LS_LS_ASSIGN;
+ static const string AS_GCC_MIN_ASSIGN, AS_GCC_MAX_ASSIGN;
+ static const string AS_EQUAL, AS_PLUS_PLUS, AS_MINUS_MINUS, AS_NOT_EQUAL, AS_GR_EQUAL;
+ static const string AS_LS_EQUAL, AS_LS_LS_LS, AS_LS_LS, AS_GR_GR_GR, AS_GR_GR;
+ static const string AS_QUESTION_QUESTION, AS_LAMBDA;
+ static const string AS_ARROW, AS_AND, AS_OR;
+ static const string AS_SCOPE_RESOLUTION;
+ static const string AS_PLUS, AS_MINUS, AS_MULT, AS_DIV, AS_MOD, AS_GR, AS_LS;
+ static const string AS_NOT, AS_BIT_XOR, AS_BIT_OR, AS_BIT_AND, AS_BIT_NOT;
+ static const string AS_QUESTION, AS_COLON, AS_SEMICOLON, AS_COMMA;
+ static const string AS_ASM, AS__ASM__, AS_MS_ASM, AS_MS__ASM;
+ static const string AS_QFOREACH, AS_QFOREVER, AS_FOREVER;
+ static const string AS_FOREACH, AS_LOCK, AS_UNSAFE, AS_FIXED;
+ static const string AS_GET, AS_SET, AS_ADD, AS_REMOVE;
+ static const string AS_DELEGATE, AS_UNCHECKED;
+ static const string AS_CONST_CAST, AS_DYNAMIC_CAST, AS_REINTERPRET_CAST, AS_STATIC_CAST;
+ static const string AS_NS_DURING, AS_NS_HANDLER;
+}; // Class ASResource
+
+//-----------------------------------------------------------------------------
+// Class ASBase
+// Functions definitions are at the end of ASResource.cpp.
+//-----------------------------------------------------------------------------
+
+class ASBase : protected ASResource
+{
+private:
+ // all variables should be set by the "init" function
+ int baseFileType; // a value from enum FileType
+
+protected:
+ ASBase() : baseFileType(C_TYPE) { }
+
+protected: // inline functions
+ void init(int fileTypeArg) { baseFileType = fileTypeArg; }
+ bool isCStyle() const { return (baseFileType == C_TYPE); }
+ bool isJavaStyle() const { return (baseFileType == JAVA_TYPE); }
+ bool isSharpStyle() const { return (baseFileType == SHARP_TYPE); }
+ bool isWhiteSpace(char ch) const { return (ch == ' ' || ch == '\t'); }
+
+protected: // functions definitions are at the end of ASResource.cpp
+ const string* findHeader(const string& line, int i,
+ const vector<const string*>* possibleHeaders) const;
+ bool findKeyword(const string& line, int i, const string& keyword) const;
+ const string* findOperator(const string& line, int i,
+ const vector<const string*>* possibleOperators) const;
+ string getCurrentWord(const string& line, size_t index) const;
+ bool isDigit(char ch) const;
+ bool isLegalNameChar(char ch) const;
+ bool isCharPotentialHeader(const string& line, size_t i) const;
+ bool isCharPotentialOperator(char ch) const;
+ bool isDigitSeparator(const string& line, int i) const;
+ char peekNextChar(const string& line, int i) const;
+
+}; // Class ASBase
+
+//-----------------------------------------------------------------------------
+// Class ASBeautifier
+//-----------------------------------------------------------------------------
+
+class ASBeautifier : protected ASBase
+{
+public:
+ ASBeautifier();
+ virtual ~ASBeautifier();
+ virtual void init(ASSourceIterator* iter);
+ virtual string beautify(const string& originalLine);
+ void setCaseIndent(bool state);
+ void setClassIndent(bool state);
+ void setContinuationIndentation(int indent = 1);
+ void setCStyle();
+ void setDefaultTabLength();
+ void setEmptyLineFill(bool state);
+ void setForceTabXIndentation(int length);
+ void setAfterParenIndent(bool state);
+ void setJavaStyle();
+ void setLabelIndent(bool state);
+ void setMaxContinuationIndentLength(int max);
+ void setMaxInStatementIndentLength(int max);
+ void setMinConditionalIndentOption(int min);
+ void setMinConditionalIndentLength();
+ void setModeManuallySet(bool state);
+ void setModifierIndent(bool state);
+ void setNamespaceIndent(bool state);
+ void setAlignMethodColon(bool state);
+ void setSharpStyle();
+ void setSpaceIndentation(int length = 4);
+ void setSwitchIndent(bool state);
+ void setTabIndentation(int length = 4, bool forceTabs = false);
+ void setPreprocDefineIndent(bool state);
+ void setPreprocConditionalIndent(bool state);
+ int getBeautifierFileType() const;
+ int getFileType() const;
+ int getIndentLength() const;
+ int getTabLength() const;
+ string getIndentString() const;
+ string getNextWord(const string& line, size_t currPos) const;
+ bool getAlignMethodColon() const;
+ bool getBraceIndent() const;
+ bool getBlockIndent() const;
+ bool getCaseIndent() const;
+ bool getClassIndent() const;
+ bool getEmptyLineFill() const;
+ bool getForceTabIndentation() const;
+ bool getModeManuallySet() const;
+ bool getModifierIndent() const;
+ bool getNamespaceIndent() const;
+ bool getPreprocDefineIndent() const;
+ bool getSwitchIndent() const;
+
+protected:
+ void deleteBeautifierVectors();
+ int getNextProgramCharDistance(const string& line, int i) const;
+ int indexOf(const vector<const string*>& container, const string* element) const;
+ void setBlockIndent(bool state);
+ void setBraceIndent(bool state);
+ void setBraceIndentVtk(bool state);
+ string extractPreprocessorStatement(const string& line) const;
+ string trim(const string& str) const;
+ string rtrim(const string& str) const;
+
+ // variables set by ASFormatter - must be updated in activeBeautifierStack
+ int inLineNumber;
+ int runInIndentContinuation;
+ int nonInStatementBrace;
+ int objCColonAlignSubsequent; // for subsequent lines not counting indent
+ bool lineCommentNoBeautify;
+ bool isElseHeaderIndent;
+ bool isCaseHeaderCommentIndent;
+ bool isNonInStatementArray;
+ bool isSharpAccessor;
+ bool isSharpDelegate;
+ bool isInExternC;
+ bool isInBeautifySQL;
+ bool isInIndentableStruct;
+ bool isInIndentablePreproc;
+
+private: // functions
+ ASBeautifier(const ASBeautifier& other); // inline functions
+ ASBeautifier& operator=(ASBeautifier&); // not to be implemented
+
+ void adjustObjCMethodDefinitionIndentation(const string& line_);
+ void adjustObjCMethodCallIndentation(const string& line_);
+ void adjustParsedLineIndentation(size_t iPrelim, bool isInExtraHeaderIndent);
+ void computePreliminaryIndentation();
+ void parseCurrentLine(const string& line);
+ void popLastContinuationIndent();
+ void processPreprocessor(const string& preproc, const string& line);
+ void registerContinuationIndent(const string& line, int i, int spaceIndentCount_,
+ int tabIncrementIn, int minIndent, bool updateParenStack);
+ void registerContinuationIndentColon(const string& line, int i, int tabIncrementIn);
+ void initVectors();
+ void initTempStacksContainer(vector<vector<const string*>*>*& container,
+ vector<vector<const string*>*>* value);
+ void clearObjCMethodDefinitionAlignment();
+ void deleteBeautifierContainer(vector<ASBeautifier*>*& container);
+ void deleteTempStacksContainer(vector<vector<const string*>*>*& container);
+ int adjustIndentCountForBreakElseIfComments() const;
+ int computeObjCColonAlignment(const string& line, int colonAlignPosition) const;
+ int convertTabToSpaces(int i, int tabIncrementIn) const;
+ int getContinuationIndentAssign(const string& line, size_t currPos) const;
+ int getContinuationIndentComma(const string& line, size_t currPos) const;
+ int getObjCFollowingKeyword(const string& line, int bracePos) const;
+ bool isIndentedPreprocessor(const string& line, size_t currPos) const;
+ bool isLineEndComment(const string& line, int startPos) const;
+ bool isPreprocessorConditionalCplusplus(const string& line) const;
+ bool isInPreprocessorUnterminatedComment(const string& line);
+ bool statementEndsWithComma(const string& line, int index) const;
+ const string& getIndentedLineReturn(const string& newLine, const string& originalLine) const;
+ string getIndentedSpaceEquivalent(const string& line_) const;
+ string preLineWS(int lineIndentCount, int lineSpaceIndentCount) const;
+ template<typename T> void deleteContainer(T& container);
+ template<typename T> void initContainer(T& container, T value);
+ vector<vector<const string*>*>* copyTempStacks(const ASBeautifier& other) const;
+ pair<int, int> computePreprocessorIndent();
+
+private: // variables
+ int beautifierFileType;
+ vector<const string*>* headers;
+ vector<const string*>* nonParenHeaders;
+ vector<const string*>* preBlockStatements;
+ vector<const string*>* preCommandHeaders;
+ vector<const string*>* assignmentOperators;
+ vector<const string*>* nonAssignmentOperators;
+ vector<const string*>* indentableHeaders;
+
+ vector<ASBeautifier*>* waitingBeautifierStack;
+ vector<ASBeautifier*>* activeBeautifierStack;
+ vector<int>* waitingBeautifierStackLengthStack;
+ vector<int>* activeBeautifierStackLengthStack;
+ vector<const string*>* headerStack;
+ vector<vector<const string*>* >* tempStacks;
+ vector<int>* squareBracketDepthStack;
+ vector<bool>* blockStatementStack;
+ vector<bool>* parenStatementStack;
+ vector<bool>* braceBlockStateStack;
+ vector<int>* continuationIndentStack;
+ vector<int>* continuationIndentStackSizeStack;
+ vector<int>* parenIndentStack;
+ vector<pair<int, int> >* preprocIndentStack;
+
+ ASSourceIterator* sourceIterator;
+ const string* currentHeader;
+ const string* previousLastLineHeader;
+ const string* probationHeader;
+ const string* lastLineHeader;
+ string indentString;
+ string verbatimDelimiter;
+ bool isInQuote;
+ bool isInVerbatimQuote;
+ bool haveLineContinuationChar;
+ bool isInAsm;
+ bool isInAsmOneLine;
+ bool isInAsmBlock;
+ bool isInComment;
+ bool isInPreprocessorComment;
+ bool isInRunInComment;
+ bool isInCase;
+ bool isInQuestion;
+ bool isContinuation;
+ bool isInHeader;
+ bool isInTemplate;
+ bool isInDefine;
+ bool isInDefineDefinition;
+ bool classIndent;
+ bool isIndentModeOff;
+ bool isInClassHeader; // is in a class before the opening brace
+ bool isInClassHeaderTab; // is in an indentable class header line
+ bool isInClassInitializer; // is in a class after the ':' initializer
+ bool isInClass; // is in a class after the opening brace
+ bool isInObjCMethodDefinition;
+ bool isInObjCMethodCall;
+ bool isInObjCMethodCallFirst;
+ bool isImmediatelyPostObjCMethodDefinition;
+ bool isImmediatelyPostObjCMethodCall;
+ bool isInIndentablePreprocBlock;
+ bool isInObjCInterface;
+ bool isInEnum;
+ bool isInEnumTypeID;
+ bool isInLet;
+ bool modifierIndent;
+ bool switchIndent;
+ bool caseIndent;
+ bool namespaceIndent;
+ bool blockIndent;
+ bool braceIndent;
+ bool braceIndentVtk;
+ bool shouldIndentAfterParen;
+ bool labelIndent;
+ bool shouldIndentPreprocDefine;
+ bool isInConditional;
+ bool isModeManuallySet;
+ bool shouldForceTabIndentation;
+ bool emptyLineFill;
+ bool backslashEndsPrevLine;
+ bool lineOpensWithLineComment;
+ bool lineOpensWithComment;
+ bool lineStartsInComment;
+ bool blockCommentNoIndent;
+ bool blockCommentNoBeautify;
+ bool previousLineProbationTab;
+ bool lineBeginsWithOpenBrace;
+ bool lineBeginsWithCloseBrace;
+ bool lineBeginsWithComma;
+ bool lineIsCommentOnly;
+ bool lineIsLineCommentOnly;
+ bool shouldIndentBracedLine;
+ bool isInSwitch;
+ bool foundPreCommandHeader;
+ bool foundPreCommandMacro;
+ bool shouldAlignMethodColon;
+ bool shouldIndentPreprocConditional;
+ int indentCount;
+ int spaceIndentCount;
+ int spaceIndentObjCMethodAlignment;
+ int bracePosObjCMethodAlignment;
+ int colonIndentObjCMethodAlignment;
+ int lineOpeningBlocksNum;
+ int lineClosingBlocksNum;
+ int fileType;
+ int minConditionalOption;
+ int minConditionalIndent;
+ int parenDepth;
+ int indentLength;
+ int tabLength;
+ int continuationIndent;
+ int blockTabCount;
+ int maxContinuationIndent;
+ int classInitializerIndents;
+ int templateDepth;
+ int squareBracketCount;
+ int prevFinalLineSpaceIndentCount;
+ int prevFinalLineIndentCount;
+ int defineIndentCount;
+ int preprocBlockIndent;
+ char quoteChar;
+ char prevNonSpaceCh;
+ char currentNonSpaceCh;
+ char currentNonLegalCh;
+ char prevNonLegalCh;
+}; // Class ASBeautifier
+
+//-----------------------------------------------------------------------------
+// Class ASEnhancer
+//-----------------------------------------------------------------------------
+
+class ASEnhancer : protected ASBase
+{
+public: // functions
+ ASEnhancer();
+ virtual ~ASEnhancer();
+ void init(int, int, int, bool, bool, bool, bool, bool, bool, bool,
+ vector<const pair<const string, const string>* >*);
+ void enhance(string& line, bool isInNamespace, bool isInPreprocessor, bool isInSQL);
+
+private: // functions
+ void convertForceTabIndentToSpaces(string& line) const;
+ void convertSpaceIndentToForceTab(string& line) const;
+ size_t findCaseColon(const string& line, size_t caseIndex) const;
+ int indentLine(string& line, int indent) const;
+ bool isBeginDeclareSectionSQL(const string& line, size_t index) const;
+ bool isEndDeclareSectionSQL(const string& line, size_t index) const;
+ bool isOneLineBlockReached(const string& line, int startChar) const;
+ void parseCurrentLine(string& line, bool isInPreprocessor, bool isInSQL);
+ size_t processSwitchBlock(string& line, size_t index);
+ int unindentLine(string& line, int unindent) const;
+
+private:
+ // options from command line or options file
+ int indentLength;
+ int tabLength;
+ bool useTabs;
+ bool forceTab;
+ bool namespaceIndent;
+ bool caseIndent;
+ bool preprocBlockIndent;
+ bool preprocDefineIndent;
+ bool emptyLineFill;
+
+ // parsing variables
+ int lineNumber;
+ bool isInQuote;
+ bool isInComment;
+ char quoteChar;
+
+ // unindent variables
+ int braceCount;
+ int switchDepth;
+ int eventPreprocDepth;
+ bool lookingForCaseBrace;
+ bool unindentNextLine;
+ bool shouldUnindentLine;
+ bool shouldUnindentComment;
+
+ // struct used by ParseFormattedLine function
+ // contains variables used to unindent the case blocks
+ struct SwitchVariables
+ {
+ int switchBraceCount;
+ int unindentDepth;
+ bool unindentCase;
+ };
+
+ SwitchVariables sw; // switch variables struct
+ vector<SwitchVariables> switchStack; // stack vector of switch variables
+
+ // event table variables
+ bool nextLineIsEventIndent; // begin event table indent is reached
+ bool isInEventTable; // need to indent an event table
+ vector<const pair<const string, const string>* >* indentableMacros;
+
+ // SQL variables
+ bool nextLineIsDeclareIndent; // begin declare section indent is reached
+ bool isInDeclareSection; // need to indent a declare section
+
+}; // Class ASEnhancer
+
+//-----------------------------------------------------------------------------
+// Class ASFormatter
+//-----------------------------------------------------------------------------
+
+class ASFormatter : public ASBeautifier
+{
+public: // functions
+ ASFormatter();
+ virtual ~ASFormatter();
+ virtual void init(ASSourceIterator* si);
+ virtual bool hasMoreLines() const;
+ virtual string nextLine();
+ LineEndFormat getLineEndFormat() const;
+ bool getIsLineReady() const;
+ void setFormattingStyle(FormatStyle style);
+ void setAddBracesMode(bool state);
+ void setAddOneLineBracesMode(bool state);
+ void setRemoveBracesMode(bool state);
+ void setAttachClass(bool state);
+ void setAttachClosingWhile(bool state);
+ void setAttachExternC(bool state);
+ void setAttachNamespace(bool state);
+ void setAttachInline(bool state);
+ void setBraceFormatMode(BraceMode mode);
+ void setBreakAfterMode(bool state);
+ void setBreakClosingHeaderBracesMode(bool state);
+ void setBreakBlocksMode(bool state);
+ void setBreakClosingHeaderBlocksMode(bool state);
+ void setBreakElseIfsMode(bool state);
+ void setBreakOneLineBlocksMode(bool state);
+ void setBreakOneLineHeadersMode(bool state);
+ void setBreakOneLineStatementsMode(bool state);
+ void setMethodPrefixPaddingMode(bool state);
+ void setMethodPrefixUnPaddingMode(bool state);
+ void setReturnTypePaddingMode(bool state);
+ void setReturnTypeUnPaddingMode(bool state);
+ void setParamTypePaddingMode(bool state);
+ void setParamTypeUnPaddingMode(bool state);
+ void setCloseTemplatesMode(bool state);
+ void setCommaPaddingMode(bool state);
+ void setDeleteEmptyLinesMode(bool state);
+ void setIndentCol1CommentsMode(bool state);
+ void setLineEndFormat(LineEndFormat fmt);
+ void setMaxCodeLength(int max);
+ void setObjCColonPaddingMode(ObjCColonPad mode);
+ void setOperatorPaddingMode(bool state);
+ void setParensOutsidePaddingMode(bool state);
+ void setParensFirstPaddingMode(bool state);
+ void setParensInsidePaddingMode(bool state);
+ void setParensHeaderPaddingMode(bool state);
+ void setParensUnPaddingMode(bool state);
+ void setPointerAlignment(PointerAlign alignment);
+ void setPreprocBlockIndent(bool state);
+ void setReferenceAlignment(ReferenceAlign alignment);
+ void setStripCommentPrefix(bool state);
+ void setTabSpaceConversionMode(bool state);
+ size_t getChecksumIn() const;
+ size_t getChecksumOut() const;
+ int getChecksumDiff() const;
+ int getFormatterFileType() const;
+ // retained for compatability with release 2.06
+ // "Brackets" have been changed to "Braces" in 3.0
+ // they are referenced only by the old "bracket" options
+ void setAddBracketsMode(bool state);
+ void setAddOneLineBracketsMode(bool state);
+ void setRemoveBracketsMode(bool state);
+ void setBreakClosingHeaderBracketsMode(bool state);
+
+
+private: // functions
+ ASFormatter(const ASFormatter& copy); // not to be implemented
+ ASFormatter& operator=(ASFormatter&); // not to be implemented
+ template<typename T> void deleteContainer(T& container);
+ template<typename T> void initContainer(T& container, T value);
+ char peekNextChar() const;
+ BraceType getBraceType();
+ bool adjustChecksumIn(int adjustment);
+ bool computeChecksumIn(const string& currentLine_);
+ bool computeChecksumOut(const string& beautifiedLine);
+ bool addBracesToStatement();
+ bool removeBracesFromStatement();
+ bool commentAndHeaderFollows();
+ bool getNextChar();
+ bool getNextLine(bool emptyLineWasDeleted = false);
+ bool isArrayOperator() const;
+ bool isBeforeComment() const;
+ bool isBeforeAnyComment() const;
+ bool isBeforeAnyLineEndComment(int startPos) const;
+ bool isBeforeMultipleLineEndComments(int startPos) const;
+ bool isBraceType(BraceType a, BraceType b) const;
+ bool isClassInitializer() const;
+ bool isClosingHeader(const string* header) const;
+ bool isCurrentBraceBroken() const;
+ bool isDereferenceOrAddressOf() const;
+ bool isExecSQL(const string& line, size_t index) const;
+ bool isEmptyLine(const string& line) const;
+ bool isExternC() const;
+ bool isMultiStatementLine() const;
+ bool isNextWordSharpNonParenHeader(int startChar) const;
+ bool isNonInStatementArrayBrace() const;
+ bool isOkToSplitFormattedLine();
+ bool isPointerOrReference() const;
+ bool isPointerOrReferenceCentered() const;
+ bool isPointerOrReferenceVariable(const string& word) const;
+ bool isSharpStyleWithParen(const string* header) const;
+ bool isStructAccessModified(const string& firstLine, size_t index) const;
+ bool isIndentablePreprocessorBlock(const string& firstLine, size_t index);
+ bool isNDefPreprocStatement(const string& nextLine_, const string& preproc) const;
+ bool isUnaryOperator() const;
+ bool isUniformInitializerBrace() const;
+ bool isImmediatelyPostCast() const;
+ bool isInExponent() const;
+ bool isInSwitchStatement() const;
+ bool isNextCharOpeningBrace(int startChar) const;
+ bool isOkToBreakBlock(BraceType braceType) const;
+ bool isOperatorPaddingDisabled() const;
+ bool pointerSymbolFollows() const;
+ int findObjCColonAlignment() const;
+ int getCurrentLineCommentAdjustment();
+ int getNextLineCommentAdjustment();
+ int isOneLineBlockReached(const string& line, int startChar) const;
+ void adjustComments();
+ void appendChar(char ch, bool canBreakLine);
+ void appendCharInsideComments();
+ void appendClosingHeader();
+ void appendOperator(const string& sequence, bool canBreakLine = true);
+ void appendSequence(const string& sequence, bool canBreakLine = true);
+ void appendSpacePad();
+ void appendSpaceAfter();
+ void breakLine(bool isSplitLine = false);
+ void buildLanguageVectors();
+ void updateFormattedLineSplitPoints(char appendedChar);
+ void updateFormattedLineSplitPointsOperator(const string& sequence);
+ void checkIfTemplateOpener();
+ void clearFormattedLineSplitPoints();
+ void convertTabToSpaces();
+ void deleteContainer(vector<BraceType>*& container);
+ void formatArrayRunIn();
+ void formatRunIn();
+ void formatArrayBraces(BraceType braceType, bool isOpeningArrayBrace);
+ void formatClosingBrace(BraceType braceType);
+ void formatCommentBody();
+ void formatCommentOpener();
+ void formatCommentCloser();
+ void formatLineCommentBody();
+ void formatLineCommentOpener();
+ void formatOpeningBrace(BraceType braceType);
+ void formatQuoteBody();
+ void formatQuoteOpener();
+ void formatPointerOrReference();
+ void formatPointerOrReferenceCast();
+ void formatPointerOrReferenceToMiddle();
+ void formatPointerOrReferenceToName();
+ void formatPointerOrReferenceToType();
+ void fixOptionVariableConflicts();
+ void goForward(int i);
+ void isLineBreakBeforeClosingHeader();
+ void initContainer(vector<BraceType>*& container, vector<BraceType>* value);
+ void initNewLine();
+ void padObjCMethodColon();
+ void padObjCMethodPrefix();
+ void padObjCParamType();
+ void padObjCReturnType();
+ void padOperators(const string* newOperator);
+ void padParens();
+ void processPreprocessor();
+ void resetEndOfStatement();
+ void setAttachClosingBraceMode(bool state);
+ void stripCommentPrefix();
+ void testForTimeToSplitFormattedLine();
+ void trimContinuationLine();
+ void updateFormattedLineSplitPointsPointerOrReference(size_t index);
+ size_t findFormattedLineSplitPoint() const;
+ size_t findNextChar(const string& line, char searchChar, int searchStart = 0) const;
+ const string* checkForHeaderFollowingComment(const string& firstLine) const;
+ const string* getFollowingOperator() const;
+ string getPreviousWord(const string& line, int currPos) const;
+ string peekNextText(const string& firstLine,
+ bool endOnEmptyLine = false,
+ shared_ptr<ASPeekStream> streamArg = nullptr) const;
+
+private: // variables
+ int formatterFileType;
+ vector<const string*>* headers;
+ vector<const string*>* nonParenHeaders;
+ vector<const string*>* preDefinitionHeaders;
+ vector<const string*>* preCommandHeaders;
+ vector<const string*>* operators;
+ vector<const string*>* assignmentOperators;
+ vector<const string*>* castOperators;
+ vector<const pair<const string, const string>* >* indentableMacros; // for ASEnhancer
+
+ ASSourceIterator* sourceIterator;
+ ASEnhancer* enhancer;
+
+ vector<const string*>* preBraceHeaderStack;
+ vector<BraceType>* braceTypeStack;
+ vector<int>* parenStack;
+ vector<bool>* structStack;
+ vector<bool>* questionMarkStack;
+
+ string currentLine;
+ string formattedLine;
+ string readyFormattedLine;
+ string verbatimDelimiter;
+ const string* currentHeader;
+ char currentChar;
+ char previousChar;
+ char previousNonWSChar;
+ char previousCommandChar;
+ char quoteChar;
+ streamoff preprocBlockEnd;
+ int charNum;
+ int runInIndentChars;
+ int nextLineSpacePadNum;
+ int objCColonAlign;
+ int preprocBraceTypeStackSize;
+ int spacePadNum;
+ int tabIncrementIn;
+ int templateDepth;
+ int squareBracketCount;
+ size_t checksumIn;
+ size_t checksumOut;
+ size_t currentLineFirstBraceNum; // first brace location on currentLine
+ size_t formattedLineCommentNum; // comment location on formattedLine
+ size_t leadingSpaces;
+ size_t maxCodeLength;
+
+ // possible split points
+ size_t maxSemi; // probably a 'for' statement
+ size_t maxAndOr; // probably an 'if' statement
+ size_t maxComma;
+ size_t maxParen;
+ size_t maxWhiteSpace;
+ size_t maxSemiPending;
+ size_t maxAndOrPending;
+ size_t maxCommaPending;
+ size_t maxParenPending;
+ size_t maxWhiteSpacePending;
+
+ size_t previousReadyFormattedLineLength;
+ FormatStyle formattingStyle;
+ BraceMode braceFormatMode;
+ BraceType previousBraceType;
+ PointerAlign pointerAlignment;
+ ReferenceAlign referenceAlignment;
+ ObjCColonPad objCColonPadMode;
+ LineEndFormat lineEnd;
+ bool isVirgin;
+ bool isInVirginLine;
+ bool shouldPadCommas;
+ bool shouldPadOperators;
+ bool shouldPadParensOutside;
+ bool shouldPadFirstParen;
+ bool shouldPadParensInside;
+ bool shouldPadHeader;
+ bool shouldStripCommentPrefix;
+ bool shouldUnPadParens;
+ bool shouldConvertTabs;
+ bool shouldIndentCol1Comments;
+ bool shouldIndentPreprocBlock;
+ bool shouldCloseTemplates;
+ bool shouldAttachExternC;
+ bool shouldAttachNamespace;
+ bool shouldAttachClass;
+ bool shouldAttachClosingWhile;
+ bool shouldAttachInline;
+ bool isInLineComment;
+ bool isInComment;
+ bool isInCommentStartLine;
+ bool noTrimCommentContinuation;
+ bool isInPreprocessor;
+ bool isInPreprocessorBeautify;
+ bool isInTemplate;
+ bool doesLineStartComment;
+ bool lineEndsInCommentOnly;
+ bool lineIsCommentOnly;
+ bool lineIsLineCommentOnly;
+ bool lineIsEmpty;
+ bool isImmediatelyPostCommentOnly;
+ bool isImmediatelyPostEmptyLine;
+ bool isInClassInitializer;
+ bool isInQuote;
+ bool isInVerbatimQuote;
+ bool haveLineContinuationChar;
+ bool isInQuoteContinuation;
+ bool isHeaderInMultiStatementLine;
+ bool isSpecialChar;
+ bool isNonParenHeader;
+ bool foundQuestionMark;
+ bool foundPreDefinitionHeader;
+ bool foundNamespaceHeader;
+ bool foundClassHeader;
+ bool foundStructHeader;
+ bool foundInterfaceHeader;
+ bool foundPreCommandHeader;
+ bool foundPreCommandMacro;
+ bool foundTrailingReturnType;
+ bool foundCastOperator;
+ bool isInLineBreak;
+ bool endOfAsmReached;
+ bool endOfCodeReached;
+ bool lineCommentNoIndent;
+ bool isFormattingModeOff;
+ bool isInEnum;
+ bool isInExecSQL;
+ bool isInAsm;
+ bool isInAsmOneLine;
+ bool isInAsmBlock;
+ bool isLineReady;
+ bool elseHeaderFollowsComments;
+ bool caseHeaderFollowsComments;
+ bool isPreviousBraceBlockRelated;
+ bool isInPotentialCalculation;
+ bool isCharImmediatelyPostComment;
+ bool isPreviousCharPostComment;
+ bool isCharImmediatelyPostLineComment;
+ bool isCharImmediatelyPostOpenBlock;
+ bool isCharImmediatelyPostCloseBlock;
+ bool isCharImmediatelyPostTemplate;
+ bool isCharImmediatelyPostReturn;
+ bool isCharImmediatelyPostThrow;
+ bool isCharImmediatelyPostNewDelete;
+ bool isCharImmediatelyPostOperator;
+ bool isCharImmediatelyPostPointerOrReference;
+ bool isInObjCMethodDefinition;
+ bool isInObjCInterface;
+ bool isInObjCReturnType;
+ bool isInObjCSelector;
+ bool breakCurrentOneLineBlock;
+ bool shouldRemoveNextClosingBrace;
+ bool isInBraceRunIn;
+ bool currentLineBeginsWithBrace;
+ bool attachClosingBraceMode;
+ bool shouldBreakOneLineBlocks;
+ bool shouldBreakOneLineHeaders;
+ bool shouldBreakOneLineStatements;
+ bool shouldBreakClosingHeaderBraces;
+ bool shouldBreakElseIfs;
+ bool shouldBreakLineAfterLogical;
+ bool shouldAddBraces;
+ bool shouldAddOneLineBraces;
+ bool shouldRemoveBraces;
+ bool shouldPadMethodColon;
+ bool shouldPadMethodPrefix;
+ bool shouldReparseCurrentChar;
+ bool shouldUnPadMethodPrefix;
+ bool shouldPadReturnType;
+ bool shouldUnPadReturnType;
+ bool shouldPadParamType;
+ bool shouldUnPadParamType;
+ bool shouldDeleteEmptyLines;
+ bool needHeaderOpeningBrace;
+ bool shouldBreakLineAtNextChar;
+ bool shouldKeepLineUnbroken;
+ bool passedSemicolon;
+ bool passedColon;
+ bool isImmediatelyPostNonInStmt;
+ bool isCharImmediatelyPostNonInStmt;
+ bool isImmediatelyPostComment;
+ bool isImmediatelyPostLineComment;
+ bool isImmediatelyPostEmptyBlock;
+ bool isImmediatelyPostObjCMethodPrefix;
+ bool isImmediatelyPostPreprocessor;
+ bool isImmediatelyPostReturn;
+ bool isImmediatelyPostThrow;
+ bool isImmediatelyPostNewDelete;
+ bool isImmediatelyPostOperator;
+ bool isImmediatelyPostTemplate;
+ bool isImmediatelyPostPointerOrReference;
+ bool shouldBreakBlocks;
+ bool shouldBreakClosingHeaderBlocks;
+ bool isPrependPostBlockEmptyLineRequested;
+ bool isAppendPostBlockEmptyLineRequested;
+ bool isIndentableProprocessor;
+ bool isIndentableProprocessorBlock;
+ bool prependEmptyLine;
+ bool appendOpeningBrace;
+ bool foundClosingHeader;
+ bool isInHeader;
+ bool isImmediatelyPostHeader;
+ bool isInCase;
+ bool isFirstPreprocConditional;
+ bool processedFirstConditional;
+ bool isJavaStaticConstructor;
+
+private: // inline functions
+ // append the CURRENT character (curentChar) to the current formatted line.
+ void appendCurrentChar(bool canBreakLine = true)
+ { appendChar(currentChar, canBreakLine); }
+
+ // check if a specific sequence exists in the current placement of the current line
+ bool isSequenceReached(const char* sequence) const
+ { return currentLine.compare(charNum, strlen(sequence), sequence) == 0; }
+
+ // call ASBase::findHeader for the current character
+ const string* findHeader(const vector<const string*>* headers_)
+ { return ASBase::findHeader(currentLine, charNum, headers_); }
+
+ // call ASBase::findOperator for the current character
+ const string* findOperator(const vector<const string*>* operators_)
+ { return ASBase::findOperator(currentLine, charNum, operators_); }
+}; // Class ASFormatter
+
+//-----------------------------------------------------------------------------
+// astyle namespace global declarations
+//-----------------------------------------------------------------------------
+// sort comparison functions for ASResource
+bool sortOnLength(const string* a, const string* b);
+bool sortOnName(const string* a, const string* b);
+
+} // namespace astyle
+
+// end of astyle namespace --------------------------------------------------
+
+#endif // closes ASTYLE_H