ia64/xen-unstable

changeset 422:5d0fd4216f8f

bitkeeper revision 1.205 (3eb3c88eduKB4UKYwbNPBquG4zJDqg)

Merge scramble.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk
into scramble.cl.cam.ac.uk:/local/scratch/kaf24/xeno
author kaf24@scramble.cl.cam.ac.uk
date Sat May 03 13:47:58 2003 +0000 (2003-05-03)
parents 56e5f664744d d5610c721158
children 67a66de6d9a0
files .rootkeys xen/Makefile xen/common/kernel.c xen/include/xeno/version.h xen/tools/Makefile xen/tools/figlet/LICENSE xen/tools/figlet/Makefile xen/tools/figlet/README xen/tools/figlet/figlet.c xen/tools/figlet/xen.flf
line diff
     1.1 --- a/.rootkeys	Fri May 02 15:53:41 2003 +0000
     1.2 +++ b/.rootkeys	Sat May 03 13:47:58 2003 +0000
     1.3 @@ -365,6 +365,11 @@ 3ddb79c4NSDwiQ-AmrYdxcRAwLPzwQ xen/net/e
     1.4  3ddb79c4TZj1wXPKQt36O72SddtBNQ xen/net/skbuff.c
     1.5  3ddb79c4x8dvwPtzclghWAKFWpEBFA xen/tools/Makefile
     1.6  3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen/tools/elf-reloc.c
     1.7 +3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/tools/figlet/LICENSE
     1.8 +3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/tools/figlet/Makefile
     1.9 +3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
    1.10 +3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
    1.11 +3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
    1.12  3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-pre4-sparse/Makefile
    1.13  3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-pre4-sparse/arch/xeno/Makefile
    1.14  3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-pre4-sparse/arch/xeno/boot/Makefile
     2.1 --- a/xen/Makefile	Fri May 02 15:53:41 2003 +0000
     2.2 +++ b/xen/Makefile	Sat May 03 13:47:58 2003 +0000
     2.3 @@ -1,10 +1,16 @@
     2.4  
     2.5 -export BASEDIR := $(shell pwd)
     2.6 +# This is the correct place to edit the build version.
     2.7 +# All other places this is stored (eg. compile.h) should be autogenerated.
     2.8 +export XEN_VERSION       = 1
     2.9 +export XEN_SUBVERSION    = 0
    2.10 +export XEN_EXTRAVERSION  = "-beta"
    2.11 +
    2.12 +export BASEDIR          := $(shell pwd)
    2.13 +
    2.14 +include Rules.mk
    2.15  
    2.16  GENERATED_FILES := include/xeno/compile.h
    2.17  
    2.18 -include Rules.mk
    2.19 -
    2.20  default: $(TARGET)
    2.21  	gzip -f -9 < $(TARGET) > $(TARGET).gz
    2.22  
    2.23 @@ -37,28 +43,37 @@ make-links: delete-links
    2.24  delete-links:
    2.25  	rm -f include/linux include/asm
    2.26  
    2.27 -# NB. kernel.o is blown away as the build date is stored statically within it
    2.28 -#     Basically it's the only file dependent on compile.h -- we blow that
    2.29 -#     dependency away for all other files in Rules.mk.
    2.30 +# Blow away kernel.o because build info is stored statically within it.
    2.31  delete-unfresh-files:
    2.32  	rm -f $(GENERATED_FILES) common/kernel.o
    2.33  
    2.34 +# compile.h contains dynamic build info. Rebuilt on every 'make' invocation.
    2.35  include/xeno/compile.h:
    2.36 -	@LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" > $@
    2.37 +	@LANG=C echo /\* Autogenerated by root Makefile. Do not edit. \*/ > $@
    2.38 +	@LANG=C echo >> $@
    2.39 +	@LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" >> $@
    2.40  	@LANG=C echo \#define XEN_COMPILE_TIME \"`date +%T`\" >> $@
    2.41  	@LANG=C echo \#define XEN_COMPILE_BY \"`whoami`\" >> $@
    2.42  	@LANG=C echo \#define XEN_COMPILE_DOMAIN \"`([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown])`\" >> $@
    2.43  	@LANG=C echo \#define XEN_COMPILE_HOST \"`hostname`\" >> $@
    2.44  	@LANG=C echo \#define XEN_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> $@
    2.45 +	@LANG=C echo >> $@
    2.46 +	@LANG=C echo \#define XEN_VERSION\ \ \ \ \ \ $(XEN_VERSION) >> $@
    2.47 +	@LANG=C echo \#define XEN_SUBVERSION\ \ \ $(XEN_SUBVERSION) >> $@
    2.48 +	@LANG=C echo \#define XEN_EXTRAVERSION \"$(XEN_EXTRAVERSION)\" >> $@
    2.49 +	@LANG=C echo >> $@
    2.50 +	@LANG=C echo \#define XEN_BANNER \\ >> $@
    2.51 +	cd tools/figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ && cd ../..
    2.52 +	@LANG=C echo >> $@
    2.53  
    2.54 -.PHONY: $(GENERATED_FILES) make-links delete-links default debug install clean delete-unfresh-files
    2.55 +.PHONY: $(GENERATED_FILES) make-links delete-links default 
    2.56 +.PHONY: debug install clean delete-unfresh-files
    2.57  
    2.58 -
    2.59 -SUBDIRS         =arch common drivers net 
    2.60 +SUBDIRS = arch common drivers net 
    2.61  TAGS: 
    2.62  	etags `find include/asm-$(ARCH) -name '*.h'`
    2.63  	find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a
    2.64  	find $(SUBDIRS) -name '*.[ch]' | xargs etags -a
    2.65 -
    2.66  MAP:
    2.67  	nm image | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
    2.68 +
     3.1 --- a/xen/common/kernel.c	Fri May 02 15:53:41 2003 +0000
     3.2 +++ b/xen/common/kernel.c	Sat May 03 13:47:58 2003 +0000
     3.3 @@ -171,12 +171,7 @@ void cmain (unsigned long magic, multibo
     3.4      /* INITIALISE SERIAL LINE (printk will work okay from here on). */
     3.5      init_serial();
     3.6  
     3.7 -    /* Print the intro banner. The ASCII art is ugle since '\\' -> '\'. */
     3.8 -    printk(" __  __            _   ___    _          _        \n");
     3.9 -    printk(" \\ \\/ /___ _ __   / | / _ \\  | |__   ___| |_ __ _ \n");
    3.10 -    printk("  \\  // _ \\ '_ \\  | || | | | | '_ \\ / _ \\ __/ _` |\n");
    3.11 -    printk("  /  \\  __/ | | | | || |_| | | |_) |  __/ || (_| |\n");
    3.12 -    printk(" /_/\\_\\___|_| |_| |_(_)___/  |_.__/ \\___|\\__\\__,_|\n\n");
    3.13 +    printk(XEN_BANNER);
    3.14      printk(" http://www.cl.cam.ac.uk/xeno\n");
    3.15      printk(" University of Cambridge Computer Laboratory\n\n");
    3.16      printk(" Xen version %d.%d%s (%s@%s) (%s) %s\n\n",
    3.17 @@ -390,14 +385,22 @@ static inline void __putstr(const char *
    3.18  void printf (const char *fmt, ...)
    3.19  {
    3.20      va_list args;
    3.21 -    char buf[128], *p;
    3.22 +    char buf[128], *p = fmt;
    3.23      unsigned long flags;
    3.24  
    3.25 -    va_start(args, fmt);
    3.26 -    (void)vsnprintf(buf, sizeof(buf), fmt, args);
    3.27 -    va_end(args);
    3.28 -  
    3.29 -    p = buf; 
    3.30 +    /*
    3.31 +     * If the format string contains '%' descriptors then we have to parse it 
    3.32 +     * before printing it. We parse it into a fixed-length buffer. Long 
    3.33 +     * strings should therefore _not_ contain '%' characters!
    3.34 +     */
    3.35 +    if ( strchr(fmt, '%') != NULL )
    3.36 +    {
    3.37 +        va_start(args, fmt);
    3.38 +        (void)vsnprintf(buf, sizeof(buf), fmt, args);
    3.39 +        va_end(args);        
    3.40 +        p = buf; 
    3.41 +    }
    3.42 +
    3.43      spin_lock_irqsave(&console_lock, flags);
    3.44      while ( *p ) putchar(*p++);
    3.45      spin_unlock_irqrestore(&console_lock, flags);
     4.1 --- a/xen/include/xeno/version.h	Fri May 02 15:53:41 2003 +0000
     4.2 +++ b/xen/include/xeno/version.h	Sat May 03 13:47:58 2003 +0000
     4.3 @@ -1,6 +1,2 @@
     4.4  #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
     4.5  #define LINUX_VERSION_CODE KERNEL_VERSION(2,4,21)
     4.6 -
     4.7 -#define XEN_VERSION      1
     4.8 -#define XEN_SUBVERSION   0
     4.9 -#define XEN_EXTRAVERSION "-beta"
     5.1 --- a/xen/tools/Makefile	Fri May 02 15:53:41 2003 +0000
     5.2 +++ b/xen/tools/Makefile	Sat May 03 13:47:58 2003 +0000
     5.3 @@ -1,6 +1,14 @@
     5.4 +
     5.5 +all: figlet elf-reloc
     5.6 +
     5.7 +figlet:
     5.8 +	$(MAKE) -C figlet
     5.9  
    5.10  elf-reloc: elf-reloc.c
    5.11  	gcc -O2 -Wall -o $@ $<
    5.12  
    5.13  clean:
    5.14  	rm -f elf-reloc *~ core
    5.15 +	$(MAKE) -C figlet clean
    5.16 +
    5.17 +.PHONY: figlet
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/xen/tools/figlet/LICENSE	Sat May 03 13:47:58 2003 +0000
     6.3 @@ -0,0 +1,111 @@
     6.4 +http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
     6.5 +
     6.6 +			 The "Artistic License"
     6.7 +
     6.8 +				Preamble
     6.9 +
    6.10 +The intent of this document is to state the conditions under which a
    6.11 +Package may be copied, such that the Copyright Holder maintains some
    6.12 +semblance of artistic control over the development of the package,
    6.13 +while giving the users of the package the right to use and distribute
    6.14 +the Package in a more-or-less customary fashion, plus the right to make
    6.15 +reasonable modifications.
    6.16 +
    6.17 +Definitions:
    6.18 +
    6.19 +	"Package" refers to the collection of files distributed by the
    6.20 +	Copyright Holder, and derivatives of that collection of files
    6.21 +	created through textual modification.
    6.22 +
    6.23 +	"Standard Version" refers to such a Package if it has not been
    6.24 +	modified, or has been modified in accordance with the wishes
    6.25 +	of the Copyright Holder.
    6.26 +
    6.27 +	"Copyright Holder" is whoever is named in the copyright or
    6.28 +	copyrights for the package.
    6.29 +
    6.30 +	"You" is you, if you're thinking about copying or distributing
    6.31 +	this Package.
    6.32 +
    6.33 +	"Reasonable copying fee" is whatever you can justify on the
    6.34 +	basis of media cost, duplication charges, time of people involved,
    6.35 +	and so on.  (You will not be required to justify it to the
    6.36 +	Copyright Holder, but only to the computing community at large
    6.37 +	as a market that must bear the fee.)
    6.38 +
    6.39 +	"Freely Available" means that no fee is charged for the item
    6.40 +	itself, though there may be fees involved in handling the item.
    6.41 +	It also means that recipients of the item may redistribute it
    6.42 +	under the same conditions they received it.
    6.43 +
    6.44 +1. You may make and give away verbatim copies of the source form of the
    6.45 +Standard Version of this Package without restriction, provided that you
    6.46 +duplicate all of the original copyright notices and associated disclaimers.
    6.47 +
    6.48 +2. You may apply bug fixes, portability fixes and other modifications
    6.49 +derived from the Public Domain or from the Copyright Holder.  A Package
    6.50 +modified in such a way shall still be considered the Standard Version.
    6.51 +
    6.52 +3. You may otherwise modify your copy of this Package in any way, provided
    6.53 +that you insert a prominent notice in each changed file stating how and
    6.54 +when you changed that file, and provided that you do at least ONE of the
    6.55 +following:
    6.56 +
    6.57 +    a) place your modifications in the Public Domain or otherwise make them
    6.58 +    Freely Available, such as by posting said modifications to Usenet or
    6.59 +    an equivalent medium, or placing the modifications on a major archive
    6.60 +    site such as ftp.uu.net, or by allowing the Copyright Holder to include
    6.61 +    your modifications in the Standard Version of the Package.
    6.62 +
    6.63 +    b) use the modified Package only within your corporation or organization.
    6.64 +
    6.65 +    c) rename any non-standard executables so the names do not conflict
    6.66 +    with standard executables, which must also be provided, and provide
    6.67 +    a separate manual page for each non-standard executable that clearly
    6.68 +    documents how it differs from the Standard Version.
    6.69 +
    6.70 +    d) make other distribution arrangements with the Copyright Holder.
    6.71 +
    6.72 +4. You may distribute the programs of this Package in object code or
    6.73 +executable form, provided that you do at least ONE of the following:
    6.74 +
    6.75 +    a) distribute a Standard Version of the executables and library files,
    6.76 +    together with instructions (in the manual page or equivalent) on where
    6.77 +    to get the Standard Version.
    6.78 +
    6.79 +    b) accompany the distribution with the machine-readable source of
    6.80 +    the Package with your modifications.
    6.81 +
    6.82 +    c) accompany any non-standard executables with their corresponding
    6.83 +    Standard Version executables, giving the non-standard executables
    6.84 +    non-standard names, and clearly documenting the differences in manual
    6.85 +    pages (or equivalent), together with instructions on where to get
    6.86 +    the Standard Version.
    6.87 +
    6.88 +    d) make other distribution arrangements with the Copyright Holder.
    6.89 +
    6.90 +5. You may charge a reasonable copying fee for any distribution of this
    6.91 +Package.  You may charge any fee you choose for support of this Package.
    6.92 +You may not charge a fee for this Package itself.  However,
    6.93 +you may distribute this Package in aggregate with other (possibly
    6.94 +commercial) programs as part of a larger (possibly commercial) software
    6.95 +distribution provided that you do not advertise this Package as a
    6.96 +product of your own.
    6.97 +
    6.98 +6. The scripts and library files supplied as input to or produced as
    6.99 +output from the programs of this Package do not automatically fall
   6.100 +under the copyright of this Package, but belong to whomever generated
   6.101 +them, and may be sold commercially, and may be aggregated with this
   6.102 +Package.
   6.103 +
   6.104 +7. C or perl subroutines supplied by you and linked into this Package
   6.105 +shall not be considered part of this Package.
   6.106 +
   6.107 +8. The name of the Copyright Holder may not be used to endorse or promote
   6.108 +products derived from this software without specific prior written permission.
   6.109 +
   6.110 +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
   6.111 +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   6.112 +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   6.113 +
   6.114 +				The End
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/xen/tools/figlet/Makefile	Sat May 03 13:47:58 2003 +0000
     7.3 @@ -0,0 +1,7 @@
     7.4 +
     7.5 +CC := gcc
     7.6 +
     7.7 +figlet: figlet.c
     7.8 +
     7.9 +clean:
    7.10 +	rm -f *.o figlet
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/xen/tools/figlet/README	Sat May 03 13:47:58 2003 +0000
     8.3 @@ -0,0 +1,9 @@
     8.4 +
     8.5 +NB. This is a very hacked version of Figlet 2.2.1. 
     8.6 +
     8.7 +Don't use this outside the Xen build system. A proper version of Figlet
     8.8 +can be had from <http://www.figlet.org>.
     8.9 +
    8.10 +The distribution license is intact in the LICENSE file.
    8.11 +
    8.12 + -- Keir Fraser (2/5/2003)
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/xen/tools/figlet/figlet.c	Sat May 03 13:47:58 2003 +0000
     9.3 @@ -0,0 +1,2075 @@
     9.4 +
     9.5 +/*
     9.6 + * XXXXXXXXXXXXXXXXXXXXXXXXXXX
     9.7 + * 
     9.8 + * This is a HACKED figlet source file for Xen.
     9.9 + * 
    9.10 + * Hacked to output C octal strings for inclusion in a header file.
    9.11 + * Support for opening zippe files is removed.
    9.12 + * 
    9.13 + * Go to www.figlet.org for teh unhacked Figlet sources!
    9.14 + */
    9.15 +
    9.16 +/****************************************************************************
    9.17 +
    9.18 +  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
    9.19 +  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
    9.20 +  FIGlet Copyright 2002 Christiaan Keet
    9.21 +  Portions written by Paul Burton and Christiaan Keet
    9.22 +  Internet: <info@figlet.org>
    9.23 +  FIGlet, along with the various FIGlet fonts and documentation, is
    9.24 +    copyrighted under the provisions of the Artistic License (as listed
    9.25 +    in the file "Artistic-license.txt" which is included in this package.
    9.26 +****************************************************************************/
    9.27 +
    9.28 +#define DATE "13 July 2002"
    9.29 +#define VERSION "2.2.1"
    9.30 +#define VERSION_INT 20201
    9.31 +
    9.32 +/* FIGlet (Frank, Ian & Glenn's Letters) */
    9.33 +/* by Glenn Chappell */
    9.34 +/* Apr 1991 */
    9.35 +/* Automatic file addition by Ian Chai May 1991 */
    9.36 +/* Punctuation and numbers addition by Ian Chai Jan 1993 */
    9.37 +/* Full ASCII by Glenn Chappell Feb 1993 */
    9.38 +/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
    9.39 +/* Hard blanks by Glenn Chappell Apr 1993 */
    9.40 +/* Release 2.0 5 Aug 1993 */
    9.41 +/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
    9.42 +/* Control files by Glenn Chappell Feb 1994 */
    9.43 +/* Release 2.1 12 Aug 1994 */
    9.44 +/* Release 2.1.1 25 Aug 1994 */
    9.45 +/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
    9.46 +   option.  Sept 8, 1996 */
    9.47 +/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
    9.48 +   mapping tables, kerning/smushing options. */
    9.49 +/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
    9.50 +   FAQs and comments. 13 July 2002. The new official FIGlet website is 
    9.51 +   http://www.figlet.org/  */
    9.52 +
    9.53 +#define DEFAULTFONTDIR "."
    9.54 +#define DEFAULTFONTFILE "xen.flf"
    9.55 +
    9.56 +#include <stdio.h>
    9.57 +#ifdef __STDC__
    9.58 +#include <stdlib.h>
    9.59 +#endif
    9.60 +#include <string.h>
    9.61 +#include <ctype.h>
    9.62 +#include <fcntl.h>     /* Needed for get_columns */
    9.63 +
    9.64 +#ifdef unix
    9.65 +#include <sys/ioctl.h> /* Needed for get_columns */
    9.66 +#endif
    9.67 +
    9.68 +
    9.69 +#define ZFILE FILE
    9.70 +#define Zopen fopen
    9.71 +#define Zgetc fgetc
    9.72 +#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
    9.73 +#define Zclose fclose
    9.74 +
    9.75 +#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
    9.76 +
    9.77 +#define DIRSEP '/'
    9.78 +#define DIRSEP2 '\\'
    9.79 +/* Leave alone for Unix and MS-DOS/Windows!
    9.80 +Note: '/' also used in filename in get_columns(). */
    9.81 +
    9.82 +#define FONTFILESUFFIX ".flf"
    9.83 +#define FONTFILEMAGICNUMBER "flf2"
    9.84 +#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
    9.85 +#define CONTROLFILESUFFIX ".flc"
    9.86 +#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
    9.87 +#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
    9.88 +#define DEFAULTCOLUMNS 80
    9.89 +
    9.90 +
    9.91 +/****************************************************************************
    9.92 +
    9.93 +  Globals dealing with chars that are read
    9.94 +
    9.95 +****************************************************************************/
    9.96 +
    9.97 +typedef long inchr; /* "char" read from stdin */
    9.98 +
    9.99 +inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
   9.100 +                   /* Note: not null-terminated. */
   9.101 +int inchrlinelen,inchrlinelenlimit;
   9.102 +inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
   9.103 +  /* Latin-1 codes for German letters, respectively:
   9.104 +     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
   9.105 +     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
   9.106 +     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
   9.107 +     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
   9.108 +     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
   9.109 +     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
   9.110 +     LATIN SMALL LETTER SHARP S = ess-zed
   9.111 +  */
   9.112 +
   9.113 +int hzmode;  /* true if reading double-bytes in HZ mode */
   9.114 +int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
   9.115 +inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
   9.116 +int gl; /* 0-3 specifies left-half Gn character set */
   9.117 +int gr; /* 0-3 specifies right-half Gn character set */
   9.118 +
   9.119 +int Myargc;  /* to avoid passing around argc and argv */
   9.120 +char **Myargv;
   9.121 +
   9.122 +/****************************************************************************
   9.123 +
   9.124 +  Globals dealing with chars that are written
   9.125 +
   9.126 +****************************************************************************/
   9.127 +
   9.128 +typedef struct fc {
   9.129 +  inchr ord;
   9.130 +  char **thechar;  /* Alloc'd char thechar[charheight][]; */
   9.131 +  struct fc *next;
   9.132 +  } fcharnode;
   9.133 +
   9.134 +fcharnode *fcharlist;
   9.135 +char **currchar;
   9.136 +int currcharwidth;
   9.137 +int previouscharwidth;
   9.138 +char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
   9.139 +int outlinelen;
   9.140 +
   9.141 +
   9.142 +/****************************************************************************
   9.143 +
   9.144 +  Globals dealing with command file storage
   9.145 +
   9.146 +****************************************************************************/
   9.147 +
   9.148 +typedef struct cfn {
   9.149 +  char *thename;
   9.150 +  struct cfn *next;
   9.151 +  } cfnamenode;
   9.152 +
   9.153 +cfnamenode *cfilelist,**cfilelistend;
   9.154 +
   9.155 +typedef struct cm {
   9.156 +  int thecommand;
   9.157 +  inchr rangelo;
   9.158 +  inchr rangehi;
   9.159 +  inchr offset;
   9.160 +  struct cm *next;
   9.161 +  } comnode;
   9.162 +
   9.163 +comnode *commandlist,**commandlistend;
   9.164 +
   9.165 +/****************************************************************************
   9.166 +
   9.167 +  Globals affected by command line options
   9.168 +
   9.169 +****************************************************************************/
   9.170 +
   9.171 +int deutschflag,justification,paragraphflag,right2left,multibyte;
   9.172 +int cmdinput;
   9.173 +
   9.174 +#define SM_SMUSH 128
   9.175 +#define SM_KERN 64
   9.176 +#define SM_EQUAL 1
   9.177 +#define SM_LOWLINE 2
   9.178 +#define SM_HIERARCHY 4
   9.179 +#define SM_PAIR 8
   9.180 +#define SM_BIGX 16
   9.181 +#define SM_HARDBLANK 32
   9.182 +
   9.183 +int smushmode;
   9.184 +
   9.185 +#define SMO_NO 0     /* no command-line smushmode */
   9.186 +#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
   9.187 +#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
   9.188 +
   9.189 +int smushoverride;
   9.190 +
   9.191 +int outputwidth;
   9.192 +int outlinelenlimit;
   9.193 +char *fontdirname,*fontname;
   9.194 +
   9.195 +
   9.196 +/****************************************************************************
   9.197 +
   9.198 +  Globals read from font file
   9.199 +
   9.200 +****************************************************************************/
   9.201 +
   9.202 +char hardblank;
   9.203 +int charheight;
   9.204 +
   9.205 +
   9.206 +/****************************************************************************
   9.207 +
   9.208 +  Name of program, used in error messages
   9.209 +
   9.210 +****************************************************************************/
   9.211 +
   9.212 +char *myname;
   9.213 +
   9.214 +
   9.215 +#ifdef TIOCGWINSZ
   9.216 +/****************************************************************************
   9.217 +
   9.218 +  get_columns
   9.219 +
   9.220 +  Determines the number of columns of /dev/tty.  Returns the number of
   9.221 +  columns, or -1 if error.  May return 0 if columns unknown.
   9.222 +  Requires include files <fcntl.h> and <sys/ioctl.h>.
   9.223 +  by Glenn Chappell & Ian Chai 14 Apr 1993
   9.224 +
   9.225 +****************************************************************************/
   9.226 +
   9.227 +int get_columns()
   9.228 +{
   9.229 +  struct winsize ws;
   9.230 +  int fd,result;
   9.231 +
   9.232 +  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
   9.233 +  result = ioctl(fd,TIOCGWINSZ,&ws);
   9.234 +  close(fd);
   9.235 +  return result?-1:ws.ws_col;
   9.236 +}
   9.237 +#endif /* ifdef TIOCGWINSZ */
   9.238 +
   9.239 +
   9.240 +/****************************************************************************
   9.241 +
   9.242 +  myalloc
   9.243 +
   9.244 +  Calls malloc.  If malloc returns error, prints error message and
   9.245 +  quits.
   9.246 +
   9.247 +****************************************************************************/
   9.248 +
   9.249 +#ifdef __STDC__
   9.250 +char *myalloc(size_t size)
   9.251 +#else
   9.252 +char *myalloc(size)
   9.253 +int size;
   9.254 +#endif
   9.255 +{
   9.256 +  char *ptr;
   9.257 +#ifndef __STDC__
   9.258 +  extern void *malloc();
   9.259 +#endif
   9.260 +
   9.261 +  if ((ptr = (char*)malloc(size))==NULL) {
   9.262 +    fprintf(stderr,"%s: Out of memory\n",myname);
   9.263 +    exit(1);
   9.264 +    }
   9.265 +  else {
   9.266 +    return ptr;
   9.267 +    }
   9.268 +}
   9.269 +
   9.270 +
   9.271 +/****************************************************************************
   9.272 +
   9.273 +  hasdirsep
   9.274 +
   9.275 +  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
   9.276 +
   9.277 +****************************************************************************/
   9.278 +
   9.279 +int hasdirsep(s1)
   9.280 +char *s1;
   9.281 +{
   9.282 +  if (strchr(s1, DIRSEP)) return 1;
   9.283 +  else if (strchr(s1, DIRSEP2)) return 1;
   9.284 +  else return 0;
   9.285 +}
   9.286 +
   9.287 +/****************************************************************************
   9.288 +
   9.289 +  suffixcmp
   9.290 +
   9.291 +  Returns true if s2 is a suffix of s1; uses case-blind comparison.
   9.292 +
   9.293 +****************************************************************************/
   9.294 +
   9.295 +int suffixcmp(s1, s2)
   9.296 +char *s1;
   9.297 +char *s2;
   9.298 +{
   9.299 +  int len1, len2;
   9.300 +
   9.301 +  len1 = MYSTRLEN(s1);
   9.302 +  len2 = MYSTRLEN(s2);
   9.303 +  if (len2 > len1) return 0;
   9.304 +  s1 += len1 - len2;
   9.305 +  while (*s1) {
   9.306 +    if (tolower(*s1) != tolower(*s2)) return 0;
   9.307 +    s1++;
   9.308 +    s2++;
   9.309 +    }
   9.310 +  return 1;
   9.311 +}
   9.312 +   
   9.313 +/****************************************************************************
   9.314 +
   9.315 +  skiptoeol
   9.316 +
   9.317 +  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
   9.318 +
   9.319 +****************************************************************************/
   9.320 +
   9.321 +void skiptoeol(fp)
   9.322 +ZFILE *fp;
   9.323 +{
   9.324 +  int dummy;
   9.325 +
   9.326 +  while (dummy=Zgetc(fp),dummy!=EOF) {
   9.327 +    if (dummy == '\n') return;
   9.328 +    if (dummy == '\r') {
   9.329 +      dummy = Zgetc(fp);
   9.330 +      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
   9.331 +      return;
   9.332 +      }
   9.333 +  }
   9.334 +}
   9.335 +
   9.336 +
   9.337 +/****************************************************************************
   9.338 +
   9.339 +  myfgets
   9.340 +
   9.341 +  Local version of fgets.  Handles \r, \n, and \r\n terminators.
   9.342 +
   9.343 +****************************************************************************/
   9.344 +
   9.345 +char *myfgets(line,maxlen,fp)
   9.346 +char *line;
   9.347 +int maxlen;
   9.348 +ZFILE *fp;
   9.349 +{
   9.350 +  int c = 0;
   9.351 +  char *p;
   9.352 +
   9.353 +  p = line;
   9.354 +  while((c=Zgetc(fp))!=EOF&&maxlen) {
   9.355 +    *p++ = c;
   9.356 +    maxlen--;
   9.357 +    if (c=='\n') break;
   9.358 +    if (c=='\r') {
   9.359 +      c = Zgetc(fp);
   9.360 +      if (c != EOF && c != '\n') Zungetc(c,fp);
   9.361 +      *(p-1) = '\n';
   9.362 +      break;
   9.363 +      }
   9.364 +    }
   9.365 +  *p = 0;
   9.366 +  return (c==EOF) ? NULL : line;
   9.367 +}
   9.368 +
   9.369 +/****************************************************************************
   9.370 +
   9.371 +  usageerr
   9.372 +
   9.373 +  Prints "Usage: ...." line to the given stream.
   9.374 +
   9.375 +****************************************************************************/
   9.376 +
   9.377 +void printusage(out)
   9.378 +FILE *out;
   9.379 +{
   9.380 +  fprintf(out,
   9.381 +    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
   9.382 +    myname);
   9.383 +  fprintf(out,
   9.384 +    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
   9.385 +  fprintf(out,
   9.386 +    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
   9.387 +}
   9.388 +
   9.389 +
   9.390 +/****************************************************************************
   9.391 +
   9.392 +  printinfo
   9.393 +
   9.394 +  Prints version and copyright message, or utility information.
   9.395 +
   9.396 +****************************************************************************/
   9.397 +
   9.398 +void printinfo(infonum)
   9.399 +int infonum;
   9.400 +{
   9.401 +  switch (infonum) {
   9.402 +    case 0: /* Copyright message */
   9.403 +      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
   9.404 +      printf("John Cowan, Christiaan Keet\n");
   9.405 +      printf("Internet: <info@figlet.org> ");
   9.406 +      printf("Version: %s, date: %s\n\n",VERSION,DATE);
   9.407 +      printf("FIGlet, along with the various FIGlet fonts");
   9.408 +      printf(" and documentation, may be\n");
   9.409 +      printf("freely copied and distributed.\n\n");
   9.410 +      printf("If you use FIGlet, please send an");
   9.411 +      printf(" e-mail message to <info@figlet.org>.\n\n");
   9.412 +      printf("The latest version of FIGlet is available from the");
   9.413 +      printf(" web site,\n\thttp://www.figlet.org/\n\n");
   9.414 +      printusage(stdout);
   9.415 +      break;
   9.416 +    case 1: /* Version (integer) */
   9.417 +      printf("%d\n",VERSION_INT);
   9.418 +      break;
   9.419 +    case 2: /* Font directory */
   9.420 +      printf("%s\n",fontdirname);
   9.421 +      break;
   9.422 +    case 3: /* Font */
   9.423 +      printf("%s\n",fontname);
   9.424 +      break;
   9.425 +    case 4: /* Outputwidth */
   9.426 +      printf("%d\n",outputwidth);
   9.427 +    }
   9.428 +}
   9.429 +
   9.430 +
   9.431 +/****************************************************************************
   9.432 +
   9.433 +  readmagic
   9.434 +
   9.435 +  Reads a four-character magic string from a stream.
   9.436 +
   9.437 +****************************************************************************/
   9.438 +void readmagic(fp,magic)
   9.439 +ZFILE *fp;
   9.440 +char *magic;
   9.441 +{
   9.442 +  int i;
   9.443 +
   9.444 +  for (i=0;i<4;i++) {
   9.445 +    magic[i] = Zgetc(fp);
   9.446 +    }
   9.447 +  magic[4] = 0;
   9.448 +  }
   9.449 +  
   9.450 +/****************************************************************************
   9.451 +
   9.452 +  skipws
   9.453 +
   9.454 +  Skips whitespace characters from a stream.
   9.455 +
   9.456 +****************************************************************************/
   9.457 +void skipws(fp)
   9.458 +ZFILE *fp;
   9.459 +{
   9.460 +  int c;
   9.461 +  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
   9.462 +  Zungetc(c,fp);
   9.463 +  }
   9.464 +
   9.465 +/****************************************************************************
   9.466 +
   9.467 +  readnum
   9.468 +
   9.469 +  Reads a number from a stream.  Accepts "0" prefix for octal and
   9.470 +  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
   9.471 +
   9.472 +****************************************************************************/
   9.473 +void readnum(fp,nump)
   9.474 +ZFILE *fp;
   9.475 +inchr *nump;
   9.476 +{
   9.477 +  int acc = 0;
   9.478 +  char *p;
   9.479 +  int c;
   9.480 +  int base;
   9.481 +  int sign = 1;
   9.482 +  char digits[] = "0123456789ABCDEF";
   9.483 +
   9.484 +  skipws(fp);
   9.485 +  c = Zgetc(fp);
   9.486 +  if (c=='-') {
   9.487 +    sign = -1;
   9.488 +    }
   9.489 +  else {
   9.490 +    Zungetc(c,fp);
   9.491 +    }
   9.492 +  c = Zgetc(fp);
   9.493 +  if (c=='0') {
   9.494 +     c = Zgetc(fp);
   9.495 +     if (c=='x'||c=='X') {
   9.496 +       base = 16;
   9.497 +       }
   9.498 +     else {
   9.499 +       base = 8;
   9.500 +       Zungetc(c,fp);
   9.501 +       }
   9.502 +    }
   9.503 +  else {
   9.504 +    base = 10;
   9.505 +    Zungetc(c,fp);
   9.506 +    }
   9.507 +
   9.508 +  while((c=Zgetc(fp))!=EOF) {
   9.509 +    c=toupper(c);
   9.510 +    p=strchr(digits,c);
   9.511 +    if (!p) {
   9.512 +      Zungetc(c,fp);
   9.513 +      *nump = acc * sign;
   9.514 +      return;
   9.515 +      }
   9.516 +    acc = acc*base+(p-digits);
   9.517 +    }
   9.518 +  *nump = acc * sign;
   9.519 +  }  
   9.520 +
   9.521 +/****************************************************************************
   9.522 +
   9.523 +  readTchar
   9.524 +
   9.525 +  Reads a control file "T" command character specification.
   9.526 +
   9.527 +  Character is a single byte, an escape sequence, or
   9.528 +  an escaped numeric.
   9.529 +
   9.530 +****************************************************************************/
   9.531 +
   9.532 +inchr readTchar(fp)
   9.533 +ZFILE *fp;
   9.534 +{
   9.535 +  inchr thechar;
   9.536 +  char next;
   9.537 +
   9.538 +  thechar=Zgetc(fp);
   9.539 +  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
   9.540 +    Zungetc(thechar,fp);
   9.541 +    return '\0';
   9.542 +    }
   9.543 +  if (thechar!='\\') return thechar;
   9.544 +  next=Zgetc(fp);
   9.545 +  switch(next) {
   9.546 +    case 'a':
   9.547 +      return 7;
   9.548 +    case 'b':
   9.549 +      return 8;
   9.550 +    case 'e':
   9.551 +      return 27;
   9.552 +    case 'f':
   9.553 +      return 12;
   9.554 +    case 'n':
   9.555 +      return 10;
   9.556 +    case 'r':
   9.557 +      return 13;
   9.558 +    case 't':
   9.559 +      return 9;
   9.560 +    case 'v':
   9.561 +      return 11;
   9.562 +    default:
   9.563 +      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
   9.564 +        Zungetc(next,fp);
   9.565 +        readnum(fp,&thechar);
   9.566 +        return thechar;
   9.567 +        }
   9.568 +      return next;
   9.569 +    }
   9.570 +}
   9.571 +
   9.572 +/****************************************************************************
   9.573 +
   9.574 +  charsetname
   9.575 +
   9.576 +  Get a Tchar representing a charset name, or 0 if none available.
   9.577 +  Called in getcharset().
   9.578 +
   9.579 +****************************************************************************/
   9.580 +
   9.581 +inchr charsetname(fp)
   9.582 +ZFILE *fp;
   9.583 +{
   9.584 +  inchr result;
   9.585 +
   9.586 +  result = readTchar(fp);
   9.587 +  if (result == '\n' || result == '\r') {
   9.588 +    result = 0;
   9.589 +    Zungetc(result,fp);
   9.590 +    }
   9.591 +  return result;
   9.592 +  }
   9.593 +
   9.594 +/****************************************************************************
   9.595 +
   9.596 +  charset
   9.597 +
   9.598 +  Processes "g[0123]" character set specifier
   9.599 +  Called in readcontrol().
   9.600 +
   9.601 +****************************************************************************/
   9.602 +
   9.603 +void charset(n, controlfile)
   9.604 +int n;
   9.605 +ZFILE *controlfile;
   9.606 +{
   9.607 +  int ch;
   9.608 +
   9.609 +  skipws(controlfile);
   9.610 +  if (Zgetc(controlfile) != '9') {
   9.611 +    skiptoeol(controlfile);
   9.612 +    return;
   9.613 +    }
   9.614 +  ch = Zgetc(controlfile);
   9.615 +  if (ch == '6') {
   9.616 +     gn[n] = 65536L * charsetname(controlfile) + 0x80;
   9.617 +     gndbl[n] = 0;
   9.618 +     skiptoeol(controlfile);
   9.619 +     return;
   9.620 +     }
   9.621 +  if (ch != '4') {
   9.622 +    skiptoeol(controlfile);
   9.623 +    return;
   9.624 +    }
   9.625 +  ch = Zgetc(controlfile);
   9.626 +  if (ch == 'x') {
   9.627 +     if (Zgetc(controlfile) != '9') {
   9.628 +       skiptoeol(controlfile);
   9.629 +       return;
   9.630 +       }
   9.631 +     if (Zgetc(controlfile) != '4') {
   9.632 +       skiptoeol(controlfile);
   9.633 +       return;
   9.634 +       }
   9.635 +     skipws(controlfile);
   9.636 +     gn[n] = 65536L * charsetname(controlfile);
   9.637 +     gndbl[n] = 1;
   9.638 +     skiptoeol(controlfile);
   9.639 +     return;
   9.640 +     }
   9.641 +  Zungetc(ch, controlfile);
   9.642 +  skipws(controlfile);
   9.643 +  gn[n] = 65536L * charsetname(controlfile);
   9.644 +  gndbl[n] = 0;
   9.645 +  return;
   9.646 +  }
   9.647 +
   9.648 +/****************************************************************************
   9.649 +
   9.650 +  readcontrol
   9.651 +
   9.652 +  Allocates memory and reads in the given control file.
   9.653 +  Called in readcontrolfiles().
   9.654 +
   9.655 +****************************************************************************/
   9.656 +
   9.657 +void readcontrol(controlname)
   9.658 +char *controlname;
   9.659 +{
   9.660 +  inchr firstch,lastch;
   9.661 +  char dashcheck;
   9.662 +  inchr offset;
   9.663 +  char *controlpath,magicnum[5];
   9.664 +  int command;
   9.665 +  ZFILE *controlfile;
   9.666 +  int namelen;
   9.667 +
   9.668 +  namelen = MYSTRLEN(fontdirname);
   9.669 +  controlpath = (char*)myalloc(sizeof(char)
   9.670 +    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
   9.671 +  controlfile = NULL;
   9.672 +  if (!hasdirsep(controlname)) {
   9.673 +    strcpy(controlpath,fontdirname);
   9.674 +    controlpath[namelen] = DIRSEP;
   9.675 +    controlpath[namelen+1] = '\0';
   9.676 +    strcat(controlpath,controlname);
   9.677 +    strcat(controlpath,CONTROLFILESUFFIX);
   9.678 +    controlfile = Zopen(controlpath,"rb");
   9.679 +    }
   9.680 +  if (controlfile==NULL) {
   9.681 +    strcpy(controlpath,controlname);
   9.682 +    strcat(controlpath,CONTROLFILESUFFIX);
   9.683 +    controlfile = Zopen(controlpath,"rb");
   9.684 +    if (controlfile==NULL) {
   9.685 +      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
   9.686 +        controlpath);
   9.687 +      exit(1);
   9.688 +      }
   9.689 +    }
   9.690 +
   9.691 +  free(controlpath);
   9.692 +
   9.693 +  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.694 +  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
   9.695 +  commandlistend = &(*commandlistend)->next;
   9.696 +  (*commandlistend) = NULL;
   9.697 +
   9.698 +  while(command=Zgetc(controlfile),command!=EOF) {
   9.699 +    switch (command) {
   9.700 +      case 't': /* Translate */
   9.701 +        skipws(controlfile);
   9.702 +        firstch=readTchar(controlfile);
   9.703 +        if ((dashcheck=Zgetc(controlfile))=='-') {
   9.704 +          lastch=readTchar(controlfile);
   9.705 +          }
   9.706 +        else {
   9.707 +          Zungetc(dashcheck,controlfile);
   9.708 +          lastch=firstch;
   9.709 +          }
   9.710 +        skipws(controlfile);
   9.711 +        offset=readTchar(controlfile)-firstch;
   9.712 +        skiptoeol(controlfile);
   9.713 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.714 +        (*commandlistend)->thecommand = 1;
   9.715 +        (*commandlistend)->rangelo = firstch;
   9.716 +        (*commandlistend)->rangehi = lastch;
   9.717 +        (*commandlistend)->offset = offset;
   9.718 +        commandlistend = &(*commandlistend)->next;
   9.719 +        (*commandlistend) = NULL;
   9.720 +        break;
   9.721 +      case '0': case '1': case '2': case '3': case '4':
   9.722 +      case '5': case '6': case '7': case '8': case '9':
   9.723 +      case '-':
   9.724 +                /* Mapping table entry */
   9.725 +        Zungetc(command,controlfile);
   9.726 +        readnum(controlfile,&firstch);
   9.727 +        skipws(controlfile);
   9.728 +	readnum(controlfile,&lastch);
   9.729 +	offset=lastch-firstch;
   9.730 +        lastch=firstch;
   9.731 +        skiptoeol(controlfile);
   9.732 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.733 +        (*commandlistend)->thecommand = 1;
   9.734 +        (*commandlistend)->rangelo = firstch;
   9.735 +        (*commandlistend)->rangehi = lastch;
   9.736 +        (*commandlistend)->offset = offset;
   9.737 +        commandlistend = &(*commandlistend)->next;
   9.738 +        (*commandlistend) = NULL;
   9.739 +        break;
   9.740 +      case 'f': /* freeze */
   9.741 +        skiptoeol(controlfile);
   9.742 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.743 +        (*commandlistend)->thecommand = 0;
   9.744 +        commandlistend = &(*commandlistend)->next;
   9.745 +        (*commandlistend) = NULL;
   9.746 +        break;
   9.747 +      case 'b': /* DBCS input mode */
   9.748 +        multibyte = 1;
   9.749 +        break;
   9.750 +      case 'u': /* UTF-8 input mode */
   9.751 +        multibyte = 2;
   9.752 +        break;
   9.753 +      case 'h': /* HZ input mode */
   9.754 +        multibyte = 3;
   9.755 +        break;
   9.756 +      case 'j': /* Shift-JIS input mode */
   9.757 +        multibyte = 4;
   9.758 +        break;
   9.759 +      case 'g': /* ISO 2022 character set choices */
   9.760 +        multibyte = 0;
   9.761 +        skipws(controlfile);
   9.762 +        command=Zgetc(controlfile);
   9.763 +        switch (command) {
   9.764 +          case '0': /* define G0 charset */
   9.765 +            charset(0, controlfile);
   9.766 +            break;
   9.767 +          case '1': /* set G1 charset */
   9.768 +            charset(1, controlfile);
   9.769 +            break;
   9.770 +          case '2': /* set G2 charset */
   9.771 +            charset(2, controlfile);
   9.772 +            break;
   9.773 +          case '3': /* set G3 charset */
   9.774 +            charset(3, controlfile);
   9.775 +            break;
   9.776 +          case 'l': case 'L': /* define left half */
   9.777 +            skipws(controlfile);
   9.778 +            gl = Zgetc(controlfile) - '0';
   9.779 +            skiptoeol(controlfile);
   9.780 +            break;
   9.781 +          case 'r': case 'R': /* define right half */
   9.782 +            skipws(controlfile);
   9.783 +            gr = Zgetc(controlfile) - '0';
   9.784 +            skiptoeol(controlfile);
   9.785 +            break;
   9.786 +          default: /* meaningless "g" command */
   9.787 +            skiptoeol(controlfile);
   9.788 +          }
   9.789 +      case '\r': case '\n': /* blank line */
   9.790 +        break;
   9.791 +      default: /* Includes '#' */
   9.792 +        skiptoeol(controlfile);
   9.793 +      }
   9.794 +    }
   9.795 +  Zclose(controlfile);
   9.796 +}
   9.797 +
   9.798 +
   9.799 +/****************************************************************************
   9.800 +
   9.801 +  readcontrolfiles
   9.802 +
   9.803 +  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
   9.804 +  Called in main().
   9.805 +
   9.806 +****************************************************************************/
   9.807 +
   9.808 +void readcontrolfiles()
   9.809 +{
   9.810 +  cfnamenode *cfnptr;
   9.811 +
   9.812 +  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
   9.813 +    readcontrol(cfnptr->thename);
   9.814 +    }
   9.815 +}
   9.816 +
   9.817 +
   9.818 +/****************************************************************************
   9.819 +
   9.820 +  clearcfilelist
   9.821 +
   9.822 +  Clears the control file list.  Assumes thename does not need freeing.
   9.823 +
   9.824 +****************************************************************************/
   9.825 +
   9.826 +void clearcfilelist()
   9.827 +{
   9.828 +  cfnamenode *cfnptr1,*cfnptr2;
   9.829 +
   9.830 +  cfnptr1 = cfilelist;
   9.831 +  while (cfnptr1 != NULL) {
   9.832 +    cfnptr2 = cfnptr1->next;
   9.833 +    free(cfnptr1);
   9.834 +    cfnptr1 = cfnptr2;
   9.835 +    }
   9.836 +  cfilelist = NULL;
   9.837 +  cfilelistend = &cfilelist;
   9.838 +}
   9.839 +
   9.840 +
   9.841 +/****************************************************************************
   9.842 +
   9.843 +  getparams
   9.844 +
   9.845 +  Handles all command-line parameters.  Puts all parameters within
   9.846 +  bounds.
   9.847 +
   9.848 +****************************************************************************/
   9.849 +
   9.850 +void getparams()
   9.851 +{
   9.852 +  extern char *optarg;
   9.853 +  extern int optind;
   9.854 +  int c; /* "Should" be a char -- need int for "!= -1" test*/
   9.855 +  int columns,firstfont,infoprint;
   9.856 +  char *controlname;
   9.857 +
   9.858 +  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
   9.859 +    myname++;
   9.860 +    }
   9.861 +  else {
   9.862 +    myname = Myargv[0];
   9.863 +    }
   9.864 +  fontdirname = DEFAULTFONTDIR;
   9.865 +  firstfont = 1;
   9.866 +  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
   9.867 +  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
   9.868 +  if (suffixcmp(fontname,FONTFILESUFFIX)) {
   9.869 +    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
   9.870 +    }
   9.871 +  cfilelist = NULL;
   9.872 +  cfilelistend = &cfilelist;
   9.873 +  commandlist = NULL;
   9.874 +  commandlistend = &commandlist;
   9.875 +  smushoverride = SMO_NO;
   9.876 +  deutschflag = 0;
   9.877 +  justification = -1;
   9.878 +  right2left = -1;
   9.879 +  paragraphflag = 0;
   9.880 +  infoprint = -1;
   9.881 +  cmdinput = 0;
   9.882 +  outputwidth = DEFAULTCOLUMNS;
   9.883 +  gn[1] = 0x80;
   9.884 +  gr = 1;
   9.885 +  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
   9.886 +      /* Note: -F is not a legal option -- prints a special err message.  */
   9.887 +    switch (c) {
   9.888 +      case 'A':
   9.889 +        cmdinput = 1;
   9.890 +        break;
   9.891 +      case 'D':
   9.892 +        deutschflag = 1;
   9.893 +        break;
   9.894 +      case 'E':
   9.895 +        deutschflag = 0;
   9.896 +        break;
   9.897 +      case 'X':
   9.898 +        right2left = -1;
   9.899 +        break;
   9.900 +      case 'L':
   9.901 +        right2left = 0;
   9.902 +        break;
   9.903 +      case 'R':
   9.904 +        right2left = 1;
   9.905 +        break;
   9.906 +      case 'x':
   9.907 +        justification = -1;
   9.908 +        break;
   9.909 +      case 'l':
   9.910 +        justification = 0;
   9.911 +        break;
   9.912 +      case 'c':
   9.913 +        justification = 1;
   9.914 +        break;
   9.915 +      case 'r':
   9.916 +        justification = 2;
   9.917 +        break;
   9.918 +      case 'p':
   9.919 +        paragraphflag = 1;
   9.920 +        break;
   9.921 +      case 'n':
   9.922 +        paragraphflag = 0;
   9.923 +        break;
   9.924 +      case 's':
   9.925 +        smushoverride = SMO_NO;
   9.926 +        break;
   9.927 +      case 'k':
   9.928 +        smushmode = SM_KERN;
   9.929 +        smushoverride = SMO_YES;
   9.930 +        break;
   9.931 +      case 'S':
   9.932 +        smushmode = SM_SMUSH;
   9.933 +	smushoverride = SMO_FORCE;
   9.934 +        break;
   9.935 +      case 'o':
   9.936 +        smushmode = SM_SMUSH;
   9.937 +	smushoverride = SMO_YES;
   9.938 +        break;
   9.939 +      case 'W':
   9.940 +        smushmode = 0;
   9.941 +	smushoverride = SMO_YES;
   9.942 +        break;
   9.943 +      case 't':
   9.944 +#ifdef TIOCGWINSZ
   9.945 +        columns = get_columns();
   9.946 +        if (columns>0) {
   9.947 +          outputwidth = columns;
   9.948 +          }
   9.949 +#else /* ifdef TIOCGWINSZ */
   9.950 +        fprintf(stderr,
   9.951 +          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
   9.952 +          myname);
   9.953 +#endif /* ifdef TIOCGWINSZ */
   9.954 +        break;
   9.955 +      case 'v':
   9.956 +        infoprint = 0;
   9.957 +        break;
   9.958 +      case 'I':
   9.959 +        infoprint = atoi(optarg);
   9.960 +        break;
   9.961 +      case 'm':
   9.962 +        smushmode = atoi(optarg);
   9.963 +        if (smushmode < -1) {
   9.964 +          smushoverride = SMO_NO;
   9.965 +          break;
   9.966 +          }
   9.967 +	if (smushmode == 0) smushmode = SM_KERN;
   9.968 +	else if (smushmode == -1) smushmode = 0;
   9.969 +	else smushmode = (smushmode & 63) | SM_SMUSH;
   9.970 +	smushoverride = SMO_YES;
   9.971 +        break;
   9.972 +      case 'w':
   9.973 +        columns = atoi(optarg);
   9.974 +        if (columns>0) {
   9.975 +          outputwidth = columns;
   9.976 +          }
   9.977 +        break;
   9.978 +      case 'd':
   9.979 +        fontdirname = optarg;
   9.980 +        break;
   9.981 +      case 'f':
   9.982 +        if (firstfont) {
   9.983 +          free(fontname);
   9.984 +          firstfont = 0;
   9.985 +          }
   9.986 +        fontname = optarg;
   9.987 +        if (suffixcmp(fontname,FONTFILESUFFIX)) {
   9.988 +          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
   9.989 +          }
   9.990 +        break;
   9.991 +      case 'C':
   9.992 +        controlname = optarg;
   9.993 +        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
   9.994 +          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
   9.995 +          }
   9.996 +        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
   9.997 +        (*cfilelistend)->thename = controlname;
   9.998 +        cfilelistend = &(*cfilelistend)->next;
   9.999 +        (*cfilelistend) = NULL;
  9.1000 +        break;
  9.1001 +      case 'N':
  9.1002 +        clearcfilelist();
  9.1003 +        multibyte = 0;
  9.1004 +        gn[0] = 0;
  9.1005 +        gn[1] = 0x80;
  9.1006 +        gn[2] = gn[3] = 0;
  9.1007 +        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
  9.1008 +        gl = 0;
  9.1009 +        gr = 1;
  9.1010 +        break;
  9.1011 +      case 'F': /* Not a legal option */
  9.1012 +        fprintf(stderr,"%s: illegal option -- F\n",myname);
  9.1013 +        printusage(stderr);
  9.1014 +        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
  9.1015 +        fprintf(stderr," \"-F\" option has been\n");
  9.1016 +        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
  9.1017 +        fprintf(stderr," program, which is now\n");
  9.1018 +        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
  9.1019 +        fprintf(stderr," is also available\n");
  9.1020 +        fprintf(stderr,"from  http://www.figlet.org/");
  9.1021 +        fprintf(stderr,"under UNIX utilities.\n");
  9.1022 +        exit(1);
  9.1023 +        break;
  9.1024 +      default:
  9.1025 +        printusage(stderr);
  9.1026 +        exit(1);
  9.1027 +      }
  9.1028 +    }
  9.1029 +  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
  9.1030 +  outlinelenlimit = outputwidth-1;
  9.1031 +  if (infoprint>=0) {
  9.1032 +    printinfo(infoprint);
  9.1033 +    exit(0);
  9.1034 +    }
  9.1035 +}
  9.1036 +
  9.1037 +
  9.1038 +/****************************************************************************
  9.1039 +
  9.1040 +  clearline
  9.1041 +
  9.1042 +  Clears both the input (inchrline) and output (outputline) storage.
  9.1043 +
  9.1044 +****************************************************************************/
  9.1045 +
  9.1046 +void clearline()
  9.1047 +{
  9.1048 +  int i;
  9.1049 +
  9.1050 +  for (i=0;i<charheight;i++) {
  9.1051 +    outputline[i][0] = '\0';
  9.1052 +    }
  9.1053 +  outlinelen = 0;
  9.1054 +  inchrlinelen = 0;
  9.1055 +}
  9.1056 +
  9.1057 +
  9.1058 +/****************************************************************************
  9.1059 +
  9.1060 +  readfontchar
  9.1061 +
  9.1062 +  Reads a font character from the font file, and places it in a
  9.1063 +  newly-allocated entry in the list.
  9.1064 +
  9.1065 +****************************************************************************/
  9.1066 +
  9.1067 +void readfontchar(file,theord,line,maxlen)
  9.1068 +ZFILE *file;
  9.1069 +inchr theord;
  9.1070 +char *line;
  9.1071 +int maxlen;
  9.1072 +{
  9.1073 +  int row,k;
  9.1074 +  char endchar;
  9.1075 +  fcharnode *fclsave;
  9.1076 +
  9.1077 +  fclsave = fcharlist;
  9.1078 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
  9.1079 +  fcharlist->ord = theord;
  9.1080 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
  9.1081 +  fcharlist->next = fclsave;
  9.1082 +  for (row=0;row<charheight;row++) {
  9.1083 +    if (myfgets(line,maxlen+1,file)==NULL) {
  9.1084 +      line[0] = '\0';
  9.1085 +      }
  9.1086 +    k = MYSTRLEN(line)-1;
  9.1087 +    while (k>=0 && isspace(line[k])) {
  9.1088 +      k--;
  9.1089 +      }
  9.1090 +    if (k>=0) {
  9.1091 +      endchar = line[k];
  9.1092 +      while (k>=0 ? line[k]==endchar : 0) {
  9.1093 +        k--;
  9.1094 +        }
  9.1095 +      }
  9.1096 +    line[k+1] = '\0';
  9.1097 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
  9.1098 +    strcpy(fcharlist->thechar[row],line);
  9.1099 +    }
  9.1100 +}
  9.1101 +
  9.1102 +
  9.1103 +/****************************************************************************
  9.1104 +
  9.1105 +  readfont
  9.1106 +
  9.1107 +  Allocates memory, initializes variables, and reads in the font.
  9.1108 +  Called near beginning of main().
  9.1109 +
  9.1110 +****************************************************************************/
  9.1111 +
  9.1112 +void readfont()
  9.1113 +{
  9.1114 +#define MAXFIRSTLINELEN 1000
  9.1115 +  int i,row,numsread;
  9.1116 +  inchr theord;
  9.1117 +  int maxlen,cmtlines,ffright2left;
  9.1118 +  int smush,smush2;
  9.1119 +  char *fontpath,*fileline,magicnum[5];
  9.1120 +  ZFILE *fontfile;
  9.1121 +  int namelen;
  9.1122 +
  9.1123 +  namelen = MYSTRLEN(fontdirname);
  9.1124 +  fontpath = (char*)myalloc(sizeof(char)
  9.1125 +    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
  9.1126 +  fontfile = NULL;
  9.1127 +  if (!hasdirsep(fontname)) {
  9.1128 +    strcpy(fontpath,fontdirname);
  9.1129 +    fontpath[namelen] = DIRSEP;
  9.1130 +    fontpath[namelen+1] = '\0';
  9.1131 +    strcat(fontpath,fontname);
  9.1132 +    strcat(fontpath,FONTFILESUFFIX);
  9.1133 +    fontfile = Zopen(fontpath,"rb");
  9.1134 +    }
  9.1135 +  if (fontfile==NULL) {
  9.1136 +    strcpy(fontpath,fontname);
  9.1137 +    strcat(fontpath,FONTFILESUFFIX);
  9.1138 +    fontfile = Zopen(fontpath,"rb");
  9.1139 +    if (fontfile==NULL) {
  9.1140 +      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
  9.1141 +      exit(1);
  9.1142 +      }
  9.1143 +    }
  9.1144 +
  9.1145 +  readmagic(fontfile,magicnum);
  9.1146 +  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
  9.1147 +  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
  9.1148 +    fileline[0] = '\0';
  9.1149 +    }
  9.1150 +  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
  9.1151 +    skiptoeol(fontfile);
  9.1152 +    }
  9.1153 +  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
  9.1154 +    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
  9.1155 +    &ffright2left,&smush2);
  9.1156 +  free(fileline);
  9.1157 +  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
  9.1158 +    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
  9.1159 +    exit(1);
  9.1160 +    }
  9.1161 +  for (i=1;i<=cmtlines;i++) {
  9.1162 +    skiptoeol(fontfile);
  9.1163 +    }
  9.1164 +  free(fontpath);
  9.1165 +
  9.1166 +  if (numsread<6) {
  9.1167 +    ffright2left = 0;
  9.1168 +    }
  9.1169 +
  9.1170 +  if (numsread<7) { /* if no smush2, decode smush into smush2 */
  9.1171 +    if (smush == 0) smush2 = SM_KERN;
  9.1172 +    else if (smush < 0) smush2 = 0;
  9.1173 +    else smush2 = (smush & 31) | SM_SMUSH;
  9.1174 +    }
  9.1175 +
  9.1176 +  if (charheight<1) {
  9.1177 +    charheight = 1;
  9.1178 +    }
  9.1179 +
  9.1180 +  if (maxlen<1) {
  9.1181 +    maxlen = 1;
  9.1182 +    }
  9.1183 +
  9.1184 +  maxlen += 100; /* Give ourselves some extra room */
  9.1185 +
  9.1186 +  if (smushoverride == SMO_NO)
  9.1187 +     smushmode = smush2;
  9.1188 +  else if (smushoverride == SMO_FORCE)
  9.1189 +     smushmode |= smush2;
  9.1190 +
  9.1191 +  if (right2left<0) {
  9.1192 +    right2left = ffright2left;
  9.1193 +    }
  9.1194 +
  9.1195 +  if (justification<0) {
  9.1196 +    justification = 2*right2left;
  9.1197 +    }
  9.1198 +
  9.1199 +  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
  9.1200 +  /* Allocate "missing" character */
  9.1201 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
  9.1202 +  fcharlist->ord = 0;
  9.1203 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
  9.1204 +  fcharlist->next = NULL;
  9.1205 +  for (row=0;row<charheight;row++) {
  9.1206 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
  9.1207 +    fcharlist->thechar[row][0] = '\0';
  9.1208 +    }
  9.1209 +  for (theord=' ';theord<='~';theord++) {
  9.1210 +    readfontchar(fontfile,theord,fileline,maxlen);
  9.1211 +    }
  9.1212 +  for (theord=0;theord<=6;theord++) {
  9.1213 +    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
  9.1214 +    }
  9.1215 +  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
  9.1216 +    sscanf(fileline,"%li",&theord)==1) {
  9.1217 +    readfontchar(fontfile,theord,fileline,maxlen);
  9.1218 +    }
  9.1219 +  Zclose(fontfile);
  9.1220 +  free(fileline);
  9.1221 +}
  9.1222 +
  9.1223 +
  9.1224 +/****************************************************************************
  9.1225 +
  9.1226 +  linealloc
  9.1227 +
  9.1228 +  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
  9.1229 +  Called near beginning of main().
  9.1230 +
  9.1231 +****************************************************************************/
  9.1232 +
  9.1233 +void linealloc()
  9.1234 +{
  9.1235 +  int row; 
  9.1236 +
  9.1237 +  outputline = (char**)myalloc(sizeof(char*)*charheight);
  9.1238 +  for (row=0;row<charheight;row++) {
  9.1239 +    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
  9.1240 +    }
  9.1241 +  inchrlinelenlimit = outputwidth*4+100;
  9.1242 +  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
  9.1243 +  clearline();
  9.1244 +}
  9.1245 +
  9.1246 +
  9.1247 +/****************************************************************************
  9.1248 +
  9.1249 +  getletter
  9.1250 +
  9.1251 +  Sets currchar to point to the font entry for the given character.
  9.1252 +  Sets currcharwidth to the width of this character.
  9.1253 +
  9.1254 +****************************************************************************/
  9.1255 +
  9.1256 +void getletter(c)
  9.1257 +inchr c;
  9.1258 +{
  9.1259 +  fcharnode *charptr;
  9.1260 +
  9.1261 +  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
  9.1262 +    charptr=charptr->next) ;
  9.1263 +  if (charptr!=NULL) {
  9.1264 +    currchar = charptr->thechar;
  9.1265 +    }
  9.1266 +  else {
  9.1267 +    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
  9.1268 +      charptr=charptr->next) ;
  9.1269 +    currchar = charptr->thechar;
  9.1270 +    }
  9.1271 +  previouscharwidth = currcharwidth;
  9.1272 +  currcharwidth = MYSTRLEN(currchar[0]);
  9.1273 +}
  9.1274 +
  9.1275 +
  9.1276 +/****************************************************************************
  9.1277 +
  9.1278 +  smushem
  9.1279 +
  9.1280 +  Given 2 characters, attempts to smush them into 1, according to
  9.1281 +  smushmode.  Returns smushed character or '\0' if no smushing can be
  9.1282 +  done.
  9.1283 +
  9.1284 +  smushmode values are sum of following (all values smush blanks):
  9.1285 +    1: Smush equal chars (not hardblanks)
  9.1286 +    2: Smush '_' with any char in hierarchy below
  9.1287 +    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
  9.1288 +       Each class in hier. can be replaced by later class.
  9.1289 +    8: [ + ] -> |, { + } -> |, ( + ) -> |
  9.1290 +   16: / + \ -> X, > + < -> X (only in that order)
  9.1291 +   32: hardblank + hardblank -> hardblank
  9.1292 +
  9.1293 +****************************************************************************/
  9.1294 +
  9.1295 +char smushem(lch,rch)
  9.1296 +char lch,rch;
  9.1297 +{
  9.1298 +  if (lch==' ') return rch;
  9.1299 +  if (rch==' ') return lch;
  9.1300 +
  9.1301 +  if (previouscharwidth<2 || currcharwidth<2) return '\0';
  9.1302 +    /* Disallows overlapping if the previous character */
  9.1303 +    /* or the current character has a width of 1 or zero. */
  9.1304 +
  9.1305 +  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
  9.1306 +
  9.1307 +  if ((smushmode & 63) == 0) {
  9.1308 +    /* This is smushing by universal overlapping. */
  9.1309 +    if (lch==' ') return rch;
  9.1310 +    if (rch==' ') return lch;
  9.1311 +    if (lch==hardblank) return rch;
  9.1312 +    if (rch==hardblank) return lch;
  9.1313 +      /* Above four lines ensure overlapping preference to */
  9.1314 +      /* visible characters. */
  9.1315 +    if (right2left==1) return lch;
  9.1316 +      /* Above line ensures that the dominant (foreground) */
  9.1317 +      /* fig-character for overlapping is the latter in the */
  9.1318 +      /* user's text, not necessarily the rightmost character. */
  9.1319 +    return rch;
  9.1320 +      /* Occurs in the absence of above exceptions. */
  9.1321 +    }
  9.1322 +  
  9.1323 +  if (smushmode & SM_HARDBLANK) {
  9.1324 +    if (lch==hardblank && rch==hardblank) return lch;
  9.1325 +    }
  9.1326 +
  9.1327 +  if (lch==hardblank || rch==hardblank) return '\0';
  9.1328 +
  9.1329 +  if (smushmode & SM_EQUAL) {
  9.1330 +    if (lch==rch) return lch;
  9.1331 +    }
  9.1332 +
  9.1333 +  if (smushmode & SM_LOWLINE) {
  9.1334 +    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
  9.1335 +    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
  9.1336 +    }
  9.1337 +
  9.1338 +  if (smushmode & SM_HIERARCHY) {
  9.1339 +    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
  9.1340 +    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
  9.1341 +    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
  9.1342 +    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
  9.1343 +    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
  9.1344 +    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
  9.1345 +    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
  9.1346 +    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
  9.1347 +    if (strchr("()",lch) && strchr("<>",rch)) return rch;
  9.1348 +    if (strchr("()",rch) && strchr("<>",lch)) return lch;
  9.1349 +    }
  9.1350 +
  9.1351 +  if (smushmode & SM_PAIR) {
  9.1352 +    if (lch=='[' && rch==']') return '|';
  9.1353 +    if (rch=='[' && lch==']') return '|';
  9.1354 +    if (lch=='{' && rch=='}') return '|';
  9.1355 +    if (rch=='{' && lch=='}') return '|';
  9.1356 +    if (lch=='(' && rch==')') return '|';
  9.1357 +    if (rch=='(' && lch==')') return '|';
  9.1358 +    }
  9.1359 +
  9.1360 +  if (smushmode & SM_BIGX) {
  9.1361 +    if (lch=='/' && rch=='\\') return '|';
  9.1362 +    if (rch=='/' && lch=='\\') return 'Y';
  9.1363 +    if (lch=='>' && rch=='<') return 'X';
  9.1364 +      /* Don't want the reverse of above to give 'X'. */
  9.1365 +    }
  9.1366 +
  9.1367 +  return '\0';
  9.1368 +}
  9.1369 +
  9.1370 +
  9.1371 +/****************************************************************************
  9.1372 +
  9.1373 +  smushamt
  9.1374 +
  9.1375 +  Returns the maximum amount that the current character can be smushed
  9.1376 +  into the current line.
  9.1377 +
  9.1378 +****************************************************************************/
  9.1379 +
  9.1380 +int smushamt()
  9.1381 +{
  9.1382 +  int maxsmush,amt;
  9.1383 +  int row,linebd,charbd;
  9.1384 +  char ch1,ch2;
  9.1385 +
  9.1386 +  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
  9.1387 +    return 0;
  9.1388 +    }
  9.1389 +  maxsmush = currcharwidth;
  9.1390 +  for (row=0;row<charheight;row++) {
  9.1391 +    if (right2left) {
  9.1392 +      for (charbd=MYSTRLEN(currchar[row]);
  9.1393 +        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
  9.1394 +      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
  9.1395 +      amt = linebd+currcharwidth-1-charbd;
  9.1396 +      }
  9.1397 +    else {
  9.1398 +      for (linebd=MYSTRLEN(outputline[row]);
  9.1399 +        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
  9.1400 +      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
  9.1401 +      amt = charbd+outlinelen-1-linebd;
  9.1402 +      }
  9.1403 +    if (!ch1||ch1==' ') {
  9.1404 +      amt++;
  9.1405 +      }
  9.1406 +    else if (ch2) {
  9.1407 +      if (smushem(ch1,ch2)!='\0') {
  9.1408 +        amt++;
  9.1409 +        }
  9.1410 +      }
  9.1411 +    if (amt<maxsmush) {
  9.1412 +      maxsmush = amt;
  9.1413 +      }
  9.1414 +    }
  9.1415 +  return maxsmush;
  9.1416 +}
  9.1417 +
  9.1418 +
  9.1419 +/****************************************************************************
  9.1420 +
  9.1421 +  addchar
  9.1422 +
  9.1423 +  Attempts to add the given character onto the end of the current line.
  9.1424 +  Returns 1 if this can be done, 0 otherwise.
  9.1425 +
  9.1426 +****************************************************************************/
  9.1427 +
  9.1428 +int addchar(c)
  9.1429 +inchr c;
  9.1430 +{
  9.1431 +  int smushamount,row,k;
  9.1432 +  char *templine;
  9.1433 +
  9.1434 +  getletter(c);
  9.1435 +  smushamount = smushamt();
  9.1436 +  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
  9.1437 +      ||inchrlinelen+1>inchrlinelenlimit) {
  9.1438 +    return 0;
  9.1439 +    }
  9.1440 +
  9.1441 +  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
  9.1442 +  for (row=0;row<charheight;row++) {
  9.1443 +    if (right2left) {
  9.1444 +      strcpy(templine,currchar[row]);
  9.1445 +      for (k=0;k<smushamount;k++) {
  9.1446 +        templine[currcharwidth-smushamount+k] =
  9.1447 +          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
  9.1448 +        }
  9.1449 +      strcat(templine,outputline[row]+smushamount);
  9.1450 +      strcpy(outputline[row],templine);
  9.1451 +      }
  9.1452 +    else {
  9.1453 +      for (k=0;k<smushamount;k++) {
  9.1454 +        outputline[row][outlinelen-smushamount+k] =
  9.1455 +          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
  9.1456 +        }
  9.1457 +      strcat(outputline[row],currchar[row]+smushamount);
  9.1458 +      }
  9.1459 +    }
  9.1460 +  free(templine);
  9.1461 +  outlinelen = MYSTRLEN(outputline[0]);
  9.1462 +  inchrline[inchrlinelen++] = c;
  9.1463 +  return 1;
  9.1464 +}
  9.1465 +
  9.1466 +
  9.1467 +/****************************************************************************
  9.1468 +
  9.1469 +  putstring
  9.1470 +
  9.1471 +  Prints out the given null-terminated string, substituting blanks
  9.1472 +  for hardblanks.  If outputwidth is 1, prints the entire string;
  9.1473 +  otherwise prints at most outputwidth-1 characters.  Prints a newline
  9.1474 +  at the end of the string.  The string is left-justified, centered or
  9.1475 +  right-justified (taking outputwidth as the screen width) if
  9.1476 +  justification is 0, 1 or 2, respectively.
  9.1477 +
  9.1478 +****************************************************************************/
  9.1479 +
  9.1480 +static int nr_chars=0;
  9.1481 +static void myputchar(unsigned char c)
  9.1482 +{
  9.1483 +    static int startline = 1;
  9.1484 +
  9.1485 +    if ( startline )
  9.1486 +    {
  9.1487 +        startline = 0;
  9.1488 +        myputchar(' ');
  9.1489 +    }
  9.1490 +
  9.1491 +    putc(c, stderr);
  9.1492 +
  9.1493 +    if ( nr_chars == 0 )
  9.1494 +        putchar('"');
  9.1495 +
  9.1496 +    putchar('\\');
  9.1497 +    putchar('0' + ((c>>6)&7));
  9.1498 +    putchar('0' + ((c>>3)&7));
  9.1499 +    putchar('0' + ((c>>0)&7));
  9.1500 +
  9.1501 +    if ( c == '\n' )
  9.1502 +        startline = 1;
  9.1503 +
  9.1504 +    if ( ++nr_chars == 18 ) 
  9.1505 +    {
  9.1506 +        nr_chars = 0;
  9.1507 +        putchar('"');
  9.1508 +        putchar(' ');
  9.1509 +        putchar('\\');
  9.1510 +        putchar('\n');
  9.1511 +    }
  9.1512 +}
  9.1513 +
  9.1514 +void putstring(string)
  9.1515 +char *string;
  9.1516 +{
  9.1517 +  int i,len;
  9.1518 +
  9.1519 +  len = MYSTRLEN(string);
  9.1520 +  if (outputwidth>1) {
  9.1521 +    if (len>outputwidth-1) {
  9.1522 +      len = outputwidth-1;
  9.1523 +      }
  9.1524 +    if (justification>0) {
  9.1525 +      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
  9.1526 +        myputchar(' ');
  9.1527 +        }
  9.1528 +      }
  9.1529 +    }
  9.1530 +  for (i=0;i<len;i++) {
  9.1531 +    myputchar(string[i]==hardblank?' ':string[i]);
  9.1532 +    }
  9.1533 +  myputchar('\n');
  9.1534 +}
  9.1535 +
  9.1536 +
  9.1537 +/****************************************************************************
  9.1538 +
  9.1539 +  printline
  9.1540 +
  9.1541 +  Prints outputline using putstring, then clears the current line.
  9.1542 +
  9.1543 +****************************************************************************/
  9.1544 +
  9.1545 +void printline()
  9.1546 +{
  9.1547 +  int i;
  9.1548 +
  9.1549 +  for (i=0;i<charheight;i++) {
  9.1550 +    putstring(outputline[i]);
  9.1551 +    }
  9.1552 +  clearline();
  9.1553 +}
  9.1554 +
  9.1555 +
  9.1556 +/****************************************************************************
  9.1557 +
  9.1558 +  splitline
  9.1559 +
  9.1560 +  Splits inchrline at the last word break (bunch of consecutive blanks).
  9.1561 +  Makes a new line out of the first part and prints it using
  9.1562 +  printline.  Makes a new line out of the second part and returns.
  9.1563 +
  9.1564 +****************************************************************************/
  9.1565 +
  9.1566 +void splitline()
  9.1567 +{
  9.1568 +  int i,gotspace,lastspace,len1,len2;
  9.1569 +  inchr *part1,*part2;
  9.1570 +
  9.1571 +  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
  9.1572 +  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
  9.1573 +  gotspace = 0;
  9.1574 +  for (i=inchrlinelen-1;i>=0;i--) {
  9.1575 +    if (!gotspace && inchrline[i]==' ') {
  9.1576 +      gotspace = 1;
  9.1577 +      lastspace = i;
  9.1578 +      }
  9.1579 +    if (gotspace && inchrline[i]!=' ') {
  9.1580 +      break;
  9.1581 +      }
  9.1582 +    }
  9.1583 +  len1 = i+1;
  9.1584 +  len2 = inchrlinelen-lastspace-1;
  9.1585 +  for (i=0;i<len1;i++) {
  9.1586 +    part1[i] = inchrline[i];
  9.1587 +    }
  9.1588 +  for (i=0;i<len2;i++) {
  9.1589 +    part2[i] = inchrline[lastspace+1+i];
  9.1590 +    }
  9.1591 +  clearline();
  9.1592 +  for (i=0;i<len1;i++) {
  9.1593 +    addchar(part1[i]);
  9.1594 +    }
  9.1595 +  printline();
  9.1596 +  for (i=0;i<len2;i++) {
  9.1597 +    addchar(part2[i]);
  9.1598 +    }
  9.1599 +  free(part1);
  9.1600 +  free(part2);
  9.1601 +}
  9.1602 +
  9.1603 +
  9.1604 +/****************************************************************************
  9.1605 +
  9.1606 +  handlemapping
  9.1607 +
  9.1608 +  Given an input character (type inchr), executes re-mapping commands
  9.1609 +  read from control files.  Returns re-mapped character (inchr).
  9.1610 +
  9.1611 +****************************************************************************/
  9.1612 +
  9.1613 +inchr handlemapping(c)
  9.1614 +inchr c;
  9.1615 +{
  9.1616 +  comnode *cmptr;
  9.1617 +
  9.1618 +  cmptr=commandlist;
  9.1619 +  while (cmptr!=NULL) {
  9.1620 +    if (cmptr->thecommand ?
  9.1621 +      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
  9.1622 +      c += cmptr->offset;
  9.1623 +      while(cmptr!=NULL ? cmptr->thecommand : 0) {
  9.1624 +        cmptr=cmptr->next;
  9.1625 +        }
  9.1626 +      }
  9.1627 +    else {
  9.1628 +      cmptr=cmptr->next;
  9.1629 +      }
  9.1630 +    }
  9.1631 +  return c;
  9.1632 +}
  9.1633 +
  9.1634 +/****************************************************************************
  9.1635 +
  9.1636 +  Agetchar
  9.1637 +
  9.1638 +  Replacement to getchar().
  9.1639 +  Acts exactly like getchar if -A is NOT specified,
  9.1640 +  else obtains input from All remaining command line words.
  9.1641 +
  9.1642 +****************************************************************************/
  9.1643 +
  9.1644 +int Agetchar()
  9.1645 +{
  9.1646 +    extern int optind;		/* current argv[] element under study */
  9.1647 +    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
  9.1648 +    char   *arg;		/* pointer to active character */
  9.1649 +    int    c;			/* current character */
  9.1650 +
  9.1651 +    if ( ! cmdinput )		/* is -A active? */
  9.1652 +	return( getchar() );	/* no: return stdin character */
  9.1653 +
  9.1654 +    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
  9.1655 +	return( EOF );		/* **ensure it now and forever more */
  9.1656 +
  9.1657 +    /* find next character */
  9.1658 +    arg = Myargv[optind];		/* pointer to active arg */
  9.1659 +    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
  9.1660 +
  9.1661 +    if ( ! c )			/* at '\0' that terminates word? */
  9.1662 +    {   /* at end of word: return ' ' if normal word, '\n' if empty */
  9.1663 +	c = ' ';		/* suppose normal word and return blank */
  9.1664 +	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
  9.1665 +	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
  9.1666 +	AgetMode = 0;		/* return to char 0 in NEXT word */
  9.1667 +	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
  9.1668 +	{   /* just ran out of arguments */
  9.1669 +	    c = EOF;		/* return EOF */
  9.1670 +	    AgetMode = -1;	/* ensure all future returns return EOF */
  9.1671 +	}
  9.1672 +    }
  9.1673 +
  9.1674 +    return( c );		/* return appropriate character */
  9.1675 +
  9.1676 +}	/* end: Agetchar() */
  9.1677 +
  9.1678 +
  9.1679 +/****************************************************************************
  9.1680 +
  9.1681 +  iso2022
  9.1682 +
  9.1683 +  Called by getinchr.  Interprets ISO 2022 sequences
  9.1684 +
  9.1685 +******************************************************************************/
  9.1686 +
  9.1687 +inchr iso2022()
  9.1688 +{
  9.1689 +  inchr ch;
  9.1690 +  inchr ch2;
  9.1691 +  int save_gl;
  9.1692 +  int save_gr;
  9.1693 +
  9.1694 +  ch = Agetchar();
  9.1695 +  if (ch == EOF) return ch;
  9.1696 +  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
  9.1697 +  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
  9.1698 +  switch (ch) {
  9.1699 +    case 14: /* invoke G0 into GL */
  9.1700 +      gl = 0;
  9.1701 +      return iso2022();
  9.1702 +    case 15: /* invoke G1 into GL */
  9.1703 +      gl = 1;
  9.1704 +      return iso2022();
  9.1705 +    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
  9.1706 +      save_gl = gl; save_gr = gr;
  9.1707 +      gl = gr = 2;
  9.1708 +      ch = iso2022();
  9.1709 +      gl = save_gl; gr = save_gr;
  9.1710 +      return ch;
  9.1711 +    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
  9.1712 +      save_gl = gl; save_gr = gr;
  9.1713 +      gl = gr = 3;
  9.1714 +      ch = iso2022();
  9.1715 +      gl = save_gl; gr = save_gr;
  9.1716 +      return ch;
  9.1717 +    case 'n' + 0x100: /* invoke G2 into GL */
  9.1718 +      gl = 2;
  9.1719 +      return iso2022();
  9.1720 +    case 'o' + 0x100: /* invoke G3 into GL */
  9.1721 +      gl = 3;
  9.1722 +      return iso2022();
  9.1723 +    case '~' + 0x100: /* invoke G1 into GR */
  9.1724 +      gr = 1;
  9.1725 +      return iso2022();
  9.1726 +    case '}' + 0x100: /* invoke G2 into GR */
  9.1727 +      gr = 2;
  9.1728 +      return iso2022();
  9.1729 +    case '|' + 0x100: /* invoke G3 into GR */
  9.1730 +      gr = 3;
  9.1731 +      return iso2022();
  9.1732 +    case '(' + 0x100: /* set G0 to 94-char set */
  9.1733 +      ch = Agetchar();
  9.1734 +      if (ch == 'B') ch = 0; /* ASCII */
  9.1735 +      gn[0] = ch << 16;
  9.1736 +      gndbl[0] = 0;
  9.1737 +      return iso2022();
  9.1738 +    case ')' + 0x100: /* set G1 to 94-char set */
  9.1739 +      ch = Agetchar();
  9.1740 +      if (ch == 'B') ch = 0;
  9.1741 +      gn[1] = ch << 16;
  9.1742 +      gndbl[1] = 0;
  9.1743 +      return iso2022();
  9.1744 +    case '*' + 0x100: /* set G2 to 94-char set */
  9.1745 +      ch = Agetchar();
  9.1746 +      if (ch == 'B') ch = 0;
  9.1747 +      gn[2] = ch << 16;
  9.1748 +      gndbl[2] = 0;
  9.1749 +      return iso2022();
  9.1750 +    case '+' + 0x100: /* set G3 to 94-char set */
  9.1751 +      ch = Agetchar();
  9.1752 +      if (ch == 'B') ch = 0;
  9.1753 +      gn[3] = ch << 16;
  9.1754 +      gndbl[3] = 0;
  9.1755 +      return iso2022();
  9.1756 +    case '-' + 0x100: /* set G1 to 96-char set */
  9.1757 +      ch = Agetchar();
  9.1758 +      if (ch == 'A') ch = 0; /* Latin-1 top half */
  9.1759 +      gn[1] = (ch << 16) | 0x80;
  9.1760 +      gndbl[1] = 0;
  9.1761 +      return iso2022();
  9.1762 +    case '.' + 0x100: /* set G2 to 96-char set */
  9.1763 +      ch = Agetchar();
  9.1764 +      if (ch == 'A') ch = 0;
  9.1765 +      gn[2] = (ch << 16) | 0x80;
  9.1766 +      gndbl[2] = 0;
  9.1767 +      return iso2022();
  9.1768 +    case '/' + 0x100: /* set G3 to 96-char set */
  9.1769 +      ch = Agetchar();
  9.1770 +      if (ch == 'A') ch = 0;
  9.1771 +      gn[3] = (ch << 16) | 0x80;
  9.1772 +      gndbl[3] = 0;
  9.1773 +      return iso2022();
  9.1774 +    case '(' + 0x200: /* set G0 to 94 x 94 char set */
  9.1775 +      ch = Agetchar();
  9.1776 +      gn[0] = ch << 16;
  9.1777 +      gndbl[0] = 1;
  9.1778 +      return iso2022();
  9.1779 +    case ')' + 0x200: /* set G1 to 94 x 94 char set */
  9.1780 +      ch = Agetchar();
  9.1781 +      gn[1] = ch << 16;
  9.1782 +      gndbl[1] = 1;
  9.1783 +      return iso2022();
  9.1784 +    case '*' + 0x200: /* set G2 to 94 x 94 char set */
  9.1785 +      ch = Agetchar();
  9.1786 +      gn[2] = ch << 16;
  9.1787 +      gndbl[2] = 1;
  9.1788 +      return iso2022();
  9.1789 +    case '+' + 0x200: /* set G3 to 94 x 94 char set */
  9.1790 +      ch = Agetchar();
  9.1791 +      gn[3] = ch << 16;
  9.1792 +      gndbl[3] = 1;
  9.1793 +      return iso2022();
  9.1794 +    default:
  9.1795 +      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
  9.1796 +        gn[0] = (ch & ~0x200) << 16;
  9.1797 +        gndbl[0] = 1;
  9.1798 +        return iso2022();
  9.1799 +        }
  9.1800 +      }
  9.1801 +
  9.1802 +  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
  9.1803 +    if (gndbl[gl]) {
  9.1804 +      ch2 = Agetchar();
  9.1805 +      return gn[gl] | (ch << 8) | ch2;
  9.1806 +      }
  9.1807 +    else return gn[gl] | ch;
  9.1808 +    }
  9.1809 +  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
  9.1810 +    if (gndbl[gr]) {
  9.1811 +      ch2 = Agetchar();
  9.1812 +      return gn[gr] | (ch << 8) | ch2;
  9.1813 +      }
  9.1814 +    else return gn[gr] | (ch & ~0x80);
  9.1815 +    }
  9.1816 +  else return ch;
  9.1817 +  }
  9.1818 +
  9.1819 +/****************************************************************************
  9.1820 +
  9.1821 +  ungetinchr
  9.1822 +
  9.1823 +  Called by main.  Pushes back an "inchr" to be read by getinchr
  9.1824 +  on the next call.
  9.1825 +
  9.1826 +******************************************************************************/
  9.1827 +inchr getinchr_buffer;
  9.1828 +int getinchr_flag;
  9.1829 +
  9.1830 +inchr ungetinchr(c)
  9.1831 +inchr c;
  9.1832 +{
  9.1833 +  getinchr_buffer = c;
  9.1834 +  getinchr_flag = 1;
  9.1835 +  return c;
  9.1836 +}
  9.1837 +
  9.1838 +/*****************************************************************************
  9.1839 +
  9.1840 +  getinchr
  9.1841 +
  9.1842 +  Called by main.  Processes multibyte characters.  Invokes Agetchar.
  9.1843 +  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
  9.1844 +  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
  9.1845 +    0x80-0xFF bytes are first byte of a double-byte character).
  9.1846 +  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
  9.1847 +    0x80-0xBF bytes are nonfirst byte of a multibyte character,
  9.1848 +    0xC0-0xFD bytes are first byte of a multibyte character,
  9.1849 +    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
  9.1850 +  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
  9.1851 +    "~~" is a tilde, "~x" for all other x is ignored).
  9.1852 +  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
  9.1853 +    of a double-byte character, all other bytes are characters).
  9.1854 + 
  9.1855 +
  9.1856 +*****************************************************************************/
  9.1857 +
  9.1858 +inchr getinchr()
  9.1859 +{
  9.1860 +  int ch, ch2, ch3, ch4, ch5, ch6;
  9.1861 +
  9.1862 +  if (getinchr_flag) {
  9.1863 +    getinchr_flag = 0;
  9.1864 +    return getinchr_buffer;
  9.1865 +    }
  9.1866 +
  9.1867 +  switch(multibyte) {
  9.1868 +    case 0: /* single-byte */
  9.1869 +      return iso2022();
  9.1870 +   case 1: /* DBCS */
  9.1871 +     ch = Agetchar();
  9.1872 +     if ((ch >= 0x80 && ch <= 0x9F) ||
  9.1873 +         (ch >= 0xE0 && ch <= 0xEF)) {
  9.1874 +       ch = (ch << 8) + Agetchar();
  9.1875 +       }
  9.1876 +     return ch;
  9.1877 +   case 2: /* UTF-8 */
  9.1878 +      ch = Agetchar();
  9.1879 +      if (ch < 0x80) return ch;  /* handles EOF, too */
  9.1880 +      if (ch < 0xC0 || ch > 0xFD)
  9.1881 +        return 0x0080;  /* illegal first character */
  9.1882 +      ch2 = Agetchar() & 0x3F;
  9.1883 +      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
  9.1884 +      ch3 = Agetchar() & 0x3F;
  9.1885 +      if (ch < 0xF0)
  9.1886 +        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
  9.1887 +      ch4 = Agetchar() & 0x3F;
  9.1888 +      if (ch < 0xF8)
  9.1889 +        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
  9.1890 +      ch5 = Agetchar() & 0x3F;
  9.1891 +      if (ch < 0xFC)
  9.1892 +        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
  9.1893 +          (ch4 << 6) + ch5;
  9.1894 +      ch6 = Agetchar() & 0x3F;
  9.1895 +      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
  9.1896 +        (ch4 << 12) + (ch5 << 6) + ch6;
  9.1897 +   case 3: /* HZ */
  9.1898 +     ch = Agetchar();
  9.1899 +     if (ch == EOF) return ch;
  9.1900 +     if (hzmode) {
  9.1901 +       ch = (ch << 8) + Agetchar();
  9.1902 +       if (ch == ('}' << 8) + '~') {
  9.1903 +         hzmode = 0;
  9.1904 +         return getinchr();
  9.1905 +         }
  9.1906 +       return ch;
  9.1907 +       }
  9.1908 +     else if (ch == '~') {
  9.1909 +       ch = Agetchar();
  9.1910 +       if (ch == '{') {
  9.1911 +          hzmode = 1;
  9.1912 +          return getinchr();
  9.1913 +          }
  9.1914 +      else if (ch == '~') {
  9.1915 +        return ch;
  9.1916 +        }
  9.1917 +      else {
  9.1918 +        return getinchr();
  9.1919 +        }
  9.1920 +      }
  9.1921 +     else return ch;
  9.1922 +   case 4: /* Shift-JIS */
  9.1923 +     ch = Agetchar();
  9.1924 +     if ((ch >= 0x80 && ch <= 0x9F) ||
  9.1925 +         (ch >= 0xE0 && ch <= 0xEF)) {
  9.1926 +       ch = (ch << 8) + Agetchar();
  9.1927 +       }
  9.1928 +     return ch;
  9.1929 +   default:
  9.1930 +     return 0x80;
  9.1931 +    }
  9.1932 +  }
  9.1933 +
  9.1934 +/****************************************************************************
  9.1935 +
  9.1936 +  main
  9.1937 +
  9.1938 +  The main program, of course.
  9.1939 +  Reads characters 1 by 1 from stdin, and makes lines out of them using
  9.1940 +  addchar. Handles line breaking, (which accounts for most of the
  9.1941 +  complexity in this function).
  9.1942 +
  9.1943 +****************************************************************************/
  9.1944 +
  9.1945 +int main(argc,argv)
  9.1946 +int argc;
  9.1947 +char *argv[];
  9.1948 +{
  9.1949 +  inchr c,c2;
  9.1950 +  int i;
  9.1951 +  int last_was_eol_flag;
  9.1952 +/*---------------------------------------------------------------------------
  9.1953 +  wordbreakmode:
  9.1954 +    -1: /^$/ and blanks are to be absorbed (when line break was forced
  9.1955 +      by a blank or character larger than outlinelenlimit)
  9.1956 +    0: /^ *$/ and blanks are not to be absorbed
  9.1957 +    1: /[^ ]$/ no word break yet
  9.1958 +    2: /[^ ]  *$/
  9.1959 +    3: /[^ ]$/ had a word break
  9.1960 +---------------------------------------------------------------------------*/
  9.1961 +  int wordbreakmode;
  9.1962 +  int char_not_added;
  9.1963 +
  9.1964 +  Myargc = argc;
  9.1965 +  Myargv = argv;
  9.1966 +  getparams();
  9.1967 +  readcontrolfiles();
  9.1968 +  readfont();
  9.1969 +  linealloc();
  9.1970 +
  9.1971 +  wordbreakmode = 0;
  9.1972 +  last_was_eol_flag = 0;
  9.1973 +
  9.1974 +  while ((c = getinchr())!=EOF) {
  9.1975 +
  9.1976 +    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
  9.1977 +      ungetinchr(c2 = getinchr());
  9.1978 +      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
  9.1979 +      }
  9.1980 +    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
  9.1981 +
  9.1982 +    if (deutschflag) {
  9.1983 +      if (c>='[' && c<=']') {
  9.1984 +        c = deutsch[c-'['];
  9.1985 +        }
  9.1986 +      else if (c >='{' && c <= '~') {
  9.1987 +        c = deutsch[c-'{'+3];
  9.1988 +        }
  9.1989 +      }
  9.1990 +
  9.1991 +    c = handlemapping(c);
  9.1992 +
  9.1993 +    if (isascii(c)&&isspace(c)) {
  9.1994 +      c = (c=='\t'||c==' ') ? ' ' : '\n';
  9.1995 +      }
  9.1996 +
  9.1997 +    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
  9.1998 +
  9.1999 +/*
  9.2000 +  Note: The following code is complex and thoroughly tested.
  9.2001 +  Be careful when modifying!
  9.2002 +*/
  9.2003 +
  9.2004 +    do {
  9.2005 +      char_not_added = 0;
  9.2006 +
  9.2007 +      if (wordbreakmode== -1) {
  9.2008 +        if (c==' ') {
  9.2009 +          break;
  9.2010 +          }
  9.2011 +        else if (c=='\n') {
  9.2012 +          wordbreakmode = 0;
  9.2013 +          break;
  9.2014 +          }
  9.2015 +        wordbreakmode = 0;
  9.2016 +        }
  9.2017 +
  9.2018 +      if (c=='\n') {
  9.2019 +        printline();
  9.2020 +        wordbreakmode = 0;
  9.2021 +        }
  9.2022 +
  9.2023 +      else if (addchar(c)) {
  9.2024 +        if (c!=' ') {
  9.2025 +          wordbreakmode = (wordbreakmode>=2)?3:1;
  9.2026 +          }
  9.2027 +        else {
  9.2028 +          wordbreakmode = (wordbreakmode>0)?2:0;
  9.2029 +          }
  9.2030 +        }
  9.2031 +
  9.2032 +      else if (outlinelen==0) {
  9.2033 +        for (i=0;i<charheight;i++) {
  9.2034 +          if (right2left && outputwidth>1) {
  9.2035 +            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
  9.2036 +            }
  9.2037 +          else {
  9.2038 +            putstring(currchar[i]);
  9.2039 +            }
  9.2040 +          }
  9.2041 +        wordbreakmode = -1;
  9.2042 +        }
  9.2043 +
  9.2044 +      else if (c==' ') {
  9.2045 +        if (wordbreakmode==2) {
  9.2046 +          splitline();
  9.2047 +          }
  9.2048 +        else {
  9.2049 +          printline();
  9.2050 +          }
  9.2051 +        wordbreakmode = -1;
  9.2052 +        }
  9.2053 +
  9.2054 +      else {
  9.2055 +        if (wordbreakmode>=2) {
  9.2056 +          splitline();
  9.2057 +          }
  9.2058 +        else {
  9.2059 +          printline();
  9.2060 +          }
  9.2061 +        wordbreakmode = (wordbreakmode==3)?1:0;
  9.2062 +        char_not_added = 1;
  9.2063 +        }
  9.2064 +
  9.2065 +      } while (char_not_added);
  9.2066 +    }
  9.2067 +
  9.2068 +  if (outlinelen!=0) {
  9.2069 +    printline();
  9.2070 +    }
  9.2071 +
  9.2072 +  /* XXX Xen hack -- finish off the C macro output */
  9.2073 +  if ( nr_chars != 0 )
  9.2074 +      putchar('"');
  9.2075 +  putchar('\n');
  9.2076 +
  9.2077 +  exit(0);
  9.2078 +}
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/xen/tools/figlet/xen.flf	Sat May 03 13:47:58 2003 +0000
    10.3 @@ -0,0 +1,2230 @@
    10.4 +flf2a$ 6 5 16 15 14 0 24463 229
    10.5 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    10.6 +Includes ISO Latin-1
    10.7 +figlet release 2.1 -- 12 Aug 1994
    10.8 +Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    10.9 +  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   10.10 +Permission is hereby given to modify this font, as long as the
   10.11 +modifier's name is placed on a comment line.
   10.12 +
   10.13 +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   10.14 +supported by FIGlet and FIGWin.  May also be slightly modified for better use
   10.15 +of new full-width/kern/smush alternatives, but default output is NOT changed.
   10.16 +
   10.17 +Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   10.18 +
   10.19 + $@
   10.20 + $@
   10.21 + $@
   10.22 + $@
   10.23 + $@
   10.24 + $@@
   10.25 +  _ @
   10.26 + | |@
   10.27 + | |@
   10.28 + |_|@
   10.29 + (_)@
   10.30 +    @@
   10.31 +  _ _ @
   10.32 + ( | )@
   10.33 +  V V @
   10.34 +   $  @
   10.35 +   $  @
   10.36 +      @@
   10.37 +    _  _   @
   10.38 +  _| || |_ @
   10.39 + |_  ..  _|@
   10.40 + |_      _|@
   10.41 +   |_||_|  @
   10.42 +           @@
   10.43 +   _  @
   10.44 +  | | @
   10.45 + / __)@
   10.46 + \__ \@
   10.47 + (   /@
   10.48 +  |_| @@
   10.49 +  _  __@
   10.50 + (_)/ /@
   10.51 +   / / @
   10.52 +  / /_ @
   10.53 + /_/(_)@
   10.54 +       @@
   10.55 +   ___   @
   10.56 +  ( _ )  @
   10.57 +  / _ \/\@
   10.58 + | (_>  <@
   10.59 +  \___/\/@
   10.60 +         @@
   10.61 +  _ @
   10.62 + ( )@
   10.63 + |/ @
   10.64 +  $ @
   10.65 +  $ @
   10.66 +    @@
   10.67 +   __@
   10.68 +  / /@
   10.69 + | | @
   10.70 + | | @
   10.71 + | | @
   10.72 +  \_\@@
   10.73 + __  @
   10.74 + \ \ @
   10.75 +  | |@
   10.76 +  | |@
   10.77 +  | |@
   10.78 + /_/ @@
   10.79 +       @
   10.80 + __/\__@
   10.81 + \    /@
   10.82 + /_  _\@
   10.83 +   \/  @
   10.84 +       @@
   10.85 +        @
   10.86 +    _   @
   10.87 +  _| |_ @
   10.88 + |_   _|@
   10.89 +   |_|  @
   10.90 +        @@
   10.91 +    @
   10.92 +    @
   10.93 +    @
   10.94 +  _ @
   10.95 + ( )@
   10.96 + |/ @@
   10.97 +     @
   10.98 +     @
   10.99 +  __ @
  10.100 + |__|@
  10.101 +  $  @
  10.102 +     @@
  10.103 +    @
  10.104 +    @
  10.105 +    @
  10.106 +  _ @
  10.107 + (_)@
  10.108 +    @@
  10.109 +     __@
  10.110 +    / /@
  10.111 +   / / @
  10.112 +  / /  @
  10.113 + /_/   @
  10.114 +       @@
  10.115 +   ___  @
  10.116 +  / _ \ @
  10.117 + | | | |@
  10.118 + | |_| |@
  10.119 +  \___/ @
  10.120 +        @@
  10.121 +  _ @
  10.122 + / |@
  10.123 + | |@
  10.124 + | |@
  10.125 + |_|@
  10.126 +    @@
  10.127 +  ____  @
  10.128 + |___ \ @
  10.129 +   __) |@
  10.130 +  / __/ @
  10.131 + |_____|@
  10.132 +        @@
  10.133 +  _____ @
  10.134 + |___ / @
  10.135 +   |_ \ @
  10.136 +  ___) |@
  10.137 + |____/ @
  10.138 +        @@
  10.139 +  _  _   @
  10.140 + | || |  @
  10.141 + | || |_ @
  10.142 + |__   _|@
  10.143 +    |_|  @
  10.144 +         @@
  10.145 +  ____  @
  10.146 + | ___| @
  10.147 + |___ \ @
  10.148 +  ___) |@
  10.149 + |____/ @
  10.150 +        @@
  10.151 +   __   @
  10.152 +  / /_  @
  10.153 + | '_ \ @
  10.154 + | (_) |@
  10.155 +  \___/ @
  10.156 +        @@
  10.157 +  _____ @
  10.158 + |___  |@
  10.159 +    / / @
  10.160 +   / /  @
  10.161 +  /_/   @
  10.162 +        @@
  10.163 +   ___  @
  10.164 +  ( _ ) @
  10.165 +  / _ \ @
  10.166 + | (_) |@
  10.167 +  \___/ @
  10.168 +        @@
  10.169 +   ___  @
  10.170 +  / _ \ @
  10.171 + | (_) |@
  10.172 +  \__, |@
  10.173 +    /_/ @
  10.174 +        @@
  10.175 +    @
  10.176 +  _ @
  10.177 + (_)@
  10.178 +  _ @
  10.179 + (_)@
  10.180 +    @@
  10.181 +    @
  10.182 +  _ @
  10.183 + (_)@
  10.184 +  _ @
  10.185 + ( )@
  10.186 + |/ @@
  10.187 +   __@
  10.188 +  / /@
  10.189 + / / @
  10.190 + \ \ @
  10.191 +  \_\@
  10.192 +     @@
  10.193 +        @
  10.194 +  _____ @
  10.195 + |_____|@
  10.196 + |_____|@
  10.197 +    $   @
  10.198 +        @@
  10.199 + __  @
  10.200 + \ \ @
  10.201 +  \ \@
  10.202 +  / /@
  10.203 + /_/ @
  10.204 +     @@
  10.205 +  ___ @
  10.206 + |__ \@
  10.207 +   / /@
  10.208 +  |_| @
  10.209 +  (_) @
  10.210 +      @@
  10.211 +    ____  @
  10.212 +   / __ \ @
  10.213 +  / / _` |@
  10.214 + | | (_| |@
  10.215 +  \ \__,_|@
  10.216 +   \____/ @@
  10.217 +     _    @
  10.218 +    / \   @
  10.219 +   / _ \  @
  10.220 +  / ___ \ @
  10.221 + /_/   \_\@
  10.222 +          @@
  10.223 +  ____  @
  10.224 + | __ ) @
  10.225 + |  _ \ @
  10.226 + | |_) |@
  10.227 + |____/ @
  10.228 +        @@
  10.229 +   ____ @
  10.230 +  / ___|@
  10.231 + | |    @
  10.232 + | |___ @
  10.233 +  \____|@
  10.234 +        @@
  10.235 +  ____  @
  10.236 + |  _ \ @
  10.237 + | | | |@
  10.238 + | |_| |@
  10.239 + |____/ @
  10.240 +        @@
  10.241 +  _____ @
  10.242 + | ____|@
  10.243 + |  _|  @
  10.244 + | |___ @
  10.245 + |_____|@
  10.246 +        @@
  10.247 +  _____ @
  10.248 + |  ___|@
  10.249 + | |_   @
  10.250 + |  _|  @
  10.251 + |_|    @
  10.252 +        @@
  10.253 +   ____ @
  10.254 +  / ___|@
  10.255 + | |  _ @
  10.256 + | |_| |@
  10.257 +  \____|@
  10.258 +        @@
  10.259 +  _   _ @
  10.260 + | | | |@
  10.261 + | |_| |@
  10.262 + |  _  |@
  10.263 + |_| |_|@
  10.264 +        @@
  10.265 +  ___ @
  10.266 + |_ _|@
  10.267 +  | | @
  10.268 +  | | @
  10.269 + |___|@
  10.270 +      @@
  10.271 +      _ @
  10.272 +     | |@
  10.273 +  _  | |@
  10.274 + | |_| |@
  10.275 +  \___/ @
  10.276 +        @@
  10.277 +  _  __@
  10.278 + | |/ /@
  10.279 + | ' / @
  10.280 + | . \ @
  10.281 + |_|\_\@
  10.282 +       @@
  10.283 +  _     @
  10.284 + | |    @
  10.285 + | |    @
  10.286 + | |___ @
  10.287 + |_____|@
  10.288 +        @@
  10.289 +  __  __ @
  10.290 + |  \/  |@
  10.291 + | |\/| |@
  10.292 + | |  | |@
  10.293 + |_|  |_|@
  10.294 +         @@
  10.295 +  _   _ @
  10.296 + | \ | |@
  10.297 + |  \| |@
  10.298 + | |\  |@
  10.299 + |_| \_|@
  10.300 +        @@
  10.301 +   ___  @
  10.302 +  / _ \ @
  10.303 + | | | |@
  10.304 + | |_| |@
  10.305 +  \___/ @
  10.306 +        @@
  10.307 +  ____  @
  10.308 + |  _ \ @
  10.309 + | |_) |@
  10.310 + |  __/ @
  10.311 + |_|    @
  10.312 +        @@
  10.313 +   ___  @
  10.314 +  / _ \ @
  10.315 + | | | |@
  10.316 + | |_| |@
  10.317 +  \__\_\@
  10.318 +        @@
  10.319 +  ____  @
  10.320 + |  _ \ @
  10.321 + | |_) |@
  10.322 + |  _ < @
  10.323 + |_| \_\@
  10.324 +        @@
  10.325 +  ____  @
  10.326 + / ___| @
  10.327 + \___ \ @
  10.328 +  ___) |@
  10.329 + |____/ @
  10.330 +        @@
  10.331 +  _____ @
  10.332 + |_   _|@
  10.333 +   | |  @
  10.334 +   | |  @
  10.335 +   |_|  @
  10.336 +        @@
  10.337 +  _   _ @
  10.338 + | | | |@
  10.339 + | | | |@
  10.340 + | |_| |@
  10.341 +  \___/ @
  10.342 +        @@
  10.343 + __     __@
  10.344 + \ \   / /@
  10.345 +  \ \ / / @
  10.346 +   \ V /  @
  10.347 +    \_/   @
  10.348 +          @@
  10.349 + __        __@
  10.350 + \ \      / /@
  10.351 +  \ \ /\ / / @
  10.352 +   \ V  V /  @
  10.353 +    \_/\_/   @
  10.354 +             @@
  10.355 + __  __@
  10.356 + \ \/ /@
  10.357 +  \  / @
  10.358 +  /  \ @
  10.359 + /_/\_\@
  10.360 +       @@
  10.361 + __   __@
  10.362 + \ \ / /@
  10.363 +  \ V / @
  10.364 +   | |  @
  10.365 +   |_|  @
  10.366 +        @@
  10.367 +  _____@
  10.368 + |__  /@
  10.369 +   / / @
  10.370 +  / /_ @
  10.371 + /____|@
  10.372 +       @@
  10.373 +  __ @
  10.374 + | _|@
  10.375 + | | @
  10.376 + | | @
  10.377 + | | @
  10.378 + |__|@@
  10.379 + __    @
  10.380 + \ \   @
  10.381 +  \ \  @
  10.382 +   \ \ @
  10.383 +    \_\@
  10.384 +       @@
  10.385 +  __ @
  10.386 + |_ |@
  10.387 +  | |@
  10.388 +  | |@
  10.389 +  | |@
  10.390 + |__|@@
  10.391 +  /\ @
  10.392 + |/\|@
  10.393 +   $ @
  10.394 +   $ @
  10.395 +   $ @
  10.396 +     @@
  10.397 +        @
  10.398 +        @
  10.399 +        @
  10.400 +        @
  10.401 +  _____ @
  10.402 + |_____|@@
  10.403 +  _ @
  10.404 + ( )@
  10.405 +  \|@
  10.406 +  $ @
  10.407 +  $ @
  10.408 +    @@
  10.409 +        @
  10.410 +   __ _ @
  10.411 +  / _` |@
  10.412 + | (_| |@
  10.413 +  \__,_|@
  10.414 +        @@
  10.415 +  _     @
  10.416 + | |__  @
  10.417 + | '_ \ @
  10.418 + | |_) |@
  10.419 + |_.__/ @
  10.420 +        @@
  10.421 +       @
  10.422 +   ___ @
  10.423 +  / __|@
  10.424 + | (__ @
  10.425 +  \___|@
  10.426 +       @@
  10.427 +      _ @
  10.428 +   __| |@
  10.429 +  / _` |@
  10.430 + | (_| |@
  10.431 +  \__,_|@
  10.432 +        @@
  10.433 +       @
  10.434 +   ___ @
  10.435 +  / _ \@
  10.436 + |  __/@
  10.437 +  \___|@
  10.438 +       @@
  10.439 +   __ @
  10.440 +  / _|@
  10.441 + | |_ @
  10.442 + |  _|@
  10.443 + |_|  @
  10.444 +      @@
  10.445 +        @
  10.446 +   __ _ @
  10.447 +  / _` |@
  10.448 + | (_| |@
  10.449 +  \__, |@
  10.450 +  |___/ @@
  10.451 +  _     @
  10.452 + | |__  @
  10.453 + | '_ \ @
  10.454 + | | | |@
  10.455 + |_| |_|@
  10.456 +        @@
  10.457 +  _ @
  10.458 + (_)@
  10.459 + | |@
  10.460 + | |@
  10.461 + |_|@
  10.462 +    @@
  10.463 +    _ @
  10.464 +   (_)@
  10.465 +   | |@
  10.466 +   | |@
  10.467 +  _/ |@
  10.468 + |__/ @@
  10.469 +  _    @
  10.470 + | | __@
  10.471 + | |/ /@
  10.472 + |   < @
  10.473 + |_|\_\@
  10.474 +       @@
  10.475 +  _ @
  10.476 + | |@
  10.477 + | |@
  10.478 + | |@
  10.479 + |_|@
  10.480 +    @@
  10.481 +            @
  10.482 +  _ __ ___  @
  10.483 + | '_ ` _ \ @
  10.484 + | | | | | |@
  10.485 + |_| |_| |_|@
  10.486 +            @@
  10.487 +        @
  10.488 +  _ __  @
  10.489 + | '_ \ @
  10.490 + | | | |@
  10.491 + |_| |_|@
  10.492 +        @@
  10.493 +        @
  10.494 +   ___  @
  10.495 +  / _ \ @
  10.496 + | (_) |@
  10.497 +  \___/ @
  10.498 +        @@
  10.499 +        @
  10.500 +  _ __  @
  10.501 + | '_ \ @
  10.502 + | |_) |@
  10.503 + | .__/ @
  10.504 + |_|    @@
  10.505 +        @
  10.506 +   __ _ @
  10.507 +  / _` |@
  10.508 + | (_| |@
  10.509 +  \__, |@
  10.510 +     |_|@@
  10.511 +       @
  10.512 +  _ __ @
  10.513 + | '__|@
  10.514 + | |   @
  10.515 + |_|   @
  10.516 +       @@
  10.517 +      @
  10.518 +  ___ @
  10.519 + / __|@
  10.520 + \__ \@
  10.521 + |___/@
  10.522 +      @@
  10.523 +  _   @
  10.524 + | |_ @
  10.525 + | __|@
  10.526 + | |_ @
  10.527 +  \__|@
  10.528 +      @@
  10.529 +        @
  10.530 +  _   _ @
  10.531 + | | | |@
  10.532 + | |_| |@
  10.533 +  \__,_|@
  10.534 +        @@
  10.535 +        @
  10.536 + __   __@
  10.537 + \ \ / /@
  10.538 +  \ V / @
  10.539 +   \_/  @
  10.540 +        @@
  10.541 +           @
  10.542 + __      __@
  10.543 + \ \ /\ / /@
  10.544 +  \ V  V / @
  10.545 +   \_/\_/  @
  10.546 +           @@
  10.547 +       @
  10.548 + __  __@
  10.549 + \ \/ /@
  10.550 +  >  < @
  10.551 + /_/\_\@
  10.552 +       @@
  10.553 +        @
  10.554 +  _   _ @
  10.555 + | | | |@
  10.556 + | |_| |@
  10.557 +  \__, |@
  10.558 +  |___/ @@
  10.559 +      @
  10.560 +  ____@
  10.561 + |_  /@
  10.562 +  / / @
  10.563 + /___|@
  10.564 +      @@
  10.565 +    __@
  10.566 +   / /@
  10.567 +  | | @
  10.568 + < <  @
  10.569 +  | | @
  10.570 +   \_\@@
  10.571 +  _ @
  10.572 + | |@
  10.573 + | |@
  10.574 + | |@
  10.575 + | |@
  10.576 + |_|@@
  10.577 + __   @
  10.578 + \ \  @
  10.579 +  | | @
  10.580 +   > >@
  10.581 +  | | @
  10.582 + /_/  @@
  10.583 +  /\/|@
  10.584 + |/\/ @
  10.585 +   $  @
  10.586 +   $  @
  10.587 +   $  @
  10.588 +      @@
  10.589 +  _   _ @
  10.590 + (_)_(_)@
  10.591 +   /_\  @
  10.592 +  / _ \ @
  10.593 + /_/ \_\@
  10.594 +        @@
  10.595 +  _   _ @
  10.596 + (_)_(_)@
  10.597 +  / _ \ @
  10.598 + | |_| |@
  10.599 +  \___/ @
  10.600 +        @@
  10.601 +  _   _ @
  10.602 + (_) (_)@
  10.603 + | | | |@
  10.604 + | |_| |@
  10.605 +  \___/ @
  10.606 +        @@
  10.607 +  _   _ @
  10.608 + (_)_(_)@
  10.609 +  / _` |@
  10.610 + | (_| |@
  10.611 +  \__,_|@
  10.612 +        @@
  10.613 +  _   _ @
  10.614 + (_)_(_)@
  10.615 +  / _ \ @
  10.616 + | (_) |@
  10.617 +  \___/ @
  10.618 +        @@
  10.619 +  _   _ @
  10.620 + (_) (_)@
  10.621 + | | | |@
  10.622 + | |_| |@
  10.623 +  \__,_|@
  10.624 +        @@
  10.625 +   ___ @
  10.626 +  / _ \@
  10.627 + | |/ /@
  10.628 + | |\ \@
  10.629 + | ||_/@
  10.630 + |_|   @@
  10.631 +160  NO-BREAK SPACE
  10.632 + $@
  10.633 + $@
  10.634 + $@
  10.635 + $@
  10.636 + $@
  10.637 + $@@
  10.638 +161  INVERTED EXCLAMATION MARK
  10.639 +  _ @
  10.640 + (_)@
  10.641 + | |@
  10.642 + | |@
  10.643 + |_|@
  10.644 +    @@
  10.645 +162  CENT SIGN
  10.646 +    _  @
  10.647 +   | | @
  10.648 +  / __)@
  10.649 + | (__ @
  10.650 +  \   )@
  10.651 +   |_| @@
  10.652 +163  POUND SIGN
  10.653 +    ___  @
  10.654 +   / ,_\ @
  10.655 + _| |_   @
  10.656 +  | |___ @
  10.657 + (_,____|@
  10.658 +         @@
  10.659 +164  CURRENCY SIGN
  10.660 + /\___/\@
  10.661 + \  _  /@
  10.662 + | (_) |@
  10.663 + / ___ \@
  10.664 + \/   \/@
  10.665 +        @@
  10.666 +165  YEN SIGN
  10.667 +  __ __ @
  10.668 +  \ V / @
  10.669 + |__ __|@
  10.670 + |__ __|@
  10.671 +   |_|  @
  10.672 +        @@
  10.673 +166  BROKEN BAR
  10.674 +  _ @
  10.675 + | |@
  10.676 + |_|@
  10.677 +  _ @
  10.678 + | |@
  10.679 + |_|@@
  10.680 +167  SECTION SIGN
  10.681 +    __ @
  10.682 +  _/ _)@
  10.683 + / \ \ @
  10.684 + \ \\ \@
  10.685 +  \ \_/@
  10.686 + (__/  @@
  10.687 +168  DIAERESIS
  10.688 +  _   _ @
  10.689 + (_) (_)@
  10.690 +  $   $ @
  10.691 +  $   $ @
  10.692 +  $   $ @
  10.693 +        @@
  10.694 +169  COPYRIGHT SIGN
  10.695 +    _____   @
  10.696 +   / ___ \  @
  10.697 +  / / __| \ @
  10.698 + | | (__   |@
  10.699 +  \ \___| / @
  10.700 +   \_____/  @@
  10.701 +170  FEMININE ORDINAL INDICATOR
  10.702 +  __ _ @
  10.703 + / _` |@
  10.704 + \__,_|@
  10.705 + |____|@
  10.706 +    $  @
  10.707 +       @@
  10.708 +171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  10.709 +   ____@
  10.710 +  / / /@
  10.711 + / / / @
  10.712 + \ \ \ @
  10.713 +  \_\_\@
  10.714 +       @@
  10.715 +172  NOT SIGN
  10.716 +        @
  10.717 +  _____ @
  10.718 + |___  |@
  10.719 +     |_|@
  10.720 +    $   @
  10.721 +        @@
  10.722 +173  SOFT HYPHEN
  10.723 +       @
  10.724 +       @
  10.725 +  ____ @
  10.726 + |____|@
  10.727 +    $  @
  10.728 +       @@
  10.729 +174  REGISTERED SIGN
  10.730 +    _____   @
  10.731 +   / ___ \  @
  10.732 +  / | _ \ \ @
  10.733 + |  |   /  |@
  10.734 +  \ |_|_\ / @
  10.735 +   \_____/  @@
  10.736 +175  MACRON
  10.737 +  _____ @
  10.738 + |_____|@
  10.739 +    $   @
  10.740 +    $   @
  10.741 +    $   @
  10.742 +        @@
  10.743 +176  DEGREE SIGN
  10.744 +   __  @
  10.745 +  /  \ @
  10.746 + | () |@
  10.747 +  \__/ @
  10.748 +    $  @
  10.749 +       @@
  10.750 +177  PLUS-MINUS SIGN
  10.751 +    _   @
  10.752 +  _| |_ @
  10.753 + |_   _|@
  10.754 +  _|_|_ @
  10.755 + |_____|@
  10.756 +        @@
  10.757 +178  SUPERSCRIPT TWO
  10.758 +  ___ @
  10.759 + |_  )@
  10.760 +  / / @
  10.761 + /___|@
  10.762 +   $  @
  10.763 +      @@
  10.764 +179  SUPERSCRIPT THREE
  10.765 +  ____@
  10.766 + |__ /@
  10.767 +  |_ \@
  10.768 + |___/@
  10.769 +   $  @
  10.770 +      @@
  10.771 +180  ACUTE ACCENT
  10.772 +  __@
  10.773 + /_/@
  10.774 +  $ @
  10.775 +  $ @
  10.776 +  $ @
  10.777 +    @@
  10.778 +181  MICRO SIGN
  10.779 +        @
  10.780 +  _   _ @
  10.781 + | | | |@
  10.782 + | |_| |@
  10.783 + | ._,_|@
  10.784 + |_|    @@
  10.785 +182  PILCROW SIGN
  10.786 +   _____ @
  10.787 +  /     |@
  10.788 + | (| | |@
  10.789 +  \__ | |@
  10.790 +    |_|_|@
  10.791 +         @@
  10.792 +183  MIDDLE DOT
  10.793 +    @
  10.794 +  _ @
  10.795 + (_)@
  10.796 +  $ @
  10.797 +  $ @
  10.798 +    @@
  10.799 +184  CEDILLA
  10.800 +    @
  10.801 +    @
  10.802 +    @
  10.803 +    @
  10.804 +  _ @
  10.805 + )_)@@
  10.806 +185  SUPERSCRIPT ONE
  10.807 +  _ @
  10.808 + / |@
  10.809 + | |@
  10.810 + |_|@
  10.811 +  $ @
  10.812 +    @@
  10.813 +186  MASCULINE ORDINAL INDICATOR
  10.814 +  ___ @
  10.815 + / _ \@
  10.816 + \___/@
  10.817 + |___|@
  10.818 +   $  @
  10.819 +      @@
  10.820 +187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  10.821 + ____  @
  10.822 + \ \ \ @
  10.823 +  \ \ \@
  10.824 +  / / /@
  10.825 + /_/_/ @
  10.826 +       @@
  10.827 +188  VULGAR FRACTION ONE QUARTER
  10.828 +  _   __    @
  10.829 + / | / / _  @
  10.830 + | |/ / | | @
  10.831 + |_/ /|_  _|@
  10.832 +  /_/   |_| @
  10.833 +            @@
  10.834 +189  VULGAR FRACTION ONE HALF
  10.835 +  _   __   @
  10.836 + / | / /__ @
  10.837 + | |/ /_  )@
  10.838 + |_/ / / / @
  10.839 +  /_/ /___|@
  10.840 +           @@
  10.841 +190  VULGAR FRACTION THREE QUARTERS
  10.842 +  ____  __    @
  10.843 + |__ / / / _  @
  10.844 +  |_ \/ / | | @
  10.845 + |___/ /|_  _|@
  10.846 +    /_/   |_| @
  10.847 +              @@
  10.848 +191  INVERTED QUESTION MARK
  10.849 +   _  @
  10.850 +  (_) @
  10.851 +  | | @
  10.852 + / /_ @
  10.853 + \___|@
  10.854 +      @@
  10.855 +192  LATIN CAPITAL LETTER A WITH GRAVE
  10.856 +   __   @
  10.857 +   \_\  @
  10.858 +   /_\  @
  10.859 +  / _ \ @
  10.860 + /_/ \_\@
  10.861 +        @@
  10.862 +193  LATIN CAPITAL LETTER A WITH ACUTE
  10.863 +    __  @
  10.864 +   /_/  @
  10.865 +   /_\  @
  10.866 +  / _ \ @
  10.867 + /_/ \_\@
  10.868 +        @@
  10.869 +194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  10.870 +   //\  @
  10.871 +  |/_\| @
  10.872 +   /_\  @
  10.873 +  / _ \ @
  10.874 + /_/ \_\@
  10.875 +        @@
  10.876 +195  LATIN CAPITAL LETTER A WITH TILDE
  10.877 +   /\/| @
  10.878 +  |/\/  @
  10.879 +   /_\  @
  10.880 +  / _ \ @
  10.881 + /_/ \_\@
  10.882 +        @@
  10.883 +196  LATIN CAPITAL LETTER A WITH DIAERESIS
  10.884 +  _   _ @
  10.885 + (_)_(_)@
  10.886 +   /_\  @
  10.887 +  / _ \ @
  10.888 + /_/ \_\@
  10.889 +        @@
  10.890 +197  LATIN CAPITAL LETTER A WITH RING ABOVE
  10.891 +    _   @
  10.892 +   (o)  @
  10.893 +   /_\  @
  10.894 +  / _ \ @
  10.895 + /_/ \_\@
  10.896 +        @@
  10.897 +198  LATIN CAPITAL LETTER AE
  10.898 +     ______ @
  10.899 +    /  ____|@
  10.900 +   / _  _|  @
  10.901 +  / __ |___ @
  10.902 + /_/ |_____|@
  10.903 +            @@
  10.904 +199  LATIN CAPITAL LETTER C WITH CEDILLA
  10.905 +   ____ @
  10.906 +  / ___|@
  10.907 + | |    @
  10.908 + | |___ @
  10.909 +  \____|@
  10.910 +    )_) @@
  10.911 +200  LATIN CAPITAL LETTER E WITH GRAVE
  10.912 +   __   @
  10.913 +  _\_\_ @
  10.914 + | ____|@
  10.915 + |  _|_ @
  10.916 + |_____|@
  10.917 +        @@
  10.918 +201  LATIN CAPITAL LETTER E WITH ACUTE
  10.919 +    __  @
  10.920 +  _/_/_ @
  10.921 + | ____|@
  10.922 + |  _|_ @
  10.923 + |_____|@
  10.924 +        @@
  10.925 +202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  10.926 +   //\  @
  10.927 +  |/_\| @
  10.928 + | ____|@
  10.929 + |  _|_ @
  10.930 + |_____|@
  10.931 +        @@
  10.932 +203  LATIN CAPITAL LETTER E WITH DIAERESIS
  10.933 +  _   _ @
  10.934 + (_)_(_)@
  10.935 + | ____|@
  10.936 + |  _|_ @
  10.937 + |_____|@
  10.938 +        @@
  10.939 +204  LATIN CAPITAL LETTER I WITH GRAVE
  10.940 +  __  @
  10.941 +  \_\ @
  10.942 + |_ _|@
  10.943 +  | | @
  10.944 + |___|@
  10.945 +      @@
  10.946 +205  LATIN CAPITAL LETTER I WITH ACUTE
  10.947 +   __ @
  10.948 +  /_/ @
  10.949 + |_ _|@
  10.950 +  | | @
  10.951 + |___|@
  10.952 +      @@
  10.953 +206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  10.954 +  //\ @
  10.955 + |/_\|@
  10.956 + |_ _|@
  10.957 +  | | @
  10.958 + |___|@
  10.959 +      @@
  10.960 +207  LATIN CAPITAL LETTER I WITH DIAERESIS
  10.961 +  _   _ @
  10.962 + (_)_(_)@
  10.963 +  |_ _| @
  10.964 +   | |  @
  10.965 +  |___| @
  10.966 +        @@
  10.967 +208  LATIN CAPITAL LETTER ETH
  10.968 +    ____  @
  10.969 +   |  _ \ @
  10.970 +  _| |_| |@
  10.971 + |__ __| |@
  10.972 +   |____/ @
  10.973 +          @@
  10.974 +209  LATIN CAPITAL LETTER N WITH TILDE
  10.975 +   /\/|@
  10.976 +  |/\/ @
  10.977 + | \| |@
  10.978 + | .` |@
  10.979 + |_|\_|@
  10.980 +       @@
  10.981 +210  LATIN CAPITAL LETTER O WITH GRAVE
  10.982 +   __   @
  10.983 +   \_\  @
  10.984 +  / _ \ @
  10.985 + | |_| |@
  10.986 +  \___/ @
  10.987 +        @@
  10.988 +211  LATIN CAPITAL LETTER O WITH ACUTE
  10.989 +    __  @
  10.990 +   /_/  @
  10.991 +  / _ \ @
  10.992 + | |_| |@
  10.993 +  \___/ @
  10.994 +        @@
  10.995 +212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  10.996 +   //\  @
  10.997 +  |/_\| @
  10.998 +  / _ \ @
  10.999 + | |_| |@
 10.1000 +  \___/ @
 10.1001 +        @@
 10.1002 +213  LATIN CAPITAL LETTER O WITH TILDE
 10.1003 +   /\/| @
 10.1004 +  |/\/  @
 10.1005 +  / _ \ @
 10.1006 + | |_| |@
 10.1007 +  \___/ @
 10.1008 +        @@
 10.1009 +214  LATIN CAPITAL LETTER O WITH DIAERESIS
 10.1010 +  _   _ @
 10.1011 + (_)_(_)@
 10.1012 +  / _ \ @
 10.1013 + | |_| |@
 10.1014 +  \___/ @
 10.1015 +        @@
 10.1016 +215  MULTIPLICATION SIGN
 10.1017 +     @
 10.1018 +     @
 10.1019 + /\/\@
 10.1020 + >  <@
 10.1021 + \/\/@
 10.1022 +     @@
 10.1023 +216  LATIN CAPITAL LETTER O WITH STROKE
 10.1024 +   ____ @
 10.1025 +  / _// @
 10.1026 + | |// |@
 10.1027 + | //| |@
 10.1028 +  //__/ @
 10.1029 +        @@
 10.1030 +217  LATIN CAPITAL LETTER U WITH GRAVE
 10.1031 +   __   @
 10.1032 +  _\_\_ @
 10.1033 + | | | |@
 10.1034 + | |_| |@
 10.1035 +  \___/ @
 10.1036 +        @@
 10.1037 +218  LATIN CAPITAL LETTER U WITH ACUTE
 10.1038 +    __  @
 10.1039 +  _/_/_ @
 10.1040 + | | | |@
 10.1041 + | |_| |@
 10.1042 +  \___/ @
 10.1043 +        @@
 10.1044 +219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 10.1045 +   //\  @
 10.1046 +  |/ \| @
 10.1047 + | | | |@
 10.1048 + | |_| |@
 10.1049 +  \___/ @
 10.1050 +        @@
 10.1051 +220  LATIN CAPITAL LETTER U WITH DIAERESIS
 10.1052 +  _   _ @
 10.1053 + (_) (_)@
 10.1054 + | | | |@
 10.1055 + | |_| |@
 10.1056 +  \___/ @
 10.1057 +        @@
 10.1058 +221  LATIN CAPITAL LETTER Y WITH ACUTE
 10.1059 +    __  @
 10.1060 + __/_/__@
 10.1061 + \ \ / /@
 10.1062 +  \ V / @
 10.1063 +   |_|  @
 10.1064 +        @@
 10.1065 +222  LATIN CAPITAL LETTER THORN
 10.1066 +  _     @
 10.1067 + | |___ @
 10.1068 + |  __ \@
 10.1069 + |  ___/@
 10.1070 + |_|    @
 10.1071 +        @@
 10.1072 +223  LATIN SMALL LETTER SHARP S
 10.1073 +   ___ @
 10.1074 +  / _ \@
 10.1075 + | |/ /@
 10.1076 + | |\ \@
 10.1077 + | ||_/@
 10.1078 + |_|   @@
 10.1079 +224  LATIN SMALL LETTER A WITH GRAVE
 10.1080 +   __   @
 10.1081 +   \_\_ @
 10.1082 +  / _` |@
 10.1083 + | (_| |@
 10.1084 +  \__,_|@
 10.1085 +        @@
 10.1086 +225  LATIN SMALL LETTER A WITH ACUTE
 10.1087 +    __  @
 10.1088 +   /_/_ @
 10.1089 +  / _` |@
 10.1090 + | (_| |@
 10.1091 +  \__,_|@
 10.1092 +        @@
 10.1093 +226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 10.1094 +   //\  @
 10.1095 +  |/_\| @
 10.1096 +  / _` |@
 10.1097 + | (_| |@
 10.1098 +  \__,_|@
 10.1099 +        @@
 10.1100 +227  LATIN SMALL LETTER A WITH TILDE
 10.1101 +   /\/| @
 10.1102 +  |/\/_ @
 10.1103 +  / _` |@
 10.1104 + | (_| |@
 10.1105 +  \__,_|@
 10.1106 +        @@
 10.1107 +228  LATIN SMALL LETTER A WITH DIAERESIS
 10.1108 +  _   _ @
 10.1109 + (_)_(_)@
 10.1110 +  / _` |@
 10.1111 + | (_| |@
 10.1112 +  \__,_|@
 10.1113 +        @@
 10.1114 +229  LATIN SMALL LETTER A WITH RING ABOVE
 10.1115 +    __  @
 10.1116 +   (()) @
 10.1117 +  / _ '|@
 10.1118 + | (_| |@
 10.1119 +  \__,_|@
 10.1120 +        @@
 10.1121 +230  LATIN SMALL LETTER AE
 10.1122 +           @
 10.1123 +   __ ____ @
 10.1124 +  / _`  _ \@
 10.1125 + | (_|  __/@
 10.1126 +  \__,____|@
 10.1127 +           @@
 10.1128 +231  LATIN SMALL LETTER C WITH CEDILLA
 10.1129 +       @
 10.1130 +   ___ @
 10.1131 +  / __|@
 10.1132 + | (__ @
 10.1133 +  \___|@
 10.1134 +   )_) @@
 10.1135 +232  LATIN SMALL LETTER E WITH GRAVE
 10.1136 +   __  @
 10.1137 +   \_\ @
 10.1138 +  / _ \@
 10.1139 + |  __/@
 10.1140 +  \___|@
 10.1141 +       @@
 10.1142 +233  LATIN SMALL LETTER E WITH ACUTE
 10.1143 +    __ @
 10.1144 +   /_/ @
 10.1145 +  / _ \@
 10.1146 + |  __/@
 10.1147 +  \___|@
 10.1148 +       @@
 10.1149 +234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 10.1150 +   //\ @
 10.1151 +  |/_\|@
 10.1152 +  / _ \@
 10.1153 + |  __/@
 10.1154 +  \___|@
 10.1155 +       @@
 10.1156 +235  LATIN SMALL LETTER E WITH DIAERESIS
 10.1157 +  _   _ @
 10.1158 + (_)_(_)@
 10.1159 +  / _ \ @
 10.1160 + |  __/ @
 10.1161 +  \___| @
 10.1162 +        @@
 10.1163 +236  LATIN SMALL LETTER I WITH GRAVE
 10.1164 + __ @
 10.1165 + \_\@
 10.1166 + | |@
 10.1167 + | |@
 10.1168 + |_|@
 10.1169 +    @@
 10.1170 +237  LATIN SMALL LETTER I WITH ACUTE
 10.1171 +  __@
 10.1172 + /_/@
 10.1173 + | |@
 10.1174 + | |@
 10.1175 + |_|@
 10.1176 +    @@
 10.1177 +238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 10.1178 +  //\ @
 10.1179 + |/_\|@
 10.1180 +  | | @
 10.1181 +  | | @
 10.1182 +  |_| @
 10.1183 +      @@
 10.1184 +239  LATIN SMALL LETTER I WITH DIAERESIS
 10.1185 +  _   _ @
 10.1186 + (_)_(_)@
 10.1187 +   | |  @
 10.1188 +   | |  @
 10.1189 +   |_|  @
 10.1190 +        @@
 10.1191 +240  LATIN SMALL LETTER ETH
 10.1192 +   /\/\ @
 10.1193 +   >  < @
 10.1194 +  _\/\ |@
 10.1195 + / __` |@
 10.1196 + \____/ @
 10.1197 +        @@
 10.1198 +241  LATIN SMALL LETTER N WITH TILDE
 10.1199 +   /\/| @
 10.1200 +  |/\/  @
 10.1201 + | '_ \ @
 10.1202 + | | | |@
 10.1203 + |_| |_|@
 10.1204 +        @@
 10.1205 +242  LATIN SMALL LETTER O WITH GRAVE
 10.1206 +   __   @
 10.1207 +   \_\  @
 10.1208 +  / _ \ @
 10.1209 + | (_) |@
 10.1210 +  \___/ @
 10.1211 +        @@
 10.1212 +243  LATIN SMALL LETTER O WITH ACUTE
 10.1213 +    __  @
 10.1214 +   /_/  @
 10.1215 +  / _ \ @
 10.1216 + | (_) |@
 10.1217 +  \___/ @
 10.1218 +        @@
 10.1219 +244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 10.1220 +   //\  @
 10.1221 +  |/_\| @
 10.1222 +  / _ \ @
 10.1223 + | (_) |@
 10.1224 +  \___/ @
 10.1225 +        @@
 10.1226 +245  LATIN SMALL LETTER O WITH TILDE
 10.1227 +   /\/| @
 10.1228 +  |/\/  @
 10.1229 +  / _ \ @
 10.1230 + | (_) |@
 10.1231 +  \___/ @
 10.1232 +        @@
 10.1233 +246  LATIN SMALL LETTER O WITH DIAERESIS
 10.1234 +  _   _ @
 10.1235 + (_)_(_)@
 10.1236 +  / _ \ @
 10.1237 + | (_) |@
 10.1238 +  \___/ @
 10.1239 +        @@
 10.1240 +247  DIVISION SIGN
 10.1241 +        @
 10.1242 +    _   @
 10.1243 +  _(_)_ @
 10.1244 + |_____|@
 10.1245 +   (_)  @
 10.1246 +        @@
 10.1247 +248  LATIN SMALL LETTER O WITH STROKE
 10.1248 +         @
 10.1249 +   ____  @
 10.1250 +  / _//\ @
 10.1251 + | (//) |@
 10.1252 +  \//__/ @
 10.1253 +         @@
 10.1254 +249  LATIN SMALL LETTER U WITH GRAVE
 10.1255 +   __   @
 10.1256 +  _\_\_ @
 10.1257 + | | | |@
 10.1258 + | |_| |@
 10.1259 +  \__,_|@
 10.1260 +        @@
 10.1261 +250  LATIN SMALL LETTER U WITH ACUTE
 10.1262 +    __  @
 10.1263 +  _/_/_ @
 10.1264 + | | | |@
 10.1265 + | |_| |@
 10.1266 +  \__,_|@
 10.1267 +        @@
 10.1268 +251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 10.1269 +   //\  @
 10.1270 +  |/ \| @
 10.1271 + | | | |@
 10.1272 + | |_| |@
 10.1273 +  \__,_|@
 10.1274 +        @@
 10.1275 +252  LATIN SMALL LETTER U WITH DIAERESIS
 10.1276 +  _   _ @
 10.1277 + (_) (_)@
 10.1278 + | | | |@
 10.1279 + | |_| |@
 10.1280 +  \__,_|@
 10.1281 +        @@
 10.1282 +253  LATIN SMALL LETTER Y WITH ACUTE
 10.1283 +    __  @
 10.1284 +  _/_/_ @
 10.1285 + | | | |@
 10.1286 + | |_| |@
 10.1287 +  \__, |@
 10.1288 +  |___/ @@
 10.1289 +254  LATIN SMALL LETTER THORN
 10.1290 +  _     @
 10.1291 + | |__  @
 10.1292 + | '_ \ @
 10.1293 + | |_) |@
 10.1294 + | .__/ @
 10.1295 + |_|    @@
 10.1296 +255  LATIN SMALL LETTER Y WITH DIAERESIS
 10.1297 +  _   _ @
 10.1298 + (_) (_)@
 10.1299 + | | | |@
 10.1300 + | |_| |@
 10.1301 +  \__, |@
 10.1302 +  |___/ @@
 10.1303 +0x0100  LATIN CAPITAL LETTER A WITH MACRON
 10.1304 +   ____ @
 10.1305 +  /___/ @
 10.1306 +   /_\  @
 10.1307 +  / _ \ @
 10.1308 + /_/ \_\@
 10.1309 +        @@
 10.1310 +0x0101  LATIN SMALL LETTER A WITH MACRON
 10.1311 +    ___ @
 10.1312 +   /_ _/@
 10.1313 +  / _` |@
 10.1314 + | (_| |@
 10.1315 +  \__,_|@
 10.1316 +        @@
 10.1317 +0x0102  LATIN CAPITAL LETTER A WITH BREVE
 10.1318 +  _   _ @
 10.1319 +  \\_// @
 10.1320 +   /_\  @
 10.1321 +  / _ \ @
 10.1322 + /_/ \_\@
 10.1323 +        @@
 10.1324 +0x0103  LATIN SMALL LETTER A WITH BREVE
 10.1325 +   \_/  @
 10.1326 +   ___  @
 10.1327 +  / _` |@
 10.1328 + | (_| |@
 10.1329 +  \__,_|@
 10.1330 +        @@
 10.1331 +0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 10.1332 +        @
 10.1333 +    _   @
 10.1334 +   /_\  @
 10.1335 +  / _ \ @
 10.1336 + /_/ \_\@
 10.1337 +     (_(@@
 10.1338 +0x0105  LATIN SMALL LETTER A WITH OGONEK
 10.1339 +        @
 10.1340 +   __ _ @
 10.1341 +  / _` |@
 10.1342 + | (_| |@
 10.1343 +  \__,_|@
 10.1344 +     (_(@@
 10.1345 +0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 10.1346 +     __ @
 10.1347 +   _/_/ @
 10.1348 +  / ___|@
 10.1349 + | |___ @
 10.1350 +  \____|@
 10.1351 +        @@
 10.1352 +0x0107  LATIN SMALL LETTER C WITH ACUTE
 10.1353 +    __ @
 10.1354 +   /__/@
 10.1355 +  / __|@
 10.1356 + | (__ @
 10.1357 +  \___|@
 10.1358 +       @@
 10.1359 +0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 10.1360 +     /\ @
 10.1361 +   _//\\@
 10.1362 +  / ___|@
 10.1363 + | |___ @
 10.1364 +  \____|@
 10.1365 +        @@
 10.1366 +0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 10.1367 +    /\ @
 10.1368 +   /_\ @
 10.1369 +  / __|@
 10.1370 + | (__ @
 10.1371 +  \___|@
 10.1372 +       @@
 10.1373 +0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 10.1374 +    []  @
 10.1375 +   ____ @
 10.1376 +  / ___|@
 10.1377 + | |___ @
 10.1378 +  \____|@
 10.1379 +        @@
 10.1380 +0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 10.1381 +   []  @
 10.1382 +   ___ @
 10.1383 +  / __|@
 10.1384 + | (__ @
 10.1385 +  \___|@
 10.1386 +       @@
 10.1387 +0x010C  LATIN CAPITAL LETTER C WITH CARON
 10.1388 +   \\// @
 10.1389 +   _\/_ @
 10.1390 +  / ___|@
 10.1391 + | |___ @
 10.1392 +  \____|@
 10.1393 +        @@
 10.1394 +0x010D  LATIN SMALL LETTER C WITH CARON
 10.1395 +   \\//@
 10.1396 +   _\/ @
 10.1397 +  / __|@
 10.1398 + | (__ @
 10.1399 +  \___|@
 10.1400 +       @@
 10.1401 +0x010E  LATIN CAPITAL LETTER D WITH CARON
 10.1402 +   \\// @
 10.1403 +  __\/  @
 10.1404 + |  _ \ @
 10.1405 + | |_| |@
 10.1406 + |____/ @
 10.1407 +        @@
 10.1408 +0x010F  LATIN SMALL LETTER D WITH CARON
 10.1409 +  \/  _ @
 10.1410 +   __| |@
 10.1411 +  / _` |@
 10.1412 + | (_| |@
 10.1413 +  \__,_|@
 10.1414 +        @@
 10.1415 +0x0110  LATIN CAPITAL LETTER D WITH STROKE
 10.1416 +   ____   @
 10.1417 +  |_ __ \ @
 10.1418 + /| |/ | |@
 10.1419 + /|_|/_| |@
 10.1420 +  |_____/ @
 10.1421 +          @@
 10.1422 +0x0111  LATIN SMALL LETTER D WITH STROKE
 10.1423 +    ---|@
 10.1424 +   __| |@
 10.1425 +  / _` |@
 10.1426 + | (_| |@
 10.1427 +  \__,_|@
 10.1428 +        @@
 10.1429 +0x0112  LATIN CAPITAL LETTER E WITH MACRON
 10.1430 +   ____ @
 10.1431 +  /___/ @
 10.1432 + | ____|@
 10.1433 + |  _|_ @
 10.1434 + |_____|@
 10.1435 +        @@
 10.1436 +0x0113  LATIN SMALL LETTER E WITH MACRON
 10.1437 +    ____@
 10.1438 +   /_ _/@
 10.1439 +  / _ \ @
 10.1440 + |  __/ @
 10.1441 +  \___| @
 10.1442 +        @@
 10.1443 +0x0114  LATIN CAPITAL LETTER E WITH BREVE
 10.1444 +  _   _ @
 10.1445 +  \\_// @
 10.1446 + | ____|@
 10.1447 + |  _|_ @
 10.1448 + |_____|@
 10.1449 +        @@
 10.1450 +0x0115  LATIN SMALL LETTER E WITH BREVE
 10.1451 +  \\  //@
 10.1452 +    --  @
 10.1453 +  / _ \ @
 10.1454 + |  __/ @
 10.1455 +  \___| @
 10.1456 +        @@
 10.1457 +0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 10.1458 +    []  @
 10.1459 +  _____ @
 10.1460 + | ____|@
 10.1461 + |  _|_ @
 10.1462 + |_____|@
 10.1463 +        @@
 10.1464 +0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 10.1465 +    [] @
 10.1466 +    __ @
 10.1467 +  / _ \@
 10.1468 + |  __/@
 10.1469 +  \___|@
 10.1470 +       @@
 10.1471 +0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 10.1472 +        @
 10.1473 +  _____ @
 10.1474 + | ____|@
 10.1475 + |  _|_ @
 10.1476 + |_____|@
 10.1477 +    (__(@@
 10.1478 +0x0119  LATIN SMALL LETTER E WITH OGONEK
 10.1479 +       @
 10.1480 +   ___ @
 10.1481 +  / _ \@
 10.1482 + |  __/@
 10.1483 +  \___|@
 10.1484 +    (_(@@
 10.1485 +0x011A  LATIN CAPITAL LETTER E WITH CARON
 10.1486 +   \\// @
 10.1487 +  __\/_ @
 10.1488 + | ____|@
 10.1489 + |  _|_ @
 10.1490 + |_____|@
 10.1491 +        @@
 10.1492 +0x011B  LATIN SMALL LETTER E WITH CARON
 10.1493 +   \\//@
 10.1494 +    \/ @
 10.1495 +  / _ \@
 10.1496 + |  __/@
 10.1497 +  \___|@
 10.1498 +       @@
 10.1499 +0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 10.1500 +   _/\_ @
 10.1501 +  / ___|@
 10.1502 + | |  _ @
 10.1503 + | |_| |@
 10.1504 +  \____|@
 10.1505 +        @@
 10.1506 +0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 10.1507 +     /\ @
 10.1508 +   _/_ \@
 10.1509 +  / _` |@
 10.1510 + | (_| |@
 10.1511 +  \__, |@
 10.1512 +  |___/ @@
 10.1513 +0x011E  LATIN CAPITAL LETTER G WITH BREVE
 10.1514 +   _\/_ @
 10.1515 +  / ___|@
 10.1516 + | |  _ @
 10.1517 + | |_| |@
 10.1518 +  \____|@
 10.1519 +        @@
 10.1520 +0x011F  LATIN SMALL LETTER G WITH BREVE
 10.1521 +  \___/ @
 10.1522 +   __ _ @
 10.1523 +  / _` |@
 10.1524 + | (_| |@
 10.1525 +  \__, |@
 10.1526 +  |___/ @@
 10.1527 +0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 10.1528 +   _[]_ @
 10.1529 +  / ___|@
 10.1530 + | |  _ @
 10.1531 + | |_| |@
 10.1532 +  \____|@
 10.1533 +        @@
 10.1534 +0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 10.1535 +   []   @
 10.1536 +   __ _ @
 10.1537 +  / _` |@
 10.1538 + | (_| |@
 10.1539 +  \__, |@
 10.1540 +  |___/ @@
 10.1541 +0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 10.1542 +   ____ @
 10.1543 +  / ___|@
 10.1544 + | |  _ @
 10.1545 + | |_| |@
 10.1546 +  \____|@
 10.1547 +   )__) @@
 10.1548 +0x0123  LATIN SMALL LETTER G WITH CEDILLA
 10.1549 +        @
 10.1550 +   __ _ @
 10.1551 +  / _` |@
 10.1552 + | (_| |@
 10.1553 +  \__, |@
 10.1554 +  |_))))@@
 10.1555 +0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 10.1556 +  _/ \_ @
 10.1557 + | / \ |@
 10.1558 + | |_| |@
 10.1559 + |  _  |@
 10.1560 + |_| |_|@
 10.1561 +        @@
 10.1562 +0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 10.1563 +  _  /\ @
 10.1564 + | |//\ @
 10.1565 + | '_ \ @
 10.1566 + | | | |@
 10.1567 + |_| |_|@
 10.1568 +        @@
 10.1569 +0x0126  LATIN CAPITAL LETTER H WITH STROKE
 10.1570 +  _   _ @
 10.1571 + | |=| |@
 10.1572 + | |_| |@
 10.1573 + |  _  |@
 10.1574 + |_| |_|@
 10.1575 +        @@
 10.1576 +0x0127  LATIN SMALL LETTER H WITH STROKE
 10.1577 +  _     @
 10.1578 + |=|__  @
 10.1579 + | '_ \ @
 10.1580 + | | | |@
 10.1581 + |_| |_|@
 10.1582 +        @@
 10.1583 +0x0128  LATIN CAPITAL LETTER I WITH TILDE
 10.1584 +  /\//@
 10.1585 + |_ _|@
 10.1586 +  | | @
 10.1587 +  | | @
 10.1588 + |___|@
 10.1589 +      @@
 10.1590 +0x0129  LATIN SMALL LETTER I WITH TILDE
 10.1591 +    @
 10.1592 + /\/@
 10.1593 + | |@
 10.1594 + | |@
 10.1595 + |_|@
 10.1596 +    @@
 10.1597 +0x012A  LATIN CAPITAL LETTER I WITH MACRON
 10.1598 + /___/@
 10.1599 + |_ _|@
 10.1600 +  | | @
 10.1601 +  | | @
 10.1602 + |___|@
 10.1603 +      @@
 10.1604 +0x012B  LATIN SMALL LETTER I WITH MACRON
 10.1605 +  ____@
 10.1606 + /___/@
 10.1607 +  | | @
 10.1608 +  | | @
 10.1609 +  |_| @
 10.1610 +      @@
 10.1611 +0x012C  LATIN CAPITAL LETTER I WITH BREVE
 10.1612 +  \__/@
 10.1613 + |_ _|@
 10.1614 +  | | @
 10.1615 +  | | @
 10.1616 + |___|@
 10.1617 +      @@
 10.1618 +0x012D  LATIN SMALL LETTER I WITH BREVE
 10.1619 +    @
 10.1620 + \_/@
 10.1621 + | |@
 10.1622 + | |@
 10.1623 + |_|@
 10.1624 +    @@
 10.1625 +0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 10.1626 +  ___ @
 10.1627 + |_ _|@
 10.1628 +  | | @
 10.1629 +  | | @
 10.1630 + |___|@
 10.1631 +  (__(@@
 10.1632 +0x012F  LATIN SMALL LETTER I WITH OGONEK
 10.1633 +  _  @
 10.1634 + (_) @
 10.1635 + | | @
 10.1636 + | | @
 10.1637 + |_|_@
 10.1638 +  (_(@@
 10.1639 +0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 10.1640 +  _[] @
 10.1641 + |_ _|@
 10.1642 +  | | @
 10.1643 +  | | @
 10.1644 + |___|@
 10.1645 +      @@
 10.1646 +0x0131  LATIN SMALL LETTER DOTLESS I
 10.1647 +    @
 10.1648 +  _ @
 10.1649 + | |@
 10.1650 + | |@
 10.1651 + |_|@
 10.1652 +    @@
 10.1653 +0x0132  LATIN CAPITAL LIGATURE IJ
 10.1654 +  ___  _ @
 10.1655 + |_ _|| |@
 10.1656 +  | | | |@
 10.1657 +  | |_| |@
 10.1658 + |__|__/ @
 10.1659 +         @@
 10.1660 +0x0133  LATIN SMALL LIGATURE IJ
 10.1661 +  _   _ @
 10.1662 + (_) (_)@
 10.1663 + | | | |@
 10.1664 + | | | |@
 10.1665 + |_|_/ |@
 10.1666 +   |__/ @@
 10.1667 +0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 10.1668 +      /\ @
 10.1669 +     /_\|@
 10.1670 +  _  | | @
 10.1671 + | |_| | @
 10.1672 +  \___/  @
 10.1673 +         @@
 10.1674 +0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 10.1675 +    /\@
 10.1676 +   /_\@
 10.1677 +   | |@
 10.1678 +   | |@
 10.1679 +  _/ |@
 10.1680 + |__/ @@
 10.1681 +0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 10.1682 +  _  _  @
 10.1683 + | |/ / @
 10.1684 + | ' /  @
 10.1685 + | . \  @
 10.1686 + |_|\_\ @
 10.1687 +    )__)@@
 10.1688 +0x0137  LATIN SMALL LETTER K WITH CEDILLA
 10.1689 +  _    @
 10.1690 + | | __@
 10.1691 + | |/ /@
 10.1692 + |   < @
 10.1693 + |_|\_\@
 10.1694 +    )_)@@
 10.1695 +0x0138  LATIN SMALL LETTER KRA
 10.1696 +       @
 10.1697 +  _ __ @
 10.1698 + | |/ \@
 10.1699 + |   < @
 10.1700 + |_|\_\@
 10.1701 +       @@
 10.1702 +0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 10.1703 +  _   //@
 10.1704 + | | // @
 10.1705 + | |    @
 10.1706 + | |___ @
 10.1707 + |_____|@
 10.1708 +        @@
 10.1709 +0x013A  LATIN SMALL LETTER L WITH ACUTE
 10.1710 +  //@
 10.1711 + | |@
 10.1712 + | |@
 10.1713 + | |@
 10.1714 + |_|@
 10.1715 +    @@
 10.1716 +0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 10.1717 +  _     @
 10.1718 + | |    @
 10.1719 + | |    @
 10.1720 + | |___ @
 10.1721 + |_____|@
 10.1722 +    )__)@@
 10.1723 +0x013C  LATIN SMALL LETTER L WITH CEDILLA
 10.1724 +  _   @
 10.1725 + | |  @
 10.1726 + | |  @
 10.1727 + | |  @
 10.1728 + |_|  @
 10.1729 +   )_)@@
 10.1730 +0x013D  LATIN CAPITAL LETTER L WITH CARON
 10.1731 +  _ \\//@
 10.1732 + | | \/ @
 10.1733 + | |    @
 10.1734 + | |___ @
 10.1735 + |_____|@
 10.1736 +        @@
 10.1737 +0x013E  LATIN SMALL LETTER L WITH CARON
 10.1738 +  _ \\//@
 10.1739 + | | \/ @
 10.1740 + | |    @
 10.1741 + | |    @
 10.1742 + |_|    @
 10.1743 +        @@
 10.1744 +0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 10.1745 +  _     @
 10.1746 + | |    @
 10.1747 + | | [] @
 10.1748 + | |___ @
 10.1749 + |_____|@
 10.1750 +        @@
 10.1751 +0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 10.1752 +  _    @
 10.1753 + | |   @
 10.1754 + | | []@
 10.1755 + | |   @
 10.1756 + |_|   @
 10.1757 +       @@
 10.1758 +0x0141  LATIN CAPITAL LETTER L WITH STROKE
 10.1759 +  __    @
 10.1760 + | //   @
 10.1761 + |//|   @
 10.1762 + // |__ @
 10.1763 + |_____|@
 10.1764 +        @@
 10.1765 +0x0142  LATIN SMALL LETTER L WITH STROKE
 10.1766 +  _ @
 10.1767 + | |@
 10.1768 + |//@
 10.1769 + //|@
 10.1770 + |_|@
 10.1771 +    @@
 10.1772 +0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 10.1773 +  _/ /_ @
 10.1774 + | \ | |@
 10.1775 + |  \| |@
 10.1776 + | |\  |@
 10.1777 + |_| \_|@
 10.1778 +        @@
 10.1779 +0x0144  LATIN SMALL LETTER N WITH ACUTE
 10.1780 +     _  @
 10.1781 +  _ /_/ @
 10.1782 + | '_ \ @
 10.1783 + | | | |@
 10.1784 + |_| |_|@
 10.1785 +        @@
 10.1786 +0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 10.1787 +  _   _ @
 10.1788 + | \ | |@
 10.1789 + |  \| |@
 10.1790 + | |\  |@
 10.1791 + |_| \_|@
 10.1792 + )_)    @@
 10.1793 +0x0146  LATIN SMALL LETTER N WITH CEDILLA
 10.1794 +        @
 10.1795 +  _ __  @
 10.1796 + | '_ \ @
 10.1797 + | | | |@
 10.1798 + |_| |_|@
 10.1799 + )_)    @@
 10.1800 +0x0147  LATIN CAPITAL LETTER N WITH CARON
 10.1801 +  _\/ _ @
 10.1802 + | \ | |@
 10.1803 + |  \| |@
 10.1804 + | |\  |@
 10.1805 + |_| \_|@
 10.1806 +        @@
 10.1807 +0x0148  LATIN SMALL LETTER N WITH CARON
 10.1808 +  \\//  @
 10.1809 +  _\/_  @
 10.1810 + | '_ \ @
 10.1811 + | | | |@
 10.1812 + |_| |_|@
 10.1813 +        @@
 10.1814 +0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 10.1815 +          @
 10.1816 +  _  __   @
 10.1817 + ( )| '_\ @
 10.1818 + |/| | | |@
 10.1819 +   |_| |_|@
 10.1820 +          @@
 10.1821 +0x014A  LATIN CAPITAL LETTER ENG
 10.1822 +  _   _ @
 10.1823 + | \ | |@
 10.1824 + |  \| |@
 10.1825 + | |\  |@
 10.1826 + |_| \ |@
 10.1827 +     )_)@@
 10.1828 +0x014B  LATIN SMALL LETTER ENG
 10.1829 +  _ __  @
 10.1830 + | '_ \ @
 10.1831 + | | | |@
 10.1832 + |_| | |@
 10.1833 +     | |@
 10.1834 +    |__ @@
 10.1835 +0x014C  LATIN CAPITAL LETTER O WITH MACRON
 10.1836 +   ____ @
 10.1837 +  /_ _/ @
 10.1838 +  / _ \ @
 10.1839 + | (_) |@
 10.1840 +  \___/ @
 10.1841 +        @@
 10.1842 +0x014D  LATIN SMALL LETTER O WITH MACRON
 10.1843 +   ____ @
 10.1844 +  /_ _/ @
 10.1845 +  / _ \ @
 10.1846 + | (_) |@
 10.1847 +  \___/ @
 10.1848 +        @@
 10.1849 +0x014E  LATIN CAPITAL LETTER O WITH BREVE
 10.1850 +  \   / @
 10.1851 +   _-_  @
 10.1852 +  / _ \ @
 10.1853 + | |_| |@
 10.1854 +  \___/ @
 10.1855 +        @@
 10.1856 +0x014F  LATIN SMALL LETTER O WITH BREVE
 10.1857 +  \   / @
 10.1858 +   _-_  @
 10.1859 +  / _ \ @
 10.1860 + | |_| |@
 10.1861 +  \___/ @
 10.1862 +        @@
 10.1863 +0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 10.1864 +    ___ @
 10.1865 +   /_/_/@
 10.1866 +  / _ \ @
 10.1867 + | |_| |@
 10.1868 +  \___/ @
 10.1869 +        @@
 10.1870 +0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 10.1871 +    ___ @
 10.1872 +   /_/_/@
 10.1873 +  / _ \ @
 10.1874 + | |_| |@
 10.1875 +  \___/ @
 10.1876 +        @@
 10.1877 +0x0152  LATIN CAPITAL LIGATURE OE
 10.1878 +   ___  ___ @
 10.1879 +  / _ \| __|@
 10.1880 + | | | |  | @
 10.1881 + | |_| | |__@
 10.1882 +  \___/|____@
 10.1883 +            @@
 10.1884 +0x0153  LATIN SMALL LIGATURE OE
 10.1885 +             @
 10.1886 +   ___   ___ @
 10.1887 +  / _ \ / _ \@
 10.1888 + | (_) |  __/@
 10.1889 +  \___/ \___|@
 10.1890 +             @@
 10.1891 +0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 10.1892 +  _/_/  @
 10.1893 + |  _ \ @
 10.1894 + | |_) |@
 10.1895 + |  _ < @
 10.1896 + |_| \_\@
 10.1897 +        @@
 10.1898 +0x0155  LATIN SMALL LETTER R WITH ACUTE
 10.1899 +     __@
 10.1900 +  _ /_/@
 10.1901 + | '__|@
 10.1902 + | |   @
 10.1903 + |_|   @
 10.1904 +       @@
 10.1905 +0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 10.1906 +  ____  @
 10.1907 + |  _ \ @
 10.1908 + | |_) |@
 10.1909 + |  _ < @
 10.1910 + |_| \_\@
 10.1911 + )_)    @@
 10.1912 +0x0157  LATIN SMALL LETTER R WITH CEDILLA
 10.1913 +       @
 10.1914 +  _ __ @
 10.1915 + | '__|@
 10.1916 + | |   @
 10.1917 + |_|   @
 10.1918 +   )_) @@
 10.1919 +0x0158  LATIN CAPITAL LETTER R WITH CARON
 10.1920 +  _\_/  @
 10.1921 + |  _ \ @
 10.1922 + | |_) |@
 10.1923 + |  _ < @
 10.1924 + |_| \_\@
 10.1925 +        @@
 10.1926 +0x0159  LATIN SMALL LETTER R WITH CARON
 10.1927 +  \\// @
 10.1928 +  _\/_ @
 10.1929 + | '__|@
 10.1930 + | |   @
 10.1931 + |_|   @
 10.1932 +       @@
 10.1933 +0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 10.1934 +  _/_/  @
 10.1935 + / ___| @
 10.1936 + \___ \ @
 10.1937 +  ___) |@
 10.1938 + |____/ @
 10.1939 +        @@
 10.1940 +0x015B  LATIN SMALL LETTER S WITH ACUTE
 10.1941 +    __@
 10.1942 +  _/_/@
 10.1943 + / __|@
 10.1944 + \__ \@
 10.1945 + |___/@
 10.1946 +      @@
 10.1947 +0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 10.1948 +  _/\_  @
 10.1949 + / ___| @
 10.1950 + \___ \ @
 10.1951 +  ___) |@
 10.1952 + |____/ @
 10.1953 +        @@
 10.1954 +0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 10.1955 +      @
 10.1956 +  /_\_@
 10.1957 + / __|@
 10.1958 + \__ \@
 10.1959 + |___/@
 10.1960 +      @@
 10.1961 +0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 10.1962 +  ____  @
 10.1963 + / ___| @
 10.1964 + \___ \ @
 10.1965 +  ___) |@
 10.1966 + |____/ @
 10.1967 +    )__)@@
 10.1968 +0x015F  LATIN SMALL LETTER S WITH CEDILLA
 10.1969 +      @
 10.1970 +  ___ @
 10.1971 + / __|@
 10.1972 + \__ \@
 10.1973 + |___/@
 10.1974 +   )_)@@
 10.1975 +0x0160  LATIN CAPITAL LETTER S WITH CARON
 10.1976 +  _\_/  @
 10.1977 + / ___| @
 10.1978 + \___ \ @
 10.1979 +  ___) |@
 10.1980 + |____/ @
 10.1981 +        @@
 10.1982 +0x0161  LATIN SMALL LETTER S WITH CARON
 10.1983 +  \\//@
 10.1984 +  _\/ @
 10.1985 + / __|@
 10.1986 + \__ \@
 10.1987 + |___/@
 10.1988 +      @@
 10.1989 +0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 10.1990 +  _____ @
 10.1991 + |_   _|@
 10.1992 +   | |  @
 10.1993 +   | |  @
 10.1994 +   |_|  @
 10.1995 +    )__)@@
 10.1996 +0x0163  LATIN SMALL LETTER T WITH CEDILLA
 10.1997 +  _   @
 10.1998 + | |_ @
 10.1999 + | __|@
 10.2000 + | |_ @
 10.2001 +  \__|@
 10.2002 +   )_)@@
 10.2003 +0x0164  LATIN CAPITAL LETTER T WITH CARON
 10.2004 +  _____ @
 10.2005 + |_   _|@
 10.2006 +   | |  @
 10.2007 +   | |  @
 10.2008 +   |_|  @
 10.2009 +        @@
 10.2010 +0x0165  LATIN SMALL LETTER T WITH CARON
 10.2011 +  \/  @
 10.2012 + | |_ @
 10.2013 + | __|@
 10.2014 + | |_ @
 10.2015 +  \__|@
 10.2016 +      @@
 10.2017 +0x0166  LATIN CAPITAL LETTER T WITH STROKE
 10.2018 +  _____ @
 10.2019 + |_   _|@
 10.2020 +   | |  @
 10.2021 +  -|-|- @
 10.2022 +   |_|  @
 10.2023 +        @@
 10.2024 +0x0167  LATIN SMALL LETTER T WITH STROKE
 10.2025 +  _   @
 10.2026 + | |_ @
 10.2027 + | __|@
 10.2028 + |-|_ @
 10.2029 +  \__|@
 10.2030 +      @@
 10.2031 +0x0168  LATIN CAPITAL LETTER U WITH TILDE
 10.2032 +        @
 10.2033 +  _/\/_ @
 10.2034 + | | | |@
 10.2035 + | |_| |@
 10.2036 +  \___/ @
 10.2037 +        @@
 10.2038 +0x0169  LATIN SMALL LETTER U WITH TILDE
 10.2039 +        @
 10.2040 +  _/\/_ @
 10.2041 + | | | |@
 10.2042 + | |_| |@
 10.2043 +  \__,_|@
 10.2044 +        @@
 10.2045 +0x016A  LATIN CAPITAL LETTER U WITH MACRON
 10.2046 +   ____ @
 10.2047 +  /__ _/@
 10.2048 + | | | |@
 10.2049 + | |_| |@
 10.2050 +  \___/ @
 10.2051 +        @@
 10.2052 +0x016B  LATIN SMALL LETTER U WITH MACRON
 10.2053 +   ____ @
 10.2054 +  / _  /@
 10.2055 + | | | |@
 10.2056 + | |_| |@
 10.2057 +  \__,_|@
 10.2058 +        @@
 10.2059 +0x016C  LATIN CAPITAL LETTER U WITH BREVE
 10.2060 +        @
 10.2061 +   \_/_ @
 10.2062 + | | | |@
 10.2063 + | |_| |@
 10.2064 +  \____|@
 10.2065 +        @@
 10.2066 +0x016D  LATIN SMALL LETTER U WITH BREVE
 10.2067 +        @
 10.2068 +   \_/_ @
 10.2069 + | | | |@
 10.2070 + | |_| |@
 10.2071 +  \__,_|@
 10.2072 +        @@
 10.2073 +0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 10.2074 +    O   @
 10.2075 +  __  _ @
 10.2076 + | | | |@
 10.2077 + | |_| |@
 10.2078 +  \___/ @
 10.2079 +        @@
 10.2080 +0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 10.2081 +    O   @
 10.2082 +  __ __ @
 10.2083 + | | | |@
 10.2084 + | |_| |@
 10.2085 +  \__,_|@
 10.2086 +        @@
 10.2087 +0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 10.2088 +   -- --@
 10.2089 +  /_//_/@
 10.2090 + | | | |@
 10.2091 + | |_| |@
 10.2092 +  \___/ @
 10.2093 +        @@
 10.2094 +0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 10.2095 +    ____@
 10.2096 +  _/_/_/@
 10.2097 + | | | |@
 10.2098 + | |_| |@
 10.2099 +  \__,_|@
 10.2100 +        @@
 10.2101 +0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 10.2102 +  _   _ @
 10.2103 + | | | |@
 10.2104 + | | | |@
 10.2105 + | |_| |@
 10.2106 +  \___/ @
 10.2107 +    (__(@@
 10.2108 +0x0173  LATIN SMALL LETTER U WITH OGONEK
 10.2109 +        @
 10.2110 +  _   _ @
 10.2111 + | | | |@
 10.2112 + | |_| |@
 10.2113 +  \__,_|@
 10.2114 +     (_(@@
 10.2115 +0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 10.2116 + __    /\  __@
 10.2117 + \ \  //\\/ /@
 10.2118 +  \ \ /\ / / @
 10.2119 +   \ V  V /  @
 10.2120 +    \_/\_/   @
 10.2121 +             @@
 10.2122 +0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 10.2123 +      /\   @
 10.2124 + __  //\\__@
 10.2125 + \ \ /\ / /@
 10.2126 +  \ V  V / @
 10.2127 +   \_/\_/  @
 10.2128 +           @@
 10.2129 +0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 10.2130 +    /\  @
 10.2131 + __//\\ @
 10.2132 + \ \ / /@
 10.2133 +  \ V / @
 10.2134 +   |_|  @
 10.2135 +        @@
 10.2136 +0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 10.2137 +    /\  @
 10.2138 +   //\\ @
 10.2139 + | | | |@
 10.2140 + | |_| |@
 10.2141 +  \__, |@
 10.2142 +  |___/ @@
 10.2143 +0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 10.2144 +  []  []@
 10.2145 + __    _@
 10.2146 + \ \ / /@
 10.2147 +  \ V / @
 10.2148 +   |_|  @
 10.2149 +        @@
 10.2150 +0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 10.2151 +  __/_/@
 10.2152 + |__  /@
 10.2153 +   / / @
 10.2154 +  / /_ @
 10.2155 + /____|@
 10.2156 +       @@
 10.2157 +0x017A  LATIN SMALL LETTER Z WITH ACUTE
 10.2158 +    _ @
 10.2159 +  _/_/@
 10.2160 + |_  /@
 10.2161 +  / / @
 10.2162 + /___|@
 10.2163 +      @@
 10.2164 +0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 10.2165 +  __[]_@
 10.2166 + |__  /@
 10.2167 +   / / @
 10.2168 +  / /_ @
 10.2169 + /____|@
 10.2170 +       @@
 10.2171 +0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 10.2172 +   [] @
 10.2173 +  ____@
 10.2174 + |_  /@
 10.2175 +  / / @
 10.2176 + /___|@
 10.2177 +      @@
 10.2178 +0x017D  LATIN CAPITAL LETTER Z WITH CARON
 10.2179 +  _\_/_@
 10.2180 + |__  /@
 10.2181 +   / / @
 10.2182 +  / /_ @
 10.2183 + /____|@
 10.2184 +       @@
 10.2185 +0x017E  LATIN SMALL LETTER Z WITH CARON
 10.2186 +  \\//@
 10.2187 +  _\/_@
 10.2188 + |_  /@
 10.2189 +  / / @
 10.2190 + /___|@
 10.2191 +      @@
 10.2192 +0x017F  LATIN SMALL LETTER LONG S
 10.2193 +     __ @
 10.2194 +    / _|@
 10.2195 + |-| |  @
 10.2196 + |-| |  @
 10.2197 +   |_|  @
 10.2198 +        @@
 10.2199 +0x02C7  CARON
 10.2200 + \\//@
 10.2201 +  \/ @
 10.2202 +    $@
 10.2203 +    $@
 10.2204 +    $@
 10.2205 +    $@@
 10.2206 +0x02D8  BREVE
 10.2207 + \\_//@
 10.2208 +  \_/ @
 10.2209 +     $@
 10.2210 +     $@
 10.2211 +     $@
 10.2212 +     $@@
 10.2213 +0x02D9  DOT ABOVE
 10.2214 + []@
 10.2215 +  $@
 10.2216 +  $@
 10.2217 +  $@
 10.2218 +  $@
 10.2219 +  $@@
 10.2220 +0x02DB  OGONEK
 10.2221 +    $@
 10.2222 +    $@
 10.2223 +    $@
 10.2224 +    $@
 10.2225 +    $@
 10.2226 + )_) @@
 10.2227 +0x02DD  DOUBLE ACUTE ACCENT
 10.2228 +  _ _ @
 10.2229 + /_/_/@
 10.2230 +     $@
 10.2231 +     $@
 10.2232 +     $@
 10.2233 +     $@@