SF.net SVN: geany:[3190] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Fri Nov 7 14:39:46 UTC 2008


Revision: 3190
          http://geany.svn.sourceforge.net/geany/?rev=3190&view=rev
Author:   eht16
Date:     2008-11-07 14:39:45 +0000 (Fri, 07 Nov 2008)

Log Message:
-----------
Add new filetype 'Matlab' (closes #1938631, patch by Roland Baudin, thanks).

Modified Paths:
--------------
    trunk/THANKS
    trunk/data/filetype_extensions.conf
    trunk/scintilla/KeyWords.cxx
    trunk/scintilla/Makefile.am
    trunk/scintilla/makefile.win32
    trunk/src/editor.c
    trunk/src/filetypes.c
    trunk/src/filetypes.h
    trunk/src/highlighting.c
    trunk/src/plugindata.h
    trunk/src/symbols.c
    trunk/src/templates.c
    trunk/tagmanager/Makefile.am
    trunk/tagmanager/makefile.win32
    trunk/tagmanager/parsers.h
    trunk/wscript

Added Paths:
-----------
    trunk/data/filetypes.matlab
    trunk/scintilla/LexMatlab.cxx
    trunk/tagmanager/matlab.c

Modified: trunk/THANKS
===================================================================
--- trunk/THANKS	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/THANKS	2008-11-07 14:39:45 UTC (rev 3190)
@@ -50,6 +50,7 @@
 Jason Oster <parasytic(at)users(dot)sourceforge(dot)net> - various patches
 Andrew Rowland <weibullguy(at)charter(dot)net> - R filetype patch
 Bronisław Białek <after89(at)gmail(dot)com> - CSS parser update
+Roland Baudin <roland(dot)baudin(at)thalesaleniaspace(dot)com> - Matlab filetype patch
 
 Translators:
 ------------

Modified: trunk/data/filetype_extensions.conf
===================================================================
--- trunk/data/filetype_extensions.conf	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/data/filetype_extensions.conf	2008-11-07 14:39:45 UTC (rev 3190)
@@ -23,6 +23,7 @@
 Javascript=*.js;
 Lua=*.lua;
 Make=*.mak;*.mk;GNUmakefile;makefile;Makefile;makefile.*;Makefile.*;
+Matlab=*.m;
 O-Matrix=*.oms;
 Perl=*.pl;*.perl;*.pm;*.agi;*.pod;
 PHP=*.php;*.php3;*.php4;*.php5;*.phtml;

Added: trunk/data/filetypes.matlab
===================================================================
--- trunk/data/filetypes.matlab	                        (rev 0)
+++ trunk/data/filetypes.matlab	2008-11-07 14:39:45 UTC (rev 3190)
@@ -0,0 +1,38 @@
+# For complete documentation of this file, please see Geany's main documentation
+[styling]
+# foreground;background;bold;italic
+default=0x000000;0xffffff;false;false
+comment=0x808080;0xffffff;false;false
+command=0x111199;0xffffff;true;false
+number=0x007f00;0xffffff;false;false
+keyword=0x001a7f;0xffffff;true;false
+string=0xff901e;0xffffff;false;false
+operator=0x301010;0xffffff;false;false
+identifier=0x000000;0xffffff;false;false
+doublequotedstring=0xff901e;0xffffff;false;false
+
+[keywords]
+# all items must be in one line
+primary=break case catch continue else elseif end for function global if otherwise persistent return switch try while
+
+[settings]
+# default extension used when saving files
+#extension=m
+
+# the following characters are these which a "word" can contains, see documentation
+#wordchars=_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
+
+# if only single comment char is supported like # in this file, leave comment_close blank
+comment_open=%
+comment_close=
+
+# set to false if a comment character/string should start at column 0 of a line, true uses any
+# indentation of the line, e.g. setting to true causes the following on pressing CTRL+d
+	#command_example();
+# setting to false would generate this
+#	command_example();
+# This setting works only for single line comments
+comment_use_indent=true
+
+# context action command (please see Geany's main documentation for details)
+context_action_cmd=

Modified: trunk/scintilla/KeyWords.cxx
===================================================================
--- trunk/scintilla/KeyWords.cxx	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/scintilla/KeyWords.cxx	2008-11-07 14:39:45 UTC (rev 3190)
@@ -160,6 +160,7 @@
 	LINK_LEXER(lmLatex);
 	LINK_LEXER(lmLua);
 	LINK_LEXER(lmMake);
+	LINK_LEXER(lmMatlab);
 	LINK_LEXER(lmNncrontab);
 	LINK_LEXER(lmNull);
 	LINK_LEXER(lmOMS);

Added: trunk/scintilla/LexMatlab.cxx
===================================================================
--- trunk/scintilla/LexMatlab.cxx	                        (rev 0)
+++ trunk/scintilla/LexMatlab.cxx	2008-11-07 14:39:45 UTC (rev 3190)
@@ -0,0 +1,236 @@
+// Scintilla source code edit control
+/** @file LexMatlab.cxx
+ ** Lexer for Matlab.
+ ** Written by Jos\xE9 Fonseca
+ **
+ ** Changes by Christoph Dalitz 2003/12/04:
+ **   - added support for Octave
+ **   - Strings can now be included both in single or double quotes
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh at scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#ifdef SCI_NAMESPACE
+using namespace Scintilla;
+#endif
+
+static bool IsMatlabCommentChar(int c) {
+	return (c == '%') ;
+}
+
+static bool IsOctaveCommentChar(int c) {
+	return (c == '%' || c == '#') ;
+}
+
+static bool IsMatlabComment(Accessor &styler, int pos, int len) {
+	return len > 0 && IsMatlabCommentChar(styler[pos]) ;
+}
+
+static bool IsOctaveComment(Accessor &styler, int pos, int len) {
+	return len > 0 && IsOctaveCommentChar(styler[pos]) ;
+}
+
+static inline bool IsAWordChar(const int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+static inline bool IsAWordStart(const int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+static void ColouriseMatlabOctaveDoc(
+            unsigned int startPos, int length, int initStyle,
+            WordList *keywordlists[], Accessor &styler,
+            bool (*IsCommentChar)(int)) {
+
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	bool transpose = false;
+
+	StyleContext sc(startPos, length, initStyle, styler);
+
+	for (; sc.More(); sc.Forward()) {
+
+		if (sc.state == SCE_MATLAB_OPERATOR) {
+			if (sc.chPrev == '.') {
+				if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') {
+					sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+					transpose = false;
+				} else if (sc.ch == '\'') {
+					sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+					transpose = true;
+				} else {
+					sc.SetState(SCE_MATLAB_DEFAULT);
+				}
+			} else {
+				sc.SetState(SCE_MATLAB_DEFAULT);
+			}
+		} else if (sc.state == SCE_MATLAB_KEYWORD) {
+			if (!isalnum(sc.ch) && sc.ch != '_') {
+				char s[100];
+				sc.GetCurrentLowered(s, sizeof(s));
+				if (keywords.InList(s)) {
+					sc.SetState(SCE_MATLAB_DEFAULT);
+					transpose = false;
+				} else {
+					sc.ChangeState(SCE_MATLAB_IDENTIFIER);
+					sc.SetState(SCE_MATLAB_DEFAULT);
+					transpose = true;
+				}
+			}
+		} else if (sc.state == SCE_MATLAB_NUMBER) {
+			if (!isdigit(sc.ch) && sc.ch != '.'
+			        && !(sc.ch == 'e' || sc.ch == 'E')
+			        && !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))) {
+				sc.SetState(SCE_MATLAB_DEFAULT);
+				transpose = true;
+			}
+		} else if (sc.state == SCE_MATLAB_STRING) {
+			if (sc.ch == '\\') {
+				if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+					sc.Forward();
+				}
+			} else if (sc.ch == '\'') {
+				sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+			}
+		} else if (sc.state == SCE_MATLAB_DOUBLEQUOTESTRING) {
+			if (sc.ch == '\\') {
+				if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+					sc.Forward();
+				}
+			} else if (sc.ch == '\"') {
+				sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+			}
+		} else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
+			if (sc.atLineEnd) {
+				sc.SetState(SCE_MATLAB_DEFAULT);
+				transpose = false;
+			}
+		}
+
+		if (sc.state == SCE_MATLAB_DEFAULT) {
+			if (IsCommentChar(sc.ch)) {
+				sc.SetState(SCE_MATLAB_COMMENT);
+			} else if (sc.ch == '!' && sc.chNext != '=' ) {
+				sc.SetState(SCE_MATLAB_COMMAND);
+			} else if (sc.ch == '\'') {
+				if (transpose) {
+					sc.SetState(SCE_MATLAB_OPERATOR);
+				} else {
+					sc.SetState(SCE_MATLAB_STRING);
+				}
+			} else if (sc.ch == '"') {
+				sc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);
+			} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
+				sc.SetState(SCE_MATLAB_NUMBER);
+			} else if (isalpha(sc.ch)) {
+				sc.SetState(SCE_MATLAB_KEYWORD);
+			} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '\\') {
+				if (sc.ch == ')' || sc.ch == ']') {
+					transpose = true;
+				} else {
+					transpose = false;
+				}
+				sc.SetState(SCE_MATLAB_OPERATOR);
+			} else {
+				transpose = false;
+			}
+		}
+	}
+	sc.Complete();
+}
+
+static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+	ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabCommentChar);
+}
+
+static void ColouriseOctaveDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+	ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveCommentChar);
+}
+
+static void FoldMatlabOctaveDoc(unsigned int startPos, int length, int,
+                                WordList *[], Accessor &styler,
+                                bool (*IsComment)(Accessor&, int, int)) {
+
+	int endPos = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+		}
+	}
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsComment);
+	char chNext = styler[startPos];
+	for (int i = startPos; i < endPos; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsComment);
+			if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
+				// Only non whitespace lines can be headers
+				if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
+					lev |= SC_FOLDLEVELHEADERFLAG;
+				} else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
+					// Line after is blank so check the next - maybe should continue further?
+					int spaceFlags2 = 0;
+					int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+
+static void FoldMatlabDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+	FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabComment);
+}
+
+static void FoldOctaveDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+	FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveComment);
+}
+
+static const char * const matlabWordListDesc[] = {
+	"Keywords",
+	0
+};
+
+static const char * const octaveWordListDesc[] = {
+	"Keywords",
+	0
+};
+
+LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
+
+LexerModule lmOctave(SCLEX_OCTAVE, ColouriseOctaveDoc, "octave", FoldOctaveDoc, octaveWordListDesc);

Modified: trunk/scintilla/Makefile.am
===================================================================
--- trunk/scintilla/Makefile.am	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/scintilla/Makefile.am	2008-11-07 14:39:45 UTC (rev 3190)
@@ -19,6 +19,7 @@
 LexHTML.cxx \
 LexLua.cxx \
 LexOMS.cxx \
+LexMatlab.cxx \
 LexOthers.cxx \
 LexPascal.cxx \
 LexPerl.cxx \

Modified: trunk/scintilla/makefile.win32
===================================================================
--- trunk/scintilla/makefile.win32	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/scintilla/makefile.win32	2008-11-07 14:39:45 UTC (rev 3190)
@@ -61,7 +61,7 @@
 #**LEXOBJS=\\\n\(\*.o \)
 LEXOBJS=\
 LexBash.o LexAsm.o LexCSS.o LexCPP.o LexCrontab.o LexHTML.o LexOthers.o LexPascal.o \
-LexPerl.o LexPython.o LexSQL.o LexCaml.o LexOMS.o LexTCL.o LexRuby.o LexFortran.o LexVHDL.o \
+LexPerl.o LexPython.o LexSQL.o LexCaml.o LexOMS.o LexTCL.o LexRuby.o LexFortran.o LexVHDL.o LexMatlab.o \
 LexD.o LexLua.o LexHaskell.o LexBasic.o LexR.o
 #--Autogenerated -- end of automatically generated section
 

Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/editor.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -2763,6 +2763,10 @@
 		case SCLEX_FREEBASIC:
 			return (style == SCE_B_STRING);
 
+		case SCLEX_MATLAB:
+			return (style == SCE_MATLAB_STRING ||
+				style == SCE_MATLAB_DOUBLEQUOTESTRING);
+
 		case SCLEX_HTML:
 			return (style == SCE_HPHP_SIMPLESTRING ||
 				style == SCE_HPHP_HSTRING ||  /* HSTRING is a heredoc */
@@ -2846,6 +2850,9 @@
 				style == SCE_TCL_COMMENT_BOX ||
 				style == SCE_TCL_BLOCK_COMMENT);
 
+		case SCLEX_MATLAB:
+			return (style == SCE_MATLAB_COMMENT);
+
 		case SCLEX_LUA:
 			return (style == SCE_LUA_COMMENT ||
 				style == SCE_LUA_COMMENTLINE ||
@@ -4095,6 +4102,7 @@
 		case SCLEX_FREEBASIC:
 		case SCLEX_D:
 		case SCLEX_OMS:
+		case SCLEX_MATLAB:
 			mode = SC_IV_LOOKBOTH;
 			break;
 

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/filetypes.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -495,6 +495,17 @@
 	ft->comment_close = NULL;
 	ft->group = GEANY_FILETYPE_GROUP_MISC;
 
+#define MATLAB
+	ft = filetypes[GEANY_FILETYPES_MATLAB];
+	ft->lang = 32;
+	ft->name = g_strdup("Matlab");
+	ft->title = g_strdup_printf(_("%s source file"), "Matlab");
+	ft->extension = g_strdup("m");
+	ft->pattern = utils_strv_new("*.m", NULL);
+	ft->comment_open = g_strdup("%");
+	ft->comment_close = NULL;
+	ft->group = GEANY_FILETYPE_GROUP_SCRIPT;
+
 #define ALL
 	ft = filetypes[GEANY_FILETYPES_NONE];
 	ft->lang = -2;

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/filetypes.h	2008-11-07 14:39:45 UTC (rev 3190)
@@ -57,6 +57,7 @@
 	GEANY_FILETYPES_JS,
 	GEANY_FILETYPES_LUA,
 	GEANY_FILETYPES_MAKE,
+	GEANY_FILETYPES_MATLAB,
 	GEANY_FILETYPES_OMS,
 	GEANY_FILETYPES_PERL,
 	GEANY_FILETYPES_PHP,

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/highlighting.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -2579,6 +2579,52 @@
 	set_sci_style(sci, SCE_TCL_WORD5, GEANY_FILETYPES_TCL, 15);
 }
 
+
+static void styleset_matlab_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
+{
+	new_style_array(GEANY_FILETYPES_MATLAB, 9);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "command", "0x111199", "0xffffff", "true", &style_sets[GEANY_FILETYPES_MATLAB].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "keyword", "0x001a7f", "0xffffff", "true", &style_sets[GEANY_FILETYPES_MATLAB].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "doublequotedstring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MATLAB].styling[8]);
+
+	style_sets[GEANY_FILETYPES_MATLAB].keywords = g_new(gchar*, 2);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_MATLAB, 0, "break case catch continue else elseif end for function global if otherwise persistent return switch try while");
+	style_sets[GEANY_FILETYPES_MATLAB].keywords[1] = NULL;
+
+	get_keyfile_wordchars(config, config_home,
+		&style_sets[GEANY_FILETYPES_MATLAB].wordchars);
+}
+
+
+static void styleset_matlab(ScintillaObject *sci)
+{
+	const filetype_id ft_id = GEANY_FILETYPES_MATLAB;
+
+	styleset_common(sci);
+
+	apply_filetype_properties(sci, SCLEX_MATLAB, ft_id);
+
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_MATLAB].keywords[0]);
+
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_MATLAB, 0);
+	set_sci_style(sci, SCE_MATLAB_DEFAULT, GEANY_FILETYPES_MATLAB, 0);
+	set_sci_style(sci, SCE_MATLAB_COMMENT, GEANY_FILETYPES_MATLAB, 1);
+	set_sci_style(sci, SCE_MATLAB_COMMAND, GEANY_FILETYPES_MATLAB, 2);
+	set_sci_style(sci, SCE_MATLAB_NUMBER, GEANY_FILETYPES_MATLAB, 3);
+	set_sci_style(sci, SCE_MATLAB_KEYWORD, GEANY_FILETYPES_MATLAB, 4);
+	set_sci_style(sci, SCE_MATLAB_STRING, GEANY_FILETYPES_MATLAB, 5);
+	set_sci_style(sci, SCE_MATLAB_OPERATOR, GEANY_FILETYPES_MATLAB, 6);
+	set_sci_style(sci, SCE_MATLAB_IDENTIFIER, GEANY_FILETYPES_MATLAB, 7);
+	set_sci_style(sci, SCE_MATLAB_DOUBLEQUOTESTRING, GEANY_FILETYPES_MATLAB, 8);
+}
+
+
 static void styleset_d_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
 {
 	new_style_array(GEANY_FILETYPES_D, 18);
@@ -3087,6 +3133,7 @@
 		init_styleset_case(GEANY_FILETYPES_LATEX,	latex);
 		init_styleset_case(GEANY_FILETYPES_LUA,		lua);
 		init_styleset_case(GEANY_FILETYPES_MAKE,	makefile);
+		init_styleset_case(GEANY_FILETYPES_MATLAB,	matlab);
 		init_styleset_case(GEANY_FILETYPES_OMS,		oms);
 		init_styleset_case(GEANY_FILETYPES_PASCAL,	pascal);
 		init_styleset_case(GEANY_FILETYPES_PERL,	perl);
@@ -3143,6 +3190,7 @@
 		styleset_case(GEANY_FILETYPES_LATEX,	latex);
 		styleset_case(GEANY_FILETYPES_LUA,		lua);
 		styleset_case(GEANY_FILETYPES_MAKE,		makefile);
+		styleset_case(GEANY_FILETYPES_MATLAB,	matlab);
 		styleset_case(GEANY_FILETYPES_OMS,		oms);
 		styleset_case(GEANY_FILETYPES_PASCAL,	pascal);
 		styleset_case(GEANY_FILETYPES_PERL,		perl);

Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/plugindata.h	2008-11-07 14:39:45 UTC (rev 3190)
@@ -41,13 +41,13 @@
 enum {
 	/** The Application Programming Interface (API) version, incremented
 	 * whenever any plugin data types are modified or appended to. */
-	GEANY_API_VERSION = 104,
+	GEANY_API_VERSION = 105,
 
 	/** The Application Binary Interface (ABI) version, incremented whenever
 	 * existing fields in the plugin data types have to be changed or reordered. */
 	/* This should usually stay the same if fields are only appended, assuming only pointers to
 	 * structs and not structs themselves are declared by plugins. */
-	GEANY_ABI_VERSION = 47
+	GEANY_ABI_VERSION = 48
 };
 
 /** Check the plugin can be loaded by Geany.

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/symbols.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -623,6 +623,14 @@
 				NULL);
 			break;
 		}
+		case GEANY_FILETYPES_MATLAB:
+		{
+			tag_list_add_groups(tag_store,
+				&(tv_iters.tag_function), _("Functions"), "classviewer-method",
+				&(tv_iters.tag_struct), _("Structures"), "classviewer-struct",
+				NULL);
+			break;
+		}
 		case GEANY_FILETYPES_PERL:
 		{
 			tag_list_add_groups(tag_store,

Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/src/templates.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -548,6 +548,7 @@
 		}
 
 		case GEANY_FILETYPES_LATEX:
+		case GEANY_FILETYPES_MATLAB:
 		{
 			line_prefix = "%";
 			break;

Modified: trunk/tagmanager/Makefile.am
===================================================================
--- trunk/tagmanager/Makefile.am	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/tagmanager/Makefile.am	2008-11-07 14:39:45 UTC (rev 3190)
@@ -49,6 +49,7 @@
 	asm.c\
 	latex.c\
 	lregex.c\
+	matlab.c\
 	pascal.c\
 	perl.c\
 	rest.c\

Modified: trunk/tagmanager/makefile.win32
===================================================================
--- trunk/tagmanager/makefile.win32	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/tagmanager/makefile.win32	2008-11-07 14:39:45 UTC (rev 3190)
@@ -41,7 +41,7 @@
 
 $(COMPLIB): args.o c.o fortran.o make.o conf.o pascal.o perl.o php.o diff.o vhdl.o lua.o js.o \
 haskell.o haxe.o html.o python.o lregex.o rest.o sh.o ctags.o entry.o get.o keyword.o options.o \
-parse.o basic.o read.o sort.o strlist.o latex.o docbook.o tcl.o ruby.o asm.o sql.o css.o \
+parse.o basic.o read.o sort.o strlist.o latex.o matlab.o docbook.o tcl.o ruby.o asm.o sql.o css.o \
 vstring.o regex.o tm_workspace.o tm_work_object.o tm_source_file.o tm_project.o tm_tag.o \
 tm_symbol.o tm_file_entry.o tm_tagmanager.o
 	$(AR) rc $@ $^

Added: trunk/tagmanager/matlab.c
===================================================================
--- trunk/tagmanager/matlab.c	                        (rev 0)
+++ trunk/tagmanager/matlab.c	2008-11-07 14:39:45 UTC (rev 3190)
@@ -0,0 +1,150 @@
+/*
+*
+*   Copyright (c) 2000-2001, Darren Hiebert
+*
+*   This source code is released for free distribution under the terms of the
+*   GNU General Public License.
+*
+*   This module contains functions for generating tags for Matlab scripts.
+*   The tags 'function' and 'struct' are parsed.
+*	Author Roland Baudin <roland65 at free.fr>
+*/
+
+/*
+*   INCLUDE FILES
+*/
+#include "general.h"	/* must always come first */
+
+#include <string.h>
+
+#include "parse.h"
+#include "read.h"
+#include "vstring.h"
+
+/*
+*   DATA DEFINITIONS
+*/
+typedef enum {
+    K_FUNCTION,
+	K_STRUCT
+} MatlabKind;
+
+static kindOption MatlabKinds [] = {
+    { TRUE, 'f', "function", "Functions" },
+	{ TRUE, 's', "struct", "Structures" },
+};
+
+/*
+*   FUNCTION DEFINITIONS
+*/
+
+static void findMatlabTags (void)
+{
+    vString *name = vStringNew ();
+    const unsigned char *line;
+	const unsigned char *p;
+
+    while ((line = fileReadLine ()) != NULL)
+    {
+		int i, ic;
+
+		if (line [0] == '\0'  ||  line [0] == '%')
+			continue;
+
+		/* search if the line has a comment */
+		for (ic = 0  ;  line [ic] != '\0'  &&  line [ic]!='%'  ;  ++ic)
+			;
+
+		/* function tag */
+
+		/* read first word */
+		for (i = 0  ;  line [i] != '\0'  &&  ! isspace (line [i])  ;  ++i)
+			;
+
+		if (strncmp ((const char *) line, "function", (size_t) 8) == 0)
+		{
+			const unsigned char *cp = line + i;
+			const unsigned char *ptr = cp;
+			boolean eq=FALSE;
+
+			while (isspace ((int) *cp))
+				++cp;
+
+			/* search for '=' character in the line */
+			while (*ptr != '\0')
+			{
+				if (*ptr == '=')
+				{
+					eq=TRUE;
+					break;
+				}
+				ptr++;
+			}
+
+			/* '=' was found => get the right most part of the line after '=' and before '%' */
+			if (eq)
+			{
+				ptr++;
+				while (isspace ((int) *ptr))
+					++ptr;
+
+				while (*ptr != '\0' && *ptr != '%')
+				{
+					vStringPut (name, (int) *ptr);
+					++ptr;
+				}
+			}
+
+			/* '=' was not found => get the right most part of the line after
+			 * 'function' and before '%' */
+			else
+			{
+				while (*cp != '\0' && *cp != '%')
+				{
+					vStringPut (name, (int) *cp);
+					++cp;
+				}
+			}
+
+			vStringTerminate (name);
+			makeSimpleTag (name, MatlabKinds, K_FUNCTION);
+			vStringClear (name);
+		}
+
+		/* struct tag */
+
+		/* search if the line contains the keyword 'struct' */
+		p=(const unsigned char*) strstr ((const char*) line, "struct");
+
+		/* and avoid the part after the '%' if any */
+		if ( p != NULL && ic>0 && p < line+ic)
+		{
+			const unsigned char *cp = line;
+
+			/* get the left most part of the line before '=' */
+			while (*cp != '\0' && !isspace(*cp) && *cp != '=' )
+			{
+				vStringPut (name, (int) *cp);
+				++cp;
+			}
+
+			vStringTerminate (name);
+			makeSimpleTag (name, MatlabKinds, K_STRUCT);
+			vStringClear (name);
+		}
+    }
+    vStringDelete (name);
+}
+
+extern parserDefinition* MatlabParser (void)
+{
+    static const char *const extensions [] = { "m", NULL };
+    parserDefinition* def = parserNew ("Matlab");
+    def->kinds      = MatlabKinds;
+    def->kindCount  = KIND_COUNT (MatlabKinds);
+    def->extensions = extensions;
+    def->parser     = findMatlabTags;
+    return def;
+}
+
+/* vi:set tabstop=8 shiftwidth=4: */


Property changes on: trunk/tagmanager/matlab.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Modified: trunk/tagmanager/parsers.h
===================================================================
--- trunk/tagmanager/parsers.h	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/tagmanager/parsers.h	2008-11-07 14:39:45 UTC (rev 3190)
@@ -46,7 +46,8 @@
     RestParser, \
     HtmlParser, \
     F77Parser, \
-    GLSLParser
+    GLSLParser, \
+    MatlabParser
 
 /*
 langType of each parser
@@ -82,6 +83,7 @@
 29  HtmlParser
 30  F77Parser
 31  GLSLParser
+32  MatlabParser
 */
 #endif	/* _PARSERS_H */
 

Modified: trunk/wscript
===================================================================
--- trunk/wscript	2008-11-07 14:38:51 UTC (rev 3189)
+++ trunk/wscript	2008-11-07 14:39:45 UTC (rev 3190)
@@ -56,7 +56,8 @@
 	'tagmanager/docbook.c', 'tagmanager/entry.c', 'tagmanager/fortran.c', 'tagmanager/get.c',
 	'tagmanager/haskell.c', 'tagmanager/haxe.c', 'tagmanager/html.c', 'tagmanager/js.c',
 	'tagmanager/keyword.c', 'tagmanager/latex.c', 'tagmanager/lregex.c', 'tagmanager/lua.c',
-	'tagmanager/make.c', 'tagmanager/options.c', 'tagmanager/parse.c', 'tagmanager/pascal.c',
+	'tagmanager/make.c', 'tagmanager/matlab.c', 'tagmanager/options.c', 'tagmanager/parse.c',
+	'tagmanager/pascal.c',
 	'tagmanager/perl.c', 'tagmanager/php.c', 'tagmanager/python.c', 'tagmanager/read.c',
 	'tagmanager/rest.c', 'tagmanager/ruby.c', 'tagmanager/sh.c', 'tagmanager/sort.c',
 	'tagmanager/sql.c', 'tagmanager/strlist.c', 'tagmanager/tcl.c', 'tagmanager/tm_file_entry.c',
@@ -75,7 +76,7 @@
 	'scintilla/LexFortran.cxx', 'scintilla/LexHaskell.cxx', 'scintilla/LexHTML.cxx',
 	'scintilla/LexLua.cxx', 'scintilla/LexOMS.cxx', 'scintilla/LexOthers.cxx',
 	'scintilla/LexPascal.cxx', 'scintilla/LexPerl.cxx', 'scintilla/LexPython.cxx',
-	'scintilla/LexR.cxx',
+	'scintilla/LexR.cxx', 'scintilla/LexMatlab.cxx',
 	'scintilla/LexRuby.cxx', 'scintilla/LexSQL.cxx', 'scintilla/LexTCL.cxx',
 	'scintilla/LexVHDL.cxx', 'scintilla/LineMarker.cxx', 'scintilla/PlatGTK.cxx',
 	'scintilla/PositionCache.cxx', 'scintilla/PropSet.cxx', 'scintilla/RESearch.cxx',


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list