/*
Copyright © 1998, 1999 Lucent Technologies Inc.  All rights reserved.  
Revisions Copyright © 1999, 2000 Vita Nuova Limited.  All rights reserved.
Revisions Copyright © 2001 Norman Ramsey.  All rights reserved.  
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <string.h>
#include "math.h"
#include <fcntl.h>
#include <setjmp.h>
#include <float.h>
#include <unistd.h>
#include <assert.h>

#define	nil		((void*)0)

#if defined(PEDANTIC_ANSI) || defined(__STRICT_ANSI__)
typedef unsigned long	ulong;
typedef unsigned short	ushort;
#elif defined(__FreeBSD__)      /* by wkj@eecs.harvard.edu */
typedef unsigned long	ulong; 
#endif

typedef unsigned char	uchar;
typedef signed char	schar;
typedef unsigned short	Rune;
#ifdef LONGLONG
typedef long long int	vlong;
typedef unsigned long long int	uvlong;
#define LONGLONGSTMT(S) S
#define LONGLONGDECL(D) D
#else
#define LONGLONGSTMT(S) {assert(0);}
#define LONGLONGDECL(D)
#endif

/*
 * rune routines from converted str routines
 */
extern	long	utflen(char*);
extern	char*	utfrune(char*, long);
extern	char*	utfrrune(char*, long);

enum
{
	UTFmax		= 3,		/* maximum bytes per rune */
	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
	Runeerror	= 0x80		/* decoding error in UTF */
};

/*
 * new rune routines
 */
extern	int	runetochar(char*, Rune*);
extern	int	chartorune(Rune*, char*);
extern	int	runelen(long);
extern	int	fullrune(char*, int);
extern	int	runestrlen(Rune*);
extern	int	runenlen(Rune*, int);

extern	char*	doprint(char*, char*, char*, va_list);

#define	USED(x)		if(x);else
#define	SET(x)



#define nelem(x)	(sizeof(x)/sizeof((x)[0]))

enum
{
	NAMELEN	= 28,
	ERRLEN	= 64,
	DIRLEN	= 116
};

#define CHDIR		0x80000000	/* mode bit for directories */
#define CHAPPEND	0x40000000	/* mode bit for append only files */
#define CHEXCL		0x20000000	/* mode bit for exclusive use files */
#define CHMOUNT		0x10000000	/* mode bit for mounted channel */
#define CHREAD		0x4		/* mode bit for read permission */
#define CHWRITE		0x2		/* mode bit for write permission */
#define CHEXEC		0x1		/* mode bit for execute permission */

#define	OREAD		0		/* open for read */
#define	OWRITE		1		/* write */
#define	ORDWR		2		/* read and write */
#define	OEXEC		3		/* execute, == read but check execute permission */
#define	OTRUNC		16		/* or'ed in (except for exec), truncate file first */
#define	OCEXEC		32		/* or'ed in, close on exec */
#define	ORCLOSE		64		/* or'ed in, remove on close */

typedef
struct Qid
{
	unsigned long	path;
	unsigned long	vers;
} Qid;

typedef
struct Dir
{
	char	name[NAMELEN];
	char	uid[NAMELEN];
	char	gid[NAMELEN];
	Qid	qid;
	unsigned long	mode;
	int	atime;
	int	mtime;
	unsigned long	length;
	ushort	type;
	dev_t	dev;
} Dir;

/*
 * print routines
 */
typedef	struct	Fconv	Fconv;
struct	Fconv
{
	char*	out;		/* pointer to next output */
	char*	eout;		/* pointer to end */
	int	f1;
	int	f2;
	int	f3;
	int	chr;
};
extern	int	print(char*, ...);
extern	int	snprint(char*, int, char*, ...);
extern	int	sprint(char*, char*, ...);
extern	int	fprint(int, char*, ...);
extern	char*	strdup(const char*);
#ifdef LONGLONG
#define strtoll(s, t, i)	strtoll_inferno(s, t, i)
extern	vlong	strtoll_inferno(const char*, char**, int);
#endif

extern	int	fmtinstall(int, int (*)(va_list*, Fconv*));
extern	int	numbconv(va_list*, Fconv*);
extern	void	strconv(char*, Fconv*);
extern	int	fltconv(va_list*, Fconv*);



syntax highlighted by Code2HTML, v. 0.9.1