瀏覽代碼

made a lot of changes

eck 34 年之前
父節點
當前提交
a5be75a764
共有 40 個文件被更改,包括 540 次插入386 次删除
  1. 55 0
      lang/cem/libcc.ansi/stdio/.distr
  2. 4 1
      lang/cem/libcc.ansi/stdio/LIST
  3. 70 0
      lang/cem/libcc.ansi/stdio/Makefile
  4. 9 9
      lang/cem/libcc.ansi/stdio/data.c
  5. 30 45
      lang/cem/libcc.ansi/stdio/doprnt.c
  6. 117 92
      lang/cem/libcc.ansi/stdio/doscan.c
  7. 13 89
      lang/cem/libcc.ansi/stdio/ecvt.c
  8. 2 2
      lang/cem/libcc.ansi/stdio/fclose.c
  9. 2 4
      lang/cem/libcc.ansi/stdio/feof.c
  10. 2 4
      lang/cem/libcc.ansi/stdio/ferror.c
  11. 1 1
      lang/cem/libcc.ansi/stdio/fflush.c
  12. 0 1
      lang/cem/libcc.ansi/stdio/fgetpos.c
  13. 6 3
      lang/cem/libcc.ansi/stdio/fgets.c
  14. 12 0
      lang/cem/libcc.ansi/stdio/fileno.c
  15. 10 5
      lang/cem/libcc.ansi/stdio/fillbuf.c
  16. 1 1
      lang/cem/libcc.ansi/stdio/fltpr.c
  17. 32 24
      lang/cem/libcc.ansi/stdio/flushbuf.c
  18. 40 7
      lang/cem/libcc.ansi/stdio/fopen.c
  19. 0 2
      lang/cem/libcc.ansi/stdio/fprintf.c
  20. 4 4
      lang/cem/libcc.ansi/stdio/fputs.c
  21. 6 4
      lang/cem/libcc.ansi/stdio/fread.c
  22. 23 16
      lang/cem/libcc.ansi/stdio/freopen.c
  23. 13 22
      lang/cem/libcc.ansi/stdio/fseek.c
  24. 10 4
      lang/cem/libcc.ansi/stdio/ftell.c
  25. 6 5
      lang/cem/libcc.ansi/stdio/fwrite.c
  26. 2 4
      lang/cem/libcc.ansi/stdio/getc.c
  27. 2 4
      lang/cem/libcc.ansi/stdio/getchar.c
  28. 7 3
      lang/cem/libcc.ansi/stdio/gets.c
  29. 21 0
      lang/cem/libcc.ansi/stdio/icompute.c
  30. 17 0
      lang/cem/libcc.ansi/stdio/isatty.c
  31. 0 2
      lang/cem/libcc.ansi/stdio/printf.c
  32. 2 4
      lang/cem/libcc.ansi/stdio/putc.c
  33. 2 4
      lang/cem/libcc.ansi/stdio/putchar.c
  34. 9 1
      lang/cem/libcc.ansi/stdio/puts.c
  35. 0 1
      lang/cem/libcc.ansi/stdio/rename.c
  36. 3 0
      lang/cem/libcc.ansi/stdio/setvbuf.c
  37. 1 1
      lang/cem/libcc.ansi/stdio/sprintf.c
  38. 4 3
      lang/cem/libcc.ansi/stdio/sscanf.c
  39. 1 7
      lang/cem/libcc.ansi/stdio/vfprintf.c
  40. 1 7
      lang/cem/libcc.ansi/stdio/vprintf.c

+ 55 - 0
lang/cem/libcc.ansi/stdio/.distr

@@ -0,0 +1,55 @@
+LIST
+Makefile
+clearerr.c
+data.c
+doprnt.c
+doscan.c
+ecvt.c
+fclose.c
+feof.c
+ferror.c
+fflush.c
+fgetc.c
+fgetpos.c
+fgets.c
+fileno.c
+fillbuf.c
+fltpr.c
+flushbuf.c
+fopen.c
+fprintf.c
+fputc.c
+fputs.c
+fread.c
+freopen.c
+fscanf.c
+fseek.c
+fsetpos.c
+ftell.c
+fwrite.c
+gcvt.c
+getc.c
+getchar.c
+gets.c
+icompute.c
+isatty.c
+loc_incl.h
+perror.c
+printf.c
+putc.c
+putchar.c
+puts.c
+remove.c
+rename.c
+rewind.c
+scanf.c
+setbuf.c
+setvbuf.c
+sprintf.c
+sscanf.c
+tmpfile.c
+tmpnam.c
+ungetc.c
+vfprintf.c
+vprintf.c
+vsprintf.c

+ 4 - 1
lang/cem/libcc.ansi/stdio/LIST

@@ -1,4 +1,4 @@
-llib
+loc_incl.h
 tmpfile.c
 tmpnam.c
 rename.c
@@ -15,6 +15,7 @@ vfprintf.c
 vprintf.c
 vsprintf.c
 doprnt.c
+icompute.c
 fscanf.c
 scanf.c
 sscanf.c
@@ -40,6 +41,7 @@ ftell.c
 clearerr.c
 feof.c
 ferror.c
+fileno.c
 fltpr.c
 ecvt.c
 gcvt.c
@@ -47,4 +49,5 @@ fillbuf.c
 fclose.c
 flushbuf.c
 fflush.c
+isatty.c
 data.c

+ 70 - 0
lang/cem/libcc.ansi/stdio/Makefile

@@ -0,0 +1,70 @@
+CFLAGS=-L -LIB
+
+.SUFFIXES: .o .e .c
+
+.e.o:
+	$(CC) $(CFLAGS) -c -o $@ $*.e
+
+clean:
+	rm -rf tmpfile.o tmpnam.o rename.o remove.o fopen.o freopen.o \
+		setbuf.o setvbuf.o perror.o fprintf.o printf.o sprintf.o \
+		vfprintf.o vprintf.o vsprintf.o doprnt.o icompute.o \
+		fscanf.o scanf.o sscanf.o doscan.o fgetc.o fgets.o getc.o \
+		getchar.o gets.o putc.o putchar.o fputc.o puts.o fputs.o \
+		ungetc.o fread.o fwrite.o fgetpos.o fsetpos.o rewind.o \
+		fseek.o ftell.o clearerr.o feof.o ferror.o fileno.o \
+		fltpr.o ecvt.o gcvt.o fillbuf.o fclose.o flushbuf.o \
+		fflush.o isatty.o data.o OLIST
+
+tmpfile.o:
+tmpnam.o:
+rename.o:
+remove.o:
+fopen.o:
+freopen.o:
+setbuf.o:
+setvbuf.o:
+perror.o:
+fprintf.o:
+printf.o:
+sprintf.o:
+vfprintf.o:
+vprintf.o:
+vsprintf.o:
+doprnt.o:
+icompute.o:
+fscanf.o:
+scanf.o:
+sscanf.o:
+doscan.o:
+fgetc.o:
+fgets.o:
+getc.o:
+getchar.o:
+gets.o:
+putc.o:
+putchar.o:
+fputc.o:
+puts.o:
+fputs.o:
+ungetc.o:
+fread.o:
+fwrite.o:
+fgetpos.o:
+fsetpos.o:
+rewind.o:
+fseek.o:
+ftell.o:
+clearerr.o:
+feof.o:
+ferror.o:
+fileno.o:
+fltpr.o:
+ecvt.o:
+gcvt.o:
+fillbuf.o:
+fclose.o:
+flushbuf.o:
+fflush.o:
+isatty.o:
+data.o:

+ 9 - 9
lang/cem/libcc.ansi/stdio/data.c

@@ -5,24 +5,24 @@
 
 #include	<stdio.h>
 
-struct _iobuf _stdin = {
+struct __iobuf __stdin = {
 	0, 0, _IOREAD, 0,
 	(char *)NULL, (unsigned char *)NULL, (unsigned char *)NULL, 
 };
 
-struct _iobuf _stdout = {
-	1, 0, _IOWRITE, 0,
+struct __iobuf __stdout = {
+	0, 1, _IOWRITE, 0,
 	(char *)NULL, (unsigned char *)NULL, (unsigned char *)NULL, 
 };
 
-struct _iobuf _stderr = {
-	2, 0, _IOWRITE | _IONBF, 0,
+struct __iobuf __stderr = {
+	0, 2, _IOWRITE | _IOLBF, 0,
 	(char *)NULL, (unsigned char *)NULL, (unsigned char *)NULL, 
 };
 
-struct  _iobuf  *_iotable[FOPEN_MAX] = {
-	&_stdin,
-	&_stdout,
-	&_stderr,
+FILE *__iotab[FOPEN_MAX] = {
+	&__stdin,
+	&__stdout,
+	&__stderr,
 	0
 };

+ 30 - 45
lang/cem/libcc.ansi/stdio/doprnt.c

@@ -9,10 +9,11 @@
 #include	<string.h>
 #include	"loc_incl.h"
 
-static char *
+/* gnum() is used to get the width and precision fields of a format. */
+static const char *
 gnum(register const char *f, int *ip, va_list *app)
 {
-	register int    i, c;
+	register int	i, c;
 
 	if (*f == '*') {
 		*ip = va_arg((*app), int);
@@ -28,28 +29,15 @@ gnum(register const char *f, int *ip, va_list *app)
 	return f;
 }
 
-#if	EM_WSIZE == EM_PSIZE
+#if	_EM_WSIZE == _EM_PSIZE
 #define set_pointer(flags)				/* nothing */
-#elif	EM_LSIZE == EM_PSIZE
+#elif	_EM_LSIZE == _EM_PSIZE
 #define set_pointer(flags)	(flags |= FL_LONG)
 #else
-#define set_pointer(flags)				/* nothing */
 #error garbage pointer size
+#define set_pointer(flags)		/* compilation might continue */
 #endif
 
-char *
-_i_compute(unsigned long val, int base, char *s, int nrdigits)
-{
-	int c;
-
-	c= val % base ;
-	val /= base ;
-	if (val || nrdigits > 0)
-		s = _i_compute(val, base, s, nrdigits - 1);
-	*s++ = (c>9 ? c-10+'a' : c+'0');
-	return s;
-}
-
 /* print an ordinal number */
 static char *
 o_print(va_list *ap, int flags, char *s, char c, int precision, int is_signed)
@@ -91,16 +79,14 @@ o_print(va_list *ap, int flags, char *s, char c, int precision, int is_signed)
 		else if (flags & FL_SPACE) *s++ = ' ';
 		unsigned_val = signed_val;
 	}
+	if ((flags & FL_ALT) && (c == 'o')) *s++ = '0';
 	if (!unsigned_val) {
-		if (precision != 0)
-			*s++ = '0';
-		return s;
-	}
-	if (((flags & FL_ALT) && (c == 'x' || c == 'X' || c == 'o'))
-	    || c == 'p') {
+		 if (!precision)
+			return s;
+	} else if (((flags & FL_ALT) && (c == 'x' || c == 'X'))
+		    || c == 'p') {
 		*s++ = '0';
-		if (c != 'o')
-			*s++ = (c == 'X') ? 'X' : 'x';
+		*s++ = (c == 'X' ? 'X' : 'x');
 	}
 
 	switch (c) {
@@ -133,8 +119,7 @@ f_print(va_list *ap, int flags, char *s, char c, int precision)
 	long double ld_val;
 
 	if (flags & FL_LONGDOUBLE) ld_val = va_arg(*ap, long double);
-	else
-	    ld_val = (long double) va_arg(*ap, double);
+	else ld_val = (long double) va_arg(*ap, double);
 
 	switch(c) {
 	case 'f':
@@ -142,7 +127,7 @@ f_print(va_list *ap, int flags, char *s, char c, int precision)
 		break;
 	case 'e':
 	case 'E':
-		s = _pscien(ld_val, s, precision, flags);
+		s = _pscien(ld_val, s, precision , flags);
 		break;
 	case 'g':
 	case 'G':
@@ -160,16 +145,17 @@ f_print(va_list *ap, int flags, char *s, char c, int precision)
 int
 _doprnt(register const char *fmt, va_list ap, FILE *stream)
 {
-	register char   *s;
-	unsigned int    uint;
-	register int    j;
-	int             i, c, width, precision, zfill, flags, between_fill;
+	register char	*s;
+	unsigned int	uint;
+	register int	j;
+	int		i, c, width, precision, zfill, flags, between_fill;
 	int		nrchars=0;
-	char            *oldfmt, *s1, buf[1025];
+	const char	*oldfmt;
+	char		*s1, buf[1025];
 
 	while (c = *fmt++) {
 		if (c != '%') {
-#ifdef  CPM
+#ifdef	CPM
 			if (c == '\n') {
 				if (putc('\r', stream) == EOF)
 					return nrchars ? -nrchars : -1;
@@ -210,15 +196,10 @@ _doprnt(register const char *fmt, va_list ap, FILE *stream)
 		}
 		if (!(flags & FL_WIDTHSPEC)) width = 0;
 
-		if (flags & FL_SIGN)
-			flags &= ~FL_SPACE;
+		if (flags & FL_SIGN) flags &= ~FL_SPACE;
 
-		if (flags & (FL_LJUST | FL_PRECSPEC))
-			flags &= ~FL_ZEROFILL;
+		if (flags & FL_LJUST) flags &= ~FL_ZEROFILL;
 
-		zfill = ' ';
-		if (flags & FL_ZEROFILL)
-			zfill = '0';
 
 		s = s1 = buf;
 
@@ -230,7 +211,7 @@ _doprnt(register const char *fmt, va_list ap, FILE *stream)
 
 		switch (c = *fmt++) {
 		default:
-#ifdef  CPM
+#ifdef	CPM
 			if (c == '\n') {
 				if (putc('\r', stream) == EOF)
 					return nrchars ? -nrchars : -1;
@@ -255,7 +236,7 @@ _doprnt(register const char *fmt, va_list ap, FILE *stream)
 				s1 = "(null)";
 			s = s1;
 			while (precision || !(flags & FL_PRECSPEC)) {
-				if (*s ==  '\0')
+				if (*s == '\0')
 					break;
 				s++;
 				precision--;
@@ -270,17 +251,19 @@ _doprnt(register const char *fmt, va_list ap, FILE *stream)
 		case 'x':
 		case 'X':
 			if (!(flags & FL_PRECSPEC)) precision = 1;
+			else if (c != 'p') flags &= ~FL_ZEROFILL;
 			s = o_print(&ap, flags, s, c, precision, 0);
 			break;
 		case 'd':
 		case 'i':
 			flags |= FL_SIGNEDCONV;
 			if (!(flags & FL_PRECSPEC)) precision = 1;
+			else flags &= ~FL_ZEROFILL;
 			s = o_print(&ap, flags, s, c, precision, 1);
 			break;
 		case 'c':
 			uint = va_arg(ap, unsigned int);
-			for ( i= sizeof(uint) -1  ; i>=0 ; i-- ) {
+			for ( i= sizeof(uint) -1 ; i>=0 ; i-- ) {
 				if ( *s = uint%256 ) s++;
 				uint/= 256 ;
 			}
@@ -308,6 +291,8 @@ _doprnt(register const char *fmt, va_list ap, FILE *stream)
 			fmt = va_arg(ap, char *);
 			continue;
 		}
+		zfill = ' ';
+		if (flags & FL_ZEROFILL) zfill = '0';
 		j = s - s1;
 
 		/* between_fill is true under the following conditions:

+ 117 - 92
lang/cem/libcc.ansi/stdio/doscan.c

@@ -10,8 +10,9 @@
 #include	"loc_incl.h"
 
 #define	NUMLEN	512
+#define	NR_CHARS	256
 
-static char	Xtable[128];
+static char	Xtable[NR_CHARS];
 static char	inp_buf[NUMLEN];
 
 /* Collect a number of characters which constitite an ordinal number.
@@ -22,58 +23,60 @@ static char	inp_buf[NUMLEN];
  */
 static char *
 o_collect(register int c, register FILE *stream, char type,
-			int width, int *base)
+			int width, int *basep)
 {
 	register char *bufp = inp_buf;
+	register int base;
 
 	switch (type) {
 	case 'i':	/* i means octal, decimal or hexadecimal */
 	case 'p':
 	case 'x':
-	case 'X':	*base = 16;	break;
+	case 'X':	base = 16;	break;
 	case 'd':
-	case 'u':	*base = 10;	break;
-	case 'o':	*base = 8;	break;
-	case 'b':	*base = 2;	break;
+	case 'u':	base = 10;	break;
+	case 'o':	base = 8;	break;
+	case 'b':	base = 2;	break;
 	}
 
 	if (c == '-' || c == '+') {
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if (--width);
+		    c = getc(stream);
 	}
 
-	if (width && c == '0' && *base == 16) {
+	if (width && c == '0' && base == 16) {
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if (--width)
+			c = getc(stream);
 		if (c != 'x' && c != 'X') {
-			if (type == 'i') *base = 8;
+			if (type == 'i') base = 8;
 		}
 		else if (width) {
 			*bufp++ = c;
-			width--;
-			c = getc(stream);
+			if (--width)
+				c = getc(stream);
 		}
 	}
-	else if (type == 'i') *base = 10;
+	else if (type == 'i') base = 10;
 
 	while (width) {
-		if (((*base == 10) && isdigit(c))
-		    || ((*base == 16) && isxdigit(c))
-		    || ((*base == 8) && isdigit(c) && (c < '8'))
-		    || ((*base == 2) && isdigit(c) && (c < '2'))) {
+		if (((base == 10) && isdigit(c))
+		    || ((base == 16) && isxdigit(c))
+		    || ((base == 8) && isdigit(c) && (c < '8'))
+		    || ((base == 2) && isdigit(c) && (c < '2'))) {
 			*bufp++ = c;
-			width--;
-			c = getc(stream);
+			if (--width)
+				c = getc(stream);
 		}
 		else break;
 	}
 
-	if (c != EOF) ungetc(c, stream);
-	if (type == 'i') *base = 0;
-	*bufp-- = '\0';
-	return bufp;
+	if (width && c != EOF) ungetc(c, stream);
+	if (type == 'i') base = 0;
+	*basep = base;
+	*bufp = '\0';
+	return bufp - 1;
 }
 
 #ifndef	NOFLOAT
@@ -82,68 +85,69 @@ o_collect(register int c, register FILE *stream, char type,
  * is encountered, leaving the offending character in the input. This means
  * that 1.el leaves the 'l' in the input queue. Since all detection of
  * format errors is done here, _doscan() doesn't call strtod() when it's
- * not necessary.
+ * not necessary, although the use of the width field can cause incomplete
+ * numbers to be passed to strtod(). (e.g. 1.3e+)
  */
 static char *
-f_collect(register int c, register FILE *stream, int width)
+f_collect(register int c, register FILE *stream, register int width)
 {
 	register char *bufp = inp_buf;
 	int digit_seen = 0;
 
 	if (c == '-' || c == '+') {
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if (--width)
+			c = getc(stream);
 	}
 
 	while (width && isdigit(c)) {
 		digit_seen++;
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if (--width)
+			c = getc(stream);
 	}
 	if (width && c == '.') {
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if(--width)
+			c = getc(stream);
 		while (width && isdigit(c)) {
 			digit_seen++;
 			*bufp++ = c;
-			width--;
-			c = getc(stream);
+			if (--width)
+				c = getc(stream);
 		}
 	}
 
 	if (!digit_seen) {
-		if (c != EOF) ungetc(c, stream);
+		if (width && c != EOF) ungetc(c, stream);
 		return inp_buf - 1;
 	}
 	else digit_seen = 0;
 
 	if (width && (c == 'e' || c == 'E')) {
 		*bufp++ = c;
-		width--;
-		c = getc(stream);
+		if (--width)
+			c = getc(stream);
 		if (width && (c == '+' || c == '-')) {
 			*bufp++ = c;
-			width--;
-			c = getc(stream);
+			if (--width)
+				c = getc(stream);
 		}
 		while (width && isdigit(c)) {
 			digit_seen++;
 			*bufp++ = c;
-			width--;
-			c = getc(stream);
+			if (--width)
+				c = getc(stream);
 		}
 		if (!digit_seen) {
-			if (c != EOF) ungetc(c,stream);
+			if (width && c != EOF) ungetc(c,stream);
 			return inp_buf - 1;
 		}
 	}
 
-	if (c != EOF) ungetc(c, stream);
-	*bufp-- = '\0';
-	return bufp;
+	if (width && c != EOF) ungetc(c, stream);
+	*bufp = '\0';
+	return bufp - 1;
 }
 #endif	/* NOFLOAT */
 
@@ -165,19 +169,14 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 	int		flags;		/* some flags */
 	int		reverse;	/* reverse the checking in [...] */
 	int		kind;
-	register int	ic;
+	register int	ic;		/* the input character */
 #ifndef	NOFLOAT
 	long double	ld_val;
 #endif
 
-	ic = getc(stream);
-	if (ic == EOF)
-		return EOF;
-	ungetc(ic,stream);
-
 	while (1) {
 		if (isspace(*format)) {
-			while (isspace (*format))
+			while (isspace(*format))
 				++format;	/* skip whitespace */
 			ic = getc(stream);
 			nrchars++;
@@ -185,13 +184,14 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 				ic = getc(stream);
 				nrchars++;
 			}
+			if (ic != EOF) ungetc(ic,stream);
+			nrchars--;
 		}
-		else {
-			ic = getc(stream);
-			nrchars++;
-		}
-		if (!*format)
-			break;		/* end of format */
+		if (!*format) break;	/* end of format */
+
+		ic = getc(stream);
+		nrchars++;
+
 		if (ic == EOF)
 			return conv ? done : EOF;
 		if (*format != '%') {
@@ -238,8 +238,7 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 			if (kind == ic) continue;
 			break;
 		case 'n':
-			if (ic != EOF)
-				ungetc(ic, stream);
+			if (ic != EOF) ungetc(ic, stream);
 			nrchars--;
 			if (flags & FL_SHORT)
 				*va_arg(ap, short *) = (short) nrchars;
@@ -258,7 +257,10 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 		case 'X':		/* ditto */
 			if (!(flags & FL_WIDTHSPEC))
 				width = NUMLEN;
-			if (!width) return done;
+			if (!width) {
+				if (ic != EOF) ungetc(ic, stream);
+				return done;
+			}
 			str = o_collect(ic, stream, kind, width, &base);
 			if (str < inp_buf) return done;
 			nrchars += str - inp_buf + 1;
@@ -281,20 +283,25 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 				width = 1;
 			if (!(flags & FL_NOASSIGN))
 				tmp_string = va_arg(ap, char *);
-			if (!width) return done;
-			if (width && !(flags & FL_NOASSIGN) && (ic != EOF))
+			if (!width) {
+				if (ic != EOF) ungetc(ic, stream);
+				return done;
+			}
+			if (!(flags & FL_NOASSIGN) && (ic != EOF))
 				++done;
 			while (width && ic != EOF) {
 				if (!(flags & FL_NOASSIGN))
 					*tmp_string++ = (char) ic;
-				width--;
-				ic = getc(stream);
-				nrchars++;
+				if (--width) {
+					ic = getc(stream);
+					nrchars++;
+				}
 			}
 
-			if (ic != EOF)
-				ungetc(ic,stream);
-			nrchars--;
+			if (width) {
+				if (ic != EOF) ungetc(ic,stream);
+				nrchars--;
+			}
 			break;
 
 		case 's':
@@ -302,36 +309,45 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 				width = 0xffff;
 			if (!(flags & FL_NOASSIGN))
 				tmp_string = va_arg(ap, char *);
-			if (!width) return done;
+			if (!width) {
+				if (ic != EOF) ungetc(ic,stream);
+				return done;
+			}
 			if (!(flags & FL_NOASSIGN))
 				++done;
 			while (width && ic != EOF && !isspace(ic)) {
 				if (!(flags & FL_NOASSIGN))
 					*tmp_string++ = (char) ic;
-				width--;
-				ic = getc(stream);
-				nrchars++;
-				/* terminate the string */
-				if (!(flags & FL_NOASSIGN))
-					*tmp_string = '\0';	
+				if (--width) {
+					ic = getc(stream);
+					nrchars++;
+				}
+			}
+			/* terminate the string */
+			if (!(flags & FL_NOASSIGN))
+				*tmp_string = '\0';	
+			if (width) {
+				if (ic != EOF) ungetc(ic,stream);
+				nrchars--;
 			}
-			if (ic != EOF)
-				ungetc(ic,stream);
-			nrchars--;
 			break;
 
 		case '[':
+		{	int old_nrchars;
 			if (!(flags & FL_WIDTHSPEC))
 				width = 0xffff;
 
-			if (!width) return done;
+			if (!width) {
+				if (ic != EOF) ungetc(ic, stream);
+				return done;
+			}
 			if ( *(++format) == '^' ) {
 				reverse = 1;
 				format++;
 			} else
 				reverse = 0;
 
-			for (tmp_string = Xtable; tmp_string < &Xtable[128]
+			for (tmp_string = Xtable; tmp_string < &Xtable[NR_CHARS]
 							; tmp_string++)
 				*tmp_string = 0;
 
@@ -353,26 +369,37 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 					else Xtable['-'] = 1;
 				}
 			}
-			if (!*format)
+			if (!*format) {
+				if (ic != EOF) ungetc(ic,stream);
 				return done;
+			}
 			
+			old_nrchars = nrchars;
 			if (!(flags & FL_NOASSIGN))
 				tmp_string = va_arg(ap, char *);
-			while (width && ic != EOF && (Xtable[ic] ^ reverse)) {
+			if (ic == EOF || !(Xtable[ic] ^ reverse)) {
+				if (ic != EOF) ungetc(ic, stream);
+				return done;
+			}
+
+			 while (width && ic != EOF && (Xtable[ic] ^ reverse)) {
 				if (!(flags & FL_NOASSIGN))
 					*tmp_string++ = (char) ic;
-				width--;
-				ic = getc(stream);
-				nrchars++;
+				if (--width) {
+					ic = getc(stream);
+					nrchars++;
+				}
+			}
+			if (width) {
+				if (ic != EOF) ungetc(ic, stream);
+				nrchars--;
 			}
-			if (ic != EOF)
-				ungetc(ic, stream);
-			nrchars--;
 			if (!(flags & FL_NOASSIGN)) {	/* terminate string */
 				*tmp_string = '\0';	
 				++done;
 			}
 			break;
+		}
 #ifndef	NOFLOAT:
 		case 'e':
 		case 'E':
@@ -402,7 +429,5 @@ _doscan(register FILE *stream, const char *format, va_list ap)
 		}		/* end switch */
 		++format;
 	}
-	if (ic != EOF)
-		ungetc(ic, stream);
 	return conv ? done : EOF;
 }

+ 13 - 89
lang/cem/libcc.ansi/stdio/ecvt.c

@@ -1,16 +1,24 @@
-/*
- * ecvt.c - conversion routines for printing floating point numbers
- */
 /* $Header$ */
 
 #ifndef NOFLOAT
 
-static char *cvt(long double value, int ndigit, int *decpt, int *sign, int ecvtflag);
-#define	NDIGITS		128
+#include	"../stdlib/ext_fmt.h"
+void _dbl_ext_cvt(double value, struct EXTEND *e);
+char *_ext_str_cvt(struct EXTEND *e, int ndigit, int *decpt, int * sign, int ecvtflag);
+
+static char *
+cvt(long double value, int ndigit, int *decpt, int *sign, int ecvtflag)
+{
+	struct EXTEND e;
+
+	_dbl_ext_cvt(value, &e);
+	return _ext_str_cvt(&e, ndigit, decpt, sign, ecvtflag);
+}
 
 char *
 ecvt(long double value, int ndigit, int *decpt, int *sign)
 {
+
 	return cvt(value, ndigit, decpt, sign, 1);
 }
 
@@ -20,88 +28,4 @@ fcvt(long double value, int ndigit, int *decpt, int *sign)
 	return cvt(value, ndigit, decpt, sign, 0);
 }
 
-static struct powers_of_10 {
-	long double pval;
-	long double rpval;
-	int exp;
-} p10[] = {
-	1.0e32, 1.0e-32, 32,
-	1.0e16, 1.0e-16, 16,
-	1.0e8, 1.0e-8, 8,
-	1.0e4, 1.0e-4, 4,
-	1.0e2, 1.0e-2, 2,
-	1.0e1, 1.0e-1, 1,
-	1.0e0, 1.0e0, 0
-};
-
-static char *
-cvt(long double value, int ndigit, int *decpt, int *sign, int ecvtflag)
-{
-	static char buf[NDIGITS+1];
-	register char *p = buf;
-	register char *pe;
-
-	if (ndigit < 0) ndigit = 0;
-	if (ndigit > NDIGITS) ndigit = NDIGITS;
-	pe = &buf[ndigit];
-	buf[0] = '\0';
-
-	*sign = 0;
-	if (value < 0) {
-		*sign = 1;
-		value = -value;
-	}
-
-	*decpt = 0;
-	if (value != 0.0) {
-		register struct powers_of_10 *pp = &p10[0];
-
-		if (value >= 10.0) do {
-			while (value >= pp->pval) {
-				value *= pp->rpval;
-				*decpt += pp->exp;
-			}
-		} while ((++pp)->exp > 0);
-
-		pp = &p10[0];
-		if (value < 1.0) do {
-			while (value * pp->pval < 10.0) {
-				value *= pp->pval;
-				*decpt -= pp->exp;
-			}
-		} while ((++pp)->exp > 0);
-
-		(*decpt)++;	/* because now value in [1.0, 10.0) */
-	}
-	if (!ecvtflag) {
-		/* for fcvt() we need ndigit digits behind the dot */
-		pe += *decpt;
-		if (pe > &buf[NDIGITS]) pe = &buf[NDIGITS];
-	}
-	while (p <= pe) {
-		*p++ = (int)value + '0';
-		value = 10.0 * (value - (int)value);
-	}
-	if (pe >= buf) {
-		p = pe;
-		*p += 5;	/* round of at the end */
-		while (*p > '9') {
-			*p = '0';
-			if (p > buf) ++*--p;
-			else {
-				*p = '1';
-				++*decpt;
-				if (!ecvtflag) {
-					/* maybe add another digit at the end,
-					   because the point was shifted right
-					*/
-					if (pe > buf) *pe = '0';
-					pe++;
-				}
-			}
-		}
-		*pe = '\0';
-	}
-	return buf;
-}
 #endif	/* NOFLOAT */

+ 2 - 2
lang/cem/libcc.ansi/stdio/fclose.c

@@ -15,8 +15,8 @@ fclose(FILE *fp)
 	register int i, retval = 0;
 
 	for (i=0; i<FOPEN_MAX; i++)
-		if (fp == _iotable[i]) {
-			_iotable[i] = 0;
+		if (fp == __iotab[i]) {
+			__iotab[i] = 0;
 			break;
 		}
 	if (i >= FOPEN_MAX)

+ 2 - 4
lang/cem/libcc.ansi/stdio/feof.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	feof
-
 int
-feof(FILE *stream)
+(feof)(FILE *stream)
 {
-	return (stream->_flags & _IOEOF) != 0;
+	return feof(stream);
 }

+ 2 - 4
lang/cem/libcc.ansi/stdio/ferror.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	ferror
-
 int
-ferror(FILE *stream)
+(ferror)(FILE *stream)
 {
-	return (stream->_flags & _IOERR) != 0;
+	return ferror(stream);
 }

+ 1 - 1
lang/cem/libcc.ansi/stdio/fflush.c

@@ -15,7 +15,7 @@ fflush(FILE *stream)
 
 	if (!stream) {
 	    for(i= 0; i < FOPEN_MAX; i++)
-		if (_iotable[i] && fflush(_iotable[i]))
+		if (__iotab[i] && fflush(__iotab[i]))
 			retval = EOF;
 	    return retval;
 	}

+ 0 - 1
lang/cem/libcc.ansi/stdio/fgetpos.c

@@ -4,7 +4,6 @@
 /* $Header$ */
 
 #include	<stdio.h>
-#include	<sys/file.h>
 
 int
 fgetpos(FILE *stream, fpos_t *pos)

+ 6 - 3
lang/cem/libcc.ansi/stdio/fgets.c

@@ -6,7 +6,7 @@
 #include	<stdio.h>
 
 char *
-fgets(char *s, int n, FILE *stream)
+fgets(char *s, register int n, register FILE *stream)
 {
 	register int ch;
 	register char *ptr;
@@ -17,8 +17,11 @@ fgets(char *s, int n, FILE *stream)
 		if ( ch == '\n')
 			break;
 	}
-	if (ch == EOF && ptr == s)
-		return (char *)NULL;
+	if (ch == EOF) {
+		if (feof(stream)) {
+			if (ptr == s) return NULL;
+		} else return NULL;
+	}
 	*ptr = '\0';
 	return s;
 }

+ 12 - 0
lang/cem/libcc.ansi/stdio/fileno.c

@@ -0,0 +1,12 @@
+/*
+ * fileno .c - map a stream to a file descriptor
+ */
+/* $Header$ */
+
+#include	<stdio.h>
+
+int
+(fileno)(FILE *stream)
+{
+	return stream->_fd;
+}

+ 10 - 5
lang/cem/libcc.ansi/stdio/fillbuf.c

@@ -10,7 +10,7 @@
 int read(int d, char *buf, int nbytes);
 
 int
-_fillbuf(register FILE *stream)
+__fillbuf(register FILE *stream)
 {
 	static unsigned char ch[FOPEN_MAX];
 
@@ -33,16 +33,21 @@ _fillbuf(register FILE *stream)
 			stream->_bufsiz = BUFSIZ;
 		}
 	}
+	if (io_testflag(stream, _IONBF | _IOLBF)) {
+		register int i;
+		for (i = 0; i < FOPEN_MAX; i++) {
+			if (__iotab[i] && io_testflag(__iotab[i], _IOLBF))
+				if (io_testflag(__iotab[i], _IOWRITING))
+					(void) fflush(__iotab[i]);
+		}
+	}
+
 	if (!stream->_buf) {
 		stream->_buf = &ch[fileno(stream)];
 		stream->_bufsiz = 1;
 	}
 	stream->_ptr = stream->_buf;
 	stream->_count = read(stream->_fd, (char *)stream->_buf, stream->_bufsiz);
-	/*
-	fprintf(stderr,"read %d bytes, \"%.*s\"\n"
-		, stream->_count, stream->_count, stream->_buf);
-	*/
 
 	if (stream->_count <= 0){
 		if (stream->_count == 0) {

+ 1 - 1
lang/cem/libcc.ansi/stdio/fltpr.c

@@ -56,7 +56,7 @@ _pscien(long double r, register char *s, int n, int flags)
 	*s++ = *s1++;
 	if ((n > 0) || (flags & FL_ALT))
 		*s++ = '.';
-	while (--n>0)
+	while (--n >= 0)
 		if (*s1) *s++ = *s1++;
 		else *s++ = '0';
 	*s++ = 'e';

+ 32 - 24
lang/cem/libcc.ansi/stdio/flushbuf.c

@@ -7,12 +7,17 @@
 #include	<stdlib.h>
 #include	"loc_incl.h"
 
+#include	<sys/types.h>
+
+off_t lseek(int fildes, off_t offset, int whence);
 int write(int d, const char *buf, int nbytes);
 int isatty(int d);
+extern int (*_fflush)(FILE *stream);
 
 int
-_flushbuf(int c, FILE * stream)
+__flushbuf(int c, FILE * stream)
 {
+	_fflush = fflush;
 	if (fileno(stream) < 0) return EOF;
 	if (!io_testflag(stream, _IOWRITE)) return EOF;
 	if (io_testflag(stream, _IOREADING) && !feof(stream)) return EOF;
@@ -25,22 +30,20 @@ _flushbuf(int c, FILE * stream)
 				if (!(stream->_buf =
 					    (unsigned char *) malloc(BUFSIZ))) {
 					stream->_flags |= _IONBF;
-				}
-				else {
+				} else {
 					stream->_flags |= _IOLBF;
 					stream->_bufsiz = BUFSIZ;
 					stream->_count = -1;
 				}
-			}
-			else {
+			} else {
 				if (!(stream->_buf =
 					    (unsigned char *) malloc(BUFSIZ))) {
 					stream->_flags |= _IONBF;
-				}
-				else {
+				} else {
 					stream->_flags |= _IOMYBUF;
 					stream->_bufsiz = BUFSIZ;
-					stream->_count = BUFSIZ - 1;
+					if (!io_testflag(stream, _IOLBF))
+						stream->_count = BUFSIZ - 1;
 				}
 			}
 			stream->_ptr = stream->_buf;
@@ -51,33 +54,48 @@ _flushbuf(int c, FILE * stream)
 		char c1 = c;
 
 		stream->_count = 0;
+		if (io_testflag(stream, _IOAPPEND)) {
+			if (lseek(fileno(stream), 0L, 2) == -1) {
+				stream->_flags |= _IOERR;
+				return EOF;
+			}
+		}
 		if (write(fileno(stream), &c1, 1) != 1) {
 			stream->_flags |= _IOERR;
 			return EOF;
 		}
 		return c;
-	}
-	else if (io_testflag(stream, _IOLBF)) {
+	} else if (io_testflag(stream, _IOLBF)) {
 		*stream->_ptr++ = c;
 		if (c == '\n' || stream->_count == -stream->_bufsiz) {
+			if (io_testflag(stream, _IOAPPEND)) {
+				if (lseek(fileno(stream), 0L, 2) == -1) {
+					stream->_flags |= _IOERR;
+					return EOF;
+				}
+			}
 			if (write(fileno(stream), (char *)stream->_buf,
 					-stream->_count) != -stream->_count) {
 				stream->_flags |= _IOERR;
 				return EOF;
-			}
-			else {
+			} else {
 				stream->_ptr  = stream->_buf;
 				stream->_count = 0;
 			}
 		}
-	}
-	else {
+	} else {
 		int count = stream->_ptr - stream->_buf;
 
 		stream->_count = stream->_bufsiz - 1;
 		stream->_ptr = stream->_buf + 1;
 
 		if (count > 0) {
+			if (io_testflag(stream, _IOAPPEND)) {
+				if (lseek(fileno(stream), 0L, 2) == -1) {
+					stream->_flags |= _IOERR;
+					return EOF;
+				}
+			}
 			if (write(fileno(stream), (char *)stream->_buf, count)
 			    != count) {
 				*(stream->_buf) = c;
@@ -89,13 +107,3 @@ _flushbuf(int c, FILE * stream)
 	}
 	return c;
 }
-
-void
-_cleanup(void)		/* fflush((FILE *)NULL) ??? */
-{
-	register int i;
-
-	for( i = 0; i < FOPEN_MAX; i++ )
-		if (_iotable[i])
-			fclose(_iotable[i]);
-}

+ 40 - 7
lang/cem/libcc.ansi/stdio/fopen.c

@@ -5,12 +5,39 @@
 
 #include	<stdio.h>
 #include	<stdlib.h>
-#include	<sys/file.h>
 #include	"loc_incl.h"
 
 #define	PMODE		0666
 
-int open(const char *path, int flags, int mode);
+/* The next 3 defines are true in all UNIX systems known to me.
+ */
+#define	O_RDONLY	0
+#define	O_WRONLY	1
+#define	O_RDWR		2
+
+/* Since the O_CREAT flag is not available on all systems, we can't get it
+ * from the standard library. Furthermore, even if we know that <fcntl.h>
+ * contains such a flag, it's not sure whether it can be used, since we
+ * might be cross-compiling for another system, which may use an entirely
+ * different value for O_CREAT (or not support such a mode). The safest
+ * thing is to just use the Version 7 semantics for open, and use creat()
+ * whenever necessary.
+ *
+ * Another problem is O_APPEND, for which the same holds. When "a"
+ * open-mode is used, an lseek() to the end is done before every write()
+ * system-call.
+ *
+ * The O_CREAT, O_TRUNC and O_APPEND given here, are only for convenience.
+ * They are not passed to open(), so the values don't have to match a value
+ * from the real world. It is enough when they are unique.
+ */
+#define	O_CREAT		0x010
+#define	O_TRUNC		0x020
+#define	O_APPEND	0x040
+
+int open(const char *path, int flags);
+int creat(const char *path, int mode);
+
 int close(int d);
 
 FILE *
@@ -21,7 +48,7 @@ fopen(const char *name, const char *mode)
 	FILE *stream;
 	int fd, flags = 0;
 
-	for (i = 0; _iotable[i] != 0 ; i++) 
+	for (i = 0; __iotab[i] != 0 ; i++) 
 		if ( i >= FOPEN_MAX )
 			return (FILE *)NULL;
 
@@ -36,7 +63,7 @@ fopen(const char *name, const char *mode)
 		rwflags = O_CREAT | O_TRUNC;
 		break;
 	case 'a': 
-		flags |= _IOWRITE | _IOWRITING;
+		flags |= _IOWRITE | _IOWRITING | _IOAPPEND;
 		rwmode = O_WRONLY;
 		rwflags |= O_APPEND | O_CREAT;
 		break;         
@@ -57,7 +84,13 @@ fopen(const char *name, const char *mode)
 		}
 	}
 
-	fd = open(name, rwmode | rwflags, PMODE);
+	/* Perform a creat() when the file should be truncated or when
+	 * the file is opened for writing and the open() failed.
+	 */
+	if ((rwflags & O_TRUNC)
+	    || (((fd = open(name, rwmode)) < 0)
+		    && (flags & _IOWRITE)))
+		fd = creat(name, PMODE);
 
 	if (fd < 0) return (FILE *)NULL;
 
@@ -66,13 +99,13 @@ fopen(const char *name, const char *mode)
 		return (FILE *)NULL;
 	}
 
-	if ((flags & _IOREAD) && (flags  & _IOWRITE))
+	if ((flags & (_IOREAD | _IOWRITE))  == (_IOREAD | _IOWRITE))
 		flags &= ~(_IOREADING | _IOWRITING);
 
 	stream->_count = 0;
 	stream->_fd = fd;
 	stream->_flags = flags;
 	stream->_buf = NULL;
-	_iotable[i] = stream;
+	__iotab[i] = stream;
 	return stream;
 }

+ 0 - 2
lang/cem/libcc.ansi/stdio/fprintf.c

@@ -16,8 +16,6 @@ fprintf(FILE *stream, const char *format, ...)
 	va_start(ap, format);
 
 	retval = _doprnt (format, ap, stream);
-	if ( retval >= 0 && io_testflag(stream,_IOLBF) )
-		if (fflush(stream)) return EOF;
 
 	va_end(ap);
 

+ 4 - 4
lang/cem/libcc.ansi/stdio/fputs.c

@@ -8,11 +8,11 @@
 int
 fputs(register const char *s, register FILE *stream)
 {
-	register int retval = 0;
+	register int i = 0;
 
 	while (*s) 
-		if (putc(*s++, stream) == EOF) return -1;
-		else retval++;
+		if (putc(*s++, stream) == EOF) return EOF;
+		else i++;
 
-	return retval;
+	return i;
 }

+ 6 - 4
lang/cem/libcc.ansi/stdio/fread.c

@@ -6,17 +6,19 @@
 #include	<stdio.h>
 
 size_t
-fread(register void *ptr, size_t size, size_t nmemb, FILE *stream)
+fread(void *ptr, size_t size, size_t nmemb, register FILE *stream)
 {
-	int c;
-	size_t ndone = 0, s;
+	register char *cp = ptr;
+	register int c;
+	size_t ndone = 0;
+	register size_t s;
 
 	if (size)
 		while ( ndone < nmemb ) {
 			s = size;
 			do {
 				if ((c = getc(stream)) != EOF)
-					*ptr++ = c;
+					*cp++ = c;
 				else
 					return ndone;
 			} while (--s);

+ 23 - 16
lang/cem/libcc.ansi/stdio/freopen.c

@@ -5,11 +5,23 @@
 
 #include	<stdio.h>
 #include	<stdlib.h>
-#include	<sys/file.h>
 #include	"loc_incl.h"
 
-#define  PMODE    0666
-int open(const char *path, int flags, int mode);
+#define	PMODE		0666
+
+/* Do not "optimize" this file to use the open with O_CREAT if the file
+ * does not exist. The reason is given in fopen.c.
+ */
+#define	O_RDONLY	0
+#define	O_WRONLY	1
+#define	O_RDWR		2
+
+#define	O_CREAT		0x010
+#define	O_TRUNC		0x020
+#define	O_APPEND	0x040
+
+int open(const char *path, int flags);
+int creat(const char *path, int mode);
 int close(int d);
 
 FILE *
@@ -17,57 +29,52 @@ freopen(const char *name, const char *mode, FILE *stream)
 {
 	register int i;
 	int rwmode = 0, rwflags = 0;
-	int fd, flags = stream->_flags & ~(_IOWRITE|_IOREAD|_IOERR|_IOEOF);
+	int fd, flags = stream->_flags & (_IONBF | _IOFBF | _IOLBF | _IOMYBUF);
 
 	(void) fflush(stream);				/* ignore errors */
 	(void) close(fileno(stream));
 
 	switch(*mode++) {
-
 	case 'r':
 		flags |= _IOREAD;	
 		rwmode = O_RDONLY;
 		break;
-
 	case 'w':
 		flags |= _IOWRITE;
 		rwmode = O_WRONLY;
 		rwflags = O_CREAT | O_TRUNC;
 		break;
-
 	case 'a': 
-		flags |= _IOWRITE;
+		flags |= _IOWRITE | _IOAPPEND;
 		rwmode = O_WRONLY;
 		rwflags |= O_APPEND | O_CREAT;
 		break;         
-
 	default:
 		return (FILE *)NULL;
 	}
 
 	while (*mode) {
 		switch(*mode++) {
-
 		case 'b':
 			break;
-
 		case '+':
 			rwmode = O_RDWR;
 			flags |= _IOREAD | _IOWRITE;
 			break;
-
 		default:
 			return (FILE *)NULL;
-
 		}
 	}
 
-	fd = open(name, rwmode | rwflags, PMODE);
+	if ((rwflags & O_TRUNC)
+	    || (((fd = open(name, rwmode)) < 0)
+		    && (flags & _IOWRITE)))
+		fd = creat(name, PMODE);
 
 	if (fd < 0) {
 		for( i = 0; i < FOPEN_MAX; i++) {
-			if (stream == _iotable[i]) {
-				_iotable[i] = 0;
+			if (stream == __iotab[i]) {
+				__iotab[i] = 0;
 				break;
 			}
 		}

+ 13 - 22
lang/cem/libcc.ansi/stdio/fseek.c

@@ -4,10 +4,16 @@
 /* $Header$ */
 
 #include	<stdio.h>
-#include	<sys/file.h>
+
+#if	(SEEK_CUR != 1) || (SEEK_END != 2) || (SEEK_SET != 0)
+#error SEEK_* values are wrong
+#endif
+
 #include	"loc_incl.h"
 
-int lseek(int d, int offset, int whence);
+#include	<sys/types.h>
+
+off_t lseek(int fildes, off_t offset, int whence);
 
 int
 fseek(FILE *stream, long int offset, int whence)
@@ -15,19 +21,6 @@ fseek(FILE *stream, long int offset, int whence)
 	int count, adjust = 0;
 	long pos;
 
-#if	(SEEK_CUR != L_INCR) || (SEEK_SET != L_SET) || (SEEK_END != L_XTND)
-	int swhence;				/* the real whence for lseek */
-
-	switch(whence) {			/* map to UNIX values */
-	case SEEK_CUR:	swhence = L_INCR;	break;
-	case SEEK_SET:	swhence = L_SET;	break;
-	case SEEK_END:	swhence = L_XTND;	break;
-	default:	swhence = whence;	break;
-	}
-#else
-#define	swhence		whence
-#endif
-
 	stream->_flags &= ~(_IOEOF | _IOERR);
 	/* Clear both the end of file and error flags */
 
@@ -36,15 +29,13 @@ fseek(FILE *stream, long int offset, int whence)
 		    && stream->_buf
 		    && !io_testflag(stream,_IONBF))
 			adjust = stream->_count;
-		pos = lseek(fileno(stream), offset - adjust, swhence);
+		pos = lseek(fileno(stream), offset - adjust, whence);
 		stream->_count = 0;
-	}
-	else if (io_testflag(stream,_IOWRITING)) {
+	} else if (io_testflag(stream,_IOWRITING)) {
 		fflush(stream);
-		pos = lseek(fileno(stream), offset, swhence);
-	}
-	else	/* neither reading nor writing. The buffer must be empty */
-		pos = lseek(fileno(stream), offset, swhence);
+		pos = lseek(fileno(stream), offset, whence);
+	} else	/* neither reading nor writing. The buffer must be empty */
+		pos = lseek(fileno(stream), offset, whence);
 
 	if (io_testflag(stream, _IOREAD) && io_testflag(stream, _IOWRITE))
 		stream->_flags &= ~(_IOREADING | _IOWRITING);

+ 10 - 4
lang/cem/libcc.ansi/stdio/ftell.c

@@ -4,10 +4,16 @@
 /* $Header$ */
 
 #include	<stdio.h>
-#include	<sys/file.h>
+
+#if	(SEEK_CUR != 1) || (SEEK_SET != 0) || (SEEK_END != 2)
+#error SEEK_* values are wrong
+#endif
+
 #include	"loc_incl.h"
 
-int lseek(int d, int offset, int whence);
+#include	<sys/types.h>
+
+off_t lseek(int fildes, off_t offset, int whence);
 
 long ftell(FILE *stream)
 {
@@ -21,8 +27,8 @@ long ftell(FILE *stream)
 		    && !io_testflag(stream,_IONBF))
 		adjust = stream->_ptr - stream->_buf;
 	else adjust = 0;
-	
-	result = lseek(fileno(stream), 0, L_INCR);
+
+	result = lseek(fileno(stream), 0, SEEK_CUR);
 
 	if ( result == -1 )
 		return result;

+ 6 - 5
lang/cem/libcc.ansi/stdio/fwrite.c

@@ -6,20 +6,21 @@
 #include	<stdio.h>
 
 size_t
-fwrite(register const void *ptr, size_t size, size_t nmemb,
+fwrite(const void *ptr, size_t size, size_t nmemb,
 	    register FILE *stream)
 {
-	unsigned s;
-	unsigned ndone = 0;
+	register const unsigned char *cp = ptr;
+	register size_t s;
+	size_t ndone = 0;
 
 	if (size)
 		while ( ndone < nmemb ) {
 			s = size;
 			do {
-				if (putc((int)*(unsigned char *)ptr, stream)
+				if (putc((int)*cp, stream)
 					== EOF)
 					return ndone;
-				ptr++;
+				cp++;
 			} 
 			while (--s);
 			ndone++;

+ 2 - 4
lang/cem/libcc.ansi/stdio/getc.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	getc
-
 int
-getc(FILE *stream)
+(getc)(FILE *stream)
 {
-	return fgetc(stream);
+	return getc(stream);
 }

+ 2 - 4
lang/cem/libcc.ansi/stdio/getchar.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	getchar
-
 int
-getchar(void)
+(getchar)(void)
 {
-	return getc(stdin);
+	return getchar();
 }

+ 7 - 3
lang/cem/libcc.ansi/stdio/gets.c

@@ -8,15 +8,19 @@
 char *
 gets(char *s)
 {
+	register FILE *stream = stdin;
 	register int ch;
 	register char *ptr;
 
 	ptr = s;
-	while ((ch = getc(stdin)) != EOF && ch != '\n')
+	while ((ch = getc(stream)) != EOF && ch != '\n')
 		*ptr++ = ch;
 
-	if (ch == EOF && ptr==s)
-		return (char *)NULL;
+	if (ch == EOF) {
+		if (feof(stream)) {
+			if (ptr == s) return NULL;
+		} else return NULL;
+	}
 
 	*ptr = '\0';
 	return s;

+ 21 - 0
lang/cem/libcc.ansi/stdio/icompute.c

@@ -0,0 +1,21 @@
+/*
+ * icompute.c - compute an integer
+ */
+/* $Header$ */
+
+#include	"loc_incl.h"
+
+/* This routine is used in doprnt.c as well as in tmpfile.c and tmpnam.c. */
+
+char *
+_i_compute(unsigned long val, int base, char *s, int nrdigits)
+{
+	int c;
+
+	c= val % base ;
+	val /= base ;
+	if (val || nrdigits > 0)
+		s = _i_compute(val, base, s, nrdigits - 1);
+	*s++ = (c>9 ? c-10+'a' : c+'0');
+	return s;
+}

+ 17 - 0
lang/cem/libcc.ansi/stdio/isatty.c

@@ -0,0 +1,17 @@
+/*
+ * isatty - check if a file descriptor is associated with a terminal
+ */
+/* $Header$ */
+
+int gtty(int d, char *buf);
+
+int isatty(int d)
+{
+	char buf[128]; 
+	/* not a sgttyb struct; it might not be large enough;
+	   I know for a fact that it isn't large enough on PC/IX,
+	   where gtty is an ioctl(..., TCGETA, ...)
+	*/
+
+	return gtty(d, buf) >= 0;
+}

+ 0 - 2
lang/cem/libcc.ansi/stdio/printf.c

@@ -16,8 +16,6 @@ printf(const char *format, ...)
 	va_start(ap, format);
 
 	retval = _doprnt(format, ap, stdout);
-	if (retval >= 0 && io_testflag(stdout,_IOLBF))
-		if (fflush(stdout)) return EOF;
 
 	va_end(ap);
 

+ 2 - 4
lang/cem/libcc.ansi/stdio/putc.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	putc
-
 int
-putc(int c, FILE *stream)
+(putc)(int c, FILE *stream)
 {
-	return fputc(c, stream);
+	return putc(c, stream);
 }

+ 2 - 4
lang/cem/libcc.ansi/stdio/putchar.c

@@ -5,10 +5,8 @@
 
 #include	<stdio.h>
 
-#undef	putchar
-
 int
-putchar(int c)
+(putchar)(int c)
 {
-	return putc(c, stdout);
+	return putchar(c);
 }

+ 9 - 1
lang/cem/libcc.ansi/stdio/puts.c

@@ -8,5 +8,13 @@
 int
 puts(register const char *s)
 {
-	return fputs(s, stdout);
+	register FILE *file = stdout;
+	register int i = 0;
+
+	while (*s) {
+		if (putc(*s++, file) == EOF) return EOF;
+		else i++;
+	}
+	if (putc('\n', file) == EOF) return EOF;
+	return i + 1;
 }

+ 0 - 1
lang/cem/libcc.ansi/stdio/rename.c

@@ -6,7 +6,6 @@
 #include	<stdio.h>
 
 int link(const char *name1, const char *name2);
-int unlink(const char *path);
 
 int
 rename(const char *old, const char *new) {

+ 3 - 0
lang/cem/libcc.ansi/stdio/setvbuf.c

@@ -7,11 +7,14 @@
 #include	<stdlib.h>
 #include	"loc_incl.h"
 
+extern int (*_fflush)(FILE *stream);
+
 int
 setvbuf(register FILE *stream, char *buf, int mode, size_t size)
 {
 	int retval = 0;
 
+	_fflush = fflush;
 	if (mode != _IOFBF && mode != _IOLBF && mode != _IONBF)
 		return EOF;
 

+ 1 - 1
lang/cem/libcc.ansi/stdio/sprintf.c

@@ -17,7 +17,7 @@ sprintf(char * s, const char *format, ...)
 	va_start(ap, format);
 
 	tmp_stream._fd     = -1;
-	tmp_stream._flags  = _IOWRITE + _IONBF;
+	tmp_stream._flags  = _IOWRITE + _IONBF + _IOWRITING;
 	tmp_stream._buf    = (unsigned char *) s;
 	tmp_stream._ptr    = (unsigned char *) s;
 	tmp_stream._count  = 32767;

+ 4 - 3
lang/cem/libcc.ansi/stdio/sscanf.c

@@ -5,9 +5,10 @@
 
 #include	<stdio.h>
 #include	<stdarg.h>
+#include	<string.h>
 #include	"loc_incl.h"
 
-int sscanf(const char *s, const char *format, ...)
+int sscanf(char *s, const char *format, ...)
 {
 	va_list ap;
 	int retval;
@@ -16,10 +17,10 @@ int sscanf(const char *s, const char *format, ...)
 	va_start(ap, format);
 
 	tmp_stream._fd     = -1;
-	tmp_stream._flags  = _IOREAD + _IONBF;
+	tmp_stream._flags  = _IOREAD + _IONBF + _IOREADING;
 	tmp_stream._buf    = (unsigned char *) s;
 	tmp_stream._ptr    = (unsigned char *) s;
-	tmp_stream._count  = 32767;
+	tmp_stream._count  = strlen(s);
 
 	retval = _doscan(&tmp_stream, format, ap);
 

+ 1 - 7
lang/cem/libcc.ansi/stdio/vfprintf.c

@@ -10,11 +10,5 @@
 int
 vfprintf(FILE *stream, const char *format, va_list arg)
 {
-	int retval;
-
-	retval = _doprnt (format, arg, stream);
-	if (io_testflag(stream, _IOLBF))
-		fflush(stream);
-
-	return retval;
+	return _doprnt (format, arg, stream);
 }

+ 1 - 7
lang/cem/libcc.ansi/stdio/vprintf.c

@@ -10,11 +10,5 @@
 int
 vprintf(const char *format, va_list arg)
 {
-	int retval;
-
-	retval = _doprnt(format, arg, stdout);
-	if (retval >= 0 && io_testflag(stdout, _IOLBF))
-		if (fflush(stdout)) return EOF;
-
-	return retval;
+	return _doprnt(format, arg, stdout);
 }