da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Bell Laboratories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <cmd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <fcntl.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-?\n@(#)$Id: cat (AT&T Research) 2009-03-31 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
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
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.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[R:regress?Regression test defaults: \b-v\b buffer size 4.]"
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
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n[file ...]\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\bcp\b(1), \bgetconf\b(1), \bpr\b(1)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RUBOUT 0177
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* control flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define B_FLAG (1<<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define E_FLAG (1<<1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define F_FLAG (1<<2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define N_FLAG (1<<3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_FLAG (1<<4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_FLAG (1<<5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define U_FLAG (1<<6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define V_FLAG (1<<7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define D_FLAG (1<<8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define d_FLAG (1<<9)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* character types */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_ERROR 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_EOF 2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_ENDBUF 3
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_NEWLINE 4
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_CONTROL 5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_EIGHTBIT 6
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define T_CNTL8BIT 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define printof(c) ((c)^0100)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypedef void* (*Reserve_f)(Sfio_t*, ssize_t, int);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#ifndef sfvalue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define sfvalue(f) ((f)->_val)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic void*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzregress(Sfio_t* sp, ssize_t n, int f)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz void* r;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(r = sfreserve(sp, 4, f)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz r = sfreserve(sp, n, f);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (sfvalue(sp) > 4)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfvalue(sp) = 4;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return r;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * called for any special output processing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzvcat(register char* states, Sfio_t* ip, Sfio_t* op, Reserve_f reserve, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char* cp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register unsigned char* pp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unsigned char* cur;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unsigned char* end;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unsigned char* buf;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unsigned char* nxt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register int line;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register int raw;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int last;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int c;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int m;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int any;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int header;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char meta[4];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unsigned char tmp[32];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin meta[0] = 'M';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin meta[1] = '-';
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = buf = end = tmp) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz any = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = flags & (B_FLAG|N_FLAG);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = T_ENDBUF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz raw = !mbwide();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cur = cp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (raw)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while (!(n = states[*cp++]));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for (;;)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while (!(n = states[*cp++]));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (n < T_CONTROL)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((m = mbsize(pp = cp - 1)) > 1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp += m - 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (m <= 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (cur == pp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (last > 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *end = last;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz c = end - pp + 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((m = mbsize(pp)) == c)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz any = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (header)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(op, "%6d\t", line);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfwrite(op, cur, m);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = cur = end) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz memcpy(tmp, pp, c);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = sfvalue(ip) ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = end = tmp + sizeof(tmp) - 1) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if ((n = sfvalue(ip)) <= 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = n ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = end = tmp + sizeof(tmp) - 1) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = buf = nxt;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz end = buf + n - 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = *end;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *end = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mb:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((n = end - cp + 1) >= (sizeof(tmp) - c))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = sizeof(tmp) - c - 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz memcpy(tmp + c, cp, n);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((m = mbsize(tmp)) >= c)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz any = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (header)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(op, "%6d\t", line);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfwrite(op, tmp, m);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cur = cp += m - c;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = pp + 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz c = *--cp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((m = cp - cur) || n >= T_CONTROL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz flush:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz any = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (header)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(op, "%6d\t", line);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (m)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfwrite(op, cur, m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz special:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_ERROR:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (cp != end)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_CONTROL;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto flush;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_EOF:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (cp != end)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_CONTROL;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto flush;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_ENDBUF:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (cp != end)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_CONTROL;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto flush;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz c = last;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = end = tmp) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = sfvalue(ip) ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if ((m = sfvalue(ip)) <= 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cp = end = tmp) = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = m ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz buf = nxt;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz end = buf + m - 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = *end;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *end = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = buf;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (c >= 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(n = states[c]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *(cur = tmp) = c;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz m = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto flush;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (raw || n < T_CONTROL)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp--;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto special;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz tmp[0] = c;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz c = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz goto mb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_CONTROL:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, '^');
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, printof(c));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } while (states[c = *++cp] == T_CONTROL);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_CNTL8BIT:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz meta[2] = '^';
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = c & ~0200;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz meta[3] = printof(n);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfwrite(op, (char*)meta, 4);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } while (states[c = *++cp] == T_CNTL8BIT && raw);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_EIGHTBIT:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz meta[2] = c & ~0200;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfwrite(op, (char*)meta, 3);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } while (states[c = *++cp] == T_EIGHTBIT && raw);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case T_NEWLINE:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (header && !(flags & B_FLAG))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(op, "%6d\t", line);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (flags & E_FLAG)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, '$');
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, '\n');
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!header || !(flags & B_FLAG))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line++;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = !(flags & S_FLAG);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for (;;)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((n = states[*++cp]) == T_ENDBUF)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (cp != end || last != '\n')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = sfvalue(ip) ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = end = tmp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *cp-- = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if ((n = sfvalue(ip)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz states[0] = n ? T_ERROR : T_EOF;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = end = tmp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *cp-- = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz buf = nxt;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz end = buf + n - 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz last = *end;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *end = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cp = buf - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (n != T_NEWLINE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(flags & S_FLAG) || any || header)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz any = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((flags & (B_FLAG|N_FLAG)) == N_FLAG)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(op, "%6d\t", line);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (flags & E_FLAG)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, '$');
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfputc(op, '\n');
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!(flags & B_FLAG))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz header = flags & (B_FLAG|N_FLAG);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb_cat(int argc, char** argv, void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Sfio_t* fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* mode;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Reserve_f reserve = sfreserve;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int att;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int dovcat = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char states[UCHAR_MAX+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin att = !strcmp(astconf("UNIVERSE", NiL, NiL), "att");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode = "r";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (optget(argv, usage))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'A':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_FLAG|E_FLAG|V_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'B':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = S_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'b':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = B_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 'd':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz mode = opt_info.num ? "rt" : "r";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 'D':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = d_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'E':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = E_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'e':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = E_FLAG|V_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'n':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = N_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 'R':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz reserve = opt_info.num ? regress : sfreserve;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = att ? F_FLAG : S_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'S':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = F_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'T':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 't':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = T_FLAG|V_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'u':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = U_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'v':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = V_FLAG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!n)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (opt_info.num)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz flags |= n;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz flags &= ~n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (error_info.errors)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_usage(2), "%s", optusage(NiL));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(states, 0, sizeof(states));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&V_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(states, T_CONTROL, ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states[RUBOUT] = T_CONTROL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(states+0200, T_EIGHTBIT, 0200);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(states+0200, T_CNTL8BIT, ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states[RUBOUT|0200] = T_CNTL8BIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\n'] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&T_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\t'] = T_CONTROL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states[0] = T_ENDBUF;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (att)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&V_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\n'|0200] = T_EIGHTBIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags&T_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\t'] = states['\f'] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\t'|0200] = states['\f'|0200] = T_EIGHTBIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags&T_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\t'] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (flags&(V_FLAG|T_FLAG|N_FLAG|E_FLAG|B_FLAG|S_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states['\n'] = T_NEWLINE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dovcat = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&d_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfopen(sfstdout, NiL, "wt");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (cp = *argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!cp || streq(cp, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = sfstdin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&D_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfopen(fp, NiL, mode);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(fp = sfopen(NiL, cp, mode)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags&F_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(0), "%s: cannot open", cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.errors = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&U_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsetbuf(fp, (void*)fp, -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dovcat)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = vcat(states, fp, sfstdout, reserve, flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (sfmove(fp, sfstdout, SF_UNBOUND, -1) >= 0 && sfeof(fp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fp != sfstdin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclose(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < 0 && errno != EPIPE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(0), "%s: read error", cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(0), "read error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (sferror(sfstdout))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (cp = *argv++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (sfsync(sfstdout))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_system(0), "write error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags&d_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfopen(sfstdout, NiL, "w");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return error_info.errors;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}