Blame a2ps-4.13-utf8.patch

Bernhard M. Wiedemann 7eefe3
--- etc/a2ps_cfg.in
Bernhard M. Wiedemann 7eefe3
+++ etc/a2ps_cfg.in	2008-07-15 14:12:03.044199079 +0200
Bernhard M. Wiedemann 7eefe3
@@ -266,6 +266,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
Bernhard M. Wiedemann 7eefe3
+++ sheets/sheets.map	2008-07-15 17:24:53.922318567 +0200
Bernhard M. Wiedemann 7eefe3
@@ -144,6 +144,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
Bernhard M. Wiedemann 7eefe3
+++ src/buffer.c	2008-07-15 17:11:53.197276387 +0200
Bernhard M. Wiedemann 7eefe3
@@ -193,9 +193,24 @@ buffer_release (buffer_t * buffer)
Bernhard M. Wiedemann 7eefe3
 {
Bernhard M. Wiedemann 7eefe3
   /* VALUE is malloc'd only if BUFFER->LOWER_CASE */
Bernhard M. Wiedemann 7eefe3
   if (buffer->lower_case)
Bernhard M. Wiedemann 7eefe3
-    free (buffer->value);
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;
Bernhard M. Wiedemann 7eefe3
+    }    
Bernhard M. Wiedemann 7eefe3
   /* I don't know how this one should be used */
Bernhard M. Wiedemann 7eefe3
-  /*  obstack_free (&buffer->obstack, NULL); */
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);
Bernhard M. Wiedemann 7eefe3
 }
Bernhard M. Wiedemann 7eefe3
 
Bernhard M. Wiedemann 7eefe3
 void
Bernhard M. Wiedemann 7eefe3
--- src/generate.c
Bernhard M. Wiedemann 7eefe3
+++ src/generate.c	2008-07-15 17:12:02.778172717 +0200
Bernhard M. Wiedemann 7eefe3
@@ -35,7 +35,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
Bernhard M. Wiedemann 7eefe3
@@ -49,6 +49,8 @@ string_to_style_kind (const char * strin
Bernhard M. Wiedemann 7eefe3
     return no_style;
Bernhard M. Wiedemann 7eefe3
   else if (strequ (string, "delegate"))
Bernhard M. Wiedemann 7eefe3
     return delegate;
Bernhard M. Wiedemann 7eefe3
+  else if (strequ (string, "utf8"))
Bernhard M. Wiedemann 7eefe3
+    return utf8;
Bernhard M. Wiedemann 7eefe3
   return sshparser;
Bernhard M. Wiedemann 7eefe3
 }
Bernhard M. Wiedemann 7eefe3
 /************************************************************************/
Bernhard M. Wiedemann 7eefe3
@@ -360,6 +362,76 @@ print (uchar * filename, int * native_jo
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);