Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-02-17 22:39:52 +0300
committerChristopher Faylor <me@cgf.cx>2000-02-17 22:39:52 +0300
commit8a0efa53e44919bcf5ccb1d3353618a82afdf8bc (patch)
tree68c3dbf3f2c6fd5d49777def9914d77b5cd4589d /newlib/libc/misc
parent1fd5e000ace55b323124c7e556a7a864b972a5c4 (diff)
import newlib-2000-02-17 snapshot
Diffstat (limited to 'newlib/libc/misc')
-rw-r--r--newlib/libc/misc/Makefile.am26
-rw-r--r--newlib/libc/misc/Makefile.in297
-rw-r--r--newlib/libc/misc/dprintf.c266
-rw-r--r--newlib/libc/misc/ffs.c42
-rw-r--r--newlib/libc/misc/misc.tex10
-rw-r--r--newlib/libc/misc/unctrl.c146
6 files changed, 787 insertions, 0 deletions
diff --git a/newlib/libc/misc/Makefile.am b/newlib/libc/misc/Makefile.am
new file mode 100644
index 000000000..c6788ba0c
--- /dev/null
+++ b/newlib/libc/misc/Makefile.am
@@ -0,0 +1,26 @@
+## Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+noinst_LIBRARIES = lib.a
+
+lib_a_SOURCES = dprintf.c unctrl.c ffs.c
+
+CHEWOUT_FILES = unctrl.def ffs.def
+
+SUFFIXES = .def
+
+CHEW = ../../doc/makedoc -f $(srcdir)/../../doc/doc.str
+
+.c.def:
+ $(CHEW) < $< > $*.def 2> $*.ref
+ touch stmp-def
+
+TARGETDOC = ../tmp.texi
+
+doc: $(CHEWOUT_FILES)
+ cat $(srcdir)/misc.tex >> $(TARGETDOC)
+
+CLEANFILES = $(CHEWOUT_FILES) *.ref
diff --git a/newlib/libc/misc/Makefile.in b/newlib/libc/misc/Makefile.in
new file mode 100644
index 000000000..0fa2ecf4f
--- /dev/null
+++ b/newlib/libc/misc/Makefile.in
@@ -0,0 +1,297 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AR = @AR@
+AS = @AS@
+CC = @CC@
+CPP = @CPP@
+CRT0 = @CRT0@
+EXEEXT = @EXEEXT@
+LIBC_MACHINE_LIB = @LIBC_MACHINE_LIB@
+LIBC_POSIX_LIB = @LIBC_POSIX_LIB@
+LIBC_SIGNAL_DEF = @LIBC_SIGNAL_DEF@
+LIBC_SIGNAL_LIB = @LIBC_SIGNAL_LIB@
+LIBC_SYSCALL_LIB = @LIBC_SYSCALL_LIB@
+LIBC_SYS_LIB = @LIBC_SYS_LIB@
+LIBC_UNIX_LIB = @LIBC_UNIX_LIB@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NEWLIB_CFLAGS = @NEWLIB_CFLAGS@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+machine_dir = @machine_dir@
+newlib_basedir = @newlib_basedir@
+sys_dir = @sys_dir@
+
+AUTOMAKE_OPTIONS = cygnus
+
+INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
+
+noinst_LIBRARIES = lib.a
+
+lib_a_SOURCES = dprintf.c unctrl.c ffs.c
+
+CHEWOUT_FILES = unctrl.def ffs.def
+
+SUFFIXES = .def
+
+CHEW = ../../doc/makedoc -f $(srcdir)/../../doc/doc.str
+
+TARGETDOC = ../tmp.texi
+
+CLEANFILES = $(CHEWOUT_FILES) *.ref
+mkinstalldirs = $(SHELL) $(top_srcdir)/../../mkinstalldirs
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+lib_a_LIBADD =
+lib_a_OBJECTS = dprintf.o unctrl.o ffs.o
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(lib_a_SOURCES)
+OBJECTS = $(lib_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .def .o .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --cygnus misc/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES)
+ -rm -f lib.a
+ $(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD)
+ $(RANLIB) lib.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = misc
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am:
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-info-am:
+install-info: install-info-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-info-am install-info \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+.c.def:
+ $(CHEW) < $< > $*.def 2> $*.ref
+ touch stmp-def
+
+doc: $(CHEWOUT_FILES)
+ cat $(srcdir)/misc.tex >> $(TARGETDOC)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/newlib/libc/misc/dprintf.c b/newlib/libc/misc/dprintf.c
new file mode 100644
index 000000000..071d177ca
--- /dev/null
+++ b/newlib/libc/misc/dprintf.c
@@ -0,0 +1,266 @@
+/* Debugging printf, for debugging the library itself.
+
+ We don't assume stdio is working.
+ We do assume _write_r is working.
+*/
+
+#include "ctype.h"
+#include "reent.h"
+#include "string.h"
+#include "unctrl.h"
+
+#ifdef __STDC__
+#include "stdarg.h"
+#else
+#include "varargs.h"
+#endif
+
+static char *parse_number ();
+static long get_number ();
+static void print_number ();
+static void write_char ();
+static void write_string ();
+
+/* Non-zero for big-endian systems. */
+static int big_endian_p;
+
+/* For now hardcode 2 (stderr) as the console file descriptor.
+ May wish to let the caller pass in a file descriptor or some such but
+ this is only for debugging purposes anyway. */
+#define CONSOLE_FD 2
+
+/* Standalone printf routine.
+
+ The format string has been enhanced so that multiple values can be dumped
+ without having to have a %-field for each one (say if you want to dump
+ 20 words at a certain address). A modifier of `N' says the next argument
+ is a count, and the one after that is a pointer.
+
+ Example: __dprintf (stderr, "%Nx\n", 20, p); /-* print 20 ints at `p' *-/
+
+ Supported formats are: c d u x s p.
+
+ All ints are retrieved a byte at a time so alignment issues are not
+ a problem.
+
+ This routine is used in situations where the only debugging capability
+ is console output and was written to aid debugging newlib itself. We don't
+ use printf ourselves as we may be debugging it. We do assume _write_r is
+ working.
+*/
+
+void
+#ifdef __STDC__
+__dprintf (char *fmt, ...)
+#else
+__dprintf (fmt, va_alist)
+ char *fmt;
+ va_dcl
+#endif
+{
+ va_list args;
+
+ /* Which endian are we? */
+ {
+ short tmp = 1;
+ big_endian_p = *(char *) &tmp == 0;
+ }
+
+#ifdef __STDC__
+ va_start (args, fmt);
+#else
+ va_start (args);
+#endif
+
+ while (*fmt)
+ {
+ char c, *p;
+ int count;
+ long l;
+
+ if (*fmt != '%' || *++fmt == '%')
+ {
+ write_char (*fmt++);
+ continue;
+ }
+
+ if (*fmt == 'N')
+ {
+ count = va_arg (args, int);
+ p = va_arg (args, char *);
+ ++fmt;
+ c = *fmt++;
+
+ while (--count >= 0)
+ {
+ switch (c)
+ {
+ case 'c' :
+ write_string (unctrl (*p++));
+ break;
+ case 'p' :
+ print_number (16, 1, get_number (p, sizeof (char *), 1));
+ p += sizeof (char *);
+ break;
+ case 'd' :
+ case 'u' :
+ case 'x' :
+ print_number (c == 'x' ? 16 : 10, c != 'd',
+ get_number (p, sizeof (int), c != 'd'));
+ p += sizeof (int);
+ break;
+ case 's' :
+ write_string (*(char **) p);
+ p += sizeof (char *);
+ break;
+ }
+ if (count > 0)
+ write_char (' ');
+ }
+ }
+ else
+ {
+ switch (c = *fmt++)
+ {
+ case 'c' :
+ c = va_arg (args, int);
+ write_string (unctrl (c));
+ break;
+ case 'p' :
+ l = (_POINTER_INT) va_arg (args, char *);
+ print_number (16, 1, l);
+ break;
+ case 'd' :
+ case 'u' :
+ case 'x' :
+ l = va_arg (args, int);
+ print_number (c == 'x' ? 16 : 10, c != 'd', l);
+ break;
+ case 's' :
+ p = va_arg (args, char *);
+ write_string (p);
+ break;
+ }
+ }
+ }
+
+ va_end (args);
+}
+
+/* Parse a positive decimal integer at S.
+ FIXME: Was used in earlier version, but not currently used.
+ Keep for now. */
+
+static char *
+parse_number (s, p)
+ char *s;
+ long *p;
+{
+ long x = 0;
+
+ while (isdigit (*s))
+ {
+ x = (x * 10) + (*s - '0');
+ ++s;
+ }
+
+ *p = x;
+ return s;
+}
+
+/* Fetch the number at S of SIZE bytes. */
+
+static long
+get_number (s, size, unsigned_p)
+ char *s;
+ long size;
+ int unsigned_p;
+{
+ long x;
+ unsigned char *p = (unsigned char *) s;
+
+ switch (size)
+ {
+ case 1 :
+ x = *p;
+ if (!unsigned_p)
+ x = (x ^ 0x80) - 0x80;
+ return x;
+ case 2 :
+ if (big_endian_p)
+ x = (p[0] << 8) | p[1];
+ else
+ x = (p[1] << 8) | p[0];
+ if (!unsigned_p)
+ x = (x ^ 0x8000) - 0x8000;
+ return x;
+ case 4 :
+ if (big_endian_p)
+ x = ((long)p[0] << 24) | ((long)p[1] << 16) | (p[2] << 8) | p[3];
+ else
+ x = ((long)p[3] << 24) | ((long)p[2] << 16) | (p[1] << 8) | p[0];
+ if (!unsigned_p)
+ x = (x ^ 0x80000000L) - 0x80000000L;
+ return x;
+#if 0 /* FIXME: Is there a standard mechanism for knowing if
+ long longs exist? */
+ case 8 :
+#endif
+ default :
+ return 0;
+ }
+}
+
+/* Print X in base BASE. */
+
+static void
+print_number (base, unsigned_p, n)
+ int base;
+ int unsigned_p;
+ long n;
+{
+ static char chars[16] = "0123456789abcdef";
+ char *p, buf[32];
+ unsigned long x;
+
+ if (!unsigned_p && n < 0)
+ {
+ write_char ('-');
+ x = -n;
+ }
+ else
+ x = n;
+
+ p = buf + sizeof (buf);
+ *--p = '\0';
+ do
+ {
+ *--p = chars[x % base];
+ x /= base;
+ }
+ while (x != 0);
+
+ write_string (p);
+}
+
+/* Write C to the console.
+ We go through the file descriptor directly because we can't assume
+ stdio is working. */
+
+static void
+write_char (c)
+ char c;
+{
+ _write_r (_REENT, CONSOLE_FD, &c, 1);
+}
+
+/* Write S to the console.
+ We go through the file descriptor directly because we can't assume
+ stdio is working. */
+
+static void
+write_string (s)
+ char *s;
+{
+ _write_r (_REENT, CONSOLE_FD, s, strlen (s));
+}
diff --git a/newlib/libc/misc/ffs.c b/newlib/libc/misc/ffs.c
new file mode 100644
index 000000000..e4afe7a41
--- /dev/null
+++ b/newlib/libc/misc/ffs.c
@@ -0,0 +1,42 @@
+/*
+FUNCTION
+ <<ffs>>---find first bit set in a word
+
+INDEX
+ ffs
+
+ANSI_SYNOPSIS
+ int ffs(int <[word]>);
+
+TRAD_SYNOPSIS
+ int ffs(<[word]>);
+
+DESCRIPTION
+
+<<ffs>> returns the first bit set in a word.
+
+RETURNS
+<<ffs>> returns 0 if <[c]> is 0, 1 if <[c]> is odd, 2 if <[c]> is a multiple of
+2, etc.
+
+PORTABILITY
+<<ffs>> is not ANSI C.
+
+No supporting OS subroutines are required. */
+
+int
+ffs (word)
+ int word;
+{
+ int i;
+
+ if (!word)
+ return 0;
+
+ i = 0;
+ for (;;)
+ {
+ if (((1 << i++) & word) != 0)
+ return i;
+ }
+}
diff --git a/newlib/libc/misc/misc.tex b/newlib/libc/misc/misc.tex
new file mode 100644
index 000000000..ea5599d83
--- /dev/null
+++ b/newlib/libc/misc/misc.tex
@@ -0,0 +1,10 @@
+@node Misc
+@chapter Miscellaneous Macros and Functions
+This chapter describes miscellaneous routines not covered elsewhere.
+
+@menu
+* unctrl:: Return printable representation of a character
+@end menu
+
+@page
+@include misc/unctrl.def
diff --git a/newlib/libc/misc/unctrl.c b/newlib/libc/misc/unctrl.c
new file mode 100644
index 000000000..e7350c657
--- /dev/null
+++ b/newlib/libc/misc/unctrl.c
@@ -0,0 +1,146 @@
+/*
+FUNCTION
+ <<unctrl>>---translate characters to upper case
+
+INDEX
+ unctrl
+INDEX
+ unctrllen
+
+ANSI_SYNOPSIS
+ #include <unctrl.h>
+ char *unctrl(int <[c]>);
+ int unctrllen(int <[c]>);
+
+TRAD_SYNOPSIS
+ #include <unctrl.h>
+ char *unctrl(<[c]>);
+ int unctrllen(<[c]>);
+
+DESCRIPTION
+<<unctrl>> is a macro which returns the printable representation of <[c]>
+as a string.
+<<unctrllen>> is a macro which returns the length of the printable
+representation of <[c]>.
+
+RETURNS
+<<unctrl>> returns a string of the printable representation of <[c]>.
+
+<<unctrllen>> returns the length of the string which is the printable
+representation of <[c]>.
+
+PORTABILITY
+<<unctrl>> and <<unctrllen>> are not ANSI C.
+
+No supporting OS subroutines are required.
+*/
+
+/*
+ * Copyright (c) 1981, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <_ansi.h>
+
+#ifndef lint
+static char sccsid[] = "@(#)unctrl.c 8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+
+_CONST char * _CONST __unctrl[256] = {
+ "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G",
+ "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O",
+ "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
+ "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_",
+ " ", "!", "\"", "#", "$", "%", "&", "'",
+ "(", ")", "*", "+", ",", "-", ".", "/",
+ "0", "1", "2", "3", "4", "5", "6", "7",
+ "8", "9", ":", ";", "<", "=", ">", "?",
+ "@", "A", "B", "C", "D", "E", "F", "G",
+ "H", "I", "J", "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T", "U", "V", "W",
+ "X", "Y", "Z", "[", "\\", "]", "^", "_",
+ "`", "a", "b", "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w",
+ "x", "y", "z", "{", "|", "}", "~", "^?",
+
+ "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87",
+ "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f",
+ "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97",
+ "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f",
+ "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7",
+ "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf",
+ "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7",
+ "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf",
+ "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7",
+ "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf",
+ "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7",
+ "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf",
+ "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7",
+ "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef",
+ "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7",
+ "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff",
+};
+
+_CONST char __unctrllen[256] = {
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+};