|
|
cc05f7 |
---
|
|
|
cc05f7 |
etc/a2ps_cfg.in | 3 ++
|
|
|
cc05f7 |
sheets/sheets.map | 3 ++
|
|
|
cc05f7 |
src/buffer.c | 29 +++++++++++++++++++++
|
|
|
cc05f7 |
src/generate.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
|
cc05f7 |
4 files changed, 108 insertions(+), 1 deletion(-)
|
|
|
cc05f7 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
--- etc/a2ps_cfg.in
|
|
|
cc05f7 |
+++ etc/a2ps_cfg.in 2023-03-10 13:06:52.122978624 +0000
|
|
|
cc05f7 |
@@ -199,6 +199,9 @@ $3p<-$3p> $4l# lines\n||
|
|
Bernhard M. Wiedemann |
7eefe3 |
# rm is done by a2ps itself. No need to quote.
|
|
Bernhard M. Wiedemann |
7eefe3 |
#
|
|
Bernhard M. Wiedemann |
7eefe3 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
+########## UTF-8 filter for patched a2ps only
|
|
Bernhard M. Wiedemann |
7eefe3 |
+Delegation: utf8 utf8:plain iconv -c -f UTF-8 -t $x
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
########## Compressed files
|
|
Bernhard M. Wiedemann |
7eefe3 |
# A compressed file should be decompressed and processed by a2ps
|
|
Bernhard M. Wiedemann |
7eefe3 |
# A consequence is that the decompressed file may be delegated.
|
|
Bernhard M. Wiedemann |
7eefe3 |
--- sheets/sheets.map
|
|
|
cc05f7 |
+++ sheets/sheets.map 2023-03-10 13:06:52.122978624 +0000
|
|
|
cc05f7 |
@@ -146,6 +146,9 @@ gmake: /GNUmakefile/ /*\/GNUmakefile/
|
|
Bernhard M. Wiedemann |
7eefe3 |
plain: /*.doc/
|
|
Bernhard M. Wiedemann |
7eefe3 |
/*.txt/
|
|
Bernhard M. Wiedemann |
7eefe3 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
+# UTF-8 type for patched a2ps only
|
|
Bernhard M. Wiedemann |
7eefe3 |
+utf8: <UTF-8 Unicode text*>
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
# Ada files
|
|
Bernhard M. Wiedemann |
7eefe3 |
ada: /*.ad[abs]/
|
|
Bernhard M. Wiedemann |
7eefe3 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
--- src/buffer.c
|
|
|
cc05f7 |
+++ src/buffer.c 2023-03-10 13:15:24.785647598 +0000
|
|
|
cc05f7 |
@@ -175,6 +175,35 @@ buffer_self_print (buffer_t * buffer, FI
|
|
|
cc05f7 |
fprintf (stream, "Content = `%s'\n", buffer->content);
|
|
|
cc05f7 |
}
|
|
|
cc05f7 |
|
|
|
cc05f7 |
+/*
|
|
|
cc05f7 |
+ * It frees the content, not the pointer
|
|
|
cc05f7 |
+ */
|
|
|
cc05f7 |
+void
|
|
|
cc05f7 |
+buffer_release (buffer_t * buffer)
|
|
|
cc05f7 |
+{
|
|
|
cc05f7 |
+ /* VALUE is malloc'd only if BUFFER->LOWER_CASE */
|
|
|
cc05f7 |
+ if (buffer->lower_case)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ free (buffer->value);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->value = NULL;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->allocsize = 0;
|
|
|
cc05f7 |
+ }
|
|
|
cc05f7 |
+
|
|
|
cc05f7 |
+ /* I don't know how this one should be used */
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (buffer->buf)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ free(buffer->buf);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->buf = NULL;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->bufsize = 0;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->bufoffset = 0;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (buffer->len == 0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer->content = obstack_finish(&buffer->obstack);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ obstack_free (&buffer->obstack, NULL);
|
|
|
cc05f7 |
+}
|
|
|
cc05f7 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
void
|
|
|
cc05f7 |
buffer_set_lower_case (buffer_t * buffer, bool sensitive)
|
|
|
cc05f7 |
{
|
|
Bernhard M. Wiedemann |
7eefe3 |
--- src/generate.c
|
|
|
cc05f7 |
+++ src/generate.c 2023-03-10 13:17:27.919406928 +0000
|
|
|
cc05f7 |
@@ -29,7 +29,7 @@ char *sample_tmpname = NULL;
|
|
Bernhard M. Wiedemann |
7eefe3 |
*/
|
|
Bernhard M. Wiedemann |
7eefe3 |
enum style_kind_e
|
|
Bernhard M. Wiedemann |
7eefe3 |
{
|
|
Bernhard M. Wiedemann |
7eefe3 |
- no_style, binary, sshparser, unprintable, delegate
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ no_style, binary, sshparser, unprintable, delegate, utf8
|
|
Bernhard M. Wiedemann |
7eefe3 |
};
|
|
Bernhard M. Wiedemann |
7eefe3 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
static enum style_kind_e
|
|
|
cc05f7 |
@@ -43,6 +43,8 @@ string_to_style_kind (const char * strin
|
|
Bernhard M. Wiedemann |
7eefe3 |
return no_style;
|
|
|
cc05f7 |
else if (STREQ (string, "delegate"))
|
|
Bernhard M. Wiedemann |
7eefe3 |
return delegate;
|
|
|
cc05f7 |
+ else if (STREQ (string, "utf8"))
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ return utf8;
|
|
Bernhard M. Wiedemann |
7eefe3 |
return sshparser;
|
|
Bernhard M. Wiedemann |
7eefe3 |
}
|
|
Bernhard M. Wiedemann |
7eefe3 |
/************************************************************************/
|
|
|
cc05f7 |
@@ -350,6 +352,76 @@ print (char * filename, int * native_job
|
|
Bernhard M. Wiedemann |
7eefe3 |
msg_file_pages_printed (job, _("plain"));
|
|
Bernhard M. Wiedemann |
7eefe3 |
(*native_jobs)++;
|
|
Bernhard M. Wiedemann |
7eefe3 |
break;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ case utf8:
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ char * argv[21], * ptr;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ int n, argc, pfd[2];
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ pid_t pid;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if ((contract = get_subcontract(file_job->type, "plain")) == (struct delegation*)0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ goto plain_print;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ argc = 1;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ argv[0] = ptr = contract->command;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ while ((ptr = (strchr(ptr, ' '))))
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ *ptr++ = '\0';
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (argc < 20)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ argv[argc++] = ptr;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ for (n = 0; n < argc; n++)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (strstr(argv[n], "$x"))
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ argv[n] = job->requested_encoding_name;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ argv[argc] = (char*)0;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (pipe(pfd) < 0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ message (msg_report2, (stderr, _("[%s (%s): failed. Ignored]\n"), file_job->name, buf));
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ break;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ switch ((pid = fork()))
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ case -1:
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(pfd[0]);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(pfd[1]);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ goto err;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ break;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ case 0:
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if ((n = fileno(input_buffer->stream)) == 0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ {
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ char * tmpfile = NULL;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ FILE * tmp;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ tempname_ensure(tmpfile);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ buffer_save(input_buffer, tmpfile);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ tmp = xrfopen(tmpfile);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ n = fileno(tmp);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ free(tmpfile);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(0);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (dup(n) < 0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ goto err;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(1);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ if (dup(pfd[1]) < 0)
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ goto err;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(n);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(pfd[0]);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(pfd[1]);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ execvp(argv[0], argv);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ err:
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ message (msg_report2, (stderr, _("[%s (%s): failed. Ignored]\n"), file_job->name, buf));
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ break;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ default:
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ close(pfd[1]);
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ input_buffer->bufoffset = input_buffer->bufsize;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ input_buffer->stream = fdopen(pfd[0], "r");
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ input_buffer->pipe_p = true;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ goto plain_print;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ break;
|
|
Bernhard M. Wiedemann |
7eefe3 |
+ }
|
|
Bernhard M. Wiedemann |
7eefe3 |
}
|
|
Bernhard M. Wiedemann |
7eefe3 |
|
|
Bernhard M. Wiedemann |
7eefe3 |
input_end (input_buffer);
|