summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pstring.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-07-21 11:05:55 +0200
committer couriersud <couriersud@arcor.de>2016-07-21 11:05:55 +0200
commit1e40d95e8b47d834d1ede706921dc19850aaaff2 (patch)
treef2e74d4451a527313fdc52f49b10955153f1dbd5 /src/lib/netlist/plib/pstring.cpp
parent7a69d48edd6e1f59c92271eb7fa217eaf0a714c7 (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.cpp461
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>;