/* Destroys CSV file writer W. */ static void csv_file_casewriter_destroy (struct casewriter *writer, void *w_) { struct csv_writer *w = w_; if (!close_writer (w)) casewriter_force_error (writer); }
/* Writes case C to CSV file W. */ static void csv_file_casewriter_write (struct casewriter *writer, void *w_, struct ccase *c) { struct csv_writer *w = w_; if (ferror (w->file)) { casewriter_force_error (writer); case_unref (c); return; } csv_write_case (w, c); case_unref (c); }
/* Set the clip according to the currently selected range in the data sheet */ static void data_sheet_set_clip (PsppireSheet *sheet) { int i; struct casewriter *writer ; PsppireSheetRange range; PsppireDataStore *ds; struct case_map *map = NULL; casenumber max_rows; size_t max_columns; gint row0, rowi; gint col0, coli; ds = PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet)); psppire_sheet_get_selected_range (sheet, &range); col0 = MIN (range.col0, range.coli); coli = MAX (range.col0, range.coli); row0 = MIN (range.row0, range.rowi); rowi = MAX (range.row0, range.rowi); /* If nothing selected, then use active cell */ if ( row0 < 0 || col0 < 0 ) { gint row, col; psppire_sheet_get_active_cell (sheet, &row, &col); row0 = rowi = row; col0 = coli = col; } /* The sheet range can include cells that do not include data. Exclude them from the range. */ max_rows = psppire_data_store_get_case_count (ds); if (rowi >= max_rows) { if (max_rows == 0) return; rowi = max_rows - 1; } max_columns = dict_get_var_cnt (ds->dict->dict); if (coli >= max_columns) { if (max_columns == 0) return; coli = max_columns - 1; } /* Destroy any existing clip */ if ( clip_datasheet ) { casereader_destroy (clip_datasheet); clip_datasheet = NULL; } if ( clip_dict ) { dict_destroy (clip_dict); clip_dict = NULL; } /* Construct clip dictionary. */ clip_dict = dict_create (dict_get_encoding (ds->dict->dict)); for (i = col0; i <= coli; i++) dict_clone_var_assert (clip_dict, dict_get_var (ds->dict->dict, i)); /* Construct clip data. */ map = case_map_by_name (ds->dict->dict, clip_dict); writer = autopaging_writer_create (dict_get_proto (clip_dict)); for (i = row0; i <= rowi ; ++i ) { struct ccase *old = psppire_data_store_get_case (ds, i); if (old != NULL) casewriter_write (writer, case_map_execute (map, old)); else casewriter_force_error (writer); } case_map_destroy (map); clip_datasheet = casewriter_make_reader (writer); data_sheet_update_clipboard (sheet); }