summaryrefslogtreecommitdiff
path: root/trunk/missing
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/missing')
-rw-r--r--trunk/missing/acosh.c93
-rw-r--r--trunk/missing/alloca.c194
-rw-r--r--trunk/missing/cbrt.c10
-rw-r--r--trunk/missing/crypt.c992
-rw-r--r--trunk/missing/dup2.c60
-rw-r--r--trunk/missing/erf.c88
-rw-r--r--trunk/missing/file.h22
-rw-r--r--trunk/missing/fileblocks.c1
-rw-r--r--trunk/missing/finite.c7
-rw-r--r--trunk/missing/flock.c129
-rw-r--r--trunk/missing/hypot.c16
-rw-r--r--trunk/missing/isinf.c69
-rw-r--r--trunk/missing/isnan.c15
-rw-r--r--trunk/missing/lgamma_r.c68
-rw-r--r--trunk/missing/memcmp.c17
-rw-r--r--trunk/missing/memmove.c21
-rw-r--r--trunk/missing/os2.c138
-rw-r--r--trunk/missing/strchr.c28
-rw-r--r--trunk/missing/strerror.c16
-rw-r--r--trunk/missing/strlcat.c73
-rw-r--r--trunk/missing/strlcpy.c69
-rw-r--r--trunk/missing/strstr.c25
-rw-r--r--trunk/missing/strtol.c26
-rw-r--r--trunk/missing/tgamma.c92
-rw-r--r--trunk/missing/vsnprintf.c1201
-rw-r--r--trunk/missing/x68.c40
26 files changed, 0 insertions, 3510 deletions
diff --git a/trunk/missing/acosh.c b/trunk/missing/acosh.c
deleted file mode 100644
index c6695b599e..0000000000
--- a/trunk/missing/acosh.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/**********************************************************************
-
- acosh.c -
-
- $Author$
- created at: Fri Apr 12 00:34:17 JST 2002
-
- public domain rewrite of acosh(3), asinh(3) and atanh(3)
-
-**********************************************************************/
-
-#include <errno.h>
-#include <float.h>
-#include <math.h>
-#include "ruby.h"
-
-/* DBL_MANT_DIG must be less than 4 times of bits of int */
-#ifndef DBL_MANT_DIG
-#define DBL_MANT_DIG 53 /* in this case, at least 12 digit precision */
-#endif
-#define BIG_CRITERIA_BIT (1<<DBL_MANT_DIG/2)
-#if BIG_CRITERIA_BIT > 0
-#define BIG_CRITERIA (1.0*BIG_CRITERIA_BIT)
-#else
-#define BIG_CRITERIA (1.0*(1<<DBL_MANT_DIG/4)*(1<<(DBL_MANT_DIG/2+1-DBL_MANT_DIG/4)))
-#endif
-#define SMALL_CRITERIA_BIT (1<<(DBL_MANT_DIG/3))
-#if SMALL_CRITERIA_BIT > 0
-#define SMALL_CRITERIA (1.0/SMALL_CRITERIA_BIT)
-#else
-#define SMALL_CRITERIA (1.0*(1<<DBL_MANT_DIG/4)*(1<<(DBL_MANT_DIG/3+1-DBL_MANT_DIG/4)))
-#endif
-
-#ifndef HAVE_ACOSH
-double
-acosh(double x)
-{
- if (x < 1)
- x = -1; /* NaN */
- else if (x == 1)
- return 0;
- else if (x > BIG_CRITERIA)
- x += x;
- else
- x += sqrt((x + 1) * (x - 1));
- return log(x);
-}
-#endif
-
-#ifndef HAVE_ASINH
-double
-asinh(double x)
-{
- int neg = x < 0;
- double z = fabs(x);
-
- if (z < SMALL_CRITERIA) return x;
- if (z < (1.0/(1<<DBL_MANT_DIG/5))) {
- double x2 = z * z;
- z *= 1 + x2 * (-1.0/6.0 + x2 * 3.0/40.0);
- }
- else if (z > BIG_CRITERIA) {
- z = log(z + z);
- }
- else {
- z = log(z + sqrt(z * z + 1));
- }
- if (neg) z = -z;
- return z;
-}
-#endif
-
-#ifndef HAVE_ATANH
-double
-atanh(double x)
-{
- int neg = x < 0;
- double z = fabs(x);
-
- if (z < SMALL_CRITERIA) return x;
- z = log(z > 1 ? -1 : (1 + z) / (1 - z)) / 2;
- if (neg) z = -z;
- if (isinf(z))
-#if defined(ERANGE)
- errno = ERANGE;
-#elif defined(EDOM)
- errno = EDOM;
-#else
- ;
-#endif
- return z;
-}
-#endif
diff --git a/trunk/missing/alloca.c b/trunk/missing/alloca.c
deleted file mode 100644
index 067f76b183..0000000000
--- a/trunk/missing/alloca.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* alloca -- (mostly) portable public-domain implementation -- D A Gwyn
-
- last edit: 86/05/30 rms
- include config.h, since on VMS it renames some symbols.
- Use xmalloc instead of malloc.
-
- This implementation of the PWB library alloca() function,
- which is used to allocate space off the run-time stack so
- that it is automatically reclaimed upon procedure exit,
- was inspired by discussions with J. Q. Johnson of Cornell.
-
- It should work under any C implementation that uses an
- actual procedure stack (as opposed to a linked list of
- frames). There are some preprocessor constants that can
- be defined when compiling for your specific system, for
- improved efficiency; however, the defaults should be okay.
-
- The general concept of this implementation is to keep
- track of all alloca()-allocated blocks, and reclaim any
- that are found to be deeper in the stack than the current
- invocation. This heuristic does not reclaim storage as
- soon as it becomes invalid, but it will do so eventually.
-
- As a special case, alloca(0) reclaims storage without
- allocating any. It is a good idea to use alloca(0) in
- your main control loop, etc. to force garbage collection.
-*/
-#ifndef lint
-static char SCCSid[] = "@(#)alloca.c 1.1"; /* for the "what" utility */
-#endif
-
-#include "ruby/config.h"
-#ifdef emacs
-#ifdef static
-/* actually, only want this if static is defined as ""
- -- this is for usg, in which emacs must undefine static
- in order to make unexec workable
- */
-#ifndef STACK_DIRECTION
-you
-lose
--- must know STACK_DIRECTION at compile-time
-#endif /* STACK_DIRECTION undefined */
-#endif /* static */
-#endif /* emacs */
-
-#ifdef X3J11
-typedef void *pointer; /* generic pointer type */
-#else
-typedef char *pointer; /* generic pointer type */
-#endif /* X3J11 */
-
-#define NULL 0 /* null pointer constant */
-
-#ifdef RUBY_LIB
-#define xmalloc ruby_xmalloc
-#define xfree ruby_xfree
-#endif
-
-extern void xfree();
-extern pointer xmalloc();
-
-/*
- Define STACK_DIRECTION if you know the direction of stack
- growth for your system; otherwise it will be automatically
- deduced at run-time.
-
- STACK_DIRECTION > 0 => grows toward higher addresses
- STACK_DIRECTION < 0 => grows toward lower addresses
- STACK_DIRECTION = 0 => direction of growth unknown
-*/
-
-#ifndef STACK_DIRECTION
-#define STACK_DIRECTION 0 /* direction unknown */
-#endif
-
-#if STACK_DIRECTION != 0
-
-#define STACK_DIR STACK_DIRECTION /* known at compile-time */
-
-#else /* STACK_DIRECTION == 0; need run-time code */
-
-static int stack_dir; /* 1 or -1 once known */
-#define STACK_DIR stack_dir
-
-static void
-find_stack_direction (/* void */)
-{
- static char *addr = NULL; /* address of first
- `dummy', once known */
- auto char dummy; /* to get stack address */
-
- if (addr == NULL)
- { /* initial entry */
- addr = &dummy;
-
- find_stack_direction (); /* recurse once */
- }
- else /* second entry */
- if (&dummy > addr)
- stack_dir = 1; /* stack grew upward */
- else
- stack_dir = -1; /* stack grew downward */
-}
-
-#endif /* STACK_DIRECTION == 0 */
-
-/*
- An "alloca header" is used to:
- (a) chain together all alloca()ed blocks;
- (b) keep track of stack depth.
-
- It is very important that sizeof(header) agree with malloc()
- alignment chunk size. The following default should work okay.
-*/
-
-#ifndef ALIGN_SIZE
-#define ALIGN_SIZE sizeof(double)
-#endif
-
-typedef union hdr
-{
- char align[ALIGN_SIZE]; /* to force sizeof(header) */
- struct
- {
- union hdr *next; /* for chaining headers */
- char *deep; /* for stack depth measure */
- } h;
-} header;
-
-/*
- alloca( size ) returns a pointer to at least `size' bytes of
- storage which will be automatically reclaimed upon exit from
- the procedure that called alloca(). Originally, this space
- was supposed to be taken from the current stack frame of the
- caller, but that method cannot be made to work for some
- implementations of C, for example under Gould's UTX/32.
-*/
-
-static header *last_alloca_header = NULL; /* -> last alloca header */
-
-pointer
-alloca (size) /* returns pointer to storage */
- unsigned size; /* # bytes to allocate */
-{
- auto char probe; /* probes stack depth: */
- register char *depth = &probe;
-
-#if STACK_DIRECTION == 0
- if (STACK_DIR == 0) /* unknown growth direction */
- find_stack_direction ();
-#endif
-
- /* Reclaim garbage, defined as all alloca()ed storage that
- was allocated from deeper in the stack than currently. */
- {
- register header *hp; /* traverses linked list */
-
- for (hp = last_alloca_header; hp != NULL;)
- if (STACK_DIR > 0 && hp->h.deep > depth
- || STACK_DIR < 0 && hp->h.deep < depth)
- {
- register header *np = hp->h.next;
-
- xfree ((pointer) hp); /* collect garbage */
-
- hp = np; /* -> next header */
- }
- else
- break; /* rest are not deeper */
-
- last_alloca_header = hp; /* -> last valid storage */
- }
-
- if (size == 0)
- return NULL; /* no allocation required */
-
- /* Allocate combined header + user data storage. */
-
- {
- register pointer new = xmalloc (sizeof (header) + size);
- /* address of header */
-
- ((header *)new)->h.next = last_alloca_header;
- ((header *)new)->h.deep = depth;
-
- last_alloca_header = (header *)new;
-
- /* User storage begins just after header. */
-
- return (pointer)((char *)new + sizeof(header));
- }
-}
-
diff --git a/trunk/missing/cbrt.c b/trunk/missing/cbrt.c
deleted file mode 100644
index 54db2703a0..0000000000
--- a/trunk/missing/cbrt.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <math.h>
-
-double cbrt(double x)
-{
- if (x < 0)
- return -pow(-x, 1/3.0);
- else
- return pow(x, 1/3.0);
-}
-
diff --git a/trunk/missing/crypt.c b/trunk/missing/crypt.c
deleted file mode 100644
index 32736bccfb..0000000000
--- a/trunk/missing/crypt.c
+++ /dev/null
@@ -1,992 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tom Truscott.
- *
- * 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. 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)crypt.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <limits.h>
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <stdio.h>
-#ifndef _PASSWORD_EFMT1
-#define _PASSWORD_EFMT1 '_'
-#endif
-
-/*
- * UNIX password, and DES, encryption.
- * By Tom Truscott, trt@rti.rti.org,
- * from algorithms by Robert W. Baldwin and James Gillogly.
- *
- * References:
- * "Mathematical Cryptology for Computer Scientists and Mathematicians,"
- * by Wayne Patterson, 1987, ISBN 0-8476-7438-X.
- *
- * "Password Security: A Case History," R. Morris and Ken Thompson,
- * Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.
- *
- * "DES will be Totally Insecure within Ten Years," M.E. Hellman,
- * IEEE Spectrum, vol. 16, pp. 32-39, July 1979.
- */
-
-/* ===== Configuration ==================== */
-
-/*
- * define "MUST_ALIGN" if your compiler cannot load/store
- * long integers at arbitrary (e.g. odd) memory locations.
- * (Either that or never pass unaligned addresses to des_cipher!)
- */
-#if !defined(vax)
-#define MUST_ALIGN
-#endif
-
-#ifdef CHAR_BITS
-#if CHAR_BITS != 8
- #error C_block structure assumes 8 bit characters
-#endif
-#endif
-
-/*
- * define "LONG_IS_32_BITS" only if sizeof(long)==4.
- * This avoids use of bit fields (your compiler may be sloppy with them).
- */
-#if !defined(cray)
-#define LONG_IS_32_BITS
-#endif
-
-/*
- * define "B64" to be the declaration for a 64 bit integer.
- * XXX this feature is currently unused, see "endian" comment below.
- */
-#if defined(cray)
-#define B64 long
-#endif
-#if defined(convex)
-#define B64 long long
-#endif
-
-/*
- * define "LARGEDATA" to get faster permutations, by using about 72 kilobytes
- * of lookup tables. This speeds up des_setkey() and des_cipher(), but has
- * little effect on crypt().
- */
-#if defined(notdef)
-#define LARGEDATA
-#endif
-
-int des_setkey(), des_cipher();
-
-/* compile with "-DSTATIC=int" when profiling */
-#ifndef STATIC
-#define STATIC static
-#endif
-STATIC void init_des(), init_perm(), permute();
-#ifdef DEBUG
-STATIC void prtab();
-#endif
-
-/* ==================================== */
-
-/*
- * Cipher-block representation (Bob Baldwin):
- *
- * DES operates on groups of 64 bits, numbered 1..64 (sigh). One
- * representation is to store one bit per byte in an array of bytes. Bit N of
- * the NBS spec is stored as the LSB of the Nth byte (index N-1) in the array.
- * Another representation stores the 64 bits in 8 bytes, with bits 1..8 in the
- * first byte, 9..16 in the second, and so on. The DES spec apparently has
- * bit 1 in the MSB of the first byte, but that is particularly noxious so we
- * bit-reverse each byte so that bit 1 is the LSB of the first byte, bit 8 is
- * the MSB of the first byte. Specifically, the 64-bit input data and key are
- * converted to LSB format, and the output 64-bit block is converted back into
- * MSB format.
- *
- * DES operates internally on groups of 32 bits which are expanded to 48 bits
- * by permutation E and shrunk back to 32 bits by the S boxes. To speed up
- * the computation, the expansion is applied only once, the expanded
- * representation is maintained during the encryption, and a compression
- * permutation is applied only at the end. To speed up the S-box lookups,
- * the 48 bits are maintained as eight 6 bit groups, one per byte, which
- * directly feed the eight S-boxes. Within each byte, the 6 bits are the
- * most significant ones. The low two bits of each byte are zero. (Thus,
- * bit 1 of the 48 bit E expansion is stored as the "4"-valued bit of the
- * first byte in the eight byte representation, bit 2 of the 48 bit value is
- * the "8"-valued bit, and so on.) In fact, a combined "SPE"-box lookup is
- * used, in which the output is the 64 bit result of an S-box lookup which
- * has been permuted by P and expanded by E, and is ready for use in the next
- * iteration. Two 32-bit wide tables, SPE[0] and SPE[1], are used for this
- * lookup. Since each byte in the 48 bit path is a multiple of four, indexed
- * lookup of SPE[0] and SPE[1] is simple and fast. The key schedule and
- * "salt" are also converted to this 8*(6+2) format. The SPE table size is
- * 8*64*8 = 4K bytes.
- *
- * To speed up bit-parallel operations (such as XOR), the 8 byte
- * representation is "union"ed with 32 bit values "i0" and "i1", and, on
- * machines which support it, a 64 bit value "b64". This data structure,
- * "C_block", has two problems. First, alignment restrictions must be
- * honored. Second, the byte-order (e.g. little-endian or big-endian) of
- * the architecture becomes visible.
- *
- * The byte-order problem is unfortunate, since on the one hand it is good
- * to have a machine-independent C_block representation (bits 1..8 in the
- * first byte, etc.), and on the other hand it is good for the LSB of the
- * first byte to be the LSB of i0. We cannot have both these things, so we
- * currently use the "little-endian" representation and avoid any multi-byte
- * operations that depend on byte order. This largely precludes use of the
- * 64-bit datatype since the relative order of i0 and i1 are unknown. It
- * also inhibits grouping the SPE table to look up 12 bits at a time. (The
- * 12 bits can be stored in a 16-bit field with 3 low-order zeroes and 1
- * high-order zero, providing fast indexing into a 64-bit wide SPE.) On the
- * other hand, 64-bit datatypes are currently rare, and a 12-bit SPE lookup
- * requires a 128 kilobyte table, so perhaps this is not a big loss.
- *
- * Permutation representation (Jim Gillogly):
- *
- * A transformation is defined by its effect on each of the 8 bytes of the
- * 64-bit input. For each byte we give a 64-bit output that has the bits in
- * the input distributed appropriately. The transformation is then the OR
- * of the 8 sets of 64-bits. This uses 8*256*8 = 16K bytes of storage for
- * each transformation. Unless LARGEDATA is defined, however, a more compact
- * table is used which looks up 16 4-bit "chunks" rather than 8 8-bit chunks.
- * The smaller table uses 16*16*8 = 2K bytes for each transformation. This
- * is slower but tolerable, particularly for password encryption in which
- * the SPE transformation is iterated many times. The small tables total 9K
- * bytes, the large tables total 72K bytes.
- *
- * The transformations used are:
- * IE3264: MSB->LSB conversion, initial permutation, and expansion.
- * This is done by collecting the 32 even-numbered bits and applying
- * a 32->64 bit transformation, and then collecting the 32 odd-numbered
- * bits and applying the same transformation. Since there are only
- * 32 input bits, the IE3264 transformation table is half the size of
- * the usual table.
- * CF6464: Compression, final permutation, and LSB->MSB conversion.
- * This is done by two trivial 48->32 bit compressions to obtain
- * a 64-bit block (the bit numbering is given in the "CIFP" table)
- * followed by a 64->64 bit "cleanup" transformation. (It would
- * be possible to group the bits in the 64-bit block so that 2
- * identical 32->32 bit transformations could be used instead,
- * saving a factor of 4 in space and possibly 2 in time, but
- * byte-ordering and other complications rear their ugly head.
- * Similar opportunities/problems arise in the key schedule
- * transforms.)
- * PC1ROT: MSB->LSB, PC1 permutation, rotate, and PC2 permutation.
- * This admittedly baroque 64->64 bit transformation is used to
- * produce the first code (in 8*(6+2) format) of the key schedule.
- * PC2ROT[0]: Inverse PC2 permutation, rotate, and PC2 permutation.
- * It would be possible to define 15 more transformations, each
- * with a different rotation, to generate the entire key schedule.
- * To save space, however, we instead permute each code into the
- * next by using a transformation that "undoes" the PC2 permutation,
- * rotates the code, and then applies PC2. Unfortunately, PC2
- * transforms 56 bits into 48 bits, dropping 8 bits, so PC2 is not
- * invertible. We get around that problem by using a modified PC2
- * which retains the 8 otherwise-lost bits in the unused low-order
- * bits of each byte. The low-order bits are cleared when the
- * codes are stored into the key schedule.
- * PC2ROT[1]: Same as PC2ROT[0], but with two rotations.
- * This is faster than applying PC2ROT[0] twice,
- *
- * The Bell Labs "salt" (Bob Baldwin):
- *
- * The salting is a simple permutation applied to the 48-bit result of E.
- * Specifically, if bit i (1 <= i <= 24) of the salt is set then bits i and
- * i+24 of the result are swapped. The salt is thus a 24 bit number, with
- * 16777216 possible values. (The original salt was 12 bits and could not
- * swap bits 13..24 with 36..48.)
- *
- * It is possible, but ugly, to warp the SPE table to account for the salt
- * permutation. Fortunately, the conditional bit swapping requires only
- * about four machine instructions and can be done on-the-fly with about an
- * 8% performance penalty.
- */
-
-typedef union {
- unsigned char b[8];
- struct {
-#if defined(LONG_IS_32_BITS)
- /* long is often faster than a 32-bit bit field */
- long i0;
- long i1;
-#else
- long i0: 32;
- long i1: 32;
-#endif
- } b32;
-#if defined(B64)
- B64 b64;
-#endif
-} C_block;
-
-/*
- * Convert twenty-four-bit long in host-order
- * to six bits (and 2 low-order zeroes) per char little-endian format.
- */
-#define TO_SIX_BIT(rslt, src) { \
- C_block cvt; \
- cvt.b[0] = src; src >>= 6; \
- cvt.b[1] = src; src >>= 6; \
- cvt.b[2] = src; src >>= 6; \
- cvt.b[3] = src; \
- rslt = (cvt.b32.i0 & 0x3f3f3f3fL) << 2; \
- }
-
-/*
- * These macros may someday permit efficient use of 64-bit integers.
- */
-#define ZERO(d,d0,d1) d0 = 0, d1 = 0
-#define LOAD(d,d0,d1,bl) d0 = (bl).b32.i0, d1 = (bl).b32.i1
-#define LOADREG(d,d0,d1,s,s0,s1) d0 = s0, d1 = s1
-#define OR(d,d0,d1,bl) d0 |= (bl).b32.i0, d1 |= (bl).b32.i1
-#define STORE(s,s0,s1,bl) (bl).b32.i0 = s0, (bl).b32.i1 = s1
-#define DCL_BLOCK(d,d0,d1) long d0, d1
-
-#if defined(LARGEDATA)
- /* Waste memory like crazy. Also, do permutations in line */
-#define LGCHUNKBITS 3
-#define CHUNKBITS (1<<LGCHUNKBITS)
-#define PERM6464(d,d0,d1,cpp,p) \
- LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]); \
- OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]); \
- OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]); \
- OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]); \
- OR (d,d0,d1,(p)[(4<<CHUNKBITS)+(cpp)[4]]); \
- OR (d,d0,d1,(p)[(5<<CHUNKBITS)+(cpp)[5]]); \
- OR (d,d0,d1,(p)[(6<<CHUNKBITS)+(cpp)[6]]); \
- OR (d,d0,d1,(p)[(7<<CHUNKBITS)+(cpp)[7]]);
-#define PERM3264(d,d0,d1,cpp,p) \
- LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]); \
- OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]); \
- OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]); \
- OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);
-#else
- /* "small data" */
-#define LGCHUNKBITS 2
-#define CHUNKBITS (1<<LGCHUNKBITS)
-#define PERM6464(d,d0,d1,cpp,p) \
- { C_block tblk; permute(cpp,&tblk,p,8); LOAD (d,d0,d1,tblk); }
-#define PERM3264(d,d0,d1,cpp,p) \
- { C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }
-
-STATIC void
-permute(cp, out, p, chars_in)
- unsigned char *cp;
- C_block *out;
- register C_block *p;
- int chars_in;
-{
- register DCL_BLOCK(D,D0,D1);
- register C_block *tp;
- register int t;
-
- ZERO(D,D0,D1);
- do {
- t = *cp++;
- tp = &p[t&0xf]; OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);
- tp = &p[t>>4]; OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);
- } while (--chars_in > 0);
- STORE(D,D0,D1,*out);
-}
-#endif /* LARGEDATA */
-
-
-/* ===== (mostly) Standard DES Tables ==================== */
-
-static unsigned char IP[] = { /* initial permutation */
- 58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7,
-};
-
-/* The final permutation is the inverse of IP - no table is necessary */
-
-static unsigned char ExpandTr[] = { /* expansion operation */
- 32, 1, 2, 3, 4, 5,
- 4, 5, 6, 7, 8, 9,
- 8, 9, 10, 11, 12, 13,
- 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21,
- 20, 21, 22, 23, 24, 25,
- 24, 25, 26, 27, 28, 29,
- 28, 29, 30, 31, 32, 1,
-};
-
-static unsigned char PC1[] = { /* permuted choice table 1 */
- 57, 49, 41, 33, 25, 17, 9,
- 1, 58, 50, 42, 34, 26, 18,
- 10, 2, 59, 51, 43, 35, 27,
- 19, 11, 3, 60, 52, 44, 36,
-
- 63, 55, 47, 39, 31, 23, 15,
- 7, 62, 54, 46, 38, 30, 22,
- 14, 6, 61, 53, 45, 37, 29,
- 21, 13, 5, 28, 20, 12, 4,
-};
-
-static unsigned char Rotates[] = { /* PC1 rotation schedule */
- 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
-};
-
-/* note: each "row" of PC2 is left-padded with bits that make it invertible */
-static unsigned char PC2[] = { /* permuted choice table 2 */
- 9, 18, 14, 17, 11, 24, 1, 5,
- 22, 25, 3, 28, 15, 6, 21, 10,
- 35, 38, 23, 19, 12, 4, 26, 8,
- 43, 54, 16, 7, 27, 20, 13, 2,
-
- 0, 0, 41, 52, 31, 37, 47, 55,
- 0, 0, 30, 40, 51, 45, 33, 48,
- 0, 0, 44, 49, 39, 56, 34, 53,
- 0, 0, 46, 42, 50, 36, 29, 32,
-};
-
-static unsigned char S[8][64] = { /* 48->32 bit substitution tables */
- {
- /* S[1] */
- 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
- 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
- 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
- 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
- },
- {
- /* S[2] */
- 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
- 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
- 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
- 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
- },
- {
- /* S[3] */
- 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
- 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
- 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
- 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
- },
- {
- /* S[4] */
- 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
- 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
- 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
- 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
- },
- {
- /* S[5] */
- 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
- 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
- 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
- 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
- },
- {
- /* S[6] */
- 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
- 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
- 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
- 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
- },
- {
- /* S[7] */
- 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
- 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
- 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
- 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
- },
- {
- /* S[8] */
- 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
- 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
- 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
- 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
- },
-};
-
-static unsigned char P32Tr[] = { /* 32-bit permutation function */
- 16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25,
-};
-
-static unsigned char CIFP[] = { /* compressed/interleaved permutation */
- 1, 2, 3, 4, 17, 18, 19, 20,
- 5, 6, 7, 8, 21, 22, 23, 24,
- 9, 10, 11, 12, 25, 26, 27, 28,
- 13, 14, 15, 16, 29, 30, 31, 32,
-
- 33, 34, 35, 36, 49, 50, 51, 52,
- 37, 38, 39, 40, 53, 54, 55, 56,
- 41, 42, 43, 44, 57, 58, 59, 60,
- 45, 46, 47, 48, 61, 62, 63, 64,
-};
-
-static unsigned char itoa64[] = /* 0..63 => ascii-64 */
- "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-
-/* ===== Tables that are initialized at run time ==================== */
-
-
-static unsigned char a64toi[128]; /* ascii-64 => 0..63 */
-
-/* Initial key schedule permutation */
-static C_block PC1ROT[64/CHUNKBITS][1<<CHUNKBITS];
-
-/* Subsequent key schedule rotation permutations */
-static C_block PC2ROT[2][64/CHUNKBITS][1<<CHUNKBITS];
-
-/* Initial permutation/expansion table */
-static C_block IE3264[32/CHUNKBITS][1<<CHUNKBITS];
-
-/* Table that combines the S, P, and E operations. */
-static long SPE[2][8][64];
-
-/* compressed/interleaved => final permutation table */
-static C_block CF6464[64/CHUNKBITS][1<<CHUNKBITS];
-
-
-/* ==================================== */
-
-
-static C_block constdatablock; /* encryption constant */
-static char cryptresult[1+4+4+11+1]; /* encrypted result */
-
-/*
- * Return a pointer to static data consisting of the "setting"
- * followed by an encryption produced by the "key" and "setting".
- */
-char *
-crypt(key, setting)
- register const char *key;
- register const char *setting;
-{
- register char *encp;
- register long i;
- register int t;
- long salt;
- int num_iter, salt_size;
- C_block keyblock, rsltblock;
-
- for (i = 0; i < 8; i++) {
- if ((t = 2*(unsigned char)(*key)) != 0)
- key++;
- keyblock.b[i] = t;
- }
- if (des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */
- return (NULL);
-
- encp = &cryptresult[0];
- switch (*setting) {
- case _PASSWORD_EFMT1:
- /*
- * Involve the rest of the password 8 characters at a time.
- */
- while (*key) {
- if (des_cipher((char *)&keyblock,
- (char *)&keyblock, 0L, 1))
- return (NULL);
- for (i = 0; i < 8; i++) {
- if ((t = 2*(unsigned char)(*key)) != 0)
- key++;
- keyblock.b[i] ^= t;
- }
- if (des_setkey((char *)keyblock.b))
- return (NULL);
- }
-
- *encp++ = *setting++;
-
- /* get iteration count */
- num_iter = 0;
- for (i = 4; --i >= 0; ) {
- if ((t = (unsigned char)setting[i]) == '\0')
- t = '.';
- encp[i] = t;
- num_iter = (num_iter<<6) | a64toi[t];
- }
- setting += 4;
- encp += 4;
- salt_size = 4;
- break;
- default:
- num_iter = 25;
- salt_size = 2;
- }
-
- salt = 0;
- for (i = salt_size; --i >= 0; ) {
- if ((t = (unsigned char)setting[i]) == '\0')
- t = '.';
- encp[i] = t;
- salt = (salt<<6) | a64toi[t];
- }
- encp += salt_size;
- if (des_cipher((char *)&constdatablock, (char *)&rsltblock,
- salt, num_iter))
- return (NULL);
-
- /*
- * Encode the 64 cipher bits as 11 ascii characters.
- */
- i = ((long)((rsltblock.b[0]<<8) | rsltblock.b[1])<<8) | rsltblock.b[2];
- encp[3] = itoa64[i&0x3f]; i >>= 6;
- encp[2] = itoa64[i&0x3f]; i >>= 6;
- encp[1] = itoa64[i&0x3f]; i >>= 6;
- encp[0] = itoa64[i]; encp += 4;
- i = ((long)((rsltblock.b[3]<<8) | rsltblock.b[4])<<8) | rsltblock.b[5];
- encp[3] = itoa64[i&0x3f]; i >>= 6;
- encp[2] = itoa64[i&0x3f]; i >>= 6;
- encp[1] = itoa64[i&0x3f]; i >>= 6;
- encp[0] = itoa64[i]; encp += 4;
- i = ((long)((rsltblock.b[6])<<8) | rsltblock.b[7])<<2;
- encp[2] = itoa64[i&0x3f]; i >>= 6;
- encp[1] = itoa64[i&0x3f]; i >>= 6;
- encp[0] = itoa64[i];
-
- encp[3] = 0;
-
- return (cryptresult);
-}
-
-
-/*
- * The Key Schedule, filled in by des_setkey() or setkey().
- */
-#define KS_SIZE 16
-static C_block KS[KS_SIZE];
-
-/*
- * Set up the key schedule from the key.
- */
-int
-des_setkey(key)
- register const char *key;
-{
- register DCL_BLOCK(K, K0, K1);
- register C_block *ptabp;
- register int i;
- static int des_ready = 0;
-
- if (!des_ready) {
- init_des();
- des_ready = 1;
- }
-
- PERM6464(K,K0,K1,(unsigned char *)key,(C_block *)PC1ROT);
- key = (char *)&KS[0];
- STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);
- for (i = 1; i < 16; i++) {
- key += sizeof(C_block);
- STORE(K,K0,K1,*(C_block *)key);
- ptabp = (C_block *)PC2ROT[Rotates[i]-1];
- PERM6464(K,K0,K1,(unsigned char *)key,ptabp);
- STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);
- }
- return (0);
-}
-
-/*
- * Encrypt (or decrypt if num_iter < 0) the 8 chars at "in" with abs(num_iter)
- * iterations of DES, using the the given 24-bit salt and the pre-computed key
- * schedule, and store the resulting 8 chars at "out" (in == out is permitted).
- *
- * NOTE: the performance of this routine is critically dependent on your
- * compiler and machine architecture.
- */
-int
-des_cipher(in, out, salt, num_iter)
- const char *in;
- char *out;
- long salt;
- int num_iter;
-{
- /* variables that we want in registers, most important first */
-#if defined(pdp11)
- register int j;
-#endif
- register long L0, L1, R0, R1, k;
- register C_block *kp;
- register int ks_inc, loop_count;
- C_block B;
-
- L0 = salt;
- TO_SIX_BIT(salt, L0); /* convert to 4*(6+2) format */
-
-#if defined(vax) || defined(pdp11)
- salt = ~salt; /* "x &~ y" is faster than "x & y". */
-#define SALT (~salt)
-#else
-#define SALT salt
-#endif
-
-#if defined(MUST_ALIGN)
- B.b[0] = in[0]; B.b[1] = in[1]; B.b[2] = in[2]; B.b[3] = in[3];
- B.b[4] = in[4]; B.b[5] = in[5]; B.b[6] = in[6]; B.b[7] = in[7];
- LOAD(L,L0,L1,B);
-#else
- LOAD(L,L0,L1,*(C_block *)in);
-#endif
- LOADREG(R,R0,R1,L,L0,L1);
- L0 &= 0x55555555L;
- L1 &= 0x55555555L;
- L0 = (L0 << 1) | L1; /* L0 is the even-numbered input bits */
- R0 &= 0xaaaaaaaaL;
- R1 = (R1 >> 1) & 0x55555555L;
- L1 = R0 | R1; /* L1 is the odd-numbered input bits */
- STORE(L,L0,L1,B);
- PERM3264(L,L0,L1,B.b, (C_block *)IE3264); /* even bits */
- PERM3264(R,R0,R1,B.b+4,(C_block *)IE3264); /* odd bits */
-
- if (num_iter >= 0)
- { /* encryption */
- kp = &KS[0];
- ks_inc = sizeof(*kp);
- }
- else
- { /* decryption */
- num_iter = -num_iter;
- kp = &KS[KS_SIZE-1];
- ks_inc = -sizeof(*kp);
- }
-
- while (--num_iter >= 0) {
- loop_count = 8;
- do {
-
-#define SPTAB(t, i) (*(long *)((unsigned char *)t + i*(sizeof(long)/4)))
-#if defined(gould)
- /* use this if B.b[i] is evaluated just once ... */
-#define DOXOR(x,y,i) x^=SPTAB(SPE[0][i],B.b[i]); y^=SPTAB(SPE[1][i],B.b[i]);
-#else
-#if defined(pdp11)
- /* use this if your "long" int indexing is slow */
-#define DOXOR(x,y,i) j=B.b[i]; x^=SPTAB(SPE[0][i],j); y^=SPTAB(SPE[1][i],j);
-#else
- /* use this if "k" is allocated to a register ... */
-#define DOXOR(x,y,i) k=B.b[i]; x^=SPTAB(SPE[0][i],k); y^=SPTAB(SPE[1][i],k);
-#endif
-#endif
-
-#define CRUNCH(p0, p1, q0, q1) \
- k = (q0 ^ q1) & SALT; \
- B.b32.i0 = k ^ q0 ^ kp->b32.i0; \
- B.b32.i1 = k ^ q1 ^ kp->b32.i1; \
- kp = (C_block *)((char *)kp+ks_inc); \
- \
- DOXOR(p0, p1, 0); \
- DOXOR(p0, p1, 1); \
- DOXOR(p0, p1, 2); \
- DOXOR(p0, p1, 3); \
- DOXOR(p0, p1, 4); \
- DOXOR(p0, p1, 5); \
- DOXOR(p0, p1, 6); \
- DOXOR(p0, p1, 7);
-
- CRUNCH(L0, L1, R0, R1);
- CRUNCH(R0, R1, L0, L1);
- } while (--loop_count != 0);
- kp = (C_block *)((char *)kp-(ks_inc*KS_SIZE));
-
-
- /* swap L and R */
- L0 ^= R0; L1 ^= R1;
- R0 ^= L0; R1 ^= L1;
- L0 ^= R0; L1 ^= R1;
- }
-
- /* store the encrypted (or decrypted) result */
- L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);
- L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);
- STORE(L,L0,L1,B);
- PERM6464(L,L0,L1,B.b, (C_block *)CF6464);
-#if defined(MUST_ALIGN)
- STORE(L,L0,L1,B);
- out[0] = B.b[0]; out[1] = B.b[1]; out[2] = B.b[2]; out[3] = B.b[3];
- out[4] = B.b[4]; out[5] = B.b[5]; out[6] = B.b[6]; out[7] = B.b[7];
-#else
- STORE(L,L0,L1,*(C_block *)out);
-#endif
- return (0);
-}
-
-
-/*
- * Initialize various tables. This need only be done once. It could even be
- * done at compile time, if the compiler were capable of that sort of thing.
- */
-STATIC void
-init_des()
-{
- register int i, j;
- register long k;
- register int tableno;
- static unsigned char perm[64], tmp32[32]; /* "static" for speed */
-
- /*
- * table that converts chars "./0-9A-Za-z"to integers 0-63.
- */
- for (i = 0; i < 64; i++)
- a64toi[itoa64[i]] = i;
-
- /*
- * PC1ROT - bit reverse, then PC1, then Rotate, then PC2.
- */
- for (i = 0; i < 64; i++)
- perm[i] = 0;
- for (i = 0; i < 64; i++) {
- if ((k = PC2[i]) == 0)
- continue;
- k += Rotates[0]-1;
- if ((k%28) < Rotates[0]) k -= 28;
- k = PC1[k];
- if (k > 0) {
- k--;
- k = (k|07) - (k&07);
- k++;
- }
- perm[i] = k;
- }
-#ifdef DEBUG
- prtab("pc1tab", perm, 8);
-#endif
- init_perm(PC1ROT, perm, 8, 8);
-
- /*
- * PC2ROT - PC2 inverse, then Rotate (once or twice), then PC2.
- */
- for (j = 0; j < 2; j++) {
- unsigned char pc2inv[64];
- for (i = 0; i < 64; i++)
- perm[i] = pc2inv[i] = 0;
- for (i = 0; i < 64; i++) {
- if ((k = PC2[i]) == 0)
- continue;
- pc2inv[k-1] = i+1;
- }
- for (i = 0; i < 64; i++) {
- if ((k = PC2[i]) == 0)
- continue;
- k += j;
- if ((k%28) <= j) k -= 28;
- perm[i] = pc2inv[k];
- }
-#ifdef DEBUG
- prtab("pc2tab", perm, 8);
-#endif
- init_perm(PC2ROT[j], perm, 8, 8);
- }
-
- /*
- * Bit reverse, then initial permutation, then expansion.
- */
- for (i = 0; i < 8; i++) {
- for (j = 0; j < 8; j++) {
- k = (j < 2)? 0: IP[ExpandTr[i*6+j-2]-1];
- if (k > 32)
- k -= 32;
- else if (k > 0)
- k--;
- if (k > 0) {
- k--;
- k = (k|07) - (k&07);
- k++;
- }
- perm[i*8+j] = k;
- }
- }
-#ifdef DEBUG
- prtab("ietab", perm, 8);
-#endif
- init_perm(IE3264, perm, 4, 8);
-
- /*
- * Compression, then final permutation, then bit reverse.
- */
- for (i = 0; i < 64; i++) {
- k = IP[CIFP[i]-1];
- if (k > 0) {
- k--;
- k = (k|07) - (k&07);
- k++;
- }
- perm[k-1] = i+1;
- }
-#ifdef DEBUG
- prtab("cftab", perm, 8);
-#endif
- init_perm(CF6464, perm, 8, 8);
-
- /*
- * SPE table
- */
- for (i = 0; i < 48; i++)
- perm[i] = P32Tr[ExpandTr[i]-1];
- for (tableno = 0; tableno < 8; tableno++) {
- for (j = 0; j < 64; j++) {
- k = (((j >> 0) &01) << 5)|
- (((j >> 1) &01) << 3)|
- (((j >> 2) &01) << 2)|
- (((j >> 3) &01) << 1)|
- (((j >> 4) &01) << 0)|
- (((j >> 5) &01) << 4);
- k = S[tableno][k];
- k = (((k >> 3)&01) << 0)|
- (((k >> 2)&01) << 1)|
- (((k >> 1)&01) << 2)|
- (((k >> 0)&01) << 3);
- for (i = 0; i < 32; i++)
- tmp32[i] = 0;
- for (i = 0; i < 4; i++)
- tmp32[4 * tableno + i] = (k >> i) & 01;
- k = 0;
- for (i = 24; --i >= 0; )
- k = (k<<1) | tmp32[perm[i]-1];
- TO_SIX_BIT(SPE[0][tableno][j], k);
- k = 0;
- for (i = 24; --i >= 0; )
- k = (k<<1) | tmp32[perm[i+24]-1];
- TO_SIX_BIT(SPE[1][tableno][j], k);
- }
- }
-}
-
-/*
- * Initialize "perm" to represent transformation "p", which rearranges
- * (perhaps with expansion and/or contraction) one packed array of bits
- * (of size "chars_in" characters) into another array (of size "chars_out"
- * characters).
- *
- * "perm" must be all-zeroes on entry to this routine.
- */
-STATIC void
-init_perm(perm, p, chars_in, chars_out)
- C_block perm[64/CHUNKBITS][1<<CHUNKBITS];
- unsigned char p[64];
- int chars_in, chars_out;
-{
- register int i, j, k, l;
-
- for (k = 0; k < chars_out*8; k++) { /* each output bit position */
- l = p[k] - 1; /* where this bit comes from */
- if (l < 0)
- continue; /* output bit is always 0 */
- i = l>>LGCHUNKBITS; /* which chunk this bit comes from */
- l = 1<<(l&(CHUNKBITS-1)); /* mask for this bit */
- for (j = 0; j < (1<<CHUNKBITS); j++) { /* each chunk value */
- if ((j & l) != 0)
- perm[i][j].b[k>>3] |= 1<<(k&07);
- }
- }
-}
-
-/*
- * "setkey" routine (for backwards compatibility)
- */
-int
-setkey(key)
- register const char *key;
-{
- register int i, j, k;
- C_block keyblock;
-
- for (i = 0; i < 8; i++) {
- k = 0;
- for (j = 0; j < 8; j++) {
- k <<= 1;
- k |= (unsigned char)*key++;
- }
- keyblock.b[i] = k;
- }
- return (des_setkey((char *)keyblock.b));
-}
-
-/*
- * "encrypt" routine (for backwards compatibility)
- */
-int
-encrypt(block, flag)
- register char *block;
- int flag;
-{
- register int i, j, k;
- C_block cblock;
-
- for (i = 0; i < 8; i++) {
- k = 0;
- for (j = 0; j < 8; j++) {
- k <<= 1;
- k |= (unsigned char)*block++;
- }
- cblock.b[i] = k;
- }
- if (des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1: 1)))
- return (1);
- for (i = 7; i >= 0; i--) {
- k = cblock.b[i];
- for (j = 7; j >= 0; j--) {
- *--block = k&01;
- k >>= 1;
- }
- }
- return (0);
-}
-
-#ifdef DEBUG
-STATIC void
-prtab(s, t, num_rows)
- char *s;
- unsigned char *t;
- int num_rows;
-{
- register int i, j;
-
- (void)printf("%s:\n", s);
- for (i = 0; i < num_rows; i++) {
- for (j = 0; j < 8; j++) {
- (void)printf("%3d", t[i*8+j]);
- }
- (void)printf("\n");
- }
- (void)printf("\n");
-}
-#endif
diff --git a/trunk/missing/dup2.c b/trunk/missing/dup2.c
deleted file mode 100644
index 7554084c5d..0000000000
--- a/trunk/missing/dup2.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Public domain dup2() lookalike
- * by Curtis Jackson @ AT&T Technologies, Burlington, NC
- * electronic address: burl!rcj
- *
- * dup2 performs the following functions:
- *
- * Check to make sure that fd1 is a valid open file descriptor.
- * Check to see if fd2 is already open; if so, close it.
- * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd.
- * Return fd2 if all went well; return BADEXIT otherwise.
- */
-
-#include "ruby/config.h"
-
-#if defined(HAVE_FCNTL)
-# include <fcntl.h>
-#endif
-
-#if !defined(HAVE_FCNTL) || !defined(F_DUPFD)
-# include <errno.h>
-#endif
-
-#define BADEXIT -1
-
-int
-dup2(int fd1, int fd2)
-{
-#if defined(HAVE_FCNTL) && defined(F_DUPFD)
- if (fd1 != fd2) {
-#ifdef F_GETFL
- if (fcntl(fd1, F_GETFL) < 0)
- return BADEXIT;
- if (fcntl(fd2, F_GETFL) >= 0)
- close(fd2);
-#else
- close(fd2);
-#endif
- if (fcntl(fd1, F_DUPFD, fd2) < 0)
- return BADEXIT;
- }
- return fd2;
-#else
- extern int errno;
- int i, fd, fds[256];
-
- if (fd1 == fd2) return 0;
- close(fd2);
- for (i=0; i<256; i++) {
- fd = fds[i] = dup(fd1);
- if (fd == fd2) break;
- }
- while (i) {
- close(fds[i--]);
- }
- if (fd == fd2) return 0;
- errno = EMFILE;
- return BADEXIT;
-#endif
-}
diff --git a/trunk/missing/erf.c b/trunk/missing/erf.c
deleted file mode 100644
index fe65b9a479..0000000000
--- a/trunk/missing/erf.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* erf.c - public domain implementation of error function erf(3m)
-
-reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
- (New Algorithm handbook in C language) (Gijyutsu hyouron
- sha, Tokyo, 1991) p.227 [in Japanese] */
-#include <stdio.h>
-#include <math.h>
-
-#ifdef _WIN32
-# include <float.h>
-# if !defined __MINGW32__ || defined __NO_ISOCEXT
-# ifndef isnan
-# define isnan(x) _isnan(x)
-# endif
-# ifndef isinf
-# define isinf(x) (!_finite(x) && !_isnan(x))
-# endif
-# ifndef finite
-# define finite(x) _finite(x)
-# endif
-# endif
-#endif
-
-static double q_gamma(double, double, double);
-
-/* Incomplete gamma function
- 1 / Gamma(a) * Int_0^x exp(-t) t^(a-1) dt */
-static double p_gamma(double a, double x, double loggamma_a)
-{
- int k;
- double result, term, previous;
-
- if (x >= 1 + a) return 1 - q_gamma(a, x, loggamma_a);
- if (x == 0) return 0;
- result = term = exp(a * log(x) - x - loggamma_a) / a;
- for (k = 1; k < 1000; k++) {
- term *= x / (a + k);
- previous = result; result += term;
- if (result == previous) return result;
- }
- fprintf(stderr, "erf.c:%d:p_gamma() could not converge.", __LINE__);
- return result;
-}
-
-/* Incomplete gamma function
- 1 / Gamma(a) * Int_x^inf exp(-t) t^(a-1) dt */
-static double q_gamma(double a, double x, double loggamma_a)
-{
- int k;
- double result, w, temp, previous;
- double la = 1, lb = 1 + x - a; /* Laguerre polynomial */
-
- if (x < 1 + a) return 1 - p_gamma(a, x, loggamma_a);
- w = exp(a * log(x) - x - loggamma_a);
- result = w / lb;
- for (k = 2; k < 1000; k++) {
- temp = ((k - 1 - a) * (lb - la) + (k + x) * lb) / k;
- la = lb; lb = temp;
- w *= (k - 1 - a) / k;
- temp = w / (la * lb);
- previous = result; result += temp;
- if (result == previous) return result;
- }
- fprintf(stderr, "erf.c:%d:q_gamma() could not converge.", __LINE__);
- return result;
-}
-
-#define LOG_PI_OVER_2 0.572364942924700087071713675675 /* log_e(PI)/2 */
-
-double erf(double x)
-{
- if (!finite(x)) {
- if (isnan(x)) return x; /* erf(NaN) = NaN */
- return (x>0 ? 1.0 : -1.0); /* erf(+-inf) = +-1.0 */
- }
- if (x >= 0) return p_gamma(0.5, x * x, LOG_PI_OVER_2);
- else return - p_gamma(0.5, x * x, LOG_PI_OVER_2);
-}
-
-double erfc(double x)
-{
- if (!finite(x)) {
- if (isnan(x)) return x; /* erfc(NaN) = NaN */
- return (x>0 ? 0.0 : 2.0); /* erfc(+-inf) = 0.0, 2.0 */
- }
- if (x >= 0) return q_gamma(0.5, x * x, LOG_PI_OVER_2);
- else return 1 + p_gamma(0.5, x * x, LOG_PI_OVER_2);
-}
diff --git a/trunk/missing/file.h b/trunk/missing/file.h
deleted file mode 100644
index 2d491d0fc1..0000000000
--- a/trunk/missing/file.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This is file FILE.H */
-
-#ifndef _FILE_H_
-#define _FILE_H_
-
-#include <fcntl.h>
-
-#ifndef L_SET
-# define L_SET 0 /* seek from beginning. */
-# define L_CURR 1 /* seek from current position. */
-# define L_INCR 1 /* ditto. */
-# define L_XTND 2 /* seek from end. */
-#endif
-
-#ifndef R_OK
-# define R_OK 4 /* test whether readable. */
-# define W_OK 2 /* test whether writable. */
-# define X_OK 1 /* test whether execubale. */
-# define F_OK 0 /* test whether exist. */
-#endif
-
-#endif
diff --git a/trunk/missing/fileblocks.c b/trunk/missing/fileblocks.c
deleted file mode 100644
index ccb8d667b4..0000000000
--- a/trunk/missing/fileblocks.c
+++ /dev/null
@@ -1 +0,0 @@
-/* dummy for autoconf */
diff --git a/trunk/missing/finite.c b/trunk/missing/finite.c
deleted file mode 100644
index 8d0b7af262..0000000000
--- a/trunk/missing/finite.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* public domain rewrite of finite(3) */
-
-int
-finite(double n)
-{
- return !isnan(n) && !isinf(n);
-}
diff --git a/trunk/missing/flock.c b/trunk/missing/flock.c
deleted file mode 100644
index b02f8bf832..0000000000
--- a/trunk/missing/flock.c
+++ /dev/null
@@ -1,129 +0,0 @@
-#include "ruby/config.h"
-
-#if defined _WIN32
-#elif defined HAVE_FCNTL && defined HAVE_FCNTL_H
-
-/* These are the flock() constants. Since this sytems doesn't have
- flock(), the values of the constants are probably not available.
-*/
-# ifndef LOCK_SH
-# define LOCK_SH 1
-# endif
-# ifndef LOCK_EX
-# define LOCK_EX 2
-# endif
-# ifndef LOCK_NB
-# define LOCK_NB 4
-# endif
-# ifndef LOCK_UN
-# define LOCK_UN 8
-# endif
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-int
-flock(int fd, int operation)
-{
- struct flock lock;
-
- switch (operation & ~LOCK_NB) {
- case LOCK_SH:
- lock.l_type = F_RDLCK;
- break;
- case LOCK_EX:
- lock.l_type = F_WRLCK;
- break;
- case LOCK_UN:
- lock.l_type = F_UNLCK;
- break;
- default:
- errno = EINVAL;
- return -1;
- }
- lock.l_whence = SEEK_SET;
- lock.l_start = lock.l_len = 0L;
-
- return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &lock);
-}
-
-#elif defined(HAVE_LOCKF)
-
-#include <unistd.h>
-#include <errno.h>
-
-/* Emulate flock() with lockf() or fcntl(). This is just to increase
- portability of scripts. The calls might not be completely
- interchangeable. What's really needed is a good file
- locking module.
-*/
-
-# ifndef F_ULOCK
-# define F_ULOCK 0 /* Unlock a previously locked region */
-# endif
-# ifndef F_LOCK
-# define F_LOCK 1 /* Lock a region for exclusive use */
-# endif
-# ifndef F_TLOCK
-# define F_TLOCK 2 /* Test and lock a region for exclusive use */
-# endif
-# ifndef F_TEST
-# define F_TEST 3 /* Test a region for other processes locks */
-# endif
-
-/* These are the flock() constants. Since this sytems doesn't have
- flock(), the values of the constants are probably not available.
-*/
-# ifndef LOCK_SH
-# define LOCK_SH 1
-# endif
-# ifndef LOCK_EX
-# define LOCK_EX 2
-# endif
-# ifndef LOCK_NB
-# define LOCK_NB 4
-# endif
-# ifndef LOCK_UN
-# define LOCK_UN 8
-# endif
-
-int
-flock(int fd, int operation)
-{
- switch (operation) {
-
- /* LOCK_SH - get a shared lock */
- case LOCK_SH:
- rb_notimplement();
- return -1;
- /* LOCK_EX - get an exclusive lock */
- case LOCK_EX:
- return lockf (fd, F_LOCK, 0);
-
- /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
- case LOCK_SH|LOCK_NB:
- rb_notimplement();
- return -1;
- /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
- case LOCK_EX|LOCK_NB:
- return lockf (fd, F_TLOCK, 0);
-
- /* LOCK_UN - unlock */
- case LOCK_UN:
- return lockf (fd, F_ULOCK, 0);
-
- /* Default - can't decipher operation */
- default:
- errno = EINVAL;
- return -1;
- }
-}
-#else
-int
-flock(int fd, int operation)
-{
- rb_notimplement();
- return -1;
-}
-#endif
diff --git a/trunk/missing/hypot.c b/trunk/missing/hypot.c
deleted file mode 100644
index 5a663553cf..0000000000
--- a/trunk/missing/hypot.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* public domain rewrite of hypot */
-
-#include <math.h>
-
-double hypot(double x, double y)
-{
- if (x < 0) x = -x;
- if (y < 0) y = -y;
- if (x < y) {
- double tmp = x;
- x = y; y = tmp;
- }
- if (y == 0.0) return x;
- y /= x;
- return x * sqrt(1.0+y*y);
-}
diff --git a/trunk/missing/isinf.c b/trunk/missing/isinf.c
deleted file mode 100644
index 4aef51b213..0000000000
--- a/trunk/missing/isinf.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* public domain rewrite of isinf(3) */
-
-#ifdef __osf__
-
-#define _IEEE 1
-#include <nan.h>
-
-int
-isinf(double n)
-{
- if (IsNANorINF(n) && IsINF(n)) {
- return 1;
- }
- else {
- return 0;
- }
-}
-
-#else
-
-#include "ruby/config.h"
-
-#if defined(HAVE_FINITE) && defined(HAVE_ISNAN)
-
-#include <math.h>
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-
-/*
- * isinf may be provided only as a macro.
- * ex. HP-UX, Solaris 10
- * http://www.gnu.org/software/automake/manual/autoconf/Function-Portability.html
- */
-#ifndef isinf
-int
-isinf(double n)
-{
- return (!finite(n) && !isnan(n));
-}
-#endif
-
-#else
-
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-
-static double zero(void) { return 0.0; }
-static double one (void) { return 1.0; }
-static double inf (void) { return one() / zero(); }
-
-int
-isinf(double n)
-{
- static double pinf = 0.0;
- static double ninf = 0.0;
-
- if (pinf == 0.0) {
- pinf = inf();
- ninf = -pinf;
- }
- return memcmp(&n, &pinf, sizeof n) == 0
- || memcmp(&n, &ninf, sizeof n) == 0;
-}
-#endif
-#endif
diff --git a/trunk/missing/isnan.c b/trunk/missing/isnan.c
deleted file mode 100644
index a8733978ad..0000000000
--- a/trunk/missing/isnan.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* public domain rewrite of isnan(3) */
-
-static int double_ne(double n1, double n2);
-
-int
-isnan(double n)
-{
- return double_ne(n, n);
-}
-
-static int
-double_ne(double n1, double n2)
-{
- return n1 != n2;
-}
diff --git a/trunk/missing/lgamma_r.c b/trunk/missing/lgamma_r.c
deleted file mode 100644
index ba8535b18a..0000000000
--- a/trunk/missing/lgamma_r.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* lgamma_r.c - public domain implementation of function lgamma_r(3m)
-
-lgamma_r() is based on gamma(). modified by Tanaka Akira.
-
-reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
- (New Algorithm handbook in C language) (Gijyutsu hyouron
- sha, Tokyo, 1991) [in Japanese]
- http://oku.edu.mie-u.ac.jp/~okumura/algo/
-*/
-
-/***********************************************************
- gamma.c -- Gamma function
-***********************************************************/
-#include <math.h>
-#include <errno.h>
-#define PI 3.14159265358979324 /* $\pi$ */
-#define LOG_2PI 1.83787706640934548 /* $\log 2\pi$ */
-#define LOG_PI 1.14472988584940017 /* $\log_e \pi$ */
-#define N 8
-
-#define B0 1 /* Bernoulli numbers */
-#define B1 (-1.0 / 2.0)
-#define B2 ( 1.0 / 6.0)
-#define B4 (-1.0 / 30.0)
-#define B6 ( 1.0 / 42.0)
-#define B8 (-1.0 / 30.0)
-#define B10 ( 5.0 / 66.0)
-#define B12 (-691.0 / 2730.0)
-#define B14 ( 7.0 / 6.0)
-#define B16 (-3617.0 / 510.0)
-
-static double
-loggamma(double x) /* the natural logarithm of the Gamma function. */
-{
- double v, w;
-
- if (x == 1.0 || x == 2.0) return 0.0;
-
- v = 1;
- while (x < N) { v *= x; x++; }
- w = 1 / (x * x);
- return ((((((((B16 / (16 * 15)) * w + (B14 / (14 * 13))) * w
- + (B12 / (12 * 11))) * w + (B10 / (10 * 9))) * w
- + (B8 / ( 8 * 7))) * w + (B6 / ( 6 * 5))) * w
- + (B4 / ( 4 * 3))) * w + (B2 / ( 2 * 1))) / x
- + 0.5 * LOG_2PI - log(v) - x + (x - 0.5) * log(x);
-}
-
-/* the natural logarithm of the absolute value of the Gamma function */
-double
-lgamma_r(double x, int *signp)
-{
- if (x <= 0) {
- double i, f, s;
- f = modf(-x, &i);
- if (f == 0.0) { /* pole error */
- *signp = 1;
- errno = ERANGE;
- return HUGE_VAL;
- }
- *signp = (fmod(i, 2.0) != 0.0) ? 1 : -1;
- s = sin(PI * f);
- if (s < 0) s = -s;
- return LOG_PI - log(s) - loggamma(1 - x);
- }
- *signp = 1;
- return loggamma(x);
-}
diff --git a/trunk/missing/memcmp.c b/trunk/missing/memcmp.c
deleted file mode 100644
index 5b3ad3817a..0000000000
--- a/trunk/missing/memcmp.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* public domain rewrite of memcmp(3) */
-
-#include <stddef.h>
-
-int
-memcmp(const void *s1, const void *s2, size_t len)
-{
- register unsigned char *a = (unsigned char*)s1;
- register unsigned char *b = (unsigned char*)s2;
- register int tmp;
-
- for (; len; --len) {
- if (tmp = *a++ - *b++)
- return tmp;
- }
- return 0;
-}
diff --git a/trunk/missing/memmove.c b/trunk/missing/memmove.c
deleted file mode 100644
index 19c5f18847..0000000000
--- a/trunk/missing/memmove.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* public domain rewrite of memcmp(3) */
-
-#include <stddef.h>
-
-void *
-memmove(void *d, const void *s, size_t n)
-{
- char *dst = (char *)d;
- const char *src = (const char *)s;
-
- if (src < dst) {
- src += n;
- dst += n;
- for (; n; --n)
- *--dst = *--src;
- }
- else if (dst < src)
- for (; n; --n)
- *dst++ = *src++;
- return d;
-}
diff --git a/trunk/missing/os2.c b/trunk/missing/os2.c
deleted file mode 100644
index 3448cdc281..0000000000
--- a/trunk/missing/os2.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/* os/2 compatibility functions -- follows Ruby's license */
-
-#include "ruby.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <process.h>
-#include <limits.h>
-#include <errno.h>
-
-#define INCL_DOS
-#include <os2.h>
-
-int
-chown(char *path, int owner, int group)
-{
- return 0;
-}
-
-#if 0
-int
-link(char *from, char *to)
-{
- return -1;
-}
-#endif
-
-#if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD) \
- || defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
-#include <unistd.h>
-
-#if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD)
-/* to handle the drive letter and DBCS characters within a given path */
-char *
-getcwd(char *path, size_t len)
-{
- return _getcwd2(path, (int)len);
-}
-#endif
-
-#if defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
-/* to handle the drive letter and DBCS characters within a given path */
-int
-chdir(__const__ char *path)
-{
- return _chdir2(path);
-}
-#endif
-#endif
-
-typedef char* CHARP;
-
-int
-do_spawn(cmd)
-char *cmd;
-{
- register char **a;
- register char *s;
- char **argv;
- char *shell, *sw, *cmd2;
- int status;
-
- if ((shell = getenv("RUBYSHELL")) != NULL && *shell != '\0') {
- s = shell;
- do
- *s = isupper(*s) ? tolower(*s) : *s;
- while (*++s);
- if (strstr(shell, "cmd") || strstr(shell, "4os2"))
- sw = "/c";
- else
- sw = "-c";
- } else if ((shell = getenv("SHELL")) != NULL && *shell != '\0') {
- s = shell;
- do
- *s = isupper(*s) ? tolower(*s) : *s;
- while (*++s);
- if (strstr(shell, "cmd") || strstr(shell, "4os2"))
- sw = "/c";
- else
- sw = "-c";
- } else if ((shell = getenv("COMSPEC")) != NULL && *shell != '\0') {
- s = shell;
- do
- *s = isupper(*s) ? tolower(*s) : *s;
- while (*++s);
- if (strstr(shell, "cmd") || strstr(shell, "4os2"))
- sw = "/c";
- else
- sw = "-c";
- }
- /* see if there are shell metacharacters in it */
- /*SUPPRESS 530*/
- /* for (s = cmd; *s && isalpha(*s); s++) ;
- if (*s == '=')
- goto doshell; */
- for (s = cmd; *s; s++) {
- if (*sw == '-' && *s != ' ' &&
- !isalpha(*s) && index("$&*(){}[]'\";\\|?<>~`\n",*s)) {
- if (*s == '\n' && !s[1]) {
- *s = '\0';
- break;
- }
- goto doshell;
- } else if (*sw == '/' && *s != ' ' &&
- !isalpha(*s) && index("^()<>|&\n",*s)) {
- if (*s == '\n' && !s[1]) {
- *s = '\0';
- break;
- }
- doshell:
- status = spawnlp(P_WAIT,shell,shell,sw,cmd,(char*)NULL);
- return status;
- }
- }
- argv = ALLOC_N(CHARP,(strlen(cmd) / 2 + 2));
- cmd2 = ALLOC_N(char, (strlen(cmd) + 1));
- strcpy(cmd2, cmd);
- a = argv;
- for (s = cmd2; *s;) {
- while (*s && isspace(*s)) s++;
- if (*s)
- *(a++) = s;
- while (*s && !isspace(*s)) s++;
- if (*s)
- *s++ = '\0';
- }
- *a = NULL;
- if (argv[0]) {
- if ((status = spawnvp(P_WAIT, argv[0], argv)) == -1) {
- free(argv);
- free(cmd2);
- return -1;
- }
- }
- free(cmd2);
- free(argv);
- return status;
-}
diff --git a/trunk/missing/strchr.c b/trunk/missing/strchr.c
deleted file mode 100644
index bebd7ba578..0000000000
--- a/trunk/missing/strchr.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* public domain rewrite of strchr(3) and strrchr(3) */
-
-char *
-strchr(const char *s, int c)
-{
- if (c == 0) return (char *)s + strlen(s);
- while (*s) {
- if (*s == c)
- return (char *)s;
- s++;
- }
- return 0;
-}
-
-char *
-strrchr(const char *s, int c)
-{
- const char *save;
-
- if (c == 0) return (char *)s + strlen(s);
- save = 0;
- while (*s) {
- if (*s == c)
- save = s;
- s++;
- }
- return (char *)save;
-}
diff --git a/trunk/missing/strerror.c b/trunk/missing/strerror.c
deleted file mode 100644
index 023935a1ff..0000000000
--- a/trunk/missing/strerror.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* public domain rewrite of strerror(3) */
-
-extern int sys_nerr;
-extern char *sys_errlist[];
-
-static char msg[50];
-
-char *
-strerror(int error)
-{
- if (error <= sys_nerr && error > 0) {
- return sys_errlist[error];
- }
- sprintf(msg, "Unknown error (%d)", error);
- return msg;
-}
diff --git a/trunk/missing/strlcat.c b/trunk/missing/strlcat.c
deleted file mode 100644
index b309648155..0000000000
--- a/trunk/missing/strlcat.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $ */
-
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * 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. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
- * Returns strlen(src) + MIN(siz, strlen(initial dst)).
- * If retval >= siz, truncation occurred.
- */
-size_t
-strlcat(dst, src, siz)
- char *dst;
- const char *src;
- size_t siz;
-{
- register char *d = dst;
- register const char *s = src;
- register size_t n = siz;
- size_t dlen;
-
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = d - dst;
- n = siz - dlen;
-
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
- }
- *d = '\0';
-
- return(dlen + (s - src)); /* count does not include NUL */
-}
diff --git a/trunk/missing/strlcpy.c b/trunk/missing/strlcpy.c
deleted file mode 100644
index 5f586964b7..0000000000
--- a/trunk/missing/strlcpy.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* $OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $ */
-
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * 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. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
- */
-size_t
-strlcpy(dst, src, siz)
- char *dst;
- const char *src;
- size_t siz;
-{
- register char *d = dst;
- register const char *s = src;
- register size_t n = siz;
-
- /* Copy as many bytes as will fit */
- if (n != 0 && --n != 0) {
- do {
- if ((*d++ = *s++) == 0)
- break;
- } while (--n != 0);
- }
-
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
- ;
- }
-
- return(s - src - 1); /* count does not include NUL */
-}
diff --git a/trunk/missing/strstr.c b/trunk/missing/strstr.c
deleted file mode 100644
index 2e9c282fb1..0000000000
--- a/trunk/missing/strstr.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* public domain rewrite of strstr(3) */
-
-char *
-strstr(const char *haystack, const char *needle)
-{
- const char *hend;
- const char *a, *b;
-
- if (*needle == 0) return (char *)haystack;
- hend = haystack + strlen(haystack) - strlen(needle) + 1;
- while (haystack < hend) {
- if (*haystack == *needle) {
- a = haystack;
- b = needle;
- for (;;) {
- if (*b == 0) return (char *)haystack;
- if (*a++ != *b++) {
- break;
- }
- }
- }
- haystack++;
- }
- return 0;
-}
diff --git a/trunk/missing/strtol.c b/trunk/missing/strtol.c
deleted file mode 100644
index da6636f316..0000000000
--- a/trunk/missing/strtol.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* public domain rewrite of strtol(3) */
-
-#include <ctype.h>
-
-long
-strtol(const char *nptr, char **endptr, int base)
-{
- long result;
- const char *p = nptr;
-
- while (isspace(*p)) {
- p++;
- }
- if (*p == '-') {
- p++;
- result = -strtoul(p, endptr, base);
- }
- else {
- if (*p == '+') p++;
- result = strtoul(p, endptr, base);
- }
- if (endptr != 0 && *endptr == p) {
- *endptr = (char *)nptr;
- }
- return result;
-}
diff --git a/trunk/missing/tgamma.c b/trunk/missing/tgamma.c
deleted file mode 100644
index 5e306fbb43..0000000000
--- a/trunk/missing/tgamma.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* tgamma.c - public domain implementation of function tgamma(3m)
-
-reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
- (New Algorithm handbook in C language) (Gijyutsu hyouron
- sha, Tokyo, 1991) [in Japanese]
- http://oku.edu.mie-u.ac.jp/~okumura/algo/
-*/
-
-/***********************************************************
- gamma.c -- Gamma function
-***********************************************************/
-#include "ruby/config.h"
-#include <math.h>
-#include <errno.h>
-
-#ifdef HAVE_LGAMMA_R
-
-double tgamma(double x)
-{
- int sign;
- double d;
- if (x == 0.0) { /* Pole Error */
- errno = ERANGE;
- return 1/x < 0 ? -HUGE_VAL : HUGE_VAL;
- }
- if (x < 0) {
- static double zero = 0.0;
- double i, f;
- f = modf(-x, &i);
- if (f == 0.0) { /* Domain Error */
- errno = EDOM;
- return zero/zero;
- }
- }
- d = lgamma_r(x, &sign);
- return sign * exp(d);
-}
-
-#else
-
-#include <errno.h>
-#define PI 3.14159265358979324 /* $\pi$ */
-#define LOG_2PI 1.83787706640934548 /* $\log 2\pi$ */
-#define N 8
-
-#define B0 1 /* Bernoulli numbers */
-#define B1 (-1.0 / 2.0)
-#define B2 ( 1.0 / 6.0)
-#define B4 (-1.0 / 30.0)
-#define B6 ( 1.0 / 42.0)
-#define B8 (-1.0 / 30.0)
-#define B10 ( 5.0 / 66.0)
-#define B12 (-691.0 / 2730.0)
-#define B14 ( 7.0 / 6.0)
-#define B16 (-3617.0 / 510.0)
-
-static double
-loggamma(double x) /* the natural logarithm of the Gamma function. */
-{
- double v, w;
-
- v = 1;
- while (x < N) { v *= x; x++; }
- w = 1 / (x * x);
- return ((((((((B16 / (16 * 15)) * w + (B14 / (14 * 13))) * w
- + (B12 / (12 * 11))) * w + (B10 / (10 * 9))) * w
- + (B8 / ( 8 * 7))) * w + (B6 / ( 6 * 5))) * w
- + (B4 / ( 4 * 3))) * w + (B2 / ( 2 * 1))) / x
- + 0.5 * LOG_2PI - log(v) - x + (x - 0.5) * log(x);
-}
-
-double tgamma(double x) /* Gamma function */
-{
- if (x == 0.0) { /* Pole Error */
- errno = ERANGE;
- return 1/x < 0 ? -HUGE_VAL : HUGE_VAL;
- }
- if (x < 0) {
- int sign;
- static double zero = 0.0;
- double i, f;
- f = modf(-x, &i);
- if (f == 0.0) { /* Domain Error */
- errno = EDOM;
- return zero/zero;
- }
- sign = (fmod(i, 2.0) != 0.0) ? 1 : -1;
- return sign * PI / (sin(PI * f) * exp(loggamma(1 - x)));
- }
- return exp(loggamma(x));
-}
-#endif
diff --git a/trunk/missing/vsnprintf.c b/trunk/missing/vsnprintf.c
deleted file mode 100644
index 17990a57fc..0000000000
--- a/trunk/missing/vsnprintf.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * 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. 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.
- */
-
-/*
- * IMPORTANT NOTE:
- * --------------
- * From ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
- * paragraph 3 above is now null and void.
- */
-
-/* SNPRINTF.C
- * fjc 7-31-97 Modified by Mib Software to be a standalone snprintf.c module.
- * http://www.mibsoftware.com
- * Mib Software does not warrant this software any differently than the
- * University of California, Berkeley as described above. All warranties
- * are disclaimed. Use this software at your own risk.
- *
- * All code referencing FILE * functions was eliminated, since it could
- * never be called. All header files and necessary files are collapsed
- * into one file, internal functions are declared static. This should
- * allow inclusion into libraries with less chance of namespace collisions.
- *
- * snprintf should be the only externally visible item.
- *
- * As of 7-31-97 FLOATING_POINT is NOT provided. The code is somewhat
- * non-portable, so it is disabled.
- */
-
-/* Define FLOATING_POINT to get floating point. */
-/*
-#define FLOATING_POINT
-*/
-
-#include <sys/types.h>
-#define u_long unsigned long
-#define u_short unsigned short
-#define u_int unsigned int
-
-#if !defined(HAVE_STDARG_PROTOTYPES)
-#if defined(__STDC__)
-#define HAVE_STDARG_PROTOTYPES 1
-#endif
-#endif
-
-#undef __P
-#if defined(HAVE_STDARG_PROTOTYPES)
-# include <stdarg.h>
-# if !defined(__P)
-# define __P(x) x
-# endif
-#else
-# define __P(x) ()
-# if !defined(const)
-# define const
-# endif
-# include <varargs.h>
-#endif
-#ifndef _BSD_VA_LIST_
-#define _BSD_VA_LIST_ va_list
-#endif
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# ifndef LONG_MAX
-# ifdef HAVE_LIMITS_H
-# include <limits.h>
-# else
- /* assuming 32bit(2's compliment) long */
-# define LONG_MAX 2147483647
-# endif
-# endif
-#endif
-
-#if defined(__hpux) && !defined(__GNUC__) && !defined(__STDC__)
-#define const
-#endif
-
-#if defined(sgi)
-#undef __const
-#define __const
-#endif /* People who don't like const sys_error */
-
-#include <stddef.h>
-#if defined(__hpux) && !defined(__GNUC__) || defined(__DECC)
-#include <string.h>
-#endif
-
-#if !defined(__CYGWIN32__) && defined(__hpux) && !defined(__GNUC__)
-#include <stdlib.h>
-#endif
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-/*
- * NB: to fit things in six character monocase externals, the stdio
- * code uses the prefix `__s' for stdio objects, typically followed
- * by a three-character attempt at a mnemonic.
- */
-
-/* stdio buffers */
-struct __sbuf {
- unsigned char *_base;
- size_t _size;
-};
-
-
-/*
- * stdio state variables.
- *
- * The following always hold:
- *
- * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
- * _lbfsize is -_bf._size, else _lbfsize is 0
- * if _flags&__SRD, _w is 0
- * if _flags&__SWR, _r is 0
- *
- * This ensures that the getc and putc macros (or inline functions) never
- * try to write or read from a file that is in `read' or `write' mode.
- * (Moreover, they can, and do, automatically switch from read mode to
- * write mode, and back, on "r+" and "w+" files.)
- *
- * _lbfsize is used only to make the inline line-buffered output stream
- * code as compact as possible.
- *
- * _ub, _up, and _ur are used when ungetc() pushes back more characters
- * than fit in the current _bf, or when ungetc() pushes back a character
- * that does not match the previous one in _bf. When this happens,
- * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
- * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
- *
- * NB: see WARNING above before changing the layout of this structure!
- */
-typedef struct __sFILE {
- unsigned char *_p; /* current position in (some) buffer */
-#if 0
- size_t _r; /* read space left for getc() */
-#endif
- size_t _w; /* write space left for putc() */
- short _flags; /* flags, below; this FILE is free if 0 */
- short _file; /* fileno, if Unix descriptor, else -1 */
- struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
- size_t _lbfsize; /* 0 or -_bf._size, for inline putc */
- int (*vwrite)(/* struct __sFILE*, struct __suio * */);
-} FILE;
-
-
-#define __SLBF 0x0001 /* line buffered */
-#define __SNBF 0x0002 /* unbuffered */
-#define __SRD 0x0004 /* OK to read */
-#define __SWR 0x0008 /* OK to write */
- /* RD and WR are never simultaneously asserted */
-#define __SRW 0x0010 /* open for reading & writing */
-#define __SEOF 0x0020 /* found EOF */
-#define __SERR 0x0040 /* found error */
-#define __SMBF 0x0080 /* _buf is from malloc */
-#define __SAPP 0x0100 /* fdopen()ed in append mode */
-#define __SSTR 0x0200 /* this is an sprintf/snprintf string */
-#define __SOPT 0x0400 /* do fseek() optimisation */
-#define __SNPT 0x0800 /* do not do fseek() optimisation */
-#define __SOFF 0x1000 /* set iff _offset is in fact correct */
-#define __SMOD 0x2000 /* true => fgetln modified _p text */
-
-
-#define EOF (-1)
-
-
-#define __sfeof(p) (((p)->_flags & __SEOF) != 0)
-#define __sferror(p) (((p)->_flags & __SERR) != 0)
-#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
-#define __sfileno(p) ((p)->_file)
-
-#undef feof
-#undef ferror
-#undef clearerr
-#define feof(p) __sfeof(p)
-#define ferror(p) __sferror(p)
-#define clearerr(p) __sclearerr(p)
-
-#ifndef _ANSI_SOURCE
-#define fileno(p) __sfileno(p)
-#endif
-
-
-/*
- * I/O descriptors for __sfvwrite().
- */
-struct __siov {
- const void *iov_base;
- size_t iov_len;
-};
-struct __suio {
- struct __siov *uio_iov;
- int uio_iovcnt;
- int uio_resid;
-};
-
-#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_SNPRINTF)
-/*
- * Write some memory regions. Return zero on success, EOF on error.
- *
- * This routine is large and unsightly, but most of the ugliness due
- * to the three different kinds of output buffering is handled here.
- */
-static int BSD__sfvwrite(fp, uio)
- register FILE *fp;
- register struct __suio *uio;
-{
- register size_t len;
- register char *p;
- register struct __siov *iov;
- register int w;
-
- if ((len = uio->uio_resid) == 0)
- return (0);
-#ifndef __hpux
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-#define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
-
- iov = uio->uio_iov;
- p = iov->iov_base;
- len = iov->iov_len;
- iov++;
-#define GETIOV(extra_work) \
- while (len == 0) { \
- extra_work; \
- p = iov->iov_base; \
- len = iov->iov_len; \
- iov++; \
- }
- if (fp->_flags & __SNBF) {
- /* fjc 7-31-97 Will never happen. We are working with
- strings only
- */
- } else if ((fp->_flags & __SLBF) == 0) {
- /*
- * Fully buffered: fill partially full buffer, if any,
- * and then flush. If there is no partial buffer, write
- * one _bf._size byte chunk directly (without copying).
- *
- * String output is a special case: write as many bytes
- * as fit, but pretend we wrote everything. This makes
- * snprintf() return the number of bytes needed, rather
- * than the number used, and avoids its write function
- * (so that the write function can be invalid).
- */
- do {
- GETIOV(;);
- w = fp->_w;
- if (fp->_flags & __SSTR) {
- if (len < w)
- w = len;
- COPY(w); /* copy MIN(fp->_w,len), */
- fp->_w -= w;
- fp->_p += w;
- w = len; /* but pretend copied all */
- } else {
- /* fjc 7-31-97 Will never happen. We are working with
- strings only
- */
- }
- p += w;
- len -= w;
- } while ((uio->uio_resid -= w) != 0);
- } else {
- /* fjc 7-31-97 Will never happen. We are working with
- strings only
- */
- }
- return (0);
-}
-#endif
-
-/*
- * Actual printf innards.
- *
- * This code is large and complicated...
- */
-
-/*
- * Flush out all the vectors defined by the given uio,
- * then reset it so that it can be reused.
- */
-static int
-BSD__sprint(FILE *fp, register struct __suio *uio)
-{
- register int err;
-
- if (uio->uio_resid == 0) {
- uio->uio_iovcnt = 0;
- return (0);
- }
- err = (*fp->vwrite)(fp, uio);
- uio->uio_resid = 0;
- uio->uio_iovcnt = 0;
- return (err);
-}
-
-
-/*
- * Helper function for `fprintf to unbuffered unix file': creates a
- * temporary buffer. We only work on write-only files; this avoids
- * worries about ungetc buffers and so forth.
- */
-static int
-BSD__sbprintf(register FILE *fp, const char *fmt, va_list ap)
-{
-/* We don't support files. */
- return 0;
-}
-
-
-/*
- * Macros for converting digits to letters and vice versa
- */
-#define to_digit(c) ((c) - '0')
-#define is_digit(c) ((unsigned)to_digit(c) <= 9)
-#define to_char(n) ((n) + '0')
-
-#ifdef _HAVE_SANE_QUAD_
-/*
- * Convert an unsigned long long to ASCII for printf purposes, returning
- * a pointer to the first character of the string representation.
- * Octal numbers can be forced to have a leading zero; hex numbers
- * use the given digits.
- */
-static char *
-BSD__uqtoa(register u_quad_t val, char *endp, int base, int octzero, const char *xdigs)
-{
- register char *cp = endp;
- register long sval;
-
- /*
- * Handle the three cases separately, in the hope of getting
- * better/faster code.
- */
- switch (base) {
- case 10:
- if (val < 10) { /* many numbers are 1 digit */
- *--cp = to_char(val);
- return (cp);
- }
- /*
- * On many machines, unsigned arithmetic is harder than
- * signed arithmetic, so we do at most one unsigned mod and
- * divide; this is sufficient to reduce the range of
- * the incoming value to where signed arithmetic works.
- */
- if (val > LLONG_MAX) {
- *--cp = to_char(val % 10);
- sval = val / 10;
- } else
- sval = val;
- do {
- *--cp = to_char(sval % 10);
- sval /= 10;
- } while (sval != 0);
- break;
-
- case 8:
- do {
- *--cp = to_char(val & 7);
- val >>= 3;
- } while (val);
- if (octzero && *cp != '0')
- *--cp = '0';
- break;
-
- case 16:
- do {
- *--cp = xdigs[val & 15];
- val >>= 4;
- } while (val);
- break;
-
- default: /* oops */
- /*
- abort();
- */
- break; /* fjc 7-31-97. Don't reference abort() here */
- }
- return (cp);
-}
-#endif /* _HAVE_SANE_QUAD_ */
-
-/*
- * Convert an unsigned long to ASCII for printf purposes, returning
- * a pointer to the first character of the string representation.
- * Octal numbers can be forced to have a leading zero; hex numbers
- * use the given digits.
- */
-static char *
-BSD__ultoa(register u_long val, char *endp, int base, int octzero, const char *xdigs)
-{
- register char *cp = endp;
- register long sval;
-
- /*
- * Handle the three cases separately, in the hope of getting
- * better/faster code.
- */
- switch (base) {
- case 10:
- if (val < 10) { /* many numbers are 1 digit */
- *--cp = to_char(val);
- return (cp);
- }
- /*
- * On many machines, unsigned arithmetic is harder than
- * signed arithmetic, so we do at most one unsigned mod and
- * divide; this is sufficient to reduce the range of
- * the incoming value to where signed arithmetic works.
- */
- if (val > LONG_MAX) {
- *--cp = to_char(val % 10);
- sval = val / 10;
- } else
- sval = val;
- do {
- *--cp = to_char(sval % 10);
- sval /= 10;
- } while (sval != 0);
- break;
-
- case 8:
- do {
- *--cp = to_char(val & 7);
- val >>= 3;
- } while (val);
- if (octzero && *cp != '0')
- *--cp = '0';
- break;
-
- case 16:
- do {
- *--cp = xdigs[val & 15];
- val >>= 4;
- } while (val);
- break;
-
- default: /* oops */
- /*
- abort();
- */
- break; /* fjc 7-31-97. Don't reference abort() here */
- }
- return (cp);
-}
-
-#ifdef FLOATING_POINT
-#include <math.h>
-/* #include "floatio.h" */
-
-#ifndef MAXEXP
-# define MAXEXP 1024
-#endif
-
-#ifndef MAXFRACT
-# define MAXFRACT 64
-#endif
-
-#define BUF (MAXEXP+MAXFRACT+1) /* + decimal point */
-#define DEFPREC 6
-
-static char *cvt __P((double, int, int, char *, int *, int, int *));
-static int exponent __P((char *, int, int));
-
-#else /* no FLOATING_POINT */
-
-#define BUF 68
-
-#endif /* FLOATING_POINT */
-
-
-/*
- * Flags used during conversion.
- */
-#define ALT 0x001 /* alternate form */
-#define HEXPREFIX 0x002 /* add 0x or 0X prefix */
-#define LADJUST 0x004 /* left adjustment */
-#define LONGDBL 0x008 /* long double; unimplemented */
-#define LONGINT 0x010 /* long integer */
-
-#ifdef _HAVE_SANE_QUAD_
-#define QUADINT 0x020 /* quad integer */
-#endif /* _HAVE_SANE_QUAD_ */
-
-#define SHORTINT 0x040 /* short integer */
-#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */
-#define FPT 0x100 /* Floating point number */
-static int
-BSD_vfprintf(FILE *fp, const char *fmt0, va_list ap)
-{
- register const char *fmt; /* format string */
- register int ch; /* character from fmt */
- register int n; /* handy integer (short term usage) */
- register const char *cp;/* handy char pointer (short term usage) */
- register struct __siov *iovp;/* for PRINT macro */
- register int flags; /* flags as above */
- int ret; /* return value accumulator */
- int width; /* width from format (%8d), or 0 */
- int prec; /* precision from format (%.3d), or -1 */
- char sign; /* sign prefix (' ', '+', '-', or \0) */
-#ifdef FLOATING_POINT
- char softsign; /* temporary negative sign for floats */
- double _double = 0; /* double precision arguments %[eEfgG] */
- int expt; /* integer value of exponent */
- int expsize = 0; /* character count for expstr */
- int ndig = 0; /* actual number of digits returned by cvt */
- char expstr[7]; /* buffer for exponent string */
-#endif
- u_long ulval; /* integer arguments %[diouxX] */
-#ifdef _HAVE_SANE_QUAD_
- u_quad_t uqval; /* %q integers */
-#endif /* _HAVE_SANE_QUAD_ */
- int base; /* base for [diouxX] conversion */
- int dprec; /* a copy of prec if [diouxX], 0 otherwise */
- int fieldsz; /* field size expanded by sign, etc */
- int realsz; /* field size expanded by dprec */
- int size; /* size of converted field or string */
- const char *xdigs = 0; /* digits for [xX] conversion */
-#define NIOV 8
- struct __suio uio; /* output information: summary */
- struct __siov iov[NIOV];/* ... and individual io vectors */
- char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */
- char ox[2]; /* space for 0x hex-prefix */
- char *const ebuf = buf + sizeof(buf);
-
- /*
- * Choose PADSIZE to trade efficiency vs. size. If larger printf
- * fields occur frequently, increase PADSIZE and make the initializers
- * below longer.
- */
-#define PADSIZE 16 /* pad chunk size */
- static const char blanks[PADSIZE] =
- {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
- static const char zeroes[PADSIZE] =
- {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
-
- /*
- * BEWARE, these `goto error' on error, and PAD uses `n'.
- */
-#define PRINT(ptr, len) { \
- iovp->iov_base = (ptr); \
- iovp->iov_len = (len); \
- uio.uio_resid += (len); \
- iovp++; \
- if (++uio.uio_iovcnt >= NIOV) { \
- if (BSD__sprint(fp, &uio)) \
- goto error; \
- iovp = iov; \
- } \
-}
-#define PAD(howmany, with) { \
- if ((n = (howmany)) > 0) { \
- while (n > PADSIZE) { \
- PRINT(with, PADSIZE); \
- n -= PADSIZE; \
- } \
- PRINT(with, n); \
- } \
-}
-#define FLUSH() { \
- if (uio.uio_resid && BSD__sprint(fp, &uio)) \
- goto error; \
- uio.uio_iovcnt = 0; \
- iovp = iov; \
-}
-
- /*
- * To extend shorts properly, we need both signed and unsigned
- * argument extraction methods.
- */
-#define SARG() \
- (flags&LONGINT ? va_arg(ap, long) : \
- flags&SHORTINT ? (long)(short)va_arg(ap, int) : \
- (long)va_arg(ap, int))
-#define UARG() \
- (flags&LONGINT ? va_arg(ap, u_long) : \
- flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \
- (u_long)va_arg(ap, u_int))
-
- /* optimise fprintf(stderr) (and other unbuffered Unix files) */
- if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) &&
- fp->_file >= 0)
- return (BSD__sbprintf(fp, fmt0, ap));
-
- fmt = fmt0;
- uio.uio_iov = iovp = iov;
- uio.uio_resid = 0;
- uio.uio_iovcnt = 0;
- ret = 0;
- xdigs = 0;
-
- /*
- * Scan the format for conversions (`%' character).
- */
- for (;;) {
- for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++)
- /* void */;
- if ((n = fmt - cp) != 0) {
- PRINT(cp, n);
- ret += n;
- }
- if (ch == '\0')
- goto done;
- fmt++; /* skip over '%' */
-
- flags = 0;
- dprec = 0;
- width = 0;
- prec = -1;
- sign = '\0';
-
-rflag: ch = *fmt++;
-reswitch: switch (ch) {
- case ' ':
- /*
- * ``If the space and + flags both appear, the space
- * flag will be ignored.''
- * -- ANSI X3J11
- */
- if (!sign)
- sign = ' ';
- goto rflag;
- case '#':
- flags |= ALT;
- goto rflag;
- case '*':
- /*
- * ``A negative field width argument is taken as a
- * - flag followed by a positive field width.''
- * -- ANSI X3J11
- * They don't exclude field widths read from args.
- */
- if ((width = va_arg(ap, int)) >= 0)
- goto rflag;
- width = -width;
- /* FALLTHROUGH */
- case '-':
- flags |= LADJUST;
- goto rflag;
- case '+':
- sign = '+';
- goto rflag;
- case '.':
- if ((ch = *fmt++) == '*') {
- n = va_arg(ap, int);
- prec = n < 0 ? -1 : n;
- goto rflag;
- }
- n = 0;
- while (is_digit(ch)) {
- n = 10 * n + to_digit(ch);
- ch = *fmt++;
- }
- prec = n < 0 ? -1 : n;
- goto reswitch;
- case '0':
- /*
- * ``Note that 0 is taken as a flag, not as the
- * beginning of a field width.''
- * -- ANSI X3J11
- */
- flags |= ZEROPAD;
- goto rflag;
- case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- n = 0;
- do {
- n = 10 * n + to_digit(ch);
- ch = *fmt++;
- } while (is_digit(ch));
- width = n;
- goto reswitch;
-#ifdef FLOATING_POINT
- case 'L':
- flags |= LONGDBL;
- goto rflag;
-#endif
- case 'h':
- flags |= SHORTINT;
- goto rflag;
- case 'l':
- flags |= LONGINT;
- goto rflag;
-#ifdef _HAVE_SANE_QUAD_
- case 'q':
- flags |= QUADINT;
- goto rflag;
-#endif /* _HAVE_SANE_QUAD_ */
- case 'c':
- cp = buf;
- *buf = (char)va_arg(ap, int);
- size = 1;
- sign = '\0';
- break;
- case 'D':
- flags |= LONGINT;
- /*FALLTHROUGH*/
- case 'd':
- case 'i':
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT) {
- uqval = va_arg(ap, quad_t);
- if ((quad_t)uqval < 0) {
- uqval = -uqval;
- sign = '-';
- }
- } else
-#endif /* _HAVE_SANE_QUAD_ */
- {
- ulval = SARG();
- if ((long)ulval < 0) {
- ulval = -ulval;
- sign = '-';
- }
- }
- base = 10;
- goto number;
-#ifdef FLOATING_POINT
- case 'e': /* anomalous precision */
- case 'E':
- prec = (prec == -1) ?
- DEFPREC + 1 : prec + 1;
- /* FALLTHROUGH */
- goto fp_begin;
- case 'f': /* always print trailing zeroes */
- if (prec != 0)
- flags |= ALT;
- case 'g':
- case 'G':
- if (prec == -1)
- prec = DEFPREC;
-fp_begin: _double = va_arg(ap, double);
- /* do this before tricky precision changes */
- if (isinf(_double)) {
- if (_double < 0)
- sign = '-';
- cp = "Inf";
- size = 3;
- break;
- }
- if (isnan(_double)) {
- cp = "NaN";
- size = 3;
- break;
- }
- flags |= FPT;
- cp = cvt(_double, prec, flags, &softsign,
- &expt, ch, &ndig);
- if (ch == 'g' || ch == 'G') {
- if (expt <= -4 || expt > prec)
- ch = (ch == 'g') ? 'e' : 'E';
- else
- ch = 'g';
- }
- if (ch <= 'e') { /* 'e' or 'E' fmt */
- --expt;
- expsize = exponent(expstr, expt, ch);
- size = expsize + ndig;
- if (ndig > 1 || flags & ALT)
- ++size;
- } else if (ch == 'f') { /* f fmt */
- if (expt > 0) {
- size = expt;
- if (prec || flags & ALT)
- size += prec + 1;
- } else /* "0.X" */
- size = prec + 2;
- } else if (expt >= ndig) { /* fixed g fmt */
- size = expt;
- if (flags & ALT)
- ++size;
- } else
- size = ndig + (expt > 0 ?
- 1 : 2 - expt);
-
- if (softsign)
- sign = '-';
- break;
-#endif /* FLOATING_POINT */
- case 'n':
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT)
- *va_arg(ap, quad_t *) = ret;
- else if (flags & LONGINT)
-#else /* _HAVE_SANE_QUAD_ */
- if (flags & LONGINT)
-#endif /* _HAVE_SANE_QUAD_ */
- *va_arg(ap, long *) = ret;
- else if (flags & SHORTINT)
- *va_arg(ap, short *) = ret;
- else
- *va_arg(ap, int *) = ret;
- continue; /* no output */
- case 'O':
- flags |= LONGINT;
- /*FALLTHROUGH*/
- case 'o':
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT)
- uqval = va_arg(ap, u_quad_t);
- else
-#endif /* _HAVE_SANE_QUAD_ */
- ulval = UARG();
- base = 8;
- goto nosign;
- case 'p':
- /*
- * ``The argument shall be a pointer to void. The
- * value of the pointer is converted to a sequence
- * of printable characters, in an implementation-
- * defined manner.''
- * -- ANSI X3J11
- */
- prec = sizeof(void*)*CHAR_BIT/4;
-#ifdef _HAVE_LLP64_
- uqval = (u_long)va_arg(ap, void *);
- flags = (flags) | QUADINT | HEXPREFIX;
-#else
- ulval = (u_long)va_arg(ap, void *);
-#ifdef _HAVE_SANE_QUAD_
- flags = (flags & ~QUADINT) | HEXPREFIX;
-#else /* _HAVE_SANE_QUAD_ */
- flags = (flags) | HEXPREFIX;
-#endif /* _HAVE_SANE_QUAD_ */
-#endif
- base = 16;
- xdigs = "0123456789abcdef";
- ch = 'x';
- goto nosign;
- case 's':
- if ((cp = va_arg(ap, char *)) == NULL)
- cp = "(null)";
- if (prec >= 0) {
- /*
- * can't use strlen; can only look for the
- * NUL in the first `prec' characters, and
- * strlen() will go further.
- */
- const char *p = (char *)memchr(cp, 0, prec);
-
- if (p != NULL) {
- size = p - cp;
- if (size > prec)
- size = prec;
- } else
- size = prec;
- } else
- size = strlen(cp);
- sign = '\0';
- break;
- case 'U':
- flags |= LONGINT;
- /*FALLTHROUGH*/
- case 'u':
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT)
- uqval = va_arg(ap, u_quad_t);
- else
-#endif /* _HAVE_SANE_QUAD_ */
- ulval = UARG();
- base = 10;
- goto nosign;
- case 'X':
- xdigs = "0123456789ABCDEF";
- goto hex;
- case 'x':
- xdigs = "0123456789abcdef";
-hex:
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT)
- uqval = va_arg(ap, u_quad_t);
- else
-#endif /* _HAVE_SANE_QUAD_ */
- ulval = UARG();
- base = 16;
- /* leading 0x/X only if non-zero */
- if (flags & ALT &&
-#ifdef _HAVE_SANE_QUAD_
- (flags & QUADINT ? uqval != 0 : ulval != 0)
-#else /* _HAVE_SANE_QUAD_ */
- ulval != 0
-#endif /* _HAVE_SANE_QUAD_ */
- )
- flags |= HEXPREFIX;
-
- /* unsigned conversions */
-nosign: sign = '\0';
- /*
- * ``... diouXx conversions ... if a precision is
- * specified, the 0 flag will be ignored.''
- * -- ANSI X3J11
- */
-number: if ((dprec = prec) >= 0)
- flags &= ~ZEROPAD;
-
- /*
- * ``The result of converting a zero value with an
- * explicit precision of zero is no characters.''
- * -- ANSI X3J11
- */
-#ifdef _HAVE_SANE_QUAD_
- if (flags & QUADINT) {
- if (uqval != 0 || prec != 0)
- cp = BSD__uqtoa(uqval, ebuf, base,
- flags & ALT, xdigs);
- } else
-#else /* _HAVE_SANE_QUAD_ */
-#endif /* _HAVE_SANE_QUAD_ */
- {
- if (ulval != 0 || prec != 0)
- cp = BSD__ultoa(ulval, ebuf, base,
- flags & ALT, xdigs);
- }
- size = ebuf - cp;
- break;
- default: /* "%?" prints ?, unless ? is NUL */
- if (ch == '\0')
- goto done;
- /* pretend it was %c with argument ch */
- cp = buf;
- *buf = ch;
- size = 1;
- sign = '\0';
- break;
- }
-
- /*
- * All reasonable formats wind up here. At this point, `cp'
- * points to a string which (if not flags&LADJUST) should be
- * padded out to `width' places. If flags&ZEROPAD, it should
- * first be prefixed by any sign or other prefix; otherwise,
- * it should be blank padded before the prefix is emitted.
- * After any left-hand padding and prefixing, emit zeroes
- * required by a decimal [diouxX] precision, then print the
- * string proper, then emit zeroes required by any leftover
- * floating precision; finally, if LADJUST, pad with blanks.
- *
- * Compute actual size, so we know how much to pad.
- * fieldsz excludes decimal prec; realsz includes it.
- */
- fieldsz = size;
- if (sign)
- fieldsz++;
- else if (flags & HEXPREFIX)
- fieldsz += 2;
- realsz = dprec > fieldsz ? dprec : fieldsz;
-
- /* right-adjusting blank padding */
- if ((flags & (LADJUST|ZEROPAD)) == 0)
- PAD(width - realsz, blanks);
-
- /* prefix */
- if (sign) {
- PRINT(&sign, 1);
- } else if (flags & HEXPREFIX) {
- ox[0] = '0';
- ox[1] = ch;
- PRINT(ox, 2);
- }
-
- /* right-adjusting zero padding */
- if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD)
- PAD(width - realsz, zeroes);
-
- /* leading zeroes from decimal precision */
- PAD(dprec - fieldsz, zeroes);
-
- /* the string or number proper */
-#ifdef FLOATING_POINT
- if ((flags & FPT) == 0) {
- PRINT(cp, size);
- } else { /* glue together f_p fragments */
- if (ch >= 'f') { /* 'f' or 'g' */
- if (_double == 0) {
- /* kludge for __dtoa irregularity */
- if (prec == 0 ||
- (flags & ALT) == 0) {
- PRINT("0", 1);
- } else {
- PRINT("0.", 2);
- PAD(ndig - 1, zeroes);
- }
- } else if (expt <= 0) {
- PRINT("0.", 2);
- PAD(-expt, zeroes);
- PRINT(cp, ndig);
- } else if (expt >= ndig) {
- PRINT(cp, ndig);
- PAD(expt - ndig, zeroes);
- if (flags & ALT)
- PRINT(".", 1);
- } else {
- PRINT(cp, expt);
- cp += expt;
- PRINT(".", 1);
- PRINT(cp, ndig-expt);
- }
- } else { /* 'e' or 'E' */
- if (ndig > 1 || flags & ALT) {
- ox[0] = *cp++;
- ox[1] = '.';
- PRINT(ox, 2);
- if (_double || flags & ALT == 0) {
- PRINT(cp, ndig-1);
- } else /* 0.[0..] */
- /* __dtoa irregularity */
- PAD(ndig - 1, zeroes);
- } else /* XeYYY */
- PRINT(cp, 1);
- PRINT(expstr, expsize);
- }
- }
-#else
- PRINT(cp, size);
-#endif
- /* left-adjusting padding (always blank) */
- if (flags & LADJUST)
- PAD(width - realsz, blanks);
-
- /* finally, adjust ret */
- ret += width > realsz ? width : realsz;
-
- FLUSH(); /* copy out the I/O vectors */
- }
-done:
- FLUSH();
-error:
- return (__sferror(fp) ? EOF : ret);
- /* NOTREACHED */
-}
-
-#ifdef FLOATING_POINT
-
-extern char *BSD__dtoa __P((double, int, int, int *, int *, char **));
-
-static char *
-cvt(value, ndigits, flags, sign, decpt, ch, length)
- double value;
- int ndigits, flags, *decpt, ch, *length;
- char *sign;
-{
- int mode, dsgn;
- char *digits, *bp, *rve;
-
- if (ch == 'f')
- mode = 3;
- else {
- mode = 2;
- }
- if (value < 0) {
- value = -value;
- *sign = '-';
- } else if (value == 0.0 && 1.0/value < 0) {
- *sign = '-';
- } else {
- *sign = '\000';
- }
- digits = BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
- if (flags & ALT) { /* Print trailing zeros */
- bp = digits + ndigits;
- if (ch == 'f') {
- if (*digits == '0' && value)
- *decpt = -ndigits + 1;
- bp += *decpt;
- }
- if (value == 0) /* kludge for __dtoa irregularity */
- rve = bp;
- while (rve < bp)
- *rve++ = '0';
- }
- *length = rve - digits;
- return (digits);
-}
-
-static int
-exponent(p0, exp, fmtch)
- char *p0;
- int exp, fmtch;
-{
- register char *p, *t;
- char expbuf[MAXEXP];
-
- p = p0;
- *p++ = fmtch;
- if (exp < 0) {
- exp = -exp;
- *p++ = '-';
- }
- else
- *p++ = '+';
- t = expbuf + MAXEXP;
- if (exp > 9) {
- do {
- *--t = to_char(exp % 10);
- } while ((exp /= 10) > 9);
- *--t = to_char(exp);
- for (; t < expbuf + MAXEXP; *p++ = *t++);
- }
- else {
- *p++ = '0';
- *p++ = to_char(exp);
- }
- return (p - p0);
-}
-#endif /* FLOATING_POINT */
-
-#ifndef HAVE_VSNPRINTF
-int
-vsnprintf(str, n, fmt, ap)
- char *str;
- size_t n;
- const char *fmt;
- _BSD_VA_LIST_ ap;
-{
- int ret;
- FILE f;
-
- if ((int)n < 1)
- return (EOF);
- f._flags = __SWR | __SSTR;
- f._bf._base = f._p = (unsigned char *)str;
- f._bf._size = f._w = n - 1;
- f.vwrite = BSD__sfvwrite;
- ret = BSD_vfprintf(&f, fmt, ap);
- *f._p = 0;
- return (ret);
-}
-#endif
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)snprintf.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#ifndef HAVE_SNPRINTF
-int
-#if defined(HAVE_STDARG_PROTOTYPES)
-snprintf(char *str, size_t n, char const *fmt, ...)
-#else
-snprintf(str, n, fmt, va_alist)
-char *str, *fmt;
-size_t n;
-va_dcl
-#endif
-{
- int ret;
- va_list ap;
- FILE f;
-
- if ((int)n < 1)
- return (EOF);
-
-#if defined(HAVE_STDARG_PROTOTYPES)
- va_start(ap, fmt);
-#else
- va_start(ap);
-#endif
- f._flags = __SWR | __SSTR;
- f._bf._base = f._p = (unsigned char *)str;
- f._bf._size = f._w = n - 1;
- f.vwrite = BSD__sfvwrite;
- ret = BSD_vfprintf(&f, fmt, ap);
- *f._p = 0;
- va_end(ap);
- return (ret);
-}
-#endif
diff --git a/trunk/missing/x68.c b/trunk/missing/x68.c
deleted file mode 100644
index ece840d9ce..0000000000
--- a/trunk/missing/x68.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* x68 compatibility functions -- follows Ruby's license */
-
-#include "ruby/config.h"
-
-#if !HAVE_SELECT
-#include "x68/select.c"
-#endif
-#if MISSING__DTOS18
-#include "x68/_dtos18.c"
-#endif
-#if MISSING_FCONVERT
-#include "x68/_round.c"
-#include "x68/fconvert.c"
-#endif
-
-/* missing some basic syscalls */
-int
-link(const char *src, const char *dst)
-{
- return symlink(src, dst);
-}
-
-#ifndef HAVE_GETTIMEOFDAY
-#include <time.h>
-#include <sys/time.h>
-
-struct timezone {
- int tz_minuteswest;
- int tz_dsttime;
-};
-
-int
-gettimeofday(struct timeval *tv, struct timezone *tz)
-{
- tv->tv_sec = (long)time((time_t*)0);
- tv->tv_usec = 0;
-
- return 0;
-}
-#endif