gpt4 book ai didi

c++ - 如何将 libtidy 的解析输出转换为 char *

转载 作者:行者123 更新时间:2023-11-28 08:17:36 25 4
gpt4 key购买 nike

我正在尝试将 libtidy 塞进 C++ 程序中,并尽量减少返工。 C++ 程序需要在 char * 中生成(清理过的)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_) 中的输出。理想情况下(显然)我不想将文档转储到输出缓冲区只是为了获得大小 - 而且,我需要找到一种方法让它工作。

感谢所有的帮助..

最佳答案

你必须传入缓冲区大小...

uint yy = output.size;
cleansed_buffer_ = (char *)malloc(yy+10);
uint xx = yy+10; /* <---------------------------------- HERE */
rc = tidySaveString(tdoc, this->cleansed_buffer_,&xx );
if (rc == -ENOMEM)
cout << "yikes!!\n" << endl;

或者,您可以通过这种方式获取尺寸:

cleansed_buffer_ = (char *)malloc(1);
uint size = 0
rc = tidySaveString(tdoc, cleansed_buffer_, &size );

// now size is the required size
free(cleansed_buffer_);
cleansed_buffer_ = (char *)malloc(size+1);
rc = tidySaveString(tdoc, cleansed_buffer_, &size );

关于c++ - 如何将 libtidy 的解析输出转换为 char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7162706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com