diff --git a/bin/wc/Makefile b/bin/wc/Makefile new file mode 100644 index 0000000..ee38b7e --- /dev/null +++ b/bin/wc/Makefile @@ -0,0 +1,9 @@ +# +# This makefile is intended for use with dmake(1) on Apple IIGS +# +# Created by Dave Tribby, July 1997 + +# Program name +PROG= wc + +.INCLUDE : diff --git a/bin/wc/wc.1 b/bin/wc/wc.1 new file mode 100644 index 0000000..d4fddee --- /dev/null +++ b/bin/wc/wc.1 @@ -0,0 +1,107 @@ +.\" 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. +.\" +.\" @(#)wc.1 8.2 (Berkeley) 4/19/94 +.\" $Id: wc.1,v 1.1 1997/09/17 06:31:05 gdr Exp $ +.\" +.TH WC 1 "August 1997" "GNO" "Commands and Applications" +.SH NAME +.BR wc +\- word, line, and byte count +.SH SYNOPSIS +.BR wc " [" -clw ] +.IR file " ..." +.SH DESCRIPTION +The +.BR wc +utility displays the number of lines, words, and bytes contained in each +input +.IR file +(or standard input, by default) to the standard output. +A line is defined as a string of characters delimited by a +character, +and a word is defined as a string of characters delimited by white space +characters. +White space characters are the set of characters for which the +.BR isspace (3) +function returns true. +If more than one input file is specified, a line of cumulative counts +for all the files is displayed on a separate line after the output for +the last file. +.PP +The following options are available: +.IP \fB-c\fR +The number of bytes in each input file +is written to the standard output. +.IP \fB-l\fR +The number of lines in each input file +is written to the standard output. +.IP \fB-w\fR +The number of words in each input file +is written to the standard output. +.RE +.PP +When an option is specified, +.BR wc +only reports the information requested by that option. +The default action is equivalent to specifying all of the flags. +.LP +If no files are specified, the standard input is used and no +file name is displayed. +.LP +The +.BR wc +utility exits 0 on success, and >0 if an error occurs. +.SH ATTRIBUTIONS +This command was ported from FreeBSD source code +for distribution with GNO/ME 2.0.6. +.SH SEE ALSO +.BR isspace (3) +.SH COMPATIBILITY +Historically, the +.BR wc +utility was documented to define a word as a ``maximal string of +characters delimited by , or characters''. +The implementation, however, didn't handle non-printing characters +correctly so that `` ^D^E '' counted as 6 spaces, while ``foo^D^Ebar'' +counted as 8 characters. +4BSD systems after 4.3BSD modified the implementation to be consistent +with the documentation. +This implementation defines a ``word'' in terms of the +.BR isspace (3) +function, as required by POSIX.2. +.SH STANDARDS +The +.BR wc +function conforms to POSIX.2. diff --git a/bin/wc/wc.c b/bin/wc/wc.c new file mode 100644 index 0000000..7de10d8 --- /dev/null +++ b/bin/wc/wc.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 1980, 1987, 1991, 1993 + * 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, August 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) 1980, 1987, 1991, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +#if 0 +static const char sccsid[] = "@(#)wc.c 8.1 (Berkeley) 6/6/93"; +#else +static const char rcsid[] = + "$Id: wc.c,v 1.1 1997/09/17 06:31:05 gdr Exp $"; +#endif +#endif /* not lint */ +#endif + + +#include +#include + +#include +#include +#include +#ifndef __GNO__ +#include +#endif +#include +#include +#include +#include + +u_long tlinect, twordct, tcharct; +int doline, doword, dochar; + +int cnt __P((char *)); +void usage __P((void)); + + +/* Interface to check on how much stack space a C program uses. */ +#if defined(__GNO__) && defined(__STACK_CHECK__) +#ifndef _STDLIB_H_ +#include +#endif +extern void begin_stack_check(void); +extern int end_stack_check(void); +static void report_stack(void) +{ + fprintf(stderr,"\n ==> %d stack bytes used <== \n", end_stack_check()); +} +#endif + + +int +#ifndef __STDC__ +main(argc, argv) + int argc; + char *argv[]; +#else +main(int argc, + char *argv[]) +#endif +{ + register int ch; + int errors, total; + +#if defined(__GNO__) && defined(__STACK_CHECK__) + begin_stack_check(); + atexit(report_stack); +#endif +#ifndef __GNO__ + (void) setlocale(LC_CTYPE, ""); +#endif + + while ((ch = getopt(argc, argv, "lwc")) != -1) + switch((char)ch) { + case 'l': + doline = 1; + break; + case 'w': + doword = 1; + break; + case 'c': + dochar = 1; + break; + case '?': + default: + usage(); + } +#ifndef __ORCAC__ + argv += optind; +#else + argv = argv + optind; +#endif + argc -= optind; + + /* Wc's flags are on by default. */ + if (doline + doword + dochar == 0) + doline = doword = dochar = 1; + + errors = 0; + total = 0; + if (!*argv) { + if (cnt((char *)NULL) != 0) + ++errors; + else + (void)printf("\n"); + } + else do { + if (cnt(*argv) != 0) + ++errors; + else + (void)printf(" %s\n", *argv); + ++total; + } while(*++argv); + + if (total > 1) { + if (doline) + (void)printf(" %7ld", tlinect); + if (doword) + (void)printf(" %7ld", twordct); + if (dochar) + (void)printf(" %7ld", tcharct); + (void)printf(" total\n"); + } + exit(errors == 0 ? 0 : 1); +} + +int +#ifndef __STDC__ +cnt(file) + char *file; +#else +cnt(char *file) +#endif +{ + register u_char *p, ch; + register short gotsp; + register int len; + register u_long linect, wordct, charct; + struct stat sb; + int fd; +#ifndef __GNO__ + u_char buf[MAXBSIZE]; +#else + static u_char buf[MAXBSIZE]; +#endif + + linect = wordct = charct = 0; + if (file == NULL) { + file = "stdin"; + fd = STDIN_FILENO; + } else { +#ifndef __GNO__ + if ((fd = open(file, O_RDONLY, 0)) < 0) { +#else /* GNO: 3rd parameter legal only when creating */ + if ((fd = open(file, O_RDONLY)) < 0) { +#endif + warn("%s: open", file); + return (1); + } + if (doword) + goto word; + /* + * Line counting is split out because it's a lot faster to get + * lines than to get words, since the word count requires some + * logic. + */ + if (doline) { + while (len = read(fd, buf, MAXBSIZE)) { + if (len == -1) { + warn("%s: read", file); + (void)close(fd); + return (1); + } + charct += len; + for (p = buf; len--; ++p) +#ifndef __GNO__ /* GNO delimits lines with \r, not \n */ + if (*p == '\n') +#else + if (*p == '\r') +#endif + ++linect; + } + tlinect += linect; + (void)printf(" %7lu", linect); + if (dochar) { + tcharct += charct; + (void)printf(" %7lu", charct); + } + (void)close(fd); + return (0); + } + /* + * If all we need is the number of characters and it's a + * regular or linked file, just stat the puppy. + */ + if (dochar) { + if (fstat(fd, &sb)) { + warn("%s: fstat", file); + (void)close(fd); + return (1); + } + if (S_ISREG(sb.st_mode) || S_ISLNK(sb.st_mode)) { +#ifndef __GNO__ + (void)printf(" %7qu", sb.st_size); +#else + (void)printf(" %7lu", sb.st_size); +#endif + tcharct += sb.st_size; + (void)close(fd); + return (0); + } + } + } + + /* Do it the hard way... */ +word: for (gotsp = 1; len = read(fd, buf, MAXBSIZE);) { + if (len == -1) { + warn("%s: read", file); + (void)close(fd); + return (1); + } + /* + * This loses in the presence of multi-byte characters. + * To do it right would require a function to return a + * character while knowing how many bytes it consumed. + */ + charct += len; + for (p = buf; len--;) { + ch = *p++; +#ifndef __GNO__ /* GNO delimits lines with \r, not \n */ + if (ch == '\n') +#else + if (ch == '\r') +#endif + ++linect; + if (isspace(ch)) + gotsp = 1; + else if (gotsp) { + gotsp = 0; + ++wordct; + } + } + } + if (doline) { + tlinect += linect; + (void)printf(" %7lu", linect); + } + if (doword) { + twordct += wordct; + (void)printf(" %7lu", wordct); + } + if (dochar) { + tcharct += charct; + (void)printf(" %7lu", charct); + } + (void)close(fd); + return (0); +} + +void +#ifndef __STDC__ +usage() +#else +usage(void) +#endif +{ + (void)fprintf(stderr, "usage: wc [-clw] [files]\n"); + exit(1); +} diff --git a/bin/wc/wc.desc b/bin/wc/wc.desc new file mode 100644 index 0000000..96059b1 --- /dev/null +++ b/bin/wc/wc.desc @@ -0,0 +1,15 @@ +Name: +Version: 2.0 (August 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 + + + +/* + * Resources for version and comment + */ +#define PROG "wc" +#define DESC "Word, line, and byte count." diff --git a/bin/wc/wc.rez b/bin/wc/wc.rez new file mode 100644 index 0000000..6763a4d --- /dev/null +++ b/bin/wc/wc.rez @@ -0,0 +1,29 @@ +/* + * Resources for version and comment + */ +#define PROG "wc" +#define DESC "Word, line, and byte count." + +#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 (August 1997)\n" + "GNO utility: " DESC "\n" + "Ported from FreeBSD code by Dave Tribby." +};