Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_subr/config_file.c view on Meta::CPAN
*
* Use CTX to store the ungotten character C.
*/
static APR_INLINE svn_error_t *
parser_ungetc(parse_context_t *ctx, int c)
{
ctx->ungotten_char = c;
return SVN_NO_ERROR;
}
/* Eat chars from STREAM until encounter non-whitespace, newline, or EOF.
Set *PCOUNT to the number of characters eaten, not counting the
last one, and return the last char read (the one that caused the
break). */
static APR_INLINE svn_error_t *
skip_whitespace(parse_context_t *ctx, int *c, int *pcount)
{
int ch = 0;
int count = 0;
SVN_ERR(parser_getc(ctx, &ch));
while (svn_ctype_isspace(ch) && ch != '\n' && ch != EOF)
{
++count;
SVN_ERR(parser_getc_plain(ctx, &ch));
}
*pcount = count;
*c = ch;
return SVN_NO_ERROR;
}
/* Skip to the end of the line (or file). Returns the char that ended
the line; the char is either EOF or newline. */
static APR_INLINE svn_error_t *
skip_to_eoln(parse_context_t *ctx, int *c)
{
int ch;
SVN_ERR(parser_getc(ctx, &ch));
while (ch != '\n' && ch != EOF)
SVN_ERR(parser_getc_plain(ctx, &ch));
*c = ch;
return SVN_NO_ERROR;
}
/* Skip a UTF-8 Byte Order Mark if found. */
static APR_INLINE svn_error_t *
skip_bom(parse_context_t *ctx)
{
int ch;
SVN_ERR(parser_getc(ctx, &ch));
if (ch == 0xEF)
{
const unsigned char *buf = (unsigned char *)ctx->parser_buffer;
/* This makes assumptions about the implementation of parser_getc and
* the use of skip_bom. Specifically that parser_getc() will get all
* of the BOM characters into the parse_context_t buffer. This can
* safely be assumed as long as we only try to use skip_bom() at the
* start of the stream and the buffer is longer than 3 characters. */
SVN_ERR_ASSERT(ctx->buffer_size > ctx->buffer_pos + 1);
if (buf[ctx->buffer_pos] == 0xBB && buf[ctx->buffer_pos + 1] == 0xBF)
ctx->buffer_pos += 2;
else
SVN_ERR(parser_ungetc(ctx, ch));
}
else
SVN_ERR(parser_ungetc(ctx, ch));
return SVN_NO_ERROR;
}
/* Parse a single option value */
static svn_error_t *
parse_value(int *pch, parse_context_t *ctx)
{
svn_boolean_t end_of_val = FALSE;
int ch;
/* Read the first line of the value */
svn_stringbuf_setempty(ctx->value);
SVN_ERR(parser_getc(ctx, &ch));
while (ch != EOF && ch != '\n')
/* last ch seen was ':' or '=' in parse_option. */
{
const char char_from_int = (char)ch;
svn_stringbuf_appendbyte(ctx->value, char_from_int);
SVN_ERR(parser_getc(ctx, &ch));
}
/* Leading and trailing whitespace is ignored. */
svn_stringbuf_strip_whitespace(ctx->value);
/* Look for any continuation lines. */
for (;;)
{
if (ch == EOF || end_of_val)
{
/* At end of file. The value is complete, there can't be
any continuation lines. */
svn_config_set(ctx->cfg, ctx->section->data,
ctx->option->data, ctx->value->data);
break;
}
else
{
int count;
++ctx->line;
SVN_ERR(skip_whitespace(ctx, &ch, &count));
switch (ch)
{
case '\n':
/* The next line was empty. Ergo, it can't be a
continuation line. */
++ctx->line;
end_of_val = TRUE;
continue;
( run in 0.530 second using v1.01-cache-2.11-cpan-39bf76dae61 )