Coverage Report

Created: 2026-08-08 06:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/muparser/include/muParserDef.h
Line
Count
Source
1
/*
2
3
   _____  __ _____________ _______  ______ ___________
4
  /     \|  |  \____ \__  \\_  __ \/  ___// __ \_  __ \
5
   |  Y Y  \  |  /  |_> > __ \|  | \/\___ \\  ___/|  | \/
6
   |__|_|  /____/|   __(____  /__|  /____  >\___  >__|
7
     \/      |__|       \/           \/     \/
8
   Copyright (C) 2026 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
3.24M
    #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
33.8M
            if (!(COND))                      \
79
33.8M
            {                           \
80
111
              stringstream_type ss;                 \
81
111
              ss << _T("Assertion \"") _T(#COND) _T("\" failed: ") \
82
111
                 << __FILE__ << _T(" line ")            \
83
111
                 << __LINE__ << _T(".");              \
84
111
              throw ParserError( ecINTERNAL_ERROR, -1, ss.str());   \
85
111
            }
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
    ecBYTECODE_IMPORT_EXPORT_DISABLED = 40, ///< Bytecode cannot be exported.
281
282
    ecUNARY_PLUS_IN_FRONT_OF_FUNCTION = 41, ///< Unexpected binary operator found
283
    ecNESTING_LIMIT = 42,         ///< Throw an exception if the expressions is exceeding the nesting limit
284
285
    // The last two are special entries 
286
    ecCOUNT,                      ///< This is no error code, It just stores just the total number of error codes
287
    ecUNDEFINED = -1  ///< Undefined message, placeholder to detect unassigned error messages
288
  };
289
290
  //------------------------------------------------------------------------------
291
  // Basic Types
292
  //------------------------------------------------------------------------------
293
294
  /** \brief The numeric datatype used by the parser.
295
296
    Normally this is a floating point type either single or double precision.
297
  */
298
  typedef MUP_BASETYPE value_type;
299
300
  /** \brief The stringtype used by the parser.
301
302
    Depends on whether UNICODE is used or not.
303
  */
304
  typedef MUP_STRING_TYPE string_type;
305
306
  /** \brief The character type used by the parser.
307
308
    Depends on whether UNICODE is used or not.
309
  */
310
  typedef string_type::value_type char_type;
311
312
  /** \brief Typedef for easily using stringstream that respect the parser stringtype. */
313
  typedef std::basic_stringstream<char_type, std::char_traits<char_type>, std::allocator<char_type> > stringstream_type;
314
315
  // Data container types
316
317
  /** \brief Type used for storing variables. */
318
  typedef std::map<string_type, value_type*> varmap_type;
319
320
  /** \brief Type used for storing constants. */
321
  typedef std::map<string_type, value_type> valmap_type;
322
323
  /** \brief Type for assigning a string name to an index in the internal string table. */
324
  typedef std::map<string_type, std::size_t> strmap_type;
325
326
  // Parser callbacks
327
328
  /** \brief Function type used to erase type.  Voluntarily needs explicit cast with all other *fun_type*. */
329
  typedef void(*erased_fun_type)();
330
331
  /** \brief Callback type used for functions without arguments. */
332
  typedef value_type(*fun_type0)();
333
334
  /** \brief Callback type used for functions with a single arguments. */
335
  typedef value_type(*fun_type1)(value_type);
336
337
  /** \brief Callback type used for functions with two arguments. */
338
  typedef value_type(*fun_type2)(value_type, value_type);
339
340
  /** \brief Callback type used for functions with three arguments. */
341
  typedef value_type(*fun_type3)(value_type, value_type, value_type);
342
343
  /** \brief Callback type used for functions with four arguments. */
344
  typedef value_type(*fun_type4)(value_type, value_type, value_type, value_type);
345
346
  /** \brief Callback type used for functions with five arguments. */
347
  typedef value_type(*fun_type5)(value_type, value_type, value_type, value_type, value_type);
348
349
  /** \brief Callback type used for functions with six arguments. */
350
  typedef value_type(*fun_type6)(value_type, value_type, value_type, value_type, value_type, value_type);
351
352
  /** \brief Callback type used for functions with seven arguments. */
353
  typedef value_type(*fun_type7)(value_type, value_type, value_type, value_type, value_type, value_type, value_type);
354
355
  /** \brief Callback type used for functions with eight arguments. */
356
  typedef value_type(*fun_type8)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
357
358
  /** \brief Callback type used for functions with nine arguments. */
359
  typedef value_type(*fun_type9)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
360
361
  /** \brief Callback type used for functions with ten arguments. */
362
  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);
363
364
  /** \brief Callback type with user data (not null) used for functions without arguments. */
365
  typedef value_type(*fun_userdata_type0)(void*);
366
367
  /** \brief Callback type with user data (not null) used for functions with a single arguments. */
368
  typedef value_type(*fun_userdata_type1)(void*, value_type);
369
370
  /** \brief Callback type with user data (not null) used for functions with two arguments. */
371
  typedef value_type(*fun_userdata_type2)(void*, value_type, value_type);
372
373
  /** \brief Callback type with user data (not null) used for functions with three arguments. */
374
  typedef value_type(*fun_userdata_type3)(void*, value_type, value_type, value_type);
375
376
  /** \brief Callback type with user data (not null) used for functions with four arguments. */
377
  typedef value_type(*fun_userdata_type4)(void*, value_type, value_type, value_type, value_type);
378
379
  /** \brief Callback type with user data (not null) used for functions with five arguments. */
380
  typedef value_type(*fun_userdata_type5)(void*, value_type, value_type, value_type, value_type, value_type);
381
382
  /** \brief Callback type with user data (not null) used for functions with six arguments. */
383
  typedef value_type(*fun_userdata_type6)(void*, value_type, value_type, value_type, value_type, value_type, value_type);
384
385
  /** \brief Callback type with user data (not null) used for functions with seven arguments. */
386
  typedef value_type(*fun_userdata_type7)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
387
388
  /** \brief Callback type with user data (not null) used for functions with eight arguments. */
389
  typedef value_type(*fun_userdata_type8)(void*, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
390
391
  /** \brief Callback type with user data (not null) used for functions with nine arguments. */
392
  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);
393
394
  /** \brief Callback type with user data (not null) used for functions with ten arguments. */
395
  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);
396
397
  /** \brief Callback type used for functions without arguments. */
398
  typedef value_type(*bulkfun_type0)(int, int);
399
400
  /** \brief Callback type used for functions with a single arguments. */
401
  typedef value_type(*bulkfun_type1)(int, int, value_type);
402
403
  /** \brief Callback type used for functions with two arguments. */
404
  typedef value_type(*bulkfun_type2)(int, int, value_type, value_type);
405
406
  /** \brief Callback type used for functions with three arguments. */
407
  typedef value_type(*bulkfun_type3)(int, int, value_type, value_type, value_type);
408
409
  /** \brief Callback type used for functions with four arguments. */
410
  typedef value_type(*bulkfun_type4)(int, int, value_type, value_type, value_type, value_type);
411
412
  /** \brief Callback type used for functions with five arguments. */
413
  typedef value_type(*bulkfun_type5)(int, int, value_type, value_type, value_type, value_type, value_type);
414
415
  /** \brief Callback type used for functions with six arguments. */
416
  typedef value_type(*bulkfun_type6)(int, int, value_type, value_type, value_type, value_type, value_type, value_type);
417
418
  /** \brief Callback type used for functions with seven arguments. */
419
  typedef value_type(*bulkfun_type7)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
420
421
  /** \brief Callback type used for functions with eight arguments. */
422
  typedef value_type(*bulkfun_type8)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
423
424
  /** \brief Callback type used for functions with nine arguments. */
425
  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);
426
427
  /** \brief Callback type used for functions with ten arguments. */
428
  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);
429
430
  /** \brief Callback type with user data (not null) used for functions without arguments. */
431
  typedef value_type(*bulkfun_userdata_type0)(void*, int, int);
432
433
  /** \brief Callback type with user data (not null) used for functions with a single arguments. */
434
  typedef value_type(*bulkfun_userdata_type1)(void*, int, int, value_type);
435
436
  /** \brief Callback type with user data (not null) used for functions with two arguments. */
437
  typedef value_type(*bulkfun_userdata_type2)(void*, int, int, value_type, value_type);
438
439
  /** \brief Callback type with user data (not null) used for functions with three arguments. */
440
  typedef value_type(*bulkfun_userdata_type3)(void*, int, int, value_type, value_type, value_type);
441
442
  /** \brief Callback type with user data (not null) used for functions with four arguments. */
443
  typedef value_type(*bulkfun_userdata_type4)(void*, int, int, value_type, value_type, value_type, value_type);
444
445
  /** \brief Callback type with user data (not null) used for functions with five arguments. */
446
  typedef value_type(*bulkfun_userdata_type5)(void*, int, int, value_type, value_type, value_type, value_type, value_type);
447
448
  /** \brief Callback type with user data (not null) used for functions with six arguments. */
449
  typedef value_type(*bulkfun_userdata_type6)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type);
450
451
  /** \brief Callback type with user data (not null) used for functions with seven arguments. */
452
  typedef value_type(*bulkfun_userdata_type7)(void*, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
453
454
  /** \brief Callback type with user data (not null) used for functions with eight arguments. */
455
  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);
456
457
  /** \brief Callback type with user data (not null) used for functions with nine arguments. */
458
  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);
459
460
  /** \brief Callback type with user data (not null) used for functions with ten arguments. */
461
  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);
462
463
  /** \brief Callback type used for functions with a variable argument list. */
464
  typedef value_type(*multfun_type)(const value_type*, int);
465
466
  /** \brief Callback type with user data (not null) used for functions and a variable argument list. */
467
  typedef value_type(*multfun_userdata_type)(void*, const value_type*, int);
468
469
  /** \brief Callback type used for functions taking a string as an argument. */
470
  typedef value_type(*strfun_type1)(const char_type*);
471
472
  /** \brief Callback type used for functions taking a string and a value as arguments. */
473
  typedef value_type(*strfun_type2)(const char_type*, value_type);
474
475
  /** \brief Callback type used for functions taking a string and two values as arguments. */
476
  typedef value_type(*strfun_type3)(const char_type*, value_type, value_type);
477
478
  /** \brief Callback type used for functions taking a string and three values as arguments. */
479
  typedef value_type(*strfun_type4)(const char_type*, value_type, value_type, value_type);
480
481
  /** \brief Callback type used for functions taking a string and four values as arguments. */
482
  typedef value_type(*strfun_type5)(const char_type*, value_type, value_type, value_type, value_type);
483
484
  /** \brief Callback type used for functions taking a string and five values as arguments. */
485
  typedef value_type(*strfun_type6)(const char_type*, value_type, value_type, value_type, value_type, value_type);
486
487
  /** \brief Callback type with user data (not null) used for functions taking a string as an argument. */
488
  typedef value_type(*strfun_userdata_type1)(void*, const char_type*);
489
490
  /** \brief Callback type with user data (not null) used for functions taking a string and a value as arguments. */
491
  typedef value_type(*strfun_userdata_type2)(void*, const char_type*, value_type);
492
493
  /** \brief Callback type with user data (not null) used for functions taking a string and two values as arguments. */
494
  typedef value_type(*strfun_userdata_type3)(void*, const char_type*, value_type, value_type);
495
496
  /** \brief Callback type with user data (not null) used for functions taking a string and a value as arguments. */
497
  typedef value_type(*strfun_userdata_type4)(void*, const char_type*, value_type, value_type, value_type);
498
499
  /** \brief Callback type with user data (not null) used for functions taking a string and two values as arguments. */
500
  typedef value_type(*strfun_userdata_type5)(void*, const char_type*, value_type, value_type, value_type, value_type);
501
502
  /** \brief Callback type with user data (not null) used for functions taking a string and five values as arguments. */
503
  typedef value_type(*strfun_userdata_type6)(void*, const char_type*, value_type, value_type, value_type, value_type, value_type);
504
505
  /** \brief Callback used for functions that identify values in a string. */
506
  typedef int (*identfun_type)(const char_type* sExpr, int* nPos, value_type* fVal);
507
508
  /** \brief Callback used for variable creation factory functions. */
509
  typedef value_type* (*facfun_type)(const char_type*, void*);
510
511
  static const int MaxLenExpression = 20000;
512
  static const int MaxLenIdentifier = 100;
513
  static const int MaxNestingDepth = 1000;
514
515
  static const string_type ParserVersion = string_type(_T("2.3.6 (Development)"));
516
  static const string_type ParserVersionDate = string_type(_T("20260410"));
517
} // end of namespace
518
519
#if defined(_MSC_VER)
520
  #pragma warning(pop)
521
#endif
522
523
#endif
524