X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-writer.c;h=f38bc6896d94d96f6468d8e8cec8476091b13190;hb=885ac3ed70c6cf89e951792de1b0c991b309b5c4;hp=5f87d0060ac589a27c0713ba8cfc38ca91329642;hpb=504ee72af2e3f4df358ca45b8acb847affdb85cb;p=pspp diff --git a/src/language/data-io/data-writer.c b/src/language/data-io/data-writer.c index 5f87d0060a..f38bc6896d 100644 --- a/src/language/data-io/data-writer.c +++ b/src/language/data-io/data-writer.c @@ -92,8 +92,7 @@ dfm_open_writer (struct file_handle *fh, const char *encoding) w = xmalloc (sizeof *w); w->fh = fh_ref (fh); w->lock = lock; - w->rf = replace_file_start (fh_get_file_name (w->fh), "wb", 0666, - &w->file, NULL); + w->rf = replace_file_start (w->fh, "wb", 0666, &w->file); w->encoding = xstrdup (encoding); w->line_ends = fh_get_line_ends (fh); w->unit = ei.unit; @@ -115,7 +114,7 @@ dfm_open_writer (struct file_handle *fh, const char *encoding) return w; } -/* Returns false if an I/O error occurred on WRITER, true otherwise. */ +/* Returns true if an I/O error occurred on WRITER, false otherwise. */ bool dfm_write_error (const struct dfm_writer *writer) { @@ -204,6 +203,25 @@ dfm_put_record (struct dfm_writer *w, const char *rec, size_t len) return !dfm_write_error (w); } +/* Writes record REC (which need not be null-terminated) having length LEN to + the file corresponding to HANDLE. REC is encoded in UTF-8, which this + function recodes to the correct encoding for W before writing. Adds any + needed formatting, such as a trailing new-line. Returns true on success, + false on failure. */ +bool +dfm_put_record_utf8 (struct dfm_writer *w, const char *rec, size_t len) +{ + if (is_encoding_utf8 (w->encoding)) + return dfm_put_record (w, rec, len); + else + { + char *recoded = recode_string (w->encoding, UTF8, rec, len); + bool ok = dfm_put_record (w, recoded, strlen (recoded)); + free (recoded); + return ok; + } +} + /* Closes data file writer W. */ bool dfm_close_writer (struct dfm_writer *w) @@ -219,7 +237,7 @@ dfm_close_writer (struct dfm_writer *w) if (w->file != NULL) { const char *file_name = fh_get_file_name (w->fh); - ok = !dfm_write_error (w) && !fn_close (file_name, w->file); + ok = !dfm_write_error (w) && !fn_close (w->fh, w->file); if (!ok) msg (ME, _("I/O error occurred writing data file `%s'."), file_name);