cat.c revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Copyright (c) 1992-2007 AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* by AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Bell Laboratories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[-?\n@(#)$Id: cat (AT&T Research) 2006-05-17 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?cat - concatenate files]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bcat\b copies each \afile\a in sequence to the standard"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" output. If no \afile\a is given, or if the \afile\a is \b-\b,"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \bcat\b copies from standard input starting at the current location.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[b:number-nonblank?Number lines as with \b-n\b but omit line numbers from"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" blank lines.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[d:dos-input?Input files are opened in \atext\amode which removes carriage"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" returns in front of new-lines on some systems.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[e?Equivalent to \b-vE\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[n:number?Causes a line number to be inserted at the beginning of each line.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[s?Equivalent to \b-S\b for \aatt\a universe and \b-B\b otherwise.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[t?Equivalent to \b-vT\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[u:unbuffer?The output is not delayed by buffering.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[v:show-nonprinting?Causes non-printing characters (whith the exception of"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" tabs, new-lines, and form-feeds) to be output as printable charater"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" sequences. ASCII control characters are printed as \b^\b\an\a,"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" where \an\a is the corresponding ASCII character in the range"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" octal 100-137. The DEL character (octal 0177) is copied"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" as \b^?\b. Other non-printable characters are copied as \bM-\b\ax\a"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" where \ax\a is the ASCII character specified by the low-order seven"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" bits. Multibyte characters in the current locale are treated as"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" printable characters.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[A:show-all?Equivalent to \b-vET\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[B:squeeze-blank?Multiple adjacent new-line characters are replace by one"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" new-line.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[D:dos-output?Output files are opened in \atext\amode which inserts carriage"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" returns in front of new-lines on some systems.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[E:show-ends?Causes a \b$\b to be inserted before each new-line.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[S:silent?\bcat\b is silent about non-existent files.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[T:show-blank?Causes tabs to be copied as \b^I\b and formfeeds as \b^L\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n[file ...]\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\bcp\b(1), \bgetconf\b(1), \bpr\b(1)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* control flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* character types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * called for any special output processing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvcat(register char* states, Sfio_t *fdin, Sfio_t *fdout, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char* cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char* cpold;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char* endbuff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char* inbuff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* read in a buffer full */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(inbuff = (unsigned char*)sfreserve(fdin, SF_UNBOUND, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over printable characters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((n = (m = mbsize(cp)) < 2 ? states[*cp++] : (cp += m, states['a'])) == 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (sfmove(fp, sfstdout, SF_UNBOUND, -1) >= 0 && sfeof(fp))