Ищем исходный код C для snprintf()

Мне нужно перенести snprintf() на другую платформу, которая не полностью поддерживает GLibC.

Я ищу базовое объявление в исходном коде Glibc 2.14. Я слежу за многими вызовами функций, но застреваю на vfprintf(). Затем кажется, что он вызывает _IO_vfprintf(), но я не могу найти определение. Вероятно, макрос запутывает вещи.

Мне нужно увидеть реальный код C, который сканирует строку формата и вычисляет количество байтов, которые он запишет, если входной буфер будет достаточно большим.

Я также пробовал искать в newlib 1.19.0, но застрял на _svfprintf_r(). нигде не могу найти определения.

Может ли кто-нибудь указать мне определение или другое для snprintf()?


person kevinarpe    schedule 15.06.2011    source источник


Ответы (3)


http://www.ijs.si/software/snprintf/ имеет то, что, как они утверждают, < em>переносимая реализация snprintf, включая vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf. Возможно, это может помочь.

person mah    schedule 15.06.2011
comment
Какой бы хорошей она ни казалась, эта реализация НЕ поддерживает какое-либо форматирование с плавающей запятой/двойное число, поэтому она далека от завершения. - person Eric Nicolas; 23.06.2014

Я довольно долго копался в источниках, чтобы найти определения _svfprintf_r() (и друзей) в Newlib. Поскольку ОП спросил об этом, я опубликую свою находку для бедных душ, которым они тоже нужны. Следующее верно для 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)
{
    ...
person Roman Dmitrienko    schedule 01.03.2013

Исходный код библиотеки GNU C (glibc) размещен на sourceware.org.

Вот ссылка на реализацию vfprintf(), которая вызывается snprintf(): https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c

person Benoit Blanchon    schedule 28.03.2016
comment
Я проверил указанный вами URL. Я вижу: #ifndef COMPILE_WPRINTF ... # define vfprintf _IO_vfprintf_internal, но где определяется _IO_vfprintf_internal? Дайте мне знать, если я неправильно понимаю. - person kevinarpe; 29.03.2016
comment
Определение vfprintf() начинается с строка 1235. - person Benoit Blanchon; 29.03.2016
comment
vfprintf() теперь начинается со строки 1244. - person Technophile; 22.06.2017
comment
Это JUMPмного! - person Lucas Siqueira; 24.11.2017