URI: 
       support empty line at the end of the file - ics2txt - convert icalendar .ics file to plain text
  HTML git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
       ---
   DIR commit d10df705caaa2ca4e3229af6d5ec76e0f0d301da
   DIR parent cf0323aa059bf54b2a88046d7e6e17efe16f9a2e
  HTML Author: Josuah Demangeon <me@josuah.net>
       Date:   Mon, 14 Jun 2021 08:31:43 +0200
       
       support empty line at the end of the file
       
       Diffstat:
         M ical.c                              |      16 +++++++++-------
       
       1 file changed, 9 insertions(+), 7 deletions(-)
       ---
   DIR diff --git a/ical.c b/ical.c
       @@ -131,7 +131,6 @@ hook_block_begin(IcalParser *p, char *name)
                        return ical_error(p, "max recurion reached");
                if (!Xstrlcpy(p->current->name, name))
                        return ical_error(p, "value too large");
       -
                return 0;
        }
        
       @@ -143,7 +142,6 @@ hook_block_end(IcalParser *p, char *name)
                p->current--;
                if (p->current < p->stack)
                        return ical_error(p, "more END: than BEGIN:");
       -
                return 0;
        }
        
       @@ -260,22 +258,25 @@ ical_parse(IcalParser *p, FILE *fp)
        
                while (!feof(fp)) {
                        if ((contentline = realloc(contentline, 1)) == NULL)
       -                        return -1;
       +                        return ical_error(p, strerror(errno));
                        *contentline = '\0';
        
                        do {
                                do {
                                        p->linenum++;
       -                                if (getline(&ln, &sz, fp) <= 0)
       -                                        return -1;
       +                                if (getline(&ln, &sz, fp) <= 0) {
       +                                        if (ferror(fp))
       +                                                return ical_error(p, strerror(errno));
       +                                        goto end;
       +                                }
                                        strchomp(ln);
                                } while (*ln == '\0');
        
                                if (strappend(&contentline, ln) < 0)
       -                                return -1;
       +                                return ical_error(p, strerror(errno));
                                if ((c = fgetc(fp)) == EOF) {
                                        if (ferror(fp))
       -                                        return -1;
       +                                        return ical_error(p, strerror(errno));
                                        goto done;
                                }
                        } while (c == ' ');
       @@ -285,6 +286,7 @@ done:
                        if ((err = ical_parse_contentline(p, contentline)) != 0)
                                break;
                }
       +end:
                free(contentline);
                free(ln);
                return err;