diff options
| author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
|---|---|---|
| committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
| commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
| tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/asa | |
| download | illumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz | |
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/asa')
| -rw-r--r-- | usr/src/cmd/asa/Makefile | 45 | ||||
| -rw-r--r-- | usr/src/cmd/asa/asa.c | 245 |
2 files changed, 290 insertions, 0 deletions
diff --git a/usr/src/cmd/asa/Makefile b/usr/src/cmd/asa/Makefile new file mode 100644 index 0000000000..f27fdafc8f --- /dev/null +++ b/usr/src/cmd/asa/Makefile @@ -0,0 +1,45 @@ +# +# 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 2004 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +PROG= asa + +include ../Makefile.cmd + +CFLAGS += $(CCVERBOSE) + +.KEEP_STATE: + +all: $(PROG) + +install: all $(ROOTPROG) + +clean: + +lint: lint_PROG + +include ../Makefile.targ diff --git a/usr/src/cmd/asa/asa.c b/usr/src/cmd/asa/asa.c new file mode 100644 index 0000000000..79aeec4cae --- /dev/null +++ b/usr/src/cmd/asa/asa.c @@ -0,0 +1,245 @@ +/* + * 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 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + + +#include <ctype.h> +#include <limits.h> +#include <locale.h> +#include <nl_types.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#define FF '\f' +#define NL '\n' +#define NUL '\0' + +static void usage(void); +static void disp_file(FILE *f, char *filename); +static FILE *get_next_file(int, char *, char *[], int); +static void finish(int need_a_newline); + +int estatus = 0; /* exit status */ +int i; /* argv index */ + +int +main(int argc, char *argv[]) +{ + int c; + int form_feeds = 0; + int need_a_newline = 0; + char *filename = NULL; + FILE *f; + + (void) setlocale(LC_ALL, ""); +#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ +#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it were not */ +#endif + + (void) textdomain(TEXT_DOMAIN); + + while ((c = getopt(argc, argv, "f")) != EOF) { + switch (c) { + case 'f': + form_feeds = 1; + break; + + case '?': + usage(); + } + } + + i = optind; + if (argc <= i) { + filename = NULL; + f = stdin; + } else { + f = get_next_file(need_a_newline, filename, argv, argc); + } + + need_a_newline = 0; + for (;;) { + /* interpret the first character in the line */ + + c = getc(f); + switch (c) { + case EOF: + disp_file(f, filename); + + if (i >= argc) + finish(need_a_newline); + + f = get_next_file(need_a_newline, filename, argv, argc); + + if (need_a_newline) { + (void) putchar(NL); + need_a_newline = 0; + } + + if (form_feeds) + (void) putchar(FF); + + continue; + + case NL: + if (need_a_newline) + (void) putchar(NL); + need_a_newline = 1; + continue; + + case '+': + if (need_a_newline) + (void) putchar('\r'); + break; + + case '0': + if (need_a_newline) + (void) putchar(NL); + (void) putchar(NL); + break; + + case '1': + if (need_a_newline) + (void) putchar(NL); + (void) putchar(FF); + break; + + case ' ': + default: + if (need_a_newline) + (void) putchar(NL); + break; + } + + need_a_newline = 0; + + for (;;) { + c = getc(f); + if (c == NL) { + need_a_newline = 1; + break; + } else if (c == EOF) { + disp_file(f, filename); + + if (i >= argc) + finish(need_a_newline); + + f = get_next_file(need_a_newline, filename, + argv, argc); + + if (form_feeds) { + (void) putchar(NL); + (void) putchar(FF); + need_a_newline = 0; + break; + } + } else { + (void) putchar(c); + } + } + } + /* NOTREACHED */ + return (0); +} + +static void +usage(void) +{ + (void) fprintf(stderr, gettext("usage: asa [-f] [-|file...]\n")); + exit(1); +} + + +static void +disp_file(FILE *f, char *filename) +{ + + if (ferror(f)) { + int serror = errno; + if (filename) { + (void) fprintf(stderr, gettext( + "asa: read error on file %s\n"), filename); + } else { + (void) fprintf(stderr, gettext( + "asa: read error on standard input\n")); + } + errno = serror; + perror(""); + estatus = 1; + } + + (void) fclose(f); + +} + +static FILE * +get_next_file(int need_a_newline, char *filename, char *argv[], int argc) +{ + FILE *f; + if (strcmp(argv[i], "-") == 0) { + filename = NULL; + f = stdin; + } else { + /* + * Process each file operand. If unsuccessful, affect the + * exit status and continue processing the next operand. + */ + filename = argv[i]; + while ((f = fopen(filename, "r")) == NULL) { + int serror = errno; + (void) fprintf(stderr, + gettext("asa: cannot open %s:"), filename); + errno = serror; + perror(""); + estatus = 1; + if (++i < argc) { + if (strcmp(argv[i], "-") == 0) { + filename = NULL; + f = stdin; + break; + } else { + filename = argv[i]; + } + } else { + finish(need_a_newline); + } + } + } + ++i; + return (f); +} + +static void +finish(int need_a_newline) +{ + if (need_a_newline) + (void) putchar(NL); + exit(estatus); +} |
