2015-08-26 62 views
2

我目前正在使用C-結合與libxml2增加對晶琅C14N支持。我已經成功地使用xmlC14NDocSave將規範的xml保存到文件中。我遇到的問題是xmlOutputBufferPtr同時用於xmlC14NDocSaveTo和xmlC14NExecute。水晶郎C-結合結構似乎並沒有傳遞null值

我收到錯誤的是(Mac和Linux)

xmlC14NExecute:輸出緩衝區編碼器= NULL但C14N需要UTF8輸出

文檔狀態

此緩衝區必須有編碼器== NULL因爲C14N要求UTF-8輸出

src/C14N/lib_C14N.cr我有以下代碼

type CharEncodingHandler = Void* 
type Buff = Void* 
#type OutputBuffer = Void* 
struct OutputBuffer 
    context : Void* 
    writecallback : OutputWriteCallback 
    closecallback : OutputCloseCallback 
    encoder : CharEncodingHandler 
    buffer : Buff 
    conv : Buff 
    written : Int32 
    error : Int32 
end 
.... 
fun xmlC14NDocSaveTo(doc : LibXML::Node*, nodes : LibXML::NodeSet*, mode : Mode, inclusive_ns_prefixes : UInt8**, with_comments : Int32, buf : OutputBuffer*) : Int32 
fun xmlC14NExecute(doc : LibXML::Node*, is_visible_callback : IsVisibleCallback, user_data : Void*, mode : Mode, inclusive_ns_prefixes : UInt8**, with_comments : Int32, buf : OutputBuffer*) : Int32 

src/C14N.cr

output = XML::LibC14N::OutputBuffer.new 
p output.encoder 
XML::LibC14N.xmlC14NDocSaveTo(@xml, nil, @mode, nil, 0, out output) 

在p的ouput.encoder是Pointer(Void).null所以會出現的值是空的結果。

c14n.c功能只是空檢查在buf->編碼器結構

if (buf->encoder != NULL) { 
    xmlGenericError(xmlGenericErrorContext, 
        "xmlC14NExecute: output buffer encoder != NULL but C14N requires UTF8 output\n"); 
    return (-1); 
} 

任何幫助,將不勝感激,代碼可以在我的帳戶github中找到。克隆並運行crystal spec

回答

1

不指定out output,它只是在棧上保留一個結構體大小的內存塊並將指針傳遞給它。從Crystal 0.7.6開始,它並沒有將它歸零,所以你通過了垃圾。

使用output = XML::LibC14N::OutputBuffer.new已經是第一個正確的一步,因爲這確實零出內存。現在通過它,只需將out output替換爲pointerof(output)即可。

+0

謝謝你的幫助。出於某種原因,在閱讀完文檔後,我認爲這只是pointerof的一個快捷方式。 – vonKingsley