// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП // // textlink.cpp Copyright (c) Гергель В.П. 21.01.2003 // // класс объектов-значений для строк текста #include <conio.h> #include "textlink.h" #include "ttext.h" void TTextLink :: InitMemSystem (int size) { // инииализация памяти char Line[100]; MemHeader.pFirst = (PTTextLink) new char[sizeof(TTextLink)*size]; MemHeader.pFree = MemHeader.pFirst; MemHeader.pLast = MemHeader.pFirst + (size-1); PTTextLink pLink = MemHeader.pFirst; for ( int i=0; i< size-1; i++, pLink++ ) { // размерка памяти pLink->pNext = pLink+1; } pLink->pNext = NULL; } void TTextLink :: PrintFreeLink (void) { // печать свободных звеньев PTTextLink pLink = MemHeader.pFree; cout << "List of free links" << endl; for ( ; pLink != NULL; pLink = pLink->pNext ) cout << pLink->Str << endl; } void * TTextLink :: operator new (size_t size) { // выделение звена PTTextLink pLink = MemHeader.pFree; if ( MemHeader.pFree != NULL ) MemHeader.pFree = pLink->pNext; return pLink; } void TTextLink :: operator delete (void *pM) { // освобождение звена Skipped... } void TTextLink :: MemCleaner(const TText &txt) { // сборка мусора // пробная версия - в памяти только один текст string st; // маркировка строк текста - маркер "&&&" for ( txt.Reset(); !txt.IsTextEnded(); txt.GoNext() ) { if ( st.find("&&&") != 0 ) txt.SetLine("&&&" + txt.GetLine()); } // маркировка списка свободных звеньев PTTextLink pLink = MemHeader.pFree; for ( ; pLink != NULL; pLink = pLink->pNext ) strcpy(pLink->Str,"&&&"); // сборка мусора pLink = MemHeader.pFirst; for ( ; pLink <= MemHeader.pLast; pLink++ ) { if ( strstr(pLink->Str,"&&&") != NULL ) { // строка текста или свобоное звено strcpy(pLink->Str,pLink->Str+3); // снятие маркировки } else delete pLink; // "неучтенное" звено в список свободных } }