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 }