LINUX.ORG.RU

История изменений

Исправление Forum0888, (текущая версия) :

// -------------------------------------------------------
// --- Добавляет строки к исходной
//
CHAR  * Metastrcat(
 CHAR  *pSource,
 ...
) {
/*

 pSource                Исходная строка

*/

  INT    iVp01           = 0;                              //        

  CHAR   *pTemp          = nullptr;                        // Значение аргумента
  INT    cntpTemp        = NULL;                           // Длина значения аргумента функции

  CHAR   *pResString     = nullptr;                        // Результирующая строка
  INT    cntResString    = NULL;                           // Длина результирующей строки

  CHAR   *pCurpResString = nullptr;                        // Адрес текущей позиции в результирующей строке

  CHAR   **pArgument     = nullptr;                        // Адрес значения аргумента функции

  INT    cntpSource      =                                 // Длина pSource
   Metastrlen(
    pSource
   );

// Рассчет количества символов во всех аргументах функции
//
  CHAR  *p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntResString +=                                         // Длина результирующей строки
    Metastrlen(
     pTemp
    );
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

// Выделяем память для результирующей строки
//

  pResString = (CHAR *) malloc( ( cntResString + 1 ) * sizeof( CHAR ) );

  *(CHAR *) ( (CHAR *) pResString + cntResString ) =       // Сформировали строку
   (CHAR) 0;

// Формируем текст результирующей строки
//
  pCurpResString =                                         // Адрес текущей позиции в результирующей строке
   (CHAR *) pResString;

// Получаем знчения аргументов функции и помещаем их в результирующую строку
//
  p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntpTemp =                                              // Длина значения аргумент
    Metastrlen(
     pTemp
    );

// Копируем значение аргумента
//
   memcpy(
    pCurpResString,                                        // Адрес результирующей строки
    pTemp,                                                 // Адрес исходной строки
    cntpTemp * sizeof( CHAR )                              // Количество копируемых байт
   );

   pCurpResString  +=                                      // Адрес текущей позиции в результирующей строке
    cntpTemp;
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

  *( pResString + cntResString ) = '\0';                   // Сформировали строку

  free(                                                    // Освободили память память, содержащюю данные до добавления строки
   pSource
  ); 

  return  pResString;                                      // 

}

Исходная версия Forum0888, :

// -------------------------------------------------------
// --- Добавляет строки к исходной
//
CHAR  * Metastrcat(
 CHAR  *pSource,
 ...
) {
/*

 pSource                Исходная строка

*/

  INT    iVp01           = 0;                              //        

  CHAR   *pTemp          = nullptr;                        // Значение аргумента
  INT    cntpTemp        = NULL;                           // Длина значения аргумента функции

  CHAR   *pResString     = nullptr;                        // Результирующая строка
  INT    cntResString    = NULL;                           // Длина результирующей строки

  CHAR   *pCurpResString = nullptr;                        // Адрес текущей позиции в результирующей строке

  CHAR   **pArgument     = nullptr;                        // Адрес значения аргумента функции

  INT    cntpSource      =                                 // Длина pSource
   Metastrlen(
    pSource
   );

// Рассчет количества символов во всех аргументах функции
//
  CHAR  *p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntResString +=                                         // Длина результирующей строки
    Metastrlen(
     pTemp
    );
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

// Выделяем память для результирующей строки
//

  pResString = (CHAR *) malloc( ( cntResString + 1 ) * sizeof( CHAR ) );

  *(CHAR *) ( (CHAR *) pResString + cntResString ) =       // Сформировали строку
   (CHAR) 0;

// Формируем текст результирующей строки
//
  pCurpResString =                                         // Адрес текущей позиции в результирующей строке
   (CHAR *) pResString;

// Получаем знчения аргументов функции и помещаем их в результирующую строку
//
  p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntpTemp =                                              // Длина значения аргумент
    Metastrlen(
     pTemp
    );

// Копируем значение аргумента
//
   memcpy(
    pCurpResString,                                        // Адрес результирующей строки
    pTemp,                                                 // Адрес исходной строки
    cntpTemp * sizeof( CHAR )                              // Количество копируемых байт
   );

   pCurpResString  +=                                      // Адрес текущей позиции в результирующей строке
    cntpTemp;
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

  *( pResString + cntResString ) = '\0';                   // Сформировали строку

  free(                                                    // Освободили память память, содержащюю данные до добавления строки
   pSource
  ); 

//pSource = pResString;                                    // Адрес строки с добавленными данными

  return  pResString;                                      // 

}