1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
25 */
26
27 #include <stdio.h>
28 #include <string.h>
29 #include "util.h"
30
31
32
33
34 /*
35 * This is just like fgets, but recognizes that "\\n" signals a continuation
36 * of a line
37 */
38 char *
39 getaline(line, maxlen, fp)
40 char *line;
41 int maxlen;
42 FILE *fp;
43 {
44 register char *p;
45 register char *start;
46 int c;
47
48 start = line;
49
50 nextline:
51 if (fgets(start, maxlen, fp) == NULL) {
52 return (NULL);
53 }
54 for (p = start; *p; p++) {
55 if (*p == '\n') {
56 if (p > start && *(p-1) == '\\') {
57 start = p - 1;
58 maxlen++;
59 goto nextline;
60 } else {
61 return (line);
62 }
63 }
64 maxlen--;
65 }
66
67 /*
68 * Input line is too long. Rest of the line needs to be discarded.
69 * Reinsert the last char into the stream. This is done so that
70 * in case the last char read is '\' and it is followed by a '\n'
71 * then the next line too can be discarded.
72 */
73 if (p > start)
74 (void) ungetc(*(p-1), fp);
75
76 /*
77 * Discard the rest of the line
78 */
79 while ((c = getc(fp)) != EOF) {
80 if (c == '\n')
81 break;
82 else if (c == '\\') {
83 /*
84 * Ignore the next character except EOF
85 */
86 if (getc(fp) == EOF)
87 break;
88 }
89 }
90
91 maxlen = strlen(line) + 1;
92
93 /*
94 * Certain functions expects a newline in the buffer.
95 */
96 if (maxlen >= 2)
97 line[maxlen - 2] = '\n';
98 (void) fprintf(stderr, "Following line too long - remaining chars "
99 "ignored\n--- %s", line);
100 return (line);
101 }