From eeb7ac9294dae69f6110c8b5f1c136be118a6110 Mon Sep 17 00:00:00 2001
From: kk2000 <kk2000@cea.fr>
Date: Wed, 31 Jul 2019 18:38:41 +0200
Subject: [PATCH] Adding native support for the Gibiane language
 (http://www-cast3m.cea.fr)

---
 ctags/Makefile.am                 |   3 +-
 ctags/main/parsers.h              |   3 +-
 ctags/parsers/GIBIANE.c           | 353 +++++++++++++++++++++++++++++++++++
 data/Makefile.am                  |   6 +-
 data/filedefs/filetypes.gibiane   |  65 +++++++
 data/filetype_extensions.conf     |   1 +
 data/tags/std.dgibi.tags          | 312 +++++++++++++++++++++++++++++++
 scintilla/Makefile.am             |   3 +-
 scintilla/include/SciLexer.h      |  14 ++
 scintilla/include/Scintilla.iface |  18 +-
 scintilla/lexers/LexGIBIANE.cxx   | 376 ++++++++++++++++++++++++++++++++++++++
 scintilla/src/Catalogue.cxx       |   1 +
 scripts/create_dgibi_tags.sh      |  32 ++++
 src/editor.c                      |  24 +++
 src/filetypes.c                   |   1 +
 src/filetypes.h                   |   1 +
 src/highlighting.c                |   6 +
 src/highlightingmappings.h        |  32 ++++
 src/symbols.c                     |   2 +-
 src/tagmanager/tm_parser.c        |   5 +
 src/tagmanager/tm_parser.h        |   1 +
 src/tagmanager/tm_workspace.c     |   7 +-
 src/tagmanager/tm_workspace.h     |   2 +-
 23 files changed, 1258 insertions(+), 10 deletions(-)
 create mode 100644 ctags/parsers/GIBIANE.c
 create mode 100644 data/filedefs/filetypes.gibiane
 create mode 100644 data/tags/std.dgibi.tags
 create mode 100644 scintilla/lexers/LexGIBIANE.cxx
 create mode 100755 scripts/create_dgibi_tags.sh

diff --git a/ctags/Makefile.am b/ctags/Makefile.am
index 3b4e191b..b8ac7d6e 100644
--- a/ctags/Makefile.am
+++ b/ctags/Makefile.am
@@ -50,7 +50,8 @@ parsers = \
 	parsers/tex.c \
 	parsers/txt2tags.c \
 	parsers/verilog.c \
-	parsers/vhdl.c
+	parsers/vhdl.c \
+	parsers/GIBIANE.c
 
 libctags_la_SOURCES = \
 	main/args.c \
diff --git a/ctags/main/parsers.h b/ctags/main/parsers.h
index b261f80e..25b9e7bb 100644
--- a/ctags/main/parsers.h
+++ b/ctags/main/parsers.h
@@ -65,6 +65,7 @@
 	GoParser, \
 	JsonParser, \
 	ZephirParser, \
-	PowerShellParser
+	PowerShellParser, \
+	GIBIANEParser
 
 #endif  /* CTAGS_MAIN_PARSERS_H */
diff --git a/ctags/parsers/GIBIANE.c b/ctags/parsers/GIBIANE.c
new file mode 100644
index 00000000..7683a754
--- /dev/null
+++ b/ctags/parsers/GIBIANE.c
@@ -0,0 +1,353 @@
+/*
+*   This source code is released for free distribution under the terms of the
+*   GNU General Public License.
+*
+*   This module contains code for generating tags for GIBIANE scripts.
+*   Copyright 2019 Thibault Lindecker (Communication & Systemes) - thibault.lindecker@c-s.fr
+*/
+
+/*
+*   INCLUDE FILES
+*/
+#include "general.h"  /* must always come first */
+#include "debug.h"
+#include "main.h"
+#include "parse.h"
+#include "read.h"
+#include "vstring.h"
+#include "keyword.h"
+#include "entry.h"
+#include "routines.h"
+#include <string.h>
+
+typedef enum {
+  K_PROCEDURE,
+  K_VARIABLE,
+  COUNT_KIND
+} GIBIANEKind;
+
+static kindDefinition GIBIANEKinds[COUNT_KIND] = {
+    { true, 'p', "procedure",  "procedures" },
+    { true, 'v', "variable" ,  "variables"  }
+};
+
+typedef enum eGIBIANELineType {
+  LTYPE_UNDETERMINED,
+  LTYPE_COMMENT
+} lineType;
+
+
+typedef enum eTokenType {
+    TOKEN_UNDEFINED,
+    TOKEN_IDENTIFIER,
+    TOKEN_EOF,
+    TOKEN_SEMICOLON,
+    TOKEN_PROCEDURE,
+    TOKEN_PROCEDURE_FIN,
+    TOKEN_VARIABLE,
+    TOKEN_INSTRUCTION
+} tokenType;
+
+typedef struct {
+  tokenType       type;
+  vString *       string;
+  unsigned long   lineNumber;
+  MIOPos          filePosition;
+} tokenInfo;
+
+static void initGIBIANEEntry (tagEntryInfo *const e, const tokenInfo *const token,
+                 const GIBIANEKind kind)
+{
+  initTagEntry (e, vStringValue (token->string), kind);
+  e->lineNumber = token->lineNumber;
+  e->filePosition = token->filePosition;
+}
+
+static void makeTag (const tokenInfo *const token, const vString *const arglist, const vString *const returnlist,
+                  const GIBIANEKind kind)
+{
+
+  if (GIBIANEKinds[kind].enabled)
+  {
+    tagEntryInfo e;
+
+    initGIBIANEEntry (&e, token, kind);
+
+    if (arglist)
+      e.extensionFields.signature = vStringValue (arglist);  //Ce que mange la procedure
+    if (returnlist)
+      e.extensionFields.varType   = vStringValue (returnlist);
+
+    makeTagEntry (&e);
+  }
+
+}
+
+static tokenInfo *newToken (void)
+{
+  tokenInfo *const token = xMalloc (1, tokenInfo);
+  token->type            = TOKEN_UNDEFINED;
+  token->string          = vStringNew ();
+  token->lineNumber      = getInputLineNumber ();
+  token->filePosition    = getInputFilePosition ();
+  return token;
+}
+
+static void deleteToken (tokenInfo *const token)
+{
+  vStringDelete (token->string);
+  eFree (token);
+}
+
+static void copyToken (tokenInfo *const dest, const tokenInfo *const src)
+{
+  dest->lineNumber   = src->lineNumber;
+  dest->filePosition = src->filePosition;
+  dest->type         = src->type;
+  vStringCopy (dest->string, src->string);
+}
+
+static bool isIdentChar (const int c)
+{
+  return (isalnum (c) || c == ':' || c == '_' || c == '-' ||
+                         c >= 0x80 || c == '.' || c == ' ');
+}
+
+static bool isSpace (int c)
+{
+  return (c == '\t' || c == ' ' || c == '\v' ||
+                       c == '\r' || c == '\f');
+}
+
+static bool isQuote (int c)
+{
+  return (c == '\'');
+}
+
+static void parseIdentifier (vString *const string, const int firstChar)
+{
+  if(firstChar == '='){ //parse variable
+    vStringPut (string, (char) firstChar); return;
+  }
+
+  int c = firstChar;
+  do
+  {
+    vStringPut (string, (char) c);
+    c = getcFromInputFile ();
+  } while (isIdentChar(c) && c != ';' && c != '=' && !isQuote(c) && c != EOF);
+
+  ungetcToInputFile (c);
+}
+
+static int skipSpaceQuote (int c)
+{
+  while(isSpace(c) || isQuote(c))
+    c = getcFromInputFile ();
+  return c;
+}
+
+static void readToken (tokenInfo *const token)
+{
+  int c;
+  static bool newline = false;
+  static bool comment_line = false;
+  static bool debut_proc = false;
+
+  token->type   = TOKEN_UNDEFINED;
+  vStringClear (token->string);
+
+  c = getcFromInputFile ();
+  c = skipSpaceQuote (c);
+
+  /* we ignore comments line (start with '*') */
+  if(newline && c != '*'){
+    newline = false;
+  }
+
+  if(c == '\n'){
+    newline = true;
+  }
+  else if(c == '*' && newline){
+    comment_line = true;
+    while(comment_line){
+      comment_line = false;
+      do
+      {
+        c = getcFromInputFile ();
+      } while (c != '\n' && c != EOF);
+      if(c == '*'){
+        comment_line = true;
+      }
+    }
+  }
+  else if(c == ';'){
+    vStringPut (token->string, (char) c);
+    token->type = TOKEN_SEMICOLON;
+    debut_proc = false;
+  }
+  else if(c == EOF){
+    token->type = TOKEN_EOF; /*End of file */
+  }
+  else{
+    vString *find_variable = vStringNew ();
+    vString *find_procedure = vStringNew ();
+    vString *find_instruction = vStringNew ();
+    while(1)
+    {
+      vStringPut (find_variable, (char) c);
+      vStringPut (find_procedure, (char) c);
+      vStringPut (find_instruction, (char) c);
+
+      c = getcFromInputFile ();
+      if(c == '='){
+        vStringCat(token->string, find_variable);
+        token->type = TOKEN_VARIABLE;
+        break;
+      }
+
+      /* In GIBIANE, the first 4 letters are enough to call an operator, but user can specify more than 4 letters.
+       * Exemple : for calling 'DEBPROC' operator, user can use : DEBP, DEBPR, DEBPRO and DEBPROC. */
+      int keyword_min_size = ((int)find_procedure->length < 4) ? 4 : (int)find_procedure->length;
+
+      if(strncasecmp (vStringValue (find_procedure), "DEBPROC", keyword_min_size) == 0){
+        if(isQuote(c) || c == ' '){
+          vStringCat(token->string, find_procedure);
+          token->type = TOKEN_PROCEDURE;
+          debut_proc = true;
+          break;
+        }
+      }else if(strncasecmp (vStringValue (find_procedure), "FINPROC", keyword_min_size) == 0){
+        if(isQuote(c) || c == ' ' || c == ';'){
+          vStringCat(token->string, find_procedure);
+          token->type = TOKEN_PROCEDURE_FIN;
+          break;
+        }
+      }
+
+      if(isQuote(c) || c == ' '){
+        vStringClear (find_procedure);
+      }
+
+      if((!isIdentChar(c) || c == ';' || c == EOF || c == '\n' || (debut_proc && c == ' ')) && !isQuote(c)){
+        vStringCat(token->string, find_instruction);
+        token->type = TOKEN_INSTRUCTION;
+        break;
+      }
+    }
+    ungetcToInputFile (c);
+    token->lineNumber   = getInputLineNumber ();
+    token->filePosition = getInputFilePosition ();
+
+  }
+
+}
+
+/* We enter here because we have detected 'DEBPROC' operator in readToken().
+ * We will read the name of the procedur, its arguments and its return values :
+ * Exemple :
+ *    DEBPROC myprocedure toto*'TABL';
+ *      do something
+ *    FINPROC titi*'MOTS' tata*'ENTIER'
+ * For this example, we would have :
+ *  name : myprocedure
+ *  arguments : toto*'TABL'
+ *  return values : titi*'MOTS' tata*'ENTIER' */
+static void parseProcedure (tokenInfo *const token)
+{
+  tokenInfo *nameFree = NULL;
+  bool nextline = false;
+  bool finproc  = false;
+  vString *returnlist = vStringNew ();
+  vString *procedur_name = vStringNew ();
+  vString *arglist = vStringNew ();
+  vString *espace = vStringNewInit (" ");
+  vString *egal = vStringNewInit ("=");
+
+  /* We read the name of the procedur */
+  readToken (token);
+  nameFree = newToken ();
+  copyToken (nameFree, token);
+
+  do
+  {
+    readToken (token);
+
+    if(token->type == TOKEN_SEMICOLON){
+      nextline = true;
+      if(finproc == true)
+        break;
+    }
+    /* arguments of the procedur */
+    if(nextline == false){
+      vStringCat (arglist, token->string);
+      vStringCat (arglist, espace);
+    }
+    /* return values of the procedur */
+    if(finproc == true){
+      vStringCat (returnlist, token->string);
+      vStringCat (returnlist, espace);
+    }
+    if(token->type == TOKEN_PROCEDURE_FIN)
+      finproc = true;
+
+  }
+  while (token->type != TOKEN_EOF);
+
+  if(returnlist->length > 0){
+    vStringCat (returnlist, egal);
+  }
+
+  /* We make tag */
+  makeTag(nameFree, arglist, returnlist, K_PROCEDURE);
+}
+
+/* We enter here because we have detected '=' char in readToken().
+ * Because we are just after the '=' char, we have already read the variable name. */
+static void parseVariable (tokenInfo *const token)
+{
+  /* Make a copy of the token */
+  tokenInfo *nameFree = NULL;
+  nameFree = newToken ();
+  copyToken (nameFree, token);
+
+  /* We make tag */
+  makeTag(nameFree, NULL, NULL, K_VARIABLE);
+
+  deleteToken (nameFree);
+}
+
+/* main loop on the GIBIANE language file */
+static void findGIBIANETags (void)
+{
+  tokenInfo *const token = newToken ();
+  readToken (token);
+  while (token->type != TOKEN_EOF)
+  {
+    switch (token->type)
+    {
+      case TOKEN_PROCEDURE:
+        parseProcedure (token);
+        break;
+
+      case TOKEN_VARIABLE:
+        parseVariable (token);
+        break;
+
+      default: break;
+    }
+    readToken (token);
+  }
+  deleteToken (token);
+}
+
+extern parserDefinition* GIBIANEParser (void)
+{
+  static const char *const extensions [] = { "dgibi", "procedur", NULL };
+  parserDefinition* def                  = parserNew ("GIBIANE");
+  def->kindTable                         = GIBIANEKinds;
+  def->kindCount                         = ARRAY_SIZE (GIBIANEKinds);
+  def->extensions                        = extensions;
+  def->parser                            = findGIBIANETags;
+  return def;
+}
diff --git a/data/Makefile.am b/data/Makefile.am
index 04dead33..8faa6995 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -74,14 +74,16 @@ filetypes = \
 	filedefs/filetypes.vhdl \
 	filedefs/filetypes.xml \
 	filedefs/filetypes.yaml \
-	filedefs/filetypes.zephir
+	filedefs/filetypes.zephir \
+	filedefs/filetypes.gibiane
 
 tagfiles = \
 	tags/std99.c.tags \
 	tags/std.php.tags \
 	tags/std.py.tags \
 	tags/std.pas.tags \
-	tags/entities.html.tags
+	tags/entities.html.tags \
+	tags/std.dgibi.tags
 
 template_files = \
 	templates/files/file.html \
diff --git a/data/filedefs/filetypes.gibiane b/data/filedefs/filetypes.gibiane
new file mode 100644
index 00000000..136d8348
--- /dev/null
+++ b/data/filedefs/filetypes.gibiane
@@ -0,0 +1,65 @@
+# For complete documentation of this file, please see Geany's main documentation
+[styling]
+# Edit these in the colorscheme .conf file instead
+default=default
+comment=comment
+string=string
+number=number_1
+table=class
+
+# README :
+
+#1) Ce qui suit (keyword_1, function, operator, etc.) est definit dans "data/filedefs/filetypes.common"
+#       ou dans les fichiers de colorations speciaux (data/colorshemes/*.conf)
+
+#2) La meme syntaxe doit etre reprise dans "scintilla/include/SciLexer.h" et dans "src/highlightingmappings.h"
+
+#3) C'est dans "scintilla/lexers/LexGIBIANE.cxx", que l'on dit que :
+#       keywords1 <=> word => coloration keyword_1 definit dans filetypes.common ou .conf
+#       keywords2 <=> word2 => coloration keyword_2 definit dans filetypes.common ou .conf
+#       keywords3 <=> word3 => coloration backticks definit dans filetypes.common ou .conf
+#       keywords4 <=> word4 => coloration function definit dans filetypes.common ou .conf
+#       ...
+
+word=keyword_1
+word2=keyword_2
+word3=keyword_1
+word4=function
+word5=keyword_3
+word6=function
+word7=function
+word8=operator
+
+
+[keywords]
+# all items must be in one line and in lowercase
+conditional=si sinon sino finsi fins
+test1=cos cosh acos acoh sin sinh asin asih tan tanh atg atah erf exp factorie fonc log mini maxi enti entier flot flottant sign signe alea abs
+loop=repe repet repete repeter quit iter itere iterer fin
+task=debp debpr debpro debproc finp finpr finpro finproc debm debme debmet debmeth finm finme finmet finmeth
+element=poi1 seg2 seg3 tri3 tri4 tri6 tri7 qua4 qua5 qua8 qua9 rac2 rac3 cub8 cu20 pri6 pr15 lia3 lia4 lia6 lia8 mult tet4 te10 pyr5 py13 atta supe rap3 lip6 lip8 poly cu27 pr21 te15 py19 seg4 qu16 tr12 pr18 seg6 tr21 qu36 c216 p126 te56 py91 sure
+function1=@A1DDL accdchi1 accdchi2 accevite acier acti3 @afevozt affiche aft1 aft2 aft ajuste @algsta @ana_lim analyser anime animgks anlimtre annoimp arcgau @arr asparam autopilo balourd bif bili_efz bili_moy biovol boa boite broche bruche @b_tpo2d calactiv calcdisp calcp calctrac calculer callm calmu campbell @carene @cartoon ccdonchi @cdg @CFD10 @CFS10 ch2clim chamint chanolii chanuobj chanvcom chanvesp chanvsos charther @CHCOTAE chdclim @chflec chitrnsp @CHREP chtgau ch_theta ch_thetx chtitr cinema cinemb cinimod @circons @clch @cldhc @cldh @clim clinc @clmi1c @clmi2c @clpc @clpd codenorm coller1 coller2 coller con_calc condens continu contseg3 convt coq2mas @corigi corman cormasse @couplan @couple coupler cour3d courspec @coutor1 @coutor2 creer_3d @cripl critloc ctod darcysat darcytra ddfour deadfonc deadjaco deadktan deadresi deadutil deconv3D deconv dedans deduadap @deduire @defa2dl @defa2dp @defpl depou descour @deslis destra diffanis donchi1 donchi2 drexus dupont2 dynamic dynamod2 dynamod3 dynamode ec8acsis effmarti elecneut @enca enceinte enermode enrichis epaifut @EVN_IDT @EVN_MNG exac @excel1 exec execrxt exic explorer factorie fcourant fdens fiabili filc filtreke finvrepa @FIS_1 @FIS_2 @FIS_3DS @FIS_3 fixhc @fix flambage floquet forbloc for_cont fornod four2tri fpal frctrace @frenet frepart freqperi fronabs f_s2pi ftran gam1 @gattpar g_calcul gdflim1 @global gresp g_theta1 g_theta g_ulti2D g_ultifr hasofer hauban hbm_post hbm h_b @helice @HISTOGR hrayo hrcav htc_chbw htc_per htctran htc_wtr htc_www ht_pro idbht identi images impchi1 impchi2 @inclusi indibeta indiobje inductio inichi1 inichi2 inichimi inimur ininlin initEFMH @initia initou
+function2=initVF in_mini int_comp @INTLIN @isosurf issleq jeu @keff kepsilon kresp kr_pro kuet kweib1 @lacalc @lacrit @lafail @lagraph @lakappa @lalist @lamass @lamat @laread @larig @lasiep @laverg @lavis lch2clim lch2delp lch2eps lch2fion lch2iaff lch2impr lch2itma lch2itso lch2logc lch2mdel lch2nfi lch2nite lch2nty4 lch2prep lch2sort lch2temp lch2tot lespcomp lespityp lesplogk lespstoe libdd lichxmx licochar licomnom liespece liliden liliech limemeca linbiden linvcomp @lireent lireflot @lireris lirsoso @LISPA16 @lisse litemper lsosfrac lsossoli mag_nlin mailstru mailvoro @MATETHM mayoto m_dampin m_damp_K mdnris mdrecomb @mesu @mistpar @mod @MODTRI montagne moyespec mrcfram1 mrcfram2 mrcfram3 mrcfram4 mrcframe mrcshell mrctrace mulc multidec multirec @m_voro nataf newmark nocomchi noespchi normalim norv1 nsclim orbite @ortho @otcoque @otpout ouvfiss parastat parmchi2 pasapas pas_defa pas_epth pas_etat pas_helm @pashist pas_init pas_mate pas_rayo pas_repr pas_resu pas_verm @p_boit2 @PCPT peche pencechi pfluage phasage @plotpri pmpb pointcyl @pointir pointsph @polo polyno @pomi postddi1 postddi postou postvibr pot_scal pot_vect pout2mas ppre @PRCA1 @PRCA2 @PRCA3 @PRCA4 @PRCA5 prepaenc probabrs probdens prochext prodt projgril propag psatt @p_voro quadratu ramberg @rayo ray @rccmco2 @rccm @rccmtrv rdiv recentre recompom recompos @relief @rempcou @rempfat @rempgro repart @repere repix reseau reso_asy respowns respowsp retrait retsat rosent rota_imp rvsat rvst2 @SATURAT satutils sge shfdt sif signcorr signderi signenve signsynt @sigref silam sissib solvEFMH solvVF SPAL spplanc @statio @stat @stbl @syslin TABLO2D TABLO3D takm_efz takm_moy tension @test thermic t_ipol @tole2 @tole3 topochan topocrit topofilt topomate topoptim toporstr toposauv toposurf @toro @total t_piteta trac3d_2 trac3d trachis trachit tracmeca tracpart tractufi traduire trangeol transfer transgen transit0 transit1 transit2 transit3 translin transnon trc trtrajec unilater unpas updaEFMH updaVF valnom valspe vapdif varihc varihcsu @vecoul vertytab @vis3d @visor vitetfor viteunil vnimp vtimp weibull xbif @zacplus @zacpro1 @zacpro2 @zacpro3 @zacpro4 @zacpro5 @zacpro6 @zacpro7 @zacpro8 zigzag zonfis
+operator=opti fin born dens droi lapl cerc mota quel inte para souc et poin plus moin tran rota trac inve cote elem cont diff chan list surf conf info tour homo affi syme incl elim titr racc tass sort lire bary dall orie manu oubl comp cout pave comm noeu mot nbel nbno noti face coor norm temp volu lect sauf prog + - * / ** flot enti log exp depl psca pvec pmix liai regl hook sols reso date rigi bloq depi hota stru text proj venv elst jonc reco mass clst sigm rela forc mome vloc base dime extr vers vibr maxi xtmx ytmx < eg <eg ou ega non neg mult pjba crit diag xtx uniq bsig deda max1 mots repe quit si sino fins ipol abs sin cos atg enve isov detr enle remp inse coli tria tabl redu symt anti resu pres exco nomc saut defo appu inva prin vmis ksig sign suit valp ordo tire rege dess amor char coul chpo afco evol orth thet comb deve vect pica capi/ data mdir2/copi dimn sauv rest cara mate gene capa elfe jaco plas gree mode finp xty debp ktan form mess nnor cubp cubt cer3 fdt seis ener epsi intg cour reac supe zero depb exci kp acti elas erre cong lump obte vari modi masq exis mini grad ense ifre dfou sigs mapp somm brui rten dspr tfr tote graf tres type osci spo inde chsp tagr perm cabl fofi work qulx debi cmoy comt cond flux rimp filt tfri conc iter acqu sour conv acoh psmo asih ecou mena synt argu atah dyne fonc resp plac vale proi exce aret calp indi act3 biot dedu conn nloc chai cosi cvol diad hann insi lsqf ltl pert prns psrs siar spon visa cneq ccon mesu pile simp util menu cosh sinh tanh deg3 aide racp refe ksof veri nske kmab noel doma fpu gmv eqpr eqex vibc avct kdia kmtp kmf mdia dfdt tcrr tcnm sqtp somt nlin cmct kcht lapn raft klop kres cson fimp/ data mdir3/nuag weip khis kops fsur flam elno dbit ns toim fimp kmbt kbbt dudw frot tsca konv kcha mhyb matp hdeb hvit hybp smtp divu mocu chau tail erf sens impo dans impf ntab fron fuit epth fpt kfpt fpa kfpa echi qond kpro ffor raye rayn vsur traj aju1 aju2 frig excf nomm prec erfc onde cfl dedo dcov parc pola chi1 chi2 pent pret meth xxt cblo genj zleg mesm fion neut logk coac resi mutu sore diri lign obje debm finm heri deco exte dmmu dmtd bmtd ssch mrem assi fiss prim annu prob sais choi deto part clmi pmat excp prop phaj alea gnfl mpro sste adve bgmo ecfe coup verm dfer gyro cori kent fant itrc reto ijet impe moca levm ravc idli raff cfnd adet psip acos asin tan trie gane hist etg oter xfem rfco vide voro prra posi mise misl coll pod
+
+[settings]
+# default extension used when saving files
+extension=dgibi
+comment_single=*
+
+# 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)
+run_cmd=castem19 "%f"
diff --git a/data/filetype_extensions.conf b/data/filetype_extensions.conf
index 4f0d309f..69149eaf 100644
--- a/data/filetype_extensions.conf
+++ b/data/filetype_extensions.conf
@@ -73,6 +73,7 @@ VHDL=*.vhd;*.vhdl;
 XML=*.xml;*.sgml;*.xsl;*.xslt;*.xsd;*.xhtml;*.xul;*.dtd;*.xtpl;*.mml;*.mathml;
 YAML=*.yaml;*.yml;
 Zephir=*.zep;
+GIBIANE=*.dgibi;*.procedur;
 None=*;
 
 # Note: restarting is required after editing groups
diff --git a/data/tags/std.dgibi.tags b/data/tags/std.dgibi.tags
new file mode 100644
index 00000000..3e3ac295
--- /dev/null
+++ b/data/tags/std.dgibi.tags
@@ -0,0 +1,312 @@
+format=tagmanager
+@A1DDLÌ16ÍTABDYN * TABLE Ö0Ï=
+@AFEVOZTÌ16ÍÖ0Ï=
+@ALGSTAÌ16Íi *ENTIER ttt *TABLE Ö0Ïttt =
+@ANA_LIMÌ16ÍPRECED * TABLE Ö0ÏPRECED =
+@ARRÌ16Íx * FLOTTANT n * ENTIER Indic / MOT Ö0Ïr =
+@CARENEÌ16ÍCOU * TABLE ROT_1 * LISTREEL ROT_2 * LISTREEL N_COU * FLOTTANT AXE_P * ENTIER Ö0ÏCARE_1 LIS COUI =
+@CARTOONÌ16ÍTAB1 *TABLE MAILL1 *MAILLAGE BL1 /RIGIDITE OEIL /POINT AMPLI /FLOTTANT OSCILLE /MOT Ö0ÏDEF1 =
+@CFD10Ì16ÍFO1 * FLOTTANT Ö0Ï=
+@CFS10Ì16ÍFO1 * FLOTTANT Ö0Ï=
+@CHFLECÌ16ÍECH1 * FLOTTANT CHPO1 * CHPOINT ARG1 / MOT TAIL1 / FLOTTANT Ö0ÏPTF1 =
+@CIRCONSÌ16ÍÖ0Ï=
+@CLDHCÌ16ÍMAIL0 *MAILLAGE CONT0 *TABLE Ö0ÏRIGCLP FCLP0 =
+@CLMI1CÌ16ÍMAIL0 *MAILLAGE CONT0 *TABLE Ö0ÏRIGCLP FCLP0 =
+@CLMI2CÌ16ÍMAIL0 *MAILLAGE CONT0 *TABLE Ö0ÏRIGCLP FCLP0 =
+@CLPDÌ16ÍMAIL0 *MAILLAGE DEF0 *TABLE Ö0ÏRIGCLP DEPTOT =
+@COUTOR1Ì16ÍIEL *MAILLAGE CHT *CHPOINT CHN *CHPOINT CHB *CHPOINT Ö0ÏDS2 R T ALPHA BETA =
+@COUTOR2Ì16ÍGEOFRE *MAILLAGE CHT *CHPOINT CHN *CHPOINT CHB *CHPOINT Ö0ÏCHRT =
+@CRIPLÌ16ÍMOD *MMODEL SIG *MCHAML VAR *MCHAML MAT *MCHAML ER *FLOTTANT Ö0ÏCRIPL =
+@DEFA2DLÌ16ÍLIG0 * MAILLAGE PIN1 * POINT TAI1 * FLOTTANT TYP1 * MOT DES1 / MOT LOG1 / LOGIQUE Ö0ÏMAT1 =
+@DEFA2DPÌ16ÍTAI1 * FLOTTANT ORI1 * POINT VEC1 * POINT TYP1 * MOT Ö0ÏMAI1 =
+@DEFPLÌ16ÍMMM *MMODEL MOD *TABLE MAT *MCHAML EPS *MCHAML SIGI *MCHAML EPSP *MCHAML VAR *MCHAML ERR *FLOTTANT E23D *MCHAML V23D *MCHAML Ö0ÏN_VAR N_EPSP E23D V23D =
+@ENCAÌ16ÍTAIL1 * FLOTTANT MAIL1 * MAILLAGE VEC1 * POINT Ö0ÏPTF1 =
+@EVN_IDTÌ16ÍT1 * TABLE ID_BU * ENTIER Ö0ÏT1 =
+@EVN_MNGÌ16ÍT1 * TABLE ID_BU * ENTIER Ö0ÏT1 =
+@FIS_1Ì16Ítab1 *table tab2 *table Ö0Ïtab2 =
+@FIS_2Ì16Íp01 *point p03 *point p05 *point p07 *point oc *point c *FLOTTANT a *FLOTTANT alpha *FLOTTANT beta *FLOTTANT nt *entier ndt *entier Ö0Ïvtot alpha_mi alpha_ma lsommet1 lsommet3 lsommet5 lsommet7 =
+@FIS_3DSÌ16Íc *flottant a *flottant lo *flottant to *flottant ho *flottant nt *entier nc *entier ns *entier rc0 *flottant rc1 *flottant rc2 *flottant rc3 *flottant alpha *flottant ndt *entier nsdt *entier xl *entier xt *entier xh *entier Ö0Ïvtot lff levreinf sar slat sinf sav_s ssup_s slat_s boudin ep3 =
+@FIXÌ16Íx * FLOTTANT n * ENTIER Indic / MOT Ö0Ïr =
+@GATTPARÌ16Ífichier * MOT Ö0ÏMATAB =
+@GLOBALÌ16ÍTAB1 *TABLE BLO1 *RIGIDITE COURB2 *EVOLUTION MOEFF *MOT Ö0ÏEVOL1 =
+@HELICEÌ16ÍP1 /POINT GEO1 /MAILLAGE TYP1 *MOT P0 *POINT V0 *POINT PAS *FLOTTANT ALPHA *FLOTTANT NP *ENTIER Ö0ÏGEO2 GEO3 =
+@HISTOGRÌ16ÍLVAL1 * LISTREEL TOPT1 / TABLE LSOR1 / LOGIQUE Ö0Ï=
+@INCLUSIÌ16ÍTHO7U * TABLE DPAR1 * FLOTTANT DREP1 * FLOTTANT Ö0ÏTMPARMAT =
+@INITIAÌ16Íttt *TABLE Ö0Ïttt =
+@INTLINÌ16ÍLI1 * LISTREEL LI2 * LISTREEL X0 * FLOTTANT Ö0Ï=
+@ISOSURFÌ16ÍMASSIF0 * MAILLAGE LIS1 * LISTREEL HANA1 * CHPOINT Ö0ÏMAIF1 CHPF1 =
+@KEFFÌ16ÍMOD1 *MMODEL MAT1 *MCHAML CLIM1 *PROCEDUR AMPL1 *FLOTTANT CONV1 *ENTIER VISU1 *TABLE Ö0ÏK C D =
+@LACRITÌ16ÍTT1 *TABLE NZON *ENTIER TSIEP *TABLE FM *FLOTTANT MCRIT *MOT Ö0ÏTLISP =
+@LAREADÌ16ÍTCOMP *TABLE NUNIT /ENTIER NOM_FILE /MOT Ö0Ï=
+@LAVERGÌ16ÍTAB1 *TABLE NPLY *ENTIER OEIL1 *POINT Ö0Ï=
+@LAVISÌ16ÍTCOMP *TABLE NZONE *ENTIER Ö0Ï=
+@LIREENTÌ16ÍUMIN *ENTIER UMAX *ENTIER Ö0ÏFL =
+@LIRERISÌ16ÍÖ0ÏBO =
+@LISPA16Ì16ÍCHARG *TABLE DON *TABLE Ö0ÏDON =
+@LISSEÌ16ÍEVO_1 * EVOLUTION FLO_1 * FLOTTANT FLO_2 * FLOTTANT ENT_1 * ENTIER ENT_2 * ENTIER Ö0ÏEVO_2 =
+@MISTPARÌ16Ífichier * MOT SENSIP1 * ENTIER SENSIP2 * ENTIER Ö0ÏPDILT E1 E2 E3 NU12 NU23 NU13 MU12 MU23 MU13 PNBRE PCOHI PECOU PEDIR PRVCE PECRX PDVDI PCROI PINCR =
+@MODÌ16ÍI J Ö0ÏMOD =
+@MODTRIÌ16ÍTABPARA * TABLE DATA * TABLE Ö0Ï=
+@M_VOROÌ16ÍÖ0Ï=
+@ORTHOÌ16ÍMAIL1 * MAILLAGE LIG1 * MAILLAGE CH1 * CHPOINT CH2 * CHPOINT ALPHA * FLOTTANT LL * LISTREEL TYPEMOD / MOT TYPEELT / MOT PTGENE / POINT Ö0ÏMATGEO MODL1 =
+@OTCOQUEÌ16ÍCRIT *FLOTTANT NMIT *ENTIER SPEI *FLOTTANT VLIM *FLOTTANT STEC *FLOTTANT TMOD *TABLE TMAT *TABLE FORZE *CHPOINT VINCO *RIGIDITE PV *POINT Ö0ÏSPZO DE1 =
+@OTPOUTÌ16ÍCRIT *FLOTTANT NMIT *ENTIER SEZY *FLOTTANT SEZZ *FLOTTANT SLIM *FLOTTANT STEC *FLOTTANT TMOD *TABLE TMAT *TABLE FORZ *CHPOINT VINCO *RIGIDITE TVECT *TABLE Ö0ÏTTRA SPOT =
+@POINTIRÌ16ÍÖ0Ï=
+@POLOÌ16ÍTAGEO1 * TABLE TABOB1 * TABLE PL1 / TABLE Ö0ÏTABCHB TAB2 =
+@PRCA1Ì16ÍT1 * TABLE ID_BU * ENTIER Ö0ÏT1 =
+@PRCA5Ì16ÍT1 * TABLE ID_BU * ENTIER Ö0ÏT1 =
+@P_BOIT2Ì16ÍÖ0Ï=
+@RAYOÌ16ÍPF *POINT P1 *POINT NBC *ENTIER Ö0ÏST SINT L1EXT L2EXT L3EXT L4EXT LLD LLG =
+@RCCMÌ16ÍTABCOUP *TABLE TABET *TABLE TABGROU /TABLE TABFATI /TABLE Ö0Ï=
+@RCCMCO2Ì16ÍNNE *ENTIER NNC *ENTIER PP1 *POINT PP2 *POINT NSEG *ENTIER SIG1 *MCHAML MOD1 *MMODEL EPAI *FLOTTANT GRAPL *LOGIQUE ECRI *LOGIQUE NOM *MOT PP3 *POINT Ö0ÏTABV =
+@REMPCOUÌ16ÍTABCOUP *TABLE P1 *POINT P2 *POINT NC *ENTIER MODELT *MMODEL EPAI *FLOTTANT GRAP *MOT ECR *MOT NOM /MOT VTRA /POINT Ö0Ï=
+@REPEREÌ16ÍORI1 / POINT TAI0 / LISTREEL NOM1 / LOGIQUE COU1 / MOT Ö0ÏRP1 =
+@SIGREFÌ16ÍP *MCHAML M *MCHAML W *MCHAML A *MCHAML MO *MMODEL Ö0ÏSS =
+@STATIOÌ16Íttt *TABLE Ö0Ï=
+@STBLÌ16ÍCHOZ * TABLE Ö0ÏSORTZ =
+@SYSLINÌ16ÍK1 *TABLE F1 *TABLE Ö0ÏU1 =
+@TESTÌ16ÍEPS1 *MCHAML EPS2 *MCHAML ERR *FLOTTANT Ö0ÏTEST =
+@TOLE2Ì16ÍL_1 * MAILLAGE RA_1 * FLOTTANT N_1 * ENTIER Ö0ÏRE_1 =
+@TOLE3Ì16ÍA_1 * MAILLAGE A_2 * MAILLAGE RA_1 * FLOTTANT N_1 * ENTIER Ö0ÏC_1 C_2 S_1 S_2 V_1 =
+@TOROÌ16ÍTAGEO *TABLE TABOB *TABLE Ö0Ïtabchb tab2 =
+@ZACPRO2Ì16ÍS1 * MCHAML S2 * MCHAML S3 * MCHAML S4 * MCHAML S5 * MCHAML S6 * MCHAML MO * MMODEL Ö0ÏSIGMAA =
+@ZACPRO3Ì16ÍCC * MCHAML Ö0ÏEP1 EP2 EP3 EP4 EP5 EP6 =
+@ZACPRO4Ì16ÍBB * MCHAML Ö0ÏCO1 CO2 CO3 CO4 CO5 CO6 =
+@ZACPRO5Ì16ÍCO * MCHAML MO * MMODEL Ö0ÏDEVAA =
+@ZACPRO6Ì16ÍX * MCHAML Y * MCHAML Ö0ÏPRSC =
+@ZACPRO7Ì16ÍAA * MCHAML Ö0ÏVMISAA =
+@deduireÌ16Ígeo1 * MAILLAGE maianc * MAILLAGE mainouv * MAILLAGE Ö0Ïres =
+ACIERÌ16ÍMM * MOT OBMOD * MMODEL Ö0ÏMMM =
+AFFICHEÌ16Í* RISOM *RIGIDITE FO *CHPOINT S *MAILLAGE AMPDEF *FLOTTANT AMPVEC *FLOTTANT Ö0Ï=
+AFT1Ì16ÍDEP1 * CHPOINT Ö0ÏDEPnl VITnl =
+AFT2Ì16ÍÖ0ÏFNLFRE =
+AJUSTEÌ16Ítab1 * TABLE Ö0Ïq p =
+ANIMÌ16ÍGEO * MAILLAGE DEP * CHPOINT AMPL * FLOTTANT Ö0ÏOBJ =
+ANIMEÌ16ÍNFOIS * ENTIER GEO * MAILLAGE DEF * CHPOINT AMPLD * FLOTTANT VEC / CHPOINT Ö0ÏDEFTOT =
+ANLIMTREÌ16ÍTABIN * TABLE Ö0ÏIOK =
+AUTOPILOÌ16ÍDELT * CHPOINT DELA * CHPOINT ZMOD * MMODEL ZMAT * MCHAML TTT *TABLE Ö0ÏNORM1 =
+BIOVOLÌ16ÍBOBI * MAILLAGE PCAL * MAILLAGE J * CHPOINT MU0 * FLOTTANT Ö0ÏHGEO =
+BOAÌ16ÍTUYO1 / TABLE Ö0ÏTUYO2 =
+CALACTIVÌ16ÍTB3 *TABLE TB4 *TABLE LILI *LISTENTI Ö0ÏCCACT =
+CALCDISPÌ16ÍQELEM * CHPOINT DISPL * CHPOINT DISPT * CHPOINT Ö0Ïdif_disp =
+CALCPÌ16ÍÖ0Ï=
+CALCTRACÌ16ÍMoDARCY * MMODEL Difftot * MCHAML Cini * CHPOINT nomespec * LISTMOTS nbespece * ENTIER LMLump * LOGIQUE matrtr / MATRIK TABRES * TABLE Tbdartra * TABLE CHCLIM * TABLE Ö0Ïtcfin MatrTr =
+CALLMÌ16ÍÖ0Ï=
+CALMUÌ16ÍÖ0Ï=
+CHAMINTÌ16ÍCH1 * CHARGEMENT Ö0ÏCH2 xstart =
+CHITRNSPÌ16ÍTRANSI * TABLE Ö0ÏTRANSI =
+CHTGAUÌ16ÍTAB1 *TABLE Ö0Ï=
+CHTITRÌ16ÍEV1 * EVOLUTION XT / MOT YT / MOT Ö0ÏEV1 =
+CH_THETAÌ16ÍSUPTAB *TABLE Ö0ÏTETA TABUTIL =
+CINEMAÌ16ÍMESH0 * MAILLAGE MESH1 * MAILLAGE MESH2 * MAILLAGE VECT1 * POINT Ö0ÏDEFOT =
+CINEMBÌ16ÍMESH0 * MAILLAGE MESH1 * MAILLAGE MESH2 * MAILLAGE MESH3 * MAILLAGE Ö0ÏDEFOT =
+CLINCÌ16Írxt * TABLE rtf * TABLE TKAS * LOGIQUE NIC *MOT Nj *MOT Nj1 * FLOTTANT Nj2 * FLOTTANT Nj3 * FLOTTANT Ö0Ï=
+CODENORMÌ16ÍZTABENT * TABLE Ö0ÏCODENORM =
+COLLERÌ16ÍVOLUM8 * MAILLAGE SURF4 * MAILLAGE OPT / MOT Ö0ÏCOQMASF =
+COLLER1Ì16ÍSURF4 *MAILLAGE POUT2 *MAILLAGE ANG /FLOTTANT Ö0ÏPOUTCOQ =
+COLLER2Ì16Ímod_sh * MMODEL mat_sh * MCHAML mod_so * MMODEL Ö0ÏKREL2 =
+CONDENSÌ16ÍRXT *TABLE $paroic *MMODEL TP *MOT TF *MOT MRVP *MOT KHcu * FLOTTANT Ö0ÏQC Fcond Econd Hcond KKC ROVI FHP HT =
+CONTSEG3Ì16ÍL1 * MAILLAGE L2 * MAILLAGE Ö0ÏRIG12 LIG1 LIG2 =
+CONVTÌ16Ítps * FLOTTANT nn / ENTIER unit / MOT Ö0Ïout =
+COQ2MASÌ16ÍMOD1 *MMODEL MAT1 *MCHAML MOTCLE /MOT TAB1 *TABLE Ö0ÏMESH3D =
+COUPLERÌ16ÍÖ0Ï=
+COUR3DÌ16ÍBBBB * MAILLAGE FFAC1 * MAILLAGE FFAC2 * MAILLAGE MMM * MOT J * FLOTTANT NORJ / LOGIQUE Ö0ÏJJJ =
+COURSPECÌ16ÍSPECT * LISTREEL DELTT * FLOTTANT Ö0ÏSTASPE =
+CRITLOCÌ16ÍETAB * TABLE Ö0ÏSTAB =
+CTODÌ16ÍSUPTAB *TABLE U *CHPOINT Ö0ÏSUPTAB =
+DARCYSATÌ16ÍSATUR * TABLE Ö0Ï=
+DARCYTRAÌ16ÍTRANSI * TABLE Ö0Ï=
+DDFOURÌ16ÍGEO * MAILLAGE CHARM * MAILLAGE NHARM * ENTIER SOL * CHPOINT RHARM * FLOTTANT ORIG / POINT LIS * LOGIQUE ITYPE / ENTIER Ö0ÏAKN ANGVEC =
+DEADFONCÌ16ÍÖ0Ï=
+DEADKTANÌ16ÍÖ0Ï=
+DECONVÌ16ÍCOUCHE * TABLE FOND_SOL * MAILLAGE SOL / MAILLAGE MOD_SOL DIR * MOT GAMMAO * EVOLUTIO F1 * FLOTTANT F2 * FLOTTANT FC / FLOTTANT TYP_F / MOT P_GAMMA / TABLE Ö0ÏTABRESU =
+DECONV3DÌ16ÍCOUCHE * TABLE PC * POINT FOND_SOL * MAILLAGE MOD_SOL *MMODEL MAT_SOL *MCHAML DIR * MOT GAMMAO * EVOLUTIO F1 * FLOTTANT F2 * FLOTTANT FC / FLOTTANT P_GAMMA / TABLE Ö0ÏTABRESU =
+DEDANSÌ16ÍP0 *POINT CTR1 *MAILLAGE PREC / FLOTTANT Ö0Ï=
+DEDUADAPÌ16ÍÖ0Ï=
+DEPOUÌ16ÍSGINI *MCHAML TABETAP *TABLE Ö0ÏTABDEP =
+DESCOURÌ16ÍTAB * TABLE I * ENTIER BLOCI * MAILLAGE MM * MOT J * FLOTTANT Ö0Ï=
+DESTRAÌ16ÍTBR * TABLE TBDES0 / TABLE EVOL2 / EVOLUTIO TBDES2 / TABLE Ö0Ï=
+DIFFANISÌ16ÍMateDiff * CHPOINT typdi / MOT ANISO / LOGIQUE Ö0Ïnewdiff =
+DREXUSÌ16ÍETAB * TABLE Ö0ÏETAB =
+DUPONT2Ì16ÍPRECED * TABLE Ö0ÏSTAB =
+DYNAMICÌ16ÍETAB * TABLE Ö0ÏSTAB =
+DYNAMOD2Ì16ÍSOLUDY * SOLUTION BASMOD * BASEMODA LISTEM * LISTREEL TEMPCALC * LISTREEL TABL_EVO * TABLE TABL_PAS / TABLE Ö0ÏRESUEVOL =
+DYNAMOD3Ì16ÍBASMOD * BASEMODA SOLUDY * SOLUTION TABL_MAX * TABLE Ö0ÏRESUMAXI =
+DYNAMODEÌ16Í_OPERAT_ * MOT TEMPCALC * LISTREEL _BASMOD_ * BASEMODA MOT1 / MOT MOT2 / MOT MOT3 / MOT MOT4 / MOT MOT5 / MOT MOT6 / MOT MOT7 / MOT MOT8 / MOT MOT9 / MOT MO10 / MOT MO11 / MOT AMORT / LISTREEL ENT1 / ENTIER CHP1 / CHPOINT CHP2 / CHPOINT SOLPRE / SOLUTION TAB1 / TABLE TAB2 / TABLE TAB3 / TABLE TAB4 / TABLE TAB5 / TABLE Ö0ÏRESU =
+EFFMARTIÌ16ÍSIG1 * MCHAML MOD1 * MMODEL MAT1 * MCHAML VECT1 * POINT VECT2 * POINT H1 * FLOTTANT ENRE1 * FLOTTANT ENRI1 * FLOTTANT COT1 * FLOTTANT Ö0ÏSIG2 =
+ELECNEUTÌ16ÍTB3 *TABLE TBC2 *OBJET TBPAR2 *OBJET LIMODI /LISTENTI Ö0ÏMSINEUT =
+ENCEINTEÌ16Ínbit * ENTIER rxt * TABLE KENC / MOT Ö0Ï=
+ENERMODEÌ16ÍTBASS * TABLE TRESD * TABLE TINIT / TABLE LOG1 / LOGIQUE Ö0Ï=
+ENRICHISÌ16ÍSIGNAL * EVOLUTION NIVEAU * ENTIER Ö0ÏSSIGNAL =
+EXACÌ16ÍÖ0Ï=
+EXICÌ16ÍÖ0Ï=
+EXPLORERÌ16ÍÖ0Ï=
+FILCÌ16ÍEV1 * EVOLUTIO F0 * FLOTTANT DF1 * FLOTTANT Ö0ÏEV3 =
+FLAMBAGEÌ16ÍETAB11 *TABLE Ö0ÏSTAB11 =
+FORBLOCÌ16ÍBLOC * MAILLAGE SOL1 * CHPOINT COUR * FLOTTANT AXI / LOGIQUE Ö0ÏRPT RFB =
+FORNODÌ16ÍLIG1 * MAILLAGE COM1 * MOT FO * FLOTTANT Ö0ÏFOR1 =
+FOR_CONTÌ16ÍGEO * MAILLAGE SOL1 * CHPOINT COURI * FLOTTANT Ö0ÏRFORC SMM =
+FPALÌ16ÍÖ0ÏAK =
+FRCTRACEÌ16ÍTAB1 * TABLE TOL1 * FLOTTANT Ö0ÏTT1 =
+FREPARTÌ16ÍFF * POINT LIGNE * MAILLAGE Ö0ÏCHPF4 =
+FRONABSÌ16ÍTAB_VAL * TABLE TYP_FRON / MOT NHARM / ENTIER Ö0ÏRIGT =
+FTRANÌ16ÍEV1 * EVOLUTIO EV2 * EVOLUTIO F0 * FLOTTANT VAL1 / ENTIER Ö0ÏEV3 =
+F_S2PIÌ16ÍCHARM * MAILLAGE SCIRC * CHPOINT NN * ENTIER OO * POINT Ö0ÏSCIRC SUPO =
+GAM1Ì16Íx1 *flottant Ö0Ï(EXP (resu1 ) ) =
+GDFLIM1Ì16Ítab1 *TABLE Ö0Ïerr1 =
+G_CALCULÌ16ÍSUPTAB * TABLE INFTAB * TABLE Ö0ÏSUPTAB =
+G_THETAÌ16ÍSUPTAB * TABLE Ö0ÏSUPTAB =
+G_ULTI2DÌ16ÍTAB1 * TABLE Ö0ÏVAL1 =
+G_ULTIFRÌ16ÍTAB1 * TABLE Ö0ÏVAL1 =
+HASOFERÌ16ÍTAB1 *TABLE Ö0Ïerr1 =
+HAUBANÌ16ÍÖ0Ï=
+HRAYOÌ16Ímcv * MMODEL mor1 * MMODEL mar1 * MCHAML tt1 * CHPOINT mor2 / MMODEL mar2 / MCHAML tt2 * CHPOINT rel12 / MAILLAGE stefan / FLOTTANT Ö0Ïh =
+HTCTRANÌ16ÍN_PAS * ENTIER NN_PAS * ENTIER N_ITER * ENTIER T_PAS * FLOTTANT MODL1 * MMODEL TAV1 * TABLE Ö0ÏTAV1 =
+HTC_CHBWÌ16ÍT0 * CHPOINT H0 * CHPOINT TAV1 * TABLE Ö0ÏWD DF2 =
+HTC_PERÌ16ÍT0 *CHPOINT HR *CHPOINT TAV1 *TABLE Ö0ÏAGDG =
+HTC_WTRÌ16ÍTAV1 * TABLE M1 * MOT TA * CHPOINT PA / CHPOINT Ö0ÏOUT =
+H_BÌ16ÍMU0 * FLOTTANT EVO1 / EVOLUTION F / FLOTTANT Ö0ÏREVOL =
+IDBHTÌ16ÍM1 * MCHAML MO1 * MMODEL BHTMX * CHPOINT T2 * CHPOINT Ö0ÏMI IFER =
+IDENTIÌ16ÍNOMMOD *MOT Ö0Ï=
+IMAGESÌ16ÍTABA * TABLE Ö0Ï=
+IMPCHI1Ì16ÍTB1 * TABLE NOMTB * MOT Ö0Ï=
+IMPCHI2Ì16ÍTB3 * TABLE NOMTB3 * MOT Ö0Ï=
+INDIBETAÌ16ÍBinf * FLOTTANT Bsup * FLOTTANT Pf * FLOTTANT Ö0ÏVal =
+INDUCTIOÌ16ÍGEO * MAILLAGE SOL1 * CHPOINT AXI * LOGIQUE Ö0ÏBTOT =
+INICHI1Ì16ÍTB2 *OBJET BASE1 *MOT BASE2 *MOT Ö0Ï=
+INICHI2Ì16ÍTB3 *TABLE TBC2 *OBJET G1 /MAILLAGE Ö0Ï=
+INICHIMIÌ16ÍTTB1 /OBJET BBD1 /MOT BBD2 /MOT TTB2 /OBJET TTB3 /OBJET G1 /MAILLAGE Ö0ÏTB2 TB3 TBC2 =
+INIMURÌ16Írxt *TABLE tbt *TABLE Ö0Ï=
+ININLINÌ16Ínop * ENTIER nvar * ENTIER ndat * ENTIER ncof * ENTIER vdim * ENTIER Ö0ÏA =
+INITEFMHÌ16ÍMoDARCY * MMODEL Porosite * CHPOINT MateDiff * CHPOINT ChPSour * CHPOINT DeltaT * FLOTTANT Cini * CHPOINT TetaDiff * FLOTTANT TetaConv * FLOTTANT TetaLin * FLOTTANT Qface / CHPOINT QELEM / CHPOINT DISPL / CHPOINT DISPT / CHPOINT LMLump * LOGIQUE DECENTR * LOGIQUE CHCLIM * TABLE OPTRESOL / TABLE Ö0ÏSMTr MatrTr TbDarTra MassEFMH nomespec nbespece nbsource Diffdisp Tcini TABRES TABMODI =
+INITOUÌ16ÍTAB1 *TABLE Ö0Ï=
+INITVFÌ16ÍMoDARCY * MMODEL Porosite * CHPOINT MateDiff * CHPOINT ChPSour * CHPOINT DeltaT * FLOTTANT Cini * CHPOINT TetaDiff * FLOTTANT TetaConv * FLOTTANT TetaLin * FLOTTANT Qface / CHPOINT QELEM / CHPOINT DISPL / CHPOINT DISPT / CHPOINT CHCLIM * TABLE OPTRESOL / TABLE LCONV * LOGIQUE Ö0ÏRESI MATOT JACO MPOR2 MCHAMT MCHAMT1 diffdisp difftot nomespec nbespece nbsource TABRES TABMODI NOUVMAT =
+INT_COMPÌ16ÍGEOP * MAILLAGE CCCC * CHPOINT GEOF * MAILLAGE Ö0ÏCRES =
+IN_MINIÌ16ÍFCAN * MAILLAGE HS * CHPOINT ORIG * POINT B_ANTI * TABLE Ö0ÏHHHH =
+ISSLEQÌ16ÍTDON1 * TABLE Ö0Ï=
+JEUÌ16ÍRIG1 * RIGIDITE Ö0ÏCHP1 =
+KRESPÌ16ÍÖ0Ï=
+KR_PROÌ16ÍLOI * TABLE SAT * CHPOINT Ö0ÏK1 =
+KUETÌ16ÍÖ0ÏUET =
+KWEIB1Ì16Íx1 *flottant Ö0Ïk3 =
+LIREFLOTÌ16ÍUMIN * FLOTTANT UMAX * FLOTTANT Ö0ÏFL =
+MAG_NLINÌ16ÍETAB * TABLE Ö0ÏETAB =
+MAILVOROÌ16ÍTAB1 * TABLE ENV0 * MAILLAGE NBDIV / ENTIER COEF1 / FLOTTANT MO1 / MOT Ö0ÏMTRIA1 =
+MDNRISÌ16ÍP *FLOTTANT Ö0ÏY IER =
+MDRECOMBÌ16ÍRXT * TABLE Ö0Ï=
+MONTAGNEÌ16ÍSMV * CHPOINT SMV2 / CHPOINT GEO * MAILLAGE AMP / FLOTTANT OEIL1 / POINT OEIL2 / LISTREEL Ö0Ï=
+MRCFRAM1Ì16ÍTYP_CAL2 * MOT TAB_IN2 * TABLE TOL_2 * FLOTTANT Ö0ÏLAM_FIN1 =
+MRCFRAM2Ì16ÍTYP_CAL2 * MOT TAB_IN2 * TABLE TOL_2 * FLOTTANT Ö0ÏLAM_FIN1 =
+MRCFRAM3Ì16ÍTYP_CAL2 * MOT TAB_IN2 * TABLE TOL_2 * FLOTTANT Ö0ÏLAM_FIN1 =
+MRCFRAM4Ì16ÍTYP_CAL2 * MOT TAB_IN2 * TABLE TOL_2 * FLOTTANT Ö0ÏLAM_FIN1 =
+MRCFRAMEÌ16ÍTYP_CAL1 * MOT TAB_IN * TABLE TOL_1 * FLOTTANT L_ELE1 / LISTENTI Ö0ÏTT2 =
+MRCSHELLÌ16ÍTYP_CAL1 * MOT TAB_IN * TABLE TOL_1 * FLOTTANT L_ELE1 / LISTENTI Ö0ÏTT2 =
+MRCTRACEÌ16ÍTAB1 * TABLE TOL1 * FLOTTANT Ö0ÏTT1 =
+NOESPCHIÌ16ÍTB1 * TABLE NOM1 / MOT NUM1 / ENTIER Ö0ÏNOM2 NUNU =
+NORMALIMÌ16ÍM * EVOLUTION DTIME / FLOTTANT Ö0ÏVALSPE MNORME =
+NORV1Ì16Ív1 *LISTREEL Ö0Ïnv1 =
+NSCLIMÌ16ÍÖ0ÏRESU =
+OUVFISSÌ16ÍTAB1 *TABLE IPAS /ENTIER OPT1 /MOT Ö0Ï=
+PARASTATÌ16ÍSUPTAB * TABLE Ö0ÏMU SIGMA RB1 B2 =
+PASAPASÌ16ÍPRECED * TABLE Ö0ÏPRECED =
+PAS_DEFAÌ16ÍPRECED * TABLE Ö0Ï=
+PAS_EPTHÌ16ÍPRECED *TABLE MODEVAL *MMODEL MATEVAL *MCHAML TCHP /CHPOINT TCHAM /MCHAML Ö0ÏETHER2 MSRTHER2 =
+PAS_ETATÌ16ÍPRECED * TABLE TI * FLOTTANT Ö0ÏETAT1 =
+PAS_HELMÌ16ÍPRECED * TABLE Ö0Ï=
+PAS_INITÌ16ÍPRECED * TABLE Ö0Ï=
+PAS_MATEÌ16ÍPRECED * TABLE ETAT * MCHAML Ö0ÏMMM =
+PAS_REPRÌ16Ípreced * TABLE Ö0Ï=
+PAS_RESUÌ16ÍTEMP0 * FLOTTANT IAUTO * ENTIER PRECED * TABLE Ö0ÏISAUV =
+PAS_VERMÌ16ÍPRECED * TABLE chetat1 * MCHAML Ö0Ï=
+PECHEÌ16ÍTT *TABLE NOM *MOT VAL /FLOTTANT MOT1 / MOT Ö0ÏTOTO =
+PFLUAGEÌ16ÍNOMREG *MOT MOBET *MMODEL MABET *MCHAML SIGEPS *MCHAML RAYSECH *MCHAML AGECHAB *FLOTTANT TEMPCOUR *FLOTTANT RHOS *MCHAML TCOULB *FLOTTANT FLOT1 /FLOTTANT FC28 /FLOTTANT Ö0ÏEPSFLU =
+PHASAGEÌ16ÍTABPHAS Ö0ÏTABPHAS =
+PMPBÌ16ÍTSIG *chpoint LIG *maillage grapl *logique nnc *entier nne *entier Ö0ÏTABV =
+POINTSPHÌ16ÍLONG * FLOTTANT TETA * FLOTTANT PHI * FLOTTANT Ö0ÏPT =
+POSTDDIÌ16Ítab *TABLE tabmat *TABLE geo *MAILLAGE periode *FLOTTANT nperi *ENTIER idebu *ENTIER Ö0Ïnf nc nr dfin =
+POSTDDI1Ì16Ívar1 *MCHAML alpha *FLOTTANT mod0 *MMODEL Ö0Ïchi =
+POSTOUÌ16ÍTAB1 *TABLE DIST /FLOTTANT Ö0Ï=
+POSTVIBRÌ16ÍTBAS1 * TABLE LMOC1 / LISTMOTS TOPT1 / TABLE Ö0Ï=
+POT_SCALÌ16ÍTABGEO * TABLE SOLIN /MOT Ö0Ï=
+POT_VECTÌ16ÍMATAB * TABLE SOLIN / MOT Ö0Ï=
+PREPAENCÌ16Írxt * TABLE TBT * TABLE geo * TABLE TIC * TABLE Ö0Ï=
+PROBABRSÌ16ÍMuR * FLOTTANT SigR * FLOTTANT rR * FLOTTANT bR * FLOTTANT MuS * FLOTTANT SigS * FLOTTANT rS * FLOTTANT bS * FLOTTANT Ö0ÏPf =
+PROBDENSÌ16ÍMU * FLOTTANT SIGMA * FLOTTANT RB1 * FLOTTANT B2 * FLOTTANT Ö0ÏPDF CDF =
+PROCHEXTÌ16ÍTPS * FLOTTANT rxt * TABLE KASX * MOT Ö0Ï=
+PRODTÌ16ÍÖ0Ï=
+PROJGRILÌ16Ínuag1 * NUAGE Ö0Ïmail1 chp2 =
+PROPAGÌ16ÍETAB * TABLE Ö0ÏEVO6 =
+PSATTÌ16ÍÖ0Ï=
+QUADRATUÌ16ÍLOI * MOT MU * FLOTTANT SIGMA * FLOTTANT N * ENTIER Ö0ÏRESTAB =
+RAMBERGÌ16ÍTAB1 * TABLE Ö0ÏTAB1 =
+RDIVÌ16ÍÖ0Ï=
+RECENTREÌ16ÍCHP1 * CHPOINT MMO * MMODEL NIV * MOT Ö0Ï=
+RECOMPOMÌ16ÍMRESI * EVOLUTION MDECO * EVOLUTION DTIME * FLOTTANT CRESI / FLOTTANT CDECO / LISTREEL OPTIO / TABLE Ö0ÏM ACC =
+RECOMPOSÌ16ÍRESI * EVOLUTION DECO * EVOLUTION OPTIO / TABLE Ö0ÏM ACC =
+REPIXÌ16ÍÖ0Ï=
+RESEAUÌ16ÍTAB * TABLE NIND * ENTIER PARAM * FLOTTANT Ö0ÏEVN =
+RESO_ASYÌ16ÍRIGI_ASY * RIGIDITE CHP_FORC * CHPOINT Ö0ÏCHP_DEPL =
+RESPOWNSÌ16ÍRSNS * EVOLUTION M * EVOLUTION FREQ * LISTREEL OPTION / TABLE Ö0ÏPSNS =
+RESPOWSPÌ16ÍRSPE * EVOLUTION TE * FLOTTANT AMOR * LISTREEL OPTION / TABLE Ö0ÏPSPE =
+RETRAITÌ16ÍNOMREG *MOT MOBET *MMODEL RAYSECH *MCHAML TCOULB *FLOTTANT TEMPCOUR *FLOTTANT FLOT1 *FLOTTANT RHOS *MCHAML FC28 /FLOTTANT Ö0ÏEPSRET =
+ROSENTÌ16ÍTAB1 *TABLE Ö0Ï=
+ROTA_IMPÌ16Ímonmail * MAILLAGE angle * FLOTTANT poin1 * POINT poin2 * POINT Ö0Ïrrota lrota =
+SATUTILSÌ16ÍÖ0Ï=
+SGEÌ16ÍÖ0Ï=
+SHFDTÌ16ÍTABDON Ö0ÏFDTSH =
+SIFÌ16ÍSUPTAB *TABLE MAT *MCHAML U *CHPOINT Ö0ÏSUPTAB =
+SIGNCORRÌ16ÍZZTB * TABLE Ö0ÏZSIGN =
+SIGNDERIÌ16ÍEVSIG1 * EVOLUTIO Ö0ÏEVSIG2 =
+SIGNENVEÌ16ÍZZTA * TABLE Ö0ÏZENV =
+SIGNSYNTÌ16ÍMOT1 * MOT ZTAB * TABLE Ö0ÏZTEVSIG =
+SOLVEFMHÌ16ÍMoDARCY * MMODEL ChPSour * CHPOINT MassEFMH * RIGIDITE MatTR / RIGIDITE matTM / MATRIK SMTR * CHPOINT Tcini * CHPOINT cini * CHPOINT QFACE / CHPOINT nomespec * LISTMOTS nbespece * ENTIER nbsource * ENTIER TABRES * TABLE tbdartra * TABLE CHCLIM * TABLE Ö0Ïmattr TABSORT cfin tcfin cflu cfluco =
+SOLVVFÌ16ÍMoDARCY * MMODEL ChPSour * CHPOINT matk / MATRIK SMTR * CHPOINT cini * CHPOINT Mctot * MCHAML Mdiff * MCHAML Difftot * CHPOINT RESID * CHPOINT TetaDiff * FLOTTANT QFACE / CHPOINT nomespec * LISTMOTS nbespece * ENTIER nbsource * ENTIER TABRES * TABLE CHCLIM * TABLE NOUVMAT * LOGIQUE LCONV * LOGIQUE CHTR * LOGIQUE Ö0Ïmatk TABSORT cfin cflu cfluco RESI =
+TENSIONÌ16ÍTABETAP Ö0ÏTABETAP =
+THERMICÌ16ÍÖ0ÏETAB =
+TOPOFILTÌ16Ítab0 * TABLE Ö0Ï=
+TOPOMATEÌ16Ímod0 * MMODEL mat0 * MCHAML dens0 * MCHAML Ö0Ïmat1 =
+TRAC3DÌ16ÍZMAIL *MAILLAGE ZCHPU *CHPOINT ZAM *FLOTTANT ZANGL *FLOTTANT ZM *ENTIER ZN *ENTIER ZXVISU *FLOTTANT ZYVISU *FLOTTANT ZZVISU *FLOTTANT ZINTER *LOGIQUE Ö0Ï=
+TRAC3D_2Ì16ÍZZMAIL / MAILLAGE ZZCHPU1 / CHPOINT ZZCHPU2 / MCHAML MODL0 / MMODEL ZANGL * FLOTTANT ZM * ENTIER ZN * ENTIER Ö0ÏTAB1 =
+TRACHISÌ16ÍTAB2 * TABLE NOMT * MOT LIGNE * MAILLAGE LIINDT / LISTENTI LIT / LISTREEL LICOMP / LISTMOTS LICOMP2 / LISTMOTS TNOMCOMP / TABLE Ö0ÏTBR =
+TRACHITÌ16ÍTAB2 * TABLE NOMT * MOT LIGNE * MAILLAGE LIINDT / LISTENTI LIT / LISTREEL LICOMP / LISTMOTS TNOMCOMP / TABLE TNOMPT / TABLE Ö0ÏTBR =
+TRACTUFIÌ16ÍETAB * TABLE Ö0ÏMP CM KF =
+TRADUIREÌ16ÍOBJ_SOL /SOLUTION OBJ_TAB /TABLE Ö0ÏTTRAD =
+TRANSGENÌ16ÍTRANSI * TABLE Ö0Ï=
+TRANSIT2Ì16ÍETAB * TABLE Ö0ÏETAB =
+TRANSLINÌ16ÍPRECED * TABLE Ö0ÏSTAB =
+TRANSNONÌ16ÍPRECED * TABLE Ö0ÏSTAB =
+TRCÌ16ÍMODTHE * MMODEL MATPHAS * MCHAML TPHASE * TABLE TINI *FLOTTANT TFIN *FLOTTANT LISTREF *LISTREEL Ö0Ï=
+TRTRAJECÌ16ÍUUUU * TABLE Ö0ÏCROB =
+T_IPOLÌ16Ít *FLOTTANT rxt *TABLE Ö0Ï=
+T_PITETAÌ16ÍTABMOD * TABLE MATERI * MCHAML SUPTAB * TABLE Ö0ÏSUPTAB =
+UNPASÌ16ÍPRECED * TABLE Ö0ÏSTAB12 =
+UPDAEFMHÌ16ÍMoDARCY * MMODEL Porosite * CHPOINT MateDiff * CHPOINT Diffdisp * CHPOINT ChPSour * CHPOINT Cini * CHPOINT Tcini * CHPOINT Deltat * FLOTTANT Qface / CHPOINT nomespec * LISTMOTS nbespece * ENTIER nbsource * ENTIER LMLump * LOGIQUE DECENTR * LOGIQUE massEFMH * RIGIDITE mattr / MATRIK mattm / RIGIDITE Tbdartra * TABLE TABMODI * TABLE CHCLIM * TABLE Ö0ÏSMTr MatrTr TbDarTra MassEFMH =
+UPDAVFÌ16ÍMoDARCY * MMODEL Porosite * CHPOINT Matediff * CHPOINT Diffdisp * CHPOINT ChPSour * CHPOINT Deltat * FLOTTANT Cini * CHPOINT TetaDiff * FLOTTANT TetaConv * FLOTTANT Qface / CHPOINT nomespec * LISTMOTS nbespece * ENTIER nbsource * ENTIER mattr * MATRIK JACO * MATRIK MPOR2 * MATRIK MCHAMT * MCHAML MCHAMT1 * MCHAML TABMODI * TABLE CHCLIM * TABLE LCONV * LOGIQUE Ö0ÏRESI Matot Difftot MCHAMT MCHAMT1 NOUVMAT =
+VALSPEÌ16ÍNNORO * LISTREEL NNORR * FLOTTANT DELTT * FLOTTANT Ö0ÏSPECT =
+VAPDIFÌ16ÍPM *FLOTTANT TM *CHPOINT YV *CHPOINT YH2 *CHPOINT YHE *CHPOINT YO2 *CHPOINT YN2 *CHPOINT YCO2 *CHPOINT YCO *CHPOINT Ö0Ï=
+VARIHCÌ16ÍTAB2 * TABLE Ö0ÏMATR1 =
+VARIHCSUÌ16ÍTAB2 * TABLE Ö0ÏMATR1 =
+VERTYTABÌ16ÍÖ0Ï=
+VITETFORÌ16ÍMTA * TABLE ETAB12 * TABLE FCORU * CHPOINT Ö0ÏVADD FADD =
+VITEUNILÌ16ÍROP * RIGIDITE M * RIGIDITE V * CHPOINT DX * CHPOINT DEPINI * CHPOINT H * FLOTTANT RESI * CHPOINT PRECED * TABLE Ö0ÏVAUX =
+VNIMPÌ16ÍÖ0Ï=
+VTIMPÌ16ÍÖ0Ï=
+WEIBULLÌ16ÍZSIG *MCHAML ZOBMO *MMODEL ZV0 *FLOTTANT ZSIGU *FLOTTANT ZSIG0 *FLOTTANT ZXN *FLOTTANT Ö0ÏZXP ZSIGF =
+ZIGZAGÌ16ÍÖ0ÏGEO1 =
+ZONFISÌ16ÍTAB1 *TABLE PHA /ENTIER PBA /ENTIER NHA /ENTIER NBA /ENTIER HAU /FLOTTANT BAS /FLOTTANT GAU /FLOTTANT DRO /FLOTTANT ALPHA /FLOTTANT Ö0Ï=
+asparamÌ16Írxt *TABLE Ö0Ï=
+brocheÌ16ÍKAS * MOT nab * ENTIER rxt * TABLE Ö0Ï=
+brucheÌ16ÍKAS * MOT nab * ENTIER rxt * TABLE Ö0Ï=
+chartherÌ16ÍPRECED * TABLE tt * FLOTTANT Ö0Ï=
+cormasseÌ16ÍGAZ * MOT Rmzn * FLOTTANT Mdrvap * MOT Ö0Ï=
+fdensÌ16Ítpar *table xi *flottant Ö0Ïxdens =
+fiabiliÌ16Ítab *table Ö0Ïtab =
+finvrepaÌ16ÍTPARI *table xi *flottant Ö0ÏINVREP =
+limemecaÌ16Ímod1 * MMODEL tab1 * TABLE tab2 * TABLE mch1 * MCHAML chp1 * CHPOINT chp2 / CHPOINT coeff / FLOTTANT Ö0Ïlok colim1 chdlim1 chrlim1 =
+mailstruÌ16Íco * MAILLAGE dd * FLOTTANT Ö0Ïres =
+natafÌ16Ítab1 *table Ö0Ï=
+repartÌ16ÍTPARI *table xi *flottant Ö0ÏREP =
+retsatÌ16ÍÖ0Ï=
+rvsatÌ16ÍÖ0Ïrvs rvp =
+rvst2Ì16ÍÖ0Ïrvs rvp =
+tracmecaÌ16Ímod1 * MMODEL tab1 * TABLE tab2 * TABLE coeff / FLOTTANT Ö0Ïtab3 =
\ No newline at end of file
diff --git a/scintilla/Makefile.am b/scintilla/Makefile.am
index a5b7e962..62e2619e 100644
--- a/scintilla/Makefile.am
+++ b/scintilla/Makefile.am
@@ -47,7 +47,8 @@ lexers/LexTCL.cxx \
 lexers/LexTxt2tags.cxx \
 lexers/LexVHDL.cxx \
 lexers/LexVerilog.cxx \
-lexers/LexYAML.cxx
+lexers/LexYAML.cxx \
+lexers/LexGIBIANE.cxx
 
 SRCS= \
 gtk/Converter.h \
diff --git a/scintilla/include/SciLexer.h b/scintilla/include/SciLexer.h
index ae20985c..5dbe4e65 100644
--- a/scintilla/include/SciLexer.h
+++ b/scintilla/include/SciLexer.h
@@ -140,6 +140,7 @@
 #define SCLEX_SAS 125
 #define SCLEX_NIM 126
 #define SCLEX_CIL 127
+#define SCLEX_GIBIANE 128
 #define SCLEX_LPEG 999
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
@@ -1886,6 +1887,19 @@
 #define SCE_CIL_OPERATOR 8
 #define SCE_CIL_IDENTIFIER 9
 #define SCE_CIL_STRINGEOL 10
+#define SCE_GIBIANE_DEFAULT 0
+#define SCE_GIBIANE_COMMENT 1
+#define SCE_GIBIANE_STRING 2
+#define SCE_GIBIANE_NUMBER 3
+#define SCE_GIBIANE_TABLE 4
+#define SCE_GIBIANE_WORD 5
+#define SCE_GIBIANE_WORD2 6
+#define SCE_GIBIANE_WORD3 7
+#define SCE_GIBIANE_WORD4 8
+#define SCE_GIBIANE_WORD5 9
+#define SCE_GIBIANE_WORD6 10
+#define SCE_GIBIANE_WORD7 11
+#define SCE_GIBIANE_WORD8 12
 /* --Autogenerated -- end of section automatically generated from Scintilla.iface */
 
 #endif
diff --git a/scintilla/include/Scintilla.iface b/scintilla/include/Scintilla.iface
index c009371c..3b5bafaa 100644
--- a/scintilla/include/Scintilla.iface
+++ b/scintilla/include/Scintilla.iface
@@ -2976,6 +2976,7 @@ val SCLEX_STATA=124
 val SCLEX_SAS=125
 val SCLEX_NIM=126
 val SCLEX_CIL=127
+val SCLEX_GIBIANE=128
 val SCLEX_LPEG=999
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
@@ -4930,7 +4931,7 @@ val SCE_SAS_MACRO_KEYWORD=12
 val SCE_SAS_BLOCK_KEYWORD=13
 val SCE_SAS_MACRO_FUNCTION=14
 val SCE_SAS_STATEMENT=15
-# Lexical states for SCLEX_NIM 
+# Lexical states for SCLEX_NIM
 lex Nim=SCLEX_NIM SCE_NIM_
 val SCE_NIM_DEFAULT=0
 val SCE_NIM_COMMENT=1
@@ -4962,6 +4963,21 @@ val SCE_CIL_LABEL=7
 val SCE_CIL_OPERATOR=8
 val SCE_CIL_IDENTIFIER=9
 val SCE_CIL_STRINGEOL=10
+# Lexical states for SCLEX_GIBIANE
+lex GIBIANE=SCLEX_GIBIANE SCE_GIBIANE_
+val SCE_GIBIANE_DEFAULT=0
+val SCE_GIBIANE_COMMENT=1
+val SCE_GIBIANE_STRING=2
+val SCE_GIBIANE_NUMBER=3
+val SCE_GIBIANE_TABLE=4
+val SCE_GIBIANE_WORD=5
+val SCE_GIBIANE_WORD2=6
+val SCE_GIBIANE_WORD3=7
+val SCE_GIBIANE_WORD4=8
+val SCE_GIBIANE_WORD5=9
+val SCE_GIBIANE_WORD6=10
+val SCE_GIBIANE_WORD7=11
+val SCE_GIBIANE_WORD8=12
 
 # Events
 
diff --git a/scintilla/lexers/LexGIBIANE.cxx b/scintilla/lexers/LexGIBIANE.cxx
new file mode 100644
index 00000000..18a9a1dd
--- /dev/null
+++ b/scintilla/lexers/LexGIBIANE.cxx
@@ -0,0 +1,376 @@
+/* Scintilla source code edit control
+ * @file LexGIBIANE.cxx
+ * Lexer for GIBIANE.
+ *
+ * Copyright 2019 Thibault Lindecker (Communication & Systemes) - thibault.lindecker@c-s.fr
+ * The License.txt file describes the conditions under which this software may be distributed. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "ILexer.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#include "WordList.h"
+#include "LexAccessor.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "CharacterSet.h"
+#include "LexerModule.h"
+
+using namespace Scintilla;
+
+class Is_ {
+    private:
+        static bool ret;
+        bool parenthesis(char c);
+        bool equal(char c);
+        bool digit(char c);
+    public:
+        Is_();
+        bool lineend(char c);
+        bool blanck(char c);
+        bool ANumber(char c, char cPrev, char cNext);
+        bool SPECIAL(char c);
+        bool quote(char c);
+        bool semicolon(char c);
+};
+Is_::Is_(void){}
+bool Is_::ret = false;
+bool Is_::blanck(char c) {
+    return ((c == ' ') || (c == 0x09) || (c == 0x0b));
+}
+bool Is_::lineend(char c) {
+    return ((c == '\n') || (c == '\r'));
+}
+bool Is_::semicolon(char c) {
+    return (c == ';');
+}
+bool Is_::parenthesis(char c) {
+    return c == '(' || c == ')';
+}
+bool Is_::equal(char c) {
+    return c == '=';
+}
+bool Is_::digit(char c) {
+    return IsADigit(c);
+}
+bool Is_::quote(char c) {
+    return (c == '\'');
+}
+bool Is_::SPECIAL(char c){
+    return (blanck(c) || lineend(c) || semicolon(c) || parenthesis(c) || equal(c));
+}
+bool Is_::ANumber(char c, char cPrev, char cNext) {
+    if (digit(c) || (c == '.' && digit(cNext))) {
+        if(cPrev == '.' || (digit(cPrev) && ret) || SPECIAL(cPrev)){
+            if(cNext == '.' || digit(cNext) || SPECIAL(cNext)){
+                ret = true;
+                return ret;
+            }
+        }
+    }
+    ret = false;
+    return ret;
+}
+
+/* Set colorization for GIBIANE language. See the file 'data/filedefs/filetypes.gibiane' */
+static void ColouriseGIBIANEDoc(Sci_PositionU startPos, Sci_Position length, int initStyle,
+           WordList *keywordlists[], Accessor &styler) {
+
+  Is_ Is;
+  WordList &keywords  = *keywordlists[0];
+  WordList &keywords2 = *keywordlists[1];
+  WordList &keywords3 = *keywordlists[2];
+  WordList &keywords4 = *keywordlists[3];
+  WordList &keywords5 = *keywordlists[4];
+  WordList &keywords6 = *keywordlists[5];
+  WordList &keywords7 = *keywordlists[6];
+  WordList &keywords8 = *keywordlists[7];
+  WordList &keywords9 = *keywordlists[8];
+  styler.StartAt(startPos);
+
+  Sci_Position endPos = startPos + length;
+  startPos = styler.LineStart(styler.GetLine(startPos));
+  initStyle = styler.StyleAt(startPos - 1);
+  length = endPos - startPos;
+
+  StyleContext sc(startPos, length, initStyle, styler);
+
+  Sci_Position posLineStart = 0;
+  int numNonBlank = 0, prevState = 0;
+
+  for (; sc.More(); sc.Forward()) {
+
+        char s[100];
+        sc.GetCurrentLowered(s, sizeof(s));
+        char ch = s[0];
+        char *s2 = &s[1];
+
+    if (sc.state == SCE_GIBIANE_COMMENT) {
+      if (sc.atLineEnd) {
+        sc.SetState(SCE_GIBIANE_DEFAULT);
+        sc.ChangeState(SCE_GIBIANE_DEFAULT);
+      }
+    } else if (sc.state == SCE_GIBIANE_STRING) {
+      if (sc.ch == '\'') {
+       /* In GIBIANE, we can protect operator with apostrophe.
+        * So we have to check for operator now. */
+        if ( keywords.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        }
+        else if ( keywords2.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD2);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords3.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD3);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords4.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD4);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords5.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD5);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords6.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD6);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords7.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD7);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords8.InList(s2) ) {
+            sc.Forward();
+            sc.ChangeState(SCE_GIBIANE_WORD8);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        }
+        else{
+            sc.ForwardSetState(SCE_GIBIANE_DEFAULT);
+        }
+      }
+    }
+    else if (sc.state == SCE_GIBIANE_NUMBER) {
+      sc.SetState(SCE_GIBIANE_DEFAULT);
+    }
+    else if (Is.SPECIAL(ch)) {
+      sc.SetState(SCE_GIBIANE_DEFAULT);
+    }
+
+    if (sc.state == SCE_GIBIANE_DEFAULT) {
+
+      /* In GIBIANE, comments line start with '*'. */
+      if (sc.ch == '*' && (Is.lineend(sc.chPrev) || sc.currentPos == startPos)) {
+        sc.SetState(SCE_GIBIANE_COMMENT);
+      } else if (sc.ch == '\'') {
+        sc.SetState(SCE_GIBIANE_STRING);
+      }
+      else if (Is.ANumber(sc.ch, sc.chPrev, sc.chNext)) {
+        sc.SetState(SCE_GIBIANE_NUMBER);
+      }
+       /* We check for operator */
+      else if (Is.SPECIAL(sc.ch)) {
+        if ( keywords.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        }
+        else if ( keywords2.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD2);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords3.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD3);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords4.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD4);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords5.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD5);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords6.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD6);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords7.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD7);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else if ( keywords8.InList(s) ) {
+            sc.ChangeState(SCE_GIBIANE_WORD8);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        } else {
+            sc.ChangeState(SCE_GIBIANE_DEFAULT);
+            sc.SetState(SCE_GIBIANE_DEFAULT);
+        }
+      }
+      else if (sc.ch == '.'){
+          sc.ChangeState(SCE_GIBIANE_TABLE);
+          sc.SetState(SCE_GIBIANE_DEFAULT);
+      }
+    }
+
+  }
+  sc.Complete();
+}
+
+/* Set level.
+ * 1) we manage the 'if - else' block :
+ *  SI;
+ *    do something
+ *  SINON;
+ *    do something
+ *  FINSI;
+ * 2) we manage the 'for loop' block :
+ *  REPETER I 10;
+ *    do something
+ *  FIN I;
+ * 3) we manage the 'DEBM' block :
+ *  DEBMETH A;
+ *    do something
+ *  FINMETH B;
+ * 4) we manage the 'DEBP' block :
+ *  DEBPROC myprocedure toto*'TABL';
+ *    do something
+ *  FINPROC titi*'MOTS' tata*'ENTIER'
+ * */
+static void FoldGIBIANEDoc(Sci_PositionU startPos, Sci_Position length, int initStyle,
+            WordList *[], Accessor &styler) {
+  Is_ Is;
+  Sci_PositionU endPos = startPos + length;
+  int levelDeltaNext = 0;
+  Sci_Position lineCurrent = styler.GetLine(startPos);
+  static bool atEOL = false;
+  static bool atEOLPast = atEOL;
+  bool isPrevLine;
+
+  if (lineCurrent > 0) {
+    lineCurrent--;
+    startPos = styler.LineStart(lineCurrent);
+    isPrevLine = true;
+  } else {
+    isPrevLine = false;
+  }
+  char chNext = styler[startPos];
+  int styleNext = styler.StyleAt(startPos);
+  int style = initStyle;
+  Sci_PositionU lastStart = 0;
+  int visibleChars = 0;
+  int levelCurrent = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+  static bool line_comment = false;
+
+  for (Sci_PositionU i = startPos; i < endPos; i++) {
+
+    char ch = chNext;
+    chNext = styler.SafeGetCharAt(i + 1);
+    int stylePrev = style;
+    style = styleNext;
+    styleNext = styler.StyleAt(i + 1);
+
+    if(stylePrev == SCE_GIBIANE_DEFAULT){
+      lastStart = i;
+    }
+    if( Is.blanck(ch) || Is.lineend(ch) || Is.quote(ch) ){
+      lastStart = i+1;
+    }
+
+    if( (ch == '*' && (atEOLPast || atEOL)) || line_comment ){
+        line_comment = true;
+        lastStart = i+1;
+        visibleChars = 0;
+    }
+
+    if( (Is.SPECIAL(chNext) || Is.quote(chNext)) && !line_comment && style != SCE_GIBIANE_STRING ){
+
+      char s[32];
+      Sci_PositionU k;
+      for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
+          s[k] = static_cast<char>(tolower(styler[lastStart+k]));
+      }
+      s[k] = '\0';
+      int keyword_min_size = ((int)k < 4) ? 4 : (int)k;
+
+      if (strcmp(s, "si") == 0 || strncmp(s, "repeter", keyword_min_size) == 0 ||
+          strncmp(s, "debproc", keyword_min_size) == 0 || strncmp(s, "debmeth", keyword_min_size) == 0){
+
+        levelDeltaNext++;
+
+      }
+      else if(strncmp(s, "finsi", keyword_min_size) == 0 || strcmp(s, "fin") == 0 ||
+              strncmp(s, "finproc", keyword_min_size) == 0 || strncmp(s, "finmeth", keyword_min_size) == 0){
+
+        if(strcmp(s, "fin") == 0){ /* On doit alors verifier que c'est pas un "fin;" mais bien un "fin boucle;"*/
+          char c = 0;
+          Sci_PositionU p;
+          for(p=lastStart+k; p<endPos; p++){
+            c = static_cast<char>(tolower(styler[p]));
+            if(! Is.blanck(c) && ! Is.semicolon(c) && ! Is.quote(c)){ //On n'est pas sur un "fin ;" mais bien un "fin boucle;"
+              levelDeltaNext--;
+              break;
+            }
+            else if(Is.semicolon(c)){
+              break;
+            }
+          }
+        }
+        else{
+          levelDeltaNext--;
+        }
+
+      }
+      else if(strncmp(s, "sinon", keyword_min_size) == 0){
+
+        if(!isPrevLine){
+            levelCurrent--;
+        }
+        levelDeltaNext++;
+
+      }
+
+    }
+
+    atEOLPast = atEOL;
+    atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+    if (atEOL) {
+      int lev = levelCurrent;
+      bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+
+      if (visibleChars == 0 && foldCompact)
+          lev |= SC_FOLDLEVELWHITEFLAG;
+      if ((levelDeltaNext > 0) && (visibleChars > 0))
+          lev |= SC_FOLDLEVELHEADERFLAG;
+      if (lev != styler.LevelAt(lineCurrent))
+          styler.SetLevel(lineCurrent, lev);
+
+      lineCurrent++;
+      levelCurrent += levelDeltaNext;
+      levelDeltaNext = 0;
+      visibleChars = 0;
+      isPrevLine = false;
+      line_comment = false;
+    }
+
+    if (!isspacechar(ch)) visibleChars++;
+  }
+
+}
+
+static const char *const GIBIANEWordLists[] = {
+  "conditional",
+  "test1",
+  "loop",
+  "task",
+  "element",
+  "function1",
+  "function2",
+  "operator",
+  0
+};
+
+LexerModule lmGIBIANE(SCLEX_GIBIANE, ColouriseGIBIANEDoc, "GIBIANE", FoldGIBIANEDoc, GIBIANEWordLists);
diff --git a/scintilla/src/Catalogue.cxx b/scintilla/src/Catalogue.cxx
index 01f20c64..2ffc5dd2 100644
--- a/scintilla/src/Catalogue.cxx
+++ b/scintilla/src/Catalogue.cxx
@@ -118,6 +118,7 @@ int Scintilla_LinkLexers() {
 	LINK_LEXER(lmVHDL);
 	LINK_LEXER(lmXML);
 	LINK_LEXER(lmYAML);
+	LINK_LEXER(lmGIBIANE);
 
 //--Autogenerated -- end of automatically generated section
 
diff --git a/scripts/create_dgibi_tags.sh b/scripts/create_dgibi_tags.sh
new file mode 100755
index 00000000..efc7ec72
--- /dev/null
+++ b/scripts/create_dgibi_tags.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# License: GPL v2 or later
+#
+# Copyright 2019 Thibault Lindecker (Communication & Systemes) - thibault.lindecker@c-s.fr
+#
+# Create a dgibi tags file for Geany from '.procedur' files
+#
+
+CASTEM_VERSION=19
+CASTEM_EXISTE=`which castem${CASTEM_VERSION}`
+if [ $? -ne 0 ] ; then
+  echo "You need to have Cast3M 20${CASTEM_VERSION} developper edition installed to run this script"
+  echo "See http://www-cast3m.cea.fr/index.php"
+  exit 1
+fi
+CASTEM_PROCEDURES="$(dirname ${CASTEM_EXISTE})/../procedur/*"
+if [ $? -ne 0 ] ; then
+  echo "You need to have Cast3M 20${CASTEM_VERSION} developper edition installed to run this script"
+  echo "See http://www-cast3m.cea.fr/index.php"
+  exit 1
+fi
+
+tmpfile="tmp.dgibi.tags"
+tagfile="data/tags/std.dgibi.tags"
+
+# generation du fichier de tags
+geany -g ${tmpfile} ${CASTEM_PROCEDURES}
+
+# On ne garde que les tags des procedures (pas ceux des variables)
+grep -a "=" ${tmpfile} > ${tagfile}
+rm ${tmpfile}
diff --git a/src/editor.c b/src/editor.c
index 620248c4..5990f679 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -832,6 +832,15 @@ static void on_char_added(GeanyEditor *editor, SCNotification *nt)
 			editor_show_calltip(editor, --pos);
 			break;
 		}
+		case ' ':
+		{
+			if(editor->document->file_type->id == GEANY_FILETYPES_GIBIANE){
+				auto_close_chars(sci, pos, nt->ch);
+				/* show calltips */
+				editor_show_calltip(editor, --pos);
+			}
+			break;
+		}
 		case ')':
 		{	/* hide calltips */
 			if (SSM(sci, SCI_CALLTIPACTIVE, 0, 0))
@@ -845,6 +854,21 @@ static void on_char_added(GeanyEditor *editor, SCNotification *nt)
 			calltip.set = FALSE;
 			break;
 		}
+		case ';':
+		{ /* hide calltips */
+			if(editor->document->file_type->id == GEANY_FILETYPES_GIBIANE){
+				if (SSM(sci, SCI_CALLTIPACTIVE, 0, 0))
+				{
+					SSM(sci, SCI_CALLTIPCANCEL, 0, 0);
+				}
+				g_free(calltip.text);
+				calltip.text = NULL;
+				calltip.pos = 0;
+				calltip.sci = NULL;
+				calltip.set = FALSE;
+			}
+			break;
+		}
 		case '{':
 		case '[':
 		case '"':
diff --git a/src/filetypes.c b/src/filetypes.c
index 78af8850..f87755d5 100644
--- a/src/filetypes.c
+++ b/src/filetypes.c
@@ -185,6 +185,7 @@ static void init_builtin_filetypes(void)
 	FT_INIT( COFFEESCRIPT, NONE,       "CoffeeScript",     NULL,                      SOURCE_FILE, SCRIPT   );
 	FT_INIT( GO,         GO,           "Go",               NULL,                      SOURCE_FILE, COMPILED );
 	FT_INIT( ZEPHIR,     ZEPHIR,       "Zephir",           NULL,                      SOURCE_FILE, COMPILED );
+	FT_INIT( GIBIANE,    GIBIANE,      "GIBIANE",          NULL,                      SOURCE_FILE, SCRIPT   );
 }
 
 
diff --git a/src/filetypes.h b/src/filetypes.h
index debd618d..c8783dcd 100644
--- a/src/filetypes.h
+++ b/src/filetypes.h
@@ -105,6 +105,7 @@ typedef enum
 	GEANY_FILETYPES_COFFEESCRIPT,
 	GEANY_FILETYPES_GO,
 	GEANY_FILETYPES_ZEPHIR,
+	GEANY_FILETYPES_GIBIANE,
 	/* ^ append items here */
 	GEANY_MAX_BUILT_IN_FILETYPES	/* Don't use this, use filetypes_array->len instead */
 }
diff --git a/src/highlighting.c b/src/highlighting.c
index 65d15164..0686abf6 100644
--- a/src/highlighting.c
+++ b/src/highlighting.c
@@ -1051,6 +1051,7 @@ void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *co
 		init_styleset_case(XML);
 		init_styleset_case(YAML);
 		init_styleset_case(ZEPHIR);
+		init_styleset_case(GIBIANE);
 		default:
 			if (ft->lexer_filetype)
 				geany_debug("Filetype %s has a recursive lexer_filetype %s set!",
@@ -1139,6 +1140,7 @@ void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
 		styleset_case(XML);
 		styleset_case(YAML);
 		styleset_case(ZEPHIR);
+		styleset_case(GIBIANE);
 		case GEANY_FILETYPES_NONE:
 		default:
 			styleset_default(sci, ft->id);
@@ -1841,6 +1843,10 @@ gboolean highlighting_is_comment_style(gint lexer, gint style)
 		case SCLEX_MARKDOWN:
 			/* there is no comment type in those lexers, listing here just for completeness */
 			return FALSE;
+
+		case SCLEX_GIBIANE:
+			return (style == SCE_GIBIANE_COMMENT);
+
 	}
 	return FALSE;
 }
diff --git a/src/highlightingmappings.h b/src/highlightingmappings.h
index 726ab2e2..4bf74658 100644
--- a/src/highlightingmappings.h
+++ b/src/highlightingmappings.h
@@ -1625,6 +1625,38 @@ static const HLKeyword highlighting_keywords_YAML[] =
 #define highlighting_keywords_ZEPHIR	highlighting_keywords_PHP
 #define highlighting_properties_ZEPHIR	highlighting_properties_PHP
 
+/* GIBIANE */
+#define highlighting_lexer_GIBIANE		SCLEX_GIBIANE
+static const HLStyle highlighting_styles_GIBIANE[] =
+{
+	{ SCE_GIBIANE_DEFAULT,			"default",			FALSE },
+	{ SCE_GIBIANE_COMMENT,			"comment",			FALSE },
+	{ SCE_GIBIANE_STRING,			"string",			FALSE },
+	{ SCE_GIBIANE_NUMBER,			"number",			FALSE },
+	{ SCE_GIBIANE_TABLE,			"table",			FALSE },
+	{ SCE_GIBIANE_WORD,				"word",				FALSE },
+	{ SCE_GIBIANE_WORD2,			"word2",			FALSE },
+	{ SCE_GIBIANE_WORD3,			"word3",			FALSE },
+	{ SCE_GIBIANE_WORD4,			"word4",			FALSE },
+	{ SCE_GIBIANE_WORD5,			"word5",			FALSE },
+	{ SCE_GIBIANE_WORD6,			"word6",			FALSE },
+	{ SCE_GIBIANE_WORD7,			"word7",			FALSE },
+	{ SCE_GIBIANE_WORD8,			"word8",			FALSE }
+};
+
+static const HLKeyword highlighting_keywords_GIBIANE[] =
+{
+	{ 0, "conditional",	FALSE },
+	{ 1, "test1",		FALSE },
+	{ 2, "loop",		FALSE },
+	{ 3, "task",	    FALSE },
+	{ 4, "element",		FALSE },
+	{ 5, "function1",	FALSE },
+	{ 6, "function2",	FALSE },
+	{ 7, "operator",	FALSE }
+};
+#define highlighting_properties_GIBIANE	    EMPTY_PROPERTIES
+
 G_END_DECLS
 
 #endif /* GEANY_HIGHLIGHTING_MAPPINGS_H */
diff --git a/src/symbols.c b/src/symbols.c
index c4d017f1..fb1d8af1 100644
--- a/src/symbols.c
+++ b/src/symbols.c
@@ -1667,7 +1667,7 @@ int symbols_generate_global_tags(int argc, char **argv, gboolean want_preprocess
 		geany_debug("Generating %s tags file.", ft->name);
 		tm_get_workspace();
 		status = tm_workspace_create_global_tags(command, (const char **) (argv + 2),
-												 argc - 2, tags_file, ft->lang);
+												 argc - 2, tags_file, ft->lang, ft->pattern[0]);
 		g_free(command);
 		symbols_finalize(); /* free c_tags_ignore data */
 		if (! status)
diff --git a/src/tagmanager/tm_parser.c b/src/tagmanager/tm_parser.c
index c3fda335..802d5626 100644
--- a/src/tagmanager/tm_parser.c
+++ b/src/tagmanager/tm_parser.c
@@ -511,6 +511,10 @@ static TMParserMapEntry map_POWERSHELL[] = {
 	{'v', tm_tag_variable_t},
 };
 
+static TMParserMapEntry map_GIBIANE[] = {
+	{'p', tm_tag_function_t},
+	{'v', tm_tag_variable_t},
+};
 
 typedef struct
 {
@@ -573,6 +577,7 @@ static TMParserMap parser_map[] = {
 	MAP_ENTRY(JSON),
 	MAP_ENTRY(ZEPHIR),
 	MAP_ENTRY(POWERSHELL),
+	MAP_ENTRY(GIBIANE),
 };
 /* make sure the parser map is consistent and complete */
 G_STATIC_ASSERT(G_N_ELEMENTS(parser_map) == TM_PARSER_COUNT);
diff --git a/src/tagmanager/tm_parser.h b/src/tagmanager/tm_parser.h
index db64a61f..38509e7f 100644
--- a/src/tagmanager/tm_parser.h
+++ b/src/tagmanager/tm_parser.h
@@ -109,6 +109,7 @@ enum
 	TM_PARSER_JSON,
 	TM_PARSER_ZEPHIR,
 	TM_PARSER_POWERSHELL,
+	TM_PARSER_GIBIANE,
 	TM_PARSER_COUNT
 };
 
diff --git a/src/tagmanager/tm_workspace.c b/src/tagmanager/tm_workspace.c
index 6b2ef82f..a66f8567 100644
--- a/src/tagmanager/tm_workspace.c
+++ b/src/tagmanager/tm_workspace.c
@@ -576,12 +576,15 @@ static gchar *pre_process_file(const gchar *cmd, const gchar *inf)
  @return TRUE on success, FALSE on failure.
 */
 gboolean tm_workspace_create_global_tags(const char *pre_process, const char **includes,
-	int includes_count, const char *tags_file, TMParserType lang)
+	int includes_count, const char *tags_file, TMParserType lang, gchar *pattern0)
 {
 	gboolean ret = FALSE;
 	TMSourceFile *source_file;
 	GList *includes_files;
-	gchar *temp_file = create_temp_file("tmp_XXXXXX.cpp");
+	GString *filename = g_string_new("tmp_XXXXXX");
+	filename = g_string_append(filename, pattern0+1);
+	gchar *temp_file = create_temp_file(filename->str);
+	g_string_free(filename, TRUE);
 
 	if (!temp_file)
 		return FALSE;
diff --git a/src/tagmanager/tm_workspace.h b/src/tagmanager/tm_workspace.h
index df586911..f8e74b6f 100644
--- a/src/tagmanager/tm_workspace.h
+++ b/src/tagmanager/tm_workspace.h
@@ -51,7 +51,7 @@ const TMWorkspace *tm_get_workspace(void);
 gboolean tm_workspace_load_global_tags(const char *tags_file, TMParserType mode);
 
 gboolean tm_workspace_create_global_tags(const char *pre_process, const char **includes,
-	int includes_count, const char *tags_file, TMParserType lang);
+	int includes_count, const char *tags_file, TMParserType lang, gchar *pattern0);
 
 GPtrArray *tm_workspace_find(const char *name, const char *scope, TMTagType type,
 	TMTagAttrType *attrs, TMParserType lang);
-- 
2.11.0

