亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? stringbuffer.cpp

?? funambol windows mobile plugin source code, the source code is taken from the funambol site
?? CPP
字號:
/*
 * Copyright (C) 2003-2007 Funambol, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY, TITLE, NONINFRINGEMENT or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 * 02111-1307  USA
 */

#include "base/fscapi.h"
#include "base/messages.h"
#include "base/util/utils.h"
#include "base/util/StringBuffer.h"
#include "base/test.h"

#include <stdio.h>

const size_t StringBuffer::npos = 0xFFFFFFFF;
static size_t growup = 5;

#if 0
/// FIXME: Debug code
#include <stdio.h>
void abort(const char *msg)
{
    FILE *f=fopen("\fatal.txt", "w");
    fputs(msg, f);
    fclose(f);
    exit(1);
}
size_t charlen = sizeof(char);
    if(charlen != 2) {
        abort("Panic: wide char size in not 2");
    }

#endif

StringBuffer::StringBuffer(const char* str, size_t len) {
    size = 0;
    s = 0;

    // if the given string is null, leave this null,
    // otherwise set it, even empty.
    if (str) {
        size_t slen = strlen(str);
        size_t newlen = (len > slen) ? slen : len ;

        if(newlen) {
            getmem(newlen);
            strncpy(s, str, newlen);
            s[newlen]=0;
        }
        else {  // empty string
            getmem(1);
            s[0] = 0;
        }
    }
}

StringBuffer::StringBuffer(const StringBuffer &sb) {
    size = 0;
    s = NULL;
    append(sb.c_str());
}

StringBuffer::~StringBuffer() {
    freemem();
}

StringBuffer& StringBuffer::append(const char* sNew) {
    if (sNew == NULL) {
        return *this;
    }

    unsigned long len = strlen(sNew);

    if (len == 0) {
        return *this;
    }
    if (s) {
        getmem(strlen(s) + len);
        strcat(s, sNew);
    }
    else {
        getmem(len);
        strcpy(s, sNew);
    }

    return *this;
}

StringBuffer& StringBuffer::append(unsigned long i, BOOL sign) {
    append(StringBuffer().sprintf(sign ? "%ld" : "%lu", i));

    return *this;
}

StringBuffer& StringBuffer::append(StringBuffer& str) {
    return append(str.getChars());
}

StringBuffer& StringBuffer::append(StringBuffer* str) {
    if (str)
        return append(str->getChars());
    else
        return *this;
}

StringBuffer& StringBuffer::set(const char* sNew) {
    if (sNew) {
        size_t len = strlen(sNew);
        if ( len ) {
            getmem( len );
            strcpy(s, sNew);
        }
        else if (s) {
            s[0]=0; // just make the string empty
        } else {
            getmem( 2 );
            strcpy(s, "");
        }
    }
    else {
        freemem();  // release the string and set it to null
    }

    return *this;
}

StringBuffer& StringBuffer::sprintf(const char* format, ...) {
    va_list ap;

    va_start(ap, format);
    this->vsprintf(format, ap);
    va_end(ap);

    return *this;
}

StringBuffer& StringBuffer::vsprintf(const char* format, va_list ap) {
    va_list aq;

    // ensure minimal size for first iteration
    int realsize = 255;

    do {
        // make a copy to keep ap valid for further iterations
#ifdef va_copy
        va_copy(aq, ap);
#else
        aq = ap;
#endif

        if (size < (unsigned long)realsize) {
            s = (char*)realloc(s, (realsize + 1) * sizeof(char));
            size = realsize;
        }

        realsize = vsnprintf(s, size + 1, format, aq);
        if (realsize == -1) {
            // old-style vnsprintf: exact len unknown, try again with doubled size
            realsize = size * 2;
        }
        va_end(aq);
    } while((unsigned long)realsize > size);

    // free extra memory
    s = (char*)realloc(s, (realsize + 1) * sizeof(char));
    size = realsize;

    return *this;
}


const char* StringBuffer::getChars() const { return s; }

unsigned long StringBuffer::length() const {
    return (s) ? strlen(s) : 0;
}

StringBuffer& StringBuffer::reset() {
    freemem();
    return *this;
}

size_t StringBuffer::find(const char *str, size_t pos) const
{
    if (pos >= length())
        return npos;
    char *p = strstr(s+pos, str);
    if(!p)
        return npos;
    return (p-s);
}

size_t StringBuffer::ifind(const char *str, size_t pos) const
{
    if (pos >= length())
        return npos;
    char *ls = strtolower(s+pos);
    char *lstr = strtolower(str);

    char *p = strstr(ls, lstr);

    size_t ret = (p) ? p-ls : npos;

    delete [] ls;
    delete [] lstr;

    return ret;
}

size_t StringBuffer::rfind(const char *str, size_t pos) const
{
    /*
    if (pos >= length())
        return npos;
    const char *p = brfind(s+pos, str);
    if(!p)
        return npos;
    return (p-s);
    */
    if (pos >= length())
        return npos;

    size_t tmp = StringBuffer::npos;
    int previous = pos;

    tmp = find(str, pos);
    if (tmp == StringBuffer::npos)
        return npos;

    while(1) {

        previous = tmp;
        tmp = find(str, tmp + 1);
        if (tmp == StringBuffer::npos)
            break;
    }

    return previous;

}


size_t StringBuffer::replace(const char *from, const char *to, size_t pos)
{
	size_t ret = npos;

    if (!s)
        return npos;

    if(pos>=length())
        return npos;

    char *p = strstr(s+pos, from);
    if (p) {
        size_t fpos = p - s;
        size_t flen = strlen(from), tlen = strlen(to);
        char *tail = 0;
        int ldiff = tlen - flen ;

        // reallocate if needed
        getmem(length() + ldiff);
        p = s + fpos;            // ensure that p is valid again
        // check is there is a remainder after the replaced token
        if( p[flen] ) {
            tail = new char[length()];
            strcpy(tail, p+flen);
        }
        // copy to in place of from
        strcpy(p, to);
        // copy the remainder of old string, if there is one
        if( tail ) {
            strcpy(p+tlen, tail);
            delete [] tail;
        }
		ret = p - s;
    }
    return ret;
}

// TODO: implement some smarter argorithm to avoid multiple reallocations
int StringBuffer::replaceAll(const char *from, const char *to, size_t pos) {
    int i=0;
    int len = strlen(to);
    size_t next;

    for(next=replace(from, to, pos); next != npos; next=replace(from,to,next + len) ) {
        i++;
    }
    return i;
}

ArrayList& StringBuffer::split(ArrayList &tokens, const char *separator) const {
    tokens.clear();
    size_t seplen = strlen(separator);
    char *base = s;
    char *p = strstr( base, separator );

    while( p )
    {
        StringBuffer token(base, p-base);
        tokens.add( token );
        base = p + seplen;
        p = strstr( base, separator );
    }
    StringBuffer token(base);
    tokens.add( token );

    return tokens;
}

StringBuffer& StringBuffer::join(ArrayList &tokens, const char *separator) {
    StringBuffer *line;
    size_t totlen = 0, seplen = strlen(separator);
    // Calc total size
    for (line=(StringBuffer *)tokens.front();
		 line;
         line=(StringBuffer *)tokens.next() ) {
        totlen += line->length() + seplen;
    }
    // Reserve mem
    reserve(totlen);
    // Join strings
    for (line=(StringBuffer *)tokens.front();
		 line;
         line=(StringBuffer *)tokens.next() ) {
        this->append(line->c_str());
        this->append(separator);
    }
    return *this;
}

StringBuffer StringBuffer::substr(size_t pos, size_t len) const {
    if(pos > strlen(s))
        return StringBuffer("");

	return (StringBuffer(s+pos, len));
}

void StringBuffer::reserve(size_t len) {
    getmem(len);
}

StringBuffer& StringBuffer::upperCase() {
    char* p = NULL;

    for(p = s; *p; p++) {
        *p=toupper(*p);
    }

    return *this;
}

StringBuffer& StringBuffer::lowerCase() {
    char* p = NULL;

    for(p = s; *p; p++) {
        *p=tolower(*p);
    }

    return *this;
}

/**
 * Perform case insensitive compare
 */
bool StringBuffer::icmp(const char *sc) const {
    return wcscmpIgnoreCase(s, sc);
}

ArrayElement* StringBuffer::clone() {
    return new StringBuffer(s);
}

bool StringBuffer::empty() const {
    if(!s)
        return true;
    if(!*s)
        return true;
    return false;
}

bool StringBuffer::null() const { return (s==0); }


// Member Operators
StringBuffer& StringBuffer::operator= (const char* sc)
    { return set(sc); }
StringBuffer& StringBuffer::operator= (const StringBuffer& sb)
    { return set(sb); }
StringBuffer& StringBuffer::operator+= (const char* sc)
    { append(sc); return *this; }
StringBuffer& StringBuffer::operator+= (const StringBuffer& s)
    { append(s); return *this; }
bool  StringBuffer::operator== (const char* sc) const
{
    if(!s)
        return (sc) ? false : true ;
    if (!sc)
        return false;

    return strcmp(s, sc) == 0;
}
bool  StringBuffer::operator== (const StringBuffer& sb) const
{
    return *this == sb.c_str();
}

bool  StringBuffer::operator!= (const char* sc) const
{
    return !(*this == sc);
}
bool  StringBuffer::operator!= (const StringBuffer& s) const
{
    return !(*this == s.c_str());
}


// Function operators
StringBuffer operator+(const StringBuffer& x, const char *y)
{
  StringBuffer result(x);
  result.append(y);
  return result;
}


//size_t StringBuffer_memcount = 0;

// Private allocator
void StringBuffer::getmem(size_t len)
{
    //fprintf(stderr, "GETMEM len=%ld s=%lx size=%ld\n", len, s, size);
    if(len > size) {
        // Remember the old length (0 for the null string)
        size_t oldlen = length();
        // Realloc the string (like malloc when s is null)
        s = (char *)realloc(s, (len+1) * sizeof(char) );
        //StringBuffer_memcount += (len-size);
        size = len;
        // Make sure s is terminated at the old position
        // (malloc may fill the buffer with rubbish)
        s[oldlen] = 0;
        //fprintf(stderr, "\t\ts=%lx size=%ld alloc=%ld\n", s, size, alloclen);
    }
}

// Private deallocator
void StringBuffer::freemem()
{
    if(s) {
        free(s); s = 0;
        //fprintf(stderr, "FREEMEM s=%lx size=%ld\n", s, size);
    }
    //StringBuffer_memcount -= size;
    size = 0;
}

/*
* Create a StringBuffer with a sequence of len chars.
* useful to have a string buffer directly from a SyncItem.getData(), SyncItem.getDataSize()
*/

StringBuffer::StringBuffer(const void* str, size_t len) {

    size = 0;
    s = 0;

    // if the given string is null, leave this null,
    // otherwise set it, even empty.
    if (str && len > 0) {

        getmem(len);
        strncpy(s, (const char*)str, len);
        s[len]=0;
    }
    else {  // empty string
        getmem(1);
        s[0] = 0;

    }
}


#ifdef ENABLE_UNIT_TESTS

class StringBufferTest : public CppUnit::TestFixture {
    CPPUNIT_TEST_SUITE(StringBufferTest);
    CPPUNIT_TEST(testSprintf);
    CPPUNIT_TEST_SUITE_END();

private:
    void testSprintf() {
        StringBuffer buf;

        buf.sprintf("foo %s %d", "bar", 42);
        CPPUNIT_ASSERT(buf == "foo bar 42");

        buf = doSprintf("foo %s %d", "bar", 42);
        CPPUNIT_ASSERT(buf == "foo bar 42");

        for (unsigned long size = 1; size < (1<<10); size *= 2) {
            buf.sprintf("%*s", (int)size, "");
            CPPUNIT_ASSERT_EQUAL(size, buf.length());
        }
    }

    StringBuffer doSprintf(const char* format, ...) {
        va_list ap;
        StringBuffer buf;

        va_start(ap, format);
        buf.vsprintf(format, ap);
        va_end(ap);

        return buf;
    }
};

FUNAMBOL_TEST_SUITE_REGISTRATION(StringBufferTest);

#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久日韩粉嫩一区二区三区 | 日本视频一区二区| 日韩免费观看高清完整版| 国产一区不卡视频| 亚洲欧美日韩小说| 欧美电影精品一区二区| 欧美视频在线观看一区| 91精品国产综合久久蜜臀 | 一区二区三区视频在线观看| 色av一区二区| 日本一区二区三区在线不卡| 日韩二区三区四区| 亚洲永久免费av| 成人av综合一区| 精品乱人伦小说| 欧美日韩久久一区| 91九色02白丝porn| av激情综合网| 国产精品久久久久久久久晋中| 91精品国产91综合久久蜜臀| 一级做a爱片久久| 亚洲人成网站影音先锋播放| 国产电影一区在线| 亚洲国产精品一区二区久久恐怖片 | 久久精品国产77777蜜臀| 色噜噜狠狠成人中文综合| 亚洲午夜一区二区| 日韩欧美一级二级三级久久久| 国产自产v一区二区三区c| 最新日韩av在线| 亚洲高清免费在线| 日韩精品中文字幕一区二区三区 | 日韩vs国产vs欧美| 91美女在线观看| 国产乱码精品一区二区三区忘忧草| 不卡欧美aaaaa| 丝袜美腿亚洲一区| 国产日韩av一区二区| 欧美系列一区二区| 丁香天五香天堂综合| 日韩午夜在线播放| 亚洲一区视频在线观看视频| 国产麻豆午夜三级精品| 亚洲视频电影在线| 麻豆一区二区三| 欧美午夜片在线观看| 国产一区在线视频| 国产日产欧美精品一区二区三区| 国产成人av一区二区三区在线 | 精品一区二区三区在线视频| 香蕉久久一区二区不卡无毒影院| 亚洲一区电影777| 亚洲图片自拍偷拍| 91精品国产一区二区人妖| 另类的小说在线视频另类成人小视频在线 | 视频在线观看国产精品| 欧美精品一区二区精品网| 韩国v欧美v日本v亚洲v| 99久久国产综合色|国产精品| 欧美三级日本三级少妇99| 亚洲精品中文在线影院| 国产福利一区在线| 久久理论电影网| 国产日韩一级二级三级| 97超碰欧美中文字幕| 色综合久久久久网| 91在线精品一区二区三区| 久久色视频免费观看| 艳妇臀荡乳欲伦亚洲一区| 日韩一区二区三区在线观看| 色综合av在线| 国产精品1024久久| 欧美丰满美乳xxx高潮www| 99久久精品免费看| 成人性生交大片免费看中文| 亚洲天堂2014| 久久久久久久国产精品影院| 日本韩国欧美三级| 精品成人在线观看| 老汉av免费一区二区三区| 久久久久久久久久久电影| 成人一道本在线| 欧美在线不卡视频| 国产精品毛片高清在线完整版| 色悠悠久久综合| 日韩一区二区三区在线| 国产精品久久久久久久裸模| 婷婷久久综合九色综合绿巨人| 精品少妇一区二区三区视频免付费| 欧美精品xxxxbbbb| 亚洲国产精品一区二区久久| 成人免费视频播放| 久久色在线观看| 久久丁香综合五月国产三级网站| 欧美老年两性高潮| 91美女片黄在线| 国产精品短视频| 91亚洲资源网| 国产日韩av一区二区| 久久久精品tv| 丁香婷婷综合色啪| 国产精品国产三级国产aⅴ中文| 亚洲va天堂va国产va久| 成人黄色777网| 日韩欧美一级二级三级| 视频一区欧美精品| 欧美xxxx老人做受| 日韩精品专区在线影院重磅| 97精品久久久久中文字幕| 国产精品一二三四区| 日韩一区二区在线看片| 亚洲综合网站在线观看| 国产综合色产在线精品| 日韩欧美在线网站| 一区二区国产盗摄色噜噜| 日本韩国欧美一区二区三区| 丝袜国产日韩另类美女| |精品福利一区二区三区| 欧美体内she精高潮| 亚洲国产精品一区二区www| 欧美日本一区二区| 蜜桃传媒麻豆第一区在线观看| 51精品国自产在线| 国产馆精品极品| 欧美国产精品中文字幕| www.在线欧美| 亚洲成人三级小说| 亚洲v精品v日韩v欧美v专区| 国产激情视频一区二区三区欧美| 久久国产免费看| 国产精品456| 精品91自产拍在线观看一区| 国产精品一区二区男女羞羞无遮挡| 国产无遮挡一区二区三区毛片日本| 久久久精品国产免费观看同学| 777xxx欧美| 激情综合亚洲精品| 久久久久久97三级| 99久久精品免费精品国产| 亚洲国产成人私人影院tom | 色婷婷av一区二区三区gif| 亚洲国产精品一区二区www | 国产精品国产三级国产aⅴ中文| 色婷婷狠狠综合| 日本不卡123| 国产精品久久久一本精品 | 国内精品嫩模私拍在线| 国产精品久久久久毛片软件| 91色在线porny| 美女一区二区视频| 国产精品国产三级国产aⅴ中文| 欧美日韩aaaaaa| 国产麻豆视频一区| 一区二区免费看| 国产亚洲成aⅴ人片在线观看 | 欧美日韩久久一区二区| 精品一区二区精品| 亚洲女同一区二区| 欧美一级xxx| 在线免费亚洲电影| 午夜精品久久久久久久蜜桃app| 国产女同性恋一区二区| 91麻豆国产在线观看| 国内外精品视频| 国产精品国产自产拍高清av| 精品噜噜噜噜久久久久久久久试看| 国产91清纯白嫩初高中在线观看| 视频一区国产视频| 国产亚洲制服色| 在线不卡中文字幕播放| 国产精品69毛片高清亚洲| 亚洲亚洲人成综合网络| 国产调教视频一区| 精品视频一区三区九区| 99久久99精品久久久久久| 欧美一区在线视频| 久久久国产一区二区三区四区小说 | 欧美一区二区女人| 欧美亚洲综合久久| 欧美丰满嫩嫩电影| 中文字幕一区二区三区四区 | 亚洲免费伊人电影| 亚洲国产婷婷综合在线精品| 久久久蜜桃精品| 在线播放日韩导航| 天天操天天综合网| 国产xxx精品视频大全| 7777精品伊人久久久大香线蕉经典版下载 | 高清av一区二区| 欧美三级在线播放| 日韩精品一区二区三区视频在线观看 | 亚洲精品在线三区| 中文字幕一区二区视频| 日本丶国产丶欧美色综合| 国产成人精品网址| 麻豆精品视频在线观看| 午夜精品爽啪视频| 成人毛片在线观看| 久久99国产精品麻豆| 婷婷久久综合九色国产成人|