ia64/xen-unstable

changeset 1734:cafda17c0350

bitkeeper revision 1.1062.1.1 (40f00372K2jgGqY_Vwj24Lvaf0UqRw)

Rewritten bootstrap Elf-header creation to allow encapsulation of x86-64
code for 32-bit bootloaders.
author kaf24@scramble.cl.cam.ac.uk
date Sat Jul 10 14:55:46 2004 +0000 (2004-07-10)
parents 7f9e7fa78545
children d1de906154d3 84c0e1e3773f
files .rootkeys BitKeeper/etc/ignore xen/Makefile xen/arch/x86/Makefile xen/arch/x86/boot/mkelf32.c xen/figlet/LICENSE xen/figlet/Makefile xen/figlet/README xen/figlet/figlet.c xen/figlet/xen.flf 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 15:13:35 2004 +0000
     1.2 +++ b/.rootkeys	Sat Jul 10 14:55:46 2004 +0000
     1.3 @@ -315,6 +315,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 @@ -396,6 +397,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 @@ -530,10 +536,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 15:13:35 2004 +0000
     2.2 +++ b/BitKeeper/etc/ignore	Sat Jul 10 14:55:46 2004 +0000
     2.3 @@ -21,14 +21,14 @@ 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.*
     3.1 --- a/xen/Makefile	Fri Jul 09 15:13:35 2004 +0000
     3.2 +++ b/xen/Makefile	Sat Jul 10 14:55:46 2004 +0000
     3.3 @@ -27,14 +27,13 @@ dist: $(TARGET)
     3.4  	$(MAKE) prefix=`pwd`/../install dist=yes install
     3.5  
     3.6  clean: delete-links
     3.7 -	$(MAKE) -C tools clean
     3.8 +	$(MAKE) -C figlet clean
     3.9  	$(MAKE) -C common clean
    3.10  	$(MAKE) -C drivers clean
    3.11  	$(MAKE) -C arch/$(TARGET_ARCH) clean
    3.12  	rm -f *.o $(TARGET)* *~ core $(GENERATED_FILES)
    3.13  
    3.14  $(TARGET): delete-unfresh-files make-links $(GENERATED_FILES)
    3.15 -	$(MAKE) -C tools
    3.16  	$(MAKE) -C common
    3.17  	$(MAKE) -C drivers
    3.18  	$(MAKE) -C arch/$(TARGET_ARCH)
    3.19 @@ -65,7 +64,7 @@ include/xen/compile.h:
    3.20  	@LANG=C echo \#define XEN_EXTRAVERSION \"$(XEN_EXTRAVERSION)\" >> $@
    3.21  	@LANG=C echo >> $@
    3.22  	@LANG=C echo \#define XEN_BANNER \\ >> $@
    3.23 -	cd tools/figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ && cd ../..
    3.24 +	cd ./figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../$@ && cd ..
    3.25  	@LANG=C echo >> $@
    3.26  
    3.27  .PHONY: $(GENERATED_FILES) make-links delete-links default 
     4.1 --- a/xen/arch/x86/Makefile	Fri Jul 09 15:13:35 2004 +0000
     4.2 +++ b/xen/arch/x86/Makefile	Sat Jul 10 14:55:46 2004 +0000
     4.3 @@ -9,30 +9,16 @@ endif
     4.4  OBJS += $(patsubst %.S,%.o,$(wildcard $(TARGET_SUBARCH)/*.S))
     4.5  OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
     4.6  
     4.7 -ifeq ($(TARGET_SUBARCH),x86_32)
     4.8 -LINK_BASE := 0xFC500000 # Xen is linked here
     4.9 -LOAD_BASE := 0x00100000 # Xen is loaded here
    4.10 -endif
    4.11 -
    4.12 -ifeq ($(TARGET_SUBARCH),x86_64)
    4.13 -LINK_BASE := 0xFFFF830000100000 # Xen is linked here
    4.14 -LOAD_BASE := 0x0000000000100000 # Xen is loaded here
    4.15 -endif
    4.16 -
    4.17 -# What happens here? We link object files together, starting at LINK_BASE
    4.18 -# (a very high address). But the bootloader cannot put things there, so we
    4.19 -# initially load at LOAD_BASE. A tool called `elf-reloc' is used to modify
    4.20 -# segment offsets from LINK_BASE-relative to LOAD_BASE-relative.
    4.21 -# (NB. Linux gets round this by turning its image into raw binary, then 
    4.22 -# wrapping that with a low-memory bootstrapper.)
    4.23 -default: boot/$(TARGET_SUBARCH).o $(OBJS)
    4.24 +default: boot/$(TARGET_SUBARCH).o $(OBJS) boot/mkelf32
    4.25  	$(LD) $(LDFLAGS) -r -o arch.o $(OBJS)
    4.26  	$(LD) $(LDFLAGS) -T $(TARGET_SUBARCH)/xen.lds -N \
    4.27  	    boot/$(TARGET_SUBARCH).o $(ALL_OBJS) -o $(TARGET)-syms
    4.28 -	objcopy -R .note -R .comment -S $(TARGET)-syms $(TARGET)
    4.29 -	$(BASEDIR)/tools/elf-reloc $(LINK_BASE) $(LOAD_BASE) $(TARGET)
    4.30 +	./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000
    4.31 +
    4.32 +boot/mkelf32: boot/mkelf32.c
    4.33 +	$(HOSTCC) $(HOSTCFLAGS) -o $@ $<
    4.34  
    4.35  clean:
    4.36 -	rm -f *.o *~ core boot/*.o boot/*~ boot/core
    4.37 -	rm -f $(TARGET_SUBARCH)/*.o $(TARGET_SUBARCH)/*~
    4.38 -	rm -f $(TARGETSUBARCH)/core
    4.39 +	rm -f *.o *~ core boot/*.o boot/*~ boot/core boot/mkelf32
    4.40 +	rm -f x86_32/*.o x86_32/*~ x86_32/core
    4.41 +	rm -f x86_64/*.o x86_64/*~ x86_64/core
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/xen/arch/x86/boot/mkelf32.c	Sat Jul 10 14:55:46 2004 +0000
     5.3 @@ -0,0 +1,280 @@
     5.4 +/******************************************************************************
     5.5 + * mkelf32.c
     5.6 + * 
     5.7 + * Usage: elf-prefix <in-image> <out-image> <load-base>
     5.8 + * 
     5.9 + * Converts an Elf32 or Elf64 executable binary <in-image> into a simple Elf32
    5.10 + * image <out-image> comprising a single chunk to be loaded at <load-base>. 
    5.11 + */
    5.12 +
    5.13 +#include <errno.h>
    5.14 +#include <stdio.h>
    5.15 +#include <stdlib.h>
    5.16 +#include <string.h>
    5.17 +#include <sys/types.h>
    5.18 +#include <sys/stat.h>
    5.19 +#include <fcntl.h>
    5.20 +#include <unistd.h>
    5.21 +
    5.22 +/*
    5.23 + * Here I'm taking care not to conflict with possible typedef's in
    5.24 + * standard headers by instead using the macro namespace.
    5.25 + */
    5.26 +#undef u8
    5.27 +#undef u16
    5.28 +#undef u32
    5.29 +#undef u64
    5.30 +#undef s8
    5.31 +#undef s16
    5.32 +#undef s32
    5.33 +#undef s64
    5.34 +#define u8  unsigned char
    5.35 +#define u16 unsigned short
    5.36 +#define u32 unsigned int
    5.37 +#define s8  signed char
    5.38 +#define s16 signed short
    5.39 +#define s32 signed int
    5.40 +#if defined(__i386__)
    5.41 +#define u64 unsigned long long
    5.42 +#define s64 signed long long
    5.43 +#else
    5.44 +#define u64 unsigned long
    5.45 +#define s64 signed long
    5.46 +#endif
    5.47 +
    5.48 +#include "../../../include/xen/elf.h"
    5.49 +
    5.50 +#define DYNAMICALLY_FILLED   0
    5.51 +#define RAW_OFFSET         128
    5.52 +
    5.53 +static Elf32_Ehdr out_ehdr = {
    5.54 +    { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,    /* EI_MAG{0-3} */
    5.55 +      ELFCLASS32,                            /* EI_CLASS */
    5.56 +      ELFDATA2LSB,                           /* EI_DATA */
    5.57 +      EV_CURRENT,                            /* EI_VERSION */
    5.58 +      0, 0, 0, 0, 0, 0, 0, 0, 0 },           /* e_ident */
    5.59 +    ET_EXEC,                                 /* e_type */
    5.60 +    EM_386,                                  /* e_machine */
    5.61 +    EV_CURRENT,                              /* e_version */
    5.62 +    DYNAMICALLY_FILLED,                      /* e_entry */
    5.63 +    sizeof(Elf32_Ehdr),                      /* e_phoff */
    5.64 +    DYNAMICALLY_FILLED,                      /* e_shoff */
    5.65 +    0,                                       /* e_flags */
    5.66 +    sizeof(Elf32_Ehdr),                      /* e_ehsize */
    5.67 +    sizeof(Elf32_Phdr),                      /* e_phentsize */
    5.68 +    1,                                       /* e_phnum */
    5.69 +    sizeof(Elf32_Shdr),                      /* e_shentsize */
    5.70 +    3,                                       /* e_shnum */
    5.71 +    2                                        /* e_shstrndx */
    5.72 +};
    5.73 +
    5.74 +static Elf32_Phdr out_phdr = {
    5.75 +    PT_LOAD,                                 /* p_type */
    5.76 +    RAW_OFFSET,                              /* p_offset */
    5.77 +    DYNAMICALLY_FILLED,                      /* p_vaddr */
    5.78 +    DYNAMICALLY_FILLED,                      /* p_paddr */
    5.79 +    DYNAMICALLY_FILLED,                      /* p_filesz */
    5.80 +    DYNAMICALLY_FILLED,                      /* p_memsz */
    5.81 +    PF_R|PF_W|PF_X,                          /* p_flags */
    5.82 +    64                                       /* p_align */
    5.83 +};
    5.84 +
    5.85 +static u8 out_shstrtab[] = "\0.text\0.shstrtab";
    5.86 +
    5.87 +static Elf32_Shdr out_shdr[] = {
    5.88 +    { 0 },
    5.89 +    { 1,                                     /* sh_name */
    5.90 +      SHT_PROGBITS,                          /* sh_type */
    5.91 +      SHF_WRITE|SHF_ALLOC|SHF_EXECINSTR,     /* sh_flags */
    5.92 +      DYNAMICALLY_FILLED,                    /* sh_addr */
    5.93 +      RAW_OFFSET,                            /* sh_offset */
    5.94 +      DYNAMICALLY_FILLED,                    /* sh_size */
    5.95 +      0,                                     /* sh_link */
    5.96 +      0,                                     /* sh_info */
    5.97 +      64,                                    /* sh_addralign */
    5.98 +      0                                      /* sh_entsize */
    5.99 +    },
   5.100 +    { 7,                                     /* sh_name */
   5.101 +      SHT_STRTAB,                            /* sh_type */
   5.102 +      0,                                     /* sh_flags */
   5.103 +      0,                                     /* sh_addr */
   5.104 +      DYNAMICALLY_FILLED,                    /* sh_offset */
   5.105 +      sizeof(out_shstrtab),                  /* sh_size */
   5.106 +      0,                                     /* sh_link */
   5.107 +      0,                                     /* sh_info */
   5.108 +      1,                                     /* sh_addralign */
   5.109 +      0                                      /* sh_entsize */
   5.110 +    }
   5.111 +};
   5.112 +
   5.113 +static void do_write(int fd, void *data, int len)
   5.114 +{
   5.115 +    int   done, left = len;
   5.116 +    char *p = data;
   5.117 +
   5.118 +    while ( left != 0 )
   5.119 +    {
   5.120 +        if ( (done = write(fd, p, left)) == -1 )
   5.121 +        {
   5.122 +            if ( errno == EINTR )
   5.123 +                continue;
   5.124 +            fprintf(stderr, "Error writing output image: %d (%s).\n",
   5.125 +                    errno, strerror(errno));
   5.126 +            exit(1);
   5.127 +        }
   5.128 +
   5.129 +        left -= done;
   5.130 +        p    += done;
   5.131 +    }
   5.132 +}
   5.133 +
   5.134 +static void do_read(int fd, void *data, int len)
   5.135 +{
   5.136 +    int   done, left = len;
   5.137 +    char *p = data;
   5.138 +
   5.139 +    while ( left != 0 )
   5.140 +    {
   5.141 +        if ( (done = read(fd, p, left)) == -1 )
   5.142 +        {
   5.143 +            if ( errno == EINTR )
   5.144 +                continue;
   5.145 +            fprintf(stderr, "Error reading input image: %d (%s).\n",
   5.146 +                    errno, strerror(errno));
   5.147 +            exit(1);
   5.148 +        }
   5.149 +
   5.150 +        left -= done;
   5.151 +        p    += done;
   5.152 +    }
   5.153 +}
   5.154 +
   5.155 +int main(int argc, char **argv)
   5.156 +{
   5.157 +    u32        loadbase, dat_siz, mem_siz;
   5.158 +    char      *inimage, *outimage;
   5.159 +    int        infd, outfd;
   5.160 +    char       buffer[1024];
   5.161 +    int        bytes, todo;
   5.162 +
   5.163 +    Elf32_Ehdr in32_ehdr;
   5.164 +    Elf32_Phdr in32_phdr;
   5.165 +
   5.166 +    Elf64_Ehdr in64_ehdr;
   5.167 +    Elf64_Phdr in64_phdr;
   5.168 +
   5.169 +    if ( argc != 4 )
   5.170 +    {
   5.171 +        fprintf(stderr, "Usage: mkelf32 <in-image> <out-image> <load-base>\n");
   5.172 +        return 1;
   5.173 +    }
   5.174 +
   5.175 +    inimage  = argv[1];
   5.176 +    outimage = argv[2];
   5.177 +    loadbase = strtoul(argv[3], NULL, 16);
   5.178 +
   5.179 +    infd = open(inimage, O_RDONLY);
   5.180 +    if ( infd == -1 )
   5.181 +    {
   5.182 +        fprintf(stderr, "Failed to open input image '%s': %d (%s).\n",
   5.183 +                inimage, errno, strerror(errno));
   5.184 +        return 1;
   5.185 +    }
   5.186 +
   5.187 +    do_read(infd, &in32_ehdr, sizeof(in32_ehdr));
   5.188 +    if ( !IS_ELF(in32_ehdr) ||
   5.189 +         (in32_ehdr.e_ident[EI_DATA] != ELFDATA2LSB) )
   5.190 +    {
   5.191 +        fprintf(stderr, "Input image must be a little-endian Elf image.\n");
   5.192 +        return 1;
   5.193 +    }
   5.194 +
   5.195 +    switch ( in32_ehdr.e_ident[EI_CLASS] )
   5.196 +    {
   5.197 +    case ELFCLASS32:
   5.198 +        if ( in32_ehdr.e_phentsize != sizeof(in32_phdr) )
   5.199 +        {
   5.200 +            fprintf(stderr, "Bad program header size (%d != %d).\n",
   5.201 +                    (int)in32_ehdr.e_phentsize, (int)sizeof(in32_phdr));
   5.202 +            return 1;
   5.203 +        }
   5.204 +
   5.205 +        (void)lseek(infd, in32_ehdr.e_phoff, SEEK_SET);
   5.206 +        do_read(infd, &in32_phdr, sizeof(in32_phdr));
   5.207 +
   5.208 +        (void)lseek(infd, in32_phdr.p_offset, SEEK_SET);
   5.209 +        dat_siz = (u32)in32_phdr.p_filesz;
   5.210 +        mem_siz = (u32)in32_phdr.p_memsz;
   5.211 +        break;
   5.212 +
   5.213 +    case ELFCLASS64:
   5.214 +        (void)lseek(infd, 0, SEEK_SET);
   5.215 +        do_read(infd, &in64_ehdr, sizeof(in64_ehdr));
   5.216 +
   5.217 +        if ( in64_ehdr.e_phentsize != sizeof(in64_phdr) )
   5.218 +        {
   5.219 +            fprintf(stderr, "Bad program header size (%d != %d).\n",
   5.220 +                    (int)in64_ehdr.e_phentsize, (int)sizeof(in64_phdr));
   5.221 +            return 1;
   5.222 +        }
   5.223 +
   5.224 +        (void)lseek(infd, in64_ehdr.e_phoff, SEEK_SET);
   5.225 +        do_read(infd, &in64_phdr, sizeof(in64_phdr));
   5.226 +
   5.227 +        (void)lseek(infd, in64_phdr.p_offset, SEEK_SET);
   5.228 +        dat_siz = (u32)in64_phdr.p_filesz;
   5.229 +        mem_siz = (u32)in64_phdr.p_memsz;
   5.230 +        break;
   5.231 +
   5.232 +    default:
   5.233 +        fprintf(stderr, "Input image must be a 32- or 64-bit Elf image.\n");
   5.234 +        return 1;
   5.235 +    }
   5.236 +
   5.237 +    out_ehdr.e_entry = loadbase;
   5.238 +    out_ehdr.e_shoff = RAW_OFFSET + dat_siz;
   5.239 +
   5.240 +    out_phdr.p_vaddr  = loadbase;
   5.241 +    out_phdr.p_paddr  = loadbase;
   5.242 +    out_phdr.p_filesz = dat_siz;
   5.243 +    out_phdr.p_memsz  = mem_siz;
   5.244 +
   5.245 +    out_shdr[1].sh_addr   = loadbase;
   5.246 +    out_shdr[1].sh_size   = dat_siz;
   5.247 +    out_shdr[2].sh_offset = RAW_OFFSET + dat_siz + sizeof(out_shdr);
   5.248 +
   5.249 +    outfd = open(outimage, O_WRONLY|O_CREAT|O_TRUNC, 0775);
   5.250 +    if ( outfd == -1 )
   5.251 +    {
   5.252 +        fprintf(stderr, "Failed to open output image '%s': %d (%s).\n",
   5.253 +                outimage, errno, strerror(errno));
   5.254 +        return 1;
   5.255 +    }
   5.256 +
   5.257 +    do_write(outfd, &out_ehdr, sizeof(out_ehdr));
   5.258 +    do_write(outfd, &out_phdr, sizeof(out_phdr));
   5.259 +    
   5.260 +    if ( (bytes = RAW_OFFSET - sizeof(out_ehdr) - sizeof(out_phdr)) < 0 )
   5.261 +    {
   5.262 +        fprintf(stderr, "Header overflow.\n");
   5.263 +        return 1;
   5.264 +    }
   5.265 +    do_write(outfd, buffer, bytes);
   5.266 +
   5.267 +    for ( bytes = 0; bytes < dat_siz; bytes += todo )
   5.268 +    {
   5.269 +        todo = ((dat_siz - bytes) > sizeof(buffer)) ? 
   5.270 +            sizeof(buffer) : (dat_siz - bytes);
   5.271 +        do_read(infd, buffer, todo);
   5.272 +        do_write(outfd, buffer, todo);
   5.273 +    }
   5.274 +
   5.275 +    do_write(outfd, &out_shdr[0], sizeof(out_shdr));
   5.276 +    do_write(outfd, out_shstrtab, sizeof(out_shstrtab));
   5.277 +    do_write(outfd, buffer, 4-((sizeof(out_shstrtab)+dat_siz)&3));
   5.278 +
   5.279 +    close(infd);
   5.280 +    close(outfd);
   5.281 +
   5.282 +    return 0;
   5.283 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/xen/figlet/LICENSE	Sat Jul 10 14:55:46 2004 +0000
     6.3 @@ -0,0 +1,111 @@
     6.4 +http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
     6.5 +
     6.6 +			 The "Artistic License"
     6.7 +
     6.8 +				Preamble
     6.9 +
    6.10 +The intent of this document is to state the conditions under which a
    6.11 +Package may be copied, such that the Copyright Holder maintains some
    6.12 +semblance of artistic control over the development of the package,
    6.13 +while giving the users of the package the right to use and distribute
    6.14 +the Package in a more-or-less customary fashion, plus the right to make
    6.15 +reasonable modifications.
    6.16 +
    6.17 +Definitions:
    6.18 +
    6.19 +	"Package" refers to the collection of files distributed by the
    6.20 +	Copyright Holder, and derivatives of that collection of files
    6.21 +	created through textual modification.
    6.22 +
    6.23 +	"Standard Version" refers to such a Package if it has not been
    6.24 +	modified, or has been modified in accordance with the wishes
    6.25 +	of the Copyright Holder.
    6.26 +
    6.27 +	"Copyright Holder" is whoever is named in the copyright or
    6.28 +	copyrights for the package.
    6.29 +
    6.30 +	"You" is you, if you're thinking about copying or distributing
    6.31 +	this Package.
    6.32 +
    6.33 +	"Reasonable copying fee" is whatever you can justify on the
    6.34 +	basis of media cost, duplication charges, time of people involved,
    6.35 +	and so on.  (You will not be required to justify it to the
    6.36 +	Copyright Holder, but only to the computing community at large
    6.37 +	as a market that must bear the fee.)
    6.38 +
    6.39 +	"Freely Available" means that no fee is charged for the item
    6.40 +	itself, though there may be fees involved in handling the item.
    6.41 +	It also means that recipients of the item may redistribute it
    6.42 +	under the same conditions they received it.
    6.43 +
    6.44 +1. You may make and give away verbatim copies of the source form of the
    6.45 +Standard Version of this Package without restriction, provided that you
    6.46 +duplicate all of the original copyright notices and associated disclaimers.
    6.47 +
    6.48 +2. You may apply bug fixes, portability fixes and other modifications
    6.49 +derived from the Public Domain or from the Copyright Holder.  A Package
    6.50 +modified in such a way shall still be considered the Standard Version.
    6.51 +
    6.52 +3. You may otherwise modify your copy of this Package in any way, provided
    6.53 +that you insert a prominent notice in each changed file stating how and
    6.54 +when you changed that file, and provided that you do at least ONE of the
    6.55 +following:
    6.56 +
    6.57 +    a) place your modifications in the Public Domain or otherwise make them
    6.58 +    Freely Available, such as by posting said modifications to Usenet or
    6.59 +    an equivalent medium, or placing the modifications on a major archive
    6.60 +    site such as ftp.uu.net, or by allowing the Copyright Holder to include
    6.61 +    your modifications in the Standard Version of the Package.
    6.62 +
    6.63 +    b) use the modified Package only within your corporation or organization.
    6.64 +
    6.65 +    c) rename any non-standard executables so the names do not conflict
    6.66 +    with standard executables, which must also be provided, and provide
    6.67 +    a separate manual page for each non-standard executable that clearly
    6.68 +    documents how it differs from the Standard Version.
    6.69 +
    6.70 +    d) make other distribution arrangements with the Copyright Holder.
    6.71 +
    6.72 +4. You may distribute the programs of this Package in object code or
    6.73 +executable form, provided that you do at least ONE of the following:
    6.74 +
    6.75 +    a) distribute a Standard Version of the executables and library files,
    6.76 +    together with instructions (in the manual page or equivalent) on where
    6.77 +    to get the Standard Version.
    6.78 +
    6.79 +    b) accompany the distribution with the machine-readable source of
    6.80 +    the Package with your modifications.
    6.81 +
    6.82 +    c) accompany any non-standard executables with their corresponding
    6.83 +    Standard Version executables, giving the non-standard executables
    6.84 +    non-standard names, and clearly documenting the differences in manual
    6.85 +    pages (or equivalent), together with instructions on where to get
    6.86 +    the Standard Version.
    6.87 +
    6.88 +    d) make other distribution arrangements with the Copyright Holder.
    6.89 +
    6.90 +5. You may charge a reasonable copying fee for any distribution of this
    6.91 +Package.  You may charge any fee you choose for support of this Package.
    6.92 +You may not charge a fee for this Package itself.  However,
    6.93 +you may distribute this Package in aggregate with other (possibly
    6.94 +commercial) programs as part of a larger (possibly commercial) software
    6.95 +distribution provided that you do not advertise this Package as a
    6.96 +product of your own.
    6.97 +
    6.98 +6. The scripts and library files supplied as input to or produced as
    6.99 +output from the programs of this Package do not automatically fall
   6.100 +under the copyright of this Package, but belong to whomever generated
   6.101 +them, and may be sold commercially, and may be aggregated with this
   6.102 +Package.
   6.103 +
   6.104 +7. C or perl subroutines supplied by you and linked into this Package
   6.105 +shall not be considered part of this Package.
   6.106 +
   6.107 +8. The name of the Copyright Holder may not be used to endorse or promote
   6.108 +products derived from this software without specific prior written permission.
   6.109 +
   6.110 +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
   6.111 +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   6.112 +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   6.113 +
   6.114 +				The End
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/xen/figlet/Makefile	Sat Jul 10 14:55:46 2004 +0000
     7.3 @@ -0,0 +1,8 @@
     7.4 +
     7.5 +CC := gcc
     7.6 +
     7.7 +figlet: figlet.c
     7.8 +	$(CC) -o $@ $<
     7.9 +
    7.10 +clean:
    7.11 +	rm -f *.o figlet
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/xen/figlet/README	Sat Jul 10 14:55:46 2004 +0000
     8.3 @@ -0,0 +1,9 @@
     8.4 +
     8.5 +NB. This is a very hacked version of Figlet 2.2.1. 
     8.6 +
     8.7 +Don't use this outside the Xen build system. A proper version of Figlet
     8.8 +can be had from <http://www.figlet.org>.
     8.9 +
    8.10 +The distribution license is intact in the LICENSE file.
    8.11 +
    8.12 + -- Keir Fraser (2/5/2003)
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/xen/figlet/figlet.c	Sat Jul 10 14:55:46 2004 +0000
     9.3 @@ -0,0 +1,2075 @@
     9.4 +
     9.5 +/*
     9.6 + * XXXXXXXXXXXXXXXXXXXXXXXXXXX
     9.7 + * 
     9.8 + * This is a HACKED figlet source file for Xen.
     9.9 + * 
    9.10 + * Hacked to output C octal strings for inclusion in a header file.
    9.11 + * Support for opening zipped files is removed.
    9.12 + * 
    9.13 + * Go to www.figlet.org for the unhacked Figlet sources.
    9.14 + */
    9.15 +
    9.16 +/****************************************************************************
    9.17 +
    9.18 +  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
    9.19 +  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
    9.20 +  FIGlet Copyright 2002 Christiaan Keet
    9.21 +  Portions written by Paul Burton and Christiaan Keet
    9.22 +  Internet: <info@figlet.org>
    9.23 +  FIGlet, along with the various FIGlet fonts and documentation, is
    9.24 +    copyrighted under the provisions of the Artistic License (as listed
    9.25 +    in the file "Artistic-license.txt" which is included in this package.
    9.26 +****************************************************************************/
    9.27 +
    9.28 +#define DATE "13 July 2002"
    9.29 +#define VERSION "2.2.1"
    9.30 +#define VERSION_INT 20201
    9.31 +
    9.32 +/* FIGlet (Frank, Ian & Glenn's Letters) */
    9.33 +/* by Glenn Chappell */
    9.34 +/* Apr 1991 */
    9.35 +/* Automatic file addition by Ian Chai May 1991 */
    9.36 +/* Punctuation and numbers addition by Ian Chai Jan 1993 */
    9.37 +/* Full ASCII by Glenn Chappell Feb 1993 */
    9.38 +/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
    9.39 +/* Hard blanks by Glenn Chappell Apr 1993 */
    9.40 +/* Release 2.0 5 Aug 1993 */
    9.41 +/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
    9.42 +/* Control files by Glenn Chappell Feb 1994 */
    9.43 +/* Release 2.1 12 Aug 1994 */
    9.44 +/* Release 2.1.1 25 Aug 1994 */
    9.45 +/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
    9.46 +   option.  Sept 8, 1996 */
    9.47 +/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
    9.48 +   mapping tables, kerning/smushing options. */
    9.49 +/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
    9.50 +   FAQs and comments. 13 July 2002. The new official FIGlet website is 
    9.51 +   http://www.figlet.org/  */
    9.52 +
    9.53 +#define DEFAULTFONTDIR "."
    9.54 +#define DEFAULTFONTFILE "xen.flf"
    9.55 +
    9.56 +#include <stdio.h>
    9.57 +#ifdef __STDC__
    9.58 +#include <stdlib.h>
    9.59 +#endif
    9.60 +#include <string.h>
    9.61 +#include <ctype.h>
    9.62 +#include <fcntl.h>     /* Needed for get_columns */
    9.63 +
    9.64 +#ifdef unix
    9.65 +#include <sys/ioctl.h> /* Needed for get_columns */
    9.66 +#endif
    9.67 +
    9.68 +
    9.69 +#define ZFILE FILE
    9.70 +#define Zopen fopen
    9.71 +#define Zgetc fgetc
    9.72 +#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
    9.73 +#define Zclose fclose
    9.74 +
    9.75 +#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
    9.76 +
    9.77 +#define DIRSEP '/'
    9.78 +#define DIRSEP2 '\\'
    9.79 +/* Leave alone for Unix and MS-DOS/Windows!
    9.80 +Note: '/' also used in filename in get_columns(). */
    9.81 +
    9.82 +#define FONTFILESUFFIX ".flf"
    9.83 +#define FONTFILEMAGICNUMBER "flf2"
    9.84 +#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
    9.85 +#define CONTROLFILESUFFIX ".flc"
    9.86 +#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
    9.87 +#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
    9.88 +#define DEFAULTCOLUMNS 80
    9.89 +
    9.90 +
    9.91 +/****************************************************************************
    9.92 +
    9.93 +  Globals dealing with chars that are read
    9.94 +
    9.95 +****************************************************************************/
    9.96 +
    9.97 +typedef long inchr; /* "char" read from stdin */
    9.98 +
    9.99 +inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
   9.100 +                   /* Note: not null-terminated. */
   9.101 +int inchrlinelen,inchrlinelenlimit;
   9.102 +inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
   9.103 +  /* Latin-1 codes for German letters, respectively:
   9.104 +     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
   9.105 +     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
   9.106 +     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
   9.107 +     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
   9.108 +     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
   9.109 +     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
   9.110 +     LATIN SMALL LETTER SHARP S = ess-zed
   9.111 +  */
   9.112 +
   9.113 +int hzmode;  /* true if reading double-bytes in HZ mode */
   9.114 +int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
   9.115 +inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
   9.116 +int gl; /* 0-3 specifies left-half Gn character set */
   9.117 +int gr; /* 0-3 specifies right-half Gn character set */
   9.118 +
   9.119 +int Myargc;  /* to avoid passing around argc and argv */
   9.120 +char **Myargv;
   9.121 +
   9.122 +/****************************************************************************
   9.123 +
   9.124 +  Globals dealing with chars that are written
   9.125 +
   9.126 +****************************************************************************/
   9.127 +
   9.128 +typedef struct fc {
   9.129 +  inchr ord;
   9.130 +  char **thechar;  /* Alloc'd char thechar[charheight][]; */
   9.131 +  struct fc *next;
   9.132 +  } fcharnode;
   9.133 +
   9.134 +fcharnode *fcharlist;
   9.135 +char **currchar;
   9.136 +int currcharwidth;
   9.137 +int previouscharwidth;
   9.138 +char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
   9.139 +int outlinelen;
   9.140 +
   9.141 +
   9.142 +/****************************************************************************
   9.143 +
   9.144 +  Globals dealing with command file storage
   9.145 +
   9.146 +****************************************************************************/
   9.147 +
   9.148 +typedef struct cfn {
   9.149 +  char *thename;
   9.150 +  struct cfn *next;
   9.151 +  } cfnamenode;
   9.152 +
   9.153 +cfnamenode *cfilelist,**cfilelistend;
   9.154 +
   9.155 +typedef struct cm {
   9.156 +  int thecommand;
   9.157 +  inchr rangelo;
   9.158 +  inchr rangehi;
   9.159 +  inchr offset;
   9.160 +  struct cm *next;
   9.161 +  } comnode;
   9.162 +
   9.163 +comnode *commandlist,**commandlistend;
   9.164 +
   9.165 +/****************************************************************************
   9.166 +
   9.167 +  Globals affected by command line options
   9.168 +
   9.169 +****************************************************************************/
   9.170 +
   9.171 +int deutschflag,justification,paragraphflag,right2left,multibyte;
   9.172 +int cmdinput;
   9.173 +
   9.174 +#define SM_SMUSH 128
   9.175 +#define SM_KERN 64
   9.176 +#define SM_EQUAL 1
   9.177 +#define SM_LOWLINE 2
   9.178 +#define SM_HIERARCHY 4
   9.179 +#define SM_PAIR 8
   9.180 +#define SM_BIGX 16
   9.181 +#define SM_HARDBLANK 32
   9.182 +
   9.183 +int smushmode;
   9.184 +
   9.185 +#define SMO_NO 0     /* no command-line smushmode */
   9.186 +#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
   9.187 +#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
   9.188 +
   9.189 +int smushoverride;
   9.190 +
   9.191 +int outputwidth;
   9.192 +int outlinelenlimit;
   9.193 +char *fontdirname,*fontname;
   9.194 +
   9.195 +
   9.196 +/****************************************************************************
   9.197 +
   9.198 +  Globals read from font file
   9.199 +
   9.200 +****************************************************************************/
   9.201 +
   9.202 +char hardblank;
   9.203 +int charheight;
   9.204 +
   9.205 +
   9.206 +/****************************************************************************
   9.207 +
   9.208 +  Name of program, used in error messages
   9.209 +
   9.210 +****************************************************************************/
   9.211 +
   9.212 +char *myname;
   9.213 +
   9.214 +
   9.215 +#ifdef TIOCGWINSZ
   9.216 +/****************************************************************************
   9.217 +
   9.218 +  get_columns
   9.219 +
   9.220 +  Determines the number of columns of /dev/tty.  Returns the number of
   9.221 +  columns, or -1 if error.  May return 0 if columns unknown.
   9.222 +  Requires include files <fcntl.h> and <sys/ioctl.h>.
   9.223 +  by Glenn Chappell & Ian Chai 14 Apr 1993
   9.224 +
   9.225 +****************************************************************************/
   9.226 +
   9.227 +int get_columns()
   9.228 +{
   9.229 +  struct winsize ws;
   9.230 +  int fd,result;
   9.231 +
   9.232 +  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
   9.233 +  result = ioctl(fd,TIOCGWINSZ,&ws);
   9.234 +  close(fd);
   9.235 +  return result?-1:ws.ws_col;
   9.236 +}
   9.237 +#endif /* ifdef TIOCGWINSZ */
   9.238 +
   9.239 +
   9.240 +/****************************************************************************
   9.241 +
   9.242 +  myalloc
   9.243 +
   9.244 +  Calls malloc.  If malloc returns error, prints error message and
   9.245 +  quits.
   9.246 +
   9.247 +****************************************************************************/
   9.248 +
   9.249 +#ifdef __STDC__
   9.250 +char *myalloc(size_t size)
   9.251 +#else
   9.252 +char *myalloc(size)
   9.253 +int size;
   9.254 +#endif
   9.255 +{
   9.256 +  char *ptr;
   9.257 +#ifndef __STDC__
   9.258 +  extern void *malloc();
   9.259 +#endif
   9.260 +
   9.261 +  if ((ptr = (char*)malloc(size))==NULL) {
   9.262 +    fprintf(stderr,"%s: Out of memory\n",myname);
   9.263 +    exit(1);
   9.264 +    }
   9.265 +  else {
   9.266 +    return ptr;
   9.267 +    }
   9.268 +}
   9.269 +
   9.270 +
   9.271 +/****************************************************************************
   9.272 +
   9.273 +  hasdirsep
   9.274 +
   9.275 +  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
   9.276 +
   9.277 +****************************************************************************/
   9.278 +
   9.279 +int hasdirsep(s1)
   9.280 +char *s1;
   9.281 +{
   9.282 +  if (strchr(s1, DIRSEP)) return 1;
   9.283 +  else if (strchr(s1, DIRSEP2)) return 1;
   9.284 +  else return 0;
   9.285 +}
   9.286 +
   9.287 +/****************************************************************************
   9.288 +
   9.289 +  suffixcmp
   9.290 +
   9.291 +  Returns true if s2 is a suffix of s1; uses case-blind comparison.
   9.292 +
   9.293 +****************************************************************************/
   9.294 +
   9.295 +int suffixcmp(s1, s2)
   9.296 +char *s1;
   9.297 +char *s2;
   9.298 +{
   9.299 +  int len1, len2;
   9.300 +
   9.301 +  len1 = MYSTRLEN(s1);
   9.302 +  len2 = MYSTRLEN(s2);
   9.303 +  if (len2 > len1) return 0;
   9.304 +  s1 += len1 - len2;
   9.305 +  while (*s1) {
   9.306 +    if (tolower(*s1) != tolower(*s2)) return 0;
   9.307 +    s1++;
   9.308 +    s2++;
   9.309 +    }
   9.310 +  return 1;
   9.311 +}
   9.312 +   
   9.313 +/****************************************************************************
   9.314 +
   9.315 +  skiptoeol
   9.316 +
   9.317 +  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
   9.318 +
   9.319 +****************************************************************************/
   9.320 +
   9.321 +void skiptoeol(fp)
   9.322 +ZFILE *fp;
   9.323 +{
   9.324 +  int dummy;
   9.325 +
   9.326 +  while (dummy=Zgetc(fp),dummy!=EOF) {
   9.327 +    if (dummy == '\n') return;
   9.328 +    if (dummy == '\r') {
   9.329 +      dummy = Zgetc(fp);
   9.330 +      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
   9.331 +      return;
   9.332 +      }
   9.333 +  }
   9.334 +}
   9.335 +
   9.336 +
   9.337 +/****************************************************************************
   9.338 +
   9.339 +  myfgets
   9.340 +
   9.341 +  Local version of fgets.  Handles \r, \n, and \r\n terminators.
   9.342 +
   9.343 +****************************************************************************/
   9.344 +
   9.345 +char *myfgets(line,maxlen,fp)
   9.346 +char *line;
   9.347 +int maxlen;
   9.348 +ZFILE *fp;
   9.349 +{
   9.350 +  int c = 0;
   9.351 +  char *p;
   9.352 +
   9.353 +  p = line;
   9.354 +  while((c=Zgetc(fp))!=EOF&&maxlen) {
   9.355 +    *p++ = c;
   9.356 +    maxlen--;
   9.357 +    if (c=='\n') break;
   9.358 +    if (c=='\r') {
   9.359 +      c = Zgetc(fp);
   9.360 +      if (c != EOF && c != '\n') Zungetc(c,fp);
   9.361 +      *(p-1) = '\n';
   9.362 +      break;
   9.363 +      }
   9.364 +    }
   9.365 +  *p = 0;
   9.366 +  return (c==EOF) ? NULL : line;
   9.367 +}
   9.368 +
   9.369 +/****************************************************************************
   9.370 +
   9.371 +  usageerr
   9.372 +
   9.373 +  Prints "Usage: ...." line to the given stream.
   9.374 +
   9.375 +****************************************************************************/
   9.376 +
   9.377 +void printusage(out)
   9.378 +FILE *out;
   9.379 +{
   9.380 +  fprintf(out,
   9.381 +    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
   9.382 +    myname);
   9.383 +  fprintf(out,
   9.384 +    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
   9.385 +  fprintf(out,
   9.386 +    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
   9.387 +}
   9.388 +
   9.389 +
   9.390 +/****************************************************************************
   9.391 +
   9.392 +  printinfo
   9.393 +
   9.394 +  Prints version and copyright message, or utility information.
   9.395 +
   9.396 +****************************************************************************/
   9.397 +
   9.398 +void printinfo(infonum)
   9.399 +int infonum;
   9.400 +{
   9.401 +  switch (infonum) {
   9.402 +    case 0: /* Copyright message */
   9.403 +      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
   9.404 +      printf("John Cowan, Christiaan Keet\n");
   9.405 +      printf("Internet: <info@figlet.org> ");
   9.406 +      printf("Version: %s, date: %s\n\n",VERSION,DATE);
   9.407 +      printf("FIGlet, along with the various FIGlet fonts");
   9.408 +      printf(" and documentation, may be\n");
   9.409 +      printf("freely copied and distributed.\n\n");
   9.410 +      printf("If you use FIGlet, please send an");
   9.411 +      printf(" e-mail message to <info@figlet.org>.\n\n");
   9.412 +      printf("The latest version of FIGlet is available from the");
   9.413 +      printf(" web site,\n\thttp://www.figlet.org/\n\n");
   9.414 +      printusage(stdout);
   9.415 +      break;
   9.416 +    case 1: /* Version (integer) */
   9.417 +      printf("%d\n",VERSION_INT);
   9.418 +      break;
   9.419 +    case 2: /* Font directory */
   9.420 +      printf("%s\n",fontdirname);
   9.421 +      break;
   9.422 +    case 3: /* Font */
   9.423 +      printf("%s\n",fontname);
   9.424 +      break;
   9.425 +    case 4: /* Outputwidth */
   9.426 +      printf("%d\n",outputwidth);
   9.427 +    }
   9.428 +}
   9.429 +
   9.430 +
   9.431 +/****************************************************************************
   9.432 +
   9.433 +  readmagic
   9.434 +
   9.435 +  Reads a four-character magic string from a stream.
   9.436 +
   9.437 +****************************************************************************/
   9.438 +void readmagic(fp,magic)
   9.439 +ZFILE *fp;
   9.440 +char *magic;
   9.441 +{
   9.442 +  int i;
   9.443 +
   9.444 +  for (i=0;i<4;i++) {
   9.445 +    magic[i] = Zgetc(fp);
   9.446 +    }
   9.447 +  magic[4] = 0;
   9.448 +  }
   9.449 +  
   9.450 +/****************************************************************************
   9.451 +
   9.452 +  skipws
   9.453 +
   9.454 +  Skips whitespace characters from a stream.
   9.455 +
   9.456 +****************************************************************************/
   9.457 +void skipws(fp)
   9.458 +ZFILE *fp;
   9.459 +{
   9.460 +  int c;
   9.461 +  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
   9.462 +  Zungetc(c,fp);
   9.463 +  }
   9.464 +
   9.465 +/****************************************************************************
   9.466 +
   9.467 +  readnum
   9.468 +
   9.469 +  Reads a number from a stream.  Accepts "0" prefix for octal and
   9.470 +  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
   9.471 +
   9.472 +****************************************************************************/
   9.473 +void readnum(fp,nump)
   9.474 +ZFILE *fp;
   9.475 +inchr *nump;
   9.476 +{
   9.477 +  int acc = 0;
   9.478 +  char *p;
   9.479 +  int c;
   9.480 +  int base;
   9.481 +  int sign = 1;
   9.482 +  char digits[] = "0123456789ABCDEF";
   9.483 +
   9.484 +  skipws(fp);
   9.485 +  c = Zgetc(fp);
   9.486 +  if (c=='-') {
   9.487 +    sign = -1;
   9.488 +    }
   9.489 +  else {
   9.490 +    Zungetc(c,fp);
   9.491 +    }
   9.492 +  c = Zgetc(fp);
   9.493 +  if (c=='0') {
   9.494 +     c = Zgetc(fp);
   9.495 +     if (c=='x'||c=='X') {
   9.496 +       base = 16;
   9.497 +       }
   9.498 +     else {
   9.499 +       base = 8;
   9.500 +       Zungetc(c,fp);
   9.501 +       }
   9.502 +    }
   9.503 +  else {
   9.504 +    base = 10;
   9.505 +    Zungetc(c,fp);
   9.506 +    }
   9.507 +
   9.508 +  while((c=Zgetc(fp))!=EOF) {
   9.509 +    c=toupper(c);
   9.510 +    p=strchr(digits,c);
   9.511 +    if (!p) {
   9.512 +      Zungetc(c,fp);
   9.513 +      *nump = acc * sign;
   9.514 +      return;
   9.515 +      }
   9.516 +    acc = acc*base+(p-digits);
   9.517 +    }
   9.518 +  *nump = acc * sign;
   9.519 +  }  
   9.520 +
   9.521 +/****************************************************************************
   9.522 +
   9.523 +  readTchar
   9.524 +
   9.525 +  Reads a control file "T" command character specification.
   9.526 +
   9.527 +  Character is a single byte, an escape sequence, or
   9.528 +  an escaped numeric.
   9.529 +
   9.530 +****************************************************************************/
   9.531 +
   9.532 +inchr readTchar(fp)
   9.533 +ZFILE *fp;
   9.534 +{
   9.535 +  inchr thechar;
   9.536 +  char next;
   9.537 +
   9.538 +  thechar=Zgetc(fp);
   9.539 +  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
   9.540 +    Zungetc(thechar,fp);
   9.541 +    return '\0';
   9.542 +    }
   9.543 +  if (thechar!='\\') return thechar;
   9.544 +  next=Zgetc(fp);
   9.545 +  switch(next) {
   9.546 +    case 'a':
   9.547 +      return 7;
   9.548 +    case 'b':
   9.549 +      return 8;
   9.550 +    case 'e':
   9.551 +      return 27;
   9.552 +    case 'f':
   9.553 +      return 12;
   9.554 +    case 'n':
   9.555 +      return 10;
   9.556 +    case 'r':
   9.557 +      return 13;
   9.558 +    case 't':
   9.559 +      return 9;
   9.560 +    case 'v':
   9.561 +      return 11;
   9.562 +    default:
   9.563 +      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
   9.564 +        Zungetc(next,fp);
   9.565 +        readnum(fp,&thechar);
   9.566 +        return thechar;
   9.567 +        }
   9.568 +      return next;
   9.569 +    }
   9.570 +}
   9.571 +
   9.572 +/****************************************************************************
   9.573 +
   9.574 +  charsetname
   9.575 +
   9.576 +  Get a Tchar representing a charset name, or 0 if none available.
   9.577 +  Called in getcharset().
   9.578 +
   9.579 +****************************************************************************/
   9.580 +
   9.581 +inchr charsetname(fp)
   9.582 +ZFILE *fp;
   9.583 +{
   9.584 +  inchr result;
   9.585 +
   9.586 +  result = readTchar(fp);
   9.587 +  if (result == '\n' || result == '\r') {
   9.588 +    result = 0;
   9.589 +    Zungetc(result,fp);
   9.590 +    }
   9.591 +  return result;
   9.592 +  }
   9.593 +
   9.594 +/****************************************************************************
   9.595 +
   9.596 +  charset
   9.597 +
   9.598 +  Processes "g[0123]" character set specifier
   9.599 +  Called in readcontrol().
   9.600 +
   9.601 +****************************************************************************/
   9.602 +
   9.603 +void charset(n, controlfile)
   9.604 +int n;
   9.605 +ZFILE *controlfile;
   9.606 +{
   9.607 +  int ch;
   9.608 +
   9.609 +  skipws(controlfile);
   9.610 +  if (Zgetc(controlfile) != '9') {
   9.611 +    skiptoeol(controlfile);
   9.612 +    return;
   9.613 +    }
   9.614 +  ch = Zgetc(controlfile);
   9.615 +  if (ch == '6') {
   9.616 +     gn[n] = 65536L * charsetname(controlfile) + 0x80;
   9.617 +     gndbl[n] = 0;
   9.618 +     skiptoeol(controlfile);
   9.619 +     return;
   9.620 +     }
   9.621 +  if (ch != '4') {
   9.622 +    skiptoeol(controlfile);
   9.623 +    return;
   9.624 +    }
   9.625 +  ch = Zgetc(controlfile);
   9.626 +  if (ch == 'x') {
   9.627 +     if (Zgetc(controlfile) != '9') {
   9.628 +       skiptoeol(controlfile);
   9.629 +       return;
   9.630 +       }
   9.631 +     if (Zgetc(controlfile) != '4') {
   9.632 +       skiptoeol(controlfile);
   9.633 +       return;
   9.634 +       }
   9.635 +     skipws(controlfile);
   9.636 +     gn[n] = 65536L * charsetname(controlfile);
   9.637 +     gndbl[n] = 1;
   9.638 +     skiptoeol(controlfile);
   9.639 +     return;
   9.640 +     }
   9.641 +  Zungetc(ch, controlfile);
   9.642 +  skipws(controlfile);
   9.643 +  gn[n] = 65536L * charsetname(controlfile);
   9.644 +  gndbl[n] = 0;
   9.645 +  return;
   9.646 +  }
   9.647 +
   9.648 +/****************************************************************************
   9.649 +
   9.650 +  readcontrol
   9.651 +
   9.652 +  Allocates memory and reads in the given control file.
   9.653 +  Called in readcontrolfiles().
   9.654 +
   9.655 +****************************************************************************/
   9.656 +
   9.657 +void readcontrol(controlname)
   9.658 +char *controlname;
   9.659 +{
   9.660 +  inchr firstch,lastch;
   9.661 +  char dashcheck;
   9.662 +  inchr offset;
   9.663 +  char *controlpath,magicnum[5];
   9.664 +  int command;
   9.665 +  ZFILE *controlfile;
   9.666 +  int namelen;
   9.667 +
   9.668 +  namelen = MYSTRLEN(fontdirname);
   9.669 +  controlpath = (char*)myalloc(sizeof(char)
   9.670 +    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
   9.671 +  controlfile = NULL;
   9.672 +  if (!hasdirsep(controlname)) {
   9.673 +    strcpy(controlpath,fontdirname);
   9.674 +    controlpath[namelen] = DIRSEP;
   9.675 +    controlpath[namelen+1] = '\0';
   9.676 +    strcat(controlpath,controlname);
   9.677 +    strcat(controlpath,CONTROLFILESUFFIX);
   9.678 +    controlfile = Zopen(controlpath,"rb");
   9.679 +    }
   9.680 +  if (controlfile==NULL) {
   9.681 +    strcpy(controlpath,controlname);
   9.682 +    strcat(controlpath,CONTROLFILESUFFIX);
   9.683 +    controlfile = Zopen(controlpath,"rb");
   9.684 +    if (controlfile==NULL) {
   9.685 +      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
   9.686 +        controlpath);
   9.687 +      exit(1);
   9.688 +      }
   9.689 +    }
   9.690 +
   9.691 +  free(controlpath);
   9.692 +
   9.693 +  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.694 +  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
   9.695 +  commandlistend = &(*commandlistend)->next;
   9.696 +  (*commandlistend) = NULL;
   9.697 +
   9.698 +  while(command=Zgetc(controlfile),command!=EOF) {
   9.699 +    switch (command) {
   9.700 +      case 't': /* Translate */
   9.701 +        skipws(controlfile);
   9.702 +        firstch=readTchar(controlfile);
   9.703 +        if ((dashcheck=Zgetc(controlfile))=='-') {
   9.704 +          lastch=readTchar(controlfile);
   9.705 +          }
   9.706 +        else {
   9.707 +          Zungetc(dashcheck,controlfile);
   9.708 +          lastch=firstch;
   9.709 +          }
   9.710 +        skipws(controlfile);
   9.711 +        offset=readTchar(controlfile)-firstch;
   9.712 +        skiptoeol(controlfile);
   9.713 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.714 +        (*commandlistend)->thecommand = 1;
   9.715 +        (*commandlistend)->rangelo = firstch;
   9.716 +        (*commandlistend)->rangehi = lastch;
   9.717 +        (*commandlistend)->offset = offset;
   9.718 +        commandlistend = &(*commandlistend)->next;
   9.719 +        (*commandlistend) = NULL;
   9.720 +        break;
   9.721 +      case '0': case '1': case '2': case '3': case '4':
   9.722 +      case '5': case '6': case '7': case '8': case '9':
   9.723 +      case '-':
   9.724 +                /* Mapping table entry */
   9.725 +        Zungetc(command,controlfile);
   9.726 +        readnum(controlfile,&firstch);
   9.727 +        skipws(controlfile);
   9.728 +	readnum(controlfile,&lastch);
   9.729 +	offset=lastch-firstch;
   9.730 +        lastch=firstch;
   9.731 +        skiptoeol(controlfile);
   9.732 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.733 +        (*commandlistend)->thecommand = 1;
   9.734 +        (*commandlistend)->rangelo = firstch;
   9.735 +        (*commandlistend)->rangehi = lastch;
   9.736 +        (*commandlistend)->offset = offset;
   9.737 +        commandlistend = &(*commandlistend)->next;
   9.738 +        (*commandlistend) = NULL;
   9.739 +        break;
   9.740 +      case 'f': /* freeze */
   9.741 +        skiptoeol(controlfile);
   9.742 +        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
   9.743 +        (*commandlistend)->thecommand = 0;
   9.744 +        commandlistend = &(*commandlistend)->next;
   9.745 +        (*commandlistend) = NULL;
   9.746 +        break;
   9.747 +      case 'b': /* DBCS input mode */
   9.748 +        multibyte = 1;
   9.749 +        break;
   9.750 +      case 'u': /* UTF-8 input mode */
   9.751 +        multibyte = 2;
   9.752 +        break;
   9.753 +      case 'h': /* HZ input mode */
   9.754 +        multibyte = 3;
   9.755 +        break;
   9.756 +      case 'j': /* Shift-JIS input mode */
   9.757 +        multibyte = 4;
   9.758 +        break;
   9.759 +      case 'g': /* ISO 2022 character set choices */
   9.760 +        multibyte = 0;
   9.761 +        skipws(controlfile);
   9.762 +        command=Zgetc(controlfile);
   9.763 +        switch (command) {
   9.764 +          case '0': /* define G0 charset */
   9.765 +            charset(0, controlfile);
   9.766 +            break;
   9.767 +          case '1': /* set G1 charset */
   9.768 +            charset(1, controlfile);
   9.769 +            break;
   9.770 +          case '2': /* set G2 charset */
   9.771 +            charset(2, controlfile);
   9.772 +            break;
   9.773 +          case '3': /* set G3 charset */
   9.774 +            charset(3, controlfile);
   9.775 +            break;
   9.776 +          case 'l': case 'L': /* define left half */
   9.777 +            skipws(controlfile);
   9.778 +            gl = Zgetc(controlfile) - '0';
   9.779 +            skiptoeol(controlfile);
   9.780 +            break;
   9.781 +          case 'r': case 'R': /* define right half */
   9.782 +            skipws(controlfile);
   9.783 +            gr = Zgetc(controlfile) - '0';
   9.784 +            skiptoeol(controlfile);
   9.785 +            break;
   9.786 +          default: /* meaningless "g" command */
   9.787 +            skiptoeol(controlfile);
   9.788 +          }
   9.789 +      case '\r': case '\n': /* blank line */
   9.790 +        break;
   9.791 +      default: /* Includes '#' */
   9.792 +        skiptoeol(controlfile);
   9.793 +      }
   9.794 +    }
   9.795 +  Zclose(controlfile);
   9.796 +}
   9.797 +
   9.798 +
   9.799 +/****************************************************************************
   9.800 +
   9.801 +  readcontrolfiles
   9.802 +
   9.803 +  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
   9.804 +  Called in main().
   9.805 +
   9.806 +****************************************************************************/
   9.807 +
   9.808 +void readcontrolfiles()
   9.809 +{
   9.810 +  cfnamenode *cfnptr;
   9.811 +
   9.812 +  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
   9.813 +    readcontrol(cfnptr->thename);
   9.814 +    }
   9.815 +}
   9.816 +
   9.817 +
   9.818 +/****************************************************************************
   9.819 +
   9.820 +  clearcfilelist
   9.821 +
   9.822 +  Clears the control file list.  Assumes thename does not need freeing.
   9.823 +
   9.824 +****************************************************************************/
   9.825 +
   9.826 +void clearcfilelist()
   9.827 +{
   9.828 +  cfnamenode *cfnptr1,*cfnptr2;
   9.829 +
   9.830 +  cfnptr1 = cfilelist;
   9.831 +  while (cfnptr1 != NULL) {
   9.832 +    cfnptr2 = cfnptr1->next;
   9.833 +    free(cfnptr1);
   9.834 +    cfnptr1 = cfnptr2;
   9.835 +    }
   9.836 +  cfilelist = NULL;
   9.837 +  cfilelistend = &cfilelist;
   9.838 +}
   9.839 +
   9.840 +
   9.841 +/****************************************************************************
   9.842 +
   9.843 +  getparams
   9.844 +
   9.845 +  Handles all command-line parameters.  Puts all parameters within
   9.846 +  bounds.
   9.847 +
   9.848 +****************************************************************************/
   9.849 +
   9.850 +void getparams()
   9.851 +{
   9.852 +  extern char *optarg;
   9.853 +  extern int optind;
   9.854 +  int c; /* "Should" be a char -- need int for "!= -1" test*/
   9.855 +  int columns,firstfont,infoprint;
   9.856 +  char *controlname;
   9.857 +
   9.858 +  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
   9.859 +    myname++;
   9.860 +    }
   9.861 +  else {
   9.862 +    myname = Myargv[0];
   9.863 +    }
   9.864 +  fontdirname = DEFAULTFONTDIR;
   9.865 +  firstfont = 1;
   9.866 +  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
   9.867 +  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
   9.868 +  if (suffixcmp(fontname,FONTFILESUFFIX)) {
   9.869 +    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
   9.870 +    }
   9.871 +  cfilelist = NULL;
   9.872 +  cfilelistend = &cfilelist;
   9.873 +  commandlist = NULL;
   9.874 +  commandlistend = &commandlist;
   9.875 +  smushoverride = SMO_NO;
   9.876 +  deutschflag = 0;
   9.877 +  justification = -1;
   9.878 +  right2left = -1;
   9.879 +  paragraphflag = 0;
   9.880 +  infoprint = -1;
   9.881 +  cmdinput = 0;
   9.882 +  outputwidth = DEFAULTCOLUMNS;
   9.883 +  gn[1] = 0x80;
   9.884 +  gr = 1;
   9.885 +  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
   9.886 +      /* Note: -F is not a legal option -- prints a special err message.  */
   9.887 +    switch (c) {
   9.888 +      case 'A':
   9.889 +        cmdinput = 1;
   9.890 +        break;
   9.891 +      case 'D':
   9.892 +        deutschflag = 1;
   9.893 +        break;
   9.894 +      case 'E':
   9.895 +        deutschflag = 0;
   9.896 +        break;
   9.897 +      case 'X':
   9.898 +        right2left = -1;
   9.899 +        break;
   9.900 +      case 'L':
   9.901 +        right2left = 0;
   9.902 +        break;
   9.903 +      case 'R':
   9.904 +        right2left = 1;
   9.905 +        break;
   9.906 +      case 'x':
   9.907 +        justification = -1;
   9.908 +        break;
   9.909 +      case 'l':
   9.910 +        justification = 0;
   9.911 +        break;
   9.912 +      case 'c':
   9.913 +        justification = 1;
   9.914 +        break;
   9.915 +      case 'r':
   9.916 +        justification = 2;
   9.917 +        break;
   9.918 +      case 'p':
   9.919 +        paragraphflag = 1;
   9.920 +        break;
   9.921 +      case 'n':
   9.922 +        paragraphflag = 0;
   9.923 +        break;
   9.924 +      case 's':
   9.925 +        smushoverride = SMO_NO;
   9.926 +        break;
   9.927 +      case 'k':
   9.928 +        smushmode = SM_KERN;
   9.929 +        smushoverride = SMO_YES;
   9.930 +        break;
   9.931 +      case 'S':
   9.932 +        smushmode = SM_SMUSH;
   9.933 +	smushoverride = SMO_FORCE;
   9.934 +        break;
   9.935 +      case 'o':
   9.936 +        smushmode = SM_SMUSH;
   9.937 +	smushoverride = SMO_YES;
   9.938 +        break;
   9.939 +      case 'W':
   9.940 +        smushmode = 0;
   9.941 +	smushoverride = SMO_YES;
   9.942 +        break;
   9.943 +      case 't':
   9.944 +#ifdef TIOCGWINSZ
   9.945 +        columns = get_columns();
   9.946 +        if (columns>0) {
   9.947 +          outputwidth = columns;
   9.948 +          }
   9.949 +#else /* ifdef TIOCGWINSZ */
   9.950 +        fprintf(stderr,
   9.951 +          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
   9.952 +          myname);
   9.953 +#endif /* ifdef TIOCGWINSZ */
   9.954 +        break;
   9.955 +      case 'v':
   9.956 +        infoprint = 0;
   9.957 +        break;
   9.958 +      case 'I':
   9.959 +        infoprint = atoi(optarg);
   9.960 +        break;
   9.961 +      case 'm':
   9.962 +        smushmode = atoi(optarg);
   9.963 +        if (smushmode < -1) {
   9.964 +          smushoverride = SMO_NO;
   9.965 +          break;
   9.966 +          }
   9.967 +	if (smushmode == 0) smushmode = SM_KERN;
   9.968 +	else if (smushmode == -1) smushmode = 0;
   9.969 +	else smushmode = (smushmode & 63) | SM_SMUSH;
   9.970 +	smushoverride = SMO_YES;
   9.971 +        break;
   9.972 +      case 'w':
   9.973 +        columns = atoi(optarg);
   9.974 +        if (columns>0) {
   9.975 +          outputwidth = columns;
   9.976 +          }
   9.977 +        break;
   9.978 +      case 'd':
   9.979 +        fontdirname = optarg;
   9.980 +        break;
   9.981 +      case 'f':
   9.982 +        if (firstfont) {
   9.983 +          free(fontname);
   9.984 +          firstfont = 0;
   9.985 +          }
   9.986 +        fontname = optarg;
   9.987 +        if (suffixcmp(fontname,FONTFILESUFFIX)) {
   9.988 +          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
   9.989 +          }
   9.990 +        break;
   9.991 +      case 'C':
   9.992 +        controlname = optarg;
   9.993 +        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
   9.994 +          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
   9.995 +          }
   9.996 +        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
   9.997 +        (*cfilelistend)->thename = controlname;
   9.998 +        cfilelistend = &(*cfilelistend)->next;
   9.999 +        (*cfilelistend) = NULL;
  9.1000 +        break;
  9.1001 +      case 'N':
  9.1002 +        clearcfilelist();
  9.1003 +        multibyte = 0;
  9.1004 +        gn[0] = 0;
  9.1005 +        gn[1] = 0x80;
  9.1006 +        gn[2] = gn[3] = 0;
  9.1007 +        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
  9.1008 +        gl = 0;
  9.1009 +        gr = 1;
  9.1010 +        break;
  9.1011 +      case 'F': /* Not a legal option */
  9.1012 +        fprintf(stderr,"%s: illegal option -- F\n",myname);
  9.1013 +        printusage(stderr);
  9.1014 +        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
  9.1015 +        fprintf(stderr," \"-F\" option has been\n");
  9.1016 +        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
  9.1017 +        fprintf(stderr," program, which is now\n");
  9.1018 +        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
  9.1019 +        fprintf(stderr," is also available\n");
  9.1020 +        fprintf(stderr,"from  http://www.figlet.org/");
  9.1021 +        fprintf(stderr,"under UNIX utilities.\n");
  9.1022 +        exit(1);
  9.1023 +        break;
  9.1024 +      default:
  9.1025 +        printusage(stderr);
  9.1026 +        exit(1);
  9.1027 +      }
  9.1028 +    }
  9.1029 +  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
  9.1030 +  outlinelenlimit = outputwidth-1;
  9.1031 +  if (infoprint>=0) {
  9.1032 +    printinfo(infoprint);
  9.1033 +    exit(0);
  9.1034 +    }
  9.1035 +}
  9.1036 +
  9.1037 +
  9.1038 +/****************************************************************************
  9.1039 +
  9.1040 +  clearline
  9.1041 +
  9.1042 +  Clears both the input (inchrline) and output (outputline) storage.
  9.1043 +
  9.1044 +****************************************************************************/
  9.1045 +
  9.1046 +void clearline()
  9.1047 +{
  9.1048 +  int i;
  9.1049 +
  9.1050 +  for (i=0;i<charheight;i++) {
  9.1051 +    outputline[i][0] = '\0';
  9.1052 +    }
  9.1053 +  outlinelen = 0;
  9.1054 +  inchrlinelen = 0;
  9.1055 +}
  9.1056 +
  9.1057 +
  9.1058 +/****************************************************************************
  9.1059 +
  9.1060 +  readfontchar
  9.1061 +
  9.1062 +  Reads a font character from the font file, and places it in a
  9.1063 +  newly-allocated entry in the list.
  9.1064 +
  9.1065 +****************************************************************************/
  9.1066 +
  9.1067 +void readfontchar(file,theord,line,maxlen)
  9.1068 +ZFILE *file;
  9.1069 +inchr theord;
  9.1070 +char *line;
  9.1071 +int maxlen;
  9.1072 +{
  9.1073 +  int row,k;
  9.1074 +  char endchar;
  9.1075 +  fcharnode *fclsave;
  9.1076 +
  9.1077 +  fclsave = fcharlist;
  9.1078 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
  9.1079 +  fcharlist->ord = theord;
  9.1080 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
  9.1081 +  fcharlist->next = fclsave;
  9.1082 +  for (row=0;row<charheight;row++) {
  9.1083 +    if (myfgets(line,maxlen+1,file)==NULL) {
  9.1084 +      line[0] = '\0';
  9.1085 +      }
  9.1086 +    k = MYSTRLEN(line)-1;
  9.1087 +    while (k>=0 && isspace(line[k])) {
  9.1088 +      k--;
  9.1089 +      }
  9.1090 +    if (k>=0) {
  9.1091 +      endchar = line[k];
  9.1092 +      while (k>=0 ? line[k]==endchar : 0) {
  9.1093 +        k--;
  9.1094 +        }
  9.1095 +      }
  9.1096 +    line[k+1] = '\0';
  9.1097 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
  9.1098 +    strcpy(fcharlist->thechar[row],line);
  9.1099 +    }
  9.1100 +}
  9.1101 +
  9.1102 +
  9.1103 +/****************************************************************************
  9.1104 +
  9.1105 +  readfont
  9.1106 +
  9.1107 +  Allocates memory, initializes variables, and reads in the font.
  9.1108 +  Called near beginning of main().
  9.1109 +
  9.1110 +****************************************************************************/
  9.1111 +
  9.1112 +void readfont()
  9.1113 +{
  9.1114 +#define MAXFIRSTLINELEN 1000
  9.1115 +  int i,row,numsread;
  9.1116 +  inchr theord;
  9.1117 +  int maxlen,cmtlines,ffright2left;
  9.1118 +  int smush,smush2;
  9.1119 +  char *fontpath,*fileline,magicnum[5];
  9.1120 +  ZFILE *fontfile;
  9.1121 +  int namelen;
  9.1122 +
  9.1123 +  namelen = MYSTRLEN(fontdirname);
  9.1124 +  fontpath = (char*)myalloc(sizeof(char)
  9.1125 +    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
  9.1126 +  fontfile = NULL;
  9.1127 +  if (!hasdirsep(fontname)) {
  9.1128 +    strcpy(fontpath,fontdirname);
  9.1129 +    fontpath[namelen] = DIRSEP;
  9.1130 +    fontpath[namelen+1] = '\0';
  9.1131 +    strcat(fontpath,fontname);
  9.1132 +    strcat(fontpath,FONTFILESUFFIX);
  9.1133 +    fontfile = Zopen(fontpath,"rb");
  9.1134 +    }
  9.1135 +  if (fontfile==NULL) {
  9.1136 +    strcpy(fontpath,fontname);
  9.1137 +    strcat(fontpath,FONTFILESUFFIX);
  9.1138 +    fontfile = Zopen(fontpath,"rb");
  9.1139 +    if (fontfile==NULL) {
  9.1140 +      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
  9.1141 +      exit(1);
  9.1142 +      }
  9.1143 +    }
  9.1144 +
  9.1145 +  readmagic(fontfile,magicnum);
  9.1146 +  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
  9.1147 +  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
  9.1148 +    fileline[0] = '\0';
  9.1149 +    }
  9.1150 +  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
  9.1151 +    skiptoeol(fontfile);
  9.1152 +    }
  9.1153 +  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
  9.1154 +    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
  9.1155 +    &ffright2left,&smush2);
  9.1156 +  free(fileline);
  9.1157 +  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
  9.1158 +    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
  9.1159 +    exit(1);
  9.1160 +    }
  9.1161 +  for (i=1;i<=cmtlines;i++) {
  9.1162 +    skiptoeol(fontfile);
  9.1163 +    }
  9.1164 +  free(fontpath);
  9.1165 +
  9.1166 +  if (numsread<6) {
  9.1167 +    ffright2left = 0;
  9.1168 +    }
  9.1169 +
  9.1170 +  if (numsread<7) { /* if no smush2, decode smush into smush2 */
  9.1171 +    if (smush == 0) smush2 = SM_KERN;
  9.1172 +    else if (smush < 0) smush2 = 0;
  9.1173 +    else smush2 = (smush & 31) | SM_SMUSH;
  9.1174 +    }
  9.1175 +
  9.1176 +  if (charheight<1) {
  9.1177 +    charheight = 1;
  9.1178 +    }
  9.1179 +
  9.1180 +  if (maxlen<1) {
  9.1181 +    maxlen = 1;
  9.1182 +    }
  9.1183 +
  9.1184 +  maxlen += 100; /* Give ourselves some extra room */
  9.1185 +
  9.1186 +  if (smushoverride == SMO_NO)
  9.1187 +     smushmode = smush2;
  9.1188 +  else if (smushoverride == SMO_FORCE)
  9.1189 +     smushmode |= smush2;
  9.1190 +
  9.1191 +  if (right2left<0) {
  9.1192 +    right2left = ffright2left;
  9.1193 +    }
  9.1194 +
  9.1195 +  if (justification<0) {
  9.1196 +    justification = 2*right2left;
  9.1197 +    }
  9.1198 +
  9.1199 +  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
  9.1200 +  /* Allocate "missing" character */
  9.1201 +  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
  9.1202 +  fcharlist->ord = 0;
  9.1203 +  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
  9.1204 +  fcharlist->next = NULL;
  9.1205 +  for (row=0;row<charheight;row++) {
  9.1206 +    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
  9.1207 +    fcharlist->thechar[row][0] = '\0';
  9.1208 +    }
  9.1209 +  for (theord=' ';theord<='~';theord++) {
  9.1210 +    readfontchar(fontfile,theord,fileline,maxlen);
  9.1211 +    }
  9.1212 +  for (theord=0;theord<=6;theord++) {
  9.1213 +    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
  9.1214 +    }
  9.1215 +  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
  9.1216 +    sscanf(fileline,"%li",&theord)==1) {
  9.1217 +    readfontchar(fontfile,theord,fileline,maxlen);
  9.1218 +    }
  9.1219 +  Zclose(fontfile);
  9.1220 +  free(fileline);
  9.1221 +}
  9.1222 +
  9.1223 +
  9.1224 +/****************************************************************************
  9.1225 +
  9.1226 +  linealloc
  9.1227 +
  9.1228 +  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
  9.1229 +  Called near beginning of main().
  9.1230 +
  9.1231 +****************************************************************************/
  9.1232 +
  9.1233 +void linealloc()
  9.1234 +{
  9.1235 +  int row; 
  9.1236 +
  9.1237 +  outputline = (char**)myalloc(sizeof(char*)*charheight);
  9.1238 +  for (row=0;row<charheight;row++) {
  9.1239 +    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
  9.1240 +    }
  9.1241 +  inchrlinelenlimit = outputwidth*4+100;
  9.1242 +  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
  9.1243 +  clearline();
  9.1244 +}
  9.1245 +
  9.1246 +
  9.1247 +/****************************************************************************
  9.1248 +
  9.1249 +  getletter
  9.1250 +
  9.1251 +  Sets currchar to point to the font entry for the given character.
  9.1252 +  Sets currcharwidth to the width of this character.
  9.1253 +
  9.1254 +****************************************************************************/
  9.1255 +
  9.1256 +void getletter(c)
  9.1257 +inchr c;
  9.1258 +{
  9.1259 +  fcharnode *charptr;
  9.1260 +
  9.1261 +  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
  9.1262 +    charptr=charptr->next) ;
  9.1263 +  if (charptr!=NULL) {
  9.1264 +    currchar = charptr->thechar;
  9.1265 +    }
  9.1266 +  else {
  9.1267 +    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
  9.1268 +      charptr=charptr->next) ;
  9.1269 +    currchar = charptr->thechar;
  9.1270 +    }
  9.1271 +  previouscharwidth = currcharwidth;
  9.1272 +  currcharwidth = MYSTRLEN(currchar[0]);
  9.1273 +}
  9.1274 +
  9.1275 +
  9.1276 +/****************************************************************************
  9.1277 +
  9.1278 +  smushem
  9.1279 +
  9.1280 +  Given 2 characters, attempts to smush them into 1, according to
  9.1281 +  smushmode.  Returns smushed character or '\0' if no smushing can be
  9.1282 +  done.
  9.1283 +
  9.1284 +  smushmode values are sum of following (all values smush blanks):
  9.1285 +    1: Smush equal chars (not hardblanks)
  9.1286 +    2: Smush '_' with any char in hierarchy below
  9.1287 +    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
  9.1288 +       Each class in hier. can be replaced by later class.
  9.1289 +    8: [ + ] -> |, { + } -> |, ( + ) -> |
  9.1290 +   16: / + \ -> X, > + < -> X (only in that order)
  9.1291 +   32: hardblank + hardblank -> hardblank
  9.1292 +
  9.1293 +****************************************************************************/
  9.1294 +
  9.1295 +char smushem(lch,rch)
  9.1296 +char lch,rch;
  9.1297 +{
  9.1298 +  if (lch==' ') return rch;
  9.1299 +  if (rch==' ') return lch;
  9.1300 +
  9.1301 +  if (previouscharwidth<2 || currcharwidth<2) return '\0';
  9.1302 +    /* Disallows overlapping if the previous character */
  9.1303 +    /* or the current character has a width of 1 or zero. */
  9.1304 +
  9.1305 +  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
  9.1306 +
  9.1307 +  if ((smushmode & 63) == 0) {
  9.1308 +    /* This is smushing by universal overlapping. */
  9.1309 +    if (lch==' ') return rch;
  9.1310 +    if (rch==' ') return lch;
  9.1311 +    if (lch==hardblank) return rch;
  9.1312 +    if (rch==hardblank) return lch;
  9.1313 +      /* Above four lines ensure overlapping preference to */
  9.1314 +      /* visible characters. */
  9.1315 +    if (right2left==1) return lch;
  9.1316 +      /* Above line ensures that the dominant (foreground) */
  9.1317 +      /* fig-character for overlapping is the latter in the */
  9.1318 +      /* user's text, not necessarily the rightmost character. */
  9.1319 +    return rch;
  9.1320 +      /* Occurs in the absence of above exceptions. */
  9.1321 +    }
  9.1322 +  
  9.1323 +  if (smushmode & SM_HARDBLANK) {
  9.1324 +    if (lch==hardblank && rch==hardblank) return lch;
  9.1325 +    }
  9.1326 +
  9.1327 +  if (lch==hardblank || rch==hardblank) return '\0';
  9.1328 +
  9.1329 +  if (smushmode & SM_EQUAL) {
  9.1330 +    if (lch==rch) return lch;
  9.1331 +    }
  9.1332 +
  9.1333 +  if (smushmode & SM_LOWLINE) {
  9.1334 +    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
  9.1335 +    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
  9.1336 +    }
  9.1337 +
  9.1338 +  if (smushmode & SM_HIERARCHY) {
  9.1339 +    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
  9.1340 +    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
  9.1341 +    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
  9.1342 +    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
  9.1343 +    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
  9.1344 +    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
  9.1345 +    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
  9.1346 +    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
  9.1347 +    if (strchr("()",lch) && strchr("<>",rch)) return rch;
  9.1348 +    if (strchr("()",rch) && strchr("<>",lch)) return lch;
  9.1349 +    }
  9.1350 +
  9.1351 +  if (smushmode & SM_PAIR) {
  9.1352 +    if (lch=='[' && rch==']') return '|';
  9.1353 +    if (rch=='[' && lch==']') return '|';
  9.1354 +    if (lch=='{' && rch=='}') return '|';
  9.1355 +    if (rch=='{' && lch=='}') return '|';
  9.1356 +    if (lch=='(' && rch==')') return '|';
  9.1357 +    if (rch=='(' && lch==')') return '|';
  9.1358 +    }
  9.1359 +
  9.1360 +  if (smushmode & SM_BIGX) {
  9.1361 +    if (lch=='/' && rch=='\\') return '|';
  9.1362 +    if (rch=='/' && lch=='\\') return 'Y';
  9.1363 +    if (lch=='>' && rch=='<') return 'X';
  9.1364 +      /* Don't want the reverse of above to give 'X'. */
  9.1365 +    }
  9.1366 +
  9.1367 +  return '\0';
  9.1368 +}
  9.1369 +
  9.1370 +
  9.1371 +/****************************************************************************
  9.1372 +
  9.1373 +  smushamt
  9.1374 +
  9.1375 +  Returns the maximum amount that the current character can be smushed
  9.1376 +  into the current line.
  9.1377 +
  9.1378 +****************************************************************************/
  9.1379 +
  9.1380 +int smushamt()
  9.1381 +{
  9.1382 +  int maxsmush,amt;
  9.1383 +  int row,linebd,charbd;
  9.1384 +  char ch1,ch2;
  9.1385 +
  9.1386 +  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
  9.1387 +    return 0;
  9.1388 +    }
  9.1389 +  maxsmush = currcharwidth;
  9.1390 +  for (row=0;row<charheight;row++) {
  9.1391 +    if (right2left) {
  9.1392 +      for (charbd=MYSTRLEN(currchar[row]);
  9.1393 +        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
  9.1394 +      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
  9.1395 +      amt = linebd+currcharwidth-1-charbd;
  9.1396 +      }
  9.1397 +    else {
  9.1398 +      for (linebd=MYSTRLEN(outputline[row]);
  9.1399 +        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
  9.1400 +      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
  9.1401 +      amt = charbd+outlinelen-1-linebd;
  9.1402 +      }
  9.1403 +    if (!ch1||ch1==' ') {
  9.1404 +      amt++;
  9.1405 +      }
  9.1406 +    else if (ch2) {
  9.1407 +      if (smushem(ch1,ch2)!='\0') {
  9.1408 +        amt++;
  9.1409 +        }
  9.1410 +      }
  9.1411 +    if (amt<maxsmush) {
  9.1412 +      maxsmush = amt;
  9.1413 +      }
  9.1414 +    }
  9.1415 +  return maxsmush;
  9.1416 +}
  9.1417 +
  9.1418 +
  9.1419 +/****************************************************************************
  9.1420 +
  9.1421 +  addchar
  9.1422 +
  9.1423 +  Attempts to add the given character onto the end of the current line.
  9.1424 +  Returns 1 if this can be done, 0 otherwise.
  9.1425 +
  9.1426 +****************************************************************************/
  9.1427 +
  9.1428 +int addchar(c)
  9.1429 +inchr c;
  9.1430 +{
  9.1431 +  int smushamount,row,k;
  9.1432 +  char *templine;
  9.1433 +
  9.1434 +  getletter(c);
  9.1435 +  smushamount = smushamt();
  9.1436 +  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
  9.1437 +      ||inchrlinelen+1>inchrlinelenlimit) {
  9.1438 +    return 0;
  9.1439 +    }
  9.1440 +
  9.1441 +  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
  9.1442 +  for (row=0;row<charheight;row++) {
  9.1443 +    if (right2left) {
  9.1444 +      strcpy(templine,currchar[row]);
  9.1445 +      for (k=0;k<smushamount;k++) {
  9.1446 +        templine[currcharwidth-smushamount+k] =
  9.1447 +          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
  9.1448 +        }
  9.1449 +      strcat(templine,outputline[row]+smushamount);
  9.1450 +      strcpy(outputline[row],templine);
  9.1451 +      }
  9.1452 +    else {
  9.1453 +      for (k=0;k<smushamount;k++) {
  9.1454 +        outputline[row][outlinelen-smushamount+k] =
  9.1455 +          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
  9.1456 +        }
  9.1457 +      strcat(outputline[row],currchar[row]+smushamount);
  9.1458 +      }
  9.1459 +    }
  9.1460 +  free(templine);
  9.1461 +  outlinelen = MYSTRLEN(outputline[0]);
  9.1462 +  inchrline[inchrlinelen++] = c;
  9.1463 +  return 1;
  9.1464 +}
  9.1465 +
  9.1466 +
  9.1467 +/****************************************************************************
  9.1468 +
  9.1469 +  putstring
  9.1470 +
  9.1471 +  Prints out the given null-terminated string, substituting blanks
  9.1472 +  for hardblanks.  If outputwidth is 1, prints the entire string;
  9.1473 +  otherwise prints at most outputwidth-1 characters.  Prints a newline
  9.1474 +  at the end of the string.  The string is left-justified, centered or
  9.1475 +  right-justified (taking outputwidth as the screen width) if
  9.1476 +  justification is 0, 1 or 2, respectively.
  9.1477 +
  9.1478 +****************************************************************************/
  9.1479 +
  9.1480 +static int nr_chars=0;
  9.1481 +static void myputchar(unsigned char c)
  9.1482 +{
  9.1483 +    static int startline = 1;
  9.1484 +
  9.1485 +    if ( startline )
  9.1486 +    {
  9.1487 +        startline = 0;
  9.1488 +        myputchar(' ');
  9.1489 +    }
  9.1490 +
  9.1491 +    putc(c, stderr);
  9.1492 +
  9.1493 +    if ( nr_chars == 0 )
  9.1494 +        putchar('"');
  9.1495 +
  9.1496 +    putchar('\\');
  9.1497 +    putchar('0' + ((c>>6)&7));
  9.1498 +    putchar('0' + ((c>>3)&7));
  9.1499 +    putchar('0' + ((c>>0)&7));
  9.1500 +
  9.1501 +    if ( c == '\n' )
  9.1502 +        startline = 1;
  9.1503 +
  9.1504 +    if ( ++nr_chars == 18 ) 
  9.1505 +    {
  9.1506 +        nr_chars = 0;
  9.1507 +        putchar('"');
  9.1508 +        putchar(' ');
  9.1509 +        putchar('\\');
  9.1510 +        putchar('\n');
  9.1511 +    }
  9.1512 +}
  9.1513 +
  9.1514 +void putstring(string)
  9.1515 +char *string;
  9.1516 +{
  9.1517 +  int i,len;
  9.1518 +
  9.1519 +  len = MYSTRLEN(string);
  9.1520 +  if (outputwidth>1) {
  9.1521 +    if (len>outputwidth-1) {
  9.1522 +      len = outputwidth-1;
  9.1523 +      }
  9.1524 +    if (justification>0) {
  9.1525 +      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
  9.1526 +        myputchar(' ');
  9.1527 +        }
  9.1528 +      }
  9.1529 +    }
  9.1530 +  for (i=0;i<len;i++) {
  9.1531 +    myputchar(string[i]==hardblank?' ':string[i]);
  9.1532 +    }
  9.1533 +  myputchar('\n');
  9.1534 +}
  9.1535 +
  9.1536 +
  9.1537 +/****************************************************************************
  9.1538 +
  9.1539 +  printline
  9.1540 +
  9.1541 +  Prints outputline using putstring, then clears the current line.
  9.1542 +
  9.1543 +****************************************************************************/
  9.1544 +
  9.1545 +void printline()
  9.1546 +{
  9.1547 +  int i;
  9.1548 +
  9.1549 +  for (i=0;i<charheight;i++) {
  9.1550 +    putstring(outputline[i]);
  9.1551 +    }
  9.1552 +  clearline();
  9.1553 +}
  9.1554 +
  9.1555 +
  9.1556 +/****************************************************************************
  9.1557 +
  9.1558 +  splitline
  9.1559 +
  9.1560 +  Splits inchrline at the last word break (bunch of consecutive blanks).
  9.1561 +  Makes a new line out of the first part and prints it using
  9.1562 +  printline.  Makes a new line out of the second part and returns.
  9.1563 +
  9.1564 +****************************************************************************/
  9.1565 +
  9.1566 +void splitline()
  9.1567 +{
  9.1568 +  int i,gotspace,lastspace,len1,len2;
  9.1569 +  inchr *part1,*part2;
  9.1570 +
  9.1571 +  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
  9.1572 +  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
  9.1573 +  gotspace = 0;
  9.1574 +  for (i=inchrlinelen-1;i>=0;i--) {
  9.1575 +    if (!gotspace && inchrline[i]==' ') {
  9.1576 +      gotspace = 1;
  9.1577 +      lastspace = i;
  9.1578 +      }
  9.1579 +    if (gotspace && inchrline[i]!=' ') {
  9.1580 +      break;
  9.1581 +      }
  9.1582 +    }
  9.1583 +  len1 = i+1;
  9.1584 +  len2 = inchrlinelen-lastspace-1;
  9.1585 +  for (i=0;i<len1;i++) {
  9.1586 +    part1[i] = inchrline[i];
  9.1587 +    }
  9.1588 +  for (i=0;i<len2;i++) {
  9.1589 +    part2[i] = inchrline[lastspace+1+i];
  9.1590 +    }
  9.1591 +  clearline();
  9.1592 +  for (i=0;i<len1;i++) {
  9.1593 +    addchar(part1[i]);
  9.1594 +    }
  9.1595 +  printline();
  9.1596 +  for (i=0;i<len2;i++) {
  9.1597 +    addchar(part2[i]);
  9.1598 +    }
  9.1599 +  free(part1);
  9.1600 +  free(part2);
  9.1601 +}
  9.1602 +
  9.1603 +
  9.1604 +/****************************************************************************
  9.1605 +
  9.1606 +  handlemapping
  9.1607 +
  9.1608 +  Given an input character (type inchr), executes re-mapping commands
  9.1609 +  read from control files.  Returns re-mapped character (inchr).
  9.1610 +
  9.1611 +****************************************************************************/
  9.1612 +
  9.1613 +inchr handlemapping(c)
  9.1614 +inchr c;
  9.1615 +{
  9.1616 +  comnode *cmptr;
  9.1617 +
  9.1618 +  cmptr=commandlist;
  9.1619 +  while (cmptr!=NULL) {
  9.1620 +    if (cmptr->thecommand ?
  9.1621 +      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
  9.1622 +      c += cmptr->offset;
  9.1623 +      while(cmptr!=NULL ? cmptr->thecommand : 0) {
  9.1624 +        cmptr=cmptr->next;
  9.1625 +        }
  9.1626 +      }
  9.1627 +    else {
  9.1628 +      cmptr=cmptr->next;
  9.1629 +      }
  9.1630 +    }
  9.1631 +  return c;
  9.1632 +}
  9.1633 +
  9.1634 +/****************************************************************************
  9.1635 +
  9.1636 +  Agetchar
  9.1637 +
  9.1638 +  Replacement to getchar().
  9.1639 +  Acts exactly like getchar if -A is NOT specified,
  9.1640 +  else obtains input from All remaining command line words.
  9.1641 +
  9.1642 +****************************************************************************/
  9.1643 +
  9.1644 +int Agetchar()
  9.1645 +{
  9.1646 +    extern int optind;		/* current argv[] element under study */
  9.1647 +    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
  9.1648 +    char   *arg;		/* pointer to active character */
  9.1649 +    int    c;			/* current character */
  9.1650 +
  9.1651 +    if ( ! cmdinput )		/* is -A active? */
  9.1652 +	return( getchar() );	/* no: return stdin character */
  9.1653 +
  9.1654 +    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
  9.1655 +	return( EOF );		/* **ensure it now and forever more */
  9.1656 +
  9.1657 +    /* find next character */
  9.1658 +    arg = Myargv[optind];		/* pointer to active arg */
  9.1659 +    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
  9.1660 +
  9.1661 +    if ( ! c )			/* at '\0' that terminates word? */
  9.1662 +    {   /* at end of word: return ' ' if normal word, '\n' if empty */
  9.1663 +	c = ' ';		/* suppose normal word and return blank */
  9.1664 +	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
  9.1665 +	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
  9.1666 +	AgetMode = 0;		/* return to char 0 in NEXT word */
  9.1667 +	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
  9.1668 +	{   /* just ran out of arguments */
  9.1669 +	    c = EOF;		/* return EOF */
  9.1670 +	    AgetMode = -1;	/* ensure all future returns return EOF */
  9.1671 +	}
  9.1672 +    }
  9.1673 +
  9.1674 +    return( c );		/* return appropriate character */
  9.1675 +
  9.1676 +}	/* end: Agetchar() */
  9.1677 +
  9.1678 +
  9.1679 +/****************************************************************************
  9.1680 +
  9.1681 +  iso2022
  9.1682 +
  9.1683 +  Called by getinchr.  Interprets ISO 2022 sequences
  9.1684 +
  9.1685 +******************************************************************************/
  9.1686 +
  9.1687 +inchr iso2022()
  9.1688 +{
  9.1689 +  inchr ch;
  9.1690 +  inchr ch2;
  9.1691 +  int save_gl;
  9.1692 +  int save_gr;
  9.1693 +
  9.1694 +  ch = Agetchar();
  9.1695 +  if (ch == EOF) return ch;
  9.1696 +  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
  9.1697 +  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
  9.1698 +  switch (ch) {
  9.1699 +    case 14: /* invoke G0 into GL */
  9.1700 +      gl = 0;
  9.1701 +      return iso2022();
  9.1702 +    case 15: /* invoke G1 into GL */
  9.1703 +      gl = 1;
  9.1704 +      return iso2022();
  9.1705 +    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
  9.1706 +      save_gl = gl; save_gr = gr;
  9.1707 +      gl = gr = 2;
  9.1708 +      ch = iso2022();
  9.1709 +      gl = save_gl; gr = save_gr;
  9.1710 +      return ch;
  9.1711 +    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
  9.1712 +      save_gl = gl; save_gr = gr;
  9.1713 +      gl = gr = 3;
  9.1714 +      ch = iso2022();
  9.1715 +      gl = save_gl; gr = save_gr;
  9.1716 +      return ch;
  9.1717 +    case 'n' + 0x100: /* invoke G2 into GL */
  9.1718 +      gl = 2;
  9.1719 +      return iso2022();
  9.1720 +    case 'o' + 0x100: /* invoke G3 into GL */
  9.1721 +      gl = 3;
  9.1722 +      return iso2022();
  9.1723 +    case '~' + 0x100: /* invoke G1 into GR */
  9.1724 +      gr = 1;
  9.1725 +      return iso2022();
  9.1726 +    case '}' + 0x100: /* invoke G2 into GR */
  9.1727 +      gr = 2;
  9.1728 +      return iso2022();
  9.1729 +    case '|' + 0x100: /* invoke G3 into GR */
  9.1730 +      gr = 3;
  9.1731 +      return iso2022();
  9.1732 +    case '(' + 0x100: /* set G0 to 94-char set */
  9.1733 +      ch = Agetchar();
  9.1734 +      if (ch == 'B') ch = 0; /* ASCII */
  9.1735 +      gn[0] = ch << 16;
  9.1736 +      gndbl[0] = 0;
  9.1737 +      return iso2022();
  9.1738 +    case ')' + 0x100: /* set G1 to 94-char set */
  9.1739 +      ch = Agetchar();
  9.1740 +      if (ch == 'B') ch = 0;
  9.1741 +      gn[1] = ch << 16;
  9.1742 +      gndbl[1] = 0;
  9.1743 +      return iso2022();
  9.1744 +    case '*' + 0x100: /* set G2 to 94-char set */
  9.1745 +      ch = Agetchar();
  9.1746 +      if (ch == 'B') ch = 0;
  9.1747 +      gn[2] = ch << 16;
  9.1748 +      gndbl[2] = 0;
  9.1749 +      return iso2022();
  9.1750 +    case '+' + 0x100: /* set G3 to 94-char set */
  9.1751 +      ch = Agetchar();
  9.1752 +      if (ch == 'B') ch = 0;
  9.1753 +      gn[3] = ch << 16;
  9.1754 +      gndbl[3] = 0;
  9.1755 +      return iso2022();
  9.1756 +    case '-' + 0x100: /* set G1 to 96-char set */
  9.1757 +      ch = Agetchar();
  9.1758 +      if (ch == 'A') ch = 0; /* Latin-1 top half */
  9.1759 +      gn[1] = (ch << 16) | 0x80;
  9.1760 +      gndbl[1] = 0;
  9.1761 +      return iso2022();
  9.1762 +    case '.' + 0x100: /* set G2 to 96-char set */
  9.1763 +      ch = Agetchar();
  9.1764 +      if (ch == 'A') ch = 0;
  9.1765 +      gn[2] = (ch << 16) | 0x80;
  9.1766 +      gndbl[2] = 0;
  9.1767 +      return iso2022();
  9.1768 +    case '/' + 0x100: /* set G3 to 96-char set */
  9.1769 +      ch = Agetchar();
  9.1770 +      if (ch == 'A') ch = 0;
  9.1771 +      gn[3] = (ch << 16) | 0x80;
  9.1772 +      gndbl[3] = 0;
  9.1773 +      return iso2022();
  9.1774 +    case '(' + 0x200: /* set G0 to 94 x 94 char set */
  9.1775 +      ch = Agetchar();
  9.1776 +      gn[0] = ch << 16;
  9.1777 +      gndbl[0] = 1;
  9.1778 +      return iso2022();
  9.1779 +    case ')' + 0x200: /* set G1 to 94 x 94 char set */
  9.1780 +      ch = Agetchar();
  9.1781 +      gn[1] = ch << 16;
  9.1782 +      gndbl[1] = 1;
  9.1783 +      return iso2022();
  9.1784 +    case '*' + 0x200: /* set G2 to 94 x 94 char set */
  9.1785 +      ch = Agetchar();
  9.1786 +      gn[2] = ch << 16;
  9.1787 +      gndbl[2] = 1;
  9.1788 +      return iso2022();
  9.1789 +    case '+' + 0x200: /* set G3 to 94 x 94 char set */
  9.1790 +      ch = Agetchar();
  9.1791 +      gn[3] = ch << 16;
  9.1792 +      gndbl[3] = 1;
  9.1793 +      return iso2022();
  9.1794 +    default:
  9.1795 +      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
  9.1796 +        gn[0] = (ch & ~0x200) << 16;
  9.1797 +        gndbl[0] = 1;
  9.1798 +        return iso2022();
  9.1799 +        }
  9.1800 +      }
  9.1801 +
  9.1802 +  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
  9.1803 +    if (gndbl[gl]) {
  9.1804 +      ch2 = Agetchar();
  9.1805 +      return gn[gl] | (ch << 8) | ch2;
  9.1806 +      }
  9.1807 +    else return gn[gl] | ch;
  9.1808 +    }
  9.1809 +  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
  9.1810 +    if (gndbl[gr]) {
  9.1811 +      ch2 = Agetchar();
  9.1812 +      return gn[gr] | (ch << 8) | ch2;
  9.1813 +      }
  9.1814 +    else return gn[gr] | (ch & ~0x80);
  9.1815 +    }
  9.1816 +  else return ch;
  9.1817 +  }
  9.1818 +
  9.1819 +/****************************************************************************
  9.1820 +
  9.1821 +  ungetinchr
  9.1822 +
  9.1823 +  Called by main.  Pushes back an "inchr" to be read by getinchr
  9.1824 +  on the next call.
  9.1825 +
  9.1826 +******************************************************************************/
  9.1827 +inchr getinchr_buffer;
  9.1828 +int getinchr_flag;
  9.1829 +
  9.1830 +inchr ungetinchr(c)
  9.1831 +inchr c;
  9.1832 +{
  9.1833 +  getinchr_buffer = c;
  9.1834 +  getinchr_flag = 1;
  9.1835 +  return c;
  9.1836 +}
  9.1837 +
  9.1838 +/*****************************************************************************
  9.1839 +
  9.1840 +  getinchr
  9.1841 +
  9.1842 +  Called by main.  Processes multibyte characters.  Invokes Agetchar.
  9.1843 +  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
  9.1844 +  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
  9.1845 +    0x80-0xFF bytes are first byte of a double-byte character).
  9.1846 +  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
  9.1847 +    0x80-0xBF bytes are nonfirst byte of a multibyte character,
  9.1848 +    0xC0-0xFD bytes are first byte of a multibyte character,
  9.1849 +    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
  9.1850 +  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
  9.1851 +    "~~" is a tilde, "~x" for all other x is ignored).
  9.1852 +  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
  9.1853 +    of a double-byte character, all other bytes are characters).
  9.1854 + 
  9.1855 +
  9.1856 +*****************************************************************************/
  9.1857 +
  9.1858 +inchr getinchr()
  9.1859 +{
  9.1860 +  int ch, ch2, ch3, ch4, ch5, ch6;
  9.1861 +
  9.1862 +  if (getinchr_flag) {
  9.1863 +    getinchr_flag = 0;
  9.1864 +    return getinchr_buffer;
  9.1865 +    }
  9.1866 +
  9.1867 +  switch(multibyte) {
  9.1868 +    case 0: /* single-byte */
  9.1869 +      return iso2022();
  9.1870 +   case 1: /* DBCS */
  9.1871 +     ch = Agetchar();
  9.1872 +     if ((ch >= 0x80 && ch <= 0x9F) ||
  9.1873 +         (ch >= 0xE0 && ch <= 0xEF)) {
  9.1874 +       ch = (ch << 8) + Agetchar();
  9.1875 +       }
  9.1876 +     return ch;
  9.1877 +   case 2: /* UTF-8 */
  9.1878 +      ch = Agetchar();
  9.1879 +      if (ch < 0x80) return ch;  /* handles EOF, too */
  9.1880 +      if (ch < 0xC0 || ch > 0xFD)
  9.1881 +        return 0x0080;  /* illegal first character */
  9.1882 +      ch2 = Agetchar() & 0x3F;
  9.1883 +      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
  9.1884 +      ch3 = Agetchar() & 0x3F;
  9.1885 +      if (ch < 0xF0)
  9.1886 +        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
  9.1887 +      ch4 = Agetchar() & 0x3F;
  9.1888 +      if (ch < 0xF8)
  9.1889 +        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
  9.1890 +      ch5 = Agetchar() & 0x3F;
  9.1891 +      if (ch < 0xFC)
  9.1892 +        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
  9.1893 +          (ch4 << 6) + ch5;
  9.1894 +      ch6 = Agetchar() & 0x3F;
  9.1895 +      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
  9.1896 +        (ch4 << 12) + (ch5 << 6) + ch6;
  9.1897 +   case 3: /* HZ */
  9.1898 +     ch = Agetchar();
  9.1899 +     if (ch == EOF) return ch;
  9.1900 +     if (hzmode) {
  9.1901 +       ch = (ch << 8) + Agetchar();
  9.1902 +       if (ch == ('}' << 8) + '~') {
  9.1903 +         hzmode = 0;
  9.1904 +         return getinchr();
  9.1905 +         }
  9.1906 +       return ch;
  9.1907 +       }
  9.1908 +     else if (ch == '~') {
  9.1909 +       ch = Agetchar();
  9.1910 +       if (ch == '{') {
  9.1911 +          hzmode = 1;
  9.1912 +          return getinchr();
  9.1913 +          }
  9.1914 +      else if (ch == '~') {
  9.1915 +        return ch;
  9.1916 +        }
  9.1917 +      else {
  9.1918 +        return getinchr();
  9.1919 +        }
  9.1920 +      }
  9.1921 +     else return ch;
  9.1922 +   case 4: /* Shift-JIS */
  9.1923 +     ch = Agetchar();
  9.1924 +     if ((ch >= 0x80 && ch <= 0x9F) ||
  9.1925 +         (ch >= 0xE0 && ch <= 0xEF)) {
  9.1926 +       ch = (ch << 8) + Agetchar();
  9.1927 +       }
  9.1928 +     return ch;
  9.1929 +   default:
  9.1930 +     return 0x80;
  9.1931 +    }
  9.1932 +  }
  9.1933 +
  9.1934 +/****************************************************************************
  9.1935 +
  9.1936 +  main
  9.1937 +
  9.1938 +  The main program, of course.
  9.1939 +  Reads characters 1 by 1 from stdin, and makes lines out of them using
  9.1940 +  addchar. Handles line breaking, (which accounts for most of the
  9.1941 +  complexity in this function).
  9.1942 +
  9.1943 +****************************************************************************/
  9.1944 +
  9.1945 +int main(argc,argv)
  9.1946 +int argc;
  9.1947 +char *argv[];
  9.1948 +{
  9.1949 +  inchr c,c2;
  9.1950 +  int i;
  9.1951 +  int last_was_eol_flag;
  9.1952 +/*---------------------------------------------------------------------------
  9.1953 +  wordbreakmode:
  9.1954 +    -1: /^$/ and blanks are to be absorbed (when line break was forced
  9.1955 +      by a blank or character larger than outlinelenlimit)
  9.1956 +    0: /^ *$/ and blanks are not to be absorbed
  9.1957 +    1: /[^ ]$/ no word break yet
  9.1958 +    2: /[^ ]  *$/
  9.1959 +    3: /[^ ]$/ had a word break
  9.1960 +---------------------------------------------------------------------------*/
  9.1961 +  int wordbreakmode;
  9.1962 +  int char_not_added;
  9.1963 +
  9.1964 +  Myargc = argc;
  9.1965 +  Myargv = argv;
  9.1966 +  getparams();
  9.1967 +  readcontrolfiles();
  9.1968 +  readfont();
  9.1969 +  linealloc();
  9.1970 +
  9.1971 +  wordbreakmode = 0;
  9.1972 +  last_was_eol_flag = 0;
  9.1973 +
  9.1974 +  while ((c = getinchr())!=EOF) {
  9.1975 +
  9.1976 +    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
  9.1977 +      ungetinchr(c2 = getinchr());
  9.1978 +      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
  9.1979 +      }
  9.1980 +    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
  9.1981 +
  9.1982 +    if (deutschflag) {
  9.1983 +      if (c>='[' && c<=']') {
  9.1984 +        c = deutsch[c-'['];
  9.1985 +        }
  9.1986 +      else if (c >='{' && c <= '~') {
  9.1987 +        c = deutsch[c-'{'+3];
  9.1988 +        }
  9.1989 +      }
  9.1990 +
  9.1991 +    c = handlemapping(c);
  9.1992 +
  9.1993 +    if (isascii(c)&&isspace(c)) {
  9.1994 +      c = (c=='\t'||c==' ') ? ' ' : '\n';
  9.1995 +      }
  9.1996 +
  9.1997 +    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
  9.1998 +
  9.1999 +/*
  9.2000 +  Note: The following code is complex and thoroughly tested.
  9.2001 +  Be careful when modifying!
  9.2002 +*/
  9.2003 +
  9.2004 +    do {
  9.2005 +      char_not_added = 0;
  9.2006 +
  9.2007 +      if (wordbreakmode== -1) {
  9.2008 +        if (c==' ') {
  9.2009 +          break;
  9.2010 +          }
  9.2011 +        else if (c=='\n') {
  9.2012 +          wordbreakmode = 0;
  9.2013 +          break;
  9.2014 +          }
  9.2015 +        wordbreakmode = 0;
  9.2016 +        }
  9.2017 +
  9.2018 +      if (c=='\n') {
  9.2019 +        printline();
  9.2020 +        wordbreakmode = 0;
  9.2021 +        }
  9.2022 +
  9.2023 +      else if (addchar(c)) {
  9.2024 +        if (c!=' ') {
  9.2025 +          wordbreakmode = (wordbreakmode>=2)?3:1;
  9.2026 +          }
  9.2027 +        else {
  9.2028 +          wordbreakmode = (wordbreakmode>0)?2:0;
  9.2029 +          }
  9.2030 +        }
  9.2031 +
  9.2032 +      else if (outlinelen==0) {
  9.2033 +        for (i=0;i<charheight;i++) {
  9.2034 +          if (right2left && outputwidth>1) {
  9.2035 +            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
  9.2036 +            }
  9.2037 +          else {
  9.2038 +            putstring(currchar[i]);
  9.2039 +            }
  9.2040 +          }
  9.2041 +        wordbreakmode = -1;
  9.2042 +        }
  9.2043 +
  9.2044 +      else if (c==' ') {
  9.2045 +        if (wordbreakmode==2) {
  9.2046 +          splitline();
  9.2047 +          }
  9.2048 +        else {
  9.2049 +          printline();
  9.2050 +          }
  9.2051 +        wordbreakmode = -1;
  9.2052 +        }
  9.2053 +
  9.2054 +      else {
  9.2055 +        if (wordbreakmode>=2) {
  9.2056 +          splitline();
  9.2057 +          }
  9.2058 +        else {
  9.2059 +          printline();
  9.2060 +          }
  9.2061 +        wordbreakmode = (wordbreakmode==3)?1:0;
  9.2062 +        char_not_added = 1;
  9.2063 +        }
  9.2064 +
  9.2065 +      } while (char_not_added);
  9.2066 +    }
  9.2067 +
  9.2068 +  if (outlinelen!=0) {
  9.2069 +    printline();
  9.2070 +    }
  9.2071 +
  9.2072 +  /* XXX Xen hack -- finish off the C macro output */
  9.2073 +  if ( nr_chars != 0 )
  9.2074 +      putchar('"');
  9.2075 +  putchar('\n');
  9.2076 +
  9.2077 +  exit(0);
  9.2078 +}
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/xen/figlet/xen.flf	Sat Jul 10 14:55:46 2004 +0000
    10.3 @@ -0,0 +1,2230 @@
    10.4 +flf2a$ 6 5 16 15 14 0 24463 229
    10.5 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    10.6 +Includes ISO Latin-1
    10.7 +figlet release 2.1 -- 12 Aug 1994
    10.8 +Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    10.9 +  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   10.10 +Permission is hereby given to modify this font, as long as the
   10.11 +modifier's name is placed on a comment line.
   10.12 +
   10.13 +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   10.14 +supported by FIGlet and FIGWin.  May also be slightly modified for better use
   10.15 +of new full-width/kern/smush alternatives, but default output is NOT changed.
   10.16 +
   10.17 +Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   10.18 +
   10.19 + $@
   10.20 + $@
   10.21 + $@
   10.22 + $@
   10.23 + $@
   10.24 + $@@
   10.25 +  _ @
   10.26 + | |@
   10.27 + | |@
   10.28 + |_|@
   10.29 + (_)@
   10.30 +    @@
   10.31 +  _ _ @
   10.32 + ( | )@
   10.33 +  V V @
   10.34 +   $  @
   10.35 +   $  @
   10.36 +      @@
   10.37 +    _  _   @
   10.38 +  _| || |_ @
   10.39 + |_  ..  _|@
   10.40 + |_      _|@
   10.41 +   |_||_|  @
   10.42 +           @@
   10.43 +   _  @
   10.44 +  | | @
   10.45 + / __)@
   10.46 + \__ \@
   10.47 + (   /@
   10.48 +  |_| @@
   10.49 +  _  __@
   10.50 + (_)/ /@
   10.51 +   / / @
   10.52 +  / /_ @
   10.53 + /_/(_)@
   10.54 +       @@
   10.55 +   ___   @
   10.56 +  ( _ )  @
   10.57 +  / _ \/\@
   10.58 + | (_>  <@
   10.59 +  \___/\/@
   10.60 +         @@
   10.61 +  _ @
   10.62 + ( )@
   10.63 + |/ @
   10.64 +  $ @
   10.65 +  $ @
   10.66 +    @@
   10.67 +   __@
   10.68 +  / /@
   10.69 + | | @
   10.70 + | | @
   10.71 + | | @
   10.72 +  \_\@@
   10.73 + __  @
   10.74 + \ \ @
   10.75 +  | |@
   10.76 +  | |@
   10.77 +  | |@
   10.78 + /_/ @@
   10.79 +       @
   10.80 + __/\__@
   10.81 + \    /@
   10.82 + /_  _\@
   10.83 +   \/  @
   10.84 +       @@
   10.85 +        @
   10.86 +    _   @
   10.87 +  _| |_ @
   10.88 + |_   _|@
   10.89 +   |_|  @
   10.90 +        @@
   10.91 +    @
   10.92 +    @
   10.93 +    @
   10.94 +  _ @
   10.95 + ( )@
   10.96 + |/ @@
   10.97 +     @
   10.98 +     @
   10.99 +  __ @
  10.100 + |__|@
  10.101 +  $  @
  10.102 +     @@
  10.103 +    @
  10.104 +    @
  10.105 +    @
  10.106 +  _ @
  10.107 + (_)@
  10.108 +    @@
  10.109 +     __@
  10.110 +    / /@
  10.111 +   / / @
  10.112 +  / /  @
  10.113 + /_/   @
  10.114 +       @@
  10.115 +   ___  @
  10.116 +  / _ \ @
  10.117 + | | | |@
  10.118 + | |_| |@
  10.119 +  \___/ @
  10.120 +        @@
  10.121 +  _ @
  10.122 + / |@
  10.123 + | |@
  10.124 + | |@
  10.125 + |_|@
  10.126 +    @@
  10.127 +  ____  @
  10.128 + |___ \ @
  10.129 +   __) |@
  10.130 +  / __/ @
  10.131 + |_____|@
  10.132 +        @@
  10.133 +  _____ @
  10.134 + |___ / @
  10.135 +   |_ \ @
  10.136 +  ___) |@
  10.137 + |____/ @
  10.138 +        @@
  10.139 +  _  _   @
  10.140 + | || |  @
  10.141 + | || |_ @
  10.142 + |__   _|@
  10.143 +    |_|  @
  10.144 +         @@
  10.145 +  ____  @
  10.146 + | ___| @
  10.147 + |___ \ @
  10.148 +  ___) |@
  10.149 + |____/ @
  10.150 +        @@
  10.151 +   __   @
  10.152 +  / /_  @
  10.153 + | '_ \ @
  10.154 + | (_) |@
  10.155 +  \___/ @
  10.156 +        @@
  10.157 +  _____ @
  10.158 + |___  |@
  10.159 +    / / @
  10.160 +   / /  @
  10.161 +  /_/   @
  10.162 +        @@
  10.163 +   ___  @
  10.164 +  ( _ ) @
  10.165 +  / _ \ @
  10.166 + | (_) |@
  10.167 +  \___/ @
  10.168 +        @@
  10.169 +   ___  @
  10.170 +  / _ \ @
  10.171 + | (_) |@
  10.172 +  \__, |@
  10.173 +    /_/ @
  10.174 +        @@
  10.175 +    @
  10.176 +  _ @
  10.177 + (_)@
  10.178 +  _ @
  10.179 + (_)@
  10.180 +    @@
  10.181 +    @
  10.182 +  _ @
  10.183 + (_)@
  10.184 +  _ @
  10.185 + ( )@
  10.186 + |/ @@
  10.187 +   __@
  10.188 +  / /@
  10.189 + / / @
  10.190 + \ \ @
  10.191 +  \_\@
  10.192 +     @@
  10.193 +        @
  10.194 +  _____ @
  10.195 + |_____|@
  10.196 + |_____|@
  10.197 +    $   @
  10.198 +        @@
  10.199 + __  @
  10.200 + \ \ @
  10.201 +  \ \@
  10.202 +  / /@
  10.203 + /_/ @
  10.204 +     @@
  10.205 +  ___ @
  10.206 + |__ \@
  10.207 +   / /@
  10.208 +  |_| @
  10.209 +  (_) @
  10.210 +      @@
  10.211 +    ____  @
  10.212 +   / __ \ @
  10.213 +  / / _` |@
  10.214 + | | (_| |@
  10.215 +  \ \__,_|@
  10.216 +   \____/ @@
  10.217 +     _    @
  10.218 +    / \   @
  10.219 +   / _ \  @
  10.220 +  / ___ \ @
  10.221 + /_/   \_\@
  10.222 +          @@
  10.223 +  ____  @
  10.224 + | __ ) @
  10.225 + |  _ \ @
  10.226 + | |_) |@
  10.227 + |____/ @
  10.228 +        @@
  10.229 +   ____ @
  10.230 +  / ___|@
  10.231 + | |    @
  10.232 + | |___ @
  10.233 +  \____|@
  10.234 +        @@
  10.235 +  ____  @
  10.236 + |  _ \ @
  10.237 + | | | |@
  10.238 + | |_| |@
  10.239 + |____/ @
  10.240 +        @@
  10.241 +  _____ @
  10.242 + | ____|@
  10.243 + |  _|  @
  10.244 + | |___ @
  10.245 + |_____|@
  10.246 +        @@
  10.247 +  _____ @
  10.248 + |  ___|@
  10.249 + | |_   @
  10.250 + |  _|  @
  10.251 + |_|    @
  10.252 +        @@
  10.253 +   ____ @
  10.254 +  / ___|@
  10.255 + | |  _ @
  10.256 + | |_| |@
  10.257 +  \____|@
  10.258 +        @@
  10.259 +  _   _ @
  10.260 + | | | |@
  10.261 + | |_| |@
  10.262 + |  _  |@
  10.263 + |_| |_|@
  10.264 +        @@
  10.265 +  ___ @
  10.266 + |_ _|@
  10.267 +  | | @
  10.268 +  | | @
  10.269 + |___|@
  10.270 +      @@
  10.271 +      _ @
  10.272 +     | |@
  10.273 +  _  | |@
  10.274 + | |_| |@
  10.275 +  \___/ @
  10.276 +        @@
  10.277 +  _  __@
  10.278 + | |/ /@
  10.279 + | ' / @
  10.280 + | . \ @
  10.281 + |_|\_\@
  10.282 +       @@
  10.283 +  _     @
  10.284 + | |    @
  10.285 + | |    @
  10.286 + | |___ @
  10.287 + |_____|@
  10.288 +        @@
  10.289 +  __  __ @
  10.290 + |  \/  |@
  10.291 + | |\/| |@
  10.292 + | |  | |@
  10.293 + |_|  |_|@
  10.294 +         @@
  10.295 +  _   _ @
  10.296 + | \ | |@
  10.297 + |  \| |@
  10.298 + | |\  |@
  10.299 + |_| \_|@
  10.300 +        @@
  10.301 +   ___  @
  10.302 +  / _ \ @
  10.303 + | | | |@
  10.304 + | |_| |@
  10.305 +  \___/ @
  10.306 +        @@
  10.307 +  ____  @
  10.308 + |  _ \ @
  10.309 + | |_) |@
  10.310 + |  __/ @
  10.311 + |_|    @
  10.312 +        @@
  10.313 +   ___  @
  10.314 +  / _ \ @
  10.315 + | | | |@
  10.316 + | |_| |@
  10.317 +  \__\_\@
  10.318 +        @@
  10.319 +  ____  @
  10.320 + |  _ \ @
  10.321 + | |_) |@
  10.322 + |  _ < @
  10.323 + |_| \_\@
  10.324 +        @@
  10.325 +  ____  @
  10.326 + / ___| @
  10.327 + \___ \ @
  10.328 +  ___) |@
  10.329 + |____/ @
  10.330 +        @@
  10.331 +  _____ @
  10.332 + |_   _|@
  10.333 +   | |  @
  10.334 +   | |  @
  10.335 +   |_|  @
  10.336 +        @@
  10.337 +  _   _ @
  10.338 + | | | |@
  10.339 + | | | |@
  10.340 + | |_| |@
  10.341 +  \___/ @
  10.342 +        @@
  10.343 + __     __@
  10.344 + \ \   / /@
  10.345 +  \ \ / / @
  10.346 +   \ V /  @
  10.347 +    \_/   @
  10.348 +          @@
  10.349 + __        __@
  10.350 + \ \      / /@
  10.351 +  \ \ /\ / / @
  10.352 +   \ V  V /  @
  10.353 +    \_/\_/   @
  10.354 +             @@
  10.355 + __  __@
  10.356 + \ \/ /@
  10.357 +  \  / @
  10.358 +  /  \ @
  10.359 + /_/\_\@
  10.360 +       @@
  10.361 + __   __@
  10.362 + \ \ / /@
  10.363 +  \ V / @
  10.364 +   | |  @
  10.365 +   |_|  @
  10.366 +        @@
  10.367 +  _____@
  10.368 + |__  /@
  10.369 +   / / @
  10.370 +  / /_ @
  10.371 + /____|@
  10.372 +       @@
  10.373 +  __ @
  10.374 + | _|@
  10.375 + | | @
  10.376 + | | @
  10.377 + | | @
  10.378 + |__|@@
  10.379 + __    @
  10.380 + \ \   @
  10.381 +  \ \  @
  10.382 +   \ \ @
  10.383 +    \_\@
  10.384 +       @@
  10.385 +  __ @
  10.386 + |_ |@
  10.387 +  | |@
  10.388 +  | |@
  10.389 +  | |@
  10.390 + |__|@@
  10.391 +  /\ @
  10.392 + |/\|@
  10.393 +   $ @
  10.394 +   $ @
  10.395 +   $ @
  10.396 +     @@
  10.397 +        @
  10.398 +        @
  10.399 +        @
  10.400 +        @
  10.401 +  _____ @
  10.402 + |_____|@@
  10.403 +  _ @
  10.404 + ( )@
  10.405 +  \|@
  10.406 +  $ @
  10.407 +  $ @
  10.408 +    @@
  10.409 +        @
  10.410 +   __ _ @
  10.411 +  / _` |@
  10.412 + | (_| |@
  10.413 +  \__,_|@
  10.414 +        @@
  10.415 +  _     @
  10.416 + | |__  @
  10.417 + | '_ \ @
  10.418 + | |_) |@
  10.419 + |_.__/ @
  10.420 +        @@
  10.421 +       @
  10.422 +   ___ @
  10.423 +  / __|@
  10.424 + | (__ @
  10.425 +  \___|@
  10.426 +       @@
  10.427 +      _ @
  10.428 +   __| |@
  10.429 +  / _` |@
  10.430 + | (_| |@
  10.431 +  \__,_|@
  10.432 +        @@
  10.433 +       @
  10.434 +   ___ @
  10.435 +  / _ \@
  10.436 + |  __/@
  10.437 +  \___|@
  10.438 +       @@
  10.439 +   __ @
  10.440 +  / _|@
  10.441 + | |_ @
  10.442 + |  _|@
  10.443 + |_|  @
  10.444 +      @@
  10.445 +        @
  10.446 +   __ _ @
  10.447 +  / _` |@
  10.448 + | (_| |@
  10.449 +  \__, |@
  10.450 +  |___/ @@
  10.451 +  _     @
  10.452 + | |__  @
  10.453 + | '_ \ @
  10.454 + | | | |@
  10.455 + |_| |_|@
  10.456 +        @@
  10.457 +  _ @
  10.458 + (_)@
  10.459 + | |@
  10.460 + | |@
  10.461 + |_|@
  10.462 +    @@
  10.463 +    _ @
  10.464 +   (_)@
  10.465 +   | |@
  10.466 +   | |@
  10.467 +  _/ |@
  10.468 + |__/ @@
  10.469 +  _    @
  10.470 + | | __@
  10.471 + | |/ /@
  10.472 + |   < @
  10.473 + |_|\_\@
  10.474 +       @@
  10.475 +  _ @
  10.476 + | |@
  10.477 + | |@
  10.478 + | |@
  10.479 + |_|@
  10.480 +    @@
  10.481 +            @
  10.482 +  _ __ ___  @
  10.483 + | '_ ` _ \ @
  10.484 + | | | | | |@
  10.485 + |_| |_| |_|@
  10.486 +            @@
  10.487 +        @
  10.488 +  _ __  @
  10.489 + | '_ \ @
  10.490 + | | | |@
  10.491 + |_| |_|@
  10.492 +        @@
  10.493 +        @
  10.494 +   ___  @
  10.495 +  / _ \ @
  10.496 + | (_) |@
  10.497 +  \___/ @
  10.498 +        @@
  10.499 +        @
  10.500 +  _ __  @
  10.501 + | '_ \ @
  10.502 + | |_) |@
  10.503 + | .__/ @
  10.504 + |_|    @@
  10.505 +        @
  10.506 +   __ _ @
  10.507 +  / _` |@
  10.508 + | (_| |@
  10.509 +  \__, |@
  10.510 +     |_|@@
  10.511 +       @
  10.512 +  _ __ @
  10.513 + | '__|@
  10.514 + | |   @
  10.515 + |_|   @
  10.516 +       @@
  10.517 +      @
  10.518 +  ___ @
  10.519 + / __|@
  10.520 + \__ \@
  10.521 + |___/@
  10.522 +      @@
  10.523 +  _   @
  10.524 + | |_ @
  10.525 + | __|@
  10.526 + | |_ @
  10.527 +  \__|@
  10.528 +      @@
  10.529 +        @
  10.530 +  _   _ @
  10.531 + | | | |@
  10.532 + | |_| |@
  10.533 +  \__,_|@
  10.534 +        @@
  10.535 +        @
  10.536 + __   __@
  10.537 + \ \ / /@
  10.538 +  \ V / @
  10.539 +   \_/  @
  10.540 +        @@
  10.541 +           @
  10.542 + __      __@
  10.543 + \ \ /\ / /@
  10.544 +  \ V  V / @
  10.545 +   \_/\_/  @
  10.546 +           @@
  10.547 +       @
  10.548 + __  __@
  10.549 + \ \/ /@
  10.550 +  >  < @
  10.551 + /_/\_\@
  10.552 +       @@
  10.553 +        @
  10.554 +  _   _ @
  10.555 + | | | |@
  10.556 + | |_| |@
  10.557 +  \__, |@
  10.558 +  |___/ @@
  10.559 +      @
  10.560 +  ____@
  10.561 + |_  /@
  10.562 +  / / @
  10.563 + /___|@
  10.564 +      @@
  10.565 +    __@
  10.566 +   / /@
  10.567 +  | | @
  10.568 + < <  @
  10.569 +  | | @
  10.570 +   \_\@@
  10.571 +  _ @
  10.572 + | |@
  10.573 + | |@
  10.574 + | |@
  10.575 + | |@
  10.576 + |_|@@
  10.577 + __   @
  10.578 + \ \  @
  10.579 +  | | @
  10.580 +   > >@
  10.581 +  | | @
  10.582 + /_/  @@
  10.583 +  /\/|@
  10.584 + |/\/ @
  10.585 +   $  @
  10.586 +   $  @
  10.587 +   $  @
  10.588 +      @@
  10.589 +  _   _ @
  10.590 + (_)_(_)@
  10.591 +   /_\  @
  10.592 +  / _ \ @
  10.593 + /_/ \_\@
  10.594 +        @@
  10.595 +  _   _ @
  10.596 + (_)_(_)@
  10.597 +  / _ \ @
  10.598 + | |_| |@
  10.599 +  \___/ @
  10.600 +        @@
  10.601 +  _   _ @
  10.602 + (_) (_)@
  10.603 + | | | |@
  10.604 + | |_| |@
  10.605 +  \___/ @
  10.606 +        @@
  10.607 +  _   _ @
  10.608 + (_)_(_)@
  10.609 +  / _` |@
  10.610 + | (_| |@
  10.611 +  \__,_|@
  10.612 +        @@
  10.613 +  _   _ @
  10.614 + (_)_(_)@
  10.615 +  / _ \ @
  10.616 + | (_) |@
  10.617 +  \___/ @
  10.618 +        @@
  10.619 +  _   _ @
  10.620 + (_) (_)@
  10.621 + | | | |@
  10.622 + | |_| |@
  10.623 +  \__,_|@
  10.624 +        @@
  10.625 +   ___ @
  10.626 +  / _ \@
  10.627 + | |/ /@
  10.628 + | |\ \@
  10.629 + | ||_/@
  10.630 + |_|   @@
  10.631 +160  NO-BREAK SPACE
  10.632 + $@
  10.633 + $@
  10.634 + $@
  10.635 + $@
  10.636 + $@
  10.637 + $@@
  10.638 +161  INVERTED EXCLAMATION MARK
  10.639 +  _ @
  10.640 + (_)@
  10.641 + | |@
  10.642 + | |@
  10.643 + |_|@
  10.644 +    @@
  10.645 +162  CENT SIGN
  10.646 +    _  @
  10.647 +   | | @
  10.648 +  / __)@
  10.649 + | (__ @
  10.650 +  \   )@
  10.651 +   |_| @@
  10.652 +163  POUND SIGN
  10.653 +    ___  @
  10.654 +   / ,_\ @
  10.655 + _| |_   @
  10.656 +  | |___ @
  10.657 + (_,____|@
  10.658 +         @@
  10.659 +164  CURRENCY SIGN
  10.660 + /\___/\@
  10.661 + \  _  /@
  10.662 + | (_) |@
  10.663 + / ___ \@
  10.664 + \/   \/@
  10.665 +        @@
  10.666 +165  YEN SIGN
  10.667 +  __ __ @
  10.668 +  \ V / @
  10.669 + |__ __|@
  10.670 + |__ __|@
  10.671 +   |_|  @
  10.672 +        @@
  10.673 +166  BROKEN BAR
  10.674 +  _ @
  10.675 + | |@
  10.676 + |_|@
  10.677 +  _ @
  10.678 + | |@
  10.679 + |_|@@
  10.680 +167  SECTION SIGN
  10.681 +    __ @
  10.682 +  _/ _)@
  10.683 + / \ \ @
  10.684 + \ \\ \@
  10.685 +  \ \_/@
  10.686 + (__/  @@
  10.687 +168  DIAERESIS
  10.688 +  _   _ @
  10.689 + (_) (_)@
  10.690 +  $   $ @
  10.691 +  $   $ @
  10.692 +  $   $ @
  10.693 +        @@
  10.694 +169  COPYRIGHT SIGN
  10.695 +    _____   @
  10.696 +   / ___ \  @
  10.697 +  / / __| \ @
  10.698 + | | (__   |@
  10.699 +  \ \___| / @
  10.700 +   \_____/  @@
  10.701 +170  FEMININE ORDINAL INDICATOR
  10.702 +  __ _ @
  10.703 + / _` |@
  10.704 + \__,_|@
  10.705 + |____|@
  10.706 +    $  @
  10.707 +       @@
  10.708 +171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  10.709 +   ____@
  10.710 +  / / /@
  10.711 + / / / @
  10.712 + \ \ \ @
  10.713 +  \_\_\@
  10.714 +       @@
  10.715 +172  NOT SIGN
  10.716 +        @
  10.717 +  _____ @
  10.718 + |___  |@
  10.719 +     |_|@
  10.720 +    $   @
  10.721 +        @@
  10.722 +173  SOFT HYPHEN
  10.723 +       @
  10.724 +       @
  10.725 +  ____ @
  10.726 + |____|@
  10.727 +    $  @
  10.728 +       @@
  10.729 +174  REGISTERED SIGN
  10.730 +    _____   @
  10.731 +   / ___ \  @
  10.732 +  / | _ \ \ @
  10.733 + |  |   /  |@
  10.734 +  \ |_|_\ / @
  10.735 +   \_____/  @@
  10.736 +175  MACRON
  10.737 +  _____ @
  10.738 + |_____|@
  10.739 +    $   @
  10.740 +    $   @
  10.741 +    $   @
  10.742 +        @@
  10.743 +176  DEGREE SIGN
  10.744 +   __  @
  10.745 +  /  \ @
  10.746 + | () |@
  10.747 +  \__/ @
  10.748 +    $  @
  10.749 +       @@
  10.750 +177  PLUS-MINUS SIGN
  10.751 +    _   @
  10.752 +  _| |_ @
  10.753 + |_   _|@
  10.754 +  _|_|_ @
  10.755 + |_____|@
  10.756 +        @@
  10.757 +178  SUPERSCRIPT TWO
  10.758 +  ___ @
  10.759 + |_  )@
  10.760 +  / / @
  10.761 + /___|@
  10.762 +   $  @
  10.763 +      @@
  10.764 +179  SUPERSCRIPT THREE
  10.765 +  ____@
  10.766 + |__ /@
  10.767 +  |_ \@
  10.768 + |___/@
  10.769 +   $  @
  10.770 +      @@
  10.771 +180  ACUTE ACCENT
  10.772 +  __@
  10.773 + /_/@
  10.774 +  $ @
  10.775 +  $ @
  10.776 +  $ @
  10.777 +    @@
  10.778 +181  MICRO SIGN
  10.779 +        @
  10.780 +  _   _ @
  10.781 + | | | |@
  10.782 + | |_| |@
  10.783 + | ._,_|@
  10.784 + |_|    @@
  10.785 +182  PILCROW SIGN
  10.786 +   _____ @
  10.787 +  /     |@
  10.788 + | (| | |@
  10.789 +  \__ | |@
  10.790 +    |_|_|@
  10.791 +         @@
  10.792 +183  MIDDLE DOT
  10.793 +    @
  10.794 +  _ @
  10.795 + (_)@
  10.796 +  $ @
  10.797 +  $ @
  10.798 +    @@
  10.799 +184  CEDILLA
  10.800 +    @
  10.801 +    @
  10.802 +    @
  10.803 +    @
  10.804 +  _ @
  10.805 + )_)@@
  10.806 +185  SUPERSCRIPT ONE
  10.807 +  _ @
  10.808 + / |@
  10.809 + | |@
  10.810 + |_|@
  10.811 +  $ @
  10.812 +    @@
  10.813 +186  MASCULINE ORDINAL INDICATOR
  10.814 +  ___ @
  10.815 + / _ \@
  10.816 + \___/@
  10.817 + |___|@
  10.818 +   $  @
  10.819 +      @@
  10.820 +187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  10.821 + ____  @
  10.822 + \ \ \ @
  10.823 +  \ \ \@
  10.824 +  / / /@
  10.825 + /_/_/ @
  10.826 +       @@
  10.827 +188  VULGAR FRACTION ONE QUARTER
  10.828 +  _   __    @
  10.829 + / | / / _  @
  10.830 + | |/ / | | @
  10.831 + |_/ /|_  _|@
  10.832 +  /_/   |_| @
  10.833 +            @@
  10.834 +189  VULGAR FRACTION ONE HALF
  10.835 +  _   __   @
  10.836 + / | / /__ @
  10.837 + | |/ /_  )@
  10.838 + |_/ / / / @
  10.839 +  /_/ /___|@
  10.840 +           @@
  10.841 +190  VULGAR FRACTION THREE QUARTERS
  10.842 +  ____  __    @
  10.843 + |__ / / / _  @
  10.844 +  |_ \/ / | | @
  10.845 + |___/ /|_  _|@
  10.846 +    /_/   |_| @
  10.847 +              @@
  10.848 +191  INVERTED QUESTION MARK
  10.849 +   _  @
  10.850 +  (_) @
  10.851 +  | | @
  10.852 + / /_ @
  10.853 + \___|@
  10.854 +      @@
  10.855 +192  LATIN CAPITAL LETTER A WITH GRAVE
  10.856 +   __   @
  10.857 +   \_\  @
  10.858 +   /_\  @
  10.859 +  / _ \ @
  10.860 + /_/ \_\@
  10.861 +        @@
  10.862 +193  LATIN CAPITAL LETTER A WITH ACUTE
  10.863 +    __  @
  10.864 +   /_/  @
  10.865 +   /_\  @
  10.866 +  / _ \ @
  10.867 + /_/ \_\@
  10.868 +        @@
  10.869 +194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  10.870 +   //\  @
  10.871 +  |/_\| @
  10.872 +   /_\  @
  10.873 +  / _ \ @
  10.874 + /_/ \_\@
  10.875 +        @@
  10.876 +195  LATIN CAPITAL LETTER A WITH TILDE
  10.877 +   /\/| @
  10.878 +  |/\/  @
  10.879 +   /_\  @
  10.880 +  / _ \ @
  10.881 + /_/ \_\@
  10.882 +        @@
  10.883 +196  LATIN CAPITAL LETTER A WITH DIAERESIS
  10.884 +  _   _ @
  10.885 + (_)_(_)@
  10.886 +   /_\  @
  10.887 +  / _ \ @
  10.888 + /_/ \_\@
  10.889 +        @@
  10.890 +197  LATIN CAPITAL LETTER A WITH RING ABOVE
  10.891 +    _   @
  10.892 +   (o)  @
  10.893 +   /_\  @
  10.894 +  / _ \ @
  10.895 + /_/ \_\@
  10.896 +        @@
  10.897 +198  LATIN CAPITAL LETTER AE
  10.898 +     ______ @
  10.899 +    /  ____|@
  10.900 +   / _  _|  @
  10.901 +  / __ |___ @
  10.902 + /_/ |_____|@
  10.903 +            @@
  10.904 +199  LATIN CAPITAL LETTER C WITH CEDILLA
  10.905 +   ____ @
  10.906 +  / ___|@
  10.907 + | |    @
  10.908 + | |___ @
  10.909 +  \____|@
  10.910 +    )_) @@
  10.911 +200  LATIN CAPITAL LETTER E WITH GRAVE
  10.912 +   __   @
  10.913 +  _\_\_ @
  10.914 + | ____|@
  10.915 + |  _|_ @
  10.916 + |_____|@
  10.917 +        @@
  10.918 +201  LATIN CAPITAL LETTER E WITH ACUTE
  10.919 +    __  @
  10.920 +  _/_/_ @
  10.921 + | ____|@
  10.922 + |  _|_ @
  10.923 + |_____|@
  10.924 +        @@
  10.925 +202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  10.926 +   //\  @
  10.927 +  |/_\| @
  10.928 + | ____|@
  10.929 + |  _|_ @
  10.930 + |_____|@
  10.931 +        @@
  10.932 +203  LATIN CAPITAL LETTER E WITH DIAERESIS
  10.933 +  _   _ @
  10.934 + (_)_(_)@
  10.935 + | ____|@
  10.936 + |  _|_ @
  10.937 + |_____|@
  10.938 +        @@
  10.939 +204  LATIN CAPITAL LETTER I WITH GRAVE
  10.940 +  __  @
  10.941 +  \_\ @
  10.942 + |_ _|@
  10.943 +  | | @
  10.944 + |___|@
  10.945 +      @@
  10.946 +205  LATIN CAPITAL LETTER I WITH ACUTE
  10.947 +   __ @
  10.948 +  /_/ @
  10.949 + |_ _|@
  10.950 +  | | @
  10.951 + |___|@
  10.952 +      @@
  10.953 +206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  10.954 +  //\ @
  10.955 + |/_\|@
  10.956 + |_ _|@
  10.957 +  | | @
  10.958 + |___|@
  10.959 +      @@
  10.960 +207  LATIN CAPITAL LETTER I WITH DIAERESIS
  10.961 +  _   _ @
  10.962 + (_)_(_)@
  10.963 +  |_ _| @
  10.964 +   | |  @
  10.965 +  |___| @
  10.966 +        @@
  10.967 +208  LATIN CAPITAL LETTER ETH
  10.968 +    ____  @
  10.969 +   |  _ \ @
  10.970 +  _| |_| |@
  10.971 + |__ __| |@
  10.972 +   |____/ @
  10.973 +          @@
  10.974 +209  LATIN CAPITAL LETTER N WITH TILDE
  10.975 +   /\/|@
  10.976 +  |/\/ @
  10.977 + | \| |@
  10.978 + | .` |@
  10.979 + |_|\_|@
  10.980 +       @@
  10.981 +210  LATIN CAPITAL LETTER O WITH GRAVE
  10.982 +   __   @
  10.983 +   \_\  @
  10.984 +  / _ \ @
  10.985 + | |_| |@
  10.986 +  \___/ @
  10.987 +        @@
  10.988 +211  LATIN CAPITAL LETTER O WITH ACUTE
  10.989 +    __  @
  10.990 +   /_/  @
  10.991 +  / _ \ @
  10.992 + | |_| |@
  10.993 +  \___/ @
  10.994 +        @@
  10.995 +212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  10.996 +   //\  @
  10.997 +  |/_\| @
  10.998 +  / _ \ @
  10.999 + | |_| |@
 10.1000 +  \___/ @
 10.1001 +        @@
 10.1002 +213  LATIN CAPITAL LETTER O WITH TILDE
 10.1003 +   /\/| @
 10.1004 +  |/\/  @
 10.1005 +  / _ \ @
 10.1006 + | |_| |@
 10.1007 +  \___/ @
 10.1008 +        @@
 10.1009 +214  LATIN CAPITAL LETTER O WITH DIAERESIS
 10.1010 +  _   _ @
 10.1011 + (_)_(_)@
 10.1012 +  / _ \ @
 10.1013 + | |_| |@
 10.1014 +  \___/ @
 10.1015 +        @@
 10.1016 +215  MULTIPLICATION SIGN
 10.1017 +     @
 10.1018 +     @
 10.1019 + /\/\@
 10.1020 + >  <@
 10.1021 + \/\/@
 10.1022 +     @@
 10.1023 +216  LATIN CAPITAL LETTER O WITH STROKE
 10.1024 +   ____ @
 10.1025 +  / _// @
 10.1026 + | |// |@
 10.1027 + | //| |@
 10.1028 +  //__/ @
 10.1029 +        @@
 10.1030 +217  LATIN CAPITAL LETTER U WITH GRAVE
 10.1031 +   __   @
 10.1032 +  _\_\_ @
 10.1033 + | | | |@
 10.1034 + | |_| |@
 10.1035 +  \___/ @
 10.1036 +        @@
 10.1037 +218  LATIN CAPITAL LETTER U WITH ACUTE
 10.1038 +    __  @
 10.1039 +  _/_/_ @
 10.1040 + | | | |@
 10.1041 + | |_| |@
 10.1042 +  \___/ @
 10.1043 +        @@
 10.1044 +219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 10.1045 +   //\  @
 10.1046 +  |/ \| @
 10.1047 + | | | |@
 10.1048 + | |_| |@
 10.1049 +  \___/ @
 10.1050 +        @@
 10.1051 +220  LATIN CAPITAL LETTER U WITH DIAERESIS
 10.1052 +  _   _ @
 10.1053 + (_) (_)@
 10.1054 + | | | |@
 10.1055 + | |_| |@
 10.1056 +  \___/ @
 10.1057 +        @@
 10.1058 +221  LATIN CAPITAL LETTER Y WITH ACUTE
 10.1059 +    __  @
 10.1060 + __/_/__@
 10.1061 + \ \ / /@
 10.1062 +  \ V / @
 10.1063 +   |_|  @
 10.1064 +        @@
 10.1065 +222  LATIN CAPITAL LETTER THORN
 10.1066 +  _     @
 10.1067 + | |___ @
 10.1068 + |  __ \@
 10.1069 + |  ___/@
 10.1070 + |_|    @
 10.1071 +        @@
 10.1072 +223  LATIN SMALL LETTER SHARP S
 10.1073 +   ___ @
 10.1074 +  / _ \@
 10.1075 + | |/ /@
 10.1076 + | |\ \@
 10.1077 + | ||_/@
 10.1078 + |_|   @@
 10.1079 +224  LATIN SMALL LETTER A WITH GRAVE
 10.1080 +   __   @
 10.1081 +   \_\_ @
 10.1082 +  / _` |@
 10.1083 + | (_| |@
 10.1084 +  \__,_|@
 10.1085 +        @@
 10.1086 +225  LATIN SMALL LETTER A WITH ACUTE
 10.1087 +    __  @
 10.1088 +   /_/_ @
 10.1089 +  / _` |@
 10.1090 + | (_| |@
 10.1091 +  \__,_|@
 10.1092 +        @@
 10.1093 +226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 10.1094 +   //\  @
 10.1095 +  |/_\| @
 10.1096 +  / _` |@
 10.1097 + | (_| |@
 10.1098 +  \__,_|@
 10.1099 +        @@
 10.1100 +227  LATIN SMALL LETTER A WITH TILDE
 10.1101 +   /\/| @
 10.1102 +  |/\/_ @
 10.1103 +  / _` |@
 10.1104 + | (_| |@
 10.1105 +  \__,_|@
 10.1106 +        @@
 10.1107 +228  LATIN SMALL LETTER A WITH DIAERESIS
 10.1108 +  _   _ @
 10.1109 + (_)_(_)@
 10.1110 +  / _` |@
 10.1111 + | (_| |@
 10.1112 +  \__,_|@
 10.1113 +        @@
 10.1114 +229  LATIN SMALL LETTER A WITH RING ABOVE
 10.1115 +    __  @
 10.1116 +   (()) @
 10.1117 +  / _ '|@
 10.1118 + | (_| |@
 10.1119 +  \__,_|@
 10.1120 +        @@
 10.1121 +230  LATIN SMALL LETTER AE
 10.1122 +           @
 10.1123 +   __ ____ @
 10.1124 +  / _`  _ \@
 10.1125 + | (_|  __/@
 10.1126 +  \__,____|@
 10.1127 +           @@
 10.1128 +231  LATIN SMALL LETTER C WITH CEDILLA
 10.1129 +       @
 10.1130 +   ___ @
 10.1131 +  / __|@
 10.1132 + | (__ @
 10.1133 +  \___|@
 10.1134 +   )_) @@
 10.1135 +232  LATIN SMALL LETTER E WITH GRAVE
 10.1136 +   __  @
 10.1137 +   \_\ @
 10.1138 +  / _ \@
 10.1139 + |  __/@
 10.1140 +  \___|@
 10.1141 +       @@
 10.1142 +233  LATIN SMALL LETTER E WITH ACUTE
 10.1143 +    __ @
 10.1144 +   /_/ @
 10.1145 +  / _ \@
 10.1146 + |  __/@
 10.1147 +  \___|@
 10.1148 +       @@
 10.1149 +234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 10.1150 +   //\ @
 10.1151 +  |/_\|@
 10.1152 +  / _ \@
 10.1153 + |  __/@
 10.1154 +  \___|@
 10.1155 +       @@
 10.1156 +235  LATIN SMALL LETTER E WITH DIAERESIS
 10.1157 +  _   _ @
 10.1158 + (_)_(_)@
 10.1159 +  / _ \ @
 10.1160 + |  __/ @
 10.1161 +  \___| @
 10.1162 +        @@
 10.1163 +236  LATIN SMALL LETTER I WITH GRAVE
 10.1164 + __ @
 10.1165 + \_\@
 10.1166 + | |@
 10.1167 + | |@
 10.1168 + |_|@
 10.1169 +    @@
 10.1170 +237  LATIN SMALL LETTER I WITH ACUTE
 10.1171 +  __@
 10.1172 + /_/@
 10.1173 + | |@
 10.1174 + | |@
 10.1175 + |_|@
 10.1176 +    @@
 10.1177 +238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 10.1178 +  //\ @
 10.1179 + |/_\|@
 10.1180 +  | | @
 10.1181 +  | | @
 10.1182 +  |_| @
 10.1183 +      @@
 10.1184 +239  LATIN SMALL LETTER I WITH DIAERESIS
 10.1185 +  _   _ @
 10.1186 + (_)_(_)@
 10.1187 +   | |  @
 10.1188 +   | |  @
 10.1189 +   |_|  @
 10.1190 +        @@
 10.1191 +240  LATIN SMALL LETTER ETH
 10.1192 +   /\/\ @
 10.1193 +   >  < @
 10.1194 +  _\/\ |@
 10.1195 + / __` |@
 10.1196 + \____/ @
 10.1197 +        @@
 10.1198 +241  LATIN SMALL LETTER N WITH TILDE
 10.1199 +   /\/| @
 10.1200 +  |/\/  @
 10.1201 + | '_ \ @
 10.1202 + | | | |@
 10.1203 + |_| |_|@
 10.1204 +        @@
 10.1205 +242  LATIN SMALL LETTER O WITH GRAVE
 10.1206 +   __   @
 10.1207 +   \_\  @
 10.1208 +  / _ \ @
 10.1209 + | (_) |@
 10.1210 +  \___/ @
 10.1211 +        @@
 10.1212 +243  LATIN SMALL LETTER O WITH ACUTE
 10.1213 +    __  @
 10.1214 +   /_/  @
 10.1215 +  / _ \ @
 10.1216 + | (_) |@
 10.1217 +  \___/ @
 10.1218 +        @@
 10.1219 +244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 10.1220 +   //\  @
 10.1221 +  |/_\| @
 10.1222 +  / _ \ @
 10.1223 + | (_) |@
 10.1224 +  \___/ @
 10.1225 +        @@
 10.1226 +245  LATIN SMALL LETTER O WITH TILDE
 10.1227 +   /\/| @
 10.1228 +  |/\/  @
 10.1229 +  / _ \ @
 10.1230 + | (_) |@
 10.1231 +  \___/ @
 10.1232 +        @@
 10.1233 +246  LATIN SMALL LETTER O WITH DIAERESIS
 10.1234 +  _   _ @
 10.1235 + (_)_(_)@
 10.1236 +  / _ \ @
 10.1237 + | (_) |@
 10.1238 +  \___/ @
 10.1239 +        @@
 10.1240 +247  DIVISION SIGN
 10.1241 +        @
 10.1242 +    _   @
 10.1243 +  _(_)_ @
 10.1244 + |_____|@
 10.1245 +   (_)  @
 10.1246 +        @@
 10.1247 +248  LATIN SMALL LETTER O WITH STROKE
 10.1248 +         @
 10.1249 +   ____  @
 10.1250 +  / _//\ @
 10.1251 + | (//) |@
 10.1252 +  \//__/ @
 10.1253 +         @@
 10.1254 +249  LATIN SMALL LETTER U WITH GRAVE
 10.1255 +   __   @
 10.1256 +  _\_\_ @
 10.1257 + | | | |@
 10.1258 + | |_| |@
 10.1259 +  \__,_|@
 10.1260 +        @@
 10.1261 +250  LATIN SMALL LETTER U WITH ACUTE
 10.1262 +    __  @
 10.1263 +  _/_/_ @
 10.1264 + | | | |@
 10.1265 + | |_| |@
 10.1266 +  \__,_|@
 10.1267 +        @@
 10.1268 +251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 10.1269 +   //\  @
 10.1270 +  |/ \| @
 10.1271 + | | | |@
 10.1272 + | |_| |@
 10.1273 +  \__,_|@
 10.1274 +        @@
 10.1275 +252  LATIN SMALL LETTER U WITH DIAERESIS
 10.1276 +  _   _ @
 10.1277 + (_) (_)@
 10.1278 + | | | |@
 10.1279 + | |_| |@
 10.1280 +  \__,_|@
 10.1281 +        @@
 10.1282 +253  LATIN SMALL LETTER Y WITH ACUTE
 10.1283 +    __  @
 10.1284 +  _/_/_ @
 10.1285 + | | | |@
 10.1286 + | |_| |@
 10.1287 +  \__, |@
 10.1288 +  |___/ @@
 10.1289 +254  LATIN SMALL LETTER THORN
 10.1290 +  _     @
 10.1291 + | |__  @
 10.1292 + | '_ \ @
 10.1293 + | |_) |@
 10.1294 + | .__/ @
 10.1295 + |_|    @@
 10.1296 +255  LATIN SMALL LETTER Y WITH DIAERESIS
 10.1297 +  _   _ @
 10.1298 + (_) (_)@
 10.1299 + | | | |@
 10.1300 + | |_| |@
 10.1301 +  \__, |@
 10.1302 +  |___/ @@
 10.1303 +0x0100  LATIN CAPITAL LETTER A WITH MACRON
 10.1304 +   ____ @
 10.1305 +  /___/ @
 10.1306 +   /_\  @
 10.1307 +  / _ \ @
 10.1308 + /_/ \_\@
 10.1309 +        @@
 10.1310 +0x0101  LATIN SMALL LETTER A WITH MACRON
 10.1311 +    ___ @
 10.1312 +   /_ _/@
 10.1313 +  / _` |@
 10.1314 + | (_| |@
 10.1315 +  \__,_|@
 10.1316 +        @@
 10.1317 +0x0102  LATIN CAPITAL LETTER A WITH BREVE
 10.1318 +  _   _ @
 10.1319 +  \\_// @
 10.1320 +   /_\  @
 10.1321 +  / _ \ @
 10.1322 + /_/ \_\@
 10.1323 +        @@
 10.1324 +0x0103  LATIN SMALL LETTER A WITH BREVE
 10.1325 +   \_/  @
 10.1326 +   ___  @
 10.1327 +  / _` |@
 10.1328 + | (_| |@
 10.1329 +  \__,_|@
 10.1330 +        @@
 10.1331 +0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 10.1332 +        @
 10.1333 +    _   @
 10.1334 +   /_\  @
 10.1335 +  / _ \ @
 10.1336 + /_/ \_\@
 10.1337 +     (_(@@
 10.1338 +0x0105  LATIN SMALL LETTER A WITH OGONEK
 10.1339 +        @
 10.1340 +   __ _ @
 10.1341 +  / _` |@
 10.1342 + | (_| |@
 10.1343 +  \__,_|@
 10.1344 +     (_(@@
 10.1345 +0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 10.1346 +     __ @
 10.1347 +   _/_/ @
 10.1348 +  / ___|@
 10.1349 + | |___ @
 10.1350 +  \____|@
 10.1351 +        @@
 10.1352 +0x0107  LATIN SMALL LETTER C WITH ACUTE
 10.1353 +    __ @
 10.1354 +   /__/@
 10.1355 +  / __|@
 10.1356 + | (__ @
 10.1357 +  \___|@
 10.1358 +       @@
 10.1359 +0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 10.1360 +     /\ @
 10.1361 +   _//\\@
 10.1362 +  / ___|@
 10.1363 + | |___ @
 10.1364 +  \____|@
 10.1365 +        @@
 10.1366 +0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 10.1367 +    /\ @
 10.1368 +   /_\ @
 10.1369 +  / __|@
 10.1370 + | (__ @
 10.1371 +  \___|@
 10.1372 +       @@
 10.1373 +0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 10.1374 +    []  @
 10.1375 +   ____ @
 10.1376 +  / ___|@
 10.1377 + | |___ @
 10.1378 +  \____|@
 10.1379 +        @@
 10.1380 +0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 10.1381 +   []  @
 10.1382 +   ___ @
 10.1383 +  / __|@
 10.1384 + | (__ @
 10.1385 +  \___|@
 10.1386 +       @@
 10.1387 +0x010C  LATIN CAPITAL LETTER C WITH CARON
 10.1388 +   \\// @
 10.1389 +   _\/_ @
 10.1390 +  / ___|@
 10.1391 + | |___ @
 10.1392 +  \____|@
 10.1393 +        @@
 10.1394 +0x010D  LATIN SMALL LETTER C WITH CARON
 10.1395 +   \\//@
 10.1396 +   _\/ @
 10.1397 +  / __|@
 10.1398 + | (__ @
 10.1399 +  \___|@
 10.1400 +       @@
 10.1401 +0x010E  LATIN CAPITAL LETTER D WITH CARON
 10.1402 +   \\// @
 10.1403 +  __\/  @
 10.1404 + |  _ \ @
 10.1405 + | |_| |@
 10.1406 + |____/ @
 10.1407 +        @@
 10.1408 +0x010F  LATIN SMALL LETTER D WITH CARON
 10.1409 +  \/  _ @
 10.1410 +   __| |@
 10.1411 +  / _` |@
 10.1412 + | (_| |@
 10.1413 +  \__,_|@
 10.1414 +        @@
 10.1415 +0x0110  LATIN CAPITAL LETTER D WITH STROKE
 10.1416 +   ____   @
 10.1417 +  |_ __ \ @
 10.1418 + /| |/ | |@
 10.1419 + /|_|/_| |@
 10.1420 +  |_____/ @
 10.1421 +          @@
 10.1422 +0x0111  LATIN SMALL LETTER D WITH STROKE
 10.1423 +    ---|@
 10.1424 +   __| |@
 10.1425 +  / _` |@
 10.1426 + | (_| |@
 10.1427 +  \__,_|@
 10.1428 +        @@
 10.1429 +0x0112  LATIN CAPITAL LETTER E WITH MACRON
 10.1430 +   ____ @
 10.1431 +  /___/ @
 10.1432 + | ____|@
 10.1433 + |  _|_ @
 10.1434 + |_____|@
 10.1435 +        @@
 10.1436 +0x0113  LATIN SMALL LETTER E WITH MACRON
 10.1437 +    ____@
 10.1438 +   /_ _/@
 10.1439 +  / _ \ @
 10.1440 + |  __/ @
 10.1441 +  \___| @
 10.1442 +        @@
 10.1443 +0x0114  LATIN CAPITAL LETTER E WITH BREVE
 10.1444 +  _   _ @
 10.1445 +  \\_// @
 10.1446 + | ____|@
 10.1447 + |  _|_ @
 10.1448 + |_____|@
 10.1449 +        @@
 10.1450 +0x0115  LATIN SMALL LETTER E WITH BREVE
 10.1451 +  \\  //@
 10.1452 +    --  @
 10.1453 +  / _ \ @
 10.1454 + |  __/ @
 10.1455 +  \___| @
 10.1456 +        @@
 10.1457 +0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 10.1458 +    []  @
 10.1459 +  _____ @
 10.1460 + | ____|@
 10.1461 + |  _|_ @
 10.1462 + |_____|@
 10.1463 +        @@
 10.1464 +0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 10.1465 +    [] @
 10.1466 +    __ @
 10.1467 +  / _ \@
 10.1468 + |  __/@
 10.1469 +  \___|@
 10.1470 +       @@
 10.1471 +0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 10.1472 +        @
 10.1473 +  _____ @
 10.1474 + | ____|@
 10.1475 + |  _|_ @
 10.1476 + |_____|@
 10.1477 +    (__(@@
 10.1478 +0x0119  LATIN SMALL LETTER E WITH OGONEK
 10.1479 +       @
 10.1480 +   ___ @
 10.1481 +  / _ \@
 10.1482 + |  __/@
 10.1483 +  \___|@
 10.1484 +    (_(@@
 10.1485 +0x011A  LATIN CAPITAL LETTER E WITH CARON
 10.1486 +   \\// @
 10.1487 +  __\/_ @
 10.1488 + | ____|@
 10.1489 + |  _|_ @
 10.1490 + |_____|@
 10.1491 +        @@
 10.1492 +0x011B  LATIN SMALL LETTER E WITH CARON
 10.1493 +   \\//@
 10.1494 +    \/ @
 10.1495 +  / _ \@
 10.1496 + |  __/@
 10.1497 +  \___|@
 10.1498 +       @@
 10.1499 +0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 10.1500 +   _/\_ @
 10.1501 +  / ___|@
 10.1502 + | |  _ @
 10.1503 + | |_| |@
 10.1504 +  \____|@
 10.1505 +        @@
 10.1506 +0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 10.1507 +     /\ @
 10.1508 +   _/_ \@
 10.1509 +  / _` |@
 10.1510 + | (_| |@
 10.1511 +  \__, |@
 10.1512 +  |___/ @@
 10.1513 +0x011E  LATIN CAPITAL LETTER G WITH BREVE
 10.1514 +   _\/_ @
 10.1515 +  / ___|@
 10.1516 + | |  _ @
 10.1517 + | |_| |@
 10.1518 +  \____|@
 10.1519 +        @@
 10.1520 +0x011F  LATIN SMALL LETTER G WITH BREVE
 10.1521 +  \___/ @
 10.1522 +   __ _ @
 10.1523 +  / _` |@
 10.1524 + | (_| |@
 10.1525 +  \__, |@
 10.1526 +  |___/ @@
 10.1527 +0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 10.1528 +   _[]_ @
 10.1529 +  / ___|@
 10.1530 + | |  _ @
 10.1531 + | |_| |@
 10.1532 +  \____|@
 10.1533 +        @@
 10.1534 +0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 10.1535 +   []   @
 10.1536 +   __ _ @
 10.1537 +  / _` |@
 10.1538 + | (_| |@
 10.1539 +  \__, |@
 10.1540 +  |___/ @@
 10.1541 +0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 10.1542 +   ____ @
 10.1543 +  / ___|@
 10.1544 + | |  _ @
 10.1545 + | |_| |@
 10.1546 +  \____|@
 10.1547 +   )__) @@
 10.1548 +0x0123  LATIN SMALL LETTER G WITH CEDILLA
 10.1549 +        @
 10.1550 +   __ _ @
 10.1551 +  / _` |@
 10.1552 + | (_| |@
 10.1553 +  \__, |@
 10.1554 +  |_))))@@
 10.1555 +0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 10.1556 +  _/ \_ @
 10.1557 + | / \ |@
 10.1558 + | |_| |@
 10.1559 + |  _  |@
 10.1560 + |_| |_|@
 10.1561 +        @@
 10.1562 +0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 10.1563 +  _  /\ @
 10.1564 + | |//\ @
 10.1565 + | '_ \ @
 10.1566 + | | | |@
 10.1567 + |_| |_|@
 10.1568 +        @@
 10.1569 +0x0126  LATIN CAPITAL LETTER H WITH STROKE
 10.1570 +  _   _ @
 10.1571 + | |=| |@
 10.1572 + | |_| |@
 10.1573 + |  _  |@
 10.1574 + |_| |_|@
 10.1575 +        @@
 10.1576 +0x0127  LATIN SMALL LETTER H WITH STROKE
 10.1577 +  _     @
 10.1578 + |=|__  @
 10.1579 + | '_ \ @
 10.1580 + | | | |@
 10.1581 + |_| |_|@
 10.1582 +        @@
 10.1583 +0x0128  LATIN CAPITAL LETTER I WITH TILDE
 10.1584 +  /\//@
 10.1585 + |_ _|@
 10.1586 +  | | @
 10.1587 +  | | @
 10.1588 + |___|@
 10.1589 +      @@
 10.1590 +0x0129  LATIN SMALL LETTER I WITH TILDE
 10.1591 +    @
 10.1592 + /\/@
 10.1593 + | |@
 10.1594 + | |@
 10.1595 + |_|@
 10.1596 +    @@
 10.1597 +0x012A  LATIN CAPITAL LETTER I WITH MACRON
 10.1598 + /___/@
 10.1599 + |_ _|@
 10.1600 +  | | @
 10.1601 +  | | @
 10.1602 + |___|@
 10.1603 +      @@
 10.1604 +0x012B  LATIN SMALL LETTER I WITH MACRON
 10.1605 +  ____@
 10.1606 + /___/@
 10.1607 +  | | @
 10.1608 +  | | @
 10.1609 +  |_| @
 10.1610 +      @@
 10.1611 +0x012C  LATIN CAPITAL LETTER I WITH BREVE
 10.1612 +  \__/@
 10.1613 + |_ _|@
 10.1614 +  | | @
 10.1615 +  | | @
 10.1616 + |___|@
 10.1617 +      @@
 10.1618 +0x012D  LATIN SMALL LETTER I WITH BREVE
 10.1619 +    @
 10.1620 + \_/@
 10.1621 + | |@
 10.1622 + | |@
 10.1623 + |_|@
 10.1624 +    @@
 10.1625 +0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 10.1626 +  ___ @
 10.1627 + |_ _|@
 10.1628 +  | | @
 10.1629 +  | | @
 10.1630 + |___|@
 10.1631 +  (__(@@
 10.1632 +0x012F  LATIN SMALL LETTER I WITH OGONEK
 10.1633 +  _  @
 10.1634 + (_) @
 10.1635 + | | @
 10.1636 + | | @
 10.1637 + |_|_@
 10.1638 +  (_(@@
 10.1639 +0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 10.1640 +  _[] @
 10.1641 + |_ _|@
 10.1642 +  | | @
 10.1643 +  | | @
 10.1644 + |___|@
 10.1645 +      @@
 10.1646 +0x0131  LATIN SMALL LETTER DOTLESS I
 10.1647 +    @
 10.1648 +  _ @
 10.1649 + | |@
 10.1650 + | |@
 10.1651 + |_|@
 10.1652 +    @@
 10.1653 +0x0132  LATIN CAPITAL LIGATURE IJ
 10.1654 +  ___  _ @
 10.1655 + |_ _|| |@
 10.1656 +  | | | |@
 10.1657 +  | |_| |@
 10.1658 + |__|__/ @
 10.1659 +         @@
 10.1660 +0x0133  LATIN SMALL LIGATURE IJ
 10.1661 +  _   _ @
 10.1662 + (_) (_)@
 10.1663 + | | | |@
 10.1664 + | | | |@
 10.1665 + |_|_/ |@
 10.1666 +   |__/ @@
 10.1667 +0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 10.1668 +      /\ @
 10.1669 +     /_\|@
 10.1670 +  _  | | @
 10.1671 + | |_| | @
 10.1672 +  \___/  @
 10.1673 +         @@
 10.1674 +0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 10.1675 +    /\@
 10.1676 +   /_\@
 10.1677 +   | |@
 10.1678 +   | |@
 10.1679 +  _/ |@
 10.1680 + |__/ @@
 10.1681 +0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 10.1682 +  _  _  @
 10.1683 + | |/ / @
 10.1684 + | ' /  @
 10.1685 + | . \  @
 10.1686 + |_|\_\ @
 10.1687 +    )__)@@
 10.1688 +0x0137  LATIN SMALL LETTER K WITH CEDILLA
 10.1689 +  _    @
 10.1690 + | | __@
 10.1691 + | |/ /@
 10.1692 + |   < @
 10.1693 + |_|\_\@
 10.1694 +    )_)@@
 10.1695 +0x0138  LATIN SMALL LETTER KRA
 10.1696 +       @
 10.1697 +  _ __ @
 10.1698 + | |/ \@
 10.1699 + |   < @
 10.1700 + |_|\_\@
 10.1701 +       @@
 10.1702 +0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 10.1703 +  _   //@
 10.1704 + | | // @
 10.1705 + | |    @
 10.1706 + | |___ @
 10.1707 + |_____|@
 10.1708 +        @@
 10.1709 +0x013A  LATIN SMALL LETTER L WITH ACUTE
 10.1710 +  //@
 10.1711 + | |@
 10.1712 + | |@
 10.1713 + | |@
 10.1714 + |_|@
 10.1715 +    @@
 10.1716 +0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 10.1717 +  _     @
 10.1718 + | |    @
 10.1719 + | |    @
 10.1720 + | |___ @
 10.1721 + |_____|@
 10.1722 +    )__)@@
 10.1723 +0x013C  LATIN SMALL LETTER L WITH CEDILLA
 10.1724 +  _   @
 10.1725 + | |  @
 10.1726 + | |  @
 10.1727 + | |  @
 10.1728 + |_|  @
 10.1729 +   )_)@@
 10.1730 +0x013D  LATIN CAPITAL LETTER L WITH CARON
 10.1731 +  _ \\//@
 10.1732 + | | \/ @
 10.1733 + | |    @
 10.1734 + | |___ @
 10.1735 + |_____|@
 10.1736 +        @@
 10.1737 +0x013E  LATIN SMALL LETTER L WITH CARON
 10.1738 +  _ \\//@
 10.1739 + | | \/ @
 10.1740 + | |    @
 10.1741 + | |    @
 10.1742 + |_|    @
 10.1743 +        @@
 10.1744 +0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 10.1745 +  _     @
 10.1746 + | |    @
 10.1747 + | | [] @
 10.1748 + | |___ @
 10.1749 + |_____|@
 10.1750 +        @@
 10.1751 +0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 10.1752 +  _    @
 10.1753 + | |   @
 10.1754 + | | []@
 10.1755 + | |   @
 10.1756 + |_|   @
 10.1757 +       @@
 10.1758 +0x0141  LATIN CAPITAL LETTER L WITH STROKE
 10.1759 +  __    @
 10.1760 + | //   @
 10.1761 + |//|   @
 10.1762 + // |__ @
 10.1763 + |_____|@
 10.1764 +        @@
 10.1765 +0x0142  LATIN SMALL LETTER L WITH STROKE
 10.1766 +  _ @
 10.1767 + | |@
 10.1768 + |//@
 10.1769 + //|@
 10.1770 + |_|@
 10.1771 +    @@
 10.1772 +0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 10.1773 +  _/ /_ @
 10.1774 + | \ | |@
 10.1775 + |  \| |@
 10.1776 + | |\  |@
 10.1777 + |_| \_|@
 10.1778 +        @@
 10.1779 +0x0144  LATIN SMALL LETTER N WITH ACUTE
 10.1780 +     _  @
 10.1781 +  _ /_/ @
 10.1782 + | '_ \ @
 10.1783 + | | | |@
 10.1784 + |_| |_|@
 10.1785 +        @@
 10.1786 +0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 10.1787 +  _   _ @
 10.1788 + | \ | |@
 10.1789 + |  \| |@
 10.1790 + | |\  |@
 10.1791 + |_| \_|@
 10.1792 + )_)    @@
 10.1793 +0x0146  LATIN SMALL LETTER N WITH CEDILLA
 10.1794 +        @
 10.1795 +  _ __  @
 10.1796 + | '_ \ @
 10.1797 + | | | |@
 10.1798 + |_| |_|@
 10.1799 + )_)    @@
 10.1800 +0x0147  LATIN CAPITAL LETTER N WITH CARON
 10.1801 +  _\/ _ @
 10.1802 + | \ | |@
 10.1803 + |  \| |@
 10.1804 + | |\  |@
 10.1805 + |_| \_|@
 10.1806 +        @@
 10.1807 +0x0148  LATIN SMALL LETTER N WITH CARON
 10.1808 +  \\//  @
 10.1809 +  _\/_  @
 10.1810 + | '_ \ @
 10.1811 + | | | |@
 10.1812 + |_| |_|@
 10.1813 +        @@
 10.1814 +0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 10.1815 +          @
 10.1816 +  _  __   @
 10.1817 + ( )| '_\ @
 10.1818 + |/| | | |@
 10.1819 +   |_| |_|@
 10.1820 +          @@
 10.1821 +0x014A  LATIN CAPITAL LETTER ENG
 10.1822 +  _   _ @
 10.1823 + | \ | |@
 10.1824 + |  \| |@
 10.1825 + | |\  |@
 10.1826 + |_| \ |@
 10.1827 +     )_)@@
 10.1828 +0x014B  LATIN SMALL LETTER ENG
 10.1829 +  _ __  @
 10.1830 + | '_ \ @
 10.1831 + | | | |@
 10.1832 + |_| | |@
 10.1833 +     | |@
 10.1834 +    |__ @@
 10.1835 +0x014C  LATIN CAPITAL LETTER O WITH MACRON
 10.1836 +   ____ @
 10.1837 +  /_ _/ @
 10.1838 +  / _ \ @
 10.1839 + | (_) |@
 10.1840 +  \___/ @
 10.1841 +        @@
 10.1842 +0x014D  LATIN SMALL LETTER O WITH MACRON
 10.1843 +   ____ @
 10.1844 +  /_ _/ @
 10.1845 +  / _ \ @
 10.1846 + | (_) |@
 10.1847 +  \___/ @
 10.1848 +        @@
 10.1849 +0x014E  LATIN CAPITAL LETTER O WITH BREVE
 10.1850 +  \   / @
 10.1851 +   _-_  @
 10.1852 +  / _ \ @
 10.1853 + | |_| |@
 10.1854 +  \___/ @
 10.1855 +        @@
 10.1856 +0x014F  LATIN SMALL LETTER O WITH BREVE
 10.1857 +  \   / @
 10.1858 +   _-_  @
 10.1859 +  / _ \ @
 10.1860 + | |_| |@
 10.1861 +  \___/ @
 10.1862 +        @@
 10.1863 +0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 10.1864 +    ___ @
 10.1865 +   /_/_/@
 10.1866 +  / _ \ @
 10.1867 + | |_| |@
 10.1868 +  \___/ @
 10.1869 +        @@
 10.1870 +0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 10.1871 +    ___ @
 10.1872 +   /_/_/@
 10.1873 +  / _ \ @
 10.1874 + | |_| |@
 10.1875 +  \___/ @
 10.1876 +        @@
 10.1877 +0x0152  LATIN CAPITAL LIGATURE OE
 10.1878 +   ___  ___ @
 10.1879 +  / _ \| __|@
 10.1880 + | | | |  | @
 10.1881 + | |_| | |__@
 10.1882 +  \___/|____@
 10.1883 +            @@
 10.1884 +0x0153  LATIN SMALL LIGATURE OE
 10.1885 +             @
 10.1886 +   ___   ___ @
 10.1887 +  / _ \ / _ \@
 10.1888 + | (_) |  __/@
 10.1889 +  \___/ \___|@
 10.1890 +             @@
 10.1891 +0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 10.1892 +  _/_/  @
 10.1893 + |  _ \ @
 10.1894 + | |_) |@
 10.1895 + |  _ < @
 10.1896 + |_| \_\@
 10.1897 +        @@
 10.1898 +0x0155  LATIN SMALL LETTER R WITH ACUTE
 10.1899 +     __@
 10.1900 +  _ /_/@
 10.1901 + | '__|@
 10.1902 + | |   @
 10.1903 + |_|   @
 10.1904 +       @@
 10.1905 +0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 10.1906 +  ____  @
 10.1907 + |  _ \ @
 10.1908 + | |_) |@
 10.1909 + |  _ < @
 10.1910 + |_| \_\@
 10.1911 + )_)    @@
 10.1912 +0x0157  LATIN SMALL LETTER R WITH CEDILLA
 10.1913 +       @
 10.1914 +  _ __ @
 10.1915 + | '__|@
 10.1916 + | |   @
 10.1917 + |_|   @
 10.1918 +   )_) @@
 10.1919 +0x0158  LATIN CAPITAL LETTER R WITH CARON
 10.1920 +  _\_/  @
 10.1921 + |  _ \ @
 10.1922 + | |_) |@
 10.1923 + |  _ < @
 10.1924 + |_| \_\@
 10.1925 +        @@
 10.1926 +0x0159  LATIN SMALL LETTER R WITH CARON
 10.1927 +  \\// @
 10.1928 +  _\/_ @
 10.1929 + | '__|@
 10.1930 + | |   @
 10.1931 + |_|   @
 10.1932 +       @@
 10.1933 +0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 10.1934 +  _/_/  @
 10.1935 + / ___| @
 10.1936 + \___ \ @
 10.1937 +  ___) |@
 10.1938 + |____/ @
 10.1939 +        @@
 10.1940 +0x015B  LATIN SMALL LETTER S WITH ACUTE
 10.1941 +    __@
 10.1942 +  _/_/@
 10.1943 + / __|@
 10.1944 + \__ \@
 10.1945 + |___/@
 10.1946 +      @@
 10.1947 +0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 10.1948 +  _/\_  @
 10.1949 + / ___| @
 10.1950 + \___ \ @
 10.1951 +  ___) |@
 10.1952 + |____/ @
 10.1953 +        @@
 10.1954 +0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 10.1955 +      @
 10.1956 +  /_\_@
 10.1957 + / __|@
 10.1958 + \__ \@
 10.1959 + |___/@
 10.1960 +      @@
 10.1961 +0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 10.1962 +  ____  @
 10.1963 + / ___| @
 10.1964 + \___ \ @
 10.1965 +  ___) |@
 10.1966 + |____/ @
 10.1967 +    )__)@@
 10.1968 +0x015F  LATIN SMALL LETTER S WITH CEDILLA
 10.1969 +      @
 10.1970 +  ___ @
 10.1971 + / __|@
 10.1972 + \__ \@
 10.1973 + |___/@
 10.1974 +   )_)@@
 10.1975 +0x0160  LATIN CAPITAL LETTER S WITH CARON
 10.1976 +  _\_/  @
 10.1977 + / ___| @
 10.1978 + \___ \ @
 10.1979 +  ___) |@
 10.1980 + |____/ @
 10.1981 +        @@
 10.1982 +0x0161  LATIN SMALL LETTER S WITH CARON
 10.1983 +  \\//@
 10.1984 +  _\/ @
 10.1985 + / __|@
 10.1986 + \__ \@
 10.1987 + |___/@
 10.1988 +      @@
 10.1989 +0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 10.1990 +  _____ @
 10.1991 + |_   _|@
 10.1992 +   | |  @
 10.1993 +   | |  @
 10.1994 +   |_|  @
 10.1995 +    )__)@@
 10.1996 +0x0163  LATIN SMALL LETTER T WITH CEDILLA
 10.1997 +  _   @
 10.1998 + | |_ @
 10.1999 + | __|@
 10.2000 + | |_ @
 10.2001 +  \__|@
 10.2002 +   )_)@@
 10.2003 +0x0164  LATIN CAPITAL LETTER T WITH CARON
 10.2004 +  _____ @
 10.2005 + |_   _|@
 10.2006 +   | |  @
 10.2007 +   | |  @
 10.2008 +   |_|  @
 10.2009 +        @@
 10.2010 +0x0165  LATIN SMALL LETTER T WITH CARON
 10.2011 +  \/  @
 10.2012 + | |_ @
 10.2013 + | __|@
 10.2014 + | |_ @
 10.2015 +  \__|@
 10.2016 +      @@
 10.2017 +0x0166  LATIN CAPITAL LETTER T WITH STROKE
 10.2018 +  _____ @
 10.2019 + |_   _|@
 10.2020 +   | |  @
 10.2021 +  -|-|- @
 10.2022 +   |_|  @
 10.2023 +        @@
 10.2024 +0x0167  LATIN SMALL LETTER T WITH STROKE
 10.2025 +  _   @
 10.2026 + | |_ @
 10.2027 + | __|@
 10.2028 + |-|_ @
 10.2029 +  \__|@
 10.2030 +      @@
 10.2031 +0x0168  LATIN CAPITAL LETTER U WITH TILDE
 10.2032 +        @
 10.2033 +  _/\/_ @
 10.2034 + | | | |@
 10.2035 + | |_| |@
 10.2036 +  \___/ @
 10.2037 +        @@
 10.2038 +0x0169  LATIN SMALL LETTER U WITH TILDE
 10.2039 +        @
 10.2040 +  _/\/_ @
 10.2041 + | | | |@
 10.2042 + | |_| |@
 10.2043 +  \__,_|@
 10.2044 +        @@
 10.2045 +0x016A  LATIN CAPITAL LETTER U WITH MACRON
 10.2046 +   ____ @
 10.2047 +  /__ _/@
 10.2048 + | | | |@
 10.2049 + | |_| |@
 10.2050 +  \___/ @
 10.2051 +        @@
 10.2052 +0x016B  LATIN SMALL LETTER U WITH MACRON
 10.2053 +   ____ @
 10.2054 +  / _  /@
 10.2055 + | | | |@
 10.2056 + | |_| |@
 10.2057 +  \__,_|@
 10.2058 +        @@
 10.2059 +0x016C  LATIN CAPITAL LETTER U WITH BREVE
 10.2060 +        @
 10.2061 +   \_/_ @
 10.2062 + | | | |@
 10.2063 + | |_| |@
 10.2064 +  \____|@
 10.2065 +        @@
 10.2066 +0x016D  LATIN SMALL LETTER U WITH BREVE
 10.2067 +        @
 10.2068 +   \_/_ @
 10.2069 + | | | |@
 10.2070 + | |_| |@
 10.2071 +  \__,_|@
 10.2072 +        @@
 10.2073 +0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 10.2074 +    O   @
 10.2075 +  __  _ @
 10.2076 + | | | |@
 10.2077 + | |_| |@
 10.2078 +  \___/ @
 10.2079 +        @@
 10.2080 +0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 10.2081 +    O   @
 10.2082 +  __ __ @
 10.2083 + | | | |@
 10.2084 + | |_| |@
 10.2085 +  \__,_|@
 10.2086 +        @@
 10.2087 +0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 10.2088 +   -- --@
 10.2089 +  /_//_/@
 10.2090 + | | | |@
 10.2091 + | |_| |@
 10.2092 +  \___/ @
 10.2093 +        @@
 10.2094 +0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 10.2095 +    ____@
 10.2096 +  _/_/_/@
 10.2097 + | | | |@
 10.2098 + | |_| |@
 10.2099 +  \__,_|@
 10.2100 +        @@
 10.2101 +0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 10.2102 +  _   _ @
 10.2103 + | | | |@
 10.2104 + | | | |@
 10.2105 + | |_| |@
 10.2106 +  \___/ @
 10.2107 +    (__(@@
 10.2108 +0x0173  LATIN SMALL LETTER U WITH OGONEK
 10.2109 +        @
 10.2110 +  _   _ @
 10.2111 + | | | |@
 10.2112 + | |_| |@
 10.2113 +  \__,_|@
 10.2114 +     (_(@@
 10.2115 +0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 10.2116 + __    /\  __@
 10.2117 + \ \  //\\/ /@
 10.2118 +  \ \ /\ / / @
 10.2119 +   \ V  V /  @
 10.2120 +    \_/\_/   @
 10.2121 +             @@
 10.2122 +0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 10.2123 +      /\   @
 10.2124 + __  //\\__@
 10.2125 + \ \ /\ / /@
 10.2126 +  \ V  V / @
 10.2127 +   \_/\_/  @
 10.2128 +           @@
 10.2129 +0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 10.2130 +    /\  @
 10.2131 + __//\\ @
 10.2132 + \ \ / /@
 10.2133 +  \ V / @
 10.2134 +   |_|  @
 10.2135 +        @@
 10.2136 +0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 10.2137 +    /\  @
 10.2138 +   //\\ @
 10.2139 + | | | |@
 10.2140 + | |_| |@
 10.2141 +  \__, |@
 10.2142 +  |___/ @@
 10.2143 +0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 10.2144 +  []  []@
 10.2145 + __    _@
 10.2146 + \ \ / /@
 10.2147 +  \ V / @
 10.2148 +   |_|  @
 10.2149 +        @@
 10.2150 +0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 10.2151 +  __/_/@
 10.2152 + |__  /@
 10.2153 +   / / @
 10.2154 +  / /_ @
 10.2155 + /____|@
 10.2156 +       @@
 10.2157 +0x017A  LATIN SMALL LETTER Z WITH ACUTE
 10.2158 +    _ @
 10.2159 +  _/_/@
 10.2160 + |_  /@
 10.2161 +  / / @
 10.2162 + /___|@
 10.2163 +      @@
 10.2164 +0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 10.2165 +  __[]_@
 10.2166 + |__  /@
 10.2167 +   / / @
 10.2168 +  / /_ @
 10.2169 + /____|@
 10.2170 +       @@
 10.2171 +0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 10.2172 +   [] @
 10.2173 +  ____@
 10.2174 + |_  /@
 10.2175 +  / / @
 10.2176 + /___|@
 10.2177 +      @@
 10.2178 +0x017D  LATIN CAPITAL LETTER Z WITH CARON
 10.2179 +  _\_/_@
 10.2180 + |__  /@
 10.2181 +   / / @
 10.2182 +  / /_ @
 10.2183 + /____|@
 10.2184 +       @@
 10.2185 +0x017E  LATIN SMALL LETTER Z WITH CARON
 10.2186 +  \\//@
 10.2187 +  _\/_@
 10.2188 + |_  /@
 10.2189 +  / / @
 10.2190 + /___|@
 10.2191 +      @@
 10.2192 +0x017F  LATIN SMALL LETTER LONG S
 10.2193 +     __ @
 10.2194 +    / _|@
 10.2195 + |-| |  @
 10.2196 + |-| |  @
 10.2197 +   |_|  @
 10.2198 +        @@
 10.2199 +0x02C7  CARON
 10.2200 + \\//@
 10.2201 +  \/ @
 10.2202 +    $@
 10.2203 +    $@
 10.2204 +    $@
 10.2205 +    $@@
 10.2206 +0x02D8  BREVE
 10.2207 + \\_//@
 10.2208 +  \_/ @
 10.2209 +     $@
 10.2210 +     $@
 10.2211 +     $@
 10.2212 +     $@@
 10.2213 +0x02D9  DOT ABOVE
 10.2214 + []@
 10.2215 +  $@
 10.2216 +  $@
 10.2217 +  $@
 10.2218 +  $@
 10.2219 +  $@@
 10.2220 +0x02DB  OGONEK
 10.2221 +    $@
 10.2222 +    $@
 10.2223 +    $@
 10.2224 +    $@
 10.2225 +    $@
 10.2226 + )_) @@
 10.2227 +0x02DD  DOUBLE ACUTE ACCENT
 10.2228 +  _ _ @
 10.2229 + /_/_/@
 10.2230 +     $@
 10.2231 +     $@
 10.2232 +     $@
 10.2233 +     $@@
    11.1 --- a/xen/tools/Makefile	Fri Jul 09 15:13:35 2004 +0000
    11.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.3 @@ -1,14 +0,0 @@
    11.4 -
    11.5 -all: figlet elf-reloc
    11.6 -
    11.7 -figlet:
    11.8 -	$(MAKE) -C figlet
    11.9 -
   11.10 -elf-reloc: elf-reloc.c
   11.11 -	gcc -O2 -Wall -o $@ $<
   11.12 -
   11.13 -clean:
   11.14 -	rm -f elf-reloc *~ core
   11.15 -	$(MAKE) -C figlet clean
   11.16 -
   11.17 -.PHONY: figlet
    12.1 --- a/xen/tools/elf-reloc.c	Fri Jul 09 15:13:35 2004 +0000
    12.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.3 @@ -1,115 +0,0 @@
    12.4 -/******************************************************************************
    12.5 - * elf-reloc.c
    12.6 - * 
    12.7 - * Usage: elf-reloc <old base> <new base> <image>
    12.8 - * 
    12.9 - * Relocates <image> from <old base> address to <new base> address by
   12.10 - * frobbing the Elf headers. Segment contents are unmodified.
   12.11 - */
   12.12 -
   12.13 -#include <stdio.h>
   12.14 -#include <stdlib.h>
   12.15 -#include <string.h>
   12.16 -
   12.17 -typedef unsigned long  Elf32_Addr;
   12.18 -typedef unsigned short Elf32_Half;
   12.19 -typedef unsigned long  Elf32_Off;
   12.20 -typedef unsigned long  Elf32_Word;
   12.21 -
   12.22 -typedef struct {
   12.23 -    unsigned char e_ident[16];
   12.24 -    Elf32_Half    e_type;
   12.25 -    Elf32_Half    e_machine;
   12.26 -    Elf32_Word    e_version;
   12.27 -    Elf32_Addr    e_entry;
   12.28 -    Elf32_Off     e_phoff;
   12.29 -    Elf32_Off     e_shoff;
   12.30 -    Elf32_Word    e_flags;
   12.31 -    Elf32_Half    e_ehsize;
   12.32 -    Elf32_Half    e_phentsize;
   12.33 -    Elf32_Half    e_phnum;
   12.34 -    Elf32_Half    e_shentsize;
   12.35 -    Elf32_Half    e_shnum;
   12.36 -    Elf32_Half    e_shstrndx;
   12.37 -} Elf32_Ehdr;
   12.38 -
   12.39 -typedef struct {
   12.40 -    Elf32_Word    p_type;
   12.41 -    Elf32_Off     p_offset;
   12.42 -    Elf32_Addr    p_vaddr;
   12.43 -    Elf32_Addr    p_paddr;
   12.44 -    Elf32_Word    p_filesz;
   12.45 -    Elf32_Word    p_memsz;
   12.46 -    Elf32_Word    p_flags;
   12.47 -    Elf32_Word    p_align;
   12.48 -} Elf32_Phdr;
   12.49 -
   12.50 -#define offsetof(_f,_p) ((unsigned long)&(((_p *)0)->_f))
   12.51 -
   12.52 -
   12.53 -/* Add @reloc_distance to address at offset @off in file @fp. */
   12.54 -void reloc(FILE *fp, long off, unsigned long reloc_distance)
   12.55 -{
   12.56 -    unsigned long base;
   12.57 -    fseek(fp, off, SEEK_SET);
   12.58 -    fread(&base, sizeof(base), 1, fp);
   12.59 -    base += reloc_distance;
   12.60 -    fseek(fp, off, SEEK_SET);
   12.61 -    fwrite(&base, sizeof(base), 1, fp);
   12.62 -
   12.63 -}
   12.64 -
   12.65 -
   12.66 -int main(int argc, char **argv)
   12.67 -{
   12.68 -    unsigned long old_base, new_base, reloc_distance;
   12.69 -    long virt_section, phys_section;
   12.70 -    char *image_name;
   12.71 -    FILE *fp;
   12.72 -    Elf32_Off phoff;
   12.73 -    Elf32_Half phnum, phentsz;
   12.74 -    int i;
   12.75 -
   12.76 -    if ( argc != 4 )
   12.77 -    {
   12.78 -        fprintf(stderr, "Usage: elf-reloc <old base> <new base> <image>\n");
   12.79 -        return(1);
   12.80 -    }
   12.81 -
   12.82 -    old_base = strtoul(argv[1], NULL, 16);
   12.83 -    new_base = strtoul(argv[2], NULL, 16);
   12.84 -    image_name = argv[3];
   12.85 -
   12.86 -    fp = fopen(image_name, "rb+");
   12.87 -    if ( !fp )
   12.88 -    {
   12.89 -        fprintf(stderr, "Failed to load image!\n");
   12.90 -        return(1);
   12.91 -    }
   12.92 -
   12.93 -    reloc_distance = new_base - old_base;
   12.94 -
   12.95 -    /* First frob the entry address. */
   12.96 -    reloc(fp, offsetof(e_entry, Elf32_Ehdr), reloc_distance);
   12.97 -
   12.98 -    fseek(fp, offsetof(e_phoff, Elf32_Ehdr), SEEK_SET);
   12.99 -    fread(&phoff, sizeof(phoff), 1, fp);
  12.100 -    fseek(fp, offsetof(e_phnum, Elf32_Ehdr), SEEK_SET);
  12.101 -    fread(&phnum, sizeof(phnum), 1, fp);
  12.102 -    fseek(fp, offsetof(e_phentsize, Elf32_Ehdr), SEEK_SET);
  12.103 -    fread(&phentsz, sizeof(phentsz), 1, fp);
  12.104 -
  12.105 -    virt_section = (long)phoff + offsetof(p_vaddr, Elf32_Phdr);
  12.106 -    phys_section = (long)phoff + offsetof(p_paddr, Elf32_Phdr);
  12.107 -    for ( i = 0; i < phnum; i++ )
  12.108 -    {
  12.109 -        reloc(fp, phys_section, reloc_distance);
  12.110 -        reloc(fp, virt_section, reloc_distance);
  12.111 -        phys_section += phentsz;
  12.112 -        virt_section += phentsz;
  12.113 -    }
  12.114 -
  12.115 -    fclose(fp);
  12.116 -
  12.117 -    return(0);
  12.118 -}
    13.1 --- a/xen/tools/figlet/LICENSE	Fri Jul 09 15:13:35 2004 +0000
    13.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.3 @@ -1,111 +0,0 @@
    13.4 -http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
    13.5 -
    13.6 -			 The "Artistic License"
    13.7 -
    13.8 -				Preamble
    13.9 -
   13.10 -The intent of this document is to state the conditions under which a
   13.11 -Package may be copied, such that the Copyright Holder maintains some
   13.12 -semblance of artistic control over the development of the package,
   13.13 -while giving the users of the package the right to use and distribute
   13.14 -the Package in a more-or-less customary fashion, plus the right to make
   13.15 -reasonable modifications.
   13.16 -
   13.17 -Definitions:
   13.18 -
   13.19 -	"Package" refers to the collection of files distributed by the
   13.20 -	Copyright Holder, and derivatives of that collection of files
   13.21 -	created through textual modification.
   13.22 -
   13.23 -	"Standard Version" refers to such a Package if it has not been
   13.24 -	modified, or has been modified in accordance with the wishes
   13.25 -	of the Copyright Holder.
   13.26 -
   13.27 -	"Copyright Holder" is whoever is named in the copyright or
   13.28 -	copyrights for the package.
   13.29 -
   13.30 -	"You" is you, if you're thinking about copying or distributing
   13.31 -	this Package.
   13.32 -
   13.33 -	"Reasonable copying fee" is whatever you can justify on the
   13.34 -	basis of media cost, duplication charges, time of people involved,
   13.35 -	and so on.  (You will not be required to justify it to the
   13.36 -	Copyright Holder, but only to the computing community at large
   13.37 -	as a market that must bear the fee.)
   13.38 -
   13.39 -	"Freely Available" means that no fee is charged for the item
   13.40 -	itself, though there may be fees involved in handling the item.
   13.41 -	It also means that recipients of the item may redistribute it
   13.42 -	under the same conditions they received it.
   13.43 -
   13.44 -1. You may make and give away verbatim copies of the source form of the
   13.45 -Standard Version of this Package without restriction, provided that you
   13.46 -duplicate all of the original copyright notices and associated disclaimers.
   13.47 -
   13.48 -2. You may apply bug fixes, portability fixes and other modifications
   13.49 -derived from the Public Domain or from the Copyright Holder.  A Package
   13.50 -modified in such a way shall still be considered the Standard Version.
   13.51 -
   13.52 -3. You may otherwise modify your copy of this Package in any way, provided
   13.53 -that you insert a prominent notice in each changed file stating how and
   13.54 -when you changed that file, and provided that you do at least ONE of the
   13.55 -following:
   13.56 -
   13.57 -    a) place your modifications in the Public Domain or otherwise make them
   13.58 -    Freely Available, such as by posting said modifications to Usenet or
   13.59 -    an equivalent medium, or placing the modifications on a major archive
   13.60 -    site such as ftp.uu.net, or by allowing the Copyright Holder to include
   13.61 -    your modifications in the Standard Version of the Package.
   13.62 -
   13.63 -    b) use the modified Package only within your corporation or organization.
   13.64 -
   13.65 -    c) rename any non-standard executables so the names do not conflict
   13.66 -    with standard executables, which must also be provided, and provide
   13.67 -    a separate manual page for each non-standard executable that clearly
   13.68 -    documents how it differs from the Standard Version.
   13.69 -
   13.70 -    d) make other distribution arrangements with the Copyright Holder.
   13.71 -
   13.72 -4. You may distribute the programs of this Package in object code or
   13.73 -executable form, provided that you do at least ONE of the following:
   13.74 -
   13.75 -    a) distribute a Standard Version of the executables and library files,
   13.76 -    together with instructions (in the manual page or equivalent) on where
   13.77 -    to get the Standard Version.
   13.78 -
   13.79 -    b) accompany the distribution with the machine-readable source of
   13.80 -    the Package with your modifications.
   13.81 -
   13.82 -    c) accompany any non-standard executables with their corresponding
   13.83 -    Standard Version executables, giving the non-standard executables
   13.84 -    non-standard names, and clearly documenting the differences in manual
   13.85 -    pages (or equivalent), together with instructions on where to get
   13.86 -    the Standard Version.
   13.87 -
   13.88 -    d) make other distribution arrangements with the Copyright Holder.
   13.89 -
   13.90 -5. You may charge a reasonable copying fee for any distribution of this
   13.91 -Package.  You may charge any fee you choose for support of this Package.
   13.92 -You may not charge a fee for this Package itself.  However,
   13.93 -you may distribute this Package in aggregate with other (possibly
   13.94 -commercial) programs as part of a larger (possibly commercial) software
   13.95 -distribution provided that you do not advertise this Package as a
   13.96 -product of your own.
   13.97 -
   13.98 -6. The scripts and library files supplied as input to or produced as
   13.99 -output from the programs of this Package do not automatically fall
  13.100 -under the copyright of this Package, but belong to whomever generated
  13.101 -them, and may be sold commercially, and may be aggregated with this
  13.102 -Package.
  13.103 -
  13.104 -7. C or perl subroutines supplied by you and linked into this Package
  13.105 -shall not be considered part of this Package.
  13.106 -
  13.107 -8. The name of the Copyright Holder may not be used to endorse or promote
  13.108 -products derived from this software without specific prior written permission.
  13.109 -
  13.110 -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  13.111 -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  13.112 -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  13.113 -
  13.114 -				The End
    14.1 --- a/xen/tools/figlet/Makefile	Fri Jul 09 15:13:35 2004 +0000
    14.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.3 @@ -1,8 +0,0 @@
    14.4 -
    14.5 -CC := gcc
    14.6 -
    14.7 -figlet: figlet.c
    14.8 -	$(CC) -o $@ $<
    14.9 -
   14.10 -clean:
   14.11 -	rm -f *.o figlet
    15.1 --- a/xen/tools/figlet/README	Fri Jul 09 15:13:35 2004 +0000
    15.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.3 @@ -1,9 +0,0 @@
    15.4 -
    15.5 -NB. This is a very hacked version of Figlet 2.2.1. 
    15.6 -
    15.7 -Don't use this outside the Xen build system. A proper version of Figlet
    15.8 -can be had from <http://www.figlet.org>.
    15.9 -
   15.10 -The distribution license is intact in the LICENSE file.
   15.11 -
   15.12 - -- Keir Fraser (2/5/2003)
    16.1 --- a/xen/tools/figlet/figlet.c	Fri Jul 09 15:13:35 2004 +0000
    16.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.3 @@ -1,2075 +0,0 @@
    16.4 -
    16.5 -/*
    16.6 - * XXXXXXXXXXXXXXXXXXXXXXXXXXX
    16.7 - * 
    16.8 - * This is a HACKED figlet source file for Xen.
    16.9 - * 
   16.10 - * Hacked to output C octal strings for inclusion in a header file.
   16.11 - * Support for opening zipped files is removed.
   16.12 - * 
   16.13 - * Go to www.figlet.org for the unhacked Figlet sources.
   16.14 - */
   16.15 -
   16.16 -/****************************************************************************
   16.17 -
   16.18 -  FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
   16.19 -  FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
   16.20 -  FIGlet Copyright 2002 Christiaan Keet
   16.21 -  Portions written by Paul Burton and Christiaan Keet
   16.22 -  Internet: <info@figlet.org>
   16.23 -  FIGlet, along with the various FIGlet fonts and documentation, is
   16.24 -    copyrighted under the provisions of the Artistic License (as listed
   16.25 -    in the file "Artistic-license.txt" which is included in this package.
   16.26 -****************************************************************************/
   16.27 -
   16.28 -#define DATE "13 July 2002"
   16.29 -#define VERSION "2.2.1"
   16.30 -#define VERSION_INT 20201
   16.31 -
   16.32 -/* FIGlet (Frank, Ian & Glenn's Letters) */
   16.33 -/* by Glenn Chappell */
   16.34 -/* Apr 1991 */
   16.35 -/* Automatic file addition by Ian Chai May 1991 */
   16.36 -/* Punctuation and numbers addition by Ian Chai Jan 1993 */
   16.37 -/* Full ASCII by Glenn Chappell Feb 1993 */
   16.38 -/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
   16.39 -/* Hard blanks by Glenn Chappell Apr 1993 */
   16.40 -/* Release 2.0 5 Aug 1993 */
   16.41 -/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
   16.42 -/* Control files by Glenn Chappell Feb 1994 */
   16.43 -/* Release 2.1 12 Aug 1994 */
   16.44 -/* Release 2.1.1 25 Aug 1994 */
   16.45 -/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line 
   16.46 -   option.  Sept 8, 1996 */
   16.47 -/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
   16.48 -   mapping tables, kerning/smushing options. */
   16.49 -/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
   16.50 -   FAQs and comments. 13 July 2002. The new official FIGlet website is 
   16.51 -   http://www.figlet.org/  */
   16.52 -
   16.53 -#define DEFAULTFONTDIR "."
   16.54 -#define DEFAULTFONTFILE "xen.flf"
   16.55 -
   16.56 -#include <stdio.h>
   16.57 -#ifdef __STDC__
   16.58 -#include <stdlib.h>
   16.59 -#endif
   16.60 -#include <string.h>
   16.61 -#include <ctype.h>
   16.62 -#include <fcntl.h>     /* Needed for get_columns */
   16.63 -
   16.64 -#ifdef unix
   16.65 -#include <sys/ioctl.h> /* Needed for get_columns */
   16.66 -#endif
   16.67 -
   16.68 -
   16.69 -#define ZFILE FILE
   16.70 -#define Zopen fopen
   16.71 -#define Zgetc fgetc
   16.72 -#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
   16.73 -#define Zclose fclose
   16.74 -
   16.75 -#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
   16.76 -
   16.77 -#define DIRSEP '/'
   16.78 -#define DIRSEP2 '\\'
   16.79 -/* Leave alone for Unix and MS-DOS/Windows!
   16.80 -Note: '/' also used in filename in get_columns(). */
   16.81 -
   16.82 -#define FONTFILESUFFIX ".flf"
   16.83 -#define FONTFILEMAGICNUMBER "flf2"
   16.84 -#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
   16.85 -#define CONTROLFILESUFFIX ".flc"
   16.86 -#define CONTROLFILEMAGICNUMBER "flc2"   /* no longer used in 2.2 */
   16.87 -#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
   16.88 -#define DEFAULTCOLUMNS 80
   16.89 -
   16.90 -
   16.91 -/****************************************************************************
   16.92 -
   16.93 -  Globals dealing with chars that are read
   16.94 -
   16.95 -****************************************************************************/
   16.96 -
   16.97 -typedef long inchr; /* "char" read from stdin */
   16.98 -
   16.99 -inchr *inchrline;  /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
  16.100 -                   /* Note: not null-terminated. */
  16.101 -int inchrlinelen,inchrlinelenlimit;
  16.102 -inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
  16.103 -  /* Latin-1 codes for German letters, respectively:
  16.104 -     LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
  16.105 -     LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
  16.106 -     LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
  16.107 -     LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
  16.108 -     LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
  16.109 -     LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
  16.110 -     LATIN SMALL LETTER SHARP S = ess-zed
  16.111 -  */
  16.112 -
  16.113 -int hzmode;  /* true if reading double-bytes in HZ mode */
  16.114 -int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
  16.115 -inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
  16.116 -int gl; /* 0-3 specifies left-half Gn character set */
  16.117 -int gr; /* 0-3 specifies right-half Gn character set */
  16.118 -
  16.119 -int Myargc;  /* to avoid passing around argc and argv */
  16.120 -char **Myargv;
  16.121 -
  16.122 -/****************************************************************************
  16.123 -
  16.124 -  Globals dealing with chars that are written
  16.125 -
  16.126 -****************************************************************************/
  16.127 -
  16.128 -typedef struct fc {
  16.129 -  inchr ord;
  16.130 -  char **thechar;  /* Alloc'd char thechar[charheight][]; */
  16.131 -  struct fc *next;
  16.132 -  } fcharnode;
  16.133 -
  16.134 -fcharnode *fcharlist;
  16.135 -char **currchar;
  16.136 -int currcharwidth;
  16.137 -int previouscharwidth;
  16.138 -char **outputline;    /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
  16.139 -int outlinelen;
  16.140 -
  16.141 -
  16.142 -/****************************************************************************
  16.143 -
  16.144 -  Globals dealing with command file storage
  16.145 -
  16.146 -****************************************************************************/
  16.147 -
  16.148 -typedef struct cfn {
  16.149 -  char *thename;
  16.150 -  struct cfn *next;
  16.151 -  } cfnamenode;
  16.152 -
  16.153 -cfnamenode *cfilelist,**cfilelistend;
  16.154 -
  16.155 -typedef struct cm {
  16.156 -  int thecommand;
  16.157 -  inchr rangelo;
  16.158 -  inchr rangehi;
  16.159 -  inchr offset;
  16.160 -  struct cm *next;
  16.161 -  } comnode;
  16.162 -
  16.163 -comnode *commandlist,**commandlistend;
  16.164 -
  16.165 -/****************************************************************************
  16.166 -
  16.167 -  Globals affected by command line options
  16.168 -
  16.169 -****************************************************************************/
  16.170 -
  16.171 -int deutschflag,justification,paragraphflag,right2left,multibyte;
  16.172 -int cmdinput;
  16.173 -
  16.174 -#define SM_SMUSH 128
  16.175 -#define SM_KERN 64
  16.176 -#define SM_EQUAL 1
  16.177 -#define SM_LOWLINE 2
  16.178 -#define SM_HIERARCHY 4
  16.179 -#define SM_PAIR 8
  16.180 -#define SM_BIGX 16
  16.181 -#define SM_HARDBLANK 32
  16.182 -
  16.183 -int smushmode;
  16.184 -
  16.185 -#define SMO_NO 0     /* no command-line smushmode */
  16.186 -#define SMO_YES 1    /* use command-line smushmode, ignore font smushmode */
  16.187 -#define SMO_FORCE 2  /* logically OR command-line and font smushmodes */
  16.188 -
  16.189 -int smushoverride;
  16.190 -
  16.191 -int outputwidth;
  16.192 -int outlinelenlimit;
  16.193 -char *fontdirname,*fontname;
  16.194 -
  16.195 -
  16.196 -/****************************************************************************
  16.197 -
  16.198 -  Globals read from font file
  16.199 -
  16.200 -****************************************************************************/
  16.201 -
  16.202 -char hardblank;
  16.203 -int charheight;
  16.204 -
  16.205 -
  16.206 -/****************************************************************************
  16.207 -
  16.208 -  Name of program, used in error messages
  16.209 -
  16.210 -****************************************************************************/
  16.211 -
  16.212 -char *myname;
  16.213 -
  16.214 -
  16.215 -#ifdef TIOCGWINSZ
  16.216 -/****************************************************************************
  16.217 -
  16.218 -  get_columns
  16.219 -
  16.220 -  Determines the number of columns of /dev/tty.  Returns the number of
  16.221 -  columns, or -1 if error.  May return 0 if columns unknown.
  16.222 -  Requires include files <fcntl.h> and <sys/ioctl.h>.
  16.223 -  by Glenn Chappell & Ian Chai 14 Apr 1993
  16.224 -
  16.225 -****************************************************************************/
  16.226 -
  16.227 -int get_columns()
  16.228 -{
  16.229 -  struct winsize ws;
  16.230 -  int fd,result;
  16.231 -
  16.232 -  if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
  16.233 -  result = ioctl(fd,TIOCGWINSZ,&ws);
  16.234 -  close(fd);
  16.235 -  return result?-1:ws.ws_col;
  16.236 -}
  16.237 -#endif /* ifdef TIOCGWINSZ */
  16.238 -
  16.239 -
  16.240 -/****************************************************************************
  16.241 -
  16.242 -  myalloc
  16.243 -
  16.244 -  Calls malloc.  If malloc returns error, prints error message and
  16.245 -  quits.
  16.246 -
  16.247 -****************************************************************************/
  16.248 -
  16.249 -#ifdef __STDC__
  16.250 -char *myalloc(size_t size)
  16.251 -#else
  16.252 -char *myalloc(size)
  16.253 -int size;
  16.254 -#endif
  16.255 -{
  16.256 -  char *ptr;
  16.257 -#ifndef __STDC__
  16.258 -  extern void *malloc();
  16.259 -#endif
  16.260 -
  16.261 -  if ((ptr = (char*)malloc(size))==NULL) {
  16.262 -    fprintf(stderr,"%s: Out of memory\n",myname);
  16.263 -    exit(1);
  16.264 -    }
  16.265 -  else {
  16.266 -    return ptr;
  16.267 -    }
  16.268 -}
  16.269 -
  16.270 -
  16.271 -/****************************************************************************
  16.272 -
  16.273 -  hasdirsep
  16.274 -
  16.275 -  Returns true if s1 contains a DIRSEP or DIRSEP2 character.
  16.276 -
  16.277 -****************************************************************************/
  16.278 -
  16.279 -int hasdirsep(s1)
  16.280 -char *s1;
  16.281 -{
  16.282 -  if (strchr(s1, DIRSEP)) return 1;
  16.283 -  else if (strchr(s1, DIRSEP2)) return 1;
  16.284 -  else return 0;
  16.285 -}
  16.286 -
  16.287 -/****************************************************************************
  16.288 -
  16.289 -  suffixcmp
  16.290 -
  16.291 -  Returns true if s2 is a suffix of s1; uses case-blind comparison.
  16.292 -
  16.293 -****************************************************************************/
  16.294 -
  16.295 -int suffixcmp(s1, s2)
  16.296 -char *s1;
  16.297 -char *s2;
  16.298 -{
  16.299 -  int len1, len2;
  16.300 -
  16.301 -  len1 = MYSTRLEN(s1);
  16.302 -  len2 = MYSTRLEN(s2);
  16.303 -  if (len2 > len1) return 0;
  16.304 -  s1 += len1 - len2;
  16.305 -  while (*s1) {
  16.306 -    if (tolower(*s1) != tolower(*s2)) return 0;
  16.307 -    s1++;
  16.308 -    s2++;
  16.309 -    }
  16.310 -  return 1;
  16.311 -}
  16.312 -   
  16.313 -/****************************************************************************
  16.314 -
  16.315 -  skiptoeol
  16.316 -
  16.317 -  Skips to the end of a line, given a stream.  Handles \r, \n, or \r\n.
  16.318 -
  16.319 -****************************************************************************/
  16.320 -
  16.321 -void skiptoeol(fp)
  16.322 -ZFILE *fp;
  16.323 -{
  16.324 -  int dummy;
  16.325 -
  16.326 -  while (dummy=Zgetc(fp),dummy!=EOF) {
  16.327 -    if (dummy == '\n') return;
  16.328 -    if (dummy == '\r') {
  16.329 -      dummy = Zgetc(fp);
  16.330 -      if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
  16.331 -      return;
  16.332 -      }
  16.333 -  }
  16.334 -}
  16.335 -
  16.336 -
  16.337 -/****************************************************************************
  16.338 -
  16.339 -  myfgets
  16.340 -
  16.341 -  Local version of fgets.  Handles \r, \n, and \r\n terminators.
  16.342 -
  16.343 -****************************************************************************/
  16.344 -
  16.345 -char *myfgets(line,maxlen,fp)
  16.346 -char *line;
  16.347 -int maxlen;
  16.348 -ZFILE *fp;
  16.349 -{
  16.350 -  int c = 0;
  16.351 -  char *p;
  16.352 -
  16.353 -  p = line;
  16.354 -  while((c=Zgetc(fp))!=EOF&&maxlen) {
  16.355 -    *p++ = c;
  16.356 -    maxlen--;
  16.357 -    if (c=='\n') break;
  16.358 -    if (c=='\r') {
  16.359 -      c = Zgetc(fp);
  16.360 -      if (c != EOF && c != '\n') Zungetc(c,fp);
  16.361 -      *(p-1) = '\n';
  16.362 -      break;
  16.363 -      }
  16.364 -    }
  16.365 -  *p = 0;
  16.366 -  return (c==EOF) ? NULL : line;
  16.367 -}
  16.368 -
  16.369 -/****************************************************************************
  16.370 -
  16.371 -  usageerr
  16.372 -
  16.373 -  Prints "Usage: ...." line to the given stream.
  16.374 -
  16.375 -****************************************************************************/
  16.376 -
  16.377 -void printusage(out)
  16.378 -FILE *out;
  16.379 -{
  16.380 -  fprintf(out,
  16.381 -    "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
  16.382 -    myname);
  16.383 -  fprintf(out,
  16.384 -    "              [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
  16.385 -  fprintf(out,
  16.386 -    "              [ -C controlfile ] [ -I infocode ] [ message ]\n");
  16.387 -}
  16.388 -
  16.389 -
  16.390 -/****************************************************************************
  16.391 -
  16.392 -  printinfo
  16.393 -
  16.394 -  Prints version and copyright message, or utility information.
  16.395 -
  16.396 -****************************************************************************/
  16.397 -
  16.398 -void printinfo(infonum)
  16.399 -int infonum;
  16.400 -{
  16.401 -  switch (infonum) {
  16.402 -    case 0: /* Copyright message */
  16.403 -      printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
  16.404 -      printf("John Cowan, Christiaan Keet\n");
  16.405 -      printf("Internet: <info@figlet.org> ");
  16.406 -      printf("Version: %s, date: %s\n\n",VERSION,DATE);
  16.407 -      printf("FIGlet, along with the various FIGlet fonts");
  16.408 -      printf(" and documentation, may be\n");
  16.409 -      printf("freely copied and distributed.\n\n");
  16.410 -      printf("If you use FIGlet, please send an");
  16.411 -      printf(" e-mail message to <info@figlet.org>.\n\n");
  16.412 -      printf("The latest version of FIGlet is available from the");
  16.413 -      printf(" web site,\n\thttp://www.figlet.org/\n\n");
  16.414 -      printusage(stdout);
  16.415 -      break;
  16.416 -    case 1: /* Version (integer) */
  16.417 -      printf("%d\n",VERSION_INT);
  16.418 -      break;
  16.419 -    case 2: /* Font directory */
  16.420 -      printf("%s\n",fontdirname);
  16.421 -      break;
  16.422 -    case 3: /* Font */
  16.423 -      printf("%s\n",fontname);
  16.424 -      break;
  16.425 -    case 4: /* Outputwidth */
  16.426 -      printf("%d\n",outputwidth);
  16.427 -    }
  16.428 -}
  16.429 -
  16.430 -
  16.431 -/****************************************************************************
  16.432 -
  16.433 -  readmagic
  16.434 -
  16.435 -  Reads a four-character magic string from a stream.
  16.436 -
  16.437 -****************************************************************************/
  16.438 -void readmagic(fp,magic)
  16.439 -ZFILE *fp;
  16.440 -char *magic;
  16.441 -{
  16.442 -  int i;
  16.443 -
  16.444 -  for (i=0;i<4;i++) {
  16.445 -    magic[i] = Zgetc(fp);
  16.446 -    }
  16.447 -  magic[4] = 0;
  16.448 -  }
  16.449 -  
  16.450 -/****************************************************************************
  16.451 -
  16.452 -  skipws
  16.453 -
  16.454 -  Skips whitespace characters from a stream.
  16.455 -
  16.456 -****************************************************************************/
  16.457 -void skipws(fp)
  16.458 -ZFILE *fp;
  16.459 -{
  16.460 -  int c;
  16.461 -  while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
  16.462 -  Zungetc(c,fp);
  16.463 -  }
  16.464 -
  16.465 -/****************************************************************************
  16.466 -
  16.467 -  readnum
  16.468 -
  16.469 -  Reads a number from a stream.  Accepts "0" prefix for octal and
  16.470 -  "0x" or "0X" for hexadecimal.  Ignores leading whitespace.
  16.471 -
  16.472 -****************************************************************************/
  16.473 -void readnum(fp,nump)
  16.474 -ZFILE *fp;
  16.475 -inchr *nump;
  16.476 -{
  16.477 -  int acc = 0;
  16.478 -  char *p;
  16.479 -  int c;
  16.480 -  int base;
  16.481 -  int sign = 1;
  16.482 -  char digits[] = "0123456789ABCDEF";
  16.483 -
  16.484 -  skipws(fp);
  16.485 -  c = Zgetc(fp);
  16.486 -  if (c=='-') {
  16.487 -    sign = -1;
  16.488 -    }
  16.489 -  else {
  16.490 -    Zungetc(c,fp);
  16.491 -    }
  16.492 -  c = Zgetc(fp);
  16.493 -  if (c=='0') {
  16.494 -     c = Zgetc(fp);
  16.495 -     if (c=='x'||c=='X') {
  16.496 -       base = 16;
  16.497 -       }
  16.498 -     else {
  16.499 -       base = 8;
  16.500 -       Zungetc(c,fp);
  16.501 -       }
  16.502 -    }
  16.503 -  else {
  16.504 -    base = 10;
  16.505 -    Zungetc(c,fp);
  16.506 -    }
  16.507 -
  16.508 -  while((c=Zgetc(fp))!=EOF) {
  16.509 -    c=toupper(c);
  16.510 -    p=strchr(digits,c);
  16.511 -    if (!p) {
  16.512 -      Zungetc(c,fp);
  16.513 -      *nump = acc * sign;
  16.514 -      return;
  16.515 -      }
  16.516 -    acc = acc*base+(p-digits);
  16.517 -    }
  16.518 -  *nump = acc * sign;
  16.519 -  }  
  16.520 -
  16.521 -/****************************************************************************
  16.522 -
  16.523 -  readTchar
  16.524 -
  16.525 -  Reads a control file "T" command character specification.
  16.526 -
  16.527 -  Character is a single byte, an escape sequence, or
  16.528 -  an escaped numeric.
  16.529 -
  16.530 -****************************************************************************/
  16.531 -
  16.532 -inchr readTchar(fp)
  16.533 -ZFILE *fp;
  16.534 -{
  16.535 -  inchr thechar;
  16.536 -  char next;
  16.537 -
  16.538 -  thechar=Zgetc(fp);
  16.539 -  if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
  16.540 -    Zungetc(thechar,fp);
  16.541 -    return '\0';
  16.542 -    }
  16.543 -  if (thechar!='\\') return thechar;
  16.544 -  next=Zgetc(fp);
  16.545 -  switch(next) {
  16.546 -    case 'a':
  16.547 -      return 7;
  16.548 -    case 'b':
  16.549 -      return 8;
  16.550 -    case 'e':
  16.551 -      return 27;
  16.552 -    case 'f':
  16.553 -      return 12;
  16.554 -    case 'n':
  16.555 -      return 10;
  16.556 -    case 'r':
  16.557 -      return 13;
  16.558 -    case 't':
  16.559 -      return 9;
  16.560 -    case 'v':
  16.561 -      return 11;
  16.562 -    default:
  16.563 -      if (next=='-' || next=='x' || (next>='0' && next<='9')) {
  16.564 -        Zungetc(next,fp);
  16.565 -        readnum(fp,&thechar);
  16.566 -        return thechar;
  16.567 -        }
  16.568 -      return next;
  16.569 -    }
  16.570 -}
  16.571 -
  16.572 -/****************************************************************************
  16.573 -
  16.574 -  charsetname
  16.575 -
  16.576 -  Get a Tchar representing a charset name, or 0 if none available.
  16.577 -  Called in getcharset().
  16.578 -
  16.579 -****************************************************************************/
  16.580 -
  16.581 -inchr charsetname(fp)
  16.582 -ZFILE *fp;
  16.583 -{
  16.584 -  inchr result;
  16.585 -
  16.586 -  result = readTchar(fp);
  16.587 -  if (result == '\n' || result == '\r') {
  16.588 -    result = 0;
  16.589 -    Zungetc(result,fp);
  16.590 -    }
  16.591 -  return result;
  16.592 -  }
  16.593 -
  16.594 -/****************************************************************************
  16.595 -
  16.596 -  charset
  16.597 -
  16.598 -  Processes "g[0123]" character set specifier
  16.599 -  Called in readcontrol().
  16.600 -
  16.601 -****************************************************************************/
  16.602 -
  16.603 -void charset(n, controlfile)
  16.604 -int n;
  16.605 -ZFILE *controlfile;
  16.606 -{
  16.607 -  int ch;
  16.608 -
  16.609 -  skipws(controlfile);
  16.610 -  if (Zgetc(controlfile) != '9') {
  16.611 -    skiptoeol(controlfile);
  16.612 -    return;
  16.613 -    }
  16.614 -  ch = Zgetc(controlfile);
  16.615 -  if (ch == '6') {
  16.616 -     gn[n] = 65536L * charsetname(controlfile) + 0x80;
  16.617 -     gndbl[n] = 0;
  16.618 -     skiptoeol(controlfile);
  16.619 -     return;
  16.620 -     }
  16.621 -  if (ch != '4') {
  16.622 -    skiptoeol(controlfile);
  16.623 -    return;
  16.624 -    }
  16.625 -  ch = Zgetc(controlfile);
  16.626 -  if (ch == 'x') {
  16.627 -     if (Zgetc(controlfile) != '9') {
  16.628 -       skiptoeol(controlfile);
  16.629 -       return;
  16.630 -       }
  16.631 -     if (Zgetc(controlfile) != '4') {
  16.632 -       skiptoeol(controlfile);
  16.633 -       return;
  16.634 -       }
  16.635 -     skipws(controlfile);
  16.636 -     gn[n] = 65536L * charsetname(controlfile);
  16.637 -     gndbl[n] = 1;
  16.638 -     skiptoeol(controlfile);
  16.639 -     return;
  16.640 -     }
  16.641 -  Zungetc(ch, controlfile);
  16.642 -  skipws(controlfile);
  16.643 -  gn[n] = 65536L * charsetname(controlfile);
  16.644 -  gndbl[n] = 0;
  16.645 -  return;
  16.646 -  }
  16.647 -
  16.648 -/****************************************************************************
  16.649 -
  16.650 -  readcontrol
  16.651 -
  16.652 -  Allocates memory and reads in the given control file.
  16.653 -  Called in readcontrolfiles().
  16.654 -
  16.655 -****************************************************************************/
  16.656 -
  16.657 -void readcontrol(controlname)
  16.658 -char *controlname;
  16.659 -{
  16.660 -  inchr firstch,lastch;
  16.661 -  char dashcheck;
  16.662 -  inchr offset;
  16.663 -  char *controlpath,magicnum[5];
  16.664 -  int command;
  16.665 -  ZFILE *controlfile;
  16.666 -  int namelen;
  16.667 -
  16.668 -  namelen = MYSTRLEN(fontdirname);
  16.669 -  controlpath = (char*)myalloc(sizeof(char)
  16.670 -    *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
  16.671 -  controlfile = NULL;
  16.672 -  if (!hasdirsep(controlname)) {
  16.673 -    strcpy(controlpath,fontdirname);
  16.674 -    controlpath[namelen] = DIRSEP;
  16.675 -    controlpath[namelen+1] = '\0';
  16.676 -    strcat(controlpath,controlname);
  16.677 -    strcat(controlpath,CONTROLFILESUFFIX);
  16.678 -    controlfile = Zopen(controlpath,"rb");
  16.679 -    }
  16.680 -  if (controlfile==NULL) {
  16.681 -    strcpy(controlpath,controlname);
  16.682 -    strcat(controlpath,CONTROLFILESUFFIX);
  16.683 -    controlfile = Zopen(controlpath,"rb");
  16.684 -    if (controlfile==NULL) {
  16.685 -      fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
  16.686 -        controlpath);
  16.687 -      exit(1);
  16.688 -      }
  16.689 -    }
  16.690 -
  16.691 -  free(controlpath);
  16.692 -
  16.693 -  (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  16.694 -  (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
  16.695 -  commandlistend = &(*commandlistend)->next;
  16.696 -  (*commandlistend) = NULL;
  16.697 -
  16.698 -  while(command=Zgetc(controlfile),command!=EOF) {
  16.699 -    switch (command) {
  16.700 -      case 't': /* Translate */
  16.701 -        skipws(controlfile);
  16.702 -        firstch=readTchar(controlfile);
  16.703 -        if ((dashcheck=Zgetc(controlfile))=='-') {
  16.704 -          lastch=readTchar(controlfile);
  16.705 -          }
  16.706 -        else {
  16.707 -          Zungetc(dashcheck,controlfile);
  16.708 -          lastch=firstch;
  16.709 -          }
  16.710 -        skipws(controlfile);
  16.711 -        offset=readTchar(controlfile)-firstch;
  16.712 -        skiptoeol(controlfile);
  16.713 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  16.714 -        (*commandlistend)->thecommand = 1;
  16.715 -        (*commandlistend)->rangelo = firstch;
  16.716 -        (*commandlistend)->rangehi = lastch;
  16.717 -        (*commandlistend)->offset = offset;
  16.718 -        commandlistend = &(*commandlistend)->next;
  16.719 -        (*commandlistend) = NULL;
  16.720 -        break;
  16.721 -      case '0': case '1': case '2': case '3': case '4':
  16.722 -      case '5': case '6': case '7': case '8': case '9':
  16.723 -      case '-':
  16.724 -                /* Mapping table entry */
  16.725 -        Zungetc(command,controlfile);
  16.726 -        readnum(controlfile,&firstch);
  16.727 -        skipws(controlfile);
  16.728 -	readnum(controlfile,&lastch);
  16.729 -	offset=lastch-firstch;
  16.730 -        lastch=firstch;
  16.731 -        skiptoeol(controlfile);
  16.732 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  16.733 -        (*commandlistend)->thecommand = 1;
  16.734 -        (*commandlistend)->rangelo = firstch;
  16.735 -        (*commandlistend)->rangehi = lastch;
  16.736 -        (*commandlistend)->offset = offset;
  16.737 -        commandlistend = &(*commandlistend)->next;
  16.738 -        (*commandlistend) = NULL;
  16.739 -        break;
  16.740 -      case 'f': /* freeze */
  16.741 -        skiptoeol(controlfile);
  16.742 -        (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
  16.743 -        (*commandlistend)->thecommand = 0;
  16.744 -        commandlistend = &(*commandlistend)->next;
  16.745 -        (*commandlistend) = NULL;
  16.746 -        break;
  16.747 -      case 'b': /* DBCS input mode */
  16.748 -        multibyte = 1;
  16.749 -        break;
  16.750 -      case 'u': /* UTF-8 input mode */
  16.751 -        multibyte = 2;
  16.752 -        break;
  16.753 -      case 'h': /* HZ input mode */
  16.754 -        multibyte = 3;
  16.755 -        break;
  16.756 -      case 'j': /* Shift-JIS input mode */
  16.757 -        multibyte = 4;
  16.758 -        break;
  16.759 -      case 'g': /* ISO 2022 character set choices */
  16.760 -        multibyte = 0;
  16.761 -        skipws(controlfile);
  16.762 -        command=Zgetc(controlfile);
  16.763 -        switch (command) {
  16.764 -          case '0': /* define G0 charset */
  16.765 -            charset(0, controlfile);
  16.766 -            break;
  16.767 -          case '1': /* set G1 charset */
  16.768 -            charset(1, controlfile);
  16.769 -            break;
  16.770 -          case '2': /* set G2 charset */
  16.771 -            charset(2, controlfile);
  16.772 -            break;
  16.773 -          case '3': /* set G3 charset */
  16.774 -            charset(3, controlfile);
  16.775 -            break;
  16.776 -          case 'l': case 'L': /* define left half */
  16.777 -            skipws(controlfile);
  16.778 -            gl = Zgetc(controlfile) - '0';
  16.779 -            skiptoeol(controlfile);
  16.780 -            break;
  16.781 -          case 'r': case 'R': /* define right half */
  16.782 -            skipws(controlfile);
  16.783 -            gr = Zgetc(controlfile) - '0';
  16.784 -            skiptoeol(controlfile);
  16.785 -            break;
  16.786 -          default: /* meaningless "g" command */
  16.787 -            skiptoeol(controlfile);
  16.788 -          }
  16.789 -      case '\r': case '\n': /* blank line */
  16.790 -        break;
  16.791 -      default: /* Includes '#' */
  16.792 -        skiptoeol(controlfile);
  16.793 -      }
  16.794 -    }
  16.795 -  Zclose(controlfile);
  16.796 -}
  16.797 -
  16.798 -
  16.799 -/****************************************************************************
  16.800 -
  16.801 -  readcontrolfiles
  16.802 -
  16.803 -  Reads in the controlfiles names in cfilelist.  Uses readcontrol.
  16.804 -  Called in main().
  16.805 -
  16.806 -****************************************************************************/
  16.807 -
  16.808 -void readcontrolfiles()
  16.809 -{
  16.810 -  cfnamenode *cfnptr;
  16.811 -
  16.812 -  for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
  16.813 -    readcontrol(cfnptr->thename);
  16.814 -    }
  16.815 -}
  16.816 -
  16.817 -
  16.818 -/****************************************************************************
  16.819 -
  16.820 -  clearcfilelist
  16.821 -
  16.822 -  Clears the control file list.  Assumes thename does not need freeing.
  16.823 -
  16.824 -****************************************************************************/
  16.825 -
  16.826 -void clearcfilelist()
  16.827 -{
  16.828 -  cfnamenode *cfnptr1,*cfnptr2;
  16.829 -
  16.830 -  cfnptr1 = cfilelist;
  16.831 -  while (cfnptr1 != NULL) {
  16.832 -    cfnptr2 = cfnptr1->next;
  16.833 -    free(cfnptr1);
  16.834 -    cfnptr1 = cfnptr2;
  16.835 -    }
  16.836 -  cfilelist = NULL;
  16.837 -  cfilelistend = &cfilelist;
  16.838 -}
  16.839 -
  16.840 -
  16.841 -/****************************************************************************
  16.842 -
  16.843 -  getparams
  16.844 -
  16.845 -  Handles all command-line parameters.  Puts all parameters within
  16.846 -  bounds.
  16.847 -
  16.848 -****************************************************************************/
  16.849 -
  16.850 -void getparams()
  16.851 -{
  16.852 -  extern char *optarg;
  16.853 -  extern int optind;
  16.854 -  int c; /* "Should" be a char -- need int for "!= -1" test*/
  16.855 -  int columns,firstfont,infoprint;
  16.856 -  char *controlname;
  16.857 -
  16.858 -  if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
  16.859 -    myname++;
  16.860 -    }
  16.861 -  else {
  16.862 -    myname = Myargv[0];
  16.863 -    }
  16.864 -  fontdirname = DEFAULTFONTDIR;
  16.865 -  firstfont = 1;
  16.866 -  fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
  16.867 -  strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
  16.868 -  if (suffixcmp(fontname,FONTFILESUFFIX)) {
  16.869 -    fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
  16.870 -    }
  16.871 -  cfilelist = NULL;
  16.872 -  cfilelistend = &cfilelist;
  16.873 -  commandlist = NULL;
  16.874 -  commandlistend = &commandlist;
  16.875 -  smushoverride = SMO_NO;
  16.876 -  deutschflag = 0;
  16.877 -  justification = -1;
  16.878 -  right2left = -1;
  16.879 -  paragraphflag = 0;
  16.880 -  infoprint = -1;
  16.881 -  cmdinput = 0;
  16.882 -  outputwidth = DEFAULTCOLUMNS;
  16.883 -  gn[1] = 0x80;
  16.884 -  gr = 1;
  16.885 -  while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
  16.886 -      /* Note: -F is not a legal option -- prints a special err message.  */
  16.887 -    switch (c) {
  16.888 -      case 'A':
  16.889 -        cmdinput = 1;
  16.890 -        break;
  16.891 -      case 'D':
  16.892 -        deutschflag = 1;
  16.893 -        break;
  16.894 -      case 'E':
  16.895 -        deutschflag = 0;
  16.896 -        break;
  16.897 -      case 'X':
  16.898 -        right2left = -1;
  16.899 -        break;
  16.900 -      case 'L':
  16.901 -        right2left = 0;
  16.902 -        break;
  16.903 -      case 'R':
  16.904 -        right2left = 1;
  16.905 -        break;
  16.906 -      case 'x':
  16.907 -        justification = -1;
  16.908 -        break;
  16.909 -      case 'l':
  16.910 -        justification = 0;
  16.911 -        break;
  16.912 -      case 'c':
  16.913 -        justification = 1;
  16.914 -        break;
  16.915 -      case 'r':
  16.916 -        justification = 2;
  16.917 -        break;
  16.918 -      case 'p':
  16.919 -        paragraphflag = 1;
  16.920 -        break;
  16.921 -      case 'n':
  16.922 -        paragraphflag = 0;
  16.923 -        break;
  16.924 -      case 's':
  16.925 -        smushoverride = SMO_NO;
  16.926 -        break;
  16.927 -      case 'k':
  16.928 -        smushmode = SM_KERN;
  16.929 -        smushoverride = SMO_YES;
  16.930 -        break;
  16.931 -      case 'S':
  16.932 -        smushmode = SM_SMUSH;
  16.933 -	smushoverride = SMO_FORCE;
  16.934 -        break;
  16.935 -      case 'o':
  16.936 -        smushmode = SM_SMUSH;
  16.937 -	smushoverride = SMO_YES;
  16.938 -        break;
  16.939 -      case 'W':
  16.940 -        smushmode = 0;
  16.941 -	smushoverride = SMO_YES;
  16.942 -        break;
  16.943 -      case 't':
  16.944 -#ifdef TIOCGWINSZ
  16.945 -        columns = get_columns();
  16.946 -        if (columns>0) {
  16.947 -          outputwidth = columns;
  16.948 -          }
  16.949 -#else /* ifdef TIOCGWINSZ */
  16.950 -        fprintf(stderr,
  16.951 -          "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
  16.952 -          myname);
  16.953 -#endif /* ifdef TIOCGWINSZ */
  16.954 -        break;
  16.955 -      case 'v':
  16.956 -        infoprint = 0;
  16.957 -        break;
  16.958 -      case 'I':
  16.959 -        infoprint = atoi(optarg);
  16.960 -        break;
  16.961 -      case 'm':
  16.962 -        smushmode = atoi(optarg);
  16.963 -        if (smushmode < -1) {
  16.964 -          smushoverride = SMO_NO;
  16.965 -          break;
  16.966 -          }
  16.967 -	if (smushmode == 0) smushmode = SM_KERN;
  16.968 -	else if (smushmode == -1) smushmode = 0;
  16.969 -	else smushmode = (smushmode & 63) | SM_SMUSH;
  16.970 -	smushoverride = SMO_YES;
  16.971 -        break;
  16.972 -      case 'w':
  16.973 -        columns = atoi(optarg);
  16.974 -        if (columns>0) {
  16.975 -          outputwidth = columns;
  16.976 -          }
  16.977 -        break;
  16.978 -      case 'd':
  16.979 -        fontdirname = optarg;
  16.980 -        break;
  16.981 -      case 'f':
  16.982 -        if (firstfont) {
  16.983 -          free(fontname);
  16.984 -          firstfont = 0;
  16.985 -          }
  16.986 -        fontname = optarg;
  16.987 -        if (suffixcmp(fontname,FONTFILESUFFIX)) {
  16.988 -          fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
  16.989 -          }
  16.990 -        break;
  16.991 -      case 'C':
  16.992 -        controlname = optarg;
  16.993 -        if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
  16.994 -          controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
  16.995 -          }
  16.996 -        (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
  16.997 -        (*cfilelistend)->thename = controlname;
  16.998 -        cfilelistend = &(*cfilelistend)->next;
  16.999 -        (*cfilelistend) = NULL;
 16.1000 -        break;
 16.1001 -      case 'N':
 16.1002 -        clearcfilelist();
 16.1003 -        multibyte = 0;
 16.1004 -        gn[0] = 0;
 16.1005 -        gn[1] = 0x80;
 16.1006 -        gn[2] = gn[3] = 0;
 16.1007 -        gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
 16.1008 -        gl = 0;
 16.1009 -        gr = 1;
 16.1010 -        break;
 16.1011 -      case 'F': /* Not a legal option */
 16.1012 -        fprintf(stderr,"%s: illegal option -- F\n",myname);
 16.1013 -        printusage(stderr);
 16.1014 -        fprintf(stderr,"\nBecause of numerous incompatibilities, the");
 16.1015 -        fprintf(stderr," \"-F\" option has been\n");
 16.1016 -        fprintf(stderr,"removed.  It has been replaced by the \"figlist\"");
 16.1017 -        fprintf(stderr," program, which is now\n");
 16.1018 -        fprintf(stderr,"included in the basic FIGlet package.  \"figlist\"");
 16.1019 -        fprintf(stderr," is also available\n");
 16.1020 -        fprintf(stderr,"from  http://www.figlet.org/");
 16.1021 -        fprintf(stderr,"under UNIX utilities.\n");
 16.1022 -        exit(1);
 16.1023 -        break;
 16.1024 -      default:
 16.1025 -        printusage(stderr);
 16.1026 -        exit(1);
 16.1027 -      }
 16.1028 -    }
 16.1029 -  if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
 16.1030 -  outlinelenlimit = outputwidth-1;
 16.1031 -  if (infoprint>=0) {
 16.1032 -    printinfo(infoprint);
 16.1033 -    exit(0);
 16.1034 -    }
 16.1035 -}
 16.1036 -
 16.1037 -
 16.1038 -/****************************************************************************
 16.1039 -
 16.1040 -  clearline
 16.1041 -
 16.1042 -  Clears both the input (inchrline) and output (outputline) storage.
 16.1043 -
 16.1044 -****************************************************************************/
 16.1045 -
 16.1046 -void clearline()
 16.1047 -{
 16.1048 -  int i;
 16.1049 -
 16.1050 -  for (i=0;i<charheight;i++) {
 16.1051 -    outputline[i][0] = '\0';
 16.1052 -    }
 16.1053 -  outlinelen = 0;
 16.1054 -  inchrlinelen = 0;
 16.1055 -}
 16.1056 -
 16.1057 -
 16.1058 -/****************************************************************************
 16.1059 -
 16.1060 -  readfontchar
 16.1061 -
 16.1062 -  Reads a font character from the font file, and places it in a
 16.1063 -  newly-allocated entry in the list.
 16.1064 -
 16.1065 -****************************************************************************/
 16.1066 -
 16.1067 -void readfontchar(file,theord,line,maxlen)
 16.1068 -ZFILE *file;
 16.1069 -inchr theord;
 16.1070 -char *line;
 16.1071 -int maxlen;
 16.1072 -{
 16.1073 -  int row,k;
 16.1074 -  char endchar;
 16.1075 -  fcharnode *fclsave;
 16.1076 -
 16.1077 -  fclsave = fcharlist;
 16.1078 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 16.1079 -  fcharlist->ord = theord;
 16.1080 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 16.1081 -  fcharlist->next = fclsave;
 16.1082 -  for (row=0;row<charheight;row++) {
 16.1083 -    if (myfgets(line,maxlen+1,file)==NULL) {
 16.1084 -      line[0] = '\0';
 16.1085 -      }
 16.1086 -    k = MYSTRLEN(line)-1;
 16.1087 -    while (k>=0 && isspace(line[k])) {
 16.1088 -      k--;
 16.1089 -      }
 16.1090 -    if (k>=0) {
 16.1091 -      endchar = line[k];
 16.1092 -      while (k>=0 ? line[k]==endchar : 0) {
 16.1093 -        k--;
 16.1094 -        }
 16.1095 -      }
 16.1096 -    line[k+1] = '\0';
 16.1097 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
 16.1098 -    strcpy(fcharlist->thechar[row],line);
 16.1099 -    }
 16.1100 -}
 16.1101 -
 16.1102 -
 16.1103 -/****************************************************************************
 16.1104 -
 16.1105 -  readfont
 16.1106 -
 16.1107 -  Allocates memory, initializes variables, and reads in the font.
 16.1108 -  Called near beginning of main().
 16.1109 -
 16.1110 -****************************************************************************/
 16.1111 -
 16.1112 -void readfont()
 16.1113 -{
 16.1114 -#define MAXFIRSTLINELEN 1000
 16.1115 -  int i,row,numsread;
 16.1116 -  inchr theord;
 16.1117 -  int maxlen,cmtlines,ffright2left;
 16.1118 -  int smush,smush2;
 16.1119 -  char *fontpath,*fileline,magicnum[5];
 16.1120 -  ZFILE *fontfile;
 16.1121 -  int namelen;
 16.1122 -
 16.1123 -  namelen = MYSTRLEN(fontdirname);
 16.1124 -  fontpath = (char*)myalloc(sizeof(char)
 16.1125 -    *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
 16.1126 -  fontfile = NULL;
 16.1127 -  if (!hasdirsep(fontname)) {
 16.1128 -    strcpy(fontpath,fontdirname);
 16.1129 -    fontpath[namelen] = DIRSEP;
 16.1130 -    fontpath[namelen+1] = '\0';
 16.1131 -    strcat(fontpath,fontname);
 16.1132 -    strcat(fontpath,FONTFILESUFFIX);
 16.1133 -    fontfile = Zopen(fontpath,"rb");
 16.1134 -    }
 16.1135 -  if (fontfile==NULL) {
 16.1136 -    strcpy(fontpath,fontname);
 16.1137 -    strcat(fontpath,FONTFILESUFFIX);
 16.1138 -    fontfile = Zopen(fontpath,"rb");
 16.1139 -    if (fontfile==NULL) {
 16.1140 -      fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
 16.1141 -      exit(1);
 16.1142 -      }
 16.1143 -    }
 16.1144 -
 16.1145 -  readmagic(fontfile,magicnum);
 16.1146 -  fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
 16.1147 -  if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
 16.1148 -    fileline[0] = '\0';
 16.1149 -    }
 16.1150 -  if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
 16.1151 -    skiptoeol(fontfile);
 16.1152 -    }
 16.1153 -  numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
 16.1154 -    &hardblank,&charheight,&maxlen,&smush,&cmtlines,
 16.1155 -    &ffright2left,&smush2);
 16.1156 -  free(fileline);
 16.1157 -  if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
 16.1158 -    fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
 16.1159 -    exit(1);
 16.1160 -    }
 16.1161 -  for (i=1;i<=cmtlines;i++) {
 16.1162 -    skiptoeol(fontfile);
 16.1163 -    }
 16.1164 -  free(fontpath);
 16.1165 -
 16.1166 -  if (numsread<6) {
 16.1167 -    ffright2left = 0;
 16.1168 -    }
 16.1169 -
 16.1170 -  if (numsread<7) { /* if no smush2, decode smush into smush2 */
 16.1171 -    if (smush == 0) smush2 = SM_KERN;
 16.1172 -    else if (smush < 0) smush2 = 0;
 16.1173 -    else smush2 = (smush & 31) | SM_SMUSH;
 16.1174 -    }
 16.1175 -
 16.1176 -  if (charheight<1) {
 16.1177 -    charheight = 1;
 16.1178 -    }
 16.1179 -
 16.1180 -  if (maxlen<1) {
 16.1181 -    maxlen = 1;
 16.1182 -    }
 16.1183 -
 16.1184 -  maxlen += 100; /* Give ourselves some extra room */
 16.1185 -
 16.1186 -  if (smushoverride == SMO_NO)
 16.1187 -     smushmode = smush2;
 16.1188 -  else if (smushoverride == SMO_FORCE)
 16.1189 -     smushmode |= smush2;
 16.1190 -
 16.1191 -  if (right2left<0) {
 16.1192 -    right2left = ffright2left;
 16.1193 -    }
 16.1194 -
 16.1195 -  if (justification<0) {
 16.1196 -    justification = 2*right2left;
 16.1197 -    }
 16.1198 -
 16.1199 -  fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
 16.1200 -  /* Allocate "missing" character */
 16.1201 -  fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
 16.1202 -  fcharlist->ord = 0;
 16.1203 -  fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
 16.1204 -  fcharlist->next = NULL;
 16.1205 -  for (row=0;row<charheight;row++) {
 16.1206 -    fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
 16.1207 -    fcharlist->thechar[row][0] = '\0';
 16.1208 -    }
 16.1209 -  for (theord=' ';theord<='~';theord++) {
 16.1210 -    readfontchar(fontfile,theord,fileline,maxlen);
 16.1211 -    }
 16.1212 -  for (theord=0;theord<=6;theord++) {
 16.1213 -    readfontchar(fontfile,deutsch[theord],fileline,maxlen);
 16.1214 -    }
 16.1215 -  while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
 16.1216 -    sscanf(fileline,"%li",&theord)==1) {
 16.1217 -    readfontchar(fontfile,theord,fileline,maxlen);
 16.1218 -    }
 16.1219 -  Zclose(fontfile);
 16.1220 -  free(fileline);
 16.1221 -}
 16.1222 -
 16.1223 -
 16.1224 -/****************************************************************************
 16.1225 -
 16.1226 -  linealloc
 16.1227 -
 16.1228 -  Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
 16.1229 -  Called near beginning of main().
 16.1230 -
 16.1231 -****************************************************************************/
 16.1232 -
 16.1233 -void linealloc()
 16.1234 -{
 16.1235 -  int row; 
 16.1236 -
 16.1237 -  outputline = (char**)myalloc(sizeof(char*)*charheight);
 16.1238 -  for (row=0;row<charheight;row++) {
 16.1239 -    outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 16.1240 -    }
 16.1241 -  inchrlinelenlimit = outputwidth*4+100;
 16.1242 -  inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
 16.1243 -  clearline();
 16.1244 -}
 16.1245 -
 16.1246 -
 16.1247 -/****************************************************************************
 16.1248 -
 16.1249 -  getletter
 16.1250 -
 16.1251 -  Sets currchar to point to the font entry for the given character.
 16.1252 -  Sets currcharwidth to the width of this character.
 16.1253 -
 16.1254 -****************************************************************************/
 16.1255 -
 16.1256 -void getletter(c)
 16.1257 -inchr c;
 16.1258 -{
 16.1259 -  fcharnode *charptr;
 16.1260 -
 16.1261 -  for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
 16.1262 -    charptr=charptr->next) ;
 16.1263 -  if (charptr!=NULL) {
 16.1264 -    currchar = charptr->thechar;
 16.1265 -    }
 16.1266 -  else {
 16.1267 -    for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
 16.1268 -      charptr=charptr->next) ;
 16.1269 -    currchar = charptr->thechar;
 16.1270 -    }
 16.1271 -  previouscharwidth = currcharwidth;
 16.1272 -  currcharwidth = MYSTRLEN(currchar[0]);
 16.1273 -}
 16.1274 -
 16.1275 -
 16.1276 -/****************************************************************************
 16.1277 -
 16.1278 -  smushem
 16.1279 -
 16.1280 -  Given 2 characters, attempts to smush them into 1, according to
 16.1281 -  smushmode.  Returns smushed character or '\0' if no smushing can be
 16.1282 -  done.
 16.1283 -
 16.1284 -  smushmode values are sum of following (all values smush blanks):
 16.1285 -    1: Smush equal chars (not hardblanks)
 16.1286 -    2: Smush '_' with any char in hierarchy below
 16.1287 -    4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
 16.1288 -       Each class in hier. can be replaced by later class.
 16.1289 -    8: [ + ] -> |, { + } -> |, ( + ) -> |
 16.1290 -   16: / + \ -> X, > + < -> X (only in that order)
 16.1291 -   32: hardblank + hardblank -> hardblank
 16.1292 -
 16.1293 -****************************************************************************/
 16.1294 -
 16.1295 -char smushem(lch,rch)
 16.1296 -char lch,rch;
 16.1297 -{
 16.1298 -  if (lch==' ') return rch;
 16.1299 -  if (rch==' ') return lch;
 16.1300 -
 16.1301 -  if (previouscharwidth<2 || currcharwidth<2) return '\0';
 16.1302 -    /* Disallows overlapping if the previous character */
 16.1303 -    /* or the current character has a width of 1 or zero. */
 16.1304 -
 16.1305 -  if ((smushmode & SM_SMUSH) == 0) return '\0';  /* kerning */
 16.1306 -
 16.1307 -  if ((smushmode & 63) == 0) {
 16.1308 -    /* This is smushing by universal overlapping. */
 16.1309 -    if (lch==' ') return rch;
 16.1310 -    if (rch==' ') return lch;
 16.1311 -    if (lch==hardblank) return rch;
 16.1312 -    if (rch==hardblank) return lch;
 16.1313 -      /* Above four lines ensure overlapping preference to */
 16.1314 -      /* visible characters. */
 16.1315 -    if (right2left==1) return lch;
 16.1316 -      /* Above line ensures that the dominant (foreground) */
 16.1317 -      /* fig-character for overlapping is the latter in the */
 16.1318 -      /* user's text, not necessarily the rightmost character. */
 16.1319 -    return rch;
 16.1320 -      /* Occurs in the absence of above exceptions. */
 16.1321 -    }
 16.1322 -  
 16.1323 -  if (smushmode & SM_HARDBLANK) {
 16.1324 -    if (lch==hardblank && rch==hardblank) return lch;
 16.1325 -    }
 16.1326 -
 16.1327 -  if (lch==hardblank || rch==hardblank) return '\0';
 16.1328 -
 16.1329 -  if (smushmode & SM_EQUAL) {
 16.1330 -    if (lch==rch) return lch;
 16.1331 -    }
 16.1332 -
 16.1333 -  if (smushmode & SM_LOWLINE) {
 16.1334 -    if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
 16.1335 -    if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
 16.1336 -    }
 16.1337 -
 16.1338 -  if (smushmode & SM_HIERARCHY) {
 16.1339 -    if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
 16.1340 -    if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
 16.1341 -    if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
 16.1342 -    if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
 16.1343 -    if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
 16.1344 -    if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
 16.1345 -    if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
 16.1346 -    if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
 16.1347 -    if (strchr("()",lch) && strchr("<>",rch)) return rch;
 16.1348 -    if (strchr("()",rch) && strchr("<>",lch)) return lch;
 16.1349 -    }
 16.1350 -
 16.1351 -  if (smushmode & SM_PAIR) {
 16.1352 -    if (lch=='[' && rch==']') return '|';
 16.1353 -    if (rch=='[' && lch==']') return '|';
 16.1354 -    if (lch=='{' && rch=='}') return '|';
 16.1355 -    if (rch=='{' && lch=='}') return '|';
 16.1356 -    if (lch=='(' && rch==')') return '|';
 16.1357 -    if (rch=='(' && lch==')') return '|';
 16.1358 -    }
 16.1359 -
 16.1360 -  if (smushmode & SM_BIGX) {
 16.1361 -    if (lch=='/' && rch=='\\') return '|';
 16.1362 -    if (rch=='/' && lch=='\\') return 'Y';
 16.1363 -    if (lch=='>' && rch=='<') return 'X';
 16.1364 -      /* Don't want the reverse of above to give 'X'. */
 16.1365 -    }
 16.1366 -
 16.1367 -  return '\0';
 16.1368 -}
 16.1369 -
 16.1370 -
 16.1371 -/****************************************************************************
 16.1372 -
 16.1373 -  smushamt
 16.1374 -
 16.1375 -  Returns the maximum amount that the current character can be smushed
 16.1376 -  into the current line.
 16.1377 -
 16.1378 -****************************************************************************/
 16.1379 -
 16.1380 -int smushamt()
 16.1381 -{
 16.1382 -  int maxsmush,amt;
 16.1383 -  int row,linebd,charbd;
 16.1384 -  char ch1,ch2;
 16.1385 -
 16.1386 -  if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
 16.1387 -    return 0;
 16.1388 -    }
 16.1389 -  maxsmush = currcharwidth;
 16.1390 -  for (row=0;row<charheight;row++) {
 16.1391 -    if (right2left) {
 16.1392 -      for (charbd=MYSTRLEN(currchar[row]);
 16.1393 -        ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
 16.1394 -      for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
 16.1395 -      amt = linebd+currcharwidth-1-charbd;
 16.1396 -      }
 16.1397 -    else {
 16.1398 -      for (linebd=MYSTRLEN(outputline[row]);
 16.1399 -        ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
 16.1400 -      for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
 16.1401 -      amt = charbd+outlinelen-1-linebd;
 16.1402 -      }
 16.1403 -    if (!ch1||ch1==' ') {
 16.1404 -      amt++;
 16.1405 -      }
 16.1406 -    else if (ch2) {
 16.1407 -      if (smushem(ch1,ch2)!='\0') {
 16.1408 -        amt++;
 16.1409 -        }
 16.1410 -      }
 16.1411 -    if (amt<maxsmush) {
 16.1412 -      maxsmush = amt;
 16.1413 -      }
 16.1414 -    }
 16.1415 -  return maxsmush;
 16.1416 -}
 16.1417 -
 16.1418 -
 16.1419 -/****************************************************************************
 16.1420 -
 16.1421 -  addchar
 16.1422 -
 16.1423 -  Attempts to add the given character onto the end of the current line.
 16.1424 -  Returns 1 if this can be done, 0 otherwise.
 16.1425 -
 16.1426 -****************************************************************************/
 16.1427 -
 16.1428 -int addchar(c)
 16.1429 -inchr c;
 16.1430 -{
 16.1431 -  int smushamount,row,k;
 16.1432 -  char *templine;
 16.1433 -
 16.1434 -  getletter(c);
 16.1435 -  smushamount = smushamt();
 16.1436 -  if (outlinelen+currcharwidth-smushamount>outlinelenlimit
 16.1437 -      ||inchrlinelen+1>inchrlinelenlimit) {
 16.1438 -    return 0;
 16.1439 -    }
 16.1440 -
 16.1441 -  templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
 16.1442 -  for (row=0;row<charheight;row++) {
 16.1443 -    if (right2left) {
 16.1444 -      strcpy(templine,currchar[row]);
 16.1445 -      for (k=0;k<smushamount;k++) {
 16.1446 -        templine[currcharwidth-smushamount+k] =
 16.1447 -          smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
 16.1448 -        }
 16.1449 -      strcat(templine,outputline[row]+smushamount);
 16.1450 -      strcpy(outputline[row],templine);
 16.1451 -      }
 16.1452 -    else {
 16.1453 -      for (k=0;k<smushamount;k++) {
 16.1454 -        outputline[row][outlinelen-smushamount+k] =
 16.1455 -          smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
 16.1456 -        }
 16.1457 -      strcat(outputline[row],currchar[row]+smushamount);
 16.1458 -      }
 16.1459 -    }
 16.1460 -  free(templine);
 16.1461 -  outlinelen = MYSTRLEN(outputline[0]);
 16.1462 -  inchrline[inchrlinelen++] = c;
 16.1463 -  return 1;
 16.1464 -}
 16.1465 -
 16.1466 -
 16.1467 -/****************************************************************************
 16.1468 -
 16.1469 -  putstring
 16.1470 -
 16.1471 -  Prints out the given null-terminated string, substituting blanks
 16.1472 -  for hardblanks.  If outputwidth is 1, prints the entire string;
 16.1473 -  otherwise prints at most outputwidth-1 characters.  Prints a newline
 16.1474 -  at the end of the string.  The string is left-justified, centered or
 16.1475 -  right-justified (taking outputwidth as the screen width) if
 16.1476 -  justification is 0, 1 or 2, respectively.
 16.1477 -
 16.1478 -****************************************************************************/
 16.1479 -
 16.1480 -static int nr_chars=0;
 16.1481 -static void myputchar(unsigned char c)
 16.1482 -{
 16.1483 -    static int startline = 1;
 16.1484 -
 16.1485 -    if ( startline )
 16.1486 -    {
 16.1487 -        startline = 0;
 16.1488 -        myputchar(' ');
 16.1489 -    }
 16.1490 -
 16.1491 -    putc(c, stderr);
 16.1492 -
 16.1493 -    if ( nr_chars == 0 )
 16.1494 -        putchar('"');
 16.1495 -
 16.1496 -    putchar('\\');
 16.1497 -    putchar('0' + ((c>>6)&7));
 16.1498 -    putchar('0' + ((c>>3)&7));
 16.1499 -    putchar('0' + ((c>>0)&7));
 16.1500 -
 16.1501 -    if ( c == '\n' )
 16.1502 -        startline = 1;
 16.1503 -
 16.1504 -    if ( ++nr_chars == 18 ) 
 16.1505 -    {
 16.1506 -        nr_chars = 0;
 16.1507 -        putchar('"');
 16.1508 -        putchar(' ');
 16.1509 -        putchar('\\');
 16.1510 -        putchar('\n');
 16.1511 -    }
 16.1512 -}
 16.1513 -
 16.1514 -void putstring(string)
 16.1515 -char *string;
 16.1516 -{
 16.1517 -  int i,len;
 16.1518 -
 16.1519 -  len = MYSTRLEN(string);
 16.1520 -  if (outputwidth>1) {
 16.1521 -    if (len>outputwidth-1) {
 16.1522 -      len = outputwidth-1;
 16.1523 -      }
 16.1524 -    if (justification>0) {
 16.1525 -      for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
 16.1526 -        myputchar(' ');
 16.1527 -        }
 16.1528 -      }
 16.1529 -    }
 16.1530 -  for (i=0;i<len;i++) {
 16.1531 -    myputchar(string[i]==hardblank?' ':string[i]);
 16.1532 -    }
 16.1533 -  myputchar('\n');
 16.1534 -}
 16.1535 -
 16.1536 -
 16.1537 -/****************************************************************************
 16.1538 -
 16.1539 -  printline
 16.1540 -
 16.1541 -  Prints outputline using putstring, then clears the current line.
 16.1542 -
 16.1543 -****************************************************************************/
 16.1544 -
 16.1545 -void printline()
 16.1546 -{
 16.1547 -  int i;
 16.1548 -
 16.1549 -  for (i=0;i<charheight;i++) {
 16.1550 -    putstring(outputline[i]);
 16.1551 -    }
 16.1552 -  clearline();
 16.1553 -}
 16.1554 -
 16.1555 -
 16.1556 -/****************************************************************************
 16.1557 -
 16.1558 -  splitline
 16.1559 -
 16.1560 -  Splits inchrline at the last word break (bunch of consecutive blanks).
 16.1561 -  Makes a new line out of the first part and prints it using
 16.1562 -  printline.  Makes a new line out of the second part and returns.
 16.1563 -
 16.1564 -****************************************************************************/
 16.1565 -
 16.1566 -void splitline()
 16.1567 -{
 16.1568 -  int i,gotspace,lastspace,len1,len2;
 16.1569 -  inchr *part1,*part2;
 16.1570 -
 16.1571 -  part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 16.1572 -  part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
 16.1573 -  gotspace = 0;
 16.1574 -  for (i=inchrlinelen-1;i>=0;i--) {
 16.1575 -    if (!gotspace && inchrline[i]==' ') {
 16.1576 -      gotspace = 1;
 16.1577 -      lastspace = i;
 16.1578 -      }
 16.1579 -    if (gotspace && inchrline[i]!=' ') {
 16.1580 -      break;
 16.1581 -      }
 16.1582 -    }
 16.1583 -  len1 = i+1;
 16.1584 -  len2 = inchrlinelen-lastspace-1;
 16.1585 -  for (i=0;i<len1;i++) {
 16.1586 -    part1[i] = inchrline[i];
 16.1587 -    }
 16.1588 -  for (i=0;i<len2;i++) {
 16.1589 -    part2[i] = inchrline[lastspace+1+i];
 16.1590 -    }
 16.1591 -  clearline();
 16.1592 -  for (i=0;i<len1;i++) {
 16.1593 -    addchar(part1[i]);
 16.1594 -    }
 16.1595 -  printline();
 16.1596 -  for (i=0;i<len2;i++) {
 16.1597 -    addchar(part2[i]);
 16.1598 -    }
 16.1599 -  free(part1);
 16.1600 -  free(part2);
 16.1601 -}
 16.1602 -
 16.1603 -
 16.1604 -/****************************************************************************
 16.1605 -
 16.1606 -  handlemapping
 16.1607 -
 16.1608 -  Given an input character (type inchr), executes re-mapping commands
 16.1609 -  read from control files.  Returns re-mapped character (inchr).
 16.1610 -
 16.1611 -****************************************************************************/
 16.1612 -
 16.1613 -inchr handlemapping(c)
 16.1614 -inchr c;
 16.1615 -{
 16.1616 -  comnode *cmptr;
 16.1617 -
 16.1618 -  cmptr=commandlist;
 16.1619 -  while (cmptr!=NULL) {
 16.1620 -    if (cmptr->thecommand ?
 16.1621 -      (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
 16.1622 -      c += cmptr->offset;
 16.1623 -      while(cmptr!=NULL ? cmptr->thecommand : 0) {
 16.1624 -        cmptr=cmptr->next;
 16.1625 -        }
 16.1626 -      }
 16.1627 -    else {
 16.1628 -      cmptr=cmptr->next;
 16.1629 -      }
 16.1630 -    }
 16.1631 -  return c;
 16.1632 -}
 16.1633 -
 16.1634 -/****************************************************************************
 16.1635 -
 16.1636 -  Agetchar
 16.1637 -
 16.1638 -  Replacement to getchar().
 16.1639 -  Acts exactly like getchar if -A is NOT specified,
 16.1640 -  else obtains input from All remaining command line words.
 16.1641 -
 16.1642 -****************************************************************************/
 16.1643 -
 16.1644 -int Agetchar()
 16.1645 -{
 16.1646 -    extern int optind;		/* current argv[] element under study */
 16.1647 -    static AgetMode = 0;	/* >= 0 for displacement into argv[n], <0 EOF */
 16.1648 -    char   *arg;		/* pointer to active character */
 16.1649 -    int    c;			/* current character */
 16.1650 -
 16.1651 -    if ( ! cmdinput )		/* is -A active? */
 16.1652 -	return( getchar() );	/* no: return stdin character */
 16.1653 -
 16.1654 -    if ( AgetMode < 0 || optind >= Myargc )		/* EOF is sticky: */
 16.1655 -	return( EOF );		/* **ensure it now and forever more */
 16.1656 -
 16.1657 -    /* find next character */
 16.1658 -    arg = Myargv[optind];		/* pointer to active arg */
 16.1659 -    c = arg[AgetMode++]&0xFF;	/* get appropriate char of arg */
 16.1660 -
 16.1661 -    if ( ! c )			/* at '\0' that terminates word? */
 16.1662 -    {   /* at end of word: return ' ' if normal word, '\n' if empty */
 16.1663 -	c = ' ';		/* suppose normal word and return blank */
 16.1664 -	if ( AgetMode == 1 )	/* if ran out in very 1st char, force \n */
 16.1665 -	    c = '\n';		/* (allows "hello '' world" to do \n at '') */
 16.1666 -	AgetMode = 0;		/* return to char 0 in NEXT word */
 16.1667 -	if ( ++optind >= Myargc )	/* run up word count and check if at "EOF" */
 16.1668 -	{   /* just ran out of arguments */
 16.1669 -	    c = EOF;		/* return EOF */
 16.1670 -	    AgetMode = -1;	/* ensure all future returns return EOF */
 16.1671 -	}
 16.1672 -    }
 16.1673 -
 16.1674 -    return( c );		/* return appropriate character */
 16.1675 -
 16.1676 -}	/* end: Agetchar() */
 16.1677 -
 16.1678 -
 16.1679 -/****************************************************************************
 16.1680 -
 16.1681 -  iso2022
 16.1682 -
 16.1683 -  Called by getinchr.  Interprets ISO 2022 sequences
 16.1684 -
 16.1685 -******************************************************************************/
 16.1686 -
 16.1687 -inchr iso2022()
 16.1688 -{
 16.1689 -  inchr ch;
 16.1690 -  inchr ch2;
 16.1691 -  int save_gl;
 16.1692 -  int save_gr;
 16.1693 -
 16.1694 -  ch = Agetchar();
 16.1695 -  if (ch == EOF) return ch;
 16.1696 -  if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
 16.1697 -  if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
 16.1698 -  switch (ch) {
 16.1699 -    case 14: /* invoke G0 into GL */
 16.1700 -      gl = 0;
 16.1701 -      return iso2022();
 16.1702 -    case 15: /* invoke G1 into GL */
 16.1703 -      gl = 1;
 16.1704 -      return iso2022();
 16.1705 -    case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
 16.1706 -      save_gl = gl; save_gr = gr;
 16.1707 -      gl = gr = 2;
 16.1708 -      ch = iso2022();
 16.1709 -      gl = save_gl; gr = save_gr;
 16.1710 -      return ch;
 16.1711 -    case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
 16.1712 -      save_gl = gl; save_gr = gr;
 16.1713 -      gl = gr = 3;
 16.1714 -      ch = iso2022();
 16.1715 -      gl = save_gl; gr = save_gr;
 16.1716 -      return ch;
 16.1717 -    case 'n' + 0x100: /* invoke G2 into GL */
 16.1718 -      gl = 2;
 16.1719 -      return iso2022();
 16.1720 -    case 'o' + 0x100: /* invoke G3 into GL */
 16.1721 -      gl = 3;
 16.1722 -      return iso2022();
 16.1723 -    case '~' + 0x100: /* invoke G1 into GR */
 16.1724 -      gr = 1;
 16.1725 -      return iso2022();
 16.1726 -    case '}' + 0x100: /* invoke G2 into GR */
 16.1727 -      gr = 2;
 16.1728 -      return iso2022();
 16.1729 -    case '|' + 0x100: /* invoke G3 into GR */
 16.1730 -      gr = 3;
 16.1731 -      return iso2022();
 16.1732 -    case '(' + 0x100: /* set G0 to 94-char set */
 16.1733 -      ch = Agetchar();
 16.1734 -      if (ch == 'B') ch = 0; /* ASCII */
 16.1735 -      gn[0] = ch << 16;
 16.1736 -      gndbl[0] = 0;
 16.1737 -      return iso2022();
 16.1738 -    case ')' + 0x100: /* set G1 to 94-char set */
 16.1739 -      ch = Agetchar();
 16.1740 -      if (ch == 'B') ch = 0;
 16.1741 -      gn[1] = ch << 16;
 16.1742 -      gndbl[1] = 0;
 16.1743 -      return iso2022();
 16.1744 -    case '*' + 0x100: /* set G2 to 94-char set */
 16.1745 -      ch = Agetchar();
 16.1746 -      if (ch == 'B') ch = 0;
 16.1747 -      gn[2] = ch << 16;
 16.1748 -      gndbl[2] = 0;
 16.1749 -      return iso2022();
 16.1750 -    case '+' + 0x100: /* set G3 to 94-char set */
 16.1751 -      ch = Agetchar();
 16.1752 -      if (ch == 'B') ch = 0;
 16.1753 -      gn[3] = ch << 16;
 16.1754 -      gndbl[3] = 0;
 16.1755 -      return iso2022();
 16.1756 -    case '-' + 0x100: /* set G1 to 96-char set */
 16.1757 -      ch = Agetchar();
 16.1758 -      if (ch == 'A') ch = 0; /* Latin-1 top half */
 16.1759 -      gn[1] = (ch << 16) | 0x80;
 16.1760 -      gndbl[1] = 0;
 16.1761 -      return iso2022();
 16.1762 -    case '.' + 0x100: /* set G2 to 96-char set */
 16.1763 -      ch = Agetchar();
 16.1764 -      if (ch == 'A') ch = 0;
 16.1765 -      gn[2] = (ch << 16) | 0x80;
 16.1766 -      gndbl[2] = 0;
 16.1767 -      return iso2022();
 16.1768 -    case '/' + 0x100: /* set G3 to 96-char set */
 16.1769 -      ch = Agetchar();
 16.1770 -      if (ch == 'A') ch = 0;
 16.1771 -      gn[3] = (ch << 16) | 0x80;
 16.1772 -      gndbl[3] = 0;
 16.1773 -      return iso2022();
 16.1774 -    case '(' + 0x200: /* set G0 to 94 x 94 char set */
 16.1775 -      ch = Agetchar();
 16.1776 -      gn[0] = ch << 16;
 16.1777 -      gndbl[0] = 1;
 16.1778 -      return iso2022();
 16.1779 -    case ')' + 0x200: /* set G1 to 94 x 94 char set */
 16.1780 -      ch = Agetchar();
 16.1781 -      gn[1] = ch << 16;
 16.1782 -      gndbl[1] = 1;
 16.1783 -      return iso2022();
 16.1784 -    case '*' + 0x200: /* set G2 to 94 x 94 char set */
 16.1785 -      ch = Agetchar();
 16.1786 -      gn[2] = ch << 16;
 16.1787 -      gndbl[2] = 1;
 16.1788 -      return iso2022();
 16.1789 -    case '+' + 0x200: /* set G3 to 94 x 94 char set */
 16.1790 -      ch = Agetchar();
 16.1791 -      gn[3] = ch << 16;
 16.1792 -      gndbl[3] = 1;
 16.1793 -      return iso2022();
 16.1794 -    default:
 16.1795 -      if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
 16.1796 -        gn[0] = (ch & ~0x200) << 16;
 16.1797 -        gndbl[0] = 1;
 16.1798 -        return iso2022();
 16.1799 -        }
 16.1800 -      }
 16.1801 -
 16.1802 -  if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
 16.1803 -    if (gndbl[gl]) {
 16.1804 -      ch2 = Agetchar();
 16.1805 -      return gn[gl] | (ch << 8) | ch2;
 16.1806 -      }
 16.1807 -    else return gn[gl] | ch;
 16.1808 -    }
 16.1809 -  else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
 16.1810 -    if (gndbl[gr]) {
 16.1811 -      ch2 = Agetchar();
 16.1812 -      return gn[gr] | (ch << 8) | ch2;
 16.1813 -      }
 16.1814 -    else return gn[gr] | (ch & ~0x80);
 16.1815 -    }
 16.1816 -  else return ch;
 16.1817 -  }
 16.1818 -
 16.1819 -/****************************************************************************
 16.1820 -
 16.1821 -  ungetinchr
 16.1822 -
 16.1823 -  Called by main.  Pushes back an "inchr" to be read by getinchr
 16.1824 -  on the next call.
 16.1825 -
 16.1826 -******************************************************************************/
 16.1827 -inchr getinchr_buffer;
 16.1828 -int getinchr_flag;
 16.1829 -
 16.1830 -inchr ungetinchr(c)
 16.1831 -inchr c;
 16.1832 -{
 16.1833 -  getinchr_buffer = c;
 16.1834 -  getinchr_flag = 1;
 16.1835 -  return c;
 16.1836 -}
 16.1837 -
 16.1838 -/*****************************************************************************
 16.1839 -
 16.1840 -  getinchr
 16.1841 -
 16.1842 -  Called by main.  Processes multibyte characters.  Invokes Agetchar.
 16.1843 -  If multibyte = 0, ISO 2022 mode (see iso2022 routine).
 16.1844 -  If multibyte = 1,  double-byte mode (0x00-0x7f bytes are characters,
 16.1845 -    0x80-0xFF bytes are first byte of a double-byte character).
 16.1846 -  If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
 16.1847 -    0x80-0xBF bytes are nonfirst byte of a multibyte character,
 16.1848 -    0xC0-0xFD bytes are first byte of a multibyte character,
 16.1849 -    0xFE-0xFF bytes are errors (all errors return code 0x0080)).
 16.1850 -  If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
 16.1851 -    "~~" is a tilde, "~x" for all other x is ignored).
 16.1852 -  If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
 16.1853 -    of a double-byte character, all other bytes are characters).
 16.1854 - 
 16.1855 -
 16.1856 -*****************************************************************************/
 16.1857 -
 16.1858 -inchr getinchr()
 16.1859 -{
 16.1860 -  int ch, ch2, ch3, ch4, ch5, ch6;
 16.1861 -
 16.1862 -  if (getinchr_flag) {
 16.1863 -    getinchr_flag = 0;
 16.1864 -    return getinchr_buffer;
 16.1865 -    }
 16.1866 -
 16.1867 -  switch(multibyte) {
 16.1868 -    case 0: /* single-byte */
 16.1869 -      return iso2022();
 16.1870 -   case 1: /* DBCS */
 16.1871 -     ch = Agetchar();
 16.1872 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 16.1873 -         (ch >= 0xE0 && ch <= 0xEF)) {
 16.1874 -       ch = (ch << 8) + Agetchar();
 16.1875 -       }
 16.1876 -     return ch;
 16.1877 -   case 2: /* UTF-8 */
 16.1878 -      ch = Agetchar();
 16.1879 -      if (ch < 0x80) return ch;  /* handles EOF, too */
 16.1880 -      if (ch < 0xC0 || ch > 0xFD)
 16.1881 -        return 0x0080;  /* illegal first character */
 16.1882 -      ch2 = Agetchar() & 0x3F;
 16.1883 -      if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
 16.1884 -      ch3 = Agetchar() & 0x3F;
 16.1885 -      if (ch < 0xF0)
 16.1886 -        return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
 16.1887 -      ch4 = Agetchar() & 0x3F;
 16.1888 -      if (ch < 0xF8)
 16.1889 -        return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
 16.1890 -      ch5 = Agetchar() & 0x3F;
 16.1891 -      if (ch < 0xFC)
 16.1892 -        return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
 16.1893 -          (ch4 << 6) + ch5;
 16.1894 -      ch6 = Agetchar() & 0x3F;
 16.1895 -      return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
 16.1896 -        (ch4 << 12) + (ch5 << 6) + ch6;
 16.1897 -   case 3: /* HZ */
 16.1898 -     ch = Agetchar();
 16.1899 -     if (ch == EOF) return ch;
 16.1900 -     if (hzmode) {
 16.1901 -       ch = (ch << 8) + Agetchar();
 16.1902 -       if (ch == ('}' << 8) + '~') {
 16.1903 -         hzmode = 0;
 16.1904 -         return getinchr();
 16.1905 -         }
 16.1906 -       return ch;
 16.1907 -       }
 16.1908 -     else if (ch == '~') {
 16.1909 -       ch = Agetchar();
 16.1910 -       if (ch == '{') {
 16.1911 -          hzmode = 1;
 16.1912 -          return getinchr();
 16.1913 -          }
 16.1914 -      else if (ch == '~') {
 16.1915 -        return ch;
 16.1916 -        }
 16.1917 -      else {
 16.1918 -        return getinchr();
 16.1919 -        }
 16.1920 -      }
 16.1921 -     else return ch;
 16.1922 -   case 4: /* Shift-JIS */
 16.1923 -     ch = Agetchar();
 16.1924 -     if ((ch >= 0x80 && ch <= 0x9F) ||
 16.1925 -         (ch >= 0xE0 && ch <= 0xEF)) {
 16.1926 -       ch = (ch << 8) + Agetchar();
 16.1927 -       }
 16.1928 -     return ch;
 16.1929 -   default:
 16.1930 -     return 0x80;
 16.1931 -    }
 16.1932 -  }
 16.1933 -
 16.1934 -/****************************************************************************
 16.1935 -
 16.1936 -  main
 16.1937 -
 16.1938 -  The main program, of course.
 16.1939 -  Reads characters 1 by 1 from stdin, and makes lines out of them using
 16.1940 -  addchar. Handles line breaking, (which accounts for most of the
 16.1941 -  complexity in this function).
 16.1942 -
 16.1943 -****************************************************************************/
 16.1944 -
 16.1945 -int main(argc,argv)
 16.1946 -int argc;
 16.1947 -char *argv[];
 16.1948 -{
 16.1949 -  inchr c,c2;
 16.1950 -  int i;
 16.1951 -  int last_was_eol_flag;
 16.1952 -/*---------------------------------------------------------------------------
 16.1953 -  wordbreakmode:
 16.1954 -    -1: /^$/ and blanks are to be absorbed (when line break was forced
 16.1955 -      by a blank or character larger than outlinelenlimit)
 16.1956 -    0: /^ *$/ and blanks are not to be absorbed
 16.1957 -    1: /[^ ]$/ no word break yet
 16.1958 -    2: /[^ ]  *$/
 16.1959 -    3: /[^ ]$/ had a word break
 16.1960 ----------------------------------------------------------------------------*/
 16.1961 -  int wordbreakmode;
 16.1962 -  int char_not_added;
 16.1963 -
 16.1964 -  Myargc = argc;
 16.1965 -  Myargv = argv;
 16.1966 -  getparams();
 16.1967 -  readcontrolfiles();
 16.1968 -  readfont();
 16.1969 -  linealloc();
 16.1970 -
 16.1971 -  wordbreakmode = 0;
 16.1972 -  last_was_eol_flag = 0;
 16.1973 -
 16.1974 -  while ((c = getinchr())!=EOF) {
 16.1975 -
 16.1976 -    if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
 16.1977 -      ungetinchr(c2 = getinchr());
 16.1978 -      c = ((isascii(c2)&&isspace(c2))?'\n':' ');
 16.1979 -      }
 16.1980 -    last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
 16.1981 -
 16.1982 -    if (deutschflag) {
 16.1983 -      if (c>='[' && c<=']') {
 16.1984 -        c = deutsch[c-'['];
 16.1985 -        }
 16.1986 -      else if (c >='{' && c <= '~') {
 16.1987 -        c = deutsch[c-'{'+3];
 16.1988 -        }
 16.1989 -      }
 16.1990 -
 16.1991 -    c = handlemapping(c);
 16.1992 -
 16.1993 -    if (isascii(c)&&isspace(c)) {
 16.1994 -      c = (c=='\t'||c==' ') ? ' ' : '\n';
 16.1995 -      }
 16.1996 -
 16.1997 -    if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
 16.1998 -
 16.1999 -/*
 16.2000 -  Note: The following code is complex and thoroughly tested.
 16.2001 -  Be careful when modifying!
 16.2002 -*/
 16.2003 -
 16.2004 -    do {
 16.2005 -      char_not_added = 0;
 16.2006 -
 16.2007 -      if (wordbreakmode== -1) {
 16.2008 -        if (c==' ') {
 16.2009 -          break;
 16.2010 -          }
 16.2011 -        else if (c=='\n') {
 16.2012 -          wordbreakmode = 0;
 16.2013 -          break;
 16.2014 -          }
 16.2015 -        wordbreakmode = 0;
 16.2016 -        }
 16.2017 -
 16.2018 -      if (c=='\n') {
 16.2019 -        printline();
 16.2020 -        wordbreakmode = 0;
 16.2021 -        }
 16.2022 -
 16.2023 -      else if (addchar(c)) {
 16.2024 -        if (c!=' ') {
 16.2025 -          wordbreakmode = (wordbreakmode>=2)?3:1;
 16.2026 -          }
 16.2027 -        else {
 16.2028 -          wordbreakmode = (wordbreakmode>0)?2:0;
 16.2029 -          }
 16.2030 -        }
 16.2031 -
 16.2032 -      else if (outlinelen==0) {
 16.2033 -        for (i=0;i<charheight;i++) {
 16.2034 -          if (right2left && outputwidth>1) {
 16.2035 -            putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
 16.2036 -            }
 16.2037 -          else {
 16.2038 -            putstring(currchar[i]);
 16.2039 -            }
 16.2040 -          }
 16.2041 -        wordbreakmode = -1;
 16.2042 -        }
 16.2043 -
 16.2044 -      else if (c==' ') {
 16.2045 -        if (wordbreakmode==2) {
 16.2046 -          splitline();
 16.2047 -          }
 16.2048 -        else {
 16.2049 -          printline();
 16.2050 -          }
 16.2051 -        wordbreakmode = -1;
 16.2052 -        }
 16.2053 -
 16.2054 -      else {
 16.2055 -        if (wordbreakmode>=2) {
 16.2056 -          splitline();
 16.2057 -          }
 16.2058 -        else {
 16.2059 -          printline();
 16.2060 -          }
 16.2061 -        wordbreakmode = (wordbreakmode==3)?1:0;
 16.2062 -        char_not_added = 1;
 16.2063 -        }
 16.2064 -
 16.2065 -      } while (char_not_added);
 16.2066 -    }
 16.2067 -
 16.2068 -  if (outlinelen!=0) {
 16.2069 -    printline();
 16.2070 -    }
 16.2071 -
 16.2072 -  /* XXX Xen hack -- finish off the C macro output */
 16.2073 -  if ( nr_chars != 0 )
 16.2074 -      putchar('"');
 16.2075 -  putchar('\n');
 16.2076 -
 16.2077 -  exit(0);
 16.2078 -}
    17.1 --- a/xen/tools/figlet/xen.flf	Fri Jul 09 15:13:35 2004 +0000
    17.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.3 @@ -1,2230 +0,0 @@
    17.4 -flf2a$ 6 5 16 15 14 0 24463 229
    17.5 -Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
    17.6 -Includes ISO Latin-1
    17.7 -figlet release 2.1 -- 12 Aug 1994
    17.8 -Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
    17.9 -  to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
   17.10 -Permission is hereby given to modify this font, as long as the
   17.11 -modifier's name is placed on a comment line.
   17.12 -
   17.13 -Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
   17.14 -supported by FIGlet and FIGWin.  May also be slightly modified for better use
   17.15 -of new full-width/kern/smush alternatives, but default output is NOT changed.
   17.16 -
   17.17 -Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
   17.18 -
   17.19 - $@
   17.20 - $@
   17.21 - $@
   17.22 - $@
   17.23 - $@
   17.24 - $@@
   17.25 -  _ @
   17.26 - | |@
   17.27 - | |@
   17.28 - |_|@
   17.29 - (_)@
   17.30 -    @@
   17.31 -  _ _ @
   17.32 - ( | )@
   17.33 -  V V @
   17.34 -   $  @
   17.35 -   $  @
   17.36 -      @@
   17.37 -    _  _   @
   17.38 -  _| || |_ @
   17.39 - |_  ..  _|@
   17.40 - |_      _|@
   17.41 -   |_||_|  @
   17.42 -           @@
   17.43 -   _  @
   17.44 -  | | @
   17.45 - / __)@
   17.46 - \__ \@
   17.47 - (   /@
   17.48 -  |_| @@
   17.49 -  _  __@
   17.50 - (_)/ /@
   17.51 -   / / @
   17.52 -  / /_ @
   17.53 - /_/(_)@
   17.54 -       @@
   17.55 -   ___   @
   17.56 -  ( _ )  @
   17.57 -  / _ \/\@
   17.58 - | (_>  <@
   17.59 -  \___/\/@
   17.60 -         @@
   17.61 -  _ @
   17.62 - ( )@
   17.63 - |/ @
   17.64 -  $ @
   17.65 -  $ @
   17.66 -    @@
   17.67 -   __@
   17.68 -  / /@
   17.69 - | | @
   17.70 - | | @
   17.71 - | | @
   17.72 -  \_\@@
   17.73 - __  @
   17.74 - \ \ @
   17.75 -  | |@
   17.76 -  | |@
   17.77 -  | |@
   17.78 - /_/ @@
   17.79 -       @
   17.80 - __/\__@
   17.81 - \    /@
   17.82 - /_  _\@
   17.83 -   \/  @
   17.84 -       @@
   17.85 -        @
   17.86 -    _   @
   17.87 -  _| |_ @
   17.88 - |_   _|@
   17.89 -   |_|  @
   17.90 -        @@
   17.91 -    @
   17.92 -    @
   17.93 -    @
   17.94 -  _ @
   17.95 - ( )@
   17.96 - |/ @@
   17.97 -     @
   17.98 -     @
   17.99 -  __ @
  17.100 - |__|@
  17.101 -  $  @
  17.102 -     @@
  17.103 -    @
  17.104 -    @
  17.105 -    @
  17.106 -  _ @
  17.107 - (_)@
  17.108 -    @@
  17.109 -     __@
  17.110 -    / /@
  17.111 -   / / @
  17.112 -  / /  @
  17.113 - /_/   @
  17.114 -       @@
  17.115 -   ___  @
  17.116 -  / _ \ @
  17.117 - | | | |@
  17.118 - | |_| |@
  17.119 -  \___/ @
  17.120 -        @@
  17.121 -  _ @
  17.122 - / |@
  17.123 - | |@
  17.124 - | |@
  17.125 - |_|@
  17.126 -    @@
  17.127 -  ____  @
  17.128 - |___ \ @
  17.129 -   __) |@
  17.130 -  / __/ @
  17.131 - |_____|@
  17.132 -        @@
  17.133 -  _____ @
  17.134 - |___ / @
  17.135 -   |_ \ @
  17.136 -  ___) |@
  17.137 - |____/ @
  17.138 -        @@
  17.139 -  _  _   @
  17.140 - | || |  @
  17.141 - | || |_ @
  17.142 - |__   _|@
  17.143 -    |_|  @
  17.144 -         @@
  17.145 -  ____  @
  17.146 - | ___| @
  17.147 - |___ \ @
  17.148 -  ___) |@
  17.149 - |____/ @
  17.150 -        @@
  17.151 -   __   @
  17.152 -  / /_  @
  17.153 - | '_ \ @
  17.154 - | (_) |@
  17.155 -  \___/ @
  17.156 -        @@
  17.157 -  _____ @
  17.158 - |___  |@
  17.159 -    / / @
  17.160 -   / /  @
  17.161 -  /_/   @
  17.162 -        @@
  17.163 -   ___  @
  17.164 -  ( _ ) @
  17.165 -  / _ \ @
  17.166 - | (_) |@
  17.167 -  \___/ @
  17.168 -        @@
  17.169 -   ___  @
  17.170 -  / _ \ @
  17.171 - | (_) |@
  17.172 -  \__, |@
  17.173 -    /_/ @
  17.174 -        @@
  17.175 -    @
  17.176 -  _ @
  17.177 - (_)@
  17.178 -  _ @
  17.179 - (_)@
  17.180 -    @@
  17.181 -    @
  17.182 -  _ @
  17.183 - (_)@
  17.184 -  _ @
  17.185 - ( )@
  17.186 - |/ @@
  17.187 -   __@
  17.188 -  / /@
  17.189 - / / @
  17.190 - \ \ @
  17.191 -  \_\@
  17.192 -     @@
  17.193 -        @
  17.194 -  _____ @
  17.195 - |_____|@
  17.196 - |_____|@
  17.197 -    $   @
  17.198 -        @@
  17.199 - __  @
  17.200 - \ \ @
  17.201 -  \ \@
  17.202 -  / /@
  17.203 - /_/ @
  17.204 -     @@
  17.205 -  ___ @
  17.206 - |__ \@
  17.207 -   / /@
  17.208 -  |_| @
  17.209 -  (_) @
  17.210 -      @@
  17.211 -    ____  @
  17.212 -   / __ \ @
  17.213 -  / / _` |@
  17.214 - | | (_| |@
  17.215 -  \ \__,_|@
  17.216 -   \____/ @@
  17.217 -     _    @
  17.218 -    / \   @
  17.219 -   / _ \  @
  17.220 -  / ___ \ @
  17.221 - /_/   \_\@
  17.222 -          @@
  17.223 -  ____  @
  17.224 - | __ ) @
  17.225 - |  _ \ @
  17.226 - | |_) |@
  17.227 - |____/ @
  17.228 -        @@
  17.229 -   ____ @
  17.230 -  / ___|@
  17.231 - | |    @
  17.232 - | |___ @
  17.233 -  \____|@
  17.234 -        @@
  17.235 -  ____  @
  17.236 - |  _ \ @
  17.237 - | | | |@
  17.238 - | |_| |@
  17.239 - |____/ @
  17.240 -        @@
  17.241 -  _____ @
  17.242 - | ____|@
  17.243 - |  _|  @
  17.244 - | |___ @
  17.245 - |_____|@
  17.246 -        @@
  17.247 -  _____ @
  17.248 - |  ___|@
  17.249 - | |_   @
  17.250 - |  _|  @
  17.251 - |_|    @
  17.252 -        @@
  17.253 -   ____ @
  17.254 -  / ___|@
  17.255 - | |  _ @
  17.256 - | |_| |@
  17.257 -  \____|@
  17.258 -        @@
  17.259 -  _   _ @
  17.260 - | | | |@
  17.261 - | |_| |@
  17.262 - |  _  |@
  17.263 - |_| |_|@
  17.264 -        @@
  17.265 -  ___ @
  17.266 - |_ _|@
  17.267 -  | | @
  17.268 -  | | @
  17.269 - |___|@
  17.270 -      @@
  17.271 -      _ @
  17.272 -     | |@
  17.273 -  _  | |@
  17.274 - | |_| |@
  17.275 -  \___/ @
  17.276 -        @@
  17.277 -  _  __@
  17.278 - | |/ /@
  17.279 - | ' / @
  17.280 - | . \ @
  17.281 - |_|\_\@
  17.282 -       @@
  17.283 -  _     @
  17.284 - | |    @
  17.285 - | |    @
  17.286 - | |___ @
  17.287 - |_____|@
  17.288 -        @@
  17.289 -  __  __ @
  17.290 - |  \/  |@
  17.291 - | |\/| |@
  17.292 - | |  | |@
  17.293 - |_|  |_|@
  17.294 -         @@
  17.295 -  _   _ @
  17.296 - | \ | |@
  17.297 - |  \| |@
  17.298 - | |\  |@
  17.299 - |_| \_|@
  17.300 -        @@
  17.301 -   ___  @
  17.302 -  / _ \ @
  17.303 - | | | |@
  17.304 - | |_| |@
  17.305 -  \___/ @
  17.306 -        @@
  17.307 -  ____  @
  17.308 - |  _ \ @
  17.309 - | |_) |@
  17.310 - |  __/ @
  17.311 - |_|    @
  17.312 -        @@
  17.313 -   ___  @
  17.314 -  / _ \ @
  17.315 - | | | |@
  17.316 - | |_| |@
  17.317 -  \__\_\@
  17.318 -        @@
  17.319 -  ____  @
  17.320 - |  _ \ @
  17.321 - | |_) |@
  17.322 - |  _ < @
  17.323 - |_| \_\@
  17.324 -        @@
  17.325 -  ____  @
  17.326 - / ___| @
  17.327 - \___ \ @
  17.328 -  ___) |@
  17.329 - |____/ @
  17.330 -        @@
  17.331 -  _____ @
  17.332 - |_   _|@
  17.333 -   | |  @
  17.334 -   | |  @
  17.335 -   |_|  @
  17.336 -        @@
  17.337 -  _   _ @
  17.338 - | | | |@
  17.339 - | | | |@
  17.340 - | |_| |@
  17.341 -  \___/ @
  17.342 -        @@
  17.343 - __     __@
  17.344 - \ \   / /@
  17.345 -  \ \ / / @
  17.346 -   \ V /  @
  17.347 -    \_/   @
  17.348 -          @@
  17.349 - __        __@
  17.350 - \ \      / /@
  17.351 -  \ \ /\ / / @
  17.352 -   \ V  V /  @
  17.353 -    \_/\_/   @
  17.354 -             @@
  17.355 - __  __@
  17.356 - \ \/ /@
  17.357 -  \  / @
  17.358 -  /  \ @
  17.359 - /_/\_\@
  17.360 -       @@
  17.361 - __   __@
  17.362 - \ \ / /@
  17.363 -  \ V / @
  17.364 -   | |  @
  17.365 -   |_|  @
  17.366 -        @@
  17.367 -  _____@
  17.368 - |__  /@
  17.369 -   / / @
  17.370 -  / /_ @
  17.371 - /____|@
  17.372 -       @@
  17.373 -  __ @
  17.374 - | _|@
  17.375 - | | @
  17.376 - | | @
  17.377 - | | @
  17.378 - |__|@@
  17.379 - __    @
  17.380 - \ \   @
  17.381 -  \ \  @
  17.382 -   \ \ @
  17.383 -    \_\@
  17.384 -       @@
  17.385 -  __ @
  17.386 - |_ |@
  17.387 -  | |@
  17.388 -  | |@
  17.389 -  | |@
  17.390 - |__|@@
  17.391 -  /\ @
  17.392 - |/\|@
  17.393 -   $ @
  17.394 -   $ @
  17.395 -   $ @
  17.396 -     @@
  17.397 -        @
  17.398 -        @
  17.399 -        @
  17.400 -        @
  17.401 -  _____ @
  17.402 - |_____|@@
  17.403 -  _ @
  17.404 - ( )@
  17.405 -  \|@
  17.406 -  $ @
  17.407 -  $ @
  17.408 -    @@
  17.409 -        @
  17.410 -   __ _ @
  17.411 -  / _` |@
  17.412 - | (_| |@
  17.413 -  \__,_|@
  17.414 -        @@
  17.415 -  _     @
  17.416 - | |__  @
  17.417 - | '_ \ @
  17.418 - | |_) |@
  17.419 - |_.__/ @
  17.420 -        @@
  17.421 -       @
  17.422 -   ___ @
  17.423 -  / __|@
  17.424 - | (__ @
  17.425 -  \___|@
  17.426 -       @@
  17.427 -      _ @
  17.428 -   __| |@
  17.429 -  / _` |@
  17.430 - | (_| |@
  17.431 -  \__,_|@
  17.432 -        @@
  17.433 -       @
  17.434 -   ___ @
  17.435 -  / _ \@
  17.436 - |  __/@
  17.437 -  \___|@
  17.438 -       @@
  17.439 -   __ @
  17.440 -  / _|@
  17.441 - | |_ @
  17.442 - |  _|@
  17.443 - |_|  @
  17.444 -      @@
  17.445 -        @
  17.446 -   __ _ @
  17.447 -  / _` |@
  17.448 - | (_| |@
  17.449 -  \__, |@
  17.450 -  |___/ @@
  17.451 -  _     @
  17.452 - | |__  @
  17.453 - | '_ \ @
  17.454 - | | | |@
  17.455 - |_| |_|@
  17.456 -        @@
  17.457 -  _ @
  17.458 - (_)@
  17.459 - | |@
  17.460 - | |@
  17.461 - |_|@
  17.462 -    @@
  17.463 -    _ @
  17.464 -   (_)@
  17.465 -   | |@
  17.466 -   | |@
  17.467 -  _/ |@
  17.468 - |__/ @@
  17.469 -  _    @
  17.470 - | | __@
  17.471 - | |/ /@
  17.472 - |   < @
  17.473 - |_|\_\@
  17.474 -       @@
  17.475 -  _ @
  17.476 - | |@
  17.477 - | |@
  17.478 - | |@
  17.479 - |_|@
  17.480 -    @@
  17.481 -            @
  17.482 -  _ __ ___  @
  17.483 - | '_ ` _ \ @
  17.484 - | | | | | |@
  17.485 - |_| |_| |_|@
  17.486 -            @@
  17.487 -        @
  17.488 -  _ __  @
  17.489 - | '_ \ @
  17.490 - | | | |@
  17.491 - |_| |_|@
  17.492 -        @@
  17.493 -        @
  17.494 -   ___  @
  17.495 -  / _ \ @
  17.496 - | (_) |@
  17.497 -  \___/ @
  17.498 -        @@
  17.499 -        @
  17.500 -  _ __  @
  17.501 - | '_ \ @
  17.502 - | |_) |@
  17.503 - | .__/ @
  17.504 - |_|    @@
  17.505 -        @
  17.506 -   __ _ @
  17.507 -  / _` |@
  17.508 - | (_| |@
  17.509 -  \__, |@
  17.510 -     |_|@@
  17.511 -       @
  17.512 -  _ __ @
  17.513 - | '__|@
  17.514 - | |   @
  17.515 - |_|   @
  17.516 -       @@
  17.517 -      @
  17.518 -  ___ @
  17.519 - / __|@
  17.520 - \__ \@
  17.521 - |___/@
  17.522 -      @@
  17.523 -  _   @
  17.524 - | |_ @
  17.525 - | __|@
  17.526 - | |_ @
  17.527 -  \__|@
  17.528 -      @@
  17.529 -        @
  17.530 -  _   _ @
  17.531 - | | | |@
  17.532 - | |_| |@
  17.533 -  \__,_|@
  17.534 -        @@
  17.535 -        @
  17.536 - __   __@
  17.537 - \ \ / /@
  17.538 -  \ V / @
  17.539 -   \_/  @
  17.540 -        @@
  17.541 -           @
  17.542 - __      __@
  17.543 - \ \ /\ / /@
  17.544 -  \ V  V / @
  17.545 -   \_/\_/  @
  17.546 -           @@
  17.547 -       @
  17.548 - __  __@
  17.549 - \ \/ /@
  17.550 -  >  < @
  17.551 - /_/\_\@
  17.552 -       @@
  17.553 -        @
  17.554 -  _   _ @
  17.555 - | | | |@
  17.556 - | |_| |@
  17.557 -  \__, |@
  17.558 -  |___/ @@
  17.559 -      @
  17.560 -  ____@
  17.561 - |_  /@
  17.562 -  / / @
  17.563 - /___|@
  17.564 -      @@
  17.565 -    __@
  17.566 -   / /@
  17.567 -  | | @
  17.568 - < <  @
  17.569 -  | | @
  17.570 -   \_\@@
  17.571 -  _ @
  17.572 - | |@
  17.573 - | |@
  17.574 - | |@
  17.575 - | |@
  17.576 - |_|@@
  17.577 - __   @
  17.578 - \ \  @
  17.579 -  | | @
  17.580 -   > >@
  17.581 -  | | @
  17.582 - /_/  @@
  17.583 -  /\/|@
  17.584 - |/\/ @
  17.585 -   $  @
  17.586 -   $  @
  17.587 -   $  @
  17.588 -      @@
  17.589 -  _   _ @
  17.590 - (_)_(_)@
  17.591 -   /_\  @
  17.592 -  / _ \ @
  17.593 - /_/ \_\@
  17.594 -        @@
  17.595 -  _   _ @
  17.596 - (_)_(_)@
  17.597 -  / _ \ @
  17.598 - | |_| |@
  17.599 -  \___/ @
  17.600 -        @@
  17.601 -  _   _ @
  17.602 - (_) (_)@
  17.603 - | | | |@
  17.604 - | |_| |@
  17.605 -  \___/ @
  17.606 -        @@
  17.607 -  _   _ @
  17.608 - (_)_(_)@
  17.609 -  / _` |@
  17.610 - | (_| |@
  17.611 -  \__,_|@
  17.612 -        @@
  17.613 -  _   _ @
  17.614 - (_)_(_)@
  17.615 -  / _ \ @
  17.616 - | (_) |@
  17.617 -  \___/ @
  17.618 -        @@
  17.619 -  _   _ @
  17.620 - (_) (_)@
  17.621 - | | | |@
  17.622 - | |_| |@
  17.623 -  \__,_|@
  17.624 -        @@
  17.625 -   ___ @
  17.626 -  / _ \@
  17.627 - | |/ /@
  17.628 - | |\ \@
  17.629 - | ||_/@
  17.630 - |_|   @@
  17.631 -160  NO-BREAK SPACE
  17.632 - $@
  17.633 - $@
  17.634 - $@
  17.635 - $@
  17.636 - $@
  17.637 - $@@
  17.638 -161  INVERTED EXCLAMATION MARK
  17.639 -  _ @
  17.640 - (_)@
  17.641 - | |@
  17.642 - | |@
  17.643 - |_|@
  17.644 -    @@
  17.645 -162  CENT SIGN
  17.646 -    _  @
  17.647 -   | | @
  17.648 -  / __)@
  17.649 - | (__ @
  17.650 -  \   )@
  17.651 -   |_| @@
  17.652 -163  POUND SIGN
  17.653 -    ___  @
  17.654 -   / ,_\ @
  17.655 - _| |_   @
  17.656 -  | |___ @
  17.657 - (_,____|@
  17.658 -         @@
  17.659 -164  CURRENCY SIGN
  17.660 - /\___/\@
  17.661 - \  _  /@
  17.662 - | (_) |@
  17.663 - / ___ \@
  17.664 - \/   \/@
  17.665 -        @@
  17.666 -165  YEN SIGN
  17.667 -  __ __ @
  17.668 -  \ V / @
  17.669 - |__ __|@
  17.670 - |__ __|@
  17.671 -   |_|  @
  17.672 -        @@
  17.673 -166  BROKEN BAR
  17.674 -  _ @
  17.675 - | |@
  17.676 - |_|@
  17.677 -  _ @
  17.678 - | |@
  17.679 - |_|@@
  17.680 -167  SECTION SIGN
  17.681 -    __ @
  17.682 -  _/ _)@
  17.683 - / \ \ @
  17.684 - \ \\ \@
  17.685 -  \ \_/@
  17.686 - (__/  @@
  17.687 -168  DIAERESIS
  17.688 -  _   _ @
  17.689 - (_) (_)@
  17.690 -  $   $ @
  17.691 -  $   $ @
  17.692 -  $   $ @
  17.693 -        @@
  17.694 -169  COPYRIGHT SIGN
  17.695 -    _____   @
  17.696 -   / ___ \  @
  17.697 -  / / __| \ @
  17.698 - | | (__   |@
  17.699 -  \ \___| / @
  17.700 -   \_____/  @@
  17.701 -170  FEMININE ORDINAL INDICATOR
  17.702 -  __ _ @
  17.703 - / _` |@
  17.704 - \__,_|@
  17.705 - |____|@
  17.706 -    $  @
  17.707 -       @@
  17.708 -171  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  17.709 -   ____@
  17.710 -  / / /@
  17.711 - / / / @
  17.712 - \ \ \ @
  17.713 -  \_\_\@
  17.714 -       @@
  17.715 -172  NOT SIGN
  17.716 -        @
  17.717 -  _____ @
  17.718 - |___  |@
  17.719 -     |_|@
  17.720 -    $   @
  17.721 -        @@
  17.722 -173  SOFT HYPHEN
  17.723 -       @
  17.724 -       @
  17.725 -  ____ @
  17.726 - |____|@
  17.727 -    $  @
  17.728 -       @@
  17.729 -174  REGISTERED SIGN
  17.730 -    _____   @
  17.731 -   / ___ \  @
  17.732 -  / | _ \ \ @
  17.733 - |  |   /  |@
  17.734 -  \ |_|_\ / @
  17.735 -   \_____/  @@
  17.736 -175  MACRON
  17.737 -  _____ @
  17.738 - |_____|@
  17.739 -    $   @
  17.740 -    $   @
  17.741 -    $   @
  17.742 -        @@
  17.743 -176  DEGREE SIGN
  17.744 -   __  @
  17.745 -  /  \ @
  17.746 - | () |@
  17.747 -  \__/ @
  17.748 -    $  @
  17.749 -       @@
  17.750 -177  PLUS-MINUS SIGN
  17.751 -    _   @
  17.752 -  _| |_ @
  17.753 - |_   _|@
  17.754 -  _|_|_ @
  17.755 - |_____|@
  17.756 -        @@
  17.757 -178  SUPERSCRIPT TWO
  17.758 -  ___ @
  17.759 - |_  )@
  17.760 -  / / @
  17.761 - /___|@
  17.762 -   $  @
  17.763 -      @@
  17.764 -179  SUPERSCRIPT THREE
  17.765 -  ____@
  17.766 - |__ /@
  17.767 -  |_ \@
  17.768 - |___/@
  17.769 -   $  @
  17.770 -      @@
  17.771 -180  ACUTE ACCENT
  17.772 -  __@
  17.773 - /_/@
  17.774 -  $ @
  17.775 -  $ @
  17.776 -  $ @
  17.777 -    @@
  17.778 -181  MICRO SIGN
  17.779 -        @
  17.780 -  _   _ @
  17.781 - | | | |@
  17.782 - | |_| |@
  17.783 - | ._,_|@
  17.784 - |_|    @@
  17.785 -182  PILCROW SIGN
  17.786 -   _____ @
  17.787 -  /     |@
  17.788 - | (| | |@
  17.789 -  \__ | |@
  17.790 -    |_|_|@
  17.791 -         @@
  17.792 -183  MIDDLE DOT
  17.793 -    @
  17.794 -  _ @
  17.795 - (_)@
  17.796 -  $ @
  17.797 -  $ @
  17.798 -    @@
  17.799 -184  CEDILLA
  17.800 -    @
  17.801 -    @
  17.802 -    @
  17.803 -    @
  17.804 -  _ @
  17.805 - )_)@@
  17.806 -185  SUPERSCRIPT ONE
  17.807 -  _ @
  17.808 - / |@
  17.809 - | |@
  17.810 - |_|@
  17.811 -  $ @
  17.812 -    @@
  17.813 -186  MASCULINE ORDINAL INDICATOR
  17.814 -  ___ @
  17.815 - / _ \@
  17.816 - \___/@
  17.817 - |___|@
  17.818 -   $  @
  17.819 -      @@
  17.820 -187  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  17.821 - ____  @
  17.822 - \ \ \ @
  17.823 -  \ \ \@
  17.824 -  / / /@
  17.825 - /_/_/ @
  17.826 -       @@
  17.827 -188  VULGAR FRACTION ONE QUARTER
  17.828 -  _   __    @
  17.829 - / | / / _  @
  17.830 - | |/ / | | @
  17.831 - |_/ /|_  _|@
  17.832 -  /_/   |_| @
  17.833 -            @@
  17.834 -189  VULGAR FRACTION ONE HALF
  17.835 -  _   __   @
  17.836 - / | / /__ @
  17.837 - | |/ /_  )@
  17.838 - |_/ / / / @
  17.839 -  /_/ /___|@
  17.840 -           @@
  17.841 -190  VULGAR FRACTION THREE QUARTERS
  17.842 -  ____  __    @
  17.843 - |__ / / / _  @
  17.844 -  |_ \/ / | | @
  17.845 - |___/ /|_  _|@
  17.846 -    /_/   |_| @
  17.847 -              @@
  17.848 -191  INVERTED QUESTION MARK
  17.849 -   _  @
  17.850 -  (_) @
  17.851 -  | | @
  17.852 - / /_ @
  17.853 - \___|@
  17.854 -      @@
  17.855 -192  LATIN CAPITAL LETTER A WITH GRAVE
  17.856 -   __   @
  17.857 -   \_\  @
  17.858 -   /_\  @
  17.859 -  / _ \ @
  17.860 - /_/ \_\@
  17.861 -        @@
  17.862 -193  LATIN CAPITAL LETTER A WITH ACUTE
  17.863 -    __  @
  17.864 -   /_/  @
  17.865 -   /_\  @
  17.866 -  / _ \ @
  17.867 - /_/ \_\@
  17.868 -        @@
  17.869 -194  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  17.870 -   //\  @
  17.871 -  |/_\| @
  17.872 -   /_\  @
  17.873 -  / _ \ @
  17.874 - /_/ \_\@
  17.875 -        @@
  17.876 -195  LATIN CAPITAL LETTER A WITH TILDE
  17.877 -   /\/| @
  17.878 -  |/\/  @
  17.879 -   /_\  @
  17.880 -  / _ \ @
  17.881 - /_/ \_\@
  17.882 -        @@
  17.883 -196  LATIN CAPITAL LETTER A WITH DIAERESIS
  17.884 -  _   _ @
  17.885 - (_)_(_)@
  17.886 -   /_\  @
  17.887 -  / _ \ @
  17.888 - /_/ \_\@
  17.889 -        @@
  17.890 -197  LATIN CAPITAL LETTER A WITH RING ABOVE
  17.891 -    _   @
  17.892 -   (o)  @
  17.893 -   /_\  @
  17.894 -  / _ \ @
  17.895 - /_/ \_\@
  17.896 -        @@
  17.897 -198  LATIN CAPITAL LETTER AE
  17.898 -     ______ @
  17.899 -    /  ____|@
  17.900 -   / _  _|  @
  17.901 -  / __ |___ @
  17.902 - /_/ |_____|@
  17.903 -            @@
  17.904 -199  LATIN CAPITAL LETTER C WITH CEDILLA
  17.905 -   ____ @
  17.906 -  / ___|@
  17.907 - | |    @
  17.908 - | |___ @
  17.909 -  \____|@
  17.910 -    )_) @@
  17.911 -200  LATIN CAPITAL LETTER E WITH GRAVE
  17.912 -   __   @
  17.913 -  _\_\_ @
  17.914 - | ____|@
  17.915 - |  _|_ @
  17.916 - |_____|@
  17.917 -        @@
  17.918 -201  LATIN CAPITAL LETTER E WITH ACUTE
  17.919 -    __  @
  17.920 -  _/_/_ @
  17.921 - | ____|@
  17.922 - |  _|_ @
  17.923 - |_____|@
  17.924 -        @@
  17.925 -202  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  17.926 -   //\  @
  17.927 -  |/_\| @
  17.928 - | ____|@
  17.929 - |  _|_ @
  17.930 - |_____|@
  17.931 -        @@
  17.932 -203  LATIN CAPITAL LETTER E WITH DIAERESIS
  17.933 -  _   _ @
  17.934 - (_)_(_)@
  17.935 - | ____|@
  17.936 - |  _|_ @
  17.937 - |_____|@
  17.938 -        @@
  17.939 -204  LATIN CAPITAL LETTER I WITH GRAVE
  17.940 -  __  @
  17.941 -  \_\ @
  17.942 - |_ _|@
  17.943 -  | | @
  17.944 - |___|@
  17.945 -      @@
  17.946 -205  LATIN CAPITAL LETTER I WITH ACUTE
  17.947 -   __ @
  17.948 -  /_/ @
  17.949 - |_ _|@
  17.950 -  | | @
  17.951 - |___|@
  17.952 -      @@
  17.953 -206  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  17.954 -  //\ @
  17.955 - |/_\|@
  17.956 - |_ _|@
  17.957 -  | | @
  17.958 - |___|@
  17.959 -      @@
  17.960 -207  LATIN CAPITAL LETTER I WITH DIAERESIS
  17.961 -  _   _ @
  17.962 - (_)_(_)@
  17.963 -  |_ _| @
  17.964 -   | |  @
  17.965 -  |___| @
  17.966 -        @@
  17.967 -208  LATIN CAPITAL LETTER ETH
  17.968 -    ____  @
  17.969 -   |  _ \ @
  17.970 -  _| |_| |@
  17.971 - |__ __| |@
  17.972 -   |____/ @
  17.973 -          @@
  17.974 -209  LATIN CAPITAL LETTER N WITH TILDE
  17.975 -   /\/|@
  17.976 -  |/\/ @
  17.977 - | \| |@
  17.978 - | .` |@
  17.979 - |_|\_|@
  17.980 -       @@
  17.981 -210  LATIN CAPITAL LETTER O WITH GRAVE
  17.982 -   __   @
  17.983 -   \_\  @
  17.984 -  / _ \ @
  17.985 - | |_| |@
  17.986 -  \___/ @
  17.987 -        @@
  17.988 -211  LATIN CAPITAL LETTER O WITH ACUTE
  17.989 -    __  @
  17.990 -   /_/  @
  17.991 -  / _ \ @
  17.992 - | |_| |@
  17.993 -  \___/ @
  17.994 -        @@
  17.995 -212  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  17.996 -   //\  @
  17.997 -  |/_\| @
  17.998 -  / _ \ @
  17.999 - | |_| |@
 17.1000 -  \___/ @
 17.1001 -        @@
 17.1002 -213  LATIN CAPITAL LETTER O WITH TILDE
 17.1003 -   /\/| @
 17.1004 -  |/\/  @
 17.1005 -  / _ \ @
 17.1006 - | |_| |@
 17.1007 -  \___/ @
 17.1008 -        @@
 17.1009 -214  LATIN CAPITAL LETTER O WITH DIAERESIS
 17.1010 -  _   _ @
 17.1011 - (_)_(_)@
 17.1012 -  / _ \ @
 17.1013 - | |_| |@
 17.1014 -  \___/ @
 17.1015 -        @@
 17.1016 -215  MULTIPLICATION SIGN
 17.1017 -     @
 17.1018 -     @
 17.1019 - /\/\@
 17.1020 - >  <@
 17.1021 - \/\/@
 17.1022 -     @@
 17.1023 -216  LATIN CAPITAL LETTER O WITH STROKE
 17.1024 -   ____ @
 17.1025 -  / _// @
 17.1026 - | |// |@
 17.1027 - | //| |@
 17.1028 -  //__/ @
 17.1029 -        @@
 17.1030 -217  LATIN CAPITAL LETTER U WITH GRAVE
 17.1031 -   __   @
 17.1032 -  _\_\_ @
 17.1033 - | | | |@
 17.1034 - | |_| |@
 17.1035 -  \___/ @
 17.1036 -        @@
 17.1037 -218  LATIN CAPITAL LETTER U WITH ACUTE
 17.1038 -    __  @
 17.1039 -  _/_/_ @
 17.1040 - | | | |@
 17.1041 - | |_| |@
 17.1042 -  \___/ @
 17.1043 -        @@
 17.1044 -219  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
 17.1045 -   //\  @
 17.1046 -  |/ \| @
 17.1047 - | | | |@
 17.1048 - | |_| |@
 17.1049 -  \___/ @
 17.1050 -        @@
 17.1051 -220  LATIN CAPITAL LETTER U WITH DIAERESIS
 17.1052 -  _   _ @
 17.1053 - (_) (_)@
 17.1054 - | | | |@
 17.1055 - | |_| |@
 17.1056 -  \___/ @
 17.1057 -        @@
 17.1058 -221  LATIN CAPITAL LETTER Y WITH ACUTE
 17.1059 -    __  @
 17.1060 - __/_/__@
 17.1061 - \ \ / /@
 17.1062 -  \ V / @
 17.1063 -   |_|  @
 17.1064 -        @@
 17.1065 -222  LATIN CAPITAL LETTER THORN
 17.1066 -  _     @
 17.1067 - | |___ @
 17.1068 - |  __ \@
 17.1069 - |  ___/@
 17.1070 - |_|    @
 17.1071 -        @@
 17.1072 -223  LATIN SMALL LETTER SHARP S
 17.1073 -   ___ @
 17.1074 -  / _ \@
 17.1075 - | |/ /@
 17.1076 - | |\ \@
 17.1077 - | ||_/@
 17.1078 - |_|   @@
 17.1079 -224  LATIN SMALL LETTER A WITH GRAVE
 17.1080 -   __   @
 17.1081 -   \_\_ @
 17.1082 -  / _` |@
 17.1083 - | (_| |@
 17.1084 -  \__,_|@
 17.1085 -        @@
 17.1086 -225  LATIN SMALL LETTER A WITH ACUTE
 17.1087 -    __  @
 17.1088 -   /_/_ @
 17.1089 -  / _` |@
 17.1090 - | (_| |@
 17.1091 -  \__,_|@
 17.1092 -        @@
 17.1093 -226  LATIN SMALL LETTER A WITH CIRCUMFLEX
 17.1094 -   //\  @
 17.1095 -  |/_\| @
 17.1096 -  / _` |@
 17.1097 - | (_| |@
 17.1098 -  \__,_|@
 17.1099 -        @@
 17.1100 -227  LATIN SMALL LETTER A WITH TILDE
 17.1101 -   /\/| @
 17.1102 -  |/\/_ @
 17.1103 -  / _` |@
 17.1104 - | (_| |@
 17.1105 -  \__,_|@
 17.1106 -        @@
 17.1107 -228  LATIN SMALL LETTER A WITH DIAERESIS
 17.1108 -  _   _ @
 17.1109 - (_)_(_)@
 17.1110 -  / _` |@
 17.1111 - | (_| |@
 17.1112 -  \__,_|@
 17.1113 -        @@
 17.1114 -229  LATIN SMALL LETTER A WITH RING ABOVE
 17.1115 -    __  @
 17.1116 -   (()) @
 17.1117 -  / _ '|@
 17.1118 - | (_| |@
 17.1119 -  \__,_|@
 17.1120 -        @@
 17.1121 -230  LATIN SMALL LETTER AE
 17.1122 -           @
 17.1123 -   __ ____ @
 17.1124 -  / _`  _ \@
 17.1125 - | (_|  __/@
 17.1126 -  \__,____|@
 17.1127 -           @@
 17.1128 -231  LATIN SMALL LETTER C WITH CEDILLA
 17.1129 -       @
 17.1130 -   ___ @
 17.1131 -  / __|@
 17.1132 - | (__ @
 17.1133 -  \___|@
 17.1134 -   )_) @@
 17.1135 -232  LATIN SMALL LETTER E WITH GRAVE
 17.1136 -   __  @
 17.1137 -   \_\ @
 17.1138 -  / _ \@
 17.1139 - |  __/@
 17.1140 -  \___|@
 17.1141 -       @@
 17.1142 -233  LATIN SMALL LETTER E WITH ACUTE
 17.1143 -    __ @
 17.1144 -   /_/ @
 17.1145 -  / _ \@
 17.1146 - |  __/@
 17.1147 -  \___|@
 17.1148 -       @@
 17.1149 -234  LATIN SMALL LETTER E WITH CIRCUMFLEX
 17.1150 -   //\ @
 17.1151 -  |/_\|@
 17.1152 -  / _ \@
 17.1153 - |  __/@
 17.1154 -  \___|@
 17.1155 -       @@
 17.1156 -235  LATIN SMALL LETTER E WITH DIAERESIS
 17.1157 -  _   _ @
 17.1158 - (_)_(_)@
 17.1159 -  / _ \ @
 17.1160 - |  __/ @
 17.1161 -  \___| @
 17.1162 -        @@
 17.1163 -236  LATIN SMALL LETTER I WITH GRAVE
 17.1164 - __ @
 17.1165 - \_\@
 17.1166 - | |@
 17.1167 - | |@
 17.1168 - |_|@
 17.1169 -    @@
 17.1170 -237  LATIN SMALL LETTER I WITH ACUTE
 17.1171 -  __@
 17.1172 - /_/@
 17.1173 - | |@
 17.1174 - | |@
 17.1175 - |_|@
 17.1176 -    @@
 17.1177 -238  LATIN SMALL LETTER I WITH CIRCUMFLEX
 17.1178 -  //\ @
 17.1179 - |/_\|@
 17.1180 -  | | @
 17.1181 -  | | @
 17.1182 -  |_| @
 17.1183 -      @@
 17.1184 -239  LATIN SMALL LETTER I WITH DIAERESIS
 17.1185 -  _   _ @
 17.1186 - (_)_(_)@
 17.1187 -   | |  @
 17.1188 -   | |  @
 17.1189 -   |_|  @
 17.1190 -        @@
 17.1191 -240  LATIN SMALL LETTER ETH
 17.1192 -   /\/\ @
 17.1193 -   >  < @
 17.1194 -  _\/\ |@
 17.1195 - / __` |@
 17.1196 - \____/ @
 17.1197 -        @@
 17.1198 -241  LATIN SMALL LETTER N WITH TILDE
 17.1199 -   /\/| @
 17.1200 -  |/\/  @
 17.1201 - | '_ \ @
 17.1202 - | | | |@
 17.1203 - |_| |_|@
 17.1204 -        @@
 17.1205 -242  LATIN SMALL LETTER O WITH GRAVE
 17.1206 -   __   @
 17.1207 -   \_\  @
 17.1208 -  / _ \ @
 17.1209 - | (_) |@
 17.1210 -  \___/ @
 17.1211 -        @@
 17.1212 -243  LATIN SMALL LETTER O WITH ACUTE
 17.1213 -    __  @
 17.1214 -   /_/  @
 17.1215 -  / _ \ @
 17.1216 - | (_) |@
 17.1217 -  \___/ @
 17.1218 -        @@
 17.1219 -244  LATIN SMALL LETTER O WITH CIRCUMFLEX
 17.1220 -   //\  @
 17.1221 -  |/_\| @
 17.1222 -  / _ \ @
 17.1223 - | (_) |@
 17.1224 -  \___/ @
 17.1225 -        @@
 17.1226 -245  LATIN SMALL LETTER O WITH TILDE
 17.1227 -   /\/| @
 17.1228 -  |/\/  @
 17.1229 -  / _ \ @
 17.1230 - | (_) |@
 17.1231 -  \___/ @
 17.1232 -        @@
 17.1233 -246  LATIN SMALL LETTER O WITH DIAERESIS
 17.1234 -  _   _ @
 17.1235 - (_)_(_)@
 17.1236 -  / _ \ @
 17.1237 - | (_) |@
 17.1238 -  \___/ @
 17.1239 -        @@
 17.1240 -247  DIVISION SIGN
 17.1241 -        @
 17.1242 -    _   @
 17.1243 -  _(_)_ @
 17.1244 - |_____|@
 17.1245 -   (_)  @
 17.1246 -        @@
 17.1247 -248  LATIN SMALL LETTER O WITH STROKE
 17.1248 -         @
 17.1249 -   ____  @
 17.1250 -  / _//\ @
 17.1251 - | (//) |@
 17.1252 -  \//__/ @
 17.1253 -         @@
 17.1254 -249  LATIN SMALL LETTER U WITH GRAVE
 17.1255 -   __   @
 17.1256 -  _\_\_ @
 17.1257 - | | | |@
 17.1258 - | |_| |@
 17.1259 -  \__,_|@
 17.1260 -        @@
 17.1261 -250  LATIN SMALL LETTER U WITH ACUTE
 17.1262 -    __  @
 17.1263 -  _/_/_ @
 17.1264 - | | | |@
 17.1265 - | |_| |@
 17.1266 -  \__,_|@
 17.1267 -        @@
 17.1268 -251  LATIN SMALL LETTER U WITH CIRCUMFLEX
 17.1269 -   //\  @
 17.1270 -  |/ \| @
 17.1271 - | | | |@
 17.1272 - | |_| |@
 17.1273 -  \__,_|@
 17.1274 -        @@
 17.1275 -252  LATIN SMALL LETTER U WITH DIAERESIS
 17.1276 -  _   _ @
 17.1277 - (_) (_)@
 17.1278 - | | | |@
 17.1279 - | |_| |@
 17.1280 -  \__,_|@
 17.1281 -        @@
 17.1282 -253  LATIN SMALL LETTER Y WITH ACUTE
 17.1283 -    __  @
 17.1284 -  _/_/_ @
 17.1285 - | | | |@
 17.1286 - | |_| |@
 17.1287 -  \__, |@
 17.1288 -  |___/ @@
 17.1289 -254  LATIN SMALL LETTER THORN
 17.1290 -  _     @
 17.1291 - | |__  @
 17.1292 - | '_ \ @
 17.1293 - | |_) |@
 17.1294 - | .__/ @
 17.1295 - |_|    @@
 17.1296 -255  LATIN SMALL LETTER Y WITH DIAERESIS
 17.1297 -  _   _ @
 17.1298 - (_) (_)@
 17.1299 - | | | |@
 17.1300 - | |_| |@
 17.1301 -  \__, |@
 17.1302 -  |___/ @@
 17.1303 -0x0100  LATIN CAPITAL LETTER A WITH MACRON
 17.1304 -   ____ @
 17.1305 -  /___/ @
 17.1306 -   /_\  @
 17.1307 -  / _ \ @
 17.1308 - /_/ \_\@
 17.1309 -        @@
 17.1310 -0x0101  LATIN SMALL LETTER A WITH MACRON
 17.1311 -    ___ @
 17.1312 -   /_ _/@
 17.1313 -  / _` |@
 17.1314 - | (_| |@
 17.1315 -  \__,_|@
 17.1316 -        @@
 17.1317 -0x0102  LATIN CAPITAL LETTER A WITH BREVE
 17.1318 -  _   _ @
 17.1319 -  \\_// @
 17.1320 -   /_\  @
 17.1321 -  / _ \ @
 17.1322 - /_/ \_\@
 17.1323 -        @@
 17.1324 -0x0103  LATIN SMALL LETTER A WITH BREVE
 17.1325 -   \_/  @
 17.1326 -   ___  @
 17.1327 -  / _` |@
 17.1328 - | (_| |@
 17.1329 -  \__,_|@
 17.1330 -        @@
 17.1331 -0x0104  LATIN CAPITAL LETTER A WITH OGONEK
 17.1332 -        @
 17.1333 -    _   @
 17.1334 -   /_\  @
 17.1335 -  / _ \ @
 17.1336 - /_/ \_\@
 17.1337 -     (_(@@
 17.1338 -0x0105  LATIN SMALL LETTER A WITH OGONEK
 17.1339 -        @
 17.1340 -   __ _ @
 17.1341 -  / _` |@
 17.1342 - | (_| |@
 17.1343 -  \__,_|@
 17.1344 -     (_(@@
 17.1345 -0x0106  LATIN CAPITAL LETTER C WITH ACUTE
 17.1346 -     __ @
 17.1347 -   _/_/ @
 17.1348 -  / ___|@
 17.1349 - | |___ @
 17.1350 -  \____|@
 17.1351 -        @@
 17.1352 -0x0107  LATIN SMALL LETTER C WITH ACUTE
 17.1353 -    __ @
 17.1354 -   /__/@
 17.1355 -  / __|@
 17.1356 - | (__ @
 17.1357 -  \___|@
 17.1358 -       @@
 17.1359 -0x0108  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
 17.1360 -     /\ @
 17.1361 -   _//\\@
 17.1362 -  / ___|@
 17.1363 - | |___ @
 17.1364 -  \____|@
 17.1365 -        @@
 17.1366 -0x0109  LATIN SMALL LETTER C WITH CIRCUMFLEX
 17.1367 -    /\ @
 17.1368 -   /_\ @
 17.1369 -  / __|@
 17.1370 - | (__ @
 17.1371 -  \___|@
 17.1372 -       @@
 17.1373 -0x010A  LATIN CAPITAL LETTER C WITH DOT ABOVE
 17.1374 -    []  @
 17.1375 -   ____ @
 17.1376 -  / ___|@
 17.1377 - | |___ @
 17.1378 -  \____|@
 17.1379 -        @@
 17.1380 -0x010B  LATIN SMALL LETTER C WITH DOT ABOVE
 17.1381 -   []  @
 17.1382 -   ___ @
 17.1383 -  / __|@
 17.1384 - | (__ @
 17.1385 -  \___|@
 17.1386 -       @@
 17.1387 -0x010C  LATIN CAPITAL LETTER C WITH CARON
 17.1388 -   \\// @
 17.1389 -   _\/_ @
 17.1390 -  / ___|@
 17.1391 - | |___ @
 17.1392 -  \____|@
 17.1393 -        @@
 17.1394 -0x010D  LATIN SMALL LETTER C WITH CARON
 17.1395 -   \\//@
 17.1396 -   _\/ @
 17.1397 -  / __|@
 17.1398 - | (__ @
 17.1399 -  \___|@
 17.1400 -       @@
 17.1401 -0x010E  LATIN CAPITAL LETTER D WITH CARON
 17.1402 -   \\// @
 17.1403 -  __\/  @
 17.1404 - |  _ \ @
 17.1405 - | |_| |@
 17.1406 - |____/ @
 17.1407 -        @@
 17.1408 -0x010F  LATIN SMALL LETTER D WITH CARON
 17.1409 -  \/  _ @
 17.1410 -   __| |@
 17.1411 -  / _` |@
 17.1412 - | (_| |@
 17.1413 -  \__,_|@
 17.1414 -        @@
 17.1415 -0x0110  LATIN CAPITAL LETTER D WITH STROKE
 17.1416 -   ____   @
 17.1417 -  |_ __ \ @
 17.1418 - /| |/ | |@
 17.1419 - /|_|/_| |@
 17.1420 -  |_____/ @
 17.1421 -          @@
 17.1422 -0x0111  LATIN SMALL LETTER D WITH STROKE
 17.1423 -    ---|@
 17.1424 -   __| |@
 17.1425 -  / _` |@
 17.1426 - | (_| |@
 17.1427 -  \__,_|@
 17.1428 -        @@
 17.1429 -0x0112  LATIN CAPITAL LETTER E WITH MACRON
 17.1430 -   ____ @
 17.1431 -  /___/ @
 17.1432 - | ____|@
 17.1433 - |  _|_ @
 17.1434 - |_____|@
 17.1435 -        @@
 17.1436 -0x0113  LATIN SMALL LETTER E WITH MACRON
 17.1437 -    ____@
 17.1438 -   /_ _/@
 17.1439 -  / _ \ @
 17.1440 - |  __/ @
 17.1441 -  \___| @
 17.1442 -        @@
 17.1443 -0x0114  LATIN CAPITAL LETTER E WITH BREVE
 17.1444 -  _   _ @
 17.1445 -  \\_// @
 17.1446 - | ____|@
 17.1447 - |  _|_ @
 17.1448 - |_____|@
 17.1449 -        @@
 17.1450 -0x0115  LATIN SMALL LETTER E WITH BREVE
 17.1451 -  \\  //@
 17.1452 -    --  @
 17.1453 -  / _ \ @
 17.1454 - |  __/ @
 17.1455 -  \___| @
 17.1456 -        @@
 17.1457 -0x0116  LATIN CAPITAL LETTER E WITH DOT ABOVE
 17.1458 -    []  @
 17.1459 -  _____ @
 17.1460 - | ____|@
 17.1461 - |  _|_ @
 17.1462 - |_____|@
 17.1463 -        @@
 17.1464 -0x0117  LATIN SMALL LETTER E WITH DOT ABOVE
 17.1465 -    [] @
 17.1466 -    __ @
 17.1467 -  / _ \@
 17.1468 - |  __/@
 17.1469 -  \___|@
 17.1470 -       @@
 17.1471 -0x0118  LATIN CAPITAL LETTER E WITH OGONEK
 17.1472 -        @
 17.1473 -  _____ @
 17.1474 - | ____|@
 17.1475 - |  _|_ @
 17.1476 - |_____|@
 17.1477 -    (__(@@
 17.1478 -0x0119  LATIN SMALL LETTER E WITH OGONEK
 17.1479 -       @
 17.1480 -   ___ @
 17.1481 -  / _ \@
 17.1482 - |  __/@
 17.1483 -  \___|@
 17.1484 -    (_(@@
 17.1485 -0x011A  LATIN CAPITAL LETTER E WITH CARON
 17.1486 -   \\// @
 17.1487 -  __\/_ @
 17.1488 - | ____|@
 17.1489 - |  _|_ @
 17.1490 - |_____|@
 17.1491 -        @@
 17.1492 -0x011B  LATIN SMALL LETTER E WITH CARON
 17.1493 -   \\//@
 17.1494 -    \/ @
 17.1495 -  / _ \@
 17.1496 - |  __/@
 17.1497 -  \___|@
 17.1498 -       @@
 17.1499 -0x011C  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
 17.1500 -   _/\_ @
 17.1501 -  / ___|@
 17.1502 - | |  _ @
 17.1503 - | |_| |@
 17.1504 -  \____|@
 17.1505 -        @@
 17.1506 -0x011D  LATIN SMALL LETTER G WITH CIRCUMFLEX
 17.1507 -     /\ @
 17.1508 -   _/_ \@
 17.1509 -  / _` |@
 17.1510 - | (_| |@
 17.1511 -  \__, |@
 17.1512 -  |___/ @@
 17.1513 -0x011E  LATIN CAPITAL LETTER G WITH BREVE
 17.1514 -   _\/_ @
 17.1515 -  / ___|@
 17.1516 - | |  _ @
 17.1517 - | |_| |@
 17.1518 -  \____|@
 17.1519 -        @@
 17.1520 -0x011F  LATIN SMALL LETTER G WITH BREVE
 17.1521 -  \___/ @
 17.1522 -   __ _ @
 17.1523 -  / _` |@
 17.1524 - | (_| |@
 17.1525 -  \__, |@
 17.1526 -  |___/ @@
 17.1527 -0x0120  LATIN CAPITAL LETTER G WITH DOT ABOVE
 17.1528 -   _[]_ @
 17.1529 -  / ___|@
 17.1530 - | |  _ @
 17.1531 - | |_| |@
 17.1532 -  \____|@
 17.1533 -        @@
 17.1534 -0x0121  LATIN SMALL LETTER G WITH DOT ABOVE
 17.1535 -   []   @
 17.1536 -   __ _ @
 17.1537 -  / _` |@
 17.1538 - | (_| |@
 17.1539 -  \__, |@
 17.1540 -  |___/ @@
 17.1541 -0x0122  LATIN CAPITAL LETTER G WITH CEDILLA
 17.1542 -   ____ @
 17.1543 -  / ___|@
 17.1544 - | |  _ @
 17.1545 - | |_| |@
 17.1546 -  \____|@
 17.1547 -   )__) @@
 17.1548 -0x0123  LATIN SMALL LETTER G WITH CEDILLA
 17.1549 -        @
 17.1550 -   __ _ @
 17.1551 -  / _` |@
 17.1552 - | (_| |@
 17.1553 -  \__, |@
 17.1554 -  |_))))@@
 17.1555 -0x0124  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
 17.1556 -  _/ \_ @
 17.1557 - | / \ |@
 17.1558 - | |_| |@
 17.1559 - |  _  |@
 17.1560 - |_| |_|@
 17.1561 -        @@
 17.1562 -0x0125  LATIN SMALL LETTER H WITH CIRCUMFLEX
 17.1563 -  _  /\ @
 17.1564 - | |//\ @
 17.1565 - | '_ \ @
 17.1566 - | | | |@
 17.1567 - |_| |_|@
 17.1568 -        @@
 17.1569 -0x0126  LATIN CAPITAL LETTER H WITH STROKE
 17.1570 -  _   _ @
 17.1571 - | |=| |@
 17.1572 - | |_| |@
 17.1573 - |  _  |@
 17.1574 - |_| |_|@
 17.1575 -        @@
 17.1576 -0x0127  LATIN SMALL LETTER H WITH STROKE
 17.1577 -  _     @
 17.1578 - |=|__  @
 17.1579 - | '_ \ @
 17.1580 - | | | |@
 17.1581 - |_| |_|@
 17.1582 -        @@
 17.1583 -0x0128  LATIN CAPITAL LETTER I WITH TILDE
 17.1584 -  /\//@
 17.1585 - |_ _|@
 17.1586 -  | | @
 17.1587 -  | | @
 17.1588 - |___|@
 17.1589 -      @@
 17.1590 -0x0129  LATIN SMALL LETTER I WITH TILDE
 17.1591 -    @
 17.1592 - /\/@
 17.1593 - | |@
 17.1594 - | |@
 17.1595 - |_|@
 17.1596 -    @@
 17.1597 -0x012A  LATIN CAPITAL LETTER I WITH MACRON
 17.1598 - /___/@
 17.1599 - |_ _|@
 17.1600 -  | | @
 17.1601 -  | | @
 17.1602 - |___|@
 17.1603 -      @@
 17.1604 -0x012B  LATIN SMALL LETTER I WITH MACRON
 17.1605 -  ____@
 17.1606 - /___/@
 17.1607 -  | | @
 17.1608 -  | | @
 17.1609 -  |_| @
 17.1610 -      @@
 17.1611 -0x012C  LATIN CAPITAL LETTER I WITH BREVE
 17.1612 -  \__/@
 17.1613 - |_ _|@
 17.1614 -  | | @
 17.1615 -  | | @
 17.1616 - |___|@
 17.1617 -      @@
 17.1618 -0x012D  LATIN SMALL LETTER I WITH BREVE
 17.1619 -    @
 17.1620 - \_/@
 17.1621 - | |@
 17.1622 - | |@
 17.1623 - |_|@
 17.1624 -    @@
 17.1625 -0x012E  LATIN CAPITAL LETTER I WITH OGONEK
 17.1626 -  ___ @
 17.1627 - |_ _|@
 17.1628 -  | | @
 17.1629 -  | | @
 17.1630 - |___|@
 17.1631 -  (__(@@
 17.1632 -0x012F  LATIN SMALL LETTER I WITH OGONEK
 17.1633 -  _  @
 17.1634 - (_) @
 17.1635 - | | @
 17.1636 - | | @
 17.1637 - |_|_@
 17.1638 -  (_(@@
 17.1639 -0x0130  LATIN CAPITAL LETTER I WITH DOT ABOVE
 17.1640 -  _[] @
 17.1641 - |_ _|@
 17.1642 -  | | @
 17.1643 -  | | @
 17.1644 - |___|@
 17.1645 -      @@
 17.1646 -0x0131  LATIN SMALL LETTER DOTLESS I
 17.1647 -    @
 17.1648 -  _ @
 17.1649 - | |@
 17.1650 - | |@
 17.1651 - |_|@
 17.1652 -    @@
 17.1653 -0x0132  LATIN CAPITAL LIGATURE IJ
 17.1654 -  ___  _ @
 17.1655 - |_ _|| |@
 17.1656 -  | | | |@
 17.1657 -  | |_| |@
 17.1658 - |__|__/ @
 17.1659 -         @@
 17.1660 -0x0133  LATIN SMALL LIGATURE IJ
 17.1661 -  _   _ @
 17.1662 - (_) (_)@
 17.1663 - | | | |@
 17.1664 - | | | |@
 17.1665 - |_|_/ |@
 17.1666 -   |__/ @@
 17.1667 -0x0134  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
 17.1668 -      /\ @
 17.1669 -     /_\|@
 17.1670 -  _  | | @
 17.1671 - | |_| | @
 17.1672 -  \___/  @
 17.1673 -         @@
 17.1674 -0x0135  LATIN SMALL LETTER J WITH CIRCUMFLEX
 17.1675 -    /\@
 17.1676 -   /_\@
 17.1677 -   | |@
 17.1678 -   | |@
 17.1679 -  _/ |@
 17.1680 - |__/ @@
 17.1681 -0x0136  LATIN CAPITAL LETTER K WITH CEDILLA
 17.1682 -  _  _  @
 17.1683 - | |/ / @
 17.1684 - | ' /  @
 17.1685 - | . \  @
 17.1686 - |_|\_\ @
 17.1687 -    )__)@@
 17.1688 -0x0137  LATIN SMALL LETTER K WITH CEDILLA
 17.1689 -  _    @
 17.1690 - | | __@
 17.1691 - | |/ /@
 17.1692 - |   < @
 17.1693 - |_|\_\@
 17.1694 -    )_)@@
 17.1695 -0x0138  LATIN SMALL LETTER KRA
 17.1696 -       @
 17.1697 -  _ __ @
 17.1698 - | |/ \@
 17.1699 - |   < @
 17.1700 - |_|\_\@
 17.1701 -       @@
 17.1702 -0x0139  LATIN CAPITAL LETTER L WITH ACUTE
 17.1703 -  _   //@
 17.1704 - | | // @
 17.1705 - | |    @
 17.1706 - | |___ @
 17.1707 - |_____|@
 17.1708 -        @@
 17.1709 -0x013A  LATIN SMALL LETTER L WITH ACUTE
 17.1710 -  //@
 17.1711 - | |@
 17.1712 - | |@
 17.1713 - | |@
 17.1714 - |_|@
 17.1715 -    @@
 17.1716 -0x013B  LATIN CAPITAL LETTER L WITH CEDILLA
 17.1717 -  _     @
 17.1718 - | |    @
 17.1719 - | |    @
 17.1720 - | |___ @
 17.1721 - |_____|@
 17.1722 -    )__)@@
 17.1723 -0x013C  LATIN SMALL LETTER L WITH CEDILLA
 17.1724 -  _   @
 17.1725 - | |  @
 17.1726 - | |  @
 17.1727 - | |  @
 17.1728 - |_|  @
 17.1729 -   )_)@@
 17.1730 -0x013D  LATIN CAPITAL LETTER L WITH CARON
 17.1731 -  _ \\//@
 17.1732 - | | \/ @
 17.1733 - | |    @
 17.1734 - | |___ @
 17.1735 - |_____|@
 17.1736 -        @@
 17.1737 -0x013E  LATIN SMALL LETTER L WITH CARON
 17.1738 -  _ \\//@
 17.1739 - | | \/ @
 17.1740 - | |    @
 17.1741 - | |    @
 17.1742 - |_|    @
 17.1743 -        @@
 17.1744 -0x013F  LATIN CAPITAL LETTER L WITH MIDDLE DOT
 17.1745 -  _     @
 17.1746 - | |    @
 17.1747 - | | [] @
 17.1748 - | |___ @
 17.1749 - |_____|@
 17.1750 -        @@
 17.1751 -0x0140  LATIN SMALL LETTER L WITH MIDDLE DOT
 17.1752 -  _    @
 17.1753 - | |   @
 17.1754 - | | []@
 17.1755 - | |   @
 17.1756 - |_|   @
 17.1757 -       @@
 17.1758 -0x0141  LATIN CAPITAL LETTER L WITH STROKE
 17.1759 -  __    @
 17.1760 - | //   @
 17.1761 - |//|   @
 17.1762 - // |__ @
 17.1763 - |_____|@
 17.1764 -        @@
 17.1765 -0x0142  LATIN SMALL LETTER L WITH STROKE
 17.1766 -  _ @
 17.1767 - | |@
 17.1768 - |//@
 17.1769 - //|@
 17.1770 - |_|@
 17.1771 -    @@
 17.1772 -0x0143  LATIN CAPITAL LETTER N WITH ACUTE
 17.1773 -  _/ /_ @
 17.1774 - | \ | |@
 17.1775 - |  \| |@
 17.1776 - | |\  |@
 17.1777 - |_| \_|@
 17.1778 -        @@
 17.1779 -0x0144  LATIN SMALL LETTER N WITH ACUTE
 17.1780 -     _  @
 17.1781 -  _ /_/ @
 17.1782 - | '_ \ @
 17.1783 - | | | |@
 17.1784 - |_| |_|@
 17.1785 -        @@
 17.1786 -0x0145  LATIN CAPITAL LETTER N WITH CEDILLA
 17.1787 -  _   _ @
 17.1788 - | \ | |@
 17.1789 - |  \| |@
 17.1790 - | |\  |@
 17.1791 - |_| \_|@
 17.1792 - )_)    @@
 17.1793 -0x0146  LATIN SMALL LETTER N WITH CEDILLA
 17.1794 -        @
 17.1795 -  _ __  @
 17.1796 - | '_ \ @
 17.1797 - | | | |@
 17.1798 - |_| |_|@
 17.1799 - )_)    @@
 17.1800 -0x0147  LATIN CAPITAL LETTER N WITH CARON
 17.1801 -  _\/ _ @
 17.1802 - | \ | |@
 17.1803 - |  \| |@
 17.1804 - | |\  |@
 17.1805 - |_| \_|@
 17.1806 -        @@
 17.1807 -0x0148  LATIN SMALL LETTER N WITH CARON
 17.1808 -  \\//  @
 17.1809 -  _\/_  @
 17.1810 - | '_ \ @
 17.1811 - | | | |@
 17.1812 - |_| |_|@
 17.1813 -        @@
 17.1814 -0x0149  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 17.1815 -          @
 17.1816 -  _  __   @
 17.1817 - ( )| '_\ @
 17.1818 - |/| | | |@
 17.1819 -   |_| |_|@
 17.1820 -          @@
 17.1821 -0x014A  LATIN CAPITAL LETTER ENG
 17.1822 -  _   _ @
 17.1823 - | \ | |@
 17.1824 - |  \| |@
 17.1825 - | |\  |@
 17.1826 - |_| \ |@
 17.1827 -     )_)@@
 17.1828 -0x014B  LATIN SMALL LETTER ENG
 17.1829 -  _ __  @
 17.1830 - | '_ \ @
 17.1831 - | | | |@
 17.1832 - |_| | |@
 17.1833 -     | |@
 17.1834 -    |__ @@
 17.1835 -0x014C  LATIN CAPITAL LETTER O WITH MACRON
 17.1836 -   ____ @
 17.1837 -  /_ _/ @
 17.1838 -  / _ \ @
 17.1839 - | (_) |@
 17.1840 -  \___/ @
 17.1841 -        @@
 17.1842 -0x014D  LATIN SMALL LETTER O WITH MACRON
 17.1843 -   ____ @
 17.1844 -  /_ _/ @
 17.1845 -  / _ \ @
 17.1846 - | (_) |@
 17.1847 -  \___/ @
 17.1848 -        @@
 17.1849 -0x014E  LATIN CAPITAL LETTER O WITH BREVE
 17.1850 -  \   / @
 17.1851 -   _-_  @
 17.1852 -  / _ \ @
 17.1853 - | |_| |@
 17.1854 -  \___/ @
 17.1855 -        @@
 17.1856 -0x014F  LATIN SMALL LETTER O WITH BREVE
 17.1857 -  \   / @
 17.1858 -   _-_  @
 17.1859 -  / _ \ @
 17.1860 - | |_| |@
 17.1861 -  \___/ @
 17.1862 -        @@
 17.1863 -0x0150  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
 17.1864 -    ___ @
 17.1865 -   /_/_/@
 17.1866 -  / _ \ @
 17.1867 - | |_| |@
 17.1868 -  \___/ @
 17.1869 -        @@
 17.1870 -0x0151  LATIN SMALL LETTER O WITH DOUBLE ACUTE
 17.1871 -    ___ @
 17.1872 -   /_/_/@
 17.1873 -  / _ \ @
 17.1874 - | |_| |@
 17.1875 -  \___/ @
 17.1876 -        @@
 17.1877 -0x0152  LATIN CAPITAL LIGATURE OE
 17.1878 -   ___  ___ @
 17.1879 -  / _ \| __|@
 17.1880 - | | | |  | @
 17.1881 - | |_| | |__@
 17.1882 -  \___/|____@
 17.1883 -            @@
 17.1884 -0x0153  LATIN SMALL LIGATURE OE
 17.1885 -             @
 17.1886 -   ___   ___ @
 17.1887 -  / _ \ / _ \@
 17.1888 - | (_) |  __/@
 17.1889 -  \___/ \___|@
 17.1890 -             @@
 17.1891 -0x0154  LATIN CAPITAL LETTER R WITH ACUTE
 17.1892 -  _/_/  @
 17.1893 - |  _ \ @
 17.1894 - | |_) |@
 17.1895 - |  _ < @
 17.1896 - |_| \_\@
 17.1897 -        @@
 17.1898 -0x0155  LATIN SMALL LETTER R WITH ACUTE
 17.1899 -     __@
 17.1900 -  _ /_/@
 17.1901 - | '__|@
 17.1902 - | |   @
 17.1903 - |_|   @
 17.1904 -       @@
 17.1905 -0x0156  LATIN CAPITAL LETTER R WITH CEDILLA
 17.1906 -  ____  @
 17.1907 - |  _ \ @
 17.1908 - | |_) |@
 17.1909 - |  _ < @
 17.1910 - |_| \_\@
 17.1911 - )_)    @@
 17.1912 -0x0157  LATIN SMALL LETTER R WITH CEDILLA
 17.1913 -       @
 17.1914 -  _ __ @
 17.1915 - | '__|@
 17.1916 - | |   @
 17.1917 - |_|   @
 17.1918 -   )_) @@
 17.1919 -0x0158  LATIN CAPITAL LETTER R WITH CARON
 17.1920 -  _\_/  @
 17.1921 - |  _ \ @
 17.1922 - | |_) |@
 17.1923 - |  _ < @
 17.1924 - |_| \_\@
 17.1925 -        @@
 17.1926 -0x0159  LATIN SMALL LETTER R WITH CARON
 17.1927 -  \\// @
 17.1928 -  _\/_ @
 17.1929 - | '__|@
 17.1930 - | |   @
 17.1931 - |_|   @
 17.1932 -       @@
 17.1933 -0x015A  LATIN CAPITAL LETTER S WITH ACUTE
 17.1934 -  _/_/  @
 17.1935 - / ___| @
 17.1936 - \___ \ @
 17.1937 -  ___) |@
 17.1938 - |____/ @
 17.1939 -        @@
 17.1940 -0x015B  LATIN SMALL LETTER S WITH ACUTE
 17.1941 -    __@
 17.1942 -  _/_/@
 17.1943 - / __|@
 17.1944 - \__ \@
 17.1945 - |___/@
 17.1946 -      @@
 17.1947 -0x015C  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
 17.1948 -  _/\_  @
 17.1949 - / ___| @
 17.1950 - \___ \ @
 17.1951 -  ___) |@
 17.1952 - |____/ @
 17.1953 -        @@
 17.1954 -0x015D  LATIN SMALL LETTER S WITH CIRCUMFLEX
 17.1955 -      @
 17.1956 -  /_\_@
 17.1957 - / __|@
 17.1958 - \__ \@
 17.1959 - |___/@
 17.1960 -      @@
 17.1961 -0x015E  LATIN CAPITAL LETTER S WITH CEDILLA
 17.1962 -  ____  @
 17.1963 - / ___| @
 17.1964 - \___ \ @
 17.1965 -  ___) |@
 17.1966 - |____/ @
 17.1967 -    )__)@@
 17.1968 -0x015F  LATIN SMALL LETTER S WITH CEDILLA
 17.1969 -      @
 17.1970 -  ___ @
 17.1971 - / __|@
 17.1972 - \__ \@
 17.1973 - |___/@
 17.1974 -   )_)@@
 17.1975 -0x0160  LATIN CAPITAL LETTER S WITH CARON
 17.1976 -  _\_/  @
 17.1977 - / ___| @
 17.1978 - \___ \ @
 17.1979 -  ___) |@
 17.1980 - |____/ @
 17.1981 -        @@
 17.1982 -0x0161  LATIN SMALL LETTER S WITH CARON
 17.1983 -  \\//@
 17.1984 -  _\/ @
 17.1985 - / __|@
 17.1986 - \__ \@
 17.1987 - |___/@
 17.1988 -      @@
 17.1989 -0x0162  LATIN CAPITAL LETTER T WITH CEDILLA
 17.1990 -  _____ @
 17.1991 - |_   _|@
 17.1992 -   | |  @
 17.1993 -   | |  @
 17.1994 -   |_|  @
 17.1995 -    )__)@@
 17.1996 -0x0163  LATIN SMALL LETTER T WITH CEDILLA
 17.1997 -  _   @
 17.1998 - | |_ @
 17.1999 - | __|@
 17.2000 - | |_ @
 17.2001 -  \__|@
 17.2002 -   )_)@@
 17.2003 -0x0164  LATIN CAPITAL LETTER T WITH CARON
 17.2004 -  _____ @
 17.2005 - |_   _|@
 17.2006 -   | |  @
 17.2007 -   | |  @
 17.2008 -   |_|  @
 17.2009 -        @@
 17.2010 -0x0165  LATIN SMALL LETTER T WITH CARON
 17.2011 -  \/  @
 17.2012 - | |_ @
 17.2013 - | __|@
 17.2014 - | |_ @
 17.2015 -  \__|@
 17.2016 -      @@
 17.2017 -0x0166  LATIN CAPITAL LETTER T WITH STROKE
 17.2018 -  _____ @
 17.2019 - |_   _|@
 17.2020 -   | |  @
 17.2021 -  -|-|- @
 17.2022 -   |_|  @
 17.2023 -        @@
 17.2024 -0x0167  LATIN SMALL LETTER T WITH STROKE
 17.2025 -  _   @
 17.2026 - | |_ @
 17.2027 - | __|@
 17.2028 - |-|_ @
 17.2029 -  \__|@
 17.2030 -      @@
 17.2031 -0x0168  LATIN CAPITAL LETTER U WITH TILDE
 17.2032 -        @
 17.2033 -  _/\/_ @
 17.2034 - | | | |@
 17.2035 - | |_| |@
 17.2036 -  \___/ @
 17.2037 -        @@
 17.2038 -0x0169  LATIN SMALL LETTER U WITH TILDE
 17.2039 -        @
 17.2040 -  _/\/_ @
 17.2041 - | | | |@
 17.2042 - | |_| |@
 17.2043 -  \__,_|@
 17.2044 -        @@
 17.2045 -0x016A  LATIN CAPITAL LETTER U WITH MACRON
 17.2046 -   ____ @
 17.2047 -  /__ _/@
 17.2048 - | | | |@
 17.2049 - | |_| |@
 17.2050 -  \___/ @
 17.2051 -        @@
 17.2052 -0x016B  LATIN SMALL LETTER U WITH MACRON
 17.2053 -   ____ @
 17.2054 -  / _  /@
 17.2055 - | | | |@
 17.2056 - | |_| |@
 17.2057 -  \__,_|@
 17.2058 -        @@
 17.2059 -0x016C  LATIN CAPITAL LETTER U WITH BREVE
 17.2060 -        @
 17.2061 -   \_/_ @
 17.2062 - | | | |@
 17.2063 - | |_| |@
 17.2064 -  \____|@
 17.2065 -        @@
 17.2066 -0x016D  LATIN SMALL LETTER U WITH BREVE
 17.2067 -        @
 17.2068 -   \_/_ @
 17.2069 - | | | |@
 17.2070 - | |_| |@
 17.2071 -  \__,_|@
 17.2072 -        @@
 17.2073 -0x016E  LATIN CAPITAL LETTER U WITH RING ABOVE
 17.2074 -    O   @
 17.2075 -  __  _ @
 17.2076 - | | | |@
 17.2077 - | |_| |@
 17.2078 -  \___/ @
 17.2079 -        @@
 17.2080 -0x016F  LATIN SMALL LETTER U WITH RING ABOVE
 17.2081 -    O   @
 17.2082 -  __ __ @
 17.2083 - | | | |@
 17.2084 - | |_| |@
 17.2085 -  \__,_|@
 17.2086 -        @@
 17.2087 -0x0170  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
 17.2088 -   -- --@
 17.2089 -  /_//_/@
 17.2090 - | | | |@
 17.2091 - | |_| |@
 17.2092 -  \___/ @
 17.2093 -        @@
 17.2094 -0x0171  LATIN SMALL LETTER U WITH DOUBLE ACUTE
 17.2095 -    ____@
 17.2096 -  _/_/_/@
 17.2097 - | | | |@
 17.2098 - | |_| |@
 17.2099 -  \__,_|@
 17.2100 -        @@
 17.2101 -0x0172  LATIN CAPITAL LETTER U WITH OGONEK
 17.2102 -  _   _ @
 17.2103 - | | | |@
 17.2104 - | | | |@
 17.2105 - | |_| |@
 17.2106 -  \___/ @
 17.2107 -    (__(@@
 17.2108 -0x0173  LATIN SMALL LETTER U WITH OGONEK
 17.2109 -        @
 17.2110 -  _   _ @
 17.2111 - | | | |@
 17.2112 - | |_| |@
 17.2113 -  \__,_|@
 17.2114 -     (_(@@
 17.2115 -0x0174  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
 17.2116 - __    /\  __@
 17.2117 - \ \  //\\/ /@
 17.2118 -  \ \ /\ / / @
 17.2119 -   \ V  V /  @
 17.2120 -    \_/\_/   @
 17.2121 -             @@
 17.2122 -0x0175  LATIN SMALL LETTER W WITH CIRCUMFLEX
 17.2123 -      /\   @
 17.2124 - __  //\\__@
 17.2125 - \ \ /\ / /@
 17.2126 -  \ V  V / @
 17.2127 -   \_/\_/  @
 17.2128 -           @@
 17.2129 -0x0176  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
 17.2130 -    /\  @
 17.2131 - __//\\ @
 17.2132 - \ \ / /@
 17.2133 -  \ V / @
 17.2134 -   |_|  @
 17.2135 -        @@
 17.2136 -0x0177  LATIN SMALL LETTER Y WITH CIRCUMFLEX
 17.2137 -    /\  @
 17.2138 -   //\\ @
 17.2139 - | | | |@
 17.2140 - | |_| |@
 17.2141 -  \__, |@
 17.2142 -  |___/ @@
 17.2143 -0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
 17.2144 -  []  []@
 17.2145 - __    _@
 17.2146 - \ \ / /@
 17.2147 -  \ V / @
 17.2148 -   |_|  @
 17.2149 -        @@
 17.2150 -0x0179  LATIN CAPITAL LETTER Z WITH ACUTE
 17.2151 -  __/_/@
 17.2152 - |__  /@
 17.2153 -   / / @
 17.2154 -  / /_ @
 17.2155 - /____|@
 17.2156 -       @@
 17.2157 -0x017A  LATIN SMALL LETTER Z WITH ACUTE
 17.2158 -    _ @
 17.2159 -  _/_/@
 17.2160 - |_  /@
 17.2161 -  / / @
 17.2162 - /___|@
 17.2163 -      @@
 17.2164 -0x017B  LATIN CAPITAL LETTER Z WITH DOT ABOVE
 17.2165 -  __[]_@
 17.2166 - |__  /@
 17.2167 -   / / @
 17.2168 -  / /_ @
 17.2169 - /____|@
 17.2170 -       @@
 17.2171 -0x017C  LATIN SMALL LETTER Z WITH DOT ABOVE
 17.2172 -   [] @
 17.2173 -  ____@
 17.2174 - |_  /@
 17.2175 -  / / @
 17.2176 - /___|@
 17.2177 -      @@
 17.2178 -0x017D  LATIN CAPITAL LETTER Z WITH CARON
 17.2179 -  _\_/_@
 17.2180 - |__  /@
 17.2181 -   / / @
 17.2182 -  / /_ @
 17.2183 - /____|@
 17.2184 -       @@
 17.2185 -0x017E  LATIN SMALL LETTER Z WITH CARON
 17.2186 -  \\//@
 17.2187 -  _\/_@
 17.2188 - |_  /@
 17.2189 -  / / @
 17.2190 - /___|@
 17.2191 -      @@
 17.2192 -0x017F  LATIN SMALL LETTER LONG S
 17.2193 -     __ @
 17.2194 -    / _|@
 17.2195 - |-| |  @
 17.2196 - |-| |  @
 17.2197 -   |_|  @
 17.2198 -        @@
 17.2199 -0x02C7  CARON
 17.2200 - \\//@
 17.2201 -  \/ @
 17.2202 -    $@
 17.2203 -    $@
 17.2204 -    $@
 17.2205 -    $@@
 17.2206 -0x02D8  BREVE
 17.2207 - \\_//@
 17.2208 -  \_/ @
 17.2209 -     $@
 17.2210 -     $@
 17.2211 -     $@
 17.2212 -     $@@
 17.2213 -0x02D9  DOT ABOVE
 17.2214 - []@
 17.2215 -  $@
 17.2216 -  $@
 17.2217 -  $@
 17.2218 -  $@
 17.2219 -  $@@
 17.2220 -0x02DB  OGONEK
 17.2221 -    $@
 17.2222 -    $@
 17.2223 -    $@
 17.2224 -    $@
 17.2225 -    $@
 17.2226 - )_) @@
 17.2227 -0x02DD  DOUBLE ACUTE ACCENT
 17.2228 -  _ _ @
 17.2229 - /_/_/@
 17.2230 -     $@
 17.2231 -     $@
 17.2232 -     $@
 17.2233 -     $@@