#include <libpkgconf/stdinc.h>
#include <libpkgconf/libpkgconf.h>
bool
pkgconf_fgetline(pkgconf_buffer_t *buffer, FILE *stream)
{
bool quoted = false;
int c = '\0', c2;
while ((c = getc(stream)) != EOF)
{
if (c == '\\' && !quoted)
{
quoted = true;
continue;
}
else if (c == '#')
{
if (!quoted) {
do {
c = getc(stream);
} while (c != '\n' && c != EOF);
pkgconf_buffer_push_byte(buffer, c);
break;
}
else
pkgconf_buffer_push_byte(buffer, c);
quoted = false;
continue;
}
else if (c == '\n')
{
if (quoted)
{
do {
c2 = getc(stream);
} while (c2 == '\t' || c2 == ' ');
ungetc(c2, stream);
quoted = false;
continue;
}
else
{
pkgconf_buffer_push_byte(buffer, c);
}
break;
}
else if (c == '\r')
{
pkgconf_buffer_push_byte(buffer, '\n');
if ((c2 = getc(stream)) == '\n')
{
if (quoted)
{
quoted = false;
continue;
}
break;
}
ungetc(c2, stream);
if (quoted)
{
quoted = false;
continue;
}
break;
}
else
{
if (quoted) {
pkgconf_buffer_push_byte(buffer, '\\');
quoted = false;
}
pkgconf_buffer_push_byte(buffer, c);
}
}
if (pkgconf_buffer_lastc(buffer) == '\n')
pkgconf_buffer_trim_byte(buffer);
if (pkgconf_buffer_lastc(buffer) == '\r')
pkgconf_buffer_trim_byte(buffer);
return !(c == EOF || ferror(stream));
}