135 lines
3.8 KiB
Python
135 lines
3.8 KiB
Python
from cffi import FFI
|
|
import os
|
|
from pathlib import Path
|
|
|
|
ffibuilder = FFI()
|
|
|
|
# cdef() expects a single string declaring the C types, functions and
|
|
# globals needed to use the shared object. It must be in valid C syntax.
|
|
# Taken from java/shared/libenry.h
|
|
ffibuilder.cdef(
|
|
"""
|
|
typedef unsigned char GoUint8;
|
|
typedef long long GoInt64;
|
|
typedef GoInt64 GoInt;
|
|
|
|
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
|
|
typedef _GoString_ GoString;
|
|
|
|
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
|
|
|
|
|
|
extern GoString GetLanguage(GoString p0, GoSlice p1);
|
|
|
|
/* Return type for GetLanguageByContent */
|
|
struct GetLanguageByContent_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByContent_return GetLanguageByContent(GoString p0, GoSlice p1);
|
|
|
|
/* Return type for GetLanguageByEmacsModeline */
|
|
struct GetLanguageByEmacsModeline_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByEmacsModeline_return GetLanguageByEmacsModeline(GoSlice p0);
|
|
|
|
/* Return type for GetLanguageByExtension */
|
|
struct GetLanguageByExtension_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByExtension_return GetLanguageByExtension(GoString p0);
|
|
|
|
/* Return type for GetLanguageByFilename */
|
|
struct GetLanguageByFilename_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByFilename_return GetLanguageByFilename(GoString p0);
|
|
|
|
/* Return type for GetLanguageByModeline */
|
|
struct GetLanguageByModeline_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByModeline_return GetLanguageByModeline(GoSlice p0);
|
|
|
|
/* Return type for GetLanguageByShebang */
|
|
struct GetLanguageByShebang_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByShebang_return GetLanguageByShebang(GoSlice p0);
|
|
|
|
/* Return type for GetLanguageByVimModeline */
|
|
struct GetLanguageByVimModeline_return {
|
|
GoString r0; /* language */
|
|
GoUint8 r1; /* safe */
|
|
};
|
|
|
|
extern struct GetLanguageByVimModeline_return GetLanguageByVimModeline(GoSlice p0);
|
|
|
|
extern void GetLanguageExtensions(GoString p0, GoSlice* p1);
|
|
|
|
extern void GetLanguages(GoString p0, GoSlice p1, GoSlice* p2);
|
|
|
|
extern void GetLanguagesByContent(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByEmacsModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByExtension(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByFilename(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByShebang(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern void GetLanguagesByVimModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3);
|
|
|
|
extern GoString GetMimeType(GoString p0, GoString p1);
|
|
|
|
extern GoUint8 IsBinary(GoSlice p0);
|
|
|
|
extern GoUint8 IsConfiguration(GoString p0);
|
|
|
|
extern GoUint8 IsDocumentation(GoString p0);
|
|
|
|
extern GoUint8 IsDotFile(GoString p0);
|
|
|
|
extern GoUint8 IsImage(GoString p0);
|
|
|
|
extern GoUint8 IsVendor(GoString p0);
|
|
|
|
extern GoUint8 IsGenerated(GoString p0, GoSlice p1);
|
|
|
|
extern GoString GetColor(GoString p0);
|
|
"""
|
|
)
|
|
|
|
# set_source() gives the name of the python extension module to
|
|
# produce, and some C source code as a string. This C code needs
|
|
# to make the declarated functions, types and globals available,
|
|
# so it is often just the "#include".
|
|
lib_dir = Path(__file__).resolve().parent.parent / ".shared"
|
|
lib_header = lib_dir / "libenry.h"
|
|
|
|
ffibuilder.set_source(
|
|
"_c_enry",
|
|
f'#include "{lib_header.absolute()}"',
|
|
libraries=["enry"],
|
|
library_dirs=[str(lib_dir.absolute())],
|
|
) # library name, for the linker
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ffibuilder.compile(verbose=True)
|