~ubuntu-branches/debian/experimental/geany/experimental

« back to all changes in this revision

Viewing changes to src/filetypes.c

  • Committer: Bazaar Package Importer
  • Author(s): Damián Viano
  • Date: 2008-05-02 11:37:45 UTC
  • mfrom: (1.2.1 upstream) (3.1.6 hardy)
  • Revision ID: james.westby@ubuntu.com-20080502113745-xzp4g6dmovrpoj17
Tags: 0.14-1
New upstream release (Closes: #478126)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 *      filetypes.c - this file is part of Geany, a fast and lightweight IDE
3
3
 *
4
 
 *      Copyright 2006 Enrico Troeger <enrico.troeger@uvena.de>
 
4
 *      Copyright 2005-2008 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
 
5
 *      Copyright 2006-2008 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
5
6
 *
6
7
 *      This program is free software; you can redistribute it and/or modify
7
8
 *      it under the terms of the GNU General Public License as published by
17
18
 *      along with this program; if not, write to the Free Software
18
19
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
20
 *
20
 
 * $Id: filetypes.c 848 2006-09-29 07:22:46Z eht16 $
 
21
 * $Id: filetypes.c 2472 2008-04-11 15:39:44Z eht16 $
21
22
 */
22
23
 
 
24
/*
 
25
 * Filetype detection, file extensions and filetype menu items.
 
26
 */
23
27
 
24
28
#include <string.h>
 
29
#include <glib/gstdio.h>
25
30
 
26
31
#include "geany.h"
27
32
#include "filetypes.h"
28
33
#include "highlighting.h"
29
34
#include "support.h"
30
 
#include "callbacks.h"
31
35
#include "templates.h"
32
36
#include "msgwindow.h"
 
37
#include "utils.h"
 
38
#include "document.h"
 
39
#include "sciwrappers.h"
 
40
 
 
41
 
 
42
filetype *filetypes[GEANY_MAX_FILE_TYPES];
33
43
 
34
44
 
35
45
/* This is the order of unique ids used in the config file.
36
46
 * The order must not be changed but can be appended to. */
37
47
enum
38
48
{
39
 
        FILETYPE_UID_C = 0,             // 0
40
 
        FILETYPE_UID_CPP,               // 1
41
 
        FILETYPE_UID_JAVA,              // 2
42
 
        FILETYPE_UID_PERL,              // 3
43
 
        FILETYPE_UID_PHP,               // 4
44
 
        FILETYPE_UID_XML,               // 5
45
 
        FILETYPE_UID_DOCBOOK,   // 6
46
 
        FILETYPE_UID_PYTHON,    // 7
47
 
        FILETYPE_UID_LATEX,             // 8
48
 
        FILETYPE_UID_PASCAL,    // 9
49
 
        FILETYPE_UID_SH,                // 10
50
 
        FILETYPE_UID_MAKE,              // 11
51
 
        FILETYPE_UID_CSS,               // 12
52
 
        FILETYPE_UID_CONF,              // 13
53
 
        FILETYPE_UID_ASM,               // 14
54
 
        FILETYPE_UID_SQL,               // 15
55
 
        FILETYPE_UID_CAML,              // 16
56
 
        FILETYPE_UID_OMS,               // 17
57
 
        FILETYPE_UID_RUBY,              // 18
58
 
        FILETYPE_UID_TCL,               // 19
59
 
        FILETYPE_UID_ALL,               // 20
60
 
        FILETYPE_UID_D,                 // 21
61
 
        FILETYPE_UID_FORTRAN,   // 22
62
 
        FILETYPE_UID_DIFF,              // 23
63
 
        FILETYPE_UID_FERITE,    // 24
64
 
        FILETYPE_UID_HTML               // 25
 
49
        FILETYPE_UID_C = 0,             /* 0 */
 
50
        FILETYPE_UID_CPP,               /* 1 */
 
51
        FILETYPE_UID_JAVA,              /* 2 */
 
52
        FILETYPE_UID_PERL,              /* 3 */
 
53
        FILETYPE_UID_PHP,               /* 4 */
 
54
        FILETYPE_UID_XML,               /* 5 */
 
55
        FILETYPE_UID_DOCBOOK,   /* 6 */
 
56
        FILETYPE_UID_PYTHON,    /* 7 */
 
57
        FILETYPE_UID_LATEX,             /* 8 */
 
58
        FILETYPE_UID_PASCAL,    /* 9 */
 
59
        FILETYPE_UID_SH,                /* 10 */
 
60
        FILETYPE_UID_MAKE,              /* 11 */
 
61
        FILETYPE_UID_CSS,               /* 12 */
 
62
        FILETYPE_UID_CONF,              /* 13 */
 
63
        FILETYPE_UID_ASM,               /* 14 */
 
64
        FILETYPE_UID_SQL,               /* 15 */
 
65
        FILETYPE_UID_CAML,              /* 16 */
 
66
        FILETYPE_UID_OMS,               /* 17 */
 
67
        FILETYPE_UID_RUBY,              /* 18 */
 
68
        FILETYPE_UID_TCL,               /* 19 */
 
69
        FILETYPE_UID_ALL,               /* 20 */
 
70
        FILETYPE_UID_D,                 /* 21 */
 
71
        FILETYPE_UID_FORTRAN,   /* 22 */
 
72
        FILETYPE_UID_DIFF,              /* 23 */
 
73
        FILETYPE_UID_FERITE,    /* 24 */
 
74
        FILETYPE_UID_HTML,              /* 25 */
 
75
        FILETYPE_UID_VHDL,              /* 26 */
 
76
        FILETYPE_UID_JS,                /* 27 */
 
77
        FILETYPE_UID_LUA,               /* 28 */
 
78
        FILETYPE_UID_HASKELL,   /* 29 */
 
79
        FILETYPE_UID_CS,                /* 30 */
 
80
        FILETYPE_UID_BASIC,             /* 31 */
 
81
        FILETYPE_UID_HAXE,              /* 32 */
 
82
        FILETYPE_UID_REST               /* 33 */
65
83
};
66
84
 
67
85
 
68
 
static void filetypes_create_menu_item(GtkWidget *menu, gchar *label, filetype *ftype);
69
 
static void filetypes_create_newmenu_item(GtkWidget *menu, gchar *label, filetype *ftype);
70
 
static void filetypes_init_build_programs(filetype *ftype);
71
 
 
72
86
static GtkWidget *radio_items[GEANY_MAX_FILE_TYPES];
73
87
 
74
 
 
75
 
// If uid is valid, return corresponding filetype, otherwise NULL.
76
 
filetype *filetypes_get_from_uid(gint uid)
 
88
static void filetypes_create_menu_item(GtkWidget *menu, const gchar *label, filetype *ftype);
 
89
 
 
90
 
 
91
/* Create the filetype array and fill it with the known filetypes. */
 
92
void filetypes_init_types()
77
93
{
78
 
        switch (uid)
 
94
        filetype_id ft_id;
 
95
 
 
96
        for (ft_id = 0; ft_id < GEANY_MAX_FILE_TYPES; ft_id++)
79
97
        {
80
 
                case FILETYPE_UID_C:            return filetypes[GEANY_FILETYPES_C];
81
 
                case FILETYPE_UID_CPP:          return filetypes[GEANY_FILETYPES_CPP];
82
 
                case FILETYPE_UID_JAVA:         return filetypes[GEANY_FILETYPES_JAVA];
83
 
                case FILETYPE_UID_PERL:         return filetypes[GEANY_FILETYPES_PERL];
84
 
                case FILETYPE_UID_PHP:          return filetypes[GEANY_FILETYPES_PHP];
85
 
                case FILETYPE_UID_XML:          return filetypes[GEANY_FILETYPES_XML];
86
 
                case FILETYPE_UID_DOCBOOK:      return filetypes[GEANY_FILETYPES_DOCBOOK];
87
 
                case FILETYPE_UID_PYTHON:       return filetypes[GEANY_FILETYPES_PYTHON];
88
 
                case FILETYPE_UID_LATEX:        return filetypes[GEANY_FILETYPES_LATEX];
89
 
                case FILETYPE_UID_PASCAL:       return filetypes[GEANY_FILETYPES_PASCAL];
90
 
                case FILETYPE_UID_SH:           return filetypes[GEANY_FILETYPES_SH];
91
 
                case FILETYPE_UID_MAKE:         return filetypes[GEANY_FILETYPES_MAKE];
92
 
                case FILETYPE_UID_CSS:          return filetypes[GEANY_FILETYPES_CSS];
93
 
                case FILETYPE_UID_CONF:         return filetypes[GEANY_FILETYPES_CONF];
94
 
                case FILETYPE_UID_ASM:          return filetypes[GEANY_FILETYPES_ASM];
95
 
                case FILETYPE_UID_SQL:          return filetypes[GEANY_FILETYPES_SQL];
96
 
                case FILETYPE_UID_CAML:         return filetypes[GEANY_FILETYPES_CAML];
97
 
                case FILETYPE_UID_OMS:          return filetypes[GEANY_FILETYPES_OMS];
98
 
                case FILETYPE_UID_RUBY:         return filetypes[GEANY_FILETYPES_RUBY];
99
 
                case FILETYPE_UID_TCL:          return filetypes[GEANY_FILETYPES_TCL];
100
 
                case FILETYPE_UID_ALL:          return filetypes[GEANY_FILETYPES_ALL];
101
 
                case FILETYPE_UID_D:            return filetypes[GEANY_FILETYPES_D];
102
 
                case FILETYPE_UID_FORTRAN:      return filetypes[GEANY_FILETYPES_FORTRAN];
103
 
                case FILETYPE_UID_DIFF:         return filetypes[GEANY_FILETYPES_DIFF];
104
 
                case FILETYPE_UID_FERITE:       return filetypes[GEANY_FILETYPES_FERITE];
105
 
                case FILETYPE_UID_HTML:         return filetypes[GEANY_FILETYPES_HTML];
106
 
                default:                                        return NULL;
 
98
                filetypes[ft_id] = g_new0(filetype, 1);
 
99
                filetypes[ft_id]->programs = g_new0(struct build_programs, 1);
 
100
                filetypes[ft_id]->actions = g_new0(struct build_actions, 1);
107
101
        }
108
 
}
109
 
 
110
 
 
111
 
/* inits the filetype array and fill it with the known filetypes
112
 
 * and create the filetype menu*/
113
 
void filetypes_init_types(void)
114
 
{
115
 
        GtkWidget *filetype_menu = lookup_widget(app->window, "set_filetype1_menu");
116
 
        GtkWidget *template_menu = lookup_widget(app->window, "menu_new_with_template1_menu");
117
 
 
118
 
#define C       // these macros are only to ease navigation
119
 
        filetypes[GEANY_FILETYPES_C] = g_new0(filetype, 1);
 
102
 
 
103
#define C       /* these macros are only to ease navigation */
120
104
        filetypes[GEANY_FILETYPES_C]->id = GEANY_FILETYPES_C;
121
105
        filetypes[GEANY_FILETYPES_C]->uid = FILETYPE_UID_C;
122
 
        filetypes[GEANY_FILETYPES_C]->item = NULL;
123
106
        filetypes[GEANY_FILETYPES_C]->lang = 0;
124
107
        filetypes[GEANY_FILETYPES_C]->name = g_strdup("C");
125
 
        filetypes[GEANY_FILETYPES_C]->has_tags = TRUE;
126
 
        filetypes[GEANY_FILETYPES_C]->title = g_strdup(_("C source file"));
 
108
        filetypes[GEANY_FILETYPES_C]->title = g_strdup_printf(_("%s source file"), "C");
127
109
        filetypes[GEANY_FILETYPES_C]->extension = g_strdup("c");
128
 
        filetypes[GEANY_FILETYPES_C]->pattern = g_new0(gchar*, 3);
129
 
        filetypes[GEANY_FILETYPES_C]->pattern[0] = g_strdup("*.c");
130
 
        filetypes[GEANY_FILETYPES_C]->pattern[1] = g_strdup("*.h");
131
 
        filetypes[GEANY_FILETYPES_C]->pattern[2] = NULL;
 
110
        filetypes[GEANY_FILETYPES_C]->pattern = utils_strv_new("*.c", "*.h", NULL);
132
111
        filetypes[GEANY_FILETYPES_C]->comment_open = g_strdup("/*");
133
112
        filetypes[GEANY_FILETYPES_C]->comment_close = g_strdup("*/");
134
 
        filetypes[GEANY_FILETYPES_C]->style_func_ptr = styleset_c;
135
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_C]);
136
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_C]->title, filetypes[GEANY_FILETYPES_C]);
137
113
 
138
114
#define CPP
139
 
        filetypes[GEANY_FILETYPES_CPP] = g_new0(filetype, 1);
140
115
        filetypes[GEANY_FILETYPES_CPP]->id = GEANY_FILETYPES_CPP;
141
116
        filetypes[GEANY_FILETYPES_CPP]->uid = FILETYPE_UID_CPP;
142
 
        filetypes[GEANY_FILETYPES_CPP]->item = NULL;
143
117
        filetypes[GEANY_FILETYPES_CPP]->lang = 1;
144
118
        filetypes[GEANY_FILETYPES_CPP]->name = g_strdup("C++");
145
 
        filetypes[GEANY_FILETYPES_CPP]->has_tags = TRUE;
146
 
        filetypes[GEANY_FILETYPES_CPP]->title = g_strdup(_("C++ source file"));
 
119
        filetypes[GEANY_FILETYPES_CPP]->title = g_strdup_printf(_("%s source file"), "C++");
147
120
        filetypes[GEANY_FILETYPES_CPP]->extension = g_strdup("cpp");
148
 
        filetypes[GEANY_FILETYPES_CPP]->pattern = g_new0(gchar*, 11);
149
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[0] = g_strdup("*.cpp");
150
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[1] = g_strdup("*.cxx");
151
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[2] = g_strdup("*.c++");
152
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[3] = g_strdup("*.cc");
153
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[4] = g_strdup("*.h");
154
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[5] = g_strdup("*.hpp");
155
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[6] = g_strdup("*.hxx");
156
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[7] = g_strdup("*.h++");
157
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[8] = g_strdup("*.hh");
158
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[9] = g_strdup("*.C");
159
 
        filetypes[GEANY_FILETYPES_CPP]->pattern[10] = NULL;
160
 
        filetypes[GEANY_FILETYPES_CPP]->style_func_ptr = styleset_cpp;
 
121
        filetypes[GEANY_FILETYPES_CPP]->pattern = utils_strv_new("*.cpp", "*.cxx", "*.c++", "*.cc",
 
122
                "*.h", "*.hpp", "*.hxx", "*.h++", "*.hh", "*.C", NULL);
161
123
        filetypes[GEANY_FILETYPES_CPP]->comment_open = g_strdup("//");
162
124
        filetypes[GEANY_FILETYPES_CPP]->comment_close = NULL;
163
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_CPP]);
164
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_CPP]->title, filetypes[GEANY_FILETYPES_CPP]);
 
125
 
 
126
#define CS
 
127
        filetypes[GEANY_FILETYPES_CS]->id = GEANY_FILETYPES_CS;
 
128
        filetypes[GEANY_FILETYPES_CS]->uid = FILETYPE_UID_CS;
 
129
        filetypes[GEANY_FILETYPES_CS]->lang = 25;
 
130
        filetypes[GEANY_FILETYPES_CS]->name = g_strdup("C#");
 
131
        filetypes[GEANY_FILETYPES_CS]->title = g_strdup_printf(_("%s source file"), "C#");
 
132
        filetypes[GEANY_FILETYPES_CS]->extension = g_strdup("cs");
 
133
        filetypes[GEANY_FILETYPES_CS]->pattern = utils_strv_new("*.cs", "*.vala", NULL);
 
134
        filetypes[GEANY_FILETYPES_CS]->comment_open = g_strdup("//");
 
135
        filetypes[GEANY_FILETYPES_CS]->comment_close = NULL;
165
136
 
166
137
#define D
167
 
        filetypes[GEANY_FILETYPES_D] = g_new0(filetype, 1);
168
138
        filetypes[GEANY_FILETYPES_D]->id = GEANY_FILETYPES_D;
169
139
        filetypes[GEANY_FILETYPES_D]->uid = FILETYPE_UID_D;
170
 
        filetypes[GEANY_FILETYPES_D]->item = NULL;
171
140
        filetypes[GEANY_FILETYPES_D]->lang = 17;
172
141
        filetypes[GEANY_FILETYPES_D]->name = g_strdup("D");
173
 
        filetypes[GEANY_FILETYPES_D]->has_tags = TRUE;
174
 
        filetypes[GEANY_FILETYPES_D]->title = g_strdup(_("D source file"));
 
142
        filetypes[GEANY_FILETYPES_D]->title = g_strdup_printf(_("%s source file"), "D");
175
143
        filetypes[GEANY_FILETYPES_D]->extension = g_strdup("d");
176
 
        filetypes[GEANY_FILETYPES_D]->pattern = g_new0(gchar*, 3);
177
 
        filetypes[GEANY_FILETYPES_D]->pattern[0] = g_strdup("*.d");
178
 
        filetypes[GEANY_FILETYPES_D]->pattern[1] = g_strdup("*.di");
179
 
        filetypes[GEANY_FILETYPES_D]->pattern[2] = NULL;
 
144
        filetypes[GEANY_FILETYPES_D]->pattern = utils_strv_new("*.d", "*.di", NULL);
180
145
        filetypes[GEANY_FILETYPES_D]->comment_open = g_strdup("//");
181
146
        filetypes[GEANY_FILETYPES_D]->comment_close = NULL;
182
 
        filetypes[GEANY_FILETYPES_D]->style_func_ptr = styleset_d;
183
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_D]);
184
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_D]->title, filetypes[GEANY_FILETYPES_D]);
185
147
 
186
148
#define JAVA
187
 
        filetypes[GEANY_FILETYPES_JAVA] = g_new0(filetype, 1);
188
149
        filetypes[GEANY_FILETYPES_JAVA]->id = GEANY_FILETYPES_JAVA;
189
150
        filetypes[GEANY_FILETYPES_JAVA]->name = g_strdup("Java");
190
151
        filetypes[GEANY_FILETYPES_JAVA]->uid = FILETYPE_UID_JAVA;
191
 
        filetypes[GEANY_FILETYPES_JAVA]->item = NULL;
192
152
        filetypes[GEANY_FILETYPES_JAVA]->lang = 2;
193
 
        filetypes[GEANY_FILETYPES_JAVA]->has_tags = TRUE;
194
 
        filetypes[GEANY_FILETYPES_JAVA]->title = g_strdup(_("Java source file"));
 
153
        filetypes[GEANY_FILETYPES_JAVA]->title = g_strdup_printf(_("%s source file"), "Java");
195
154
        filetypes[GEANY_FILETYPES_JAVA]->extension = g_strdup("java");
196
 
        filetypes[GEANY_FILETYPES_JAVA]->pattern = g_new0(gchar*, 2);
197
 
        filetypes[GEANY_FILETYPES_JAVA]->pattern[0] = g_strdup("*.java");
198
 
        filetypes[GEANY_FILETYPES_JAVA]->pattern[1] = NULL;
 
155
        filetypes[GEANY_FILETYPES_JAVA]->pattern = utils_strv_new("*.java", "*.jsp", NULL);
199
156
        filetypes[GEANY_FILETYPES_JAVA]->comment_open = g_strdup("/*");
200
157
        filetypes[GEANY_FILETYPES_JAVA]->comment_close = g_strdup("*/");
201
 
        filetypes[GEANY_FILETYPES_JAVA]->style_func_ptr = styleset_java;
202
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_JAVA]);
203
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_JAVA]->title, filetypes[GEANY_FILETYPES_JAVA]);
204
158
 
205
 
#define PAS // to avoid warnings when building under Windows, the symbol PASCAL is there defined
206
 
        filetypes[GEANY_FILETYPES_PASCAL] = g_new0(filetype, 1);
 
159
#define PAS /* to avoid warnings when building under Windows, the symbol PASCAL is there defined */
207
160
        filetypes[GEANY_FILETYPES_PASCAL]->id = GEANY_FILETYPES_PASCAL;
208
161
        filetypes[GEANY_FILETYPES_PASCAL]->uid = FILETYPE_UID_PASCAL;
209
 
        filetypes[GEANY_FILETYPES_PASCAL]->item = NULL;
210
162
        filetypes[GEANY_FILETYPES_PASCAL]->lang = 4;
211
163
        filetypes[GEANY_FILETYPES_PASCAL]->name = g_strdup("Pascal");
212
 
        filetypes[GEANY_FILETYPES_PASCAL]->has_tags = TRUE;
213
 
        filetypes[GEANY_FILETYPES_PASCAL]->title = g_strdup(_("Pascal source file"));
 
164
        filetypes[GEANY_FILETYPES_PASCAL]->title = g_strdup_printf(_("%s source file"), "Pascal");
214
165
        filetypes[GEANY_FILETYPES_PASCAL]->extension = g_strdup("pas");
215
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern = g_new0(gchar*, 6);
216
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[0] = g_strdup("*.pas");
217
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[1] = g_strdup("*.pp");
218
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[2] = g_strdup("*.inc");
219
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[3] = g_strdup("*.dpr");
220
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[4] = g_strdup("*.dpk");
221
 
        filetypes[GEANY_FILETYPES_PASCAL]->pattern[5] = NULL;
222
 
        filetypes[GEANY_FILETYPES_PASCAL]->style_func_ptr = styleset_pascal;
 
166
        filetypes[GEANY_FILETYPES_PASCAL]->pattern = utils_strv_new("*.pas", "*.pp", "*.inc", "*.dpr",
 
167
                "*.dpk", NULL);
223
168
        filetypes[GEANY_FILETYPES_PASCAL]->comment_open = g_strdup("{");
224
169
        filetypes[GEANY_FILETYPES_PASCAL]->comment_close = g_strdup("}");
225
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_PASCAL]);
226
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_PASCAL]->title, filetypes[GEANY_FILETYPES_PASCAL]);
227
170
 
228
171
#define ASM
229
 
        filetypes[GEANY_FILETYPES_ASM] = g_new0(filetype, 1);
230
172
        filetypes[GEANY_FILETYPES_ASM]->id = GEANY_FILETYPES_ASM;
231
173
        filetypes[GEANY_FILETYPES_ASM]->uid = FILETYPE_UID_ASM;
232
 
        filetypes[GEANY_FILETYPES_ASM]->item = NULL;
233
174
        filetypes[GEANY_FILETYPES_ASM]->lang = 9;
234
175
        filetypes[GEANY_FILETYPES_ASM]->name = g_strdup("ASM");
235
 
        filetypes[GEANY_FILETYPES_ASM]->has_tags = TRUE;
236
 
        filetypes[GEANY_FILETYPES_ASM]->title = g_strdup(_("Assembler source file"));
 
176
        filetypes[GEANY_FILETYPES_ASM]->title = g_strdup_printf(_("%s source file"), "Assembler");
237
177
        filetypes[GEANY_FILETYPES_ASM]->extension = g_strdup("asm");
238
 
        filetypes[GEANY_FILETYPES_ASM]->pattern = g_new0(gchar*, 2);
239
 
        filetypes[GEANY_FILETYPES_ASM]->pattern[0] = g_strdup("*.asm");
240
 
        filetypes[GEANY_FILETYPES_ASM]->pattern[1] = NULL;
241
 
        filetypes[GEANY_FILETYPES_ASM]->style_func_ptr = styleset_asm;
 
178
        filetypes[GEANY_FILETYPES_ASM]->pattern = utils_strv_new("*.asm", NULL);
242
179
        filetypes[GEANY_FILETYPES_ASM]->comment_open = g_strdup(";");
243
180
        filetypes[GEANY_FILETYPES_ASM]->comment_close = NULL;
244
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_ASM]);
245
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_ASM]->title, filetypes[GEANY_FILETYPES_ASM]);
 
181
 
 
182
#define BASIC
 
183
        filetypes[GEANY_FILETYPES_BASIC]->id = GEANY_FILETYPES_BASIC;
 
184
        filetypes[GEANY_FILETYPES_BASIC]->uid = FILETYPE_UID_BASIC;
 
185
        filetypes[GEANY_FILETYPES_BASIC]->lang = 26;
 
186
        filetypes[GEANY_FILETYPES_BASIC]->name = g_strdup("FreeBasic");
 
187
        filetypes[GEANY_FILETYPES_BASIC]->title = g_strdup_printf(_("%s source file"), "FreeBasic");
 
188
        filetypes[GEANY_FILETYPES_BASIC]->extension = g_strdup("bas");
 
189
        filetypes[GEANY_FILETYPES_BASIC]->pattern = utils_strv_new("*.bas", "*.bi", NULL);
 
190
        filetypes[GEANY_FILETYPES_BASIC]->comment_open = g_strdup("'");
 
191
        filetypes[GEANY_FILETYPES_BASIC]->comment_close = NULL;
246
192
 
247
193
#define FORTRAN
248
 
        filetypes[GEANY_FILETYPES_FORTRAN] = g_new0(filetype, 1);
249
194
        filetypes[GEANY_FILETYPES_FORTRAN]->id = GEANY_FILETYPES_FORTRAN;
250
195
        filetypes[GEANY_FILETYPES_FORTRAN]->uid = FILETYPE_UID_FORTRAN;
251
 
        filetypes[GEANY_FILETYPES_FORTRAN]->item = NULL;
252
196
        filetypes[GEANY_FILETYPES_FORTRAN]->lang = 18;
253
197
        filetypes[GEANY_FILETYPES_FORTRAN]->name = g_strdup("Fortran");
254
 
        filetypes[GEANY_FILETYPES_FORTRAN]->has_tags = TRUE;
255
 
        filetypes[GEANY_FILETYPES_FORTRAN]->title = g_strdup(_("Fortran source file (F77)"));
 
198
        filetypes[GEANY_FILETYPES_FORTRAN]->title = g_strdup_printf(_("%s source file"), "Fortran (F77)");
256
199
        filetypes[GEANY_FILETYPES_FORTRAN]->extension = g_strdup("f");
257
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern = g_new0(gchar*, 7);
258
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[0] = g_strdup("*.f");
259
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[1] = g_strdup("*.for");
260
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[2] = g_strdup("*.ftn");
261
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[3] = g_strdup("*.f77");
262
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[4] = g_strdup("*.f90");
263
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[5] = g_strdup("*.f95");
264
 
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern[6] = NULL;
265
 
        filetypes[GEANY_FILETYPES_FORTRAN]->style_func_ptr = styleset_fortran;
 
200
        filetypes[GEANY_FILETYPES_FORTRAN]->pattern = utils_strv_new("*.f", "*.for", "*.ftn", "*.f77",
 
201
                "*.f90", "*.f95", NULL);
266
202
        filetypes[GEANY_FILETYPES_FORTRAN]->comment_open = g_strdup("c");
267
203
        filetypes[GEANY_FILETYPES_FORTRAN]->comment_close = NULL;
268
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_FORTRAN]);
269
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_FORTRAN]->title, filetypes[GEANY_FILETYPES_FORTRAN]);
270
204
 
271
205
#define CAML
272
 
        filetypes[GEANY_FILETYPES_CAML] = g_new0(filetype, 1);
273
206
        filetypes[GEANY_FILETYPES_CAML]->id = GEANY_FILETYPES_CAML;
274
207
        filetypes[GEANY_FILETYPES_CAML]->uid = FILETYPE_UID_CAML;
275
 
        filetypes[GEANY_FILETYPES_CAML]->item = NULL;
276
208
        filetypes[GEANY_FILETYPES_CAML]->lang = -2;
277
209
        filetypes[GEANY_FILETYPES_CAML]->name = g_strdup("CAML");
278
 
        filetypes[GEANY_FILETYPES_CAML]->has_tags = FALSE;
279
 
        filetypes[GEANY_FILETYPES_CAML]->title = g_strdup(_("(O)Caml source file"));
 
210
        filetypes[GEANY_FILETYPES_CAML]->title = g_strdup_printf(_("%s source file"), "(O)Caml");
280
211
        filetypes[GEANY_FILETYPES_CAML]->extension = g_strdup("ml");
281
 
        filetypes[GEANY_FILETYPES_CAML]->pattern = g_new0(gchar*, 3);
282
 
        filetypes[GEANY_FILETYPES_CAML]->pattern[0] = g_strdup("*.ml");
283
 
        filetypes[GEANY_FILETYPES_CAML]->pattern[1] = g_strdup("*.mli");
284
 
        filetypes[GEANY_FILETYPES_CAML]->pattern[2] = NULL;
285
 
        filetypes[GEANY_FILETYPES_CAML]->style_func_ptr = styleset_caml;
 
212
        filetypes[GEANY_FILETYPES_CAML]->pattern = utils_strv_new("*.ml", "*.mli", NULL);
286
213
        filetypes[GEANY_FILETYPES_CAML]->comment_open = g_strdup("(*");
287
214
        filetypes[GEANY_FILETYPES_CAML]->comment_close = g_strdup("*)");
288
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_CAML]);
289
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_CAML]->title, filetypes[GEANY_FILETYPES_CAML]);
290
215
 
291
216
#define PERL
292
 
        filetypes[GEANY_FILETYPES_PERL] = g_new0(filetype, 1);
293
217
        filetypes[GEANY_FILETYPES_PERL]->id = GEANY_FILETYPES_PERL;
294
218
        filetypes[GEANY_FILETYPES_PERL]->uid = FILETYPE_UID_PERL;
295
 
        filetypes[GEANY_FILETYPES_PERL]->item = NULL;
296
219
        filetypes[GEANY_FILETYPES_PERL]->lang = 5;
297
220
        filetypes[GEANY_FILETYPES_PERL]->name = g_strdup("Perl");
298
 
        filetypes[GEANY_FILETYPES_PERL]->has_tags = TRUE;
299
 
        filetypes[GEANY_FILETYPES_PERL]->title = g_strdup(_("Perl source file"));
300
 
        filetypes[GEANY_FILETYPES_PERL]->extension = g_strdup("perl");
301
 
        filetypes[GEANY_FILETYPES_PERL]->pattern = g_new0(gchar*, 5);
302
 
        filetypes[GEANY_FILETYPES_PERL]->pattern[0] = g_strdup("*.pl");
303
 
        filetypes[GEANY_FILETYPES_PERL]->pattern[1] = g_strdup("*.perl");
304
 
        filetypes[GEANY_FILETYPES_PERL]->pattern[2] = g_strdup("*.pm");
305
 
        filetypes[GEANY_FILETYPES_PERL]->pattern[3] = g_strdup("*.agi");
306
 
        filetypes[GEANY_FILETYPES_PERL]->pattern[4] = NULL;
 
221
        filetypes[GEANY_FILETYPES_PERL]->title = g_strdup_printf(_("%s source file"), "Perl");
 
222
        filetypes[GEANY_FILETYPES_PERL]->extension = g_strdup("pl");
 
223
        filetypes[GEANY_FILETYPES_PERL]->pattern = utils_strv_new("*.pl", "*.perl", "*.pm", "*.agi",
 
224
                "*.pod", NULL);
307
225
        filetypes[GEANY_FILETYPES_PERL]->comment_open = g_strdup("#");
308
226
        filetypes[GEANY_FILETYPES_PERL]->comment_close = NULL;
309
 
        filetypes[GEANY_FILETYPES_PERL]->style_func_ptr = styleset_perl;
310
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_PERL]);
311
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_PERL]->title, filetypes[GEANY_FILETYPES_PERL]);
312
227
 
313
228
#define PHP
314
 
        filetypes[GEANY_FILETYPES_PHP] = g_new0(filetype, 1);
315
229
        filetypes[GEANY_FILETYPES_PHP]->id = GEANY_FILETYPES_PHP;
316
230
        filetypes[GEANY_FILETYPES_PHP]->uid = FILETYPE_UID_PHP;
317
 
        filetypes[GEANY_FILETYPES_PHP]->item = NULL;
318
231
        filetypes[GEANY_FILETYPES_PHP]->lang = 6;
319
232
        filetypes[GEANY_FILETYPES_PHP]->name = g_strdup("PHP");
320
 
        filetypes[GEANY_FILETYPES_PHP]->has_tags = TRUE;
321
 
        filetypes[GEANY_FILETYPES_PHP]->title = g_strdup(_("PHP source file"));
 
233
        filetypes[GEANY_FILETYPES_PHP]->title = g_strdup_printf(_("%s source file"), "PHP");
322
234
        filetypes[GEANY_FILETYPES_PHP]->extension = g_strdup("php");
323
 
        filetypes[GEANY_FILETYPES_PHP]->pattern = g_new0(gchar*, 6);
324
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[0] = g_strdup("*.php");
325
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[1] = g_strdup("*.php3");
326
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[2] = g_strdup("*.php4");
327
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[3] = g_strdup("*.php5");
328
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[4] = g_strdup("*.phtml");
329
 
        filetypes[GEANY_FILETYPES_PHP]->pattern[5] = NULL;
330
 
        filetypes[GEANY_FILETYPES_PHP]->style_func_ptr = styleset_php;
 
235
        filetypes[GEANY_FILETYPES_PHP]->pattern = utils_strv_new("*.php", "*.php3", "*.php4", "*.php5",
 
236
                "*.phtml", NULL);
331
237
        filetypes[GEANY_FILETYPES_PHP]->comment_open = g_strdup("//");
332
238
        filetypes[GEANY_FILETYPES_PHP]->comment_close = NULL;
333
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_PHP]);
334
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_PHP]->title, filetypes[GEANY_FILETYPES_PHP]);
 
239
 
 
240
#define JAVASCRIPT
 
241
        filetypes[GEANY_FILETYPES_JS]->id = GEANY_FILETYPES_JS;
 
242
        filetypes[GEANY_FILETYPES_JS]->uid = FILETYPE_UID_JS;
 
243
        filetypes[GEANY_FILETYPES_JS]->lang = 23;
 
244
        filetypes[GEANY_FILETYPES_JS]->name = g_strdup("Javascript");
 
245
        filetypes[GEANY_FILETYPES_JS]->title = g_strdup_printf(_("%s source file"), "Javascript");
 
246
        filetypes[GEANY_FILETYPES_JS]->extension = g_strdup("js");
 
247
        filetypes[GEANY_FILETYPES_JS]->pattern = utils_strv_new("*.js", NULL);
 
248
        filetypes[GEANY_FILETYPES_JS]->comment_open = g_strdup("//");
 
249
        filetypes[GEANY_FILETYPES_JS]->comment_close = NULL;
335
250
 
336
251
#define PYTHON
337
 
        filetypes[GEANY_FILETYPES_PYTHON] = g_new0(filetype, 1);
338
252
        filetypes[GEANY_FILETYPES_PYTHON]->id = GEANY_FILETYPES_PYTHON;
339
253
        filetypes[GEANY_FILETYPES_PYTHON]->uid = FILETYPE_UID_PYTHON;
340
 
        filetypes[GEANY_FILETYPES_PYTHON]->item = NULL;
341
254
        filetypes[GEANY_FILETYPES_PYTHON]->lang = 7;
342
255
        filetypes[GEANY_FILETYPES_PYTHON]->name = g_strdup("Python");
343
 
        filetypes[GEANY_FILETYPES_PYTHON]->has_tags = TRUE;
344
 
        filetypes[GEANY_FILETYPES_PYTHON]->title = g_strdup(_("Python source file"));
 
256
        filetypes[GEANY_FILETYPES_PYTHON]->title = g_strdup_printf(_("%s source file"), "Python");
345
257
        filetypes[GEANY_FILETYPES_PYTHON]->extension = g_strdup("py");
346
 
        filetypes[GEANY_FILETYPES_PYTHON]->pattern = g_new0(gchar*, 3);
347
 
        filetypes[GEANY_FILETYPES_PYTHON]->pattern[0] = g_strdup("*.py");
348
 
        filetypes[GEANY_FILETYPES_PYTHON]->pattern[1] = g_strdup("*.pyw");
349
 
        filetypes[GEANY_FILETYPES_PYTHON]->pattern[2] = NULL;
350
 
        filetypes[GEANY_FILETYPES_PYTHON]->style_func_ptr = styleset_python;
 
258
        filetypes[GEANY_FILETYPES_PYTHON]->pattern = utils_strv_new("*.py", "*.pyw", NULL);
351
259
        filetypes[GEANY_FILETYPES_PYTHON]->comment_open = g_strdup("#");
352
260
        filetypes[GEANY_FILETYPES_PYTHON]->comment_close = NULL;
353
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_PYTHON]);
354
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_PYTHON]->title, filetypes[GEANY_FILETYPES_PYTHON]);
355
261
 
356
262
#define RUBY
357
 
        filetypes[GEANY_FILETYPES_RUBY] = g_new0(filetype, 1);
358
263
        filetypes[GEANY_FILETYPES_RUBY]->id = GEANY_FILETYPES_RUBY;
359
264
        filetypes[GEANY_FILETYPES_RUBY]->uid = FILETYPE_UID_RUBY;
360
 
        filetypes[GEANY_FILETYPES_RUBY]->item = NULL;
361
265
        filetypes[GEANY_FILETYPES_RUBY]->lang = 14;
362
266
        filetypes[GEANY_FILETYPES_RUBY]->name = g_strdup("Ruby");
363
 
        filetypes[GEANY_FILETYPES_RUBY]->has_tags = TRUE;
364
 
        filetypes[GEANY_FILETYPES_RUBY]->title = g_strdup(_("Ruby source file"));
 
267
        filetypes[GEANY_FILETYPES_RUBY]->title = g_strdup_printf(_("%s source file"), "Ruby");
365
268
        filetypes[GEANY_FILETYPES_RUBY]->extension = g_strdup("rb");
366
 
        filetypes[GEANY_FILETYPES_RUBY]->pattern = g_new0(gchar*, 3);
367
 
        filetypes[GEANY_FILETYPES_RUBY]->pattern[0] = g_strdup("*.rb");
368
 
        filetypes[GEANY_FILETYPES_RUBY]->pattern[1] = g_strdup("*.rhtml");
369
 
        filetypes[GEANY_FILETYPES_RUBY]->pattern[2] = NULL;
370
 
        filetypes[GEANY_FILETYPES_RUBY]->style_func_ptr = styleset_ruby;
 
269
        filetypes[GEANY_FILETYPES_RUBY]->pattern = utils_strv_new("*.rb", "*.rhtml", "*.ruby", NULL);
371
270
        filetypes[GEANY_FILETYPES_RUBY]->comment_open = g_strdup("#");
372
271
        filetypes[GEANY_FILETYPES_RUBY]->comment_close = NULL;
373
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_RUBY]);
374
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_RUBY]->title, filetypes[GEANY_FILETYPES_RUBY]);
375
272
 
376
273
#define TCL
377
 
        filetypes[GEANY_FILETYPES_TCL] = g_new0(filetype, 1);
378
274
        filetypes[GEANY_FILETYPES_TCL]->id = GEANY_FILETYPES_TCL;
379
275
        filetypes[GEANY_FILETYPES_TCL]->uid = FILETYPE_UID_TCL;
380
 
        filetypes[GEANY_FILETYPES_TCL]->item = NULL;
381
276
        filetypes[GEANY_FILETYPES_TCL]->lang = 15;
382
277
        filetypes[GEANY_FILETYPES_TCL]->name = g_strdup("Tcl");
383
 
        filetypes[GEANY_FILETYPES_TCL]->has_tags = TRUE;
384
 
        filetypes[GEANY_FILETYPES_TCL]->title = g_strdup(_("Tcl source file"));
 
278
        filetypes[GEANY_FILETYPES_TCL]->title = g_strdup_printf(_("%s source file"), "Tcl");
385
279
        filetypes[GEANY_FILETYPES_TCL]->extension = g_strdup("tcl");
386
 
        filetypes[GEANY_FILETYPES_TCL]->pattern = g_new0(gchar*, 4);
387
 
        filetypes[GEANY_FILETYPES_TCL]->pattern[0] = g_strdup("*.tcl");
388
 
        filetypes[GEANY_FILETYPES_TCL]->pattern[1] = g_strdup("*.tk");
389
 
        filetypes[GEANY_FILETYPES_TCL]->pattern[2] = g_strdup("*.wish");
390
 
        filetypes[GEANY_FILETYPES_TCL]->pattern[3] = NULL;
391
 
        filetypes[GEANY_FILETYPES_TCL]->style_func_ptr = styleset_tcl;
 
280
        filetypes[GEANY_FILETYPES_TCL]->pattern = utils_strv_new("*.tcl", "*.tk", "*.wish", NULL);
392
281
        filetypes[GEANY_FILETYPES_TCL]->comment_open = g_strdup("#");
393
282
        filetypes[GEANY_FILETYPES_TCL]->comment_close = NULL;
394
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_TCL]);
395
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_TCL]->title, filetypes[GEANY_FILETYPES_TCL]);
 
283
 
 
284
#define LUA
 
285
        filetypes[GEANY_FILETYPES_LUA]->id = GEANY_FILETYPES_LUA;
 
286
        filetypes[GEANY_FILETYPES_LUA]->uid = FILETYPE_UID_LUA;
 
287
        filetypes[GEANY_FILETYPES_LUA]->lang = 22;
 
288
        filetypes[GEANY_FILETYPES_LUA]->name = g_strdup("Lua");
 
289
        filetypes[GEANY_FILETYPES_LUA]->title = g_strdup_printf(_("%s source file"), "Lua");
 
290
        filetypes[GEANY_FILETYPES_LUA]->extension = g_strdup("lua");
 
291
        filetypes[GEANY_FILETYPES_LUA]->pattern = utils_strv_new("*.lua", NULL);
 
292
        filetypes[GEANY_FILETYPES_LUA]->comment_open = g_strdup("--");
 
293
        filetypes[GEANY_FILETYPES_LUA]->comment_close = NULL;
396
294
 
397
295
#define FERITE
398
 
        filetypes[GEANY_FILETYPES_FERITE] = g_new0(filetype, 1);
399
296
        filetypes[GEANY_FILETYPES_FERITE]->id = GEANY_FILETYPES_FERITE;
400
297
        filetypes[GEANY_FILETYPES_FERITE]->uid = FILETYPE_UID_FERITE;
401
 
        filetypes[GEANY_FILETYPES_FERITE]->item = NULL;
402
298
        filetypes[GEANY_FILETYPES_FERITE]->lang = 19;
403
299
        filetypes[GEANY_FILETYPES_FERITE]->name = g_strdup("Ferite");
404
 
        filetypes[GEANY_FILETYPES_FERITE]->has_tags = TRUE;
405
 
        filetypes[GEANY_FILETYPES_FERITE]->title = g_strdup(_("Ferite source file"));
 
300
        filetypes[GEANY_FILETYPES_FERITE]->title = g_strdup_printf(_("%s source file"), "Ferite");
406
301
        filetypes[GEANY_FILETYPES_FERITE]->extension = g_strdup("fe");
407
 
        filetypes[GEANY_FILETYPES_FERITE]->pattern = g_new0(gchar*, 2);
408
 
        filetypes[GEANY_FILETYPES_FERITE]->pattern[0] = g_strdup("*.fe");
409
 
        filetypes[GEANY_FILETYPES_FERITE]->pattern[1] = NULL;
410
 
        filetypes[GEANY_FILETYPES_FERITE]->style_func_ptr = styleset_ferite;
 
302
        filetypes[GEANY_FILETYPES_FERITE]->pattern = utils_strv_new("*.fe", NULL);
411
303
        filetypes[GEANY_FILETYPES_FERITE]->comment_open = g_strdup("/*");
412
304
        filetypes[GEANY_FILETYPES_FERITE]->comment_close = g_strdup("*/");
413
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_FERITE]);
414
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_FERITE]->title, filetypes[GEANY_FILETYPES_FERITE]);
 
305
 
 
306
#define HASKELL
 
307
        filetypes[GEANY_FILETYPES_HASKELL]->id = GEANY_FILETYPES_HASKELL;
 
308
        filetypes[GEANY_FILETYPES_HASKELL]->uid = FILETYPE_UID_HASKELL;
 
309
        filetypes[GEANY_FILETYPES_HASKELL]->lang = 24;
 
310
        filetypes[GEANY_FILETYPES_HASKELL]->name = g_strdup("Haskell");
 
311
        filetypes[GEANY_FILETYPES_HASKELL]->title = g_strdup_printf(_("%s source file"), "Haskell");
 
312
        filetypes[GEANY_FILETYPES_HASKELL]->extension = g_strdup("hs");
 
313
        filetypes[GEANY_FILETYPES_HASKELL]->pattern = utils_strv_new("*.hs", "*.lhs", NULL);
 
314
        filetypes[GEANY_FILETYPES_HASKELL]->comment_open = g_strdup("--");
 
315
        filetypes[GEANY_FILETYPES_HASKELL]->comment_close = NULL;
415
316
 
416
317
#define SH
417
 
        filetypes[GEANY_FILETYPES_SH] = g_new0(filetype, 1);
418
318
        filetypes[GEANY_FILETYPES_SH]->id = GEANY_FILETYPES_SH;
419
319
        filetypes[GEANY_FILETYPES_SH]->uid = FILETYPE_UID_SH;
420
 
        filetypes[GEANY_FILETYPES_SH]->item = NULL;
421
320
        filetypes[GEANY_FILETYPES_SH]->lang = 16;
422
321
        filetypes[GEANY_FILETYPES_SH]->name = g_strdup("Sh");
423
 
        filetypes[GEANY_FILETYPES_SH]->has_tags = TRUE;
424
322
        filetypes[GEANY_FILETYPES_SH]->title = g_strdup(_("Shell script file"));
425
323
        filetypes[GEANY_FILETYPES_SH]->extension = g_strdup("sh");
426
 
        filetypes[GEANY_FILETYPES_SH]->pattern = g_new0(gchar*, 8);
427
 
        filetypes[GEANY_FILETYPES_SH]->pattern[0] = g_strdup("*.sh");
428
 
        filetypes[GEANY_FILETYPES_SH]->pattern[1] = g_strdup("configure");
429
 
        filetypes[GEANY_FILETYPES_SH]->pattern[2] = g_strdup("configure.in");
430
 
        filetypes[GEANY_FILETYPES_SH]->pattern[3] = g_strdup("configure.in.in");
431
 
        filetypes[GEANY_FILETYPES_SH]->pattern[4] = g_strdup("configure.ac");
432
 
        filetypes[GEANY_FILETYPES_SH]->pattern[5] = g_strdup("*.ksh");
433
 
        filetypes[GEANY_FILETYPES_SH]->pattern[6] = g_strdup("*.zsh");
434
 
        filetypes[GEANY_FILETYPES_SH]->pattern[7] = NULL;
435
 
        filetypes[GEANY_FILETYPES_SH]->style_func_ptr = styleset_sh;
 
324
        filetypes[GEANY_FILETYPES_SH]->pattern = utils_strv_new("*.sh", "configure", "configure.in",
 
325
                "configure.in.in", "configure.ac", "*.ksh", "*.zsh", "*.ash", "*.bash", NULL);
436
326
        filetypes[GEANY_FILETYPES_SH]->comment_open = g_strdup("#");
437
327
        filetypes[GEANY_FILETYPES_SH]->comment_close = NULL;
438
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_SH]);
439
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_SH]->title, filetypes[GEANY_FILETYPES_SH]);
440
328
 
441
329
#define MAKE
442
 
        filetypes[GEANY_FILETYPES_MAKE] = g_new0(filetype, 1);
443
330
        filetypes[GEANY_FILETYPES_MAKE]->id = GEANY_FILETYPES_MAKE;
444
331
        filetypes[GEANY_FILETYPES_MAKE]->uid = FILETYPE_UID_MAKE;
445
 
        filetypes[GEANY_FILETYPES_MAKE]->item = NULL;
446
332
        filetypes[GEANY_FILETYPES_MAKE]->lang = 3;
447
333
        filetypes[GEANY_FILETYPES_MAKE]->name = g_strdup("Make");
448
 
        filetypes[GEANY_FILETYPES_MAKE]->has_tags = TRUE;
449
334
        filetypes[GEANY_FILETYPES_MAKE]->title = g_strdup(_("Makefile"));
450
335
        filetypes[GEANY_FILETYPES_MAKE]->extension = g_strdup("mak");
451
 
        {
452
 
                gchar *pattern_make[] = {"*.mak", "*.mk", "Makefile*", "makefile*", NULL};
453
 
                filetypes[GEANY_FILETYPES_MAKE]->pattern = g_strdupv(pattern_make);
454
 
        }
455
 
        filetypes[GEANY_FILETYPES_MAKE]->style_func_ptr = styleset_makefile;
 
336
        filetypes[GEANY_FILETYPES_MAKE]->pattern = utils_strv_new(
 
337
                "*.mak", "*.mk", "GNUmakefile", "makefile", "Makefile", "makefile.*", "Makefile.*", NULL);
456
338
        filetypes[GEANY_FILETYPES_MAKE]->comment_open = g_strdup("#");
457
339
        filetypes[GEANY_FILETYPES_MAKE]->comment_close = NULL;
458
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_MAKE]);
459
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_MAKE]->title, filetypes[GEANY_FILETYPES_MAKE]);
460
340
 
461
341
#define XML
462
 
        filetypes[GEANY_FILETYPES_XML] = g_new0(filetype, 1);
463
342
        filetypes[GEANY_FILETYPES_XML]->id = GEANY_FILETYPES_XML;
464
343
        filetypes[GEANY_FILETYPES_XML]->uid = FILETYPE_UID_XML;
465
 
        filetypes[GEANY_FILETYPES_XML]->item = NULL;
466
344
        filetypes[GEANY_FILETYPES_XML]->lang = -2;
467
345
        filetypes[GEANY_FILETYPES_XML]->name = g_strdup("XML");
468
 
        filetypes[GEANY_FILETYPES_XML]->has_tags = FALSE;
469
 
        filetypes[GEANY_FILETYPES_XML]->title = g_strdup(_("XML source file"));
 
346
        filetypes[GEANY_FILETYPES_XML]->title = g_strdup(_("XML document"));
470
347
        filetypes[GEANY_FILETYPES_XML]->extension = g_strdup("xml");
471
 
        filetypes[GEANY_FILETYPES_XML]->pattern = g_new0(gchar*, 3);
472
 
        filetypes[GEANY_FILETYPES_XML]->pattern[0] = g_strdup("*.xml");
473
 
        filetypes[GEANY_FILETYPES_XML]->pattern[1] = g_strdup("*.sgml");
474
 
        filetypes[GEANY_FILETYPES_XML]->pattern[2] = NULL;
475
 
        filetypes[GEANY_FILETYPES_XML]->style_func_ptr = styleset_xml;
 
348
        filetypes[GEANY_FILETYPES_XML]->pattern = utils_strv_new(
 
349
                "*.xml", "*.sgml", "*.xsl", "*.xslt", "*.xsd", "*.xhtml", NULL);
476
350
        filetypes[GEANY_FILETYPES_XML]->comment_open = g_strdup("<!--");
477
351
        filetypes[GEANY_FILETYPES_XML]->comment_close = g_strdup("-->");
478
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_XML]);
479
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_XML]->title, filetypes[GEANY_FILETYPES_XML]);
480
352
 
481
353
#define DOCBOOK
482
 
        filetypes[GEANY_FILETYPES_DOCBOOK] = g_new0(filetype, 1);
483
354
        filetypes[GEANY_FILETYPES_DOCBOOK]->id = GEANY_FILETYPES_DOCBOOK;
484
355
        filetypes[GEANY_FILETYPES_DOCBOOK]->uid = FILETYPE_UID_DOCBOOK;
485
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->item = NULL;
486
356
        filetypes[GEANY_FILETYPES_DOCBOOK]->lang = 12;
487
357
        filetypes[GEANY_FILETYPES_DOCBOOK]->name = g_strdup("Docbook");
488
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->has_tags = TRUE;
489
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->title = g_strdup(_("Docbook source file"));
 
358
        filetypes[GEANY_FILETYPES_DOCBOOK]->title = g_strdup_printf(_("%s source file"), "Docbook");
490
359
        filetypes[GEANY_FILETYPES_DOCBOOK]->extension = g_strdup("docbook");
491
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->pattern = g_new0(gchar*, 2);
492
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->pattern[0] = g_strdup("*.docbook");
493
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->pattern[1] = NULL;
494
 
        filetypes[GEANY_FILETYPES_DOCBOOK]->style_func_ptr = styleset_docbook;
 
360
        filetypes[GEANY_FILETYPES_DOCBOOK]->pattern = utils_strv_new("*.docbook", NULL);
495
361
        filetypes[GEANY_FILETYPES_DOCBOOK]->comment_open = g_strdup("<!--");
496
362
        filetypes[GEANY_FILETYPES_DOCBOOK]->comment_close = g_strdup("-->");
497
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_DOCBOOK]);
498
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_DOCBOOK]->title, filetypes[GEANY_FILETYPES_DOCBOOK]);
499
363
 
500
364
#define HTML
501
 
        filetypes[GEANY_FILETYPES_HTML] = g_new0(filetype, 1);
502
365
        filetypes[GEANY_FILETYPES_HTML]->id = GEANY_FILETYPES_HTML;
503
366
        filetypes[GEANY_FILETYPES_HTML]->uid = FILETYPE_UID_HTML;
504
 
        filetypes[GEANY_FILETYPES_HTML]->item = NULL;
505
 
        filetypes[GEANY_FILETYPES_HTML]->lang = -2;
 
367
        filetypes[GEANY_FILETYPES_HTML]->lang = 29;
506
368
        filetypes[GEANY_FILETYPES_HTML]->name = g_strdup("HTML");
507
 
        filetypes[GEANY_FILETYPES_HTML]->has_tags = FALSE;
508
 
        filetypes[GEANY_FILETYPES_HTML]->title = g_strdup(_("HTML source file"));
 
369
        filetypes[GEANY_FILETYPES_HTML]->title = g_strdup_printf(_("%s source file"), "HTML");
509
370
        filetypes[GEANY_FILETYPES_HTML]->extension = g_strdup("html");
510
 
        filetypes[GEANY_FILETYPES_HTML]->pattern = g_new0(gchar*, 8);
511
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[0] = g_strdup("*.htm");
512
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[1] = g_strdup("*.html");
513
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[2] = g_strdup("*.shtml");
514
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[3] = g_strdup("*.hta");
515
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[4] = g_strdup("*.htd");
516
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[5] = g_strdup("*.htt");
517
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[6] = g_strdup("*.cfm");
518
 
        filetypes[GEANY_FILETYPES_HTML]->pattern[7] = NULL;
519
 
        filetypes[GEANY_FILETYPES_HTML]->style_func_ptr = styleset_html;
 
371
        filetypes[GEANY_FILETYPES_HTML]->pattern = utils_strv_new(
 
372
                "*.htm", "*.html", "*.shtml", "*.hta", "*.htd", "*.htt", "*.cfm", NULL);
520
373
        filetypes[GEANY_FILETYPES_HTML]->comment_open = g_strdup("<!--");
521
374
        filetypes[GEANY_FILETYPES_HTML]->comment_close = g_strdup("-->");
522
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_HTML]);
523
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_HTML]->title, filetypes[GEANY_FILETYPES_HTML]);
524
375
 
525
376
#define CSS
526
 
        filetypes[GEANY_FILETYPES_CSS] = g_new0(filetype, 1);
527
377
        filetypes[GEANY_FILETYPES_CSS]->id = GEANY_FILETYPES_CSS;
528
378
        filetypes[GEANY_FILETYPES_CSS]->uid = FILETYPE_UID_CSS;
529
 
        filetypes[GEANY_FILETYPES_CSS]->item = NULL;
530
379
        filetypes[GEANY_FILETYPES_CSS]->lang = 13;
531
380
        filetypes[GEANY_FILETYPES_CSS]->name = g_strdup("CSS");
532
 
        filetypes[GEANY_FILETYPES_CSS]->has_tags = TRUE;
533
381
        filetypes[GEANY_FILETYPES_CSS]->title = g_strdup(_("Cascading StyleSheet"));
534
382
        filetypes[GEANY_FILETYPES_CSS]->extension = g_strdup("css");
535
 
        filetypes[GEANY_FILETYPES_CSS]->pattern = g_new0(gchar*, 2);
536
 
        filetypes[GEANY_FILETYPES_CSS]->pattern[0] = g_strdup("*.css");
537
 
        filetypes[GEANY_FILETYPES_CSS]->pattern[1] = NULL;
538
 
        filetypes[GEANY_FILETYPES_CSS]->style_func_ptr = styleset_css;
 
383
        filetypes[GEANY_FILETYPES_CSS]->pattern = utils_strv_new("*.css", NULL);
539
384
        filetypes[GEANY_FILETYPES_CSS]->comment_open = g_strdup("/*");
540
385
        filetypes[GEANY_FILETYPES_CSS]->comment_close = g_strdup("*/");
541
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_CSS]);
542
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_CSS]->title, filetypes[GEANY_FILETYPES_CSS]);
543
386
 
544
387
#define SQL
545
 
        filetypes[GEANY_FILETYPES_SQL] = g_new0(filetype, 1);
546
388
        filetypes[GEANY_FILETYPES_SQL]->id = GEANY_FILETYPES_SQL;
547
389
        filetypes[GEANY_FILETYPES_SQL]->uid = FILETYPE_UID_SQL;
548
 
        filetypes[GEANY_FILETYPES_SQL]->item = NULL;
549
390
        filetypes[GEANY_FILETYPES_SQL]->lang = 11;
550
391
        filetypes[GEANY_FILETYPES_SQL]->name = g_strdup("SQL");
551
 
        filetypes[GEANY_FILETYPES_SQL]->has_tags = TRUE;
552
392
        filetypes[GEANY_FILETYPES_SQL]->title = g_strdup(_("SQL Dump file"));
553
393
        filetypes[GEANY_FILETYPES_SQL]->extension = g_strdup("sql");
554
 
        filetypes[GEANY_FILETYPES_SQL]->pattern = g_new0(gchar*, 2);
555
 
        filetypes[GEANY_FILETYPES_SQL]->pattern[0] = g_strdup("*.sql");
556
 
        filetypes[GEANY_FILETYPES_SQL]->pattern[1] = NULL;
557
 
        filetypes[GEANY_FILETYPES_SQL]->style_func_ptr = styleset_sql;
 
394
        filetypes[GEANY_FILETYPES_SQL]->pattern = utils_strv_new("*.sql", NULL);
558
395
        filetypes[GEANY_FILETYPES_SQL]->comment_open = g_strdup("/*");
559
396
        filetypes[GEANY_FILETYPES_SQL]->comment_close = g_strdup("*/");
560
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_SQL]);
561
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_SQL]->title, filetypes[GEANY_FILETYPES_SQL]);
562
397
 
563
398
#define LATEX
564
 
        filetypes[GEANY_FILETYPES_LATEX] = g_new0(filetype, 1);
565
399
        filetypes[GEANY_FILETYPES_LATEX]->id = GEANY_FILETYPES_LATEX;
566
400
        filetypes[GEANY_FILETYPES_LATEX]->uid = FILETYPE_UID_LATEX;
567
 
        filetypes[GEANY_FILETYPES_LATEX]->item = NULL;
568
401
        filetypes[GEANY_FILETYPES_LATEX]->lang = 8;
569
402
        filetypes[GEANY_FILETYPES_LATEX]->name = g_strdup("LaTeX");
570
 
        filetypes[GEANY_FILETYPES_LATEX]->has_tags = TRUE;
571
 
        filetypes[GEANY_FILETYPES_LATEX]->title = g_strdup(_("LaTeX source file"));
 
403
        filetypes[GEANY_FILETYPES_LATEX]->title = g_strdup_printf(_("%s source file"), "LaTeX");
572
404
        filetypes[GEANY_FILETYPES_LATEX]->extension = g_strdup("tex");
573
 
        filetypes[GEANY_FILETYPES_LATEX]->pattern = g_new0(gchar*, 4);
574
 
        filetypes[GEANY_FILETYPES_LATEX]->pattern[0] = g_strdup("*.tex");
575
 
        filetypes[GEANY_FILETYPES_LATEX]->pattern[1] = g_strdup("*.sty");
576
 
        filetypes[GEANY_FILETYPES_LATEX]->pattern[2] = g_strdup("*.idx");
577
 
        filetypes[GEANY_FILETYPES_LATEX]->pattern[3] = NULL;
578
 
        filetypes[GEANY_FILETYPES_LATEX]->style_func_ptr = styleset_latex;
 
405
        filetypes[GEANY_FILETYPES_LATEX]->pattern = utils_strv_new("*.tex", "*.sty", "*.idx", "*.ltx", NULL);
579
406
        filetypes[GEANY_FILETYPES_LATEX]->comment_open = g_strdup("%");
580
407
        filetypes[GEANY_FILETYPES_LATEX]->comment_close = NULL;
581
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_LATEX]);
582
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_LATEX]->title, filetypes[GEANY_FILETYPES_LATEX]);
583
408
 
584
409
#define OMS
585
 
        filetypes[GEANY_FILETYPES_OMS] = g_new0(filetype, 1);
586
410
        filetypes[GEANY_FILETYPES_OMS]->id = GEANY_FILETYPES_OMS;
587
411
        filetypes[GEANY_FILETYPES_OMS]->uid = FILETYPE_UID_OMS;
588
 
        filetypes[GEANY_FILETYPES_OMS]->item = NULL;
589
412
        filetypes[GEANY_FILETYPES_OMS]->lang = -2;
590
413
        filetypes[GEANY_FILETYPES_OMS]->name = g_strdup("O-Matrix");
591
 
        filetypes[GEANY_FILETYPES_OMS]->has_tags = FALSE;
592
 
        filetypes[GEANY_FILETYPES_OMS]->title = g_strdup(_("O-Matrix source file"));
 
414
        filetypes[GEANY_FILETYPES_OMS]->title = g_strdup_printf(_("%s source file"), "O-Matrix");
593
415
        filetypes[GEANY_FILETYPES_OMS]->extension = g_strdup("oms");
594
 
        filetypes[GEANY_FILETYPES_OMS]->pattern = g_new0(gchar*, 2);
595
 
        filetypes[GEANY_FILETYPES_OMS]->pattern[0] = g_strdup("*.oms");
596
 
        filetypes[GEANY_FILETYPES_OMS]->pattern[1] = NULL;
597
 
        filetypes[GEANY_FILETYPES_OMS]->style_func_ptr = styleset_oms;
 
416
        filetypes[GEANY_FILETYPES_OMS]->pattern = utils_strv_new("*.oms", NULL);
598
417
        filetypes[GEANY_FILETYPES_OMS]->comment_open = g_strdup("#");
599
418
        filetypes[GEANY_FILETYPES_OMS]->comment_close = NULL;
600
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_OMS]);
601
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_OMS]->title, filetypes[GEANY_FILETYPES_OMS]);
 
419
 
 
420
#define VHDL
 
421
        filetypes[GEANY_FILETYPES_VHDL]->id = GEANY_FILETYPES_VHDL;
 
422
        filetypes[GEANY_FILETYPES_VHDL]->uid = FILETYPE_UID_VHDL;
 
423
        filetypes[GEANY_FILETYPES_VHDL]->lang = 21;
 
424
        filetypes[GEANY_FILETYPES_VHDL]->name = g_strdup("VHDL");
 
425
        filetypes[GEANY_FILETYPES_VHDL]->title = g_strdup_printf(_("%s source file"), "VHDL");
 
426
        filetypes[GEANY_FILETYPES_VHDL]->extension = g_strdup("vhd");
 
427
        filetypes[GEANY_FILETYPES_VHDL]->pattern = utils_strv_new("*.vhd", "*.vhdl", NULL);
 
428
        filetypes[GEANY_FILETYPES_VHDL]->comment_open = g_strdup("--");
 
429
        filetypes[GEANY_FILETYPES_VHDL]->comment_close = NULL;
602
430
 
603
431
#define DIFF
604
 
        filetypes[GEANY_FILETYPES_DIFF] = g_new0(filetype, 1);
605
432
        filetypes[GEANY_FILETYPES_DIFF]->id = GEANY_FILETYPES_DIFF;
606
433
        filetypes[GEANY_FILETYPES_DIFF]->uid = FILETYPE_UID_DIFF;
607
 
        filetypes[GEANY_FILETYPES_DIFF]->item = NULL;
608
 
        filetypes[GEANY_FILETYPES_DIFF]->lang = -2;
 
434
        filetypes[GEANY_FILETYPES_DIFF]->lang = 20;
609
435
        filetypes[GEANY_FILETYPES_DIFF]->name = g_strdup("Diff");
610
 
        filetypes[GEANY_FILETYPES_DIFF]->has_tags = FALSE;
611
436
        filetypes[GEANY_FILETYPES_DIFF]->title = g_strdup(_("Diff file"));
612
437
        filetypes[GEANY_FILETYPES_DIFF]->extension = g_strdup("diff");
613
 
        filetypes[GEANY_FILETYPES_DIFF]->pattern = g_new0(gchar*, 3);
614
 
        filetypes[GEANY_FILETYPES_DIFF]->pattern[0] = g_strdup("*.diff");
615
 
        filetypes[GEANY_FILETYPES_DIFF]->pattern[1] = g_strdup("*.patch");
616
 
        filetypes[GEANY_FILETYPES_DIFF]->pattern[2] = NULL;
617
 
        filetypes[GEANY_FILETYPES_DIFF]->style_func_ptr = styleset_diff;
 
438
        filetypes[GEANY_FILETYPES_DIFF]->pattern = utils_strv_new("*.diff", "*.patch", "*.rej", NULL);
618
439
        filetypes[GEANY_FILETYPES_DIFF]->comment_open = g_strdup("#");
619
440
        filetypes[GEANY_FILETYPES_DIFF]->comment_close = NULL;
620
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_DIFF]);
621
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_DIFF]->title, filetypes[GEANY_FILETYPES_DIFF]);
622
441
 
623
442
#define CONF
624
 
        filetypes[GEANY_FILETYPES_CONF] = g_new0(filetype, 1);
625
443
        filetypes[GEANY_FILETYPES_CONF]->id = GEANY_FILETYPES_CONF;
626
444
        filetypes[GEANY_FILETYPES_CONF]->uid = FILETYPE_UID_CONF;
627
 
        filetypes[GEANY_FILETYPES_CONF]->item = NULL;
628
445
        filetypes[GEANY_FILETYPES_CONF]->lang = 10;
629
446
        filetypes[GEANY_FILETYPES_CONF]->name = g_strdup("Conf");
630
 
        filetypes[GEANY_FILETYPES_CONF]->has_tags = TRUE;
631
447
        filetypes[GEANY_FILETYPES_CONF]->title = g_strdup(_("Config file"));
632
448
        filetypes[GEANY_FILETYPES_CONF]->extension = g_strdup("conf");
633
 
        filetypes[GEANY_FILETYPES_CONF]->pattern = g_new0(gchar*, 6);
634
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[0] = g_strdup("*.conf");
635
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[1] = g_strdup("*.ini");
636
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[2] = g_strdup("config");
637
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[3] = g_strdup("*rc");
638
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[4] = g_strdup("*.cfg");
639
 
        filetypes[GEANY_FILETYPES_CONF]->pattern[5] = NULL;
640
 
        filetypes[GEANY_FILETYPES_CONF]->style_func_ptr = styleset_conf;
 
449
        filetypes[GEANY_FILETYPES_CONF]->pattern = utils_strv_new("*.conf", "*.ini", "config", "*rc",
 
450
                "*.cfg", NULL);
641
451
        filetypes[GEANY_FILETYPES_CONF]->comment_open = g_strdup("#");
642
452
        filetypes[GEANY_FILETYPES_CONF]->comment_close = NULL;
643
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_CONF]);
644
 
        filetypes_create_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_CONF]->title, filetypes[GEANY_FILETYPES_CONF]);
 
453
 
 
454
#define HAXE
 
455
        filetypes[GEANY_FILETYPES_HAXE]->id = GEANY_FILETYPES_HAXE;
 
456
        filetypes[GEANY_FILETYPES_HAXE]->uid = FILETYPE_UID_HAXE;
 
457
        filetypes[GEANY_FILETYPES_HAXE]->lang = 27;
 
458
        filetypes[GEANY_FILETYPES_HAXE]->name = g_strdup("Haxe");
 
459
        filetypes[GEANY_FILETYPES_HAXE]->title = g_strdup_printf(_("%s source file"), "Haxe");
 
460
        filetypes[GEANY_FILETYPES_HAXE]->extension = g_strdup("hx");
 
461
        filetypes[GEANY_FILETYPES_HAXE]->pattern = utils_strv_new("*.hx", NULL);
 
462
        filetypes[GEANY_FILETYPES_HAXE]->comment_open = g_strdup("//");
 
463
        filetypes[GEANY_FILETYPES_HAXE]->comment_close = NULL;
 
464
 
 
465
#define REST
 
466
        filetypes[GEANY_FILETYPES_REST]->id = GEANY_FILETYPES_REST;
 
467
        filetypes[GEANY_FILETYPES_REST]->uid = FILETYPE_UID_REST;
 
468
        filetypes[GEANY_FILETYPES_REST]->lang = 28;
 
469
        filetypes[GEANY_FILETYPES_REST]->name = g_strdup("reStructuredText");
 
470
        filetypes[GEANY_FILETYPES_REST]->title = g_strdup(_("reStructuredText file"));
 
471
        filetypes[GEANY_FILETYPES_REST]->extension = g_strdup("rst");
 
472
        filetypes[GEANY_FILETYPES_REST]->pattern = utils_strv_new(
 
473
                "*.rest", "*.reST", "*.rst", NULL);
 
474
        filetypes[GEANY_FILETYPES_REST]->comment_open = NULL;
 
475
        filetypes[GEANY_FILETYPES_REST]->comment_close = NULL;
645
476
 
646
477
#define ALL
647
 
        filetypes[GEANY_FILETYPES_ALL] = g_new0(filetype, 1);
648
478
        filetypes[GEANY_FILETYPES_ALL]->id = GEANY_FILETYPES_ALL;
649
479
        filetypes[GEANY_FILETYPES_ALL]->name = g_strdup("None");
650
480
        filetypes[GEANY_FILETYPES_ALL]->uid = FILETYPE_UID_ALL;
651
 
        filetypes[GEANY_FILETYPES_ALL]->item = NULL;
652
481
        filetypes[GEANY_FILETYPES_ALL]->lang = -2;
653
 
        filetypes[GEANY_FILETYPES_ALL]->has_tags = FALSE;
654
482
        filetypes[GEANY_FILETYPES_ALL]->title = g_strdup(_("All files"));
655
483
        filetypes[GEANY_FILETYPES_ALL]->extension = g_strdup("*");
656
 
        filetypes[GEANY_FILETYPES_ALL]->pattern = g_new0(gchar*, 2);
657
 
        filetypes[GEANY_FILETYPES_ALL]->pattern[0] = g_strdup("*");
658
 
        filetypes[GEANY_FILETYPES_ALL]->pattern[1] = NULL;
659
 
        filetypes[GEANY_FILETYPES_ALL]->style_func_ptr = styleset_none;
 
484
        filetypes[GEANY_FILETYPES_ALL]->pattern = utils_strv_new("*", NULL);
660
485
        filetypes[GEANY_FILETYPES_ALL]->comment_open = NULL;
661
486
        filetypes[GEANY_FILETYPES_ALL]->comment_close = NULL;
662
 
        filetypes_init_build_programs(filetypes[GEANY_FILETYPES_ALL]);
663
 
        filetypes_create_menu_item(filetype_menu, _("None"), filetypes[GEANY_FILETYPES_ALL]);
664
 
 
665
 
        // now add the items for the new file menu
666
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_C]->title,
667
 
                                                                                                                                filetypes[GEANY_FILETYPES_C]);
668
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_CPP]->title,
669
 
                                                                                                                                filetypes[GEANY_FILETYPES_CPP]);
670
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_D]->title,
671
 
                                                                                                                                filetypes[GEANY_FILETYPES_D]);
672
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_JAVA]->title,
673
 
                                                                                                                                filetypes[GEANY_FILETYPES_JAVA]);
674
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_PASCAL]->title,
675
 
                                                                                                                                filetypes[GEANY_FILETYPES_PASCAL]);
676
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_RUBY]->title,
677
 
                                                                                                                                filetypes[GEANY_FILETYPES_RUBY]);
678
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_PHP]->title,
679
 
                                                                                                                                filetypes[GEANY_FILETYPES_PHP]);
680
 
        filetypes_create_newmenu_item(template_menu, filetypes[GEANY_FILETYPES_HTML]->title,
681
 
                                                                                                                                filetypes[GEANY_FILETYPES_HTML]);
682
 
 
683
 
}
684
 
 
685
 
 
686
 
/* convenient function to save code size */
687
 
static void filetypes_init_build_programs(filetype *ftype)
688
 
{
689
 
        ftype->programs = g_new0(struct build_programs, 1);
690
 
 
691
 
        ftype->menu_items = g_new0(struct build_menu_items, 1);
692
 
}
693
 
 
694
 
 
695
 
/* simple filetype selection based on the filename extension */
696
 
filetype *filetypes_get_from_filename(const gchar *filename)
 
487
}
 
488
 
 
489
 
 
490
#define create_sub_menu(menu, item, title) \
 
491
        (menu) = gtk_menu_new(); \
 
492
        (item) = gtk_menu_item_new_with_mnemonic((title)); \
 
493
        gtk_menu_item_set_submenu(GTK_MENU_ITEM((item)), (menu)); \
 
494
        gtk_container_add(GTK_CONTAINER(filetype_menu), (item)); \
 
495
        gtk_widget_show((item));
 
496
 
 
497
 
 
498
/* Calls filetypes_init_types() and creates the filetype menu. */
 
499
void filetypes_init()
 
500
{
 
501
        filetype_id ft_id;
 
502
        GtkWidget *filetype_menu = lookup_widget(app->window, "set_filetype1_menu");
 
503
        GtkWidget *sub_menu = filetype_menu;
 
504
        GtkWidget *sub_menu_programming, *sub_menu_scripts, *sub_menu_markup, *sub_menu_misc;
 
505
        GtkWidget *sub_item_programming, *sub_item_scripts, *sub_item_markup, *sub_item_misc;
 
506
 
 
507
        filetypes_init_types();
 
508
 
 
509
        create_sub_menu(sub_menu_programming, sub_item_programming, _("_Programming Languages"));
 
510
        create_sub_menu(sub_menu_scripts, sub_item_scripts, _("_Scripting Languages"));
 
511
        create_sub_menu(sub_menu_markup, sub_item_markup, _("_Markup Languages"));
 
512
        create_sub_menu(sub_menu_misc, sub_item_misc, _("M_iscellaneous Languages"));
 
513
 
 
514
        /* Append all filetypes to the filetype menu */
 
515
        for (ft_id = 0; ft_id < GEANY_MAX_FILE_TYPES; ft_id++)
 
516
        {
 
517
                filetype *ft = filetypes[ft_id];
 
518
                const gchar *title = ft->title;
 
519
 
 
520
                /* insert separators for different filetype groups */
 
521
                switch (ft_id)
 
522
                {
 
523
                        case GEANY_FILETYPES_GROUP_COMPILED:    /* programming */
 
524
                        {
 
525
                                sub_menu = sub_menu_programming;
 
526
                                break;
 
527
                        }
 
528
                        case GEANY_FILETYPES_GROUP_SCRIPT:      /* scripts */
 
529
                        {
 
530
                                sub_menu = sub_menu_scripts;
 
531
                                break;
 
532
                        }
 
533
                        case GEANY_FILETYPES_GROUP_MARKUP:      /* markup */
 
534
                        {       /* (include also CSS, not really markup but fit quite well to HTML) */
 
535
                                sub_menu = sub_menu_markup;
 
536
                                break;
 
537
                        }
 
538
                        case GEANY_FILETYPES_GROUP_MISC:        /* misc */
 
539
                        {
 
540
                                sub_menu = sub_menu_misc;
 
541
                                break;
 
542
                        }
 
543
                        case GEANY_FILETYPES_ALL:       /* none */
 
544
                        {
 
545
                                sub_menu = filetype_menu;
 
546
                                title = _("None");
 
547
                                break;
 
548
                        }
 
549
                        default: break;
 
550
                }
 
551
                ft->item = NULL;
 
552
                filetypes_create_menu_item(sub_menu, title, ft);
 
553
        }
 
554
}
 
555
 
 
556
 
 
557
/* If uid is valid, return corresponding filetype, otherwise NULL. */
 
558
filetype *filetypes_get_from_uid(gint uid)
 
559
{
 
560
        gint i;
 
561
 
 
562
        for (i = 0; i < GEANY_MAX_FILE_TYPES; i++)
 
563
        {
 
564
                filetype *ft = filetypes[i];
 
565
 
 
566
                if (ft->uid == (guint) uid)
 
567
                        return ft;
 
568
        }
 
569
        return NULL;
 
570
}
 
571
 
 
572
 
 
573
/* Detect filetype only based on the filename extension.
 
574
 * utf8_filename can include the full path. */
 
575
filetype *filetypes_detect_from_extension(const gchar *utf8_filename)
697
576
{
698
577
        GPatternSpec *pattern;
699
 
        gchar *base_filename, *utf8_filename;
 
578
        gchar *base_filename;
700
579
        gint i, j;
701
580
 
702
 
        if (filename == NULL)
703
 
        {
704
 
                return filetypes[GEANY_FILETYPES_ALL];
705
 
        }
706
 
 
707
 
        // try to get the UTF-8 equivalent for the filename
708
 
        utf8_filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL);
709
 
        if (utf8_filename == NULL)
710
 
        {
711
 
                return filetypes[GEANY_FILETYPES_ALL];
712
 
        }
713
 
 
714
 
        // to match against the basename of the file(because of Makefile*)
 
581
        /* to match against the basename of the file(because of Makefile*) */
715
582
        base_filename = g_path_get_basename(utf8_filename);
716
 
        g_free(utf8_filename);
 
583
#ifdef G_OS_WIN32
 
584
        /* use lower case basename */
 
585
        setptr(base_filename, g_utf8_strdown(base_filename, -1));
 
586
#endif
717
587
 
718
588
        for(i = 0; i < GEANY_MAX_FILE_TYPES; i++)
719
589
        {
735
605
}
736
606
 
737
607
 
 
608
static filetype *find_shebang(const gchar *utf8_filename, const gchar *line)
 
609
{
 
610
        filetype *ft = NULL;
 
611
 
 
612
        if (strlen(line) > 2 && line[0] == '#' && line[1] == '!')
 
613
        {
 
614
                gchar *tmp = g_path_get_basename(line + 2);
 
615
                gchar *basename_interpreter = tmp;
 
616
 
 
617
                if (strncmp(tmp, "env ", 4) == 0 && strlen(tmp) > 4)
 
618
                {       /* skip "env" and read the following interpreter */
 
619
                        basename_interpreter +=4;
 
620
                }
 
621
 
 
622
                if (strncmp(basename_interpreter, "sh", 2) == 0)
 
623
                        ft = filetypes[GEANY_FILETYPES_SH];
 
624
                else if (strncmp(basename_interpreter, "bash", 4) == 0)
 
625
                        ft = filetypes[GEANY_FILETYPES_SH];
 
626
                else if (strncmp(basename_interpreter, "perl", 4) == 0)
 
627
                        ft = filetypes[GEANY_FILETYPES_PERL];
 
628
                else if (strncmp(basename_interpreter, "python", 6) == 0)
 
629
                        ft = filetypes[GEANY_FILETYPES_PYTHON];
 
630
                else if (strncmp(basename_interpreter, "php", 3) == 0)
 
631
                        ft = filetypes[GEANY_FILETYPES_PHP];
 
632
                else if (strncmp(basename_interpreter, "ruby", 4) == 0)
 
633
                        ft = filetypes[GEANY_FILETYPES_RUBY];
 
634
                else if (strncmp(basename_interpreter, "tcl", 3) == 0)
 
635
                        ft = filetypes[GEANY_FILETYPES_TCL];
 
636
                else if (strncmp(basename_interpreter, "zsh", 3) == 0)
 
637
                        ft = filetypes[GEANY_FILETYPES_SH];
 
638
                else if (strncmp(basename_interpreter, "ksh", 3) == 0)
 
639
                        ft = filetypes[GEANY_FILETYPES_SH];
 
640
                else if (strncmp(basename_interpreter, "csh", 3) == 0)
 
641
                        ft = filetypes[GEANY_FILETYPES_SH];
 
642
                else if (strncmp(basename_interpreter, "ash", 3) == 0)
 
643
                        ft = filetypes[GEANY_FILETYPES_SH];
 
644
                else if (strncmp(basename_interpreter, "dmd", 3) == 0)
 
645
                        ft = filetypes[GEANY_FILETYPES_D];
 
646
                else if (strncmp(basename_interpreter, "wish", 4) == 0)
 
647
                        ft = filetypes[GEANY_FILETYPES_TCL];
 
648
 
 
649
                g_free(tmp);
 
650
        }
 
651
        /* detect XML files */
 
652
        if (utf8_filename && strncmp(line, "<?xml", 5) == 0)
 
653
        {
 
654
                /* HTML and DocBook files might also start with <?xml, so detect them based on filename
 
655
                 * extension and use the detected filetype, else assume XML */
 
656
                ft = filetypes_detect_from_extension(utf8_filename);
 
657
                if (FILETYPE_ID(ft) != GEANY_FILETYPES_HTML &&
 
658
                        FILETYPE_ID(ft) != GEANY_FILETYPES_DOCBOOK &&
 
659
                        FILETYPE_ID(ft) != GEANY_FILETYPES_PERL &&      /* Perl, Python and PHP only to be safe */
 
660
                        FILETYPE_ID(ft) != GEANY_FILETYPES_PHP &&
 
661
                        FILETYPE_ID(ft) != GEANY_FILETYPES_PYTHON)
 
662
                {
 
663
                        ft = filetypes[GEANY_FILETYPES_XML];
 
664
                }
 
665
        }
 
666
        else if (strncmp(line, "<?php", 5) == 0)
 
667
        {
 
668
                ft = filetypes[GEANY_FILETYPES_PHP];
 
669
        }
 
670
 
 
671
        return ft;
 
672
}
 
673
 
 
674
 
 
675
/* Detect the filetype checking for a shebang, then filename extension. */
 
676
static filetype *filetypes_detect_from_file_internal(const gchar *utf8_filename, const gchar *line)
 
677
{
 
678
        filetype *ft;
 
679
 
 
680
        /* try to find a shebang and if found use it prior to the filename extension
 
681
         * also checks for <?xml */
 
682
        ft = find_shebang(utf8_filename, line);
 
683
        if (ft != NULL)
 
684
                return ft;
 
685
 
 
686
        if (utf8_filename == NULL)
 
687
                return filetypes[GEANY_FILETYPES_ALL];
 
688
 
 
689
        return filetypes_detect_from_extension(utf8_filename);
 
690
}
 
691
 
 
692
 
 
693
/* Detect the filetype for document idx. */
 
694
filetype *filetypes_detect_from_file(gint idx)
 
695
{
 
696
        filetype *ft;
 
697
        gchar *line;
 
698
 
 
699
        if (! DOC_IDX_VALID(idx))
 
700
                return filetypes[GEANY_FILETYPES_ALL];
 
701
 
 
702
        line = sci_get_line(doc_list[idx].sci, 0);
 
703
        ft = filetypes_detect_from_file_internal(doc_list[idx].file_name, line);
 
704
        g_free(line);
 
705
        return ft;
 
706
}
 
707
 
 
708
 
 
709
/* Detect filetype based on the filename extension.
 
710
 * utf8_filename can include the full path. */
 
711
filetype *filetypes_detect_from_filename(const gchar *utf8_filename)
 
712
{
 
713
        gchar line[1024];
 
714
        FILE *f;
 
715
        gchar *locale_name = utils_get_locale_from_utf8(utf8_filename);
 
716
 
 
717
        f = g_fopen(locale_name, "r");
 
718
        g_free(locale_name);
 
719
        if (f != NULL)
 
720
        {
 
721
                if (fgets(line, sizeof(line), f) != NULL)
 
722
                {
 
723
                        fclose(f);
 
724
                        return filetypes_detect_from_file_internal(utf8_filename, line);
 
725
                }
 
726
                fclose(f);
 
727
        }
 
728
        return filetypes_detect_from_extension(utf8_filename);
 
729
}
 
730
 
 
731
 
738
732
void filetypes_select_radio_item(const filetype *ft)
739
733
{
740
 
        // app->ignore_callback has to be set by the caller
 
734
        /* app->ignore_callback has to be set by the caller */
741
735
        if (ft == NULL)
742
736
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
743
737
                        radio_items[filetypes[GEANY_FILETYPES_ALL]->id]), TRUE);
746
740
}
747
741
 
748
742
 
749
 
static void filetypes_create_menu_item(GtkWidget *menu, gchar *label, filetype *ftype)
 
743
static void
 
744
on_filetype_change                     (GtkMenuItem     *menuitem,
 
745
                                        gpointer         user_data)
 
746
{
 
747
        gint idx = document_get_cur_idx();
 
748
        if (app->ignore_callback || idx < 0 || ! doc_list[idx].is_valid) return;
 
749
 
 
750
        document_set_filetype(idx, (filetype*)user_data);
 
751
}
 
752
 
 
753
 
 
754
static void filetypes_create_menu_item(GtkWidget *menu, const gchar *label, filetype *ftype)
750
755
{
751
756
        static GSList *group = NULL;
752
757
        GtkWidget *tmp;
 
758
 
753
759
        tmp = gtk_radio_menu_item_new_with_label(group, label);
754
760
        group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(tmp));
755
761
        radio_items[ftype->id] = tmp;
759
765
}
760
766
 
761
767
 
762
 
static void filetypes_create_newmenu_item(GtkWidget *menu, gchar *label, filetype *ftype)
763
 
{
764
 
        GtkWidget *tmp_menu = gtk_menu_item_new_with_label(label);
765
 
        GtkWidget *tmp_button = gtk_menu_item_new_with_label(label);
766
 
        gtk_widget_show(tmp_menu);
767
 
        gtk_widget_show(tmp_button);
768
 
        gtk_container_add(GTK_CONTAINER(menu), tmp_menu);
769
 
        gtk_container_add(GTK_CONTAINER(app->new_file_menu), tmp_button);
770
 
        g_signal_connect((gpointer) tmp_menu, "activate", G_CALLBACK(on_new_with_template), (gpointer) ftype);
771
 
        g_signal_connect((gpointer) tmp_button, "activate", G_CALLBACK(on_new_with_template), (gpointer) ftype);
772
 
}
773
 
 
774
 
 
775
768
/* frees the array and all related pointers */
776
 
void filetypes_free_types(void)
 
769
void filetypes_free_types()
777
770
{
778
771
        gint i;
779
772
 
786
779
                        g_free(filetypes[i]->extension);
787
780
                        g_free(filetypes[i]->comment_open);
788
781
                        g_free(filetypes[i]->comment_close);
 
782
                        g_free(filetypes[i]->context_action_cmd);
789
783
                        g_free(filetypes[i]->programs->compiler);
790
784
                        g_free(filetypes[i]->programs->linker);
791
785
                        g_free(filetypes[i]->programs->run_cmd);
792
786
                        g_free(filetypes[i]->programs->run_cmd2);
793
787
                        g_free(filetypes[i]->programs);
794
 
                        if (filetypes[i]->menu_items->menu != NULL &&
795
 
                                GTK_IS_WIDGET(filetypes[i]->menu_items->menu))
796
 
                                gtk_widget_destroy(filetypes[i]->menu_items->menu);
797
 
                        /// TODO not necessary because they got freed with the menu?
798
 
/*                      if (filetypes[i]->menu_items->item_compile != NULL &&
799
 
                                GTK_IS_WIDGET(filetypes[i]->menu_items->item_compile))
800
 
                                gtk_widget_destroy(filetypes[i]->menu_items->item_compile);
801
 
                        if (filetypes[i]->menu_items->item_link != NULL &&
802
 
                                GTK_IS_WIDGET(filetypes[i]->menu_items->item_link))
803
 
                                gtk_widget_destroy(filetypes[i]->menu_items->item_link);
804
 
                        if (filetypes[i]->menu_items->item_exec != NULL &&
805
 
                                GTK_IS_WIDGET(filetypes[i]->menu_items->item_exec))
806
 
                                gtk_widget_destroy(filetypes[i]->menu_items->item_exec);
807
 
*/                      g_free(filetypes[i]->menu_items);
 
788
                        g_free(filetypes[i]->actions);
808
789
 
809
790
                        g_strfreev(filetypes[i]->pattern);
810
791
                        g_free(filetypes[i]);
813
794
}
814
795
 
815
796
 
816
 
gchar *filetypes_get_template(filetype *ft)
817
 
{
818
 
        if (ft == NULL) return NULL;
819
 
 
820
 
        switch (ft->id)
821
 
        {
822
 
                case GEANY_FILETYPES_C:
823
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_C); break;
824
 
                case GEANY_FILETYPES_CPP:
825
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_CPP); break;
826
 
                case GEANY_FILETYPES_PHP:
827
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PHP); break;
828
 
                case GEANY_FILETYPES_JAVA:
829
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_JAVA); break;
830
 
                case GEANY_FILETYPES_PASCAL:
831
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_PASCAL); break;
832
 
                case GEANY_FILETYPES_RUBY:
833
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_RUBY); break;
834
 
                case GEANY_FILETYPES_D:
835
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_D); break;
836
 
                case GEANY_FILETYPES_HTML:
837
 
                        return templates_get_template_generic(GEANY_TEMPLATE_FILETYPE_HTML); break;
838
 
                default: return NULL;
839
 
        }
840
 
}
841
 
 
842
 
 
843
 
void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
 
797
static void load_settings(gint ft, GKeyFile *config, GKeyFile *configh)
844
798
{
845
799
        gchar *result;
846
800
        GError *error = NULL;
847
801
        gboolean tmp;
848
802
 
849
 
        if (config == NULL || configh == NULL || ft < 0 || ft >= GEANY_MAX_FILE_TYPES) return;
 
803
        /* default extension */
 
804
        result = g_key_file_get_string(configh, "settings", "extension", NULL);
 
805
        if (result == NULL) result = g_key_file_get_string(config, "settings", "extension", NULL);
 
806
        if (result != NULL)
 
807
        {
 
808
                setptr(filetypes[ft]->extension, result);
 
809
        }
850
810
 
851
 
        // read comment notes
 
811
        /* read comment notes */
852
812
        result = g_key_file_get_string(configh, "settings", "comment_open", NULL);
853
813
        if (result == NULL) result = g_key_file_get_string(config, "settings", "comment_open", NULL);
854
814
        if (result != NULL)
876
836
        }
877
837
        else filetypes[ft]->comment_use_indent = tmp;
878
838
 
879
 
        // read build settings
 
839
        /* read context action */
 
840
        result = g_key_file_get_string(configh, "settings", "context_action_cmd", NULL);
 
841
        if (result == NULL) result = g_key_file_get_string(config, "settings", "context_action_cmd", NULL);
 
842
        if (result != NULL)
 
843
        {
 
844
                filetypes[ft]->context_action_cmd = result;
 
845
        }
 
846
 
 
847
        /* read build settings */
880
848
        result = g_key_file_get_string(configh, "build_settings", "compiler", NULL);
881
849
        if (result == NULL) result = g_key_file_get_string(config, "build_settings", "compiler", NULL);
882
850
        if (result != NULL)
883
851
        {
884
852
                filetypes[ft]->programs->compiler = result;
885
 
                filetypes[ft]->menu_items->can_compile = TRUE;
 
853
                filetypes[ft]->actions->can_compile = TRUE;
886
854
        }
887
855
 
888
856
        result = g_key_file_get_string(configh, "build_settings", "linker", NULL);
890
858
        if (result != NULL)
891
859
        {
892
860
                filetypes[ft]->programs->linker = result;
893
 
                filetypes[ft]->menu_items->can_link = TRUE;
 
861
                filetypes[ft]->actions->can_link = TRUE;
894
862
        }
895
863
 
896
864
        result = g_key_file_get_string(configh, "build_settings", "run_cmd", NULL);
898
866
        if (result != NULL)
899
867
        {
900
868
                filetypes[ft]->programs->run_cmd = result;
901
 
                filetypes[ft]->menu_items->can_exec = TRUE;
 
869
                filetypes[ft]->actions->can_exec = TRUE;
902
870
        }
903
871
 
904
872
        result = g_key_file_get_string(configh, "build_settings", "run_cmd2", NULL);
906
874
        if (result != NULL)
907
875
        {
908
876
                filetypes[ft]->programs->run_cmd2 = result;
909
 
                filetypes[ft]->menu_items->can_exec = TRUE;
910
 
        }
 
877
                filetypes[ft]->actions->can_exec = TRUE;
 
878
        }
 
879
}
 
880
 
 
881
 
 
882
/* simple wrapper function to print file errors in DEBUG mode */
 
883
static void load_system_keyfile(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags,
 
884
                                                                G_GNUC_UNUSED GError **just_for_compatibility)
 
885
{
 
886
        GError *error = NULL;
 
887
        gboolean done = g_key_file_load_from_file(key_file, file, flags, &error);
 
888
        if (! done && error != NULL)
 
889
        {
 
890
                geany_debug("Failed to open %s (%s)", file, error->message);
 
891
                g_error_free(error);
 
892
                error = NULL;
 
893
        }
 
894
}
 
895
 
 
896
 
 
897
/* Load the configuration file for the associated filetype id.
 
898
 * This should only be called when the filetype is needed, to save loading
 
899
 * 20+ configuration files all at once. */
 
900
void filetypes_load_config(gint ft_id)
 
901
{
 
902
        GKeyFile *config, *config_home;
 
903
        static gboolean loaded[GEANY_MAX_FILE_TYPES] = {FALSE};
 
904
 
 
905
        g_return_if_fail(ft_id >= 0 && ft_id < GEANY_MAX_FILE_TYPES);
 
906
 
 
907
        if (loaded[ft_id])
 
908
                return;
 
909
        loaded[ft_id] = TRUE;
 
910
 
 
911
        config = g_key_file_new();
 
912
        config_home = g_key_file_new();
 
913
        {
 
914
                /* highlighting uses GEANY_FILETYPES_ALL for common settings */
 
915
                gchar *ext = (ft_id != GEANY_FILETYPES_ALL) ?
 
916
                        filetypes_get_conf_extension(ft_id) : g_strdup("common");
 
917
                gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.", ext, NULL);
 
918
                gchar *f = g_strconcat(app->configdir,
 
919
                        G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", ext, NULL);
 
920
 
 
921
                load_system_keyfile(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
 
922
                g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
 
923
 
 
924
                g_free(ext);
 
925
                g_free(f);
 
926
                g_free(f0);
 
927
        }
 
928
 
 
929
        load_settings(ft_id, config, config_home);
 
930
        highlighting_init_styles(ft_id, config, config_home);
 
931
 
 
932
        g_key_file_free(config);
 
933
        g_key_file_free(config_home);
 
934
}
 
935
 
 
936
 
 
937
gchar *filetypes_get_conf_extension(gint filetype_idx)
 
938
{
 
939
        gchar *result;
 
940
 
 
941
        /* Handle any special extensions different from lowercase filetype->name */
 
942
        switch (filetype_idx)
 
943
        {
 
944
                case GEANY_FILETYPES_CPP: result = g_strdup("cpp"); break;
 
945
                case GEANY_FILETYPES_CS: result = g_strdup("cs"); break;
 
946
                case GEANY_FILETYPES_MAKE: result = g_strdup("makefile"); break;
 
947
                case GEANY_FILETYPES_OMS: result = g_strdup("oms"); break;
 
948
                default: result = g_ascii_strdown(filetypes[filetype_idx]->name, -1); break;
 
949
        }
 
950
        return result;
 
951
}
 
952
 
 
953
 
 
954
void filetypes_save_commands()
 
955
{
 
956
        gchar *conf_prefix = g_strconcat(app->configdir,
 
957
                G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", NULL);
 
958
        gint i;
 
959
 
 
960
        for (i = 0; i < GEANY_FILETYPES_ALL; i++)
 
961
        {
 
962
                struct build_programs *bp = filetypes[i]->programs;
 
963
                GKeyFile *config_home;
 
964
                gchar *fname, *ext, *data;
 
965
 
 
966
                if (! bp->modified) continue;
 
967
 
 
968
                ext = filetypes_get_conf_extension(i);
 
969
                fname = g_strconcat(conf_prefix, ext, NULL);
 
970
                g_free(ext);
 
971
 
 
972
                config_home = g_key_file_new();
 
973
                g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
 
974
 
 
975
                if (bp->compiler && *bp->compiler)
 
976
                        g_key_file_set_string(config_home, "build_settings", "compiler", bp->compiler);
 
977
                if (bp->linker && *bp->linker)
 
978
                        g_key_file_set_string(config_home, "build_settings", "linker", bp->linker);
 
979
                if (bp->run_cmd && *bp->run_cmd)
 
980
                        g_key_file_set_string(config_home, "build_settings", "run_cmd", bp->run_cmd);
 
981
                if (bp->run_cmd2 && *bp->run_cmd2)
 
982
                        g_key_file_set_string(config_home, "build_settings", "run_cmd2", bp->run_cmd2);
 
983
 
 
984
                data = g_key_file_to_data(config_home, NULL, NULL);
 
985
                utils_write_file(fname, data);
 
986
                g_free(data);
 
987
                g_key_file_free(config_home);
 
988
                g_free(fname);
 
989
        }
 
990
        g_free(conf_prefix);
 
991
}
 
992
 
 
993
 
 
994
/* create one file filter which has each file pattern of each filetype */
 
995
GtkFileFilter *filetypes_create_file_filter_all_source()
 
996
{
 
997
        GtkFileFilter *new_filter;
 
998
        gint i, j;
 
999
 
 
1000
        new_filter = gtk_file_filter_new();
 
1001
        gtk_file_filter_set_name(new_filter, _("All Source"));
 
1002
 
 
1003
        for (i = 0; i < GEANY_FILETYPES_ALL; i++)
 
1004
        {
 
1005
                for (j = 0; filetypes[i]->pattern[j]; j++)
 
1006
                {
 
1007
                        gtk_file_filter_add_pattern(new_filter, filetypes[i]->pattern[j]);
 
1008
                }
 
1009
        }
 
1010
 
 
1011
        return new_filter;
911
1012
}
912
1013
 
913
1014
 
916
1017
        GtkFileFilter *new_filter;
917
1018
        gint i;
918
1019
 
 
1020
        g_return_val_if_fail(ft != NULL, NULL);
 
1021
 
919
1022
        new_filter = gtk_file_filter_new();
920
1023
        gtk_file_filter_set_name(new_filter, ft->title);
921
1024
 
922
 
        // (GEANY_FILETYPES_MAX_PATTERNS - 1) because the last field in pattern is NULL
923
 
        //for (i = 0; i < (GEANY_MAX_PATTERNS - 1) && ft->pattern[i]; i++)
924
1025
        for (i = 0; ft->pattern[i]; i++)
925
1026
        {
926
1027
                gtk_file_filter_add_pattern(new_filter, ft->pattern[i]);
930
1031
}
931
1032
 
932
1033
 
 
1034
/* Indicates whether there is a tag parser for the filetype or not. */
 
1035
gboolean filetype_has_tags(filetype *ft)
 
1036
{
 
1037
        g_return_val_if_fail(ft != NULL, FALSE);
 
1038
 
 
1039
        return ft->lang >= 0;
 
1040
}
 
1041
 
 
1042