Blame a2ps-4.13-utf8.patch

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);