home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / libc / cfgetln.c < prev    next >
C/C++ Source or Header  |  1993-09-11  |  1KB  |  58 lines

  1. /*
  2.  * csfgetln - read an arbitrarily long, possibly-continued line.
  3.  * continuation rules are as per normal Unix conventions:
  4.  * "# comment" lines are ignored; otherwise, "line\" is continued.
  5.  * return value is malloced and must be freed by caller.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <fgetfln.h>
  11. #include "news.h"
  12.  
  13. #define COMMCHAR '#'
  14. #define CONTCHAR '\\'
  15.  
  16. char *
  17. csfgetln(fp, limit, skipflag)
  18. FILE *fp;
  19. register int limit;
  20. int skipflag;            /* skip leading whitespace on continuations? */
  21. {
  22.     register char *line, *contlin, *oldline;
  23.     int length = 0, contleng = 0;
  24.  
  25.     do {
  26.         line = fgetfln(fp, limit, &length);
  27.         if (line == NULL)
  28.             return NULL;        /* EOF */
  29.     } while (line[0] == COMMCHAR);        /* ignore comments */
  30.     if (limit >= 0) {
  31.         limit -= length;
  32.         if (limit <= 0)
  33.             return line;        /* enough bytes consumed */
  34.     }
  35.     line = strsave(line);
  36.     while (length > 1 &&
  37.         line[length-2] == CONTCHAR && line[length-1] == '\n') {
  38.         line[length-2] = '\0';        /* stomp "\\\n" */
  39.         length -= 2;            /* compensate */
  40.         contlin = fgetfln(fp, limit, &contleng);
  41.         if (contlin == NULL)
  42.             break;            /* EOF */
  43.         oldline = line;
  44.         if (skipflag)
  45.             while (*contlin == ' ' || *contlin == '\t')
  46.                 contlin++, contleng--;
  47.         line = str3save(oldline, "", contlin);
  48.         free(oldline);
  49.         length += contleng;
  50.         if (limit >= 0) {
  51.             limit -= contleng;
  52.             if (limit <= 0)
  53.                 return line;    /* enough bytes consumed */
  54.         }
  55.     }
  56.     return line;
  57. }
  58.