mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 12:53:13 +00:00
Use libc implementations of wcslcpy and wcslcat if they exist. Move internal implementations to fallback.c.
darcs-hash:20060419095628-ac50b-0e94e4205306bb99bb9dea72eec43b442520bf1b.gz
This commit is contained in:
parent
6996c7718e
commit
d0956f1e43
5 changed files with 136 additions and 127 deletions
102
common.c
102
common.c
|
@ -400,108 +400,6 @@ wchar_t **strv2wcsv( const char **in )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t
|
|
||||||
wcslcat(wchar_t *dst, const wchar_t *src, size_t siz)
|
|
||||||
{
|
|
||||||
|
|
||||||
register wchar_t *d = dst;
|
|
||||||
register const wchar_t *s = src;
|
|
||||||
register size_t n = siz;
|
|
||||||
size_t dlen;
|
|
||||||
|
|
||||||
/* Find the end of dst and adjust bytes left but don't go past end */
|
|
||||||
while (n-- != 0 && *d != '\0')
|
|
||||||
d++;
|
|
||||||
|
|
||||||
dlen = d - dst;
|
|
||||||
n = siz - dlen;
|
|
||||||
|
|
||||||
if (n == 0)
|
|
||||||
return(dlen + wcslen(s));
|
|
||||||
|
|
||||||
while (*s != '\0')
|
|
||||||
{
|
|
||||||
if (n != 1)
|
|
||||||
{
|
|
||||||
*d++ = *s;
|
|
||||||
n--;
|
|
||||||
}
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
*d = '\0';
|
|
||||||
|
|
||||||
return(dlen + (s - src));
|
|
||||||
/* count does not include NUL */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t
|
|
||||||
wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
|
|
||||||
{
|
|
||||||
register wchar_t *d = dst;
|
|
||||||
register const wchar_t *s = src;
|
|
||||||
register size_t n = siz;
|
|
||||||
|
|
||||||
/* Copy as many bytes as will fit */
|
|
||||||
if (n != 0 && --n != 0)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ((*d++ = *s++) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (--n != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
|
||||||
if (n == 0)
|
|
||||||
{
|
|
||||||
if (siz != 0)
|
|
||||||
*d = '\0';
|
|
||||||
/* NUL-terminate dst */
|
|
||||||
while (*s++)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
return(s - src - 1);
|
|
||||||
/* count does not include NUL */
|
|
||||||
}
|
|
||||||
|
|
||||||
int wcsvarname( wchar_t *str )
|
int wcsvarname( wchar_t *str )
|
||||||
{
|
{
|
||||||
while( *str )
|
while( *str )
|
||||||
|
|
24
common.h
24
common.h
|
@ -134,30 +134,6 @@ wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b );
|
||||||
*/
|
*/
|
||||||
wchar_t *wcsdupcat2( const wchar_t *a, ... );
|
wchar_t *wcsdupcat2( const wchar_t *a, ... );
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Appends src to string dst of size siz (unlike wcsncat, siz is the
|
|
||||||
full size of dst, not space left). At most siz-1 characters will be
|
|
||||||
copied. Always NUL terminates (unless siz <= wcslen(dst)). Returns
|
|
||||||
wcslen(src) + MIN(siz, wcslen(initial dst)). If retval >= siz,
|
|
||||||
truncation occurred.
|
|
||||||
|
|
||||||
This is the OpenBSD strlcat function, modified for wide characters,
|
|
||||||
and renamed to reflect this change.
|
|
||||||
|
|
||||||
*/
|
|
||||||
size_t wcslcat( wchar_t *dst, const wchar_t *src, size_t siz );
|
|
||||||
|
|
||||||
/**
|
|
||||||
Copy src to string dst of size siz. At most siz-1 characters will
|
|
||||||
be copied. Always NUL terminates (unless siz == 0). Returns
|
|
||||||
wcslen(src); if retval >= siz, truncation occurred.
|
|
||||||
|
|
||||||
This is the OpenBSD strlcpy function, modified for wide characters,
|
|
||||||
and renamed to reflect this change.
|
|
||||||
*/
|
|
||||||
size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test if the given string is a valid variable name
|
Test if the given string is a valid variable name
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -276,7 +276,7 @@ AC_CHECK_HEADER([regex.h],
|
||||||
# Check for presense of various functions
|
# Check for presense of various functions
|
||||||
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf )
|
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf )
|
||||||
AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
|
AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
|
||||||
AC_CHECK_FUNCS( wcstol dcgettext )
|
AC_CHECK_FUNCS( wcstol dcgettext wcslcat wcslcpy )
|
||||||
|
|
||||||
# Here follows a list of small programs used to test for various
|
# Here follows a list of small programs used to test for various
|
||||||
# features that Autoconf doesn't tell us about
|
# features that Autoconf doesn't tell us about
|
||||||
|
|
106
fallback.c
106
fallback.c
|
@ -888,5 +888,111 @@ long wcstol(const wchar_t *nptr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef HAVE_WCSLCAT
|
||||||
|
|
||||||
|
/*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t
|
||||||
|
wcslcat(wchar_t *dst, const wchar_t *src, size_t siz)
|
||||||
|
{
|
||||||
|
|
||||||
|
register wchar_t *d = dst;
|
||||||
|
register const wchar_t *s = src;
|
||||||
|
register size_t n = siz;
|
||||||
|
size_t dlen;
|
||||||
|
|
||||||
|
/* Find the end of dst and adjust bytes left but don't go past end */
|
||||||
|
while (n-- != 0 && *d != '\0')
|
||||||
|
d++;
|
||||||
|
|
||||||
|
dlen = d - dst;
|
||||||
|
n = siz - dlen;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
return(dlen + wcslen(s));
|
||||||
|
|
||||||
|
while (*s != '\0')
|
||||||
|
{
|
||||||
|
if (n != 1)
|
||||||
|
{
|
||||||
|
*d++ = *s;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
*d = '\0';
|
||||||
|
|
||||||
|
return(dlen + (s - src));
|
||||||
|
/* count does not include NUL */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WCSLCPY
|
||||||
|
|
||||||
|
/*$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t
|
||||||
|
wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
|
||||||
|
{
|
||||||
|
register wchar_t *d = dst;
|
||||||
|
register const wchar_t *s = src;
|
||||||
|
register size_t n = siz;
|
||||||
|
|
||||||
|
/* Copy as many bytes as will fit */
|
||||||
|
if (n != 0 && --n != 0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((*d++ = *s++) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (--n != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
if (siz != 0)
|
||||||
|
*d = '\0';
|
||||||
|
/* NUL-terminate dst */
|
||||||
|
while (*s++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return(s - src - 1);
|
||||||
|
/* count does not include NUL */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
29
fallback.h
29
fallback.h
|
@ -231,6 +231,35 @@ long wcstol(const wchar_t *nptr,
|
||||||
wchar_t **endptr,
|
wchar_t **endptr,
|
||||||
int base);
|
int base);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WCSLCAT
|
||||||
|
|
||||||
|
/**
|
||||||
|
Appends src to string dst of size siz (unlike wcsncat, siz is the
|
||||||
|
full size of dst, not space left). At most siz-1 characters will be
|
||||||
|
copied. Always NUL terminates (unless siz <= wcslen(dst)). Returns
|
||||||
|
wcslen(src) + MIN(siz, wcslen(initial dst)). If retval >= siz,
|
||||||
|
truncation occurred.
|
||||||
|
|
||||||
|
This is the OpenBSD strlcat function, modified for wide characters,
|
||||||
|
and renamed to reflect this change.
|
||||||
|
|
||||||
|
*/
|
||||||
|
size_t wcslcat( wchar_t *dst, const wchar_t *src, size_t siz );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WCSLCPY
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy src to string dst of size siz. At most siz-1 characters will
|
||||||
|
be copied. Always NUL terminates (unless siz == 0). Returns
|
||||||
|
wcslen(src); if retval >= siz, truncation occurred.
|
||||||
|
|
||||||
|
This is the OpenBSD strlcpy function, modified for wide characters,
|
||||||
|
and renamed to reflect this change.
|
||||||
|
*/
|
||||||
|
size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue