output.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
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