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 */ 25 26 #include <stdio.h> 27 #include <string.h> 28 #include "util.h" 29 30 31 32 33 /* 34 * This is just like fgets, but recognizes that "\\n" signals a continuation 35 * of a line 36 */ 37 char * 38 getaline(line, maxlen, fp) 39 char *line; 40 int maxlen; 41 FILE *fp; 42 { 43 register char *p; 44 register char *start; 45 int c; 46 47 start = line; 48 49 nextline: 50 if (fgets(start, maxlen, fp) == NULL) { 51 return (NULL); 52 } 53 for (p = start; *p; p++) { 54 if (*p == '\n') { 55 if (p > start && *(p-1) == '\\') { 56 start = p - 1; 57 maxlen++; 58 goto nextline; 59 } else { 60 return (line); 61 } 62 } 63 maxlen--; 64 } 65 66 /* 67 * Input line is too long. Rest of the line needs to be discarded. 68 * Reinsert the last char into the stream. This is done so that 69 * in case the last char read is '\' and it is followed by a '\n' 70 * then the next line too can be discarded. 71 */ 72 if (p > start) 73 (void) ungetc(*(p-1), fp); 74 75 /* 76 * Discard the rest of the line 77 */ 78 while ((c = getc(fp)) != EOF) { 79 if (c == '\n') 80 break; 81 else if (c == '\\') { 82 /* 83 * Ignore the next character except EOF 84 */ 85 if (getc(fp) == EOF) 86 break; 87 } 88 } 89 90 maxlen = strlen(line) + 1; 91 92 /* 93 * Certain functions expects a newline in the buffer. 94 */ 95 if (maxlen >= 2) 96 line[maxlen - 2] = '\n'; 97 (void) fprintf(stderr, "Following line too long - remaining chars " 98 "ignored\n--- %s", line); 99 return (line); 100 } 101 102 103 void 104 fatal(message) 105 char *message; 106 { 107 (void) fprintf(stderr, "fatal error: %s\n", message); 108 exit(1); 109 }