Я пытаюсь вставить libtidy в программу на C ++ с минимальными переделками. Программа C ++ нуждается в результирующем (очищенном) HTML в символе *. Я использую пример кода libtidy, но пытаюсь использовать tidySaveString, а не tidySaveBuffer, который хочет использовать собственный буфер libtidy.
Проблема 1 в том, что я не могу найти (разумный) способ определить размер, который мне нужно выделить для моего буфера, ничего очевидного в документах libtidy не кажется очевидным.
проблема 2 заключается в том, что когда я использую ненадежный метод для получения размера (поместите его в tidyBuffer и получите его размер), а затем выделите свою память и вызовите tidySaveString, я всегда получаю ошибку -ENOMEM.
Вот адаптированный код, который я использую:
.
.
.
char *buffer_;
char *cleansed_buffer_;
.
.
.
int ProcessHtml::Clean(){
// uses Libtidy to convert the buffer to XML
TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
Bool ok;
TidyDoc tdoc = tidyCreate(); // Initialize "document"
ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes ); // Convert to XHTML
if ( ok )
rc = tidySetErrorBuffer( tdoc, &errbuf ); // Capture diagnostics
if ( rc >= 0 )
rc = tidyParseString( tdoc, this->buffer_ ); // Parse the input
if ( rc >= 0 )
rc = tidyCleanAndRepair( tdoc ); // Tidy it up!
if ( rc >= 0 )
rc = tidyRunDiagnostics( tdoc ); // Kvetch
if ( rc > 1 ) // If error, force output.
rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
if ( rc >= 0 ){
rc = tidySaveBuffer( tdoc, &output ); // Pretty Print
// get some mem
uint yy = output.size;
cleansed_buffer_ = (char *)malloc(yy+10);
uint xx = 0;
rc = tidySaveString(tdoc, this->cleansed_buffer_,&xx );
if (rc == -ENOMEM)
cout << "yikes!!\n" << endl;
}
if ( rc >= 0 )
{
if ( rc > 0 )
printf( "\nDiagnostics:\n\n%s", errbuf.bp );
printf( "\nAnd here is the result:\n\n%s", cleansed_buffer_ );
}
else
printf( "A severe error (%d) occurred.\n", rc );
tidyBufFree( &output );
tidyBufFree( &errbuf );
tidyRelease( tdoc );
return rc;
}
Это чтение байтов для очистки из входного буфера (buffer_), и мне действительно нужен вывод в (cleansed_buffer_). В идеале (очевидно) я не хочу выгружать документ в выходной буфер только для того, чтобы получить размер, но мне также нужно найти способ заставить это работать.
Вся помощь с благодарностью получена ..