aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.rootkeys5
-rw-r--r--xen/Makefile39
-rw-r--r--xen/common/kernel.c27
-rw-r--r--xen/include/xeno/version.h4
-rw-r--r--xen/tools/Makefile8
-rw-r--r--xen/tools/figlet/LICENSE111
-rw-r--r--xen/tools/figlet/Makefile7
-rw-r--r--xen/tools/figlet/README9
-rw-r--r--xen/tools/figlet/figlet.c2075
-rw-r--r--xen/tools/figlet/xen.flf2230
10 files changed, 4487 insertions, 28 deletions
diff --git a/.rootkeys b/.rootkeys
index 655b7d0f43..efe0d08fe2 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -365,6 +365,11 @@
3ddb79c4TZj1wXPKQt36O72SddtBNQ xen/net/skbuff.c
3ddb79c4x8dvwPtzclghWAKFWpEBFA xen/tools/Makefile
3ddb79c4yGZ7_22QAFFwPzqP4NSHwA xen/tools/elf-reloc.c
+3eb3c87fc79FXLA6R9TvdBJNTvQDwA xen/tools/figlet/LICENSE
+3eb3c87fPL2T_zBb0bHlbZY-ACEKRw xen/tools/figlet/Makefile
+3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
+3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
+3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-pre4-sparse/Makefile
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-pre4-sparse/arch/xeno/Makefile
3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-pre4-sparse/arch/xeno/boot/Makefile
diff --git a/xen/Makefile b/xen/Makefile
index 1f169bdfe2..d12aaf84d6 100644
--- a/xen/Makefile
+++ b/xen/Makefile
@@ -1,10 +1,16 @@
-export BASEDIR := $(shell pwd)
+# This is the correct place to edit the build version.
+# All other places this is stored (eg. compile.h) should be autogenerated.
+export XEN_VERSION = 1
+export XEN_SUBVERSION = 0
+export XEN_EXTRAVERSION = "-beta"
-GENERATED_FILES := include/xeno/compile.h
+export BASEDIR := $(shell pwd)
include Rules.mk
+GENERATED_FILES := include/xeno/compile.h
+
default: $(TARGET)
gzip -f -9 < $(TARGET) > $(TARGET).gz
@@ -37,28 +43,37 @@ make-links: delete-links
delete-links:
rm -f include/linux include/asm
-# NB. kernel.o is blown away as the build date is stored statically within it
-# Basically it's the only file dependent on compile.h -- we blow that
-# dependency away for all other files in Rules.mk.
+# Blow away kernel.o because build info is stored statically within it.
delete-unfresh-files:
rm -f $(GENERATED_FILES) common/kernel.o
+# compile.h contains dynamic build info. Rebuilt on every 'make' invocation.
include/xeno/compile.h:
- @LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" > $@
+ @LANG=C echo /\* Autogenerated by root Makefile. Do not edit. \*/ > $@
+ @LANG=C echo >> $@
+ @LANG=C echo \#define XEN_COMPILE_DATE \"`date`\" >> $@
@LANG=C echo \#define XEN_COMPILE_TIME \"`date +%T`\" >> $@
@LANG=C echo \#define XEN_COMPILE_BY \"`whoami`\" >> $@
@LANG=C echo \#define XEN_COMPILE_DOMAIN \"`([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown])`\" >> $@
@LANG=C echo \#define XEN_COMPILE_HOST \"`hostname`\" >> $@
@LANG=C echo \#define XEN_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> $@
-
-.PHONY: $(GENERATED_FILES) make-links delete-links default debug install clean delete-unfresh-files
-
-
-SUBDIRS =arch common drivers net
+ @LANG=C echo >> $@
+ @LANG=C echo \#define XEN_VERSION\ \ \ \ \ \ $(XEN_VERSION) >> $@
+ @LANG=C echo \#define XEN_SUBVERSION\ \ \ $(XEN_SUBVERSION) >> $@
+ @LANG=C echo \#define XEN_EXTRAVERSION \"$(XEN_EXTRAVERSION)\" >> $@
+ @LANG=C echo >> $@
+ @LANG=C echo \#define XEN_BANNER \\ >> $@
+ cd tools/figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../../$@ && cd ../..
+ @LANG=C echo >> $@
+
+.PHONY: $(GENERATED_FILES) make-links delete-links default
+.PHONY: debug install clean delete-unfresh-files
+
+SUBDIRS = arch common drivers net
TAGS:
etags `find include/asm-$(ARCH) -name '*.h'`
find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs etags -a
find $(SUBDIRS) -name '*.[ch]' | xargs etags -a
-
MAP:
nm image | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
+
diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index bc10aff2fe..302cd69f53 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -171,12 +171,7 @@ void cmain (unsigned long magic, multiboot_info_t *mbi)
/* INITIALISE SERIAL LINE (printk will work okay from here on). */
init_serial();
- /* Print the intro banner. The ASCII art is ugle since '\\' -> '\'. */
- printk(" __ __ _ ___ _ _ \n");
- printk(" \\ \\/ /___ _ __ / | / _ \\ | |__ ___| |_ __ _ \n");
- printk(" \\ // _ \\ '_ \\ | || | | | | '_ \\ / _ \\ __/ _` |\n");
- printk(" / \\ __/ | | | | || |_| | | |_) | __/ || (_| |\n");
- printk(" /_/\\_\\___|_| |_| |_(_)___/ |_.__/ \\___|\\__\\__,_|\n\n");
+ printk(XEN_BANNER);
printk(" http://www.cl.cam.ac.uk/xeno\n");
printk(" University of Cambridge Computer Laboratory\n\n");
printk(" Xen version %d.%d%s (%s@%s) (%s) %s\n\n",
@@ -390,14 +385,22 @@ static inline void __putstr(const char *str)
void printf (const char *fmt, ...)
{
va_list args;
- char buf[128], *p;
+ char buf[128], *p = fmt;
unsigned long flags;
- va_start(args, fmt);
- (void)vsnprintf(buf, sizeof(buf), fmt, args);
- va_end(args);
-
- p = buf;
+ /*
+ * If the format string contains '%' descriptors then we have to parse it
+ * before printing it. We parse it into a fixed-length buffer. Long
+ * strings should therefore _not_ contain '%' characters!
+ */
+ if ( strchr(fmt, '%') != NULL )
+ {
+ va_start(args, fmt);
+ (void)vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ p = buf;
+ }
+
spin_lock_irqsave(&console_lock, flags);
while ( *p ) putchar(*p++);
spin_unlock_irqrestore(&console_lock, flags);
diff --git a/xen/include/xeno/version.h b/xen/include/xeno/version.h
index 33aa587b25..a0bbfa972f 100644
--- a/xen/include/xeno/version.h
+++ b/xen/include/xeno/version.h
@@ -1,6 +1,2 @@
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#define LINUX_VERSION_CODE KERNEL_VERSION(2,4,21)
-
-#define XEN_VERSION 1
-#define XEN_SUBVERSION 0
-#define XEN_EXTRAVERSION "-beta"
diff --git a/xen/tools/Makefile b/xen/tools/Makefile
index ccf535aa49..a143ffdcbf 100644
--- a/xen/tools/Makefile
+++ b/xen/tools/Makefile
@@ -1,6 +1,14 @@
+all: figlet elf-reloc
+
+figlet:
+ $(MAKE) -C figlet
+
elf-reloc: elf-reloc.c
gcc -O2 -Wall -o $@ $<
clean:
rm -f elf-reloc *~ core
+ $(MAKE) -C figlet clean
+
+.PHONY: figlet
diff --git a/xen/tools/figlet/LICENSE b/xen/tools/figlet/LICENSE
new file mode 100644
index 0000000000..59fd244536
--- /dev/null
+++ b/xen/tools/figlet/LICENSE
@@ -0,0 +1,111 @@
+http://www.sunsite.unc.edu/pub/Linux/LICENSES/artistic.license
+
+ The "Artistic License"
+
+ Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+Definitions:
+
+ "Package" refers to the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection of files
+ created through textual modification.
+
+ "Standard Version" refers to such a Package if it has not been
+ modified, or has been modified in accordance with the wishes
+ of the Copyright Holder.
+
+ "Copyright Holder" is whoever is named in the copyright or
+ copyrights for the package.
+
+ "You" is you, if you're thinking about copying or distributing
+ this Package.
+
+ "Reasonable copying fee" is whatever you can justify on the
+ basis of media cost, duplication charges, time of people involved,
+ and so on. (You will not be required to justify it to the
+ Copyright Holder, but only to the computing community at large
+ as a market that must bear the fee.)
+
+ "Freely Available" means that no fee is charged for the item
+ itself, though there may be fees involved in handling the item.
+ It also means that recipients of the item may redistribute it
+ under the same conditions they received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder. A Package
+modified in such a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+ a) place your modifications in the Public Domain or otherwise make them
+ Freely Available, such as by posting said modifications to Usenet or
+ an equivalent medium, or placing the modifications on a major archive
+ site such as ftp.uu.net, or by allowing the Copyright Holder to include
+ your modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation or organization.
+
+ c) rename any non-standard executables so the names do not conflict
+ with standard executables, which must also be provided, and provide
+ a separate manual page for each non-standard executable that clearly
+ documents how it differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and library files,
+ together with instructions (in the manual page or equivalent) on where
+ to get the Standard Version.
+
+ b) accompany the distribution with the machine-readable source of
+ the Package with your modifications.
+
+ c) accompany any non-standard executables with their corresponding
+ Standard Version executables, giving the non-standard executables
+ non-standard names, and clearly documenting the differences in manual
+ pages (or equivalent), together with instructions on where to get
+ the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this Package.
+You may not charge a fee for this Package itself. However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own.
+
+6. The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whomever generated
+them, and may be sold commercially, and may be aggregated with this
+Package.
+
+7. C or perl subroutines supplied by you and linked into this Package
+shall not be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ The End
diff --git a/xen/tools/figlet/Makefile b/xen/tools/figlet/Makefile
new file mode 100644
index 0000000000..73bba26135
--- /dev/null
+++ b/xen/tools/figlet/Makefile
@@ -0,0 +1,7 @@
+
+CC := gcc
+
+figlet: figlet.c
+
+clean:
+ rm -f *.o figlet
diff --git a/xen/tools/figlet/README b/xen/tools/figlet/README
new file mode 100644
index 0000000000..b4c58b3a5b
--- /dev/null
+++ b/xen/tools/figlet/README
@@ -0,0 +1,9 @@
+
+NB. This is a very hacked version of Figlet 2.2.1.
+
+Don't use this outside the Xen build system. A proper version of Figlet
+can be had from <http://www.figlet.org>.
+
+The distribution license is intact in the LICENSE file.
+
+ -- Keir Fraser (2/5/2003)
diff --git a/xen/tools/figlet/figlet.c b/xen/tools/figlet/figlet.c
new file mode 100644
index 0000000000..36cf7509c0
--- /dev/null
+++ b/xen/tools/figlet/figlet.c
@@ -0,0 +1,2075 @@
+
+/*
+ * XXXXXXXXXXXXXXXXXXXXXXXXXXX
+ *
+ * This is a HACKED figlet source file for Xen.
+ *
+ * Hacked to output C octal strings for inclusion in a header file.
+ * Support for opening zippe files is removed.
+ *
+ * Go to www.figlet.org for teh unhacked Figlet sources!
+ */
+
+/****************************************************************************
+
+ FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
+ FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+ FIGlet Copyright 2002 Christiaan Keet
+ Portions written by Paul Burton and Christiaan Keet
+ Internet: <info@figlet.org>
+ FIGlet, along with the various FIGlet fonts and documentation, is
+ copyrighted under the provisions of the Artistic License (as listed
+ in the file "Artistic-license.txt" which is included in this package.
+****************************************************************************/
+
+#define DATE "13 July 2002"
+#define VERSION "2.2.1"
+#define VERSION_INT 20201
+
+/* FIGlet (Frank, Ian & Glenn's Letters) */
+/* by Glenn Chappell */
+/* Apr 1991 */
+/* Automatic file addition by Ian Chai May 1991 */
+/* Punctuation and numbers addition by Ian Chai Jan 1993 */
+/* Full ASCII by Glenn Chappell Feb 1993 */
+/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
+/* Hard blanks by Glenn Chappell Apr 1993 */
+/* Release 2.0 5 Aug 1993 */
+/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
+/* Control files by Glenn Chappell Feb 1994 */
+/* Release 2.1 12 Aug 1994 */
+/* Release 2.1.1 25 Aug 1994 */
+/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line
+ option. Sept 8, 1996 */
+/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
+ mapping tables, kerning/smushing options. */
+/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
+ FAQs and comments. 13 July 2002. The new official FIGlet website is
+ http://www.figlet.org/ */
+
+#define DEFAULTFONTDIR "."
+#define DEFAULTFONTFILE "xen.flf"
+
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h> /* Needed for get_columns */
+
+#ifdef unix
+#include <sys/ioctl.h> /* Needed for get_columns */
+#endif
+
+
+#define ZFILE FILE
+#define Zopen fopen
+#define Zgetc fgetc
+#define Zungetc(_x,_y) fseek(_y,-1,SEEK_CUR)
+#define Zclose fclose
+
+#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
+
+#define DIRSEP '/'
+#define DIRSEP2 '\\'
+/* Leave alone for Unix and MS-DOS/Windows!
+Note: '/' also used in filename in get_columns(). */
+
+#define FONTFILESUFFIX ".flf"
+#define FONTFILEMAGICNUMBER "flf2"
+#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
+#define CONTROLFILESUFFIX ".flc"
+#define CONTROLFILEMAGICNUMBER "flc2" /* no longer used in 2.2 */
+#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
+#define DEFAULTCOLUMNS 80
+
+
+/****************************************************************************
+
+ Globals dealing with chars that are read
+
+****************************************************************************/
+
+typedef long inchr; /* "char" read from stdin */
+
+inchr *inchrline; /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
+ /* Note: not null-terminated. */
+int inchrlinelen,inchrlinelenlimit;
+inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
+ /* Latin-1 codes for German letters, respectively:
+ LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
+ LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
+ LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
+ LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
+ LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
+ LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
+ LATIN SMALL LETTER SHARP S = ess-zed
+ */
+
+int hzmode; /* true if reading double-bytes in HZ mode */
+int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
+inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
+int gl; /* 0-3 specifies left-half Gn character set */
+int gr; /* 0-3 specifies right-half Gn character set */
+
+int Myargc; /* to avoid passing around argc and argv */
+char **Myargv;
+
+/****************************************************************************
+
+ Globals dealing with chars that are written
+
+****************************************************************************/
+
+typedef struct fc {
+ inchr ord;
+ char **thechar; /* Alloc'd char thechar[charheight][]; */
+ struct fc *next;
+ } fcharnode;
+
+fcharnode *fcharlist;
+char **currchar;
+int currcharwidth;
+int previouscharwidth;
+char **outputline; /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
+int outlinelen;
+
+
+/****************************************************************************
+
+ Globals dealing with command file storage
+
+****************************************************************************/
+
+typedef struct cfn {
+ char *thename;
+ struct cfn *next;
+ } cfnamenode;
+
+cfnamenode *cfilelist,**cfilelistend;
+
+typedef struct cm {
+ int thecommand;
+ inchr rangelo;
+ inchr rangehi;
+ inchr offset;
+ struct cm *next;
+ } comnode;
+
+comnode *commandlist,**commandlistend;
+
+/****************************************************************************
+
+ Globals affected by command line options
+
+****************************************************************************/
+
+int deutschflag,justification,paragraphflag,right2left,multibyte;
+int cmdinput;
+
+#define SM_SMUSH 128
+#define SM_KERN 64
+#define SM_EQUAL 1
+#define SM_LOWLINE 2
+#define SM_HIERARCHY 4
+#define SM_PAIR 8
+#define SM_BIGX 16
+#define SM_HARDBLANK 32
+
+int smushmode;
+
+#define SMO_NO 0 /* no command-line smushmode */
+#define SMO_YES 1 /* use command-line smushmode, ignore font smushmode */
+#define SMO_FORCE 2 /* logically OR command-line and font smushmodes */
+
+int smushoverride;
+
+int outputwidth;
+int outlinelenlimit;
+char *fontdirname,*fontname;
+
+
+/****************************************************************************
+
+ Globals read from font file
+
+****************************************************************************/
+
+char hardblank;
+int charheight;
+
+
+/****************************************************************************
+
+ Name of program, used in error messages
+
+****************************************************************************/
+
+char *myname;
+
+
+#ifdef TIOCGWINSZ
+/****************************************************************************
+
+ get_columns
+
+ Determines the number of columns of /dev/tty. Returns the number of
+ columns, or -1 if error. May return 0 if columns unknown.
+ Requires include files <fcntl.h> and <sys/ioctl.h>.
+ by Glenn Chappell & Ian Chai 14 Apr 1993
+
+****************************************************************************/
+
+int get_columns()
+{
+ struct winsize ws;
+ int fd,result;
+
+ if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
+ result = ioctl(fd,TIOCGWINSZ,&ws);
+ close(fd);
+ return result?-1:ws.ws_col;
+}
+#endif /* ifdef TIOCGWINSZ */
+
+
+/****************************************************************************
+
+ myalloc
+
+ Calls malloc. If malloc returns error, prints error message and
+ quits.
+
+****************************************************************************/
+
+#ifdef __STDC__
+char *myalloc(size_t size)
+#else
+char *myalloc(size)
+int size;
+#endif
+{
+ char *ptr;
+#ifndef __STDC__
+ extern void *malloc();
+#endif
+
+ if ((ptr = (char*)malloc(size))==NULL) {
+ fprintf(stderr,"%s: Out of memory\n",myname);
+ exit(1);
+ }
+ else {
+ return ptr;
+ }
+}
+
+
+/****************************************************************************
+
+ hasdirsep
+
+ Returns true if s1 contains a DIRSEP or DIRSEP2 character.
+
+****************************************************************************/
+
+int hasdirsep(s1)
+char *s1;
+{
+ if (strchr(s1, DIRSEP)) return 1;
+ else if (strchr(s1, DIRSEP2)) return 1;
+ else return 0;
+}
+
+/****************************************************************************
+
+ suffixcmp
+
+ Returns true if s2 is a suffix of s1; uses case-blind comparison.
+
+****************************************************************************/
+
+int suffixcmp(s1, s2)
+char *s1;
+char *s2;
+{
+ int len1, len2;
+
+ len1 = MYSTRLEN(s1);
+ len2 = MYSTRLEN(s2);
+ if (len2 > len1) return 0;
+ s1 += len1 - len2;
+ while (*s1) {
+ if (tolower(*s1) != tolower(*s2)) return 0;
+ s1++;
+ s2++;
+ }
+ return 1;
+}
+
+/****************************************************************************
+
+ skiptoeol
+
+ Skips to the end of a line, given a stream. Handles \r, \n, or \r\n.
+
+****************************************************************************/
+
+void skiptoeol(fp)
+ZFILE *fp;
+{
+ int dummy;
+
+ while (dummy=Zgetc(fp),dummy!=EOF) {
+ if (dummy == '\n') return;
+ if (dummy == '\r') {
+ dummy = Zgetc(fp);
+ if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
+ return;
+ }
+ }
+}
+
+
+/****************************************************************************
+
+ myfgets
+
+ Local version of fgets. Handles \r, \n, and \r\n terminators.
+
+****************************************************************************/
+
+char *myfgets(line,maxlen,fp)
+char *line;
+int maxlen;
+ZFILE *fp;
+{
+ int c = 0;
+ char *p;
+
+ p = line;
+ while((c=Zgetc(fp))!=EOF&&maxlen) {
+ *p++ = c;
+ maxlen--;
+ if (c=='\n') break;
+ if (c=='\r') {
+ c = Zgetc(fp);
+ if (c != EOF && c != '\n') Zungetc(c,fp);
+ *(p-1) = '\n';
+ break;
+ }
+ }
+ *p = 0;
+ return (c==EOF) ? NULL : line;
+}
+
+/****************************************************************************
+
+ usageerr
+
+ Prints "Usage: ...." line to the given stream.
+
+****************************************************************************/
+
+void printusage(out)
+FILE *out;
+{
+ fprintf(out,
+ "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
+ myname);
+ fprintf(out,
+ " [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
+ fprintf(out,
+ " [ -C controlfile ] [ -I infocode ] [ message ]\n");
+}
+
+
+/****************************************************************************
+
+ printinfo
+
+ Prints version and copyright message, or utility information.
+
+****************************************************************************/
+
+void printinfo(infonum)
+int infonum;
+{
+ switch (infonum) {
+ case 0: /* Copyright message */
+ printf("FIGlet Copyright 1991-2002 Glenn Chappell, Ian Chai, ");
+ printf("John Cowan, Christiaan Keet\n");
+ printf("Internet: <info@figlet.org> ");
+ printf("Version: %s, date: %s\n\n",VERSION,DATE);
+ printf("FIGlet, along with the various FIGlet fonts");
+ printf(" and documentation, may be\n");
+ printf("freely copied and distributed.\n\n");
+ printf("If you use FIGlet, please send an");
+ printf(" e-mail message to <info@figlet.org>.\n\n");
+ printf("The latest version of FIGlet is available from the");
+ printf(" web site,\n\thttp://www.figlet.org/\n\n");
+ printusage(stdout);
+ break;
+ case 1: /* Version (integer) */
+ printf("%d\n",VERSION_INT);
+ break;
+ case 2: /* Font directory */
+ printf("%s\n",fontdirname);
+ break;
+ case 3: /* Font */
+ printf("%s\n",fontname);
+ break;
+ case 4: /* Outputwidth */
+ printf("%d\n",outputwidth);
+ }
+}
+
+
+/****************************************************************************
+
+ readmagic
+
+ Reads a four-character magic string from a stream.
+
+****************************************************************************/
+void readmagic(fp,magic)
+ZFILE *fp;
+char *magic;
+{
+ int i;
+
+ for (i=0;i<4;i++) {
+ magic[i] = Zgetc(fp);
+ }
+ magic[4] = 0;
+ }
+
+/****************************************************************************
+
+ skipws
+
+ Skips whitespace characters from a stream.
+
+****************************************************************************/
+void skipws(fp)
+ZFILE *fp;
+{
+ int c;
+ while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
+ Zungetc(c,fp);
+ }
+
+/****************************************************************************
+
+ readnum
+
+ Reads a number from a stream. Accepts "0" prefix for octal and
+ "0x" or "0X" for hexadecimal. Ignores leading whitespace.
+
+****************************************************************************/
+void readnum(fp,nump)
+ZFILE *fp;
+inchr *nump;
+{
+ int acc = 0;
+ char *p;
+ int c;
+ int base;
+ int sign = 1;
+ char digits[] = "0123456789ABCDEF";
+
+ skipws(fp);
+ c = Zgetc(fp);
+ if (c=='-') {
+ sign = -1;
+ }
+ else {
+ Zungetc(c,fp);
+ }
+ c = Zgetc(fp);
+ if (c=='0') {
+ c = Zgetc(fp);
+ if (c=='x'||c=='X') {
+ base = 16;
+ }
+ else {
+ base = 8;
+ Zungetc(c,fp);
+ }
+ }
+ else {
+ base = 10;
+ Zungetc(c,fp);
+ }
+
+ while((c=Zgetc(fp))!=EOF) {
+ c=toupper(c);
+ p=strchr(digits,c);
+ if (!p) {
+ Zungetc(c,fp);
+ *nump = acc * sign;
+ return;
+ }
+ acc = acc*base+(p-digits);
+ }
+ *nump = acc * sign;
+ }
+
+/****************************************************************************
+
+ readTchar
+
+ Reads a control file "T" command character specification.
+
+ Character is a single byte, an escape sequence, or
+ an escaped numeric.
+
+****************************************************************************/
+
+inchr readTchar(fp)
+ZFILE *fp;
+{
+ inchr thechar;
+ char next;
+
+ thechar=Zgetc(fp);
+ if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
+ Zungetc(thechar,fp);
+ return '\0';
+ }
+ if (thechar!='\\') return thechar;
+ next=Zgetc(fp);
+ switch(next) {
+ case 'a':
+ return 7;
+ case 'b':
+ return 8;
+ case 'e':
+ return 27;
+ case 'f':
+ return 12;
+ case 'n':
+ return 10;
+ case 'r':
+ return 13;
+ case 't':
+ return 9;
+ case 'v':
+ return 11;
+ default:
+ if (next=='-' || next=='x' || (next>='0' && next<='9')) {
+ Zungetc(next,fp);
+ readnum(fp,&thechar);
+ return thechar;
+ }
+ return next;
+ }
+}
+
+/****************************************************************************
+
+ charsetname
+
+ Get a Tchar representing a charset name, or 0 if none available.
+ Called in getcharset().
+
+****************************************************************************/
+
+inchr charsetname(fp)
+ZFILE *fp;
+{
+ inchr result;
+
+ result = readTchar(fp);
+ if (result == '\n' || result == '\r') {
+ result = 0;
+ Zungetc(result,fp);
+ }
+ return result;
+ }
+
+/****************************************************************************
+
+ charset
+
+ Processes "g[0123]" character set specifier
+ Called in readcontrol().
+
+****************************************************************************/
+
+void charset(n, controlfile)
+int n;
+ZFILE *controlfile;
+{
+ int ch;
+
+ skipws(controlfile);
+ if (Zgetc(controlfile) != '9') {
+ skiptoeol(controlfile);
+ return;
+ }
+ ch = Zgetc(controlfile);
+ if (ch == '6') {
+ gn[n] = 65536L * charsetname(controlfile) + 0x80;
+ gndbl[n] = 0;
+ skiptoeol(controlfile);
+ return;
+ }
+ if (ch != '4') {
+ skiptoeol(controlfile);
+ return;
+ }
+ ch = Zgetc(controlfile);
+ if (ch == 'x') {
+ if (Zgetc(controlfile) != '9') {
+ skiptoeol(controlfile);
+ return;
+ }
+ if (Zgetc(controlfile) != '4') {
+ skiptoeol(controlfile);
+ return;
+ }
+ skipws(controlfile);
+ gn[n] = 65536L * charsetname(controlfile);
+ gndbl[n] = 1;
+ skiptoeol(controlfile);
+ return;
+ }
+ Zungetc(ch, controlfile);
+ skipws(controlfile);
+ gn[n] = 65536L * charsetname(controlfile);
+ gndbl[n] = 0;
+ return;
+ }
+
+/****************************************************************************
+
+ readcontrol
+
+ Allocates memory and reads in the given control file.
+ Called in readcontrolfiles().
+
+****************************************************************************/
+
+void readcontrol(controlname)
+char *controlname;
+{
+ inchr firstch,lastch;
+ char dashcheck;
+ inchr offset;
+ char *controlpath,magicnum[5];
+ int command;
+ ZFILE *controlfile;
+ int namelen;
+
+ namelen = MYSTRLEN(fontdirname);
+ controlpath = (char*)myalloc(sizeof(char)
+ *(namelen+MYSTRLEN(controlname)+CSUFFIXLEN+2));
+ controlfile = NULL;
+ if (!hasdirsep(controlname)) {
+ strcpy(controlpath,fontdirname);
+ controlpath[namelen] = DIRSEP;
+ controlpath[namelen+1] = '\0';
+ strcat(controlpath,controlname);
+ strcat(controlpath,CONTROLFILESUFFIX);
+ controlfile = Zopen(controlpath,"rb");
+ }
+ if (controlfile==NULL) {
+ strcpy(controlpath,controlname);
+ strcat(controlpath,CONTROLFILESUFFIX);
+ controlfile = Zopen(controlpath,"rb");
+ if (controlfile==NULL) {
+ fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
+ controlpath);
+ exit(1);
+ }
+ }
+
+ free(controlpath);
+
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+
+ while(command=Zgetc(controlfile),command!=EOF) {
+ switch (command) {
+ case 't': /* Translate */
+ skipws(controlfile);
+ firstch=readTchar(controlfile);
+ if ((dashcheck=Zgetc(controlfile))=='-') {
+ lastch=readTchar(controlfile);
+ }
+ else {
+ Zungetc(dashcheck,controlfile);
+ lastch=firstch;
+ }
+ skipws(controlfile);
+ offset=readTchar(controlfile)-firstch;
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 1;
+ (*commandlistend)->rangelo = firstch;
+ (*commandlistend)->rangehi = lastch;
+ (*commandlistend)->offset = offset;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '-':
+ /* Mapping table entry */
+ Zungetc(command,controlfile);
+ readnum(controlfile,&firstch);
+ skipws(controlfile);
+ readnum(controlfile,&lastch);
+ offset=lastch-firstch;
+ lastch=firstch;
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 1;
+ (*commandlistend)->rangelo = firstch;
+ (*commandlistend)->rangehi = lastch;
+ (*commandlistend)->offset = offset;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case 'f': /* freeze */
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 0;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case 'b': /* DBCS input mode */
+ multibyte = 1;
+ break;
+ case 'u': /* UTF-8 input mode */
+ multibyte = 2;
+ break;
+ case 'h': /* HZ input mode */
+ multibyte = 3;
+ break;
+ case 'j': /* Shift-JIS input mode */
+ multibyte = 4;
+ break;
+ case 'g': /* ISO 2022 character set choices */
+ multibyte = 0;
+ skipws(controlfile);
+ command=Zgetc(controlfile);
+ switch (command) {
+ case '0': /* define G0 charset */
+ charset(0, controlfile);
+ break;
+ case '1': /* set G1 charset */
+ charset(1, controlfile);
+ break;
+ case '2': /* set G2 charset */
+ charset(2, controlfile);
+ break;
+ case '3': /* set G3 charset */
+ charset(3, controlfile);
+ break;
+ case 'l': case 'L': /* define left half */
+ skipws(controlfile);
+ gl = Zgetc(controlfile) - '0';
+ skiptoeol(controlfile);
+ break;
+ case 'r': case 'R': /* define right half */
+ skipws(controlfile);
+ gr = Zgetc(controlfile) - '0';
+ skiptoeol(controlfile);
+ break;
+ default: /* meaningless "g" command */
+ skiptoeol(controlfile);
+ }
+ case '\r': case '\n': /* blank line */
+ break;
+ default: /* Includes '#' */
+ skiptoeol(controlfile);
+ }
+ }
+ Zclose(controlfile);
+}
+
+
+/****************************************************************************
+
+ readcontrolfiles
+
+ Reads in the controlfiles names in cfilelist. Uses readcontrol.
+ Called in main().
+
+****************************************************************************/
+
+void readcontrolfiles()
+{
+ cfnamenode *cfnptr;
+
+ for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
+ readcontrol(cfnptr->thename);
+ }
+}
+
+
+/****************************************************************************
+
+ clearcfilelist
+
+ Clears the control file list. Assumes thename does not need freeing.
+
+****************************************************************************/
+
+void clearcfilelist()
+{
+ cfnamenode *cfnptr1,*cfnptr2;
+
+ cfnptr1 = cfilelist;
+ while (cfnptr1 != NULL) {
+ cfnptr2 = cfnptr1->next;
+ free(cfnptr1);
+ cfnptr1 = cfnptr2;
+ }
+ cfilelist = NULL;
+ cfilelistend = &cfilelist;
+}
+
+
+/****************************************************************************
+
+ getparams
+
+ Handles all command-line parameters. Puts all parameters within
+ bounds.
+
+****************************************************************************/
+
+void getparams()
+{
+ extern char *optarg;
+ extern int optind;
+ int c; /* "Should" be a char -- need int for "!= -1" test*/
+ int columns,firstfont,infoprint;
+ char *controlname;
+
+ if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
+ myname++;
+ }
+ else {
+ myname = Myargv[0];
+ }
+ fontdirname = DEFAULTFONTDIR;
+ firstfont = 1;
+ fontname = (char*)myalloc(sizeof(char)*(MYSTRLEN(DEFAULTFONTFILE)+1));
+ strcpy(fontname,DEFAULTFONTFILE); /* Some systems don't have strdup() */
+ if (suffixcmp(fontname,FONTFILESUFFIX)) {
+ fontname[MYSTRLEN(fontname)-FSUFFIXLEN]='\0';
+ }
+ cfilelist = NULL;
+ cfilelistend = &cfilelist;
+ commandlist = NULL;
+ commandlistend = &commandlist;
+ smushoverride = SMO_NO;
+ deutschflag = 0;
+ justification = -1;
+ right2left = -1;
+ paragraphflag = 0;
+ infoprint = -1;
+ cmdinput = 0;
+ outputwidth = DEFAULTCOLUMNS;
+ gn[1] = 0x80;
+ gr = 1;
+ while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
+ /* Note: -F is not a legal option -- prints a special err message. */
+ switch (c) {
+ case 'A':
+ cmdinput = 1;
+ break;
+ case 'D':
+ deutschflag = 1;
+ break;
+ case 'E':
+ deutschflag = 0;
+ break;
+ case 'X':
+ right2left = -1;
+ break;
+ case 'L':
+ right2left = 0;
+ break;
+ case 'R':
+ right2left = 1;
+ break;
+ case 'x':
+ justification = -1;
+ break;
+ case 'l':
+ justification = 0;
+ break;
+ case 'c':
+ justification = 1;
+ break;
+ case 'r':
+ justification = 2;
+ break;
+ case 'p':
+ paragraphflag = 1;
+ break;
+ case 'n':
+ paragraphflag = 0;
+ break;
+ case 's':
+ smushoverride = SMO_NO;
+ break;
+ case 'k':
+ smushmode = SM_KERN;
+ smushoverride = SMO_YES;
+ break;
+ case 'S':
+ smushmode = SM_SMUSH;
+ smushoverride = SMO_FORCE;
+ break;
+ case 'o':
+ smushmode = SM_SMUSH;
+ smushoverride = SMO_YES;
+ break;
+ case 'W':
+ smushmode = 0;
+ smushoverride = SMO_YES;
+ break;
+ case 't':
+#ifdef TIOCGWINSZ
+ columns = get_columns();
+ if (columns>0) {
+ outputwidth = columns;
+ }
+#else /* ifdef TIOCGWINSZ */
+ fprintf(stderr,
+ "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
+ myname);
+#endif /* ifdef TIOCGWINSZ */
+ break;
+ case 'v':
+ infoprint = 0;
+ break;
+ case 'I':
+ infoprint = atoi(optarg);
+ break;
+ case 'm':
+ smushmode = atoi(optarg);
+ if (smushmode < -1) {
+ smushoverride = SMO_NO;
+ break;
+ }
+ if (smushmode == 0) smushmode = SM_KERN;
+ else if (smushmode == -1) smushmode = 0;
+ else smushmode = (smushmode & 63) | SM_SMUSH;
+ smushoverride = SMO_YES;
+ break;
+ case 'w':
+ columns = atoi(optarg);
+ if (columns>0) {
+ outputwidth = columns;
+ }
+ break;
+ case 'd':
+ fontdirname = optarg;
+ break;
+ case 'f':
+ if (firstfont) {
+ free(fontname);
+ firstfont = 0;
+ }
+ fontname = optarg;
+ if (suffixcmp(fontname,FONTFILESUFFIX)) {
+ fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
+ }
+ break;
+ case 'C':
+ controlname = optarg;
+ if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
+ controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
+ }
+ (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
+ (*cfilelistend)->thename = controlname;
+ cfilelistend = &(*cfilelistend)->next;
+ (*cfilelistend) = NULL;
+ break;
+ case 'N':
+ clearcfilelist();
+ multibyte = 0;
+ gn[0] = 0;
+ gn[1] = 0x80;
+ gn[2] = gn[3] = 0;
+ gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
+ gl = 0;
+ gr = 1;
+ break;
+ case 'F': /* Not a legal option */
+ fprintf(stderr,"%s: illegal option -- F\n",myname);
+ printusage(stderr);
+ fprintf(stderr,"\nBecause of numerous incompatibilities, the");
+ fprintf(stderr," \"-F\" option has been\n");
+ fprintf(stderr,"removed. It has been replaced by the \"figlist\"");
+ fprintf(stderr," program, which is now\n");
+ fprintf(stderr,"included in the basic FIGlet package. \"figlist\"");
+ fprintf(stderr," is also available\n");
+ fprintf(stderr,"from http://www.figlet.org/");
+ fprintf(stderr,"under UNIX utilities.\n");
+ exit(1);
+ break;
+ default:
+ printusage(stderr);
+ exit(1);
+ }
+ }
+ if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
+ outlinelenlimit = outputwidth-1;
+ if (infoprint>=0) {
+ printinfo(infoprint);
+ exit(0);
+ }
+}
+
+
+/****************************************************************************
+
+ clearline
+
+ Clears both the input (inchrline) and output (outputline) storage.
+
+****************************************************************************/
+
+void clearline()
+{
+ int i;
+
+ for (i=0;i<charheight;i++) {
+ outputline[i][0] = '\0';
+ }
+ outlinelen = 0;
+ inchrlinelen = 0;
+}
+
+
+/****************************************************************************
+
+ readfontchar
+
+ Reads a font character from the font file, and places it in a
+ newly-allocated entry in the list.
+
+****************************************************************************/
+
+void readfontchar(file,theord,line,maxlen)
+ZFILE *file;
+inchr theord;
+char *line;
+int maxlen;
+{
+ int row,k;
+ char endchar;
+ fcharnode *fclsave;
+
+ fclsave = fcharlist;
+ fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
+ fcharlist->ord = theord;
+ fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
+ fcharlist->next = fclsave;
+ for (row=0;row<charheight;row++) {
+ if (myfgets(line,maxlen+1,file)==NULL) {
+ line[0] = '\0';
+ }
+ k = MYSTRLEN(line)-1;
+ while (k>=0 && isspace(line[k])) {
+ k--;
+ }
+ if (k>=0) {
+ endchar = line[k];
+ while (k>=0 ? line[k]==endchar : 0) {
+ k--;
+ }
+ }
+ line[k+1] = '\0';
+ fcharlist->thechar[row] = (char*)myalloc(sizeof(char)*(k+2));
+ strcpy(fcharlist->thechar[row],line);
+ }
+}
+
+
+/****************************************************************************
+
+ readfont
+
+ Allocates memory, initializes variables, and reads in the font.
+ Called near beginning of main().
+
+****************************************************************************/
+
+void readfont()
+{
+#define MAXFIRSTLINELEN 1000
+ int i,row,numsread;
+ inchr theord;
+ int maxlen,cmtlines,ffright2left;
+ int smush,smush2;
+ char *fontpath,*fileline,magicnum[5];
+ ZFILE *fontfile;
+ int namelen;
+
+ namelen = MYSTRLEN(fontdirname);
+ fontpath = (char*)myalloc(sizeof(char)
+ *(namelen+MYSTRLEN(fontname)+FSUFFIXLEN+2));
+ fontfile = NULL;
+ if (!hasdirsep(fontname)) {
+ strcpy(fontpath,fontdirname);
+ fontpath[namelen] = DIRSEP;
+ fontpath[namelen+1] = '\0';
+ strcat(fontpath,fontname);
+ strcat(fontpath,FONTFILESUFFIX);
+ fontfile = Zopen(fontpath,"rb");
+ }
+ if (fontfile==NULL) {
+ strcpy(fontpath,fontname);
+ strcat(fontpath,FONTFILESUFFIX);
+ fontfile = Zopen(fontpath,"rb");
+ if (fontfile==NULL) {
+ fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontpath);
+ exit(1);
+ }
+ }
+
+ readmagic(fontfile,magicnum);
+ fileline = (char*)myalloc(sizeof(char)*(MAXFIRSTLINELEN+1));
+ if (myfgets(fileline,MAXFIRSTLINELEN+1,fontfile)==NULL) {
+ fileline[0] = '\0';
+ }
+ if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
+ skiptoeol(fontfile);
+ }
+ numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
+ &hardblank,&charheight,&maxlen,&smush,&cmtlines,
+ &ffright2left,&smush2);
+ free(fileline);
+ if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
+ fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontpath);
+ exit(1);
+ }
+ for (i=1;i<=cmtlines;i++) {
+ skiptoeol(fontfile);
+ }
+ free(fontpath);
+
+ if (numsread<6) {
+ ffright2left = 0;
+ }
+
+ if (numsread<7) { /* if no smush2, decode smush into smush2 */
+ if (smush == 0) smush2 = SM_KERN;
+ else if (smush < 0) smush2 = 0;
+ else smush2 = (smush & 31) | SM_SMUSH;
+ }
+
+ if (charheight<1) {
+ charheight = 1;
+ }
+
+ if (maxlen<1) {
+ maxlen = 1;
+ }
+
+ maxlen += 100; /* Give ourselves some extra room */
+
+ if (smushoverride == SMO_NO)
+ smushmode = smush2;
+ else if (smushoverride == SMO_FORCE)
+ smushmode |= smush2;
+
+ if (right2left<0) {
+ right2left = ffright2left;
+ }
+
+ if (justification<0) {
+ justification = 2*right2left;
+ }
+
+ fileline = (char*)myalloc(sizeof(char)*(maxlen+1));
+ /* Allocate "missing" character */
+ fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
+ fcharlist->ord = 0;
+ fcharlist->thechar = (char**)myalloc(sizeof(char*)*charheight);
+ fcharlist->next = NULL;
+ for (row=0;row<charheight;row++) {
+ fcharlist->thechar[row] = (char*)myalloc(sizeof(char));
+ fcharlist->thechar[row][0] = '\0';
+ }
+ for (theord=' ';theord<='~';theord++) {
+ readfontchar(fontfile,theord,fileline,maxlen);
+ }
+ for (theord=0;theord<=6;theord++) {
+ readfontchar(fontfile,deutsch[theord],fileline,maxlen);
+ }
+ while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
+ sscanf(fileline,"%li",&theord)==1) {
+ readfontchar(fontfile,theord,fileline,maxlen);
+ }
+ Zclose(fontfile);
+ free(fileline);
+}
+
+
+/****************************************************************************
+
+ linealloc
+
+ Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
+ Called near beginning of main().
+
+****************************************************************************/
+
+void linealloc()
+{
+ int row;
+
+ outputline = (char**)myalloc(sizeof(char*)*charheight);
+ for (row=0;row<charheight;row++) {
+ outputline[row] = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
+ }
+ inchrlinelenlimit = outputwidth*4+100;
+ inchrline = (inchr*)myalloc(sizeof(inchr)*(inchrlinelenlimit+1));
+ clearline();
+}
+
+
+/****************************************************************************
+
+ getletter
+
+ Sets currchar to point to the font entry for the given character.
+ Sets currcharwidth to the width of this character.
+
+****************************************************************************/
+
+void getletter(c)
+inchr c;
+{
+ fcharnode *charptr;
+
+ for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=c;
+ charptr=charptr->next) ;
+ if (charptr!=NULL) {
+ currchar = charptr->thechar;
+ }
+ else {
+ for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
+ charptr=charptr->next) ;
+ currchar = charptr->thechar;
+ }
+ previouscharwidth = currcharwidth;
+ currcharwidth = MYSTRLEN(currchar[0]);
+}
+
+
+/****************************************************************************
+
+ smushem
+
+ Given 2 characters, attempts to smush them into 1, according to
+ smushmode. Returns smushed character or '\0' if no smushing can be
+ done.
+
+ smushmode values are sum of following (all values smush blanks):
+ 1: Smush equal chars (not hardblanks)
+ 2: Smush '_' with any char in hierarchy below
+ 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
+ Each class in hier. can be replaced by later class.
+ 8: [ + ] -> |, { + } -> |, ( + ) -> |
+ 16: / + \ -> X, > + < -> X (only in that order)
+ 32: hardblank + hardblank -> hardblank
+
+****************************************************************************/
+
+char smushem(lch,rch)
+char lch,rch;
+{
+ if (lch==' ') return rch;
+ if (rch==' ') return lch;
+
+ if (previouscharwidth<2 || currcharwidth<2) return '\0';
+ /* Disallows overlapping if the previous character */
+ /* or the current character has a width of 1 or zero. */
+
+ if ((smushmode & SM_SMUSH) == 0) return '\0'; /* kerning */
+
+ if ((smushmode & 63) == 0) {
+ /* This is smushing by universal overlapping. */
+ if (lch==' ') return rch;
+ if (rch==' ') return lch;
+ if (lch==hardblank) return rch;
+ if (rch==hardblank) return lch;
+ /* Above four lines ensure overlapping preference to */
+ /* visible characters. */
+ if (right2left==1) return lch;
+ /* Above line ensures that the dominant (foreground) */
+ /* fig-character for overlapping is the latter in the */
+ /* user's text, not necessarily the rightmost character. */
+ return rch;
+ /* Occurs in the absence of above exceptions. */
+ }
+
+ if (smushmode & SM_HARDBLANK) {
+ if (lch==hardblank && rch==hardblank) return lch;
+ }
+
+ if (lch==hardblank || rch==hardblank) return '\0';
+
+ if (smushmode & SM_EQUAL) {
+ if (lch==rch) return lch;
+ }
+
+ if (smushmode & SM_LOWLINE) {
+ if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
+ if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
+ }
+
+ if (smushmode & SM_HIERARCHY) {
+ if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
+ if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
+ if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
+ if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
+ if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
+ if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
+ if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
+ if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
+ if (strchr("()",lch) && strchr("<>",rch)) return rch;
+ if (strchr("()",rch) && strchr("<>",lch)) return lch;
+ }
+
+ if (smushmode & SM_PAIR) {
+ if (lch=='[' && rch==']') return '|';
+ if (rch=='[' && lch==']') return '|';
+ if (lch=='{' && rch=='}') return '|';
+ if (rch=='{' && lch=='}') return '|';
+ if (lch=='(' && rch==')') return '|';
+ if (rch=='(' && lch==')') return '|';
+ }
+
+ if (smushmode & SM_BIGX) {
+ if (lch=='/' && rch=='\\') return '|';
+ if (rch=='/' && lch=='\\') return 'Y';
+ if (lch=='>' && rch=='<') return 'X';
+ /* Don't want the reverse of above to give 'X'. */
+ }
+
+ return '\0';
+}
+
+
+/****************************************************************************
+
+ smushamt
+
+ Returns the maximum amount that the current character can be smushed
+ into the current line.
+
+****************************************************************************/
+
+int smushamt()
+{
+ int maxsmush,amt;
+ int row,linebd,charbd;
+ char ch1,ch2;
+
+ if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
+ return 0;
+ }
+ maxsmush = currcharwidth;
+ for (row=0;row<charheight;row++) {
+ if (right2left) {
+ for (charbd=MYSTRLEN(currchar[row]);
+ ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
+ for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
+ amt = linebd+currcharwidth-1-charbd;
+ }
+ else {
+ for (linebd=MYSTRLEN(outputline[row]);
+ ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
+ for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
+ amt = charbd+outlinelen-1-linebd;
+ }
+ if (!ch1||ch1==' ') {
+ amt++;
+ }
+ else if (ch2) {
+ if (smushem(ch1,ch2)!='\0') {
+ amt++;
+ }
+ }
+ if (amt<maxsmush) {
+ maxsmush = amt;
+ }
+ }
+ return maxsmush;
+}
+
+
+/****************************************************************************
+
+ addchar
+
+ Attempts to add the given character onto the end of the current line.
+ Returns 1 if this can be done, 0 otherwise.
+
+****************************************************************************/
+
+int addchar(c)
+inchr c;
+{
+ int smushamount,row,k;
+ char *templine;
+
+ getletter(c);
+ smushamount = smushamt();
+ if (outlinelen+currcharwidth-smushamount>outlinelenlimit
+ ||inchrlinelen+1>inchrlinelenlimit) {
+ return 0;
+ }
+
+ templine = (char*)myalloc(sizeof(char)*(outlinelenlimit+1));
+ for (row=0;row<charheight;row++) {
+ if (right2left) {
+ strcpy(templine,currchar[row]);
+ for (k=0;k<smushamount;k++) {
+ templine[currcharwidth-smushamount+k] =
+ smushem(templine[currcharwidth-smushamount+k],outputline[row][k]);
+ }
+ strcat(templine,outputline[row]+smushamount);
+ strcpy(outputline[row],templine);
+ }
+ else {
+ for (k=0;k<smushamount;k++) {
+ outputline[row][outlinelen-smushamount+k] =
+ smushem(outputline[row][outlinelen-smushamount+k],currchar[row][k]);
+ }
+ strcat(outputline[row],currchar[row]+smushamount);
+ }
+ }
+ free(templine);
+ outlinelen = MYSTRLEN(outputline[0]);
+ inchrline[inchrlinelen++] = c;
+ return 1;
+}
+
+
+/****************************************************************************
+
+ putstring
+
+ Prints out the given null-terminated string, substituting blanks
+ for hardblanks. If outputwidth is 1, prints the entire string;
+ otherwise prints at most outputwidth-1 characters. Prints a newline
+ at the end of the string. The string is left-justified, centered or
+ right-justified (taking outputwidth as the screen width) if
+ justification is 0, 1 or 2, respectively.
+
+****************************************************************************/
+
+static int nr_chars=0;
+static void myputchar(unsigned char c)
+{
+ static int startline = 1;
+
+ if ( startline )
+ {
+ startline = 0;
+ myputchar(' ');
+ }
+
+ putc(c, stderr);
+
+ if ( nr_chars == 0 )
+ putchar('"');
+
+ putchar('\\');
+ putchar('0' + ((c>>6)&7));
+ putchar('0' + ((c>>3)&7));
+ putchar('0' + ((c>>0)&7));
+
+ if ( c == '\n' )
+ startline = 1;
+
+ if ( ++nr_chars == 18 )
+ {
+ nr_chars = 0;
+ putchar('"');
+ putchar(' ');
+ putchar('\\');
+ putchar('\n');
+ }
+}
+
+void putstring(string)
+char *string;
+{
+ int i,len;
+
+ len = MYSTRLEN(string);
+ if (outputwidth>1) {
+ if (len>outputwidth-1) {
+ len = outputwidth-1;
+ }
+ if (justification>0) {
+ for (i=1;(3-justification)*i+len+justification-2<outputwidth;i++) {
+ myputchar(' ');
+ }
+ }
+ }
+ for (i=0;i<len;i++) {
+ myputchar(string[i]==hardblank?' ':string[i]);
+ }
+ myputchar('\n');
+}
+
+
+/****************************************************************************
+
+ printline
+
+ Prints outputline using putstring, then clears the current line.
+
+****************************************************************************/
+
+void printline()
+{
+ int i;
+
+ for (i=0;i<charheight;i++) {
+ putstring(outputline[i]);
+ }
+ clearline();
+}
+
+
+/****************************************************************************
+
+ splitline
+
+ Splits inchrline at the last word break (bunch of consecutive blanks).
+ Makes a new line out of the first part and prints it using
+ printline. Makes a new line out of the second part and returns.
+
+****************************************************************************/
+
+void splitline()
+{
+ int i,gotspace,lastspace,len1,len2;
+ inchr *part1,*part2;
+
+ part1 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
+ part2 = (inchr*)myalloc(sizeof(inchr)*(inchrlinelen+1));
+ gotspace = 0;
+ for (i=inchrlinelen-1;i>=0;i--) {
+ if (!gotspace && inchrline[i]==' ') {
+ gotspace = 1;
+ lastspace = i;
+ }
+ if (gotspace && inchrline[i]!=' ') {
+ break;
+ }
+ }
+ len1 = i+1;
+ len2 = inchrlinelen-lastspace-1;
+ for (i=0;i<len1;i++) {
+ part1[i] = inchrline[i];
+ }
+ for (i=0;i<len2;i++) {
+ part2[i] = inchrline[lastspace+1+i];
+ }
+ clearline();
+ for (i=0;i<len1;i++) {
+ addchar(part1[i]);
+ }
+ printline();
+ for (i=0;i<len2;i++) {
+ addchar(part2[i]);
+ }
+ free(part1);
+ free(part2);
+}
+
+
+/****************************************************************************
+
+ handlemapping
+
+ Given an input character (type inchr), executes re-mapping commands
+ read from control files. Returns re-mapped character (inchr).
+
+****************************************************************************/
+
+inchr handlemapping(c)
+inchr c;
+{
+ comnode *cmptr;
+
+ cmptr=commandlist;
+ while (cmptr!=NULL) {
+ if (cmptr->thecommand ?
+ (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
+ c += cmptr->offset;
+ while(cmptr!=NULL ? cmptr->thecommand : 0) {
+ cmptr=cmptr->next;
+ }
+ }
+ else {
+ cmptr=cmptr->next;
+ }
+ }
+ return c;
+}
+
+/****************************************************************************
+
+ Agetchar
+
+ Replacement to getchar().
+ Acts exactly like getchar if -A is NOT specified,
+ else obtains input from All remaining command line words.
+
+****************************************************************************/
+
+int Agetchar()
+{
+ extern int optind; /* current argv[] element under study */
+ static AgetMode = 0; /* >= 0 for displacement into argv[n], <0 EOF */
+ char *arg; /* pointer to active character */
+ int c; /* current character */
+
+ if ( ! cmdinput ) /* is -A active? */
+ return( getchar() ); /* no: return stdin character */
+
+ if ( AgetMode < 0 || optind >= Myargc ) /* EOF is sticky: */
+ return( EOF ); /* **ensure it now and forever more */
+
+ /* find next character */
+ arg = Myargv[optind]; /* pointer to active arg */
+ c = arg[AgetMode++]&0xFF; /* get appropriate char of arg */
+
+ if ( ! c ) /* at '\0' that terminates word? */
+ { /* at end of word: return ' ' if normal word, '\n' if empty */
+ c = ' '; /* suppose normal word and return blank */
+ if ( AgetMode == 1 ) /* if ran out in very 1st char, force \n */
+ c = '\n'; /* (allows "hello '' world" to do \n at '') */
+ AgetMode = 0; /* return to char 0 in NEXT word */
+ if ( ++optind >= Myargc ) /* run up word count and check if at "EOF" */
+ { /* just ran out of arguments */
+ c = EOF; /* return EOF */
+ AgetMode = -1; /* ensure all future returns return EOF */
+ }
+ }
+
+ return( c ); /* return appropriate character */
+
+} /* end: Agetchar() */
+
+
+/****************************************************************************
+
+ iso2022
+
+ Called by getinchr. Interprets ISO 2022 sequences
+
+******************************************************************************/
+
+inchr iso2022()
+{
+ inchr ch;
+ inchr ch2;
+ int save_gl;
+ int save_gr;
+
+ ch = Agetchar();
+ if (ch == EOF) return ch;
+ if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
+ if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
+ switch (ch) {
+ case 14: /* invoke G0 into GL */
+ gl = 0;
+ return iso2022();
+ case 15: /* invoke G1 into GL */
+ gl = 1;
+ return iso2022();
+ case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
+ save_gl = gl; save_gr = gr;
+ gl = gr = 2;
+ ch = iso2022();
+ gl = save_gl; gr = save_gr;
+ return ch;
+ case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
+ save_gl = gl; save_gr = gr;
+ gl = gr = 3;
+ ch = iso2022();
+ gl = save_gl; gr = save_gr;
+ return ch;
+ case 'n' + 0x100: /* invoke G2 into GL */
+ gl = 2;
+ return iso2022();
+ case 'o' + 0x100: /* invoke G3 into GL */
+ gl = 3;
+ return iso2022();
+ case '~' + 0x100: /* invoke G1 into GR */
+ gr = 1;
+ return iso2022();
+ case '}' + 0x100: /* invoke G2 into GR */
+ gr = 2;
+ return iso2022();
+ case '|' + 0x100: /* invoke G3 into GR */
+ gr = 3;
+ return iso2022();
+ case '(' + 0x100: /* set G0 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0; /* ASCII */
+ gn[0] = ch << 16;
+ gndbl[0] = 0;
+ return iso2022();
+ case ')' + 0x100: /* set G1 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[1] = ch << 16;
+ gndbl[1] = 0;
+ return iso2022();
+ case '*' + 0x100: /* set G2 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[2] = ch << 16;
+ gndbl[2] = 0;
+ return iso2022();
+ case '+' + 0x100: /* set G3 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[3] = ch << 16;
+ gndbl[3] = 0;
+ return iso2022();
+ case '-' + 0x100: /* set G1 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0; /* Latin-1 top half */
+ gn[1] = (ch << 16) | 0x80;
+ gndbl[1] = 0;
+ return iso2022();
+ case '.' + 0x100: /* set G2 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0;
+ gn[2] = (ch << 16) | 0x80;
+ gndbl[2] = 0;
+ return iso2022();
+ case '/' + 0x100: /* set G3 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0;
+ gn[3] = (ch << 16) | 0x80;
+ gndbl[3] = 0;
+ return iso2022();
+ case '(' + 0x200: /* set G0 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[0] = ch << 16;
+ gndbl[0] = 1;
+ return iso2022();
+ case ')' + 0x200: /* set G1 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[1] = ch << 16;
+ gndbl[1] = 1;
+ return iso2022();
+ case '*' + 0x200: /* set G2 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[2] = ch << 16;
+ gndbl[2] = 1;
+ return iso2022();
+ case '+' + 0x200: /* set G3 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[3] = ch << 16;
+ gndbl[3] = 1;
+ return iso2022();
+ default:
+ if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
+ gn[0] = (ch & ~0x200) << 16;
+ gndbl[0] = 1;
+ return iso2022();
+ }
+ }
+
+ if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
+ if (gndbl[gl]) {
+ ch2 = Agetchar();
+ return gn[gl] | (ch << 8) | ch2;
+ }
+ else return gn[gl] | ch;
+ }
+ else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
+ if (gndbl[gr]) {
+ ch2 = Agetchar();
+ return gn[gr] | (ch << 8) | ch2;
+ }
+ else return gn[gr] | (ch & ~0x80);
+ }
+ else return ch;
+ }
+
+/****************************************************************************
+
+ ungetinchr
+
+ Called by main. Pushes back an "inchr" to be read by getinchr
+ on the next call.
+
+******************************************************************************/
+inchr getinchr_buffer;
+int getinchr_flag;
+
+inchr ungetinchr(c)
+inchr c;
+{
+ getinchr_buffer = c;
+ getinchr_flag = 1;
+ return c;
+}
+
+/*****************************************************************************
+
+ getinchr
+
+ Called by main. Processes multibyte characters. Invokes Agetchar.
+ If multibyte = 0, ISO 2022 mode (see iso2022 routine).
+ If multibyte = 1, double-byte mode (0x00-0x7f bytes are characters,
+ 0x80-0xFF bytes are first byte of a double-byte character).
+ If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
+ 0x80-0xBF bytes are nonfirst byte of a multibyte character,
+ 0xC0-0xFD bytes are first byte of a multibyte character,
+ 0xFE-0xFF bytes are errors (all errors return code 0x0080)).
+ If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
+ "~~" is a tilde, "~x" for all other x is ignored).
+ If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
+ of a double-byte character, all other bytes are characters).
+
+
+*****************************************************************************/
+
+inchr getinchr()
+{
+ int ch, ch2, ch3, ch4, ch5, ch6;
+
+ if (getinchr_flag) {
+ getinchr_flag = 0;
+ return getinchr_buffer;
+ }
+
+ switch(multibyte) {
+ case 0: /* single-byte */
+ return iso2022();
+ case 1: /* DBCS */
+ ch = Agetchar();
+ if ((ch >= 0x80 && ch <= 0x9F) ||
+ (ch >= 0xE0 && ch <= 0xEF)) {
+ ch = (ch << 8) + Agetchar();
+ }
+ return ch;
+ case 2: /* UTF-8 */
+ ch = Agetchar();
+ if (ch < 0x80) return ch; /* handles EOF, too */
+ if (ch < 0xC0 || ch > 0xFD)
+ return 0x0080; /* illegal first character */
+ ch2 = Agetchar() & 0x3F;
+ if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
+ ch3 = Agetchar() & 0x3F;
+ if (ch < 0xF0)
+ return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
+ ch4 = Agetchar() & 0x3F;
+ if (ch < 0xF8)
+ return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
+ ch5 = Agetchar() & 0x3F;
+ if (ch < 0xFC)
+ return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
+ (ch4 << 6) + ch5;
+ ch6 = Agetchar() & 0x3F;
+ return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
+ (ch4 << 12) + (ch5 << 6) + ch6;
+ case 3: /* HZ */
+ ch = Agetchar();
+ if (ch == EOF) return ch;
+ if (hzmode) {
+ ch = (ch << 8) + Agetchar();
+ if (ch == ('}' << 8) + '~') {
+ hzmode = 0;
+ return getinchr();
+ }
+ return ch;
+ }
+ else if (ch == '~') {
+ ch = Agetchar();
+ if (ch == '{') {
+ hzmode = 1;
+ return getinchr();
+ }
+ else if (ch == '~') {
+ return ch;
+ }
+ else {
+ return getinchr();
+ }
+ }
+ else return ch;
+ case 4: /* Shift-JIS */
+ ch = Agetchar();
+ if ((ch >= 0x80 && ch <= 0x9F) ||
+ (ch >= 0xE0 && ch <= 0xEF)) {
+ ch = (ch << 8) + Agetchar();
+ }
+ return ch;
+ default:
+ return 0x80;
+ }
+ }
+
+/****************************************************************************
+
+ main
+
+ The main program, of course.
+ Reads characters 1 by 1 from stdin, and makes lines out of them using
+ addchar. Handles line breaking, (which accounts for most of the
+ complexity in this function).
+
+****************************************************************************/
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+ inchr c,c2;
+ int i;
+ int last_was_eol_flag;
+/*---------------------------------------------------------------------------
+ wordbreakmode:
+ -1: /^$/ and blanks are to be absorbed (when line break was forced
+ by a blank or character larger than outlinelenlimit)
+ 0: /^ *$/ and blanks are not to be absorbed
+ 1: /[^ ]$/ no word break yet
+ 2: /[^ ] *$/
+ 3: /[^ ]$/ had a word break
+---------------------------------------------------------------------------*/
+ int wordbreakmode;
+ int char_not_added;
+
+ Myargc = argc;
+ Myargv = argv;
+ getparams();
+ readcontrolfiles();
+ readfont();
+ linealloc();
+
+ wordbreakmode = 0;
+ last_was_eol_flag = 0;
+
+ while ((c = getinchr())!=EOF) {
+
+ if (c=='\n'&&paragraphflag&&!last_was_eol_flag) {
+ ungetinchr(c2 = getinchr());
+ c = ((isascii(c2)&&isspace(c2))?'\n':' ');
+ }
+ last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
+
+ if (deutschflag) {
+ if (c>='[' && c<=']') {
+ c = deutsch[c-'['];
+ }
+ else if (c >='{' && c <= '~') {
+ c = deutsch[c-'{'+3];
+ }
+ }
+
+ c = handlemapping(c);
+
+ if (isascii(c)&&isspace(c)) {
+ c = (c=='\t'||c==' ') ? ' ' : '\n';
+ }
+
+ if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
+
+/*
+ Note: The following code is complex and thoroughly tested.
+ Be careful when modifying!
+*/
+
+ do {
+ char_not_added = 0;
+
+ if (wordbreakmode== -1) {
+ if (c==' ') {
+ break;
+ }
+ else if (c=='\n') {
+ wordbreakmode = 0;
+ break;
+ }
+ wordbreakmode = 0;
+ }
+
+ if (c=='\n') {
+ printline();
+ wordbreakmode = 0;
+ }
+
+ else if (addchar(c)) {
+ if (c!=' ') {
+ wordbreakmode = (wordbreakmode>=2)?3:1;
+ }
+ else {
+ wordbreakmode = (wordbreakmode>0)?2:0;
+ }
+ }
+
+ else if (outlinelen==0) {
+ for (i=0;i<charheight;i++) {
+ if (right2left && outputwidth>1) {
+ putstring(currchar[i]+MYSTRLEN(currchar[i])-outlinelenlimit);
+ }
+ else {
+ putstring(currchar[i]);
+ }
+ }
+ wordbreakmode = -1;
+ }
+
+ else if (c==' ') {
+ if (wordbreakmode==2) {
+ splitline();
+ }
+ else {
+ printline();
+ }
+ wordbreakmode = -1;
+ }
+
+ else {
+ if (wordbreakmode>=2) {
+ splitline();
+ }
+ else {
+ printline();
+ }
+ wordbreakmode = (wordbreakmode==3)?1:0;
+ char_not_added = 1;
+ }
+
+ } while (char_not_added);
+ }
+
+ if (outlinelen!=0) {
+ printline();
+ }
+
+ /* XXX Xen hack -- finish off the C macro output */
+ if ( nr_chars != 0 )
+ putchar('"');
+ putchar('\n');
+
+ exit(0);
+}
diff --git a/xen/tools/figlet/xen.flf b/xen/tools/figlet/xen.flf
new file mode 100644
index 0000000000..e13e842fd7
--- /dev/null
+++ b/xen/tools/figlet/xen.flf
@@ -0,0 +1,2230 @@
+flf2a$ 6 5 16 15 14 0 24463 229
+Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig
+Includes ISO Latin-1
+figlet release 2.1 -- 12 Aug 1994
+Modified for figlet 2.2 by John Cowan <cowan@ccil.org>
+ to add Latin-{2,3,4,5} support (Unicode U+0100-017F).
+Permission is hereby given to modify this font, as long as the
+modifier's name is placed on a comment line.
+
+Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
+supported by FIGlet and FIGWin. May also be slightly modified for better use
+of new full-width/kern/smush alternatives, but default output is NOT changed.
+
+Modified by Keir Fraser <kaf24@cl.cam.ac.uk> for Xen build system.
+
+ $@
+ $@
+ $@
+ $@
+ $@
+ $@@
+ _ @
+ | |@
+ | |@
+ |_|@
+ (_)@
+ @@
+ _ _ @
+ ( | )@
+ V V @
+ $ @
+ $ @
+ @@
+ _ _ @
+ _| || |_ @
+ |_ .. _|@
+ |_ _|@
+ |_||_| @
+ @@
+ _ @
+ | | @
+ / __)@
+ \__ \@
+ ( /@
+ |_| @@
+ _ __@
+ (_)/ /@
+ / / @
+ / /_ @
+ /_/(_)@
+ @@
+ ___ @
+ ( _ ) @
+ / _ \/\@
+ | (_> <@
+ \___/\/@
+ @@
+ _ @
+ ( )@
+ |/ @
+ $ @
+ $ @
+ @@
+ __@
+ / /@
+ | | @
+ | | @
+ | | @
+ \_\@@
+ __ @
+ \ \ @
+ | |@
+ | |@
+ | |@
+ /_/ @@
+ @
+ __/\__@
+ \ /@
+ /_ _\@
+ \/ @
+ @@
+ @
+ _ @
+ _| |_ @
+ |_ _|@
+ |_| @
+ @@
+ @
+ @
+ @
+ _ @
+ ( )@
+ |/ @@
+ @
+ @
+ __ @
+ |__|@
+ $ @
+ @@
+ @
+ @
+ @
+ _ @
+ (_)@
+ @@
+ __@
+ / /@
+ / / @
+ / / @
+ /_/ @
+ @@
+ ___ @
+ / _ \ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+ _ @
+ / |@
+ | |@
+ | |@
+ |_|@
+ @@
+ ____ @
+ |___ \ @
+ __) |@
+ / __/ @
+ |_____|@
+ @@
+ _____ @
+ |___ / @
+ |_ \ @
+ ___) |@
+ |____/ @
+ @@
+ _ _ @
+ | || | @
+ | || |_ @
+ |__ _|@
+ |_| @
+ @@
+ ____ @
+ | ___| @
+ |___ \ @
+ ___) |@
+ |____/ @
+ @@
+ __ @
+ / /_ @
+ | '_ \ @
+ | (_) |@
+ \___/ @
+ @@
+ _____ @
+ |___ |@
+ / / @
+ / / @
+ /_/ @
+ @@
+ ___ @
+ ( _ ) @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+ ___ @
+ / _ \ @
+ | (_) |@
+ \__, |@
+ /_/ @
+ @@
+ @
+ _ @
+ (_)@
+ _ @
+ (_)@
+ @@
+ @
+ _ @
+ (_)@
+ _ @
+ ( )@
+ |/ @@
+ __@
+ / /@
+ / / @
+ \ \ @
+ \_\@
+ @@
+ @
+ _____ @
+ |_____|@
+ |_____|@
+ $ @
+ @@
+ __ @
+ \ \ @
+ \ \@
+ / /@
+ /_/ @
+ @@
+ ___ @
+ |__ \@
+ / /@
+ |_| @
+ (_) @
+ @@
+ ____ @
+ / __ \ @
+ / / _` |@
+ | | (_| |@
+ \ \__,_|@
+ \____/ @@
+ _ @
+ / \ @
+ / _ \ @
+ / ___ \ @
+ /_/ \_\@
+ @@
+ ____ @
+ | __ ) @
+ | _ \ @
+ | |_) |@
+ |____/ @
+ @@
+ ____ @
+ / ___|@
+ | | @
+ | |___ @
+ \____|@
+ @@
+ ____ @
+ | _ \ @
+ | | | |@
+ | |_| |@
+ |____/ @
+ @@
+ _____ @
+ | ____|@
+ | _| @
+ | |___ @
+ |_____|@
+ @@
+ _____ @
+ | ___|@
+ | |_ @
+ | _| @
+ |_| @
+ @@
+ ____ @
+ / ___|@
+ | | _ @
+ | |_| |@
+ \____|@
+ @@
+ _ _ @
+ | | | |@
+ | |_| |@
+ | _ |@
+ |_| |_|@
+ @@
+ ___ @
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ @@
+ _ @
+ | |@
+ _ | |@
+ | |_| |@
+ \___/ @
+ @@
+ _ __@
+ | |/ /@
+ | ' / @
+ | . \ @
+ |_|\_\@
+ @@
+ _ @
+ | | @
+ | | @
+ | |___ @
+ |_____|@
+ @@
+ __ __ @
+ | \/ |@
+ | |\/| |@
+ | | | |@
+ |_| |_|@
+ @@
+ _ _ @
+ | \ | |@
+ | \| |@
+ | |\ |@
+ |_| \_|@
+ @@
+ ___ @
+ / _ \ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+ ____ @
+ | _ \ @
+ | |_) |@
+ | __/ @
+ |_| @
+ @@
+ ___ @
+ / _ \ @
+ | | | |@
+ | |_| |@
+ \__\_\@
+ @@
+ ____ @
+ | _ \ @
+ | |_) |@
+ | _ < @
+ |_| \_\@
+ @@
+ ____ @
+ / ___| @
+ \___ \ @
+ ___) |@
+ |____/ @
+ @@
+ _____ @
+ |_ _|@
+ | | @
+ | | @
+ |_| @
+ @@
+ _ _ @
+ | | | |@
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+ __ __@
+ \ \ / /@
+ \ \ / / @
+ \ V / @
+ \_/ @
+ @@
+ __ __@
+ \ \ / /@
+ \ \ /\ / / @
+ \ V V / @
+ \_/\_/ @
+ @@
+ __ __@
+ \ \/ /@
+ \ / @
+ / \ @
+ /_/\_\@
+ @@
+ __ __@
+ \ \ / /@
+ \ V / @
+ | | @
+ |_| @
+ @@
+ _____@
+ |__ /@
+ / / @
+ / /_ @
+ /____|@
+ @@
+ __ @
+ | _|@
+ | | @
+ | | @
+ | | @
+ |__|@@
+ __ @
+ \ \ @
+ \ \ @
+ \ \ @
+ \_\@
+ @@
+ __ @
+ |_ |@
+ | |@
+ | |@
+ | |@
+ |__|@@
+ /\ @
+ |/\|@
+ $ @
+ $ @
+ $ @
+ @@
+ @
+ @
+ @
+ @
+ _____ @
+ |_____|@@
+ _ @
+ ( )@
+ \|@
+ $ @
+ $ @
+ @@
+ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+ _ @
+ | |__ @
+ | '_ \ @
+ | |_) |@
+ |_.__/ @
+ @@
+ @
+ ___ @
+ / __|@
+ | (__ @
+ \___|@
+ @@
+ _ @
+ __| |@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+ @
+ ___ @
+ / _ \@
+ | __/@
+ \___|@
+ @@
+ __ @
+ / _|@
+ | |_ @
+ | _|@
+ |_| @
+ @@
+ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__, |@
+ |___/ @@
+ _ @
+ | |__ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+ _ @
+ (_)@
+ | |@
+ | |@
+ |_|@
+ @@
+ _ @
+ (_)@
+ | |@
+ | |@
+ _/ |@
+ |__/ @@
+ _ @
+ | | __@
+ | |/ /@
+ | < @
+ |_|\_\@
+ @@
+ _ @
+ | |@
+ | |@
+ | |@
+ |_|@
+ @@
+ @
+ _ __ ___ @
+ | '_ ` _ \ @
+ | | | | | |@
+ |_| |_| |_|@
+ @@
+ @
+ _ __ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+ @
+ ___ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+ @
+ _ __ @
+ | '_ \ @
+ | |_) |@
+ | .__/ @
+ |_| @@
+ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__, |@
+ |_|@@
+ @
+ _ __ @
+ | '__|@
+ | | @
+ |_| @
+ @@
+ @
+ ___ @
+ / __|@
+ \__ \@
+ |___/@
+ @@
+ _ @
+ | |_ @
+ | __|@
+ | |_ @
+ \__|@
+ @@
+ @
+ _ _ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+ @
+ __ __@
+ \ \ / /@
+ \ V / @
+ \_/ @
+ @@
+ @
+ __ __@
+ \ \ /\ / /@
+ \ V V / @
+ \_/\_/ @
+ @@
+ @
+ __ __@
+ \ \/ /@
+ > < @
+ /_/\_\@
+ @@
+ @
+ _ _ @
+ | | | |@
+ | |_| |@
+ \__, |@
+ |___/ @@
+ @
+ ____@
+ |_ /@
+ / / @
+ /___|@
+ @@
+ __@
+ / /@
+ | | @
+ < < @
+ | | @
+ \_\@@
+ _ @
+ | |@
+ | |@
+ | |@
+ | |@
+ |_|@@
+ __ @
+ \ \ @
+ | | @
+ > >@
+ | | @
+ /_/ @@
+ /\/|@
+ |/\/ @
+ $ @
+ $ @
+ $ @
+ @@
+ _ _ @
+ (_)_(_)@
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+ _ _ @
+ (_)_(_)@
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+ _ _ @
+ (_)_(_)@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+ _ _ @
+ (_)_(_)@
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+ ___ @
+ / _ \@
+ | |/ /@
+ | |\ \@
+ | ||_/@
+ |_| @@
+160 NO-BREAK SPACE
+ $@
+ $@
+ $@
+ $@
+ $@
+ $@@
+161 INVERTED EXCLAMATION MARK
+ _ @
+ (_)@
+ | |@
+ | |@
+ |_|@
+ @@
+162 CENT SIGN
+ _ @
+ | | @
+ / __)@
+ | (__ @
+ \ )@
+ |_| @@
+163 POUND SIGN
+ ___ @
+ / ,_\ @
+ _| |_ @
+ | |___ @
+ (_,____|@
+ @@
+164 CURRENCY SIGN
+ /\___/\@
+ \ _ /@
+ | (_) |@
+ / ___ \@
+ \/ \/@
+ @@
+165 YEN SIGN
+ __ __ @
+ \ V / @
+ |__ __|@
+ |__ __|@
+ |_| @
+ @@
+166 BROKEN BAR
+ _ @
+ | |@
+ |_|@
+ _ @
+ | |@
+ |_|@@
+167 SECTION SIGN
+ __ @
+ _/ _)@
+ / \ \ @
+ \ \\ \@
+ \ \_/@
+ (__/ @@
+168 DIAERESIS
+ _ _ @
+ (_) (_)@
+ $ $ @
+ $ $ @
+ $ $ @
+ @@
+169 COPYRIGHT SIGN
+ _____ @
+ / ___ \ @
+ / / __| \ @
+ | | (__ |@
+ \ \___| / @
+ \_____/ @@
+170 FEMININE ORDINAL INDICATOR
+ __ _ @
+ / _` |@
+ \__,_|@
+ |____|@
+ $ @
+ @@
+171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ ____@
+ / / /@
+ / / / @
+ \ \ \ @
+ \_\_\@
+ @@
+172 NOT SIGN
+ @
+ _____ @
+ |___ |@
+ |_|@
+ $ @
+ @@
+173 SOFT HYPHEN
+ @
+ @
+ ____ @
+ |____|@
+ $ @
+ @@
+174 REGISTERED SIGN
+ _____ @
+ / ___ \ @
+ / | _ \ \ @
+ | | / |@
+ \ |_|_\ / @
+ \_____/ @@
+175 MACRON
+ _____ @
+ |_____|@
+ $ @
+ $ @
+ $ @
+ @@
+176 DEGREE SIGN
+ __ @
+ / \ @
+ | () |@
+ \__/ @
+ $ @
+ @@
+177 PLUS-MINUS SIGN
+ _ @
+ _| |_ @
+ |_ _|@
+ _|_|_ @
+ |_____|@
+ @@
+178 SUPERSCRIPT TWO
+ ___ @
+ |_ )@
+ / / @
+ /___|@
+ $ @
+ @@
+179 SUPERSCRIPT THREE
+ ____@
+ |__ /@
+ |_ \@
+ |___/@
+ $ @
+ @@
+180 ACUTE ACCENT
+ __@
+ /_/@
+ $ @
+ $ @
+ $ @
+ @@
+181 MICRO SIGN
+ @
+ _ _ @
+ | | | |@
+ | |_| |@
+ | ._,_|@
+ |_| @@
+182 PILCROW SIGN
+ _____ @
+ / |@
+ | (| | |@
+ \__ | |@
+ |_|_|@
+ @@
+183 MIDDLE DOT
+ @
+ _ @
+ (_)@
+ $ @
+ $ @
+ @@
+184 CEDILLA
+ @
+ @
+ @
+ @
+ _ @
+ )_)@@
+185 SUPERSCRIPT ONE
+ _ @
+ / |@
+ | |@
+ |_|@
+ $ @
+ @@
+186 MASCULINE ORDINAL INDICATOR
+ ___ @
+ / _ \@
+ \___/@
+ |___|@
+ $ @
+ @@
+187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ ____ @
+ \ \ \ @
+ \ \ \@
+ / / /@
+ /_/_/ @
+ @@
+188 VULGAR FRACTION ONE QUARTER
+ _ __ @
+ / | / / _ @
+ | |/ / | | @
+ |_/ /|_ _|@
+ /_/ |_| @
+ @@
+189 VULGAR FRACTION ONE HALF
+ _ __ @
+ / | / /__ @
+ | |/ /_ )@
+ |_/ / / / @
+ /_/ /___|@
+ @@
+190 VULGAR FRACTION THREE QUARTERS
+ ____ __ @
+ |__ / / / _ @
+ |_ \/ / | | @
+ |___/ /|_ _|@
+ /_/ |_| @
+ @@
+191 INVERTED QUESTION MARK
+ _ @
+ (_) @
+ | | @
+ / /_ @
+ \___|@
+ @@
+192 LATIN CAPITAL LETTER A WITH GRAVE
+ __ @
+ \_\ @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+193 LATIN CAPITAL LETTER A WITH ACUTE
+ __ @
+ /_/ @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ //\ @
+ |/_\| @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+195 LATIN CAPITAL LETTER A WITH TILDE
+ /\/| @
+ |/\/ @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+196 LATIN CAPITAL LETTER A WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+197 LATIN CAPITAL LETTER A WITH RING ABOVE
+ _ @
+ (o) @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+198 LATIN CAPITAL LETTER AE
+ ______ @
+ / ____|@
+ / _ _| @
+ / __ |___ @
+ /_/ |_____|@
+ @@
+199 LATIN CAPITAL LETTER C WITH CEDILLA
+ ____ @
+ / ___|@
+ | | @
+ | |___ @
+ \____|@
+ )_) @@
+200 LATIN CAPITAL LETTER E WITH GRAVE
+ __ @
+ _\_\_ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+201 LATIN CAPITAL LETTER E WITH ACUTE
+ __ @
+ _/_/_ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ //\ @
+ |/_\| @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+203 LATIN CAPITAL LETTER E WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+204 LATIN CAPITAL LETTER I WITH GRAVE
+ __ @
+ \_\ @
+ |_ _|@
+ | | @
+ |___|@
+ @@
+205 LATIN CAPITAL LETTER I WITH ACUTE
+ __ @
+ /_/ @
+ |_ _|@
+ | | @
+ |___|@
+ @@
+206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ //\ @
+ |/_\|@
+ |_ _|@
+ | | @
+ |___|@
+ @@
+207 LATIN CAPITAL LETTER I WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ |_ _| @
+ | | @
+ |___| @
+ @@
+208 LATIN CAPITAL LETTER ETH
+ ____ @
+ | _ \ @
+ _| |_| |@
+ |__ __| |@
+ |____/ @
+ @@
+209 LATIN CAPITAL LETTER N WITH TILDE
+ /\/|@
+ |/\/ @
+ | \| |@
+ | .` |@
+ |_|\_|@
+ @@
+210 LATIN CAPITAL LETTER O WITH GRAVE
+ __ @
+ \_\ @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+211 LATIN CAPITAL LETTER O WITH ACUTE
+ __ @
+ /_/ @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ //\ @
+ |/_\| @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+213 LATIN CAPITAL LETTER O WITH TILDE
+ /\/| @
+ |/\/ @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+214 LATIN CAPITAL LETTER O WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+215 MULTIPLICATION SIGN
+ @
+ @
+ /\/\@
+ > <@
+ \/\/@
+ @@
+216 LATIN CAPITAL LETTER O WITH STROKE
+ ____ @
+ / _// @
+ | |// |@
+ | //| |@
+ //__/ @
+ @@
+217 LATIN CAPITAL LETTER U WITH GRAVE
+ __ @
+ _\_\_ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+218 LATIN CAPITAL LETTER U WITH ACUTE
+ __ @
+ _/_/_ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ //\ @
+ |/ \| @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+220 LATIN CAPITAL LETTER U WITH DIAERESIS
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+221 LATIN CAPITAL LETTER Y WITH ACUTE
+ __ @
+ __/_/__@
+ \ \ / /@
+ \ V / @
+ |_| @
+ @@
+222 LATIN CAPITAL LETTER THORN
+ _ @
+ | |___ @
+ | __ \@
+ | ___/@
+ |_| @
+ @@
+223 LATIN SMALL LETTER SHARP S
+ ___ @
+ / _ \@
+ | |/ /@
+ | |\ \@
+ | ||_/@
+ |_| @@
+224 LATIN SMALL LETTER A WITH GRAVE
+ __ @
+ \_\_ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+225 LATIN SMALL LETTER A WITH ACUTE
+ __ @
+ /_/_ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+226 LATIN SMALL LETTER A WITH CIRCUMFLEX
+ //\ @
+ |/_\| @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+227 LATIN SMALL LETTER A WITH TILDE
+ /\/| @
+ |/\/_ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+228 LATIN SMALL LETTER A WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+229 LATIN SMALL LETTER A WITH RING ABOVE
+ __ @
+ (()) @
+ / _ '|@
+ | (_| |@
+ \__,_|@
+ @@
+230 LATIN SMALL LETTER AE
+ @
+ __ ____ @
+ / _` _ \@
+ | (_| __/@
+ \__,____|@
+ @@
+231 LATIN SMALL LETTER C WITH CEDILLA
+ @
+ ___ @
+ / __|@
+ | (__ @
+ \___|@
+ )_) @@
+232 LATIN SMALL LETTER E WITH GRAVE
+ __ @
+ \_\ @
+ / _ \@
+ | __/@
+ \___|@
+ @@
+233 LATIN SMALL LETTER E WITH ACUTE
+ __ @
+ /_/ @
+ / _ \@
+ | __/@
+ \___|@
+ @@
+234 LATIN SMALL LETTER E WITH CIRCUMFLEX
+ //\ @
+ |/_\|@
+ / _ \@
+ | __/@
+ \___|@
+ @@
+235 LATIN SMALL LETTER E WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ / _ \ @
+ | __/ @
+ \___| @
+ @@
+236 LATIN SMALL LETTER I WITH GRAVE
+ __ @
+ \_\@
+ | |@
+ | |@
+ |_|@
+ @@
+237 LATIN SMALL LETTER I WITH ACUTE
+ __@
+ /_/@
+ | |@
+ | |@
+ |_|@
+ @@
+238 LATIN SMALL LETTER I WITH CIRCUMFLEX
+ //\ @
+ |/_\|@
+ | | @
+ | | @
+ |_| @
+ @@
+239 LATIN SMALL LETTER I WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ | | @
+ | | @
+ |_| @
+ @@
+240 LATIN SMALL LETTER ETH
+ /\/\ @
+ > < @
+ _\/\ |@
+ / __` |@
+ \____/ @
+ @@
+241 LATIN SMALL LETTER N WITH TILDE
+ /\/| @
+ |/\/ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+242 LATIN SMALL LETTER O WITH GRAVE
+ __ @
+ \_\ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+243 LATIN SMALL LETTER O WITH ACUTE
+ __ @
+ /_/ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+244 LATIN SMALL LETTER O WITH CIRCUMFLEX
+ //\ @
+ |/_\| @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+245 LATIN SMALL LETTER O WITH TILDE
+ /\/| @
+ |/\/ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+246 LATIN SMALL LETTER O WITH DIAERESIS
+ _ _ @
+ (_)_(_)@
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+247 DIVISION SIGN
+ @
+ _ @
+ _(_)_ @
+ |_____|@
+ (_) @
+ @@
+248 LATIN SMALL LETTER O WITH STROKE
+ @
+ ____ @
+ / _//\ @
+ | (//) |@
+ \//__/ @
+ @@
+249 LATIN SMALL LETTER U WITH GRAVE
+ __ @
+ _\_\_ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+250 LATIN SMALL LETTER U WITH ACUTE
+ __ @
+ _/_/_ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+251 LATIN SMALL LETTER U WITH CIRCUMFLEX
+ //\ @
+ |/ \| @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+252 LATIN SMALL LETTER U WITH DIAERESIS
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+253 LATIN SMALL LETTER Y WITH ACUTE
+ __ @
+ _/_/_ @
+ | | | |@
+ | |_| |@
+ \__, |@
+ |___/ @@
+254 LATIN SMALL LETTER THORN
+ _ @
+ | |__ @
+ | '_ \ @
+ | |_) |@
+ | .__/ @
+ |_| @@
+255 LATIN SMALL LETTER Y WITH DIAERESIS
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | |_| |@
+ \__, |@
+ |___/ @@
+0x0100 LATIN CAPITAL LETTER A WITH MACRON
+ ____ @
+ /___/ @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+0x0101 LATIN SMALL LETTER A WITH MACRON
+ ___ @
+ /_ _/@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+0x0102 LATIN CAPITAL LETTER A WITH BREVE
+ _ _ @
+ \\_// @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ @@
+0x0103 LATIN SMALL LETTER A WITH BREVE
+ \_/ @
+ ___ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+0x0104 LATIN CAPITAL LETTER A WITH OGONEK
+ @
+ _ @
+ /_\ @
+ / _ \ @
+ /_/ \_\@
+ (_(@@
+0x0105 LATIN SMALL LETTER A WITH OGONEK
+ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__,_|@
+ (_(@@
+0x0106 LATIN CAPITAL LETTER C WITH ACUTE
+ __ @
+ _/_/ @
+ / ___|@
+ | |___ @
+ \____|@
+ @@
+0x0107 LATIN SMALL LETTER C WITH ACUTE
+ __ @
+ /__/@
+ / __|@
+ | (__ @
+ \___|@
+ @@
+0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ /\ @
+ _//\\@
+ / ___|@
+ | |___ @
+ \____|@
+ @@
+0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+ /\ @
+ /_\ @
+ / __|@
+ | (__ @
+ \___|@
+ @@
+0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+ [] @
+ ____ @
+ / ___|@
+ | |___ @
+ \____|@
+ @@
+0x010B LATIN SMALL LETTER C WITH DOT ABOVE
+ [] @
+ ___ @
+ / __|@
+ | (__ @
+ \___|@
+ @@
+0x010C LATIN CAPITAL LETTER C WITH CARON
+ \\// @
+ _\/_ @
+ / ___|@
+ | |___ @
+ \____|@
+ @@
+0x010D LATIN SMALL LETTER C WITH CARON
+ \\//@
+ _\/ @
+ / __|@
+ | (__ @
+ \___|@
+ @@
+0x010E LATIN CAPITAL LETTER D WITH CARON
+ \\// @
+ __\/ @
+ | _ \ @
+ | |_| |@
+ |____/ @
+ @@
+0x010F LATIN SMALL LETTER D WITH CARON
+ \/ _ @
+ __| |@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+0x0110 LATIN CAPITAL LETTER D WITH STROKE
+ ____ @
+ |_ __ \ @
+ /| |/ | |@
+ /|_|/_| |@
+ |_____/ @
+ @@
+0x0111 LATIN SMALL LETTER D WITH STROKE
+ ---|@
+ __| |@
+ / _` |@
+ | (_| |@
+ \__,_|@
+ @@
+0x0112 LATIN CAPITAL LETTER E WITH MACRON
+ ____ @
+ /___/ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+0x0113 LATIN SMALL LETTER E WITH MACRON
+ ____@
+ /_ _/@
+ / _ \ @
+ | __/ @
+ \___| @
+ @@
+0x0114 LATIN CAPITAL LETTER E WITH BREVE
+ _ _ @
+ \\_// @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+0x0115 LATIN SMALL LETTER E WITH BREVE
+ \\ //@
+ -- @
+ / _ \ @
+ | __/ @
+ \___| @
+ @@
+0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+ [] @
+ _____ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+0x0117 LATIN SMALL LETTER E WITH DOT ABOVE
+ [] @
+ __ @
+ / _ \@
+ | __/@
+ \___|@
+ @@
+0x0118 LATIN CAPITAL LETTER E WITH OGONEK
+ @
+ _____ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ (__(@@
+0x0119 LATIN SMALL LETTER E WITH OGONEK
+ @
+ ___ @
+ / _ \@
+ | __/@
+ \___|@
+ (_(@@
+0x011A LATIN CAPITAL LETTER E WITH CARON
+ \\// @
+ __\/_ @
+ | ____|@
+ | _|_ @
+ |_____|@
+ @@
+0x011B LATIN SMALL LETTER E WITH CARON
+ \\//@
+ \/ @
+ / _ \@
+ | __/@
+ \___|@
+ @@
+0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ _/\_ @
+ / ___|@
+ | | _ @
+ | |_| |@
+ \____|@
+ @@
+0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX
+ /\ @
+ _/_ \@
+ / _` |@
+ | (_| |@
+ \__, |@
+ |___/ @@
+0x011E LATIN CAPITAL LETTER G WITH BREVE
+ _\/_ @
+ / ___|@
+ | | _ @
+ | |_| |@
+ \____|@
+ @@
+0x011F LATIN SMALL LETTER G WITH BREVE
+ \___/ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__, |@
+ |___/ @@
+0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+ _[]_ @
+ / ___|@
+ | | _ @
+ | |_| |@
+ \____|@
+ @@
+0x0121 LATIN SMALL LETTER G WITH DOT ABOVE
+ [] @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__, |@
+ |___/ @@
+0x0122 LATIN CAPITAL LETTER G WITH CEDILLA
+ ____ @
+ / ___|@
+ | | _ @
+ | |_| |@
+ \____|@
+ )__) @@
+0x0123 LATIN SMALL LETTER G WITH CEDILLA
+ @
+ __ _ @
+ / _` |@
+ | (_| |@
+ \__, |@
+ |_))))@@
+0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ _/ \_ @
+ | / \ |@
+ | |_| |@
+ | _ |@
+ |_| |_|@
+ @@
+0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+ _ /\ @
+ | |//\ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+0x0126 LATIN CAPITAL LETTER H WITH STROKE
+ _ _ @
+ | |=| |@
+ | |_| |@
+ | _ |@
+ |_| |_|@
+ @@
+0x0127 LATIN SMALL LETTER H WITH STROKE
+ _ @
+ |=|__ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+0x0128 LATIN CAPITAL LETTER I WITH TILDE
+ /\//@
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ @@
+0x0129 LATIN SMALL LETTER I WITH TILDE
+ @
+ /\/@
+ | |@
+ | |@
+ |_|@
+ @@
+0x012A LATIN CAPITAL LETTER I WITH MACRON
+ /___/@
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ @@
+0x012B LATIN SMALL LETTER I WITH MACRON
+ ____@
+ /___/@
+ | | @
+ | | @
+ |_| @
+ @@
+0x012C LATIN CAPITAL LETTER I WITH BREVE
+ \__/@
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ @@
+0x012D LATIN SMALL LETTER I WITH BREVE
+ @
+ \_/@
+ | |@
+ | |@
+ |_|@
+ @@
+0x012E LATIN CAPITAL LETTER I WITH OGONEK
+ ___ @
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ (__(@@
+0x012F LATIN SMALL LETTER I WITH OGONEK
+ _ @
+ (_) @
+ | | @
+ | | @
+ |_|_@
+ (_(@@
+0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+ _[] @
+ |_ _|@
+ | | @
+ | | @
+ |___|@
+ @@
+0x0131 LATIN SMALL LETTER DOTLESS I
+ @
+ _ @
+ | |@
+ | |@
+ |_|@
+ @@
+0x0132 LATIN CAPITAL LIGATURE IJ
+ ___ _ @
+ |_ _|| |@
+ | | | |@
+ | |_| |@
+ |__|__/ @
+ @@
+0x0133 LATIN SMALL LIGATURE IJ
+ _ _ @
+ (_) (_)@
+ | | | |@
+ | | | |@
+ |_|_/ |@
+ |__/ @@
+0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ /\ @
+ /_\|@
+ _ | | @
+ | |_| | @
+ \___/ @
+ @@
+0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+ /\@
+ /_\@
+ | |@
+ | |@
+ _/ |@
+ |__/ @@
+0x0136 LATIN CAPITAL LETTER K WITH CEDILLA
+ _ _ @
+ | |/ / @
+ | ' / @
+ | . \ @
+ |_|\_\ @
+ )__)@@
+0x0137 LATIN SMALL LETTER K WITH CEDILLA
+ _ @
+ | | __@
+ | |/ /@
+ | < @
+ |_|\_\@
+ )_)@@
+0x0138 LATIN SMALL LETTER KRA
+ @
+ _ __ @
+ | |/ \@
+ | < @
+ |_|\_\@
+ @@
+0x0139 LATIN CAPITAL LETTER L WITH ACUTE
+ _ //@
+ | | // @
+ | | @
+ | |___ @
+ |_____|@
+ @@
+0x013A LATIN SMALL LETTER L WITH ACUTE
+ //@
+ | |@
+ | |@
+ | |@
+ |_|@
+ @@
+0x013B LATIN CAPITAL LETTER L WITH CEDILLA
+ _ @
+ | | @
+ | | @
+ | |___ @
+ |_____|@
+ )__)@@
+0x013C LATIN SMALL LETTER L WITH CEDILLA
+ _ @
+ | | @
+ | | @
+ | | @
+ |_| @
+ )_)@@
+0x013D LATIN CAPITAL LETTER L WITH CARON
+ _ \\//@
+ | | \/ @
+ | | @
+ | |___ @
+ |_____|@
+ @@
+0x013E LATIN SMALL LETTER L WITH CARON
+ _ \\//@
+ | | \/ @
+ | | @
+ | | @
+ |_| @
+ @@
+0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ _ @
+ | | @
+ | | [] @
+ | |___ @
+ |_____|@
+ @@
+0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT
+ _ @
+ | | @
+ | | []@
+ | | @
+ |_| @
+ @@
+0x0141 LATIN CAPITAL LETTER L WITH STROKE
+ __ @
+ | // @
+ |//| @
+ // |__ @
+ |_____|@
+ @@
+0x0142 LATIN SMALL LETTER L WITH STROKE
+ _ @
+ | |@
+ |//@
+ //|@
+ |_|@
+ @@
+0x0143 LATIN CAPITAL LETTER N WITH ACUTE
+ _/ /_ @
+ | \ | |@
+ | \| |@
+ | |\ |@
+ |_| \_|@
+ @@
+0x0144 LATIN SMALL LETTER N WITH ACUTE
+ _ @
+ _ /_/ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+0x0145 LATIN CAPITAL LETTER N WITH CEDILLA
+ _ _ @
+ | \ | |@
+ | \| |@
+ | |\ |@
+ |_| \_|@
+ )_) @@
+0x0146 LATIN SMALL LETTER N WITH CEDILLA
+ @
+ _ __ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ )_) @@
+0x0147 LATIN CAPITAL LETTER N WITH CARON
+ _\/ _ @
+ | \ | |@
+ | \| |@
+ | |\ |@
+ |_| \_|@
+ @@
+0x0148 LATIN SMALL LETTER N WITH CARON
+ \\// @
+ _\/_ @
+ | '_ \ @
+ | | | |@
+ |_| |_|@
+ @@
+0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ @
+ _ __ @
+ ( )| '_\ @
+ |/| | | |@
+ |_| |_|@
+ @@
+0x014A LATIN CAPITAL LETTER ENG
+ _ _ @
+ | \ | |@
+ | \| |@
+ | |\ |@
+ |_| \ |@
+ )_)@@
+0x014B LATIN SMALL LETTER ENG
+ _ __ @
+ | '_ \ @
+ | | | |@
+ |_| | |@
+ | |@
+ |__ @@
+0x014C LATIN CAPITAL LETTER O WITH MACRON
+ ____ @
+ /_ _/ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+0x014D LATIN SMALL LETTER O WITH MACRON
+ ____ @
+ /_ _/ @
+ / _ \ @
+ | (_) |@
+ \___/ @
+ @@
+0x014E LATIN CAPITAL LETTER O WITH BREVE
+ \ / @
+ _-_ @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+0x014F LATIN SMALL LETTER O WITH BREVE
+ \ / @
+ _-_ @
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ ___ @
+ /_/_/@
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ ___ @
+ /_/_/@
+ / _ \ @
+ | |_| |@
+ \___/ @
+ @@
+0x0152 LATIN CAPITAL LIGATURE OE
+ ___ ___ @
+ / _ \| __|@
+ | | | | | @
+ | |_| | |__@
+ \___/|____@
+ @@
+0x0153 LATIN SMALL LIGATURE OE
+ @
+ ___ ___ @
+ / _ \ / _ \@
+ | (_) | __/@
+ \___/ \___|@
+ @@
+0x0154 LATIN CAPITAL LETTER R WITH ACUTE
+ _/_/ @
+ | _ \ @
+ | |_) |@
+ | _ < @
+ |_| \_\@
+ @@
+0x0155 LATIN SMALL LETTER R WITH ACUTE
+ __@
+ _ /_/@
+ | '__|@
+ | | @
+ |_| @
+ @@
+0x0156 LATIN CAPITAL LETTER R WITH CEDILLA
+ ____ @
+ | _ \ @
+ | |_) |@
+ | _ < @
+ |_| \_\@
+ )_) @@
+0x0157 LATIN SMALL LETTER R WITH CEDILLA
+ @
+ _ __ @
+ | '__|@
+ | | @
+ |_| @
+ )_) @@
+0x0158 LATIN CAPITAL LETTER R WITH CARON
+ _\_/ @
+ | _ \ @
+ | |_) |@
+ | _ < @
+ |_| \_\@
+ @@
+0x0159 LATIN SMALL LETTER R WITH CARON
+ \\// @
+ _\/_ @
+ | '__|@
+ | | @
+ |_| @
+ @@
+0x015A LATIN CAPITAL LETTER S WITH ACUTE
+ _/_/ @
+ / ___| @
+ \___ \ @
+ ___) |@
+ |____/ @
+ @@
+0x015B LATIN SMALL LETTER S WITH ACUTE
+ __@
+ _/_/@
+ / __|@
+ \__ \@
+ |___/@
+ @@
+0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ _/\_ @
+ / ___| @
+ \___ \ @
+ ___) |@
+ |____/ @
+ @@
+0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX
+ @
+ /_\_@
+ / __|@
+ \__ \@
+ |___/@
+ @@
+0x015E LATIN CAPITAL LETTER S WITH CEDILLA
+ ____ @
+ / ___| @
+ \___ \ @
+ ___) |@
+ |____/ @
+ )__)@@
+0x015F LATIN SMALL LETTER S WITH CEDILLA
+ @
+ ___ @
+ / __|@
+ \__ \@
+ |___/@
+ )_)@@
+0x0160 LATIN CAPITAL LETTER S WITH CARON
+ _\_/ @
+ / ___| @
+ \___ \ @
+ ___) |@
+ |____/ @
+ @@
+0x0161 LATIN SMALL LETTER S WITH CARON
+ \\//@
+ _\/ @
+ / __|@
+ \__ \@
+ |___/@
+ @@
+0x0162 LATIN CAPITAL LETTER T WITH CEDILLA
+ _____ @
+ |_ _|@
+ | | @
+ | | @
+ |_| @
+ )__)@@
+0x0163 LATIN SMALL LETTER T WITH CEDILLA
+ _ @
+ | |_ @
+ | __|@
+ | |_ @
+ \__|@
+ )_)@@
+0x0164 LATIN CAPITAL LETTER T WITH CARON
+ _____ @
+ |_ _|@
+ | | @
+ | | @
+ |_| @
+ @@
+0x0165 LATIN SMALL LETTER T WITH CARON
+ \/ @
+ | |_ @
+ | __|@
+ | |_ @
+ \__|@
+ @@
+0x0166 LATIN CAPITAL LETTER T WITH STROKE
+ _____ @
+ |_ _|@
+ | | @
+ -|-|- @
+ |_| @
+ @@
+0x0167 LATIN SMALL LETTER T WITH STROKE
+ _ @
+ | |_ @
+ | __|@
+ |-|_ @
+ \__|@
+ @@
+0x0168 LATIN CAPITAL LETTER U WITH TILDE
+ @
+ _/\/_ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+0x0169 LATIN SMALL LETTER U WITH TILDE
+ @
+ _/\/_ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+0x016A LATIN CAPITAL LETTER U WITH MACRON
+ ____ @
+ /__ _/@
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+0x016B LATIN SMALL LETTER U WITH MACRON
+ ____ @
+ / _ /@
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+0x016C LATIN CAPITAL LETTER U WITH BREVE
+ @
+ \_/_ @
+ | | | |@
+ | |_| |@
+ \____|@
+ @@
+0x016D LATIN SMALL LETTER U WITH BREVE
+ @
+ \_/_ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+0x016E LATIN CAPITAL LETTER U WITH RING ABOVE
+ O @
+ __ _ @
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+0x016F LATIN SMALL LETTER U WITH RING ABOVE
+ O @
+ __ __ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ -- --@
+ /_//_/@
+ | | | |@
+ | |_| |@
+ \___/ @
+ @@
+0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ ____@
+ _/_/_/@
+ | | | |@
+ | |_| |@
+ \__,_|@
+ @@
+0x0172 LATIN CAPITAL LETTER U WITH OGONEK
+ _ _ @
+ | | | |@
+ | | | |@
+ | |_| |@
+ \___/ @
+ (__(@@
+0x0173 LATIN SMALL LETTER U WITH OGONEK
+ @
+ _ _ @
+ | | | |@
+ | |_| |@
+ \__,_|@
+ (_(@@
+0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ __ /\ __@
+ \ \ //\\/ /@
+ \ \ /\ / / @
+ \ V V / @
+ \_/\_/ @
+ @@
+0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+ /\ @
+ __ //\\__@
+ \ \ /\ / /@
+ \ V V / @
+ \_/\_/ @
+ @@
+0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ /\ @
+ __//\\ @
+ \ \ / /@
+ \ V / @
+ |_| @
+ @@
+0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ /\ @
+ //\\ @
+ | | | |@
+ | |_| |@
+ \__, |@
+ |___/ @@
+0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+ [] []@
+ __ _@
+ \ \ / /@
+ \ V / @
+ |_| @
+ @@
+0x0179 LATIN CAPITAL LETTER Z WITH ACUTE
+ __/_/@
+ |__ /@
+ / / @
+ / /_ @
+ /____|@
+ @@
+0x017A LATIN SMALL LETTER Z WITH ACUTE
+ _ @
+ _/_/@
+ |_ /@
+ / / @
+ /___|@
+ @@
+0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ __[]_@
+ |__ /@
+ / / @
+ / /_ @
+ /____|@
+ @@
+0x017C LATIN SMALL LETTER Z WITH DOT ABOVE
+ [] @
+ ____@
+ |_ /@
+ / / @
+ /___|@
+ @@
+0x017D LATIN CAPITAL LETTER Z WITH CARON
+ _\_/_@
+ |__ /@
+ / / @
+ / /_ @
+ /____|@
+ @@
+0x017E LATIN SMALL LETTER Z WITH CARON
+ \\//@
+ _\/_@
+ |_ /@
+ / / @
+ /___|@
+ @@
+0x017F LATIN SMALL LETTER LONG S
+ __ @
+ / _|@
+ |-| | @
+ |-| | @
+ |_| @
+ @@
+0x02C7 CARON
+ \\//@
+ \/ @
+ $@
+ $@
+ $@
+ $@@
+0x02D8 BREVE
+ \\_//@
+ \_/ @
+ $@
+ $@
+ $@
+ $@@
+0x02D9 DOT ABOVE
+ []@
+ $@
+ $@
+ $@
+ $@
+ $@@
+0x02DB OGONEK
+ $@
+ $@
+ $@
+ $@
+ $@
+ )_) @@
+0x02DD DOUBLE ACUTE ACCENT
+ _ _ @
+ /_/_/@
+ $@
+ $@
+ $@
+ $@@