Commit Graph

224 Commits

Author SHA1 Message Date
Tomasz Sowa 4a1630b1ea removed support for so called child objects from Space (this was an old feature of Space struct, now not needed)
Space::get_object_field(...) renamed to Space::get_space(...)
2021-06-26 22:56:12 +02:00
Tomasz Sowa 8ec9350d52 added two functions to utf8:
template<typename StreamType> bool utf8_to_wide(const Stream & stream, StreamType & res, bool clear = true, int mode = 1);
template<typename StreamType> bool wide_stream_to_utf8(const Stream & stream, StreamType & utf8, bool clear = true, int mode = 1);

these functions are moved from TextStreamBase
2021-06-25 19:10:01 +02:00
Tomasz Sowa 792057a869 make depend 2021-06-24 21:18:48 +02:00
Tomasz Sowa 4d9f5f6c55 Log class has the Stream class as a base class now
- implemented some missing operators<<(...)
- removed Manipulators: l1, l2, l3, l4, lend, lsave
- PascalCase to snake_case in Log

added to Stream:
  virtual bool is_char_stream() const = 0;
  virtual bool is_wchar_stream() const = 0;
  virtual char get_char(size_t index) const = 0;
  virtual wchar_t get_wchar(size_t index) const = 0;
  virtual Stream & operator<<(const Stream & stream) = 0;
2021-06-24 20:52:48 +02:00
Tomasz Sowa 2b6789754f implemented pretty printing in Space::serialize_to_json_stream(StreamType & str, bool pretty_print, int level) 2021-06-23 21:54:34 +02:00
Tomasz Sowa 3c0b59e115 added to Space: long double to Space::Value and methods for converting from/to long double
added global methods for converting float/string double/string and long double/string (convert/double.h|cpp):
      float to_float(const char * str, const char ** after = nullptr);
      float to_float(const wchar_t * str, const wchar_t ** after = nullptr);
      double to_double(const char * str, const char ** after = nullptr);
      double to_double(const wchar_t * str, const wchar_t ** after = nullptr);
      long double to_long_double(const char * str, const char ** after = nullptr);
      long double to_long_double(const wchar_t * str, const wchar_t ** after = nullptr);
      float to_float(const std::string & str, const char ** after = nullptr);
      float to_float(const std::wstring & str, const wchar_t ** after = nullptr);
      double to_double(const std::string & str, const char ** after = nullptr);
      double to_double(const std::wstring & str, const wchar_t ** after = nullptr);
      long double to_long_double(const std::string & str, const char ** after = nullptr);
      long double to_long_double(const std::wstring & str, const wchar_t ** after = nullptr);
      std::string to_str(float val);
      std::wstring to_wstr(float val);
      std::string to_str(double val);
      std::wstring to_wstr(double val);
      std::string to_str(long double val);
      std::wstring to_wstr(long double val);
2021-06-23 17:01:43 +02:00
Tomasz Sowa c1f1dc96df added Space::serialize_to_string(StreamType & stream) template 2021-06-22 17:52:55 +02:00
Tomasz Sowa 99fbdc1635 in Log::~Log(): removed call to save_log_and_clear()
it creates a problem if a buffer is destroyed first:
2021-06-20 18:19:53 +02:00
Tomasz Sowa 4a2a99a77d removed a comment 2021-06-20 17:39:37 +02:00
Tomasz Sowa 0865c41e48 make depend 2021-06-20 16:47:12 +02:00
Tomasz Sowa ac407b2362 macro renamed: PT_HAS_MORM -> PT_HAS_MORM_LIBRARY
TextStream::to_string(...) is now TextStream::to_str(...)
added: std::string TextStream::to_str() const;
added: std::wstring TextStream::to_wstr() const;
2021-06-20 16:46:08 +02:00
Tomasz Sowa 819c49e638 added class Stream (textstream/stream.h) which acts as a base class for TextStream
TextStream is making conversions wide/utf8 now
2021-06-20 14:13:23 +02:00
Tomasz Sowa 865837d911 fixed in Space::find_child_space_const(...) - clang address sanitizer reports stack-use-after-scope
we have got a reference to a Space instead of a pointer and a local object was created and returned

==15076==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7fffffffc7c0 at pc 0x000800a5d1bd bp 0x7fffffffc700 sp 0x7fffffffc6f8
READ of size 4 at 0x7fffffffc7c0 thread T0
    #0 0x800a5d1bc in pt::Space::is_object() const /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:778:9
    #1 0x800a67046 in pt::Space::get_object_field(wchar_t const*) /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:1519:6
    #2 0x800a6761c in pt::Space::get_table(wchar_t const*) /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:1582:18
    #3 0x800a694cb in pt::Space::find_child_space_table() /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:1953:9
    #4 0x800855718 in Winix::TimeZone::SetTz(pt::Space&) /usr/home/tomek/roboczy/prog/winix/winixd/core/timezone.cpp:316:45
    #5 0x80085b3a9 in Winix::TimeZones::ParseZones() /usr/home/tomek/roboczy/prog/winix/winixd/core/timezones.cpp:134:18
    #6 0x80085c04b in Winix::TimeZones::ReadTimeZones(wchar_t const*) /usr/home/tomek/roboczy/prog/winix/winixd/core/timezones.cpp:176:3
    #7 0x80085c69f in Winix::TimeZones::ReadTimeZones(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&) /usr/home/tomek/roboczy/prog/winix/winixd/core/timezones.cpp:199:9
    #8 0x80083c380 in Winix::System::ReadTimeZones() /usr/home/tomek/roboczy/prog/winix/winixd/core/system.cpp:122:13
    #9 0x80083ca19 in Winix::System::Init() /usr/home/tomek/roboczy/prog/winix/winixd/core/system.cpp:172:2
    #10 0x80069ce41 in Winix::App::Init() /usr/home/tomek/roboczy/prog/winix/winixd/core/app.cpp:355:9
    #11 0x2de92e in main /usr/home/tomek/roboczy/prog/winix/winixd/main/main.cpp:206:11

Address 0x7fffffffc7c0 is located in stack of thread T0 at offset 128 in frame
    #0 0x800a66f3f in pt::Space::get_object_field(wchar_t const*) /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:1518

  This frame has 3 object(s):
    [32, 40) 'i' (line 1521)
    [64, 88) 'ref.tmp' (line 1521)
    [128, 136) 'ref.tmp4' (line 1523) <== Memory access at offset 128 is inside this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope /usr/home/tomek/roboczy/prog/pikotools/src/space/space.cpp:778:9 in pt::Space::is_object() const
Shadow bytes around the buggy address:
  0x4ffffffff8a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff8b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff8c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff8d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff8e0: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 f8 f2 f2 f2
=>0x4ffffffff8f0: f8 f8 f8 f2 f2 f2 f2 f2[f8]f3 f3 f3 00 00 00 00
  0x4ffffffff900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff920: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 f8 f2 f2 f2
  0x4ffffffff930: f8 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
  0x4ffffffff940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==15076==ABORTING
2021-06-18 18:52:24 +02:00
Tomasz Sowa 6d2503ae0e make depend 2021-06-16 23:44:21 +02:00
Tomasz Sowa 06e0f13df9 added a comment in textstream.h 2021-06-16 17:44:24 +02:00
Tomasz Sowa 8b0ed5e750 added to TextStream:
TextStreamBase & operator<<(unsigned char);
  TextStreamBase & operator<<(bool);
  TextStreamBase & operator<<(short);
  TextStreamBase & operator<<(unsigned short);
  TextStreamBase & operator<<(float);
  TextStreamBase & operator<<(long double);
2021-06-15 19:54:50 +02:00
Tomasz Sowa 55f6bda3ab Merge branch 'api2021'
added support for surrogate pairs when reading \uHHHH format
added support to parse \u{H...} format (only if parsing Space format)
and some fixes
2021-06-14 13:51:53 +02:00
Tomasz Sowa 4d70ae9e87 fixed: using size() when serializing strings - this allows to serialize a string which contain a null character
fixed: printing null character in space format: \u0000 (before was \0 which is not correct in json)
fixed: in serialize_string_buffer(const char * input_str, ...) a temporary fixed was used when copying input string
added support for surrogate pairs when reading \uHHHH format
added support to parse \u{H...} format (only if parsing Space format)
2021-06-14 13:48:32 +02:00
Tomasz Sowa 848cdf9c03 Merge pull request 'api2021 part I' (#4) from api2021 into master
Reviewed-on: #4
2021-05-27 10:37:35 +02:00
Tomasz Sowa 49c2b478c0 fixed return value from Space::add_child_space() 2021-05-21 17:32:10 +02:00
Tomasz Sowa 5ce36ea844 changed the way how child_spaces are created in Space class
- removed child_spaces and name pointers
- now a table with child spaces is created under "child_spaces" object field
- a name of the child space is stored in "name" field of the child object

added methods for manipulating with child spaces:
TableType * find_child_space_table()
bool child_spaces_empty()
size_t child_spaces_size()

Space * find_child_space(size_t table_index)
Space & add_child_space(const wchar_t * space_name)
Space & add_child_space(const std::wstring & space_name)

std::wstring * find_child_space_name()
std::wstring get_child_space_name()
bool is_child_space_name(const wchar_t * name)

added additional methods:
size_t str_size()
size_t wstr_size()
size_t object_size()
size_t table_size()
2021-05-21 17:13:11 +02:00
Tomasz Sowa c11aa78335 changed: names of methods in SpaceParser: PascalCase to snake_case 2021-05-21 04:42:55 +02:00
Tomasz Sowa 6e4a0f68b3 removed from SpaceParser: SetDefault(), SkipEmpty(bool skip) and UseEscapeChar(bool escape) methods 2021-05-21 04:28:31 +02:00
Tomasz Sowa 82a21f6d85 removed: SpaceParser::SetSpace(...) methods, now ParseJSON/Space(...) methods take a space as an argument 2021-05-21 01:33:01 +02:00
Tomasz Sowa abeca010cc fixed: SpaceParser was using space->set_empty_object() when parsing a space
and it cleared all values if not an empty object was provided to the set_space() method
2021-05-21 00:26:19 +02:00
Tomasz Sowa 59d4c9a9c8 changed utf8 functions: PascalCase to snake_case 2021-05-21 00:24:56 +02:00
Tomasz Sowa b574289054 namespace PT renamed to pt 2021-05-20 16:11:12 +02:00
Tomasz Sowa 6f50626dda fixed another memory leak in CSVParser::parse() (similar like before) 2021-05-19 22:34:10 +02:00
Tomasz Sowa f8d24de386 fixed memory leak in CSVParser::parse() - a Space struct was allocated but never freed 2021-05-19 22:31:18 +02:00
Tomasz Sowa 604b47db32 added move semantics to Space class
added methods:
Space(Space && space);
Space & operator=(Space && space);
void set(const Space & space);
void set(Space && space);
Space & add(const Space & space);
Space & add(Space && space);
Space & add(const wchar_t * field, const Space & space);
Space & add(const wchar_t * field, Space && space);
Space & add(const std::wstring & field, const Space & space);
Space & add(const std::wstring & field, Space && space);
2021-05-19 22:24:53 +02:00
Tomasz Sowa 430822bad8 make depend 2021-05-19 03:26:57 +02:00
Tomasz Sowa 0ea5497094 added CSVParser - a csv parser 2021-05-19 03:26:46 +02:00
Tomasz Sowa ae1d25d5f3 removed old not used variable from Space 2021-05-19 03:23:18 +02:00
Tomasz Sowa e0565813de removed *.a from .gitignore 2021-05-18 23:58:46 +02:00
Tomasz Sowa db93586c0e make depend 2021-05-18 23:58:17 +02:00
Tomasz Sowa ad4e8078ae MainSpaceParser class has been renamed to MainOptionsParser 2021-05-18 23:57:58 +02:00
Tomasz Sowa 96e60c526f moved files: mainspaceparser/mainspaceparser.(h|cpp) -> mainoptions/mainoptionsparser.(h|cpp) 2021-05-18 23:50:42 +02:00
Tomasz Sowa a5c8833452 added tests for MainSpaceParser 2021-05-18 22:57:26 +02:00
Tomasz Sowa 91300bb245 make depend 2021-05-17 03:21:00 +02:00
Tomasz Sowa fe82f63efb changed the way of building in Makefiles 2021-05-17 03:20:51 +02:00
Tomasz Sowa da6a36a205 start creating tests for MainSpaceParser 2021-05-17 03:19:47 +02:00
Tomasz Sowa ac691bccb7 updated MainSpaceParser to the new Space format, changed api to snake case
now we can:
- parse short options, those beginning with a hypnen '-'
- parse long options, those beginning with two hyphens '--'
- long options can have arguments in two forms:
  - either with an equal sign, e.g.: --opion-name=argument
  - or with a space, e.g: --option argument
    in the latter case we can have more than one argument, e.g: --option argument1 argument2
- parse non-option arguments, those after two hyphens to the end of a string, e.g: -- arg1 arg2
2021-05-17 03:09:21 +02:00
Tomasz Sowa 77d7bb5e64 fixed in Space: set_empty_string(), set_empty_wstring(), set_empty_table() and set_empty_object() didn't clear its object
if the same kind of object already existed
2021-05-17 03:08:32 +02:00
Tomasz Sowa 3d6c4e27c0 added .editorconfig file with tab style and tab size information
https://editorconfig.org/
2021-05-15 18:34:10 +02:00
Tomasz Sowa 1260b303bc added ./m to .gitignore 2021-05-10 21:24:37 +02:00
Tomasz Sowa d3dd74b3d4 added tests/tests to .gitignore 2021-05-10 20:16:54 +02:00
Tomasz Sowa 7bdc4d2fc7 added global Makefile 2021-05-10 20:10:10 +02:00
Tomasz Sowa ce81670bb6 added 'tests' directory with tests for the pikotools library
currently only tests for convert/text functions
2021-05-10 20:08:50 +02:00
Tomasz Sowa cd9e501f48 make depend 2021-05-10 20:08:19 +02:00
Tomasz Sowa b3cd4d5f7f removed definition of CXX and CXXFLAGS from Makefile 2021-05-10 20:07:08 +02:00