I use this for my strings (Note: Updated RECENTLY since last release of my oop lib). Note I also have added some string parsing things and I know they are not optimized.. but they work, and work in GDK quite nicely... so ... considering I wrote those and tested them over last couple days, I'm going to start using them myself tonight on a file directory type of parser thingy):
jfc_string.h
/*============================================================================
| _________ _______ _______ ______ _______ Jegas, LLC |
| /___ ___// _____/ / _____/ / __ / / _____/ JasonPSage@jegas.com |
| / / / /__ / / ___ / /_/ / / /____ |
| / / / ____/ / / / / / __ / /____ / |
|____/ / / /___ / /__/ / / / / / _____/ / |
/_____/ /______/ /______/ /_/ /_/ /______/ |
| Under the Hood |
==============================================================================
Copyright(c)2008 Jegas, LLC
============================================================================*/
#pragma once
#include "jfc_string.h"
//=============================================================================
class JFC_STRING{
//=============================================================================
void pvt_Init(void);
public:
char *s;char chNull;
unsigned int uiLength;
JFC_STRING();
JFC_STRING(char *p_szDefaultValue);
~JFC_STRING();
void Clear(void);
void Clear(int p_NewLength);// allows making a buffer instantly.
void ConCat(const char *p_char);
void Set(const char *p_char);
char *Get(void);
unsigned int Length(void);
bool EqualCS(char *p_szCompareThis); // Case Sensitive
bool Equal(char *p_szCompareThis);
void Left( char *p_szGrabFromThis, int p_HowMany);
void Right( char *p_szGrabFromThis, int p_HowMany);
void Mid(const char *p_szGrabFromThis, int p_Start, int p_HowMany);
void Reverse(const char *p_szGrabFromThis);
void Reverse(void);
void Upper(const char *p_szGrabFromThis);
void Upper(void);
void Lower(const char *p_szGrabFromThis);
void Lower(void);
unsigned int IndexOf(const char *p_szSearchFor, int p_StartHere, bool p_CaseSensitive=false);
unsigned int SNRChar(const char p_SearchFor, const char p_ReplaceWith, bool p_CaseSensitive=false);
unsigned int SNR(const char *p_SearchFor, const char *p_ReplaceWith, bool p_CaseSensitive=false);
//TODO: Create The Various Functions needed for parsing Text!!!!!!!!!!!!!!!
};
//=============================================================================
jfc_string.cpp
/*============================================================================
| _________ _______ _______ ______ _______ Jegas, LLC |
| /___ ___// _____/ / _____/ / __ / / _____/ JasonPSage@jegas.com |
| / / / /__ / / ___ / /_/ / / /____ |
| / / / ____/ / / / / / __ / /____ / |
|____/ / / /___ / /__/ / / / / / _____/ / |
/_____/ /______/ /______/ /_/ /_/ /______/ |
| Under the Hood |
==============================================================================
Copyright(c)2008 Jegas, LLC
============================================================================*/
#include "jfc_string.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//=============================================================================
JFC_STRING::JFC_STRING(){
//=============================================================================
this->pvt_Init();
};
//=============================================================================
//=============================================================================
JFC_STRING::JFC_STRING(char *p_szDefaultValue){
//=============================================================================
this->pvt_Init();
this->Set(p_szDefaultValue);
};
//=============================================================================
//=============================================================================
void JFC_STRING::pvt_Init(void){
//=============================================================================
this->s=0;
chNull='';
this->Clear();
};
//=============================================================================
//=============================================================================
JFC_STRING::~JFC_STRING(){
//=============================================================================
if(this->s!=0){
delete this->s;
};
};
//=============================================================================
//=============================================================================
void JFC_STRING::Clear(void){
//=============================================================================
if(this->s!=0){
delete this->s;
};
this->uiLength=0;
this->s=new char[this->uiLength+1];
this->s[this->uiLength]='';
};
//=============================================================================
//=============================================================================
void JFC_STRING::Clear(int p_NewLength){
//=============================================================================
if(this->s!=0){
delete this->s;
};
this->uiLength=p_NewLength;
this->s=new char[this->uiLength+1];
this->s[this->uiLength]='';
int i;
for(i=0;i<this->uiLength;i++){
this->s[i]='';
};
};
//=============================================================================
//=============================================================================
void JFC_STRING::ConCat(const char *p_char){
//=============================================================================
char *st;
this->uiLength=(unsigned int)(strlen(p_char)+this->uiLength);
st=new char[this->uiLength+1];
st[0]=chNull;
strcat(st,this->s);
strcat(st,p_char);
delete this->s;
this->s=new char[this->uiLength+1];
strcpy(this->s,st);
delete st;
this->s[this->uiLength]='';
};
//=============================================================================
//=============================================================================
void JFC_STRING::Set(const char *p_char){
//=============================================================================
this->Clear();
this->ConCat(p_char);
};
//=============================================================================
//=============================================================================
char *JFC_STRING::Get(void){
//=============================================================================
if(this->s!=0){
return this->s;
}else{
return 0;
};
};
//=============================================================================
//=============================================================================
unsigned int JFC_STRING::Length(void){
//=============================================================================
return this->uiLength;
};
//=============================================================================
//=============================================================================
bool JFC_STRING::EqualCS(char *p_szCompareThis){
//=============================================================================
return (strcmp(this->s,p_szCompareThis)==0);
};
//=============================================================================
//=============================================================================
bool JFC_STRING::Equal(char *p_szCompareThis){
//=============================================================================
return (strcmpi(this->s,p_szCompareThis)==0);
};
//=============================================================================
//=============================================================================
void JFC_STRING::Left( char *p_szGrabFromThis, int p_HowMany){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
JFC_STRING *ts=new JFC_STRING();
ts->Set(p_szGrabFromThis);
this->Clear();
if(p_HowMany>0){
int i=0;
char c[2];c[1]=0;
while(i<ts->uiLength && i<p_HowMany){
c[0]=ts->s[i];
this->ConCat(c);
i++;
}
};
delete ts;
};
//=============================================================================
//=============================================================================
void JFC_STRING::Right( char *p_szGrabFromThis, int p_HowMany){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
JFC_STRING *ts=new JFC_STRING();
ts->Set(p_szGrabFromThis);
this->Clear();
if(p_HowMany>0){
int i=ts->uiLength-p_HowMany;
if(i<0){
this->Set(ts->s);
}else{
char c[2];c[1]=0;
while(i<ts->uiLength){
c[0]=ts->s[i];
this->ConCat(c);
i++;
}
};
};
delete ts;
};
//=============================================================================
//=============================================================================
void JFC_STRING::Mid(const char *p_szGrabFromThis, int p_Start, int p_HowMany){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
JFC_STRING *ts=new JFC_STRING();
ts->Set(p_szGrabFromThis);
this->Clear();
if(p_Start>=0){
int i=p_Start;
char c[2];c[1]=0;
while(i<ts->uiLength && p_HowMany>0){
c[0]=ts->s[i];
this->ConCat(c);
i++;
p_HowMany--;
}
};
delete ts;
};
//=============================================================================
//=============================================================================
void JFC_STRING::Reverse(const char *p_szGrabFromThis){
//=============================================================================
JFC_STRING *ts=new JFC_STRING();
ts->Set(p_szGrabFromThis);
this->Set(_strrev(ts->s));
delete ts;
};
//=============================================================================
//=============================================================================
void JFC_STRING::Reverse(void){
//=============================================================================
JFC_STRING *ts=new JFC_STRING();
ts->Set(_strrev(this->s));
this->Set(ts->s);
delete ts;
};
//=============================================================================
//=============================================================================
void JFC_STRING::Upper(const char *p_szGrabFromThis){
//=============================================================================
this->Set(p_szGrabFromThis);
this->Upper();
};
//=============================================================================
//=============================================================================
void JFC_STRING::Upper(void){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
for(int i=0;i<this->uiLength;i++){
this->s[i]=_toupper(this->s[i]);
};
};
//=============================================================================
//=============================================================================
void JFC_STRING::Lower(const char *p_szGrabFromThis){
//=============================================================================
this->Set(p_szGrabFromThis);
this->Lower();
};
//=============================================================================
//=============================================================================
void JFC_STRING::Lower(void){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
for(int i=0;i<this->uiLength;i++){
this->s[i]=_tolower(this->s[i]);
};
};
//=============================================================================
//=============================================================================
unsigned int JFC_STRING::IndexOf(const char *p_szSearchFor, int p_StartHere, bool p_CaseSensitive){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
JFC_STRING *ts=new JFC_STRING();
ts->Set(p_szSearchFor);
bool bGotIt=false;
int Index=-1;
if(p_StartHere>=0){
for(Index=p_StartHere;Index<this->uiLength;Index++){
bGotIt=true;
int i=0;int p=0;
for(i=Index;i<this->uiLength && p<ts->uiLength;i++){
if(p_CaseSensitive){
if(this->s[i]!=ts->s[p]){
bGotIt=false;
i=ts->uiLength;//force next outside loop iteration
break;
};
}else{
//char c1=tolower(this->s[i]);
//char c2=tolower(ts->s[p]);
//if(c1!=c2){
if(tolower(this->s[i])!=tolower(ts->s[p])){
bGotIt=false;
i=ts->uiLength;//force next outside loop iteration
};
};
p++;
};
if(bGotIt){
delete ts;
return Index;
};
};
};
delete ts;
return -1;
};
//=============================================================================
//=============================================================================
unsigned int JFC_STRING::SNRChar(const char p_SearchFor, const char p_ReplaceWith, bool p_CaseSensitive){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
int Index=-1;
int LastIndex=-1;
unsigned int Changes=0;
char c[2];c[0]=p_SearchFor;c[1]=0;
do{
if(Index>-1){
this->s[Index]=p_ReplaceWith;
Changes+=1;
};
LastIndex=Index;
Index=this->IndexOf(c,0,p_CaseSensitive);
}while(LastIndex!=Index);
return Changes;
};
//=============================================================================
//=============================================================================
unsigned int JFC_STRING::SNR(const char *p_SearchFor, const char *p_ReplaceWith, bool p_CaseSensitive){
//=============================================================================
// TODO: Optimize this - I needed functionality and just cranked out a
// function to do it.
int Index=-1;
int LastIndex=-1;
JFC_STRING *ts=new JFC_STRING();
JFC_STRING *so=new JFC_STRING(this->s);
unsigned int Changes=0;
do{
if(Index>-1){
this->Mid(so->s,0,Index);
ts->Set(this->s);
int Len=strlen(p_SearchFor);
int cutend=Index+Len;
this->Mid(so->s,cutend,so->uiLength);
ts->ConCat(p_ReplaceWith);
ts->ConCat(this->s);
so->Set(ts->s);
Changes+=1;
};
LastIndex=Index;
Index=so->IndexOf(p_SearchFor,0,p_CaseSensitive);
}while(LastIndex!=Index);
this->Set(so->s);
delete so;
delete ts;
return Changes;
};
//=============================================================================
[edit] All the functions in the HEADER are implemented.. I left a comment in there to the contrary and removed it
[/edit]