specifying the filetype in commandline is a good idea, but why not going
further, make gtags read file type when read file list ?
and I attached a patch, which will guess file type using libmagic
On Mon, Feb 20, 2017 at 3:16 PM Shigio YAMAGUCHI <[email protected]> wrote:
> Hi,
> > Hi,
> > There, what about adding file-type guessing when the source file does
> not have a suffix?
> >
> > Currently when the file doesnot have a suffix, gnu global wont parse it,
> > this is a problem when perl/python ... files. and gtags cant specify
> lang-type on command-line.
>
> You are right.
> Currently, we have a plan to do the following:
> http://lists.gnu.org/archive/html/bug-global/2016-10/msg00003.html
>
> Does this specification fulfill your requirements?
>
> Regards,
> Shigio
>
>
> 2017-02-20 15:45 GMT+09:00 Jun Sheng <[email protected]>:
>
> Hi,
> There, what about adding file-type guessing when the source file does not
> have a suffix?
>
> Currently when the file doesnot have a suffix, gnu global wont parse it,
> this is a problem when perl/python ... files. and gtags cant specify
> lang-type on command-line.
>
>
> _______________________________________________
> Bug-global mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/bug-global
>
>
>
>
> --
> Shigio YAMAGUCHI <[email protected]>
> PGP fingerprint: D1CB 0B89 B346 4AB6 5663 C4B6 3CA5 BBB3 57BE DDA3
>
diff -aur a/global-6.5.5/global/Makefile.in global-6.5.5/global/Makefile.in
--- a/global-6.5.5/global/Makefile.in 2016-09-21 12:54:30.000000000 +0800
+++ global-6.5.5/global/Makefile.in 2017-02-20 20:56:00.069969143 +0800
@@ -258,7 +258,7 @@
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
LIBLTDL = @LIBLTDL@
LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lmagic
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
diff -aur a/global-6.5.5/gozilla/Makefile.in global-6.5.5/gozilla/Makefile.in
--- a/global-6.5.5/gozilla/Makefile.in 2016-09-21 12:54:30.000000000 +0800
+++ global-6.5.5/gozilla/Makefile.in 2017-02-20 20:56:41.613301655 +0800
@@ -254,7 +254,7 @@
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
LIBLTDL = @LIBLTDL@
LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lmagic
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
diff -aur a/global-6.5.5/gtags/Makefile.in global-6.5.5/gtags/Makefile.in
--- a/global-6.5.5/gtags/Makefile.in 2016-09-21 12:54:30.000000000 +0800
+++ global-6.5.5/gtags/Makefile.in 2017-02-20 20:57:08.156634461 +0800
@@ -254,7 +254,7 @@
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
LIBLTDL = @LIBLTDL@
LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lmagic
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
diff -aur a/global-6.5.5/htags/Makefile.in global-6.5.5/htags/Makefile.in
--- a/global-6.5.5/htags/Makefile.in 2016-09-21 12:54:30.000000000 +0800
+++ global-6.5.5/htags/Makefile.in 2017-02-20 20:58:01.319966741 +0800
@@ -265,7 +265,7 @@
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
LIBLTDL = @LIBLTDL@
LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lmagic
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
diff -aur a/global-6.5.5/libparser/parser.c global-6.5.5/libparser/parser.c
--- a/global-6.5.5/libparser/parser.c 2016-09-21 12:54:13.000000000 +0800
+++ global-6.5.5/libparser/parser.c 2017-02-21 09:20:20.629995132 +0800
@@ -413,21 +413,16 @@
const struct lang_entry *ent;
struct parser_param param;
- /* get suffix of the path. */
- suffix = locatestring(path, ".", MATCH_LAST);
- if (suffix == NULL)
- return;
- lang = decide_lang(suffix);
+ lang = guess_and_decide_lang(path, flags & PARSER_EXPLAIN);
if (lang == NULL)
return;
+
/*
* Select parser.
* If lang == NULL then default parser is selected.
*/
ent = get_lang_entry(lang);
if (flags & PARSER_EXPLAIN) {
- fprintf(stderr, " - File '%s' is handled as follows:\n", trimpath(path));
- fprintf(stderr, "\tsuffix: |%s|\n", suffix);
fprintf(stderr, "\tlanguage: |%s|\n", lang);
fprintf(stderr, "\tparser: |%s|\n", ent->parser_name);
fprintf(stderr, "\tlibrary: |%s|\n", ent->lt_dl_name ? ent->lt_dl_name : "builtin library");
diff -aur a/global-6.5.5/libutil/find.c global-6.5.5/libutil/find.c
--- a/global-6.5.5/libutil/find.c 2016-09-21 12:54:13.000000000 +0800
+++ global-6.5.5/libutil/find.c 2017-02-20 21:52:55.269901465 +0800
@@ -409,7 +409,7 @@
}
if (regexec(suff, path, 0, 0, 0) == 0)
return 1;
- return 0;
+ return 1;
}
/**
* skipthisfile: check whether or not we accept this file.
diff -aur a/global-6.5.5/libutil/langmap.c global-6.5.5/libutil/langmap.c
--- a/global-6.5.5/libutil/langmap.c 2016-09-21 12:54:14.000000000 +0800
+++ global-6.5.5/libutil/langmap.c 2017-02-21 09:24:52.793323072 +0800
@@ -30,6 +30,8 @@
#include <strings.h>
#endif
+#include <magic.h>
+
#include "checkalloc.h"
#include "die.h"
#include "locatestring.h"
@@ -39,6 +41,8 @@
#include "langmap.h"
#include "varray.h"
+
+
static void trim_suffix_list(STRBUF *, STRHASH *);
static int match_suffix_list(const char *, const char *);
@@ -202,6 +206,57 @@
return strbuf_value(sb);
}
+
+magic_t magic_cookie = NULL;
+
+static int
+init_libmagic() {
+ if (! magic_cookie) {
+ magic_cookie = magic_open(MAGIC_MIME_TYPE);
+ }
+ if (! magic_cookie)
+ return 0;
+ magic_load(magic_cookie, NULL);
+ return 1;
+};
+const char *
+guess_and_decide_lang(const char *path, int flags)
+{
+ const char* suffix, *lang;
+ char buf[32];
+ int can_guess = 0;
+ can_guess = init_libmagic();
+ if (flags)
+ fprintf(stderr, " - File '%s' is handled as follows:\n", path);
+
+ suffix = locatestring(path, ".", MATCH_LAST);
+ if ( locatestring(suffix + 1, "/", MATCH_FIRST))
+ suffix = NULL;
+ if (suffix == NULL) {
+ if (can_guess) {
+ suffix = magic_file(magic_cookie, path);
+ if (suffix){
+ if (flags) {
+ fprintf(stderr, "\tmimetype: %s\n", suffix);
+ }
+ suffix = locatestring(suffix, "/", MATCH_LAST);
+ strncpy(buf, suffix, 32);
+ buf[0] = '.';
+ suffix = buf;
+ }
+ }
+ }
+ if (! suffix)
+ return NULL;
+ if(flags)
+ fprintf(stderr, "\tsuffix: |%s|\n", suffix);
+ lang = decide_lang(suffix);
+ if (lang == NULL)
+ return NULL;
+ return lang;
+}
+
+
/**
* decide language of the suffix.
*
diff -aur a/global-6.5.5/plugin-factory/pygments_parser.py.in global-6.5.5/plugin-factory/pygments_parser.py.in
--- a/global-6.5.5/plugin-factory/pygments_parser.py.in 2016-09-21 12:54:14.000000000 +0800
+++ global-6.5.5/plugin-factory/pygments_parser.py.in 2017-02-21 08:41:56.773260769 +0800
@@ -27,6 +27,8 @@
import pygments.lexers
from pygments.token import Token
+import magic
+
EXUBERANT_CTAGS = "@EXUBERANT_CTAGS@"
# In most cases, lexers can be looked up with lowercase form of formal
@@ -111,6 +113,9 @@
def get_lexer_by_langmap(self, path):
ext = os.path.splitext(path)[1]
+ if ext == "":
+ mm = magic.from_file(path, mime=True)
+ ext = "." + mm.split("/")[1]
lang = self.langmap[ext]
if lang:
name = lang.lower()
--- a/global-6.5.5/libutil/langmap.h.in 2016-09-21 12:54:14.000000000 +0800
+++ global-6.5.5/libutil/langmap.h.in 2017-02-21 09:36:29.419975935 +0800
@@ -31,5 +31,5 @@
const char *trim_langmap(const char *);
const char *decide_lang(const char *);
void make_suffixes(const char *, STRBUF *);
-
+const char *guess_and_decide_lang(const char *, int);
#endif
_______________________________________________
Bug-global mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-global