Crystal-Lang C-Binding结构似乎没有传递null值

时间:2015-08-26 22:12:24

标签: binding crystal-lang

我目前正尝试使用libxml2的c-binding添加c14n对crystal-lang的支持。我已经成功地使用xmlC14NDocSave将规范的xml保存到文件中。我遇到的问题是xmlC14NDocSaveTo和xmlC14NExecute的xmlOutputBufferPtr。

我收到的错误是(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所以看起来值是null。

c14n.c函数只是在buf->编码器结构

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

我们将非常感谢您的帮助,我的github帐户中可以找到该代码。克隆并运行crystal spec

1 个答案:

答案 0 :(得分:1)

不要指定out output,它只是在堆栈上保留一个结构大小的内存块,并传递一个指向它的指针。从Crystal 0.7.6开始,它没有归零,所以你传递垃圾。

使用output = XML::LibC14N::OutputBuffer.new已经是第一个正确的步骤,因为它确实将内存清零。现在要传递它,只需将out output替换为pointerof(output)