- else
- casewriter_force_error (writer);
- }
- case_map_destroy (map);
-
- clip_datasheet = casewriter_make_reader (writer);
-
- data_sheet_update_clipboard (sheet);
-}
-
-enum {
- SELECT_FMT_NULL,
- SELECT_FMT_TEXT,
- SELECT_FMT_HTML
-};
-
-
-/* Perform data_out for case CC, variable V, appending to STRING */
-static void
-data_out_g_string (GString *string, const struct variable *v,
- const struct ccase *cc)
-{
- char *buf ;
-
- const struct fmt_spec *fs = var_get_print_format (v);
- const union value *val = case_data (cc, v);
- buf = xzalloc (fs->w);
-
- data_out (val, fs, buf);
-
- g_string_append_len (string, buf, fs->w);
-
- g_free (buf);
-}
-
-static GString *
-clip_to_text (void)
-{
- casenumber r;
- GString *string;
-
- const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
- const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
- const size_t var_cnt = dict_get_var_cnt (clip_dict);
-
- string = g_string_sized_new (10 * val_cnt * case_cnt);
-
- for (r = 0 ; r < case_cnt ; ++r )
- {
- int c;
- struct ccase cc;
- if ( ! casereader_peek (clip_datasheet, r, &cc))
- {
- g_warning ("Clipboard seems to have inexplicably shrunk");
- break;
- }
-
- for (c = 0 ; c < var_cnt ; ++c)
- {
- const struct variable *v = dict_get_var (clip_dict, c);
- data_out_g_string (string, v, &cc);
- if ( c < val_cnt - 1 )
- g_string_append (string, "\t");
- }
-
- if ( r < case_cnt)
- g_string_append (string, "\n");
-
- case_destroy (&cc);
- }
-
- return string;
-}
-
-
-static GString *
-clip_to_html (void)
-{
- casenumber r;
- GString *string;
-
- const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
- const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
- const size_t var_cnt = dict_get_var_cnt (clip_dict);
-
-
- /* Guestimate the size needed */
- string = g_string_sized_new (20 * val_cnt * case_cnt);
-
- g_string_append (string, "<table>\n");
- for (r = 0 ; r < case_cnt ; ++r )
- {
- int c;
- struct ccase cc;
- if ( ! casereader_peek (clip_datasheet, r, &cc))
- {
- g_warning ("Clipboard seems to have inexplicably shrunk");
- break;
- }
- g_string_append (string, "<tr>\n");
-
- for (c = 0 ; c < var_cnt ; ++c)
- {
- const struct variable *v = dict_get_var (clip_dict, c);
- g_string_append (string, "<td>");
- data_out_g_string (string, v, &cc);
- g_string_append (string, "</td>\n");
- }
-
- g_string_append (string, "</tr>\n");
-
- case_destroy (&cc);
- }
- g_string_append (string, "</table>\n");
-
- return string;
-}
-
-
-
-static void
-clipboard_get_cb (GtkClipboard *clipboard,
- GtkSelectionData *selection_data,
- guint info,
- gpointer data)
-{
- GString *string = NULL;
-
- switch (info)
- {
- case SELECT_FMT_TEXT:
- string = clip_to_text ();