Split filetype Fortran into Fortran 77 and Fortran 90.

git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@2777 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Enrico Tröger 2008-07-14 18:27:20 +00:00
parent ccd2186f6a
commit ed016dc093
16 changed files with 198 additions and 21 deletions

View File

@ -1,3 +1,13 @@
2008-07-14 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* data/filetype_extensions.conf, data/filetypes.f77,
data/filetypes.fortran, scintilla/KeyWords.cxx, src/document.c,
src/editor.c, src/filetypes.c, src/filetypes.h, src/highlighting.c,
src/msgwindow.c, src/plugindata.h, src/symbols.c, src/templates.c,
tagmanager/fortran.c, tagmanager/parsers.h:
Split filetype Fortran into Fortran 77 and Fortran 90.
2008-07-13 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* data/snippets.conf, doc/geany.html, doc/geany.txt, src/editor.c:

View File

@ -10,7 +10,8 @@ C++=*.cpp;*.cxx;*.c++;*.cc;*.h;*.hpp;*.hxx;*.h++;*.hh;*.C;
C#=*.cs;*.vala;
CAML=*.ml;*.mli;
D=*.d;*.di;
Fortran=*.f;*.for;*.ftn;*.f77;*.f90;*.f95;
F77=*.f;*.for;*.ftn;*.f77;
Fortran=*.f90;*.f95;*.f03;
FreeBasic=*.bas;*.bi;
Haskell=*.hs;*.lhs;
Haxe=*.hx;

59
data/filetypes.f77 Normal file
View File

@ -0,0 +1,59 @@
# 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
number=0x007f00;0xffffff;false;false
string=0xff901e;0xffffff;false;false
operator=0x301010;0xffffff;false;false
identifier=0x000000;0xffffff;false;false
string2=0x111199;0xffffff;true;false
word=0x7f0000;0xffffff;true;false
word2=0x000099;0xffffff;true;false
word3=0x3d670f;0xffffff;true;false
preprocessor=0x007f7f;0xffffff;false;false
operator2=0x301010;0xffffff;true;false
continuation=0x000000;0xffffff;false;false
#continuation=0xff901e;0xf0e080;false;false
stringeol=0x000000;0xe0c0e0;false;false
label=0xa861a8;0xffffff;true;false
[keywords]
# all items must be in one line
primary=access action advance allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank blockdata call case character class close common complex contains continue cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision else elseif elsewhere encoding end endassociate endblockdata enddo endfile endforall endfunction endif endinterface endmodule endprogram endselect endsubroutine endtype endwhere entry eor equivalence err errmsg exist exit external file flush fmt form format formatted function go goto id if implicit in include inout integer inquire intent interface intrinsic iomsg iolength iostat kind len logical module name named namelist nextrec nml none nullify number only open opened operator optional out pad parameter pass pause pending pointer pos position precision print private program protected public quote read readwrite real rec recl recursive result return rewind save select selectcase selecttype sequential sign size stat status stop stream subroutine target then to type unformatted unit use value volatile wait where while write
intrinsic_functions=abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 amax1 amin0 amin1 amod anint any asin asind associated atan atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan datan2 datan2d datand date date_and_time dble dcmplx dconjg dcos dcosd dcosh dcotan ddim dexp dfloat dflotk dfloti dflotj digits dim dimag dint dlog dlog10 dmax1 dmin1 dmod dnint dot_product dprod dreal dsign dsin dsind dsinh dsqrt dtan dtand dtanh eoshift epsilon errsns exp exponent float floati floatj floatk floor fraction free huge iabs iachar iand ibclr ibits ibset ichar idate idim idint idnint ieor ifix iiabs iiand iibclr iibits iibset iidim iidint iidnnt iieor iifix iint iior iiqint iiqnnt iishft iishftc iisign ilen imax0 imax1 imin0 imin1 imod index inint inot int int1 int2 int4 int8 iqint iqnint ior ishft ishftc isign isnan izext jiand jibclr jibits jibset jidim jidint jidnnt jieor jifix jint jior jiqint jiqnnt jishft jishftc jisign jmax0 jmax1 jmin0 jmin1 jmod jnint jnot jzext kiabs kiand kibclr kibits kibset kidim kidint kidnnt kieor kifix kind kint kior kishft kishftc kisign kmax0 kmax1 kmin0 kmin1 kmod knint knot kzext lbound leadz len len_trim lenlge lge lgt lle llt log log10 logical lshift malloc matmul max max0 max1 maxexponent maxloc maxval merge min min0 min1 minexponent minloc minval mod modulo mvbits nearest nint not nworkers number_of_processors pack popcnt poppar precision present product radix random random_number random_seed range real repeat reshape rrspacing rshift scale scan secnds selected_int_kind selected_real_kind set_exponent shape sign sin sind sinh size sizeof sngl snglq spacing spread sqrt sum system_clock tan tand tanh tiny transfer transpose trim ubound unpack verify
user_functions=cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg dcotan dcotand decode dimag dll_export dll_import doublecomplex dreal dvchk encode find flen flush getarg getcharqq getcl getdat getenv gettim hfix ibchng identifier imag int1 int2 int4 intc intrup invalop iostat_msg isha ishc ishl jfix lacfar locking locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq precfill prompt qabs qacos qacosd qasin qasind qatan qatand qatan2 qcmplx qconjg qcos qcosd qcosh qdim qexp qext qextd qfloat qimag qlog qlog10 qmax1 qmin1 qmod qreal qsign qsin qsind qsinh qsqrt qtan qtand qtanh ran rand randu rewrite segment setdat settim system timer undfl unlock union val virtual volatile zabs zcos zexp zlog zsin zsqrt
[settings]
# default extension used when saving files
#extension=f
# 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=c
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=false
# context action command (please see Geany's main documentation for details)
context_action_cmd=
[build_settings]
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
compiler=gfortran -Wall -c "%f"
linker=gfortran -Wall -o "%e" "%f"
run_cmd="./%e"

View File

@ -28,7 +28,7 @@ user_functions=cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg d
[settings]
# default extension used when saving files
#extension=f
#extension=f90
# the following characters are these which a "word" can contains, see documentation
#wordchars=_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
@ -53,7 +53,7 @@ context_action_cmd=
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
compiler=g77 -Wall -c "%f"
linker=g77 -Wall -o "%e" "%f"
compiler=gfortran -Wall -c "%f"
linker=gfortran -Wall -o "%e" "%f"
run_cmd="./%e"

View File

@ -153,6 +153,7 @@ int Scintilla_LinkLexers() {
LINK_LEXER(lmD);
LINK_LEXER(lmDiff);
LINK_LEXER(lmErrorList);
LINK_LEXER(lmF77);
LINK_LEXER(lmFortran);
LINK_LEXER(lmHaskell);
LINK_LEXER(lmHTML);

View File

@ -918,6 +918,9 @@ static void set_indentation(GeanyDocument *doc)
/* force using tabs for indentation for Makefiles */
if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_MAKE)
editor_set_use_tabs(doc, TRUE);
/* force using spaces for indentation for Fortran 77 */
else if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_F77)
editor_set_use_tabs(doc, FALSE);
else if (! editor_prefs.detect_tab_mode)
editor_set_use_tabs(doc, editor_prefs.use_tabs);
else

View File

@ -2495,6 +2495,7 @@ static gboolean is_comment(gint lexer, gint prev_style, gint style)
break;
}
case SCLEX_F77:
case SCLEX_FORTRAN:
{
if (style == SCE_F_COMMENT ||
style == SCE_F_STRING1 ||

View File

@ -138,13 +138,21 @@ static void init_builtin_filetypes(void)
#define FORTRAN
filetypes[GEANY_FILETYPES_FORTRAN]->lang = 18;
filetypes[GEANY_FILETYPES_FORTRAN]->name = g_strdup("Fortran");
filetypes[GEANY_FILETYPES_FORTRAN]->title = g_strdup_printf(_("%s source file"), "Fortran (F77)");
filetypes[GEANY_FILETYPES_FORTRAN]->extension = g_strdup("f");
filetypes[GEANY_FILETYPES_FORTRAN]->pattern = utils_strv_new("*.f", "*.for", "*.ftn", "*.f77",
"*.f90", "*.f95", NULL);
filetypes[GEANY_FILETYPES_FORTRAN]->title = g_strdup_printf(_("%s source file"), "Fortran (F90)");
filetypes[GEANY_FILETYPES_FORTRAN]->extension = g_strdup("f90");
filetypes[GEANY_FILETYPES_FORTRAN]->pattern = utils_strv_new("*.f90", "*.f95", "*.f03", NULL);
filetypes[GEANY_FILETYPES_FORTRAN]->comment_open = g_strdup("c");
filetypes[GEANY_FILETYPES_FORTRAN]->comment_close = NULL;
#define F77
filetypes[GEANY_FILETYPES_F77]->lang = 30;
filetypes[GEANY_FILETYPES_F77]->name = g_strdup("F77");
filetypes[GEANY_FILETYPES_F77]->title = g_strdup_printf(_("%s source file"), "Fortran (F77)");
filetypes[GEANY_FILETYPES_F77]->extension = g_strdup("f");
filetypes[GEANY_FILETYPES_F77]->pattern = utils_strv_new("*.f", "*.for", "*.ftn", "*.f77", NULL);
filetypes[GEANY_FILETYPES_F77]->comment_open = g_strdup("c");
filetypes[GEANY_FILETYPES_F77]->comment_close = NULL;
#define CAML
filetypes[GEANY_FILETYPES_CAML]->lang = -2;
filetypes[GEANY_FILETYPES_CAML]->name = g_strdup("CAML");

View File

@ -40,6 +40,7 @@ typedef enum
GEANY_FILETYPES_CS,
GEANY_FILETYPES_CAML,
GEANY_FILETYPES_D,
GEANY_FILETYPES_F77,
GEANY_FILETYPES_FORTRAN,
GEANY_FILETYPES_BASIC, /* FreeBasic */
GEANY_FILETYPES_HASKELL,

View File

@ -1989,6 +1989,67 @@ static void styleset_asm(ScintillaObject *sci)
}
static void styleset_f77_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
{
new_style_array(GEANY_FILETYPES_F77, 15);
get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[0]);
get_keyfile_hex(config, config_home, "styling", "comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[1]);
get_keyfile_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[2]);
get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[3]);
get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[4]);
get_keyfile_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[5]);
get_keyfile_hex(config, config_home, "styling", "string2", "0x111199", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[6]);
get_keyfile_hex(config, config_home, "styling", "word", "0x7f0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[7]);
get_keyfile_hex(config, config_home, "styling", "word2", "0x000099", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[8]);
get_keyfile_hex(config, config_home, "styling", "word3", "0x3d670f", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[9]);
get_keyfile_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_F77].styling[10]);
get_keyfile_hex(config, config_home, "styling", "operator2", "0x301010", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[11]);
get_keyfile_hex(config, config_home, "styling", "continuation", "0x000000", "0xf0e080", "false", &style_sets[GEANY_FILETYPES_F77].styling[12]);
get_keyfile_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", &style_sets[GEANY_FILETYPES_F77].styling[13]);
get_keyfile_hex(config, config_home, "styling", "label", "0xa861a8", "0xffffff", "true", &style_sets[GEANY_FILETYPES_F77].styling[14]);
style_sets[GEANY_FILETYPES_F77].keywords = g_new(gchar*, 4);
get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_F77, 0, "");
get_keyfile_keywords(config, config_home, "keywords", "intrinsic_functions", GEANY_FILETYPES_F77, 1, "");
get_keyfile_keywords(config, config_home, "keywords", "user_functions", GEANY_FILETYPES_F77, 2, "");
style_sets[GEANY_FILETYPES_F77].keywords[3] = NULL;
get_keyfile_wordchars(config, config_home,
&style_sets[GEANY_FILETYPES_F77].wordchars);
}
static void styleset_f77(ScintillaObject *sci)
{
const filetype_id ft_id = GEANY_FILETYPES_F77;
styleset_common(sci, 5, ft_id);
apply_filetype_properties(sci, SCLEX_F77, ft_id);
SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_F77].keywords[0]);
SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) style_sets[GEANY_FILETYPES_F77].keywords[1]);
SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_F77].keywords[2]);
set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_F77, 0);
set_sci_style(sci, SCE_F_DEFAULT, GEANY_FILETYPES_F77, 0);
set_sci_style(sci, SCE_F_COMMENT, GEANY_FILETYPES_F77, 1);
set_sci_style(sci, SCE_F_NUMBER, GEANY_FILETYPES_F77, 2);
set_sci_style(sci, SCE_F_STRING1, GEANY_FILETYPES_F77, 3);
set_sci_style(sci, SCE_F_OPERATOR, GEANY_FILETYPES_F77, 4);
set_sci_style(sci, SCE_F_IDENTIFIER, GEANY_FILETYPES_F77, 5);
set_sci_style(sci, SCE_F_STRING2, GEANY_FILETYPES_F77, 6);
set_sci_style(sci, SCE_F_WORD, GEANY_FILETYPES_F77, 7);
set_sci_style(sci, SCE_F_WORD2, GEANY_FILETYPES_F77, 8);
set_sci_style(sci, SCE_F_WORD3, GEANY_FILETYPES_F77, 9);
set_sci_style(sci, SCE_F_PREPROCESSOR, GEANY_FILETYPES_F77, 10);
set_sci_style(sci, SCE_F_OPERATOR2, GEANY_FILETYPES_F77, 11);
set_sci_style(sci, SCE_F_CONTINUATION, GEANY_FILETYPES_F77, 12);
set_sci_style(sci, SCE_F_STRINGEOL, GEANY_FILETYPES_F77, 13);
set_sci_style(sci, SCE_F_LABEL, GEANY_FILETYPES_F77, 14);
}
static void styleset_fortran_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
{
new_style_array(GEANY_FILETYPES_FORTRAN, 15);
@ -2025,7 +2086,7 @@ static void styleset_fortran(ScintillaObject *sci)
styleset_common(sci, 5, ft_id);
apply_filetype_properties(sci, SCLEX_F77, ft_id); /* SCLEX_FORTRAN */
apply_filetype_properties(sci, SCLEX_FORTRAN, ft_id);
SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_FORTRAN].keywords[0]);
SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) style_sets[GEANY_FILETYPES_FORTRAN].keywords[1]);
@ -2890,6 +2951,7 @@ void highlighting_init_styles(gint filetype_idx, GKeyFile *config, GKeyFile *con
init_styleset_case(GEANY_FILETYPES_DIFF, diff);
init_styleset_case(GEANY_FILETYPES_DOCBOOK, docbook);
init_styleset_case(GEANY_FILETYPES_FERITE, ferite);
init_styleset_case(GEANY_FILETYPES_F77, f77);
init_styleset_case(GEANY_FILETYPES_FORTRAN, fortran);
init_styleset_case(GEANY_FILETYPES_HASKELL, haskell);
init_styleset_case(GEANY_FILETYPES_HAXE, haxe);
@ -2942,6 +3004,7 @@ void highlighting_set_styles(ScintillaObject *sci, gint filetype_idx)
styleset_case(GEANY_FILETYPES_DIFF, diff);
styleset_case(GEANY_FILETYPES_DOCBOOK, docbook);
styleset_case(GEANY_FILETYPES_FERITE, ferite);
styleset_case(GEANY_FILETYPES_F77, f77);
styleset_case(GEANY_FILETYPES_FORTRAN, fortran);
styleset_case(GEANY_FILETYPES_HASKELL, haskell);
styleset_case(GEANY_FILETYPES_HAXE, haxe);

View File

@ -816,6 +816,7 @@ void msgwin_parse_compiler_error_line(const gchar *string, const gchar *dir, gch
* empty.h:4: Warnung: type defaults to `int' in declaration of `foo'
* empty.c:21: error: conflicting types for `foo'
* Only parse file and line, so that linker errors will also work (with -g) */
case GEANY_FILETYPES_F77:
case GEANY_FILETYPES_FORTRAN:
case GEANY_FILETYPES_LATEX:
/* ./kommtechnik_2b.tex:18: Emergency stop. */

View File

@ -36,12 +36,12 @@
/* The API version should be incremented whenever any plugin data types below are
* modified or appended to. */
static const gint api_version = 76;
static const gint api_version = 77;
/* The ABI version should be incremented whenever existing fields in the plugin
* data types below have to be changed or reordered. It should stay the same if fields
* are only appended, as this doesn't affect existing fields. */
static const gint abi_version = 40;
static const gint abi_version = 41;
/** Check the plugin can be loaded by Geany.
* This performs runtime checks that try to ensure:

View File

@ -749,10 +749,11 @@ static void init_tag_list(GeanyDocument *doc)
NULL);
break;
}
case GEANY_FILETYPES_F77:
case GEANY_FILETYPES_FORTRAN:
{
tag_list_add_groups(tag_store,
&(tv_iters.tag_namespace), _("Module"), NULL,
&(tv_iters.tag_namespace), _("Module"), "classviewer-class",
&(tv_iters.tag_struct), _("Interfaces"), "classviewer-struct",
&(tv_iters.tag_function), _("Functions"), "classviewer-method",
&(tv_iters.tag_member), _("Subroutines"), "classviewer-method",

View File

@ -563,6 +563,7 @@ static gchar *make_comment_block(const gchar *comment_text, gint filetype_idx, g
break;
}
case GEANY_FILETYPES_F77:
case GEANY_FILETYPES_FORTRAN:
{
line_prefix = "c";

View File

@ -162,6 +162,7 @@ typedef struct sTokenInfo {
*/
static langType Lang_fortran;
static langType Lang_f77;
static jmp_buf Exception;
static int Ungetc = '\0';
static unsigned int Column = 0;
@ -304,7 +305,7 @@ static void ancestorClear (void)
Ancestors.max = 0;
}
static void buildFortranKeywordHash (void)
static void buildFortranKeywordHash (const langType language)
{
const size_t count = sizeof (FortranKeywordTable) /
sizeof (FortranKeywordTable [0]);
@ -312,7 +313,7 @@ static void buildFortranKeywordHash (void)
for (i = 0 ; i < count ; ++i)
{
const keywordDesc* const p = &FortranKeywordTable [i];
addKeyword (p->name, Lang_fortran, (int) p->id);
addKeyword (p->name, language, (int) p->id);
}
}
@ -750,7 +751,7 @@ static keywordId analyzeToken (vString *const name)
if (keyword == NULL)
keyword = vStringNew ();
vStringCopyToLower (keyword, name);
id = (keywordId) lookupKeyword (vStringValue (keyword), Lang_fortran);
id = (keywordId) lookupKeyword (vStringValue (keyword), getSourceLanguage());
return id;
}
@ -1655,18 +1656,24 @@ static boolean findFortranTags (const unsigned int passCount)
return retry;
}
static void initialize (const langType language)
static void initializeFortran (const langType language)
{
Lang_fortran = language;
buildFortranKeywordHash ();
buildFortranKeywordHash (language);
}
static void initializeF77 (const langType language)
{
Lang_f77 = language;
buildFortranKeywordHash (language);
}
extern parserDefinition* FortranParser (void)
{
static const char *const extensions [] = {
"f", "for", "ftn", "f77", "f90", "f95",
"f90", "f95", "f03",
#ifndef CASE_INSENSITIVE_FILENAMES
"F", "FOR", "FTN", "F77", "F90", "F95",
"F90", "F95", "F03",
#endif
NULL
};
@ -1675,7 +1682,25 @@ extern parserDefinition* FortranParser (void)
def->kindCount = KIND_COUNT (FortranKinds);
def->extensions = extensions;
def->parser2 = findFortranTags;
def->initialize = initialize;
def->initialize = initializeFortran;
return def;
}
extern parserDefinition* F77Parser (void)
{
static const char *const extensions [] = {
"f", "for", "ftn", "f77",
#ifndef CASE_INSENSITIVE_FILENAMES
"F", "FOR", "FTN", "F77",
#endif
NULL
};
parserDefinition* def = parserNew ("F77");
def->kinds = FortranKinds;
def->kindCount = KIND_COUNT (FortranKinds);
def->extensions = extensions;
def->parser2 = findFortranTags;
def->initialize = initializeF77;
return def;
}

View File

@ -44,7 +44,8 @@
FreeBasicParser,\
HaxeParser,\
RestParser, \
HtmlParser
HtmlParser, \
F77Parser
/*
langType of each parser
@ -78,6 +79,7 @@ langType of each parser
27 HaxeParser
28 RestParser
29 HtmlParser
30 F77Parser
*/
#endif /* _PARSERS_H */