diff options
author | Kornelius Kalnbach <murphy@rubychan.de> | 2011-09-09 02:05:44 +0200 |
---|---|---|
committer | Kornelius Kalnbach <murphy@rubychan.de> | 2011-09-09 02:05:44 +0200 |
commit | 7567e6e2f18334d3f0b5b3c6c9659a018be00e9e (patch) | |
tree | 18104f93126d0fd3b162ffdc2cadd1da104945ff /bench/example.cpp | |
parent | 74b05c9f583669849fded8417a8f5003be3b3c6c (diff) | |
download | coderay-7567e6e2f18334d3f0b5b3c6c9659a018be00e9e.tar.gz |
remove obsolete big C example code, to make this a Ruby project on GitHub
Diffstat (limited to 'bench/example.cpp')
-rw-r--r-- | bench/example.cpp | 13544 |
1 files changed, 0 insertions, 13544 deletions
diff --git a/bench/example.cpp b/bench/example.cpp deleted file mode 100644 index ba9cf72..0000000 --- a/bench/example.cpp +++ /dev/null @@ -1,13544 +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; - -namespace astyle - { -#endif - - - bool ASFormatter::calledInitStatic = false; - vector<const string*> ASFormatter::headers; - vector<const string*> ASFormatter::nonParenHeaders; - vector<const string*> ASFormatter::preprocessorHeaders; - vector<const string*> ASFormatter::preDefinitionHeaders; - vector<const string*> ASFormatter::preCommandHeaders; - vector<const string*> ASFormatter::operators; - vector<const string*> ASFormatter::assignmentOperators; - - - /** - * Constructor of ASFormatter - */ - ASFormatter::ASFormatter() - { - staticInit(); - - preBracketHeaderStack = NULL; - bracketTypeStack = NULL; - parenStack = NULL; - - sourceIterator = NULL; - bracketFormatMode = NONE_MODE; - shouldPadOperators = false; - shouldPadParenthesies = false; - shouldBreakOneLineBlocks = true; - shouldBreakOneLineStatements = true; - shouldConvertTabs = false; - shouldBreakBlocks = false; - shouldBreakClosingHeaderBlocks = false; - shouldBreakClosingHeaderBrackets = false; - shouldBreakElseIfs = false; - } - - /** - * Destructor of ASFormatter - */ - ASFormatter::~ASFormatter() - { - DELETE_CONTAINER( preBracketHeaderStack ); - } - - /** - * initialization of static data of ASFormatter. - */ - void ASFormatter::staticInit() - { - if (calledInitStatic) - return; - - calledInitStatic = true; - - headers.push_back(&AS_IF); - headers.push_back(&AS_ELSE); - headers.push_back(&AS_DO); - headers.push_back(&AS_WHILE); - headers.push_back(&AS_FOR); - headers.push_back(&AS_SYNCHRONIZED); - headers.push_back(&AS_TRY); - headers.push_back(&AS_CATCH); - headers.push_back(&AS_FINALLY); - headers.push_back(&AS_SWITCH); - headers.push_back(&AS_TEMPLATE); - 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); - - nonParenHeaders.push_back(&AS_ELSE); - nonParenHeaders.push_back(&AS_DO); - nonParenHeaders.push_back(&AS_TRY); - nonParenHeaders.push_back(&AS_FINALLY); - 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_TEMPLATE); - - preDefinitionHeaders.push_back(&AS_CLASS); - preDefinitionHeaders.push_back(&AS_INTERFACE); - preDefinitionHeaders.push_back(&AS_NAMESPACE); - preDefinitionHeaders.push_back(&AS_STRUCT); - - preCommandHeaders.push_back(&AS_EXTERN); - preCommandHeaders.push_back(&AS_THROWS); - preCommandHeaders.push_back(&AS_CONST); - - preprocessorHeaders.push_back(&AS_BAR_DEFINE); - //// DEVEL: removed the folowing lines - ////preprocessorHeaders.push_back(&AS_BAR_INCLUDE); - ////preprocessorHeaders.push_back(&AS_BAR_IF); // #if or #ifdef - ////preprocessorHeaders.push_back(&AS_BAR_EL); // #else or #elif - ////preprocessorHeaders.push_back(&AS_BAR_ENDIF); - - operators.push_back(&AS_PLUS_ASSIGN); - operators.push_back(&AS_MINUS_ASSIGN); - operators.push_back(&AS_MULT_ASSIGN); - operators.push_back(&AS_DIV_ASSIGN); - operators.push_back(&AS_MOD_ASSIGN); - operators.push_back(&AS_OR_ASSIGN); - operators.push_back(&AS_AND_ASSIGN); - operators.push_back(&AS_XOR_ASSIGN); - operators.push_back(&AS_EQUAL); - operators.push_back(&AS_PLUS_PLUS); - operators.push_back(&AS_MINUS_MINUS); - operators.push_back(&AS_NOT_EQUAL); - operators.push_back(&AS_GR_EQUAL); - operators.push_back(&AS_GR_GR_GR_ASSIGN); - operators.push_back(&AS_GR_GR_ASSIGN); - operators.push_back(&AS_GR_GR_GR); - operators.push_back(&AS_GR_GR); - operators.push_back(&AS_LS_EQUAL); - operators.push_back(&AS_LS_LS_LS_ASSIGN); - operators.push_back(&AS_LS_LS_ASSIGN); - operators.push_back(&AS_LS_LS_LS); - operators.push_back(&AS_LS_LS); - operators.push_back(&AS_ARROW); - operators.push_back(&AS_AND); - operators.push_back(&AS_OR); - operators.push_back(&AS_COLON_COLON); - - //// BUGFIX: removed the folowing lines - //// operators.push_back(&AS_PAREN_PAREN); - //// operators.push_back(&AS_BLPAREN_BLPAREN); - - operators.push_back(&AS_PLUS); - operators.push_back(&AS_MINUS); - operators.push_back(&AS_MULT); - operators.push_back(&AS_DIV); - operators.push_back(&AS_MOD); - operators.push_back(&AS_QUESTION); - operators.push_back(&AS_COLON); - operators.push_back(&AS_ASSIGN); - operators.push_back(&AS_LS); - operators.push_back(&AS_GR); - operators.push_back(&AS_NOT); - operators.push_back(&AS_BIT_OR); - operators.push_back(&AS_BIT_AND); - operators.push_back(&AS_BIT_NOT); - operators.push_back(&AS_BIT_XOR); - operators.push_back(&AS_OPERATOR); - operators.push_back(&AS_COMMA); - //BEGIN Content Patch patch1_ssvb_patch.tar.gz - operators.push_back(&AS_SEMICOLON); - //END Content Patch patch1_ssvb_patch.tar.gz - operators.push_back(&AS_RETURN); - - 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_XOR_ASSIGN); - assignmentOperators.push_back(&AS_OR_ASSIGN); - assignmentOperators.push_back(&AS_AND_ASSIGN); - assignmentOperators.push_back(&AS_GR_GR_GR_ASSIGN); - assignmentOperators.push_back(&AS_LS_LS_LS_ASSIGN); - assignmentOperators.push_back(&AS_ASSIGN); - } - - /** - * initialize the ASFormatter. - * - * init() should be called every time a ASFormatter object is to start - * formatting 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 ASFormatter's destruction, and thus should not be - * deleted elsewhere. - * - * @param iter a pointer to the DYNAMICALLY CREATED ASSourceIterator object. - */ - void ASFormatter::init(ASSourceIterator *si) - { - ASBeautifier::init(si); - sourceIterator = si; - - INIT_CONTAINER( preBracketHeaderStack, new vector<const string*> ); - INIT_CONTAINER( bracketTypeStack, new vector<BracketType> ); - bracketTypeStack->push_back(DEFINITION_TYPE); - INIT_CONTAINER( parenStack, new vector<int> ); - parenStack->push_back(0); - - currentHeader = NULL; - currentLine = string(""); - formattedLine = ""; - currentChar = ' '; - previousCommandChar = ' '; - previousNonWSChar = ' '; - quoteChar = '"'; - charNum = 0; - previousOperator = NULL; - - isVirgin = true; - isInLineComment = false; - isInComment = false; - isInPreprocessor = false; - doesLineStartComment = false; - isInQuote = false; - isSpecialChar = false; - isNonParenHeader = true; - foundPreDefinitionHeader = false; - foundPreCommandHeader = false; - foundQuestionMark = false; - isInLineBreak = false; - endOfCodeReached = false; - isLineReady = false; - isPreviousBracketBlockRelated = true; - isInPotentialCalculation = false; - //foundOneLineBlock = false; - shouldReparseCurrentChar = false; - passedSemicolon = false; - passedColon = false; - isInTemplate = false; - shouldBreakLineAfterComments = false; - isImmediatelyPostComment = false; - isImmediatelyPostLineComment = false; - isImmediatelyPostEmptyBlock = false; - - isPrependPostBlockEmptyLineRequested = false; - isAppendPostBlockEmptyLineRequested = false; - prependEmptyLine = false; - - foundClosingHeader = false; - previousReadyFormattedLineLength = 0; - - isImmediatelyPostHeader = false; - isInHeader = false; - } - - /** - * get the next formatted line. - * - * @return formatted line. - */ - - string ASFormatter::nextLine() - { - const string *newHeader; - bool isCharImmediatelyPostComment = false; - bool isPreviousCharPostComment = false; - bool isCharImmediatelyPostLineComment = false; - bool isInVirginLine = isVirgin; - bool isCharImmediatelyPostOpenBlock = false; - bool isCharImmediatelyPostCloseBlock = false; - bool isCharImmediatelyPostTemplate = false; - bool isCharImmediatelyPostHeader = false; - - if (!isFormattingEnabled()) - return ASBeautifier::nextLine(); - - while (!isLineReady) - { - if (shouldReparseCurrentChar) - shouldReparseCurrentChar = false; - else if (!getNextChar()) - { - breakLine(); - return beautify(readyFormattedLine); - } - else // stuff to do when reading a new character... - { - // make sure that a virgin '{' at the begining ofthe file will be treated as a block... - if (isInVirginLine && currentChar == '{') - previousCommandChar = '{'; - isPreviousCharPostComment = isCharImmediatelyPostComment; - isCharImmediatelyPostComment = false; - isCharImmediatelyPostTemplate = false; - isCharImmediatelyPostHeader = false; - } - - if (isInLineComment) - { - appendCurrentChar(); - - // explicitely break a line when a line comment's end is found. - if (/*bracketFormatMode == ATTACH_MODE &&*/ charNum+1 == currentLine.length()) - { - isInLineBreak = true; - isInLineComment = false; - isImmediatelyPostLineComment = true; - currentChar = 0; //make sure it is a neutral char. - } - continue; - } - else if (isInComment) - { - if (isSequenceReached(AS_CLOSE_COMMENT)) - { - isInComment = false; - isImmediatelyPostComment = true; - appendSequence(AS_CLOSE_COMMENT); - goForward(1); - } - else - appendCurrentChar(); - - continue; - } - - // not in line comment or comment - - else if (isInQuote) - { - if (isSpecialChar) - { - isSpecialChar = false; - appendCurrentChar(); - } - else if (currentChar == '\\') - { - isSpecialChar = true; - appendCurrentChar(); - } - else if (quoteChar == currentChar) - { - isInQuote = false; - appendCurrentChar(); - } - else - { - appendCurrentChar(); - } - - continue; - } - - - - // handle white space - needed to simplify the rest. - if (isWhiteSpace(currentChar) || isInPreprocessor) - { - ////// DEVEL: if (isLegalNameChar(previousChar) && isLegalNameChar(peekNextChar())) - appendCurrentChar(); - continue; - } - - /* not in MIDDLE of quote or comment or white-space of any type ... */ - - if (isSequenceReached(AS_OPEN_LINE_COMMENT)) - { - isInLineComment = true; - if (shouldPadOperators) - appendSpacePad(); - appendSequence(AS_OPEN_LINE_COMMENT); - goForward(1); - continue; - } - else if (isSequenceReached(AS_OPEN_COMMENT)) - { - isInComment = true; - if (shouldPadOperators) - appendSpacePad(); - appendSequence(AS_OPEN_COMMENT); - goForward(1); - continue; - } - else if (currentChar == '"' || currentChar == '\'') - { - isInQuote = true; - quoteChar = currentChar; - //// if (shouldPadOperators) // BUGFIX: these two lines removed. seem to be unneeded, and interfere with L" - //// appendSpacePad(); // BUFFIX: TODO make sure the removal of these lines doesn't reopen old bugs... - appendCurrentChar(); - continue; - } - - /* not in quote or comment or white-space of any type ... */ - - - // check if in preprocessor - // ** isInPreprocessor will be automatically reset at the begining - // of a new line in getnextChar() - if (currentChar == '#') - isInPreprocessor = true; - - if (isInPreprocessor) - { - appendCurrentChar(); - continue; - } - - /* not in preprocessor ... */ - - if (isImmediatelyPostComment) - { - isImmediatelyPostComment = false; - isCharImmediatelyPostComment = true; - } - - if (isImmediatelyPostLineComment) - { - isImmediatelyPostLineComment = false; - isCharImmediatelyPostLineComment = true; - } - - if (shouldBreakLineAfterComments) - { - shouldBreakLineAfterComments = false; - shouldReparseCurrentChar = true; - breakLine(); - continue; - } - - // reset isImmediatelyPostHeader information - if (isImmediatelyPostHeader) - { - isImmediatelyPostHeader = false; - isCharImmediatelyPostHeader = true; - - // Make sure headers are broken from their succeeding blocks - // (e.g. - // if (isFoo) DoBar(); - // should become - // if (isFoo) - // DoBar; - // ) - // But treat else if() as a special case which should not be broken! - if (shouldBreakOneLineStatements) - { - // if may break 'else if()'s, ythen simply break the line - - if (shouldBreakElseIfs) - isInLineBreak = true; - - else - { - // make sure 'else if()'s are not broken. - - bool isInElseIf = false; - const string *upcomingHeader; - - upcomingHeader = findHeader(headers); - if (currentHeader == &AS_ELSE && upcomingHeader == &AS_IF) - isInElseIf = true; - - if (!isInElseIf) - isInLineBreak = true; ////BUGFIX: SHOULD NOT BE breakLine() !!! - } - } - } - - if (passedSemicolon) - { - passedSemicolon = false; - if (parenStack->back() == 0) - { - shouldReparseCurrentChar = true; - isInLineBreak = true; - continue; - } - } - - if (passedColon) - { - passedColon = false; - if (parenStack->back() == 0) - { - shouldReparseCurrentChar = true; - isInLineBreak = true; - continue; - } - } - - // Check if in template declaration, e.g. foo<bar> or foo<bar,fig> - // If so, set isInTemplate to true - // - if (!isInTemplate && currentChar == '<') - { - int templateDepth = 0; - const string *oper; - for (unsigned int i=charNum; - i< currentLine.length(); - i += (oper ? oper->length() : 1) ) - { - oper = ASBeautifier::findHeader(currentLine, i, operators); - - if (oper == &AS_LS) - { - templateDepth++; - } - else if (oper == &AS_GR) - { - templateDepth--; - if (templateDepth == 0) - { - // this is a template! - // - isInTemplate = true; - break; - } - } - else if (oper == &AS_COMMA // comma, e.g. A<int, char> - || oper == &AS_BIT_AND // reference, e.g. A<int&> - || oper == &AS_MULT // pointer, e.g. A<int*> - || oper == &AS_COLON_COLON) // ::, e.g. std::string - { - continue; - } - else if (!isLegalNameChar(currentLine[i]) && !isWhiteSpace(currentLine[i])) - { - // this is not a template -> leave... - // - isInTemplate = false; - break; - } - } - } - - - // handle parenthesies - // - if (currentChar == '(' || currentChar == '[' || (isInTemplate && currentChar == '<')) - { - parenStack->back()++; - } - else if (currentChar == ')' || currentChar == ']' || (isInTemplate && currentChar == '>')) - { - parenStack->back()--; - if (isInTemplate && parenStack->back() == 0) - { - isInTemplate = false; - isCharImmediatelyPostTemplate = true; - } - - // check if this parenthesis closes a header, e.g. if (...), while (...) - // - if (isInHeader && parenStack->back() == 0) - { - isInHeader = false; - isImmediatelyPostHeader = true; - } - - } - - // handle brackets - // - BracketType bracketType = NULL_TYPE; - - if (currentChar == '{') - { - bracketType = getBracketType(); - foundPreDefinitionHeader = false; - foundPreCommandHeader = false; - - bracketTypeStack->push_back(bracketType); - preBracketHeaderStack->push_back(currentHeader); - currentHeader = NULL; - - isPreviousBracketBlockRelated = !IS_A(bracketType, ARRAY_TYPE); - } - else if (currentChar == '}') - { - // if a request has been made to append a post block empty line, - // but the block exists immediately before a closing bracket, - // then there is not need for the post block empty line. - // - isAppendPostBlockEmptyLineRequested = false; - - if (!bracketTypeStack->empty()) - { - bracketType = bracketTypeStack->back(); - bracketTypeStack->pop_back(); - - isPreviousBracketBlockRelated = !IS_A(bracketType, ARRAY_TYPE); - } - - if (!preBracketHeaderStack->empty()) - { - currentHeader = preBracketHeaderStack->back(); - preBracketHeaderStack->pop_back(); - } - else - currentHeader = NULL; - } - - if (!IS_A(bracketType, ARRAY_TYPE)) - { - - if (currentChar == '{') - { - parenStack->push_back(0); - } - else if (currentChar == '}') - { - if (!parenStack->empty()) - { - parenStack->pop_back(); - } - } - - if (bracketFormatMode != NONE_MODE) - { - if (currentChar == '{') - { - if ( ( bracketFormatMode == ATTACH_MODE - || bracketFormatMode == BDAC_MODE && bracketTypeStack->size()>=2 - && IS_A((*bracketTypeStack)[bracketTypeStack->size()-2], COMMAND_TYPE) /*&& isInLineBreak*/) - && !isCharImmediatelyPostLineComment ) - { - appendSpacePad(); - if (!isCharImmediatelyPostComment // do not attach '{' to lines that end with /**/ comments. - && previousCommandChar != '{' - && previousCommandChar != '}' - && previousCommandChar != ';') // '}' , ';' chars added for proper handling of '{' immediately after a '}' or ';' - appendCurrentChar(false); - else - appendCurrentChar(true); - continue; - } - else if (bracketFormatMode == BREAK_MODE - || bracketFormatMode == BDAC_MODE && bracketTypeStack->size()>=2 - && IS_A((*bracketTypeStack)[bracketTypeStack->size()-2], DEFINITION_TYPE)) - { - if ( shouldBreakOneLineBlocks || !IS_A(bracketType, SINGLE_LINE_TYPE) ) - breakLine(); - appendCurrentChar(); - continue; - } - } - else if (currentChar == '}') - { - // bool origLineBreak = isInLineBreak; - - // mark state of immediately after empty block - // this state will be used for locating brackets that appear immedately AFTER an empty block (e.g. '{} \n}'). - if (previousCommandChar == '{') - isImmediatelyPostEmptyBlock = true; - - if ( (!(previousCommandChar == '{' && isPreviousBracketBlockRelated) ) // this '{' does not close an empty block - && (shouldBreakOneLineBlocks || !IS_A(bracketType, SINGLE_LINE_TYPE)) // astyle is allowed to break on line blocks - && !isImmediatelyPostEmptyBlock) // this '}' does not immediately follow an empty block - { - breakLine(); - appendCurrentChar(); - } - else - { - // Content Patch ASFormatter.cpp.patch.bz2 - // if (!isCharImmediatelyPostComment) - if (!isCharImmediatelyPostComment && - !isCharImmediatelyPostLineComment) - isInLineBreak = false; - appendCurrentChar(); - if (shouldBreakOneLineBlocks || !IS_A(bracketType, SINGLE_LINE_TYPE)) - shouldBreakLineAfterComments = true; - } - - if (shouldBreakBlocks) - { - isAppendPostBlockEmptyLineRequested =true; - } - - continue; - } - } - } - - if ( ( (previousCommandChar == '{' - && isPreviousBracketBlockRelated) - - || (previousCommandChar == '}' - && !isImmediatelyPostEmptyBlock // <-- - && isPreviousBracketBlockRelated - && !isPreviousCharPostComment // <-- Fixes wrongly appended newlines after '}' immediately after comments... 10/9/1999 - && peekNextChar() != ' ')) - - && (shouldBreakOneLineBlocks || !IS_A(bracketTypeStack->back(), SINGLE_LINE_TYPE)) ) - { - isCharImmediatelyPostOpenBlock = (previousCommandChar == '{'); - isCharImmediatelyPostCloseBlock = (previousCommandChar == '}'); - - previousCommandChar = ' '; - isInLineBreak = true; //<---- - } - - // reset block handling flags - isImmediatelyPostEmptyBlock = false; - - // look for headers - if (!isInTemplate) - { - if ( (newHeader = findHeader(headers)) != NULL) - { - foundClosingHeader = false; - const string *previousHeader; - - // recognize closing headers of do..while, if..else, try..catch..finally - if ( (newHeader == &AS_ELSE && currentHeader == &AS_IF) - || (newHeader == &AS_WHILE && currentHeader == &AS_DO) - || (newHeader == &AS_CATCH && currentHeader == &AS_TRY) - || (newHeader == &AS_CATCH && currentHeader == &AS_CATCH) - || (newHeader == &AS_FINALLY && currentHeader == &AS_TRY) - || (newHeader == &AS_FINALLY && currentHeader == &AS_CATCH) ) - foundClosingHeader = true; - - previousHeader = currentHeader; - currentHeader = newHeader; - - // If in ATTACH or LINUX bracket modes, attach closing headers (e.g. 'else', 'catch') - // to their preceding bracket, - // But do not perform the attachment if the shouldBreakClosingHeaderBrackets is set! - if (!shouldBreakClosingHeaderBrackets && foundClosingHeader && (bracketFormatMode == ATTACH_MODE || bracketFormatMode == BDAC_MODE) && previousNonWSChar == '}') - { - isInLineBreak = false; - appendSpacePad(); - - if (shouldBreakBlocks) - isAppendPostBlockEmptyLineRequested = false; - } - - //Check if a template definition as been reached, e.g. template<class A> - if (newHeader == &AS_TEMPLATE) - { - isInTemplate = true; - } - - // check if the found header is non-paren header - isNonParenHeader = ( find(nonParenHeaders.begin(), nonParenHeaders.end(), - newHeader) != nonParenHeaders.end() ); - appendSequence(*currentHeader); - goForward(currentHeader->length() - 1); - // if padding is on, and a paren-header is found - // then add a space pad after it. - if (shouldPadOperators && !isNonParenHeader) - appendSpacePad(); - - - // Signal that a header has been reached - // *** But treat a closing while() (as in do...while) - // as if it where NOT a header since a closing while() - // should never have a block after it! - if (!(foundClosingHeader && currentHeader == &AS_WHILE)) - { - isInHeader = true; - if (isNonParenHeader) - { - isImmediatelyPostHeader = true; - isInHeader = false; - } - } - - if (currentHeader == &AS_IF && previousHeader == &AS_ELSE) - isInLineBreak = false; - - if (shouldBreakBlocks) - { - if (previousHeader == NULL - && !foundClosingHeader - && !isCharImmediatelyPostOpenBlock) - { - isPrependPostBlockEmptyLineRequested = true; - } - - if (currentHeader == &AS_ELSE - || currentHeader == &AS_CATCH - || currentHeader == &AS_FINALLY - || foundClosingHeader) - { - isPrependPostBlockEmptyLineRequested = false; - } - - if (shouldBreakClosingHeaderBlocks - && isCharImmediatelyPostCloseBlock) - { - isPrependPostBlockEmptyLineRequested = true; - } - - } - - continue; - } - else if ( (newHeader = findHeader(preDefinitionHeaders)) != NULL) - { - foundPreDefinitionHeader = true; - appendSequence(*newHeader); - goForward(newHeader->length() - 1); - - if (shouldBreakBlocks) - isPrependPostBlockEmptyLineRequested = true; - - continue; - } - else if ( (newHeader = findHeader(preCommandHeaders)) != NULL) - { - foundPreCommandHeader = true; - appendSequence(*newHeader); - goForward(newHeader->length() - 1); - - continue; - } - } - - if (previousNonWSChar == '}' || currentChar == ';') - { - if (shouldBreakOneLineStatements && currentChar == ';' - && (shouldBreakOneLineBlocks || !IS_A(bracketTypeStack->back(), SINGLE_LINE_TYPE))) - { - passedSemicolon = true; - } - - if (shouldBreakBlocks && currentHeader != NULL && parenStack->back() == 0) - { - isAppendPostBlockEmptyLineRequested = true; - } - - if (currentChar != ';') - currentHeader = NULL; //DEVEL: is this ok? - - foundQuestionMark = false; - foundPreDefinitionHeader = false; - foundPreCommandHeader = false; - isInPotentialCalculation = false; - - } - - if (currentChar == ':' - && shouldBreakOneLineStatements - && !foundQuestionMark // not in a ... ? ... : ... sequence - && !foundPreDefinitionHeader // not in a definition block (e.g. class foo : public bar - && previousCommandChar != ')' // not immediately after closing paren of a method header, e.g. ASFormatter::ASFormatter(...) : ASBeautifier(...) - && previousChar != ':' // not part of '::' - && peekNextChar() != ':') // not part of '::' - { - passedColon = true; - if (shouldBreakBlocks) - isPrependPostBlockEmptyLineRequested = true; - } - - if (currentChar == '?') - foundQuestionMark = true; - - if (shouldPadOperators) - { - if ((newHeader = findHeader(operators)) != NULL) - { - bool shouldPad = (newHeader != &AS_COLON_COLON - && newHeader != &AS_PAREN_PAREN - && newHeader != &AS_BLPAREN_BLPAREN - && newHeader != &AS_PLUS_PLUS - && newHeader != &AS_MINUS_MINUS - && newHeader != &AS_NOT - && newHeader != &AS_BIT_NOT - && newHeader != &AS_ARROW - && newHeader != &AS_OPERATOR - && !(newHeader == &AS_MINUS && isInExponent()) - && !(newHeader == &AS_PLUS && isInExponent()) - && previousOperator != &AS_OPERATOR - && !((newHeader == &AS_MULT || newHeader == &AS_BIT_AND) - && isPointerOrReference()) - && !( (isInTemplate || isCharImmediatelyPostTemplate) - && (newHeader == &AS_LS || newHeader == &AS_GR)) - ); - - if (!isInPotentialCalculation) - if (find(assignmentOperators.begin(), assignmentOperators.end(), newHeader) - != assignmentOperators.end()) - isInPotentialCalculation = true; - - // pad before operator - if (shouldPad - && !(newHeader == &AS_COLON && !foundQuestionMark) - && newHeader != &AS_SEMICOLON - && newHeader != &AS_COMMA) - appendSpacePad(); - appendSequence(*newHeader); - goForward(newHeader->length() - 1); - - // since this block handles '()' and '[]', - // the parenStack must be updated here accordingly! - if (newHeader == &AS_PAREN_PAREN - || newHeader == &AS_BLPAREN_BLPAREN) - parenStack->back()--; - - currentChar = (*newHeader)[newHeader->length() - 1]; - // pad after operator - // but do not pad after a '-' that is a urinary-minus. - if ( shouldPad && !(newHeader == &AS_MINUS && isUrinaryMinus()) ) - appendSpacePad(); - - previousOperator = newHeader; - continue; - } - } - //BEGIN Content Patch patch1_ssvb_patch.tar.gz - if (currentChar == '(' || currentChar == '[' ) - isInPotentialCalculation = true; - //END Content Patch patch1_ssvb_patch.tar.gz - if (shouldPadParenthesies) - { - if (currentChar == '(' || currentChar == '[' ) - { - char peekedChar = peekNextChar(); - - isInPotentialCalculation = true; - appendCurrentChar(); - if (!(currentChar == '(' && peekedChar == ')') - && !(currentChar == '[' && peekedChar == ']')) - appendSpacePad(); - continue; - } - else if (currentChar == ')' || currentChar == ']') - { - char peekedChar = peekNextChar(); - - if (!(previousChar == '(' && currentChar == ')') - && !(previousChar == '[' && currentChar == ']')) - appendSpacePad(); - - appendCurrentChar(); - - if (peekedChar != ';' && peekedChar != ',' && peekedChar != '.' - && !(currentChar == ']' && peekedChar == '[')) - appendSpacePad(); - continue; - } - } - - appendCurrentChar(); - } - - // return a beautified (i.e. correctly indented) line. - - string beautifiedLine; - int readyFormattedLineLength = trim(readyFormattedLine).length(); - - if (prependEmptyLine - && readyFormattedLineLength > 0 - && previousReadyFormattedLineLength > 0) - { - isLineReady = true; // signal that a readyFormattedLine is still waiting - beautifiedLine = beautify(""); - } - else - { - isLineReady = false; - beautifiedLine = beautify(readyFormattedLine); - } - - prependEmptyLine = false; - previousReadyFormattedLineLength = readyFormattedLineLength; - - return beautifiedLine; - - } - - - /** - * check if there are any indented lines ready to be read by nextLine() - * - * @return are there any indented lines ready? - */ - bool ASFormatter::hasMoreLines() const - { - if (!isFormattingEnabled()) - return ASBeautifier::hasMoreLines(); - else - return !endOfCodeReached; - } - - /** - * check if formatting options are enabled, in addition to indentation. - * - * @return are formatting options enabled? - */ - bool ASFormatter::isFormattingEnabled() const - { - return (bracketFormatMode != NONE_MODE - || shouldPadOperators - || shouldConvertTabs); - } - - /** - * set the bracket formatting mode. - * options: - * astyle::NONE_MODE no formatting of brackets. - * astyle::ATTACH_MODE Java, K&R style bracket placement. - * astyle::BREAK_MODE ANSI C/C++ style bracket placement. - * - * @param mode the bracket formatting mode. - */ - void ASFormatter::setBracketFormatMode(BracketMode mode) - { - bracketFormatMode = mode; - } - - /** - * set closing header bracket breaking mode - * options: - * true brackets just before closing headers (e.g. 'else', 'catch') - * will be broken, even if standard brackets are attached. - * false closing header brackets will be treated as standard brackets. - * - * @param mode the closing header bracket breaking mode. - */ - void ASFormatter::setBreakClosingHeaderBracketsMode(bool state) - { - shouldBreakClosingHeaderBrackets = state; - } - - /** - * set 'else if()' breaking mode - * options: - * true 'else' headers will be broken from their succeeding 'if' headers. - * false 'else' headers will be attached to their succeeding 'if' headers. - * - * @param mode the 'else if()' breaking mode. - */ - void ASFormatter::setBreakElseIfsMode(bool state) - { - shouldBreakElseIfs = state; - } - - /** - * set operator padding mode. - * options: - * true statement operators will be padded with spaces around them. - * false statement operators will not be padded. - * - * @param mode the padding mode. - */ - void ASFormatter::setOperatorPaddingMode(bool state) - { - shouldPadOperators = state; - } - - /** - * set parentheies padding mode. - * options: - * true statement parenthesies will be padded with spaces around them. - * false statement parenthesies will not be padded. - * - * @param mode the padding mode. - */ - void ASFormatter::setParenthesisPaddingMode(bool state) - { - shouldPadParenthesies = state; - } - - /** - * set option to break/not break one-line blocks - * - * @param state true = break, false = don't break. - */ - void ASFormatter::setBreakOneLineBlocksMode(bool state) - { - shouldBreakOneLineBlocks = state; - } - - /** - * set option to break/not break lines consisting of multiple statements. - * - * @param state true = break, false = don't break. - */ - void ASFormatter::setSingleStatementsMode(bool state) - { - shouldBreakOneLineStatements = state; - } - - /** - * set option to convert tabs to spaces. - * - * @param state true = convert, false = don't convert. - */ - void ASFormatter::setTabSpaceConversionMode(bool state) - { - shouldConvertTabs = state; - } - - - /** - * set option to break unrelated blocks of code with empty lines. - * - * @param state true = convert, false = don't convert. - */ - void ASFormatter::setBreakBlocksMode(bool state) - { - shouldBreakBlocks = state; - } - - /** - * set option to break closing header blocks of code (such as 'else', 'catch', ...) with empty lines. - * - * @param state true = convert, false = don't convert. - */ - void ASFormatter::setBreakClosingHeaderBlocksMode(bool state) - { - shouldBreakClosingHeaderBlocks = state; - } - - /** - * check if a specific sequence exists in the current placement of the current line - * - * @return whether sequence has been reached. - * @param sequence the sequence to be checked - */ - bool ASFormatter::isSequenceReached(const string &sequence) const - { - return currentLine.COMPARE(charNum, sequence.length(), sequence) == 0; - - } - - /** - * jump over several characters. - * - * @param i the number of characters to jump over. - */ - void ASFormatter::goForward(int i) - { - while (--i >= 0) - getNextChar(); - } - - /** - * peek at the next unread character. - * - * @return the next unread character. - */ - char ASFormatter::peekNextChar() const - { - int peekNum = charNum + 1; - int len = currentLine.length(); - char ch = ' '; - - while (peekNum < len) - { - ch = currentLine[peekNum++]; - if (!isWhiteSpace(ch)) - return ch; - } - - if (shouldConvertTabs && ch == '\t') - ch = ' '; - - return ch; - } - - /** - * check if current placement is before a comment or line-comment - * - * @return is before a comment or line-comment. - */ - bool ASFormatter::isBeforeComment() const - { - int peekNum = charNum + 1; - int len = currentLine.length(); - // char ch = ' '; - bool foundComment = false; - - for (peekNum = charNum + 1; - peekNum < len && isWhiteSpace(currentLine[peekNum]); - ++peekNum) - ; - - if (peekNum < len) - foundComment = ( currentLine.COMPARE(peekNum, 2, AS_OPEN_COMMENT) == 0 - || currentLine.COMPARE(peekNum, 2, AS_OPEN_LINE_COMMENT) == 0 ); - - return foundComment; - } - - /** - * get the next character, increasing the current placement in the process. - * the new character is inserted into the variable currentChar. - * - * @return whether succeded to recieve the new character. - */ - bool ASFormatter::getNextChar() - { - isInLineBreak = false; - bool isAfterFormattedWhiteSpace = false; - - if (shouldPadOperators && !isInComment && !isInLineComment - && !isInQuote && !doesLineStartComment && !isInPreprocessor - && !isBeforeComment()) - { - //BEGIN Content Patch patch1_ssvb_patch.tar.gz - char prevchar = ' '; - char nextchar = peekNextChar(); - - int len = formattedLine.length(); - // if (len > 0 && isWhiteSpace(formattedLine[len-1])) - if (len > 0) prevchar = formattedLine[len-1]; - if (isWhiteSpace(prevchar) || prevchar == '(' || prevchar == '[' || - nextchar == ')' || nextchar == ']') - { - isAfterFormattedWhiteSpace = true; - } - //END Content Patch patch1_ssvb_patch.tar.gz - } - - previousChar = currentChar; - if (!isWhiteSpace(currentChar)) - { - previousNonWSChar = currentChar; - if (!isInComment && !isInLineComment && !isInQuote - && !isSequenceReached(AS_OPEN_COMMENT) - && !isSequenceReached(AS_OPEN_LINE_COMMENT) ) - previousCommandChar = previousNonWSChar; - } - - unsigned int currentLineLength = currentLine.length(); - - if (charNum+1 < currentLineLength - && (!isWhiteSpace(peekNextChar()) || isInComment || isInLineComment)) - { - currentChar = currentLine[++charNum]; - if (isAfterFormattedWhiteSpace) - while (isWhiteSpace(currentChar) && charNum+1 < currentLineLength) - currentChar = currentLine[++charNum]; - - if (shouldConvertTabs && currentChar == '\t') - currentChar = ' '; - - return true; - } - // BEGIN Content patch ASFormatter450670.patch.bz2 - else if (isInLineComment && (charNum+1 == currentLineLength)) - { - // fix BUG #450670 - currentChar = ' '; - return true; - } - // END Content patch ASFormatter450670.patch.bz2 - else - { - if (sourceIterator->hasMoreLines()) - { - currentLine = sourceIterator->nextLine(); - if (currentLine.length() == 0) - { - /*think*/ currentLine = string(" "); - } - - // unless reading in the first line of the file, - // break a new line. - if (!isVirgin) - isInLineBreak = true; - else - isVirgin = false; - - if (isInLineComment) - isImmediatelyPostLineComment = true; - isInLineComment = false; - - trimNewLine(); - currentChar = currentLine[charNum]; - - // check if is in preprocessor right after the line break and line trimming - if (previousNonWSChar != '\\') - isInPreprocessor = false; - - if (shouldConvertTabs && currentChar == '\t') - currentChar = ' '; - - return true; - } - else - { - endOfCodeReached = true; - return false; - } - } - } - - /** - * jump over the leading white space in the current line, - * IF the line does not begin a comment or is in a preprocessor definition. - */ - void ASFormatter::trimNewLine() - { - unsigned int len = currentLine.length(); - charNum = 0; - - if (isInComment || isInPreprocessor) - return; - - while (isWhiteSpace(currentLine[charNum]) && charNum+1 < len) - ++charNum; - - doesLineStartComment = false; - if (isSequenceReached(string("/*"))) - { - charNum = 0; - doesLineStartComment = true; - } - } - - /** - * append a character to the current formatted line. - * Unless disabled (via canBreakLine == false), first check if a - * line-break has been registered, and if so break the - * formatted line, and only then append the character into - * the next formatted line. - * - * @param ch the character to append. - * @param canBreakLine if true, a registered line-break - */ - void ASFormatter::appendChar(char ch, bool canBreakLine) - { - if (canBreakLine && isInLineBreak) - breakLine(); - formattedLine.append(1, ch); - } - - /** - * append the CURRENT character (curentChar)to the current - * formatted line. Unless disabled (via canBreakLine == false), - * first check if a line-break has been registered, and if so - * break the formatted line, and only then append the character - * into the next formatted line. - * - * @param canBreakLine if true, a registered line-break - */ - void ASFormatter::appendCurrentChar(bool canBreakLine) - { - appendChar(currentChar, canBreakLine); - } - - /** - * append a string sequence to the current formatted line. - * Unless disabled (via canBreakLine == false), first check if a - * line-break has been registered, and if so break the - * formatted line, and only then append the sequence into - * the next formatted line. - * - * @param sequence the sequence to append. - * @param canBreakLine if true, a registered line-break - */ - void ASFormatter::appendSequence(const string &sequence, bool canBreakLine) - { - if (canBreakLine && isInLineBreak) - breakLine(); - formattedLine.append(sequence); - } - - /** - * append a space to the current formattedline, UNLESS the - * last character is already a white-space character. - */ - void ASFormatter::appendSpacePad() - { - int len = formattedLine.length(); - if (len == 0 || !isWhiteSpace(formattedLine[len-1])) - formattedLine.append(1, ' '); - } - - /** - * register a line break for the formatted line. - */ - void ASFormatter::breakLine() - { - isLineReady = true; - isInLineBreak = false; - - // queue an empty line prepend request if one exists - prependEmptyLine = isPrependPostBlockEmptyLineRequested; - - readyFormattedLine = formattedLine; - if (isAppendPostBlockEmptyLineRequested) - { - isAppendPostBlockEmptyLineRequested = false; - isPrependPostBlockEmptyLineRequested = true; - } - else - { - isPrependPostBlockEmptyLineRequested = false; - } - - formattedLine = ""; - } - - /** - * check if the currently reached open-bracket (i.e. '{') - * opens a: - * - a definition type block (such as a class or namespace), - * - a command block (such as a method block) - * - a static array - * this method takes for granted that the current character - * is an opening bracket. - * - * @return the type of the opened block. - */ - BracketType ASFormatter::getBracketType() const - { - BracketType returnVal; - - if (foundPreDefinitionHeader) - returnVal = DEFINITION_TYPE; - else - { - bool isCommandType; - isCommandType = ( foundPreCommandHeader - || ( currentHeader != NULL && isNonParenHeader ) - || ( previousCommandChar == ')' ) - || ( previousCommandChar == ':' && !foundQuestionMark ) - || ( previousCommandChar == ';' ) - || ( ( previousCommandChar == '{' || previousCommandChar == '}') - && isPreviousBracketBlockRelated ) ); - - returnVal = (isCommandType ? COMMAND_TYPE : ARRAY_TYPE); - } - - if (isOneLineBlockReached()) - returnVal = (BracketType) (returnVal | SINGLE_LINE_TYPE); - - return returnVal; - } - - /** - * check if the currently reached '*' or '&' character is - * a pointer-or-reference symbol, or another operator. - * this method takes for granted that the current character - * is either a '*' or '&'. - * - * @return whether current character is a reference-or-pointer - */ - bool ASFormatter::isPointerOrReference() const - { - bool isPR; - isPR = ( !isInPotentialCalculation - || IS_A(bracketTypeStack->back(), DEFINITION_TYPE) - || (!isLegalNameChar(previousNonWSChar) - && previousNonWSChar != ')' - && previousNonWSChar != ']') - ); - - if (!isPR) - { - char nextChar = peekNextChar(); - isPR |= (!isWhiteSpace(nextChar) - && nextChar != '-' - && nextChar != '(' - && nextChar != '[' - && !isLegalNameChar(nextChar)); - } - - return isPR; - } - - - /** - * check if the currently reached '-' character is - * a urinary minus - * this method takes for granted that the current character - * is a '-'. - * - * @return whether the current '-' is a urinary minus. - */ - bool ASFormatter::isUrinaryMinus() const - { - return ( (previousOperator == &AS_RETURN || !isalnum(previousCommandChar)) - && previousCommandChar != '.' - && previousCommandChar != ')' - && previousCommandChar != ']' ); - } - - - /** - * check if the currently reached '-' or '+' character is - * part of an exponent, i.e. 0.2E-5. - * this method takes for granted that the current character - * is a '-' or '+'. - * - * @return whether the current '-' is in an exponent. - */ - bool ASFormatter::isInExponent() const - { - int formattedLineLength = formattedLine.length(); - if (formattedLineLength >= 2) - { - char prevPrevFormattedChar = formattedLine[formattedLineLength - 2]; - char prevFormattedChar = formattedLine[formattedLineLength - 1]; - - return ( (prevFormattedChar == 'e' || prevFormattedChar == 'E') - && (prevPrevFormattedChar == '.' || isdigit(prevPrevFormattedChar)) ); - } - else - return false; - } - - /** - * check if a one-line bracket has been reached, - * i.e. if the currently reached '{' character is closed - * with a complimentry '}' elsewhere on the current line, - *. - * @return has a one-line bracket been reached? - */ - bool ASFormatter::isOneLineBlockReached() const - { - bool isInComment = false; - bool isInQuote = false; - int bracketCount = 1; - int currentLineLength = currentLine.length(); - int i = 0; - char ch = ' '; - char quoteChar = ' '; - - for (i = charNum + 1; i < currentLineLength; ++i) - { - ch = currentLine[i]; - - if (isInComment) - { - if (currentLine.COMPARE(i, 2, "*/") == 0) - { - isInComment = false; - ++i; - } - continue; - } - - if (ch == '\\') - { - ++i; - continue; - } - - if (isInQuote) - { - if (ch == quoteChar) - isInQuote = false; - continue; - } - - if (ch == '"' || ch == '\'') - { - isInQuote = true; - quoteChar = ch; - continue; - } - - if (currentLine.COMPARE(i, 2, "//") == 0) - break; - - if (currentLine.COMPARE(i, 2, "/*") == 0) - { - isInComment = true; - ++i; - continue; - } - - if (ch == '{') - ++bracketCount; - else if (ch == '}') - --bracketCount; - - if(bracketCount == 0) - return true; - } - - return false; - } - - - /** - * check if one of a set of headers has been reached in the - * current position of the current line. - * - * @return a pointer to the found header. Or a NULL if no header has been reached. - * @param headers a vector of headers - * @param checkBoundry - */ - const string *ASFormatter::findHeader(const vector<const string*> &headers, bool checkBoundry) - { - return ASBeautifier::findHeader(currentLine, charNum, headers, checkBoundry); - } - - - -#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 ASFORMATTER_H -#define ASFORMATTER_H - -#include "ASBeautifier.h" -//#include "enums.h" -#include "compiler_defines.h" - -namespace astyle { - - class ASFormatter : public ASBeautifier - { - public: - ASFormatter(); - virtual ~ASFormatter(); - virtual void init(ASSourceIterator* iter); - virtual bool hasMoreLines() const; - virtual string nextLine(); - void setBracketFormatMode(BracketMode mode); - void setBreakClosingHeaderBracketsMode(bool state); - void setOperatorPaddingMode(bool mode); - void setParenthesisPaddingMode(bool mode); - void setBreakOneLineBlocksMode(bool state); - void setSingleStatementsMode(bool state); - void setTabSpaceConversionMode(bool state); - void setBreakBlocksMode(bool state); - void setBreakClosingHeaderBlocksMode(bool state); - void setBreakElseIfsMode(bool state); - - private: - void ASformatter(ASFormatter ©); // not to be imlpemented - void operator=(ASFormatter&); // not to be implemented - void staticInit(); - bool isFormattingEnabled() const; - void goForward(int i); - bool getNextChar(); - char peekNextChar() const; - bool isBeforeComment() const; - void trimNewLine(); - BracketType getBracketType() const; - bool isPointerOrReference() const; - bool isUrinaryMinus() const; - bool isInExponent() const; - bool isOneLineBlockReached() const; - void appendChar(char ch, bool canBreakLine = true); - void appendCurrentChar(bool canBreakLine = true); - void appendSequence(const string &sequence, bool canBreakLine = true); - void appendSpacePad(); - void breakLine(); - inline bool isSequenceReached(const string &sequence) const; - const string *findHeader(const vector<const string*> &headers, bool checkBoundry = true); - - static vector<const string*> headers; - static vector<const string*> nonParenHeaders; - static vector<const string*> preprocessorHeaders; - static vector<const string*> preDefinitionHeaders; - static vector<const string*> preCommandHeaders; - static vector<const string*> operators; - static vector<const string*> assignmentOperators; - static bool calledInitStatic; - - ASSourceIterator *sourceIterator; - vector<const string*> *preBracketHeaderStack; - vector<BracketType> *bracketTypeStack; - vector<int> *parenStack; - string readyFormattedLine; - string currentLine; - string formattedLine; - const string *currentHeader; - const string *previousOperator; - char currentChar; - char previousChar; - char previousNonWSChar; - char previousCommandChar; - char quoteChar; - unsigned int charNum; - BracketMode bracketFormatMode; - bool isVirgin; - bool shouldPadOperators; - bool shouldPadParenthesies; - bool shouldConvertTabs; - bool isInLineComment; - bool isInComment; - bool isInPreprocessor; - bool isInTemplate; // true both in template definitions (e.g. template<class A>) and template usage (e.g. F<int>). - bool doesLineStartComment; - bool isInQuote; - bool isSpecialChar; - bool isNonParenHeader; - bool foundQuestionMark; - bool foundPreDefinitionHeader; - bool foundPreCommandHeader; - bool isInLineBreak; - bool isInClosingBracketLineBreak; - bool endOfCodeReached; - bool isLineReady; - bool isPreviousBracketBlockRelated; - bool isInPotentialCalculation; - //bool foundOneLineBlock; - bool shouldBreakOneLineBlocks; - bool shouldReparseCurrentChar; - bool shouldBreakOneLineStatements; - bool shouldBreakLineAfterComments; - bool shouldBreakClosingHeaderBrackets; - bool shouldBreakElseIfs; - bool passedSemicolon; - bool passedColon; - bool isImmediatelyPostComment; - bool isImmediatelyPostLineComment; - bool isImmediatelyPostEmptyBlock; - - bool shouldBreakBlocks; - bool shouldBreakClosingHeaderBlocks; - bool isPrependPostBlockEmptyLineRequested; - bool isAppendPostBlockEmptyLineRequested; - - bool prependEmptyLine; - bool foundClosingHeader; - int previousReadyFormattedLineLength; - - bool isInHeader; - bool isImmediatelyPostHeader; - - }; - -} - -#endif -/* -* Copyright (c) 1998,1999,2000,2001,2002 Tal Davidson. All rights reserved. -* -* ASResource.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. -*/ - -#include "compiler_defines.h" -#include "ASResource.h" - -#include <string> - - -#ifdef USES_NAMESPACE -using namespace std; - -namespace astyle - { -#endif - - const string ASResource::AS_IF = string("if"); - const string ASResource::AS_ELSE = string ("else"); - const string ASResource::AS_FOR = string("for"); - const string ASResource::AS_DO = string("do"); - const string ASResource::AS_WHILE = string("while"); - const string ASResource::AS_SWITCH = string ("switch"); - const string ASResource::AS_CASE = string ("case"); - const string ASResource::AS_DEFAULT = string("default"); - const string ASResource::AS_CLASS = string("class"); - const string ASResource::AS_STRUCT = string("struct"); - const string ASResource::AS_UNION = string("union"); - const string ASResource::AS_INTERFACE = string("interface"); - const string ASResource::AS_NAMESPACE = string("namespace"); - const string ASResource::AS_EXTERN = string("extern"); - const string ASResource::AS_PUBLIC = string("public"); - const string ASResource::AS_PROTECTED = string("protected"); - const string ASResource::AS_PRIVATE = string("private"); - const string ASResource::AS_STATIC = string("static"); - const string ASResource::AS_SYNCHRONIZED = string("synchronized"); - const string ASResource::AS_OPERATOR = string("operator"); - const string ASResource::AS_TEMPLATE = string("template"); - const string ASResource::AS_TRY = string("try"); - const string ASResource::AS_CATCH = string("catch"); - const string ASResource::AS_FINALLY = string("finally"); - const string ASResource::AS_THROWS = string("throws"); - const string ASResource::AS_CONST = string("const"); - - const string ASResource::AS_ASM = string("asm"); - - const string ASResource::AS_BAR_DEFINE = string("#define"); - const string ASResource::AS_BAR_INCLUDE = string("#include"); - const string ASResource::AS_BAR_IF = string("#if"); - const string ASResource::AS_BAR_EL = string("#el"); - const string ASResource::AS_BAR_ENDIF = string("#endif"); - - const string ASResource::AS_OPEN_BRACKET = string("{"); - const string ASResource::AS_CLOSE_BRACKET = string("}"); - const string ASResource::AS_OPEN_LINE_COMMENT = string("//"); - const string ASResource::AS_OPEN_COMMENT = string("/*"); - const string ASResource::AS_CLOSE_COMMENT = string("*/"); - - const string ASResource::AS_ASSIGN = string("="); - const string ASResource::AS_PLUS_ASSIGN = string("+="); - const string ASResource::AS_MINUS_ASSIGN = string("-="); - const string ASResource::AS_MULT_ASSIGN = string("*="); - const string ASResource::AS_DIV_ASSIGN = string("/="); - const string ASResource::AS_MOD_ASSIGN = string("%="); - const string ASResource::AS_OR_ASSIGN = string("|="); - const string ASResource::AS_AND_ASSIGN = string("&="); - const string ASResource::AS_XOR_ASSIGN = string("^="); - const string ASResource::AS_GR_GR_ASSIGN = string(">>="); - const string ASResource::AS_LS_LS_ASSIGN = string("<<="); - const string ASResource::AS_GR_GR_GR_ASSIGN = string(">>>="); - const string ASResource::AS_LS_LS_LS_ASSIGN = string("<<<="); - const string ASResource::AS_RETURN = string("return"); - - const string ASResource::AS_EQUAL = string("=="); - const string ASResource::AS_PLUS_PLUS = string("++"); - const string ASResource::AS_MINUS_MINUS = string("--"); - const string ASResource::AS_NOT_EQUAL = string("!="); - const string ASResource::AS_GR_EQUAL = string(">="); - const string ASResource::AS_GR_GR = string(">>"); - const string ASResource::AS_GR_GR_GR = string(">>>"); - const string ASResource::AS_LS_EQUAL = string("<="); - const string ASResource::AS_LS_LS = string("<<"); - const string ASResource::AS_LS_LS_LS = string("<<<"); - const string ASResource::AS_ARROW = string("->"); - const string ASResource::AS_AND = string("&&"); - const string ASResource::AS_OR = string("||"); - const string ASResource::AS_COLON_COLON = string("::"); - const string ASResource::AS_PAREN_PAREN = string("()"); - const string ASResource::AS_BLPAREN_BLPAREN = string("[]"); - - const string ASResource::AS_PLUS = string("+"); - const string ASResource::AS_MINUS = string("-"); - const string ASResource::AS_MULT = string("*"); - const string ASResource::AS_DIV = string("/"); - const string ASResource::AS_MOD = string("%"); - const string ASResource::AS_GR = string(">"); - const string ASResource::AS_LS = string("<"); - const string ASResource::AS_NOT = string("!"); - const string ASResource::AS_BIT_OR = string("|"); - const string ASResource::AS_BIT_AND = string("&"); - const string ASResource::AS_BIT_NOT = string("~"); - const string ASResource::AS_BIT_XOR = string("^"); - const string ASResource::AS_QUESTION = string("?"); - const string ASResource::AS_COLON = string(":"); - const string ASResource::AS_COMMA = string(","); - const string ASResource::AS_SEMICOLON = string(";"); - - const string ASResource::AS_FOREACH = string("foreach"); - const string ASResource::AS_LOCK = string("lock"); - const string ASResource::AS_UNSAFE = string("unsafe"); - const string ASResource::AS_FIXED = string("fixed"); - const string ASResource::AS_GET = string("get"); - const string ASResource::AS_SET = string("set"); - const string ASResource::AS_ADD = string("add"); - const string ASResource::AS_REMOVE = string("remove"); - -#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 ASRES_H -#define ASRES_H - -#include "compiler_defines.h" -#include "ASStreamIterator.h" - -#include <iostream> -#include <fstream> -#include <string> - -namespace astyle { - -class ASResource - { - 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_THROWS, AS_FINALLY; - static const string AS_PUBLIC, AS_PROTECTED, AS_PRIVATE; - static const string AS_CLASS, AS_STRUCT, AS_UNION, AS_INTERFACE, AS_NAMESPACE, AS_EXTERN; - static const string AS_STATIC; - static const string AS_CONST; - static const string AS_SYNCHRONIZED; - static const string AS_OPERATOR, AS_TEMPLATE; - static const string AS_OPEN_BRACKET, AS_CLOSE_BRACKET; - 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_RETURN; - 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_EQUAL, AS_PLUS_PLUS, AS_MINUS_MINUS, AS_NOT_EQUAL, AS_GR_EQUAL, AS_GR_GR_GR, AS_GR_GR; - static const string AS_LS_EQUAL, AS_LS_LS_LS, AS_LS_LS, AS_ARROW, AS_AND, AS_OR; - static const string AS_COLON_COLON, AS_PAREN_PAREN, AS_BLPAREN_BLPAREN; - 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; - static const string AS_FOREACH, AS_LOCK, AS_UNSAFE, AS_FIXED; - static const string AS_GET, AS_SET, AS_ADD, AS_REMOVE; - }; -} -#endif - -#ifndef ASSOURCEITERATOR_H -#define ASSOURCEITERATOR_H - -#include <string> -#include "compiler_defines.h" - -namespace astyle - { - - class ASSourceIterator - { - public: - virtual bool hasMoreLines() const = 0; - virtual std::string nextLine() = 0; - }; -} - -#endif -#include "compiler_defines.h"
-#include "ASStreamIterator.h"
-
-#include <iostream>
-#include <fstream>
-#include <string>
-
-using namespace astyle;
-
-ASStreamIterator::ASStreamIterator(istream *in)
-{
- inStream = in;
-}
-
-ASStreamIterator::~ASStreamIterator()
-{
- delete inStream;
-}
-
-
-bool ASStreamIterator::hasMoreLines() const
- {
- if (*inStream)
- return true;
- else
- return false;
- }
-
-/*
-string ASStreamIterator::nextLine()
-{
- char theInChar;
- char peekedChar;
- int theBufferPosn = 0;
-
- //
- // treat '\n', '\r', '\n\r' and '\r\n' as an endline.
- //
- while (theBufferPosn < 2047 && inStream->get(theInChar))
- // while not eof
- {
- if (theInChar != '\n' && theInChar != '\r')
- {
- buffer[theBufferPosn] = theInChar;
- theBufferPosn++;
- }
- else
- {
- peekedChar = inStream->peek();
- if (peekedChar != theInChar && (peekedChar == '\r' || peekedChar == '\n') )
- {
- inStream->get(theInChar);
- }
- break;
- }
- }
- buffer[theBufferPosn] = '\0';
-
- return string(buffer);
-}
-*/
-
-
-string ASStreamIterator::nextLine()
-{
- char *srcPtr;
- char *filterPtr;
-
- inStream->getline(buffer, 2047);
- srcPtr = filterPtr = buffer;
-
- while (*srcPtr != 0)
- {
- if (*srcPtr != '\r')
- *filterPtr++ = *srcPtr;
- srcPtr++;
- }
- *filterPtr = 0;
-
- return string(buffer);
-}
-
-/* - * 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 ASSTREAMITERATOR_H -#define ASSTREAMITERATOR_H - -#include "ASSourceIterator.h" - -using namespace std; - -namespace astyle - { - class ASStreamIterator : - public ASSourceIterator - { - public: - ASStreamIterator(istream *in); - virtual ~ASStreamIterator(); - bool hasMoreLines() const; - string nextLine(); - - private: - istream * inStream; - char buffer[2048]; - }; - -} - -#endif -/*************************************************************************** - charcodes.cpp - description - ------------------- - begin : Wed Nov 24 2003 - copyright : (C) 2003 by André imon - 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. * - * * - ***************************************************************************/ - -// FILE SHOULD BE REMOVED FROM PROJECT - -#ifndef CHAR_CODES -#define CHAR_CODES - -#ifdef _WIN32 - -#define AUML_LC 228 -#define OUML_LC 246 -#define UUML_LC 252 - -#define AUML_UC 196 -#define OUML_UC 214 -#define UUML_UC 220 - - -#define AACUTE_LC 225 -#define EACUTE_LC 233 -#define OACUTE_LC 243 -#define UACUTE_LC 250 - -#define AACUTE_UC 193 -#define EACUTE_UC 201 -#define OACUTE_UC 211 -#define UACUTE_UC 218 - -#define AGRAVE_LC 224 -#define EGRAVE_LC 232 -#define OGRAVE_LC 242 -#define UGRAVE_LC 249 - -#define AGRAVE_UC 192 -#define EGRAVE_UC 200 -#define OGRAVE_UC 210 -#define UGRAVE_UC 217 - -#define SZLIG 223 - -/* DOS CONSOLE CODES -#define AUML_LC 132 -#define OUML_LC 148 -#define UUML_LC 129 - -#define AUML_UC 142 -#define OUML_UC 153 -#define UUML_UC 154 - - -#define AACUTE_LC 160 -#define EACUTE_LC 130 -#define OACUTE_LC 162 -#define UACUTE_LC 163 - -#define AACUTE_UC 181 -#define EACUTE_UC 144 -#define OACUTE_UC 224 -#define UACUTE_UC 233 - -#define AGRAVE_LC 133 -#define EGRAVE_LC 138 -#define OGRAVE_LC 149 -#define UGRAVE_LC 151 - -#define AGRAVE_UC 183 -#define EGRAVE_UC 212 -#define OGRAVE_UC 227 -#define UGRAVE_UC 235 - -#define SZLIG 225 -*/ - -#else - -#define AUML_LC 164 -#define OUML_LC 182 -#define UUML_LC 188 - -#define AUML_UC 132 -#define OUML_UC 150 -#define UUML_UC 156 - - -#define AACUTE_LC 161 -#define EACUTE_LC 169 -#define OACUTE_LC 179 -#define UACUTE_LC 186 - -#define AACUTE_UC 129 -#define EACUTE_UC 137 -#define OACUTE_UC 147 -#define UACUTE_UC 154 - -#define AGRAVE_LC 160 -#define EGRAVE_LC 168 -#define OGRAVE_LC 178 -#define UGRAVE_LC 185 - -#define AGRAVE_UC 128 -#define EGRAVE_UC 136 -#define OGRAVE_UC 146 -#define UGRAVE_UC 153 - -#define SZLIG 159 - -#endif - -#endif -/*************************************************************************** - cmdlineoptions.cpp - description - ------------------- - begin : Sun Nov 25 2001 - copyright : (C) 2001 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 "cmdlineoptions.h" - -using namespace std; - -/* Siehe man getopt (3) - Konstruktor legt Optionen und Argumente fest -*/ -CmdLineOptions::CmdLineOptions(int argc, char *argv[]): - numberSpaces(0), - wrappingStyle(highlight::WRAP_DISABLED), - outputType (highlight::HTML), - opt_language (false), - opt_include_style (false), - opt_help (false), - opt_version (false), - opt_verbose (false), - opt_linenumbers (false), - opt_style (false), - opt_batch_mode (false), - opt_fragment (false) , - opt_attach_line_anchors (false), - opt_show_themes (false), - opt_show_langdefs (false), - opt_printindex(false), - opt_quiet(false), - opt_xslfo_fop(false), - opt_replacequotes(false), - opt_print_progress(false), - opt_fill_zeroes(false), - opt_stylepath_explicit(false), - opt_force_output(false), - configFileRead(false), - helpLang("en"), - charset("ISO-8859-1") -{ - - loadConfigurationFile(); - - int c, option_index = 0; - static struct option long_options[] = - { - {OPT_OUT, 1, 0, S_OPT_OUT}, - {OPT_IN, 1, 0, S_OPT_IN}, - {OPT_SYNTAX, 1, 0, S_OPT_SYNTAX}, - {OPT_VERBOSE, 0, 0, S_OPT_VERBOSE}, - {OPT_INC_STYLE, 0, 0, S_OPT_INC_STYLE}, - {OPT_HELP, 0, 0, S_OPT_HELP}, - {OPT_HELPINT, 1, 0, S_OPT_HELPINT}, - {OPT_LINENO,0,0,S_OPT_LINENO}, - {OPT_STYLE, 1,0,S_OPT_STYLE}, - {OPT_STYLE_OUT, 1, 0,S_OPT_STYLE_OUT}, - {OPT_STYLE_IN, 1, 0,S_OPT_STYLE_IN}, - {OPT_DELTABS,1,0,S_OPT_DELTABS}, - {OPT_XHTML, 0,0,S_OPT_XHTML}, - {OPT_RTF, 0,0,S_OPT_RTF}, - {OPT_TEX,0, 0,S_OPT_TEX}, - {OPT_LATEX,0, 0,S_OPT_LATEX}, - {OPT_XSLFO,0, 0,S_OPT_XSLFO}, - {OPT_ANSI,0, 0,S_OPT_ANSI}, - {OPT_XML,0, 0,S_OPT_XML}, - {OPT_BATCHREC,1,0,S_OPT_BATCHREC}, - {OPT_FRAGMENT,0,0,S_OPT_FRAGMENT}, - {OPT_ANCHORS, 0,0,S_OPT_ANCHORS }, - {OPT_LISTTHEMES, 0,0,S_OPT_LISTTHEMES }, - {OPT_LISTLANGS, 0,0,S_OPT_LISTLANGS }, - {OPT_OUTDIR,1,0,S_OPT_OUTDIR}, - {OPT_VERSION,0,0,0}, - {OPT_FORMATSTYLE,1,0,S_OPT_FORMATSTYLE}, - {OPT_DATADIR,1,0,S_OPT_DATADIR}, - {OPT_ADDDATADIR,1,0,S_OPT_ADDDATADIR}, - {OPT_INDEXFILE,0,0,S_OPT_INDEXFILE}, - {OPT_WRAP,0,0,S_OPT_WRAP}, - {OPT_WRAPSIMPLE,0,0,S_OPT_WRAPSIMPLE}, - {OPT_QUIET,0,0,S_OPT_QUIET}, - {OPT_REPLACE_QUOTES,0,0,S_OPT_REPLACE_QUOTES}, - {OPT_PROGRESSBAR,0,0,S_OPT_PROGRESSBAR}, - {OPT_FILLZEROES,0,0,S_OPT_FILLZEROES}, - {OPT_ENCODING,1,0,S_OPT_ENCODING}, - - //remove as soon as APAche fixes the bug in FOP (0.20.5) - {OPT_FOP,0,0,S_OPT_FOP}, - - //deprecated - {OPT_CSSOUT,1,0,0}, - {OPT_CSSIN,1,0,0}, - {OPT_INC_CSS,0,0,0}, - {OPT_FORCE_OUTPUT,0,0,0}, - - {0, 0, 0, 0} - }; - - while (1) - { - c = getopt_long (argc, argv,S_OPTIONS_STRING,long_options, &option_index); - if (c == -1) - break; - - switch (c) - { - case 0: // long options - if (long_options[option_index].name==OPT_VERSION) { - opt_version = true; - } - if (long_options[option_index].name==OPT_CSSOUT) { - styleOutFilename=string(optarg); - printDeprecatedWarning(OPT_CSSOUT, OPT_STYLE_OUT); - } - if (long_options[option_index].name==OPT_CSSIN) { - styleInFilename=string(optarg); - printDeprecatedWarning(OPT_CSSIN, OPT_STYLE_IN); - } - if (long_options[option_index].name==OPT_INC_CSS) { - opt_include_style = true; - printDeprecatedWarning(OPT_INC_CSS, OPT_INC_STYLE); - } - if (long_options[option_index].name==OPT_FORCE_OUTPUT) { - opt_force_output = true; - } - break; - case S_OPT_OUT: - outFilename=string(optarg); - break; - case S_OPT_IN: - inputFileNames.push_back(string(optarg)); - break; - case S_OPT_STYLE_OUT: - styleOutFilename=string(optarg); - opt_stylepath_explicit=true; - break; - case S_OPT_STYLE_IN: - styleInFilename=string(optarg); - break; - case S_OPT_VERBOSE: - opt_verbose = true; - break; - case S_OPT_QUIET: - opt_quiet = true; - break; - case S_OPT_INC_STYLE: - opt_include_style = true; - break; - case S_OPT_HELPINT: - helpLang=string(optarg); - case S_OPT_HELP: - opt_help = true; - break; - case S_OPT_LINENO: - opt_linenumbers = true; - break; - case '?': - //opt_help = true; - break; - case S_OPT_STYLE: - styleName=string(optarg); - opt_style = true; - break; - case S_OPT_SYNTAX: - language=string(optarg); - opt_language = true; - break; - case S_OPT_DELTABS: - numberSpaces = StringTools::str2int (string(optarg)); - break; - case S_OPT_XHTML: - outputType=highlight::XHTML; - break; - case S_OPT_RTF: - outputType=highlight::RTF; - break; - case S_OPT_TEX: - outputType=highlight::TEX; - break; - case S_OPT_LATEX: - outputType=highlight::LATEX; - break; - case S_OPT_XSLFO: - outputType=highlight::XSLFO; - break; - case S_OPT_ANSI: - outputType=highlight::ANSI; - break; - case S_OPT_XML: - outputType=highlight::XML; - break; - case S_OPT_BATCHREC: - opt_batch_mode = true; - readDirectory(string(optarg)); - break; - case S_OPT_FRAGMENT: - opt_fragment = true; - break; - case S_OPT_ANCHORS: - opt_attach_line_anchors = true; - break; - case S_OPT_LISTTHEMES: - opt_show_themes = true; - break; - case S_OPT_LISTLANGS: - opt_show_langdefs = true; - break; - case S_OPT_OUTDIR: - outDirectory = validateDirPath(string(optarg)); - break; - case S_OPT_FORMATSTYLE: - indentScheme =string(optarg); - break; - case S_OPT_ENCODING: - charset =string(optarg); - break; - case S_OPT_DATADIR: - dataDir=validateDirPath(string(optarg)); - break; - case S_OPT_ADDDATADIR: - additionalDataDir=validateDirPath(string(optarg)); - break; - case S_OPT_INDEXFILE: - opt_printindex=true; - break; - case S_OPT_WRAPSIMPLE: - wrappingStyle = highlight::WRAP_SIMPLE; - break; - case S_OPT_WRAP: - wrappingStyle = highlight::WRAP_DEFAULT; - break; - case S_OPT_FOP: - opt_xslfo_fop=true; - break; - case S_OPT_REPLACE_QUOTES: - opt_replacequotes=true; - break; - case S_OPT_PROGRESSBAR: - opt_print_progress=true; - break; - case S_OPT_FILLZEROES: - opt_fill_zeroes=true; - break; - default: - cerr <<"higlight: Unknown option " <<c<< endl; - } - } - - if (optind < argc) //still args left - { - if (inputFileNames.empty()) { - while (optind < argc){ - inputFileNames.push_back(string(argv[optind++])); - } - } - } else if (inputFileNames.empty()) { - inputFileNames.push_back(""); - } - if (printDebugInfo() && configFileRead) { - cout << "Configuration file \""<<configFilePath<<"\" was read.\n"; - } -} - -CmdLineOptions::~CmdLineOptions(){ -} - -const string &CmdLineOptions::getSingleOutFilename() - { - if (!inputFileNames.empty() && !outDirectory.empty()) { - if (outFilename.empty()) { - outFilename = outDirectory; - int delim = getSingleInFilename().find_last_of(Platform::pathSeparator)+1; - outFilename += getSingleInFilename().substr((delim>-1)?delim:0) - + getOutFileSuffix(); - } - } - return outFilename; - } - -const string &CmdLineOptions::getSingleInFilename() const - { - return inputFileNames[0]; - } - -const string &CmdLineOptions::getOutDirectory() - { - if (!outFilename.empty() && !enableBatchMode()){ - outDirectory=getDirName(outFilename); - } - return outDirectory; - } - -const string CmdLineOptions::getStyleOutFilename() const - { - if (!styleOutFilename.empty()) return styleOutFilename; - return (outputType==highlight::HTML || - outputType==highlight::XHTML)? "highlight.css":"highlight.sty"; - } -const string &CmdLineOptions::getStyleInFilename() const - { - return styleInFilename; - } -int CmdLineOptions::getNumberSpaces() const - { - return numberSpaces; - } -bool CmdLineOptions::printVersion()const - { - return opt_version; - } -bool CmdLineOptions::printHelp()const - { - return opt_help; - } -bool CmdLineOptions::printDebugInfo()const - { - return opt_verbose; - } -bool CmdLineOptions::quietMode()const - { - return opt_quiet; - } -bool CmdLineOptions::includeStyleDef()const - { - return opt_include_style; - } - -bool CmdLineOptions::formatSupportsExtStyle(){ - return outputType==highlight::HTML || - outputType==highlight::XHTML || - outputType==highlight::LATEX || - outputType==highlight::TEX; -} - -bool CmdLineOptions::printLineNumbers()const - { - return opt_linenumbers; - } - -string CmdLineOptions::getStyleName()const - { - return ( ( opt_style) ? styleName+".style" : "kwrite.style" ); - } -bool CmdLineOptions::enableBatchMode()const{ - return inputFileNames.size()>1 || opt_batch_mode; -} -bool CmdLineOptions::fragmentOutput()const{ - return opt_fragment; -} -string CmdLineOptions::getOutFileSuffix()const{ - switch (outputType){ - case highlight::XHTML: return ".xhtml"; - case highlight::RTF: return ".rtf"; - case highlight::TEX: - case highlight::LATEX: return ".tex"; - case highlight::XSLFO: return ".fo"; - case highlight::XML: return ".xml"; - default: return ".html"; - } -} -string CmdLineOptions::getDirName(const string & path) { - size_t dirNameLength=path.rfind(Platform::pathSeparator); - return (dirNameLength==string::npos)?string():path.substr(0, dirNameLength+1); -} -bool CmdLineOptions::attachLineAnchors()const{ - return opt_attach_line_anchors; -} -bool CmdLineOptions::showThemes()const{ - return opt_show_themes; -} -bool CmdLineOptions::showLangdefs()const{ - return opt_show_langdefs; -} -bool CmdLineOptions::outDirGiven()const{ - return !outFilename.empty(); -} -bool CmdLineOptions::fopCompatible() const { - return opt_xslfo_fop; -} -bool CmdLineOptions::replaceQuotes() const { - return opt_replacequotes; -} -bool CmdLineOptions::getFlag( const string& paramVal){ - return StringTools::lowerCase(paramVal)=="true"; -} -bool CmdLineOptions::formattingEnabled(){ - return !indentScheme.empty(); -} -bool CmdLineOptions::dataDirGiven()const { - return !dataDir.empty(); -} -bool CmdLineOptions::additionalDataDirGiven()const { - return !additionalDataDir.empty(); -} -const string &CmdLineOptions::getDataDir() const { - return dataDir; -} -const string &CmdLineOptions::getIndentScheme() const { - return indentScheme; -} -const string &CmdLineOptions::getAdditionalDataDir()const{ - return additionalDataDir; -} -const string &CmdLineOptions::getLanguage() const { - return language; -} -const string&CmdLineOptions::getCharSet() const{ - return charset; -} -bool CmdLineOptions::printIndexFile() const{ - return opt_printindex && (outputType==highlight::HTML || - outputType==highlight::XHTML); -} -bool CmdLineOptions::printProgress() const{ - return opt_print_progress; -} -bool CmdLineOptions::fillLineNrZeroes() const{ - return opt_fill_zeroes; -} -bool CmdLineOptions::syntaxGiven() const{ - return opt_language; -} -bool CmdLineOptions::omitEncodingName() const{ - return StringTools::lowerCase(charset)=="none"; -} -bool CmdLineOptions::forceOutput() const{ - return opt_force_output; -} -const string CmdLineOptions::getHelpLang()const{ - return helpLang+".help"; -} -highlight::WrapMode CmdLineOptions::getWrappingStyle() const { - return wrappingStyle; -} -const vector <string> & CmdLineOptions::getInputFileNames() const{ - return inputFileNames; -} -void CmdLineOptions::readDirectory(const string & wildcard){ - // get matching files, use recursive search - bool directoryOK=Platform::getDirectoryEntries(inputFileNames, wildcard, true); - if (!directoryOK) - { - cerr << "highlight: No files matched the pattern \"" - << wildcard << "\"."<< endl; - } -} -void CmdLineOptions::loadConfigurationFile() -{ - #ifndef _WIN32 - #ifdef CONFIG_FILE_PATH - configFilePath=CONFIG_FILE_PATH; - #else - char* homeEnv=getenv("HOME"); - if (homeEnv==NULL) return; - configFilePath=string(homeEnv)+"/.highlightrc"; - #endif - #else - configFilePath = Platform::getAppPath() + "highlight.conf"; - #endif - ConfigurationReader presets(configFilePath); - - if (presets.found()) - { - string paramVal; - configFileRead=true; - - styleOutFilename = presets.getParameter(OPT_STYLE_OUT); - styleInFilename = presets.getParameter(OPT_STYLE_IN); - styleName = presets.getParameter(OPT_STYLE); - opt_style = !styleName.empty(); - language = presets.getParameter(OPT_SYNTAX); - opt_language = !language.empty(); - numberSpaces = StringTools::str2int(presets.getParameter(OPT_DELTABS)); - indentScheme = presets.getParameter(OPT_FORMATSTYLE); - - paramVal = presets.getParameter(OPT_DATADIR); - if (!paramVal.empty()) { - dataDir=validateDirPath( paramVal); - } - paramVal = presets.getParameter(OPT_ADDDATADIR); - if (!paramVal.empty()) { - additionalDataDir=validateDirPath(paramVal); - } - paramVal = presets.getParameter(OPT_OUTDIR); - if (!paramVal.empty()) { - outDirectory=validateDirPath(paramVal); - } - paramVal = presets.getParameter(OPT_ENCODING); - if (!paramVal.empty()) { - charset=paramVal; - } - - opt_include_style=getFlag(presets.getParameter(OPT_INC_STYLE)); - opt_verbose=getFlag(presets.getParameter(OPT_VERBOSE)); - opt_linenumbers=getFlag(presets.getParameter(OPT_LINENO)); - opt_fragment=getFlag(presets.getParameter(OPT_FRAGMENT)); - opt_attach_line_anchors=getFlag(presets.getParameter(OPT_ANCHORS)); - opt_printindex=getFlag(presets.getParameter(OPT_INDEXFILE)); - opt_quiet=getFlag(presets.getParameter(OPT_QUIET)); - opt_xslfo_fop=getFlag(presets.getParameter(OPT_FOP)); - opt_replacequotes=getFlag(presets.getParameter(OPT_REPLACE_QUOTES)); - opt_print_progress=getFlag(presets.getParameter(OPT_PROGRESSBAR)); - opt_fill_zeroes=getFlag(presets.getParameter(OPT_FILLZEROES)); - - if (getFlag(presets.getParameter(OPT_WRAP))) { - wrappingStyle=highlight::WRAP_DEFAULT; - } - if (getFlag(presets.getParameter(OPT_WRAPSIMPLE))) { - wrappingStyle=highlight::WRAP_SIMPLE; - } - if (getFlag(presets.getParameter(OPT_XHTML))) { - outputType=highlight::XHTML; - } else if (getFlag(presets.getParameter(OPT_RTF))) { - outputType=highlight::RTF; - } else if (getFlag(presets.getParameter(OPT_TEX))) { - outputType=highlight::TEX; - } else if (getFlag(presets.getParameter(OPT_LATEX))) { - outputType=highlight::LATEX; - } else if (getFlag(presets.getParameter(OPT_XSLFO))) { - outputType=highlight::XSLFO; - } else if (getFlag(presets.getParameter(OPT_ANSI))) { - outputType=highlight::ANSI; - } else if (getFlag(presets.getParameter(OPT_XML))) { - outputType=highlight::XML; - } - } -} - -string CmdLineOptions::validateDirPath(const string & path){ - return (path[path.length()-1] !=Platform::pathSeparator)? - path+Platform::pathSeparator : path; -} - -highlight::OutputType CmdLineOptions::getOutputType() const { - return outputType; -} - -void CmdLineOptions::printDeprecatedWarning(const char *oldOption, const char *newOption){ - cerr << "Warning: Long option \""<<oldOption << "\" is DEPRECATED."; - cerr << " Use \""<<newOption << "\" instead.\n"; -} -/*************************************************************************** - cmdlineoptions.h - description - ------------------- - begin : Sun Nov 25 2001 - copyright : (C) 2001 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. * - * * - ***************************************************************************/ - -#ifndef CMDLINEOPTIONS_H -#define CMDLINEOPTIONS_H - -#include <string> -#include <map> -#include <cstdlib> -#include <iostream> -#include <fstream> - -#include "platform_fs.h" -#include "configurationreader.h" -#include "datadir.h" -#include "enums.h" - -#ifdef _WIN32 - #include <windows.h> -#endif - -// If your system does not know getopt_long, define USE_LOCAL_GETOPT -#if defined(_WIN32) || defined(__SVR4) || defined(__sun__) - // some compilers don't like redefinitions... - #ifndef USE_LOCAL_GETOPT - #define USE_LOCAL_GETOPT - #endif -#endif - -#ifdef USE_LOCAL_GETOPT - #include "getopt.h" -#else - #include <getopt.h> -#endif - -#define OPT_VERBOSE "verbose" -#define OPT_INC_STYLE "include-style" -#define OPT_HELP "help" -#define OPT_LINENO "linenumbers" -#define OPT_XHTML "xhtml" -#define OPT_RTF "rtf" -#define OPT_TEX "tex" -#define OPT_LATEX "latex" -#define OPT_XSLFO "xsl-fo" -#define OPT_FRAGMENT "fragment" -#define OPT_ANCHORS "anchors" -#define OPT_LISTTHEMES "list-themes" -#define OPT_LISTLANGS "list-langs" -#define OPT_VERSION "version" -#define OPT_IN "input" -#define OPT_OUT "output" -#define OPT_SYNTAX "syntax" -#define OPT_STYLE "style" -#define OPT_STYLE_OUT "style-outfile" -#define OPT_STYLE_IN "style-infile" - -#define OPT_DELTABS "replace-tabs" -#define OPT_BATCHREC "batch-recursive" -#define OPT_OUTDIR "outdir" -#define OPT_FORMATSTYLE "format-style" -#define OPT_DATADIR "data-dir" -#define OPT_ADDDATADIR "add-data-dir" -#define OPT_INDEXFILE "print-index" -#define OPT_HELPINT "help-int" -#define OPT_WRAP "wrap" -#define OPT_WRAPSIMPLE "wrap-simple" -#define OPT_QUIET "quiet" -#define OPT_REPLACE_QUOTES "replace-quotes" -#define OPT_FOP "fop-compatible" -#define OPT_PROGRESSBAR "progress" -#define OPT_FILLZEROES "zeroes" -#define OPT_ANSI "ansi" -#define OPT_XML "xml" -#define OPT_ENCODING "encoding" -#define OPT_FORCE_OUTPUT "force" - -#define S_OPT_ANSI 'A' -#define S_OPT_OUT 'o' -#define S_OPT_IN 'i' -#define S_OPT_SYNTAX 'S' -#define S_OPT_VERBOSE 'v' -#define S_OPT_INC_STYLE 'I' -#define S_OPT_HELP 'h' -#define S_OPT_HELPINT 'H' -#define S_OPT_LINENO 'l' -#define S_OPT_STYLE 's' -#define S_OPT_STYLE_OUT 'c' -#define S_OPT_STYLE_IN 'e' -#define S_OPT_DELTABS 't' -#define S_OPT_XHTML 'X' -#define S_OPT_RTF 'R' -#define S_OPT_TEX 'T' -#define S_OPT_LATEX 'L' -#define S_OPT_XSLFO 'Y' -#define S_OPT_XML 'Z' -#define S_OPT_BATCHREC 'B' -#define S_OPT_FRAGMENT 'f' -#define S_OPT_ANCHORS 'a' -#define S_OPT_LISTTHEMES 'w' -#define S_OPT_LISTLANGS 'p' -#define S_OPT_OUTDIR 'O' - -#define S_OPT_FORMATSTYLE 'F' -#define S_OPT_DATADIR 'D' -#define S_OPT_ADDDATADIR 'E' -#define S_OPT_INDEXFILE 'C' -#define S_OPT_WRAP 'W' -#define S_OPT_WRAPSIMPLE 'V' -#define S_OPT_QUIET 'q' -#define S_OPT_FOP 'g' -#define S_OPT_REPLACE_QUOTES 'r' -#define S_OPT_VERSION 'Q' -#define S_OPT_PROGRESSBAR 'P' -#define S_OPT_FILLZEROES 'z' -#define S_OPT_ENCODING 'u' - -// deprecated: -#define OPT_CSSOUT "css-outfile" -#define OPT_CSSIN "css-infile" -#define OPT_INC_CSS "include-css" - - -#define S_OPTIONS_STRING "o:i:S:B:O:s:c:e:t:u:F:D:H:E:afghlvwpqrzACILYRTZXUV::W::P" - -using namespace std; - -/**Command line options*/ - -class CmdLineOptions - { - public: - - /**Constructor - \param argc Argument count - \param argv Argument strings - */ - CmdLineOptions(int argc, char *argv[]); - ~CmdLineOptions(); - - /** \return Single output file name*/ - const string &getSingleOutFilename(); - - /** \return Single input file name*/ - const string &getSingleInFilename() const; - - /** \return Output directory*/ - const string& getOutDirectory() ; - - /** \return Style output file name*/ - const string getStyleOutFilename() const; - - /** \return Style input file name*/ - const string&getStyleInFilename() const; - - /** \return Char set*/ - const string&getCharSet() const; - - /** \return Number of spaces to replace a tab*/ - int getNumberSpaces() const; - - /** \return True if version information should be printed*/ - bool printVersion() const; - - /** \return True if help information should be printed*/ - bool printHelp() const; - - /** \return True if debug information should be printed*/ - bool printDebugInfo()const; - - /** \return True if Style definition should be included in output*/ - bool includeStyleDef() const; - - /** \return True if line numbers should be printed*/ - bool printLineNumbers() const; - - /** \return colour theme name */ - string getStyleName()const ; - - /** gibt true zurck, falls deutsche Hilfe ausgegeben werden soll */ - int helpLanguage() const; - - /** \return True if batch mode is active*/ - bool enableBatchMode() const; - - /** \return True if output shluld be fragmented*/ - bool fragmentOutput() const; - - /** \return output file suffix */ - string getOutFileSuffix() const; - - /** \return True if anchors should be attached to line numbers*/ - bool attachLineAnchors() const; - - /** \return True if list of installed themes should be printed*/ - bool showThemes() const; - - /** \return True if list of installed language definitions should be printed*/ - bool showLangdefs() const; - - /** \return True if loutput directory is given*/ - bool outDirGiven() const; - - /** \return True if refomatting is enabled*/ - bool formattingEnabled(); - - /** \return True if a new data directory is given*/ - bool dataDirGiven()const; - - /** \return True if an additional data directory is given*/ - bool additionalDataDirGiven()const; - - /** \return True if index file should be printed*/ - bool printIndexFile() const; - - /** \return True if quotes should be replaced by /dq in LaTeX*/ - bool replaceQuotes() const; - - /** \return Data directory*/ - const string &getDataDir()const; - - /** \return Additional data directory*/ - const string &getAdditionalDataDir()const; - - /** \return True if language syntax is given*/ - bool syntaxGiven() const; - - /** \return True if quiet mode is active*/ - bool quietMode() const; - - /** \return True if XSL-FO output should be FOP compatible*/ - bool fopCompatible() const; - - /** \return True if progress bar should be printed in batch mode */ - bool printProgress() const; - - /** \return True if line numbers are filled with leading zeroes */ - bool fillLineNrZeroes() const; - - /** \return name of help message file*/ - const string getHelpLang() const; - - /** \return programming language */ - const string &getLanguage()const ; - - /** \return Wrapping style*/ - highlight::WrapMode getWrappingStyle() const; - - /** \return List of input file names*/ - const vector <string> & getInputFileNames() const; - - /** \return Name of indentation scheme file */ - const string &getIndentScheme() const; - - /** \return Output file format */ - highlight::OutputType getOutputType() const; - - /** \return True if chosen output format supports referenced style files */ - bool formatSupportsExtStyle(); - - /** \return True if style output path was defined by user*/ - bool styleOutPathDefined() const{ - return opt_stylepath_explicit; - } - - /** \return True if encoding nasme should be omitted in output*/ - bool omitEncodingName() const; - - /** \return True if output should be generated if languege type is unknown*/ - bool forceOutput() const; - - private: - - int numberSpaces; // number of spaces which replace a tab - highlight::WrapMode wrappingStyle; // line wrapping mode - highlight::OutputType outputType; - - // name of single output file - string outFilename, - // output directory - outDirectory, - // programming language which will be loaded - language, - // name of colour theme - styleName, - // name of external style file - styleOutFilename, - // name of file to be included in external style file - styleInFilename, - // used to define data directories at runtime - dataDir, additionalDataDir; - // name of indenation scheme - string indentScheme; - - bool opt_language; - bool opt_include_style; - bool opt_help; - bool opt_version ; - bool opt_verbose; - bool opt_linenumbers; - bool opt_style; - bool opt_batch_mode; - bool opt_fragment; - bool opt_attach_line_anchors; - bool opt_show_themes; - bool opt_show_langdefs; - bool opt_asformat_output; - bool opt_printindex; - bool opt_quiet; - bool opt_xslfo_fop; - bool opt_replacequotes; - bool opt_print_progress; - bool opt_fill_zeroes; - bool opt_stylepath_explicit; - bool opt_force_output; - - bool configFileRead; - - string helpLang, charset; - string configFilePath; - - // list of all input file names - vector <string> inputFileNames; - - /** load highlight configuration file */ - void loadConfigurationFile(); - - /** \return file suffix */ - string getFileSuffix( const string & fileName) const; - - /** \return directory name of path */ - string getDirName( const string & path); - - /** get all entries in the directory defined by wildcard */ - void readDirectory(const string & wildcard); - - /** \return Boolean value of paramVal */ - bool getFlag(const string& paramVal); - - /** \return Valid path name */ - string validateDirPath(const string & path); - - void printDeprecatedWarning(const char *oldOption, const char *newOption); - }; - -#endif -/*************************************************************************** - codeparser.cpp - description - ------------------- - begin : Die Jul 9 2002 - copyright : (C) 2002 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 "codegenerator.h" - -#include "htmlgenerator.h" -#include "xhtmlgenerator.h" -#include "rtfgenerator.h" -#include "latexgenerator.h" -#include "texgenerator.h" -#include "xslfogenerator.h" -#include "xmlgenerator.h" -#ifndef __WXMSW__ - #include "ansigenerator.h" -#endif - - -using namespace std; - -namespace highlight { - -CodeGenerator* CodeGenerator::generator=NULL; - -CodeGenerator* CodeGenerator::getInstance(OutputType type, - const string& styleInfoPath, - const string& styleInPath, - const string& styleOutPath, - const string& encoding, - bool includeStyle, - bool attachAnchors, - bool replaceQuotes, - bool fopCompatible, - int numSpaces, - WrapMode lineWrappingMode, - bool ln, - bool lnz, - bool fragment, - bool omitEncoding - ) { - if (generator==NULL){ - switch (type){ - case TEX: - generator = new TexGenerator (styleInfoPath); - break; - case LATEX: - generator = new LatexGenerator(styleInfoPath, replaceQuotes); - break; - case RTF: - generator = new RtfGenerator (styleInfoPath); - break; - case XSLFO: - generator = new XslFoGenerator(styleInfoPath, encoding, omitEncoding, - fopCompatible); - break; - case XML: - generator = new XmlGenerator(styleInfoPath,encoding, omitEncoding); - break; - case XHTML: - generator = new XHtmlGenerator(styleInfoPath, encoding, omitEncoding, - attachAnchors); - break; - #ifndef __WXMSW__ - case ANSI: - generator = new AnsiGenerator (styleInfoPath); - break; - #endif - default: - generator = new HtmlGenerator(styleInfoPath, encoding, omitEncoding, - attachAnchors); - } - } - generator->setType(type); - generator->setStyleInputPath(styleInPath); - generator->setStyleOutputPath(styleOutPath); - generator->setIncludeStyle(includeStyle); - generator->setPrintLineNumbers(ln); - generator->setPrintZeroes(lnz); - generator->setFragmentCode(fragment); - generator->setPreformatting(lineWrappingMode, - (generator->getPrintLineNumbers()) ? - MAX_LINE__WIDTH - LINE_NUMBER_WIDTH : MAX_LINE__WIDTH, - numSpaces ); - return generator; -} - -void CodeGenerator::deleteInstance(){ - delete generator; - generator=NULL; -} - - -CodeGenerator::CodeGenerator(): - in(NULL), - out(NULL), - maskWs(false), - excludeWs(false), - fragmentOutput(false), - showLineNumbers (false), - lineNumberFillZeroes(false), - lineNumber(0), - includeStyleDef(false), - lineIndex(0), - formatter(NULL), - preFormatter(NULL), - formattingEnabled(false), - formattingPossible(false), - outputType(highlight::HTML) -{} - -CodeGenerator::CodeGenerator(const string &colourTheme) - :in(NULL), - out(NULL), - maskWs(false), - excludeWs(false), - fragmentOutput(false), - showLineNumbers (false), - lineNumberFillZeroes(false), - lineNumber(0), - includeStyleDef(false), - stylePath(colourTheme), - lineIndex(0), - formatter(NULL), - preFormatter(NULL), - formattingEnabled(false), - formattingPossible(false), - outputType(highlight::HTML) -{ - line.reserve(100); - docStyle.load(stylePath); -} - -CodeGenerator::~CodeGenerator() -{ - delete preFormatter; - delete formatter; -} - - -/** Getter and Setter*/ - -void CodeGenerator::setPrintLineNumbers(bool flag){ - showLineNumbers=flag; -} - -bool CodeGenerator::getPrintLineNumbers(){ - return showLineNumbers; -} - -void CodeGenerator::setPrintZeroes(bool flag){ - lineNumberFillZeroes=flag; -} - -bool CodeGenerator::getPrintZeroes(){ - return lineNumberFillZeroes; -} - -void CodeGenerator::setFragmentCode(bool flag){ - fragmentOutput=flag; -} - -void CodeGenerator::setIncludeStyle(bool flag){ - includeStyleDef = flag; -} - -void CodeGenerator::setStyleInputPath(const string& path){ - styleInputPath = path; -} -void CodeGenerator::setStyleOutputPath(const string& path){ - styleOutputPath = path; -} - -const string& CodeGenerator::getStyleInputPath(){ - return styleInputPath; -} -const string& CodeGenerator::getStyleOutputPath(){ - return styleOutputPath; -} - - -bool CodeGenerator::getFragmentCode(){ - return fragmentOutput; -} - -void CodeGenerator::setStyleName(const string& s){ - stylePath=s; -} - -void CodeGenerator::setType(OutputType t){ - outputType = t; -} - -const string& CodeGenerator::getStyleName(){ - return stylePath; -} - -bool CodeGenerator::formattingDisabled(){ - return !formattingEnabled; -} - -bool CodeGenerator::formattingIsPossible(){ - return formattingPossible; -} - -void CodeGenerator::setPreformatting(WrapMode lineWrappingStyle, - unsigned int lineLength, - int numberSpaces ){ - bool enableWrap = lineWrappingStyle!=WRAP_DISABLED; - bool replaceTabs = numberSpaces > 0; - if (enableWrap || replaceTabs) { - preFormatter=new PreFormatter(enableWrap, replaceTabs); - if (enableWrap) - preFormatter->setWrappingProperties(lineLength, lineWrappingStyle==WRAP_DEFAULT); - if (replaceTabs) - preFormatter->setNumberSpaces(numberSpaces); - } -} - -/* -WrapMode CodeGenerator::getLineWrapping(){ - if (preFormatter==NULL) return WRAP_DISABLED; - return (preFormatter->indentCode()?WRAP_DEFAULT:WRAP_SIMPLE); -} -*/ -LanguageDefinition &CodeGenerator::getLanguage(){ - return langInfo; -} - -void CodeGenerator::reset() -{ - lineIndex = lineNumber = 0; - line.clear(); -} - - -/** sucht vorwaerts ab Position searchPos Ziffer in s und liefert Integerwert -der gefundenen Zahl zurueck. -Im SymbolString stehen die den einzelnen Symbolen zugeordneten Konstanten -immer HINTER diesen Symbolen*/ -State CodeGenerator::getState(const string &s, unsigned int searchPos) -{ - unsigned int i= searchPos+1, result=0; - - // nach Ziffer in s suchen - do { - ++i; - } while ((i<s.length()) && !isdigit(s[i])) ; - - // Zahl zusammensetzen - while ((i<s.length()) && isdigit(s[i])){ - result = result *10 + (s[i]-'0'); - ++i; - } - return ((result)? (State)result:_UNKNOWN); -} - -string CodeGenerator::getIdentifier() -{ - --lineIndex; - unsigned int startPos=lineIndex; - char c= line[lineIndex]; - - while ( ( lineIndex < line.length() - && ( StringTools::isAlpha(c) - || isdigit(c)) - || isAllowedChar(c)) - ) - { - ++lineIndex; - c= line[lineIndex]; - } - return string(line, startPos, lineIndex - startPos); -} - -string CodeGenerator::getNumber() -{ - --lineIndex; - unsigned int startPos=lineIndex; - char c=line[lineIndex]; - - while ( lineIndex < line.length() && ( - isdigit(c) - // don't highlight methods applied on numbers as part of the number - // i.e. Ruby: 3.xxx() - || (c == '.' && isdigit(line[lineIndex+1])) - // '-' is accepted as first character - || (c == '-' && lineIndex == startPos) - || (StringTools::isAlpha(c) && line[lineIndex-1]=='0') - || (isxdigit(c) || c=='L' || c=='U' || c=='l' || c=='u') )) - { - ++lineIndex; - c= line[lineIndex]; - } - return string(line,startPos, lineIndex-startPos); -} - -unsigned int CodeGenerator::getLineNumber() -{ - return lineNumber; -} - -bool CodeGenerator::readNewLine(string &newLine){ - bool eof; - terminatingChar=newLine[lineIndex-1]; - if (formattingPossible && formattingEnabled) - { - eof=!formatter->hasMoreLines(); - if (!eof) - { - newLine = formatter->nextLine(); - } - } - else // reformatting not enabled - { - eof = ! getline( *in, newLine); - } - return eof; -} - -unsigned char CodeGenerator::getInputChar() -{ - bool eol = lineIndex == line.length(); - - if (eol) { - bool eof=false; - if (preFormatter!=NULL){ - if (!preFormatter->hasMoreLines()) { - eof=readNewLine(line); - preFormatter->setLine(line); - } - line = preFormatter->getNextLine(); - } else { - eof=readNewLine(line); - } - lineIndex=0; - ++lineNumber; - line=StringTools::trimRight(line); - return (eof)?'\0':'\n'; - } - return line[lineIndex++]; -} - -State CodeGenerator::getCurrentState (bool lastStateWasNumber) -{ - unsigned char c; - - if (token.length()==0) { - c=getInputChar(); - } else { - lineIndex-= (token.length()-1); - c=token[0]; - } - if (c=='\n'){ - return _EOL; // End of line - } - - if (c=='\0') { - return _EOF; // End of file - } - - if (isspace(c)) { - token= c; - return _WS; - } - - // numbers have to be searched before using the symbolstring, - // as numbers are part of this string - if (isdigit(c) - // recognize floats like .5 - || (c=='.' && isdigit(line[lineIndex])) - // test if '-' belongs to a term like "1-2" - || ((c == '-') - && (!lastStateWasNumber) - && isdigit(StringTools::getNextNonWs(line, lineIndex))) ) - { - token = getNumber(); - return NUMBER; - } - unsigned int symbolLength; - size_t symbolPos; - bool found=false; - string symbols=langInfo.getSymbolString(); - - symbolPos = symbols.find(c); - // search symbols (comment delimiters, directives etc.) - // before keywords, because alphabetic chars may be part of symbols, too - while ((symbolPos!= string::npos) && (!found)) - { - symbolLength=symbols.find(' ', symbolPos)-symbolPos; - token = symbols.substr(symbolPos, symbolLength); - - // TODO Ruby =ende, =end bugfix (whitespace after symbol needs to be checked) - - // Abfrage nach Leerzeichen in SymbolString verhindert falsches - // Erkennen von Symbolteilen: - if (lineIndex && token == line.substr(lineIndex-1, symbolLength) - && isspace(symbols[symbolPos-1]) ) { - found = true; - lineIndex += (symbolLength-1); - } else { - symbolPos = symbols.find_first_not_of(' ',symbols.find(' ',symbolPos)); - } - } - - // dirty workaround stuff in here - if (found) { - State foundState = getState(symbols, symbolPos); - - // get the current keyword class id to apply the corresponding formatting style - if (foundState==KEYWORD_BEGIN || foundState==TAG_BEGIN ) { - currentKeywordClass=langInfo.getDelimPrefixClassID(token); - } - - // Full line quotes must start in coloumn 1 (Fortran 77) - if (langInfo.isFullLineComment() && foundState==SL_COMMENT){ - if (lineIndex==1) { - return SL_COMMENT; - } - } - // VHDL Workaround: distinguish string delimiters and event markers - // (same eymbol: ') - else if (langInfo.isVHDL() - && foundState==STRING && currentState!=STRING - && lineIndex > 1 - &&(isdigit(line[lineIndex-2]) || isalpha(line[lineIndex-2]))){ - c=line[lineIndex-1]; - // do not return, continue search... - } else { - return foundState; - } - } - - // Alphanumerisches Token parsen und als Keyword oder Type erkennen - if (StringTools::isAlpha(c) || langInfo.isPrefix(c) || isAllowedChar(c)) - { - if (langInfo.isPrefix(c)){ - token = c; - ++lineIndex; - token += getIdentifier(); - } else { - token = getIdentifier(); - } - string reservedWord=(langInfo.isIgnoreCase()) ? - StringTools::lowerCase(token):token; - currentKeywordClass=langInfo.isKeyword(reservedWord); - return (currentKeywordClass) ? KEYWORD : STANDARD; - } - - // Character not referring to any state - token = c; - return STANDARD; -} - -string CodeGenerator::maskString(const string & s) -{ - ostringstream ss; - for (unsigned int i=0;i< s.length();i++){ - ss << maskCharacter(s[i]); - } - return ss.str(); -} - -void CodeGenerator::printMaskedToken(bool flushWhiteSpace) -{ - if(flushWhiteSpace) flushWs(); - *out << maskString(token); - token.clear(); -} - -bool CodeGenerator::isAllowedChar(char c) -{ - return ( langInfo.getAllowedChars().find(c)!= string::npos); -} - -bool CodeGenerator::styleFound(){ - return docStyle.found(); -} - -bool CodeGenerator::printIndexFile(const vector<string> &fileList, - const string &outPath){ - return true; -} - -bool CodeGenerator::initIndentationScheme(const string &schemePath){ - - if (formatter!=NULL){ - return true; - } - - ConfigurationReader indentScheme(schemePath); - if (indentScheme.found()){ - if (formatter==NULL) { - formatter=new astyle::ASFormatter(); - - string brackets=indentScheme.getParameter("brackets"); - if (!brackets.empty()){ - // Break brackets from pre-block code (i.e. ANSI C/C++ style). - if (brackets=="break"){ - formatter->setBracketFormatMode(astyle::BREAK_MODE); - } - //Attach brackets to pre-block code (i.e. Java/K&R style). - else if (brackets=="attach"){ - formatter->setBracketFormatMode(astyle::ATTACH_MODE); - } - // Break definition-block brackets and attach command-block brackets. - else if (brackets=="linux"){ - formatter->setBracketFormatMode(astyle::BDAC_MODE); - } - // Break brackets before closing headers (e.g. 'else', 'catch', ..). - // Should be appended to --brackets=attach or --brackets=linux. - else if (brackets=="break-closing-headers"){ - formatter->setBreakClosingHeaderBracketsMode(true); - } - } - - string pad=indentScheme.getParameter("pad"); - if (!pad.empty()){ - //Insert space paddings around parenthesies only. - if (pad=="paren"){ - formatter->setParenthesisPaddingMode(true); - } - // Insert space paddings around operators only. - else if (pad=="oper"){ - formatter->setOperatorPaddingMode(true); - } - //Insert space paddings around operators AND parenthesies. - else if (pad=="all"){ - formatter->setOperatorPaddingMode(true); - formatter->setParenthesisPaddingMode(true); - } - } - - string oneLine=indentScheme.getParameter("one-line"); - if (!oneLine.empty()){ - // Don't break one-line blocks. - if (oneLine=="keep-blocks"){ - formatter->setBreakOneLineBlocksMode(false); - } - // Don't break complex statements and multiple statements residing in a - // single line. - else if (oneLine=="keep-statements"){ - formatter->setSingleStatementsMode(false); - } - } - - // Insert empty lines around unrelated blocks, labels, classes, ... - string breakBlocks=indentScheme.getParameter("break-blocks"); - if (!breakBlocks.empty()){ - if (breakBlocks=="all"){ - //Like --break-blocks, except also insert empty lines around closing - //headers (e.g. 'else', 'catch', ...). - formatter->setBreakClosingHeaderBlocksMode(true); - } - formatter->setBreakBlocksMode(true); - } - string trueVal="true"; - - // Other options... - - //Indent using # spaces per indent. Not specifying # will result in a - //default of 4 spaces per indent. - string indentSpaces=indentScheme.getParameter("indent-spaces"); - - // Indent a minimal # spaces in a continuous conditional belonging to a - //conditional header. - string minConditionalIndent=indentScheme.getParameter("min-conditional-indent"); - - // Indent a maximal # spaces in a continuous statement, relatively to the - // previous line. - string maxInStatementIndent=indentScheme.getParameter("max-instatement-indent"); - - // Add extra indentation to '{' and '}' block brackets. - string indentBrackets=indentScheme.getParameter("indent-brackets"); - - // Add extra indentation entire blocks (including brackets). - string indentBlocks=indentScheme.getParameter("indent-blocks"); - - // Indent the contents of namespace blocks. - string indentNamespaces=indentScheme.getParameter("indent-namespaces"); - - // Indent 'class' blocks, so that the inner 'public:','protected:' and - // 'private: headers are indented inrelation to the class block. - string indentClasses=indentScheme.getParameter("indent-classes"); - - // Indent 'switch' blocks, so that the inner 'case XXX:' headers are - // indented in relation to the switch block. - string indentSwitches=indentScheme.getParameter("indent-switches"); - - // Indent 'case XXX:' lines, so that they are flush with their bodies.. - string indentCases=indentScheme.getParameter("indent-cases"); - - // Indent labels so that they appear one indent less than the current - // indentation level, rather than being flushed completely to the left - // (which is the default). - string indentLabels=indentScheme.getParameter("indent-labels"); - - // Indent multi-line #define statements - string indentPreprocessor=indentScheme.getParameter("indent-preprocessor"); - - // Break 'else if()' statements into two different lines. - string breakElseIfs = indentScheme.getParameter("break-elseifs"); - - string javaStyle = indentScheme.getParameter("java-style"); - - // default values in ASBeautifier are false, it is ok to set them false - // if parameter does not exist in scheme file - formatter->setBracketIndent(indentBrackets==trueVal); - formatter->setBlockIndent(indentBlocks==trueVal); - formatter->setNamespaceIndent(indentNamespaces==trueVal); - formatter->setClassIndent(indentClasses==trueVal); - formatter->setSwitchIndent(indentSwitches==trueVal); - formatter->setCaseIndent(indentCases==trueVal); - formatter->setLabelIndent(indentLabels==trueVal); - formatter->setPreprocessorIndent(indentPreprocessor==trueVal); - formatter->setBreakElseIfsMode(breakElseIfs==trueVal); - - if (javaStyle==trueVal){ - formatter->setJavaStyle(); - } - - if (!indentSpaces.empty()){ - formatter->setSpaceIndentation(StringTools::str2int(indentSpaces)); - } - if (!minConditionalIndent.empty()){ - formatter->setMinConditionalIndentLength( - StringTools::str2int(minConditionalIndent)); - } - if (!maxInStatementIndent.empty()){ - formatter->setMinConditionalIndentLength( - StringTools::str2int(maxInStatementIndent)); - } - } - formattingEnabled=(formatter != NULL); - return true; - } else { - return false; - } -} - -LoadResult CodeGenerator::initLanguage(const string& langDefPath){ - bool reloadNecessary= langInfo.needsReload(langDefPath); - if (reloadNecessary){ - bool failure = !langInfo.load(langDefPath); - - if (failure) { - return LOAD_FAILED; - } - - formattingPossible=langInfo.enableReformatting(); - - if (styleTagOpen.size()>NUMBER_BUILTIN_STYLES){ - // remove dynamic keyword tag delimiters of the old language definition - vector<string>::iterator keyStyleOpenBegin = - styleTagOpen.begin() + NUMBER_BUILTIN_STYLES; - vector<string>::iterator keyStyleCloseBegin = - styleTagClose.begin()+ NUMBER_BUILTIN_STYLES; - styleTagOpen.erase(keyStyleOpenBegin, styleTagOpen.end()); - styleTagClose.erase(keyStyleCloseBegin, styleTagClose.end()); - } - // add new keyword delimiters - for (unsigned int i=0;i< langInfo.getKeywordClasses().size(); i++){ - styleTagOpen.push_back(getMatchingOpenTag(i)); - styleTagClose.push_back(getMatchingCloseTag(i)); - } - } - return (reloadNecessary) ? LOAD_NEW : LOAD_NONE; -} - -ParseError CodeGenerator::printOutput (const string & inFileName, - const string &outFileName) -{ - if (!docStyle.found()) { - return BAD_STYLE; - } - reset(); - - ParseError error=PARSE_OK; - - in = (inFileName.empty()? &cin :new ifstream (inFileName.c_str())); - if (!in->fail()) { - out = (outFileName.empty()? &cout :new ofstream (outFileName.c_str())); - if ( out->fail()) { - error=BAD_OUTPUT; - } - } - - if ( in->fail()){ - error=BAD_INPUT; - } - - if (error==PARSE_OK) { - if (formatter != NULL){ - formatter->init(new astyle::ASStreamIterator(in)); - } - if (! fragmentOutput){ - *out << getHeader(inFileName); - } - printBody(); - if (! fragmentOutput){ - *out << getFooter(); - } - } - - if (!outFileName.empty()){ - delete out; out=NULL; - } - if (!inFileName.empty()) { - delete in; in=NULL; - } - return error; -} - - -unsigned int CodeGenerator::getStyleID(State s, unsigned int kwClassID){ - if (s==KEYWORD && kwClassID){ - return NUMBER_BUILTIN_STYLES + kwClassID-1; - } - return (unsigned int) s ; -} - -void CodeGenerator::closeTag(State s){ - *out << styleTagClose[(unsigned int)s]; - flushWs(); - currentState=_UNKNOWN; -} - -void CodeGenerator::openTag(State s){ - *out << styleTagOpen[(unsigned int)s]; - currentState=s; -} - -void CodeGenerator::closeKWTag(unsigned int kwClassID){ - *out << styleTagClose[getStyleID(KEYWORD, kwClassID)]; - - flushWs(); - currentState=_UNKNOWN; -} - -void CodeGenerator::openKWTag(unsigned int kwClassID){ - *out << styleTagOpen[getStyleID(KEYWORD, kwClassID)]; - currentState=KEYWORD; -} - - -/////////////////////////////////////////////////////////////////////////////// - -void CodeGenerator::processRootState() -{ - if (langInfo.highlightingDisabled()){ - string line; - while (getline(*in, line)){ - *out << maskString(line) << getNewLine(); - } - *out << flush; - return; - } - - State state=STANDARD; - - bool eof=false, - firstLine=true; // avoid newline before printing the first output line - openTag(STANDARD); - do { - // determine next state - state= getCurrentState(state==NUMBER); - // handle current state - switch(state) - { - case KEYWORD: - case KEYWORD_BEGIN: - closeTag(STANDARD); - eof=processKeywordState(state); - openTag(STANDARD); - break; - case NUMBER: - closeTag(STANDARD); - eof=processNumberState(); - openTag(STANDARD); - break; - case ML_COMMENT_BEGIN: - closeTag(STANDARD); - eof=processMultiLineCommentState(); - openTag(STANDARD); - break; - case SL_COMMENT: - closeTag(STANDARD); - eof=processSingleLineCommentState(); - openTag(STANDARD); - break; - case STRING: - closeTag(STANDARD); - eof=processStringState(STANDARD); - openTag(STANDARD); - break; - case DIRECTIVE_LINE: - closeTag(STANDARD); - eof=processDirectiveState(); - openTag(STANDARD); - break; - case TAG_BEGIN: - closeTag(STANDARD); - eof=processTagState(); - openTag(STANDARD); - break; - case ESC_CHAR: - if (langInfo.allowExtEscSeq()){ - closeTag(STANDARD); - eof=processEscapeCharState(); - openTag(STANDARD); - } else { - printMaskedToken(); - } - break; - case SYMBOL: - closeTag(STANDARD); - eof=processSymbolState(); - openTag(STANDARD); - break; - case _EOL: - insertLineNumber(!firstLine); - firstLine=false; - break; - case _EOF: - eof=true; - break; - case _WS: - processWsState(); - break; - default: - printMaskedToken(); - break; - } - } - while (!eof); - closeTag(STANDARD); - *out << getNewLine(); - *out << flush; -} - -bool CodeGenerator::processKeywordState(State myState){ - State newState=STANDARD; - unsigned int myClassID=currentKeywordClass; - bool eof=false, - exitState=false; - - openKWTag(myClassID); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(); - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - insertLineNumber(); - exitState=true; - break; - case _EOF: - eof = true; - break; - case KEYWORD_END: - if (myState==KEYWORD_BEGIN){ - printMaskedToken(); - } - exitState=true; - break; - default: - exitState= myState!=KEYWORD_BEGIN - &&((myClassID!=currentKeywordClass)||(myState!=newState)); - break; - } - } while ((!exitState) && (!eof)); - - closeKWTag(myClassID); - - currentKeywordClass=0; - return eof; -} - -bool CodeGenerator::processNumberState(){ - State newState=STANDARD; - bool eof=false, - exitState=false; - - openTag(NUMBER); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(true); - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - insertLineNumber(); - exitState=true; - break; - case _EOF: - eof = true; - break; - default: - exitState=newState!=NUMBER; - break; - } - } while ((!exitState) && (!eof)); - - closeTag(NUMBER); - return eof; -} - -bool CodeGenerator::processMultiLineCommentState() -{ - int commentCount=1; - State newState=STANDARD; - bool eof=false, exitState=false; - - openTag(ML_COMMENT_BEGIN); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(); - - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - wsBuffer += styleTagClose[ML_COMMENT_BEGIN]; - insertLineNumber(); - wsBuffer += styleTagOpen[ML_COMMENT_BEGIN]; - break; - case _EOF: - eof = true; - break; - case ML_COMMENT_BEGIN: - if (langInfo.allowNestedMLComments()) { - ++commentCount; - } - break; - case ML_COMMENT_END: - commentCount--; - if (!commentCount){ - printMaskedToken(); - exitState=true; - } - break; - default: - break; - } - } while ((!exitState) && (!eof)); - - closeTag(ML_COMMENT_BEGIN); - return eof; -} - -bool CodeGenerator::processSingleLineCommentState() -{ - - //if ( checkSpecialCmd()) return false; - - State newState=STANDARD; - bool eof=false, exitState=false; - - openTag(SL_COMMENT); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(); - - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - printMaskedToken(); - insertLineNumber(); - exitState=true; - break; - case _EOF: - eof = true; - break; - default: - break; - } - } while ((!exitState) && (!eof)); - - closeTag(SL_COMMENT); - return eof; -} - -bool CodeGenerator::processDirectiveState() -{ - State newState=STANDARD; - bool eof=false, exitState=false; - - openTag(DIRECTIVE_LINE); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(); - switch(newState) - { - case _WS: - processWsState(); - break; - case DIRECTIVE_LINE_END: - printMaskedToken(); - exitState=true; - break; - case _EOL: - printMaskedToken(); - exitState=(terminatingChar!=langInfo.getContinuationChar()); - if (!exitState) wsBuffer += styleTagClose[DIRECTIVE_LINE]; - insertLineNumber(); - if (!exitState) wsBuffer += styleTagOpen[DIRECTIVE_LINE]; - break; - case ML_COMMENT_BEGIN: - closeTag(DIRECTIVE_LINE); - eof= processMultiLineCommentState(); - openTag(DIRECTIVE_LINE); - break; - case SL_COMMENT: - closeTag(DIRECTIVE_LINE); - eof= processSingleLineCommentState(); - openTag(DIRECTIVE_LINE); - exitState=true; - break; - case STRING: - closeTag(DIRECTIVE_LINE); - eof=processStringState(DIRECTIVE_LINE); - openTag(DIRECTIVE_LINE); - break; - case _EOF: - eof = true; - break; - default: - break; - } - } while ((!exitState) && (!eof)); - - closeTag(DIRECTIVE_LINE); - return eof; -} - -bool CodeGenerator::processStringState(State oldState) -{ - State newState=STANDARD; - bool eof=false, exitState=false; - bool returnedFromOtherState=false; - // Test if character before string open delimiter token equals to the - // raw string prefix (Example: r" ", r""" """ in Python) - bool isRawString= - line[lineIndex-token.length()-1]==langInfo.getRawStringPrefix(); - - string openStringDelimiter=token; - - State myState= (oldState==DIRECTIVE_LINE) ? DIRECTIVE_STRING : STRING; - openTag(myState); - do { - // true if last token was an escape char - if (!returnedFromOtherState) { - printMaskedToken(newState!=_WS); - } - returnedFromOtherState=false; - newState= getCurrentState(); - - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - wsBuffer += styleTagClose[myState]; - insertLineNumber(); - wsBuffer += styleTagOpen[myState]; - //exitState=true; - break; - case ML_COMMENT_END: - printMaskedToken(); - break; - case STRING: - exitState= openStringDelimiter==token; - printMaskedToken(); - break; - case ESC_CHAR: - if (!isRawString){ - closeTag(myState); - eof=processEscapeCharState(); - openTag(myState); - returnedFromOtherState=true; - } - break; - case _EOF: - eof = true; - break; - default: - printMaskedToken(); - break; - } - } while ((!exitState) && (!eof)); - - closeTag(myState); - return eof; -} - -bool CodeGenerator::processTagState() -{ - State newState=STANDARD; - bool eof=false, exitState=false, returnedFromOtherState=false; - unsigned int myKeywordClass=currentKeywordClass; - - openTag(KEYWORD); - do { - if (!returnedFromOtherState) { - printMaskedToken(newState!=_WS); - } - returnedFromOtherState = false; - newState= getCurrentState(); - - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - insertLineNumber(); - exitState=true; - break; - case TAG_END: - printMaskedToken(); - exitState=true; - break; - case STRING: - closeTag(KEYWORD); - eof=processStringState(KEYWORD); - currentKeywordClass=myKeywordClass; - openTag(KEYWORD); - returnedFromOtherState = true; - break; - case ESC_CHAR: - closeTag(KEYWORD); - eof=processEscapeCharState(); - currentKeywordClass=myKeywordClass; - openTag(KEYWORD); - returnedFromOtherState = true; - break; - case NUMBER: - closeTag(KEYWORD); - eof=processNumberState(); - currentKeywordClass=myKeywordClass; - openTag(KEYWORD); - returnedFromOtherState = true; - break; - case _EOF: - eof = true; - break; - default: - printMaskedToken(); - break; - } - } while ((!exitState) && (!eof)); - - closeTag(KEYWORD); - currentKeywordClass=0; - - return eof; -} - -bool CodeGenerator::processSymbolState(){ - - State newState=STANDARD; - bool eof=false, - exitState=false; - - openTag(SYMBOL); - do { - printMaskedToken(newState!=_WS); - newState= getCurrentState(true); - switch(newState) - { - case _WS: - processWsState(); - break; - case _EOL: - insertLineNumber(); - exitState=true; - break; - case _EOF: - eof = true; - break; - default: - exitState=newState!=SYMBOL; - break; - } - } while ((!exitState) && (!eof)); - - closeTag(SYMBOL); - return eof; -} - -bool CodeGenerator::processEscapeCharState() -{ - State newState=STANDARD; - bool eof=false, exitState=false; - - openTag(ESC_CHAR); - do { - printMaskedToken(newState!=_WS); - skipEscapeSequence(); - newState= getCurrentState(); - switch(newState) - { - case _EOL: - insertLineNumber(); - exitState=true; - break; - case _WS: - processWsState(); - --lineIndex; - break; - case _EOF: - eof = true; - break; - default: - exitState=newState!=ESC_CHAR; - break; - } - } while ((!exitState) && (!eof)); - - closeTag(ESC_CHAR); - return eof; -} - -void CodeGenerator::skipEscapeSequence(){ - if (lineIndex<line.length()){ - char c=line[lineIndex]; - int charsToSkip=1; - // Escape Sequenz /ooo Oktal, /x000 hex, /u00xx Java unicode - if (isdigit(c) ){ - // \0 abfangen - while ( isdigit(line[lineIndex+charsToSkip]) && charsToSkip<4) { - ++charsToSkip; - } - } else if (tolower(c)=='x'){ - charsToSkip=langInfo.isJava() ? 4 : 3; - } else if (tolower(c)=='u'){ - charsToSkip=5; - } - while (charsToSkip-- && lineIndex++<line.length()){ - *out <<maskCharacter(line[lineIndex-1]); - } - } -} - - -void CodeGenerator::processWsState() -{ - if (!maskWs) { - wsBuffer += token; - token.clear(); - return; - } - flushWs(); - int cntWs=0; - lineIndex--; - - while (isspace(line[lineIndex]) ) { - ++cntWs; - ++lineIndex; - } - - if (cntWs>1) { - unsigned int styleID=getStyleID(currentState, currentKeywordClass); - if (excludeWs && styleID!=_UNKNOWN) { - *out << styleTagClose[styleID]; - } - *out << maskWsBegin; - for (int i=0; i<cntWs; i++){ - *out << spacer; - } - *out << maskWsEnd; - if (excludeWs && styleID!=_UNKNOWN){ - *out << styleTagOpen[styleID]; - } - } else { - *out << token; - } - token.clear(); -} - -void CodeGenerator::flushWs(){ - *out<<wsBuffer; - wsBuffer.clear(); -} - -bool CodeGenerator::isFirstNonWsChar() { - unsigned int i=lineIndex-1; - while (i--){ - if (!isspace(line[i])){ - return false; - } - } - return true; -} - -string CodeGenerator::getNewLine(){ - return newLineTag; -} - -void CodeGenerator::insertLineNumber(bool insertNewLine) { - if (insertNewLine){ - wsBuffer += getNewLine(); - } - if (showLineNumbers) { - ostringstream os; - ostringstream numberPrefix; - if (lineNumberFillZeroes) { - os.fill('0'); - } - os <<setw(LINE_NUMBER_WIDTH) << right << lineNumber; - - numberPrefix << styleTagOpen[LINENUMBER] - << maskString(os.str()) << spacer - << styleTagClose[LINENUMBER]; - - wsBuffer += numberPrefix.str(); - } -} - -unsigned int CodeGenerator::getLineIndex(){ - return lineIndex; -} - -bool CodeGenerator::printExternalStyle(const string &outFile) -{ - if (!includeStyleDef && langInfo.getSyntaxHighlight()) { - ofstream cssOutFile(outFile.c_str()); - if (cssOutFile) { - cssOutFile << styleCommentOpen - <<" Style definition file generated by highlight " - << HIGHLIGHT_VERSION << ", " << HIGHLIGHT_URL - << " " << styleCommentClose << "\n"; - cssOutFile << "\n"<<styleCommentOpen<<" Highlighting theme definition: " - << styleCommentClose << "\n\n" - << getStyleDefinition() - << "\n"; - cssOutFile << readUserStyleDef(); - cssOutFile.close(); - } else { - return false; - } - } - return true; -} - -string CodeGenerator::readUserStyleDef(){ - ostringstream ostr; - if (!styleInputPath.empty()){ - ifstream userStyleDef(styleInputPath.c_str()); - if (userStyleDef) { - ostr << "\n"<<styleCommentOpen<<" Content of "<<styleInputPath<<": "<<styleCommentClose<<"\n"; - string line; - while (getline(userStyleDef, line)){ - ostr << line << "\n"; - } - userStyleDef.close(); - } else { - ostr << styleCommentOpen<<" ERROR: Could not include " - << styleInputPath - << "."<<styleCommentClose<<"\n"; - } - } - return ostr.str(); -} - -bool CodeGenerator::checkSpecialCmd(){ - bool insertNL = (lineIndex-token.length()); - cerr << "token: "<<token<< " index"<< lineIndex << " "<<line [ lineIndex ]<<endl; - - if (line [ lineIndex ]=='!'){ - // find cmd - size_t cmdPos1 = line.find('@', lineIndex+1); - - cerr << "cmdPos"<<cmdPos1<<endl; - if(cmdPos1==string::npos) return false; - size_t cmdPos2=cmdPos1+1; - while (cmdPos2 < line.length() && StringTools::isAlpha(line[cmdPos2])) cmdPos2++; - cerr << "cmdPos2"<<cmdPos2<<endl; - cerr << line.substr(cmdPos1, cmdPos2)<<endl; - - // hide comment line - token.clear(); - lineIndex=line.length(); - getInputChar(); lineNumber--; - if (insertNL) { lineNumber++;insertLineNumber();}; - // end hide - - return true; - } - - return false; -} - -} -/*************************************************************************** - codeparser.h - description - ------------------- - begin : Die Jul 9 2002 - copyright : (C) 2002 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 CODEPARSER_H -#define CODEPARSER_H - -#include <iostream> -#include <sstream> -#include <string> -#include <iomanip> -#include <cctype> - -#include "languagedefinition.h" -#include "documentstyle.h" -#include "ASFormatter.h" -#include "preformatter.h" -#include "enums.h" - - -#define NUMBER_BUILTIN_STYLES 10 -#define LINE_NUMBER_WIDTH 5 -#define MAX_LINE__WIDTH 80 - -#define OUTPUT_FLAG_LN 1 -#define OUTPUT_FLAG_LNZ 2 -#define OUTPUT_FLAG_FRAG 4 - -/** The highlight namespace contains all classes and data structures - needed for parsing input data. -*/ -namespace highlight { - -/** \brief Base class for parsing. Works similar to a Turing machine. - - The virtual class provides source code parsing functioality, based on - information stored in language definitions.<br> - Deriving classes have to define the output format.<br> - Codegenerator is a singleton class. - -* @author Andre Simon -*/ - -class CodeGenerator - { - - public: - - virtual ~CodeGenerator(); - - /** - Get appropriate Codegenerator instance - \param type Output file type (HTML, XHTML, RTF, LATEX, TEX, XSLFO, ANSI) - \param styleInfoPath Path to formatting style information - \param styleInPath Path to style definition input file (to be included in styleOutPath) - \param styleOutPath Path to style definition output file (CSS path for HTML output) - \param encoding Output file encoding name - \param includeStyle Switch to include style information in output file (only XHTML, HTML) - \param attachAnchors Switch to attach anchors to line numbers (only XHTML, HTML) - \param replaceQuotes Switch to replace quotes by \dq{} (only LATEX) - \param fopCompatible Switch to generate FO for Apache FOP (only XSLFO) - \param omitEncoding Switch to omit encoding info in output document - \param ln Set true if line numbers should be printed - \param lnz Set true if leading space of line numbers should be filled with 0's - \param fragment Set true if document header and footer should be omitted - \param numSpaces Number of spaces which replace a tab - \param lineWrappingMode Line wrapping mode - */ - static CodeGenerator* getInstance(OutputType type, - const string& styleInfoPath, - const string& styleInPath, - const string& styleOutPath, - const string& encoding, - bool includeStyle, - bool attachAnchors, - bool replaceQuotes, - bool fopCompatible, - int numSpaces, - WrapMode lineWrappingMode, - bool ln, - bool lnz, - bool fragment, - bool omitEncoding ); - - /** Deletes the singleton CodeGenerator instance. - Call this method if getInstance was already called, or if you want to - free the momory after usage.*/ - static void deleteInstance(); - - /** - Generates output - \param inFileName Path of input file (if empty use stdin) - \param outFileName Path of input file (if empty use stdout) - - \return ParseError - */ - ParseError printOutput(const string &inFileName, const string &outFileName); - - /** \return True if document style was found */ - bool styleFound(); - - /** \return True if reformatting of current input is disabled */ - bool formattingDisabled(); - - /** \return True if reformatting of current input is possible */ - bool formattingIsPossible(); - - /** \param langDefPath Absolute path to language definition - \return Failure: LOAD_FAILED; Reload necessary: LOAD_NEW, - no reload necessary: LOAD_NONE */ - LoadResult initLanguage(const string& langDefPath); - - /** \return Language definition*/ - LanguageDefinition &getLanguage(); - - /** tell parser to output line numbers - \param flag true if line numbers should be printed - */ - void setPrintLineNumbers(bool flag); - - /** \return line number flag */ - bool getPrintLineNumbers(); - - - /** tell parser to output line numbers filled with zeroes - \param flag true if zeroes should be printed - */ - void setPrintZeroes(bool flag); - - /** \return print zeroes flag */ - bool getPrintZeroes(); - - /** tell parser to omit document header and footer - \param flag true if output should be fragmented - */ - void setFragmentCode(bool flag); - - /** \return fragment flag */ - bool getFragmentCode(); - - /** tell parser the style name - \param s path to style definition - */ - void setStyleName(const string& s); - - /** \return style path */ - const string& getStyleName(); - - /** tell parser the wrapping mode - \param lineWrappingStyle wrapping style - \param lineLength max line length - \param numberSpaces number of spaces which replace a tab - */ - void setPreformatting(WrapMode lineWrappingStyle, unsigned int lineLength,int numberSpaces); - - /** \return wrapping style */ - WrapMode getLineWrapping(); - - /** tell parser the include style definition in output - \param flag true if style should be included - */ - void setIncludeStyle(bool flag); - - /** Print style definitions to external file - \param outFile Path of external style definition - */ - bool printExternalStyle(const string &outFile); - - /** Print index file with all input file names - \param fileList List of output file names - \param outPath Output path - */ - virtual bool printIndexFile(const vector<string> & fileList, - const string &outPath); - - /** initialize source code indentation - \param indentSchemePath Path of indentation scheme - \return true id successfull - */ - bool initIndentationScheme(const string&indentSchemePath); - - /** Set style input path - \param s path to style input file - */ - void setStyleInputPath(const string& path); - - /** Set style output path - \param s path to style output file - */ - void setStyleOutputPath(const string& path); - -/** Set output type - \param s output type - */ - void setType(OutputType t); - - /** - \return style input file path - */ - const string& getStyleInputPath(); - - /** - \return style output file path - */ - const string& getStyleOutputPath(); - -protected: - - CodeGenerator(); - - //! CodeGenerator Constructor - /** - \param colourTheme Name of coloring style being used - */ - CodeGenerator(const string &colourTheme); - - /** \param c Character to be masked - \return Escape sequence of output format */ - virtual string maskCharacter(unsigned char c) = 0; - - /** \param s string - \return Copy of s with all escaped characters */ - string maskString(const string &s ) ; - - /** \param s Symbol string - \param searchPos Position where search starts - \return Found state (integer value) */ - State getState(const string &s, unsigned int searchPos); - - /** \return Next identifier in current line of code */ - string getIdentifier(); - - /** \return Next number in current line of code */ - string getNumber(); - - /** Insert line number at the beginning of current output line */ - virtual void insertLineNumber(bool insertNewLine=true); - - /** Prints document footer*/ - virtual string getFooter() = 0; - - /** Prints document body*/ - virtual void printBody() = 0; - - /** prints document header - \param title Title of the document - */ - virtual string getHeader(const string &title) = 0; - - /** Get current line number - \return line number */ - unsigned int getLineNumber(); - - - /** Tag Delimiters for every colour style*/ - vector <string> styleTagOpen, styleTagClose; - - /** Description of document colour style*/ - DocumentStyle docStyle; - - /** Language definition*/ - LanguageDefinition langInfo; - - /** Tag for inserting line feeds*/ - string newLineTag; - - /** String that represents a white space in output */ - string spacer; - - /** file input*/ - istream *in; - - /** file output*/ - ostream *out; - - /** Tags which enclose white space indentation blocks */ - string maskWsBegin, maskWsEnd; - - /** Style comment delimiters */ - string styleCommentOpen, styleCommentClose; - - /** Test if maskWsBegin and maskWsEnd should be applied */ - bool maskWs; - - /** Test if whitespace sould always be separated from enclosing tokens */ - bool excludeWs; - - /** Test if header and footer should be omitted */ - bool fragmentOutput; - - /** Test if line numbers should be printed */ - bool showLineNumbers; - - /** Test if leading spyce of line number should be filled with zeroes*/ - bool lineNumberFillZeroes; - - /** Current line of input file*/ - string line; - - /** Current line number */ - unsigned int lineNumber; - - // Zeigt den aktuellen Zustand an - // wird nicht in getCurrentState gesetzt, da nur Zustände interessant - // sind, die als Index auf die styleCloseTags und styleOpenTags verwendet - // werden können - /** Current state*/ - State currentState; - - /** keyword class id, used to apply the corresponding keyword style*/ - unsigned int currentKeywordClass; - - /** Processes origin state */ - void processRootState(); - - /** return line break sequence */ - virtual string getNewLine(); - - /** - \param s current state - \return Index of style tag corresponding to the states - */ - unsigned int getStyleID(State s, unsigned int kwClassID = 0); - - /** \return line index */ - unsigned int getLineIndex(); - - /** print all remaining white space*/ - void flushWs(); - - /** - \return Content of user defined input style - */ - string readUserStyleDef(); - - /** - \return Style definition of the chosen output format - */ - virtual string getStyleDefinition() {return "";}; - - /** contains white space, which will be printed after a closing tag */ - string wsBuffer; - - /** - Flag to test if style definition should be included in output document - */ - bool includeStyleDef; - -private: - - CodeGenerator(const CodeGenerator&){} - CodeGenerator& operator=(CodeGenerator&){ return *this;} - - static CodeGenerator* generator; - - /** return matching open and close tags of the given state */ - virtual string getMatchingOpenTag(unsigned int) = 0; - virtual string getMatchingCloseTag(unsigned int) = 0; - - /** open a new tag, set current state to s*/ - void openTag(State s); - - /** close opened tag, clear current state */ - void closeTag(State s); - - void closeTag(unsigned int styleID); - - void openTag(unsigned int styleID); - - // path to style definition file - string stylePath; - - // contains current position in line - unsigned int lineIndex; - - /**last character of the last line*/ - unsigned char terminatingChar; - - /** Class for reformatting */ - astyle::ASFormatter *formatter; - - /** Class for line wrapping and tab replacement*/ - PreFormatter *preFormatter; - - /** Flag to test if formatting is enabled with current input document*/ - bool formattingEnabled; - - - /** Flag to test if formatting is possible with current input document*/ - bool formattingPossible; - - /** contains the current token*/ - string token; - - string styleInputPath, styleOutputPath; - - /** Resets parser to origin state, call this after every file conversion */ - void reset(); - - /** read new line from in stream */ - bool readNewLine(string &newLine); - - /** return next character from in stream */ - unsigned char getInputChar(); - - OutputType outputType; - - /** return new state */ - State getCurrentState ( bool lastStateWasNumber=false); - - /** Methods that represent a parsing state */ - bool processKeywordState(State myState) ; - bool processNumberState() ; - bool processMultiLineCommentState(); - bool processSingleLineCommentState(); - bool processStringState(State oldState); - bool processEscapeCharState(); - bool processDirectiveState(); - bool processTagState(); - bool processSymbolState(); - void processWsState(); - - /** gibt true zurck, falls c ein erlaubter Character innerhalb von Keyword - oder Typbezeichner ist */ - bool isAllowedChar(char c) ; - - /** returns true if curret token is the first in line and no whitespace */ - bool isFirstNonWsChar() ; - - /** print escaped token and clears it */ - void printMaskedToken(bool flushWhiteSpace=true); - - /** print escape sequence */ - void skipEscapeSequence(); - - void closeKWTag(unsigned int styleID); - void openKWTag(unsigned int styleID); - - /** look for special commands in comments, take action in derived class - \return true if command was found - */ - bool checkSpecialCmd(); - - }; -} - -#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. - */ - - - - - -/* - * comment out the line below if your compiler does NOT understand NAMESPACES - */ -#define USES_NAMESPACE - - -#if defined(__GNUC__) && __GNUC__ < 3 -// for G++ implementation of string.compare: -#define COMPARE(place, length, str) compare((str), (place), (length)) -#else -// for standard implementation of string.compare: -#define COMPARE(place, length, str) compare((place), (length), (str)) -#endif - - -// Fix by John A. McNamara -// Get rid of annoying MSVC warnings on debug builds about lengths of -// identifiers in template instantiations. -#ifdef _MSC_VER -#pragma warning( disable:4786 ) -#endif - -/*************************************************************************** - configurationreader.cpp - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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 "configurationreader.h" - -using namespace std; - -ConfigurationReader::ConfigurationReader(const string & configuration_path) -{ - ifstream in (configuration_path.c_str()); - fileFound=in; - if (fileFound) { - string line; - line.reserve(500); - unsigned int lineBegin; - size_t delimPos; - string paramName, paramValue; - while (getline(in, line)) { - lineBegin=line.find_first_not_of("\t "); - if ((line.size()>2) && (lineBegin!=string::npos) - && (line.at(lineBegin)!='#')) { //comment? - if (line[lineBegin]=='$') { // neuer Parametername? - delimPos=line.find("=",lineBegin)-1; - if (delimPos!=string::npos) { - paramName=StringTools::trimRight( - StringTools::lowerCase(line.substr(lineBegin+1, delimPos))); - parameterNames.push_back(paramName); - paramValue=line.substr(delimPos+2, line.length()); - } - } else { // line belongs to last parameter - paramValue=line; - } - if (parameterMap[paramName].empty()) { - parameterMap[paramName] = paramValue; - } else { - parameterMap[paramName]+= (" "+paramValue); - } - } //if ((lineBegin!=string::npos) && (line.at(lineBegin)!='#')) - } //while - in.close(); - } //if (in) -} - -ConfigurationReader::~ConfigurationReader() -{ -} - -bool ConfigurationReader::found() -{ - return fileFound; -} - -string &ConfigurationReader::getParameter(const string & paramName) -{ - return parameterMap[paramName] ; -} - -const char* ConfigurationReader::getCParameter(const string & paramName) -{ - return parameterMap[paramName].c_str() ; -} - -vector<string> &ConfigurationReader::getParameterNames() -{ - return parameterNames; -} -/*************************************************************************** - configurationreader.h - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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. * - * * - ***************************************************************************/ - -#ifndef CONFIGURATIONREADER_H -#define CONFIGURATIONREADER_H - -#include <string> -#include <sstream> -#include <map> -#include <iostream> -#include <fstream> -#include <vector> - -#include "stringtools.h" - -using namespace std; - -/** Maps parameter keys to values*/ -typedef map<string, string> ParameterMap; - - -/** \brief Class to handle ASCII config files - - Configuration file format:<br> - $ParamName=ParamValue<br> - ParamValue may be splittet over multiple lines<br> - ParamName is not case sensitive<br> - Comments start with # as the first character of a line - - **/ - -class ConfigurationReader - { - public: - /** Constructor - \param configuration_path Path to configuration file - */ - ConfigurationReader(const string & configuration_path); - ~ConfigurationReader(); - - /** \param paramName Name of parameter - \return Value of parameter */ - string &getParameter(const string & paramName); - - /** \param paramName Name of parameter - \return Value of parameter */ - const char* getCParameter(const string & paramName); - - /** \return True if config file exists */ - bool found(); - - /** \return List of parameter names */ - vector<string> &getParameterNames(); - - private: - ParameterMap parameterMap; - bool fileFound; - vector<string> parameterNames; - }; - -#endif -/*************************************************************************** - dataDir.cpp - description - ------------------- - begin : Sam Mďż˝ 1 2003 - copyright : (C) 2003 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 "datadir.h" - -using namespace std; - -bool DataDir::searchDataDir(const string &userDefinedDir){ -#ifndef _WIN32 - - bool found = false; - //falls kein Datenverzeichnis angegeben, startIndex auf 1 setzen - int searchStartIndex=(userDefinedDir.empty()); - - string possibleDirs[] ={ userDefinedDir, - #ifdef HL_DATA_DIR - HL_DATA_DIR, - #endif - "/usr/share/highlight/" - }; - - for (int i=searchStartIndex;i< - #ifdef HL_DATA_DIR - 3 - #else - 2 - #endif - ;i++) - { - if (fileExists(possibleDirs[i])) - { - dataDir=possibleDirs[i]; - found = true; - } - if (found) { - break; - } - else { - if (!searchStartIndex) - cerr << "highlight: directory " - << userDefinedDir - << " specified by data-dir option not found.\n" - << " Searching another standard directory.\n"; - - } - } - return found; -#else - dataDir=userDefinedDir; - return true; -#endif - -} - -DataDir::DataDir() -{ -} - -void DataDir::setAdditionalDataDir(const string& dir){ - additionalDataDir=dir; -} - -const string &DataDir::getDir() -{ - return dataDir; -} - -const string DataDir::getLangDefDir() -{ - return dataDir+"langDefs"+Platform::pathSeparator; -} - -const string DataDir::getThemeDir() -{ - return dataDir+"themes"+Platform::pathSeparator; -} - -const string DataDir::getIndentSchemesDir() -{ - return dataDir+"indentSchemes"+Platform::pathSeparator; -} - - -const string DataDir::getAdditionalLangDefDir() -{ - return additionalDataDir+"langDefs"+Platform::pathSeparator; -} - -const string DataDir::getAdditionalThemeDir() -{ - return additionalDataDir+"themes"+Platform::pathSeparator; -} -const string DataDir::getAdditionalIndentSchemesDir() -{ - return additionalDataDir+"indentSchemes"+Platform::pathSeparator; -} - - -const string DataDir::getHelpMsgDir() -{ - return dataDir+"helpmsg"+Platform::pathSeparator; -} - -const string DataDir::searchForLangDef(const string & langDef){ - if (!additionalDataDir.empty()){ - string path=getAdditionalLangDefDir()+langDef; - if (fileExists(path)){ - return path; - } - } - return getLangDefDir()+langDef; -} - -const string DataDir::searchForTheme(const string & theme){ - if (!additionalDataDir.empty()){ - string path=getAdditionalThemeDir()+theme; - if (fileExists(path)){ - return path; - } - } - return getThemeDir()+theme; -} - -const string DataDir::searchForIndentScheme(const string & scheme){ - if (!additionalDataDir.empty()){ - string path=getAdditionalIndentSchemesDir()+scheme; - if (fileExists(path)){ - return path; - } - } - return getIndentSchemesDir()+scheme; -} - - -bool DataDir::fileExists(const string&f){ - ifstream file(f.c_str()); - bool exists=!file.fail(); - file.close(); - return exists; -} -/*************************************************************************** - datadir.h - description - ------------------- - begin : Sam Mďż˝ 1 2003 - copyright : (C) 2003 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 DATADIR_H -#define DATADIR_H - -#include <string> -#include <fstream> -#include <iostream> -//#include "stringtools.h" -#include "platform_fs.h" - -using namespace std; - - /** \brief Manages access to installation directories. - - Apart from the standard installation directory, one can define additional - search paths. - **/ - -class DataDir - { - string dataDir; - string additionalDataDir; - bool fileExists(const string&f); - - public: - - DataDir(); - - /** search for a valid installation directory - \param userDefinedDir Directory defined by user - \return True if directory was found */ - bool searchDataDir(const string &userDefinedDir); - - /** add another installation directory, which is added to search path - \param dir Directory defined by user */ - void setAdditionalDataDir(const string& dir); - - /** \return Data installation directory */ - const string & getDir() ; - - /** \return Location of languafe definitions */ - const string getLangDefDir() ; - - /** \return Location of themes */ - const string getThemeDir() ; - - /** \return Location of indentation schemes */ - const string getIndentSchemesDir(); - - /** \return User defined location of indentation schemes */ - const string getAdditionalIndentSchemesDir(); - - /** \return User defined location of languafe definitions */ - const string getAdditionalLangDefDir() ; - - /** \return User defined location of themes */ - const string getAdditionalThemeDir() ; - - /** \return Location of help files */ - const string getHelpMsgDir() ; - - /** \param langDef Name of language definition - \return Absolute path of definiton found in a data directory */ - const string searchForLangDef(const string & langDef); - - /** \param theme Name of colour theme file - \return Absolute path of theme found in a data directory */ - const string searchForTheme(const string & theme); - - /** \param scheme Name of indent scheme file - \return Absolute path of theme found in a data directory */ - const string searchForIndentScheme(const string & scheme); - }; - -#endif -/*************************************************************************** - documentstyle.cpp - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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. * - * * - ***************************************************************************/ - -#include "documentstyle.h" - -namespace highlight { - -DocumentStyle::DocumentStyle(const string &styleDefinitionFile) -{ - fileFound=load(styleDefinitionFile); -} -DocumentStyle::DocumentStyle():fileFound(false) -{} - -bool DocumentStyle::load(const string &styleDefinitionPath) -{ - ConfigurationReader styleConfig(styleDefinitionPath); - if (styleConfig.found()){ - fontsize = styleConfig.getParameter("fontsize"); - bgColour.setRGBValues(styleConfig.getParameter("bgcolour")); - defaultElem.set(styleConfig.getParameter("defaultcolour")); - comment.set(styleConfig.getParameter("comment")); - directive.set(styleConfig.getParameter("directive")); - str.set(styleConfig.getParameter("string")); - escapeChar.set(styleConfig.getParameter("escapechar")); - number.set(styleConfig.getParameter("number")); - dstr.set(styleConfig.getParameter("string_directive")); - line.set(styleConfig.getParameter("line")); - - - string tmpstr; - // TODO: Remove this check as soon as all themes have a brackets attribute - tmpstr=styleConfig.getParameter("symbol"); - if (tmpstr.empty()) { - tmpstr=styleConfig.getParameter("defaultcolour"); - } - symbol.set(tmpstr); - -// TODO: Remove this check as soon as all themes have a sl-comment attribute - tmpstr=styleConfig.getParameter("sl-comment"); - if (tmpstr.empty()) { - tmpstr=styleConfig.getParameter("comment"); - } - slcomment.set(tmpstr); - - string paramVal; - vector<string> paramNames=styleConfig.getParameterNames(); - - //collect keyword classes, save corresponding style definition - for (unsigned int i=0;i<paramNames.size();i++){ - paramVal=paramNames[i]; - if (paramVal.find("kw_class") != string::npos){ - keywordStyles.insert(make_pair(StringTools::getParantheseVal(paramVal), - new ElementStyle(styleConfig.getParameter(paramVal)))); - } - } - - fileFound = true; - } - else { - fileFound = false; - } - return fileFound; -} - -DocumentStyle::~DocumentStyle() -{ - for(KSIterator iter = keywordStyles.begin(); iter != keywordStyles.end(); iter++){ - delete (*iter).second; //remove ElementStyle* - } -} - -string& DocumentStyle::getFontSize() - { - return fontsize; - } -StyleColour& DocumentStyle::getBgColour() - { - return bgColour; - } -ElementStyle& DocumentStyle::getDefaultStyle() - { - return defaultElem; - } -ElementStyle& DocumentStyle::getCommentStyle() - { - return comment; - } -ElementStyle& DocumentStyle::getSingleLineCommentStyle() - { - return slcomment; - } - - -ElementStyle& DocumentStyle::getStringStyle() - { - return str; - } -ElementStyle& DocumentStyle::getDirectiveStringStyle() - { - return dstr; - } -ElementStyle& DocumentStyle::getEscapeCharStyle() - { - return escapeChar; - } -ElementStyle& DocumentStyle::getNumberStyle() - { - return number; - } -ElementStyle& DocumentStyle::getDirectiveStyle() - { - return directive; - } -ElementStyle& DocumentStyle::getLineStyle() - { - return line; - } -ElementStyle& DocumentStyle::getSymbolStyle() - { - return symbol; - } -bool DocumentStyle::found () const - { - return fileFound; - } -ElementStyle& DocumentStyle::getKeywordStyle(const string &className){ - if (!keywordStyles.count(className)) return defaultElem; - return *keywordStyles[className]; -} - -vector <string> DocumentStyle::getClassNames(){ - vector <string> kwClassNames; - for(KSIterator iter = keywordStyles.begin(); iter != keywordStyles.end(); iter++){ - kwClassNames.push_back( (*iter).first); - } - return kwClassNames; -} - -KeywordStyles& DocumentStyle::getKeywordStyles(){ - return keywordStyles; -} - -} -/*************************************************************************** - documentstyle.h - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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 DOCUMENTSTYLE_H -#define DOCUMENTSTYLE_H - -#include <string> -#include <iostream> -#include "configurationreader.h" -#include "elementstyle.h" -#include "stylecolour.h" - -using namespace std; - -namespace highlight { - -/** maps keyword class names and the corresponding formatting information*/ -typedef map <string, ElementStyle*> KeywordStyles; - -/** iterator for keyword styles*/ -typedef KeywordStyles::iterator KSIterator; - -/** \brief Contains information about document formatting properties. - -* @author Andre Simon -*/ - -class DocumentStyle - { - private: - ElementStyle comment, slcomment, str, dstr, - escapeChar, number, directive, line, symbol; - ElementStyle defaultElem; - StyleColour bgColour; - - string fontsize; - bool fileFound; - - KeywordStyles keywordStyles; - - public: - /** Constructor - \param styleDefinitionPath Style definition path */ - DocumentStyle(const string & styleDefinitionPath); - DocumentStyle(); - ~DocumentStyle(); - - /** load sytle definition - \param styleDefinitionFile Style definition path - \return True if successfull */ - bool load(const string & styleDefinitionFile); - - /** \return class names defined in the theme file */ - vector <string> getClassNames(); - - /** \return keyword styles */ - KeywordStyles& getKeywordStyles(); - - /** \return Font size */ - string &getFontSize() ; - - /** \return Background colour*/ - StyleColour& getBgColour(); - - /** \return Style of default (unrecognized) strings */ - ElementStyle & getDefaultStyle() ; - - /** \return Comment style*/ - ElementStyle & getCommentStyle() ; - - /** \return Single line comment style*/ - ElementStyle& getSingleLineCommentStyle() ; - - /** \return Keyword style*/ - ElementStyle & getKeywordStyle() ; - - /** \return String style*/ - ElementStyle & getStringStyle() ; - - /** \return Directive line string style*/ - ElementStyle & getDirectiveStringStyle() ; - - /** \return Escape character style*/ - ElementStyle & getEscapeCharStyle() ; - - /** \return Number style*/ - ElementStyle & getNumberStyle() ; - - /** \return Directive style*/ - ElementStyle & getDirectiveStyle() ; - - /** \return Type style*/ - ElementStyle & getTypeStyle() ; - - /** \return Line number style*/ - ElementStyle & getLineStyle() ; - - /** \return Bracket style*/ - ElementStyle & getSymbolStyle() ; - - /** - \param className Name of keyword class - \return keyword style of the given className - */ - ElementStyle & getKeywordStyle(const string &className); - - /** \return True if language definition was found */ - bool found() const ; - }; - -} - -#endif -/*************************************************************************** - elementstyle.cpp - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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 "elementstyle.h" - -namespace highlight { - -ElementStyle::ElementStyle(StyleColour col, bool b, bool i, bool u) - : colour(col) , bold(b), italic(i), underline(u) -{} - -ElementStyle:: ElementStyle(const string & elementStyleString) - : bold(false), italic(false), underline(false) -{ - set(elementStyleString); -} - -ElementStyle::ElementStyle() - : bold(false), italic(false), underline(false) -{} - -void ElementStyle::set(const string & elementStyleString){ - - istringstream valueStream(elementStyleString.c_str()); - string r, g, b, attr; - valueStream >> r; - valueStream >> g; - valueStream >> b; - colour.setRedValue(r); - colour.setGreenValue(g); - colour.setBlueValue(b); - while ( valueStream >> attr) - { - if (attr=="italic") - { - italic = true; - } - else if (attr=="bold") - { - bold = true; - } - else if (attr=="underline") - { - underline = true; - } - } -} - -ElementStyle::~ElementStyle() -{} - -bool ElementStyle::isItalic() const -{ - return italic; -} -bool ElementStyle::isBold() const -{ - return bold; -} -bool ElementStyle::isUnderline() const -{ - return underline; -} -StyleColour ElementStyle::getColour() const -{ - return colour; -} - -} -/*************************************************************************** - elementstyle.h - description - ------------------- - begin : Son Nov 10 2002 - copyright : (C) 2002 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 ELEMENTSTYLE_H -#define ELEMENTSTYLE_H - -#include <sstream> - -#include "stylecolour.h" - -using namespace std; - -namespace highlight { - -/** \brief The class stores the basic text formatting properties. - -* @author Andre Simon -*/ - -class ElementStyle { - public: - - /** Constructor - \param col Style colour - \param b Bold flag - \param i Italic flag - \param u Underline flag */ - ElementStyle(StyleColour col, bool b, bool i, bool u); - - /** Constuctor - \param elementStyleString String with fotmatting information */ - ElementStyle(const string & elementStyleString); - - ElementStyle(); - - ~ElementStyle(); - - /** initialize object - \param elementStyleString String which contains formatting attributes - */ - void set(const string & elementStyleString); - - /** \return True if italic */ - bool isItalic() const; - - /** \return True if bold */ - bool isBold() const; - - /** \return True if underline */ - bool isUnderline() const; - - /** \return Element colour */ - StyleColour getColour() const; - - private: - StyleColour colour; - bool bold, italic, underline; - }; - -} - -#endif -// -// C++ Interface: enums -// -// Description: -// -// -// Author: Andre Simon <andre.simon1@gmx.de>, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// -// - -#ifndef ENUMS_H -#define ENUMS_H - -namespace highlight { - -/** states which may occour during input file parsing*/ -enum State { - STANDARD=0, - STRING, - NUMBER, - SL_COMMENT, - ML_COMMENT_BEGIN, - ESC_CHAR, - DIRECTIVE_LINE, - DIRECTIVE_STRING, - LINENUMBER, - SYMBOL, - - // Konstanten ab hier duefen nicht mehr als Array-Indizes benutzt werden!! - KEYWORD, - ML_COMMENT_END, - DIRECTIVE_LINE_END, - TAG_BEGIN, - TAG_END, - KEYWORD_BEGIN, - KEYWORD_END, - - _UNKNOWN=100, - _EOL, - _EOF, - _WS -} ; - -/** Parser return values*/ -enum ParseError{ - PARSE_OK, - BAD_INPUT=1, - BAD_OUTPUT=2, - BAD_STYLE=4 -}; - -/** line wrapping modes*/ -enum WrapMode { - WRAP_DISABLED, - WRAP_SIMPLE, - WRAP_DEFAULT -}; - -/** language definition loading results*/ -enum LoadResult{ - LOAD_FAILED, - LOAD_NEW, - LOAD_NONE -}; - -/** output formats */ -enum OutputType { - HTML, - XHTML, - TEX, - LATEX, - RTF, - XSLFO, - XML, - ANSI -}; - -} - -#endif -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - 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, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif - -/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#include <cstdio> -#include <cstring> -//#include "tailor.h" - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include <stdlib.h> -#endif /* GNU C library. */ - -/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a - long-named option. Because this is not POSIX.2 compliant, it is - being phased out. */ -/* #define GETOPT_COMPAT */ - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = 0; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -#define BAD_OPTION '\0' -int optopt = BAD_OPTION; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include <string.h> -#define my_index strchr -#define my_strlen strlen -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -#if __STDC__ || defined(PROTO) - #ifndef _WIN32 - // Solaris compilation fix - extern "C" { - char *getenv(const char *name); - int strncmp(const char *s1, const char *s2, int n); - } - // extern char *getenv(const char *name); - // extern int strncmp(const char *s1, const char *s2, int n); - #endif - extern int strcmp (const char *s1, const char *s2); - static int my_strlen(const char *s); - static char *my_index (const char *str, int chr); -#else - #ifndef _WIN32 - extern char *getenv (); - #endif -#endif - -static int -my_strlen (const char *str) - -{ - int n = 0; - while (*str++) - n++; - return n; -} - -static char * -my_index ( const char *str, - int chr) - -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -#endif /* GNU C library. */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. - - To perform the swap, we first reverse the order of all elements. So - all options now come before all non options, but they are in the - wrong order. So we put back the options and non options in original - order by reversing them again. For example: - original input: a b c -x -y - reverse all: -y -x c b a - reverse options: -x -y c b a - reverse non options: -x -y a b c -*/ - -#if __STDC__ || defined(PROTO) -static void exchange (char **argv); -#endif - -static void -exchange (char **argv) - -{ - char *temp, **first, **last; - - /* Reverse all the elements [first_nonopt, optind) */ - first = &argv[first_nonopt]; - last = &argv[optind-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - /* Put back the options in order */ - first = &argv[first_nonopt]; - first_nonopt += (optind - last_nonopt); - last = &argv[first_nonopt - 1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - - /* Put back the non options in order */ - first = &argv[first_nonopt]; - last_nonopt = optind; - last = &argv[last_nonopt-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return BAD_OPTION after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return BAD_OPTION. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal ( int argc, - char *const *argv, - const char *optstring, - const struct option *longopts, - int *longind, - int long_only) - -{ - int option_index; - - optarg = 0; - - /* Initialize the internal data when the first call is made. - Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - if (optind == 0) - { - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - #ifndef _WIN32 - else if (getenv ("POSIXLY_CORRECT") != NULL) - ordering = REQUIRE_ORDER; - #endif - else - ordering = PERMUTE; - } - - if (nextchar == NULL || *nextchar == '\0') - { - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Now skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - optind++; - last_nonopt = optind; - } - - /* Special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Start decoding its characters. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - if (longopts != NULL - && ((argv[optind][0] == '-' - && (argv[optind][1] == '-' || long_only)) -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - )) - { - const struct option *p; - char *s = nextchar; - int exact = 0; - int ambig = 0; - const struct option *pfound = NULL; - int indfound = 0; - - while (*s && *s != '=') - s++; - - /* Test all options for either exact match or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; - p++, option_index++) - if (!strncmp (p->name, nextchar, s - nextchar)) - { - if (s - nextchar == my_strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, "%s: option `%s' is ambiguous\n", - argv[0], argv[optind]); - nextchar += my_strlen (nextchar); - optind++; - return BAD_OPTION; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*s) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = s + 1; - else - { - if (opterr) - { - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[optind - 1][0], pfound->name); - } - nextchar += my_strlen (nextchar); - return BAD_OPTION; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, "%s: option `%s' requires an argument\n", - argv[0], argv[optind - 1]); - nextchar += my_strlen (nextchar); - return optstring[0] == ':' ? ':' : BAD_OPTION; - } - } - nextchar += my_strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, "%s: unrecognized option `--%s'\n", - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, "%s: unrecognized option `%c%s'\n", - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return BAD_OPTION; - } - } - - /* Look at and handle the next option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { -#if 0 - if (c < 040 || c >= 0177) - fprintf (stderr, "%s: unrecognized option, character code 0%o\n", - argv[0], c); - else - fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); -#endif - } - optopt = c; - return BAD_OPTION; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = 0; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { -#if 0 - fprintf (stderr, "%s: option `-%c' requires an argument\n", - argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: option requires an argument -- %c\n", - argv[0], c); -#endif - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = BAD_OPTION; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt ( int argc, - char *const *argv, - const char *optstring) - -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -int -getopt_long ( int argc, - char *const *argv, - const char *options, - const struct option *long_options, - int *opt_index) - -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case BAD_OPTION: - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ - -/* Declarations for getopt. - Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#ifndef _GETOPT_H - -#ifndef __need_getopt -# define _GETOPT_H 1 -#endif - -/* If __GNU_LIBRARY__ is not already defined, either we are being used - standalone, or this is the first header included in the source file. - If we are being used with glibc, we need to include <features.h>, but - that does not exist if we are standalone. So: if __GNU_LIBRARY__ is - not defined, include <ctype.h>, which will pull in <features.h> for us - if it's from glibc. (Why ctype.h? It's guaranteed to exist and it - doesn't flood the namespace with stuff the way some other headers do.) */ -#if !defined __GNU_LIBRARY__ -# include <ctype.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -#ifndef __need_getopt -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -# if (defined __STDC__ && __STDC__) || defined __cplusplus - const char *name; -# else - char *name; -# endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -# define no_argument 0 -# define required_argument 1 -# define optional_argument 2 -#endif /* need getopt */ - - -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. - - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, `optopt' is set to the option letter, and '?' is - returned. - - The OPTS string is a list of characters which are recognized option - letters, optionally followed by colons, specifying that that letter - takes an argument, to be placed in `optarg'. - - If a letter in OPTS is followed by two colons, its argument is - optional. This behavior is specific to the GNU `getopt'. - - The argument `--' causes premature termination of argument - scanning, explicitly telling `getopt' that there are no more - options. - - If OPTS begins with `--', then non-option arguments are treated as - arguments to the option '\0'. This behavior is specific to the GNU - `getopt'. */ - -#if (defined __STDC__ && __STDC__) || defined __cplusplus -# ifdef __GNU_LIBRARY__ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int ___argc, char *const *___argv, const char *__shortopts); -# else /* not __GNU_LIBRARY__ */ -// Solaris compilation fix -//extern int getopt (); -# endif /* __GNU_LIBRARY__ */ - -# ifndef __need_getopt -extern int getopt_long (int ___argc, char *const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind); -extern int getopt_long_only (int ___argc, char *const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int ___argc, char *const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind, - int __long_only); -# endif -#else /* not __STDC__ */ -extern int getopt (); -# ifndef __need_getopt -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -# endif -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -/* Make sure we later can get all the definitions and declarations. */ -#undef __need_getopt - -#endif /* getopt.h */ -/*************************************************************************** - help.cpp - description - ------------------- - begin : Die Apr 23 2002 - copyright : (C) 2002 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 "help.h" - -namespace Help - { - -/** gibt Hilfetext auf Konsole aus */ - - void printHelp(const std::string & helpFilePath) - { - std::ifstream helpFile(helpFilePath.c_str()); - std::string line; - if (helpFile){ - while (getline(helpFile, line)) - std::cout << line << "\n"; - helpFile.close(); - } - else { - std::cerr <<"highlight: Could not read "<< helpFilePath << "\n"; - } - } - -} -/*************************************************************************** - help.h - description - ------------------- - begin : Die Apr 23 2002 - copyright : (C) 2002 by AndĂ© 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 HELP_H -#define HELP_H - -#include <iostream> -#include <fstream> -#include <string> - -/**\ brief COntains methods for printing help messages - *@author Andre Simon - */ -namespace Help - { - /** print help message to stdout */ - void printHelp(const std::string &); - } - -#endif -/*************************************************************************** - htmlcode.cpp - description - ------------------- - begin : Wed Nov 28 2001 - copyright : (C) 2001 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 "htmlgenerator.h" - -using namespace std; - -namespace highlight { - - -HtmlGenerator::HtmlGenerator(void) -{} - -string HtmlGenerator::formatStyleAttributes(const string & elemName, - const ElementStyle & elem) -{ - ostringstream s; - s << "."<<elemName<<"\t{ color:#" - << (elem.getColour().getHexRedValue()) - << (elem.getColour().getHexGreenValue()) - << (elem.getColour().getHexBlueValue() ) - << ( elem.isBold() ?"; font-weight:bold" :"" ) - << ( elem.isItalic() ?"; font-style:italic" :"" ) - << ( elem.isUnderline() ?"; text-decoration:underline" :"" ) - << "; }\n" ; - return s.str(); -} - -string HtmlGenerator::getOpenTag(const string& styleName ){ - return "<span class=\""+styleName+"\">"; -} - -HtmlGenerator::HtmlGenerator ( - const string &cssStyle, - const string &enc, - bool omitEnc, - bool withAnchors) - : CodeGenerator( cssStyle), - brTag("<br>"), - hrTag("<hr>"), - idAttr("name"), - fileSuffix(".html"), - encoding(enc), - omitEncoding(omitEnc), - HTML_FOOTER( - "\n</body>\n</html>\n<!--HTML generated by highlight " - HIGHLIGHT_VERSION - ", " - HIGHLIGHT_URL - "-->\n"), - attachAnchors(withAnchors) -{ - styleTagOpen.push_back(""); - styleTagOpen.push_back(getOpenTag("str")); - styleTagOpen.push_back(getOpenTag("num")); - styleTagOpen.push_back(getOpenTag("slc")); - styleTagOpen.push_back(getOpenTag("com")); - styleTagOpen.push_back(getOpenTag("esc")); - styleTagOpen.push_back(getOpenTag("dir")); - styleTagOpen.push_back(getOpenTag("dstr")); - styleTagOpen.push_back(getOpenTag("line")); - styleTagOpen.push_back(getOpenTag("sym")); - - styleTagClose.push_back(""); - for (int i=1;i<NUMBER_BUILTIN_STYLES; i++) { - styleTagClose.push_back("</span>"); - } - - /*assert (styleTagOpen.size()==styleTagClose.size()); - assert (styleTagOpen.size()==NUMBER_BUILTIN_STYLES); -*/ - newLineTag = "\n"; - spacer = " "; - styleCommentOpen="/*"; - styleCommentClose="*/"; -} - -string HtmlGenerator::getStyleDefinition() -{ - if (styleDefinitionCache.empty()){ - ostringstream os; - os << "body.hl\t{ background-color:#" - << (docStyle.getBgColour().getHexRedValue()) - << (docStyle.getBgColour().getHexGreenValue()) - << (docStyle.getBgColour().getHexBlueValue()) - << "; }\n"; - os << "pre.hl\t{ color:#" - << (docStyle.getDefaultStyle().getColour().getHexRedValue()) - << (docStyle.getDefaultStyle().getColour().getHexGreenValue()) - << (docStyle.getDefaultStyle().getColour().getHexBlueValue() ) - << "; background-color:#" - << (docStyle.getBgColour().getHexRedValue()) - << (docStyle.getBgColour().getHexGreenValue()) - << (docStyle.getBgColour().getHexBlueValue()) - << "; font-size:" - << docStyle.getFontSize() - << "pt; font-family:Courier;}\n"; - os << formatStyleAttributes("num", docStyle.getNumberStyle()) - << formatStyleAttributes("esc", docStyle.getEscapeCharStyle()) - << formatStyleAttributes("str", docStyle.getStringStyle()) - << formatStyleAttributes("dstr", docStyle.getDirectiveStringStyle()) - << formatStyleAttributes("slc", docStyle.getSingleLineCommentStyle()) - << formatStyleAttributes("com", docStyle.getCommentStyle()) - << formatStyleAttributes("dir", docStyle.getDirectiveStyle()) - << formatStyleAttributes("sym", docStyle.getSymbolStyle()) - << formatStyleAttributes("line", docStyle.getLineStyle()); - - KeywordStyles styles = docStyle.getKeywordStyles(); - for (KSIterator it=styles.begin(); it!=styles.end(); it++){ - os << formatStyleAttributes(it->first, *(it->second)); - } - styleDefinitionCache=os.str(); - } - return styleDefinitionCache; -} - -string HtmlGenerator::getHeader(const string &title) -{ - ostringstream os; - os << getHeaderStart((title.empty())?"Source file":title ); - if (langInfo.getSyntaxHighlight()) - { - if (includeStyleDef) //CSS-Definition in HTML-<head> einfuegen - { - os << "<style type=\"text/css\">\n"; - os << "<!--\n"; - os << getStyleDefinition(); - os << CodeGenerator::readUserStyleDef(); - os << "//-->\n"; - os << "</style>" << endl; - } - else //Referenz auf CSS-Datei einfuegen - { - os << "<link rel=\"stylesheet\" type=\"text/css\" href=\"" - << getStyleOutputPath() - << "\"" - << ">\n"; - } - } - os << "</head>\n<body class=\"hl\">\n<pre class=\"hl\">"; - return os.str(); -} - -string HtmlGenerator::getFooter() -{ - return "</pre>" + HTML_FOOTER; -} - - -void HtmlGenerator::printBody() -{ - processRootState(); -} - - - -string HtmlGenerator::maskCharacter(unsigned char c) -{ - switch (c) { - case '<' : - return "<"; - break; - case '>' : - return ">"; - break; - case '&' : - return "&"; - break; - case '\"' : - return """; - break; - - case '@' : - return "@"; - break; - - default : - string m; - return m += c; - } -} - -void HtmlGenerator::insertLineNumber (bool insertNewLine) -{ - if (insertNewLine){ - //*out << getNewLine(); - wsBuffer += getNewLine(); - } - if (showLineNumbers) { - ostringstream numberPrefix; - if (attachAnchors) { - numberPrefix << "<a " - << idAttr - << "=\"l_" - << lineNumber - << "\">"; - } - ostringstream os; - if (lineNumberFillZeroes) os.fill('0'); - os <<setw(LINE_NUMBER_WIDTH)<<right<< lineNumber; - numberPrefix<< styleTagOpen[LINENUMBER] - << os.str() - << spacer - << styleTagClose[LINENUMBER]; - - if (attachAnchors) { - numberPrefix << "</a>"; - } - - wsBuffer += numberPrefix.str(); - } -} - -string HtmlGenerator::getHeaderStart(const string &title){ - ostringstream header; - header<< "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" - << "\n<html>\n<head>\n"; - if (!omitEncoding){ - header << "<meta http-equiv=\"content-type\" content=\"text/html; charset="<<encoding<<"\">\n"; - } - header << "<title>" << title <<"</title>\n"; - return header.str(); -} - -bool HtmlGenerator::printIndexFile(const vector<string> &fileList, - const string &outPath ){ - string suffix = fileSuffix; - string outFilePath = outPath + "index" + suffix; - ofstream indexfile(outFilePath.c_str()); - - if (!indexfile.fail()){ - string inFileName; - string inFilePath, newInFilePath; - indexfile << getHeaderStart("Source Index" ); - indexfile << "</head>\n<body>\n<h1> Source Index</h1>\n" - << hrTag - << "\n<ul>\n"; - string::size_type pos; - for (unsigned int i=0; i < fileList.size(); i++){ - pos=(fileList[i]).find_last_of(Platform::pathSeparator); - if (pos!=string::npos){ - newInFilePath = (fileList[i]).substr(0, pos+1); - } else { - newInFilePath=Platform::pathSeparator; - } - if (newInFilePath!=inFilePath){ - indexfile << "</ul>\n<h2>"; - indexfile << newInFilePath; - indexfile << "</h2>\n<ul>\n"; - inFilePath=newInFilePath; - } - inFileName = (fileList[i]).substr(pos+1); - indexfile << "<li><a href=\"" << inFileName << suffix << "\">"; - indexfile << inFileName << suffix <<"</a></li>\n"; - } - - indexfile << "</ul>\n" - << hrTag << brTag - << "<small>Generated by highlight " - << HIGHLIGHT_VERSION - << ", <a href=\"" << HIGHLIGHT_URL << "\" target=\"new\">" - << HIGHLIGHT_URL << "</a></small>"; - indexfile << HTML_FOOTER; - } else { - return false; - } - return true; -} - -string HtmlGenerator::getMatchingOpenTag(unsigned int styleID){ - return getOpenTag(langInfo.getKeywordClasses()[styleID]); - } - -string HtmlGenerator::getMatchingCloseTag(unsigned int styleID){ - return "</span>"; -} - -} -/*************************************************************************** - htmlgenerator.h - description - ------------------- - begin : Wed Nov 28 2001 - copyright : (C) 2001 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 HTMLGENERATOR_H -#define HTMLGENERATOR_H - -#include <fstream> -#include <iostream> -#include <string> -#include <sstream> - -#include "codegenerator.h" -#include "version.h" -#include "stylecolour.h" -#include "elementstyle.h" -#include "platform_fs.h" - -namespace highlight { - -/** - \brief This class generates HTML. - - 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 HtmlGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - \param enc encoding name - \param omitEnc switch to omit encoding information - \param withAnchors Test if HTML anchors should be attached to line numbers - */ - HtmlGenerator(const string &colourTheme, - const string &enc, - bool omitEnc=false, - bool withAnchors = false); - - HtmlGenerator(); - - /** Destructor*/ - virtual ~HtmlGenerator() {}; - - /** insert line number in the beginning of the new line - */ - virtual void insertLineNumber(bool insertNewLine=true); - - /** Print document header - \param title Title of the document - */ - string getHeader(const string &title); - - /** Print document body*/ - void printBody(); - - /** Print document footer*/ - string getFooter(); - - /** Print style definitions to external file - \param outFile Path of external style definition - */ - bool printExternalStyle(const string &outFile); - - /** Print index file with all input file names - \param fileList List of output file names - \param outPath Output path - */ - bool printIndexFile(const vector<string> & fileList, const string &outPath); - - protected: - - /** some strings which are similar in HTML and XHTML*/ - string brTag, hrTag, idAttr, fileSuffix; - - /** Output encoding name */ - string encoding; - - /** switch to omit encoding name in file header */ - bool omitEncoding; - - /** HTML footer */ - string HTML_FOOTER; - - /** caches style definition */ - string styleDefinitionCache; - - /** \return CSS definition */ - string getStyleDefinition(); - - /** \return Content of user defined style file */ - string readUserStyleDef(); - - /** \param title Dociment title - \return Start of file header */ - virtual string getHeaderStart(const string &title); - - private: - - /** \param styleName Style name - \return Opening tag of the given style - */ - string getOpenTag(const string& styleName); - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - /** test if anchors should be appied to line numbers*/ - bool attachAnchors; - - /**\return text formatting attributes in HTML format */ - string formatStyleAttributes(const string & elemName, const ElementStyle & elem); - - /** \param styleID Style ID - \return Opening tag of the given style - */ - string getMatchingOpenTag(unsigned int styleID); - - /** \param styleID Style ID - \return Closing tag of the given style - */ - string getMatchingCloseTag(unsigned int styleID); - }; - -} - -#endif -/*************************************************************************** - languagedefinition.cpp - description - ------------------- - begin : Wed Nov 28 2001 - copyright : (C) 2001 by Andre imon - 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 "languagedefinition.h" - -using namespace std; - -namespace highlight { - -LanguageDefinition::LanguageDefinition(): - ignoreCase(false), - disableHighlighting(false), - allowExtEscape(false), - vhdl_mode(false), - java_mode(false), - allowNestedComments(true), - fullLineComment(false), - reformatCode(false) -{} - -int LanguageDefinition::isKeyword(const string &s) -{ - if (s.length()) - { - if (keywords.count(s)){ - return keywords[s]; - } - else if (prefixes.count(s[0])){ - return prefixes[s[0]]; - } - } - return 0; -} - -bool LanguageDefinition::isPrefix(unsigned char c) -{ - return ( prefixes.count(c)); -} - -void LanguageDefinition::addSimpleSymbol(stringstream& symbolStream, - State state, - const string& paramValues ) { - istringstream valueStream(paramValues); - bool valExists=false; - string value; - while (valueStream >> value) - { - symbolStream << " " << value; - valExists = true; - } - if (valExists) - { - symbolStream << " " << state; - } -} - -void LanguageDefinition::addDelimiterSymbol(stringstream& symbolStream, - State stateBegin, State stateEnd, - const string& paramValues, - unsigned int classID) { - istringstream valueStream(paramValues); - string delimPrefix, delimSuffix; - while (valueStream>>delimPrefix){ - valueStream >> delimSuffix; - symbolStream << " "<<delimPrefix <<" " << stateBegin; - symbolStream <<" "<< delimSuffix<<" "<< stateEnd; - delimiterPrefixes.insert(make_pair(delimPrefix, classID)); - }; -} - -bool LanguageDefinition::getFlag( string& paramValue){ - return (StringTools::lowerCase(paramValue)=="true"); -} - -unsigned char LanguageDefinition::getSymbol(const string& paramValue){ - istringstream valueStream(paramValue); - unsigned char symbol; - valueStream >> symbol; - return symbol; -} - -void LanguageDefinition::addKeywords(const string &kwList, - int classID){ - istringstream valueStream(kwList); - string keyword; - while (valueStream >> keyword){ - keywords.insert(make_pair(keyword, classID)); - } -} - -unsigned int LanguageDefinition::generateNewKWClass(const string& newClassName){ - unsigned int newClassID=0; - bool found=false; - while (newClassID<keywordClasses.size() && !found){ - found= (newClassName==keywordClasses[newClassID++]); - } - if (!found){ - newClassID++; - keywordClasses.push_back(newClassName); - } - return newClassID; -} - -unsigned int LanguageDefinition::getDelimPrefixClassID(const string& prefix){ - if (delimiterPrefixes.count(prefix)){ - return delimiterPrefixes[prefix]; - } - return 0; -} - -bool LanguageDefinition::load(const string& langDefPath, bool clear) -{ - if (clear) reset(); - - ConfigurationReader langDef(langDefPath); - if (langDef.found()) - { - currentPath=langDefPath; - disableHighlighting=false; - string token; - stringstream symbolStrStream; - - //Stringstream zum Einlesen der Token: - istringstream valueStream; - - addDelimiterSymbol(symbolStrStream, ML_COMMENT_BEGIN, ML_COMMENT_END, - langDef.getParameter("ml_comment")); - - addSimpleSymbol(symbolStrStream, SL_COMMENT, - langDef.getParameter("sl_comment")); - - addSimpleSymbol(symbolStrStream, ESC_CHAR, - langDef.getParameter("escchar")); - - addSimpleSymbol(symbolStrStream, DIRECTIVE_LINE, - langDef.getParameter("directive")); - - addSimpleSymbol(symbolStrStream, DIRECTIVE_LINE_END, - langDef.getParameter("directiveend")); - - addSimpleSymbol(symbolStrStream, STRING, - langDef.getParameter("stringdelimiters")); - - ignoreCase=getFlag(langDef.getParameter("ignorecase")); - allowNestedComments=getFlag(langDef.getParameter("allownestedcomments")); - vhdl_mode=getFlag(langDef.getParameter("vhdl_mode")); - java_mode=getFlag(langDef.getParameter("java_mode")); - disableHighlighting=getFlag(langDef.getParameter("disablehighlighting")); - fullLineComment=getFlag(langDef.getParameter("fl_comment")); - reformatCode=getFlag(langDef.getParameter("reformatting")); - rawStringPrefix=getSymbol(langDef.getParameter("rawstringprefix")); - continuationChar=getSymbol(langDef.getParameter("continuationsymbol")); - allowExtEscape=getFlag(langDef.getParameter("allowextescape")); - - string paramName, className, classValue; - vector<string> paramNames=langDef.getParameterNames(); - for (unsigned int i=0;i<paramNames.size();i++){ - paramName=paramNames[i]; - className=StringTools::getParantheseVal(paramName); - classValue=langDef.getParameter(paramName); - if (paramName.find("kw_list") != string::npos ){ - addKeywords(classValue, generateNewKWClass(className)); - } - if (paramName.find("kw_prefix") != string::npos){ - prefixes.insert(make_pair(classValue[0], generateNewKWClass(className))); - } - if (paramName.find("kw_delim") != string::npos ){ - addDelimiterSymbol(symbolStrStream, KEYWORD_BEGIN, KEYWORD_END, - classValue, generateNewKWClass(className)); - } - if (paramName.find("tag_delim") != string::npos ){ - addDelimiterSymbol(symbolStrStream, TAG_BEGIN, TAG_END, - classValue, generateNewKWClass(className)); - } - } - - // zuletzt einlesen, um Probleme mit Delimitern, die Zeichen der - // Symbolliste enthalten, zu vermeiden - addSimpleSymbol(symbolStrStream, SYMBOL, langDef.getParameter("symbols")); - - valueStream.str(langDef.getParameter("allowedchars")); - while (valueStream >> token ) - { - allowedChars += token; - } - symbolString = symbolStrStream.str(); - - string fileToInclude=langDef.getParameter("include"); - if (!fileToInclude.empty()){ - string::size_type Pos = langDefPath.find_last_of(Platform::pathSeparator); - string includeLangDefPath = langDefPath.substr(0, Pos+1) + fileToInclude; - load(includeLangDefPath, false); - } - return true; - } - else - { - currentPath.clear(); - return false; - } -} - -void LanguageDefinition::reset() -{ - keywords.clear(); - keywordClasses.clear(); - delimiterPrefixes.clear();; - prefixes.clear(); - allowedChars.clear(); - ignoreCase= false; - java_mode= vhdl_mode= false; - allowNestedComments= reformatCode = false; - rawStringPrefix = continuationChar = '\0'; - disableHighlighting=false; - fullLineComment=false; -} - -bool LanguageDefinition::isVHDL() -{ - return vhdl_mode; -} - -bool LanguageDefinition::isJava() -{ - return java_mode; -} - -bool LanguageDefinition::allowNestedMLComments(){ - return allowNestedComments; -} - -bool LanguageDefinition::highlightingDisabled(){ - return disableHighlighting; -} - -bool LanguageDefinition::isFullLineComment(){ - return fullLineComment; -} - -bool LanguageDefinition::needsReload(const string &langDefPath){ - return currentPath!=langDefPath; -} - -bool LanguageDefinition::enableReformatting(){ - return reformatCode; -} - -const KeywordMap& LanguageDefinition::getKeywords() const{ - return keywords; -} - -string &LanguageDefinition::getSymbolString() { - return symbolString; -} - -unsigned char LanguageDefinition::getRawStringPrefix(){ - return rawStringPrefix; -} - -unsigned char LanguageDefinition::getContinuationChar(){ - return continuationChar; -} - -string &LanguageDefinition::getAllowedChars() { - return allowedChars; -} - -bool LanguageDefinition::getSyntaxHighlight() { - return !disableHighlighting; -} - -bool LanguageDefinition::isIgnoreCase() { - return ignoreCase; -} - -const vector<string>&LanguageDefinition::getKeywordClasses() const{ - return keywordClasses; -} - -bool LanguageDefinition::allowExtEscSeq() { - return allowExtEscape; -} - -} -/*************************************************************************** - languagedefinition.h - description - ------------------- - begin : Wed Nov 28 2001 - copyright : (C) 2001 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 LANGUAGEDEFINITION_H -#define LANGUAGEDEFINITION_H - -#include <string> -#include <map> -#include <iostream> -#include <fstream> -#include <iterator> -#include <sstream> - -#include "configurationreader.h" -//#include "stringtools.h" -#include "platform_fs.h" -#include "enums.h" - - -namespace highlight { - -/** maps keywords and the corresponding class IDs*/ -typedef map <string, int> KeywordMap; - -/** maps keyword prefixes and the corresponding class IDs*/ -typedef map <unsigned char, int> PrefixMap; - -/**\brief Contains specific data of the programming language being processed. - - The load() method will only read a new language definition if the given - file path is not equal to the path of the current language definition. - -* @author Andre Simon -*/ - -class LanguageDefinition { - - public: - - LanguageDefinition(); - - /**\return Symbol string, containg all known symbols with the referencing state ids*/ - string &getSymbolString(); - - /** \return Prefix of raw strings */ - unsigned char getRawStringPrefix(); - - /** \return Continuation Character */ - unsigned char getContinuationChar(); - - /** \return List of characters allowed within identifiers */ - string &getAllowedChars(); - - /** \return true if syntax highlighting is enabled*/ - bool getSyntaxHighlight(); - - /** \return True if language is case sensitive */ - bool isIgnoreCase(); - - /** \param s String - \return class id of keyword, 0 if s is not a keyword */ - int isKeyword(const string &s); - - - /** \return true if c is member of prefix list*/ - bool isPrefix(unsigned char c); - - /** Load new language definition - \param langDefPath Path of language definition - \param clear Test if former data should be deleted - \return True if successfull */ - bool load(const string& langDefPath, bool clear=true); - - /** \return True if programming language is VHDL */ - bool isVHDL(); - - /** \return True if programming language is Java */ - bool isJava(); - - /** \return True if multi line comments may be nested */ - bool allowNestedMLComments(); - - /** \return True if highlighting is disabled */ - bool highlightingDisabled(); - - /** \return True if single line comments must start at coloumn 1 */ - bool isFullLineComment(); - - /** \return True the next load() call will load a new language definition - \param langDefPath Path to language definition */ - bool needsReload(const string &langDefPath); - - /** \return True if current language may be reformatted (c, c++, c#, java) */ - bool enableReformatting(); - - /** \return True if escape sequences are allowed outsde of strings */ - bool allowExtEscSeq(); - - /** \return Class ID of given keyword delimiter prefix - \param prefix Keyword delimiter prefix */ - unsigned int getDelimPrefixClassID(const string& prefix); - - /** \return keywords*/ - const KeywordMap& getKeywords() const; - - /** \return keyword classes*/ - const vector<string>& getKeywordClasses() const; - - private: - // string containing symbols and their IDs of the programming language - string symbolString; - - // string with special characters that may occour in keywords - string allowedChars; - - // path to laoed language definition - string currentPath; - - KeywordMap keywords; - - vector <string> keywordClasses; - - KeywordMap delimiterPrefixes; - - PrefixMap prefixes; - - // keywords are not case sensitive if set - bool ignoreCase, - disableHighlighting, - allowExtEscape, - - // switch to enable VHDL workarounds - vhdl_mode, - - // switch to enable Java workarounds - java_mode, - - // allow nested multi line comment blocks - allowNestedComments, - - // single line comments have to start in coloumn 1 if set - fullLineComment, - - // code formatting is enabled if set - reformatCode; - - // Character, die eine Variable bzw. ein Keyword kennzeichnen - unsigned char rawStringPrefix, - continuationChar; - - /** setzt Membervariablen auf Defaultwerte */ - void reset(); - - // add a symbol sequencs to the symbolStream - void addSimpleSymbol(stringstream& symbolStream, State state, - const string& paramValues ); - - // add a delimiter symbol sequencs to the symbolStream - void addDelimiterSymbol(stringstream& symbolStream, - State stateBegin, State stateEnd, - const string& paramValues, - unsigned int classID=0); - - bool getFlag( string& paramValue); - - unsigned char getSymbol(const string& paramValue); - - // generate a unique class ID if the class name - unsigned int generateNewKWClass(const string& newClassName); - - // add keywords to the given class - void addKeywords(const string &kwList, int classID); - - }; - -} -#endif -/*************************************************************************** - LatexCode.cpp - description - ------------------- - begin : Mit Jul 24 2002 - copyright : (C) 2002 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 "latexgenerator.h" - -namespace highlight { - -LatexGenerator::LatexGenerator(const string &colourTheme, - bool replQuotes) - : CodeGenerator(colourTheme), - replaceQuotes(replQuotes) -{ - styleTagOpen.push_back( "\\hlstd{"); - styleTagOpen.push_back( "\\hlstr{"); - styleTagOpen.push_back( "\\hlnum{"); - styleTagOpen.push_back( "\\hlslc{"); - styleTagOpen.push_back( "\\hlcom{"); - styleTagOpen.push_back( "\\hlesc{"); - styleTagOpen.push_back( "\\hldir{"); - styleTagOpen.push_back( "\\hldstr{"); - styleTagOpen.push_back( "\\hlline{"); - styleTagOpen.push_back( "\\hlsym{"); - - for (int i=0;i<NUMBER_BUILTIN_STYLES; i++){ - styleTagClose.push_back( "}"); - } - - // avoid "Underfull \hbox (badness 10000)" warnings - newLineTag = "\\\\\n"; - longLineTag = "\\hspace*{\\fill}" + newLineTag; - - spacer = "\\ "; - - maskWs=true; - maskWsBegin = "\\hlstd{"; - maskWsEnd = "}"; - - excludeWs=true; - - styleCommentOpen="%"; -} - -LatexGenerator::LatexGenerator() -{} -LatexGenerator::~LatexGenerator() -{} - -string LatexGenerator::formatStyleAttributes(const string & elemName, - const ElementStyle &elem) -{ - ostringstream s; - s << "\\newcommand{\\hl" - << elemName - << "}[1]{\\textcolor[rgb]{" - << elem.getColour().getLatexRedValue() << "," - << elem.getColour().getLatexGreenValue() << "," - << elem.getColour().getLatexBlueValue() - << "}{"; - - if (elem.isBold()) - s << "\\bf{"; - if (elem.isItalic()) - s << "\\it{"; - - s <<"#1"; - - if (elem.isBold()) - s << "}"; - if (elem.isItalic()) - s << "}"; - - s <<"}}\n"; - return s.str(); -} - -void LatexGenerator::printBody() -{ - *out << "\\noindent\n" - << "\\ttfamily\n"; - - processRootState(); - - *out << "\\mbox{}\n" - << "\n\\normalfont\n"; -} - -string LatexGenerator::getHeader(const string & title) -{ - ostringstream os; - os << "\\documentclass{article}\n" - << "\\usepackage{color}\n" - << "\\usepackage{alltt}\n"; - - if (langInfo.getSyntaxHighlight()) { - if (includeStyleDef) { - os << "\n"<<getStyleDefinition(); - os << CodeGenerator::readUserStyleDef(); - } else { - os << "\n\\input {" - << getStyleOutputPath() - << "}\n"; - } - } - - os << "\n\\title{" << title << "}\n" - << "\\begin{document}\n" - << "\\pagecolor{bgcolor}\n"; - return os.str(); -} - -string LatexGenerator::getFooter() -{ - ostringstream os; - os << "\\end {document}\n" - << "(* LaTeX generated by highlight " - << HIGHLIGHT_VERSION - << ", " - << HIGHLIGHT_URL - << " *)\n"; - return os.str(); -} - -string LatexGenerator::getNewLine(){ - return (showLineNumbers)? newLineTag:longLineTag; -} - -string LatexGenerator::maskCharacter(unsigned char c) -{ - switch (c) - { - case '<' : - return "$<$"; - break; - case '>' : - return "$>$"; - break; - case '{': - case '}': - case '&': - case '$': - case '#': - case '%': - { - string m; - m ="\\"; - m += c; - return m; - } - break; - case '\"': - return (fragmentOutput && replaceQuotes)?"\\dq{}":"\""; - break; - case '_': - return "\\textunderscore "; - break; - case '^': - return "\\textasciicircum "; - break; - case '\\': - return "$\\backslash$"; - break; - case '~': - return "$\\sim$"; - break; - case '|': - return "\\textbar "; - break; - // avoid latex compilation failure if [ or * follows a line break (\\) - case '*': - case '[': - case ']': - // avoid "merging" of consecutive '-' chars when included in bold font ( \bf ) - case '-': - { - string m; - m= "{"; - m+= c; - m+= "}"; - return m; - } - break; - case ' ': - return spacer; - break; - case AUML_LC: - return "\\\"a"; - break; - case OUML_LC: - return "\\\"o"; - break; - case UUML_LC: - return "\\\"u"; - break; - case AUML_UC: - return "\\\"A"; - break; - case OUML_UC: - return "\\\"O"; - break; - case UUML_UC: - return "\\\"U"; - break; - case AACUTE_LC: - return "\\'a"; - break; - case EACUTE_LC: - return "\\'e"; - break; - case OACUTE_LC: - return "\\'o"; - break; - case UACUTE_LC: - return "\\'u"; - break; - case AGRAVE_LC: - return "\\`a"; - break; - case EGRAVE_LC: - return "\\`e"; - break; - case OGRAVE_LC: - return "\\`o"; - break; - case UGRAVE_LC: - return "\\`u"; - break; - case AACUTE_UC: - return "\\'A"; - break; - case EACUTE_UC: - return "\\'E"; - break; - case OACUTE_UC: - return "\\'O"; - break; - case UACUTE_UC: - return "\\'U"; - break; - case AGRAVE_UC: - return "\\`A"; - break; - case EGRAVE_UC: - return "\\`E"; - break; - case UGRAVE_UC: - return "\\`O"; - break; - case OGRAVE_UC: - return "\\`U"; - break; - case SZLIG: - return "\\ss "; - break; - /* #ifndef _WIN32 - // skip first byte of multibyte chracters - case 195: - return string(""); - break; -#endif*/ - - default : - { - string m; - return m+=c; - } - } -} - -string LatexGenerator::getMatchingOpenTag(unsigned int styleID){ - return "\\hl"+langInfo.getKeywordClasses()[styleID]+"{"; - } - -string LatexGenerator::getMatchingCloseTag(unsigned int styleID){ - return "}"; -} - - -string LatexGenerator::getStyleDefinition() -{ - if (styleDefinitionCache.empty()){ - ostringstream os; - os << formatStyleAttributes("std", docStyle.getDefaultStyle()); - os << formatStyleAttributes("num", docStyle.getNumberStyle()); - os << formatStyleAttributes("esc", docStyle.getEscapeCharStyle()); - os << formatStyleAttributes("str", docStyle.getStringStyle()); - os << formatStyleAttributes("dstr", docStyle.getDirectiveStringStyle()); - os << formatStyleAttributes("slc", docStyle.getSingleLineCommentStyle()); - os << formatStyleAttributes("com", docStyle.getCommentStyle()); - os << formatStyleAttributes("dir", docStyle.getDirectiveStyle()); - os << formatStyleAttributes("sym", docStyle.getSymbolStyle()); - os << formatStyleAttributes("line", docStyle.getLineStyle()); - - KeywordStyles styles = docStyle.getKeywordStyles(); - for (KSIterator it=styles.begin(); it!=styles.end(); it++){ - os << formatStyleAttributes(it->first, *(it->second)); - } - os << "\\definecolor{bgcolor}{rgb}{" - << docStyle.getBgColour().getLatexRedValue() << "," - << docStyle.getBgColour().getLatexGreenValue() << "," - << docStyle.getBgColour().getLatexBlueValue() - << "}\n"; - os << "\\oddsidemargin -3mm\n\\textwidth 165,2truemm\n" - << "\\topmargin 0truept\n\\headheight 0truept\n" - << "\\headsep 0truept\n\\textheight 230truemm\n"; - - styleDefinitionCache=os.str(); - } - return styleDefinitionCache; -} - - -} -/*************************************************************************** - latexgenerator.h - description - ------------------- - begin : Mit Jul 24 2002 - copyright : (C) 2002 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. * - * * - ***************************************************************************/ - -#ifndef LATEXGENERATOR_H -#define LATEXGENERATOR_H - -#include <string> -#include <iostream> -#include <sstream> - -#include "codegenerator.h" -#include "version.h" -#include "charcodes.h" - - -namespace highlight { - -/** - \brief This class generates LaTeX. - - 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 LatexGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - \param replQuotes Test if quotes shold be replaced by \ dq - */ - LatexGenerator(const string &colourTheme, - bool replQuotes=false); - LatexGenerator(); - ~LatexGenerator(); - - /** 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: - - string styleDefinitionCache; - string longLineTag; - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - /**\return text formatting attributes in LaTeX format */ - string formatStyleAttributes(const string & elemName, - const ElementStyle & elem); - - /** test if double quotes should be replaced by \dq{} */ - bool replaceQuotes; - - string getNewLine(); - - string getStyleDefinition(); - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - }; - -} - -#endif -/*************************************************************************** - main.cpp - description - ------------------- - begin : Die Apr 23 22:16:35 CEST 2002 - copyright : (C) 2002-2004 by André Simon - email : andre.simon1@gmx.de - - - Highlight is a universal source code to HTML converter. Syntax highlighting - is formatted by Cascading Style Sheets. It's possible to easily enhance - highlight's parsing database. - - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "main.h" - -using namespace std; - -void HighlightApp::printVersionInfo() -{ - cout << "\n highlight version " - << HIGHLIGHT_VERSION - << "\n Copyright (C) 2002-2005 Andre Simon <andre.simon1@gmx.de>" - << "\n\n Artistic Style Classes (1.15.3)" - << "\n Copyright (C) 1998-2002 Tal Davidson <davidsont@bigfoot.com>" - << "\n\n Dirstream Classes (0.4)" - << "\n Copyright (C) 2002-2004 Benjamin Kaufmann <hume@c-plusplus.de>" - << "\n\n This software is released under the terms of the GNU General " - << "Public License." - << "\n For more information about these matters, see the file named " - << "COPYING.\n\n"; - #ifdef USE_LOCAL_GETOPT - cout << " (Built with USE_LOCAL_GETOPT flag set.)\n"; - #endif - #ifdef HL_DATA_DIR - cout << " (HL_DATA_DIR: \"" <<HL_DATA_DIR<< "\" )\n"; - #endif -} - -void HighlightApp::printBadInstallationInfo() -{ - cerr << "highlight: Data directory not found. Bad installation or wrong " - << OPT_DATADIR << " parameter." - << "\n\nCopy the highlight files into one of the directories listed " - << "in INSTALL.\nYou may also set the data directory with " - << OPT_DATADIR << " and " << OPT_ADDDATADIR << ".\n"; -} - -bool HighlightApp::listInstalledFiles(bool showThemes) -{ - vector <string> filePaths; - string wildcard=(showThemes)? "*.style":"*.lang"; - unsigned int suffixLength=wildcard.length()-1; - - string searchDir = ((showThemes) ? dataDir.getThemeDir(): - dataDir.getLangDefDir()) + wildcard; - - bool directoryOK = Platform::getDirectoryEntries(filePaths, searchDir, true); - if (!directoryOK) { - cerr << "highlight: Could not access directory " - << searchDir - << ", aborted.\n"; - return false; - } - - cout << "\n Installed " - << ((showThemes)? "themes":"language definitions ") - << "(located in " - << ((showThemes)?dataDir.getThemeDir():dataDir.getLangDefDir()) - << ") :\n" - << endl; - - sort(filePaths.begin(), filePaths.end()); - string temp; - - for (unsigned int i=0;i< filePaths.size(); i++){ - if (showThemes) - temp = (filePaths[i]).substr(dataDir.getThemeDir().length()); - else - temp = (filePaths[i]).substr(dataDir.getLangDefDir().length()); - cout << " "<<temp.substr(0, temp.length()- suffixLength) << endl; - } - cout <<"\n Use name of the desired " - << ((showThemes)?"theme":"language") - << " with the --" - << ((showThemes)? OPT_STYLE : OPT_SYNTAX) - << " option.\n" << endl; - return true; -} - -void HighlightApp::printDebugInfo(highlight::LanguageDefinition &lang, - const string & langDefPath) -{ - cerr << "\nLoading language definition: " << langDefPath; - cerr << "\n\nSYMBOLS: " - << lang.getSymbolString(); - cerr << "\n\nKEYWORDS: "; - highlight::KeywordMap::iterator it; - highlight::KeywordMap keys=lang.getKeywords(); - cerr << "\n\nID Keyword \n"; - for (it=keys.begin(); it!=keys.end();it++){ - cerr << it->second - << " <- \"" - << it->first <<"\"\n"; - } - cerr <<"\n"; -} - -string HighlightApp::getFileSuffix(const string &fileName) { - size_t ptPos=fileName.rfind("."); - return (ptPos == string::npos) ? - "" : fileName.substr(ptPos+1, fileName.length()); -} - -bool HighlightApp::loadMapConfig(const string& name, StringMap* map){ - string extPath=dataDir.getDir() + name + ".conf"; - ConfigurationReader config(extPath); - if (config.found() ) - { - stringstream values; - string paramName, paramVal; - for (unsigned int i=0;i<config.getParameterNames().size();i++){ - paramName = config.getParameterNames()[i]; - values.str(config.getParameter(paramName)) ; - while (values >> paramVal) { - map->insert(make_pair( paramVal, paramName)); - } - values.clear(); - } - return true; - } else { - cerr << "highlight: Configuration file "<< extPath << " not found.\n"; - return false; - } -} - - -int HighlightApp::getNumDigits(int i){ - int res=0; - while (i){ - i/=10; - ++res; - } - return res; -} - -void HighlightApp::printProgressBar(int total, int count){ - if (!total) return; - int p=100*count / total; - int numProgressItems=p/10; - cout << "\r["; - for (int i=0;i<10;i++){ - cout <<((i<numProgressItems)?"#":" "); - } - cout<< "] " <<setw(3)<<p<<"%, "<<count << " / " << total << " " <<flush; - if (p==100) { - cout << endl; - } -} - -void HighlightApp::printCurrentAction(const string&outfilePath, - int total, int count, int countWidth){ - cout << "Writing file " - << setw(countWidth)<< count - << " of " - << total - << ": " - << outfilePath - << "\n"; -} - -void HighlightApp::printIOErrorReport(unsigned int numberErrorFiles, - vector<string> & fileList, - const string &action){ - cerr << "highlight: Could not " - << action - << " file" - << ((numberErrorFiles>1)?"s":"")<<":\n"; - copy (fileList.begin(), fileList.end(), ostream_iterator<string>(cerr, "\n")); - if (fileList.size() < numberErrorFiles) { - cerr << "... [" - << (numberErrorFiles - fileList.size() ) - << " of " - << numberErrorFiles - << " failures not shown, use --" - << OPT_VERBOSE - << " switch to print all paths]\n"; - } -} - -string HighlightApp::analyzeShebang(const string& file){ - if (scriptShebangs.empty()) loadMapConfig("scriptre", &scriptShebangs); - ifstream inFile(file.c_str()); - string firstLine; - getline (inFile, firstLine); - return scriptShebangs[StringTools::trimRight(firstLine)]; -} - -string HighlightApp::guessFileType(const string& suffix, const string &inputFile) -{ - if (extensions.empty()) loadMapConfig("extensions", &extensions); - string fileType = (extensions.count(suffix)) ? extensions[suffix] : suffix ; - if (!fileType.empty()) return fileType; - return analyzeShebang(inputFile); -} - - -int HighlightApp::run(int argc, char**argv){ - - //get command line options - CmdLineOptions options(argc, argv); - - // set data directory path, where /langDefs and /themes reside - string highlightRootDir = Platform::getAppPath(); - - // determine highlight data directory - if (! dataDir.searchDataDir((options.dataDirGiven())? - options.getDataDir(): highlightRootDir)){ - printBadInstallationInfo(); - return EXIT_FAILURE; - } - - if (options.additionalDataDirGiven()){ - dataDir.setAdditionalDataDir(options.getAdditionalDataDir()); - } - - if (options.printVersion()) { - printVersionInfo(); - return EXIT_SUCCESS; - } - - if (options.printHelp()) { - Help::printHelp(dataDir.getHelpMsgDir() + options.getHelpLang()); - return EXIT_SUCCESS; - } - - if (options.showThemes() || options.showLangdefs()) { - return listInstalledFiles(options.showThemes())?EXIT_SUCCESS:EXIT_FAILURE; - } - - // list of input files - const vector <string> inFileList=options.getInputFileNames(); - - string stylePath=dataDir.searchForTheme(options.getStyleName()); - - highlight::CodeGenerator *generator = - highlight::CodeGenerator::getInstance(options.getOutputType(), - stylePath, - options.getStyleInFilename(), - options.getStyleOutFilename(), - options.getCharSet(), - options.includeStyleDef(), - options.attachLineAnchors(), - options.replaceQuotes(), - options.fopCompatible(), - options.getNumberSpaces(), - options.getWrappingStyle(), - options.printLineNumbers(), - options.fillLineNrZeroes(), - options.fragmentOutput(), - options.omitEncodingName() ); - - assert (generator!=NULL); - - bool styleFileWanted = !options.fragmentOutput() || options.styleOutPathDefined(); - - if (!generator->styleFound() ) { - cerr << "highlight: Could not find style " - << stylePath - << ".\n"; - highlight::CodeGenerator::deleteInstance(); - return EXIT_FAILURE; - } - - if (!options.getIndentScheme().empty()){ - string indentSchemePath = - dataDir.searchForIndentScheme(options.getIndentScheme()+".indent"); - if (!generator->initIndentationScheme(indentSchemePath)){ - cerr << "highlight: Could not find indentation scheme " - << indentSchemePath - << ".\n"; - highlight::CodeGenerator::deleteInstance(); - return EXIT_FAILURE; - } - } - - string outDirectory = options.getOutDirectory(); - if (!outDirectory.empty() && !options.quietMode() && !dirstr::directory_exists(outDirectory) ){ - cerr << "highlight: Output directory \"" - << outDirectory - << "\" does not exist.\n"; - return EXIT_FAILURE; - } - - bool initError=false, IOError=false; - - if ( !options.includeStyleDef() - && (styleFileWanted) - && options.formatSupportsExtStyle()) { - string cssOutFile=outDirectory + options.getStyleOutFilename(); - bool success=generator->printExternalStyle (cssOutFile); - if (!success){ - cerr << "highlight: Could not write " << cssOutFile <<".\n"; - IOError = true; - } - } - - if (options.printIndexFile()){ - bool success=generator -> printIndexFile(inFileList, outDirectory); - if (!success){ - cerr << "highlight: Could not write index file.\n"; - IOError = true; - } - } - - unsigned int fileCount=inFileList.size(), - fileCountWidth=getNumDigits(fileCount), - i=0, - numBadFormatting=0, - numBadInput=0, - numBadOutput=0; - - vector<string> badFormattedFiles, badInputFiles, badOutputFiles; - string outFilePath; - string suffix, lastSuffix; - - if (options.syntaxGiven()) { // user defined language definition, valid for all files - suffix = guessFileType(options.getLanguage()); - } - - while (i < fileCount && !initError) { - if (!options.syntaxGiven()) { // determine file type for each file - suffix = guessFileType(getFileSuffix(inFileList[i]), inFileList[i]); - } - if (suffix.empty()) { - if (!options.enableBatchMode() && !styleFileWanted) - cerr << "highlight: Undefined language definition. Use --" - << OPT_SYNTAX << " option.\n"; - if (!options.forceOutput()){ - initError = true; - break; - } - } - - if (suffix != lastSuffix) { - string langDefPath=dataDir.searchForLangDef(suffix+".lang"); - highlight::LoadResult loadRes= generator->initLanguage(langDefPath); - if (loadRes==highlight::LOAD_FAILED){ - cerr << "highlight: Unknown source file extension \"" - << suffix - << "\".\n"; - if (!options.forceOutput()){ - initError = true; - break; - } - } - if (options.printDebugInfo() && loadRes==highlight::LOAD_NEW){ - printDebugInfo(generator->getLanguage(), langDefPath); - } - lastSuffix = suffix; - } - - if (options.enableBatchMode()){ - string::size_type pos=(inFileList[i]).find_last_of(Platform::pathSeparator); - outFilePath = outDirectory; - outFilePath += inFileList[i].substr(pos+1); - outFilePath += options.getOutFileSuffix(); - - if (!options.quietMode()) { - if (options.printProgress()){ - printProgressBar(fileCount, i+1); - } else { - printCurrentAction(outFilePath, fileCount, i+1, fileCountWidth); - } - } - } else { - outFilePath = options.getSingleOutFilename(); - } - - highlight::ParseError error = generator->printOutput(inFileList[i], outFilePath); - if (error==highlight::BAD_INPUT){ - if (numBadInput++ < IO_ERROR_REPORT_LENGTH || options.printDebugInfo()) { - badInputFiles.push_back(inFileList[i]); - } - } else if (error==highlight::BAD_OUTPUT){ - if (numBadOutput++ < IO_ERROR_REPORT_LENGTH || options.printDebugInfo()) { - badOutputFiles.push_back(outFilePath); - } - } - if (options.formattingEnabled() && !generator->formattingIsPossible()){ - if (numBadFormatting++ < IO_ERROR_REPORT_LENGTH || options.printDebugInfo()) { - badFormattedFiles.push_back(outFilePath); - } - } - ++i; - } - - if (numBadInput){ - printIOErrorReport(numBadInput, badInputFiles, "read input"); - IOError = true; - } - if (numBadOutput){ - printIOErrorReport(numBadOutput, badOutputFiles, "write output"); - IOError = true; - } - if (numBadFormatting){ - printIOErrorReport(numBadFormatting, badFormattedFiles, "reformat"); - } - - highlight::CodeGenerator::deleteInstance(); - return (initError || IOError) ? EXIT_FAILURE : EXIT_SUCCESS; -} - - -int main(int argc, char **argv) { - HighlightApp app; - return app.run(argc, argv); -} -// -// C++ Interface: main -// -// Description: -// -// -// Author: Andre Simon <andre.simon1@gmx.de>, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// -// - -#ifndef HIGHLIGHT_APP -#define HIGHLIGHT_APP - - -#include <iostream> -#include <fstream> -#include <string> -#include <vector> -#include <map> -#include <iomanip> -#include <cassert> - -#include "./dirstream0.4/dirstream.h" -#include "cmdlineoptions.h" -#include "configurationreader.h" -#include "codegenerator.h" -#include "help.h" -#include "datadir.h" -#include "version.h" -#include "platform_fs.h" - -#define IO_ERROR_REPORT_LENGTH 5 -#define SHEBANG_CNT 12 - -typedef map<string, string> StringMap; - -/** Main application class - @author Andre Simon -*/ - -class HighlightApp { - -public: - - HighlightApp(){}; - ~HighlightApp(){}; - - /** Start application - \param argc Number of command line arguments - \param argv values of command line arguments - \return EXIT_SUCCESS or EXIT_FAILURE - */ - int run(int argc, char **argv); - -private: - - DataDir dataDir; - StringMap extensions; - StringMap scriptShebangs; - - /** print version info*/ - void printVersionInfo(); - - /** print error message*/ - void printBadInstallationInfo(); - - /** print input and output errors */ - void printIOErrorReport(unsigned int numberErrorFiles, vector<string> & fileList, const string &action); - - /** print installed files - \param showThemes Print installed themes if true, language definitions otherwise - */ - bool listInstalledFiles(bool showThemes); - - void printDebugInfo(highlight::LanguageDefinition &lang, - const string &langDefPath); - - string getFileSuffix(const string &fileName); - - string guessFileType(const string &suffix, const string &inputFile=""); - - int getNumDigits(int i); - - void printProgressBar(int total, int count); - void printCurrentAction(const string&outfilePath, - int total, int count, int countWidth); - - bool readInputFilePaths(vector<string> &fileList, string wildcard, - bool recursiveSearch); - - string analyzeShebang(const string& file); - bool loadMapConfig(const string& name, StringMap* map); - -}; - -#endif -// -// C++ Implementation: platform_fs -// -// Description: -// -// -// Author: André Simon <andre.simon1@gmx.de>, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// -// - -#include "platform_fs.h" -#include "./dirstream0.4/dirstream.h" - -#include <iostream> - -using namespace std; - -namespace Platform { - -#ifdef _WIN32 - #include <windows.h> - - const char pathSeparator = '\\'; - //const std::string pathSeparatorStr = "\\"; - - std::string getAppPath() - { - char pathAndName[MAX_PATH], path[MAX_PATH], drive[3]; - GetModuleFileName(NULL, pathAndName, MAX_PATH); - _splitpath(pathAndName, drive, path, 0, 0); - return std::string(drive)+path; - } - -#else - const char pathSeparator = '/'; - // const std::string pathSeparatorStr = "/"; - - std::string getAppPath() - { - return ""; - } - -#endif - -bool getDirectoryEntries(vector<string> &fileList, - string wildcard, - bool recursiveSearch) -{ - if (!wildcard.empty()) { - string directory_path; - string::size_type Pos = wildcard.find_last_of(pathSeparator); - if (Pos == string::npos) { - directory_path = "."; - } else { - directory_path = wildcard.substr(0, Pos + 1); - wildcard = wildcard.substr(Pos + 1); - } - - dirstr::dirstream str( directory_path.c_str(), - #ifdef USE_FN_MATCH - dirstr::pred_f(FnMatcher(wildcard.c_str(), 0)), - #else - dirstr::pattern_f(wildcard.c_str()), - #endif - (recursiveSearch)?dirstr::recursive_yes:dirstr::recursive_no); - - - for(string entry; str >> entry;) { - fileList.push_back(dirstr::full_path(entry)); - //std::cout << "Entry " <<entry<<"\n"; - } - } - return !(fileList.empty()); -} - -} - -// -// C++ Interface: platform_fs -// -// Description: -// -// -// Author: André Simon <andre.simon1@gmx.de>, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// -// -#ifndef PLATFORM_FS__H__INCLUDED -#define PLATFORM_FS__H__INCLUDED - -#include <string> -#include <iostream> -#include <vector> - -#ifdef USE_FN_MATCH - #include <fnmatch.h> -#endif - -namespace Platform -{ - extern const char pathSeparator; - //extern const std::string pathSeparatorStr; - - std::string getAppPath(); - - /** \param fileList Vector where found entries will be stored - \param wildcard Directory path and wildcard - \param recursiveSearch Test if directory should be searched recursively */ - bool getDirectoryEntries(std::vector<std::string> &fileList, - std::string wildcard, - bool recursiveSearch=false); - -#ifdef USE_FN_MATCH - struct FnMatcher - { - FnMatcher(const char* pattern, int flags) - : pattern_(pattern) - , flags_(flags) - {} - bool operator()(const std::string& e) const { - // std::cout << "pattern: "<<pattern_<< " entry: "<<e.c_str()<< " Res fn: " <<::fnmatch(pattern_, e.c_str(), FNM_PATHNAME)<< " \n"; - return ! ::fnmatch(pattern_, e.c_str(), flags_); - } - private: - const char* pattern_; - int flags_; - }; -#endif -} -#endif -/*************************************************************************** - PreFormatter.cpp - description - ------------------- - begin : Mo Jan 03 2005 - copyright : (C) 2005 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 "preformatter.h" - -namespace highlight { - -PreFormatter::PreFormatter(bool wrap, bool replTabs): - maxLineLength(80), - index(0), - numberSpaces(0), - wsPrefixLength(string::npos), - hasMore(false), - indentAfterOpenBraces(true), - redefineWsPrefix(false), - wrapLines(wrap), - replaceTabs(replTabs) -{ -} - -PreFormatter::PreFormatter(): - maxLineLength(80), - index(0), - numberSpaces(0), - wsPrefixLength(string::npos), - hasMore(false), - indentAfterOpenBraces(true), - redefineWsPrefix(false), - wrapLines(false), - replaceTabs(false) -{ -} - -PreFormatter::~PreFormatter() -{ -} - -bool PreFormatter::hasMoreLines(){ - return hasMore; -} - -bool PreFormatter::indentCode(){ - return indentAfterOpenBraces; -} - -void PreFormatter::setLine(const std::string newLine){ - - line=newLine; - - if (replaceTabs && numberSpaces) { - size_t tabPos=line.find('\t'); - while (tabPos!=string::npos){ - line.replace(tabPos , 1, numberSpaces - (tabPos % numberSpaces) , ' '); - tabPos = line.find('\t', tabPos+1); - } - } - - if (wrapLines){ - wsPrefix.clear(); - index=0; - wsPrefixLength=string::npos; - hasMore=true; - redefineWsPrefix=false; - } -} - -std::string PreFormatter::getNextLine(){ - - if (!wrapLines){ - hasMore = false; - return line; - } - - if (!index && line.length() > maxLineLength){ // erster Durchlauf... - // wenn möglich an öffnender Klammer oder Geichheitszeichen ausrichten - if (indentAfterOpenBraces){ - wsPrefixLength=line.find_first_of(INDENT_MARKERS); - } - // sonst die Einrückung der Originalzeile beibehalten - if (wsPrefixLength==string::npos || wsPrefixLength-index>maxLineLength){ - wsPrefixLength=line.find_first_not_of(WS_CHARS); - } - else { - // wsPrefix in allen neu umgebrochenen Zeilen durch Spaces ersetzen - redefineWsPrefix=true; - // Position hinter öffnende Klammer springen - wsPrefixLength=line.find_first_not_of(WS_CHARS,wsPrefixLength+1); - } - - if (wsPrefixLength!=string::npos){ - index = wsPrefixLength; - // Falls Anzahl der Whitespaces am beginn der ersten zeile größer - // als Max. Zeilenlänge, Whitespaces verwerfen - if (wsPrefixLength>maxLineLength){ - wsPrefixLength=0; - return string(); - } - else{ - wsPrefix=line.substr(0, wsPrefixLength); - } - } - // Zeile enthaelt nur Whitespace; verwerfen - else { - hasMore= false; - return string(); - } - } else { - if (redefineWsPrefix){ - wsPrefix.clear(); - wsPrefix.append(wsPrefixLength, ' '); - } - redefineWsPrefix=false; - } - - string resultString; - - // Position, ab der rckwaerts nach Umbruchmglichkeit gesucht wird - unsigned int searchEndPos = maxLineLength - wsPrefixLength; - - // letztes Teilstueck der Zeile ausgeben; Parsen beenden - if (line.length()-index < searchEndPos) { - hasMore=false; - resultString=(index>0) ? wsPrefix + line.substr(index) : line.substr(index); - return resultString; - } - - // Umbrechposition suchen - size_t lbPos = line.find_last_of(LB_CHARS, index+searchEndPos); - if (lbPos <= index || lbPos == string::npos) { - // nichts gefunden, hart umbrechen - lbPos = index + searchEndPos; - } - // Einrückung der Originalzeile erhalten - resultString+=wsPrefix; - // Neue Zeile erzeugen - resultString += line.substr(index, lbPos-index+1); - - // Whitespace am neuen Zeilenbeginn ignorieren, ausser beim ersten Durchlauf - //unsigned int newIndex=StringTools::getNextNonWsPos(line,lbPos+1); - size_t newIndex=line.find_first_not_of(WS_CHARS, lbPos+1); - index=(newIndex!=string::npos)?newIndex:line.length(); - - hasMore=index!=line.length(); // unnoetigen Leerstring vermeiden - - return resultString; -} - -void PreFormatter::setWrappingProperties(unsigned int maxLineLength, bool indentAfterOpenBraces){ - this->maxLineLength = maxLineLength; - this->indentAfterOpenBraces = indentAfterOpenBraces; -} - -void PreFormatter::setNumberSpaces(unsigned int num){ - numberSpaces = num; -} - -} -/*************************************************************************** - PreFormatter.cpp - description - ------------------- - begin : Mo Jan 03 2005 - copyright : (C) 2005 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. * - * * - ***************************************************************************/ - -#ifndef PreFormatter_H -#define PreFormatter_H - -#define LB_CHARS " \t[](){}-+<>.:,;" -#define WS_CHARS " \n\r\t" -#define INDENT_MARKERS "{(=" - -#include <string> -#include <iostream> - -#include "stringtools.h" - -namespace highlight { - -/** \brief Class which provides intelligent line wrapping. -* @author Andre Simon -*/ - -class PreFormatter{ -public: - /** Constructor - */ - PreFormatter(bool wrap, bool replTabs); - - PreFormatter(); - - ~PreFormatter(); - - /** - \return True if current line can be wrapped again - */ - bool hasMoreLines(); - - /** - Sets new line to be wrapped - \param newline New line - */ - void setLine(const std::string newline); - - /** - The method will indent function calls and statements - \return Next line - */ - std::string getNextLine(); - - /** - \return True if lines following open braces should be indented - */ - bool indentCode(); - - /** - \param maxlength max. length of output lines - \param indentAfterOpenBraces set true if lines should be indented after braces - */ - void setWrappingProperties(unsigned int maxlength=80, bool indentAfterOpenBraces=true); - - /** - \param num number of spaces which replace a tab - */ - - void setNumberSpaces(unsigned int num); - - /** - \return true if preformatting is enabled - */ - bool isEnabled(){ - return wrapLines || replaceTabs; - } - -private: - - unsigned int maxLineLength; - - std::string line, wsPrefix; - unsigned int index; - unsigned int numberSpaces; - size_t wsPrefixLength; - bool hasMore, indentAfterOpenBraces; - bool redefineWsPrefix; - bool wrapLines, replaceTabs; -}; - -} - -#endif -/*************************************************************************** - rtfcode.cpp - description - ------------------- - begin : Die Jul 9 2002 - copyright : (C) 2002 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 "rtfgenerator.h" - -using namespace std; - -namespace highlight { - -string RtfGenerator::formatStyleAttributes( const ElementStyle & col) -{ - stringstream s; - s << "\\red"<< col.getColour().getRTFRedValue() - << "\\green"<<col.getColour().getRTFGreenValue() - << "\\blue"<<col.getColour().getRTFBlueValue() - << ";"; - - return s.str(); -} - -string RtfGenerator::getOpenTag(int styleNumber,const ElementStyle & elem) -{ - ostringstream s; - s << "{\\cf"<<(styleNumber+1)<<"{"; - if (elem.isBold()) s << "\\b "; - if (elem.isItalic()) s << "\\i "; - if (elem.isUnderline()) s << "\\ul "; - return s.str(); -} - -string RtfGenerator::getCloseTag(const ElementStyle &elem) -{ - ostringstream s; - if (elem.isBold()) s << "\\b0 "; - if (elem.isItalic()) s << "\\i0 "; - if (elem.isUnderline()) s << "\\ul0 "; - s << "}}"; - return s.str(); -} - -RtfGenerator::RtfGenerator(const string &colourTheme) - : CodeGenerator( colourTheme) -{ - styleTagOpen.push_back(getOpenTag(STANDARD, docStyle.getDefaultStyle())); - styleTagOpen.push_back(getOpenTag(STRING, docStyle.getStringStyle())); - styleTagOpen.push_back(getOpenTag(NUMBER, docStyle.getNumberStyle())); - styleTagOpen.push_back(getOpenTag(SL_COMMENT, docStyle.getSingleLineCommentStyle())); - styleTagOpen.push_back(getOpenTag(ML_COMMENT_BEGIN,docStyle.getCommentStyle())); - styleTagOpen.push_back(getOpenTag(ESC_CHAR, docStyle.getEscapeCharStyle())); - styleTagOpen.push_back(getOpenTag(DIRECTIVE_LINE, docStyle.getDirectiveStyle())); - styleTagOpen.push_back(getOpenTag(DIRECTIVE_STRING, docStyle.getDirectiveStringStyle())); - styleTagOpen.push_back(getOpenTag(LINENUMBER, docStyle.getLineStyle())); - styleTagOpen.push_back(getOpenTag(SYMBOL, docStyle.getSymbolStyle())); - - styleTagClose.push_back(getCloseTag(docStyle.getDefaultStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getStringStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getNumberStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getSingleLineCommentStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getCommentStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getEscapeCharStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getDirectiveStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getDirectiveStringStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getLineStyle())); - styleTagClose.push_back(getCloseTag(docStyle.getSymbolStyle())); - - newLineTag = "\\par\\pard\n"; - spacer = " "; -} - -RtfGenerator::RtfGenerator() -{} -RtfGenerator::~RtfGenerator() -{} - -string RtfGenerator::getHeader(const string & title) -{ - return string(); -} - -void RtfGenerator::printBody() -{ - *out << "{\\rtf1\\ansi\\uc0 \\deff1" - << "{\\fonttbl{\\f1\\fmodern\\fprq1\\fcharset0 Courier;}}" - << "{\\colortbl;"; - - *out << formatStyleAttributes(docStyle.getDefaultStyle()); - - *out << formatStyleAttributes(docStyle.getStringStyle()); - *out << formatStyleAttributes(docStyle.getNumberStyle()); - *out << formatStyleAttributes(docStyle.getSingleLineCommentStyle()); - - *out << formatStyleAttributes(docStyle.getCommentStyle()); - *out << formatStyleAttributes(docStyle.getEscapeCharStyle()); - *out << formatStyleAttributes(docStyle.getDirectiveStyle()); - - *out << formatStyleAttributes(docStyle.getDirectiveStringStyle()); - *out << formatStyleAttributes(docStyle.getLineStyle()); - *out << formatStyleAttributes(docStyle.getSymbolStyle()); - - /* For output formats which can refer to external styles it is more safe - to use the colour theme's keyword class names, since the language - definitions (which may change during a batch conversion) do not have to define - all keyword classes, that are needed to highlight all input files correctly. - It is ok for RTF to use the language definition's class names, because RTF - does not refer to external styles. - We cannot use the theme's class names, because KSIterator returns an - alphabetically ordered list, which is not good because RTF is dependent - on the order. We access the keyword style with an ID, which is calculated - ignoring the alphabetic order. - */ - vector<string> keywordClasses = langInfo.getKeywordClasses(); - for (unsigned int i=0;i<keywordClasses.size();i++){ - *out << formatStyleAttributes(docStyle.getKeywordStyle(keywordClasses[i])); - } - - *out << "}\n{\\info }\\paperw11900\\paperh16820\\margl560\\margr560\\margt840" - << "\\margb840\\widowctrl\\ftnbj\\aenddoc\\formshade \\fet0\\sectd" - << "\\linex0\\endnhere\\plain\\f1\\fs20\n\\pard "; - processRootState(); - *out << "}}"<<endl; -} - - -string RtfGenerator::getFooter() -{ - return string(); -} - -/** Gibt RTF-Code der Sonderzeichen zurueck */ -string RtfGenerator::maskCharacter(unsigned char c) -{ - switch (c) - { - case '}' : - case '{' : - case '\\' : - { - string m; - m="\\"; - return m+=c; - } - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - string m; - m="{"; - m+=c; - m+="}"; - return m; - } - break; - case AUML_LC: - return "\\'e4"; - break; - case OUML_LC: - return "\\'f6"; - break; - case UUML_LC: - return "\\'fc"; - break; - case AUML_UC: - return "\\'c4"; - break; - case OUML_UC: - return "\\'d6"; - break; - case UUML_UC: - return "\\'dc"; - break; - - case AACUTE_LC: - return "\\'e1"; - break; - case EACUTE_LC: - return "\\'e9"; - break; - case OACUTE_LC: - return "\\'f3"; - break; - case UACUTE_LC: - return "\\'fa"; - break; - - case AGRAVE_LC: - return "\\'e0"; - break; - case EGRAVE_LC: - return "\\'e8"; - break; - case OGRAVE_LC: - return "\\'f2"; - break; - case UGRAVE_LC: - return "\\'f9"; - break; - - case AACUTE_UC: - return "\\'c1"; - break; - case EACUTE_UC: - return "\\'c9"; - break; - case OACUTE_UC: - return "\\'d3"; - break; - case UACUTE_UC: - return "\\'da"; - break; - case AGRAVE_UC: - return "\\'c0"; - break; - case EGRAVE_UC: - return "\\'c8"; - break; - case OGRAVE_UC: - return "\\'d2"; - break; - case UGRAVE_UC: - return "\\'d9"; - break; - - case SZLIG: - return "\\'df"; - break; - // skip first byte of multibyte chracters - /* #ifndef _WIN32 - case 195: - return string(""); - break; -#endif*/ - - default : - { - string m; - return m += c; - } - } -} - -string RtfGenerator::getMatchingOpenTag(unsigned int styleID){ - return getOpenTag(KEYWORD+styleID, - docStyle.getKeywordStyle(langInfo.getKeywordClasses()[styleID])); -} - -string RtfGenerator::getMatchingCloseTag(unsigned int styleID){ - return getCloseTag(docStyle.getKeywordStyle(langInfo.getKeywordClasses()[styleID])); -} - - -} -/*************************************************************************** - rtfcode.h - description - ------------------- - begin : Die Jul 9 2002 - copyright : (C) 2002 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 RTFGENERATOR_H -#define RTFGENERATOR_H - -#include <iostream> -#include <fstream> -#include <string> -#include <sstream> - -#include "codegenerator.h" -#include "charcodes.h" -#include "version.h" - -namespace highlight { - -/** - \brief This class generates RTF. - - 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 RtfGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - */ - RtfGenerator( const string &colourTheme); - RtfGenerator(); - ~RtfGenerator(); - - /** 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 ); - - /**\return text formatting attributes in RTF format */ - string formatStyleAttributes( const ElementStyle & col); - - /** gibt RTF-"Tags" zurueck (Farbindex+bold+kursiv)*/ - string getOpenTag(int styleNumber,const ElementStyle &); - - string getCloseTag(const ElementStyle &); - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - }; - -} -#endif -/*************************************************************************** - stringtools.cpp - description - ------------------- - begin : Mon Dec 10 2001 - copyright : (C) 2001 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 "stringtools.h" - -#include <sstream> -#include <iostream> -#include <cctype> - -using namespace std; - -namespace StringTools - { -// Make a lowercase copy of s: -// (C) Bruce Eckel, Thinking in C++ Vol 2 - -string lowerCase(const string& s) -{ - char* buf = new char[s.length()]; - s.copy(buf, s.length()); - for(unsigned int i = 0; i < s.length(); i++) - buf[i] = tolower(buf[i]); - string r(buf, s.length()); - delete buf; - return r; -} - -int str2int(string s) -{ - istringstream os(s); - int intVal; - os >> intVal; - return intVal; -} - - bool isAlpha(unsigned char c) - { - return (isalpha(c) || c == '_'); - } - -string trimRight(const string &value) - { - string::size_type where = value.find_last_not_of(" \t\r"); - - if (where == string::npos) - // string has nothing but space - return string(); - - if (where == (value.length() - 1)) - // string has no trailing space, don't copy its contents - return value; - - return value.substr(0, where + 1); - } - -unsigned char getNextNonWs(const string &line, int index) -{ - unsigned char c; - do - { - c=line[index++]; - } - while (isspace(c)); - return c; -} - -string getParantheseVal(const string &s){ - string::size_type openPos=s.find('('); - string::size_type closePos=s.rfind(')'); - if (openPos ==string::npos || closePos==string::npos){ - return string(); - } - return s.substr(openPos+1, closePos-openPos-1); - -} - -} -/*************************************************************************** - stringtools.h - description - ------------------- - begin : Mon Dec 10 2001 - copyright : (C) 2001 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. * - * * - ***************************************************************************/ - -#ifndef STRINGTOOLS_H -#define STRINGTOOLS_H - -#include <string> - -using namespace std; - -/**\brief Contains methods for string manipulation - *@author Andre Simon - */ - -namespace StringTools - { - - /** \param s String - \returns lowercase string */ - string lowerCase(const string &s); - - /** \param s String - \returns Integer value */ - int str2int(string s); - - /** \return true if c is alpa or underscore */ - bool isAlpha(unsigned char c); - - /** \param value String - \return string trimmed on the left side - */ - string trimRight(const string &value); - - /** \return next character in line starting from index, which is no whitespace*/ - unsigned char getNextNonWs(const string &line, int index=0); - - /** \param s String, containing a opening and a closing paranthesis - \return value between "(", ")" */ - string getParantheseVal(const string &s); - -} - -#endif -/*************************************************************************** - stylecolour.cpp - description - ------------------- - begin : Die Nov 5 2002 - copyright : (C) 2002 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 "stylecolour.h" - -using std::string; - -namespace highlight { - -StyleColour::StyleColour(const string & r_hex, const string & g_hex, const string & b_hex) - : r(r_hex), g(g_hex), b(b_hex) -{} -StyleColour::StyleColour() - : r("00"), g("00"), b("00") -{} - -//Parst PArameter aus style-Datei -StyleColour::StyleColour(const string & styleColourString) -{ - setRGBValues(styleColourString); -} - -void StyleColour::setRGBValues(const string & styleColourString){ - //Stringstream zum Einlesen der Tokens: - istringstream valueStream(styleColourString.c_str()); - valueStream >> r; - valueStream >> g; - valueStream >> b; -} - -void StyleColour::setRedValue(const string & r_hex) -{ - r = r_hex; -} - -void StyleColour::setGreenValue(const string & g_hex) -{ - g = g_hex; -} - -void StyleColour::setBlueValue(const string & b_hex) -{ - b = b_hex; -} - -string& StyleColour::getHexRedValue() -{ - return r; -} -string& StyleColour::getHexGreenValue() -{ - return g; -} -string& StyleColour::getHexBlueValue() -{ - return b; -} - - -string StyleColour::getRTFRedValue() -{ - return int2str(hex2dec(r)); -} -string StyleColour::getRTFGreenValue() -{ - return int2str(hex2dec(g)); -} -string StyleColour::getRTFBlueValue() -{ - return int2str(hex2dec(b)); -} - - -string StyleColour::getLatexRedValue() -{ - return float2str((float)hex2dec(r)/255); -} -string StyleColour::getLatexGreenValue() -{ - return float2str((float)hex2dec(g)/255); -} -string StyleColour::getLatexBlueValue() -{ - return float2str((float)hex2dec(b)/255); -} - -// Konvertieren von RGB nach CYM -string StyleColour::getTexRedValue() -{ - return float2str(1-(float)hex2dec(r)/255); -} -string StyleColour::getTexGreenValue() -{ - return float2str(1-(float)hex2dec(g)/255); -} -string StyleColour::getTexBlueValue() -{ - return float2str(1-(float)hex2dec(b)/255); -} - - -string StyleColour::int2str(const int num) -{ - std::ostringstream outStream; - outStream << num; - - return outStream.str(); -} - -string StyleColour::float2str(const double num) -{ - std::ostringstream outStream; - outStream << ( floor ( num * 100 + .5 ) / 100); - - return outStream.str(); -} - -int StyleColour::hex2dec(const string &hexVal) -{ - - if (hexVal.length() != 2) - return 0; - - unsigned int decVal=0, koeff=16; - - for (int i=0; i<2;i++ ) - { - if ((hexVal[i] >= '0')&& (hexVal[i]<= '9' )) - { - decVal += (koeff * (hexVal[i]-'0')); - - } - if ((hexVal[i] >= 'a')&& (hexVal[i]<= 'f' )) - { - decVal +=( koeff * (hexVal[i]-87)); - } - if ((hexVal[i] >= 'A')&& (hexVal[i]<= 'F' )) - { - decVal += (koeff * (hexVal[i]-55)); - } - koeff=1; - } - return decVal; -} - -} - -/*************************************************************************** - stylecolour.h - description - ------------------- - begin : Die Nov 5 2002 - copyright : (C) 2002 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 STYLECOLOUR_H -#define STYLECOLOUR_H - -#include <string> -#include <sstream> -#include <fstream> -#include <cmath> -#include <sstream> - -using namespace std; - -namespace highlight { - -/**\brief Stores colours and returns red, green and blue values in different formats -* @author Andre Simon - */ - -class StyleColour - { - public: - /** Constructor - \param r_hex Red value in hex notation - \param g_hex Blue value in hex notation - \param b_hex Green value in hex notation - */ - StyleColour(const string & r_hex, const string & g_hex, const string & b_hex); - - /** Constructor - \param styleColourString String with rgb values - */ - StyleColour(const string & styleColourString); - - StyleColour(); - ~StyleColour(){}; - - /** Sets red, green and blue values - \param styleColourString String containing colour attributes - */ - void setRGBValues(const string & styleColourString); - - /** Sets red value - \param r_hex New red value */ - void setRedValue(const string & r_hex); - - /** Sets green value - \param g_hex New green value */ - void setGreenValue(const string & g_hex); - - /** Sets blue value - \param b_hex New blue value */ - void setBlueValue(const string & b_hex); - - /** \return Red value in hex format */ - string& getHexRedValue(); - /** \return Green value in hex format */ - string& getHexGreenValue(); - /** \return Blue value in hex format */ - string& getHexBlueValue(); - - /** \return Red value in latex format */ - string getLatexRedValue(); - /** \return Green value in latex format */ - string getLatexGreenValue(); - /** \return Blue value in latex format */ - string getLatexBlueValue(); - - /** \return Red value in tex format */ - string getTexRedValue(); - /** \return Green value in tex format */ - string getTexGreenValue(); - /** \return Blue value in tex format */ - string getTexBlueValue(); - - /** \return Red value in RTF format */ - string getRTFRedValue(); - /** \return Green value in RTF format */ - string getRTFGreenValue(); - /** \return Blue value in RTF format */ - string getRTFBlueValue(); - - private: - string r, g, b; - string int2str(int); - string float2str(double); - int hex2dec(const string &hexVal); - }; - -} - -#endif -/*************************************************************************** - TexGenerator.cpp - description - ------------------- - begin : Mit Jul 24 2002 - copyright : (C) 2002 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 "texgenerator.h" - -namespace highlight { - -TexGenerator::TexGenerator(const string &colourTheme): - CodeGenerator( colourTheme) -{ - styleTagOpen.push_back( "{\\hlstd "); - styleTagOpen.push_back( "{\\hlstr "); - styleTagOpen.push_back( "{\\hlnum "); - styleTagOpen.push_back( "{\\hlslc "); - styleTagOpen.push_back( "{\\hlcom "); - styleTagOpen.push_back( "{\\hlesc "); - styleTagOpen.push_back( "{\\hldir "); - styleTagOpen.push_back( "{\\hldstr "); - styleTagOpen.push_back( "{\\hlline "); - styleTagOpen.push_back( "{\\hlsym "); - for (int i=0;i<NUMBER_BUILTIN_STYLES; i++) { - styleTagClose.push_back( "}"); - } - - /*This makes TeX to use every par it encounters (the \\leavevmode has - no effect when TeX is in horizontal mode and when TeX is in vertical - mode, it switches it to horizontal mode).*/ - newLineTag="\\leavevmode\\par\n"; - - spacer = "\\ "; - maskWs=true; - excludeWs=true; - maskWsBegin = "{\\hlstd"; - maskWsEnd = "}"; - styleCommentOpen="%"; -} - -TexGenerator::TexGenerator() -{} -TexGenerator::~TexGenerator() -{} - -string TexGenerator::formatStyleAttributes(const string & elemName,const ElementStyle & elem) -{ - ostringstream s; - s << "\\def\\hl" - << elemName - << "{"; - if (elem.isBold()) - s << "\\bf"; - if (elem.isItalic()) - s << "\\it"; - s << "\\textColor{" - << (elem.getColour().getTexRedValue())<<" " - << (elem.getColour().getTexGreenValue())<<" " - << (elem.getColour().getTexBlueValue())<<" 0.0}}\n"; - return s.str(); -} - -string TexGenerator::getHeader(const string & title) -{ - ostringstream os; - - if (langInfo.getSyntaxHighlight()) { - if (includeStyleDef) { - os << "\n"<<getStyleDefinition(); - os << CodeGenerator::readUserStyleDef(); - } else { - os << "\\input " - << getStyleOutputPath() - << "\n\n"; - } - } - - return os.str(); -} - -void TexGenerator::printBody() -{ - *out << "{\n\\tt\n"; - - processRootState(); - *out << "}\n"; -} - -string TexGenerator::getFooter() -{ - ostringstream os; - os << "\\bye\n" - << "% TeX generated by Highlight " - << HIGHLIGHT_VERSION - << ", " - << HIGHLIGHT_URL - << endl; - return os.str(); -} - -string TexGenerator:: maskCharacter(unsigned char c) -{ - switch (c) - { - case '{': - case '}': - { - string m; - m = "$\\"; - m += c; - m += "$"; - return m; - } - break; - case '^': - return "{\\bf\\^{}}"; - break; - case '_': - return "\\_{}"; - break; - case '&': - case '$': - case '#': - case '%': - { - string m; - m = "\\"; - m += c; - return m; - } - break; - case '\\': - return "$\\backslash$"; - break; - case ' ': - return spacer; - break; - case '+': - case '-': - case '<': - case '>': - case '=': - { - string m; - m = "$\\mathord{"; - m += c; - m += "}$"; - return m; - } - break; - case AUML_LC: - return "\\\"a"; - break; - case OUML_LC: - return "\\\"o"; - break; - case UUML_LC: - return "\\\"u"; - break; - case AUML_UC: - return "\\\"A"; - break; - case OUML_UC: - return "\\\"O"; - break; - case UUML_UC: - return "\\\"U"; - break; - case AACUTE_LC: - return "\\'a"; - break; - case EACUTE_LC: - return "\\'e"; - break; - case OACUTE_LC: - return "\\'o"; - break; - case UACUTE_LC: - return "\\'u"; - break; - case AGRAVE_LC: - return "\\`a"; - break; - case EGRAVE_LC: - return "\\`e"; - break; - case OGRAVE_LC: - return "\\`o"; - break; - case UGRAVE_LC: - return "\\`u"; - break; - case AACUTE_UC: - return "\\'A"; - break; - case EACUTE_UC: - return "\\'E"; - break; - case OACUTE_UC: - return "\\'O"; - break; - case UACUTE_UC: - return "\\'U"; - break; - case AGRAVE_UC: - return "\\`A"; - break; - case EGRAVE_UC: - return "\\`E"; - break; - case UGRAVE_UC: - return "\\`O"; - break; - case OGRAVE_UC: - return "\\`U"; - break; - case SZLIG: - return "\\ss "; - break; - /* #ifndef _WIN32 - // skip first byte of multibyte chracters - case 195: - return string(""); - break; -#endif*/ - - default : - string m; - return m += c; - } -} - -string TexGenerator::getMatchingOpenTag(unsigned int styleID){ - return "{\\hl"+langInfo.getKeywordClasses()[styleID]+" "; - } - -string TexGenerator::getMatchingCloseTag(unsigned int styleID){ - return "}"; -} - - -string TexGenerator::getStyleDefinition() -{ - if (styleDefinitionCache.empty()){ - ostringstream os; - os << formatStyleAttributes("std", docStyle.getDefaultStyle()); - os << formatStyleAttributes("num", docStyle.getNumberStyle()); - os << formatStyleAttributes("esc", docStyle.getEscapeCharStyle()); - os << formatStyleAttributes("str", docStyle.getStringStyle()); - os << formatStyleAttributes("dstr", docStyle.getDirectiveStringStyle()); - os << formatStyleAttributes("slc", docStyle.getSingleLineCommentStyle()); - os << formatStyleAttributes("com", docStyle.getCommentStyle()); - os << formatStyleAttributes("dir", docStyle.getDirectiveStyle()); - os << formatStyleAttributes("line", docStyle.getLineStyle()); - os << formatStyleAttributes("sym", docStyle.getSymbolStyle()); - - KeywordStyles styles = docStyle.getKeywordStyles(); - for (KSIterator it=styles.begin(); it!=styles.end(); it++){ - os << formatStyleAttributes(it->first, *(it->second)); - } - - os << "% The special option is not supported by all dvi drivers\n" - << "\\special{background rgb " - << docStyle.getBgColour().getLatexRedValue() << " " - << docStyle.getBgColour().getLatexGreenValue() << " " - << docStyle.getBgColour().getLatexBlueValue() << "}"; - os << "\n\\nopagenumbers\n" - << "\\input colordvi\n"; - styleDefinitionCache=os.str(); - } - return styleDefinitionCache; -} - - -} -/*************************************************************************** - texcode.h - description - ------------------- - begin : Mit Jul 24 2002 - copyright : (C) 2002 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. * - * * - ***************************************************************************/ - -#ifndef TEXGENERATOR_H -#define TEXGENERATOR_H - -#include <string> -#include <iostream> -#include <sstream> - -#include "charcodes.h" -#include "version.h" -#include "codegenerator.h" - - -namespace highlight { - -/** - \brief This class generates TeX. - - 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 TexGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - */ - TexGenerator(const string &colourTheme); - TexGenerator(); - ~TexGenerator(); - - /** 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: - - string styleDefinitionCache; - - string getStyleDefinition(); - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - /**\return text formatting attributes in RTF format */ - string formatStyleAttributes(const string & elemName, const ElementStyle & elem); - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - - }; - -} - -#endif -/*************************************************************************** - version.h - description - ------------------- - begin : Mon March 3 2003 - copyright : (C) 2003 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. * - * * - ***************************************************************************/ - -#ifndef VERSION_H -#define VERSION_H - -#define HIGHLIGHT_VERSION "2.2-10" - -#define HIGHLIGHT_URL "http://www.andre-simon.de/" -#define HIGHLIGHT_EMAIL "andre.simon1@gmx.de" - -#endif -/*************************************************************************** - htmlcode.cpp - description - ------------------- - begin : Wed Nov 28 2001 - copyright : (C) 2001 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 "xhtmlgenerator.h" - -using namespace std; - -namespace highlight { - -XHtmlGenerator::XHtmlGenerator(void) -{} - -XHtmlGenerator::XHtmlGenerator ( - const string &cssStyle, - const string &enc, - bool omitEnc, - bool withAnchors) - : HtmlGenerator(cssStyle, enc, omitEnc, withAnchors) -{ - fileSuffix=".xhtml"; - brTag="<br />"; - hrTag="<hr />"; - idAttr="id"; - - HTML_FOOTER= - "\n</body>\n</html>\n<!--XHTML generated by highlight " - HIGHLIGHT_VERSION - ", " - HIGHLIGHT_URL - "-->\n"; -} - -string XHtmlGenerator::getHeaderStart(const string &title){ - ostringstream header; - header << "<?xml version=\"1.0\""; - if (!omitEncoding) { - header << " encoding=\"" << encoding << "\""; - } - header << "?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"" - << " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n" - << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" - << "<head>\n<title>" << title << "</title>\n"; - - return header.str(); -} - - -string XHtmlGenerator::getHeader(const string &title) -{ - ostringstream osPart1; - osPart1 << getHeaderStart((title.empty())?"Source file":title ); - - if (langInfo.getSyntaxHighlight()) - { - if (includeStyleDef) //CSS-Definition in HTML-<head> einfuegen - { - osPart1 << "<style type=\"text/css\">\n"; - osPart1 << "<![CDATA[\n"; - osPart1 << getStyleDefinition(); - osPart1 << CodeGenerator::readUserStyleDef(); - osPart1 << "]]>\n"; - osPart1 << "</style>\n"; - } - else //Referenz auf CSS-Datei einfuegen - { - osPart1 << "<link rel=\"stylesheet\" type=\"text/css\" href=\"" - << getStyleOutputPath() - << "\"" - << "/" - << ">\n"; - } - } - osPart1 << "</head>\n<body class=\"hl\">\n<pre class=\"hl\">"; - - return osPart1.str(); -} - -} -/*************************************************************************** - xhtmlgenerator.h - description - ------------------- - begin : Mo Jun 21 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 XHTMLGENERATOR_H -#define XHTMLGENERATOR_H - -#include "htmlgenerator.h" - -namespace highlight { - -/** - \brief This class generates XHTML. - - 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 XHtmlGenerator : public highlight::HtmlGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - \param enc encoding name - \param omitEnc switch to omit encoding information - \param withAnchors Test if HTML anchors should be attached to line numbers - */ - XHtmlGenerator(const string &colourTheme, - const string &enc, - bool omitEnc=false, - bool withAnchors = false); - - XHtmlGenerator(); - - /** Destructor*/ - virtual ~XHtmlGenerator() {}; - - private: - - /** prints document header - \param title Title of the document - */ - string getHeader(const string &title); - - string getHeaderStart(const string &title); - - }; - -} - -#endif -/*************************************************************************** - xmlcode.cpp - description - ------------------- - begin : Do 20.01.2005 - copyright : (C) 2005 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. * - * * - ***************************************************************************/ - -#include "xmlgenerator.h" - -using namespace std; -namespace highlight { - - XmlGenerator::XmlGenerator(const string &colourTheme,const string &enc, bool omitEnc) - : CodeGenerator(colourTheme), - encoding(enc), omitEncoding(omitEnc) -{ - styleTagOpen.push_back(getOpenTag("def")); - styleTagOpen.push_back(getOpenTag("str")); - styleTagOpen.push_back(getOpenTag("num")); - styleTagOpen.push_back(getOpenTag("slc")); - styleTagOpen.push_back(getOpenTag("com")); - styleTagOpen.push_back(getOpenTag("esc")); - styleTagOpen.push_back(getOpenTag("dir")); - styleTagOpen.push_back(getOpenTag("dstr")); - styleTagOpen.push_back(getOpenTag("line")); - styleTagOpen.push_back(getOpenTag("sym")); - - styleTagClose.push_back(getCloseTag("def")); - styleTagClose.push_back(getCloseTag("str")); - styleTagClose.push_back(getCloseTag("num")); - styleTagClose.push_back(getCloseTag("slc")); - styleTagClose.push_back(getCloseTag("com")); - styleTagClose.push_back(getCloseTag("esc")); - styleTagClose.push_back(getCloseTag("dir")); - styleTagClose.push_back(getCloseTag("dstr")); - styleTagClose.push_back(getCloseTag("line")); - styleTagClose.push_back(getCloseTag("sym")); - - spacer = " "; - newLineTag = "<br />\n"; -} - -string XmlGenerator::getStyleDefinition() -{ - if (styleDefinitionCache.empty()) { - ostringstream os; - os << "\n<style>\n" - << "\t<bgcolor value=\"" - << (docStyle.getBgColour().getHexRedValue()) - << (docStyle.getBgColour().getHexGreenValue()) - << (docStyle.getBgColour().getHexBlueValue()) - << "\" />\n" - << "\t<font size=\"" - << docStyle.getFontSize() - << "\" family=\"Courier\" />\n"; - - os << formatStyleAttributes("def", docStyle.getDefaultStyle()) - << formatStyleAttributes("num", docStyle.getNumberStyle()) - << formatStyleAttributes("esc", docStyle.getEscapeCharStyle()) - << formatStyleAttributes("str", docStyle.getStringStyle()) - << formatStyleAttributes("dstr", docStyle.getDirectiveStringStyle()) - << formatStyleAttributes("slc", docStyle.getSingleLineCommentStyle()) - << formatStyleAttributes("com", docStyle.getCommentStyle()) - << formatStyleAttributes("dir", docStyle.getDirectiveStyle()) - << formatStyleAttributes("sym", docStyle.getSymbolStyle()) - << formatStyleAttributes("line", docStyle.getLineStyle()); - - KeywordStyles styles = docStyle.getKeywordStyles(); - for (KSIterator it=styles.begin(); it!=styles.end(); it++){ - os << formatStyleAttributes(it->first, *(it->second)); - } - os << "</style>\n"; - styleDefinitionCache=os.str(); - } - return styleDefinitionCache; -} - - -string XmlGenerator::formatStyleAttributes(const string & elemName, - const ElementStyle & elem) -{ - ostringstream s; - s << "\t<class name=\"" - << elemName - <<"\" color=\"" - << (elem.getColour().getHexRedValue()) - << (elem.getColour().getHexGreenValue()) - << (elem.getColour().getHexBlueValue() ) - << "\" bold=\"" - << ( elem.isBold() ? "true" :"false" ) - << "\" italic=\"" - << ( elem.isItalic() ? "true" :"false" ) - << "\" underline=\"" - << ( elem.isUnderline() ? "true" :"false" ) - << "\" />\n" ; - return s.str(); -} - - -XmlGenerator::XmlGenerator() -{} -XmlGenerator::~XmlGenerator() -{} - -string XmlGenerator::getOpenTag(const string& styleName ){ - return "<"+styleName+">"; -} - -string XmlGenerator::getCloseTag(const string& styleName ){ - return "</"+styleName+">"; -} - -string XmlGenerator::getHeader(const string & title) -{ - ostringstream header; - header << "<?xml version=\"1.0\""; - if (!omitEncoding) { - header << " encoding=\"" << encoding << "\""; - } - header << "?>\n<document>" << getStyleDefinition(); - return header.str(); -} - -void XmlGenerator::printBody() -{ - *out << "<source>\n"; - processRootState(); - *out << "</source>\n"; -} - - -string XmlGenerator::getFooter() -{ - ostringstream os; - os <<"</document>\n"; - os<< "<!-- XML generated by Highlight " - << HIGHLIGHT_VERSION - << ", " - << HIGHLIGHT_URL - <<" -->\n"; - return os.str(); -} - -string XmlGenerator::maskCharacter(unsigned char c) -{ - switch (c) - { - case '<' : - return "<"; - break; - case '>' : - return ">"; - break; - case '&' : - return "&"; - break; - case '\"' : - return """; - break; - -// skip first byte of multibyte chracters - /* #ifndef _WIN32 - case 195: - return string(""); - break; -#endif*/ - - default: - string m; - m += c; - return m; - } -} - -/*string XmlGenerator::getNewLine(){ - string nlStr; - if (currentState!=_UNKNOWN){ - nlStr+=styleTagClose[getStyleID(currentState, currentKeywordClass)]; - } - nlStr += newLineTag; - if (currentState!=_UNKNOWN){ - nlStr+=styleTagOpen[getStyleID(currentState, currentKeywordClass)]; - } - return nlStr; -} -*/ -string XmlGenerator::getMatchingOpenTag(unsigned int styleID){ - return getOpenTag(langInfo.getKeywordClasses()[styleID]); -} - -string XmlGenerator::getMatchingCloseTag(unsigned int styleID){ - return getCloseTag(langInfo.getKeywordClasses()[styleID]); -} - -} -/*************************************************************************** - xmlcode.h - description - ------------------- - begin : Do 20.01.2005 - copyright : (C) 2005 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 XMLGENERATOR_H -#define XMLGENERATOR_H - -#include <string> -#include <sstream> -#include <iostream> - -#include "codegenerator.h" -#include "version.h" - -namespace highlight { - -/** - \brief This class generates XML. - - 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 XmlGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - \param enc encoding name - \param omitEnc switch to omit encoding information - */ - XmlGenerator( const string &colourTheme,const string &enc, bool omitEnc=false); - - XmlGenerator(); - - ~XmlGenerator(); - - /** 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: - - string styleDefinitionCache, encoding; - - bool omitEncoding; - - string getStyleDefinition(); - - string formatStyleAttributes(const string &, const ElementStyle &); - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - -// string getNewLine(); - - string getOpenTag(const string& ); - string getCloseTag(const string& ); - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - }; - -} - -#endif -/*************************************************************************** - xslfocode.cpp - description - ------------------- - begin : Do 11.12.2003 - copyright : (C) 2003 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 "xslfogenerator.h" - -using namespace std; -namespace highlight { - -XslFoGenerator::XslFoGenerator(const string &colourTheme, - const string &enc, - bool omitEnc, - bool fopCompatible) - : CodeGenerator(colourTheme), - encoding(enc), - fopOutput(fopCompatible), - omitEncoding(omitEnc) -{ - styleTagOpen.push_back( getOpenTag(docStyle.getDefaultStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getStringStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getNumberStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getSingleLineCommentStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getCommentStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getEscapeCharStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getDirectiveStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getDirectiveStringStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getLineStyle())); - styleTagOpen.push_back( getOpenTag(docStyle.getSymbolStyle())); - snl << " <fo:block font-size=\"" - << docStyle.getFontSize() - << "pt\" font-family=\"Courier\" white-space-collapse=\"false\" " - << "wrap-option=\"wrap\" line-height=\"12pt\" background-color=\"#" - << (docStyle.getBgColour().getHexRedValue()) - << (docStyle.getBgColour().getHexGreenValue()) - << (docStyle.getBgColour().getHexBlueValue()) - << "\">"; - - for (int i=0;i<NUMBER_BUILTIN_STYLES; i++) - { - styleTagClose.push_back( "</fo:inline>"); - } - if (fopOutput) - newLineTag ="</fo:block>\n<fo:block>"; - else - newLineTag ="</fo:block>\n"+ snl.str(); - - spacer = " "; -} - -XslFoGenerator::XslFoGenerator() -{} -XslFoGenerator::~XslFoGenerator() -{} - -string XslFoGenerator::getOpenTag(const ElementStyle &elem) -{ - ostringstream s; - s << "<fo:inline color=\"#" - << (elem.getColour().getHexRedValue()) - << (elem.getColour().getHexGreenValue()) - << (elem.getColour().getHexBlueValue()) - << "\""; - s << ( elem.isBold() ?" font-weight=\"bold\"" :"" ) - << ( elem.isItalic() ?" font-style=\"italic\"" :"" ) - << ( elem.isUnderline() ?" text-decoration=\"underline\"" :"" ); - s << ">"; - return s.str(); -} - -string XslFoGenerator::getHeader(const string & title) -{ - ostringstream os; - os << "<?xml version=\"1.0\""; - if (!omitEncoding) { - os << " encoding=\"" << encoding << "\""; - } - os << "?>\n<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n" - << "<fo:layout-master-set>\n" - << "<fo:simple-page-master master-name=\"DINA4\"\n" - << " page-height=\"29.7cm\"\n" - << " page-width=\"21cm\"\n" - << " margin-top=\"1cm\"\n" - << " margin-bottom=\"2cm\"\n" - << " margin-left=\"2.5cm\"\n" - << " margin-right=\"2.5cm\">\n" - << "<fo:region-body />\n" - << "</fo:simple-page-master>\n" - << "<fo:page-sequence-master master-name=\"basic\">\n" - << "<fo:repeatable-page-master-alternatives>\n" - << "<fo:conditional-page-master-reference master-reference=\"DINA4\" />\n" - << "</fo:repeatable-page-master-alternatives>\n" - << "</fo:page-sequence-master>\n" - << "</fo:layout-master-set>\n\n" - << "<fo:page-sequence master-reference=\"basic\">\n" - << " <fo:flow flow-name=\"xsl-region-body\">\n"; - if (fopOutput) - os << snl.str()<< "<fo:block>"; - else - os << snl.str(); - - return os.str(); -} - -/** gibt RTF-Text aus */ -void XslFoGenerator::printBody() -{ - processRootState(); -} - - -string XslFoGenerator::getFooter() -{ - ostringstream os; - if (fopOutput) - os <<"\n</fo:block>"; - os <<"\n</fo:block>\n </fo:flow>\n</fo:page-sequence>\n</fo:root>"<<endl - << "<!-- XSL-FO generated by Highlight " - << HIGHLIGHT_VERSION - << ", " - << HIGHLIGHT_URL - <<" -->\n"; - return os.str(); -} - -/** Gibt RTF-Code der Sonderzeichen zurueck */ -string XslFoGenerator::maskCharacter(unsigned char c) -{ - switch (c) - { - case '<' : - return "<"; - break; - case '>' : - return ">"; - break; - case '&' : - return "&"; - break; - case '\"' : - return """; - break; - -// skip first byte of multibyte chracters - /*#ifndef _WIN32 - case 195: - return string(""); - break; -#endif*/ - - default: - string m; - m += c; - return m; - } -} - -/*string XslFoGenerator::getNewLine(){ - string nlStr; - - if (currentState!=_UNKNOWN){ - nlStr+=styleTagClose[getStyleID(currentState, currentKeywordClass)]; -} - nlStr += newLineTag; - if (currentState!=_UNKNOWN){ - nlStr+=styleTagOpen[getStyleID(currentState, currentKeywordClass)]; -} - return nlStr; -}*/ - -string XslFoGenerator::getMatchingOpenTag(unsigned int styleID){ - return getOpenTag(docStyle.getKeywordStyle(langInfo.getKeywordClasses()[styleID])); -} - -string XslFoGenerator::getMatchingCloseTag(unsigned int styleID){ - return "</fo:inline>"; -} - -} -/*************************************************************************** - xslfocode.h - description - ------------------- - begin : Do 11.12.2003 - copyright : (C) 2003 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 XSLFOGENERATOR_H -#define XSLFOGENERATOR_H - - -#include <string> -#include <sstream> -#include <iostream> -#include <fstream> - -#include "codegenerator.h" -#include "version.h" - -namespace highlight { - -/** - \brief This class generates XSL-FO. - - 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 XslFoGenerator : public highlight::CodeGenerator - { - public: - - /** Constructor - \param colourTheme Name of Colour theme to use - \param enc encoding name - \param omitEnc switch to omit encoding information - \param fopCompatible Test if output should be compatible with Apache FOP 0.20.5 - */ - XslFoGenerator( const string &colourTheme, - const string &enc, - bool omitEnc=false, - bool fopCompatible=false); - - XslFoGenerator(); - - ~XslFoGenerator(); - - /** 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: - ostringstream snl; - - string styleDefinition, encoding; - bool fopOutput, omitEncoding; - - /** \return escaped character*/ - virtual string maskCharacter(unsigned char ); - - string getOpenTag(const ElementStyle &); - - // string getNewLine(); - - string getMatchingOpenTag(unsigned int styleID); - string getMatchingCloseTag(unsigned int styleID); - }; - -} - -#endif |