⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 str.cpp

📁 dget是一个基于Linux平台的多线程下载工具, 采用C++开发。主要支持FTP, HTTP, MMS, RTSP协议下载, 目前为止主要实现了FTP, HTTP, MMS,RTSP协议的多线程下载
💻 CPP
字号:
/**************************************************************************** * *  Copyright (C) 2000-2001 RealNetworks, Inc. All rights reserved. * *  This program is free software.  It may be distributed under the terms *  in the file LICENSE, found in the top level of the source distribution. * */#include <ctype.h>#include <string.h>#include "types.h"#include "str.h"#include "dbg.h"/************************************** * * CBuffer * **************************************/CBuffer::CBuffer( void ) :    m_nAlloc(0),    m_nLen(0),    m_buf(NULL){    // Empty}CBuffer::CBuffer( const CBuffer& other ) :    m_nAlloc(0),    m_nLen(0),    m_buf(NULL){    assert( other.m_buf || (!other.m_nAlloc && !other.m_nLen) );    if( other.m_nLen )    {        m_nAlloc = m_nLen = other.m_nLen;        m_buf = new BYTE[ other.m_nLen ];        memcpy( m_buf, other.m_buf, m_nAlloc );    }}CBuffer::CBuffer( size_t len ){    m_buf = new BYTE[ len ];    m_nAlloc = m_nLen = len;}CBuffer::CBuffer( CPBYTE pbuf, size_t len ){    assert( pbuf );    m_buf = new BYTE[ len ];    m_nAlloc = m_nLen = len;    memcpy( m_buf, pbuf, len );}CBuffer::~CBuffer( void ){    if( m_buf ) memset( m_buf, 0xDD, m_nAlloc );    delete[] m_buf;}CBuffer& CBuffer::operator=( const CBuffer& other ){    assert( other.m_buf || (!other.m_nAlloc && !other.m_nLen) );    m_nAlloc = m_nLen = 0;    delete[] m_buf; m_buf = NULL;    if( other.m_nLen )    {        m_nAlloc = m_nLen = other.m_nLen;        m_buf = new BYTE[ other.m_nLen ];        memcpy( m_buf, other.m_buf, m_nAlloc );    }    return *this;}BYTE CBuffer::operator[]( size_t n ) const{    assert( m_buf );    assert( n < m_nLen );    return m_buf[n];}BYTE& CBuffer::operator[]( size_t n ){    assert( m_buf );    assert( n < m_nLen );    return m_buf[n];}void CBuffer::Clear( void ){    m_nLen = m_nAlloc = 0;    delete[] m_buf; m_buf = NULL;}void CBuffer::Set( CPBYTE pbuf, size_t len ){    assert( pbuf || !len );    assert( m_buf || (!m_nAlloc && !m_nLen) );    if( len )    {        if( len > m_nAlloc )        {            delete[] m_buf;            m_buf = new BYTE[ len ];            m_nAlloc = len;        }        memcpy( m_buf, pbuf, len );        m_nLen = len;    }    else    {        m_nAlloc = m_nLen = 0;        delete[] m_buf; m_buf = NULL;    }}size_t CBuffer::GetSize( void ) const{    return m_nLen;}void CBuffer::SetSize( size_t len ){    assert( m_buf || (!m_nAlloc && !m_nLen) );    if( len )    {        if( len > m_nAlloc )        {            BYTE* pbuf = new BYTE[ len ];            memcpy( pbuf, m_buf, m_nAlloc );            delete[] m_buf;            m_nAlloc = len;            m_buf = pbuf;        }        m_nLen = len;    }    else    {        m_nAlloc = m_nLen = 0;        delete[] m_buf; m_buf = NULL;    }}PBYTE CBuffer::GetBuffer( void ){    return m_buf;}CPBYTE CBuffer::GetBuffer( void ) const{    return m_buf;}void CBuffer::SetBuffer( CPBYTE pbuf ){    assert( pbuf );    assert( m_buf && m_nAlloc && m_nLen );    memcpy( m_buf, pbuf, m_nLen );}/************************************** * * CString * **************************************/CString::CString( void ){    m_sz = new char[1];    m_sz[0] = '\0';}CString::CString( const CString& other ){    assert( other.m_sz );    m_sz = new char[ strlen(other.m_sz) + 1 ];    strcpy( m_sz, other.m_sz );}CString::CString( CPCHAR sz ){    m_sz = new char[ strlen(sz) + 1 ];    strcpy( m_sz, sz );}CString::CString( CPCHAR buf, size_t len ){    m_sz = new char[ len + 1 ];    memcpy( m_sz, buf, len );    m_sz[len] = '\0';}CString::CString( char c, UINT nrep /* = 1 */ ){    m_sz = new char[ nrep + 1 ];    memset( m_sz, c, nrep );    m_sz[nrep] = '\0';}CString::~CString( void ){    if( m_sz ) memset( m_sz, 0xDD, strlen(m_sz)+1 );    delete[] m_sz;}CString& CString::operator=( const CString& other ){    assert( other.m_sz );    delete[] m_sz;    m_sz = new char[ strlen(other.m_sz) + 1 ];    strcpy( m_sz, other.m_sz );    return *this;}CString& CString::operator=( CPCHAR sz ){    assert( sz );    delete[] m_sz;    m_sz = new char[ strlen(sz) + 1 ];    strcpy( m_sz, sz );    return *this;}void CString::Set( CPCHAR buf, size_t len ){    assert( buf );    delete[] m_sz;    m_sz = new char[ len + 1 ];    memcpy( m_sz, buf, len );    m_sz[len] = '\0';}UINT CString::GetLength( void ) const{    assert( m_sz );    return strlen( m_sz );}bool CString::IsEmpty( void ) const{    assert( m_sz );    return ( m_sz[0] == '\0' );}int CString::Compare( const CString& other ) const{    assert( m_sz && other.m_sz );    return strcmp( m_sz, other.m_sz );}int CString::CompareNoCase( const CString& other ) const{    assert( m_sz && other.m_sz );    return strcasecmp( m_sz, other.m_sz );}char CString::GetAt( UINT pos ) const{    assert( m_sz );    assert( pos < strlen(m_sz) );    return m_sz[pos];}char& CString::GetAt( UINT pos ){    assert( m_sz );    assert( pos < strlen(m_sz) );    return m_sz[pos];}void CString::SetAt( UINT pos, char c ){    assert( m_sz );    assert( pos < strlen(m_sz) );    m_sz[pos] = c;}void CString::Append( CPCHAR sz ){    assert( sz && m_sz );    if( *sz )    {        PCHAR sznew = new char[ strlen(m_sz) + strlen(sz) + 1 ];        strcpy( sznew, m_sz );        strcat( sznew, sz );        delete[] m_sz;        m_sz = sznew;    }}void CString::ToLower( void ){    assert_or_ret( m_sz );    char* p = m_sz;    while( *p )    {        *p = tolower( *p );        p++;    }}void CString::ToUpper( void ){    assert_or_ret( m_sz );    char* p = m_sz;    while( *p )    {        *p = toupper( *p );        p++;    }}void CString::DeQuote( void ){    assert_or_ret( m_sz );    PCHAR p = m_sz;    PCHAR q = m_sz;    while( *p )    {        if( *p == '\\' && *(p+1) )        {            switch( *(p+1) )            {            case 'n':   p++; *p = '\n'; break;            case 'r':   p++; *p = '\r'; break;            case 't':   p++; *p = '\t'; break;            case '"':   p++; *p = '"';  break;            case '\\':  p++;            break;            default:                break;            }        }        *q++ = *p++;    }    *q = '\0';}CPCHAR CString::Find( char c, UINT pos /* = 0 */ ) const{    assert_or_retv( NULL, m_sz );    assert_or_retv( NULL, pos < strlen(m_sz) );    return strchr( m_sz+pos, c );}

⌨️ 快捷键说明

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