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