22834809 a2ps should be 64-bit
authorRich Burridge <rich.burridge@oracle.com>
Tue, 13 Sep 2016 14:01:54 -0700
changeset 6897 95d141a9085b
parent 6896 142170914c4c
child 6898 9485a934366d
22834809 a2ps should be 64-bit 24660351 a2ps should have some master test results 24660634 a2ps is missing many patches created by the Debian/Ubuntu community 24660835 problem in UTILITY/A2PS
components/a2ps/Makefile
components/a2ps/a2ps.p5m
components/a2ps/patches/01_a2ps_el_path_fix.patch
components/a2ps/patches/02_composite_fonts.patch
components/a2ps/patches/03_koi8_fonts_debian.patch
components/a2ps/patches/05_no_acroread_for_pdf.patch
components/a2ps/patches/07_a2ps_info.patch
components/a2ps/patches/08_man.patch
components/a2ps/patches/09_CVE-2001-1593.patch
components/a2ps/patches/10_CVE-2014-0466.patch
components/a2ps/patches/11_fix-bad-free.patch
components/a2ps/patches/12_fix-format-security.patch
components/a2ps/patches/14_sheets.map.patch
components/a2ps/patches/22564022.patch
components/a2ps/patches/sheets.map.patch
components/a2ps/test/results-64.master
--- a/components/a2ps/Makefile	Tue Sep 13 13:02:35 2016 -0700
+++ b/components/a2ps/Makefile	Tue Sep 13 14:01:54 2016 -0700
@@ -22,7 +22,8 @@
 #
 # Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
 #
-BUILD_BITS= 32
+COMPILER= gcc
+BUILD_BITS= 64
 include ../../make-rules/shared-macros.mk
 
 COMPONENT_NAME=		a2ps
@@ -37,6 +38,10 @@
 # don't use LD_Z_IGNORE: causes linker problems
 LD_Z_IGNORE=
 
+# Needed to get the tests to work.
+COMPONENT_PRE_CONFIGURE_ACTION = \
+	($(CLONEY) $(SOURCE_DIR) $(@D))
+
 CONFIGURE_OPTIONS  +=		--enable-shared
 CONFIGURE_OPTIONS  +=		--disable-static
 CONFIGURE_OPTIONS  +=		--sysconfdir=$(ETCDIR)/gnu
@@ -46,14 +51,12 @@
 # because viewpathing isn't quite right in this version of a2ps
 COMPONENT_PREP_ACTION = \
 	(cd $(@D) ; ln -s $(SOURCE_DIR)/auxdir/mkinstalldirs)
-COMPONENT_POST_CONFIGURE_ACTION = \
-	(cd $(@D)/doc ; \
-	 ln -s $(SOURCE_DIR)/doc/make-authors.pl ; \
-	 ln -s $(SOURCE_DIR)/doc/translators.txt) ; \
-	(cd $(@D)/sheets ; \
-	 for sheet in $(SOURCE_DIR)/sheets/*.ssh ; do \
-	     ln -s $$sheet ; \
-	 done)
+
+COMPONENT_TEST_DIR =	$(@D)/tests
+COMPONENT_TEST_TRANSFORMS += \
+	'-e "s|^make.*: Leaving directory.*$$|XXX_REMOVE_XXX|g" ' \
+	'-e "s|^make.*: Entering directory.*$$|XXX_REMOVE_XXX|g" ' \
+	'-e "/^XXX_REMOVE_XXX$$/d" '
 
 # Adjust '#!/usr/bin/perl'
 PERL_SCRIPTS = \
--- a/components/a2ps/a2ps.p5m	Tue Sep 13 13:02:35 2016 -0700
+++ b/components/a2ps/a2ps.p5m	Tue Sep 13 14:01:54 2016 -0700
@@ -18,7 +18,7 @@
 #
 # CDDL HEADER END
 #
-# Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
 #
 
 <transform file path=usr.*/man/.+ -> default mangler.man.stability volatile>
@@ -50,9 +50,9 @@
 file path=usr/bin/psset
 file path=usr/bin/texi2dvi4a2ps
 file path=usr/include/liba2ps.h
-link path=usr/lib/liba2ps.so target=liba2ps.so.1.0.0
-link path=usr/lib/liba2ps.so.1 target=liba2ps.so.1.0.0
-file path=usr/lib/liba2ps.so.1.0.0
+link path=usr/lib/$(MACH64)/liba2ps.so target=liba2ps.so.1.0.0
+link path=usr/lib/$(MACH64)/liba2ps.so.1 target=liba2ps.so.1.0.0
+file path=usr/lib/$(MACH64)/liba2ps.so.1.0.0
 link path=usr/sfw/bin/a2ps target=../../bin/a2ps
 link path=usr/sfw/bin/card target=../../bin/card
 link path=usr/sfw/bin/composeglyphs target=../../bin/composeglyphs
@@ -66,6 +66,10 @@
 file path=usr/share/a2ps/README
 file path=usr/share/a2ps/afm/fonts.map
 file path=usr/share/a2ps/afm/make_fonts_map.sh mode=0555
+file path=usr/share/a2ps/afm/pagb.afm
+file path=usr/share/a2ps/afm/pagbo.afm
+file path=usr/share/a2ps/afm/pagd.afm
+file path=usr/share/a2ps/afm/pagdo.afm
 file path=usr/share/a2ps/afm/pbkd.afm
 file path=usr/share/a2ps/afm/pbkdi.afm
 file path=usr/share/a2ps/afm/pbkl.afm
@@ -100,6 +104,7 @@
 file path=usr/share/a2ps/afm/pzdr.afm
 file path=usr/share/a2ps/encoding/ascii.edf
 file path=usr/share/a2ps/encoding/encoding.map
+file path=usr/share/a2ps/encoding/euc-jp.edf
 file path=usr/share/a2ps/encoding/hp.edf
 file path=usr/share/a2ps/encoding/ibm-cp437.edf
 file path=usr/share/a2ps/encoding/ibm-cp850.edf
@@ -116,6 +121,7 @@
 file path=usr/share/a2ps/encoding/koi8.edf
 file path=usr/share/a2ps/encoding/mac.edf
 file path=usr/share/a2ps/encoding/ms-cp1250.edf
+file path=usr/share/a2ps/encoding/ms-cp1251.edf
 file path=usr/share/a2ps/fonts/pcfont.pfa
 file path=usr/share/a2ps/ppd/README
 file path=usr/share/a2ps/ppd/level1.ppd
@@ -127,6 +133,7 @@
 file path=usr/share/a2ps/ps/color.hdr
 file path=usr/share/a2ps/ps/color.pro
 file path=usr/share/a2ps/ps/diff.pro
+file path=usr/share/a2ps/ps/diffcolor.pro
 file path=usr/share/a2ps/ps/ehandler.ps
 file path=usr/share/a2ps/ps/fixed.pro
 file path=usr/share/a2ps/ps/gray.pro
@@ -151,6 +158,7 @@
 file path=usr/share/a2ps/sheets/coqv.ssh
 file path=usr/share/a2ps/sheets/cpp.ssh
 file path=usr/share/a2ps/sheets/csh.ssh
+file path=usr/share/a2ps/sheets/csharp.ssh
 file path=usr/share/a2ps/sheets/cxx.ssh
 file path=usr/share/a2ps/sheets/dc_shell.ssh
 file path=usr/share/a2ps/sheets/eiffel.ssh
@@ -180,11 +188,13 @@
 file path=usr/share/a2ps/sheets/mail.ssh
 file path=usr/share/a2ps/sheets/make.ssh
 file path=usr/share/a2ps/sheets/maple.ssh
+file path=usr/share/a2ps/sheets/matlab.ssh
 file path=usr/share/a2ps/sheets/matlab4.ssh
 file path=usr/share/a2ps/sheets/mib.ssh
 file path=usr/share/a2ps/sheets/mly.ssh
 file path=usr/share/a2ps/sheets/modula2.ssh
 file path=usr/share/a2ps/sheets/modula3.ssh
+file path=usr/share/a2ps/sheets/nasm.ssh
 file path=usr/share/a2ps/sheets/o2c.ssh
 file path=usr/share/a2ps/sheets/oberon.ssh
 file path=usr/share/a2ps/sheets/objc.ssh
@@ -193,6 +203,8 @@
 file path=usr/share/a2ps/sheets/oracle.ssh
 file path=usr/share/a2ps/sheets/pascal.ssh
 file path=usr/share/a2ps/sheets/perl.ssh
+file path=usr/share/a2ps/sheets/php.ssh
+file path=usr/share/a2ps/sheets/pic16f84.ssh
 file path=usr/share/a2ps/sheets/plsql.ssh
 file path=usr/share/a2ps/sheets/pov.ssh
 file path=usr/share/a2ps/sheets/ppd.ssh
@@ -202,7 +214,10 @@
 file path=usr/share/a2ps/sheets/promela.ssh
 file path=usr/share/a2ps/sheets/ps.ssh
 file path=usr/share/a2ps/sheets/python.ssh
+file path=usr/share/a2ps/sheets/rd.ssh
 file path=usr/share/a2ps/sheets/rexx.ssh
+file path=usr/share/a2ps/sheets/ruby.ssh
+file path=usr/share/a2ps/sheets/s.ssh
 file path=usr/share/a2ps/sheets/sather.ssh
 file path=usr/share/a2ps/sheets/scheme.ssh
 file path=usr/share/a2ps/sheets/sdl88.ssh
@@ -210,10 +225,14 @@
 file path=usr/share/a2ps/sheets/sh.ssh
 file path=usr/share/a2ps/sheets/sheets.map
 file path=usr/share/a2ps/sheets/shell.ssh
+file path=usr/share/a2ps/sheets/small.ssh
 file path=usr/share/a2ps/sheets/sml.ssh
+file path=usr/share/a2ps/sheets/specc.ssh
 file path=usr/share/a2ps/sheets/sql.ssh
 file path=usr/share/a2ps/sheets/sql92.ssh
 file path=usr/share/a2ps/sheets/ssh.ssh
+file path=usr/share/a2ps/sheets/st.ssh
+file path=usr/share/a2ps/sheets/stratego.ssh
 file path=usr/share/a2ps/sheets/symbols.ssh
 file path=usr/share/a2ps/sheets/tcl.ssh
 file path=usr/share/a2ps/sheets/tclx.ssh
@@ -248,6 +267,7 @@
 file path=usr/share/locale/es/LC_MESSAGES/a2ps.mo
 file path=usr/share/locale/fr/LC_MESSAGES/a2ps.mo
 file path=usr/share/locale/it/LC_MESSAGES/a2ps.mo
+file path=usr/share/locale/ja/LC_MESSAGES/a2ps.mo
 file path=usr/share/locale/ko/LC_MESSAGES/a2ps.mo
 file path=usr/share/locale/nl/LC_MESSAGES/a2ps.mo
 file path=usr/share/locale/no/LC_MESSAGES/a2ps.mo
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/01_a2ps_el_path_fix.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,19 @@
+Fixes path to a2ps binary in a2ps.el
+
+See: https://patches.ubuntu.com/by-release/extracted/ubuntu/a/a2ps/1:4.13c~rc5-1/01_a2ps_el_path_fix.dpatch
+
+## 01_a2ps_el_path_fix.dpatch by Masayuki Hatta <[email protected]>
+
+Index: b/contrib/emacs/a2ps.el
+===================================================================
+--- a/contrib/emacs/a2ps.el
++++ b/contrib/emacs/a2ps.el
+@@ -44,7 +44,7 @@
+ ;; a2ps-compile-regexp
+ 
+ ;;path to the a2ps program
+-(defvar a2ps-program "/usr/local/bin/a2ps")
++(defvar a2ps-program "/usr/bin/a2ps")
+ 
+ ;;thank god for make-regexp.el!
+ (defvar a2ps-font-lock-keywords
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/02_composite_fonts.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,856 @@
+Composite fonts support, needed for handling Japanese EUC-JP encoding
+Roughly based on Yasuyuki Furukawa's patch
+
+See: https://patches.ubuntu.com/by-release/extracted/ubuntu/a/a2ps/1:4.13c~rc5-1/02_composite_fonts.dpatch
+
+## 02_composite_fonts.dpatch by Masayuki Hatta <[email protected]>
+
+Index: b/encoding/Makefile.am
+===================================================================
+--- a/encoding/Makefile.am
++++ b/encoding/Makefile.am
+@@ -16,7 +16,7 @@
+ minor_encodings = \
+ ms-cp1250.edf hp.edf mac.edf ibm-cp437.edf ibm-cp850.edf iso2.edf	\
+ iso3.edf iso4.edf iso5.edf iso7.edf iso9.edf iso10.edf iso13.edf	\
+-iso15.edf koi8.edf ms-cp1251.edf
++iso15.edf koi8.edf ms-cp1251.edf euc-jp.edf
+ 
+ if EXTENSIONS
+ encodings_DATA = encoding.map $(major_encodings) $(minor_encodings)
+Index: b/encoding/Makefile.in
+===================================================================
+--- a/encoding/Makefile.in
++++ b/encoding/Makefile.in
+@@ -270,7 +270,7 @@
+ minor_encodings = \
+ ms-cp1250.edf hp.edf mac.edf ibm-cp437.edf ibm-cp850.edf iso2.edf	\
+ iso3.edf iso4.edf iso5.edf iso7.edf iso9.edf iso10.edf iso13.edf	\
+-iso15.edf koi8.edf ms-cp1251.edf
++iso15.edf koi8.edf ms-cp1251.edf euc-jp.edf
+ 
+ @EXTENSIONS_FALSE@encodings_DATA = encoding.map $(major_encodings)
+ @EXTENSIONS_TRUE@encodings_DATA = encoding.map $(major_encodings) $(minor_encodings)
+Index: b/encoding/encoding.map
+===================================================================
+--- a/encoding/encoding.map
++++ b/encoding/encoding.map
+@@ -93,6 +93,12 @@
+ koi8			koi8
+ koi			koi8
+ 
++euc-jp			euc-jp
++eucjp			euc-jp
++japanese		euc-jp
++ja			euc-jp
++jp			euc-jp
++
+ ########################################################################
+ # Some architectures specific char sets
+ ########################################################################
+Index: b/encoding/euc-jp.edf
+===================================================================
+--- /dev/null
++++ b/encoding/euc-jp.edf
+@@ -0,0 +1,95 @@
++# Description of the EUC-JP encoding
++# Copyright (c) 1988, 89, 90, 91, 92, 93 Miguel Santana
++# Copyright (c) 1995, 96, 97, 98 Akim Demaille, Miguel Santana
++# Copyright (c) 2003 Masayuki Hatta
++#
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2, or (at your option)
++# any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; see the file COPYING.  If not, write to
++# the Free Software Foundation, 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++#
++
++Name: EUC-JP
++
++Documentation
++The EUC-JP encoding is a 8-bit character set widely used in Japan.
++EndDocumentation
++
++# If there is an unknown font requested, use Courier
++Default: Courier
++
++# Automatic spell checking :)
++Substitute: 	Times			Times-Roman
++Substitute: 	Helvetica-Italic	Helvetica-Oblique
++Substitute: 	Helvetica-BoldItalic	Helvetica-BoldOblique
++
++
++# SlantFont for Japanese Italic Kanji font
++#		new font			source font		value
++SlantFont:	Ryumin-Light-EUC-H-Italic	Ryumin-Light-EUC-H	0.2
++SlantFont:	GothicBBB-Medium-EUC-H-Italic	GothicBBB-Medium-EUC-H	0.2
++
++# Compose fonts for Japanese EUC code
++#		target font		additional font			width	size rate
++DefaultComposite:			Ryumin-Light-EUC-H		1.0	1.1
++
++# 1:2 fixed
++#DefaultComposite:			Ryumin-Light-EUC-H		1.0	0.8333
++
++# 1:1 fixed
++#DefaultComposite:			Ryumin-Light-EUC-H		1.0	1.6666
++
++Composite:	Helvetica		GothicBBB-Medium-EUC-H		1.0	1.1
++Composite:	Helvetica-Oblique	GothicBBB-Medium-EUC-H-Italic	1.0 	1.1
++Composite:	Helvetica-Bold		GothicBBB-Medium-EUC-H  	1.0 	1.1
++Composite:	Helvetica-BoldOblique	GothicBBB-Medium-EUC-H-Italic	1.0	1.1
++
++Composite:	Courier-Oblique		Ryumin-Light-EUC-H-Italic	1.0	1.1
++Composite:	Courier-Bold		GothicBBB-Medium-EUC-H		1.0	1.1
++Composite:	Courier-BoldOblique	GothicBBB-Medium-EUC-H-Italic	1.0	1.1
++Composite:	Times-Bold		GothicBBB-Medium-EUC-H		1.0	1.1
++
++Vector:
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++space exclam quotedbl numbersign dollar percent ampersand quoteright
++parenleft parenright asterisk plus comma minus period slash
++zero one two three four five six seven
++eight nine colon semicolon less equal greater question
++at A B C D E F G
++H I J K L M N O
++P Q R S T U V W
++X Y Z bracketleft backslash bracketright asciicircum underscore
++quoteleft a b c d e f g
++h i j k l m n o
++p q r s t u v w
++x y z braceleft bar braceright asciitilde .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
++space exclamdown cent sterling currency yen brokenbar section
++dieresis copyright ordfeminine guillemotleft logicalnot hyphen registered macron
++degree plusminus twosuperior threesuperior acute mu paragraph bullet
++cedilla onesuperior ordmasculine guillemotright onequarter onehalf threequarters questiondown
++Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla
++Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis
++Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis multiply
++Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls
++agrave aacute acircumflex atilde adieresis aring ae ccedilla
++egrave eacute ecircumflex edieresis igrave iacute icircumflex idieresis
++eth ntilde ograve oacute ocircumflex otilde odieresis divide
++oslash ugrave uacute ucircumflex udieresis yacute thorn ydieresis
+Index: b/lib/encoding.c
+===================================================================
+--- a/lib/encoding.c
++++ b/lib/encoding.c
+@@ -389,15 +389,25 @@
+  * Association of suffixes rules, and corresponding style sheet
+  * (The hashing is upon `alias')
+  */
++struct slantfont_info {
++  char * name;
++  char * src;
++  float ratio;
++};
++
+ struct encoding {
+   char * key;			/* e.g. latin1			*/
+   char * name;			/* e.g. ISO Latin 1		*/
++  int    composite_flag;		/* flag for composite font	*/
+   uchar * documentation;		/* Useful pieces of text	*/
+ 
+   char * default_font;		/* When a font can't be used
+ 				   define the font to use	*/
+   struct pair_htable * substitutes;	/* e.g. in latin2, don't use
+ 					 * Courier, but Courier-Ogonki	*/
++  struct pair_htable * composite;
++
++  struct slantfont_info     slantfont[NB_FACES];
+ 
+   char * vector[256];	/* Define the char set			*/
+   struct darray * font_names_used;
+@@ -407,6 +417,9 @@
+   struct hash_table_s * fonts;	/* Contains cells that are
+ 				 * 1. name of font, 2. int wx[256] 	*/
+   unsigned int * faces_wx[NB_FACES];
++
++  unsigned int   composite_wx[NB_FACES];     /* fixed length font width */
++  float          composite_ratio[NB_FACES];  /* size ratio of additonal and original font */
+ };
+ 
+ /*
+@@ -423,9 +436,12 @@
+   res->name = NULL;
+   res->default_font = NULL;
+   res->documentation = NULL;
++  res->composite_flag = false;
+ 
+   /* Vector will be set by setup */
+   res->substitutes = pair_table_new ();
++  res->composite = pair_table_new ();
++  res->slantfont[0].name = NULL;
+   res->font_names_used = da_new ("List of font names", 10,
+ 				 da_linear, 10,
+ 				 (da_print_func_t) da_str_print,
+@@ -471,6 +487,34 @@
+ }
+ 
+ /*
++ * Add a composite font in the current encoding
++ */
++static void
++encoding_add_composite_font (struct encoding * encoding,
++			      const char * orig, const char * subs,
++			      int wx, float ratio)
++{
++  encoding->composite_flag = true;
++  pair_add2 (encoding->composite, orig, subs, wx, ratio);
++}
++
++/*
++ * Add a composite font in the current encoding
++ */
++static void
++encoding_add_slant_font (struct encoding * encoding,
++			 const char * new, const char * src,
++			 float ratio)
++{
++  static num =  0;
++  encoding->slantfont[num].name = strdup(new);
++  encoding->slantfont[num].src  = strdup(src);
++  encoding->slantfont[num].ratio = ratio;
++  encoding->slantfont[num+1].name = NULL;
++  num++;
++}
++
++/*
+  * When FONT_NAME is used with ENCODING, return the
+  * real font name to use (e.g., in latin2, Courier-Ogonki
+  * should be returned when asked for Courier).
+@@ -514,6 +558,77 @@
+     }
+ 
+   message (msg_enc,
++	   (stderr, "In encoding %s, composite font for %s is resolved as %s\n",
++	    encoding->key, font_name, res));
++  return res;
++}
++
++/*
++ * Get composite font size and ratio
++ */
++static int
++composite_font_info_get_wx(struct a2ps_job * job,
++			   struct encoding * encoding,
++			   const char * font_list)
++{
++  int wx= -1;
++  char * font_list_copy;
++  char * font_name;
++  astrcpy (font_list_copy, font_list);
++  font_name = strtok (font_list_copy, ",<>;");
++
++  wx = pair_get_wx (encoding->composite, font_name);
++  if (wx<0)
++      wx = pair_get_wx (encoding->composite, "default_composite__");
++
++  return wx;
++}
++
++static float
++composite_font_info_get_ratio(struct a2ps_job * job,
++			      struct encoding * encoding,
++			      const char * font_list)
++{
++  float ratio= -1;
++  char * font_list_copy;
++  char * font_name;
++
++  astrcpy (font_list_copy, font_list);
++  font_name = strtok (font_list_copy, ",<>;");
++
++  ratio = pair_get_ratio (encoding->composite, font_name);
++  if (ratio<0)
++      ratio = pair_get_ratio (encoding->composite, "default_composite__");
++  return ratio;
++}
++
++const char *
++encoding_resolve_composite_font (struct a2ps_job * job,
++				  struct encoding * encoding,
++				  const char * font_list)
++{
++  const char * res = NULL;
++  char * font_list_copy;
++  char * font_name;
++
++  astrcpy (font_list_copy, font_list);
++  font_name = strtok (font_list_copy, ",<>;");
++
++  /* Find if there is a substitute for that font */
++  res = pair_get (encoding->composite, font_name);
++
++  /* We've found nothing interesting.  Last chance is the default
++   * font */
++  if (!res)
++    {
++      res = pair_get (encoding->composite, "default_composite__");
++
++      if (!res)
++	error (1, 0, "Cannot find font %s, nor any composite font",
++	       font_name);
++    }
++  
++  message (msg_enc,
+ 	   (stderr, "In encoding %s, font %s is resolved as %s\n",
+ 	    encoding->key, font_name, res));
+   return res;
+@@ -633,6 +748,66 @@
+ 	  subs = token2;
+ 	  encoding_add_font_substitute (encoding, orig, subs);
+ 	}
++      else if (strequ (token, "DefaultComposite:"))
++	{
++	  char * orig, * subs;
++	  int wx;
++	  float ratio;
++
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  subs = token2;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  wx = (int)atof(token2)*1000;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  ratio = atof(token2);
++	  encoding_add_composite_font(encoding, "default_composite__",
++				      subs, wx, ratio);
++	}
++      else if (strequ (token, "Composite:"))
++	{
++	  char * orig, * subs;
++	  int wx;
++	  float ratio;
++
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  orig = token2;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  subs = token2;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  wx = (int)atof(token2)*1000;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  ratio = atof(token2);
++	  encoding_add_composite_font(encoding, orig, subs, wx, ratio);
++	}
++      else if (strequ (token, "SlantFont:"))
++	{
++	  char * new, * src;
++	  float ratio;
++	  unsigned int num;
++
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  new = token2;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  src = token2;
++	  token2 = GET_TOKEN (NULL);
++	  CHECK_TOKEN ();
++	  ratio = atof(token2);
++	  for (num = 0 ; encoding->slantfont[num].name ; num ++ );
++	  if (num > sizeof encoding->slantfont - 1){
++	      error_at_line (1, 0, fname, firstline,
++			   _("too many slant font: `%s'"), new);
++	  }
++	  encoding_add_slant_font(encoding, new, src, ratio);
++	}
+       else
+         error_at_line (1, 0, fname, firstline,
+                        _("invalid option `%s'"), quotearg (token));
+@@ -754,6 +929,15 @@
+ }
+ 
+ /*
++ * Return the flag of composite flag
++ */
++int
++encoding_get_composite_flag (struct encoding * enc)
++{
++  return enc->composite_flag;
++}
++
++/*
+  * Prepare the environment (a dictionary) for the support
+  * of ENCODING, dump it into STREAM.
+  *
+@@ -766,9 +950,11 @@
+ 		     struct encoding * encoding)
+ {
+   size_t i, nb;
++  size_t ns;
+   const char * real_font_name;		/* After subsitution	*/
+   char ** font_names = (char **) encoding->font_names_used->content;
+ 
++
+   /* How many fonts are there? */
+   da_qsort (encoding->font_names_used);
+   da_unique (encoding->font_names_used, (da_map_func_t) free);
+@@ -787,15 +973,46 @@
+    * in the current ENCODING	*/
+   nb = encoding->font_names_used->len;
+ 
++  /* The number of slant fonts */
++  for (i= 0, ns=0 ; encoding->slantfont[i].name ; i++ )
++      ns++;
++
+   /* Create the dictionary and fill it */
+   fprintf (stream, "%% Dictionary for %s support\n",
+ 	  encoding->name);
+-  fprintf (stream, "/%sdict %d dict begin\n", encoding->key, nb);
++  fprintf (stream, "/%sdict %d dict begin\n", encoding->key,
++	   (encoding->composite_flag == true)? nb+nb+ns:nb+ns);
+   for (i = 0 ; i < nb ; i++)
+     fprintf (stream, "  /f%s %sEncoding /%s reencode_font\n",
+ 	     font_names [i],
+ 	     encoding->name,
+ 	     encoding_resolve_font_substitute (job, encoding, font_names [i]));
++
++  /* Slant font setting */
++  for (i = 0 ; encoding->slantfont[i].name ; i++ )
++    fprintf (stream, "  /%s /%s %f slantfont  definefont pop\n",
++	     encoding->slantfont[i].name,
++	     encoding->slantfont[i].src,
++	     encoding->slantfont[i].ratio);
++
++  /*
++   * Composite font setting.
++   * If kanji font size is larger than alphabet character, 
++   * set base font size to kanji charactor size.
++   */
++  if (encoding->composite_flag == true) {
++    for (i = 0 ; i < nb ; i++)
++      fprintf (stream, "  /f%s /f%s /%s %f %f false  compositefont "
++	               "%f scalefont def\n",
++	       font_names [i],
++	       font_names [i],
++	       encoding_resolve_composite_font (job, encoding, font_names [i]),
++	       encoding->composite_ratio[i],
++	       (encoding->composite_ratio[i] > 1.0)?
++	       0: (1-encoding->composite_ratio[i])/2.0,
++	       (encoding->composite_ratio[i] > 1.0)?
++	       1.0/encoding->composite_ratio[i]: 1.0 );
++  }
+   fputs ("currentdict end def\n", stream);
+ }
+ 
+@@ -939,6 +1156,22 @@
+ 				   true_font_name,
+ 				   encoding->vector,
+ 				   encoding->faces_wx [face]);
++
++      if (encoding->composite_flag)
++	{
++	  encoding->composite_ratio[i] =
++	    composite_font_info_get_ratio(job, encoding, 
++					  job->face_eo_font [face]);
++
++	  encoding->composite_wx[i] =
++	    composite_font_info_get_wx(job, encoding, 
++				       job->face_eo_font [face]);
++
++	  /* If kanji font size is larger than alphabet character, 
++	     fit kanji charactor size to base font size */
++	  if (encoding->composite_ratio[i] < 1.0)
++	      encoding->composite_wx[i] *= encoding->composite_ratio[i]; 
++	}
+     }
+ }
+ 
+@@ -1073,6 +1306,13 @@
+   return 0;	/* For -Wall */
+ }
+ 
++unsigned int
++char_composite_WX (a2ps_job * job, uchar c)
++{
++  return (job->encoding->composite_wx[job->status->face]/
++	  job->encoding->composite_ratio[job->status->face]);
++}
++
+ /*
+  *	Returns the WX of a string (including M- and ^)
+  */
+Index: b/lib/encoding.h
+===================================================================
+--- a/lib/encoding.h
++++ b/lib/encoding.h
+@@ -43,6 +43,7 @@
+  */
+ unsigned int char_WX PARAMS ((struct a2ps_job * job, uchar c));
+ unsigned int string_WX PARAMS ((struct a2ps_job * job, uchar * string));
++unsigned int char_composite_WX PARAMS ((struct a2ps_job * job, uchar c));
+ 
+ 
+ /************************************************************************/
+@@ -56,6 +57,7 @@
+ 					FILE * stream));
+ int encoding_char_exists PARAMS ((struct encoding * enc,
+ 					enum face_e face, uchar c));
++int encoding_get_composite_flag (struct encoding * enc);
+ struct encoding *
+ get_encoding_by_alias PARAMS ((struct a2ps_job * job, 
+ 			       char *string));
+@@ -70,6 +72,12 @@
+ 	PARAMS ((struct a2ps_job * job,
+ 		 struct encoding * encoding,
+ 		 const char * font_name));
++
++
++const char * encoding_resolve_composite_font
++	PARAMS ((struct a2ps_job * job,
++		 struct encoding * encoding,
++		 const char * font_name));
+ 
+ /*
+  * Have a struct encoding determine the faces_wx
+Index: b/lib/pair_ht.c
+===================================================================
+--- a/lib/pair_ht.c
++++ b/lib/pair_ht.c
+@@ -49,6 +49,8 @@
+ {
+   char * key;
+   char * value;
++  float  ratio;
++  int    wx;
+ };
+ 
+ /*
+@@ -165,6 +167,37 @@
+ }
+ 
+ /*
++ *  Add a pair, with your own allocation for them.
++ * It KEY is yet used, override its value with VALUE
++ */
++void
++pair_add2 (struct hash_table_s * table,
++	  const char * key, const char * value, int wx, float ratio)
++{
++  struct pair * item, token;
++  
++  token.key = (char *) key;
++  item = (struct pair *) hash_find_item (table, &token);
++
++  if (item) {
++    if (item->value)
++      free (item->value);
++  } else {
++    item = XMALLOC (struct pair, 1);
++    item->key = xstrdup(key);
++    item->wx    = wx;
++    item->ratio = ratio;
++  }
++  
++  if (value)
++    item->value = xstrdup (value);
++  else
++    item->value = NULL;
++
++  hash_insert (table, item);
++}
++
++/*
+  * Remove a pair and free it.
+  * It KEY is yet used, override its value with VALUE
+  */
+@@ -201,6 +234,34 @@
+     return NULL;
+ }
+ 
++int
++pair_get_wx (struct hash_table_s * table, const char * key)
++{
++  struct pair * item, token;
++  
++  token.key = (char *) key;
++  item = (struct pair *) hash_find_item (table, &token);
++
++  if (item)
++    return item->wx;
++  else
++    return -1;
++}
++
++float
++pair_get_ratio (struct hash_table_s * table, const char * key)
++{
++  struct pair * item, token;
++  
++  token.key = (char *) key;
++  item = (struct pair *) hash_find_item (table, &token);
++
++  if (item)
++    return item->ratio;
++  else
++    return -1;
++}
++
+ /*
+  * Return the content of the hash table, ordered
+  */
+Index: b/lib/pair_ht.h
+===================================================================
+--- a/lib/pair_ht.h
++++ b/lib/pair_ht.h
+@@ -56,6 +56,10 @@
+ void pair_add PARAMS ((struct pair_htable * table, 
+ 		       const char * key, const char * value));
+ 
++void pair_add2 PARAMS ((struct pair_htable * table, 
++		       const char * key, const char * value,
++			int wx, float ratio));
++
+ /*
+  * The key and value of the matching item  will be free'd
+  * (No problem if KEY matches nothing)
+@@ -68,6 +72,10 @@
+  */
+ char * pair_get PARAMS ((struct pair_htable * table,
+ 			 const char * key));
++int    pair_get_wx PARAMS ((struct pair_htable * table,
++			    const char * key));
++float  pair_get_ratio PARAMS ((struct pair_htable * table,
++			       const char * key));
+ 
+ void pair_table_list_short PARAMS ((struct pair_htable * table,
+ 				    FILE * stream));
+Index: b/lib/psgen.c
+===================================================================
+--- a/lib/psgen.c
++++ b/lib/psgen.c
+@@ -875,6 +875,7 @@
+   print:
+   default:
+     {
++      static mb_flag= 0;
+       uchar buf[256];
+       int nchars;
+       *buf = '\0';
+@@ -889,6 +890,29 @@
+     job->status->face_declared = false;
+   }
+ 
++  if (c > 127 && encoding_get_composite_flag (job->encoding) &&
++      job->status->face != Symbol) {
++    if (mb_flag) {
++        nchars = ps_escape_char (job, mb_flag, buf) + 
++	         ps_escape_char (job, c, buf);
++	job->status->wx += char_composite_WX(job, c);
++	job->status->column += nchars;
++	if (line_full) {
++	    if (job->folding) {
++	        fold_line (job, new_face);
++		job->status->column = nchars*2;
++		job->status->wx = char_composite_WX(job, c);
++	    } else {
++	      job->status->is_in_cut = true;
++	      return;
++	    }
++	}
++	mb_flag = 0;
++    } else {
++        mb_flag = c;
++	return;
++    }
++  } else {
+       nchars = ps_escape_char (job, c, buf);
+       job->status->wx += char_WX (job, c);
+       job->status->column += nchars;
+@@ -902,8 +926,9 @@
+ 	  return;
+ 	}
+       }
++  }
+       output (jdiv, "%s", buf);
+-      job->status->chars++;
++      job->status->chars+=nchars;
+     }
+     break;
+   }
+Index: b/ps/base.ps
+===================================================================
+--- a/ps/base.ps
++++ b/ps/base.ps
+@@ -153,7 +153,11 @@
+ % Return the y size of the current font
+ % - => fontsize
+ /currentfontsize {
+-  currentfont /FontMatrix get 3 get 1000 mul
++  currentfont /FontType get 0 eq {
++    currentfont /FontMatrix get 3 get
++  }{
++    currentfont /FontMatrix get 3 get 1000 mul
++  } ifelse
+ } bind def
+ 
+ % reencode the font
+@@ -200,6 +204,144 @@
+   end 
+ } bind def
+ 
++% composite fonts for ASCII-EUC mixed strings
++% Version 1.2 1/31/1990
++% Original Ken'ichi HANDA ([email protected])
++% Modified Norio Katayama ([email protected]),1998
++% Extend & Fix Koji Nakamaru ([email protected]), 1999
++% Anyone can freely copy, modify, distribute this program.
++
++/copyfont {	% font-dic extra-entry-count  copyfont  font-dic
++	1 index maxlength add dict begin
++	{	1 index /FID ne 2 index /UniqueID ne and
++		{def} {pop pop} ifelse
++	} forall
++	currentdict
++	end
++} bind def
++
++/compositefont { % ASCIIFontName EUCFontName RomanScale RomanOffset Rot(T/F) compositefont font
++    /RomanRotation exch def
++    /RomanOffset exch def
++    /RomanScale exch def
++    userdict /fixeucfont_dict known not {
++	userdict begin
++	    /fixeucfont_dict 2 dict begin
++		/UpperByteEncoding [
++		    16#00 1 16#20 { pop 0 } for
++		    16#21 1 16#28 { 16#20 sub } for
++		    16#29 1 16#2F { pop 0 } for
++		    16#30 1 16#74 { 16#27 sub } for
++		    16#75 1 16#FF { pop 0 } for
++		] def
++	        /LowerByteEncoding [
++		    16#00 1 16#A0 { pop /.notdef } for
++		    16#A1 1 16#FE { 16#80 sub 16 2 string cvrs
++				    (cXX) dup 1 4 -1 roll
++				    putinterval cvn } for
++		    /.notdef
++		] def
++		currentdict
++	    end def
++	end
++    } if
++    findfont dup /FontType get 0 eq {
++	14 dict begin
++	    %
++	    % 7+8 bit EUC font
++	    %
++	    12 dict begin
++		/EUCFont exch def
++		/FontInfo (7+8 bit EUC font) readonly def
++		/PaintType 0 def
++		/FontType 0 def
++		/FontMatrix matrix def
++		% /FontName
++		/Encoding fixeucfont_dict /UpperByteEncoding get def
++		/FMapType 2 def
++		EUCFont /WMode known
++		{ EUCFont /WMode get /WMode exch def }
++		{ /WMode 0 def } ifelse
++		/FDepVector [
++		    EUCFont /FDepVector get 0 get
++		    [ 16#21 1 16#28 {} for 16#30 1 16#74 {} for ]
++		    {
++			13 dict begin
++			    /EUCFont EUCFont def
++			    /UpperByte exch 16#80 add def	
++			    % /FontName
++			    /FontInfo (EUC lower byte font) readonly def
++			    /PaintType 0 def
++			    /FontType 3 def
++			    /FontMatrix matrix def
++			    /FontBBox {0 0 0 0} def
++			    /Encoding
++				fixeucfont_dict /LowerByteEncoding get def
++			    % /UniqueID
++			    % /WMode
++			    /BuildChar {
++				gsave
++				exch dup /EUCFont get setfont
++				/UpperByte get
++				2 string
++				dup 0 4 -1 roll put
++				dup 1 4 -1 roll put
++				dup stringwidth setcharwidth
++				0 0 moveto show
++				grestore
++			    } bind def
++			    currentdict
++			end
++			/lowerbytefont exch definefont
++		    } forall
++		] def
++		currentdict
++	    end
++	    /eucfont exch definefont
++	    exch
++	    findfont 1 copyfont dup begin
++		RomanRotation {
++			/FontMatrix FontMatrix
++			[ 0 RomanScale neg RomanScale 0 RomanOffset neg 0 ]
++			matrix concatmatrix def
++		}{
++			/FontMatrix FontMatrix
++			[ RomanScale 0 0 RomanScale 0 RomanOffset ] matrix concatmatrix
++			def
++			/CDevProc
++			    {pop pop pop pop 0 exch -1000 exch 2 div 880} def
++		} ifelse
++	    end
++	    /asciifont exch definefont
++	    exch
++	    /FDepVector [ 4 2 roll ] def
++	    /FontType 0 def
++	    /WMode 0 def
++	    /FMapType 4 def
++	    /FontMatrix matrix def
++	    /Encoding [0 1] def
++	    /FontBBox {0 0 0 0} def
++%	    /FontHeight 1.0 def % XXXX
++	    /FontHeight RomanScale 1.0 ge { RomanScale }{ 1.0 } ifelse def
++	    /Descent -0.3 def   % XXXX
++	    currentdict
++	end
++	/tmpfont exch definefont
++	pop
++	/tmpfont findfont
++    }{
++	pop findfont 0 copyfont
++    } ifelse
++} def	
++
++/slantfont {	% FontName slant-degree  slantfont  font'
++    exch findfont 1 copyfont begin
++    [ 1 0 4 -1 roll 1 0 0 ] FontMatrix exch matrix concatmatrix
++    /FontMatrix exch def
++    currentdict
++    end
++} def
++
+ % Function print line number (<string> # -)
+ /# {
+   gsave
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/03_koi8_fonts_debian.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,62 @@
+Replaces the names of KOI8 fonts with those in scaleble-cyrfonts
+
+See: https://patches.ubuntu.com/by-release/extracted/ubuntu/a/a2ps/1:4.13c~rc5-1/03_koi8_fonts_debian.dpatch
+
+## 03_koi8_fonts_debian.dpatch by Masayuki Hatta <[email protected]>
+
+Index: b/encoding/koi8.edf
+===================================================================
+--- a/encoding/koi8.edf
++++ b/encoding/koi8.edf
+@@ -1,6 +1,7 @@
+ # Description of the KOI8 encoding
+ # Copyright (c) 1988, 89, 90, 91, 92, 93 Miguel Santana
+ # Copyright (c) 1995, 96, 97, 98 Akim Demaille, Miguel Santana
++# Copyright (c) 2002 Vyacheslav E. Sidin
+ #
+ 
+ #
+@@ -27,27 +28,26 @@
+ Name: 	KOI8
+ 
+ Documentation
+-KOI-8 (+��) is a subset of ISO-IR-111 that can be used in Serbia, Belarus
++KOI-8 (+����) is a subset of ISO-IR-111 that can be used in Serbia, Belarus
+ etc.
+ EndDocumentation
+ 
+-# Regular fonts don't support Cyrillic glyphs
+-Default: 	CourierISOC
++Default: 	Courier
+ 
+-Substitute: 	Courier			CourierISOC
+-Substitute: 	Courier-Bold		CourierISOC-Bold
+-Substitute: 	Courier-BoldOblique	CourierISOC-BoldOblique
+-Substitute: 	Courier-Oblique		CourierISOC-Oblique
+-
+-Substitute: 	Times-Roman		College
+-Substitute: 	Times-Bold		College-Bold
+-Substitute: 	Times-Italic		College-Italic
+-Substitute: 	Times-BoldItalic	College-Italic
+-
+-Substitute: 	Helvetica		Textbook
+-Substitute: 	Helvetica-Bold		Textbook-Bold
+-Substitute: 	Helvetica-Oblique	Textbook-Italic
+-Substitute: 	Helvetica-BoldOblique	Textbook-Italic
++Substitute: 	Courier			NimbusMonCYR-Regu
++Substitute: 	Courier-Bold		NimbusMonCYR-Bold
++Substitute: 	Courier-BoldOblique	NimbusMonCYR-BoldObli
++Substitute: 	Courier-Oblique		NimbusMonCYR-ReguObli
++
++Substitute: 	Times-Roman		NimbusRomanCYR-Regu
++Substitute: 	Times-Bold		NimbusRomanCYR-Medi
++Substitute: 	Times-Italic		NimbusRomanCYR-ReguItal
++Substitute: 	Times-BoldItalic	NimbusRomanCYR-MediItal
++
++Substitute: 	Helvetica		NimbusSansCYR-Regu
++Substitute: 	Helvetica-Bold		NimbusSansCYR-Bold
++Substitute: 	Helvetica-Oblique	NimbusSansCYR-ReguObli
++Substitute: 	Helvetica-BoldOblique	NimbusSansCYR-BoldObli
+ 
+ Vector:
+ .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/05_no_acroread_for_pdf.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,21 @@
+Do not use acroread, use pdf2ps from gs for PDF
+
+See: https://patches.ubuntu.com/by-release/extracted/ubuntu/a/a2ps/1:4.13c~rc5-1/05_no_acroread_for_pdf.dpatch
+
+## 05_no_acroread_for_pdf.dpatch by Masayuki Hatta <[email protected]>
+
+Index: b/etc/a2ps_cfg.in
+===================================================================
+--- a/etc/a2ps_cfg.in
++++ b/etc/a2ps_cfg.in
+@@ -291,8 +291,8 @@
+ @COM_PSUTILS@@COM_pdf2ps@Delegation: pdf2ps pdf:ps \
+ @COM_PSUTILS@@COM_pdf2ps@   @pdf2ps@ '$f' #f0 && #{del.psselect} #f0 | #{del.psnup}
+ # Delegated to AcrobatReader
+-@COM_PSUTILS@@COM_acroread@Delegation: Acrobat pdf:ps \
+-@COM_PSUTILS@@COM_acroread@   #{del.acroread} < '$f' | #{del.psselnup}
++#@COM_PSUTILS@@COM_acroread@Delegation: Acrobat pdf:ps \
++#@COM_PSUTILS@@COM_acroread@   #{del.acroread} < '$f' | #{del.psselnup}
+ 
+ ########## PostScript files
+ # Pass the PostScript files to psnup and psselect
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/07_a2ps_info.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,221 @@
+Changes for EUC-JP encoding
+From: Masayuki Hatta (mhatta) <[email protected]>
+See: https://tracker.debian.org/news/49002
+
+Index: b/doc/a2ps.info
+===================================================================
+--- a/doc/a2ps.info
++++ b/doc/a2ps.info
+@@ -3325,6 +3325,9 @@
+  -- Encoding: ASCII (`ascii.edf')
+      US-ASCII.
+ 
++ -- Encoding: EUC-JP (`euc-jp.edf')
++     The EUC-JP encoding is a 8-bit character set widely used in Japan.
++
+  -- Encoding: HPRoman (`hp.edf')
+      The 8 bits Roman encoding for HP.
+ 
+@@ -3421,8 +3424,8 @@
+      Support of the Euro symbol is provided thanks to Ogonkify.
+ 
+  -- Encoding: KOI8 (`koi8.edf')
+-     KOI-8 (+��) is a subset of ISO-IR-111 that can be used in Serbia,
+-     Belarus etc.
++     KOI-8 (+����) is a subset of ISO-IR-111 that can be used in
++     Serbia, Belarus etc.
+ 
+  -- Encoding: MS-CP1250 (`ms-cp1250.edf')
+      Microsoft's CP-1250 encoding (aka CeP).
+@@ -7351,98 +7354,98 @@
+ Node: Encoding Map File112804
+ Node: Encoding Description Files113618
+ Node: Some Encodings116243
+-Node: Pretty Printing121283
+-Node: Syntactic limits122373
+-Node: Known Style Sheets122796
+-Node: Type Setting Style Sheets151085
+-Node: Symbol151697
+-Node: PreScript152237
+-Node: Syntax153130
+-Node: PreScript Commands153844
+-Node: PreScript examples155254
+-Node: PreTeX155609
+-Node: Special characters155936
+-Node: PreTeX Commands156626
+-Node: Differences with LaTeX158074
+-Node: TeXScript159018
+-Node: Faces160493
+-Node: Style sheets semantics161927
+-Node: Name and key162775
+-Node: Comments163613
+-Node: Alphabets163977
+-Node: Case sensitivity164483
+-Node: P-Rules164743
+-Node: Sequences167697
+-Node: Optional entries168196
+-Node: Style Sheets Implementation168611
+-Node: A Bit of Syntax169653
+-Node: Style Sheet Header173117
+-Node: Syntax of the Words174714
+-Node: Inheriting175704
+-Node: Syntax for the P-Rules176661
+-Node: Declaring keywords and operators178680
+-Node: Declaring sequences181021
+-Node: Checking a Style Sheet183892
+-Node: A tutorial on style sheets184993
+-Node: Example and syntax185803
+-Node: Implementation187064
+-Node: The Entry in sheets.map190533
+-Node: More Sophisticated Rules191417
+-Node: Distributed Style Sheets193619
+-Node: PostScript195261
+-Node: Good and Bad PostScript195849
+-Node: Page Device Options199644
+-Node: Statusdict Options200886
+-Node: Colors in PostScript201925
+-Node: a2ps PostScript Files202859
+-Node: Designing PostScript Prologues203324
+-Node: Definition of the faces204225
+-Node: Prologue File Format205714
+-Node: A prologue example206287
+-Node: Contributions208283
+-Node: card209071
+-Node: Invoking card209861
+-Node: Caution when Using card211452
+-Node: fixps211944
+-Node: Invoking fixps212574
+-Node: fixnt214043
+-Node: Invoking fixnt214653
+-Node: pdiff214863
+-Node: Invoking pdiff215333
+-Node: psmandup216386
+-Node: Invoking psmandup216966
+-Ref: Invoking psmandup-Footnote-1219022
+-Node: psset219204
+-Node: Invoking psset219812
+-Node: FAQ222612
+-Node: Why Does ...?223176
+-Node: It Prints Nothing223699
+-Node: It Prints in Simplex224879
+-Node: It Prints in Duplex225695
+-Node: It Does Not Fit on the Paper226403
+-Node: It Prints Junk226980
+-Node: It Says my File is Binary227826
+-Node: It Refuses to Change the Font Size229537
+-Node: How Can I ...?230354
+-Node: Leave Room for Binding230898
+-Node: Print stdin231149
+-Node: Change the Fonts231766
+-Node: The Old Option -b?232085
+-Node: Pass Options to lpr232583
+-Node: Non PostScript Printers233327
+-Node: Man Pages with Underlines235176
+-Node: Please tell me...235537
+-Node: Is a2ps Y2K compliant?235916
+-Ref: Is a2ps Y2K compliant?-Footnote-1236542
+-Node: The Options Have Changed236561
+-Node: Why not using yacc237636
+-Node: Why do you not use mozilla238778
+-Node: Glossary239206
+-Node: Genesis249342
+-Node: History249702
+-Node: Thanks250501
+-Node: Translators252536
+-Node: Copying254153
+-Node: Concept Index255982
++Node: Pretty Printing121394
++Node: Syntactic limits122484
++Node: Known Style Sheets122907
++Node: Type Setting Style Sheets151196
++Node: Symbol151808
++Node: PreScript152348
++Node: Syntax153241
++Node: PreScript Commands153955
++Node: PreScript examples155365
++Node: PreTeX155720
++Node: Special characters156047
++Node: PreTeX Commands156737
++Node: Differences with LaTeX158185
++Node: TeXScript159129
++Node: Faces160604
++Node: Style sheets semantics162038
++Node: Name and key162886
++Node: Comments163724
++Node: Alphabets164088
++Node: Case sensitivity164594
++Node: P-Rules164854
++Node: Sequences167808
++Node: Optional entries168307
++Node: Style Sheets Implementation168722
++Node: A Bit of Syntax169764
++Node: Style Sheet Header173228
++Node: Syntax of the Words174825
++Node: Inheriting175815
++Node: Syntax for the P-Rules176772
++Node: Declaring keywords and operators178791
++Node: Declaring sequences181132
++Node: Checking a Style Sheet184003
++Node: A tutorial on style sheets185104
++Node: Example and syntax185914
++Node: Implementation187175
++Node: The Entry in sheets.map190644
++Node: More Sophisticated Rules191528
++Node: Distributed Style Sheets193730
++Node: PostScript195372
++Node: Good and Bad PostScript195960
++Node: Page Device Options199755
++Node: Statusdict Options200997
++Node: Colors in PostScript202036
++Node: a2ps PostScript Files202970
++Node: Designing PostScript Prologues203435
++Node: Definition of the faces204336
++Node: Prologue File Format205825
++Node: A prologue example206398
++Node: Contributions208394
++Node: card209182
++Node: Invoking card209972
++Node: Caution when Using card211563
++Node: fixps212055
++Node: Invoking fixps212685
++Node: fixnt214154
++Node: Invoking fixnt214764
++Node: pdiff214974
++Node: Invoking pdiff215444
++Node: psmandup216497
++Node: Invoking psmandup217077
++Ref: Invoking psmandup-Footnote-1219133
++Node: psset219315
++Node: Invoking psset219923
++Node: FAQ222723
++Node: Why Does ...?223287
++Node: It Prints Nothing223810
++Node: It Prints in Simplex224990
++Node: It Prints in Duplex225806
++Node: It Does Not Fit on the Paper226514
++Node: It Prints Junk227091
++Node: It Says my File is Binary227937
++Node: It Refuses to Change the Font Size229648
++Node: How Can I ...?230465
++Node: Leave Room for Binding231009
++Node: Print stdin231260
++Node: Change the Fonts231877
++Node: The Old Option -b?232196
++Node: Pass Options to lpr232694
++Node: Non PostScript Printers233438
++Node: Man Pages with Underlines235287
++Node: Please tell me...235648
++Node: Is a2ps Y2K compliant?236027
++Ref: Is a2ps Y2K compliant?-Footnote-1236653
++Node: The Options Have Changed236672
++Node: Why not using yacc237747
++Node: Why do you not use mozilla238889
++Node: Glossary239317
++Node: Genesis249453
++Node: History249813
++Node: Thanks250612
++Node: Translators252647
++Node: Copying254264
++Node: Concept Index256093
+ 
+ End Tag Table
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/08_man.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,63 @@
+Fix some a2ps man page errors.
+See: https://launchpad.net/ubuntu/+source/a2ps/+changelog
+
+Index: b/man/a2ps.x
+===================================================================
+--- a/man/a2ps.x
++++ b/man/a2ps.x
+@@ -2,4 +2,4 @@
+ a2ps \- format files for printing on a PostScript printer
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
+Index: b/man/card.x
+===================================================================
+--- a/man/card.x
++++ b/man/card.x
+@@ -2,4 +2,4 @@
+ card \- print reference card of program options
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
+Index: b/man/fixps.x
+===================================================================
+--- a/man/fixps.x
++++ b/man/fixps.x
+@@ -2,4 +2,4 @@
+ fixps \- sanitize PostScript files
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
+Index: b/man/pdiff.x
+===================================================================
+--- a/man/pdiff.x
++++ b/man/pdiff.x
+@@ -2,4 +2,4 @@
+ pdiff \- produce a pretty comparison between files
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
+Index: b/man/psmandup.x
+===================================================================
+--- a/man/psmandup.x
++++ b/man/psmandup.x
+@@ -2,4 +2,4 @@
+ psmandup \- print duplex on non duplex printers
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
+Index: b/man/psset.x
+===================================================================
+--- a/man/psset.x
++++ b/man/psset.x
+@@ -2,4 +2,4 @@
+ psset \- insert page device request in PostScript files
+ 
+ [DESCRIPTION]
+-." Add any additional description here
++.\" Add any additional description here
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/09_CVE-2001-1593.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,75 @@
+Fix CVE-2001-1593
+
+See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2001-1593
+     https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2001-1593
+for more details.
+
+Index: b/lib/routines.c
+===================================================================
+--- a/lib/routines.c
++++ b/lib/routines.c
+@@ -242,3 +242,50 @@
+   /* Don't complain if you can't unlink.  Who cares of a tmp file? */
+   unlink (filename);
+ }
++
++/*
++ * Securely generate a temp file, and make sure it gets
++ * deleted upon exit.
++ */
++static char **	tempfiles;
++static unsigned	ntempfiles;
++
++static void
++cleanup_tempfiles()
++{
++	while (ntempfiles--)
++		unlink(tempfiles[ntempfiles]);
++}
++
++char *
++safe_tempnam(const char *pfx)
++{
++	char	*dirname, *filename;
++	int	fd;
++
++	if (!(dirname = getenv("TMPDIR")))
++		dirname = "/tmp";
++
++	tempfiles = (char **) realloc(tempfiles,
++			(ntempfiles+1) * sizeof(char *));
++	if (tempfiles == NULL)
++		return NULL;
++
++	filename = malloc(strlen(dirname) + strlen(pfx) + sizeof("/XXXXXX"));
++	if (!filename)
++		return NULL;
++
++	sprintf(filename, "%s/%sXXXXXX", dirname, pfx);
++
++	if ((fd = mkstemp(filename)) < 0) {
++		free(filename);
++		return NULL;
++	}
++	close(fd);
++
++	if (ntempfiles == 0)
++		atexit(cleanup_tempfiles);
++	tempfiles[ntempfiles++] = filename;
++
++	return filename;
++}
+Index: b/lib/routines.h
+===================================================================
+--- a/lib/routines.h
++++ b/lib/routines.h
+@@ -255,7 +255,8 @@
+ /* If _STR_ is not defined, give it a tempname in _TMPDIR_ */
+ #define tempname_ensure(Str)				\
+ do {							\
+-  (Str) = (Str) ? (Str) : tempnam (NULL, "a2_");	\
++  (Str) = (Str) ? (Str) : safe_tempnam("a2_");	\
+ } while (0)
++char * safe_tempnam(const char *);
+ 
+ #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/10_CVE-2014-0466.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,30 @@
+Description: CVE-2014-0466: fixps does not invoke gs with -dSAFER
+ A malicious PostScript file could delete files with the privileges of
+ the invoking user.
+Origin: vendor
+Bug-Debian: http://bugs.debian.org/742902
+Author: Salvatore Bonaccorso <[email protected]>
+Last-Update: 2014-03-28
+
+--- a/contrib/fixps.in
++++ b/contrib/fixps.in
+@@ -389,7 +389,7 @@
+   	eval "$command" ;;
+       gs)
+         $verbose "$program: making a full rewrite of the file ($gs)." >&2
+-  	$gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;;
++  	$gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;;
+     esac
+   )
+ fi
+--- a/contrib/fixps.m4
++++ b/contrib/fixps.m4
+@@ -307,7 +307,7 @@
+   	eval "$command" ;;
+       gs)
+         $verbose "$program: making a full rewrite of the file ($gs)." >&2
+-  	$gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;;
++  	$gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=- -c save pop -f $file ;;
+     esac
+   )
+ fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/11_fix-bad-free.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,18 @@
+Avoid a bad free in the encoding handling logic
+See: https://launchpad.net/ubuntu/+source/a2ps/+changelog
+
+Index: b/lib/encoding.c
+===================================================================
+--- a/lib/encoding.c
++++ b/lib/encoding.c
+@@ -538,7 +538,9 @@
+     {
+       /* Find if there is a substitute for that font */
+       res = pair_get (encoding->substitutes, font_name);
+-      if (!res)
++      if (res)
++	res = xstrdup (res);
++      else
+ 	/* No. Check if this font is supported */
+ 	if (font_exists (job, font_name))
+ 	  /* Avoid returning sth alloca'd */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/12_fix-format-security.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,95 @@
+(Part of this patch was the .../a2ps/patches/22564022.patch file).
+
+This patch has been taken from community and it addresses format string
+vulnerabilities in a2ps component.
+
+Original link:
+http://www.openwall.com/lists/oss-security/2015/11/16/4
+
+This turned into CVE-2015-8107:
+
+See:
+
+  http://seclists.org/oss-sec/2015/q4/284
+  https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2015-8107
+
+for more information.
+
+Index: b/lib/psgen.c
+===================================================================
+--- a/lib/psgen.c
++++ b/lib/psgen.c
+@@ -232,7 +232,7 @@
+     default:
+       *buf = '\0';
+       ps_escape_char (job, cp[i], buf);
+-      output (jdiv, (char *) buf);
++      output (jdiv, "%s", (char *) buf);
+       break;
+     }
+   }
+Index: b/lib/output.c
+===================================================================
+--- a/lib/output.c
++++ b/lib/output.c
+@@ -525,7 +525,7 @@
+ 		     expand_user_string (job, FIRST_FILE (job),
+ 					 (const uchar *) "Expand: requirement",
+ 					 (const uchar *) token));
+-	output (dest, expansion);
++	output (dest, "%s", expansion);
+ 	continue;
+       }
+ 
+Index: b/lib/parseppd.y
+===================================================================
+--- a/lib/parseppd.y
++++ b/lib/parseppd.y
+@@ -154,7 +154,7 @@
+ void
+ yyerror (const char *msg)
+ {
+-  error_at_line (1, 0, ppdfilename, ppdlineno, msg);
++  error_at_line (1, 0, ppdfilename, ppdlineno, "%s", msg);
+ }
+ 
+ /*
+Index: b/src/parsessh.y
+===================================================================
+--- a/src/parsessh.y
++++ b/src/parsessh.y
+@@ -740,7 +740,7 @@
+ void
+ yyerror (const char *msg)
+ {
+-  error_at_line (1, 0, sshfilename, sshlineno, msg);
++  error_at_line (1, 0, sshfilename, sshlineno, "%s", msg);
+ }
+ 
+ /*
+Index: b/lib/parseppd.c
+===================================================================
+--- a/lib/parseppd.c
++++ b/lib/parseppd.c
+@@ -1707,7 +1707,7 @@
+ void
+ yyerror (const char *msg)
+ {
+-  error_at_line (1, 0, ppdfilename, ppdlineno, msg);
++  error_at_line (1, 0, ppdfilename, ppdlineno, "%s", msg);
+ }
+ 
+ /*
+Index: b/src/parsessh.c
+===================================================================
+--- a/src/parsessh.c
++++ b/src/parsessh.c
+@@ -2639,7 +2639,7 @@
+ void
+ yyerror (const char *msg)
+ {
+-  error_at_line (1, 0, sshfilename, sshlineno, msg);
++  error_at_line (1, 0, sshfilename, sshlineno, "%s", msg);
+ }
+ 
+ /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/patches/14_sheets.map.patch	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,55 @@
+Not exactly sure what this patch does, but it was part of Bugster #7022166.
+See: https://bug.oraclecorp.com/pls/bug/webbug_print.show?c_rptno=15737141
+
+*** a2ps-4.14/sheets/sheets.map.orig	Wed May 12 15:37:37 2004
+--- a2ps-4.14/sheets/sheets.map	Wed May 12 15:48:45 2004
+***************
+*** 237,242 ****
+--- 237,243 ----
+  # GIF Images
+  gif:	/*.gif/i
+  	<GIF image*>
++ 	<GIF file*>
+  
+  # Haskell programs
+  haskell:
+***************
+*** 326,331 ****
+--- 327,333 ----
+  # PDF documents
+  pdf:	/*.pdf/i
+  	<PDF document*>
++ 	<* (PDF) *>
+  
+  # Perl files
+  perl:	/*.p[ml]/
+***************
+*** 338,343 ****
+--- 340,346 ----
+  # PNG files
+  png:	/*.png/i
+  	<PNG image*>
++ 	<PNG file*>
+  
+  # Portable Object (Gettext)
+  po:	/*.po/
+***************
+*** 474,481 ****
+  	<*vtcl*>
+  
+  # TIFF images
+! tiff:	/.tif/i  /.tiff/i
+  	<TIFF image*>
+  
+  # tk files
+  tk:	/*.tk/
+--- 477,485 ----
+  	<*vtcl*>
+  
+  # TIFF images
+! tiff:	/*.tif/i  /*.tiff/i
+  	<TIFF image*>
++ 	<TIFF file*>
+  
+  # tk files
+  tk:	/*.tk/
--- a/components/a2ps/patches/22564022.patch	Tue Sep 13 13:02:35 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-This patch has been taken from community and it addresses format string vulnerability in a2ps component.
-
-Patch source:
-http://www.openwall.com/lists/oss-security/2015/11/16/4
-
---- a2ps-4.14/lib/output.c	Fri Dec 28 17:58:21 2007
-+++ a2ps-4.14_copy/lib/output.c	Wed May 18 23:11:57 2016
-@@ -525,7 +525,7 @@
- 		     expand_user_string (job, FIRST_FILE (job),
- 					 (const uchar *) "Expand: requirement",
- 					 (const uchar *) token));
--	output (dest, expansion);
-+	output (dest, "%s", expansion);
- 	continue;
-       }
- 
--- a/components/a2ps/patches/sheets.map.patch	Tue Sep 13 13:02:35 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-*** a2ps-4.14/sheets/sheets.map.orig	Wed May 12 15:37:37 2004
---- a2ps-4.14/sheets/sheets.map	Wed May 12 15:48:45 2004
-***************
-*** 237,242 ****
---- 237,243 ----
-  # GIF Images
-  gif:	/*.gif/i
-  	<GIF image*>
-+ 	<GIF file*>
-  
-  # Haskell programs
-  haskell:
-***************
-*** 326,331 ****
---- 327,333 ----
-  # PDF documents
-  pdf:	/*.pdf/i
-  	<PDF document*>
-+ 	<* (PDF) *>
-  
-  # Perl files
-  perl:	/*.p[ml]/
-***************
-*** 338,343 ****
---- 340,346 ----
-  # PNG files
-  png:	/*.png/i
-  	<PNG image*>
-+ 	<PNG file*>
-  
-  # Portable Object (Gettext)
-  po:	/*.po/
-***************
-*** 474,481 ****
-  	<*vtcl*>
-  
-  # TIFF images
-! tiff:	/.tif/i  /.tiff/i
-  	<TIFF image*>
-  
-  # tk files
-  tk:	/*.tk/
---- 477,485 ----
-  	<*vtcl*>
-  
-  # TIFF images
-! tiff:	/*.tif/i  /*.tiff/i
-  	<TIFF image*>
-+ 	<TIFF file*>
-  
-  # tk files
-  tk:	/*.tk/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/a2ps/test/results-64.master	Tue Sep 13 14:01:54 2016 -0700
@@ -0,0 +1,83 @@
+/usr/gnu/bin/make  check-TESTS
+PASS: align-1.tst
+PASS: backup.tst
+PASS: contrib.tst
+PASS: cut.tst
+PASS: deleg-1.tst
+PASS: deleg-2.tst
+$(SOURCE_DIR)/tests/ps-ref/encoding.ps $(@D)/tests/ps-chk/encoding.ps differ: char 3083, line 133
+FAIL: encoding.tst
+PASS: guess-1.tst
+PASS: guess-2.tst
+PASS: inline.tst
+PASS: inout-1.tst
+PASS: inout-2.tst
+PASS: inout-3.tst
+PASS: options-1.tst
+PASS: pages-1.tst
+PASS: pages-2.tst
+PASS: po.tst
+PASS: printers.tst
+PASS: prolog-1.tst
+FAIL: prolog-2.tst
+PASS: strip.tst
+-------------------------------------
+   Comparing generated PostScript
+-------------------------------------
+AppDelegate.m     (objc)...       Ok
+InsertBlock.java  (java)...       Bad: -ng -> 4, -g -> 4
+a2ps.man          (plain)...      Ok
+bookie.idl        (cidl)...       Bad: -ng -> 4, -g -> 4
+configure.in      (autoconf)...   Ok
+confirm.m3        (modula3)...    Ok
+ehandler          (ps)...         Ok
+eplv_chkr.v       (verilog)...    Ok
+essai2.o2c        (o2c)...        Ok
+ex1.asn1          (asn1)...       Ok
+ex_PSGETRS.f90    (fortran)...    Ok
+ShellNewDummyHook.(pascal)...     Ok
+formfeed.txt      (plain)...      Ok
+ftp2.pml          (promela)...    Ok
+includeres        (perl)...       Ok
+mofibida.hs       (haskell)...    Ok
+mtvplot.octave    (octave)...     Ok
+mutex.py          (python)...     Ok
+pi.b              (bc)...         Ok
+polkaIDL.hh       (cxx)...        Ok
+prosamp.pre       (pre)...        Ok
+psmandup          (sh)...         Ok
+report.pre        (texscript)...  Ok
+run-help          (zsh)...        Ok
+s-garnam.adb      (ada)...        Ok
+snacc.mib         (mib)...        Ok
+space.pls         (plsql)...      Ok
+sqlcrtbl.sql      (sql)...        Ok
+sqlinit.ora       (oracle)...     Ok
+sqlpq92.sql       (sql92)...      Ok
+sqlspace.pkb      (plsql)...      Ok
+strange.mail      (mail)...       Ok
+symbol.pre        (pre)...        Ok
+synopsys.setup    (dc_shell)...   Ok
+tabulation.pre    (pre)...        Ok
+template.e        (eiffel)...     Ok
+typing.cl         (claire)...     Ok
+vrcaml.ml         (caml)...       Ok
+wide.txt          (plain)...      Ok
+  There are differences with reference PostScript files:
+  4 InsertBlock.java
+  4 bookie.idl
+  8 total
+  There are differences with reference PostScript files (with -g):
+  4 InsertBlock.java
+  4 bookie.idl
+  8 total
+FAIL: styles.tst
+PASS: toc.tst
+PASS: usropt-1.tst
+PASS: usropt-2.tst
+=================================
+3 of 25 tests failed
+Please report to [email protected]
+=================================
+make[2]: *** [Makefile:344: check-TESTS] Error 1
+make[1]: *** [Makefile:444: check-am] Error 2