Hasznos C függvények ;)

WStrSemiPermanent

Saját ideiglenes pufferezéssel rendelkező, automatikusan felszabaduló stringek készítéséhez, amelyek a string osztályoknál gyorsabbak és hatékonyabbak, de hasonló kényelemmel használhatóak.
Ideális megoldás pl. függvények visszatérő értékének, hiszen hagyományos char* visszatérő értéket adhat vissza, a visszaadott karakterfűzér mutató pedig még egy ideig a függvény viszatérése után is a létező karaktertömbre mutat.
A PERMANENTS értékkel meghatározott egymást követő
WStrSemiPermanent híváson keresztül megőrzi a stringeket, de azt követően felhaszbadítja azt.
Az ideiglenes karakterfüzéreket a használatukhoz szükséges ideig (pl. Függvényből visszatérés után a kapott eredmény továbbfeldolgozásáig, majd eltárolásáig vagy 'elfelejtéséig'. Ha valóban tartósan szükséges az érték, akkor pl egy strdup() hívással egyszerűen véglegesen tárolható.
Lehetőség van az ideiglenesen tárolt stri
ngek területének felszabadítására, ez helytakarékosságból vagy a programból kilépés előtt (pl. CodeGuard használata esetén) lehet szükséges: WStrSemiPermanent((char *)&WStrSemiPermanent_FREE_ALL, 0);

Header:

char * WStrSemiPermanent (char *pStr, size_t pMinLen = 0, size_t pMaxLen = UInt2_MAX);

extern  char WStrSemiPermanent_FREE_ALL;   // Speciális eset: WStrSemiPermanent() elemek felszabadításának kérése.

C kód:

char WStrSemiPermanent_FREE_ALL; // Speciális eset: WStrSemiPermanent() elemek felszabadításának kérése.

#define SEMI_PERMANENTS 252 // Átmeneti string tár hossza.

//-- WStrSemiPermanent -------------------------------------------------------

// Make a semi permanent copy for 'Str' string.

// Allocate a buffer for pStr and store it. But... with this function

// the buffer don't forget at return with stack. No problem thet, return buffer don't free-ed.

// Return a string pointer, what 'live' after return (but automatically free-ed later).

 

char * WStrSemiPermanent (char *pStr, size_t pMinLen, size_t pMaxLen)

{

  static char **SemiPermanents;

  static short int Index = -1;

  char * RetStr;

  char * ErrMsg= "'WStrSemiPermanent()': Sikertelen memória allokáció !";

 

  //

 

  if (pStr == NULL)

  {

    return NULL;

  }

 

  //---

 

  if (pStr == (char *)&WStrSemiPermanent_FREE_ALL)

  { // Speciális kérés  ---> Felszabadítani minden tárolt stringet.

    if (SemiPermanents)

    {

      for (int iLoop = 0; (iLoop < SEMI_PERMANENTS); iLoop++)

      {

        char * WorkStr = *(SemiPermanents + iLoop);

 

        if (WorkStr)

        {

          free(WorkStr);

        }

      }

    }

 

    free(SemiPermanents);

    SemiPermanents = NULL;

    Index = -1;

 

    return NULL;

  }

 

  //---

 

  if (Index < 0)

  {

    size_tSize = sizeof(char *) * SEMI_PERMANENTS;

 

    SemiPermanents = (char **)malloc(Size);

 

    if (! SemiPermanents)

    {

      ShowMessage(ErrMsg);

      return "";

    }

 

    memset(SemiPermanents, '\0', Size);

  }

 

 

  Index++;                                // Következő szabad elemre

 

  if ((Index >= SEMI_PERMANENTS) || (Index < 0))

  { // Gyűrűbe szervezve (valamint egy felesleges óvintézkedés).

    Index = 0;

  }

 

  //---

 

  size_t  iStringHossz = _strncnt(pStr, pMaxLen);    // String hossza, legfeljebb pMaxLen

  bool    bBovit       = false;

 

  if (pMinLen > iStringHossz)

  { // A kért hossz nagyobb, bővítést is akar.

    bBovit        = true;

    iStringHossz  = pMinLen;

  }

 

  //

 

  RetStr = *(SemiPermanents + Index);

 

  if (RetStr)

  { // Felesleges NULL vizsgálat, de már csak ilyen vagyok.

    free(RetStr);

  }

 

  RetStr = (char *)malloc(iStringHossz + 1);      // EOS karaternek hely

 

  *(SemiPermanents + Index) = RetStr;

 

  if (! RetStr)

  {

    ShowMessage(ErrMsg);

    return "";

  }

 

  if (bBovit)

  { // bővítés esetén zárókarakterek

    memset(RetStr, ' ', iStringHossz);

  }

 

  *(RetStr + iStringHossz) = 0;           // EOS

 

  memcpy(RetStr, pStr, iStringHossz);

 

  return RetStr;

}

Ezek a kódok szabadon felhasználhatók.
Remélem segítséget nyújtottam munkájához.
FreeWare C language code

--- (C) eMeL Bt. ---

módosítva : 2002.08.04