Форум города Чаусы и Чаусского района

Здравствуйте, Гость ( Вход | Регистрация | Правила форума )



Сэкренский программинг

   
  > Сэкренский программинг : мои потуги, На коленке Лабс. Ко. Лтд.))    
Поиск в теме | Версия для печати
m00nk
> 11 января 2010 — 00:50
  [Id]
Администратор


Ко-админ. Жестокий, но справедливый.

Покинул форум
Сообщений всего: 2884
Дата рег-ции: Янв. 2006  
Откуда: туташний я
Репутация: 32



Ща сдуру заглянул в свои же исходники (писалось несколько лет назад на С++) и понял, что напрочь забыл этот язык. Недовольство, огорчение Даже удивляюсь, что я когда-то писал такое.... Не понял

Вот, например, класс для более удобной работы со строками: (mString.h):

CODE:
#if !defined(FIT_MSTRING_H)
#define FIT_MSTRING_H

#include <windows.h>
#include <stdlib.h>

class mString
{
private:
char LowChar(char c);
char UpChar(char c);
void CheckMemory(int newlen);
char *Text;
int allocatedmemory;
protected:
char* GetMemory(char *buf, int newlen);
public:
mString& CharToOem(void);
mString& OemToChar(void);
mString& LowerCase(void);
mString& UpperCase(void);
mString& Normalize(void);
//--------------- destructor ---------------
virtual ~mString();
//--------------- constructors -------------
mString();
mString(char c);
mString(const char *str);
mString(const mString &str); // copy constructor
mString(char c, int count); // replicate
mString(int value);
// mString(mString Format, ...); // for future
//--------------- compares -----------------
int Compare(const char *str);
bool operator==(const char *str) { return Compare(str)==0;};
bool operator!=(const char *str) { return Compare(str)!=0;};
bool operator>(const char *str) { return Compare(str)>0; };
bool operator>=(const char *str) { return Compare(str)>=0;};
bool operator<(const char *str) { return Compare(str)<0; };
bool operator<=(const char *str) { return Compare(str)<=0;};
bool operator==(const mString &str) { return Compare(str.Text)==0;};
bool operator!=(const mString &str) { return Compare(str.Text)!=0;};
bool operator>(const mString &str) { return Compare(str.Text)>0; };
bool operator>=(const mString &str) { return Compare(str.Text)>=0;};
bool operator<(const mString &str) { return Compare(str.Text)<0; };
bool operator<=(const mString &str) { return Compare(str.Text)<=0;};
bool IsEmpty(void) { return Text[0]==0; };
//--------------- assign -------------------
operator char*() const { return Text; };
char* c_str(void) const { return Text; };
mString& operator=(char c);
mString& operator=(const char *str);
mString& operator=(const mString& str);
mString& operator+=(char c);
mString& operator+=(const char *str);
mString& operator=(int value);
//- mString& operator+=(const mString& str);
//--------------- gets ---------------------
int Len(void) const;
int Position(const mString &str);
int LastPos(const mString &str);
char& operator[](int index);
//--------------- modify -------------------
mString& Filename(void);
mString& Path(void);
mString& SubString(int pos, int len);
enum{TRIM_ALL=0, TRIM_LEFT, TRIM_RIGHT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER};
mString& Trim(int trimflag=0);
mString& Pad(int len, int alignflag);
mString& Replicate(char c, int count);
mString& Delete(const mString &str);
//--------------- friends ------------------
friend mString operator+(const mString &str, char c);
friend mString operator+(const mString &str1, const char *str2);
friend mString Filename(const mString &str);
friend mString Path(const mString &str);
friend mString SubString(const mString &str, int pos, int len);
friend mString Trim(const mString &str, int trimflag=0);
friend mString Pad(const mString &str, int len, int alignflag);
friend mString Delete(const mString &str, const mString &deletedchars);
};

mString IntToStr(int value);
int StrToInt(mString value);
mString UpperCase(char *str);
mString LowerCase(char *str);

#endif // FIT_MSTRING_H


Реализация (mString.cpp):
CODE:

#include "mString.h"

//--------------------------------------------------------------------------
char mString::UpChar(char c)
{
if(c>='a' && c<='z')
return c - 'a' + 'A';
if(c>='а' && c<='я')
return c - 'а' + 'А';
return c;
}

char mString::LowChar(char c)
{
if(c>='A' && c<='Z')
return c + 'a' - 'A';
if(c>='А' && c<='Я')
return c + 'а'-'А';
return c;
}

//--------------------------------------------------------------------------
void mString::CheckMemory(int newlen)
{
if(allocatedmemory < newlen)
{
allocatedmemory = newlen;
char *tmp = new char[newlen];
strcpy(tmp, Text);
delete[] Text;
Text = tmp;
}
}

//----------------------------------------------------------------------------------
mString::~mString()
{
if(Text)
delete[] Text;
Text=0, allocatedmemory=0;
}

//--------------------------------------------------------------------------
mString::mString()
{
allocatedmemory = 1;
Text = new char[1];
Text[0]=0;
}

//----------------------------------------------------------------------------------
mString::mString(char c)
{
Text = new char[2];
Text[0]=c;
Text[1]='\0';
allocatedmemory=2;
}

//----------------------------------------------------------------------------------
mString::mString(const char *str)
{
if(str!=NULL)
allocatedmemory = strlen(str)+1;
else
allocatedmemory = 1;
Text = new char[allocatedmemory];
if(allocatedmemory>1)
strcpy(Text, str);
else
Text[0] = 0;
}

//---------------------------------------------------------------------------------
mString::mString(int value)
{
char str[21];
itoa(value, str, 10);
allocatedmemory = strlen(str)+1;
Text = new char[allocatedmemory];
strcpy(Text, str);
}

//----------------------------------------------------------------------------------
mString::mString(const mString& str) // copy constructor
{
allocatedmemory = str.Len()+1;
Text = new char[allocatedmemory];
if(allocatedmemory>1)
strcpy(Text, str);
else
Text[0] = 0;
}

//----------------------------------------------------------------------------------
mString::mString(char c, int count) // replicate
{
allocatedmemory = count+1;
Text = new char[allocatedmemory];
for(int i=0; i<allocatedmemory-1; i++)
Text[i]=c;
Text[i]='\0';
}

//--------------------------------------------------------------------------
int mString::Len(void) const
{
return strlen(Text);
}

//----------------------------------------------------------------------------------
mString& mString::operator=(char c)
{
CheckMemory(2);
Text[0]=c;
Text[1]='\0';
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::operator=(const char *str)
{
int lll;
if(str==NULL)
lll = 1;
else
lll = strlen(str)+1;
CheckMemory(lll);
if(allocatedmemory>1)
strcpy(Text, str);
else
Text[0] = 0;
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::operator=(const mString& str)
{
if(this==&str)
return *this;
return operator=(str.Text);
}

//---------------------------------------------------------------------------------
mString& mString::operator=(int value)
{
char buffer[40];
itoa(value, buffer, 10);
return operator=(buffer);
}

//----------------------------------------------------------------------------------
mString& mString::operator+=(char c)
{
int n = Len();
CheckMemory(n+2);
Text[n] = c;
Text[n+1] = 0;
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::operator+=(const char *str)
{
if(str!=NULL)
{
CheckMemory(Len()+strlen(str)+1);
strcat(Text, str);
}
return *this;
}

//----------------------------------------------------------------------------------
mString operator+(const mString &str, char c)
{
mString tmp(str);
tmp += c;
return tmp;
}

//----------------------------------------------------------------------------------
mString operator+(const mString &str1, const char *str2)
{
mString tmp(str1);
tmp += str2;
return tmp;
}

//----------------------------------------------------------------------------------
char& mString::operator[](int index)
{
if(index<0 || index>=Len())
throw "mString::operator[] Index out of bound!";
return Text[index];
}

//----------------------------------------------------------------------------------
int mString::Position(const mString &str)
{
int lenthis = Len();
int lenstr = str.Len();
for(int i=0; i<=lenthis-lenstr; i++)
{
for(int j=0; j<lenstr; j++)
if(Text[i+j]!=str[j])
goto nextmainchar;
return i;
nextmainchar: ;
}
return -1;
}

//----------------------------------------------------------------------------------
int mString::LastPos(const mString &str)
{
int lenthis = Len();
int lenstr = str.Len();
for(int i=lenthis-lenstr-1; i>=0; i--)
{
for(int j=0; j<lenstr; j++)
if(Text[i+j]!=str[j])
goto nextmainchar;
return i;
nextmainchar: ;
}
return -1;
}

//----------------------------------------------------------------------------------
mString& mString::SubString(int pos, int len)
{
if(pos>=Len() || len<=0)
{
Text[0] = 0;
return *this;
}
int max = (pos+len>Len()) ? Len()-pos : len;
for(int i=0; i<max; i++)
{
Text[i] = Text[i+pos];
}
Text[max]='\0';
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::Filename()
{
int i=LastPos("\\");
SubString(i+1, Len()-i);
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::Path()
{
int i=LastPos('\\');
SubString(0, i);
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::Trim(int trimflag)
{
int i1=0, i2=0;
for(i1=0; i1<Len(); i1++)
if(Text[i1]!=' ')
break;
for(i2=Len()-1; i2>=0; i2--)
if(Text[i2]!=' ')
break;
if(i2<i1)
{
Text[0] = 0;
return *this;
}
switch(trimflag)
{
case TRIM_LEFT: SubString(i1, Len()-i1); break;
case TRIM_RIGHT: SubString(0, i2+1); break;
case TRIM_ALL: SubString(i1, i2-i1+1); break;
}
return *this;
}

//----------------------------------------------------------------------------------
mString& mString::Pad(int len, int alignflag)
{
if(Len()>=len)
return SubString(0,len);

mString tmp(' ', len); // create filled string
int l;
switch(alignflag)
{
case ALIGN_LEFT: l = 0; break;
case ALIGN_RIGHT: l = len-Len(); break;
case ALIGN_CENTER: l = (len-Len())/2; break;
}
for(int i=0; i<Len(); i++)
tmp.Text[l+i] = Text[i];
operator=(tmp);
return *this;
}

//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
mString SubString(const mString &str, int pos, int len)
{
mString tmp(str);
tmp.SubString(pos, len);
return tmp;
}

//----------------------------------------------------------------------------------
mString Filename(const mString &str)
{
mString tmp(str);
tmp.Filename();
return tmp;
}

//----------------------------------------------------------------------------------
mString Path(const mString &str)
{
mString tmp(str);
tmp.Path();
return tmp;
}

//----------------------------------------------------------------------------------
mString Trim(const mString &str, int trimflag)
{
mString tmp(str);
tmp.Trim(trimflag);
return tmp;
}

//----------------------------------------------------------------------------------
mString Pad(const mString &str, int len, int alignflag)
{
mString tmp(str); // create filled string
tmp.Pad(len, alignflag);
return tmp;
}

//----------------------------------------------------------------------------------
mString& mString::Delete(const mString &str)
{
mString tmp;
for(int i=0; i<Len(); i++)
{
bool flag = true;
for(int j=0; j<str.Len(); j++)
if(Text[i]==str[j])
flag = false;
if(flag)
tmp+=Text[i];
}
tmp+='\0';
operator=(tmp);
return *this;
}

//----------------------------------------------------------------------------------
mString Delete(const mString &str1, const mString &str2)
{
mString tmp(str1);
tmp.Delete(str2);
return tmp;
}


///////////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------
mString IntToStr(int value)
{
return mString(value);
};

//---------------------------------------------------------------------------------
int StrToInt(mString value)
{
return atoi(value);
};

//---------------------------------------------------------------------------------
mString& mString::Normalize()
{
// ( (c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='А' && c<='Я') || (c>='а' && c<='я'))
// Устанавливает первую букву каждого слова заглавной, остальные - строчные
bool fSpace = true;
for(int i=0; i<Len(); i++)
{
char &c = Text[i];
if(fSpace)
{ // to UPPER
c = UpChar(c);
}
else
{
c = LowChar(c);
}
fSpace = !( (c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='А' && c<='Я') || (c>='а' && c<='я'));
}
return *this;
}

//---------------------------------------------------------------------------------
mString& mString::UpperCase()
{
for(int i=0; i<Len(); i++)
Text[i] = UpChar(Text[i]);
return *this;
}

//---------------------------------------------------------------------------------
mString& mString::LowerCase()
{
for(int i=0; i<Len(); i++)
Text[i] = LowChar(Text[i]);
return *this;
}

//---------------------------------------------------------------------------------
int mString::Compare(const char *str)
{
return stricmp(Text,str);
}
//---------------------------------------------------------------------------------
mString UpperCase(char *str)
{
mString ttt(str);
ttt.UpperCase();
return ttt;
}

//---------------------------------------------------------------------------------
mString LowerCase(char *str)
{
mString ttt(str);
ttt.LowerCase();
return ttt;
}

//--------------------------------------------------------------------------
mString& mString::OemToChar()
{
char *buf = new char[Len()+1];
::OemToChar(Text, buf);
*this = buf;
delete[] buf;
return *this;
}

//--------------------------------------------------------------------------
mString& mString::CharToOem()
{
char *buf = new char[Len()+1];
::CharToOem(Text, buf);
*this = buf;
delete[] buf;
return *this;
}


Работает эта хня примерно так:

CODE:
mString s1 = new mString(); // пустая строка
mString s2 = new mString('a'); // строка из одного символа 'a'
mString s3 = new mString("demo string");
mString s4 = new mString('=', 10); // даст строку '=========='
mString s5 = new mString(123); // даст строку '123'

Работают всевозможные преобразования (mSrting в char* и обратно) и копирования (s1 = s2), конкатенация строк (s2 = s1 + s3), а так же унарные операции (s3 += 'abcdef'). Естественно поддерживаются все виды сравнений, преобразований регистров, нормализация и т.д. Плюс набор вспомогательных функций типа длины строки Len(), первой позиции подстроки в строке Position('abc' ) и последней LastPos('abc' ), а так же обрезание пробелов, выделение имени файла и пути, выравнивания, повторения и прочее.. Короче, сильно упращает жизнь рядового наСИльника.

может кому сгодится... Подмигивание

-----

...ла-ла-ла-ла-ла...
top
Конституция Республики Беларусь:
"Статья 34. Гражданам Республики Беларусь гарантируется право на получение, хранение и распространение полной, достоверной и своевременной информации о деятельности государственных органов, общественных объединений, о политической, экономической, культурной и международной жизни, состоянии окружающей среды..."

Sacren
> 11 января 2010 — 00:57
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Если напишешь manual возьму Улыбка
А лицензия на это счастье какая? BSD'шная была бы самое то.
И как конвертировать это в обычный стринг?

-----

lastofavari.com | YouTube
top
m00nk
> 11 января 2010 — 01:15
  [Id]
Администратор


Ко-админ. Жестокий, но справедливый.

Покинул форум
Сообщений всего: 2884
Дата рег-ции: Янв. 2006  
Откуда: туташний я
Репутация: 32



 Sacren пишет:
Если напишешь manual возьму

Дык в конце поста весь мануал и есть Улыбка Остальное сам по коду разберешь. Ну а если не разберешь, спрашивай, что вспомню - расскажу. Подмигивание

 Sacren пишет:
А лицензия на это счастье какая? BSD'шная была бы самое то.

Хез. Забирай бесплатно, дарю Улыбка

 Sacren пишет:
И как конвертировать это в обычный стринг?

Если целева функция требует char*, то конвертирование автоматом срабатает, т.е. например есть фугнкция:
CODE:
void PrintString(char* );

то можно просто делать такое:
CODE:
mString sss = "abcdef";
// тут куча кода
PrintString(sss); // сработает автоматическое преобразование mString* в char*

Если же нужно вручную преобразовать, то есть спец-метод:
CODE:
sss.c_str(); // вернет указатель char* на сроку.

(Добавление)
ЗЫ
Есть еще некоторые полезные классы, если надо, буду постить...

-----

...ла-ла-ла-ла-ла...
top
Ray
> 11 января 2010 — 04:16
  [Id]
Пользователь


Форумчанин

Покинул форум
Сообщений всего: 259
Дата рег-ции: Окт. 2006  
Откуда: Belarus,Chausy
Репутация: 11



 Цитата:
Есть еще некоторые полезные классы, если надо, буду постить...

Некоторые? Радость

Sacren
Ты спрашивай, у него много чего есть полезного, тебе пригодиться Улыбка

-----
We don't know the days that will change our lives... Stephen King. Dreamcatcher.
top
Sacren
> 14 января 2010 — 04:06
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Helloworld3D Подмигивание v0.2



Скачать файл: (для скачивания файла Войдите или зарегистрируйтесь)
Скачан раз: 32


-----

lastofavari.com | YouTube
top
Стамп
> 14 января 2010 — 11:02
  [Id]
Пользователь


Мега-житель Форума!

Покинул форум
Сообщений всего: 1185
Дата рег-ции: Февр. 2006  
Откуда: Чаусы/Минск, РБ
Репутация: 22



Sacren
малаццом
двигаешь вперёд
дерзай дальше

-----
Эвон оно как ...
top
Ray
> 14 января 2010 — 14:25
  [Id]
Пользователь


Форумчанин

Покинул форум
Сообщений всего: 259
Дата рег-ции: Окт. 2006  
Откуда: Belarus,Chausy
Репутация: 11



Раз уж ты в гейм пошел, то загляни на GameDev.ru, найдешь там много чего полезного.
Вообще ресурсов неплохих много, но этот самый тот что надо.

-----
We don't know the days that will change our lives... Stephen King. Dreamcatcher.
top
Sacren
> 14 января 2010 — 16:35
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Стамп, Это расово неверный движок Blitz 3D. Thanx))) Улыбка Думаю перейти на irrlicht он вроде получше да и в ц плус плус интегрируется прекрасно.

Ray, да я какбы давно уже там ошиваюсь в поисках самобытных демок. Ниндзя Но там народ посерьёзнее меня.

-----

lastofavari.com | YouTube
top
Ray
> 14 января 2010 — 17:11
  [Id]
Пользователь


Форумчанин

Покинул форум
Сообщений всего: 259
Дата рег-ции: Окт. 2006  
Откуда: Belarus,Chausy
Репутация: 11



Blitz 3D тоже неплохая штука.
Если интересно, посмотри на тулзу для создания демок от fr, они же Farbrausch, не помню как называется, но штука клевая.
И пройдись по англоязычным сайтам. Я когда-то у них находил очень много полезного материала и статей.

-----
We don't know the days that will change our lives... Stephen King. Dreamcatcher.
top
m00nk
> 14 января 2010 — 17:43
  [Id]
Администратор


Ко-админ. Жестокий, но справедливый.

Покинул форум
Сообщений всего: 2884
Дата рег-ции: Янв. 2006  
Откуда: туташний я
Репутация: 32



 Sacren пишет:
Думаю перейти на irrlicht

Одобрям! Еще можешь в сторону OGRE глянуть. Тоже достойная вещь.

-----

...ла-ла-ла-ла-ла...
top
« Наше творчество тут! »
> Похожие темы: Сэкренский программинг
Темы Форум Информация о теме Обновление
Любительские фотографии
или потуги фоточайника :)
Наше творчество тут! Ответов: 89
Автор темы: Gane4ka
7 апреля 2015 — 01:49
Автор: Sacren
Сэкренский программинг
Продолжение темы моего программинга
Наше творчество тут! Ответов: 94
Автор темы: Admin
8 мая 2014 — 00:22
Автор: Sacren
 

 
  |  Метки: 
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.


RSS 24.08.2017 - 11:33
[Script Execution time: 0.1415]     [ Gzipped ]