snprintf_2.2/README

changeset 35
5a71d53d0228
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/snprintf_2.2/README	Sat Jan 19 19:14:36 2002 +0100
@@ -0,0 +1,283 @@
+
+                                  snprintf.c
+                   - a portable implementation of snprintf,
+       including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf
+                                       
+   snprintf is a routine to convert numeric and string arguments to
+   formatted strings. It is similar to sprintf(3) provided in a system's
+   C library, yet it requires an additional argument - the buffer size -
+   and it guarantees never to store anything beyond the given buffer,
+   regardless of the format or arguments to be formatted. Some newer
+   operating systems do provide snprintf in their C library, but many do
+   not or do provide an inadequate (slow or idiosyncratic) version, which
+   calls for a portable implementation of this routine.
+   
+Author
+
+   Mark Martinec <mark.martinec@ijs.si>, April 1999, June 2000
+   Copyright © 1999, Mark Martinec
+   
+Terms and conditions ...
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the Frontier Artistic License which comes with
+   this Kit.
+   
+Features
+
+     * careful adherence to specs regarding flags, field width and
+       precision;
+     * good performance for large string handling (large format, large
+       argument or large paddings). Performance is similar to system's
+       sprintf and in several cases significantly better (make sure you
+       compile with optimizations turned on, tell the compiler the code
+       is strict ANSI if necessary to give it more freedom for
+       optimizations);
+     * return value semantics per ISO/IEC 9899:1999 ("ISO C99");
+     * written in standard ISO/ANSI C - requires an ANSI C compiler.
+       
+Supported conversion specifiers and data types
+
+   This snprintf only supports the following conversion specifiers: s, c,
+   d, o, u, x, X, p (and synonyms: i, D, U, O - see below) with flags:
+   '-', '+', ' ', '0' and '#'. An asterisk is supported for field width
+   as well as precision.
+   
+   Length modifiers 'h' (short int), 'l' (long int), and 'll' (long long
+   int) are supported.
+   
+   NOTE:
+   
+     If macro SNPRINTF_LONGLONG_SUPPORT is not defined (default) the
+     length modifier 'll' is recognized but treated the same as 'l',
+     which may cause argument value truncation! Defining
+     SNPRINTF_LONGLONG_SUPPORT requires that your system's sprintf also
+     handles length modifier 'll'. long long int is a language extension
+     which may not be portable.
+     
+   Conversion of numeric data (conversion specifiers d, o, u, x, X, p)
+   with length modifiers (none or h, l, ll) is left to the system routine
+   sprintf, but all handling of flags, field width and precision as well
+   as c and s conversions is done very carefully by this portable
+   routine. If a string precision (truncation) is specified (e.g. %.8s)
+   it is guaranteed the string beyond the specified precision will not be
+   referenced.
+   
+   Length modifiers h, l and ll are ignored for c and s conversions (data
+   types wint_t and wchar_t are not supported).
+   
+   The following common synonyms for conversion characters are supported:
+     * i is a synonym for d
+     * D is a synonym for ld, explicit length modifiers are ignored
+     * U is a synonym for lu, explicit length modifiers are ignored
+     * O is a synonym for lo, explicit length modifiers are ignored
+       
+   The D, O and U conversion characters are nonstandard, they are
+   supported for backward compatibility only, and should not be used for
+   new code.
+   
+   The following is specifically not supported:
+     * flag ' (thousands' grouping character) is recognized but ignored
+     * numeric conversion specifiers: f, e, E, g, G and synonym F, as
+       well as the new a and A conversion specifiers
+     * length modifier 'L' (long double) and 'q' (quad - use 'll'
+       instead)
+     * wide character/string conversions: lc, ls, and nonstandard
+       synonyms C and S
+     * writeback of converted string length: conversion character n
+     * the n$ specification for direct reference to n-th argument
+     * locales
+       
+   It is permitted for str_m to be zero, and it is permitted to specify
+   NULL pointer for resulting string argument if str_m is zero (as per
+   ISO C99).
+   
+   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 str_m, not all characters from the result have
+   been stored in str, output bytes beyond the (str_m-1) -th character
+   are discarded. If str_m is greater than zero it is guaranteed the
+   resulting string will be null-terminated.
+   
+   NOTE that this matches the ISO C99, OpenBSD, and GNU C library 2.1,
+   but is different from some older and vendor implementations, and is
+   also different from XPG, XSH5, SUSv2 specifications. For historical
+   discussion on changes in the semantics and standards of snprintf see
+   printf(3) man page in the Linux programmers manual.
+   
+   Routines asprintf and vasprintf return a pointer (in the ptr argument)
+   to a buffer sufficiently large to hold the resulting string. This
+   pointer should be passed to free(3) to release the allocated storage
+   when it is no longer needed. If sufficient space cannot be allocated,
+   these functions will return -1 and set ptr to be a NULL pointer. These
+   two routines are a GNU C library extensions (glibc).
+   
+   Routines asnprintf and vasnprintf are similar to asprintf and
+   vasprintf, yet, like snprintf and vsnprintf counterparts, will write
+   at most str_m-1 characters into the allocated output string, the last
+   character in the allocated buffer then gets the terminating null. If
+   the formatted string length (the return value) is greater than or
+   equal to the str_m argument, the resulting string was truncated and
+   some of the formatted characters were discarded. These routines
+   present a handy way to limit the amount of allocated memory to some
+   sane value.
+   
+Availability
+
+   http://www.ijs.si/software/snprintf/
+     * snprintf_1.3.tar.gz (1999-06-30), md5 sum: snprintf_1.3.tar.gz.md5
+     * snprintf_2.1.tar.gz (2000-07-14), md5 sum: snprintf_2.1.tar.gz.md5
+     * snprintf_2.2.tar.gz (2000-10-18), md5 sum: snprintf_2.2.tar.gz.md5
+       
+Mailing list
+
+   There is a very low-traffic mailing list snprintf-announce@ijs.si
+   where announcements about new versions will be posted as well as
+   warnings about threatening bugs if discovered. The posting is
+   restricted to snprintf developer(s).
+   
+   To subscribe to (or unsubscribe from) the mailing list please visit
+   the list server's web page
+   http://mailman.ijs.si/listinfo/snprintf-announce
+   
+   You can also subscribe to the list by mailing the command SUBSCRIBE
+   either in the subject or in the message body to the address
+   snprintf-announce-request@ijs.si . You will be asked for confirmation
+   before subscription will be effective.
+   
+   The list of members is only accessible to the list administrator, so
+   there is no need for concern about automatic e-mail address gatherers.
+   
+   Questions about the mailing list and concerns for the attention of a
+   person should be sent to snprintf-announce-admin@ijs.si
+   
+   There is no general discussion list about portable snprintf at the
+   moment. Please send comments and suggestion to the author.
+   
+Revision history
+
+   Version 1.3 fixes a runaway loop problem from 1.2. Please upgrade.
+   
+   1999-06-30 V1.3 Mark Martinec <mark.martinec@ijs.si>
+          
+          + fixed runaway loop (eventually crashing when str_l wraps
+            beyond 2^31) while copying format string without conversion
+            specifiers to a buffer that is too short (thanks to Edwin
+            Young <edwiny@autonomy.com> for spotting the problem);
+          + added macros PORTABLE_SNPRINTF_VERSION_(MAJOR|MINOR) to
+            snprintf.h
+            
+   2000-02-14 V2.0 (never released) Mark Martinec <mark.martinec@ijs.si>
+          
+          + relaxed license terms: The Artistic License now applies. You
+            may still apply the GNU GENERAL PUBLIC LICENSE as was
+            distributed with previous versions, if you prefer;
+          + changed REVISION HISTORY dates to use ISO 8601 date format;
+          + added vsnprintf (patch also independently proposed by Caolán
+            McNamara 2000-05-04, and Keith M Willenson 2000-06-01)
+            
+   2000-06-27 V2.1 Mark Martinec <mark.martinec@ijs.si>
+          
+          + removed POSIX check for str_m < 1; value 0 for str_m is
+            allowed by ISO C99 (and GNU C library 2.1) (pointed out on
+            2000-05-04 by Caolán McNamara, caolan@ csn dot ul dot ie).
+            Besides relaxed license this change in standards adherence is
+            the main reason to bump up the major version number;
+          + added nonstandard routines asnprintf, vasnprintf, asprintf,
+            vasprintf that dynamically allocate storage for the resulting
+            string; these routines are not compiled by default, see
+            comments where NEED_V?ASN?PRINTF macros are defined;
+          + autoconf contributed by Caolán McNamara
+            
+   2000-10-06 V2.2 Mark Martinec <mark.martinec@ijs.si>
+          
+          + BUG FIX: the %c conversion used a temporary variable that was
+            no longer in scope when referenced, possibly causing
+            incorrect resulting character;
+          + BUG FIX: make precision and minimal field width unsigned to
+            handle huge values (2^31 <= n < 2^32) correctly; also be more
+            careful in the use of signed/unsigned/size_t internal
+            variables -- probably more careful than many vendor
+            implementations, but there may still be a case where huge
+            values of str_m, precision or minimal field could cause
+            incorrect behaviour;
+          + use separate variables for signed/unsigned arguments, and for
+            short/int, long, and long long argument lengths to avoid
+            possible incompatibilities on certain computer architectures.
+            Also use separate variable arg_sign to hold sign of a numeric
+            argument, to make code more transparent;
+          + some fiddling with zero padding and "0x" to make it Linux
+            compatible;
+          + systematically use macros fast_memcpy and fast_memset instead
+            of case-by-case hand optimization; determine some breakeven
+            string lengths for different architectures;
+          + terminology change: format -> conversion specifier, C9x ->
+            ISO/IEC 9899:1999 ("ISO C99"), alternative form -> alternate
+            form, data type modifier -> length modifier;
+          + several comments rephrased and new ones added;
+          + make compiler not complain about 'credits' defined but not
+            used;
+            
+Other implementations of snprintf
+
+   I am aware of some other (more or less) portable implementations of
+   snprintf. I do not claim they are free software - please refer to
+   their respective copyright and licensing terms. If you know of other
+   versions please let me know.
+     * a very thorough implementation (src/util_snprintf.c) by the Apache
+       Group distributed with the Apache web server -
+       http://www.apache.org/ . Does its own floating point conversions
+       using routines ecvt(3), fcvt(3) and gcvt(3) from the standard C
+       library or from the GNU libc.
+       This is from the code:
+       
+     This software [...] was originally based on public domain software
+     written at the National Center for Supercomputing Applications,
+     University of Illinois, Urbana-Champaign.
+     [...] This code is based on, and used with the permission of, the
+     SIO stdio-replacement strx_* functions by Panos Tsirigotis
+     <panos@alumni.cs.colorado.edu> for xinetd.
+     * QCI Utilities use a modified version of snprintf from the Apache
+       group.
+     * implementations as distributed with OpenBSD, FreeBSD, and NetBSD
+       are all wrappers to vfprintf.c, which is derived from software
+       contributed to Berkeley by Chris Torek.
+     * implementation from Prof. Patrick Powell <papowell@sdsu.edu>,
+       Dept. Electrical and Computer Engineering, San Diego State
+       University, San Diego, CA 92182-1309, published in Bugtraq
+       archives for 3rd quarter (Jul-Aug) 1995. No floating point
+       conversions.
+     * Brandon Long's <blong@fiction.net> modified version of Prof.
+       Patrick Powell's snprintf with contributions from others. With
+       minimal floating point support.
+     * implementation (src/snprintf.c) as distributed with sendmail -
+       http://www.sendmail.org/ is a cleaned up Prof. Patrick Powell's
+       version to compile properly and to support .precision and %lx.
+     * implementation from Caolán McNamara available at
+       http://www.csn.ul.ie/~caolan/publink/snprintf-1.1.tar.gz, handles
+       floating point.
+     * implementation used by newlog (a replacement for syslog(3)) made
+       available by the SOS Corporation. Enabling floating point support
+       is a compile-time option.
+     * implementation by Michael Richardson <mcr@metis.milkyway.com> is
+       available at http://sandelman.ottawa.on.ca/SSW/snp/snp.html. It is
+       based on BSD44-lite's vfprintf() call, modified to function on
+       SunOS. Needs internal routines from the 4.4 strtod (included),
+       requires GCC to compile the long long (aka quad_t) portions.
+     * implementation from Tomi Salo <ttsalo@ssh.fi> distributed with SSH
+       2.0 Unix Server. Not in public domain. Floating point conversions
+       done by system's sprintf.
+     * and for completeness: my portable version described in this very
+       document available at http://www.ijs.si/software/snprintf/ .
+       
+   In retrospect, it appears that a lot of effort was wasted by many
+   people for not being aware of what others are doing. Sigh.
+   
+   Also of interest: The Approved Base Working Group Resolution for XSH5,
+   Ref: bwg98-006, Topic: snprintf.
+     _________________________________________________________________
+   
+   mm
+   Last updated: 2000-10-18
+   
+   Valid HTML 4.0! 

mercurial