/* * Lib9 is miscellany from the Plan 9 C library that doesn't * fit into libutf or into libfmt, but is still missing from traditional * Unix C libraries. */#ifndef _LIBC_H_#define _LIBC_H_ 1#if defined(__cplusplus)extern "C" {#endif #include <utf.h>#include <fmt.h> /* * Begin usual libc.h */ #ifndef nil#define nil ((void*)0)#endif#define nelem(x) (sizeof(x)/sizeof((x)[0])) #ifndef offsetof#define offsetof(s, m) (ulong)(&(((s*)0)->m))#endif /* * mem routines (provided by system <string.h>) *extern void* memccpy(void*, void*, int, ulong);extern void* memset(void*, int, ulong);extern int memcmp(void*, void*, ulong);extern void* memcpy(void*, void*, ulong);extern void* memmove(void*, void*, ulong);extern void* memchr(void*, int, ulong); */ /* * string routines (provided by system <string.h>) *extern char* strcat(char*, char*);extern char* strchr(char*, int);extern int strcmp(char*, char*);extern char* strcpy(char*, char*); */extern char* strecpy(char*, char*, char*);extern char* p9strdup(char*);/*extern char* strncat(char*, char*, long);extern char* strncpy(char*, char*, long);extern int strncmp(char*, char*, long);extern char* strpbrk(char*, char*);extern char* strrchr(char*, int);extern char* strtok(char*, char*);extern long strlen(char*);extern long strspn(char*, char*);extern long strcspn(char*, char*);extern char* strstr(char*, char*); */extern int cistrncmp(char*, char*, int);extern int cistrcmp(char*, char*);extern char* cistrstr(char*, char*);extern int tokenize(char*, char**, int); /*enum{ UTFmax = 4, Runesync = 0x80, Runeself = 0x80, Runeerror = 0xFFFD, Runemax = 0x10FFFF,};*/ /* * rune routines (provided by <utf.h> *extern int runetochar(char*, Rune*);extern int chartorune(Rune*, char*);extern int runelen(long);extern int runenlen(Rune*, int);extern int fullrune(char*, int);extern int utflen(char*);extern int utfnlen(char*, long);extern char* utfrune(char*, long);extern char* utfrrune(char*, long);extern char* utfutf(char*, char*);extern char* utfecpy(char*, char*, char*); extern Rune* runestrcat(Rune*, Rune*);extern Rune* runestrchr(Rune*, Rune);extern int runestrcmp(Rune*, Rune*);extern Rune* runestrcpy(Rune*, Rune*);extern Rune* runestrncpy(Rune*, Rune*, long);extern Rune* runestrecpy(Rune*, Rune*, Rune*);extern Rune* runestrdup(Rune*);extern Rune* runestrncat(Rune*, Rune*, long);extern int runestrncmp(Rune*, Rune*, long);extern Rune* runestrrchr(Rune*, Rune);extern long runestrlen(Rune*);extern Rune* runestrstr(Rune*, Rune*); extern Rune tolowerrune(Rune);extern Rune totitlerune(Rune);extern Rune toupperrune(Rune);extern int isalpharune(Rune);extern int islowerrune(Rune);extern int isspacerune(Rune);extern int istitlerune(Rune);extern int isupperrune(Rune); */ /* * malloc (provied by system <stdlib.h>) *extern void* malloc(ulong); */extern void* p9malloc(ulong);extern void* mallocz(ulong, int);extern void p9free(void*);extern void* p9calloc(ulong, ulong);extern void* p9realloc(void*, ulong);extern void setmalloctag(void*, ulong);extern void setrealloctag(void*, ulong);extern ulong getmalloctag(void*);extern ulong getrealloctag(void*);/*extern void* malloctopoolblock(void*);*/#ifndef NOPLAN9DEFINES#define malloc p9malloc#define realloc p9realloc#define calloc p9calloc#define free p9free#undef strdup#define strdup p9strdup#endif /* * print routines (provided by <fmt.h>) *typedef struct Fmt Fmt;struct Fmt{ uchar runes; void *start; void *to; void *stop; int (*flush)(Fmt *); void *farg; int nfmt; va_list args; int r; int width; int prec; ulong flags;}; enum{ FmtWidth = 1, FmtLeft = FmtWidth << 1, FmtPrec = FmtLeft << 1, FmtSharp = FmtPrec << 1, FmtSpace = FmtSharp << 1, FmtSign = FmtSpace << 1, FmtZero = FmtSign << 1, FmtUnsigned = FmtZero << 1, FmtShort = FmtUnsigned << 1, FmtLong = FmtShort << 1, FmtVLong = FmtLong << 1, FmtComma = FmtVLong << 1, FmtByte = FmtComma << 1, FmtFlag = FmtByte << 1}; extern int print(char*, ...);extern char* seprint(char*, char*, char*, ...);extern char* vseprint(char*, char*, char*, va_list);extern int snprint(char*, int, char*, ...);extern int vsnprint(char*, int, char*, va_list);extern char* smprint(char*, ...);extern char* vsmprint(char*, va_list);extern int sprint(char*, char*, ...);extern int fprint(int, char*, ...);extern int vfprint(int, char*, va_list); extern int runesprint(Rune*, char*, ...);extern int runesnprint(Rune*, int, char*, ...);extern int runevsnprint(Rune*, int, char*, va_list);extern Rune* runeseprint(Rune*, Rune*, char*, ...);extern Rune* runevseprint(Rune*, Rune*, char*, va_list);extern Rune* runesmprint(char*, ...);extern Rune* runevsmprint(char*, va_list); extern int fmtfdinit(Fmt*, int, char*, int);extern int fmtfdflush(Fmt*);extern int fmtstrinit(Fmt*);extern char* fmtstrflush(Fmt*);extern int runefmtstrinit(Fmt*);extern Rune* runefmtstrflush(Fmt*); extern int fmtinstall(int, int (*)(Fmt*));extern int dofmt(Fmt*, char*);extern int dorfmt(Fmt*, Rune*);extern int fmtprint(Fmt*, char*, ...);extern int fmtvprint(Fmt*, char*, va_list);extern int fmtrune(Fmt*, int);extern int fmtstrcpy(Fmt*, char*);extern int fmtrunestrcpy(Fmt*, Rune*); */ /* * error string for %r * supplied on per os basis, not part of fmt library * * (provided by lib9, but declared in fmt.h) *extern int errfmt(Fmt *f); */ /* * quoted strings */extern char *unquotestrdup(char*);extern Rune *unquoterunestrdup(Rune*);extern char *quotestrdup(char*);extern Rune *quoterunestrdup(Rune*);/* * in fmt.h *extern void quotefmtinstall(void);extern int quotestrfmt(Fmt*);extern int quoterunestrfmt(Fmt*); */#ifndef NOPLAN9DEFINES#define doquote fmtdoquote#endifextern int needsrcquote(int); /* * random number */extern void p9srand(long);extern int p9rand(void); extern int p9nrand(int);extern long p9lrand(void);extern long p9lnrand(long);extern double p9frand(void);extern ulong truerand(void); /* uses /dev/random */extern ulong ntruerand(ulong); /* uses /dev/random */ #ifndef NOPLAN9DEFINES#define srand p9srand#define rand p9rand#define nrand p9nrand#define lrand p9lrand#define lnrand p9lnrand#define frand p9frand#endif /* * math */extern ulong getfcr(void);extern void setfsr(ulong);extern ulong getfsr(void);extern void setfcr(ulong);extern double NaN(void);extern double Inf(int);extern int isNaN(double);extern int isInf(double, int);extern ulong umuldiv(ulong, ulong, ulong);extern long muldiv(long, long, long); /* * provided by math.h *extern double pow(double, double);extern double atan2(double, double);extern double fabs(double);extern double atan(double);extern double log(double);extern double log10(double);extern double exp(double);extern double floor(double);extern double ceil(double);extern double hypot(double, double);extern double sin(double);extern double cos(double);extern double tan(double);extern double asin(double);extern double acos(double);extern double sinh(double);extern double cosh(double);extern double tanh(double);extern double sqrt(double);extern double fmod(double, double);#define HUGE 3.4028234e38#define PIO2 1.570796326794896619231e0#define PI (PIO2+PIO2) */#define PI M_PI#define PIO2 M_PI_2 /* * Time-of-day */ typedefstruct Tm{ int sec; int min; int hour; int mday; int mon; int year; int wday; int yday; char zone[4]; int tzoff;} Tm; extern Tm* p9gmtime(long);extern Tm* p9localtime(long);extern char* p9asctime(Tm*);extern char* p9ctime(long);extern double p9cputime(void);extern long p9times(long*);extern long p9tm2sec(Tm*);extern vlong p9nsec(void); #ifndef NOPLAN9DEFINES#define gmtime p9gmtime#define localtime p9localtime#define asctime p9asctime#define ctime p9ctime#define cputime p9cputime#define times p9times#define tm2sec p9tm2sec#define nsec p9nsec#endif /* * one-of-a-kind */enum{ PNPROC = 1, PNGROUP = 2}; /* extern int abs(int); <stdlib.h> */extern int p9atexit(void(*)(void));extern void p9atexitdont(void(*)(void));extern int atnotify(int(*)(void*, char*), int);/* * <stdlib.h>extern double atof(char*); <stdlib.h> */extern int p9atoi(char*);extern long p9atol(char*);extern vlong p9atoll(char*);extern double fmtcharstod(int(*)(void*), void*);extern char* cleanname(char*);extern int p9decrypt(void*, void*, int);extern int p9encrypt(void*, void*, int);extern int netcrypt(void*, void*);extern int dec64(uchar*, int, char*, int);extern int enc64(char*, int, uchar*, int);extern int dec32(uchar*, int, char*, int);extern int enc32(char*, int, uchar*, int);extern int dec16(uchar*, int, char*, int);extern int enc16(char*, int, uchar*, int);extern int encodefmt(Fmt*);extern int dirmodefmt(Fmt*);extern int exitcode(char*);extern void exits(char*);extern void p9exit(int);extern double frexp(double, int*);extern ulong getcallerpc(void*);extern char* p9getenv(char*);extern int p9putenv(char*, char*);extern int getfields(char*, char**, int, int, char*);extern int gettokens(char *, char **, int, char *);extern char* getuser(void);extern char* p9getwd(char*, int);extern int iounit(int);/* extern long labs(long); <math.h> *//* extern double ldexp(double, int); <math.h> */extern void p9longjmp(p9jmp_buf, int);extern char* mktemp(char*);extern int opentemp(char*, int);/* extern double modf(double, double*); <math.h> */extern void p9notejmp(void*, p9jmp_buf, int);extern void perror(const char*);extern int postnote(int, int, char *);extern double p9pow10(int);/* extern int putenv(char*, char*); <stdlib.h. *//* extern void qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */extern char* searchpath(char*);/* extern int p9setjmp(p9jmp_buf); */#define p9setjmp(b) sigsetjmp((void*)(b), 1)/* * <stdlib.h>extern long strtol(char*, char**, int);extern ulong strtoul(char*, char**, int);extern vlong strtoll(char*, char**, int);extern uvlong strtoull(char*, char**, int); */extern void sysfatal(char*, ...);extern void p9syslog(int, char*, char*, ...);extern long p9time(long*);/* extern int tolower(int); <ctype.h> *//* extern int toupper(int); <ctype.h> */extern void needstack(int);extern char* readcons(char*, char*, int); extern void (*_pin)(void);extern void (*_unpin)(void); #ifndef NOPLAN9DEFINES#define atexit p9atexit#define atexitdont p9atexitdont#define atoi p9atoi#define atol p9atol#define atoll p9atoll#define encrypt p9encrypt#ifndef NOEXITDEFINE# define exit p9exit#endif#define decrypt p9decrypt#define getenv p9getenv#define getwd p9getwd#define longjmp p9longjmp#undef setjmp#define setjmp p9setjmp#define putenv p9putenv#define notejmp p9notejmp#define jmp_buf p9jmp_buf#define time p9time#define pow10 p9pow10#define strtod fmtstrtod#define charstod fmtcharstod#define syslog p9syslog#endif /* * just enough information so that libc can be * properly locked without dragging in all of libthread */typedef struct _Thread _Thread;typedef struct _Threadlist _Threadlist;struct _Threadlist{ _Thread *head; _Thread *tail;}; extern _Thread *(*threadnow)(void); /* * synchronization */typedef struct Lock Lock;struct Lock{#ifdef __MINGW32__ int init; MingwCritSect mutex;#endif#ifdef PLAN9PORT_USING_PTHREADS int init; pthread_mutex_t mutex;#endif int held;}; extern void lock(Lock*);extern void unlock(Lock*);extern int canlock(Lock*);extern int (*_lock)(Lock*, int, ulong);extern void (*_unlock)(Lock*, ulong); typedef struct QLock QLock;struct QLock{ Lock l; _Thread *owner; _Threadlist waiting;}; extern void qlock(QLock*);extern void qunlock(QLock*);extern int canqlock(QLock*);extern int (*_qlock)(QLock*, int, ulong); /* do not use */extern void (*_qunlock)(QLock*, ulong);Lines 1–500 of 955. Load more
/* * Lib9 is miscellany from the Plan 9 C library that doesn't * fit into libutf or into libfmt, but is still missing from traditional * Unix C libraries. */ #ifndef _LIBC_H_ #define _LIBC_H_ 1 #if defined(__cplusplus) extern "C" { #endif #include <utf.h> #include <fmt.h> /* * Begin usual libc.h */ #ifndef nil #define nil ((void*)0) #endif #define nelem(x) (sizeof(x)/sizeof((x)[0])) #ifndef offsetof #define offsetof(s, m) (ulong)(&(((s*)0)->m)) #endif /* * mem routines (provided by system <string.h>) * extern void* memccpy(void*, void*, int, ulong); extern void* memset(void*, int, ulong); extern int memcmp(void*, void*, ulong); extern void* memcpy(void*, void*, ulong); extern void* memmove(void*, void*, ulong); extern void* memchr(void*, int, ulong); */ /* * string routines (provided by system <string.h>) * extern char* strcat(char*, char*); extern char* strchr(char*, int); extern int strcmp(char*, char*); extern char* strcpy(char*, char*); */ extern char* strecpy(char*, char*, char*); extern char* p9strdup(char*); /* extern char* strncat(char*, char*, long); extern char* strncpy(char*, char*, long); extern int strncmp(char*, char*, long); extern char* strpbrk(char*, char*); extern char* strrchr(char*, int); extern char* strtok(char*, char*); extern long strlen(char*); extern long strspn(char*, char*); extern long strcspn(char*, char*); extern char* strstr(char*, char*); */ extern int cistrncmp(char*, char*, int); extern int cistrcmp(char*, char*); extern char* cistrstr(char*, char*); extern int tokenize(char*, char**, int); /* enum { UTFmax = 4, Runesync = 0x80, Runeself = 0x80, Runeerror = 0xFFFD, Runemax = 0x10FFFF, }; */ /* * rune routines (provided by <utf.h> * extern int runetochar(char*, Rune*); extern int chartorune(Rune*, char*); extern int runelen(long); extern int runenlen(Rune*, int); extern int fullrune(char*, int); extern int utflen(char*); extern int utfnlen(char*, long); extern char* utfrune(char*, long); extern char* utfrrune(char*, long); extern char* utfutf(char*, char*); extern char* utfecpy(char*, char*, char*); extern Rune* runestrcat(Rune*, Rune*); extern Rune* runestrchr(Rune*, Rune); extern int runestrcmp(Rune*, Rune*); extern Rune* runestrcpy(Rune*, Rune*); extern Rune* runestrncpy(Rune*, Rune*, long); extern Rune* runestrecpy(Rune*, Rune*, Rune*); extern Rune* runestrdup(Rune*); extern Rune* runestrncat(Rune*, Rune*, long); extern int runestrncmp(Rune*, Rune*, long); extern Rune* runestrrchr(Rune*, Rune); extern long runestrlen(Rune*); extern Rune* runestrstr(Rune*, Rune*); extern Rune tolowerrune(Rune); extern Rune totitlerune(Rune); extern Rune toupperrune(Rune); extern int isalpharune(Rune); extern int islowerrune(Rune); extern int isspacerune(Rune); extern int istitlerune(Rune); extern int isupperrune(Rune); */ /* * malloc (provied by system <stdlib.h>) * extern void* malloc(ulong); */ extern void* p9malloc(ulong); extern void* mallocz(ulong, int); extern void p9free(void*); extern void* p9calloc(ulong, ulong); extern void* p9realloc(void*, ulong); extern void setmalloctag(void*, ulong); extern void setrealloctag(void*, ulong); extern ulong getmalloctag(void*); extern ulong getrealloctag(void*); /* extern void* malloctopoolblock(void*); */ #ifndef NOPLAN9DEFINES #define malloc p9malloc #define realloc p9realloc #define calloc p9calloc #define free p9free #undef strdup #define strdup p9strdup #endif /* * print routines (provided by <fmt.h>) * typedef struct Fmt Fmt; struct Fmt{ uchar runes; void *start; void *to; void *stop; int (*flush)(Fmt *); void *farg; int nfmt; va_list args; int r; int width; int prec; ulong flags; }; enum{ FmtWidth = 1, FmtLeft = FmtWidth << 1, FmtPrec = FmtLeft << 1, FmtSharp = FmtPrec << 1, FmtSpace = FmtSharp << 1, FmtSign = FmtSpace << 1, FmtZero = FmtSign << 1, FmtUnsigned = FmtZero << 1, FmtShort = FmtUnsigned << 1, FmtLong = FmtShort << 1, FmtVLong = FmtLong << 1, FmtComma = FmtVLong << 1, FmtByte = FmtComma << 1, FmtFlag = FmtByte << 1 }; extern int print(char*, ...); extern char* seprint(char*, char*, char*, ...); extern char* vseprint(char*, char*, char*, va_list); extern int snprint(char*, int, char*, ...); extern int vsnprint(char*, int, char*, va_list); extern char* smprint(char*, ...); extern char* vsmprint(char*, va_list); extern int sprint(char*, char*, ...); extern int fprint(int, char*, ...); extern int vfprint(int, char*, va_list); extern int runesprint(Rune*, char*, ...); extern int runesnprint(Rune*, int, char*, ...); extern int runevsnprint(Rune*, int, char*, va_list); extern Rune* runeseprint(Rune*, Rune*, char*, ...); extern Rune* runevseprint(Rune*, Rune*, char*, va_list); extern Rune* runesmprint(char*, ...); extern Rune* runevsmprint(char*, va_list); extern int fmtfdinit(Fmt*, int, char*, int); extern int fmtfdflush(Fmt*); extern int fmtstrinit(Fmt*); extern char* fmtstrflush(Fmt*); extern int runefmtstrinit(Fmt*); extern Rune* runefmtstrflush(Fmt*); extern int fmtinstall(int, int (*)(Fmt*)); extern int dofmt(Fmt*, char*); extern int dorfmt(Fmt*, Rune*); extern int fmtprint(Fmt*, char*, ...); extern int fmtvprint(Fmt*, char*, va_list); extern int fmtrune(Fmt*, int); extern int fmtstrcpy(Fmt*, char*); extern int fmtrunestrcpy(Fmt*, Rune*); */ /* * error string for %r * supplied on per os basis, not part of fmt library * * (provided by lib9, but declared in fmt.h) * extern int errfmt(Fmt *f); */ /* * quoted strings */ extern char *unquotestrdup(char*); extern Rune *unquoterunestrdup(Rune*); extern char *quotestrdup(char*); extern Rune *quoterunestrdup(Rune*); /* * in fmt.h * extern void quotefmtinstall(void); extern int quotestrfmt(Fmt*); extern int quoterunestrfmt(Fmt*); */ #ifndef NOPLAN9DEFINES #define doquote fmtdoquote #endif extern int needsrcquote(int); /* * random number */ extern void p9srand(long); extern int p9rand(void); extern int p9nrand(int); extern long p9lrand(void); extern long p9lnrand(long); extern double p9frand(void); extern ulong truerand(void); /* uses /dev/random */ extern ulong ntruerand(ulong); /* uses /dev/random */ #ifndef NOPLAN9DEFINES #define srand p9srand #define rand p9rand #define nrand p9nrand #define lrand p9lrand #define lnrand p9lnrand #define frand p9frand #endif /* * math */ extern ulong getfcr(void); extern void setfsr(ulong); extern ulong getfsr(void); extern void setfcr(ulong); extern double NaN(void); extern double Inf(int); extern int isNaN(double); extern int isInf(double, int); extern ulong umuldiv(ulong, ulong, ulong); extern long muldiv(long, long, long); /* * provided by math.h * extern double pow(double, double); extern double atan2(double, double); extern double fabs(double); extern double atan(double); extern double log(double); extern double log10(double); extern double exp(double); extern double floor(double); extern double ceil(double); extern double hypot(double, double); extern double sin(double); extern double cos(double); extern double tan(double); extern double asin(double); extern double acos(double); extern double sinh(double); extern double cosh(double); extern double tanh(double); extern double sqrt(double); extern double fmod(double, double); #define HUGE 3.4028234e38 #define PIO2 1.570796326794896619231e0 #define PI (PIO2+PIO2) */ #define PI M_PI #define PIO2 M_PI_2 /* * Time-of-day */ typedef struct Tm { int sec; int min; int hour; int mday; int mon; int year; int wday; int yday; char zone[4]; int tzoff; } Tm; extern Tm* p9gmtime(long); extern Tm* p9localtime(long); extern char* p9asctime(Tm*); extern char* p9ctime(long); extern double p9cputime(void); extern long p9times(long*); extern long p9tm2sec(Tm*); extern vlong p9nsec(void); #ifndef NOPLAN9DEFINES #define gmtime p9gmtime #define localtime p9localtime #define asctime p9asctime #define ctime p9ctime #define cputime p9cputime #define times p9times #define tm2sec p9tm2sec #define nsec p9nsec #endif /* * one-of-a-kind */ enum { PNPROC = 1, PNGROUP = 2 }; /* extern int abs(int); <stdlib.h> */ extern int p9atexit(void(*)(void)); extern void p9atexitdont(void(*)(void)); extern int atnotify(int(*)(void*, char*), int); /* * <stdlib.h> extern double atof(char*); <stdlib.h> */ extern int p9atoi(char*); extern long p9atol(char*); extern vlong p9atoll(char*); extern double fmtcharstod(int(*)(void*), void*); extern char* cleanname(char*); extern int p9decrypt(void*, void*, int); extern int p9encrypt(void*, void*, int); extern int netcrypt(void*, void*); extern int dec64(uchar*, int, char*, int); extern int enc64(char*, int, uchar*, int); extern int dec32(uchar*, int, char*, int); extern int enc32(char*, int, uchar*, int); extern int dec16(uchar*, int, char*, int); extern int enc16(char*, int, uchar*, int); extern int encodefmt(Fmt*); extern int dirmodefmt(Fmt*); extern int exitcode(char*); extern void exits(char*); extern void p9exit(int); extern double frexp(double, int*); extern ulong getcallerpc(void*); extern char* p9getenv(char*); extern int p9putenv(char*, char*); extern int getfields(char*, char**, int, int, char*); extern int gettokens(char *, char **, int, char *); extern char* getuser(void); extern char* p9getwd(char*, int); extern int iounit(int); /* extern long labs(long); <math.h> */ /* extern double ldexp(double, int); <math.h> */ extern void p9longjmp(p9jmp_buf, int); extern char* mktemp(char*); extern int opentemp(char*, int); /* extern double modf(double, double*); <math.h> */ extern void p9notejmp(void*, p9jmp_buf, int); extern void perror(const char*); extern int postnote(int, int, char *); extern double p9pow10(int); /* extern int putenv(char*, char*); <stdlib.h. */ /* extern void qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */ extern char* searchpath(char*); /* extern int p9setjmp(p9jmp_buf); */ #define p9setjmp(b) sigsetjmp((void*)(b), 1) /* * <stdlib.h> extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int); extern vlong strtoll(char*, char**, int); extern uvlong strtoull(char*, char**, int); */ extern void sysfatal(char*, ...); extern void p9syslog(int, char*, char*, ...); extern long p9time(long*); /* extern int tolower(int); <ctype.h> */ /* extern int toupper(int); <ctype.h> */ extern void needstack(int); extern char* readcons(char*, char*, int); extern void (*_pin)(void); extern void (*_unpin)(void); #ifndef NOPLAN9DEFINES #define atexit p9atexit #define atexitdont p9atexitdont #define atoi p9atoi #define atol p9atol #define atoll p9atoll #define encrypt p9encrypt #ifndef NOEXITDEFINE # define exit p9exit #endif #define decrypt p9decrypt #define getenv p9getenv #define getwd p9getwd #define longjmp p9longjmp #undef setjmp #define setjmp p9setjmp #define putenv p9putenv #define notejmp p9notejmp #define jmp_buf p9jmp_buf #define time p9time #define pow10 p9pow10 #define strtod fmtstrtod #define charstod fmtcharstod #define syslog p9syslog #endif /* * just enough information so that libc can be * properly locked without dragging in all of libthread */ typedef struct _Thread _Thread; typedef struct _Threadlist _Threadlist; struct _Threadlist { _Thread *head; _Thread *tail; }; extern _Thread *(*threadnow)(void); /* * synchronization */ typedef struct Lock Lock; struct Lock { #ifdef __MINGW32__ int init; MingwCritSect mutex; #endif #ifdef PLAN9PORT_USING_PTHREADS int init; pthread_mutex_t mutex; #endif int held; }; extern void lock(Lock*); extern void unlock(Lock*); extern int canlock(Lock*); extern int (*_lock)(Lock*, int, ulong); extern void (*_unlock)(Lock*, ulong); typedef struct QLock QLock; struct QLock { Lock l; _Thread *owner; _Threadlist waiting; }; extern void qlock(QLock*); extern void qunlock(QLock*); extern int canqlock(QLock*); extern int (*_qlock)(QLock*, int, ulong); /* do not use */ extern void (*_qunlock)(QLock*, ulong);