summaryrefslogtreecommitdiff
path: root/usr/src/lib/libcmd/common/paste.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libcmd/common/paste.c')
-rw-r--r--usr/src/lib/libcmd/common/paste.c278
1 files changed, 0 insertions, 278 deletions
diff --git a/usr/src/lib/libcmd/common/paste.c b/usr/src/lib/libcmd/common/paste.c
deleted file mode 100644
index 0c20109dda..0000000000
--- a/usr/src/lib/libcmd/common/paste.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1992-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* Glenn Fowler <gsf@research.att.com> *
-* David Korn <dgk@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-/*
- * David Korn
- * AT&T Bell Laboratories
- *
- * paste [-s] [-d delim] [file] ...
- *
- * paste lines from files together
- */
-
-static const char usage[] =
-"[-?\n@(#)$Id: paste (AT&T Research) 2009-11-28 $\n]"
-USAGE_LICENSE
-"[+NAME?paste - merge lines of files]"
-"[+DESCRIPTION?\bpaste\b concatenates the corresponding lines of a "
- "given input file and writes the resulting lines to standard "
- "output. By default \bpaste\b replaces the newline character of "
- "every line other than the last input file with the TAB character.]"
-"[+?Unless the \b-s\b option is specified, if an end-of-file is encountered "
- "on one or more input files, but not all input files, \bpaste\b "
- "behaves as if empty lines were read from the file(s) on which "
- "end-of-file was detected.]"
-"[+?Unless the \b-s\b option is specified, \bpaste\b is limited by "
- "the underlying operating system on how many \afile\a operands "
- "can be specified.]"
-"[+?If no \afile\a operands are given or if the \afile\a is \b-\b, \bpaste\b "
- "reads from standard input. The start of the file is defined as the "
- "current offset.]"
-
-"[s:serial?Paste the lines of one file at a time rather than one line "
- "from each file. In this case if the \b-d\b option is "
- "specified the delimiter will be reset to the first in the "
- "list at the beginning of each file.]"
-"[d:delimiters]:[list?\alist\a specifies a list of delimiters. These "
- "delimiters are used circularly instead of TAB to replace "
- "the newline character of the input lines. Unless the \b-s\b "
- "option is specified, the delimiter will be reset to the first "
- "element of \alist\a each time a line is processed from each file. "
- "The delimiter characters corresponding to \alist\a will be found "
- "by treating \alist\a as an ANSI-C string, except that the \b\\0\b "
- "sequence will insert the empty string instead of the null character.]"
-"\n"
-"\n[file ...]\n"
-"\n"
-"[+EXIT STATUS?]{"
- "[+0?All files processed successfully.]"
- "[+>0?An error occurred.]"
-"}"
-"[+SEE ALSO?\bcut\b(1), \bcat\b(1), \bjoin\b(1)]"
-;
-
-#include <cmd.h>
-
-typedef struct Delim_s
-{
- const char* chr;
- size_t len;
-} Delim_t;
-
-/*
- * paste the lines of the <nstreams> defined in <streams> and put results
- * to <out>
- */
-
-static int paste(int nstream,Sfio_t* streams[],Sfio_t *out, register const char *delim, int dsiz, int dlen, Delim_t* mp)
-{
- register const char *cp;
- register int d, n, i, z, more=1;
- register Sfio_t *fp;
- do
- {
- d = (dlen>0?0:-1);
- for(n=more-1,more=0; n < nstream;)
- {
- if(fp=streams[n])
- {
- if(cp = sfgetr(fp,'\n',0))
- {
- if(n==0)
- more = 1;
- else if(!more) /* first stream with output */
- {
- if(dsiz == 1)
- sfnputc(out, *delim, n);
- else if(dlen>0)
- {
- for(d=n; d>dlen; d-=dlen)
- sfwrite(out,delim,dsiz);
- if(d)
- {
- if(mp)
- for (i = z = 0; i < d; i++)
- z += mp[i].len;
- else
- z = d;
- sfwrite(out,delim,z);
- }
- }
- more = n+1;
- }
- if(sfwrite(out,cp,sfvalue(fp)-((n+1)<nstream)) < 0)
- return(-1);
- }
- else
- streams[n] = 0;
- }
- if(++n<nstream && more && d>=0)
- {
- register int c;
- if(d >= dlen)
- d = 0;
- if(mp)
- sfwrite(out,mp[d].chr,mp[d].len);
- else if(c=delim[d])
- sfputc(out,c);
- d++;
- }
- else if(n==nstream && !streams[n-1] && more)
- sfputc(out,'\n');
- }
- } while(more);
- return(0);
-}
-
-/*
- * Handles paste -s, for file <in> to file <out> using delimiters <delim>
- */
-static int spaste(Sfio_t *in,register Sfio_t* out,register const char *delim,int dsiz,int dlen,Delim_t* mp)
-{
- register const char *cp;
- register int d=0;
- if((cp = sfgetr(in,'\n',0)) && sfwrite(out,cp,sfvalue(in)-1) < 0)
- return(-1);
- while(cp=sfgetr(in, '\n',0))
- {
- if(dlen)
- {
- register int c;
- if(d >= dlen)
- d = 0;
- if(mp)
- sfwrite(out,mp[d].chr,mp[d].len);
- else if(c=delim[d])
- sfputc(out,c);
- d++;
- }
- if(sfwrite(out,cp,sfvalue(in)-1) < 0)
- return(-1);
- }
- sfputc(out,'\n');
- return(0);
-}
-
-int
-b_paste(int argc,register char *argv[], void* context)
-{
- register int n, sflag=0;
- register Sfio_t *fp, **streams;
- register char *cp, *delim;
- char *ep;
- Delim_t *mp;
- int dlen, dsiz;
- char defdelim[2];
-
- cmdinit(argc, argv, context, ERROR_CATALOG, 0);
- delim = 0;
- while (n = optget(argv, usage)) switch (n)
- {
- case 'd':
- delim = opt_info.arg;
- break;
- case 's':
- sflag++;
- break;
- case ':':
- error(2, "%s", opt_info.arg);
- break;
- case '?':
- error(ERROR_usage(2), "%s", opt_info.arg);
- break;
- }
- argv += opt_info.index;
- if(error_info.errors)
- error(ERROR_usage(2),"%s", optusage(NiL));
- if(!delim || !*delim)
- {
- delim = defdelim;
- delim[0] = '\t';
- delim[1] = 0;
- }
- dlen = dsiz = stresc(delim);
- mp = 0;
- if (mbwide())
- {
- cp = delim;
- ep = delim + dlen;
- dlen = 0;
- while (cp < ep)
- {
- mbchar(cp);
- dlen++;
- }
- if(dlen < dsiz)
- {
- if (!(mp = newof(0, Delim_t, dlen, 0)))
- error(ERROR_system(1), "out of space");
- cp = delim;
- dlen = 0;
- while (cp < ep)
- {
- mp[dlen].chr = cp;
- mbchar(cp);
- mp[dlen].len = cp - mp[dlen].chr;
- dlen++;
- }
- }
- }
- if(cp = *argv)
- {
- n = argc - opt_info.index;
- argv++;
- }
- else
- n = 1;
- if(!sflag)
- {
- if (!(streams = (Sfio_t**)stakalloc(n*sizeof(Sfio_t*))))
- error(ERROR_exit(1), "out of space");
- n = 0;
- }
- do
- {
- if(!cp || streq(cp,"-"))
- fp = sfstdin;
- else if(!(fp = sfopen(NiL,cp,"r")))
- error(ERROR_system(0),"%s: cannot open",cp);
- if(fp && sflag)
- {
- if(spaste(fp,sfstdout,delim,dsiz,dlen,mp) < 0)
- error(ERROR_system(0),"write failed");
- if(fp!=sfstdin)
- sfclose(fp);
- }
- else if(!sflag)
- streams[n++] = fp;
- } while(cp= *argv++);
- if(!sflag)
- {
- if(error_info.errors==0 && paste(n,streams,sfstdout,delim,dsiz,dlen,mp) < 0)
- error(ERROR_system(0),"write failed");
- while(--n>=0)
- if((fp=streams[n]) && fp!=sfstdin)
- sfclose(fp);
- }
- if (mp)
- free(mp);
- return(error_info.errors);
-}