Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * functions (possibly) linked in, complete, from libc.
3
 */
4
#define nelem(x)	(sizeof(x)/sizeof((x)[0]))
5
#define offsetof(s, m)	(ulong)(&(((s*)0)->m))
6
#define assert(x)	if(x){}else _assert("x")
7
 
8
/*
9
 * mem routines
10
 */
11
extern	void*	memccpy(void*, void*, int, ulong);
12
extern	void*	memset(void*, int, ulong);
13
extern	int	memcmp(void*, void*, ulong);
14
extern	void*	memmove(void*, void*, ulong);
15
extern	void*	memchr(void*, int, ulong);
16
 
17
/*
18
 * string routines
19
 */
20
extern	char*	strcat(char*, char*);
21
extern	char*	strchr(char*, int);
22
extern	char*	strrchr(char*, int);
23
extern	int	strcmp(char*, char*);
24
extern	char*	strcpy(char*, char*);
25
extern	char*	strecpy(char*, char*, char*);
26
extern	char*	strncat(char*, char*, long);
27
extern	char*	strncpy(char*, char*, long);
28
extern	int	strncmp(char*, char*, long);
29
extern	long	strlen(char*);
30
extern	char*	strstr(char*, char*);
31
extern	int	atoi(char*);
32
extern	int	fullrune(char*, int);
33
extern	int	cistrcmp(char*, char*);
34
extern	int	cistrncmp(char*, char*, int);
35
 
36
enum
37
{
38
	UTFmax		= 4,		/* maximum bytes per rune */
39
	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
40
	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
41
	Runeerror	= 0xFFFD,	/* decoding error in UTF */
42
	Runemax		= 0x10FFFF,	/* 24 bit rune */
43
	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
44
};
45
 
46
/*
47
 * rune routines
48
 */
49
extern	int	runetochar(char*, Rune*);
50
extern	int	chartorune(Rune*, char*);
51
extern	char*	utfrune(char*, long);
52
extern	int	utflen(char*);
53
extern	int	utfnlen(char*, long);
54
extern	int	runelen(long);
55
 
56
extern	int	abs(int);
57
 
58
/*
59
 * print routines
60
 */
61
typedef struct Fmt	Fmt;
62
typedef int (*Fmts)(Fmt*);
63
struct Fmt{
64
	uchar	runes;			/* output buffer is runes or chars? */
65
	void	*start;			/* of buffer */
66
	void	*to;			/* current place in the buffer */
67
	void	*stop;			/* end of the buffer; overwritten if flush fails */
68
	int	(*flush)(Fmt *);	/* called when to == stop */
69
	void	*farg;			/* to make flush a closure */
70
	int	nfmt;			/* num chars formatted so far */
71
	va_list	args;			/* args passed to dofmt */
72
	int	r;			/* % format Rune */
73
	int	width;
74
	int	prec;
75
	ulong	flags;
76
};
77
extern	int	print(char*, ...);
78
extern	char*	seprint(char*, char*, char*, ...);
79
extern	char*	vseprint(char*, char*, char*, va_list);
80
extern	int	snprint(char*, int, char*, ...);
81
extern	int	vsnprint(char*, int, char*, va_list);
82
extern	int	sprint(char*, char*, ...);
83
 
84
#pragma	varargck	argpos	fmtprint	2
85
#pragma	varargck	argpos	print		1
86
#pragma	varargck	argpos	seprint		3
87
#pragma	varargck	argpos	snprint		3
88
#pragma	varargck	argpos	sprint		2
89
 
90
#pragma	varargck	type	"lld"	vlong
91
#pragma	varargck	type	"llx"	vlong
92
#pragma	varargck	type	"lld"	uvlong
93
#pragma	varargck	type	"llx"	uvlong
94
#pragma	varargck	type	"ld"	long
95
#pragma	varargck	type	"lx"	long
96
#pragma	varargck	type	"ld"	ulong
97
#pragma	varargck	type	"lx"	ulong
98
#pragma	varargck	type	"d"	int
99
#pragma	varargck	type	"x"	int
100
#pragma	varargck	type	"c"	int
101
#pragma	varargck	type	"C"	int
102
#pragma	varargck	type	"d"	uint
103
#pragma	varargck	type	"x"	uint
104
#pragma	varargck	type	"c"	uint
105
#pragma	varargck	type	"C"	uint
106
#pragma	varargck	type	"s"	char*
107
#pragma	varargck	type	"q"	char*
108
#pragma	varargck	type	"S"	Rune*
109
#pragma	varargck	type	"%"	void
110
#pragma	varargck	type	"p"	uintptr
111
#pragma	varargck	type	"p"	void*
112
#pragma	varargck	flag	','
113
 
114
extern	int	fmtstrinit(Fmt*);
115
extern	int	fmtinstall(int, int (*)(Fmt*));
116
extern	void	quotefmtinstall(void);
117
extern	int	fmtprint(Fmt*, char*, ...);
118
extern	int	fmtstrcpy(Fmt*, char*);
119
extern	char*	fmtstrflush(Fmt*);
120
 
121
/*
122
 * one-of-a-kind
123
 */
124
extern	char*	cleanname(char*);
125
extern	ulong	getcallerpc(void*);
126
 
127
extern	long	strtol(char*, char**, int);
128
extern	ulong	strtoul(char*, char**, int);
129
extern	vlong	strtoll(char*, char**, int);
130
extern	uvlong	strtoull(char*, char**, int);
131
extern	char	etext[];
132
extern	char	edata[];
133
extern	char	end[];
134
extern	int	getfields(char*, char**, int, int, char*);
135
extern	int	tokenize(char*, char**, int);
136
extern	int	dec64(uchar*, int, char*, int);
137
extern	int	encodefmt(Fmt*);
138
extern	void	qsort(void*, long, long, int (*)(void*, void*));
139
 
140
/*
141
 * Syscall data structures
142
 */
143
#define	MORDER	0x0003	/* mask for bits defining order of mounting */
144
#define	MREPL	0x0000	/* mount replaces object */
145
#define	MBEFORE	0x0001	/* mount goes before others in union directory */
146
#define	MAFTER	0x0002	/* mount goes after others in union directory */
147
#define	MCREATE	0x0004	/* permit creation in mounted directory */
148
#define	MCACHE	0x0010	/* cache some data */
149
#define	MMASK	0x0017	/* all bits on */
150
 
151
#define	OREAD	0	/* open for read */
152
#define	OWRITE	1	/* write */
153
#define	ORDWR	2	/* read and write */
154
#define	OEXEC	3	/* execute, == read but check execute permission */
155
#define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
156
#define	OCEXEC	32	/* or'ed in, close on exec */
157
#define	ORCLOSE	64	/* or'ed in, remove on close */
158
#define OEXCL   0x1000	/* or'ed in, exclusive create */
159
 
160
#define	NCONT	0	/* continue after note */
161
#define	NDFLT	1	/* terminate after note */
162
#define	NSAVE	2	/* clear note but hold state */
163
#define	NRSTR	3	/* restore saved state */
164
 
165
typedef struct Qid	Qid;
166
typedef struct Dir	Dir;
167
typedef struct OWaitmsg	OWaitmsg;
168
typedef struct Waitmsg	Waitmsg;
169
 
170
#define	ERRMAX			128	/* max length of error string */
171
#define	KNAMELEN		28	/* max length of name held in kernel */
172
 
173
/* bits in Qid.type */
174
#define QTDIR		0x80		/* type bit for directories */
175
#define QTAPPEND	0x40		/* type bit for append only files */
176
#define QTEXCL		0x20		/* type bit for exclusive use files */
177
#define QTMOUNT		0x10		/* type bit for mounted channel */
178
#define QTAUTH		0x08		/* type bit for authentication file */
179
#define QTFILE		0x00		/* plain file */
180
 
181
/* bits in Dir.mode */
182
#define DMDIR		0x80000000	/* mode bit for directories */
183
#define DMAPPEND	0x40000000	/* mode bit for append only files */
184
#define DMEXCL		0x20000000	/* mode bit for exclusive use files */
185
#define DMMOUNT		0x10000000	/* mode bit for mounted channel */
186
#define DMREAD		0x4		/* mode bit for read permission */
187
#define DMWRITE		0x2		/* mode bit for write permission */
188
#define DMEXEC		0x1		/* mode bit for execute permission */
189
 
190
struct Qid
191
{
192
	uvlong	path;
193
	ulong	vers;
194
	uchar	type;
195
};
196
 
197
struct Dir {
198
	/* system-modified data */
199
	ushort	type;	/* server type */
200
	uint	dev;	/* server subtype */
201
	/* file data */
202
	Qid	qid;	/* unique id from server */
203
	ulong	mode;	/* permissions */
204
	ulong	atime;	/* last read time */
205
	ulong	mtime;	/* last write time */
206
	vlong	length;	/* file length: see <u.h> */
207
	char	*name;	/* last element of path */
208
	char	*uid;	/* owner name */
209
	char	*gid;	/* group name */
210
	char	*muid;	/* last modifier name */
211
};
212
 
213
struct OWaitmsg
214
{
215
	char	pid[12];	/* of loved one */
216
	char	time[3*12];	/* of loved one and descendants */
217
	char	msg[64];	/* compatibility BUG */
218
};
219
 
220
struct Waitmsg
221
{
222
	int	pid;		/* of loved one */
223
	ulong	time[3];	/* of loved one and descendants */
224
	char	msg[ERRMAX];	/* actually variable-size in user mode */
225
};