diff options
Diffstat (limited to 'xbase64/xbstring.cpp')
-rwxr-xr-x | xbase64/xbstring.cpp | 1041 |
1 files changed, 0 insertions, 1041 deletions
diff --git a/xbase64/xbstring.cpp b/xbase64/xbstring.cpp deleted file mode 100755 index 419014f..0000000 --- a/xbase64/xbstring.cpp +++ /dev/null @@ -1,1041 +0,0 @@ -/* xbstring.cpp - - Xbase64 project source code - - This file contains the xbString object methods - - Copyright (C) 1997,2003 Gary A Kunkel - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser 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 - - - Contact: - - Email: - - xdb-devel@lists.sourceforge.net - xdb-users@lists.sourceforge.net - - - Regular Mail: - - XBase Support - 149C South Main St - Keller Texas, 76248 - USA - -*/ - -#ifdef __GNU LesserG__ - #pragma implementation "xbstring.h" -#endif - -#ifdef __WIN32__ -#include <xbase64/xbwincfg.h> -#else -#include <xbase64/xbconfig.h> -#endif - -#include <xbase64/xbase64.h> - -#include <stdlib.h> -#include <stdio.h> - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif - -#ifdef STDC_HEADERS -#include <stdarg.h> -#endif - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif - -#include <xbase64/xbstring.h> -//#include <xbase64/xbexcept.h> - -//#define free(x) - -/*! \file xbstring.cpp -*/ - -const char * xbString::NullString = ""; - -//! Short description. -/*! -*/ -xbString::xbString() { - ctor(NULL); -} - -//! Short description. -/*! - \param size -*/ -xbString::xbString(size_t size) { - data = (char *)calloc(1, size); - this->size = size; -} - -//! Short description. -/*! - \param c -*/ -xbString::xbString(char c) { - ctor(NULL); - *this = c; -} - -//! Short description. -/*! - \param s -*/ -xbString::xbString(const char *s) { - ctor(s); -} - -//! Short description. -/*! - \param s -*/ -xbString::xbString(const xbString &s) { - ctor((const char *)s); -} - -//! Short description. -/*! - \param s - \param maxlen -*/ -xbString::xbString(const char *s, size_t maxlen) { -#if 0 - size_t len = strlen(s); - - if(len < maxlen) - maxlen = len; -#endif - - size = maxlen + 1; - data = (char *)calloc(1, size); - strncpy(data, s, maxlen); - data[maxlen] = 0; -} - -//! Short description. -/*! -*/ -xbString::~xbString() { - if (data != NULL) - free(data); -} - -//! Short description. -/*! - \param s -*/ -void xbString::ctor(const char *s) { - if (s == NULL) { - data = NULL; - size = 0; - return; - } - - size = strlen(s) + 1; - - data = (char *)calloc(1, size); - strcpy(data, s); -} - -//! Short description. -/*! - \param s - \param maxlen -*/ -void xbString::ctor(const char *s, size_t maxlen) { - - if (s == NULL) { - data = NULL; - size =0; - return; - } - size = maxlen + 1; - data = (char *)calloc(1, size); - strncpy(data, s, maxlen); - data[maxlen] = 0; -} - -//! Short description. -/*! -*/ -xbString &xbString::operator=(char c) { - if (data != NULL) - free(data); - - data = (char *)calloc(1, 2); - data[0] = c; - data[1] = 0; - - size = 2; - - return (*this); -} - -//! Short description. -/*! -*/ -xbString &xbString::operator=(const xbString &s) { - if (data != NULL) - free(data); - - const char *sd = s; - if (sd == NULL) { - data = NULL; - size = 0; - return (*this); - } - - data = (char *)calloc(1, strlen(s) + 1); - strcpy(data, s); - - size = strlen(data)+1; - - return (*this); -} - -//! Short description. -/*! -*/ -xbString &xbString::operator=(const char *s) { - if(data != NULL) - free(data); - - if(s == NULL) { - data = NULL; - size = 0; - return (*this); - } - data = (char *)calloc(1, strlen(s) + 1); - strcpy(data, s); - size = strlen(data) + 1; - return (*this); -} - -//! Short description. -/*! - \param size -*/ -void xbString::resize(size_t size) { - data = (char *)realloc(data, size); - if( size > 0 ) - data[size-1] = 0; - this->size = size; -} - -//! Short description. -/*! -*/ -xbBool xbString::isNull() const { - return( data == NULL ); -} - -//! Short description. -/*! -*/ -xbBool xbString::isEmpty() const { - if( data == NULL ) - return true; - if( data[0] == 0 ) - return true; - return false; -} - -//! Short description. -/*! -*/ -size_t xbString::len() const { - return( data ? strlen(data) : 0 ); -} - -//! Short description. -/*! -*/ -size_t xbString::length() const { - return len(); -} - -//! Short description. -/*! -*/ -xbString xbString::copy() const { - return( *this ); -} - -//! Short description. -/*! - \param format -*/ -xbString &xbString::sprintf(const char *format, ...) { - va_list ap; - va_start(ap, format); - - if (size < 256) - resize(256); // make string big enough - -#ifdef HAVE_VSNPRINTF - if (vsnprintf(data, size, format, ap) == -1) - data[size-1] = 0; -#else -# if HAVE_VSPRINTF - vsprintf(data, format, ap); -# else -# error "You have neither vsprintf nor vsnprintf!!!" -# endif -#endif - - resize(strlen(data)+1); // truncate - va_end(ap); - return (*this); -} - -//! Short description. -/*! -*/ -xbString::operator const char *() const { - return (data != NULL) ? data : NullString; -} - -//! Short description. -/*! -*/ -xbString &xbString::operator-=(const char *s) { - if( s == NULL ) return (*this); - int len = strlen(s); - int oldlen = this->len(); - - data = (char *)realloc(data, oldlen+len+1); - if( oldlen == 0 ) data[0] = 0; - - // looking for an occurence of space in the first string - char *lftspc = strchr(data,' '); - if( lftspc==NULL ) { // left string has no spaces - strcat(data,s); - } else { // left string has one or more spaces - int numspc = strlen(lftspc); - strcpy(lftspc,s); - while( numspc-- > 0 ) strcat(lftspc," "); - } - - size += len; - return (*this); -} - -//! Short description. -/*! -*/ -xbString &xbString::operator+=(const char *s) { - if (s == NULL) - return (*this); - int len = strlen(s); - int oldlen = this->len(); - - data = (char *)realloc(data, oldlen+len+1); - if (oldlen == 0) - data[0] = 0; - strcat(data, s); - - size += len; - return (*this); -} - -//! Short description. -/*! -*/ -xbString &xbString::operator+=(char c) { - int len = 1; - int oldlen = this->len(); - - data = (char *)realloc(data, oldlen+len+1); - data[oldlen] = c; - data[oldlen+1] = 0; - - size++; - - return (*this); -} - -//! Short description. -/*! -*/ -const char *xbString::getData() const { - return data ? data : NullString; -} - -//! Short description. -/*! -*/ -const char *xbString::c_str() const { - return data ? data : NullString; -} - -//! Short description. -/*! -*/ -void xbString::toLowerCase() { - int len = this->len(); - for (int i=0;i<len;i++) - data[i] = (char)tolower(data[i]); -} - - -//! Short description. -/*! -*/ -void xbString::toUpperCase() { - int len = this->len(); - for (int i=0;i<len;i++) - data[i] = (char)toupper(data[i]); -} - - -//! Short description. -/*! - \param c -*/ -int xbString::pos(char c) { - if (data == NULL) - return (-1); - - const char *p = strchr(data, c); - - if (p == NULL) - return (-1); - - return p-data; -} - -//! Short description. -/*! - \param s -*/ -int xbString::pos(const char* s) { - if (data == NULL) - return (-1); - - const char *p = strstr(data, s); - - if (p == NULL) - return (-1); - - return p-data; -} - -//! Short description. -/*! - \param num -*/ -void xbString::setNum(long num) { - sprintf("%ld", num); -} - -//! Short description. -/*! - \param fmt - \param num -*/ - -void xbString::setNum( char * fmt, double num) { - xbString f; - f = "%"; - f += fmt; - f += "f"; - sprintf( f.getData(), num); -} - - -//! Short description. -/*! -*/ -XBDLLEXPORT xbBool operator==(const xbString &s1, const char *s2) { - if (s2 == NULL) { - if (s1.getData() == NULL) - return true; - return false; - } - - if ((s2[0] == 0) && s1.getData() == NULL) - return true; - - if (s1.getData() == NULL) - return false; - - return (strcmp(s1, s2) == 0); -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbBool operator!=(const xbString &s1, const char *s2) { - if (s2 == NULL) { - if (s1.getData() == NULL) - return false; - return true; - } - - if ((s2[0] == 0) && s1.getData() == NULL) - return false; - - if (s1.getData() == NULL) - return true; - - return (strcmp(s1, s2) != 0); -} - -//! Short description. -/*! -*/ -xbBool xbString::operator==( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL == NULL - return false; // NULL == !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL == NULL - return strcmp(data,s2.data) == 0; //!NULL == !NULL - } -} - -//! Short description. -/*! -*/ -xbBool xbString::operator!=( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL != NULL - return true; // NULL != !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL != NULL - return strcmp(data,s2.data) != 0; //!NULL != !NULL - } -} - -//! Short description. -/*! -*/ -xbBool xbString::operator< ( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL < NULL - return true; // NULL < !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL < NULL - return strcmp(data,s2.data) < 0; //!NULL < !NULL - } -} - -//! Short description. -/*! -*/ -xbBool xbString::operator> ( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL > NULL - return false; // NULL > !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL > NULL - return strcmp(data,s2.data) > 0; //!NULL > !NULL - } -} - -//! Short description. -/*! -*/ -xbBool xbString::operator<=( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL <= NULL - return true; // NULL <= !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL <= NULL - return strcmp(data,s2.data) <= 0; //!NULL <= !NULL - } -} - -//! Short description. -/*! -*/ -xbBool xbString::operator>=( const xbString &s2 ) const { - if( data == NULL || data[0] == 0 ) { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL >= NULL - return false; // NULL >= !NULL - } else { - if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL >= NULL - return strcmp(data,s2.data) >= 0; //!NULL >= !NULL - } -} - -//! Short description. -/*! -*/ -XBDLLEXPORT std::ostream& operator<< ( std::ostream& os, - const xbString& xbs ) { - return os << xbs.data; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator-(const xbString &s1, const xbString &s2) { - xbString tmp(s1.getData()); - tmp -= s2; - return tmp; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator+(const xbString &s1, const xbString &s2) { - xbString tmp(s1.getData()); - tmp += s2; - return tmp; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator+(const xbString &s1, const char *s2) { - xbString tmp(s1.getData()); - tmp += s2; - return tmp; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator+(const char *s1, const xbString &s2) { - xbString tmp(s1); - tmp += s2; - return tmp; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator+(const xbString &s1, char c2) { - xbString tmp(s1.getData()); - tmp += c2; - return tmp; -} - -//! Short description. -/*! -*/ -XBDLLEXPORT xbString operator+(char c1, const xbString &s2) { - xbString tmp(c1); - tmp += s2; - return tmp; -} - -//! Short description. -/*! - \param pos - \param c -*/ -void xbString::putAt(size_t pos, char c) { - if (pos>len()) - return; - - data[pos] = c; -} - -//! Short description. -/*! - \param str - \param pos - \param n -*/ -xbString& xbString::assign(const xbString& str, size_t pos, int n) -{ - if(data){ - free(data); - data = 0; - } - - if(str.len() <= pos){ - size = 0; - return (*this); - } - - if(str.len() < pos + n){ - n = str.len() - pos; - } - - const char *d = str; - - if (n == -1){ -// data = (char *)malloc(str.len()-pos+1); ms win/nt bug fix - data = (char *)calloc(str.len()-pos+1, sizeof( char )); - strcpy(data, d+pos); - size = str.len()-pos+1; - } - else - { -// data = (char *)malloc(n); ms win/nt bug fix -// boundschecker flags the next line as a memory leak -// but this is a valid memory allocation - data = (char *)calloc(n + 1, sizeof(char)); - strncpy(data, d + pos, n); - data[n] = '\0'; - size = n + 1; - } - - return (*this); -} - -//! Short description. -/*! - \param str - \param n -*/ -xbString& xbString::assign(char* str, int n) -{ - if(data) - { - free(data); - data = 0; - } - - data = (char *)calloc(n + 1, sizeof(char)); - strncpy(data, str, n); - data[n] = 0; - size = n + 1; - - return (*this); -} - -//! Short description. -/*! -*/ -void xbString::trim() { - int l = len()-1; - - for (;;) { - if (data[l] != ' ') - break; - data[l] = 0; - if (l == 0) - break; - l--; - } -} - -//! Short description. -/*! - \param pos - \param n -*/ -xbString &xbString::remove(size_t pos, int n) { - if (data == NULL) - return (*this); - if (data[0] == 0) - return (*this); - - size_t l = len(); - - if (pos>l) - return (*this); - if (n == 0) - return (*this); - if (n > int(l-pos)) - n = l-pos; - if (n<0) - n = l-pos; - memcpy(data+pos, data+pos+n, l-pos-n+1); - - return (*this); -} - -//! Short description. -/*! - \param pos - \param n -*/ -xbString xbString::mid(size_t pos, int n) const { - if (data == NULL) - return (*this); - if (data[0] == 0) - return (*this); - - size_t l = len(); - - if (pos>l) - return (*this); - if (n == 0) - return (*this); - if (n > int(l-pos)) - n = l-pos; - if (n<0) - n = l-pos; - - xbString s; - s.data = (char *)malloc(n+1); - strncpy(s.data, data+pos, n); - s.data[n] = 0; - - return s; -} - -//! Short description. -/*! - \param from - \param to -*/ -void xbString::swapChars( char from, char to ) -{ - size_t i; - for( i = 0; i < size; i++ ) - if( data[i] == from ) - data[i] = to; -} - -//! Short description. -/*! - \param c -*/ -void xbString::zapChar( char c ) -{ - /* routine zaps every occurrence of a given character from the string */ - int p; - size_t s; - p = pos( c ); - while( p != -1 ){ - for( s = (size_t) p; s < size; s++ ) - putAt( s, data[s+1]); - resize( size-1 ); - p = pos( c ); - } -} - -//! Short description. -/*! - \param c -*/ -int xbString::countChar( char c ) const -{ - int i,j; - - for( i = 0,j = 0; i < (int) size; i++ ) - if( data[i] == c ) - j++; - - return j; -} - - -//! Short description. -/*! - \param c -*/ - -void xbString::addBackSlash( char c ) -{ - /* prefixes all char "c" with a backslash */ - int i, t, cnt; - xbString ws; - - cnt = countChar( c ); - if( !cnt ) - return; - - ws.resize( size+cnt ); - for( i = 0, t = 0; i < (int)size; i++ ){ - if( data[i] == c ) - ws.putAt( t++, '\\' ); - ws.putAt( t++, data[i] ); - } - ws.putAt( t, 0 ); - *this = ws.getData(); -} - -//! Short description. -/*! - \param cnt -*/ -void xbString::lTrunc( size_t cnt ) -{ - /* left truncate cnt butes */ - - char * ndata; - char * p; - if( cnt >= size ){ - ctor(0); - return; - } - ndata = (char *) malloc( size - cnt ); - p = data; - p += cnt; - strcpy( ndata, p ); - free( data ); - data = ndata; - size = size - cnt; -} - - -//! Short description. -/*! - \param c -*/ -void xbString::zapLeadingChar( char c ) -{ - /* left truncate all of character c */ - - int len = 0; - char *p; - p = data; - while( *p && *p == c ){ - len++; - p++; - } - if( len ) - lTrunc( len ); -} - - -//! Short description. -/*! -*/ -xbBool xbString::hasAlphaChars() const -{ - for( int i = 0; i < (int) size; i++ ) - if( isalpha( data[i] )) - return 1; - return 0; -} - - -//! Short description. -/*! - \param out -*/ - -int xbString::cvtHexChar( char & out ) -{ - /* this routine converts a four byte string in the format of 0x00 - to a one byte char value - - the first four bytes of the string must be in the format 0x00 - anything past the first four bytes is disregarded - - returns -1 on error - 0 on success - */ - - int j, k; - char c; - - if( len() < 4 || data[0] != '0' || (data[1]!='X' && data[1]!='x' )) - return -1; - - c = toupper( data[2] ); - j = ( c > '9' ? c - 'A' + 10 : c - '0' ); - c = toupper( data[3] ); - k = ( c > '9' ? c - 'A' + 10 : c - '0' ); - j = ( j << 4 ) + k; - - out = ( char ) j; - return 0; -} - -//! Short description. -/*! - \param out -*/ -int xbString::cvtHexString( xbString & out ) -{ - /* this routine converts a string of four byte format of 0x00 - to a string of one byte chars - - returns -1 on error - 0 on success - */ - - char c; - xbString ws; - ws = data; - out = ""; - while( ws.len()){ - if( ws.cvtHexChar( c )) - return -1; - out += c; - ws.lTrunc( 4 ); - } - return 0; -} -//! Short description. -/*! - \param src - \param delim - \param skipcnt - \param opt -*/ -int xbString::setFromDelimitedInput( const char * src, - char delim, int skipcnt, int opt ) -{ - /* opt values - - 1 - ignore delimiters between quotes - 2 - treat crlf characters as delimters - 3 - both options 1 and 2 - */ - - int len; - int curpos = 0; - int quotesw = 0; - const char * s; - const char * anchor; - - /* skip past skipcnt delimiters */ - s = src; - while( *s && curpos < skipcnt ){ - if( *s == delim && !quotesw ) - curpos++; - else if (( opt == 1 || opt == 3 ) && *s == '"' ) - quotesw = (quotesw) ? 0 : 1; - s++; - } - /* at the beginning of the field */ - anchor = s; - while( *s && ( *s != delim || ( *s == delim && quotesw ))){ - if( *s == '"' ) - quotesw = (quotesw) ? 0 : 1; - s++; - } - len = s - anchor; - - /* copy data */ - data = (char *) realloc( data, len+1 ); - memcpy( data, anchor, len ); - data[len] = 0; - this->size = len+1; - - if( opt == 2 || opt == 3 ){ - zapChar( 0x0a ); - zapChar( 0x0c ); - zapChar( 0x0d ); - } - - return len; -} - |