diff options
Diffstat (limited to 'usr/src/cmd/paste')
| -rw-r--r-- | usr/src/cmd/paste/Makefile | 46 | ||||
| -rw-r--r-- | usr/src/cmd/paste/paste.c | 268 | ||||
| -rw-r--r-- | usr/src/cmd/paste/paste.xcl | 24 |
3 files changed, 338 insertions, 0 deletions
diff --git a/usr/src/cmd/paste/Makefile b/usr/src/cmd/paste/Makefile new file mode 100644 index 0000000000..13e884af1d --- /dev/null +++ b/usr/src/cmd/paste/Makefile @@ -0,0 +1,46 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +#ident "%Z%%M% %I% %E% SMI" +# +# Copyright (c) 1989,1996 by Sun Microsystems, Inc. +# All rights reserved. +# + +PROG= paste + +include ../Makefile.cmd + +XGETFLAGS += -a -x $(PROG).xcl +CPPFLAGS += -D_FILE_OFFSET_BITS=64 + +.KEEP_STATE: + +all: $(PROG) + +install: all $(ROOTPROG) + +clean: + +lint: lint_PROG + +include ../Makefile.targ diff --git a/usr/src/cmd/paste/paste.c b/usr/src/cmd/paste/paste.c new file mode 100644 index 0000000000..af08816d81 --- /dev/null +++ b/usr/src/cmd/paste/paste.c @@ -0,0 +1,268 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 1994 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T + * All Rights Reserved + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <stdio.h> +#include <locale.h> +#include <widec.h> +#include <stdlib.h> +#include <limits.h> + + +#define MAXOPNF 12 /* maximal no. of open files (not with -s option) */ +#define MAXOPNF_STR "12" +#define RUB '\177' + + +/* + * Function prototypes + */ +static void diag(char *, char *); +static int move(char *, wchar_t *); +static void usage(); + + +main(int argc, char **argv) +{ + int i, j, k, eofcount, nfiles, maxline, glue; + int delcount = 1; + int onefile = 0; + register int c; + wchar_t del[LINE_MAX]; + wchar_t outbuf[LINE_MAX], l, t; + register wchar_t *p; + FILE *inptr[MAXOPNF]; + int arg_ind; + int file_ind; + int error = 0; + + + /* Get locale variables from environment */ + (void) setlocale(LC_ALL, ""); + +#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ +#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ +#endif + (void) textdomain(TEXT_DOMAIN); + + del[0] = '\t'; + maxline = LINE_MAX -2; + + /* Get command arguments */ + while ((c = getopt(argc, argv, "d:s")) != EOF) { + switch (c) { + case 'd' : + delcount = move(optarg, del); + if (delcount < 1) + diag("paste: no delimiters\n", NULL); + break; + + case 's' : + onefile++; + break; + + case '?': + usage(); + + /* NOTREACHED */ + break; + } + } + + if (!onefile) { /* not -s option: parallel line merging */ + + /* Find explicit stdin and file names */ + for (file_ind = 0, arg_ind = optind; arg_ind < argc && + file_ind < MAXOPNF; arg_ind++) { + if (argv[arg_ind][0] == '-' && + argv[arg_ind][1] == '\0') { + inptr[file_ind++] = stdin; + } else if (arg_ind >= optind) { + inptr[file_ind++] = fopen(argv[arg_ind], "r"); + if (inptr[file_ind -1] == NULL) { + diag("paste: cannot open %s\n", + argv[arg_ind]); + } + } + } + if (arg_ind < argc) { + char maxopnf_buf[LINE_MAX]; + (void) sprintf(maxopnf_buf, "%d", MAXOPNF); + diag("paste: too many files- limit %s\n", maxopnf_buf); + } + nfiles = file_ind; + + do { + p = &outbuf[0]; + eofcount = 0; + j = k = 0; + for (i = 0; i < nfiles; i++) { + while ((c = fgetwc(inptr[i])) != '\n' && + c != EOF) { + if (++j <= maxline) + *p++ = c; + else { + diag( + "paste: line too long\n", + NULL); + } + } + if ((l = del[k]) != RUB) + *p++ = l; + + k = (k + 1) % delcount; + + if (c == EOF) + eofcount++; + } + if (l != RUB) + *--p = '\n'; + else + *p = '\n'; + *++p = 0; + if (eofcount < nfiles) + (void) printf("%ws", outbuf); + } while (eofcount < nfiles); + + } else { /* -s option: serial file pasting (old 127 paste command) */ + + for (i = optind; i < argc; i++) { + p = &outbuf[0]; + glue = 0; + j = 0; + k = 0; + t = 0; + if (argv[i][0] == '-' && + argv[i][1] == '\0') { + inptr[0] = stdin; + } else if (i >= optind) { + inptr[0] = fopen(argv[i], "r"); + if (inptr[0] == NULL) { + (void) fprintf(stderr, gettext( + "paste: cannot open %s\n"), argv[i]); + error = 1; + } + } + + /* Argument not a file name */ + if (inptr[0] == NULL) { + continue; + } + + while ((c = fgetwc(inptr[0])) != EOF) { + if (j >= maxline) { + t = *--p; + *++p = 0; + (void) printf("%ws", outbuf); + p = &outbuf[0]; + j = 0; + } + if (glue) { + glue = 0; + l = del[k]; + if (l != RUB) { + *p++ = l; + t = l; + j++; + } + k = (k + 1) % delcount; + } + if (c != '\n') { + *p++ = c; + t = c; + j++; + } else glue++; + } + if (t != '\n') { + *p++ = '\n'; + j++; + } + if (j > 0) { + *p = 0; + (void) printf("%ws", outbuf); + } + } + } + return (error); +} + + +static void +diag(char *s, char *arg) +{ + (void) fprintf(stderr, gettext(s), arg); + exit(1); +} + + +static int +move(char *from, wchar_t *to) +{ + int i, n; + wchar_t wc; + + i = 0; + while (*from) { + n = mbtowc(&wc, from, MB_CUR_MAX); + if (n <= 0) + return (0); /* invalid character as a delimiter */ + from += n; + if (wc != L'\\') *to++ = wc; + else { + n = mbtowc(&wc, from, MB_CUR_MAX); + if (n <= 0) + return (0); + from += n; + switch (wc) { + case L'0' : *to++ = RUB; + break; + case L't' : *to++ = L'\t'; + break; + case L'n' : *to++ = L'\n'; + break; + default : *to++ = wc; + break; + } + } + i++; + } + return (i); +} + + +static void +usage() +{ + (void) fprintf(stderr, gettext( + "usage: paste [-s] [-d list] file \n\n")); + exit(1); +} diff --git a/usr/src/cmd/paste/paste.xcl b/usr/src/cmd/paste/paste.xcl new file mode 100644 index 0000000000..b2c15d5201 --- /dev/null +++ b/usr/src/cmd/paste/paste.xcl @@ -0,0 +1,24 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +msgid "" +msgid "%ws" +msgid "r" |
