2011-08-23 47 views
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

你有緩衝區大小通...

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; 

Alternativally,你可以得到的尺寸是這樣的:

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); 
+0

謝謝 - 我認爲(來自文檔)它是純粹爲了在失敗的情況下返回所需的大小。解決問題1我猜 - 雖然它似乎仍然啞必須得到來自tdoc緩衝區只是爲了讓大小來分配我需要的人 - 有沒有辦法讓從tdoc所需的大小?我現在使用的解決方案是使用'cleansed_buffer_ =(char *)malloc(output.size + 1); 的memcpy((字符*)cleansed_buffer_,(字符*)output.bp,output.size);' –