pstring.cxx

来自「PTypes是一个扩充了多线程和网络功能的STL库」· CXX 代码 · 共 290 行

CXX
290
字号
/* * *  C++ Portable Types Library (PTypes) *  Version 2.0.2  Released 17-May-2004 * *  Copyright (C) 2001-2004 Hovik Melikyan * *  http://www.melikyan.com/ptypes/ * */#include <stdlib.h>#include <string.h>#include <time.h>#include "ptypes.h"#include "ptime.h"      // nowstring() is defined in this modulePTYPES_BEGINconst int strrecsize = sizeof(_strrec);static void stringoverflow() {    fatal(CRIT_FIRST + 21, "String overflow");}void string::idxerror(){    fatal(CRIT_FIRST + 20, "String index overflow");}int stralloc;char   emptystrbuf[strrecsize + 4];char*  emptystr = emptystrbuf + strrecsize;string nullstring;inline int quantize(int numchars) {	return memquantize(numchars + 1 + strrecsize);}void string::_alloc(int numchars) {    if (numchars <= 0)        stringoverflow();    size_t a = quantize(numchars);#ifdef DEBUG    stralloc += a;#endif    data = (char*)(memalloc(a)) + strrecsize;    STR_LENGTH(data) = numchars;    STR_REFCOUNT(data) = 1;    data[numchars] = 0;}void string::_realloc(int numchars) {    if (numchars <= 0 || STR_LENGTH(data) <= 0)        stringoverflow();    int a = quantize(numchars);    int b = quantize(STR_LENGTH(data));    if (a != b)    {#ifdef DEBUG        stralloc += a - b;#endif        data = (char*)(memrealloc(data - strrecsize, a)) + strrecsize;    }    STR_LENGTH(data) = numchars;    data[numchars] = 0;}inline void _freestrbuf(char* data){#ifdef DEBUG    stralloc -= quantize(STR_LENGTH(data));#endif    memfree((char*)(STR_BASE(data)));}void string::_free() {    _freestrbuf(data);    data = emptystr;}void string::initialize(const char* sc, int initlen) {    if (initlen <= 0 || sc == nil)        data = emptystr;     else     {        _alloc(initlen);        memmove(data, sc, initlen);    }}void string::initialize(const char* sc) {    initialize(sc, hstrlen(sc));}void string::initialize(char c) {    _alloc(1);    data[0] = c;}void string::initialize(const string& s){    data = s.data;#ifdef PTYPES_ST    STR_REFCOUNT(data)++;#else    pincrement(&STR_REFCOUNT(data));#endif}void string::finalize() {    if (STR_LENGTH(data) != 0)    {#ifdef PTYPES_ST        if (--STR_REFCOUNT(data) == 0)#else        if (pdecrement(&STR_REFCOUNT(data)) == 0)#endif            _freestrbuf(data);        data = emptystr;    }}char* ptdecl unique(string& s){    if (STR_LENGTH(s.data) > 0 && STR_REFCOUNT(s.data) > 1)    {        char* odata = s.data;        s._alloc(STR_LENGTH(s.data));        memcpy(s.data, odata, STR_LENGTH(s.data));#ifdef PTYPES_ST        STR_REFCOUNT(odata)--;#else        if (pdecrement(&STR_REFCOUNT(odata)) == 0)            _freestrbuf(odata);#endif    }    return s.data;}char* ptdecl setlength(string& s, int newlen){    if (newlen < 0)        return nil;    int curlen = STR_LENGTH(s.data);    // if becoming empty    if (newlen == 0)        s.finalize();    // if otherwise s was empty before    else if (curlen == 0)        s._alloc(newlen);    // if length is not changing, return a unique string    else if (newlen == curlen)        unique(s);    // non-unique reallocation    else if (STR_REFCOUNT(s.data) > 1)    {        char* odata = s.data;        s._alloc(newlen);        memcpy(s.data, odata, imin(curlen, newlen));#ifdef PTYPES_ST        STR_REFCOUNT(odata)--;#else        if (pdecrement(&STR_REFCOUNT(odata)) == 0)            _freestrbuf(odata);#endif    }    // unique reallocation    else        s._realloc(newlen);    return s.data;}void string::assign(const char* sc, int initlen) {    if (STR_LENGTH(data) > 0 && initlen > 0 && STR_REFCOUNT(data) == 1)    {        // reuse data buffer if unique        _realloc(initlen);        memmove(data, sc, initlen);    }    else    {        finalize();        if (initlen == 1)            initialize(sc[0]);        else if (initlen > 1)            initialize(sc, initlen);    }}void string::assign(const char* sc) {    assign(sc, hstrlen(sc));}void string::assign(char c) {    assign(&c, 1);}void string::assign(const string& s) {    if (data != s.data)    {        finalize();        initialize(s);    }}string ptdecl dup(const string& s){    // dup() only reads the data pointer so it is thread-safe    return string(s.data);}string ptdecl nowstring(const char* fmt, bool utc){    char buf[128];    time_t longtime;    time(&longtime);#if defined(PTYPES_ST) || defined(WIN32)    tm* t;    if (utc)        t = gmtime(&longtime);    else        t = localtime(&longtime);    int r = strftime(buf, sizeof(buf), fmt, t);#else    tm t;    if (utc)        gmtime_r(&longtime, &t);    else        localtime_r(&longtime, &t);    int r = strftime(buf, sizeof(buf), fmt, &t);#endif    buf[r] = 0;    return string(buf);}PTYPES_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?