diff options
Diffstat (limited to 'misc')
-rw-r--r-- | misc/Makefile | 11 | ||||
-rw-r--r-- | misc/regexp.c | 76 | ||||
-rw-r--r-- | misc/regexp.h | 213 | ||||
-rw-r--r-- | misc/search.h | 2 | ||||
-rw-r--r-- | misc/sys/cdefs.h | 4 | ||||
-rw-r--r-- | misc/sys/uio.h | 8 |
6 files changed, 302 insertions, 12 deletions
diff --git a/misc/Makefile b/misc/Makefile index 46b078c081..74e0a736e7 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -12,9 +12,9 @@ # Library General Public License for more details. # You should have received a copy of the GNU Library General Public -# License along with the GNU C Library; see the file COPYING.LIB. If -# not, write to the Free Software Foundation, Inc., 675 Mass Ave, -# Cambridge, MA 02139, USA. +# License along with the GNU C Library; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. # # Sub-makefile for misc portion of the library. @@ -28,7 +28,8 @@ headers := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \ ttyent.h syslog.h sys/syslog.h paths.h sys/reboot.h \ sys/mman.h sys/param.h fstab.h mntent.h search.h err.h error.h\ sys/queue.h sysexits.h syscall.h sys/syscall.h sys/swap.h \ - sys/select.h ustat.h sys/ustat.h ustatbits.h sys/sysinfo.h + sys/select.h ustat.h sys/ustat.h ustatbits.h sys/sysinfo.h \ + regexp.h routines := brk sbrk sstk ioctl \ readv writev \ @@ -55,7 +56,7 @@ routines := brk sbrk sstk ioctl \ efgcvt efgcvt_r qefgcvt qefgcvt_r \ hsearch hsearch_r tsearch lsearch \ err error ustat \ - getsysstats dirname + getsysstats dirname regexp aux := init-misc distribute := bsd-compat.c extra-objs := bsd-compat.o diff --git a/misc/regexp.c b/misc/regexp.c new file mode 100644 index 0000000000..34019aeb1a --- /dev/null +++ b/misc/regexp.c @@ -0,0 +1,76 @@ +/* Define function and variables for the obsolete <regexp.h> interface. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define __DO_NOT_DEFINE_COMPILE +#include <regexp.h> + +/* Define the variables used for the interface. */ +char *loc1; +char *loc2; + +/* Although we do not support the use we define this variable as well. */ +char *locs; + + +/* Find the next match in STRING. The compiled regular expression is + found in the buffer starting at EXPBUF. `loc1' will return the + first character matched and `loc2' points to the next unmatched + character. */ +int +__step (const char *string, const char *expbuf) +{ + regmatch_t match; /* We only need info about the full match. */ + + expbuf += __alignof (regex_t *); + expbuf -= (expbuf - ((const char *) 0)) % __alignof__ (regex_t *); + + if (regexec ((regex_t *) expbuf, string, 1, &match, REG_NOTEOL) + == REG_NOMATCH) + return 0; + + loc1 = (char *) string + match.rm_so; + loc2 = (char *) string + match.rm_eo; + return 1; +} +weak_alias (__step, step) + + +/* Match the beginning of STRING with the compiled regular expression + in EXPBUF. If the match is successful `loc2' will contain the + position of the first unmatched character. */ +int +__advance (const char *string, const char *expbuf) +{ + regmatch_t match; /* We only need info about the full match. */ + + expbuf += __alignof__ (regex_t *); + expbuf -= (expbuf - ((const char *) 0)) % __alignof__ (regex_t *); + + if (regexec ((regex_t *) expbuf, string, 1, &match, REG_NOTEOL) + == REG_NOMATCH + /* We have to check whether the check is at the beginning of the + buffer. */ + || match.rm_so != 0) + return 0; + + loc2 = (char *) string + match.rm_eo; + return 1; +} +weak_alias (__advance, advance) diff --git a/misc/regexp.h b/misc/regexp.h new file mode 100644 index 0000000000..e31407e6ed --- /dev/null +++ b/misc/regexp.h @@ -0,0 +1,213 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _REGEXP_H +#define _REGEXP_H 1 + +/* The contents of this header file was first standardized in X/Open + System Interface and Headers Issue 2, originally coming from SysV. + In issue 4, version 2, it is marked as TO BE WITDRAWN. + + This code shouldn't be used in any newly written code. It is + included only for compatibility reasons. Use the POSIX definition + in <regex.h> for portable applications and a reasonable interface. */ + +#include <alloca.h> +#include <regex.h> +#include <stdlib.h> +#include <string.h> + +/* The implementation provided here emulates the needed functionality + by mapping to the POSIX regular expression matcher. The interface + for the here included function is weird (this really is a harmless + word). + + The user has to provide five macros before this header file can be + included: + + GETC() Return the value of the next character in the regular + expression pattern. Successive calls should return + successive characters. + + PEEKC() Return the value of the next character in the regular + expression pattern. Immediately successive calls to + PEEKC() should return the same character which should + also be the next character returned by GETC(). + + UNGETC(c) Cause `c' to be returned by the next call to GETC() and + PEEKC(). + + RETURN(ptr) Used for normal exit of the `compile' function. `ptr' + is a pointer to the character after the last character of + the compiled regular expression. + + ERROR(val) Used for abnormal return from `compile'. `val' is the + error number. The error codes are: + 11 Range endpoint too large. + 16 Bad number. + 25 \digit out of range. + 36 Illegal or missing delimiter. + 41 No remembered search string. + 42 \( \) imbalance. + 43 Too many \(. + 44 More tan two numbers given in \{ \}. + 45 } expected after \. + 46 First number exceeds second in \{ \}. + 49 [ ] imbalance. + 50 Regular expression overflow. + + */ + +__BEGIN_DECLS + +/* Interface variables. They contain the results of the successful + calls to `setp' and `advance'. */ +extern char *loc1; +extern char *loc2; + +/* The use of this variable in the `advance' function is not + supported. */ +extern char *locs; + + +#ifndef __DO_NOT_DEFINE_COMPILE +/* Get and compile the user supplied pattern up to end of line or + string or until EOF is seen, whatever happens first. The result is + placed in the buffer starting at EXPBUG and delimited by ENDBUF. + + This function cannot be defined in the libc itself since it depends + on the macros. */ +char * +compile (char *__instring, char *__expbuf, __const char *__endbuf, int __eof) +{ + char *__input_buffer = NULL; + size_t __input_size = 0; + size_t __current_size; + int __ch; + int __result; + + /* Align the expression buffer according to the needs for an object + of type `regex_t'. Then check for minimum size of the buffer for + the compiled regular expression. */ + regex_t *__expr_ptr; +#if defined __GNUC__ && __GNUC__ >= 2 + const size_t __req = __alignof__ (regex_t *); +#else + /* How shall we find out? We simply guess it and can change it is + this really proofs to be wrong. */ + const size_t __req = 8; +#endif + __expbuf += __req; + __expbuf -= (__expbuf - ((char *) 0)) % __req; + if (__endbuf < __expbuf + sizeof (regex_t)) + { + ERROR (50); + } + __expr_ptr = (regex_t *) __expbuf; + /* The remaining space in the buffer can be used for the compiled + pattern. */ + __expr_ptr->buffer = __expbuf + sizeof (regex_t); + __expr_ptr->allocated = __endbuf - (char *) __expr_ptr->buffer; + + while ((__ch = (GETC ())) != __eof) + { + if (__ch == '\0' || __ch == 'n') + { + UNGETC (__ch); + break; + } + + if (__current_size + 1 >= __input_size) + { + size_t __new_size = __input_size ? 2 * __input_size : 128; + char *__new_room = __alloca (__new_size); + /* See whether we can use the old buffer. */ + if (__new_room + __new_size == __input_buffer) + { + __input_size += __new_size; + __input_buffer = memcpy (__new_room, __input_buffer, + __current_size); + } + else if (__input_buffer + __input_size == __new_room) + __input_size += __new_size; + else + { + __input_size = __new_size; + __input_buffer = memcpy (__new_room, __input_buffer, + __current_size); + } + } + __input_buffer[__current_size++] = __ch; + } + __input_buffer[__current_size++] = '\0'; + + /* Now compile the pattern. */ + __error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE); + if (__error != 0) + /* Oh well, we have to translate POSIX error codes. */ + switch (__error) + { + case REG_BADPAT: + case REG_ECOLLATE: + case REG_ECTYPE: + case REG_EESCAPE: + case REG_BADRPT: + case REG_EEND: + case REG_RPAREN: + default: + /* There is no matching error code. */ + RETURN (36); + case REG_ESUBREG: + RETURN (25); + case REG_EBRACK: + RETURN (49); + case REG_EPAREN: + RETURN (42); + case REG_EBRACE: + RETURN (44); + case REG_BADBR: + RETURN (46); + case REG_ERANGE: + RETURN (11); + case REG_ESPACE: + case REG_ESIZE: + ERROR (50); + } + + /* Everything is ok. */ + RETURN ((char *) (__expr_ptr->buffer + __expr->used)); +} +#endif + + +/* Find the next match in STRING. The compiled regular expression is + found in the buffer starting at EXPBUF. `loc1' will return the + first character matched and `loc2' points to the next unmatched + character. */ +extern int step __P ((__const char *__string, __const char *__expbuf)); + +/* Match the beginning of STRING with the compiled regular expression + in EXPBUF. If the match is successful `loc2' will contain the + position of the first unmatched character. */ +extern int advance __P ((__const char *__string, __const char *__expbuf)); + + +__END_DECLS + +#endif /* regexp.h */ diff --git a/misc/search.h b/misc/search.h index 2103d66cbe..221546d2ba 100644 --- a/misc/search.h +++ b/misc/search.h @@ -88,7 +88,7 @@ extern void hdestroy __P ((void)); extern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval, struct hsearch_data *__htab)); -extern int hcreate_r __P ((unsigned int __nel, struct hsearch_data *htab)); +extern int hcreate_r __P ((size_t __nel, struct hsearch_data *htab)); extern void hdestroy_r __P ((struct hsearch_data *htab)); diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index b4a2fd285d..e90dd0f220 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -63,7 +63,7 @@ /* This is not a typedef so `const __ptr_t' does the right thing. */ #define __ptr_t void * -typedef long double __long_double_t; +#define __long_double_t long double #else @@ -71,7 +71,7 @@ typedef long double __long_double_t; #define __STRING(x) "x" #define __ptr_t char * -typedef double __long_double_t; +#define __long_double_t long double /* The BSD header files use the ANSI keywords unmodified (this means that old programs may lose if they use the new keywords as identifiers), but diff --git a/misc/sys/uio.h b/misc/sys/uio.h index 0127efba14..bc49324cc5 100644 --- a/misc/sys/uio.h +++ b/misc/sys/uio.h @@ -21,10 +21,10 @@ #define _SYS_UIO_H 1 #include <features.h> -__BEGIN_DECLS - #include <sys/types.h> +__BEGIN_DECLS + /* This file defines `struct iovec'. */ #include <iovec.h> @@ -34,7 +34,7 @@ __BEGIN_DECLS The buffers are filled in the order specified. Operates just like `read' (see <unistd.h>) except that data are put in VECTOR instead of a contiguous buffer. */ -extern ssize_t readv __P ((int __fd, __const struct iovec * __vector, +extern ssize_t readv __P ((int __fd, __const struct iovec *__vector, int __count)); /* Write data pointed by the buffers described by VECTOR, which @@ -42,7 +42,7 @@ extern ssize_t readv __P ((int __fd, __const struct iovec * __vector, The data is written in the order specified. Operates just like `write' (see <unistd.h>) except that the data are taken from VECTOR instead of a contiguous buffer. */ -extern ssize_t writev __P ((int __fd, __const struct iovec * __vector, +extern ssize_t writev __P ((int __fd, __const struct iovec *__vector, int __count)); |