FreeBSD Bugzilla – Attachment 30404 Details for
Bug 51209
[libc] [patch] new feature: add a64l()/l64a/l64a_r functions (obtained from NetBSD)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
file.diff
file.diff (text/plain), 9.85 KB, created by
osa
on 2003-04-21 12:00:18 UTC
(
hide
)
Description:
file.diff
Filename:
MIME Type:
Creator:
osa
Created:
2003-04-21 12:00:18 UTC
Size:
9.85 KB
patch
obsolete
>Index: src/lib/libc/stdlib/Makefile.inc >=================================================================== >RCS file: /home/ncvs/src/lib/libc/stdlib/Makefile.inc,v >retrieving revision 1.45 >diff -u -r1.45 Makefile.inc >--- src/lib/libc/stdlib/Makefile.inc 5 Apr 2003 07:33:46 -0000 1.45 >+++ src/lib/libc/stdlib/Makefile.inc 21 Apr 2003 09:52:58 -0000 >@@ -4,26 +4,28 @@ > # machine-independent stdlib sources > .PATH: ${.CURDIR}/${MACHINE_ARCH}/stdlib ${.CURDIR}/stdlib > >-MISRCS+=_Exit.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \ >+MISRCS+=_Exit.c a64l.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \ > bsearch.c calloc.c div.c exit.c getenv.c getopt.c getopt_long.c \ > getsubopt.c grantpt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c \ >- insque.c labs.c ldiv.c llabs.c lldiv.c lsearch.c malloc.c merge.c \ >- putenv.c qsort.c qsort_r.c radixsort.c rand.c random.c reallocf.c \ >- realpath.c remque.c setenv.c strfmon.c strhash.c strtoimax.c \ >- strtol.c strtoll.c strtoq.c strtoul.c strtoull.c strtoumax.c strtouq.c \ >- system.c tdelete.c tfind.c tsearch.c twalk.c >+ insque.c l64a.c labs.c ldiv.c llabs.c lldiv.c lsearch.c malloc.c \ >+ merge.c putenv.c qsort.c qsort_r.c radixsort.c rand.c random.c \ >+ reallocf.c realpath.c remque.c setenv.c strfmon.c strhash.c \ >+ strtoimax.c strtol.c strtoll.c strtoq.c strtoul.c strtoull.c \ >+ strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c > > # machine-dependent stdlib sources > .if exists(${.CURDIR}/${MACHINE_ARCH}/stdlib/Makefile.inc) > .include "${.CURDIR}/${MACHINE_ARCH}/stdlib/Makefile.inc" > .endif > >-MAN+= abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 bsearch.3 \ >- div.3 exit.3 getenv.3 getopt.3 getopt_long.3 getsubopt.3 grantpt.3 \ >- hcreate.3 imaxabs.3 imaxdiv.3 insque.3 labs.3 ldiv.3 llabs.3 lldiv.3 \ >- lsearch.3 malloc.3 memory.3 qsort.3 radixsort.3 rand.3 random.3 \ >- realpath.3 strfmon.3 strtod.3 strtol.3 strtoul.3 system.3 tsearch.3 >+MAN+= a64l.3 abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 \ >+ bsearch.3 div.3 exit.3 getenv.3 getopt.3 getopt_long.3 \ >+ getsubopt.3 grantpt.3 hcreate.3 imaxabs.3 imaxdiv.3 insque.3 \ >+ labs.3 ldiv.3 llabs.3 lldiv.3 lsearch.3 malloc.3 memory.3 qsort.3 \ >+ radixsort.3 rand.3 random.3 realpath.3 strfmon.3 strtod.3 strtol.3 \ >+ strtoul.3 system.3 tsearch.3 > >+MLINKS+=a64l.3 l64a.3 l64a_r.3 > MLINKS+=atol.3 atoll.3 > MLINKS+=exit.3 _Exit.3 > MLINKS+=getenv.3 putenv.3 getenv.3 setenv.3 getenv.3 unsetenv.3 >--- /dev/null Mon Apr 21 03:02:32 2003 >+++ src/lib/libc/stdlib/a64l.3 Wed Apr 16 17:34:45 2003 >@@ -0,0 +1,140 @@ >+.\" $NetBSD: a64l.3,v 1.8 2003/04/16 13:34:45 wiz Exp $ >+.\" >+.\" Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. >+.\" All rights reserved. >+.\" >+.\" This code is derived from software contributed to The NetBSD Foundation >+.\" by Klaus Klein. >+.\" >+.\" Redistribution and use in source and binary forms, with or without >+.\" modification, are permitted provided that the following conditions >+.\" are met: >+.\" 1. Redistributions of source code must retain the above copyright >+.\" notice, this list of conditions and the following disclaimer. >+.\" 2. Redistributions in binary form must reproduce the above copyright >+.\" notice, this list of conditions and the following disclaimer in the >+.\" documentation and/or other materials provided with the distribution. >+.\" 3. All advertising materials mentioning features or use of this software >+.\" must display the following acknowledgement: >+.\" This product includes software developed by the NetBSD >+.\" Foundation, Inc. and its contributors. >+.\" 4. Neither the name of The NetBSD Foundation nor the names of its >+.\" contributors may be used to endorse or promote products derived >+.\" from this software without specific prior written permission. >+.\" >+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS >+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED >+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS >+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE >+.\" POSSIBILITY OF SUCH DAMAGE. >+.\" >+.\" $FreeBSD$ >+.\" >+.Dd April 21, 2003 >+.Dt A64L 3 >+.Os >+.Sh NAME >+.Nm a64l , >+.Nm l64a , >+.Nm l64a_r >+.Nd "convert between a long integer and a base-64 ASCII string" >+.Sh LIBRARY >+.Lb libc >+.Sh SYNOPSIS >+.In stdlib.h >+.Ft long >+.Fn a64l "const char *s" >+.Ft char * >+.Fn l64a "long int l" >+.Ft int >+.Fn l64a_r "long int l" "char *buffer" "int buflen" >+.Sh DESCRIPTION >+The >+.Fn a64l >+and >+.Fn l64a >+functions convert between a long integer and its base-64 ASCII string >+representation. >+.Pp >+The characters used to represent ``digits'' are >+`.' for 0, >+`/' for 1, >+`0' - `9' for 2 - 11, >+`A' - `Z' for 12 - 37, and >+`a' - `z' for 38 - 63. >+.Pp >+.Fn a64l >+takes a pointer to a NUL-terminated base-64 ASCII string >+representation, >+.Fa s , >+and returns the corresponding long integer value. >+.Pp >+.Fn l64a >+takes a long integer value, >+.Fa l , >+and returns a pointer to the corresponding NUL-terminated base-64 >+ASCII string representation. >+.Pp >+.Fn l64a_r >+performs a conversion identical to that of >+.Fn l64a >+and stores the resulting representation in the memory area pointed to by >+.Fa buffer , >+consuming at most >+.Fa buflen >+characters including the terminating NUL character. >+.Sh RETURN VALUES >+On successful completion, >+.Fn a64l >+returns the long integer value corresponding to the input string. >+If the string pointed to by >+.Fa s >+is an empty string, >+.Fn a64l >+returns a value of 0L. >+.Pp >+.Fn l64a >+returns a pointer to the base-64 ASCII string representation corresponding to >+the input value. >+If >+.Fa l >+is 0L, >+.Fn l64a >+returns a pointer to an empty string. >+.Pp >+On successful completion, >+.Fn l64a_r >+returns 0; if >+.Fa buffer >+is of insufficient length, -1 is returned. >+.Sh SEE ALSO >+.Xr strtol 3 >+.Sh STANDARDS >+The >+.Fn a64l >+and >+.Fn l64a >+functions conform to >+.St -xpg4.2 . >+The >+.Fn l64a_r >+function conforms to >+.St -svid4 , >+Multithreading Extension. >+.Sh BUGS >+The >+.Fn l64a >+function is not reentrant. >+The value returned by it points into a static buffer area; >+subsequent calls to >+.Fn la64a >+may overwrite this buffer. >+In multi-threaded applications, >+.Fn l64a_r >+should be used instead. >--- /dev/null Mon Apr 21 03:02:32 2003 >+++ src/lib/libc/stdlib/a64l.c Mon Apr 21 12:59:19 2003 >@@ -0,0 +1,48 @@ >+/* >+ * Written by J.T. Conklin <jtc@netbsd.org>. >+ * Public domain. >+ */ >+ >+#include <sys/cdefs.h> >+#if defined(LIBC_SCCS) && !defined(lint) >+__RCSID("$NetBSD: a64l.c,v 1.8 2000/01/22 22:19:19 mycroft Exp $"); >+#endif /* LIBC_SCCS and not lint */ >+__FBSDID("$FreeBSD$"); >+ >+#include "namespace.h" >+ >+#include <assert.h> >+#include <limits.h> >+#include <ctype.h> >+#include <stdlib.h> >+ >+#ifndef _DIAGASSERT >+#define _DIAGASSERT(X) >+#endif >+ >+long >+a64l(const char *s) >+{ >+ long value, digit, shift; >+ int i; >+ >+ _DIAGASSERT(s != NULL); >+ >+ value = 0; >+ shift = 0; >+ for (i = 0; *s && i < 6; i++, s++) { >+ if (*s <= '/') >+ digit = *s - '.'; >+ else if (*s <= '9') >+ digit = *s - '0' + 2; >+ else if (*s <= 'Z') >+ digit = *s - 'A' + 12; >+ else >+ digit = *s - 'a' + 38; >+ >+ value |= digit << shift; >+ shift += 6; >+ } >+ >+ return (value); >+} >--- /dev/null Mon Apr 21 03:02:32 2003 >+++ src/lib/libc/stdlib/l64a.c Mon Apr 21 13:43:51 2003 >@@ -0,0 +1,61 @@ >+/* >+ * Written by J.T. Conklin <jtc@netbsd.org>. >+ * Public domain. >+ */ >+ >+#include <sys/cdefs.h> >+#if defined(LIBC_SCCS) && !defined(lint) >+__RCSID("$NetBSD: l64a.c,v 1.12 2000/01/22 22:19:19 mycroft Exp $"); >+#endif /* LIBC_SCCS and not lint */ >+__FBSDID("$FreeBSD$"); >+ >+#include "namespace.h" >+ >+#include <assert.h> >+#include <errno.h> >+#include <stdlib.h> >+ >+#ifndef _DIAGASSERT >+#define _DIAGASSERT(X) >+#endif >+ >+char * >+l64a (long value) >+{ >+ static char buf[8]; >+ >+ (void)l64a_r(value, buf, sizeof (buf)); >+ return buf; >+} >+ >+int >+l64a_r (long value, char *buffer, int buflen) >+{ >+ char *s = buffer; >+ int digit; >+ unsigned long v = value; >+ >+ _DIAGASSERT(buffer != NULL); >+ >+ if (value == 0UL) >+ goto out; >+ >+ for (; v != 0 && buflen > 1; s++, buflen--) { >+ digit = (int)(v & 0x3f); >+ >+ if (digit < 2) >+ *s = digit + '.'; >+ else if (digit < 12) >+ *s = digit + '0' - 2; >+ else if (digit < 38) >+ *s = digit + 'A' - 12; >+ else >+ *s = digit + 'a' - 38; >+ v >>= 6; >+ } >+ >+out: >+ *s = '\0'; >+ >+ return (v == 0UL ? 0 : -1); >+} >Index: src/include/stdlib.h >=================================================================== >RCS file: /home/ncvs/src/include/stdlib.h,v >retrieving revision 1.48 >diff -u -r1.48 stdlib.h >--- src/include/stdlib.h 12 Mar 2003 20:29:58 -0000 1.48 >+++ src/include/stdlib.h 21 Apr 2003 10:11:03 -0000 >@@ -174,7 +174,7 @@ > */ > #if __XSI_VISIBLE > /* XXX XSI requires pollution from <sys/wait.h> here. We'd rather not. */ >-/* long a64l(const char *); */ >+long a64l(const char *); > double drand48(void); > /* char *ecvt(double, int, int * __restrict, int * __restrict); */ > double erand48(unsigned short[3]); >@@ -187,7 +187,7 @@ > int grantpt(int); > char *initstate(unsigned long /* XSI requires u_int */, char *, long); > long jrand48(unsigned short[3]); >-/* char *l64a(long); */ >+char *l64a(long); > void lcong48(unsigned short[7]); > long lrand48(void); > #ifndef _MKSTEMP_DECLARED >@@ -247,6 +247,7 @@ > getprogname(void); > > int heapsort(void *, size_t, size_t, int (*)(const void *, const void *)); >+int l64a_r (long, char *, int); > int mergesort(void *, size_t, size_t, int (*)(const void *, const void *)); > void qsort_r(void *, size_t, size_t, void *, > int (*)(void *, const void *, const void *));
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 51209
: 30404