summaryrefslogblamecommitdiffstats
path: root/source/ap/ash/patches/ash-memout.patch
blob: 1bfedadaa27f5ea8bb3c249b17f565bb1efe7da0 (plain) (tree)












































































































































































































































































































































                                                                                                                     
diff -u ash-0.4.0/eval.c ash-0.4.0-/eval.c
--- ash-0.4.0/eval.c	Tue Apr 24 00:53:12 2001
+++ ash-0.4.0-/eval.c	Tue Apr 24 00:13:57 2001
@@ -879,9 +879,13 @@
 #endif
 		mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH;
 		if (flags == EV_BACKCMD) {
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+			openmemout();
+#else
 			memout.nleft = 0;
 			memout.nextc = memout.buf;
 			memout.bufsize = 64;
+#endif
 			mode |= REDIR_BACKQ;
 		}
 		redirect(cmd->ncmd.redirect, mode);
@@ -928,10 +932,18 @@
 		if (cmdentry.u.index != EXECCMD)
 			popredir();
 		if (flags == EV_BACKCMD) {
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+			closememout();
+#endif
 			backcmd->buf = memout.buf;
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+			backcmd->nleft = memout.bufsize;
+#else
 			backcmd->nleft = memout.nextc - memout.buf;
+#endif
 			memout.buf = NULL;
 		}
+		cmdenviron = NULL;
 	} else {
 #ifdef DEBUG
 		trputs("normal command:  ");  trargs(argv);
Common subdirectories: ash-0.4.0/funcs and ash-0.4.0-/funcs
diff -u ash-0.4.0/output.c ash-0.4.0-/output.c
--- ash-0.4.0/output.c	Fri Jan 12 17:50:39 2001
+++ ash-0.4.0-/output.c	Tue Apr 24 00:43:44 2001
@@ -65,6 +65,10 @@
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+#undef CEOF			/* get rid of the redefine warning */
+#include <fcntl.h>
+#endif
 
 #include "shell.h"
 #include "syntax.h"
@@ -79,9 +83,15 @@
 #define OUTPUT_ERR 01		/* error occurred on output */
 
 
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+struct output output = {NULL, NULL, 0, NULL, 0, 1, 0};
+struct output errout = {NULL, NULL, 0, NULL, 0, 2, 0};
+struct output memout = {NULL, NULL, 0, NULL, 0, MEM_OUT, 0};
+#else
 struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0};
 struct output errout = {NULL, 0, NULL, 100, 2, 0};
 struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0};
+#endif
 struct output *out1 = &output;
 struct output *out2 = &errout;
 
@@ -92,9 +102,19 @@
 INCLUDE "output.h"
 INCLUDE "memalloc.h"
 
+INIT {
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+	initstreams();
+#endif
+}
+
 RESET {
 	out1 = &output;
 	out2 = &errout;
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+	if (memout.stream != NULL)
+		closememout();
+#endif
 	if (memout.buf != NULL) {
 		ckfree(memout.buf);
 		memout.buf = NULL;
@@ -124,33 +144,22 @@
 
 
 void
-out1str(p)
-	const char *p;
-	{
-	outstr(p, out1);
-}
-
-
-void
-out2str(p)
-	const char *p;
-	{
-	outstr(p, out2);
-}
-
-
-void
 outstr(p, file)
 	const char *p;
 	struct output *file;
 	{
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+	fputs(p, file->stream);
+#else
 	while (*p)
 		outc(*p++, file);
+#endif
 	if (file == out2)
 		flushout(file);
 }
 
 
+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__)
 char out_junk[16];
 
 
@@ -183,6 +192,7 @@
 	}
 	dest->nleft--;
 }
+#endif
 
 
 void
@@ -192,11 +202,11 @@
 }
 
 
+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__)
 void
 flushout(dest)
 	struct output *dest;
 	{
-
 	if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0)
 		return;
 	if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
@@ -204,6 +214,7 @@
 	dest->nextc = dest->buf;
 	dest->nleft = dest->bufsize;
 }
+#endif
 
 
 void
@@ -264,6 +275,7 @@
 	va_end(ap);
 }
 
+#if !defined(__GLIBC__) && !defined(__UCLIBC__)
 void
 #ifdef __STDC__
 dprintf(const char *fmt, ...)
@@ -285,6 +297,7 @@
 	va_end(ap);
 	flushout(out2);
 }
+#endif
 
 void
 #ifdef __STDC__
@@ -295,7 +308,9 @@
 #endif
 {
 	va_list ap;
+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__)
 	struct output strout;
+#endif
 #ifndef __STDC__
 	char *outbuf;
 	size_t length;
@@ -308,6 +323,9 @@
 #else
 	va_start(ap, fmt);
 #endif
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+	vsnprintf(outbuf, length, fmt, ap);
+#else
 	strout.nextc = outbuf;
 	strout.nleft = length;
 	strout.fd = BLOCK_OUT;
@@ -316,8 +334,10 @@
 	outc('\0', &strout);
 	if (strout.flags & OUTPUT_ERR)
 		outbuf[length - 1] = '\0';
+#endif
 }
 
+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__)
 /*
  * Formatted output.  This routine handles a subset of the printf formats:
  * - Formats supported: d, u, o, p, X, s, and c.
@@ -534,7 +554,7 @@
 	}
 #endif	/* !HAVE_VASPRINTF */
 }
-
+#endif
 
 
 /*
@@ -544,7 +564,7 @@
 int
 xwrite(fd, buf, nbytes)
 	int fd;
-	char *buf;
+	const char *buf;
 	int nbytes;
 	{
 	int ntry;
@@ -570,6 +590,8 @@
 }
 
 
+
+#ifdef notdef
 /*
  * Version of ioctl that retries after a signal is caught.
  * XXX unused function
@@ -586,3 +608,27 @@
 	while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR);
 	return i;
 }
+#endif
+
+
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+void initstreams() {
+	output.stream = stdout;
+	errout.stream = stderr;
+}
+
+
+void
+openmemout() {
+	memout.stream = open_memstream(&memout.buf, &memout.bufsize);
+}
+
+
+void
+closememout() {
+	INTOFF;
+	fclose(memout.stream);
+	memout.stream = NULL;
+	INTON;
+}
+#endif
diff -u ash-0.4.0/output.h ash-0.4.0-/output.h
--- ash-0.4.0/output.h	Sat Jan 31 19:28:11 1998
+++ ash-0.4.0-/output.h	Tue Apr 24 00:13:57 2001
@@ -45,13 +45,19 @@
 #else
 #include <varargs.h>
 #endif
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+#include <stdio.h>
+#endif
 
 struct output {
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+	FILE *stream;
+#endif
 	char *nextc;
 	int nleft;
 	char *buf;
 	int bufsize;
-	short fd;
+	int fd;
 	short flags;
 };
 
@@ -61,29 +67,44 @@
 extern struct output *out1;
 extern struct output *out2;
 
-void open_mem __P((char *, int, struct output *));
-void out1str __P((const char *));
-void out2str __P((const char *));
 void outstr __P((const char *, struct output *));
+#ifndef _GNU_SOURCE
 void emptyoutbuf __P((struct output *));
+#endif
 void flushall __P((void));
+#ifndef _GNU_SOURCE
 void flushout __P((struct output *));
+#endif
 void freestdout __P((void));
 void outfmt __P((struct output *, const char *, ...))
     __attribute__((__format__(__printf__,2,3)));
 void out1fmt __P((const char *, ...))
     __attribute__((__format__(__printf__,1,2)));
+#if !defined(__GLIBC__) && !defined(__UCLIBC__)
 void dprintf __P((const char *, ...))
     __attribute__((__format__(__printf__,1,2)));
+#endif
 void fmtstr __P((char *, size_t, const char *, ...))
     __attribute__((__format__(__printf__,3,4)));
+#ifndef _GNU_SOURCE
 void doformat __P((struct output *, const char *, va_list));
-int xwrite __P((int, char *, int));
-int xioctl __P((int, unsigned long, char *));
+#endif
+int xwrite __P((int, const char *, int));
+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__)
+void initstreams __P((void));
+void openmemout __P((void));
+void closememout __P((void));
 
+#define outc(c, o)	putc(c, (o)->stream)
+#define flushout(o)	fflush((o)->stream)
+#define doformat(d, f, a)	vfprintf((d)->stream, f, a)
+#else
 #define outc(c, file)	(--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
-#define out1c(c)	outc(c, out1);
-#define out2c(c)	outc(c, out2);
+#endif
+#define out1c(c)	outc(c, out1)
+#define out2c(c)	outc(c, out2)
+#define out1str(s)	outstr(s, out1)
+#define out2str(s)	outstr(s, out2)
 
 #define OUTPUT_INCL
 #endif