Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* avoid name conflicts */
#define accept  pm_accept
#define listen  pm_listen
#define sleep   ksleep
#define wakeup  kwakeup
#ifdef strtod
#undef strtod
#endif
#define strtod          fmtstrtod

/* conflicts on some os's */
#define encrypt libencrypt
#define decrypt libdecrypt
#define oserror liboserror
#define clone   libclone
#define atexit  libatexit
#define log2    liblog2
#define log     liblog
#define reboot  libreboot
#define strtoll libstrtoll
#undef timeradd
#define timeradd        xtimeradd


#define nil     ((void*)0)

typedef unsigned char   p9_uchar;
typedef unsigned int    p9_uint;
typedef unsigned int    p9_ulong;
typedef int             p9_long;
typedef signed char     p9_schar;
typedef unsigned short  p9_ushort;
typedef unsigned int    Rune;
typedef unsigned int    p9_u32int;
typedef p9_u32int mpdigit;

/* make sure we don't conflict with predefined types */
#define schar   p9_schar
#define uchar   p9_uchar
#define ushort  p9_ushort
#define uint    p9_uint
#define u32int  p9_u32int

/* #define long int rather than p9_long so that "unsigned long" is valid */
#define long    int
#define ulong   p9_ulong
#define vlong   p9_vlong
#define uvlong  p9_uvlong

#define nelem(x)        (sizeof(x)/sizeof((x)[0]))
#define SET(x)          ((x)=0)
#define USED(x)         if(x);else

enum
{
        UTFmax          = 4,            /* maximum bytes per rune */
        Runesync        = 0x80,         /* cannot represent part of a UTF sequence (<) */
        Runeself        = 0x80,         /* rune and UTF sequences are the same (<) */
        Runeerror       = 0xFFFD,       /* decoding error in UTF */
        Runemax         = 0x10FFFF,     /* 21-bit rune */
        Runemask        = 0x1FFFFF,     /* bits used by runes (see grep) */
};

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

extern  int     wstrtoutf(char*, Rune*, int);
extern  int     wstrutflen(Rune*);

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

/*
 * Syscall data structures
 */
#define MORDER  0x0003  /* mask for bits defining order of mounting */
#define MREPL   0x0000  /* mount replaces object */
#define MBEFORE 0x0001  /* mount goes before others in union directory */
#define MAFTER  0x0002  /* mount goes after others in union directory */
#define MCREATE 0x0004  /* permit creation in mounted directory */
#define MCACHE  0x0010  /* cache some data */
#define MMASK   0x0017  /* all bits on */

#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 */
#define OEXCL   0x1000  /* or'ed in, exclusive create */

#define NCONT   0        /* continue after note */
#define NDFLT   1       /* terminate after note */
#define NSAVE   2       /* clear note but hold state */
#define NRSTR   3       /* restore saved state */

#define ERRMAX                  128     /* max length of error string */
#define KNAMELEN                28      /* max length of name held in kernel */

/* bits in Qid.type */
#define QTDIR           0x80            /* type bit for directories */
#define QTAPPEND        0x40            /* type bit for append only files */
#define QTEXCL          0x20            /* type bit for exclusive use files */
#define QTMOUNT         0x10            /* type bit for mounted channel */
#define QTAUTH          0x08            /* type bit for authentication file */
#define QTFILE          0x00            /* plain file */

/* bits in Dir.mode */
#define DMDIR           0x80000000      /* mode bit for directories */
#define DMAPPEND                0x40000000      /* mode bit for append only files */
#define DMEXCL          0x20000000      /* mode bit for exclusive use files */
#define DMMOUNT         0x10000000      /* mode bit for mounted channel */
#define DMAUTH          0x08000000      /* mode bit for authentication files */
#define DMREAD          0x4             /* mode bit for read permission */
#define DMWRITE         0x2             /* mode bit for write permission */
#define DMEXEC          0x1             /* mode bit for execute permission */

typedef struct Lock
{
#ifdef PTHREAD
        int init;
        pthread_mutex_t mutex;
#else
        long    key;
#endif
} Lock;

typedef struct QLock
{
        Lock    lk;
        struct Proc     *hold;
        struct Proc     *first;
        struct Proc     *last;
} QLock;

typedef
struct Qid
{
        uvlong  path;
        ulong   vers;
        uchar   type;
} Qid;

typedef
struct Dir {
        /* system-modified data */
        ushort  type;   /* server type */
        uint    dev;    /* server subtype */
        /* file data */
        Qid     qid;    /* unique id from server */
        ulong   mode;   /* permissions */
        ulong   atime;  /* last read time */
        ulong   mtime;  /* last write time */
        vlong   length; /* file length */
        char    *name;  /* last element of path */
        char    *uid;   /* owner name */
        char    *gid;   /* group name */
        char    *muid;  /* last modifier name */
} Dir;

typedef
struct Waitmsg
{
        int pid;        /* of loved one */
        ulong time[3];  /* of loved one & descendants */
        char    *msg;
} Waitmsg;

/*
 * print routines
 */
typedef struct Fmt      Fmt;
struct Fmt{
        uchar   runes;                  /* output buffer is runes or chars? */
        void    *start;                 /* of buffer */
        void    *to;                    /* current place in the buffer */
        void    *stop;                  /* end of the buffer; overwritten if flush fails */
        int     (*flush)(Fmt *);        /* called when to == stop */
        void    *farg;                  /* to make flush a closure */
        int     nfmt;                   /* num chars formatted so far */
        va_list args;                   /* args passed to dofmt */
        int     r;                      /* % format Rune */
        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,
        FmtLDouble      = FmtFlag << 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     (*doquote)(int);
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       Rune*      runestrchr(Rune*, Rune);
extern       long       runestrlen(Rune*);
extern       Rune*      runestrstr(Rune*, Rune*);

extern  int     fmtfdinit(Fmt*, int, char*, int);
extern  int     fmtfdflush(Fmt*);
extern  int     fmtstrinit(Fmt*);
extern  int     fmtinstall(int, int (*)(Fmt*));
extern  char*   fmtstrflush(Fmt*);
extern  int     runefmtstrinit(Fmt*);
extern  Rune*   runefmtstrflush(Fmt*);
extern  int     encodefmt(Fmt*);
extern  int     fmtstrcpy(Fmt*, char*);
extern  int     fmtprint(Fmt*, char*, ...);
extern  int     fmtvprint(Fmt*, char*, va_list);
extern  void*   mallocz(ulong, int);

extern  uintptr getcallerpc(void*);
extern  char*   cleanname(char*);
extern  void    sysfatal(char*, ...);
extern  char*   strecpy(char*, char*, char*);

extern  int     tokenize(char*, char**, int);
extern  int     getfields(char*, char**, int, int, char*);
extern  char*   utfecpy(char*, char*, char*);
extern  long    tas(long*);
extern  void    quotefmtinstall(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     enc16(char*, int, uchar*, int);
void            hnputs(void *p, unsigned short v);
extern  int     dofmt(Fmt*, char*);
extern  double  __NaN(void);
extern  int     __isNaN(double);
extern  double  strtod(const char*, char**);
extern  int     utfnlen(char*, long);
extern  double  __Inf(int);
extern  int     __isInf(double, int);

extern int (*fmtdoquote)(int);