From 287933f9ce4b7223431e8510e294f2017b74f1a9 Mon Sep 17 00:00:00 2001 From: Brad Arant Date: Sat, 16 Jul 2022 21:33:55 -0700 Subject: [PATCH] Added ZString.c_str() function; Added MStrin operator=. --- File.cpp | 4 ++++ File.h | 2 ++ MString.cpp | 9 +++++++++ MString.h | 18 +++++++++++++++++- ZString.cpp | 19 +++++++++++++++---- ZString.h | 13 +++++++++++++ testing/zstring_test | Bin 322168 -> 322240 bytes 7 files changed, 60 insertions(+), 5 deletions(-) diff --git a/File.cpp b/File.cpp index e56e512..a66b4eb 100644 --- a/File.cpp +++ b/File.cpp @@ -27,6 +27,10 @@ namespace coreutils { } } + File::File(coreutils::ZString &fileName, int mode, int authority) { + File(fileName.str(), mode, authority); + } + File::~File() { close(fd); setBufferSize(0); diff --git a/File.h b/File.h index 49fc6bc..1535ad3 100644 --- a/File.h +++ b/File.h @@ -3,6 +3,7 @@ #include #include +#include "ZString.h" /// /// File @@ -16,6 +17,7 @@ namespace coreutils { public: File(std::string fileName, int mode = O_RDONLY, int authority = 0664); + File(ZString &fileName, int mode = O_RDONLY, int authority = 0664); ~File(); void setBufferSize(size_t size); void read(); diff --git a/MString.cpp b/MString.cpp index 88104bd..32a18fe 100644 --- a/MString.cpp +++ b/MString.cpp @@ -47,6 +47,15 @@ namespace coreutils { if(data) free(data); } + + MString& MString::operator=(coreutils::ZString& value) { + if(*this == value) + return *this; + int len = length; + setSize(length + value.getLength()); + memcpy(data + len, value.getData(), value.getLength()); + return *this; + } int MString::write(char ch) { setSize(length + 1); diff --git a/MString.h b/MString.h index 26a59e3..1773714 100644 --- a/MString.h +++ b/MString.h @@ -7,7 +7,9 @@ namespace coreutils { /// /// Use the MString object when you need a permanent backing store on the heap - /// for a ZString style functionality. + /// for a ZString style functionality. Because MString has a backing store we + /// added functionalities to build strings as well as the parsing power of the + /// ZString. /// class MString : public ZString { @@ -48,8 +50,22 @@ namespace coreutils { ~MString(); + /// + /// Assignment operator will copy data to backing store. + /// + + MString& operator=(coreutils::ZString& data); + + /// + /// + /// + int write(char ch); + /// + /// + /// + int write(ZString &value); private: diff --git a/ZString.cpp b/ZString.cpp index 6a4d0b9..d5ee756 100644 --- a/ZString.cpp +++ b/ZString.cpp @@ -46,6 +46,11 @@ namespace coreutils { cursor = (char *)data.c_str(); } + ZString::~ZString() { + if(cdata) + free(cdata); + } + bool ZString::operator<(const ZString &valuex) const { return (strncmp(cursor, valuex.cursor, (valuex.length <= length ? valuex.length : length)) < 0); } @@ -101,24 +106,30 @@ namespace coreutils { return std::string(data, len); } + char* ZString::c_str() { + cdata = (char *)malloc(length + 1); + strncpy(cdata, data, length); + cdata[length] = '\0'; + return cdata; + } + std::vector &ZString::split(std::string delimiter, size_t maxSize) { coreutils::ZString zDelimiter((char *)delimiter.c_str(), delimiter.size()); return split(zDelimiter, maxSize); } - std::vector &ZString::split(ZString &delimiter, size_t maxSize) - { + std::vector &ZString::split(ZString &delimiter, size_t maxSize) { list.clear(); if (length == 0) { list.push_back(ZString("")); return list; } - + maxSize = maxSize == 0 ? 255: maxSize; char *end = data + length; char *pos = cursor; while ((pos + delimiter.getLength()) <= end) { - if ((strncmp(pos, delimiter.getData(), delimiter.getLength()) == 0) && (maxSize > 0)) + if ((strncmp(pos, delimiter.getData(), delimiter.getLength()) == 0) && (maxSize != 0)) { list.push_back(ZString(cursor, pos - cursor)); cursor = pos + delimiter.getLength(); diff --git a/ZString.h b/ZString.h index 07f769d..629dd9f 100644 --- a/ZString.h +++ b/ZString.h @@ -67,6 +67,12 @@ namespace coreutils { ZString(std::string string); + /// + /// Destructor for the ZString. + /// + + ~ZString(); + /// /// A friend method used to write the value of the ZString from the cursor /// point to an ostream using the << syntax. @@ -131,6 +137,12 @@ namespace coreutils { /// /// + char* c_str(); + + /// + /// + /// + std::vector &split(ZString &delimiter, size_t maxSize = 0); /// @@ -293,6 +305,7 @@ namespace coreutils { char *data; char *cursor; size_t length; + char *cdata = NULL; private: std::vector list; diff --git a/testing/zstring_test b/testing/zstring_test index cce96fbbd93f2bb97d5df70e64839f2e6502a1dc..67b85d584e6b4775428ae62457e8d2218f8bf236 100755 GIT binary patch delta 18521 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