X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fascii.c;h=bd30677f20fb0be5f065d079dade4ecb6fbf35f9;hb=f7d622c96c3a9e10447a23c1efb9e027c8bde7cf;hp=0b6d659fa8c7317f31329ced1b60bd25abdb98a6;hpb=8dd405d0900f29f69e54726a79045c119146de89;p=pspp diff --git a/src/output/ascii.c b/src/output/ascii.c index 0b6d659fa8..bd30677f20 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -28,6 +28,7 @@ #include #include "data/file-name.h" +#include "data/file-handle-def.h" #include "data/settings.h" #include "libpspp/assertion.h" #include "libpspp/cast.h" @@ -126,7 +127,15 @@ static const ucs4_t unicode_box_chars[N_BOX] = static inline int make_box_index (int left, int right, int top, int bottom) { - return ((right * RENDER_N_LINES + bottom) * RENDER_N_LINES + left) * RENDER_N_LINES + top; + int start_side = left; + int end_side = right; + if (render_direction_rtl ()) + { + start_side = right; + end_side = left; + } + + return ((end_side * RENDER_N_LINES + bottom) * RENDER_N_LINES + start_side) * RENDER_N_LINES + top; } /* How to emphasize text. */ @@ -172,7 +181,7 @@ struct ascii_driver char *command_name; char *title; char *subtitle; - char *file_name; /* Output file name. */ + struct file_handle *handle; FILE *file; /* Output file. */ bool error; /* Output error? */ int page_number; /* Current page number. */ @@ -233,7 +242,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -ascii_create (const char *file_name, enum settings_output_devices device_type, +ascii_create (struct file_handle *fh, enum settings_output_devices device_type, struct string_map *o) { enum { BOX_ASCII, BOX_UNICODE } box; @@ -244,7 +253,7 @@ ascii_create (const char *file_name, enum settings_output_devices device_type, a = xzalloc (sizeof *a); d = &a->driver; - output_driver_init (&a->driver, &ascii_driver_class, file_name, device_type); + output_driver_init (&a->driver, &ascii_driver_class, fh_get_file_name (fh), device_type); a->append = parse_boolean (opt (d, o, "append", "false")); a->headers = parse_boolean (opt (d, o, "headers", "false")); a->paginate = parse_boolean (opt (d, o, "paginate", "false")); @@ -255,7 +264,8 @@ ascii_create (const char *file_name, enum settings_output_devices device_type, "none", EMPH_NONE, NULL_SENTINEL); - a->chart_file_name = parse_chart_file_name (opt (d, o, "charts", file_name)); + a->chart_file_name = parse_chart_file_name (opt (d, o, "charts", fh_get_file_name (fh))); + a->handle = fh; a->top_margin = parse_int (opt (d, o, "top-margin", "0"), 0, INT_MAX); a->bottom_margin = parse_int (opt (d, o, "bottom-margin", "0"), 0, INT_MAX); @@ -283,7 +293,6 @@ ascii_create (const char *file_name, enum settings_output_devices device_type, a->command_name = NULL; a->title = xstrdup (""); a->subtitle = xstrdup (""); - a->file_name = xstrdup (file_name); a->file = NULL; a->error = false; a->page_number = 0; @@ -380,11 +389,11 @@ ascii_destroy (struct output_driver *driver) ascii_close_page (a); if (a->file != NULL) - fn_close (a->file_name, a->file); + fn_close (a->handle, a->file); + fh_unref (a->handle); free (a->command_name); free (a->title); free (a->subtitle); - free (a->file_name); free (a->chart_file_name); for (i = 0; i < a->allocated_lines; i++) u8_line_destroy (&a->lines[i]); @@ -400,8 +409,8 @@ ascii_flush (struct output_driver *driver) { ascii_close_page (a); - if (fn_close (a->file_name, a->file) != 0) - msg_error (errno, _("ascii: closing output file `%s'"), a->file_name); + if (fn_close (a->handle, a->file) != 0) + msg_error (errno, _("ascii: closing output file `%s'"), fh_get_file_name (a->handle)); a->file = NULL; } } @@ -1091,7 +1100,7 @@ ascii_open_page (struct ascii_driver *a) if (a->file == NULL) { - a->file = fn_open (a->file_name, a->append ? "a" : "w"); + a->file = fn_open (a->handle, a->append ? "a" : "w"); if (a->file != NULL) { if ( isatty (fileno (a->file))) @@ -1111,7 +1120,7 @@ ascii_open_page (struct ascii_driver *a) else { msg_error (errno, _("ascii: opening output file `%s'"), - a->file_name); + fh_get_file_name (a->handle)); a->error = true; return false; }