Re: [HACKERS] snprintf causes regression tests to fail
От | Tom Lane |
---|---|
Тема | Re: [HACKERS] snprintf causes regression tests to fail |
Дата | |
Msg-id | 2380.1109718949@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: [HACKERS] snprintf causes regression tests to fail (Nicolai Tufar <ntufar@gmail.com>) |
Ответы |
Re: [HACKERS] snprintf causes regression tests to fail
|
Список | pgsql-hackers-win32 |
Nicolai Tufar <ntufar@gmail.com> writes: >> Having looked at the current snprintf.c, I don't actually believe that >> it works at all in the presence of positional parameter specs. > It picks up arguments in order of appearance, places them in > array then shuffles them according to %n$ positional parameter. > I checked it with in many different combinations, it works! Did you try combinations of parameters of different sizes? For instance snprintf(..., "%g %d", doubleval, intval); and snprintf(..., "%2$d %1$g", doubleval, intval); You cannot pick this up in order of appearance and expect it to work. It might fail to fail on some machine architectures, but it's not going to be portable. >> On the other side of the >> coin, the hardwired 4K limit in printf() is certainly *not* enough. > How would one solve this issue. Calling malloc() from a print function > would be rather expensive. printf shouldn't use a buffer at all. I was thinking in terms of passing around a state struct like typedef struct { char *output; char *end; FILE *outfile; } printf_target; and making dopr_outch look like static void dopr_outch(int c, printf_target *state) { if (state->output) { if (state->end == NULL || state->output < state->end) *(state->output++) = c; } else fputc(c, state->outfile); } regards, tom lane
В списке pgsql-hackers-win32 по дате отправления: