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 }