5     #pragma warning(disable: 4996 4251)     6     #if !defined(DEVATLAS_STATIC)     7         #ifdef devatlas_EXPORTS     8             #define DA_EXPORT __declspec(dllexport)     10             #define DA_EXPORT __declspec(dllimport)    16 #define DA_EXPORT   __attribute__((visibility("default")))    17 #define DA_PRIVATE  __attribute__((visibility("hidden")))    34 #include <mtld/exception.h>    36 #if defined(__linux__) || defined(_WIN32)    37 size_t strlcpy(
char *, 
const char *, 
size_t);
    40 namespace Mobi { 
namespace Mtld { 
namespace Util {
    49     size_t avail() { 
return finish - cur; }
    54     Buf(
size_t capacity_, T *start_) 
    57         , finish(start_ + capacity_)
    71         : 
Buf<T>(capacity, 
new T[capacity]) {}
    73         delete [] this->start;
    80 template <
size_t size, 
typename T>
    95 template <
size_t Size>
   102     template <
typename ObjectType> 
inline ObjectType *allocate(
size_t count = 1);
   103     template <
typename ObjectType> 
inline void allocate(ObjectType *&ptr, 
size_t count = 1) { ptr = allocate<ObjectType>(count); }
   106 template <
size_t Size>
   111 template <
size_t Size>
   112 Alloc<Size>::~Alloc()
   115     for (Buf<char> *buf = chain; buf != &first; buf = next) {
   121 template <
size_t Size>
   122 template <
typename ObjectType>
   124 Alloc<Size>::allocate(
size_t count)
   126     static const size_t align = std::min(
size_t(8), 
sizeof (ObjectType));
   127     int space = count * 
sizeof (ObjectType);
   136     for (buf = chain;;  buf = buf->next) {
   138             buf = 
new HeapBuf<char>(std::max(
int(Size), space));
   145         int misalign = (intptr_t)p % align;
   147             p += align - misalign;
   148         if (buf->finish - p >= space)
   152     ObjectType *t = 
reinterpret_cast<ObjectType *
>(p);
   153     buf->cur = p + space;
   154     assert(buf->cur <= buf->finish); 
   159     Container *container;
   162     std::pair<int, El> operator *()
 const {
   163         return std::make_pair(
int(offset + container->first), container->elements.get()[offset]);
   166     bool operator==(
const templ_iterator &rhs) { 
return rhs.offset == offset; }
   167     bool operator!=(
const templ_iterator &rhs) { 
return rhs.offset != offset; }
   168     templ_iterator(Container *this_, 
int offset_) : container(this_), offset(offset_) {}
   178     std::unique_ptr<Element[]> elements;
   180     Element &operator[](
int index) {
   181         int off = index - first;
   186             elements.reset(
new Element[1]);
   187         } 
else if (off < 0) {
   190             size_t newCount = count + off;
   191             Element *newElements = 
new Element[newCount];
   192             memset(newElements, 0, off * 
sizeof(Element));
   193             memcpy(newElements + off, elements.get(), count * 
sizeof(Element));
   194             elements.reset(newElements);
   197         } 
else if (
size_t(off) >= count) {
   198             size_t newCount = 
static_cast<size_t>(off) + 1;
   199             Element *newElements = 
new Element[newCount];
   200             memset(newElements, 0, newCount * 
sizeof(Element));
   201             memcpy(newElements, elements.get(), count * 
sizeof(Element));
   203             elements.reset(newElements);
   206         return elements.get()[index - first];
   218     { 
return idx >= first && idx < first + count ? 
iterator(
this, idx - first) : 
iterator(
this, count); }
   232     bool empty()
 const { 
return count == 0; }
   240 DA_EXPORT 
inline const char *
   243     static constexpr 
char spaces[] = 
   247     if (depth > 
sizeof spaces - 1)
   248         depth = 
sizeof spaces - 1;
   249     return spaces + 
sizeof spaces - 1 - depth;
   252 DA_EXPORT 
inline char   253 nextchar(
const char *&p, 
int flags)
   261                 e << 
"invalid encoding";
   266                 if (flags & SKIPQUOTE) {
   277 DA_EXPORT 
inline char   278 nextword(
char *result, 
const char *&p, 
const char *terms, 
int flags)
   281         char c = nextchar(p, flags);
   282         if (strchr(terms, c) != 0) {