1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*	$NetBSD: output.c,v 1.28 2003/08/07 09:05:36 agc Exp $	*/
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*-
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist.
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met:
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    documentation and/or other materials provided with the distribution.
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    may be used to endorse or promote products derived from this software
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    without specific prior written permission.
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE.
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/cdefs.h>
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef lint
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char sccsid[] = "@(#)output.c	8.2 (Berkeley) 5/4/95";
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: output.c,v 1.28 2003/08/07 09:05:36 agc Exp $");
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* not lint */
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Shell output routines.  We use our own output routines because:
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	When a builtin command is interrupted we have to discard
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *		any pending output.
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	When a builtin command appears in back quotes, we want to
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *		save the output of the command in a region obtained
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *		via malloc, rather than doing a fork and reading the
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *		output of the command via a pipe.
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	Our output routines may be smaller than the stdio routines.
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>		/* quad_t */
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/param.h>		/* BSD4_4 */
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/ioctl.h>
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>	/* defines BUFSIZ */
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h"
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "syntax.h"
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h"
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h"
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h"
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OUTBUFSIZ BUFSIZ
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define BLOCK_OUT -2		/* output to a fixed block of memory */
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define MEM_OUT -3		/* output to dynamically allocated memory */
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define OUTPUT_ERR 01		/* error occurred on output */
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0};
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct output errout = {NULL, 0, NULL, 100, 2, 0};
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0};
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct output *out1 = &output;
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct output *out2 = &errout;
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef mkinit
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE "output.h"
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE "memalloc.h"
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectRESET {
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	out1 = &output;
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	out2 = &errout;
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (memout.buf != NULL) {
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ckfree(memout.buf);
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		memout.buf = NULL;
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef notdef	/* no longer used */
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Set up an output file to write to memory rather than a file.
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectopen_mem(char *block, int length, struct output *file)
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	file->nextc = block;
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	file->nleft = --length;
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	file->fd = BLOCK_OUT;
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	file->flags = 0;
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectout1str(const char *p)
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	outstr(p, out1);
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectout2str(const char *p)
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	outstr(p, out2);
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoutstr(const char *p, struct output *file)
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (*p)
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		outc(*p++, file);
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (file == out2)
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		flushout(file);
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar out_junk[16];
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectemptyoutbuf(struct output *dest)
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int offset;
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (dest->fd == BLOCK_OUT) {
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nextc = out_junk;
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nleft = sizeof out_junk;
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->flags |= OUTPUT_ERR;
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else if (dest->buf == NULL) {
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		INTOFF;
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->buf = ckmalloc(dest->bufsize);
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nextc = dest->buf;
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nleft = dest->bufsize;
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		INTON;
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else if (dest->fd == MEM_OUT) {
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		offset = dest->bufsize;
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		INTOFF;
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->bufsize <<= 1;
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->buf = ckrealloc(dest->buf, dest->bufsize);
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nleft = dest->bufsize - offset;
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->nextc = dest->buf + offset;
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		INTON;
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else {
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		flushout(dest);
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	dest->nleft--;
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectflushall(void)
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	flushout(&output);
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	flushout(&errout);
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectflushout(struct output *dest)
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0)
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return;
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		dest->flags |= OUTPUT_ERR;
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	dest->nextc = dest->buf;
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	dest->nleft = dest->bufsize;
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfreestdout(void)
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTOFF;
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (output.buf) {
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ckfree(output.buf);
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		output.buf = NULL;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		output.nleft = 0;
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTON;
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoutfmt(struct output *file, const char *fmt, ...)
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_list ap;
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_start(ap, fmt);
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	doformat(file, fmt, ap);
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_end(ap);
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectout1fmt(const char *fmt, ...)
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_list ap;
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_start(ap, fmt);
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	doformat(out1, fmt, ap);
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_end(ap);
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdprintf(const char *fmt, ...)
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_list ap;
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_start(ap, fmt);
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	doformat(out2, fmt, ap);
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_end(ap);
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	flushout(out2);
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfmtstr(char *outbuf, size_t length, const char *fmt, ...)
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_list ap;
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct output strout;
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_start(ap, fmt);
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strout.nextc = outbuf;
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strout.nleft = length;
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strout.fd = BLOCK_OUT;
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	strout.flags = 0;
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	doformat(&strout, fmt, ap);
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	outc('\0', &strout);
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (strout.flags & OUTPUT_ERR)
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		outbuf[length - 1] = '\0';
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	va_end(ap);
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Formatted output.  This routine handles a subset of the printf formats:
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - Formats supported: d, u, o, p, X, s, and c.
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - The x format is also accepted but is treated like X.
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - The l, ll and q modifiers are accepted.
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - The - and # flags are accepted; # only works with the o format.
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - Width and precision may be specified with any format except c.
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - An * may be given for the width or precision.
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - The obsolete practice of preceding the width with a zero to get
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *   zero padding is not supported; use the precision field.
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * - A % may be printed by writing %% in the format string.
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define TEMPSIZE 24
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define HAVE_VASPRINTF 1
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdoformat(struct output *dest, const char *f, va_list ap)
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if	HAVE_VASPRINTF
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *s;
284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	vasprintf(&s, f, ap);
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	outstr(s, dest);
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	free(s);
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else	/* !HAVE_VASPRINTF */
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	static const char digit[] = "0123456789ABCDEF";
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char c;
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char temp[TEMPSIZE];
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int flushleft;
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int sharp;
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int width;
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int prec;
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int islong;
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int isquad;
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *p;
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int sign;
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	quad_t l;
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u_quad_t num;
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	long l;
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u_long num;
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	unsigned base;
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int len;
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int size;
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int pad;
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((c = *f++) != '\0') {
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (c != '%') {
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			outc(c, dest);
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			continue;
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		flushleft = 0;
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		sharp = 0;
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		width = 0;
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		prec = -1;
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		islong = 0;
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		isquad = 0;
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (;;) {
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (*f == '-')
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				flushleft++;
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else if (*f == '#')
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				sharp++;
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				break;
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			f++;
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*f == '*') {
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			width = va_arg(ap, int);
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			f++;
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else {
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (is_digit(*f)) {
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				width = 10 * width + digit_val(*f++);
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*f == '.') {
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (*++f == '*') {
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				prec = va_arg(ap, int);
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				f++;
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else {
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				prec = 0;
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				while (is_digit(*f)) {
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					prec = 10 * prec + digit_val(*f++);
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				}
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*f == 'l') {
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			f++;
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (*f == 'l') {
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				isquad++;
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				f++;
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				islong++;
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else if (*f == 'q') {
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			isquad++;
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			f++;
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		switch (*f) {
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'd':
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (isquad)
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				l = va_arg(ap, quad_t);
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (islong)
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				l = va_arg(ap, long);
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				l = va_arg(ap, int);
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			sign = 0;
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			num = l;
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (l < 0) {
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				num = -l;
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				sign = 1;
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			base = 10;
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto number;
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'u':
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			base = 10;
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto uns_number;
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'o':
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			base = 8;
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto uns_number;
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'p':
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			outc('0', dest);
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			outc('x', dest);
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			/*FALLTHROUGH*/
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'x':
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			/* we don't implement 'x'; treat like 'X' */
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'X':
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			base = 16;
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectuns_number:	  /* an unsigned number */
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			sign = 0;
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef BSD4_4
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (isquad)
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				num = va_arg(ap, u_quad_t);
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (islong)
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				num = va_arg(ap, unsigned long);
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				num = va_arg(ap, unsigned int);
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnumber:		  /* process a number */
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			p = temp + TEMPSIZE - 1;
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			*p = '\0';
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (num) {
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				*--p = digit[num % base];
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				num /= base;
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			len = (temp + TEMPSIZE - 1) - p;
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (prec < 0)
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				prec = 1;
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (sharp && *f == 'o' && prec <= len)
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				prec = len + 1;
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			pad = 0;
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (width) {
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				size = len;
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (size < prec)
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					size = prec;
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				size += sign;
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				pad = width - size;
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (flushleft == 0) {
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					while (--pad >= 0)
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project						outc(' ', dest);
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				}
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (sign)
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc('-', dest);
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			prec -= len;
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (--prec >= 0)
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc('0', dest);
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (*p)
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc(*p++, dest);
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (--pad >= 0)
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc(' ', dest);
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 's':
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			p = va_arg(ap, char *);
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			pad = 0;
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (width) {
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				len = strlen(p);
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (prec >= 0 && len > prec)
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					len = prec;
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				pad = width - len;
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (flushleft == 0) {
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					while (--pad >= 0)
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project						outc(' ', dest);
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				}
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			prec++;
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (--prec != 0 && *p)
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc(*p++, dest);
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			while (--pad >= 0)
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outc(' ', dest);
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'c':
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			c = va_arg(ap, int);
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			outc(c, dest);
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		default:
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			outc(*f, dest);
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		f++;
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif	/* !HAVE_VASPRINTF */
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Version of write which resumes after a signal is caught.
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectxwrite(int fd, char *buf, int nbytes)
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int ntry;
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int n;
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	n = nbytes;
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ntry = 0;
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (;;) {
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		i = write(fd, buf, n);
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (i > 0) {
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if ((n -= i) <= 0)
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return nbytes;
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			buf += i;
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ntry = 0;
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else if (i == 0) {
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (++ntry > 10)
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return nbytes - n;
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else if (errno != EINTR) {
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return -1;
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Version of ioctl that retries after a signal is caught.
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * XXX unused function
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectxioctl(int fd, unsigned long request, char *arg)
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR);
515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return i;
516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
517