1 | // Lexilla lexer library |
2 | /** @file Lexilla.h |
3 | ** Lexilla definitions for dynamic and static linking. |
4 | ** For C++, more features and type safety are available with the LexillaAccess module. |
5 | **/ |
6 | // Copyright 2020 by Neil Hodgson <neilh@scintilla.org> |
7 | // The License.txt file describes the conditions under which this software may be distributed. |
8 | |
9 | #ifndef LEXILLA_H |
10 | #define LEXILLA_H |
11 | |
12 | // Define the default Lexilla shared library name for each platform |
13 | #if _WIN32 |
14 | #define LEXILLA_LIB "unioncode-lexilla" |
15 | #define LEXILLA_EXTENSION ".dll" |
16 | #else |
17 | #define LEXILLA_LIB "libunioncode-lexilla" |
18 | #if defined(__APPLE__) |
19 | #define LEXILLA_EXTENSION ".dylib" |
20 | #else |
21 | #define LEXILLA_EXTENSION ".so" |
22 | #endif |
23 | #endif |
24 | |
25 | // On Win32 use the stdcall calling convention otherwise use the standard calling convention |
26 | #if _WIN32 |
27 | #define LEXILLA_CALL __stdcall |
28 | #else |
29 | #define LEXILLA_CALL |
30 | #endif |
31 | |
32 | #if defined(__OBJC2__) |
33 | // Objective C(++) treats '[' as a message expression. |
34 | #define DEPRECATE_DEFINITION |
35 | #elif defined(__cplusplus) |
36 | #define DEPRECATE_DEFINITION [[deprecated]] |
37 | #elif defined(__GNUC__) || defined(__clang__) |
38 | #define DEPRECATE_DEFINITION __attribute__((deprecated)) |
39 | #else |
40 | // MSVC __declspec(deprecated) has different positioning rules to GCC so define to nothing |
41 | #define DEPRECATE_DEFINITION |
42 | #endif |
43 | |
44 | #ifdef __cplusplus |
45 | // Must have already included ILexer.h to have Scintilla::ILexer5 defined. |
46 | using Scintilla::ILexer5; |
47 | #else |
48 | typedef void ILexer5; |
49 | #endif |
50 | |
51 | typedef ILexer5 *(*LexerFactoryFunction)(); |
52 | |
53 | #ifdef __cplusplus |
54 | namespace Lexilla { |
55 | #endif |
56 | |
57 | typedef int (LEXILLA_CALL *GetLexerCountFn)(); |
58 | typedef void (LEXILLA_CALL *GetLexerNameFn)(unsigned int Index, char *name, int buflength); |
59 | typedef LexerFactoryFunction(LEXILLA_CALL *GetLexerFactoryFn)(unsigned int Index); |
60 | typedef ILexer5*(LEXILLA_CALL *CreateLexerFn)(const char *name); |
61 | typedef const char *(LEXILLA_CALL *LexerNameFromIDFn)(int identifier); |
62 | typedef const char *(LEXILLA_CALL *GetLibraryPropertyNamesFn)(); |
63 | typedef void(LEXILLA_CALL *SetLibraryPropertyFn)(const char *key, const char *value); |
64 | typedef const char *(LEXILLA_CALL *GetNameSpaceFn)(); |
65 | |
66 | #ifdef __cplusplus |
67 | } |
68 | #endif |
69 | |
70 | #define LEXILLA_NAMESPACE_SEPARATOR '.' |
71 | |
72 | #define LEXILLA_GETLEXERCOUNT "GetLexerCount" |
73 | #define LEXILLA_GETLEXERNAME "GetLexerName" |
74 | #define LEXILLA_GETLEXERFACTORY "GetLexerFactory" |
75 | #define LEXILLA_CREATELEXER "CreateLexer" |
76 | #define LEXILLA_LEXERNAMEFROMID "LexerNameFromID" |
77 | #define LEXILLA_GETLIBRARYPROPERTYNAMES "GetLibraryPropertyNames" |
78 | #define LEXILLA_SETLIBRARYPROPERTY "SetLibraryProperty" |
79 | #define LEXILLA_GETNAMESPACE "GetNameSpace" |
80 | |
81 | // Static linking prototypes |
82 | |
83 | #ifdef __cplusplus |
84 | extern "C" { |
85 | #endif |
86 | |
87 | ILexer5 * LEXILLA_CALL CreateLexer(const char *name); |
88 | int LEXILLA_CALL GetLexerCount(); |
89 | void LEXILLA_CALL GetLexerName(unsigned int index, char *name, int buflength); |
90 | LexerFactoryFunction LEXILLA_CALL GetLexerFactory(unsigned int index); |
91 | DEPRECATE_DEFINITION const char *LEXILLA_CALL LexerNameFromID(int identifier); |
92 | const char * LEXILLA_CALL GetLibraryPropertyNames(); |
93 | void LEXILLA_CALL SetLibraryProperty(const char *key, const char *value); |
94 | const char *LEXILLA_CALL GetNameSpace(); |
95 | |
96 | #ifdef __cplusplus |
97 | } |
98 | #endif |
99 | |
100 | #ifdef __cplusplus |
101 | namespace Lexilla { |
102 | class LexerModule; |
103 | } |
104 | // Add a static lexer (in the same binary) to Lexilla's list |
105 | void AddStaticLexerModule(Lexilla::LexerModule *plm); |
106 | #endif |
107 | |
108 | #endif |
109 | |