diff --git a/newlib/ChangeLog b/newlib/ChangeLog index f2a30a111..4045b7cd0 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,12 @@ +2015-11-17 Yaakov Selkowitz + + * libc/include/stdlib.h (rpmatch): Declare. + * libc/stdlib/Makefile.am (ELIX_4_SOURCES): Add rpmatch.c. + (CHEWOUT_FILES): Add rpmatch.def. + * libc/stdlib/Makefile.in: Regenerate. + * libc/stdlib/rpmatch.c: New file. + * libc/stdlib/stdlib.tex: Add references to rpmatch. + 2015-11-13 Marcus Shawcroft * libc/machine/arm/strlen-stub.c: Move T1 -O2 implementation to... diff --git a/newlib/libc/include/stdlib.h b/newlib/libc/include/stdlib.h index c73ed1115..afdde3f96 100644 --- a/newlib/libc/include/stdlib.h +++ b/newlib/libc/include/stdlib.h @@ -127,6 +127,7 @@ _PTR _EXFUN_NOTHROW(realloc,(_PTR __r, size_t __size)); #ifndef __STRICT_ANSI__ _PTR _EXFUN(reallocf,(_PTR __r, size_t __size)); char * _EXFUN(realpath, (const char *__restrict path, char *__restrict resolved_path)); +int _EXFUN(rpmatch, (const char *response)); #endif _VOID _EXFUN(srand,(unsigned __seed)); double _EXFUN(strtod,(const char *__restrict __n, char **__restrict __end_PTR)); diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am index f9ba5d5d5..9db0feb2a 100644 --- a/newlib/libc/stdlib/Makefile.am +++ b/newlib/libc/stdlib/Makefile.am @@ -159,6 +159,7 @@ ELIX_3_SOURCES = \ setenv_r.c ELIX_4_SOURCES = \ + rpmatch.c \ system.c if ELIX_LEVEL_1 @@ -276,6 +277,7 @@ CHEWOUT_FILES= \ on_exit.def \ rand.def \ rand48.def \ + rpmatch.def \ strtod.def \ strtol.def \ strtoll.def \ diff --git a/newlib/libc/stdlib/Makefile.in b/newlib/libc/stdlib/Makefile.in index 676c1d65f..9db9cea7b 100644 --- a/newlib/libc/stdlib/Makefile.in +++ b/newlib/libc/stdlib/Makefile.in @@ -136,7 +136,7 @@ am__objects_4 = lib_a-a64l.$(OBJEXT) lib_a-btowc.$(OBJEXT) \ lib_a-wctob.$(OBJEXT) am__objects_5 = lib_a-putenv.$(OBJEXT) lib_a-putenv_r.$(OBJEXT) \ lib_a-setenv.$(OBJEXT) lib_a-setenv_r.$(OBJEXT) -am__objects_6 = lib_a-system.$(OBJEXT) +am__objects_6 = lib_a-rpmatch.$(OBJEXT) lib_a-system.$(OBJEXT) @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@am__objects_7 = $(am__objects_4) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@ $(am__objects_5) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@ $(am__objects_6) @@ -171,7 +171,7 @@ am__objects_11 = a64l.lo btowc.lo getopt.lo getsubopt.lo l64a.lo \ mbsrtowcs.lo on_exit.lo valloc.lo wcrtomb.lo wcsnrtombs.lo \ wcsrtombs.lo wctob.lo am__objects_12 = putenv.lo putenv_r.lo setenv.lo setenv_r.lo -am__objects_13 = system.lo +am__objects_13 = rpmatch.lo system.lo @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@am__objects_14 = $(am__objects_11) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@ $(am__objects_12) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@ $(am__objects_13) @@ -448,6 +448,7 @@ ELIX_3_SOURCES = \ setenv_r.c ELIX_4_SOURCES = \ + rpmatch.c \ system.c @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@ELIX_SOURCES = $(ELIX_2_SOURCES) $(ELIX_3_SOURCES) $(ELIX_4_SOURCES) @@ -519,6 +520,7 @@ CHEWOUT_FILES = \ on_exit.def \ rand.def \ rand48.def \ + rpmatch.def \ strtod.def \ strtol.def \ strtoll.def \ @@ -1253,6 +1255,12 @@ lib_a-setenv_r.o: setenv_r.c lib_a-setenv_r.obj: setenv_r.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-setenv_r.obj `if test -f 'setenv_r.c'; then $(CYGPATH_W) 'setenv_r.c'; else $(CYGPATH_W) '$(srcdir)/setenv_r.c'; fi` +lib_a-rpmatch.o: rpmatch.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-rpmatch.o `test -f 'rpmatch.c' || echo '$(srcdir)/'`rpmatch.c + +lib_a-rpmatch.obj: rpmatch.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-rpmatch.obj `if test -f 'rpmatch.c'; then $(CYGPATH_W) 'rpmatch.c'; else $(CYGPATH_W) '$(srcdir)/rpmatch.c'; fi` + lib_a-system.o: system.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-system.o `test -f 'system.c' || echo '$(srcdir)/'`system.c diff --git a/newlib/libc/stdlib/rpmatch.c b/newlib/libc/stdlib/rpmatch.c new file mode 100644 index 000000000..879d1f3ac --- /dev/null +++ b/newlib/libc/stdlib/rpmatch.c @@ -0,0 +1,87 @@ +/* +FUNCTION +<>---determine whether response to question is affirmative or negative + +INDEX + rpmatch + +ANSI_SYNOPSIS + #include + int rpmatch(const char *<[response]>); + +TRAD_SYNOPSIS + #include + int rpmatch(<[response]>) + const char *<[response]>; + +DESCRIPTION +The <> function determines whether <[response]> is an affirmative +or negative response to a question according to the current locale. + +RETURNS +<> returns 1 if <[response]> is affirmative, 0 if negative, or -1 +if not recognized as either. + +PORTABILITY +<> is a BSD extension also found in glibc. + +NOTES +No supporting OS subroutines are required. +*/ + +/* This code is originally taken from FreeBSD. */ +/*- + * Copyright (c) 2004-2005 Tim J. Robbins. + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include + +#include +#include +#include + +int +_DEFUN(rpmatch, (response), + const char *response) +{ + regex_t yes, no; + int ret; + + if (regcomp(&yes, nl_langinfo(YESEXPR), REG_EXTENDED|REG_NOSUB) != 0) + return (-1); + if (regcomp(&no, nl_langinfo(NOEXPR), REG_EXTENDED|REG_NOSUB) != 0) { + regfree(&yes); + return (-1); + } + if (regexec(&yes, response, 0, NULL, 0) == 0) + ret = 1; + else if (regexec(&no, response, 0, NULL, 0) == 0) + ret = 0; + else + ret = -1; + regfree(&yes); + regfree(&no); + return (ret); +} diff --git a/newlib/libc/stdlib/stdlib.tex b/newlib/libc/stdlib/stdlib.tex index fdd495e5d..ef0986756 100644 --- a/newlib/libc/stdlib/stdlib.tex +++ b/newlib/libc/stdlib/stdlib.tex @@ -39,6 +39,7 @@ The corresponding declarations are in the header file @file{stdlib.h}. * qsort:: Array sort * rand:: Pseudo-random numbers * rand48:: Uniformly distributed pseudo-random numbers +* rpmatch:: Determine whether response is affirmative or negative * strtod:: String to double or float * strtol:: String to long * strtoll:: String to long long @@ -155,6 +156,9 @@ The corresponding declarations are in the header file @file{stdlib.h}. @page @include stdlib/rand48.def +@page +@include stdlib/rmpatch.def + @page @include stdlib/strtod.def