]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/include/libc.h
libc: add encode(2) variants for custom alphabets
[plan9front.git] / sys / include / libc.h
index d6c49aaeacb4523caecb3a0e82e1420d4254430c..ecc23c3432a290aaff0b6689362d5ca8149ac64f 100644 (file)
@@ -41,10 +41,12 @@ extern      int     tokenize(char*, char**, int);
 
 enum
 {
-       UTFmax          = 3,            /* maximum bytes per rune */
+       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) */
 };
 
 /*
@@ -95,10 +97,10 @@ extern      ulong   msize(void*);
 extern void*   mallocalign(ulong, ulong, long, ulong);
 extern void*   calloc(ulong, ulong);
 extern void*   realloc(void*, ulong);
-extern void    setmalloctag(void*, ulong);
-extern void    setrealloctag(void*, ulong);
-extern ulong   getmalloctag(void*);
-extern ulong   getrealloctag(void*);
+extern void    setmalloctag(void*, uintptr);
+extern void    setrealloctag(void*, uintptr);
+extern uintptr getmalloctag(void*);
+extern uintptr getrealloctag(void*);
 extern void*   malloctopoolblock(void*);
 
 /*
@@ -177,16 +179,31 @@ extern    Rune*   runefmtstrflush(Fmt*);
 #pragma        varargck        argpos  sprint          2
 
 #pragma        varargck        type    "lld"   vlong
+#pragma        varargck        type    "llo"   vlong
 #pragma        varargck        type    "llx"   vlong
+#pragma        varargck        type    "llb"   vlong
 #pragma        varargck        type    "lld"   uvlong
+#pragma        varargck        type    "llo"   uvlong
 #pragma        varargck        type    "llx"   uvlong
+#pragma        varargck        type    "llb"   uvlong
 #pragma        varargck        type    "ld"    long
+#pragma        varargck        type    "lo"    long
 #pragma        varargck        type    "lx"    long
 #pragma        varargck        type    "lb"    long
 #pragma        varargck        type    "ld"    ulong
+#pragma        varargck        type    "lo"    ulong
 #pragma        varargck        type    "lx"    ulong
 #pragma        varargck        type    "lb"    ulong
+#pragma varargck       type    "zd"    intptr
+#pragma varargck       type    "zo"    intptr
+#pragma varargck       type    "zx"    intptr
+#pragma varargck       type    "zb"    intptr
+#pragma varargck       type    "zd"    uintptr
+#pragma varargck       type    "zo"    uintptr
+#pragma varargck       type    "zx"    uintptr
+#pragma varargck       type    "zb"    uintptr
 #pragma        varargck        type    "d"     int
+#pragma        varargck        type    "o"     int
 #pragma        varargck        type    "x"     int
 #pragma        varargck        type    "c"     int
 #pragma        varargck        type    "C"     int
@@ -297,22 +314,44 @@ extern    double  fmod(double, double);
 /*
  * Time-of-day
  */
+typedef struct Tzone Tzone;
+#pragma incomplete Tzone
+
 
 typedef
 struct Tm
 {
-       int     sec;
-       int     min;
-       int     hour;
-       int     mday;
-       int     mon;
-       int     year;
-       int     wday;
-       int     yday;
-       char    zone[4];
-       int     tzoff;
+       int     nsec;           /* nseconds (range 0...1e9) */
+       int     sec;            /* seconds (range 0..60) */
+       int     min;            /* minutes (0..59) */
+       int     hour;           /* hours (0..23) */
+       int     mday;           /* day of the month (1..31) */
+       int     mon;            /* month of the year (0..11) */
+       int     year;           /* year A.D. */
+       int     wday;           /* day of week (0..6, Sunday = 0) */
+       int     yday;           /* day of year (0..365) */
+       char    zone[16];       /* time zone name */
+       int     tzoff;          /* time zone delta from GMT */
+       Tzone   *tz;            /* time zone associated with this date */
 } Tm;
 
+typedef
+struct Tmfmt {
+       char    *fmt;
+       Tm      *tm;
+} Tmfmt;
+
+#pragma varargck       type    "τ"    Tmfmt
+
+extern Tzone*  tzload(char *name);
+extern Tm*     tmnow(Tm*, Tzone*);
+extern Tm*     tmtime(Tm*, vlong, Tzone*);
+extern Tm*     tmtimens(Tm*, vlong, int, Tzone*);
+extern Tm*     tmparse(Tm*, char*, char*, Tzone*, char **ep);
+extern vlong   tmnorm(Tm*);
+extern Tmfmt   tmfmt(Tm*, char*);
+extern void    tmfmtinstall(void);
+
 extern Tm*     gmtime(long);
 extern Tm*     localtime(long);
 extern char*   asctime(Tm*);
@@ -346,12 +385,24 @@ extern    double  charstod(int(*)(void*), void*);
 extern char*   cleanname(char*);
 extern int     decrypt(void*, void*, int);
 extern int     encrypt(void*, void*, int);
+
 extern int     dec64(uchar*, int, char*, int);
 extern int     enc64(char*, int, uchar*, int);
+extern int     dec64x(uchar*, int, char*, int, int (*)(int));
+extern int     enc64x(char*, int, uchar*, int, int (*)(int));
 extern int     dec32(uchar*, int, char*, int);
 extern int     enc32(char*, int, uchar*, int);
+extern int     dec32x(uchar*, int, char*, int, int (*)(int));
+extern int     enc32x(char*, int, uchar*, int, int (*)(int));
 extern int     dec16(uchar*, int, char*, int);
 extern int     enc16(char*, int, uchar*, int);
+extern int     dec64chr(int);
+extern int     enc64chr(int);
+extern int     dec32chr(int);
+extern int     enc32chr(int);
+extern int     dec16chr(int);
+extern int     enc16chr(int);
+
 extern int     encodefmt(Fmt*);
 extern void    exits(char*);
 extern double  frexp(double, int*);
@@ -418,8 +469,8 @@ typedef struct QLp QLp;
 struct QLp
 {
        int     inuse;
+       int     state;
        QLp     *next;
-       char    state;
 };
 
 typedef
@@ -465,7 +516,9 @@ extern      void    rsleep(Rendez*);        /* unlocks r->l, sleeps, locks r->l again */
 extern int     rwakeup(Rendez*);
 extern int     rwakeupall(Rendez*);
 extern void**  privalloc(void);
-extern void    privfree(void**);
+
+extern void    procsetname(char*, ...);
+#pragma varargck argpos procsetname 1
 
 /*
  *  network dialing
@@ -505,6 +558,9 @@ struct NetConnInfo
 extern NetConnInfo*    getnetconninfo(char*, int);
 extern void            freenetconninfo(NetConnInfo*);
 
+extern int     idn2utf(char*, char*, int);
+extern int     utf2idn(char*, char*, int);
+
 /*
  * system calls
  *
@@ -670,6 +726,7 @@ extern      int     semacquire(long*, int);
 extern long    semrelease(long*, long);
 extern int     sleep(long);
 extern int     stat(char*, uchar*, int);
+extern int     tsemacquire(long*, ulong);
 extern Waitmsg*        wait(void);
 extern int     waitpid(void);
 extern long    write(int, void*, long);
@@ -691,6 +748,9 @@ extern      char*   sysname(void);
 extern void    werrstr(char*, ...);
 #pragma        varargck        argpos  werrstr 1
 
+extern long    ainc(long*);
+extern long    adec(long*);
+
 extern char *argv0;
 #define        ARGBEGIN        for((argv0||(argv0=*argv)),argv++,argc--;\
                            argv[0] && argv[0][0]=='-' && argv[0][1];\