play around with Scintilla and Lexilla
This commit is contained in:
		
							
								
								
									
										144
									
								
								3rdparty/lexilla532/lexilla/examples/CheckLexilla/CheckLexilla.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								3rdparty/lexilla532/lexilla/examples/CheckLexilla/CheckLexilla.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,144 @@
 | 
			
		||||
// Lexilla lexer library use example
 | 
			
		||||
/** @file CheckLexilla.c
 | 
			
		||||
 ** Check that Lexilla.h works.
 | 
			
		||||
 **/
 | 
			
		||||
// Copyright 2021 by Neil Hodgson <neilh@scintilla.org>
 | 
			
		||||
// This file is in the public domain.
 | 
			
		||||
// If the public domain is not possible in your location then it can also be used under the same
 | 
			
		||||
// license as Scintilla. https://www.scintilla.org/License.txt
 | 
			
		||||
 | 
			
		||||
/* Build and run
 | 
			
		||||
 | 
			
		||||
    Win32
 | 
			
		||||
gcc CheckLexilla.c -I ../../include -o CheckLexilla
 | 
			
		||||
CheckLexilla
 | 
			
		||||
CheckLexilla ../SimpleLexer/SimpleLexer.dll
 | 
			
		||||
 | 
			
		||||
   Win32 Visual C++
 | 
			
		||||
cl CheckLexilla.c -I ../../include -Fe: CheckLexilla
 | 
			
		||||
CheckLexilla
 | 
			
		||||
CheckLexilla ../SimpleLexer/SimpleLexer.dll
 | 
			
		||||
 | 
			
		||||
    macOS
 | 
			
		||||
clang CheckLexilla.c -I ../../include -o CheckLexilla
 | 
			
		||||
./CheckLexilla
 | 
			
		||||
./CheckLexilla ../SimpleLexer/SimpleLexer.dylib
 | 
			
		||||
 | 
			
		||||
    Linux
 | 
			
		||||
gcc CheckLexilla.c -I ../../include -ldl -o CheckLexilla
 | 
			
		||||
./CheckLexilla
 | 
			
		||||
./CheckLexilla ../SimpleLexer/SimpleLexer.so
 | 
			
		||||
 | 
			
		||||
While principally meant for compilation as C to act as an example of using Lexilla
 | 
			
		||||
from C it can also be built as C++.
 | 
			
		||||
 | 
			
		||||
Warnings are intentionally shown for the deprecated typedef LexerNameFromIDFn when compiled with
 | 
			
		||||
GCC or Clang or as C++.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
#include "ILexer.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "Lexilla.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
using namespace Lexilla;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
typedef FARPROC Function;
 | 
			
		||||
typedef HMODULE Module;
 | 
			
		||||
#else
 | 
			
		||||
typedef void *Function;
 | 
			
		||||
typedef void *Module;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static Function FindSymbol(Module m, const char *symbol) {
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	return GetProcAddress(m, symbol);
 | 
			
		||||
#else
 | 
			
		||||
	return dlsym(m, symbol);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[]) {
 | 
			
		||||
	char szLexillaPath[] = "../../bin/" LEXILLA_LIB LEXILLA_EXTENSION;
 | 
			
		||||
	const char *libPath = szLexillaPath;
 | 
			
		||||
	if (argc > 1) {
 | 
			
		||||
		libPath = argv[1];
 | 
			
		||||
	}
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	Module lexillaLibrary = LoadLibraryA(libPath);
 | 
			
		||||
#else
 | 
			
		||||
	Module lexillaLibrary = dlopen(libPath, RTLD_LAZY);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	printf("Opened %s -> %p.\n", libPath, lexillaLibrary);
 | 
			
		||||
	if (lexillaLibrary) {
 | 
			
		||||
		GetLexerCountFn lexerCount = (GetLexerCountFn)FindSymbol(lexillaLibrary, LEXILLA_GETLEXERCOUNT);
 | 
			
		||||
		if (lexerCount) {
 | 
			
		||||
			int nLexers = lexerCount();
 | 
			
		||||
			printf("There are %d lexers.\n", nLexers);
 | 
			
		||||
			GetLexerNameFn lexerName = (GetLexerNameFn)FindSymbol(lexillaLibrary, LEXILLA_GETLEXERNAME);
 | 
			
		||||
			for (int i = 0; i < nLexers; i++) {
 | 
			
		||||
				char name[100] = "";
 | 
			
		||||
				lexerName(i, name, sizeof(name));
 | 
			
		||||
				printf("%s ", name);
 | 
			
		||||
			}
 | 
			
		||||
			printf("\n");
 | 
			
		||||
 | 
			
		||||
			GetLexerFactoryFn lexerFactory = (GetLexerFactoryFn)FindSymbol(lexillaLibrary, LEXILLA_GETLEXERFACTORY);
 | 
			
		||||
			LexerFactoryFunction lexerFactory4 = lexerFactory(4);	// 4th entry is "as" which is an object lexer so works
 | 
			
		||||
			printf("Lexer factory 4 -> %p.\n", lexerFactory4);
 | 
			
		||||
 | 
			
		||||
			CreateLexerFn lexerCreate = (CreateLexerFn)FindSymbol(lexillaLibrary, LEXILLA_CREATELEXER);
 | 
			
		||||
			ILexer5 *lexerCpp = lexerCreate("cpp");
 | 
			
		||||
			printf("Created cpp lexer -> %p.\n", lexerCpp);
 | 
			
		||||
 | 
			
		||||
			LexerNameFromIDFn lexerNameFromID = (LexerNameFromIDFn)FindSymbol(lexillaLibrary, LEXILLA_LEXERNAMEFROMID);
 | 
			
		||||
			if (lexerNameFromID) {
 | 
			
		||||
				const char *lexerNameCpp = lexerNameFromID(3);	// SCLEX_CPP=3
 | 
			
		||||
				if (lexerNameCpp) {
 | 
			
		||||
					printf("Lexer name 3 -> %s.\n", lexerNameCpp);
 | 
			
		||||
				} else {
 | 
			
		||||
					printf("Lexer name 3 not available.\n");
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				printf("Lexer name from ID not supported.\n");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			GetLibraryPropertyNamesFn libraryProperties = (GetLibraryPropertyNamesFn)FindSymbol(lexillaLibrary, LEXILLA_GETLIBRARYPROPERTYNAMES);
 | 
			
		||||
			if (libraryProperties) {
 | 
			
		||||
				const char *names = libraryProperties();
 | 
			
		||||
				printf("Property names '%s'.\n", names);
 | 
			
		||||
			} else {
 | 
			
		||||
				printf("Property names not supported.\n");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			SetLibraryPropertyFn librarySetProperty = (SetLibraryPropertyFn)FindSymbol(lexillaLibrary, LEXILLA_SETLIBRARYPROPERTY);
 | 
			
		||||
			if (librarySetProperty) {
 | 
			
		||||
				librarySetProperty("key", "value");
 | 
			
		||||
			} else {
 | 
			
		||||
				printf("Set property not supported.\n");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			GetNameSpaceFn libraryNameSpace = (GetLibraryPropertyNamesFn)FindSymbol(lexillaLibrary, LEXILLA_GETNAMESPACE);
 | 
			
		||||
			if (libraryNameSpace) {
 | 
			
		||||
				const char *nameSpace = libraryNameSpace();
 | 
			
		||||
				printf("Name space '%s'.\n", nameSpace);
 | 
			
		||||
			} else {
 | 
			
		||||
				printf("Name space not supported.\n");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								3rdparty/lexilla532/lexilla/examples/CheckLexilla/makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								3rdparty/lexilla532/lexilla/examples/CheckLexilla/makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
.PHONY: all check clean
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I ../../include
 | 
			
		||||
EXE = $(if $(windir),CheckLexilla.exe,CheckLexilla)
 | 
			
		||||
 | 
			
		||||
ifdef windir
 | 
			
		||||
	RM = $(if $(wildcard $(dir $(SHELL))rm.exe), $(dir $(SHELL))rm.exe -f, del /q)
 | 
			
		||||
	CC = gcc
 | 
			
		||||
else
 | 
			
		||||
	LIBS += -ldl
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
all: $(EXE)
 | 
			
		||||
 | 
			
		||||
check: $(EXE)
 | 
			
		||||
	./$(EXE)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	$(RM) $(EXE)
 | 
			
		||||
 | 
			
		||||
$(EXE): *.c
 | 
			
		||||
	$(CC) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $^ $(LIBS) $(LDLIBS) -o $@
 | 
			
		||||
							
								
								
									
										123
									
								
								3rdparty/lexilla532/lexilla/examples/SimpleLexer/SimpleLexer.cxx
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								3rdparty/lexilla532/lexilla/examples/SimpleLexer/SimpleLexer.cxx
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,123 @@
 | 
			
		||||
//  A simple lexer
 | 
			
		||||
/** @file SimpleLexer.cxx
 | 
			
		||||
 ** A lexer that follows the Lexilla protocol to allow it to be used from Lexilla clients like SciTE.
 | 
			
		||||
 ** The lexer applies alternating styles (0,1) to bytes of the text.
 | 
			
		||||
 **/
 | 
			
		||||
// Copyright 2021 by Neil Hodgson <neilh@scintilla.org>
 | 
			
		||||
// This file is in the public domain.
 | 
			
		||||
// If the public domain is not possible in your location then it can also be used under the same
 | 
			
		||||
// license as Scintilla. https://www.scintilla.org/License.txt
 | 
			
		||||
 | 
			
		||||
// Windows/MSVC
 | 
			
		||||
// cl -std:c++17 -EHsc -LD -I ../../../scintilla/include -I ../../include -I ../../lexlib SimpleLexer.cxx ../../lexlib/*.cxx
 | 
			
		||||
 | 
			
		||||
// macOS/clang
 | 
			
		||||
// clang++ -dynamiclib --std=c++17 -I ../../../scintilla/include -I ../../include -I ../../lexlib SimpleLexer.cxx ../../lexlib/*.cxx -o SimpleLexer.dylib
 | 
			
		||||
 | 
			
		||||
// Linux/g++
 | 
			
		||||
// g++ -fPIC -shared --std=c++17 -I ../../../scintilla/include -I ../../include -I ../../lexlib SimpleLexer.cxx ../../lexlib/*.cxx -o SimpleLexer.so
 | 
			
		||||
 | 
			
		||||
/* It can be demonstrated in SciTE like this, substituting the actual shared library location as lexilla.path:
 | 
			
		||||
lexilla.path=.;C:\u\hg\lexilla\examples\SimpleLexer\SimpleLexer.dll
 | 
			
		||||
lexer.*.xx=simple
 | 
			
		||||
style.simple.1=fore:#FF0000
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include <string_view>
 | 
			
		||||
 | 
			
		||||
#include "ILexer.h"
 | 
			
		||||
#include "Scintilla.h"
 | 
			
		||||
#include "SciLexer.h"
 | 
			
		||||
// Lexilla.h should not be included here as it declares statically linked functions without the __declspec( dllexport )
 | 
			
		||||
 | 
			
		||||
#include "WordList.h"
 | 
			
		||||
#include "PropSetSimple.h"
 | 
			
		||||
#include "LexAccessor.h"
 | 
			
		||||
#include "Accessor.h"
 | 
			
		||||
#include "StyleContext.h"
 | 
			
		||||
#include "CharacterSet.h"
 | 
			
		||||
#include "LexerModule.h"
 | 
			
		||||
#include "LexerBase.h"
 | 
			
		||||
 | 
			
		||||
using namespace Scintilla;
 | 
			
		||||
using namespace Lexilla;
 | 
			
		||||
 | 
			
		||||
class LexerSimple : public LexerBase {
 | 
			
		||||
public:
 | 
			
		||||
        LexerSimple() {
 | 
			
		||||
        }
 | 
			
		||||
        void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override {
 | 
			
		||||
                try {
 | 
			
		||||
			Accessor astyler(pAccess, &props);
 | 
			
		||||
			if (length > 0) {
 | 
			
		||||
				astyler.StartAt(startPos);
 | 
			
		||||
				astyler.StartSegment(startPos);
 | 
			
		||||
				for (unsigned int k=0; k<length; k++) {
 | 
			
		||||
					astyler.ColourTo(startPos+k, (startPos+k)%2);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
                        astyler.Flush();
 | 
			
		||||
                } catch (...) {
 | 
			
		||||
                        // Should not throw into caller as may be compiled with different compiler or options
 | 
			
		||||
                        pAccess->SetErrorStatus(SC_STATUS_FAILURE);
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        static ILexer5 *LexerFactorySimple() {
 | 
			
		||||
                try {
 | 
			
		||||
                        return new LexerSimple();
 | 
			
		||||
                } catch (...) {
 | 
			
		||||
                        // Should not throw into caller as may be compiled with different compiler or options
 | 
			
		||||
                        return nullptr;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#define EXPORT_FUNCTION __declspec(dllexport)
 | 
			
		||||
#define CALLING_CONVENTION __stdcall
 | 
			
		||||
#else
 | 
			
		||||
#define EXPORT_FUNCTION __attribute__((visibility("default")))
 | 
			
		||||
#define CALLING_CONVENTION
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static const char *lexerName = "simple";
 | 
			
		||||
 | 
			
		||||
extern "C" {
 | 
			
		||||
 | 
			
		||||
EXPORT_FUNCTION int CALLING_CONVENTION GetLexerCount() {
 | 
			
		||||
        return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_FUNCTION void CALLING_CONVENTION GetLexerName(unsigned int index, char *name, int buflength) {
 | 
			
		||||
        *name = 0;
 | 
			
		||||
        if ((index == 0) && (buflength > static_cast<int>(strlen(lexerName)))) {
 | 
			
		||||
                strcpy(name, lexerName);
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_FUNCTION LexerFactoryFunction CALLING_CONVENTION GetLexerFactory(unsigned int index) {
 | 
			
		||||
        if (index == 0)
 | 
			
		||||
                return LexerSimple::LexerFactorySimple;
 | 
			
		||||
        else
 | 
			
		||||
                return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_FUNCTION Scintilla::ILexer5* CALLING_CONVENTION CreateLexer(const char *name) {
 | 
			
		||||
	if (0 == strcmp(name, lexerName)) {
 | 
			
		||||
		return LexerSimple::LexerFactorySimple();
 | 
			
		||||
	}
 | 
			
		||||
	return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_FUNCTION const char * CALLING_CONVENTION GetNameSpace() {
 | 
			
		||||
	return "example";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								3rdparty/lexilla532/lexilla/examples/SimpleLexer/makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								3rdparty/lexilla532/lexilla/examples/SimpleLexer/makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
.PHONY: all check clean
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I ../../../scintilla/include -I ../../include -I ../../lexlib
 | 
			
		||||
 | 
			
		||||
BASE_FLAGS += --std=c++17 -shared
 | 
			
		||||
 | 
			
		||||
ifdef windir
 | 
			
		||||
    SHAREDEXTENSION = dll
 | 
			
		||||
else
 | 
			
		||||
    ifeq ($(shell uname),Darwin)
 | 
			
		||||
        SHAREDEXTENSION = dylib
 | 
			
		||||
        BASE_FLAGS += -dynamiclib -arch arm64 -arch x86_64
 | 
			
		||||
    else
 | 
			
		||||
        BASE_FLAGS += -fPIC
 | 
			
		||||
        SHAREDEXTENSION = so
 | 
			
		||||
    endif
 | 
			
		||||
    BASE_FLAGS += -fvisibility=hidden
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef windir
 | 
			
		||||
	RM = $(if $(wildcard $(dir $(SHELL))rm.exe), $(dir $(SHELL))rm.exe -f, del /q)
 | 
			
		||||
	CXX = g++
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
LIBRARY = SimpleLexer.$(SHAREDEXTENSION)
 | 
			
		||||
LEXLIB = ../../lexlib/*.cxx
 | 
			
		||||
 | 
			
		||||
all: $(LIBRARY)
 | 
			
		||||
 | 
			
		||||
# make check requires CheckLexilla to have already been built
 | 
			
		||||
check: $(LIBRARY)
 | 
			
		||||
	../CheckLexilla/CheckLexilla ./$(LIBRARY)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	$(RM) *.o *obj *.lib *.exp $(LIBRARY)
 | 
			
		||||
 | 
			
		||||
$(LIBRARY): *.cxx
 | 
			
		||||
	$(CXX) $(INCLUDES) $(BASE_FLAGS) $(CPPFLAGS) $(CXXFLAGS) $^ $(LEXLIB) $(LIBS) $(LDLIBS) -o $@
 | 
			
		||||
		Reference in New Issue
	
	Block a user