#include "libpspp/i18n.h"
#include "libpspp/string-map.h"
#include "output/driver.h"
-#include "output/message-item.h"
#include "output/options.h"
+#include "output/output-item.h"
#include "output/pivot-table.h"
-#include "output/table-item.h"
#include "gl/error.h"
#include "gl/progname.h"
static const char *parse_options (int argc, char **argv);
static void usage (void) NO_RETURN;
static void read_table (struct lexer *);
-static void output_msg (const struct msg *, void *);
+static void output_msg (const struct msg *, struct lexer *);
int
main (int argc, char **argv)
settings_init ();
struct lex_reader *reader = lex_reader_for_file (input_file_name, NULL,
- LEX_SYNTAX_AUTO,
+ SEG_MODE_AUTO,
LEX_ERROR_CONTINUE);
if (!reader)
exit (1);
struct lexer *lexer = lex_create ();
- msg_set_handler (output_msg, lexer);
+ lex_set_message_handler (lexer, output_msg);
lex_include (lexer, reader);
lex_get (lexer);
register_driver (&options, "-");
-#ifdef HAVE_CAIRO
/* Render to <base>.pdf. */
string_map_insert (&options, "top-margin", "0");
string_map_insert (&options, "bottom-margin", "0");
string_map_insert (&options, "paper-size", "99x99in");
string_map_insert (&options, "trim", "true");
register_driver (&options, "%s.pdf", output_base);
-#endif
string_map_insert (&options, "box", "unicode");
register_driver (&options, "%s.txt", output_base);
if (lex_match_id (lexer, "SUBSCRIPTS"))
{
lex_match (lexer, T_EQUALS);
- size_t allocated_subscripts = value->n_subscripts;
+
+ struct pivot_value_ex *ex = pivot_value_ex_rw (value);
+ size_t allocated_subscripts = ex->n_subscripts;
while (lex_token (lexer) == T_STRING)
{
- if (value->n_subscripts >= allocated_subscripts)
- value->subscripts = x2nrealloc (value->subscripts,
- &allocated_subscripts,
- sizeof *value->subscripts);
+ if (ex->n_subscripts >= allocated_subscripts)
+ ex->subscripts = x2nrealloc (ex->subscripts, &allocated_subscripts,
+ sizeof *ex->subscripts);
- value->subscripts[value->n_subscripts++] = xstrdup (
- lex_tokcstr (lexer));
+ ex->subscripts[ex->n_subscripts++] = xstrdup (lex_tokcstr (lexer));
lex_get (lexer);
}
return;
{
lex_match (lexer, T_EQUALS);
- if (!value->font_style)
+ struct pivot_value_ex *ex = pivot_value_ex_rw (value);
+ if (!ex->font_style)
{
- value->font_style = xmalloc (sizeof *value->font_style);
- font_style_copy (NULL, value->font_style, &base_style->font_style);
+ ex->font_style = xmalloc (sizeof *ex->font_style);
+ font_style_copy (NULL, ex->font_style, &base_style->font_style);
}
- read_font_style (lexer, value->font_style);
+ read_font_style (lexer, ex->font_style);
return;
}
{
lex_match (lexer, T_EQUALS);
- if (!value->cell_style)
+ struct pivot_value_ex *ex = pivot_value_ex_rw (value);
+ if (!ex->cell_style)
{
- value->cell_style = xmalloc (sizeof *value->cell_style);
- *value->cell_style = base_style->cell_style;
+ ex->cell_style = xmalloc (sizeof *ex->cell_style);
+ *ex->cell_style = base_style->cell_style;
}
- read_cell_style (lexer, value->cell_style);
+ read_cell_style (lexer, ex->cell_style);
return;
}
{
value = xmalloc (sizeof *value);
*value = (struct pivot_value) {
- .type = PIVOT_VALUE_STRING,
- .string = { .s = xstrdup (lex_tokcstr (lexer)) },
+ .string = {
+ .type = PIVOT_VALUE_STRING,
+ .s = xstrdup (lex_tokcstr (lexer))
+ },
};
lex_get (lexer);
}
{
value = xmalloc (sizeof *value);
*value = (struct pivot_value) {
- .type = PIVOT_VALUE_VARIABLE,
- .variable = { .var_name = xstrdup (lex_tokcstr (lexer)) },
+ .variable = {
+ .type = PIVOT_VALUE_VARIABLE,
+ .var_name = xstrdup (lex_tokcstr (lexer))
+ },
};
lex_get (lexer);
}
else
marker = NULL;
- pivot_table_create_footnote__ (pt, idx, marker, content);
+ bool show = !lex_match_id (lexer, "HIDE");
+ pivot_table_create_footnote__ (pt, idx, marker, content)->show = show;
}
static void
if (!displayed)
pivot_table_submit (pt);
else
- pivot_table_unshare (pt);
+ pivot_table_unref (pt);
force_match (lexer, T_ENDCMD);
}
static void
-output_msg (const struct msg *m_, void *lexer_)
+output_msg (const struct msg *m_, struct lexer *lexer)
{
- struct lexer *lexer = lexer_;
- struct msg m = *m_;
-
- if (m.file_name == NULL)
- {
- m.file_name = CONST_CAST (char *, lex_get_file_name (lexer));
- m.first_line = lex_get_first_line_number (lexer, 0);
- m.last_line = lex_get_last_line_number (lexer, 0);
- }
-
- m.command_name = output_get_command_name ();
+ struct msg m = {
+ .category = m_->category,
+ .severity = m_->severity,
+ .location = (m_->location ? m_->location
+ : lexer ? lex_get_location (lexer, 0, 0)
+ : NULL),
+ .command_name = output_get_uppercase_command_name (),
+ .text = m_->text,
+ };
- message_item_submit (message_item_create (&m));
+ output_item_submit (message_item_create (&m));
free (m.command_name);
+ if (m.location != m_->location)
+ msg_location_destroy (m.location);
}