寻找snprintf()的C源代码

时间:2011-06-15 10:12:45

标签: glibc printf newlib

我需要将snprintf()移植到另一个不完全支持GLibC的平台上。

我正在寻找Glibc 2.14源代码中的基础声明。我遵循许多函数调用,但卡在vfprintf()上。然后它似乎调用_IO_vfprintf(),但我找不到定义。可能一个宏正在混淆事物。

我需要查看扫描格式字符串的真实C代码,并计算输入缓冲区足够大时它将写入的字节数。

我也尝试过查看newlib 1.19.0,但我遇到了_svfprintf_r()。我无法在任何地方找到这个定义。

有人可以指向我的定义或另一个定义snprintf()吗?

3 个答案:

答案 0 :(得分:5)

我花了很长时间挖掘源代码,在Newlib中找到_svfprintf_r()(和朋友)定义。自从OP问到这个问题后,我会把我的发现发布给那些需要这些人的穷人。以下内容适用于Newlib 1.20.0,但我猜它在不同版本中大致相同。

实际来源位于 vfprintf.c 文件中。有一个宏_VFPRINTF_R设置为_svfiprintf_r_vfiprintf_r_svfprintf_r_vfprintf_r之一(取决于构建选项),然后是实际的实现函数定义相应:

int
_DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap),
       struct _reent *data _AND
       FILE * fp           _AND
       _CONST char *fmt0   _AND
       va_list ap)
{
    ...

答案 1 :(得分:5)

GNU C库(glibc)的源代码托管在sourceware.org上。

以下是vfprintf()实施的链接,由snprintf()调用: https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c

答案 2 :(得分:4)

http://www.ijs.si/software/snprintf/他们声称是 snprintf的可移植实现,包括vsnprintf.c,asnprintf,vasnprintf,asprintf,vasprintf 。也许它可以提供帮助。