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