ia64/xen-unstable

changeset 1742:cda0735bdc4c

bitkeeper revision 1.1064 (40f28b086ejGbsgwP7ea5F9nKNXIxA)

Merge ssh://srg//auto/groups/xeno/BK/xeno.bk
into equilibrium.research.intel-research.net:/export/scratch/mwilli2/temp/xeno2.bk
author mwilli2@equilibrium.research.intel-research.net
date Mon Jul 12 12:58:48 2004 +0000 (2004-07-12)
parents 3365c9a31041 380963a0e1a5
children 2b564fc2af6f
files .rootkeys BitKeeper/etc/ignore tools/examples/network tools/python/xen/util/ip.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xm/main.py tools/python/xen/xm/opts.py xen/Makefile xen/arch/x86/Makefile xen/arch/x86/boot/mkelf32.c xen/arch/x86/boot/x86_64.S xen/arch/x86/x86_32/xen.lds xen/arch/x86/x86_64/xen.lds xen/figlet/LICENSE xen/figlet/Makefile xen/figlet/README xen/figlet/figlet.c xen/figlet/xen.flf xen/include/asm-x86/msr.h xen/include/xen/multiboot.h xen/tools/Makefile xen/tools/elf-reloc.c xen/tools/figlet/LICENSE xen/tools/figlet/Makefile xen/tools/figlet/README xen/tools/figlet/figlet.c xen/tools/figlet/xen.flf
line diff
     1.1 --- a/.rootkeys	Fri Jul 09 18:28:03 2004 +0000
     1.2 +++ b/.rootkeys	Mon Jul 12 12:58:48 2004 +0000
     1.3 @@ -317,6 +317,7 @@ 3ddb79bcZbRBzT3elFWSX7u6NtMagQ xen/arch/
     1.4  3ddb79bcBQF85CfLS4i1WGZ4oLLaCA xen/arch/x86/Rules.mk
     1.5  3e5636e5FAYZ5_vQnmgwFJfSdmO5Mw xen/arch/x86/acpi.c
     1.6  3ddb79bcsjinG9k1KcvbVBuas1R2dA xen/arch/x86/apic.c
     1.7 +3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen/arch/x86/boot/mkelf32.c
     1.8  3ddb79bcSC_LvnmFlX-T5iTgaR0SKg xen/arch/x86/boot/x86_32.S
     1.9  40e42bdbNu4MjI750THP_8J1S-Sa0g xen/arch/x86/boot/x86_64.S
    1.10  3ddb79bcUrk2EIaM5VsT6wUudH1kkg xen/arch/x86/delay.c
    1.11 @@ -398,6 +399,11 @@ 3ddb79bfkVLMq5CWjZLACPDivqxq_w xen/drive
    1.12  3ddb79bfl1H1arbB0pzAEC2uPmY_3g xen/drivers/pci/setup-irq.c
    1.13  3ddb79bfJaf0bkE1Y67bnll8-kjEPg xen/drivers/pci/setup-res.c
    1.14  3ddb79bfIcCWJsBDNcQQE3ok2Azn-Q xen/drivers/pci/syscall.c
    1.15 +3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/figlet/LICENSE
    1.16 +3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/figlet/Makefile
    1.17 +3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/figlet/README
    1.18 +3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/figlet/figlet.c
    1.19 +3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/figlet/xen.flf
    1.20  40715b2cFpte_UNWnBZW0Du7z9AhTQ xen/include/acpi/acconfig.h
    1.21  40715b2cEQWX-PaxEH30qI48K1krnQ xen/include/acpi/acdebug.h
    1.22  40715b2c_7j-oy3ZNAuqE3IFNPzArg xen/include/acpi/acdisasm.h
    1.23 @@ -532,10 +538,3 @@ 3e7f358aMtFMUVvN_Zjg5qvEJIqEBA xen/inclu
    1.24  3ddb79c0BnA20PbgmuMPSGIBljNRQw xen/include/xen/time.h
    1.25  403a3edbG9K5uZjuY19_LORbQGmFbA xen/include/xen/trace.h
    1.26  3ddb79c1-kVvF8cVa0k3ZHDdBMj01Q xen/include/xen/types.h
    1.27 -3ddb79c4x8dvwPtzclghWAKFWpEBFA xen/tools/Makefile
    1.28 -3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen/tools/elf-reloc.c
    1.29 -3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/tools/figlet/LICENSE
    1.30 -3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/tools/figlet/Makefile
    1.31 -3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
    1.32 -3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
    1.33 -3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
     2.1 --- a/BitKeeper/etc/ignore	Fri Jul 09 18:28:03 2004 +0000
     2.2 +++ b/BitKeeper/etc/ignore	Mon Jul 12 12:58:48 2004 +0000
     2.3 @@ -21,14 +21,17 @@ tools/*/build/lib*/*.py
     2.4  tools/misc/miniterm/miniterm
     2.5  tools/misc/xen_cpuperf
     2.6  tools/xentrace/xentrace
     2.7 +xen/arch/x86/boot/mkelf32
     2.8  xen/drivers/pci/classlist.h
     2.9  xen/drivers/pci/devlist.h
    2.10  xen/drivers/pci/gen-devlist
    2.11  xen/include/asm
    2.12  xen/include/hypervisor-ifs/arch
    2.13  xen/include/xen/compile.h
    2.14 -xen/tools/elf-reloc
    2.15 -xen/tools/figlet/figlet
    2.16 +xen/figlet/figlet
    2.17  xen/xen
    2.18  xen/xen-syms
    2.19  xen/xen.*
    2.20 +tools/xfrd/xfrd
    2.21 +xen/tools/elf-reloc
    2.22 +xen/tools/figlet/figlet
     3.1 --- a/tools/examples/network	Fri Jul 09 18:28:03 2004 +0000
     3.2 +++ b/tools/examples/network	Mon Jul 12 12:58:48 2004 +0000
     3.3 @@ -1,4 +1,4 @@
     3.4 -#!/bin/sh
     3.5 +#!/bin/sh 
     3.6  #============================================================================
     3.7  # Example Xen network start/stop script.
     3.8  # Xend calls a network script when it starts.
     3.9 @@ -54,9 +54,10 @@ transfer_addrs () {
    3.10      fi
    3.11      # Address lines start with 'inet' and have the device in them.
    3.12      # Replace 'inet' with 'ip addr add' and change the device name $src
    3.13 -    # to 'dev $src'.
    3.14 +    # to 'dev $src'. Remove netmask as we'll add routes later.
    3.15      ip addr show dev ${src} | egrep '^ *inet' | sed -e "
    3.16  s/inet/ip addr add/
    3.17 +s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)/[0-9]\+@\1@
    3.18  s/${src}/dev ${dst}/
    3.19  " | sh -e
    3.20  }
     4.1 --- a/tools/python/xen/util/ip.py	Fri Jul 09 18:28:03 2004 +0000
     4.2 +++ b/tools/python/xen/util/ip.py	Mon Jul 12 12:58:48 2004 +0000
     4.3 @@ -2,6 +2,7 @@ import os
     4.4  import re
     4.5  import socket
     4.6  import struct
     4.7 +import errno
     4.8  
     4.9  def _readlines(fd):
    4.10      """Version of readlines safe against EINTR.
     5.1 --- a/tools/python/xen/xend/XendDomainInfo.py	Fri Jul 09 18:28:03 2004 +0000
     5.2 +++ b/tools/python/xen/xend/XendDomainInfo.py	Mon Jul 12 12:58:48 2004 +0000
     5.3 @@ -72,12 +72,12 @@ def blkdev_name_to_number(name):
     5.4      """Take the given textual block-device name (e.g., '/dev/sda1',
     5.5      'hda') and return the device number used by the OS. """
     5.6  
     5.7 -    if not re.match( '/dev/', name ):
     5.8 +    if not re.match( '^/dev/', name ):
     5.9          name = '/dev/' + name
    5.10          
    5.11      return os.stat(name).st_rdev
    5.12  
    5.13 -def lookup_raw_partn(partition):
    5.14 +def lookup_raw_partn(name):
    5.15      """Take the given block-device name (e.g., '/dev/sda1', 'hda')
    5.16      and return a dictionary { device, start_sector,
    5.17      nr_sectors, type }
    5.18 @@ -87,40 +87,26 @@ def lookup_raw_partn(partition):
    5.19          type:         'Disk' or identifying name for partition type
    5.20      """
    5.21  
    5.22 -    if not re.match( '/dev/', partition ):
    5.23 -        partition = '/dev/' + partition
    5.24 -        
    5.25 -    """Try and match non-standard scsi raid arraysa
    5.26 -    """
    5.27 -    if re.match( '/dev/cciss/c[0-9]+d[0-9]+p[0-9]+', partition ):
    5.28 -        drive = re.split( 'p[0-9]+', partition )[0]
    5.29 -    else:
    5.30 -        drive = re.split( '[0-9]', partition )[0]
    5.31 +    p = name
    5.32  
    5.33 -    if drive == partition:
    5.34 -        fd = os.popen( '/sbin/sfdisk -s ' + drive + ' 2>/dev/null' )
    5.35 -        line = _readline(fd)
    5.36 -        if line:
    5.37 -            return [ { 'device' : blkdev_name_to_number(drive),
    5.38 -                       'start_sector' : long(0),
    5.39 -                       'nr_sectors' : long(line) * 2,
    5.40 -                       'type' : 'Disk' } ]
    5.41 -        return None
    5.42 -
    5.43 -    # determine position on disk
    5.44 -    fd = os.popen( '/sbin/sfdisk -d ' + drive + ' 2>/dev/null' )
    5.45 -
    5.46 -    #['/dev/sda3 : start= 16948575, size=16836120, Id=83, bootable\012']
    5.47 -    lines = _readlines(fd)
    5.48 -    for line in lines:
    5.49 -        m = re.search( '^' + partition + '\s*: start=\s*([0-9]+), ' +
    5.50 -                       'size=\s*([0-9]+), Id=\s*(\S+).*$', line)
    5.51 -        if m:
    5.52 -            return [ { 'device' : blkdev_name_to_number(drive),
    5.53 -                       'start_sector' : long(m.group(1)),
    5.54 -                       'nr_sectors' : long(m.group(2)),
    5.55 -                       'type' : m.group(3) } ]
    5.56 -    
    5.57 +    if not re.match( '^/dev/', name ):
    5.58 +        p = '/dev/' + name
    5.59 +	        
    5.60 +    fd = os.popen( '/sbin/sfdisk -s ' + p + ' 2>/dev/null' )
    5.61 +    line = _readline(fd)
    5.62 +    if line:
    5.63 +	return [ { 'device' : blkdev_name_to_number(p),
    5.64 +		   'start_sector' : long(0),
    5.65 +		   'nr_sectors' : long(line) * 2,
    5.66 +		   'type' : 'Disk' } ]
    5.67 +    else:
    5.68 +	# see if this is a hex device number
    5.69 +	if re.match( '^(0x)?[0-9a-fA-F]+$', name ):
    5.70 +	    return [ { 'device' : string.atoi(name,16),
    5.71 +		   'start_sector' : long(0),
    5.72 +		   'nr_sectors' : long(1L<<63),
    5.73 +		   'type' : 'Disk' } ]
    5.74 +	
    5.75      return None
    5.76  
    5.77  def lookup_disk_uname(uname):
    5.78 @@ -143,7 +129,7 @@ def make_disk(dom, uname, dev, mode, rec
    5.79      """
    5.80      segments = lookup_disk_uname(uname)
    5.81      if not segments:
    5.82 -        raise VmError("vbd: Segments not found: uname=%s" % uname)
    5.83 +        raise VmError("vbd: Segments not foundXXXXXX: uname=%s" % uname)
    5.84      if len(segments) > 1:
    5.85          raise VmError("vbd: Multi-segment vdisk: uname=%s" % uname)
    5.86      segment = segments[0]
     6.1 --- a/tools/python/xen/xm/main.py	Fri Jul 09 18:28:03 2004 +0000
     6.2 +++ b/tools/python/xen/xm/main.py	Mon Jul 12 12:58:48 2004 +0000
     6.3 @@ -78,11 +78,10 @@ class Xm:
     6.4          """
     6.5          self.name = args[0]
     6.6          if len(args) < 2:
     6.7 -            self.err("Missing command\nTry '%s help' for more information."
     6.8 -                     % self.name)
     6.9 -        help = self.helparg(args)
    6.10 +        	args.append('help')
    6.11 +	help = self.helparg(args)
    6.12          p = self.getprog(args[1], self.unknown)
    6.13 -        if help:
    6.14 +        if help or len(args) < 2: 
    6.15              p.help(args[1:])
    6.16          else:
    6.17              p.main(args[1:])
     7.1 --- a/tools/python/xen/xm/opts.py	Fri Jul 09 18:28:03 2004 +0000
     7.2 +++ b/tools/python/xen/xm/opts.py	Mon Jul 12 12:58:48 2004 +0000
     7.3 @@ -331,6 +331,7 @@ class Opts:
     7.4              else:
     7.5                  p = self.vals.defaults
     7.6              if os.path.exists(p):
     7.7 +		print 'Using config file %s\n' % (p)
     7.8                  self.load(p, help)
     7.9                  break
    7.10          else:
     8.1 --- a/xen/Makefile	Fri Jul 09 18:28:03 2004 +0000
     8.2 +++ b/xen/Makefile	Mon Jul 12 12:58:48 2004 +0000
     8.3 @@ -27,14 +27,13 @@ dist: $(TARGET)
     8.4  	$(MAKE) prefix=`pwd`/../install dist=yes install
     8.5  
     8.6  clean: delete-links
     8.7 -	$(MAKE) -C tools clean
     8.8 +	$(MAKE) -C figlet clean
     8.9  	$(MAKE) -C common clean
    8.10  	$(MAKE) -C drivers clean
    8.11  	$(MAKE) -C arch/$(TARGET_ARCH) clean
    8.12  	rm -f *.o $(TARGET)* *~ core $(GENERATED_FILES)
    8.13  
    8.14  $(TARGET): delete-unfresh-files make-links $(GENERATED_FILES)
    8.15 -	$(MAKE) -C tools
    8.16  	$(MAKE) -C common
    8.17  	$(MAKE) -C drivers
    8.18  	$(MAKE) -C arch/$(TARGET_ARCH)
    8.19 @@ -65,7 +64,7 @@ include/xen/compile.h:
    8.20  	@LANG=C echo \#define XEN_EXTRAVERSION \"$(XEN_EXTRAVERSION)\" >> $@
    8.21  	@LANG=C echo >> $@
    8.22  	@LANG=C echo \#define XEN_BANNER \\ >> $@
    8.23 -	cd tools/figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ && cd ../..
    8.24 +	cd ./figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../$@ && cd ..
    8.25  	@LANG=C echo >> $@
    8.26  
    8.27  .PHONY: $(GENERATED_FILES) make-links delete-links default 
     9.1 --- a/xen/arch/x86/Makefile	Fri Jul 09 18:28:03 2004 +0000
     9.2 +++ b/xen/arch/x86/Makefile	Mon Jul 12 12:58:48 2004 +0000
     9.3 @@ -9,30 +9,16 @@ endif
     9.4  OBJS += $(patsubst %.S,%.o,$(wildcard $(TARGET_SUBARCH)/*.S))
     9.5  OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
     9.6  
     9.7 -ifeq ($(TARGET_SUBARCH),x86_32)
     9.8 -LINK_BASE := 0xFC500000 # Xen is linked here
     9.9 -LOAD_BASE := 0x00100000 # Xen is loaded here
    9.10 -endif
    9.11 -
    9.12 -ifeq ($(TARGET_SUBARCH),x86_64)
    9.13 -LINK_BASE := 0xFFFF830000100000 # Xen is linked here
    9.14 -LOAD_BASE := 0x0000000000100000 # Xen is loaded here
    9.15 -endif
    9.16 -
    9.17 -# What happens here? We link object files together, starting at LINK_BASE
    9.18 -# (a very high address). But the bootloader cannot put things there, so we
    9.19 -# initially load at LOAD_BASE. A tool called `elf-reloc' is used to modify
    9.20 -# segment offsets from LINK_BASE-relative to LOAD_BASE-relative.
    9.21 -# (NB. Linux gets round this by turning its image into raw binary, then 
    9.22 -# wrapping that with a low-memory bootstrapper.)
    9.23 -default: boot/$(TARGET_SUBARCH).o $(OBJS)
    9.24 +default: boot/$(TARGET_SUBARCH).o $(OBJS) boot/mkelf32
    9.25  	$(LD) $(LDFLAGS) -r -o arch.o $(OBJS)
    9.26  	$(LD) $(LDFLAGS) -T $(TARGET_SUBARCH)/xen.lds -N \
    9.27  	    boot/$(TARGET_SUBARCH).o $(ALL_OBJS) -o $(TARGET)-syms
    9.28 -	objcopy -R .note -R .comment -S $(TARGET)-syms $(TARGET)
    9.29 -	$(BASEDIR)/tools/elf-reloc $(LINK_BASE) $(LOAD_BASE) $(TARGET)
    9.30 +	./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000
    9.31 +
    9.32 +boot/mkelf32: boot/mkelf32.c
    9.33 +	$(HOSTCC) $(HOSTCFLAGS) -o $@ $<
    9.34  
    9.35  clean:
    9.36 -	rm -f *.o *~ core boot/*.o boot/*~ boot/core
    9.37 -	rm -f $(TARGET_SUBARCH)/*.o $(TARGET_SUBARCH)/*~
    9.38 -	rm -f $(TARGETSUBARCH)/core
    9.39 +	rm -f *.o *~ core boot/*.o boot/*~ boot/core boot/mkelf32
    9.40 +	rm -f x86_32/*.o x86_32/*~ x86_32/core
    9.41 +	rm -f x86_64/*.o x86_64/*~ x86_64/core
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/xen/arch/x86/boot/mkelf32.c	Mon Jul 12 12:58:48 2004 +0000
    10.3 @@ -0,0 +1,294 @@
    10.4 +/******************************************************************************
    10.5 + * mkelf32.c
    10.6 + * 
    10.7 + * Usage: elf-prefix <in-image> <out-image> <load-base>
    10.8 + * 
    10.9 + * Converts an Elf32 or Elf64 executable binary <in-image> into a simple Elf32
   10.10 + * image <out-image> comprising a single chunk to be loaded at <load-base>. 
   10.11 + */
   10.12 +
   10.13 +#include <errno.h>
   10.14 +#include <stdio.h>
   10.15 +#include <stdlib.h>
   10.16 +#include <string.h>
   10.17 +#include <sys/types.h>
   10.18 +#include <sys/stat.h>
   10.19 +#include <fcntl.h>
   10.20 +#include <unistd.h>
   10.21 +
   10.22 +/*
   10.23 + * Here I'm taking care not to conflict with possible typedef's in
   10.24 + * standard headers by instead using the macro namespace.
   10.25 + */
   10.26 +#undef u8
   10.27 +#undef u16
   10.28 +#undef u32
   10.29 +#undef u64
   10.30 +#undef s8
   10.31 +#undef s16
   10.32 +#undef s32
   10.33 +#undef s64
   10.34 +#define u8  unsigned char
   10.35 +#define u16 unsigned short
   10.36 +#define u32 unsigned int
   10.37 +#define s8  signed char
   10.38 +#define s16 signed short
   10.39 +#define s32 signed int
   10.40 +#if defined(__i386__)
   10.41 +#define u64 unsigned long long
   10.42 +#define s64 signed long long
   10.43 +#else
   10.44 +#define u64 unsigned long
   10.45 +#define s64 signed long
   10.46 +#endif
   10.47 +
   10.48 +#include "../../../include/xen/elf.h"
   10.49 +
   10.50 +#define DYNAMICALLY_FILLED   0
   10.51 +#define RAW_OFFSET         128
   10.52 +
   10.53 +static Elf32_Ehdr out_ehdr = {
   10.54 +    { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,    /* EI_MAG{0-3} */
   10.55 +      ELFCLASS32,                            /* EI_CLASS */
   10.56 +      ELFDATA2LSB,                           /* EI_DATA */
   10.57 +      EV_CURRENT,                            /* EI_VERSION */
   10.58 +      0, 0, 0, 0, 0, 0, 0, 0, 0 },           /* e_ident */
   10.59 +    ET_EXEC,                                 /* e_type */
   10.60 +    EM_386,                                  /* e_machine */
   10.61 +    EV_CURRENT,                              /* e_version */
   10.62 +    DYNAMICALLY_FILLED,                      /* e_entry */
   10.63 +    sizeof(Elf32_Ehdr),                      /* e_phoff */
   10.64 +    DYNAMICALLY_FILLED,                      /* e_shoff */
   10.65 +    0,                                       /* e_flags */
   10.66 +    sizeof(Elf32_Ehdr),                      /* e_ehsize */
   10.67 +    sizeof(Elf32_Phdr),                      /* e_phentsize */
   10.68 +    1,                                       /* e_phnum */
   10.69 +    sizeof(Elf32_Shdr),                      /* e_shentsize */
   10.70 +    3,                                       /* e_shnum */
   10.71 +    2                                        /* e_shstrndx */
   10.72 +};
   10.73 +
   10.74 +static Elf32_Phdr out_phdr = {
   10.75 +    PT_LOAD,                                 /* p_type */
   10.76 +    RAW_OFFSET,                              /* p_offset */
   10.77 +    DYNAMICALLY_FILLED,                      /* p_vaddr */
   10.78 +    DYNAMICALLY_FILLED,                      /* p_paddr */
   10.79 +    DYNAMICALLY_FILLED,                      /* p_filesz */
   10.80 +    DYNAMICALLY_FILLED,                      /* p_memsz */
   10.81 +    PF_R|PF_W|PF_X,                          /* p_flags */
   10.82 +    64                                       /* p_align */
   10.83 +};
   10.84 +
   10.85 +static u8 out_shstrtab[] = "\0.text\0.shstrtab";
   10.86 +
   10.87 +static Elf32_Shdr out_shdr[] = {
   10.88 +    { 0 },
   10.89 +    { 1,                                     /* sh_name */
   10.90 +      SHT_PROGBITS,                          /* sh_type */
   10.91 +      SHF_WRITE|SHF_ALLOC|SHF_EXECINSTR,     /* sh_flags */
   10.92 +      DYNAMICALLY_FILLED,                    /* sh_addr */
   10.93 +      RAW_OFFSET,                            /* sh_offset */
   10.94 +      DYNAMICALLY_FILLED,                    /* sh_size */
   10.95 +      0,                                     /* sh_link */
   10.96 +      0,                                     /* sh_info */
   10.97 +      64,                                    /* sh_addralign */
   10.98 +      0                                      /* sh_entsize */
   10.99 +    },
  10.100 +    { 7,                                     /* sh_name */
  10.101 +      SHT_STRTAB,                            /* sh_type */
  10.102 +      0,                                     /* sh_flags */
  10.103 +      0,                                     /* sh_addr */
  10.104 +      DYNAMICALLY_FILLED,                    /* sh_offset */
  10.105 +      sizeof(out_shstrtab),                  /* sh_size */
  10.106 +      0,                                     /* sh_link */
  10.107 +      0,                                     /* sh_info */
  10.108 +      1,                                     /* sh_addralign */
  10.109 +      0                                      /* sh_entsize */
  10.110 +    }
  10.111 +};
  10.112 +
  10.113 +static void do_write(int fd, void *data, int len)
  10.114 +{
  10.115 +    int   done, left = len;
  10.116 +    char *p = data;
  10.117 +
  10.118 +    while ( left != 0 )
  10.119 +    {
  10.120 +        if ( (done = write(fd, p, left)) == -1 )
  10.121 +        {
  10.122 +            if ( errno == EINTR )
  10.123 +                continue;
  10.124 +            fprintf(stderr, "Error writing output image: %d (%s).\n",
  10.125 +                    errno, strerror(errno));
  10.126 +            exit(1);
  10.127 +        }
  10.128 +
  10.129 +        left -= done;
  10.130 +        p    += done;
  10.131 +    }
  10.132 +}
  10.133 +
  10.134 +static void do_read(int fd, void *data, int len)
  10.135 +{
  10.136 +    int   done, left = len;
  10.137 +    char *p = data;
  10.138 +
  10.139 +    while ( left != 0 )
  10.140 +    {
  10.141 +        if ( (done = read(fd, p, left)) == -1 )
  10.142 +        {
  10.143 +            if ( errno == EINTR )
  10.144 +                continue;
  10.145 +            fprintf(stderr, "Error reading input image: %d (%s).\n",
  10.146 +                    errno, strerror(errno));
  10.147 +            exit(1);
  10.148 +        }
  10.149 +
  10.150 +        left -= done;
  10.151 +        p    += done;
  10.152 +    }
  10.153 +}
  10.154 +
  10.155 +int main(int argc, char **argv)
  10.156 +{
  10.157 +    u32        loadbase, dat_siz, mem_siz;
  10.158 +    char      *inimage, *outimage;
  10.159 +    int        infd, outfd;
  10.160 +    char       buffer[1024];
  10.161 +    int        bytes, todo;
  10.162 +
  10.163 +    Elf32_Ehdr in32_ehdr;
  10.164 +    Elf32_Phdr in32_phdr;
  10.165 +
  10.166 +    Elf64_Ehdr in64_ehdr;
  10.167 +    Elf64_Phdr in64_phdr;
  10.168 +
  10.169 +    if ( argc != 4 )
  10.170 +    {
  10.171 +        fprintf(stderr, "Usage: mkelf32 <in-image> <out-image> <load-base>\n");
  10.172 +        return 1;
  10.173 +    }
  10.174 +
  10.175 +    inimage  = argv[1];
  10.176 +    outimage = argv[2];
  10.177 +    loadbase = strtoul(argv[3], NULL, 16);
  10.178 +
  10.179 +    infd = open(inimage, O_RDONLY);
  10.180 +    if ( infd == -1 )
  10.181 +    {
  10.182 +        fprintf(stderr, "Failed to open input image '%s': %d (%s).\n",
  10.183 +                inimage, errno, strerror(errno));
  10.184 +        return 1;
  10.185 +    }
  10.186 +
  10.187 +    do_read(infd, &in32_ehdr, sizeof(in32_ehdr));
  10.188 +    if ( !IS_ELF(in32_ehdr) ||
  10.189 +         (in32_ehdr.e_ident[EI_DATA] != ELFDATA2LSB) )
  10.190 +    {
  10.191 +        fprintf(stderr, "Input image must be a little-endian Elf image.\n");
  10.192 +        return 1;
  10.193 +    }
  10.194 +
  10.195 +    switch ( in32_ehdr.e_ident[EI_CLASS] )
  10.196 +    {
  10.197 +    case ELFCLASS32:
  10.198 +        if ( in32_ehdr.e_phentsize != sizeof(in32_phdr) )
  10.199 +        {
  10.200 +            fprintf(stderr, "Bad program header size (%d != %d).\n",
  10.201 +                    (int)in32_ehdr.e_phentsize, (int)sizeof(in32_phdr));
  10.202 +            return 1;
  10.203 +        }
  10.204 +
  10.205 +        if ( in32_ehdr.e_phnum != 1 )
  10.206 +        {
  10.207 +            fprintf(stderr, "Expect precisly 1 program header; found %d.\n",
  10.208 +                    (int)in32_ehdr.e_phnum);
  10.209 +            return 1;
  10.210 +        }
  10.211 +
  10.212 +        (void)lseek(infd, in32_ehdr.e_phoff, SEEK_SET);
  10.213 +        do_read(infd, &in32_phdr, sizeof(in32_phdr));
  10.214 +
  10.215 +        (void)lseek(infd, in32_phdr.p_offset, SEEK_SET);
  10.216 +        dat_siz = (u32)in32_phdr.p_filesz;
  10.217 +        mem_siz = (u32)in32_phdr.p_memsz;
  10.218 +        break;
  10.219 +
  10.220 +    case ELFCLASS64:
  10.221 +        (void)lseek(infd, 0, SEEK_SET);
  10.222 +        do_read(infd, &in64_ehdr, sizeof(in64_ehdr));
  10.223 +
  10.224 +        if ( in64_ehdr.e_phentsize != sizeof(in64_phdr) )
  10.225 +        {
  10.226 +            fprintf(stderr, "Bad program header size (%d != %d).\n",
  10.227 +                    (int)in64_ehdr.e_phentsize, (int)sizeof(in64_phdr));
  10.228 +            return 1;
  10.229 +        }
  10.230 +
  10.231 +        if ( in64_ehdr.e_phnum != 1 )
  10.232 +        {
  10.233 +            fprintf(stderr, "Expect precisly 1 program header; found %d.\n",
  10.234 +                    (int)in64_ehdr.e_phnum);
  10.235 +            return 1;
  10.236 +        }
  10.237 +
  10.238 +        (void)lseek(infd, in64_ehdr.e_phoff, SEEK_SET);
  10.239 +        do_read(infd, &in64_phdr, sizeof(in64_phdr));
  10.240 +
  10.241 +        (void)lseek(infd, in64_phdr.p_offset, SEEK_SET);
  10.242 +        dat_siz = (u32)in64_phdr.p_filesz;
  10.243 +        mem_siz = (u32)in64_phdr.p_memsz;
  10.244 +        break;
  10.245 +
  10.246 +    default:
  10.247 +        fprintf(stderr, "Input image must be a 32- or 64-bit Elf image.\n");
  10.248 +        return 1;
  10.249 +    }
  10.250 +
  10.251 +    out_ehdr.e_entry = loadbase;
  10.252 +    out_ehdr.e_shoff = RAW_OFFSET + dat_siz;
  10.253 +
  10.254 +    out_phdr.p_vaddr  = loadbase;
  10.255 +    out_phdr.p_paddr  = loadbase;
  10.256 +    out_phdr.p_filesz = dat_siz;
  10.257 +    out_phdr.p_memsz  = mem_siz;
  10.258 +
  10.259 +    out_shdr[1].sh_addr   = loadbase;
  10.260 +    out_shdr[1].sh_size   = dat_siz;
  10.261 +    out_shdr[2].sh_offset = RAW_OFFSET + dat_siz + sizeof(out_shdr);
  10.262 +
  10.263 +    outfd = open(outimage, O_WRONLY|O_CREAT|O_TRUNC, 0775);
  10.264 +    if ( outfd == -1 )
  10.265 +    {
  10.266 +        fprintf(stderr, "Failed to open output image '%s': %d (%s).\n",
  10.267 +                outimage, errno, strerror(errno));
  10.268 +        return 1;
  10.269 +    }
  10.270 +
  10.271 +    do_write(outfd, &out_ehdr, sizeof(out_ehdr));
  10.272 +    do_write(outfd, &out_phdr, sizeof(out_phdr));
  10.273 +    
  10.274 +    if ( (bytes = RAW_OFFSET - sizeof(out_ehdr) - sizeof(out_phdr)) < 0 )
  10.275 +    {
  10.276 +        fprintf(stderr, "Header overflow.\n");
  10.277 +        return 1;
  10.278 +    }
  10.279 +    do_write(outfd, buffer, bytes);
  10.280 +
  10.281 +    for ( bytes = 0; bytes < dat_siz; bytes += todo )
  10.282 +    {
  10.283 +        todo = ((dat_siz - bytes) > sizeof(buffer)) ? 
  10.284 +            sizeof(buffer) : (dat_siz - bytes);
  10.285 +        do_read(infd, buffer, todo);
  10.286 +        do_write(outfd, buffer, todo);
  10.287 +    }
  10.288 +
  10.289 +    do_write(outfd, &out_shdr[0], sizeof(out_shdr));
  10.290 +    do_write(outfd, out_shstrtab, sizeof(out_shstrtab));
  10.291 +    do_write(outfd, buffer, 4-((sizeof(out_shstrtab)+dat_siz)&3));
  10.292 +
  10.293 +    close(infd);
  10.294 +    close(outfd);
  10.295 +
  10.296 +    return 0;
  10.297 +}
    11.1 --- a/xen/arch/x86/boot/x86_64.S	Fri Jul 09 18:28:03 2004 +0000
    11.2 +++ b/xen/arch/x86/boot/x86_64.S	Mon Jul 12 12:58:48 2004 +0000
    11.3 @@ -1,10 +1,11 @@
    11.4  #include <xen/config.h>
    11.5  #include <hypervisor-ifs/hypervisor-if.h>
    11.6  #include <asm/page.h>
    11.7 +#include <asm/msr.h>
    11.8  
    11.9  #define  SECONDARY_CPU_FLAG 0xA5A5A5A5
   11.10                  
   11.11 -       	.text
   11.12 +        .text
   11.13          .code32
   11.14          
   11.15  ENTRY(start)
   11.16 @@ -13,11 +14,11 @@ ENTRY(start)
   11.17          .org    0x004
   11.18  /*** MULTIBOOT HEADER ****/
   11.19          /* Magic number indicating a Multiboot header. */
   11.20 -	.long	0x1BADB002
   11.21 -	/* Flags to bootloader (see Multiboot spec). */
   11.22 -	.long	0x00000002
   11.23 -	/* Checksum: must be the negated sum of the first two fields. */
   11.24 -	.long	-0x1BADB004
   11.25 +        .long   0x1BADB002
   11.26 +        /* Flags to bootloader (see Multiboot spec). */
   11.27 +        .long   0x00000002
   11.28 +        /* Checksum: must be the negated sum of the first two fields. */
   11.29 +        .long   -0x1BADB004
   11.30  
   11.31          .org    0x010
   11.32          .asciz "Bad CPU: does not support 64-bit (long) mode."
   11.33 @@ -66,38 +67,30 @@ 3:      in      %dx,%al
   11.34          mov     $0x20,%ecx # X86_CR4_PAE
   11.35          mov     %ecx,%cr4
   11.36  
   11.37 -        cmp     $(SECONDARY_CPU_FLAG),%ebx
   11.38 -        je      start_paging
   11.39 -
   11.40          mov     %ebx,0x1001e0 /* Multiboot info struct */
   11.41          mov     %eax,0x1001e4 /* Multiboot magic value */
   11.42  
   11.43 -        /* Initialize mappings of 1GB of memory. */
   11.44 -        mov     $0x103000,%edi               /* idle_pg_table_l2 */
   11.45 -        mov     $0x1e3,%eax                  /* PRESENT+RW+A+D+PSE+GLOBAL */
   11.46 -        mov     $512,%ecx
   11.47 -1:      stosl
   11.48 -        add     $0x200000,%eax
   11.49 -        loop    1b
   11.50 -
   11.51 -start_paging:
   11.52 +        /* Load pagetable base register. */
   11.53          mov     $0x101000,%eax   /* idle_pg_table */
   11.54          mov     %eax,%cr3
   11.55 +
   11.56 +        /* Set up EFER (Extended Feature Enable Register). */
   11.57 +        movl    $MSR_EFER, %ecx
   11.58 +        rdmsr
   11.59 +        /* Long Mode, SYSCALL/SYSRET, No-Execute */
   11.60 +        movl    $(EFER_LME|EFER_SCE|EFER_NX),%eax
   11.61 +        wrmsr
   11.62 +
   11.63          mov     $0x80050033,%eax /* hi-to-lo: PG,AM,WP,NE,ET,MP,PE */
   11.64          mov     %eax,%cr0
   11.65          jmp     1f
   11.66 -1:      /* Now in compatibility mode. Long-jump into 64-bit mode. */
   11.67 -        ljmp    $(__HYPERVISOR_CS64),$0x1000e0
   11.68 -
   11.69 -        .code64
   11.70 -        .org    0x00e0
   11.71  
   11.72 -        /* Jump to high mappings. */
   11.73 -        mov     high_start(%rip),%rax
   11.74 -        push    %rax
   11.75 -        ret
   11.76 -__high_start:
   11.77 +1:      /* Now in compatibility mode. Long-jump into 64-bit mode. */
   11.78 +        ljmp    $(__HYPERVISOR_CS64),$0x100100
   11.79          
   11.80 +        .code64
   11.81 +        .org    0x0100
   11.82 +
   11.83          /* Install relocated selectors (FS/GS unused). */
   11.84          lgdt    gdt_descr(%rip)
   11.85          mov     $(__HYPERVISOR_DS),%ecx
   11.86 @@ -112,9 +105,15 @@ 1:      /* Now in compatibility mode. Lo
   11.87          mov     stack_start(%rip),%rsp
   11.88          
   11.89          /* Reset EFLAGS (subsumes CLI and CLD). */
   11.90 -	pushq	$0
   11.91 -	popf
   11.92 +        pushq   $0
   11.93 +        popf
   11.94  
   11.95 +        /* Jump to high mappings. */
   11.96 +        mov     high_start(%rip),%rax
   11.97 +        push    %rax
   11.98 +        ret
   11.99 +__high_start:
  11.100 +        
  11.101          lidt    idt_descr(%rip)
  11.102                  
  11.103          cmp     $(SECONDARY_CPU_FLAG),%ebx
  11.104 @@ -139,19 +138,15 @@ 1:      mov     %eax,(%rdi)
  11.105          add     $8,%rdi
  11.106          loop    1b
  11.107  
  11.108 -        xor     %rax,%rax
  11.109          mov     0x1001e0,%eax /* Multiboot info struct */
  11.110          lea     start(%rip),%rbx
  11.111          sub     $0x100000,%rbx
  11.112          add     %rbx,%rax
  11.113          push    %rax
  11.114 -        xor     %rax,%rax
  11.115          mov     0x1001e4,%eax /* Multiboot magic value */
  11.116          push    %rax
  11.117          
  11.118 -        /* Call into main C routine. This should never return.*/
  11.119 -       	call	cmain
  11.120 -        ud2     /* Force a panic (invalid opcode). */
  11.121 +        call    cmain
  11.122  
  11.123  /* This is the default interrupt handler. */
  11.124  int_msg:
  11.125 @@ -167,7 +162,9 @@ ignore_int:
  11.126  1:      jmp     1b
  11.127  
  11.128          .code32
  11.129 -                
  11.130 +
  11.131 +        .org    0x1e0
  11.132 +                        
  11.133  /*** DESCRIPTOR TABLES ***/
  11.134  
  11.135  .globl SYMBOL_NAME(idt)
  11.136 @@ -192,35 +189,51 @@ ENTRY(gdt_table)
  11.137  
  11.138          .word   0
  11.139  gdt_descr:
  11.140 -	.word	(LAST_RESERVED_GDT_ENTRY*8)+7
  11.141 +        .word   (LAST_RESERVED_GDT_ENTRY*8)+7
  11.142  SYMBOL_NAME(gdt):       
  11.143          .quad   SYMBOL_NAME(gdt_table)
  11.144  
  11.145          .word   0    
  11.146  idt_descr:
  11.147 -	.word	256*8-1
  11.148 +        .word   256*8-1
  11.149  SYMBOL_NAME(idt):
  11.150 -        .quad	SYMBOL_NAME(idt_table)
  11.151 +        .quad   SYMBOL_NAME(idt_table)
  11.152  
  11.153  ENTRY(stack_start)
  11.154 -        .quad   SYMBOL_NAME(cpu0_stack) + 8100 - __PAGE_OFFSET
  11.155 +        .quad   SYMBOL_NAME(cpu0_stack) + 8100
  11.156  
  11.157  high_start:
  11.158          .quad   __high_start
  11.159                  
  11.160 +/* Initial PML4 -- level-4 page table */
  11.161          .org 0x1000
  11.162  ENTRY(idle_pg_table)
  11.163  ENTRY(idle_pg_table_4)
  11.164          .quad 0x0000000000102007 # PML4[0]
  11.165          .fill 261,8,0
  11.166          .quad 0x0000000000102007 # PML4[262]
  11.167 +
  11.168 +/* Initial PDP -- level-3 page table */
  11.169          .org 0x2000
  11.170  ENTRY(idle_pg_table_l3)
  11.171          .quad 0x0000000000103007
  11.172 +
  11.173 +/* Initial PDE -- level-2 page table. */
  11.174          .org 0x3000
  11.175  ENTRY(idle_pg_table_l2)
  11.176 +        .macro identmap from=0, count=512
  11.177 +        .if \count-1
  11.178 +        identmap "(\from+0)","(\count/2)"
  11.179 +        identmap "(\from+(0x200000*(\count/2)))","(\count/2)"
  11.180 +        .else
  11.181 +        .quad 0x00000000000001e3 + \from
  11.182 +        .endif
  11.183 +        .endm
  11.184 +        identmap /* Too orangey for crows :-) */
  11.185 +
  11.186          .org 0x4000
  11.187  ENTRY(cpu0_stack)    # Initial stack is 8kB
  11.188 +
  11.189          .org 0x6000
  11.190  ENTRY(stext)
  11.191  ENTRY(_stext)
    12.1 --- a/xen/arch/x86/x86_32/xen.lds	Fri Jul 09 18:28:03 2004 +0000
    12.2 +++ b/xen/arch/x86/x86_32/xen.lds	Mon Jul 12 12:58:48 2004 +0000
    12.3 @@ -1,9 +1,14 @@
    12.4  /* ld script to make i386 Linux kernel
    12.5 - * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
    12.6 + * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
    12.7 + * Modifified for i386 Xen by Keir Fraser
    12.8   */
    12.9  OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
   12.10  OUTPUT_ARCH(i386)
   12.11  ENTRY(start)
   12.12 +PHDRS
   12.13 +{
   12.14 +  text PT_LOAD ;
   12.15 +}
   12.16  SECTIONS
   12.17  {
   12.18    . = 0xFC400000 + 0x100000;
   12.19 @@ -12,61 +17,61 @@ SECTIONS
   12.20  	*(.text)
   12.21  	*(.fixup)
   12.22  	*(.gnu.warning)
   12.23 -	} = 0x9090
   12.24 -  .text.lock : { *(.text.lock) }	/* out-of-line lock text */
   12.25 +	} :text =0x9090
   12.26 +  .text.lock : { *(.text.lock) } :text	/* out-of-line lock text */
   12.27  
   12.28    _etext = .;			/* End of text section */
   12.29  
   12.30 -  .rodata : { *(.rodata) *(.rodata.*) }
   12.31 -  .kstrtab : { *(.kstrtab) }
   12.32 +  .rodata : { *(.rodata) *(.rodata.*) } :text
   12.33 +  .kstrtab : { *(.kstrtab) } :text
   12.34  
   12.35    . = ALIGN(16);		/* Exception table */
   12.36    __start___ex_table = .;
   12.37 -  __ex_table : { *(__ex_table) }
   12.38 +  __ex_table : { *(__ex_table) } :text
   12.39    __stop___ex_table = .;
   12.40  
   12.41    __start___ksymtab = .;	/* Kernel symbol table */
   12.42 -  __ksymtab : { *(__ksymtab) }
   12.43 +  __ksymtab : { *(__ksymtab) } :text
   12.44    __stop___ksymtab = .;
   12.45  
   12.46    __start___kallsyms = .;	/* All kernel symbols */
   12.47 -  __kallsyms : { *(__kallsyms) }
   12.48 +  __kallsyms : { *(__kallsyms) } :text
   12.49    __stop___kallsyms = .;
   12.50  
   12.51    .data : {			/* Data */
   12.52  	*(.data)
   12.53  	CONSTRUCTORS
   12.54 -	}
   12.55 +	} :text
   12.56  
   12.57    _edata = .;			/* End of data section */
   12.58  
   12.59    . = ALIGN(8192);		/* init_task */
   12.60 -  .data.init_task : { *(.data.init_task) }
   12.61 +  .data.init_task : { *(.data.init_task) } :text
   12.62  
   12.63    . = ALIGN(4096);		/* Init code and data */
   12.64    __init_begin = .;
   12.65 -  .text.init : { *(.text.init) }
   12.66 -  .data.init : { *(.data.init) }
   12.67 +  .text.init : { *(.text.init) } :text
   12.68 +  .data.init : { *(.data.init) } :text
   12.69    . = ALIGN(16);
   12.70    __setup_start = .;
   12.71 -  .setup.init : { *(.setup.init) }
   12.72 +  .setup.init : { *(.setup.init) } :text
   12.73    __setup_end = .;
   12.74    __initcall_start = .;
   12.75 -  .initcall.init : { *(.initcall.init) }
   12.76 +  .initcall.init : { *(.initcall.init) } :text
   12.77    __initcall_end = .;
   12.78    . = ALIGN(4096);
   12.79    __init_end = .;
   12.80  
   12.81    . = ALIGN(4096);
   12.82 -  .data.page_aligned : { *(.data.idt) }
   12.83 +  .data.page_aligned : { *(.data.idt) } :text
   12.84  
   12.85    . = ALIGN(32);
   12.86 -  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
   12.87 +  .data.cacheline_aligned : { *(.data.cacheline_aligned) } :text
   12.88  
   12.89    __bss_start = .;		/* BSS */
   12.90    .bss : {
   12.91  	*(.bss)
   12.92 -	}
   12.93 +	} :text
   12.94    _end = . ;
   12.95  
   12.96    /* Sections to be discarded */
    13.1 --- a/xen/arch/x86/x86_64/xen.lds	Fri Jul 09 18:28:03 2004 +0000
    13.2 +++ b/xen/arch/x86/x86_64/xen.lds	Mon Jul 12 12:58:48 2004 +0000
    13.3 @@ -1,7 +1,12 @@
    13.4  /* Excerpts written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> */
    13.5 +/* Modified for x86-64 Xen by Keir Fraser */
    13.6  OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
    13.7  OUTPUT_ARCH(i386:x86-64)
    13.8  ENTRY(start)
    13.9 +PHDRS
   13.10 +{
   13.11 +  text PT_LOAD ;
   13.12 +}
   13.13  SECTIONS
   13.14  {
   13.15    . = 0xFFFF830000100000;
   13.16 @@ -10,61 +15,61 @@ SECTIONS
   13.17  	*(.text)
   13.18  	*(.fixup)
   13.19  	*(.gnu.warning)
   13.20 -	} = 0x9090
   13.21 -  .text.lock : { *(.text.lock) }	/* out-of-line lock text */
   13.22 +	} :text = 0x9090
   13.23 +  .text.lock : { *(.text.lock) } :text	/* out-of-line lock text */
   13.24  
   13.25    _etext = .;			/* End of text section */
   13.26  
   13.27 -  .rodata : { *(.rodata) *(.rodata.*) }
   13.28 -  .kstrtab : { *(.kstrtab) }
   13.29 +  .rodata : { *(.rodata) *(.rodata.*) } :text
   13.30 +  .kstrtab : { *(.kstrtab) } :text
   13.31  
   13.32    . = ALIGN(16);		/* Exception table */
   13.33    __start___ex_table = .;
   13.34 -  __ex_table : { *(__ex_table) }
   13.35 +  __ex_table : { *(__ex_table) } :text
   13.36    __stop___ex_table = .;
   13.37  
   13.38    __start___ksymtab = .;	/* Kernel symbol table */
   13.39 -  __ksymtab : { *(__ksymtab) }
   13.40 +  __ksymtab : { *(__ksymtab) } :text
   13.41    __stop___ksymtab = .;
   13.42  
   13.43    __start___kallsyms = .;	/* All kernel symbols */
   13.44 -  __kallsyms : { *(__kallsyms) }
   13.45 +  __kallsyms : { *(__kallsyms) } :text
   13.46    __stop___kallsyms = .;
   13.47  
   13.48    .data : {			/* Data */
   13.49  	*(.data)
   13.50  	CONSTRUCTORS
   13.51 -	}
   13.52 +	} :text
   13.53  
   13.54    _edata = .;			/* End of data section */
   13.55  
   13.56    . = ALIGN(8192);		/* init_task */
   13.57 -  .data.init_task : { *(.data.init_task) }
   13.58 +  .data.init_task : { *(.data.init_task) } :text
   13.59  
   13.60    . = ALIGN(4096);		/* Init code and data */
   13.61    __init_begin = .;
   13.62 -  .text.init : { *(.text.init) }
   13.63 -  .data.init : { *(.data.init) }
   13.64 +  .text.init : { *(.text.init) } :text
   13.65 +  .data.init : { *(.data.init) } :text
   13.66    . = ALIGN(16);
   13.67    __setup_start = .;
   13.68 -  .setup.init : { *(.setup.init) }
   13.69 +  .setup.init : { *(.setup.init) } :text
   13.70    __setup_end = .;
   13.71    __initcall_start = .;
   13.72 -  .initcall.init : { *(.initcall.init) }
   13.73 +  .initcall.init : { *(.initcall.init) } :text
   13.74    __initcall_end = .;
   13.75    . = ALIGN(4096);
   13.76    __init_end = .;
   13.77  
   13.78    . = ALIGN(4096);
   13.79 -  .data.page_aligned : { *(.data.idt) }
   13.80 +  .data.page_aligned : { *(.data.idt) } :text
   13.81  
   13.82    . = ALIGN(32);
   13.83 -  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
   13.84 +  .data.cacheline_aligned : { *(.data.cacheline_aligned) } :text
   13.85  
   13.86    __bss_start = .;		/* BSS */
   13.87    .bss : {
   13.88  	*(.bss)
   13.89 -	}
   13.90 +	} :text
   13.91    _end = . ;
   13.92  
   13.93    /* Sections to be discarded */
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/xen/figlet/LICENSE	Mon Jul 12 12:58:48 2004 +0000
    14.3 @@ -0,0 +1,111 @@
    14.4 +http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
    14.5 +
    14.6 +			 The "Artistic License"
    14.7 +
    14.8 +				Preamble
    14.9 +
   14.10 +The intent of this document is to state the conditions under which a
   14.11 +Package may be copied, such that the Copyright Holder maintains some
   14.12 +semblance of artistic control over the development of the package,
   14.13 +while giving the users of the package the right to use and distribute
   14.14 +the Package in a more-or-less customary fashion, plus the right to make
   14.15 +reasonable modifications.
   14.16 +
   14.17 +Definitions:
   14.18 +
   14.19 +	"Package" refers to the collection of files distributed by the
   14.20 +	Copyright Holder, and derivatives of that collection of files
   14.21 +	created through textual modification.
   14.22 +
   14.23 +	"Standard Version" refers to such a Package if it has not been
   14.24 +	modified, or has been modified in accordance with the wishes
   14.25 +	of the Copyright Holder.
   14.26 +
   14.27 +	"Copyright Holder" is whoever is named in the copyright or
   14.28 +	copyrights for the package.
   14.29 +
   14.30 +	"You" is you, if you're thinking about copying or distributing
   14.31 +	this Package.
   14.32 +
   14.33 +	"Reasonable copying fee" is whatever you can justify on the
   14.34 +	basis of media cost, duplication charges, time of people involved,
   14.35 +	and so on.  (You will not be required to justify it to the
   14.36 +	Copyright Holder, but only to the computing community at large
   14.37 +	as a market that must bear the fee.)
   14.38 +
   14.39 +	"Freely Available" means that no fee is charged for the item
   14.40 +	itself, though there may be fees involved in handling the item.
   14.41 +	It also means that recipients of the item may redistribute it
   14.42 +	under the same conditions they received it.
   14.43 +
   14.44 +1. You may make and give away verbatim copies of the source form of the
   14.45 +Standard Version of this Package without restriction, provided that you
   14.46 +duplicate all of the original copyright notices and associated disclaimers.
   14.47 +
   14.48 +2. You may apply bug fixes, portability fixes and other modifications
   14.49 +derived from the Public Domain or from the Copyright Holder.  A Package
   14.50 +modified in such a way shall still be considered the Standard Version.
   14.51 +
   14.52 +3. You may otherwise modify your copy of this Package in any way, provided
   14.53 +that you insert a prominent notice in each changed file stating how and
   14.54 +when you changed that file, and provided that you do at least ONE of the
   14.55 +following:
   14.56 +
   14.57 +    a) place your modifications in the Public Domain or otherwise make them
   14.58 +    Freely Available, such as by posting said modifications to Usenet or
   14.59 +    an equivalent medium, or placing the modifications on a major archive
   14.60 +    site such as ftp.uu.net, or by allowing the Copyright Holder to include
   14.61 +    your modifications in the Standard Version of the Package.
   14.62 +
   14.63 +    b) use the modified Package only within your corporation or organization.
   14.64 +
   14.65 +    c) rename any non-standard executables so the names do not conflict
   14.66 +    with standard executables, which must also be provided, and provide
   14.67 +    a separate manual page for each non-standard executable that clearly
   14.68 +    documents how it differs from the Standard Version.
   14.69 +
   14.70 +    d) make other distribution arrangements with the Copyright Holder.
   14.71 +
   14.72 +4. You may distribute the programs of this Package in object code or
   14.73 +executable form, provided that you do at least ONE of the following:
   14.74 +
   14.75 +    a) distribute a Standard Version of the executables and library files,
   14.76 +    together with instructions (in the manual page or equivalent) on where
   14.77 +    to get the Standard Version.
   14.78 +
   14.79 +    b) accompany the distribution with the machine-readable source of
   14.80 +    the Package with your modifications.
   14.81 +
   14.82 +    c) accompany any non-standard executables with their corresponding
   14.83 +    Standard Version executables, giving the non-standard executables
   14.84 +    non-standard names, and clearly documenting the differences in manual
   14.85 +    pages (or equivalent), together with instructions on where to get
   14.86 +    the Standard Version.
   14.87 +
   14.88 +    d) make other distribution arrangements with the Copyright Holder.
   14.89 +
   14.90 +5. You may charge a reasonable copying fee for any distribution of this
   14.91 +Package.  You may charge any fee you choose for support of this Package.
   14.92 +You may not charge a fee for this Package itself.  However,
   14.93 +you may distribute this Package in aggregate with other (possibly
   14.94 +commercial) programs as part of a larger (possibly commercial) software
   14.95 +distribution provided that you do not advertise this Package as a
   14.96 +product of your own.
   14.97 +
   14.98 +6. The scripts and library files supplied as input to or produced as
   14.99 +output from the programs of this Package do not automatically fall
  14.100 +under the copyright of this Package, but belong to whomever generated
  14.101 +them, and may be sold commercially, and may be aggregated with this
  14.102 +Package.
  14.103 +
  14.104 +7. C or perl subroutines supplied by you and linked into this Package
  14.105 +shall not be considered part of this Package.
  14.106 +
  14.107 +8. The name of the Copyright Holder may not be used to endorse or promote
  14.108 +products derived from this software without specific prior written permission.
  14.109 +
  14.110 +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  14.111 +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  14.112 +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  14.113 +
  14.114 +				The End
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/xen/figlet/Makefile	Mon Jul 12 12:58:48 2004 +0000
    15.3 @@ -0,0 +1,8 @@
    15.4 +
    15.5 +CC := gcc
    15.6 +
    15.7 +figlet: figlet.c
    15.8 +	$(CC) -o $@ $<
    15.9 +
   15.10 +clean:
   15.11 +	rm -f *.o figlet
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/xen/figlet/README	Mon Jul 12 12:58:48 2004 +0000
    16.3 @@ -0,0 +1,9 @@
    16.4 +
    16.5 +NB. This is a very hacked version of Figlet 2.2.1. 
    16.6 +
    16.7 +Don't use this outside the Xen build system. A proper version of Figlet
    16.8 +can be had from <http://www.figlet.org>.
    16.9 +
   16.10 +The distribution license is intact in the LICENSE file.
   16.11 +
   16.12 + -- Keir Fraser (2/5/2003)
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/xen/figlet/figlet.c	Mon Jul 12 12:58:48 2004 +0000
    17.3 @@ -0,0 +1,2075 @@
    17.4 +
    17.5 +/*
    17.6 + * XXXXXXXXXXXXXXXXXXXXXXXXXXX
    17.7 + * 
    17.8 + * This is a HACKED figlet source file for Xen.
    17.9 + * 
   17.10 + * Hacked to output C octal strings for inclusion in a header file.
   17.11 + * Support for opening zipped files is removed.
   17.12 + * 
   17.13 + * Go to www.figlet.org for the unhacked Figlet sources.
   17.14 + */
   17.15 +
   17.16 +/****************************************************************************
   17.17 +
   17.18 +  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
   17.19 +  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
   17.20 +  FIGlet Copyright 2002 Christiaan Keet
   17.21 +  Portions written by Paul Burton and Christiaan Keet
   17.22 +  Internet: <info@figlet.org>
   17.23 +  FIGlet, along with the various FIGlet fonts and documentation, is
   17.24 +    copyrighted under the provisions of the Artistic License (as listed
   17.25 +    in the file "Artistic-license.txt" which is included in this package.
   17.26 +****************************************************************************/
   17.27 +
   17.28 +#define DATE "13 July 2002"
   17.29 +#define VERSION "2.2.1"
   17.30 +#define VERSION_INT 20201
   17.31 +
   17.32 +/* FIGlet (Frank, Ian & Glenn's Letters) */
   17.33 +/* by Glenn Chappell */
   17.34 +/* Apr 1991 */
   17.35 +/* Automatic file addition by Ian Chai May 1991 */
   17.36 +/* Punctuation and numbers addition by Ian Chai Jan 1993 */
   17.37 +/* Full ASCII by Glenn Chappell Feb 1993 */
   17.38 +/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
   17.39 +/* Hard blanks by Glenn Chappell Apr 1993 */
   17.40 +/* Release 2.0 5 Aug 1993 */
   17.41 +/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
   17.42 +/* Control files by Glenn Chappell Feb 1994 */
   17.43 +/* Release 2.1 12 Aug 1994 */
   17.44 +/* Release 2.1.1 25 Aug 1994 */
   17.45 +/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
   17.46 +   option.  Sept 8, 1996 */
   17.47 +/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
   17.48 +   mapping tables, kerning/smushing options. */
   17.49 +/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
   17.50 +   FAQs and comments. 13 July 2002. The new official FIGlet website is 
   17.51 +   http://www.figlet.org/  */
   17.52 +
   17.53 +#define DEFAULTFONTDIR "."
   17.54 +#define DEFAULTFONTFILE "xen.flf"
   17.55 +
   17.56 +#include <stdio.h>
   17.57 +#ifdef __STDC__
   17.58 +#include <stdlib.h>
   17.59 +#endif
   17.60 +#include <string.h>
   17.61 +#include <ctype.h>
   17.62 +#include <fcntl.h>     /* Needed for get_columns */
   17.63 +
   17.64 +#ifdef unix
   17.65 +#include <sys/ioctl.h> /* Needed for get_columns */
   17.66 +#endif
   17.67 +
   17.68 +
   17.69 +#define ZFILE FILE
   17.70 +#define Zopen fopen
   17.71 +#define Zgetc fgetc
   17.72 +#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
   17.73 +#define Zclose fclose
   17.74 +
   17.75 +#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
   17.76 +
   17.77 +#define DIRSEP '/'
   17.78 +#define DIRSEP2 '\\'
   17.79 +/* Leave alone for Unix and MS-DOS/Windows!
   17.80 +Note: '/' also used in filename in get_columns(). */
   17.81 +
   17.82 +#define FONTFILESUFFIX ".flf"
   17.83 +#define FONTFILEMAGICNUMBER "flf2"
   17.84 +#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
   17.85 +#define CONTROLFILESUFFIX ".flc"
   17.86 +#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
   17.87 +#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
   17.88 +#define DEFAULTCOLUMNS 80
   17.89 +
   17.90 +
   17.91 +/****************************************************************************
   17.92 +
   17.93 +  Globals dealing with chars that are read
   17.94 +
   17.95 +****************************************************************************/
   17.96 +
   17.97 +typedef long inchr; /* "char" read from stdin */
   17.98 +
   17.99 +inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
  17.100 +                   /* Note: not null-terminated. */
  17.101 +int inchrlinelen,inchrlinelenlimit;
  17.102 +inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
  17.103 +  /* Latin-1 codes for German letters, respectively:
  17.104 +     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
  17.105 +     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
  17.106 +     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
  17.107 +     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
  17.108 +     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
  17.109 +     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
  17.110 +     LATIN SMALL LETTER SHARP S = ess-zed
  17.111 +  */
  17.112 +
  17.113 +int hzmode;  /* true if reading double-bytes in HZ mode */
  17.114 +int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
  17.115 +inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
  17.116 +int gl; /* 0-3 specifies left-half Gn character set */
  17.117 +int gr; /* 0-3 specifies right-half Gn character set */
  17.118 +
  17.119 +int Myargc;  /* to avoid passing around argc and argv */
  17.120 +char **Myargv;
  17.121 +
  17.122 +/****************************************************************************
  17.123 +
  17.124 +  Globals dealing with chars that are written
  17.125 +
  17.126 +****************************************************************************/
  17.127 +
  17.128 +typedef struct fc {
  17.129 +  inchr ord;
  17.130 +  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  17.131 +  struct fc *next;
  17.132 +  } fcharnode;
  17.133 +
  17.134 +fcharnode *fcharlist;
  17.135 +char **currchar;
  17.136 +int currcharwidth;
  17.137 +int previouscharwidth;
  17.138 +char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
  17.139 +int outlinelen;
  17.140 +
  17.141 +
  17.142 +/****************************************************************************
  17.143 +
  17.144 +  Globals dealing with command file storage
  17.145 +
  17.146 +****************************************************************************/
  17.147 +
  17.148 +typedef struct cfn {
  17.149 +  char *thename;
  17.150 +  struct cfn *next;
  17.151 +  } cfnamenode;
  17.152 +
  17.153 +cfnamenode *cfilelist,**cfilelistend;
  17.154 +
  17.155 +typedef struct cm {
  17.156 +  int thecommand;
  17.157 +  inchr rangelo;
  17.158 +  inchr rangehi;
  17.159 +  inchr offset;
  17.160 +  struct cm *next;
  17.161 +  } comnode;
  17.162 +
  17.163 +comnode *commandlist,**commandlistend;
  17.164 +
  17.165 +/****************************************************************************
  17.166 +
  17.167 +  Globals affected by command line options
  17.168 +
  17.169 +****************************************************************************/
  17.170 +
  17.171 +int deutschflag,justification,paragraphflag,right2left,multibyte;
  17.172 +int cmdinput;
  17.173 +
  17.174 +#define SM_SMUSH 128
  17.175 +#define SM_KERN 64
  17.176 +#define SM_EQUAL 1
  17.177 +#define SM_LOWLINE 2
  17.178 +#define SM_HIERARCHY 4
  17.179 +#define SM_PAIR 8
  17.180 +#define SM_BIGX 16
  17.181 +#define SM_HARDBLANK 32
  17.182 +
  17.183 +int smushmode;
  17.184 +
  17.185 +#define SMO_NO 0     /* no command-line smushmode */
  17.186 +#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
  17.187 +#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
  17.188 +
  17.189 +int smushoverride;
  17.190 +
  17.191 +int outputwidth;
  17.192 +int outlinelenlimit;
  17.193 +char *fontdirname,*fontname;
  17.194 +
  17.195 +
  17.196 +/****************************************************************************
  17.197 +
  17.198 +  Globals read from font file
  17.199 +
  17.200 +****************************************************************************/
  17.201 +
  17.202 +char hardblank;
  17.203 +int charheight;
  17.204 +
  17.205 +
  17.206 +/****************************************************************************
  17.207 +
  17.208 +  Name of program, used in error messages
  17.209 +
  17.210 +****************************************************************************/
  17.211 +
  17.212 +char *myname;
  17.213 +
  17.214 +
  17.215 +#ifdef TIOCGWINSZ
  17.216 +/****************************************************************************
  17.217 +
  17.218 +  get_columns
  17.219 +
  17.220 +  Determines the number of columns of /dev/tty.  Returns the number of
  17.221 +  columns, or -1 if error.  May return 0 if columns unknown.
  17.222 +  Requires include files <fcntl.h> and <sys/ioctl.h>.
  17.223 +  by Glenn Chappell & Ian Chai 14 Apr 1993
  17.224 +
  17.225 +****************************************************************************/
  17.226 +
  17.227 +int get_columns()
  17.228 +{
  17.229 +  struct winsize ws;
  17.230 +  int fd,result;
  17.231 +
  17.232 +  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
  17.233 +  result = ioctl(fd,TIOCGWINSZ,&ws);
  17.234 +  close(fd);
  17.235 +  return result?-1:ws.ws_col;
  17.236 +}
  17.237 +#endif /* ifdef TIOCGWINSZ */
  17.238 +
  17.239 +
  17.240 +/****************************************************************************
  17.241 +
  17.242 +  myalloc
  17.243 +
  17.244 +  Calls malloc.  If malloc returns error, prints error message and
  17.245 +  quits.
  17.246 +
  17.247 +****************************************************************************/
  17.248 +
  17.249 +#ifdef __STDC__
  17.250 +char *myalloc(size_t size)
  17.251 +#else
  17.252 +char *myalloc(size)
  17.253 +int size;
  17.254 +#endif
  17.255 +{
  17.256 +  char *ptr;
  17.257 +#ifndef __STDC__
  17.258 +  extern void *malloc();
  17.259 +#endif
  17.260 +
  17.261 +  if ((ptr = (char*)malloc(size))==NULL) {
  17.262 +    fprintf(stderr,"%s: Out of memory\n",myname);
  17.263 +    exit(1);
  17.264 +    }
  17.265 +  else {
  17.266 +    return ptr;
  17.267 +    }
  17.268 +}
  17.269 +
  17.270 +
  17.271 +/****************************************************************************
  17.272 +
  17.273 +  hasdirsep
  17.274 +
  17.275 +  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
  17.276 +
  17.277 +****************************************************************************/
  17.278 +
  17.279 +int hasdirsep(s1)
  17.280 +char *s1;
  17.281 +{
  17.282 +  if (strchr(s1, DIRSEP)) return 1;
  17.283 +  else if (strchr(s1, DIRSEP2)) return 1;
  17.284 +  else return 0;
  17.285 +}
  17.286 +
  17.287 +/****************************************************************************
  17.288 +
  17.289 +  suffixcmp
  17.290 +
  17.291 +  Returns true if s2 is a suffix of s1; uses case-blind comparison.
  17.292 +
  17.293 +****************************************************************************/
  17.294 +
  17.295 +int suffixcmp(s1, s2)
  17.296 +char *s1;
  17.297 +char *s2;
  17.298 +{
  17.299 +  int len1, len2;
  17.300 +
  17.301 +  len1 = MYSTRLEN(s1);
  17.302 +  len2 = MYSTRLEN(s2);
  17.303 +  if (len2 > len1) return 0;
  17.304 +  s1 += len1 - len2;
  17.305 +  while (*s1) {
  17.306 +    if (tolower(*s1) != tolower(*s2)) return 0;
  17.307 +    s1++;
  17.308 +    s2++;
  17.309 +    }
  17.310 +  return 1;
  17.311 +}
  17.312 +   
  17.313 +/****************************************************************************
  17.314 +
  17.315 +  skiptoeol
  17.316 +
  17.317 +  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
  17.318 +
  17.319 +****************************************************************************/
  17.320 +
  17.321 +void skiptoeol(fp)
  17.322 +ZFILE *fp;
  17.323 +{
  17.324 +  int dummy;
  17.325 +
  17.326 +  while (dummy=Zgetc(fp),dummy!=EOF) {
  17.327 +    if (dummy == '\n') return;
  17.328 +    if (dummy == '\r') {
  17.329 +      dummy = Zgetc(fp);
  17.330 +      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
  17.331 +      return;
  17.332 +      }
  17.333 +  }
  17.334 +}
  17.335 +
  17.336 +
  17.337 +/****************************************************************************
  17.338 +
  17.339 +  myfgets
  17.340 +
  17.341 +  Local version of fgets.  Handles \r, \n, and \r\n terminators.
  17.342 +
  17.343 +****************************************************************************/
  17.344 +
  17.345 +char *myfgets(line,maxlen,fp)
  17.346 +char *line;
  17.347 +int maxlen;
  17.348 +ZFILE *fp;
  17.349 +{
  17.350 +  int c = 0;
  17.351 +  char *p;
  17.352 +
  17.353 +  p = line;
  17.354 +  while((c=Zgetc(fp))!=EOF&&maxlen) {
  17.355 +    *p++ = c;
  17.356 +    maxlen--;
  17.357 +    if (c=='\n') break;
  17.358 +    if (c=='\r') {
  17.359 +      c = Zgetc(fp);
  17.360 +      if (c != EOF && c != '\n') Zungetc(c,fp);
  17.361 +      *(p-1) = '\n';
  17.362 +      break;
  17.363 +      }
  17.364 +    }
  17.365 +  *p = 0;
  17.366 +  return (c==EOF) ? NULL : line;
  17.367 +}
  17.368 +
  17.369 +/****************************************************************************
  17.370 +
  17.371 +  usageerr
  17.372 +
  17.373 +  Prints "Usage: ...." line to the given stream.
  17.374 +
  17.375 +****************************************************************************/
  17.376 +
  17.377 +void printusage(out)
  17.378 +FILE *out;
  17.379 +{
  17.380 +  fprintf(out,
  17.381 +    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
  17.382 +    myname);
  17.383 +  fprintf(out,
  17.384 +    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
  17.385 +  fprintf(out,
  17.386 +    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
  17.387 +}
  17.388 +
  17.389 +
  17.390 +/****************************************************************************
  17.391 +
  17.392 +  printinfo
  17.393 +
  17.394 +  Prints version and copyright message, or utility information.
  17.395 +
  17.396 +****************************************************************************/
  17.397 +
  17.398 +void printinfo(infonum)
  17.399 +int infonum;
  17.400 +{
  17.401 +  switch (infonum) {
  17.402 +    case 0: /* Copyright message */
  17.403 +      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
  17.404 +      printf("John Cowan, Christiaan Keet\n");
  17.405 +      printf("Internet: <info@figlet.org> ");
  17.406 +      printf("Version: %s, date: %s\n\n",VERSION,DATE);
  17.407 +      printf("FIGlet, along with the various FIGlet fonts");
  17.408 +      printf(" and documentation, may be\n");
  17.409 +      printf("freely copied and distributed.\n\n");
  17.410 +      printf("If you use FIGlet, please send an");
  17.411 +      printf(" e-mail message to <info@figlet.org>.\n\n");
  17.412 +      printf("The latest version of FIGlet is available from the");
  17.413 +      printf(" web site,\n\thttp://www.figlet.org/\n\n");
  17.414 +      printusage(stdout);
  17.415 +      break;
  17.416 +    case 1: /* Version (integer) */
  17.417 +      printf("%d\n",VERSION_INT);
  17.418 +      break;
  17.419 +    case 2: /* Font directory */
  17.420 +      printf("%s\n",fontdirname);
  17.421 +      break;
  17.422 +    case 3: /* Font */
  17.423 +      printf("%s\n",fontname);
  17.424 +      break;
  17.425 +    case 4: /* Outputwidth */
  17.426 +      printf("%d\n",outputwidth);
  17.427 +    }
  17.428 +}
  17.429 +
  17.430 +
  17.431 +/****************************************************************************
  17.432 +
  17.433 +  readmagic
  17.434 +
  17.435 +  Reads a four-character magic string from a stream.
  17.436 +
  17.437 +****************************************************************************/
  17.438 +void readmagic(fp,magic)
  17.439 +ZFILE *fp;
  17.440 +char *magic;
  17.441 +{
  17.442 +  int i;
  17.443 +
  17.444 +  for (i=0;i<4;i++) {
  17.445 +    magic[i] = Zgetc(fp);
  17.446 +    }
  17.447 +  magic[4] = 0;
  17.448 +  }
  17.449 +  
  17.450 +/****************************************************************************
  17.451 +
  17.452 +  skipws
  17.453 +
  17.454 +  Skips whitespace characters from a stream.
  17.455 +
  17.456 +****************************************************************************/
  17.457 +void skipws(fp)
  17.458 +ZFILE *fp;
  17.459 +{
  17.460 +  int c;
  17.461 +  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
  17.462 +  Zungetc(c,fp);
  17.463 +  }
  17.464 +
  17.465 +/****************************************************************************
  17.466 +
  17.467 +  readnum
  17.468 +
  17.469 +  Reads a number from a stream.  Accepts "0" prefix for octal and
  17.470 +  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
  17.471 +
  17.472 +****************************************************************************/
  17.473 +void readnum(fp,nump)
  17.474 +ZFILE *fp;
  17.475 +inchr *nump;
  17.476 +{
  17.477 +  int acc = 0;
  17.478 +  char *p;
  17.479 +  int c;
  17.480 +  int base;
  17.481 +  int sign = 1;
  17.482 +  char digits[] = "0123456789ABCDEF";
  17.483 +
  17.484 +  skipws(fp);
  17.485 +  c = Zgetc(fp);
  17.486 +  if (c=='-') {
  17.487 +    sign = -1;
  17.488 +    }
  17.489 +  else {
  17.490 +    Zungetc(c,fp);
  17.491 +    }
  17.492 +  c = Zgetc(fp);
  17.493 +  if (c=='0') {
  17.494 +     c = Zgetc(fp);
  17.495 +     if (c=='x'||c=='X') {
  17.496 +       base = 16;
  17.497 +       }
  17.498 +     else {
  17.499 +       base = 8;
  17.500 +       Zungetc(c,fp);
  17.501 +       }
  17.502 +    }
  17.503 +  else {
  17.504 +    base = 10;
  17.505 +    Zungetc(c,fp);
  17.506 +    }
  17.507 +
  17.508 +  while((c=Zgetc(fp))!=EOF) {
  17.509 +    c=toupper(c);
  17.510 +    p=strchr(digits,c);
  17.511 +    if (!p) {
  17.512 +      Zungetc(c,fp);
  17.513 +      *nump = acc * sign;
  17.514 +      return;
  17.515 +      }
  17.516 +    acc = acc*base+(p-digits);
  17.517 +    }
  17.518 +  *nump = acc * sign;
  17.519 +  }  
  17.520 +
  17.521 +/****************************************************************************
  17.522 +
  17.523 +  readTchar
  17.524 +
  17.525 +  Reads a control file "T" command character specification.
  17.526 +
  17.527 +  Character is a single byte, an escape sequence, or
  17.528 +  an escaped numeric.
  17.529 +
  17.530 +****************************************************************************/
  17.531 +
  17.532 +inchr readTchar(fp)
  17.533 +ZFILE *fp;
  17.534 +{
  17.535 +  inchr thechar;
  17.536 +  char next;
  17.537 +
  17.538 +  thechar=Zgetc(fp);
  17.539 +  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
  17.540 +    Zungetc(thechar,fp);
  17.541 +    return '\0';
  17.542 +    }
  17.543 +  if (thechar!='\\') return thechar;
  17.544 +  next=Zgetc(fp);
  17.545 +  switch(next) {
  17.546 +    case 'a':
  17.547 +      return 7;
  17.548 +    case 'b':
  17.549 +      return 8;
  17.550 +    case 'e':
  17.551 +      return 27;
  17.552 +    case 'f':
  17.553 +      return 12;
  17.554 +    case 'n':
  17.555 +      return 10;
  17.556 +    case 'r':
  17.557 +      return 13;
  17.558 +    case 't':
  17.559 +      return 9;
  17.560 +    case 'v':
  17.561 +      return 11;
  17.562 +    default:
  17.563 +      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
  17.564 +        Zungetc(next,fp);
  17.565 +        readnum(fp,&thechar);
  17.566 +        return thechar;
  17.567 +        }
  17.568 +      return next;
  17.569 +    }
  17.570 +}
  17.571 +
  17.572 +/****************************************************************************
  17.573 +
  17.574 +  charsetname
  17.575 +
  17.576 +  Get a Tchar representing a charset name, or 0 if none available.
  17.577 +  Called in getcharset().
  17.578 +
  17.579 +****************************************************************************/
  17.580 +
  17.581 +inchr charsetname(fp)
  17.582 +ZFILE *fp;
  17.583 +{
  17.584 +  inchr result;
  17.585 +
  17.586 +  result = readTchar(fp);
  17.587 +  if (result == '\n' || result == '\r') {
  17.588 +    result = 0;
  17.589 +    Zungetc(result,fp);
  17.590 +    }
  17.591 +  return result;
  17.592 +  }
  17.593 +
  17.594 +/****************************************************************************
  17.595 +
  17.596 +  charset
  17.597 +
  17.598 +  Processes "g[0123]" character set specifier
  17.599 +  Called in readcontrol().
  17.600 +
  17.601 +****************************************************************************/
  17.602 +
  17.603 +void charset(n, controlfile)
  17.604 +int n;
  17.605 +ZFILE *controlfile;
  17.606 +{
  17.607 +  int ch;
  17.608 +
  17.609 +  skipws(controlfile);
  17.610 +  if (Zgetc(controlfile) != '9') {
  17.611 +    skiptoeol(controlfile);
  17.612 +    return;
  17.613 +    }
  17.614 +  ch = Zgetc(controlfile);
  17.615 +  if (ch == '6') {
  17.616 +     gn[n] = 65536L * charsetname(controlfile) + 0x80;
  17.617 +     gndbl[n] = 0;
  17.618 +     skiptoeol(controlfile);
  17.619 +     return;
  17.620 +     }
  17.621 +  if (ch != '4') {
  17.622 +    skiptoeol(controlfile);
  17.623 +    return;
  17.624 +    }
  17.625 +  ch = Zgetc(controlfile);
  17.626 +  if (ch == 'x') {
  17.627 +     if (Zgetc(controlfile) != '9') {
  17.628 +       skiptoeol(controlfile);
  17.629 +       return;
  17.630 +       }
  17.631 +     if (Zgetc(controlfile) != '4') {
  17.632 +       skiptoeol(controlfile);
  17.633 +       return;
  17.634 +       }
  17.635 +     skipws(controlfile);
  17.636 +     gn[n] = 65536L * charsetname(controlfile);
  17.637 +     gndbl[n] = 1;
  17.638 +     skiptoeol(controlfile);
  17.639 +     return;
  17.640 +     }
  17.641 +  Zungetc(ch, controlfile);
  17.642 +  skipws(controlfile);
  17.643 +  gn[n] = 65536L * charsetname(controlfile);
  17.644 +  gndbl[n] = 0;
  17.645 +  return;
  17.646 +  }
  17.647 +
  17.648 +/****************************************************************************
  17.649 +
  17.650 +  readcontrol
  17.651 +
  17.652 +  Allocates memory and reads in the given control file.
  17.653 +  Called in readcontrolfiles().
  17.654 +
  17.655 +****************************************************************************/
  17.656 +
  17.657 +void readcontrol(controlname)
  17.658 +char *controlname;
  17.659 +{
  17.660 +  inchr firstch,lastch;
  17.661 +  char dashcheck;
  17.662 +  inchr offset;
  17.663 +  char *controlpath,magicnum[5];
  17.664 +  int command;
  17.665 +  ZFILE *controlfile;
  17.666 +  int namelen;
  17.667 +
  17.668 +  namelen = MYSTRLEN(fontdirname);
  17.669 +  controlpath = (char*)myalloc(sizeof(char)
  17.670 +    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
  17.671 +  controlfile = NULL;
  17.672 +  if (!hasdirsep(controlname)) {
  17.673 +    strcpy(controlpath,fontdirname);
  17.674 +    controlpath[namelen] = DIRSEP;
  17.675 +    controlpath[namelen+1] = '\0';
  17.676 +    strcat(controlpath,controlname);
  17.677 +    strcat(controlpath,CONTROLFILESUFFIX);
  17.678 +    controlfile = Zopen(controlpath,"rb");
  17.679 +    }
  17.680 +  if (controlfile==NULL) {
  17.681 +    strcpy(controlpath,controlname);
  17.682 +    strcat(controlpath,CONTROLFILESUFFIX);
  17.683 +    controlfile = Zopen(controlpath,"rb");
  17.684 +    if (controlfile==NULL) {
  17.685 +      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
  17.686 +        controlpath);
  17.687 +      exit(1);
  17.688 +      }
  17.689 +    }
  17.690 +
  17.691 +  free(controlpath);
  17.692 +
  17.693 +  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  17.694 +  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
  17.695 +  commandlistend = &(*commandlistend)->next;
  17.696 +  (*commandlistend) = NULL;
  17.697 +
  17.698 +  while(command=Zgetc(controlfile),command!=EOF) {
  17.699 +    switch (command) {
  17.700 +      case 't': /* Translate */
  17.701 +        skipws(controlfile);
  17.702 +        firstch=readTchar(controlfile);
  17.703 +        if ((dashcheck=Zgetc(controlfile))=='-') {
  17.704 +          lastch=readTchar(controlfile);
  17.705 +          }
  17.706 +        else {
  17.707 +          Zungetc(dashcheck,controlfile);
  17.708 +          lastch=firstch;
  17.709 +          }
  17.710 +        skipws(controlfile);
  17.711 +        offset=readTchar(controlfile)-firstch;
  17.712 +        skiptoeol(controlfile);
  17.713 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  17.714 +        (*commandlistend)->thecommand = 1;
  17.715 +        (*commandlistend)->rangelo = firstch;
  17.716 +        (*commandlistend)->rangehi = lastch;
  17.717 +        (*commandlistend)->offset = offset;
  17.718 +        commandlistend = &(*commandlistend)->next;
  17.719 +        (*commandlistend) = NULL;
  17.720 +        break;
  17.721 +      case '0': case '1': case '2': case '3': case '4':
  17.722 +      case '5': case '6': case '7': case '8': case '9':
  17.723 +      case '-':
  17.724 +                /* Mapping table entry */
  17.725 +        Zungetc(command,controlfile);
  17.726 +        readnum(controlfile,&firstch);
  17.727 +        skipws(controlfile);
  17.728 +	readnum(controlfile,&lastch);
  17.729 +	offset=lastch-firstch;
  17.730 +        lastch=firstch;
  17.731 +        skiptoeol(controlfile);
  17.732 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  17.733 +        (*commandlistend)->thecommand = 1;
  17.734 +        (*commandlistend)->rangelo = firstch;
  17.735 +        (*commandlistend)->rangehi = lastch;
  17.736 +        (*commandlistend)->offset = offset;
  17.737 +        commandlistend = &(*commandlistend)->next;
  17.738 +        (*commandlistend) = NULL;
  17.739 +        break;
  17.740 +      case 'f': /* freeze */
  17.741 +        skiptoeol(controlfile);
  17.742 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  17.743 +        (*commandlistend)->thecommand = 0;
  17.744 +        commandlistend = &(*commandlistend)->next;
  17.745 +        (*commandlistend) = NULL;
  17.746 +        break;
  17.747 +      case 'b': /* DBCS input mode */
  17.748 +        multibyte = 1;
  17.749 +        break;
  17.750 +      case 'u': /* UTF-8 input mode */
  17.751 +        multibyte = 2;
  17.752 +        break;
  17.753 +      case 'h': /* HZ input mode */
  17.754 +        multibyte = 3;
  17.755 +        break;
  17.756 +      case 'j': /* Shift-JIS input mode */
  17.757 +        multibyte = 4;
  17.758 +        break;
  17.759 +      case 'g': /* ISO 2022 character set choices */
  17.760 +        multibyte = 0;
  17.761 +        skipws(controlfile);
  17.762 +        command=Zgetc(controlfile);
  17.763 +        switch (command) {
  17.764 +          case '0': /* define G0 charset */
  17.765 +            charset(0, controlfile);
  17.766 +            break;
  17.767 +          case '1': /* set G1 charset */
  17.768 +            charset(1, controlfile);
  17.769 +            break;
  17.770 +          case '2': /* set G2 charset */
  17.771 +            charset(2, controlfile);
  17.772 +            break;
  17.773 +          case '3': /* set G3 charset */
  17.774 +            charset(3, controlfile);
  17.775 +            break;
  17.776 +          case 'l': case 'L': /* define left half */
  17.777 +            skipws(controlfile);
  17.778 +            gl = Zgetc(controlfile) - '0';
  17.779 +            skiptoeol(controlfile);
  17.780 +            break;
  17.781 +          case 'r': case 'R': /* define right half */
  17.782 +            skipws(controlfile);
  17.783 +            gr = Zgetc(controlfile) - '0';
  17.784 +            skiptoeol(controlfile);
  17.785 +            break;
  17.786 +          default: /* meaningless "g" command */
  17.787 +            skiptoeol(controlfile);
  17.788 +          }
  17.789 +      case '\r': case '\n': /* blank line */
  17.790 +        break;
  17.791 +      default: /* Includes '#' */
  17.792 +        skiptoeol(controlfile);
  17.793 +      }
  17.794 +    }
  17.795 +  Zclose(controlfile);
  17.796 +}
  17.797 +
  17.798 +
  17.799 +/****************************************************************************
  17.800 +
  17.801 +  readcontrolfiles
  17.802 +
  17.803 +  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
  17.804 +  Called in main().
  17.805 +
  17.806 +****************************************************************************/
  17.807 +
  17.808 +void readcontrolfiles()
  17.809 +{
  17.810 +  cfnamenode *cfnptr;
  17.811 +
  17.812 +  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
  17.813 +    readcontrol(cfnptr->thename);
  17.814 +    }
  17.815 +}
  17.816 +
  17.817 +
  17.818 +/****************************************************************************
  17.819 +
  17.820 +  clearcfilelist
  17.821 +
  17.822 +  Clears the control file list.  Assumes thename does not need freeing.
  17.823 +
  17.824 +****************************************************************************/
  17.825 +
  17.826 +void clearcfilelist()
  17.827 +{
  17.828 +  cfnamenode *cfnptr1,*cfnptr2;
  17.829 +
  17.830 +  cfnptr1 = cfilelist;
  17.831 +  while (cfnptr1 != NULL) {
  17.832 +    cfnptr2 = cfnptr1->next;
  17.833 +    free(cfnptr1);
  17.834 +    cfnptr1 = cfnptr2;
  17.835 +    }
  17.836 +  cfilelist = NULL;
  17.837 +  cfilelistend = &cfilelist;
  17.838 +}
  17.839 +
  17.840 +
  17.841 +/****************************************************************************
  17.842 +
  17.843 +  getparams
  17.844 +
  17.845 +  Handles all command-line parameters.  Puts all parameters within
  17.846 +  bounds.
  17.847 +
  17.848 +****************************************************************************/
  17.849 +
  17.850 +void getparams()
  17.851 +{
  17.852 +  extern char *optarg;
  17.853 +  extern int optind;
  17.854 +  int c; /* "Should" be a char -- need int for "!= -1" test*/
  17.855 +  int columns,firstfont,infoprint;
  17.856 +  char *controlname;
  17.857 +
  17.858 +  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
  17.859 +    myname++;
  17.860 +    }
  17.861 +  else {
  17.862 +    myname = Myargv[0];
  17.863 +    }
  17.864 +  fontdirname = DEFAULTFONTDIR;
  17.865 +  firstfont = 1;
  17.866 +  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
  17.867 +  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
  17.868 +  if (suffixcmp(fontname,FONTFILESUFFIX)) {
  17.869 +    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
  17.870 +    }
  17.871 +  cfilelist = NULL;
  17.872 +  cfilelistend = &cfilelist;
  17.873 +  commandlist = NULL;
  17.874 +  commandlistend = &commandlist;
  17.875 +  smushoverride = SMO_NO;
  17.876 +  deutschflag = 0;
  17.877 +  justification = -1;
  17.878 +  right2left = -1;
  17.879 +  paragraphflag = 0;
  17.880 +  infoprint = -1;
  17.881 +  cmdinput = 0;
  17.882 +  outputwidth = DEFAULTCOLUMNS;
  17.883 +  gn[1] = 0x80;
  17.884 +  gr = 1;
  17.885 +  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
  17.886 +      /* Note: -F is not a legal option -- prints a special err message.  */
  17.887 +    switch (c) {
  17.888 +      case 'A':
  17.889 +        cmdinput = 1;
  17.890 +        break;
  17.891 +      case 'D':
  17.892 +        deutschflag = 1;
  17.893 +        break;
  17.894 +      case 'E':
  17.895 +        deutschflag = 0;
  17.896 +        break;
  17.897 +      case 'X':
  17.898 +        right2left = -1;
  17.899 +        break;
  17.900 +      case 'L':
  17.901 +        right2left = 0;
  17.902 +        break;
  17.903 +      case 'R':
  17.904 +        right2left = 1;
  17.905 +        break;
  17.906 +      case 'x':
  17.907 +        justification = -1;
  17.908 +        break;
  17.909 +      case 'l':
  17.910 +        justification = 0;
  17.911 +        break;
  17.912 +      case 'c':
  17.913 +        justification = 1;
  17.914 +        break;
  17.915 +      case 'r':
  17.916 +        justification = 2;
  17.917 +        break;
  17.918 +      case 'p':
  17.919 +        paragraphflag = 1;
  17.920 +        break;
  17.921 +      case 'n':
  17.922 +        paragraphflag = 0;
  17.923 +        break;
  17.924 +      case 's':
  17.925 +        smushoverride = SMO_NO;
  17.926 +        break;
  17.927 +      case 'k':
  17.928 +        smushmode = SM_KERN;
  17.929 +        smushoverride = SMO_YES;
  17.930 +        break;
  17.931 +      case 'S':
  17.932 +        smushmode = SM_SMUSH;
  17.933 +	smushoverride = SMO_FORCE;
  17.934 +        break;
  17.935 +      case 'o':
  17.936 +        smushmode = SM_SMUSH;
  17.937 +	smushoverride = SMO_YES;
  17.938 +        break;
  17.939 +      case 'W':
  17.940 +        smushmode = 0;
  17.941 +	smushoverride = SMO_YES;
  17.942 +        break;
  17.943 +      case 't':
  17.944 +#ifdef TIOCGWINSZ
  17.945 +        columns = get_columns();
  17.946 +        if (columns>0) {
  17.947 +          outputwidth = columns;
  17.948 +          }
  17.949 +#else /* ifdef TIOCGWINSZ */
  17.950 +        fprintf(stderr,
  17.951 +          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
  17.952 +          myname);
  17.953 +#endif /* ifdef TIOCGWINSZ */
  17.954 +        break;
  17.955 +      case 'v':
  17.956 +        infoprint = 0;
  17.957 +        break;
  17.958 +      case 'I':
  17.959 +        infoprint = atoi(optarg);
  17.960 +        break;
  17.961 +      case 'm':
  17.962 +        smushmode = atoi(optarg);
  17.963 +        if (smushmode < -1) {
  17.964 +          smushoverride = SMO_NO;
  17.965 +          break;
  17.966 +          }
  17.967 +	if (smushmode == 0) smushmode = SM_KERN;
  17.968 +	else if (smushmode == -1) smushmode = 0;
  17.969 +	else smushmode = (smushmode & 63) | SM_SMUSH;
  17.970 +	smushoverride = SMO_YES;
  17.971 +        break;
  17.972 +      case 'w':
  17.973 +        columns = atoi(optarg);
  17.974 +        if (columns>0) {
  17.975 +          outputwidth = columns;
  17.976 +          }
  17.977 +        break;
  17.978 +      case 'd':
  17.979 +        fontdirname = optarg;
  17.980 +        break;
  17.981 +      case 'f':
  17.982 +        if (firstfont) {
  17.983 +          free(fontname);
  17.984 +          firstfont = 0;
  17.985 +          }
  17.986 +        fontname = optarg;
  17.987 +        if (suffixcmp(fontname,FONTFILESUFFIX)) {
  17.988 +          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
  17.989 +          }
  17.990 +        break;
  17.991 +      case 'C':
  17.992 +        controlname = optarg;
  17.993 +        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
  17.994 +          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
  17.995 +          }
  17.996 +        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
  17.997 +        (*cfilelistend)->thename = controlname;
  17.998 +        cfilelistend = &(*cfilelistend)->next;
  17.999 +        (*cfilelistend) = NULL;
 17.1000 +        break;
 17.1001 +      case 'N':
 17.1002 +        clearcfilelist();
 17.1003 +        multibyte = 0;
 17.1004 +        gn[0] = 0;
 17.1005 +        gn[1] = 0x80;
 17.1006 +        gn[2] = gn[3] = 0;
 17.1007 +        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
 17.1008 +        gl = 0;
 17.1009 +        gr = 1;
 17.1010 +        break;
 17.1011 +      case 'F': /* Not a legal option */
 17.1012 +        fprintf(stderr,"%s: illegal option -- F\n",myname);
 17.1013 +        printusage(stderr);
 17.1014 +        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
 17.1015 +        fprintf(stderr," \"-F\" option has been\n");
 17.1016 +        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
 17.1017 +        fprintf(stderr," program, which is now\n");
 17.1018 +        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
 17.1019 +        fprintf(stderr," is also available\n");
 17.1020 +        fprintf(stderr,"from  http://www.figlet.org/");
 17.1021 +        fprintf(stderr,"under UNIX utilities.\n");
 17.1022 +        exit(1);
 17.1023 +        break;
 17.1024 +      default:
 17.1025 +        printusage(stderr);
 17.1026 +        exit(1);
 17.1027 +      }
 17.1028 +    }
 17.1029 +  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
 17.1030 +  outlinelenlimit = outputwidth-1;
 17.1031 +  if (infoprint>=0) {
 17.1032 +    printinfo(infoprint);
 17.1033 +    exit(0);
 17.1034 +    }
 17.1035 +}
 17.1036 +
 17.1037 +
 17.1038 +/****************************************************************************
 17.1039 +
 17.1040 +  clearline
 17.1041 +
 17.1042 +  Clears both the input (inchrline) and output (outputline) storage.
 17.1043 +
 17.1044 +****************************************************************************/
 17.1045 +
 17.1046 +void clearline()
 17.1047 +{
 17.1048 +  int i;
 17.1049 +
 17.1050 +  for (i=0;i<charheight;i++) {
 17.1051 +    outputline[i][0] = '\0';
 17.1052 +    }
 17.1053 +  outlinelen = 0;
 17.1054 +  inchrlinelen = 0;
 17.1055 +}
 17.1056 +
 17.1057 +
 17.1058 +/****************************************************************************
 17.1059 +
 17.1060 +  readfontchar
 17.1061 +
 17.1062 +  Reads a font character from the font file, and places it in a
 17.1063 +  newly-allocated entry in the list.
 17.1064 +
 17.1065 +****************************************************************************/
 17.1066 +
 17.1067 +void readfontchar(file,theord,line,maxlen)
 17.1068 +ZFILE *file;
 17.1069 +inchr theord;
 17.1070 +char *line;
 17.1071 +int maxlen;
 17.1072 +{
 17.1073 +  int row,k;
 17.1074 +  char endchar;
 17.1075 +  fcharnode *fclsave;
 17.1076 +
 17.1077 +  fclsave = fcharlist;
 17.1078 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 17.1079 +  fcharlist->ord = theord;
 17.1080 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 17.1081 +  fcharlist->next = fclsave;
 17.1082 +  for (row=0;row<charheight;row++) {
 17.1083 +    if (myfgets(line,maxlen+1,file)==NULL) {
 17.1084 +      line[0] = '\0';
 17.1085 +      }
 17.1086 +    k = MYSTRLEN(line)-1;
 17.1087 +    while (k>=0 && isspace(line[k])) {
 17.1088 +      k--;
 17.1089 +      }
 17.1090 +    if (k>=0) {
 17.1091 +      endchar = line[k];
 17.1092 +      while (k>=0 ? line[k]==endchar : 0) {
 17.1093 +        k--;
 17.1094 +        }
 17.1095 +      }
 17.1096 +    line[k+1] = '\0';
 17.1097 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
 17.1098 +    strcpy(fcharlist->thechar[row],line);
 17.1099 +    }
 17.1100 +}
 17.1101 +
 17.1102 +
 17.1103 +/****************************************************************************
 17.1104 +
 17.1105 +  readfont
 17.1106 +
 17.1107 +  Allocates memory, initializes variables, and reads in the font.
 17.1108 +  Called near beginning of main().
 17.1109 +
 17.1110 +****************************************************************************/
 17.1111 +
 17.1112 +void readfont()
 17.1113 +{
 17.1114 +#define MAXFIRSTLINELEN 1000
 17.1115 +  int i,row,numsread;
 17.1116 +  inchr theord;
 17.1117 +  int maxlen,cmtlines,ffright2left;
 17.1118 +  int smush,smush2;
 17.1119 +  char *fontpath,*fileline,magicnum[5];
 17.1120 +  ZFILE *fontfile;
 17.1121 +  int namelen;
 17.1122 +
 17.1123 +  namelen = MYSTRLEN(fontdirname);
 17.1124 +  fontpath = (char*)myalloc(sizeof(char)
 17.1125 +    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
 17.1126 +  fontfile = NULL;
 17.1127 +  if (!hasdirsep(fontname)) {
 17.1128 +    strcpy(fontpath,fontdirname);
 17.1129 +    fontpath[namelen] = DIRSEP;
 17.1130 +    fontpath[namelen+1] = '\0';
 17.1131 +    strcat(fontpath,fontname);
 17.1132 +    strcat(fontpath,FONTFILESUFFIX);
 17.1133 +    fontfile = Zopen(fontpath,"rb");
 17.1134 +    }
 17.1135 +  if (fontfile==NULL) {
 17.1136 +    strcpy(fontpath,fontname);
 17.1137 +    strcat(fontpath,FONTFILESUFFIX);
 17.1138 +    fontfile = Zopen(fontpath,"rb");
 17.1139 +    if (fontfile==NULL) {
 17.1140 +      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
 17.1141 +      exit(1);
 17.1142 +      }
 17.1143 +    }
 17.1144 +
 17.1145 +  readmagic(fontfile,magicnum);
 17.1146 +  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
 17.1147 +  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
 17.1148 +    fileline[0] = '\0';
 17.1149 +    }
 17.1150 +  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
 17.1151 +    skiptoeol(fontfile);
 17.1152 +    }
 17.1153 +  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
 17.1154 +    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
 17.1155 +    &ffright2left,&smush2);
 17.1156 +  free(fileline);
 17.1157 +  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
 17.1158 +    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
 17.1159 +    exit(1);
 17.1160 +    }
 17.1161 +  for (i=1;i<=cmtlines;i++) {
 17.1162 +    skiptoeol(fontfile);
 17.1163 +    }
 17.1164 +  free(fontpath);
 17.1165 +
 17.1166 +  if (numsread<6) {
 17.1167 +    ffright2left = 0;
 17.1168 +    }
 17.1169 +
 17.1170 +  if (numsread<7) { /* if no smush2, decode smush into smush2 */
 17.1171 +    if (smush == 0) smush2 = SM_KERN;
 17.1172 +    else if (smush < 0) smush2 = 0;
 17.1173 +    else smush2 = (smush & 31) | SM_SMUSH;
 17.1174 +    }
 17.1175 +
 17.1176 +  if (charheight<1) {
 17.1177 +    charheight = 1;
 17.1178 +    }
 17.1179 +
 17.1180 +  if (maxlen<1) {
 17.1181 +    maxlen = 1;
 17.1182 +    }
 17.1183 +
 17.1184 +  maxlen += 100; /* Give ourselves some extra room */
 17.1185 +
 17.1186 +  if (smushoverride == SMO_NO)
 17.1187 +     smushmode = smush2;
 17.1188 +  else if (smushoverride == SMO_FORCE)
 17.1189 +     smushmode |= smush2;
 17.1190 +
 17.1191 +  if (right2left<0) {
 17.1192 +    right2left = ffright2left;
 17.1193 +    }
 17.1194 +
 17.1195 +  if (justification<0) {
 17.1196 +    justification = 2*right2left;
 17.1197 +    }
 17.1198 +
 17.1199 +  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
 17.1200 +  /* Allocate "missing" character */
 17.1201 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 17.1202 +  fcharlist->ord = 0;
 17.1203 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 17.1204 +  fcharlist->next = NULL;
 17.1205 +  for (row=0;row<charheight;row++) {
 17.1206 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
 17.1207 +    fcharlist->thechar[row][0] = '\0';
 17.1208 +    }
 17.1209 +  for (theord=' ';theord<='~';theord++) {
 17.1210 +    readfontchar(fontfile,theord,fileline,maxlen);
 17.1211 +    }
 17.1212 +  for (theord=0;theord<=6;theord++) {
 17.1213 +    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
 17.1214 +    }
 17.1215 +  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
 17.1216 +    sscanf(fileline,"%li",&theord)==1) {
 17.1217 +    readfontchar(fontfile,theord,fileline,maxlen);
 17.1218 +    }
 17.1219 +  Zclose(fontfile);
 17.1220 +  free(fileline);
 17.1221 +}
 17.1222 +
 17.1223 +
 17.1224 +/****************************************************************************
 17.1225 +
 17.1226 +  linealloc
 17.1227 +
 17.1228 +  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
 17.1229 +  Called near beginning of main().
 17.1230 +
 17.1231 +****************************************************************************/
 17.1232 +
 17.1233 +void linealloc()
 17.1234 +{
 17.1235 +  int row; 
 17.1236 +
 17.1237 +  outputline = (char**)myalloc(sizeof(char*)*charheight);
 17.1238 +  for (row=0;row<charheight;row++) {
 17.1239 +    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 17.1240 +    }
 17.1241 +  inchrlinelenlimit = outputwidth*4+100;
 17.1242 +  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
 17.1243 +  clearline();
 17.1244 +}
 17.1245 +
 17.1246 +
 17.1247 +/****************************************************************************
 17.1248 +
 17.1249 +  getletter
 17.1250 +
 17.1251 +  Sets currchar to point to the font entry for the given character.
 17.1252 +  Sets currcharwidth to the width of this character.
 17.1253 +
 17.1254 +****************************************************************************/
 17.1255 +
 17.1256 +void getletter(c)
 17.1257 +inchr c;
 17.1258 +{
 17.1259 +  fcharnode *charptr;
 17.1260 +
 17.1261 +  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
 17.1262 +    charptr=charptr->next) ;
 17.1263 +  if (charptr!=NULL) {
 17.1264 +    currchar = charptr->thechar;
 17.1265 +    }
 17.1266 +  else {
 17.1267 +    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
 17.1268 +      charptr=charptr->next) ;
 17.1269 +    currchar = charptr->thechar;
 17.1270 +    }
 17.1271 +  previouscharwidth = currcharwidth;
 17.1272 +  currcharwidth = MYSTRLEN(currchar[0]);
 17.1273 +}
 17.1274 +
 17.1275 +
 17.1276 +/****************************************************************************
 17.1277 +
 17.1278 +  smushem
 17.1279 +
 17.1280 +  Given 2 characters, attempts to smush them into 1, according to
 17.1281 +  smushmode.  Returns smushed character or '\0' if no smushing can be
 17.1282 +  done.
 17.1283 +
 17.1284 +  smushmode values are sum of following (all values smush blanks):
 17.1285 +    1: Smush equal chars (not hardblanks)
 17.1286 +    2: Smush '_' with any char in hierarchy below
 17.1287 +    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
 17.1288 +       Each class in hier. can be replaced by later class.
 17.1289 +    8: [ + ] -> |, { + } -> |, ( + ) -> |
 17.1290 +   16: / + \ -> X, > + < -> X (only in that order)
 17.1291 +   32: hardblank + hardblank -> hardblank
 17.1292 +
 17.1293 +****************************************************************************/
 17.1294 +
 17.1295 +char smushem(lch,rch)
 17.1296 +char lch,rch;
 17.1297 +{
 17.1298 +  if (lch==' ') return rch;
 17.1299 +  if (rch==' ') return lch;
 17.1300 +
 17.1301 +  if (previouscharwidth<2 || currcharwidth<2) return '\0';
 17.1302 +    /* Disallows overlapping if the previous character */
 17.1303 +    /* or the current character has a width of 1 or zero. */
 17.1304 +
 17.1305 +  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
 17.1306 +
 17.1307 +  if ((smushmode & 63) == 0) {
 17.1308 +    /* This is smushing by universal overlapping. */
 17.1309 +    if (lch==' ') return rch;
 17.1310 +    if (rch==' ') return lch;
 17.1311 +    if (lch==hardblank) return rch;
 17.1312 +    if (rch==hardblank) return lch;
 17.1313 +      /* Above four lines ensure overlapping preference to */
 17.1314 +      /* visible characters. */
 17.1315 +    if (right2left==1) return lch;
 17.1316 +      /* Above line ensures that the dominant (foreground) */
 17.1317 +      /* fig-character for overlapping is the latter in the */
 17.1318 +      /* user's text, not necessarily the rightmost character. */
 17.1319 +    return rch;
 17.1320 +      /* Occurs in the absence of above exceptions. */
 17.1321 +    }
 17.1322 +  
 17.1323 +  if (smushmode & SM_HARDBLANK) {
 17.1324 +    if (lch==hardblank && rch==hardblank) return lch;
 17.1325 +    }
 17.1326 +
 17.1327 +  if (lch==hardblank || rch==hardblank) return '\0';
 17.1328 +
 17.1329 +  if (smushmode & SM_EQUAL) {
 17.1330 +    if (lch==rch) return lch;
 17.1331 +    }
 17.1332 +
 17.1333 +  if (smushmode & SM_LOWLINE) {
 17.1334 +    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
 17.1335 +    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
 17.1336 +    }
 17.1337 +
 17.1338 +  if (smushmode & SM_HIERARCHY) {
 17.1339 +    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
 17.1340 +    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
 17.1341 +    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
 17.1342 +    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
 17.1343 +    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
 17.1344 +    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
 17.1345 +    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
 17.1346 +    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
 17.1347 +    if (strchr("()",lch) && strchr("<>",rch)) return rch;
 17.1348 +    if (strchr("()",rch) && strchr("<>",lch)) return lch;
 17.1349 +    }
 17.1350 +
 17.1351 +  if (smushmode & SM_PAIR) {
 17.1352 +    if (lch=='[' && rch==']') return '|';
 17.1353 +    if (rch=='[' && lch==']') return '|';
 17.1354 +    if (lch=='{' && rch=='}') return '|';
 17.1355 +    if (rch=='{' && lch=='}') return '|';
 17.1356 +    if (lch=='(' && rch==')') return '|';
 17.1357 +    if (rch=='(' && lch==')') return '|';
 17.1358 +    }
 17.1359 +
 17.1360 +  if (smushmode & SM_BIGX) {
 17.1361 +    if (lch=='/' && rch=='\\') return '|';
 17.1362 +    if (rch=='/' && lch=='\\') return 'Y';
 17.1363 +    if (lch=='>' && rch=='<') return 'X';
 17.1364 +      /* Don't want the reverse of above to give 'X'. */
 17.1365 +    }
 17.1366 +
 17.1367 +  return '\0';
 17.1368 +}
 17.1369 +
 17.1370 +
 17.1371 +/****************************************************************************
 17.1372 +
 17.1373 +  smushamt
 17.1374 +
 17.1375 +  Returns the maximum amount that the current character can be smushed
 17.1376 +  into the current line.
 17.1377 +
 17.1378 +****************************************************************************/
 17.1379 +
 17.1380 +int smushamt()
 17.1381 +{
 17.1382 +  int maxsmush,amt;
 17.1383 +  int row,linebd,charbd;
 17.1384 +  char ch1,ch2;
 17.1385 +
 17.1386 +  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
 17.1387 +    return 0;
 17.1388 +    }
 17.1389 +  maxsmush = currcharwidth;
 17.1390 +  for (row=0;row<charheight;row++) {
 17.1391 +    if (right2left) {
 17.1392 +      for (charbd=MYSTRLEN(currchar[row]);
 17.1393 +        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
 17.1394 +      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
 17.1395 +      amt = linebd+currcharwidth-1-charbd;
 17.1396 +      }
 17.1397 +    else {
 17.1398 +      for (linebd=MYSTRLEN(outputline[row]);
 17.1399 +        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
 17.1400 +      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
 17.1401 +      amt = charbd+outlinelen-1-linebd;
 17.1402 +      }
 17.1403 +    if (!ch1||ch1==' ') {
 17.1404 +      amt++;
 17.1405 +      }
 17.1406 +    else if (ch2) {
 17.1407 +      if (smushem(ch1,ch2)!='\0') {
 17.1408 +        amt++;
 17.1409 +        }
 17.1410 +      }
 17.1411 +    if (amt<maxsmush) {
 17.1412 +      maxsmush = amt;
 17.1413 +      }
 17.1414 +    }
 17.1415 +  return maxsmush;
 17.1416 +}
 17.1417 +
 17.1418 +
 17.1419 +/****************************************************************************
 17.1420 +
 17.1421 +  addchar
 17.1422 +
 17.1423 +  Attempts to add the given character onto the end of the current line.
 17.1424 +  Returns 1 if this can be done, 0 otherwise.
 17.1425 +
 17.1426 +****************************************************************************/
 17.1427 +
 17.1428 +int addchar(c)
 17.1429 +inchr c;
 17.1430 +{
 17.1431 +  int smushamount,row,k;
 17.1432 +  char *templine;
 17.1433 +
 17.1434 +  getletter(c);
 17.1435 +  smushamount = smushamt();
 17.1436 +  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
 17.1437 +      ||inchrlinelen+1>inchrlinelenlimit) {
 17.1438 +    return 0;
 17.1439 +    }
 17.1440 +
 17.1441 +  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 17.1442 +  for (row=0;row<charheight;row++) {
 17.1443 +    if (right2left) {
 17.1444 +      strcpy(templine,currchar[row]);
 17.1445 +      for (k=0;k<smushamount;k++) {
 17.1446 +        templine[currcharwidth-smushamount+k] =
 17.1447 +          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
 17.1448 +        }
 17.1449 +      strcat(templine,outputline[row]+smushamount);
 17.1450 +      strcpy(outputline[row],templine);
 17.1451 +      }
 17.1452 +    else {
 17.1453 +      for (k=0;k<smushamount;k++) {
 17.1454 +        outputline[row][outlinelen-smushamount+k] =
 17.1455 +          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
 17.1456 +        }
 17.1457 +      strcat(outputline[row],currchar[row]+smushamount);
 17.1458 +      }
 17.1459 +    }
 17.1460 +  free(templine);
 17.1461 +  outlinelen = MYSTRLEN(outputline[0]);
 17.1462 +  inchrline[inchrlinelen++] = c;
 17.1463 +  return 1;
 17.1464 +}
 17.1465 +
 17.1466 +
 17.1467 +/****************************************************************************
 17.1468 +
 17.1469 +  putstring
 17.1470 +
 17.1471 +  Prints out the given null-terminated string, substituting blanks
 17.1472 +  for hardblanks.  If outputwidth is 1, prints the entire string;
 17.1473 +  otherwise prints at most outputwidth-1 characters.  Prints a newline
 17.1474 +  at the end of the string.  The string is left-justified, centered or
 17.1475 +  right-justified (taking outputwidth as the screen width) if
 17.1476 +  justification is 0, 1 or 2, respectively.
 17.1477 +
 17.1478 +****************************************************************************/
 17.1479 +
 17.1480 +static int nr_chars=0;
 17.1481 +static void myputchar(unsigned char c)
 17.1482 +{
 17.1483 +    static int startline = 1;
 17.1484 +
 17.1485 +    if ( startline )
 17.1486 +    {
 17.1487 +        startline = 0;
 17.1488 +        myputchar(' ');
 17.1489 +    }
 17.1490 +
 17.1491 +    putc(c, stderr);
 17.1492 +
 17.1493 +    if ( nr_chars == 0 )
 17.1494 +        putchar('"');
 17.1495 +
 17.1496 +    putchar('\\');
 17.1497 +    putchar('0' + ((c>>6)&7));
 17.1498 +    putchar('0' + ((c>>3)&7));
 17.1499 +    putchar('0' + ((c>>0)&7));
 17.1500 +
 17.1501 +    if ( c == '\n' )
 17.1502 +        startline = 1;
 17.1503 +
 17.1504 +    if ( ++nr_chars == 18 ) 
 17.1505 +    {
 17.1506 +        nr_chars = 0;
 17.1507 +        putchar('"');
 17.1508 +        putchar(' ');
 17.1509 +        putchar('\\');
 17.1510 +        putchar('\n');
 17.1511 +    }
 17.1512 +}
 17.1513 +
 17.1514 +void putstring(string)
 17.1515 +char *string;
 17.1516 +{
 17.1517 +  int i,len;
 17.1518 +
 17.1519 +  len = MYSTRLEN(string);
 17.1520 +  if (outputwidth>1) {
 17.1521 +    if (len>outputwidth-1) {
 17.1522 +      len = outputwidth-1;
 17.1523 +      }
 17.1524 +    if (justification>0) {
 17.1525 +      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
 17.1526 +        myputchar(' ');
 17.1527 +        }
 17.1528 +      }
 17.1529 +    }
 17.1530 +  for (i=0;i<len;i++) {
 17.1531 +    myputchar(string[i]==hardblank?' ':string[i]);
 17.1532 +    }
 17.1533 +  myputchar('\n');
 17.1534 +}
 17.1535 +
 17.1536 +
 17.1537 +/****************************************************************************
 17.1538 +
 17.1539 +  printline
 17.1540 +
 17.1541 +  Prints outputline using putstring, then clears the current line.
 17.1542 +
 17.1543 +****************************************************************************/
 17.1544 +
 17.1545 +void printline()
 17.1546 +{
 17.1547 +  int i;
 17.1548 +
 17.1549 +  for (i=0;i<charheight;i++) {
 17.1550 +    putstring(outputline[i]);
 17.1551 +    }
 17.1552 +  clearline();
 17.1553 +}
 17.1554 +
 17.1555 +
 17.1556 +/****************************************************************************
 17.1557 +
 17.1558 +  splitline
 17.1559 +
 17.1560 +  Splits inchrline at the last word break (bunch of consecutive blanks).
 17.1561 +  Makes a new line out of the first part and prints it using
 17.1562 +  printline.  Makes a new line out of the second part and returns.
 17.1563 +
 17.1564 +****************************************************************************/
 17.1565 +
 17.1566 +void splitline()
 17.1567 +{
 17.1568 +  int i,gotspace,lastspace,len1,len2;
 17.1569 +  inchr *part1,*part2;
 17.1570 +
 17.1571 +  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 17.1572 +  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 17.1573 +  gotspace = 0;
 17.1574 +  for (i=inchrlinelen-1;i>=0;i--) {
 17.1575 +    if (!gotspace && inchrline[i]==' ') {
 17.1576 +      gotspace = 1;
 17.1577 +      lastspace = i;
 17.1578 +      }
 17.1579 +    if (gotspace && inchrline[i]!=' ') {
 17.1580 +      break;
 17.1581 +      }
 17.1582 +    }
 17.1583 +  len1 = i+1;
 17.1584 +  len2 = inchrlinelen-lastspace-1;
 17.1585 +  for (i=0;i<len1;i++) {
 17.1586 +    part1[i] = inchrline[i];
 17.1587 +    }
 17.1588 +  for (i=0;i<len2;i++) {
 17.1589 +    part2[i] = inchrline[lastspace+1+i];
 17.1590 +    }
 17.1591 +  clearline();
 17.1592 +  for (i=0;i<len1;i++) {
 17.1593 +    addchar(part1[i]);
 17.1594 +    }
 17.1595 +  printline();
 17.1596 +  for (i=0;i<len2;i++) {
 17.1597 +    addchar(part2[i]);
 17.1598 +    }
 17.1599 +  free(part1);
 17.1600 +  free(part2);
 17.1601 +}
 17.1602 +
 17.1603 +
 17.1604 +/****************************************************************************
 17.1605 +
 17.1606 +  handlemapping
 17.1607 +
 17.1608 +  Given an input character (type inchr), executes re-mapping commands
 17.1609 +  read from control files.  Returns re-mapped character (inchr).
 17.1610 +
 17.1611 +****************************************************************************/
 17.1612 +
 17.1613 +inchr handlemapping(c)
 17.1614 +inchr c;
 17.1615 +{
 17.1616 +  comnode *cmptr;
 17.1617 +
 17.1618 +  cmptr=commandlist;
 17.1619 +  while (cmptr!=NULL) {
 17.1620 +    if (cmptr->thecommand ?
 17.1621 +      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
 17.1622 +      c += cmptr->offset;
 17.1623 +      while(cmptr!=NULL ? cmptr->thecommand : 0) {
 17.1624 +        cmptr=cmptr->next;
 17.1625 +        }
 17.1626 +      }
 17.1627 +    else {
 17.1628 +      cmptr=cmptr->next;
 17.1629 +      }
 17.1630 +    }
 17.1631 +  return c;
 17.1632 +}
 17.1633 +
 17.1634 +/****************************************************************************
 17.1635 +
 17.1636 +  Agetchar
 17.1637 +
 17.1638 +  Replacement to getchar().
 17.1639 +  Acts exactly like getchar if -A is NOT specified,
 17.1640 +  else obtains input from All remaining command line words.
 17.1641 +
 17.1642 +****************************************************************************/
 17.1643 +
 17.1644 +int Agetchar()
 17.1645 +{
 17.1646 +    extern int optind;		/* current argv[] element under study */
 17.1647 +    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
 17.1648 +    char   *arg;		/* pointer to active character */
 17.1649 +    int    c;			/* current character */
 17.1650 +
 17.1651 +    if ( ! cmdinput )		/* is -A active? */
 17.1652 +	return( getchar() );	/* no: return stdin character */
 17.1653 +
 17.1654 +    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
 17.1655 +	return( EOF );		/* **ensure it now and forever more */
 17.1656 +
 17.1657 +    /* find next character */
 17.1658 +    arg = Myargv[optind];		/* pointer to active arg */
 17.1659 +    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
 17.1660 +
 17.1661 +    if ( ! c )			/* at '\0' that terminates word? */
 17.1662 +    {   /* at end of word: return ' ' if normal word, '\n' if empty */
 17.1663 +	c = ' ';		/* suppose normal word and return blank */
 17.1664 +	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
 17.1665 +	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
 17.1666 +	AgetMode = 0;		/* return to char 0 in NEXT word */
 17.1667 +	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
 17.1668 +	{   /* just ran out of arguments */
 17.1669 +	    c = EOF;		/* return EOF */
 17.1670 +	    AgetMode = -1;	/* ensure all future returns return EOF */
 17.1671 +	}
 17.1672 +    }
 17.1673 +
 17.1674 +    return( c );		/* return appropriate character */
 17.1675 +
 17.1676 +}	/* end: Agetchar() */
 17.1677 +
 17.1678 +
 17.1679 +/****************************************************************************
 17.1680 +
 17.1681 +  iso2022
 17.1682 +
 17.1683 +  Called by getinchr.  Interprets ISO 2022 sequences
 17.1684 +
 17.1685 +******************************************************************************/
 17.1686 +
 17.1687 +inchr iso2022()
 17.1688 +{
 17.1689 +  inchr ch;
 17.1690 +  inchr ch2;
 17.1691 +  int save_gl;
 17.1692 +  int save_gr;
 17.1693 +
 17.1694 +  ch = Agetchar();
 17.1695 +  if (ch == EOF) return ch;
 17.1696 +  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
 17.1697 +  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
 17.1698 +  switch (ch) {
 17.1699 +    case 14: /* invoke G0 into GL */
 17.1700 +      gl = 0;
 17.1701 +      return iso2022();
 17.1702 +    case 15: /* invoke G1 into GL */
 17.1703 +      gl = 1;
 17.1704 +      return iso2022();
 17.1705 +    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
 17.1706 +      save_gl = gl; save_gr = gr;
 17.1707 +      gl = gr = 2;
 17.1708 +      ch = iso2022();
 17.1709 +      gl = save_gl; gr = save_gr;
 17.1710 +      return ch;
 17.1711 +    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
 17.1712 +      save_gl = gl; save_gr = gr;
 17.1713 +      gl = gr = 3;
 17.1714 +      ch = iso2022();
 17.1715 +      gl = save_gl; gr = save_gr;
 17.1716 +      return ch;
 17.1717 +    case 'n' + 0x100: /* invoke G2 into GL */
 17.1718 +      gl = 2;
 17.1719 +      return iso2022();
 17.1720 +    case 'o' + 0x100: /* invoke G3 into GL */
 17.1721 +      gl = 3;
 17.1722 +      return iso2022();
 17.1723 +    case '~' + 0x100: /* invoke G1 into GR */
 17.1724 +      gr = 1;
 17.1725 +      return iso2022();
 17.1726 +    case '}' + 0x100: /* invoke G2 into GR */
 17.1727 +      gr = 2;
 17.1728 +      return iso2022();
 17.1729 +    case '|' + 0x100: /* invoke G3 into GR */
 17.1730 +      gr = 3;
 17.1731 +      return iso2022();
 17.1732 +    case '(' + 0x100: /* set G0 to 94-char set */
 17.1733 +      ch = Agetchar();
 17.1734 +      if (ch == 'B') ch = 0; /* ASCII */
 17.1735 +      gn[0] = ch << 16;
 17.1736 +      gndbl[0] = 0;
 17.1737 +      return iso2022();
 17.1738 +    case ')' + 0x100: /* set G1 to 94-char set */
 17.1739 +      ch = Agetchar();
 17.1740 +      if (ch == 'B') ch = 0;
 17.1741 +      gn[1] = ch << 16;
 17.1742 +      gndbl[1] = 0;
 17.1743 +      return iso2022();
 17.1744 +    case '*' + 0x100: /* set G2 to 94-char set */
 17.1745 +      ch = Agetchar();
 17.1746 +      if (ch == 'B') ch = 0;
 17.1747 +      gn[2] = ch << 16;
 17.1748 +      gndbl[2] = 0;
 17.1749 +      return iso2022();
 17.1750 +    case '+' + 0x100: /* set G3 to 94-char set */
 17.1751 +      ch = Agetchar();
 17.1752 +      if (ch == 'B') ch = 0;
 17.1753 +      gn[3] = ch << 16;
 17.1754 +      gndbl[3] = 0;
 17.1755 +      return iso2022();
 17.1756 +    case '-' + 0x100: /* set G1 to 96-char set */
 17.1757 +      ch = Agetchar();
 17.1758 +      if (ch == 'A') ch = 0; /* Latin-1 top half */
 17.1759 +      gn[1] = (ch << 16) | 0x80;
 17.1760 +      gndbl[1] = 0;
 17.1761 +      return iso2022();
 17.1762 +    case '.' + 0x100: /* set G2 to 96-char set */
 17.1763 +      ch = Agetchar();
 17.1764 +      if (ch == 'A') ch = 0;
 17.1765 +      gn[2] = (ch << 16) | 0x80;
 17.1766 +      gndbl[2] = 0;
 17.1767 +      return iso2022();
 17.1768 +    case '/' + 0x100: /* set G3 to 96-char set */
 17.1769 +      ch = Agetchar();
 17.1770 +      if (ch == 'A') ch = 0;
 17.1771 +      gn[3] = (ch << 16) | 0x80;
 17.1772 +      gndbl[3] = 0;
 17.1773 +      return iso2022();
 17.1774 +    case '(' + 0x200: /* set G0 to 94 x 94 char set */
 17.1775 +      ch = Agetchar();
 17.1776 +      gn[0] = ch << 16;
 17.1777 +      gndbl[0] = 1;
 17.1778 +      return iso2022();
 17.1779 +    case ')' + 0x200: /* set G1 to 94 x 94 char set */
 17.1780 +      ch = Agetchar();
 17.1781 +      gn[1] = ch << 16;
 17.1782 +      gndbl[1] = 1;
 17.1783 +      return iso2022();
 17.1784 +    case '*' + 0x200: /* set G2 to 94 x 94 char set */
 17.1785 +      ch = Agetchar();
 17.1786 +      gn[2] = ch << 16;
 17.1787 +      gndbl[2] = 1;
 17.1788 +      return iso2022();
 17.1789 +    case '+' + 0x200: /* set G3 to 94 x 94 char set */
 17.1790 +      ch = Agetchar();
 17.1791 +      gn[3] = ch << 16;
 17.1792 +      gndbl[3] = 1;
 17.1793 +      return iso2022();
 17.1794 +    default:
 17.1795 +      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
 17.1796 +        gn[0] = (ch & ~0x200) << 16;
 17.1797 +        gndbl[0] = 1;
 17.1798 +        return iso2022();
 17.1799 +        }
 17.1800 +      }
 17.1801 +
 17.1802 +  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
 17.1803 +    if (gndbl[gl]) {
 17.1804 +      ch2 = Agetchar();
 17.1805 +      return gn[gl] | (ch << 8) | ch2;
 17.1806 +      }
 17.1807 +    else return gn[gl] | ch;
 17.1808 +    }
 17.1809 +  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
 17.1810 +    if (gndbl[gr]) {
 17.1811 +      ch2 = Agetchar();
 17.1812 +      return gn[gr] | (ch << 8) | ch2;
 17.1813 +      }
 17.1814 +    else return gn[gr] | (ch & ~0x80);
 17.1815 +    }
 17.1816 +  else return ch;
 17.1817 +  }
 17.1818 +
 17.1819 +/****************************************************************************
 17.1820 +
 17.1821 +  ungetinchr
 17.1822 +
 17.1823 +  Called by main.  Pushes back an "inchr" to be read by getinchr
 17.1824 +  on the next call.
 17.1825 +
 17.1826 +******************************************************************************/
 17.1827 +inchr getinchr_buffer;
 17.1828 +int getinchr_flag;
 17.1829 +
 17.1830 +inchr ungetinchr(c)
 17.1831 +inchr c;
 17.1832 +{
 17.1833 +  getinchr_buffer = c;
 17.1834 +  getinchr_flag = 1;
 17.1835 +  return c;
 17.1836 +}
 17.1837 +
 17.1838 +/*****************************************************************************
 17.1839 +
 17.1840 +  getinchr
 17.1841 +
 17.1842 +  Called by main.  Processes multibyte characters.  Invokes Agetchar.
 17.1843 +  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
 17.1844 +  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
 17.1845 +    0x80-0xFF bytes are first byte of a double-byte character).
 17.1846 +  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
 17.1847 +    0x80-0xBF bytes are nonfirst byte of a multibyte character,
 17.1848 +    0xC0-0xFD bytes are first byte of a multibyte character,
 17.1849 +    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
 17.1850 +  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
 17.1851 +    "~~" is a tilde, "~x" for all other x is ignored).
 17.1852 +  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
 17.1853 +    of a double-byte character, all other bytes are characters).
 17.1854 + 
 17.1855 +
 17.1856 +*****************************************************************************/
 17.1857 +
 17.1858 +inchr getinchr()
 17.1859 +{
 17.1860 +  int ch, ch2, ch3, ch4, ch5, ch6;
 17.1861 +
 17.1862 +  if (getinchr_flag) {
 17.1863 +    getinchr_flag = 0;
 17.1864 +    return getinchr_buffer;
 17.1865 +    }
 17.1866 +
 17.1867 +  switch(multibyte) {
 17.1868 +    case 0: /* single-byte */
 17.1869 +      return iso2022();
 17.1870 +   case 1: /* DBCS */
 17.1871 +     ch = Agetchar();
 17.1872 +     if ((ch >= 0x80 && ch <= 0x9F) ||
 17.1873 +         (ch >= 0xE0 && ch <= 0xEF)) {
 17.1874 +       ch = (ch << 8) + Agetchar();
 17.1875 +       }
 17.1876 +     return ch;
 17.1877 +   case 2: /* UTF-8 */
 17.1878 +      ch = Agetchar();
 17.1879 +      if (ch < 0x80) return ch;  /* handles EOF, too */
 17.1880 +      if (ch < 0xC0 || ch > 0xFD)
 17.1881 +        return 0x0080;  /* illegal first character */
 17.1882 +      ch2 = Agetchar() & 0x3F;
 17.1883 +      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
 17.1884 +      ch3 = Agetchar() & 0x3F;
 17.1885 +      if (ch < 0xF0)
 17.1886 +        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
 17.1887 +      ch4 = Agetchar() & 0x3F;
 17.1888 +      if (ch < 0xF8)
 17.1889 +        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
 17.1890 +      ch5 = Agetchar() & 0x3F;
 17.1891 +      if (ch < 0xFC)
 17.1892 +        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
 17.1893 +          (ch4 << 6) + ch5;
 17.1894 +      ch6 = Agetchar() & 0x3F;
 17.1895 +      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
 17.1896 +        (ch4 << 12) + (ch5 << 6) + ch6;
 17.1897 +   case 3: /* HZ */
 17.1898 +     ch = Agetchar();
 17.1899 +     if (ch == EOF) return ch;
 17.1900 +     if (hzmode) {
 17.1901 +       ch = (ch << 8) + Agetchar();
 17.1902 +       if (ch == ('}' << 8) + '~') {
 17.1903 +         hzmode = 0;
 17.1904 +         return getinchr();
 17.1905 +         }
 17.1906 +       return ch;
 17.1907 +       }
 17.1908 +     else if (ch == '~') {
 17.1909 +       ch = Agetchar();
 17.1910 +       if (ch == '{') {
 17.1911 +          hzmode = 1;
 17.1912 +          return getinchr();
 17.1913 +          }
 17.1914 +      else if (ch == '~') {
 17.1915 +        return ch;
 17.1916 +        }
 17.1917 +      else {
 17.1918 +        return getinchr();
 17.1919 +        }
 17.1920 +      }
 17.1921 +     else return ch;
 17.1922 +   case 4: /* Shift-JIS */
 17.1923 +     ch = Agetchar();
 17.1924 +     if ((ch >= 0x80 && ch <= 0x9F) ||
 17.1925 +         (ch >= 0xE0 && ch <= 0xEF)) {
 17.1926 +       ch = (ch << 8) + Agetchar();
 17.1927 +       }
 17.1928 +     return ch;
 17.1929 +   default:
 17.1930 +     return 0x80;
 17.1931 +    }
 17.1932 +  }
 17.1933 +
 17.1934 +/****************************************************************************
 17.1935 +
 17.1936 +  main
 17.1937 +
 17.1938 +  The main program, of course.
 17.1939 +  Reads characters 1 by 1 from stdin, and makes lines out of them using
 17.1940 +  addchar. Handles line breaking, (which accounts for most of the
 17.1941 +  complexity in this function).
 17.1942 +
 17.1943 +****************************************************************************/
 17.1944 +
 17.1945 +int main(argc,argv)
 17.1946 +int argc;
 17.1947 +char *argv[];
 17.1948 +{
 17.1949 +  inchr c,c2;
 17.1950 +  int i;
 17.1951 +  int last_was_eol_flag;
 17.1952 +/*---------------------------------------------------------------------------
 17.1953 +  wordbreakmode:
 17.1954 +    -1: /^$/ and blanks are to be absorbed (when line break was forced
 17.1955 +      by a blank or character larger than outlinelenlimit)
 17.1956 +    0: /^ *$/ and blanks are not to be absorbed
 17.1957 +    1: /[^ ]$/ no word break yet
 17.1958 +    2: /[^ ]  *$/
 17.1959 +    3: /[^ ]$/ had a word break
 17.1960 +---------------------------------------------------------------------------*/
 17.1961 +  int wordbreakmode;
 17.1962 +  int char_not_added;
 17.1963 +
 17.1964 +  Myargc = argc;
 17.1965 +  Myargv = argv;
 17.1966 +  getparams();
 17.1967 +  readcontrolfiles();
 17.1968 +  readfont();
 17.1969 +  linealloc();
 17.1970 +
 17.1971 +  wordbreakmode = 0;
 17.1972 +  last_was_eol_flag = 0;
 17.1973 +
 17.1974 +  while ((c = getinchr())!=EOF) {
 17.1975 +
 17.1976 +    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
 17.1977 +      ungetinchr(c2 = getinchr());
 17.1978 +      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
 17.1979 +      }
 17.1980 +    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
 17.1981 +
 17.1982 +    if (deutschflag) {
 17.1983 +      if (c>='[' && c<=']') {
 17.1984 +        c = deutsch[c-'['];
 17.1985 +        }
 17.1986 +      else if (c >='{' && c <= '~') {
 17.1987 +        c = deutsch[c-'{'+3];
 17.1988 +        }
 17.1989 +      }
 17.1990 +
 17.1991 +    c = handlemapping(c);
 17.1992 +
 17.1993 +    if (isascii(c)&&isspace(c)) {
 17.1994 +      c = (c=='\t'||c==' ') ? ' ' : '\n';
 17.1995 +      }
 17.1996 +
 17.1997 +    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
 17.1998 +
 17.1999 +/*
 17.2000 +  Note: The following code is complex and thoroughly tested.
 17.2001 +  Be careful when modifying!
 17.2002 +*/
 17.2003 +
 17.2004 +    do {
 17.2005 +      char_not_added = 0;
 17.2006 +
 17.2007 +      if (wordbreakmode== -1) {
 17.2008 +        if (c==' ') {
 17.2009 +          break;
 17.2010 +          }
 17.2011 +        else if (c=='\n') {
 17.2012 +          wordbreakmode = 0;
 17.2013 +          break;
 17.2014 +          }
 17.2015 +        wordbreakmode = 0;
 17.2016 +        }
 17.2017 +
 17.2018 +      if (c=='\n') {
 17.2019 +        printline();
 17.2020 +        wordbreakmode = 0;
 17.2021 +        }
 17.2022 +
 17.2023 +      else if (addchar(c)) {
 17.2024 +        if (c!=' ') {
 17.2025 +          wordbreakmode = (wordbreakmode>=2)?3:1;
 17.2026 +          }
 17.2027 +        else {
 17.2028 +          wordbreakmode = (wordbreakmode>0)?2:0;
 17.2029 +          }
 17.2030 +        }
 17.2031 +
 17.2032 +      else if (outlinelen==0) {
 17.2033 +        for (i=0;i<charheight;i++) {
 17.2034 +          if (right2left && outputwidth>1) {
 17.2035 +            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
 17.2036 +            }
 17.2037 +          else {
 17.2038 +            putstring(currchar[i]);
 17.2039 +            }
 17.2040 +          }
 17.2041 +        wordbreakmode = -1;
 17.2042 +        }
 17.2043 +
 17.2044 +      else if (c==' ') {
 17.2045 +        if (wordbreakmode==2) {
 17.2046 +          splitline();
 17.2047 +          }
 17.2048 +        else {
 17.2049 +          printline();
 17.2050 +          }
 17.2051 +        wordbreakmode = -1;
 17.2052 +        }
 17.2053 +
 17.2054 +      else {
 17.2055 +        if (wordbreakmode>=2) {
 17.2056 +          splitline();
 17.2057 +          }
 17.2058 +        else {
 17.2059 +          printline();
 17.2060 +          }
 17.2061 +        wordbreakmode = (wordbreakmode==3)?1:0;
 17.2062 +        char_not_added = 1;
 17.2063 +        }
 17.2064 +
 17.2065 +      } while (char_not_added);
 17.2066 +    }
 17.2067 +
 17.2068 +  if (outlinelen!=0) {
 17.2069 +    printline();
 17.2070 +    }
 17.2071 +
 17.2072 +  /* XXX Xen hack -- finish off the C macro output */
 17.2073 +  if ( nr_chars != 0 )
 17.2074 +      putchar('"');
 17.2075 +  putchar('\n');
 17.2076 +
 17.2077 +  exit(0);
 17.2078 +}
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/xen/figlet/xen.flf	Mon Jul 12 12:58:48 2004 +0000
    18.3 @@ -0,0 +1,2230 @@
    18.4 +flf2a$ 6 5 16 15 14 0 24463 229
    18.5 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    18.6 +Includes ISO Latin-1
    18.7 +figlet release 2.1 -- 12 Aug 1994
    18.8 +Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    18.9 +  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   18.10 +Permission is hereby given to modify this font, as long as the
   18.11 +modifier's name is placed on a comment line.
   18.12 +
   18.13 +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   18.14 +supported by FIGlet and FIGWin.  May also be slightly modified for better use
   18.15 +of new full-width/kern/smush alternatives, but default output is NOT changed.
   18.16 +
   18.17 +Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   18.18 +
   18.19 + $@
   18.20 + $@
   18.21 + $@
   18.22 + $@
   18.23 + $@
   18.24 + $@@
   18.25 +  _ @
   18.26 + | |@
   18.27 + | |@
   18.28 + |_|@
   18.29 + (_)@
   18.30 +    @@
   18.31 +  _ _ @
   18.32 + ( | )@
   18.33 +  V V @
   18.34 +   $  @
   18.35 +   $  @
   18.36 +      @@
   18.37 +    _  _   @
   18.38 +  _| || |_ @
   18.39 + |_  ..  _|@
   18.40 + |_      _|@
   18.41 +   |_||_|  @
   18.42 +           @@
   18.43 +   _  @
   18.44 +  | | @
   18.45 + / __)@
   18.46 + \__ \@
   18.47 + (   /@
   18.48 +  |_| @@
   18.49 +  _  __@
   18.50 + (_)/ /@
   18.51 +   / / @
   18.52 +  / /_ @
   18.53 + /_/(_)@
   18.54 +       @@
   18.55 +   ___   @
   18.56 +  ( _ )  @
   18.57 +  / _ \/\@
   18.58 + | (_>  <@
   18.59 +  \___/\/@
   18.60 +         @@
   18.61 +  _ @
   18.62 + ( )@
   18.63 + |/ @
   18.64 +  $ @
   18.65 +  $ @
   18.66 +    @@
   18.67 +   __@
   18.68 +  / /@
   18.69 + | | @
   18.70 + | | @
   18.71 + | | @
   18.72 +  \_\@@
   18.73 + __  @
   18.74 + \ \ @
   18.75 +  | |@
   18.76 +  | |@
   18.77 +  | |@
   18.78 + /_/ @@
   18.79 +       @
   18.80 + __/\__@
   18.81 + \    /@
   18.82 + /_  _\@
   18.83 +   \/  @
   18.84 +       @@
   18.85 +        @
   18.86 +    _   @
   18.87 +  _| |_ @
   18.88 + |_   _|@
   18.89 +   |_|  @
   18.90 +        @@
   18.91 +    @
   18.92 +    @
   18.93 +    @
   18.94 +  _ @
   18.95 + ( )@
   18.96 + |/ @@
   18.97 +     @
   18.98 +     @
   18.99 +  __ @
  18.100 + |__|@
  18.101 +  $  @
  18.102 +     @@
  18.103 +    @
  18.104 +    @
  18.105 +    @
  18.106 +  _ @
  18.107 + (_)@
  18.108 +    @@
  18.109 +     __@
  18.110 +    / /@
  18.111 +   / / @
  18.112 +  / /  @
  18.113 + /_/   @
  18.114 +       @@
  18.115 +   ___  @
  18.116 +  / _ \ @
  18.117 + | | | |@
  18.118 + | |_| |@
  18.119 +  \___/ @
  18.120 +        @@
  18.121 +  _ @
  18.122 + / |@
  18.123 + | |@
  18.124 + | |@
  18.125 + |_|@
  18.126 +    @@
  18.127 +  ____  @
  18.128 + |___ \ @
  18.129 +   __) |@
  18.130 +  / __/ @
  18.131 + |_____|@
  18.132 +        @@
  18.133 +  _____ @
  18.134 + |___ / @
  18.135 +   |_ \ @
  18.136 +  ___) |@
  18.137 + |____/ @
  18.138 +        @@
  18.139 +  _  _   @
  18.140 + | || |  @
  18.141 + | || |_ @
  18.142 + |__   _|@
  18.143 +    |_|  @
  18.144 +         @@
  18.145 +  ____  @
  18.146 + | ___| @
  18.147 + |___ \ @
  18.148 +  ___) |@
  18.149 + |____/ @
  18.150 +        @@
  18.151 +   __   @
  18.152 +  / /_  @
  18.153 + | '_ \ @
  18.154 + | (_) |@
  18.155 +  \___/ @
  18.156 +        @@
  18.157 +  _____ @
  18.158 + |___  |@
  18.159 +    / / @
  18.160 +   / /  @
  18.161 +  /_/   @
  18.162 +        @@
  18.163 +   ___  @
  18.164 +  ( _ ) @
  18.165 +  / _ \ @
  18.166 + | (_) |@
  18.167 +  \___/ @
  18.168 +        @@
  18.169 +   ___  @
  18.170 +  / _ \ @
  18.171 + | (_) |@
  18.172 +  \__, |@
  18.173 +    /_/ @
  18.174 +        @@
  18.175 +    @
  18.176 +  _ @
  18.177 + (_)@
  18.178 +  _ @
  18.179 + (_)@
  18.180 +    @@
  18.181 +    @
  18.182 +  _ @
  18.183 + (_)@
  18.184 +  _ @
  18.185 + ( )@
  18.186 + |/ @@
  18.187 +   __@
  18.188 +  / /@
  18.189 + / / @
  18.190 + \ \ @
  18.191 +  \_\@
  18.192 +     @@
  18.193 +        @
  18.194 +  _____ @
  18.195 + |_____|@
  18.196 + |_____|@
  18.197 +    $   @
  18.198 +        @@
  18.199 + __  @
  18.200 + \ \ @
  18.201 +  \ \@
  18.202 +  / /@
  18.203 + /_/ @
  18.204 +     @@
  18.205 +  ___ @
  18.206 + |__ \@
  18.207 +   / /@
  18.208 +  |_| @
  18.209 +  (_) @
  18.210 +      @@
  18.211 +    ____  @
  18.212 +   / __ \ @
  18.213 +  / / _` |@
  18.214 + | | (_| |@
  18.215 +  \ \__,_|@
  18.216 +   \____/ @@
  18.217 +     _    @
  18.218 +    / \   @
  18.219 +   / _ \  @
  18.220 +  / ___ \ @
  18.221 + /_/   \_\@
  18.222 +          @@
  18.223 +  ____  @
  18.224 + | __ ) @
  18.225 + |  _ \ @
  18.226 + | |_) |@
  18.227 + |____/ @
  18.228 +        @@
  18.229 +   ____ @
  18.230 +  / ___|@
  18.231 + | |    @
  18.232 + | |___ @
  18.233 +  \____|@
  18.234 +        @@
  18.235 +  ____  @
  18.236 + |  _ \ @
  18.237 + | | | |@
  18.238 + | |_| |@
  18.239 + |____/ @
  18.240 +        @@
  18.241 +  _____ @
  18.242 + | ____|@
  18.243 + |  _|  @
  18.244 + | |___ @
  18.245 + |_____|@
  18.246 +        @@
  18.247 +  _____ @
  18.248 + |  ___|@
  18.249 + | |_   @
  18.250 + |  _|  @
  18.251 + |_|    @
  18.252 +        @@
  18.253 +   ____ @
  18.254 +  / ___|@
  18.255 + | |  _ @
  18.256 + | |_| |@
  18.257 +  \____|@
  18.258 +        @@
  18.259 +  _   _ @
  18.260 + | | | |@
  18.261 + | |_| |@
  18.262 + |  _  |@
  18.263 + |_| |_|@
  18.264 +        @@
  18.265 +  ___ @
  18.266 + |_ _|@
  18.267 +  | | @
  18.268 +  | | @
  18.269 + |___|@
  18.270 +      @@
  18.271 +      _ @
  18.272 +     | |@
  18.273 +  _  | |@
  18.274 + | |_| |@
  18.275 +  \___/ @
  18.276 +        @@
  18.277 +  _  __@
  18.278 + | |/ /@
  18.279 + | ' / @
  18.280 + | . \ @
  18.281 + |_|\_\@
  18.282 +       @@
  18.283 +  _     @
  18.284 + | |    @
  18.285 + | |    @
  18.286 + | |___ @
  18.287 + |_____|@
  18.288 +        @@
  18.289 +  __  __ @
  18.290 + |  \/  |@
  18.291 + | |\/| |@
  18.292 + | |  | |@
  18.293 + |_|  |_|@
  18.294 +         @@
  18.295 +  _   _ @
  18.296 + | \ | |@
  18.297 + |  \| |@
  18.298 + | |\  |@
  18.299 + |_| \_|@
  18.300 +        @@
  18.301 +   ___  @
  18.302 +  / _ \ @
  18.303 + | | | |@
  18.304 + | |_| |@
  18.305 +  \___/ @
  18.306 +        @@
  18.307 +  ____  @
  18.308 + |  _ \ @
  18.309 + | |_) |@
  18.310 + |  __/ @
  18.311 + |_|    @
  18.312 +        @@
  18.313 +   ___  @
  18.314 +  / _ \ @
  18.315 + | | | |@
  18.316 + | |_| |@
  18.317 +  \__\_\@
  18.318 +        @@
  18.319 +  ____  @
  18.320 + |  _ \ @
  18.321 + | |_) |@
  18.322 + |  _ < @
  18.323 + |_| \_\@
  18.324 +        @@
  18.325 +  ____  @
  18.326 + / ___| @
  18.327 + \___ \ @
  18.328 +  ___) |@
  18.329 + |____/ @
  18.330 +        @@
  18.331 +  _____ @
  18.332 + |_   _|@
  18.333 +   | |  @
  18.334 +   | |  @
  18.335 +   |_|  @
  18.336 +        @@
  18.337 +  _   _ @
  18.338 + | | | |@
  18.339 + | | | |@
  18.340 + | |_| |@
  18.341 +  \___/ @
  18.342 +        @@
  18.343 + __     __@
  18.344 + \ \   / /@
  18.345 +  \ \ / / @
  18.346 +   \ V /  @
  18.347 +    \_/   @
  18.348 +          @@
  18.349 + __        __@
  18.350 + \ \      / /@
  18.351 +  \ \ /\ / / @
  18.352 +   \ V  V /  @
  18.353 +    \_/\_/   @
  18.354 +             @@
  18.355 + __  __@
  18.356 + \ \/ /@
  18.357 +  \  / @
  18.358 +  /  \ @
  18.359 + /_/\_\@
  18.360 +       @@
  18.361 + __   __@
  18.362 + \ \ / /@
  18.363 +  \ V / @
  18.364 +   | |  @
  18.365 +   |_|  @
  18.366 +        @@
  18.367 +  _____@
  18.368 + |__  /@
  18.369 +   / / @
  18.370 +  / /_ @
  18.371 + /____|@
  18.372 +       @@
  18.373 +  __ @
  18.374 + | _|@
  18.375 + | | @
  18.376 + | | @
  18.377 + | | @
  18.378 + |__|@@
  18.379 + __    @
  18.380 + \ \   @
  18.381 +  \ \  @
  18.382 +   \ \ @
  18.383 +    \_\@
  18.384 +       @@
  18.385 +  __ @
  18.386 + |_ |@
  18.387 +  | |@
  18.388 +  | |@
  18.389 +  | |@
  18.390 + |__|@@
  18.391 +  /\ @
  18.392 + |/\|@
  18.393 +   $ @
  18.394 +   $ @
  18.395 +   $ @
  18.396 +     @@
  18.397 +        @
  18.398 +        @
  18.399 +        @
  18.400 +        @
  18.401 +  _____ @
  18.402 + |_____|@@
  18.403 +  _ @
  18.404 + ( )@
  18.405 +  \|@
  18.406 +  $ @
  18.407 +  $ @
  18.408 +    @@
  18.409 +        @
  18.410 +   __ _ @
  18.411 +  / _` |@
  18.412 + | (_| |@
  18.413 +  \__,_|@
  18.414 +        @@
  18.415 +  _     @
  18.416 + | |__  @
  18.417 + | '_ \ @
  18.418 + | |_) |@
  18.419 + |_.__/ @
  18.420 +        @@
  18.421 +       @
  18.422 +   ___ @
  18.423 +  / __|@
  18.424 + | (__ @
  18.425 +  \___|@
  18.426 +       @@
  18.427 +      _ @
  18.428 +   __| |@
  18.429 +  / _` |@
  18.430 + | (_| |@
  18.431 +  \__,_|@
  18.432 +        @@
  18.433 +       @
  18.434 +   ___ @
  18.435 +  / _ \@
  18.436 + |  __/@
  18.437 +  \___|@
  18.438 +       @@
  18.439 +   __ @
  18.440 +  / _|@
  18.441 + | |_ @
  18.442 + |  _|@
  18.443 + |_|  @
  18.444 +      @@
  18.445 +        @
  18.446 +   __ _ @
  18.447 +  / _` |@
  18.448 + | (_| |@
  18.449 +  \__, |@
  18.450 +  |___/ @@
  18.451 +  _     @
  18.452 + | |__  @
  18.453 + | '_ \ @
  18.454 + | | | |@
  18.455 + |_| |_|@
  18.456 +        @@
  18.457 +  _ @
  18.458 + (_)@
  18.459 + | |@
  18.460 + | |@
  18.461 + |_|@
  18.462 +    @@
  18.463 +    _ @
  18.464 +   (_)@
  18.465 +   | |@
  18.466 +   | |@
  18.467 +  _/ |@
  18.468 + |__/ @@
  18.469 +  _    @
  18.470 + | | __@
  18.471 + | |/ /@
  18.472 + |   < @
  18.473 + |_|\_\@
  18.474 +       @@
  18.475 +  _ @
  18.476 + | |@
  18.477 + | |@
  18.478 + | |@
  18.479 + |_|@
  18.480 +    @@
  18.481 +            @
  18.482 +  _ __ ___  @
  18.483 + | '_ ` _ \ @
  18.484 + | | | | | |@
  18.485 + |_| |_| |_|@
  18.486 +            @@
  18.487 +        @
  18.488 +  _ __  @
  18.489 + | '_ \ @
  18.490 + | | | |@
  18.491 + |_| |_|@
  18.492 +        @@
  18.493 +        @
  18.494 +   ___  @
  18.495 +  / _ \ @
  18.496 + | (_) |@
  18.497 +  \___/ @
  18.498 +        @@
  18.499 +        @
  18.500 +  _ __  @
  18.501 + | '_ \ @
  18.502 + | |_) |@
  18.503 + | .__/ @
  18.504 + |_|    @@
  18.505 +        @
  18.506 +   __ _ @
  18.507 +  / _` |@
  18.508 + | (_| |@
  18.509 +  \__, |@
  18.510 +     |_|@@
  18.511 +       @
  18.512 +  _ __ @
  18.513 + | '__|@
  18.514 + | |   @
  18.515 + |_|   @
  18.516 +       @@
  18.517 +      @
  18.518 +  ___ @
  18.519 + / __|@
  18.520 + \__ \@
  18.521 + |___/@
  18.522 +      @@
  18.523 +  _   @
  18.524 + | |_ @
  18.525 + | __|@
  18.526 + | |_ @
  18.527 +  \__|@
  18.528 +      @@
  18.529 +        @
  18.530 +  _   _ @
  18.531 + | | | |@
  18.532 + | |_| |@
  18.533 +  \__,_|@
  18.534 +        @@
  18.535 +        @
  18.536 + __   __@
  18.537 + \ \ / /@
  18.538 +  \ V / @
  18.539 +   \_/  @
  18.540 +        @@
  18.541 +           @
  18.542 + __      __@
  18.543 + \ \ /\ / /@
  18.544 +  \ V  V / @
  18.545 +   \_/\_/  @
  18.546 +           @@
  18.547 +       @
  18.548 + __  __@
  18.549 + \ \/ /@
  18.550 +  >  < @
  18.551 + /_/\_\@
  18.552 +       @@
  18.553 +        @
  18.554 +  _   _ @
  18.555 + | | | |@
  18.556 + | |_| |@
  18.557 +  \__, |@
  18.558 +  |___/ @@
  18.559 +      @
  18.560 +  ____@
  18.561 + |_  /@
  18.562 +  / / @
  18.563 + /___|@
  18.564 +      @@
  18.565 +    __@
  18.566 +   / /@
  18.567 +  | | @
  18.568 + < <  @
  18.569 +  | | @
  18.570 +   \_\@@
  18.571 +  _ @
  18.572 + | |@
  18.573 + | |@
  18.574 + | |@
  18.575 + | |@
  18.576 + |_|@@
  18.577 + __   @
  18.578 + \ \  @
  18.579 +  | | @
  18.580 +   > >@
  18.581 +  | | @
  18.582 + /_/  @@
  18.583 +  /\/|@
  18.584 + |/\/ @
  18.585 +   $  @
  18.586 +   $  @
  18.587 +   $  @
  18.588 +      @@
  18.589 +  _   _ @
  18.590 + (_)_(_)@
  18.591 +   /_\  @
  18.592 +  / _ \ @
  18.593 + /_/ \_\@
  18.594 +        @@
  18.595 +  _   _ @
  18.596 + (_)_(_)@
  18.597 +  / _ \ @
  18.598 + | |_| |@
  18.599 +  \___/ @
  18.600 +        @@
  18.601 +  _   _ @
  18.602 + (_) (_)@
  18.603 + | | | |@
  18.604 + | |_| |@
  18.605 +  \___/ @
  18.606 +        @@
  18.607 +  _   _ @
  18.608 + (_)_(_)@
  18.609 +  / _` |@
  18.610 + | (_| |@
  18.611 +  \__,_|@
  18.612 +        @@
  18.613 +  _   _ @
  18.614 + (_)_(_)@
  18.615 +  / _ \ @
  18.616 + | (_) |@
  18.617 +  \___/ @
  18.618 +        @@
  18.619 +  _   _ @
  18.620 + (_) (_)@
  18.621 + | | | |@
  18.622 + | |_| |@
  18.623 +  \__,_|@
  18.624 +        @@
  18.625 +   ___ @
  18.626 +  / _ \@
  18.627 + | |/ /@
  18.628 + | |\ \@
  18.629 + | ||_/@
  18.630 + |_|   @@
  18.631 +160  NO-BREAK SPACE
  18.632 + $@
  18.633 + $@
  18.634 + $@
  18.635 + $@
  18.636 + $@
  18.637 + $@@
  18.638 +161  INVERTED EXCLAMATION MARK
  18.639 +  _ @
  18.640 + (_)@
  18.641 + | |@
  18.642 + | |@
  18.643 + |_|@
  18.644 +    @@
  18.645 +162  CENT SIGN
  18.646 +    _  @
  18.647 +   | | @
  18.648 +  / __)@
  18.649 + | (__ @
  18.650 +  \   )@
  18.651 +   |_| @@
  18.652 +163  POUND SIGN
  18.653 +    ___  @
  18.654 +   / ,_\ @
  18.655 + _| |_   @
  18.656 +  | |___ @
  18.657 + (_,____|@
  18.658 +         @@
  18.659 +164  CURRENCY SIGN
  18.660 + /\___/\@
  18.661 + \  _  /@
  18.662 + | (_) |@
  18.663 + / ___ \@
  18.664 + \/   \/@
  18.665 +        @@
  18.666 +165  YEN SIGN
  18.667 +  __ __ @
  18.668 +  \ V / @
  18.669 + |__ __|@
  18.670 + |__ __|@
  18.671 +   |_|  @
  18.672 +        @@
  18.673 +166  BROKEN BAR
  18.674 +  _ @
  18.675 + | |@
  18.676 + |_|@
  18.677 +  _ @
  18.678 + | |@
  18.679 + |_|@@
  18.680 +167  SECTION SIGN
  18.681 +    __ @
  18.682 +  _/ _)@
  18.683 + / \ \ @
  18.684 + \ \\ \@
  18.685 +  \ \_/@
  18.686 + (__/  @@
  18.687 +168  DIAERESIS
  18.688 +  _   _ @
  18.689 + (_) (_)@
  18.690 +  $   $ @
  18.691 +  $   $ @
  18.692 +  $   $ @
  18.693 +        @@
  18.694 +169  COPYRIGHT SIGN
  18.695 +    _____   @
  18.696 +   / ___ \  @
  18.697 +  / / __| \ @
  18.698 + | | (__   |@
  18.699 +  \ \___| / @
  18.700 +   \_____/  @@
  18.701 +170  FEMININE ORDINAL INDICATOR
  18.702 +  __ _ @
  18.703 + / _` |@
  18.704 + \__,_|@
  18.705 + |____|@
  18.706 +    $  @
  18.707 +       @@
  18.708 +171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  18.709 +   ____@
  18.710 +  / / /@
  18.711 + / / / @
  18.712 + \ \ \ @
  18.713 +  \_\_\@
  18.714 +       @@
  18.715 +172  NOT SIGN
  18.716 +        @
  18.717 +  _____ @
  18.718 + |___  |@
  18.719 +     |_|@
  18.720 +    $   @
  18.721 +        @@
  18.722 +173  SOFT HYPHEN
  18.723 +       @
  18.724 +       @
  18.725 +  ____ @
  18.726 + |____|@
  18.727 +    $  @
  18.728 +       @@
  18.729 +174  REGISTERED SIGN
  18.730 +    _____   @
  18.731 +   / ___ \  @
  18.732 +  / | _ \ \ @
  18.733 + |  |   /  |@
  18.734 +  \ |_|_\ / @
  18.735 +   \_____/  @@
  18.736 +175  MACRON
  18.737 +  _____ @
  18.738 + |_____|@
  18.739 +    $   @
  18.740 +    $   @
  18.741 +    $   @
  18.742 +        @@
  18.743 +176  DEGREE SIGN
  18.744 +   __  @
  18.745 +  /  \ @
  18.746 + | () |@
  18.747 +  \__/ @
  18.748 +    $  @
  18.749 +       @@
  18.750 +177  PLUS-MINUS SIGN
  18.751 +    _   @
  18.752 +  _| |_ @
  18.753 + |_   _|@
  18.754 +  _|_|_ @
  18.755 + |_____|@
  18.756 +        @@
  18.757 +178  SUPERSCRIPT TWO
  18.758 +  ___ @
  18.759 + |_  )@
  18.760 +  / / @
  18.761 + /___|@
  18.762 +   $  @
  18.763 +      @@
  18.764 +179  SUPERSCRIPT THREE
  18.765 +  ____@
  18.766 + |__ /@
  18.767 +  |_ \@
  18.768 + |___/@
  18.769 +   $  @
  18.770 +      @@
  18.771 +180  ACUTE ACCENT
  18.772 +  __@
  18.773 + /_/@
  18.774 +  $ @
  18.775 +  $ @
  18.776 +  $ @
  18.777 +    @@
  18.778 +181  MICRO SIGN
  18.779 +        @
  18.780 +  _   _ @
  18.781 + | | | |@
  18.782 + | |_| |@
  18.783 + | ._,_|@
  18.784 + |_|    @@
  18.785 +182  PILCROW SIGN
  18.786 +   _____ @
  18.787 +  /     |@
  18.788 + | (| | |@
  18.789 +  \__ | |@
  18.790 +    |_|_|@
  18.791 +         @@
  18.792 +183  MIDDLE DOT
  18.793 +    @
  18.794 +  _ @
  18.795 + (_)@
  18.796 +  $ @
  18.797 +  $ @
  18.798 +    @@
  18.799 +184  CEDILLA
  18.800 +    @
  18.801 +    @
  18.802 +    @
  18.803 +    @
  18.804 +  _ @
  18.805 + )_)@@
  18.806 +185  SUPERSCRIPT ONE
  18.807 +  _ @
  18.808 + / |@
  18.809 + | |@
  18.810 + |_|@
  18.811 +  $ @
  18.812 +    @@
  18.813 +186  MASCULINE ORDINAL INDICATOR
  18.814 +  ___ @
  18.815 + / _ \@
  18.816 + \___/@
  18.817 + |___|@
  18.818 +   $  @
  18.819 +      @@
  18.820 +187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  18.821 + ____  @
  18.822 + \ \ \ @
  18.823 +  \ \ \@
  18.824 +  / / /@
  18.825 + /_/_/ @
  18.826 +       @@
  18.827 +188  VULGAR FRACTION ONE QUARTER
  18.828 +  _   __    @
  18.829 + / | / / _  @
  18.830 + | |/ / | | @
  18.831 + |_/ /|_  _|@
  18.832 +  /_/   |_| @
  18.833 +            @@
  18.834 +189  VULGAR FRACTION ONE HALF
  18.835 +  _   __   @
  18.836 + / | / /__ @
  18.837 + | |/ /_  )@
  18.838 + |_/ / / / @
  18.839 +  /_/ /___|@
  18.840 +           @@
  18.841 +190  VULGAR FRACTION THREE QUARTERS
  18.842 +  ____  __    @
  18.843 + |__ / / / _  @
  18.844 +  |_ \/ / | | @
  18.845 + |___/ /|_  _|@
  18.846 +    /_/   |_| @
  18.847 +              @@
  18.848 +191  INVERTED QUESTION MARK
  18.849 +   _  @
  18.850 +  (_) @
  18.851 +  | | @
  18.852 + / /_ @
  18.853 + \___|@
  18.854 +      @@
  18.855 +192  LATIN CAPITAL LETTER A WITH GRAVE
  18.856 +   __   @
  18.857 +   \_\  @
  18.858 +   /_\  @
  18.859 +  / _ \ @
  18.860 + /_/ \_\@
  18.861 +        @@
  18.862 +193  LATIN CAPITAL LETTER A WITH ACUTE
  18.863 +    __  @
  18.864 +   /_/  @
  18.865 +   /_\  @
  18.866 +  / _ \ @
  18.867 + /_/ \_\@
  18.868 +        @@
  18.869 +194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  18.870 +   //\  @
  18.871 +  |/_\| @
  18.872 +   /_\  @
  18.873 +  / _ \ @
  18.874 + /_/ \_\@
  18.875 +        @@
  18.876 +195  LATIN CAPITAL LETTER A WITH TILDE
  18.877 +   /\/| @
  18.878 +  |/\/  @
  18.879 +   /_\  @
  18.880 +  / _ \ @
  18.881 + /_/ \_\@
  18.882 +        @@
  18.883 +196  LATIN CAPITAL LETTER A WITH DIAERESIS
  18.884 +  _   _ @
  18.885 + (_)_(_)@
  18.886 +   /_\  @
  18.887 +  / _ \ @
  18.888 + /_/ \_\@
  18.889 +        @@
  18.890 +197  LATIN CAPITAL LETTER A WITH RING ABOVE
  18.891 +    _   @
  18.892 +   (o)  @
  18.893 +   /_\  @
  18.894 +  / _ \ @
  18.895 + /_/ \_\@
  18.896 +        @@
  18.897 +198  LATIN CAPITAL LETTER AE
  18.898 +     ______ @
  18.899 +    /  ____|@
  18.900 +   / _  _|  @
  18.901 +  / __ |___ @
  18.902 + /_/ |_____|@
  18.903 +            @@
  18.904 +199  LATIN CAPITAL LETTER C WITH CEDILLA
  18.905 +   ____ @
  18.906 +  / ___|@
  18.907 + | |    @
  18.908 + | |___ @
  18.909 +  \____|@
  18.910 +    )_) @@
  18.911 +200  LATIN CAPITAL LETTER E WITH GRAVE
  18.912 +   __   @
  18.913 +  _\_\_ @
  18.914 + | ____|@
  18.915 + |  _|_ @
  18.916 + |_____|@
  18.917 +        @@
  18.918 +201  LATIN CAPITAL LETTER E WITH ACUTE
  18.919 +    __  @
  18.920 +  _/_/_ @
  18.921 + | ____|@
  18.922 + |  _|_ @
  18.923 + |_____|@
  18.924 +        @@
  18.925 +202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  18.926 +   //\  @
  18.927 +  |/_\| @
  18.928 + | ____|@
  18.929 + |  _|_ @
  18.930 + |_____|@
  18.931 +        @@
  18.932 +203  LATIN CAPITAL LETTER E WITH DIAERESIS
  18.933 +  _   _ @
  18.934 + (_)_(_)@
  18.935 + | ____|@
  18.936 + |  _|_ @
  18.937 + |_____|@
  18.938 +        @@
  18.939 +204  LATIN CAPITAL LETTER I WITH GRAVE
  18.940 +  __  @
  18.941 +  \_\ @
  18.942 + |_ _|@
  18.943 +  | | @
  18.944 + |___|@
  18.945 +      @@
  18.946 +205  LATIN CAPITAL LETTER I WITH ACUTE
  18.947 +   __ @
  18.948 +  /_/ @
  18.949 + |_ _|@
  18.950 +  | | @
  18.951 + |___|@
  18.952 +      @@
  18.953 +206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  18.954 +  //\ @
  18.955 + |/_\|@
  18.956 + |_ _|@
  18.957 +  | | @
  18.958 + |___|@
  18.959 +      @@
  18.960 +207  LATIN CAPITAL LETTER I WITH DIAERESIS
  18.961 +  _   _ @
  18.962 + (_)_(_)@
  18.963 +  |_ _| @
  18.964 +   | |  @
  18.965 +  |___| @
  18.966 +        @@
  18.967 +208  LATIN CAPITAL LETTER ETH
  18.968 +    ____  @
  18.969 +   |  _ \ @
  18.970 +  _| |_| |@
  18.971 + |__ __| |@
  18.972 +   |____/ @
  18.973 +          @@
  18.974 +209  LATIN CAPITAL LETTER N WITH TILDE
  18.975 +   /\/|@
  18.976 +  |/\/ @
  18.977 + | \| |@
  18.978 + | .` |@
  18.979 + |_|\_|@
  18.980 +       @@
  18.981 +210  LATIN CAPITAL LETTER O WITH GRAVE
  18.982 +   __   @
  18.983 +   \_\  @
  18.984 +  / _ \ @
  18.985 + | |_| |@
  18.986 +  \___/ @
  18.987 +        @@
  18.988 +211  LATIN CAPITAL LETTER O WITH ACUTE
  18.989 +    __  @
  18.990 +   /_/  @
  18.991 +  / _ \ @
  18.992 + | |_| |@
  18.993 +  \___/ @
  18.994 +        @@
  18.995 +212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  18.996 +   //\  @
  18.997 +  |/_\| @
  18.998 +  / _ \ @
  18.999 + | |_| |@
 18.1000 +  \___/ @
 18.1001 +        @@
 18.1002 +213  LATIN CAPITAL LETTER O WITH TILDE
 18.1003 +   /\/| @
 18.1004 +  |/\/  @
 18.1005 +  / _ \ @
 18.1006 + | |_| |@
 18.1007 +  \___/ @
 18.1008 +        @@
 18.1009 +214  LATIN CAPITAL LETTER O WITH DIAERESIS
 18.1010 +  _   _ @
 18.1011 + (_)_(_)@
 18.1012 +  / _ \ @
 18.1013 + | |_| |@
 18.1014 +  \___/ @
 18.1015 +        @@
 18.1016 +215  MULTIPLICATION SIGN
 18.1017 +     @
 18.1018 +     @
 18.1019 + /\/\@
 18.1020 + >  <@
 18.1021 + \/\/@
 18.1022 +     @@
 18.1023 +216  LATIN CAPITAL LETTER O WITH STROKE
 18.1024 +   ____ @
 18.1025 +  / _// @
 18.1026 + | |// |@
 18.1027 + | //| |@
 18.1028 +  //__/ @
 18.1029 +        @@
 18.1030 +217  LATIN CAPITAL LETTER U WITH GRAVE
 18.1031 +   __   @
 18.1032 +  _\_\_ @
 18.1033 + | | | |@
 18.1034 + | |_| |@
 18.1035 +  \___/ @
 18.1036 +        @@
 18.1037 +218  LATIN CAPITAL LETTER U WITH ACUTE
 18.1038 +    __  @
 18.1039 +  _/_/_ @
 18.1040 + | | | |@
 18.1041 + | |_| |@
 18.1042 +  \___/ @
 18.1043 +        @@
 18.1044 +219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 18.1045 +   //\  @
 18.1046 +  |/ \| @
 18.1047 + | | | |@
 18.1048 + | |_| |@
 18.1049 +  \___/ @
 18.1050 +        @@
 18.1051 +220  LATIN CAPITAL LETTER U WITH DIAERESIS
 18.1052 +  _   _ @
 18.1053 + (_) (_)@
 18.1054 + | | | |@
 18.1055 + | |_| |@
 18.1056 +  \___/ @
 18.1057 +        @@
 18.1058 +221  LATIN CAPITAL LETTER Y WITH ACUTE
 18.1059 +    __  @
 18.1060 + __/_/__@
 18.1061 + \ \ / /@
 18.1062 +  \ V / @
 18.1063 +   |_|  @
 18.1064 +        @@
 18.1065 +222  LATIN CAPITAL LETTER THORN
 18.1066 +  _     @
 18.1067 + | |___ @
 18.1068 + |  __ \@
 18.1069 + |  ___/@
 18.1070 + |_|    @
 18.1071 +        @@
 18.1072 +223  LATIN SMALL LETTER SHARP S
 18.1073 +   ___ @
 18.1074 +  / _ \@
 18.1075 + | |/ /@
 18.1076 + | |\ \@
 18.1077 + | ||_/@
 18.1078 + |_|   @@
 18.1079 +224  LATIN SMALL LETTER A WITH GRAVE
 18.1080 +   __   @
 18.1081 +   \_\_ @
 18.1082 +  / _` |@
 18.1083 + | (_| |@
 18.1084 +  \__,_|@
 18.1085 +        @@
 18.1086 +225  LATIN SMALL LETTER A WITH ACUTE
 18.1087 +    __  @
 18.1088 +   /_/_ @
 18.1089 +  / _` |@
 18.1090 + | (_| |@
 18.1091 +  \__,_|@
 18.1092 +        @@
 18.1093 +226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 18.1094 +   //\  @
 18.1095 +  |/_\| @
 18.1096 +  / _` |@
 18.1097 + | (_| |@
 18.1098 +  \__,_|@
 18.1099 +        @@
 18.1100 +227  LATIN SMALL LETTER A WITH TILDE
 18.1101 +   /\/| @
 18.1102 +  |/\/_ @
 18.1103 +  / _` |@
 18.1104 + | (_| |@
 18.1105 +  \__,_|@
 18.1106 +        @@
 18.1107 +228  LATIN SMALL LETTER A WITH DIAERESIS
 18.1108 +  _   _ @
 18.1109 + (_)_(_)@
 18.1110 +  / _` |@
 18.1111 + | (_| |@
 18.1112 +  \__,_|@
 18.1113 +        @@
 18.1114 +229  LATIN SMALL LETTER A WITH RING ABOVE
 18.1115 +    __  @
 18.1116 +   (()) @
 18.1117 +  / _ '|@
 18.1118 + | (_| |@
 18.1119 +  \__,_|@
 18.1120 +        @@
 18.1121 +230  LATIN SMALL LETTER AE
 18.1122 +           @
 18.1123 +   __ ____ @
 18.1124 +  / _`  _ \@
 18.1125 + | (_|  __/@
 18.1126 +  \__,____|@
 18.1127 +           @@
 18.1128 +231  LATIN SMALL LETTER C WITH CEDILLA
 18.1129 +       @
 18.1130 +   ___ @
 18.1131 +  / __|@
 18.1132 + | (__ @
 18.1133 +  \___|@
 18.1134 +   )_) @@
 18.1135 +232  LATIN SMALL LETTER E WITH GRAVE
 18.1136 +   __  @
 18.1137 +   \_\ @
 18.1138 +  / _ \@
 18.1139 + |  __/@
 18.1140 +  \___|@
 18.1141 +       @@
 18.1142 +233  LATIN SMALL LETTER E WITH ACUTE
 18.1143 +    __ @
 18.1144 +   /_/ @
 18.1145 +  / _ \@
 18.1146 + |  __/@
 18.1147 +  \___|@
 18.1148 +       @@
 18.1149 +234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 18.1150 +   //\ @
 18.1151 +  |/_\|@
 18.1152 +  / _ \@
 18.1153 + |  __/@
 18.1154 +  \___|@
 18.1155 +       @@
 18.1156 +235  LATIN SMALL LETTER E WITH DIAERESIS
 18.1157 +  _   _ @
 18.1158 + (_)_(_)@
 18.1159 +  / _ \ @
 18.1160 + |  __/ @
 18.1161 +  \___| @
 18.1162 +        @@
 18.1163 +236  LATIN SMALL LETTER I WITH GRAVE
 18.1164 + __ @
 18.1165 + \_\@
 18.1166 + | |@
 18.1167 + | |@
 18.1168 + |_|@
 18.1169 +    @@
 18.1170 +237  LATIN SMALL LETTER I WITH ACUTE
 18.1171 +  __@
 18.1172 + /_/@
 18.1173 + | |@
 18.1174 + | |@
 18.1175 + |_|@
 18.1176 +    @@
 18.1177 +238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 18.1178 +  //\ @
 18.1179 + |/_\|@
 18.1180 +  | | @
 18.1181 +  | | @
 18.1182 +  |_| @
 18.1183 +      @@
 18.1184 +239  LATIN SMALL LETTER I WITH DIAERESIS
 18.1185 +  _   _ @
 18.1186 + (_)_(_)@
 18.1187 +   | |  @
 18.1188 +   | |  @
 18.1189 +   |_|  @
 18.1190 +        @@
 18.1191 +240  LATIN SMALL LETTER ETH
 18.1192 +   /\/\ @
 18.1193 +   >  < @
 18.1194 +  _\/\ |@
 18.1195 + / __` |@
 18.1196 + \____/ @
 18.1197 +        @@
 18.1198 +241  LATIN SMALL LETTER N WITH TILDE
 18.1199 +   /\/| @
 18.1200 +  |/\/  @
 18.1201 + | '_ \ @
 18.1202 + | | | |@
 18.1203 + |_| |_|@
 18.1204 +        @@
 18.1205 +242  LATIN SMALL LETTER O WITH GRAVE
 18.1206 +   __   @
 18.1207 +   \_\  @
 18.1208 +  / _ \ @
 18.1209 + | (_) |@
 18.1210 +  \___/ @
 18.1211 +        @@
 18.1212 +243  LATIN SMALL LETTER O WITH ACUTE
 18.1213 +    __  @
 18.1214 +   /_/  @
 18.1215 +  / _ \ @
 18.1216 + | (_) |@
 18.1217 +  \___/ @
 18.1218 +        @@
 18.1219 +244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 18.1220 +   //\  @
 18.1221 +  |/_\| @
 18.1222 +  / _ \ @
 18.1223 + | (_) |@
 18.1224 +  \___/ @
 18.1225 +        @@
 18.1226 +245  LATIN SMALL LETTER O WITH TILDE
 18.1227 +   /\/| @
 18.1228 +  |/\/  @
 18.1229 +  / _ \ @
 18.1230 + | (_) |@
 18.1231 +  \___/ @
 18.1232 +        @@
 18.1233 +246  LATIN SMALL LETTER O WITH DIAERESIS
 18.1234 +  _   _ @
 18.1235 + (_)_(_)@
 18.1236 +  / _ \ @
 18.1237 + | (_) |@
 18.1238 +  \___/ @
 18.1239 +        @@
 18.1240 +247  DIVISION SIGN
 18.1241 +        @
 18.1242 +    _   @
 18.1243 +  _(_)_ @
 18.1244 + |_____|@
 18.1245 +   (_)  @
 18.1246 +        @@
 18.1247 +248  LATIN SMALL LETTER O WITH STROKE
 18.1248 +         @
 18.1249 +   ____  @
 18.1250 +  / _//\ @
 18.1251 + | (//) |@
 18.1252 +  \//__/ @
 18.1253 +         @@
 18.1254 +249  LATIN SMALL LETTER U WITH GRAVE
 18.1255 +   __   @
 18.1256 +  _\_\_ @
 18.1257 + | | | |@
 18.1258 + | |_| |@
 18.1259 +  \__,_|@
 18.1260 +        @@
 18.1261 +250  LATIN SMALL LETTER U WITH ACUTE
 18.1262 +    __  @
 18.1263 +  _/_/_ @
 18.1264 + | | | |@
 18.1265 + | |_| |@
 18.1266 +  \__,_|@
 18.1267 +        @@
 18.1268 +251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 18.1269 +   //\  @
 18.1270 +  |/ \| @
 18.1271 + | | | |@
 18.1272 + | |_| |@
 18.1273 +  \__,_|@
 18.1274 +        @@
 18.1275 +252  LATIN SMALL LETTER U WITH DIAERESIS
 18.1276 +  _   _ @
 18.1277 + (_) (_)@
 18.1278 + | | | |@
 18.1279 + | |_| |@
 18.1280 +  \__,_|@
 18.1281 +        @@
 18.1282 +253  LATIN SMALL LETTER Y WITH ACUTE
 18.1283 +    __  @
 18.1284 +  _/_/_ @
 18.1285 + | | | |@
 18.1286 + | |_| |@
 18.1287 +  \__, |@
 18.1288 +  |___/ @@
 18.1289 +254  LATIN SMALL LETTER THORN
 18.1290 +  _     @
 18.1291 + | |__  @
 18.1292 + | '_ \ @
 18.1293 + | |_) |@
 18.1294 + | .__/ @
 18.1295 + |_|    @@
 18.1296 +255  LATIN SMALL LETTER Y WITH DIAERESIS
 18.1297 +  _   _ @
 18.1298 + (_) (_)@
 18.1299 + | | | |@
 18.1300 + | |_| |@
 18.1301 +  \__, |@
 18.1302 +  |___/ @@
 18.1303 +0x0100  LATIN CAPITAL LETTER A WITH MACRON
 18.1304 +   ____ @
 18.1305 +  /___/ @
 18.1306 +   /_\  @
 18.1307 +  / _ \ @
 18.1308 + /_/ \_\@
 18.1309 +        @@
 18.1310 +0x0101  LATIN SMALL LETTER A WITH MACRON
 18.1311 +    ___ @
 18.1312 +   /_ _/@
 18.1313 +  / _` |@
 18.1314 + | (_| |@
 18.1315 +  \__,_|@
 18.1316 +        @@
 18.1317 +0x0102  LATIN CAPITAL LETTER A WITH BREVE
 18.1318 +  _   _ @
 18.1319 +  \\_// @
 18.1320 +   /_\  @
 18.1321 +  / _ \ @
 18.1322 + /_/ \_\@
 18.1323 +        @@
 18.1324 +0x0103  LATIN SMALL LETTER A WITH BREVE
 18.1325 +   \_/  @
 18.1326 +   ___  @
 18.1327 +  / _` |@
 18.1328 + | (_| |@
 18.1329 +  \__,_|@
 18.1330 +        @@
 18.1331 +0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 18.1332 +        @
 18.1333 +    _   @
 18.1334 +   /_\  @
 18.1335 +  / _ \ @
 18.1336 + /_/ \_\@
 18.1337 +     (_(@@
 18.1338 +0x0105  LATIN SMALL LETTER A WITH OGONEK
 18.1339 +        @
 18.1340 +   __ _ @
 18.1341 +  / _` |@
 18.1342 + | (_| |@
 18.1343 +  \__,_|@
 18.1344 +     (_(@@
 18.1345 +0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 18.1346 +     __ @
 18.1347 +   _/_/ @
 18.1348 +  / ___|@
 18.1349 + | |___ @
 18.1350 +  \____|@
 18.1351 +        @@
 18.1352 +0x0107  LATIN SMALL LETTER C WITH ACUTE
 18.1353 +    __ @
 18.1354 +   /__/@
 18.1355 +  / __|@
 18.1356 + | (__ @
 18.1357 +  \___|@
 18.1358 +       @@
 18.1359 +0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 18.1360 +     /\ @
 18.1361 +   _//\\@
 18.1362 +  / ___|@
 18.1363 + | |___ @
 18.1364 +  \____|@
 18.1365 +        @@
 18.1366 +0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 18.1367 +    /\ @
 18.1368 +   /_\ @
 18.1369 +  / __|@
 18.1370 + | (__ @
 18.1371 +  \___|@
 18.1372 +       @@
 18.1373 +0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 18.1374 +    []  @
 18.1375 +   ____ @
 18.1376 +  / ___|@
 18.1377 + | |___ @
 18.1378 +  \____|@
 18.1379 +        @@
 18.1380 +0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 18.1381 +   []  @
 18.1382 +   ___ @
 18.1383 +  / __|@
 18.1384 + | (__ @
 18.1385 +  \___|@
 18.1386 +       @@
 18.1387 +0x010C  LATIN CAPITAL LETTER C WITH CARON
 18.1388 +   \\// @
 18.1389 +   _\/_ @
 18.1390 +  / ___|@
 18.1391 + | |___ @
 18.1392 +  \____|@
 18.1393 +        @@
 18.1394 +0x010D  LATIN SMALL LETTER C WITH CARON
 18.1395 +   \\//@
 18.1396 +   _\/ @
 18.1397 +  / __|@
 18.1398 + | (__ @
 18.1399 +  \___|@
 18.1400 +       @@
 18.1401 +0x010E  LATIN CAPITAL LETTER D WITH CARON
 18.1402 +   \\// @
 18.1403 +  __\/  @
 18.1404 + |  _ \ @
 18.1405 + | |_| |@
 18.1406 + |____/ @
 18.1407 +        @@
 18.1408 +0x010F  LATIN SMALL LETTER D WITH CARON
 18.1409 +  \/  _ @
 18.1410 +   __| |@
 18.1411 +  / _` |@
 18.1412 + | (_| |@
 18.1413 +  \__,_|@
 18.1414 +        @@
 18.1415 +0x0110  LATIN CAPITAL LETTER D WITH STROKE
 18.1416 +   ____   @
 18.1417 +  |_ __ \ @
 18.1418 + /| |/ | |@
 18.1419 + /|_|/_| |@
 18.1420 +  |_____/ @
 18.1421 +          @@
 18.1422 +0x0111  LATIN SMALL LETTER D WITH STROKE
 18.1423 +    ---|@
 18.1424 +   __| |@
 18.1425 +  / _` |@
 18.1426 + | (_| |@
 18.1427 +  \__,_|@
 18.1428 +        @@
 18.1429 +0x0112  LATIN CAPITAL LETTER E WITH MACRON
 18.1430 +   ____ @
 18.1431 +  /___/ @
 18.1432 + | ____|@
 18.1433 + |  _|_ @
 18.1434 + |_____|@
 18.1435 +        @@
 18.1436 +0x0113  LATIN SMALL LETTER E WITH MACRON
 18.1437 +    ____@
 18.1438 +   /_ _/@
 18.1439 +  / _ \ @
 18.1440 + |  __/ @
 18.1441 +  \___| @
 18.1442 +        @@
 18.1443 +0x0114  LATIN CAPITAL LETTER E WITH BREVE
 18.1444 +  _   _ @
 18.1445 +  \\_// @
 18.1446 + | ____|@
 18.1447 + |  _|_ @
 18.1448 + |_____|@
 18.1449 +        @@
 18.1450 +0x0115  LATIN SMALL LETTER E WITH BREVE
 18.1451 +  \\  //@
 18.1452 +    --  @
 18.1453 +  / _ \ @
 18.1454 + |  __/ @
 18.1455 +  \___| @
 18.1456 +        @@
 18.1457 +0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 18.1458 +    []  @
 18.1459 +  _____ @
 18.1460 + | ____|@
 18.1461 + |  _|_ @
 18.1462 + |_____|@
 18.1463 +        @@
 18.1464 +0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 18.1465 +    [] @
 18.1466 +    __ @
 18.1467 +  / _ \@
 18.1468 + |  __/@
 18.1469 +  \___|@
 18.1470 +       @@
 18.1471 +0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 18.1472 +        @
 18.1473 +  _____ @
 18.1474 + | ____|@
 18.1475 + |  _|_ @
 18.1476 + |_____|@
 18.1477 +    (__(@@
 18.1478 +0x0119  LATIN SMALL LETTER E WITH OGONEK
 18.1479 +       @
 18.1480 +   ___ @
 18.1481 +  / _ \@
 18.1482 + |  __/@
 18.1483 +  \___|@
 18.1484 +    (_(@@
 18.1485 +0x011A  LATIN CAPITAL LETTER E WITH CARON
 18.1486 +   \\// @
 18.1487 +  __\/_ @
 18.1488 + | ____|@
 18.1489 + |  _|_ @
 18.1490 + |_____|@
 18.1491 +        @@
 18.1492 +0x011B  LATIN SMALL LETTER E WITH CARON
 18.1493 +   \\//@
 18.1494 +    \/ @
 18.1495 +  / _ \@
 18.1496 + |  __/@
 18.1497 +  \___|@
 18.1498 +       @@
 18.1499 +0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 18.1500 +   _/\_ @
 18.1501 +  / ___|@
 18.1502 + | |  _ @
 18.1503 + | |_| |@
 18.1504 +  \____|@
 18.1505 +        @@
 18.1506 +0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 18.1507 +     /\ @
 18.1508 +   _/_ \@
 18.1509 +  / _` |@
 18.1510 + | (_| |@
 18.1511 +  \__, |@
 18.1512 +  |___/ @@
 18.1513 +0x011E  LATIN CAPITAL LETTER G WITH BREVE
 18.1514 +   _\/_ @
 18.1515 +  / ___|@
 18.1516 + | |  _ @
 18.1517 + | |_| |@
 18.1518 +  \____|@
 18.1519 +        @@
 18.1520 +0x011F  LATIN SMALL LETTER G WITH BREVE
 18.1521 +  \___/ @
 18.1522 +   __ _ @
 18.1523 +  / _` |@
 18.1524 + | (_| |@
 18.1525 +  \__, |@
 18.1526 +  |___/ @@
 18.1527 +0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 18.1528 +   _[]_ @
 18.1529 +  / ___|@
 18.1530 + | |  _ @
 18.1531 + | |_| |@
 18.1532 +  \____|@
 18.1533 +        @@
 18.1534 +0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 18.1535 +   []   @
 18.1536 +   __ _ @
 18.1537 +  / _` |@
 18.1538 + | (_| |@
 18.1539 +  \__, |@
 18.1540 +  |___/ @@
 18.1541 +0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 18.1542 +   ____ @
 18.1543 +  / ___|@
 18.1544 + | |  _ @
 18.1545 + | |_| |@
 18.1546 +  \____|@
 18.1547 +   )__) @@
 18.1548 +0x0123  LATIN SMALL LETTER G WITH CEDILLA
 18.1549 +        @
 18.1550 +   __ _ @
 18.1551 +  / _` |@
 18.1552 + | (_| |@
 18.1553 +  \__, |@
 18.1554 +  |_))))@@
 18.1555 +0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 18.1556 +  _/ \_ @
 18.1557 + | / \ |@
 18.1558 + | |_| |@
 18.1559 + |  _  |@
 18.1560 + |_| |_|@
 18.1561 +        @@
 18.1562 +0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 18.1563 +  _  /\ @
 18.1564 + | |//\ @
 18.1565 + | '_ \ @
 18.1566 + | | | |@
 18.1567 + |_| |_|@
 18.1568 +        @@
 18.1569 +0x0126  LATIN CAPITAL LETTER H WITH STROKE
 18.1570 +  _   _ @
 18.1571 + | |=| |@
 18.1572 + | |_| |@
 18.1573 + |  _  |@
 18.1574 + |_| |_|@
 18.1575 +        @@
 18.1576 +0x0127  LATIN SMALL LETTER H WITH STROKE
 18.1577 +  _     @
 18.1578 + |=|__  @
 18.1579 + | '_ \ @
 18.1580 + | | | |@
 18.1581 + |_| |_|@
 18.1582 +        @@
 18.1583 +0x0128  LATIN CAPITAL LETTER I WITH TILDE
 18.1584 +  /\//@
 18.1585 + |_ _|@
 18.1586 +  | | @
 18.1587 +  | | @
 18.1588 + |___|@
 18.1589 +      @@
 18.1590 +0x0129  LATIN SMALL LETTER I WITH TILDE
 18.1591 +    @
 18.1592 + /\/@
 18.1593 + | |@
 18.1594 + | |@
 18.1595 + |_|@
 18.1596 +    @@
 18.1597 +0x012A  LATIN CAPITAL LETTER I WITH MACRON
 18.1598 + /___/@
 18.1599 + |_ _|@
 18.1600 +  | | @
 18.1601 +  | | @
 18.1602 + |___|@
 18.1603 +      @@
 18.1604 +0x012B  LATIN SMALL LETTER I WITH MACRON
 18.1605 +  ____@
 18.1606 + /___/@
 18.1607 +  | | @
 18.1608 +  | | @
 18.1609 +  |_| @
 18.1610 +      @@
 18.1611 +0x012C  LATIN CAPITAL LETTER I WITH BREVE
 18.1612 +  \__/@
 18.1613 + |_ _|@
 18.1614 +  | | @
 18.1615 +  | | @
 18.1616 + |___|@
 18.1617 +      @@
 18.1618 +0x012D  LATIN SMALL LETTER I WITH BREVE
 18.1619 +    @
 18.1620 + \_/@
 18.1621 + | |@
 18.1622 + | |@
 18.1623 + |_|@
 18.1624 +    @@
 18.1625 +0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 18.1626 +  ___ @
 18.1627 + |_ _|@
 18.1628 +  | | @
 18.1629 +  | | @
 18.1630 + |___|@
 18.1631 +  (__(@@
 18.1632 +0x012F  LATIN SMALL LETTER I WITH OGONEK
 18.1633 +  _  @
 18.1634 + (_) @
 18.1635 + | | @
 18.1636 + | | @
 18.1637 + |_|_@
 18.1638 +  (_(@@
 18.1639 +0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 18.1640 +  _[] @
 18.1641 + |_ _|@
 18.1642 +  | | @
 18.1643 +  | | @
 18.1644 + |___|@
 18.1645 +      @@
 18.1646 +0x0131  LATIN SMALL LETTER DOTLESS I
 18.1647 +    @
 18.1648 +  _ @
 18.1649 + | |@
 18.1650 + | |@
 18.1651 + |_|@
 18.1652 +    @@
 18.1653 +0x0132  LATIN CAPITAL LIGATURE IJ
 18.1654 +  ___  _ @
 18.1655 + |_ _|| |@
 18.1656 +  | | | |@
 18.1657 +  | |_| |@
 18.1658 + |__|__/ @
 18.1659 +         @@
 18.1660 +0x0133  LATIN SMALL LIGATURE IJ
 18.1661 +  _   _ @
 18.1662 + (_) (_)@
 18.1663 + | | | |@
 18.1664 + | | | |@
 18.1665 + |_|_/ |@
 18.1666 +   |__/ @@
 18.1667 +0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 18.1668 +      /\ @
 18.1669 +     /_\|@
 18.1670 +  _  | | @
 18.1671 + | |_| | @
 18.1672 +  \___/  @
 18.1673 +         @@
 18.1674 +0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 18.1675 +    /\@
 18.1676 +   /_\@
 18.1677 +   | |@
 18.1678 +   | |@
 18.1679 +  _/ |@
 18.1680 + |__/ @@
 18.1681 +0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 18.1682 +  _  _  @
 18.1683 + | |/ / @
 18.1684 + | ' /  @
 18.1685 + | . \  @
 18.1686 + |_|\_\ @
 18.1687 +    )__)@@
 18.1688 +0x0137  LATIN SMALL LETTER K WITH CEDILLA
 18.1689 +  _    @
 18.1690 + | | __@
 18.1691 + | |/ /@
 18.1692 + |   < @
 18.1693 + |_|\_\@
 18.1694 +    )_)@@
 18.1695 +0x0138  LATIN SMALL LETTER KRA
 18.1696 +       @
 18.1697 +  _ __ @
 18.1698 + | |/ \@
 18.1699 + |   < @
 18.1700 + |_|\_\@
 18.1701 +       @@
 18.1702 +0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 18.1703 +  _   //@
 18.1704 + | | // @
 18.1705 + | |    @
 18.1706 + | |___ @
 18.1707 + |_____|@
 18.1708 +        @@
 18.1709 +0x013A  LATIN SMALL LETTER L WITH ACUTE
 18.1710 +  //@
 18.1711 + | |@
 18.1712 + | |@
 18.1713 + | |@
 18.1714 + |_|@
 18.1715 +    @@
 18.1716 +0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 18.1717 +  _     @
 18.1718 + | |    @
 18.1719 + | |    @
 18.1720 + | |___ @
 18.1721 + |_____|@
 18.1722 +    )__)@@
 18.1723 +0x013C  LATIN SMALL LETTER L WITH CEDILLA
 18.1724 +  _   @
 18.1725 + | |  @
 18.1726 + | |  @
 18.1727 + | |  @
 18.1728 + |_|  @
 18.1729 +   )_)@@
 18.1730 +0x013D  LATIN CAPITAL LETTER L WITH CARON
 18.1731 +  _ \\//@
 18.1732 + | | \/ @
 18.1733 + | |    @
 18.1734 + | |___ @
 18.1735 + |_____|@
 18.1736 +        @@
 18.1737 +0x013E  LATIN SMALL LETTER L WITH CARON
 18.1738 +  _ \\//@
 18.1739 + | | \/ @
 18.1740 + | |    @
 18.1741 + | |    @
 18.1742 + |_|    @
 18.1743 +        @@
 18.1744 +0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 18.1745 +  _     @
 18.1746 + | |    @
 18.1747 + | | [] @
 18.1748 + | |___ @
 18.1749 + |_____|@
 18.1750 +        @@
 18.1751 +0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 18.1752 +  _    @
 18.1753 + | |   @
 18.1754 + | | []@
 18.1755 + | |   @
 18.1756 + |_|   @
 18.1757 +       @@
 18.1758 +0x0141  LATIN CAPITAL LETTER L WITH STROKE
 18.1759 +  __    @
 18.1760 + | //   @
 18.1761 + |//|   @
 18.1762 + // |__ @
 18.1763 + |_____|@
 18.1764 +        @@
 18.1765 +0x0142  LATIN SMALL LETTER L WITH STROKE
 18.1766 +  _ @
 18.1767 + | |@
 18.1768 + |//@
 18.1769 + //|@
 18.1770 + |_|@
 18.1771 +    @@
 18.1772 +0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 18.1773 +  _/ /_ @
 18.1774 + | \ | |@
 18.1775 + |  \| |@
 18.1776 + | |\  |@
 18.1777 + |_| \_|@
 18.1778 +        @@
 18.1779 +0x0144  LATIN SMALL LETTER N WITH ACUTE
 18.1780 +     _  @
 18.1781 +  _ /_/ @
 18.1782 + | '_ \ @
 18.1783 + | | | |@
 18.1784 + |_| |_|@
 18.1785 +        @@
 18.1786 +0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 18.1787 +  _   _ @
 18.1788 + | \ | |@
 18.1789 + |  \| |@
 18.1790 + | |\  |@
 18.1791 + |_| \_|@
 18.1792 + )_)    @@
 18.1793 +0x0146  LATIN SMALL LETTER N WITH CEDILLA
 18.1794 +        @
 18.1795 +  _ __  @
 18.1796 + | '_ \ @
 18.1797 + | | | |@
 18.1798 + |_| |_|@
 18.1799 + )_)    @@
 18.1800 +0x0147  LATIN CAPITAL LETTER N WITH CARON
 18.1801 +  _\/ _ @
 18.1802 + | \ | |@
 18.1803 + |  \| |@
 18.1804 + | |\  |@
 18.1805 + |_| \_|@
 18.1806 +        @@
 18.1807 +0x0148  LATIN SMALL LETTER N WITH CARON
 18.1808 +  \\//  @
 18.1809 +  _\/_  @
 18.1810 + | '_ \ @
 18.1811 + | | | |@
 18.1812 + |_| |_|@
 18.1813 +        @@
 18.1814 +0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 18.1815 +          @
 18.1816 +  _  __   @
 18.1817 + ( )| '_\ @
 18.1818 + |/| | | |@
 18.1819 +   |_| |_|@
 18.1820 +          @@
 18.1821 +0x014A  LATIN CAPITAL LETTER ENG
 18.1822 +  _   _ @
 18.1823 + | \ | |@
 18.1824 + |  \| |@
 18.1825 + | |\  |@
 18.1826 + |_| \ |@
 18.1827 +     )_)@@
 18.1828 +0x014B  LATIN SMALL LETTER ENG
 18.1829 +  _ __  @
 18.1830 + | '_ \ @
 18.1831 + | | | |@
 18.1832 + |_| | |@
 18.1833 +     | |@
 18.1834 +    |__ @@
 18.1835 +0x014C  LATIN CAPITAL LETTER O WITH MACRON
 18.1836 +   ____ @
 18.1837 +  /_ _/ @
 18.1838 +  / _ \ @
 18.1839 + | (_) |@
 18.1840 +  \___/ @
 18.1841 +        @@
 18.1842 +0x014D  LATIN SMALL LETTER O WITH MACRON
 18.1843 +   ____ @
 18.1844 +  /_ _/ @
 18.1845 +  / _ \ @
 18.1846 + | (_) |@
 18.1847 +  \___/ @
 18.1848 +        @@
 18.1849 +0x014E  LATIN CAPITAL LETTER O WITH BREVE
 18.1850 +  \   / @
 18.1851 +   _-_  @
 18.1852 +  / _ \ @
 18.1853 + | |_| |@
 18.1854 +  \___/ @
 18.1855 +        @@
 18.1856 +0x014F  LATIN SMALL LETTER O WITH BREVE
 18.1857 +  \   / @
 18.1858 +   _-_  @
 18.1859 +  / _ \ @
 18.1860 + | |_| |@
 18.1861 +  \___/ @
 18.1862 +        @@
 18.1863 +0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 18.1864 +    ___ @
 18.1865 +   /_/_/@
 18.1866 +  / _ \ @
 18.1867 + | |_| |@
 18.1868 +  \___/ @
 18.1869 +        @@
 18.1870 +0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 18.1871 +    ___ @
 18.1872 +   /_/_/@
 18.1873 +  / _ \ @
 18.1874 + | |_| |@
 18.1875 +  \___/ @
 18.1876 +        @@
 18.1877 +0x0152  LATIN CAPITAL LIGATURE OE
 18.1878 +   ___  ___ @
 18.1879 +  / _ \| __|@
 18.1880 + | | | |  | @
 18.1881 + | |_| | |__@
 18.1882 +  \___/|____@
 18.1883 +            @@
 18.1884 +0x0153  LATIN SMALL LIGATURE OE
 18.1885 +             @
 18.1886 +   ___   ___ @
 18.1887 +  / _ \ / _ \@
 18.1888 + | (_) |  __/@
 18.1889 +  \___/ \___|@
 18.1890 +             @@
 18.1891 +0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 18.1892 +  _/_/  @
 18.1893 + |  _ \ @
 18.1894 + | |_) |@
 18.1895 + |  _ < @
 18.1896 + |_| \_\@
 18.1897 +        @@
 18.1898 +0x0155  LATIN SMALL LETTER R WITH ACUTE
 18.1899 +     __@
 18.1900 +  _ /_/@
 18.1901 + | '__|@
 18.1902 + | |   @
 18.1903 + |_|   @
 18.1904 +       @@
 18.1905 +0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 18.1906 +  ____  @
 18.1907 + |  _ \ @
 18.1908 + | |_) |@
 18.1909 + |  _ < @
 18.1910 + |_| \_\@
 18.1911 + )_)    @@
 18.1912 +0x0157  LATIN SMALL LETTER R WITH CEDILLA
 18.1913 +       @
 18.1914 +  _ __ @
 18.1915 + | '__|@
 18.1916 + | |   @
 18.1917 + |_|   @
 18.1918 +   )_) @@
 18.1919 +0x0158  LATIN CAPITAL LETTER R WITH CARON
 18.1920 +  _\_/  @
 18.1921 + |  _ \ @
 18.1922 + | |_) |@
 18.1923 + |  _ < @
 18.1924 + |_| \_\@
 18.1925 +        @@
 18.1926 +0x0159  LATIN SMALL LETTER R WITH CARON
 18.1927 +  \\// @
 18.1928 +  _\/_ @
 18.1929 + | '__|@
 18.1930 + | |   @
 18.1931 + |_|   @
 18.1932 +       @@
 18.1933 +0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 18.1934 +  _/_/  @
 18.1935 + / ___| @
 18.1936 + \___ \ @
 18.1937 +  ___) |@
 18.1938 + |____/ @
 18.1939 +        @@
 18.1940 +0x015B  LATIN SMALL LETTER S WITH ACUTE
 18.1941 +    __@
 18.1942 +  _/_/@
 18.1943 + / __|@
 18.1944 + \__ \@
 18.1945 + |___/@
 18.1946 +      @@
 18.1947 +0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 18.1948 +  _/\_  @
 18.1949 + / ___| @
 18.1950 + \___ \ @
 18.1951 +  ___) |@
 18.1952 + |____/ @
 18.1953 +        @@
 18.1954 +0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 18.1955 +      @
 18.1956 +  /_\_@
 18.1957 + / __|@
 18.1958 + \__ \@
 18.1959 + |___/@
 18.1960 +      @@
 18.1961 +0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 18.1962 +  ____  @
 18.1963 + / ___| @
 18.1964 + \___ \ @
 18.1965 +  ___) |@
 18.1966 + |____/ @
 18.1967 +    )__)@@
 18.1968 +0x015F  LATIN SMALL LETTER S WITH CEDILLA
 18.1969 +      @
 18.1970 +  ___ @
 18.1971 + / __|@
 18.1972 + \__ \@
 18.1973 + |___/@
 18.1974 +   )_)@@
 18.1975 +0x0160  LATIN CAPITAL LETTER S WITH CARON
 18.1976 +  _\_/  @
 18.1977 + / ___| @
 18.1978 + \___ \ @
 18.1979 +  ___) |@
 18.1980 + |____/ @
 18.1981 +        @@
 18.1982 +0x0161  LATIN SMALL LETTER S WITH CARON
 18.1983 +  \\//@
 18.1984 +  _\/ @
 18.1985 + / __|@
 18.1986 + \__ \@
 18.1987 + |___/@
 18.1988 +      @@
 18.1989 +0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 18.1990 +  _____ @
 18.1991 + |_   _|@
 18.1992 +   | |  @
 18.1993 +   | |  @
 18.1994 +   |_|  @
 18.1995 +    )__)@@
 18.1996 +0x0163  LATIN SMALL LETTER T WITH CEDILLA
 18.1997 +  _   @
 18.1998 + | |_ @
 18.1999 + | __|@
 18.2000 + | |_ @
 18.2001 +  \__|@
 18.2002 +   )_)@@
 18.2003 +0x0164  LATIN CAPITAL LETTER T WITH CARON
 18.2004 +  _____ @
 18.2005 + |_   _|@
 18.2006 +   | |  @
 18.2007 +   | |  @
 18.2008 +   |_|  @
 18.2009 +        @@
 18.2010 +0x0165  LATIN SMALL LETTER T WITH CARON
 18.2011 +  \/  @
 18.2012 + | |_ @
 18.2013 + | __|@
 18.2014 + | |_ @
 18.2015 +  \__|@
 18.2016 +      @@
 18.2017 +0x0166  LATIN CAPITAL LETTER T WITH STROKE
 18.2018 +  _____ @
 18.2019 + |_   _|@
 18.2020 +   | |  @
 18.2021 +  -|-|- @
 18.2022 +   |_|  @
 18.2023 +        @@
 18.2024 +0x0167  LATIN SMALL LETTER T WITH STROKE
 18.2025 +  _   @
 18.2026 + | |_ @
 18.2027 + | __|@
 18.2028 + |-|_ @
 18.2029 +  \__|@
 18.2030 +      @@
 18.2031 +0x0168  LATIN CAPITAL LETTER U WITH TILDE
 18.2032 +        @
 18.2033 +  _/\/_ @
 18.2034 + | | | |@
 18.2035 + | |_| |@
 18.2036 +  \___/ @
 18.2037 +        @@
 18.2038 +0x0169  LATIN SMALL LETTER U WITH TILDE
 18.2039 +        @
 18.2040 +  _/\/_ @
 18.2041 + | | | |@
 18.2042 + | |_| |@
 18.2043 +  \__,_|@
 18.2044 +        @@
 18.2045 +0x016A  LATIN CAPITAL LETTER U WITH MACRON
 18.2046 +   ____ @
 18.2047 +  /__ _/@
 18.2048 + | | | |@
 18.2049 + | |_| |@
 18.2050 +  \___/ @
 18.2051 +        @@
 18.2052 +0x016B  LATIN SMALL LETTER U WITH MACRON
 18.2053 +   ____ @
 18.2054 +  / _  /@
 18.2055 + | | | |@
 18.2056 + | |_| |@
 18.2057 +  \__,_|@
 18.2058 +        @@
 18.2059 +0x016C  LATIN CAPITAL LETTER U WITH BREVE
 18.2060 +        @
 18.2061 +   \_/_ @
 18.2062 + | | | |@
 18.2063 + | |_| |@
 18.2064 +  \____|@
 18.2065 +        @@
 18.2066 +0x016D  LATIN SMALL LETTER U WITH BREVE
 18.2067 +        @
 18.2068 +   \_/_ @
 18.2069 + | | | |@
 18.2070 + | |_| |@
 18.2071 +  \__,_|@
 18.2072 +        @@
 18.2073 +0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 18.2074 +    O   @
 18.2075 +  __  _ @
 18.2076 + | | | |@
 18.2077 + | |_| |@
 18.2078 +  \___/ @
 18.2079 +        @@
 18.2080 +0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 18.2081 +    O   @
 18.2082 +  __ __ @
 18.2083 + | | | |@
 18.2084 + | |_| |@
 18.2085 +  \__,_|@
 18.2086 +        @@
 18.2087 +0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 18.2088 +   -- --@
 18.2089 +  /_//_/@
 18.2090 + | | | |@
 18.2091 + | |_| |@
 18.2092 +  \___/ @
 18.2093 +        @@
 18.2094 +0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 18.2095 +    ____@
 18.2096 +  _/_/_/@
 18.2097 + | | | |@
 18.2098 + | |_| |@
 18.2099 +  \__,_|@
 18.2100 +        @@
 18.2101 +0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 18.2102 +  _   _ @
 18.2103 + | | | |@
 18.2104 + | | | |@
 18.2105 + | |_| |@
 18.2106 +  \___/ @
 18.2107 +    (__(@@
 18.2108 +0x0173  LATIN SMALL LETTER U WITH OGONEK
 18.2109 +        @
 18.2110 +  _   _ @
 18.2111 + | | | |@
 18.2112 + | |_| |@
 18.2113 +  \__,_|@
 18.2114 +     (_(@@
 18.2115 +0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 18.2116 + __    /\  __@
 18.2117 + \ \  //\\/ /@
 18.2118 +  \ \ /\ / / @
 18.2119 +   \ V  V /  @
 18.2120 +    \_/\_/   @
 18.2121 +             @@
 18.2122 +0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 18.2123 +      /\   @
 18.2124 + __  //\\__@
 18.2125 + \ \ /\ / /@
 18.2126 +  \ V  V / @
 18.2127 +   \_/\_/  @
 18.2128 +           @@
 18.2129 +0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 18.2130 +    /\  @
 18.2131 + __//\\ @
 18.2132 + \ \ / /@
 18.2133 +  \ V / @
 18.2134 +   |_|  @
 18.2135 +        @@
 18.2136 +0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 18.2137 +    /\  @
 18.2138 +   //\\ @
 18.2139 + | | | |@
 18.2140 + | |_| |@
 18.2141 +  \__, |@
 18.2142 +  |___/ @@
 18.2143 +0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 18.2144 +  []  []@
 18.2145 + __    _@
 18.2146 + \ \ / /@
 18.2147 +  \ V / @
 18.2148 +   |_|  @
 18.2149 +        @@
 18.2150 +0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 18.2151 +  __/_/@
 18.2152 + |__  /@
 18.2153 +   / / @
 18.2154 +  / /_ @
 18.2155 + /____|@
 18.2156 +       @@
 18.2157 +0x017A  LATIN SMALL LETTER Z WITH ACUTE
 18.2158 +    _ @
 18.2159 +  _/_/@
 18.2160 + |_  /@
 18.2161 +  / / @
 18.2162 + /___|@
 18.2163 +      @@
 18.2164 +0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 18.2165 +  __[]_@
 18.2166 + |__  /@
 18.2167 +   / / @
 18.2168 +  / /_ @
 18.2169 + /____|@
 18.2170 +       @@
 18.2171 +0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 18.2172 +   [] @
 18.2173 +  ____@
 18.2174 + |_  /@
 18.2175 +  / / @
 18.2176 + /___|@
 18.2177 +      @@
 18.2178 +0x017D  LATIN CAPITAL LETTER Z WITH CARON
 18.2179 +  _\_/_@
 18.2180 + |__  /@
 18.2181 +   / / @
 18.2182 +  / /_ @
 18.2183 + /____|@
 18.2184 +       @@
 18.2185 +0x017E  LATIN SMALL LETTER Z WITH CARON
 18.2186 +  \\//@
 18.2187 +  _\/_@
 18.2188 + |_  /@
 18.2189 +  / / @
 18.2190 + /___|@
 18.2191 +      @@
 18.2192 +0x017F  LATIN SMALL LETTER LONG S
 18.2193 +     __ @
 18.2194 +    / _|@
 18.2195 + |-| |  @
 18.2196 + |-| |  @
 18.2197 +   |_|  @
 18.2198 +        @@
 18.2199 +0x02C7  CARON
 18.2200 + \\//@
 18.2201 +  \/ @
 18.2202 +    $@
 18.2203 +    $@
 18.2204 +    $@
 18.2205 +    $@@
 18.2206 +0x02D8  BREVE
 18.2207 + \\_//@
 18.2208 +  \_/ @
 18.2209 +     $@
 18.2210 +     $@
 18.2211 +     $@
 18.2212 +     $@@
 18.2213 +0x02D9  DOT ABOVE
 18.2214 + []@
 18.2215 +  $@
 18.2216 +  $@
 18.2217 +  $@
 18.2218 +  $@
 18.2219 +  $@@
 18.2220 +0x02DB  OGONEK
 18.2221 +    $@
 18.2222 +    $@
 18.2223 +    $@
 18.2224 +    $@
 18.2225 +    $@
 18.2226 + )_) @@
 18.2227 +0x02DD  DOUBLE ACUTE ACCENT
 18.2228 +  _ _ @
 18.2229 + /_/_/@
 18.2230 +     $@
 18.2231 +     $@
 18.2232 +     $@
 18.2233 +     $@@
    19.1 --- a/xen/include/asm-x86/msr.h	Fri Jul 09 18:28:03 2004 +0000
    19.2 +++ b/xen/include/asm-x86/msr.h	Mon Jul 12 12:58:48 2004 +0000
    19.3 @@ -71,8 +71,8 @@
    19.4  #define _EFER_NX 11  /* No execute enable */
    19.5  
    19.6  #define EFER_SCE (1<<_EFER_SCE)
    19.7 -#define EFER_LME (1<<EFER_LME)
    19.8 -#define EFER_LMA (1<<EFER_LMA)
    19.9 +#define EFER_LME (1<<_EFER_LME)
   19.10 +#define EFER_LMA (1<<_EFER_LMA)
   19.11  #define EFER_NX (1<<_EFER_NX)
   19.12  
   19.13  /* Intel MSRs. Some also available on other CPUs */
    20.1 --- a/xen/include/xen/multiboot.h	Fri Jul 09 18:28:03 2004 +0000
    20.2 +++ b/xen/include/xen/multiboot.h	Mon Jul 12 12:58:48 2004 +0000
    20.3 @@ -18,69 +18,59 @@
    20.4  #ifndef __MULTIBOOT_H__
    20.5  #define __MULTIBOOT_H__
    20.6  
    20.7 -#ifndef __ELF__
    20.8 -#error "Build on a 32-bit ELF system"
    20.9 -#endif
   20.10 -
   20.11  /* The magic number passed by a Multiboot-compliant boot loader. */
   20.12 -#define MULTIBOOT_BOOTLOADER_MAGIC	0x2BADB002
   20.13 +#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
   20.14  
   20.15  /* The symbol table for a.out.  */
   20.16 -typedef struct
   20.17 -{
   20.18 -  unsigned long tabsize;
   20.19 -  unsigned long strsize;
   20.20 -  unsigned long addr;
   20.21 -  unsigned long reserved;
   20.22 +typedef struct {
   20.23 +    u32 tabsize;
   20.24 +    u32 strsize;
   20.25 +    u32 addr;
   20.26 +    u32 reserved;
   20.27  } aout_symbol_table_t;
   20.28  
   20.29  /* The section header table for ELF.  */
   20.30 -typedef struct
   20.31 -{
   20.32 -  unsigned long num;
   20.33 -  unsigned long size;
   20.34 -  unsigned long addr;
   20.35 -  unsigned long shndx;
   20.36 +typedef struct {
   20.37 +    u32 num;
   20.38 +    u32 size;
   20.39 +    u32 addr;
   20.40 +    u32 shndx;
   20.41  } elf_section_header_table_t;
   20.42  
   20.43  /* The Multiboot information.  */
   20.44 -typedef struct
   20.45 -{
   20.46 -  unsigned long flags;
   20.47 -  unsigned long mem_lower;
   20.48 -  unsigned long mem_upper;
   20.49 -  unsigned long boot_device;
   20.50 -  unsigned long cmdline;
   20.51 -  unsigned long mods_count;
   20.52 -  unsigned long mods_addr;
   20.53 -  union
   20.54 -  {
   20.55 -    aout_symbol_table_t aout_sym;
   20.56 -    elf_section_header_table_t elf_sec;
   20.57 -  } u;
   20.58 -  unsigned long mmap_length;
   20.59 -  unsigned long mmap_addr;
   20.60 +typedef struct {
   20.61 +    u32 flags;
   20.62 +    u32 mem_lower;
   20.63 +    u32 mem_upper;
   20.64 +    u32 boot_device;
   20.65 +    u32 cmdline;
   20.66 +    u32 mods_count;
   20.67 +    u32 mods_addr;
   20.68 +    union {
   20.69 +        aout_symbol_table_t aout_sym;
   20.70 +        elf_section_header_table_t elf_sec;
   20.71 +    } u;
   20.72 +    u32 mmap_length;
   20.73 +    u32 mmap_addr;
   20.74  } multiboot_info_t;
   20.75  
   20.76  /* The module structure.  */
   20.77 -typedef struct
   20.78 -{
   20.79 -  unsigned long mod_start;
   20.80 -  unsigned long mod_end;
   20.81 -  unsigned long string;
   20.82 -  unsigned long reserved;
   20.83 +typedef struct {
   20.84 +    u32 mod_start;
   20.85 +    u32 mod_end;
   20.86 +    u32 string;
   20.87 +    u32 reserved;
   20.88  } module_t;
   20.89  
   20.90  /* The memory map. Be careful that the offset 0 is base_addr_low
   20.91     but no size.  */
   20.92 -typedef struct
   20.93 -{
   20.94 -  unsigned long size;
   20.95 -  unsigned long base_addr_low;
   20.96 -  unsigned long base_addr_high;
   20.97 -  unsigned long length_low;
   20.98 -  unsigned long length_high;
   20.99 -  unsigned long type;
  20.100 +typedef struct {
  20.101 +    u32 size;
  20.102 +    u32 base_addr_low;
  20.103 +    u32 base_addr_high;
  20.104 +    u32 length_low;
  20.105 +    u32 length_high;
  20.106 +    u32 type;
  20.107  } memory_map_t;
  20.108  
  20.109  #endif /* __MULTIBOOT_H__ */
    21.1 --- a/xen/tools/Makefile	Fri Jul 09 18:28:03 2004 +0000
    21.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.3 @@ -1,14 +0,0 @@
    21.4 -
    21.5 -all: figlet elf-reloc
    21.6 -
    21.7 -figlet:
    21.8 -	$(MAKE) -C figlet
    21.9 -
   21.10 -elf-reloc: elf-reloc.c
   21.11 -	gcc -O2 -Wall -o $@ $<
   21.12 -
   21.13 -clean:
   21.14 -	rm -f elf-reloc *~ core
   21.15 -	$(MAKE) -C figlet clean
   21.16 -
   21.17 -.PHONY: figlet
    22.1 --- a/xen/tools/elf-reloc.c	Fri Jul 09 18:28:03 2004 +0000
    22.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.3 @@ -1,115 +0,0 @@
    22.4 -/******************************************************************************
    22.5 - * elf-reloc.c
    22.6 - * 
    22.7 - * Usage: elf-reloc <old base> <new base> <image>
    22.8 - * 
    22.9 - * Relocates <image> from <old base> address to <new base> address by
   22.10 - * frobbing the Elf headers. Segment contents are unmodified.
   22.11 - */
   22.12 -
   22.13 -#include <stdio.h>
   22.14 -#include <stdlib.h>
   22.15 -#include <string.h>
   22.16 -
   22.17 -typedef unsigned long  Elf32_Addr;
   22.18 -typedef unsigned short Elf32_Half;
   22.19 -typedef unsigned long  Elf32_Off;
   22.20 -typedef unsigned long  Elf32_Word;
   22.21 -
   22.22 -typedef struct {
   22.23 -    unsigned char e_ident[16];
   22.24 -    Elf32_Half    e_type;
   22.25 -    Elf32_Half    e_machine;
   22.26 -    Elf32_Word    e_version;
   22.27 -    Elf32_Addr    e_entry;
   22.28 -    Elf32_Off     e_phoff;
   22.29 -    Elf32_Off     e_shoff;
   22.30 -    Elf32_Word    e_flags;
   22.31 -    Elf32_Half    e_ehsize;
   22.32 -    Elf32_Half    e_phentsize;
   22.33 -    Elf32_Half    e_phnum;
   22.34 -    Elf32_Half    e_shentsize;
   22.35 -    Elf32_Half    e_shnum;
   22.36 -    Elf32_Half    e_shstrndx;
   22.37 -} Elf32_Ehdr;
   22.38 -
   22.39 -typedef struct {
   22.40 -    Elf32_Word    p_type;
   22.41 -    Elf32_Off     p_offset;
   22.42 -    Elf32_Addr    p_vaddr;
   22.43 -    Elf32_Addr    p_paddr;
   22.44 -    Elf32_Word    p_filesz;
   22.45 -    Elf32_Word    p_memsz;
   22.46 -    Elf32_Word    p_flags;
   22.47 -    Elf32_Word    p_align;
   22.48 -} Elf32_Phdr;
   22.49 -
   22.50 -#define offsetof(_f,_p) ((unsigned long)&(((_p *)0)->_f))
   22.51 -
   22.52 -
   22.53 -/* Add @reloc_distance to address at offset @off in file @fp. */
   22.54 -void reloc(FILE *fp, long off, unsigned long reloc_distance)
   22.55 -{
   22.56 -    unsigned long base;
   22.57 -    fseek(fp, off, SEEK_SET);
   22.58 -    fread(&base, sizeof(base), 1, fp);
   22.59 -    base += reloc_distance;
   22.60 -    fseek(fp, off, SEEK_SET);
   22.61 -    fwrite(&base, sizeof(base), 1, fp);
   22.62 -
   22.63 -}
   22.64 -
   22.65 -
   22.66 -int main(int argc, char **argv)
   22.67 -{
   22.68 -    unsigned long old_base, new_base, reloc_distance;
   22.69 -    long virt_section, phys_section;
   22.70 -    char *image_name;
   22.71 -    FILE *fp;
   22.72 -    Elf32_Off phoff;
   22.73 -    Elf32_Half phnum, phentsz;
   22.74 -    int i;
   22.75 -
   22.76 -    if ( argc != 4 )
   22.77 -    {
   22.78 -        fprintf(stderr, "Usage: elf-reloc <old base> <new base> <image>\n");
   22.79 -        return(1);
   22.80 -    }
   22.81 -
   22.82 -    old_base = strtoul(argv[1], NULL, 16);
   22.83 -    new_base = strtoul(argv[2], NULL, 16);
   22.84 -    image_name = argv[3];
   22.85 -
   22.86 -    fp = fopen(image_name, "rb+");
   22.87 -    if ( !fp )
   22.88 -    {
   22.89 -        fprintf(stderr, "Failed to load image!\n");
   22.90 -        return(1);
   22.91 -    }
   22.92 -
   22.93 -    reloc_distance = new_base - old_base;
   22.94 -
   22.95 -    /* First frob the entry address. */
   22.96 -    reloc(fp, offsetof(e_entry, Elf32_Ehdr), reloc_distance);
   22.97 -
   22.98 -    fseek(fp, offsetof(e_phoff, Elf32_Ehdr), SEEK_SET);
   22.99 -    fread(&phoff, sizeof(phoff), 1, fp);
  22.100 -    fseek(fp, offsetof(e_phnum, Elf32_Ehdr), SEEK_SET);
  22.101 -    fread(&phnum, sizeof(phnum), 1, fp);
  22.102 -    fseek(fp, offsetof(e_phentsize, Elf32_Ehdr), SEEK_SET);
  22.103 -    fread(&phentsz, sizeof(phentsz), 1, fp);
  22.104 -
  22.105 -    virt_section = (long)phoff + offsetof(p_vaddr, Elf32_Phdr);
  22.106 -    phys_section = (long)phoff + offsetof(p_paddr, Elf32_Phdr);
  22.107 -    for ( i = 0; i < phnum; i++ )
  22.108 -    {
  22.109 -        reloc(fp, phys_section, reloc_distance);
  22.110 -        reloc(fp, virt_section, reloc_distance);
  22.111 -        phys_section += phentsz;
  22.112 -        virt_section += phentsz;
  22.113 -    }
  22.114 -
  22.115 -    fclose(fp);
  22.116 -
  22.117 -    return(0);
  22.118 -}
    23.1 --- a/xen/tools/figlet/LICENSE	Fri Jul 09 18:28:03 2004 +0000
    23.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.3 @@ -1,111 +0,0 @@
    23.4 -http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
    23.5 -
    23.6 -			 The "Artistic License"
    23.7 -
    23.8 -				Preamble
    23.9 -
   23.10 -The intent of this document is to state the conditions under which a
   23.11 -Package may be copied, such that the Copyright Holder maintains some
   23.12 -semblance of artistic control over the development of the package,
   23.13 -while giving the users of the package the right to use and distribute
   23.14 -the Package in a more-or-less customary fashion, plus the right to make
   23.15 -reasonable modifications.
   23.16 -
   23.17 -Definitions:
   23.18 -
   23.19 -	"Package" refers to the collection of files distributed by the
   23.20 -	Copyright Holder, and derivatives of that collection of files
   23.21 -	created through textual modification.
   23.22 -
   23.23 -	"Standard Version" refers to such a Package if it has not been
   23.24 -	modified, or has been modified in accordance with the wishes
   23.25 -	of the Copyright Holder.
   23.26 -
   23.27 -	"Copyright Holder" is whoever is named in the copyright or
   23.28 -	copyrights for the package.
   23.29 -
   23.30 -	"You" is you, if you're thinking about copying or distributing
   23.31 -	this Package.
   23.32 -
   23.33 -	"Reasonable copying fee" is whatever you can justify on the
   23.34 -	basis of media cost, duplication charges, time of people involved,
   23.35 -	and so on.  (You will not be required to justify it to the
   23.36 -	Copyright Holder, but only to the computing community at large
   23.37 -	as a market that must bear the fee.)
   23.38 -
   23.39 -	"Freely Available" means that no fee is charged for the item
   23.40 -	itself, though there may be fees involved in handling the item.
   23.41 -	It also means that recipients of the item may redistribute it
   23.42 -	under the same conditions they received it.
   23.43 -
   23.44 -1. You may make and give away verbatim copies of the source form of the
   23.45 -Standard Version of this Package without restriction, provided that you
   23.46 -duplicate all of the original copyright notices and associated disclaimers.
   23.47 -
   23.48 -2. You may apply bug fixes, portability fixes and other modifications
   23.49 -derived from the Public Domain or from the Copyright Holder.  A Package
   23.50 -modified in such a way shall still be considered the Standard Version.
   23.51 -
   23.52 -3. You may otherwise modify your copy of this Package in any way, provided
   23.53 -that you insert a prominent notice in each changed file stating how and
   23.54 -when you changed that file, and provided that you do at least ONE of the
   23.55 -following:
   23.56 -
   23.57 -    a) place your modifications in the Public Domain or otherwise make them
   23.58 -    Freely Available, such as by posting said modifications to Usenet or
   23.59 -    an equivalent medium, or placing the modifications on a major archive
   23.60 -    site such as ftp.uu.net, or by allowing the Copyright Holder to include
   23.61 -    your modifications in the Standard Version of the Package.
   23.62 -
   23.63 -    b) use the modified Package only within your corporation or organization.
   23.64 -
   23.65 -    c) rename any non-standard executables so the names do not conflict
   23.66 -    with standard executables, which must also be provided, and provide
   23.67 -    a separate manual page for each non-standard executable that clearly
   23.68 -    documents how it differs from the Standard Version.
   23.69 -
   23.70 -    d) make other distribution arrangements with the Copyright Holder.
   23.71 -
   23.72 -4. You may distribute the programs of this Package in object code or
   23.73 -executable form, provided that you do at least ONE of the following:
   23.74 -
   23.75 -    a) distribute a Standard Version of the executables and library files,
   23.76 -    together with instructions (in the manual page or equivalent) on where
   23.77 -    to get the Standard Version.
   23.78 -
   23.79 -    b) accompany the distribution with the machine-readable source of
   23.80 -    the Package with your modifications.
   23.81 -
   23.82 -    c) accompany any non-standard executables with their corresponding
   23.83 -    Standard Version executables, giving the non-standard executables
   23.84 -    non-standard names, and clearly documenting the differences in manual
   23.85 -    pages (or equivalent), together with instructions on where to get
   23.86 -    the Standard Version.
   23.87 -
   23.88 -    d) make other distribution arrangements with the Copyright Holder.
   23.89 -
   23.90 -5. You may charge a reasonable copying fee for any distribution of this
   23.91 -Package.  You may charge any fee you choose for support of this Package.
   23.92 -You may not charge a fee for this Package itself.  However,
   23.93 -you may distribute this Package in aggregate with other (possibly
   23.94 -commercial) programs as part of a larger (possibly commercial) software
   23.95 -distribution provided that you do not advertise this Package as a
   23.96 -product of your own.
   23.97 -
   23.98 -6. The scripts and library files supplied as input to or produced as
   23.99 -output from the programs of this Package do not automatically fall
  23.100 -under the copyright of this Package, but belong to whomever generated
  23.101 -them, and may be sold commercially, and may be aggregated with this
  23.102 -Package.
  23.103 -
  23.104 -7. C or perl subroutines supplied by you and linked into this Package
  23.105 -shall not be considered part of this Package.
  23.106 -
  23.107 -8. The name of the Copyright Holder may not be used to endorse or promote
  23.108 -products derived from this software without specific prior written permission.
  23.109 -
  23.110 -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  23.111 -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  23.112 -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23.113 -
  23.114 -				The End
    24.1 --- a/xen/tools/figlet/Makefile	Fri Jul 09 18:28:03 2004 +0000
    24.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.3 @@ -1,8 +0,0 @@
    24.4 -
    24.5 -CC := gcc
    24.6 -
    24.7 -figlet: figlet.c
    24.8 -	$(CC) -o $@ $<
    24.9 -
   24.10 -clean:
   24.11 -	rm -f *.o figlet
    25.1 --- a/xen/tools/figlet/README	Fri Jul 09 18:28:03 2004 +0000
    25.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.3 @@ -1,9 +0,0 @@
    25.4 -
    25.5 -NB. This is a very hacked version of Figlet 2.2.1. 
    25.6 -
    25.7 -Don't use this outside the Xen build system. A proper version of Figlet
    25.8 -can be had from <http://www.figlet.org>.
    25.9 -
   25.10 -The distribution license is intact in the LICENSE file.
   25.11 -
   25.12 - -- Keir Fraser (2/5/2003)
    26.1 --- a/xen/tools/figlet/figlet.c	Fri Jul 09 18:28:03 2004 +0000
    26.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.3 @@ -1,2075 +0,0 @@
    26.4 -
    26.5 -/*
    26.6 - * XXXXXXXXXXXXXXXXXXXXXXXXXXX
    26.7 - * 
    26.8 - * This is a HACKED figlet source file for Xen.
    26.9 - * 
   26.10 - * Hacked to output C octal strings for inclusion in a header file.
   26.11 - * Support for opening zipped files is removed.
   26.12 - * 
   26.13 - * Go to www.figlet.org for the unhacked Figlet sources.
   26.14 - */
   26.15 -
   26.16 -/****************************************************************************
   26.17 -
   26.18 -  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
   26.19 -  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
   26.20 -  FIGlet Copyright 2002 Christiaan Keet
   26.21 -  Portions written by Paul Burton and Christiaan Keet
   26.22 -  Internet: <info@figlet.org>
   26.23 -  FIGlet, along with the various FIGlet fonts and documentation, is
   26.24 -    copyrighted under the provisions of the Artistic License (as listed
   26.25 -    in the file "Artistic-license.txt" which is included in this package.
   26.26 -****************************************************************************/
   26.27 -
   26.28 -#define DATE "13 July 2002"
   26.29 -#define VERSION "2.2.1"
   26.30 -#define VERSION_INT 20201
   26.31 -
   26.32 -/* FIGlet (Frank, Ian & Glenn's Letters) */
   26.33 -/* by Glenn Chappell */
   26.34 -/* Apr 1991 */
   26.35 -/* Automatic file addition by Ian Chai May 1991 */
   26.36 -/* Punctuation and numbers addition by Ian Chai Jan 1993 */
   26.37 -/* Full ASCII by Glenn Chappell Feb 1993 */
   26.38 -/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
   26.39 -/* Hard blanks by Glenn Chappell Apr 1993 */
   26.40 -/* Release 2.0 5 Aug 1993 */
   26.41 -/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
   26.42 -/* Control files by Glenn Chappell Feb 1994 */
   26.43 -/* Release 2.1 12 Aug 1994 */
   26.44 -/* Release 2.1.1 25 Aug 1994 */
   26.45 -/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
   26.46 -   option.  Sept 8, 1996 */
   26.47 -/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
   26.48 -   mapping tables, kerning/smushing options. */
   26.49 -/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
   26.50 -   FAQs and comments. 13 July 2002. The new official FIGlet website is 
   26.51 -   http://www.figlet.org/  */
   26.52 -
   26.53 -#define DEFAULTFONTDIR "."
   26.54 -#define DEFAULTFONTFILE "xen.flf"
   26.55 -
   26.56 -#include <stdio.h>
   26.57 -#ifdef __STDC__
   26.58 -#include <stdlib.h>
   26.59 -#endif
   26.60 -#include <string.h>
   26.61 -#include <ctype.h>
   26.62 -#include <fcntl.h>     /* Needed for get_columns */
   26.63 -
   26.64 -#ifdef unix
   26.65 -#include <sys/ioctl.h> /* Needed for get_columns */
   26.66 -#endif
   26.67 -
   26.68 -
   26.69 -#define ZFILE FILE
   26.70 -#define Zopen fopen
   26.71 -#define Zgetc fgetc
   26.72 -#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
   26.73 -#define Zclose fclose
   26.74 -
   26.75 -#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
   26.76 -
   26.77 -#define DIRSEP '/'
   26.78 -#define DIRSEP2 '\\'
   26.79 -/* Leave alone for Unix and MS-DOS/Windows!
   26.80 -Note: '/' also used in filename in get_columns(). */
   26.81 -
   26.82 -#define FONTFILESUFFIX ".flf"
   26.83 -#define FONTFILEMAGICNUMBER "flf2"
   26.84 -#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
   26.85 -#define CONTROLFILESUFFIX ".flc"
   26.86 -#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
   26.87 -#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
   26.88 -#define DEFAULTCOLUMNS 80
   26.89 -
   26.90 -
   26.91 -/****************************************************************************
   26.92 -
   26.93 -  Globals dealing with chars that are read
   26.94 -
   26.95 -****************************************************************************/
   26.96 -
   26.97 -typedef long inchr; /* "char" read from stdin */
   26.98 -
   26.99 -inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
  26.100 -                   /* Note: not null-terminated. */
  26.101 -int inchrlinelen,inchrlinelenlimit;
  26.102 -inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
  26.103 -  /* Latin-1 codes for German letters, respectively:
  26.104 -     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
  26.105 -     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
  26.106 -     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
  26.107 -     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
  26.108 -     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
  26.109 -     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
  26.110 -     LATIN SMALL LETTER SHARP S = ess-zed
  26.111 -  */
  26.112 -
  26.113 -int hzmode;  /* true if reading double-bytes in HZ mode */
  26.114 -int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
  26.115 -inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
  26.116 -int gl; /* 0-3 specifies left-half Gn character set */
  26.117 -int gr; /* 0-3 specifies right-half Gn character set */
  26.118 -
  26.119 -int Myargc;  /* to avoid passing around argc and argv */
  26.120 -char **Myargv;
  26.121 -
  26.122 -/****************************************************************************
  26.123 -
  26.124 -  Globals dealing with chars that are written
  26.125 -
  26.126 -****************************************************************************/
  26.127 -
  26.128 -typedef struct fc {
  26.129 -  inchr ord;
  26.130 -  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  26.131 -  struct fc *next;
  26.132 -  } fcharnode;
  26.133 -
  26.134 -fcharnode *fcharlist;
  26.135 -char **currchar;
  26.136 -int currcharwidth;
  26.137 -int previouscharwidth;
  26.138 -char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
  26.139 -int outlinelen;
  26.140 -
  26.141 -
  26.142 -/****************************************************************************
  26.143 -
  26.144 -  Globals dealing with command file storage
  26.145 -
  26.146 -****************************************************************************/
  26.147 -
  26.148 -typedef struct cfn {
  26.149 -  char *thename;
  26.150 -  struct cfn *next;
  26.151 -  } cfnamenode;
  26.152 -
  26.153 -cfnamenode *cfilelist,**cfilelistend;
  26.154 -
  26.155 -typedef struct cm {
  26.156 -  int thecommand;
  26.157 -  inchr rangelo;
  26.158 -  inchr rangehi;
  26.159 -  inchr offset;
  26.160 -  struct cm *next;
  26.161 -  } comnode;
  26.162 -
  26.163 -comnode *commandlist,**commandlistend;
  26.164 -
  26.165 -/****************************************************************************
  26.166 -
  26.167 -  Globals affected by command line options
  26.168 -
  26.169 -****************************************************************************/
  26.170 -
  26.171 -int deutschflag,justification,paragraphflag,right2left,multibyte;
  26.172 -int cmdinput;
  26.173 -
  26.174 -#define SM_SMUSH 128
  26.175 -#define SM_KERN 64
  26.176 -#define SM_EQUAL 1
  26.177 -#define SM_LOWLINE 2
  26.178 -#define SM_HIERARCHY 4
  26.179 -#define SM_PAIR 8
  26.180 -#define SM_BIGX 16
  26.181 -#define SM_HARDBLANK 32
  26.182 -
  26.183 -int smushmode;
  26.184 -
  26.185 -#define SMO_NO 0     /* no command-line smushmode */
  26.186 -#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
  26.187 -#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
  26.188 -
  26.189 -int smushoverride;
  26.190 -
  26.191 -int outputwidth;
  26.192 -int outlinelenlimit;
  26.193 -char *fontdirname,*fontname;
  26.194 -
  26.195 -
  26.196 -/****************************************************************************
  26.197 -
  26.198 -  Globals read from font file
  26.199 -
  26.200 -****************************************************************************/
  26.201 -
  26.202 -char hardblank;
  26.203 -int charheight;
  26.204 -
  26.205 -
  26.206 -/****************************************************************************
  26.207 -
  26.208 -  Name of program, used in error messages
  26.209 -
  26.210 -****************************************************************************/
  26.211 -
  26.212 -char *myname;
  26.213 -
  26.214 -
  26.215 -#ifdef TIOCGWINSZ
  26.216 -/****************************************************************************
  26.217 -
  26.218 -  get_columns
  26.219 -
  26.220 -  Determines the number of columns of /dev/tty.  Returns the number of
  26.221 -  columns, or -1 if error.  May return 0 if columns unknown.
  26.222 -  Requires include files <fcntl.h> and <sys/ioctl.h>.
  26.223 -  by Glenn Chappell & Ian Chai 14 Apr 1993
  26.224 -
  26.225 -****************************************************************************/
  26.226 -
  26.227 -int get_columns()
  26.228 -{
  26.229 -  struct winsize ws;
  26.230 -  int fd,result;
  26.231 -
  26.232 -  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
  26.233 -  result = ioctl(fd,TIOCGWINSZ,&ws);
  26.234 -  close(fd);
  26.235 -  return result?-1:ws.ws_col;
  26.236 -}
  26.237 -#endif /* ifdef TIOCGWINSZ */
  26.238 -
  26.239 -
  26.240 -/****************************************************************************
  26.241 -
  26.242 -  myalloc
  26.243 -
  26.244 -  Calls malloc.  If malloc returns error, prints error message and
  26.245 -  quits.
  26.246 -
  26.247 -****************************************************************************/
  26.248 -
  26.249 -#ifdef __STDC__
  26.250 -char *myalloc(size_t size)
  26.251 -#else
  26.252 -char *myalloc(size)
  26.253 -int size;
  26.254 -#endif
  26.255 -{
  26.256 -  char *ptr;
  26.257 -#ifndef __STDC__
  26.258 -  extern void *malloc();
  26.259 -#endif
  26.260 -
  26.261 -  if ((ptr = (char*)malloc(size))==NULL) {
  26.262 -    fprintf(stderr,"%s: Out of memory\n",myname);
  26.263 -    exit(1);
  26.264 -    }
  26.265 -  else {
  26.266 -    return ptr;
  26.267 -    }
  26.268 -}
  26.269 -
  26.270 -
  26.271 -/****************************************************************************
  26.272 -
  26.273 -  hasdirsep
  26.274 -
  26.275 -  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
  26.276 -
  26.277 -****************************************************************************/
  26.278 -
  26.279 -int hasdirsep(s1)
  26.280 -char *s1;
  26.281 -{
  26.282 -  if (strchr(s1, DIRSEP)) return 1;
  26.283 -  else if (strchr(s1, DIRSEP2)) return 1;
  26.284 -  else return 0;
  26.285 -}
  26.286 -
  26.287 -/****************************************************************************
  26.288 -
  26.289 -  suffixcmp
  26.290 -
  26.291 -  Returns true if s2 is a suffix of s1; uses case-blind comparison.
  26.292 -
  26.293 -****************************************************************************/
  26.294 -
  26.295 -int suffixcmp(s1, s2)
  26.296 -char *s1;
  26.297 -char *s2;
  26.298 -{
  26.299 -  int len1, len2;
  26.300 -
  26.301 -  len1 = MYSTRLEN(s1);
  26.302 -  len2 = MYSTRLEN(s2);
  26.303 -  if (len2 > len1) return 0;
  26.304 -  s1 += len1 - len2;
  26.305 -  while (*s1) {
  26.306 -    if (tolower(*s1) != tolower(*s2)) return 0;
  26.307 -    s1++;
  26.308 -    s2++;
  26.309 -    }
  26.310 -  return 1;
  26.311 -}
  26.312 -   
  26.313 -/****************************************************************************
  26.314 -
  26.315 -  skiptoeol
  26.316 -
  26.317 -  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
  26.318 -
  26.319 -****************************************************************************/
  26.320 -
  26.321 -void skiptoeol(fp)
  26.322 -ZFILE *fp;
  26.323 -{
  26.324 -  int dummy;
  26.325 -
  26.326 -  while (dummy=Zgetc(fp),dummy!=EOF) {
  26.327 -    if (dummy == '\n') return;
  26.328 -    if (dummy == '\r') {
  26.329 -      dummy = Zgetc(fp);
  26.330 -      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
  26.331 -      return;
  26.332 -      }
  26.333 -  }
  26.334 -}
  26.335 -
  26.336 -
  26.337 -/****************************************************************************
  26.338 -
  26.339 -  myfgets
  26.340 -
  26.341 -  Local version of fgets.  Handles \r, \n, and \r\n terminators.
  26.342 -
  26.343 -****************************************************************************/
  26.344 -
  26.345 -char *myfgets(line,maxlen,fp)
  26.346 -char *line;
  26.347 -int maxlen;
  26.348 -ZFILE *fp;
  26.349 -{
  26.350 -  int c = 0;
  26.351 -  char *p;
  26.352 -
  26.353 -  p = line;
  26.354 -  while((c=Zgetc(fp))!=EOF&&maxlen) {
  26.355 -    *p++ = c;
  26.356 -    maxlen--;
  26.357 -    if (c=='\n') break;
  26.358 -    if (c=='\r') {
  26.359 -      c = Zgetc(fp);
  26.360 -      if (c != EOF && c != '\n') Zungetc(c,fp);
  26.361 -      *(p-1) = '\n';
  26.362 -      break;
  26.363 -      }
  26.364 -    }
  26.365 -  *p = 0;
  26.366 -  return (c==EOF) ? NULL : line;
  26.367 -}
  26.368 -
  26.369 -/****************************************************************************
  26.370 -
  26.371 -  usageerr
  26.372 -
  26.373 -  Prints "Usage: ...." line to the given stream.
  26.374 -
  26.375 -****************************************************************************/
  26.376 -
  26.377 -void printusage(out)
  26.378 -FILE *out;
  26.379 -{
  26.380 -  fprintf(out,
  26.381 -    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
  26.382 -    myname);
  26.383 -  fprintf(out,
  26.384 -    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
  26.385 -  fprintf(out,
  26.386 -    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
  26.387 -}
  26.388 -
  26.389 -
  26.390 -/****************************************************************************
  26.391 -
  26.392 -  printinfo
  26.393 -
  26.394 -  Prints version and copyright message, or utility information.
  26.395 -
  26.396 -****************************************************************************/
  26.397 -
  26.398 -void printinfo(infonum)
  26.399 -int infonum;
  26.400 -{
  26.401 -  switch (infonum) {
  26.402 -    case 0: /* Copyright message */
  26.403 -      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
  26.404 -      printf("John Cowan, Christiaan Keet\n");
  26.405 -      printf("Internet: <info@figlet.org> ");
  26.406 -      printf("Version: %s, date: %s\n\n",VERSION,DATE);
  26.407 -      printf("FIGlet, along with the various FIGlet fonts");
  26.408 -      printf(" and documentation, may be\n");
  26.409 -      printf("freely copied and distributed.\n\n");
  26.410 -      printf("If you use FIGlet, please send an");
  26.411 -      printf(" e-mail message to <info@figlet.org>.\n\n");
  26.412 -      printf("The latest version of FIGlet is available from the");
  26.413 -      printf(" web site,\n\thttp://www.figlet.org/\n\n");
  26.414 -      printusage(stdout);
  26.415 -      break;
  26.416 -    case 1: /* Version (integer) */
  26.417 -      printf("%d\n",VERSION_INT);
  26.418 -      break;
  26.419 -    case 2: /* Font directory */
  26.420 -      printf("%s\n",fontdirname);
  26.421 -      break;
  26.422 -    case 3: /* Font */
  26.423 -      printf("%s\n",fontname);
  26.424 -      break;
  26.425 -    case 4: /* Outputwidth */
  26.426 -      printf("%d\n",outputwidth);
  26.427 -    }
  26.428 -}
  26.429 -
  26.430 -
  26.431 -/****************************************************************************
  26.432 -
  26.433 -  readmagic
  26.434 -
  26.435 -  Reads a four-character magic string from a stream.
  26.436 -
  26.437 -****************************************************************************/
  26.438 -void readmagic(fp,magic)
  26.439 -ZFILE *fp;
  26.440 -char *magic;
  26.441 -{
  26.442 -  int i;
  26.443 -
  26.444 -  for (i=0;i<4;i++) {
  26.445 -    magic[i] = Zgetc(fp);
  26.446 -    }
  26.447 -  magic[4] = 0;
  26.448 -  }
  26.449 -  
  26.450 -/****************************************************************************
  26.451 -
  26.452 -  skipws
  26.453 -
  26.454 -  Skips whitespace characters from a stream.
  26.455 -
  26.456 -****************************************************************************/
  26.457 -void skipws(fp)
  26.458 -ZFILE *fp;
  26.459 -{
  26.460 -  int c;
  26.461 -  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
  26.462 -  Zungetc(c,fp);
  26.463 -  }
  26.464 -
  26.465 -/****************************************************************************
  26.466 -
  26.467 -  readnum
  26.468 -
  26.469 -  Reads a number from a stream.  Accepts "0" prefix for octal and
  26.470 -  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
  26.471 -
  26.472 -****************************************************************************/
  26.473 -void readnum(fp,nump)
  26.474 -ZFILE *fp;
  26.475 -inchr *nump;
  26.476 -{
  26.477 -  int acc = 0;
  26.478 -  char *p;
  26.479 -  int c;
  26.480 -  int base;
  26.481 -  int sign = 1;
  26.482 -  char digits[] = "0123456789ABCDEF";
  26.483 -
  26.484 -  skipws(fp);
  26.485 -  c = Zgetc(fp);
  26.486 -  if (c=='-') {
  26.487 -    sign = -1;
  26.488 -    }
  26.489 -  else {
  26.490 -    Zungetc(c,fp);
  26.491 -    }
  26.492 -  c = Zgetc(fp);
  26.493 -  if (c=='0') {
  26.494 -     c = Zgetc(fp);
  26.495 -     if (c=='x'||c=='X') {
  26.496 -       base = 16;
  26.497 -       }
  26.498 -     else {
  26.499 -       base = 8;
  26.500 -       Zungetc(c,fp);
  26.501 -       }
  26.502 -    }
  26.503 -  else {
  26.504 -    base = 10;
  26.505 -    Zungetc(c,fp);
  26.506 -    }
  26.507 -
  26.508 -  while((c=Zgetc(fp))!=EOF) {
  26.509 -    c=toupper(c);
  26.510 -    p=strchr(digits,c);
  26.511 -    if (!p) {
  26.512 -      Zungetc(c,fp);
  26.513 -      *nump = acc * sign;
  26.514 -      return;
  26.515 -      }
  26.516 -    acc = acc*base+(p-digits);
  26.517 -    }
  26.518 -  *nump = acc * sign;
  26.519 -  }  
  26.520 -
  26.521 -/****************************************************************************
  26.522 -
  26.523 -  readTchar
  26.524 -
  26.525 -  Reads a control file "T" command character specification.
  26.526 -
  26.527 -  Character is a single byte, an escape sequence, or
  26.528 -  an escaped numeric.
  26.529 -
  26.530 -****************************************************************************/
  26.531 -
  26.532 -inchr readTchar(fp)
  26.533 -ZFILE *fp;
  26.534 -{
  26.535 -  inchr thechar;
  26.536 -  char next;
  26.537 -
  26.538 -  thechar=Zgetc(fp);
  26.539 -  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
  26.540 -    Zungetc(thechar,fp);
  26.541 -    return '\0';
  26.542 -    }
  26.543 -  if (thechar!='\\') return thechar;
  26.544 -  next=Zgetc(fp);
  26.545 -  switch(next) {
  26.546 -    case 'a':
  26.547 -      return 7;
  26.548 -    case 'b':
  26.549 -      return 8;
  26.550 -    case 'e':
  26.551 -      return 27;
  26.552 -    case 'f':
  26.553 -      return 12;
  26.554 -    case 'n':
  26.555 -      return 10;
  26.556 -    case 'r':
  26.557 -      return 13;
  26.558 -    case 't':
  26.559 -      return 9;
  26.560 -    case 'v':
  26.561 -      return 11;
  26.562 -    default:
  26.563 -      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
  26.564 -        Zungetc(next,fp);
  26.565 -        readnum(fp,&thechar);
  26.566 -        return thechar;
  26.567 -        }
  26.568 -      return next;
  26.569 -    }
  26.570 -}
  26.571 -
  26.572 -/****************************************************************************
  26.573 -
  26.574 -  charsetname
  26.575 -
  26.576 -  Get a Tchar representing a charset name, or 0 if none available.
  26.577 -  Called in getcharset().
  26.578 -
  26.579 -****************************************************************************/
  26.580 -
  26.581 -inchr charsetname(fp)
  26.582 -ZFILE *fp;
  26.583 -{
  26.584 -  inchr result;
  26.585 -
  26.586 -  result = readTchar(fp);
  26.587 -  if (result == '\n' || result == '\r') {
  26.588 -    result = 0;
  26.589 -    Zungetc(result,fp);
  26.590 -    }
  26.591 -  return result;
  26.592 -  }
  26.593 -
  26.594 -/****************************************************************************
  26.595 -
  26.596 -  charset
  26.597 -
  26.598 -  Processes "g[0123]" character set specifier
  26.599 -  Called in readcontrol().
  26.600 -
  26.601 -****************************************************************************/
  26.602 -
  26.603 -void charset(n, controlfile)
  26.604 -int n;
  26.605 -ZFILE *controlfile;
  26.606 -{
  26.607 -  int ch;
  26.608 -
  26.609 -  skipws(controlfile);
  26.610 -  if (Zgetc(controlfile) != '9') {
  26.611 -    skiptoeol(controlfile);
  26.612 -    return;
  26.613 -    }
  26.614 -  ch = Zgetc(controlfile);
  26.615 -  if (ch == '6') {
  26.616 -     gn[n] = 65536L * charsetname(controlfile) + 0x80;
  26.617 -     gndbl[n] = 0;
  26.618 -     skiptoeol(controlfile);
  26.619 -     return;
  26.620 -     }
  26.621 -  if (ch != '4') {
  26.622 -    skiptoeol(controlfile);
  26.623 -    return;
  26.624 -    }
  26.625 -  ch = Zgetc(controlfile);
  26.626 -  if (ch == 'x') {
  26.627 -     if (Zgetc(controlfile) != '9') {
  26.628 -       skiptoeol(controlfile);
  26.629 -       return;
  26.630 -       }
  26.631 -     if (Zgetc(controlfile) != '4') {
  26.632 -       skiptoeol(controlfile);
  26.633 -       return;
  26.634 -       }
  26.635 -     skipws(controlfile);
  26.636 -     gn[n] = 65536L * charsetname(controlfile);
  26.637 -     gndbl[n] = 1;
  26.638 -     skiptoeol(controlfile);
  26.639 -     return;
  26.640 -     }
  26.641 -  Zungetc(ch, controlfile);
  26.642 -  skipws(controlfile);
  26.643 -  gn[n] = 65536L * charsetname(controlfile);
  26.644 -  gndbl[n] = 0;
  26.645 -  return;
  26.646 -  }
  26.647 -
  26.648 -/****************************************************************************
  26.649 -
  26.650 -  readcontrol
  26.651 -
  26.652 -  Allocates memory and reads in the given control file.
  26.653 -  Called in readcontrolfiles().
  26.654 -
  26.655 -****************************************************************************/
  26.656 -
  26.657 -void readcontrol(controlname)
  26.658 -char *controlname;
  26.659 -{
  26.660 -  inchr firstch,lastch;
  26.661 -  char dashcheck;
  26.662 -  inchr offset;
  26.663 -  char *controlpath,magicnum[5];
  26.664 -  int command;
  26.665 -  ZFILE *controlfile;
  26.666 -  int namelen;
  26.667 -
  26.668 -  namelen = MYSTRLEN(fontdirname);
  26.669 -  controlpath = (char*)myalloc(sizeof(char)
  26.670 -    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
  26.671 -  controlfile = NULL;
  26.672 -  if (!hasdirsep(controlname)) {
  26.673 -    strcpy(controlpath,fontdirname);
  26.674 -    controlpath[namelen] = DIRSEP;
  26.675 -    controlpath[namelen+1] = '\0';
  26.676 -    strcat(controlpath,controlname);
  26.677 -    strcat(controlpath,CONTROLFILESUFFIX);
  26.678 -    controlfile = Zopen(controlpath,"rb");
  26.679 -    }
  26.680 -  if (controlfile==NULL) {
  26.681 -    strcpy(controlpath,controlname);
  26.682 -    strcat(controlpath,CONTROLFILESUFFIX);
  26.683 -    controlfile = Zopen(controlpath,"rb");
  26.684 -    if (controlfile==NULL) {
  26.685 -      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
  26.686 -        controlpath);
  26.687 -      exit(1);
  26.688 -      }
  26.689 -    }
  26.690 -
  26.691 -  free(controlpath);
  26.692 -
  26.693 -  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  26.694 -  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
  26.695 -  commandlistend = &(*commandlistend)->next;
  26.696 -  (*commandlistend) = NULL;
  26.697 -
  26.698 -  while(command=Zgetc(controlfile),command!=EOF) {
  26.699 -    switch (command) {
  26.700 -      case 't': /* Translate */
  26.701 -        skipws(controlfile);
  26.702 -        firstch=readTchar(controlfile);
  26.703 -        if ((dashcheck=Zgetc(controlfile))=='-') {
  26.704 -          lastch=readTchar(controlfile);
  26.705 -          }
  26.706 -        else {
  26.707 -          Zungetc(dashcheck,controlfile);
  26.708 -          lastch=firstch;
  26.709 -          }
  26.710 -        skipws(controlfile);
  26.711 -        offset=readTchar(controlfile)-firstch;
  26.712 -        skiptoeol(controlfile);
  26.713 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  26.714 -        (*commandlistend)->thecommand = 1;
  26.715 -        (*commandlistend)->rangelo = firstch;
  26.716 -        (*commandlistend)->rangehi = lastch;
  26.717 -        (*commandlistend)->offset = offset;
  26.718 -        commandlistend = &(*commandlistend)->next;
  26.719 -        (*commandlistend) = NULL;
  26.720 -        break;
  26.721 -      case '0': case '1': case '2': case '3': case '4':
  26.722 -      case '5': case '6': case '7': case '8': case '9':
  26.723 -      case '-':
  26.724 -                /* Mapping table entry */
  26.725 -        Zungetc(command,controlfile);
  26.726 -        readnum(controlfile,&firstch);
  26.727 -        skipws(controlfile);
  26.728 -	readnum(controlfile,&lastch);
  26.729 -	offset=lastch-firstch;
  26.730 -        lastch=firstch;
  26.731 -        skiptoeol(controlfile);
  26.732 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  26.733 -        (*commandlistend)->thecommand = 1;
  26.734 -        (*commandlistend)->rangelo = firstch;
  26.735 -        (*commandlistend)->rangehi = lastch;
  26.736 -        (*commandlistend)->offset = offset;
  26.737 -        commandlistend = &(*commandlistend)->next;
  26.738 -        (*commandlistend) = NULL;
  26.739 -        break;
  26.740 -      case 'f': /* freeze */
  26.741 -        skiptoeol(controlfile);
  26.742 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  26.743 -        (*commandlistend)->thecommand = 0;
  26.744 -        commandlistend = &(*commandlistend)->next;
  26.745 -        (*commandlistend) = NULL;
  26.746 -        break;
  26.747 -      case 'b': /* DBCS input mode */
  26.748 -        multibyte = 1;
  26.749 -        break;
  26.750 -      case 'u': /* UTF-8 input mode */
  26.751 -        multibyte = 2;
  26.752 -        break;
  26.753 -      case 'h': /* HZ input mode */
  26.754 -        multibyte = 3;
  26.755 -        break;
  26.756 -      case 'j': /* Shift-JIS input mode */
  26.757 -        multibyte = 4;
  26.758 -        break;
  26.759 -      case 'g': /* ISO 2022 character set choices */
  26.760 -        multibyte = 0;
  26.761 -        skipws(controlfile);
  26.762 -        command=Zgetc(controlfile);
  26.763 -        switch (command) {
  26.764 -          case '0': /* define G0 charset */
  26.765 -            charset(0, controlfile);
  26.766 -            break;
  26.767 -          case '1': /* set G1 charset */
  26.768 -            charset(1, controlfile);
  26.769 -            break;
  26.770 -          case '2': /* set G2 charset */
  26.771 -            charset(2, controlfile);
  26.772 -            break;
  26.773 -          case '3': /* set G3 charset */
  26.774 -            charset(3, controlfile);
  26.775 -            break;
  26.776 -          case 'l': case 'L': /* define left half */
  26.777 -            skipws(controlfile);
  26.778 -            gl = Zgetc(controlfile) - '0';
  26.779 -            skiptoeol(controlfile);
  26.780 -            break;
  26.781 -          case 'r': case 'R': /* define right half */
  26.782 -            skipws(controlfile);
  26.783 -            gr = Zgetc(controlfile) - '0';
  26.784 -            skiptoeol(controlfile);
  26.785 -            break;
  26.786 -          default: /* meaningless "g" command */
  26.787 -            skiptoeol(controlfile);
  26.788 -          }
  26.789 -      case '\r': case '\n': /* blank line */
  26.790 -        break;
  26.791 -      default: /* Includes '#' */
  26.792 -        skiptoeol(controlfile);
  26.793 -      }
  26.794 -    }
  26.795 -  Zclose(controlfile);
  26.796 -}
  26.797 -
  26.798 -
  26.799 -/****************************************************************************
  26.800 -
  26.801 -  readcontrolfiles
  26.802 -
  26.803 -  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
  26.804 -  Called in main().
  26.805 -
  26.806 -****************************************************************************/
  26.807 -
  26.808 -void readcontrolfiles()
  26.809 -{
  26.810 -  cfnamenode *cfnptr;
  26.811 -
  26.812 -  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
  26.813 -    readcontrol(cfnptr->thename);
  26.814 -    }
  26.815 -}
  26.816 -
  26.817 -
  26.818 -/****************************************************************************
  26.819 -
  26.820 -  clearcfilelist
  26.821 -
  26.822 -  Clears the control file list.  Assumes thename does not need freeing.
  26.823 -
  26.824 -****************************************************************************/
  26.825 -
  26.826 -void clearcfilelist()
  26.827 -{
  26.828 -  cfnamenode *cfnptr1,*cfnptr2;
  26.829 -
  26.830 -  cfnptr1 = cfilelist;
  26.831 -  while (cfnptr1 != NULL) {
  26.832 -    cfnptr2 = cfnptr1->next;
  26.833 -    free(cfnptr1);
  26.834 -    cfnptr1 = cfnptr2;
  26.835 -    }
  26.836 -  cfilelist = NULL;
  26.837 -  cfilelistend = &cfilelist;
  26.838 -}
  26.839 -
  26.840 -
  26.841 -/****************************************************************************
  26.842 -
  26.843 -  getparams
  26.844 -
  26.845 -  Handles all command-line parameters.  Puts all parameters within
  26.846 -  bounds.
  26.847 -
  26.848 -****************************************************************************/
  26.849 -
  26.850 -void getparams()
  26.851 -{
  26.852 -  extern char *optarg;
  26.853 -  extern int optind;
  26.854 -  int c; /* "Should" be a char -- need int for "!= -1" test*/
  26.855 -  int columns,firstfont,infoprint;
  26.856 -  char *controlname;
  26.857 -
  26.858 -  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
  26.859 -    myname++;
  26.860 -    }
  26.861 -  else {
  26.862 -    myname = Myargv[0];
  26.863 -    }
  26.864 -  fontdirname = DEFAULTFONTDIR;
  26.865 -  firstfont = 1;
  26.866 -  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
  26.867 -  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
  26.868 -  if (suffixcmp(fontname,FONTFILESUFFIX)) {
  26.869 -    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
  26.870 -    }
  26.871 -  cfilelist = NULL;
  26.872 -  cfilelistend = &cfilelist;
  26.873 -  commandlist = NULL;
  26.874 -  commandlistend = &commandlist;
  26.875 -  smushoverride = SMO_NO;
  26.876 -  deutschflag = 0;
  26.877 -  justification = -1;
  26.878 -  right2left = -1;
  26.879 -  paragraphflag = 0;
  26.880 -  infoprint = -1;
  26.881 -  cmdinput = 0;
  26.882 -  outputwidth = DEFAULTCOLUMNS;
  26.883 -  gn[1] = 0x80;
  26.884 -  gr = 1;
  26.885 -  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
  26.886 -      /* Note: -F is not a legal option -- prints a special err message.  */
  26.887 -    switch (c) {
  26.888 -      case 'A':
  26.889 -        cmdinput = 1;
  26.890 -        break;
  26.891 -      case 'D':
  26.892 -        deutschflag = 1;
  26.893 -        break;
  26.894 -      case 'E':
  26.895 -        deutschflag = 0;
  26.896 -        break;
  26.897 -      case 'X':
  26.898 -        right2left = -1;
  26.899 -        break;
  26.900 -      case 'L':
  26.901 -        right2left = 0;
  26.902 -        break;
  26.903 -      case 'R':
  26.904 -        right2left = 1;
  26.905 -        break;
  26.906 -      case 'x':
  26.907 -        justification = -1;
  26.908 -        break;
  26.909 -      case 'l':
  26.910 -        justification = 0;
  26.911 -        break;
  26.912 -      case 'c':
  26.913 -        justification = 1;
  26.914 -        break;
  26.915 -      case 'r':
  26.916 -        justification = 2;
  26.917 -        break;
  26.918 -      case 'p':
  26.919 -        paragraphflag = 1;
  26.920 -        break;
  26.921 -      case 'n':
  26.922 -        paragraphflag = 0;
  26.923 -        break;
  26.924 -      case 's':
  26.925 -        smushoverride = SMO_NO;
  26.926 -        break;
  26.927 -      case 'k':
  26.928 -        smushmode = SM_KERN;
  26.929 -        smushoverride = SMO_YES;
  26.930 -        break;
  26.931 -      case 'S':
  26.932 -        smushmode = SM_SMUSH;
  26.933 -	smushoverride = SMO_FORCE;
  26.934 -        break;
  26.935 -      case 'o':
  26.936 -        smushmode = SM_SMUSH;
  26.937 -	smushoverride = SMO_YES;
  26.938 -        break;
  26.939 -      case 'W':
  26.940 -        smushmode = 0;
  26.941 -	smushoverride = SMO_YES;
  26.942 -        break;
  26.943 -      case 't':
  26.944 -#ifdef TIOCGWINSZ
  26.945 -        columns = get_columns();
  26.946 -        if (columns>0) {
  26.947 -          outputwidth = columns;
  26.948 -          }
  26.949 -#else /* ifdef TIOCGWINSZ */
  26.950 -        fprintf(stderr,
  26.951 -          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
  26.952 -          myname);
  26.953 -#endif /* ifdef TIOCGWINSZ */
  26.954 -        break;
  26.955 -      case 'v':
  26.956 -        infoprint = 0;
  26.957 -        break;
  26.958 -      case 'I':
  26.959 -        infoprint = atoi(optarg);
  26.960 -        break;
  26.961 -      case 'm':
  26.962 -        smushmode = atoi(optarg);
  26.963 -        if (smushmode < -1) {
  26.964 -          smushoverride = SMO_NO;
  26.965 -          break;
  26.966 -          }
  26.967 -	if (smushmode == 0) smushmode = SM_KERN;
  26.968 -	else if (smushmode == -1) smushmode = 0;
  26.969 -	else smushmode = (smushmode & 63) | SM_SMUSH;
  26.970 -	smushoverride = SMO_YES;
  26.971 -        break;
  26.972 -      case 'w':
  26.973 -        columns = atoi(optarg);
  26.974 -        if (columns>0) {
  26.975 -          outputwidth = columns;
  26.976 -          }
  26.977 -        break;
  26.978 -      case 'd':
  26.979 -        fontdirname = optarg;
  26.980 -        break;
  26.981 -      case 'f':
  26.982 -        if (firstfont) {
  26.983 -          free(fontname);
  26.984 -          firstfont = 0;
  26.985 -          }
  26.986 -        fontname = optarg;
  26.987 -        if (suffixcmp(fontname,FONTFILESUFFIX)) {
  26.988 -          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
  26.989 -          }
  26.990 -        break;
  26.991 -      case 'C':
  26.992 -        controlname = optarg;
  26.993 -        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
  26.994 -          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
  26.995 -          }
  26.996 -        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
  26.997 -        (*cfilelistend)->thename = controlname;
  26.998 -        cfilelistend = &(*cfilelistend)->next;
  26.999 -        (*cfilelistend) = NULL;
 26.1000 -        break;
 26.1001 -      case 'N':
 26.1002 -        clearcfilelist();
 26.1003 -        multibyte = 0;
 26.1004 -        gn[0] = 0;
 26.1005 -        gn[1] = 0x80;
 26.1006 -        gn[2] = gn[3] = 0;
 26.1007 -        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
 26.1008 -        gl = 0;
 26.1009 -        gr = 1;
 26.1010 -        break;
 26.1011 -      case 'F': /* Not a legal option */
 26.1012 -        fprintf(stderr,"%s: illegal option -- F\n",myname);
 26.1013 -        printusage(stderr);
 26.1014 -        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
 26.1015 -        fprintf(stderr," \"-F\" option has been\n");
 26.1016 -        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
 26.1017 -        fprintf(stderr," program, which is now\n");
 26.1018 -        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
 26.1019 -        fprintf(stderr," is also available\n");
 26.1020 -        fprintf(stderr,"from  http://www.figlet.org/");
 26.1021 -        fprintf(stderr,"under UNIX utilities.\n");
 26.1022 -        exit(1);
 26.1023 -        break;
 26.1024 -      default:
 26.1025 -        printusage(stderr);
 26.1026 -        exit(1);
 26.1027 -      }
 26.1028 -    }
 26.1029 -  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
 26.1030 -  outlinelenlimit = outputwidth-1;
 26.1031 -  if (infoprint>=0) {
 26.1032 -    printinfo(infoprint);
 26.1033 -    exit(0);
 26.1034 -    }
 26.1035 -}
 26.1036 -
 26.1037 -
 26.1038 -/****************************************************************************
 26.1039 -
 26.1040 -  clearline
 26.1041 -
 26.1042 -  Clears both the input (inchrline) and output (outputline) storage.
 26.1043 -
 26.1044 -****************************************************************************/
 26.1045 -
 26.1046 -void clearline()
 26.1047 -{
 26.1048 -  int i;
 26.1049 -
 26.1050 -  for (i=0;i<charheight;i++) {
 26.1051 -    outputline[i][0] = '\0';
 26.1052 -    }
 26.1053 -  outlinelen = 0;
 26.1054 -  inchrlinelen = 0;
 26.1055 -}
 26.1056 -
 26.1057 -
 26.1058 -/****************************************************************************
 26.1059 -
 26.1060 -  readfontchar
 26.1061 -
 26.1062 -  Reads a font character from the font file, and places it in a
 26.1063 -  newly-allocated entry in the list.
 26.1064 -
 26.1065 -****************************************************************************/
 26.1066 -
 26.1067 -void readfontchar(file,theord,line,maxlen)
 26.1068 -ZFILE *file;
 26.1069 -inchr theord;
 26.1070 -char *line;
 26.1071 -int maxlen;
 26.1072 -{
 26.1073 -  int row,k;
 26.1074 -  char endchar;
 26.1075 -  fcharnode *fclsave;
 26.1076 -
 26.1077 -  fclsave = fcharlist;
 26.1078 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 26.1079 -  fcharlist->ord = theord;
 26.1080 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 26.1081 -  fcharlist->next = fclsave;
 26.1082 -  for (row=0;row<charheight;row++) {
 26.1083 -    if (myfgets(line,maxlen+1,file)==NULL) {
 26.1084 -      line[0] = '\0';
 26.1085 -      }
 26.1086 -    k = MYSTRLEN(line)-1;
 26.1087 -    while (k>=0 && isspace(line[k])) {
 26.1088 -      k--;
 26.1089 -      }
 26.1090 -    if (k>=0) {
 26.1091 -      endchar = line[k];
 26.1092 -      while (k>=0 ? line[k]==endchar : 0) {
 26.1093 -        k--;
 26.1094 -        }
 26.1095 -      }
 26.1096 -    line[k+1] = '\0';
 26.1097 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
 26.1098 -    strcpy(fcharlist->thechar[row],line);
 26.1099 -    }
 26.1100 -}
 26.1101 -
 26.1102 -
 26.1103 -/****************************************************************************
 26.1104 -
 26.1105 -  readfont
 26.1106 -
 26.1107 -  Allocates memory, initializes variables, and reads in the font.
 26.1108 -  Called near beginning of main().
 26.1109 -
 26.1110 -****************************************************************************/
 26.1111 -
 26.1112 -void readfont()
 26.1113 -{
 26.1114 -#define MAXFIRSTLINELEN 1000
 26.1115 -  int i,row,numsread;
 26.1116 -  inchr theord;
 26.1117 -  int maxlen,cmtlines,ffright2left;
 26.1118 -  int smush,smush2;
 26.1119 -  char *fontpath,*fileline,magicnum[5];
 26.1120 -  ZFILE *fontfile;
 26.1121 -  int namelen;
 26.1122 -
 26.1123 -  namelen = MYSTRLEN(fontdirname);
 26.1124 -  fontpath = (char*)myalloc(sizeof(char)
 26.1125 -    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
 26.1126 -  fontfile = NULL;
 26.1127 -  if (!hasdirsep(fontname)) {
 26.1128 -    strcpy(fontpath,fontdirname);
 26.1129 -    fontpath[namelen] = DIRSEP;
 26.1130 -    fontpath[namelen+1] = '\0';
 26.1131 -    strcat(fontpath,fontname);
 26.1132 -    strcat(fontpath,FONTFILESUFFIX);
 26.1133 -    fontfile = Zopen(fontpath,"rb");
 26.1134 -    }
 26.1135 -  if (fontfile==NULL) {
 26.1136 -    strcpy(fontpath,fontname);
 26.1137 -    strcat(fontpath,FONTFILESUFFIX);
 26.1138 -    fontfile = Zopen(fontpath,"rb");
 26.1139 -    if (fontfile==NULL) {
 26.1140 -      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
 26.1141 -      exit(1);
 26.1142 -      }
 26.1143 -    }
 26.1144 -
 26.1145 -  readmagic(fontfile,magicnum);
 26.1146 -  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
 26.1147 -  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
 26.1148 -    fileline[0] = '\0';
 26.1149 -    }
 26.1150 -  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
 26.1151 -    skiptoeol(fontfile);
 26.1152 -    }
 26.1153 -  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
 26.1154 -    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
 26.1155 -    &ffright2left,&smush2);
 26.1156 -  free(fileline);
 26.1157 -  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
 26.1158 -    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
 26.1159 -    exit(1);
 26.1160 -    }
 26.1161 -  for (i=1;i<=cmtlines;i++) {
 26.1162 -    skiptoeol(fontfile);
 26.1163 -    }
 26.1164 -  free(fontpath);
 26.1165 -
 26.1166 -  if (numsread<6) {
 26.1167 -    ffright2left = 0;
 26.1168 -    }
 26.1169 -
 26.1170 -  if (numsread<7) { /* if no smush2, decode smush into smush2 */
 26.1171 -    if (smush == 0) smush2 = SM_KERN;
 26.1172 -    else if (smush < 0) smush2 = 0;
 26.1173 -    else smush2 = (smush & 31) | SM_SMUSH;
 26.1174 -    }
 26.1175 -
 26.1176 -  if (charheight<1) {
 26.1177 -    charheight = 1;
 26.1178 -    }
 26.1179 -
 26.1180 -  if (maxlen<1) {
 26.1181 -    maxlen = 1;
 26.1182 -    }
 26.1183 -
 26.1184 -  maxlen += 100; /* Give ourselves some extra room */
 26.1185 -
 26.1186 -  if (smushoverride == SMO_NO)
 26.1187 -     smushmode = smush2;
 26.1188 -  else if (smushoverride == SMO_FORCE)
 26.1189 -     smushmode |= smush2;
 26.1190 -
 26.1191 -  if (right2left<0) {
 26.1192 -    right2left = ffright2left;
 26.1193 -    }
 26.1194 -
 26.1195 -  if (justification<0) {
 26.1196 -    justification = 2*right2left;
 26.1197 -    }
 26.1198 -
 26.1199 -  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
 26.1200 -  /* Allocate "missing" character */
 26.1201 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 26.1202 -  fcharlist->ord = 0;
 26.1203 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 26.1204 -  fcharlist->next = NULL;
 26.1205 -  for (row=0;row<charheight;row++) {
 26.1206 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
 26.1207 -    fcharlist->thechar[row][0] = '\0';
 26.1208 -    }
 26.1209 -  for (theord=' ';theord<='~';theord++) {
 26.1210 -    readfontchar(fontfile,theord,fileline,maxlen);
 26.1211 -    }
 26.1212 -  for (theord=0;theord<=6;theord++) {
 26.1213 -    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
 26.1214 -    }
 26.1215 -  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
 26.1216 -    sscanf(fileline,"%li",&theord)==1) {
 26.1217 -    readfontchar(fontfile,theord,fileline,maxlen);
 26.1218 -    }
 26.1219 -  Zclose(fontfile);
 26.1220 -  free(fileline);
 26.1221 -}
 26.1222 -
 26.1223 -
 26.1224 -/****************************************************************************
 26.1225 -
 26.1226 -  linealloc
 26.1227 -
 26.1228 -  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
 26.1229 -  Called near beginning of main().
 26.1230 -
 26.1231 -****************************************************************************/
 26.1232 -
 26.1233 -void linealloc()
 26.1234 -{
 26.1235 -  int row; 
 26.1236 -
 26.1237 -  outputline = (char**)myalloc(sizeof(char*)*charheight);
 26.1238 -  for (row=0;row<charheight;row++) {
 26.1239 -    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 26.1240 -    }
 26.1241 -  inchrlinelenlimit = outputwidth*4+100;
 26.1242 -  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
 26.1243 -  clearline();
 26.1244 -}
 26.1245 -
 26.1246 -
 26.1247 -/****************************************************************************
 26.1248 -
 26.1249 -  getletter
 26.1250 -
 26.1251 -  Sets currchar to point to the font entry for the given character.
 26.1252 -  Sets currcharwidth to the width of this character.
 26.1253 -
 26.1254 -****************************************************************************/
 26.1255 -
 26.1256 -void getletter(c)
 26.1257 -inchr c;
 26.1258 -{
 26.1259 -  fcharnode *charptr;
 26.1260 -
 26.1261 -  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
 26.1262 -    charptr=charptr->next) ;
 26.1263 -  if (charptr!=NULL) {
 26.1264 -    currchar = charptr->thechar;
 26.1265 -    }
 26.1266 -  else {
 26.1267 -    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
 26.1268 -      charptr=charptr->next) ;
 26.1269 -    currchar = charptr->thechar;
 26.1270 -    }
 26.1271 -  previouscharwidth = currcharwidth;
 26.1272 -  currcharwidth = MYSTRLEN(currchar[0]);
 26.1273 -}
 26.1274 -
 26.1275 -
 26.1276 -/****************************************************************************
 26.1277 -
 26.1278 -  smushem
 26.1279 -
 26.1280 -  Given 2 characters, attempts to smush them into 1, according to
 26.1281 -  smushmode.  Returns smushed character or '\0' if no smushing can be
 26.1282 -  done.
 26.1283 -
 26.1284 -  smushmode values are sum of following (all values smush blanks):
 26.1285 -    1: Smush equal chars (not hardblanks)
 26.1286 -    2: Smush '_' with any char in hierarchy below
 26.1287 -    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
 26.1288 -       Each class in hier. can be replaced by later class.
 26.1289 -    8: [ + ] -> |, { + } -> |, ( + ) -> |
 26.1290 -   16: / + \ -> X, > + < -> X (only in that order)
 26.1291 -   32: hardblank + hardblank -> hardblank
 26.1292 -
 26.1293 -****************************************************************************/
 26.1294 -
 26.1295 -char smushem(lch,rch)
 26.1296 -char lch,rch;
 26.1297 -{
 26.1298 -  if (lch==' ') return rch;
 26.1299 -  if (rch==' ') return lch;
 26.1300 -
 26.1301 -  if (previouscharwidth<2 || currcharwidth<2) return '\0';
 26.1302 -    /* Disallows overlapping if the previous character */
 26.1303 -    /* or the current character has a width of 1 or zero. */
 26.1304 -
 26.1305 -  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
 26.1306 -
 26.1307 -  if ((smushmode & 63) == 0) {
 26.1308 -    /* This is smushing by universal overlapping. */
 26.1309 -    if (lch==' ') return rch;
 26.1310 -    if (rch==' ') return lch;
 26.1311 -    if (lch==hardblank) return rch;
 26.1312 -    if (rch==hardblank) return lch;
 26.1313 -      /* Above four lines ensure overlapping preference to */
 26.1314 -      /* visible characters. */
 26.1315 -    if (right2left==1) return lch;
 26.1316 -      /* Above line ensures that the dominant (foreground) */
 26.1317 -      /* fig-character for overlapping is the latter in the */
 26.1318 -      /* user's text, not necessarily the rightmost character. */
 26.1319 -    return rch;
 26.1320 -      /* Occurs in the absence of above exceptions. */
 26.1321 -    }
 26.1322 -  
 26.1323 -  if (smushmode & SM_HARDBLANK) {
 26.1324 -    if (lch==hardblank && rch==hardblank) return lch;
 26.1325 -    }
 26.1326 -
 26.1327 -  if (lch==hardblank || rch==hardblank) return '\0';
 26.1328 -
 26.1329 -  if (smushmode & SM_EQUAL) {
 26.1330 -    if (lch==rch) return lch;
 26.1331 -    }
 26.1332 -
 26.1333 -  if (smushmode & SM_LOWLINE) {
 26.1334 -    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
 26.1335 -    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
 26.1336 -    }
 26.1337 -
 26.1338 -  if (smushmode & SM_HIERARCHY) {
 26.1339 -    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
 26.1340 -    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
 26.1341 -    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
 26.1342 -    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
 26.1343 -    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
 26.1344 -    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
 26.1345 -    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
 26.1346 -    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
 26.1347 -    if (strchr("()",lch) && strchr("<>",rch)) return rch;
 26.1348 -    if (strchr("()",rch) && strchr("<>",lch)) return lch;
 26.1349 -    }
 26.1350 -
 26.1351 -  if (smushmode & SM_PAIR) {
 26.1352 -    if (lch=='[' && rch==']') return '|';
 26.1353 -    if (rch=='[' && lch==']') return '|';
 26.1354 -    if (lch=='{' && rch=='}') return '|';
 26.1355 -    if (rch=='{' && lch=='}') return '|';
 26.1356 -    if (lch=='(' && rch==')') return '|';
 26.1357 -    if (rch=='(' && lch==')') return '|';
 26.1358 -    }
 26.1359 -
 26.1360 -  if (smushmode & SM_BIGX) {
 26.1361 -    if (lch=='/' && rch=='\\') return '|';
 26.1362 -    if (rch=='/' && lch=='\\') return 'Y';
 26.1363 -    if (lch=='>' && rch=='<') return 'X';
 26.1364 -      /* Don't want the reverse of above to give 'X'. */
 26.1365 -    }
 26.1366 -
 26.1367 -  return '\0';
 26.1368 -}
 26.1369 -
 26.1370 -
 26.1371 -/****************************************************************************
 26.1372 -
 26.1373 -  smushamt
 26.1374 -
 26.1375 -  Returns the maximum amount that the current character can be smushed
 26.1376 -  into the current line.
 26.1377 -
 26.1378 -****************************************************************************/
 26.1379 -
 26.1380 -int smushamt()
 26.1381 -{
 26.1382 -  int maxsmush,amt;
 26.1383 -  int row,linebd,charbd;
 26.1384 -  char ch1,ch2;
 26.1385 -
 26.1386 -  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
 26.1387 -    return 0;
 26.1388 -    }
 26.1389 -  maxsmush = currcharwidth;
 26.1390 -  for (row=0;row<charheight;row++) {
 26.1391 -    if (right2left) {
 26.1392 -      for (charbd=MYSTRLEN(currchar[row]);
 26.1393 -        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
 26.1394 -      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
 26.1395 -      amt = linebd+currcharwidth-1-charbd;
 26.1396 -      }
 26.1397 -    else {
 26.1398 -      for (linebd=MYSTRLEN(outputline[row]);
 26.1399 -        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
 26.1400 -      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
 26.1401 -      amt = charbd+outlinelen-1-linebd;
 26.1402 -      }
 26.1403 -    if (!ch1||ch1==' ') {
 26.1404 -      amt++;
 26.1405 -      }
 26.1406 -    else if (ch2) {
 26.1407 -      if (smushem(ch1,ch2)!='\0') {
 26.1408 -        amt++;
 26.1409 -        }
 26.1410 -      }
 26.1411 -    if (amt<maxsmush) {
 26.1412 -      maxsmush = amt;
 26.1413 -      }
 26.1414 -    }
 26.1415 -  return maxsmush;
 26.1416 -}
 26.1417 -
 26.1418 -
 26.1419 -/****************************************************************************
 26.1420 -
 26.1421 -  addchar
 26.1422 -
 26.1423 -  Attempts to add the given character onto the end of the current line.
 26.1424 -  Returns 1 if this can be done, 0 otherwise.
 26.1425 -
 26.1426 -****************************************************************************/
 26.1427 -
 26.1428 -int addchar(c)
 26.1429 -inchr c;
 26.1430 -{
 26.1431 -  int smushamount,row,k;
 26.1432 -  char *templine;
 26.1433 -
 26.1434 -  getletter(c);
 26.1435 -  smushamount = smushamt();
 26.1436 -  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
 26.1437 -      ||inchrlinelen+1>inchrlinelenlimit) {
 26.1438 -    return 0;
 26.1439 -    }
 26.1440 -
 26.1441 -  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 26.1442 -  for (row=0;row<charheight;row++) {
 26.1443 -    if (right2left) {
 26.1444 -      strcpy(templine,currchar[row]);
 26.1445 -      for (k=0;k<smushamount;k++) {
 26.1446 -        templine[currcharwidth-smushamount+k] =
 26.1447 -          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
 26.1448 -        }
 26.1449 -      strcat(templine,outputline[row]+smushamount);
 26.1450 -      strcpy(outputline[row],templine);
 26.1451 -      }
 26.1452 -    else {
 26.1453 -      for (k=0;k<smushamount;k++) {
 26.1454 -        outputline[row][outlinelen-smushamount+k] =
 26.1455 -          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
 26.1456 -        }
 26.1457 -      strcat(outputline[row],currchar[row]+smushamount);
 26.1458 -      }
 26.1459 -    }
 26.1460 -  free(templine);
 26.1461 -  outlinelen = MYSTRLEN(outputline[0]);
 26.1462 -  inchrline[inchrlinelen++] = c;
 26.1463 -  return 1;
 26.1464 -}
 26.1465 -
 26.1466 -
 26.1467 -/****************************************************************************
 26.1468 -
 26.1469 -  putstring
 26.1470 -
 26.1471 -  Prints out the given null-terminated string, substituting blanks
 26.1472 -  for hardblanks.  If outputwidth is 1, prints the entire string;
 26.1473 -  otherwise prints at most outputwidth-1 characters.  Prints a newline
 26.1474 -  at the end of the string.  The string is left-justified, centered or
 26.1475 -  right-justified (taking outputwidth as the screen width) if
 26.1476 -  justification is 0, 1 or 2, respectively.
 26.1477 -
 26.1478 -****************************************************************************/
 26.1479 -
 26.1480 -static int nr_chars=0;
 26.1481 -static void myputchar(unsigned char c)
 26.1482 -{
 26.1483 -    static int startline = 1;
 26.1484 -
 26.1485 -    if ( startline )
 26.1486 -    {
 26.1487 -        startline = 0;
 26.1488 -        myputchar(' ');
 26.1489 -    }
 26.1490 -
 26.1491 -    putc(c, stderr);
 26.1492 -
 26.1493 -    if ( nr_chars == 0 )
 26.1494 -        putchar('"');
 26.1495 -
 26.1496 -    putchar('\\');
 26.1497 -    putchar('0' + ((c>>6)&7));
 26.1498 -    putchar('0' + ((c>>3)&7));
 26.1499 -    putchar('0' + ((c>>0)&7));
 26.1500 -
 26.1501 -    if ( c == '\n' )
 26.1502 -        startline = 1;
 26.1503 -
 26.1504 -    if ( ++nr_chars == 18 ) 
 26.1505 -    {
 26.1506 -        nr_chars = 0;
 26.1507 -        putchar('"');
 26.1508 -        putchar(' ');
 26.1509 -        putchar('\\');
 26.1510 -        putchar('\n');
 26.1511 -    }
 26.1512 -}
 26.1513 -
 26.1514 -void putstring(string)
 26.1515 -char *string;
 26.1516 -{
 26.1517 -  int i,len;
 26.1518 -
 26.1519 -  len = MYSTRLEN(string);
 26.1520 -  if (outputwidth>1) {
 26.1521 -    if (len>outputwidth-1) {
 26.1522 -      len = outputwidth-1;
 26.1523 -      }
 26.1524 -    if (justification>0) {
 26.1525 -      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
 26.1526 -        myputchar(' ');
 26.1527 -        }
 26.1528 -      }
 26.1529 -    }
 26.1530 -  for (i=0;i<len;i++) {
 26.1531 -    myputchar(string[i]==hardblank?' ':string[i]);
 26.1532 -    }
 26.1533 -  myputchar('\n');
 26.1534 -}
 26.1535 -
 26.1536 -
 26.1537 -/****************************************************************************
 26.1538 -
 26.1539 -  printline
 26.1540 -
 26.1541 -  Prints outputline using putstring, then clears the current line.
 26.1542 -
 26.1543 -****************************************************************************/
 26.1544 -
 26.1545 -void printline()
 26.1546 -{
 26.1547 -  int i;
 26.1548 -
 26.1549 -  for (i=0;i<charheight;i++) {
 26.1550 -    putstring(outputline[i]);
 26.1551 -    }
 26.1552 -  clearline();
 26.1553 -}
 26.1554 -
 26.1555 -
 26.1556 -/****************************************************************************
 26.1557 -
 26.1558 -  splitline
 26.1559 -
 26.1560 -  Splits inchrline at the last word break (bunch of consecutive blanks).
 26.1561 -  Makes a new line out of the first part and prints it using
 26.1562 -  printline.  Makes a new line out of the second part and returns.
 26.1563 -
 26.1564 -****************************************************************************/
 26.1565 -
 26.1566 -void splitline()
 26.1567 -{
 26.1568 -  int i,gotspace,lastspace,len1,len2;
 26.1569 -  inchr *part1,*part2;
 26.1570 -
 26.1571 -  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 26.1572 -  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 26.1573 -  gotspace = 0;
 26.1574 -  for (i=inchrlinelen-1;i>=0;i--) {
 26.1575 -    if (!gotspace && inchrline[i]==' ') {
 26.1576 -      gotspace = 1;
 26.1577 -      lastspace = i;
 26.1578 -      }
 26.1579 -    if (gotspace && inchrline[i]!=' ') {
 26.1580 -      break;
 26.1581 -      }
 26.1582 -    }
 26.1583 -  len1 = i+1;
 26.1584 -  len2 = inchrlinelen-lastspace-1;
 26.1585 -  for (i=0;i<len1;i++) {
 26.1586 -    part1[i] = inchrline[i];
 26.1587 -    }
 26.1588 -  for (i=0;i<len2;i++) {
 26.1589 -    part2[i] = inchrline[lastspace+1+i];
 26.1590 -    }
 26.1591 -  clearline();
 26.1592 -  for (i=0;i<len1;i++) {
 26.1593 -    addchar(part1[i]);
 26.1594 -    }
 26.1595 -  printline();
 26.1596 -  for (i=0;i<len2;i++) {
 26.1597 -    addchar(part2[i]);
 26.1598 -    }
 26.1599 -  free(part1);
 26.1600 -  free(part2);
 26.1601 -}
 26.1602 -
 26.1603 -
 26.1604 -/****************************************************************************
 26.1605 -
 26.1606 -  handlemapping
 26.1607 -
 26.1608 -  Given an input character (type inchr), executes re-mapping commands
 26.1609 -  read from control files.  Returns re-mapped character (inchr).
 26.1610 -
 26.1611 -****************************************************************************/
 26.1612 -
 26.1613 -inchr handlemapping(c)
 26.1614 -inchr c;
 26.1615 -{
 26.1616 -  comnode *cmptr;
 26.1617 -
 26.1618 -  cmptr=commandlist;
 26.1619 -  while (cmptr!=NULL) {
 26.1620 -    if (cmptr->thecommand ?
 26.1621 -      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
 26.1622 -      c += cmptr->offset;
 26.1623 -      while(cmptr!=NULL ? cmptr->thecommand : 0) {
 26.1624 -        cmptr=cmptr->next;
 26.1625 -        }
 26.1626 -      }
 26.1627 -    else {
 26.1628 -      cmptr=cmptr->next;
 26.1629 -      }
 26.1630 -    }
 26.1631 -  return c;
 26.1632 -}
 26.1633 -
 26.1634 -/****************************************************************************
 26.1635 -
 26.1636 -  Agetchar
 26.1637 -
 26.1638 -  Replacement to getchar().
 26.1639 -  Acts exactly like getchar if -A is NOT specified,
 26.1640 -  else obtains input from All remaining command line words.
 26.1641 -
 26.1642 -****************************************************************************/
 26.1643 -
 26.1644 -int Agetchar()
 26.1645 -{
 26.1646 -    extern int optind;		/* current argv[] element under study */
 26.1647 -    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
 26.1648 -    char   *arg;		/* pointer to active character */
 26.1649 -    int    c;			/* current character */
 26.1650 -
 26.1651 -    if ( ! cmdinput )		/* is -A active? */
 26.1652 -	return( getchar() );	/* no: return stdin character */
 26.1653 -
 26.1654 -    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
 26.1655 -	return( EOF );		/* **ensure it now and forever more */
 26.1656 -
 26.1657 -    /* find next character */
 26.1658 -    arg = Myargv[optind];		/* pointer to active arg */
 26.1659 -    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
 26.1660 -
 26.1661 -    if ( ! c )			/* at '\0' that terminates word? */
 26.1662 -    {   /* at end of word: return ' ' if normal word, '\n' if empty */
 26.1663 -	c = ' ';		/* suppose normal word and return blank */
 26.1664 -	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
 26.1665 -	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
 26.1666 -	AgetMode = 0;		/* return to char 0 in NEXT word */
 26.1667 -	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
 26.1668 -	{   /* just ran out of arguments */
 26.1669 -	    c = EOF;		/* return EOF */
 26.1670 -	    AgetMode = -1;	/* ensure all future returns return EOF */
 26.1671 -	}
 26.1672 -    }
 26.1673 -
 26.1674 -    return( c );		/* return appropriate character */
 26.1675 -
 26.1676 -}	/* end: Agetchar() */
 26.1677 -
 26.1678 -
 26.1679 -/****************************************************************************
 26.1680 -
 26.1681 -  iso2022
 26.1682 -
 26.1683 -  Called by getinchr.  Interprets ISO 2022 sequences
 26.1684 -
 26.1685 -******************************************************************************/
 26.1686 -
 26.1687 -inchr iso2022()
 26.1688 -{
 26.1689 -  inchr ch;
 26.1690 -  inchr ch2;
 26.1691 -  int save_gl;
 26.1692 -  int save_gr;
 26.1693 -
 26.1694 -  ch = Agetchar();
 26.1695 -  if (ch == EOF) return ch;
 26.1696 -  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
 26.1697 -  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
 26.1698 -  switch (ch) {
 26.1699 -    case 14: /* invoke G0 into GL */
 26.1700 -      gl = 0;
 26.1701 -      return iso2022();
 26.1702 -    case 15: /* invoke G1 into GL */
 26.1703 -      gl = 1;
 26.1704 -      return iso2022();
 26.1705 -    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
 26.1706 -      save_gl = gl; save_gr = gr;
 26.1707 -      gl = gr = 2;
 26.1708 -      ch = iso2022();
 26.1709 -      gl = save_gl; gr = save_gr;
 26.1710 -      return ch;
 26.1711 -    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
 26.1712 -      save_gl = gl; save_gr = gr;
 26.1713 -      gl = gr = 3;
 26.1714 -      ch = iso2022();
 26.1715 -      gl = save_gl; gr = save_gr;
 26.1716 -      return ch;
 26.1717 -    case 'n' + 0x100: /* invoke G2 into GL */
 26.1718 -      gl = 2;
 26.1719 -      return iso2022();
 26.1720 -    case 'o' + 0x100: /* invoke G3 into GL */
 26.1721 -      gl = 3;
 26.1722 -      return iso2022();
 26.1723 -    case '~' + 0x100: /* invoke G1 into GR */
 26.1724 -      gr = 1;
 26.1725 -      return iso2022();
 26.1726 -    case '}' + 0x100: /* invoke G2 into GR */
 26.1727 -      gr = 2;
 26.1728 -      return iso2022();
 26.1729 -    case '|' + 0x100: /* invoke G3 into GR */
 26.1730 -      gr = 3;
 26.1731 -      return iso2022();
 26.1732 -    case '(' + 0x100: /* set G0 to 94-char set */
 26.1733 -      ch = Agetchar();
 26.1734 -      if (ch == 'B') ch = 0; /* ASCII */
 26.1735 -      gn[0] = ch << 16;
 26.1736 -      gndbl[0] = 0;
 26.1737 -      return iso2022();
 26.1738 -    case ')' + 0x100: /* set G1 to 94-char set */
 26.1739 -      ch = Agetchar();
 26.1740 -      if (ch == 'B') ch = 0;
 26.1741 -      gn[1] = ch << 16;
 26.1742 -      gndbl[1] = 0;
 26.1743 -      return iso2022();
 26.1744 -    case '*' + 0x100: /* set G2 to 94-char set */
 26.1745 -      ch = Agetchar();
 26.1746 -      if (ch == 'B') ch = 0;
 26.1747 -      gn[2] = ch << 16;
 26.1748 -      gndbl[2] = 0;
 26.1749 -      return iso2022();
 26.1750 -    case '+' + 0x100: /* set G3 to 94-char set */
 26.1751 -      ch = Agetchar();
 26.1752 -      if (ch == 'B') ch = 0;
 26.1753 -      gn[3] = ch << 16;
 26.1754 -      gndbl[3] = 0;
 26.1755 -      return iso2022();
 26.1756 -    case '-' + 0x100: /* set G1 to 96-char set */
 26.1757 -      ch = Agetchar();
 26.1758 -      if (ch == 'A') ch = 0; /* Latin-1 top half */
 26.1759 -      gn[1] = (ch << 16) | 0x80;
 26.1760 -      gndbl[1] = 0;
 26.1761 -      return iso2022();
 26.1762 -    case '.' + 0x100: /* set G2 to 96-char set */
 26.1763 -      ch = Agetchar();
 26.1764 -      if (ch == 'A') ch = 0;
 26.1765 -      gn[2] = (ch << 16) | 0x80;
 26.1766 -      gndbl[2] = 0;
 26.1767 -      return iso2022();
 26.1768 -    case '/' + 0x100: /* set G3 to 96-char set */
 26.1769 -      ch = Agetchar();
 26.1770 -      if (ch == 'A') ch = 0;
 26.1771 -      gn[3] = (ch << 16) | 0x80;
 26.1772 -      gndbl[3] = 0;
 26.1773 -      return iso2022();
 26.1774 -    case '(' + 0x200: /* set G0 to 94 x 94 char set */
 26.1775 -      ch = Agetchar();
 26.1776 -      gn[0] = ch << 16;
 26.1777 -      gndbl[0] = 1;
 26.1778 -      return iso2022();
 26.1779 -    case ')' + 0x200: /* set G1 to 94 x 94 char set */
 26.1780 -      ch = Agetchar();
 26.1781 -      gn[1] = ch << 16;
 26.1782 -      gndbl[1] = 1;
 26.1783 -      return iso2022();
 26.1784 -    case '*' + 0x200: /* set G2 to 94 x 94 char set */
 26.1785 -      ch = Agetchar();
 26.1786 -      gn[2] = ch << 16;
 26.1787 -      gndbl[2] = 1;
 26.1788 -      return iso2022();
 26.1789 -    case '+' + 0x200: /* set G3 to 94 x 94 char set */
 26.1790 -      ch = Agetchar();
 26.1791 -      gn[3] = ch << 16;
 26.1792 -      gndbl[3] = 1;
 26.1793 -      return iso2022();
 26.1794 -    default:
 26.1795 -      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
 26.1796 -        gn[0] = (ch & ~0x200) << 16;
 26.1797 -        gndbl[0] = 1;
 26.1798 -        return iso2022();
 26.1799 -        }
 26.1800 -      }
 26.1801 -
 26.1802 -  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
 26.1803 -    if (gndbl[gl]) {
 26.1804 -      ch2 = Agetchar();
 26.1805 -      return gn[gl] | (ch << 8) | ch2;
 26.1806 -      }
 26.1807 -    else return gn[gl] | ch;
 26.1808 -    }
 26.1809 -  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
 26.1810 -    if (gndbl[gr]) {
 26.1811 -      ch2 = Agetchar();
 26.1812 -      return gn[gr] | (ch << 8) | ch2;
 26.1813 -      }
 26.1814 -    else return gn[gr] | (ch & ~0x80);
 26.1815 -    }
 26.1816 -  else return ch;
 26.1817 -  }
 26.1818 -
 26.1819 -/****************************************************************************
 26.1820 -
 26.1821 -  ungetinchr
 26.1822 -
 26.1823 -  Called by main.  Pushes back an "inchr" to be read by getinchr
 26.1824 -  on the next call.
 26.1825 -
 26.1826 -******************************************************************************/
 26.1827 -inchr getinchr_buffer;
 26.1828 -int getinchr_flag;
 26.1829 -
 26.1830 -inchr ungetinchr(c)
 26.1831 -inchr c;
 26.1832 -{
 26.1833 -  getinchr_buffer = c;
 26.1834 -  getinchr_flag = 1;
 26.1835 -  return c;
 26.1836 -}
 26.1837 -
 26.1838 -/*****************************************************************************
 26.1839 -
 26.1840 -  getinchr
 26.1841 -
 26.1842 -  Called by main.  Processes multibyte characters.  Invokes Agetchar.
 26.1843 -  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
 26.1844 -  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
 26.1845 -    0x80-0xFF bytes are first byte of a double-byte character).
 26.1846 -  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
 26.1847 -    0x80-0xBF bytes are nonfirst byte of a multibyte character,
 26.1848 -    0xC0-0xFD bytes are first byte of a multibyte character,
 26.1849 -    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
 26.1850 -  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
 26.1851 -    "~~" is a tilde, "~x" for all other x is ignored).
 26.1852 -  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
 26.1853 -    of a double-byte character, all other bytes are characters).
 26.1854 - 
 26.1855 -
 26.1856 -*****************************************************************************/
 26.1857 -
 26.1858 -inchr getinchr()
 26.1859 -{
 26.1860 -  int ch, ch2, ch3, ch4, ch5, ch6;
 26.1861 -
 26.1862 -  if (getinchr_flag) {
 26.1863 -    getinchr_flag = 0;
 26.1864 -    return getinchr_buffer;
 26.1865 -    }
 26.1866 -
 26.1867 -  switch(multibyte) {
 26.1868 -    case 0: /* single-byte */
 26.1869 -      return iso2022();
 26.1870 -   case 1: /* DBCS */
 26.1871 -     ch = Agetchar();
 26.1872 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 26.1873 -         (ch >= 0xE0 && ch <= 0xEF)) {
 26.1874 -       ch = (ch << 8) + Agetchar();
 26.1875 -       }
 26.1876 -     return ch;
 26.1877 -   case 2: /* UTF-8 */
 26.1878 -      ch = Agetchar();
 26.1879 -      if (ch < 0x80) return ch;  /* handles EOF, too */
 26.1880 -      if (ch < 0xC0 || ch > 0xFD)
 26.1881 -        return 0x0080;  /* illegal first character */
 26.1882 -      ch2 = Agetchar() & 0x3F;
 26.1883 -      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
 26.1884 -      ch3 = Agetchar() & 0x3F;
 26.1885 -      if (ch < 0xF0)
 26.1886 -        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
 26.1887 -      ch4 = Agetchar() & 0x3F;
 26.1888 -      if (ch < 0xF8)
 26.1889 -        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
 26.1890 -      ch5 = Agetchar() & 0x3F;
 26.1891 -      if (ch < 0xFC)
 26.1892 -        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
 26.1893 -          (ch4 << 6) + ch5;
 26.1894 -      ch6 = Agetchar() & 0x3F;
 26.1895 -      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
 26.1896 -        (ch4 << 12) + (ch5 << 6) + ch6;
 26.1897 -   case 3: /* HZ */
 26.1898 -     ch = Agetchar();
 26.1899 -     if (ch == EOF) return ch;
 26.1900 -     if (hzmode) {
 26.1901 -       ch = (ch << 8) + Agetchar();
 26.1902 -       if (ch == ('}' << 8) + '~') {
 26.1903 -         hzmode = 0;
 26.1904 -         return getinchr();
 26.1905 -         }
 26.1906 -       return ch;
 26.1907 -       }
 26.1908 -     else if (ch == '~') {
 26.1909 -       ch = Agetchar();
 26.1910 -       if (ch == '{') {
 26.1911 -          hzmode = 1;
 26.1912 -          return getinchr();
 26.1913 -          }
 26.1914 -      else if (ch == '~') {
 26.1915 -        return ch;
 26.1916 -        }
 26.1917 -      else {
 26.1918 -        return getinchr();
 26.1919 -        }
 26.1920 -      }
 26.1921 -     else return ch;
 26.1922 -   case 4: /* Shift-JIS */
 26.1923 -     ch = Agetchar();
 26.1924 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 26.1925 -         (ch >= 0xE0 && ch <= 0xEF)) {
 26.1926 -       ch = (ch << 8) + Agetchar();
 26.1927 -       }
 26.1928 -     return ch;
 26.1929 -   default:
 26.1930 -     return 0x80;
 26.1931 -    }
 26.1932 -  }
 26.1933 -
 26.1934 -/****************************************************************************
 26.1935 -
 26.1936 -  main
 26.1937 -
 26.1938 -  The main program, of course.
 26.1939 -  Reads characters 1 by 1 from stdin, and makes lines out of them using
 26.1940 -  addchar. Handles line breaking, (which accounts for most of the
 26.1941 -  complexity in this function).
 26.1942 -
 26.1943 -****************************************************************************/
 26.1944 -
 26.1945 -int main(argc,argv)
 26.1946 -int argc;
 26.1947 -char *argv[];
 26.1948 -{
 26.1949 -  inchr c,c2;
 26.1950 -  int i;
 26.1951 -  int last_was_eol_flag;
 26.1952 -/*---------------------------------------------------------------------------
 26.1953 -  wordbreakmode:
 26.1954 -    -1: /^$/ and blanks are to be absorbed (when line break was forced
 26.1955 -      by a blank or character larger than outlinelenlimit)
 26.1956 -    0: /^ *$/ and blanks are not to be absorbed
 26.1957 -    1: /[^ ]$/ no word break yet
 26.1958 -    2: /[^ ]  *$/
 26.1959 -    3: /[^ ]$/ had a word break
 26.1960 ----------------------------------------------------------------------------*/
 26.1961 -  int wordbreakmode;
 26.1962 -  int char_not_added;
 26.1963 -
 26.1964 -  Myargc = argc;
 26.1965 -  Myargv = argv;
 26.1966 -  getparams();
 26.1967 -  readcontrolfiles();
 26.1968 -  readfont();
 26.1969 -  linealloc();
 26.1970 -
 26.1971 -  wordbreakmode = 0;
 26.1972 -  last_was_eol_flag = 0;
 26.1973 -
 26.1974 -  while ((c = getinchr())!=EOF) {
 26.1975 -
 26.1976 -    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
 26.1977 -      ungetinchr(c2 = getinchr());
 26.1978 -      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
 26.1979 -      }
 26.1980 -    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
 26.1981 -
 26.1982 -    if (deutschflag) {
 26.1983 -      if (c>='[' && c<=']') {
 26.1984 -        c = deutsch[c-'['];
 26.1985 -        }
 26.1986 -      else if (c >='{' && c <= '~') {
 26.1987 -        c = deutsch[c-'{'+3];
 26.1988 -        }
 26.1989 -      }
 26.1990 -
 26.1991 -    c = handlemapping(c);
 26.1992 -
 26.1993 -    if (isascii(c)&&isspace(c)) {
 26.1994 -      c = (c=='\t'||c==' ') ? ' ' : '\n';
 26.1995 -      }
 26.1996 -
 26.1997 -    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
 26.1998 -
 26.1999 -/*
 26.2000 -  Note: The following code is complex and thoroughly tested.
 26.2001 -  Be careful when modifying!
 26.2002 -*/
 26.2003 -
 26.2004 -    do {
 26.2005 -      char_not_added = 0;
 26.2006 -
 26.2007 -      if (wordbreakmode== -1) {
 26.2008 -        if (c==' ') {
 26.2009 -          break;
 26.2010 -          }
 26.2011 -        else if (c=='\n') {
 26.2012 -          wordbreakmode = 0;
 26.2013 -          break;
 26.2014 -          }
 26.2015 -        wordbreakmode = 0;
 26.2016 -        }
 26.2017 -
 26.2018 -      if (c=='\n') {
 26.2019 -        printline();
 26.2020 -        wordbreakmode = 0;
 26.2021 -        }
 26.2022 -
 26.2023 -      else if (addchar(c)) {
 26.2024 -        if (c!=' ') {
 26.2025 -          wordbreakmode = (wordbreakmode>=2)?3:1;
 26.2026 -          }
 26.2027 -        else {
 26.2028 -          wordbreakmode = (wordbreakmode>0)?2:0;
 26.2029 -          }
 26.2030 -        }
 26.2031 -
 26.2032 -      else if (outlinelen==0) {
 26.2033 -        for (i=0;i<charheight;i++) {
 26.2034 -          if (right2left && outputwidth>1) {
 26.2035 -            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
 26.2036 -            }
 26.2037 -          else {
 26.2038 -            putstring(currchar[i]);
 26.2039 -            }
 26.2040 -          }
 26.2041 -        wordbreakmode = -1;
 26.2042 -        }
 26.2043 -
 26.2044 -      else if (c==' ') {
 26.2045 -        if (wordbreakmode==2) {
 26.2046 -          splitline();
 26.2047 -          }
 26.2048 -        else {
 26.2049 -          printline();
 26.2050 -          }
 26.2051 -        wordbreakmode = -1;
 26.2052 -        }
 26.2053 -
 26.2054 -      else {
 26.2055 -        if (wordbreakmode>=2) {
 26.2056 -          splitline();
 26.2057 -          }
 26.2058 -        else {
 26.2059 -          printline();
 26.2060 -          }
 26.2061 -        wordbreakmode = (wordbreakmode==3)?1:0;
 26.2062 -        char_not_added = 1;
 26.2063 -        }
 26.2064 -
 26.2065 -      } while (char_not_added);
 26.2066 -    }
 26.2067 -
 26.2068 -  if (outlinelen!=0) {
 26.2069 -    printline();
 26.2070 -    }
 26.2071 -
 26.2072 -  /* XXX Xen hack -- finish off the C macro output */
 26.2073 -  if ( nr_chars != 0 )
 26.2074 -      putchar('"');
 26.2075 -  putchar('\n');
 26.2076 -
 26.2077 -  exit(0);
 26.2078 -}
    27.1 --- a/xen/tools/figlet/xen.flf	Fri Jul 09 18:28:03 2004 +0000
    27.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.3 @@ -1,2230 +0,0 @@
    27.4 -flf2a$ 6 5 16 15 14 0 24463 229
    27.5 -Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    27.6 -Includes ISO Latin-1
    27.7 -figlet release 2.1 -- 12 Aug 1994
    27.8 -Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    27.9 -  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   27.10 -Permission is hereby given to modify this font, as long as the
   27.11 -modifier's name is placed on a comment line.
   27.12 -
   27.13 -Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   27.14 -supported by FIGlet and FIGWin.  May also be slightly modified for better use
   27.15 -of new full-width/kern/smush alternatives, but default output is NOT changed.
   27.16 -
   27.17 -Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   27.18 -
   27.19 - $@
   27.20 - $@
   27.21 - $@
   27.22 - $@
   27.23 - $@
   27.24 - $@@
   27.25 -  _ @
   27.26 - | |@
   27.27 - | |@
   27.28 - |_|@
   27.29 - (_)@
   27.30 -    @@
   27.31 -  _ _ @
   27.32 - ( | )@
   27.33 -  V V @
   27.34 -   $  @
   27.35 -   $  @
   27.36 -      @@
   27.37 -    _  _   @
   27.38 -  _| || |_ @
   27.39 - |_  ..  _|@
   27.40 - |_      _|@
   27.41 -   |_||_|  @
   27.42 -           @@
   27.43 -   _  @
   27.44 -  | | @
   27.45 - / __)@
   27.46 - \__ \@
   27.47 - (   /@
   27.48 -  |_| @@
   27.49 -  _  __@
   27.50 - (_)/ /@
   27.51 -   / / @
   27.52 -  / /_ @
   27.53 - /_/(_)@
   27.54 -       @@
   27.55 -   ___   @
   27.56 -  ( _ )  @
   27.57 -  / _ \/\@
   27.58 - | (_>  <@
   27.59 -  \___/\/@
   27.60 -         @@
   27.61 -  _ @
   27.62 - ( )@
   27.63 - |/ @
   27.64 -  $ @
   27.65 -  $ @
   27.66 -    @@
   27.67 -   __@
   27.68 -  / /@
   27.69 - | | @
   27.70 - | | @
   27.71 - | | @
   27.72 -  \_\@@
   27.73 - __  @
   27.74 - \ \ @
   27.75 -  | |@
   27.76 -  | |@
   27.77 -  | |@
   27.78 - /_/ @@
   27.79 -       @
   27.80 - __/\__@
   27.81 - \    /@
   27.82 - /_  _\@
   27.83 -   \/  @
   27.84 -       @@
   27.85 -        @
   27.86 -    _   @
   27.87 -  _| |_ @
   27.88 - |_   _|@
   27.89 -   |_|  @
   27.90 -        @@
   27.91 -    @
   27.92 -    @
   27.93 -    @
   27.94 -  _ @
   27.95 - ( )@
   27.96 - |/ @@
   27.97 -     @
   27.98 -     @
   27.99 -  __ @
  27.100 - |__|@
  27.101 -  $  @
  27.102 -     @@
  27.103 -    @
  27.104 -    @
  27.105 -    @
  27.106 -  _ @
  27.107 - (_)@
  27.108 -    @@
  27.109 -     __@
  27.110 -    / /@
  27.111 -   / / @
  27.112 -  / /  @
  27.113 - /_/   @
  27.114 -       @@
  27.115 -   ___  @
  27.116 -  / _ \ @
  27.117 - | | | |@
  27.118 - | |_| |@
  27.119 -  \___/ @
  27.120 -        @@
  27.121 -  _ @
  27.122 - / |@
  27.123 - | |@
  27.124 - | |@
  27.125 - |_|@
  27.126 -    @@
  27.127 -  ____  @
  27.128 - |___ \ @
  27.129 -   __) |@
  27.130 -  / __/ @
  27.131 - |_____|@
  27.132 -        @@
  27.133 -  _____ @
  27.134 - |___ / @
  27.135 -   |_ \ @
  27.136 -  ___) |@
  27.137 - |____/ @
  27.138 -        @@
  27.139 -  _  _   @
  27.140 - | || |  @
  27.141 - | || |_ @
  27.142 - |__   _|@
  27.143 -    |_|  @
  27.144 -         @@
  27.145 -  ____  @
  27.146 - | ___| @
  27.147 - |___ \ @
  27.148 -  ___) |@
  27.149 - |____/ @
  27.150 -        @@
  27.151 -   __   @
  27.152 -  / /_  @
  27.153 - | '_ \ @
  27.154 - | (_) |@
  27.155 -  \___/ @
  27.156 -        @@
  27.157 -  _____ @
  27.158 - |___  |@
  27.159 -    / / @
  27.160 -   / /  @
  27.161 -  /_/   @
  27.162 -        @@
  27.163 -   ___  @
  27.164 -  ( _ ) @
  27.165 -  / _ \ @
  27.166 - | (_) |@
  27.167 -  \___/ @
  27.168 -        @@
  27.169 -   ___  @
  27.170 -  / _ \ @
  27.171 - | (_) |@
  27.172 -  \__, |@
  27.173 -    /_/ @
  27.174 -        @@
  27.175 -    @
  27.176 -  _ @
  27.177 - (_)@
  27.178 -  _ @
  27.179 - (_)@
  27.180 -    @@
  27.181 -    @
  27.182 -  _ @
  27.183 - (_)@
  27.184 -  _ @
  27.185 - ( )@
  27.186 - |/ @@
  27.187 -   __@
  27.188 -  / /@
  27.189 - / / @
  27.190 - \ \ @
  27.191 -  \_\@
  27.192 -     @@
  27.193 -        @
  27.194 -  _____ @
  27.195 - |_____|@
  27.196 - |_____|@
  27.197 -    $   @
  27.198 -        @@
  27.199 - __  @
  27.200 - \ \ @
  27.201 -  \ \@
  27.202 -  / /@
  27.203 - /_/ @
  27.204 -     @@
  27.205 -  ___ @
  27.206 - |__ \@
  27.207 -   / /@
  27.208 -  |_| @
  27.209 -  (_) @
  27.210 -      @@
  27.211 -    ____  @
  27.212 -   / __ \ @
  27.213 -  / / _` |@
  27.214 - | | (_| |@
  27.215 -  \ \__,_|@
  27.216 -   \____/ @@
  27.217 -     _    @
  27.218 -    / \   @
  27.219 -   / _ \  @
  27.220 -  / ___ \ @
  27.221 - /_/   \_\@
  27.222 -          @@
  27.223 -  ____  @
  27.224 - | __ ) @
  27.225 - |  _ \ @
  27.226 - | |_) |@
  27.227 - |____/ @
  27.228 -        @@
  27.229 -   ____ @
  27.230 -  / ___|@
  27.231 - | |    @
  27.232 - | |___ @
  27.233 -  \____|@
  27.234 -        @@
  27.235 -  ____  @
  27.236 - |  _ \ @
  27.237 - | | | |@
  27.238 - | |_| |@
  27.239 - |____/ @
  27.240 -        @@
  27.241 -  _____ @
  27.242 - | ____|@
  27.243 - |  _|  @
  27.244 - | |___ @
  27.245 - |_____|@
  27.246 -        @@
  27.247 -  _____ @
  27.248 - |  ___|@
  27.249 - | |_   @
  27.250 - |  _|  @
  27.251 - |_|    @
  27.252 -        @@
  27.253 -   ____ @
  27.254 -  / ___|@
  27.255 - | |  _ @
  27.256 - | |_| |@
  27.257 -  \____|@
  27.258 -        @@
  27.259 -  _   _ @
  27.260 - | | | |@
  27.261 - | |_| |@
  27.262 - |  _  |@
  27.263 - |_| |_|@
  27.264 -        @@
  27.265 -  ___ @
  27.266 - |_ _|@
  27.267 -  | | @
  27.268 -  | | @
  27.269 - |___|@
  27.270 -      @@
  27.271 -      _ @
  27.272 -     | |@
  27.273 -  _  | |@
  27.274 - | |_| |@
  27.275 -  \___/ @
  27.276 -        @@
  27.277 -  _  __@
  27.278 - | |/ /@
  27.279 - | ' / @
  27.280 - | . \ @
  27.281 - |_|\_\@
  27.282 -       @@
  27.283 -  _     @
  27.284 - | |    @
  27.285 - | |    @
  27.286 - | |___ @
  27.287 - |_____|@
  27.288 -        @@
  27.289 -  __  __ @
  27.290 - |  \/  |@
  27.291 - | |\/| |@
  27.292 - | |  | |@
  27.293 - |_|  |_|@
  27.294 -         @@
  27.295 -  _   _ @
  27.296 - | \ | |@
  27.297 - |  \| |@
  27.298 - | |\  |@
  27.299 - |_| \_|@
  27.300 -        @@
  27.301 -   ___  @
  27.302 -  / _ \ @
  27.303 - | | | |@
  27.304 - | |_| |@
  27.305 -  \___/ @
  27.306 -        @@
  27.307 -  ____  @
  27.308 - |  _ \ @
  27.309 - | |_) |@
  27.310 - |  __/ @
  27.311 - |_|    @
  27.312 -        @@
  27.313 -   ___  @
  27.314 -  / _ \ @
  27.315 - | | | |@
  27.316 - | |_| |@
  27.317 -  \__\_\@
  27.318 -        @@
  27.319 -  ____  @
  27.320 - |  _ \ @
  27.321 - | |_) |@
  27.322 - |  _ < @
  27.323 - |_| \_\@
  27.324 -        @@
  27.325 -  ____  @
  27.326 - / ___| @
  27.327 - \___ \ @
  27.328 -  ___) |@
  27.329 - |____/ @
  27.330 -        @@
  27.331 -  _____ @
  27.332 - |_   _|@
  27.333 -   | |  @
  27.334 -   | |  @
  27.335 -   |_|  @
  27.336 -        @@
  27.337 -  _   _ @
  27.338 - | | | |@
  27.339 - | | | |@
  27.340 - | |_| |@
  27.341 -  \___/ @
  27.342 -        @@
  27.343 - __     __@
  27.344 - \ \   / /@
  27.345 -  \ \ / / @
  27.346 -   \ V /  @
  27.347 -    \_/   @
  27.348 -          @@
  27.349 - __        __@
  27.350 - \ \      / /@
  27.351 -  \ \ /\ / / @
  27.352 -   \ V  V /  @
  27.353 -    \_/\_/   @
  27.354 -             @@
  27.355 - __  __@
  27.356 - \ \/ /@
  27.357 -  \  / @
  27.358 -  /  \ @
  27.359 - /_/\_\@
  27.360 -       @@
  27.361 - __   __@
  27.362 - \ \ / /@
  27.363 -  \ V / @
  27.364 -   | |  @
  27.365 -   |_|  @
  27.366 -        @@
  27.367 -  _____@
  27.368 - |__  /@
  27.369 -   / / @
  27.370 -  / /_ @
  27.371 - /____|@
  27.372 -       @@
  27.373 -  __ @
  27.374 - | _|@
  27.375 - | | @
  27.376 - | | @
  27.377 - | | @
  27.378 - |__|@@
  27.379 - __    @
  27.380 - \ \   @
  27.381 -  \ \  @
  27.382 -   \ \ @
  27.383 -    \_\@
  27.384 -       @@
  27.385 -  __ @
  27.386 - |_ |@
  27.387 -  | |@
  27.388 -  | |@
  27.389 -  | |@
  27.390 - |__|@@
  27.391 -  /\ @
  27.392 - |/\|@
  27.393 -   $ @
  27.394 -   $ @
  27.395 -   $ @
  27.396 -     @@
  27.397 -        @
  27.398 -        @
  27.399 -        @
  27.400 -        @
  27.401 -  _____ @
  27.402 - |_____|@@
  27.403 -  _ @
  27.404 - ( )@
  27.405 -  \|@
  27.406 -  $ @
  27.407 -  $ @
  27.408 -    @@
  27.409 -        @
  27.410 -   __ _ @
  27.411 -  / _` |@
  27.412 - | (_| |@
  27.413 -  \__,_|@
  27.414 -        @@
  27.415 -  _     @
  27.416 - | |__  @
  27.417 - | '_ \ @
  27.418 - | |_) |@
  27.419 - |_.__/ @
  27.420 -        @@
  27.421 -       @
  27.422 -   ___ @
  27.423 -  / __|@
  27.424 - | (__ @
  27.425 -  \___|@
  27.426 -       @@
  27.427 -      _ @
  27.428 -   __| |@
  27.429 -  / _` |@
  27.430 - | (_| |@
  27.431 -  \__,_|@
  27.432 -        @@
  27.433 -       @
  27.434 -   ___ @
  27.435 -  / _ \@
  27.436 - |  __/@
  27.437 -  \___|@
  27.438 -       @@
  27.439 -   __ @
  27.440 -  / _|@
  27.441 - | |_ @
  27.442 - |  _|@
  27.443 - |_|  @
  27.444 -      @@
  27.445 -        @
  27.446 -   __ _ @
  27.447 -  / _` |@
  27.448 - | (_| |@
  27.449 -  \__, |@
  27.450 -  |___/ @@
  27.451 -  _     @
  27.452 - | |__  @
  27.453 - | '_ \ @
  27.454 - | | | |@
  27.455 - |_| |_|@
  27.456 -        @@
  27.457 -  _ @
  27.458 - (_)@
  27.459 - | |@
  27.460 - | |@
  27.461 - |_|@
  27.462 -    @@
  27.463 -    _ @
  27.464 -   (_)@
  27.465 -   | |@
  27.466 -   | |@
  27.467 -  _/ |@
  27.468 - |__/ @@
  27.469 -  _    @
  27.470 - | | __@
  27.471 - | |/ /@
  27.472 - |   < @
  27.473 - |_|\_\@
  27.474 -       @@
  27.475 -  _ @
  27.476 - | |@
  27.477 - | |@
  27.478 - | |@
  27.479 - |_|@
  27.480 -    @@
  27.481 -            @
  27.482 -  _ __ ___  @
  27.483 - | '_ ` _ \ @
  27.484 - | | | | | |@
  27.485 - |_| |_| |_|@
  27.486 -            @@
  27.487 -        @
  27.488 -  _ __  @
  27.489 - | '_ \ @
  27.490 - | | | |@
  27.491 - |_| |_|@
  27.492 -        @@
  27.493 -        @
  27.494 -   ___  @
  27.495 -  / _ \ @
  27.496 - | (_) |@
  27.497 -  \___/ @
  27.498 -        @@
  27.499 -        @
  27.500 -  _ __  @
  27.501 - | '_ \ @
  27.502 - | |_) |@
  27.503 - | .__/ @
  27.504 - |_|    @@
  27.505 -        @
  27.506 -   __ _ @
  27.507 -  / _` |@
  27.508 - | (_| |@
  27.509 -  \__, |@
  27.510 -     |_|@@
  27.511 -       @
  27.512 -  _ __ @
  27.513 - | '__|@
  27.514 - | |   @
  27.515 - |_|   @
  27.516 -       @@
  27.517 -      @
  27.518 -  ___ @
  27.519 - / __|@
  27.520 - \__ \@
  27.521 - |___/@
  27.522 -      @@
  27.523 -  _   @
  27.524 - | |_ @
  27.525 - | __|@
  27.526 - | |_ @
  27.527 -  \__|@
  27.528 -      @@
  27.529 -        @
  27.530 -  _   _ @
  27.531 - | | | |@
  27.532 - | |_| |@
  27.533 -  \__,_|@
  27.534 -        @@
  27.535 -        @
  27.536 - __   __@
  27.537 - \ \ / /@
  27.538 -  \ V / @
  27.539 -   \_/  @
  27.540 -        @@
  27.541 -           @
  27.542 - __      __@
  27.543 - \ \ /\ / /@
  27.544 -  \ V  V / @
  27.545 -   \_/\_/  @
  27.546 -           @@
  27.547 -       @
  27.548 - __  __@
  27.549 - \ \/ /@
  27.550 -  >  < @
  27.551 - /_/\_\@
  27.552 -       @@
  27.553 -        @
  27.554 -  _   _ @
  27.555 - | | | |@
  27.556 - | |_| |@
  27.557 -  \__, |@
  27.558 -  |___/ @@
  27.559 -      @
  27.560 -  ____@
  27.561 - |_  /@
  27.562 -  / / @
  27.563 - /___|@
  27.564 -      @@
  27.565 -    __@
  27.566 -   / /@
  27.567 -  | | @
  27.568 - < <  @
  27.569 -  | | @
  27.570 -   \_\@@
  27.571 -  _ @
  27.572 - | |@
  27.573 - | |@
  27.574 - | |@
  27.575 - | |@
  27.576 - |_|@@
  27.577 - __   @
  27.578 - \ \  @
  27.579 -  | | @
  27.580 -   > >@
  27.581 -  | | @
  27.582 - /_/  @@
  27.583 -  /\/|@
  27.584 - |/\/ @
  27.585 -   $  @
  27.586 -   $  @
  27.587 -   $  @
  27.588 -      @@
  27.589 -  _   _ @
  27.590 - (_)_(_)@
  27.591 -   /_\  @
  27.592 -  / _ \ @
  27.593 - /_/ \_\@
  27.594 -        @@
  27.595 -  _   _ @
  27.596 - (_)_(_)@
  27.597 -  / _ \ @
  27.598 - | |_| |@
  27.599 -  \___/ @
  27.600 -        @@
  27.601 -  _   _ @
  27.602 - (_) (_)@
  27.603 - | | | |@
  27.604 - | |_| |@
  27.605 -  \___/ @
  27.606 -        @@
  27.607 -  _   _ @
  27.608 - (_)_(_)@
  27.609 -  / _` |@
  27.610 - | (_| |@
  27.611 -  \__,_|@
  27.612 -        @@
  27.613 -  _   _ @
  27.614 - (_)_(_)@
  27.615 -  / _ \ @
  27.616 - | (_) |@
  27.617 -  \___/ @
  27.618 -        @@
  27.619 -  _   _ @
  27.620 - (_) (_)@
  27.621 - | | | |@
  27.622 - | |_| |@
  27.623 -  \__,_|@
  27.624 -        @@
  27.625 -   ___ @
  27.626 -  / _ \@
  27.627 - | |/ /@
  27.628 - | |\ \@
  27.629 - | ||_/@
  27.630 - |_|   @@
  27.631 -160  NO-BREAK SPACE
  27.632 - $@
  27.633 - $@
  27.634 - $@
  27.635 - $@
  27.636 - $@
  27.637 - $@@
  27.638 -161  INVERTED EXCLAMATION MARK
  27.639 -  _ @
  27.640 - (_)@
  27.641 - | |@
  27.642 - | |@
  27.643 - |_|@
  27.644 -    @@
  27.645 -162  CENT SIGN
  27.646 -    _  @
  27.647 -   | | @
  27.648 -  / __)@
  27.649 - | (__ @
  27.650 -  \   )@
  27.651 -   |_| @@
  27.652 -163  POUND SIGN
  27.653 -    ___  @
  27.654 -   / ,_\ @
  27.655 - _| |_   @
  27.656 -  | |___ @
  27.657 - (_,____|@
  27.658 -         @@
  27.659 -164  CURRENCY SIGN
  27.660 - /\___/\@
  27.661 - \  _  /@
  27.662 - | (_) |@
  27.663 - / ___ \@
  27.664 - \/   \/@
  27.665 -        @@
  27.666 -165  YEN SIGN
  27.667 -  __ __ @
  27.668 -  \ V / @
  27.669 - |__ __|@
  27.670 - |__ __|@
  27.671 -   |_|  @
  27.672 -        @@
  27.673 -166  BROKEN BAR
  27.674 -  _ @
  27.675 - | |@
  27.676 - |_|@
  27.677 -  _ @
  27.678 - | |@
  27.679 - |_|@@
  27.680 -167  SECTION SIGN
  27.681 -    __ @
  27.682 -  _/ _)@
  27.683 - / \ \ @
  27.684 - \ \\ \@
  27.685 -  \ \_/@
  27.686 - (__/  @@
  27.687 -168  DIAERESIS
  27.688 -  _   _ @
  27.689 - (_) (_)@
  27.690 -  $   $ @
  27.691 -  $   $ @
  27.692 -  $   $ @
  27.693 -        @@
  27.694 -169  COPYRIGHT SIGN
  27.695 -    _____   @
  27.696 -   / ___ \  @
  27.697 -  / / __| \ @
  27.698 - | | (__   |@
  27.699 -  \ \___| / @
  27.700 -   \_____/  @@
  27.701 -170  FEMININE ORDINAL INDICATOR
  27.702 -  __ _ @
  27.703 - / _` |@
  27.704 - \__,_|@
  27.705 - |____|@
  27.706 -    $  @
  27.707 -       @@
  27.708 -171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  27.709 -   ____@
  27.710 -  / / /@
  27.711 - / / / @
  27.712 - \ \ \ @
  27.713 -  \_\_\@
  27.714 -       @@
  27.715 -172  NOT SIGN
  27.716 -        @
  27.717 -  _____ @
  27.718 - |___  |@
  27.719 -     |_|@
  27.720 -    $   @
  27.721 -        @@
  27.722 -173  SOFT HYPHEN
  27.723 -       @
  27.724 -       @
  27.725 -  ____ @
  27.726 - |____|@
  27.727 -    $  @
  27.728 -       @@
  27.729 -174  REGISTERED SIGN
  27.730 -    _____   @
  27.731 -   / ___ \  @
  27.732 -  / | _ \ \ @
  27.733 - |  |   /  |@
  27.734 -  \ |_|_\ / @
  27.735 -   \_____/  @@
  27.736 -175  MACRON
  27.737 -  _____ @
  27.738 - |_____|@
  27.739 -    $   @
  27.740 -    $   @
  27.741 -    $   @
  27.742 -        @@
  27.743 -176  DEGREE SIGN
  27.744 -   __  @
  27.745 -  /  \ @
  27.746 - | () |@
  27.747 -  \__/ @
  27.748 -    $  @
  27.749 -       @@
  27.750 -177  PLUS-MINUS SIGN
  27.751 -    _   @
  27.752 -  _| |_ @
  27.753 - |_   _|@
  27.754 -  _|_|_ @
  27.755 - |_____|@
  27.756 -        @@
  27.757 -178  SUPERSCRIPT TWO
  27.758 -  ___ @
  27.759 - |_  )@
  27.760 -  / / @
  27.761 - /___|@
  27.762 -   $  @
  27.763 -      @@
  27.764 -179  SUPERSCRIPT THREE
  27.765 -  ____@
  27.766 - |__ /@
  27.767 -  |_ \@
  27.768 - |___/@
  27.769 -   $  @
  27.770 -      @@
  27.771 -180  ACUTE ACCENT
  27.772 -  __@
  27.773 - /_/@
  27.774 -  $ @
  27.775 -  $ @
  27.776 -  $ @
  27.777 -    @@
  27.778 -181  MICRO SIGN
  27.779 -        @
  27.780 -  _   _ @
  27.781 - | | | |@
  27.782 - | |_| |@
  27.783 - | ._,_|@
  27.784 - |_|    @@
  27.785 -182  PILCROW SIGN
  27.786 -   _____ @
  27.787 -  /     |@
  27.788 - | (| | |@
  27.789 -  \__ | |@
  27.790 -    |_|_|@
  27.791 -         @@
  27.792 -183  MIDDLE DOT
  27.793 -    @
  27.794 -  _ @
  27.795 - (_)@
  27.796 -  $ @
  27.797 -  $ @
  27.798 -    @@
  27.799 -184  CEDILLA
  27.800 -    @
  27.801 -    @
  27.802 -    @
  27.803 -    @
  27.804 -  _ @
  27.805 - )_)@@
  27.806 -185  SUPERSCRIPT ONE
  27.807 -  _ @
  27.808 - / |@
  27.809 - | |@
  27.810 - |_|@
  27.811 -  $ @
  27.812 -    @@
  27.813 -186  MASCULINE ORDINAL INDICATOR
  27.814 -  ___ @
  27.815 - / _ \@
  27.816 - \___/@
  27.817 - |___|@
  27.818 -   $  @
  27.819 -      @@
  27.820 -187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  27.821 - ____  @
  27.822 - \ \ \ @
  27.823 -  \ \ \@
  27.824 -  / / /@
  27.825 - /_/_/ @
  27.826 -       @@
  27.827 -188  VULGAR FRACTION ONE QUARTER
  27.828 -  _   __    @
  27.829 - / | / / _  @
  27.830 - | |/ / | | @
  27.831 - |_/ /|_  _|@
  27.832 -  /_/   |_| @
  27.833 -            @@
  27.834 -189  VULGAR FRACTION ONE HALF
  27.835 -  _   __   @
  27.836 - / | / /__ @
  27.837 - | |/ /_  )@
  27.838 - |_/ / / / @
  27.839 -  /_/ /___|@
  27.840 -           @@
  27.841 -190  VULGAR FRACTION THREE QUARTERS
  27.842 -  ____  __    @
  27.843 - |__ / / / _  @
  27.844 -  |_ \/ / | | @
  27.845 - |___/ /|_  _|@
  27.846 -    /_/   |_| @
  27.847 -              @@
  27.848 -191  INVERTED QUESTION MARK
  27.849 -   _  @
  27.850 -  (_) @
  27.851 -  | | @
  27.852 - / /_ @
  27.853 - \___|@
  27.854 -      @@
  27.855 -192  LATIN CAPITAL LETTER A WITH GRAVE
  27.856 -   __   @
  27.857 -   \_\  @
  27.858 -   /_\  @
  27.859 -  / _ \ @
  27.860 - /_/ \_\@
  27.861 -        @@
  27.862 -193  LATIN CAPITAL LETTER A WITH ACUTE
  27.863 -    __  @
  27.864 -   /_/  @
  27.865 -   /_\  @
  27.866 -  / _ \ @
  27.867 - /_/ \_\@
  27.868 -        @@
  27.869 -194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  27.870 -   //\  @
  27.871 -  |/_\| @
  27.872 -   /_\  @
  27.873 -  / _ \ @
  27.874 - /_/ \_\@
  27.875 -        @@
  27.876 -195  LATIN CAPITAL LETTER A WITH TILDE
  27.877 -   /\/| @
  27.878 -  |/\/  @
  27.879 -   /_\  @
  27.880 -  / _ \ @
  27.881 - /_/ \_\@
  27.882 -        @@
  27.883 -196  LATIN CAPITAL LETTER A WITH DIAERESIS
  27.884 -  _   _ @
  27.885 - (_)_(_)@
  27.886 -   /_\  @
  27.887 -  / _ \ @
  27.888 - /_/ \_\@
  27.889 -        @@
  27.890 -197  LATIN CAPITAL LETTER A WITH RING ABOVE
  27.891 -    _   @
  27.892 -   (o)  @
  27.893 -   /_\  @
  27.894 -  / _ \ @
  27.895 - /_/ \_\@
  27.896 -        @@
  27.897 -198  LATIN CAPITAL LETTER AE
  27.898 -     ______ @
  27.899 -    /  ____|@
  27.900 -   / _  _|  @
  27.901 -  / __ |___ @
  27.902 - /_/ |_____|@
  27.903 -            @@
  27.904 -199  LATIN CAPITAL LETTER C WITH CEDILLA
  27.905 -   ____ @
  27.906 -  / ___|@
  27.907 - | |    @
  27.908 - | |___ @
  27.909 -  \____|@
  27.910 -    )_) @@
  27.911 -200  LATIN CAPITAL LETTER E WITH GRAVE
  27.912 -   __   @
  27.913 -  _\_\_ @
  27.914 - | ____|@
  27.915 - |  _|_ @
  27.916 - |_____|@
  27.917 -        @@
  27.918 -201  LATIN CAPITAL LETTER E WITH ACUTE
  27.919 -    __  @
  27.920 -  _/_/_ @
  27.921 - | ____|@
  27.922 - |  _|_ @
  27.923 - |_____|@
  27.924 -        @@
  27.925 -202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  27.926 -   //\  @
  27.927 -  |/_\| @
  27.928 - | ____|@
  27.929 - |  _|_ @
  27.930 - |_____|@
  27.931 -        @@
  27.932 -203  LATIN CAPITAL LETTER E WITH DIAERESIS
  27.933 -  _   _ @
  27.934 - (_)_(_)@
  27.935 - | ____|@
  27.936 - |  _|_ @
  27.937 - |_____|@
  27.938 -        @@
  27.939 -204  LATIN CAPITAL LETTER I WITH GRAVE
  27.940 -  __  @
  27.941 -  \_\ @
  27.942 - |_ _|@
  27.943 -  | | @
  27.944 - |___|@
  27.945 -      @@
  27.946 -205  LATIN CAPITAL LETTER I WITH ACUTE
  27.947 -   __ @
  27.948 -  /_/ @
  27.949 - |_ _|@
  27.950 -  | | @
  27.951 - |___|@
  27.952 -      @@
  27.953 -206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  27.954 -  //\ @
  27.955 - |/_\|@
  27.956 - |_ _|@
  27.957 -  | | @
  27.958 - |___|@
  27.959 -      @@
  27.960 -207  LATIN CAPITAL LETTER I WITH DIAERESIS
  27.961 -  _   _ @
  27.962 - (_)_(_)@
  27.963 -  |_ _| @
  27.964 -   | |  @
  27.965 -  |___| @
  27.966 -        @@
  27.967 -208  LATIN CAPITAL LETTER ETH
  27.968 -    ____  @
  27.969 -   |  _ \ @
  27.970 -  _| |_| |@
  27.971 - |__ __| |@
  27.972 -   |____/ @
  27.973 -          @@
  27.974 -209  LATIN CAPITAL LETTER N WITH TILDE
  27.975 -   /\/|@
  27.976 -  |/\/ @
  27.977 - | \| |@
  27.978 - | .` |@
  27.979 - |_|\_|@
  27.980 -       @@
  27.981 -210  LATIN CAPITAL LETTER O WITH GRAVE
  27.982 -   __   @
  27.983 -   \_\  @
  27.984 -  / _ \ @
  27.985 - | |_| |@
  27.986 -  \___/ @
  27.987 -        @@
  27.988 -211  LATIN CAPITAL LETTER O WITH ACUTE
  27.989 -    __  @
  27.990 -   /_/  @
  27.991 -  / _ \ @
  27.992 - | |_| |@
  27.993 -  \___/ @
  27.994 -        @@
  27.995 -212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  27.996 -   //\  @
  27.997 -  |/_\| @
  27.998 -  / _ \ @
  27.999 - | |_| |@
 27.1000 -  \___/ @
 27.1001 -        @@
 27.1002 -213  LATIN CAPITAL LETTER O WITH TILDE
 27.1003 -   /\/| @
 27.1004 -  |/\/  @
 27.1005 -  / _ \ @
 27.1006 - | |_| |@
 27.1007 -  \___/ @
 27.1008 -        @@
 27.1009 -214  LATIN CAPITAL LETTER O WITH DIAERESIS
 27.1010 -  _   _ @
 27.1011 - (_)_(_)@
 27.1012 -  / _ \ @
 27.1013 - | |_| |@
 27.1014 -  \___/ @
 27.1015 -        @@
 27.1016 -215  MULTIPLICATION SIGN
 27.1017 -     @
 27.1018 -     @
 27.1019 - /\/\@
 27.1020 - >  <@
 27.1021 - \/\/@
 27.1022 -     @@
 27.1023 -216  LATIN CAPITAL LETTER O WITH STROKE
 27.1024 -   ____ @
 27.1025 -  / _// @
 27.1026 - | |// |@
 27.1027 - | //| |@
 27.1028 -  //__/ @
 27.1029 -        @@
 27.1030 -217  LATIN CAPITAL LETTER U WITH GRAVE
 27.1031 -   __   @
 27.1032 -  _\_\_ @
 27.1033 - | | | |@
 27.1034 - | |_| |@
 27.1035 -  \___/ @
 27.1036 -        @@
 27.1037 -218  LATIN CAPITAL LETTER U WITH ACUTE
 27.1038 -    __  @
 27.1039 -  _/_/_ @
 27.1040 - | | | |@
 27.1041 - | |_| |@
 27.1042 -  \___/ @
 27.1043 -        @@
 27.1044 -219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 27.1045 -   //\  @
 27.1046 -  |/ \| @
 27.1047 - | | | |@
 27.1048 - | |_| |@
 27.1049 -  \___/ @
 27.1050 -        @@
 27.1051 -220  LATIN CAPITAL LETTER U WITH DIAERESIS
 27.1052 -  _   _ @
 27.1053 - (_) (_)@
 27.1054 - | | | |@
 27.1055 - | |_| |@
 27.1056 -  \___/ @
 27.1057 -        @@
 27.1058 -221  LATIN CAPITAL LETTER Y WITH ACUTE
 27.1059 -    __  @
 27.1060 - __/_/__@
 27.1061 - \ \ / /@
 27.1062 -  \ V / @
 27.1063 -   |_|  @
 27.1064 -        @@
 27.1065 -222  LATIN CAPITAL LETTER THORN
 27.1066 -  _     @
 27.1067 - | |___ @
 27.1068 - |  __ \@
 27.1069 - |  ___/@
 27.1070 - |_|    @
 27.1071 -        @@
 27.1072 -223  LATIN SMALL LETTER SHARP S
 27.1073 -   ___ @
 27.1074 -  / _ \@
 27.1075 - | |/ /@
 27.1076 - | |\ \@
 27.1077 - | ||_/@
 27.1078 - |_|   @@
 27.1079 -224  LATIN SMALL LETTER A WITH GRAVE
 27.1080 -   __   @
 27.1081 -   \_\_ @
 27.1082 -  / _` |@
 27.1083 - | (_| |@
 27.1084 -  \__,_|@
 27.1085 -        @@
 27.1086 -225  LATIN SMALL LETTER A WITH ACUTE
 27.1087 -    __  @
 27.1088 -   /_/_ @
 27.1089 -  / _` |@
 27.1090 - | (_| |@
 27.1091 -  \__,_|@
 27.1092 -        @@
 27.1093 -226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 27.1094 -   //\  @
 27.1095 -  |/_\| @
 27.1096 -  / _` |@
 27.1097 - | (_| |@
 27.1098 -  \__,_|@
 27.1099 -        @@
 27.1100 -227  LATIN SMALL LETTER A WITH TILDE
 27.1101 -   /\/| @
 27.1102 -  |/\/_ @
 27.1103 -  / _` |@
 27.1104 - | (_| |@
 27.1105 -  \__,_|@
 27.1106 -        @@
 27.1107 -228  LATIN SMALL LETTER A WITH DIAERESIS
 27.1108 -  _   _ @
 27.1109 - (_)_(_)@
 27.1110 -  / _` |@
 27.1111 - | (_| |@
 27.1112 -  \__,_|@
 27.1113 -        @@
 27.1114 -229  LATIN SMALL LETTER A WITH RING ABOVE
 27.1115 -    __  @
 27.1116 -   (()) @
 27.1117 -  / _ '|@
 27.1118 - | (_| |@
 27.1119 -  \__,_|@
 27.1120 -        @@
 27.1121 -230  LATIN SMALL LETTER AE
 27.1122 -           @
 27.1123 -   __ ____ @
 27.1124 -  / _`  _ \@
 27.1125 - | (_|  __/@
 27.1126 -  \__,____|@
 27.1127 -           @@
 27.1128 -231  LATIN SMALL LETTER C WITH CEDILLA
 27.1129 -       @
 27.1130 -   ___ @
 27.1131 -  / __|@
 27.1132 - | (__ @
 27.1133 -  \___|@
 27.1134 -   )_) @@
 27.1135 -232  LATIN SMALL LETTER E WITH GRAVE
 27.1136 -   __  @
 27.1137 -   \_\ @
 27.1138 -  / _ \@
 27.1139 - |  __/@
 27.1140 -  \___|@
 27.1141 -       @@
 27.1142 -233  LATIN SMALL LETTER E WITH ACUTE
 27.1143 -    __ @
 27.1144 -   /_/ @
 27.1145 -  / _ \@
 27.1146 - |  __/@
 27.1147 -  \___|@
 27.1148 -       @@
 27.1149 -234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 27.1150 -   //\ @
 27.1151 -  |/_\|@
 27.1152 -  / _ \@
 27.1153 - |  __/@
 27.1154 -  \___|@
 27.1155 -       @@
 27.1156 -235  LATIN SMALL LETTER E WITH DIAERESIS
 27.1157 -  _   _ @
 27.1158 - (_)_(_)@
 27.1159 -  / _ \ @
 27.1160 - |  __/ @
 27.1161 -  \___| @
 27.1162 -        @@
 27.1163 -236  LATIN SMALL LETTER I WITH GRAVE
 27.1164 - __ @
 27.1165 - \_\@
 27.1166 - | |@
 27.1167 - | |@
 27.1168 - |_|@
 27.1169 -    @@
 27.1170 -237  LATIN SMALL LETTER I WITH ACUTE
 27.1171 -  __@
 27.1172 - /_/@
 27.1173 - | |@
 27.1174 - | |@
 27.1175 - |_|@
 27.1176 -    @@
 27.1177 -238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 27.1178 -  //\ @
 27.1179 - |/_\|@
 27.1180 -  | | @
 27.1181 -  | | @
 27.1182 -  |_| @
 27.1183 -      @@
 27.1184 -239  LATIN SMALL LETTER I WITH DIAERESIS
 27.1185 -  _   _ @
 27.1186 - (_)_(_)@
 27.1187 -   | |  @
 27.1188 -   | |  @
 27.1189 -   |_|  @
 27.1190 -        @@
 27.1191 -240  LATIN SMALL LETTER ETH
 27.1192 -   /\/\ @
 27.1193 -   >  < @
 27.1194 -  _\/\ |@
 27.1195 - / __` |@
 27.1196 - \____/ @
 27.1197 -        @@
 27.1198 -241  LATIN SMALL LETTER N WITH TILDE
 27.1199 -   /\/| @
 27.1200 -  |/\/  @
 27.1201 - | '_ \ @
 27.1202 - | | | |@
 27.1203 - |_| |_|@
 27.1204 -        @@
 27.1205 -242  LATIN SMALL LETTER O WITH GRAVE
 27.1206 -   __   @
 27.1207 -   \_\  @
 27.1208 -  / _ \ @
 27.1209 - | (_) |@
 27.1210 -  \___/ @
 27.1211 -        @@
 27.1212 -243  LATIN SMALL LETTER O WITH ACUTE
 27.1213 -    __  @
 27.1214 -   /_/  @
 27.1215 -  / _ \ @
 27.1216 - | (_) |@
 27.1217 -  \___/ @
 27.1218 -        @@
 27.1219 -244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 27.1220 -   //\  @
 27.1221 -  |/_\| @
 27.1222 -  / _ \ @
 27.1223 - | (_) |@
 27.1224 -  \___/ @
 27.1225 -        @@
 27.1226 -245  LATIN SMALL LETTER O WITH TILDE
 27.1227 -   /\/| @
 27.1228 -  |/\/  @
 27.1229 -  / _ \ @
 27.1230 - | (_) |@
 27.1231 -  \___/ @
 27.1232 -        @@
 27.1233 -246  LATIN SMALL LETTER O WITH DIAERESIS
 27.1234 -  _   _ @
 27.1235 - (_)_(_)@
 27.1236 -  / _ \ @
 27.1237 - | (_) |@
 27.1238 -  \___/ @
 27.1239 -        @@
 27.1240 -247  DIVISION SIGN
 27.1241 -        @
 27.1242 -    _   @
 27.1243 -  _(_)_ @
 27.1244 - |_____|@
 27.1245 -   (_)  @
 27.1246 -        @@
 27.1247 -248  LATIN SMALL LETTER O WITH STROKE
 27.1248 -         @
 27.1249 -   ____  @
 27.1250 -  / _//\ @
 27.1251 - | (//) |@
 27.1252 -  \//__/ @
 27.1253 -         @@
 27.1254 -249  LATIN SMALL LETTER U WITH GRAVE
 27.1255 -   __   @
 27.1256 -  _\_\_ @
 27.1257 - | | | |@
 27.1258 - | |_| |@
 27.1259 -  \__,_|@
 27.1260 -        @@
 27.1261 -250  LATIN SMALL LETTER U WITH ACUTE
 27.1262 -    __  @
 27.1263 -  _/_/_ @
 27.1264 - | | | |@
 27.1265 - | |_| |@
 27.1266 -  \__,_|@
 27.1267 -        @@
 27.1268 -251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 27.1269 -   //\  @
 27.1270 -  |/ \| @
 27.1271 - | | | |@
 27.1272 - | |_| |@
 27.1273 -  \__,_|@
 27.1274 -        @@
 27.1275 -252  LATIN SMALL LETTER U WITH DIAERESIS
 27.1276 -  _   _ @
 27.1277 - (_) (_)@
 27.1278 - | | | |@
 27.1279 - | |_| |@
 27.1280 -  \__,_|@
 27.1281 -        @@
 27.1282 -253  LATIN SMALL LETTER Y WITH ACUTE
 27.1283 -    __  @
 27.1284 -  _/_/_ @
 27.1285 - | | | |@
 27.1286 - | |_| |@
 27.1287 -  \__, |@
 27.1288 -  |___/ @@
 27.1289 -254  LATIN SMALL LETTER THORN
 27.1290 -  _     @
 27.1291 - | |__  @
 27.1292 - | '_ \ @
 27.1293 - | |_) |@
 27.1294 - | .__/ @
 27.1295 - |_|    @@
 27.1296 -255  LATIN SMALL LETTER Y WITH DIAERESIS
 27.1297 -  _   _ @
 27.1298 - (_) (_)@
 27.1299 - | | | |@
 27.1300 - | |_| |@
 27.1301 -  \__, |@
 27.1302 -  |___/ @@
 27.1303 -0x0100  LATIN CAPITAL LETTER A WITH MACRON
 27.1304 -   ____ @
 27.1305 -  /___/ @
 27.1306 -   /_\  @
 27.1307 -  / _ \ @
 27.1308 - /_/ \_\@
 27.1309 -        @@
 27.1310 -0x0101  LATIN SMALL LETTER A WITH MACRON
 27.1311 -    ___ @
 27.1312 -   /_ _/@
 27.1313 -  / _` |@
 27.1314 - | (_| |@
 27.1315 -  \__,_|@
 27.1316 -        @@
 27.1317 -0x0102  LATIN CAPITAL LETTER A WITH BREVE
 27.1318 -  _   _ @
 27.1319 -  \\_// @
 27.1320 -   /_\  @
 27.1321 -  / _ \ @
 27.1322 - /_/ \_\@
 27.1323 -        @@
 27.1324 -0x0103  LATIN SMALL LETTER A WITH BREVE
 27.1325 -   \_/  @
 27.1326 -   ___  @
 27.1327 -  / _` |@
 27.1328 - | (_| |@
 27.1329 -  \__,_|@
 27.1330 -        @@
 27.1331 -0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 27.1332 -        @
 27.1333 -    _   @
 27.1334 -   /_\  @
 27.1335 -  / _ \ @
 27.1336 - /_/ \_\@
 27.1337 -     (_(@@
 27.1338 -0x0105  LATIN SMALL LETTER A WITH OGONEK
 27.1339 -        @
 27.1340 -   __ _ @
 27.1341 -  / _` |@
 27.1342 - | (_| |@
 27.1343 -  \__,_|@
 27.1344 -     (_(@@
 27.1345 -0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 27.1346 -     __ @
 27.1347 -   _/_/ @
 27.1348 -  / ___|@
 27.1349 - | |___ @
 27.1350 -  \____|@
 27.1351 -        @@
 27.1352 -0x0107  LATIN SMALL LETTER C WITH ACUTE
 27.1353 -    __ @
 27.1354 -   /__/@
 27.1355 -  / __|@
 27.1356 - | (__ @
 27.1357 -  \___|@
 27.1358 -       @@
 27.1359 -0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 27.1360 -     /\ @
 27.1361 -   _//\\@
 27.1362 -  / ___|@
 27.1363 - | |___ @
 27.1364 -  \____|@
 27.1365 -        @@
 27.1366 -0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 27.1367 -    /\ @
 27.1368 -   /_\ @
 27.1369 -  / __|@
 27.1370 - | (__ @
 27.1371 -  \___|@
 27.1372 -       @@
 27.1373 -0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 27.1374 -    []  @
 27.1375 -   ____ @
 27.1376 -  / ___|@
 27.1377 - | |___ @
 27.1378 -  \____|@
 27.1379 -        @@
 27.1380 -0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 27.1381 -   []  @
 27.1382 -   ___ @
 27.1383 -  / __|@
 27.1384 - | (__ @
 27.1385 -  \___|@
 27.1386 -       @@
 27.1387 -0x010C  LATIN CAPITAL LETTER C WITH CARON
 27.1388 -   \\// @
 27.1389 -   _\/_ @
 27.1390 -  / ___|@
 27.1391 - | |___ @
 27.1392 -  \____|@
 27.1393 -        @@
 27.1394 -0x010D  LATIN SMALL LETTER C WITH CARON
 27.1395 -   \\//@
 27.1396 -   _\/ @
 27.1397 -  / __|@
 27.1398 - | (__ @
 27.1399 -  \___|@
 27.1400 -       @@
 27.1401 -0x010E  LATIN CAPITAL LETTER D WITH CARON
 27.1402 -   \\// @
 27.1403 -  __\/  @
 27.1404 - |  _ \ @
 27.1405 - | |_| |@
 27.1406 - |____/ @
 27.1407 -        @@
 27.1408 -0x010F  LATIN SMALL LETTER D WITH CARON
 27.1409 -  \/  _ @
 27.1410 -   __| |@
 27.1411 -  / _` |@
 27.1412 - | (_| |@
 27.1413 -  \__,_|@
 27.1414 -        @@
 27.1415 -0x0110  LATIN CAPITAL LETTER D WITH STROKE
 27.1416 -   ____   @
 27.1417 -  |_ __ \ @
 27.1418 - /| |/ | |@
 27.1419 - /|_|/_| |@
 27.1420 -  |_____/ @
 27.1421 -          @@
 27.1422 -0x0111  LATIN SMALL LETTER D WITH STROKE
 27.1423 -    ---|@
 27.1424 -   __| |@
 27.1425 -  / _` |@
 27.1426 - | (_| |@
 27.1427 -  \__,_|@
 27.1428 -        @@
 27.1429 -0x0112  LATIN CAPITAL LETTER E WITH MACRON
 27.1430 -   ____ @
 27.1431 -  /___/ @
 27.1432 - | ____|@
 27.1433 - |  _|_ @
 27.1434 - |_____|@
 27.1435 -        @@
 27.1436 -0x0113  LATIN SMALL LETTER E WITH MACRON
 27.1437 -    ____@
 27.1438 -   /_ _/@
 27.1439 -  / _ \ @
 27.1440 - |  __/ @
 27.1441 -  \___| @
 27.1442 -        @@
 27.1443 -0x0114  LATIN CAPITAL LETTER E WITH BREVE
 27.1444 -  _   _ @
 27.1445 -  \\_// @
 27.1446 - | ____|@
 27.1447 - |  _|_ @
 27.1448 - |_____|@
 27.1449 -        @@
 27.1450 -0x0115  LATIN SMALL LETTER E WITH BREVE
 27.1451 -  \\  //@
 27.1452 -    --  @
 27.1453 -  / _ \ @
 27.1454 - |  __/ @
 27.1455 -  \___| @
 27.1456 -        @@
 27.1457 -0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 27.1458 -    []  @
 27.1459 -  _____ @
 27.1460 - | ____|@
 27.1461 - |  _|_ @
 27.1462 - |_____|@
 27.1463 -        @@
 27.1464 -0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 27.1465 -    [] @
 27.1466 -    __ @
 27.1467 -  / _ \@
 27.1468 - |  __/@
 27.1469 -  \___|@
 27.1470 -       @@
 27.1471 -0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 27.1472 -        @
 27.1473 -  _____ @
 27.1474 - | ____|@
 27.1475 - |  _|_ @
 27.1476 - |_____|@
 27.1477 -    (__(@@
 27.1478 -0x0119  LATIN SMALL LETTER E WITH OGONEK
 27.1479 -       @
 27.1480 -   ___ @
 27.1481 -  / _ \@
 27.1482 - |  __/@
 27.1483 -  \___|@
 27.1484 -    (_(@@
 27.1485 -0x011A  LATIN CAPITAL LETTER E WITH CARON
 27.1486 -   \\// @
 27.1487 -  __\/_ @
 27.1488 - | ____|@
 27.1489 - |  _|_ @
 27.1490 - |_____|@
 27.1491 -        @@
 27.1492 -0x011B  LATIN SMALL LETTER E WITH CARON
 27.1493 -   \\//@
 27.1494 -    \/ @
 27.1495 -  / _ \@
 27.1496 - |  __/@
 27.1497 -  \___|@
 27.1498 -       @@
 27.1499 -0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 27.1500 -   _/\_ @
 27.1501 -  / ___|@
 27.1502 - | |  _ @
 27.1503 - | |_| |@
 27.1504 -  \____|@
 27.1505 -        @@
 27.1506 -0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 27.1507 -     /\ @
 27.1508 -   _/_ \@
 27.1509 -  / _` |@
 27.1510 - | (_| |@
 27.1511 -  \__, |@
 27.1512 -  |___/ @@
 27.1513 -0x011E  LATIN CAPITAL LETTER G WITH BREVE
 27.1514 -   _\/_ @
 27.1515 -  / ___|@
 27.1516 - | |  _ @
 27.1517 - | |_| |@
 27.1518 -  \____|@
 27.1519 -        @@
 27.1520 -0x011F  LATIN SMALL LETTER G WITH BREVE
 27.1521 -  \___/ @
 27.1522 -   __ _ @
 27.1523 -  / _` |@
 27.1524 - | (_| |@
 27.1525 -  \__, |@
 27.1526 -  |___/ @@
 27.1527 -0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 27.1528 -   _[]_ @
 27.1529 -  / ___|@
 27.1530 - | |  _ @
 27.1531 - | |_| |@
 27.1532 -  \____|@
 27.1533 -        @@
 27.1534 -0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 27.1535 -   []   @
 27.1536 -   __ _ @
 27.1537 -  / _` |@
 27.1538 - | (_| |@
 27.1539 -  \__, |@
 27.1540 -  |___/ @@
 27.1541 -0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 27.1542 -   ____ @
 27.1543 -  / ___|@
 27.1544 - | |  _ @
 27.1545 - | |_| |@
 27.1546 -  \____|@
 27.1547 -   )__) @@
 27.1548 -0x0123  LATIN SMALL LETTER G WITH CEDILLA
 27.1549 -        @
 27.1550 -   __ _ @
 27.1551 -  / _` |@
 27.1552 - | (_| |@
 27.1553 -  \__, |@
 27.1554 -  |_))))@@
 27.1555 -0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 27.1556 -  _/ \_ @
 27.1557 - | / \ |@
 27.1558 - | |_| |@
 27.1559 - |  _  |@
 27.1560 - |_| |_|@
 27.1561 -        @@
 27.1562 -0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 27.1563 -  _  /\ @
 27.1564 - | |//\ @
 27.1565 - | '_ \ @
 27.1566 - | | | |@
 27.1567 - |_| |_|@
 27.1568 -        @@
 27.1569 -0x0126  LATIN CAPITAL LETTER H WITH STROKE
 27.1570 -  _   _ @
 27.1571 - | |=| |@
 27.1572 - | |_| |@
 27.1573 - |  _  |@
 27.1574 - |_| |_|@
 27.1575 -        @@
 27.1576 -0x0127  LATIN SMALL LETTER H WITH STROKE
 27.1577 -  _     @
 27.1578 - |=|__  @
 27.1579 - | '_ \ @
 27.1580 - | | | |@
 27.1581 - |_| |_|@
 27.1582 -        @@
 27.1583 -0x0128  LATIN CAPITAL LETTER I WITH TILDE
 27.1584 -  /\//@
 27.1585 - |_ _|@
 27.1586 -  | | @
 27.1587 -  | | @
 27.1588 - |___|@
 27.1589 -      @@
 27.1590 -0x0129  LATIN SMALL LETTER I WITH TILDE
 27.1591 -    @
 27.1592 - /\/@
 27.1593 - | |@
 27.1594 - | |@
 27.1595 - |_|@
 27.1596 -    @@
 27.1597 -0x012A  LATIN CAPITAL LETTER I WITH MACRON
 27.1598 - /___/@
 27.1599 - |_ _|@
 27.1600 -  | | @
 27.1601 -  | | @
 27.1602 - |___|@
 27.1603 -      @@
 27.1604 -0x012B  LATIN SMALL LETTER I WITH MACRON
 27.1605 -  ____@
 27.1606 - /___/@
 27.1607 -  | | @
 27.1608 -  | | @
 27.1609 -  |_| @
 27.1610 -      @@
 27.1611 -0x012C  LATIN CAPITAL LETTER I WITH BREVE
 27.1612 -  \__/@
 27.1613 - |_ _|@
 27.1614 -  | | @
 27.1615 -  | | @
 27.1616 - |___|@
 27.1617 -      @@
 27.1618 -0x012D  LATIN SMALL LETTER I WITH BREVE
 27.1619 -    @
 27.1620 - \_/@
 27.1621 - | |@
 27.1622 - | |@
 27.1623 - |_|@
 27.1624 -    @@
 27.1625 -0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 27.1626 -  ___ @
 27.1627 - |_ _|@
 27.1628 -  | | @
 27.1629 -  | | @
 27.1630 - |___|@
 27.1631 -  (__(@@
 27.1632 -0x012F  LATIN SMALL LETTER I WITH OGONEK
 27.1633 -  _  @
 27.1634 - (_) @
 27.1635 - | | @
 27.1636 - | | @
 27.1637 - |_|_@
 27.1638 -  (_(@@
 27.1639 -0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 27.1640 -  _[] @
 27.1641 - |_ _|@
 27.1642 -  | | @
 27.1643 -  | | @
 27.1644 - |___|@
 27.1645 -      @@
 27.1646 -0x0131  LATIN SMALL LETTER DOTLESS I
 27.1647 -    @
 27.1648 -  _ @
 27.1649 - | |@
 27.1650 - | |@
 27.1651 - |_|@
 27.1652 -    @@
 27.1653 -0x0132  LATIN CAPITAL LIGATURE IJ
 27.1654 -  ___  _ @
 27.1655 - |_ _|| |@
 27.1656 -  | | | |@
 27.1657 -  | |_| |@
 27.1658 - |__|__/ @
 27.1659 -         @@
 27.1660 -0x0133  LATIN SMALL LIGATURE IJ
 27.1661 -  _   _ @
 27.1662 - (_) (_)@
 27.1663 - | | | |@
 27.1664 - | | | |@
 27.1665 - |_|_/ |@
 27.1666 -   |__/ @@
 27.1667 -0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 27.1668 -      /\ @
 27.1669 -     /_\|@
 27.1670 -  _  | | @
 27.1671 - | |_| | @
 27.1672 -  \___/  @
 27.1673 -         @@
 27.1674 -0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 27.1675 -    /\@
 27.1676 -   /_\@
 27.1677 -   | |@
 27.1678 -   | |@
 27.1679 -  _/ |@
 27.1680 - |__/ @@
 27.1681 -0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 27.1682 -  _  _  @
 27.1683 - | |/ / @
 27.1684 - | ' /  @
 27.1685 - | . \  @
 27.1686 - |_|\_\ @
 27.1687 -    )__)@@
 27.1688 -0x0137  LATIN SMALL LETTER K WITH CEDILLA
 27.1689 -  _    @
 27.1690 - | | __@
 27.1691 - | |/ /@
 27.1692 - |   < @
 27.1693 - |_|\_\@
 27.1694 -    )_)@@
 27.1695 -0x0138  LATIN SMALL LETTER KRA
 27.1696 -       @
 27.1697 -  _ __ @
 27.1698 - | |/ \@
 27.1699 - |   < @
 27.1700 - |_|\_\@
 27.1701 -       @@
 27.1702 -0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 27.1703 -  _   //@
 27.1704 - | | // @
 27.1705 - | |    @
 27.1706 - | |___ @
 27.1707 - |_____|@
 27.1708 -        @@
 27.1709 -0x013A  LATIN SMALL LETTER L WITH ACUTE
 27.1710 -  //@
 27.1711 - | |@
 27.1712 - | |@
 27.1713 - | |@
 27.1714 - |_|@
 27.1715 -    @@
 27.1716 -0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 27.1717 -  _     @
 27.1718 - | |    @
 27.1719 - | |    @
 27.1720 - | |___ @
 27.1721 - |_____|@
 27.1722 -    )__)@@
 27.1723 -0x013C  LATIN SMALL LETTER L WITH CEDILLA
 27.1724 -  _   @
 27.1725 - | |  @
 27.1726 - | |  @
 27.1727 - | |  @
 27.1728 - |_|  @
 27.1729 -   )_)@@
 27.1730 -0x013D  LATIN CAPITAL LETTER L WITH CARON
 27.1731 -  _ \\//@
 27.1732 - | | \/ @
 27.1733 - | |    @
 27.1734 - | |___ @
 27.1735 - |_____|@
 27.1736 -        @@
 27.1737 -0x013E  LATIN SMALL LETTER L WITH CARON
 27.1738 -  _ \\//@
 27.1739 - | | \/ @
 27.1740 - | |    @
 27.1741 - | |    @
 27.1742 - |_|    @
 27.1743 -        @@
 27.1744 -0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 27.1745 -  _     @
 27.1746 - | |    @
 27.1747 - | | [] @
 27.1748 - | |___ @
 27.1749 - |_____|@
 27.1750 -        @@
 27.1751 -0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 27.1752 -  _    @
 27.1753 - | |   @
 27.1754 - | | []@
 27.1755 - | |   @
 27.1756 - |_|   @
 27.1757 -       @@
 27.1758 -0x0141  LATIN CAPITAL LETTER L WITH STROKE
 27.1759 -  __    @
 27.1760 - | //   @
 27.1761 - |//|   @
 27.1762 - // |__ @
 27.1763 - |_____|@
 27.1764 -        @@
 27.1765 -0x0142  LATIN SMALL LETTER L WITH STROKE
 27.1766 -  _ @
 27.1767 - | |@
 27.1768 - |//@
 27.1769 - //|@
 27.1770 - |_|@
 27.1771 -    @@
 27.1772 -0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 27.1773 -  _/ /_ @
 27.1774 - | \ | |@
 27.1775 - |  \| |@
 27.1776 - | |\  |@
 27.1777 - |_| \_|@
 27.1778 -        @@
 27.1779 -0x0144  LATIN SMALL LETTER N WITH ACUTE
 27.1780 -     _  @
 27.1781 -  _ /_/ @
 27.1782 - | '_ \ @
 27.1783 - | | | |@
 27.1784 - |_| |_|@
 27.1785 -        @@
 27.1786 -0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 27.1787 -  _   _ @
 27.1788 - | \ | |@
 27.1789 - |  \| |@
 27.1790 - | |\  |@
 27.1791 - |_| \_|@
 27.1792 - )_)    @@
 27.1793 -0x0146  LATIN SMALL LETTER N WITH CEDILLA
 27.1794 -        @
 27.1795 -  _ __  @
 27.1796 - | '_ \ @
 27.1797 - | | | |@
 27.1798 - |_| |_|@
 27.1799 - )_)    @@
 27.1800 -0x0147  LATIN CAPITAL LETTER N WITH CARON
 27.1801 -  _\/ _ @
 27.1802 - | \ | |@
 27.1803 - |  \| |@
 27.1804 - | |\  |@
 27.1805 - |_| \_|@
 27.1806 -        @@
 27.1807 -0x0148  LATIN SMALL LETTER N WITH CARON
 27.1808 -  \\//  @
 27.1809 -  _\/_  @
 27.1810 - | '_ \ @
 27.1811 - | | | |@
 27.1812 - |_| |_|@
 27.1813 -        @@
 27.1814 -0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 27.1815 -          @
 27.1816 -  _  __   @
 27.1817 - ( )| '_\ @
 27.1818 - |/| | | |@
 27.1819 -   |_| |_|@
 27.1820 -          @@
 27.1821 -0x014A  LATIN CAPITAL LETTER ENG
 27.1822 -  _   _ @
 27.1823 - | \ | |@
 27.1824 - |  \| |@
 27.1825 - | |\  |@
 27.1826 - |_| \ |@
 27.1827 -     )_)@@
 27.1828 -0x014B  LATIN SMALL LETTER ENG
 27.1829 -  _ __  @
 27.1830 - | '_ \ @
 27.1831 - | | | |@
 27.1832 - |_| | |@
 27.1833 -     | |@
 27.1834 -    |__ @@
 27.1835 -0x014C  LATIN CAPITAL LETTER O WITH MACRON
 27.1836 -   ____ @
 27.1837 -  /_ _/ @
 27.1838 -  / _ \ @
 27.1839 - | (_) |@
 27.1840 -  \___/ @
 27.1841 -        @@
 27.1842 -0x014D  LATIN SMALL LETTER O WITH MACRON
 27.1843 -   ____ @
 27.1844 -  /_ _/ @
 27.1845 -  / _ \ @
 27.1846 - | (_) |@
 27.1847 -  \___/ @
 27.1848 -        @@
 27.1849 -0x014E  LATIN CAPITAL LETTER O WITH BREVE
 27.1850 -  \   / @
 27.1851 -   _-_  @
 27.1852 -  / _ \ @
 27.1853 - | |_| |@
 27.1854 -  \___/ @
 27.1855 -        @@
 27.1856 -0x014F  LATIN SMALL LETTER O WITH BREVE
 27.1857 -  \   / @
 27.1858 -   _-_  @
 27.1859 -  / _ \ @
 27.1860 - | |_| |@
 27.1861 -  \___/ @
 27.1862 -        @@
 27.1863 -0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 27.1864 -    ___ @
 27.1865 -   /_/_/@
 27.1866 -  / _ \ @
 27.1867 - | |_| |@
 27.1868 -  \___/ @
 27.1869 -        @@
 27.1870 -0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 27.1871 -    ___ @
 27.1872 -   /_/_/@
 27.1873 -  / _ \ @
 27.1874 - | |_| |@
 27.1875 -  \___/ @
 27.1876 -        @@
 27.1877 -0x0152  LATIN CAPITAL LIGATURE OE
 27.1878 -   ___  ___ @
 27.1879 -  / _ \| __|@
 27.1880 - | | | |  | @
 27.1881 - | |_| | |__@
 27.1882 -  \___/|____@
 27.1883 -            @@
 27.1884 -0x0153  LATIN SMALL LIGATURE OE
 27.1885 -             @
 27.1886 -   ___   ___ @
 27.1887 -  / _ \ / _ \@
 27.1888 - | (_) |  __/@
 27.1889 -  \___/ \___|@
 27.1890 -             @@
 27.1891 -0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 27.1892 -  _/_/  @
 27.1893 - |  _ \ @
 27.1894 - | |_) |@
 27.1895 - |  _ < @
 27.1896 - |_| \_\@
 27.1897 -        @@
 27.1898 -0x0155  LATIN SMALL LETTER R WITH ACUTE
 27.1899 -     __@
 27.1900 -  _ /_/@
 27.1901 - | '__|@
 27.1902 - | |   @
 27.1903 - |_|   @
 27.1904 -       @@
 27.1905 -0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 27.1906 -  ____  @
 27.1907 - |  _ \ @
 27.1908 - | |_) |@
 27.1909 - |  _ < @
 27.1910 - |_| \_\@
 27.1911 - )_)    @@
 27.1912 -0x0157  LATIN SMALL LETTER R WITH CEDILLA
 27.1913 -       @
 27.1914 -  _ __ @
 27.1915 - | '__|@
 27.1916 - | |   @
 27.1917 - |_|   @
 27.1918 -   )_) @@
 27.1919 -0x0158  LATIN CAPITAL LETTER R WITH CARON
 27.1920 -  _\_/  @
 27.1921 - |  _ \ @
 27.1922 - | |_) |@
 27.1923 - |  _ < @
 27.1924 - |_| \_\@
 27.1925 -        @@
 27.1926 -0x0159  LATIN SMALL LETTER R WITH CARON
 27.1927 -  \\// @
 27.1928 -  _\/_ @
 27.1929 - | '__|@
 27.1930 - | |   @
 27.1931 - |_|   @
 27.1932 -       @@
 27.1933 -0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 27.1934 -  _/_/  @
 27.1935 - / ___| @
 27.1936 - \___ \ @
 27.1937 -  ___) |@
 27.1938 - |____/ @
 27.1939 -        @@
 27.1940 -0x015B  LATIN SMALL LETTER S WITH ACUTE
 27.1941 -    __@
 27.1942 -  _/_/@
 27.1943 - / __|@
 27.1944 - \__ \@
 27.1945 - |___/@
 27.1946 -      @@
 27.1947 -0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 27.1948 -  _/\_  @
 27.1949 - / ___| @
 27.1950 - \___ \ @
 27.1951 -  ___) |@
 27.1952 - |____/ @
 27.1953 -        @@
 27.1954 -0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 27.1955 -      @
 27.1956 -  /_\_@
 27.1957 - / __|@
 27.1958 - \__ \@
 27.1959 - |___/@
 27.1960 -      @@
 27.1961 -0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 27.1962 -  ____  @
 27.1963 - / ___| @
 27.1964 - \___ \ @
 27.1965 -  ___) |@
 27.1966 - |____/ @
 27.1967 -    )__)@@
 27.1968 -0x015F  LATIN SMALL LETTER S WITH CEDILLA
 27.1969 -      @
 27.1970 -  ___ @
 27.1971 - / __|@
 27.1972 - \__ \@
 27.1973 - |___/@
 27.1974 -   )_)@@
 27.1975 -0x0160  LATIN CAPITAL LETTER S WITH CARON
 27.1976 -  _\_/  @
 27.1977 - / ___| @
 27.1978 - \___ \ @
 27.1979 -  ___) |@
 27.1980 - |____/ @
 27.1981 -        @@
 27.1982 -0x0161  LATIN SMALL LETTER S WITH CARON
 27.1983 -  \\//@
 27.1984 -  _\/ @
 27.1985 - / __|@
 27.1986 - \__ \@
 27.1987 - |___/@
 27.1988 -      @@
 27.1989 -0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 27.1990 -  _____ @
 27.1991 - |_   _|@
 27.1992 -   | |  @
 27.1993 -   | |  @
 27.1994 -   |_|  @
 27.1995 -    )__)@@
 27.1996 -0x0163  LATIN SMALL LETTER T WITH CEDILLA
 27.1997 -  _   @
 27.1998 - | |_ @
 27.1999 - | __|@
 27.2000 - | |_ @
 27.2001 -  \__|@
 27.2002 -   )_)@@
 27.2003 -0x0164  LATIN CAPITAL LETTER T WITH CARON
 27.2004 -  _____ @
 27.2005 - |_   _|@
 27.2006 -   | |  @
 27.2007 -   | |  @
 27.2008 -   |_|  @
 27.2009 -        @@
 27.2010 -0x0165  LATIN SMALL LETTER T WITH CARON
 27.2011 -  \/  @
 27.2012 - | |_ @
 27.2013 - | __|@
 27.2014 - | |_ @
 27.2015 -  \__|@
 27.2016 -      @@
 27.2017 -0x0166  LATIN CAPITAL LETTER T WITH STROKE
 27.2018 -  _____ @
 27.2019 - |_   _|@
 27.2020 -   | |  @
 27.2021 -  -|-|- @
 27.2022 -   |_|  @
 27.2023 -        @@
 27.2024 -0x0167  LATIN SMALL LETTER T WITH STROKE
 27.2025 -  _   @
 27.2026 - | |_ @
 27.2027 - | __|@
 27.2028 - |-|_ @
 27.2029 -  \__|@
 27.2030 -      @@
 27.2031 -0x0168  LATIN CAPITAL LETTER U WITH TILDE
 27.2032 -        @
 27.2033 -  _/\/_ @
 27.2034 - | | | |@
 27.2035 - | |_| |@
 27.2036 -  \___/ @
 27.2037 -        @@
 27.2038 -0x0169  LATIN SMALL LETTER U WITH TILDE
 27.2039 -        @
 27.2040 -  _/\/_ @
 27.2041 - | | | |@
 27.2042 - | |_| |@
 27.2043 -  \__,_|@
 27.2044 -        @@
 27.2045 -0x016A  LATIN CAPITAL LETTER U WITH MACRON
 27.2046 -   ____ @
 27.2047 -  /__ _/@
 27.2048 - | | | |@
 27.2049 - | |_| |@
 27.2050 -  \___/ @
 27.2051 -        @@
 27.2052 -0x016B  LATIN SMALL LETTER U WITH MACRON
 27.2053 -   ____ @
 27.2054 -  / _  /@
 27.2055 - | | | |@
 27.2056 - | |_| |@
 27.2057 -  \__,_|@
 27.2058 -        @@
 27.2059 -0x016C  LATIN CAPITAL LETTER U WITH BREVE
 27.2060 -        @
 27.2061 -   \_/_ @
 27.2062 - | | | |@
 27.2063 - | |_| |@
 27.2064 -  \____|@
 27.2065 -        @@
 27.2066 -0x016D  LATIN SMALL LETTER U WITH BREVE
 27.2067 -        @
 27.2068 -   \_/_ @
 27.2069 - | | | |@
 27.2070 - | |_| |@
 27.2071 -  \__,_|@
 27.2072 -        @@
 27.2073 -0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 27.2074 -    O   @
 27.2075 -  __  _ @
 27.2076 - | | | |@
 27.2077 - | |_| |@
 27.2078 -  \___/ @
 27.2079 -        @@
 27.2080 -0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 27.2081 -    O   @
 27.2082 -  __ __ @
 27.2083 - | | | |@
 27.2084 - | |_| |@
 27.2085 -  \__,_|@
 27.2086 -        @@
 27.2087 -0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 27.2088 -   -- --@
 27.2089 -  /_//_/@
 27.2090 - | | | |@
 27.2091 - | |_| |@
 27.2092 -  \___/ @
 27.2093 -        @@
 27.2094 -0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 27.2095 -    ____@
 27.2096 -  _/_/_/@
 27.2097 - | | | |@
 27.2098 - | |_| |@
 27.2099 -  \__,_|@
 27.2100 -        @@
 27.2101 -0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 27.2102 -  _   _ @
 27.2103 - | | | |@
 27.2104 - | | | |@
 27.2105 - | |_| |@
 27.2106 -  \___/ @
 27.2107 -    (__(@@
 27.2108 -0x0173  LATIN SMALL LETTER U WITH OGONEK
 27.2109 -        @
 27.2110 -  _   _ @
 27.2111 - | | | |@
 27.2112 - | |_| |@
 27.2113 -  \__,_|@
 27.2114 -     (_(@@
 27.2115 -0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 27.2116 - __    /\  __@
 27.2117 - \ \  //\\/ /@
 27.2118 -  \ \ /\ / / @
 27.2119 -   \ V  V /  @
 27.2120 -    \_/\_/   @
 27.2121 -             @@
 27.2122 -0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 27.2123 -      /\   @
 27.2124 - __  //\\__@
 27.2125 - \ \ /\ / /@
 27.2126 -  \ V  V / @
 27.2127 -   \_/\_/  @
 27.2128 -           @@
 27.2129 -0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 27.2130 -    /\  @
 27.2131 - __//\\ @
 27.2132 - \ \ / /@
 27.2133 -  \ V / @
 27.2134 -   |_|  @
 27.2135 -        @@
 27.2136 -0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 27.2137 -    /\  @
 27.2138 -   //\\ @
 27.2139 - | | | |@
 27.2140 - | |_| |@
 27.2141 -  \__, |@
 27.2142 -  |___/ @@
 27.2143 -0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 27.2144 -  []  []@
 27.2145 - __    _@
 27.2146 - \ \ / /@
 27.2147 -  \ V / @
 27.2148 -   |_|  @
 27.2149 -        @@
 27.2150 -0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 27.2151 -  __/_/@
 27.2152 - |__  /@
 27.2153 -   / / @
 27.2154 -  / /_ @
 27.2155 - /____|@
 27.2156 -       @@
 27.2157 -0x017A  LATIN SMALL LETTER Z WITH ACUTE
 27.2158 -    _ @
 27.2159 -  _/_/@
 27.2160 - |_  /@
 27.2161 -  / / @
 27.2162 - /___|@
 27.2163 -      @@
 27.2164 -0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 27.2165 -  __[]_@
 27.2166 - |__  /@
 27.2167 -   / / @
 27.2168 -  / /_ @
 27.2169 - /____|@
 27.2170 -       @@
 27.2171 -0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 27.2172 -   [] @
 27.2173 -  ____@
 27.2174 - |_  /@
 27.2175 -  / / @
 27.2176 - /___|@
 27.2177 -      @@
 27.2178 -0x017D  LATIN CAPITAL LETTER Z WITH CARON
 27.2179 -  _\_/_@
 27.2180 - |__  /@
 27.2181 -   / / @
 27.2182 -  / /_ @
 27.2183 - /____|@
 27.2184 -       @@
 27.2185 -0x017E  LATIN SMALL LETTER Z WITH CARON
 27.2186 -  \\//@
 27.2187 -  _\/_@
 27.2188 - |_  /@
 27.2189 -  / / @
 27.2190 - /___|@
 27.2191 -      @@
 27.2192 -0x017F  LATIN SMALL LETTER LONG S
 27.2193 -     __ @
 27.2194 -    / _|@
 27.2195 - |-| |  @
 27.2196 - |-| |  @
 27.2197 -   |_|  @
 27.2198 -        @@
 27.2199 -0x02C7  CARON
 27.2200 - \\//@
 27.2201 -  \/ @
 27.2202 -    $@
 27.2203 -    $@
 27.2204 -    $@
 27.2205 -    $@@
 27.2206 -0x02D8  BREVE
 27.2207 - \\_//@
 27.2208 -  \_/ @
 27.2209 -     $@
 27.2210 -     $@
 27.2211 -     $@
 27.2212 -     $@@
 27.2213 -0x02D9  DOT ABOVE
 27.2214 - []@
 27.2215 -  $@
 27.2216 -  $@
 27.2217 -  $@
 27.2218 -  $@
 27.2219 -  $@@
 27.2220 -0x02DB  OGONEK
 27.2221 -    $@
 27.2222 -    $@
 27.2223 -    $@
 27.2224 -    $@
 27.2225 -    $@
 27.2226 - )_) @@
 27.2227 -0x02DD  DOUBLE ACUTE ACCENT
 27.2228 -  _ _ @
 27.2229 - /_/_/@
 27.2230 -     $@
 27.2231 -     $@
 27.2232 -     $@
 27.2233 -     $@@