mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-30 04:33:01 +00:00
- initial checkin, (mostly) as submitted by Dave Tribby
This commit is contained in:
parent
2823a7ab61
commit
fae3756359
13
bin/split/Makefile
Normal file
13
bin/split/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
#
|
||||
# This makefile is intended for use with dmake(1) on Apple IIGS
|
||||
# $Id: Makefile,v 1.1 1997/12/02 05:15:19 gdr Exp $
|
||||
#
|
||||
# Created by Dave Tribby, November 1997
|
||||
|
||||
# Program name
|
||||
PROG= split
|
||||
|
||||
# Delivery directory
|
||||
BINDIR = /usr/bin
|
||||
|
||||
.INCLUDE : /src/gno/prog.mk
|
114
bin/split/split.1
Normal file
114
bin/split/split.1
Normal file
@ -0,0 +1,114 @@
|
||||
.\" Copyright (c) 1990, 1991, 1993, 1994
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)split.1 8.3 (Berkeley) 4/16/94
|
||||
.\"
|
||||
.TH SPLIT 1 "November 1997" "GNO" "Commands and Applications"
|
||||
.SH NAME
|
||||
.BR split
|
||||
\- split a file into pieces
|
||||
.SH SYNOPSIS
|
||||
.BR split
|
||||
.RB [ -b
|
||||
.IR byte_count\c
|
||||
.RB [ k | m ]]
|
||||
.RB [ -l
|
||||
.IR line_count ]
|
||||
.RI [ file " [" name ]]
|
||||
.PP
|
||||
.I Obsolescent:
|
||||
.PP
|
||||
.BR split
|
||||
.RB [ -\c
|
||||
.IR line_count ]
|
||||
.RI [ file " [" name ]]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.BR split
|
||||
utility reads the given
|
||||
.IR file
|
||||
(or standard input if no file is specified)
|
||||
and breaks it up into files of 1000 lines each.
|
||||
.PP
|
||||
The options are as follows:
|
||||
.RS
|
||||
.IP \fB-b\fR
|
||||
Create smaller files
|
||||
.IR byte_count
|
||||
bytes in length.
|
||||
If
|
||||
.BR k
|
||||
is appended to the number, the file is split into
|
||||
.IR byte_count
|
||||
kilobyte pieces.
|
||||
If
|
||||
.BR m
|
||||
is appended to the number, the file is split into
|
||||
.IR byte_count
|
||||
megabyte pieces.
|
||||
.IP \fB-l\fR
|
||||
Create smaller files
|
||||
.IR line_count
|
||||
lines in length.
|
||||
.RE
|
||||
.PP
|
||||
If additional arguments are specified, the first is used as the name
|
||||
of the input file which is to be split.
|
||||
If a second additional argument is specified, it is used as a prefix
|
||||
for the names of the files into which the file is split.
|
||||
In this case, each file into which the file is split is named by the
|
||||
prefix followed by a lexically ordered suffix in the range of
|
||||
.BR aa-zz .
|
||||
.PP
|
||||
If the
|
||||
.IR name
|
||||
argument is not specified, the file is split into lexically ordered
|
||||
files named in the range of
|
||||
.BR xaa - zzz .
|
||||
.SH BUGS
|
||||
For historical reasons, if you specify
|
||||
.IR name ,
|
||||
.BR split
|
||||
can only create 676 separate
|
||||
files.
|
||||
The default naming convention allows 2028 separate files.
|
||||
.SH VERSION
|
||||
This manual page documents
|
||||
.BR split
|
||||
version 2.0.
|
||||
.SH ATTRIBUTIONS
|
||||
This command was ported from FreeBSD source code
|
||||
for distribution with GNO/ME 2.0.6.
|
||||
.SH HISTORY
|
||||
A version of
|
||||
.BR split
|
||||
written in 1992 was distributed with
|
||||
earlier releases of GNO.
|
357
bin/split/split.c
Normal file
357
bin/split/split.c
Normal file
@ -0,0 +1,357 @@
|
||||
/*
|
||||
* Copyright (c) 1987, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Modified for GNO (Apple IIGS) by Dave Tribby, November 1997
|
||||
*
|
||||
* Constructs unacceptable to compiler are replaced using #ifndef __ORCAC__
|
||||
*
|
||||
* Changes not related to compiler are replaced using #ifndef __GNO__
|
||||
*
|
||||
* Added prototyped headers, surrounded by #ifndef __STDC__
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GNO__ /* GNO doesn't use what strings */
|
||||
#ifndef lint
|
||||
static const char copyright[] =
|
||||
"@(#) Copyright (c) 1987, 1993, 1994\n\
|
||||
The Regents of the University of California. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif /* not GNO */
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define DEFLINE 1000 /* Default num lines per file. */
|
||||
|
||||
long bytecnt; /* Byte count to split on. */
|
||||
long numlines; /* Line count to split on. */
|
||||
int file_open; /* If a file open. */
|
||||
int ifd = -1, ofd = -1; /* Input/output file descriptors. */
|
||||
char bfr[MAXBSIZE]; /* I/O buffer. */
|
||||
char fname[MAXPATHLEN]; /* File name prefix. */
|
||||
|
||||
void newfile __P((void));
|
||||
void split1 __P((void));
|
||||
void split2 __P((void));
|
||||
static void usage __P((void));
|
||||
|
||||
|
||||
/* Interface to check on how much stack space a C program uses. */
|
||||
#if defined(__GNO__) && defined(__STACK_CHECK__)
|
||||
#ifndef _GNO_GNO_H_
|
||||
#include <gno/gno.h>
|
||||
#endif
|
||||
static void report_stack(void)
|
||||
{
|
||||
fprintf(stderr,"\n ==> %d stack bytes used <== \n", _endStackCheck());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
#ifndef __STDC__
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
#else
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
#endif
|
||||
{
|
||||
int ch;
|
||||
char *ep, *p;
|
||||
|
||||
#if defined(__GNO__) && defined(__STACK_CHECK__)
|
||||
_beginStackCheck();
|
||||
atexit(report_stack);
|
||||
#endif
|
||||
while ((ch = getopt(argc, argv, "-0123456789b:l:")) != -1)
|
||||
switch (ch) {
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
/*
|
||||
* Undocumented kludge: split was originally designed
|
||||
* to take a number after a dash.
|
||||
*/
|
||||
if (numlines == 0) {
|
||||
p = argv[optind - 1];
|
||||
if (p[0] == '-' && p[1] == ch && !p[2])
|
||||
numlines = strtol(++p, &ep, 10);
|
||||
else
|
||||
numlines =
|
||||
strtol(argv[optind] + 1, &ep, 10);
|
||||
if (numlines <= 0 || *ep)
|
||||
errx(1, "%s: illegal line count", optarg);
|
||||
}
|
||||
break;
|
||||
case '-': /* Undocumented: historic stdin flag. */
|
||||
if (ifd != -1)
|
||||
usage();
|
||||
#ifndef __GNO__
|
||||
ifd = 0;
|
||||
#else
|
||||
ifd = STDIN_FILENO; /* != 0 under GNO */
|
||||
#endif
|
||||
break;
|
||||
case 'b': /* Byte count. */
|
||||
if ((bytecnt = strtol(optarg, &ep, 10)) <= 0 ||
|
||||
(*ep != '\0' && *ep != 'k' && *ep != 'm'))
|
||||
errx(1, "%s: illegal byte count", optarg);
|
||||
if (*ep == 'k')
|
||||
bytecnt *= 1024;
|
||||
else if (*ep == 'm')
|
||||
bytecnt *= 1048576;
|
||||
break;
|
||||
case 'l': /* Line count. */
|
||||
if (numlines != 0)
|
||||
usage();
|
||||
if ((numlines = strtol(optarg, &ep, 10)) <= 0 || *ep)
|
||||
errx(1, "%s: illegal line count", optarg);
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
#ifndef __ORCAC__
|
||||
argv += optind;
|
||||
#else
|
||||
argv = argv + optind;
|
||||
#endif
|
||||
argc -= optind;
|
||||
|
||||
if (*argv != NULL)
|
||||
if (ifd == -1) { /* Input file. */
|
||||
if ((ifd = open(*argv, O_RDONLY, 0)) < 0)
|
||||
err(1, "%s", *argv);
|
||||
++argv;
|
||||
}
|
||||
if (*argv != NULL) /* File name prefix. */
|
||||
(void)strcpy(fname, *argv++);
|
||||
if (*argv != NULL)
|
||||
usage();
|
||||
|
||||
if (numlines == 0)
|
||||
numlines = DEFLINE;
|
||||
else if (bytecnt)
|
||||
usage();
|
||||
|
||||
if (ifd == -1) /* Stdin by default. */
|
||||
#ifndef __GNO__
|
||||
ifd = 0;
|
||||
#else
|
||||
ifd = STDIN_FILENO; /* != 0 under GNO */
|
||||
#endif
|
||||
|
||||
if (bytecnt) {
|
||||
split1();
|
||||
exit (0);
|
||||
}
|
||||
split2();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* split1 --
|
||||
* Split the input by bytes.
|
||||
*/
|
||||
void
|
||||
#ifndef __STDC__
|
||||
split1()
|
||||
#else
|
||||
split1(void)
|
||||
#endif
|
||||
{
|
||||
long bcnt;
|
||||
int dist, len;
|
||||
char *C;
|
||||
|
||||
for (bcnt = 0;;)
|
||||
switch (len = read(ifd, bfr, MAXBSIZE)) {
|
||||
case 0:
|
||||
exit(0);
|
||||
case -1:
|
||||
err(1, "read");
|
||||
/* NOTREACHED */
|
||||
default:
|
||||
if (!file_open) {
|
||||
newfile();
|
||||
file_open = 1;
|
||||
}
|
||||
if (bcnt + len >= bytecnt) {
|
||||
dist = bytecnt - bcnt;
|
||||
if (write(ofd, bfr, dist) != dist)
|
||||
err(1, "write");
|
||||
len -= dist;
|
||||
for (C = bfr + dist; len >= bytecnt;
|
||||
len -= bytecnt, C += bytecnt) {
|
||||
newfile();
|
||||
if (write(ofd,
|
||||
C, (int)bytecnt) != bytecnt)
|
||||
err(1, "write");
|
||||
}
|
||||
if (len) {
|
||||
newfile();
|
||||
if (write(ofd, C, len) != len)
|
||||
err(1, "write");
|
||||
} else
|
||||
file_open = 0;
|
||||
bcnt = len;
|
||||
} else {
|
||||
bcnt += len;
|
||||
if (write(ofd, bfr, len) != len)
|
||||
err(1, "write");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* split2 --
|
||||
* Split the input by lines.
|
||||
*/
|
||||
void
|
||||
#ifndef __STDC__
|
||||
split2()
|
||||
#else
|
||||
split2(void)
|
||||
#endif
|
||||
{
|
||||
long lcnt;
|
||||
int len, bcnt;
|
||||
char *Ce, *Cs;
|
||||
|
||||
for (lcnt = 0;;)
|
||||
switch (len = read(ifd, bfr, MAXBSIZE)) {
|
||||
case 0:
|
||||
exit(0);
|
||||
case -1:
|
||||
err(1, "read");
|
||||
/* NOTREACHED */
|
||||
default:
|
||||
if (!file_open) {
|
||||
newfile();
|
||||
file_open = 1;
|
||||
}
|
||||
for (Cs = Ce = bfr; len--; Ce++)
|
||||
#ifndef __GNO__
|
||||
if (*Ce == '\n' && ++lcnt == numlines) {
|
||||
#else /* In GNO, \r is the line separator */
|
||||
if (*Ce == '\r' && ++lcnt == numlines) {
|
||||
#endif
|
||||
bcnt = Ce - Cs + 1;
|
||||
if (write(ofd, Cs, bcnt) != bcnt)
|
||||
err(1, "write");
|
||||
lcnt = 0;
|
||||
Cs = Ce + 1;
|
||||
if (len)
|
||||
newfile();
|
||||
else
|
||||
file_open = 0;
|
||||
}
|
||||
if (Cs < Ce) {
|
||||
bcnt = Ce - Cs;
|
||||
if (write(ofd, Cs, bcnt) != bcnt)
|
||||
err(1, "write");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* newfile --
|
||||
* Open a new output file.
|
||||
*/
|
||||
void
|
||||
#ifndef __STDC__
|
||||
newfile()
|
||||
#else
|
||||
newfile(void)
|
||||
#endif
|
||||
{
|
||||
static long fnum;
|
||||
static int defname;
|
||||
static char *fpnt;
|
||||
|
||||
if (ofd == -1) {
|
||||
if (fname[0] == '\0') {
|
||||
fname[0] = 'x';
|
||||
fpnt = fname + 1;
|
||||
defname = 1;
|
||||
} else {
|
||||
fpnt = fname + strlen(fname);
|
||||
defname = 0;
|
||||
}
|
||||
ofd = fileno(stdout);
|
||||
}
|
||||
/*
|
||||
* Hack to increase max files; original code wandered through
|
||||
* magic characters. Maximum files is 3 * 26 * 26 == 2028
|
||||
*/
|
||||
#define MAXFILES 676
|
||||
if (fnum == MAXFILES) {
|
||||
if (!defname || fname[0] == 'z')
|
||||
errx(1, "too many files");
|
||||
++fname[0];
|
||||
fnum = 0;
|
||||
}
|
||||
fpnt[0] = fnum / 26 + 'a';
|
||||
fpnt[1] = fnum % 26 + 'a';
|
||||
++fnum;
|
||||
if (!freopen(fname, "w", stdout))
|
||||
err(1, "%s", fname);
|
||||
}
|
||||
|
||||
static void
|
||||
#ifndef __STDC__
|
||||
usage()
|
||||
#else
|
||||
usage(void)
|
||||
#endif
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
"usage: split [-b byte_count] [-l line_count] [file [prefix]]\n");
|
||||
exit(1);
|
||||
}
|
10
bin/split/split.desc
Normal file
10
bin/split/split.desc
Normal file
@ -0,0 +1,10 @@
|
||||
Name: split
|
||||
Version: 2.0 (November 1997)
|
||||
Shell: GNO
|
||||
Author: Dave Tribby (from FreeBSD code)
|
||||
Contact: tribby@cup.hp.com
|
||||
Where: /bin
|
||||
FTP: ground.isca.uiowa.edu apple2.caltech.edu trenco.myrias.com
|
||||
|
||||
Split a file into pieces.
|
||||
|
30
bin/split/split.rez
Normal file
30
bin/split/split.rez
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Resources for version and comment
|
||||
* $Id: split.rez,v 1.1 1997/12/02 05:15:19 gdr Exp $
|
||||
*/
|
||||
#define PROG "split"
|
||||
#define DESC "Split a file into pieces."
|
||||
|
||||
#include "Types.rez"
|
||||
|
||||
/*
|
||||
* Version
|
||||
*/
|
||||
resource rVersion (1, purgeable3) {
|
||||
{ 2, 0, 0, /* Version 2.0.0 */
|
||||
release, /* development|alpha|beta|final|release */
|
||||
0 }, /* non-final release number */
|
||||
verUS, /* Country */
|
||||
PROG, /* Program name */
|
||||
DESC " Released with GNO/ME."
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Comment
|
||||
*/
|
||||
resource rComment (1, purgeable3) {
|
||||
PROG " v2.0 (November 1997)\n"
|
||||
"GNO utility: " DESC "\n"
|
||||
"Ported from FreeBSD code by Dave Tribby."
|
||||
};
|
145
bin/split/tests/dotests
Normal file
145
bin/split/tests/dotests
Normal file
@ -0,0 +1,145 @@
|
||||
# Tests for split command; invoked by command file "fulltests"
|
||||
# Written by Dave Tribby (November 1997)
|
||||
# $Id: dotests,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
|
||||
# Location of the split command to be tested
|
||||
set testcmd="../split"
|
||||
|
||||
# Location of binary and ASCII files used in test
|
||||
set bfile="$testcmd"
|
||||
set afile="../split.c"
|
||||
|
||||
# Location of sed command (used to strip unwanted blanks at end of echo)
|
||||
set sedcmd="/src/gno/usr.bin/sed/sed"
|
||||
|
||||
# Alias for rm command
|
||||
alias rm "cp -p rm"
|
||||
|
||||
# Record starting time
|
||||
echo -n "Testing command $testcmd beginning at"
|
||||
date
|
||||
|
||||
set src="$afile"
|
||||
set dest="x"
|
||||
set cmp="/tmp/split.c"
|
||||
set lines="1000"
|
||||
echo "Splitting $src using defaults"
|
||||
$testcmd < $src
|
||||
echo " Completion status = $status"
|
||||
cat ${dest}a? > $cmp
|
||||
echo "Checking combined files against original (no differences expected)"
|
||||
cmp $src $cmp
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
rm ${dest}a* $cmp
|
||||
|
||||
set src="$afile"
|
||||
set dest="/tmp/z"
|
||||
set cmp="/tmp/split.c"
|
||||
set lines="100"
|
||||
echo "Splitting $src into $lines line pieces"
|
||||
$testcmd -l $lines $src $dest
|
||||
echo " Completion status = $status"
|
||||
cat /tmp/z* > $cmp
|
||||
echo "Checking combined files against original (no differences expected)"
|
||||
cmp $src $cmp
|
||||
echo " Completion status = $status"
|
||||
echo "Checking length of file against requested length"
|
||||
set count="/tmp/count"
|
||||
cat ${dest}aa | wc -l > $count
|
||||
echo " $lines" | $sedcmd -e's/ *$//' > ${count}2
|
||||
cmp $count ${count}2
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
rm ${dest}* $cmp $count ${count}2
|
||||
|
||||
set src="$bfile"
|
||||
set dest="/tmp/z"
|
||||
set cmp="/tmp/split"
|
||||
set chars="3500"
|
||||
echo "Splitting $src into $chars character pieces"
|
||||
$testcmd -b $chars $src $dest
|
||||
echo " Completion status = $status"
|
||||
cat /tmp/z* > $cmp
|
||||
echo "Checking combined files against original (no differences expected)"
|
||||
cmp $src $cmp
|
||||
echo " Completion status = $status"
|
||||
echo "Checking length of file against requested length"
|
||||
set count="/tmp/count"
|
||||
cat ${dest}aa | wc -c > $count
|
||||
echo " $chars" | $sedcmd -e's/ *$//' > ${count}2
|
||||
cmp $count ${count}2
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
rm ${dest}* $cmp $count ${count}2
|
||||
|
||||
set src="$bfile"
|
||||
set dest="/tmp/z"
|
||||
set cmp="/tmp/split"
|
||||
set numk="4"
|
||||
set chars="4096"
|
||||
echo "Splitting $src into ${numk}K character pieces"
|
||||
$testcmd -b ${numk}k $src $dest
|
||||
echo " Completion status = $status"
|
||||
cat /tmp/z* > $cmp
|
||||
echo "Checking combined files against original (no differences expected)"
|
||||
cmp $src $cmp
|
||||
echo " Completion status = $status"
|
||||
echo "Checking length of file against requested length"
|
||||
set count="/tmp/count"
|
||||
cat ${dest}aa | wc -c > $count
|
||||
echo " $chars" | $sedcmd -e's/ *$//' > ${count}2
|
||||
cmp $count ${count}2
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
rm ${dest}* $cmp $count ${count}2
|
||||
|
||||
set src="$afile"
|
||||
set dest="/tmp/z"
|
||||
set cmp="/tmp/split.c"
|
||||
set lines="100"
|
||||
echo "Splitting $src into $lines line pieces (obsolescent)"
|
||||
$testcmd -$lines $src $dest
|
||||
echo " Completion status = $status"
|
||||
cat /tmp/z* > $cmp
|
||||
echo "Checking combined files against original (no differences expected)"
|
||||
cmp $src $cmp
|
||||
echo " Completion status = $status"
|
||||
echo "Checking length of file against requested length"
|
||||
set count="/tmp/count"
|
||||
cat ${dest}aa | wc -l > $count
|
||||
echo " $lines" | $sedcmd -e's/ *$//' > ${count}2
|
||||
cmp $count ${count}2
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
|
||||
|
||||
echo "***** Error Messages *****"
|
||||
|
||||
set dest="/tmp/err.cond"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal option"
|
||||
$testcmd -x $src > $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal byte count"
|
||||
$testcmd -b 12x $src > $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal line count"
|
||||
$testcmd -l 12x $src > $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
set src="badname"
|
||||
echo "Expected error: $src: no such file or directory"
|
||||
$testcmd $src > $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
29
bin/split/tests/fulltests
Normal file
29
bin/split/tests/fulltests
Normal file
@ -0,0 +1,29 @@
|
||||
# gsh script to run tests and collect results
|
||||
# Written by Dave Tribby * August 1997
|
||||
# $Id: fulltests,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
|
||||
# Name of gsh script containing test cases
|
||||
set command="dotests"
|
||||
# Sometimes the file type is modified by editing; make it executable
|
||||
chtyp -l exec $command
|
||||
|
||||
# Filenames for raw and modified results
|
||||
set raw_file="/tmp/rawlist"
|
||||
set result_file="test.list"
|
||||
|
||||
# Location of tr command that knows how to handle classes
|
||||
set trcmd="/src/gno/usr.bin/tr/tr"
|
||||
|
||||
# --- Begin the tests ---
|
||||
|
||||
echo -n "Executing test script \"$command\" from directory "
|
||||
pwd
|
||||
|
||||
# Create a new gsh invocation and record all I/O
|
||||
echo "$command ; exit" | script $raw_file
|
||||
|
||||
# Cleanup control chars using either of the following...
|
||||
echo "Done with tests. Removing control characters from results file"
|
||||
$trcmd -c -ds '[:print:]\r' '\r' < $raw_file > $result_file
|
||||
|
||||
echo "Tests results have been saved as \"$result_file\""
|
13
bin/uniq/Makefile
Normal file
13
bin/uniq/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
#
|
||||
# This makefile is intended for use with dmake(1) on Apple IIGS
|
||||
# $Id: Makefile,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
#
|
||||
# Created by Dave Tribby, November 1997
|
||||
|
||||
# Program name
|
||||
PROG= uniq
|
||||
|
||||
# Delivery directory
|
||||
BINDIR = /usr/bin
|
||||
|
||||
.INCLUDE : /src/gno/prog.mk
|
145
bin/uniq/tests/dotests
Normal file
145
bin/uniq/tests/dotests
Normal file
@ -0,0 +1,145 @@
|
||||
# Tests for uniq command; invoked by command file "fulltests"
|
||||
# Written by Dave Tribby (November 1997)
|
||||
# $Id: dotests,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
|
||||
# Location of the uniq command to be tested
|
||||
set testcmd="../uniq"
|
||||
|
||||
# Record starting time
|
||||
echo -n "Testing command $testcmd beginning at"
|
||||
date
|
||||
|
||||
set src="in.file"
|
||||
set cmp="ulines"
|
||||
set dest="/tmp/$cmp"
|
||||
echo "Unique lines past column 27 in $src"
|
||||
cat $src | $testcmd -s 27 > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set cmp="uclines"
|
||||
set dest="/tmp/${cmp}A"
|
||||
echo "Unique lines past column 27 with count in $src"
|
||||
$testcmd -c -s 27 < $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set dest="/tmp/${cmp}B"
|
||||
echo "Unique lines past field 4 with count in $src"
|
||||
$testcmd -c -f 4 $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set dest="/tmp/${cmp}C"
|
||||
echo "Unique lines past column 27 with count (obsolescent) in $src"
|
||||
$testcmd -c +27 < $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set dest="/tmp/${cmp}D"
|
||||
echo "Unique lines past field 4 with count (obsolescent) in $src"
|
||||
$testcmd -c -4 $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set src="in.file.shift"
|
||||
set dest="/tmp/${cmp}E"
|
||||
echo "Unique lines past field 4, shifted, with count in $src"
|
||||
$testcmd -c -i -f 4 $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set src="in.file"
|
||||
set cmp="nuclines"
|
||||
set dest="/tmp/${cmp}A"
|
||||
echo "Unique lines past column 25 with count in $src"
|
||||
$testcmd -c -s 25 < $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set dest="/tmp/${cmp}B"
|
||||
echo "Unique lines past field 3 with count in $src"
|
||||
$testcmd -c -f 3 $src > $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set cmp="uulines"
|
||||
set dest="/tmp/${cmp}"
|
||||
echo "Unique lines past column 27, excluding repeated, in $src"
|
||||
$testcmd -u -s 27 $src $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set cmp="udlines"
|
||||
set dest="/tmp/${cmp}"
|
||||
echo "Unique lines past column 27, excluding unrepeated, in $src"
|
||||
$testcmd -d -s 27 $src $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
set src="in.file.shift"
|
||||
set cmp="udlines"
|
||||
set dest="/tmp/${cmp}A"
|
||||
echo "Unique lines past column 27, shifted, excluding unrepeated, in $src"
|
||||
$testcmd -d -i -s 27 $src $dest
|
||||
echo " Completion status = $status"
|
||||
echo "Checking results against control file $cmp (no differences expected)"
|
||||
cmp $cmp $dest
|
||||
echo " Completion status = $status"
|
||||
echo ""
|
||||
|
||||
|
||||
echo "***** Error Messages *****"
|
||||
|
||||
set dest="/tmp/err.cond"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal option"
|
||||
$testcmd -x $src $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal combination of options (usage printed)"
|
||||
$testcmd -c -d $src $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
echo "Expected error: illegal combination of options (usage printed)"
|
||||
$testcmd -c -u $src $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
||||
|
||||
echo ""
|
||||
set src="badname"
|
||||
echo "Expected error: $src: no such file or directory"
|
||||
$testcmd $src > $dest
|
||||
echo " Error completion status = $status (expected: 1)"
|
29
bin/uniq/tests/fulltests
Normal file
29
bin/uniq/tests/fulltests
Normal file
@ -0,0 +1,29 @@
|
||||
# gsh script to run tests and collect results
|
||||
# Written by Dave Tribby * August 1997
|
||||
# $Id: fulltests,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
|
||||
# Name of gsh script containing test cases
|
||||
set command="dotests"
|
||||
# Sometimes the file type is modified by editing; make it executable
|
||||
chtyp -l exec $command
|
||||
|
||||
# Filenames for raw and modified results
|
||||
set raw_file="/tmp/rawlist"
|
||||
set result_file="test.list"
|
||||
|
||||
# Location of tr command that knows how to handle classes
|
||||
set trcmd="/src/gno/usr.bin/tr/tr"
|
||||
|
||||
# --- Begin the tests ---
|
||||
|
||||
echo -n "Executing test script \"$command\" from directory "
|
||||
pwd
|
||||
|
||||
# Create a new gsh invocation and record all I/O
|
||||
echo "$command ; exit" | script $raw_file
|
||||
|
||||
# Cleanup control chars using either of the following...
|
||||
echo "Done with tests. Removing control characters from results file"
|
||||
$trcmd -c -ds '[:print:]\r' '\r' < $raw_file > $result_file
|
||||
|
||||
echo "Tests results have been saved as \"$result_file\""
|
11
bin/uniq/tests/in.file
Normal file
11
bin/uniq/tests/in.file
Normal file
@ -0,0 +1,11 @@
|
||||
total 91k
|
||||
erw-brd 0000 txt 947 Nov 19
|
||||
drw-brd 0000 DIR 512 Nov 19
|
||||
erwxbrd 0100 exe 64403 Nov 19
|
||||
erw-brd 0000 txt 5396 Nov 20
|
||||
erw-brd 0008 src 8099 Nov 19
|
||||
erw-brd 0015 src 990 Nov 19
|
||||
-rw-brd 0000 obj 11543 Nov 19
|
||||
erwxbrd 0000 s16 702 Nov 19
|
||||
erw-brd 0015 src 1324 Nov 19
|
||||
-rw-brd 0000 obj 226 Nov 19
|
11
bin/uniq/tests/in.file.shift
Normal file
11
bin/uniq/tests/in.file.shift
Normal file
@ -0,0 +1,11 @@
|
||||
total 91k
|
||||
erw-brd 0000 txt 947 Nov 19
|
||||
drw-brd 0000 DIR 512 NOV 19
|
||||
erwxbrd 0100 exe 64403 Nov 19
|
||||
erw-brd 0000 txt 5396 Nov 20
|
||||
erw-brd 0008 src 8099 Nov 19
|
||||
erw-brd 0015 src 990 NOV 19
|
||||
-rw-brd 0000 obj 11543 Nov 19
|
||||
erwxbrd 0000 s16 702 NOV 19
|
||||
erw-brd 0015 src 1324 Nov 19
|
||||
-rw-brd 0000 obj 226 NOV 19
|
11
bin/uniq/tests/nuclines
Normal file
11
bin/uniq/tests/nuclines
Normal file
@ -0,0 +1,11 @@
|
||||
1 total 91k
|
||||
1 erw-brd 0000 txt 947 Nov 19
|
||||
1 drw-brd 0000 DIR 512 Nov 19
|
||||
1 erwxbrd 0100 exe 64403 Nov 19
|
||||
1 erw-brd 0000 txt 5396 Nov 20
|
||||
1 erw-brd 0008 src 8099 Nov 19
|
||||
1 erw-brd 0015 src 990 Nov 19
|
||||
1 -rw-brd 0000 obj 11543 Nov 19
|
||||
1 erwxbrd 0000 s16 702 Nov 19
|
||||
1 erw-brd 0015 src 1324 Nov 19
|
||||
1 -rw-brd 0000 obj 226 Nov 19
|
4
bin/uniq/tests/uclines
Normal file
4
bin/uniq/tests/uclines
Normal file
@ -0,0 +1,4 @@
|
||||
1 total 91k
|
||||
3 erw-brd 0000 txt 947 Nov 19
|
||||
1 erw-brd 0000 txt 5396 Nov 20
|
||||
6 erw-brd 0008 src 8099 Nov 19
|
2
bin/uniq/tests/udlines
Normal file
2
bin/uniq/tests/udlines
Normal file
@ -0,0 +1,2 @@
|
||||
erw-brd 0000 txt 947 Nov 19
|
||||
erw-brd 0008 src 8099 Nov 19
|
4
bin/uniq/tests/ulines
Normal file
4
bin/uniq/tests/ulines
Normal file
@ -0,0 +1,4 @@
|
||||
total 91k
|
||||
erw-brd 0000 txt 947 Nov 19
|
||||
erw-brd 0000 txt 5396 Nov 20
|
||||
erw-brd 0008 src 8099 Nov 19
|
2
bin/uniq/tests/uulines
Normal file
2
bin/uniq/tests/uulines
Normal file
@ -0,0 +1,2 @@
|
||||
total 91k
|
||||
erw-brd 0000 txt 5396 Nov 20
|
141
bin/uniq/uniq.1
Normal file
141
bin/uniq/uniq.1
Normal file
@ -0,0 +1,141 @@
|
||||
.\" Copyright (c) 1991, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" This code is derived from software contributed to Berkeley by
|
||||
.\" the Institute of Electrical and Electronics Engineers, Inc.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93
|
||||
.\" $Id: uniq.1,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
.\"
|
||||
.TH UNIQ 1 "November 1997" "GNO" "Commands and Applications"
|
||||
.SH NAME
|
||||
.BR uniq
|
||||
\- report or filter out repeated lines in a file
|
||||
.SH SYNOPSIS
|
||||
.BR uniq
|
||||
.RB [ -c " | " -du ]
|
||||
.RB [ -i ]
|
||||
.RB [ -f
|
||||
.IR fields ]
|
||||
.RB [ -s
|
||||
.IR chars ]
|
||||
.RI [ input
|
||||
.RI [ output "]]"
|
||||
.PP
|
||||
.I Obsolescent:
|
||||
.PP
|
||||
.BR uniq " [\c"
|
||||
.BI - fields\c
|
||||
.RI "] [\c"
|
||||
.BI + chars\c
|
||||
.RI "] [" input
|
||||
.RI [ output "]]"
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.BR uniq
|
||||
utility reads the standard input comparing adjacent lines, and writes
|
||||
a copy of each unique input line to the standard output.
|
||||
The second and succeeding copies of identical adjacent input lines are
|
||||
not written.
|
||||
Repeated lines in the input will not be detected if they are not adjacent,
|
||||
so it may be necessary to sort the files first.
|
||||
.PP
|
||||
The following options are available:
|
||||
.RS
|
||||
.IP \fB-c\fR
|
||||
Precede each output line with the count of the number of times the line
|
||||
occurred in the input, followed by a single space.
|
||||
.IP \fB-d\fR
|
||||
Print one copy of each repeated line in the input.
|
||||
.IP "\fB-f\fR \fIfields\fR"
|
||||
Ignore the first
|
||||
.IR fields
|
||||
in each input line when doing comparisons.
|
||||
A field is a string of non-blank characters separated from adjacent fields
|
||||
by blanks.
|
||||
Field numbers are one based, i.e. the first field is field one.
|
||||
.IP "\fB-s\fR \fIchars\fR"
|
||||
Ignore the first
|
||||
.IR chars
|
||||
characters in each input line when doing comparisons.
|
||||
If specified in conjunction with the
|
||||
.BR -f
|
||||
option, the first
|
||||
.IR chars
|
||||
characters after the first
|
||||
.IR fields
|
||||
fields will be ignored.
|
||||
Character numbers are one based, i.e. the first character is character one.
|
||||
.IP \fB-u\fR
|
||||
Print lines that are not repeated in the input.
|
||||
.IP \fB-i\fR
|
||||
Case insensitive comparison of lines.
|
||||
.RE
|
||||
.PP
|
||||
If additional arguments are specified on the command line, the first
|
||||
such argument is used as the name of an input file, the second is used
|
||||
as the name of an output file.
|
||||
.PP
|
||||
If neither of the options
|
||||
.BR d " or " u
|
||||
are specified on the command line,
|
||||
.BR uniq
|
||||
behaves as if both
|
||||
.BR d " and " u
|
||||
are set, printing a single copy of repeated lines as well as unrepeated lines.
|
||||
.PP
|
||||
The
|
||||
.BR uniq
|
||||
utility exits 0 on success, and >0 if an error occurs.
|
||||
.SH COMPATIBILITY
|
||||
The historic
|
||||
.BI + number
|
||||
and
|
||||
.BI - number
|
||||
options have been deprecated but are still supported in this implementation.
|
||||
.SH VERSION
|
||||
This manual page documents
|
||||
.BR uniq
|
||||
version 2.0.
|
||||
.SH ATTRIBUTIONS
|
||||
This command was ported from FreeBSD source code
|
||||
for distribution with GNO/ME 2.0.6.
|
||||
.SH HISTORY
|
||||
A version of
|
||||
.BR uniq
|
||||
written in 1992 was distributed with
|
||||
earlier releases of GNO.
|
||||
.SH SEE ALSO
|
||||
.BR sort (1)
|
||||
.SH STANDARDS
|
||||
The
|
||||
.BR uniq
|
||||
utility is expected to be POSIX-2 compatible.
|
336
bin/uniq/uniq.c
Normal file
336
bin/uniq/uniq.c
Normal file
@ -0,0 +1,336 @@
|
||||
/*
|
||||
* Copyright (c) 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Case Larsen.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Modified for GNO (Apple IIGS) by Dave Tribby, November 1997
|
||||
*
|
||||
* Constructs unacceptable to compiler are replaced using #ifndef __ORCAC__
|
||||
*
|
||||
* Changes not related to compiler are replaced using #ifndef __GNO__
|
||||
*
|
||||
* Added prototyped headers, surrounded by #ifndef __STDC__
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GNO__ /* GNO doesn't use what strings */
|
||||
#ifndef lint
|
||||
static const char copyright[] =
|
||||
"@(#) Copyright (c) 1989, 1993\n\
|
||||
The Regents of the University of California. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)uniq.c 8.3 (Berkeley) 5/4/95";
|
||||
#endif
|
||||
static const char rcsid[] =
|
||||
"$Id: uniq.c,v 1.1 1997/12/02 05:15:26 gdr Exp $";
|
||||
#endif /* not lint */
|
||||
#endif /* not GNO */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MAXLINELEN (8 * 1024)
|
||||
|
||||
int cflag, dflag, uflag;
|
||||
int numchars, numfields, repeats;
|
||||
|
||||
FILE *file __P((char *, char *));
|
||||
void show __P((FILE *, char *));
|
||||
char *skip __P((char *));
|
||||
void obsolete __P((char *[]));
|
||||
static void usage __P((void));
|
||||
|
||||
|
||||
/* Interface to check on how much stack space a C program uses. */
|
||||
#if defined(__GNO__) && defined(__STACK_CHECK__)
|
||||
#ifndef _GNO_GNO_H_
|
||||
#include <gno/gno.h>
|
||||
#endif
|
||||
static void report_stack(void)
|
||||
{
|
||||
fprintf(stderr,"\n ==> %d stack bytes used <== \n", _endStackCheck());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
#ifndef __STDC__
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
#else
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
#endif
|
||||
{
|
||||
register char *t1, *t2;
|
||||
FILE *ifp, *ofp;
|
||||
int ch;
|
||||
char *prevline, *thisline, *p;
|
||||
#ifndef __ORCAC__
|
||||
int iflag = 0, comp;
|
||||
#else /* "comp" is a floating point type in ORCA/C */
|
||||
int iflag = 0, compr;
|
||||
#endif
|
||||
|
||||
#if defined(__GNO__) && defined(__STACK_CHECK__)
|
||||
_beginStackCheck();
|
||||
atexit(report_stack);
|
||||
#endif
|
||||
obsolete(argv);
|
||||
while ((ch = getopt(argc, argv, "-cdif:s:u")) != -1)
|
||||
switch (ch) {
|
||||
case '-':
|
||||
--optind;
|
||||
goto done;
|
||||
case 'c':
|
||||
cflag = 1;
|
||||
break;
|
||||
case 'd':
|
||||
dflag = 1;
|
||||
break;
|
||||
case 'i':
|
||||
iflag = 1;
|
||||
break;
|
||||
case 'f':
|
||||
numfields = strtol(optarg, &p, 10);
|
||||
if (numfields < 0 || *p)
|
||||
errx(1, "illegal field skip value: %s", optarg);
|
||||
break;
|
||||
case 's':
|
||||
numchars = strtol(optarg, &p, 10);
|
||||
if (numchars < 0 || *p)
|
||||
errx(1, "illegal character skip value: %s", optarg);
|
||||
break;
|
||||
case 'u':
|
||||
uflag = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
|
||||
done: argc -= optind;
|
||||
#ifndef __ORCAC__
|
||||
argv +=optind;
|
||||
#else
|
||||
argv = argv + optind;
|
||||
#endif
|
||||
|
||||
/* If no flags are set, default is -d -u. */
|
||||
if (cflag) {
|
||||
if (dflag || uflag)
|
||||
usage();
|
||||
} else if (!dflag && !uflag)
|
||||
dflag = uflag = 1;
|
||||
|
||||
switch(argc) {
|
||||
case 0:
|
||||
ifp = stdin;
|
||||
ofp = stdout;
|
||||
break;
|
||||
case 1:
|
||||
ifp = file(argv[0], "r");
|
||||
ofp = stdout;
|
||||
break;
|
||||
case 2:
|
||||
ifp = file(argv[0], "r");
|
||||
ofp = file(argv[1], "w");
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
|
||||
prevline = malloc(MAXLINELEN);
|
||||
thisline = malloc(MAXLINELEN);
|
||||
if (prevline == NULL || thisline == NULL)
|
||||
errx(1, "malloc");
|
||||
|
||||
if (fgets(prevline, MAXLINELEN, ifp) == NULL)
|
||||
exit(0);
|
||||
|
||||
while (fgets(thisline, MAXLINELEN, ifp)) {
|
||||
/* If requested get the chosen fields + character offsets. */
|
||||
if (numfields || numchars) {
|
||||
t1 = skip(thisline);
|
||||
t2 = skip(prevline);
|
||||
} else {
|
||||
t1 = thisline;
|
||||
t2 = prevline;
|
||||
}
|
||||
|
||||
/* If different, print; set previous to new value. */
|
||||
if (iflag)
|
||||
#ifndef __ORCAC__
|
||||
comp = strcasecmp(t1, t2);
|
||||
else
|
||||
comp = strcmp(t1, t2);
|
||||
|
||||
if (comp) {
|
||||
#else
|
||||
compr = strcasecmp(t1, t2);
|
||||
else
|
||||
compr = strcmp(t1, t2);
|
||||
|
||||
if (compr) {
|
||||
#endif
|
||||
show(ofp, prevline);
|
||||
t1 = prevline;
|
||||
prevline = thisline;
|
||||
thisline = t1;
|
||||
repeats = 0;
|
||||
} else
|
||||
++repeats;
|
||||
}
|
||||
show(ofp, prevline);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* show --
|
||||
* Output a line depending on the flags and number of repetitions
|
||||
* of the line.
|
||||
*/
|
||||
void
|
||||
#ifndef __STDC__
|
||||
show(ofp, str)
|
||||
FILE *ofp;
|
||||
char *str;
|
||||
#else
|
||||
show( FILE *ofp,
|
||||
char *str)
|
||||
#endif
|
||||
{
|
||||
|
||||
if (cflag && *str)
|
||||
(void)fprintf(ofp, "%4d %s", repeats + 1, str);
|
||||
if ((dflag && repeats) || (uflag && !repeats))
|
||||
(void)fprintf(ofp, "%s", str);
|
||||
}
|
||||
|
||||
char *
|
||||
#ifndef __STDC__
|
||||
skip(str)
|
||||
register char *str;
|
||||
#else
|
||||
skip(register char *str)
|
||||
#endif
|
||||
{
|
||||
register int infield, nchars, nfields;
|
||||
|
||||
for (nfields = numfields, infield = 0; nfields && *str; ++str)
|
||||
if (isspace(*str)) {
|
||||
if (infield) {
|
||||
infield = 0;
|
||||
--nfields;
|
||||
}
|
||||
} else if (!infield)
|
||||
infield = 1;
|
||||
for (nchars = numchars; nchars-- && *str; ++str);
|
||||
return(str);
|
||||
}
|
||||
|
||||
FILE *
|
||||
#ifndef __STDC__
|
||||
file(name, mode)
|
||||
char *name, *mode;
|
||||
#else
|
||||
file(char *name, char *mode)
|
||||
#endif
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
if ((fp = fopen(name, mode)) == NULL)
|
||||
err(1, "%s", name);
|
||||
return(fp);
|
||||
}
|
||||
|
||||
void
|
||||
#ifndef __STDC__
|
||||
obsolete(argv)
|
||||
char *argv[];
|
||||
#else
|
||||
obsolete(char *argv[])
|
||||
#endif
|
||||
{
|
||||
int len;
|
||||
char *ap, *p, *start;
|
||||
|
||||
while ((ap = *++argv)) {
|
||||
/* Return if "--" or not an option of any form. */
|
||||
if (ap[0] != '-') {
|
||||
if (ap[0] != '+')
|
||||
return;
|
||||
} else if (ap[1] == '-')
|
||||
return;
|
||||
if (!isdigit(ap[1]))
|
||||
continue;
|
||||
/*
|
||||
* Digit signifies an old-style option. Malloc space for dash,
|
||||
* new option and argument.
|
||||
*/
|
||||
len = strlen(ap);
|
||||
if ((start = p = malloc(len + 3)) == NULL)
|
||||
errx(1, "malloc");
|
||||
*p++ = '-';
|
||||
*p++ = ap[0] == '+' ? 's' : 'f';
|
||||
(void)strcpy(p, ap + 1);
|
||||
*argv = start;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
#ifndef __STDC__
|
||||
usage()
|
||||
#else
|
||||
usage(void)
|
||||
#endif
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
#ifndef __GNO__
|
||||
"usage: uniq [-c | -du | -i] [-f fields] [-s chars] [input [output]]\n");
|
||||
#else
|
||||
"usage: uniq [-c | -du] [-i] [-f fields] [-s chars] [input [output]]\n");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
9
bin/uniq/uniq.desc
Normal file
9
bin/uniq/uniq.desc
Normal file
@ -0,0 +1,9 @@
|
||||
Name: uniq
|
||||
Version: 2.0 (November 1997)
|
||||
Shell: GNO
|
||||
Author: Dave Tribby (from FreeBSD code)
|
||||
Contact: tribby@cup.hp.com
|
||||
Where: /bin
|
||||
FTP: ground.isca.uiowa.edu apple2.caltech.edu trenco.myrias.com
|
||||
|
||||
report or filter out repeated lines in a file
|
30
bin/uniq/uniq.rez
Normal file
30
bin/uniq/uniq.rez
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Resources for version and comment
|
||||
* $Id: uniq.rez,v 1.1 1997/12/02 05:15:26 gdr Exp $
|
||||
*/
|
||||
#define PROG "uniq"
|
||||
#define DESC "Report or filter out repeated lines in a file."
|
||||
|
||||
#include "Types.rez"
|
||||
|
||||
/*
|
||||
* Version
|
||||
*/
|
||||
resource rVersion (1, purgeable3) {
|
||||
{ 2, 0, 0, /* Version 2.0.0 */
|
||||
release, /* development|alpha|beta|final|release */
|
||||
0 }, /* non-final release number */
|
||||
verUS, /* Country */
|
||||
PROG, /* Program name */
|
||||
DESC " Released with GNO/ME."
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Comment
|
||||
*/
|
||||
resource rComment (1, purgeable3) {
|
||||
PROG " v2.0 (November 1997)\n"
|
||||
"GNO utility: " DESC "\n"
|
||||
"Ported from FreeBSD code by Dave Tribby."
|
||||
};
|
Loading…
Reference in New Issue
Block a user