diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | include/errno.h | 2 | ||||
-rw-r--r-- | include/stdio.h | 441 | ||||
-rw-r--r-- | include/unistd.h | 1 | ||||
-rw-r--r-- | libc/stdio/Makefile | 2 | ||||
-rw-r--r-- | libc/stdio/getdelim.c | 16 | ||||
-rw-r--r-- | libc/stdio/getline.c | 2 | ||||
-rw-r--r-- | libc/stdio/popen.c | 11 | ||||
-rw-r--r-- | libc/stdio/scanf.c | 13 | ||||
-rw-r--r-- | libc/stdio/stdio.c | 2 | ||||
-rw-r--r-- | libc/stdio/tmpnam.c | 68 | ||||
-rw-r--r-- | libc/stdio/tmpnam_r.c | 43 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/Makefile | 5 | ||||
-rw-r--r-- | libc/unistd/getopt.c | 5 | ||||
-rw-r--r-- | test/string/Makefile | 7 |
15 files changed, 478 insertions, 142 deletions
@@ -28,7 +28,7 @@ include Rules.mak -DIRS = misc pwd_grp stdio string termios unistd net signal stdlib sysdeps +DIRS = sysdeps misc pwd_grp stdio string termios unistd net signal stdlib all: libc.a diff --git a/include/errno.h b/include/errno.h index 862d0f2cb..f96590c2e 100644 --- a/include/errno.h +++ b/include/errno.h @@ -5,7 +5,7 @@ #include <linux/errno.h> extern int sys_nerr; -extern char *sys_errlist[]; +extern const char *const sys_errlist[]; #define _sys_nerr sys_nerr #define _sys_errlist sys_errlist diff --git a/include/stdio.h b/include/stdio.h index 51a175acc..a7a468788 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,37 +1,34 @@ +/* Define ISO C stdio on top of C++ iostreams. + Copyright (C) 1991, 1994-1999, 2000 Free Software Foundation, Inc. -#ifndef __STDIO_H -#define __STDIO_H + 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. -#include <features.h> -#include <stdarg.h> -#include <sys/types.h> + 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. -#ifndef SEEK_SET -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 -#endif + 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 _IOFBF 0x00 /* full buffering */ -#define _IOLBF 0x01 /* line buffering */ -#define _IONBF 0x02 /* no buffering */ -#define __MODE_BUF 0x03 /* Modal buffering dependent on isatty */ +/* + * ISO C Standard: 4.9 INPUT/OUTPUT <stdio.h> + */ -#define __MODE_FREEBUF 0x04 /* Buffer allocated with malloc, can free */ -#define __MODE_FREEFIL 0x08 /* FILE allocated with malloc, can free */ +#ifndef _STDIO_H +#define _STDIO_H -#define __MODE_READ 0x10 /* Opened in read only */ -#define __MODE_WRITE 0x20 /* Opened in write only */ -#define __MODE_RDWR 0x30 /* Opened in read/write */ - -#define __MODE_READING 0x40 /* Buffer has pending read data */ -#define __MODE_WRITING 0x80 /* Buffer has pending write data */ +#include <features.h> +#include <stdarg.h> +#include <sys/types.h> -#define __MODE_EOF 0x100 /* EOF status */ -#define __MODE_ERR 0x200 /* Error status */ -#define __MODE_UNGOT 0x400 /* Buffer has been polluted by ungetc */ +__BEGIN_DECLS -#define __MODE_IOTRAN 0 /* when you add or change fields here, be sure to change the initialization * in stdio_init and fopen */ @@ -51,177 +48,403 @@ struct __stdio_file { struct __stdio_file * next; }; +typedef struct __stdio_file FILE; + +/* Default buffer size. */ +#define BUFSIZ (500) /* should get us a fully used kmalloc bucket */ + +/* Define EOF and NULL */ #define EOF (-1) #ifndef NULL #define NULL (0) #endif -typedef struct __stdio_file FILE; +/* The possibilities for the third argument to `setvbuf'. */ +#define _IOFBF 0 /* Fully buffered. */ +#define _IOLBF 1 /* Line buffered. */ +#define _IONBF 2 /* No buffering. */ + +/* Possible states for a file stream -- internal use only */ +#define __MODE_IOTRAN 0 +#define __MODE_BUF 0x03 /* Modal buffering dependent on isatty */ +#define __MODE_FREEBUF 0x04 /* Buffer allocated with malloc, can free */ +#define __MODE_FREEFIL 0x08 /* FILE allocated with malloc, can free */ +#define __MODE_READ 0x10 /* Opened in read only */ +#define __MODE_WRITE 0x20 /* Opened in write only */ +#define __MODE_RDWR 0x30 /* Opened in read/write */ +#define __MODE_READING 0x40 /* Buffer has pending read data */ +#define __MODE_WRITING 0x80 /* Buffer has pending write data */ +#define __MODE_EOF 0x100 /* EOF status */ +#define __MODE_ERR 0x200 /* Error status */ +#define __MODE_UNGOT 0x400 /* Buffer has been polluted by ungetc */ -#define BUFSIZ (500) /*(508) should get us a fully used kmalloc bucket */ -extern FILE stdin[1]; -extern FILE stdout[1]; -extern FILE stderr[1]; +/* The possibilities for the third argument to `fseek'. + These values should not be changed. */ +#define SEEK_SET 0 /* Seek from beginning of file. */ +#define SEEK_CUR 1 /* Seek from current position. */ +#define SEEK_END 2 /* Seek from end of file. */ #define stdio_pending(fp) ((fp)->bufread>(fp)->bufpos) -/* Read chunks of generic data from STREAM. */ -extern size_t fread __P ((void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __stream)); -/* Write chunks of generic data to STREAM. */ -extern size_t fwrite __P ((__const void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __s)); -#define putc(c, stream) \ - (((stream)->bufpos >= (stream)->bufwrite) ? fputc((c), (stream)) \ - : (unsigned char) (*(stream)->bufpos++ = (c)) ) +/* Default path prefix for `tempnam' and `tmpnam'. */ +#define P_tmpdir "/tmp" +/* Get the values: + L_tmpnam How long an array of chars must be to be passed to `tmpnam'. + TMP_MAX The minimum number of unique filenames generated by tmpnam + (and tempnam when it uses tmpnam's name space), + or tempnam (the two are separate). + L_ctermid How long an array to pass to `ctermid'. + L_cuserid How long an array to pass to `cuserid'. + FOPEN_MAX Minimum number of files that can be open at once. + FILENAME_MAX Maximum length of a filename. */ +#define __need_FOPEN_MAX +#include <bits/stdio_lim.h> +#undef __need_FOPEN_MAX -#define getc(stream) \ - (((stream)->bufpos >= (stream)->bufread) ? fgetc(stream): \ - (*(stream)->bufpos++)) -#define putchar(c) putc((c), stdout) -#define getchar() getc(stdin) +/* Standard streams. */ +extern FILE stdin[1]; /* Standard input stream. */ +extern FILE stdout[1]; /* Standard output stream. */ +extern FILE stderr[1]; /* Standard error output stream. */ +/* C89/C99 say they're macros. Make them happy. */ +#define stdin stdin +#define stdout stdout +#define stderr stderr -#define ferror(fp) (((fp)->mode&__MODE_ERR) != 0) -#define feof(fp) (((fp)->mode&__MODE_EOF) != 0) -#define clearerr(fp) ((fp)->mode &= ~(__MODE_EOF|__MODE_ERR),0) -#define fileno(fp) ((fp)->fd) -/* These two call malloc */ -#define setlinebuf(__fp) setvbuf((__fp), (char*)0, _IOLBF, 0) -extern int setvbuf __P((FILE*, char*, int, size_t)); +/* Remove file FILENAME. */ +extern int remove __P ((__const char *__filename)); +/* Rename file OLD to NEW. */ +extern int rename __P ((__const char *__old, __const char *__new)); -/* These don't */ -#define setbuf(__fp, __buf) setbuffer((__fp), (__buf), BUFSIZ) -extern void setbuffer __P((FILE*, char*, int)); -/* Read a character from STREAM. */ -extern int fgetc __P ((FILE *__stream)); -extern int getc __P ((FILE *__stream)); -/* Push a character back onto the input buffer of STREAM. */ -extern int ungetc __P ((int __c, FILE *__stream)); -/* Read a character from stdin. */ -extern int getchar __P ((void)); +/* Create a temporary file and open it read/write. */ +extern FILE *tmpfile __P ((void)); +#ifdef __USE_LARGEFILE64 +extern FILE *tmpfile64 __P ((void)); +#endif +/* Generate a temporary filename. */ +extern char *tmpnam __P ((char *__s)); + +#ifdef __USE_MISC +/* This is the reentrant variant of `tmpnam'. The only difference is + that it does not allow S to be NULL. */ +extern char *tmpnam_r __P ((char *__s)); +#endif + + +#if defined __USE_SVID || defined __USE_XOPEN +/* Generate a unique temporary filename using up to five characters of PFX + if it is not NULL. The directory to put this file in is searched for + as follows: First the environment variable "TMPDIR" is checked. + If it contains the name of a writable directory, that directory is used. + If not and if DIR is not NULL, that value is checked. If that fails, + P_tmpdir is tried and finally "/tmp". The storage for the filename + is allocated by `malloc'. */ +extern char *tempnam __P ((__const char *__dir, __const char *__pfx)); +#endif -/* Write a character to STREAM. */ -extern int fputc __P ((int __c, FILE *__stream)); -extern int putc __P ((int __c, FILE *__stream)); -/* Write a character to stdout. */ -extern int putchar __P ((int __c)); /* Close STREAM. */ extern int fclose __P ((FILE *__stream)); /* Flush STREAM, or all streams if STREAM is NULL. */ extern int fflush __P ((FILE *__stream)); -/* Get a newline-terminated string from stdin, removing the newline. - DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. */ -extern char *gets __P ((char *__s)); -/* Get a newline-terminated string of finite length from STREAM. */ -extern char *fgets __P ((char *__restrict __s, int __n, - FILE *__restrict __stream)); - - +/* Open a file and create a new stream for it. */ +extern FILE *fopen __P ((__const char *__restrict __filename, + __const char *__restrict __modes)); +/* Used internally to actuall open files */ extern FILE *__fopen __P((__const char *__restrict __filename, int __fd, FILE *__restrict __stream, __const char *__restrict __modes)); - -/* Open a file and create a new stream for it. */ #define fopen(__file, __mode) __fopen((__file), -1, (FILE*)0, (__mode)) /* Open a file, replacing an existing stream with it. */ +extern FILE *freopen __P ((__const char *__restrict __filename, + __const char *__restrict __modes, + FILE *__restrict __stream)); #define freopen(__file, __mode, __fp) __fopen((__file), -1, (__fp), (__mode)) + +#ifdef __USE_LARGEFILE64 +extern FILE *fopen64 __P ((__const char *__restrict __filename, + __const char *__restrict __modes)); +extern FILE *freopen64 __P ((__const char *__restrict __filename, + __const char *__restrict __modes, + FILE *__restrict __stream)); +#endif + +#ifdef __USE_POSIX /* Create a new stream that refers to an existing system file descriptor. */ +extern FILE *fdopen __P ((int __fd, __const char *__modes)); #define fdopen(__file, __mode) __fopen((char*)0, (__file), (FILE*)0, (__mode)) +#endif -/* Seek to a certain position on STREAM. */ -extern int fseek __P ((FILE *__stream, long int __off, int __whence)); -/* Return the current position of STREAM. */ -extern long int ftell __P ((FILE *__stream)); -/* Rewind to the beginning of STREAM. */ -extern void rewind __P ((FILE *__stream)); +/* If BUF is NULL, make STREAM unbuffered. + Else make it use buffer BUF, of size BUFSIZ. */ +extern void setbuf __P ((FILE *__restrict __stream, char *__restrict __buf)); +#define setbuf(__fp, __buf) setbuffer((__fp), (__buf), BUFSIZ) +/* Make STREAM use buffering mode MODE. + If BUF is not NULL, use N bytes of it for buffering; + else allocate an internal buffer N bytes long. */ +extern int setvbuf __P ((FILE *__restrict __stream, char *__restrict __buf, + int __modes, size_t __n)); -/* Write a string, followed by a newline, to stdout. */ -extern int puts __P ((__const char *__s)); -/* Write a string to STREAM. */ -extern int fputs __P ((__const char *__restrict __s, - FILE *__restrict __stream)); +#ifdef __USE_BSD +/* If BUF is NULL, make STREAM unbuffered. + Else make it use SIZE bytes of BUF for buffering. */ +extern void setbuffer __P ((FILE *__restrict __stream, char *__restrict __buf, + size_t __size)); + +/* Make STREAM line-buffered. */ +extern void setlinebuf __P ((FILE *__stream)); +#define setlinebuf(__fp) setvbuf((__fp), (char*)0, _IOLBF, 0) +#endif -/* Write formatted output to stdout. */ -extern int printf __P ((__const char *__restrict __format, ...)); /* Write formatted output to STREAM. */ extern int fprintf __P ((FILE *__restrict __stream, __const char *__restrict __format, ...)); +/* Write formatted output to stdout. */ +extern int printf __P ((__const char *__restrict __format, ...)); /* Write formatted output to S. */ extern int sprintf __P ((char *__restrict __s, __const char *__restrict __format, ...)); -/* Write formatted output to stdout from argument list ARG. */ -extern int vprintf __P ((__const char *__restrict __format, - va_list __arg)); /* Write formatted output to S from argument list ARG. */ extern int vfprintf __P ((FILE *__restrict __s, __const char *__restrict __format, va_list __arg)); +/* Write formatted output to stdout from argument list ARG. */ +extern int vprintf __P ((__const char *__restrict __format, + va_list __arg)); /* Write formatted output to S from argument list ARG. */ extern int vsprintf __P ((char *__restrict __s, __const char *__restrict __format, va_list __arg)); + /* Maximum chars of output to write in MAXLEN. */ extern int snprintf __P ((char *__restrict __s, size_t __maxlen, __const char *__restrict __format, ...)) __attribute__ ((__format__ (__printf__, 3, 4))); -/* Maximum chars of output to write in MAXLEN. */ + +extern int __vsnprintf __P ((char *__restrict __s, size_t __maxlen, + __const char *__restrict __format, + va_list __arg)) + __attribute__ ((__format__ (__printf__, 3, 0))); extern int vsnprintf __P ((char *__restrict __s, size_t __maxlen, __const char *__restrict __format, va_list __arg)) __attribute__ ((__format__ (__printf__, 3, 0))); - - +/* Read formatted input from STREAM. */ +extern int fscanf __P ((FILE *__restrict __stream, + __const char *__restrict __format, ...)); /* Read formatted input from stdin. */ extern int scanf __P ((__const char *__restrict __format, ...)); /* Read formatted input from S. */ extern int sscanf __P ((__const char *__restrict __s, __const char *__restrict __format, ...)); -/* Read formatted input from STREAM. */ -extern int fscanf __P ((FILE *__restrict __stream, - __const char *__restrict __format, ...)); -/* Read formatted input from stdin into argument list ARG. */ -extern int vscanf __P ((__const char *__restrict __format, va_list __arg)) - __attribute__ ((__format__ (__scanf__, 1, 0))); + /* Read formatted input from S into argument list ARG. */ -extern int vsscanf __P ((__const char *__restrict __s, +extern int vfscanf __P ((FILE *__restrict __s, __const char *__restrict __format, va_list __arg)) __attribute__ ((__format__ (__scanf__, 2, 0))); + +/* Read formatted input from stdin into argument list ARG. */ +extern int vscanf __P ((__const char *__restrict __format, va_list __arg)) + __attribute__ ((__format__ (__scanf__, 1, 0))); + /* Read formatted input from S into argument list ARG. */ -extern int vfscanf __P ((FILE *__restrict __s, +extern int vsscanf __P ((__const char *__restrict __s, __const char *__restrict __format, va_list __arg)) __attribute__ ((__format__ (__scanf__, 2, 0))); -/* Print a message describing the meaning of the value of errno. */ -extern void perror __P ((__const char *__s)); +/* Read a character from STREAM. */ +extern int fgetc __P ((FILE *__stream)); +extern int getc __P ((FILE *__stream)); + +/* Read a character from stdin. */ +extern int getchar __P ((void)); +#define getchar() getc(stdin) + +/* The C standard explicitly says this is a macro, so be that way */ +#define getc(stream) \ + (((stream)->bufpos >= (stream)->bufread) ? fgetc(stream): \ + (*(stream)->bufpos++)) + +/* Write a character to STREAM. */ +extern int fputc __P ((int __c, FILE *__stream)); +extern int putc __P ((int __c, FILE *__stream)); + +/* Write a character to stdout. */ +extern int putchar __P ((int __c)); +#define putchar(c) putc((c), stdout) + +/* The C standard explicitly says this can be a macro, so be that way */ +#define putc(c, stream) \ + (((stream)->bufpos >= (stream)->bufwrite) ? fputc((c), (stream)) \ + : (unsigned char) (*(stream)->bufpos++ = (c)) ) + +#if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN +/* Get a word (int) from STREAM. */ +extern int getw __P ((FILE *__stream)); + +/* Write a word (int) to STREAM. */ +extern int putw __P ((int __w, FILE *__stream)); +#endif + + +/* Get a newline-terminated string of finite length from STREAM. */ +extern char *fgets __P ((char *__restrict __s, int __n, + FILE *__restrict __stream)); + +/* Get a newline-terminated string from stdin, removing the newline. + DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. */ +extern char *gets __P ((char *__s)); + /* Read up to (and including) a DELIMITER from STREAM into *LINEPTR (and null-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or EOF. */ -extern size_t getdelim __P ((char **__restrict __lineptr, +extern ssize_t __getdelim __P ((char **__restrict __lineptr, + size_t *__restrict __n, int __delimiter, + FILE *__restrict __stream)); +extern ssize_t getdelim __P ((char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream)); + /* Like `getdelim', but reads up to a newline. */ -extern size_t getline __P ((char **__restrict __lineptr, +extern ssize_t getline __P ((char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream)); -#endif /* __STDIO_H */ +/* Write a string to STREAM. */ +extern int fputs __P ((__const char *__restrict __s, + FILE *__restrict __stream)); + +/* Write a string, followed by a newline, to stdout. */ +extern int puts __P ((__const char *__s)); + + +/* Push a character back onto the input buffer of STREAM. */ +extern int ungetc __P ((int __c, FILE *__stream)); + + +/* Read chunks of generic data from STREAM. */ +extern size_t fread __P ((void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __stream)); +/* Write chunks of generic data to STREAM. */ +extern size_t fwrite __P ((__const void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __s)); + +/* Seek to a certain position on STREAM. */ +extern int fseek __P ((FILE *__stream, long int __off, int __whence)); +/* Return the current position of STREAM. */ +extern long int ftell __P ((FILE *__stream)); +/* Rewind to the beginning of STREAM. */ +extern void rewind __P ((FILE *__stream)); + +/* The Single Unix Specification, Version 2, specifies an alternative, + more adequate interface for the two functions above which deal with + file offset. `long int' is not the right type. These definitions + are originally defined in the Large File Support API. */ + +/* Types needed in these functions. */ +#ifndef off_t +typedef __off_t off_t; +# define off_t off_t +#endif + +#if defined __USE_LARGEFILE64 && !defined off64_t +typedef __off64_t off64_t; +# define off64_t off64_t +#endif + + +/* Clear the error and EOF indicators for STREAM. */ +extern void clearerr __P ((FILE *__stream)); +#define clearerr(fp) ((fp)->mode &= ~(__MODE_EOF|__MODE_ERR),0) +/* Return the EOF indicator for STREAM. */ +extern int feof __P ((FILE *__stream)); +#define feof(fp) (((fp)->mode&__MODE_EOF) != 0) +/* Return the error indicator for STREAM. */ +extern int ferror __P ((FILE *__stream)); +#define ferror(fp) (((fp)->mode&__MODE_ERR) != 0) + +/* Print a message describing the meaning of the value of errno. */ +extern void perror __P ((__const char *__s)); + +/* These variables normally should not be used directly. The `strerror' + function provides all the needed functionality. */ +extern int sys_nerr; +extern __const char *__const sys_errlist[]; + +#ifdef __USE_POSIX +/* Return the system file descriptor for STREAM. */ +extern int fileno __P ((FILE *__stream)); +#define fileno(fp) ((fp)->fd) +#endif /* Use POSIX. */ + +#if (defined __USE_POSIX2 || defined __USE_SVID || defined __USE_BSD || \ + defined __USE_MISC) +/* Create a new stream connected to a pipe running the given command. */ +extern FILE *popen __P ((__const char *__command, __const char *__modes)); + +/* Close a stream opened by popen and return the status of its child. */ +extern int pclose __P ((FILE *__stream)); +#endif + + +#ifdef __USE_POSIX +/* Return the name of the controlling terminal. */ +extern char *ctermid __P ((char *__s)); +#endif /* Use POSIX. */ + + +#ifdef __USE_XOPEN +/* Return the name of the current user. */ +extern char *cuserid __P ((char *__s)); +#endif /* Use X/Open. */ + + +#if defined __USE_POSIX || defined __USE_MISC +/* These are defined in POSIX.1:1996. */ + +/* Acquire ownership of STREAM. */ +extern void flockfile __P ((FILE *__stream)); + +/* Try to acquire ownership of STREAM but do not block if it is not + possible. */ +extern int ftrylockfile __P ((FILE *__stream)); + +/* Relinquish the ownership granted for STREAM. */ +extern void funlockfile __P ((FILE *__stream)); +#endif /* POSIX || misc */ + +#if defined __USE_XOPEN && !defined __USE_GNU +/* The X/Open standard requires some functions and variables to be + declared here which do not belong into this header. But we have to + follow. In GNU mode we don't do this nonsense. */ +# define __need_getopt +# include <getopt.h> +#endif + +/* If we are compiling with optimizing read this file. It contains + several optizing inline functions and macros. */ +#ifdef __USE_EXTERN_INLINES +# include <bits/stdio.h> +#endif + +__END_DECLS + +#endif /* !_STDIO_H */ diff --git a/include/unistd.h b/include/unistd.h index 8da0ffe90..42031cd97 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -871,6 +871,7 @@ extern int brk __P ((__ptr_t __addr)); If successful, returns the address the previous end of data space (i.e. the beginning of the new space, if DELTA > 0); returns (void *) -1 for errors (with errno set). */ +#define ptrdiff_t int extern __ptr_t __sbrk __P ((ptrdiff_t __delta)); extern __ptr_t sbrk __P ((ptrdiff_t __delta)); #endif diff --git a/libc/stdio/Makefile b/libc/stdio/Makefile index fed74e216..49408c95a 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 popen.c perror.c remove.c getdelim.c getline.c +CSRC=dputs.c popen.c perror.c remove.c getdelim.c getline.c tmpnam.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3) $(COBJS) diff --git a/libc/stdio/getdelim.c b/libc/stdio/getdelim.c index 682ed2866..6f9ebb4fb 100644 --- a/libc/stdio/getdelim.c +++ b/libc/stdio/getdelim.c @@ -34,18 +34,28 @@ NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null delimiter), or -1 on error or EOF. */ -size_t getdelim(char **linebuf, size_t *linebufsz, int delimiter, FILE *file) +ssize_t getdelim(char **linebuf, size_t *linebufsz, int delimiter, FILE *file) { static const int GROWBY = 80; /* how large we will grow strings by */ int ch; int idx = 0; - if (file == NULL || linebuf==NULL || *linebuf == NULL || linebufsz == NULL) { + if ((file == NULL || linebuf==NULL || *linebuf == NULL || *linebufsz == 0) + && !(*linebuf == NULL && *linebufsz ==0 )) { errno=EINVAL; return -1; } + if (*linebuf == NULL && *linebufsz == 0){ + *linebuf = malloc(GROWBY); + if (!*linebuf) { + errno=ENOMEM; + return -1; + } + *linebufsz += GROWBY; + } + while (1) { ch = fgetc(file); if (ch == EOF) @@ -65,6 +75,8 @@ size_t getdelim(char **linebuf, size_t *linebufsz, int delimiter, FILE *file) if (idx != 0) (*linebuf)[idx] = 0; + else if ( ch == EOF ) + return -1; return idx; } diff --git a/libc/stdio/getline.c b/libc/stdio/getline.c index c6896fca7..ecc48ffac 100644 --- a/libc/stdio/getline.c +++ b/libc/stdio/getline.c @@ -25,7 +25,7 @@ #include <stdio.h> /* Basically getdelim() with the delimiter hard wired to '\n' */ -size_t getline(char **linebuf, size_t *n, FILE *file) +ssize_t getline(char **linebuf, size_t *n, FILE *file) { return (getdelim (linebuf, n, '\n', file)); } diff --git a/libc/stdio/popen.c b/libc/stdio/popen.c index a07c411eb..7a00e570f 100644 --- a/libc/stdio/popen.c +++ b/libc/stdio/popen.c @@ -4,16 +4,14 @@ #include <sys/wait.h> -FILE *popen(command, rw) -char *command; -char *rw; +FILE *popen (const char *command, const char *modes) { int pipe_fd[2]; int pid, reading; if (pipe(pipe_fd) < 0) return NULL; - reading = (rw[0] == 'r'); + reading = (modes[0] == 'r'); pid = vfork(); if (pid < 0) { @@ -34,11 +32,10 @@ char *rw; } close(pipe_fd[reading]); - return fdopen(pipe_fd[!reading], rw); + return fdopen(pipe_fd[!reading], modes); } -int pclose(fd) -FILE *fd; +int pclose(FILE *fd) { int waitstat; diff --git a/libc/stdio/scanf.c b/libc/stdio/scanf.c index 8ce590684..51d30cdde 100644 --- a/libc/stdio/scanf.c +++ b/libc/stdio/scanf.c @@ -3,14 +3,7 @@ #include <stdio.h> #include <ctype.h> #include <string.h> - -#ifdef __STDC__ #include <stdarg.h> -#define va_strt va_start -#else -#include <varargs.h> -#define va_strt(p,i) va_start(p) -#endif #ifdef L_scanf #ifdef __STDC__ @@ -24,7 +17,7 @@ va_dcl va_list ptr; int rv; - va_strt(ptr, fmt); + va_start(ptr, fmt); rv = vfscanf(stdin, fmt, ptr); va_end(ptr); return rv; @@ -49,7 +42,7 @@ va_dcl va_list ptr; int rv; - va_strt(ptr, fmt); + va_start(ptr, fmt); string->bufpos = (unsigned char *) ((void *) sp); rv = vfscanf(string, fmt, ptr); va_end(ptr); @@ -70,7 +63,7 @@ va_dcl va_list ptr; int rv; - va_strt(ptr, fmt); + va_start(ptr, fmt); rv = vfscanf(fp, fmt, ptr); va_end(ptr); return rv; diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c index b34631154..6c8c69380 100644 --- a/libc/stdio/stdio.c +++ b/libc/stdio/stdio.c @@ -778,7 +778,7 @@ FILE *fp; void setbuffer(fp, buf, size) FILE *fp; char *buf; -int size; +size_t size; { fflush(fp); diff --git a/libc/stdio/tmpnam.c b/libc/stdio/tmpnam.c new file mode 100644 index 000000000..3a3ef67ca --- /dev/null +++ b/libc/stdio/tmpnam.c @@ -0,0 +1,68 @@ +/* vi: set sw=4 ts=4: */ +/* + * tmpnam for uClibc + * + * Copyright (C) 2000 by David Whedon <dwhedon@gordian.com> + * + * 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 Library General Public License + * for more details. + * + * You should have received a copy of the GNU Library 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 + * + * Modified by Erik Andersen <anderse@debian.org> to be reentrant for + * the case when S != NULL... + */ + + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> + + +static char tmpnam_buffer[L_tmpnam]; + + +/* Generate a unique filename in /tmp */ +char * tmpnam (char *s) +{ + int num __attribute__ ((unused)); /* UNINITIALIZED, so we get whatever crap + happens to be in memory, producing (in theory) + pseudo-random tmpname results... */ + int n2; + char buf[L_tmpnam], *ptr; + struct stat statbuf; + unsigned char l, i; + + ptr=s ? s : buf; + + l = snprintf(ptr, L_tmpnam, "%s/tmp.", P_tmpdir); + +again: + n2 = num; + for (i = l ; i < l + 6; i++) { + ptr[i] = '0' + n2 % 10; + n2 /= 10; + } + + if (stat (ptr, &statbuf) == 0){ + num++; + goto again; + } + + if (s == NULL) + return (char *) memcpy (tmpnam_buffer, ptr, L_tmpnam); + + return ptr; +} + diff --git a/libc/stdio/tmpnam_r.c b/libc/stdio/tmpnam_r.c new file mode 100644 index 000000000..5533a399f --- /dev/null +++ b/libc/stdio/tmpnam_r.c @@ -0,0 +1,43 @@ +/* vi: set sw=4 ts=4: */ +/* + * tmpnam for uClibc + * + * Copyright (C) 2000 by Lineo, inc. Written by Erik Andersen + * <andersen@lineo.com>, <andersee@debian.org> + * + * 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 Library General Public License + * for more details. + * + * You should have received a copy of the GNU Library 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 + * + * Modified by Erik Andersen <anderse@debian.org> to be reentrant for + * the case when S != NULL... + */ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> + + +/* Generate a unique filename in /tmp. + * If s is NULL return NULL, making this function thread safe. */ + +char * tmpnam_r (char *s) +{ + if (s == NULL) + return NULL; + else + return (tmpnam(s)); +} + diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile index 7f8ae1505..b658df65f 100644 --- a/libc/sysdeps/linux/common/Makefile +++ b/libc/sysdeps/linux/common/Makefile @@ -28,9 +28,8 @@ LIBC=$(TOPDIR)libc.a CSRC =closedir.o dirfd.o getdents.o getdnnm.o gethstnm.o getpagesize.o \ isatty.o kernel_version.o mkfifo.o opendir.o readdir.o rewinddir.o \ - seekdir.o setegid.o seteuid.o setpgrp.o statfix.o tcgetatr.o tell.o \ - telldir.o wait.o wait3.o _xmknod.o _fxstat.o _lxstat.o _xstat.o \ - libc_init.o + seekdir.o setegid.o seteuid.o setpgrp.o statfix.o tell.o telldir.o \ + wait.o wait3.o _xmknod.o _fxstat.o _lxstat.o _xstat.o libc_init.o tcgetatr.o COBJS=$(patsubst %.c,%.o, $(CSRC)) diff --git a/libc/unistd/getopt.c b/libc/unistd/getopt.c index 70d20b06b..83a9ad69c 100644 --- a/libc/unistd/getopt.c +++ b/libc/unistd/getopt.c @@ -34,10 +34,7 @@ int c; /* defective option letter */ return '?'; /* erroneous-option marker */ } -int getopt(argc, argv, optstring) /* returns letter, '?', EOF */ -int argc; /* argument count from main */ -char *argv[]; /* argument vector from main */ -char *optstring; /* allowed args, e.g. "ab:c" */ +int getopt (int argc, char *const *argv, const char *optstring) { static int sp = 1; /* position within argument */ register int osp; /* saved `sp' for param test */ diff --git a/test/string/Makefile b/test/string/Makefile index a771f3638..bf847f66e 100644 --- a/test/string/Makefile +++ b/test/string/Makefile @@ -5,9 +5,12 @@ include $(TOPDIR)Rules.mak LSFLAGS = $(shell if ls -sh >/dev/null 2>&1; \ then echo "-sh"; else echo "-s" ; fi) -XCFLAGS = -Wall -Os -fomit-frame-pointer -fno-builtin -nostdinc \ +#XCFLAGS = -Wall -Os -fomit-frame-pointer -fno-builtin -nostdinc \ +# -I$(TOPDIR)include -I/usr/include/linux +#XLDFLAGS = -nostdlib -s -gc-sections +XCFLAGS = -Wall -g -fno-builtin -nostdinc \ -I$(TOPDIR)include -I/usr/include/linux -XLDFLAGS = -nostdlib -s -gc-sections +XLDFLAGS = -nostdlib -gc-sections EXTRA_LIBS=$(TOPDIR)libc.a -lgcc YCFLAGS = -Wall -Os -fomit-frame-pointer |