Coverage Report

Created: 2025-06-09 07:43

/src/gdal/muparser/include/muParserDef.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
3
   _____  __ _____________ _______  ______ ___________
4
  /     \|  |  \____ \__  \\_  __ \/  ___// __ \_  __ \
5
   |  Y Y  \  |  /  |_> > __ \|  | \/\___ \\  ___/|  | \/
6
   |__|_|  /____/|   __(____  /__|  /____  >\___  >__|
7
     \/      |__|       \/           \/     \/
8
   Copyright (C) 2004 - 2022 Ingo Berg
9
10
  Redistribution and use in source and binary forms, with or without modification, are permitted
11
  provided that the following conditions are met:
12
13
    * Redistributions of source code must retain the above copyright notice, this list of
14
    conditions and the following disclaimer.
15
    * Redistributions in binary form must reproduce the above copyright notice, this list of
16
    conditions and the following disclaimer in the documentation and/or other materials provided
17
    with the distribution.
18
19
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
20
  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21
  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25
  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26
  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
*/
28
29
#ifndef MUP_DEF_H
30
#define MUP_DEF_H
31
32
#include <iostream>
33
#include <string>
34
#include <sstream>
35
#include <map>
36
37
#include "muParserFixes.h"
38
39
/** \file
40
  \brief This file contains standard definitions used by the parser.
41
*/
42
43
/** \brief Define the base datatype for values.
44
45
  This datatype must be a built in value type. You can not use custom classes.
46
  It should be working with all types except "int"!
47
*/
48
#define MUP_BASETYPE double
49
50
/** \brief Activate this option in order to compile with OpenMP support.
51
52
  OpenMP is used only in the bulk mode it may increase the performance a bit.
53
54
  !!! DO NOT ACTIVATE THIS MACRO HERE IF YOU USE CMAKE FOR BUILDING !!!
55
56
  use the cmake option instead!
57
*/
58
//#define MUP_USE_OPENMP
59
60
#if defined(_UNICODE)
61
  /** \brief Definition of the basic parser string type. */
62
  #define MUP_STRING_TYPE std::wstring
63
64
  #if !defined(_T)
65
    #define _T(x) L##x
66
  #endif // not defined _T
67
#else
68
  #ifndef _T
69
0
    #define _T(x) x
70
  #endif
71
72
  /** \brief Definition of the basic parser string type. */
73
  #define MUP_STRING_TYPE std::string
74
#endif
75
76
/** \brief An assertion that does not kill the program. */
77
#define MUP_ASSERT(COND)                      \
78
0
            if (!(COND))                      \
79
0
            {                           \
80
0
              stringstream_type ss;                 \
81
0
              ss << _T("Assertion \"") _T(#COND) _T("\" failed: ") \
82
0
                 << __FILE__ << _T(" line ")            \
83
0
                 << __LINE__ << _T(".");              \
84
0
              throw ParserError( ecINTERNAL_ERROR, -1, ss.str());   \
85
0
            }
86
87
#if defined(_MSC_VER)
88
  #pragma warning(push)
89
  #pragma warning(disable : 26812) 
90
#endif
91
92
93
namespace mu
94
{
95
#if defined(_UNICODE)
96
97
  /** \brief Encapsulate wcout. */
98
  inline std::wostream& console()
99
  {
100
    return std::wcout;
101
  }
102
103
  /** \brief Encapsulate cin. */
104
  inline std::wistream& console_in()
105
  {
106
    return std::wcin;
107
  }
108
109
#else
110
111
  /** \brief Encapsulate cout.
112
113
    Used for supporting UNICODE more easily.
114
  */
115
  inline std::ostream& console()
116
0
  {
117
0
    return std::cout;
118
0
  }
119
120
  /** \brief Encapsulate cin.
121
122
    Used for supporting UNICODE more easily.
123
  */
124
  inline std::istream& console_in()
125
0
  {
126
0
    return std::cin;
127
0
  }
128
129
#endif
130
131
  /** \brief Bytecode values.
132
133
    \attention The order of the operator entries must match the order in ParserBase::c_DefaultOprt!
134
  */
135
  enum ECmdCode
136
  {
137
    // The following are codes for built in binary operators
138
    // apart from built in operators the user has the opportunity to
139
    // add user defined operators.
140
    cmLE = 0,     ///< Operator item:  less or equal
141
    cmGE = 1,     ///< Operator item:  greater or equal
142
    cmNEQ = 2,      ///< Operator item:  not equal
143
    cmEQ = 3,     ///< Operator item:  equals
144
    cmLT = 4,     ///< Operator item:  less than
145
    cmGT = 5,     ///< Operator item:  greater than
146
    cmADD = 6,      ///< Operator item:  add
147
    cmSUB = 7,      ///< Operator item:  subtract
148
    cmMUL = 8,      ///< Operator item:  multiply
149
    cmDIV = 9,      ///< Operator item:  division
150
    cmPOW = 10,     ///< Operator item:  y to the power of ...
151
    cmLAND = 11,
152
    cmLOR = 12,
153
    cmASSIGN = 13,    ///< Operator item:  Assignment operator
154
    cmBO = 14,      ///< Operator item:  opening bracket
155
    cmBC = 15,      ///< Operator item:  closing bracket
156
    cmIF = 16,      ///< For use in the ternary if-then-else operator
157
    cmELSE = 17,    ///< For use in the ternary if-then-else operator
158
    cmENDIF = 18,   ///< For use in the ternary if-then-else operator
159
    cmARG_SEP = 19,   ///< function argument separator
160
    cmVAR = 20,     ///< variable item
161
    cmVAL = 21,     ///< value item
162
163
    // For optimization purposes
164
    cmVARPOW2 = 22,
165
    cmVARPOW3 = 23,
166
    cmVARPOW4 = 24,
167
    cmVARMUL = 25,
168
169
    // operators and functions
170
    cmFUNC = 26,    ///< Code for a generic function item
171
    cmFUNC_STR,     ///< Code for a function with a string parameter
172
    cmFUNC_BULK,    ///< Special callbacks for Bulk mode with an additional parameter for the bulk index 
173
    cmSTRING,     ///< Code for a string token
174
    cmOPRT_BIN,     ///< user defined binary operator
175
    cmOPRT_POSTFIX,   ///< code for postfix operators
176
    cmOPRT_INFIX,   ///< code for infix operators
177
    cmEND,        ///< end of formula
178
    cmUNKNOWN     ///< uninitialized item
179
  };
180
181
  /** \brief Types internally used by the parser.
182
  */
183
  enum ETypeCode
184
  {
185
    tpSTR = 0,     ///< String type (Function arguments and constants only, no string variables)
186
    tpDBL = 1,     ///< Floating point variables
187
    tpVOID = 2      ///< Undefined type.
188
  };
189
190
191
  enum EParserVersionInfo
192
  {
193
    pviBRIEF,
194
    pviFULL
195
  };
196
197
198
  /** \brief Parser operator precedence values. */
199
  enum EOprtAssociativity
200
  {
201
    oaLEFT = 0,
202
    oaRIGHT = 1,
203
    oaNONE = 2
204
  };
205
206
207
  /** \brief Parser operator precedence values. */
208
  enum EOprtPrecedence
209
  {
210
    prLOR = 1,    ///< logic or
211
    prLAND = 2,   ///< logic and
212
    prBOR = 3,      ///< bitwise or
213
    prBAND = 4,     ///< bitwise and
214
    prCMP = 5,    ///< comparsion operators
215
    prADD_SUB = 6,  ///< addition
216
    prMUL_DIV = 7,  ///< multiplication/division
217
    prPOW = 8,    ///< power operator priority (highest)
218
219
    // infix operators
220
    prINFIX = 7,  ///< Signs have a higher priority than ADD_SUB, but lower than power operator
221
    prPOSTFIX = 7 ///< Postfix operator priority (currently unused)
222
  };
223
224
225
  /** \brief Error codes. */
226
  enum EErrorCodes
227
  {
228
    // Formula syntax errors
229
    ecUNEXPECTED_OPERATOR = 0,  ///< Unexpected binary operator found
230
    ecUNASSIGNABLE_TOKEN = 1, ///< Token can't be identified.
231
    ecUNEXPECTED_EOF = 2,   ///< Unexpected end of formula. (Example: "2+sin(")
232
    ecUNEXPECTED_ARG_SEP = 3, ///< An unexpected comma has been found. (Example: "1,23")
233
    ecUNEXPECTED_ARG = 4,   ///< An unexpected argument has been found
234
    ecUNEXPECTED_VAL = 5,   ///< An unexpected value token has been found
235
    ecUNEXPECTED_VAR = 6,   ///< An unexpected variable token has been found
236
    ecUNEXPECTED_PARENS = 7,  ///< Unexpected Parenthesis, opening or closing
237
    ecUNEXPECTED_STR = 8,   ///< A string has been found at an inapropriate position
238
    ecSTRING_EXPECTED = 9,    ///< A string function has been called with a different type of argument
239
    ecVAL_EXPECTED = 10,    ///< A numerical function has been called with a non value type of argument
240
    ecMISSING_PARENS = 11,    ///< Missing parens. (Example: "3*sin(3")
241
    ecUNEXPECTED_FUN = 12,    ///< Unexpected function found. (Example: "sin(8)cos(9)")
242
    ecUNTERMINATED_STRING = 13, ///< unterminated string constant. (Example: "3*valueof("hello)")
243
    ecTOO_MANY_PARAMS = 14,   ///< Too many function parameters
244
    ecTOO_FEW_PARAMS = 15,    ///< Too few function parameters. (Example: "ite(1<2,2)")
245
    ecOPRT_TYPE_CONFLICT = 16,  ///< binary operators may only be applied to value items of the same type
246
    ecSTR_RESULT = 17,      ///< result is a string
247
248
    // Invalid Parser input Parameters
249
    ecINVALID_NAME = 18,      ///< Invalid function, variable or constant name.
250
    ecINVALID_BINOP_IDENT = 19,   ///< Invalid binary operator identifier
251
    ecINVALID_INFIX_IDENT = 20,   ///< Invalid function, variable or constant name.
252
    ecINVALID_POSTFIX_IDENT = 21, ///< Invalid function, variable or constant name.
253
254
    ecBUILTIN_OVERLOAD = 22, ///< Trying to overload builtin operator
255
    ecINVALID_FUN_PTR = 23, ///< Invalid callback function pointer 
256
    ecINVALID_VAR_PTR = 24, ///< Invalid variable pointer 
257
    ecEMPTY_EXPRESSION = 25, ///< The Expression is empty
258
    ecNAME_CONFLICT = 26, ///< Name conflict
259
    ecOPT_PRI = 27, ///< Invalid operator priority
260
    // 
261
    ecDOMAIN_ERROR = 28, ///< catch division by zero, sqrt(-1), log(0) (currently unused)
262
    ecDIV_BY_ZERO = 29, ///< Division by zero (currently unused)
263
    ecGENERIC = 30, ///< Generic error
264
    ecLOCALE = 31, ///< Conflict with current locale
265
266
    ecUNEXPECTED_CONDITIONAL = 32,
267
    ecMISSING_ELSE_CLAUSE = 33,
268
    ecMISPLACED_COLON = 34,
269
270
    ecUNREASONABLE_NUMBER_OF_COMPUTATIONS = 35,
271
272
    ecIDENTIFIER_TOO_LONG = 36, ///< Thrown when an identifier with more then 255 characters is used.
273
274
    ecEXPRESSION_TOO_LONG = 37, ///< Throw an exception if the expression has more than 10000 characters. (an arbitrary limit)
275
276
    ecINVALID_CHARACTERS_FOUND = 38,///< The expression or identifier contains invalid non printable characters
277
278
    // internal errors
279
    ecINTERNAL_ERROR = 39,      ///< Internal error of any kind.
280
281
    ecBYTECODE_IMPORT_EXPORT_DISABLED = 40, ///< Bytecode cannot be exported.
282
283
    // The last two are special entries 
284
    ecCOUNT,                      ///< This is no error code, It just stores just the total number of error codes
285
    ecUNDEFINED = -1  ///< Undefined message, placeholder to detect unassigned error messages
286
  };
287
288
  //------------------------------------------------------------------------------
289
  // Basic Types
290
  //------------------------------------------------------------------------------
291
292
  /** \brief The numeric datatype used by the parser.
293
294
    Normally this is a floating point type either single or double precision.
295
  */
296
  typedef MUP_BASETYPE value_type;
297
298
  /** \brief The stringtype used by the parser.
299
300
    Depends on whether UNICODE is used or not.
301
  */
302
  typedef MUP_STRING_TYPE string_type;
303
304
  /** \brief The character type used by the parser.
305
306
    Depends on whether UNICODE is used or not.
307
  */
308
  typedef string_type::value_type char_type;
309
310
  /** \brief Typedef for easily using stringstream that respect the parser stringtype. */
311
  typedef std::basic_stringstream<char_type, std::char_traits<char_type>, std::allocator<char_type> > stringstream_type;
312
313
  // Data container types
314
315
  /** \brief Type used for storing variables. */
316
  typedef std::map<string_type, value_type*> varmap_type;
317
318
  /** \brief Type used for storing constants. */
319
  typedef std::map<string_type, value_type> valmap_type;
320
321
  /** \brief Type for assigning a string name to an index in the internal string table. */
322
  typedef std::map<string_type, std::size_t> strmap_type;
323
324
  // Parser callbacks
325
326
  /** \brief Function type used to erase type.  Voluntarily needs explicit cast with all other *fun_type*. */
327
  typedef void(*erased_fun_type)();
328
329
  /** \brief Callback type used for functions without arguments. */
330
  typedef value_type(*fun_type0)();
331
332
  /** \brief Callback type used for functions with a single arguments. */
333
  typedef value_type(*fun_type1)(value_type);
334
335
  /** \brief Callback type used for functions with two arguments. */
336
  typedef value_type(*fun_type2)(value_type, value_type);
337
338
  /** \brief Callback type used for functions with three arguments. */
339
  typedef value_type(*fun_type3)(value_type, value_type, value_type);
340
341
  /** \brief Callback type used for functions with four arguments. */
342
  typedef value_type(*fun_type4)(value_type, value_type, value_type, value_type);
343
344
  /** \brief Callback type used for functions with five arguments. */
345
  typedef value_type(*fun_type5)(value_type, value_type, value_type, value_type, value_type);
346
347
  /** \brief Callback type used for functions with six arguments. */
348
  typedef value_type(*fun_type6)(value_type, value_type, value_type, value_type, value_type, value_type);
349
350
  /** \brief Callback type used for functions with seven arguments. */
351
  typedef value_type(*fun_type7)(value_type, value_type, value_type, value_type, value_type, value_type, value_type);
352
353
  /** \brief Callback type used for functions with eight arguments. */
354
  typedef value_type(*fun_type8)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
355
356
  /** \brief Callback type used for functions with nine arguments. */
357
  typedef value_type(*fun_type9)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
358
359
  /** \brief Callback type used for functions with ten arguments. */
360
  typedef value_type(*fun_type10)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
361
362
  /** \brief Callback type with user data (not null) used for functions without arguments. */
363
  typedef value_type(*fun_userdata_type0)(void*);
364
365
  /** \brief Callback type with user data (not null) used for functions with a single arguments. */
366
  typedef value_type(*fun_userdata_type1)(void*, value_type);
367
368
  /** \brief Callback type with user data (not null) used for functions with two arguments. */
369
  typedef value_type(*fun_userdata_type2)(void*, value_type, value_type);
370
371
  /** \brief Callback type with user data (not null) used for functions with three arguments. */
372
  typedef value_type(*fun_userdata_type3)(void*, value_type, value_type, value_type);
373
374
  /** \brief Callback type with user data (not null) used for functions with four arguments. */
375
  typedef value_type(*fun_userdata_type4)(void*, value_type, value_type, value_type, value_type);
376
377
  /** \brief Callback type with user data (not null) used for functions with five arguments. */
378
  typedef value_type(*fun_userdata_type5)(void*, value_type, value_type, value_type, value_type, value_type);
379
380
  /** \brief Callback type with user data (not null) used for functions with six arguments. */
381
  typedef value_type(*fun_userdata_type6)(void*, value_type, value_type, value_type, value_type, value_type, value_type);
382
383
  /** \brief Callback type with user data (not null) used for functions with seven arguments. */
384
  typedef value_type(*fun_userdata_type7)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
385
386
  /** \brief Callback type with user data (not null) used for functions with eight arguments. */
387
  typedef value_type(*fun_userdata_type8)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
388
389
  /** \brief Callback type with user data (not null) used for functions with nine arguments. */
390
  typedef value_type(*fun_userdata_type9)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
391
392
  /** \brief Callback type with user data (not null) used for functions with ten arguments. */
393
  typedef value_type(*fun_userdata_type10)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
394
395
  /** \brief Callback type used for functions without arguments. */
396
  typedef value_type(*bulkfun_type0)(int, int);
397
398
  /** \brief Callback type used for functions with a single arguments. */
399
  typedef value_type(*bulkfun_type1)(int, int, value_type);
400
401
  /** \brief Callback type used for functions with two arguments. */
402
  typedef value_type(*bulkfun_type2)(int, int, value_type, value_type);
403
404
  /** \brief Callback type used for functions with three arguments. */
405
  typedef value_type(*bulkfun_type3)(int, int, value_type, value_type, value_type);
406
407
  /** \brief Callback type used for functions with four arguments. */
408
  typedef value_type(*bulkfun_type4)(int, int, value_type, value_type, value_type, value_type);
409
410
  /** \brief Callback type used for functions with five arguments. */
411
  typedef value_type(*bulkfun_type5)(int, int, value_type, value_type, value_type, value_type, value_type);
412
413
  /** \brief Callback type used for functions with six arguments. */
414
  typedef value_type(*bulkfun_type6)(int, int, value_type, value_type, value_type, value_type, value_type, value_type);
415
416
  /** \brief Callback type used for functions with seven arguments. */
417
  typedef value_type(*bulkfun_type7)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
418
419
  /** \brief Callback type used for functions with eight arguments. */
420
  typedef value_type(*bulkfun_type8)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
421
422
  /** \brief Callback type used for functions with nine arguments. */
423
  typedef value_type(*bulkfun_type9)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
424
425
  /** \brief Callback type used for functions with ten arguments. */
426
  typedef value_type(*bulkfun_type10)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
427
428
  /** \brief Callback type with user data (not null) used for functions without arguments. */
429
  typedef value_type(*bulkfun_userdata_type0)(void*, int, int);
430
431
  /** \brief Callback type with user data (not null) used for functions with a single arguments. */
432
  typedef value_type(*bulkfun_userdata_type1)(void*, int, int, value_type);
433
434
  /** \brief Callback type with user data (not null) used for functions with two arguments. */
435
  typedef value_type(*bulkfun_userdata_type2)(void*, int, int, value_type, value_type);
436
437
  /** \brief Callback type with user data (not null) used for functions with three arguments. */
438
  typedef value_type(*bulkfun_userdata_type3)(void*, int, int, value_type, value_type, value_type);
439
440
  /** \brief Callback type with user data (not null) used for functions with four arguments. */
441
  typedef value_type(*bulkfun_userdata_type4)(void*, int, int, value_type, value_type, value_type, value_type);
442
443
  /** \brief Callback type with user data (not null) used for functions with five arguments. */
444
  typedef value_type(*bulkfun_userdata_type5)(void*, int, int, value_type, value_type, value_type, value_type, value_type);
445
446
  /** \brief Callback type with user data (not null) used for functions with six arguments. */
447
  typedef value_type(*bulkfun_userdata_type6)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type);
448
449
  /** \brief Callback type with user data (not null) used for functions with seven arguments. */
450
  typedef value_type(*bulkfun_userdata_type7)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
451
452
  /** \brief Callback type with user data (not null) used for functions with eight arguments. */
453
  typedef value_type(*bulkfun_userdata_type8)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
454
455
  /** \brief Callback type with user data (not null) used for functions with nine arguments. */
456
  typedef value_type(*bulkfun_userdata_type9)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
457
458
  /** \brief Callback type with user data (not null) used for functions with ten arguments. */
459
  typedef value_type(*bulkfun_userdata_type10)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
460
461
  /** \brief Callback type used for functions with a variable argument list. */
462
  typedef value_type(*multfun_type)(const value_type*, int);
463
464
  /** \brief Callback type with user data (not null) used for functions and a variable argument list. */
465
  typedef value_type(*multfun_userdata_type)(void*, const value_type*, int);
466
467
  /** \brief Callback type used for functions taking a string as an argument. */
468
  typedef value_type(*strfun_type1)(const char_type*);
469
470
  /** \brief Callback type used for functions taking a string and a value as arguments. */
471
  typedef value_type(*strfun_type2)(const char_type*, value_type);
472
473
  /** \brief Callback type used for functions taking a string and two values as arguments. */
474
  typedef value_type(*strfun_type3)(const char_type*, value_type, value_type);
475
476
  /** \brief Callback type used for functions taking a string and three values as arguments. */
477
  typedef value_type(*strfun_type4)(const char_type*, value_type, value_type, value_type);
478
479
  /** \brief Callback type used for functions taking a string and four values as arguments. */
480
  typedef value_type(*strfun_type5)(const char_type*, value_type, value_type, value_type, value_type);
481
482
  /** \brief Callback type used for functions taking a string and five values as arguments. */
483
  typedef value_type(*strfun_type6)(const char_type*, value_type, value_type, value_type, value_type, value_type);
484
485
  /** \brief Callback type with user data (not null) used for functions taking a string as an argument. */
486
  typedef value_type(*strfun_userdata_type1)(void*, const char_type*);
487
488
  /** \brief Callback type with user data (not null) used for functions taking a string and a value as arguments. */
489
  typedef value_type(*strfun_userdata_type2)(void*, const char_type*, value_type);
490
491
  /** \brief Callback type with user data (not null) used for functions taking a string and two values as arguments. */
492
  typedef value_type(*strfun_userdata_type3)(void*, const char_type*, value_type, value_type);
493
494
  /** \brief Callback type with user data (not null) used for functions taking a string and a value as arguments. */
495
  typedef value_type(*strfun_userdata_type4)(void*, const char_type*, value_type, value_type, value_type);
496
497
  /** \brief Callback type with user data (not null) used for functions taking a string and two values as arguments. */
498
  typedef value_type(*strfun_userdata_type5)(void*, const char_type*, value_type, value_type, value_type, value_type);
499
500
  /** \brief Callback type with user data (not null) used for functions taking a string and five values as arguments. */
501
  typedef value_type(*strfun_userdata_type6)(void*, const char_type*, value_type, value_type, value_type, value_type, value_type);
502
503
  /** \brief Callback used for functions that identify values in a string. */
504
  typedef int (*identfun_type)(const char_type* sExpr, int* nPos, value_type* fVal);
505
506
  /** \brief Callback used for variable creation factory functions. */
507
  typedef value_type* (*facfun_type)(const char_type*, void*);
508
509
  static const int MaxLenExpression = 20000;
510
  static const int MaxLenIdentifier = 100;
511
  static const string_type ParserVersion = string_type(_T("2.3.5 (Release)"));
512
  static const string_type ParserVersionDate = string_type(_T("20241213"));
513
} // end of namespace
514
515
#if defined(_MSC_VER)
516
  #pragma warning(pop)
517
#endif
518
519
#endif
520