mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Initial revision
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
392296c12d
commit
3db12e8b23
225 changed files with 75935 additions and 0 deletions
189
missing/alloca.c
Normal file
189
missing/alloca.c
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
/* 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 "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 */
|
||||
|
||||
extern void free();
|
||||
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;
|
||||
|
||||
free ((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));
|
||||
}
|
||||
}
|
||||
|
||||
276
missing/crypt.c
Normal file
276
missing/crypt.c
Normal file
|
|
@ -0,0 +1,276 @@
|
|||
/* From Andy Tanenbaum's book "Computer Networks",
|
||||
rewritten in C
|
||||
*/
|
||||
|
||||
struct block {
|
||||
unsigned char b_data[64];
|
||||
};
|
||||
|
||||
struct ordering {
|
||||
unsigned char o_data[64];
|
||||
};
|
||||
|
||||
static struct block key;
|
||||
|
||||
static struct ordering InitialTr = {
|
||||
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,
|
||||
};
|
||||
|
||||
static struct ordering FinalTr = {
|
||||
40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
|
||||
38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
|
||||
36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
|
||||
34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25,
|
||||
};
|
||||
|
||||
static struct ordering swap = {
|
||||
33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
|
||||
49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,
|
||||
17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
|
||||
};
|
||||
|
||||
static struct ordering KeyTr1 = {
|
||||
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 struct ordering KeyTr2 = {
|
||||
14,17,11,24, 1, 5, 3,28,15, 6,21,10,
|
||||
23,19,12, 4,26, 8,16, 7,27,20,13, 2,
|
||||
41,52,31,37,47,55,30,40,51,45,33,48,
|
||||
44,49,39,56,34,53,46,42,50,36,29,32,
|
||||
};
|
||||
|
||||
static struct ordering etr = {
|
||||
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 struct ordering ptr = {
|
||||
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 s_boxes[8][64] = {
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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,
|
||||
},
|
||||
|
||||
{ 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 int rots[] = {
|
||||
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
|
||||
};
|
||||
|
||||
static void transpose(struct block *data, struct ordering *t, int n)
|
||||
{
|
||||
struct block x;
|
||||
|
||||
x = *data;
|
||||
|
||||
while (n-- > 0) {
|
||||
data->b_data[n] = x.b_data[t->o_data[n] - 1];
|
||||
}
|
||||
}
|
||||
|
||||
static void rotate(struct block *key)
|
||||
{
|
||||
register unsigned char *p = key->b_data;
|
||||
register unsigned char *ep = &(key->b_data[55]);
|
||||
int data0 = key->b_data[0], data28 = key->b_data[28];
|
||||
|
||||
while (p++ < ep) *(p-1) = *p;
|
||||
key->b_data[27] = (char) data0;
|
||||
key->b_data[55] = (char) data28;
|
||||
}
|
||||
|
||||
static struct ordering *EP = &etr;
|
||||
|
||||
static void f(int i, struct block *key, struct block *a, struct block *x)
|
||||
{
|
||||
struct block e, ikey, y;
|
||||
int k;
|
||||
register unsigned char *p, *q, *r;
|
||||
|
||||
e = *a;
|
||||
transpose(&e, EP, 48);
|
||||
for (k = rots[i]; k; k--) rotate(key);
|
||||
ikey = *key;
|
||||
transpose(&ikey, &KeyTr2, 48);
|
||||
p = &(y.b_data[48]);
|
||||
q = &(e.b_data[48]);
|
||||
r = &(ikey.b_data[48]);
|
||||
while (p > y.b_data) {
|
||||
*--p = *--q ^ *--r;
|
||||
}
|
||||
q = x->b_data;
|
||||
for (k = 0; k < 8; k++) {
|
||||
register int xb, r;
|
||||
|
||||
r = *p++ << 5;
|
||||
r += *p++ << 3;
|
||||
r += *p++ << 2;
|
||||
r += *p++ << 1;
|
||||
r += *p++;
|
||||
r += *p++ << 4;
|
||||
|
||||
xb = s_boxes[k][r];
|
||||
|
||||
*q++ = (char) (xb >> 3) & 1;
|
||||
*q++ = (char) (xb>>2) & 1;
|
||||
*q++ = (char) (xb>>1) & 1;
|
||||
*q++ = (char) (xb & 1);
|
||||
}
|
||||
transpose(x, &ptr, 32);
|
||||
}
|
||||
|
||||
void definekey(char *k)
|
||||
{
|
||||
|
||||
key = *((struct block *) k);
|
||||
transpose(&key, &KeyTr1, 56);
|
||||
}
|
||||
|
||||
void encrypt(char *blck, int edflag)
|
||||
{
|
||||
register struct block *p = (struct block *) blck;
|
||||
register int i;
|
||||
|
||||
transpose(p, &InitialTr, 64);
|
||||
for (i = 15; i>= 0; i--) {
|
||||
int j = edflag ? i : 15 - i;
|
||||
register int k;
|
||||
struct block b, x;
|
||||
|
||||
b = *p;
|
||||
for (k = 31; k >= 0; k--) {
|
||||
p->b_data[k] = b.b_data[k + 32];
|
||||
}
|
||||
f(j, &key, p, &x);
|
||||
for (k = 31; k >= 0; k--) {
|
||||
p->b_data[k+32] = b.b_data[k] ^ x.b_data[k];
|
||||
}
|
||||
}
|
||||
transpose(p, &swap, 64);
|
||||
transpose(p, &FinalTr, 64);
|
||||
}
|
||||
|
||||
char *crypt(char *pw, char *salt)
|
||||
{
|
||||
|
||||
char pwb[66];
|
||||
static char result[16];
|
||||
register char *p = pwb;
|
||||
struct ordering new_etr;
|
||||
register int i;
|
||||
|
||||
while (*pw && p < &pwb[64]) {
|
||||
register int j = 7;
|
||||
|
||||
while (j--) {
|
||||
*p++ = (*pw >> j) & 01;
|
||||
}
|
||||
pw++;
|
||||
*p++ = 0;
|
||||
}
|
||||
while (p < &pwb[64]) *p++ = 0;
|
||||
|
||||
definekey(p = pwb);
|
||||
|
||||
while (p < &pwb[66]) *p++ = 0;
|
||||
|
||||
new_etr = etr;
|
||||
EP = &new_etr;
|
||||
for (i = 0; i < 2; i++) {
|
||||
register char c = *salt++;
|
||||
register int j;
|
||||
|
||||
result[i] = c;
|
||||
if ( c > 'Z') c -= 6 + 7 + '.'; /* c was a lower case letter */
|
||||
else if ( c > '9') c -= 7 + '.';/* c was upper case letter */
|
||||
else c -= '.'; /* c was digit, '.' or '/'. */
|
||||
/* now, 0 <= c <= 63 */
|
||||
for (j = 0; j < 6; j++) {
|
||||
if ((c >> j) & 01) {
|
||||
int t = 6*i + j;
|
||||
int temp = new_etr.o_data[t];
|
||||
new_etr.o_data[t] = new_etr.o_data[t+24];
|
||||
new_etr.o_data[t+24] = (char) temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (result[1] == 0) result[1] = result[0];
|
||||
|
||||
for (i = 0; i < 25; i++) encrypt(pwb,0);
|
||||
EP = &etr;
|
||||
|
||||
p = pwb;
|
||||
pw = result+2;
|
||||
while (p < &pwb[66]) {
|
||||
register int c = 0;
|
||||
register int j = 6;
|
||||
|
||||
while (j--) {
|
||||
c <<= 1;
|
||||
c |= *p++;
|
||||
}
|
||||
c += '.'; /* becomes >= '.' */
|
||||
if (c > '9') c += 7; /* not in [./0-9], becomes upper */
|
||||
if (c > 'Z') c += 6; /* not in [A-Z], becomes lower */
|
||||
*pw++ = (char) c;
|
||||
}
|
||||
*pw = 0;
|
||||
return result;
|
||||
}
|
||||
248
missing/dir.h
Normal file
248
missing/dir.h
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
/* $RCSfile: dir.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:22:10 $
|
||||
*
|
||||
* (C) Copyright 1987, 1990 Diomidis Spinellis.
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*
|
||||
* $Log: dir.h,v $
|
||||
* Revision 4.0.1.1 91/06/07 11:22:10 lwall
|
||||
* patch4: new copyright notice
|
||||
*
|
||||
* Revision 4.0 91/03/20 01:34:20 lwall
|
||||
* 4.0 baseline.
|
||||
*
|
||||
* Revision 3.0.1.1 90/03/27 16:07:08 lwall
|
||||
* patch16: MSDOS support
|
||||
*
|
||||
* Revision 1.1 90/03/18 20:32:29 dds
|
||||
* Initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* defines the type returned by the directory(3) functions
|
||||
*/
|
||||
|
||||
#ifndef __DIR_INCLUDED
|
||||
#define __DIR_INCLUDED
|
||||
|
||||
/*Directory entry size */
|
||||
#ifdef DIRSIZ
|
||||
#undef DIRSIZ
|
||||
#endif
|
||||
#define DIRSIZ(rp) (sizeof(struct direct))
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
struct direct {
|
||||
ino_t d_ino; /* inode number (not used by MS-DOS) */
|
||||
int d_namlen; /* Name length */
|
||||
char d_name[256]; /* file name */
|
||||
};
|
||||
|
||||
struct _dir_struc { /* Structure used by dir operations */
|
||||
char *start; /* Starting position */
|
||||
char *curr; /* Current position */
|
||||
long size; /* Size of string table */
|
||||
long nfiles; /* number if filenames in table */
|
||||
struct direct dirstr; /* Directory structure to return */
|
||||
};
|
||||
|
||||
typedef struct _dir_struc DIR; /* Type returned by dir operations */
|
||||
|
||||
DIR *cdecl opendir(char *filename);
|
||||
struct direct *readdir(DIR *dirp);
|
||||
long telldir(DIR *dirp);
|
||||
void seekdir(DIR *dirp,long loc);
|
||||
void rewinddir(DIR *dirp);
|
||||
void closedir(DIR *dirp);
|
||||
|
||||
#endif /* __DIR_INCLUDED */
|
||||
/* $RCSfile: dir.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:22:10 $
|
||||
*
|
||||
* (C) Copyright 1987, 1990 Diomidis Spinellis.
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*
|
||||
* $Log: dir.h,v $
|
||||
* Revision 4.0.1.1 91/06/07 11:22:10 lwall
|
||||
* patch4: new copyright notice
|
||||
*
|
||||
* Revision 4.0 91/03/20 01:34:20 lwall
|
||||
* 4.0 baseline.
|
||||
*
|
||||
* Revision 3.0.1.1 90/03/27 16:07:08 lwall
|
||||
* patch16: MSDOS support
|
||||
*
|
||||
* Revision 1.1 90/03/18 20:32:29 dds
|
||||
* Initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* defines the type returned by the directory(3) functions
|
||||
*/
|
||||
|
||||
#ifndef __DIR_INCLUDED
|
||||
#define __DIR_INCLUDED
|
||||
|
||||
/*Directory entry size */
|
||||
#ifdef DIRSIZ
|
||||
#undef DIRSIZ
|
||||
#endif
|
||||
#define DIRSIZ(rp) (sizeof(struct direct))
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
struct direct {
|
||||
ino_t d_ino; /* inode number (not used by MS-DOS) */
|
||||
int d_namlen; /* Name length */
|
||||
char d_name[256]; /* file name */
|
||||
};
|
||||
|
||||
struct _dir_struc { /* Structure used by dir operations */
|
||||
char *start; /* Starting position */
|
||||
char *curr; /* Current position */
|
||||
struct direct dirstr; /* Directory structure to return */
|
||||
};
|
||||
|
||||
typedef struct _dir_struc DIR; /* Type returned by dir operations */
|
||||
|
||||
DIR *cdecl opendir(char *filename);
|
||||
struct direct *readdir(DIR *dirp);
|
||||
long telldir(DIR *dirp);
|
||||
void seekdir(DIR *dirp,long loc);
|
||||
void rewinddir(DIR *dirp);
|
||||
void closedir(DIR *dirp);
|
||||
|
||||
#endif /* __DIR_INCLUDED */
|
||||
/* $RCSfile: dir.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:22:10 $
|
||||
*
|
||||
* (C) Copyright 1987, 1990 Diomidis Spinellis.
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*
|
||||
* $Log: dir.h,v $
|
||||
* Revision 4.0.1.1 91/06/07 11:22:10 lwall
|
||||
* patch4: new copyright notice
|
||||
*
|
||||
* Revision 4.0 91/03/20 01:34:20 lwall
|
||||
* 4.0 baseline.
|
||||
*
|
||||
* Revision 3.0.1.1 90/03/27 16:07:08 lwall
|
||||
* patch16: MSDOS support
|
||||
*
|
||||
* Revision 1.1 90/03/18 20:32:29 dds
|
||||
* Initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* defines the type returned by the directory(3) functions
|
||||
*/
|
||||
|
||||
#ifndef __DIR_INCLUDED
|
||||
#define __DIR_INCLUDED
|
||||
|
||||
/*Directory entry size */
|
||||
#ifdef DIRSIZ
|
||||
#undef DIRSIZ
|
||||
#endif
|
||||
#define DIRSIZ(rp) (sizeof(struct direct))
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
struct direct {
|
||||
ino_t d_ino; /* inode number (not used by MS-DOS) */
|
||||
int d_namlen; /* Name length */
|
||||
char d_name[256]; /* file name */
|
||||
};
|
||||
|
||||
struct _dir_struc { /* Structure used by dir operations */
|
||||
char *start; /* Starting position */
|
||||
char *curr; /* Current position */
|
||||
struct direct dirstr; /* Directory structure to return */
|
||||
};
|
||||
|
||||
typedef struct _dir_struc DIR; /* Type returned by dir operations */
|
||||
|
||||
DIR *cdecl opendir(char *filename);
|
||||
struct direct *readdir(DIR *dirp);
|
||||
long telldir(DIR *dirp);
|
||||
void seekdir(DIR *dirp,long loc);
|
||||
void rewinddir(DIR *dirp);
|
||||
void closedir(DIR *dirp);
|
||||
|
||||
#endif /* __DIR_INCLUDED */
|
||||
/* $RCSfile: dir.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:22:10 $
|
||||
*
|
||||
* (C) Copyright 1987, 1990 Diomidis Spinellis.
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*
|
||||
* $Log: dir.h,v $
|
||||
* Revision 4.0.1.1 91/06/07 11:22:10 lwall
|
||||
* patch4: new copyright notice
|
||||
*
|
||||
* Revision 4.0 91/03/20 01:34:20 lwall
|
||||
* 4.0 baseline.
|
||||
*
|
||||
* Revision 3.0.1.1 90/03/27 16:07:08 lwall
|
||||
* patch16: MSDOS support
|
||||
*
|
||||
* Revision 1.1 90/03/18 20:32:29 dds
|
||||
* Initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* defines the type returned by the directory(3) functions
|
||||
*/
|
||||
|
||||
#ifndef __DIR_INCLUDED
|
||||
#define __DIR_INCLUDED
|
||||
|
||||
/*Directory entry size */
|
||||
#ifdef DIRSIZ
|
||||
#undef DIRSIZ
|
||||
#endif
|
||||
#define DIRSIZ(rp) (sizeof(struct direct))
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
struct direct {
|
||||
ino_t d_ino; /* inode number (not used by MS-DOS) */
|
||||
int d_namlen; /* Name length */
|
||||
char d_name[256]; /* file name */
|
||||
};
|
||||
|
||||
struct _dir_struc { /* Structure used by dir operations */
|
||||
char *start; /* Starting position */
|
||||
char *curr; /* Current position */
|
||||
long size; /* Size of string table */
|
||||
long nfiles; /* number if filenames in table */
|
||||
struct direct dirstr; /* Directory structure to return */
|
||||
};
|
||||
|
||||
typedef struct _dir_struc DIR; /* Type returned by dir operations */
|
||||
|
||||
DIR *cdecl opendir(char *filename);
|
||||
struct direct *readdir(DIR *dirp);
|
||||
long telldir(DIR *dirp);
|
||||
void seekdir(DIR *dirp,long loc);
|
||||
void rewinddir(DIR *dirp);
|
||||
void closedir(DIR *dirp);
|
||||
|
||||
#endif /* __DIR_INCLUDED */
|
||||
36
missing/dup2.c
Normal file
36
missing/dup2.c
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 1991, Larry Wall
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*/
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#if defined(HAVE_FCNTL) && defined(F_DUPFD)
|
||||
# include <fcntl.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
dup2(oldfd,newfd)
|
||||
int oldfd;
|
||||
int newfd;
|
||||
{
|
||||
#if defined(HAVE_FCNTL) && defined(F_DUPFD)
|
||||
close(newfd);
|
||||
return fcntl(oldfd, F_DUPFD, newfd);
|
||||
#else
|
||||
int fdtmp[256];
|
||||
int fdx = 0;
|
||||
int fd;
|
||||
|
||||
if (oldfd == newfd)
|
||||
return 0;
|
||||
close(newfd);
|
||||
while ((fd = dup(oldfd)) != newfd) /* good enough for low fd's */
|
||||
fdtmp[fdx++] = fd;
|
||||
while (fdx > 0)
|
||||
close(fdtmp[--fdx]);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
32
missing/file.h
Normal file
32
missing/file.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/* This is file FILE.H */
|
||||
/*
|
||||
** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
|
||||
**
|
||||
** This file is distributed under the terms listed in the document
|
||||
** "copying.dj", available from DJ Delorie at the address above.
|
||||
** A copy of "copying.dj" should accompany this file; if not, a copy
|
||||
** should be available from where this file was obtained. This file
|
||||
** may not be distributed without a verbatim copy of "copying.dj".
|
||||
**
|
||||
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
|
||||
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
#ifndef _FILE_H_
|
||||
#define _FILE_H_
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
#define L_SET 0
|
||||
#define L_CURR 1
|
||||
#define L_INCR 1
|
||||
#define L_XTND 2
|
||||
|
||||
|
||||
#define F_OK 0 /* does file exist */
|
||||
|
||||
#define X_OK 1 /* is it executable by caller */
|
||||
#define W_OK 2 /* is it writable by caller */
|
||||
#define R_OK 4 /* is it readable by caller */
|
||||
|
||||
#endif
|
||||
90
missing/flock.c
Normal file
90
missing/flock.c
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
#include "config.h"
|
||||
|
||||
#if 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(fd, operation)
|
||||
int fd;
|
||||
int operation;
|
||||
{
|
||||
int i;
|
||||
switch (operation) {
|
||||
|
||||
/* LOCK_SH - get a shared lock */
|
||||
case LOCK_SH:
|
||||
/* LOCK_EX - get an exclusive lock */
|
||||
case LOCK_EX:
|
||||
i = lockf (fd, F_LOCK, 0);
|
||||
break;
|
||||
|
||||
/* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
|
||||
case LOCK_SH|LOCK_NB:
|
||||
/* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
|
||||
case LOCK_EX|LOCK_NB:
|
||||
i = lockf (fd, F_TLOCK, 0);
|
||||
if (i == -1)
|
||||
if ((errno == EAGAIN) || (errno == EACCES))
|
||||
errno = EWOULDBLOCK;
|
||||
break;
|
||||
|
||||
/* LOCK_UN - unlock */
|
||||
case LOCK_UN:
|
||||
i = lockf (fd, F_ULOCK, 0);
|
||||
break;
|
||||
|
||||
/* Default - can't decipher operation */
|
||||
default:
|
||||
i = -1;
|
||||
errno = EINVAL;
|
||||
break;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
#else
|
||||
int
|
||||
flock(fd, operation)
|
||||
int fd;
|
||||
int operation;
|
||||
{
|
||||
rb_notimplement();
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
24
missing/memmove.c
Normal file
24
missing/memmove.c
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* memmove --- move memories.
|
||||
*
|
||||
* We supply this routine for those systems that aren't standard yet.
|
||||
*/
|
||||
|
||||
char *
|
||||
memmove (dst, src, n)
|
||||
char *dst, *src;
|
||||
int n;
|
||||
{
|
||||
char *ret = dst;
|
||||
|
||||
if (src < dst) {
|
||||
src += n;
|
||||
dst += n;
|
||||
while (n--)
|
||||
*--dst = *--src;
|
||||
}
|
||||
else if (dst < src)
|
||||
while (n--)
|
||||
*dst++ = *src++;
|
||||
return ret;
|
||||
}
|
||||
104
missing/mkdir.c
Normal file
104
missing/mkdir.c
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Written by Robert Rother, Mariah Corporation, August 1985.
|
||||
*
|
||||
* If you want it, it's yours. All I ask in return is that if you
|
||||
* figure out how to do this in a Bourne Shell script you send me
|
||||
* a copy.
|
||||
* sdcsvax!rmr or rmr@uscd
|
||||
*
|
||||
* Severely hacked over by John Gilmore to make a 4.2BSD compatible
|
||||
* subroutine. 11Mar86; hoptoad!gnu
|
||||
*
|
||||
* Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
|
||||
* subroutine didn't return EEXIST. It does now.
|
||||
*/
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
/*
|
||||
* Make a directory.
|
||||
*/
|
||||
int
|
||||
mkdir (dpath, dmode)
|
||||
char *dpath;
|
||||
int dmode;
|
||||
{
|
||||
int cpid, status;
|
||||
struct stat statbuf;
|
||||
|
||||
if (stat (dpath, &statbuf) == 0)
|
||||
{
|
||||
errno = EEXIST; /* Stat worked, so it already exists */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* If stat fails for a reason other than non-existence, return error */
|
||||
if (errno != ENOENT)
|
||||
return -1;
|
||||
|
||||
switch (cpid = fork ())
|
||||
{
|
||||
|
||||
case -1: /* Error in fork() */
|
||||
return (-1); /* Errno is set already */
|
||||
|
||||
case 0: /* Child process */
|
||||
/*
|
||||
* Cheap hack to set mode of new directory. Since this
|
||||
* child process is going away anyway, we zap its umask.
|
||||
* FIXME, this won't suffice to set SUID, SGID, etc. on this
|
||||
* directory. Does anybody care?
|
||||
*/
|
||||
status = umask (0); /* Get current umask */
|
||||
status = umask (status | (0777 & ~dmode)); /* Set for mkdir */
|
||||
execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
|
||||
_exit (-1); /* Can't exec /bin/mkdir */
|
||||
|
||||
default: /* Parent process */
|
||||
while (cpid != wait (&status)); /* Wait for kid to finish */
|
||||
}
|
||||
|
||||
if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
|
||||
{
|
||||
errno = EIO; /* We don't know why, but */
|
||||
return -1; /* /bin/mkdir failed */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rmdir (dpath)
|
||||
char *dpath;
|
||||
{
|
||||
int cpid, status;
|
||||
struct stat statbuf;
|
||||
|
||||
if (stat (dpath, &statbuf) != 0)
|
||||
{
|
||||
/* Stat just set errno. We don't have to */
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (cpid = fork ())
|
||||
{
|
||||
|
||||
case -1: /* Error in fork() */
|
||||
return (-1); /* Errno is set already */
|
||||
|
||||
case 0: /* Child process */
|
||||
execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
|
||||
_exit (-1); /* Can't exec /bin/mkdir */
|
||||
|
||||
default: /* Parent process */
|
||||
while (cpid != wait (&status)); /* Wait for kid to finish */
|
||||
}
|
||||
|
||||
if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
|
||||
{
|
||||
errno = EIO; /* We don't know why, but */
|
||||
return -1; /* /bin/rmdir failed */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
2191
missing/nt.c
Normal file
2191
missing/nt.c
Normal file
File diff suppressed because it is too large
Load diff
225
missing/nt.h
Normal file
225
missing/nt.h
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
#ifndef EXT_NT_H
|
||||
#define EXT_NT_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993, Intergraph Corporation
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the perl README file.
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// Definitions for NT port of Perl
|
||||
//
|
||||
|
||||
//
|
||||
// GRRRR!!!! Windows Nonsense.
|
||||
// Define the following so we don't get tons of extra stuff
|
||||
// when we include windows.h
|
||||
//
|
||||
#if 0
|
||||
#define NOGDICAPMASKS
|
||||
#define NOVIRTUALKEYCODES
|
||||
#define NOWINMESSAGES
|
||||
#define NOWINSTYLES
|
||||
#define NOSYSMETRICS
|
||||
#define NOMENUS
|
||||
#define NOICONS
|
||||
#define NOKEYSTATES
|
||||
#define NOSYSCOMMANDS
|
||||
#define NORASTEROPS
|
||||
#define NOSHOWWINDOW
|
||||
#define OEMRESOURCE
|
||||
#define NOATOM
|
||||
#define NOCLIPBOARD
|
||||
#define NOCOLOR
|
||||
#define NOCTLMGR
|
||||
#define NODRAWTEXT
|
||||
#define NOGDI
|
||||
//#define NOKERNEL
|
||||
//#define NOUSER
|
||||
#define NONLS
|
||||
#define NOMB
|
||||
#define NOMEMMGR
|
||||
#define NOMETAFILE
|
||||
#define NOMINMAX
|
||||
#define NOMSG
|
||||
#define NOOPENFILE
|
||||
#define NOSCROLL
|
||||
#define NOSERVICE
|
||||
#define NOSOUND
|
||||
#define NOTEXTMETRIC
|
||||
#define NOWH
|
||||
#define NOWINOFFSETS
|
||||
#define NOCOMM
|
||||
#define NOKANJI
|
||||
#define NOHELP
|
||||
#define NOPROFILER
|
||||
#define NODEFERWINDOWPOS
|
||||
#endif
|
||||
|
||||
//
|
||||
// Ok now we can include the normal include files.
|
||||
//
|
||||
|
||||
// #include <stdarg.h> conflict with varargs.h?
|
||||
// There is function-name conflitct, so we rename it
|
||||
#if !defined(IN) && !defined(FLOAT)
|
||||
#define OpenFile WINAPI_OpenFile
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
#undef OpenFile
|
||||
#endif
|
||||
//
|
||||
// We\'re not using Microsoft\'s "extensions" to C for
|
||||
// Structured Exception Handling (SEH) so we can nuke these
|
||||
//
|
||||
#undef try
|
||||
#undef except
|
||||
#undef finally
|
||||
#undef leave
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <direct.h>
|
||||
#include <process.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/utime.h>
|
||||
|
||||
//
|
||||
// Grrr...
|
||||
//
|
||||
|
||||
#define access _access
|
||||
#define chmod _chmod
|
||||
#define chsize _chsize
|
||||
#define close _close
|
||||
#define creat _creat
|
||||
#define dup _dup
|
||||
#define dup2 _dup2
|
||||
#define eof _eof
|
||||
#define filelength _filelength
|
||||
#define isatty _isatty
|
||||
#define locking _locking
|
||||
#define lseek _lseek
|
||||
#define mktemp _mktemp
|
||||
#define open _open
|
||||
#define read _read
|
||||
#define setmode _setmode
|
||||
#define sopen _sopen
|
||||
#define tell _tell
|
||||
#define umask _umask
|
||||
#define unlink _unlink
|
||||
#define write _write
|
||||
#define execl _execl
|
||||
#define execle _execle
|
||||
#define execlp _execlp
|
||||
#define execlpe _execlpe
|
||||
#define execv _execv
|
||||
#define execve _execve
|
||||
#define execvp _execvp
|
||||
#define execvpe _execvpe
|
||||
#define getpid _getpid
|
||||
#define spawnl _spawnl
|
||||
#define spawnle _spawnle
|
||||
#define spawnlp _spawnlp
|
||||
#define spawnlpe _spawnlpe
|
||||
#define spawnv _spawnv
|
||||
#define spawnve _spawnve
|
||||
#define spawnvp _spawnvp
|
||||
#define spawnvpe _spawnvpe
|
||||
#if _MSC_VER < 800
|
||||
#define fileno _fileno
|
||||
#endif
|
||||
#define utime _utime
|
||||
//#define pipe _pipe
|
||||
#define perror _perror
|
||||
|
||||
|
||||
/* these are defined in nt.c */
|
||||
|
||||
extern int NtMakeCmdVector(char *, char ***, int);
|
||||
/* extern void NtInitialize(int *, char ***); */
|
||||
extern char *NtGetLib(void);
|
||||
extern char *NtGetBin(void);
|
||||
extern FILE *mypopen(char *, char *);
|
||||
extern int flock(int fd, int oper);
|
||||
|
||||
//
|
||||
// define this so we can do inplace editing
|
||||
//
|
||||
|
||||
#define SUFFIX
|
||||
|
||||
//
|
||||
// stubs
|
||||
//
|
||||
// extern int ioctl (int, unsigned int, char *);
|
||||
extern int ioctl (int, unsigned int, long);
|
||||
#if 0
|
||||
extern void sleep (unsigned int);
|
||||
#else
|
||||
#define sleep(x) Sleep(x*1000)
|
||||
#endif
|
||||
|
||||
extern UIDTYPE getuid (void);
|
||||
extern UIDTYPE geteuid (void);
|
||||
extern GIDTYPE getgid (void);
|
||||
extern GIDTYPE getegid (void);
|
||||
extern int setuid (int);
|
||||
extern int setgid (int);
|
||||
|
||||
|
||||
#undef IN /* confict in parse.c */
|
||||
|
||||
#if 0
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
#endif
|
||||
extern char *mystrerror(int);
|
||||
|
||||
#define strerror(e) mystrerror(e)
|
||||
|
||||
#define PIPE_BUF 1024
|
||||
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_GETLOGIN 1
|
||||
#define HAVE_WAITPID 1
|
||||
#define HAVE_GETCWD 1
|
||||
|
||||
#define LOCK_SH 1
|
||||
#define LOCK_EX 2
|
||||
#define LOCK_NB 4
|
||||
#define LOCK_UN 8
|
||||
#ifndef EWOULDBLOCK
|
||||
#define EWOULDBLOCK 10035 /* EBASEERR + 35 (winsock.h) */
|
||||
#endif
|
||||
|
||||
#ifdef popen
|
||||
#undef popen
|
||||
#define popen mypopen
|
||||
#endif
|
||||
#ifdef pclose
|
||||
#undef pclose
|
||||
#define pclose mypclose
|
||||
#endif
|
||||
|
||||
#undef va_start
|
||||
#undef va_end
|
||||
|
||||
#ifdef popen
|
||||
#undef popen
|
||||
#define popen mypopen
|
||||
#endif
|
||||
#ifdef pclose
|
||||
#undef pclose
|
||||
#define pclose mypclose
|
||||
#endif
|
||||
|
||||
#undef va_start
|
||||
#undef va_end
|
||||
|
||||
#endif
|
||||
77
missing/setenv.c
Normal file
77
missing/setenv.c
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright (c) 1991, Larry Wall
|
||||
*
|
||||
* You may distribute under the terms of either the GNU General Public
|
||||
* License or the Artistic License, as specified in the README file.
|
||||
*/
|
||||
|
||||
#include "ruby.h"
|
||||
|
||||
#ifndef NT
|
||||
extern char **environ;
|
||||
#endif
|
||||
extern char **origenviron;
|
||||
|
||||
#ifndef NT
|
||||
char *strdup();
|
||||
#endif
|
||||
|
||||
static int
|
||||
envix(nam)
|
||||
char *nam;
|
||||
{
|
||||
register int i, len = strlen(nam);
|
||||
|
||||
for (i = 0; environ[i]; i++) {
|
||||
if (memcmp(environ[i],nam,len) == 0 && environ[i][len] == '=')
|
||||
break; /* memcmp must come first to avoid */
|
||||
} /* potential SEGV's */
|
||||
return i;
|
||||
}
|
||||
|
||||
void
|
||||
setenv(nam,val)
|
||||
char *nam, *val;
|
||||
{
|
||||
register int i=envix(nam); /* where does it go? */
|
||||
|
||||
if (environ == origenviron) { /* need we copy environment? */
|
||||
int j;
|
||||
int max;
|
||||
char **tmpenv;
|
||||
|
||||
/*SUPPRESS 530*/
|
||||
for (max = i; environ[max]; max++) ;
|
||||
tmpenv = ALLOC_N(char*, max+2);
|
||||
for (j=0; j<max; j++) /* copy environment */
|
||||
tmpenv[j] = strdup(environ[j]);
|
||||
tmpenv[max] = 0;
|
||||
environ = tmpenv; /* tell exec where it is now */
|
||||
}
|
||||
if (!val) {
|
||||
while (environ[i]) {
|
||||
environ[i] = environ[i+1];
|
||||
i++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!environ[i]) { /* does not exist yet */
|
||||
REALLOC_N(environ, char*, i+2); /* just expand it a bit */
|
||||
environ[i+1] = 0; /* make sure it's null terminated */
|
||||
}
|
||||
else {
|
||||
free(environ[i]);
|
||||
}
|
||||
environ[i] = ALLOC_N(char, strlen(nam) + strlen(val) + 2);
|
||||
#ifndef MSDOS
|
||||
(void)sprintf(environ[i],"%s=%s",nam,val);/* all that work just for this */
|
||||
#else
|
||||
/* MS-DOS requires environment variable names to be in uppercase */
|
||||
/* [Tom Dinger, 27 August 1990: Well, it doesn't _require_ it, but
|
||||
* some utilities and applications may break because they only look
|
||||
* for upper case strings. (Fixed strupr() bug here.)]
|
||||
*/
|
||||
strcpy(environ[i],nam); strupr(environ[i]);
|
||||
(void)sprintf(environ[i] + strlen(nam),"=%s",val);
|
||||
#endif /* MSDOS */
|
||||
}
|
||||
13
missing/strcasecmp.c
Normal file
13
missing/strcasecmp.c
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#include <ctype.h>
|
||||
|
||||
#define min(a,b) (((a)>(b))?(b):(a))
|
||||
int
|
||||
strcasecmp(p1, p2)
|
||||
char *p1, *p2;
|
||||
{
|
||||
for ( ; *p1 && *p2; p1++, p2++) {
|
||||
if (toupper(*p1) != toupper(*p2))
|
||||
return toupper(*p1) - toupper(*p2);
|
||||
}
|
||||
return strlen(p1) - strlen(p2);
|
||||
}
|
||||
25
missing/strdup.c
Normal file
25
missing/strdup.c
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/************************************************
|
||||
|
||||
strdup.c -
|
||||
|
||||
$Author$
|
||||
$Date$
|
||||
created at: Wed Dec 7 15:34:01 JST 1994
|
||||
|
||||
************************************************/
|
||||
#include <stdio.h>
|
||||
|
||||
char *
|
||||
strdup(str)
|
||||
char *str;
|
||||
{
|
||||
extern char *xmalloc();
|
||||
char *tmp;
|
||||
int len = strlen(str) + 1;
|
||||
|
||||
tmp = xmalloc(len);
|
||||
if (tmp == NULL) return NULL;
|
||||
memcpy(tmp, str, len);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
19
missing/strerror.c
Normal file
19
missing/strerror.c
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* strerror.c --- Map an integer error number into a printable string.
|
||||
*/
|
||||
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
|
||||
static char msg[50];
|
||||
|
||||
char *
|
||||
strerror(error)
|
||||
int error;
|
||||
{
|
||||
if ((error <= sys_nerr) && (error > 0)) {
|
||||
return sys_errlist[error];
|
||||
}
|
||||
sprintf (msg, "Unknown error (%d)", error);
|
||||
return msg;
|
||||
}
|
||||
889
missing/strftime.c
Normal file
889
missing/strftime.c
Normal file
|
|
@ -0,0 +1,889 @@
|
|||
/*
|
||||
* strftime.c
|
||||
*
|
||||
* Public-domain implementation of ANSI C library routine.
|
||||
*
|
||||
* It's written in old-style C for maximal portability.
|
||||
* However, since I'm used to prototypes, I've included them too.
|
||||
*
|
||||
* If you want stuff in the System V ascftime routine, add the SYSV_EXT define.
|
||||
* For extensions from SunOS, add SUNOS_EXT.
|
||||
* For stuff needed to implement the P1003.2 date command, add POSIX2_DATE.
|
||||
* For VMS dates, add VMS_EXT.
|
||||
* For a an RFC822 time format, add MAILHEADER_EXT.
|
||||
* For ISO week years, add ISO_DATE_EXT.
|
||||
* For complete POSIX semantics, add POSIX_SEMANTICS.
|
||||
*
|
||||
* The code for %c, %x, and %X now follows the 1003.2 specification for
|
||||
* the POSIX locale.
|
||||
* This version ignores LOCALE information.
|
||||
* It also doesn't worry about multi-byte characters.
|
||||
* So there.
|
||||
*
|
||||
* This file is also shipped with GAWK (GNU Awk), gawk specific bits of
|
||||
* code are included if GAWK is defined.
|
||||
*
|
||||
* Arnold Robbins
|
||||
* January, February, March, 1991
|
||||
* Updated March, April 1992
|
||||
* Updated April, 1993
|
||||
* Updated February, 1994
|
||||
* Updated May, 1994
|
||||
* Updated January, 1995
|
||||
* Updated September, 1995
|
||||
* Updated January, 1996
|
||||
*
|
||||
* Fixes from ado@elsie.nci.nih.gov
|
||||
* February 1991, May 1992
|
||||
* Fixes from Tor Lillqvist tml@tik.vtt.fi
|
||||
* May, 1993
|
||||
* Further fixes from ado@elsie.nci.nih.gov
|
||||
* February 1994
|
||||
* %z code from chip@chinacat.unicom.com
|
||||
* Applied September 1995
|
||||
* %V code fixed (again) and %G, %g added,
|
||||
* January 1996
|
||||
*/
|
||||
|
||||
#ifndef GAWK
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#endif
|
||||
#if defined(TM_IN_SYS_TIME) || ! defined(GAWK)
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* defaults: season to taste */
|
||||
#define SYSV_EXT 1 /* stuff in System V ascftime routine */
|
||||
#define SUNOS_EXT 1 /* stuff in SunOS strftime routine */
|
||||
#define POSIX2_DATE 1 /* stuff in Posix 1003.2 date command */
|
||||
#define VMS_EXT 1 /* include %v for VMS date format */
|
||||
#define MAILHEADER_EXT 1 /* add %z for HHMM format */
|
||||
#define ISO_DATE_EXT 1 /* %G and %g for year of ISO week */
|
||||
#ifndef GAWK
|
||||
#define POSIX_SEMANTICS 1 /* call tzset() if TZ changes */
|
||||
#endif
|
||||
|
||||
#if defined(ISO_DATE_EXT)
|
||||
#if ! defined(POSIX2_DATE)
|
||||
#define POSIX2_DATE 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(POSIX2_DATE)
|
||||
#if ! defined(SYSV_EXT)
|
||||
#define SYSV_EXT 1
|
||||
#endif
|
||||
#if ! defined(SUNOS_EXT)
|
||||
#define SUNOS_EXT 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(POSIX2_DATE)
|
||||
#define adddecl(stuff) stuff
|
||||
#else
|
||||
#define adddecl(stuff)
|
||||
#endif
|
||||
|
||||
#undef strchr /* avoid AIX weirdness */
|
||||
|
||||
#ifndef __STDC__
|
||||
#define const /**/
|
||||
extern void *malloc();
|
||||
extern void *realloc();
|
||||
extern void tzset();
|
||||
extern char *strchr();
|
||||
extern char *getenv();
|
||||
static int weeknumber();
|
||||
adddecl(static int iso8601wknum();)
|
||||
#else
|
||||
extern void *malloc(unsigned count);
|
||||
extern void *realloc(void *ptr, unsigned count);
|
||||
extern void tzset(void);
|
||||
extern char *strchr(const char *str, int ch);
|
||||
extern char *getenv(const char *v);
|
||||
static int weeknumber(const struct tm *timeptr, int firstweekday);
|
||||
adddecl(static int iso8601wknum(const struct tm *timeptr);)
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define inline __inline__
|
||||
#else
|
||||
#define inline /**/
|
||||
#endif
|
||||
|
||||
#define range(low, item, hi) max(low, min(item, hi))
|
||||
|
||||
#if !defined(OS2) && !defined(MSDOS) && defined(HAVE_TZNAME)
|
||||
extern char *tzname[2];
|
||||
extern int daylight;
|
||||
#ifdef SOLARIS
|
||||
extern long timezone, altzone;
|
||||
#else
|
||||
extern int timezone, altzone;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef min /* just in case */
|
||||
|
||||
/* min --- return minimum of two numbers */
|
||||
|
||||
#ifndef __STDC__
|
||||
static inline int
|
||||
min(a, b)
|
||||
int a, b;
|
||||
#else
|
||||
static inline int
|
||||
min(int a, int b)
|
||||
#endif
|
||||
{
|
||||
return (a < b ? a : b);
|
||||
}
|
||||
|
||||
#undef max /* also, just in case */
|
||||
|
||||
/* max --- return maximum of two numbers */
|
||||
|
||||
#ifndef __STDC__
|
||||
static inline int
|
||||
max(a, b)
|
||||
int a, b;
|
||||
#else
|
||||
static inline int
|
||||
max(int a, int b)
|
||||
#endif
|
||||
{
|
||||
return (a > b ? a : b);
|
||||
}
|
||||
|
||||
/* strftime --- produce formatted time */
|
||||
|
||||
#ifndef __STDC__
|
||||
size_t
|
||||
strftime(s, maxsize, format, timeptr)
|
||||
char *s;
|
||||
size_t maxsize;
|
||||
const char *format;
|
||||
const struct tm *timeptr;
|
||||
#else
|
||||
size_t
|
||||
strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr)
|
||||
#endif
|
||||
{
|
||||
char *endp = s + maxsize;
|
||||
char *start = s;
|
||||
auto char tbuf[100];
|
||||
long off;
|
||||
int i, w, y;
|
||||
static short first = 1;
|
||||
#ifdef POSIX_SEMANTICS
|
||||
static char *savetz = NULL;
|
||||
static int savetzlen = 0;
|
||||
char *tz;
|
||||
#endif /* POSIX_SEMANTICS */
|
||||
#ifndef HAVE_TM_ZONE
|
||||
#ifndef HAVE_TM_NAME
|
||||
#ifndef HAVE_TZNAME
|
||||
extern char *timezone();
|
||||
struct timeval tv;
|
||||
struct timezone zone;
|
||||
#endif /* HAVE_TZNAME */
|
||||
#endif /* HAVE_TM_NAME */
|
||||
#endif /* HAVE_TM_ZONE */
|
||||
|
||||
/* various tables, useful in North America */
|
||||
static const char *days_a[] = {
|
||||
"Sun", "Mon", "Tue", "Wed",
|
||||
"Thu", "Fri", "Sat",
|
||||
};
|
||||
static const char *days_l[] = {
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||
"Thursday", "Friday", "Saturday",
|
||||
};
|
||||
static const char *months_a[] = {
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
||||
};
|
||||
static const char *months_l[] = {
|
||||
"January", "February", "March", "April",
|
||||
"May", "June", "July", "August", "September",
|
||||
"October", "November", "December",
|
||||
};
|
||||
static const char *ampm[] = { "AM", "PM", };
|
||||
|
||||
if (s == NULL || format == NULL || timeptr == NULL || maxsize == 0)
|
||||
return 0;
|
||||
|
||||
/* quick check if we even need to bother */
|
||||
if (strchr(format, '%') == NULL && strlen(format) + 1 >= maxsize)
|
||||
return 0;
|
||||
|
||||
#ifndef POSIX_SEMANTICS
|
||||
if (first) {
|
||||
tzset();
|
||||
first = 0;
|
||||
}
|
||||
#else /* POSIX_SEMANTICS */
|
||||
tz = getenv("TZ");
|
||||
if (first) {
|
||||
if (tz != NULL) {
|
||||
int tzlen = strlen(tz);
|
||||
|
||||
savetz = (char *) malloc(tzlen + 1);
|
||||
if (savetz != NULL) {
|
||||
savetzlen = tzlen + 1;
|
||||
strcpy(savetz, tz);
|
||||
}
|
||||
}
|
||||
tzset();
|
||||
first = 0;
|
||||
}
|
||||
/* if we have a saved TZ, and it is different, recapture and reset */
|
||||
if (tz && savetz && (tz[0] != savetz[0] || strcmp(tz, savetz) != 0)) {
|
||||
i = strlen(tz) + 1;
|
||||
if (i > savetzlen) {
|
||||
savetz = (char *) realloc(savetz, i);
|
||||
if (savetz) {
|
||||
savetzlen = i;
|
||||
strcpy(savetz, tz);
|
||||
}
|
||||
} else
|
||||
strcpy(savetz, tz);
|
||||
tzset();
|
||||
}
|
||||
#endif /* POSIX_SEMANTICS */
|
||||
|
||||
for (; *format && s < endp - 1; format++) {
|
||||
tbuf[0] = '\0';
|
||||
if (*format != '%') {
|
||||
*s++ = *format;
|
||||
continue;
|
||||
}
|
||||
again:
|
||||
switch (*++format) {
|
||||
case '\0':
|
||||
*s++ = '%';
|
||||
goto out;
|
||||
|
||||
case '%':
|
||||
*s++ = '%';
|
||||
continue;
|
||||
|
||||
case 'a': /* abbreviated weekday name */
|
||||
if (timeptr->tm_wday < 0 || timeptr->tm_wday > 6)
|
||||
strcpy(tbuf, "?");
|
||||
else
|
||||
strcpy(tbuf, days_a[timeptr->tm_wday]);
|
||||
break;
|
||||
|
||||
case 'A': /* full weekday name */
|
||||
if (timeptr->tm_wday < 0 || timeptr->tm_wday > 6)
|
||||
strcpy(tbuf, "?");
|
||||
else
|
||||
strcpy(tbuf, days_l[timeptr->tm_wday]);
|
||||
break;
|
||||
|
||||
#ifdef SYSV_EXT
|
||||
case 'h': /* abbreviated month name */
|
||||
#endif
|
||||
case 'b': /* abbreviated month name */
|
||||
if (timeptr->tm_mon < 0 || timeptr->tm_mon > 11)
|
||||
strcpy(tbuf, "?");
|
||||
else
|
||||
strcpy(tbuf, months_a[timeptr->tm_mon]);
|
||||
break;
|
||||
|
||||
case 'B': /* full month name */
|
||||
if (timeptr->tm_mon < 0 || timeptr->tm_mon > 11)
|
||||
strcpy(tbuf, "?");
|
||||
else
|
||||
strcpy(tbuf, months_l[timeptr->tm_mon]);
|
||||
break;
|
||||
|
||||
case 'c': /* appropriate date and time representation */
|
||||
strftime(tbuf, sizeof tbuf, "%a %b %e %H:%M:%S %Y", timeptr);
|
||||
break;
|
||||
|
||||
case 'd': /* day of the month, 01 - 31 */
|
||||
i = range(1, timeptr->tm_mday, 31);
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'H': /* hour, 24-hour clock, 00 - 23 */
|
||||
i = range(0, timeptr->tm_hour, 23);
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'I': /* hour, 12-hour clock, 01 - 12 */
|
||||
i = range(0, timeptr->tm_hour, 23);
|
||||
if (i == 0)
|
||||
i = 12;
|
||||
else if (i > 12)
|
||||
i -= 12;
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'j': /* day of the year, 001 - 366 */
|
||||
sprintf(tbuf, "%03d", timeptr->tm_yday + 1);
|
||||
break;
|
||||
|
||||
case 'm': /* month, 01 - 12 */
|
||||
i = range(0, timeptr->tm_mon, 11);
|
||||
sprintf(tbuf, "%02d", i + 1);
|
||||
break;
|
||||
|
||||
case 'M': /* minute, 00 - 59 */
|
||||
i = range(0, timeptr->tm_min, 59);
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'p': /* am or pm based on 12-hour clock */
|
||||
i = range(0, timeptr->tm_hour, 23);
|
||||
if (i < 12)
|
||||
strcpy(tbuf, ampm[0]);
|
||||
else
|
||||
strcpy(tbuf, ampm[1]);
|
||||
break;
|
||||
|
||||
case 'S': /* second, 00 - 61 */
|
||||
i = range(0, timeptr->tm_sec, 61);
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'U': /* week of year, Sunday is first day of week */
|
||||
sprintf(tbuf, "%02d", weeknumber(timeptr, 0));
|
||||
break;
|
||||
|
||||
case 'w': /* weekday, Sunday == 0, 0 - 6 */
|
||||
i = range(0, timeptr->tm_wday, 6);
|
||||
sprintf(tbuf, "%d", i);
|
||||
break;
|
||||
|
||||
case 'W': /* week of year, Monday is first day of week */
|
||||
sprintf(tbuf, "%02d", weeknumber(timeptr, 1));
|
||||
break;
|
||||
|
||||
case 'x': /* appropriate date representation */
|
||||
strftime(tbuf, sizeof tbuf, "%m/%d/%y", timeptr);
|
||||
break;
|
||||
|
||||
case 'X': /* appropriate time representation */
|
||||
strftime(tbuf, sizeof tbuf, "%H:%M:%S", timeptr);
|
||||
break;
|
||||
|
||||
case 'y': /* year without a century, 00 - 99 */
|
||||
i = timeptr->tm_year % 100;
|
||||
sprintf(tbuf, "%02d", i);
|
||||
break;
|
||||
|
||||
case 'Y': /* year with century */
|
||||
sprintf(tbuf, "%d", 1900 + timeptr->tm_year);
|
||||
break;
|
||||
|
||||
#ifdef MAILHEADER_EXT
|
||||
/*
|
||||
* From: Chip Rosenthal <chip@chinacat.unicom.com>
|
||||
* Date: Sun, 19 Mar 1995 00:33:29 -0600 (CST)
|
||||
*
|
||||
* Warning: the %z [code] is implemented by inspecting the
|
||||
* timezone name conditional compile settings, and
|
||||
* inferring a method to get timezone offsets. I've tried
|
||||
* this code on a couple of machines, but I don't doubt
|
||||
* there is some system out there that won't like it.
|
||||
* Maybe the easiest thing to do would be to bracket this
|
||||
* with an #ifdef that can turn it off. The %z feature
|
||||
* would be an admittedly obscure one that most folks can
|
||||
* live without, but it would be a great help to those of
|
||||
* us that muck around with various message processors.
|
||||
*/
|
||||
case 'z': /* time zone offset east of GMT e.g. -0600 */
|
||||
#ifdef HAVE_TM_NAME
|
||||
/*
|
||||
* Systems with tm_name probably have tm_tzadj as
|
||||
* secs west of GMT. Convert to mins east of GMT.
|
||||
*/
|
||||
off = -timeptr->tm_tzadj / 60;
|
||||
#else /* !HAVE_TM_NAME */
|
||||
#ifdef HAVE_TM_ZONE
|
||||
/*
|
||||
* Systems with tm_zone probably have tm_gmtoff as
|
||||
* secs east of GMT. Convert to mins east of GMT.
|
||||
*/
|
||||
off = timeptr->tm_gmtoff / 60;
|
||||
#else /* !HAVE_TM_ZONE */
|
||||
#if HAVE_TZNAME
|
||||
/*
|
||||
* Systems with tzname[] probably have timezone as
|
||||
* secs west of GMT. Convert to mins east of GMT.
|
||||
*/
|
||||
off = -(daylight ? timezone : altzone) / 60;
|
||||
#else /* !HAVE_TZNAME */
|
||||
off = -zone.tz_minuteswest;
|
||||
#endif /* !HAVE_TZNAME */
|
||||
#endif /* !HAVE_TM_ZONE */
|
||||
#endif /* !HAVE_TM_NAME */
|
||||
if (off < 0) {
|
||||
tbuf[0] = '-';
|
||||
off = -off;
|
||||
} else {
|
||||
tbuf[0] = '+';
|
||||
}
|
||||
sprintf(tbuf+1, "%02d%02d", off/60, off%60);
|
||||
break;
|
||||
#endif /* MAILHEADER_EXT */
|
||||
|
||||
case 'Z': /* time zone name or abbrevation */
|
||||
#ifdef HAVE_TZNAME
|
||||
i = (daylight && timeptr->tm_isdst > 0); /* 0 or 1 */
|
||||
strcpy(tbuf, tzname[i]);
|
||||
#else
|
||||
#ifdef HAVE_TM_ZONE
|
||||
strcpy(tbuf, timeptr->tm_zone);
|
||||
#else
|
||||
#ifdef HAVE_TM_NAME
|
||||
strcpy(tbuf, timeptr->tm_name);
|
||||
#else
|
||||
gettimeofday(& tv, & zone);
|
||||
strcpy(tbuf, timezone(zone.tz_minuteswest,
|
||||
timeptr->tm_isdst > 0));
|
||||
#endif /* HAVE_TM_NAME */
|
||||
#endif /* HAVE_TM_ZONE */
|
||||
#endif /* HAVE_TZNAME */
|
||||
break;
|
||||
|
||||
#ifdef SYSV_EXT
|
||||
case 'n': /* same as \n */
|
||||
tbuf[0] = '\n';
|
||||
tbuf[1] = '\0';
|
||||
break;
|
||||
|
||||
case 't': /* same as \t */
|
||||
tbuf[0] = '\t';
|
||||
tbuf[1] = '\0';
|
||||
break;
|
||||
|
||||
case 'D': /* date as %m/%d/%y */
|
||||
strftime(tbuf, sizeof tbuf, "%m/%d/%y", timeptr);
|
||||
break;
|
||||
|
||||
case 'e': /* day of month, blank padded */
|
||||
sprintf(tbuf, "%2d", range(1, timeptr->tm_mday, 31));
|
||||
break;
|
||||
|
||||
case 'r': /* time as %I:%M:%S %p */
|
||||
strftime(tbuf, sizeof tbuf, "%I:%M:%S %p", timeptr);
|
||||
break;
|
||||
|
||||
case 'R': /* time as %H:%M */
|
||||
strftime(tbuf, sizeof tbuf, "%H:%M", timeptr);
|
||||
break;
|
||||
|
||||
case 'T': /* time as %H:%M:%S */
|
||||
strftime(tbuf, sizeof tbuf, "%H:%M:%S", timeptr);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef SUNOS_EXT
|
||||
case 'k': /* hour, 24-hour clock, blank pad */
|
||||
sprintf(tbuf, "%2d", range(0, timeptr->tm_hour, 23));
|
||||
break;
|
||||
|
||||
case 'l': /* hour, 12-hour clock, 1 - 12, blank pad */
|
||||
i = range(0, timeptr->tm_hour, 23);
|
||||
if (i == 0)
|
||||
i = 12;
|
||||
else if (i > 12)
|
||||
i -= 12;
|
||||
sprintf(tbuf, "%2d", i);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef VMS_EXT
|
||||
case 'v': /* date as dd-bbb-YYYY */
|
||||
sprintf(tbuf, "%02d-%3.3s-%4d",
|
||||
range(1, timeptr->tm_mday, 31),
|
||||
months_a[range(0, timeptr->tm_mon, 11)],
|
||||
timeptr->tm_year + 1900);
|
||||
for (i = 3; i < 6; i++)
|
||||
if (islower(tbuf[i]))
|
||||
tbuf[i] = toupper(tbuf[i]);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef POSIX2_DATE
|
||||
case 'C':
|
||||
sprintf(tbuf, "%02d", (timeptr->tm_year + 1900) / 100);
|
||||
break;
|
||||
|
||||
|
||||
case 'E':
|
||||
case 'O':
|
||||
/* POSIX locale extensions, ignored for now */
|
||||
goto again;
|
||||
|
||||
case 'V': /* week of year according ISO 8601 */
|
||||
sprintf(tbuf, "%02d", iso8601wknum(timeptr));
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
/* ISO 8601: Weekday as a decimal number [1 (Monday) - 7] */
|
||||
sprintf(tbuf, "%d", timeptr->tm_wday == 0 ? 7 :
|
||||
timeptr->tm_wday);
|
||||
break;
|
||||
#endif /* POSIX2_DATE */
|
||||
|
||||
#ifdef ISO_DATE_EXT
|
||||
case 'G':
|
||||
case 'g':
|
||||
/*
|
||||
* Year of ISO week.
|
||||
*
|
||||
* If it's December but the ISO week number is one,
|
||||
* that week is in next year.
|
||||
* If it's January but the ISO week number is 52 or
|
||||
* 53, that week is in last year.
|
||||
* Otherwise, it's this year.
|
||||
*/
|
||||
w = iso8601wknum(timeptr);
|
||||
if (timeptr->tm_mon == 11 && w == 1)
|
||||
y = 1900 + timeptr->tm_year + 1;
|
||||
else if (timeptr->tm_mon == 0 && w >= 52)
|
||||
y = 1900 + timeptr->tm_year - 1;
|
||||
else
|
||||
y = 1900 + timeptr->tm_year;
|
||||
|
||||
if (*format == 'G')
|
||||
sprintf(tbuf, "%d", y);
|
||||
else
|
||||
sprintf(tbuf, "%02d", y % 100);
|
||||
break;
|
||||
#endif ISO_DATE_EXT
|
||||
default:
|
||||
tbuf[0] = '%';
|
||||
tbuf[1] = *format;
|
||||
tbuf[2] = '\0';
|
||||
break;
|
||||
}
|
||||
i = strlen(tbuf);
|
||||
if (i) {
|
||||
if (s + i < endp - 1) {
|
||||
strcpy(s, tbuf);
|
||||
s += i;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
out:
|
||||
if (s < endp && *format == '\0') {
|
||||
*s = '\0';
|
||||
return (s - start);
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* isleap --- is a year a leap year? */
|
||||
|
||||
#ifndef __STDC__
|
||||
static int
|
||||
isleap(year)
|
||||
int year;
|
||||
#else
|
||||
static int
|
||||
isleap(int year)
|
||||
#endif
|
||||
{
|
||||
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
|
||||
}
|
||||
|
||||
|
||||
#ifdef POSIX2_DATE
|
||||
/* iso8601wknum --- compute week number according to ISO 8601 */
|
||||
|
||||
#ifndef __STDC__
|
||||
static int
|
||||
iso8601wknum(timeptr)
|
||||
const struct tm *timeptr;
|
||||
#else
|
||||
static int
|
||||
iso8601wknum(const struct tm *timeptr)
|
||||
#endif
|
||||
{
|
||||
/*
|
||||
* From 1003.2:
|
||||
* If the week (Monday to Sunday) containing January 1
|
||||
* has four or more days in the new year, then it is week 1;
|
||||
* otherwise it is the highest numbered week of the previous
|
||||
* year (52 or 53), and the next week is week 1.
|
||||
*
|
||||
* ADR: This means if Jan 1 was Monday through Thursday,
|
||||
* it was week 1, otherwise week 52 or 53.
|
||||
*
|
||||
* XPG4 erroneously included POSIX.2 rationale text in the
|
||||
* main body of the standard. Thus it requires week 53.
|
||||
*/
|
||||
|
||||
int weeknum, jan1day, diff;
|
||||
|
||||
/* get week number, Monday as first day of the week */
|
||||
weeknum = weeknumber(timeptr, 1);
|
||||
|
||||
/*
|
||||
* With thanks and tip of the hatlo to tml@tik.vtt.fi
|
||||
*
|
||||
* What day of the week does January 1 fall on?
|
||||
* We know that
|
||||
* (timeptr->tm_yday - jan1.tm_yday) MOD 7 ==
|
||||
* (timeptr->tm_wday - jan1.tm_wday) MOD 7
|
||||
* and that
|
||||
* jan1.tm_yday == 0
|
||||
* and that
|
||||
* timeptr->tm_wday MOD 7 == timeptr->tm_wday
|
||||
* from which it follows that. . .
|
||||
*/
|
||||
jan1day = timeptr->tm_wday - (timeptr->tm_yday % 7);
|
||||
if (jan1day < 0)
|
||||
jan1day += 7;
|
||||
|
||||
/*
|
||||
* If Jan 1 was a Monday through Thursday, it was in
|
||||
* week 1. Otherwise it was last year's highest week, which is
|
||||
* this year's week 0.
|
||||
*
|
||||
* What does that mean?
|
||||
* If Jan 1 was Monday, the week number is exactly right, it can
|
||||
* never be 0.
|
||||
* If it was Tuesday through Thursday, the weeknumber is one
|
||||
* less than it should be, so we add one.
|
||||
* Otherwise, Friday, Saturday or Sunday, the week number is
|
||||
* OK, but if it is 0, it needs to be 52 or 53.
|
||||
*/
|
||||
switch (jan1day) {
|
||||
case 1: /* Monday */
|
||||
break;
|
||||
case 2: /* Tuesday */
|
||||
case 3: /* Wednesday */
|
||||
case 4: /* Thursday */
|
||||
weeknum++;
|
||||
break;
|
||||
case 5: /* Friday */
|
||||
case 6: /* Saturday */
|
||||
case 0: /* Sunday */
|
||||
if (weeknum == 0) {
|
||||
#ifdef USE_BROKEN_XPG4
|
||||
/* XPG4 (as of March 1994) says 53 unconditionally */
|
||||
weeknum = 53;
|
||||
#else
|
||||
/* get week number of last week of last year */
|
||||
struct tm dec31ly; /* 12/31 last year */
|
||||
dec31ly = *timeptr;
|
||||
dec31ly.tm_year--;
|
||||
dec31ly.tm_mon = 11;
|
||||
dec31ly.tm_mday = 31;
|
||||
dec31ly.tm_wday = (jan1day == 0) ? 6 : jan1day - 1;
|
||||
dec31ly.tm_yday = 364 + isleap(dec31ly.tm_year + 1900);
|
||||
weeknum = iso8601wknum(& dec31ly);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (timeptr->tm_mon == 11) {
|
||||
/*
|
||||
* The last week of the year
|
||||
* can be in week 1 of next year.
|
||||
* Sigh.
|
||||
*
|
||||
* This can only happen if
|
||||
* M T W
|
||||
* 29 30 31
|
||||
* 30 31
|
||||
* 31
|
||||
*/
|
||||
int wday, mday;
|
||||
|
||||
wday = timeptr->tm_wday;
|
||||
mday = timeptr->tm_mday;
|
||||
if ( (wday == 1 && (mday >= 29 && mday <= 31))
|
||||
|| (wday == 2 && (mday == 30 || mday == 31))
|
||||
|| (wday == 3 && mday == 31))
|
||||
weeknum = 1;
|
||||
}
|
||||
|
||||
return weeknum;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* weeknumber --- figure how many weeks into the year */
|
||||
|
||||
/* With thanks and tip of the hatlo to ado@elsie.nci.nih.gov */
|
||||
|
||||
#ifndef __STDC__
|
||||
static int
|
||||
weeknumber(timeptr, firstweekday)
|
||||
const struct tm *timeptr;
|
||||
int firstweekday;
|
||||
#else
|
||||
static int
|
||||
weeknumber(const struct tm *timeptr, int firstweekday)
|
||||
#endif
|
||||
{
|
||||
int wday = timeptr->tm_wday;
|
||||
int ret;
|
||||
|
||||
if (firstweekday == 1) {
|
||||
if (wday == 0) /* sunday */
|
||||
wday = 6;
|
||||
else
|
||||
wday--;
|
||||
}
|
||||
ret = ((timeptr->tm_yday + 7 - wday) / 7);
|
||||
if (ret < 0)
|
||||
ret = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* ADR --- I'm loathe to mess with ado's code ... */
|
||||
|
||||
Date: Wed, 24 Apr 91 20:54:08 MDT
|
||||
From: Michal Jaegermann <audfax!emory!vm.ucs.UAlberta.CA!NTOMCZAK>
|
||||
To: arnold@audiofax.com
|
||||
|
||||
Hi Arnold,
|
||||
in a process of fixing of strftime() in libraries on Atari ST I grabbed
|
||||
some pieces of code from your own strftime. When doing that it came
|
||||
to mind that your weeknumber() function compiles a little bit nicer
|
||||
in the following form:
|
||||
/*
|
||||
* firstweekday is 0 if starting in Sunday, non-zero if in Monday
|
||||
*/
|
||||
{
|
||||
return (timeptr->tm_yday - timeptr->tm_wday +
|
||||
(firstweekday ? (timeptr->tm_wday ? 8 : 1) : 7)) / 7;
|
||||
}
|
||||
How nicer it depends on a compiler, of course, but always a tiny bit.
|
||||
|
||||
Cheers,
|
||||
Michal
|
||||
ntomczak@vm.ucs.ualberta.ca
|
||||
#endif
|
||||
|
||||
#ifdef TEST_STRFTIME
|
||||
|
||||
/*
|
||||
* NAME:
|
||||
* tst
|
||||
*
|
||||
* SYNOPSIS:
|
||||
* tst
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* "tst" is a test driver for the function "strftime".
|
||||
*
|
||||
* OPTIONS:
|
||||
* None.
|
||||
*
|
||||
* AUTHOR:
|
||||
* Karl Vogel
|
||||
* Control Data Systems, Inc.
|
||||
* vogelke@c-17igp.wpafb.af.mil
|
||||
*
|
||||
* BUGS:
|
||||
* None noticed yet.
|
||||
*
|
||||
* COMPILE:
|
||||
* cc -o tst -DTEST_STRFTIME strftime.c
|
||||
*/
|
||||
|
||||
/* ADR: I reformatted this to my liking, and deleted some unneeded code. */
|
||||
|
||||
#ifndef NULL
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAXTIME 132
|
||||
|
||||
/*
|
||||
* Array of time formats.
|
||||
*/
|
||||
|
||||
static char *array[] =
|
||||
{
|
||||
"(%%A) full weekday name, var length (Sunday..Saturday) %A",
|
||||
"(%%B) full month name, var length (January..December) %B",
|
||||
"(%%C) Century %C",
|
||||
"(%%D) date (%%m/%%d/%%y) %D",
|
||||
"(%%E) Locale extensions (ignored) %E",
|
||||
"(%%H) hour (24-hour clock, 00..23) %H",
|
||||
"(%%I) hour (12-hour clock, 01..12) %I",
|
||||
"(%%M) minute (00..59) %M",
|
||||
"(%%O) Locale extensions (ignored) %O",
|
||||
"(%%R) time, 24-hour (%%H:%%M) %R",
|
||||
"(%%S) second (00..61) %S",
|
||||
"(%%T) time, 24-hour (%%H:%%M:%%S) %T",
|
||||
"(%%U) week of year, Sunday as first day of week (00..53) %U",
|
||||
"(%%V) week of year according to ISO 8601 %V",
|
||||
"(%%W) week of year, Monday as first day of week (00..53) %W",
|
||||
"(%%X) appropriate locale time representation (%H:%M:%S) %X",
|
||||
"(%%Y) year with century (1970...) %Y",
|
||||
"(%%Z) timezone (EDT), or blank if timezone not determinable %Z",
|
||||
"(%%a) locale's abbreviated weekday name (Sun..Sat) %a",
|
||||
"(%%b) locale's abbreviated month name (Jan..Dec) %b",
|
||||
"(%%c) full date (Sat Nov 4 12:02:33 1989)%n%t%t%t %c",
|
||||
"(%%d) day of the month (01..31) %d",
|
||||
"(%%e) day of the month, blank-padded ( 1..31) %e",
|
||||
"(%%h) should be same as (%%b) %h",
|
||||
"(%%j) day of the year (001..366) %j",
|
||||
"(%%k) hour, 24-hour clock, blank pad ( 0..23) %k",
|
||||
"(%%l) hour, 12-hour clock, blank pad ( 0..12) %l",
|
||||
"(%%m) month (01..12) %m",
|
||||
"(%%p) locale's AM or PM based on 12-hour clock %p",
|
||||
"(%%r) time, 12-hour (same as %%I:%%M:%%S %%p) %r",
|
||||
"(%%u) ISO 8601: Weekday as decimal number [1 (Monday) - 7] %u",
|
||||
"(%%v) VMS date (dd-bbb-YYYY) %v",
|
||||
"(%%w) day of week (0..6, Sunday == 0) %w",
|
||||
"(%%x) appropriate locale date representation %x",
|
||||
"(%%y) last two digits of year (00..99) %y",
|
||||
"(%%z) timezone offset east of GMT as HHMM (e.g. -0500) %z",
|
||||
(char *) NULL
|
||||
};
|
||||
|
||||
/* main routine. */
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
long time();
|
||||
|
||||
char *next;
|
||||
char string[MAXTIME];
|
||||
|
||||
int k;
|
||||
int length;
|
||||
|
||||
struct tm *tm;
|
||||
|
||||
long clock;
|
||||
|
||||
/* Call the function. */
|
||||
|
||||
clock = time((long *) 0);
|
||||
tm = localtime(&clock);
|
||||
|
||||
for (k = 0; next = array[k]; k++) {
|
||||
length = strftime(string, MAXTIME, next, tm);
|
||||
printf("%s\n", string);
|
||||
}
|
||||
|
||||
exit(0);
|
||||
}
|
||||
#endif /* TEST_STRFTIME */
|
||||
73
missing/strstr.c
Normal file
73
missing/strstr.c
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* strstr.c --
|
||||
*
|
||||
* Source code for the "strstr" library routine.
|
||||
*
|
||||
* Copyright 1988-1991 Regents of the University of California
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appears in all copies. The University of California
|
||||
* makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without
|
||||
* express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Header$ SPRITE (Berkeley)";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* strstr --
|
||||
*
|
||||
* Locate the first instance of a substring in a string.
|
||||
*
|
||||
* Results:
|
||||
* If string contains substring, the return value is the
|
||||
* location of the first matching instance of substring
|
||||
* in string. If string doesn't contain substring, the
|
||||
* return value is 0. Matching is done on an exact
|
||||
* character-for-character basis with no wildcards or special
|
||||
* characters.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
char *
|
||||
strstr(string, substring)
|
||||
register char *string; /* String to search. */
|
||||
char *substring; /* Substring to try to find in string. */
|
||||
{
|
||||
register char *a, *b;
|
||||
|
||||
/* First scan quickly through the two strings looking for a
|
||||
* single-character match. When it's found, then compare the
|
||||
* rest of the substring.
|
||||
*/
|
||||
|
||||
b = substring;
|
||||
if (*b == 0) {
|
||||
return string;
|
||||
}
|
||||
for ( ; *string != 0; string += 1) {
|
||||
if (*string != *b) {
|
||||
continue;
|
||||
}
|
||||
a = string;
|
||||
while (1) {
|
||||
if (*b == 0) {
|
||||
return string;
|
||||
}
|
||||
if (*a++ != *b++) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
b = substring;
|
||||
}
|
||||
return (char *) 0;
|
||||
}
|
||||
84
missing/strtol.c
Normal file
84
missing/strtol.c
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* strtol.c --
|
||||
*
|
||||
* Source code for the "strtol" library procedure.
|
||||
*
|
||||
* Copyright 1988 Regents of the University of California
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies. The University of California
|
||||
* makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without
|
||||
* express or implied warranty.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* strtol --
|
||||
*
|
||||
* Convert an ASCII string into an integer.
|
||||
*
|
||||
* Results:
|
||||
* The return value is the integer equivalent of string. If endPtr
|
||||
* is non-NULL, then *endPtr is filled in with the character
|
||||
* after the last one that was part of the integer. If string
|
||||
* doesn't contain a valid integer value, then zero is returned
|
||||
* and *endPtr is set to string.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
long int
|
||||
strtol(string, endPtr, base)
|
||||
char *string; /* String of ASCII digits, possibly
|
||||
* preceded by white space. For bases
|
||||
* greater than 10, either lower- or
|
||||
* upper-case digits may be used.
|
||||
*/
|
||||
char **endPtr; /* Where to store address of terminating
|
||||
* character, or NULL. */
|
||||
int base; /* Base for conversion. Must be less
|
||||
* than 37. If 0, then the base is chosen
|
||||
* from the leading characters of string:
|
||||
* "0x" means hex, "0" means octal, anything
|
||||
* else means decimal.
|
||||
*/
|
||||
{
|
||||
register char *p;
|
||||
int result;
|
||||
|
||||
/*
|
||||
* Skip any leading blanks.
|
||||
*/
|
||||
|
||||
p = string;
|
||||
while (isspace(*p)) {
|
||||
p += 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a sign.
|
||||
*/
|
||||
|
||||
if (*p == '-') {
|
||||
p += 1;
|
||||
result = -(strtoul(p, endPtr, base));
|
||||
} else {
|
||||
if (*p == '+') {
|
||||
p += 1;
|
||||
}
|
||||
result = strtoul(p, endPtr, base);
|
||||
}
|
||||
if ((result == 0) && (endPtr != 0) && (*endPtr == p)) {
|
||||
*endPtr = string;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
184
missing/strtoul.c
Normal file
184
missing/strtoul.c
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
/*
|
||||
* strtoul.c --
|
||||
*
|
||||
* Source code for the "strtoul" library procedure.
|
||||
*
|
||||
* Copyright 1988 Regents of the University of California
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies. The University of California
|
||||
* makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without
|
||||
* express or implied warranty.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
/*
|
||||
* The table below is used to convert from ASCII digits to a
|
||||
* numerical equivalent. It maps from '0' through 'z' to integers
|
||||
* (100 for non-digit characters).
|
||||
*/
|
||||
|
||||
static char cvtIn[] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* '0' - '9' */
|
||||
100, 100, 100, 100, 100, 100, 100, /* punctuation */
|
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'A' - 'Z' */
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||
30, 31, 32, 33, 34, 35,
|
||||
100, 100, 100, 100, 100, 100, /* punctuation */
|
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'a' - 'z' */
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||
30, 31, 32, 33, 34, 35};
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* strtoul --
|
||||
*
|
||||
* Convert an ASCII string into an integer.
|
||||
*
|
||||
* Results:
|
||||
* The return value is the integer equivalent of string. If endPtr
|
||||
* is non-NULL, then *endPtr is filled in with the character
|
||||
* after the last one that was part of the integer. If string
|
||||
* doesn't contain a valid integer value, then zero is returned
|
||||
* and *endPtr is set to string.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
unsigned long int
|
||||
strtoul(string, endPtr, base)
|
||||
char *string; /* String of ASCII digits, possibly
|
||||
* preceded by white space. For bases
|
||||
* greater than 10, either lower- or
|
||||
* upper-case digits may be used.
|
||||
*/
|
||||
char **endPtr; /* Where to store address of terminating
|
||||
* character, or NULL. */
|
||||
int base; /* Base for conversion. Must be less
|
||||
* than 37. If 0, then the base is chosen
|
||||
* from the leading characters of string:
|
||||
* "0x" means hex, "0" means octal, anything
|
||||
* else means decimal.
|
||||
*/
|
||||
{
|
||||
register char *p;
|
||||
register unsigned long int result = 0;
|
||||
register unsigned digit;
|
||||
int anyDigits = 0;
|
||||
|
||||
/*
|
||||
* Skip any leading blanks.
|
||||
*/
|
||||
|
||||
p = string;
|
||||
while (isspace(*p)) {
|
||||
p += 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no base was provided, pick one from the leading characters
|
||||
* of the string.
|
||||
*/
|
||||
|
||||
if (base == 0)
|
||||
{
|
||||
if (*p == '0') {
|
||||
p += 1;
|
||||
if (*p == 'x') {
|
||||
p += 1;
|
||||
base = 16;
|
||||
} else {
|
||||
|
||||
/*
|
||||
* Must set anyDigits here, otherwise "0" produces a
|
||||
* "no digits" error.
|
||||
*/
|
||||
|
||||
anyDigits = 1;
|
||||
base = 8;
|
||||
}
|
||||
}
|
||||
else base = 10;
|
||||
} else if (base == 16) {
|
||||
|
||||
/*
|
||||
* Skip a leading "0x" from hex numbers.
|
||||
*/
|
||||
|
||||
if ((p[0] == '0') && (p[1] == 'x')) {
|
||||
p += 2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Sorry this code is so messy, but speed seems important. Do
|
||||
* different things for base 8, 10, 16, and other.
|
||||
*/
|
||||
|
||||
if (base == 8) {
|
||||
for ( ; ; p += 1) {
|
||||
digit = *p - '0';
|
||||
if (digit > 7) {
|
||||
break;
|
||||
}
|
||||
result = (result << 3) + digit;
|
||||
anyDigits = 1;
|
||||
}
|
||||
} else if (base == 10) {
|
||||
for ( ; ; p += 1) {
|
||||
digit = *p - '0';
|
||||
if (digit > 9) {
|
||||
break;
|
||||
}
|
||||
result = (10*result) + digit;
|
||||
anyDigits = 1;
|
||||
}
|
||||
} else if (base == 16) {
|
||||
for ( ; ; p += 1) {
|
||||
digit = *p - '0';
|
||||
if (digit > ('z' - '0')) {
|
||||
break;
|
||||
}
|
||||
digit = cvtIn[digit];
|
||||
if (digit > 15) {
|
||||
break;
|
||||
}
|
||||
result = (result << 4) + digit;
|
||||
anyDigits = 1;
|
||||
}
|
||||
} else {
|
||||
for ( ; ; p += 1) {
|
||||
digit = *p - '0';
|
||||
if (digit > ('z' - '0')) {
|
||||
break;
|
||||
}
|
||||
digit = cvtIn[digit];
|
||||
if (digit >= base) {
|
||||
break;
|
||||
}
|
||||
result = result*base + digit;
|
||||
anyDigits = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* See if there were any digits at all.
|
||||
*/
|
||||
|
||||
if (!anyDigits) {
|
||||
p = string;
|
||||
}
|
||||
|
||||
if (endPtr != 0) {
|
||||
*endPtr = p;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
12
missing/x68.c
Normal file
12
missing/x68.c
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#include "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
|
||||
Loading…
Add table
Add a link
Reference in a new issue