154 Commits

Author SHA1 Message Date
62a094f2c6 WIP: add a Val struct as an input/output when calling a function 2025-01-31 17:10:40 +01:00
b646287c9b WIP: add a Val struct as an input/output when calling a function 2025-01-30 18:05:37 +01:00
44ea6a162e WIP: add a Val struct as an input/output when calling a function 2025-01-29 16:59:40 +01:00
32d9fdc816 WIP: add a Val struct as an input/output when calling a function 2025-01-28 16:46:19 +01:00
1f2b5c8d12 WIP: add a Val struct as an input/output when calling a function 2025-01-24 19:40:52 +01:00
37f78ad8e0 WIP: add a Val struct as an input/output when calling a function 2025-01-23 07:12:57 +01:00
8819adbb3f WIP: add a Val struct as an input/output when calling a function 2025-01-15 18:29:46 +01:00
19d33139fc WIP: add a Val struct as an input/output when calling a function 2025-01-15 17:17:34 +01:00
ec45ae971e WIP: add a Val struct as an input/output when calling a function 2025-01-15 09:19:24 +01:00
dc2ee61a23 WIP: add a Val struct as an input/output when calling a function 2025-01-03 17:32:59 +01:00
345e1870e3 WIP: add a Val struct as an input/output when calling a function 2024-12-13 15:47:54 +01:00
6f75664400 WIP: add a Val struct as an input/output when calling a function 2024-12-12 17:57:24 +01:00
0ac4df97e9 WIP: add a Val struct as an input/output when calling a function 2024-12-11 17:29:32 +01:00
6e2fe34a5c WIP: add a Val struct as an input/output when calling a function 2024-12-11 17:04:05 +01:00
079a62c230 WIP: add a Val struct as an input/output when calling a function 2024-12-09 16:36:53 +01:00
5d5d5bcdde rename the FunInfo struct to Env 2024-12-06 12:20:55 +01:00
e39311c290 WIP: use pt::Stream instead of a template argument 2024-12-05 17:48:06 +01:00
d9ffe9b00a print qt environment ids only when .qtcreator directory was created 2024-09-25 09:49:50 +02:00
51a61925d3 fix: set a correct global working dir when generating a .clangd file 2024-09-24 23:40:47 +02:00
bfb41cf50b use a QTCreator environmentid and a profileid from a local installation
When creating QTCreator project files use local EnvironmentId
and default profile id. By default the environment id is stored
in ~/.config/QtProject/QtCreator.ini and the profile id in
~/.config/QtProject/qtcreator/profiles.xml.
2024-09-24 16:44:01 +02:00
ca37997809 sort a makedepend output
Makefile.dep is sorted now - it's better when making a diff to the previous version.
2024-09-22 15:24:34 +02:00
da8c33b14c add a clangd and qtcreator make targets
Add a clangd make target:
$ make clangd
This installs a .clangd file with configuration (includes/macros/compiler flags)
for the clandg language server.

Add a qtcreator make target:
$ make qtcreator
This installs a .qtcreator directory with QTCreator IDE project files.
In the QTCreator you can open a project by selecting the .qtcreator/ezc.creator
file.

You can use 'make qtcreator' again to refresh .qtcreator/ezc.files,
the rest of the project files will not be modified.
2024-09-22 11:33:04 +02:00
0de5623182 make some more optimizations when generating the output 2024-07-08 00:34:52 +02:00
6def06c647 make some optimization when generating the output
Add three methods to the Generator:
- void OnlyFrames(const std::vector<std::wstring> & frames);
- void OnlyFrames(const std::vector<std::wstring> * frames);
if provided frames then only such frames will be generated,
call OnlyFrames(nullptr) to disable it (default)

- void UseMainStream(bool use_main_stream);
whether or not the main stream should be produced (true by default)
2024-07-07 21:55:49 +02:00
d6ca791fbc make depend 2024-05-31 00:24:32 +02:00
3001707c69 add QT Creator files to .gitignore 2023-10-22 23:37:18 +02:00
5814bfca0d fix: correctly initialize FunInfo<> object when calling a model field 2023-02-22 00:38:36 +01:00
369cefacdf fix: do not evaluate content in [for] statement if the function was not found 2022-08-01 15:20:02 +02:00
43fbf3b56c make depend 2022-07-30 03:32:45 +02:00
d023abce74 fix: set the last boolean result when evaluating a space structure 2022-07-29 03:24:19 +02:00
3095d2d31f add LICENSE file 2022-07-03 10:59:48 +02:00
08da4a56b8 change licence from 3-Clause BSD to 2-Clause BSD 2022-07-03 08:54:36 +02:00
cd4d8e025d add src/version.h with macros: EZC_VERSION_MAJOR, EZC_VERSION_MINOR, EZC_VERSION_PATCH 2022-06-30 13:20:57 +02:00
a03e3f5d21 add global Makefile
src/Makefile uses now 'find' for looking for *.cpp files
and we don't need Makefile.o.dep anymore
2022-06-26 06:16:09 +02:00
c31c7dfb63 make depend 2022-04-26 23:48:00 +02:00
0c058d4313 added to Models: ModelsMap & GetMap() 2021-10-12 19:56:59 +02:00
d8692f6ed5 added options: "index" and "index-one" for space tables e.g. [table_name "index-one"] 2021-09-23 14:03:26 +02:00
b047a10e8d added: "this" virtual field for a table - only if the next field is not an object
e.g.:
       [for space_object]
       	    [space_object.this] instead of [space_object "current"]
       [end]
       "this" can be nested, e.g. if we have two nested tables:
       [for space_object]
          [for space_object.this]
             [space_object.this.this]
          [end]
       [end]

removed: "current" parameter for tables
2021-09-23 04:02:34 +02:00
a983698e3d Generator: some methods take std::vector<Var> parameters not through a reference 2021-08-17 17:33:51 +02:00
6a8cb019f5 added parameters "only_date" and "only_time" when printing a pt::Date 2021-08-14 19:40:05 +02:00
b0afdf7f0f check block arguments e.g. [1] at the beginning - before all other lookups 2021-08-14 17:44:11 +02:00
b956f1c401 fixed: fields table was not copied in Item::Function::operator=(...) 2021-08-14 17:40:40 +02:00
5e47313af8 fixed: when incrementing space tables iterators in [for] statements we should invalidate indices for nested tables 2021-08-13 21:44:07 +02:00
44407c2a4b changed: added two new parameters to Generator class: template<class StreamType, bool is_pikotools_stream = false, bool is_autoescape_stream = false> class Generator
changed: added one new parameter to Outstreams class: template<class StreamType, bool is_pikotools_stream = false> class OutStreams
removed macros: EZC_GENERATOR_HAS_PT_STREAM, EZC_GENERATOR_HAS_WINIX_STREAM
2021-07-12 23:00:11 +02:00
ae6a5c52a1 fixed in Generator: ezc_frames_stack_index was not initialized 2021-07-06 23:56:29 +02:00
9f416d31de Merge branch 'api2021' 2021-07-06 22:46:36 +02:00
b9b9a881e0 added "roman" and "no_sec" parameters when serializing a date 2021-07-06 21:47:42 +02:00
995cccdace add two new ezc statements: [if-def ...] and [if-not-def ...]
[if-def my_function] returns true if my_function is defined somewhere (either a model, model container, space, date, block, function or variable)
add support for "noescape" or "raw" parameters to Space fields
fixed: CallWrapper() didn't return a status if a model/space/date/container was found
2021-07-02 20:23:20 +02:00
849b3e9ecc changed the way how we iterate through Models, instead of ModelWrapper now we have Wrapper which has pointers to: model, model container, space or date 2021-07-01 23:21:20 +02:00
acb42f453c added support for two new ezc statements for clearing/trimming text nodes
[ezc clear_all_white_nodes "yes"]...[end] - will clear a text node if the text consists of only white characters
[ezc trim_text_nodes "yes"]...[end] - will trim text nodes (removes white characters at the beginning and at the end)

"yes" is assumed by default if not present, also "no" can be specified to change the behavior
2021-06-29 23:38:38 +02:00
c2283f70d4 Generator when printing Model/Space is recognizing now such parameters:
- "dump" or "dump_to_space" parameters to make a dump in Space format
- "dump_to_json" parameter to make json dump
- "pretty" parameter to make the dump pretty (with new lines and indents)
2021-06-27 22:42:00 +02:00
3926793a17 fixed in Generator::CallSpace() when a middle field was a table: last_res should be set only for last field
refactoring in Generator::CallSpace()
2021-06-25 16:16:30 +02:00
5bd8eef3f2 make depend 2021-06-24 20:53:26 +02:00
16bce07c75 fixed: in Space::CallSpace() we should not increment field index when a new table item is prepared 2021-06-23 21:56:04 +02:00
87ee461dd1 make depend 2021-06-23 17:02:19 +02:00
526d57b72e added possibility to take a Space struct in Models: Models::Add(const std::wstring & name, pt::Space & space); 2021-06-23 06:53:43 +02:00
eda276356f added possibility to iterate through Space object in Models objects 2021-06-22 18:01:47 +02:00
e442ee4720 make depend 2021-06-20 16:55:39 +02:00
615bad7372 renamed macro: EZC_HAS_SPECIAL_STREAM -> EZC_GENERATOR_HAS_PT_STREAM
added macro EZC_GENERATOR_HAS_WINIX_STREAM which is used by Generator::CopyStream(pt::WTextStream & src_stream, StreamType & dst_stream, bool should_escape)
if this macro is defined then Generator is able to escape output stream
2021-06-20 16:54:55 +02:00
9c4fe51790 Generator uses now pt::Log as a logger
- added method SetLogger(pt::Log & logger)
- removed SetCommentary(...) methods
- added logs when a model is not found

PatternParser uses only pt::Log
- removed SetCommentary(...) methods
2021-06-19 20:18:30 +02:00
d76bb9349b added typename keyword to Generator::CallModelHelper Generator::FindLastModelWrapper(...) 2021-06-18 18:55:39 +02:00
4a64336864 added support for morm containers with pointers to models 2021-06-17 21:33:28 +02:00
abb60def6e added .editorconfig file 2021-06-16 14:21:08 +02:00
9022d4a5fc changed how models from morm library are used
now we are using morm::ModelWrapper... classes as wrappers on models and list/vector of models
and Models class is using these wrappers
this allows us to iterate through list/vectors in [for...] statements
2021-06-16 14:16:49 +02:00
e6fd9aad37 added basic support for calling variables and functions from morm::Model objects 2021-05-31 18:37:09 +02:00
3b858650f2 Merge branch 'api2021' 2021-05-28 16:11:50 +02:00
052f803eac renamed [ezc out ...] statement to [ezc frame ...], similar [out ...] to [frame ...] 2021-05-28 16:10:16 +02:00
0bcaca4770 Merge pull request 'api2021 part I' (#5) from api2021 into master
Reviewed-on: #5
2021-05-27 10:41:16 +02:00
0ac8e05c04 changed semantic of [def] statements:
- [def] is used to define a variable (like before)
  but if we assign a string such as [def var "string"] the string is evaluated to bool
  in a different way: empty string is false, not empty string is true
- added [def?] statement - similar like [def] but define a variable only if such
  a variable is not already defined
- added [let] statement - similar like [def] but with lazy evaluation (it is an alias to a function)
  if it is called to assign a string e.g. [let var "string"] then this has the
  same meaning like [def] - an alias is only created when we assign a function e.g. [let var my_function]
  both [def] and [let] are using the same Vars object
- added [let?] - make an alias but only if such a variable is not already defined
- a std::map of variables moved outside of Generator
  added method void SetVariables(Vars & variables);
- fixed: a result status was not correctly propagated when evaluating [def] statements,
  this was in Call(...) function: last_res from variables was set in Find()
  but later was overwritten by Call(...) called for parameters (recursively)
2021-05-23 10:02:51 +02:00
6f6df9524c updated to the new pikotools api: changed utf8 functions PascalCase to snake_case 2021-05-21 00:32:05 +02:00
cd1c24d0a5 updated to new pikotools api: namespace PT renamed to pt 2021-05-20 16:12:41 +02:00
d1a15ad153 make depend 2021-05-14 21:02:56 +02:00
29c7163d9b updated to the new pikotools api (api2021 branch) 2021-05-14 21:02:27 +02:00
b289aa7f0a added .gitignore file 2021-02-17 17:06:12 +01:00
9e82aa9bcf src/Makefile.dep
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1173 e52654a7-88a9-db11-a3e9-0013d4bc506e
2019-03-06 18:20:12 +00:00
632c81812f Makefile.dep
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1166 e52654a7-88a9-db11-a3e9-0013d4bc506e
2019-01-11 19:09:43 +00:00
1e85922d4e changed: PatternParser now uses Log from pikotools
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1153 e52654a7-88a9-db11-a3e9-0013d4bc506e
2018-11-23 18:33:17 +00:00
bf62d44346 fixed: program_mode was not set in cctor
fixed: container was not correctly parsed (in template mode)




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1139 e52654a7-88a9-db11-a3e9-0013d4bc506e
2018-11-01 21:52:33 +00:00
a6b767a223 some work on a 'program mode'
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1136 e52654a7-88a9-db11-a3e9-0013d4bc506e
2018-10-30 20:59:17 +00:00
c825c85878 start working on a 'program mode'
a new syntax for simple scripting



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1134 e52654a7-88a9-db11-a3e9-0013d4bc506e
2018-10-29 23:50:10 +00:00
54387e43bb Makefile.o.dep
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1110 e52654a7-88a9-db11-a3e9-0013d4bc506e
2018-05-10 17:25:04 +00:00
eace4d41cc changed: in PatternParser: the way how nested ezc funcions are parsed
now we can have: [fun] [[fun]] or even [[[fun]]]
         also when using keywords: [if fun] [if [fun]] or [if [[[[fun]]]]]




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1041 e52654a7-88a9-db11-a3e9-0013d4bc506e
2016-08-25 13:11:33 +00:00
363605bde5 changed: a function can have a postfix now e.g. [my_function:my_postfix]
this will be mainly used in conjuction with [for ...] statements

[for my_function:xxx]
  [for my_function]
    [my_function_value]
    [my_function_valu:xxx] (references the first loop)
  [end]
[end]

added: to FunInfo<>: a reference to current item from a pattern (const Item & item)
       similary on the stack is added a pointer to an item
       by having this reference you can compare a function's name and its postfix
       added methods:
       Stack * FindLastFor(const std::wstring & name);
       Stack * FindLastFor(const std::wstring & name, const std::wstring & postfix);
       template<class FunUserObject> FunUserObject * FindUserObject(const std::wstring & function_name, Stack ** ezc_stack = 0);




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1038 e52654a7-88a9-db11-a3e9-0013d4bc506e
2016-04-04 15:53:11 +00:00
18696d412b added a 'for_name' (std::string*) in Stack
this is a user defined name of a [for] statement



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1037 e52654a7-88a9-db11-a3e9-0013d4bc506e
2016-03-23 15:22:59 +00:00
2190fae789 changed: using relative paths calculated with relative_path now
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1032 e52654a7-88a9-db11-a3e9-0013d4bc506e
2016-03-18 09:22:13 +00:00
0e99ded5b8 added: include path to ezc to Makefile (it is referenced from Winix)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1022 e52654a7-88a9-db11-a3e9-0013d4bc506e
2016-02-01 11:12:26 +00:00
a1ea2e3ccd changed: OutStreams<>::streams_map should not have null pointers to StreamType objects
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1018 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-11-16 12:09:34 +00:00
0dc807dbff some #include moved in other places
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1016 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-11-15 21:45:49 +00:00
c3deb960c5 fixed: 'typename' keyword is missing in some places
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1015 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-11-12 11:08:53 +00:00
7b6f7ad328 changed: [ezc streams "..."] to [ezc out "..."] or just [out "..."]
the syntax has been changed, now [ezc ...] is used with [end] statement
added: OutStreams<StreamType> class with a pool with output streams,
the Generator::Generate() method can take it as its argument
(Generator API has been changed)



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1014 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-11-12 09:53:20 +00:00
76490d4c19 added: now ezc functions can be methods of a special object
added: objects.h with a base class for the object
       and Objects container (similar as Functions container)



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1011 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-06-14 18:20:00 +00:00
6b42cdf76e changed: the way how functions' arguments are parsed
now this [fun1 fun2 "something" fun3]
         will call fun1 with three arguments: fun2, "something" and fun3
         and this [fun1 [fun2 "something"] fun3]
         will call fun1 with two arguments: [fun2 "something] and fun3
         "something" is an argument for fun2 function
removed: statements: [if-one] [if-any] [if-no] [if-any-no] [if-one-no]



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1004 e52654a7-88a9-db11-a3e9-0013d4bc506e
2015-03-08 02:31:21 +00:00
b519c79a3e removed: statements: [if-index ...] [is ...] and [is-no ...]
we can provide a user definied function which does the same
added:   to FunInfo<>:
         Stack * stack_tab
         size_t stack_index
         a stack table and an index to the current stack item



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@988 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-11-02 17:26:56 +00:00
6f1e2eb518 removed: svn:executable atribute from files
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@987 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-11-01 17:14:39 +00:00
ad50c01b15 deleted: vars.h and vars.cpp as they are not needed now
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@982 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-28 17:52:45 +00:00
0a7bd3159a added: [return ...] statement for a block
changed: a user definied function now is able to get a string and a boolean value (parameters)
changed: we do not longer support aliases for variables
         a variable is only a string and a boolean value now



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@981 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-28 17:46:24 +00:00
6bd8889456 fixed: in cache.cpp there was headerfile_ezc_cache macro used
(copied from cache.h)
fixed: in Generator: memory leak from block_stack
       objects pointing by block_stack_tab[].out_stream
       were not deleted
fixed: in Item: ClearCache() didn't clear all pointers
       Function::parameters table were not used




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@979 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-21 07:21:20 +00:00
03fe124ad9 fixed: function and blocks were incorrectly cached
(now we have a tree in Item::Function.parameters too
        and we should go through that tree as well)
fixed: in Generator: Item::Function.par should be cleared
       only if Item::Function.name is not empty
changed: in Generator: use method 'write' of an output stream
       instead of operator<<
added: Clear() method to Blocks class
changed: in Generator
       Generator has its own Vars class now
       we don't need SetVars() method
added: to Generator:
       void CanUseCache(bool can_use_cache);
       // set whether or not we can use cache for functions or blocks
       // true by default

       void CanUseVars(bool can_use_variables);
       // set whether or not we can use variables: [def ...] statement
       // true by default





git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@977 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-19 21:09:34 +00:00
6f9f274e08 removed: AssignString() functions
now we are using UTF-8 <-> wide characters conversions



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@976 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-19 05:46:49 +00:00
2fca5f3492 changed: SetCommentary() methods from Pattern were moved to PatternParser and Generator
added:   caching functions and blocks
         caching is added into Pattern and Blocks
         methods: CacheFunctions() and CacheBlocks()
		 




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@975 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-19 05:42:25 +00:00
ad2fb11a5c fixed: compile error in item.h (in CacheFunctions)
fixed: Pattern::ClearCache() was missing



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@973 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-17 23:56:30 +00:00
00f8af232b fixed: a 'typename' keywords were missing in some places
fixed: removed GetStringFromStream() method 
       it returns a reference to a local object (from stream.str())
       now the code is used directly




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@972 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-17 22:14:28 +00:00
429021f687 changed: a header info in each source file to:
* This file is a part of EZC -- Easy templating in C++ library
 * and is distributed under the BSD 3-Clause licence.




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@971 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-17 21:48:11 +00:00
71c5bd11d5 added: possibility to define a block
changed: in Functions
         Functions are only for user-defined functions now
         (before they could remember a string variable too)
added:   class Vars for variables
         a variable can be a string or an alias to an other function or block
added:   now we can have nested functions calls e.g.:
         [function1 [function2]]
         in the above example an output (stream) from function2 will be passed
         as the first argument to funcion1 (will be passed as a string)
removed: UTF8() method from PatternParser
         now it is treated that when we have only std::string (or char*)
         that this is an UTF-8 string




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@970 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-17 21:36:55 +00:00
b5faf171e3 changed: Pattern class has been split into two classes: Pattern and PatternParser
in Pattern we have only the tree
         in PatternParser there is the whole logic used to parse a file


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@969 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-11 19:56:48 +00:00
fd75a1f119 copied: pattern.cpp -> patternparser.cpp
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@968 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-11 19:01:17 +00:00
d9a8426ebc copied: parser.h -> patternparser.h
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@967 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-11 19:00:57 +00:00
759be64379 changed: now Patterns are read with UTF-8 enabled by default
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@966 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-09 20:46:58 +00:00
ef16ae4ebd added: prefix/namespace Winix:: when using winix logger
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@449 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-12 16:26:48 +00:00
417e52a5a1 added some files/directories to svn:ignore
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@447 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-25 03:39:51 +00:00
5de31cfe41 fixed: renamed a local variable in Generator (it did not compile)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@446 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-17 21:53:53 +00:00
9215130b9d added: possibility to generate output to more than one stream
Generate() methods can take std::vector with pointers to streams
added: 'ezc' keyword -- currently only for selecting streams
       e.g.
       [ezc stream "0" "3"] - after now the output is generated to streams 0 and 3
  


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@445 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-07 10:16:10 +00:00
23ce3e83df changed: if EZC_USE_WINIX_LOGGER macro is defined then we add -I../../winix flag
for compiling



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@442 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-10-15 23:48:06 +00:00
ac37982ee7 fixed: in Generator: empty_stream() should be inited with its default cctor
(an error when compiling with clang)



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@420 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-06-30 23:24:09 +00:00
68c1fb8ef8 fixed: Generator: when making [if-index]
[if-index] statement has to look for a last [for] statement on the stack
       (because the stack is for all items now)


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@394 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-03-03 20:58:55 +00:00
787b5e99b2 changed: in Generator:
now we have a stack item for all statements [if...] [normal_fun] etc.
         previously was only for [for ...] statements
changed: FunInfo<> has a pointer to the current stack item
changed: now we have a static number of stack items (default: 300)
         so you can remember a pointer to a stack item and this pointer 
         is always valid


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@393 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-02-27 17:39:46 +00:00
4fc842ad91 added: to FunInfo<>:
bool remove_fun_data
       fun_data is removed only when remove_fun_data is true (default)


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@392 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-02-25 03:29:44 +00:00
8e85a398d6 added: FunInfo<>::fun_data
now we have a pointer to FunData struct
         by default the pointer is null
         you can create an object of a class derived from FunData
         an set the pointer to the object
         those pointers will be kept on the [for] stack
         and will be auto removed
         (not finished yet -- need some testing)
added:   to FunInfo<>::
         bool is_if;
         bool is_is;
         bool is_normal;
         bool is_filter;
removed: from FunInfo<>:
         bool is_for_first_iter;
changed: in FunInfo<>:
         int iter -> size_t iter
         now it indicates the number of a current iteration for the [for] statement 
         for other statements than [for] this is always zero
         (the same old behaviour as before revision 331)
added:   in FunInfo<>:
         size_t last_iter
         it indicates the number of a previous [for] iteration
         for a [for] it returns not the current iterator but a value from a previous [for]



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@391 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-02-24 12:04:36 +00:00
4480268172 added: two flags to FunInfo<> struct:
// indicates that this function is from [for ...] statement
       bool is_for;

       // indicates that this function is from [for ...] statement
       // and this is a first iteration (iter=0 too)
       // this is only for convenience -- you don't have to check is_for and iter==0
       bool is_for_first_iter;



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@380 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-17 22:57:06 +00:00
71bec1049b updated Makefile
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@378 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-12 03:20:01 +00:00
a728f86e05 now ezc is using 'pikotools' (utf8)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@372 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-12 02:32:04 +00:00
2c3a2160af moving utf8.cpp from ezc to pikotools
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@367 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-11 11:15:36 +00:00
faaac0de8a moving utf8.h from ezc to pikotools
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@366 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-11 11:15:20 +00:00
c6b4db0aa9 added: methods Begin() and End() to Functions<>
we can iterate through the whole functions table


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@360 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-01-06 12:05:10 +00:00
b4f7d4b8de added: size_t UTF8ToInt(const char * utf8, int & res, bool & correct)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@359 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-08-27 19:14:20 +00:00
542587e5e8 deleted debug log
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@358 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-07-15 02:09:40 +00:00
fb05eb6860 added some debug log
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@357 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-07-13 23:15:12 +00:00
8df9aa86a0 small changes in Makefile
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@356 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-06-06 20:36:19 +00:00
2d304a9714 changed to UTF-8: added support for UTF-16 when wchar_t is 2 bytes long
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@345 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-05-25 21:43:40 +00:00
861269383e changed: [is...] statements use only the output string now (when comparing)
previously they used FunInfo::res, now they use FunInfo::out
         and the out string is not put to the main output stream
added:   FunInfo<>::case_sensitive (default true)
         when false then [is] statement is comparing in case insensitive manner
changed: the out stream in [if...] [for] statements
         the output text is ingored now



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@344 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-04-26 17:17:06 +00:00
542e50d757 added filters:
a new statement [filter]
 syntax:
 [filter funcion_name]....[end]
 everything which is between [filter] and [end] is processed normally and
 at the end it is passed to the function (function_name)
 FunInfo struct has 'in' input stream now



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@333 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-01-26 12:42:49 +00:00
3c85fa1a75 fixed: the exception for if-index in pattern (when caching is used)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@332 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-01-23 14:16:49 +00:00
fd2194623a changed: now [for] statements with the same function can be nested
sample:
[for my_function]
 [for my_function]
   foo
 [end]
[end]

changed: FunInfo::iter has a value from the last [for] statement now
sample:
[for my_function]
 [other_function]
[end]

void other_function(Info &i)
{
// here i.iter is the number of iteration
// previously was always zero
}

changed: small optimization in [for]
the proper function is being looking for only once at the beginning
previously it was searched in each iteration



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@331 e52654a7-88a9-db11-a3e9-0013d4bc506e
2011-01-14 23:59:30 +00:00
c4f5f79218 fixed: Item::Item(const Item & i) should clear the item table
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@330 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-12-06 00:22:38 +00:00
0b09b5454f added: Pattern::CacheFunctions(Functions<StreamType> & fun)
you can cache all functions (their addresses) in the pattern

changed: now we have two methods for generating content:
       Generator<>::Generate(StreamType & o, Pattern & p, Functions<StreamType> & f);
       similar like previous -- Set(...) methods were removed as well as the second ctor 

       and a second one:
       Generate(StreamType & o, Pattern & p);
       without functions, the functions should be cached beforehand in the pattern
       by calling CacheFunctions() method on the pattern
       this gives O(1) complexity when looking for a specific function
       previously was O(log n) 
       


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@329 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 22:39:58 +00:00
5108495540 changed in Generator<>:
StreamType
 we use method write where the content should not be escaped (html escaping)
 we use operator<< where the content can be escaped (such as error messages)

PrintSpecialText() and PrintNormalText() are a little faster now
we use 'write' for a whole text instead of printing each character



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@328 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 01:55:32 +00:00
33c86d494b fixed: performance (memcpy used too often)
in some places there were reserve() method used (on std::wstring/std::string objects)
         especially in AssignString() methods
         if we add a new string we should check the new size
         and only call reserve() if the new size will be greater than existing one
         (plus some constant)
added:   Functions<>::Size() method



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@327 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-23 21:59:52 +00:00
8f94937ed1 added: support for UTF-8 (files utf8.h utf8.cpp)
they can be even used without the rest library
         as only a library for converting between wide characters and UTF-8
changed: everywhere we use std::wstring instead of std::string
changed: Generator and Functions are templates now
         they take a stream type
renamed: Info to FunInfo and it is a template too
         taking a stream type

now you can use other kind of streams with the library
previous was only std::ostringstream



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@326 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-22 01:23:32 +00:00
b5ea2514e2 added to Generator:
void RecognizeSpecialChars(bool spec);
  recognizing some special characters in text patterns (item_text in Patterns)
  \r will be a carriage return (13)
  \n will be a new line (10)
  \t will be a tabulator (9)
  \s will be a space
  \\ will be one '\'
  default: false

void TrimWhite(bool trim);
  trimming white characters (at the beginning and at the end of an item_text)
  (special char \s if enabled is not treated as a white character here)
  default: false 

void SkipNewLine(bool skip);
  skipping new line characters (from the whole string in an item_text)
  but you can use a new line character written as "\n" (if special chars are turn on)
  default: false
						       


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@305 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-09-07 23:52:41 +00:00
376fe414f8 small refactoring: changed item_table to item_tab
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@300 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-08-17 23:22:55 +00:00
7554630395 changed: testing file names
now it is allowed to use a slash (we can use directories)
only ".." is not allowed (you cannot go up in a directory structure)


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@299 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-08-02 18:47:19 +00:00
573d241dc1 changed:
functions can have more than one parameter and the parameters can be used in [if...] statements too

sample:
[normal_function "par1" "par2" "par3"]
[if-one function "par1" "par2" "par3"]...[end]

each function can have its own parameters:
[if-one function1 "par1" "par2" "par3" function2 "par" "par2"]...[end]

changed:
[is] is now [if] (not exactly but very similar)
[is-no] is now [if-no] (the same)

[if] and [if-no] are taking one function (with or without arguments)
sample:
[if function]...[end]
[if function "par1"]...[end]
[if function "par1" "par2" "par3" "par4"]...[end]

[is] is taking two functions now and evaluates them to boolean value
(variables are also evaluated to boolean - if not empty that means true)

[is function1 function2]...[end]
[is variable1 variable2] either variable1 and variable2 are empty or both are not empty
(they don't have to be equal)[end]

added:
[if-any-no fun1 fun2 fun3] the three functions have to return false [end] 
[if-one-no fun1 fun2 fun3] one the the three functions have to return false [end]

removed:
extracting the unix directory from the file name (in patterns)
you have to call Pattern::Directory() method first to set directories



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@298 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-07-19 23:07:00 +00:00
c807d1c9b3 as a white character can be ascii 160 code (nonbreakable space)
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@297 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-06-30 18:43:33 +00:00
b89c6daa7d added: an optional string parameter to normal statement e.g. [function "parameter"]
parameters to "for" statement  [for function "parameter"]
changed: in Info struct there is a "par" std::string reference now
changed: Info::result to Info::res
removed: Info::is


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@295 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-05-30 21:07:15 +00:00
f65178dd0e fixed: when Pattern::allow_include was false then nothing was read
added: ezc can use the logger from winix
added: we check how many [include] directive was called
       (if more than 100 then we break - supposing infinite loop)
added: in Pattern we read from two directories
       if a file is not in the first directory then we try to read
       from the other one




git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@292 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-02-15 00:19:31 +00:00
bb00f23f29 changed: limits in generator
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@291 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-02-13 19:55:51 +00:00
31156d33f3 added: directive [is-no ...] negative to [is ...]
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@290 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-02-11 20:03:51 +00:00
e71c213ad1 added: Pattern::Clear()
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@282 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-01-28 16:14:47 +00:00
b2aacc2da3 changed: [is ...] command
struct Info doesn't have out_string now



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@281 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-01-25 05:19:54 +00:00
dbe91a6d91 added: Patter::delete_all_white flag
if true all text-items which have only white characters (with new lines as well)
       will be deleted
       this not actually delete the whole item but only the string
       the item will be present with an empty string
       default: false



git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@260 e52654a7-88a9-db11-a3e9-0013d4bc506e
2009-12-09 00:34:17 +00:00
9b4586d7be small changes in Makefile
git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@241 e52654a7-88a9-db11-a3e9-0013d4bc506e
2009-11-13 21:10:06 +00:00
141e1f67b3 added: Pattern::allow_include flag (default true)
if false there is no allowed [include ...] directive
       (this directive will be skipped)
added: Pattern::ParseString(const std::string & str);
       Pattern::ParseString(const char * str);
       can create the pattern from a string


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@94 e52654a7-88a9-db11-a3e9-0013d4bc506e
2009-01-23 23:18:54 +00:00
f8f55eae77 added: src/Makefile and src/Makefile.dep
the ezc.a library is built now


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@93 e52654a7-88a9-db11-a3e9-0013d4bc506e
2008-12-30 01:21:30 +00:00
0b88257e08 added: directive [if-no fun1 fun2 ...]
if fun1 fun2 ... return false
       then the content is evaluated
changed: [if-one fun1 fun2 ...]
       when a function (from left to right) returns true 
       then the content is evaluated
       (previous all functions were called)


git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@91 e52654a7-88a9-db11-a3e9-0013d4bc506e
2008-12-23 20:08:11 +00:00
43 changed files with 10173 additions and 1441 deletions

21
.editorconfig Normal file
View File

@@ -0,0 +1,21 @@
# EditorConfig
# https://editorconfig.org/
# https://editorconfig-specification.readthedocs.io/
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
# 4 space indentation
[*.{h,cpp,html,css,js,conf,txt}]
indent_style = tab
indent_size = 4
# Tab indentation (no size specified)
[Makefile]
indent_style = tab
indent_size = 4

8
.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
.cproject
.project
.settings/
*.o
*.a
/.clangd
/.qtcreator/
/.qtc_clangd/

2
.templates/.clangd Normal file
View File

@@ -0,0 +1,2 @@
CompileFlags:
Add: [-pthread, -std=c++20, -I%%%CURRENT_DIR%%%/src, -I%%%GLOBAL_WORKING_DIR%%%/pikotools/src, -I%%%GLOBAL_WORKING_DIR%%%/morm/src, -I/usr/include, -I/usr/local/include, -DEZC_HAS_MORM_LIBRARY, -DMORM_HAS_EZC_LIBRARY]

View File

@@ -0,0 +1 @@
-std=c20

View File

@@ -0,0 +1 @@
#define EZC_HAS_MORM_LIBRARY 1

View File

@@ -0,0 +1 @@
[General]

View File

@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 14.0.1, 2024-09-20T16:21:10. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">%%%QT_ENVIRONMENT_ID%%%</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">3</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">%%%QT_DEFAULT_PROFILE_ID%%%</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">%%%CURRENT_DIR%%%</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand">/usr/local/bin/gmake</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand">/usr/local/bin/gmake</value>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Default</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@@ -0,0 +1 @@
-std=c++20

View File

@@ -0,0 +1 @@

View File

30
.templates/install_clangd.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/sh
CURRENT_DIR=$(pwd)
GLOBAL_WORKING_DIR=$(realpath ${CURRENT_DIR}/..)
# ----------
# make sure the current directory is correct
if [ ! -d ${CURRENT_DIR}/.templates ] ; then
echo "this script should be called by make: make clangd (one level up)"
exit 1
fi
# change / to \/ in paths
CURRENT_DIR_FOR_SED=$(echo ${CURRENT_DIR} | sed 's/\//\\\//g')
GLOBAL_WORKING_DIR_FOR_SED=$(echo ${GLOBAL_WORKING_DIR} | sed 's/\//\\\//g')
if [ -f "${CURRENT_DIR}/.templates/.clangd" ] ; then
if [ ! -f "${CURRENT_DIR}/.clangd" ] ; then
cat "${CURRENT_DIR}/.templates/.clangd" | \
sed -e "s/%%%CURRENT_DIR%%%/${CURRENT_DIR_FOR_SED}/g" \
-e "s/%%%GLOBAL_WORKING_DIR%%%/${GLOBAL_WORKING_DIR_FOR_SED}/g" > \
${CURRENT_DIR}/.clangd
echo "added a ${CURRENT_DIR}/.clangd file"
fi
fi

99
.templates/install_qtcreator.sh Executable file
View File

@@ -0,0 +1,99 @@
#!/bin/sh
CURRENT_DIR=$(pwd)
GLOBAL_WORKING_DIR=$(realpath ${CURRENT_DIR}/..)
QTCREATOR_DIR=${CURRENT_DIR}/.qtcreator
# ----------
# make sure the current directory is correct
if [ ! -d ${CURRENT_DIR}/.templates ] ; then
echo "this script should be called by make: make qtcreator (one level up)"
exit 1
fi
qtcreatorini=~/.config/QtProject/QtCreator.ini
qtprofiles=~/.config/QtProject/qtcreator/profiles.xml
if [ ! -f "$qtcreatorini" ] ; then
echo "I cannot find a $qtcreatorini file"
echo "this file is needed to take an EnvironmentId parameter"
echo "if QTCreator was recently installed make sure you have opened it at least once"
exit 2
fi
if [ ! -f "$qtprofiles" ] ; then
echo "I cannot find a $qtprofiles file"
echo "this file is needed to take a default profile id parameter"
echo "if QTCreator was recently installed make sure you have opened it at least once"
exit 3
fi
qtenvironmentid=`grep -F 'Settings\EnvironmentId' "$qtcreatorini" | grep -Eo '\{[a-zA-Z0-9-]+\}'`
qtdefaultprofileid=`grep -A 1 -F '<variable>Profile.Default</variable>' "$qtprofiles" | tail -n 1 | grep -Eo '\{[a-zA-Z0-9-]+\}'`
if [ -z "$qtenvironmentid" ] ; then
echo "I cannot read a Settings\EnvironmentId parameter from $qtcreatorini file"
exit 4
fi
if [ -z "$qtdefaultprofileid" ] ; then
echo "I cannot read a Profile.Default parameter from $qtprofiles file"
exit 5
fi
# change / to \/ in paths
CURRENT_DIR_FOR_SED=$(echo ${CURRENT_DIR} | sed 's/\//\\\//g')
GLOBAL_WORKING_DIR_FOR_SED=$(echo ${GLOBAL_WORKING_DIR} | sed 's/\//\\\//g')
was_qtcreator_dir=0
if [ -d "${QTCREATOR_DIR}" ] ; then
was_qtcreator_dir=1
else
echo "Your QTCreator EnvironmentId is: $qtenvironmentid"
echo "Your QTCreator default profile id is: $qtdefaultprofileid"
mkdir -p "${QTCREATOR_DIR}"
fi
if [ -d "${QTCREATOR_DIR}" ] ; then
if [ -d ${CURRENT_DIR}/.templates/.qtcreator ] ; then
cd ${CURRENT_DIR}/.templates/.qtcreator
if [ $? -eq 0 ] ; then
for i in * ; do
if [ ! -f "${QTCREATOR_DIR}/$i" ] ; then
cat "$i" | \
sed -e "s/%%%CURRENT_DIR%%%/${CURRENT_DIR_FOR_SED}/g" \
-e "s/%%%GLOBAL_WORKING_DIR%%%/${GLOBAL_WORKING_DIR_FOR_SED}/g" \
-e "s/%%%QT_ENVIRONMENT_ID%%%/${qtenvironmentid}/g" \
-e "s/%%%QT_DEFAULT_PROFILE_ID%%%/${qtdefaultprofileid}/g" > \
"${QTCREATOR_DIR}/$i"
fi
done
if [ $was_qtcreator_dir -eq 0 ] ; then
echo "QTCreator files generated to ${QTCREATOR_DIR} directory"
echo "select an 'open project...' option and find a ${QTCREATOR_DIR}/*.creator file"
fi
fi
fi
find ${QTCREATOR_DIR} -name "*.files" | while read projectfiles ; do
cd ${CURRENT_DIR}/src
if [ $? -eq 0 ] ; then
find ../src -type f \( -iname "*.cpp" -o -iname "*.h" \) | sort > ${projectfiles}
echo "file ${projectfiles} has been updated"
fi
done
fi

View File

@@ -1,28 +1,24 @@
Copyright (c) 2007, Tomasz Sowa
Copyright (c) 2007-2022, Tomasz Sowa
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name Tomasz Sowa nor the names of contributors to this
project may be used to endorse or promote products derived
from this software without specific prior written permission.
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

32
Makefile Normal file
View File

@@ -0,0 +1,32 @@
export CXX
export CXXFLAGS
export AR
all: src
src: FORCE
$(MAKE) -C src
clean: FORCE
$(MAKE) -C src clean
depend: FORCE
$(MAKE) -C src depend
clangd: FORCE
@.templates/install_clangd.sh
qtcreator: clangd
@.templates/install_qtcreator.sh
FORCE:

45
src/Makefile Normal file
View File

@@ -0,0 +1,45 @@
sourcefiles:=$(shell find . -name "*.cpp")
objfiles:=$(patsubst %.cpp,%.o,$(sourcefiles))
ifndef CXX
CXX = g++
endif
ifndef CXXFLAGS
CXXFLAGS = -Wall -pedantic -O2 -std=c++20 -I../../pikotools/src -I/usr/local/include
endif
ifndef AR
AR = ar
endif
libname = ezc.a
all: $(libname)
$(libname): $(objfiles)
$(AR) rcs $(libname) $(objfiles)
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) -o $@ $<
clean:
rm -f $(objfiles)
rm -f $(libname)
depend:
makedepend -w 10 -Y. -I../../pikotools/src -f- $(sourcefiles) | sort -u > Makefile.dep
-include Makefile.dep

135
src/Makefile.dep Normal file
View File

@@ -0,0 +1,135 @@
./blocks.o: ../../pikotools/src/convert/inttostr.h
./blocks.o: ../../pikotools/src/convert/misc.h
./blocks.o: ../../pikotools/src/date/date.h
./blocks.o: ../../pikotools/src/membuffer/membuffer.h
./blocks.o: ../../pikotools/src/space/space.h
./blocks.o: ../../pikotools/src/textstream/stream_private.h
./blocks.o: ../../pikotools/src/textstream/stream.h
./blocks.o: ../../pikotools/src/textstream/textstream.h
./blocks.o: ../../pikotools/src/textstream/types.h
./blocks.o: ../../pikotools/src/utf8/utf8.h
./blocks.o: blocks.h
./blocks.o: cache.h
./blocks.o: env.h
./blocks.o: functions.h
./blocks.o: item.h
./blocks.o: objects.h
./blocks.o: val.h
./cache.o: ../../pikotools/src/convert/inttostr.h
./cache.o: ../../pikotools/src/convert/misc.h
./cache.o: ../../pikotools/src/date/date.h
./cache.o: ../../pikotools/src/membuffer/membuffer.h
./cache.o: ../../pikotools/src/space/space.h
./cache.o: ../../pikotools/src/textstream/stream_private.h
./cache.o: ../../pikotools/src/textstream/stream.h
./cache.o: ../../pikotools/src/textstream/textstream.h
./cache.o: ../../pikotools/src/textstream/types.h
./cache.o: ../../pikotools/src/utf8/utf8.h
./cache.o: blocks.h
./cache.o: cache.h
./cache.o: env.h
./cache.o: functions.h
./cache.o: item.h
./cache.o: objects.h
./cache.o: val.h
./functions.o: ../../pikotools/src/convert/inttostr.h
./functions.o: ../../pikotools/src/convert/misc.h
./functions.o: ../../pikotools/src/date/date.h
./functions.o: ../../pikotools/src/membuffer/membuffer.h
./functions.o: ../../pikotools/src/space/space.h
./functions.o: ../../pikotools/src/textstream/stream_private.h
./functions.o: ../../pikotools/src/textstream/stream.h
./functions.o: ../../pikotools/src/textstream/textstream.h
./functions.o: ../../pikotools/src/textstream/types.h
./functions.o: ../../pikotools/src/utf8/utf8.h
./functions.o: env.h
./functions.o: functions.h
./functions.o: item.h
./functions.o: val.h
./item.o: item.h
./models.o: models.h
./objects.o: ../../pikotools/src/convert/inttostr.h
./objects.o: ../../pikotools/src/convert/misc.h
./objects.o: ../../pikotools/src/date/date.h
./objects.o: ../../pikotools/src/membuffer/membuffer.h
./objects.o: ../../pikotools/src/space/space.h
./objects.o: ../../pikotools/src/textstream/stream_private.h
./objects.o: ../../pikotools/src/textstream/stream.h
./objects.o: ../../pikotools/src/textstream/textstream.h
./objects.o: ../../pikotools/src/textstream/types.h
./objects.o: ../../pikotools/src/utf8/utf8.h
./objects.o: env.h
./objects.o: item.h
./objects.o: objects.h
./objects.o: val.h
./pattern.o: ../../pikotools/src/convert/inttostr.h
./pattern.o: ../../pikotools/src/convert/misc.h
./pattern.o: ../../pikotools/src/date/date.h
./pattern.o: ../../pikotools/src/membuffer/membuffer.h
./pattern.o: ../../pikotools/src/space/space.h
./pattern.o: ../../pikotools/src/textstream/stream_private.h
./pattern.o: ../../pikotools/src/textstream/stream.h
./pattern.o: ../../pikotools/src/textstream/textstream.h
./pattern.o: ../../pikotools/src/textstream/types.h
./pattern.o: ../../pikotools/src/utf8/utf8.h
./pattern.o: blocks.h
./pattern.o: cache.h
./pattern.o: env.h
./pattern.o: functions.h
./pattern.o: item.h
./pattern.o: objects.h
./pattern.o: pattern.h
./pattern.o: val.h
./patternparser.o: ../../pikotools/src/convert/convert.h
./patternparser.o: ../../pikotools/src/convert/double.h
./patternparser.o: ../../pikotools/src/convert/inttostr.h
./patternparser.o: ../../pikotools/src/convert/misc.h
./patternparser.o: ../../pikotools/src/convert/patternreplacer.h
./patternparser.o: ../../pikotools/src/convert/strtoint.h
./patternparser.o: ../../pikotools/src/convert/text.h
./patternparser.o: ../../pikotools/src/date/date.h
./patternparser.o: ../../pikotools/src/log/filelog.h
./patternparser.o: ../../pikotools/src/log/log.h
./patternparser.o: ../../pikotools/src/membuffer/membuffer.h
./patternparser.o: ../../pikotools/src/space/space.h
./patternparser.o: ../../pikotools/src/textstream/stream_private.h
./patternparser.o: ../../pikotools/src/textstream/stream.h
./patternparser.o: ../../pikotools/src/textstream/textstream.h
./patternparser.o: ../../pikotools/src/textstream/types.h
./patternparser.o: ../../pikotools/src/utf8/utf8.h
./patternparser.o: blocks.h
./patternparser.o: cache.h
./patternparser.o: env.h
./patternparser.o: functions.h
./patternparser.o: item.h
./patternparser.o: objects.h
./patternparser.o: pattern.h
./patternparser.o: patternparser.h
./patternparser.o: val.h
./val.o: ../../pikotools/src/convert/inttostr.h
./val.o: ../../pikotools/src/convert/misc.h
./val.o: ../../pikotools/src/date/date.h
./val.o: ../../pikotools/src/membuffer/membuffer.h
./val.o: ../../pikotools/src/space/space.h
./val.o: ../../pikotools/src/textstream/stream_private.h
./val.o: ../../pikotools/src/textstream/stream.h
./val.o: ../../pikotools/src/textstream/textstream.h
./val.o: ../../pikotools/src/textstream/types.h
./val.o: ../../pikotools/src/utf8/utf8.h
./val.o: item.h
./val.o: val.h
./valwrapper.o: ../../pikotools/src/convert/inttostr.h
./valwrapper.o: ../../pikotools/src/convert/misc.h
./valwrapper.o: ../../pikotools/src/date/date.h
./valwrapper.o: ../../pikotools/src/membuffer/membuffer.h
./valwrapper.o: ../../pikotools/src/space/space.h
./valwrapper.o: ../../pikotools/src/textstream/stream_private.h
./valwrapper.o: ../../pikotools/src/textstream/stream.h
./valwrapper.o: ../../pikotools/src/textstream/textstream.h
./valwrapper.o: ../../pikotools/src/textstream/types.h
./valwrapper.o: ../../pikotools/src/utf8/utf8.h
./valwrapper.o: item.h
./valwrapper.o: val.h
./valwrapper.o: valwrapper.h
# DO NOT DELETE

117
src/blocks.cpp Normal file
View File

@@ -0,0 +1,117 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "blocks.h"
namespace Ezc
{
void Blocks::Insert(const std::wstring & name, const Item & item)
{
blocks_tab[name] = item;
}
Blocks::Iterator Blocks::Find(const std::wstring & name)
{
return blocks_tab.find(name);
}
Blocks::Iterator Blocks::Begin()
{
return blocks_tab.begin();
}
Blocks::Iterator Blocks::End()
{
return blocks_tab.end();
}
size_t Blocks::Size() const
{
return blocks_tab.size();
}
void Blocks::Clear()
{
blocks_tab.clear();
}
void Blocks::ClearCache()
{
BlocksTable::iterator i = blocks_tab.begin();
for( ; i != blocks_tab.end() ; ++i)
i->second.ClearCache();
}
void Blocks::CacheObjects(Objects & obj)
{
BlocksTable::iterator i = blocks_tab.begin();
for( ; i != blocks_tab.end() ; ++i)
Cache(obj, i->second);
}
// void Blocks::CacheFunctions(Functions & fun)
// {
// BlocksTable::iterator i = blocks_tab.begin();
// for( ; i != blocks_tab.end() ; ++i)
// Cache(fun, i->second);
// }
void Blocks::CacheBlocks(Blocks & blocks)
{
BlocksTable::iterator i = blocks_tab.begin();
for( ; i != blocks_tab.end() ; ++i)
Cache(blocks, i->second);
}
} // namespace

81
src/blocks.h Normal file
View File

@@ -0,0 +1,81 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2014-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_blocks
#define headerfile_ezc_blocks
#include <string>
#include <map>
#include "item.h"
#include "cache.h"
namespace Ezc
{
class Blocks
{
public:
typedef std::map<std::wstring, Item> BlocksTable;
typedef BlocksTable::iterator Iterator;
void Insert(const std::wstring & name, const Item & item);
Iterator Find(const std::wstring & name);
Iterator Begin();
Iterator End();
size_t Size() const;
void Clear();
void CacheObjects(Objects & obj);
//void CacheFunctions(Functions & fun);
void CacheBlocks(Blocks & blocks);
void ClearCache();
private:
BlocksTable blocks_tab;
};
} // namespace
#endif

131
src/cache.cpp Normal file
View File

@@ -0,0 +1,131 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2014-2015, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "cache.h"
#include "blocks.h"
namespace Ezc
{
void Cache(Blocks & blocks, Item::Function & function)
{
function.item_block = 0;
if( !function.name.empty() && function.arg < 0 )
{
Blocks::Iterator i = blocks.Find(function.name);
if( i != blocks.End() )
function.item_block = &i->second;
}
for(size_t i=0 ; i < function.parameters.size() ; ++i)
Cache(blocks, *function.parameters[i]);
}
// void Cache(Functions & fun, Item::Function & function)
// {
// function.fun_cache = 0;
// if( !function.name.empty() && function.arg < 0 )
// {
// typename Functions::Iterator i = fun.Find(function.name);
// if( i != fun.End() )
// function.fun_cache = &i->second;
// }
// for(size_t i=0 ; i < function.parameters.size() ; ++i)
// Cache(fun, *function.parameters[i]);
// }
// void Cache(Functions & fun, Item & item)
// {
// Cache(fun, item.function);
// for(size_t i=0; i < item.item_tab.size() ; ++i)
// Cache(fun, *item.item_tab[i]);
// }
void Cache(Blocks & blocks, Item & item)
{
Cache(blocks, item.function);
for(size_t i=0; i < item.item_tab.size() ; ++i)
Cache(blocks, *item.item_tab[i]);
}
void Cache(Objects & objects, Item::Function & function)
{
function.base_obj = 0;
function.method_index = -1;
if( !function.name.empty() && function.arg < 0 )
{
typename Objects::Iterator i = objects.Find(function.name, function.method_index);
if( i != objects.End() )
function.base_obj = *i;
}
for(size_t i=0 ; i < function.parameters.size() ; ++i)
Cache(objects, *function.parameters[i]);
}
void Cache(Objects & objects, Item & item)
{
Cache(objects, item.function);
for(size_t i=0; i < item.item_tab.size() ; ++i)
Cache(objects, *item.item_tab[i]);
}
} // namespace Ezc

62
src/cache.h Normal file
View File

@@ -0,0 +1,62 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2014-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_cache
#define headerfile_ezc_cache
#include "item.h"
#include "functions.h"
#include "objects.h"
namespace Ezc
{
class Blocks;
// void Cache(Functions & fun, Item::Function & function);
// void Cache(Functions & fun, Item & item);
void Cache(Blocks & blocks, Item & item);
void Cache(Objects & objects, Item::Function & function);
void Cache(Objects & objects, Item & item);
} // namespace Ezc
#endif

317
src/env.h Normal file
View File

@@ -0,0 +1,317 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_env
#define headerfile_ezc_env
#include <vector>
#include <map>
#include "item.h"
#include "val.h"
#include "textstream/stream.h"
namespace Ezc
{
/*
a variable
*/
// struct Var
// {
// /*
// * if true then means 'str' is a function name and should be called (res is ignored)
// *
// * if false then means 'str' is a string value and res is a boolean value
// */
// bool is_function;
// std::wstring str; // a string value
// bool res; // a boolean value
// Var()
// {
// res = false;
// is_function = false;
// }
// };
//typedef std::map<std::wstring, Var> Vars;
/*
a base class for your own function data class
*/
struct FunData
{
FunData()
{
}
virtual ~FunData()
{
}
};
/*
a generator's stack item
each statement ([if ...] [for ...] [normal_funcion]) have its own stack item
iter - is used only in [for...] - it is the current iteration (start from zero)
for other statements it is always zero
fun_data - by default this is null pointer, you can set it to a pointer
to an object derived from FunData
(this have sense only in [for...] statement because in other statements
this object would be immediately removed)
auto_remove - when true it means that object pointing by fun_data and for_name should be automatically
removed -- (by using delete fun_data and delete for_name)
is_for - true if the item is from [for] statement
currently used only in [if-index]
(it has to look for the last [for] item)
*/
struct Stack
{
size_t iter;
FunData * fun_data;
bool auto_remove;
bool is_for;
const Item * item;
Stack()
{
Clear();
}
~Stack()
{
if( auto_remove )
{
if( fun_data )
{
delete fun_data;
fun_data = 0;
}
}
}
void Clear()
{
iter = 0;
fun_data = 0;
auto_remove = true;
is_for = false;
item = 0;
}
};
struct Env
{
// a result consists of a string and a boolean value
// output stream
pt::Stream & out; // OLD INTERFACE a reference to res.stream
// table of parameters
// the table can be empty
std::vector<Val> & params;
// output
Val & res;
//
// old interface but still available
//
// return value from a user's function (default false if not set directly by the function)
//bool res;
// old interface DEPRECATED
// the first parameter
// you can always use it even if there are not any parameters (params is empty)
// in such a way the reference points to an empty string
//const std::wstring & par;
//
// an input stream used in [filter] statement
// if there is other statement than [filter] then this is an empty stream
const pt::Stream & in;
// indicates that this function is from [for ...] statement
bool is_for;
// indicates that this function is from [if ...] statement
bool is_if;
// indicates that this function is from [if-def ...] statement
bool is_if_def;
// indicates that this function is from [if-not-def ...] statement
bool is_if_not_def;
// indicates that this funcion is a normal statement e.g.: [funcion_name]
bool is_normal;
// indicates that this function is from a filter statement [filter ...]
bool is_filter;
// a pointer to the stack
Stack * stack_tab;
// current stack item
size_t stack_index;
// a stack's item from generator's stack
// each function has a new stack item
// on this stack you have iter (description below) and fun_data pointer
// you can assign to it your own object derived from FunData
// 'stack' is a reference to stack_tab[stack_index]
Stack & stack;
// the same as stack.iter (this is mainly for backward compatibility)
// it indicates the number of a current iteration for the [for] statement (the first iteration is 0)
// for other statements than [for] this is always zero
size_t iter;
// an item from the tree
const Item & item;
// arguments: output_stream, table_of_parameters, the_first_parameter
Env(pt::Stream & o,
std::vector<Val> & pars,
Val & res,
const pt::Stream & input_stream,
Stack & s,
const Item & item_) : out(o), params(pars), res(res), in(input_stream), stack(s), item(item_)
{
Clear();
}
void Clear()
{
is_for = false;
is_if = false;
is_if_def = false;
is_if_not_def = false;
is_normal = false;
is_filter = false;
iter = 0;
stack_tab = 0;
stack_index = 0;
res.clear();
}
/*
* CHECK ME can it be done only for [for] statements?
*
* can return a null pointer if there is no such an item on the stack
*
* add a function with const wchar_t *
*/
Stack * FindLastFor(const std::wstring & name)
{
for(size_t i = stack_index ; i > 0 ; --i)
{
if( stack_tab[i-1].is_for && stack_tab[i-1].item->has_function )
{
if( stack_tab[i-1].item->function.name == name )
{
return &stack_tab[i-1];
}
}
}
return 0;
}
Stack * FindLastFor(const std::wstring & name, const std::wstring & postfix)
{
for(size_t i = stack_index ; i > 0 ; --i)
{
if( stack_tab[i-1].is_for && stack_tab[i-1].item->has_function )
{
if( stack_tab[i-1].item->function.name == name && stack_tab[i-1].item->function.postfix == postfix )
{
return &stack_tab[i-1];
}
}
}
return 0;
}
template<class FunUserObject>
FunUserObject * FindUserObject(const std::wstring & function_name, Stack ** ezc_stack = 0)
{
Stack * stack;
if( item.has_function && item.function.is_function )
stack = FindLastFor(function_name, item.function.postfix);
else
stack = FindLastFor(function_name);
if( ezc_stack )
*ezc_stack = stack;
if( stack && stack->fun_data )
return dynamic_cast<FunUserObject*>(stack->fun_data);
return 0;
}
};
} // namespace Ezc
#endif

66
src/expressionparser.h Normal file
View File

@@ -0,0 +1,66 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2018, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_expressionparser
#define headerfile_ezc_expressionparser
namespace Ezc
{
class ExpressionParser
{
public:
ExpressionParser() {};
virtual ~ExpressionParser() {};
// temporarily
virtual bool Parse(const std::wstring & str) = 0;
virtual bool LastResultToBool() = 0;
virtual std::wstring LastResult() = 0;
virtual int LastError() = 0;
};
}
#endif

File diff suppressed because it is too large Load Diff

255
src/ezc.h
View File

@@ -1,260 +1,43 @@
/*
* This file is a part of EZC -- Easy templating in C++
* and is distributed under the (new) BSD licence.
* Author: Tomasz Sowa <t.sowa@slimaczek.pl>
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2008, Tomasz Sowa
* Copyright (c) 2007-2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name Tomasz Sowa nor the names of contributors to this
* project may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* version 0.9.1
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfileezc
#define headerfileezc
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <map>
#include <cstdlib>
#include <cstring>
namespace Ezc
{
void CreateMsg(std::ostringstream & o, const char * type, const char * arg = 0);
std::string CreateMsg(const char * type, const char * arg = 0);
void SplitUnixDirectory(const char * name, std::string & dir, std::string & file);
void SplitUnixDirectory(const std::string & name, std::string & dir, std::string & file);
class Pattern
{
public:
void ParseFile(const std::string & file_name);
void ParseFile(const char * file_name);
void Directory(const char * d);
void Directory(const std::string & d);
struct Item
{
// change the name to 'Type'
enum ItemType
{
item_none, item_container, item_text, item_ifany, item_for,
item_else, item_end, item_err, item_normal, item_ifindex,
item_include, item_is, item_ifone, item_comment, item_def
};
ItemType type;
std::string text;
std::vector<Item*> item_table;
std::vector<std::string> directives;
Item();
Item(const Item & i);
Item & operator=(const Item & i);
void CopyItemTable(const Item & i);
~Item();
Item * AddItem(const Item * porg = 0);
Item * AddItem(const Item & porg);
void ClearItems();
ItemType LastItemType();
void DeleteLastItem();
void Clear();
};
Item item_root;
private:
const char * itext;
std::string directory;
bool CheckFileName(const char * name);
std::string ReadFile(const char * name);
int ReadCharInText();
void SkipWhiteCharacters();
std::string ReadDirective();
std::string ReadString(bool skip_first_quote = false);
std::string ReadDirectiveOrString();
void CreateTreeReadItemDirectiveCheckEnding(Item & item);
void ReadDirectiveIfany(Item & item);
void ReadDirectiveIfone(Item & item);
void ReadDirectiveIs(Item & item);
void ReadDirectiveIfindex(Item & item);
void ReadDirectiveFor(Item & item);
void ReadDirectiveComment(Item & item);
void ReadDirectiveInclude(Item & item);
void ReadDirectiveDef(Item & item);
void CreateTreeReadItemDirective(Item & item);
void CreateTreeReadItemText(Item & item);
bool CreateTreeReadItem(Item & item);
void CreateTreeReadIf(Item & item);
void CreateTreeReadFor(Item & item);
void CreateTree(Item & item);
void CreateTreeReadInclude(Item & item);
}; // Pattern
struct Info
{
// this variables you can set in your function
std::ostringstream & out;
std::string out_string;
bool result;
// this is set by Generator
// normally is 0
// in a [for] statement it indicates the number of the current iteration (the first is 0)
int iter;
Info(std::ostringstream & o);
void Clear();
bool IsTrue() const;
bool IsFalse() const;
};
class Functions
{
public:
typedef void (*UserFunction)(Info &);
enum Type { function, variable };
struct Function
{
Type type;
UserFunction user_function;
std::string variable;
int iter;
bool is_for; // true if is used by a [for] statement
bool is_running; // true if this function (if is) is currently running
Function();
};
void Insert(const std::string & key, UserFunction ufunction); // inserting a function
void Insert(const std::string & key, const char * var); // inserting a variable
void Insert(const std::string & key, const std::string & var); // inserting a variable
bool Find(const std::string & key, Function ** fun);
void Clear();
private:
typedef std::map<std::string, Function> FunctionsTable;
FunctionsTable functions_table;
};
class Generator
{
public:
Generator(std::ostringstream &, Pattern & data, Functions & functions);
void Generate();
private:
std::ostringstream & output_stream;
Pattern & pattern;
Functions & functions;
Info info1, info2;
int loop;
bool Find(const std::string & key, Functions::Function ** function);
bool Call(const std::string & name, Info & info, Functions::Function ** pfun = 0);
void Call(Functions::Function * function, Info & info);
void CallUserFunction(Functions::Function * function, Info & info);
void CallVariable(Functions::Function * function, Info & info);
void MakeTextIf_go(Pattern::Item & item, bool result);
bool MakeTextIfindexnumber(Pattern::Item & item, Functions::Function * function, bool & result);
void MakeTextIfany(Pattern::Item & item);
void MakeTextIfone(Pattern::Item & item);
void MakeTextIfindex(Pattern::Item & item);
void MakeTextFor(Pattern::Item & item);
void MakeTextContainer(Pattern::Item & item);
void MakeTextNormal(Pattern::Item & item);
void MakeTextIs(Pattern::Item & item);
void MakeTextDefine(Pattern::Item & item);
void MakeText(Pattern::Item & item);
}; // Generator
} // namespace Ezc
#ifndef headerfile_ezc_ezc
#define headerfile_ezc_ezc
#include "version.h"
#include "generator.h"
#include "patternparser.h"
#endif

109
src/functions.cpp Normal file
View File

@@ -0,0 +1,109 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "functions.h"
namespace Ezc
{
/*
void Functions::Insert(const char * key, UserFunction ufunction)
{
pt::utf8_to_wide(key, temp_key);
functions_tab[temp_key] = ufunction;
temp_key.clear();
}
void Functions::Insert(const std::string & key, UserFunction ufunction)
{
Insert(key.c_str(), ufunction);
}
void Functions::Insert(const wchar_t * key, UserFunction ufunction)
{
temp_key = key;
functions_tab[temp_key] = ufunction;
temp_key.clear();
}
void Functions::Insert(const std::wstring & key, UserFunction ufunction)
{
functions_tab[key] = ufunction;
}
typename Functions::Iterator Functions::Find(const std::wstring & key)
{
return functions_tab.find(key);
}
void Functions::Clear()
{
functions_tab.clear();
}
typename Functions::Iterator Functions::Begin()
{
return functions_tab.begin();
}
typename Functions::Iterator Functions::End()
{
return functions_tab.end();
}
size_t Functions::Size() const
{
return functions_tab.size();
}
*/
} // namespace Ezc

85
src/functions.h Normal file
View File

@@ -0,0 +1,85 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_functions
#define headerfile_ezc_functions
#include <map>
#include "utf8/utf8.h"
#include "env.h"
namespace Ezc
{
// functions or variables
/*
class Functions
{
public:
typedef void (*UserFunction)(Env &);
typedef std::map<std::wstring, UserFunction> FunctionsTable;
typedef typename FunctionsTable::iterator Iterator;
void Insert(const char * key, UserFunction ufunction);
void Insert(const std::string & key, UserFunction ufunction);
void Insert(const wchar_t * key, UserFunction ufunction);
void Insert(const std::wstring & key, UserFunction ufunction);
Iterator Find(const std::wstring & key);
Iterator Begin();
Iterator End();
size_t Size() const;
void Clear();
private:
FunctionsTable functions_tab;
std::wstring temp_key;
};
*/
} // namespace Ezc
#endif

3614
src/generator.h Normal file

File diff suppressed because it is too large Load Diff

190
src/item.cpp Normal file
View File

@@ -0,0 +1,190 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2018, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "item.h"
namespace Ezc
{
Item * Item::AddItem(const Item * porg)
{
Item * pitem;
if( porg )
pitem = new Item(*porg);
else
pitem = new Item();
item_tab.push_back(pitem);
return pitem;
}
Item * Item::AddItem(const Item & porg)
{
return AddItem(&porg);
}
void Item::ClearItems()
{
std::vector<Item*>::iterator i = item_tab.begin();
for( ; i != item_tab.end() ; ++i )
delete *i;
item_tab.clear();
}
void Item::Clear()
{
ClearItems();
text.clear();
file_name.clear();
has_function = false;
function.Clear();
type = item_none;
}
Item::Type Item::LastItemType()
{
if( item_tab.empty() )
return item_none;
return item_tab.back()->type;
}
void Item::DeleteLastItem()
{
if( item_tab.empty() )
return;
delete item_tab.back();
item_tab.pop_back();
}
Item::Item()
{
type = item_none;
has_function = false;
}
Item::Item(const Item & i) : text(i.text), file_name(i.file_name), function(i.function)
{
type = i.type;
has_function = i.has_function;
CopyItemTable(i);
}
Item & Item::operator=(const Item & i)
{
type = i.type;
text = i.text;
file_name = i.file_name;
has_function = i.has_function;
function = i.function;
ClearItems();
CopyItemTable(i);
return *this;
}
void Item::CopyItemTable(const Item & item)
{
std::vector<Item*>::const_iterator i = item.item_tab.begin();
for( ; i != item.item_tab.end() ; ++i)
AddItem(*i);
}
Item::~Item()
{
ClearItems();
}
void Item::ClearCache(Item::Function & function)
{
function.base_obj = 0;
function.method_index = -1;
function.fun_cache = 0;
function.item_block = 0;
for(size_t i=0 ; i<function.parameters.size() ; ++i)
ClearCache(*function.parameters[i]);
}
void Item::ClearCache()
{
ClearCache(function);
for(size_t i = 0; i < item_tab.size() ; ++i)
item_tab[i]->ClearCache();
}
} // namespace Ezc

176
src/item.h Normal file
View File

@@ -0,0 +1,176 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2021, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_item
#define headerfile_ezc_item
#include <vector>
#include <string>
namespace Ezc
{
struct Item
{
enum Type
{
item_none, item_container, item_text, item_function, item_if, item_if_def, item_if_not_def,
item_for, item_else, item_end, item_err, item_include, item_comment,
item_def, item_def_if_not_set, item_let, item_let_if_not_set,
item_filter, item_ezc, item_block, item_return
};
struct Function
{
bool is_function; // if true then we have a function parameter, if false then we have a string parameter
std::wstring name; // a function or parameter name
std::vector<std::wstring> fields; // any number of additional fields after a dot e.g. [name.field1.field2]
std::wstring postfix; // a function can have an additional postfix in its name
// e.g. [my_function:my_postfix]
std::vector<Function*> parameters; // if is_function is true then it is a function and can have 'parameters'
// if is_function is empty then 'parameters' is empty too
void * fun_cache; // only valid if is_function is true
Item * item_block;
void * base_obj;
int method_index;
int arg; // used if name is numeric (if no then is equal -1)
Function()
{
is_function = false;
fun_cache = 0;
item_block = 0;
base_obj = 0;
method_index = -1;
arg = -1;
}
~Function()
{
Clear();
}
Function(const Function & f)
{
operator=(f);
}
Function & operator=(const Function & f)
{
is_function = f.is_function;
name = f.name;
fields = f.fields;
postfix = f.postfix;
fun_cache = f.fun_cache;
item_block = f.item_block;
base_obj = f.base_obj;
method_index = f.method_index;
arg = f.arg;
for(size_t i=0 ; i<f.parameters.size() ; ++i)
parameters.push_back(new Function(*f.parameters[i]));
return *this;
}
Function & AddNewParam()
{
parameters.push_back(new Function());
return *parameters.back();
}
void Clear()
{
for(size_t i=0 ; i<parameters.size() ; ++i)
delete parameters[i];
fields.clear();
parameters.clear();
name.clear();
postfix.clear();
fun_cache = 0;
item_block = 0;
base_obj = 0;
method_index = -1;
arg = -1;
is_function = false;
}
};
Type type;
std::wstring text; // used in: item_text
std::wstring file_name; // used in: item_include (as a file name)
std::vector<Item*> item_tab; // childs
bool has_function; // the [return] statement can be without a function
Function function;
Item();
Item(const Item & i);
Item & operator=(const Item & i);
void CopyItemTable(const Item & i);
~Item();
Item * AddItem(const Item * porg = 0);
Item * AddItem(const Item & porg);
void ClearItems();
Type LastItemType();
void DeleteLastItem();
void Clear();
void ClearCache();
private:
void ClearCache(Item::Function & function);
};
} // namespace Ezc
#endif

164
src/models.cpp Normal file
View File

@@ -0,0 +1,164 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2021-2025, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "models.h"
#ifdef EZC_HAS_MORM_LIBRARY
namespace Ezc
{
Models::Models()
{
}
Models::~Models()
{
Clear();
}
void Models::Clear()
{
models_map.clear();
}
void Models::Add(const std::wstring & name, morm::Model & model)
{
ValWrapper valcache;
valcache.val.set_pointer_to(&model);
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, morm::Model * model)
{
ValWrapper valcache;
valcache.val.set_pointer_to(model);
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, pt::Space & space)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::SpaceWrapper(&space));
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, pt::Space * space)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::SpaceWrapper(space));
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, pt::Date & date)
{
ValWrapper valcache;
valcache.val.set_pointer_to(&date);
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, pt::Date * date)
{
ValWrapper valcache;
valcache.val.set_pointer_to(date);
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, const std::wstring & value)
{
ValWrapper valcache;
valcache.val.set(value);
models_map[name] = valcache;
}
void Models::Add(const std::wstring & name, Val::UserFunction ufunction)
{
ValWrapper valcache;
valcache.val.set_pointer_to(ufunction);
models_map[name] = valcache;
}
ValWrapper * Models::Find(const std::wstring & name)
{
auto iterator = models_map.find(name);
if( iterator != models_map.end() )
{
return &iterator->second;
}
return nullptr;
}
Val * Models::FindVal(const std::wstring & name)
{
auto iterator = models_map.find(name);
if( iterator != models_map.end() )
{
if( iterator->second.has_evaluated_val )
return &iterator->second.evaluated_val;
else
return &iterator->second.val;
}
return nullptr;
}
Models::ModelsMap & Models::GetMap()
{
return models_map;
}
}
#endif

159
src/models.h Normal file
View File

@@ -0,0 +1,159 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2021-2025, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_models
#define headerfile_ezc_models
#ifdef EZC_HAS_MORM_LIBRARY
#include "valwrapper.h"
#include "space/space.h"
namespace Ezc
{
/*
* RENAMEME to a better name
* e.g.
* Vals, Vars, Variables, Values...
*/
class Models
{
public:
typedef std::map<std::wstring, ValWrapper> ModelsMap;
Models();
~Models();
void Add(const std::wstring & name, morm::Model & model);
void Add(const std::wstring & name, morm::Model * model);
void Add(const std::wstring & name, pt::Space & space);
void Add(const std::wstring & name, pt::Space * space);
void Add(const std::wstring & name, pt::Date & space);
void Add(const std::wstring & name, pt::Date * space);
void Add(const std::wstring & name, const std::wstring & value);
void Add(const std::wstring & name, Val::UserFunction ufunction);
template<typename VectorType>
void Add(const std::wstring & name, std::vector<VectorType> & container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperVector<VectorType>(&container));
models_map[name] = valcache;
}
template<typename VectorType>
void Add(const std::wstring & name, std::vector<VectorType> * container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperVector<VectorType>(container));
models_map[name] = valcache;
}
template<typename VectorType>
void Add(const std::wstring & name, std::vector<VectorType*> & container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperVectorPointer<VectorType>(&container));
models_map[name] = valcache;
}
template<typename VectorType>
void Add(const std::wstring & name, std::vector<VectorType*> * container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperVectorPointer<VectorType>(container));
models_map[name] = valcache;
}
template<typename ListType>
void Add(const std::wstring & name, std::list<ListType> & container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperList<ListType>(&container));
models_map[name] = valcache;
}
template<typename ListType>
void Add(const std::wstring & name, std::list<ListType> * container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperList<ListType>(container));
models_map[name] = valcache;
}
template<typename ListType>
void Add(const std::wstring & name, std::list<ListType*> & container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperListPointer<ListType>(&container));
models_map[name] = valcache;
}
template<typename ListType>
void Add(const std::wstring & name, std::list<ListType*> * container)
{
ValWrapper valcache;
valcache.val.set_pointer_to(new morm::ModelWrapperListPointer<ListType>(container));
models_map[name] = valcache;
}
ValWrapper * Find(const std::wstring & name);
Val * FindVal(const std::wstring & name);
ModelsMap & GetMap();
void Clear();
protected:
ModelsMap models_map;
};
}
#endif
#endif

104
src/objects.cpp Normal file
View File

@@ -0,0 +1,104 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "objects.h"
namespace Ezc
{
typename Objects::Iterator Objects::Find(const std::wstring & key, int & method_index)
{
Iterator i = obj_tab.begin();
method_index = -1;
for( ; i != obj_tab.end() ; ++i)
{
int index = (*i)->FindFun(key);
if( index != -1 )
{
method_index = index;
return i;
}
}
return obj_tab.end();
}
void Objects::Insert(BaseObj * base_fun)
{
obj_tab.push_back(base_fun);
}
void Objects::Insert(BaseObj & base_fun)
{
obj_tab.push_back(&base_fun);
}
typename Objects::Iterator Objects::Begin()
{
return obj_tab.begin();
}
typename Objects::Iterator Objects::End()
{
return obj_tab.end();
}
size_t Objects::Size() const
{
return obj_tab.size();
}
void Objects::Clear()
{
obj_tab.clear();
}
} // namespace Ezc

235
src/objects.h Normal file
View File

@@ -0,0 +1,235 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2015-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_objects
#define headerfile_ezc_objects
#include <vector>
#include <string>
#include "utf8/utf8.h"
#include "env.h"
namespace Ezc
{
class BaseObj
{
public:
virtual ~BaseObj() {}
/*
*
*/
virtual std::wstring & GetObjectName() = 0;
/*
*
*/
virtual int FindFun(const std::wstring & fun_name) = 0;
/*
*
*/
virtual void CallFun(int fun_index, Env &) = 0;
/*
*
*/
virtual void ClearFunctions() = 0;
/*
*
*/
virtual size_t FunctionsSize() = 0;
/*
*
*/
virtual void AddFunctions() {};
};
#define EZC_DEFINE_OBJECT_METHODS(classname) \
\
\
protected: \
\
struct EzcTemplateMethod \
{ \
std::wstring fun_name; \
void (classname::*fun)(Info &); \
}; \
\
public: \
\
virtual std::wstring & GetObjectName() \
{ \
return ezc_object_name; \
} \
\
virtual void CallFun(int fun_index, Info & info) \
{ \
if( fun_index >=0 && (size_t)fun_index < ezc_template_method_tab.size() ) \
{ \
(this->*(ezc_template_method_tab[fun_index].fun))(info); \
} \
} \
\
virtual int FindFun(const std::wstring & fun_name) \
{ \
for(size_t i=0 ; i<ezc_template_method_tab.size() ; ++i) \
{ \
if( ezc_template_method_tab[i].fun_name == fun_name ) \
{ \
return (int)i; \
} \
} \
\
return -1; \
} \
\
\
protected: \
\
virtual void ClearFunctions() \
{ \
ezc_template_method_tab.clear(); \
} \
\
virtual size_t FunctionsSize() \
{ \
return ezc_template_method_tab.size(); \
} \
\
void Insert(const char * name, void (classname::*fun)(Info &)) \
{ \
EzcTemplateMethod item; \
\
pt::utf8_to_wide(name, item.fun_name); \
item.fun = fun; \
\
ezc_template_method_tab.push_back(item); \
} \
\
void Insert(const std::string & name, void (classname::*fun)(Info &)) \
{ \
EzcTemplateMethod item; \
\
pt::utf8_to_wide(name, item.fun_name); \
item.fun = fun; \
\
ezc_template_method_tab.push_back(item); \
} \
\
void Insert(const wchar_t * name, void (classname::*fun)(Info &)) \
{ \
EzcTemplateMethod item; \
\
item.fun_name = name; \
item.fun = fun; \
\
ezc_template_method_tab.push_back(item); \
} \
\
void Insert(const std::wstring & name, void (classname::*fun)(Info &)) \
{ \
EzcTemplateMethod item; \
\
item.fun_name = name; \
item.fun = fun; \
\
ezc_template_method_tab.push_back(item); \
} \
\
std::vector<EzcTemplateMethod> ezc_template_method_tab; \
std::wstring ezc_object_name; \
\
private:
class Objects
{
public:
typedef std::vector<BaseObj*> ObjectsTable;
typedef typename ObjectsTable::iterator Iterator;
void Insert(BaseObj * base_fun);
void Insert(BaseObj & base_fun);
Iterator Begin();
Iterator End();
size_t Size() const;
void Clear();
Iterator Find(const std::wstring & key, int & method_index);
private:
ObjectsTable obj_tab;
};
} // namespace Ezc
#endif

163
src/outstreams.h Normal file
View File

@@ -0,0 +1,163 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2015-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_outstreams
#define headerfile_ezc_outstreams
#include "textstream/stream.h"
#include <string>
#include <vector>
#include <map>
namespace Ezc
{
class OutStreams
{
public:
typedef std::map<std::wstring, pt::Stream*> StreamsMap;
typedef std::vector<pt::Stream*> StreamsTab;
StreamsMap streams_map;
StreamsTab streams_tab;
void ResizeTab(pt::Stream & stream_type, size_t len);
void ClearMap();
void ClearTab();
~OutStreams();
OutStreams();
OutStreams(const OutStreams & o);
OutStreams & operator=(const OutStreams & o);
};
OutStreams::~OutStreams()
{
ClearTab();
}
OutStreams::OutStreams()
{
}
OutStreams::OutStreams(const OutStreams & o)
{
// we do not copy streams but creating new ones
//ResizeTab(o.streams_tab.size());
}
OutStreams & OutStreams::operator=(const OutStreams & o)
{
// we do not copy streams but creating new ones
streams_map.clear();
//ResizeTab(o.streams_tab.size());
return *this;
}
void OutStreams::ClearTab()
{
for(size_t i=0 ; i<streams_tab.size() ; ++i)
delete streams_tab[i];
streams_tab.clear();
streams_map.clear();
}
void OutStreams::ResizeTab(pt::Stream & stream_type, size_t len)
{
if( streams_tab.size() != len )
{
if( streams_tab.size() < len )
{
size_t i = streams_tab.size();
streams_tab.resize(len);
for( ; i<streams_tab.size() ; ++i)
streams_tab[i] = stream_type.new_empty();
}
else
{
streams_map.clear();
for(size_t i=len ; i<streams_tab.size() ; ++i)
delete streams_tab[i];
streams_tab.resize(len);
}
}
}
void OutStreams::ClearMap()
{
typename StreamsMap::iterator i;
for(i=streams_map.begin() ; i != streams_map.end() ; ++i)
{
pt::Stream & str = *(i->second);
str.clear();
// if constexpr(is_pikotools_stream)
// {
// str.clear();
// }
// else
// {
// str.str(L"");
// }
}
streams_map.clear();
}
} // namespace
#endif

81
src/pattern.cpp Normal file
View File

@@ -0,0 +1,81 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "pattern.h"
namespace Ezc
{
Pattern::Pattern()
{
Clear();
}
void Pattern::Clear()
{
item_root.Clear();
}
void Pattern::CacheBlocks(Blocks & blocks)
{
Cache(blocks, item_root);
}
void Pattern::ClearCache()
{
item_root.ClearCache();
}
// void Pattern::CacheFunctions(Functions & fun)
// {
// Cache(fun, item_root);
// }
void Pattern::CacheObjects(Objects & obj)
{
Cache(obj, item_root);
}
} // namespace Ezc

74
src/pattern.h Normal file
View File

@@ -0,0 +1,74 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_pattern
#define headerfile_ezc_pattern
#include "item.h"
#include "cache.h"
#include "blocks.h"
#include "functions.h"
#include "objects.h"
namespace Ezc
{
class Pattern
{
public:
Pattern();
void Clear();
//void CacheFunctions(Functions & fun);
void CacheBlocks(Blocks & blocks);
void CacheObjects(Objects & obj);
void ClearCache();
Item item_root;
}; // class Pattern
} // namespace Ezc
#endif

1399
src/patternparser.cpp Normal file

File diff suppressed because it is too large Load Diff

227
src/patternparser.h Normal file
View File

@@ -0,0 +1,227 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2007-2021, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_patternparser
#define headerfile_ezc_patternparser
#include "blocks.h"
#include "pattern.h"
#include "utf8/utf8.h"
#include "log/log.h"
namespace Ezc
{
class PatternParser
{
public:
PatternParser();
// first we're trying to read a file from directory dir
// if there is no such a file there then we try read from dir2
// (the second dir2 can be empty - it will not be used)
void Directory(const char * dir, const char * dir2 = 0);
void Directory(const std::string & dir);
void Directory(const std::string & dir, const std::string & dir2);
void Directory(const wchar_t * dir, const wchar_t * dir2 = 0);
void Directory(const std::wstring & dir);
void Directory(const std::wstring & dir, const std::wstring & dir2);
void ParseFile(const char * file_name, Pattern & pattern);
void ParseFile(const std::string & file_name, Pattern & pattern);
void ParseFile(const wchar_t * file_name, Pattern & pattern);
void ParseFile(const std::wstring & file_name, Pattern & pattern);
void ParseString(const char * str, Pattern & pattern);
void ParseString(const std::string & str, Pattern & pattern);
void ParseString(const wchar_t * str, Pattern & pattern);
void ParseString(const std::wstring & str, Pattern & pattern);
void AllowInclude(bool allow);
void DeleteWhiteTextItems(bool del);
void SetIncludeMax(int include_max);
void SetBlocks(Blocks & blocks);
void SetProgramMode(bool program_mode);
void SetLogger(pt::Log * log);
private:
struct Env
{
bool clear_all_white_nodes;
bool trim_text_nodes;
Env()
{
clear_all_white_nodes = false;
trim_text_nodes = false;
}
};
std::vector<Env> env_tab;
// the output object
Pattern * pat;
// the main pointer to the parsed text
const wchar_t * itext;
// allowing include tag
// default: true
bool allow_include;
// if true all text-items which have only white characters (with new lines as well)
// will be deleted - useful in *.txt templates
// this not actually delete the whole item but only the string
// the item will be present with an empty string
// default: false
bool delete_white_text_items;
// first we're trying to read a file from 'directory'
// if there is no such a file there then we try read from 'directory2'
// we read from these directories only if they are not empty
std::wstring directory, directory2;
int include_level, include_level_max;
// temporary content for ParseString(const char*) method
std::wstring string_content;
// temporary object for a file name
std::wstring file_name;
// temporary object for a file name
std::string afile_name;
// temporary object for a EZC function
Item::Function temp_function;
Blocks * pblocks;
bool program_mode;
pt::Log * log;
void InitializeEnvTab();
void IncreaseEnvTab();
void ReadFile(const std::wstring & name, std::wstring & result);
void ReadFile(const wchar_t * name, std::wstring & result);
bool HasFileAtBeginning(const wchar_t * path, const wchar_t * file);
bool IsFileCorrect(const wchar_t * name);
bool ReadFileFromDir(const std::wstring & dir, const wchar_t * name, std::wstring & result);
void ReadFile(std::ifstream & file, std::wstring & result);
int ReadCharInText();
bool IsWhite(wchar_t c);
void SkipWhite();
void SkipOneStatement();
void CheckWhiteAndDelete(std::wstring & s);
void CheckFunctionIsNumber(Item::Function & function);
bool IsNameChar(wchar_t c);
bool IsDigit(wchar_t c);
bool IsPositiveNumber(const std::wstring & str);
bool ReadName(std::wstring & name);
bool ReadFunctionName(std::wstring & name, std::wstring & postfix);
bool ReadString(std::wstring & str);
bool ReadParamString(Item::Function & function);
bool ReadParams(Item::Function & function);
void ReadFunctionFields(Item::Function & function);
bool ReadFunction(Item::Function & function, bool with_params);
bool ReadFunction(Item & item);
void ReadDirectiveIf(Item & item);
void ReadDirectiveIfDef(Item & item);
void ReadDirectiveIfNotDef(Item & item);
void ReadDirectiveEnd(Item & item);
void ReadDirectiveElse(Item & item);
void ReadDirectiveFor(Item & item);
void ReadDirectiveComment(Item & item);
void ReadDirectiveInclude(Item & item);
void ReadDirectiveDef(Item & item);
void ReadDirectiveDefIfNotSet(Item & item);
void ReadDirectiveLet(Item & item);
void ReadDirectiveLetIfNotSet(Item & item);
void ReadDirectiveFilter(Item & item);
void ReadDirectiveEzc(Item & item);
void ReadDirectiveFrame(Item & item);
void ReadDirectiveBlock(Item & item);
void ReadDirectiveReturn(Item & item);
void ReadNormalStatement(Item & item);
bool CheckEnv(Item & item);
bool CheckEnvIsYesParameter(Item & item);
void CreateTreeReadDirectiveExpression(Item & item, bool is_statement);
bool CreateTreeCheckProgramDirective(Item & item);
bool CreateTreeReadExpression(Item & item);
void CreateTreeReadItemDirectiveCheckEnding(Item & item);
void CreateTreeReadItemDirective(Item & item);
void CreateTreeReadItemText(Item & item);
bool CreateTreeReadItem(Item & item);
void CreateTreeReadIf(Item & item);
void CreateTreeReadBlock(Item & item);
void CreateTreeReadOneChild(Item & item);
bool CreateTree(Item & item);
void CreateTreeContainer(Item & item);
void CreateTreeReadInclude(Item & item);
void CreateTreeReadIncludeSkipAllowFlag(Item & item);
}; // class PatternParser
} // namespace Ezc
#endif

1366
src/val.cpp Normal file

File diff suppressed because it is too large Load Diff

394
src/val.h Normal file
View File

@@ -0,0 +1,394 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2024, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_val
#define headerfile_ezc_val
#include "spacewrapper.h"
#include "date/date.h"
#include "item.h"
#include "modelcontainerwrapper.h"
#include "textstream/textstream.h"
namespace morm
{
class Model;
}
namespace Ezc
{
struct Env;
/*
*/
class Val
{
public:
using UserFunction = void (*)(Env &);
#ifdef EZC_HAS_MORM_LIBRARY
using ModelMethod1 = void (morm::Model::*)(Env &);
using ModelMethod3 = bool (morm::Model::*)();
using ModelMethod4 = bool (morm::Model::*)() const;
#endif
enum Type
{
TYPE_VOID,
TYPE_SPACE_LOCAL,
TYPE_STREAM,
TYPE_FUNCTION,
TYPE_DATE,
#ifdef EZC_HAS_MORM_LIBRARY
TYPE_MODEL,
TYPE_MODEL_CONTAINER_WRAPPER,
TYPE_MODEL_METHOD,
#endif
TYPE_SPACE,
TYPE_ITEM_BLOCK,
TYPE_CHAR,
TYPE_WCHAR, //
TYPE_SHORT,
TYPE_INT,
TYPE_LONG,
TYPE_LONG_LONG,
TYPE_UNSIGNED_CHAR,
TYPE_UNSIGNED_SHORT,
TYPE_UNSIGNED_INT,
TYPE_UNSIGNED_LONG,
TYPE_UNSIGNED_LONG_LONG,
TYPE_FLOAT,
TYPE_DOUBLE,
TYPE_LONG_DOUBLE,
TYPE_STRING,
TYPE_WSTRING,
};
Val();
Val(pt::Stream * output_stream);
Val(const Val & val);
Val & operator=(const Val & val);
~Val();
// IMPROVEME add move cctor and operator=
void set_output_stream(pt::Stream * output_stream);
void set_output_stream(pt::Stream & output_stream);
bool has_object();
bool has_function();
#ifdef EZC_HAS_MORM_LIBRARY
bool has_method();
bool has_model_object();
#endif
bool has_pod_type();
//bool has_space_object();
void clear();
bool to_bool() const;
void set(const char * str);
void set(const wchar_t * str);
void set(const std::string & str);
void set(const std::wstring & str);
void set(bool val);
void set(short val);
void set(int val);
void set(long val);
void set(long long val);
void set(unsigned short val);
void set(unsigned int val);
void set(unsigned long val);
void set(unsigned long long val);
void set(float val);
void set(double val);
void set(long double val);
void set_pointer_to(pt::Stream * str);
void set_pointer_to(UserFunction user_function);
#ifdef EZC_HAS_MORM_LIBRARY
void set_pointer_to(morm::Model * model, ModelMethod1 model_method1);
void set_pointer_to(morm::Model * model, ModelMethod3 model_method3);
void set_pointer_to(morm::Model * model, ModelMethod4 model_method4);
#endif
void set_pointer_to(pt::Date * date);
void set_pointer_to(morm::Model * model);
void set_pointer_to(morm::ModelContainerWrapper * model_container_wrapper);
template<typename ModelType>
void set_pointer_to(std::vector<ModelType> * model_container);
template<typename ModelType>
void set_pointer_to(std::list<ModelType> * model_container);
template<typename ModelType>
void set_pointer_to(std::vector<ModelType*> * model_container);
template<typename ModelType>
void set_pointer_to(std::list<ModelType*> * model_container);
void set_pointer_to(morm::SpaceWrapper * space_wrapper);
void set_pointer_to(pt::Space * space, bool create_wrapper = true);
//void set(Val & val);
void set_pointer_to(Item * item_block);
void set_pointer_to(bool * val);
void set_pointer_to(char * val);
void set_pointer_to(wchar_t * val);
void set_pointer_to(short * val);
void set_pointer_to(int * val);
void set_pointer_to(long * val);
void set_pointer_to(long long * val);
void set_pointer_to(unsigned char * val);
void set_pointer_to(unsigned short * val);
void set_pointer_to(unsigned int * val);
void set_pointer_to(unsigned long * val);
void set_pointer_to(unsigned long long * val);
void set_pointer_to(float * val);
void set_pointer_to(double * val);
void set_pointer_to(long double * val);
void set_pointer_to(std::string * val);
void set_pointer_to(std::wstring * val);
// bool is_equal(const char * str) const;
// bool is_equal(const wchar_t * str) const;
// bool is_equal(const std::string & str) const;
// bool is_equal(const std::wstring & str) const;
void serialize_to(pt::Stream & str);
Val & operator<<(const char * str);
Val & operator<<(const wchar_t * str);
Val & operator<<(const std::string & str);
Val & operator<<(const std::wstring & str);
Val & operator<<(char val);
Val & operator<<(unsigned char val);
Val & operator<<(wchar_t val);
Val & operator<<(bool val);
Val & operator<<(short val);
Val & operator<<(int val);
Val & operator<<(long val);
Val & operator<<(long long val);
Val & operator<<(unsigned short val);
Val & operator<<(unsigned int val);
Val & operator<<(unsigned long val);
Val & operator<<(unsigned long long val);
Val & operator<<(float val);
Val & operator<<(double val);
Val & operator<<(long double val);
Val & operator<<(const pt::Stream & str);
Val & operator=(bool res);
void put_pod_type_to_stream();
void allow_to_cache(bool allow_to_cache);
bool is_allowed_to_cache();
Type type;
pt::Space space_local;
void * pointer;
#ifdef EZC_HAS_MORM_LIBRARY
ModelMethod1 model_method1;
ModelMethod3 model_method3;
ModelMethod4 model_method4;
#endif
// used when pointer is pointing to a pt::Space
// but can be null
morm::SpaceWrapper * space_wrapper;
size_t space_table_index;
bool allow_to_cache_value;
// UserFunction user_function;
// // Wrapper
// morm::Model * model;
// morm::ModelContainerWrapper * model_container_wrapper;
// pt::Date * date;
// morm::SpaceWrapper * space_wrapper;
// //
// pt::Space * space;
// pt::Stream * stream;
// Item * item_block;
// output stream
pt::Stream * output_stream;
bool is_equal_string(const wchar_t * str) const;
private:
void initialize_empty();
void copy(const Val & val);
void increment_model_container_wrapper_ref();
void increment_space_wrapper_ref();
void clear_model_container_wrapper();
void clear_space_wrapper();
// bool is_equal_bool(const char * str) const;
// bool is_equal_string(const char * str) const;
// bool is_equal_bool(const wchar_t * str) const;
bool is_space_equal_string(const pt::Space & space, const wchar_t * str) const;
bool is_stream_equal_string(const pt::Stream & stream, const wchar_t * str) const;
bool to_bool_stream() const;
bool to_bool_space() const;
bool to_bool_model_container_wrapper() const;
void serialize_stream_to(pt::Stream & str);
void serialize_date_to(pt::Stream & str);
void serialize_model_to(pt::Stream & str);
void serialize_model_container_wrapper_to(pt::Stream & str);
void serialize_space_to(pt::Stream & str);
template<typename PODType>
void serialize_pod_type_to(pt::Stream & str)
{
PODType * val = reinterpret_cast<PODType*>(pointer);
str << *val;
}
/*
* old
*/
/*
* if true then means 'str' is a function name and should be called (res is ignored)
*
* if false then means 'str' is a string value and res is a boolean value
*/
//bool is_function;
//std::wstring str; // a string value
//bool res; // a boolean value
};
template<typename ModelType>
void Val::set_pointer_to(std::vector<ModelType> * model_container)
{
clear();
type = TYPE_MODEL_CONTAINER_WRAPPER;
this->pointer = new morm::ModelWrapperVector<ModelType>(model_container);
this->allow_to_cache_value = true;
}
template<typename ModelType>
void Val::set_pointer_to(std::list<ModelType> * model_container)
{
clear();
type = TYPE_MODEL_CONTAINER_WRAPPER;
this->pointer = new morm::ModelWrapperList<ModelType>(model_container);
this->allow_to_cache_value = true;
}
template<typename ModelType>
void Val::set_pointer_to(std::vector<ModelType*> * model_container)
{
clear();
type = TYPE_MODEL_CONTAINER_WRAPPER;
this->pointer = new morm::ModelWrapperVectorPointer<ModelType>(model_container);
this->allow_to_cache_value = true;
}
template<typename ModelType>
void Val::set_pointer_to(std::list<ModelType*> * model_container)
{
clear();
type = TYPE_MODEL_CONTAINER_WRAPPER;
this->pointer = new morm::ModelWrapperListPointer<ModelType>(model_container);
this->allow_to_cache_value = true;
}
typedef std::map<std::wstring, Val> Vals;
} // namespace Ezc
#endif

142
src/valwrapper.cpp Normal file
View File

@@ -0,0 +1,142 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2025, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "valwrapper.h"
namespace Ezc
{
ValWrapper::ValWrapper()
{
has_evaluated_val = false;
evaluated_str = nullptr;
}
ValWrapper::ValWrapper(const ValWrapper & valcache)
{
operator=(valcache);
}
ValWrapper & ValWrapper::operator=(const ValWrapper & valcache)
{
val = valcache.val;
has_evaluated_val = valcache.has_evaluated_val;
evaluated_val = valcache.evaluated_val;
if( valcache.evaluated_str )
{
evaluated_str = valcache.evaluated_str->new_empty();
if( !valcache.evaluated_str->empty() )
{
evaluated_str->escape_input(false);
*evaluated_str << *valcache.evaluated_str;
}
}
else
{
evaluated_str = nullptr;
}
return *this;
}
void ValWrapper::clear()
{
val.clear();
clear_evaluated_value();
clear_childs();
}
void ValWrapper::clear_evaluated_value()
{
has_evaluated_val = false;
if( evaluated_str )
{
delete evaluated_str;
}
evaluated_str = nullptr;
evaluated_val.clear();
}
void ValWrapper::clear_childs()
{
childs_map.clear();
}
ValWrapper * ValWrapper::add_child(const std::wstring & child_name, const ValWrapper & val)
{
ValWrapper & v = childs_map[child_name];
v.clear();
v = val;
return &v;
}
ValWrapper * ValWrapper::add_child(const std::wstring & child_name, const Val & val)
{
ValWrapper & v = childs_map[child_name];
v.clear();
v.val = val;
return &v;
}
ValWrapper * ValWrapper::find_child(const std::wstring & child_name)
{
auto i = childs_map.find(child_name);
if( i != childs_map.end() )
{
return &i->second;
}
return nullptr;
}
} // namespace Ezc

83
src/valwrapper.h Normal file
View File

@@ -0,0 +1,83 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2025, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_valcache
#define headerfile_ezc_valcache
#include "val.h"
namespace Ezc
{
//ValWrapper
class ValWrapper
{
public:
ValWrapper();
ValWrapper(const ValWrapper &);
ValWrapper & operator=(const ValWrapper &);
Val val;
bool has_evaluated_val;
Val evaluated_val;
pt::Stream * evaluated_str; // can be null
void clear();
void clear_evaluated_value();
void clear_childs();
ValWrapper * add_child(const std::wstring & child_name, const ValWrapper & val);
ValWrapper * add_child(const std::wstring & child_name, const Val & val);
ValWrapper * find_child(const std::wstring & child_name);
private:
std::map<std::wstring, ValWrapper> childs_map;
};
} // namespace Ezc
#endif

44
src/version.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* This file is a part of EZC -- Easy templating in C++ library
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_ezc_version
#define headerfile_ezc_version
#define EZC_VERSION_MAJOR 0
#define EZC_VERSION_MINOR 9
#define EZC_VERSION_PATCH 5
#endif