diff options
Diffstat (limited to 'kate/cppsymbolviewer/tcl_parser.cpp')
-rw-r--r-- | kate/cppsymbolviewer/tcl_parser.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/kate/cppsymbolviewer/tcl_parser.cpp b/kate/cppsymbolviewer/tcl_parser.cpp new file mode 100644 index 0000000..ff51e60 --- /dev/null +++ b/kate/cppsymbolviewer/tcl_parser.cpp @@ -0,0 +1,150 @@ +/*************************************************************************** + tcl_parser.cpp - description + ------------------- + begin : Apr 2 2003 + author : 2003 Massimo Callegari + email : massimocallegari@yahoo.it + ***************************************************************************/ + /*************************************************************************** + * * + * 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 "plugin_katesymbolviewer.h" + +void KatePluginSymbolViewerView::parseTclSymbols(void) +{ + if (!win->viewManager()->activeView()) + return; + + QString currline, prevline; + bool prevComment = false; + QString varStr("set "); + QString procStr("proc"); + QString stripped; + uint i, j, args_par = 0, graph = 0; + char block = 0, parse_func = 0; + + QListViewItem *node = NULL; + QListViewItem *mcrNode = NULL, *clsNode = NULL; + QListViewItem *lastMcrNode = NULL, *lastClsNode = NULL; + + QPixmap mcr( ( const char** ) macro_xpm ); + QPixmap cls( ( const char** ) class_xpm ); + + if(treeMode) + { + clsNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Functions")); + mcrNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Globals")); + lastMcrNode = mcrNode; + lastClsNode = clsNode; + if (expanded_on) + { + clsNode->setOpen(TRUE); + mcrNode->setOpen(TRUE); + } + symbols->setRootIsDecorated(1); + } + else + symbols->setRootIsDecorated(0); + + Kate::Document *kDoc = win->viewManager()->activeView()->getDoc(); + + //positions.resize(kDoc->numLines() + 3); // Maximum symbols number o.O + //positions.fill(0); + + for (i = 0; i<kDoc->numLines(); i++) + { + currline = kDoc->textLine(i); + currline = currline.stripWhiteSpace(); + bool comment = false; + kdDebug(13000)<<currline<<endl; + if(currline.at(0) == '#') comment = true; + + if(i > 0) + { + prevline = kDoc->textLine(i-1); + if(prevline.endsWith("\\") && prevComment) comment = true; + } + prevComment = comment; + + if(!comment) + { + if(currline.startsWith(varStr) && block == 0) + { + if (macro_on == true) // not really a macro, but a variable + { + stripped = currline.right(currline.length() - 3); + stripped = stripped.simplifyWhiteSpace(); + int fnd = stripped.find(' '); + //fnd = stripped.find(";"); + if(fnd > 0) stripped = stripped.left(fnd); + + if (treeMode) + { + node = new QListViewItem(mcrNode, lastMcrNode, stripped); + lastMcrNode = node; + } + else + node = new QListViewItem(symbols, symbols->lastItem(), stripped); + + node->setPixmap(0, (const QPixmap &)mcr); + node->setText(1, QString::number( i, 10)); + stripped = ""; + }//macro + } // starts with "set" + + else if(currline.startsWith(procStr)) { parse_func = 1; } + + if (parse_func == 1) + { + for (j = 0; j < currline.length(); j++) + { + if (block == 1) + { + if(currline.at(j)=='{') graph++; + if(currline.at(j)=='}') + { + graph--; + if (graph == 0) { block = 0; parse_func = 0; continue; } + } + } + if (block == 0) + { + stripped += currline.at(j); + if(currline.at(j) == '{') args_par++; + if(currline.at(j) == '}') + { + args_par--; + if (args_par == 0) + { + //stripped = stripped.simplifyWhiteSpace(); + if(func_on == true) + { + if (treeMode) + { + node = new QListViewItem(clsNode, lastClsNode, stripped); + lastClsNode = node; + } + else + node = new QListViewItem(symbols, symbols->lastItem(), stripped); + node->setPixmap(0, (const QPixmap &)cls); + node->setText(1, QString::number( i, 10)); + } + stripped = ""; + block = 1; + } + } + } // block = 0 + } // for j loop + }//func_on + } // not a comment + } //for i loop + + //positions.resize(symbols->itemIndex(node) + 1); +} + |