Python扩展用于Upskirt:字符串末尾垃圾
我一直在尝试为Upskirt制作一个Python扩展。我觉得对于第一个C语言项目来说,这应该不会太难,因为有一些示例(比如Upskirt代码中的示例程序和Ruby扩展)。
这个扩展是可以工作的,它能把我输入的Markdown格式的内容转换过来,但有时候输出的结果在字符串的末尾会出现一些杂乱的东西。我不知道是什么原因导致的。
以下是一些输出结果:
python test.py
<module 'pantyshot' from '/home/frank/Code/pantyshot/virtenv/lib/python2.7/site-packages/pantyshot.so'>
<built-in function render>
'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>
--------------------------------------------------------------------------------
'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>
--------------------------------------------------------------------------------
我的代码可以在我的Github仓库找到。我把它叫做pantyshot,因为我想到这个名字时正好听到upskirt。名字有点奇怪,我知道。
希望有人能帮帮我。
1 个回答
3
你在strdup
的函数:
output_text = strdup(ob->data); /* ob is a "struct buf *" */
但是我觉得 ob->data
可能不是一个以零结尾的C字符串。你可以在这里找到相关内容 upskirt/buffer.c
:
/* bufnullterm • NUL-termination of the string array (making a C-string) */
void
bufnullterm(struct buf *buf) {
if (!buf || !buf->unit) return;
if (buf->size < buf->asize && buf->data[buf->size] == 0) return;
if (bufgrow(buf, buf->size + 1))
buf->data[buf->size] = 0; }
所以,你可能是在超出缓冲区的范围运行代码,碰巧在出错之前遇到了一个 '\0'
。我觉得在把 ob->data
复制成C字符串之前,你应该先调用 bufnullterm(ob)
;或者你可以查看 ob->size
,使用 malloc
和 strncpy
来复制它,并手动处理零结尾的问题(但要确保你分配的内存是 ob->size + 1
字节,以便存放复制的字符串)。
如果你想去掉换行符(也就是最后的 \n
),那么你可能需要在某个地方手动去除空白字符。