0
我試圖鞋拔libtidy與最小的返工C++程序。 C++程序需要char *中的結果(清理過的)HTML。我使用的libtidy示例代碼,但試圖利用tidySaveString而非tidySaveBuffer其想要使用libtidy自己的緩衝區。如何獲得解析從libtidy輸出成char *
問題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_)輸出。理想情況下(顯然)我不想將文檔轉儲到輸出緩衝區,以便我可以獲得大小 - 但是,我也需要找到一種方法來實現這個功能。
所有幫助感激地接受..
謝謝 - 我認爲(來自文檔)它是純粹爲了在失敗的情況下返回所需的大小。解決問題1我猜 - 雖然它似乎仍然啞必須得到來自tdoc緩衝區只是爲了讓大小來分配我需要的人 - 有沒有辦法讓從tdoc所需的大小?我現在使用的解決方案是使用'cleansed_buffer_ =(char *)malloc(output.size + 1); 的memcpy((字符*)cleansed_buffer_,(字符*)output.bp,output.size);' –