SaxonC 13.0.0
Saxon Processor library for C/C++, PHP and Python
Loading...
Searching...
No Matches
SaxonProcessor.h
1
2// Copyright (c) 2022 - 2023 Saxonica Limited.
3// This Source Code Form is subject to the terms of the Mozilla Public License,
4// v. 2.0. If a copy of the MPL was not distributed with this file, You can
5// obtain one at http://mozilla.org/MPL/2.0/. This Source Code Form is
6// "Incompatible With Secondary Licenses", as defined by the Mozilla Public
7// License, v. 2.0.
9
10#ifndef SAXON_PROCESSOR_H
11#define SAXON_PROCESSOR_H
12
13#if defined __linux__ || defined __APPLE__
14
15#include <dlfcn.h>
16#include <stdlib.h>
17#include <string>
18
19#define HANDLE void *
20#define LoadLibrary(x) dlopen(x, RTLD_LAZY)
21#define GetProcAddress(x, y) dlsym(x, y)
22#else
23#include <windows.h>
24#endif
25
26//#define DEBUG //remove
27//#define MEM_DEBUG //remove
28#define CVERSION_API_NO 1210
29
30#include <iostream>
31#include <map>
32#include <sstream>
33#include <stdexcept> // std::logic_error
34#include <string>
35#include <vector>
36
37#include "saxonc_export.h"
38#include "saxonc/DocumentBuilder.h"
39#include "saxonc/SaxonApiException.h"
40#include "saxonc/SaxonCGlue.h"
41#include "saxonc/SaxonCXPath.h"
42#include "saxonc/SchemaValidator.h"
43#include "saxonc/XPathProcessor.h"
44#include "saxonc/XQueryProcessor.h"
45#include "saxonc/Xslt30Processor.h"
46#include "saxonc/UserFunctionHandler.h"
47#include "saxonc/XsltExecutable.h"
48
49
50//#define MEM_DEBUG
51#if defined MEM_DEBUG
52
53#include <algorithm>
54#include <cstdlib>
55#include <new>
56
57static std::vector<void *> myAlloc;
58
59void *newImpl(std::size_t sz, char const *file, int line);
60
61void *operator new(std::size_t sz, char const *file, int line);
62
63void *operator new[](std::size_t sz, char const *file, int line);
64
65void operator delete(void *ptr) noexcept;
66
67void operator delete(void *, std::size_t) noexcept;
68
69#endif
70
71class Xslt30Processor;
72
73class XQueryProcessor;
74
75class XPathProcessor;
76
77class SchemaValidator;
78
79class XsdCompiler;
80
81class XdmValue;
82
83class XdmNode;
84
85class XdmItem;
86
87class XdmAtomicValue;
88
89class XdmFunctionItem;
90
91class XdmArray;
92
93class XdmMap;
94
95class XsltExecutable;
96
97class DocumentBuilder;
98
100
101
102typedef enum eXdmType {
103 XDM_VALUE = 0,
104 XDM_ATOMIC_VALUE = 1,
105 XDM_NODE = 2,
106 XDM_ARRAY = 3,
107 XDM_MAP = 4,
108 XDM_FUNCTION_ITEM = 5,
109 XDM_EMPTY = 6,
110 XDM_ITEM = 7,
111} XDM_TYPE;
112
114 std::string ns;
115 std::string functionName;
116 XdmValue * (*func)(int, XdmValue **);
117 std::string returnTypeStr;
118 std::string arguments;
119 XdmValue * argumentTypes;
120 XdmValue * returnType;
121} ;
122
123
124
125//extern "C" void * c_nativeCall(char * functionName, void * proc, void * func, int useNativeTypes, int numOfArguments, void ** arguments);
126
127
128
129//==========================================
130
137class SAXONC_EXPORT SaxonProcessor {
138
139 friend class DocumentBuilder;
140
141 friend class Xslt30Processor;
142
143 friend class XsltExecutable;
144
145 friend class XQueryProcessor;
146
147 friend class SchemaValidator;
148
149 friend class XsdCompiler;
150
151 friend class XPathProcessor;
152
153 friend class XdmValue;
154
155 friend class XdmItem;
156
157 friend class XdmAtomicValue;
158
159 friend class XdmFunctionItem;
160
161 friend class XdmNode;
162
163 friend class XdmMap;
164
165 friend class XdmArray;
166
167public:
173
175
176
182
183 SaxonProcessor(const char *configFile);
184
191 SaxonProcessor(bool l);
192
199
204 SaxonProcessor(const SaxonProcessor &other);
205
210
217 DocumentBuilder *newDocumentBuilder();
218
225 Xslt30Processor *newXslt30Processor();
226
233 XQueryProcessor *newXQueryProcessor();
234
241 XPathProcessor *newXPathProcessor();
242
254 SchemaValidator *newSchemaValidator();
255
265 XsdCompiler *newXsdCompiler();
266
274 XdmAtomicValue *makeStringValue(std::string str,
275 const char *encoding = nullptr);
276
284 XdmAtomicValue *makeStringValue(const char *str,
285 const char *encoding = nullptr);
286
295 XdmAtomicValue *makeIntegerValue(int i);
296
302 XdmAtomicValue *makeDoubleValue(double d);
303
309 XdmAtomicValue *makeFloatValue(float f);
310
319 XdmAtomicValue *makeLongValue(long l);
320
326 XdmAtomicValue *makeBooleanValue(bool b);
327
333 XdmAtomicValue *makeQNameValue(const char *str);
334
342 XdmAtomicValue *makeAtomicValue(const char *type, const char *value);
343
351 XdmArray *makeArray(char **input, int length);
352
360 XdmArray *makeArray(short *input, int length);
361
369 XdmArray *makeArray(int *input, int length);
370
378 XdmArray *makeArray(long long *input, int length);
379
387 XdmArray *makeArray(bool *input, int length);
388
396 XdmArray *makeArray(XdmValue **values, int length);
397
398
399 static void * makeInternalArray(void **inputs, int length);
400
408 XdmMap *makeMap(std::map<XdmAtomicValue *, XdmValue *> dataMap);
409
417 static XdmMap *makeMap2(std::map<std::string, XdmValue *> dataMap);
418
427 XdmMap *makeMap3(XdmAtomicValue **keys, XdmValue **values, int len);
428
440 const char *clarkNameToEQName(const char *name);
441
449 const char *EQNameToClarkName(const char *name);
450
456 const char *getStringValue(XdmItem *item);
457
469 XdmNode *parseXmlFromString(const char *source,
470 const char *encoding = nullptr,
471 SchemaValidator *validator = nullptr);
472
482 XdmNode *parseXmlFromFile(const char *source,
483 SchemaValidator *validator = nullptr);
484
494 XdmNode *parseXmlFromUri(const char *source,
495 SchemaValidator *validator = nullptr);
496
505 XdmValue *parseJsonFromString(const char *source,
506 const char *encoding = NULL);
507
516 XdmValue *parseJsonFromFile(const char *source);
517
523 int getNodeKind(int64_t obj);
524
531
532
536 XdmValue **createXdmValueArray(int len) { return (new XdmValue *[len]); }
537
544 void deleteXdmValueArray(XdmValue **arr, int len);
545
549 XdmAtomicValue **createXdmAtomicValueArray(int len) {
550 return (new XdmAtomicValue *[len]);
551 }
552
559 void deleteXdmAtomicValueArray(XdmAtomicValue **arr, int len);
560
561
565 static const char * encodeString(const char * stringValue, const char * toCharSetName);
566
570 static void release();
571
575 static void attachCurrentThread();
576
580 static graal_isolatethread_t * getOrAttachCurrentThread(sxnc_environment * sxn);
581
585 static void detachCurrentThread();
586
590 static void attachCurrentThread(sxnc_environment * sxn);
591
595 static void detachCurrentThread(sxnc_environment * sxn);
596
601 void setcwd(const char *cwd);
602
607 const char *getcwd();
608
613 const char *getResourcesDirectory();
614
619 void setResourcesDirectory(const char *dir);
620
627 void setCatalog(const char *catalogFile);
628
635 void setCatalogFiles(const char **catalogFiles, int length);
636
645 void setConfigurationProperty(const char *name, const char *value);
646
650 void clearConfigurationProperties();
651
656 bool isLicensed();
657
665 const char * getSaxonEdition();
666
671 const char *version();
672
673 void registerUserFunction(const char * ns, XdmValue * (*func)(int, XdmValue **), const char * signatureJSON, bool useNativeTypes=false);
674
675 void registerUserFunctionWithProcessor(void * procPtr, const char * ns, void * func, const char * signatureJSON, bool useNativeTypes=false);
676
678
684 /*void addNativeMethod(char *name, char *signature, void *fnPtr) {
685
686 JNINativeMethod method;
687 method.name = name;
688 method.signature = signature;
689 method.fnPtr = fnPtr;
690
691 nativeMethodVect.push_back(method);
692
693
694 }*/
695
697
706 /*bool registerCPPFunction(char *libName, JNINativeMethod *gMethods = nullptr)
707 { if (libName != nullptr) { setConfigurationProperty("extc", libName);
708
709 }
710
711 if (gMethods == nullptr && nativeMethodVect.size() == 0) {
712 return false;
713 } else {
714 if (gMethods == nullptr) {
715 //copy vector to gMethods
716 gMethods = new JNINativeMethod[nativeMethodVect.size()];
717 }
718 return registerNativeMethods(sxn_environ->env,
719 "com/saxonica/functions/extfn/CppCall$PhpFunctionCall", gMethods,
720 nativeMethodVect.size());
721
722
723 }
724 return false;
725 } */
726
728
735 /*static bool registerNativeMethods(JNIEnv *env, const char *className,
736 JNINativeMethod *gMethods, int numMethods) {
737 jclass clazz;
738 clazz = env->FindClass(className);
739 if (clazz == nullptr) {
740 std::cerr << "Native registration unable to find class " << className
741 << std::endl; return false;
742 }
743
744 if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
745 // std::cerr<<"RegisterNatives failed for "<< className<<std::endl;
746 return false;
747 }
748 return true;
749 } **/
750
751 static int jvmCreatedCPP;
753 static sxnc_environment
756 std::string cwd;
757
762 static void deleteString(const char *data) {
763 if (data != nullptr) {
764 operator delete((char *)data);
765 data = nullptr;
766 }
767 }
768
772 static void createHeapDump(bool live);
773
774 static XdmItem *makeXdmItemFromRef(int64_t valueRef);
775
776 static XdmValue *makeXdmValueFromRef(int64_t valueRef);
777
778protected:
779
780
788 SaxonProcessor(int64_t procRef, bool license=false);
789
790 std::string cwdV;
791 // std::string resources_dir; /*!< Saxon resources directory */
792 std::string versionStr;
793 std::map<std::string, XdmValue *>
796 //std::map<std::string, std::string>
797 // configProperties; /*!< Map of properties used for the transformation as
798 // (string, string) pairs */
799 bool licensei;
802 int64_t procRef;
803
804
805private:
806 // void createException(const char *message = nullptr);
807
808 void initialize(bool l);
809
810 void applyConfigurationProperties();
811
812 // SaxonC method for internal use
813 static int64_t
814 createParameterJArray(std::map<std::string, XdmValue *> parameters,
815 std::map<std::string, std::string> properties,
816 int additions = 0);
817
818 static int64_t
819 createParameterJArray2(std::map<std::string, XdmValue *> parameters);
820
821 static int64_t createJArray(XdmValue **values, int length);
822
826 static void destroyHandle(int64_t handleRef);
827
831 static void getInfo();
832};
833
834//===============================================================================================
835
836#endif /* SAXON_PROCESSOR_H */
This C header file contains a number of factory functions for running SaxonC C/C++ APIs,...
EXTERN_SAXONC SAXONC_EXPORT const char * version(sxnc_environment *environi, sxnc_processor *proc)
Get the Saxon version.
Definition SaxonCProcessor.c:6
SAXONC_EXPORT void setCatalog(sxnc_environment *environi, sxnc_processor *proc, char *cwd, char *catalogFileName)
Set a catalog file to be used in Saxon.
Definition SaxonCProcessor.c:52
SAXONC_EXPORT void setCatalogFiles(sxnc_environment *environi, sxnc_processor *proc, char *cwd, char **catalogFileName, int length)
Set multiple catalog files to be used in Saxon.
Definition SaxonCProcessor.c:78
SAXONC_EXPORT void setConfigurationProperty(sxnc_environment *environi, sxnc_processor *proc, char *name, char *value)
Set a configuration property specific to the processor in use.
Definition SaxonCProcessor.c:38
SaxonCXPath.h provides the C API for XPath processing. This file contains a set of functions to compi...
SAXONC_EXPORT const char * getStringValue(sxnc_environment *environi, sxnc_value value)
Get the string value of the item.
Definition SaxonCXPath.c:240
A document builder holds properties controlling how a Saxon document tree should be built,...
Definition DocumentBuilder.h:35
SaxonApiException.
Definition SaxonApiException.h:25
The SaxonProcessor class acts as a factory for generating XQuery, XPath, Schema and XSLT compilers.
Definition SaxonProcessor.h:137
XdmAtomicValue * makeStringValue(std::string str, const char *encoding=nullptr)
Factory method to create an xs:string atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1081
XdmNode * parseXmlFromFile(const char *source, SchemaValidator *validator=nullptr)
Parse a source document file and return it as an XdmNode.
Definition SaxonProcessor.cpp:948
XdmMap * makeMap3(XdmAtomicValue **keys, XdmValue **values, int len)
Make an XdmMap from arrays of keys and values in XDM form.
Definition SaxonProcessor.cpp:1417
std::string cwdV
Definition SaxonProcessor.h:790
XdmAtomicValue * makeAtomicValue(const char *type, const char *value)
Create an XDM atomic value from its lexical representation and the name of the required built-in atom...
Definition SaxonProcessor.cpp:1142
XdmNode * parseXmlFromUri(const char *source, SchemaValidator *validator=nullptr)
Parse a source document available by URI and return it as an XdmNode.
Definition SaxonProcessor.cpp:970
XdmValue * parseJsonFromString(const char *source, const char *encoding=NULL)
Parse a lexical representation of a source JSON document and return it as an XdmValue.
Definition SaxonProcessor.cpp:871
static sxnc_environment * sxn_environ
Definition SaxonProcessor.h:754
static XdmMap * makeMap2(std::map< std::string, XdmValue * > dataMap)
Make an XdmMap by supplying a map from the standard template library, with keys in primitive form.
Definition SaxonProcessor.cpp:1374
XdmAtomicValue * makeBooleanValue(bool b)
Factory method to create an xs:boolean atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1127
SaxonProcessor()
Default constructor.
Definition SaxonProcessor.cpp:165
std::map< std::string, XdmValue * > parameters
Definition SaxonProcessor.h:794
XdmAtomicValue * makeQNameValue(const char *str)
Create an xs:QName atomic value, from the string representation in clark notation.
Definition SaxonProcessor.cpp:1135
SchemaValidator * newSchemaValidator()
Create a SchemaValidator.
Definition SaxonProcessor.cpp:739
const char * clarkNameToEQName(const char *name)
Convert a string representing a QName value in clark notation to a string representing the QName in E...
Definition SaxonProcessor.cpp:1161
XdmAtomicValue * makeDoubleValue(double d)
Factory method to create an xs:double atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1103
XdmAtomicValue * makeIntegerValue(int i)
Factory method to create an xs:integer atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1095
XdmValue * parseJsonFromFile(const char *source)
Parse a source JSON file and return it as an XdmValue.
Definition SaxonProcessor.cpp:897
XdmArray * makeArray(char **input, int length)
Make an XdmArray whose members are xs:string values.
Definition SaxonProcessor.cpp:1331
const char * EQNameToClarkName(const char *name)
Convert a string representing a QName value in EQName notation to a string representing the QName in ...
Definition SaxonProcessor.cpp:1173
XdmValue ** createXdmValueArray(int len)
Utility method for working with SaxonC on Python - internal use only.
Definition SaxonProcessor.h:536
XdmAtomicValue ** createXdmAtomicValueArray(int len)
Utility method for working with SaxonC on Python - internal use only.
Definition SaxonProcessor.h:549
XQueryProcessor * newXQueryProcessor()
Create an XQueryProcessor.
Definition SaxonProcessor.cpp:731
XsdCompiler * newXsdCompiler()
Create an XsdCompiler.
Definition SaxonProcessor.cpp:750
Xslt30Processor * newXslt30Processor()
Create an Xslt30Processor.
Definition SaxonProcessor.cpp:727
std::string cwd
Definition SaxonProcessor.h:756
std::string versionStr
Definition SaxonProcessor.h:792
XdmAtomicValue * makeLongValue(long l)
Factory method to create an xs:long atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1119
bool licensei
Definition SaxonProcessor.h:799
static void deleteString(const char *data)
Utility method required for the python and PHP extensions to delete a string created in the C++ code-...
Definition SaxonProcessor.h:762
bool isSchemaAwareProcessor()
Test whether this processor is schema-aware.
Definition SaxonProcessor.cpp:405
SaxonProcessor & operator=(const SaxonProcessor &other)
The copy assignment= operator.
Definition SaxonProcessor.cpp:684
int getNodeKind(int64_t obj)
Get the kind of node - internal use only.
Definition SaxonProcessor.cpp:941
DocumentBuilder * newDocumentBuilder()
Create a DocumentBuilder.
Definition SaxonProcessor.cpp:718
XdmMap * makeMap(std::map< XdmAtomicValue *, XdmValue * > dataMap)
Make an XdmMap by supplying a map from the standard template library, with keys in XDM form.
Definition SaxonProcessor.cpp:1349
static int jvmCreatedCPP
Add a native method.
Definition SaxonProcessor.h:751
XdmNode * parseXmlFromString(const char *source, const char *encoding=nullptr, SchemaValidator *validator=nullptr)
Parse a lexical representation of a source XML document and return it as an XdmNode.
Definition SaxonProcessor.cpp:919
XPathProcessor * newXPathProcessor()
Create an XPathProcessor.
Definition SaxonProcessor.cpp:735
int64_t procRef
Definition SaxonProcessor.h:802
XdmAtomicValue * makeFloatValue(float f)
Factory method to create an xs:float atomic value as a new XdmAtomicValue.
Definition SaxonProcessor.cpp:1111
Definition SchemaValidator.h:27
An XPathProcessor represents a factory to compile, load and execute XPath expressions.
Definition XPathProcessor.h:67
An XQueryProcessor represents a factory to compile, load and execute queries.
Definition XQueryProcessor.h:26
An array in the XDM data model.
Definition XdmArray.h:27
The class XdmAtomicValue represents an item in an XPath sequence that is an atomic value.
Definition XdmAtomicValue.h:27
The class XdmFunctionItem represents a function item.
Definition XdmFunctionItem.h:26
The class XdmItem represents an item in a sequence, as defined by the XDM data model.
Definition XdmItem.h:31
A map in the XDM data model.
Definition XdmMap.h:30
This class represents a node in the XDM data model.
Definition XdmNode.h:57
An XdmValue represents a value in the XDM data model.
Definition XdmValue.h:33
Definition XsdCompiler.h:49
An Xslt30Processor represents a factory to compile, load and execute stylesheets.
Definition Xslt30Processor.h:31
An XsltExecutable represents the compiled form of a stylesheet.
Definition XsltExecutable.h:30
Definition SaxonProcessor.h:113
sxnc_environment.
Definition SaxonCGlue.h:85