История изменений
Исправление
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; //
}