/* * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in doc/pod/gplicense.pod. * * Various string structures and functions. * * $Id: string.h,v 1.2 2007/08/28 17:08:07 pippijn Exp $ */ #ifndef ERMYTH_STRING_H #define ERMYTH_STRING_H void assign (char *dst, char const *src, size_t maxlen); template inline void assign (char (&dst)[N], char const *src) { assign ((char *)&dst, src, N); } /* static string */ struct ststr { ststr (char const * const initstr) : m_rep (initstr) { } ststr (ststr &initstr) : m_rep (initstr) { } char const *c_str () const { return m_rep; } operator char const * () const { return c_str (); } friend std::ostream &operator << (std::ostream &os, ststr const &rhs) { os << rhs.c_str (); return os; } private: char const * const m_rep; }; // dynamic string struct dynstr : zero_initialised { dynstr (size_t initlength = 32) : m_rep (new char[size]), pos (0), size (initlength) { } ~dynstr () { delete[] m_rep; } void reset () { m_rep[0] = '\0'; pos = 0; } char const *c_str () const { return m_rep; } operator char const * () const { return c_str (); } size_t length () { return pos; } dynstr &operator = (char const *rhs) { reset (); append (rhs, strlen (rhs)); return *this; } int append (char const c); int append_nonul (char const c); int append (char const * const src, size_t size); int append_nonul (char const * const src, size_t size); int append_unguarded (char const c); int append_unguarded_nonul (char const c); int append_unguarded (char const * const src, size_t size); int append_unguarded_nonul (char const * const src, size_t size); private: char *m_rep; size_t pos; size_t size; }; #endif