ia64/xen-unstable

changeset 3336:b2fa96909734

bitkeeper revision 1.1159.1.507 (41d2c267giyCo6LZ_--l9fFOwkMRIQ)

manual merge
author kaf24@scramble.cl.cam.ac.uk
date Wed Dec 29 14:42:47 2004 +0000 (2004-12-29)
parents 72b23176fb04 a3b623535680
children a477f7643de6
files .rootkeys xen/Makefile xen/arch/x86/domain.c xen/arch/x86/io_apic.c xen/arch/x86/nmi.c xen/arch/x86/pdb-stub.c xen/arch/x86/setup.c xen/arch/x86/traps.c xen/arch/x86/x86_32/entry.S xen/common/kernel.c xen/common/page_alloc.c xen/common/physdev.c xen/common/schedule.c xen/common/trace.c xen/drivers/char/console.c xen/drivers/char/serial.c xen/figlet/LICENSE xen/figlet/Makefile xen/figlet/README xen/figlet/figlet.c xen/figlet/xen.flf xen/include/xen/init.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	Mon Dec 27 13:35:05 2004 +0000
     1.2 +++ b/.rootkeys	Wed Dec 29 14:42:47 2004 +0000
     1.3 @@ -753,11 +753,6 @@ 3ddb79bfyX7-pD6XdxY_mdNrJR20iw xen/drive
     1.4  3ddb79bf2AS7YBGwooE_Kbv7XgUqNQ xen/drivers/pci/pci.ids
     1.5  3ddb79bf7sTn85WtP_8Nc2YEmmVExQ xen/drivers/pci/quirks.c
     1.6  3ddb79bfJaf0bkE1Y67bnll8-kjEPg xen/drivers/pci/setup-res.c
     1.7 -3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/figlet/LICENSE
     1.8 -3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/figlet/Makefile
     1.9 -3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/figlet/README
    1.10 -3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/figlet/figlet.c
    1.11 -3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/figlet/xen.flf
    1.12  40715b2cFpte_UNWnBZW0Du7z9AhTQ xen/include/acpi/acconfig.h
    1.13  40715b2cEQWX-PaxEH30qI48K1krnQ xen/include/acpi/acdebug.h
    1.14  40715b2c_7j-oy3ZNAuqE3IFNPzArg xen/include/acpi/acdisasm.h
    1.15 @@ -909,3 +904,9 @@ 3e7f358aMtFMUVvN_Zjg5qvEJIqEBA xen/inclu
    1.16  3ddb79c0BnA20PbgmuMPSGIBljNRQw xen/include/xen/time.h
    1.17  403a3edbG9K5uZjuY19_LORbQGmFbA xen/include/xen/trace.h
    1.18  3ddb79c1-kVvF8cVa0k3ZHDdBMj01Q xen/include/xen/types.h
    1.19 +41d291f5u3J3HYViXLs3cNuFGTvzNg xen/tools/Makefile
    1.20 +3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/tools/figlet/LICENSE
    1.21 +3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/tools/figlet/Makefile
    1.22 +3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
    1.23 +3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
    1.24 +3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
     2.1 --- a/xen/Makefile	Mon Dec 27 13:35:05 2004 +0000
     2.2 +++ b/xen/Makefile	Wed Dec 29 14:42:47 2004 +0000
     2.3 @@ -29,7 +29,7 @@ dist: $(TARGET)
     2.4  	$(MAKE) prefix=`pwd`/../dist/install dist=yes install
     2.5  
     2.6  clean:
     2.7 -	$(MAKE) -C figlet clean
     2.8 +	$(MAKE) -C tools clean
     2.9  	$(MAKE) -C common clean
    2.10  	$(MAKE) -C drivers clean
    2.11  	$(MAKE) -C arch/$(TARGET_ARCH) clean
    2.12 @@ -38,6 +38,7 @@ clean:
    2.13  
    2.14  $(TARGET): delete-unfresh-files
    2.15  	[ -e include/asm ] || ln -sf asm-$(TARGET_ARCH) include/asm
    2.16 +	$(MAKE) -C tools
    2.17  	$(MAKE) include/xen/compile.h
    2.18  	$(MAKE) -C arch/$(TARGET_ARCH) asm-offsets.s
    2.19  	$(MAKE) include/asm-$(TARGET_ARCH)/asm-offsets.h
    2.20 @@ -67,7 +68,7 @@ include/xen/compile.h:
    2.21  	@LANG=C echo \#define XEN_CHANGESET \"`bk changes -nd':D: :T: :REV: :MD5KEY:' -r+ 2>/dev/null || echo "information unavailable"`\" >> $@
    2.22  	@LANG=C echo >> $@
    2.23  	@LANG=C echo \#define XEN_BANNER \\ >> $@
    2.24 -	cd ./figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../$@ && cd ..
    2.25 +	( cd ./tools/figlet && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ )
    2.26  	@LANG=C echo >> $@
    2.27  
    2.28  include/asm-$(TARGET_ARCH)/asm-offsets.h: arch/$(TARGET_ARCH)/asm-offsets.s
     3.1 --- a/xen/arch/x86/domain.c	Mon Dec 27 13:35:05 2004 +0000
     3.2 +++ b/xen/arch/x86/domain.c	Wed Dec 29 14:42:47 2004 +0000
     3.3 @@ -12,6 +12,7 @@
     3.4   */
     3.5  
     3.6  #include <xen/config.h>
     3.7 +#include <xen/init.h>
     3.8  #include <xen/lib.h>
     3.9  #include <xen/errno.h>
    3.10  #include <xen/sched.h>
    3.11 @@ -38,6 +39,10 @@
    3.12  #include <public/io/ioreq.h>
    3.13  #include <xen/multicall.h>
    3.14  
    3.15 +/* opt_noreboot: If true, machine will need manual reset on error. */
    3.16 +static int opt_noreboot = 0;
    3.17 +boolean_param("noreboot", opt_noreboot);
    3.18 +
    3.19  #if !defined(CONFIG_X86_64BITMODE)
    3.20  /* No ring-3 access in initial page tables. */
    3.21  #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
    3.22 @@ -114,7 +119,6 @@ static inline void kb_wait(void)
    3.23  
    3.24  void machine_restart(char * __unused)
    3.25  {
    3.26 -    extern int opt_noreboot;
    3.27  #ifdef CONFIG_SMP
    3.28      int cpuid;
    3.29  #endif
     4.1 --- a/xen/arch/x86/io_apic.c	Mon Dec 27 13:35:05 2004 +0000
     4.2 +++ b/xen/arch/x86/io_apic.c	Wed Dec 29 14:42:47 2004 +0000
     4.3 @@ -1838,7 +1838,12 @@ int io_apic_set_pci_routing (int ioapic,
     4.4  
     4.5  #endif /*CONFIG_ACPI_BOOT*/
     4.6  
     4.7 -extern char opt_leveltrigger[], opt_edgetrigger[];
     4.8 +/* opt_leveltrigger, opt_edgetrigger: Force an IO-APIC-routed IRQ to be */
     4.9 +/*                                    level- or edge-triggered.         */
    4.10 +/* Example: 'leveltrigger=4,5,6,20 edgetrigger=21'. */
    4.11 +static char opt_leveltrigger[30] = "", opt_edgetrigger[30] = "";
    4.12 +string_param("leveltrigger", opt_leveltrigger);
    4.13 +string_param("edgetrigger", opt_edgetrigger);
    4.14  
    4.15  static int __init ioapic_trigger_setup(void)
    4.16  {
     5.1 --- a/xen/arch/x86/nmi.c	Mon Dec 27 13:35:05 2004 +0000
     5.2 +++ b/xen/arch/x86/nmi.c	Wed Dec 29 14:42:47 2004 +0000
     5.3 @@ -99,7 +99,7 @@ int __init check_nmi_watchdog (void)
     5.4      for ( j = 0; j < smp_num_cpus; j++ ) 
     5.5      {
     5.6          cpu = cpu_logical_map(j);
     5.7 -        prev_nmi_count[cpu] = irq_stat[cpu].__nmi_count;
     5.8 +        prev_nmi_count[cpu] = nmi_count(cpu);
     5.9      }
    5.10      __sti();
    5.11      mdelay((10*1000)/nmi_hz); /* wait 10 ticks */
     6.1 --- a/xen/arch/x86/pdb-stub.c	Mon Dec 27 13:35:05 2004 +0000
     6.2 +++ b/xen/arch/x86/pdb-stub.c	Wed Dec 29 14:42:47 2004 +0000
     6.3 @@ -22,6 +22,10 @@
     6.4  #include <xen/serial.h>
     6.5  #include <xen/softirq.h>
     6.6  
     6.7 +/* opt_pdb: Name of serial port for Xen pervasive debugger (and enable pdb) */
     6.8 +static unsigned char opt_pdb[10] = "none";
     6.9 +string_param("pdb", opt_pdb);
    6.10 +
    6.11  #define PDB_DEBUG_TRACE
    6.12  #ifdef PDB_DEBUG_TRACE
    6.13  #define TRC(_x) _x
    6.14 @@ -1241,8 +1245,6 @@ void pdb_handle_debug_trap(struct xen_re
    6.15  
    6.16  void initialize_pdb()
    6.17  {
    6.18 -    extern char opt_pdb[];
    6.19 -
    6.20      /* Certain state must be initialised even when PDB will not be used. */
    6.21      memset((void *) &breakpoints, 0, sizeof(breakpoints));
    6.22      INIT_LIST_HEAD(&breakpoints.list);
     7.1 --- a/xen/arch/x86/setup.c	Mon Dec 27 13:35:05 2004 +0000
     7.2 +++ b/xen/arch/x86/setup.c	Wed Dec 29 14:42:47 2004 +0000
     7.3 @@ -16,14 +16,33 @@
     7.4  #include <asm/domain_page.h>
     7.5  #include <asm/pdb.h>
     7.6  
     7.7 +/* opt_noht: If true, Hyperthreading is ignored. */
     7.8 +int opt_noht = 0;
     7.9 +boolean_param("noht", opt_noht);
    7.10 +
    7.11 +/* opt_noacpi: If true, ACPI tables are not parsed. */
    7.12 +static int opt_noacpi = 0;
    7.13 +boolean_param("noacpi", opt_noacpi);
    7.14 +
    7.15 +/* opt_nosmp: If true, secondary processors are ignored. */
    7.16 +static int opt_nosmp = 0;
    7.17 +boolean_param("nosmp", opt_nosmp);
    7.18 +
    7.19 +/* opt_ignorebiostables: If true, ACPI and MP tables are ignored. */
    7.20 +/* NB. This flag implies 'nosmp' and 'noacpi'. */
    7.21 +static int opt_ignorebiostables = 0;
    7.22 +boolean_param("ignorebiostables", opt_ignorebiostables);
    7.23 +
    7.24 +/* opt_watchdog: If true, run a watchdog NMI on each processor. */
    7.25 +static int opt_watchdog = 0;
    7.26 +boolean_param("watchdog", opt_watchdog);
    7.27 +
    7.28  extern void arch_init_memory(void);
    7.29  extern void init_IRQ(void);
    7.30  extern void trap_init(void);
    7.31  extern void time_init(void);
    7.32  extern void ac_timer_init(void);
    7.33  extern void initialize_keytable();
    7.34 -extern int opt_nosmp, opt_watchdog, opt_noacpi;
    7.35 -extern int opt_ignorebiostables;
    7.36  extern int do_timer_lists_from_pit;
    7.37  
    7.38  char ignore_irq13;		/* set if exception 16 works */
     8.1 --- a/xen/arch/x86/traps.c	Mon Dec 27 13:35:05 2004 +0000
     8.2 +++ b/xen/arch/x86/traps.c	Wed Dec 29 14:42:47 2004 +0000
     8.3 @@ -51,7 +51,19 @@
     8.4  #include <asm/uaccess.h>
     8.5  #include <asm/i387.h>
     8.6  #include <asm/debugger.h>
     8.7 -#include <asm/msr.h>
     8.8 +
     8.9 +/*
    8.10 + * opt_nmi: one of 'ignore', 'dom0', or 'fatal'.
    8.11 + *  fatal:  Xen prints diagnostic message and then hangs.
    8.12 + *  dom0:   The NMI is virtualised to DOM0.
    8.13 + *  ignore: The NMI error is cleared and ignored.
    8.14 + */
    8.15 +#ifdef NDEBUG
    8.16 +char opt_nmi[10] = "dom0";
    8.17 +#else
    8.18 +char opt_nmi[10] = "fatal";
    8.19 +#endif
    8.20 +string_param("nmi", opt_nmi);
    8.21  
    8.22  #if defined(__i386__)
    8.23  
     9.1 --- a/xen/arch/x86/x86_32/entry.S	Mon Dec 27 13:35:05 2004 +0000
     9.2 +++ b/xen/arch/x86/x86_32/entry.S	Wed Dec 29 14:42:47 2004 +0000
     9.3 @@ -593,16 +593,10 @@ ENTRY(nmi)
     9.4          movb  XREGS_cs(%esp),%al
     9.5          testl $(3|X86_EFLAGS_VM),%eax
     9.6          jnz   do_watchdog_tick
     9.7 -        movl  XREGS_ds(%esp),%eax
     9.8 +        movl  %ds,%eax
     9.9          cmpw  $(__HYPERVISOR_DS),%ax
    9.10          jne   restore_all_xen
    9.11 -        movl  XREGS_es(%esp),%eax
    9.12 -        cmpw  $(__HYPERVISOR_DS),%ax
    9.13 -        jne   restore_all_xen
    9.14 -        movl  XREGS_fs(%esp),%eax
    9.15 -        cmpw  $(__HYPERVISOR_DS),%ax
    9.16 -        jne   restore_all_xen
    9.17 -        movl  XREGS_gs(%esp),%eax
    9.18 +        movl  %es,%eax
    9.19          cmpw  $(__HYPERVISOR_DS),%ax
    9.20          jne   restore_all_xen
    9.21  
    10.1 --- a/xen/common/kernel.c	Mon Dec 27 13:35:05 2004 +0000
    10.2 +++ b/xen/common/kernel.c	Wed Dec 29 14:42:47 2004 +0000
    10.3 @@ -9,6 +9,7 @@
    10.4  
    10.5  #include <stdarg.h>
    10.6  #include <xen/config.h>
    10.7 +#include <xen/init.h>
    10.8  #include <xen/lib.h>
    10.9  #include <xen/errno.h>
   10.10  #include <xen/spinlock.h>
   10.11 @@ -26,111 +27,25 @@
   10.12  #include <asm/domain_page.h>
   10.13  #include <public/dom0_ops.h>
   10.14  
   10.15 -unsigned long xenheap_phys_end;
   10.16 -
   10.17 -xmem_cache_t *domain_struct_cachep;
   10.18 -xmem_cache_t *exec_domain_struct_cachep;
   10.19 -struct domain *dom0;
   10.20 -
   10.21 -vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
   10.22 -#if 0
   10.23 -struct e820entry {
   10.24 -    unsigned long addr_lo, addr_hi;        /* start of memory segment */
   10.25 -    unsigned long size_lo, size_hi;        /* size of memory segment */
   10.26 -    unsigned long type;                    /* type of memory segment */
   10.27 -};
   10.28 -#endif
   10.29 -void start_of_day(void);
   10.30 +/* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
   10.31 +static unsigned int opt_dom0_mem = 16000;
   10.32 +integer_param("dom0_mem", opt_dom0_mem);
   10.33  
   10.34 -/* opt_console: comma-separated list of console outputs. */
   10.35 -unsigned char opt_console[30] = "com1,vga";
   10.36 -/* opt_conswitch: a character pair controlling console switching. */
   10.37 -/* Char 1: CTRL+<char1> is used to switch console input between Xen and DOM0 */
   10.38 -/* Char 2: If this character is 'x', then do not auto-switch to DOM0 when it */
   10.39 -/*         boots. Any other value, or omitting the char, enables auto-switch */
   10.40 -unsigned char opt_conswitch[5] = "a"; /* NB. '`' would disable switching. */
   10.41 -/* opt_com[12]: Config serial port with a string <baud>,DPS,<io-base>,<irq>. */
   10.42 -unsigned char opt_com1[30] = "", opt_com2[30] = "";
   10.43 -/* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
   10.44 -unsigned int opt_dom0_mem = 16000;
   10.45 -/* opt_noht: If true, Hyperthreading is ignored. */
   10.46 -int opt_noht=0;
   10.47 -/* opt_noacpi: If true, ACPI tables are not parsed. */
   10.48 -int opt_noacpi=0;
   10.49 -/* opt_nosmp: If true, secondary processors are ignored. */
   10.50 -int opt_nosmp=0;
   10.51 -/* opt_noreboot: If true, machine will need manual reset on error. */
   10.52 -int opt_noreboot=0;
   10.53 -/* opt_ignorebiostables: If true, ACPI and MP tables are ignored. */
   10.54 -/* NB. This flag implies 'nosmp' and 'noacpi'. */
   10.55 -int opt_ignorebiostables=0;
   10.56 -/* opt_watchdog: If true, run a watchdog NMI on each processor. */
   10.57 -int opt_watchdog=0;
   10.58 -/* opt_pdb: Name of serial port for Xen pervasive debugger (and enable pdb) */
   10.59 -unsigned char opt_pdb[10] = "none";
   10.60 -/* opt_tbuf_size: trace buffer size (in pages) */
   10.61 -unsigned int opt_tbuf_size = 10;
   10.62 -/* opt_sched: scheduler - default to Borrowed Virtual Time */
   10.63 -char opt_sched[10] = "bvt";
   10.64 -/* opt_physdev_dom0_hide: list of PCI slots to hide from domain 0. */
   10.65 -/* Format is '(%02x:%02x.%1x)(%02x:%02x.%1x)' and so on. */
   10.66 -char opt_physdev_dom0_hide[200] = "";
   10.67 -/* opt_leveltrigger, opt_edgetrigger: Force an IO-APIC-routed IRQ to be */
   10.68 -/*                                    level- or edge-triggered.         */
   10.69 -/* Example: 'leveltrigger=4,5,6,20 edgetrigger=21'. */
   10.70 -char opt_leveltrigger[30] = "", opt_edgetrigger[30] = "";
   10.71  /*
   10.72   * opt_xenheap_megabytes: Size of Xen heap in megabytes, excluding the
   10.73   * pfn_info table and allocation bitmap.
   10.74   */
   10.75 -unsigned int opt_xenheap_megabytes = XENHEAP_DEFAULT_MB;
   10.76 -/*
   10.77 - * opt_nmi: one of 'ignore', 'dom0', or 'fatal'.
   10.78 - *  fatal:  Xen prints diagnostic message and then hangs.
   10.79 - *  dom0:   The NMI is virtualised to DOM0.
   10.80 - *  ignore: The NMI error is cleared and ignored.
   10.81 - */
   10.82 -#ifdef NDEBUG
   10.83 -char opt_nmi[10] = "dom0";
   10.84 -#else
   10.85 -char opt_nmi[10] = "fatal";
   10.86 -#endif
   10.87 -/*
   10.88 - * Comma-separated list of hexadecimal page numbers containing bad bytes.
   10.89 - * e.g. 'badpage=0x3f45,0x8a321'.
   10.90 - */
   10.91 -char opt_badpage[100] = "";
   10.92 +static unsigned int opt_xenheap_megabytes = XENHEAP_DEFAULT_MB;
   10.93 +integer_param("xenheap_megabytes", opt_xenheap_megabytes);
   10.94 +
   10.95 +unsigned long xenheap_phys_end;
   10.96  
   10.97 -static struct {
   10.98 -    unsigned char *name;
   10.99 -    enum { OPT_STR, OPT_UINT, OPT_BOOL } type;
  10.100 -    void *var;
  10.101 -    unsigned int len;
  10.102 -} opts[] = {
  10.103 -#define V(_x) &_x, sizeof(_x)
  10.104 -    { "console",           OPT_STR,  V(opt_console) },
  10.105 -    { "conswitch",         OPT_STR,  V(opt_conswitch) },
  10.106 -    { "com1",              OPT_STR,  V(opt_com1) },
  10.107 -    { "com2",              OPT_STR,  V(opt_com2) },
  10.108 -    { "dom0_mem",          OPT_UINT, V(opt_dom0_mem) },
  10.109 -    { "noht",              OPT_BOOL, V(opt_noht) },
  10.110 -    { "noacpi",            OPT_BOOL, V(opt_noacpi) },
  10.111 -    { "nosmp",             OPT_BOOL, V(opt_nosmp) },
  10.112 -    { "noreboot",          OPT_BOOL, V(opt_noreboot) },
  10.113 -    { "ignorebiostables",  OPT_BOOL, V(opt_ignorebiostables) },
  10.114 -    { "watchdog",          OPT_BOOL, V(opt_watchdog) },
  10.115 -    { "pdb",               OPT_STR,  V(opt_pdb) },
  10.116 -    { "tbuf_size",         OPT_UINT, V(opt_tbuf_size) },
  10.117 -    { "sched",             OPT_STR,  V(opt_sched) },
  10.118 -    { "physdev_dom0_hide", OPT_STR,  V(opt_physdev_dom0_hide) },
  10.119 -    { "leveltrigger",      OPT_STR,  V(opt_leveltrigger) },
  10.120 -    { "edgetrigger",       OPT_STR,  V(opt_edgetrigger) },
  10.121 -    { "xenheap_megabytes", OPT_UINT, V(opt_xenheap_megabytes) },
  10.122 -    { "nmi",               OPT_STR,  V(opt_nmi) },
  10.123 -    { "badpage",           OPT_STR,  V(opt_badpage) },
  10.124 -    { NULL,                0,        NULL, 0 }
  10.125 -};
  10.126 +xmem_cache_t *domain_struct_cachep;
  10.127 +struct domain *dom0;
  10.128  
  10.129 +vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
  10.130 +
  10.131 +void start_of_day(void);
  10.132  
  10.133  void cmain(multiboot_info_t *mbi)
  10.134  {
  10.135 @@ -138,7 +53,6 @@ void cmain(multiboot_info_t *mbi)
  10.136      unsigned char *cmdline;
  10.137      module_t *mod = (module_t *)__va(mbi->mods_addr);
  10.138      void *heap_start;
  10.139 -    int i;
  10.140      unsigned long max_mem;
  10.141      unsigned long dom0_memory_start, dom0_memory_end;
  10.142      unsigned long initial_images_start, initial_images_end;
  10.143 @@ -148,35 +62,42 @@ void cmain(multiboot_info_t *mbi)
  10.144      if ( cmdline != NULL )
  10.145      {
  10.146          unsigned char *opt_end, *opt;
  10.147 -        while ( *cmdline == ' ' ) cmdline++;
  10.148 +        struct kernel_param *param;
  10.149 +        while ( *cmdline == ' ' )
  10.150 +            cmdline++;
  10.151          cmdline = strchr(cmdline, ' '); /* skip the image name */
  10.152          while ( cmdline != NULL )
  10.153          {
  10.154 -            while ( *cmdline == ' ' ) cmdline++;
  10.155 -            if ( *cmdline == '\0' ) break;
  10.156 +            while ( *cmdline == ' ' )
  10.157 +                cmdline++;
  10.158 +            if ( *cmdline == '\0' )
  10.159 +                break;
  10.160              opt_end = strchr(cmdline, ' ');
  10.161 -            if ( opt_end != NULL ) *opt_end++ = '\0';
  10.162 +            if ( opt_end != NULL )
  10.163 +                *opt_end++ = '\0';
  10.164              opt = strchr(cmdline, '=');
  10.165 -            if ( opt != NULL ) *opt++ = '\0';
  10.166 -            for ( i = 0; opts[i].name != NULL; i++ )
  10.167 +            if ( opt != NULL )
  10.168 +                *opt++ = '\0';
  10.169 +            for ( param = &__setup_start; param != &__setup_end; param++ )
  10.170              {
  10.171 -                if ( strcmp(opts[i].name, cmdline ) != 0 ) continue;
  10.172 -                switch ( opts[i].type )
  10.173 +                if ( strcmp(param->name, cmdline ) != 0 )
  10.174 +                    continue;
  10.175 +                switch ( param->type )
  10.176                  {
  10.177                  case OPT_STR:
  10.178                      if ( opt != NULL )
  10.179                      {
  10.180 -                        strncpy(opts[i].var, opt, opts[i].len);
  10.181 -                        ((char *)opts[i].var)[opts[i].len-1] = '\0';
  10.182 +                        strncpy(param->var, opt, param->len);
  10.183 +                        ((char *)param->var)[param->len-1] = '\0';
  10.184                      }
  10.185                      break;
  10.186                  case OPT_UINT:
  10.187                      if ( opt != NULL )
  10.188 -                        *(unsigned int *)opts[i].var =
  10.189 +                        *(unsigned int *)param->var =
  10.190                              simple_strtol(opt, (char **)&opt, 0);
  10.191                      break;
  10.192                  case OPT_BOOL:
  10.193 -                    *(int *)opts[i].var = 1;
  10.194 +                    *(int *)param->var = 1;
  10.195                      break;
  10.196                  }
  10.197              }
    11.1 --- a/xen/common/page_alloc.c	Mon Dec 27 13:35:05 2004 +0000
    11.2 +++ b/xen/common/page_alloc.c	Wed Dec 29 14:42:47 2004 +0000
    11.3 @@ -30,7 +30,12 @@
    11.4  #include <xen/irq.h>
    11.5  #include <asm/domain_page.h>
    11.6  
    11.7 -extern char opt_badpage[];
    11.8 +/*
    11.9 + * Comma-separated list of hexadecimal page numbers containing bad bytes.
   11.10 + * e.g. 'badpage=0x3f45,0x8a321'.
   11.11 + */
   11.12 +static char opt_badpage[100] = "";
   11.13 +string_param("badpage", opt_badpage);
   11.14  
   11.15  /*********************
   11.16   * ALLOCATION BITMAP
    12.1 --- a/xen/common/physdev.c	Mon Dec 27 13:35:05 2004 +0000
    12.2 +++ b/xen/common/physdev.c	Wed Dec 29 14:42:47 2004 +0000
    12.3 @@ -19,6 +19,7 @@
    12.4   */
    12.5  
    12.6  #include <xen/config.h>
    12.7 +#include <xen/init.h>
    12.8  #include <xen/lib.h>
    12.9  #include <xen/types.h>
   12.10  #include <xen/sched.h>
   12.11 @@ -713,11 +714,15 @@ long do_physdev_op(physdev_op_t *uop)
   12.12      return ret;
   12.13  }
   12.14  
   12.15 +/* opt_physdev_dom0_hide: list of PCI slots to hide from domain 0. */
   12.16 +/* Format is '(%02x:%02x.%1x)(%02x:%02x.%1x)' and so on. */
   12.17 +static char opt_physdev_dom0_hide[200] = "";
   12.18 +string_param("physdev_dom0_hide", opt_physdev_dom0_hide);
   12.19 +
   12.20  /* Test if boot params specify this device should NOT be visible to DOM0
   12.21   * (e.g. so that another domain can control it instead) */
   12.22  int pcidev_dom0_hidden(struct pci_dev *dev)
   12.23  {
   12.24 -    extern char opt_physdev_dom0_hide[];
   12.25      char cmp[10] = "(.......)";
   12.26      
   12.27      strncpy(&cmp[1], dev->slot_name, 7);
    13.1 --- a/xen/common/schedule.c	Mon Dec 27 13:35:05 2004 +0000
    13.2 +++ b/xen/common/schedule.c	Wed Dec 29 14:42:47 2004 +0000
    13.3 @@ -28,6 +28,10 @@
    13.4  #include <xen/trace.h>
    13.5  #include <public/sched_ctl.h>
    13.6  
    13.7 +/* opt_sched: scheduler - default to Borrowed Virtual Time */
    13.8 +static char opt_sched[10] = "bvt";
    13.9 +string_param("sched", opt_sched);
   13.10 +
   13.11  /*#define WAKE_HISTO*/
   13.12  /*#define BLOCKTIME_HISTO*/
   13.13  
   13.14 @@ -543,8 +547,6 @@ void __init scheduler_init(void)
   13.15  
   13.16      schedule_data[0].idle = &idle0_exec_domain;
   13.17  
   13.18 -    extern char opt_sched[];
   13.19 -
   13.20      for ( i = 0; schedulers[i] != NULL; i++ )
   13.21      {
   13.22          ops = *schedulers[i];
    14.1 --- a/xen/common/trace.c	Mon Dec 27 13:35:05 2004 +0000
    14.2 +++ b/xen/common/trace.c	Wed Dec 29 14:42:47 2004 +0000
    14.3 @@ -28,8 +28,10 @@
    14.4  #include <asm/atomic.h>
    14.5  #include <public/dom0_ops.h>
    14.6  
    14.7 -extern unsigned int opt_tbuf_size;
    14.8 -        
    14.9 +/* opt_tbuf_size: trace buffer size (in pages) */
   14.10 +static unsigned int opt_tbuf_size = 10;
   14.11 +integer_param("tbuf_size", opt_tbuf_size);
   14.12 +
   14.13  /* Pointers to the meta-data objects for all system trace buffers */
   14.14  struct t_buf *t_bufs[NR_CPUS];
   14.15  
    15.1 --- a/xen/drivers/char/console.c	Mon Dec 27 13:35:05 2004 +0000
    15.2 +++ b/xen/drivers/char/console.c	Wed Dec 29 14:42:47 2004 +0000
    15.3 @@ -8,6 +8,7 @@
    15.4  
    15.5  #include <stdarg.h>
    15.6  #include <xen/config.h>
    15.7 +#include <xen/init.h>
    15.8  #include <xen/lib.h>
    15.9  #include <xen/errno.h>
   15.10  #include <xen/event.h>
   15.11 @@ -17,7 +18,16 @@
   15.12  #include <xen/keyhandler.h>
   15.13  #include <asm/uaccess.h>
   15.14  
   15.15 -extern unsigned char opt_console[], opt_conswitch[];
   15.16 +/* opt_console: comma-separated list of console outputs. */
   15.17 +static unsigned char opt_console[30] = "com1,vga";
   15.18 +string_param("console", opt_console);
   15.19 +
   15.20 +/* opt_conswitch: a character pair controlling console switching. */
   15.21 +/* Char 1: CTRL+<char1> is used to switch console input between Xen and DOM0 */
   15.22 +/* Char 2: If this character is 'x', then do not auto-switch to DOM0 when it */
   15.23 +/*         boots. Any other value, or omitting the char, enables auto-switch */
   15.24 +static unsigned char opt_conswitch[5] = "a";
   15.25 +string_param("conswitch", opt_conswitch);
   15.26  
   15.27  static int xpos, ypos;
   15.28  static unsigned char *video = __va(0xB8000);
    16.1 --- a/xen/drivers/char/serial.c	Mon Dec 27 13:35:05 2004 +0000
    16.2 +++ b/xen/drivers/char/serial.c	Wed Dec 29 14:42:47 2004 +0000
    16.3 @@ -9,6 +9,7 @@
    16.4   */
    16.5  
    16.6  #include <xen/config.h>
    16.7 +#include <xen/init.h>
    16.8  #include <xen/irq.h>
    16.9  #include <xen/keyhandler.h> 
   16.10  #include <asm/pdb.h>
   16.11 @@ -17,6 +18,11 @@
   16.12  #include <xen/serial.h>
   16.13  #include <asm/io.h>
   16.14  
   16.15 +/* opt_com[12]: Config serial port with a string <baud>,DPS,<io-base>,<irq>. */
   16.16 +static unsigned char opt_com1[30] = "", opt_com2[30] = "";
   16.17 +string_param("com1", opt_com1);
   16.18 +string_param("com2", opt_com2);
   16.19 +
   16.20  /* Register offsets */
   16.21  #define RBR             0x00    /* receive buffer       */
   16.22  #define THR             0x00    /* transmit holding     */
   16.23 @@ -280,8 +286,6 @@ static void uart_config_stage2(uart_t *u
   16.24  
   16.25  void serial_init_stage1(void)
   16.26  {
   16.27 -    extern unsigned char opt_com1[], opt_com2[];
   16.28 -
   16.29      parse_port_config(opt_com1, &com[0]);
   16.30      parse_port_config(opt_com2, &com[1]);
   16.31  
    17.1 --- a/xen/figlet/LICENSE	Mon Dec 27 13:35:05 2004 +0000
    17.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.3 @@ -1,111 +0,0 @@
    17.4 -http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
    17.5 -
    17.6 -			 The "Artistic License"
    17.7 -
    17.8 -				Preamble
    17.9 -
   17.10 -The intent of this document is to state the conditions under which a
   17.11 -Package may be copied, such that the Copyright Holder maintains some
   17.12 -semblance of artistic control over the development of the package,
   17.13 -while giving the users of the package the right to use and distribute
   17.14 -the Package in a more-or-less customary fashion, plus the right to make
   17.15 -reasonable modifications.
   17.16 -
   17.17 -Definitions:
   17.18 -
   17.19 -	"Package" refers to the collection of files distributed by the
   17.20 -	Copyright Holder, and derivatives of that collection of files
   17.21 -	created through textual modification.
   17.22 -
   17.23 -	"Standard Version" refers to such a Package if it has not been
   17.24 -	modified, or has been modified in accordance with the wishes
   17.25 -	of the Copyright Holder.
   17.26 -
   17.27 -	"Copyright Holder" is whoever is named in the copyright or
   17.28 -	copyrights for the package.
   17.29 -
   17.30 -	"You" is you, if you're thinking about copying or distributing
   17.31 -	this Package.
   17.32 -
   17.33 -	"Reasonable copying fee" is whatever you can justify on the
   17.34 -	basis of media cost, duplication charges, time of people involved,
   17.35 -	and so on.  (You will not be required to justify it to the
   17.36 -	Copyright Holder, but only to the computing community at large
   17.37 -	as a market that must bear the fee.)
   17.38 -
   17.39 -	"Freely Available" means that no fee is charged for the item
   17.40 -	itself, though there may be fees involved in handling the item.
   17.41 -	It also means that recipients of the item may redistribute it
   17.42 -	under the same conditions they received it.
   17.43 -
   17.44 -1. You may make and give away verbatim copies of the source form of the
   17.45 -Standard Version of this Package without restriction, provided that you
   17.46 -duplicate all of the original copyright notices and associated disclaimers.
   17.47 -
   17.48 -2. You may apply bug fixes, portability fixes and other modifications
   17.49 -derived from the Public Domain or from the Copyright Holder.  A Package
   17.50 -modified in such a way shall still be considered the Standard Version.
   17.51 -
   17.52 -3. You may otherwise modify your copy of this Package in any way, provided
   17.53 -that you insert a prominent notice in each changed file stating how and
   17.54 -when you changed that file, and provided that you do at least ONE of the
   17.55 -following:
   17.56 -
   17.57 -    a) place your modifications in the Public Domain or otherwise make them
   17.58 -    Freely Available, such as by posting said modifications to Usenet or
   17.59 -    an equivalent medium, or placing the modifications on a major archive
   17.60 -    site such as ftp.uu.net, or by allowing the Copyright Holder to include
   17.61 -    your modifications in the Standard Version of the Package.
   17.62 -
   17.63 -    b) use the modified Package only within your corporation or organization.
   17.64 -
   17.65 -    c) rename any non-standard executables so the names do not conflict
   17.66 -    with standard executables, which must also be provided, and provide
   17.67 -    a separate manual page for each non-standard executable that clearly
   17.68 -    documents how it differs from the Standard Version.
   17.69 -
   17.70 -    d) make other distribution arrangements with the Copyright Holder.
   17.71 -
   17.72 -4. You may distribute the programs of this Package in object code or
   17.73 -executable form, provided that you do at least ONE of the following:
   17.74 -
   17.75 -    a) distribute a Standard Version of the executables and library files,
   17.76 -    together with instructions (in the manual page or equivalent) on where
   17.77 -    to get the Standard Version.
   17.78 -
   17.79 -    b) accompany the distribution with the machine-readable source of
   17.80 -    the Package with your modifications.
   17.81 -
   17.82 -    c) accompany any non-standard executables with their corresponding
   17.83 -    Standard Version executables, giving the non-standard executables
   17.84 -    non-standard names, and clearly documenting the differences in manual
   17.85 -    pages (or equivalent), together with instructions on where to get
   17.86 -    the Standard Version.
   17.87 -
   17.88 -    d) make other distribution arrangements with the Copyright Holder.
   17.89 -
   17.90 -5. You may charge a reasonable copying fee for any distribution of this
   17.91 -Package.  You may charge any fee you choose for support of this Package.
   17.92 -You may not charge a fee for this Package itself.  However,
   17.93 -you may distribute this Package in aggregate with other (possibly
   17.94 -commercial) programs as part of a larger (possibly commercial) software
   17.95 -distribution provided that you do not advertise this Package as a
   17.96 -product of your own.
   17.97 -
   17.98 -6. The scripts and library files supplied as input to or produced as
   17.99 -output from the programs of this Package do not automatically fall
  17.100 -under the copyright of this Package, but belong to whomever generated
  17.101 -them, and may be sold commercially, and may be aggregated with this
  17.102 -Package.
  17.103 -
  17.104 -7. C or perl subroutines supplied by you and linked into this Package
  17.105 -shall not be considered part of this Package.
  17.106 -
  17.107 -8. The name of the Copyright Holder may not be used to endorse or promote
  17.108 -products derived from this software without specific prior written permission.
  17.109 -
  17.110 -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  17.111 -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  17.112 -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17.113 -
  17.114 -				The End
    18.1 --- a/xen/figlet/Makefile	Mon Dec 27 13:35:05 2004 +0000
    18.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.3 @@ -1,8 +0,0 @@
    18.4 -
    18.5 -CC := gcc
    18.6 -
    18.7 -figlet: figlet.c
    18.8 -	$(CC) -o $@ $<
    18.9 -
   18.10 -clean:
   18.11 -	rm -f *.o figlet
    19.1 --- a/xen/figlet/README	Mon Dec 27 13:35:05 2004 +0000
    19.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.3 @@ -1,9 +0,0 @@
    19.4 -
    19.5 -NB. This is a very hacked version of Figlet 2.2.1. 
    19.6 -
    19.7 -Don't use this outside the Xen build system. A proper version of Figlet
    19.8 -can be had from <http://www.figlet.org>.
    19.9 -
   19.10 -The distribution license is intact in the LICENSE file.
   19.11 -
   19.12 - -- Keir Fraser (2/5/2003)
    20.1 --- a/xen/figlet/figlet.c	Mon Dec 27 13:35:05 2004 +0000
    20.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.3 @@ -1,2075 +0,0 @@
    20.4 -
    20.5 -/*
    20.6 - * XXXXXXXXXXXXXXXXXXXXXXXXXXX
    20.7 - * 
    20.8 - * This is a HACKED figlet source file for Xen.
    20.9 - * 
   20.10 - * Hacked to output C octal strings for inclusion in a header file.
   20.11 - * Support for opening zipped files is removed.
   20.12 - * 
   20.13 - * Go to www.figlet.org for the unhacked Figlet sources.
   20.14 - */
   20.15 -
   20.16 -/****************************************************************************
   20.17 -
   20.18 -  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
   20.19 -  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
   20.20 -  FIGlet Copyright 2002 Christiaan Keet
   20.21 -  Portions written by Paul Burton and Christiaan Keet
   20.22 -  Internet: <info@figlet.org>
   20.23 -  FIGlet, along with the various FIGlet fonts and documentation, is
   20.24 -    copyrighted under the provisions of the Artistic License (as listed
   20.25 -    in the file "Artistic-license.txt" which is included in this package.
   20.26 -****************************************************************************/
   20.27 -
   20.28 -#define DATE "13 July 2002"
   20.29 -#define VERSION "2.2.1"
   20.30 -#define VERSION_INT 20201
   20.31 -
   20.32 -/* FIGlet (Frank, Ian & Glenn's Letters) */
   20.33 -/* by Glenn Chappell */
   20.34 -/* Apr 1991 */
   20.35 -/* Automatic file addition by Ian Chai May 1991 */
   20.36 -/* Punctuation and numbers addition by Ian Chai Jan 1993 */
   20.37 -/* Full ASCII by Glenn Chappell Feb 1993 */
   20.38 -/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
   20.39 -/* Hard blanks by Glenn Chappell Apr 1993 */
   20.40 -/* Release 2.0 5 Aug 1993 */
   20.41 -/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
   20.42 -/* Control files by Glenn Chappell Feb 1994 */
   20.43 -/* Release 2.1 12 Aug 1994 */
   20.44 -/* Release 2.1.1 25 Aug 1994 */
   20.45 -/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
   20.46 -   option.  Sept 8, 1996 */
   20.47 -/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
   20.48 -   mapping tables, kerning/smushing options. */
   20.49 -/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
   20.50 -   FAQs and comments. 13 July 2002. The new official FIGlet website is 
   20.51 -   http://www.figlet.org/  */
   20.52 -
   20.53 -#define DEFAULTFONTDIR "."
   20.54 -#define DEFAULTFONTFILE "xen.flf"
   20.55 -
   20.56 -#include <stdio.h>
   20.57 -#ifdef __STDC__
   20.58 -#include <stdlib.h>
   20.59 -#endif
   20.60 -#include <string.h>
   20.61 -#include <ctype.h>
   20.62 -#include <fcntl.h>     /* Needed for get_columns */
   20.63 -
   20.64 -#ifdef unix
   20.65 -#include <sys/ioctl.h> /* Needed for get_columns */
   20.66 -#endif
   20.67 -
   20.68 -
   20.69 -#define ZFILE FILE
   20.70 -#define Zopen fopen
   20.71 -#define Zgetc fgetc
   20.72 -#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
   20.73 -#define Zclose fclose
   20.74 -
   20.75 -#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
   20.76 -
   20.77 -#define DIRSEP '/'
   20.78 -#define DIRSEP2 '\\'
   20.79 -/* Leave alone for Unix and MS-DOS/Windows!
   20.80 -Note: '/' also used in filename in get_columns(). */
   20.81 -
   20.82 -#define FONTFILESUFFIX ".flf"
   20.83 -#define FONTFILEMAGICNUMBER "flf2"
   20.84 -#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
   20.85 -#define CONTROLFILESUFFIX ".flc"
   20.86 -#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
   20.87 -#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
   20.88 -#define DEFAULTCOLUMNS 80
   20.89 -
   20.90 -
   20.91 -/****************************************************************************
   20.92 -
   20.93 -  Globals dealing with chars that are read
   20.94 -
   20.95 -****************************************************************************/
   20.96 -
   20.97 -typedef long inchr; /* "char" read from stdin */
   20.98 -
   20.99 -inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
  20.100 -                   /* Note: not null-terminated. */
  20.101 -int inchrlinelen,inchrlinelenlimit;
  20.102 -inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
  20.103 -  /* Latin-1 codes for German letters, respectively:
  20.104 -     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
  20.105 -     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
  20.106 -     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
  20.107 -     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
  20.108 -     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
  20.109 -     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
  20.110 -     LATIN SMALL LETTER SHARP S = ess-zed
  20.111 -  */
  20.112 -
  20.113 -int hzmode;  /* true if reading double-bytes in HZ mode */
  20.114 -int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
  20.115 -inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
  20.116 -int gl; /* 0-3 specifies left-half Gn character set */
  20.117 -int gr; /* 0-3 specifies right-half Gn character set */
  20.118 -
  20.119 -int Myargc;  /* to avoid passing around argc and argv */
  20.120 -char **Myargv;
  20.121 -
  20.122 -/****************************************************************************
  20.123 -
  20.124 -  Globals dealing with chars that are written
  20.125 -
  20.126 -****************************************************************************/
  20.127 -
  20.128 -typedef struct fc {
  20.129 -  inchr ord;
  20.130 -  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  20.131 -  struct fc *next;
  20.132 -  } fcharnode;
  20.133 -
  20.134 -fcharnode *fcharlist;
  20.135 -char **currchar;
  20.136 -int currcharwidth;
  20.137 -int previouscharwidth;
  20.138 -char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
  20.139 -int outlinelen;
  20.140 -
  20.141 -
  20.142 -/****************************************************************************
  20.143 -
  20.144 -  Globals dealing with command file storage
  20.145 -
  20.146 -****************************************************************************/
  20.147 -
  20.148 -typedef struct cfn {
  20.149 -  char *thename;
  20.150 -  struct cfn *next;
  20.151 -  } cfnamenode;
  20.152 -
  20.153 -cfnamenode *cfilelist,**cfilelistend;
  20.154 -
  20.155 -typedef struct cm {
  20.156 -  int thecommand;
  20.157 -  inchr rangelo;
  20.158 -  inchr rangehi;
  20.159 -  inchr offset;
  20.160 -  struct cm *next;
  20.161 -  } comnode;
  20.162 -
  20.163 -comnode *commandlist,**commandlistend;
  20.164 -
  20.165 -/****************************************************************************
  20.166 -
  20.167 -  Globals affected by command line options
  20.168 -
  20.169 -****************************************************************************/
  20.170 -
  20.171 -int deutschflag,justification,paragraphflag,right2left,multibyte;
  20.172 -int cmdinput;
  20.173 -
  20.174 -#define SM_SMUSH 128
  20.175 -#define SM_KERN 64
  20.176 -#define SM_EQUAL 1
  20.177 -#define SM_LOWLINE 2
  20.178 -#define SM_HIERARCHY 4
  20.179 -#define SM_PAIR 8
  20.180 -#define SM_BIGX 16
  20.181 -#define SM_HARDBLANK 32
  20.182 -
  20.183 -int smushmode;
  20.184 -
  20.185 -#define SMO_NO 0     /* no command-line smushmode */
  20.186 -#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
  20.187 -#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
  20.188 -
  20.189 -int smushoverride;
  20.190 -
  20.191 -int outputwidth;
  20.192 -int outlinelenlimit;
  20.193 -char *fontdirname,*fontname;
  20.194 -
  20.195 -
  20.196 -/****************************************************************************
  20.197 -
  20.198 -  Globals read from font file
  20.199 -
  20.200 -****************************************************************************/
  20.201 -
  20.202 -char hardblank;
  20.203 -int charheight;
  20.204 -
  20.205 -
  20.206 -/****************************************************************************
  20.207 -
  20.208 -  Name of program, used in error messages
  20.209 -
  20.210 -****************************************************************************/
  20.211 -
  20.212 -char *myname;
  20.213 -
  20.214 -
  20.215 -#ifdef TIOCGWINSZ
  20.216 -/****************************************************************************
  20.217 -
  20.218 -  get_columns
  20.219 -
  20.220 -  Determines the number of columns of /dev/tty.  Returns the number of
  20.221 -  columns, or -1 if error.  May return 0 if columns unknown.
  20.222 -  Requires include files <fcntl.h> and <sys/ioctl.h>.
  20.223 -  by Glenn Chappell & Ian Chai 14 Apr 1993
  20.224 -
  20.225 -****************************************************************************/
  20.226 -
  20.227 -int get_columns()
  20.228 -{
  20.229 -  struct winsize ws;
  20.230 -  int fd,result;
  20.231 -
  20.232 -  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
  20.233 -  result = ioctl(fd,TIOCGWINSZ,&ws);
  20.234 -  close(fd);
  20.235 -  return result?-1:ws.ws_col;
  20.236 -}
  20.237 -#endif /* ifdef TIOCGWINSZ */
  20.238 -
  20.239 -
  20.240 -/****************************************************************************
  20.241 -
  20.242 -  myalloc
  20.243 -
  20.244 -  Calls malloc.  If malloc returns error, prints error message and
  20.245 -  quits.
  20.246 -
  20.247 -****************************************************************************/
  20.248 -
  20.249 -#ifdef __STDC__
  20.250 -char *myalloc(size_t size)
  20.251 -#else
  20.252 -char *myalloc(size)
  20.253 -int size;
  20.254 -#endif
  20.255 -{
  20.256 -  char *ptr;
  20.257 -#ifndef __STDC__
  20.258 -  extern void *malloc();
  20.259 -#endif
  20.260 -
  20.261 -  if ((ptr = (char*)malloc(size))==NULL) {
  20.262 -    fprintf(stderr,"%s: Out of memory\n",myname);
  20.263 -    exit(1);
  20.264 -    }
  20.265 -  else {
  20.266 -    return ptr;
  20.267 -    }
  20.268 -}
  20.269 -
  20.270 -
  20.271 -/****************************************************************************
  20.272 -
  20.273 -  hasdirsep
  20.274 -
  20.275 -  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
  20.276 -
  20.277 -****************************************************************************/
  20.278 -
  20.279 -int hasdirsep(s1)
  20.280 -char *s1;
  20.281 -{
  20.282 -  if (strchr(s1, DIRSEP)) return 1;
  20.283 -  else if (strchr(s1, DIRSEP2)) return 1;
  20.284 -  else return 0;
  20.285 -}
  20.286 -
  20.287 -/****************************************************************************
  20.288 -
  20.289 -  suffixcmp
  20.290 -
  20.291 -  Returns true if s2 is a suffix of s1; uses case-blind comparison.
  20.292 -
  20.293 -****************************************************************************/
  20.294 -
  20.295 -int suffixcmp(s1, s2)
  20.296 -char *s1;
  20.297 -char *s2;
  20.298 -{
  20.299 -  int len1, len2;
  20.300 -
  20.301 -  len1 = MYSTRLEN(s1);
  20.302 -  len2 = MYSTRLEN(s2);
  20.303 -  if (len2 > len1) return 0;
  20.304 -  s1 += len1 - len2;
  20.305 -  while (*s1) {
  20.306 -    if (tolower(*s1) != tolower(*s2)) return 0;
  20.307 -    s1++;
  20.308 -    s2++;
  20.309 -    }
  20.310 -  return 1;
  20.311 -}
  20.312 -   
  20.313 -/****************************************************************************
  20.314 -
  20.315 -  skiptoeol
  20.316 -
  20.317 -  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
  20.318 -
  20.319 -****************************************************************************/
  20.320 -
  20.321 -void skiptoeol(fp)
  20.322 -ZFILE *fp;
  20.323 -{
  20.324 -  int dummy;
  20.325 -
  20.326 -  while (dummy=Zgetc(fp),dummy!=EOF) {
  20.327 -    if (dummy == '\n') return;
  20.328 -    if (dummy == '\r') {
  20.329 -      dummy = Zgetc(fp);
  20.330 -      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
  20.331 -      return;
  20.332 -      }
  20.333 -  }
  20.334 -}
  20.335 -
  20.336 -
  20.337 -/****************************************************************************
  20.338 -
  20.339 -  myfgets
  20.340 -
  20.341 -  Local version of fgets.  Handles \r, \n, and \r\n terminators.
  20.342 -
  20.343 -****************************************************************************/
  20.344 -
  20.345 -char *myfgets(line,maxlen,fp)
  20.346 -char *line;
  20.347 -int maxlen;
  20.348 -ZFILE *fp;
  20.349 -{
  20.350 -  int c = 0;
  20.351 -  char *p;
  20.352 -
  20.353 -  p = line;
  20.354 -  while((c=Zgetc(fp))!=EOF&&maxlen) {
  20.355 -    *p++ = c;
  20.356 -    maxlen--;
  20.357 -    if (c=='\n') break;
  20.358 -    if (c=='\r') {
  20.359 -      c = Zgetc(fp);
  20.360 -      if (c != EOF && c != '\n') Zungetc(c,fp);
  20.361 -      *(p-1) = '\n';
  20.362 -      break;
  20.363 -      }
  20.364 -    }
  20.365 -  *p = 0;
  20.366 -  return (c==EOF) ? NULL : line;
  20.367 -}
  20.368 -
  20.369 -/****************************************************************************
  20.370 -
  20.371 -  usageerr
  20.372 -
  20.373 -  Prints "Usage: ...." line to the given stream.
  20.374 -
  20.375 -****************************************************************************/
  20.376 -
  20.377 -void printusage(out)
  20.378 -FILE *out;
  20.379 -{
  20.380 -  fprintf(out,
  20.381 -    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
  20.382 -    myname);
  20.383 -  fprintf(out,
  20.384 -    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
  20.385 -  fprintf(out,
  20.386 -    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
  20.387 -}
  20.388 -
  20.389 -
  20.390 -/****************************************************************************
  20.391 -
  20.392 -  printinfo
  20.393 -
  20.394 -  Prints version and copyright message, or utility information.
  20.395 -
  20.396 -****************************************************************************/
  20.397 -
  20.398 -void printinfo(infonum)
  20.399 -int infonum;
  20.400 -{
  20.401 -  switch (infonum) {
  20.402 -    case 0: /* Copyright message */
  20.403 -      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
  20.404 -      printf("John Cowan, Christiaan Keet\n");
  20.405 -      printf("Internet: <info@figlet.org> ");
  20.406 -      printf("Version: %s, date: %s\n\n",VERSION,DATE);
  20.407 -      printf("FIGlet, along with the various FIGlet fonts");
  20.408 -      printf(" and documentation, may be\n");
  20.409 -      printf("freely copied and distributed.\n\n");
  20.410 -      printf("If you use FIGlet, please send an");
  20.411 -      printf(" e-mail message to <info@figlet.org>.\n\n");
  20.412 -      printf("The latest version of FIGlet is available from the");
  20.413 -      printf(" web site,\n\thttp://www.figlet.org/\n\n");
  20.414 -      printusage(stdout);
  20.415 -      break;
  20.416 -    case 1: /* Version (integer) */
  20.417 -      printf("%d\n",VERSION_INT);
  20.418 -      break;
  20.419 -    case 2: /* Font directory */
  20.420 -      printf("%s\n",fontdirname);
  20.421 -      break;
  20.422 -    case 3: /* Font */
  20.423 -      printf("%s\n",fontname);
  20.424 -      break;
  20.425 -    case 4: /* Outputwidth */
  20.426 -      printf("%d\n",outputwidth);
  20.427 -    }
  20.428 -}
  20.429 -
  20.430 -
  20.431 -/****************************************************************************
  20.432 -
  20.433 -  readmagic
  20.434 -
  20.435 -  Reads a four-character magic string from a stream.
  20.436 -
  20.437 -****************************************************************************/
  20.438 -void readmagic(fp,magic)
  20.439 -ZFILE *fp;
  20.440 -char *magic;
  20.441 -{
  20.442 -  int i;
  20.443 -
  20.444 -  for (i=0;i<4;i++) {
  20.445 -    magic[i] = Zgetc(fp);
  20.446 -    }
  20.447 -  magic[4] = 0;
  20.448 -  }
  20.449 -  
  20.450 -/****************************************************************************
  20.451 -
  20.452 -  skipws
  20.453 -
  20.454 -  Skips whitespace characters from a stream.
  20.455 -
  20.456 -****************************************************************************/
  20.457 -void skipws(fp)
  20.458 -ZFILE *fp;
  20.459 -{
  20.460 -  int c;
  20.461 -  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
  20.462 -  Zungetc(c,fp);
  20.463 -  }
  20.464 -
  20.465 -/****************************************************************************
  20.466 -
  20.467 -  readnum
  20.468 -
  20.469 -  Reads a number from a stream.  Accepts "0" prefix for octal and
  20.470 -  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
  20.471 -
  20.472 -****************************************************************************/
  20.473 -void readnum(fp,nump)
  20.474 -ZFILE *fp;
  20.475 -inchr *nump;
  20.476 -{
  20.477 -  int acc = 0;
  20.478 -  char *p;
  20.479 -  int c;
  20.480 -  int base;
  20.481 -  int sign = 1;
  20.482 -  char digits[] = "0123456789ABCDEF";
  20.483 -
  20.484 -  skipws(fp);
  20.485 -  c = Zgetc(fp);
  20.486 -  if (c=='-') {
  20.487 -    sign = -1;
  20.488 -    }
  20.489 -  else {
  20.490 -    Zungetc(c,fp);
  20.491 -    }
  20.492 -  c = Zgetc(fp);
  20.493 -  if (c=='0') {
  20.494 -     c = Zgetc(fp);
  20.495 -     if (c=='x'||c=='X') {
  20.496 -       base = 16;
  20.497 -       }
  20.498 -     else {
  20.499 -       base = 8;
  20.500 -       Zungetc(c,fp);
  20.501 -       }
  20.502 -    }
  20.503 -  else {
  20.504 -    base = 10;
  20.505 -    Zungetc(c,fp);
  20.506 -    }
  20.507 -
  20.508 -  while((c=Zgetc(fp))!=EOF) {
  20.509 -    c=toupper(c);
  20.510 -    p=strchr(digits,c);
  20.511 -    if (!p) {
  20.512 -      Zungetc(c,fp);
  20.513 -      *nump = acc * sign;
  20.514 -      return;
  20.515 -      }
  20.516 -    acc = acc*base+(p-digits);
  20.517 -    }
  20.518 -  *nump = acc * sign;
  20.519 -  }  
  20.520 -
  20.521 -/****************************************************************************
  20.522 -
  20.523 -  readTchar
  20.524 -
  20.525 -  Reads a control file "T" command character specification.
  20.526 -
  20.527 -  Character is a single byte, an escape sequence, or
  20.528 -  an escaped numeric.
  20.529 -
  20.530 -****************************************************************************/
  20.531 -
  20.532 -inchr readTchar(fp)
  20.533 -ZFILE *fp;
  20.534 -{
  20.535 -  inchr thechar;
  20.536 -  char next;
  20.537 -
  20.538 -  thechar=Zgetc(fp);
  20.539 -  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
  20.540 -    Zungetc(thechar,fp);
  20.541 -    return '\0';
  20.542 -    }
  20.543 -  if (thechar!='\\') return thechar;
  20.544 -  next=Zgetc(fp);
  20.545 -  switch(next) {
  20.546 -    case 'a':
  20.547 -      return 7;
  20.548 -    case 'b':
  20.549 -      return 8;
  20.550 -    case 'e':
  20.551 -      return 27;
  20.552 -    case 'f':
  20.553 -      return 12;
  20.554 -    case 'n':
  20.555 -      return 10;
  20.556 -    case 'r':
  20.557 -      return 13;
  20.558 -    case 't':
  20.559 -      return 9;
  20.560 -    case 'v':
  20.561 -      return 11;
  20.562 -    default:
  20.563 -      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
  20.564 -        Zungetc(next,fp);
  20.565 -        readnum(fp,&thechar);
  20.566 -        return thechar;
  20.567 -        }
  20.568 -      return next;
  20.569 -    }
  20.570 -}
  20.571 -
  20.572 -/****************************************************************************
  20.573 -
  20.574 -  charsetname
  20.575 -
  20.576 -  Get a Tchar representing a charset name, or 0 if none available.
  20.577 -  Called in getcharset().
  20.578 -
  20.579 -****************************************************************************/
  20.580 -
  20.581 -inchr charsetname(fp)
  20.582 -ZFILE *fp;
  20.583 -{
  20.584 -  inchr result;
  20.585 -
  20.586 -  result = readTchar(fp);
  20.587 -  if (result == '\n' || result == '\r') {
  20.588 -    result = 0;
  20.589 -    Zungetc(result,fp);
  20.590 -    }
  20.591 -  return result;
  20.592 -  }
  20.593 -
  20.594 -/****************************************************************************
  20.595 -
  20.596 -  charset
  20.597 -
  20.598 -  Processes "g[0123]" character set specifier
  20.599 -  Called in readcontrol().
  20.600 -
  20.601 -****************************************************************************/
  20.602 -
  20.603 -void charset(n, controlfile)
  20.604 -int n;
  20.605 -ZFILE *controlfile;
  20.606 -{
  20.607 -  int ch;
  20.608 -
  20.609 -  skipws(controlfile);
  20.610 -  if (Zgetc(controlfile) != '9') {
  20.611 -    skiptoeol(controlfile);
  20.612 -    return;
  20.613 -    }
  20.614 -  ch = Zgetc(controlfile);
  20.615 -  if (ch == '6') {
  20.616 -     gn[n] = 65536L * charsetname(controlfile) + 0x80;
  20.617 -     gndbl[n] = 0;
  20.618 -     skiptoeol(controlfile);
  20.619 -     return;
  20.620 -     }
  20.621 -  if (ch != '4') {
  20.622 -    skiptoeol(controlfile);
  20.623 -    return;
  20.624 -    }
  20.625 -  ch = Zgetc(controlfile);
  20.626 -  if (ch == 'x') {
  20.627 -     if (Zgetc(controlfile) != '9') {
  20.628 -       skiptoeol(controlfile);
  20.629 -       return;
  20.630 -       }
  20.631 -     if (Zgetc(controlfile) != '4') {
  20.632 -       skiptoeol(controlfile);
  20.633 -       return;
  20.634 -       }
  20.635 -     skipws(controlfile);
  20.636 -     gn[n] = 65536L * charsetname(controlfile);
  20.637 -     gndbl[n] = 1;
  20.638 -     skiptoeol(controlfile);
  20.639 -     return;
  20.640 -     }
  20.641 -  Zungetc(ch, controlfile);
  20.642 -  skipws(controlfile);
  20.643 -  gn[n] = 65536L * charsetname(controlfile);
  20.644 -  gndbl[n] = 0;
  20.645 -  return;
  20.646 -  }
  20.647 -
  20.648 -/****************************************************************************
  20.649 -
  20.650 -  readcontrol
  20.651 -
  20.652 -  Allocates memory and reads in the given control file.
  20.653 -  Called in readcontrolfiles().
  20.654 -
  20.655 -****************************************************************************/
  20.656 -
  20.657 -void readcontrol(controlname)
  20.658 -char *controlname;
  20.659 -{
  20.660 -  inchr firstch,lastch;
  20.661 -  char dashcheck;
  20.662 -  inchr offset;
  20.663 -  char *controlpath,magicnum[5];
  20.664 -  int command;
  20.665 -  ZFILE *controlfile;
  20.666 -  int namelen;
  20.667 -
  20.668 -  namelen = MYSTRLEN(fontdirname);
  20.669 -  controlpath = (char*)myalloc(sizeof(char)
  20.670 -    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
  20.671 -  controlfile = NULL;
  20.672 -  if (!hasdirsep(controlname)) {
  20.673 -    strcpy(controlpath,fontdirname);
  20.674 -    controlpath[namelen] = DIRSEP;
  20.675 -    controlpath[namelen+1] = '\0';
  20.676 -    strcat(controlpath,controlname);
  20.677 -    strcat(controlpath,CONTROLFILESUFFIX);
  20.678 -    controlfile = Zopen(controlpath,"rb");
  20.679 -    }
  20.680 -  if (controlfile==NULL) {
  20.681 -    strcpy(controlpath,controlname);
  20.682 -    strcat(controlpath,CONTROLFILESUFFIX);
  20.683 -    controlfile = Zopen(controlpath,"rb");
  20.684 -    if (controlfile==NULL) {
  20.685 -      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
  20.686 -        controlpath);
  20.687 -      exit(1);
  20.688 -      }
  20.689 -    }
  20.690 -
  20.691 -  free(controlpath);
  20.692 -
  20.693 -  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  20.694 -  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
  20.695 -  commandlistend = &(*commandlistend)->next;
  20.696 -  (*commandlistend) = NULL;
  20.697 -
  20.698 -  while(command=Zgetc(controlfile),command!=EOF) {
  20.699 -    switch (command) {
  20.700 -      case 't': /* Translate */
  20.701 -        skipws(controlfile);
  20.702 -        firstch=readTchar(controlfile);
  20.703 -        if ((dashcheck=Zgetc(controlfile))=='-') {
  20.704 -          lastch=readTchar(controlfile);
  20.705 -          }
  20.706 -        else {
  20.707 -          Zungetc(dashcheck,controlfile);
  20.708 -          lastch=firstch;
  20.709 -          }
  20.710 -        skipws(controlfile);
  20.711 -        offset=readTchar(controlfile)-firstch;
  20.712 -        skiptoeol(controlfile);
  20.713 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  20.714 -        (*commandlistend)->thecommand = 1;
  20.715 -        (*commandlistend)->rangelo = firstch;
  20.716 -        (*commandlistend)->rangehi = lastch;
  20.717 -        (*commandlistend)->offset = offset;
  20.718 -        commandlistend = &(*commandlistend)->next;
  20.719 -        (*commandlistend) = NULL;
  20.720 -        break;
  20.721 -      case '0': case '1': case '2': case '3': case '4':
  20.722 -      case '5': case '6': case '7': case '8': case '9':
  20.723 -      case '-':
  20.724 -                /* Mapping table entry */
  20.725 -        Zungetc(command,controlfile);
  20.726 -        readnum(controlfile,&firstch);
  20.727 -        skipws(controlfile);
  20.728 -	readnum(controlfile,&lastch);
  20.729 -	offset=lastch-firstch;
  20.730 -        lastch=firstch;
  20.731 -        skiptoeol(controlfile);
  20.732 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  20.733 -        (*commandlistend)->thecommand = 1;
  20.734 -        (*commandlistend)->rangelo = firstch;
  20.735 -        (*commandlistend)->rangehi = lastch;
  20.736 -        (*commandlistend)->offset = offset;
  20.737 -        commandlistend = &(*commandlistend)->next;
  20.738 -        (*commandlistend) = NULL;
  20.739 -        break;
  20.740 -      case 'f': /* freeze */
  20.741 -        skiptoeol(controlfile);
  20.742 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  20.743 -        (*commandlistend)->thecommand = 0;
  20.744 -        commandlistend = &(*commandlistend)->next;
  20.745 -        (*commandlistend) = NULL;
  20.746 -        break;
  20.747 -      case 'b': /* DBCS input mode */
  20.748 -        multibyte = 1;
  20.749 -        break;
  20.750 -      case 'u': /* UTF-8 input mode */
  20.751 -        multibyte = 2;
  20.752 -        break;
  20.753 -      case 'h': /* HZ input mode */
  20.754 -        multibyte = 3;
  20.755 -        break;
  20.756 -      case 'j': /* Shift-JIS input mode */
  20.757 -        multibyte = 4;
  20.758 -        break;
  20.759 -      case 'g': /* ISO 2022 character set choices */
  20.760 -        multibyte = 0;
  20.761 -        skipws(controlfile);
  20.762 -        command=Zgetc(controlfile);
  20.763 -        switch (command) {
  20.764 -          case '0': /* define G0 charset */
  20.765 -            charset(0, controlfile);
  20.766 -            break;
  20.767 -          case '1': /* set G1 charset */
  20.768 -            charset(1, controlfile);
  20.769 -            break;
  20.770 -          case '2': /* set G2 charset */
  20.771 -            charset(2, controlfile);
  20.772 -            break;
  20.773 -          case '3': /* set G3 charset */
  20.774 -            charset(3, controlfile);
  20.775 -            break;
  20.776 -          case 'l': case 'L': /* define left half */
  20.777 -            skipws(controlfile);
  20.778 -            gl = Zgetc(controlfile) - '0';
  20.779 -            skiptoeol(controlfile);
  20.780 -            break;
  20.781 -          case 'r': case 'R': /* define right half */
  20.782 -            skipws(controlfile);
  20.783 -            gr = Zgetc(controlfile) - '0';
  20.784 -            skiptoeol(controlfile);
  20.785 -            break;
  20.786 -          default: /* meaningless "g" command */
  20.787 -            skiptoeol(controlfile);
  20.788 -          }
  20.789 -      case '\r': case '\n': /* blank line */
  20.790 -        break;
  20.791 -      default: /* Includes '#' */
  20.792 -        skiptoeol(controlfile);
  20.793 -      }
  20.794 -    }
  20.795 -  Zclose(controlfile);
  20.796 -}
  20.797 -
  20.798 -
  20.799 -/****************************************************************************
  20.800 -
  20.801 -  readcontrolfiles
  20.802 -
  20.803 -  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
  20.804 -  Called in main().
  20.805 -
  20.806 -****************************************************************************/
  20.807 -
  20.808 -void readcontrolfiles()
  20.809 -{
  20.810 -  cfnamenode *cfnptr;
  20.811 -
  20.812 -  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
  20.813 -    readcontrol(cfnptr->thename);
  20.814 -    }
  20.815 -}
  20.816 -
  20.817 -
  20.818 -/****************************************************************************
  20.819 -
  20.820 -  clearcfilelist
  20.821 -
  20.822 -  Clears the control file list.  Assumes thename does not need freeing.
  20.823 -
  20.824 -****************************************************************************/
  20.825 -
  20.826 -void clearcfilelist()
  20.827 -{
  20.828 -  cfnamenode *cfnptr1,*cfnptr2;
  20.829 -
  20.830 -  cfnptr1 = cfilelist;
  20.831 -  while (cfnptr1 != NULL) {
  20.832 -    cfnptr2 = cfnptr1->next;
  20.833 -    free(cfnptr1);
  20.834 -    cfnptr1 = cfnptr2;
  20.835 -    }
  20.836 -  cfilelist = NULL;
  20.837 -  cfilelistend = &cfilelist;
  20.838 -}
  20.839 -
  20.840 -
  20.841 -/****************************************************************************
  20.842 -
  20.843 -  getparams
  20.844 -
  20.845 -  Handles all command-line parameters.  Puts all parameters within
  20.846 -  bounds.
  20.847 -
  20.848 -****************************************************************************/
  20.849 -
  20.850 -void getparams()
  20.851 -{
  20.852 -  extern char *optarg;
  20.853 -  extern int optind;
  20.854 -  int c; /* "Should" be a char -- need int for "!= -1" test*/
  20.855 -  int columns,firstfont,infoprint;
  20.856 -  char *controlname;
  20.857 -
  20.858 -  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
  20.859 -    myname++;
  20.860 -    }
  20.861 -  else {
  20.862 -    myname = Myargv[0];
  20.863 -    }
  20.864 -  fontdirname = DEFAULTFONTDIR;
  20.865 -  firstfont = 1;
  20.866 -  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
  20.867 -  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
  20.868 -  if (suffixcmp(fontname,FONTFILESUFFIX)) {
  20.869 -    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
  20.870 -    }
  20.871 -  cfilelist = NULL;
  20.872 -  cfilelistend = &cfilelist;
  20.873 -  commandlist = NULL;
  20.874 -  commandlistend = &commandlist;
  20.875 -  smushoverride = SMO_NO;
  20.876 -  deutschflag = 0;
  20.877 -  justification = -1;
  20.878 -  right2left = -1;
  20.879 -  paragraphflag = 0;
  20.880 -  infoprint = -1;
  20.881 -  cmdinput = 0;
  20.882 -  outputwidth = DEFAULTCOLUMNS;
  20.883 -  gn[1] = 0x80;
  20.884 -  gr = 1;
  20.885 -  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
  20.886 -      /* Note: -F is not a legal option -- prints a special err message.  */
  20.887 -    switch (c) {
  20.888 -      case 'A':
  20.889 -        cmdinput = 1;
  20.890 -        break;
  20.891 -      case 'D':
  20.892 -        deutschflag = 1;
  20.893 -        break;
  20.894 -      case 'E':
  20.895 -        deutschflag = 0;
  20.896 -        break;
  20.897 -      case 'X':
  20.898 -        right2left = -1;
  20.899 -        break;
  20.900 -      case 'L':
  20.901 -        right2left = 0;
  20.902 -        break;
  20.903 -      case 'R':
  20.904 -        right2left = 1;
  20.905 -        break;
  20.906 -      case 'x':
  20.907 -        justification = -1;
  20.908 -        break;
  20.909 -      case 'l':
  20.910 -        justification = 0;
  20.911 -        break;
  20.912 -      case 'c':
  20.913 -        justification = 1;
  20.914 -        break;
  20.915 -      case 'r':
  20.916 -        justification = 2;
  20.917 -        break;
  20.918 -      case 'p':
  20.919 -        paragraphflag = 1;
  20.920 -        break;
  20.921 -      case 'n':
  20.922 -        paragraphflag = 0;
  20.923 -        break;
  20.924 -      case 's':
  20.925 -        smushoverride = SMO_NO;
  20.926 -        break;
  20.927 -      case 'k':
  20.928 -        smushmode = SM_KERN;
  20.929 -        smushoverride = SMO_YES;
  20.930 -        break;
  20.931 -      case 'S':
  20.932 -        smushmode = SM_SMUSH;
  20.933 -	smushoverride = SMO_FORCE;
  20.934 -        break;
  20.935 -      case 'o':
  20.936 -        smushmode = SM_SMUSH;
  20.937 -	smushoverride = SMO_YES;
  20.938 -        break;
  20.939 -      case 'W':
  20.940 -        smushmode = 0;
  20.941 -	smushoverride = SMO_YES;
  20.942 -        break;
  20.943 -      case 't':
  20.944 -#ifdef TIOCGWINSZ
  20.945 -        columns = get_columns();
  20.946 -        if (columns>0) {
  20.947 -          outputwidth = columns;
  20.948 -          }
  20.949 -#else /* ifdef TIOCGWINSZ */
  20.950 -        fprintf(stderr,
  20.951 -          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
  20.952 -          myname);
  20.953 -#endif /* ifdef TIOCGWINSZ */
  20.954 -        break;
  20.955 -      case 'v':
  20.956 -        infoprint = 0;
  20.957 -        break;
  20.958 -      case 'I':
  20.959 -        infoprint = atoi(optarg);
  20.960 -        break;
  20.961 -      case 'm':
  20.962 -        smushmode = atoi(optarg);
  20.963 -        if (smushmode < -1) {
  20.964 -          smushoverride = SMO_NO;
  20.965 -          break;
  20.966 -          }
  20.967 -	if (smushmode == 0) smushmode = SM_KERN;
  20.968 -	else if (smushmode == -1) smushmode = 0;
  20.969 -	else smushmode = (smushmode & 63) | SM_SMUSH;
  20.970 -	smushoverride = SMO_YES;
  20.971 -        break;
  20.972 -      case 'w':
  20.973 -        columns = atoi(optarg);
  20.974 -        if (columns>0) {
  20.975 -          outputwidth = columns;
  20.976 -          }
  20.977 -        break;
  20.978 -      case 'd':
  20.979 -        fontdirname = optarg;
  20.980 -        break;
  20.981 -      case 'f':
  20.982 -        if (firstfont) {
  20.983 -          free(fontname);
  20.984 -          firstfont = 0;
  20.985 -          }
  20.986 -        fontname = optarg;
  20.987 -        if (suffixcmp(fontname,FONTFILESUFFIX)) {
  20.988 -          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
  20.989 -          }
  20.990 -        break;
  20.991 -      case 'C':
  20.992 -        controlname = optarg;
  20.993 -        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
  20.994 -          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
  20.995 -          }
  20.996 -        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
  20.997 -        (*cfilelistend)->thename = controlname;
  20.998 -        cfilelistend = &(*cfilelistend)->next;
  20.999 -        (*cfilelistend) = NULL;
 20.1000 -        break;
 20.1001 -      case 'N':
 20.1002 -        clearcfilelist();
 20.1003 -        multibyte = 0;
 20.1004 -        gn[0] = 0;
 20.1005 -        gn[1] = 0x80;
 20.1006 -        gn[2] = gn[3] = 0;
 20.1007 -        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
 20.1008 -        gl = 0;
 20.1009 -        gr = 1;
 20.1010 -        break;
 20.1011 -      case 'F': /* Not a legal option */
 20.1012 -        fprintf(stderr,"%s: illegal option -- F\n",myname);
 20.1013 -        printusage(stderr);
 20.1014 -        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
 20.1015 -        fprintf(stderr," \"-F\" option has been\n");
 20.1016 -        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
 20.1017 -        fprintf(stderr," program, which is now\n");
 20.1018 -        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
 20.1019 -        fprintf(stderr," is also available\n");
 20.1020 -        fprintf(stderr,"from  http://www.figlet.org/");
 20.1021 -        fprintf(stderr,"under UNIX utilities.\n");
 20.1022 -        exit(1);
 20.1023 -        break;
 20.1024 -      default:
 20.1025 -        printusage(stderr);
 20.1026 -        exit(1);
 20.1027 -      }
 20.1028 -    }
 20.1029 -  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
 20.1030 -  outlinelenlimit = outputwidth-1;
 20.1031 -  if (infoprint>=0) {
 20.1032 -    printinfo(infoprint);
 20.1033 -    exit(0);
 20.1034 -    }
 20.1035 -}
 20.1036 -
 20.1037 -
 20.1038 -/****************************************************************************
 20.1039 -
 20.1040 -  clearline
 20.1041 -
 20.1042 -  Clears both the input (inchrline) and output (outputline) storage.
 20.1043 -
 20.1044 -****************************************************************************/
 20.1045 -
 20.1046 -void clearline()
 20.1047 -{
 20.1048 -  int i;
 20.1049 -
 20.1050 -  for (i=0;i<charheight;i++) {
 20.1051 -    outputline[i][0] = '\0';
 20.1052 -    }
 20.1053 -  outlinelen = 0;
 20.1054 -  inchrlinelen = 0;
 20.1055 -}
 20.1056 -
 20.1057 -
 20.1058 -/****************************************************************************
 20.1059 -
 20.1060 -  readfontchar
 20.1061 -
 20.1062 -  Reads a font character from the font file, and places it in a
 20.1063 -  newly-allocated entry in the list.
 20.1064 -
 20.1065 -****************************************************************************/
 20.1066 -
 20.1067 -void readfontchar(file,theord,line,maxlen)
 20.1068 -ZFILE *file;
 20.1069 -inchr theord;
 20.1070 -char *line;
 20.1071 -int maxlen;
 20.1072 -{
 20.1073 -  int row,k;
 20.1074 -  char endchar;
 20.1075 -  fcharnode *fclsave;
 20.1076 -
 20.1077 -  fclsave = fcharlist;
 20.1078 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 20.1079 -  fcharlist->ord = theord;
 20.1080 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 20.1081 -  fcharlist->next = fclsave;
 20.1082 -  for (row=0;row<charheight;row++) {
 20.1083 -    if (myfgets(line,maxlen+1,file)==NULL) {
 20.1084 -      line[0] = '\0';
 20.1085 -      }
 20.1086 -    k = MYSTRLEN(line)-1;
 20.1087 -    while (k>=0 && isspace(line[k])) {
 20.1088 -      k--;
 20.1089 -      }
 20.1090 -    if (k>=0) {
 20.1091 -      endchar = line[k];
 20.1092 -      while (k>=0 ? line[k]==endchar : 0) {
 20.1093 -        k--;
 20.1094 -        }
 20.1095 -      }
 20.1096 -    line[k+1] = '\0';
 20.1097 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
 20.1098 -    strcpy(fcharlist->thechar[row],line);
 20.1099 -    }
 20.1100 -}
 20.1101 -
 20.1102 -
 20.1103 -/****************************************************************************
 20.1104 -
 20.1105 -  readfont
 20.1106 -
 20.1107 -  Allocates memory, initializes variables, and reads in the font.
 20.1108 -  Called near beginning of main().
 20.1109 -
 20.1110 -****************************************************************************/
 20.1111 -
 20.1112 -void readfont()
 20.1113 -{
 20.1114 -#define MAXFIRSTLINELEN 1000
 20.1115 -  int i,row,numsread;
 20.1116 -  inchr theord;
 20.1117 -  int maxlen,cmtlines,ffright2left;
 20.1118 -  int smush,smush2;
 20.1119 -  char *fontpath,*fileline,magicnum[5];
 20.1120 -  ZFILE *fontfile;
 20.1121 -  int namelen;
 20.1122 -
 20.1123 -  namelen = MYSTRLEN(fontdirname);
 20.1124 -  fontpath = (char*)myalloc(sizeof(char)
 20.1125 -    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
 20.1126 -  fontfile = NULL;
 20.1127 -  if (!hasdirsep(fontname)) {
 20.1128 -    strcpy(fontpath,fontdirname);
 20.1129 -    fontpath[namelen] = DIRSEP;
 20.1130 -    fontpath[namelen+1] = '\0';
 20.1131 -    strcat(fontpath,fontname);
 20.1132 -    strcat(fontpath,FONTFILESUFFIX);
 20.1133 -    fontfile = Zopen(fontpath,"rb");
 20.1134 -    }
 20.1135 -  if (fontfile==NULL) {
 20.1136 -    strcpy(fontpath,fontname);
 20.1137 -    strcat(fontpath,FONTFILESUFFIX);
 20.1138 -    fontfile = Zopen(fontpath,"rb");
 20.1139 -    if (fontfile==NULL) {
 20.1140 -      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
 20.1141 -      exit(1);
 20.1142 -      }
 20.1143 -    }
 20.1144 -
 20.1145 -  readmagic(fontfile,magicnum);
 20.1146 -  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
 20.1147 -  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
 20.1148 -    fileline[0] = '\0';
 20.1149 -    }
 20.1150 -  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
 20.1151 -    skiptoeol(fontfile);
 20.1152 -    }
 20.1153 -  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
 20.1154 -    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
 20.1155 -    &ffright2left,&smush2);
 20.1156 -  free(fileline);
 20.1157 -  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
 20.1158 -    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
 20.1159 -    exit(1);
 20.1160 -    }
 20.1161 -  for (i=1;i<=cmtlines;i++) {
 20.1162 -    skiptoeol(fontfile);
 20.1163 -    }
 20.1164 -  free(fontpath);
 20.1165 -
 20.1166 -  if (numsread<6) {
 20.1167 -    ffright2left = 0;
 20.1168 -    }
 20.1169 -
 20.1170 -  if (numsread<7) { /* if no smush2, decode smush into smush2 */
 20.1171 -    if (smush == 0) smush2 = SM_KERN;
 20.1172 -    else if (smush < 0) smush2 = 0;
 20.1173 -    else smush2 = (smush & 31) | SM_SMUSH;
 20.1174 -    }
 20.1175 -
 20.1176 -  if (charheight<1) {
 20.1177 -    charheight = 1;
 20.1178 -    }
 20.1179 -
 20.1180 -  if (maxlen<1) {
 20.1181 -    maxlen = 1;
 20.1182 -    }
 20.1183 -
 20.1184 -  maxlen += 100; /* Give ourselves some extra room */
 20.1185 -
 20.1186 -  if (smushoverride == SMO_NO)
 20.1187 -     smushmode = smush2;
 20.1188 -  else if (smushoverride == SMO_FORCE)
 20.1189 -     smushmode |= smush2;
 20.1190 -
 20.1191 -  if (right2left<0) {
 20.1192 -    right2left = ffright2left;
 20.1193 -    }
 20.1194 -
 20.1195 -  if (justification<0) {
 20.1196 -    justification = 2*right2left;
 20.1197 -    }
 20.1198 -
 20.1199 -  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
 20.1200 -  /* Allocate "missing" character */
 20.1201 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 20.1202 -  fcharlist->ord = 0;
 20.1203 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 20.1204 -  fcharlist->next = NULL;
 20.1205 -  for (row=0;row<charheight;row++) {
 20.1206 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
 20.1207 -    fcharlist->thechar[row][0] = '\0';
 20.1208 -    }
 20.1209 -  for (theord=' ';theord<='~';theord++) {
 20.1210 -    readfontchar(fontfile,theord,fileline,maxlen);
 20.1211 -    }
 20.1212 -  for (theord=0;theord<=6;theord++) {
 20.1213 -    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
 20.1214 -    }
 20.1215 -  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
 20.1216 -    sscanf(fileline,"%li",&theord)==1) {
 20.1217 -    readfontchar(fontfile,theord,fileline,maxlen);
 20.1218 -    }
 20.1219 -  Zclose(fontfile);
 20.1220 -  free(fileline);
 20.1221 -}
 20.1222 -
 20.1223 -
 20.1224 -/****************************************************************************
 20.1225 -
 20.1226 -  linealloc
 20.1227 -
 20.1228 -  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
 20.1229 -  Called near beginning of main().
 20.1230 -
 20.1231 -****************************************************************************/
 20.1232 -
 20.1233 -void linealloc()
 20.1234 -{
 20.1235 -  int row; 
 20.1236 -
 20.1237 -  outputline = (char**)myalloc(sizeof(char*)*charheight);
 20.1238 -  for (row=0;row<charheight;row++) {
 20.1239 -    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 20.1240 -    }
 20.1241 -  inchrlinelenlimit = outputwidth*4+100;
 20.1242 -  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
 20.1243 -  clearline();
 20.1244 -}
 20.1245 -
 20.1246 -
 20.1247 -/****************************************************************************
 20.1248 -
 20.1249 -  getletter
 20.1250 -
 20.1251 -  Sets currchar to point to the font entry for the given character.
 20.1252 -  Sets currcharwidth to the width of this character.
 20.1253 -
 20.1254 -****************************************************************************/
 20.1255 -
 20.1256 -void getletter(c)
 20.1257 -inchr c;
 20.1258 -{
 20.1259 -  fcharnode *charptr;
 20.1260 -
 20.1261 -  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
 20.1262 -    charptr=charptr->next) ;
 20.1263 -  if (charptr!=NULL) {
 20.1264 -    currchar = charptr->thechar;
 20.1265 -    }
 20.1266 -  else {
 20.1267 -    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
 20.1268 -      charptr=charptr->next) ;
 20.1269 -    currchar = charptr->thechar;
 20.1270 -    }
 20.1271 -  previouscharwidth = currcharwidth;
 20.1272 -  currcharwidth = MYSTRLEN(currchar[0]);
 20.1273 -}
 20.1274 -
 20.1275 -
 20.1276 -/****************************************************************************
 20.1277 -
 20.1278 -  smushem
 20.1279 -
 20.1280 -  Given 2 characters, attempts to smush them into 1, according to
 20.1281 -  smushmode.  Returns smushed character or '\0' if no smushing can be
 20.1282 -  done.
 20.1283 -
 20.1284 -  smushmode values are sum of following (all values smush blanks):
 20.1285 -    1: Smush equal chars (not hardblanks)
 20.1286 -    2: Smush '_' with any char in hierarchy below
 20.1287 -    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
 20.1288 -       Each class in hier. can be replaced by later class.
 20.1289 -    8: [ + ] -> |, { + } -> |, ( + ) -> |
 20.1290 -   16: / + \ -> X, > + < -> X (only in that order)
 20.1291 -   32: hardblank + hardblank -> hardblank
 20.1292 -
 20.1293 -****************************************************************************/
 20.1294 -
 20.1295 -char smushem(lch,rch)
 20.1296 -char lch,rch;
 20.1297 -{
 20.1298 -  if (lch==' ') return rch;
 20.1299 -  if (rch==' ') return lch;
 20.1300 -
 20.1301 -  if (previouscharwidth<2 || currcharwidth<2) return '\0';
 20.1302 -    /* Disallows overlapping if the previous character */
 20.1303 -    /* or the current character has a width of 1 or zero. */
 20.1304 -
 20.1305 -  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
 20.1306 -
 20.1307 -  if ((smushmode & 63) == 0) {
 20.1308 -    /* This is smushing by universal overlapping. */
 20.1309 -    if (lch==' ') return rch;
 20.1310 -    if (rch==' ') return lch;
 20.1311 -    if (lch==hardblank) return rch;
 20.1312 -    if (rch==hardblank) return lch;
 20.1313 -      /* Above four lines ensure overlapping preference to */
 20.1314 -      /* visible characters. */
 20.1315 -    if (right2left==1) return lch;
 20.1316 -      /* Above line ensures that the dominant (foreground) */
 20.1317 -      /* fig-character for overlapping is the latter in the */
 20.1318 -      /* user's text, not necessarily the rightmost character. */
 20.1319 -    return rch;
 20.1320 -      /* Occurs in the absence of above exceptions. */
 20.1321 -    }
 20.1322 -  
 20.1323 -  if (smushmode & SM_HARDBLANK) {
 20.1324 -    if (lch==hardblank && rch==hardblank) return lch;
 20.1325 -    }
 20.1326 -
 20.1327 -  if (lch==hardblank || rch==hardblank) return '\0';
 20.1328 -
 20.1329 -  if (smushmode & SM_EQUAL) {
 20.1330 -    if (lch==rch) return lch;
 20.1331 -    }
 20.1332 -
 20.1333 -  if (smushmode & SM_LOWLINE) {
 20.1334 -    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
 20.1335 -    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
 20.1336 -    }
 20.1337 -
 20.1338 -  if (smushmode & SM_HIERARCHY) {
 20.1339 -    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
 20.1340 -    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
 20.1341 -    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
 20.1342 -    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
 20.1343 -    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
 20.1344 -    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
 20.1345 -    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
 20.1346 -    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
 20.1347 -    if (strchr("()",lch) && strchr("<>",rch)) return rch;
 20.1348 -    if (strchr("()",rch) && strchr("<>",lch)) return lch;
 20.1349 -    }
 20.1350 -
 20.1351 -  if (smushmode & SM_PAIR) {
 20.1352 -    if (lch=='[' && rch==']') return '|';
 20.1353 -    if (rch=='[' && lch==']') return '|';
 20.1354 -    if (lch=='{' && rch=='}') return '|';
 20.1355 -    if (rch=='{' && lch=='}') return '|';
 20.1356 -    if (lch=='(' && rch==')') return '|';
 20.1357 -    if (rch=='(' && lch==')') return '|';
 20.1358 -    }
 20.1359 -
 20.1360 -  if (smushmode & SM_BIGX) {
 20.1361 -    if (lch=='/' && rch=='\\') return '|';
 20.1362 -    if (rch=='/' && lch=='\\') return 'Y';
 20.1363 -    if (lch=='>' && rch=='<') return 'X';
 20.1364 -      /* Don't want the reverse of above to give 'X'. */
 20.1365 -    }
 20.1366 -
 20.1367 -  return '\0';
 20.1368 -}
 20.1369 -
 20.1370 -
 20.1371 -/****************************************************************************
 20.1372 -
 20.1373 -  smushamt
 20.1374 -
 20.1375 -  Returns the maximum amount that the current character can be smushed
 20.1376 -  into the current line.
 20.1377 -
 20.1378 -****************************************************************************/
 20.1379 -
 20.1380 -int smushamt()
 20.1381 -{
 20.1382 -  int maxsmush,amt;
 20.1383 -  int row,linebd,charbd;
 20.1384 -  char ch1,ch2;
 20.1385 -
 20.1386 -  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
 20.1387 -    return 0;
 20.1388 -    }
 20.1389 -  maxsmush = currcharwidth;
 20.1390 -  for (row=0;row<charheight;row++) {
 20.1391 -    if (right2left) {
 20.1392 -      for (charbd=MYSTRLEN(currchar[row]);
 20.1393 -        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
 20.1394 -      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
 20.1395 -      amt = linebd+currcharwidth-1-charbd;
 20.1396 -      }
 20.1397 -    else {
 20.1398 -      for (linebd=MYSTRLEN(outputline[row]);
 20.1399 -        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
 20.1400 -      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
 20.1401 -      amt = charbd+outlinelen-1-linebd;
 20.1402 -      }
 20.1403 -    if (!ch1||ch1==' ') {
 20.1404 -      amt++;
 20.1405 -      }
 20.1406 -    else if (ch2) {
 20.1407 -      if (smushem(ch1,ch2)!='\0') {
 20.1408 -        amt++;
 20.1409 -        }
 20.1410 -      }
 20.1411 -    if (amt<maxsmush) {
 20.1412 -      maxsmush = amt;
 20.1413 -      }
 20.1414 -    }
 20.1415 -  return maxsmush;
 20.1416 -}
 20.1417 -
 20.1418 -
 20.1419 -/****************************************************************************
 20.1420 -
 20.1421 -  addchar
 20.1422 -
 20.1423 -  Attempts to add the given character onto the end of the current line.
 20.1424 -  Returns 1 if this can be done, 0 otherwise.
 20.1425 -
 20.1426 -****************************************************************************/
 20.1427 -
 20.1428 -int addchar(c)
 20.1429 -inchr c;
 20.1430 -{
 20.1431 -  int smushamount,row,k;
 20.1432 -  char *templine;
 20.1433 -
 20.1434 -  getletter(c);
 20.1435 -  smushamount = smushamt();
 20.1436 -  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
 20.1437 -      ||inchrlinelen+1>inchrlinelenlimit) {
 20.1438 -    return 0;
 20.1439 -    }
 20.1440 -
 20.1441 -  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 20.1442 -  for (row=0;row<charheight;row++) {
 20.1443 -    if (right2left) {
 20.1444 -      strcpy(templine,currchar[row]);
 20.1445 -      for (k=0;k<smushamount;k++) {
 20.1446 -        templine[currcharwidth-smushamount+k] =
 20.1447 -          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
 20.1448 -        }
 20.1449 -      strcat(templine,outputline[row]+smushamount);
 20.1450 -      strcpy(outputline[row],templine);
 20.1451 -      }
 20.1452 -    else {
 20.1453 -      for (k=0;k<smushamount;k++) {
 20.1454 -        outputline[row][outlinelen-smushamount+k] =
 20.1455 -          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
 20.1456 -        }
 20.1457 -      strcat(outputline[row],currchar[row]+smushamount);
 20.1458 -      }
 20.1459 -    }
 20.1460 -  free(templine);
 20.1461 -  outlinelen = MYSTRLEN(outputline[0]);
 20.1462 -  inchrline[inchrlinelen++] = c;
 20.1463 -  return 1;
 20.1464 -}
 20.1465 -
 20.1466 -
 20.1467 -/****************************************************************************
 20.1468 -
 20.1469 -  putstring
 20.1470 -
 20.1471 -  Prints out the given null-terminated string, substituting blanks
 20.1472 -  for hardblanks.  If outputwidth is 1, prints the entire string;
 20.1473 -  otherwise prints at most outputwidth-1 characters.  Prints a newline
 20.1474 -  at the end of the string.  The string is left-justified, centered or
 20.1475 -  right-justified (taking outputwidth as the screen width) if
 20.1476 -  justification is 0, 1 or 2, respectively.
 20.1477 -
 20.1478 -****************************************************************************/
 20.1479 -
 20.1480 -static int nr_chars=0;
 20.1481 -static void myputchar(unsigned char c)
 20.1482 -{
 20.1483 -    static int startline = 1;
 20.1484 -
 20.1485 -    if ( startline )
 20.1486 -    {
 20.1487 -        startline = 0;
 20.1488 -        myputchar(' ');
 20.1489 -    }
 20.1490 -
 20.1491 -    putc(c, stderr);
 20.1492 -
 20.1493 -    if ( nr_chars == 0 )
 20.1494 -        putchar('"');
 20.1495 -
 20.1496 -    putchar('\\');
 20.1497 -    putchar('0' + ((c>>6)&7));
 20.1498 -    putchar('0' + ((c>>3)&7));
 20.1499 -    putchar('0' + ((c>>0)&7));
 20.1500 -
 20.1501 -    if ( c == '\n' )
 20.1502 -        startline = 1;
 20.1503 -
 20.1504 -    if ( ++nr_chars == 18 ) 
 20.1505 -    {
 20.1506 -        nr_chars = 0;
 20.1507 -        putchar('"');
 20.1508 -        putchar(' ');
 20.1509 -        putchar('\\');
 20.1510 -        putchar('\n');
 20.1511 -    }
 20.1512 -}
 20.1513 -
 20.1514 -void putstring(string)
 20.1515 -char *string;
 20.1516 -{
 20.1517 -  int i,len;
 20.1518 -
 20.1519 -  len = MYSTRLEN(string);
 20.1520 -  if (outputwidth>1) {
 20.1521 -    if (len>outputwidth-1) {
 20.1522 -      len = outputwidth-1;
 20.1523 -      }
 20.1524 -    if (justification>0) {
 20.1525 -      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
 20.1526 -        myputchar(' ');
 20.1527 -        }
 20.1528 -      }
 20.1529 -    }
 20.1530 -  for (i=0;i<len;i++) {
 20.1531 -    myputchar(string[i]==hardblank?' ':string[i]);
 20.1532 -    }
 20.1533 -  myputchar('\n');
 20.1534 -}
 20.1535 -
 20.1536 -
 20.1537 -/****************************************************************************
 20.1538 -
 20.1539 -  printline
 20.1540 -
 20.1541 -  Prints outputline using putstring, then clears the current line.
 20.1542 -
 20.1543 -****************************************************************************/
 20.1544 -
 20.1545 -void printline()
 20.1546 -{
 20.1547 -  int i;
 20.1548 -
 20.1549 -  for (i=0;i<charheight;i++) {
 20.1550 -    putstring(outputline[i]);
 20.1551 -    }
 20.1552 -  clearline();
 20.1553 -}
 20.1554 -
 20.1555 -
 20.1556 -/****************************************************************************
 20.1557 -
 20.1558 -  splitline
 20.1559 -
 20.1560 -  Splits inchrline at the last word break (bunch of consecutive blanks).
 20.1561 -  Makes a new line out of the first part and prints it using
 20.1562 -  printline.  Makes a new line out of the second part and returns.
 20.1563 -
 20.1564 -****************************************************************************/
 20.1565 -
 20.1566 -void splitline()
 20.1567 -{
 20.1568 -  int i,gotspace,lastspace,len1,len2;
 20.1569 -  inchr *part1,*part2;
 20.1570 -
 20.1571 -  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 20.1572 -  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 20.1573 -  gotspace = 0;
 20.1574 -  for (i=inchrlinelen-1;i>=0;i--) {
 20.1575 -    if (!gotspace && inchrline[i]==' ') {
 20.1576 -      gotspace = 1;
 20.1577 -      lastspace = i;
 20.1578 -      }
 20.1579 -    if (gotspace && inchrline[i]!=' ') {
 20.1580 -      break;
 20.1581 -      }
 20.1582 -    }
 20.1583 -  len1 = i+1;
 20.1584 -  len2 = inchrlinelen-lastspace-1;
 20.1585 -  for (i=0;i<len1;i++) {
 20.1586 -    part1[i] = inchrline[i];
 20.1587 -    }
 20.1588 -  for (i=0;i<len2;i++) {
 20.1589 -    part2[i] = inchrline[lastspace+1+i];
 20.1590 -    }
 20.1591 -  clearline();
 20.1592 -  for (i=0;i<len1;i++) {
 20.1593 -    addchar(part1[i]);
 20.1594 -    }
 20.1595 -  printline();
 20.1596 -  for (i=0;i<len2;i++) {
 20.1597 -    addchar(part2[i]);
 20.1598 -    }
 20.1599 -  free(part1);
 20.1600 -  free(part2);
 20.1601 -}
 20.1602 -
 20.1603 -
 20.1604 -/****************************************************************************
 20.1605 -
 20.1606 -  handlemapping
 20.1607 -
 20.1608 -  Given an input character (type inchr), executes re-mapping commands
 20.1609 -  read from control files.  Returns re-mapped character (inchr).
 20.1610 -
 20.1611 -****************************************************************************/
 20.1612 -
 20.1613 -inchr handlemapping(c)
 20.1614 -inchr c;
 20.1615 -{
 20.1616 -  comnode *cmptr;
 20.1617 -
 20.1618 -  cmptr=commandlist;
 20.1619 -  while (cmptr!=NULL) {
 20.1620 -    if (cmptr->thecommand ?
 20.1621 -      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
 20.1622 -      c += cmptr->offset;
 20.1623 -      while(cmptr!=NULL ? cmptr->thecommand : 0) {
 20.1624 -        cmptr=cmptr->next;
 20.1625 -        }
 20.1626 -      }
 20.1627 -    else {
 20.1628 -      cmptr=cmptr->next;
 20.1629 -      }
 20.1630 -    }
 20.1631 -  return c;
 20.1632 -}
 20.1633 -
 20.1634 -/****************************************************************************
 20.1635 -
 20.1636 -  Agetchar
 20.1637 -
 20.1638 -  Replacement to getchar().
 20.1639 -  Acts exactly like getchar if -A is NOT specified,
 20.1640 -  else obtains input from All remaining command line words.
 20.1641 -
 20.1642 -****************************************************************************/
 20.1643 -
 20.1644 -int Agetchar()
 20.1645 -{
 20.1646 -    extern int optind;		/* current argv[] element under study */
 20.1647 -    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
 20.1648 -    char   *arg;		/* pointer to active character */
 20.1649 -    int    c;			/* current character */
 20.1650 -
 20.1651 -    if ( ! cmdinput )		/* is -A active? */
 20.1652 -	return( getchar() );	/* no: return stdin character */
 20.1653 -
 20.1654 -    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
 20.1655 -	return( EOF );		/* **ensure it now and forever more */
 20.1656 -
 20.1657 -    /* find next character */
 20.1658 -    arg = Myargv[optind];		/* pointer to active arg */
 20.1659 -    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
 20.1660 -
 20.1661 -    if ( ! c )			/* at '\0' that terminates word? */
 20.1662 -    {   /* at end of word: return ' ' if normal word, '\n' if empty */
 20.1663 -	c = ' ';		/* suppose normal word and return blank */
 20.1664 -	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
 20.1665 -	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
 20.1666 -	AgetMode = 0;		/* return to char 0 in NEXT word */
 20.1667 -	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
 20.1668 -	{   /* just ran out of arguments */
 20.1669 -	    c = EOF;		/* return EOF */
 20.1670 -	    AgetMode = -1;	/* ensure all future returns return EOF */
 20.1671 -	}
 20.1672 -    }
 20.1673 -
 20.1674 -    return( c );		/* return appropriate character */
 20.1675 -
 20.1676 -}	/* end: Agetchar() */
 20.1677 -
 20.1678 -
 20.1679 -/****************************************************************************
 20.1680 -
 20.1681 -  iso2022
 20.1682 -
 20.1683 -  Called by getinchr.  Interprets ISO 2022 sequences
 20.1684 -
 20.1685 -******************************************************************************/
 20.1686 -
 20.1687 -inchr iso2022()
 20.1688 -{
 20.1689 -  inchr ch;
 20.1690 -  inchr ch2;
 20.1691 -  int save_gl;
 20.1692 -  int save_gr;
 20.1693 -
 20.1694 -  ch = Agetchar();
 20.1695 -  if (ch == EOF) return ch;
 20.1696 -  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
 20.1697 -  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
 20.1698 -  switch (ch) {
 20.1699 -    case 14: /* invoke G0 into GL */
 20.1700 -      gl = 0;
 20.1701 -      return iso2022();
 20.1702 -    case 15: /* invoke G1 into GL */
 20.1703 -      gl = 1;
 20.1704 -      return iso2022();
 20.1705 -    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
 20.1706 -      save_gl = gl; save_gr = gr;
 20.1707 -      gl = gr = 2;
 20.1708 -      ch = iso2022();
 20.1709 -      gl = save_gl; gr = save_gr;
 20.1710 -      return ch;
 20.1711 -    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
 20.1712 -      save_gl = gl; save_gr = gr;
 20.1713 -      gl = gr = 3;
 20.1714 -      ch = iso2022();
 20.1715 -      gl = save_gl; gr = save_gr;
 20.1716 -      return ch;
 20.1717 -    case 'n' + 0x100: /* invoke G2 into GL */
 20.1718 -      gl = 2;
 20.1719 -      return iso2022();
 20.1720 -    case 'o' + 0x100: /* invoke G3 into GL */
 20.1721 -      gl = 3;
 20.1722 -      return iso2022();
 20.1723 -    case '~' + 0x100: /* invoke G1 into GR */
 20.1724 -      gr = 1;
 20.1725 -      return iso2022();
 20.1726 -    case '}' + 0x100: /* invoke G2 into GR */
 20.1727 -      gr = 2;
 20.1728 -      return iso2022();
 20.1729 -    case '|' + 0x100: /* invoke G3 into GR */
 20.1730 -      gr = 3;
 20.1731 -      return iso2022();
 20.1732 -    case '(' + 0x100: /* set G0 to 94-char set */
 20.1733 -      ch = Agetchar();
 20.1734 -      if (ch == 'B') ch = 0; /* ASCII */
 20.1735 -      gn[0] = ch << 16;
 20.1736 -      gndbl[0] = 0;
 20.1737 -      return iso2022();
 20.1738 -    case ')' + 0x100: /* set G1 to 94-char set */
 20.1739 -      ch = Agetchar();
 20.1740 -      if (ch == 'B') ch = 0;
 20.1741 -      gn[1] = ch << 16;
 20.1742 -      gndbl[1] = 0;
 20.1743 -      return iso2022();
 20.1744 -    case '*' + 0x100: /* set G2 to 94-char set */
 20.1745 -      ch = Agetchar();
 20.1746 -      if (ch == 'B') ch = 0;
 20.1747 -      gn[2] = ch << 16;
 20.1748 -      gndbl[2] = 0;
 20.1749 -      return iso2022();
 20.1750 -    case '+' + 0x100: /* set G3 to 94-char set */
 20.1751 -      ch = Agetchar();
 20.1752 -      if (ch == 'B') ch = 0;
 20.1753 -      gn[3] = ch << 16;
 20.1754 -      gndbl[3] = 0;
 20.1755 -      return iso2022();
 20.1756 -    case '-' + 0x100: /* set G1 to 96-char set */
 20.1757 -      ch = Agetchar();
 20.1758 -      if (ch == 'A') ch = 0; /* Latin-1 top half */
 20.1759 -      gn[1] = (ch << 16) | 0x80;
 20.1760 -      gndbl[1] = 0;
 20.1761 -      return iso2022();
 20.1762 -    case '.' + 0x100: /* set G2 to 96-char set */
 20.1763 -      ch = Agetchar();
 20.1764 -      if (ch == 'A') ch = 0;
 20.1765 -      gn[2] = (ch << 16) | 0x80;
 20.1766 -      gndbl[2] = 0;
 20.1767 -      return iso2022();
 20.1768 -    case '/' + 0x100: /* set G3 to 96-char set */
 20.1769 -      ch = Agetchar();
 20.1770 -      if (ch == 'A') ch = 0;
 20.1771 -      gn[3] = (ch << 16) | 0x80;
 20.1772 -      gndbl[3] = 0;
 20.1773 -      return iso2022();
 20.1774 -    case '(' + 0x200: /* set G0 to 94 x 94 char set */
 20.1775 -      ch = Agetchar();
 20.1776 -      gn[0] = ch << 16;
 20.1777 -      gndbl[0] = 1;
 20.1778 -      return iso2022();
 20.1779 -    case ')' + 0x200: /* set G1 to 94 x 94 char set */
 20.1780 -      ch = Agetchar();
 20.1781 -      gn[1] = ch << 16;
 20.1782 -      gndbl[1] = 1;
 20.1783 -      return iso2022();
 20.1784 -    case '*' + 0x200: /* set G2 to 94 x 94 char set */
 20.1785 -      ch = Agetchar();
 20.1786 -      gn[2] = ch << 16;
 20.1787 -      gndbl[2] = 1;
 20.1788 -      return iso2022();
 20.1789 -    case '+' + 0x200: /* set G3 to 94 x 94 char set */
 20.1790 -      ch = Agetchar();
 20.1791 -      gn[3] = ch << 16;
 20.1792 -      gndbl[3] = 1;
 20.1793 -      return iso2022();
 20.1794 -    default:
 20.1795 -      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
 20.1796 -        gn[0] = (ch & ~0x200) << 16;
 20.1797 -        gndbl[0] = 1;
 20.1798 -        return iso2022();
 20.1799 -        }
 20.1800 -      }
 20.1801 -
 20.1802 -  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
 20.1803 -    if (gndbl[gl]) {
 20.1804 -      ch2 = Agetchar();
 20.1805 -      return gn[gl] | (ch << 8) | ch2;
 20.1806 -      }
 20.1807 -    else return gn[gl] | ch;
 20.1808 -    }
 20.1809 -  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
 20.1810 -    if (gndbl[gr]) {
 20.1811 -      ch2 = Agetchar();
 20.1812 -      return gn[gr] | (ch << 8) | ch2;
 20.1813 -      }
 20.1814 -    else return gn[gr] | (ch & ~0x80);
 20.1815 -    }
 20.1816 -  else return ch;
 20.1817 -  }
 20.1818 -
 20.1819 -/****************************************************************************
 20.1820 -
 20.1821 -  ungetinchr
 20.1822 -
 20.1823 -  Called by main.  Pushes back an "inchr" to be read by getinchr
 20.1824 -  on the next call.
 20.1825 -
 20.1826 -******************************************************************************/
 20.1827 -inchr getinchr_buffer;
 20.1828 -int getinchr_flag;
 20.1829 -
 20.1830 -inchr ungetinchr(c)
 20.1831 -inchr c;
 20.1832 -{
 20.1833 -  getinchr_buffer = c;
 20.1834 -  getinchr_flag = 1;
 20.1835 -  return c;
 20.1836 -}
 20.1837 -
 20.1838 -/*****************************************************************************
 20.1839 -
 20.1840 -  getinchr
 20.1841 -
 20.1842 -  Called by main.  Processes multibyte characters.  Invokes Agetchar.
 20.1843 -  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
 20.1844 -  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
 20.1845 -    0x80-0xFF bytes are first byte of a double-byte character).
 20.1846 -  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
 20.1847 -    0x80-0xBF bytes are nonfirst byte of a multibyte character,
 20.1848 -    0xC0-0xFD bytes are first byte of a multibyte character,
 20.1849 -    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
 20.1850 -  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
 20.1851 -    "~~" is a tilde, "~x" for all other x is ignored).
 20.1852 -  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
 20.1853 -    of a double-byte character, all other bytes are characters).
 20.1854 - 
 20.1855 -
 20.1856 -*****************************************************************************/
 20.1857 -
 20.1858 -inchr getinchr()
 20.1859 -{
 20.1860 -  int ch, ch2, ch3, ch4, ch5, ch6;
 20.1861 -
 20.1862 -  if (getinchr_flag) {
 20.1863 -    getinchr_flag = 0;
 20.1864 -    return getinchr_buffer;
 20.1865 -    }
 20.1866 -
 20.1867 -  switch(multibyte) {
 20.1868 -    case 0: /* single-byte */
 20.1869 -      return iso2022();
 20.1870 -   case 1: /* DBCS */
 20.1871 -     ch = Agetchar();
 20.1872 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 20.1873 -         (ch >= 0xE0 && ch <= 0xEF)) {
 20.1874 -       ch = (ch << 8) + Agetchar();
 20.1875 -       }
 20.1876 -     return ch;
 20.1877 -   case 2: /* UTF-8 */
 20.1878 -      ch = Agetchar();
 20.1879 -      if (ch < 0x80) return ch;  /* handles EOF, too */
 20.1880 -      if (ch < 0xC0 || ch > 0xFD)
 20.1881 -        return 0x0080;  /* illegal first character */
 20.1882 -      ch2 = Agetchar() & 0x3F;
 20.1883 -      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
 20.1884 -      ch3 = Agetchar() & 0x3F;
 20.1885 -      if (ch < 0xF0)
 20.1886 -        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
 20.1887 -      ch4 = Agetchar() & 0x3F;
 20.1888 -      if (ch < 0xF8)
 20.1889 -        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
 20.1890 -      ch5 = Agetchar() & 0x3F;
 20.1891 -      if (ch < 0xFC)
 20.1892 -        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
 20.1893 -          (ch4 << 6) + ch5;
 20.1894 -      ch6 = Agetchar() & 0x3F;
 20.1895 -      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
 20.1896 -        (ch4 << 12) + (ch5 << 6) + ch6;
 20.1897 -   case 3: /* HZ */
 20.1898 -     ch = Agetchar();
 20.1899 -     if (ch == EOF) return ch;
 20.1900 -     if (hzmode) {
 20.1901 -       ch = (ch << 8) + Agetchar();
 20.1902 -       if (ch == ('}' << 8) + '~') {
 20.1903 -         hzmode = 0;
 20.1904 -         return getinchr();
 20.1905 -         }
 20.1906 -       return ch;
 20.1907 -       }
 20.1908 -     else if (ch == '~') {
 20.1909 -       ch = Agetchar();
 20.1910 -       if (ch == '{') {
 20.1911 -          hzmode = 1;
 20.1912 -          return getinchr();
 20.1913 -          }
 20.1914 -      else if (ch == '~') {
 20.1915 -        return ch;
 20.1916 -        }
 20.1917 -      else {
 20.1918 -        return getinchr();
 20.1919 -        }
 20.1920 -      }
 20.1921 -     else return ch;
 20.1922 -   case 4: /* Shift-JIS */
 20.1923 -     ch = Agetchar();
 20.1924 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 20.1925 -         (ch >= 0xE0 && ch <= 0xEF)) {
 20.1926 -       ch = (ch << 8) + Agetchar();
 20.1927 -       }
 20.1928 -     return ch;
 20.1929 -   default:
 20.1930 -     return 0x80;
 20.1931 -    }
 20.1932 -  }
 20.1933 -
 20.1934 -/****************************************************************************
 20.1935 -
 20.1936 -  main
 20.1937 -
 20.1938 -  The main program, of course.
 20.1939 -  Reads characters 1 by 1 from stdin, and makes lines out of them using
 20.1940 -  addchar. Handles line breaking, (which accounts for most of the
 20.1941 -  complexity in this function).
 20.1942 -
 20.1943 -****************************************************************************/
 20.1944 -
 20.1945 -int main(argc,argv)
 20.1946 -int argc;
 20.1947 -char *argv[];
 20.1948 -{
 20.1949 -  inchr c,c2;
 20.1950 -  int i;
 20.1951 -  int last_was_eol_flag;
 20.1952 -/*---------------------------------------------------------------------------
 20.1953 -  wordbreakmode:
 20.1954 -    -1: /^$/ and blanks are to be absorbed (when line break was forced
 20.1955 -      by a blank or character larger than outlinelenlimit)
 20.1956 -    0: /^ *$/ and blanks are not to be absorbed
 20.1957 -    1: /[^ ]$/ no word break yet
 20.1958 -    2: /[^ ]  *$/
 20.1959 -    3: /[^ ]$/ had a word break
 20.1960 ----------------------------------------------------------------------------*/
 20.1961 -  int wordbreakmode;
 20.1962 -  int char_not_added;
 20.1963 -
 20.1964 -  Myargc = argc;
 20.1965 -  Myargv = argv;
 20.1966 -  getparams();
 20.1967 -  readcontrolfiles();
 20.1968 -  readfont();
 20.1969 -  linealloc();
 20.1970 -
 20.1971 -  wordbreakmode = 0;
 20.1972 -  last_was_eol_flag = 0;
 20.1973 -
 20.1974 -  while ((c = getinchr())!=EOF) {
 20.1975 -
 20.1976 -    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
 20.1977 -      ungetinchr(c2 = getinchr());
 20.1978 -      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
 20.1979 -      }
 20.1980 -    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
 20.1981 -
 20.1982 -    if (deutschflag) {
 20.1983 -      if (c>='[' && c<=']') {
 20.1984 -        c = deutsch[c-'['];
 20.1985 -        }
 20.1986 -      else if (c >='{' && c <= '~') {
 20.1987 -        c = deutsch[c-'{'+3];
 20.1988 -        }
 20.1989 -      }
 20.1990 -
 20.1991 -    c = handlemapping(c);
 20.1992 -
 20.1993 -    if (isascii(c)&&isspace(c)) {
 20.1994 -      c = (c=='\t'||c==' ') ? ' ' : '\n';
 20.1995 -      }
 20.1996 -
 20.1997 -    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
 20.1998 -
 20.1999 -/*
 20.2000 -  Note: The following code is complex and thoroughly tested.
 20.2001 -  Be careful when modifying!
 20.2002 -*/
 20.2003 -
 20.2004 -    do {
 20.2005 -      char_not_added = 0;
 20.2006 -
 20.2007 -      if (wordbreakmode== -1) {
 20.2008 -        if (c==' ') {
 20.2009 -          break;
 20.2010 -          }
 20.2011 -        else if (c=='\n') {
 20.2012 -          wordbreakmode = 0;
 20.2013 -          break;
 20.2014 -          }
 20.2015 -        wordbreakmode = 0;
 20.2016 -        }
 20.2017 -
 20.2018 -      if (c=='\n') {
 20.2019 -        printline();
 20.2020 -        wordbreakmode = 0;
 20.2021 -        }
 20.2022 -
 20.2023 -      else if (addchar(c)) {
 20.2024 -        if (c!=' ') {
 20.2025 -          wordbreakmode = (wordbreakmode>=2)?3:1;
 20.2026 -          }
 20.2027 -        else {
 20.2028 -          wordbreakmode = (wordbreakmode>0)?2:0;
 20.2029 -          }
 20.2030 -        }
 20.2031 -
 20.2032 -      else if (outlinelen==0) {
 20.2033 -        for (i=0;i<charheight;i++) {
 20.2034 -          if (right2left && outputwidth>1) {
 20.2035 -            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
 20.2036 -            }
 20.2037 -          else {
 20.2038 -            putstring(currchar[i]);
 20.2039 -            }
 20.2040 -          }
 20.2041 -        wordbreakmode = -1;
 20.2042 -        }
 20.2043 -
 20.2044 -      else if (c==' ') {
 20.2045 -        if (wordbreakmode==2) {
 20.2046 -          splitline();
 20.2047 -          }
 20.2048 -        else {
 20.2049 -          printline();
 20.2050 -          }
 20.2051 -        wordbreakmode = -1;
 20.2052 -        }
 20.2053 -
 20.2054 -      else {
 20.2055 -        if (wordbreakmode>=2) {
 20.2056 -          splitline();
 20.2057 -          }
 20.2058 -        else {
 20.2059 -          printline();
 20.2060 -          }
 20.2061 -        wordbreakmode = (wordbreakmode==3)?1:0;
 20.2062 -        char_not_added = 1;
 20.2063 -        }
 20.2064 -
 20.2065 -      } while (char_not_added);
 20.2066 -    }
 20.2067 -
 20.2068 -  if (outlinelen!=0) {
 20.2069 -    printline();
 20.2070 -    }
 20.2071 -
 20.2072 -  /* XXX Xen hack -- finish off the C macro output */
 20.2073 -  if ( nr_chars != 0 )
 20.2074 -      putchar('"');
 20.2075 -  putchar('\n');
 20.2076 -
 20.2077 -  exit(0);
 20.2078 -}
    21.1 --- a/xen/figlet/xen.flf	Mon Dec 27 13:35:05 2004 +0000
    21.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.3 @@ -1,2230 +0,0 @@
    21.4 -flf2a$ 6 5 16 15 14 0 24463 229
    21.5 -Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    21.6 -Includes ISO Latin-1
    21.7 -figlet release 2.1 -- 12 Aug 1994
    21.8 -Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    21.9 -  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   21.10 -Permission is hereby given to modify this font, as long as the
   21.11 -modifier's name is placed on a comment line.
   21.12 -
   21.13 -Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   21.14 -supported by FIGlet and FIGWin.  May also be slightly modified for better use
   21.15 -of new full-width/kern/smush alternatives, but default output is NOT changed.
   21.16 -
   21.17 -Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   21.18 -
   21.19 - $@
   21.20 - $@
   21.21 - $@
   21.22 - $@
   21.23 - $@
   21.24 - $@@
   21.25 -  _ @
   21.26 - | |@
   21.27 - | |@
   21.28 - |_|@
   21.29 - (_)@
   21.30 -    @@
   21.31 -  _ _ @
   21.32 - ( | )@
   21.33 -  V V @
   21.34 -   $  @
   21.35 -   $  @
   21.36 -      @@
   21.37 -    _  _   @
   21.38 -  _| || |_ @
   21.39 - |_  ..  _|@
   21.40 - |_      _|@
   21.41 -   |_||_|  @
   21.42 -           @@
   21.43 -   _  @
   21.44 -  | | @
   21.45 - / __)@
   21.46 - \__ \@
   21.47 - (   /@
   21.48 -  |_| @@
   21.49 -  _  __@
   21.50 - (_)/ /@
   21.51 -   / / @
   21.52 -  / /_ @
   21.53 - /_/(_)@
   21.54 -       @@
   21.55 -   ___   @
   21.56 -  ( _ )  @
   21.57 -  / _ \/\@
   21.58 - | (_>  <@
   21.59 -  \___/\/@
   21.60 -         @@
   21.61 -  _ @
   21.62 - ( )@
   21.63 - |/ @
   21.64 -  $ @
   21.65 -  $ @
   21.66 -    @@
   21.67 -   __@
   21.68 -  / /@
   21.69 - | | @
   21.70 - | | @
   21.71 - | | @
   21.72 -  \_\@@
   21.73 - __  @
   21.74 - \ \ @
   21.75 -  | |@
   21.76 -  | |@
   21.77 -  | |@
   21.78 - /_/ @@
   21.79 -       @
   21.80 - __/\__@
   21.81 - \    /@
   21.82 - /_  _\@
   21.83 -   \/  @
   21.84 -       @@
   21.85 -        @
   21.86 -    _   @
   21.87 -  _| |_ @
   21.88 - |_   _|@
   21.89 -   |_|  @
   21.90 -        @@
   21.91 -    @
   21.92 -    @
   21.93 -    @
   21.94 -  _ @
   21.95 - ( )@
   21.96 - |/ @@
   21.97 -     @
   21.98 -     @
   21.99 -  __ @
  21.100 - |__|@
  21.101 -  $  @
  21.102 -     @@
  21.103 -    @
  21.104 -    @
  21.105 -    @
  21.106 -  _ @
  21.107 - (_)@
  21.108 -    @@
  21.109 -     __@
  21.110 -    / /@
  21.111 -   / / @
  21.112 -  / /  @
  21.113 - /_/   @
  21.114 -       @@
  21.115 -   ___  @
  21.116 -  / _ \ @
  21.117 - | | | |@
  21.118 - | |_| |@
  21.119 -  \___/ @
  21.120 -        @@
  21.121 -  _ @
  21.122 - / |@
  21.123 - | |@
  21.124 - | |@
  21.125 - |_|@
  21.126 -    @@
  21.127 -  ____  @
  21.128 - |___ \ @
  21.129 -   __) |@
  21.130 -  / __/ @
  21.131 - |_____|@
  21.132 -        @@
  21.133 -  _____ @
  21.134 - |___ / @
  21.135 -   |_ \ @
  21.136 -  ___) |@
  21.137 - |____/ @
  21.138 -        @@
  21.139 -  _  _   @
  21.140 - | || |  @
  21.141 - | || |_ @
  21.142 - |__   _|@
  21.143 -    |_|  @
  21.144 -         @@
  21.145 -  ____  @
  21.146 - | ___| @
  21.147 - |___ \ @
  21.148 -  ___) |@
  21.149 - |____/ @
  21.150 -        @@
  21.151 -   __   @
  21.152 -  / /_  @
  21.153 - | '_ \ @
  21.154 - | (_) |@
  21.155 -  \___/ @
  21.156 -        @@
  21.157 -  _____ @
  21.158 - |___  |@
  21.159 -    / / @
  21.160 -   / /  @
  21.161 -  /_/   @
  21.162 -        @@
  21.163 -   ___  @
  21.164 -  ( _ ) @
  21.165 -  / _ \ @
  21.166 - | (_) |@
  21.167 -  \___/ @
  21.168 -        @@
  21.169 -   ___  @
  21.170 -  / _ \ @
  21.171 - | (_) |@
  21.172 -  \__, |@
  21.173 -    /_/ @
  21.174 -        @@
  21.175 -    @
  21.176 -  _ @
  21.177 - (_)@
  21.178 -  _ @
  21.179 - (_)@
  21.180 -    @@
  21.181 -    @
  21.182 -  _ @
  21.183 - (_)@
  21.184 -  _ @
  21.185 - ( )@
  21.186 - |/ @@
  21.187 -   __@
  21.188 -  / /@
  21.189 - / / @
  21.190 - \ \ @
  21.191 -  \_\@
  21.192 -     @@
  21.193 -        @
  21.194 -  _____ @
  21.195 - |_____|@
  21.196 - |_____|@
  21.197 -    $   @
  21.198 -        @@
  21.199 - __  @
  21.200 - \ \ @
  21.201 -  \ \@
  21.202 -  / /@
  21.203 - /_/ @
  21.204 -     @@
  21.205 -  ___ @
  21.206 - |__ \@
  21.207 -   / /@
  21.208 -  |_| @
  21.209 -  (_) @
  21.210 -      @@
  21.211 -    ____  @
  21.212 -   / __ \ @
  21.213 -  / / _` |@
  21.214 - | | (_| |@
  21.215 -  \ \__,_|@
  21.216 -   \____/ @@
  21.217 -     _    @
  21.218 -    / \   @
  21.219 -   / _ \  @
  21.220 -  / ___ \ @
  21.221 - /_/   \_\@
  21.222 -          @@
  21.223 -  ____  @
  21.224 - | __ ) @
  21.225 - |  _ \ @
  21.226 - | |_) |@
  21.227 - |____/ @
  21.228 -        @@
  21.229 -   ____ @
  21.230 -  / ___|@
  21.231 - | |    @
  21.232 - | |___ @
  21.233 -  \____|@
  21.234 -        @@
  21.235 -  ____  @
  21.236 - |  _ \ @
  21.237 - | | | |@
  21.238 - | |_| |@
  21.239 - |____/ @
  21.240 -        @@
  21.241 -  _____ @
  21.242 - | ____|@
  21.243 - |  _|  @
  21.244 - | |___ @
  21.245 - |_____|@
  21.246 -        @@
  21.247 -  _____ @
  21.248 - |  ___|@
  21.249 - | |_   @
  21.250 - |  _|  @
  21.251 - |_|    @
  21.252 -        @@
  21.253 -   ____ @
  21.254 -  / ___|@
  21.255 - | |  _ @
  21.256 - | |_| |@
  21.257 -  \____|@
  21.258 -        @@
  21.259 -  _   _ @
  21.260 - | | | |@
  21.261 - | |_| |@
  21.262 - |  _  |@
  21.263 - |_| |_|@
  21.264 -        @@
  21.265 -  ___ @
  21.266 - |_ _|@
  21.267 -  | | @
  21.268 -  | | @
  21.269 - |___|@
  21.270 -      @@
  21.271 -      _ @
  21.272 -     | |@
  21.273 -  _  | |@
  21.274 - | |_| |@
  21.275 -  \___/ @
  21.276 -        @@
  21.277 -  _  __@
  21.278 - | |/ /@
  21.279 - | ' / @
  21.280 - | . \ @
  21.281 - |_|\_\@
  21.282 -       @@
  21.283 -  _     @
  21.284 - | |    @
  21.285 - | |    @
  21.286 - | |___ @
  21.287 - |_____|@
  21.288 -        @@
  21.289 -  __  __ @
  21.290 - |  \/  |@
  21.291 - | |\/| |@
  21.292 - | |  | |@
  21.293 - |_|  |_|@
  21.294 -         @@
  21.295 -  _   _ @
  21.296 - | \ | |@
  21.297 - |  \| |@
  21.298 - | |\  |@
  21.299 - |_| \_|@
  21.300 -        @@
  21.301 -   ___  @
  21.302 -  / _ \ @
  21.303 - | | | |@
  21.304 - | |_| |@
  21.305 -  \___/ @
  21.306 -        @@
  21.307 -  ____  @
  21.308 - |  _ \ @
  21.309 - | |_) |@
  21.310 - |  __/ @
  21.311 - |_|    @
  21.312 -        @@
  21.313 -   ___  @
  21.314 -  / _ \ @
  21.315 - | | | |@
  21.316 - | |_| |@
  21.317 -  \__\_\@
  21.318 -        @@
  21.319 -  ____  @
  21.320 - |  _ \ @
  21.321 - | |_) |@
  21.322 - |  _ < @
  21.323 - |_| \_\@
  21.324 -        @@
  21.325 -  ____  @
  21.326 - / ___| @
  21.327 - \___ \ @
  21.328 -  ___) |@
  21.329 - |____/ @
  21.330 -        @@
  21.331 -  _____ @
  21.332 - |_   _|@
  21.333 -   | |  @
  21.334 -   | |  @
  21.335 -   |_|  @
  21.336 -        @@
  21.337 -  _   _ @
  21.338 - | | | |@
  21.339 - | | | |@
  21.340 - | |_| |@
  21.341 -  \___/ @
  21.342 -        @@
  21.343 - __     __@
  21.344 - \ \   / /@
  21.345 -  \ \ / / @
  21.346 -   \ V /  @
  21.347 -    \_/   @
  21.348 -          @@
  21.349 - __        __@
  21.350 - \ \      / /@
  21.351 -  \ \ /\ / / @
  21.352 -   \ V  V /  @
  21.353 -    \_/\_/   @
  21.354 -             @@
  21.355 - __  __@
  21.356 - \ \/ /@
  21.357 -  \  / @
  21.358 -  /  \ @
  21.359 - /_/\_\@
  21.360 -       @@
  21.361 - __   __@
  21.362 - \ \ / /@
  21.363 -  \ V / @
  21.364 -   | |  @
  21.365 -   |_|  @
  21.366 -        @@
  21.367 -  _____@
  21.368 - |__  /@
  21.369 -   / / @
  21.370 -  / /_ @
  21.371 - /____|@
  21.372 -       @@
  21.373 -  __ @
  21.374 - | _|@
  21.375 - | | @
  21.376 - | | @
  21.377 - | | @
  21.378 - |__|@@
  21.379 - __    @
  21.380 - \ \   @
  21.381 -  \ \  @
  21.382 -   \ \ @
  21.383 -    \_\@
  21.384 -       @@
  21.385 -  __ @
  21.386 - |_ |@
  21.387 -  | |@
  21.388 -  | |@
  21.389 -  | |@
  21.390 - |__|@@
  21.391 -  /\ @
  21.392 - |/\|@
  21.393 -   $ @
  21.394 -   $ @
  21.395 -   $ @
  21.396 -     @@
  21.397 -        @
  21.398 -        @
  21.399 -        @
  21.400 -        @
  21.401 -  _____ @
  21.402 - |_____|@@
  21.403 -  _ @
  21.404 - ( )@
  21.405 -  \|@
  21.406 -  $ @
  21.407 -  $ @
  21.408 -    @@
  21.409 -        @
  21.410 -   __ _ @
  21.411 -  / _` |@
  21.412 - | (_| |@
  21.413 -  \__,_|@
  21.414 -        @@
  21.415 -  _     @
  21.416 - | |__  @
  21.417 - | '_ \ @
  21.418 - | |_) |@
  21.419 - |_.__/ @
  21.420 -        @@
  21.421 -       @
  21.422 -   ___ @
  21.423 -  / __|@
  21.424 - | (__ @
  21.425 -  \___|@
  21.426 -       @@
  21.427 -      _ @
  21.428 -   __| |@
  21.429 -  / _` |@
  21.430 - | (_| |@
  21.431 -  \__,_|@
  21.432 -        @@
  21.433 -       @
  21.434 -   ___ @
  21.435 -  / _ \@
  21.436 - |  __/@
  21.437 -  \___|@
  21.438 -       @@
  21.439 -   __ @
  21.440 -  / _|@
  21.441 - | |_ @
  21.442 - |  _|@
  21.443 - |_|  @
  21.444 -      @@
  21.445 -        @
  21.446 -   __ _ @
  21.447 -  / _` |@
  21.448 - | (_| |@
  21.449 -  \__, |@
  21.450 -  |___/ @@
  21.451 -  _     @
  21.452 - | |__  @
  21.453 - | '_ \ @
  21.454 - | | | |@
  21.455 - |_| |_|@
  21.456 -        @@
  21.457 -  _ @
  21.458 - (_)@
  21.459 - | |@
  21.460 - | |@
  21.461 - |_|@
  21.462 -    @@
  21.463 -    _ @
  21.464 -   (_)@
  21.465 -   | |@
  21.466 -   | |@
  21.467 -  _/ |@
  21.468 - |__/ @@
  21.469 -  _    @
  21.470 - | | __@
  21.471 - | |/ /@
  21.472 - |   < @
  21.473 - |_|\_\@
  21.474 -       @@
  21.475 -  _ @
  21.476 - | |@
  21.477 - | |@
  21.478 - | |@
  21.479 - |_|@
  21.480 -    @@
  21.481 -            @
  21.482 -  _ __ ___  @
  21.483 - | '_ ` _ \ @
  21.484 - | | | | | |@
  21.485 - |_| |_| |_|@
  21.486 -            @@
  21.487 -        @
  21.488 -  _ __  @
  21.489 - | '_ \ @
  21.490 - | | | |@
  21.491 - |_| |_|@
  21.492 -        @@
  21.493 -        @
  21.494 -   ___  @
  21.495 -  / _ \ @
  21.496 - | (_) |@
  21.497 -  \___/ @
  21.498 -        @@
  21.499 -        @
  21.500 -  _ __  @
  21.501 - | '_ \ @
  21.502 - | |_) |@
  21.503 - | .__/ @
  21.504 - |_|    @@
  21.505 -        @
  21.506 -   __ _ @
  21.507 -  / _` |@
  21.508 - | (_| |@
  21.509 -  \__, |@
  21.510 -     |_|@@
  21.511 -       @
  21.512 -  _ __ @
  21.513 - | '__|@
  21.514 - | |   @
  21.515 - |_|   @
  21.516 -       @@
  21.517 -      @
  21.518 -  ___ @
  21.519 - / __|@
  21.520 - \__ \@
  21.521 - |___/@
  21.522 -      @@
  21.523 -  _   @
  21.524 - | |_ @
  21.525 - | __|@
  21.526 - | |_ @
  21.527 -  \__|@
  21.528 -      @@
  21.529 -        @
  21.530 -  _   _ @
  21.531 - | | | |@
  21.532 - | |_| |@
  21.533 -  \__,_|@
  21.534 -        @@
  21.535 -        @
  21.536 - __   __@
  21.537 - \ \ / /@
  21.538 -  \ V / @
  21.539 -   \_/  @
  21.540 -        @@
  21.541 -           @
  21.542 - __      __@
  21.543 - \ \ /\ / /@
  21.544 -  \ V  V / @
  21.545 -   \_/\_/  @
  21.546 -           @@
  21.547 -       @
  21.548 - __  __@
  21.549 - \ \/ /@
  21.550 -  >  < @
  21.551 - /_/\_\@
  21.552 -       @@
  21.553 -        @
  21.554 -  _   _ @
  21.555 - | | | |@
  21.556 - | |_| |@
  21.557 -  \__, |@
  21.558 -  |___/ @@
  21.559 -      @
  21.560 -  ____@
  21.561 - |_  /@
  21.562 -  / / @
  21.563 - /___|@
  21.564 -      @@
  21.565 -    __@
  21.566 -   / /@
  21.567 -  | | @
  21.568 - < <  @
  21.569 -  | | @
  21.570 -   \_\@@
  21.571 -  _ @
  21.572 - | |@
  21.573 - | |@
  21.574 - | |@
  21.575 - | |@
  21.576 - |_|@@
  21.577 - __   @
  21.578 - \ \  @
  21.579 -  | | @
  21.580 -   > >@
  21.581 -  | | @
  21.582 - /_/  @@
  21.583 -  /\/|@
  21.584 - |/\/ @
  21.585 -   $  @
  21.586 -   $  @
  21.587 -   $  @
  21.588 -      @@
  21.589 -  _   _ @
  21.590 - (_)_(_)@
  21.591 -   /_\  @
  21.592 -  / _ \ @
  21.593 - /_/ \_\@
  21.594 -        @@
  21.595 -  _   _ @
  21.596 - (_)_(_)@
  21.597 -  / _ \ @
  21.598 - | |_| |@
  21.599 -  \___/ @
  21.600 -        @@
  21.601 -  _   _ @
  21.602 - (_) (_)@
  21.603 - | | | |@
  21.604 - | |_| |@
  21.605 -  \___/ @
  21.606 -        @@
  21.607 -  _   _ @
  21.608 - (_)_(_)@
  21.609 -  / _` |@
  21.610 - | (_| |@
  21.611 -  \__,_|@
  21.612 -        @@
  21.613 -  _   _ @
  21.614 - (_)_(_)@
  21.615 -  / _ \ @
  21.616 - | (_) |@
  21.617 -  \___/ @
  21.618 -        @@
  21.619 -  _   _ @
  21.620 - (_) (_)@
  21.621 - | | | |@
  21.622 - | |_| |@
  21.623 -  \__,_|@
  21.624 -        @@
  21.625 -   ___ @
  21.626 -  / _ \@
  21.627 - | |/ /@
  21.628 - | |\ \@
  21.629 - | ||_/@
  21.630 - |_|   @@
  21.631 -160  NO-BREAK SPACE
  21.632 - $@
  21.633 - $@
  21.634 - $@
  21.635 - $@
  21.636 - $@
  21.637 - $@@
  21.638 -161  INVERTED EXCLAMATION MARK
  21.639 -  _ @
  21.640 - (_)@
  21.641 - | |@
  21.642 - | |@
  21.643 - |_|@
  21.644 -    @@
  21.645 -162  CENT SIGN
  21.646 -    _  @
  21.647 -   | | @
  21.648 -  / __)@
  21.649 - | (__ @
  21.650 -  \   )@
  21.651 -   |_| @@
  21.652 -163  POUND SIGN
  21.653 -    ___  @
  21.654 -   / ,_\ @
  21.655 - _| |_   @
  21.656 -  | |___ @
  21.657 - (_,____|@
  21.658 -         @@
  21.659 -164  CURRENCY SIGN
  21.660 - /\___/\@
  21.661 - \  _  /@
  21.662 - | (_) |@
  21.663 - / ___ \@
  21.664 - \/   \/@
  21.665 -        @@
  21.666 -165  YEN SIGN
  21.667 -  __ __ @
  21.668 -  \ V / @
  21.669 - |__ __|@
  21.670 - |__ __|@
  21.671 -   |_|  @
  21.672 -        @@
  21.673 -166  BROKEN BAR
  21.674 -  _ @
  21.675 - | |@
  21.676 - |_|@
  21.677 -  _ @
  21.678 - | |@
  21.679 - |_|@@
  21.680 -167  SECTION SIGN
  21.681 -    __ @
  21.682 -  _/ _)@
  21.683 - / \ \ @
  21.684 - \ \\ \@
  21.685 -  \ \_/@
  21.686 - (__/  @@
  21.687 -168  DIAERESIS
  21.688 -  _   _ @
  21.689 - (_) (_)@
  21.690 -  $   $ @
  21.691 -  $   $ @
  21.692 -  $   $ @
  21.693 -        @@
  21.694 -169  COPYRIGHT SIGN
  21.695 -    _____   @
  21.696 -   / ___ \  @
  21.697 -  / / __| \ @
  21.698 - | | (__   |@
  21.699 -  \ \___| / @
  21.700 -   \_____/  @@
  21.701 -170  FEMININE ORDINAL INDICATOR
  21.702 -  __ _ @
  21.703 - / _` |@
  21.704 - \__,_|@
  21.705 - |____|@
  21.706 -    $  @
  21.707 -       @@
  21.708 -171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  21.709 -   ____@
  21.710 -  / / /@
  21.711 - / / / @
  21.712 - \ \ \ @
  21.713 -  \_\_\@
  21.714 -       @@
  21.715 -172  NOT SIGN
  21.716 -        @
  21.717 -  _____ @
  21.718 - |___  |@
  21.719 -     |_|@
  21.720 -    $   @
  21.721 -        @@
  21.722 -173  SOFT HYPHEN
  21.723 -       @
  21.724 -       @
  21.725 -  ____ @
  21.726 - |____|@
  21.727 -    $  @
  21.728 -       @@
  21.729 -174  REGISTERED SIGN
  21.730 -    _____   @
  21.731 -   / ___ \  @
  21.732 -  / | _ \ \ @
  21.733 - |  |   /  |@
  21.734 -  \ |_|_\ / @
  21.735 -   \_____/  @@
  21.736 -175  MACRON
  21.737 -  _____ @
  21.738 - |_____|@
  21.739 -    $   @
  21.740 -    $   @
  21.741 -    $   @
  21.742 -        @@
  21.743 -176  DEGREE SIGN
  21.744 -   __  @
  21.745 -  /  \ @
  21.746 - | () |@
  21.747 -  \__/ @
  21.748 -    $  @
  21.749 -       @@
  21.750 -177  PLUS-MINUS SIGN
  21.751 -    _   @
  21.752 -  _| |_ @
  21.753 - |_   _|@
  21.754 -  _|_|_ @
  21.755 - |_____|@
  21.756 -        @@
  21.757 -178  SUPERSCRIPT TWO
  21.758 -  ___ @
  21.759 - |_  )@
  21.760 -  / / @
  21.761 - /___|@
  21.762 -   $  @
  21.763 -      @@
  21.764 -179  SUPERSCRIPT THREE
  21.765 -  ____@
  21.766 - |__ /@
  21.767 -  |_ \@
  21.768 - |___/@
  21.769 -   $  @
  21.770 -      @@
  21.771 -180  ACUTE ACCENT
  21.772 -  __@
  21.773 - /_/@
  21.774 -  $ @
  21.775 -  $ @
  21.776 -  $ @
  21.777 -    @@
  21.778 -181  MICRO SIGN
  21.779 -        @
  21.780 -  _   _ @
  21.781 - | | | |@
  21.782 - | |_| |@
  21.783 - | ._,_|@
  21.784 - |_|    @@
  21.785 -182  PILCROW SIGN
  21.786 -   _____ @
  21.787 -  /     |@
  21.788 - | (| | |@
  21.789 -  \__ | |@
  21.790 -    |_|_|@
  21.791 -         @@
  21.792 -183  MIDDLE DOT
  21.793 -    @
  21.794 -  _ @
  21.795 - (_)@
  21.796 -  $ @
  21.797 -  $ @
  21.798 -    @@
  21.799 -184  CEDILLA
  21.800 -    @
  21.801 -    @
  21.802 -    @
  21.803 -    @
  21.804 -  _ @
  21.805 - )_)@@
  21.806 -185  SUPERSCRIPT ONE
  21.807 -  _ @
  21.808 - / |@
  21.809 - | |@
  21.810 - |_|@
  21.811 -  $ @
  21.812 -    @@
  21.813 -186  MASCULINE ORDINAL INDICATOR
  21.814 -  ___ @
  21.815 - / _ \@
  21.816 - \___/@
  21.817 - |___|@
  21.818 -   $  @
  21.819 -      @@
  21.820 -187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  21.821 - ____  @
  21.822 - \ \ \ @
  21.823 -  \ \ \@
  21.824 -  / / /@
  21.825 - /_/_/ @
  21.826 -       @@
  21.827 -188  VULGAR FRACTION ONE QUARTER
  21.828 -  _   __    @
  21.829 - / | / / _  @
  21.830 - | |/ / | | @
  21.831 - |_/ /|_  _|@
  21.832 -  /_/   |_| @
  21.833 -            @@
  21.834 -189  VULGAR FRACTION ONE HALF
  21.835 -  _   __   @
  21.836 - / | / /__ @
  21.837 - | |/ /_  )@
  21.838 - |_/ / / / @
  21.839 -  /_/ /___|@
  21.840 -           @@
  21.841 -190  VULGAR FRACTION THREE QUARTERS
  21.842 -  ____  __    @
  21.843 - |__ / / / _  @
  21.844 -  |_ \/ / | | @
  21.845 - |___/ /|_  _|@
  21.846 -    /_/   |_| @
  21.847 -              @@
  21.848 -191  INVERTED QUESTION MARK
  21.849 -   _  @
  21.850 -  (_) @
  21.851 -  | | @
  21.852 - / /_ @
  21.853 - \___|@
  21.854 -      @@
  21.855 -192  LATIN CAPITAL LETTER A WITH GRAVE
  21.856 -   __   @
  21.857 -   \_\  @
  21.858 -   /_\  @
  21.859 -  / _ \ @
  21.860 - /_/ \_\@
  21.861 -        @@
  21.862 -193  LATIN CAPITAL LETTER A WITH ACUTE
  21.863 -    __  @
  21.864 -   /_/  @
  21.865 -   /_\  @
  21.866 -  / _ \ @
  21.867 - /_/ \_\@
  21.868 -        @@
  21.869 -194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  21.870 -   //\  @
  21.871 -  |/_\| @
  21.872 -   /_\  @
  21.873 -  / _ \ @
  21.874 - /_/ \_\@
  21.875 -        @@
  21.876 -195  LATIN CAPITAL LETTER A WITH TILDE
  21.877 -   /\/| @
  21.878 -  |/\/  @
  21.879 -   /_\  @
  21.880 -  / _ \ @
  21.881 - /_/ \_\@
  21.882 -        @@
  21.883 -196  LATIN CAPITAL LETTER A WITH DIAERESIS
  21.884 -  _   _ @
  21.885 - (_)_(_)@
  21.886 -   /_\  @
  21.887 -  / _ \ @
  21.888 - /_/ \_\@
  21.889 -        @@
  21.890 -197  LATIN CAPITAL LETTER A WITH RING ABOVE
  21.891 -    _   @
  21.892 -   (o)  @
  21.893 -   /_\  @
  21.894 -  / _ \ @
  21.895 - /_/ \_\@
  21.896 -        @@
  21.897 -198  LATIN CAPITAL LETTER AE
  21.898 -     ______ @
  21.899 -    /  ____|@
  21.900 -   / _  _|  @
  21.901 -  / __ |___ @
  21.902 - /_/ |_____|@
  21.903 -            @@
  21.904 -199  LATIN CAPITAL LETTER C WITH CEDILLA
  21.905 -   ____ @
  21.906 -  / ___|@
  21.907 - | |    @
  21.908 - | |___ @
  21.909 -  \____|@
  21.910 -    )_) @@
  21.911 -200  LATIN CAPITAL LETTER E WITH GRAVE
  21.912 -   __   @
  21.913 -  _\_\_ @
  21.914 - | ____|@
  21.915 - |  _|_ @
  21.916 - |_____|@
  21.917 -        @@
  21.918 -201  LATIN CAPITAL LETTER E WITH ACUTE
  21.919 -    __  @
  21.920 -  _/_/_ @
  21.921 - | ____|@
  21.922 - |  _|_ @
  21.923 - |_____|@
  21.924 -        @@
  21.925 -202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  21.926 -   //\  @
  21.927 -  |/_\| @
  21.928 - | ____|@
  21.929 - |  _|_ @
  21.930 - |_____|@
  21.931 -        @@
  21.932 -203  LATIN CAPITAL LETTER E WITH DIAERESIS
  21.933 -  _   _ @
  21.934 - (_)_(_)@
  21.935 - | ____|@
  21.936 - |  _|_ @
  21.937 - |_____|@
  21.938 -        @@
  21.939 -204  LATIN CAPITAL LETTER I WITH GRAVE
  21.940 -  __  @
  21.941 -  \_\ @
  21.942 - |_ _|@
  21.943 -  | | @
  21.944 - |___|@
  21.945 -      @@
  21.946 -205  LATIN CAPITAL LETTER I WITH ACUTE
  21.947 -   __ @
  21.948 -  /_/ @
  21.949 - |_ _|@
  21.950 -  | | @
  21.951 - |___|@
  21.952 -      @@
  21.953 -206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  21.954 -  //\ @
  21.955 - |/_\|@
  21.956 - |_ _|@
  21.957 -  | | @
  21.958 - |___|@
  21.959 -      @@
  21.960 -207  LATIN CAPITAL LETTER I WITH DIAERESIS
  21.961 -  _   _ @
  21.962 - (_)_(_)@
  21.963 -  |_ _| @
  21.964 -   | |  @
  21.965 -  |___| @
  21.966 -        @@
  21.967 -208  LATIN CAPITAL LETTER ETH
  21.968 -    ____  @
  21.969 -   |  _ \ @
  21.970 -  _| |_| |@
  21.971 - |__ __| |@
  21.972 -   |____/ @
  21.973 -          @@
  21.974 -209  LATIN CAPITAL LETTER N WITH TILDE
  21.975 -   /\/|@
  21.976 -  |/\/ @
  21.977 - | \| |@
  21.978 - | .` |@
  21.979 - |_|\_|@
  21.980 -       @@
  21.981 -210  LATIN CAPITAL LETTER O WITH GRAVE
  21.982 -   __   @
  21.983 -   \_\  @
  21.984 -  / _ \ @
  21.985 - | |_| |@
  21.986 -  \___/ @
  21.987 -        @@
  21.988 -211  LATIN CAPITAL LETTER O WITH ACUTE
  21.989 -    __  @
  21.990 -   /_/  @
  21.991 -  / _ \ @
  21.992 - | |_| |@
  21.993 -  \___/ @
  21.994 -        @@
  21.995 -212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  21.996 -   //\  @
  21.997 -  |/_\| @
  21.998 -  / _ \ @
  21.999 - | |_| |@
 21.1000 -  \___/ @
 21.1001 -        @@
 21.1002 -213  LATIN CAPITAL LETTER O WITH TILDE
 21.1003 -   /\/| @
 21.1004 -  |/\/  @
 21.1005 -  / _ \ @
 21.1006 - | |_| |@
 21.1007 -  \___/ @
 21.1008 -        @@
 21.1009 -214  LATIN CAPITAL LETTER O WITH DIAERESIS
 21.1010 -  _   _ @
 21.1011 - (_)_(_)@
 21.1012 -  / _ \ @
 21.1013 - | |_| |@
 21.1014 -  \___/ @
 21.1015 -        @@
 21.1016 -215  MULTIPLICATION SIGN
 21.1017 -     @
 21.1018 -     @
 21.1019 - /\/\@
 21.1020 - >  <@
 21.1021 - \/\/@
 21.1022 -     @@
 21.1023 -216  LATIN CAPITAL LETTER O WITH STROKE
 21.1024 -   ____ @
 21.1025 -  / _// @
 21.1026 - | |// |@
 21.1027 - | //| |@
 21.1028 -  //__/ @
 21.1029 -        @@
 21.1030 -217  LATIN CAPITAL LETTER U WITH GRAVE
 21.1031 -   __   @
 21.1032 -  _\_\_ @
 21.1033 - | | | |@
 21.1034 - | |_| |@
 21.1035 -  \___/ @
 21.1036 -        @@
 21.1037 -218  LATIN CAPITAL LETTER U WITH ACUTE
 21.1038 -    __  @
 21.1039 -  _/_/_ @
 21.1040 - | | | |@
 21.1041 - | |_| |@
 21.1042 -  \___/ @
 21.1043 -        @@
 21.1044 -219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 21.1045 -   //\  @
 21.1046 -  |/ \| @
 21.1047 - | | | |@
 21.1048 - | |_| |@
 21.1049 -  \___/ @
 21.1050 -        @@
 21.1051 -220  LATIN CAPITAL LETTER U WITH DIAERESIS
 21.1052 -  _   _ @
 21.1053 - (_) (_)@
 21.1054 - | | | |@
 21.1055 - | |_| |@
 21.1056 -  \___/ @
 21.1057 -        @@
 21.1058 -221  LATIN CAPITAL LETTER Y WITH ACUTE
 21.1059 -    __  @
 21.1060 - __/_/__@
 21.1061 - \ \ / /@
 21.1062 -  \ V / @
 21.1063 -   |_|  @
 21.1064 -        @@
 21.1065 -222  LATIN CAPITAL LETTER THORN
 21.1066 -  _     @
 21.1067 - | |___ @
 21.1068 - |  __ \@
 21.1069 - |  ___/@
 21.1070 - |_|    @
 21.1071 -        @@
 21.1072 -223  LATIN SMALL LETTER SHARP S
 21.1073 -   ___ @
 21.1074 -  / _ \@
 21.1075 - | |/ /@
 21.1076 - | |\ \@
 21.1077 - | ||_/@
 21.1078 - |_|   @@
 21.1079 -224  LATIN SMALL LETTER A WITH GRAVE
 21.1080 -   __   @
 21.1081 -   \_\_ @
 21.1082 -  / _` |@
 21.1083 - | (_| |@
 21.1084 -  \__,_|@
 21.1085 -        @@
 21.1086 -225  LATIN SMALL LETTER A WITH ACUTE
 21.1087 -    __  @
 21.1088 -   /_/_ @
 21.1089 -  / _` |@
 21.1090 - | (_| |@
 21.1091 -  \__,_|@
 21.1092 -        @@
 21.1093 -226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 21.1094 -   //\  @
 21.1095 -  |/_\| @
 21.1096 -  / _` |@
 21.1097 - | (_| |@
 21.1098 -  \__,_|@
 21.1099 -        @@
 21.1100 -227  LATIN SMALL LETTER A WITH TILDE
 21.1101 -   /\/| @
 21.1102 -  |/\/_ @
 21.1103 -  / _` |@
 21.1104 - | (_| |@
 21.1105 -  \__,_|@
 21.1106 -        @@
 21.1107 -228  LATIN SMALL LETTER A WITH DIAERESIS
 21.1108 -  _   _ @
 21.1109 - (_)_(_)@
 21.1110 -  / _` |@
 21.1111 - | (_| |@
 21.1112 -  \__,_|@
 21.1113 -        @@
 21.1114 -229  LATIN SMALL LETTER A WITH RING ABOVE
 21.1115 -    __  @
 21.1116 -   (()) @
 21.1117 -  / _ '|@
 21.1118 - | (_| |@
 21.1119 -  \__,_|@
 21.1120 -        @@
 21.1121 -230  LATIN SMALL LETTER AE
 21.1122 -           @
 21.1123 -   __ ____ @
 21.1124 -  / _`  _ \@
 21.1125 - | (_|  __/@
 21.1126 -  \__,____|@
 21.1127 -           @@
 21.1128 -231  LATIN SMALL LETTER C WITH CEDILLA
 21.1129 -       @
 21.1130 -   ___ @
 21.1131 -  / __|@
 21.1132 - | (__ @
 21.1133 -  \___|@
 21.1134 -   )_) @@
 21.1135 -232  LATIN SMALL LETTER E WITH GRAVE
 21.1136 -   __  @
 21.1137 -   \_\ @
 21.1138 -  / _ \@
 21.1139 - |  __/@
 21.1140 -  \___|@
 21.1141 -       @@
 21.1142 -233  LATIN SMALL LETTER E WITH ACUTE
 21.1143 -    __ @
 21.1144 -   /_/ @
 21.1145 -  / _ \@
 21.1146 - |  __/@
 21.1147 -  \___|@
 21.1148 -       @@
 21.1149 -234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 21.1150 -   //\ @
 21.1151 -  |/_\|@
 21.1152 -  / _ \@
 21.1153 - |  __/@
 21.1154 -  \___|@
 21.1155 -       @@
 21.1156 -235  LATIN SMALL LETTER E WITH DIAERESIS
 21.1157 -  _   _ @
 21.1158 - (_)_(_)@
 21.1159 -  / _ \ @
 21.1160 - |  __/ @
 21.1161 -  \___| @
 21.1162 -        @@
 21.1163 -236  LATIN SMALL LETTER I WITH GRAVE
 21.1164 - __ @
 21.1165 - \_\@
 21.1166 - | |@
 21.1167 - | |@
 21.1168 - |_|@
 21.1169 -    @@
 21.1170 -237  LATIN SMALL LETTER I WITH ACUTE
 21.1171 -  __@
 21.1172 - /_/@
 21.1173 - | |@
 21.1174 - | |@
 21.1175 - |_|@
 21.1176 -    @@
 21.1177 -238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 21.1178 -  //\ @
 21.1179 - |/_\|@
 21.1180 -  | | @
 21.1181 -  | | @
 21.1182 -  |_| @
 21.1183 -      @@
 21.1184 -239  LATIN SMALL LETTER I WITH DIAERESIS
 21.1185 -  _   _ @
 21.1186 - (_)_(_)@
 21.1187 -   | |  @
 21.1188 -   | |  @
 21.1189 -   |_|  @
 21.1190 -        @@
 21.1191 -240  LATIN SMALL LETTER ETH
 21.1192 -   /\/\ @
 21.1193 -   >  < @
 21.1194 -  _\/\ |@
 21.1195 - / __` |@
 21.1196 - \____/ @
 21.1197 -        @@
 21.1198 -241  LATIN SMALL LETTER N WITH TILDE
 21.1199 -   /\/| @
 21.1200 -  |/\/  @
 21.1201 - | '_ \ @
 21.1202 - | | | |@
 21.1203 - |_| |_|@
 21.1204 -        @@
 21.1205 -242  LATIN SMALL LETTER O WITH GRAVE
 21.1206 -   __   @
 21.1207 -   \_\  @
 21.1208 -  / _ \ @
 21.1209 - | (_) |@
 21.1210 -  \___/ @
 21.1211 -        @@
 21.1212 -243  LATIN SMALL LETTER O WITH ACUTE
 21.1213 -    __  @
 21.1214 -   /_/  @
 21.1215 -  / _ \ @
 21.1216 - | (_) |@
 21.1217 -  \___/ @
 21.1218 -        @@
 21.1219 -244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 21.1220 -   //\  @
 21.1221 -  |/_\| @
 21.1222 -  / _ \ @
 21.1223 - | (_) |@
 21.1224 -  \___/ @
 21.1225 -        @@
 21.1226 -245  LATIN SMALL LETTER O WITH TILDE
 21.1227 -   /\/| @
 21.1228 -  |/\/  @
 21.1229 -  / _ \ @
 21.1230 - | (_) |@
 21.1231 -  \___/ @
 21.1232 -        @@
 21.1233 -246  LATIN SMALL LETTER O WITH DIAERESIS
 21.1234 -  _   _ @
 21.1235 - (_)_(_)@
 21.1236 -  / _ \ @
 21.1237 - | (_) |@
 21.1238 -  \___/ @
 21.1239 -        @@
 21.1240 -247  DIVISION SIGN
 21.1241 -        @
 21.1242 -    _   @
 21.1243 -  _(_)_ @
 21.1244 - |_____|@
 21.1245 -   (_)  @
 21.1246 -        @@
 21.1247 -248  LATIN SMALL LETTER O WITH STROKE
 21.1248 -         @
 21.1249 -   ____  @
 21.1250 -  / _//\ @
 21.1251 - | (//) |@
 21.1252 -  \//__/ @
 21.1253 -         @@
 21.1254 -249  LATIN SMALL LETTER U WITH GRAVE
 21.1255 -   __   @
 21.1256 -  _\_\_ @
 21.1257 - | | | |@
 21.1258 - | |_| |@
 21.1259 -  \__,_|@
 21.1260 -        @@
 21.1261 -250  LATIN SMALL LETTER U WITH ACUTE
 21.1262 -    __  @
 21.1263 -  _/_/_ @
 21.1264 - | | | |@
 21.1265 - | |_| |@
 21.1266 -  \__,_|@
 21.1267 -        @@
 21.1268 -251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 21.1269 -   //\  @
 21.1270 -  |/ \| @
 21.1271 - | | | |@
 21.1272 - | |_| |@
 21.1273 -  \__,_|@
 21.1274 -        @@
 21.1275 -252  LATIN SMALL LETTER U WITH DIAERESIS
 21.1276 -  _   _ @
 21.1277 - (_) (_)@
 21.1278 - | | | |@
 21.1279 - | |_| |@
 21.1280 -  \__,_|@
 21.1281 -        @@
 21.1282 -253  LATIN SMALL LETTER Y WITH ACUTE
 21.1283 -    __  @
 21.1284 -  _/_/_ @
 21.1285 - | | | |@
 21.1286 - | |_| |@
 21.1287 -  \__, |@
 21.1288 -  |___/ @@
 21.1289 -254  LATIN SMALL LETTER THORN
 21.1290 -  _     @
 21.1291 - | |__  @
 21.1292 - | '_ \ @
 21.1293 - | |_) |@
 21.1294 - | .__/ @
 21.1295 - |_|    @@
 21.1296 -255  LATIN SMALL LETTER Y WITH DIAERESIS
 21.1297 -  _   _ @
 21.1298 - (_) (_)@
 21.1299 - | | | |@
 21.1300 - | |_| |@
 21.1301 -  \__, |@
 21.1302 -  |___/ @@
 21.1303 -0x0100  LATIN CAPITAL LETTER A WITH MACRON
 21.1304 -   ____ @
 21.1305 -  /___/ @
 21.1306 -   /_\  @
 21.1307 -  / _ \ @
 21.1308 - /_/ \_\@
 21.1309 -        @@
 21.1310 -0x0101  LATIN SMALL LETTER A WITH MACRON
 21.1311 -    ___ @
 21.1312 -   /_ _/@
 21.1313 -  / _` |@
 21.1314 - | (_| |@
 21.1315 -  \__,_|@
 21.1316 -        @@
 21.1317 -0x0102  LATIN CAPITAL LETTER A WITH BREVE
 21.1318 -  _   _ @
 21.1319 -  \\_// @
 21.1320 -   /_\  @
 21.1321 -  / _ \ @
 21.1322 - /_/ \_\@
 21.1323 -        @@
 21.1324 -0x0103  LATIN SMALL LETTER A WITH BREVE
 21.1325 -   \_/  @
 21.1326 -   ___  @
 21.1327 -  / _` |@
 21.1328 - | (_| |@
 21.1329 -  \__,_|@
 21.1330 -        @@
 21.1331 -0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 21.1332 -        @
 21.1333 -    _   @
 21.1334 -   /_\  @
 21.1335 -  / _ \ @
 21.1336 - /_/ \_\@
 21.1337 -     (_(@@
 21.1338 -0x0105  LATIN SMALL LETTER A WITH OGONEK
 21.1339 -        @
 21.1340 -   __ _ @
 21.1341 -  / _` |@
 21.1342 - | (_| |@
 21.1343 -  \__,_|@
 21.1344 -     (_(@@
 21.1345 -0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 21.1346 -     __ @
 21.1347 -   _/_/ @
 21.1348 -  / ___|@
 21.1349 - | |___ @
 21.1350 -  \____|@
 21.1351 -        @@
 21.1352 -0x0107  LATIN SMALL LETTER C WITH ACUTE
 21.1353 -    __ @
 21.1354 -   /__/@
 21.1355 -  / __|@
 21.1356 - | (__ @
 21.1357 -  \___|@
 21.1358 -       @@
 21.1359 -0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 21.1360 -     /\ @
 21.1361 -   _//\\@
 21.1362 -  / ___|@
 21.1363 - | |___ @
 21.1364 -  \____|@
 21.1365 -        @@
 21.1366 -0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 21.1367 -    /\ @
 21.1368 -   /_\ @
 21.1369 -  / __|@
 21.1370 - | (__ @
 21.1371 -  \___|@
 21.1372 -       @@
 21.1373 -0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 21.1374 -    []  @
 21.1375 -   ____ @
 21.1376 -  / ___|@
 21.1377 - | |___ @
 21.1378 -  \____|@
 21.1379 -        @@
 21.1380 -0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 21.1381 -   []  @
 21.1382 -   ___ @
 21.1383 -  / __|@
 21.1384 - | (__ @
 21.1385 -  \___|@
 21.1386 -       @@
 21.1387 -0x010C  LATIN CAPITAL LETTER C WITH CARON
 21.1388 -   \\// @
 21.1389 -   _\/_ @
 21.1390 -  / ___|@
 21.1391 - | |___ @
 21.1392 -  \____|@
 21.1393 -        @@
 21.1394 -0x010D  LATIN SMALL LETTER C WITH CARON
 21.1395 -   \\//@
 21.1396 -   _\/ @
 21.1397 -  / __|@
 21.1398 - | (__ @
 21.1399 -  \___|@
 21.1400 -       @@
 21.1401 -0x010E  LATIN CAPITAL LETTER D WITH CARON
 21.1402 -   \\// @
 21.1403 -  __\/  @
 21.1404 - |  _ \ @
 21.1405 - | |_| |@
 21.1406 - |____/ @
 21.1407 -        @@
 21.1408 -0x010F  LATIN SMALL LETTER D WITH CARON
 21.1409 -  \/  _ @
 21.1410 -   __| |@
 21.1411 -  / _` |@
 21.1412 - | (_| |@
 21.1413 -  \__,_|@
 21.1414 -        @@
 21.1415 -0x0110  LATIN CAPITAL LETTER D WITH STROKE
 21.1416 -   ____   @
 21.1417 -  |_ __ \ @
 21.1418 - /| |/ | |@
 21.1419 - /|_|/_| |@
 21.1420 -  |_____/ @
 21.1421 -          @@
 21.1422 -0x0111  LATIN SMALL LETTER D WITH STROKE
 21.1423 -    ---|@
 21.1424 -   __| |@
 21.1425 -  / _` |@
 21.1426 - | (_| |@
 21.1427 -  \__,_|@
 21.1428 -        @@
 21.1429 -0x0112  LATIN CAPITAL LETTER E WITH MACRON
 21.1430 -   ____ @
 21.1431 -  /___/ @
 21.1432 - | ____|@
 21.1433 - |  _|_ @
 21.1434 - |_____|@
 21.1435 -        @@
 21.1436 -0x0113  LATIN SMALL LETTER E WITH MACRON
 21.1437 -    ____@
 21.1438 -   /_ _/@
 21.1439 -  / _ \ @
 21.1440 - |  __/ @
 21.1441 -  \___| @
 21.1442 -        @@
 21.1443 -0x0114  LATIN CAPITAL LETTER E WITH BREVE
 21.1444 -  _   _ @
 21.1445 -  \\_// @
 21.1446 - | ____|@
 21.1447 - |  _|_ @
 21.1448 - |_____|@
 21.1449 -        @@
 21.1450 -0x0115  LATIN SMALL LETTER E WITH BREVE
 21.1451 -  \\  //@
 21.1452 -    --  @
 21.1453 -  / _ \ @
 21.1454 - |  __/ @
 21.1455 -  \___| @
 21.1456 -        @@
 21.1457 -0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 21.1458 -    []  @
 21.1459 -  _____ @
 21.1460 - | ____|@
 21.1461 - |  _|_ @
 21.1462 - |_____|@
 21.1463 -        @@
 21.1464 -0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 21.1465 -    [] @
 21.1466 -    __ @
 21.1467 -  / _ \@
 21.1468 - |  __/@
 21.1469 -  \___|@
 21.1470 -       @@
 21.1471 -0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 21.1472 -        @
 21.1473 -  _____ @
 21.1474 - | ____|@
 21.1475 - |  _|_ @
 21.1476 - |_____|@
 21.1477 -    (__(@@
 21.1478 -0x0119  LATIN SMALL LETTER E WITH OGONEK
 21.1479 -       @
 21.1480 -   ___ @
 21.1481 -  / _ \@
 21.1482 - |  __/@
 21.1483 -  \___|@
 21.1484 -    (_(@@
 21.1485 -0x011A  LATIN CAPITAL LETTER E WITH CARON
 21.1486 -   \\// @
 21.1487 -  __\/_ @
 21.1488 - | ____|@
 21.1489 - |  _|_ @
 21.1490 - |_____|@
 21.1491 -        @@
 21.1492 -0x011B  LATIN SMALL LETTER E WITH CARON
 21.1493 -   \\//@
 21.1494 -    \/ @
 21.1495 -  / _ \@
 21.1496 - |  __/@
 21.1497 -  \___|@
 21.1498 -       @@
 21.1499 -0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 21.1500 -   _/\_ @
 21.1501 -  / ___|@
 21.1502 - | |  _ @
 21.1503 - | |_| |@
 21.1504 -  \____|@
 21.1505 -        @@
 21.1506 -0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 21.1507 -     /\ @
 21.1508 -   _/_ \@
 21.1509 -  / _` |@
 21.1510 - | (_| |@
 21.1511 -  \__, |@
 21.1512 -  |___/ @@
 21.1513 -0x011E  LATIN CAPITAL LETTER G WITH BREVE
 21.1514 -   _\/_ @
 21.1515 -  / ___|@
 21.1516 - | |  _ @
 21.1517 - | |_| |@
 21.1518 -  \____|@
 21.1519 -        @@
 21.1520 -0x011F  LATIN SMALL LETTER G WITH BREVE
 21.1521 -  \___/ @
 21.1522 -   __ _ @
 21.1523 -  / _` |@
 21.1524 - | (_| |@
 21.1525 -  \__, |@
 21.1526 -  |___/ @@
 21.1527 -0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 21.1528 -   _[]_ @
 21.1529 -  / ___|@
 21.1530 - | |  _ @
 21.1531 - | |_| |@
 21.1532 -  \____|@
 21.1533 -        @@
 21.1534 -0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 21.1535 -   []   @
 21.1536 -   __ _ @
 21.1537 -  / _` |@
 21.1538 - | (_| |@
 21.1539 -  \__, |@
 21.1540 -  |___/ @@
 21.1541 -0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 21.1542 -   ____ @
 21.1543 -  / ___|@
 21.1544 - | |  _ @
 21.1545 - | |_| |@
 21.1546 -  \____|@
 21.1547 -   )__) @@
 21.1548 -0x0123  LATIN SMALL LETTER G WITH CEDILLA
 21.1549 -        @
 21.1550 -   __ _ @
 21.1551 -  / _` |@
 21.1552 - | (_| |@
 21.1553 -  \__, |@
 21.1554 -  |_))))@@
 21.1555 -0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 21.1556 -  _/ \_ @
 21.1557 - | / \ |@
 21.1558 - | |_| |@
 21.1559 - |  _  |@
 21.1560 - |_| |_|@
 21.1561 -        @@
 21.1562 -0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 21.1563 -  _  /\ @
 21.1564 - | |//\ @
 21.1565 - | '_ \ @
 21.1566 - | | | |@
 21.1567 - |_| |_|@
 21.1568 -        @@
 21.1569 -0x0126  LATIN CAPITAL LETTER H WITH STROKE
 21.1570 -  _   _ @
 21.1571 - | |=| |@
 21.1572 - | |_| |@
 21.1573 - |  _  |@
 21.1574 - |_| |_|@
 21.1575 -        @@
 21.1576 -0x0127  LATIN SMALL LETTER H WITH STROKE
 21.1577 -  _     @
 21.1578 - |=|__  @
 21.1579 - | '_ \ @
 21.1580 - | | | |@
 21.1581 - |_| |_|@
 21.1582 -        @@
 21.1583 -0x0128  LATIN CAPITAL LETTER I WITH TILDE
 21.1584 -  /\//@
 21.1585 - |_ _|@
 21.1586 -  | | @
 21.1587 -  | | @
 21.1588 - |___|@
 21.1589 -      @@
 21.1590 -0x0129  LATIN SMALL LETTER I WITH TILDE
 21.1591 -    @
 21.1592 - /\/@
 21.1593 - | |@
 21.1594 - | |@
 21.1595 - |_|@
 21.1596 -    @@
 21.1597 -0x012A  LATIN CAPITAL LETTER I WITH MACRON
 21.1598 - /___/@
 21.1599 - |_ _|@
 21.1600 -  | | @
 21.1601 -  | | @
 21.1602 - |___|@
 21.1603 -      @@
 21.1604 -0x012B  LATIN SMALL LETTER I WITH MACRON
 21.1605 -  ____@
 21.1606 - /___/@
 21.1607 -  | | @
 21.1608 -  | | @
 21.1609 -  |_| @
 21.1610 -      @@
 21.1611 -0x012C  LATIN CAPITAL LETTER I WITH BREVE
 21.1612 -  \__/@
 21.1613 - |_ _|@
 21.1614 -  | | @
 21.1615 -  | | @
 21.1616 - |___|@
 21.1617 -      @@
 21.1618 -0x012D  LATIN SMALL LETTER I WITH BREVE
 21.1619 -    @
 21.1620 - \_/@
 21.1621 - | |@
 21.1622 - | |@
 21.1623 - |_|@
 21.1624 -    @@
 21.1625 -0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 21.1626 -  ___ @
 21.1627 - |_ _|@
 21.1628 -  | | @
 21.1629 -  | | @
 21.1630 - |___|@
 21.1631 -  (__(@@
 21.1632 -0x012F  LATIN SMALL LETTER I WITH OGONEK
 21.1633 -  _  @
 21.1634 - (_) @
 21.1635 - | | @
 21.1636 - | | @
 21.1637 - |_|_@
 21.1638 -  (_(@@
 21.1639 -0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 21.1640 -  _[] @
 21.1641 - |_ _|@
 21.1642 -  | | @
 21.1643 -  | | @
 21.1644 - |___|@
 21.1645 -      @@
 21.1646 -0x0131  LATIN SMALL LETTER DOTLESS I
 21.1647 -    @
 21.1648 -  _ @
 21.1649 - | |@
 21.1650 - | |@
 21.1651 - |_|@
 21.1652 -    @@
 21.1653 -0x0132  LATIN CAPITAL LIGATURE IJ
 21.1654 -  ___  _ @
 21.1655 - |_ _|| |@
 21.1656 -  | | | |@
 21.1657 -  | |_| |@
 21.1658 - |__|__/ @
 21.1659 -         @@
 21.1660 -0x0133  LATIN SMALL LIGATURE IJ
 21.1661 -  _   _ @
 21.1662 - (_) (_)@
 21.1663 - | | | |@
 21.1664 - | | | |@
 21.1665 - |_|_/ |@
 21.1666 -   |__/ @@
 21.1667 -0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 21.1668 -      /\ @
 21.1669 -     /_\|@
 21.1670 -  _  | | @
 21.1671 - | |_| | @
 21.1672 -  \___/  @
 21.1673 -         @@
 21.1674 -0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 21.1675 -    /\@
 21.1676 -   /_\@
 21.1677 -   | |@
 21.1678 -   | |@
 21.1679 -  _/ |@
 21.1680 - |__/ @@
 21.1681 -0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 21.1682 -  _  _  @
 21.1683 - | |/ / @
 21.1684 - | ' /  @
 21.1685 - | . \  @
 21.1686 - |_|\_\ @
 21.1687 -    )__)@@
 21.1688 -0x0137  LATIN SMALL LETTER K WITH CEDILLA
 21.1689 -  _    @
 21.1690 - | | __@
 21.1691 - | |/ /@
 21.1692 - |   < @
 21.1693 - |_|\_\@
 21.1694 -    )_)@@
 21.1695 -0x0138  LATIN SMALL LETTER KRA
 21.1696 -       @
 21.1697 -  _ __ @
 21.1698 - | |/ \@
 21.1699 - |   < @
 21.1700 - |_|\_\@
 21.1701 -       @@
 21.1702 -0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 21.1703 -  _   //@
 21.1704 - | | // @
 21.1705 - | |    @
 21.1706 - | |___ @
 21.1707 - |_____|@
 21.1708 -        @@
 21.1709 -0x013A  LATIN SMALL LETTER L WITH ACUTE
 21.1710 -  //@
 21.1711 - | |@
 21.1712 - | |@
 21.1713 - | |@
 21.1714 - |_|@
 21.1715 -    @@
 21.1716 -0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 21.1717 -  _     @
 21.1718 - | |    @
 21.1719 - | |    @
 21.1720 - | |___ @
 21.1721 - |_____|@
 21.1722 -    )__)@@
 21.1723 -0x013C  LATIN SMALL LETTER L WITH CEDILLA
 21.1724 -  _   @
 21.1725 - | |  @
 21.1726 - | |  @
 21.1727 - | |  @
 21.1728 - |_|  @
 21.1729 -   )_)@@
 21.1730 -0x013D  LATIN CAPITAL LETTER L WITH CARON
 21.1731 -  _ \\//@
 21.1732 - | | \/ @
 21.1733 - | |    @
 21.1734 - | |___ @
 21.1735 - |_____|@
 21.1736 -        @@
 21.1737 -0x013E  LATIN SMALL LETTER L WITH CARON
 21.1738 -  _ \\//@
 21.1739 - | | \/ @
 21.1740 - | |    @
 21.1741 - | |    @
 21.1742 - |_|    @
 21.1743 -        @@
 21.1744 -0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 21.1745 -  _     @
 21.1746 - | |    @
 21.1747 - | | [] @
 21.1748 - | |___ @
 21.1749 - |_____|@
 21.1750 -        @@
 21.1751 -0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 21.1752 -  _    @
 21.1753 - | |   @
 21.1754 - | | []@
 21.1755 - | |   @
 21.1756 - |_|   @
 21.1757 -       @@
 21.1758 -0x0141  LATIN CAPITAL LETTER L WITH STROKE
 21.1759 -  __    @
 21.1760 - | //   @
 21.1761 - |//|   @
 21.1762 - // |__ @
 21.1763 - |_____|@
 21.1764 -        @@
 21.1765 -0x0142  LATIN SMALL LETTER L WITH STROKE
 21.1766 -  _ @
 21.1767 - | |@
 21.1768 - |//@
 21.1769 - //|@
 21.1770 - |_|@
 21.1771 -    @@
 21.1772 -0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 21.1773 -  _/ /_ @
 21.1774 - | \ | |@
 21.1775 - |  \| |@
 21.1776 - | |\  |@
 21.1777 - |_| \_|@
 21.1778 -        @@
 21.1779 -0x0144  LATIN SMALL LETTER N WITH ACUTE
 21.1780 -     _  @
 21.1781 -  _ /_/ @
 21.1782 - | '_ \ @
 21.1783 - | | | |@
 21.1784 - |_| |_|@
 21.1785 -        @@
 21.1786 -0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 21.1787 -  _   _ @
 21.1788 - | \ | |@
 21.1789 - |  \| |@
 21.1790 - | |\  |@
 21.1791 - |_| \_|@
 21.1792 - )_)    @@
 21.1793 -0x0146  LATIN SMALL LETTER N WITH CEDILLA
 21.1794 -        @
 21.1795 -  _ __  @
 21.1796 - | '_ \ @
 21.1797 - | | | |@
 21.1798 - |_| |_|@
 21.1799 - )_)    @@
 21.1800 -0x0147  LATIN CAPITAL LETTER N WITH CARON
 21.1801 -  _\/ _ @
 21.1802 - | \ | |@
 21.1803 - |  \| |@
 21.1804 - | |\  |@
 21.1805 - |_| \_|@
 21.1806 -        @@
 21.1807 -0x0148  LATIN SMALL LETTER N WITH CARON
 21.1808 -  \\//  @
 21.1809 -  _\/_  @
 21.1810 - | '_ \ @
 21.1811 - | | | |@
 21.1812 - |_| |_|@
 21.1813 -        @@
 21.1814 -0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 21.1815 -          @
 21.1816 -  _  __   @
 21.1817 - ( )| '_\ @
 21.1818 - |/| | | |@
 21.1819 -   |_| |_|@
 21.1820 -          @@
 21.1821 -0x014A  LATIN CAPITAL LETTER ENG
 21.1822 -  _   _ @
 21.1823 - | \ | |@
 21.1824 - |  \| |@
 21.1825 - | |\  |@
 21.1826 - |_| \ |@
 21.1827 -     )_)@@
 21.1828 -0x014B  LATIN SMALL LETTER ENG
 21.1829 -  _ __  @
 21.1830 - | '_ \ @
 21.1831 - | | | |@
 21.1832 - |_| | |@
 21.1833 -     | |@
 21.1834 -    |__ @@
 21.1835 -0x014C  LATIN CAPITAL LETTER O WITH MACRON
 21.1836 -   ____ @
 21.1837 -  /_ _/ @
 21.1838 -  / _ \ @
 21.1839 - | (_) |@
 21.1840 -  \___/ @
 21.1841 -        @@
 21.1842 -0x014D  LATIN SMALL LETTER O WITH MACRON
 21.1843 -   ____ @
 21.1844 -  /_ _/ @
 21.1845 -  / _ \ @
 21.1846 - | (_) |@
 21.1847 -  \___/ @
 21.1848 -        @@
 21.1849 -0x014E  LATIN CAPITAL LETTER O WITH BREVE
 21.1850 -  \   / @
 21.1851 -   _-_  @
 21.1852 -  / _ \ @
 21.1853 - | |_| |@
 21.1854 -  \___/ @
 21.1855 -        @@
 21.1856 -0x014F  LATIN SMALL LETTER O WITH BREVE
 21.1857 -  \   / @
 21.1858 -   _-_  @
 21.1859 -  / _ \ @
 21.1860 - | |_| |@
 21.1861 -  \___/ @
 21.1862 -        @@
 21.1863 -0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 21.1864 -    ___ @
 21.1865 -   /_/_/@
 21.1866 -  / _ \ @
 21.1867 - | |_| |@
 21.1868 -  \___/ @
 21.1869 -        @@
 21.1870 -0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 21.1871 -    ___ @
 21.1872 -   /_/_/@
 21.1873 -  / _ \ @
 21.1874 - | |_| |@
 21.1875 -  \___/ @
 21.1876 -        @@
 21.1877 -0x0152  LATIN CAPITAL LIGATURE OE
 21.1878 -   ___  ___ @
 21.1879 -  / _ \| __|@
 21.1880 - | | | |  | @
 21.1881 - | |_| | |__@
 21.1882 -  \___/|____@
 21.1883 -            @@
 21.1884 -0x0153  LATIN SMALL LIGATURE OE
 21.1885 -             @
 21.1886 -   ___   ___ @
 21.1887 -  / _ \ / _ \@
 21.1888 - | (_) |  __/@
 21.1889 -  \___/ \___|@
 21.1890 -             @@
 21.1891 -0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 21.1892 -  _/_/  @
 21.1893 - |  _ \ @
 21.1894 - | |_) |@
 21.1895 - |  _ < @
 21.1896 - |_| \_\@
 21.1897 -        @@
 21.1898 -0x0155  LATIN SMALL LETTER R WITH ACUTE
 21.1899 -     __@
 21.1900 -  _ /_/@
 21.1901 - | '__|@
 21.1902 - | |   @
 21.1903 - |_|   @
 21.1904 -       @@
 21.1905 -0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 21.1906 -  ____  @
 21.1907 - |  _ \ @
 21.1908 - | |_) |@
 21.1909 - |  _ < @
 21.1910 - |_| \_\@
 21.1911 - )_)    @@
 21.1912 -0x0157  LATIN SMALL LETTER R WITH CEDILLA
 21.1913 -       @
 21.1914 -  _ __ @
 21.1915 - | '__|@
 21.1916 - | |   @
 21.1917 - |_|   @
 21.1918 -   )_) @@
 21.1919 -0x0158  LATIN CAPITAL LETTER R WITH CARON
 21.1920 -  _\_/  @
 21.1921 - |  _ \ @
 21.1922 - | |_) |@
 21.1923 - |  _ < @
 21.1924 - |_| \_\@
 21.1925 -        @@
 21.1926 -0x0159  LATIN SMALL LETTER R WITH CARON
 21.1927 -  \\// @
 21.1928 -  _\/_ @
 21.1929 - | '__|@
 21.1930 - | |   @
 21.1931 - |_|   @
 21.1932 -       @@
 21.1933 -0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 21.1934 -  _/_/  @
 21.1935 - / ___| @
 21.1936 - \___ \ @
 21.1937 -  ___) |@
 21.1938 - |____/ @
 21.1939 -        @@
 21.1940 -0x015B  LATIN SMALL LETTER S WITH ACUTE
 21.1941 -    __@
 21.1942 -  _/_/@
 21.1943 - / __|@
 21.1944 - \__ \@
 21.1945 - |___/@
 21.1946 -      @@
 21.1947 -0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 21.1948 -  _/\_  @
 21.1949 - / ___| @
 21.1950 - \___ \ @
 21.1951 -  ___) |@
 21.1952 - |____/ @
 21.1953 -        @@
 21.1954 -0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 21.1955 -      @
 21.1956 -  /_\_@
 21.1957 - / __|@
 21.1958 - \__ \@
 21.1959 - |___/@
 21.1960 -      @@
 21.1961 -0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 21.1962 -  ____  @
 21.1963 - / ___| @
 21.1964 - \___ \ @
 21.1965 -  ___) |@
 21.1966 - |____/ @
 21.1967 -    )__)@@
 21.1968 -0x015F  LATIN SMALL LETTER S WITH CEDILLA
 21.1969 -      @
 21.1970 -  ___ @
 21.1971 - / __|@
 21.1972 - \__ \@
 21.1973 - |___/@
 21.1974 -   )_)@@
 21.1975 -0x0160  LATIN CAPITAL LETTER S WITH CARON
 21.1976 -  _\_/  @
 21.1977 - / ___| @
 21.1978 - \___ \ @
 21.1979 -  ___) |@
 21.1980 - |____/ @
 21.1981 -        @@
 21.1982 -0x0161  LATIN SMALL LETTER S WITH CARON
 21.1983 -  \\//@
 21.1984 -  _\/ @
 21.1985 - / __|@
 21.1986 - \__ \@
 21.1987 - |___/@
 21.1988 -      @@
 21.1989 -0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 21.1990 -  _____ @
 21.1991 - |_   _|@
 21.1992 -   | |  @
 21.1993 -   | |  @
 21.1994 -   |_|  @
 21.1995 -    )__)@@
 21.1996 -0x0163  LATIN SMALL LETTER T WITH CEDILLA
 21.1997 -  _   @
 21.1998 - | |_ @
 21.1999 - | __|@
 21.2000 - | |_ @
 21.2001 -  \__|@
 21.2002 -   )_)@@
 21.2003 -0x0164  LATIN CAPITAL LETTER T WITH CARON
 21.2004 -  _____ @
 21.2005 - |_   _|@
 21.2006 -   | |  @
 21.2007 -   | |  @
 21.2008 -   |_|  @
 21.2009 -        @@
 21.2010 -0x0165  LATIN SMALL LETTER T WITH CARON
 21.2011 -  \/  @
 21.2012 - | |_ @
 21.2013 - | __|@
 21.2014 - | |_ @
 21.2015 -  \__|@
 21.2016 -      @@
 21.2017 -0x0166  LATIN CAPITAL LETTER T WITH STROKE
 21.2018 -  _____ @
 21.2019 - |_   _|@
 21.2020 -   | |  @
 21.2021 -  -|-|- @
 21.2022 -   |_|  @
 21.2023 -        @@
 21.2024 -0x0167  LATIN SMALL LETTER T WITH STROKE
 21.2025 -  _   @
 21.2026 - | |_ @
 21.2027 - | __|@
 21.2028 - |-|_ @
 21.2029 -  \__|@
 21.2030 -      @@
 21.2031 -0x0168  LATIN CAPITAL LETTER U WITH TILDE
 21.2032 -        @
 21.2033 -  _/\/_ @
 21.2034 - | | | |@
 21.2035 - | |_| |@
 21.2036 -  \___/ @
 21.2037 -        @@
 21.2038 -0x0169  LATIN SMALL LETTER U WITH TILDE
 21.2039 -        @
 21.2040 -  _/\/_ @
 21.2041 - | | | |@
 21.2042 - | |_| |@
 21.2043 -  \__,_|@
 21.2044 -        @@
 21.2045 -0x016A  LATIN CAPITAL LETTER U WITH MACRON
 21.2046 -   ____ @
 21.2047 -  /__ _/@
 21.2048 - | | | |@
 21.2049 - | |_| |@
 21.2050 -  \___/ @
 21.2051 -        @@
 21.2052 -0x016B  LATIN SMALL LETTER U WITH MACRON
 21.2053 -   ____ @
 21.2054 -  / _  /@
 21.2055 - | | | |@
 21.2056 - | |_| |@
 21.2057 -  \__,_|@
 21.2058 -        @@
 21.2059 -0x016C  LATIN CAPITAL LETTER U WITH BREVE
 21.2060 -        @
 21.2061 -   \_/_ @
 21.2062 - | | | |@
 21.2063 - | |_| |@
 21.2064 -  \____|@
 21.2065 -        @@
 21.2066 -0x016D  LATIN SMALL LETTER U WITH BREVE
 21.2067 -        @
 21.2068 -   \_/_ @
 21.2069 - | | | |@
 21.2070 - | |_| |@
 21.2071 -  \__,_|@
 21.2072 -        @@
 21.2073 -0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 21.2074 -    O   @
 21.2075 -  __  _ @
 21.2076 - | | | |@
 21.2077 - | |_| |@
 21.2078 -  \___/ @
 21.2079 -        @@
 21.2080 -0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 21.2081 -    O   @
 21.2082 -  __ __ @
 21.2083 - | | | |@
 21.2084 - | |_| |@
 21.2085 -  \__,_|@
 21.2086 -        @@
 21.2087 -0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 21.2088 -   -- --@
 21.2089 -  /_//_/@
 21.2090 - | | | |@
 21.2091 - | |_| |@
 21.2092 -  \___/ @
 21.2093 -        @@
 21.2094 -0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 21.2095 -    ____@
 21.2096 -  _/_/_/@
 21.2097 - | | | |@
 21.2098 - | |_| |@
 21.2099 -  \__,_|@
 21.2100 -        @@
 21.2101 -0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 21.2102 -  _   _ @
 21.2103 - | | | |@
 21.2104 - | | | |@
 21.2105 - | |_| |@
 21.2106 -  \___/ @
 21.2107 -    (__(@@
 21.2108 -0x0173  LATIN SMALL LETTER U WITH OGONEK
 21.2109 -        @
 21.2110 -  _   _ @
 21.2111 - | | | |@
 21.2112 - | |_| |@
 21.2113 -  \__,_|@
 21.2114 -     (_(@@
 21.2115 -0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 21.2116 - __    /\  __@
 21.2117 - \ \  //\\/ /@
 21.2118 -  \ \ /\ / / @
 21.2119 -   \ V  V /  @
 21.2120 -    \_/\_/   @
 21.2121 -             @@
 21.2122 -0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 21.2123 -      /\   @
 21.2124 - __  //\\__@
 21.2125 - \ \ /\ / /@
 21.2126 -  \ V  V / @
 21.2127 -   \_/\_/  @
 21.2128 -           @@
 21.2129 -0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 21.2130 -    /\  @
 21.2131 - __//\\ @
 21.2132 - \ \ / /@
 21.2133 -  \ V / @
 21.2134 -   |_|  @
 21.2135 -        @@
 21.2136 -0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 21.2137 -    /\  @
 21.2138 -   //\\ @
 21.2139 - | | | |@
 21.2140 - | |_| |@
 21.2141 -  \__, |@
 21.2142 -  |___/ @@
 21.2143 -0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 21.2144 -  []  []@
 21.2145 - __    _@
 21.2146 - \ \ / /@
 21.2147 -  \ V / @
 21.2148 -   |_|  @
 21.2149 -        @@
 21.2150 -0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 21.2151 -  __/_/@
 21.2152 - |__  /@
 21.2153 -   / / @
 21.2154 -  / /_ @
 21.2155 - /____|@
 21.2156 -       @@
 21.2157 -0x017A  LATIN SMALL LETTER Z WITH ACUTE
 21.2158 -    _ @
 21.2159 -  _/_/@
 21.2160 - |_  /@
 21.2161 -  / / @
 21.2162 - /___|@
 21.2163 -      @@
 21.2164 -0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 21.2165 -  __[]_@
 21.2166 - |__  /@
 21.2167 -   / / @
 21.2168 -  / /_ @
 21.2169 - /____|@
 21.2170 -       @@
 21.2171 -0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 21.2172 -   [] @
 21.2173 -  ____@
 21.2174 - |_  /@
 21.2175 -  / / @
 21.2176 - /___|@
 21.2177 -      @@
 21.2178 -0x017D  LATIN CAPITAL LETTER Z WITH CARON
 21.2179 -  _\_/_@
 21.2180 - |__  /@
 21.2181 -   / / @
 21.2182 -  / /_ @
 21.2183 - /____|@
 21.2184 -       @@
 21.2185 -0x017E  LATIN SMALL LETTER Z WITH CARON
 21.2186 -  \\//@
 21.2187 -  _\/_@
 21.2188 - |_  /@
 21.2189 -  / / @
 21.2190 - /___|@
 21.2191 -      @@
 21.2192 -0x017F  LATIN SMALL LETTER LONG S
 21.2193 -     __ @
 21.2194 -    / _|@
 21.2195 - |-| |  @
 21.2196 - |-| |  @
 21.2197 -   |_|  @
 21.2198 -        @@
 21.2199 -0x02C7  CARON
 21.2200 - \\//@
 21.2201 -  \/ @
 21.2202 -    $@
 21.2203 -    $@
 21.2204 -    $@
 21.2205 -    $@@
 21.2206 -0x02D8  BREVE
 21.2207 - \\_//@
 21.2208 -  \_/ @
 21.2209 -     $@
 21.2210 -     $@
 21.2211 -     $@
 21.2212 -     $@@
 21.2213 -0x02D9  DOT ABOVE
 21.2214 - []@
 21.2215 -  $@
 21.2216 -  $@
 21.2217 -  $@
 21.2218 -  $@
 21.2219 -  $@@
 21.2220 -0x02DB  OGONEK
 21.2221 -    $@
 21.2222 -    $@
 21.2223 -    $@
 21.2224 -    $@
 21.2225 -    $@
 21.2226 - )_) @@
 21.2227 -0x02DD  DOUBLE ACUTE ACCENT
 21.2228 -  _ _ @
 21.2229 - /_/_/@
 21.2230 -     $@
 21.2231 -     $@
 21.2232 -     $@
 21.2233 -     $@@
    22.1 --- a/xen/include/xen/init.h	Mon Dec 27 13:35:05 2004 +0000
    22.2 +++ b/xen/include/xen/init.h	Wed Dec 29 14:42:47 2004 +0000
    22.3 @@ -38,8 +38,6 @@
    22.4   * Also note, that this data cannot be "const".
    22.5   */
    22.6  
    22.7 -#ifndef MODULE
    22.8 -
    22.9  #ifndef __ASSEMBLY__
   22.10  
   22.11  /*
   22.12 @@ -50,99 +48,64 @@ typedef void (*exitcall_t)(void);
   22.13  
   22.14  extern initcall_t __initcall_start, __initcall_end;
   22.15  
   22.16 -#define __initcall(fn)								\
   22.17 -	static initcall_t __initcall_##fn __init_call = fn
   22.18 -#define __exitcall(fn)								\
   22.19 -	static exitcall_t __exitcall_##fn __exit_call = fn
   22.20 +#define __initcall(fn) \
   22.21 +    static initcall_t __initcall_##fn __init_call = fn
   22.22 +#define __exitcall(fn) \
   22.23 +    static exitcall_t __exitcall_##fn __exit_call = fn
   22.24  
   22.25  /*
   22.26   * Used for kernel command line parameter setup
   22.27   */
   22.28  struct kernel_param {
   22.29 -	const char *str;
   22.30 -	int (*setup_func)(char *);
   22.31 +    const char *name;
   22.32 +    enum { OPT_STR, OPT_UINT, OPT_BOOL } type;
   22.33 +    void *var;
   22.34 +    unsigned int len;
   22.35  };
   22.36  
   22.37  extern struct kernel_param __setup_start, __setup_end;
   22.38  
   22.39 -#define __setup(str, fn)								\
   22.40 -	static char __setup_str_##fn[] __initdata = str;				\
   22.41 -	static struct kernel_param __setup_##fn __attribute_used__ __initsetup = { __setup_str_##fn, fn }
   22.42 +#define boolean_param(_name, _var) \
   22.43 +    static char __setup_str_##_var[] __initdata = _name; \
   22.44 +    static struct kernel_param __setup_##_var __attribute_used__ \
   22.45 +        __initsetup = { __setup_str_##_var, OPT_BOOL, &_var, sizeof(_var) }
   22.46 +#define integer_param(_name, _var) \
   22.47 +    static char __setup_str_##_var[] __initdata = _name; \
   22.48 +    static struct kernel_param __setup_##_var __attribute_used__ \
   22.49 +        __initsetup = { __setup_str_##_var, OPT_UINT, &_var, sizeof(_var) }
   22.50 +#define string_param(_name, _var) \
   22.51 +    static char __setup_str_##_var[] __initdata = _name; \
   22.52 +    static struct kernel_param __setup_##_var __attribute_used__ \
   22.53 +        __initsetup = { __setup_str_##_var, OPT_STR, &_var, sizeof(_var) }
   22.54  
   22.55 +#define __setup(_name, _fn)
   22.56 +    
   22.57  #endif /* __ASSEMBLY__ */
   22.58  
   22.59  /*
   22.60   * Mark functions and data as being only used at initialization
   22.61   * or exit time.
   22.62   */
   22.63 -#define __init		__attribute__ ((__section__ (".text.init")))
   22.64 -#define __exit		__attribute_used__ __attribute__ ((__section__(".text.exit")))
   22.65 -#define __initdata	__attribute__ ((__section__ (".data.init")))
   22.66 -#define __exitdata	__attribute_used__ __attribute__ ((__section__ (".data.exit")))
   22.67 -#define __initsetup	__attribute_used__ __attribute__ ((__section__ (".setup.init")))
   22.68 -#define __init_call	__attribute_used__ __attribute__ ((__section__ (".initcall.init")))
   22.69 -#define __exit_call	__attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
   22.70 +#define __init       \
   22.71 +    __attribute__ ((__section__ (".text.init")))
   22.72 +#define __exit       \
   22.73 +    __attribute_used__ __attribute__ ((__section__(".text.exit")))
   22.74 +#define __initdata   \
   22.75 +    __attribute__ ((__section__ (".data.init")))
   22.76 +#define __exitdata   \
   22.77 +    __attribute_used__ __attribute__ ((__section__ (".data.exit")))
   22.78 +#define __initsetup  \
   22.79 +    __attribute_used__ __attribute__ ((__section__ (".setup.init")))
   22.80 +#define __init_call  \
   22.81 +    __attribute_used__ __attribute__ ((__section__ (".initcall.init")))
   22.82 +#define __exit_call  \
   22.83 +    __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
   22.84  
   22.85  /* For assembly routines */
   22.86  #define __INIT		.section	".text.init","ax"
   22.87  #define __FINIT		.previous
   22.88  #define __INITDATA	.section	".data.init","aw"
   22.89  
   22.90 -/**
   22.91 - * module_init() - driver initialization entry point
   22.92 - * @x: function to be run at kernel boot time or module insertion
   22.93 - * 
   22.94 - * module_init() will add the driver initialization routine in
   22.95 - * the "__initcall.int" code segment if the driver is checked as
   22.96 - * "y" or static, or else it will wrap the driver initialization
   22.97 - * routine with init_module() which is used by insmod and
   22.98 - * modprobe when the driver is used as a module.
   22.99 - */
  22.100 -#define module_init(x)	__initcall(x);
  22.101 -
  22.102 -/**
  22.103 - * module_exit() - driver exit entry point
  22.104 - * @x: function to be run when driver is removed
  22.105 - * 
  22.106 - * module_exit() will wrap the driver clean-up code
  22.107 - * with cleanup_module() when used with rmmod when
  22.108 - * the driver is a module.  If the driver is statically
  22.109 - * compiled into the kernel, module_exit() has no effect.
  22.110 - */
  22.111 -#define module_exit(x)	__exitcall(x);
  22.112 -
  22.113 -#else
  22.114 -
  22.115 -#define __init
  22.116 -#define __exit
  22.117 -#define __initdata
  22.118 -#define __exitdata
  22.119 -#define __initcall(fn)
  22.120 -/* For assembly routines */
  22.121 -#define __INIT
  22.122 -#define __FINIT
  22.123 -#define __INITDATA
  22.124 -
  22.125 -/* These macros create a dummy inline: gcc 2.9x does not count alias
  22.126 - as usage, hence the `unused function' warning when __init functions
  22.127 - are declared static. We use the dummy __*_module_inline functions
  22.128 - both to kill the warning and check the type of the init/cleanup
  22.129 - function. */
  22.130 -typedef int (*__init_module_func_t)(void);
  22.131 -typedef void (*__cleanup_module_func_t)(void);
  22.132 -#define module_init(x) \
  22.133 -	int init_module(void) __attribute__((alias(#x))); \
  22.134 -	static inline __init_module_func_t __init_module_inline(void) \
  22.135 -	{ return x; }
  22.136 -#define module_exit(x) \
  22.137 -	void cleanup_module(void) __attribute__((alias(#x))); \
  22.138 -	static inline __cleanup_module_func_t __cleanup_module_inline(void) \
  22.139 -	{ return x; }
  22.140 -
  22.141 -#define __setup(str,func) /* nothing */
  22.142 -
  22.143 -#endif
  22.144 -
  22.145  #ifdef CONFIG_HOTPLUG
  22.146  #define __devinit
  22.147  #define __devinitdata
  22.148 @@ -155,16 +118,4 @@ typedef void (*__cleanup_module_func_t)(
  22.149  #define __devexitdata __exitdata
  22.150  #endif
  22.151  
  22.152 -/* Functions marked as __devexit may be discarded at kernel link time, depending
  22.153 -   on config options.  Newer versions of binutils detect references from
  22.154 -   retained sections to discarded sections and flag an error.  Pointers to
  22.155 -   __devexit functions must use __devexit_p(function_name), the wrapper will
  22.156 -   insert either the function_name or NULL, depending on the config options.
  22.157 - */
  22.158 -#if defined(MODULE) || defined(CONFIG_HOTPLUG)
  22.159 -#define __devexit_p(x) x
  22.160 -#else
  22.161 -#define __devexit_p(x) NULL
  22.162 -#endif
  22.163 -
  22.164  #endif /* _LINUX_INIT_H */
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/xen/tools/Makefile	Wed Dec 29 14:42:47 2004 +0000
    23.3 @@ -0,0 +1,6 @@
    23.4 +
    23.5 +default:
    23.6 +	$(MAKE) -C figlet
    23.7 +
    23.8 +clean:
    23.9 +	$(MAKE) -C figlet clean
   23.10 \ No newline at end of file
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/xen/tools/figlet/LICENSE	Wed Dec 29 14:42:47 2004 +0000
    24.3 @@ -0,0 +1,111 @@
    24.4 +http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
    24.5 +
    24.6 +			 The "Artistic License"
    24.7 +
    24.8 +				Preamble
    24.9 +
   24.10 +The intent of this document is to state the conditions under which a
   24.11 +Package may be copied, such that the Copyright Holder maintains some
   24.12 +semblance of artistic control over the development of the package,
   24.13 +while giving the users of the package the right to use and distribute
   24.14 +the Package in a more-or-less customary fashion, plus the right to make
   24.15 +reasonable modifications.
   24.16 +
   24.17 +Definitions:
   24.18 +
   24.19 +	"Package" refers to the collection of files distributed by the
   24.20 +	Copyright Holder, and derivatives of that collection of files
   24.21 +	created through textual modification.
   24.22 +
   24.23 +	"Standard Version" refers to such a Package if it has not been
   24.24 +	modified, or has been modified in accordance with the wishes
   24.25 +	of the Copyright Holder.
   24.26 +
   24.27 +	"Copyright Holder" is whoever is named in the copyright or
   24.28 +	copyrights for the package.
   24.29 +
   24.30 +	"You" is you, if you're thinking about copying or distributing
   24.31 +	this Package.
   24.32 +
   24.33 +	"Reasonable copying fee" is whatever you can justify on the
   24.34 +	basis of media cost, duplication charges, time of people involved,
   24.35 +	and so on.  (You will not be required to justify it to the
   24.36 +	Copyright Holder, but only to the computing community at large
   24.37 +	as a market that must bear the fee.)
   24.38 +
   24.39 +	"Freely Available" means that no fee is charged for the item
   24.40 +	itself, though there may be fees involved in handling the item.
   24.41 +	It also means that recipients of the item may redistribute it
   24.42 +	under the same conditions they received it.
   24.43 +
   24.44 +1. You may make and give away verbatim copies of the source form of the
   24.45 +Standard Version of this Package without restriction, provided that you
   24.46 +duplicate all of the original copyright notices and associated disclaimers.
   24.47 +
   24.48 +2. You may apply bug fixes, portability fixes and other modifications
   24.49 +derived from the Public Domain or from the Copyright Holder.  A Package
   24.50 +modified in such a way shall still be considered the Standard Version.
   24.51 +
   24.52 +3. You may otherwise modify your copy of this Package in any way, provided
   24.53 +that you insert a prominent notice in each changed file stating how and
   24.54 +when you changed that file, and provided that you do at least ONE of the
   24.55 +following:
   24.56 +
   24.57 +    a) place your modifications in the Public Domain or otherwise make them
   24.58 +    Freely Available, such as by posting said modifications to Usenet or
   24.59 +    an equivalent medium, or placing the modifications on a major archive
   24.60 +    site such as ftp.uu.net, or by allowing the Copyright Holder to include
   24.61 +    your modifications in the Standard Version of the Package.
   24.62 +
   24.63 +    b) use the modified Package only within your corporation or organization.
   24.64 +
   24.65 +    c) rename any non-standard executables so the names do not conflict
   24.66 +    with standard executables, which must also be provided, and provide
   24.67 +    a separate manual page for each non-standard executable that clearly
   24.68 +    documents how it differs from the Standard Version.
   24.69 +
   24.70 +    d) make other distribution arrangements with the Copyright Holder.
   24.71 +
   24.72 +4. You may distribute the programs of this Package in object code or
   24.73 +executable form, provided that you do at least ONE of the following:
   24.74 +
   24.75 +    a) distribute a Standard Version of the executables and library files,
   24.76 +    together with instructions (in the manual page or equivalent) on where
   24.77 +    to get the Standard Version.
   24.78 +
   24.79 +    b) accompany the distribution with the machine-readable source of
   24.80 +    the Package with your modifications.
   24.81 +
   24.82 +    c) accompany any non-standard executables with their corresponding
   24.83 +    Standard Version executables, giving the non-standard executables
   24.84 +    non-standard names, and clearly documenting the differences in manual
   24.85 +    pages (or equivalent), together with instructions on where to get
   24.86 +    the Standard Version.
   24.87 +
   24.88 +    d) make other distribution arrangements with the Copyright Holder.
   24.89 +
   24.90 +5. You may charge a reasonable copying fee for any distribution of this
   24.91 +Package.  You may charge any fee you choose for support of this Package.
   24.92 +You may not charge a fee for this Package itself.  However,
   24.93 +you may distribute this Package in aggregate with other (possibly
   24.94 +commercial) programs as part of a larger (possibly commercial) software
   24.95 +distribution provided that you do not advertise this Package as a
   24.96 +product of your own.
   24.97 +
   24.98 +6. The scripts and library files supplied as input to or produced as
   24.99 +output from the programs of this Package do not automatically fall
  24.100 +under the copyright of this Package, but belong to whomever generated
  24.101 +them, and may be sold commercially, and may be aggregated with this
  24.102 +Package.
  24.103 +
  24.104 +7. C or perl subroutines supplied by you and linked into this Package
  24.105 +shall not be considered part of this Package.
  24.106 +
  24.107 +8. The name of the Copyright Holder may not be used to endorse or promote
  24.108 +products derived from this software without specific prior written permission.
  24.109 +
  24.110 +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  24.111 +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  24.112 +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  24.113 +
  24.114 +				The End
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/xen/tools/figlet/Makefile	Wed Dec 29 14:42:47 2004 +0000
    25.3 @@ -0,0 +1,8 @@
    25.4 +
    25.5 +CC := gcc
    25.6 +
    25.7 +figlet: figlet.c
    25.8 +	$(CC) -o $@ $<
    25.9 +
   25.10 +clean:
   25.11 +	rm -f *.o figlet
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/xen/tools/figlet/README	Wed Dec 29 14:42:47 2004 +0000
    26.3 @@ -0,0 +1,9 @@
    26.4 +
    26.5 +NB. This is a very hacked version of Figlet 2.2.1. 
    26.6 +
    26.7 +Don't use this outside the Xen build system. A proper version of Figlet
    26.8 +can be had from <http://www.figlet.org>.
    26.9 +
   26.10 +The distribution license is intact in the LICENSE file.
   26.11 +
   26.12 + -- Keir Fraser (2/5/2003)
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/xen/tools/figlet/figlet.c	Wed Dec 29 14:42:47 2004 +0000
    27.3 @@ -0,0 +1,2075 @@
    27.4 +
    27.5 +/*
    27.6 + * XXXXXXXXXXXXXXXXXXXXXXXXXXX
    27.7 + * 
    27.8 + * This is a HACKED figlet source file for Xen.
    27.9 + * 
   27.10 + * Hacked to output C octal strings for inclusion in a header file.
   27.11 + * Support for opening zipped files is removed.
   27.12 + * 
   27.13 + * Go to www.figlet.org for the unhacked Figlet sources.
   27.14 + */
   27.15 +
   27.16 +/****************************************************************************
   27.17 +
   27.18 +  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
   27.19 +  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
   27.20 +  FIGlet Copyright 2002 Christiaan Keet
   27.21 +  Portions written by Paul Burton and Christiaan Keet
   27.22 +  Internet: <info@figlet.org>
   27.23 +  FIGlet, along with the various FIGlet fonts and documentation, is
   27.24 +    copyrighted under the provisions of the Artistic License (as listed
   27.25 +    in the file "Artistic-license.txt" which is included in this package.
   27.26 +****************************************************************************/
   27.27 +
   27.28 +#define DATE "13 July 2002"
   27.29 +#define VERSION "2.2.1"
   27.30 +#define VERSION_INT 20201
   27.31 +
   27.32 +/* FIGlet (Frank, Ian & Glenn's Letters) */
   27.33 +/* by Glenn Chappell */
   27.34 +/* Apr 1991 */
   27.35 +/* Automatic file addition by Ian Chai May 1991 */
   27.36 +/* Punctuation and numbers addition by Ian Chai Jan 1993 */
   27.37 +/* Full ASCII by Glenn Chappell Feb 1993 */
   27.38 +/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
   27.39 +/* Hard blanks by Glenn Chappell Apr 1993 */
   27.40 +/* Release 2.0 5 Aug 1993 */
   27.41 +/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
   27.42 +/* Control files by Glenn Chappell Feb 1994 */
   27.43 +/* Release 2.1 12 Aug 1994 */
   27.44 +/* Release 2.1.1 25 Aug 1994 */
   27.45 +/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
   27.46 +   option.  Sept 8, 1996 */
   27.47 +/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
   27.48 +   mapping tables, kerning/smushing options. */
   27.49 +/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
   27.50 +   FAQs and comments. 13 July 2002. The new official FIGlet website is 
   27.51 +   http://www.figlet.org/  */
   27.52 +
   27.53 +#define DEFAULTFONTDIR "."
   27.54 +#define DEFAULTFONTFILE "xen.flf"
   27.55 +
   27.56 +#include <stdio.h>
   27.57 +#ifdef __STDC__
   27.58 +#include <stdlib.h>
   27.59 +#endif
   27.60 +#include <string.h>
   27.61 +#include <ctype.h>
   27.62 +#include <fcntl.h>     /* Needed for get_columns */
   27.63 +
   27.64 +#ifdef unix
   27.65 +#include <sys/ioctl.h> /* Needed for get_columns */
   27.66 +#endif
   27.67 +
   27.68 +
   27.69 +#define ZFILE FILE
   27.70 +#define Zopen fopen
   27.71 +#define Zgetc fgetc
   27.72 +#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
   27.73 +#define Zclose fclose
   27.74 +
   27.75 +#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
   27.76 +
   27.77 +#define DIRSEP '/'
   27.78 +#define DIRSEP2 '\\'
   27.79 +/* Leave alone for Unix and MS-DOS/Windows!
   27.80 +Note: '/' also used in filename in get_columns(). */
   27.81 +
   27.82 +#define FONTFILESUFFIX ".flf"
   27.83 +#define FONTFILEMAGICNUMBER "flf2"
   27.84 +#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
   27.85 +#define CONTROLFILESUFFIX ".flc"
   27.86 +#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
   27.87 +#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
   27.88 +#define DEFAULTCOLUMNS 80
   27.89 +
   27.90 +
   27.91 +/****************************************************************************
   27.92 +
   27.93 +  Globals dealing with chars that are read
   27.94 +
   27.95 +****************************************************************************/
   27.96 +
   27.97 +typedef long inchr; /* "char" read from stdin */
   27.98 +
   27.99 +inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
  27.100 +                   /* Note: not null-terminated. */
  27.101 +int inchrlinelen,inchrlinelenlimit;
  27.102 +inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
  27.103 +  /* Latin-1 codes for German letters, respectively:
  27.104 +     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
  27.105 +     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
  27.106 +     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
  27.107 +     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
  27.108 +     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
  27.109 +     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
  27.110 +     LATIN SMALL LETTER SHARP S = ess-zed
  27.111 +  */
  27.112 +
  27.113 +int hzmode;  /* true if reading double-bytes in HZ mode */
  27.114 +int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
  27.115 +inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
  27.116 +int gl; /* 0-3 specifies left-half Gn character set */
  27.117 +int gr; /* 0-3 specifies right-half Gn character set */
  27.118 +
  27.119 +int Myargc;  /* to avoid passing around argc and argv */
  27.120 +char **Myargv;
  27.121 +
  27.122 +/****************************************************************************
  27.123 +
  27.124 +  Globals dealing with chars that are written
  27.125 +
  27.126 +****************************************************************************/
  27.127 +
  27.128 +typedef struct fc {
  27.129 +  inchr ord;
  27.130 +  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  27.131 +  struct fc *next;
  27.132 +  } fcharnode;
  27.133 +
  27.134 +fcharnode *fcharlist;
  27.135 +char **currchar;
  27.136 +int currcharwidth;
  27.137 +int previouscharwidth;
  27.138 +char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
  27.139 +int outlinelen;
  27.140 +
  27.141 +
  27.142 +/****************************************************************************
  27.143 +
  27.144 +  Globals dealing with command file storage
  27.145 +
  27.146 +****************************************************************************/
  27.147 +
  27.148 +typedef struct cfn {
  27.149 +  char *thename;
  27.150 +  struct cfn *next;
  27.151 +  } cfnamenode;
  27.152 +
  27.153 +cfnamenode *cfilelist,**cfilelistend;
  27.154 +
  27.155 +typedef struct cm {
  27.156 +  int thecommand;
  27.157 +  inchr rangelo;
  27.158 +  inchr rangehi;
  27.159 +  inchr offset;
  27.160 +  struct cm *next;
  27.161 +  } comnode;
  27.162 +
  27.163 +comnode *commandlist,**commandlistend;
  27.164 +
  27.165 +/****************************************************************************
  27.166 +
  27.167 +  Globals affected by command line options
  27.168 +
  27.169 +****************************************************************************/
  27.170 +
  27.171 +int deutschflag,justification,paragraphflag,right2left,multibyte;
  27.172 +int cmdinput;
  27.173 +
  27.174 +#define SM_SMUSH 128
  27.175 +#define SM_KERN 64
  27.176 +#define SM_EQUAL 1
  27.177 +#define SM_LOWLINE 2
  27.178 +#define SM_HIERARCHY 4
  27.179 +#define SM_PAIR 8
  27.180 +#define SM_BIGX 16
  27.181 +#define SM_HARDBLANK 32
  27.182 +
  27.183 +int smushmode;
  27.184 +
  27.185 +#define SMO_NO 0     /* no command-line smushmode */
  27.186 +#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
  27.187 +#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
  27.188 +
  27.189 +int smushoverride;
  27.190 +
  27.191 +int outputwidth;
  27.192 +int outlinelenlimit;
  27.193 +char *fontdirname,*fontname;
  27.194 +
  27.195 +
  27.196 +/****************************************************************************
  27.197 +
  27.198 +  Globals read from font file
  27.199 +
  27.200 +****************************************************************************/
  27.201 +
  27.202 +char hardblank;
  27.203 +int charheight;
  27.204 +
  27.205 +
  27.206 +/****************************************************************************
  27.207 +
  27.208 +  Name of program, used in error messages
  27.209 +
  27.210 +****************************************************************************/
  27.211 +
  27.212 +char *myname;
  27.213 +
  27.214 +
  27.215 +#ifdef TIOCGWINSZ
  27.216 +/****************************************************************************
  27.217 +
  27.218 +  get_columns
  27.219 +
  27.220 +  Determines the number of columns of /dev/tty.  Returns the number of
  27.221 +  columns, or -1 if error.  May return 0 if columns unknown.
  27.222 +  Requires include files <fcntl.h> and <sys/ioctl.h>.
  27.223 +  by Glenn Chappell & Ian Chai 14 Apr 1993
  27.224 +
  27.225 +****************************************************************************/
  27.226 +
  27.227 +int get_columns()
  27.228 +{
  27.229 +  struct winsize ws;
  27.230 +  int fd,result;
  27.231 +
  27.232 +  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
  27.233 +  result = ioctl(fd,TIOCGWINSZ,&ws);
  27.234 +  close(fd);
  27.235 +  return result?-1:ws.ws_col;
  27.236 +}
  27.237 +#endif /* ifdef TIOCGWINSZ */
  27.238 +
  27.239 +
  27.240 +/****************************************************************************
  27.241 +
  27.242 +  myalloc
  27.243 +
  27.244 +  Calls malloc.  If malloc returns error, prints error message and
  27.245 +  quits.
  27.246 +
  27.247 +****************************************************************************/
  27.248 +
  27.249 +#ifdef __STDC__
  27.250 +char *myalloc(size_t size)
  27.251 +#else
  27.252 +char *myalloc(size)
  27.253 +int size;
  27.254 +#endif
  27.255 +{
  27.256 +  char *ptr;
  27.257 +#ifndef __STDC__
  27.258 +  extern void *malloc();
  27.259 +#endif
  27.260 +
  27.261 +  if ((ptr = (char*)malloc(size))==NULL) {
  27.262 +    fprintf(stderr,"%s: Out of memory\n",myname);
  27.263 +    exit(1);
  27.264 +    }
  27.265 +  else {
  27.266 +    return ptr;
  27.267 +    }
  27.268 +}
  27.269 +
  27.270 +
  27.271 +/****************************************************************************
  27.272 +
  27.273 +  hasdirsep
  27.274 +
  27.275 +  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
  27.276 +
  27.277 +****************************************************************************/
  27.278 +
  27.279 +int hasdirsep(s1)
  27.280 +char *s1;
  27.281 +{
  27.282 +  if (strchr(s1, DIRSEP)) return 1;
  27.283 +  else if (strchr(s1, DIRSEP2)) return 1;
  27.284 +  else return 0;
  27.285 +}
  27.286 +
  27.287 +/****************************************************************************
  27.288 +
  27.289 +  suffixcmp
  27.290 +
  27.291 +  Returns true if s2 is a suffix of s1; uses case-blind comparison.
  27.292 +
  27.293 +****************************************************************************/
  27.294 +
  27.295 +int suffixcmp(s1, s2)
  27.296 +char *s1;
  27.297 +char *s2;
  27.298 +{
  27.299 +  int len1, len2;
  27.300 +
  27.301 +  len1 = MYSTRLEN(s1);
  27.302 +  len2 = MYSTRLEN(s2);
  27.303 +  if (len2 > len1) return 0;
  27.304 +  s1 += len1 - len2;
  27.305 +  while (*s1) {
  27.306 +    if (tolower(*s1) != tolower(*s2)) return 0;
  27.307 +    s1++;
  27.308 +    s2++;
  27.309 +    }
  27.310 +  return 1;
  27.311 +}
  27.312 +   
  27.313 +/****************************************************************************
  27.314 +
  27.315 +  skiptoeol
  27.316 +
  27.317 +  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
  27.318 +
  27.319 +****************************************************************************/
  27.320 +
  27.321 +void skiptoeol(fp)
  27.322 +ZFILE *fp;
  27.323 +{
  27.324 +  int dummy;
  27.325 +
  27.326 +  while (dummy=Zgetc(fp),dummy!=EOF) {
  27.327 +    if (dummy == '\n') return;
  27.328 +    if (dummy == '\r') {
  27.329 +      dummy = Zgetc(fp);
  27.330 +      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
  27.331 +      return;
  27.332 +      }
  27.333 +  }
  27.334 +}
  27.335 +
  27.336 +
  27.337 +/****************************************************************************
  27.338 +
  27.339 +  myfgets
  27.340 +
  27.341 +  Local version of fgets.  Handles \r, \n, and \r\n terminators.
  27.342 +
  27.343 +****************************************************************************/
  27.344 +
  27.345 +char *myfgets(line,maxlen,fp)
  27.346 +char *line;
  27.347 +int maxlen;
  27.348 +ZFILE *fp;
  27.349 +{
  27.350 +  int c = 0;
  27.351 +  char *p;
  27.352 +
  27.353 +  p = line;
  27.354 +  while((c=Zgetc(fp))!=EOF&&maxlen) {
  27.355 +    *p++ = c;
  27.356 +    maxlen--;
  27.357 +    if (c=='\n') break;
  27.358 +    if (c=='\r') {
  27.359 +      c = Zgetc(fp);
  27.360 +      if (c != EOF && c != '\n') Zungetc(c,fp);
  27.361 +      *(p-1) = '\n';
  27.362 +      break;
  27.363 +      }
  27.364 +    }
  27.365 +  *p = 0;
  27.366 +  return (c==EOF) ? NULL : line;
  27.367 +}
  27.368 +
  27.369 +/****************************************************************************
  27.370 +
  27.371 +  usageerr
  27.372 +
  27.373 +  Prints "Usage: ...." line to the given stream.
  27.374 +
  27.375 +****************************************************************************/
  27.376 +
  27.377 +void printusage(out)
  27.378 +FILE *out;
  27.379 +{
  27.380 +  fprintf(out,
  27.381 +    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
  27.382 +    myname);
  27.383 +  fprintf(out,
  27.384 +    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
  27.385 +  fprintf(out,
  27.386 +    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
  27.387 +}
  27.388 +
  27.389 +
  27.390 +/****************************************************************************
  27.391 +
  27.392 +  printinfo
  27.393 +
  27.394 +  Prints version and copyright message, or utility information.
  27.395 +
  27.396 +****************************************************************************/
  27.397 +
  27.398 +void printinfo(infonum)
  27.399 +int infonum;
  27.400 +{
  27.401 +  switch (infonum) {
  27.402 +    case 0: /* Copyright message */
  27.403 +      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
  27.404 +      printf("John Cowan, Christiaan Keet\n");
  27.405 +      printf("Internet: <info@figlet.org> ");
  27.406 +      printf("Version: %s, date: %s\n\n",VERSION,DATE);
  27.407 +      printf("FIGlet, along with the various FIGlet fonts");
  27.408 +      printf(" and documentation, may be\n");
  27.409 +      printf("freely copied and distributed.\n\n");
  27.410 +      printf("If you use FIGlet, please send an");
  27.411 +      printf(" e-mail message to <info@figlet.org>.\n\n");
  27.412 +      printf("The latest version of FIGlet is available from the");
  27.413 +      printf(" web site,\n\thttp://www.figlet.org/\n\n");
  27.414 +      printusage(stdout);
  27.415 +      break;
  27.416 +    case 1: /* Version (integer) */
  27.417 +      printf("%d\n",VERSION_INT);
  27.418 +      break;
  27.419 +    case 2: /* Font directory */
  27.420 +      printf("%s\n",fontdirname);
  27.421 +      break;
  27.422 +    case 3: /* Font */
  27.423 +      printf("%s\n",fontname);
  27.424 +      break;
  27.425 +    case 4: /* Outputwidth */
  27.426 +      printf("%d\n",outputwidth);
  27.427 +    }
  27.428 +}
  27.429 +
  27.430 +
  27.431 +/****************************************************************************
  27.432 +
  27.433 +  readmagic
  27.434 +
  27.435 +  Reads a four-character magic string from a stream.
  27.436 +
  27.437 +****************************************************************************/
  27.438 +void readmagic(fp,magic)
  27.439 +ZFILE *fp;
  27.440 +char *magic;
  27.441 +{
  27.442 +  int i;
  27.443 +
  27.444 +  for (i=0;i<4;i++) {
  27.445 +    magic[i] = Zgetc(fp);
  27.446 +    }
  27.447 +  magic[4] = 0;
  27.448 +  }
  27.449 +  
  27.450 +/****************************************************************************
  27.451 +
  27.452 +  skipws
  27.453 +
  27.454 +  Skips whitespace characters from a stream.
  27.455 +
  27.456 +****************************************************************************/
  27.457 +void skipws(fp)
  27.458 +ZFILE *fp;
  27.459 +{
  27.460 +  int c;
  27.461 +  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
  27.462 +  Zungetc(c,fp);
  27.463 +  }
  27.464 +
  27.465 +/****************************************************************************
  27.466 +
  27.467 +  readnum
  27.468 +
  27.469 +  Reads a number from a stream.  Accepts "0" prefix for octal and
  27.470 +  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
  27.471 +
  27.472 +****************************************************************************/
  27.473 +void readnum(fp,nump)
  27.474 +ZFILE *fp;
  27.475 +inchr *nump;
  27.476 +{
  27.477 +  int acc = 0;
  27.478 +  char *p;
  27.479 +  int c;
  27.480 +  int base;
  27.481 +  int sign = 1;
  27.482 +  char digits[] = "0123456789ABCDEF";
  27.483 +
  27.484 +  skipws(fp);
  27.485 +  c = Zgetc(fp);
  27.486 +  if (c=='-') {
  27.487 +    sign = -1;
  27.488 +    }
  27.489 +  else {
  27.490 +    Zungetc(c,fp);
  27.491 +    }
  27.492 +  c = Zgetc(fp);
  27.493 +  if (c=='0') {
  27.494 +     c = Zgetc(fp);
  27.495 +     if (c=='x'||c=='X') {
  27.496 +       base = 16;
  27.497 +       }
  27.498 +     else {
  27.499 +       base = 8;
  27.500 +       Zungetc(c,fp);
  27.501 +       }
  27.502 +    }
  27.503 +  else {
  27.504 +    base = 10;
  27.505 +    Zungetc(c,fp);
  27.506 +    }
  27.507 +
  27.508 +  while((c=Zgetc(fp))!=EOF) {
  27.509 +    c=toupper(c);
  27.510 +    p=strchr(digits,c);
  27.511 +    if (!p) {
  27.512 +      Zungetc(c,fp);
  27.513 +      *nump = acc * sign;
  27.514 +      return;
  27.515 +      }
  27.516 +    acc = acc*base+(p-digits);
  27.517 +    }
  27.518 +  *nump = acc * sign;
  27.519 +  }  
  27.520 +
  27.521 +/****************************************************************************
  27.522 +
  27.523 +  readTchar
  27.524 +
  27.525 +  Reads a control file "T" command character specification.
  27.526 +
  27.527 +  Character is a single byte, an escape sequence, or
  27.528 +  an escaped numeric.
  27.529 +
  27.530 +****************************************************************************/
  27.531 +
  27.532 +inchr readTchar(fp)
  27.533 +ZFILE *fp;
  27.534 +{
  27.535 +  inchr thechar;
  27.536 +  char next;
  27.537 +
  27.538 +  thechar=Zgetc(fp);
  27.539 +  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
  27.540 +    Zungetc(thechar,fp);
  27.541 +    return '\0';
  27.542 +    }
  27.543 +  if (thechar!='\\') return thechar;
  27.544 +  next=Zgetc(fp);
  27.545 +  switch(next) {
  27.546 +    case 'a':
  27.547 +      return 7;
  27.548 +    case 'b':
  27.549 +      return 8;
  27.550 +    case 'e':
  27.551 +      return 27;
  27.552 +    case 'f':
  27.553 +      return 12;
  27.554 +    case 'n':
  27.555 +      return 10;
  27.556 +    case 'r':
  27.557 +      return 13;
  27.558 +    case 't':
  27.559 +      return 9;
  27.560 +    case 'v':
  27.561 +      return 11;
  27.562 +    default:
  27.563 +      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
  27.564 +        Zungetc(next,fp);
  27.565 +        readnum(fp,&thechar);
  27.566 +        return thechar;
  27.567 +        }
  27.568 +      return next;
  27.569 +    }
  27.570 +}
  27.571 +
  27.572 +/****************************************************************************
  27.573 +
  27.574 +  charsetname
  27.575 +
  27.576 +  Get a Tchar representing a charset name, or 0 if none available.
  27.577 +  Called in getcharset().
  27.578 +
  27.579 +****************************************************************************/
  27.580 +
  27.581 +inchr charsetname(fp)
  27.582 +ZFILE *fp;
  27.583 +{
  27.584 +  inchr result;
  27.585 +
  27.586 +  result = readTchar(fp);
  27.587 +  if (result == '\n' || result == '\r') {
  27.588 +    result = 0;
  27.589 +    Zungetc(result,fp);
  27.590 +    }
  27.591 +  return result;
  27.592 +  }
  27.593 +
  27.594 +/****************************************************************************
  27.595 +
  27.596 +  charset
  27.597 +
  27.598 +  Processes "g[0123]" character set specifier
  27.599 +  Called in readcontrol().
  27.600 +
  27.601 +****************************************************************************/
  27.602 +
  27.603 +void charset(n, controlfile)
  27.604 +int n;
  27.605 +ZFILE *controlfile;
  27.606 +{
  27.607 +  int ch;
  27.608 +
  27.609 +  skipws(controlfile);
  27.610 +  if (Zgetc(controlfile) != '9') {
  27.611 +    skiptoeol(controlfile);
  27.612 +    return;
  27.613 +    }
  27.614 +  ch = Zgetc(controlfile);
  27.615 +  if (ch == '6') {
  27.616 +     gn[n] = 65536L * charsetname(controlfile) + 0x80;
  27.617 +     gndbl[n] = 0;
  27.618 +     skiptoeol(controlfile);
  27.619 +     return;
  27.620 +     }
  27.621 +  if (ch != '4') {
  27.622 +    skiptoeol(controlfile);
  27.623 +    return;
  27.624 +    }
  27.625 +  ch = Zgetc(controlfile);
  27.626 +  if (ch == 'x') {
  27.627 +     if (Zgetc(controlfile) != '9') {
  27.628 +       skiptoeol(controlfile);
  27.629 +       return;
  27.630 +       }
  27.631 +     if (Zgetc(controlfile) != '4') {
  27.632 +       skiptoeol(controlfile);
  27.633 +       return;
  27.634 +       }
  27.635 +     skipws(controlfile);
  27.636 +     gn[n] = 65536L * charsetname(controlfile);
  27.637 +     gndbl[n] = 1;
  27.638 +     skiptoeol(controlfile);
  27.639 +     return;
  27.640 +     }
  27.641 +  Zungetc(ch, controlfile);
  27.642 +  skipws(controlfile);
  27.643 +  gn[n] = 65536L * charsetname(controlfile);
  27.644 +  gndbl[n] = 0;
  27.645 +  return;
  27.646 +  }
  27.647 +
  27.648 +/****************************************************************************
  27.649 +
  27.650 +  readcontrol
  27.651 +
  27.652 +  Allocates memory and reads in the given control file.
  27.653 +  Called in readcontrolfiles().
  27.654 +
  27.655 +****************************************************************************/
  27.656 +
  27.657 +void readcontrol(controlname)
  27.658 +char *controlname;
  27.659 +{
  27.660 +  inchr firstch,lastch;
  27.661 +  char dashcheck;
  27.662 +  inchr offset;
  27.663 +  char *controlpath,magicnum[5];
  27.664 +  int command;
  27.665 +  ZFILE *controlfile;
  27.666 +  int namelen;
  27.667 +
  27.668 +  namelen = MYSTRLEN(fontdirname);
  27.669 +  controlpath = (char*)myalloc(sizeof(char)
  27.670 +    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
  27.671 +  controlfile = NULL;
  27.672 +  if (!hasdirsep(controlname)) {
  27.673 +    strcpy(controlpath,fontdirname);
  27.674 +    controlpath[namelen] = DIRSEP;
  27.675 +    controlpath[namelen+1] = '\0';
  27.676 +    strcat(controlpath,controlname);
  27.677 +    strcat(controlpath,CONTROLFILESUFFIX);
  27.678 +    controlfile = Zopen(controlpath,"rb");
  27.679 +    }
  27.680 +  if (controlfile==NULL) {
  27.681 +    strcpy(controlpath,controlname);
  27.682 +    strcat(controlpath,CONTROLFILESUFFIX);
  27.683 +    controlfile = Zopen(controlpath,"rb");
  27.684 +    if (controlfile==NULL) {
  27.685 +      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
  27.686 +        controlpath);
  27.687 +      exit(1);
  27.688 +      }
  27.689 +    }
  27.690 +
  27.691 +  free(controlpath);
  27.692 +
  27.693 +  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  27.694 +  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
  27.695 +  commandlistend = &(*commandlistend)->next;
  27.696 +  (*commandlistend) = NULL;
  27.697 +
  27.698 +  while(command=Zgetc(controlfile),command!=EOF) {
  27.699 +    switch (command) {
  27.700 +      case 't': /* Translate */
  27.701 +        skipws(controlfile);
  27.702 +        firstch=readTchar(controlfile);
  27.703 +        if ((dashcheck=Zgetc(controlfile))=='-') {
  27.704 +          lastch=readTchar(controlfile);
  27.705 +          }
  27.706 +        else {
  27.707 +          Zungetc(dashcheck,controlfile);
  27.708 +          lastch=firstch;
  27.709 +          }
  27.710 +        skipws(controlfile);
  27.711 +        offset=readTchar(controlfile)-firstch;
  27.712 +        skiptoeol(controlfile);
  27.713 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  27.714 +        (*commandlistend)->thecommand = 1;
  27.715 +        (*commandlistend)->rangelo = firstch;
  27.716 +        (*commandlistend)->rangehi = lastch;
  27.717 +        (*commandlistend)->offset = offset;
  27.718 +        commandlistend = &(*commandlistend)->next;
  27.719 +        (*commandlistend) = NULL;
  27.720 +        break;
  27.721 +      case '0': case '1': case '2': case '3': case '4':
  27.722 +      case '5': case '6': case '7': case '8': case '9':
  27.723 +      case '-':
  27.724 +                /* Mapping table entry */
  27.725 +        Zungetc(command,controlfile);
  27.726 +        readnum(controlfile,&firstch);
  27.727 +        skipws(controlfile);
  27.728 +	readnum(controlfile,&lastch);
  27.729 +	offset=lastch-firstch;
  27.730 +        lastch=firstch;
  27.731 +        skiptoeol(controlfile);
  27.732 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  27.733 +        (*commandlistend)->thecommand = 1;
  27.734 +        (*commandlistend)->rangelo = firstch;
  27.735 +        (*commandlistend)->rangehi = lastch;
  27.736 +        (*commandlistend)->offset = offset;
  27.737 +        commandlistend = &(*commandlistend)->next;
  27.738 +        (*commandlistend) = NULL;
  27.739 +        break;
  27.740 +      case 'f': /* freeze */
  27.741 +        skiptoeol(controlfile);
  27.742 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  27.743 +        (*commandlistend)->thecommand = 0;
  27.744 +        commandlistend = &(*commandlistend)->next;
  27.745 +        (*commandlistend) = NULL;
  27.746 +        break;
  27.747 +      case 'b': /* DBCS input mode */
  27.748 +        multibyte = 1;
  27.749 +        break;
  27.750 +      case 'u': /* UTF-8 input mode */
  27.751 +        multibyte = 2;
  27.752 +        break;
  27.753 +      case 'h': /* HZ input mode */
  27.754 +        multibyte = 3;
  27.755 +        break;
  27.756 +      case 'j': /* Shift-JIS input mode */
  27.757 +        multibyte = 4;
  27.758 +        break;
  27.759 +      case 'g': /* ISO 2022 character set choices */
  27.760 +        multibyte = 0;
  27.761 +        skipws(controlfile);
  27.762 +        command=Zgetc(controlfile);
  27.763 +        switch (command) {
  27.764 +          case '0': /* define G0 charset */
  27.765 +            charset(0, controlfile);
  27.766 +            break;
  27.767 +          case '1': /* set G1 charset */
  27.768 +            charset(1, controlfile);
  27.769 +            break;
  27.770 +          case '2': /* set G2 charset */
  27.771 +            charset(2, controlfile);
  27.772 +            break;
  27.773 +          case '3': /* set G3 charset */
  27.774 +            charset(3, controlfile);
  27.775 +            break;
  27.776 +          case 'l': case 'L': /* define left half */
  27.777 +            skipws(controlfile);
  27.778 +            gl = Zgetc(controlfile) - '0';
  27.779 +            skiptoeol(controlfile);
  27.780 +            break;
  27.781 +          case 'r': case 'R': /* define right half */
  27.782 +            skipws(controlfile);
  27.783 +            gr = Zgetc(controlfile) - '0';
  27.784 +            skiptoeol(controlfile);
  27.785 +            break;
  27.786 +          default: /* meaningless "g" command */
  27.787 +            skiptoeol(controlfile);
  27.788 +          }
  27.789 +      case '\r': case '\n': /* blank line */
  27.790 +        break;
  27.791 +      default: /* Includes '#' */
  27.792 +        skiptoeol(controlfile);
  27.793 +      }
  27.794 +    }
  27.795 +  Zclose(controlfile);
  27.796 +}
  27.797 +
  27.798 +
  27.799 +/****************************************************************************
  27.800 +
  27.801 +  readcontrolfiles
  27.802 +
  27.803 +  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
  27.804 +  Called in main().
  27.805 +
  27.806 +****************************************************************************/
  27.807 +
  27.808 +void readcontrolfiles()
  27.809 +{
  27.810 +  cfnamenode *cfnptr;
  27.811 +
  27.812 +  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
  27.813 +    readcontrol(cfnptr->thename);
  27.814 +    }
  27.815 +}
  27.816 +
  27.817 +
  27.818 +/****************************************************************************
  27.819 +
  27.820 +  clearcfilelist
  27.821 +
  27.822 +  Clears the control file list.  Assumes thename does not need freeing.
  27.823 +
  27.824 +****************************************************************************/
  27.825 +
  27.826 +void clearcfilelist()
  27.827 +{
  27.828 +  cfnamenode *cfnptr1,*cfnptr2;
  27.829 +
  27.830 +  cfnptr1 = cfilelist;
  27.831 +  while (cfnptr1 != NULL) {
  27.832 +    cfnptr2 = cfnptr1->next;
  27.833 +    free(cfnptr1);
  27.834 +    cfnptr1 = cfnptr2;
  27.835 +    }
  27.836 +  cfilelist = NULL;
  27.837 +  cfilelistend = &cfilelist;
  27.838 +}
  27.839 +
  27.840 +
  27.841 +/****************************************************************************
  27.842 +
  27.843 +  getparams
  27.844 +
  27.845 +  Handles all command-line parameters.  Puts all parameters within
  27.846 +  bounds.
  27.847 +
  27.848 +****************************************************************************/
  27.849 +
  27.850 +void getparams()
  27.851 +{
  27.852 +  extern char *optarg;
  27.853 +  extern int optind;
  27.854 +  int c; /* "Should" be a char -- need int for "!= -1" test*/
  27.855 +  int columns,firstfont,infoprint;
  27.856 +  char *controlname;
  27.857 +
  27.858 +  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
  27.859 +    myname++;
  27.860 +    }
  27.861 +  else {
  27.862 +    myname = Myargv[0];
  27.863 +    }
  27.864 +  fontdirname = DEFAULTFONTDIR;
  27.865 +  firstfont = 1;
  27.866 +  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
  27.867 +  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
  27.868 +  if (suffixcmp(fontname,FONTFILESUFFIX)) {
  27.869 +    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
  27.870 +    }
  27.871 +  cfilelist = NULL;
  27.872 +  cfilelistend = &cfilelist;
  27.873 +  commandlist = NULL;
  27.874 +  commandlistend = &commandlist;
  27.875 +  smushoverride = SMO_NO;
  27.876 +  deutschflag = 0;
  27.877 +  justification = -1;
  27.878 +  right2left = -1;
  27.879 +  paragraphflag = 0;
  27.880 +  infoprint = -1;
  27.881 +  cmdinput = 0;
  27.882 +  outputwidth = DEFAULTCOLUMNS;
  27.883 +  gn[1] = 0x80;
  27.884 +  gr = 1;
  27.885 +  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
  27.886 +      /* Note: -F is not a legal option -- prints a special err message.  */
  27.887 +    switch (c) {
  27.888 +      case 'A':
  27.889 +        cmdinput = 1;
  27.890 +        break;
  27.891 +      case 'D':
  27.892 +        deutschflag = 1;
  27.893 +        break;
  27.894 +      case 'E':
  27.895 +        deutschflag = 0;
  27.896 +        break;
  27.897 +      case 'X':
  27.898 +        right2left = -1;
  27.899 +        break;
  27.900 +      case 'L':
  27.901 +        right2left = 0;
  27.902 +        break;
  27.903 +      case 'R':
  27.904 +        right2left = 1;
  27.905 +        break;
  27.906 +      case 'x':
  27.907 +        justification = -1;
  27.908 +        break;
  27.909 +      case 'l':
  27.910 +        justification = 0;
  27.911 +        break;
  27.912 +      case 'c':
  27.913 +        justification = 1;
  27.914 +        break;
  27.915 +      case 'r':
  27.916 +        justification = 2;
  27.917 +        break;
  27.918 +      case 'p':
  27.919 +        paragraphflag = 1;
  27.920 +        break;
  27.921 +      case 'n':
  27.922 +        paragraphflag = 0;
  27.923 +        break;
  27.924 +      case 's':
  27.925 +        smushoverride = SMO_NO;
  27.926 +        break;
  27.927 +      case 'k':
  27.928 +        smushmode = SM_KERN;
  27.929 +        smushoverride = SMO_YES;
  27.930 +        break;
  27.931 +      case 'S':
  27.932 +        smushmode = SM_SMUSH;
  27.933 +	smushoverride = SMO_FORCE;
  27.934 +        break;
  27.935 +      case 'o':
  27.936 +        smushmode = SM_SMUSH;
  27.937 +	smushoverride = SMO_YES;
  27.938 +        break;
  27.939 +      case 'W':
  27.940 +        smushmode = 0;
  27.941 +	smushoverride = SMO_YES;
  27.942 +        break;
  27.943 +      case 't':
  27.944 +#ifdef TIOCGWINSZ
  27.945 +        columns = get_columns();
  27.946 +        if (columns>0) {
  27.947 +          outputwidth = columns;
  27.948 +          }
  27.949 +#else /* ifdef TIOCGWINSZ */
  27.950 +        fprintf(stderr,
  27.951 +          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
  27.952 +          myname);
  27.953 +#endif /* ifdef TIOCGWINSZ */
  27.954 +        break;
  27.955 +      case 'v':
  27.956 +        infoprint = 0;
  27.957 +        break;
  27.958 +      case 'I':
  27.959 +        infoprint = atoi(optarg);
  27.960 +        break;
  27.961 +      case 'm':
  27.962 +        smushmode = atoi(optarg);
  27.963 +        if (smushmode < -1) {
  27.964 +          smushoverride = SMO_NO;
  27.965 +          break;
  27.966 +          }
  27.967 +	if (smushmode == 0) smushmode = SM_KERN;
  27.968 +	else if (smushmode == -1) smushmode = 0;
  27.969 +	else smushmode = (smushmode & 63) | SM_SMUSH;
  27.970 +	smushoverride = SMO_YES;
  27.971 +        break;
  27.972 +      case 'w':
  27.973 +        columns = atoi(optarg);
  27.974 +        if (columns>0) {
  27.975 +          outputwidth = columns;
  27.976 +          }
  27.977 +        break;
  27.978 +      case 'd':
  27.979 +        fontdirname = optarg;
  27.980 +        break;
  27.981 +      case 'f':
  27.982 +        if (firstfont) {
  27.983 +          free(fontname);
  27.984 +          firstfont = 0;
  27.985 +          }
  27.986 +        fontname = optarg;
  27.987 +        if (suffixcmp(fontname,FONTFILESUFFIX)) {
  27.988 +          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
  27.989 +          }
  27.990 +        break;
  27.991 +      case 'C':
  27.992 +        controlname = optarg;
  27.993 +        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
  27.994 +          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
  27.995 +          }
  27.996 +        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
  27.997 +        (*cfilelistend)->thename = controlname;
  27.998 +        cfilelistend = &(*cfilelistend)->next;
  27.999 +        (*cfilelistend) = NULL;
 27.1000 +        break;
 27.1001 +      case 'N':
 27.1002 +        clearcfilelist();
 27.1003 +        multibyte = 0;
 27.1004 +        gn[0] = 0;
 27.1005 +        gn[1] = 0x80;
 27.1006 +        gn[2] = gn[3] = 0;
 27.1007 +        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
 27.1008 +        gl = 0;
 27.1009 +        gr = 1;
 27.1010 +        break;
 27.1011 +      case 'F': /* Not a legal option */
 27.1012 +        fprintf(stderr,"%s: illegal option -- F\n",myname);
 27.1013 +        printusage(stderr);
 27.1014 +        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
 27.1015 +        fprintf(stderr," \"-F\" option has been\n");
 27.1016 +        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
 27.1017 +        fprintf(stderr," program, which is now\n");
 27.1018 +        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
 27.1019 +        fprintf(stderr," is also available\n");
 27.1020 +        fprintf(stderr,"from  http://www.figlet.org/");
 27.1021 +        fprintf(stderr,"under UNIX utilities.\n");
 27.1022 +        exit(1);
 27.1023 +        break;
 27.1024 +      default:
 27.1025 +        printusage(stderr);
 27.1026 +        exit(1);
 27.1027 +      }
 27.1028 +    }
 27.1029 +  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
 27.1030 +  outlinelenlimit = outputwidth-1;
 27.1031 +  if (infoprint>=0) {
 27.1032 +    printinfo(infoprint);
 27.1033 +    exit(0);
 27.1034 +    }
 27.1035 +}
 27.1036 +
 27.1037 +
 27.1038 +/****************************************************************************
 27.1039 +
 27.1040 +  clearline
 27.1041 +
 27.1042 +  Clears both the input (inchrline) and output (outputline) storage.
 27.1043 +
 27.1044 +****************************************************************************/
 27.1045 +
 27.1046 +void clearline()
 27.1047 +{
 27.1048 +  int i;
 27.1049 +
 27.1050 +  for (i=0;i<charheight;i++) {
 27.1051 +    outputline[i][0] = '\0';
 27.1052 +    }
 27.1053 +  outlinelen = 0;
 27.1054 +  inchrlinelen = 0;
 27.1055 +}
 27.1056 +
 27.1057 +
 27.1058 +/****************************************************************************
 27.1059 +
 27.1060 +  readfontchar
 27.1061 +
 27.1062 +  Reads a font character from the font file, and places it in a
 27.1063 +  newly-allocated entry in the list.
 27.1064 +
 27.1065 +****************************************************************************/
 27.1066 +
 27.1067 +void readfontchar(file,theord,line,maxlen)
 27.1068 +ZFILE *file;
 27.1069 +inchr theord;
 27.1070 +char *line;
 27.1071 +int maxlen;
 27.1072 +{
 27.1073 +  int row,k;
 27.1074 +  char endchar;
 27.1075 +  fcharnode *fclsave;
 27.1076 +
 27.1077 +  fclsave = fcharlist;
 27.1078 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 27.1079 +  fcharlist->ord = theord;
 27.1080 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 27.1081 +  fcharlist->next = fclsave;
 27.1082 +  for (row=0;row<charheight;row++) {
 27.1083 +    if (myfgets(line,maxlen+1,file)==NULL) {
 27.1084 +      line[0] = '\0';
 27.1085 +      }
 27.1086 +    k = MYSTRLEN(line)-1;
 27.1087 +    while (k>=0 && isspace(line[k])) {
 27.1088 +      k--;
 27.1089 +      }
 27.1090 +    if (k>=0) {
 27.1091 +      endchar = line[k];
 27.1092 +      while (k>=0 ? line[k]==endchar : 0) {
 27.1093 +        k--;
 27.1094 +        }
 27.1095 +      }
 27.1096 +    line[k+1] = '\0';
 27.1097 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
 27.1098 +    strcpy(fcharlist->thechar[row],line);
 27.1099 +    }
 27.1100 +}
 27.1101 +
 27.1102 +
 27.1103 +/****************************************************************************
 27.1104 +
 27.1105 +  readfont
 27.1106 +
 27.1107 +  Allocates memory, initializes variables, and reads in the font.
 27.1108 +  Called near beginning of main().
 27.1109 +
 27.1110 +****************************************************************************/
 27.1111 +
 27.1112 +void readfont()
 27.1113 +{
 27.1114 +#define MAXFIRSTLINELEN 1000
 27.1115 +  int i,row,numsread;
 27.1116 +  inchr theord;
 27.1117 +  int maxlen,cmtlines,ffright2left;
 27.1118 +  int smush,smush2;
 27.1119 +  char *fontpath,*fileline,magicnum[5];
 27.1120 +  ZFILE *fontfile;
 27.1121 +  int namelen;
 27.1122 +
 27.1123 +  namelen = MYSTRLEN(fontdirname);
 27.1124 +  fontpath = (char*)myalloc(sizeof(char)
 27.1125 +    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
 27.1126 +  fontfile = NULL;
 27.1127 +  if (!hasdirsep(fontname)) {
 27.1128 +    strcpy(fontpath,fontdirname);
 27.1129 +    fontpath[namelen] = DIRSEP;
 27.1130 +    fontpath[namelen+1] = '\0';
 27.1131 +    strcat(fontpath,fontname);
 27.1132 +    strcat(fontpath,FONTFILESUFFIX);
 27.1133 +    fontfile = Zopen(fontpath,"rb");
 27.1134 +    }
 27.1135 +  if (fontfile==NULL) {
 27.1136 +    strcpy(fontpath,fontname);
 27.1137 +    strcat(fontpath,FONTFILESUFFIX);
 27.1138 +    fontfile = Zopen(fontpath,"rb");
 27.1139 +    if (fontfile==NULL) {
 27.1140 +      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
 27.1141 +      exit(1);
 27.1142 +      }
 27.1143 +    }
 27.1144 +
 27.1145 +  readmagic(fontfile,magicnum);
 27.1146 +  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
 27.1147 +  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
 27.1148 +    fileline[0] = '\0';
 27.1149 +    }
 27.1150 +  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
 27.1151 +    skiptoeol(fontfile);
 27.1152 +    }
 27.1153 +  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
 27.1154 +    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
 27.1155 +    &ffright2left,&smush2);
 27.1156 +  free(fileline);
 27.1157 +  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
 27.1158 +    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
 27.1159 +    exit(1);
 27.1160 +    }
 27.1161 +  for (i=1;i<=cmtlines;i++) {
 27.1162 +    skiptoeol(fontfile);
 27.1163 +    }
 27.1164 +  free(fontpath);
 27.1165 +
 27.1166 +  if (numsread<6) {
 27.1167 +    ffright2left = 0;
 27.1168 +    }
 27.1169 +
 27.1170 +  if (numsread<7) { /* if no smush2, decode smush into smush2 */
 27.1171 +    if (smush == 0) smush2 = SM_KERN;
 27.1172 +    else if (smush < 0) smush2 = 0;
 27.1173 +    else smush2 = (smush & 31) | SM_SMUSH;
 27.1174 +    }
 27.1175 +
 27.1176 +  if (charheight<1) {
 27.1177 +    charheight = 1;
 27.1178 +    }
 27.1179 +
 27.1180 +  if (maxlen<1) {
 27.1181 +    maxlen = 1;
 27.1182 +    }
 27.1183 +
 27.1184 +  maxlen += 100; /* Give ourselves some extra room */
 27.1185 +
 27.1186 +  if (smushoverride == SMO_NO)
 27.1187 +     smushmode = smush2;
 27.1188 +  else if (smushoverride == SMO_FORCE)
 27.1189 +     smushmode |= smush2;
 27.1190 +
 27.1191 +  if (right2left<0) {
 27.1192 +    right2left = ffright2left;
 27.1193 +    }
 27.1194 +
 27.1195 +  if (justification<0) {
 27.1196 +    justification = 2*right2left;
 27.1197 +    }
 27.1198 +
 27.1199 +  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
 27.1200 +  /* Allocate "missing" character */
 27.1201 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 27.1202 +  fcharlist->ord = 0;
 27.1203 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 27.1204 +  fcharlist->next = NULL;
 27.1205 +  for (row=0;row<charheight;row++) {
 27.1206 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
 27.1207 +    fcharlist->thechar[row][0] = '\0';
 27.1208 +    }
 27.1209 +  for (theord=' ';theord<='~';theord++) {
 27.1210 +    readfontchar(fontfile,theord,fileline,maxlen);
 27.1211 +    }
 27.1212 +  for (theord=0;theord<=6;theord++) {
 27.1213 +    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
 27.1214 +    }
 27.1215 +  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
 27.1216 +    sscanf(fileline,"%li",&theord)==1) {
 27.1217 +    readfontchar(fontfile,theord,fileline,maxlen);
 27.1218 +    }
 27.1219 +  Zclose(fontfile);
 27.1220 +  free(fileline);
 27.1221 +}
 27.1222 +
 27.1223 +
 27.1224 +/****************************************************************************
 27.1225 +
 27.1226 +  linealloc
 27.1227 +
 27.1228 +  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
 27.1229 +  Called near beginning of main().
 27.1230 +
 27.1231 +****************************************************************************/
 27.1232 +
 27.1233 +void linealloc()
 27.1234 +{
 27.1235 +  int row; 
 27.1236 +
 27.1237 +  outputline = (char**)myalloc(sizeof(char*)*charheight);
 27.1238 +  for (row=0;row<charheight;row++) {
 27.1239 +    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 27.1240 +    }
 27.1241 +  inchrlinelenlimit = outputwidth*4+100;
 27.1242 +  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
 27.1243 +  clearline();
 27.1244 +}
 27.1245 +
 27.1246 +
 27.1247 +/****************************************************************************
 27.1248 +
 27.1249 +  getletter
 27.1250 +
 27.1251 +  Sets currchar to point to the font entry for the given character.
 27.1252 +  Sets currcharwidth to the width of this character.
 27.1253 +
 27.1254 +****************************************************************************/
 27.1255 +
 27.1256 +void getletter(c)
 27.1257 +inchr c;
 27.1258 +{
 27.1259 +  fcharnode *charptr;
 27.1260 +
 27.1261 +  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
 27.1262 +    charptr=charptr->next) ;
 27.1263 +  if (charptr!=NULL) {
 27.1264 +    currchar = charptr->thechar;
 27.1265 +    }
 27.1266 +  else {
 27.1267 +    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
 27.1268 +      charptr=charptr->next) ;
 27.1269 +    currchar = charptr->thechar;
 27.1270 +    }
 27.1271 +  previouscharwidth = currcharwidth;
 27.1272 +  currcharwidth = MYSTRLEN(currchar[0]);
 27.1273 +}
 27.1274 +
 27.1275 +
 27.1276 +/****************************************************************************
 27.1277 +
 27.1278 +  smushem
 27.1279 +
 27.1280 +  Given 2 characters, attempts to smush them into 1, according to
 27.1281 +  smushmode.  Returns smushed character or '\0' if no smushing can be
 27.1282 +  done.
 27.1283 +
 27.1284 +  smushmode values are sum of following (all values smush blanks):
 27.1285 +    1: Smush equal chars (not hardblanks)
 27.1286 +    2: Smush '_' with any char in hierarchy below
 27.1287 +    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
 27.1288 +       Each class in hier. can be replaced by later class.
 27.1289 +    8: [ + ] -> |, { + } -> |, ( + ) -> |
 27.1290 +   16: / + \ -> X, > + < -> X (only in that order)
 27.1291 +   32: hardblank + hardblank -> hardblank
 27.1292 +
 27.1293 +****************************************************************************/
 27.1294 +
 27.1295 +char smushem(lch,rch)
 27.1296 +char lch,rch;
 27.1297 +{
 27.1298 +  if (lch==' ') return rch;
 27.1299 +  if (rch==' ') return lch;
 27.1300 +
 27.1301 +  if (previouscharwidth<2 || currcharwidth<2) return '\0';
 27.1302 +    /* Disallows overlapping if the previous character */
 27.1303 +    /* or the current character has a width of 1 or zero. */
 27.1304 +
 27.1305 +  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
 27.1306 +
 27.1307 +  if ((smushmode & 63) == 0) {
 27.1308 +    /* This is smushing by universal overlapping. */
 27.1309 +    if (lch==' ') return rch;
 27.1310 +    if (rch==' ') return lch;
 27.1311 +    if (lch==hardblank) return rch;
 27.1312 +    if (rch==hardblank) return lch;
 27.1313 +      /* Above four lines ensure overlapping preference to */
 27.1314 +      /* visible characters. */
 27.1315 +    if (right2left==1) return lch;
 27.1316 +      /* Above line ensures that the dominant (foreground) */
 27.1317 +      /* fig-character for overlapping is the latter in the */
 27.1318 +      /* user's text, not necessarily the rightmost character. */
 27.1319 +    return rch;
 27.1320 +      /* Occurs in the absence of above exceptions. */
 27.1321 +    }
 27.1322 +  
 27.1323 +  if (smushmode & SM_HARDBLANK) {
 27.1324 +    if (lch==hardblank && rch==hardblank) return lch;
 27.1325 +    }
 27.1326 +
 27.1327 +  if (lch==hardblank || rch==hardblank) return '\0';
 27.1328 +
 27.1329 +  if (smushmode & SM_EQUAL) {
 27.1330 +    if (lch==rch) return lch;
 27.1331 +    }
 27.1332 +
 27.1333 +  if (smushmode & SM_LOWLINE) {
 27.1334 +    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
 27.1335 +    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
 27.1336 +    }
 27.1337 +
 27.1338 +  if (smushmode & SM_HIERARCHY) {
 27.1339 +    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
 27.1340 +    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
 27.1341 +    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
 27.1342 +    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
 27.1343 +    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
 27.1344 +    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
 27.1345 +    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
 27.1346 +    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
 27.1347 +    if (strchr("()",lch) && strchr("<>",rch)) return rch;
 27.1348 +    if (strchr("()",rch) && strchr("<>",lch)) return lch;
 27.1349 +    }
 27.1350 +
 27.1351 +  if (smushmode & SM_PAIR) {
 27.1352 +    if (lch=='[' && rch==']') return '|';
 27.1353 +    if (rch=='[' && lch==']') return '|';
 27.1354 +    if (lch=='{' && rch=='}') return '|';
 27.1355 +    if (rch=='{' && lch=='}') return '|';
 27.1356 +    if (lch=='(' && rch==')') return '|';
 27.1357 +    if (rch=='(' && lch==')') return '|';
 27.1358 +    }
 27.1359 +
 27.1360 +  if (smushmode & SM_BIGX) {
 27.1361 +    if (lch=='/' && rch=='\\') return '|';
 27.1362 +    if (rch=='/' && lch=='\\') return 'Y';
 27.1363 +    if (lch=='>' && rch=='<') return 'X';
 27.1364 +      /* Don't want the reverse of above to give 'X'. */
 27.1365 +    }
 27.1366 +
 27.1367 +  return '\0';
 27.1368 +}
 27.1369 +
 27.1370 +
 27.1371 +/****************************************************************************
 27.1372 +
 27.1373 +  smushamt
 27.1374 +
 27.1375 +  Returns the maximum amount that the current character can be smushed
 27.1376 +  into the current line.
 27.1377 +
 27.1378 +****************************************************************************/
 27.1379 +
 27.1380 +int smushamt()
 27.1381 +{
 27.1382 +  int maxsmush,amt;
 27.1383 +  int row,linebd,charbd;
 27.1384 +  char ch1,ch2;
 27.1385 +
 27.1386 +  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
 27.1387 +    return 0;
 27.1388 +    }
 27.1389 +  maxsmush = currcharwidth;
 27.1390 +  for (row=0;row<charheight;row++) {
 27.1391 +    if (right2left) {
 27.1392 +      for (charbd=MYSTRLEN(currchar[row]);
 27.1393 +        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
 27.1394 +      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
 27.1395 +      amt = linebd+currcharwidth-1-charbd;
 27.1396 +      }
 27.1397 +    else {
 27.1398 +      for (linebd=MYSTRLEN(outputline[row]);
 27.1399 +        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
 27.1400 +      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
 27.1401 +      amt = charbd+outlinelen-1-linebd;
 27.1402 +      }
 27.1403 +    if (!ch1||ch1==' ') {
 27.1404 +      amt++;
 27.1405 +      }
 27.1406 +    else if (ch2) {
 27.1407 +      if (smushem(ch1,ch2)!='\0') {
 27.1408 +        amt++;
 27.1409 +        }
 27.1410 +      }
 27.1411 +    if (amt<maxsmush) {
 27.1412 +      maxsmush = amt;
 27.1413 +      }
 27.1414 +    }
 27.1415 +  return maxsmush;
 27.1416 +}
 27.1417 +
 27.1418 +
 27.1419 +/****************************************************************************
 27.1420 +
 27.1421 +  addchar
 27.1422 +
 27.1423 +  Attempts to add the given character onto the end of the current line.
 27.1424 +  Returns 1 if this can be done, 0 otherwise.
 27.1425 +
 27.1426 +****************************************************************************/
 27.1427 +
 27.1428 +int addchar(c)
 27.1429 +inchr c;
 27.1430 +{
 27.1431 +  int smushamount,row,k;
 27.1432 +  char *templine;
 27.1433 +
 27.1434 +  getletter(c);
 27.1435 +  smushamount = smushamt();
 27.1436 +  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
 27.1437 +      ||inchrlinelen+1>inchrlinelenlimit) {
 27.1438 +    return 0;
 27.1439 +    }
 27.1440 +
 27.1441 +  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 27.1442 +  for (row=0;row<charheight;row++) {
 27.1443 +    if (right2left) {
 27.1444 +      strcpy(templine,currchar[row]);
 27.1445 +      for (k=0;k<smushamount;k++) {
 27.1446 +        templine[currcharwidth-smushamount+k] =
 27.1447 +          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
 27.1448 +        }
 27.1449 +      strcat(templine,outputline[row]+smushamount);
 27.1450 +      strcpy(outputline[row],templine);
 27.1451 +      }
 27.1452 +    else {
 27.1453 +      for (k=0;k<smushamount;k++) {
 27.1454 +        outputline[row][outlinelen-smushamount+k] =
 27.1455 +          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
 27.1456 +        }
 27.1457 +      strcat(outputline[row],currchar[row]+smushamount);
 27.1458 +      }
 27.1459 +    }
 27.1460 +  free(templine);
 27.1461 +  outlinelen = MYSTRLEN(outputline[0]);
 27.1462 +  inchrline[inchrlinelen++] = c;
 27.1463 +  return 1;
 27.1464 +}
 27.1465 +
 27.1466 +
 27.1467 +/****************************************************************************
 27.1468 +
 27.1469 +  putstring
 27.1470 +
 27.1471 +  Prints out the given null-terminated string, substituting blanks
 27.1472 +  for hardblanks.  If outputwidth is 1, prints the entire string;
 27.1473 +  otherwise prints at most outputwidth-1 characters.  Prints a newline
 27.1474 +  at the end of the string.  The string is left-justified, centered or
 27.1475 +  right-justified (taking outputwidth as the screen width) if
 27.1476 +  justification is 0, 1 or 2, respectively.
 27.1477 +
 27.1478 +****************************************************************************/
 27.1479 +
 27.1480 +static int nr_chars=0;
 27.1481 +static void myputchar(unsigned char c)
 27.1482 +{
 27.1483 +    static int startline = 1;
 27.1484 +
 27.1485 +    if ( startline )
 27.1486 +    {
 27.1487 +        startline = 0;
 27.1488 +        myputchar(' ');
 27.1489 +    }
 27.1490 +
 27.1491 +    putc(c, stderr);
 27.1492 +
 27.1493 +    if ( nr_chars == 0 )
 27.1494 +        putchar('"');
 27.1495 +
 27.1496 +    putchar('\\');
 27.1497 +    putchar('0' + ((c>>6)&7));
 27.1498 +    putchar('0' + ((c>>3)&7));
 27.1499 +    putchar('0' + ((c>>0)&7));
 27.1500 +
 27.1501 +    if ( c == '\n' )
 27.1502 +        startline = 1;
 27.1503 +
 27.1504 +    if ( ++nr_chars == 18 ) 
 27.1505 +    {
 27.1506 +        nr_chars = 0;
 27.1507 +        putchar('"');
 27.1508 +        putchar(' ');
 27.1509 +        putchar('\\');
 27.1510 +        putchar('\n');
 27.1511 +    }
 27.1512 +}
 27.1513 +
 27.1514 +void putstring(string)
 27.1515 +char *string;
 27.1516 +{
 27.1517 +  int i,len;
 27.1518 +
 27.1519 +  len = MYSTRLEN(string);
 27.1520 +  if (outputwidth>1) {
 27.1521 +    if (len>outputwidth-1) {
 27.1522 +      len = outputwidth-1;
 27.1523 +      }
 27.1524 +    if (justification>0) {
 27.1525 +      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
 27.1526 +        myputchar(' ');
 27.1527 +        }
 27.1528 +      }
 27.1529 +    }
 27.1530 +  for (i=0;i<len;i++) {
 27.1531 +    myputchar(string[i]==hardblank?' ':string[i]);
 27.1532 +    }
 27.1533 +  myputchar('\n');
 27.1534 +}
 27.1535 +
 27.1536 +
 27.1537 +/****************************************************************************
 27.1538 +
 27.1539 +  printline
 27.1540 +
 27.1541 +  Prints outputline using putstring, then clears the current line.
 27.1542 +
 27.1543 +****************************************************************************/
 27.1544 +
 27.1545 +void printline()
 27.1546 +{
 27.1547 +  int i;
 27.1548 +
 27.1549 +  for (i=0;i<charheight;i++) {
 27.1550 +    putstring(outputline[i]);
 27.1551 +    }
 27.1552 +  clearline();
 27.1553 +}
 27.1554 +
 27.1555 +
 27.1556 +/****************************************************************************
 27.1557 +
 27.1558 +  splitline
 27.1559 +
 27.1560 +  Splits inchrline at the last word break (bunch of consecutive blanks).
 27.1561 +  Makes a new line out of the first part and prints it using
 27.1562 +  printline.  Makes a new line out of the second part and returns.
 27.1563 +
 27.1564 +****************************************************************************/
 27.1565 +
 27.1566 +void splitline()
 27.1567 +{
 27.1568 +  int i,gotspace,lastspace,len1,len2;
 27.1569 +  inchr *part1,*part2;
 27.1570 +
 27.1571 +  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 27.1572 +  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 27.1573 +  gotspace = 0;
 27.1574 +  for (i=inchrlinelen-1;i>=0;i--) {
 27.1575 +    if (!gotspace && inchrline[i]==' ') {
 27.1576 +      gotspace = 1;
 27.1577 +      lastspace = i;
 27.1578 +      }
 27.1579 +    if (gotspace && inchrline[i]!=' ') {
 27.1580 +      break;
 27.1581 +      }
 27.1582 +    }
 27.1583 +  len1 = i+1;
 27.1584 +  len2 = inchrlinelen-lastspace-1;
 27.1585 +  for (i=0;i<len1;i++) {
 27.1586 +    part1[i] = inchrline[i];
 27.1587 +    }
 27.1588 +  for (i=0;i<len2;i++) {
 27.1589 +    part2[i] = inchrline[lastspace+1+i];
 27.1590 +    }
 27.1591 +  clearline();
 27.1592 +  for (i=0;i<len1;i++) {
 27.1593 +    addchar(part1[i]);
 27.1594 +    }
 27.1595 +  printline();
 27.1596 +  for (i=0;i<len2;i++) {
 27.1597 +    addchar(part2[i]);
 27.1598 +    }
 27.1599 +  free(part1);
 27.1600 +  free(part2);
 27.1601 +}
 27.1602 +
 27.1603 +
 27.1604 +/****************************************************************************
 27.1605 +
 27.1606 +  handlemapping
 27.1607 +
 27.1608 +  Given an input character (type inchr), executes re-mapping commands
 27.1609 +  read from control files.  Returns re-mapped character (inchr).
 27.1610 +
 27.1611 +****************************************************************************/
 27.1612 +
 27.1613 +inchr handlemapping(c)
 27.1614 +inchr c;
 27.1615 +{
 27.1616 +  comnode *cmptr;
 27.1617 +
 27.1618 +  cmptr=commandlist;
 27.1619 +  while (cmptr!=NULL) {
 27.1620 +    if (cmptr->thecommand ?
 27.1621 +      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
 27.1622 +      c += cmptr->offset;
 27.1623 +      while(cmptr!=NULL ? cmptr->thecommand : 0) {
 27.1624 +        cmptr=cmptr->next;
 27.1625 +        }
 27.1626 +      }
 27.1627 +    else {
 27.1628 +      cmptr=cmptr->next;
 27.1629 +      }
 27.1630 +    }
 27.1631 +  return c;
 27.1632 +}
 27.1633 +
 27.1634 +/****************************************************************************
 27.1635 +
 27.1636 +  Agetchar
 27.1637 +
 27.1638 +  Replacement to getchar().
 27.1639 +  Acts exactly like getchar if -A is NOT specified,
 27.1640 +  else obtains input from All remaining command line words.
 27.1641 +
 27.1642 +****************************************************************************/
 27.1643 +
 27.1644 +int Agetchar()
 27.1645 +{
 27.1646 +    extern int optind;		/* current argv[] element under study */
 27.1647 +    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
 27.1648 +    char   *arg;		/* pointer to active character */
 27.1649 +    int    c;			/* current character */
 27.1650 +
 27.1651 +    if ( ! cmdinput )		/* is -A active? */
 27.1652 +	return( getchar() );	/* no: return stdin character */
 27.1653 +
 27.1654 +    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
 27.1655 +	return( EOF );		/* **ensure it now and forever more */
 27.1656 +
 27.1657 +    /* find next character */
 27.1658 +    arg = Myargv[optind];		/* pointer to active arg */
 27.1659 +    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
 27.1660 +
 27.1661 +    if ( ! c )			/* at '\0' that terminates word? */
 27.1662 +    {   /* at end of word: return ' ' if normal word, '\n' if empty */
 27.1663 +	c = ' ';		/* suppose normal word and return blank */
 27.1664 +	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
 27.1665 +	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
 27.1666 +	AgetMode = 0;		/* return to char 0 in NEXT word */
 27.1667 +	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
 27.1668 +	{   /* just ran out of arguments */
 27.1669 +	    c = EOF;		/* return EOF */
 27.1670 +	    AgetMode = -1;	/* ensure all future returns return EOF */
 27.1671 +	}
 27.1672 +    }
 27.1673 +
 27.1674 +    return( c );		/* return appropriate character */
 27.1675 +
 27.1676 +}	/* end: Agetchar() */
 27.1677 +
 27.1678 +
 27.1679 +/****************************************************************************
 27.1680 +
 27.1681 +  iso2022
 27.1682 +
 27.1683 +  Called by getinchr.  Interprets ISO 2022 sequences
 27.1684 +
 27.1685 +******************************************************************************/
 27.1686 +
 27.1687 +inchr iso2022()
 27.1688 +{
 27.1689 +  inchr ch;
 27.1690 +  inchr ch2;
 27.1691 +  int save_gl;
 27.1692 +  int save_gr;
 27.1693 +
 27.1694 +  ch = Agetchar();
 27.1695 +  if (ch == EOF) return ch;
 27.1696 +  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
 27.1697 +  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
 27.1698 +  switch (ch) {
 27.1699 +    case 14: /* invoke G0 into GL */
 27.1700 +      gl = 0;
 27.1701 +      return iso2022();
 27.1702 +    case 15: /* invoke G1 into GL */
 27.1703 +      gl = 1;
 27.1704 +      return iso2022();
 27.1705 +    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
 27.1706 +      save_gl = gl; save_gr = gr;
 27.1707 +      gl = gr = 2;
 27.1708 +      ch = iso2022();
 27.1709 +      gl = save_gl; gr = save_gr;
 27.1710 +      return ch;
 27.1711 +    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
 27.1712 +      save_gl = gl; save_gr = gr;
 27.1713 +      gl = gr = 3;
 27.1714 +      ch = iso2022();
 27.1715 +      gl = save_gl; gr = save_gr;
 27.1716 +      return ch;
 27.1717 +    case 'n' + 0x100: /* invoke G2 into GL */
 27.1718 +      gl = 2;
 27.1719 +      return iso2022();
 27.1720 +    case 'o' + 0x100: /* invoke G3 into GL */
 27.1721 +      gl = 3;
 27.1722 +      return iso2022();
 27.1723 +    case '~' + 0x100: /* invoke G1 into GR */
 27.1724 +      gr = 1;
 27.1725 +      return iso2022();
 27.1726 +    case '}' + 0x100: /* invoke G2 into GR */
 27.1727 +      gr = 2;
 27.1728 +      return iso2022();
 27.1729 +    case '|' + 0x100: /* invoke G3 into GR */
 27.1730 +      gr = 3;
 27.1731 +      return iso2022();
 27.1732 +    case '(' + 0x100: /* set G0 to 94-char set */
 27.1733 +      ch = Agetchar();
 27.1734 +      if (ch == 'B') ch = 0; /* ASCII */
 27.1735 +      gn[0] = ch << 16;
 27.1736 +      gndbl[0] = 0;
 27.1737 +      return iso2022();
 27.1738 +    case ')' + 0x100: /* set G1 to 94-char set */
 27.1739 +      ch = Agetchar();
 27.1740 +      if (ch == 'B') ch = 0;
 27.1741 +      gn[1] = ch << 16;
 27.1742 +      gndbl[1] = 0;
 27.1743 +      return iso2022();
 27.1744 +    case '*' + 0x100: /* set G2 to 94-char set */
 27.1745 +      ch = Agetchar();
 27.1746 +      if (ch == 'B') ch = 0;
 27.1747 +      gn[2] = ch << 16;
 27.1748 +      gndbl[2] = 0;
 27.1749 +      return iso2022();
 27.1750 +    case '+' + 0x100: /* set G3 to 94-char set */
 27.1751 +      ch = Agetchar();
 27.1752 +      if (ch == 'B') ch = 0;
 27.1753 +      gn[3] = ch << 16;
 27.1754 +      gndbl[3] = 0;
 27.1755 +      return iso2022();
 27.1756 +    case '-' + 0x100: /* set G1 to 96-char set */
 27.1757 +      ch = Agetchar();
 27.1758 +      if (ch == 'A') ch = 0; /* Latin-1 top half */
 27.1759 +      gn[1] = (ch << 16) | 0x80;
 27.1760 +      gndbl[1] = 0;
 27.1761 +      return iso2022();
 27.1762 +    case '.' + 0x100: /* set G2 to 96-char set */
 27.1763 +      ch = Agetchar();
 27.1764 +      if (ch == 'A') ch = 0;
 27.1765 +      gn[2] = (ch << 16) | 0x80;
 27.1766 +      gndbl[2] = 0;
 27.1767 +      return iso2022();
 27.1768 +    case '/' + 0x100: /* set G3 to 96-char set */
 27.1769 +      ch = Agetchar();
 27.1770 +      if (ch == 'A') ch = 0;
 27.1771 +      gn[3] = (ch << 16) | 0x80;
 27.1772 +      gndbl[3] = 0;
 27.1773 +      return iso2022();
 27.1774 +    case '(' + 0x200: /* set G0 to 94 x 94 char set */
 27.1775 +      ch = Agetchar();
 27.1776 +      gn[0] = ch << 16;
 27.1777 +      gndbl[0] = 1;
 27.1778 +      return iso2022();
 27.1779 +    case ')' + 0x200: /* set G1 to 94 x 94 char set */
 27.1780 +      ch = Agetchar();
 27.1781 +      gn[1] = ch << 16;
 27.1782 +      gndbl[1] = 1;
 27.1783 +      return iso2022();
 27.1784 +    case '*' + 0x200: /* set G2 to 94 x 94 char set */
 27.1785 +      ch = Agetchar();
 27.1786 +      gn[2] = ch << 16;
 27.1787 +      gndbl[2] = 1;
 27.1788 +      return iso2022();
 27.1789 +    case '+' + 0x200: /* set G3 to 94 x 94 char set */
 27.1790 +      ch = Agetchar();
 27.1791 +      gn[3] = ch << 16;
 27.1792 +      gndbl[3] = 1;
 27.1793 +      return iso2022();
 27.1794 +    default:
 27.1795 +      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
 27.1796 +        gn[0] = (ch & ~0x200) << 16;
 27.1797 +        gndbl[0] = 1;
 27.1798 +        return iso2022();
 27.1799 +        }
 27.1800 +      }
 27.1801 +
 27.1802 +  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
 27.1803 +    if (gndbl[gl]) {
 27.1804 +      ch2 = Agetchar();
 27.1805 +      return gn[gl] | (ch << 8) | ch2;
 27.1806 +      }
 27.1807 +    else return gn[gl] | ch;
 27.1808 +    }
 27.1809 +  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
 27.1810 +    if (gndbl[gr]) {
 27.1811 +      ch2 = Agetchar();
 27.1812 +      return gn[gr] | (ch << 8) | ch2;
 27.1813 +      }
 27.1814 +    else return gn[gr] | (ch & ~0x80);
 27.1815 +    }
 27.1816 +  else return ch;
 27.1817 +  }
 27.1818 +
 27.1819 +/****************************************************************************
 27.1820 +
 27.1821 +  ungetinchr
 27.1822 +
 27.1823 +  Called by main.  Pushes back an "inchr" to be read by getinchr
 27.1824 +  on the next call.
 27.1825 +
 27.1826 +******************************************************************************/
 27.1827 +inchr getinchr_buffer;
 27.1828 +int getinchr_flag;
 27.1829 +
 27.1830 +inchr ungetinchr(c)
 27.1831 +inchr c;
 27.1832 +{
 27.1833 +  getinchr_buffer = c;
 27.1834 +  getinchr_flag = 1;
 27.1835 +  return c;
 27.1836 +}
 27.1837 +
 27.1838 +/*****************************************************************************
 27.1839 +
 27.1840 +  getinchr
 27.1841 +
 27.1842 +  Called by main.  Processes multibyte characters.  Invokes Agetchar.
 27.1843 +  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
 27.1844 +  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
 27.1845 +    0x80-0xFF bytes are first byte of a double-byte character).
 27.1846 +  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
 27.1847 +    0x80-0xBF bytes are nonfirst byte of a multibyte character,
 27.1848 +    0xC0-0xFD bytes are first byte of a multibyte character,
 27.1849 +    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
 27.1850 +  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
 27.1851 +    "~~" is a tilde, "~x" for all other x is ignored).
 27.1852 +  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
 27.1853 +    of a double-byte character, all other bytes are characters).
 27.1854 + 
 27.1855 +
 27.1856 +*****************************************************************************/
 27.1857 +
 27.1858 +inchr getinchr()
 27.1859 +{
 27.1860 +  int ch, ch2, ch3, ch4, ch5, ch6;
 27.1861 +
 27.1862 +  if (getinchr_flag) {
 27.1863 +    getinchr_flag = 0;
 27.1864 +    return getinchr_buffer;
 27.1865 +    }
 27.1866 +
 27.1867 +  switch(multibyte) {
 27.1868 +    case 0: /* single-byte */
 27.1869 +      return iso2022();
 27.1870 +   case 1: /* DBCS */
 27.1871 +     ch = Agetchar();
 27.1872 +     if ((ch >= 0x80 && ch <= 0x9F) ||
 27.1873 +         (ch >= 0xE0 && ch <= 0xEF)) {
 27.1874 +       ch = (ch << 8) + Agetchar();
 27.1875 +       }
 27.1876 +     return ch;
 27.1877 +   case 2: /* UTF-8 */
 27.1878 +      ch = Agetchar();
 27.1879 +      if (ch < 0x80) return ch;  /* handles EOF, too */
 27.1880 +      if (ch < 0xC0 || ch > 0xFD)
 27.1881 +        return 0x0080;  /* illegal first character */
 27.1882 +      ch2 = Agetchar() & 0x3F;
 27.1883 +      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
 27.1884 +      ch3 = Agetchar() & 0x3F;
 27.1885 +      if (ch < 0xF0)
 27.1886 +        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
 27.1887 +      ch4 = Agetchar() & 0x3F;
 27.1888 +      if (ch < 0xF8)
 27.1889 +        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
 27.1890 +      ch5 = Agetchar() & 0x3F;
 27.1891 +      if (ch < 0xFC)
 27.1892 +        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
 27.1893 +          (ch4 << 6) + ch5;
 27.1894 +      ch6 = Agetchar() & 0x3F;
 27.1895 +      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
 27.1896 +        (ch4 << 12) + (ch5 << 6) + ch6;
 27.1897 +   case 3: /* HZ */
 27.1898 +     ch = Agetchar();
 27.1899 +     if (ch == EOF) return ch;
 27.1900 +     if (hzmode) {
 27.1901 +       ch = (ch << 8) + Agetchar();
 27.1902 +       if (ch == ('}' << 8) + '~') {
 27.1903 +         hzmode = 0;
 27.1904 +         return getinchr();
 27.1905 +         }
 27.1906 +       return ch;
 27.1907 +       }
 27.1908 +     else if (ch == '~') {
 27.1909 +       ch = Agetchar();
 27.1910 +       if (ch == '{') {
 27.1911 +          hzmode = 1;
 27.1912 +          return getinchr();
 27.1913 +          }
 27.1914 +      else if (ch == '~') {
 27.1915 +        return ch;
 27.1916 +        }
 27.1917 +      else {
 27.1918 +        return getinchr();
 27.1919 +        }
 27.1920 +      }
 27.1921 +     else return ch;
 27.1922 +   case 4: /* Shift-JIS */
 27.1923 +     ch = Agetchar();
 27.1924 +     if ((ch >= 0x80 && ch <= 0x9F) ||
 27.1925 +         (ch >= 0xE0 && ch <= 0xEF)) {
 27.1926 +       ch = (ch << 8) + Agetchar();
 27.1927 +       }
 27.1928 +     return ch;
 27.1929 +   default:
 27.1930 +     return 0x80;
 27.1931 +    }
 27.1932 +  }
 27.1933 +
 27.1934 +/****************************************************************************
 27.1935 +
 27.1936 +  main
 27.1937 +
 27.1938 +  The main program, of course.
 27.1939 +  Reads characters 1 by 1 from stdin, and makes lines out of them using
 27.1940 +  addchar. Handles line breaking, (which accounts for most of the
 27.1941 +  complexity in this function).
 27.1942 +
 27.1943 +****************************************************************************/
 27.1944 +
 27.1945 +int main(argc,argv)
 27.1946 +int argc;
 27.1947 +char *argv[];
 27.1948 +{
 27.1949 +  inchr c,c2;
 27.1950 +  int i;
 27.1951 +  int last_was_eol_flag;
 27.1952 +/*---------------------------------------------------------------------------
 27.1953 +  wordbreakmode:
 27.1954 +    -1: /^$/ and blanks are to be absorbed (when line break was forced
 27.1955 +      by a blank or character larger than outlinelenlimit)
 27.1956 +    0: /^ *$/ and blanks are not to be absorbed
 27.1957 +    1: /[^ ]$/ no word break yet
 27.1958 +    2: /[^ ]  *$/
 27.1959 +    3: /[^ ]$/ had a word break
 27.1960 +---------------------------------------------------------------------------*/
 27.1961 +  int wordbreakmode;
 27.1962 +  int char_not_added;
 27.1963 +
 27.1964 +  Myargc = argc;
 27.1965 +  Myargv = argv;
 27.1966 +  getparams();
 27.1967 +  readcontrolfiles();
 27.1968 +  readfont();
 27.1969 +  linealloc();
 27.1970 +
 27.1971 +  wordbreakmode = 0;
 27.1972 +  last_was_eol_flag = 0;
 27.1973 +
 27.1974 +  while ((c = getinchr())!=EOF) {
 27.1975 +
 27.1976 +    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
 27.1977 +      ungetinchr(c2 = getinchr());
 27.1978 +      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
 27.1979 +      }
 27.1980 +    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
 27.1981 +
 27.1982 +    if (deutschflag) {
 27.1983 +      if (c>='[' && c<=']') {
 27.1984 +        c = deutsch[c-'['];
 27.1985 +        }
 27.1986 +      else if (c >='{' && c <= '~') {
 27.1987 +        c = deutsch[c-'{'+3];
 27.1988 +        }
 27.1989 +      }
 27.1990 +
 27.1991 +    c = handlemapping(c);
 27.1992 +
 27.1993 +    if (isascii(c)&&isspace(c)) {
 27.1994 +      c = (c=='\t'||c==' ') ? ' ' : '\n';
 27.1995 +      }
 27.1996 +
 27.1997 +    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
 27.1998 +
 27.1999 +/*
 27.2000 +  Note: The following code is complex and thoroughly tested.
 27.2001 +  Be careful when modifying!
 27.2002 +*/
 27.2003 +
 27.2004 +    do {
 27.2005 +      char_not_added = 0;
 27.2006 +
 27.2007 +      if (wordbreakmode== -1) {
 27.2008 +        if (c==' ') {
 27.2009 +          break;
 27.2010 +          }
 27.2011 +        else if (c=='\n') {
 27.2012 +          wordbreakmode = 0;
 27.2013 +          break;
 27.2014 +          }
 27.2015 +        wordbreakmode = 0;
 27.2016 +        }
 27.2017 +
 27.2018 +      if (c=='\n') {
 27.2019 +        printline();
 27.2020 +        wordbreakmode = 0;
 27.2021 +        }
 27.2022 +
 27.2023 +      else if (addchar(c)) {
 27.2024 +        if (c!=' ') {
 27.2025 +          wordbreakmode = (wordbreakmode>=2)?3:1;
 27.2026 +          }
 27.2027 +        else {
 27.2028 +          wordbreakmode = (wordbreakmode>0)?2:0;
 27.2029 +          }
 27.2030 +        }
 27.2031 +
 27.2032 +      else if (outlinelen==0) {
 27.2033 +        for (i=0;i<charheight;i++) {
 27.2034 +          if (right2left && outputwidth>1) {
 27.2035 +            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
 27.2036 +            }
 27.2037 +          else {
 27.2038 +            putstring(currchar[i]);
 27.2039 +            }
 27.2040 +          }
 27.2041 +        wordbreakmode = -1;
 27.2042 +        }
 27.2043 +
 27.2044 +      else if (c==' ') {
 27.2045 +        if (wordbreakmode==2) {
 27.2046 +          splitline();
 27.2047 +          }
 27.2048 +        else {
 27.2049 +          printline();
 27.2050 +          }
 27.2051 +        wordbreakmode = -1;
 27.2052 +        }
 27.2053 +
 27.2054 +      else {
 27.2055 +        if (wordbreakmode>=2) {
 27.2056 +          splitline();
 27.2057 +          }
 27.2058 +        else {
 27.2059 +          printline();
 27.2060 +          }
 27.2061 +        wordbreakmode = (wordbreakmode==3)?1:0;
 27.2062 +        char_not_added = 1;
 27.2063 +        }
 27.2064 +
 27.2065 +      } while (char_not_added);
 27.2066 +    }
 27.2067 +
 27.2068 +  if (outlinelen!=0) {
 27.2069 +    printline();
 27.2070 +    }
 27.2071 +
 27.2072 +  /* XXX Xen hack -- finish off the C macro output */
 27.2073 +  if ( nr_chars != 0 )
 27.2074 +      putchar('"');
 27.2075 +  putchar('\n');
 27.2076 +
 27.2077 +  exit(0);
 27.2078 +}
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/xen/tools/figlet/xen.flf	Wed Dec 29 14:42:47 2004 +0000
    28.3 @@ -0,0 +1,2230 @@
    28.4 +flf2a$ 6 5 16 15 14 0 24463 229
    28.5 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    28.6 +Includes ISO Latin-1
    28.7 +figlet release 2.1 -- 12 Aug 1994
    28.8 +Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    28.9 +  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   28.10 +Permission is hereby given to modify this font, as long as the
   28.11 +modifier's name is placed on a comment line.
   28.12 +
   28.13 +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   28.14 +supported by FIGlet and FIGWin.  May also be slightly modified for better use
   28.15 +of new full-width/kern/smush alternatives, but default output is NOT changed.
   28.16 +
   28.17 +Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   28.18 +
   28.19 + $@
   28.20 + $@
   28.21 + $@
   28.22 + $@
   28.23 + $@
   28.24 + $@@
   28.25 +  _ @
   28.26 + | |@
   28.27 + | |@
   28.28 + |_|@
   28.29 + (_)@
   28.30 +    @@
   28.31 +  _ _ @
   28.32 + ( | )@
   28.33 +  V V @
   28.34 +   $  @
   28.35 +   $  @
   28.36 +      @@
   28.37 +    _  _   @
   28.38 +  _| || |_ @
   28.39 + |_  ..  _|@
   28.40 + |_      _|@
   28.41 +   |_||_|  @
   28.42 +           @@
   28.43 +   _  @
   28.44 +  | | @
   28.45 + / __)@
   28.46 + \__ \@
   28.47 + (   /@
   28.48 +  |_| @@
   28.49 +  _  __@
   28.50 + (_)/ /@
   28.51 +   / / @
   28.52 +  / /_ @
   28.53 + /_/(_)@
   28.54 +       @@
   28.55 +   ___   @
   28.56 +  ( _ )  @
   28.57 +  / _ \/\@
   28.58 + | (_>  <@
   28.59 +  \___/\/@
   28.60 +         @@
   28.61 +  _ @
   28.62 + ( )@
   28.63 + |/ @
   28.64 +  $ @
   28.65 +  $ @
   28.66 +    @@
   28.67 +   __@
   28.68 +  / /@
   28.69 + | | @
   28.70 + | | @
   28.71 + | | @
   28.72 +  \_\@@
   28.73 + __  @
   28.74 + \ \ @
   28.75 +  | |@
   28.76 +  | |@
   28.77 +  | |@
   28.78 + /_/ @@
   28.79 +       @
   28.80 + __/\__@
   28.81 + \    /@
   28.82 + /_  _\@
   28.83 +   \/  @
   28.84 +       @@
   28.85 +        @
   28.86 +    _   @
   28.87 +  _| |_ @
   28.88 + |_   _|@
   28.89 +   |_|  @
   28.90 +        @@
   28.91 +    @
   28.92 +    @
   28.93 +    @
   28.94 +  _ @
   28.95 + ( )@
   28.96 + |/ @@
   28.97 +     @
   28.98 +     @
   28.99 +  __ @
  28.100 + |__|@
  28.101 +  $  @
  28.102 +     @@
  28.103 +    @
  28.104 +    @
  28.105 +    @
  28.106 +  _ @
  28.107 + (_)@
  28.108 +    @@
  28.109 +     __@
  28.110 +    / /@
  28.111 +   / / @
  28.112 +  / /  @
  28.113 + /_/   @
  28.114 +       @@
  28.115 +   ___  @
  28.116 +  / _ \ @
  28.117 + | | | |@
  28.118 + | |_| |@
  28.119 +  \___/ @
  28.120 +        @@
  28.121 +  _ @
  28.122 + / |@
  28.123 + | |@
  28.124 + | |@
  28.125 + |_|@
  28.126 +    @@
  28.127 +  ____  @
  28.128 + |___ \ @
  28.129 +   __) |@
  28.130 +  / __/ @
  28.131 + |_____|@
  28.132 +        @@
  28.133 +  _____ @
  28.134 + |___ / @
  28.135 +   |_ \ @
  28.136 +  ___) |@
  28.137 + |____/ @
  28.138 +        @@
  28.139 +  _  _   @
  28.140 + | || |  @
  28.141 + | || |_ @
  28.142 + |__   _|@
  28.143 +    |_|  @
  28.144 +         @@
  28.145 +  ____  @
  28.146 + | ___| @
  28.147 + |___ \ @
  28.148 +  ___) |@
  28.149 + |____/ @
  28.150 +        @@
  28.151 +   __   @
  28.152 +  / /_  @
  28.153 + | '_ \ @
  28.154 + | (_) |@
  28.155 +  \___/ @
  28.156 +        @@
  28.157 +  _____ @
  28.158 + |___  |@
  28.159 +    / / @
  28.160 +   / /  @
  28.161 +  /_/   @
  28.162 +        @@
  28.163 +   ___  @
  28.164 +  ( _ ) @
  28.165 +  / _ \ @
  28.166 + | (_) |@
  28.167 +  \___/ @
  28.168 +        @@
  28.169 +   ___  @
  28.170 +  / _ \ @
  28.171 + | (_) |@
  28.172 +  \__, |@
  28.173 +    /_/ @
  28.174 +        @@
  28.175 +    @
  28.176 +  _ @
  28.177 + (_)@
  28.178 +  _ @
  28.179 + (_)@
  28.180 +    @@
  28.181 +    @
  28.182 +  _ @
  28.183 + (_)@
  28.184 +  _ @
  28.185 + ( )@
  28.186 + |/ @@
  28.187 +   __@
  28.188 +  / /@
  28.189 + / / @
  28.190 + \ \ @
  28.191 +  \_\@
  28.192 +     @@
  28.193 +        @
  28.194 +  _____ @
  28.195 + |_____|@
  28.196 + |_____|@
  28.197 +    $   @
  28.198 +        @@
  28.199 + __  @
  28.200 + \ \ @
  28.201 +  \ \@
  28.202 +  / /@
  28.203 + /_/ @
  28.204 +     @@
  28.205 +  ___ @
  28.206 + |__ \@
  28.207 +   / /@
  28.208 +  |_| @
  28.209 +  (_) @
  28.210 +      @@
  28.211 +    ____  @
  28.212 +   / __ \ @
  28.213 +  / / _` |@
  28.214 + | | (_| |@
  28.215 +  \ \__,_|@
  28.216 +   \____/ @@
  28.217 +     _    @
  28.218 +    / \   @
  28.219 +   / _ \  @
  28.220 +  / ___ \ @
  28.221 + /_/   \_\@
  28.222 +          @@
  28.223 +  ____  @
  28.224 + | __ ) @
  28.225 + |  _ \ @
  28.226 + | |_) |@
  28.227 + |____/ @
  28.228 +        @@
  28.229 +   ____ @
  28.230 +  / ___|@
  28.231 + | |    @
  28.232 + | |___ @
  28.233 +  \____|@
  28.234 +        @@
  28.235 +  ____  @
  28.236 + |  _ \ @
  28.237 + | | | |@
  28.238 + | |_| |@
  28.239 + |____/ @
  28.240 +        @@
  28.241 +  _____ @
  28.242 + | ____|@
  28.243 + |  _|  @
  28.244 + | |___ @
  28.245 + |_____|@
  28.246 +        @@
  28.247 +  _____ @
  28.248 + |  ___|@
  28.249 + | |_   @
  28.250 + |  _|  @
  28.251 + |_|    @
  28.252 +        @@
  28.253 +   ____ @
  28.254 +  / ___|@
  28.255 + | |  _ @
  28.256 + | |_| |@
  28.257 +  \____|@
  28.258 +        @@
  28.259 +  _   _ @
  28.260 + | | | |@
  28.261 + | |_| |@
  28.262 + |  _  |@
  28.263 + |_| |_|@
  28.264 +        @@
  28.265 +  ___ @
  28.266 + |_ _|@
  28.267 +  | | @
  28.268 +  | | @
  28.269 + |___|@
  28.270 +      @@
  28.271 +      _ @
  28.272 +     | |@
  28.273 +  _  | |@
  28.274 + | |_| |@
  28.275 +  \___/ @
  28.276 +        @@
  28.277 +  _  __@
  28.278 + | |/ /@
  28.279 + | ' / @
  28.280 + | . \ @
  28.281 + |_|\_\@
  28.282 +       @@
  28.283 +  _     @
  28.284 + | |    @
  28.285 + | |    @
  28.286 + | |___ @
  28.287 + |_____|@
  28.288 +        @@
  28.289 +  __  __ @
  28.290 + |  \/  |@
  28.291 + | |\/| |@
  28.292 + | |  | |@
  28.293 + |_|  |_|@
  28.294 +         @@
  28.295 +  _   _ @
  28.296 + | \ | |@
  28.297 + |  \| |@
  28.298 + | |\  |@
  28.299 + |_| \_|@
  28.300 +        @@
  28.301 +   ___  @
  28.302 +  / _ \ @
  28.303 + | | | |@
  28.304 + | |_| |@
  28.305 +  \___/ @
  28.306 +        @@
  28.307 +  ____  @
  28.308 + |  _ \ @
  28.309 + | |_) |@
  28.310 + |  __/ @
  28.311 + |_|    @
  28.312 +        @@
  28.313 +   ___  @
  28.314 +  / _ \ @
  28.315 + | | | |@
  28.316 + | |_| |@
  28.317 +  \__\_\@
  28.318 +        @@
  28.319 +  ____  @
  28.320 + |  _ \ @
  28.321 + | |_) |@
  28.322 + |  _ < @
  28.323 + |_| \_\@
  28.324 +        @@
  28.325 +  ____  @
  28.326 + / ___| @
  28.327 + \___ \ @
  28.328 +  ___) |@
  28.329 + |____/ @
  28.330 +        @@
  28.331 +  _____ @
  28.332 + |_   _|@
  28.333 +   | |  @
  28.334 +   | |  @
  28.335 +   |_|  @
  28.336 +        @@
  28.337 +  _   _ @
  28.338 + | | | |@
  28.339 + | | | |@
  28.340 + | |_| |@
  28.341 +  \___/ @
  28.342 +        @@
  28.343 + __     __@
  28.344 + \ \   / /@
  28.345 +  \ \ / / @
  28.346 +   \ V /  @
  28.347 +    \_/   @
  28.348 +          @@
  28.349 + __        __@
  28.350 + \ \      / /@
  28.351 +  \ \ /\ / / @
  28.352 +   \ V  V /  @
  28.353 +    \_/\_/   @
  28.354 +             @@
  28.355 + __  __@
  28.356 + \ \/ /@
  28.357 +  \  / @
  28.358 +  /  \ @
  28.359 + /_/\_\@
  28.360 +       @@
  28.361 + __   __@
  28.362 + \ \ / /@
  28.363 +  \ V / @
  28.364 +   | |  @
  28.365 +   |_|  @
  28.366 +        @@
  28.367 +  _____@
  28.368 + |__  /@
  28.369 +   / / @
  28.370 +  / /_ @
  28.371 + /____|@
  28.372 +       @@
  28.373 +  __ @
  28.374 + | _|@
  28.375 + | | @
  28.376 + | | @
  28.377 + | | @
  28.378 + |__|@@
  28.379 + __    @
  28.380 + \ \   @
  28.381 +  \ \  @
  28.382 +   \ \ @
  28.383 +    \_\@
  28.384 +       @@
  28.385 +  __ @
  28.386 + |_ |@
  28.387 +  | |@
  28.388 +  | |@
  28.389 +  | |@
  28.390 + |__|@@
  28.391 +  /\ @
  28.392 + |/\|@
  28.393 +   $ @
  28.394 +   $ @
  28.395 +   $ @
  28.396 +     @@
  28.397 +        @
  28.398 +        @
  28.399 +        @
  28.400 +        @
  28.401 +  _____ @
  28.402 + |_____|@@
  28.403 +  _ @
  28.404 + ( )@
  28.405 +  \|@
  28.406 +  $ @
  28.407 +  $ @
  28.408 +    @@
  28.409 +        @
  28.410 +   __ _ @
  28.411 +  / _` |@
  28.412 + | (_| |@
  28.413 +  \__,_|@
  28.414 +        @@
  28.415 +  _     @
  28.416 + | |__  @
  28.417 + | '_ \ @
  28.418 + | |_) |@
  28.419 + |_.__/ @
  28.420 +        @@
  28.421 +       @
  28.422 +   ___ @
  28.423 +  / __|@
  28.424 + | (__ @
  28.425 +  \___|@
  28.426 +       @@
  28.427 +      _ @
  28.428 +   __| |@
  28.429 +  / _` |@
  28.430 + | (_| |@
  28.431 +  \__,_|@
  28.432 +        @@
  28.433 +       @
  28.434 +   ___ @
  28.435 +  / _ \@
  28.436 + |  __/@
  28.437 +  \___|@
  28.438 +       @@
  28.439 +   __ @
  28.440 +  / _|@
  28.441 + | |_ @
  28.442 + |  _|@
  28.443 + |_|  @
  28.444 +      @@
  28.445 +        @
  28.446 +   __ _ @
  28.447 +  / _` |@
  28.448 + | (_| |@
  28.449 +  \__, |@
  28.450 +  |___/ @@
  28.451 +  _     @
  28.452 + | |__  @
  28.453 + | '_ \ @
  28.454 + | | | |@
  28.455 + |_| |_|@
  28.456 +        @@
  28.457 +  _ @
  28.458 + (_)@
  28.459 + | |@
  28.460 + | |@
  28.461 + |_|@
  28.462 +    @@
  28.463 +    _ @
  28.464 +   (_)@
  28.465 +   | |@
  28.466 +   | |@
  28.467 +  _/ |@
  28.468 + |__/ @@
  28.469 +  _    @
  28.470 + | | __@
  28.471 + | |/ /@
  28.472 + |   < @
  28.473 + |_|\_\@
  28.474 +       @@
  28.475 +  _ @
  28.476 + | |@
  28.477 + | |@
  28.478 + | |@
  28.479 + |_|@
  28.480 +    @@
  28.481 +            @
  28.482 +  _ __ ___  @
  28.483 + | '_ ` _ \ @
  28.484 + | | | | | |@
  28.485 + |_| |_| |_|@
  28.486 +            @@
  28.487 +        @
  28.488 +  _ __  @
  28.489 + | '_ \ @
  28.490 + | | | |@
  28.491 + |_| |_|@
  28.492 +        @@
  28.493 +        @
  28.494 +   ___  @
  28.495 +  / _ \ @
  28.496 + | (_) |@
  28.497 +  \___/ @
  28.498 +        @@
  28.499 +        @
  28.500 +  _ __  @
  28.501 + | '_ \ @
  28.502 + | |_) |@
  28.503 + | .__/ @
  28.504 + |_|    @@
  28.505 +        @
  28.506 +   __ _ @
  28.507 +  / _` |@
  28.508 + | (_| |@
  28.509 +  \__, |@
  28.510 +     |_|@@
  28.511 +       @
  28.512 +  _ __ @
  28.513 + | '__|@
  28.514 + | |   @
  28.515 + |_|   @
  28.516 +       @@
  28.517 +      @
  28.518 +  ___ @
  28.519 + / __|@
  28.520 + \__ \@
  28.521 + |___/@
  28.522 +      @@
  28.523 +  _   @
  28.524 + | |_ @
  28.525 + | __|@
  28.526 + | |_ @
  28.527 +  \__|@
  28.528 +      @@
  28.529 +        @
  28.530 +  _   _ @
  28.531 + | | | |@
  28.532 + | |_| |@
  28.533 +  \__,_|@
  28.534 +        @@
  28.535 +        @
  28.536 + __   __@
  28.537 + \ \ / /@
  28.538 +  \ V / @
  28.539 +   \_/  @
  28.540 +        @@
  28.541 +           @
  28.542 + __      __@
  28.543 + \ \ /\ / /@
  28.544 +  \ V  V / @
  28.545 +   \_/\_/  @
  28.546 +           @@
  28.547 +       @
  28.548 + __  __@
  28.549 + \ \/ /@
  28.550 +  >  < @
  28.551 + /_/\_\@
  28.552 +       @@
  28.553 +        @
  28.554 +  _   _ @
  28.555 + | | | |@
  28.556 + | |_| |@
  28.557 +  \__, |@
  28.558 +  |___/ @@
  28.559 +      @
  28.560 +  ____@
  28.561 + |_  /@
  28.562 +  / / @
  28.563 + /___|@
  28.564 +      @@
  28.565 +    __@
  28.566 +   / /@
  28.567 +  | | @
  28.568 + < <  @
  28.569 +  | | @
  28.570 +   \_\@@
  28.571 +  _ @
  28.572 + | |@
  28.573 + | |@
  28.574 + | |@
  28.575 + | |@
  28.576 + |_|@@
  28.577 + __   @
  28.578 + \ \  @
  28.579 +  | | @
  28.580 +   > >@
  28.581 +  | | @
  28.582 + /_/  @@
  28.583 +  /\/|@
  28.584 + |/\/ @
  28.585 +   $  @
  28.586 +   $  @
  28.587 +   $  @
  28.588 +      @@
  28.589 +  _   _ @
  28.590 + (_)_(_)@
  28.591 +   /_\  @
  28.592 +  / _ \ @
  28.593 + /_/ \_\@
  28.594 +        @@
  28.595 +  _   _ @
  28.596 + (_)_(_)@
  28.597 +  / _ \ @
  28.598 + | |_| |@
  28.599 +  \___/ @
  28.600 +        @@
  28.601 +  _   _ @
  28.602 + (_) (_)@
  28.603 + | | | |@
  28.604 + | |_| |@
  28.605 +  \___/ @
  28.606 +        @@
  28.607 +  _   _ @
  28.608 + (_)_(_)@
  28.609 +  / _` |@
  28.610 + | (_| |@
  28.611 +  \__,_|@
  28.612 +        @@
  28.613 +  _   _ @
  28.614 + (_)_(_)@
  28.615 +  / _ \ @
  28.616 + | (_) |@
  28.617 +  \___/ @
  28.618 +        @@
  28.619 +  _   _ @
  28.620 + (_) (_)@
  28.621 + | | | |@
  28.622 + | |_| |@
  28.623 +  \__,_|@
  28.624 +        @@
  28.625 +   ___ @
  28.626 +  / _ \@
  28.627 + | |/ /@
  28.628 + | |\ \@
  28.629 + | ||_/@
  28.630 + |_|   @@
  28.631 +160  NO-BREAK SPACE
  28.632 + $@
  28.633 + $@
  28.634 + $@
  28.635 + $@
  28.636 + $@
  28.637 + $@@
  28.638 +161  INVERTED EXCLAMATION MARK
  28.639 +  _ @
  28.640 + (_)@
  28.641 + | |@
  28.642 + | |@
  28.643 + |_|@
  28.644 +    @@
  28.645 +162  CENT SIGN
  28.646 +    _  @
  28.647 +   | | @
  28.648 +  / __)@
  28.649 + | (__ @
  28.650 +  \   )@
  28.651 +   |_| @@
  28.652 +163  POUND SIGN
  28.653 +    ___  @
  28.654 +   / ,_\ @
  28.655 + _| |_   @
  28.656 +  | |___ @
  28.657 + (_,____|@
  28.658 +         @@
  28.659 +164  CURRENCY SIGN
  28.660 + /\___/\@
  28.661 + \  _  /@
  28.662 + | (_) |@
  28.663 + / ___ \@
  28.664 + \/   \/@
  28.665 +        @@
  28.666 +165  YEN SIGN
  28.667 +  __ __ @
  28.668 +  \ V / @
  28.669 + |__ __|@
  28.670 + |__ __|@
  28.671 +   |_|  @
  28.672 +        @@
  28.673 +166  BROKEN BAR
  28.674 +  _ @
  28.675 + | |@
  28.676 + |_|@
  28.677 +  _ @
  28.678 + | |@
  28.679 + |_|@@
  28.680 +167  SECTION SIGN
  28.681 +    __ @
  28.682 +  _/ _)@
  28.683 + / \ \ @
  28.684 + \ \\ \@
  28.685 +  \ \_/@
  28.686 + (__/  @@
  28.687 +168  DIAERESIS
  28.688 +  _   _ @
  28.689 + (_) (_)@
  28.690 +  $   $ @
  28.691 +  $   $ @
  28.692 +  $   $ @
  28.693 +        @@
  28.694 +169  COPYRIGHT SIGN
  28.695 +    _____   @
  28.696 +   / ___ \  @
  28.697 +  / / __| \ @
  28.698 + | | (__   |@
  28.699 +  \ \___| / @
  28.700 +   \_____/  @@
  28.701 +170  FEMININE ORDINAL INDICATOR
  28.702 +  __ _ @
  28.703 + / _` |@
  28.704 + \__,_|@
  28.705 + |____|@
  28.706 +    $  @
  28.707 +       @@
  28.708 +171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  28.709 +   ____@
  28.710 +  / / /@
  28.711 + / / / @
  28.712 + \ \ \ @
  28.713 +  \_\_\@
  28.714 +       @@
  28.715 +172  NOT SIGN
  28.716 +        @
  28.717 +  _____ @
  28.718 + |___  |@
  28.719 +     |_|@
  28.720 +    $   @
  28.721 +        @@
  28.722 +173  SOFT HYPHEN
  28.723 +       @
  28.724 +       @
  28.725 +  ____ @
  28.726 + |____|@
  28.727 +    $  @
  28.728 +       @@
  28.729 +174  REGISTERED SIGN
  28.730 +    _____   @
  28.731 +   / ___ \  @
  28.732 +  / | _ \ \ @
  28.733 + |  |   /  |@
  28.734 +  \ |_|_\ / @
  28.735 +   \_____/  @@
  28.736 +175  MACRON
  28.737 +  _____ @
  28.738 + |_____|@
  28.739 +    $   @
  28.740 +    $   @
  28.741 +    $   @
  28.742 +        @@
  28.743 +176  DEGREE SIGN
  28.744 +   __  @
  28.745 +  /  \ @
  28.746 + | () |@
  28.747 +  \__/ @
  28.748 +    $  @
  28.749 +       @@
  28.750 +177  PLUS-MINUS SIGN
  28.751 +    _   @
  28.752 +  _| |_ @
  28.753 + |_   _|@
  28.754 +  _|_|_ @
  28.755 + |_____|@
  28.756 +        @@
  28.757 +178  SUPERSCRIPT TWO
  28.758 +  ___ @
  28.759 + |_  )@
  28.760 +  / / @
  28.761 + /___|@
  28.762 +   $  @
  28.763 +      @@
  28.764 +179  SUPERSCRIPT THREE
  28.765 +  ____@
  28.766 + |__ /@
  28.767 +  |_ \@
  28.768 + |___/@
  28.769 +   $  @
  28.770 +      @@
  28.771 +180  ACUTE ACCENT
  28.772 +  __@
  28.773 + /_/@
  28.774 +  $ @
  28.775 +  $ @
  28.776 +  $ @
  28.777 +    @@
  28.778 +181  MICRO SIGN
  28.779 +        @
  28.780 +  _   _ @
  28.781 + | | | |@
  28.782 + | |_| |@
  28.783 + | ._,_|@
  28.784 + |_|    @@
  28.785 +182  PILCROW SIGN
  28.786 +   _____ @
  28.787 +  /     |@
  28.788 + | (| | |@
  28.789 +  \__ | |@
  28.790 +    |_|_|@
  28.791 +         @@
  28.792 +183  MIDDLE DOT
  28.793 +    @
  28.794 +  _ @
  28.795 + (_)@
  28.796 +  $ @
  28.797 +  $ @
  28.798 +    @@
  28.799 +184  CEDILLA
  28.800 +    @
  28.801 +    @
  28.802 +    @
  28.803 +    @
  28.804 +  _ @
  28.805 + )_)@@
  28.806 +185  SUPERSCRIPT ONE
  28.807 +  _ @
  28.808 + / |@
  28.809 + | |@
  28.810 + |_|@
  28.811 +  $ @
  28.812 +    @@
  28.813 +186  MASCULINE ORDINAL INDICATOR
  28.814 +  ___ @
  28.815 + / _ \@
  28.816 + \___/@
  28.817 + |___|@
  28.818 +   $  @
  28.819 +      @@
  28.820 +187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  28.821 + ____  @
  28.822 + \ \ \ @
  28.823 +  \ \ \@
  28.824 +  / / /@
  28.825 + /_/_/ @
  28.826 +       @@
  28.827 +188  VULGAR FRACTION ONE QUARTER
  28.828 +  _   __    @
  28.829 + / | / / _  @
  28.830 + | |/ / | | @
  28.831 + |_/ /|_  _|@
  28.832 +  /_/   |_| @
  28.833 +            @@
  28.834 +189  VULGAR FRACTION ONE HALF
  28.835 +  _   __   @
  28.836 + / | / /__ @
  28.837 + | |/ /_  )@
  28.838 + |_/ / / / @
  28.839 +  /_/ /___|@
  28.840 +           @@
  28.841 +190  VULGAR FRACTION THREE QUARTERS
  28.842 +  ____  __    @
  28.843 + |__ / / / _  @
  28.844 +  |_ \/ / | | @
  28.845 + |___/ /|_  _|@
  28.846 +    /_/   |_| @
  28.847 +              @@
  28.848 +191  INVERTED QUESTION MARK
  28.849 +   _  @
  28.850 +  (_) @
  28.851 +  | | @
  28.852 + / /_ @
  28.853 + \___|@
  28.854 +      @@
  28.855 +192  LATIN CAPITAL LETTER A WITH GRAVE
  28.856 +   __   @
  28.857 +   \_\  @
  28.858 +   /_\  @
  28.859 +  / _ \ @
  28.860 + /_/ \_\@
  28.861 +        @@
  28.862 +193  LATIN CAPITAL LETTER A WITH ACUTE
  28.863 +    __  @
  28.864 +   /_/  @
  28.865 +   /_\  @
  28.866 +  / _ \ @
  28.867 + /_/ \_\@
  28.868 +        @@
  28.869 +194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  28.870 +   //\  @
  28.871 +  |/_\| @
  28.872 +   /_\  @
  28.873 +  / _ \ @
  28.874 + /_/ \_\@
  28.875 +        @@
  28.876 +195  LATIN CAPITAL LETTER A WITH TILDE
  28.877 +   /\/| @
  28.878 +  |/\/  @
  28.879 +   /_\  @
  28.880 +  / _ \ @
  28.881 + /_/ \_\@
  28.882 +        @@
  28.883 +196  LATIN CAPITAL LETTER A WITH DIAERESIS
  28.884 +  _   _ @
  28.885 + (_)_(_)@
  28.886 +   /_\  @
  28.887 +  / _ \ @
  28.888 + /_/ \_\@
  28.889 +        @@
  28.890 +197  LATIN CAPITAL LETTER A WITH RING ABOVE
  28.891 +    _   @
  28.892 +   (o)  @
  28.893 +   /_\  @
  28.894 +  / _ \ @
  28.895 + /_/ \_\@
  28.896 +        @@
  28.897 +198  LATIN CAPITAL LETTER AE
  28.898 +     ______ @
  28.899 +    /  ____|@
  28.900 +   / _  _|  @
  28.901 +  / __ |___ @
  28.902 + /_/ |_____|@
  28.903 +            @@
  28.904 +199  LATIN CAPITAL LETTER C WITH CEDILLA
  28.905 +   ____ @
  28.906 +  / ___|@
  28.907 + | |    @
  28.908 + | |___ @
  28.909 +  \____|@
  28.910 +    )_) @@
  28.911 +200  LATIN CAPITAL LETTER E WITH GRAVE
  28.912 +   __   @
  28.913 +  _\_\_ @
  28.914 + | ____|@
  28.915 + |  _|_ @
  28.916 + |_____|@
  28.917 +        @@
  28.918 +201  LATIN CAPITAL LETTER E WITH ACUTE
  28.919 +    __  @
  28.920 +  _/_/_ @
  28.921 + | ____|@
  28.922 + |  _|_ @
  28.923 + |_____|@
  28.924 +        @@
  28.925 +202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  28.926 +   //\  @
  28.927 +  |/_\| @
  28.928 + | ____|@
  28.929 + |  _|_ @
  28.930 + |_____|@
  28.931 +        @@
  28.932 +203  LATIN CAPITAL LETTER E WITH DIAERESIS
  28.933 +  _   _ @
  28.934 + (_)_(_)@
  28.935 + | ____|@
  28.936 + |  _|_ @
  28.937 + |_____|@
  28.938 +        @@
  28.939 +204  LATIN CAPITAL LETTER I WITH GRAVE
  28.940 +  __  @
  28.941 +  \_\ @
  28.942 + |_ _|@
  28.943 +  | | @
  28.944 + |___|@
  28.945 +      @@
  28.946 +205  LATIN CAPITAL LETTER I WITH ACUTE
  28.947 +   __ @
  28.948 +  /_/ @
  28.949 + |_ _|@
  28.950 +  | | @
  28.951 + |___|@
  28.952 +      @@
  28.953 +206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  28.954 +  //\ @
  28.955 + |/_\|@
  28.956 + |_ _|@
  28.957 +  | | @
  28.958 + |___|@
  28.959 +      @@
  28.960 +207  LATIN CAPITAL LETTER I WITH DIAERESIS
  28.961 +  _   _ @
  28.962 + (_)_(_)@
  28.963 +  |_ _| @
  28.964 +   | |  @
  28.965 +  |___| @
  28.966 +        @@
  28.967 +208  LATIN CAPITAL LETTER ETH
  28.968 +    ____  @
  28.969 +   |  _ \ @
  28.970 +  _| |_| |@
  28.971 + |__ __| |@
  28.972 +   |____/ @
  28.973 +          @@
  28.974 +209  LATIN CAPITAL LETTER N WITH TILDE
  28.975 +   /\/|@
  28.976 +  |/\/ @
  28.977 + | \| |@
  28.978 + | .` |@
  28.979 + |_|\_|@
  28.980 +       @@
  28.981 +210  LATIN CAPITAL LETTER O WITH GRAVE
  28.982 +   __   @
  28.983 +   \_\  @
  28.984 +  / _ \ @
  28.985 + | |_| |@
  28.986 +  \___/ @
  28.987 +        @@
  28.988 +211  LATIN CAPITAL LETTER O WITH ACUTE
  28.989 +    __  @
  28.990 +   /_/  @
  28.991 +  / _ \ @
  28.992 + | |_| |@
  28.993 +  \___/ @
  28.994 +        @@
  28.995 +212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  28.996 +   //\  @
  28.997 +  |/_\| @
  28.998 +  / _ \ @
  28.999 + | |_| |@
 28.1000 +  \___/ @
 28.1001 +        @@
 28.1002 +213  LATIN CAPITAL LETTER O WITH TILDE
 28.1003 +   /\/| @
 28.1004 +  |/\/  @
 28.1005 +  / _ \ @
 28.1006 + | |_| |@
 28.1007 +  \___/ @
 28.1008 +        @@
 28.1009 +214  LATIN CAPITAL LETTER O WITH DIAERESIS
 28.1010 +  _   _ @
 28.1011 + (_)_(_)@
 28.1012 +  / _ \ @
 28.1013 + | |_| |@
 28.1014 +  \___/ @
 28.1015 +        @@
 28.1016 +215  MULTIPLICATION SIGN
 28.1017 +     @
 28.1018 +     @
 28.1019 + /\/\@
 28.1020 + >  <@
 28.1021 + \/\/@
 28.1022 +     @@
 28.1023 +216  LATIN CAPITAL LETTER O WITH STROKE
 28.1024 +   ____ @
 28.1025 +  / _// @
 28.1026 + | |// |@
 28.1027 + | //| |@
 28.1028 +  //__/ @
 28.1029 +        @@
 28.1030 +217  LATIN CAPITAL LETTER U WITH GRAVE
 28.1031 +   __   @
 28.1032 +  _\_\_ @
 28.1033 + | | | |@
 28.1034 + | |_| |@
 28.1035 +  \___/ @
 28.1036 +        @@
 28.1037 +218  LATIN CAPITAL LETTER U WITH ACUTE
 28.1038 +    __  @
 28.1039 +  _/_/_ @
 28.1040 + | | | |@
 28.1041 + | |_| |@
 28.1042 +  \___/ @
 28.1043 +        @@
 28.1044 +219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 28.1045 +   //\  @
 28.1046 +  |/ \| @
 28.1047 + | | | |@
 28.1048 + | |_| |@
 28.1049 +  \___/ @
 28.1050 +        @@
 28.1051 +220  LATIN CAPITAL LETTER U WITH DIAERESIS
 28.1052 +  _   _ @
 28.1053 + (_) (_)@
 28.1054 + | | | |@
 28.1055 + | |_| |@
 28.1056 +  \___/ @
 28.1057 +        @@
 28.1058 +221  LATIN CAPITAL LETTER Y WITH ACUTE
 28.1059 +    __  @
 28.1060 + __/_/__@
 28.1061 + \ \ / /@
 28.1062 +  \ V / @
 28.1063 +   |_|  @
 28.1064 +        @@
 28.1065 +222  LATIN CAPITAL LETTER THORN
 28.1066 +  _     @
 28.1067 + | |___ @
 28.1068 + |  __ \@
 28.1069 + |  ___/@
 28.1070 + |_|    @
 28.1071 +        @@
 28.1072 +223  LATIN SMALL LETTER SHARP S
 28.1073 +   ___ @
 28.1074 +  / _ \@
 28.1075 + | |/ /@
 28.1076 + | |\ \@
 28.1077 + | ||_/@
 28.1078 + |_|   @@
 28.1079 +224  LATIN SMALL LETTER A WITH GRAVE
 28.1080 +   __   @
 28.1081 +   \_\_ @
 28.1082 +  / _` |@
 28.1083 + | (_| |@
 28.1084 +  \__,_|@
 28.1085 +        @@
 28.1086 +225  LATIN SMALL LETTER A WITH ACUTE
 28.1087 +    __  @
 28.1088 +   /_/_ @
 28.1089 +  / _` |@
 28.1090 + | (_| |@
 28.1091 +  \__,_|@
 28.1092 +        @@
 28.1093 +226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 28.1094 +   //\  @
 28.1095 +  |/_\| @
 28.1096 +  / _` |@
 28.1097 + | (_| |@
 28.1098 +  \__,_|@
 28.1099 +        @@
 28.1100 +227  LATIN SMALL LETTER A WITH TILDE
 28.1101 +   /\/| @
 28.1102 +  |/\/_ @
 28.1103 +  / _` |@
 28.1104 + | (_| |@
 28.1105 +  \__,_|@
 28.1106 +        @@
 28.1107 +228  LATIN SMALL LETTER A WITH DIAERESIS
 28.1108 +  _   _ @
 28.1109 + (_)_(_)@
 28.1110 +  / _` |@
 28.1111 + | (_| |@
 28.1112 +  \__,_|@
 28.1113 +        @@
 28.1114 +229  LATIN SMALL LETTER A WITH RING ABOVE
 28.1115 +    __  @
 28.1116 +   (()) @
 28.1117 +  / _ '|@
 28.1118 + | (_| |@
 28.1119 +  \__,_|@
 28.1120 +        @@
 28.1121 +230  LATIN SMALL LETTER AE
 28.1122 +           @
 28.1123 +   __ ____ @
 28.1124 +  / _`  _ \@
 28.1125 + | (_|  __/@
 28.1126 +  \__,____|@
 28.1127 +           @@
 28.1128 +231  LATIN SMALL LETTER C WITH CEDILLA
 28.1129 +       @
 28.1130 +   ___ @
 28.1131 +  / __|@
 28.1132 + | (__ @
 28.1133 +  \___|@
 28.1134 +   )_) @@
 28.1135 +232  LATIN SMALL LETTER E WITH GRAVE
 28.1136 +   __  @
 28.1137 +   \_\ @
 28.1138 +  / _ \@
 28.1139 + |  __/@
 28.1140 +  \___|@
 28.1141 +       @@
 28.1142 +233  LATIN SMALL LETTER E WITH ACUTE
 28.1143 +    __ @
 28.1144 +   /_/ @
 28.1145 +  / _ \@
 28.1146 + |  __/@
 28.1147 +  \___|@
 28.1148 +       @@
 28.1149 +234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 28.1150 +   //\ @
 28.1151 +  |/_\|@
 28.1152 +  / _ \@
 28.1153 + |  __/@
 28.1154 +  \___|@
 28.1155 +       @@
 28.1156 +235  LATIN SMALL LETTER E WITH DIAERESIS
 28.1157 +  _   _ @
 28.1158 + (_)_(_)@
 28.1159 +  / _ \ @
 28.1160 + |  __/ @
 28.1161 +  \___| @
 28.1162 +        @@
 28.1163 +236  LATIN SMALL LETTER I WITH GRAVE
 28.1164 + __ @
 28.1165 + \_\@
 28.1166 + | |@
 28.1167 + | |@
 28.1168 + |_|@
 28.1169 +    @@
 28.1170 +237  LATIN SMALL LETTER I WITH ACUTE
 28.1171 +  __@
 28.1172 + /_/@
 28.1173 + | |@
 28.1174 + | |@
 28.1175 + |_|@
 28.1176 +    @@
 28.1177 +238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 28.1178 +  //\ @
 28.1179 + |/_\|@
 28.1180 +  | | @
 28.1181 +  | | @
 28.1182 +  |_| @
 28.1183 +      @@
 28.1184 +239  LATIN SMALL LETTER I WITH DIAERESIS
 28.1185 +  _   _ @
 28.1186 + (_)_(_)@
 28.1187 +   | |  @
 28.1188 +   | |  @
 28.1189 +   |_|  @
 28.1190 +        @@
 28.1191 +240  LATIN SMALL LETTER ETH
 28.1192 +   /\/\ @
 28.1193 +   >  < @
 28.1194 +  _\/\ |@
 28.1195 + / __` |@
 28.1196 + \____/ @
 28.1197 +        @@
 28.1198 +241  LATIN SMALL LETTER N WITH TILDE
 28.1199 +   /\/| @
 28.1200 +  |/\/  @
 28.1201 + | '_ \ @
 28.1202 + | | | |@
 28.1203 + |_| |_|@
 28.1204 +        @@
 28.1205 +242  LATIN SMALL LETTER O WITH GRAVE
 28.1206 +   __   @
 28.1207 +   \_\  @
 28.1208 +  / _ \ @
 28.1209 + | (_) |@
 28.1210 +  \___/ @
 28.1211 +        @@
 28.1212 +243  LATIN SMALL LETTER O WITH ACUTE
 28.1213 +    __  @
 28.1214 +   /_/  @
 28.1215 +  / _ \ @
 28.1216 + | (_) |@
 28.1217 +  \___/ @
 28.1218 +        @@
 28.1219 +244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 28.1220 +   //\  @
 28.1221 +  |/_\| @
 28.1222 +  / _ \ @
 28.1223 + | (_) |@
 28.1224 +  \___/ @
 28.1225 +        @@
 28.1226 +245  LATIN SMALL LETTER O WITH TILDE
 28.1227 +   /\/| @
 28.1228 +  |/\/  @
 28.1229 +  / _ \ @
 28.1230 + | (_) |@
 28.1231 +  \___/ @
 28.1232 +        @@
 28.1233 +246  LATIN SMALL LETTER O WITH DIAERESIS
 28.1234 +  _   _ @
 28.1235 + (_)_(_)@
 28.1236 +  / _ \ @
 28.1237 + | (_) |@
 28.1238 +  \___/ @
 28.1239 +        @@
 28.1240 +247  DIVISION SIGN
 28.1241 +        @
 28.1242 +    _   @
 28.1243 +  _(_)_ @
 28.1244 + |_____|@
 28.1245 +   (_)  @
 28.1246 +        @@
 28.1247 +248  LATIN SMALL LETTER O WITH STROKE
 28.1248 +         @
 28.1249 +   ____  @
 28.1250 +  / _//\ @
 28.1251 + | (//) |@
 28.1252 +  \//__/ @
 28.1253 +         @@
 28.1254 +249  LATIN SMALL LETTER U WITH GRAVE
 28.1255 +   __   @
 28.1256 +  _\_\_ @
 28.1257 + | | | |@
 28.1258 + | |_| |@
 28.1259 +  \__,_|@
 28.1260 +        @@
 28.1261 +250  LATIN SMALL LETTER U WITH ACUTE
 28.1262 +    __  @
 28.1263 +  _/_/_ @
 28.1264 + | | | |@
 28.1265 + | |_| |@
 28.1266 +  \__,_|@
 28.1267 +        @@
 28.1268 +251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 28.1269 +   //\  @
 28.1270 +  |/ \| @
 28.1271 + | | | |@
 28.1272 + | |_| |@
 28.1273 +  \__,_|@
 28.1274 +        @@
 28.1275 +252  LATIN SMALL LETTER U WITH DIAERESIS
 28.1276 +  _   _ @
 28.1277 + (_) (_)@
 28.1278 + | | | |@
 28.1279 + | |_| |@
 28.1280 +  \__,_|@
 28.1281 +        @@
 28.1282 +253  LATIN SMALL LETTER Y WITH ACUTE
 28.1283 +    __  @
 28.1284 +  _/_/_ @
 28.1285 + | | | |@
 28.1286 + | |_| |@
 28.1287 +  \__, |@
 28.1288 +  |___/ @@
 28.1289 +254  LATIN SMALL LETTER THORN
 28.1290 +  _     @
 28.1291 + | |__  @
 28.1292 + | '_ \ @
 28.1293 + | |_) |@
 28.1294 + | .__/ @
 28.1295 + |_|    @@
 28.1296 +255  LATIN SMALL LETTER Y WITH DIAERESIS
 28.1297 +  _   _ @
 28.1298 + (_) (_)@
 28.1299 + | | | |@
 28.1300 + | |_| |@
 28.1301 +  \__, |@
 28.1302 +  |___/ @@
 28.1303 +0x0100  LATIN CAPITAL LETTER A WITH MACRON
 28.1304 +   ____ @
 28.1305 +  /___/ @
 28.1306 +   /_\  @
 28.1307 +  / _ \ @
 28.1308 + /_/ \_\@
 28.1309 +        @@
 28.1310 +0x0101  LATIN SMALL LETTER A WITH MACRON
 28.1311 +    ___ @
 28.1312 +   /_ _/@
 28.1313 +  / _` |@
 28.1314 + | (_| |@
 28.1315 +  \__,_|@
 28.1316 +        @@
 28.1317 +0x0102  LATIN CAPITAL LETTER A WITH BREVE
 28.1318 +  _   _ @
 28.1319 +  \\_// @
 28.1320 +   /_\  @
 28.1321 +  / _ \ @
 28.1322 + /_/ \_\@
 28.1323 +        @@
 28.1324 +0x0103  LATIN SMALL LETTER A WITH BREVE
 28.1325 +   \_/  @
 28.1326 +   ___  @
 28.1327 +  / _` |@
 28.1328 + | (_| |@
 28.1329 +  \__,_|@
 28.1330 +        @@
 28.1331 +0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 28.1332 +        @
 28.1333 +    _   @
 28.1334 +   /_\  @
 28.1335 +  / _ \ @
 28.1336 + /_/ \_\@
 28.1337 +     (_(@@
 28.1338 +0x0105  LATIN SMALL LETTER A WITH OGONEK
 28.1339 +        @
 28.1340 +   __ _ @
 28.1341 +  / _` |@
 28.1342 + | (_| |@
 28.1343 +  \__,_|@
 28.1344 +     (_(@@
 28.1345 +0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 28.1346 +     __ @
 28.1347 +   _/_/ @
 28.1348 +  / ___|@
 28.1349 + | |___ @
 28.1350 +  \____|@
 28.1351 +        @@
 28.1352 +0x0107  LATIN SMALL LETTER C WITH ACUTE
 28.1353 +    __ @
 28.1354 +   /__/@
 28.1355 +  / __|@
 28.1356 + | (__ @
 28.1357 +  \___|@
 28.1358 +       @@
 28.1359 +0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 28.1360 +     /\ @
 28.1361 +   _//\\@
 28.1362 +  / ___|@
 28.1363 + | |___ @
 28.1364 +  \____|@
 28.1365 +        @@
 28.1366 +0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 28.1367 +    /\ @
 28.1368 +   /_\ @
 28.1369 +  / __|@
 28.1370 + | (__ @
 28.1371 +  \___|@
 28.1372 +       @@
 28.1373 +0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 28.1374 +    []  @
 28.1375 +   ____ @
 28.1376 +  / ___|@
 28.1377 + | |___ @
 28.1378 +  \____|@
 28.1379 +        @@
 28.1380 +0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 28.1381 +   []  @
 28.1382 +   ___ @
 28.1383 +  / __|@
 28.1384 + | (__ @
 28.1385 +  \___|@
 28.1386 +       @@
 28.1387 +0x010C  LATIN CAPITAL LETTER C WITH CARON
 28.1388 +   \\// @
 28.1389 +   _\/_ @
 28.1390 +  / ___|@
 28.1391 + | |___ @
 28.1392 +  \____|@
 28.1393 +        @@
 28.1394 +0x010D  LATIN SMALL LETTER C WITH CARON
 28.1395 +   \\//@
 28.1396 +   _\/ @
 28.1397 +  / __|@
 28.1398 + | (__ @
 28.1399 +  \___|@
 28.1400 +       @@
 28.1401 +0x010E  LATIN CAPITAL LETTER D WITH CARON
 28.1402 +   \\// @
 28.1403 +  __\/  @
 28.1404 + |  _ \ @
 28.1405 + | |_| |@
 28.1406 + |____/ @
 28.1407 +        @@
 28.1408 +0x010F  LATIN SMALL LETTER D WITH CARON
 28.1409 +  \/  _ @
 28.1410 +   __| |@
 28.1411 +  / _` |@
 28.1412 + | (_| |@
 28.1413 +  \__,_|@
 28.1414 +        @@
 28.1415 +0x0110  LATIN CAPITAL LETTER D WITH STROKE
 28.1416 +   ____   @
 28.1417 +  |_ __ \ @
 28.1418 + /| |/ | |@
 28.1419 + /|_|/_| |@
 28.1420 +  |_____/ @
 28.1421 +          @@
 28.1422 +0x0111  LATIN SMALL LETTER D WITH STROKE
 28.1423 +    ---|@
 28.1424 +   __| |@
 28.1425 +  / _` |@
 28.1426 + | (_| |@
 28.1427 +  \__,_|@
 28.1428 +        @@
 28.1429 +0x0112  LATIN CAPITAL LETTER E WITH MACRON
 28.1430 +   ____ @
 28.1431 +  /___/ @
 28.1432 + | ____|@
 28.1433 + |  _|_ @
 28.1434 + |_____|@
 28.1435 +        @@
 28.1436 +0x0113  LATIN SMALL LETTER E WITH MACRON
 28.1437 +    ____@
 28.1438 +   /_ _/@
 28.1439 +  / _ \ @
 28.1440 + |  __/ @
 28.1441 +  \___| @
 28.1442 +        @@
 28.1443 +0x0114  LATIN CAPITAL LETTER E WITH BREVE
 28.1444 +  _   _ @
 28.1445 +  \\_// @
 28.1446 + | ____|@
 28.1447 + |  _|_ @
 28.1448 + |_____|@
 28.1449 +        @@
 28.1450 +0x0115  LATIN SMALL LETTER E WITH BREVE
 28.1451 +  \\  //@
 28.1452 +    --  @
 28.1453 +  / _ \ @
 28.1454 + |  __/ @
 28.1455 +  \___| @
 28.1456 +        @@
 28.1457 +0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 28.1458 +    []  @
 28.1459 +  _____ @
 28.1460 + | ____|@
 28.1461 + |  _|_ @
 28.1462 + |_____|@
 28.1463 +        @@
 28.1464 +0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 28.1465 +    [] @
 28.1466 +    __ @
 28.1467 +  / _ \@
 28.1468 + |  __/@
 28.1469 +  \___|@
 28.1470 +       @@
 28.1471 +0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 28.1472 +        @
 28.1473 +  _____ @
 28.1474 + | ____|@
 28.1475 + |  _|_ @
 28.1476 + |_____|@
 28.1477 +    (__(@@
 28.1478 +0x0119  LATIN SMALL LETTER E WITH OGONEK
 28.1479 +       @
 28.1480 +   ___ @
 28.1481 +  / _ \@
 28.1482 + |  __/@
 28.1483 +  \___|@
 28.1484 +    (_(@@
 28.1485 +0x011A  LATIN CAPITAL LETTER E WITH CARON
 28.1486 +   \\// @
 28.1487 +  __\/_ @
 28.1488 + | ____|@
 28.1489 + |  _|_ @
 28.1490 + |_____|@
 28.1491 +        @@
 28.1492 +0x011B  LATIN SMALL LETTER E WITH CARON
 28.1493 +   \\//@
 28.1494 +    \/ @
 28.1495 +  / _ \@
 28.1496 + |  __/@
 28.1497 +  \___|@
 28.1498 +       @@
 28.1499 +0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 28.1500 +   _/\_ @
 28.1501 +  / ___|@
 28.1502 + | |  _ @
 28.1503 + | |_| |@
 28.1504 +  \____|@
 28.1505 +        @@
 28.1506 +0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 28.1507 +     /\ @
 28.1508 +   _/_ \@
 28.1509 +  / _` |@
 28.1510 + | (_| |@
 28.1511 +  \__, |@
 28.1512 +  |___/ @@
 28.1513 +0x011E  LATIN CAPITAL LETTER G WITH BREVE
 28.1514 +   _\/_ @
 28.1515 +  / ___|@
 28.1516 + | |  _ @
 28.1517 + | |_| |@
 28.1518 +  \____|@
 28.1519 +        @@
 28.1520 +0x011F  LATIN SMALL LETTER G WITH BREVE
 28.1521 +  \___/ @
 28.1522 +   __ _ @
 28.1523 +  / _` |@
 28.1524 + | (_| |@
 28.1525 +  \__, |@
 28.1526 +  |___/ @@
 28.1527 +0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 28.1528 +   _[]_ @
 28.1529 +  / ___|@
 28.1530 + | |  _ @
 28.1531 + | |_| |@
 28.1532 +  \____|@
 28.1533 +        @@
 28.1534 +0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 28.1535 +   []   @
 28.1536 +   __ _ @
 28.1537 +  / _` |@
 28.1538 + | (_| |@
 28.1539 +  \__, |@
 28.1540 +  |___/ @@
 28.1541 +0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 28.1542 +   ____ @
 28.1543 +  / ___|@
 28.1544 + | |  _ @
 28.1545 + | |_| |@
 28.1546 +  \____|@
 28.1547 +   )__) @@
 28.1548 +0x0123  LATIN SMALL LETTER G WITH CEDILLA
 28.1549 +        @
 28.1550 +   __ _ @
 28.1551 +  / _` |@
 28.1552 + | (_| |@
 28.1553 +  \__, |@
 28.1554 +  |_))))@@
 28.1555 +0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 28.1556 +  _/ \_ @
 28.1557 + | / \ |@
 28.1558 + | |_| |@
 28.1559 + |  _  |@
 28.1560 + |_| |_|@
 28.1561 +        @@
 28.1562 +0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 28.1563 +  _  /\ @
 28.1564 + | |//\ @
 28.1565 + | '_ \ @
 28.1566 + | | | |@
 28.1567 + |_| |_|@
 28.1568 +        @@
 28.1569 +0x0126  LATIN CAPITAL LETTER H WITH STROKE
 28.1570 +  _   _ @
 28.1571 + | |=| |@
 28.1572 + | |_| |@
 28.1573 + |  _  |@
 28.1574 + |_| |_|@
 28.1575 +        @@
 28.1576 +0x0127  LATIN SMALL LETTER H WITH STROKE
 28.1577 +  _     @
 28.1578 + |=|__  @
 28.1579 + | '_ \ @
 28.1580 + | | | |@
 28.1581 + |_| |_|@
 28.1582 +        @@
 28.1583 +0x0128  LATIN CAPITAL LETTER I WITH TILDE
 28.1584 +  /\//@
 28.1585 + |_ _|@
 28.1586 +  | | @
 28.1587 +  | | @
 28.1588 + |___|@
 28.1589 +      @@
 28.1590 +0x0129  LATIN SMALL LETTER I WITH TILDE
 28.1591 +    @
 28.1592 + /\/@
 28.1593 + | |@
 28.1594 + | |@
 28.1595 + |_|@
 28.1596 +    @@
 28.1597 +0x012A  LATIN CAPITAL LETTER I WITH MACRON
 28.1598 + /___/@
 28.1599 + |_ _|@
 28.1600 +  | | @
 28.1601 +  | | @
 28.1602 + |___|@
 28.1603 +      @@
 28.1604 +0x012B  LATIN SMALL LETTER I WITH MACRON
 28.1605 +  ____@
 28.1606 + /___/@
 28.1607 +  | | @
 28.1608 +  | | @
 28.1609 +  |_| @
 28.1610 +      @@
 28.1611 +0x012C  LATIN CAPITAL LETTER I WITH BREVE
 28.1612 +  \__/@
 28.1613 + |_ _|@
 28.1614 +  | | @
 28.1615 +  | | @
 28.1616 + |___|@
 28.1617 +      @@
 28.1618 +0x012D  LATIN SMALL LETTER I WITH BREVE
 28.1619 +    @
 28.1620 + \_/@
 28.1621 + | |@
 28.1622 + | |@
 28.1623 + |_|@
 28.1624 +    @@
 28.1625 +0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 28.1626 +  ___ @
 28.1627 + |_ _|@
 28.1628 +  | | @
 28.1629 +  | | @
 28.1630 + |___|@
 28.1631 +  (__(@@
 28.1632 +0x012F  LATIN SMALL LETTER I WITH OGONEK
 28.1633 +  _  @
 28.1634 + (_) @
 28.1635 + | | @
 28.1636 + | | @
 28.1637 + |_|_@
 28.1638 +  (_(@@
 28.1639 +0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 28.1640 +  _[] @
 28.1641 + |_ _|@
 28.1642 +  | | @
 28.1643 +  | | @
 28.1644 + |___|@
 28.1645 +      @@
 28.1646 +0x0131  LATIN SMALL LETTER DOTLESS I
 28.1647 +    @
 28.1648 +  _ @
 28.1649 + | |@
 28.1650 + | |@
 28.1651 + |_|@
 28.1652 +    @@
 28.1653 +0x0132  LATIN CAPITAL LIGATURE IJ
 28.1654 +  ___  _ @
 28.1655 + |_ _|| |@
 28.1656 +  | | | |@
 28.1657 +  | |_| |@
 28.1658 + |__|__/ @
 28.1659 +         @@
 28.1660 +0x0133  LATIN SMALL LIGATURE IJ
 28.1661 +  _   _ @
 28.1662 + (_) (_)@
 28.1663 + | | | |@
 28.1664 + | | | |@
 28.1665 + |_|_/ |@
 28.1666 +   |__/ @@
 28.1667 +0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 28.1668 +      /\ @
 28.1669 +     /_\|@
 28.1670 +  _  | | @
 28.1671 + | |_| | @
 28.1672 +  \___/  @
 28.1673 +         @@
 28.1674 +0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 28.1675 +    /\@
 28.1676 +   /_\@
 28.1677 +   | |@
 28.1678 +   | |@
 28.1679 +  _/ |@
 28.1680 + |__/ @@
 28.1681 +0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 28.1682 +  _  _  @
 28.1683 + | |/ / @
 28.1684 + | ' /  @
 28.1685 + | . \  @
 28.1686 + |_|\_\ @
 28.1687 +    )__)@@
 28.1688 +0x0137  LATIN SMALL LETTER K WITH CEDILLA
 28.1689 +  _    @
 28.1690 + | | __@
 28.1691 + | |/ /@
 28.1692 + |   < @
 28.1693 + |_|\_\@
 28.1694 +    )_)@@
 28.1695 +0x0138  LATIN SMALL LETTER KRA
 28.1696 +       @
 28.1697 +  _ __ @
 28.1698 + | |/ \@
 28.1699 + |   < @
 28.1700 + |_|\_\@
 28.1701 +       @@
 28.1702 +0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 28.1703 +  _   //@
 28.1704 + | | // @
 28.1705 + | |    @
 28.1706 + | |___ @
 28.1707 + |_____|@
 28.1708 +        @@
 28.1709 +0x013A  LATIN SMALL LETTER L WITH ACUTE
 28.1710 +  //@
 28.1711 + | |@
 28.1712 + | |@
 28.1713 + | |@
 28.1714 + |_|@
 28.1715 +    @@
 28.1716 +0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 28.1717 +  _     @
 28.1718 + | |    @
 28.1719 + | |    @
 28.1720 + | |___ @
 28.1721 + |_____|@
 28.1722 +    )__)@@
 28.1723 +0x013C  LATIN SMALL LETTER L WITH CEDILLA
 28.1724 +  _   @
 28.1725 + | |  @
 28.1726 + | |  @
 28.1727 + | |  @
 28.1728 + |_|  @
 28.1729 +   )_)@@
 28.1730 +0x013D  LATIN CAPITAL LETTER L WITH CARON
 28.1731 +  _ \\//@
 28.1732 + | | \/ @
 28.1733 + | |    @
 28.1734 + | |___ @
 28.1735 + |_____|@
 28.1736 +        @@
 28.1737 +0x013E  LATIN SMALL LETTER L WITH CARON
 28.1738 +  _ \\//@
 28.1739 + | | \/ @
 28.1740 + | |    @
 28.1741 + | |    @
 28.1742 + |_|    @
 28.1743 +        @@
 28.1744 +0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 28.1745 +  _     @
 28.1746 + | |    @
 28.1747 + | | [] @
 28.1748 + | |___ @
 28.1749 + |_____|@
 28.1750 +        @@
 28.1751 +0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 28.1752 +  _    @
 28.1753 + | |   @
 28.1754 + | | []@
 28.1755 + | |   @
 28.1756 + |_|   @
 28.1757 +       @@
 28.1758 +0x0141  LATIN CAPITAL LETTER L WITH STROKE
 28.1759 +  __    @
 28.1760 + | //   @
 28.1761 + |//|   @
 28.1762 + // |__ @
 28.1763 + |_____|@
 28.1764 +        @@
 28.1765 +0x0142  LATIN SMALL LETTER L WITH STROKE
 28.1766 +  _ @
 28.1767 + | |@
 28.1768 + |//@
 28.1769 + //|@
 28.1770 + |_|@
 28.1771 +    @@
 28.1772 +0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 28.1773 +  _/ /_ @
 28.1774 + | \ | |@
 28.1775 + |  \| |@
 28.1776 + | |\  |@
 28.1777 + |_| \_|@
 28.1778 +        @@
 28.1779 +0x0144  LATIN SMALL LETTER N WITH ACUTE
 28.1780 +     _  @
 28.1781 +  _ /_/ @
 28.1782 + | '_ \ @
 28.1783 + | | | |@
 28.1784 + |_| |_|@
 28.1785 +        @@
 28.1786 +0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 28.1787 +  _   _ @
 28.1788 + | \ | |@
 28.1789 + |  \| |@
 28.1790 + | |\  |@
 28.1791 + |_| \_|@
 28.1792 + )_)    @@
 28.1793 +0x0146  LATIN SMALL LETTER N WITH CEDILLA
 28.1794 +        @
 28.1795 +  _ __  @
 28.1796 + | '_ \ @
 28.1797 + | | | |@
 28.1798 + |_| |_|@
 28.1799 + )_)    @@
 28.1800 +0x0147  LATIN CAPITAL LETTER N WITH CARON
 28.1801 +  _\/ _ @
 28.1802 + | \ | |@
 28.1803 + |  \| |@
 28.1804 + | |\  |@
 28.1805 + |_| \_|@
 28.1806 +        @@
 28.1807 +0x0148  LATIN SMALL LETTER N WITH CARON
 28.1808 +  \\//  @
 28.1809 +  _\/_  @
 28.1810 + | '_ \ @
 28.1811 + | | | |@
 28.1812 + |_| |_|@
 28.1813 +        @@
 28.1814 +0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 28.1815 +          @
 28.1816 +  _  __   @
 28.1817 + ( )| '_\ @
 28.1818 + |/| | | |@
 28.1819 +   |_| |_|@
 28.1820 +          @@
 28.1821 +0x014A  LATIN CAPITAL LETTER ENG
 28.1822 +  _   _ @
 28.1823 + | \ | |@
 28.1824 + |  \| |@
 28.1825 + | |\  |@
 28.1826 + |_| \ |@
 28.1827 +     )_)@@
 28.1828 +0x014B  LATIN SMALL LETTER ENG
 28.1829 +  _ __  @
 28.1830 + | '_ \ @
 28.1831 + | | | |@
 28.1832 + |_| | |@
 28.1833 +     | |@
 28.1834 +    |__ @@
 28.1835 +0x014C  LATIN CAPITAL LETTER O WITH MACRON
 28.1836 +   ____ @
 28.1837 +  /_ _/ @
 28.1838 +  / _ \ @
 28.1839 + | (_) |@
 28.1840 +  \___/ @
 28.1841 +        @@
 28.1842 +0x014D  LATIN SMALL LETTER O WITH MACRON
 28.1843 +   ____ @
 28.1844 +  /_ _/ @
 28.1845 +  / _ \ @
 28.1846 + | (_) |@
 28.1847 +  \___/ @
 28.1848 +        @@
 28.1849 +0x014E  LATIN CAPITAL LETTER O WITH BREVE
 28.1850 +  \   / @
 28.1851 +   _-_  @
 28.1852 +  / _ \ @
 28.1853 + | |_| |@
 28.1854 +  \___/ @
 28.1855 +        @@
 28.1856 +0x014F  LATIN SMALL LETTER O WITH BREVE
 28.1857 +  \   / @
 28.1858 +   _-_  @
 28.1859 +  / _ \ @
 28.1860 + | |_| |@
 28.1861 +  \___/ @
 28.1862 +        @@
 28.1863 +0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 28.1864 +    ___ @
 28.1865 +   /_/_/@
 28.1866 +  / _ \ @
 28.1867 + | |_| |@
 28.1868 +  \___/ @
 28.1869 +        @@
 28.1870 +0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 28.1871 +    ___ @
 28.1872 +   /_/_/@
 28.1873 +  / _ \ @
 28.1874 + | |_| |@
 28.1875 +  \___/ @
 28.1876 +        @@
 28.1877 +0x0152  LATIN CAPITAL LIGATURE OE
 28.1878 +   ___  ___ @
 28.1879 +  / _ \| __|@
 28.1880 + | | | |  | @
 28.1881 + | |_| | |__@
 28.1882 +  \___/|____@
 28.1883 +            @@
 28.1884 +0x0153  LATIN SMALL LIGATURE OE
 28.1885 +             @
 28.1886 +   ___   ___ @
 28.1887 +  / _ \ / _ \@
 28.1888 + | (_) |  __/@
 28.1889 +  \___/ \___|@
 28.1890 +             @@
 28.1891 +0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 28.1892 +  _/_/  @
 28.1893 + |  _ \ @
 28.1894 + | |_) |@
 28.1895 + |  _ < @
 28.1896 + |_| \_\@
 28.1897 +        @@
 28.1898 +0x0155  LATIN SMALL LETTER R WITH ACUTE
 28.1899 +     __@
 28.1900 +  _ /_/@
 28.1901 + | '__|@
 28.1902 + | |   @
 28.1903 + |_|   @
 28.1904 +       @@
 28.1905 +0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 28.1906 +  ____  @
 28.1907 + |  _ \ @
 28.1908 + | |_) |@
 28.1909 + |  _ < @
 28.1910 + |_| \_\@
 28.1911 + )_)    @@
 28.1912 +0x0157  LATIN SMALL LETTER R WITH CEDILLA
 28.1913 +       @
 28.1914 +  _ __ @
 28.1915 + | '__|@
 28.1916 + | |   @
 28.1917 + |_|   @
 28.1918 +   )_) @@
 28.1919 +0x0158  LATIN CAPITAL LETTER R WITH CARON
 28.1920 +  _\_/  @
 28.1921 + |  _ \ @
 28.1922 + | |_) |@
 28.1923 + |  _ < @
 28.1924 + |_| \_\@
 28.1925 +        @@
 28.1926 +0x0159  LATIN SMALL LETTER R WITH CARON
 28.1927 +  \\// @
 28.1928 +  _\/_ @
 28.1929 + | '__|@
 28.1930 + | |   @
 28.1931 + |_|   @
 28.1932 +       @@
 28.1933 +0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 28.1934 +  _/_/  @
 28.1935 + / ___| @
 28.1936 + \___ \ @
 28.1937 +  ___) |@
 28.1938 + |____/ @
 28.1939 +        @@
 28.1940 +0x015B  LATIN SMALL LETTER S WITH ACUTE
 28.1941 +    __@
 28.1942 +  _/_/@
 28.1943 + / __|@
 28.1944 + \__ \@
 28.1945 + |___/@
 28.1946 +      @@
 28.1947 +0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 28.1948 +  _/\_  @
 28.1949 + / ___| @
 28.1950 + \___ \ @
 28.1951 +  ___) |@
 28.1952 + |____/ @
 28.1953 +        @@
 28.1954 +0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 28.1955 +      @
 28.1956 +  /_\_@
 28.1957 + / __|@
 28.1958 + \__ \@
 28.1959 + |___/@
 28.1960 +      @@
 28.1961 +0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 28.1962 +  ____  @
 28.1963 + / ___| @
 28.1964 + \___ \ @
 28.1965 +  ___) |@
 28.1966 + |____/ @
 28.1967 +    )__)@@
 28.1968 +0x015F  LATIN SMALL LETTER S WITH CEDILLA
 28.1969 +      @
 28.1970 +  ___ @
 28.1971 + / __|@
 28.1972 + \__ \@
 28.1973 + |___/@
 28.1974 +   )_)@@
 28.1975 +0x0160  LATIN CAPITAL LETTER S WITH CARON
 28.1976 +  _\_/  @
 28.1977 + / ___| @
 28.1978 + \___ \ @
 28.1979 +  ___) |@
 28.1980 + |____/ @
 28.1981 +        @@
 28.1982 +0x0161  LATIN SMALL LETTER S WITH CARON
 28.1983 +  \\//@
 28.1984 +  _\/ @
 28.1985 + / __|@
 28.1986 + \__ \@
 28.1987 + |___/@
 28.1988 +      @@
 28.1989 +0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 28.1990 +  _____ @
 28.1991 + |_   _|@
 28.1992 +   | |  @
 28.1993 +   | |  @
 28.1994 +   |_|  @
 28.1995 +    )__)@@
 28.1996 +0x0163  LATIN SMALL LETTER T WITH CEDILLA
 28.1997 +  _   @
 28.1998 + | |_ @
 28.1999 + | __|@
 28.2000 + | |_ @
 28.2001 +  \__|@
 28.2002 +   )_)@@
 28.2003 +0x0164  LATIN CAPITAL LETTER T WITH CARON
 28.2004 +  _____ @
 28.2005 + |_   _|@
 28.2006 +   | |  @
 28.2007 +   | |  @
 28.2008 +   |_|  @
 28.2009 +        @@
 28.2010 +0x0165  LATIN SMALL LETTER T WITH CARON
 28.2011 +  \/  @
 28.2012 + | |_ @
 28.2013 + | __|@
 28.2014 + | |_ @
 28.2015 +  \__|@
 28.2016 +      @@
 28.2017 +0x0166  LATIN CAPITAL LETTER T WITH STROKE
 28.2018 +  _____ @
 28.2019 + |_   _|@
 28.2020 +   | |  @
 28.2021 +  -|-|- @
 28.2022 +   |_|  @
 28.2023 +        @@
 28.2024 +0x0167  LATIN SMALL LETTER T WITH STROKE
 28.2025 +  _   @
 28.2026 + | |_ @
 28.2027 + | __|@
 28.2028 + |-|_ @
 28.2029 +  \__|@
 28.2030 +      @@
 28.2031 +0x0168  LATIN CAPITAL LETTER U WITH TILDE
 28.2032 +        @
 28.2033 +  _/\/_ @
 28.2034 + | | | |@
 28.2035 + | |_| |@
 28.2036 +  \___/ @
 28.2037 +        @@
 28.2038 +0x0169  LATIN SMALL LETTER U WITH TILDE
 28.2039 +        @
 28.2040 +  _/\/_ @
 28.2041 + | | | |@
 28.2042 + | |_| |@
 28.2043 +  \__,_|@
 28.2044 +        @@
 28.2045 +0x016A  LATIN CAPITAL LETTER U WITH MACRON
 28.2046 +   ____ @
 28.2047 +  /__ _/@
 28.2048 + | | | |@
 28.2049 + | |_| |@
 28.2050 +  \___/ @
 28.2051 +        @@
 28.2052 +0x016B  LATIN SMALL LETTER U WITH MACRON
 28.2053 +   ____ @
 28.2054 +  / _  /@
 28.2055 + | | | |@
 28.2056 + | |_| |@
 28.2057 +  \__,_|@
 28.2058 +        @@
 28.2059 +0x016C  LATIN CAPITAL LETTER U WITH BREVE
 28.2060 +        @
 28.2061 +   \_/_ @
 28.2062 + | | | |@
 28.2063 + | |_| |@
 28.2064 +  \____|@
 28.2065 +        @@
 28.2066 +0x016D  LATIN SMALL LETTER U WITH BREVE
 28.2067 +        @
 28.2068 +   \_/_ @
 28.2069 + | | | |@
 28.2070 + | |_| |@
 28.2071 +  \__,_|@
 28.2072 +        @@
 28.2073 +0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 28.2074 +    O   @
 28.2075 +  __  _ @
 28.2076 + | | | |@
 28.2077 + | |_| |@
 28.2078 +  \___/ @
 28.2079 +        @@
 28.2080 +0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 28.2081 +    O   @
 28.2082 +  __ __ @
 28.2083 + | | | |@
 28.2084 + | |_| |@
 28.2085 +  \__,_|@
 28.2086 +        @@
 28.2087 +0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 28.2088 +   -- --@
 28.2089 +  /_//_/@
 28.2090 + | | | |@
 28.2091 + | |_| |@
 28.2092 +  \___/ @
 28.2093 +        @@
 28.2094 +0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 28.2095 +    ____@
 28.2096 +  _/_/_/@
 28.2097 + | | | |@
 28.2098 + | |_| |@
 28.2099 +  \__,_|@
 28.2100 +        @@
 28.2101 +0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 28.2102 +  _   _ @
 28.2103 + | | | |@
 28.2104 + | | | |@
 28.2105 + | |_| |@
 28.2106 +  \___/ @
 28.2107 +    (__(@@
 28.2108 +0x0173  LATIN SMALL LETTER U WITH OGONEK
 28.2109 +        @
 28.2110 +  _   _ @
 28.2111 + | | | |@
 28.2112 + | |_| |@
 28.2113 +  \__,_|@
 28.2114 +     (_(@@
 28.2115 +0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 28.2116 + __    /\  __@
 28.2117 + \ \  //\\/ /@
 28.2118 +  \ \ /\ / / @
 28.2119 +   \ V  V /  @
 28.2120 +    \_/\_/   @
 28.2121 +             @@
 28.2122 +0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 28.2123 +      /\   @
 28.2124 + __  //\\__@
 28.2125 + \ \ /\ / /@
 28.2126 +  \ V  V / @
 28.2127 +   \_/\_/  @
 28.2128 +           @@
 28.2129 +0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 28.2130 +    /\  @
 28.2131 + __//\\ @
 28.2132 + \ \ / /@
 28.2133 +  \ V / @
 28.2134 +   |_|  @
 28.2135 +        @@
 28.2136 +0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 28.2137 +    /\  @
 28.2138 +   //\\ @
 28.2139 + | | | |@
 28.2140 + | |_| |@
 28.2141 +  \__, |@
 28.2142 +  |___/ @@
 28.2143 +0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 28.2144 +  []  []@
 28.2145 + __    _@
 28.2146 + \ \ / /@
 28.2147 +  \ V / @
 28.2148 +   |_|  @
 28.2149 +        @@
 28.2150 +0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 28.2151 +  __/_/@
 28.2152 + |__  /@
 28.2153 +   / / @
 28.2154 +  / /_ @
 28.2155 + /____|@
 28.2156 +       @@
 28.2157 +0x017A  LATIN SMALL LETTER Z WITH ACUTE
 28.2158 +    _ @
 28.2159 +  _/_/@
 28.2160 + |_  /@
 28.2161 +  / / @
 28.2162 + /___|@
 28.2163 +      @@
 28.2164 +0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 28.2165 +  __[]_@
 28.2166 + |__  /@
 28.2167 +   / / @
 28.2168 +  / /_ @
 28.2169 + /____|@
 28.2170 +       @@
 28.2171 +0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 28.2172 +   [] @
 28.2173 +  ____@
 28.2174 + |_  /@
 28.2175 +  / / @
 28.2176 + /___|@
 28.2177 +      @@
 28.2178 +0x017D  LATIN CAPITAL LETTER Z WITH CARON
 28.2179 +  _\_/_@
 28.2180 + |__  /@
 28.2181 +   / / @
 28.2182 +  / /_ @
 28.2183 + /____|@
 28.2184 +       @@
 28.2185 +0x017E  LATIN SMALL LETTER Z WITH CARON
 28.2186 +  \\//@
 28.2187 +  _\/_@
 28.2188 + |_  /@
 28.2189 +  / / @
 28.2190 + /___|@
 28.2191 +      @@
 28.2192 +0x017F  LATIN SMALL LETTER LONG S
 28.2193 +     __ @
 28.2194 +    / _|@
 28.2195 + |-| |  @
 28.2196 + |-| |  @
 28.2197 +   |_|  @
 28.2198 +        @@
 28.2199 +0x02C7  CARON
 28.2200 + \\//@
 28.2201 +  \/ @
 28.2202 +    $@
 28.2203 +    $@
 28.2204 +    $@
 28.2205 +    $@@
 28.2206 +0x02D8  BREVE
 28.2207 + \\_//@
 28.2208 +  \_/ @
 28.2209 +     $@
 28.2210 +     $@
 28.2211 +     $@
 28.2212 +     $@@
 28.2213 +0x02D9  DOT ABOVE
 28.2214 + []@
 28.2215 +  $@
 28.2216 +  $@
 28.2217 +  $@
 28.2218 +  $@
 28.2219 +  $@@
 28.2220 +0x02DB  OGONEK
 28.2221 +    $@
 28.2222 +    $@
 28.2223 +    $@
 28.2224 +    $@
 28.2225 +    $@
 28.2226 + )_) @@
 28.2227 +0x02DD  DOUBLE ACUTE ACCENT
 28.2228 +  _ _ @
 28.2229 + /_/_/@
 28.2230 +     $@
 28.2231 +     $@
 28.2232 +     $@
 28.2233 +     $@@