diff options
author | 2016-07-21 11:05:55 +0200 | |
---|---|---|
committer | 2016-07-21 11:05:55 +0200 | |
commit | 1e40d95e8b47d834d1ede706921dc19850aaaff2 (patch) | |
tree | f2e74d4451a527313fdc52f49b10955153f1dbd5 /src/lib/netlist/plib/pstring.cpp | |
parent | 7a69d48edd6e1f59c92271eb7fa217eaf0a714c7 (diff) |
Netlist updates:
- Removed trampolines (OUTLOGIC, INPLOGIC and friends).
- Started using doxygen comment and documentation style. Added doxygen
files to documentation folder.
- Refactored code triggered by doxygen output.
- Moved internal and support classes into namespace detail.
- Use an anordered map in parser.
- -Wconversion fixes - All done now.
- Fixed -Wold-style-cast warnings in netlist code.
- Added iterators to pstring.
- Moved two macros, added more RAII and improved exceptions. Fixed some
bugs in parser code.
- Fixed a number of bugs in parser code and exception handling.
[Couriersud]
Diffstat (limited to 'src/lib/netlist/plib/pstring.cpp')
-rw-r--r-- | src/lib/netlist/plib/pstring.cpp | 461 |
1 files changed, 209 insertions, 252 deletions
diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index 4db3de10503..644f7d6f49a 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -32,7 +32,7 @@ pstring_t<F>::~pstring_t() template<typename F> void pstring_t<F>::pcat(const mem_t *s) { - int slen = strlen(s); + std::size_t slen = strlen(s); pstr_t *n = salloc(m_ptr->len() + slen); if (m_ptr->len() > 0) std::memcpy(n->str(), m_ptr->str(), m_ptr->len()); @@ -46,7 +46,7 @@ void pstring_t<F>::pcat(const mem_t *s) template<typename F> void pstring_t<F>::pcat(const pstring_t &s) { - int slen = s.blen(); + std::size_t slen = s.blen(); pstr_t *n = salloc(m_ptr->len() + slen); if (m_ptr->len() > 0) std::memcpy(n->str(), m_ptr->str(), m_ptr->len()); @@ -60,7 +60,7 @@ void pstring_t<F>::pcat(const pstring_t &s) template<typename F> int pstring_t<F>::pcmp(const pstring_t &right) const { - long l = std::min(blen(), right.blen()); + std::size_t l = std::min(blen(), right.blen()); if (l == 0) { if (blen() == 0 && right.blen() == 0) @@ -72,18 +72,18 @@ int pstring_t<F>::pcmp(const pstring_t &right) const } int ret = memcmp(m_ptr->str(), right.cstr(), l); if (ret == 0) - ret = this->blen() - right.blen(); - if (ret < 0) - return -1; - else if (ret > 0) - return 1; - else - return 0; + { + if (this->blen() > right.blen()) + ret = 1; + else if (this->blen() < right.blen()) + ret = -1; + } + return ret; } template<typename F> -void pstring_t<F>::pcopy(const mem_t *from, int size) +void pstring_t<F>::pcopy(const mem_t *from, std::size_t size) { pstr_t *n = salloc(size); if (size > 0) @@ -94,139 +94,128 @@ void pstring_t<F>::pcopy(const mem_t *from, int size) } template<typename F> -const pstring_t<F> pstring_t<F>::substr(unsigned start, unsigned count) const +const pstring_t<F> pstring_t<F>::substr(const iterator start, const iterator end) const { pstring_t ret; - unsigned alen = len(); - if (start >= alen || count == 0) - return ret; - if (start + count > alen) - count = alen - start; - const mem_t *p = cstr(); - // find start - for (unsigned i=0; i<start; i++) - p += F::codelen(p); - const char *e = p; - for (unsigned i=0; i<count; i++) - e += F::codelen(e); - ret.pcopy(p, e-p); + //FIXME: throw ? + ret.pcopy(start.p, static_cast<std::size_t>(end.p - start.p)); return ret; } + template<typename F> const pstring_t<F> pstring_t<F>::ucase() const { pstring_t ret = *this; ret.pcopy(cstr(), blen()); for (std::size_t i=0; i<ret.len(); i++) - ret.m_ptr->str()[i] = toupper((unsigned) ret.m_ptr->str()[i]); + ret.m_ptr->str()[i] = static_cast<char>(toupper(static_cast<int>(ret.m_ptr->str()[i]))); return ret; } template<typename F> -int pstring_t<F>::find_first_not_of(const pstring_t &no) const +typename pstring_t<F>::iterator pstring_t<F>::find_first_not_of(const pstring_t &no) const { - char *t = m_ptr->str(); - unsigned nolen = no.len(); - unsigned tlen = len(); - for (std::size_t i=0; i < tlen; i++) + for (auto it = begin(); it != end(); ++it) { - char *n = no.m_ptr->str(); bool f = true; - for (std::size_t j=0; j < nolen; j++) + for (auto const jt : no) { - if (F::code(t) == F::code(n)) + if (*it == jt) + { f = false; - n += F::codelen(t); + break; + } } if (f) - return i; - t += F::codelen(t); + return it; } - return -1; + return end(); } template<typename F> -int pstring_t<F>::find_last_not_of(const pstring_t &no) const +typename pstring_t<F>::iterator pstring_t<F>::find_last_not_of(const pstring_t &no) const { - char *t = m_ptr->str(); - unsigned nolen = no.len(); - unsigned tlen = len(); - int last_found = -1; - for (std::size_t i=0; i < tlen; i++) + /* FIXME: reverse iterator */ + iterator last_found = end(); + for (auto it = begin(); it != end(); ++it) { - char *n = no.m_ptr->str(); bool f = true; - for (std::size_t j=0; j < nolen; j++) + for (auto const jt : no) { - if (F::code(t) == F::code(n)) + if (*it == jt) + { f = false; - n += F::codelen(t); + break; + } } if (f) - last_found = i; - t += F::codelen(t); + last_found = it; } return last_found; } template<typename F> -pstring_t<F> pstring_t<F>::replace(const pstring_t &search, const pstring_t &replace) const +typename pstring_t<F>::iterator pstring_t<F>::find(const pstring_t &search, iterator start) const { - // FIXME: use this pstringbuffer ret = ""; - pstring_t ret = ""; - const int slen = search.blen(); - const int tlen = blen(); - - if (slen == 0 || tlen < slen ) - return *this; - int i = 0; - while (i < tlen - slen + 1) + for (; start != end(); ++start) { - if (memcmp(cstr()+i,search.cstr(),slen) == 0) - { - ret += replace; - i += slen; - } - else + iterator itc(start); + auto cmp = search.begin(); + while (itc != end() && cmp != search.end() && *itc == *cmp) { - /* avoid adding a code, cat a string ... */ - mem_t buf[2] = { *(cstr() + i), 0 }; - ret = ret.cat(buf); - i++; + ++itc; + ++cmp; } + if (cmp == search.end()) + return start; + } + return end(); +} + +template<typename F> +pstring_t<F> pstring_t<F>::replace(const pstring_t &search, const pstring_t &replace) const +{ + pstring_t ret(""); + const size_type slen = search.len(); + + auto last_s = begin(); + auto s = find(search, last_s); + while (s != end()) + { + ret += substr(last_s, s); + ret += replace; + last_s = s + slen; + s = find(search, last_s); } - ret = ret.cat(cstr() + i); + ret += substr(last_s, end()); return ret; } template<typename F> const pstring_t<F> pstring_t<F>::ltrim(const pstring_t &ws) const { - int f = find_first_not_of(ws); - if (f>=0) - return substr(f); - else - return ""; + return substr(find_first_not_of(ws), end()); } template<typename F> const pstring_t<F> pstring_t<F>::rtrim(const pstring_t &ws) const { - int f = find_last_not_of(ws); - if (f>=0) - return left(f+1); + auto f = find_last_not_of(ws); + if (f==end()) + return pstring_t(""); else - return ""; + return substr(begin(), f + 1); } template<typename F> -const pstring_t<F> pstring_t<F>::rpad(const pstring_t &ws, const unsigned cnt) const +const pstring_t<F> pstring_t<F>::rpad(const pstring_t &ws, const size_type cnt) const { // FIXME: pstringbuffer ret(*this); pstring_t ret(*this); - while (ret.len() < cnt) + size_type wsl = ws.len(); + for (auto i = ret.len(); i < cnt; i+=wsl) ret += ws; return ret; } @@ -271,6 +260,133 @@ long pstring_t<F>::as_long(bool *error) const return ret; } +template<typename F> +typename pstring_t<F>::iterator pstring_t<F>::find(const mem_t *search, iterator start) const +{ + for (; start != end(); ++start) + { + iterator itc(start); + iterator cmp(search); + while (itc != end() && *cmp != 0 && *itc == *cmp) + { + ++itc; + ++cmp; + } + if (*cmp == 0) + return start; + } + return end(); +} + +template<typename F> +bool pstring_t<F>::startsWith(const pstring_t &arg) const +{ + if (arg.blen() > blen()) + return false; + else + return (memcmp(arg.cstr(), cstr(), arg.blen()) == 0); +} + +template<typename F> +bool pstring_t<F>::endsWith(const pstring_t &arg) const +{ + if (arg.blen() > blen()) + return false; + else + return (memcmp(cstr()+this->blen()-arg.blen(), arg.cstr(), arg.blen()) == 0); +} + + +template<typename F> +bool pstring_t<F>::startsWith(const mem_t *arg) const +{ + std::size_t alen = strlen(arg); + if (alen > blen()) + return false; + else + return (memcmp(arg, cstr(), alen) == 0); +} + +template<typename F> +int pstring_t<F>::pcmp(const mem_t *right) const +{ + return std::strcmp(m_ptr->str(), right); +} + +// ---------------------------------------------------------------------------------------- +// pstringbuffer +// ---------------------------------------------------------------------------------------- + +pstringbuffer::~pstringbuffer() +{ + if (m_ptr != nullptr) + plib::pfree_array(m_ptr); +} + +void pstringbuffer::resize(const std::size_t size) +{ + if (m_ptr == nullptr) + { + m_size = DEFAULT_SIZE; + while (m_size <= size) + m_size *= 2; + m_ptr = plib::palloc_array<char>(m_size); + *m_ptr = 0; + m_len = 0; + } + else if (m_size < size) + { + while (m_size < size) + m_size *= 2; + char *new_buf = plib::palloc_array<char>(m_size); + std::memcpy(new_buf, m_ptr, m_len + 1); + plib::pfree_array(m_ptr); + m_ptr = new_buf; + } +} + +void pstringbuffer::pcopy(const char *from) +{ + std::size_t nl = strlen(from) + 1; + resize(nl); + std::memcpy(m_ptr, from, nl); +} + +void pstringbuffer::pcopy(const pstring &from) +{ + std::size_t nl = from.blen() + 1; + resize(nl); + std::memcpy(m_ptr, from.cstr(), nl); +} + +void pstringbuffer::pcat(const char *s) +{ + const std::size_t slen = std::strlen(s); + const std::size_t nl = m_len + slen + 1; + resize(nl); + std::memcpy(m_ptr + m_len, s, slen + 1); + m_len += slen; +} + +void pstringbuffer::pcat(const void *m, std::size_t l) +{ + const std::size_t nl = m_len + l + 1; + resize(nl); + std::memcpy(m_ptr + m_len, m, l); + m_len += l; + *(m_ptr + m_len) = 0; +} + +void pstringbuffer::pcat(const pstring &s) +{ + const std::size_t slen = s.blen(); + const std::size_t nl = m_len + slen + 1; + resize(nl); + std::memcpy(m_ptr + m_len, s.cstr(), slen); + m_len += slen; + m_ptr[m_len] = 0; +} + // ---------------------------------------------------------------------------------------- // static stuff ... // ---------------------------------------------------------------------------------------- @@ -285,11 +401,11 @@ long pstring_t<F>::as_long(bool *error) const static std::stack<pstr_t *> *stk = nullptr; -static inline unsigned countleadbits(unsigned x) +static inline std::size_t countleadbits(std::size_t x) { #ifndef count_leading_zeros - unsigned msk; - unsigned ret; + std::size_t msk; + std::size_t ret; if (x < 0x100) { msk = 0x80; @@ -329,25 +445,25 @@ void pstring_t<F>::sfree(pstr_t *s) { if (stk != nullptr) { - unsigned sn= ((32 - countleadbits(s->len())) + 1) / 2; + size_type sn= ((32 - countleadbits(s->len())) + 1) / 2; stk[sn].push(s); } else - plib::pfree_array(((char *)s)); + plib::pfree_array(reinterpret_cast<char *>(s)); //_mm_free(((char *)s)); } } template<typename F> -pstr_t *pstring_t<F>::salloc(int n) +pstr_t *pstring_t<F>::salloc(std::size_t n) { if (stk == nullptr) stk = plib::palloc_array<std::stack<pstr_t *>>(17); pstr_t *p; std::size_t sn= ((32 - countleadbits(n)) + 1) / 2; - std::size_t size = sizeof(pstr_t) + ((std::size_t) 1<<(sn * 2)) + 1; + std::size_t size = sizeof(pstr_t) + (static_cast<std::size_t>(1)<<(sn * 2)) + 1; if (stk[sn].empty()) - p = (pstr_t *) plib::palloc_array<char>(size); + p = reinterpret_cast<pstr_t *>(plib::palloc_array<char>(size)); else { p = stk[sn].top(); @@ -384,7 +500,7 @@ void pstring_t<F>::sfree(pstr_t *s) s->m_ref_count--; if (s->m_ref_count == 0 && s != &m_zero) { - pfree_array(((char *)s)); + plib::pfree_array(((char *)s)); //_mm_free(((char *)s)); } } @@ -393,7 +509,7 @@ template<typename F> pstr_t *pstring_t<F>::salloc(int n) { int size = sizeof(pstr_t) + n + 1; - pstr_t *p = (pstr_t *) palloc_array(char, size); + pstr_t *p = (pstr_t *) plib::palloc_array<char>(size); // str_t *p = (str_t *) mm_malloc(size, 8); p->init(n); return p; @@ -406,168 +522,9 @@ void pstring_t<F>::resetmem() } #endif - -// ---------------------------------------------------------------------------------------- -// pstring ... -// ---------------------------------------------------------------------------------------- - -template<typename F> -int pstring_t<F>::find(const pstring_t &search, unsigned start) const -{ - const unsigned tlen = len(); - const unsigned slen = search.len(); - const mem_t *s = search.cstr(); - const unsigned startt = std::min(start, tlen); - const mem_t *t = cstr(); - for (std::size_t i=0; i<startt; i++) - t += F::codelen(t); - for (int i=0; i <= (int) tlen - (int) startt - (int) slen; i++) - { - if (F::code(t) == F::code(s)) - if (std::memcmp(t,s,search.blen())==0) - return i+startt; - t += F::codelen(t); - } - return -1; -} - -template<typename F> -int pstring_t<F>::find(const mem_t *search, unsigned start) const -{ - const unsigned tlen = len(); - unsigned slen = 0; - unsigned sblen = 0; - const mem_t *x = search; - while (*x != 0) - { - slen++; - const unsigned sl = F::codelen(x); - x += sl; - sblen += sl; - } - const char *s = search; - const unsigned startt = std::min(start, tlen); - const char *t = cstr(); - for (std::size_t i=0; i<startt; i++) - t += F::codelen(t); - for (int i=0; i <= (int) tlen - (int) startt - (int) slen; i++) - { - if (F::code(t) == F::code(s)) - if (std::memcmp(t,s,sblen)==0) - return i+startt; - t += F::codelen(t); - } - return -1; -} - -template<typename F> -bool pstring_t<F>::startsWith(const pstring_t &arg) const -{ - if (arg.blen() > blen()) - return false; - else - return (memcmp(arg.cstr(), cstr(), arg.len()) == 0); -} - -template<typename F> -bool pstring_t<F>::endsWith(const pstring_t &arg) const -{ - if (arg.blen() > blen()) - return false; - else - return (memcmp(cstr()+this->len()-arg.len(), arg.cstr(), arg.len()) == 0); -} - - -template<typename F> -bool pstring_t<F>::startsWith(const mem_t *arg) const -{ - unsigned alen = strlen(arg); - if (alen > blen()) - return false; - else - return (memcmp(arg, cstr(), alen) == 0); -} - -template<typename F> -int pstring_t<F>::pcmp(const mem_t *right) const -{ - return std::strcmp(m_ptr->str(), right); -} - // ---------------------------------------------------------------------------------------- -// pstringbuffer +// template stuff ... // ---------------------------------------------------------------------------------------- -pstringbuffer::~pstringbuffer() -{ - if (m_ptr != nullptr) - plib::pfree_array(m_ptr); -} - -void pstringbuffer::resize(const std::size_t size) -{ - if (m_ptr == nullptr) - { - m_size = DEFAULT_SIZE; - while (m_size <= size) - m_size *= 2; - m_ptr = plib::palloc_array<char>(m_size); - *m_ptr = 0; - m_len = 0; - } - else if (m_size < size) - { - while (m_size < size) - m_size *= 2; - char *new_buf = plib::palloc_array<char>(m_size); - std::memcpy(new_buf, m_ptr, m_len + 1); - plib::pfree_array(m_ptr); - m_ptr = new_buf; - } -} - -void pstringbuffer::pcopy(const char *from) -{ - std::size_t nl = strlen(from) + 1; - resize(nl); - std::memcpy(m_ptr, from, nl); -} - -void pstringbuffer::pcopy(const pstring &from) -{ - std::size_t nl = from.blen() + 1; - resize(nl); - std::memcpy(m_ptr, from.cstr(), nl); -} - -void pstringbuffer::pcat(const char *s) -{ - const std::size_t slen = std::strlen(s); - const std::size_t nl = m_len + slen + 1; - resize(nl); - std::memcpy(m_ptr + m_len, s, slen + 1); - m_len += slen; -} - -void pstringbuffer::pcat(const void *m, unsigned l) -{ - const std::size_t nl = m_len + l + 1; - resize(nl); - std::memcpy(m_ptr + m_len, m, l); - m_len += l; - *(m_ptr + m_len) = 0; -} - -void pstringbuffer::pcat(const pstring &s) -{ - const std::size_t slen = s.blen(); - const std::size_t nl = m_len + slen + 1; - resize(nl); - std::memcpy(m_ptr + m_len, s.cstr(), slen); - m_len += slen; - m_ptr[m_len] = 0; -} - template struct pstring_t<pu8_traits>; template struct pstring_t<putf8_traits>; |