diff options
Diffstat (limited to 'usr/src/cmd/ypcmd/revnetgroup/util.c')
| -rw-r--r-- | usr/src/cmd/ypcmd/revnetgroup/util.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/usr/src/cmd/ypcmd/revnetgroup/util.c b/usr/src/cmd/ypcmd/revnetgroup/util.c new file mode 100644 index 0000000000..511bf34b5b --- /dev/null +++ b/usr/src/cmd/ypcmd/revnetgroup/util.c @@ -0,0 +1,112 @@ +/* + * 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 (c) 1996-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" /* SMI4.1 1.4 */ + +#include <stdio.h> +#include <string.h> +#include "util.h" + + + + +/* + * This is just like fgets, but recognizes that "\\n" signals a continuation + * of a line + */ +char * +getline(line, maxlen, fp) + char *line; + int maxlen; + FILE *fp; +{ + register char *p; + register char *start; + int c; + + start = line; + +nextline: + if (fgets(start, maxlen, fp) == NULL) { + return (NULL); + } + for (p = start; *p; p++) { + if (*p == '\n') { + if (p > start && *(p-1) == '\\') { + start = p - 1; + maxlen++; + goto nextline; + } else { + return (line); + } + } + maxlen--; + } + + /* + * Input line is too long. Rest of the line needs to be discarded. + * Reinsert the last char into the stream. This is done so that + * in case the last char read is '\' and it is followed by a '\n' + * then the next line too can be discarded. + */ + if (p > start) + (void) ungetc(*(p-1), fp); + + /* + * Discard the rest of the line + */ + while ((c = getc(fp)) != EOF) { + if (c == '\n') + break; + else if (c == '\\') { + /* + * Ignore the next character except EOF + */ + if (getc(fp) == EOF) + break; + } + } + + maxlen = strlen(line) + 1; + + /* + * Certain functions expects a newline in the buffer. + */ + if (maxlen >= 2) + line[maxlen - 2] = '\n'; + (void) fprintf(stderr, "Following line too long - remaining chars " + "ignored\n--- %s", line); + return (line); +} + + +void +fatal(message) + char *message; +{ + (void) fprintf(stderr, "fatal error: %s\n", message); + exit(1); +} |
