summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libstdio
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio')
-rw-r--r--mdk-stage1/dietlibc/libstdio/fclose.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdglue.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdglue2.c43
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdopen.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdprintf.c13
-rw-r--r--mdk-stage1/dietlibc/libstdio/feof.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/fflush.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c (renamed from mdk-stage1/dietlibc/libstdio/fgetc.c)18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgetpos.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgets.c4
-rw-r--r--mdk-stage1/dietlibc/libstdio/fopen.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fprintf.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fputc.c19
-rw-r--r--mdk-stage1/dietlibc/libstdio/fputc_unlocked.c20
-rw-r--r--mdk-stage1/dietlibc/libstdio/fread.c55
-rw-r--r--mdk-stage1/dietlibc/libstdio/fscanf.c14
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseek.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseeko.c10
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseeko64.c12
-rw-r--r--mdk-stage1/dietlibc/libstdio/fsetpos.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftell.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftello.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftello64.c9
-rw-r--r--mdk-stage1/dietlibc/libstdio/fwrite.c28
-rw-r--r--mdk-stage1/dietlibc/libstdio/printf.c20
-rw-r--r--mdk-stage1/dietlibc/libstdio/puts.c16
-rw-r--r--mdk-stage1/dietlibc/libstdio/scanf.c14
-rw-r--r--mdk-stage1/dietlibc/libstdio/setvbuf.c32
-rw-r--r--mdk-stage1/dietlibc/libstdio/stderr.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdin.c26
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdout.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/tmpfile.c12
-rw-r--r--mdk-stage1/dietlibc/libstdio/ungetc.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfdprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vfscanf.c11
-rw-r--r--mdk-stage1/dietlibc/libstdio/vprintf.c15
-rw-r--r--mdk-stage1/dietlibc/libstdio/vscanf.c10
38 files changed, 412 insertions, 229 deletions
diff --git a/mdk-stage1/dietlibc/libstdio/fclose.c b/mdk-stage1/dietlibc/libstdio/fclose.c
index a955c6086..491ed2522 100644
--- a/mdk-stage1/dietlibc/libstdio/fclose.c
+++ b/mdk-stage1/dietlibc/libstdio/fclose.c
@@ -4,14 +4,9 @@
int fclose(FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
FILE *f,*fl;
-#endif
- if (!stream)
- return EOF;
fflush(stream);
res=close(stream->fd);
-#ifdef WANT_BUFFERED_STDIO
for (fl=0,f=__stdio_root; f; fl=f,f=f->next)
if (f==stream) {
if (fl)
@@ -20,7 +15,8 @@ int fclose(FILE *stream) {
__stdio_root=f->next;
break;
}
-#endif
+ if ((!(stream->flags&STATICBUF))&&(stream->buf))
+ free(stream->buf);
free(stream);
return res;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fdglue.c b/mdk-stage1/dietlibc/libstdio/fdglue.c
index 1c3918f1f..9542711e2 100644
--- a/mdk-stage1/dietlibc/libstdio/fdglue.c
+++ b/mdk-stage1/dietlibc/libstdio/fdglue.c
@@ -1,13 +1,9 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
-
-#ifdef WANT_BUFFERED_STDIO
-extern int __stdio_atexit;
-extern void __stdio_flushall();
-#endif
+#include <pthread.h>
+#include "dietstdio.h"
int __stdio_parse_mode(const char *mode) {
int f=0;
@@ -24,29 +20,3 @@ int __stdio_parse_mode(const char *mode) {
}
}
-FILE* __stdio_init_file(int fd) {
- FILE *tmp=(FILE*)malloc(sizeof(FILE));
- if (!tmp) {
- close(fd);
- errno=ENOMEM;
- return 0;
- }
- tmp->fd=fd;
-#ifdef WANT_BUFFERED_STDIO
- tmp->bm=0;
- tmp->bs=0;
-#endif
-#ifdef WANT_UNGETC
- tmp->ungotten = 0;
-#endif
- tmp->flags=0;
-#ifdef WANT_BUFFERED_STDIO
- if (__stdio_atexit==0) {
- __stdio_atexit=1;
- atexit(__stdio_flushall);
- }
- tmp->next=__stdio_root;
- __stdio_root=tmp;
-#endif
- return tmp;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fdglue2.c b/mdk-stage1/dietlibc/libstdio/fdglue2.c
new file mode 100644
index 000000000..b96e4c5b8
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fdglue2.c
@@ -0,0 +1,43 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include "dietstdio.h"
+#include <stdlib.h>
+#include <pthread.h>
+
+extern int __stdio_atexit;
+
+FILE* __stdio_init_file_nothreads(int fd,int closeonerror);
+FILE* __stdio_init_file_nothreads(int fd,int closeonerror) {
+ FILE *tmp=(FILE*)malloc(sizeof(FILE));
+ if (!tmp) goto err_out;
+ tmp->buf=(char*)malloc(BUFSIZE);
+ if (!tmp->buf) {
+ free(tmp);
+err_out:
+ if (closeonerror) close(fd);
+ errno=ENOMEM;
+ return 0;
+ }
+ tmp->fd=fd;
+ tmp->bm=0;
+ tmp->bs=0;
+ tmp->buflen=BUFSIZE;
+ {
+ struct stat st;
+ fstat(fd,&st);
+ tmp->flags=(S_ISFIFO(st.st_mode))?FDPIPE:0;
+ }
+ tmp->popen_kludge=0;
+ if (__stdio_atexit==0) {
+ __stdio_atexit=1;
+ atexit(__stdio_flushall);
+ }
+ tmp->next=__stdio_root;
+ __stdio_root=tmp;
+ tmp->ungotten=0;
+ return tmp;
+}
+
+FILE* __stdio_init_file(int fd,int closeonerror) __attribute__((weak,alias("__stdio_init_file_nothreads")));
diff --git a/mdk-stage1/dietlibc/libstdio/fdopen.c b/mdk-stage1/dietlibc/libstdio/fdopen.c
index aee14fb0c..748b716eb 100644
--- a/mdk-stage1/dietlibc/libstdio/fdopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fdopen.c
@@ -1,21 +1,13 @@
+#include <errno.h>
+#include "dietfeatures.h"
#include <sys/types.h>
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
-int __stdio_parse_mode(const char *mode);
-FILE* __stdio_init_file(int fd);
-
-FILE *fdopen (int filedes, const char *mode) {
+FILE *fdopen(int filedes, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
- int fd;
f=__stdio_parse_mode(mode);
- if ((fd=filedes)<0) return 0;
- {
- FILE * ret = __stdio_init_file(fd);
- ret->flags |= UNSEEKABLE;
- return ret;
- }
+ if (filedes<0) { errno=EBADF; return 0; }
+ return __stdio_init_file(filedes,0);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fdprintf.c b/mdk-stage1/dietlibc/libstdio/fdprintf.c
new file mode 100644
index 000000000..f9fc7a3b4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fdprintf.c
@@ -0,0 +1,13 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int fdprintf(int fd,const char *format,...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr,format);
+ n=vfdprintf(fd,format,arg_ptr);
+ va_end(arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/feof.c b/mdk-stage1/dietlibc/libstdio/feof.c
index b7e86fe3b..bf2267fcf 100644
--- a/mdk-stage1/dietlibc/libstdio/feof.c
+++ b/mdk-stage1/dietlibc/libstdio/feof.c
@@ -1,9 +1,7 @@
#include <dietstdio.h>
int feof(FILE *stream) {
-#ifdef WANT_UNGETC
/* yuck!!! */
if (stream->ungotten) return 0;
-#endif
return (stream->flags&EOFINDICATOR);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fflush.c b/mdk-stage1/dietlibc/libstdio/fflush.c
index 7078e04f4..e0e23b3ba 100644
--- a/mdk-stage1/dietlibc/libstdio/fflush.c
+++ b/mdk-stage1/dietlibc/libstdio/fflush.c
@@ -1,21 +1,16 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <stdlib.h>
#include "dietwarning.h"
+#include "dietstdio.h"
FILE *__stdio_root;
-#ifdef WANT_BUFFERED_STDIO
int __stdio_atexit=0;
-void __stdio_flushall() {
+void __stdio_flushall(void) {
fflush(0);
}
-extern int __fflush_stdin();
-extern int __fflush_stdout();
-extern int __fflush_stderr();
-
int fflush(FILE *stream) {
if (stream==0) {
int res;
@@ -28,15 +23,20 @@ int fflush(FILE *stream) {
res=-1;
return res;
}
+// if (stream->flags&NOBUF) return 0;
if (stream->flags&BUFINPUT) {
register int tmp;
- if ((tmp=stream->bm-stream->bs)) lseek(stream->fd,tmp,SEEK_CUR);
- } else
- if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=stream->bm) {
+ if ((tmp=stream->bm-stream->bs)) {
+ lseek(stream->fd,tmp,SEEK_CUR);
+ }
+ stream->bs=stream->bm=0;
+ } else {
+ if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=(int)stream->bm) {
stream->flags|=ERRORINDICATOR;
return -1;
}
- stream->bm=0;
+ stream->bm=0;
+ }
return 0;
}
@@ -50,13 +50,15 @@ int __fflush4(FILE *stream,int next) {
stream->flags=(stream->flags&~BUFINPUT)|next;
return res;
}
+ if (stream->fd==0) __fflush_stdout();
return 0;
}
-#else
-int fflush(FILE *stream) {
- return 0;
+/* Internal function, has no prototype.
+ * This is defined here because of the weak symbol ELF semantics */
+int __stdio_outs(const char *s,size_t len);
+int __stdio_outs(const char *s,size_t len) {
+ return fwrite(s,1,(size_t)len,stdout)==len?1:0;
}
-#endif
-link_warning("fflush","warning: your code uses stdio (several kilobytes of bloat).")
+link_warning("fflush","warning: your code uses stdio (7+k bloat).")
diff --git a/mdk-stage1/dietlibc/libstdio/fgetc.c b/mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c
index 90d83961a..5136c8df1 100644
--- a/mdk-stage1/dietlibc/libstdio/fgetc.c
+++ b/mdk-stage1/dietlibc/libstdio/fgetc_unlocked.c
@@ -1,22 +1,17 @@
#include "dietstdio.h"
#include <unistd.h>
-extern int feof(FILE *stream);
-
-int fgetc(FILE *stream) {
+int fgetc_unlocked(FILE *stream) {
unsigned char c;
-#ifdef WANT_UNGETC
if (stream->ungotten) {
stream->ungotten=0;
return stream->ungetbuf;
}
-#endif
if (feof(stream))
return EOF;
-#ifdef WANT_BUFFERED_STDIO
if (__fflush4(stream,BUFINPUT)) return EOF;
if (stream->bm>=stream->bs) {
- int len=read(stream->fd,stream->buf,BUFSIZE);
+ int len=read(stream->fd,stream->buf,stream->buflen);
if (len==0) {
stream->flags|=EOFINDICATOR;
return EOF;
@@ -30,11 +25,6 @@ int fgetc(FILE *stream) {
c=stream->buf[stream->bm];
++stream->bm;
return c;
-#else
- if (read(stream->fd,&c,1)!=1) {
- stream->flags|=ERRORINDICATOR;
- return EOF;
- }
- return c;
-#endif
}
+
+int fgetc(FILE* stream) __attribute__((weak,alias("fgetc_unlocked")));
diff --git a/mdk-stage1/dietlibc/libstdio/fgetpos.c b/mdk-stage1/dietlibc/libstdio/fgetpos.c
new file mode 100644
index 000000000..d58b6fa5b
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fgetpos.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int fgetpos(FILE *stream, fpos_t *pos) {
+ long l=ftell(stream);
+ if (l==-1) return -1;
+ *pos=l;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fgets.c b/mdk-stage1/dietlibc/libstdio/fgets.c
index c613d452d..d2ce4195d 100644
--- a/mdk-stage1/dietlibc/libstdio/fgets.c
+++ b/mdk-stage1/dietlibc/libstdio/fgets.c
@@ -1,11 +1,9 @@
#include "dietstdio.h"
-extern int ferror(FILE *stream);
-
char *fgets(char *s, int size, FILE *stream) {
char *orig=s;
int l;
- for (l=size; l>0;) {
+ for (l=size; l>1;) {
int c=fgetc(stream);
if (c==EOF) break;
*s=c;
diff --git a/mdk-stage1/dietlibc/libstdio/fopen.c b/mdk-stage1/dietlibc/libstdio/fopen.c
index aac17be42..3d9c28198 100644
--- a/mdk-stage1/dietlibc/libstdio/fopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fopen.c
@@ -2,13 +2,7 @@
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
extern int __stdio_atexit;
-extern void __stdio_flushall();
-
-extern int __stdio_parse_mode(const char *mode);
-extern FILE* __stdio_init_file(int fd);
FILE *fopen (const char *path, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
@@ -17,5 +11,5 @@ FILE *fopen (const char *path, const char *mode) {
f=__stdio_parse_mode(mode);
if ((fd=open(path,f,0666))<0)
return 0;
- return __stdio_init_file(fd);
+ return __stdio_init_file(fd,1);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fprintf.c b/mdk-stage1/dietlibc/libstdio/fprintf.c
index 237fd1e51..6b3849a33 100644
--- a/mdk-stage1/dietlibc/libstdio/fprintf.c
+++ b/mdk-stage1/dietlibc/libstdio/fprintf.c
@@ -1,23 +1,13 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
-extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int fprintf(FILE *f,const char *format,...) {
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
- va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
- va_end (arg_ptr);
- fwrite(printf_buf,n,1,f);
+ va_start(arg_ptr,format);
+ n=vfprintf(f,format,arg_ptr);
+ va_end(arg_ptr);
return n;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fputc.c b/mdk-stage1/dietlibc/libstdio/fputc.c
deleted file mode 100644
index b816f7c4d..000000000
--- a/mdk-stage1/dietlibc/libstdio/fputc.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <dietstdio.h>
-#ifndef WANT_BUFFERED_STDIO
-#include <unistd.h>
-#endif
-
-int fputc(int c, FILE *stream) {
-#ifdef WANT_BUFFERED_STDIO
- if (__fflush4(stream,0)) return EOF;
- if (stream->bm>=BUFSIZE-1)
- if (fflush(stream)) return EOF;
- stream->buf[stream->bm]=c;
- ++stream->bm;
- if ((stream->flags&BUFLINEWISE) && c=='\n') /* puke */
- if (fflush(stream)) return EOF;
-#else
- write(stream->fd,&c,1);
-#endif
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c b/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c
new file mode 100644
index 000000000..6441c5741
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fputc_unlocked.c
@@ -0,0 +1,20 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+int fputc_unlocked(int c, FILE *stream) {
+ if (__fflush4(stream,0)) return EOF;
+ if (stream->bm>=stream->buflen-1)
+ if (fflush(stream)) return EOF;
+ if (stream->flags&NOBUF) {
+ if (write(stream->fd,&c,1) != 1) return EOF;
+ return 0;
+ }
+ stream->buf[stream->bm]=c;
+ ++stream->bm;
+ if (((stream->flags&BUFLINEWISE) && c=='\n') ||
+ ((stream->flags&NOBUF))) /* puke */
+ if (fflush(stream)) return EOF;
+ return 0;
+}
+
+int fputc(int c,FILE* stream) __attribute__((weak,alias("fputc_unlocked")));
diff --git a/mdk-stage1/dietlibc/libstdio/fread.c b/mdk-stage1/dietlibc/libstdio/fread.c
index 29afa1489..813a98fb2 100644
--- a/mdk-stage1/dietlibc/libstdio/fread.c
+++ b/mdk-stage1/dietlibc/libstdio/fread.c
@@ -4,48 +4,43 @@
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
unsigned long i,j;
j=size*nmemb;
-#ifdef WANT_UNGETC
+ i=0;
+
+ if (!j || j/nmemb!=size) return 0;
if (stream->ungotten) {
+ stream->ungotten=0;
*(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
+ ++i;
}
if (!j) return 1;
+
+#ifdef WANT_FREAD_OPTIMIZATION
+ if ( !(stream->flags&FDPIPE) && (j>stream->buflen)) {
+ size_t tmp=j-i;
+ int res;
+ fflush(stream);
+ while ((res=read(stream->fd,ptr+i,tmp))<(int)tmp) {
+ if (res==-1) {
+ stream->flags|=ERRORINDICATOR;
+ goto exit;
+ } else if (!res) {
+ stream->flags|=EOFINDICATOR;
+ goto exit;
+ }
+ i+=res; tmp-=res;
+ }
+ return nmemb;
+ }
#endif
- for (i=0; i<j; ++i) {
+ for (; i<j; ++i) {
res=fgetc(stream);
if (res==EOF)
+exit:
return i/size;
else
((unsigned char*)ptr)[i]=(unsigned char)res;
}
return nmemb;
-#else
-#ifdef WANT_UNGETC
- unsigned long j=size*nmemb;
-#endif
- fflush(stream);
-#ifdef WANT_UNGETC
- if (stream->ungotten) {
- *(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
- }
- if (!j) return 1;
- res=read(stream->fd,ptr,j);
-#else
- res=read(stream->fd,ptr,size*nmemb);
-#endif
- if (res<0) {
- stream->flags|=ERRORINDICATOR;
- return 0;
- } else if (res<size*nmemb)
- if (!(stream->flags & UNSEEKABLE)
- || ((stream->flags & UNSEEKABLE) && res == 0))
- stream->flags|=EOFINDICATOR;
- return res/size;
-#endif
}
diff --git a/mdk-stage1/dietlibc/libstdio/fscanf.c b/mdk-stage1/dietlibc/libstdio/fscanf.c
new file mode 100644
index 000000000..07f477462
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fscanf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int fscanf(FILE *stream, const char *format, ...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vfscanf(stream,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fseek.c b/mdk-stage1/dietlibc/libstdio/fseek.c
index 5bb96bc6e..a49230f0a 100644
--- a/mdk-stage1/dietlibc/libstdio/fseek.c
+++ b/mdk-stage1/dietlibc/libstdio/fseek.c
@@ -1,11 +1,10 @@
#include <dietstdio.h>
#include <unistd.h>
-long fseek(FILE *stream, long offset, int whence) {
+int fseek(FILE *stream, long offset, int whence) {
fflush(stream);
-#ifdef WANT_BUFFERED_STDIO
stream->bm=0; stream->bs=0;
-#endif
stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
- return (lseek(stream->fd,offset,whence));
+ stream->ungotten=0;
+ return lseek(stream->fd,offset,whence)!=-1?0:-1;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fseeko.c b/mdk-stage1/dietlibc/libstdio/fseeko.c
new file mode 100644
index 000000000..6459a6ff4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fseeko.c
@@ -0,0 +1,10 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+int fseeko(FILE *stream, off_t offset, int whence) {
+ fflush(stream);
+ stream->bm=0; stream->bs=0;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
+ stream->ungotten=0;
+ return lseek(stream->fd,offset,whence)!=-1?0:-1;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/fseeko64.c b/mdk-stage1/dietlibc/libstdio/fseeko64.c
new file mode 100644
index 000000000..3b00596a1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fseeko64.c
@@ -0,0 +1,12 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+#ifndef __NO_STAT64
+int fseeko64(FILE *stream, off64_t offset, int whence) {
+ fflush(stream);
+ stream->bm=0; stream->bs=0;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
+ stream->ungotten=0;
+ return lseek64(stream->fd,offset,whence)!=-1?0:-1;
+}
+#endif
diff --git a/mdk-stage1/dietlibc/libstdio/fsetpos.c b/mdk-stage1/dietlibc/libstdio/fsetpos.c
new file mode 100644
index 000000000..336135fff
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/fsetpos.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int fsetpos(FILE *stream, fpos_t *pos) {
+ if (fseek(stream,*pos,SEEK_SET)==-1)
+ return -1;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ftell.c b/mdk-stage1/dietlibc/libstdio/ftell.c
index 42d2c9f26..48f74858a 100644
--- a/mdk-stage1/dietlibc/libstdio/ftell.c
+++ b/mdk-stage1/dietlibc/libstdio/ftell.c
@@ -3,5 +3,5 @@
long ftell(FILE *stream) {
fflush(stream);
- return (lseek(stream->fd,0,SEEK_CUR));
+ return (lseek(stream->fd,0,SEEK_CUR)-stream->ungotten);
}
diff --git a/mdk-stage1/dietlibc/libstdio/ftello.c b/mdk-stage1/dietlibc/libstdio/ftello.c
new file mode 100644
index 000000000..9d36318e2
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/ftello.c
@@ -0,0 +1,7 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+off_t ftello(FILE *stream) {
+ fflush(stream);
+ return (lseek(stream->fd,0,SEEK_CUR));
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ftello64.c b/mdk-stage1/dietlibc/libstdio/ftello64.c
new file mode 100644
index 000000000..bda7a7de4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/ftello64.c
@@ -0,0 +1,9 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+#ifndef __NO_STAT64
+off64_t ftello64(FILE *stream) {
+ fflush(stream);
+ return (lseek64(stream->fd,0ull,SEEK_CUR));
+}
+#endif
diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c
index 5691661a5..e2536ccfb 100644
--- a/mdk-stage1/dietlibc/libstdio/fwrite.c
+++ b/mdk-stage1/dietlibc/libstdio/fwrite.c
@@ -1,30 +1,28 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <errno.h>
-size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) {
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
- long len=size*nmemb;
+ unsigned long len=size*nmemb;
long i;
- if (len>BUFSIZE || (stream->flags&NOBUF)) {
- if (!(stream->flags&NOBUF)) fflush(stream);
- res=write(stream->fd,ptr,size*nmemb);
+ if (!nmemb || len/nmemb!=size) return 0; /* check for integer overflow */
+ if (len>stream->buflen || (stream->flags&NOBUF)) {
+ fflush(stream);
+ do {
+ res=write(stream->fd,ptr,size*nmemb);
+ } while (res==-1 && errno==EINTR);
} else {
register const unsigned char *c=ptr;
- for (i=size*nmemb; i>0; --i,++c)
- if (fputc(*c,stream)) {
- res=-1;
- break;
- }
- res=size*nmemb;
+ for (i=len; i>0; --i,++c)
+ if (fputc(*c,stream)) { res=len-i; goto abort; }
+ res=len;
}
-#else
- res=write(stream->fd,ptr,size*nmemb);
-#endif
if (res<0) {
stream->flags|=ERRORINDICATOR;
return 0;
}
+abort:
return size?res/size:0;
}
diff --git a/mdk-stage1/dietlibc/libstdio/printf.c b/mdk-stage1/dietlibc/libstdio/printf.c
index 571420dc3..5af172c58 100644
--- a/mdk-stage1/dietlibc/libstdio/printf.c
+++ b/mdk-stage1/dietlibc/libstdio/printf.c
@@ -1,29 +1,15 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include "dietstdio.h"
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int printf(const char *format,...)
{
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
-#ifdef WANT_BUFFERED_STDIO
- fwrite(printf_buf,n,1,stdout);
-#else
- write(1,printf_buf,n);
-#endif
- va_end (arg_ptr);
+ n=vprintf(format, arg_ptr);
+ va_end(arg_ptr);
return n;
}
diff --git a/mdk-stage1/dietlibc/libstdio/puts.c b/mdk-stage1/dietlibc/libstdio/puts.c
new file mode 100644
index 000000000..b1da01f9d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/puts.c
@@ -0,0 +1,16 @@
+#include <unistd.h>
+#include <string.h>
+#include "dietstdio.h"
+#include "dietfeatures.h"
+
+int __cheap_outs(const char *s,size_t len);
+int __cheap_outs(const char *s,size_t len) {
+ return (size_t)write(1,s,len)==len?1:0;
+}
+
+int __stdio_outs(const char *s,size_t len) __attribute__((weak,alias("__cheap_outs")));
+
+int puts(const char *s) {
+ return (__stdio_outs(s,strlen(s)) && __stdio_outs("\n",1))?0:-1;
+}
+
diff --git a/mdk-stage1/dietlibc/libstdio/scanf.c b/mdk-stage1/dietlibc/libstdio/scanf.c
new file mode 100644
index 000000000..589c19f41
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/scanf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int scanf(const char *format, ...) {
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vfscanf(stdin,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/libstdio/setvbuf.c b/mdk-stage1/dietlibc/libstdio/setvbuf.c
index d0b1b7640..b8b50addf 100644
--- a/mdk-stage1/dietlibc/libstdio/setvbuf.c
+++ b/mdk-stage1/dietlibc/libstdio/setvbuf.c
@@ -1,18 +1,34 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <stdlib.h>
#include "dietwarning.h"
-int setvbuf(FILE *stream, char *buf, int flags , size_t size) {
-#ifdef WANT_BUFFERED_STDIO
+static int set_flags (FILE *stream, int flags) {
switch (flags) {
- case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
- case _IOLBF: stream->flags = (stream->flags & ~(BUFLINEWISE|NOBUF)) | BUFLINEWISE; break;
- case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
- default: return -1;
+ case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
+ case _IOLBF: stream->flags = (stream->flags & ~(NOBUF)) | BUFLINEWISE; break;
+ case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
+ default: return -1;
}
-#endif
return 0;
}
-link_warning("setvbuf","setvbuf does not implement changing the buffer in diet libc.")
+int setvbuf(FILE *stream, char *buf, int flags, size_t size) {
+ if (buf) {
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=buf;
+ }
+ else {
+ char *tmp;
+ if (!size) {
+ return set_flags(stream,flags);
+ }
+ if (!(tmp=malloc(size))) return -1;
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=tmp;
+ }
+ stream->buflen=size;
+ stream->bm=stream->bs=0;
+ return set_flags(stream,flags);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stderr.c b/mdk-stage1/dietlibc/libstdio/stderr.c
index a82b1b727..a9a34fd7e 100644
--- a/mdk-stage1/dietlibc/libstdio/stderr.c
+++ b/mdk-stage1/dietlibc/libstdio/stderr.c
@@ -1,13 +1,22 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stderr = { 2, NOBUF, 0, 0 };
-
-int __fflush_stderr() {
- return fflush(stderr);
-}
-#else
-static FILE __stderr = { 2, 0 };
+static FILE __stderr = {
+ .fd=2,
+ .flags=NOBUF,
+ .bs=0, .bm=0,
+ .buflen=0,
+ .buf=0,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stderr=&__stderr;
+
+int __fflush_stderr(void) {
+ return fflush(stderr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdin.c b/mdk-stage1/dietlibc/libstdio/stdin.c
index 2db82f9ab..217f3f609 100644
--- a/mdk-stage1/dietlibc/libstdio/stdin.c
+++ b/mdk-stage1/dietlibc/libstdio/stdin.c
@@ -1,13 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdin = { 0, BUFINPUT, 0, 0 };
-
-int __fflush_stdin() {
- return fflush(stdin);
-}
-#else
-static FILE __stdin = { 0, 0 };
+static char __stdin_buf[BUFSIZE];
+static FILE __stdin = {
+ .fd=0,
+ .flags=BUFINPUT|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdin_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdin=&__stdin;
+
+int __fflush_stdin(void) {
+ return fflush(stdin);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdout.c b/mdk-stage1/dietlibc/libstdio/stdout.c
index 481fb1014..08054d0d4 100644
--- a/mdk-stage1/dietlibc/libstdio/stdout.c
+++ b/mdk-stage1/dietlibc/libstdio/stdout.c
@@ -1,14 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdout = { 1, BUFLINEWISE, 0, 0 };
-
-int __fflush_stdout() {
- return fflush(stdout);
-}
-#else
-static FILE __stdout = { 1, 0 };
+static char __stdout_buf[BUFSIZE];
+static FILE __stdout = {
+ .fd=1,
+ .flags=BUFLINEWISE|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdout_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdout=&__stdout;
+int __fflush_stdout(void) {
+ return fflush(stdout);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/tmpfile.c b/mdk-stage1/dietlibc/libstdio/tmpfile.c
new file mode 100644
index 000000000..b20d8410d
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/tmpfile.c
@@ -0,0 +1,12 @@
+#include "dietstdio.h"
+#include <stdlib.h>
+#include <unistd.h>
+
+FILE *tmpfile (void) {
+ int fd;
+ char template[20] = "/tmp/tmpfile-XXXXXX";
+ if ((fd=mkstemp(template))<0)
+ return 0;
+ unlink(template);
+ return __stdio_init_file(fd,1);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ungetc.c b/mdk-stage1/dietlibc/libstdio/ungetc.c
index ae03e9381..133e92820 100644
--- a/mdk-stage1/dietlibc/libstdio/ungetc.c
+++ b/mdk-stage1/dietlibc/libstdio/ungetc.c
@@ -1,11 +1,10 @@
#include "dietstdio.h"
-#ifdef WANT_UNGETC
int ungetc(int c, FILE *stream) {
- if (stream->ungotten)
+ if (stream->ungotten || c<0 || c>255)
return EOF;
stream->ungotten=1;
- stream->ungetbuf=(char)(unsigned char)c;
+ stream->ungetbuf=(unsigned char)c;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
return c;
}
-#endif
diff --git a/mdk-stage1/dietlibc/libstdio/vfdprintf.c b/mdk-stage1/dietlibc/libstdio/vfdprintf.c
new file mode 100644
index 000000000..fdfeb09e1
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfdprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+
+static int __fwrite(void*ptr, size_t nmemb, int fd) {
+ return write(fd,ptr,nmemb);
+}
+
+int vfdprintf(int fd, const char *format, va_list arg_ptr)
+{
+ struct arg_printf ap = { (void*)(long)fd, (int(*)(void*,size_t,void*)) __fwrite };
+ return __v_printf(&ap,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vfprintf.c b/mdk-stage1/dietlibc/libstdio/vfprintf.c
new file mode 100644
index 000000000..5e64cf099
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+
+static int __fwrite(void*ptr, size_t nmemb, FILE* f) {
+ return fwrite(ptr,1,nmemb,f);
+}
+
+int vfprintf(FILE *stream, const char *format, va_list arg_ptr)
+{
+ struct arg_printf ap = { stream, (int(*)(void*,size_t,void*)) __fwrite };
+ return __v_printf(&ap,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vfscanf.c b/mdk-stage1/dietlibc/libstdio/vfscanf.c
new file mode 100644
index 000000000..6d75a45ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vfscanf.c
@@ -0,0 +1,11 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int vfscanf(FILE *stream, const char *format, va_list arg_ptr)
+{
+ struct arg_scanf farg = { (void*)stream, (int(*)(void*))fgetc, (int(*)(int,void*))ungetc };
+ return __v_scanf(&farg,format,arg_ptr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/vprintf.c b/mdk-stage1/dietlibc/libstdio/vprintf.c
new file mode 100644
index 000000000..7fe579e0a
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <unistd.h>
+#include "dietstdio.h"
+
+int __stdio_outs(const char *s,size_t len) __attribute__((weak));
+int __stdio_outs(const char *s,size_t len) {
+ return (write(1,s,len)==(int)len)?1:0;
+}
+
+int vprintf(const char *format, va_list ap)
+{
+ struct arg_printf _ap = { 0, (int(*)(void*,size_t,void*)) __stdio_outs };
+ return __v_printf(&_ap,format,ap);
+}
+
diff --git a/mdk-stage1/dietlibc/libstdio/vscanf.c b/mdk-stage1/dietlibc/libstdio/vscanf.c
new file mode 100644
index 000000000..ba9358fc4
--- /dev/null
+++ b/mdk-stage1/dietlibc/libstdio/vscanf.c
@@ -0,0 +1,10 @@
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include "dietstdio.h"
+#include <unistd.h>
+
+int vscanf(const char *format, va_list arg_ptr)
+{
+ return vfscanf(stdin,format,arg_ptr);
+}