SF.net SVN: geany:[5266] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Thu Sep 30 16:59:23 UTC 2010


Revision: 5266
          http://geany.svn.sourceforge.net/geany/?rev=5266&view=rev
Author:   ntrel
Date:     2010-09-30 16:59:22 +0000 (Thu, 30 Sep 2010)

Log Message:
-----------
Add Forth filetype (patch by Thomas Huth, thanks).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/THANKS
    trunk/data/filetype_extensions.conf
    trunk/scintilla/KeyWords.cxx
    trunk/scintilla/Makefile.am
    trunk/scintilla/makefile.win32
    trunk/src/about.c
    trunk/src/filetypes.c
    trunk/src/filetypes.h
    trunk/src/highlighting.c
    trunk/wscript

Added Paths:
-----------
    trunk/data/filetypes.forth
    trunk/scintilla/LexForth.cxx

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/ChangeLog	2010-09-30 16:59:22 UTC (rev 5266)
@@ -14,6 +14,12 @@
  * src/document.c:
    Avoid delay and redrawing when automatically opening a new document
    after closing one.
+ * scintilla/LexForth.cxx, scintilla/makefile.win32,
+   scintilla/KeyWords.cxx, scintilla/Makefile.am, src/highlighting.c,
+   src/about.c, src/filetypes.c, src/filetypes.h, THANKS,
+   data/filetypes.forth, data/filetype_extensions.conf, ChangeLog,
+   wscript:
+   Add Forth filetype (patch by Thomas Huth, thanks).
 
 
 2010-09-25  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/THANKS
===================================================================
--- trunk/THANKS	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/THANKS	2010-09-30 16:59:22 UTC (rev 5266)
@@ -82,6 +82,7 @@
 Daniel Marjamaki <danielm77(at)spray(dot)se> - Small improvements
 Jiří Techet <techet(at)gmail(dot)com> - Various patches
 Erik de Castro Lopo <mle+tools(at)mega-nerd(dot)com> - Various patches
+Thomas Huth <th(dot)huth(at)googlemail(dot)com> - Forth filetype
 
 Translators:
 ------------

Modified: trunk/data/filetype_extensions.conf
===================================================================
--- trunk/data/filetype_extensions.conf	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/data/filetype_extensions.conf	2010-09-30 16:59:22 UTC (rev 5266)
@@ -37,6 +37,7 @@
 Tcl=*.tcl;*.tk;*.wish;
 CSS=*.css;
 Docbook=*.docbook;
+Forth=*.fs;*.fth;
 HTML=*.htm;*.html;*.shtml;*.hta;*.htd;*.htt;*.cfm;
 XML=*.xml;*.sgml;*.xsl;*.xslt;*.xsd;*.xhtml;
 CMake=CMakeLists.txt;*.cmake;*.ctest;

Added: trunk/data/filetypes.forth
===================================================================
--- trunk/data/filetypes.forth	                        (rev 0)
+++ trunk/data/filetypes.forth	2010-09-30 16:59:22 UTC (rev 5266)
@@ -0,0 +1,45 @@
+# For complete documentation of this file, please see Geany's main documentation
+[styling]
+# foreground;background;bold;italic
+default=default
+comment=commentdoc
+commentml=comment
+identifier=default
+control=0x301010;0xffffff;true;false
+keyword=0x301060;0xffffff;true;false
+defword=0x000080;;false;true
+preword1=0x000000;0xe0c0e0;false;false
+preword2=0xaaaaaa;0xffffff;false;true
+number=0x007f00;0xffffff;false;false
+string=string
+locale=0xff0000;0xffffff;false;true
+
+[keywords]
+# all items must be in one line
+primary=ABORT EXIT DO LOOP UNLOOP BEGIN UNTIL WHILE REPEAT EXIT IF ELSE THEN CASE ENDCASE OF ENDOF
+
+
+[settings]
+# default extension used when saving files
+#extension=fs
+
+# 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= )
+
+# 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=


Property changes on: trunk/data/filetypes.forth
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Modified: trunk/scintilla/KeyWords.cxx
===================================================================
--- trunk/scintilla/KeyWords.cxx	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/scintilla/KeyWords.cxx	2010-09-30 16:59:22 UTC (rev 5266)
@@ -338,6 +338,7 @@
 	LINK_LEXER(lmD);
 	LINK_LEXER(lmDiff);
 	LINK_LEXER(lmF77);
+	LINK_LEXER(lmForth);
 	LINK_LEXER(lmFortran);
 	LINK_LEXER(lmFreeBasic);
 	LINK_LEXER(lmHaskell);

Added: trunk/scintilla/LexForth.cxx
===================================================================
--- trunk/scintilla/LexForth.cxx	                        (rev 0)
+++ trunk/scintilla/LexForth.cxx	2010-09-30 16:59:22 UTC (rev 5266)
@@ -0,0 +1,176 @@
+// Scintilla source code edit control
+/** @file LexForth.cxx
+ ** Lexer for FORTH
+ **/
+// Copyright 1998-2003 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 inline bool IsAWordChar(int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '.' ||
+		ch == '_' || ch == '?' || ch == '"' || ch == '@' ||
+		ch == '!' || ch == '[' || ch == ']' || ch == '/' ||
+		ch == '+' || ch == '-' || ch == '*' || ch == '<' ||
+		ch == '>' || ch == '=' || ch == ';' || ch == '(' ||
+		ch == ')' );
+}
+
+static inline bool IsAWordStart(int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
+}
+
+static inline bool IsANumChar(int ch) {
+	return (ch < 0x80) && (isxdigit(ch) || ch == '.' || ch == 'e' || ch == 'E' );
+}
+
+static inline bool IsASpaceChar(int ch) {
+	return (ch < 0x80) && isspace(ch);
+}
+
+static void ColouriseForthDoc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[],
+                            Accessor &styler) {
+
+    WordList &control = *keywordLists[0];
+    WordList &keyword = *keywordLists[1];
+    WordList &defword = *keywordLists[2];
+    WordList &preword1 = *keywordLists[3];
+    WordList &preword2 = *keywordLists[4];
+    WordList &strings = *keywordLists[5];
+
+	StyleContext sc(startPos, length, initStyle, styler);
+
+	for (; sc.More(); sc.Forward())
+	{
+		// Determine if the current state should terminate.
+		if (sc.state == SCE_FORTH_COMMENT) {
+			if (sc.atLineEnd) {
+				sc.SetState(SCE_FORTH_DEFAULT);
+			}
+		}else if (sc.state == SCE_FORTH_COMMENT_ML) {
+			if (sc.ch == ')') {
+				sc.ForwardSetState(SCE_FORTH_DEFAULT);
+			}
+		}else if (sc.state == SCE_FORTH_IDENTIFIER || sc.state == SCE_FORTH_NUMBER) {
+			// handle numbers here too, because what we thought was a number might
+			// turn out to be a keyword e.g. 2DUP
+			if (IsASpaceChar(sc.ch) ) {
+				char s[100];
+				sc.GetCurrentLowered(s, sizeof(s));
+				int newState = sc.state == SCE_FORTH_NUMBER ? SCE_FORTH_NUMBER : SCE_FORTH_DEFAULT;
+				if (control.InList(s)) {
+					sc.ChangeState(SCE_FORTH_CONTROL);
+				} else if (keyword.InList(s)) {
+					sc.ChangeState(SCE_FORTH_KEYWORD);
+				} else if (defword.InList(s)) {
+					sc.ChangeState(SCE_FORTH_DEFWORD);
+				}  else if (preword1.InList(s)) {
+					sc.ChangeState(SCE_FORTH_PREWORD1);
+				} else if (preword2.InList(s)) {
+					sc.ChangeState(SCE_FORTH_PREWORD2);
+				} else if (strings.InList(s)) {
+					sc.ChangeState(SCE_FORTH_STRING);
+					newState = SCE_FORTH_STRING;
+				}
+				sc.SetState(newState);
+			}
+			if (sc.state == SCE_FORTH_NUMBER) {
+				if (IsASpaceChar(sc.ch)) {
+					sc.SetState(SCE_FORTH_DEFAULT);
+				} else if (!IsANumChar(sc.ch)) {
+					sc.ChangeState(SCE_FORTH_IDENTIFIER);
+				}
+			}
+		}else if (sc.state == SCE_FORTH_STRING) {
+			if (sc.ch == '\"') {
+				sc.ForwardSetState(SCE_FORTH_DEFAULT);
+			}
+		}else if (sc.state == SCE_FORTH_LOCALE) {
+			if (sc.ch == '}') {
+				sc.ForwardSetState(SCE_FORTH_DEFAULT);
+			}
+		}else if (sc.state == SCE_FORTH_DEFWORD) {
+			if (IsASpaceChar(sc.ch)) {
+				sc.SetState(SCE_FORTH_DEFAULT);
+			}
+		}
+
+		// Determine if a new state should be entered.
+		if (sc.state == SCE_FORTH_DEFAULT) {
+			if (sc.ch == '\\'){
+				sc.SetState(SCE_FORTH_COMMENT);
+			} else if (sc.ch == '(' &&
+					(sc.atLineStart || IsASpaceChar(sc.chPrev)) &&
+					(sc.atLineEnd   || IsASpaceChar(sc.chNext))) {
+				sc.SetState(SCE_FORTH_COMMENT_ML);
+			} else if (	(sc.ch == '$' && (isascii(sc.chNext) && isxdigit(sc.chNext))) ) {
+				// number starting with $ is a hex number
+				sc.SetState(SCE_FORTH_NUMBER);
+				while(sc.More() && isascii(sc.chNext) && isxdigit(sc.chNext))
+					sc.Forward();
+			} else if ( (sc.ch == '%' && (isascii(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1'))) ) {
+				// number starting with % is binary
+				sc.SetState(SCE_FORTH_NUMBER);
+				while(sc.More() && isascii(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1'))
+					sc.Forward();
+			} else if (	isascii(sc.ch) && 
+						(isxdigit(sc.ch) || ((sc.ch == '.' || sc.ch == '-') && isascii(sc.chNext) && isxdigit(sc.chNext)) )
+					){
+				sc.SetState(SCE_FORTH_NUMBER);
+			} else if (IsAWordStart(sc.ch)) {
+				sc.SetState(SCE_FORTH_IDENTIFIER);
+			} else if (sc.ch == '{') {
+				sc.SetState(SCE_FORTH_LOCALE);
+			} else if (sc.ch == ':' && isascii(sc.chNext) && isspace(sc.chNext)) {
+				// highlight word definitions e.g.  : GCD ( n n -- n ) ..... ;
+				//                                  ^ ^^^
+				sc.SetState(SCE_FORTH_DEFWORD);
+				while(sc.More() && isascii(sc.chNext) && isspace(sc.chNext))
+					sc.Forward();
+			} else if (sc.ch == ';' &&
+					(sc.atLineStart || IsASpaceChar(sc.chPrev)) &&
+					(sc.atLineEnd   || IsASpaceChar(sc.chNext))	) {
+				// mark the ';' that ends a word
+				sc.SetState(SCE_FORTH_DEFWORD);
+				sc.ForwardSetState(SCE_FORTH_DEFAULT);
+			}
+		}
+
+	}
+	sc.Complete();
+}
+
+static void FoldForthDoc(unsigned int, int, int, WordList *[],
+						Accessor &) {
+}
+
+static const char * const forthWordLists[] = {
+			"control keywords",
+			"keywords",
+			"definition words",
+			"prewords with one argument",
+			"prewords with two arguments",
+			"string definition keywords",
+			0,
+		};
+
+LexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, "forth", FoldForthDoc, forthWordLists);
+
+ 	  	 


Property changes on: trunk/scintilla/LexForth.cxx
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Modified: trunk/scintilla/Makefile.am
===================================================================
--- trunk/scintilla/Makefile.am	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/scintilla/Makefile.am	2010-09-30 16:59:22 UTC (rev 5266)
@@ -15,6 +15,7 @@
 LexCmake.cxx \
 LexCSS.cxx \
 LexD.cxx \
+LexForth.cxx \
 LexFortran.cxx \
 LexHaskell.cxx \
 LexHTML.cxx \

Modified: trunk/scintilla/makefile.win32
===================================================================
--- trunk/scintilla/makefile.win32	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/scintilla/makefile.win32	2010-09-30 16:59:22 UTC (rev 5266)
@@ -61,7 +61,8 @@
 #**LEXOBJS=\\\n\(\*.o \)
 LEXOBJS=\
 LexAda.o LexBash.o LexAsm.o LexCSS.o LexCPP.o LexHTML.o LexOthers.o LexPascal.o \
-LexPerl.o LexPython.o LexSQL.o LexCaml.o LexTCL.o LexTxt2tags.o LexRuby.o LexFortran.o LexVHDL.o LexVerilog.o\
+LexPerl.o LexPython.o LexSQL.o LexCaml.o LexTCL.o LexTxt2tags.o LexRuby.o \
+LexForth.o LexFortran.o LexVHDL.o LexVerilog.o \
 LexMarkdown.o LexMatlab.o \
 LexD.o LexLua.o LexHaskell.o LexBasic.o LexR.o LexYAML.o LexCmake.o LexNsis.o
 #--Autogenerated -- end of automatically generated section

Modified: trunk/src/about.c
===================================================================
--- trunk/src/about.c	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/src/about.c	2010-09-30 16:59:22 UTC (rev 5266)
@@ -95,7 +95,7 @@
 "Jörn Reder, Kelvin Gardiner, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, Marko Peric, Matti Mårds, "
 "Moritz Barsnick, Ondrej Donek, Peter Strand, Philipp Gildein, Pierre Joye, Rob van der Linde, "
 "Robert McGinley, Roland Baudin, Ross McKay, S Jagannathan, Saleem Abdulrasool, "
-"Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Thomas Martitz, Tomás Vírseda, "
+"Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Thomas Huth, Thomas Martitz, Tomás Vírseda, "
 "Tyler Mulligan, Walery Studennikov, Yura Siamashka";
 
 

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/src/filetypes.c	2010-09-30 16:59:22 UTC (rev 5266)
@@ -628,6 +628,17 @@
 	ft->comment_open = g_strdup("--");
 	ft->comment_close = NULL;
 	ft->group = GEANY_FILETYPE_GROUP_COMPILED;
+
+#define FORTH
+	ft = filetypes[GEANY_FILETYPES_FORTH];
+	ft->lang = -2;
+	ft->name = g_strdup("Forth");
+	filetype_make_title(ft, TITLE_SOURCE_FILE);
+	ft->extension = g_strdup("fs");
+	ft->pattern = utils_strv_new("*.fs", "*.fth", NULL);
+	ft->comment_open = g_strdup("\\");
+	ft->comment_close = NULL;
+	ft->group = GEANY_FILETYPE_GROUP_SCRIPT;
 }
 
 

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/src/filetypes.h	2010-09-30 16:59:22 UTC (rev 5266)
@@ -84,6 +84,7 @@
 	GEANY_FILETYPES_TXT2TAGS,
 	GEANY_FILETYPES_ABC,
 	GEANY_FILETYPES_VERILOG,
+	GEANY_FILETYPES_FORTH,
 	/* ^ append items here */
 	GEANY_MAX_BUILT_IN_FILETYPES	/* Don't use this, use filetypes_array->len instead */
 }

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/src/highlighting.c	2010-09-30 16:59:22 UTC (rev 5266)
@@ -2202,6 +2202,52 @@
 }
 
 
+static void styleset_forth_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
+{
+	new_styleset(ft_id, 12);
+
+	get_keyfile_style(config, config_home, "default", &style_sets[ft_id].styling[0]);
+	get_keyfile_style(config, config_home, "comment", &style_sets[ft_id].styling[1]);
+	get_keyfile_style(config, config_home, "commentml", &style_sets[ft_id].styling[2]);
+	get_keyfile_style(config, config_home, "identifier", &style_sets[ft_id].styling[3]);
+	get_keyfile_style(config, config_home, "control", &style_sets[ft_id].styling[4]);
+	get_keyfile_style(config, config_home, "keyword", &style_sets[ft_id].styling[5]);
+	get_keyfile_style(config, config_home, "defword", &style_sets[ft_id].styling[6]);
+	get_keyfile_style(config, config_home, "preword1", &style_sets[ft_id].styling[7]);
+	get_keyfile_style(config, config_home, "preword2", &style_sets[ft_id].styling[8]);
+	get_keyfile_style(config, config_home, "number", &style_sets[ft_id].styling[9]);
+	get_keyfile_style(config, config_home, "string", &style_sets[ft_id].styling[10]);
+	get_keyfile_style(config, config_home, "locale", &style_sets[ft_id].styling[11]);
+
+	style_sets[ft_id].keywords = g_new(gchar*, 2);
+	get_keyfile_keywords(config, config_home, "primary", ft_id, 0);
+	style_sets[ft_id].keywords[1] = NULL;
+
+}
+
+
+static void styleset_forth(ScintillaObject *sci, gint ft_id)
+{
+	apply_filetype_properties(sci, SCLEX_FORTH, ft_id);
+
+	sci_set_keywords(sci, 0, style_sets[ft_id].keywords[0]);
+
+	set_sci_style(sci, STYLE_DEFAULT, ft_id, 0);
+	set_sci_style(sci, SCE_FORTH_DEFAULT, ft_id, 0);
+	set_sci_style(sci, SCE_FORTH_COMMENT, ft_id, 1);
+	set_sci_style(sci, SCE_FORTH_COMMENT_ML, ft_id, 2);
+	set_sci_style(sci, SCE_FORTH_IDENTIFIER, ft_id, 3);
+	set_sci_style(sci, SCE_FORTH_CONTROL, ft_id, 4);
+	set_sci_style(sci, SCE_FORTH_KEYWORD, ft_id, 5);
+	set_sci_style(sci, SCE_FORTH_DEFWORD, ft_id, 6);
+	set_sci_style(sci, SCE_FORTH_PREWORD1, ft_id, 7);
+	set_sci_style(sci, SCE_FORTH_PREWORD2, ft_id, 8);
+	set_sci_style(sci, SCE_FORTH_NUMBER, ft_id, 9);
+	set_sci_style(sci, SCE_FORTH_STRING, ft_id, 10);
+	set_sci_style(sci, SCE_FORTH_LOCALE, ft_id, 11);
+}
+
+
 static void styleset_fortran_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
 {
 	new_styleset(ft_id, 15);
@@ -3233,6 +3279,7 @@
 		init_styleset_case(GEANY_FILETYPES_DOCBOOK,	styleset_docbook_init);
 		init_styleset_case(GEANY_FILETYPES_FERITE,	styleset_ferite_init);
 		init_styleset_case(GEANY_FILETYPES_F77,		styleset_f77_init);
+		init_styleset_case(GEANY_FILETYPES_FORTH,	styleset_forth_init);
 		init_styleset_case(GEANY_FILETYPES_FORTRAN,	styleset_fortran_init);
 		init_styleset_case(GEANY_FILETYPES_HASKELL,	styleset_haskell_init);
 		init_styleset_case(GEANY_FILETYPES_HAXE,	styleset_haxe_init);
@@ -3302,6 +3349,7 @@
 		styleset_case(GEANY_FILETYPES_DOCBOOK,	styleset_docbook);
 		styleset_case(GEANY_FILETYPES_FERITE,	styleset_ferite);
 		styleset_case(GEANY_FILETYPES_F77,		styleset_f77);
+		styleset_case(GEANY_FILETYPES_FORTH,	styleset_forth);
 		styleset_case(GEANY_FILETYPES_FORTRAN,	styleset_fortran);
 		styleset_case(GEANY_FILETYPES_HASKELL,	styleset_haskell);
 		styleset_case(GEANY_FILETYPES_HAXE,		styleset_haxe);

Modified: trunk/wscript
===================================================================
--- trunk/wscript	2010-09-30 14:49:54 UTC (rev 5265)
+++ trunk/wscript	2010-09-30 16:59:22 UTC (rev 5266)
@@ -87,7 +87,7 @@
 	'scintilla/KeyWords.cxx',
 	'scintilla/LexAda.cxx', 'scintilla/LexAsm.cxx', 'scintilla/LexBash.cxx',
 	'scintilla/LexBasic.cxx', 'scintilla/LexCaml.cxx', 'scintilla/LexCmake.cxx', 'scintilla/LexCPP.cxx',
-	'scintilla/LexCSS.cxx', 'scintilla/LexD.cxx',
+	'scintilla/LexCSS.cxx', 'scintilla/LexD.cxx', 'scintilla/LexForth.cxx',
 	'scintilla/LexFortran.cxx', 'scintilla/LexHaskell.cxx', 'scintilla/LexHTML.cxx',
 	'scintilla/LexLua.cxx', 'scintilla/LexMarkdown.cxx', 'scintilla/LexMatlab.cxx',
 	'scintilla/LexNsis.cxx', 'scintilla/LexOthers.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