#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stddef.h>
#include "message.h"
#include "xgettext.h"
#include "x-rst.h"
#include "error.h"
#include "error-progname.h"
#include "xalloc.h"
#include "exit.h"
#include "gettext.h"
#define _(s) gettext(s)
void
extract_rst (FILE *f,
const char *real_filename, const char *logical_filename,
flag_context_list_table_ty *flag_table,
msgdomain_list_ty *mdlp)
{
static char *buffer;
static int bufmax;
message_list_ty *mlp = mdlp->item[0]->messages;
int line_number;
line_number = 1;
for (;;)
{
int c;
int bufpos;
char *location;
char *msgid;
lex_pos_ty pos;
c = getc (f);
if (c == EOF)
break;
if (c == '\n')
{
line_number++;
continue;
}
if (c == '#')
{
do
c = getc (f);
while (c != EOF && c != '\n');
if (c == EOF)
break;
line_number++;
continue;
}
bufpos = 0;
for (;;)
{
if (c == EOF || c == '\n')
{
error_with_progname = false;
error (EXIT_FAILURE, 0, _("%s:%d: invalid string definition"),
logical_filename, line_number);
error_with_progname = true;
}
if (bufpos >= bufmax)
{
bufmax = 2 * bufmax + 10;
buffer = xrealloc (buffer, bufmax);
}
if (c == '=')
break;
buffer[bufpos++] = c;
c = getc (f);
if (c == EOF && ferror (f))
goto bomb;
}
buffer[bufpos] = '\0';
location = xstrdup (buffer);
bufpos = 0;
for (;;)
{
c = getc (f);
if (c == EOF)
break;
else if (c == '\n')
{
line_number++;
break;
}
else if (c == '\'')
{
for (;;)
{
c = getc (f);
if (c == EOF || c == '\n' || c == '\'')
break;
if (bufpos >= bufmax)
{
bufmax = 2 * bufmax + 10;
buffer = xrealloc (buffer, bufmax);
}
buffer[bufpos++] = c;
}
if (c == EOF)
break;
else if (c == '\n')
{
line_number++;
break;
}
}
else if (c == '#')
{
int n;
c = getc (f);
if (c == EOF && ferror (f))
goto bomb;
if (c == EOF || !isdigit (c))
{
error_with_progname = false;
error (EXIT_FAILURE, 0, _("%s:%d: missing number after #"),
logical_filename, line_number);
error_with_progname = true;
}
n = (c - '0');
for (;;)
{
c = getc (f);
if (c == EOF || !isdigit (c))
break;
n = n * 10 + (c - '0');
}
if (bufpos >= bufmax)
{
bufmax = 2 * bufmax + 10;
buffer = xrealloc (buffer, bufmax);
}
buffer[bufpos++] = (unsigned char) n;
if (c == EOF)
break;
ungetc (c, f);
}
else if (c == '+')
{
c = getc (f);
if (c == EOF)
break;
if (c == '\n')
line_number++;
else
ungetc (c, f);
}
else
{
error_with_progname = false;
error (EXIT_FAILURE, 0, _("%s:%d: invalid string expression"),
logical_filename, line_number);
error_with_progname = true;
}
}
if (bufpos >= bufmax)
{
bufmax = 2 * bufmax + 10;
buffer = xrealloc (buffer, bufmax);
}
buffer[bufpos] = '\0';
msgid = xstrdup (buffer);
pos.file_name = location;
pos.line_number = (size_t)(-1);
remember_a_message (mlp, msgid, null_context, &pos);
if (c == EOF)
break;
}
if (ferror (f))
{
bomb:
error (EXIT_FAILURE, errno, _("error while reading \"%s\""),
real_filename);
}
}