Subject: Re: Query about return value of snprintf
To: None <mcr@solidum.com>
From: Andreas Jaeger <aj@arthur.rhein-neckar.de>
List: tech-userlevel
Date: 06/17/1999 23:38:26
The man page in man-pages <= 1.24 document the behaviour of glibc
2.0.  The behaviour of glibc 2.1 will be documented in the next
manpages release.  In this case the netbsd man page agrees with glibc
2.1's documented behaviour.

glibc 2.1 is documented in the info pages which should tell you (the
last paragraph is new):
 - Function: int snprintf (char *S, size_t SIZE, const char *TEMPLATE,
          ...)
     The `snprintf' function is similar to `sprintf', except that the
     SIZE argument specifies the maximum number of characters to
     produce.  The trailing null character is counted towards this
     limit, so you should allocate at least SIZE characters for the
     string S.

     The return value is the number of characters which would be
     generated for the given input, excluding the trailing null.  If
     this value is greater or equal to SIZE, not all characters from
     the result have been stored in S.  You should try again with a
     bigger output string.  Here is an example of doing this:

          /* Construct a message describing the value of a variable
             whose name is NAME and whose value is VALUE. */
          char *
          make_message (char *name, char *value)
          {
            /* Guess we need no more than 100 chars of space. */
            int size = 100;
            char *buffer = (char *) xmalloc (size);
            int nchars;
           /* Try to print in the allocated space. */
            nchars = snprintf (buffer, size, "value of %s is %s",
                               name, value);
            if (nchars >= size)
              {
                /* Reallocate buffer now that we know
                   how much space is needed. */
                buffer = (char *) xrealloc (buffer, nchars + 1);
          
                /* Try again. */
                snprintf (buffer, size, "value of %s is %s",
                          name, value);
              }
            /* The last call worked, return the string. */
            return buffer;
          }

     In practice, it is often easier just to use `asprintf', below.

     *Attention:* In the GNU C library version 2.0 the return value is
     the number of characters stored, not including the terminating
     null.  If this value equals `SIZE - 1', then there was not enough
     space in S for all the output.  This change was necessary with the
     adoption of snprintf by ISO C9x.


Andreas
-- 
 Andreas Jaeger   aj@arthur.rhein-neckar.de    jaeger@informatik.uni-kl.de
  for pgp-key finger ajaeger@aixd1.rhrk.uni-kl.de