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