Ищете исходный код C для snprintf () - PullRequest
4 голосов
/ 15 июня 2011

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 01 марта 2013

Я потратил довольно много времени на поиск источников, чтобы найти определения _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)
{
    ...
5 голосов
/ 28 марта 2016

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

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

4 голосов
/ 15 июня 2011

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

...