snprintf_2.2/README.html

Mon, 17 Jan 2005 22:02:09 +0100

author
tuomov
date
Mon, 17 Jan 2005 22:02:09 +0100
changeset 85
9f94b2e96e3b
parent 35
5a71d53d0228
permissions
-rw-r--r--

trunk: changeset 1934
Fixed everything that requires locale stuff to check CF_NO_LOCALE.

35
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
2 <html>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
3 <head>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
4 <link rev="made" href="mailto:mark.martinec@ijs.si">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
5 <title>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
6 snprintf.c - a portable implementation of snprintf
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
7 (including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
8 </title>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
9 <meta http-equiv="Content-Language" content="en">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
10 <meta name="author" content="Mark Martinec">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
11 <meta name="copyright" content="Copyright 2000 Mark Martinec, All Rights Reserved">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
12 <meta name="date" content="2000-10-18">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
13 <meta name="keywords" lang="en"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
14 content="snprintf,portable,vsnprintf,asnprintf,vasnprintf,asprintf,vasprintf
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
15 ISO/IEC 9899:1999,ISO C99,ISO C9x,POSIX">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
16 <style type="text/css">
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
17 <!--
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
18 body { background: white; color: black }
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
19 -->
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
20 </style>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
21 </head>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
22 <body>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
23 <h1><b>snprintf.c</b>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
24 <br> - a portable implementation of snprintf,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
25 <br><font size="+1">including
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
26 vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf</font>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
27 </h1>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
28
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
29 <p><b>snprintf</b> is a routine to convert numeric and string arguments
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
30 to formatted strings. It is similar to sprintf(3) provided in a
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
31 system's C library, yet it requires an additional argument - the buffer
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
32 size - and it guarantees never to store anything beyond the given buffer,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
33 regardless of the format or arguments to be formatted. Some newer
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
34 operating systems do provide <b>snprintf</b> in their C library,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
35 but many do not or do provide an inadequate (slow or idiosyncratic)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
36 version, which calls for a portable implementation of this routine.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
37
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
38 <h2>Author</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
39
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
40 <p><a href="http://www.ijs.si/people/mark/">Mark Martinec</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
41 &lt;<a href="mailto:mark.martinec@ijs.si">mark.martinec@ijs.si</a>&gt;,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
42 April 1999, June 2000
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
43 <br>Copyright &copy; 1999, Mark Martinec
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
44
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
45 <h2>Terms and conditions ...</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
46
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
47 <p>This program is free software; you can redistribute it
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
48 and/or modify it under the terms of the
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
49 <i><a href="./LICENSE.txt">Frontier Artistic License</a></i>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
50 which comes with this Kit.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
51
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
52 <h2>Features</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
53
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
54 <ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
55 <li>careful adherence to specs regarding flags, field width and precision;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
56 <li>good performance for large string handling (large format, large argument
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
57 or large paddings). Performance is similar to system's <b>sprintf</b>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
58 and in several cases significantly better (make sure you compile with
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
59 optimizations turned on, tell the compiler the code is strict ANSI
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
60 if necessary to give it more freedom for optimizations);
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
61 <li>return value semantics per ISO/IEC 9899:1999 ("ISO C99");
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
62 <li>written in standard ISO/ANSI C - requires an ANSI C compiler.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
63 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
64
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
65 <h2>Supported conversion specifiers and data types</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
66
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
67 <p>This <b>snprintf</b> only supports the following conversion specifiers:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
68 s, c, d, o, u, x, X, p (and synonyms: i, D, U, O - see below)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
69 with flags: '-', '+', '&nbsp;', '0' and '#'.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
70 An asterisk is supported for field width as well as precision.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
71
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
72 <p>Length modifiers 'h' (<i>short int</i>), 'l' (<i>long int</i>),
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
73 and 'll' (<i>long long int</i>) are supported.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
74
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
75 <p>NOTE:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
76 <blockquote>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
77 If macro SNPRINTF_LONGLONG_SUPPORT is not defined (default)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
78 the length modifier 'll' is recognized but treated the same as 'l',
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
79 which may cause argument value truncation!
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
80 Defining SNPRINTF_LONGLONG_SUPPORT requires that your system's
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
81 <b>sprintf</b> also handles length modifier 'll'.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
82 <i>long long int</i> is a language extension which may not be portable.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
83 </blockquote>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
84
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
85 <p>Conversion of numeric data (conversion specifiers d, o, u, x, X, p)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
86 with length modifiers (none or h, l, ll) is left to the system
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
87 routine <b>sprintf</b>, but all handling of flags, field width and precision
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
88 as well as c and s conversions is done very carefully by this portable routine.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
89 If a string precision (truncation) is specified (e.g. %.8s) it is
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
90 guaranteed the string beyond the specified precision will not be referenced.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
91
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
92 <p>Length modifiers h, l and ll are ignored for c and s conversions
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
93 (data types <i>wint_t</i> and <i>wchar_t</i> are not supported).
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
94
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
95 <p>The following common synonyms for conversion characters are supported:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
96 <ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
97 <li>i is a synonym for d
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
98 <li>D is a synonym for ld, explicit length modifiers are ignored
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
99 <li>U is a synonym for lu, explicit length modifiers are ignored
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
100 <li>O is a synonym for lo, explicit length modifiers are ignored
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
101 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
102 The D, O and U conversion characters are nonstandard, they are supported
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
103 for backward compatibility only, and should not be used for new code.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
104
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
105 <p>The following is specifically <b>not</b> supported:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
106 <ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
107 <li>flag ' (thousands' grouping character) is recognized but ignored
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
108 <li>numeric conversion specifiers: f, e, E, g, G and synonym F,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
109 as well as the new a and A conversion specifiers
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
110 <li>length modifier 'L' (<i>long double</i>)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
111 and 'q' (<i>quad</i> - use 'll' instead)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
112 <li>wide character/string conversions: lc, ls, and nonstandard
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
113 synonyms C and S
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
114 <li>writeback of converted string length: conversion character n
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
115 <li>the n$ specification for direct reference to n-th argument
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
116 <li>locales
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
117 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
118
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
119 <p>It is permitted for str_m to be zero, and it is permitted to specify NULL
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
120 pointer for resulting string argument if str_m is zero (as per ISO C99).
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
121
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
122 <p>The return value is the number of characters which would be generated
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
123 for the given input, <i>excluding</i> the trailing null. If this value
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
124 is greater or equal to str_m, not all characters from the result
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
125 have been stored in str, output bytes beyond the (str_m-1) -th character
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
126 are discarded. If str_m is greater than zero it is guaranteed
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
127 the resulting string will be null-terminated.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
128
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
129 <p>NOTE that this matches the ISO C99, OpenBSD, and GNU C library 2.1,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
130 but is different from some older and vendor implementations,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
131 and is also different from XPG, XSH5, SUSv2 specifications.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
132 For historical discussion on changes in the semantics and standards
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
133 of snprintf see printf(3) man page in the Linux programmers manual.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
134
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
135 <p>Routines asprintf and vasprintf return a pointer (in the ptr argument)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
136 to a buffer sufficiently large to hold the resulting string. This pointer
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
137 should be passed to free(3) to release the allocated storage when it is
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
138 no longer needed. If sufficient space cannot be allocated, these functions
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
139 will return -1 and set ptr to be a NULL pointer. These two routines are a
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
140 GNU C library extensions (glibc).
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
141
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
142 <p>Routines asnprintf and vasnprintf are similar to asprintf and vasprintf,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
143 yet, like snprintf and vsnprintf counterparts, will write at most str_m-1
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
144 characters into the allocated output string, the last character in the
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
145 allocated buffer then gets the terminating null. If the formatted string
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
146 length (the return value) is greater than or equal to the str_m argument,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
147 the resulting string was truncated and some of the formatted characters
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
148 were discarded. These routines present a handy way to limit the amount
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
149 of allocated memory to some sane value.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
150
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
151 <h2>Availability</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
152
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
153 <p><a href="http://www.ijs.si/software/snprintf/"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
154 >http://www.ijs.si/software/snprintf/</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
155
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
156 <ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
157 <li>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
158 <a href="./snprintf_1.3.tar.gz">snprintf_1.3.tar.gz</a> (1999-06-30),
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
159 md5 sum: <a href="./snprintf_1.3.tar.gz.md5">snprintf_1.3.tar.gz.md5</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
160
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
161 <li>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
162 <a href="./snprintf_2.1.tar.gz">snprintf_2.1.tar.gz</a> (2000-07-14),
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
163 md5 sum: <a href="./snprintf_2.1.tar.gz.md5">snprintf_2.1.tar.gz.md5</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
164
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
165 <li>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
166 <a href="./snprintf_2.2.tar.gz">snprintf_2.2.tar.gz</a> (2000-10-18),
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
167 md5 sum: <a href="./snprintf_2.2.tar.gz.md5">snprintf_2.2.tar.gz.md5</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
168 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
169
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
170
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
171 <h2>Mailing list</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
172
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
173 <p>There is a very low-traffic mailing list <i>snprintf-announce@ijs.si</i>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
174 where announcements about new versions will be posted
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
175 as well as warnings about threatening bugs if discovered.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
176 The posting is restricted to snprintf developer(s).
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
177
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
178 <p>To subscribe to (or unsubscribe from) the mailing list
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
179 please visit the list server's web page
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
180 <a href="http://mailman.ijs.si/listinfo/snprintf-announce"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
181 >http://mailman.ijs.si/listinfo/snprintf-announce</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
182
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
183 <p>You can also subscribe to the list by mailing
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
184 the command SUBSCRIBE either in the subject or in the message body
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
185 to the address <a href="mailto:snprintf-announce-request@ijs.si"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
186 >snprintf-announce-request@ijs.si</a> . You will be asked for
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
187 confirmation before subscription will be effective.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
188
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
189 <p>The list of members is only accessible to the list administrator,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
190 so there is no need for concern about automatic e-mail address gatherers.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
191
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
192 <p>Questions about the mailing list and concerns for the attention
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
193 of a person should be sent to <a href="mailto:snprintf-announce-admin@ijs.si"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
194 >snprintf-announce-admin@ijs.si</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
195
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
196 <p>There is no <i>general</i> discussion list about portable snprintf
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
197 at the moment. Please send comments and suggestion to the author.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
198
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
199
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
200 <h2>Revision history</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
201
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
202 <p><b>Version 1.3 fixes a runaway loop problem from 1.2. Please upgrade.</b>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
203
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
204 <dl>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
205 <dt>1999-06-30 V1.3 Mark Martinec &lt;mark.martinec@ijs.si&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
206 <dd><ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
207 <li>fixed runaway loop (eventually crashing when str_l wraps
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
208 beyond 2^31) while copying format string without
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
209 conversion specifiers to a buffer that is too short
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
210 (thanks to Edwin Young &lt;edwiny@autonomy.com&gt; for spotting the problem);
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
211 <li>added macros PORTABLE_SNPRINTF_VERSION_(MAJOR|MINOR) to snprintf.h
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
212 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
213
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
214 <dt>2000-02-14 V2.0 (never released) Mark Martinec &lt;mark.martinec@ijs.si&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
215 <dd><ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
216 <li>relaxed license terms:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
217 <a href="./LICENSE.txt">The Artistic License</a> now applies.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
218 You may still apply the GNU GENERAL PUBLIC LICENSE
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
219 as was distributed with previous versions, if you prefer;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
220 <li>changed REVISION HISTORY dates to use
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
221 <a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">ISO 8601
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
222 date format</a>;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
223 <li>added vsnprintf (patch also independently proposed by
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
224 Caol&aacute;n McNamara 2000-05-04, and Keith M Willenson 2000-06-01)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
225 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
226
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
227 <dt>2000-06-27 V2.1 Mark Martinec &lt;mark.martinec@ijs.si&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
228 <dd><ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
229 <li>removed POSIX check for str_m &lt; 1; value 0 for str_m is
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
230 allowed by ISO C99 (and GNU C library 2.1) (pointed out
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
231 on 2000-05-04 by Caol&aacute;n McNamara, caolan@ csn dot ul dot ie).
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
232 Besides relaxed license this change in standards adherence
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
233 is the main reason to bump up the major version number;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
234 <li>added nonstandard routines asnprintf, vasnprintf, asprintf,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
235 vasprintf that dynamically allocate storage for the
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
236 resulting string; these routines are not compiled by default,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
237 see comments where NEED_V?ASN?PRINTF macros are defined;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
238 <li>autoconf contributed by Caol&aacute;n McNamara
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
239 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
240
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
241 <dt>2000-10-06 V2.2 Mark Martinec &lt;mark.martinec@ijs.si&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
242 <dd><ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
243 <li><b>BUG FIX</b>: the %c conversion used a temporary variable
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
244 that was no longer in scope when referenced,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
245 possibly causing incorrect resulting character;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
246 <li>BUG FIX: make precision and minimal field width unsigned
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
247 to handle huge values (2^31 &lt;= n &lt; 2^32) correctly;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
248 also be more careful in the use of signed/unsigned/size_t
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
249 internal variables -- probably more careful than many
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
250 vendor implementations, but there may still be a case
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
251 where huge values of str_m, precision or minimal field
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
252 could cause incorrect behaviour;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
253 <li>use separate variables for signed/unsigned arguments,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
254 and for short/int, long, and long long argument lengths
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
255 to avoid possible incompatibilities on certain
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
256 computer architectures. Also use separate variable
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
257 arg_sign to hold sign of a numeric argument,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
258 to make code more transparent;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
259 <li>some fiddling with zero padding and "0x" to make it
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
260 Linux compatible;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
261 <li>systematically use macros fast_memcpy and fast_memset
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
262 instead of case-by-case hand optimization; determine some
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
263 breakeven string lengths for different architectures;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
264 <li>terminology change: <i>format</i> -&gt; <i>conversion specifier</i>,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
265 <i>C9x</i> -&gt; <i>ISO/IEC 9899:1999 ("ISO C99")</i>,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
266 <i>alternative form</i> -&gt; <i>alternate form</i>,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
267 <i>data type modifier</i> -&gt; <i>length modifier</i>;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
268 <li>several comments rephrased and new ones added;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
269 <li>make compiler not complain about 'credits' defined but
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
270 not used;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
271 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
272 </dl>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
273
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
274 <h2>Other implementations of snprintf</h2>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
275
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
276 <p>I am aware of some other (more or less) portable implementations
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
277 of <b>snprintf</b>. I do not claim they are free software - please refer
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
278 to their respective copyright and licensing terms.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
279 If you know of other versions please let
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
280 <a href="http://www.ijs.si/people/mark/">me</a> know.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
281
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
282 <ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
283 <li>a very thorough implementation (src/util_snprintf.c)
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
284 by the Apache Group distributed with the
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
285 <a href="http://www.apache.org/">Apache web server
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
286 - http://www.apache.org/</a> .
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
287 Does its own floating point conversions using routines
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
288 ecvt(3), fcvt(3) and gcvt(3) from the standard C library
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
289 or from the GNU libc.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
290
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
291 <br>This is from the code:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
292 <blockquote>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
293 This software [...] was originally based
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
294 on public domain software written at the
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
295 <a href="http://www.ncsa.uiuc.edu/ncsa.html">National Center
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
296 for Supercomputing Applications</a>, University of Illinois,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
297 Urbana-Champaign.<br>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
298 [...] This code is based on, and used with the permission of,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
299 the SIO stdio-replacement strx_* functions by Panos Tsirigotis
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
300 &lt;<a href="mailto:panos@alumni.cs.colorado.edu">panos@alumni.cs.colorado.edu</a>&gt; for xinetd.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
301 </blockquote>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
302
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
303 <li><a href="http://www.qlue.com/downloads/c_utils_README.html">QCI
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
304 Utilities</a> use a modified version of snprintf from the Apache group.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
305
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
306 <li>implementations as distributed with
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
307 <a href="http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/">OpenBSD</a>,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
308 <a href="http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/">FreeBSD</a>, and
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
309 <a href="http://cvsweb.netbsd.org/cgi-bin/cvsweb.cgi/basesrc/lib/libc/stdio/">NetBSD</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
310 are all wrappers to vfprintf.c, which is derived from software
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
311 contributed to Berkeley by Chris Torek.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
312
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
313 <li>implementation from Prof. Patrick Powell
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
314 &lt;<a href="mailto:papowell@sdsu.edu">papowell@sdsu.edu</a>&gt;,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
315 Dept. Electrical and Computer Engineering, San Diego State University,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
316 San Diego, CA 92182-1309, published in
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
317 <a href="http://www.geek-girl.com/bugtraq/1995_3/0217.html">Bugtraq
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
318 archives for 3rd quarter (Jul-Aug) 1995</a>.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
319 No floating point conversions.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
320
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
321 <li>Brandon Long's
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
322 &lt;<a href="mailto:blong@fiction.net">blong@fiction.net</a>&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
323 <a href="http://www.fiction.net/~blong/programs/">modified version</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
324 of Prof. Patrick Powell's snprintf with contributions from others.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
325 With minimal floating point support.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
326
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
327 <li>implementation (src/snprintf.c) as distributed with
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
328 <a href="http://www.sendmail.org/">sendmail - http://www.sendmail.org/</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
329 is a cleaned up Prof. Patrick Powell's version
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
330 to compile properly and to support .precision and %lx.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
331
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
332 <li>implementation from <a href="http://www.csn.ul.ie/~caolan/"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
333 >Caol&aacute;n McNamara</a> available at
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
334 <a href="http://www.csn.ul.ie/~caolan/publink/snprintf-1.1.tar.gz"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
335 >http://www.csn.ul.ie/~caolan/publink/snprintf-1.1.tar.gz</a>,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
336 handles floating point.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
337
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
338 <li>implementation used by
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
339 <a href="ftp://ftp.soscorp.com/pub/sos/lib">newlog</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
340 (a replacement for syslog(3)) made available by
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
341 the <a href="http://www.soscorp.com">SOS Corporation</a>.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
342 Enabling floating point support is a compile-time option.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
343
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
344 <li>implementation by Michael Richardson
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
345 &lt;<a href="mailto:mcr@metis.milkyway.com">mcr@metis.milkyway.com</a>&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
346 is available at
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
347 <a href="http://sandelman.ottawa.on.ca/SSW/snp/snp.html"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
348 >http://sandelman.ottawa.on.ca/SSW/snp/snp.html</a>.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
349 It is based on BSD44-lite's vfprintf() call, modified to function
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
350 on SunOS. Needs internal routines from the 4.4 strtod (included),
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
351 requires GCC to compile the long long (aka quad_t) portions.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
352
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
353 <li>implementation from Tomi Salo
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
354 &lt;<a href="mailto:ttsalo@ssh.fi">ttsalo@ssh.fi</a>&gt;
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
355 distributed with
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
356 <a href="http://www.Europe.DataFellows.com/f-secure/ssh/">SSH 2.0
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
357 Unix Server</a>. Not in public domain.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
358 Floating point conversions done by system's sprintf.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
359
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
360 <li>and for completeness: <a href="http://www.ijs.si/people/mark/">my</a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
361 portable version described in this very document available at
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
362 <a href="http://www.ijs.si/software/snprintf/"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
363 >http://www.ijs.si/software/snprintf/</a> .
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
364 </ul>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
365
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
366 In retrospect, it appears that a lot of effort was wasted by many
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
367 people for not being aware of what others are doing. Sigh.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
368
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
369 <p>Also of interest:
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
370 <a href="http://www.opengroup.org/platform/resolutions/bwg98-006.html"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
371 >The Approved Base Working Group Resolution for XSH5,
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
372 Ref: bwg98-006, Topic: snprintf</a>.
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
373
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
374 <p><hr>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
375 <i><a href="http://www.ijs.si/people/mark/">mm</a></i>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
376 <br>Last updated: 2000-10-18
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
377
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
378 <p><a href="http://validator.w3.org/check/referer"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
379 ><img src="/images/vh40.gif" alt="Valid HTML 4.0!"
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
380 border="0" width="88" height="31"></a>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
381 </body>
5a71d53d0228 trunk: changeset 38
tuomov
parents:
diff changeset
382 </html>

mercurial