diff options
31 files changed, 599 insertions, 52 deletions
@@ -20,11 +20,16 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -#MALLOC = malloc -MALLOC = malloc-simple +#-------------------------------------------------------- +# +#There are a number of configurable options in Rules.make +# +#-------------------------------------------------------- + + + +DIRS = misc pwd_grp stdio string termios unistd net signal stdlib sysdeps -DIRS = error getent $(MALLOC) misc regex stdio \ -	    string termios time sysdeps shm #rpc  all: libc.a  libc.a: halfclean headers subdirs diff --git a/include/stdlib.h b/include/stdlib.h index 08af451f0..581c8cce7 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -106,6 +106,9 @@ extern div_t div __P ((int __numer, int __denom)) __attribute__ ((__const__));  extern long int labs __P ((long int __x)) __attribute__ ((__const__));  extern ldiv_t ldiv __P ((long int __numer, long int __denom)) __attribute__ ((__const__)); +/* Generate a unique temporary file name from TEMPLATE. */ +extern char *mktemp __P ((char *__template)); +extern int mkstemp __P ((char *__template));  #endif /* __STDLIB_H */ diff --git a/libc/inet/Makefile b/libc/inet/Makefile index 07d84d6eb..572263eb1 100644 --- a/libc/inet/Makefile +++ b/libc/inet/Makefile @@ -24,6 +24,8 @@ TOPDIR=../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a +DIRS = #rpc +  MSRC=addr.c  MOBJ=inet_aton.o inet_addr.o inet_ntoa.o @@ -34,9 +36,11 @@ MOBJ2=encodeh.o decodeh.o encoded.o decoded.o lengthd.o encodeq.o \  	opennameservers.o closenameservers.o resolvename.o gethostbyname.o\  	gethostbyaddr.o  OBJS=$(MOBJ) $(MOBJ2) + +  all: $(OBJS) $(LIBC) -$(LIBC): ar-target +$(LIBC): ar-target subdirs  ar-target: $(OBJS)  	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) @@ -49,6 +53,17 @@ $(MOBJ2): $(MSRC2)  $(OBJS): Makefile -clean: -	rm -f *.[oa] *~ core +clean: subdirs_clean +	rm -f libc.a + +subdirs: $(patsubst %, _dir_%, $(DIRS)) +subdirs_clean: $(patsubst %, _dirclean_%, $(DIRS)) + +$(patsubst %, _dir_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dir_%, %, $@) + +$(patsubst %, _dirclean_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dirclean_%, %, $@) clean + +.PHONY: dummy diff --git a/libc/inet/rpc/Makefile b/libc/inet/rpc/Makefile index cc6403648..a9a4717ac 100644 --- a/libc/inet/rpc/Makefile +++ b/libc/inet/rpc/Makefile @@ -20,7 +20,7 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -TOPDIR=../ +TOPDIR=../../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a  CFLAGS+=-I$(TOPDIR)include/linux diff --git a/libc/misc/Makefile b/libc/misc/Makefile index 03d2b2b40..30c92fcf8 100644 --- a/libc/misc/Makefile +++ b/libc/misc/Makefile @@ -21,7 +21,7 @@  # respective copyright holders. -DIRS = assert crypt ctype fnmatch glob lsearch +DIRS = assert crypt ctype fnmatch glob internals lsearch regex shm time  all: libc.a diff --git a/libc/misc/internals/Makefile b/libc/misc/internals/Makefile new file mode 100644 index 000000000..eb4e61ac8 --- /dev/null +++ b/libc/misc/internals/Makefile @@ -0,0 +1,42 @@ +# Makefile for uCLibc +# +# Copyright (C) 2000 by Lineo, inc. +# +# This program 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. +# +# This program 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 General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA +# +# Derived in part from the Linux-8086 C library, the GNU C Library, and several +# other sundry sources.  Files within this library are copyright by their +# respective copyright holders. + +TOPDIR=../../ +include $(TOPDIR)Rules.make +LIBC=$(TOPDIR)libc.a + +CSRC=itoa.c ltoa.c ltostr.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) +OBJS=$(COBJS) + +all: $(OBJS) $(LIBC) + +$(LIBC): ar-target + +ar-target: $(OBJS) +	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) + +$(OBJS): Makefile + +clean: +	rm -f *.[oa] *~ core + diff --git a/libc/misc/internals/itoa.c b/libc/misc/internals/itoa.c new file mode 100644 index 000000000..a683b8018 --- /dev/null +++ b/libc/misc/internals/itoa.c @@ -0,0 +1,21 @@ +/* itoa.c <ndf@linux.mit.edu> */ +#define __MAX_INT_CHARS 7 + +char *itoa(int i) +{ +	static char a[__MAX_INT_CHARS]; +	char *b = a + sizeof(a) - 1; +	int sign = (i < 0); + +	if (sign) +		i = -i; +	*b = 0; +	do { +		*--b = '0' + (i % 10); +		i /= 10; +	} +	while (i); +	if (sign) +		*--b = '-'; +	return b; +} diff --git a/libc/misc/internals/ltoa.c b/libc/misc/internals/ltoa.c new file mode 100644 index 000000000..da8b6d3df --- /dev/null +++ b/libc/misc/internals/ltoa.c @@ -0,0 +1,40 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ + +static char buf[12]; + +extern char *ultoa(); + +char *ltoa(val) +long val; +{ +	char *p; +	int flg = 0; + +	if (val < 0) { +		flg++; +		val = -val; +	} +	p = ultoa(val); +	if (flg) +		*--p = '-'; +	return p; +} + +char *ultoa(val) +unsigned long val; +{ +	char *p; + +	p = buf + sizeof(buf); +	*--p = '\0'; + +	do { +		*--p = '0' + val % 10; +		val /= 10; +	} +	while (val); +	return p; +} diff --git a/libc/misc/internals/ltostr.c b/libc/misc/internals/ltostr.c new file mode 100644 index 000000000..da6fad232 --- /dev/null +++ b/libc/misc/internals/ltostr.c @@ -0,0 +1,52 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ + +static char buf[34]; + +extern char *ultostr(); + +char *ltostr(val, radix, uppercase) +long val; +int radix; +int uppercase; +{ +	char *p; +	int flg = 0; + +	if (val < 0) { +		flg++; +		val = -val; +	} +	p = ultostr(val, radix, uppercase); +	if (p && flg) +		*--p = '-'; +	return p; +} + +char *ultostr(val, radix, uppercase) +unsigned long val; +int radix; +int uppercase; +{ +	register char *p; +	register int c; + +	if (radix > 36 || radix < 2) +		return 0; + +	p = buf + sizeof(buf); +	*--p = '\0'; + +	do { +		c = val % radix; +		val /= radix; +		if (c > 9) +			*--p = (uppercase ? 'A' : 'a') - 10 + c; +		else +			*--p = '0' + c; +	} +	while (val); +	return p; +} diff --git a/libc/misc/regex/Makefile b/libc/misc/regex/Makefile index 006ea75cc..7289186f7 100644 --- a/libc/misc/regex/Makefile +++ b/libc/misc/regex/Makefile @@ -20,7 +20,7 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -TOPDIR=../ +TOPDIR=../../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a diff --git a/libc/misc/time/Makefile b/libc/misc/time/Makefile index e3c2c26d6..e5387a56a 100644 --- a/libc/misc/time/Makefile +++ b/libc/misc/time/Makefile @@ -20,7 +20,7 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -TOPDIR=../ +TOPDIR=../../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a diff --git a/libc/signal/Makefile b/libc/signal/Makefile new file mode 100644 index 000000000..ab2a996c5 --- /dev/null +++ b/libc/signal/Makefile @@ -0,0 +1,42 @@ +# Makefile for uCLibc +# +# Copyright (C) 2000 by Lineo, inc. +# +# This program 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. +# +# This program 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 General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA +# +# Derived in part from the Linux-8086 C library, the GNU C Library, and several +# other sundry sources.  Files within this library are copyright by their +# respective copyright holders. + +TOPDIR=../ +include $(TOPDIR)Rules.make +LIBC=$(TOPDIR)libc.a + +CSRC=raise.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) +OBJS=$(COBJS) + +all: $(OBJS) $(LIBC) + +$(LIBC): ar-target + +ar-target: $(OBJS) +	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) + +$(OBJS): Makefile + +clean: +	rm -f *.[oa] *~ core + diff --git a/libc/signal/raise.c b/libc/signal/raise.c new file mode 100644 index 000000000..b666789b4 --- /dev/null +++ b/libc/signal/raise.c @@ -0,0 +1,15 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> + +int raise(signo) +int signo; +{ +	return kill(getpid(), signo); +} + diff --git a/libc/stdio/Makefile b/libc/stdio/Makefile index fbd0bbf15..874dcae7f 100644 --- a/libc/stdio/Makefile +++ b/libc/stdio/Makefile @@ -36,7 +36,7 @@ MOBJ2=printf.o sprintf.o fprintf.o vprintf.o vsprintf.o vfprintf.o snprintf.o vs  MSRC3=scanf.c  MOBJ3=scanf.o sscanf.o fscanf.o vscanf.o vsscanf.o vfscanf.o -CSRC=dputs.c +CSRC=dputs.c popen.c perror.c remove.c  COBJS=$(patsubst %.c,%.o, $(CSRC))  OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3) $(COBJS) diff --git a/libc/stdio/perror.c b/libc/stdio/perror.c new file mode 100644 index 000000000..d6274c056 --- /dev/null +++ b/libc/stdio/perror.c @@ -0,0 +1,19 @@ +#include <unistd.h> +#include <string.h> +#include <errno.h> + +void perror(str) +__const char *str; +{ +	register char *ptr; + +	if (str) { +		write(2, str, strlen(str)); +		write(2, ": ", 2); +	} else +		write(2, "perror: ", 8); + +	ptr = strerror(errno); +	write(2, ptr, strlen(ptr)); +	write(2, "\n", 1); +} diff --git a/libc/stdio/popen.c b/libc/stdio/popen.c new file mode 100644 index 000000000..a07c411eb --- /dev/null +++ b/libc/stdio/popen.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> + + +FILE *popen(command, rw) +char *command; +char *rw; +{ +	int pipe_fd[2]; +	int pid, reading; + +	if (pipe(pipe_fd) < 0) +		return NULL; +	reading = (rw[0] == 'r'); + +	pid = vfork(); +	if (pid < 0) { +		close(pipe_fd[0]); +		close(pipe_fd[1]); +		return NULL; +	} +	if (pid == 0) { +		close(pipe_fd[!reading]); +		close(reading); +		if (pipe_fd[reading] != reading) { +			dup2(pipe_fd[reading], reading); +			close(pipe_fd[reading]); +		} + +		execl("/bin/sh", "sh", "-c", command, (char *) 0); +		_exit(255); +	} + +	close(pipe_fd[reading]); +	return fdopen(pipe_fd[!reading], rw); +} + +int pclose(fd) +FILE *fd; +{ +	int waitstat; + +	if (fclose(fd) != 0) +		return EOF; +	wait(&waitstat); +	return waitstat; +} diff --git a/libc/stdio/remove.c b/libc/stdio/remove.c new file mode 100644 index 000000000..115b871bb --- /dev/null +++ b/libc/stdio/remove.c @@ -0,0 +1,23 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <errno.h> + +int remove(src) +__const char *src; +{ +	extern int errno; +	int er = errno; +	int rv = unlink(src); + +	if (rv < 0 && errno == EISDIR) +		rv = rmdir(src); +	if (rv >= 0) +		errno = er; +	return rv; +} + diff --git a/libc/stdlib/Makefile b/libc/stdlib/Makefile index da402be6c..b4211ecf7 100644 --- a/libc/stdlib/Makefile +++ b/libc/stdlib/Makefile @@ -24,23 +24,22 @@ TOPDIR=../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a -MSRC=aliases.c -MOBJ=abs.o remove.o creat.o bcopy.o bzero.o # raise.o bcmp.o index.o rindex.o  +DIRS = $(MALLOC) +  MSRC2=atexit.c  MOBJ2=on_exit.o atexit.o __do_exit.o exit.o -CSRC=atoi.c atol.c ltoa.c ltostr.c ctype.c qsort.c bsearch.c rand.c lsearch.c \ -	getopt.c glob.c fnmatch.c itoa.c strtod.c strtol.c crypt.c sleep.c \ -	mkstemp.c  mktemp.c realpath.c getenv.c putenv.c popen.c system.c \ -	getcwd.c setenv.c execl.c execv.c execlp.c execvp.c execvep.c + +CSRC =	abort.c getenv.c  mktemp.c  qsort.c  realpath.c strtod.c strtoul.c \ +	abs.c   bsearch.c mkstemp.c putenv.c rand.c setenv.c strtol.c system.c  COBJS=$(patsubst %.c,%.o, $(CSRC))  OBJS=$(MOBJ) $(MOBJ2) $(COBJS)  all: $(OBJS) $(LIBC) -$(LIBC): ar-target +$(LIBC): ar-target subdirs  ar-target: $(OBJS)  	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) @@ -53,6 +52,18 @@ $(MOBJ2): $(MSRC2)  $(OBJ): Makefile +subdirs: $(patsubst %, _dir_%, $(DIRS)) +subdirs_clean: $(patsubst %, _dirclean_%, $(DIRS)) + +$(patsubst %, _dir_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dir_%, %, $@) + +$(patsubst %, _dirclean_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dirclean_%, %, $@) clean +  clean:  	rm -f *.[oa] *~ core +.PHONY: dummy + + diff --git a/libc/stdlib/abs.c b/libc/stdlib/abs.c new file mode 100644 index 000000000..044a334b1 --- /dev/null +++ b/libc/stdlib/abs.c @@ -0,0 +1,13 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <sys/types.h> + +int abs(int arg1) +{ +	return arg1 > 0 ? arg1 : -arg1; +} + diff --git a/libc/stdlib/malloc-simple/Makefile b/libc/stdlib/malloc-simple/Makefile index c2f8827b5..e46415536 100644 --- a/libc/stdlib/malloc-simple/Makefile +++ b/libc/stdlib/malloc-simple/Makefile @@ -20,7 +20,7 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -TOPDIR=../ +TOPDIR=../../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a diff --git a/libc/stdlib/malloc-simple/alloc.c b/libc/stdlib/malloc-simple/alloc.c index cf4835c97..f31105d4e 100644 --- a/libc/stdlib/malloc-simple/alloc.c +++ b/libc/stdlib/malloc-simple/alloc.c @@ -67,8 +67,12 @@ void *calloc(size_t num, size_t size)  void *malloc(size_t len)  {  	void *result = mmap((void *) 0, len, PROT_READ | PROT_WRITE, -						//MAP_SHARED | MAP_ANONYMOUS, 0, 0); -						MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); +#ifdef __HAS_NO_MMU__ +						MAP_SHARED | MAP_ANONYMOUS, 0, 0 +#else +						MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 +#endif +						    );  	if (result == (void *) -1)  		return 0; diff --git a/libc/stdlib/malloc/Makefile b/libc/stdlib/malloc/Makefile index fe3f8b424..0824e71a8 100644 --- a/libc/stdlib/malloc/Makefile +++ b/libc/stdlib/malloc/Makefile @@ -20,7 +20,7 @@  # other sundry sources.  Files within this library are copyright by their  # respective copyright holders. -TOPDIR=../ +TOPDIR=../../  include $(TOPDIR)Rules.make  LIBC=$(TOPDIR)libc.a diff --git a/libc/stdlib/malloc/malloc.c b/libc/stdlib/malloc/malloc.c index 1a0b61aa5..4ed9fe873 100644 --- a/libc/stdlib/malloc/malloc.c +++ b/libc/stdlib/malloc/malloc.c @@ -190,7 +190,13 @@ static void *hunk_alloc(int size)    if ((p = free_h[size]) == NULL)    {      if ((p = (Hunk_t*)mmap(HUNK_MSTART,HUNK_MSIZE,PROT_READ|PROT_WRITE, -	MAP_PRIVATE|MAP_ANON,0,0)) == (Hunk_t*)MAP_FAILED) +#ifdef __HAS_NO_MMU__ +	MAP_PRIVATE|MAP_ANONYMOUS +#else + +	MAP_SHARED|MAP_ANONYMOUS +#endif +	,0,0)) == (Hunk_t*)MAP_FAILED)        return NULL;      memset(p,0,HUNK_MSIZE);      p->id = HUNK_ID; diff --git a/libc/string/Makefile b/libc/string/Makefile index 171970c9a..e4f332ba4 100644 --- a/libc/string/Makefile +++ b/libc/string/Makefile @@ -29,10 +29,14 @@ MOBJ=strlen.o strcat.o strcpy.o strcmp.o strncat.o strncpy.o strncmp.o \  	strchr.o strrchr.o strdup.o memcpy.o memccpy.o memset.o \  	memmove.o memcmp.o memchr.o -CSRC=strpbrk.c strsep.c strstr.c strtok.c strcspn.c \ -	config.c strspn.c strcasecmp.c strncasecmp.c +MSRC1=index.c +MOBJ1=index.o rindex.o + +CSRC=strpbrk.c strsep.c strstr.c strtok.c strcspn.c config.c \ +	strspn.c strcasecmp.c strncasecmp.c strerror.c sys_siglist.c \ +	bcopy.c bzero.c bcmp.c  COBJS=$(patsubst %.c,%.o, $(CSRC)) -OBJS=$(MOBJ) $(COBJS) +OBJS=$(MOBJ) $(MOBJ1) $(COBJS)  all: $(OBJS) $(LIBC) @@ -44,6 +48,9 @@ ar-target: $(OBJS)  $(MOBJ): $(MSRC)  	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o +$(MOBJ1): $(MSRC1) +	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o +  $(OBJS): Makefile  clean: diff --git a/libc/string/bcmp.c b/libc/string/bcmp.c new file mode 100644 index 000000000..b3bec9034 --- /dev/null +++ b/libc/string/bcmp.c @@ -0,0 +1,13 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <sys/types.h> + +int bcmp(const __ptr_t dest, const __ptr_t src, size_t len) +{ +	return memcmp(dest, src, len); +} + diff --git a/libc/string/bcopy.c b/libc/string/bcopy.c new file mode 100644 index 000000000..7f929db73 --- /dev/null +++ b/libc/string/bcopy.c @@ -0,0 +1,15 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <sys/types.h> + +void bcopy(const __ptr_t src, __ptr_t dest, size_t len) +{ +/*   (void) memcpy(dest, src, len); */ +	while (len--) +		*(char *) (dest++) = *(char *) (src++); +} + diff --git a/libc/string/bzero.c b/libc/string/bzero.c new file mode 100644 index 000000000..f726032a8 --- /dev/null +++ b/libc/string/bzero.c @@ -0,0 +1,15 @@ +/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> + * This file is part of the Linux-8086 C library and is distributed + * under the GNU Library General Public License. + */ +#include <unistd.h> +#include <string.h> +#include <sys/types.h> + +void bzero(__ptr_t dest, size_t len) +{ +	/* (void) memset(dest, '\0', len); */ +	while (len--) +		*(char *) (dest++) = '\0'; +} + diff --git a/libc/string/strerror.c b/libc/string/strerror.c new file mode 100644 index 000000000..6eeac104e --- /dev/null +++ b/libc/string/strerror.c @@ -0,0 +1,46 @@ +/* Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA.  */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> + +extern char *itoa(int); + +/* Return a string descibing the errno code in ERRNUM. +   The storage is good only until the next call to strerror. +   Writing to the storage causes undefined behavior.  */ +char *strerror(int err) +{ +	static char retbuf[80]; + +	if (sys_nerr) { +		if (err < 0 || err >= sys_nerr) +			goto unknown; +		return sys_errlist[err]; +	} + +	if (err <= 0) +		goto unknown; + +  unknown: +	printf("sys_nerr=%d\n", sys_nerr); +	strcpy(retbuf, "Unknown Error: errno="); +	strcat(retbuf, (char *) itoa(err)); +	return retbuf; +} diff --git a/libc/string/strsep.c b/libc/string/strsep.c index 797807a91..797b74400 100644 --- a/libc/string/strsep.c +++ b/libc/string/strsep.c @@ -1,34 +1,65 @@ -/* Copyright (C) 1992, 1993 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1992, 93, 96, 97, 98, 99 Free Software Foundation, Inc. +   This file is part of the GNU C Library. -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 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. +   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., 675 Mass Ave, -Cambridge, MA 02139, USA.  */ +   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.  */  #include <string.h> -char *strsep( char **pp, const char *delim) +char * strsep( char **stringp, const char *delim)  { -	char *p, *q; - -	if (!(p = *pp)) -		return 0; -	if ((q = strpbrk(p, delim))) { -		*pp = q + 1; -		*q = '\0'; -	} else -		*pp = 0; -	return p; +  char *begin, *end; + +  begin = *stringp; +  if (begin == NULL) +    return NULL; + +  /* A frequent case is when the delimiter string contains only one +     character.  Here we don't need to call the expensive `strpbrk' +     function and instead work using `strchr'.  */ +  if (delim[0] == '\0' || delim[1] == '\0') +    { +      char ch = delim[0]; + +      if (ch == '\0') +	end = NULL; +      else +	{ +	  if (*begin == ch) +	    end = begin; +	  else if (*begin == '\0') +	    end = NULL; +	  else +	    end = strchr (begin + 1, ch); +	} +    } +  else +    /* Find the end of the token.  */ +    end = strpbrk (begin, delim); + +  if (end) +    { +      /* Terminate the token and set *STRINGP past NUL character.  */ +      *end++ = '\0'; +      *stringp = end; +    } +  else +    /* No more delimiters; this is the last token.  */ +    *stringp = NULL; + +  return begin;  } + diff --git a/libc/unistd/Makefile b/libc/unistd/Makefile new file mode 100644 index 000000000..1095e1a37 --- /dev/null +++ b/libc/unistd/Makefile @@ -0,0 +1,53 @@ +# Makefile for uCLibc +# +# Copyright (C) 2000 by Lineo, inc. +# +# This program 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. +# +# This program 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 General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA +# +# Derived in part from the Linux-8086 C library, the GNU C Library, and several +# other sundry sources.  Files within this library are copyright by their +# respective copyright holders. + +TOPDIR=../ +include $(TOPDIR)Rules.make +LIBC=$(TOPDIR)libc.a + + +CSRC=execl.c execlp.c execv.c execvep.c execvp.c getcwd.c getopt.c sleep.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) +OBJS=$(COBJS) + + +all: $(OBJS) $(LIBC) + +$(LIBC): ar-target subdirs + +ar-target: $(OBJS) +	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) + +$(OBJ): Makefile + +subdirs: $(patsubst %, _dir_%, $(DIRS)) +subdirs_clean: $(patsubst %, _dirclean_%, $(DIRS)) + +$(patsubst %, _dir_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dir_%, %, $@) + +$(patsubst %, _dirclean_%, $(DIRS)) : dummy +	$(MAKE) -C $(patsubst _dirclean_%, %, $@) clean + +clean: +	rm -f *.[oa] *~ core + diff --git a/test/string/string.c b/test/string/string.c index c59262717..2492755d0 100644 --- a/test/string/string.c +++ b/test/string/string.c @@ -580,14 +580,21 @@ test_strsep (void)    equal(one+2, "b", 49);    equal(one+4, "c", 50); +printf( "A\n");    {      char text[] = "This,is,a,test";      char *list = strdup (text); +printf( "B\n");      equal (strsep (&list, ","), "This", 51); +printf( "C\n");      equal (strsep (&list, ","), "is", 52); +printf( "D\n");      equal (strsep (&list, ","), "a", 53); +printf( "E\n");      equal (strsep (&list, ","), "test", 54); +printf( "F\n");      check (strsep (&list, ",") == NULL, 55); +printf( "G\n");    }    cp = strcpy(one, "a,b, c,, ,d,");  | 
