+++ /dev/null
-The header files under this directory are strictly internal to the gc
-toolchain, so please don't copy them to the system include file
-directory (/usr/include, /usr/local/include, etc.)
-
-Also note that they must be kept as is in $GOROOT/include, or cmd/dist
-will malfunction.
+++ /dev/null
-// Inferno utils/include/ar.h
-// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-enum {
- SARMAG = 8,
- SARNAME = 16,
- SAR_HDR = 16+44,
-};
-
-#define ARMAG "!<arch>\n"
-#define ARFMAG "`\n"
-/*c2go
-char ARMAG[] = "!<arch>\n";
-char ARFMAG[] = "`\n";
-*/
-
-typedef struct ArHdr ArHdr;
-struct ArHdr
-{
- char name[SARNAME];
- char date[12];
- char uid[6];
- char gid[6];
- char mode[8];
- char size[10];
- char fmag[2];
-};
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/include/bio.h
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef _BIO_H_
-#define _BIO_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifdef AUTOLIB
-AUTOLIB(bio)
-#endif
-
-typedef struct Biobuf Biobuf;
-
-enum
-{
- Bsize = 8*1024,
- Bungetsize = 4, /* space for ungetc */
- Bmagic = 0x314159,
- Beof = -1,
- Bbad = -2,
-
- Binactive = 0, /* states */
- Bractive,
- Bwactive,
- Bracteof,
-
- Bend
-};
-
-struct Biobuf
-{
- int icount; /* neg num of bytes at eob */
- int ocount; /* num of bytes at bob */
- int rdline; /* num of bytes after rdline */
- int runesize; /* num of bytes of last getrune */
- int state; /* r/w/inactive */
- int fid; /* open file */
- int flag; /* magic if malloc'ed */
- vlong offset; /* offset of buffer in file */
- int bsize; /* size of buffer */
- unsigned char* bbuf; /* pointer to beginning of buffer */
- unsigned char* ebuf; /* pointer to end of buffer */
- unsigned char* gbuf; /* pointer to good data in buf */
- unsigned char b[Bungetsize+Bsize];
-};
-
-/*
- * These macros get 1-, 2-, and 4-byte integer values by reading the
- * next few bytes in little-endian order.
- */
-#define BGETC(bp)\
- ((bp)->icount?(int)((bp)->ebuf[(bp)->icount++]):Bgetc((bp)))
-#define BGETLE2(bp)\
- ((bp)->icount<=-2?((bp)->icount+=2,((bp)->ebuf[(bp)->icount-2])|((bp)->ebuf[(bp)->icount-1]<<8)):Bgetle2((bp)))
-#define BGETLE4(bp)\
- (int)((bp)->icount<=-4?((bp)->icount+=4,((bp)->ebuf[(bp)->icount-4])|((bp)->ebuf[(bp)->icount-3]<<8)|((bp)->ebuf[(bp)->icount-2]<<16)|((uint32)(bp)->ebuf[(bp)->icount-1]<<24)):Bgetle4((bp)))
-
-/*
- * These macros put 1-, 2-, and 4-byte integer values by writing the
- * next few bytes in little-endian order.
- */
-#define BPUTC(bp,c)\
- ((bp)->ocount?(bp)->ebuf[(bp)->ocount++]=(unsigned char)(c),0:Bputc((bp),(c)))
-#define BPUTLE2(bp,c)\
- ((bp)->ocount<=-2?(bp)->ocount+=2,(bp)->ebuf[(bp)->ocount-2]=(unsigned char)(c),(bp)->ebuf[(bp)->ocount-1]=(unsigned char)(c>>8),0:Bputle2((bp),(c)))
-#define BPUTLE4(bp,c)\
- ((bp)->ocount<=-4?(bp)->ocount+=4,(bp)->ebuf[(bp)->ocount-4]=(unsigned char)(c),(bp)->ebuf[(bp)->ocount-3]=(unsigned char)(c>>8),(bp)->ebuf[(bp)->ocount-2]=(unsigned char)(c>>16),(bp)->ebuf[(bp)->ocount-1]=(unsigned char)(c>>24),0:Bputle4((bp),(c)))
-
-#define BOFFSET(bp)\
- (((bp)->state==Bractive)?\
- (bp)->offset + (bp)->icount:\
- (((bp)->state==Bwactive)?\
- (bp)->offset + ((bp)->bsize + (bp)->ocount):\
- -1))
-#define BLINELEN(bp)\
- (bp)->rdline
-#define BFILDES(bp)\
- (bp)->fid
-
-int Bbuffered(Biobuf*);
-Biobuf* Bfdopen(int, int);
-int Bfildes(Biobuf*);
-int Bflush(Biobuf*);
-int Bgetc(Biobuf*);
-int Bgetle2(Biobuf*);
-int Bgetle4(Biobuf*);
-int Bgetd(Biobuf*, double*);
-long Bgetrune(Biobuf*);
-int Binit(Biobuf*, int, int);
-int Binits(Biobuf*, int, int, unsigned char*, int);
-int Blinelen(Biobuf*);
-vlong Boffset(Biobuf*);
-Biobuf* Bopen(char*, int);
-int Bprint(Biobuf*, char*, ...);
-int Bputc(Biobuf*, int);
-int Bputle2(Biobuf*, int);
-int Bputle4(Biobuf*, int);
-int Bputrune(Biobuf*, long);
-void* Brdline(Biobuf*, int);
-char* Brdstr(Biobuf*, int, int);
-long Bread(Biobuf*, void*, long);
-vlong Bseek(Biobuf*, vlong, int);
-int Bterm(Biobuf*);
-int Bungetc(Biobuf*);
-int Bungetrune(Biobuf*);
-long Bwrite(Biobuf*, void*, long);
-int Bvprint(Biobuf*, char*, va_list);
-/*c2go
-int BGETC(Biobuf*);
-int BGETLE2(Biobuf*);
-int BGETLE4(Biobuf*);
-int BPUTC(Biobuf*, int);
-int BPUTLE2(Biobuf*, int);
-int BPUTLE4(Biobuf*, int);
-*/
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
+++ /dev/null
-#ifndef _FMT_H_
-#define _FMT_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <stdarg.h>
-#include <utf.h>
-
-typedef struct Fmt Fmt;
-struct Fmt{
- unsigned char 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 */
- Rune r; /* % format Rune */
- int width;
- int prec;
- unsigned long flags;
- char *decimal; /* decimal point; cannot be "" */
-
- /* For %'d */
- char *thousands; /* separator for thousands */
-
- /*
- * Each char is an integer indicating #digits before next separator. Values:
- * \xFF: no more grouping (or \x7F; defined to be CHAR_MAX in POSIX)
- * \x00: repeat previous indefinitely
- * \x**: count that many
- */
- char *grouping; /* descriptor of separator placement */
-};
-
-enum{
- FmtWidth = 1,
- FmtLeft = FmtWidth << 1,
- FmtPrec = FmtLeft << 1,
- FmtSharp = FmtPrec << 1,
- FmtSpace = FmtSharp << 1,
- FmtSign = FmtSpace << 1,
- FmtApost = FmtSign << 1,
- FmtZero = FmtApost << 1,
- FmtUnsigned = FmtZero << 1,
- FmtShort = FmtUnsigned << 1,
- FmtLong = FmtShort << 1,
- FmtVLong = FmtLong << 1,
- FmtComma = FmtVLong << 1,
- FmtByte = FmtComma << 1,
- FmtLDouble = FmtByte << 1,
-
- FmtFlag = FmtLDouble << 1
-};
-
-extern int (*fmtdoquote)(int);
-
-/* Edit .+1,/^$/ | cfn $PLAN9/src/lib9/fmt/?*.c | grep -v static |grep -v __ */
-int dofmt(Fmt *f, char *fmt);
-int dorfmt(Fmt *f, const Rune *fmt);
-double fmtcharstod(int(*f)(void*), void *vp);
-int fmtfdflush(Fmt *f);
-int fmtfdinit(Fmt *f, int fd, char *buf, int size);
-int fmtinstall(int c, int (*f)(Fmt*));
-int fmtnullinit(Fmt*);
-void fmtlocaleinit(Fmt*, char*, char*, char*);
-int fmtprint(Fmt *f, char *fmt, ...);
-int fmtrune(Fmt *f, int r);
-int fmtrunestrcpy(Fmt *f, Rune *s);
-int fmtstrcpy(Fmt *f, char *s);
-char* fmtstrflush(Fmt *f);
-int fmtstrinit(Fmt *f);
-double fmtstrtod(const char *as, char **aas);
-int fmtvprint(Fmt *f, char *fmt, va_list args);
-int fprint(int fd, char *fmt, ...);
-int print(char *fmt, ...);
-void quotefmtinstall(void);
-int quoterunestrfmt(Fmt *f);
-int quotestrfmt(Fmt *f);
-Rune* runefmtstrflush(Fmt *f);
-int runefmtstrinit(Fmt *f);
-Rune* runeseprint(Rune *buf, Rune *e, char *fmt, ...);
-Rune* runesmprint(char *fmt, ...);
-int runesnprint(Rune *buf, int len, char *fmt, ...);
-int runesprint(Rune *buf, char *fmt, ...);
-Rune* runevseprint(Rune *buf, Rune *e, char *fmt, va_list args);
-Rune* runevsmprint(char *fmt, va_list args);
-int runevsnprint(Rune *buf, int len, char *fmt, va_list args);
-char* seprint(char *buf, char *e, char *fmt, ...);
-char* smprint(char *fmt, ...);
-int snprint(char *buf, int len, char *fmt, ...);
-int sprint(char *buf, char *fmt, ...);
-int vfprint(int fd, char *fmt, va_list args);
-char* vseprint(char *buf, char *e, char *fmt, va_list args);
-char* vsmprint(char *fmt, va_list args);
-int vsnprint(char *buf, int len, char *fmt, va_list args);
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
+++ /dev/null
-/*
-Derived from Inferno include/kern.h and
-Plan 9 from User Space include/libc.h
-
-http://code.google.com/p/inferno-os/source/browse/include/kern.h
-http://code.swtch.com/plan9port/src/tip/include/libc.h
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
- Portions Copyright © 2001-2007 Russ Cox. All rights reserved.
- Portions Copyright © 2009 The Go Authors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * 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 trimmed down 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
-
-extern char* strecpy(char*, char*, char*);
-extern int tokenize(char*, char**, int);
-
-extern double p9cputime(void);
-#ifndef NOPLAN9DEFINES
-#define cputime p9cputime
-#endif
-/*
- * one-of-a-kind
- */
-enum
-{
- PNPROC = 1,
- PNGROUP = 2
-};
-int isInf(double, int);
-
-extern int p9atoi(char*);
-extern long p9atol(char*);
-extern vlong p9atoll(char*);
-extern double fmtcharstod(int(*)(void*), void*);
-extern char* cleanname(char*);
-extern int exitcode(char*);
-extern void exits(char*);
-extern double frexp(double, int*);
-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* p9getwd(char*, int);
-extern void p9longjmp(p9jmp_buf, int);
-extern void p9notejmp(void*, p9jmp_buf, int);
-extern void perror(const char*);
-extern int postnote(int, int, char *);
-extern double p9pow10(int);
-extern char* p9ctime(long);
-#define p9setjmp(b) sigsetjmp((void*)(b), 1)
-
-extern void sysfatal(char*, ...);
-
-#ifndef NOPLAN9DEFINES
-#define atoi p9atoi
-#define atol p9atol
-#define atoll p9atoll
-#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 pow10 p9pow10
-#undef strtod
-#define strtod fmtstrtod
-#define charstod fmtcharstod
-#define ctime p9ctime
-#endif
-
-/*
- * system calls
- *
- */
-#define STATMAX 65535U /* max length of machine-independent stat structure */
-#define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */
-#define ERRMAX 128 /* max length of error string */
-
-#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 ORCLOSE 64 /* or'ed in, remove on close */
-#define ODIRECT 128 /* or'ed in, direct access */
-#define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */
-#define OAPPEND 0x4000 /* or'ed in, append only */
-
-#define AEXIST 0 /* accessible: exists */
-#define AEXEC 1 /* execute access */
-#define AWRITE 2 /* write access */
-#define AREAD 4 /* read access */
-
-/* Segattch */
-#define SG_RONLY 0040 /* read only */
-#define SG_CEXEC 0100 /* detach on exec */
-
-#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 */
-
-/* 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 QTTMP 0x04 /* type bit for non-backed-up file */
-#define QTSYMLINK 0x02 /* type bit for symbolic link */
-#define QTFILE 0x00 /* type bits for 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 file */
-#define DMTMP 0x04000000 /* mode bit for non-backed-up file */
-#define DMSYMLINK 0x02000000 /* mode bit for symbolic link (Unix, 9P2000.u) */
-#define DMDEVICE 0x00800000 /* mode bit for device file (Unix, 9P2000.u) */
-#define DMNAMEDPIPE 0x00200000 /* mode bit for named pipe (Unix, 9P2000.u) */
-#define DMSOCKET 0x00100000 /* mode bit for socket (Unix, 9P2000.u) */
-#define DMSETUID 0x00080000 /* mode bit for setuid (Unix, 9P2000.u) */
-#define DMSETGID 0x00040000 /* mode bit for setgid (Unix, 9P2000.u) */
-
-#define DMREAD 0x4 /* mode bit for read permission */
-#define DMWRITE 0x2 /* mode bit for write permission */
-#define DMEXEC 0x1 /* mode bit for execute permission */
-
-#ifdef RFMEM /* FreeBSD, OpenBSD, NetBSD */
-#undef RFFDG
-#undef RFNOTEG
-#undef RFPROC
-#undef RFMEM
-#undef RFNOWAIT
-#undef RFCFDG
-#undef RFNAMEG
-#undef RFENVG
-#undef RFCENVG
-#undef RFCFDG
-#undef RFCNAMEG
-#endif
-
-enum
-{
- RFNAMEG = (1<<0),
- RFENVG = (1<<1),
- RFFDG = (1<<2),
- RFNOTEG = (1<<3),
- RFPROC = (1<<4),
- RFMEM = (1<<5),
- RFNOWAIT = (1<<6),
- RFCNAMEG = (1<<10),
- RFCENVG = (1<<11),
- RFCFDG = (1<<12)
-/* RFREND = (1<<13), */
-/* RFNOMNT = (1<<14) */
-};
-
-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 */
-
- /* 9P2000.u extensions */
- uint uidnum; /* numeric uid */
- uint gidnum; /* numeric gid */
- uint muidnum; /* numeric muid */
- char *ext; /* extended info */
-} Dir;
-
-typedef
-struct Waitmsg
-{
- int pid; /* of loved one */
- ulong time[3]; /* of loved one & descendants */
- char *msg;
-} Waitmsg;
-
-extern void _exits(char*);
-
-extern void abort(void);
-extern long p9alarm(ulong);
-extern int await(char*, int);
-extern int awaitfor(int, char*, int);
-extern int awaitnohang(char*, int);
-extern int p9chdir(char*);
-extern int close(int);
-extern int p9create(char*, int, ulong);
-extern int p9dup(int, int);
-extern int errstr(char*, uint);
-extern int p9exec(char*, char*[]);
-extern int p9execl(char*, ...);
-extern int p9rfork(int);
-extern int noted(int);
-extern int notify(void(*)(void*, char*));
-extern int noteenable(char*);
-extern int notedisable(char*);
-extern int notifyon(char*);
-extern int notifyoff(char*);
-extern int p9open(char*, int);
-extern int fd2path(int, char*, int);
-extern long readn(int, void*, long);
-extern int remove(const char*);
-extern vlong p9seek(int, vlong, int);
-extern int p9sleep(long);
-extern Waitmsg* p9wait(void);
-extern Waitmsg* p9waitfor(int);
-extern Waitmsg* waitnohang(void);
-extern int p9waitpid(void);
-extern ulong rendezvous(ulong, ulong);
-
-extern char* getgoos(void);
-extern char* getgoarch(void);
-extern char* getgoroot(void);
-extern char* getgoversion(void);
-extern char* getgoarm(void);
-extern char* getgo386(void);
-extern char* getgoextlinkenabled(void);
-extern char* getgohostos(void);
-extern char* getgohostarch(void);
-
-extern char* mktempdir(void);
-extern void removeall(char*);
-extern int runcmd(char**);
-
-extern void flagcount(char*, char*, int*);
-extern void flagint32(char*, char*, int32*);
-extern void flagint64(char*, char*, int64*);
-extern void flagstr(char*, char*, char**);
-extern void flagparse(int*, char***, void (*usage)(void));
-extern void flagfn0(char*, char*, void(*fn)(void));
-extern void flagfn1(char*, char*, void(*fn)(char*));
-extern void flagfn2(char*, char*, void(*fn)(char*, char*));
-extern void flagprint(int);
-
-#ifdef _WIN32
-
-#if !defined(_WIN64) && !defined(__MINGW64_VERSION_MAJOR)
-#define execv(prog, argv) execv(prog, (const char* const*)(argv))
-#define execvp(prog, argv) execvp(prog, (const char**)(argv))
-#endif
-
-#undef getwd
-#define getwd(s, ns) getcwd(s, ns)
-#undef lseek
-#define lseek(fd, n, base) _lseeki64(fd, n, base)
-#define mkdir(path, perm) mkdir(path)
-#else
-#define O_BINARY 0
-#endif
-
-#ifndef NOPLAN9DEFINES
-#define alarm p9alarm
-#define dup p9dup
-#define exec p9exec
-#define execl p9execl
-#define seek p9seek
-#define sleep p9sleep
-#define wait p9wait
-#define waitpid p9waitpid
-#define rfork p9rfork
-#define create p9create
-#undef open
-#define open p9open
-#define waitfor p9waitfor
-#endif
-
-extern Dir* dirstat(char*);
-extern Dir* dirfstat(int);
-extern int dirwstat(char*, Dir*);
-extern int dirfwstat(int, Dir*);
-extern void nulldir(Dir*);
-extern long dirreadall(int, Dir**);
-extern void rerrstr(char*, uint);
-extern char* sysname(void);
-extern void werrstr(char*, ...);
-extern char* getns(void);
-extern char* get9root(void);
-extern char* unsharp(char*);
-
-/* external names that we don't want to step on */
-#ifndef NOPLAN9DEFINES
-#define main p9main
-#endif
-
-/* compiler directives on plan 9 */
-#define SET(x) ((x)=0)
-#define USED(x) if(x){}else{}
-#ifdef __GNUC__
-# if __GNUC__ >= 3
-# undef USED
-# define USED(x) ((void)(x))
-# endif
-#endif
-
-/* command line */
-extern char *argv0;
-extern void __fixargv0(void);
-#define ARGBEGIN for((void)(argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
- argv[0] && argv[0][0]=='-' && argv[0][1];\
- argc--, argv++) {\
- char *_args, *_argt;\
- Rune _argc;\
- _args = &argv[0][1];\
- if(_args[0]=='-' && _args[1]==0){\
- argc--; argv++; break;\
- }\
- _argc = 0;\
- while(*_args && (_args += chartorune(&_argc, _args)))\
- switch(_argc)
-#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
-#define ARGF() (_argt=_args, _args="",\
- (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
-#define EARGF(x) (_argt=_args, _args="",\
- (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
-
-#define ARGC() _argc
-
-#if defined(__cplusplus)
-}
-#endif
-#endif /* _LIB9_H_ */
+++ /dev/null
-// Derived from Inferno utils/6l/l.h and related files.
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-typedef struct LSym LSym;
-typedef struct Reloc Reloc;
-typedef struct Auto Auto;
-typedef struct Link Link;
-typedef struct LinkArch LinkArch;
-typedef struct Library Library;
-
-typedef struct Pcln Pcln;
-typedef struct Pcdata Pcdata;
-typedef struct Pciter Pciter;
-
-struct Reloc
-{
- int32 off;
- uchar siz;
- uchar done;
- int32 type;
- int32 variant; // RV_*: variant on computed value
- int64 add;
- int64 xadd;
- LSym* sym;
- LSym* xsym;
-};
-
-struct LSym
-{
- char* name;
- char* extname; // name used in external object files
- short type;
- short version;
- uchar dupok;
- uchar cfunc;
- uchar external;
- uchar nosplit;
- uchar reachable;
- uchar cgoexport;
- uchar special;
- uchar stkcheck;
- uchar hide;
- uchar leaf; // arm only
- uchar localentry; // ppc64: instrs between global & local entry
- uchar onlist; // on the textp or datap lists
- int32 dynid;
- int32 sig;
- int32 plt;
- int32 got;
- int32 align; // if non-zero, required alignment in bytes
- int32 elfsym;
- int32 args; // size of stack frame incoming arguments area
- int32 locals; // size of stack frame locals area (arm only?)
- vlong value;
- vlong size;
- LSym* hash; // in hash table
- LSym* allsym; // in all symbol list
- LSym* next; // in text or data list
- LSym* sub; // in SSUB list
- LSym* outer; // container of sub
- LSym* gotype;
- LSym* reachparent;
- LSym* queue;
- char* file;
- char* dynimplib;
- char* dynimpvers;
- void* sect;
-
- // STEXT
- Auto* autom;
- Pcln* pcln;
-
- // SDATA, SBSS
- uchar* p;
- int np;
- int32 maxp;
- Reloc* r;
- int32 nr;
- int32 maxr;
-};
-
-// LSym.type
-enum
-{
- Sxxx,
-
- /* order here is order in output file */
- /* readonly, executable */
- STEXT,
- SELFRXSECT,
-
- /* readonly, non-executable */
- STYPE,
- SSTRING,
- SGOSTRING,
- SGOFUNC,
- SRODATA,
- SFUNCTAB,
- STYPELINK,
- SSYMTAB, // TODO: move to unmapped section
- SPCLNTAB,
- SELFROSECT,
-
- /* writable, non-executable */
- SMACHOPLT,
- SELFSECT,
- SMACHO, /* Mach-O __nl_symbol_ptr */
- SMACHOGOT,
- SWINDOWS,
- SELFGOT, /* also .toc in ppc64 ABI */
- SNOPTRDATA,
- SINITARR,
- SDATA,
- SBSS,
- SNOPTRBSS,
- STLSBSS,
-
- /* not mapped */
- SXREF,
- SMACHOSYMSTR,
- SMACHOSYMTAB,
- SMACHOINDIRECTPLT,
- SMACHOINDIRECTGOT,
- SFILE,
- SFILEPATH,
- SCONST,
- SDYNIMPORT,
- SHOSTOBJ,
-
- SSUB = 1<<8, /* sub-symbol, linked from parent via ->sub list */
- SMASK = SSUB - 1,
- SHIDDEN = 1<<9, // hidden or local symbol
-};
-
-// Reloc.type
-enum
-{
- R_ADDR = 1,
- R_ADDRPOWER, // relocation for loading 31-bit address using addis and addi/ld/st for Power
- R_SIZE,
- R_CALL, // relocation for direct PC-relative call
- R_CALLARM, // relocation for ARM direct call
- R_CALLIND, // marker for indirect call (no actual relocating necessary)
- R_CALLPOWER, // relocation for Power direct call
- R_CONST,
- R_PCREL,
- R_TLS,
- R_TLS_LE, // TLS local exec offset from TLS segment register
- R_TLS_IE, // TLS initial exec offset from TLS base pointer
- R_GOTOFF,
- R_PLT0,
- R_PLT1,
- R_PLT2,
- R_USEFIELD,
- R_POWER_TOC, // ELF R_PPC64_TOC16*
-};
-
-// Reloc.variant
-enum
-{
- RV_NONE, // identity variant
- RV_POWER_LO, // x & 0xFFFF
- RV_POWER_HI, // x >> 16
- RV_POWER_HA, // (x + 0x8000) >> 16
- RV_POWER_DS, // x & 0xFFFC, check x&0x3 == 0
-
- RV_CHECK_OVERFLOW = 1<<8, // check overflow flag
- RV_TYPE_MASK = (RV_CHECK_OVERFLOW - 1),
-};
-
-// Auto.name
-enum
-{
- A_AUTO = 1,
- A_PARAM,
-};
-
-struct Auto
-{
- LSym* asym;
- Auto* link;
- int32 aoffset;
- int16 name;
- LSym* gotype;
-};
-
-enum
-{
- LINKHASH = 100003,
-};
-
-struct Library
-{
- char *objref; // object where we found the reference
- char *srcref; // src file where we found the reference
- char *file; // object file
- char *pkg; // import path
-};
-
-struct Pcdata
-{
- uchar *p;
- int n;
- int m;
-};
-
-struct Pcln
-{
- Pcdata pcsp;
- Pcdata pcfile;
- Pcdata pcline;
- Pcdata *pcdata;
- int npcdata;
- LSym **funcdata;
- int64 *funcdataoff;
- int nfuncdata;
-
- LSym **file;
- int nfile;
- int mfile;
-
- LSym *lastfile;
- int lastindex;
-};
-
-// Pcdata iterator.
-// for(pciterinit(ctxt, &it, &pcd); !it.done; pciternext(&it)) { it.value holds in [it.pc, it.nextpc) }
-struct Pciter
-{
- Pcdata d;
- uchar *p;
- uint32 pc;
- uint32 nextpc;
- uint32 pcscale;
- int32 value;
- int start;
- int done;
-};
-
-void pciterinit(Link*, Pciter*, Pcdata*);
-void pciternext(Pciter*);
-
-// symbol version, incremented each time a file is loaded.
-// version==1 is reserved for savehist.
-enum
-{
- HistVersion = 1,
-};
-
-// Link holds the context for writing object code from a compiler
-// to be linker input or for reading that input into the linker.
-struct Link
-{
- int32 thechar; // '5' (arm), '6' (amd64), etc.
- char* thestring; // full name of architecture ("arm", "amd64", ..)
- int32 goarm; // for arm only, GOARM setting
- int headtype;
-
- LinkArch* arch;
- int32 debugasm; // -S flag in compiler
- int32 debugvlog; // -v flag in linker
- Biobuf* bso; // for -v flag
- int32 windows;
- char* goroot;
-
- // hash table of all symbols
- LSym* hash[LINKHASH];
- LSym* allsym;
- int32 nsymbol;
-
- // code generation
- LSym* tlsg;
-
- // for reading input files (during linker)
- char** libdir;
- int32 nlibdir;
- int32 maxlibdir;
- Library* library;
- int libraryp;
- int nlibrary;
- int tlsoffset;
- void (*diag)(char*, ...);
- LSym* cursym;
- int version;
- LSym* textp;
- LSym* etextp;
- int32 nhistfile;
- LSym* filesyms;
-};
-
-enum {
- LittleEndian = 0x04030201,
- BigEndian = 0x01020304,
-};
-
-// LinkArch is the definition of a single architecture.
-struct LinkArch
-{
- char* name; // "arm", "amd64", and so on
- int thechar; // '5', '6', and so on
- int32 endian; // LittleEndian or BigEndian
-
- int minlc;
- int ptrsize;
- int regsize;
-};
-
-/* executable header types */
-enum {
- Hunknown = 0,
- Hdarwin,
- Hdragonfly,
- Helf,
- Hfreebsd,
- Hlinux,
- Hnacl,
- Hnetbsd,
- Hopenbsd,
- Hplan9,
- Hsolaris,
- Hwindows,
-};
-
-enum
-{
- LinkAuto = 0,
- LinkInternal,
- LinkExternal,
-};
-
-extern uchar fnuxi8[8];
-extern uchar fnuxi4[4];
-extern uchar inuxi1[1];
-extern uchar inuxi2[2];
-extern uchar inuxi4[4];
-extern uchar inuxi8[8];
-
-vlong addaddr(Link *ctxt, LSym *s, LSym *t);
-vlong addaddrplus(Link *ctxt, LSym *s, LSym *t, vlong add);
-vlong addaddrplus4(Link *ctxt, LSym *s, LSym *t, vlong add);
-void addlib(Link *ctxt, char *src, char *obj, char *pathname);
-void addlibpath(Link *ctxt, char *srcref, char *objref, char *file, char *pkg);
-vlong addpcrelplus(Link *ctxt, LSym *s, LSym *t, vlong add);
-Reloc* addrel(LSym *s);
-vlong addsize(Link *ctxt, LSym *s, LSym *t);
-vlong adduint16(Link *ctxt, LSym *s, uint16 v);
-vlong adduint32(Link *ctxt, LSym *s, uint32 v);
-vlong adduint64(Link *ctxt, LSym *s, uint64 v);
-vlong adduint8(Link *ctxt, LSym *s, uint8 v);
-vlong adduintxx(Link *ctxt, LSym *s, uint64 v, int wid);
-vlong atolwhex(char *s);
-void* emallocz(long n);
-void* erealloc(void *p, long n);
-char* estrdup(char *p);
-char* expandpkg(char *t0, char *pkg);
-int find1(int32 l, int c);
-char* headstr(int v);
-int headtype(char *name);
-void ldobjfile(Link *ctxt, Biobuf *f, char *pkg, int64 len, char *pn);
-LSym* linklookup(Link *ctxt, char *name, int v);
-Link* linknew(LinkArch *arch);
-LSym* linknewsym(Link *ctxt, char *symb, int v);
-LSym* linkrlookup(Link *ctxt, char *name, int v);
-void nuxiinit(LinkArch *arch);
-void pciterinit(Link *ctxt, Pciter *it, Pcdata *d);
-void pciternext(Pciter *it);
-vlong setaddr(Link *ctxt, LSym *s, vlong off, LSym *t);
-vlong setaddrplus(Link *ctxt, LSym *s, vlong off, LSym *t, vlong add);
-vlong setuint32(Link *ctxt, LSym *s, vlong r, uint32 v);
-vlong setuint8(Link *ctxt, LSym *s, vlong r, uint8 v);
-vlong setuintxx(Link *ctxt, LSym *s, vlong off, uint64 v, vlong wid);
-void symgrow(Link *ctxt, LSym *s, vlong lsiz);
-
-extern LinkArch link386;
-extern LinkArch linkamd64;
-extern LinkArch linkamd64p32;
-extern LinkArch linkarm;
-extern LinkArch linkppc64;
-extern LinkArch linkppc64le;
+++ /dev/null
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/386/include/u.h"
-
-typedef char int8;
-typedef uchar uint8;
-typedef short int16;
-typedef ushort uint16;
-typedef int int32;
-typedef uint uint32;
-typedef vlong int64;
-typedef uvlong uint64;
-typedef int intptr;
-typedef float float32;
-typedef double float64;
+++ /dev/null
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/amd64/include/u.h"
-
-typedef char int8;
-typedef uchar uint8;
-typedef short int16;
-typedef ushort uint16;
-typedef int int32;
-typedef uint uint32;
-typedef vlong int64;
-typedef uvlong uint64;
-typedef vlong intptr;
-typedef float float32;
-typedef double float64;
+++ /dev/null
-// Inferno utils/include/ar.h
-// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-enum {
- SARMAG = 8,
- SARNAME = 16,
- SAR_HDR = 16+44,
-};
-
-#define ARMAG "!<arch>\n"
-#define ARFMAG "`\n"
-/*c2go
-char ARMAG[] = "!<arch>\n";
-char ARFMAG[] = "`\n";
-*/
-
-typedef struct ArHdr ArHdr;
-struct ArHdr
-{
- char name[SARNAME];
- char date[12];
- char uid[6];
- char gid[6];
- char mode[8];
- char size[10];
- char fmag[2];
-};
+++ /dev/null
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/arm/include/u.h"
-
-typedef char int8;
-typedef uchar uint8;
-typedef short int16;
-typedef ushort uint16;
-typedef int int32;
-typedef uint uint32;
-typedef vlong int64;
-typedef uvlong uint64;
-typedef int intptr;
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../bio.h"
-
-#define fmtcharstod charstod
-#define lseek seek
+++ /dev/null
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-int errno;
-
-#define ERANGE 1001
+++ /dev/null
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../fmt.h"
-
-#pragma varargck argpos fmtprint 2
-#pragma varargck argpos fprint 2
-#pragma varargck argpos print 1
-#pragma varargck argpos runeseprint 3
-#pragma varargck argpos runesmprint 1
-#pragma varargck argpos runesnprint 3
-#pragma varargck argpos runesprint 2
-#pragma varargck argpos seprint 3
-#pragma varargck argpos smprint 1
-#pragma varargck argpos snprint 3
-#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 "d" int
-#pragma varargck type "o" int
-#pragma varargck type "x" int
-#pragma varargck type "c" int
-#pragma varargck type "C" int
-#pragma varargck type "b" int
-#pragma varargck type "d" uint
-#pragma varargck type "x" uint
-#pragma varargck type "c" uint
-#pragma varargck type "C" uint
-#pragma varargck type "b" uint
-#pragma varargck type "f" double
-#pragma varargck type "e" double
-#pragma varargck type "g" double
-#pragma varargck type "s" char*
-#pragma varargck type "q" char*
-#pragma varargck type "S" Rune*
-#pragma varargck type "Q" Rune*
-#pragma varargck type "r" void
-#pragma varargck type "%" void
-#pragma varargck type "n" int*
-#pragma varargck type "p" uintptr
-#pragma varargck type "p" void*
-#pragma varargck flag ','
-#pragma varargck flag ' '
-#pragma varargck flag 'h'
-#pragma varargck type "<" void*
-#pragma varargck type "[" void*
-#pragma varargck type "H" void*
-#pragma varargck type "lH" void*
+++ /dev/null
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/sys/include/ctype.h"
-#include "fmt.h"
-#include "utf.h"
-#include "libc_plan9.h"
-
-char* getgoos(void);
-char* getgoarch(void);
-char* getgoroot(void);
-char* getgoversion(void);
-char* getgoarm(void);
-char* getgo386(void);
-char* getgoextlinkenabled(void);
-char* getgohostos(void);
-char* getgohostarch(void);
-
-int runcmd(char**);
-
-void flagcount(char*, char*, int*);
-void flagint32(char*, char*, int32*);
-void flagint64(char*, char*, int64*);
-void flagstr(char*, char*, char**);
-void flagparse(int*, char***, void (*usage)(void));
-void flagfn0(char*, char*, void(*fn)(void));
-void flagfn1(char*, char*, void(*fn)(char*));
-void flagfn2(char*, char*, void(*fn)(char*, char*));
-void flagprint(int);
-
-// The libraries use size_t to avoid -Wconversion warnings from GCC
-// when calling standard library functions like memcpy.
-typedef unsigned long size_t;
-
-// math.h
-#define HUGE_VAL 1.79769313486231e+308
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../link.h"
+++ /dev/null
-#!/bin/rc
-
-pattern='/umuldiv/d
- /rune routines/,/^\/\*/d
- /print routines/,/^\/\*/d
- /error string for/,/^\/\*/d'
-
-sed -e $pattern /sys/include/libc.h | awk '/^enum/ && !n++, /^};/ {next}1'
+++ /dev/null
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
+++ /dev/null
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../utf.h"
+++ /dev/null
-/*
-Plan 9 from User Space include/u.h
-http://code.swtch.com/plan9port/src/tip/include/u.h
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef _U_H_
-#define _U_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define __BSD_VISIBLE 1 /* FreeBSD 5.x */
-#if defined(__sun__)
-# define __EXTENSIONS__ 1 /* SunOS */
-# if defined(__SunOS5_6__) || defined(__SunOS5_7__) || defined(__SunOS5_8__)
- /* NOT USING #define __MAKECONTEXT_V2_SOURCE 1 / * SunOS */
-# else
-# define __MAKECONTEXT_V2_SOURCE 1
-# endif
-#endif
-#define _BSD_SOURCE 1
-#define _NETBSD_SOURCE 1 /* NetBSD */
-#define _DEFAULT_SOURCE 1 /* glibc > 2.19 */
-#define _SVID_SOURCE 1
-#if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__sun__)
-# define _XOPEN_SOURCE 1000
-# define _XOPEN_SOURCE_EXTENDED 1
-#endif
-#if defined(__FreeBSD__)
-# include <sys/cdefs.h>
- /* for strtoll */
-# undef __ISO_C_VISIBLE
-# define __ISO_C_VISIBLE 1999
-# undef __LONG_LONG_SUPPORTED
-# define __LONG_LONG_SUPPORTED
-#endif
-#define _LARGEFILE64_SOURCE 1
-#define _FILE_OFFSET_BITS 64
-
-#include <inttypes.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <setjmp.h>
-#include <stddef.h>
-#include <math.h>
-#include <ctype.h> /* for tolower */
-#include <time.h>
-
-#ifdef _WIN32
-#include <signal.h>
-#endif
-
-/*
- * OS-specific crap
- */
-#define _NEEDUCHAR 1
-#define _NEEDUSHORT 1
-#define _NEEDUINT 1
-#define _NEEDULONG 1
-
-#ifdef _WIN32
-typedef jmp_buf sigjmp_buf;
-#endif
-typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
-
-#if defined(__linux__)
-# include <sys/types.h>
-# if defined(__Linux26__)
-# include <pthread.h>
-# define PLAN9PORT_USING_PTHREADS 1
-# endif
-# if defined(__USE_MISC)
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# undef _NEEDULONG
-# endif
-#elif defined(__sun__)
-# include <sys/types.h>
-# include <pthread.h>
-# define PLAN9PORT_USING_PTHREADS 1
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# undef _NEEDULONG
-# define nil 0 /* no cast to void* */
-#elif defined(__FreeBSD__)
-# include <sys/types.h>
-# include <osreldate.h>
-# if __FreeBSD_version >= 500000
-# define PLAN9PORT_USING_PTHREADS 1
-# include <pthread.h>
-# endif
-# if !defined(_POSIX_SOURCE)
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# endif
-#elif defined(__APPLE__)
-# include <sys/types.h>
-# include <pthread.h>
-# define PLAN9PORT_USING_PTHREADS 1
-# if __GNUC__ < 4
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# endif
-# undef _ANSI_SOURCE
-# undef _POSIX_C_SOURCE
-# undef _XOPEN_SOURCE
-# if !defined(NSIG)
-# define NSIG 32
-# endif
-# define _NEEDLL 1
-#elif defined(__NetBSD__)
-# include <sched.h>
-# include <sys/types.h>
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# undef _NEEDULONG
-#elif defined(__OpenBSD__)
-# include <sys/types.h>
-# undef _NEEDUSHORT
-# undef _NEEDUINT
-# undef _NEEDULONG
-#elif defined(_WIN32)
-#else
- /* No idea what system this is -- try some defaults */
-# include <pthread.h>
-# define PLAN9PORT_USING_PTHREADS 1
-#endif
-
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-typedef signed char schar;
-
-#ifdef _NEEDUCHAR
- typedef unsigned char uchar;
-#endif
-#ifdef _NEEDUSHORT
- typedef unsigned short ushort;
-#endif
-#ifdef _NEEDUINT
- typedef unsigned int uint;
-#endif
-#ifdef _NEEDULONG
- typedef unsigned long ulong;
-#endif
-typedef unsigned long long uvlong;
-typedef long long vlong;
-
-typedef uint64_t u64int;
-typedef int64_t s64int;
-typedef uint8_t u8int;
-typedef int8_t s8int;
-typedef uint16_t u16int;
-typedef int16_t s16int;
-typedef uintptr_t uintptr;
-typedef intptr_t intptr;
-typedef uint32_t u32int;
-typedef int32_t s32int;
-
-typedef s8int int8;
-typedef u8int uint8;
-typedef s16int int16;
-typedef u16int uint16;
-typedef s32int int32;
-typedef u32int uint32;
-typedef s64int int64;
-typedef u64int uint64;
-
-typedef float float32;
-typedef double float64;
-
-#undef _NEEDUCHAR
-#undef _NEEDUSHORT
-#undef _NEEDUINT
-#undef _NEEDULONG
-
-#define getcallerpc(x) __builtin_return_address(0)
-
-#ifndef SIGBUS
-#define SIGBUS SIGSEGV /* close enough */
-#endif
-
-/*
- * Funny-named symbols to tip off 9l to autolink.
- */
-#define AUTOLIB(x) static int __p9l_autolib_ ## x = 1;
-#define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x = 1;
-
-/*
- * Gcc is too smart for its own good.
- */
-#if defined(__GNUC__)
-# undef strcmp /* causes way too many warnings */
-# if __GNUC__ >= 4 || (__GNUC__==3 && !defined(__APPLE_CC__) && !defined(_WIN32))
-# undef AUTOLIB
-# define AUTOLIB(x) int __p9l_autolib_ ## x __attribute__ ((weak));
-# undef AUTOFRAMEWORK
-# define AUTOFRAMEWORK(x) int __p9l_autoframework_ ## x __attribute__ ((weak));
-# else
-# undef AUTOLIB
-# define AUTOLIB(x) static int __p9l_autolib_ ## x __attribute__ ((unused));
-# undef AUTOFRAMEWORK
-# define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x __attribute__ ((unused));
-# endif
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
+++ /dev/null
-#include "../src/lib9/utf/utf.h"
"fmt"
"os"
"path/filepath"
- "runtime"
"strings"
)
}
/*
- * C library and tool building
+ * Tool building
*/
-// gccargs is the gcc command line to use for compiling a single C file.
-var proto_gccargs = []string{
- "-Wall",
- // native Plan 9 compilers don't like non-standard prototypes
- // so let gcc catch them.
- "-Wstrict-prototypes",
- "-Wextra",
- "-Wunused",
- "-Wno-sign-compare",
- "-Wno-missing-braces",
- "-Wno-parentheses",
- "-Wno-unknown-pragmas",
- "-Wno-switch",
- "-Wno-comment",
- "-Wno-missing-field-initializers",
- "-fno-common",
- "-ggdb",
- "-pipe",
-}
-
-// gccargs2 is the second part of gccargs.
-// it is used if the environment isn't defining CFLAGS.
-var proto_gccargs2 = []string{
- // on older versions of GCC, -Wuninitialized is not supported
- // without -O, so put it here together with -O settings in case
- // the user's $CFLAGS doesn't include -O.
- "-Wuninitialized",
- "-O2",
-}
-
-func init() {
- if runtime.GOOS == "netbsd" && runtime.GOARCH == "arm" {
- // GCC 4.5.4 (NetBSD nb1 20120916) on ARM is known to mis-optimize gc/mparith3.c
- // Fix available at http://patchwork.ozlabs.org/patch/64562/.
- proto_gccargs2[1] = "-O1"
- }
-}
-
-var gccargs, ldargs []string
-
// deptab lists changes to the default dependencies for a given prefix.
// deps ending in /* read the whole directory; deps beginning with -
// exclude files with that prefix.
// depsuffix records the allowed suffixes for source files.
var depsuffix = []string{
- ".c",
- ".h",
".s",
".go",
}
path := pathf("%s/src/%s", goroot, dir)
name := filepath.Base(dir)
- // set up gcc command line on first run.
- if gccargs == nil {
- gccargs = splitfields(defaultcc + " " + defaultcflags)
- gccargs = append(gccargs, proto_gccargs...)
- if defaultcflags == "" {
- gccargs = append(gccargs, proto_gccargs2...)
- }
- if strings.Contains(gccargs[0], "clang") {
- // disable ASCII art in clang errors, if possible
- gccargs = append(gccargs, "-fno-caret-diagnostics")
- // clang is too smart about unused command-line arguments
- gccargs = append(gccargs, "-Qunused-arguments")
- }
- // disable word wrapping in error messages
- gccargs = append(gccargs, "-fmessage-length=0")
- if gohostos == "darwin" && gohostarch != "arm" {
- // golang.org/issue/5261
- gccargs = append(gccargs, "-mmacosx-version-min=10.6")
- }
- }
- if ldargs == nil && defaultldflags != "" {
- ldargs = splitfields(defaultldflags)
- }
-
- isgo := true
ispkg := !strings.HasPrefix(dir, "cmd/") || strings.HasPrefix(dir, "cmd/internal/") || strings.HasPrefix(dir, "cmd/asm/internal/")
- islib := false
-
- // Legacy C exceptions.
- switch dir {
- case "lib9", "libbio", "liblink", "cmd/gc", "cmd/ld":
- islib = true
- isgo = false
- }
// Start final link command line.
// Note: code below knows that link.p[targ] is the target.
targ int
ispackcmd bool
)
- switch {
- case islib:
- // C library.
- prefix := ""
- if !strings.HasPrefix(name, "lib") {
- prefix = "lib"
- }
- link = []string{"ar", "rsc", pathf("%s/pkg/obj/%s_%s/%s%s.a", goroot, gohostos, gohostarch, prefix, name)}
- if gohostos == "plan9" {
- link[1] = "rc"
- }
- targ = len(link) - 1
-
- case ispkg:
+ if ispkg {
// Go library (package).
ispackcmd = true
link = []string{"pack", pathf("%s/pkg/%s_%s/%s.a", goroot, goos, goarch, dir)}
targ = len(link) - 1
xmkdirall(filepath.Dir(link[targ]))
-
- case dir == "cmd/go" || dir == "cmd/cgo":
+ } else {
// Go command.
elem := name
if elem == "go" {
}
link = []string{fmt.Sprintf("%s/%sl", tooldir, gochar), "-o", pathf("%s/%s%s", tooldir, elem, exe)}
targ = len(link) - 1
-
- default:
- // C command. Use gccargs and ldargs.
- if gohostos == "plan9" {
- link = []string{fmt.Sprintf("%sl", gohostchar), "-o", pathf("%s/%s", tooldir, name)}
- targ = len(link) - 1
- } else {
- link = append(link, gccargs...)
- link = append(link, ldargs...)
- if sflag {
- link = append(link, "-static")
- }
- link = append(link, "-o", pathf("%s/%s%s", tooldir, name, exe))
- targ = len(link) - 1
- switch gohostarch {
- case "amd64":
- link = append(link, "-m64")
- case "386":
- link = append(link, "-m32")
- }
- }
}
ttarg := mtime(link[targ])
return !strings.HasPrefix(p, ".") && (!strings.HasPrefix(p, "_") || !strings.HasSuffix(p, ".go"))
})
- var libs []string
-
for _, dt := range deptab {
if dir == dt.prefix || strings.HasSuffix(dt.prefix, "/") && strings.HasPrefix(dir, dt.prefix) {
for _, p := range dt.dep {
p = os.ExpandEnv(p)
- switch {
- case strings.HasSuffix(p, ".a"):
- libs = append(libs, p)
-
- case strings.HasSuffix(p, "/*"):
- dir := strings.TrimSuffix(p, "/*")
- for _, name := range xreaddir(pathf("%s/%s", path, dir)) {
- files = append(files, pathf("%s/%s", dir, name))
- }
-
- case strings.HasPrefix(p, "-"):
- files = filter(files, func(s string) bool {
- return !strings.HasPrefix(s, p[1:])
- })
-
- default:
- files = append(files, p)
- }
+ files = append(files, p)
}
}
}
return
}
- if !stale {
- for _, p := range libs {
- if mtime(p).After(ttarg) {
- stale = true
- break
- }
- }
- }
-
if !stale {
return
}
built:
}
- if (goos != gohostos || goarch != gohostarch) && isgo {
+ if goos != gohostos || goarch != gohostarch {
// We've generated the right files; the go command can do the build.
if vflag > 1 {
errprintf("skip build for cross-compile %s\n", dir)
}
var archive string
- if isgo {
- // The next loop will compile individual non-Go files.
- // Hand the Go files to the compiler en masse.
- // For package runtime, this writes go_asm.h, which
- // the assembly files will need.
- pkg := dir
- if strings.HasPrefix(dir, "cmd/") {
- pkg = "main"
- }
- b := pathf("%s/_go_.a", workdir)
- clean = append(clean, b)
- if !ispackcmd {
- link = append(link, b)
- } else {
- archive = b
- }
- compile := []string{pathf("%s/%sg", tooldir, gochar), "-pack", "-o", b, "-p", pkg}
- if dir == "runtime" {
- compile = append(compile, "-+", "-asmhdr", pathf("%s/go_asm.h", workdir))
- }
- compile = append(compile, gofiles...)
- run(path, CheckExit|ShowOutput, compile...)
+ // The next loop will compile individual non-Go files.
+ // Hand the Go files to the compiler en masse.
+ // For package runtime, this writes go_asm.h, which
+ // the assembly files will need.
+ pkg := dir
+ if strings.HasPrefix(dir, "cmd/") {
+ pkg = "main"
+ }
+ b := pathf("%s/_go_.a", workdir)
+ clean = append(clean, b)
+ if !ispackcmd {
+ link = append(link, b)
+ } else {
+ archive = b
+ }
+ compile := []string{pathf("%s/%sg", tooldir, gochar), "-pack", "-o", b, "-p", pkg}
+ if dir == "runtime" {
+ compile = append(compile, "-+", "-asmhdr", pathf("%s/go_asm.h", workdir))
}
+ compile = append(compile, gofiles...)
+ run(path, CheckExit|ShowOutput, compile...)
// Compile the files.
for _, p := range files {
- if !strings.HasSuffix(p, ".c") && !strings.HasSuffix(p, ".s") {
+ if !strings.HasSuffix(p, ".s") {
continue
}
- name := filepath.Base(p)
var compile []string
- if !isgo {
- // C library or tool.
- if gohostos == "plan9" {
- compile = []string{
- gohostchar + "c", "-FTVwp",
- "-DPLAN9",
- "-D__STDC__=1",
- "-D__SIZE_TYPE__=ulong", // for GNU bison
- pathf("-I%s/include/plan9", goroot),
- pathf("-I%s/include/plan9/%s", goroot, gohostarch),
- }
- } else {
- compile = gccargs[0:len(gccargs):len(gccargs)]
- compile = append(compile, "-c")
- switch gohostarch {
- case "amd64":
- compile = append(compile, "-m64")
- case "386":
- compile = append(compile, "-m32")
- }
- compile = append(compile, "-I", pathf("%s/include", goroot))
- }
-
- if dir == "lib9" {
- compile = append(compile, "-DPLAN9PORT")
- }
-
- compile = append(compile, "-I", path)
-
- // lib9/goos.c gets the default constants hard-coded.
- if name == "goos.c" {
- compile = append(compile,
- "-D", fmt.Sprintf("GOOS=%q", goos),
- "-D", fmt.Sprintf("GOARCH=%q", goarch),
- "-D", fmt.Sprintf("GOHOSTOS=%q", gohostos),
- "-D", fmt.Sprintf("GOHOSTARCH=%q", gohostarch),
- "-D", fmt.Sprintf("GOROOT=%q", goroot_final),
- "-D", fmt.Sprintf("GOVERSION=%q", findgoversion()),
- "-D", fmt.Sprintf("GOARM=%q", goarm),
- "-D", fmt.Sprintf("GO386=%q", go386),
- "-D", fmt.Sprintf("GO_EXTLINK_ENABLED=%q", goextlinkenabled),
- )
- }
-
- // liblink/go.c records the GOEXPERIMENT setting used during the build.
- if name == "go.c" {
- compile = append(compile,
- "-D", fmt.Sprintf("GOEXPERIMENT=%q", os.Getenv("GOEXPERIMENT")))
- }
- } else {
- // Assembly file for a Go package.
- compile = []string{
- pathf("%s/%sa", tooldir, gochar),
- "-I", workdir,
- "-I", pathf("%s/pkg/%s_%s", goroot, goos, goarch),
- "-D", "GOOS_" + goos,
- "-D", "GOARCH_" + goarch,
- "-D", "GOOS_GOARCH_" + goos + "_" + goarch,
- }
+ // Assembly file for a Go package.
+ compile = []string{
+ pathf("%s/%sa", tooldir, gochar),
+ "-I", workdir,
+ "-I", pathf("%s/pkg/%s_%s", goroot, goos, goarch),
+ "-D", "GOOS_" + goos,
+ "-D", "GOARCH_" + goarch,
+ "-D", "GOOS_GOARCH_" + goos + "_" + goarch,
}
doclean := true
b := pathf("%s/%s", workdir, filepath.Base(p))
- if !isgo && gohostos == "darwin" {
- // To debug C programs on OS X, it is not enough to say -ggdb
- // on the command line. You have to leave the object files
- // lying around too. Leave them in pkg/obj/, which does not
- // get removed when this tool exits.
- obj := pathf("%s/pkg/obj/%s", goroot, dir)
- xmkdirall(obj)
- b = pathf("%s/%s", obj, filepath.Base(p))
- doclean = false
- }
// Change the last character of the output file (which was c or s).
if gohostos == "plan9" {
}
bgwait()
- if isgo && ispackcmd {
+ if ispackcmd {
xremove(link[targ])
dopack(link[targ], archive, link[targ+1:])
return
}
- if !islib && !isgo {
- // C binaries need the libraries explicitly, and -lm.
- link = append(link, libs...)
- if gohostos != "plan9" {
- link = append(link, "-lm")
- }
- }
-
// Remove target before writing it.
xremove(link[targ])
run("", CheckExit|ShowOutput, link...)
"cmd/9g",
"cmd/9l",
"cmd/go",
- "lib9",
- "libbio",
- "liblink",
// Go packages.
"bufio",
+++ /dev/null
-# Copyright 2012 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_exits.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_exits.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-_exits(char *s)
-{
- if(s == 0 || *s == 0)
- _exit(0);
- _exit(exitcode(s));
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_p9dir.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_p9dir.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-
-/*
- * Caching the last group and passwd looked up is
- * a significant win (stupidly enough) on most systems.
- * It's not safe for threaded programs, but neither is using
- * getpwnam in the first place, so I'm not too worried.
- */
-int
-_p9dir(struct stat *lst, struct stat *st, char *name, Dir *d, char **str, char *estr)
-{
- char *s;
- char tmp[20];
- int sz, fd;
-
-#ifdef _WIN32
- USED(lst);
-#endif
- fd = -1;
- USED(fd);
- sz = 0;
- if(d)
- memset(d, 0, sizeof *d);
-
- /* name */
- s = strrchr(name, '/');
- if(s)
- s++;
- if(!s || !*s)
- s = name;
- if(*s == '/')
- s++;
- if(*s == 0)
- s = "/";
- if(d){
- if(*str + strlen(s)+1 > estr)
- d->name = "oops";
- else{
- strcpy(*str, s);
- d->name = *str;
- *str += strlen(*str)+1;
- }
- }
- sz += (int)strlen(s)+1;
-
- /* user */
- snprint(tmp, sizeof tmp, "%d", (int)st->st_uid);
- s = tmp;
- sz += (int)strlen(s)+1;
- if(d){
- if(*str+strlen(s)+1 > estr)
- d->uid = "oops";
- else{
- strcpy(*str, s);
- d->uid = *str;
- *str += strlen(*str)+1;
- }
- }
-
- /* group */
- snprint(tmp, sizeof tmp, "%d", (int)st->st_gid);
- s = tmp;
- sz += (int)strlen(s)+1;
- if(d){
- if(*str + strlen(s)+1 > estr)
- d->gid = "oops";
- else{
- strcpy(*str, s);
- d->gid = *str;
- *str += strlen(*str)+1;
- }
- }
-
- if(d){
- d->type = 'M';
-
- d->muid = "";
- d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino;
-#ifdef _HAVESTGEN
- d->qid.vers = st->st_gen;
-#endif
- if(d->qid.vers == 0)
- d->qid.vers = (ulong)(st->st_mtime + st->st_ctime);
- d->mode = st->st_mode&0777;
- d->atime = (ulong)st->st_atime;
- d->mtime = (ulong)st->st_mtime;
- d->length = st->st_size;
-
- if(S_ISDIR(st->st_mode)){
- d->length = 0;
- d->mode |= DMDIR;
- d->qid.type = QTDIR;
- }
-#ifdef S_ISLNK
- if(S_ISLNK(lst->st_mode)) /* yes, lst not st */
- d->mode |= DMSYMLINK;
-#endif
- if(S_ISFIFO(st->st_mode))
- d->mode |= DMNAMEDPIPE;
-#ifdef S_ISSOCK
- if(S_ISSOCK(st->st_mode))
- d->mode |= DMSOCKET;
-#endif
- if(S_ISBLK(st->st_mode)){
- d->mode |= DMDEVICE;
- d->qid.path = ('b'<<16)|st->st_rdev;
- }
- if(S_ISCHR(st->st_mode)){
- d->mode |= DMDEVICE;
- d->qid.path = ('c'<<16)|st->st_rdev;
- }
- /* fetch real size for disks */
- if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){
- d->length = 0;
- close(fd);
- }
-#if defined(DIOCGMEDIASIZE)
- if(isdisk(st)){
- int fd;
- off_t mediasize;
-
- if((fd = open(name, O_RDONLY)) >= 0){
- if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 0)
- d->length = mediasize;
- close(fd);
- }
- }
-#elif defined(_HAVEDISKLABEL)
- if(isdisk(st)){
- int fd, n;
- struct disklabel lab;
-
- if((fd = open(name, O_RDONLY)) < 0)
- goto nosize;
- if(ioctl(fd, DIOCGDINFO, &lab) < 0)
- goto nosize;
- n = minor(st->st_rdev)&7;
- if(n >= lab.d_npartitions)
- goto nosize;
-
- d->length = (vlong)(lab.d_partitions[n].p_size) * lab.d_secsize;
-
- nosize:
- if(fd >= 0)
- close(fd);
- }
-#endif
- }
-
- return sz;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/ato*.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/atoi.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-atoi(char *s)
-{
- return (int)strtol(s, 0, 0);
-}
-
-long
-atol(char *s)
-{
- return strtol(s, 0, 0);
-}
-
-vlong
-atoll(char *s)
-{
- return strtoll(s, 0, 0);
-}
+++ /dev/null
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/await.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/await.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-Portions Copyright 2009 The Go Authors. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#ifndef WCOREDUMP /* not on Mac OS X Tiger */
-#define WCOREDUMP(status) 0
-#endif
-
-static struct {
- int sig;
- char *str;
-} tab[] = {
- SIGHUP, "hangup",
- SIGINT, "interrupt",
- SIGQUIT, "quit",
- SIGILL, "sys: illegal instruction",
- SIGTRAP, "sys: breakpoint",
- SIGABRT, "sys: abort",
-#ifdef SIGEMT
- SIGEMT, "sys: emulate instruction executed",
-#endif
- SIGFPE, "sys: fp: trap",
- SIGKILL, "sys: kill",
- SIGBUS, "sys: bus error",
- SIGSEGV, "sys: segmentation violation",
- SIGALRM, "alarm",
- SIGTERM, "kill",
- SIGURG, "sys: urgent condition on socket",
- SIGSTOP, "sys: stop",
- SIGTSTP, "sys: tstp",
- SIGCONT, "sys: cont",
- SIGCHLD, "sys: child",
- SIGTTIN, "sys: ttin",
- SIGTTOU, "sys: ttou",
-#ifdef SIGIO /* not on Mac OS X Tiger */
- SIGIO, "sys: i/o possible on fd",
-#endif
- SIGXCPU, "sys: cpu time limit exceeded",
- SIGXFSZ, "sys: file size limit exceeded",
- SIGVTALRM, "sys: virtual time alarm",
- SIGPROF, "sys: profiling timer alarm",
-#ifdef SIGWINCH /* not on Mac OS X Tiger */
- SIGWINCH, "sys: window size change",
-#endif
-#ifdef SIGINFO
- SIGINFO, "sys: status request",
-#endif
- SIGUSR1, "sys: usr1",
- SIGUSR2, "sys: usr2",
- SIGPIPE, "sys: write on closed pipe",
-};
-
-char*
-_p9sigstr(int sig, char *tmp)
-{
- int i;
-
- for(i=0; i<nelem(tab); i++)
- if(tab[i].sig == sig)
- return tab[i].str;
- if(tmp == nil)
- return nil;
- sprint(tmp, "sys: signal %d", sig);
- return tmp;
-}
-
-int
-_p9strsig(char *s)
-{
- int i;
-
- for(i=0; i<nelem(tab); i++)
- if(strcmp(s, tab[i].str) == 0)
- return tab[i].sig;
- return 0;
-}
-
-static Waitmsg*
-_wait(int pid4, int opt)
-{
- int pid, status, cd;
- struct rusage ru;
- char tmp[64];
- ulong u, s;
- Waitmsg *w;
-
- w = malloc(sizeof *w + 200);
- if(w == nil)
- return nil;
- memset(w, 0, sizeof *w);
- w->msg = (char*)&w[1];
-
- for(;;){
- /* On Linux, pid==-1 means anyone; on SunOS, it's pid==0. */
- if(pid4 == -1)
- pid = wait3(&status, opt, &ru);
- else
- pid = wait4(pid4, &status, opt, &ru);
- if(pid <= 0) {
- free(w);
- return nil;
- }
- u = (ulong)(ru.ru_utime.tv_sec*1000+((ru.ru_utime.tv_usec+500)/1000));
- s = (ulong)(ru.ru_stime.tv_sec*1000+((ru.ru_stime.tv_usec+500)/1000));
- w->pid = pid;
- w->time[0] = u;
- w->time[1] = s;
- w->time[2] = u+s;
- if(WIFEXITED(status)){
- if(status)
- sprint(w->msg, "%d", status);
- return w;
- }
- if(WIFSIGNALED(status)){
- cd = WCOREDUMP(status);
- sprint(w->msg, "signal: %s", _p9sigstr(WTERMSIG(status), tmp));
- if(cd)
- strcat(w->msg, " (core dumped)");
- return w;
- }
- }
-}
-
-Waitmsg*
-p9wait(void)
-{
- return _wait(-1, 0);
-}
-
-Waitmsg*
-p9waitfor(int pid)
-{
- return _wait(pid, 0);
-}
-
-Waitmsg*
-p9waitnohang(void)
-{
- return _wait(-1, WNOHANG);
-}
-
-int
-p9waitpid(void)
-{
- int status;
- return wait(&status);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Inferno libkern/cleanname.c
-http://code.google.com/p/inferno-os/source/browse/libkern/cleanname.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-/*
- * In place, rewrite name to compress multiple /, eliminate ., and process ..
- */
-#define SEP(x) ((x)=='/' || (x) == 0)
-char*
-cleanname(char *name)
-{
- char *p, *q, *dotdot;
- int rooted;
-
- rooted = name[0] == '/';
-
- /*
- * invariants:
- * p points at beginning of path element we're considering.
- * q points just past the last path element we wrote (no slash).
- * dotdot points just past the point where .. cannot backtrack
- * any further (no slash).
- */
- p = q = dotdot = name+rooted;
- while(*p) {
- if(p[0] == '/') /* null element */
- p++;
- else if(p[0] == '.' && SEP(p[1]))
- p += 1; /* don't count the separator in case it is nul */
- else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) {
- p += 2;
- if(q > dotdot) { /* can backtrack */
- while(--q > dotdot && *q != '/')
- ;
- } else if(!rooted) { /* /.. is / but ./../ is .. */
- if(q != name)
- *q++ = '/';
- *q++ = '.';
- *q++ = '.';
- dotdot = q;
- }
- } else { /* real path element */
- if(q != name+rooted)
- *q++ = '/';
- while((*q = *p) != '/' && *q != 0)
- p++, q++;
- }
- }
- if(q == name) /* empty string is really ``.'' */
- *q++ = '.';
- *q = '\0';
- return name;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/create.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/create.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#define _GNU_SOURCE /* for Linux O_DIRECT */
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <sys/file.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <libc.h>
-#include <sys/stat.h>
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-int
-p9create(char *path, int mode, ulong perm)
-{
- int fd, umode, rclose;
-
- rclose = mode&ORCLOSE;
- mode &= ~ORCLOSE;
-
- /* XXX should get mode mask right? */
- fd = -1;
- if(perm&DMDIR){
- if(mode != OREAD){
- werrstr("bad mode in directory create");
- goto out;
- }
- if(mkdir(path, perm&0777) < 0)
- goto out;
- fd = open(path, O_RDONLY);
- }else{
- umode = (mode&3)|O_CREAT|O_TRUNC;
- mode &= ~(3|OTRUNC);
- if(mode&ODIRECT){
- umode |= O_DIRECT;
- mode &= ~ODIRECT;
- }
- if(mode&OEXCL){
- umode |= O_EXCL;
- mode &= ~OEXCL;
- }
- if(mode&OAPPEND){
- umode |= O_APPEND;
- mode &= ~OAPPEND;
- }
- if(mode){
- werrstr("unsupported mode in create");
- goto out;
- }
- umode |= O_BINARY;
- fd = open(path, umode, perm);
- }
-out:
- if(fd >= 0){
- if(rclose)
- remove(path);
- }
- return fd;
-}
+++ /dev/null
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-
-char*
-p9ctime(long t)
-{
- static char buf[100];
- time_t tt;
- struct tm *tm;
-
- tt = t;
- tm = localtime(&tt);
- snprint(buf, sizeof buf, "%3.3s %3.3s %02d %02d:%02d:%02d %3.3s %d\n",
- &"SunMonTueWedThuFriSat"[tm->tm_wday*3],
- &"JanFebMarAprMayJunJulAugSepOctNovDec"[tm->tm_mon*3],
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- "XXX", // tm_zone is unavailable on windows, and no one cares
- tm->tm_year + 1900);
- return buf;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirfstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirfstat.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#include <sys/stat.h>
-
-extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
-
-Dir*
-dirfstat(int fd)
-{
- struct stat st;
- int nstr;
- Dir *d;
- char *str, tmp[100];
-
- if(fstat(fd, &st) < 0)
- return nil;
-
- snprint(tmp, sizeof tmp, "/dev/fd/%d", fd);
- nstr = _p9dir(&st, &st, tmp, nil, nil, nil);
- d = malloc(sizeof(Dir)+(size_t)nstr);
- if(d == nil)
- return nil;
- memset(d, 0, sizeof(Dir)+(size_t)nstr);
- str = (char*)&d[1];
- _p9dir(&st, &st, tmp, d, &str, str+nstr);
- return d;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirfwstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirfwstat.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__linux__)
-/* do nothing -- futimes exists and is fine */
-
-#elif defined(__SunOS5_9__)
-/* use futimesat */
-static int
-futimes(int fd, struct timeval *tv)
-{
- return futimesat(fd, 0, tv);
-}
-
-#else
-/* provide dummy */
-/* rename just in case -- linux provides an unusable one */
-#undef futimes
-#define futimes myfutimes
-static int
-futimes(int fd, struct timeval *tv)
-{
- USED(fd);
- USED(tv);
- werrstr("futimes not available");
- return -1;
-}
-
-#endif
-
-int
-dirfwstat(int fd, Dir *dir)
-{
- int ret;
- struct timeval tv[2];
-
- ret = 0;
-#ifndef _WIN32
- if(~dir->mode != 0){
- if(fchmod(fd, (mode_t)dir->mode) < 0)
- ret = -1;
- }
-#endif
- if(~dir->mtime != 0){
- tv[0].tv_sec = (time_t)dir->mtime;
- tv[0].tv_usec = 0;
- tv[1].tv_sec = (time_t)dir->mtime;
- tv[1].tv_usec = 0;
- if(futimes(fd, tv) < 0)
- ret = -1;
- }
- return ret;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirstat.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#include <sys/stat.h>
-
-extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
-
-Dir*
-dirstat(char *file)
-{
- struct stat lst;
- struct stat st;
- int nstr;
- Dir *d;
- char *str;
-
-#ifdef _WIN32
- if(stat(file, &st) < 0)
- return nil;
- lst = st;
-#else
- if(lstat(file, &lst) < 0)
- return nil;
- st = lst;
- if((lst.st_mode&S_IFMT) == S_IFLNK)
- stat(file, &st);
-#endif
-
- nstr = _p9dir(&lst, &st, file, nil, nil, nil);
- d = malloc(sizeof(Dir)+(size_t)nstr);
- if(d == nil)
- return nil;
- memset(d, 0, sizeof(Dir)+(size_t)nstr);
- str = (char*)&d[1];
- _p9dir(&lst, &st, file, d, &str, str+nstr);
- return d;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirwstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirwstat.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include <sys/time.h>
-#include <utime.h>
-
-int
-dirwstat(char *file, Dir *dir)
-{
- struct utimbuf ub;
-
- /* BUG handle more */
- if(~dir->mtime == 0)
- return 0;
-
- ub.actime = (time_t)dir->mtime;
- ub.modtime = (time_t)dir->mtime;
- return utime(file, &ub);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dup.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dup.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-#undef dup
-
-int
-p9dup(int old, int new)
-{
- if(new == -1)
- return dup(old);
- return dup2(old, new);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/errstr.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/errstr.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * We assume there's only one error buffer for the whole system.
- * If you use ffork, you need to provide a _syserrstr. Since most
- * people will use libthread (which provides a _syserrstr), this is
- * okay.
- */
-
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-
-enum
-{
- EPLAN9 = 0x19283745
-};
-
-char *(*_syserrstr)(void);
-static char xsyserr[ERRMAX];
-static char*
-getsyserr(void)
-{
- char *s;
-
- s = nil;
- if(_syserrstr)
- s = (*_syserrstr)();
- if(s == nil)
- s = xsyserr;
- return s;
-}
-
-int
-errstr(char *err, uint n)
-{
- char tmp[ERRMAX];
- char *syserr;
-
- strecpy(tmp, tmp+ERRMAX, err);
- rerrstr(err, n);
- syserr = getsyserr();
- strecpy(syserr, syserr+ERRMAX, tmp);
- errno = EPLAN9;
- return 0;
-}
-
-void
-rerrstr(char *err, uint n)
-{
- char *syserr;
-
- syserr = getsyserr();
- if(errno == EINTR)
- strcpy(syserr, "interrupted");
- else if(errno != EPLAN9)
- strcpy(syserr, strerror(errno));
- strecpy(err, err+n, syserr);
-}
-
-/* replaces __errfmt in libfmt */
-
-int
-__errfmt(Fmt *f)
-{
- if(errno == EPLAN9)
- return fmtstrcpy(f, getsyserr());
- return fmtstrcpy(f, strerror(errno));
-}
-
-void
-werrstr(char *fmt, ...)
-{
- va_list arg;
- char buf[ERRMAX];
-
- va_start(arg, fmt);
- vseprint(buf, buf+ERRMAX, fmt, arg);
- va_end(arg);
- errstr(buf, ERRMAX);
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/exec.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/exec.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-int
-exec(char *prog, char *argv[])
-{
- /* to mimic plan 9 should be just exec, but execvp is a better fit for unix */
- return execvp(prog, argv);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/execl.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/execl.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-int
-execl(char *prog, ...)
-{
- int i;
- va_list arg;
- char **argv;
-
- va_start(arg, prog);
- for(i=0; va_arg(arg, char*) != nil; i++)
- ;
- va_end(arg);
-
- argv = malloc((size_t)(i+1)*sizeof(char*));
- if(argv == nil)
- return -1;
-
- va_start(arg, prog);
- for(i=0; (argv[i] = va_arg(arg, char*)) != nil; i++)
- ;
- va_end(arg);
-
- exec(prog, argv);
- free(argv);
- return -1;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/exitcode.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/exitcode.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-exitcode(char *s)
-{
- USED(s);
- return 1;
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_exits.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_exits.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-void
-exits(char *s)
-{
- if(s == 0 || *s == 0)
- exit(0);
- exit(exitcode(s));
-}
+++ /dev/null
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-// Flag hash.
-typedef struct Flag Flag;
-
-struct Flag
-{
- char *name;
- int namelen;
- char *desc;
- int iscount;
- void (*set)(char*, void*);
- void (*set2)(char*, char*, void*);
- void *arg;
- Flag *next;
- Flag *allnext;
-};
-
-static Flag *curflag;
-
-static Flag *fhash[512];
-static Flag *first, *last;
-
-char *argv0;
-
-/*
- * Mac OS can't deal with files that only declare data.
- * ARGBEGIN mentions this function so that this file gets pulled in.
- */
-void __fixargv0(void) { }
-
-// FNV-1 hash. http://isthe.com/chongo/tech/comp/fnv/
-static uint32
-fnv(char *p, int n)
-{
- uint32 h;
-
- h = 2166136261U;
- while(n-- > 0)
- h = (h*16777619) ^ (uchar)*p++;
- return h;
-}
-
-static Flag*
-lookflag(char *name, int namelen, int creat)
-{
- uint32 h;
- Flag *f;
-
- h = fnv(name, namelen) & (nelem(fhash)-1);
- for(f=fhash[h]; f; f=f->next) {
- if(f->namelen == namelen && memcmp(f->name, name, (size_t)namelen) == 0) {
- if(creat)
- sysfatal("multiple definitions of flag -%s", name);
- return f;
- }
- }
-
- if(!creat)
- return nil;
-
- f = malloc(sizeof *f);
- if(f == nil)
- sysfatal("out of memory");
- memset(f, 0, sizeof *f);
- f->name = name;
- f->namelen = namelen;
- f->next = fhash[h];
- if(first == nil)
- first = f;
- else
- last->allnext = f;
- last = f;
- fhash[h] = f;
- return f;
-}
-
-static void
-count(char *arg, void *p)
-{
- int *ip;
-
- ip = p;
- if(arg != nil)
- *ip = atoi(arg);
- else
- (*ip)++;
-}
-
-void
-flagcount(char *name, char *desc, int *p)
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->iscount = 1;
- f->set = count;
- f->arg = p;
-}
-
-static void
-atollwhex(char *s, void *p)
-{
- char *t;
-
- *(int64*)p = strtoll(s, &t, 0);
- if(*s == '\0' || *t != '\0')
- sysfatal("invalid numeric argument -%s=%s", curflag->name, s);
-}
-
-void
-flagint64(char *name, char *desc, int64 *p)
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set = atollwhex;
- f->arg = p;
-}
-
-static void
-atolwhex(char *s, void *p)
-{
- char *t;
-
- *(int32*)p = (int32)strtol(s, &t, 0);
- if(*s == '\0' || *t != '\0')
- sysfatal("invalid numeric argument -%s=%s", curflag->name, s);
-}
-
-void
-flagint32(char *name, char *desc, int32 *p)
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set = atolwhex;
- f->arg = p;
-}
-
-static void
-string(char *s, void *p)
-{
- *(char**)p = s;
-}
-
-void
-flagstr(char *name, char *desc, char **p)
-{
-
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set = string;
- f->arg = p;
-}
-
-static void
-fn0(char *s, void *p)
-{
- USED(s);
- ((void(*)(void))p)();
-}
-
-void
-flagfn0(char *name, char *desc, void (*fn)(void))
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set = fn0;
- f->arg = fn;
- f->iscount = 1;
-}
-
-static void
-fn1(char *s, void *p)
-{
- ((void(*)(char*))p)(s);
-}
-
-void
-flagfn1(char *name, char *desc, void (*fn)(char*))
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set = fn1;
- f->arg = fn;
-}
-
-static void
-fn2(char *s, char *t, void *p)
-{
- ((void(*)(char*, char*))p)(s, t);
-}
-
-void
-flagfn2(char *name, char *desc, void (*fn)(char*, char*))
-{
- Flag *f;
-
- f = lookflag(name, (int)strlen(name), 1);
- f->desc = desc;
- f->set2 = fn2;
- f->arg = fn;
-}
-
-void
-flagparse(int *argcp, char ***argvp, void (*usage)(void))
-{
- int argc;
- char **argv, *p, *q;
- char *name;
- int namelen;
- Flag *f;
-
- argc = *argcp;
- argv = *argvp;
-
- argv0 = argv[0];
- argc--;
- argv++;
-
- while(argc > 0) {
- p = *argv;
- // stop before non-flag or -
- if(*p != '-' || p[1] == '\0')
- break;
- argc--;
- argv++;
- // stop after --
- if(p[1] == '-' && p[2] == '\0') {
- break;
- }
-
- // turn --foo into -foo
- if(p[1] == '-' && p[2] != '-')
- p++;
-
- // allow -flag=arg if present
- name = p+1;
- q = strchr(name, '=');
- if(q != nil)
- namelen = (int)(q++ - name);
- else
- namelen = (int)strlen(name);
- f = lookflag(name, namelen, 0);
- if(f == nil) {
- if(strcmp(p, "-h") == 0 || strcmp(p, "-help") == 0 || strcmp(p, "-?") == 0)
- usage();
- sysfatal("unknown flag %s", p);
- }
- curflag = f;
-
- // otherwise consume next argument if non-boolean
- if(!f->iscount && q == nil) {
- if(argc-- == 0)
- sysfatal("missing argument to flag %s", p);
- q = *argv++;
- }
-
- // and another if we need two
- if(f->set2 != nil) {
- if(argc-- == 0)
- sysfatal("missing second argument to flag %s", p);
- f->set2(q, *argv++, f->arg);
- continue;
- }
-
- f->set(q, f->arg);
- }
-
- *argcp = argc;
- *argvp = argv;
-}
-
-void
-flagprint(int fd)
-{
- Flag *f;
- char *p, *q;
-
- for(f=first; f; f=f->allnext) {
- p = f->desc;
- if(p == nil || *p == '\0') // undocumented flag
- continue;
- q = strstr(p, ": ");
- if(q)
- fprint(fd, " -%s %.*s\n \t%s\n", f->name, utfnlen(p, q-p), p, q+2);
- else if(f->namelen > 1)
- fprint(fd, " -%s\n \t%s\n", f->name, p);
- else
- fprint(fd, " -%s\t%s\n", f->name, p);
- }
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Reads a floating-point number by interpreting successive characters
- * returned by (*f)(vp). The last call it makes to f terminates the
- * scan, so is not a character in the number. It may therefore be
- * necessary to back up the input stream up one byte after calling charstod.
- */
-
-double
-fmtcharstod(int(*f)(void*), void *vp)
-{
- double num, dem;
- int neg, eneg, dig, exp, c;
-
- num = 0;
- neg = 0;
- dig = 0;
- exp = 0;
- eneg = 0;
-
- c = (*f)(vp);
- while(c == ' ' || c == '\t')
- c = (*f)(vp);
- if(c == '-' || c == '+'){
- if(c == '-')
- neg = 1;
- c = (*f)(vp);
- }
- while(c >= '0' && c <= '9'){
- num = num*10 + c-'0';
- c = (*f)(vp);
- }
- if(c == '.')
- c = (*f)(vp);
- while(c >= '0' && c <= '9'){
- num = num*10 + c-'0';
- dig++;
- c = (*f)(vp);
- }
- if(c == 'e' || c == 'E'){
- c = (*f)(vp);
- if(c == '-' || c == '+'){
- if(c == '-'){
- dig = -dig;
- eneg = 1;
- }
- c = (*f)(vp);
- }
- while(c >= '0' && c <= '9'){
- exp = exp*10 + c-'0';
- c = (*f)(vp);
- }
- }
- exp -= dig;
- if(exp < 0){
- exp = -exp;
- eneg = !eneg;
- }
- dem = __fmtpow10(exp);
- if(eneg)
- num /= dem;
- else
- num *= dem;
- if(neg)
- return -num;
- return num;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/* format the output into f->to and return the number of characters fmted */
-int
-dofmt(Fmt *f, char *fmt)
-{
- Rune rune, *rt, *rs;
- Rune r;
- char *t, *s;
- int n, nfmt;
-
- nfmt = f->nfmt;
- for(;;){
- if(f->runes){
- rt = (Rune*)f->to;
- rs = (Rune*)f->stop;
- while((r = (Rune)*(uchar*)fmt) && r != '%'){
- if(r < Runeself)
- fmt++;
- else{
- fmt += chartorune(&rune, fmt);
- r = rune;
- }
- FMTRCHAR(f, rt, rs, r);
- }
- fmt++;
- f->nfmt += (int)(rt - (Rune *)f->to);
- f->to = rt;
- if(!r)
- return f->nfmt - nfmt;
- f->stop = rs;
- }else{
- t = (char*)f->to;
- s = (char*)f->stop;
- while((r = (Rune)*(uchar*)fmt) && r != '%'){
- if(r < Runeself){
- FMTCHAR(f, t, s, r);
- fmt++;
- }else{
- n = chartorune(&rune, fmt);
- if(t + n > s){
- t = (char*)__fmtflush(f, t, n);
- if(t != nil)
- s = (char*)f->stop;
- else
- return -1;
- }
- while(n--)
- *t++ = *fmt++;
- }
- }
- fmt++;
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- if(!r)
- return f->nfmt - nfmt;
- f->stop = s;
- }
-
- fmt = (char*)__fmtdispatch(f, fmt, 0);
- if(fmt == nil)
- return -1;
- }
-}
-
-void *
-__fmtflush(Fmt *f, void *t, int len)
-{
- if(f->runes)
- f->nfmt += (int)((Rune*)t - (Rune*)f->to);
- else
- f->nfmt += (int)((char*)t - (char *)f->to);
- f->to = t;
- if(f->flush == 0 || (*f->flush)(f) == 0 || (char*)f->to + len > (char*)f->stop){
- f->stop = f->to;
- return nil;
- }
- return f->to;
-}
-
-/*
- * put a formatted block of memory sz bytes long of n runes into the output buffer,
- * left/right justified in a field of at least f->width characters (if FmtWidth is set)
- */
-int
-__fmtpad(Fmt *f, int n)
-{
- char *t, *s;
- int i;
-
- t = (char*)f->to;
- s = (char*)f->stop;
- for(i = 0; i < n; i++)
- FMTCHAR(f, t, s, ' ');
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- return 0;
-}
-
-int
-__rfmtpad(Fmt *f, int n)
-{
- Rune *t, *s;
- int i;
-
- t = (Rune*)f->to;
- s = (Rune*)f->stop;
- for(i = 0; i < n; i++)
- FMTRCHAR(f, t, s, ' ');
- f->nfmt += (int)(t - (Rune *)f->to);
- f->to = t;
- return 0;
-}
-
-int
-__fmtcpy(Fmt *f, const void *vm, int n, int sz)
-{
- Rune *rt, *rs, r;
- char *t, *s, *m, *me;
- ulong fl;
- int nc, w;
-
- m = (char*)vm;
- me = m + sz;
- fl = f->flags;
- w = 0;
- if(fl & FmtWidth)
- w = f->width;
- if((fl & FmtPrec) && n > f->prec)
- n = f->prec;
- if(f->runes){
- if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
- return -1;
- rt = (Rune*)f->to;
- rs = (Rune*)f->stop;
- for(nc = n; nc > 0; nc--){
- r = *(uchar*)m;
- if(r < Runeself)
- m++;
- else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
- m += chartorune(&r, m);
- else
- break;
- FMTRCHAR(f, rt, rs, r);
- }
- f->nfmt += (int)(rt - (Rune *)f->to);
- f->to = rt;
- if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
- return -1;
- }else{
- if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
- return -1;
- t = (char*)f->to;
- s = (char*)f->stop;
- for(nc = n; nc > 0; nc--){
- r = *(uchar*)m;
- if(r < Runeself)
- m++;
- else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
- m += chartorune(&r, m);
- else
- break;
- FMTRUNE(f, t, s, r);
- }
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
- return -1;
- }
- return 0;
-}
-
-int
-__fmtrcpy(Fmt *f, const void *vm, int n)
-{
- Rune r, *m, *me, *rt, *rs;
- char *t, *s;
- ulong fl;
- int w;
-
- m = (Rune*)vm;
- fl = f->flags;
- w = 0;
- if(fl & FmtWidth)
- w = f->width;
- if((fl & FmtPrec) && n > f->prec)
- n = f->prec;
- if(f->runes){
- if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
- return -1;
- rt = (Rune*)f->to;
- rs = (Rune*)f->stop;
- for(me = m + n; m < me; m++)
- FMTRCHAR(f, rt, rs, *m);
- f->nfmt += (int)(rt - (Rune *)f->to);
- f->to = rt;
- if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
- return -1;
- }else{
- if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
- return -1;
- t = (char*)f->to;
- s = (char*)f->stop;
- for(me = m + n; m < me; m++){
- r = *m;
- FMTRUNE(f, t, s, r);
- }
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
- return -1;
- }
- return 0;
-}
-
-/* fmt out one character */
-int
-__charfmt(Fmt *f)
-{
- char x[1];
-
- x[0] = (char)va_arg(f->args, int);
- f->prec = 1;
- return __fmtcpy(f, (const char*)x, 1, 1);
-}
-
-/* fmt out one rune */
-int
-__runefmt(Fmt *f)
-{
- Rune x[1];
-
- x[0] = (Rune)va_arg(f->args, int);
- return __fmtrcpy(f, (const void*)x, 1);
-}
-
-/* public helper routine: fmt out a null terminated string already in hand */
-int
-fmtstrcpy(Fmt *f, char *s)
-{
- int i, j;
-
- if(!s)
- return __fmtcpy(f, "<nil>", 5, 5);
- /* if precision is specified, make sure we don't wander off the end */
- if(f->flags & FmtPrec){
-#ifdef PLAN9PORT
- Rune r;
- i = 0;
- for(j=0; j<f->prec && s[i]; j++)
- i += chartorune(&r, s+i);
-#else
- /* ANSI requires precision in bytes, not Runes */
- for(i=0; i<f->prec; i++)
- if(s[i] == 0)
- break;
- j = utfnlen(s, i); /* won't print partial at end */
-#endif
- return __fmtcpy(f, s, j, i);
- }
- return __fmtcpy(f, s, utflen(s), (int)strlen(s));
-}
-
-/* fmt out a null terminated utf string */
-int
-__strfmt(Fmt *f)
-{
- char *s;
-
- s = va_arg(f->args, char *);
- return fmtstrcpy(f, s);
-}
-
-/* public helper routine: fmt out a null terminated rune string already in hand */
-int
-fmtrunestrcpy(Fmt *f, Rune *s)
-{
- Rune *e;
- int n, p;
-
- if(!s)
- return __fmtcpy(f, "<nil>", 5, 5);
- /* if precision is specified, make sure we don't wander off the end */
- if(f->flags & FmtPrec){
- p = f->prec;
- for(n = 0; n < p; n++)
- if(s[n] == 0)
- break;
- }else{
- for(e = s; *e; e++)
- ;
- n = (int)(e - s);
- }
- return __fmtrcpy(f, s, n);
-}
-
-/* fmt out a null terminated rune string */
-int
-__runesfmt(Fmt *f)
-{
- Rune *s;
-
- s = va_arg(f->args, Rune *);
- return fmtrunestrcpy(f, s);
-}
-
-/* fmt a % */
-int
-__percentfmt(Fmt *f)
-{
- Rune x[1];
-
- x[0] = f->r;
- f->prec = 1;
- return __fmtrcpy(f, (const void*)x, 1);
-}
-
-/* fmt an integer */
-int
-__ifmt(Fmt *f)
-{
- char buf[140], *p, *conv;
- /* 140: for 64 bits of binary + 3-byte sep every 4 digits */
- uvlong vu;
- ulong fl, u;
- int neg, base, i, n, w, isv;
- int ndig, len, excess, bytelen;
- char *grouping;
- char *thousands;
-
- neg = 0;
- fl = f->flags;
- isv = 0;
- vu = 0;
- u = 0;
-#ifndef PLAN9PORT
- /*
- * Unsigned verbs for ANSI C
- */
- switch(f->r){
- case 'o':
- case 'p':
- case 'u':
- case 'x':
- case 'X':
- fl |= FmtUnsigned;
- fl &= ~(FmtSign|FmtSpace);
- break;
- }
-#endif
- if(f->r == 'p'){
- u = (uintptr)va_arg(f->args, void*);
- f->r = 'x';
- fl |= FmtUnsigned;
- }else if(fl & FmtVLong){
- isv = 1;
- if(fl & FmtUnsigned)
- vu = va_arg(f->args, uvlong);
- else
- vu = (uvlong)va_arg(f->args, vlong);
- }else if(fl & FmtLong){
- if(fl & FmtUnsigned)
- u = va_arg(f->args, ulong);
- else
- u = (ulong)va_arg(f->args, long);
- }else if(fl & FmtByte){
- if(fl & FmtUnsigned)
- u = (uchar)va_arg(f->args, int);
- else
- u = (ulong)(char)va_arg(f->args, int);
- }else if(fl & FmtShort){
- if(fl & FmtUnsigned)
- u = (ushort)va_arg(f->args, int);
- else
- u = (ulong)(short)va_arg(f->args, int);
- }else{
- if(fl & FmtUnsigned)
- u = va_arg(f->args, uint);
- else
- u = (ulong)va_arg(f->args, int);
- }
- conv = "0123456789abcdef";
- grouping = "\4"; /* for hex, octal etc. (undefined by spec but nice) */
- thousands = f->thousands;
- switch(f->r){
- case 'd':
- case 'i':
- case 'u':
- base = 10;
- grouping = f->grouping;
- break;
- case 'X':
- conv = "0123456789ABCDEF";
- /* fall through */
- case 'x':
- base = 16;
- thousands = ":";
- break;
- case 'b':
- base = 2;
- thousands = ":";
- break;
- case 'o':
- base = 8;
- break;
- default:
- return -1;
- }
- if(!(fl & FmtUnsigned)){
- if(isv && (vlong)vu < 0){
- vu = (uvlong)-(vlong)vu;
- neg = 1;
- }else if(!isv && (long)u < 0){
- u = (ulong)-(long)u;
- neg = 1;
- }
- }
- p = buf + sizeof buf - 1;
- n = 0; /* in runes */
- excess = 0; /* number of bytes > number runes */
- ndig = 0;
- len = utflen(thousands);
- bytelen = (int)strlen(thousands);
- if(isv){
- while(vu){
- i = (int)(vu % (uvlong)base);
- vu /= (uvlong)base;
- if((fl & FmtComma) && n % 4 == 3){
- *p-- = ',';
- n++;
- }
- if((fl & FmtApost) && __needsep(&ndig, &grouping)){
- n += len;
- excess += bytelen - len;
- p -= bytelen;
- memmove(p+1, thousands, (size_t)bytelen);
- }
- *p-- = conv[i];
- n++;
- }
- }else{
- while(u){
- i = (int)(u % (ulong)base);
- u /= (ulong)base;
- if((fl & FmtComma) && n % 4 == 3){
- *p-- = ',';
- n++;
- }
- if((fl & FmtApost) && __needsep(&ndig, &grouping)){
- n += len;
- excess += bytelen - len;
- p -= bytelen;
- memmove(p+1, thousands, (size_t)bytelen);
- }
- *p-- = conv[i];
- n++;
- }
- }
- if(n == 0){
- /*
- * "The result of converting a zero value with
- * a precision of zero is no characters." - ANSI
- *
- * "For o conversion, # increases the precision, if and only if
- * necessary, to force the first digit of the result to be a zero
- * (if the value and precision are both 0, a single 0 is printed)." - ANSI
- */
- if(!(fl & FmtPrec) || f->prec != 0 || (f->r == 'o' && (fl & FmtSharp))){
- *p-- = '0';
- n = 1;
- if(fl & FmtApost)
- __needsep(&ndig, &grouping);
- }
- }
- for(w = f->prec; n < w && p > buf+3; n++){
- if((fl & FmtApost) && __needsep(&ndig, &grouping)){
- n += len;
- excess += bytelen - len;
- p -= bytelen;
- memmove(p+1, thousands, (size_t)bytelen);
- }
- *p-- = '0';
- }
- if(neg || (fl & (FmtSign|FmtSpace)))
- n++;
- if(fl & FmtSharp){
- if(base == 16)
- n += 2;
- else if(base == 8){
- if(p[1] == '0')
- fl &= ~(ulong)FmtSharp;
- else
- n++;
- }
- }
- if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){
- w = 0;
- if(fl & FmtWidth)
- w = f->width;
- for(; n < w && p > buf+3; n++){
- if((fl & FmtApost) && __needsep(&ndig, &grouping)){
- n += len;
- excess += bytelen - len;
- p -= bytelen;
- memmove(p+1, thousands, (size_t)bytelen);
- }
- *p-- = '0';
- }
- f->flags &= ~(ulong)FmtWidth;
- }
- if(fl & FmtSharp){
- if(base == 16)
- *p-- = (char)f->r;
- if(base == 16 || base == 8)
- *p-- = '0';
- }
- if(neg)
- *p-- = '-';
- else if(fl & FmtSign)
- *p-- = '+';
- else if(fl & FmtSpace)
- *p-- = ' ';
- f->flags &= ~(ulong)FmtPrec;
- return __fmtcpy(f, p + 1, n, n + excess);
-}
-
-int
-__countfmt(Fmt *f)
-{
- void *p;
- ulong fl;
-
- fl = f->flags;
- p = va_arg(f->args, void*);
- if(fl & FmtVLong){
- *(vlong*)p = f->nfmt;
- }else if(fl & FmtLong){
- *(long*)p = f->nfmt;
- }else if(fl & FmtByte){
- *(char*)p = (char)f->nfmt;
- }else if(fl & FmtShort){
- *(short*)p = (short)f->nfmt;
- }else{
- *(int*)p = f->nfmt;
- }
- return 0;
-}
-
-int
-__flagfmt(Fmt *f)
-{
- switch(f->r){
- case ',':
- f->flags |= FmtComma;
- break;
- case '-':
- f->flags |= FmtLeft;
- break;
- case '+':
- f->flags |= FmtSign;
- break;
- case '#':
- f->flags |= FmtSharp;
- break;
- case '\'':
- f->flags |= FmtApost;
- break;
- case ' ':
- f->flags |= FmtSpace;
- break;
- case 'u':
- f->flags |= FmtUnsigned;
- break;
- case 'h':
- if(f->flags & FmtShort)
- f->flags |= FmtByte;
- f->flags |= FmtShort;
- break;
- case 'L':
- f->flags |= FmtLDouble;
- break;
- case 'l':
- if(f->flags & FmtLong)
- f->flags |= FmtVLong;
- f->flags |= FmtLong;
- break;
- }
- return 1;
-}
-
-/* default error format */
-int
-__badfmt(Fmt *f)
-{
- char x[2+UTFmax];
- int n;
-
- x[0] = '%';
- n = 1 + runetochar(x+1, &f->r);
- x[n++] = '%';
- f->prec = n;
- __fmtcpy(f, (const void*)x, n, n);
- return 0;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/* format the output into f->to and return the number of characters fmted */
-
-/* BUG: THIS FILE IS NOT UPDATED TO THE NEW SPEC */
-int
-dorfmt(Fmt *f, const Rune *fmt)
-{
- Rune *rt, *rs;
- Rune r;
- char *t, *s;
- int nfmt;
-
- nfmt = f->nfmt;
- for(;;){
- if(f->runes){
- rt = (Rune*)f->to;
- rs = (Rune*)f->stop;
- while((r = *fmt++) && r != '%'){
- FMTRCHAR(f, rt, rs, r);
- }
- f->nfmt += (int)(rt - (Rune *)f->to);
- f->to = rt;
- if(!r)
- return f->nfmt - nfmt;
- f->stop = rs;
- }else{
- t = (char*)f->to;
- s = (char*)f->stop;
- while((r = *fmt++) && r != '%'){
- FMTRUNE(f, t, f->stop, r);
- }
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- if(!r)
- return f->nfmt - nfmt;
- f->stop = s;
- }
-
- fmt = (Rune*)__fmtdispatch(f, (Rune*)fmt, 1);
- if(fmt == nil)
- return -1;
- }
-}
+++ /dev/null
-// +build plan9
-
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-__errfmt(Fmt *f)
-{
- char buf[ERRMAX];
-
- rerrstr(buf, sizeof buf);
- return __fmtcpy(f, buf, utflen(buf), strlen(buf));
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-enum
-{
- FDIGIT = 30,
- FDEFLT = 6,
- NSIGNIF = 17
-};
-
-/*
- * first few powers of 10, enough for about 1/2 of the
- * total space for doubles.
- */
-static double pows10[] =
-{
- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
- 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
- 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,
- 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
- 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49,
- 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59,
- 1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69,
- 1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79,
- 1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89,
- 1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99,
- 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
- 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
- 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
- 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
- 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
- 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
-};
-
-#undef pow10
-#define npows10 ((int)(sizeof(pows10)/sizeof(pows10[0])))
-#define pow10(x) fmtpow10(x)
-
-static double
-pow10(int n)
-{
- double d;
- int neg;
-
- neg = 0;
- if(n < 0){
- neg = 1;
- n = -n;
- }
-
- if(n < npows10)
- d = pows10[n];
- else{
- d = pows10[npows10-1];
- for(;;){
- n -= npows10 - 1;
- if(n < npows10){
- d *= pows10[n];
- break;
- }
- d *= pows10[npows10 - 1];
- }
- }
- if(neg)
- return 1./d;
- return d;
-}
-
-/*
- * add 1 to the decimal integer string a of length n.
- * if 99999 overflows into 10000, return 1 to tell caller
- * to move the virtual decimal point.
- */
-static int
-xadd1(char *a, int n)
-{
- char *b;
- int c;
-
- if(n < 0 || n > NSIGNIF)
- return 0;
- for(b = a+n-1; b >= a; b--) {
- c = *b + 1;
- if(c <= '9') {
- *b = (char)c;
- return 0;
- }
- *b = '0';
- }
- /*
- * need to overflow adding digit.
- * shift number down and insert 1 at beginning.
- * decimal is known to be 0s or we wouldn't
- * have gotten this far. (e.g., 99999+1 => 00000)
- */
- a[0] = '1';
- return 1;
-}
-
-/*
- * subtract 1 from the decimal integer string a.
- * if 10000 underflows into 09999, make it 99999
- * and return 1 to tell caller to move the virtual
- * decimal point. this way, xsub1 is inverse of xadd1.
- */
-static int
-xsub1(char *a, int n)
-{
- char *b;
- int c;
-
- if(n < 0 || n > NSIGNIF)
- return 0;
- for(b = a+n-1; b >= a; b--) {
- c = *b - 1;
- if(c >= '0') {
- if(c == '0' && b == a) {
- /*
- * just zeroed the top digit; shift everyone up.
- * decimal is known to be 9s or we wouldn't
- * have gotten this far. (e.g., 10000-1 => 09999)
- */
- *b = '9';
- return 1;
- }
- *b = (char)c;
- return 0;
- }
- *b = '9';
- }
- /*
- * can't get here. the number a is always normalized
- * so that it has a nonzero first digit.
- */
- abort();
- return 0;
-}
-
-/*
- * format exponent like sprintf(p, "e%+02d", e)
- */
-static void
-xfmtexp(char *p, int e, int ucase)
-{
- char se[9];
- int i;
-
- *p++ = ucase ? 'E' : 'e';
- if(e < 0) {
- *p++ = '-';
- e = -e;
- } else
- *p++ = '+';
- i = 0;
- while(e) {
- se[i++] = (char)(e % 10 + '0');
- e /= 10;
- }
- while(i < 2)
- se[i++] = '0';
- while(i > 0)
- *p++ = se[--i];
- *p = '\0';
-}
-
-/*
- * compute decimal integer m, exp such that:
- * f = m*10^exp
- * m is as short as possible with losing exactness
- * assumes special cases (NaN, +Inf, -Inf) have been handled.
- */
-static void
-xdtoa(double f, char *s, int *exp, int *neg, int *ns)
-{
- int d, e2, e, ee, i, ndigit;
- int oerrno;
- char c;
- char tmp[NSIGNIF+10];
- double g;
-
- oerrno = errno; /* in case strtod smashes errno */
-
- /*
- * make f non-negative.
- */
- *neg = 0;
- if(f < 0) {
- f = -f;
- *neg = 1;
- }
-
- /*
- * must handle zero specially.
- */
- if(f == 0){
- *exp = 0;
- s[0] = '0';
- s[1] = '\0';
- *ns = 1;
- return;
- }
-
- /*
- * find g,e such that f = g*10^e.
- * guess 10-exponent using 2-exponent, then fine tune.
- */
- frexp(f, &e2);
- e = (int)(e2 * .301029995664);
- g = f * pow10(-e);
- while(g < 1) {
- e--;
- g = f * pow10(-e);
- }
- while(g >= 10) {
- e++;
- g = f * pow10(-e);
- }
-
- /*
- * convert NSIGNIF digits as a first approximation.
- */
- for(i=0; i<NSIGNIF; i++) {
- d = (int)g;
- s[i] = (char)(d+'0');
- g = (g-d) * 10;
- }
- s[i] = 0;
-
- /*
- * adjust e because s is 314159... not 3.14159...
- */
- e -= NSIGNIF-1;
- xfmtexp(s+NSIGNIF, e, 0);
-
- /*
- * adjust conversion until strtod(s) == f exactly.
- */
- for(i=0; i<10; i++) {
- g = strtod(s, nil);
- if(f > g) {
- if(xadd1(s, NSIGNIF)) {
- /* gained a digit */
- e--;
- xfmtexp(s+NSIGNIF, e, 0);
- }
- continue;
- }
- if(f < g) {
- if(xsub1(s, NSIGNIF)) {
- /* lost a digit */
- e++;
- xfmtexp(s+NSIGNIF, e, 0);
- }
- continue;
- }
- break;
- }
-
- /*
- * play with the decimal to try to simplify.
- */
-
- /*
- * bump last few digits up to 9 if we can
- */
- for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) {
- c = s[i];
- if(c != '9') {
- s[i] = '9';
- g = strtod(s, nil);
- if(g != f) {
- s[i] = c;
- break;
- }
- }
- }
-
- /*
- * add 1 in hopes of turning 9s to 0s
- */
- if(s[NSIGNIF-1] == '9') {
- strcpy(tmp, s);
- ee = e;
- if(xadd1(tmp, NSIGNIF)) {
- ee--;
- xfmtexp(tmp+NSIGNIF, ee, 0);
- }
- g = strtod(tmp, nil);
- if(g == f) {
- strcpy(s, tmp);
- e = ee;
- }
- }
-
- /*
- * bump last few digits down to 0 as we can.
- */
- for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) {
- c = s[i];
- if(c != '0') {
- s[i] = '0';
- g = strtod(s, nil);
- if(g != f) {
- s[i] = c;
- break;
- }
- }
- }
-
- /*
- * remove trailing zeros.
- */
- ndigit = NSIGNIF;
- while(ndigit > 1 && s[ndigit-1] == '0'){
- e++;
- --ndigit;
- }
- s[ndigit] = 0;
- *exp = e;
- *ns = ndigit;
- errno = oerrno;
-}
-
-#ifdef PLAN9PORT
-static char *special[] = { "NaN", "NaN", "+Inf", "+Inf", "-Inf", "-Inf" };
-#else
-static char *special[] = { "nan", "NAN", "inf", "INF", "-inf", "-INF" };
-#endif
-
-int
-__efgfmt(Fmt *fmt)
-{
- char buf[NSIGNIF+10], *dot, *digits, *p, *s, suf[10], *t;
- double f;
- int c, chr, dotwid, e, exp, ndigits, neg, newndigits;
- int pad, point, prec, realchr, sign, sufwid, ucase, wid, z1, z2;
- ulong fl;
- Rune r, *rs, *rt;
-
- if(fmt->flags&FmtLong)
- f = (double)va_arg(fmt->args, long double);
- else
- f = va_arg(fmt->args, double);
-
- /*
- * extract formatting flags
- */
- fl = fmt->flags;
- fmt->flags = 0;
- prec = FDEFLT;
- if(fl & FmtPrec)
- prec = fmt->prec;
- chr = (int)fmt->r;
- ucase = 0;
- switch(chr) {
- case 'A':
- case 'E':
- case 'F':
- case 'G':
- chr += 'a'-'A';
- ucase = 1;
- break;
- }
-
- /*
- * pick off special numbers.
- */
- if(__isNaN(f)) {
- s = special[0+ucase];
- special:
- fmt->flags = fl & (FmtWidth|FmtLeft);
- return __fmtcpy(fmt, s, (int)strlen(s), (int)strlen(s));
- }
- if(__isInf(f, 1)) {
- s = special[2+ucase];
- goto special;
- }
- if(__isInf(f, -1)) {
- s = special[4+ucase];
- goto special;
- }
-
- /*
- * get exact representation.
- */
- digits = buf;
- xdtoa(f, digits, &exp, &neg, &ndigits);
-
- /*
- * get locale's decimal point.
- */
- dot = fmt->decimal;
- if(dot == nil)
- dot = ".";
- dotwid = utflen(dot);
-
- /*
- * now the formatting fun begins.
- * compute parameters for actual fmt:
- *
- * pad: number of spaces to insert before/after field.
- * z1: number of zeros to insert before digits
- * z2: number of zeros to insert after digits
- * point: number of digits to print before decimal point
- * ndigits: number of digits to use from digits[]
- * suf: trailing suffix, like "e-5"
- */
- realchr = chr;
- switch(chr){
- case 'g':
- /*
- * convert to at most prec significant digits. (prec=0 means 1)
- */
- if(prec == 0)
- prec = 1;
- if(ndigits > prec) {
- if(digits[prec] >= '5' && xadd1(digits, prec))
- exp++;
- exp += ndigits-prec;
- ndigits = prec;
- }
-
- /*
- * extra rules for %g (implemented below):
- * trailing zeros removed after decimal unless FmtSharp.
- * decimal point only if digit follows.
- */
-
- /* fall through to %e */
- default:
- case 'e':
- /*
- * one significant digit before decimal, no leading zeros.
- */
- point = 1;
- z1 = 0;
-
- /*
- * decimal point is after ndigits digits right now.
- * slide to be after first.
- */
- e = exp + (ndigits-1);
-
- /*
- * if this is %g, check exponent and convert prec
- */
- if(realchr == 'g') {
- if(-4 <= e && e < prec)
- goto casef;
- prec--; /* one digit before decimal; rest after */
- }
-
- /*
- * compute trailing zero padding or truncate digits.
- */
- if(1+prec >= ndigits)
- z2 = 1+prec - ndigits;
- else {
- /*
- * truncate digits
- */
- assert(realchr != 'g');
- newndigits = 1+prec;
- if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) {
- /*
- * had 999e4, now have 100e5
- */
- e++;
- }
- ndigits = newndigits;
- z2 = 0;
- }
- xfmtexp(suf, e, ucase);
- sufwid = (int)strlen(suf);
- break;
-
- casef:
- case 'f':
- /*
- * determine where digits go with respect to decimal point
- */
- if(ndigits+exp > 0) {
- point = ndigits+exp;
- z1 = 0;
- } else {
- point = 1;
- z1 = 1 + -(ndigits+exp);
- }
-
- /*
- * %g specifies prec = number of significant digits
- * convert to number of digits after decimal point
- */
- if(realchr == 'g')
- prec += z1 - point;
-
- /*
- * compute trailing zero padding or truncate digits.
- */
- if(point+prec >= z1+ndigits)
- z2 = point+prec - (z1+ndigits);
- else {
- /*
- * truncate digits
- */
- assert(realchr != 'g');
- newndigits = point+prec - z1;
- if(newndigits < 0) {
- z1 += newndigits;
- newndigits = 0;
- } else if(newndigits == 0) {
- /* perhaps round up */
- if(digits[0] >= '5'){
- digits[0] = '1';
- newndigits = 1;
- goto newdigit;
- }
- } else if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) {
- /*
- * digits was 999, is now 100; make it 1000
- */
- digits[newndigits++] = '0';
- newdigit:
- /*
- * account for new digit
- */
- if(z1) /* 0.099 => 0.100 or 0.99 => 1.00*/
- z1--;
- else /* 9.99 => 10.00 */
- point++;
- }
- z2 = 0;
- ndigits = newndigits;
- }
- sufwid = 0;
- break;
- }
-
- /*
- * if %g is given without FmtSharp, remove trailing zeros.
- * must do after truncation, so that e.g. print %.3g 1.001
- * produces 1, not 1.00. sorry, but them's the rules.
- */
- if(realchr == 'g' && !(fl & FmtSharp)) {
- if(z1+ndigits+z2 >= point) {
- if(z1+ndigits < point)
- z2 = point - (z1+ndigits);
- else{
- z2 = 0;
- while(z1+ndigits > point && digits[ndigits-1] == '0')
- ndigits--;
- }
- }
- }
-
- /*
- * compute width of all digits and decimal point and suffix if any
- */
- wid = z1+ndigits+z2;
- if(wid > point)
- wid += dotwid;
- else if(wid == point){
- if(fl & FmtSharp)
- wid += dotwid;
- else
- point++; /* do not print any decimal point */
- }
- wid += sufwid;
-
- /*
- * determine sign
- */
- sign = 0;
- if(neg)
- sign = '-';
- else if(fl & FmtSign)
- sign = '+';
- else if(fl & FmtSpace)
- sign = ' ';
- if(sign)
- wid++;
-
- /*
- * compute padding
- */
- pad = 0;
- if((fl & FmtWidth) && fmt->width > wid)
- pad = fmt->width - wid;
- if(pad && !(fl & FmtLeft) && (fl & FmtZero)){
- z1 += pad;
- point += pad;
- pad = 0;
- }
-
- /*
- * format the actual field. too bad about doing this twice.
- */
- if(fmt->runes){
- if(pad && !(fl & FmtLeft) && __rfmtpad(fmt, pad) < 0)
- return -1;
- rt = (Rune*)fmt->to;
- rs = (Rune*)fmt->stop;
- if(sign)
- FMTRCHAR(fmt, rt, rs, sign);
- while(z1>0 || ndigits>0 || z2>0) {
- if(z1 > 0){
- z1--;
- c = '0';
- }else if(ndigits > 0){
- ndigits--;
- c = *digits++;
- }else{
- z2--;
- c = '0';
- }
- FMTRCHAR(fmt, rt, rs, c);
- if(--point == 0) {
- for(p = dot; *p; ){
- p += chartorune(&r, p);
- FMTRCHAR(fmt, rt, rs, r);
- }
- }
- }
- fmt->nfmt += (int)(rt - (Rune*)fmt->to);
- fmt->to = rt;
- if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0)
- return -1;
- if(pad && (fl & FmtLeft) && __rfmtpad(fmt, pad) < 0)
- return -1;
- }else{
- if(pad && !(fl & FmtLeft) && __fmtpad(fmt, pad) < 0)
- return -1;
- t = (char*)fmt->to;
- s = (char*)fmt->stop;
- if(sign)
- FMTCHAR(fmt, t, s, sign);
- while(z1>0 || ndigits>0 || z2>0) {
- if(z1 > 0){
- z1--;
- c = '0';
- }else if(ndigits > 0){
- ndigits--;
- c = *digits++;
- }else{
- z2--;
- c = '0';
- }
- FMTCHAR(fmt, t, s, c);
- if(--point == 0)
- for(p=dot; *p; p++)
- FMTCHAR(fmt, t, s, *p);
- }
- fmt->nfmt += (int)(t - (char*)fmt->to);
- fmt->to = t;
- if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0)
- return -1;
- if(pad && (fl & FmtLeft) && __fmtpad(fmt, pad) < 0)
- return -1;
- }
- return 0;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-enum
-{
- Maxfmt = 64
-};
-
-typedef struct Convfmt Convfmt;
-struct Convfmt
-{
- int c;
- volatile Fmts fmt; /* for spin lock in fmtfmt; avoids race due to write order */
-};
-
-static struct
-{
- /* lock by calling __fmtlock, __fmtunlock */
- int nfmt;
- Convfmt fmt[Maxfmt];
-} fmtalloc;
-
-static Convfmt knownfmt[] = {
- ' ', __flagfmt,
- '#', __flagfmt,
- '%', __percentfmt,
- '\'', __flagfmt,
- '+', __flagfmt,
- ',', __flagfmt,
- '-', __flagfmt,
- 'C', __runefmt, /* Plan 9 addition */
- 'E', __efgfmt,
-#ifndef PLAN9PORT
- 'F', __efgfmt, /* ANSI only */
-#endif
- 'G', __efgfmt,
-#ifndef PLAN9PORT
- 'L', __flagfmt, /* ANSI only */
-#endif
- 'S', __runesfmt, /* Plan 9 addition */
- 'X', __ifmt,
- 'b', __ifmt, /* Plan 9 addition */
- 'c', __charfmt,
- 'd', __ifmt,
- 'e', __efgfmt,
- 'f', __efgfmt,
- 'g', __efgfmt,
- 'h', __flagfmt,
-#ifndef PLAN9PORT
- 'i', __ifmt, /* ANSI only */
-#endif
- 'l', __flagfmt,
- 'n', __countfmt,
- 'o', __ifmt,
- 'p', __ifmt,
- 'r', __errfmt,
- 's', __strfmt,
-#ifdef PLAN9PORT
- 'u', __flagfmt,
-#else
- 'u', __ifmt,
-#endif
- 'x', __ifmt,
- 0, nil,
-};
-
-
-int (*fmtdoquote)(int);
-
-/*
- * __fmtlock() must be set
- */
-static int
-__fmtinstall(int c, Fmts f)
-{
- Convfmt *p, *ep;
-
- if(c<=0 || c>=65536)
- return -1;
- if(!f)
- f = __badfmt;
-
- ep = &fmtalloc.fmt[fmtalloc.nfmt];
- for(p=fmtalloc.fmt; p<ep; p++)
- if(p->c == c)
- break;
-
- if(p == &fmtalloc.fmt[Maxfmt])
- return -1;
-
- p->fmt = f;
- if(p == ep){ /* installing a new format character */
- fmtalloc.nfmt++;
- p->c = c;
- }
-
- return 0;
-}
-
-int
-fmtinstall(int c, int (*f)(Fmt*))
-{
- int ret;
-
- __fmtlock();
- ret = __fmtinstall(c, f);
- __fmtunlock();
- return ret;
-}
-
-static Fmts
-fmtfmt(int c)
-{
- Convfmt *p, *ep;
-
- ep = &fmtalloc.fmt[fmtalloc.nfmt];
- for(p=fmtalloc.fmt; p<ep; p++)
- if(p->c == c){
- while(p->fmt == nil) /* loop until value is updated */
- ;
- return p->fmt;
- }
-
- /* is this a predefined format char? */
- __fmtlock();
- for(p=knownfmt; p->c; p++)
- if(p->c == c){
- __fmtinstall(p->c, p->fmt);
- __fmtunlock();
- return p->fmt;
- }
- __fmtunlock();
-
- return __badfmt;
-}
-
-void*
-__fmtdispatch(Fmt *f, void *fmt, int isrunes)
-{
- Rune rune, r;
- int i, n;
-
- f->flags = 0;
- f->width = f->prec = 0;
-
- for(;;){
- if(isrunes){
- r = *(Rune*)fmt;
- fmt = (Rune*)fmt + 1;
- }else{
- fmt = (char*)fmt + chartorune(&rune, (char*)fmt);
- r = rune;
- }
- f->r = r;
- switch(r){
- case '\0':
- return nil;
- case '.':
- f->flags |= FmtWidth|FmtPrec;
- continue;
- case '0':
- if(!(f->flags & FmtWidth)){
- f->flags |= FmtZero;
- continue;
- }
- /* fall through */
- case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- i = 0;
- while(r >= '0' && r <= '9'){
- i = i * 10 + (int)r - '0';
- if(isrunes){
- r = *(Rune*)fmt;
- fmt = (Rune*)fmt + 1;
- }else{
- r = (Rune)*(char*)fmt;
- fmt = (char*)fmt + 1;
- }
- }
- if(isrunes)
- fmt = (Rune*)fmt - 1;
- else
- fmt = (char*)fmt - 1;
- numflag:
- if(f->flags & FmtWidth){
- f->flags |= FmtPrec;
- f->prec = i;
- }else{
- f->flags |= FmtWidth;
- f->width = i;
- }
- continue;
- case '*':
- i = va_arg(f->args, int);
- if(i < 0){
- /*
- * negative precision =>
- * ignore the precision.
- */
- if(f->flags & FmtPrec){
- f->flags &= ~(ulong)FmtPrec;
- f->prec = 0;
- continue;
- }
- i = -i;
- f->flags |= FmtLeft;
- }
- goto numflag;
- }
- n = (*fmtfmt((int)r))(f);
- if(n < 0)
- return nil;
- if(n == 0)
- return fmt;
- }
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/*
- * dofmt -- format to a buffer
- * the number of characters formatted is returned,
- * or -1 if there was an error.
- * if the buffer is ever filled, flush is called.
- * it should reset the buffer and return whether formatting should continue.
- */
-
-typedef int (*Fmts)(Fmt*);
-
-typedef struct Quoteinfo Quoteinfo;
-struct Quoteinfo
-{
- int quoted; /* if set, string must be quoted */
- int nrunesin; /* number of input runes that can be accepted */
- int nbytesin; /* number of input bytes that can be accepted */
- int nrunesout; /* number of runes that will be generated */
- int nbytesout; /* number of bytes that will be generated */
-};
-
-/* Edit .+1,/^$/ |cfn |grep -v static | grep __ */
-double __Inf(int sign);
-double __NaN(void);
-int __badfmt(Fmt *f);
-int __charfmt(Fmt *f);
-int __countfmt(Fmt *f);
-int __efgfmt(Fmt *fmt);
-int __errfmt(Fmt *f);
-int __flagfmt(Fmt *f);
-int __fmtFdFlush(Fmt *f);
-int __fmtcpy(Fmt *f, const void *vm, int n, int sz);
-void* __fmtdispatch(Fmt *f, void *fmt, int isrunes);
-void * __fmtflush(Fmt *f, void *t, int len);
-void __fmtlock(void);
-int __fmtpad(Fmt *f, int n);
-double __fmtpow10(int n);
-int __fmtrcpy(Fmt *f, const void *vm, int n);
-void __fmtunlock(void);
-int __ifmt(Fmt *f);
-int __isInf(double d, int sign);
-int __isNaN(double d);
-int __needsep(int*, char**);
-int __needsquotes(char *s, int *quotelenp);
-int __percentfmt(Fmt *f);
-void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout);
-int __quotestrfmt(int runesin, Fmt *f);
-int __rfmtpad(Fmt *f, int n);
-int __runefmt(Fmt *f);
-int __runeneedsquotes(Rune *r, int *quotelenp);
-int __runesfmt(Fmt *f);
-int __strfmt(Fmt *f);
-
-#define FMTCHAR(f, t, s, c)\
- do{\
- if(t + 1 > (char*)s){\
- t = (char*)__fmtflush(f, t, 1);\
- if(t != nil)\
- s = (char*)f->stop;\
- else\
- return -1;\
- }\
- *t++ = (char)c;\
- }while(0)
-
-#define FMTRCHAR(f, t, s, c)\
- do{\
- if(t + 1 > (Rune*)s){\
- t = (Rune*)__fmtflush(f, t, sizeof(Rune));\
- if(t != nil)\
- s = (Rune*)f->stop;\
- else\
- return -1;\
- }\
- *t++ = (Rune)c;\
- }while(0)
-
-#define FMTRUNE(f, t, s, r)\
- do{\
- Rune _rune;\
- int _runelen;\
- if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
- t = (char*)__fmtflush(f, t, _runelen);\
- if(t != nil)\
- s = (char*)f->stop;\
- else\
- return -1;\
- }\
- if(r < Runeself)\
- *t++ = (char)r;\
- else{\
- _rune = r;\
- t += runetochar(t, &_rune);\
- }\
- }while(0)
-
-#ifdef va_copy
-# define VA_COPY(a,b) va_copy(a,b)
-# define VA_END(a) va_end(a)
-#else
-# define VA_COPY(a,b) (a) = (b)
-# define VA_END(a)
-#endif
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * public routine for final flush of a formatting buffer
- * to a file descriptor; returns total char count.
- */
-int
-fmtfdflush(Fmt *f)
-{
- if(__fmtFdFlush(f) <= 0)
- return -1;
- return f->nfmt;
-}
-
-/*
- * initialize an output buffer for buffered printing
- */
-int
-fmtfdinit(Fmt *f, int fd, char *buf, int size)
-{
- f->runes = 0;
- f->start = buf;
- f->to = buf;
- f->stop = buf + size;
- f->flush = __fmtFdFlush;
- f->farg = (void*)(uintptr)fd;
- f->flags = 0;
- f->nfmt = 0;
- fmtlocaleinit(f, nil, nil, nil);
- return 0;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * generic routine for flushing a formatting buffer
- * to a file descriptor
- */
-int
-__fmtFdFlush(Fmt *f)
-{
- int n;
-
- n = (int)((char*)f->to - (char*)f->start);
- if(n && (int)write((int)(uintptr)f->farg, f->start, (size_t)n) != n)
- return 0;
- f->to = f->start;
- return 1;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Fill in the internationalization stuff in the State structure.
- * For nil arguments, provide the sensible defaults:
- * decimal is a period
- * thousands separator is a comma
- * thousands are marked every three digits
- */
-void
-fmtlocaleinit(Fmt *f, char *decimal, char *thousands, char *grouping)
-{
- if(decimal == nil || decimal[0] == '\0')
- decimal = ".";
- if(thousands == nil)
- thousands = ",";
- if(grouping == nil)
- grouping = "\3";
- f->decimal = decimal;
- f->thousands = thousands;
- f->grouping = grouping;
-}
-
-/*
- * We are about to emit a digit in e.g. %'d. If that digit would
- * overflow a thousands (e.g.) grouping, tell the caller to emit
- * the thousands separator. Always advance the digit counter
- * and pointer into the grouping descriptor.
- */
-int
-__needsep(int *ndig, char **grouping)
-{
- int group;
-
- (*ndig)++;
- group = *(unsigned char*)*grouping;
- /* CHAR_MAX means no further grouping. \0 means we got the empty string */
- if(group == 0xFF || group == 0x7f || group == 0x00)
- return 0;
- if(*ndig > group){
- /* if we're at end of string, continue with this grouping; else advance */
- if((*grouping)[1] != '\0')
- (*grouping)++;
- *ndig = 1;
- return 1;
- }
- return 0;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-void
-__fmtlock(void)
-{
-}
-
-void
-__fmtunlock(void)
-{
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Absorb output without using resources.
- */
-static Rune nullbuf[32];
-
-static int
-__fmtnullflush(Fmt *f)
-{
- f->to = nullbuf;
- f->nfmt = 0;
- return 0;
-}
-
-int
-fmtnullinit(Fmt *f)
-{
- memset(f, 0, sizeof *f);
- f->runes = 1;
- f->start = nullbuf;
- f->to = nullbuf;
- f->stop = nullbuf+nelem(nullbuf);
- f->flush = __fmtnullflush;
- fmtlocaleinit(f, nil, nil, nil);
- return 0;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Format a string into the output buffer.
- * Designed for formats which themselves call fmt.
- * Flags, precision and width are preserved.
- */
-int
-fmtprint(Fmt *f, char *fmt, ...)
-{
- int n;
- va_list va;
-
- va_start(va, fmt);
- n = fmtvprint(f, fmt, va);
- va_end(va);
- return n;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * How many bytes of output UTF will be produced by quoting (if necessary) this string?
- * How many runes? How much of the input will be consumed?
- * The parameter q is filled in by __quotesetup.
- * The string may be UTF or Runes (s or r).
- * Return count does not include NUL.
- * Terminate the scan at the first of:
- * NUL in input
- * count exceeded in input
- * count exceeded on output
- * *ninp is set to number of input bytes accepted.
- * nin may be <0 initially, to avoid checking input by count.
- */
-void
-__quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout)
-{
- int w;
- Rune c;
-
- q->quoted = 0;
- q->nbytesout = 0;
- q->nrunesout = 0;
- q->nbytesin = 0;
- q->nrunesin = 0;
- if(sharp || nin==0 || (s && *s=='\0') || (r && *r=='\0')){
- if(nout < 2)
- return;
- q->quoted = 1;
- q->nbytesout = 2;
- q->nrunesout = 2;
- }
- for(; nin!=0; nin--){
- if(s)
- w = chartorune(&c, s);
- else{
- c = *r;
- w = runelen(c);
- }
-
- if(c == '\0')
- break;
- if(runesout){
- if(q->nrunesout+1 > nout)
- break;
- }else{
- if(q->nbytesout+w > nout)
- break;
- }
-
- if((c <= L' ') || (c == L'\'') || (fmtdoquote!=nil && fmtdoquote((int)c))){
- if(!q->quoted){
- if(runesout){
- if(1+q->nrunesout+1+1 > nout) /* no room for quotes */
- break;
- }else{
- if(1+q->nbytesout+w+1 > nout) /* no room for quotes */
- break;
- }
- q->nrunesout += 2; /* include quotes */
- q->nbytesout += 2; /* include quotes */
- q->quoted = 1;
- }
- if(c == '\'') {
- if(runesout){
- if(1+q->nrunesout+1 > nout) /* no room for quotes */
- break;
- }else{
- if(1+q->nbytesout+w > nout) /* no room for quotes */
- break;
- }
- q->nbytesout++;
- q->nrunesout++; /* quotes reproduce as two characters */
- }
- }
-
- /* advance input */
- if(s)
- s += w;
- else
- r++;
- q->nbytesin += w;
- q->nrunesin++;
-
- /* advance output */
- q->nbytesout += w;
- q->nrunesout++;
-
-#ifndef PLAN9PORT
- /* ANSI requires precision in bytes, not Runes. */
- nin-= w-1; /* and then n-- in the loop */
-#endif
- }
-}
-
-static int
-qstrfmt(char *sin, Rune *rin, Quoteinfo *q, Fmt *f)
-{
- Rune r, *rm, *rme;
- char *t, *s, *m, *me;
- Rune *rt, *rs;
- ulong fl;
- int nc, w;
-
- m = sin;
- me = m + q->nbytesin;
- rm = rin;
- rme = rm + q->nrunesin;
-
- fl = f->flags;
- w = 0;
- if(fl & FmtWidth)
- w = f->width;
- if(f->runes){
- if(!(fl & FmtLeft) && __rfmtpad(f, w - q->nrunesout) < 0)
- return -1;
- }else{
- if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0)
- return -1;
- }
- t = (char*)f->to;
- s = (char*)f->stop;
- rt = (Rune*)f->to;
- rs = (Rune*)f->stop;
- if(f->runes)
- FMTRCHAR(f, rt, rs, '\'');
- else
- FMTRUNE(f, t, s, '\'');
- for(nc = q->nrunesin; nc > 0; nc--){
- if(sin){
- r = *(uchar*)m;
- if(r < Runeself)
- m++;
- else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
- m += chartorune(&r, m);
- else
- break;
- }else{
- if(rm >= rme)
- break;
- r = *(uchar*)rm++;
- }
- if(f->runes){
- FMTRCHAR(f, rt, rs, r);
- if(r == '\'')
- FMTRCHAR(f, rt, rs, r);
- }else{
- FMTRUNE(f, t, s, r);
- if(r == '\'')
- FMTRUNE(f, t, s, r);
- }
- }
-
- if(f->runes){
- FMTRCHAR(f, rt, rs, '\'');
- USED(rs);
- f->nfmt += (int)(rt - (Rune *)f->to);
- f->to = rt;
- if(fl & FmtLeft && __rfmtpad(f, w - q->nrunesout) < 0)
- return -1;
- }else{
- FMTRUNE(f, t, s, '\'');
- USED(s);
- f->nfmt += (int)(t - (char *)f->to);
- f->to = t;
- if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0)
- return -1;
- }
- return 0;
-}
-
-int
-__quotestrfmt(int runesin, Fmt *f)
-{
- int nin, outlen;
- Rune *r;
- char *s;
- Quoteinfo q;
-
- nin = -1;
- if(f->flags&FmtPrec)
- nin = f->prec;
- if(runesin){
- r = va_arg(f->args, Rune *);
- s = nil;
- }else{
- s = va_arg(f->args, char *);
- r = nil;
- }
- if(!s && !r)
- return __fmtcpy(f, (void*)"<nil>", 5, 5);
-
- if(f->flush)
- outlen = 0x7FFFFFFF; /* if we can flush, no output limit */
- else if(f->runes)
- outlen = (int)((Rune*)f->stop - (Rune*)f->to);
- else
- outlen = (int)((char*)f->stop - (char*)f->to);
-
- __quotesetup(s, r, nin, outlen, &q, f->flags&FmtSharp, f->runes);
-/*print("bytes in %d bytes out %d runes in %d runesout %d\n", q.nbytesin, q.nbytesout, q.nrunesin, q.nrunesout); */
-
- if(runesin){
- if(!q.quoted)
- return __fmtrcpy(f, r, q.nrunesin);
- return qstrfmt(nil, r, &q, f);
- }
-
- if(!q.quoted)
- return __fmtcpy(f, s, q.nrunesin, q.nbytesin);
- return qstrfmt(s, nil, &q, f);
-}
-
-int
-quotestrfmt(Fmt *f)
-{
- return __quotestrfmt(0, f);
-}
-
-int
-quoterunestrfmt(Fmt *f)
-{
- return __quotestrfmt(1, f);
-}
-
-void
-quotefmtinstall(void)
-{
- fmtinstall('q', quotestrfmt);
- fmtinstall('Q', quoterunestrfmt);
-}
-
-int
-__needsquotes(char *s, int *quotelenp)
-{
- Quoteinfo q;
-
- __quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0);
- *quotelenp = q.nbytesout;
-
- return q.quoted;
-}
-
-int
-__runeneedsquotes(Rune *r, int *quotelenp)
-{
- Quoteinfo q;
-
- __quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0);
- *quotelenp = q.nrunesout;
-
- return q.quoted;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-fmtrune(Fmt *f, int r)
-{
- Rune *rt;
- char *t;
- int n;
-
- if(f->runes){
- rt = (Rune*)f->to;
- FMTRCHAR(f, rt, f->stop, r);
- f->to = rt;
- n = 1;
- }else{
- t = (char*)f->to;
- FMTRUNE(f, t, f->stop, (Rune)r);
- n = (int)(t - (char*)f->to);
- f->to = t;
- }
- f->nfmt += n;
- return 0;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-fmtstrflush(Fmt *f)
-{
- if(f->start == nil)
- return nil;
- *(char*)f->to = '\0';
- f->to = f->start;
- return (char*)f->start;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-
-/*
- * Format a string into the output buffer.
- * Designed for formats which themselves call fmt.
- * Flags, precision and width are preserved.
- */
-int
-fmtvprint(Fmt *f, char *fmt, va_list args)
-{
- va_list va;
- int n, w, p;
- unsigned long fl;
-
- w = f->width;
- p = f->prec;
- fl = f->flags;
- VA_COPY(va, f->args);
- VA_END(f->args);
- VA_COPY(f->args, args);
- n = dofmt(f, fmt);
- VA_END(f->args);
- VA_COPY(f->args, va);
- VA_END(va);
- f->width = w;
- f->prec = p;
- f->flags = fl;
- if(n >= 0)
- return 0;
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-fprint(int fd, char *fmt, ...)
-{
- int n;
- va_list args;
-
- va_start(args, fmt);
- n = vfprint(fd, fmt, args);
- va_end(args);
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/*
- * 64-bit IEEE not-a-number routines.
- * This is big/little-endian portable assuming that
- * the 64-bit doubles and 64-bit integers have the
- * same byte ordering.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001;
-static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000;
-static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000;
-
-/* gcc sees through the obvious casts. */
-static uvlong
-d2u(double d)
-{
- union {
- uvlong v;
- double d;
- } u;
- assert(sizeof(u.d) == sizeof(u.v));
- u.d = d;
- return u.v;
-}
-
-static double
-u2d(uvlong v)
-{
- union {
- uvlong v;
- double d;
- } u;
- assert(sizeof(u.d) == sizeof(u.v));
- u.v = v;
- return u.d;
-}
-
-double
-__NaN(void)
-{
- return u2d(uvnan);
-}
-
-int
-__isNaN(double d)
-{
- uvlong x;
-
- x = d2u(d);
- /* IEEE 754: exponent bits 0x7FF and non-zero mantissa */
- return (x&uvinf) == uvinf && (x&~uvneginf) != 0;
-}
-
-double
-__Inf(int sign)
-{
- return u2d(sign < 0 ? uvneginf : uvinf);
-}
-
-int
-__isInf(double d, int sign)
-{
- uvlong x;
-
- x = d2u(d);
- if(sign == 0)
- return x==uvinf || x==uvneginf;
- else if(sign > 0)
- return x==uvinf;
- else
- return x==uvneginf;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * this table might overflow 127-bit exponent representations.
- * in that case, truncate it after 1.0e38.
- * it is important to get all one can from this
- * routine since it is used in atof to scale numbers.
- * the presumption is that C converts fp numbers better
- * than multipication of lower powers of 10.
- */
-
-static
-double tab[] =
-{
- 1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9,
- 1.0e10,1.0e11,1.0e12,1.0e13,1.0e14,1.0e15,1.0e16,1.0e17,1.0e18,1.0e19,
- 1.0e20,1.0e21,1.0e22,1.0e23,1.0e24,1.0e25,1.0e26,1.0e27,1.0e28,1.0e29,
- 1.0e30,1.0e31,1.0e32,1.0e33,1.0e34,1.0e35,1.0e36,1.0e37,1.0e38,1.0e39,
- 1.0e40,1.0e41,1.0e42,1.0e43,1.0e44,1.0e45,1.0e46,1.0e47,1.0e48,1.0e49,
- 1.0e50,1.0e51,1.0e52,1.0e53,1.0e54,1.0e55,1.0e56,1.0e57,1.0e58,1.0e59,
- 1.0e60,1.0e61,1.0e62,1.0e63,1.0e64,1.0e65,1.0e66,1.0e67,1.0e68,1.0e69,
-};
-
-double
-__fmtpow10(int n)
-{
- int m;
-
- if(n < 0) {
- n = -n;
- if(n < (int)(sizeof(tab)/sizeof(tab[0])))
- return 1/tab[n];
- m = n/2;
- return __fmtpow10(-m) * __fmtpow10(m-n);
- }
- if(n < (int)(sizeof(tab)/sizeof(tab[0])))
- return tab[n];
- m = n/2;
- return __fmtpow10(m) * __fmtpow10(n-m);
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-print(char *fmt, ...)
-{
- int n;
- va_list args;
-
- va_start(args, fmt);
- n = vfprint(1, fmt, args);
- va_end(args);
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-seprint(char *buf, char *e, char *fmt, ...)
-{
- char *p;
- va_list args;
-
- va_start(args, fmt);
- p = vseprint(buf, e, fmt, args);
- va_end(args);
- return p;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-smprint(char *fmt, ...)
-{
- va_list args;
- char *p;
-
- va_start(args, fmt);
- p = vsmprint(fmt, args);
- va_end(args);
- return p;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-snprint(char *buf, int len, char *fmt, ...)
-{
- int n;
- va_list args;
-
- va_start(args, fmt);
- n = vsnprint(buf, len, fmt, args);
- va_end(args);
- return n;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-sprint(char *buf, char *fmt, ...)
-{
- int n;
- uint len;
- va_list args;
-
- len = 1<<30; /* big number, but sprint is deprecated anyway */
- /*
- * on PowerPC, the stack is near the top of memory, so
- * we must be sure not to overflow a 32-bit pointer.
- *
- * careful! gcc-4.2 assumes buf+len < buf can never be true and
- * optimizes the test away. casting to uintptr works around this bug.
- */
- if((uintptr)buf+len < (uintptr)buf)
- len = (uint)-(uintptr)buf-1;
-
- va_start(args, fmt);
- n = (int)vsnprint(buf, (int)len, fmt, args);
- va_end(args);
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static ulong
-umuldiv(ulong a, ulong b, ulong c)
-{
- double d;
-
- d = ((double)a * (double)b) / (double)c;
- if(d >= 4294967295.)
- d = 4294967295.;
- return (ulong)d;
-}
-
-/*
- * This routine will convert to arbitrary precision
- * floating point entirely in multi-precision fixed.
- * The answer is the closest floating point number to
- * the given decimal number. Exactly half way are
- * rounded ala ieee rules.
- * Method is to scale input decimal between .500 and .999...
- * with external power of 2, then binary search for the
- * closest mantissa to this decimal number.
- * Nmant is is the required precision. (53 for ieee dp)
- * Nbits is the max number of bits/word. (must be <= 28)
- * Prec is calculated - the number of words of fixed mantissa.
- */
-enum
-{
- Nbits = 28, /* bits safely represented in a ulong */
- Nmant = 53, /* bits of precision required */
- Prec = (Nmant+Nbits+1)/Nbits, /* words of Nbits each to represent mantissa */
- Sigbit = 1<<(Prec*Nbits-Nmant), /* first significant bit of Prec-th word */
- Ndig = 1500,
- One = (ulong)(1<<Nbits),
- Half = (ulong)(One>>1),
- Maxe = 310,
-
- Fsign = 1<<0, /* found - */
- Fesign = 1<<1, /* found e- */
- Fdpoint = 1<<2, /* found . */
-
- S0 = 0, /* _ _S0 +S1 #S2 .S3 */
- S1, /* _+ #S2 .S3 */
- S2, /* _+# #S2 .S4 eS5 */
- S3, /* _+. #S4 */
- S4, /* _+#.# #S4 eS5 */
- S5, /* _+#.#e +S6 #S7 */
- S6, /* _+#.#e+ #S7 */
- S7 /* _+#.#e+# #S7 */
-};
-
-static int xcmp(char*, char*);
-static int fpcmp(char*, ulong*);
-static void frnorm(ulong*);
-static void divascii(char*, int*, int*, int*);
-static void mulascii(char*, int*, int*, int*);
-
-typedef struct Tab Tab;
-struct Tab
-{
- int bp;
- int siz;
- char* cmp;
-};
-
-double
-fmtstrtod(const char *as, char **aas)
-{
- int na, ex, dp, bp, c, i, flag, state;
- ulong low[Prec], hig[Prec], mid[Prec];
- double d;
- char *s, a[Ndig];
-
- flag = 0; /* Fsign, Fesign, Fdpoint */
- na = 0; /* number of digits of a[] */
- dp = 0; /* na of decimal point */
- ex = 0; /* exonent */
-
- state = S0;
- for(s=(char*)as;; s++) {
- c = *s;
- if(c >= '0' && c <= '9') {
- switch(state) {
- case S0:
- case S1:
- case S2:
- state = S2;
- break;
- case S3:
- case S4:
- state = S4;
- break;
-
- case S5:
- case S6:
- case S7:
- state = S7;
- ex = ex*10 + (c-'0');
- continue;
- }
- if(na == 0 && c == '0') {
- dp--;
- continue;
- }
- if(na < Ndig-50)
- a[na++] = (char)c;
- continue;
- }
- switch(c) {
- case '\t':
- case '\n':
- case '\v':
- case '\f':
- case '\r':
- case ' ':
- if(state == S0)
- continue;
- break;
- case '-':
- if(state == S0)
- flag |= Fsign;
- else
- flag |= Fesign;
- case '+':
- if(state == S0)
- state = S1;
- else
- if(state == S5)
- state = S6;
- else
- break; /* syntax */
- continue;
- case '.':
- flag |= Fdpoint;
- dp = na;
- if(state == S0 || state == S1) {
- state = S3;
- continue;
- }
- if(state == S2) {
- state = S4;
- continue;
- }
- break;
- case 'e':
- case 'E':
- if(state == S2 || state == S4) {
- state = S5;
- continue;
- }
- break;
- }
- break;
- }
-
- /*
- * clean up return char-pointer
- */
- switch(state) {
- case S0:
- if(xcmp(s, "nan") == 0) {
- if(aas != nil)
- *aas = s+3;
- goto retnan;
- }
- case S1:
- if(xcmp(s, "infinity") == 0) {
- if(aas != nil)
- *aas = s+8;
- goto retinf;
- }
- if(xcmp(s, "inf") == 0) {
- if(aas != nil)
- *aas = s+3;
- goto retinf;
- }
- case S3:
- if(aas != nil)
- *aas = (char*)as;
- goto ret0; /* no digits found */
- case S6:
- s--; /* back over +- */
- case S5:
- s--; /* back over e */
- break;
- }
- if(aas != nil)
- *aas = s;
-
- if(flag & Fdpoint)
- while(na > 0 && a[na-1] == '0')
- na--;
- if(na == 0)
- goto ret0; /* zero */
- a[na] = 0;
- if(!(flag & Fdpoint))
- dp = na;
- if(flag & Fesign)
- ex = -ex;
- dp += ex;
- if(dp < -Maxe){
- errno = ERANGE;
- goto ret0; /* underflow by exp */
- } else
- if(dp > +Maxe)
- goto retinf; /* overflow by exp */
-
- /*
- * normalize the decimal ascii number
- * to range .[5-9][0-9]* e0
- */
- bp = 0; /* binary exponent */
- while(dp > 0)
- divascii(a, &na, &dp, &bp);
- while(dp < 0 || a[0] < '5')
- mulascii(a, &na, &dp, &bp);
-
- /* close approx by naive conversion */
- mid[0] = 0;
- mid[1] = 1;
- for(i=0; (c=a[i]) != '\0'; i++) {
- mid[0] = mid[0]*10 + (ulong)(c-'0');
- mid[1] = mid[1]*10;
- if(i >= 8)
- break;
- }
- low[0] = umuldiv(mid[0], One, mid[1]);
- hig[0] = umuldiv(mid[0]+1, One, mid[1]);
- for(i=1; i<Prec; i++) {
- low[i] = 0;
- hig[i] = One-1;
- }
-
- /* binary search for closest mantissa */
- for(;;) {
- /* mid = (hig + low) / 2 */
- c = 0;
- for(i=0; i<Prec; i++) {
- mid[i] = hig[i] + low[i];
- if(c)
- mid[i] += One;
- c = mid[i] & 1;
- mid[i] >>= 1;
- }
- frnorm(mid);
-
- /* compare */
- c = fpcmp(a, mid);
- if(c > 0) {
- c = 1;
- for(i=0; i<Prec; i++)
- if(low[i] != mid[i]) {
- c = 0;
- low[i] = mid[i];
- }
- if(c)
- break; /* between mid and hig */
- continue;
- }
- if(c < 0) {
- for(i=0; i<Prec; i++)
- hig[i] = mid[i];
- continue;
- }
-
- /* only hard part is if even/odd roundings wants to go up */
- c = mid[Prec-1] & (Sigbit-1);
- if(c == Sigbit/2 && (mid[Prec-1]&Sigbit) == 0)
- mid[Prec-1] -= (ulong)c;
- break; /* exactly mid */
- }
-
- /* normal rounding applies */
- c = mid[Prec-1] & (Sigbit-1);
- mid[Prec-1] -= (ulong)c;
- if(c >= Sigbit/2) {
- mid[Prec-1] += Sigbit;
- frnorm(mid);
- }
- goto out;
-
-ret0:
- return 0;
-
-retnan:
- return __NaN();
-
-retinf:
- /*
- * Unix strtod requires these. Plan 9 would return Inf(0) or Inf(-1). */
- errno = ERANGE;
- if(flag & Fsign)
- return -HUGE_VAL;
- return HUGE_VAL;
-
-out:
- d = 0;
- for(i=0; i<Prec; i++)
- d = d*One + (double)mid[i];
- if(flag & Fsign)
- d = -d;
- d = ldexp(d, bp - Prec*Nbits);
- if(d == 0){ /* underflow */
- errno = ERANGE;
- }
- return d;
-}
-
-static void
-frnorm(ulong *f)
-{
- int i;
- ulong c;
-
- c = 0;
- for(i=Prec-1; i>0; i--) {
- f[i] += c;
- c = f[i] >> Nbits;
- f[i] &= One-1;
- }
- f[0] += c;
-}
-
-static int
-fpcmp(char *a, ulong* f)
-{
- ulong tf[Prec];
- int i, d, c;
-
- for(i=0; i<Prec; i++)
- tf[i] = f[i];
-
- for(;;) {
- /* tf *= 10 */
- for(i=0; i<Prec; i++)
- tf[i] = tf[i]*10;
- frnorm(tf);
- d = (int)(tf[0] >> Nbits) + '0';
- tf[0] &= One-1;
-
- /* compare next digit */
- c = *a;
- if(c == 0) {
- if('0' < d)
- return -1;
- if(tf[0] != 0)
- goto cont;
- for(i=1; i<Prec; i++)
- if(tf[i] != 0)
- goto cont;
- return 0;
- }
- if(c > d)
- return +1;
- if(c < d)
- return -1;
- a++;
- cont:;
- }
-}
-
-static void
-divby(char *a, int *na, int b)
-{
- int n, c;
- char *p;
-
- p = a;
- n = 0;
- while(n>>b == 0) {
- c = *a++;
- if(c == 0) {
- while(n) {
- c = n*10;
- if(c>>b)
- break;
- n = c;
- }
- goto xx;
- }
- n = n*10 + c-'0';
- (*na)--;
- }
- for(;;) {
- c = n>>b;
- n -= c<<b;
- *p++ = (char)(c + '0');
- c = *a++;
- if(c == 0)
- break;
- n = n*10 + c-'0';
- }
- (*na)++;
-xx:
- while(n) {
- n = n*10;
- c = n>>b;
- n -= c<<b;
- *p++ = (char)(c + '0');
- (*na)++;
- }
- *p = 0;
-}
-
-static Tab tab1[] =
-{
- 1, 0, "",
- 3, 1, "7",
- 6, 2, "63",
- 9, 3, "511",
- 13, 4, "8191",
- 16, 5, "65535",
- 19, 6, "524287",
- 23, 7, "8388607",
- 26, 8, "67108863",
- 27, 9, "134217727",
-};
-
-static void
-divascii(char *a, int *na, int *dp, int *bp)
-{
- int b, d;
- Tab *t;
-
- d = *dp;
- if(d >= (int)(nelem(tab1)))
- d = (int)(nelem(tab1))-1;
- t = tab1 + d;
- b = t->bp;
- if(memcmp(a, t->cmp, (size_t)t->siz) > 0)
- d--;
- *dp -= d;
- *bp += b;
- divby(a, na, b);
-}
-
-static void
-mulby(char *a, char *p, char *q, int b)
-{
- int n, c;
-
- n = 0;
- *p = 0;
- for(;;) {
- q--;
- if(q < a)
- break;
- c = *q - '0';
- c = (c<<b) + n;
- n = c/10;
- c -= n*10;
- p--;
- *p = (char)(c + '0');
- }
- while(n) {
- c = n;
- n = c/10;
- c -= n*10;
- p--;
- *p = (char)(c + '0');
- }
-}
-
-static Tab tab2[] =
-{
- 1, 1, "", /* dp = 0-0 */
- 3, 3, "125",
- 6, 5, "15625",
- 9, 7, "1953125",
- 13, 10, "1220703125",
- 16, 12, "152587890625",
- 19, 14, "19073486328125",
- 23, 17, "11920928955078125",
- 26, 19, "1490116119384765625",
- 27, 19, "7450580596923828125", /* dp 8-9 */
-};
-
-static void
-mulascii(char *a, int *na, int *dp, int *bp)
-{
- char *p;
- int d, b;
- Tab *t;
-
- d = -*dp;
- if(d >= (int)(nelem(tab2)))
- d = (int)(nelem(tab2))-1;
- t = tab2 + d;
- b = t->bp;
- if(memcmp(a, t->cmp, (size_t)t->siz) < 0)
- d--;
- p = a + *na;
- *bp -= b;
- *dp += d;
- *na += d;
- mulby(a, p+d, p, b);
-}
-
-static int
-xcmp(char *a, char *b)
-{
- int c1, c2;
-
- while((c1 = *b++) != '\0') {
- c2 = *a++;
- if(isupper(c2))
- c2 = tolower(c2);
- if(c1 != c2)
- return 1;
- }
- return 0;
-}
+++ /dev/null
-// +build ignore
-
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-main(int argc, char *argv[])
-{
- quotefmtinstall();
- print("hello world\n");
- print("x: %x\n", 0x87654321);
- print("u: %u\n", 0x87654321);
- print("d: %d\n", 0x87654321);
- print("s: %s\n", "hi there");
- print("q: %q\n", "hi i'm here");
- print("c: %c\n", '!');
- print("g: %g %g %g\n", 3.14159, 3.14159e10, 3.14159e-10);
- print("e: %e %e %e\n", 3.14159, 3.14159e10, 3.14159e-10);
- print("f: %f %f %f\n", 3.14159, 3.14159e10, 3.14159e-10);
- print("smiley: %C\n", (Rune)0x263a);
- print("%g %.18g\n", 2e25, 2e25);
- print("%2.18g\n", 1.0);
- print("%2.18f\n", 1.0);
- print("%f\n", 3.1415927/4);
- print("%d\n", 23);
- print("%i\n", 23);
- print("%0.10d\n", 12345);
-
- /* test %4$d formats */
- print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222);
- print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222);
- print("%3$d %4$*5$06d %2$d %1$d\n", 444, 333, 111, 222, 20);
- print("%3$hd %4$*5$06d %2$d %1$d\n", 444, 333, (short)111, 222, 20);
- print("%3$lld %4$*5$06d %2$d %1$d\n", 444, 333, 111LL, 222, 20);
-
- /* test %'d formats */
- print("%'d %'d %'d\n", 1, 2222, 33333333);
- print("%'019d\n", 0);
- print("%08d %08d %08d\n", 1, 2222, 33333333);
- print("%'08d %'08d %'08d\n", 1, 2222, 33333333);
- print("%'x %'X %'b\n", 0x11111111, 0xabcd1234, 12345);
- print("%'lld %'lld %'lld\n", 1LL, 222222222LL, 3333333333333LL);
- print("%019lld %019lld %019lld\n", 1LL, 222222222LL, 3333333333333LL);
- print("%'019lld %'019lld %'019lld\n", 1LL, 222222222LL, 3333333333333LL);
- print("%'020lld %'020lld %'020lld\n", 1LL, 222222222LL, 3333333333333LL);
- print("%'llx %'llX %'llb\n", 0x111111111111LL, 0xabcd12345678LL, 112342345LL);
- return 0;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-vfprint(int fd, char *fmt, va_list args)
-{
- Fmt f;
- char buf[256];
- int n;
-
- fmtfdinit(&f, fd, buf, sizeof(buf));
- VA_COPY(f.args,args);
- n = dofmt(&f, fmt);
- VA_END(f.args);
- if(n > 0 && __fmtFdFlush(&f) == 0)
- return -1;
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-vseprint(char *buf, char *e, char *fmt, va_list args)
-{
- Fmt f;
-
- if(e <= buf)
- return nil;
- f.runes = 0;
- f.start = buf;
- f.to = buf;
- f.stop = e - 1;
- f.flush = 0;
- f.farg = nil;
- f.nfmt = 0;
- VA_COPY(f.args,args);
- fmtlocaleinit(&f, nil, nil, nil);
- dofmt(&f, fmt);
- VA_END(f.args);
- *(char*)f.to = '\0';
- return (char*)f.to;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static int
-fmtStrFlush(Fmt *f)
-{
- char *s;
- int n;
-
- if(f->start == nil)
- return 0;
- n = (int)(uintptr)f->farg;
- n *= 2;
- s = (char*)f->start;
- f->start = realloc(s, (size_t)n);
- if(f->start == nil){
- f->farg = nil;
- f->to = nil;
- f->stop = nil;
- free(s);
- return 0;
- }
- f->farg = (void*)(uintptr)n;
- f->to = (char*)f->start + ((char*)f->to - s);
- f->stop = (char*)f->start + n - 1;
- return 1;
-}
-
-int
-fmtstrinit(Fmt *f)
-{
- int n;
-
- memset(f, 0, sizeof *f);
- f->runes = 0;
- n = 32;
- f->start = malloc((size_t)n);
- if(f->start == nil)
- return -1;
- f->to = f->start;
- f->stop = (char*)f->start + n - 1;
- f->flush = fmtStrFlush;
- f->farg = (void*)(uintptr)n;
- f->nfmt = 0;
- fmtlocaleinit(f, nil, nil, nil);
- return 0;
-}
-
-/*
- * print into an allocated string buffer
- */
-char*
-vsmprint(char *fmt, va_list args)
-{
- Fmt f;
- int n;
-
- if(fmtstrinit(&f) < 0)
- return nil;
- VA_COPY(f.args,args);
- n = dofmt(&f, fmt);
- VA_END(f.args);
- if(n < 0){
- free(f.start);
- return nil;
- }
- return fmtstrflush(&f);
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- * Copyright (c) 2002-2006 by Lucent Technologies.
- * Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-vsnprint(char *buf, int len, char *fmt, va_list args)
-{
- Fmt f;
-
- if(len <= 0)
- return -1;
- f.runes = 0;
- f.start = buf;
- f.to = buf;
- f.stop = buf + len - 1;
- f.flush = 0;
- f.farg = nil;
- f.nfmt = 0;
- VA_COPY(f.args,args);
- fmtlocaleinit(&f, nil, nil, nil);
- dofmt(&f, fmt);
- VA_END(f.args);
- *(char*)f.to = '\0';
- return (int)((char*)f.to - buf);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/fmtlock2.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/fmtlock2.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-Portions Copyright 2009 The Go Authors. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-__fmtlock(void)
-{
-}
-
-void
-__fmtunlock(void)
-{
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/getenv.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/getenv.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-p9getenv(char *s)
-{
- char *t;
-
- t = getenv(s);
- if(t == 0)
- return 0;
- return strdup(t);
-}
-
-int
-p9putenv(char *s, char *v)
-{
- char *t;
-
- t = smprint("%s=%s", s, v);
- if(t == nil)
- return -1;
- putenv(t);
- return 0;
-}
+++ /dev/null
-/*
-Inferno libkern/getfields.c
-http://code.google.com/p/inferno-os/source/browse/libkern/getfields.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-getfields(char *str, char **args, int max, int mflag, char *set)
-{
- Rune r;
- int nr, intok, narg;
-
- if(max <= 0)
- return 0;
-
- narg = 0;
- args[narg] = str;
- if(!mflag)
- narg++;
- intok = 0;
- for(;; str += nr) {
- nr = chartorune(&r, str);
- if(r == 0)
- break;
- if(utfrune(set, r)) {
- if(narg >= max)
- break;
- *str = 0;
- intok = 0;
- args[narg] = str + nr;
- if(!mflag)
- narg++;
- } else {
- if(!intok && mflag)
- narg++;
- intok = 1;
- }
- }
- return narg;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/getwd.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/getwd.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-Portions Copyright 2011 The Go Authors. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <errno.h>
-#include <sys/stat.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-p9getwd(char *s, int ns)
-{
- char *pwd;
- struct stat st1, st2;
-
- // Clumsy but widespread kludge:
- // if $PWD is set and matches ".", use it.
- // Matches glibc's get_current_dir_name and Go's os.Getwd.
- pwd = getenv("PWD"); // note: getenv, not p9getenv, so no free
- if(pwd != nil && pwd[0] &&
- stat(pwd, &st1) >= 0 && stat(".", &st2) >= 0 &&
- st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) {
- if(strlen(pwd) >= ns) {
- errno = ERANGE;
- return nil;
- }
- strcpy(s, pwd);
- return s;
- }
-
- return getcwd(s, (size_t)ns);
-}
+++ /dev/null
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-static char*
-defgetenv(char *name, char *def)
-{
- char *p;
-
- p = getenv(name);
- if(p == nil || p[0] == '\0')
- p = def;
- return p;
-}
-
-char*
-getgoos(void)
-{
- return defgetenv("GOOS", GOOS);
-}
-
-char*
-getgoarch(void)
-{
- return defgetenv("GOARCH", GOARCH);
-}
-
-char*
-getgoroot(void)
-{
- return defgetenv("GOROOT", GOROOT);
-}
-
-char*
-getgoversion(void)
-{
- return GOVERSION;
-}
-
-char*
-getgoarm(void)
-{
- return defgetenv("GOARM", GOARM);
-}
-
-char*
-getgo386(void)
-{
- return defgetenv("GO386", GO386);
-}
-
-char*
-getgoextlinkenabled(void)
-{
- return GO_EXTLINK_ENABLED;
-}
-
-char*
-getgohostarch(void)
-{
- return GOHOSTARCH;
-}
-
-char*
-getgohostos(void)
-{
- return GOHOSTOS;
-}
+++ /dev/null
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/jmp.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/jmp.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-void
-p9longjmp(p9jmp_buf buf, int val)
-{
- siglongjmp((void*)buf, val);
-}
-
-void
-p9notejmp(void *x, p9jmp_buf buf, int val)
-{
- USED(x);
- siglongjmp((void*)buf, val);
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/main.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/main.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#ifdef WIN32
-#include <windows.h>
-
-static void
-crashhandler(int sig)
-{
- USED(sig);
- fprint(2, "%s: internal fatal error.\n", argv0);
- exit(1);
-}
-#endif
-
-extern void p9main(int, char**);
-
-int
-main(int argc, char **argv)
-{
-#ifdef WIN32
- signal(SIGSEGV, crashhandler);
- signal(SIGBUS, crashhandler);
- // don't display the crash dialog
- DWORD mode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
- SetErrorMode(mode | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-#endif
- argv0 = argv[0];
- p9main(argc, argv);
- exits("main");
- return 99;
-}
+++ /dev/null
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Some Darwin/ARM libc versions fail to provide a standard compliant version
-// of frexp and ldexp that could handle denormal floating point numbers.
-// The frexp and ldexp implementations are translated from their Go version.
-
-#include <stdint.h>
-
-// Assume double and uint64_t are using the same endian.
-union dint64 {
- double d;
- uint64_t u;
-};
-
-static const uint64_t mask = 0x7FF, bias = 1023;
-static const int shift = 64 - 11 - 1;
-static const uint64_t uvnan = 0x7FF8000000000001ULL, uvinf = 0x7FF0000000000000ULL,
- uvneginf = 0xFFF0000000000000ULL;
-static const double smallestnormal = 2.2250738585072014e-308; // 2**-1022
-
-static inline uint64_t float64bits(double x) {
- union dint64 u;
- u.d = x;
- return u.u;
-}
-static inline double float64frombits(uint64_t x) {
- union dint64 u;
- u.u = x;
- return u.d;
-}
-static inline int isinf(double x) {
- return float64bits(x) == uvinf || float64bits(x) == uvneginf;
-}
-static inline int isnan(double x) {
- return x != x;
-}
-extern double fabs(double);
-static double normalize(double x, int *exp) {
- if (fabs(x) < smallestnormal) {
- *exp = -52;
- return x * (double)(1LL<<52);
- }
- *exp = 0;
- return x;
-}
-
-double ldexp(double frac, int exp) {
- // special cases
- if (frac == 0.0) return frac;
- if (isinf(frac) || isnan(frac)) return frac;
-
- int e;
- frac = normalize(frac, &e);
- exp += e;
- uint64_t x = float64bits(frac);
- exp += (int)((x>>shift)&mask) - bias;
- if (exp < -1074) { // underflow
- if (frac < 0.0) return float64frombits(1ULL<<63); // -0.0
- return 0.0;
- }
- if (exp > 1023) { // overflow
- if (frac < 0.0) return float64frombits(uvneginf);
- return float64frombits(uvinf);
- }
- double m = 1;
- if (exp < -1022) { // denormal
- exp += 52;
- m = 1.0 / (double)(1ULL<<52);
- }
- x &= ~(mask << shift);
- x |= (uint64_t)(exp+bias) << shift;
- return m * float64frombits(x);
-}
-
-double frexp(double f, int *exp) {
- *exp = 0;
- // special cases
- if (f == 0.0) return f;
- if (isinf(f) || isnan(f)) return f;
-
- f = normalize(f, exp);
- uint64_t x = float64bits(f);
- *exp += (int)((x>>shift)&mask) - bias + 1;
- x &= ~(mask << shift);
- x |= (-1 + bias) << shift;
- return float64frombits(x);
-}
-
-// On Darwin/ARM, the kernel insists on running VFP in runfast mode, and it
-// cannot deal with denormal floating point numbers in that mode, so we have
-// to disable the runfast mode if the client uses ldexp/frexp (i.e. 5g).
-void disable_vfp_runfast(void) __attribute__((constructor));
-void disable_vfp_runfast(void) {
- __asm__ volatile (
- "fmrx r0, fpscr\n"
- "bic r0, r0, $0x03000000\n"
- "fmxr fpscr, r0\n"
- : : : "r0"
- );
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/nan.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/nan.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include "fmt/fmtdef.h"
-
-double
-NaN(void)
-{
- return __NaN();
-}
-
-double
-Inf(int sign)
-{
- return __Inf(sign);
-}
-
-int
-isNaN(double x)
-{
- return __isNaN(x);
-}
-
-int
-isInf(double x, int sign)
-{
- return __isInf(x, sign);
-}
+++ /dev/null
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/notify.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/notify.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * Signal handling for Plan 9 programs.
- * We stubbornly use the strings from Plan 9 instead
- * of the enumerated Unix constants.
- * There are some weird translations. In particular,
- * a "kill" note is the same as SIGTERM in Unix.
- * There is no equivalent note to Unix's SIGKILL, since
- * it's not a deliverable signal anyway.
- *
- * We do not handle SIGABRT or SIGSEGV, mainly because
- * the thread library queues its notes for later, and we want
- * to dump core with the state at time of delivery.
- *
- * We have to add some extra entry points to provide the
- * ability to tweak which signals are deliverable and which
- * are acted upon. Notifydisable and notifyenable play with
- * the process signal mask. Notifyignore enables the signal
- * but will not call notifyf when it comes in. This is occasionally
- * useful.
- */
-
-#include <u.h>
-#include <signal.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-extern char *_p9sigstr(int, char*);
-extern int _p9strsig(char*);
-
-typedef struct Sig Sig;
-struct Sig
-{
- int sig; /* signal number */
- int flags;
-};
-
-enum
-{
- Restart = 1<<0,
- Ignore = 1<<1
-};
-
-static Sig sigs[] = {
- SIGHUP, 0,
- SIGINT, 0,
- SIGQUIT, 0,
- SIGILL, 0,
- SIGTRAP, 0,
-/* SIGABRT, 0, */
-#ifdef SIGEMT
- SIGEMT, 0,
-#endif
- SIGFPE, 0,
- SIGBUS, 0,
-/* SIGSEGV, 0, */
- SIGCHLD, Restart|Ignore,
- SIGSYS, 0,
- SIGPIPE, Ignore,
- SIGALRM, 0,
- SIGTERM, 0,
- SIGTSTP, Restart|Ignore,
-/* SIGTTIN, Restart|Ignore, */
-/* SIGTTOU, Restart|Ignore, */
- SIGXCPU, 0,
- SIGXFSZ, 0,
- SIGVTALRM, 0,
- SIGUSR1, 0,
- SIGUSR2, 0,
-#ifdef SIGWINCH
- SIGWINCH, Restart|Ignore,
-#endif
-#ifdef SIGINFO
- SIGINFO, Restart|Ignore,
-#endif
-};
-
-static Sig*
-findsig(int s)
-{
- int i;
-
- for(i=0; i<nelem(sigs); i++)
- if(sigs[i].sig == s)
- return &sigs[i];
- return nil;
-}
-
-/*
- * The thread library initializes _notejmpbuf to its own
- * routine which provides a per-pthread jump buffer.
- * If we're not using the thread library, we assume we are
- * single-threaded.
- */
-typedef struct Jmp Jmp;
-struct Jmp
-{
- p9jmp_buf b;
-};
-
-static Jmp onejmp;
-
-static Jmp*
-getonejmp(void)
-{
- return &onejmp;
-}
-
-Jmp *(*_notejmpbuf)(void) = getonejmp;
-static void noteinit(void);
-
-/*
- * Actual signal handler.
- */
-
-static void (*notifyf)(void*, char*); /* Plan 9 handler */
-
-static void
-signotify(int sig)
-{
- char tmp[64];
- Jmp *j;
- Sig *s;
-
- j = (*_notejmpbuf)();
- switch(p9setjmp(j->b)){
- case 0:
- if(notifyf)
- (*notifyf)(nil, _p9sigstr(sig, tmp));
- /* fall through */
- case 1: /* noted(NDFLT) */
- if(0)print("DEFAULT %d\n", sig);
- s = findsig(sig);
- if(s && (s->flags&Ignore))
- return;
- signal(sig, SIG_DFL);
- raise(sig);
- _exit(1);
- case 2: /* noted(NCONT) */
- if(0)print("HANDLED %d\n", sig);
- return;
- }
-}
-
-static void
-signonotify(int sig)
-{
- USED(sig);
-}
-
-int
-noted(int v)
-{
- p9longjmp((*_notejmpbuf)()->b, v==NCONT ? 2 : 1);
- abort();
- return 0;
-}
-
-int
-notify(void (*f)(void*, char*))
-{
- static int init;
-
- notifyf = f;
- if(!init){
- init = 1;
- noteinit();
- }
- return 0;
-}
-
-/*
- * Nonsense about enabling and disabling signals.
- */
-typedef void Sighandler(int);
-static Sighandler*
-handler(int s)
-{
- struct sigaction sa;
-
- sigaction(s, nil, &sa);
- return sa.sa_handler;
-}
-
-static int
-notesetenable(int sig, int enabled)
-{
- sigset_t mask, omask;
-
- if(sig == 0)
- return -1;
-
- sigemptyset(&mask);
- sigaddset(&mask, sig);
- sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, &omask);
- return !sigismember(&omask, sig);
-}
-
-int
-noteenable(char *msg)
-{
- return notesetenable(_p9strsig(msg), 1);
-}
-
-int
-notedisable(char *msg)
-{
- return notesetenable(_p9strsig(msg), 0);
-}
-
-static int
-notifyseton(int s, int on)
-{
- Sig *sig;
- struct sigaction sa, osa;
-
- sig = findsig(s);
- if(sig == nil)
- return -1;
- memset(&sa, 0, sizeof sa);
- sa.sa_handler = on ? signotify : signonotify;
- if(sig->flags&Restart)
- sa.sa_flags |= SA_RESTART;
-
- /*
- * We can't allow signals within signals because there's
- * only one jump buffer.
- */
- sigfillset(&sa.sa_mask);
-
- /*
- * Install handler.
- */
- sigaction(sig->sig, &sa, &osa);
- return osa.sa_handler == signotify;
-}
-
-int
-notifyon(char *msg)
-{
- return notifyseton(_p9strsig(msg), 1);
-}
-
-int
-notifyoff(char *msg)
-{
- return notifyseton(_p9strsig(msg), 0);
-}
-
-/*
- * Initialization follows sigs table.
- */
-static void
-noteinit(void)
-{
- int i;
- Sig *sig;
-
- for(i=0; i<nelem(sigs); i++){
- sig = &sigs[i];
- /*
- * If someone has already installed a handler,
- * It's probably some ld preload nonsense,
- * like pct (a SIGVTALRM-based profiler).
- * Or maybe someone has already called notifyon/notifyoff.
- * Leave it alone.
- */
- if(handler(sig->sig) != SIG_DFL)
- continue;
- notifyseton(sig->sig, 1);
- }
-}
-
+++ /dev/null
-// +build !plan9
-
-/*
-Inferno lib9/nulldir.c
-http://code.google.com/p/inferno-os/source/browse/lib9/nulldir.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-nulldir(Dir *d)
-{
- memset(d, ~0, sizeof(Dir));
- d->name = d->uid = d->gid = d->muid = "";
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/open.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/open.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define _GNU_SOURCE /* for Linux O_DIRECT */
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <sys/file.h>
-#include <libc.h>
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-int
-p9open(char *name, int mode)
-{
- int rclose;
- int fd, umode, rdwr;
-
- rdwr = mode&3;
- umode = rdwr;
- rclose = mode&ORCLOSE;
- mode &= ~(3|ORCLOSE);
- if(mode&OTRUNC){
- umode |= O_TRUNC;
- mode ^= OTRUNC;
- }
- if(mode&ODIRECT){
- umode |= O_DIRECT;
- mode ^= ODIRECT;
- }
- if(mode&OAPPEND){
- umode |= O_APPEND;
- mode ^= OAPPEND;
- }
- if(mode){
- werrstr("mode 0x%x not supported", mode);
- return -1;
- }
- umode |= O_BINARY;
- fd = open(name, umode);
- if(fd >= 0){
- if(rclose)
- remove(name);
- }
- return fd;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Inferno lib9/readn.c
-http://code.google.com/p/inferno-os/source/browse/lib9/readn.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-long
-readn(int f, void *av, long n)
-{
- char *a;
- long m, t;
-
- a = av;
- t = 0;
- while(t < n){
- m = read(f, a+t, (size_t)(n-t));
- if(m <= 0){
- if(t == 0)
- return m;
- break;
- }
- t += m;
- }
- return t;
-}
+++ /dev/null
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/rfork.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/rfork.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <libc.h>
-#undef rfork
-
-static void
-nop(int x)
-{
- USED(x);
-}
-
-int
-p9rfork(int flags)
-{
- int pid, status;
- int p[2];
- int n;
- char buf[128], *q;
- extern char **environ;
-
- if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
- /* check other flags before we commit */
- flags &= ~(RFPROC|RFFDG|RFENVG);
- n = (flags & ~(RFNOTEG|RFNAMEG|RFNOWAIT|RFCENVG));
- if(n){
- werrstr("unknown flags %08ux in rfork", n);
- return -1;
- }
- if(flags&RFNOWAIT){
- /*
- * BUG - should put the signal handler back after we
- * finish, but I just don't care. If a program calls with
- * NOWAIT once, they're not likely to want child notes
- * after that.
- */
- signal(SIGCHLD, nop);
- if(pipe(p) < 0)
- return -1;
- }
- pid = fork();
- if(pid == -1)
- return -1;
- if(flags&RFNOWAIT){
- flags &= ~RFNOWAIT;
- if(pid){
- /*
- * Parent - wait for child to fork wait-free child.
- * Then read pid from pipe. Assume pipe buffer can absorb the write.
- */
- close(p[1]);
- status = 0;
- if(wait4(pid, &status, 0, 0) < 0){
- werrstr("pipe dance - wait4 - %r");
- close(p[0]);
- return -1;
- }
- n = (int)readn(p[0], buf, sizeof buf-1);
- close(p[0]);
- if(!WIFEXITED(status) || WEXITSTATUS(status)!=0 || n <= 0){
- if(!WIFEXITED(status))
- werrstr("pipe dance - !exited 0x%ux", status);
- else if(WEXITSTATUS(status) != 0)
- werrstr("pipe dance - non-zero status 0x%ux", status);
- else if(n < 0)
- werrstr("pipe dance - pipe read error - %r");
- else if(n == 0)
- werrstr("pipe dance - pipe read eof");
- else
- werrstr("pipe dance - unknown failure");
- return -1;
- }
- buf[n] = 0;
- if(buf[0] == 'x'){
- werrstr("%s", buf+2);
- return -1;
- }
- pid = (int)strtol(buf, &q, 0);
- }else{
- /*
- * Child - fork a new child whose wait message can't
- * get back to the parent because we're going to exit!
- */
- signal(SIGCHLD, SIG_IGN);
- close(p[0]);
- pid = fork();
- if(pid){
- /* Child parent - send status over pipe and exit. */
- if(pid > 0)
- fprint(p[1], "%d", pid);
- else
- fprint(p[1], "x %r");
- close(p[1]);
- _exit(0);
- }else{
- /* Child child - close pipe. */
- close(p[1]);
- }
- }
- }
- if(pid != 0)
- return pid;
- if(flags&RFCENVG)
- if(environ)
- *environ = nil;
- }
- if(flags&RFPROC){
- werrstr("cannot use rfork for shared memory -- use libthread");
- return -1;
- }
- if(flags&RFNAMEG){
- /* XXX set $NAMESPACE to a new directory */
- flags &= ~RFNAMEG;
- }
- if(flags&RFNOTEG){
- setpgid(0, getpid());
- flags &= ~RFNOTEG;
- }
- if(flags&RFNOWAIT){
- werrstr("cannot use RFNOWAIT without RFPROC");
- return -1;
- }
- if(flags){
- werrstr("unknown flags %08ux in rfork", flags);
- return -1;
- }
- return 0;
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-#include <u.h>
-#include <libc.h>
-
-int
-runcmd(char **argv)
-{
- int pid;
- Waitmsg *w;
-
- switch(pid = fork()) {
- case -1:
- return -1;
- case 0:
- exec(argv[0], argv);
- fprint(2, "exec %s: %r\n", argv[0]);
- exits("exec");
- }
-
- w = wait();
- if(w == nil)
- return -1;
- if(w->pid != pid) {
- werrstr("unexpected pid in wait");
- free(w);
- return -1;
- }
- if(w->msg[0]) {
- werrstr("unsuccessful exit status: %s", w->msg);
- free(w);
- return -1;
- }
- free(w);
- return 0;
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <u.h>
-#include <errno.h>
-#include <sys/wait.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-int
-runcmd(char **argv)
-{
- int pid, pid1, status;
-
- switch(pid = fork()) {
- case -1:
- return -1;
- case 0:
- execvp(argv[0], argv);
- fprint(2, "exec %s: %r\n", argv[0]);
- _exit(1);
- }
-
- while((pid1 = wait(&status)) < 0) {
- if(errno != EINTR) {
- werrstr("waitpid: %r");
- return -1;
- }
- }
- if(pid1 != pid) {
- werrstr("unexpected pid in wait");
- return -1;
- }
- if(!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- werrstr("unsuccessful exit status %#x", status);
- return -1;
- }
- return 0;
-}
-
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <windows.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include "win.h"
-
-int
-runcmd(char **argv)
-{
- // Mostly copied from ../cmd/dist/windows.c.
- // If there's a bug here, fix the logic there too.
- int i, j, nslash;
- Fmt fmt;
- char *q;
- WinRune *r;
- STARTUPINFOW si;
- PROCESS_INFORMATION pi;
- DWORD code, lasterr;
-
- fmtstrinit(&fmt);
- for(i=0; argv[i]; i++) {
- if(i > 0)
- fmtprint(&fmt, " ");
- q = argv[i];
- if(strstr(q, " ") || strstr(q, "\t") || strstr(q, "\"") || strstr(q, "\\\\") || (strlen(q) > 0 && q[strlen(q)-1] == '\\')) {
- fmtprint(&fmt, "\"");
- nslash = 0;
- for(; *q; q++) {
- if(*q == '\\') {
- nslash++;
- continue;
- }
- if(*q == '"') {
- for(j=0; j<2*nslash+1; j++)
- fmtprint(&fmt, "\\");
- nslash = 0;
- }
- for(j=0; j<nslash; j++)
- fmtprint(&fmt, "\\");
- nslash = 0;
- fmtprint(&fmt, "\"");
- }
- for(j=0; j<2*nslash; j++)
- fmtprint(&fmt, "\\");
- fmtprint(&fmt, "\"");
- } else {
- fmtprint(&fmt, "%s", q);
- }
- }
-
- q = fmtstrflush(&fmt);
- r = torune(q);
- free(q);
-
- memset(&si, 0, sizeof si);
- si.cb = sizeof si;
- si.dwFlags = STARTF_USESTDHANDLES;
- si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
- si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
-
- if(!CreateProcessW(nil, r, nil, nil, TRUE, 0, nil, nil, &si, &pi)) {
- werrstr("CreateProcess failed: errno=%d", (int)GetLastError());
- free(r);
- return -1;
- }
-
- free(r);
- if(WaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE) != 0) {
- werrstr("WaitForMultipleObjects failed: errno=%d", (int)GetLastError());
- return -1;
- }
- i = GetExitCodeProcess(pi.hProcess, &code);
- lasterr = GetLastError();
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- if(!i) {
- werrstr("GetExitCodeProcess failed: errno=%d", (int)lasterr);
- return -1;
- }
- if(code != 0) {
- werrstr("unsuccessful exit status: %d", (int)code);
- return -1;
- }
- return 0;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/seek.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/seek.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-vlong
-seek(int fd, vlong offset, int whence)
-{
- return lseek(fd, offset, whence);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Inferno lib9/strecpy.c
-http://code.google.com/p/inferno-os/source/browse/lib9/strecpy.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-char*
-strecpy(char *to, char *e, char *from)
-{
- if(to >= e)
- return to;
- to = memccpy(to, from, '\0', (size_t)(e - to));
- if(to == nil){
- to = e - 1;
- *to = '\0';
- }else{
- to--;
- }
- return to;
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/sysfatal.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/sysfatal.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void (*_sysfatal)(char*, ...);
-
-void
-sysfatal(char *fmt, ...)
-{
- char buf[256];
- va_list arg;
-
- va_start(arg, fmt);
- if(_sysfatal)
- (*_sysfatal)(fmt, arg);
- vseprint(buf, buf+sizeof buf, fmt, arg);
- va_end(arg);
-
- __fixargv0();
- fprint(2, "%s: %s\n", argv0 ? argv0 : "<prog>", buf);
- exits("fatal");
-}
-
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-#include <u.h>
-#include <libc.h>
-
-char*
-mktempdir(void)
-{
- char *p;
- int fd, i;
-
- p = smprint("/tmp/go-link-XXXXXX");
- for(i=0; i<1000; i++) {
- sprint(p, "/tmp/go-link-%06x", nrand((1<<24)-1));
- fd = create(p, OREAD|OEXCL, 0700|DMDIR);
- if(fd >= 0) {
- close(fd);
- return p;
- }
- }
- free(p);
- return nil;
-}
-
-void
-removeall(char *p)
-{
- int fd, n, i;
- Dir *d;
- char *q;
-
- if(remove(p) >= 0)
- return;
- if((d = dirstat(p)) == nil)
- return;
- if(!(d->mode & DMDIR)) {
- free(d);
- return;
- }
- free(d);
-
- if((fd = open(p, OREAD)) < 0)
- return;
- n = dirreadall(fd, &d);
- close(fd);
- for(i=0; i<n; i++) {
- q = smprint("%s/%s", p, d[i].name);
- removeall(q);
- free(q);
- }
- free(d);
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <u.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-mktempdir(void)
-{
- char *tmp, *p;
-
- tmp = getenv("TMPDIR");
- if(tmp == nil || strlen(tmp) == 0)
- tmp = "/var/tmp";
- p = smprint("%s/go-link-XXXXXX", tmp);
- if(mkdtemp(p) == nil)
- return nil;
- return p;
-}
-
-void
-removeall(char *p)
-{
- DIR *d;
- struct dirent *dp;
- char *q;
- struct stat st;
-
- if(stat(p, &st) < 0)
- return;
- if(!S_ISDIR(st.st_mode)) {
- unlink(p);
- return;
- }
-
- d = opendir(p);
- while((dp = readdir(d)) != nil) {
- if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
- continue;
- q = smprint("%s/%s", p, dp->d_name);
- removeall(q);
- free(q);
- }
- closedir(d);
- rmdir(p);
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <windows.h>
-#include <libc.h>
-#include "win.h"
-
-char*
-toutf(WinRune *r)
-{
- Rune *r1;
- int i, n;
- char *p;
-
- n = 0;
- while(r[n] != '\0')
- n++;
- n++;
- r1 = malloc(n*sizeof r1[0]);
- for(i=0; i<n; i++)
- r1[i] = r[i];
- p = smprint("%S", r1);
- free(r1);
- return p;
-}
-
-WinRune*
-torune(char *p)
-{
- int i, n;
- Rune rr;
- WinRune *r;
-
- n = utflen(p);
- r = malloc((n+1)*sizeof r[0]);
- for(i=0; i<n; i++) {
- p += chartorune(&rr, p);
- r[i] = rr;
- }
- r[n] = '\0';
- return r;
-}
-
-char*
-mktempdir(void)
-{
- WinRune buf[1024];
- WinRune tmp[MAX_PATH];
- WinRune golink[] = {'g', 'o', 'l', 'i', 'n', 'k', '\0'};
- int n;
-
- n = GetTempPathW(nelem(buf), buf);
- if(n <= 0)
- return nil;
- buf[n] = '\0';
-
- if(GetTempFileNameW(buf, golink, 0, tmp) == 0)
- return nil;
- DeleteFileW(tmp);
- if(!CreateDirectoryW(tmp, nil))
- return nil;
-
- return toutf(tmp);
-}
-
-void
-removeall(char *p)
-{
- WinRune *r, *r1;
- DWORD attr;
- char *q, *qt, *elem;
- HANDLE h;
- WIN32_FIND_DATAW data;
-
- r = torune(p);
- attr = GetFileAttributesW(r);
- if(attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
- DeleteFileW(r);
- free(r);
- return;
- }
-
- q = smprint("%s\\*", p);
- r1 = torune(q);
- free(q);
- h = FindFirstFileW(r1, &data);
- if(h == INVALID_HANDLE_VALUE)
- goto done;
- do{
- q = toutf(data.cFileName);
- elem = strrchr(q, '\\');
- if(elem != nil)
- elem++;
- else
- elem = q;
- if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
- free(q);
- continue;
- }
- qt = smprint("%s\\%s", p, q);
- free(q);
- removeall(qt);
- free(qt);
- }while(FindNextFileW(h, &data));
- FindClose(h);
-
-done:
- free(r1);
- RemoveDirectoryW(r);
- free(r);
-}
+++ /dev/null
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/time.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/time.c
-
-Copyright 2001-2007 Russ Cox. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <sys/time.h>
-#include <time.h>
-#ifndef _WIN32
-#include <sys/resource.h>
-#endif
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-long
-p9times(long *t)
-{
-#ifdef _WIN32
- memset(t, 0, 4*sizeof(long));
-#else
- struct rusage ru, cru;
-
- if(getrusage(0, &ru) < 0 || getrusage(-1, &cru) < 0)
- return -1;
-
- t[0] = ru.ru_utime.tv_sec*1000 + ru.ru_utime.tv_usec/1000;
- t[1] = ru.ru_stime.tv_sec*1000 + ru.ru_stime.tv_usec/1000;
- t[2] = cru.ru_utime.tv_sec*1000 + cru.ru_utime.tv_usec/1000;
- t[3] = cru.ru_stime.tv_sec*1000 + cru.ru_stime.tv_usec/1000;
-#endif
-
- /* BUG */
- return t[0]+t[1]+t[2]+t[3];
-}
-
-double
-p9cputime(void)
-{
- long t[4];
- double d;
-
- if(p9times(t) < 0)
- return -1.0;
-
- d = (double)t[0]+(double)t[1]+(double)t[2]+(double)t[3];
- return d/1000.0;
-}
+++ /dev/null
-/*
-Inferno lib9/tokenize.c
-http://code.google.com/p/inferno-os/source/browse/lib9/tokenize.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-static char qsep[] = " \t\r\n";
-
-static char*
-qtoken(char *s, char *sep)
-{
- int quoting;
- char *t;
-
- quoting = 0;
- t = s; /* s is output string, t is input string */
- while(*t!='\0' && (quoting || utfrune(sep, (Rune)*t)==nil)){
- if(*t != '\''){
- *s++ = *t++;
- continue;
- }
- /* *t is a quote */
- if(!quoting){
- quoting = 1;
- t++;
- continue;
- }
- /* quoting and we're on a quote */
- if(t[1] != '\''){
- /* end of quoted section; absorb closing quote */
- t++;
- quoting = 0;
- continue;
- }
- /* doubled quote; fold one quote into two */
- t++;
- *s++ = *t++;
- }
- if(*s != '\0'){
- *s = '\0';
- if(t == s)
- t++;
- }
- return t;
-}
-
-static char*
-etoken(char *t, char *sep)
-{
- int quoting;
-
- /* move to end of next token */
- quoting = 0;
- while(*t!='\0' && (quoting || utfrune(sep, (Rune)*t)==nil)){
- if(*t != '\''){
- t++;
- continue;
- }
- /* *t is a quote */
- if(!quoting){
- quoting = 1;
- t++;
- continue;
- }
- /* quoting and we're on a quote */
- if(t[1] != '\''){
- /* end of quoted section; absorb closing quote */
- t++;
- quoting = 0;
- continue;
- }
- /* doubled quote; fold one quote into two */
- t += 2;
- }
- return t;
-}
-
-int
-gettokens(char *s, char **args, int maxargs, char *sep)
-{
- int nargs;
-
- for(nargs=0; nargs<maxargs; nargs++){
- while(*s!='\0' && utfrune(sep, (Rune)*s)!=nil)
- *s++ = '\0';
- if(*s == '\0')
- break;
- args[nargs] = s;
- s = etoken(s, sep);
- }
-
- return nargs;
-}
-
-int
-tokenize(char *s, char **args, int maxargs)
-{
- int nargs;
-
- for(nargs=0; nargs<maxargs; nargs++){
- while(*s!='\0' && utfrune(qsep, (Rune)*s)!=nil)
- s++;
- if(*s == '\0')
- break;
- args[nargs] = s;
- s = qtoken(s, qsep);
- }
-
- return nargs;
-}
+++ /dev/null
-# Copyright 2010 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# The library is built by the Makefile in the parent directory.
-# This Makefile only builds mkrunetype.
-# GOROOT, GOOS, and GOARCH must be set explicitly.
-
-TARG=mkrunetype
-
-UnicodeData-%.txt:
- curl http://www.unicode.org/Public/$*/ucd/UnicodeData.txt >_$@
- mv _$@ $@
-
-mkrunetype: mkrunetype.c
- cc -I../../../include -o mkrunetype -L$(GOROOT)/pkg/obj/$(GOOS)_$(GOARCH)/ mkrunetype.c -l9
-
-runetypebody-%.h: mkrunetype UnicodeData-%.txt
- mkrunetype -p UnicodeData-$*.txt >_$@
- mv _$@ $@
-
-CLEANFILES+=UnicodeData.txt
-
-UNICODE_VERSION=6.3.0
-
-test: mkrunetype UnicodeData-$(UNICODE_VERSION).txt
- mkrunetype -c UnicodeData-$(UNICODE_VERSION).txt
-
-clean:
- rm -f UnicodeData.txt mkrunetype
+++ /dev/null
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-/*
- * make is(upper|lower|title|space|alpha)rune and
- * to(upper|lower|title)rune from a UnicodeData.txt file.
- * these can be found at unicode.org
- *
- * with -c, runs a check of the existing runetype functions vs.
- * those extracted from UnicodeData.
- *
- * with -p, generates tables for pairs of chars, as well as for ranges
- * and singletons.
- *
- * UnicodeData defines 4 fields of interest:
- * 1) a category
- * 2) an upper case mapping
- * 3) a lower case mapping
- * 4) a title case mapping
- *
- * toupper, tolower, and totitle are defined directly from the mapping.
- *
- * isalpharune(c) is true iff c is a "letter" category
- * isupperrune(c) is true iff c is the target of toupperrune,
- * or is in the uppercase letter category
- * similarly for islowerrune and istitlerune.
- * isspacerune is true for space category chars, "C" locale white space chars,
- * and two additions:
- * 0085 "next line" control char
- * feff] "zero-width non-break space"
- * isdigitrune is true iff c is a numeric-digit category.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <stdio.h>
-#include "utf.h"
-#include "utfdef.h"
-
-enum {
- /*
- * fields in the unicode data file
- */
- FIELD_CODE,
- FIELD_NAME,
- FIELD_CATEGORY,
- FIELD_COMBINING,
- FIELD_BIDIR,
- FIELD_DECOMP,
- FIELD_DECIMAL_DIG,
- FIELD_DIG,
- FIELD_NUMERIC_VAL,
- FIELD_MIRRORED,
- FIELD_UNICODE_1_NAME,
- FIELD_COMMENT,
- FIELD_UPPER,
- FIELD_LOWER,
- FIELD_TITLE,
- NFIELDS,
-
- MAX_LINE = 1024,
-
- TO_OFFSET = 1 << 20,
-
- NRUNES = 1 << 21,
-};
-
-#define TO_DELTA(xmapped,x) (TO_OFFSET + (xmapped) - (x))
-
-static char myisspace[NRUNES];
-static char myisalpha[NRUNES];
-static char myisdigit[NRUNES];
-static char myisupper[NRUNES];
-static char myislower[NRUNES];
-static char myistitle[NRUNES];
-
-static int mytoupper[NRUNES];
-static int mytolower[NRUNES];
-static int mytotitle[NRUNES];
-
-static void check(void);
-static void mktables(char *src, int usepairs);
-static void fatal(const char *fmt, ...);
-static int mygetfields(char **fields, int nfields, char *str, const char *delim);
-static int getunicodeline(FILE *in, char **fields, char *buf);
-static int getcode(char *s);
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: mktables [-cp] <UnicodeData.txt>\n");
- exit(1);
-}
-
-void
-main(int argc, char *argv[])
-{
- FILE *in;
- char buf[MAX_LINE], buf2[MAX_LINE];
- char *fields[NFIELDS + 1], *fields2[NFIELDS + 1];
- char *p;
- int i, code, last, docheck, usepairs;
-
- docheck = 0;
- usepairs = 0;
- ARGBEGIN{
- case 'c':
- docheck = 1;
- break;
- case 'p':
- usepairs = 1;
- break;
- default:
- usage();
- }ARGEND
-
- if(argc != 1){
- usage();
- }
-
- in = fopen(argv[0], "r");
- if(in == NULL){
- fatal("can't open %s", argv[0]);
- }
-
- for(i = 0; i < NRUNES; i++){
- mytoupper[i] = i;
- mytolower[i] = i;
- mytotitle[i] = i;
- }
-
- /*
- * make sure isspace has all of the "C" locale whitespace chars
- */
- myisspace['\t'] = 1;
- myisspace['\n'] = 1;
- myisspace['\r'] = 1;
- myisspace['\f'] = 1;
- myisspace['\v'] = 1;
-
- /*
- * a couple of other exceptions
- */
- myisspace[0x85] = 1; /* control char, "next line" */
- myisspace[0xfeff] = 1; /* zero-width non-break space */
-
- last = -1;
- while(getunicodeline(in, fields, buf)){
- code = getcode(fields[FIELD_CODE]);
- if (code >= NRUNES)
- fatal("code-point value too big: %x", code);
- if(code <= last)
- fatal("bad code sequence: %x then %x", last, code);
- last = code;
-
- /*
- * check for ranges
- */
- p = fields[FIELD_CATEGORY];
- if(strstr(fields[FIELD_NAME], ", First>") != NULL){
- if(!getunicodeline(in, fields2, buf2))
- fatal("range start at eof");
- if (strstr(fields2[FIELD_NAME], ", Last>") == NULL)
- fatal("range start not followed by range end");
- last = getcode(fields2[FIELD_CODE]);
- if(last <= code)
- fatal("range out of sequence: %x then %x", code, last);
- if(strcmp(p, fields2[FIELD_CATEGORY]) != 0)
- fatal("range with mismatched category");
- }
-
- /*
- * set properties and conversions
- */
- for (; code <= last; code++){
- if(p[0] == 'L')
- myisalpha[code] = 1;
- if(p[0] == 'Z')
- myisspace[code] = 1;
-
- if(strcmp(p, "Lu") == 0)
- myisupper[code] = 1;
- if(strcmp(p, "Ll") == 0)
- myislower[code] = 1;
-
- if(strcmp(p, "Lt") == 0)
- myistitle[code] = 1;
-
- if(strcmp(p, "Nd") == 0)
- myisdigit[code] = 1;
-
- /*
- * when finding conversions, also need to mark
- * upper/lower case, since some chars, like
- * "III" (0x2162), aren't defined as letters but have a
- * lower case mapping ("iii" (0x2172)).
- */
- if(fields[FIELD_UPPER][0] != '\0'){
- mytoupper[code] = getcode(fields[FIELD_UPPER]);
- }
- if(fields[FIELD_LOWER][0] != '\0'){
- mytolower[code] = getcode(fields[FIELD_LOWER]);
- }
- if(fields[FIELD_TITLE][0] != '\0'){
- mytotitle[code] = getcode(fields[FIELD_TITLE]);
- }
- }
- }
-
- fclose(in);
-
- /*
- * check for codes with no totitle mapping but a toupper mapping.
- * these appear in UnicodeData-2.0.14.txt, but are almost certainly
- * erroneous.
- */
- for(i = 0; i < NRUNES; i++){
- if(mytotitle[i] == i
- && mytoupper[i] != i
- && !myistitle[i])
- fprintf(stderr, "warning: code=%.4x not istitle, totitle is same, toupper=%.4x\n", i, mytoupper[i]);
- }
-
- /*
- * make sure isupper[c] is true if for some x toupper[x] == c
- * ditto for islower and istitle
- */
- for(i = 0; i < NRUNES; i++) {
- if(mytoupper[i] != i)
- myisupper[mytoupper[i]] = 1;
- if(mytolower[i] != i)
- myislower[mytolower[i]] = 1;
- if(mytotitle[i] != i)
- myistitle[mytotitle[i]] = 1;
- }
-
- if(docheck){
- check();
- }else{
- mktables(argv[0], usepairs);
- }
- exit(0);
-}
-
-/*
- * generate a properties array for ranges, clearing those cases covered.
- * if force, generate one-entry ranges for singletons.
- */
-static int
-mkisrange(const char* label, char* prop, int force)
-{
- int start, stop, some;
-
- /*
- * first, the ranges
- */
- some = 0;
- for(start = 0; start < NRUNES; ) {
- if(!prop[start]){
- start++;
- continue;
- }
-
- for(stop = start + 1; stop < NRUNES; stop++){
- if(!prop[stop]){
- break;
- }
- prop[stop] = 0;
- }
- if(force || stop != start + 1){
- if(!some){
- printf("static Rune __is%sr[] = {\n", label);
- some = 1;
- }
- prop[start] = 0;
- printf("\t0x%.4x, 0x%.4x,\n", start, stop - 1);
- }
-
- start = stop;
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate a mapping array for pairs with a skip between,
- * clearing those entries covered.
- */
-static int
-mkispair(const char *label, char *prop)
-{
- int start, stop, some;
-
- some = 0;
- for(start = 0; start + 2 < NRUNES; ) {
- if(!prop[start]){
- start++;
- continue;
- }
-
- for(stop = start + 2; stop < NRUNES; stop += 2){
- if(!prop[stop]){
- break;
- }
- prop[stop] = 0;
- }
- if(stop != start + 2){
- if(!some){
- printf("static Rune __is%sp[] = {\n", label);
- some = 1;
- }
- prop[start] = 0;
- printf("\t0x%.4x, 0x%.4x,\n", start, stop - 2);
- }
-
- start = stop;
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate a properties array for singletons, clearing those cases covered.
- */
-static int
-mkissingle(const char *label, char *prop)
-{
- int start, some;
-
- some = 0;
- for(start = 0; start < NRUNES; start++) {
- if(!prop[start]){
- continue;
- }
-
- if(!some){
- printf("static Rune __is%ss[] = {\n", label);
- some = 1;
- }
- prop[start] = 0;
- printf("\t0x%.4x,\n", start);
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate tables and a function for is<label>rune
- */
-static void
-mkis(const char* label, char* prop, int usepairs)
-{
- int isr, isp, iss;
-
- isr = mkisrange(label, prop, 0);
- isp = 0;
- if(usepairs)
- isp = mkispair(label, prop);
- iss = mkissingle(label, prop);
-
- printf(
- "int\n"
- "is%srune(Rune c)\n"
- "{\n"
- " Rune *p;\n"
- "\n",
- label);
-
- if(isr)
- printf(
- " p = rbsearch(c, __is%sr, nelem(__is%sr)/2, 2);\n"
- " if(p && c >= p[0] && c <= p[1])\n"
- " return 1;\n",
- label, label);
-
- if(isp)
- printf(
- " p = rbsearch(c, __is%sp, nelem(__is%sp)/2, 2);\n"
- " if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n"
- " return 1;\n",
- label, label);
-
- if(iss)
- printf(
- " p = rbsearch(c, __is%ss, nelem(__is%ss), 1);\n"
- " if(p && c == p[0])\n"
- " return 1;\n",
- label, label);
-
-
- printf(
- " return 0;\n"
- "}\n"
- "\n"
- );
-}
-
-/*
- * generate a mapping array for ranges, clearing those entries covered.
- * if force, generate one-entry ranges for singletons.
- */
-static int
-mktorange(const char* label, int* map, int force)
-{
- int start, stop, delta, some;
-
- some = 0;
- for(start = 0; start < NRUNES; ) {
- if(map[start] == start){
- start++;
- continue;
- }
-
- delta = TO_DELTA(map[start], start);
- if(delta != (Rune)delta)
- fatal("bad map delta %d", delta);
- for(stop = start + 1; stop < NRUNES; stop++){
- if(TO_DELTA(map[stop], stop) != delta){
- break;
- }
- map[stop] = stop;
- }
- if(stop != start + 1){
- if(!some){
- printf("static Rune __to%sr[] = {\n", label);
- some = 1;
- }
- map[start] = start;
- printf("\t0x%.4x, 0x%.4x, %d,\n", start, stop - 1, delta);
- }
-
- start = stop;
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate a mapping array for pairs with a skip between,
- * clearing those entries covered.
- */
-static int
-mktopair(const char* label, int* map)
-{
- int start, stop, delta, some;
-
- some = 0;
- for(start = 0; start + 2 < NRUNES; ) {
- if(map[start] == start){
- start++;
- continue;
- }
-
- delta = TO_DELTA(map[start], start);
- if(delta != (Rune)delta)
- fatal("bad map delta %d", delta);
- for(stop = start + 2; stop < NRUNES; stop += 2){
- if(TO_DELTA(map[stop], stop) != delta){
- break;
- }
- map[stop] = stop;
- }
- if(stop != start + 2){
- if(!some){
- printf("static Rune __to%sp[] = {\n", label);
- some = 1;
- }
- map[start] = start;
- printf("\t0x%.4x, 0x%.4x, %d,\n", start, stop - 2, delta);
- }
-
- start = stop;
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate a mapping array for singletons, clearing those entries covered.
- */
-static int
-mktosingle(const char* label, int* map)
-{
- int start, delta, some;
-
- some = 0;
- for(start = 0; start < NRUNES; start++) {
- if(map[start] == start){
- continue;
- }
-
- delta = TO_DELTA(map[start], start);
- if(delta != (Rune)delta)
- fatal("bad map delta %d", delta);
- if(!some){
- printf("static Rune __to%ss[] = {\n", label);
- some = 1;
- }
- map[start] = start;
- printf("\t0x%.4x, %d,\n", start, delta);
- }
- if(some)
- printf("};\n\n");
- return some;
-}
-
-/*
- * generate tables and a function for to<label>rune
- */
-static void
-mkto(const char* label, int* map, int usepairs)
-{
- int tor, top, tos;
-
- tor = mktorange(label, map, 0);
- top = 0;
- if(usepairs)
- top = mktopair(label, map);
- tos = mktosingle(label, map);
-
- printf(
- "Rune\n"
- "to%srune(Rune c)\n"
- "{\n"
- " Rune *p;\n"
- "\n",
- label);
-
- if(tor)
- printf(
- " p = rbsearch(c, __to%sr, nelem(__to%sr)/3, 3);\n"
- " if(p && c >= p[0] && c <= p[1])\n"
- " return c + p[2] - %d;\n",
- label, label, TO_OFFSET);
-
- if(top)
- printf(
- " p = rbsearch(c, __to%sp, nelem(__to%sp)/3, 3);\n"
- " if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n"
- " return c + p[2] - %d;\n",
- label, label, TO_OFFSET);
-
- if(tos)
- printf(
- " p = rbsearch(c, __to%ss, nelem(__to%ss)/2, 2);\n"
- " if(p && c == p[0])\n"
- " return c + p[1] - %d;\n",
- label, label, TO_OFFSET);
-
-
- printf(
- " return c;\n"
- "}\n"
- "\n"
- );
-}
-
-// Make only range tables and a function for is<label>rune.
-static void
-mkisronly(const char* label, char* prop)
-{
- mkisrange(label, prop, 1);
- printf(
- "int\n"
- "is%srune(Rune c)\n"
- "{\n"
- " Rune *p;\n"
- "\n"
- " p = rbsearch(c, __is%sr, nelem(__is%sr)/2, 2);\n"
- " if(p && c >= p[0] && c <= p[1])\n"
- " return 1;\n"
- " return 0;\n"
- "}\n"
- "\n",
- label, label, label);
-}
-
-/*
- * generate the body of runetype.
- * assumes there is a function Rune* rbsearch(Rune c, Rune *t, int n, int ne);
- */
-static void
-mktables(char *src, int usepairs)
-{
- printf("/* generated automatically by mkrunetype.c from %s */\n\n", src);
-
- /*
- * we special case the space and digit tables, since they are assumed
- * to be small with several ranges.
- */
- mkisronly("space", myisspace);
- mkisronly("digit", myisdigit);
-
- mkis("alpha", myisalpha, 0);
- mkis("upper", myisupper, usepairs);
- mkis("lower", myislower, usepairs);
- mkis("title", myistitle, usepairs);
-
- mkto("upper", mytoupper, usepairs);
- mkto("lower", mytolower, usepairs);
- mkto("title", mytotitle, usepairs);
-}
-
-/*
- * find differences between the newly generated tables and current runetypes.
- */
-static void
-check(void)
-{
- int i;
-
- for(i = 0; i < NRUNES; i++){
- if(isdigitrune(i) != myisdigit[i])
- fprintf(stderr, "isdigit diff at %x: runetype=%x, unicode=%x\n",
- i, isdigitrune(i), myisdigit[i]);
-
- if(isspacerune(i) != myisspace[i])
- fprintf(stderr, "isspace diff at %x: runetype=%x, unicode=%x\n",
- i, isspacerune(i), myisspace[i]);
-
- if(isupperrune(i) != myisupper[i])
- fprintf(stderr, "isupper diff at %x: runetype=%x, unicode=%x\n",
- i, isupperrune(i), myisupper[i]);
-
- if(islowerrune(i) != myislower[i])
- fprintf(stderr, "islower diff at %x: runetype=%x, unicode=%x\n",
- i, islowerrune(i), myislower[i]);
-
- if(isalpharune(i) != myisalpha[i])
- fprintf(stderr, "isalpha diff at %x: runetype=%x, unicode=%x\n",
- i, isalpharune(i), myisalpha[i]);
-
- if(toupperrune(i) != mytoupper[i])
- fprintf(stderr, "toupper diff at %x: runetype=%x, unicode=%x\n",
- i, toupperrune(i), mytoupper[i]);
-
- if(tolowerrune(i) != mytolower[i])
- fprintf(stderr, "tolower diff at %x: runetype=%x, unicode=%x\n",
- i, tolowerrune(i), mytolower[i]);
-
- if(istitlerune(i) != myistitle[i])
- fprintf(stderr, "istitle diff at %x: runetype=%x, unicode=%x\n",
- i, istitlerune(i), myistitle[i]);
-
- if(totitlerune(i) != mytotitle[i])
- fprintf(stderr, "totitle diff at %x: runetype=%x, unicode=%x\n",
- i, totitlerune(i), mytotitle[i]);
-
-
- }
-}
-
-static int
-mygetfields(char **fields, int nfields, char *str, const char *delim)
-{
- int nf;
-
- fields[0] = str;
- nf = 1;
- if(nf >= nfields)
- return nf;
-
- for(; *str; str++){
- if(strchr(delim, *str) != NULL){
- *str = '\0';
- fields[nf++] = str + 1;
- if(nf >= nfields)
- break;
- }
- }
- return nf;
-}
-
-static int
-getunicodeline(FILE *in, char **fields, char *buf)
-{
- char *p;
-
- if(fgets(buf, MAX_LINE, in) == NULL)
- return 0;
-
- p = strchr(buf, '\n');
- if (p == NULL)
- fatal("line too long");
- *p = '\0';
-
- if (mygetfields(fields, NFIELDS + 1, buf, ";") != NFIELDS)
- fatal("bad number of fields");
-
- return 1;
-}
-
-static int
-getcode(char *s)
-{
- int i, code;
-
- code = 0;
- i = 0;
- /* Parse a hex number */
- while(s[i]) {
- code <<= 4;
- if(s[i] >= '0' && s[i] <= '9')
- code += s[i] - '0';
- else if(s[i] >= 'A' && s[i] <= 'F')
- code += s[i] - 'A' + 10;
- else
- fatal("bad code char '%c'", s[i]);
- i++;
- }
- return code;
-}
-
-static void
-fatal(const char *fmt, ...)
-{
- va_list arg;
-
- fprintf(stderr, "%s: fatal error: ", argv0);
- va_start(arg, fmt);
- vfprintf(stderr, fmt, arg);
- va_end(arg);
- fprintf(stderr, "\n");
-
- exit(1);
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Portions Copyright (c) 2009 The Go Authors. All rights reserved.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-enum
-{
- Bit1 = 7,
- Bitx = 6,
- Bit2 = 5,
- Bit3 = 4,
- Bit4 = 3,
- Bit5 = 2,
-
- T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */
- Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */
- T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */
- T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */
- T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */
- T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */
-
- Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */
- Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */
- Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */
- Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0001 1111 1111 1111 1111 1111 */
-
- Maskx = (1<<Bitx)-1, /* 0011 1111 */
- Testx = Maskx ^ 0xFF, /* 1100 0000 */
-
- SurrogateMin = 0xD800,
- SurrogateMax = 0xDFFF,
-
- Bad = Runeerror,
-};
-
-/*
- * Modified by Wei-Hwa Huang, Google Inc., on 2004-09-24
- * This is a slower but "safe" version of the old chartorune
- * that works on strings that are not necessarily null-terminated.
- *
- * If you know for sure that your string is null-terminated,
- * chartorune will be a bit faster.
- *
- * It is guaranteed not to attempt to access "length"
- * past the incoming pointer. This is to avoid
- * possible access violations. If the string appears to be
- * well-formed but incomplete (i.e., to get the whole Rune
- * we'd need to read past str+length) then we'll set the Rune
- * to Bad and return 0.
- *
- * Note that if we have decoding problems for other
- * reasons, we return 1 instead of 0.
- */
-int
-charntorune(Rune *rune, const char *str, int length)
-{
- int c, c1, c2, c3;
- long l;
-
- /* When we're not allowed to read anything */
- if(length <= 0) {
- goto badlen;
- }
-
- /*
- * one character sequence (7-bit value)
- * 00000-0007F => T1
- */
- c = *(uchar*)str;
- if(c < Tx) {
- *rune = (Rune)c;
- return 1;
- }
-
- // If we can't read more than one character we must stop
- if(length <= 1) {
- goto badlen;
- }
-
- /*
- * two character sequence (11-bit value)
- * 0080-07FF => T2 Tx
- */
- c1 = *(uchar*)(str+1) ^ Tx;
- if(c1 & Testx)
- goto bad;
- if(c < T3) {
- if(c < T2)
- goto bad;
- l = ((c << Bitx) | c1) & Rune2;
- if(l <= Rune1)
- goto bad;
- *rune = (Rune)l;
- return 2;
- }
-
- // If we can't read more than two characters we must stop
- if(length <= 2) {
- goto badlen;
- }
-
- /*
- * three character sequence (16-bit value)
- * 0800-FFFF => T3 Tx Tx
- */
- c2 = *(uchar*)(str+2) ^ Tx;
- if(c2 & Testx)
- goto bad;
- if(c < T4) {
- l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
- if(l <= Rune2)
- goto bad;
- if (SurrogateMin <= l && l <= SurrogateMax)
- goto bad;
- *rune = (Rune)l;
- return 3;
- }
-
- if (length <= 3)
- goto badlen;
-
- /*
- * four character sequence (21-bit value)
- * 10000-1FFFFF => T4 Tx Tx Tx
- */
- c3 = *(uchar*)(str+3) ^ Tx;
- if (c3 & Testx)
- goto bad;
- if (c < T5) {
- l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
- if (l <= Rune3 || l > Runemax)
- goto bad;
- *rune = (Rune)l;
- return 4;
- }
-
- // Support for 5-byte or longer UTF-8 would go here, but
- // since we don't have that, we'll just fall through to bad.
-
- /*
- * bad decoding
- */
-bad:
- *rune = Bad;
- return 1;
-badlen:
- *rune = Bad;
- return 0;
-
-}
-
-
-/*
- * This is the older "unsafe" version, which works fine on
- * null-terminated strings.
- */
-int
-chartorune(Rune *rune, const char *str)
-{
- int c, c1, c2, c3;
- long l;
-
- /*
- * one character sequence
- * 00000-0007F => T1
- */
- c = *(uchar*)str;
- if(c < Tx) {
- *rune = (Rune)c;
- return 1;
- }
-
- /*
- * two character sequence
- * 0080-07FF => T2 Tx
- */
- c1 = *(uchar*)(str+1) ^ Tx;
- if(c1 & Testx)
- goto bad;
- if(c < T3) {
- if(c < T2)
- goto bad;
- l = ((c << Bitx) | c1) & Rune2;
- if(l <= Rune1)
- goto bad;
- *rune = (Rune)l;
- return 2;
- }
-
- /*
- * three character sequence
- * 0800-FFFF => T3 Tx Tx
- */
- c2 = *(uchar*)(str+2) ^ Tx;
- if(c2 & Testx)
- goto bad;
- if(c < T4) {
- l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
- if(l <= Rune2)
- goto bad;
- if (SurrogateMin <= l && l <= SurrogateMax)
- goto bad;
- *rune = (Rune)l;
- return 3;
- }
-
- /*
- * four character sequence (21-bit value)
- * 10000-1FFFFF => T4 Tx Tx Tx
- */
- c3 = *(uchar*)(str+3) ^ Tx;
- if (c3 & Testx)
- goto bad;
- if (c < T5) {
- l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
- if (l <= Rune3 || l > Runemax)
- goto bad;
- *rune = (Rune)l;
- return 4;
- }
-
- /*
- * Support for 5-byte or longer UTF-8 would go here, but
- * since we don't have that, we'll just fall through to bad.
- */
-
- /*
- * bad decoding
- */
-bad:
- *rune = Bad;
- return 1;
-}
-
-int
-isvalidcharntorune(const char* str, int length, Rune* rune, int* consumed)
-{
- *consumed = charntorune(rune, str, length);
- return *rune != Runeerror || *consumed == 3;
-}
-
-int
-runetochar(char *str, const Rune *rune)
-{
- /* Runes are signed, so convert to unsigned for range check. */
- unsigned long c;
-
- /*
- * one character sequence
- * 00000-0007F => 00-7F
- */
- c = *rune;
- if(c <= Rune1) {
- str[0] = (char)c;
- return 1;
- }
-
- /*
- * two character sequence
- * 0080-07FF => T2 Tx
- */
- if(c <= Rune2) {
- str[0] = (char)(T2 | (c >> 1*Bitx));
- str[1] = (char)(Tx | (c & Maskx));
- return 2;
- }
-
- /*
- * If the Rune is out of range or a surrogate half, convert it to the error rune.
- * Do this test here because the error rune encodes to three bytes.
- * Doing it earlier would duplicate work, since an out of range
- * Rune wouldn't have fit in one or two bytes.
- */
- if (c > Runemax)
- c = Runeerror;
- if (SurrogateMin <= c && c <= SurrogateMax)
- c = Runeerror;
-
- /*
- * three character sequence
- * 0800-FFFF => T3 Tx Tx
- */
- if (c <= Rune3) {
- str[0] = (char)(T3 | (c >> 2*Bitx));
- str[1] = (char)(Tx | ((c >> 1*Bitx) & Maskx));
- str[2] = (char)(Tx | (c & Maskx));
- return 3;
- }
-
- /*
- * four character sequence (21-bit value)
- * 10000-1FFFFF => T4 Tx Tx Tx
- */
- str[0] = (char)(T4 | (c >> 3*Bitx));
- str[1] = (char)(Tx | ((c >> 2*Bitx) & Maskx));
- str[2] = (char)(Tx | ((c >> 1*Bitx) & Maskx));
- str[3] = (char)(Tx | (c & Maskx));
- return 4;
-}
-
-int
-runelen(Rune rune)
-{
- char str[10];
-
- return runetochar(str, &rune);
-}
-
-int
-runenlen(const Rune *r, int nrune)
-{
- int nb, c;
-
- nb = 0;
- while(nrune--) {
- c = (int)*r++;
- if (c <= Rune1)
- nb++;
- else if (c <= Rune2)
- nb += 2;
- else if (c <= Rune3)
- nb += 3;
- else /* assert(c <= Rune4) */
- nb += 4;
- }
- return nb;
-}
-
-int
-fullrune(const char *str, int n)
-{
- if (n > 0) {
- int c = *(uchar*)str;
- if (c < Tx)
- return 1;
- if (n > 1) {
- if (c < T3)
- return 1;
- if (n > 2) {
- if (c < T4 || n > 3)
- return 1;
- }
- }
- }
- return 0;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-static
-Rune*
-rbsearch(Rune c, Rune *t, int n, int ne)
-{
- Rune *p;
- int m;
-
- while(n > 1) {
- m = n >> 1;
- p = t + m*ne;
- if(c >= p[0]) {
- t = p;
- n = n-m;
- } else
- n = m;
- }
- if(n && c >= t[0])
- return t;
- return 0;
-}
-
-#include "runetypebody-6.3.0.h"
+++ /dev/null
-/* generated automatically by mkrunetype.c from UnicodeData-6.3.0.txt */
-
-static Rune __isspacer[] = {
- 0x0009, 0x000d,
- 0x0020, 0x0020,
- 0x0085, 0x0085,
- 0x00a0, 0x00a0,
- 0x1680, 0x1680,
- 0x2000, 0x200a,
- 0x2028, 0x2029,
- 0x202f, 0x202f,
- 0x205f, 0x205f,
- 0x3000, 0x3000,
- 0xfeff, 0xfeff,
-};
-
-int
-isspacerune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __isspacer, nelem(__isspacer)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- return 0;
-}
-
-static Rune __isdigitr[] = {
- 0x0030, 0x0039,
- 0x0660, 0x0669,
- 0x06f0, 0x06f9,
- 0x07c0, 0x07c9,
- 0x0966, 0x096f,
- 0x09e6, 0x09ef,
- 0x0a66, 0x0a6f,
- 0x0ae6, 0x0aef,
- 0x0b66, 0x0b6f,
- 0x0be6, 0x0bef,
- 0x0c66, 0x0c6f,
- 0x0ce6, 0x0cef,
- 0x0d66, 0x0d6f,
- 0x0e50, 0x0e59,
- 0x0ed0, 0x0ed9,
- 0x0f20, 0x0f29,
- 0x1040, 0x1049,
- 0x1090, 0x1099,
- 0x17e0, 0x17e9,
- 0x1810, 0x1819,
- 0x1946, 0x194f,
- 0x19d0, 0x19d9,
- 0x1a80, 0x1a89,
- 0x1a90, 0x1a99,
- 0x1b50, 0x1b59,
- 0x1bb0, 0x1bb9,
- 0x1c40, 0x1c49,
- 0x1c50, 0x1c59,
- 0xa620, 0xa629,
- 0xa8d0, 0xa8d9,
- 0xa900, 0xa909,
- 0xa9d0, 0xa9d9,
- 0xaa50, 0xaa59,
- 0xabf0, 0xabf9,
- 0xff10, 0xff19,
- 0x104a0, 0x104a9,
- 0x11066, 0x1106f,
- 0x110f0, 0x110f9,
- 0x11136, 0x1113f,
- 0x111d0, 0x111d9,
- 0x116c0, 0x116c9,
- 0x1d7ce, 0x1d7ff,
-};
-
-int
-isdigitrune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __isdigitr, nelem(__isdigitr)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- return 0;
-}
-
-static Rune __isalphar[] = {
- 0x0041, 0x005a,
- 0x0061, 0x007a,
- 0x00c0, 0x00d6,
- 0x00d8, 0x00f6,
- 0x00f8, 0x02c1,
- 0x02c6, 0x02d1,
- 0x02e0, 0x02e4,
- 0x0370, 0x0374,
- 0x0376, 0x0377,
- 0x037a, 0x037d,
- 0x0388, 0x038a,
- 0x038e, 0x03a1,
- 0x03a3, 0x03f5,
- 0x03f7, 0x0481,
- 0x048a, 0x0527,
- 0x0531, 0x0556,
- 0x0561, 0x0587,
- 0x05d0, 0x05ea,
- 0x05f0, 0x05f2,
- 0x0620, 0x064a,
- 0x066e, 0x066f,
- 0x0671, 0x06d3,
- 0x06e5, 0x06e6,
- 0x06ee, 0x06ef,
- 0x06fa, 0x06fc,
- 0x0712, 0x072f,
- 0x074d, 0x07a5,
- 0x07ca, 0x07ea,
- 0x07f4, 0x07f5,
- 0x0800, 0x0815,
- 0x0840, 0x0858,
- 0x08a2, 0x08ac,
- 0x0904, 0x0939,
- 0x0958, 0x0961,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0985, 0x098c,
- 0x098f, 0x0990,
- 0x0993, 0x09a8,
- 0x09aa, 0x09b0,
- 0x09b6, 0x09b9,
- 0x09dc, 0x09dd,
- 0x09df, 0x09e1,
- 0x09f0, 0x09f1,
- 0x0a05, 0x0a0a,
- 0x0a0f, 0x0a10,
- 0x0a13, 0x0a28,
- 0x0a2a, 0x0a30,
- 0x0a32, 0x0a33,
- 0x0a35, 0x0a36,
- 0x0a38, 0x0a39,
- 0x0a59, 0x0a5c,
- 0x0a72, 0x0a74,
- 0x0a85, 0x0a8d,
- 0x0a8f, 0x0a91,
- 0x0a93, 0x0aa8,
- 0x0aaa, 0x0ab0,
- 0x0ab2, 0x0ab3,
- 0x0ab5, 0x0ab9,
- 0x0ae0, 0x0ae1,
- 0x0b05, 0x0b0c,
- 0x0b0f, 0x0b10,
- 0x0b13, 0x0b28,
- 0x0b2a, 0x0b30,
- 0x0b32, 0x0b33,
- 0x0b35, 0x0b39,
- 0x0b5c, 0x0b5d,
- 0x0b5f, 0x0b61,
- 0x0b85, 0x0b8a,
- 0x0b8e, 0x0b90,
- 0x0b92, 0x0b95,
- 0x0b99, 0x0b9a,
- 0x0b9e, 0x0b9f,
- 0x0ba3, 0x0ba4,
- 0x0ba8, 0x0baa,
- 0x0bae, 0x0bb9,
- 0x0c05, 0x0c0c,
- 0x0c0e, 0x0c10,
- 0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
- 0x0c58, 0x0c59,
- 0x0c60, 0x0c61,
- 0x0c85, 0x0c8c,
- 0x0c8e, 0x0c90,
- 0x0c92, 0x0ca8,
- 0x0caa, 0x0cb3,
- 0x0cb5, 0x0cb9,
- 0x0ce0, 0x0ce1,
- 0x0cf1, 0x0cf2,
- 0x0d05, 0x0d0c,
- 0x0d0e, 0x0d10,
- 0x0d12, 0x0d3a,
- 0x0d60, 0x0d61,
- 0x0d7a, 0x0d7f,
- 0x0d85, 0x0d96,
- 0x0d9a, 0x0db1,
- 0x0db3, 0x0dbb,
- 0x0dc0, 0x0dc6,
- 0x0e01, 0x0e30,
- 0x0e32, 0x0e33,
- 0x0e40, 0x0e46,
- 0x0e81, 0x0e82,
- 0x0e87, 0x0e88,
- 0x0e94, 0x0e97,
- 0x0e99, 0x0e9f,
- 0x0ea1, 0x0ea3,
- 0x0eaa, 0x0eab,
- 0x0ead, 0x0eb0,
- 0x0eb2, 0x0eb3,
- 0x0ec0, 0x0ec4,
- 0x0edc, 0x0edf,
- 0x0f40, 0x0f47,
- 0x0f49, 0x0f6c,
- 0x0f88, 0x0f8c,
- 0x1000, 0x102a,
- 0x1050, 0x1055,
- 0x105a, 0x105d,
- 0x1065, 0x1066,
- 0x106e, 0x1070,
- 0x1075, 0x1081,
- 0x10a0, 0x10c5,
- 0x10d0, 0x10fa,
- 0x10fc, 0x1248,
- 0x124a, 0x124d,
- 0x1250, 0x1256,
- 0x125a, 0x125d,
- 0x1260, 0x1288,
- 0x128a, 0x128d,
- 0x1290, 0x12b0,
- 0x12b2, 0x12b5,
- 0x12b8, 0x12be,
- 0x12c2, 0x12c5,
- 0x12c8, 0x12d6,
- 0x12d8, 0x1310,
- 0x1312, 0x1315,
- 0x1318, 0x135a,
- 0x1380, 0x138f,
- 0x13a0, 0x13f4,
- 0x1401, 0x166c,
- 0x166f, 0x167f,
- 0x1681, 0x169a,
- 0x16a0, 0x16ea,
- 0x1700, 0x170c,
- 0x170e, 0x1711,
- 0x1720, 0x1731,
- 0x1740, 0x1751,
- 0x1760, 0x176c,
- 0x176e, 0x1770,
- 0x1780, 0x17b3,
- 0x1820, 0x1877,
- 0x1880, 0x18a8,
- 0x18b0, 0x18f5,
- 0x1900, 0x191c,
- 0x1950, 0x196d,
- 0x1970, 0x1974,
- 0x1980, 0x19ab,
- 0x19c1, 0x19c7,
- 0x1a00, 0x1a16,
- 0x1a20, 0x1a54,
- 0x1b05, 0x1b33,
- 0x1b45, 0x1b4b,
- 0x1b83, 0x1ba0,
- 0x1bae, 0x1baf,
- 0x1bba, 0x1be5,
- 0x1c00, 0x1c23,
- 0x1c4d, 0x1c4f,
- 0x1c5a, 0x1c7d,
- 0x1ce9, 0x1cec,
- 0x1cee, 0x1cf1,
- 0x1cf5, 0x1cf6,
- 0x1d00, 0x1dbf,
- 0x1e00, 0x1f15,
- 0x1f18, 0x1f1d,
- 0x1f20, 0x1f45,
- 0x1f48, 0x1f4d,
- 0x1f50, 0x1f57,
- 0x1f5f, 0x1f7d,
- 0x1f80, 0x1fb4,
- 0x1fb6, 0x1fbc,
- 0x1fc2, 0x1fc4,
- 0x1fc6, 0x1fcc,
- 0x1fd0, 0x1fd3,
- 0x1fd6, 0x1fdb,
- 0x1fe0, 0x1fec,
- 0x1ff2, 0x1ff4,
- 0x1ff6, 0x1ffc,
- 0x2090, 0x209c,
- 0x210a, 0x2113,
- 0x2119, 0x211d,
- 0x212a, 0x212d,
- 0x212f, 0x2139,
- 0x213c, 0x213f,
- 0x2145, 0x2149,
- 0x2183, 0x2184,
- 0x2c00, 0x2c2e,
- 0x2c30, 0x2c5e,
- 0x2c60, 0x2ce4,
- 0x2ceb, 0x2cee,
- 0x2cf2, 0x2cf3,
- 0x2d00, 0x2d25,
- 0x2d30, 0x2d67,
- 0x2d80, 0x2d96,
- 0x2da0, 0x2da6,
- 0x2da8, 0x2dae,
- 0x2db0, 0x2db6,
- 0x2db8, 0x2dbe,
- 0x2dc0, 0x2dc6,
- 0x2dc8, 0x2dce,
- 0x2dd0, 0x2dd6,
- 0x2dd8, 0x2dde,
- 0x3005, 0x3006,
- 0x3031, 0x3035,
- 0x303b, 0x303c,
- 0x3041, 0x3096,
- 0x309d, 0x309f,
- 0x30a1, 0x30fa,
- 0x30fc, 0x30ff,
- 0x3105, 0x312d,
- 0x3131, 0x318e,
- 0x31a0, 0x31ba,
- 0x31f0, 0x31ff,
- 0x3400, 0x4db5,
- 0x4e00, 0x9fcc,
- 0xa000, 0xa48c,
- 0xa4d0, 0xa4fd,
- 0xa500, 0xa60c,
- 0xa610, 0xa61f,
- 0xa62a, 0xa62b,
- 0xa640, 0xa66e,
- 0xa67f, 0xa697,
- 0xa6a0, 0xa6e5,
- 0xa717, 0xa71f,
- 0xa722, 0xa788,
- 0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
- 0xa803, 0xa805,
- 0xa807, 0xa80a,
- 0xa80c, 0xa822,
- 0xa840, 0xa873,
- 0xa882, 0xa8b3,
- 0xa8f2, 0xa8f7,
- 0xa90a, 0xa925,
- 0xa930, 0xa946,
- 0xa960, 0xa97c,
- 0xa984, 0xa9b2,
- 0xaa00, 0xaa28,
- 0xaa40, 0xaa42,
- 0xaa44, 0xaa4b,
- 0xaa60, 0xaa76,
- 0xaa80, 0xaaaf,
- 0xaab5, 0xaab6,
- 0xaab9, 0xaabd,
- 0xaadb, 0xaadd,
- 0xaae0, 0xaaea,
- 0xaaf2, 0xaaf4,
- 0xab01, 0xab06,
- 0xab09, 0xab0e,
- 0xab11, 0xab16,
- 0xab20, 0xab26,
- 0xab28, 0xab2e,
- 0xabc0, 0xabe2,
- 0xac00, 0xd7a3,
- 0xd7b0, 0xd7c6,
- 0xd7cb, 0xd7fb,
- 0xf900, 0xfa6d,
- 0xfa70, 0xfad9,
- 0xfb00, 0xfb06,
- 0xfb13, 0xfb17,
- 0xfb1f, 0xfb28,
- 0xfb2a, 0xfb36,
- 0xfb38, 0xfb3c,
- 0xfb40, 0xfb41,
- 0xfb43, 0xfb44,
- 0xfb46, 0xfbb1,
- 0xfbd3, 0xfd3d,
- 0xfd50, 0xfd8f,
- 0xfd92, 0xfdc7,
- 0xfdf0, 0xfdfb,
- 0xfe70, 0xfe74,
- 0xfe76, 0xfefc,
- 0xff21, 0xff3a,
- 0xff41, 0xff5a,
- 0xff66, 0xffbe,
- 0xffc2, 0xffc7,
- 0xffca, 0xffcf,
- 0xffd2, 0xffd7,
- 0xffda, 0xffdc,
- 0x10000, 0x1000b,
- 0x1000d, 0x10026,
- 0x10028, 0x1003a,
- 0x1003c, 0x1003d,
- 0x1003f, 0x1004d,
- 0x10050, 0x1005d,
- 0x10080, 0x100fa,
- 0x10280, 0x1029c,
- 0x102a0, 0x102d0,
- 0x10300, 0x1031e,
- 0x10330, 0x10340,
- 0x10342, 0x10349,
- 0x10380, 0x1039d,
- 0x103a0, 0x103c3,
- 0x103c8, 0x103cf,
- 0x10400, 0x1049d,
- 0x10800, 0x10805,
- 0x1080a, 0x10835,
- 0x10837, 0x10838,
- 0x1083f, 0x10855,
- 0x10900, 0x10915,
- 0x10920, 0x10939,
- 0x10980, 0x109b7,
- 0x109be, 0x109bf,
- 0x10a10, 0x10a13,
- 0x10a15, 0x10a17,
- 0x10a19, 0x10a33,
- 0x10a60, 0x10a7c,
- 0x10b00, 0x10b35,
- 0x10b40, 0x10b55,
- 0x10b60, 0x10b72,
- 0x10c00, 0x10c48,
- 0x11003, 0x11037,
- 0x11083, 0x110af,
- 0x110d0, 0x110e8,
- 0x11103, 0x11126,
- 0x11183, 0x111b2,
- 0x111c1, 0x111c4,
- 0x11680, 0x116aa,
- 0x12000, 0x1236e,
- 0x13000, 0x1342e,
- 0x16800, 0x16a38,
- 0x16f00, 0x16f44,
- 0x16f93, 0x16f9f,
- 0x1b000, 0x1b001,
- 0x1d400, 0x1d454,
- 0x1d456, 0x1d49c,
- 0x1d49e, 0x1d49f,
- 0x1d4a5, 0x1d4a6,
- 0x1d4a9, 0x1d4ac,
- 0x1d4ae, 0x1d4b9,
- 0x1d4bd, 0x1d4c3,
- 0x1d4c5, 0x1d505,
- 0x1d507, 0x1d50a,
- 0x1d50d, 0x1d514,
- 0x1d516, 0x1d51c,
- 0x1d51e, 0x1d539,
- 0x1d53b, 0x1d53e,
- 0x1d540, 0x1d544,
- 0x1d54a, 0x1d550,
- 0x1d552, 0x1d6a5,
- 0x1d6a8, 0x1d6c0,
- 0x1d6c2, 0x1d6da,
- 0x1d6dc, 0x1d6fa,
- 0x1d6fc, 0x1d714,
- 0x1d716, 0x1d734,
- 0x1d736, 0x1d74e,
- 0x1d750, 0x1d76e,
- 0x1d770, 0x1d788,
- 0x1d78a, 0x1d7a8,
- 0x1d7aa, 0x1d7c2,
- 0x1d7c4, 0x1d7cb,
- 0x1ee00, 0x1ee03,
- 0x1ee05, 0x1ee1f,
- 0x1ee21, 0x1ee22,
- 0x1ee29, 0x1ee32,
- 0x1ee34, 0x1ee37,
- 0x1ee4d, 0x1ee4f,
- 0x1ee51, 0x1ee52,
- 0x1ee61, 0x1ee62,
- 0x1ee67, 0x1ee6a,
- 0x1ee6c, 0x1ee72,
- 0x1ee74, 0x1ee77,
- 0x1ee79, 0x1ee7c,
- 0x1ee80, 0x1ee89,
- 0x1ee8b, 0x1ee9b,
- 0x1eea1, 0x1eea3,
- 0x1eea5, 0x1eea9,
- 0x1eeab, 0x1eebb,
- 0x20000, 0x2a6d6,
- 0x2a700, 0x2b734,
- 0x2b740, 0x2b81d,
- 0x2f800, 0x2fa1d,
-};
-
-static Rune __isalphas[] = {
- 0x00aa,
- 0x00b5,
- 0x00ba,
- 0x02ec,
- 0x02ee,
- 0x0386,
- 0x038c,
- 0x0559,
- 0x06d5,
- 0x06ff,
- 0x0710,
- 0x07b1,
- 0x07fa,
- 0x081a,
- 0x0824,
- 0x0828,
- 0x08a0,
- 0x093d,
- 0x0950,
- 0x09b2,
- 0x09bd,
- 0x09ce,
- 0x0a5e,
- 0x0abd,
- 0x0ad0,
- 0x0b3d,
- 0x0b71,
- 0x0b83,
- 0x0b9c,
- 0x0bd0,
- 0x0c3d,
- 0x0cbd,
- 0x0cde,
- 0x0d3d,
- 0x0d4e,
- 0x0dbd,
- 0x0e84,
- 0x0e8a,
- 0x0e8d,
- 0x0ea5,
- 0x0ea7,
- 0x0ebd,
- 0x0ec6,
- 0x0f00,
- 0x103f,
- 0x1061,
- 0x108e,
- 0x10c7,
- 0x10cd,
- 0x1258,
- 0x12c0,
- 0x17d7,
- 0x17dc,
- 0x18aa,
- 0x1aa7,
- 0x1f59,
- 0x1f5b,
- 0x1f5d,
- 0x1fbe,
- 0x2071,
- 0x207f,
- 0x2102,
- 0x2107,
- 0x2115,
- 0x2124,
- 0x2126,
- 0x2128,
- 0x214e,
- 0x2d27,
- 0x2d2d,
- 0x2d6f,
- 0x2e2f,
- 0xa8fb,
- 0xa9cf,
- 0xaa7a,
- 0xaab1,
- 0xaac0,
- 0xaac2,
- 0xfb1d,
- 0xfb3e,
- 0x10808,
- 0x1083c,
- 0x10a00,
- 0x16f50,
- 0x1d4a2,
- 0x1d4bb,
- 0x1d546,
- 0x1ee24,
- 0x1ee27,
- 0x1ee39,
- 0x1ee3b,
- 0x1ee42,
- 0x1ee47,
- 0x1ee49,
- 0x1ee4b,
- 0x1ee54,
- 0x1ee57,
- 0x1ee59,
- 0x1ee5b,
- 0x1ee5d,
- 0x1ee5f,
- 0x1ee64,
- 0x1ee7e,
-};
-
-int
-isalpharune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __isalphar, nelem(__isalphar)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- p = rbsearch(c, __isalphas, nelem(__isalphas), 1);
- if(p && c == p[0])
- return 1;
- return 0;
-}
-
-static Rune __isupperr[] = {
- 0x0041, 0x005a,
- 0x00c0, 0x00d6,
- 0x00d8, 0x00de,
- 0x0178, 0x0179,
- 0x0181, 0x0182,
- 0x0186, 0x0187,
- 0x0189, 0x018b,
- 0x018e, 0x0191,
- 0x0193, 0x0194,
- 0x0196, 0x0198,
- 0x019c, 0x019d,
- 0x019f, 0x01a0,
- 0x01a6, 0x01a7,
- 0x01ae, 0x01af,
- 0x01b1, 0x01b3,
- 0x01b7, 0x01b8,
- 0x01f6, 0x01f8,
- 0x023a, 0x023b,
- 0x023d, 0x023e,
- 0x0243, 0x0246,
- 0x0388, 0x038a,
- 0x038e, 0x038f,
- 0x0391, 0x03a1,
- 0x03a3, 0x03ab,
- 0x03d2, 0x03d4,
- 0x03f9, 0x03fa,
- 0x03fd, 0x042f,
- 0x04c0, 0x04c1,
- 0x0531, 0x0556,
- 0x10a0, 0x10c5,
- 0x1f08, 0x1f0f,
- 0x1f18, 0x1f1d,
- 0x1f28, 0x1f2f,
- 0x1f38, 0x1f3f,
- 0x1f48, 0x1f4d,
- 0x1f68, 0x1f6f,
- 0x1f88, 0x1f8f,
- 0x1f98, 0x1f9f,
- 0x1fa8, 0x1faf,
- 0x1fb8, 0x1fbc,
- 0x1fc8, 0x1fcc,
- 0x1fd8, 0x1fdb,
- 0x1fe8, 0x1fec,
- 0x1ff8, 0x1ffc,
- 0x210b, 0x210d,
- 0x2110, 0x2112,
- 0x2119, 0x211d,
- 0x212a, 0x212d,
- 0x2130, 0x2133,
- 0x213e, 0x213f,
- 0x2160, 0x216f,
- 0x24b6, 0x24cf,
- 0x2c00, 0x2c2e,
- 0x2c62, 0x2c64,
- 0x2c6d, 0x2c70,
- 0x2c7e, 0x2c80,
- 0xa77d, 0xa77e,
- 0xff21, 0xff3a,
- 0x10400, 0x10427,
- 0x1d400, 0x1d419,
- 0x1d434, 0x1d44d,
- 0x1d468, 0x1d481,
- 0x1d49e, 0x1d49f,
- 0x1d4a5, 0x1d4a6,
- 0x1d4a9, 0x1d4ac,
- 0x1d4ae, 0x1d4b5,
- 0x1d4d0, 0x1d4e9,
- 0x1d504, 0x1d505,
- 0x1d507, 0x1d50a,
- 0x1d50d, 0x1d514,
- 0x1d516, 0x1d51c,
- 0x1d538, 0x1d539,
- 0x1d53b, 0x1d53e,
- 0x1d540, 0x1d544,
- 0x1d54a, 0x1d550,
- 0x1d56c, 0x1d585,
- 0x1d5a0, 0x1d5b9,
- 0x1d5d4, 0x1d5ed,
- 0x1d608, 0x1d621,
- 0x1d63c, 0x1d655,
- 0x1d670, 0x1d689,
- 0x1d6a8, 0x1d6c0,
- 0x1d6e2, 0x1d6fa,
- 0x1d71c, 0x1d734,
- 0x1d756, 0x1d76e,
- 0x1d790, 0x1d7a8,
-};
-
-static Rune __isupperp[] = {
- 0x0100, 0x0136,
- 0x0139, 0x0147,
- 0x014a, 0x0176,
- 0x017b, 0x017d,
- 0x01a2, 0x01a4,
- 0x01cd, 0x01db,
- 0x01de, 0x01ee,
- 0x01fa, 0x0232,
- 0x0248, 0x024e,
- 0x0370, 0x0372,
- 0x03d8, 0x03ee,
- 0x0460, 0x0480,
- 0x048a, 0x04be,
- 0x04c3, 0x04cd,
- 0x04d0, 0x0526,
- 0x1e00, 0x1e94,
- 0x1e9e, 0x1efe,
- 0x1f59, 0x1f5f,
- 0x2124, 0x2128,
- 0x2c67, 0x2c6b,
- 0x2c82, 0x2ce2,
- 0x2ceb, 0x2ced,
- 0xa640, 0xa66c,
- 0xa680, 0xa696,
- 0xa722, 0xa72e,
- 0xa732, 0xa76e,
- 0xa779, 0xa77b,
- 0xa780, 0xa786,
- 0xa78b, 0xa78d,
- 0xa790, 0xa792,
- 0xa7a0, 0xa7aa,
-};
-
-static Rune __isuppers[] = {
- 0x0184,
- 0x01a9,
- 0x01ac,
- 0x01b5,
- 0x01bc,
- 0x01c4,
- 0x01c7,
- 0x01ca,
- 0x01f1,
- 0x01f4,
- 0x0241,
- 0x0376,
- 0x0386,
- 0x038c,
- 0x03cf,
- 0x03f4,
- 0x03f7,
- 0x10c7,
- 0x10cd,
- 0x2102,
- 0x2107,
- 0x2115,
- 0x2145,
- 0x2183,
- 0x2c60,
- 0x2c72,
- 0x2c75,
- 0x2cf2,
- 0x1d49c,
- 0x1d4a2,
- 0x1d546,
- 0x1d7ca,
-};
-
-int
-isupperrune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __isupperr, nelem(__isupperr)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- p = rbsearch(c, __isupperp, nelem(__isupperp)/2, 2);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return 1;
- p = rbsearch(c, __isuppers, nelem(__isuppers), 1);
- if(p && c == p[0])
- return 1;
- return 0;
-}
-
-static Rune __islowerr[] = {
- 0x0061, 0x007a,
- 0x00df, 0x00f6,
- 0x00f8, 0x00ff,
- 0x0137, 0x0138,
- 0x0148, 0x0149,
- 0x017e, 0x0180,
- 0x018c, 0x018d,
- 0x0199, 0x019b,
- 0x01aa, 0x01ab,
- 0x01b9, 0x01ba,
- 0x01bd, 0x01bf,
- 0x01dc, 0x01dd,
- 0x01ef, 0x01f0,
- 0x0233, 0x0239,
- 0x023f, 0x0240,
- 0x024f, 0x0293,
- 0x0295, 0x02af,
- 0x037b, 0x037d,
- 0x03ac, 0x03ce,
- 0x03d0, 0x03d1,
- 0x03d5, 0x03d7,
- 0x03ef, 0x03f3,
- 0x03fb, 0x03fc,
- 0x0430, 0x045f,
- 0x04ce, 0x04cf,
- 0x0561, 0x0587,
- 0x1d00, 0x1d2b,
- 0x1d6b, 0x1d77,
- 0x1d79, 0x1d9a,
- 0x1e95, 0x1e9d,
- 0x1eff, 0x1f07,
- 0x1f10, 0x1f15,
- 0x1f20, 0x1f27,
- 0x1f30, 0x1f37,
- 0x1f40, 0x1f45,
- 0x1f50, 0x1f57,
- 0x1f60, 0x1f67,
- 0x1f70, 0x1f7d,
- 0x1f80, 0x1f87,
- 0x1f90, 0x1f97,
- 0x1fa0, 0x1fa7,
- 0x1fb0, 0x1fb4,
- 0x1fb6, 0x1fb7,
- 0x1fc2, 0x1fc4,
- 0x1fc6, 0x1fc7,
- 0x1fd0, 0x1fd3,
- 0x1fd6, 0x1fd7,
- 0x1fe0, 0x1fe7,
- 0x1ff2, 0x1ff4,
- 0x1ff6, 0x1ff7,
- 0x210e, 0x210f,
- 0x213c, 0x213d,
- 0x2146, 0x2149,
- 0x2170, 0x217f,
- 0x24d0, 0x24e9,
- 0x2c30, 0x2c5e,
- 0x2c65, 0x2c66,
- 0x2c73, 0x2c74,
- 0x2c76, 0x2c7b,
- 0x2ce3, 0x2ce4,
- 0x2d00, 0x2d25,
- 0xa72f, 0xa731,
- 0xa771, 0xa778,
- 0xfb00, 0xfb06,
- 0xfb13, 0xfb17,
- 0xff41, 0xff5a,
- 0x10428, 0x1044f,
- 0x1d41a, 0x1d433,
- 0x1d44e, 0x1d454,
- 0x1d456, 0x1d467,
- 0x1d482, 0x1d49b,
- 0x1d4b6, 0x1d4b9,
- 0x1d4bd, 0x1d4c3,
- 0x1d4c5, 0x1d4cf,
- 0x1d4ea, 0x1d503,
- 0x1d51e, 0x1d537,
- 0x1d552, 0x1d56b,
- 0x1d586, 0x1d59f,
- 0x1d5ba, 0x1d5d3,
- 0x1d5ee, 0x1d607,
- 0x1d622, 0x1d63b,
- 0x1d656, 0x1d66f,
- 0x1d68a, 0x1d6a5,
- 0x1d6c2, 0x1d6da,
- 0x1d6dc, 0x1d6e1,
- 0x1d6fc, 0x1d714,
- 0x1d716, 0x1d71b,
- 0x1d736, 0x1d74e,
- 0x1d750, 0x1d755,
- 0x1d770, 0x1d788,
- 0x1d78a, 0x1d78f,
- 0x1d7aa, 0x1d7c2,
- 0x1d7c4, 0x1d7c9,
-};
-
-static Rune __islowerp[] = {
- 0x0101, 0x0135,
- 0x013a, 0x0146,
- 0x014b, 0x0177,
- 0x017a, 0x017c,
- 0x0183, 0x0185,
- 0x01a1, 0x01a5,
- 0x01b4, 0x01b6,
- 0x01cc, 0x01da,
- 0x01df, 0x01ed,
- 0x01f3, 0x01f5,
- 0x01f9, 0x0231,
- 0x0247, 0x024d,
- 0x0371, 0x0373,
- 0x03d9, 0x03ed,
- 0x0461, 0x0481,
- 0x048b, 0x04bf,
- 0x04c2, 0x04cc,
- 0x04d1, 0x0527,
- 0x1e01, 0x1e93,
- 0x1e9f, 0x1efd,
- 0x2c68, 0x2c6c,
- 0x2c81, 0x2ce1,
- 0x2cec, 0x2cee,
- 0xa641, 0xa66d,
- 0xa681, 0xa697,
- 0xa723, 0xa72d,
- 0xa733, 0xa76f,
- 0xa77a, 0xa77c,
- 0xa77f, 0xa787,
- 0xa78c, 0xa78e,
- 0xa791, 0xa793,
- 0xa7a1, 0xa7a9,
-};
-
-static Rune __islowers[] = {
- 0x00b5,
- 0x0188,
- 0x0192,
- 0x0195,
- 0x019e,
- 0x01a8,
- 0x01ad,
- 0x01b0,
- 0x01c6,
- 0x01c9,
- 0x023c,
- 0x0242,
- 0x0377,
- 0x0390,
- 0x03f5,
- 0x03f8,
- 0x1fbe,
- 0x210a,
- 0x2113,
- 0x212f,
- 0x2134,
- 0x2139,
- 0x214e,
- 0x2184,
- 0x2c61,
- 0x2c71,
- 0x2cf3,
- 0x2d27,
- 0x2d2d,
- 0xa7fa,
- 0x1d4bb,
- 0x1d7cb,
-};
-
-int
-islowerrune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __islowerr, nelem(__islowerr)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- p = rbsearch(c, __islowerp, nelem(__islowerp)/2, 2);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return 1;
- p = rbsearch(c, __islowers, nelem(__islowers), 1);
- if(p && c == p[0])
- return 1;
- return 0;
-}
-
-static Rune __istitler[] = {
- 0x0041, 0x005a,
- 0x00c0, 0x00d6,
- 0x00d8, 0x00de,
- 0x0178, 0x0179,
- 0x0181, 0x0182,
- 0x0186, 0x0187,
- 0x0189, 0x018b,
- 0x018e, 0x0191,
- 0x0193, 0x0194,
- 0x0196, 0x0198,
- 0x019c, 0x019d,
- 0x019f, 0x01a0,
- 0x01a6, 0x01a7,
- 0x01ae, 0x01af,
- 0x01b1, 0x01b3,
- 0x01b7, 0x01b8,
- 0x01f6, 0x01f8,
- 0x023a, 0x023b,
- 0x023d, 0x023e,
- 0x0243, 0x0246,
- 0x0388, 0x038a,
- 0x038e, 0x038f,
- 0x0391, 0x03a1,
- 0x03a3, 0x03ab,
- 0x03f9, 0x03fa,
- 0x03fd, 0x042f,
- 0x04c0, 0x04c1,
- 0x0531, 0x0556,
- 0x10a0, 0x10c5,
- 0x1f08, 0x1f0f,
- 0x1f18, 0x1f1d,
- 0x1f28, 0x1f2f,
- 0x1f38, 0x1f3f,
- 0x1f48, 0x1f4d,
- 0x1f68, 0x1f6f,
- 0x1f88, 0x1f8f,
- 0x1f98, 0x1f9f,
- 0x1fa8, 0x1faf,
- 0x1fb8, 0x1fbc,
- 0x1fc8, 0x1fcc,
- 0x1fd8, 0x1fdb,
- 0x1fe8, 0x1fec,
- 0x1ff8, 0x1ffc,
- 0x2160, 0x216f,
- 0x24b6, 0x24cf,
- 0x2c00, 0x2c2e,
- 0x2c62, 0x2c64,
- 0x2c6d, 0x2c70,
- 0x2c7e, 0x2c80,
- 0xa77d, 0xa77e,
- 0xff21, 0xff3a,
- 0x10400, 0x10427,
-};
-
-static Rune __istitlep[] = {
- 0x0100, 0x012e,
- 0x0132, 0x0136,
- 0x0139, 0x0147,
- 0x014a, 0x0176,
- 0x017b, 0x017d,
- 0x01a2, 0x01a4,
- 0x01cb, 0x01db,
- 0x01de, 0x01ee,
- 0x01f2, 0x01f4,
- 0x01fa, 0x0232,
- 0x0248, 0x024e,
- 0x0370, 0x0372,
- 0x03d8, 0x03ee,
- 0x0460, 0x0480,
- 0x048a, 0x04be,
- 0x04c3, 0x04cd,
- 0x04d0, 0x0526,
- 0x1e00, 0x1e94,
- 0x1ea0, 0x1efe,
- 0x1f59, 0x1f5f,
- 0x2c67, 0x2c6b,
- 0x2c82, 0x2ce2,
- 0x2ceb, 0x2ced,
- 0xa640, 0xa66c,
- 0xa680, 0xa696,
- 0xa722, 0xa72e,
- 0xa732, 0xa76e,
- 0xa779, 0xa77b,
- 0xa780, 0xa786,
- 0xa78b, 0xa78d,
- 0xa790, 0xa792,
- 0xa7a0, 0xa7aa,
-};
-
-static Rune __istitles[] = {
- 0x0184,
- 0x01a9,
- 0x01ac,
- 0x01b5,
- 0x01bc,
- 0x01c5,
- 0x01c8,
- 0x0241,
- 0x0376,
- 0x0386,
- 0x038c,
- 0x03cf,
- 0x03f7,
- 0x10c7,
- 0x10cd,
- 0x2132,
- 0x2183,
- 0x2c60,
- 0x2c72,
- 0x2c75,
- 0x2cf2,
-};
-
-int
-istitlerune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __istitler, nelem(__istitler)/2, 2);
- if(p && c >= p[0] && c <= p[1])
- return 1;
- p = rbsearch(c, __istitlep, nelem(__istitlep)/2, 2);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return 1;
- p = rbsearch(c, __istitles, nelem(__istitles), 1);
- if(p && c == p[0])
- return 1;
- return 0;
-}
-
-static Rune __toupperr[] = {
- 0x0061, 0x007a, 1048544,
- 0x00e0, 0x00f6, 1048544,
- 0x00f8, 0x00fe, 1048544,
- 0x023f, 0x0240, 1059391,
- 0x0256, 0x0257, 1048371,
- 0x028a, 0x028b, 1048359,
- 0x037b, 0x037d, 1048706,
- 0x03ad, 0x03af, 1048539,
- 0x03b1, 0x03c1, 1048544,
- 0x03c3, 0x03cb, 1048544,
- 0x03cd, 0x03ce, 1048513,
- 0x0430, 0x044f, 1048544,
- 0x0450, 0x045f, 1048496,
- 0x0561, 0x0586, 1048528,
- 0x1f00, 0x1f07, 1048584,
- 0x1f10, 0x1f15, 1048584,
- 0x1f20, 0x1f27, 1048584,
- 0x1f30, 0x1f37, 1048584,
- 0x1f40, 0x1f45, 1048584,
- 0x1f60, 0x1f67, 1048584,
- 0x1f70, 0x1f71, 1048650,
- 0x1f72, 0x1f75, 1048662,
- 0x1f76, 0x1f77, 1048676,
- 0x1f78, 0x1f79, 1048704,
- 0x1f7a, 0x1f7b, 1048688,
- 0x1f7c, 0x1f7d, 1048702,
- 0x1f80, 0x1f87, 1048584,
- 0x1f90, 0x1f97, 1048584,
- 0x1fa0, 0x1fa7, 1048584,
- 0x1fb0, 0x1fb1, 1048584,
- 0x1fd0, 0x1fd1, 1048584,
- 0x1fe0, 0x1fe1, 1048584,
- 0x2170, 0x217f, 1048560,
- 0x24d0, 0x24e9, 1048550,
- 0x2c30, 0x2c5e, 1048528,
- 0x2d00, 0x2d25, 1041312,
- 0xff41, 0xff5a, 1048544,
- 0x10428, 0x1044f, 1048536,
-};
-
-static Rune __toupperp[] = {
- 0x0101, 0x012f, 1048575,
- 0x0133, 0x0137, 1048575,
- 0x013a, 0x0148, 1048575,
- 0x014b, 0x0177, 1048575,
- 0x017a, 0x017e, 1048575,
- 0x0183, 0x0185, 1048575,
- 0x01a1, 0x01a5, 1048575,
- 0x01b4, 0x01b6, 1048575,
- 0x01ce, 0x01dc, 1048575,
- 0x01df, 0x01ef, 1048575,
- 0x01f9, 0x021f, 1048575,
- 0x0223, 0x0233, 1048575,
- 0x0247, 0x024f, 1048575,
- 0x0371, 0x0373, 1048575,
- 0x03d9, 0x03ef, 1048575,
- 0x0461, 0x0481, 1048575,
- 0x048b, 0x04bf, 1048575,
- 0x04c2, 0x04ce, 1048575,
- 0x04d1, 0x0527, 1048575,
- 0x1e01, 0x1e95, 1048575,
- 0x1ea1, 0x1eff, 1048575,
- 0x1f51, 0x1f57, 1048584,
- 0x2c68, 0x2c6c, 1048575,
- 0x2c81, 0x2ce3, 1048575,
- 0x2cec, 0x2cee, 1048575,
- 0xa641, 0xa66d, 1048575,
- 0xa681, 0xa697, 1048575,
- 0xa723, 0xa72f, 1048575,
- 0xa733, 0xa76f, 1048575,
- 0xa77a, 0xa77c, 1048575,
- 0xa77f, 0xa787, 1048575,
- 0xa791, 0xa793, 1048575,
- 0xa7a1, 0xa7a9, 1048575,
-};
-
-static Rune __touppers[] = {
- 0x00b5, 1049319,
- 0x00ff, 1048697,
- 0x0131, 1048344,
- 0x017f, 1048276,
- 0x0180, 1048771,
- 0x0188, 1048575,
- 0x018c, 1048575,
- 0x0192, 1048575,
- 0x0195, 1048673,
- 0x0199, 1048575,
- 0x019a, 1048739,
- 0x019e, 1048706,
- 0x01a8, 1048575,
- 0x01ad, 1048575,
- 0x01b0, 1048575,
- 0x01b9, 1048575,
- 0x01bd, 1048575,
- 0x01bf, 1048632,
- 0x01c5, 1048575,
- 0x01c6, 1048574,
- 0x01c8, 1048575,
- 0x01c9, 1048574,
- 0x01cb, 1048575,
- 0x01cc, 1048574,
- 0x01dd, 1048497,
- 0x01f2, 1048575,
- 0x01f3, 1048574,
- 0x01f5, 1048575,
- 0x023c, 1048575,
- 0x0242, 1048575,
- 0x0250, 1059359,
- 0x0251, 1059356,
- 0x0252, 1059358,
- 0x0253, 1048366,
- 0x0254, 1048370,
- 0x0259, 1048374,
- 0x025b, 1048373,
- 0x0260, 1048371,
- 0x0263, 1048369,
- 0x0265, 1090856,
- 0x0266, 1090884,
- 0x0268, 1048367,
- 0x0269, 1048365,
- 0x026b, 1059319,
- 0x026f, 1048365,
- 0x0271, 1059325,
- 0x0272, 1048363,
- 0x0275, 1048362,
- 0x027d, 1059303,
- 0x0280, 1048358,
- 0x0283, 1048358,
- 0x0288, 1048358,
- 0x0289, 1048507,
- 0x028c, 1048505,
- 0x0292, 1048357,
- 0x0345, 1048660,
- 0x0377, 1048575,
- 0x03ac, 1048538,
- 0x03c2, 1048545,
- 0x03cc, 1048512,
- 0x03d0, 1048514,
- 0x03d1, 1048519,
- 0x03d5, 1048529,
- 0x03d6, 1048522,
- 0x03d7, 1048568,
- 0x03f0, 1048490,
- 0x03f1, 1048496,
- 0x03f2, 1048583,
- 0x03f5, 1048480,
- 0x03f8, 1048575,
- 0x03fb, 1048575,
- 0x04cf, 1048561,
- 0x1d79, 1083908,
- 0x1d7d, 1052390,
- 0x1e9b, 1048517,
- 0x1fb3, 1048585,
- 0x1fbe, 1041371,
- 0x1fc3, 1048585,
- 0x1fe5, 1048583,
- 0x1ff3, 1048585,
- 0x214e, 1048548,
- 0x2184, 1048575,
- 0x2c61, 1048575,
- 0x2c65, 1037781,
- 0x2c66, 1037784,
- 0x2c73, 1048575,
- 0x2c76, 1048575,
- 0x2cf3, 1048575,
- 0x2d27, 1041312,
- 0x2d2d, 1041312,
- 0xa78c, 1048575,
-};
-
-Rune
-toupperrune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __toupperr, nelem(__toupperr)/3, 3);
- if(p && c >= p[0] && c <= p[1])
- return c + p[2] - 1048576;
- p = rbsearch(c, __toupperp, nelem(__toupperp)/3, 3);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return c + p[2] - 1048576;
- p = rbsearch(c, __touppers, nelem(__touppers)/2, 2);
- if(p && c == p[0])
- return c + p[1] - 1048576;
- return c;
-}
-
-static Rune __tolowerr[] = {
- 0x0041, 0x005a, 1048608,
- 0x00c0, 0x00d6, 1048608,
- 0x00d8, 0x00de, 1048608,
- 0x0189, 0x018a, 1048781,
- 0x01b1, 0x01b2, 1048793,
- 0x0388, 0x038a, 1048613,
- 0x038e, 0x038f, 1048639,
- 0x0391, 0x03a1, 1048608,
- 0x03a3, 0x03ab, 1048608,
- 0x03fd, 0x03ff, 1048446,
- 0x0400, 0x040f, 1048656,
- 0x0410, 0x042f, 1048608,
- 0x0531, 0x0556, 1048624,
- 0x10a0, 0x10c5, 1055840,
- 0x1f08, 0x1f0f, 1048568,
- 0x1f18, 0x1f1d, 1048568,
- 0x1f28, 0x1f2f, 1048568,
- 0x1f38, 0x1f3f, 1048568,
- 0x1f48, 0x1f4d, 1048568,
- 0x1f68, 0x1f6f, 1048568,
- 0x1f88, 0x1f8f, 1048568,
- 0x1f98, 0x1f9f, 1048568,
- 0x1fa8, 0x1faf, 1048568,
- 0x1fb8, 0x1fb9, 1048568,
- 0x1fba, 0x1fbb, 1048502,
- 0x1fc8, 0x1fcb, 1048490,
- 0x1fd8, 0x1fd9, 1048568,
- 0x1fda, 0x1fdb, 1048476,
- 0x1fe8, 0x1fe9, 1048568,
- 0x1fea, 0x1feb, 1048464,
- 0x1ff8, 0x1ff9, 1048448,
- 0x1ffa, 0x1ffb, 1048450,
- 0x2160, 0x216f, 1048592,
- 0x24b6, 0x24cf, 1048602,
- 0x2c00, 0x2c2e, 1048624,
- 0x2c7e, 0x2c7f, 1037761,
- 0xff21, 0xff3a, 1048608,
- 0x10400, 0x10427, 1048616,
-};
-
-static Rune __tolowerp[] = {
- 0x0100, 0x012e, 1048577,
- 0x0132, 0x0136, 1048577,
- 0x0139, 0x0147, 1048577,
- 0x014a, 0x0176, 1048577,
- 0x017b, 0x017d, 1048577,
- 0x01a2, 0x01a4, 1048577,
- 0x01b3, 0x01b5, 1048577,
- 0x01cd, 0x01db, 1048577,
- 0x01de, 0x01ee, 1048577,
- 0x01f8, 0x021e, 1048577,
- 0x0222, 0x0232, 1048577,
- 0x0248, 0x024e, 1048577,
- 0x0370, 0x0372, 1048577,
- 0x03d8, 0x03ee, 1048577,
- 0x0460, 0x0480, 1048577,
- 0x048a, 0x04be, 1048577,
- 0x04c3, 0x04cd, 1048577,
- 0x04d0, 0x0526, 1048577,
- 0x1e00, 0x1e94, 1048577,
- 0x1ea0, 0x1efe, 1048577,
- 0x1f59, 0x1f5f, 1048568,
- 0x2c67, 0x2c6b, 1048577,
- 0x2c80, 0x2ce2, 1048577,
- 0x2ceb, 0x2ced, 1048577,
- 0xa640, 0xa66c, 1048577,
- 0xa680, 0xa696, 1048577,
- 0xa722, 0xa72e, 1048577,
- 0xa732, 0xa76e, 1048577,
- 0xa779, 0xa77b, 1048577,
- 0xa780, 0xa786, 1048577,
- 0xa790, 0xa792, 1048577,
- 0xa7a0, 0xa7a8, 1048577,
-};
-
-static Rune __tolowers[] = {
- 0x0130, 1048377,
- 0x0178, 1048455,
- 0x0179, 1048577,
- 0x0181, 1048786,
- 0x0182, 1048577,
- 0x0184, 1048577,
- 0x0186, 1048782,
- 0x0187, 1048577,
- 0x018b, 1048577,
- 0x018e, 1048655,
- 0x018f, 1048778,
- 0x0190, 1048779,
- 0x0191, 1048577,
- 0x0193, 1048781,
- 0x0194, 1048783,
- 0x0196, 1048787,
- 0x0197, 1048785,
- 0x0198, 1048577,
- 0x019c, 1048787,
- 0x019d, 1048789,
- 0x019f, 1048790,
- 0x01a0, 1048577,
- 0x01a6, 1048794,
- 0x01a7, 1048577,
- 0x01a9, 1048794,
- 0x01ac, 1048577,
- 0x01ae, 1048794,
- 0x01af, 1048577,
- 0x01b7, 1048795,
- 0x01b8, 1048577,
- 0x01bc, 1048577,
- 0x01c4, 1048578,
- 0x01c5, 1048577,
- 0x01c7, 1048578,
- 0x01c8, 1048577,
- 0x01ca, 1048578,
- 0x01cb, 1048577,
- 0x01f1, 1048578,
- 0x01f2, 1048577,
- 0x01f4, 1048577,
- 0x01f6, 1048479,
- 0x01f7, 1048520,
- 0x0220, 1048446,
- 0x023a, 1059371,
- 0x023b, 1048577,
- 0x023d, 1048413,
- 0x023e, 1059368,
- 0x0241, 1048577,
- 0x0243, 1048381,
- 0x0244, 1048645,
- 0x0245, 1048647,
- 0x0246, 1048577,
- 0x0376, 1048577,
- 0x0386, 1048614,
- 0x038c, 1048640,
- 0x03cf, 1048584,
- 0x03f4, 1048516,
- 0x03f7, 1048577,
- 0x03f9, 1048569,
- 0x03fa, 1048577,
- 0x04c0, 1048591,
- 0x04c1, 1048577,
- 0x10c7, 1055840,
- 0x10cd, 1055840,
- 0x1e9e, 1040961,
- 0x1fbc, 1048567,
- 0x1fcc, 1048567,
- 0x1fec, 1048569,
- 0x1ffc, 1048567,
- 0x2126, 1041059,
- 0x212a, 1040193,
- 0x212b, 1040314,
- 0x2132, 1048604,
- 0x2183, 1048577,
- 0x2c60, 1048577,
- 0x2c62, 1037833,
- 0x2c63, 1044762,
- 0x2c64, 1037849,
- 0x2c6d, 1037796,
- 0x2c6e, 1037827,
- 0x2c6f, 1037793,
- 0x2c70, 1037794,
- 0x2c72, 1048577,
- 0x2c75, 1048577,
- 0x2cf2, 1048577,
- 0xa77d, 1013244,
- 0xa77e, 1048577,
- 0xa78b, 1048577,
- 0xa78d, 1006296,
- 0xa7aa, 1006268,
-};
-
-Rune
-tolowerrune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __tolowerr, nelem(__tolowerr)/3, 3);
- if(p && c >= p[0] && c <= p[1])
- return c + p[2] - 1048576;
- p = rbsearch(c, __tolowerp, nelem(__tolowerp)/3, 3);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return c + p[2] - 1048576;
- p = rbsearch(c, __tolowers, nelem(__tolowers)/2, 2);
- if(p && c == p[0])
- return c + p[1] - 1048576;
- return c;
-}
-
-static Rune __totitler[] = {
- 0x0061, 0x007a, 1048544,
- 0x00e0, 0x00f6, 1048544,
- 0x00f8, 0x00fe, 1048544,
- 0x023f, 0x0240, 1059391,
- 0x0256, 0x0257, 1048371,
- 0x028a, 0x028b, 1048359,
- 0x037b, 0x037d, 1048706,
- 0x03ad, 0x03af, 1048539,
- 0x03b1, 0x03c1, 1048544,
- 0x03c3, 0x03cb, 1048544,
- 0x03cd, 0x03ce, 1048513,
- 0x0430, 0x044f, 1048544,
- 0x0450, 0x045f, 1048496,
- 0x0561, 0x0586, 1048528,
- 0x1f00, 0x1f07, 1048584,
- 0x1f10, 0x1f15, 1048584,
- 0x1f20, 0x1f27, 1048584,
- 0x1f30, 0x1f37, 1048584,
- 0x1f40, 0x1f45, 1048584,
- 0x1f60, 0x1f67, 1048584,
- 0x1f70, 0x1f71, 1048650,
- 0x1f72, 0x1f75, 1048662,
- 0x1f76, 0x1f77, 1048676,
- 0x1f78, 0x1f79, 1048704,
- 0x1f7a, 0x1f7b, 1048688,
- 0x1f7c, 0x1f7d, 1048702,
- 0x1f80, 0x1f87, 1048584,
- 0x1f90, 0x1f97, 1048584,
- 0x1fa0, 0x1fa7, 1048584,
- 0x1fb0, 0x1fb1, 1048584,
- 0x1fd0, 0x1fd1, 1048584,
- 0x1fe0, 0x1fe1, 1048584,
- 0x2170, 0x217f, 1048560,
- 0x24d0, 0x24e9, 1048550,
- 0x2c30, 0x2c5e, 1048528,
- 0x2d00, 0x2d25, 1041312,
- 0xff41, 0xff5a, 1048544,
- 0x10428, 0x1044f, 1048536,
-};
-
-static Rune __totitlep[] = {
- 0x0101, 0x012f, 1048575,
- 0x0133, 0x0137, 1048575,
- 0x013a, 0x0148, 1048575,
- 0x014b, 0x0177, 1048575,
- 0x017a, 0x017e, 1048575,
- 0x0183, 0x0185, 1048575,
- 0x01a1, 0x01a5, 1048575,
- 0x01b4, 0x01b6, 1048575,
- 0x01cc, 0x01dc, 1048575,
- 0x01df, 0x01ef, 1048575,
- 0x01f3, 0x01f5, 1048575,
- 0x01f9, 0x021f, 1048575,
- 0x0223, 0x0233, 1048575,
- 0x0247, 0x024f, 1048575,
- 0x0371, 0x0373, 1048575,
- 0x03d9, 0x03ef, 1048575,
- 0x0461, 0x0481, 1048575,
- 0x048b, 0x04bf, 1048575,
- 0x04c2, 0x04ce, 1048575,
- 0x04d1, 0x0527, 1048575,
- 0x1e01, 0x1e95, 1048575,
- 0x1ea1, 0x1eff, 1048575,
- 0x1f51, 0x1f57, 1048584,
- 0x2c68, 0x2c6c, 1048575,
- 0x2c81, 0x2ce3, 1048575,
- 0x2cec, 0x2cee, 1048575,
- 0xa641, 0xa66d, 1048575,
- 0xa681, 0xa697, 1048575,
- 0xa723, 0xa72f, 1048575,
- 0xa733, 0xa76f, 1048575,
- 0xa77a, 0xa77c, 1048575,
- 0xa77f, 0xa787, 1048575,
- 0xa791, 0xa793, 1048575,
- 0xa7a1, 0xa7a9, 1048575,
-};
-
-static Rune __totitles[] = {
- 0x00b5, 1049319,
- 0x00ff, 1048697,
- 0x0131, 1048344,
- 0x017f, 1048276,
- 0x0180, 1048771,
- 0x0188, 1048575,
- 0x018c, 1048575,
- 0x0192, 1048575,
- 0x0195, 1048673,
- 0x0199, 1048575,
- 0x019a, 1048739,
- 0x019e, 1048706,
- 0x01a8, 1048575,
- 0x01ad, 1048575,
- 0x01b0, 1048575,
- 0x01b9, 1048575,
- 0x01bd, 1048575,
- 0x01bf, 1048632,
- 0x01c4, 1048577,
- 0x01c6, 1048575,
- 0x01c7, 1048577,
- 0x01c9, 1048575,
- 0x01ca, 1048577,
- 0x01dd, 1048497,
- 0x01f1, 1048577,
- 0x023c, 1048575,
- 0x0242, 1048575,
- 0x0250, 1059359,
- 0x0251, 1059356,
- 0x0252, 1059358,
- 0x0253, 1048366,
- 0x0254, 1048370,
- 0x0259, 1048374,
- 0x025b, 1048373,
- 0x0260, 1048371,
- 0x0263, 1048369,
- 0x0265, 1090856,
- 0x0266, 1090884,
- 0x0268, 1048367,
- 0x0269, 1048365,
- 0x026b, 1059319,
- 0x026f, 1048365,
- 0x0271, 1059325,
- 0x0272, 1048363,
- 0x0275, 1048362,
- 0x027d, 1059303,
- 0x0280, 1048358,
- 0x0283, 1048358,
- 0x0288, 1048358,
- 0x0289, 1048507,
- 0x028c, 1048505,
- 0x0292, 1048357,
- 0x0345, 1048660,
- 0x0377, 1048575,
- 0x03ac, 1048538,
- 0x03c2, 1048545,
- 0x03cc, 1048512,
- 0x03d0, 1048514,
- 0x03d1, 1048519,
- 0x03d5, 1048529,
- 0x03d6, 1048522,
- 0x03d7, 1048568,
- 0x03f0, 1048490,
- 0x03f1, 1048496,
- 0x03f2, 1048583,
- 0x03f5, 1048480,
- 0x03f8, 1048575,
- 0x03fb, 1048575,
- 0x04cf, 1048561,
- 0x1d79, 1083908,
- 0x1d7d, 1052390,
- 0x1e9b, 1048517,
- 0x1fb3, 1048585,
- 0x1fbe, 1041371,
- 0x1fc3, 1048585,
- 0x1fe5, 1048583,
- 0x1ff3, 1048585,
- 0x214e, 1048548,
- 0x2184, 1048575,
- 0x2c61, 1048575,
- 0x2c65, 1037781,
- 0x2c66, 1037784,
- 0x2c73, 1048575,
- 0x2c76, 1048575,
- 0x2cf3, 1048575,
- 0x2d27, 1041312,
- 0x2d2d, 1041312,
- 0xa78c, 1048575,
-};
-
-Rune
-totitlerune(Rune c)
-{
- Rune *p;
-
- p = rbsearch(c, __totitler, nelem(__totitler)/3, 3);
- if(p && c >= p[0] && c <= p[1])
- return c + p[2] - 1048576;
- p = rbsearch(c, __totitlep, nelem(__totitlep)/3, 3);
- if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
- return c + p[2] - 1048576;
- p = rbsearch(c, __totitles, nelem(__totitles)/2, 2);
- if(p && c == p[0])
- return c + p[1] - 1048576;
- return c;
-}
-
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 1998-2002 by Lucent Technologies.
- * Portions Copyright (c) 2009 The Go Authors. All rights reserved.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#ifndef _UTFH_
-#define _UTFH_ 1
-
-typedef unsigned int Rune; /* Code-point values in Unicode 4.0 are 21 bits wide.*/
-
-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, /* maximum rune value */
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * rune routines
- */
-
-/*
- * These routines were written by Rob Pike and Ken Thompson
- * and first appeared in Plan 9.
- * SEE ALSO
- * utf (7)
- * tcs (1)
-*/
-
-// runetochar copies (encodes) one rune, pointed to by r, to at most
-// UTFmax bytes starting at s and returns the number of bytes generated.
-
-int runetochar(char* s, const Rune* r);
-
-
-// chartorune copies (decodes) at most UTFmax bytes starting at s to
-// one rune, pointed to by r, and returns the number of bytes consumed.
-// If the input is not exactly in UTF format, chartorune will set *r
-// to Runeerror and return 1.
-//
-// Note: There is no special case for a "null-terminated" string. A
-// string whose first byte has the value 0 is the UTF8 encoding of the
-// Unicode value 0 (i.e., ASCII NULL). A byte value of 0 is illegal
-// anywhere else in a UTF sequence.
-
-int chartorune(Rune* r, const char* s);
-
-
-// charntorune is like chartorune, except that it will access at most
-// n bytes of s. If the UTF sequence is incomplete within n bytes,
-// charntorune will set *r to Runeerror and return 0. If it is complete
-// but not in UTF format, it will set *r to Runeerror and return 1.
-//
-// Added 2004-09-24 by Wei-Hwa Huang
-
-int charntorune(Rune* r, const char* s, int n);
-
-// isvalidcharntorune(str, n, r, consumed)
-// is a convenience function that calls "*consumed = charntorune(r, str, n)"
-// and returns an int (logically boolean) indicating whether the first
-// n bytes of str was a valid and complete UTF sequence.
-
-int isvalidcharntorune(const char* str, int n, Rune* r, int* consumed);
-
-// runelen returns the number of bytes required to convert r into UTF.
-
-int runelen(Rune r);
-
-
-// runenlen returns the number of bytes required to convert the n
-// runes pointed to by r into UTF.
-
-int runenlen(const Rune* r, int n);
-
-
-// fullrune returns 1 if the string s of length n is long enough to be
-// decoded by chartorune, and 0 otherwise. This does not guarantee
-// that the string contains a legal UTF encoding. This routine is used
-// by programs that obtain input one byte at a time and need to know
-// when a full rune has arrived.
-
-int fullrune(const char* s, int n);
-
-// The following routines are analogous to the corresponding string
-// routines with "utf" substituted for "str", and "rune" substituted
-// for "chr".
-
-// utflen returns the number of runes that are represented by the UTF
-// string s. (cf. strlen)
-
-int utflen(const char* s);
-
-
-// utfnlen returns the number of complete runes that are represented
-// by the first n bytes of the UTF string s. If the last few bytes of
-// the string contain an incompletely coded rune, utfnlen will not
-// count them; in this way, it differs from utflen, which includes
-// every byte of the string. (cf. strnlen)
-
-int utfnlen(const char* s, long n);
-
-
-// utfrune returns a pointer to the first occurrence of rune r in the
-// UTF string s, or 0 if r does not occur in the string. The NULL
-// byte terminating a string is considered to be part of the string s.
-// (cf. strchr)
-
-/*const*/ char* utfrune(const char* s, Rune r);
-
-
-// utfrrune returns a pointer to the last occurrence of rune r in the
-// UTF string s, or 0 if r does not occur in the string. The NULL
-// byte terminating a string is considered to be part of the string s.
-// (cf. strrchr)
-
-/*const*/ char* utfrrune(const char* s, Rune r);
-
-
-// utfutf returns a pointer to the first occurrence of the UTF string
-// s2 as a UTF substring of s1, or 0 if there is none. If s2 is the
-// null string, utfutf returns s1. (cf. strstr)
-
-const char* utfutf(const char* s1, const char* s2);
-
-
-// utfecpy copies UTF sequences until a null sequence has been copied,
-// but writes no sequences beyond es1. If any sequences are copied,
-// s1 is terminated by a null sequence, and a pointer to that sequence
-// is returned. Otherwise, the original s1 is returned. (cf. strecpy)
-
-char* utfecpy(char *s1, char *es1, const char *s2);
-
-
-
-// These functions are rune-string analogues of the corresponding
-// functions in strcat (3).
-//
-// These routines first appeared in Plan 9.
-// SEE ALSO
-// memmove (3)
-// rune (3)
-// strcat (2)
-//
-// BUGS: The outcome of overlapping moves varies among implementations.
-
-Rune* runestrcat(Rune* s1, const Rune* s2);
-Rune* runestrncat(Rune* s1, const Rune* s2, long n);
-
-const Rune* runestrchr(const Rune* s, Rune c);
-
-int runestrcmp(const Rune* s1, const Rune* s2);
-int runestrncmp(const Rune* s1, const Rune* s2, long n);
-
-Rune* runestrcpy(Rune* s1, const Rune* s2);
-Rune* runestrncpy(Rune* s1, const Rune* s2, long n);
-Rune* runestrecpy(Rune* s1, Rune* es1, const Rune* s2);
-
-Rune* runestrdup(const Rune* s);
-
-const Rune* runestrrchr(const Rune* s, Rune c);
-long runestrlen(const Rune* s);
-const Rune* runestrstr(const Rune* s1, const Rune* s2);
-
-
-
-// The following routines test types and modify cases for Unicode
-// characters. Unicode defines some characters as letters and
-// specifies three cases: upper, lower, and title. Mappings among the
-// cases are also defined, although they are not exhaustive: some
-// upper case letters have no lower case mapping, and so on. Unicode
-// also defines several character properties, a subset of which are
-// checked by these routines. These routines are based on Unicode
-// version 3.0.0.
-//
-// NOTE: The routines are implemented in C, so the boolean functions
-// (e.g., isupperrune) return 0 for false and 1 for true.
-//
-//
-// toupperrune, tolowerrune, and totitlerune are the Unicode case
-// mappings. These routines return the character unchanged if it has
-// no defined mapping.
-
-Rune toupperrune(Rune r);
-Rune tolowerrune(Rune r);
-Rune totitlerune(Rune r);
-
-
-// isupperrune tests for upper case characters, including Unicode
-// upper case letters and targets of the toupper mapping. islowerrune
-// and istitlerune are defined analogously.
-
-int isupperrune(Rune r);
-int islowerrune(Rune r);
-int istitlerune(Rune r);
-
-
-// isalpharune tests for Unicode letters; this includes ideographs in
-// addition to alphabetic characters.
-
-int isalpharune(Rune r);
-
-
-// isdigitrune tests for digits. Non-digit numbers, such as Roman
-// numerals, are not included.
-
-int isdigitrune(Rune r);
-
-
-// isspacerune tests for whitespace characters, including "C" locale
-// whitespace, Unicode defined whitespace, and the "zero-width
-// non-break space" character.
-
-int isspacerune(Rune r);
-
-
-// (The comments in this file were copied from the manpage files rune.3,
-// isalpharune.3, and runestrcat.3. Some formatting changes were also made
-// to conform to Google style. /JRM 11/11/05)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 1998-2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#define uchar _utfuchar
-#define ushort _utfushort
-#define uint _utfuint
-#define ulong _utfulong
-#define vlong _utfvlong
-#define uvlong _utfuvlong
-
-typedef unsigned char uchar;
-typedef unsigned short ushort;
-typedef unsigned int uint;
-typedef unsigned long ulong;
-
-#define nelem(x) (sizeof(x)/sizeof((x)[0]))
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-char*
-utfecpy(char *to, char *e, const char *from)
-{
- char *end;
-
- if(to >= e)
- return to;
- end = memccpy(to, from, '\0', (size_t)(e - to));
- if(end == nil){
- end = e-1;
- while(end>to && (*--end&0xC0)==0x80)
- ;
- *end = '\0';
- }else{
- end--;
- }
- return end;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-int
-utflen(const char *s)
-{
- int c;
- int n;
- Rune rune;
-
- n = 0;
- for(;;) {
- c = *(uchar*)s;
- if(c < Runeself) {
- if(c == 0)
- return n;
- s++;
- } else
- s += chartorune(&rune, s);
- n++;
- }
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-int
-utfnlen(const char *s, long m)
-{
- int c;
- int n;
- Rune rune;
- const char *es;
-
- es = s + m;
- for(n = 0; s < es; n++) {
- c = *(uchar*)s;
- if(c < Runeself){
- if(c == '\0')
- break;
- s++;
- continue;
- }
- if(!fullrune(s, (int)(es-s)))
- break;
- s += chartorune(&rune, s);
- }
- return n;
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-/* const - removed for go code */
-char*
-utfrrune(const char *s, Rune c)
-{
- long c1;
- Rune r;
- const char *s1;
-
- if(c < Runesync) /* not part of utf sequence */
- return strrchr(s, (char)c);
-
- s1 = 0;
- for(;;) {
- c1 = *(uchar*)s;
- if(c1 < Runeself) { /* one byte rune */
- if(c1 == 0)
- return (char*)s1;
- if(c1 == c)
- s1 = s;
- s++;
- continue;
- }
- c1 = chartorune(&r, s);
- if(r == c)
- s1 = s;
- s += c1;
- }
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-/* const - removed for go code */
-char*
-utfrune(const char *s, Rune c)
-{
- long c1;
- Rune r;
- int n;
-
- if(c < Runesync) /* not part of utf sequence */
- return strchr(s, (char)c);
-
- for(;;) {
- c1 = *(uchar*)s;
- if(c1 < Runeself) { /* one byte rune */
- if(c1 == 0)
- return 0;
- if(c1 == c)
- return (char*)s;
- s++;
- continue;
- }
- n = chartorune(&r, s);
- if(r == c)
- return (char*)s;
- s += n;
- }
-}
+++ /dev/null
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- * Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-
-/*
- * Return pointer to first occurrence of s2 in s1,
- * 0 if none
- */
-const
-char*
-utfutf(const char *s1, const char *s2)
-{
- const char *p;
- long f, n1;
- size_t n2;
- Rune r;
-
- n1 = chartorune(&r, s2);
- f = r;
- if(f <= Runesync) /* represents self */
- return strstr(s1, s2);
-
- n2 = strlen(s2);
- for(p=s1; (p=utfrune(p, r)) != 0; p+=n1)
- if(strncmp(p, s2, n2) == 0)
- return p;
- return 0;
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-typedef unsigned short WinRune;
-
-WinRune* torune(char*);
-char *toutf(WinRune*);
+++ /dev/null
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-int
-fork(void)
-{
- return -1;
-}
-
-int
-p9rfork(int flags)
-{
- USED(flags);
- return -1;
-}
-
-Waitmsg*
-p9wait(void)
-{
- return 0;
-}
-
-int
-p9waitpid(void)
-{
- return -1;
-}
+++ /dev/null
-# Copyright 2012 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bbuffered.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bbuffered(Biobuf *bp)
-{
- switch(bp->state) {
- case Bracteof:
- case Bractive:
- return -bp->icount;
-
- case Bwactive:
- return bp->bsize + bp->ocount;
-
- case Binactive:
- return 0;
- }
- fprint(2, "Bbuffered: unknown state %d\n", bp->state);
- return 0;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bfildes.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bfildes(Biobuf *bp)
-{
-
- return bp->fid;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bflush.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bflush(Biobuf *bp)
-{
- int n, c;
-
- switch(bp->state) {
- case Bwactive:
- n = bp->bsize+bp->ocount;
- if(n == 0)
- return 0;
- c = (int)write(bp->fid, bp->bbuf, (size_t)n);
- if(n == c) {
- bp->offset += n;
- bp->ocount = -bp->bsize;
- return 0;
- }
- bp->state = Binactive;
- bp->ocount = 0;
- break;
-
- case Bracteof:
- bp->state = Bractive;
-
- case Bractive:
- bp->icount = 0;
- bp->gbuf = bp->ebuf;
- return 0;
- }
- return Beof;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetc.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bgetc(Biobuf *bp)
-{
- int i;
-
-loop:
- i = bp->icount;
- if(i != 0) {
- bp->icount = i+1;
- return bp->ebuf[i];
- }
- if(bp->state != Bractive) {
- if(bp->state == Bracteof)
- bp->state = Bractive;
- return Beof;
- }
- /*
- * get next buffer, try to keep Bungetsize
- * characters pre-catenated from the previous
- * buffer to allow that many ungets.
- */
- memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
- i = (int)read(bp->fid, bp->bbuf, (size_t)bp->bsize);
- bp->gbuf = bp->bbuf;
- if(i <= 0) {
- bp->state = Bracteof;
- if(i < 0)
- bp->state = Binactive;
- return Beof;
- }
- if(i < bp->bsize) {
- memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, (size_t)(i+Bungetsize));
- bp->gbuf = bp->ebuf-i;
- }
- bp->icount = -i;
- bp->offset += i;
- goto loop;
-}
-
-int
-Bgetle2(Biobuf *bp)
-{
- int l, h;
-
- l = Bgetc(bp);
- h = Bgetc(bp);
- return l|(h<<8);
-}
-
-int
-Bgetle4(Biobuf *bp)
-{
- int l, h;
-
- l = Bgetle2(bp);
- h = Bgetle2(bp);
- return (int)((uint32)l|((uint32)h<<16));
-}
-
-int
-Bungetc(Biobuf *bp)
-{
-
- if(bp->state == Bracteof)
- bp->state = Bractive;
- if(bp->state != Bractive)
- return Beof;
- bp->icount--;
- return 1;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetd.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-struct bgetd
-{
- Biobuf* b;
- int eof;
-};
-
-static int
-Bgetdf(void *vp)
-{
- int c;
- struct bgetd *bg = vp;
-
- c = BGETC(bg->b);
- if(c == Beof)
- bg->eof = 1;
- return c;
-}
-
-int
-Bgetd(Biobuf *bp, double *dp)
-{
- double d;
- struct bgetd b;
-
- b.b = bp;
- b.eof = 0;
- d = fmtcharstod(Bgetdf, &b);
- if(b.eof)
- return -1;
- Bungetc(bp);
- *dp = d;
- return 1;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetrune.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-long
-Bgetrune(Biobuf *bp)
-{
- int c, i;
- Rune rune;
- char str[UTFmax];
-
- c = BGETC(bp);
- if(c < Runeself) { /* one char */
- bp->runesize = 1;
- return c;
- }
- str[0] = (char)c;
-
- for(i=1;;) {
- c = BGETC(bp);
- if(c < 0)
- return c;
- str[i++] = (char)c;
-
- if(fullrune(str, i)) {
- bp->runesize = chartorune(&rune, str);
- while(i > bp->runesize) {
- Bungetc(bp);
- i--;
- }
- return rune;
- }
- }
-}
-
-int
-Bungetrune(Biobuf *bp)
-{
-
- if(bp->state == Bracteof)
- bp->state = Bractive;
- if(bp->state != Bractive)
- return Beof;
- bp->icount -= bp->runesize;
- bp->runesize = 0;
- return 1;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/binit.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-enum
-{
- MAXBUFS = 20
-};
-
-static Biobuf* wbufs[MAXBUFS];
-static int atexitflag;
-
-static
-void
-batexit(void)
-{
- Biobuf *bp;
- int i;
-
- for(i=0; i<MAXBUFS; i++) {
- bp = wbufs[i];
- if(bp != 0) {
- wbufs[i] = 0;
- Bflush(bp);
- }
- }
-}
-
-static
-void
-deinstall(Biobuf *bp)
-{
- int i;
-
- for(i=0; i<MAXBUFS; i++)
- if(wbufs[i] == bp)
- wbufs[i] = 0;
-}
-
-static
-void
-install(Biobuf *bp)
-{
- int i;
-
- deinstall(bp);
- for(i=0; i<MAXBUFS; i++)
- if(wbufs[i] == 0) {
- wbufs[i] = bp;
- break;
- }
- if(atexitflag == 0) {
- atexitflag = 1;
- atexit(batexit);
- }
-}
-
-int
-Binits(Biobuf *bp, int f, int mode, unsigned char *p, int size)
-{
-
- p += Bungetsize; /* make room for Bungets */
- size -= Bungetsize;
-
- switch(mode&~(ORCLOSE|OTRUNC)) {
- default:
- fprint(2, "Bopen: unknown mode %d\n", mode);
- return Beof;
-
- case OREAD:
- bp->state = Bractive;
- bp->ocount = 0;
- break;
-
- case OWRITE:
- install(bp);
- bp->state = Bwactive;
- bp->ocount = -size;
- break;
- }
- bp->bbuf = p;
- bp->ebuf = p+size;
- bp->bsize = size;
- bp->icount = 0;
- bp->gbuf = bp->ebuf;
- bp->fid = f;
- bp->flag = 0;
- bp->rdline = 0;
- bp->offset = 0;
- bp->runesize = 0;
- return 0;
-}
-
-
-int
-Binit(Biobuf *bp, int f, int mode)
-{
- return Binits(bp, f, mode, bp->b, sizeof(bp->b));
-}
-
-Biobuf*
-Bfdopen(int f, int mode)
-{
- Biobuf *bp;
-
- bp = malloc(sizeof(Biobuf));
- if(bp == 0)
- return 0;
- Binits(bp, f, mode, bp->b, sizeof(bp->b));
- bp->flag = Bmagic;
- return bp;
-}
-
-Biobuf*
-Bopen(char *name, int mode)
-{
- Biobuf *bp;
- int f;
-
- switch(mode&~(ORCLOSE|OTRUNC)) {
- default:
- fprint(2, "Bopen: unknown mode %d\n", mode);
- return 0;
-
- case OREAD:
- f = open(name, OREAD);
- if(f < 0)
- return 0;
- break;
-
- case OWRITE:
- f = create(name, OWRITE|OTRUNC, 0666);
- if(f < 0)
- return 0;
- }
- bp = Bfdopen(f, mode);
- if(bp == 0)
- close(f);
- return bp;
-}
-
-int
-Bterm(Biobuf *bp)
-{
-
- deinstall(bp);
- Bflush(bp);
- if(bp->flag == Bmagic) {
- bp->flag = 0;
- close(bp->fid);
- free(bp);
- }
- return 0;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/boffset.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-vlong
-Boffset(Biobuf *bp)
-{
- vlong n;
-
- switch(bp->state) {
- default:
- fprint(2, "Boffset: unknown state %d\n", bp->state);
- n = Beof;
- break;
-
- case Bracteof:
- case Bractive:
- n = bp->offset + bp->icount;
- break;
-
- case Bwactive:
- n = bp->offset + (bp->bsize + bp->ocount);
- break;
- }
- return n;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bprint.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
- Revisions Copyright © 2010 Google Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bprint(Biobuf *bp, char *fmt, ...)
-{
- int n;
- va_list arg;
-
- va_start(arg, fmt);
- n = Bvprint(bp, fmt, arg);
- va_end(arg);
- return n;
-}
-
-static int
-bflush(Fmt *f)
-{
- Biobuf *bp;
-
- if(f->stop == nil)
- return 0;
-
- bp = f->farg;
- bp->ocount = (int)((char*)f->to - (char*)f->stop);
- if(Bflush(bp) < 0) {
- f->stop = nil;
- f->to = nil;
- return 0;
- }
- f->to = (char*)f->stop + bp->ocount;
-
- return 1;
-}
-
-int
-Bvprint(Biobuf *bp, char *fmt, va_list arg)
-{
- int n;
- Fmt f;
-
- memset(&f, 0, sizeof f);
- fmtlocaleinit(&f, nil, nil, nil);
- f.stop = bp->ebuf;
- f.to = (char*)f.stop + bp->ocount;
- f.flush = bflush;
- f.farg = bp;
-
- n = fmtvprint(&f, fmt, arg);
-
- if(f.stop != nil)
- bp->ocount = (int)((char*)f.to - (char*)f.stop);
-
- return n;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bputc.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bputc(Biobuf *bp, int c)
-{
- int i;
-
- for(;;) {
- i = bp->ocount;
- if(i) {
- bp->ebuf[i++] = (unsigned char)c;
- bp->ocount = i;
- return 0;
- }
- if(Bflush(bp) == Beof)
- break;
- }
- return Beof;
-}
-
-int
-Bputle2(Biobuf *bp, int c)
-{
- Bputc(bp, c);
- return Bputc(bp, c>>8);
-}
-
-int
-Bputle4(Biobuf *bp, int c)
-{
- Bputle2(bp, c);
- return Bputle2(bp, c>>16);
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bputrune.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-int
-Bputrune(Biobuf *bp, long c)
-{
- Rune rune;
- char str[UTFmax];
- int n;
-
- rune = (Rune)c;
- if(rune < Runeself) {
- n = BPUTC(bp, (int)rune);
- USED(n);
- return 1;
- }
- n = runetochar(str, &rune);
- if(n == 0)
- return Bbad;
- if(Bwrite(bp, str, n) != n)
- return Beof;
- return n;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/brdline.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-void*
-Brdline(Biobuf *bp, int delim)
-{
- char *ip, *ep;
- int i, j;
-
- i = -bp->icount;
- if(i == 0) {
- /*
- * eof or other error
- */
- if(bp->state != Bractive) {
- if(bp->state == Bracteof)
- bp->state = Bractive;
- bp->rdline = 0;
- bp->gbuf = bp->ebuf;
- return 0;
- }
- }
-
- /*
- * first try in remainder of buffer (gbuf doesn't change)
- */
- ip = (char*)bp->ebuf - i;
- ep = memchr(ip, delim, (size_t)i);
- if(ep) {
- j = (int)((ep - ip) + 1);
- bp->rdline = j;
- bp->icount += j;
- return ip;
- }
-
- /*
- * copy data to beginning of buffer
- */
- if(i < bp->bsize)
- memmove(bp->bbuf, ip, (size_t)i);
- bp->gbuf = bp->bbuf;
-
- /*
- * append to buffer looking for the delim
- */
- ip = (char*)bp->bbuf + i;
- while(i < bp->bsize) {
- j = (int)read(bp->fid, ip, (size_t)(bp->bsize-i));
- if(j <= 0) {
- /*
- * end of file with no delim
- */
- memmove(bp->ebuf-i, bp->bbuf, (size_t)i);
- bp->rdline = i;
- bp->icount = -i;
- bp->gbuf = bp->ebuf-i;
- return 0;
- }
- bp->offset += j;
- i += j;
- ep = memchr(ip, delim, (size_t)j);
- if(ep) {
- /*
- * found in new piece
- * copy back up and reset everything
- */
- ip = (char*)bp->ebuf - i;
- if(i < bp->bsize){
- memmove(ip, bp->bbuf, (size_t)i);
- bp->gbuf = (unsigned char*)ip;
- }
- j = (int)((ep - (char*)bp->bbuf) + 1);
- bp->rdline = j;
- bp->icount = j - i;
- return ip;
- }
- ip += j;
- }
-
- /*
- * full buffer without finding
- */
- bp->rdline = bp->bsize;
- bp->icount = -bp->bsize;
- bp->gbuf = bp->bbuf;
- return 0;
-}
-
-int
-Blinelen(Biobuf *bp)
-{
-
- return bp->rdline;
-}
+++ /dev/null
-/*
- Copyright © 2009 The Go Authors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-char*
-Brdstr(Biobuf *bp, int delim, int nulldelim)
-{
- char *p, *q, *nq;
- int n, linelen;
-
- q = nil;
- n = 0;
- for(;;) {
- p = Brdline(bp, delim);
- linelen = Blinelen(bp);
- if(n == 0 && linelen == 0)
- return nil;
- nq = realloc(q, (size_t)(n+linelen+1));
- if(nq == nil) {
- free(q);
- return nil;
- }
- q = nq;
- if(p != nil) {
- memmove(q+n, p, (size_t)linelen);
- n += linelen;
- if(nulldelim)
- q[n-1] = '\0';
- break;
- }
- if(linelen == 0)
- break;
- Bread(bp, q+n, linelen);
- n += linelen;
- }
- q[n] = '\0';
- return q;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bread.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-long
-Bread(Biobuf *bp, void *ap, long count)
-{
- long c;
- unsigned char *p;
- int i, n, ic;
-
- p = ap;
- c = count;
- ic = bp->icount;
-
- while(c > 0) {
- n = -ic;
- if(n > c)
- n = (int)c;
- if(n == 0) {
- if(bp->state != Bractive)
- break;
- i = (int)read(bp->fid, bp->bbuf, (size_t)bp->bsize);
- if(i <= 0) {
- bp->state = Bracteof;
- if(i < 0)
- bp->state = Binactive;
- break;
- }
- bp->gbuf = bp->bbuf;
- bp->offset += i;
- if(i < bp->bsize) {
- memmove(bp->ebuf-i, bp->bbuf, (size_t)i);
- bp->gbuf = bp->ebuf-i;
- }
- ic = -i;
- continue;
- }
- memmove(p, bp->ebuf+ic, (size_t)n);
- c -= n;
- ic += n;
- p += n;
- }
- bp->icount = ic;
- return count-c;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bseek.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-vlong
-Bseek(Biobuf *bp, vlong offset, int base)
-{
- vlong n, d;
- int bufsz;
-
-#if !defined(_WIN32) && !defined(PLAN9)
- if(sizeof(offset) != sizeof(off_t)) {
- fprint(2, "Bseek: libbio compiled with %d-byte offset\n", sizeof(off_t));
- abort();
- }
-#endif
-
- switch(bp->state) {
- default:
- fprint(2, "Bseek: unknown state %d\n", bp->state);
- return Beof;
-
- case Bracteof:
- bp->state = Bractive;
- bp->icount = 0;
- bp->gbuf = bp->ebuf;
-
- case Bractive:
- n = offset;
- if(base == 1) {
- n += Boffset(bp);
- base = 0;
- }
-
- /*
- * try to seek within buffer
- */
- if(base == 0) {
- d = n - Boffset(bp);
- bufsz = (int)(bp->ebuf - bp->gbuf);
- if(-bufsz <= d && d <= bufsz){
- bp->icount += (int)d;
- if(d >= 0) {
- if(bp->icount <= 0)
- return n;
- } else {
- if(bp->ebuf - bp->gbuf >= -bp->icount)
- return n;
- }
- }
- }
-
- /*
- * reset the buffer
- */
- n = lseek(bp->fid, n, base);
- bp->icount = 0;
- bp->gbuf = bp->ebuf;
- break;
-
- case Bwactive:
- Bflush(bp);
- n = lseek(bp->fid, offset, base);
- break;
- }
- bp->offset = n;
- return n;
-}
+++ /dev/null
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bwrite.c
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-long
-Bwrite(Biobuf *bp, void *ap, long count)
-{
- long c;
- unsigned char *p;
- int i, n, oc;
-
- p = ap;
- c = count;
- oc = bp->ocount;
-
- while(c > 0) {
- n = -oc;
- if(n > c)
- n = (int)c;
- if(n == 0) {
- if(bp->state != Bwactive)
- return Beof;
- i = (int)write(bp->fid, bp->bbuf, (size_t)bp->bsize);
- if(i != bp->bsize) {
- bp->state = Binactive;
- return Beof;
- }
- bp->offset += i;
- oc = -bp->bsize;
- continue;
- }
- memmove(bp->ebuf+oc, p, (size_t)n);
- oc += n;
- c -= n;
- p += n;
- }
- bp->ocount = oc;
- return count-c;
-}
+++ /dev/null
-# Copyright 2013 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
+++ /dev/null
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-LinkArch linkarm = {
- .name = "arm",
- .thechar = '5',
- .endian = LittleEndian,
-
- .minlc = 4,
- .ptrsize = 4,
- .regsize = 4,
-};
-
-LinkArch linkamd64 = {
- .name = "amd64",
- .thechar = '6',
- .endian = LittleEndian,
-
- .minlc = 1,
- .ptrsize = 8,
- .regsize = 8,
-};
-
-LinkArch linkamd64p32 = {
- .name = "amd64p32",
- .thechar = '6',
- .endian = LittleEndian,
-
- .minlc = 1,
- .ptrsize = 4,
- .regsize = 8,
-};
-
-LinkArch link386 = {
- .name = "386",
- .thechar = '8',
- .endian = LittleEndian,
-
- .minlc = 1,
- .ptrsize = 4,
- .regsize = 4,
-};
-
-LinkArch linkppc64 = {
- .name = "ppc64",
- .thechar = '9',
- .endian = BigEndian,
-
- .minlc = 4,
- .ptrsize = 8,
- .regsize = 8,
-};
-
-LinkArch linkppc64le = {
- .name = "ppc64le",
- .thechar = '9',
- .endian = LittleEndian,
-
- .minlc = 4,
- .ptrsize = 8,
- .regsize = 8,
-};
+++ /dev/null
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-
-void
-symgrow(Link *ctxt, LSym *s, vlong lsiz)
-{
- int32 siz;
-
- USED(ctxt);
-
- siz = (int32)lsiz;
- if((vlong)siz != lsiz)
- sysfatal("symgrow size %lld too long", lsiz);
-
- if(s->np >= siz)
- return;
-
- if(s->np > s->maxp) {
- ctxt->cursym = s;
- sysfatal("corrupt symbol data: np=%lld > maxp=%lld", (vlong)s->np, (vlong)s->maxp);
- }
-
- if(s->maxp < siz) {
- if(s->maxp == 0)
- s->maxp = 8;
- while(s->maxp < siz)
- s->maxp <<= 1;
- s->p = erealloc(s->p, s->maxp);
- memset(s->p+s->np, 0, s->maxp-s->np);
- }
- s->np = siz;
-}
-
-
-Reloc*
-addrel(LSym *s)
-{
- if(s->nr >= s->maxr) {
- if(s->maxr == 0)
- s->maxr = 4;
- else
- s->maxr <<= 1;
- s->r = erealloc(s->r, s->maxr*sizeof s->r[0]);
- memset(s->r+s->nr, 0, (s->maxr-s->nr)*sizeof s->r[0]);
- }
- return &s->r[s->nr++];
-}
-
-vlong
-setuintxx(Link *ctxt, LSym *s, vlong off, uint64 v, vlong wid)
-{
- int32 i, fl;
- vlong o;
- uchar *cast;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- if(s->size < off+wid) {
- s->size = off+wid;
- symgrow(ctxt, s, s->size);
- }
- fl = v;
- cast = (uchar*)&fl;
- switch(wid) {
- case 1:
- s->p[off] = cast[inuxi1[0]];
- break;
- case 2:
- for(i=0; i<2; i++)
- s->p[off+i] = cast[inuxi2[i]];
- break;
- case 4:
- for(i=0; i<4; i++)
- s->p[off+i] = cast[inuxi4[i]];
- break;
- case 8:
- o = v;
- cast = (uchar*)&o;
- for(i=0; i<8; i++)
- s->p[off+i] = cast[inuxi8[i]];
- break;
- }
- return off+wid;
-}
-
-vlong
-adduintxx(Link *ctxt, LSym *s, uint64 v, int wid)
-{
- vlong off;
-
- off = s->size;
- setuintxx(ctxt, s, off, v, wid);
- return off;
-}
-
-vlong
-adduint8(Link *ctxt, LSym *s, uint8 v)
-{
- return adduintxx(ctxt, s, v, 1);
-}
-
-vlong
-adduint16(Link *ctxt, LSym *s, uint16 v)
-{
- return adduintxx(ctxt, s, v, 2);
-}
-
-vlong
-adduint32(Link *ctxt, LSym *s, uint32 v)
-{
- return adduintxx(ctxt, s, v, 4);
-}
-
-vlong
-adduint64(Link *ctxt, LSym *s, uint64 v)
-{
- return adduintxx(ctxt, s, v, 8);
-}
-
-vlong
-setuint8(Link *ctxt, LSym *s, vlong r, uint8 v)
-{
- return setuintxx(ctxt, s, r, v, 1);
-}
-
-
-vlong
-setuint32(Link *ctxt, LSym *s, vlong r, uint32 v)
-{
- return setuintxx(ctxt, s, r, v, 4);
-}
-
-
-vlong
-addaddrplus(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
- vlong i;
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- i = s->size;
- s->size += ctxt->arch->ptrsize;
- symgrow(ctxt, s, s->size);
- r = addrel(s);
- r->sym = t;
- r->off = i;
- r->siz = ctxt->arch->ptrsize;
- r->type = R_ADDR;
- r->add = add;
- return i + r->siz;
-}
-
-vlong
-addpcrelplus(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
- vlong i;
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- i = s->size;
- s->size += 4;
- symgrow(ctxt, s, s->size);
- r = addrel(s);
- r->sym = t;
- r->off = i;
- r->add = add;
- r->type = R_PCREL;
- r->siz = 4;
- return i + r->siz;
-}
-
-vlong
-addaddr(Link *ctxt, LSym *s, LSym *t)
-{
- return addaddrplus(ctxt, s, t, 0);
-}
-
-vlong
-setaddrplus(Link *ctxt, LSym *s, vlong off, LSym *t, vlong add)
-{
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- if(off+ctxt->arch->ptrsize > s->size) {
- s->size = off + ctxt->arch->ptrsize;
- symgrow(ctxt, s, s->size);
- }
- r = addrel(s);
- r->sym = t;
- r->off = off;
- r->siz = ctxt->arch->ptrsize;
- r->type = R_ADDR;
- r->add = add;
- return off + r->siz;
-}
-
-vlong
-setaddr(Link *ctxt, LSym *s, vlong off, LSym *t)
-{
- return setaddrplus(ctxt, s, off, t, 0);
-}
-
-vlong
-addsize(Link *ctxt, LSym *s, LSym *t)
-{
- vlong i;
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- i = s->size;
- s->size += ctxt->arch->ptrsize;
- symgrow(ctxt, s, s->size);
- r = addrel(s);
- r->sym = t;
- r->off = i;
- r->siz = ctxt->arch->ptrsize;
- r->type = R_SIZE;
- return i + r->siz;
-}
-
-vlong
-addaddrplus4(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
- vlong i;
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- i = s->size;
- s->size += 4;
- symgrow(ctxt, s, s->size);
- r = addrel(s);
- r->sym = t;
- r->off = i;
- r->siz = 4;
- r->type = R_ADDR;
- r->add = add;
- return i + r->siz;
-}
+++ /dev/null
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// go-specific code shared across loaders (5l, 6l, 8l).
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-// replace all "". with pkg.
-char*
-expandpkg(char *t0, char *pkg)
-{
- int n;
- char *p;
- char *w, *w0, *t;
-
- n = 0;
- for(p=t0; (p=strstr(p, "\"\".")) != nil; p+=3)
- n++;
-
- if(n == 0)
- return estrdup(t0);
-
- w0 = emallocz(strlen(t0) + strlen(pkg)*n);
- w = w0;
- for(p=t=t0; (p=strstr(p, "\"\".")) != nil; p=t) {
- memmove(w, t, p - t);
- w += p-t;
- strcpy(w, pkg);
- w += strlen(pkg);
- t = p+2;
- }
- strcpy(w, t);
- return w0;
-}
-
-void*
-emallocz(long n)
-{
- void *p;
-
- p = malloc(n);
- if(p == nil)
- sysfatal("out of memory");
- memset(p, 0, n);
- return p;
-}
-
-char*
-estrdup(char *p)
-{
- p = strdup(p);
- if(p == nil)
- sysfatal("out of memory");
- return p;
-}
-
-void*
-erealloc(void *p, long n)
-{
- p = realloc(p, n);
- if(p == nil)
- sysfatal("out of memory");
- return p;
-}
-
-
-
-
+++ /dev/null
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-void
-addlib(Link *ctxt, char *src, char *obj, char *pathname)
-{
- char name[1024], pname[1024], *p;
- int i;
-
- if(strlen(pathname) >= sizeof name)
- sysfatal("addlib pathname too long");
- strcpy(name, pathname);
- cleanname(name);
-
- // runtime.a -> runtime
- p = nil;
- if(strlen(name) > 2 && name[strlen(name)-2] == '.') {
- p = name+strlen(name)-2;
- *p = '\0';
- }
-
- // already loaded?
- for(i=0; i<ctxt->libraryp; i++)
- if(strcmp(ctxt->library[i].pkg, name) == 0)
- return;
-
- // runtime -> runtime.a for search
- if(p != nil)
- *p = '.';
-
- if((!ctxt->windows && name[0] == '/') || (ctxt->windows && name[1] == ':'))
- snprint(pname, sizeof pname, "%s", name);
- else {
- // try dot, -L "libdir", and then goroot.
- for(i=0; i<ctxt->nlibdir; i++) {
- snprint(pname, sizeof pname, "%s/%s", ctxt->libdir[i], name);
- if(access(pname, AEXIST) >= 0)
- break;
- }
- }
- cleanname(pname);
-
- /* runtime.a -> runtime */
- if(p != nil)
- *p = '\0';
-
- if(ctxt->debugvlog > 1 && ctxt->bso)
- Bprint(ctxt->bso, "%5.2f addlib: %s %s pulls in %s\n", cputime(), obj, src, pname);
-
- addlibpath(ctxt, src, obj, pname, name);
-}
-
-/*
- * add library to library list.
- * srcref: src file referring to package
- * objref: object file referring to package
- * file: object file, e.g., /home/rsc/go/pkg/container/vector.a
- * pkg: package import path, e.g. container/vector
- */
-void
-addlibpath(Link *ctxt, char *srcref, char *objref, char *file, char *pkg)
-{
- int i;
- Library *l;
-
- for(i=0; i<ctxt->libraryp; i++)
- if(strcmp(file, ctxt->library[i].file) == 0)
- return;
-
- if(ctxt->debugvlog > 1 && ctxt->bso)
- Bprint(ctxt->bso, "%5.2f addlibpath: srcref: %s objref: %s file: %s pkg: %s\n",
- cputime(), srcref, objref, file, pkg);
-
- if(ctxt->libraryp == ctxt->nlibrary){
- ctxt->nlibrary = 50 + 2*ctxt->libraryp;
- ctxt->library = erealloc(ctxt->library, sizeof ctxt->library[0] * ctxt->nlibrary);
- }
-
- l = &ctxt->library[ctxt->libraryp++];
- l->objref = estrdup(objref);
- l->srcref = estrdup(srcref);
- l->file = estrdup(file);
- l->pkg = estrdup(pkg);
-}
-
-int
-find1(int32 l, int c)
-{
- char *p;
- int i;
-
- p = (char*)&l;
- for(i=0; i<4; i++)
- if(*p++ == c)
- return i;
- return 0;
-}
-
-void
-nuxiinit(LinkArch *arch)
-{
- int i, c;
-
- if(arch->endian != BigEndian && arch->endian != LittleEndian)
- sysfatal("unknown endian (%#x) for arch %s", arch->endian, arch->name);
-
- for(i=0; i<4; i++) {
- c = find1(arch->endian, i+1);
- if(arch->endian == LittleEndian) {
- if(i < 2)
- inuxi2[i] = c;
- if(i < 1)
- inuxi1[i] = c;
- } else {
- if(i >= 2)
- inuxi2[i-2] = c;
- if(i >= 3)
- inuxi1[i-3] = c;
- }
- inuxi4[i] = c;
- if(c == i) {
- inuxi8[i] = c;
- inuxi8[i+4] = c+4;
- } else {
- inuxi8[i] = c+4;
- inuxi8[i+4] = c;
- }
- fnuxi4[i] = c;
- if(c == i) {
- fnuxi8[i] = c;
- fnuxi8[i+4] = c+4;
- } else {
- fnuxi8[i] = c+4;
- fnuxi8[i+4] = c;
- }
- }
-}
-
-uchar fnuxi8[8];
-uchar fnuxi4[4];
-uchar inuxi1[1];
-uchar inuxi2[2];
-uchar inuxi4[4];
-uchar inuxi8[8];
-
-
-
-
-vlong
-atolwhex(char *s)
-{
- vlong n;
- int f;
-
- n = 0;
- f = 0;
- while(*s == ' ' || *s == '\t')
- s++;
- if(*s == '-' || *s == '+') {
- if(*s++ == '-')
- f = 1;
- while(*s == ' ' || *s == '\t')
- s++;
- }
- if(s[0]=='0' && s[1]){
- if(s[1]=='x' || s[1]=='X'){
- s += 2;
- for(;;){
- if(*s >= '0' && *s <= '9')
- n = n*16 + *s++ - '0';
- else if(*s >= 'a' && *s <= 'f')
- n = n*16 + *s++ - 'a' + 10;
- else if(*s >= 'A' && *s <= 'F')
- n = n*16 + *s++ - 'A' + 10;
- else
- break;
- }
- } else
- while(*s >= '0' && *s <= '7')
- n = n*8 + *s++ - '0';
- } else
- while(*s >= '0' && *s <= '9')
- n = n*10 + *s++ - '0';
- if(f)
- n = -n;
- return n;
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Writing and reading of Go object files.
-//
-// Originally, Go object files were Plan 9 object files, but no longer.
-// Now they are more like standard object files, in that each symbol is defined
-// by an associated memory image (bytes) and a list of relocations to apply
-// during linking. We do not (yet?) use a standard file format, however.
-// For now, the format is chosen to be as simple as possible to read and write.
-// It may change for reasons of efficiency, or we may even switch to a
-// standard file format if there are compelling benefits to doing so.
-// See golang.org/s/go13linker for more background.
-//
-// The file format is:
-//
-// - magic header: "\x00\x00go13ld"
-// - byte 1 - version number
-// - sequence of strings giving dependencies (imported packages)
-// - empty string (marks end of sequence)
-// - sequence of defined symbols
-// - byte 0xff (marks end of sequence)
-// - magic footer: "\xff\xffgo13ld"
-//
-// All integers are stored in a zigzag varint format.
-// See golang.org/s/go12symtab for a definition.
-//
-// Data blocks and strings are both stored as an integer
-// followed by that many bytes.
-//
-// A symbol reference is a string name followed by a version.
-// An empty name corresponds to a nil LSym* pointer.
-//
-// Each symbol is laid out as the following fields (taken from LSym*):
-//
-// - byte 0xfe (sanity check for synchronization)
-// - type [int]
-// - name [string]
-// - version [int]
-// - flags [int]
-// 1 dupok
-// - size [int]
-// - gotype [symbol reference]
-// - p [data block]
-// - nr [int]
-// - r [nr relocations, sorted by off]
-//
-// If type == STEXT, there are a few more fields:
-//
-// - args [int]
-// - locals [int]
-// - nosplit [int]
-// - flags [int]
-// 1 leaf
-// 2 C function
-// - nlocal [int]
-// - local [nlocal automatics]
-// - pcln [pcln table]
-//
-// Each relocation has the encoding:
-//
-// - off [int]
-// - siz [int]
-// - type [int]
-// - add [int]
-// - xadd [int]
-// - sym [symbol reference]
-// - xsym [symbol reference]
-//
-// Each local has the encoding:
-//
-// - asym [symbol reference]
-// - offset [int]
-// - type [int]
-// - gotype [symbol reference]
-//
-// The pcln table has the encoding:
-//
-// - pcsp [data block]
-// - pcfile [data block]
-// - pcline [data block]
-// - npcdata [int]
-// - pcdata [npcdata data blocks]
-// - nfuncdata [int]
-// - funcdata [nfuncdata symbol references]
-// - funcdatasym [nfuncdata ints]
-// - nfile [int]
-// - file [nfile symbol references]
-//
-// The file layout and meaning of type integers are architecture-independent.
-//
-// TODO(rsc): The file format is good for a first pass but needs work.
-// - There are SymID in the object file that should really just be strings.
-// - The actual symbol memory images are interlaced with the symbol
-// metadata. They should be separated, to reduce the I/O required to
-// load just the metadata.
-// - The symbol references should be shortened, either with a symbol
-// table or by using a simple backward index to an earlier mentioned symbol.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-#include "../cmd/ld/textflag.h"
-#include "../runtime/funcdata.h"
-
-static void readsym(Link*, Biobuf*, char*, char*);
-static int64 rdint(Biobuf*);
-static char *rdstring(Biobuf*);
-static void rddata(Biobuf*, uchar**, int*);
-static LSym *rdsym(Link*, Biobuf*, char*);
-
-static char startmagic[] = "\x00\x00go13ld";
-static char endmagic[] = "\xff\xffgo13ld";
-
-void
-ldobjfile(Link *ctxt, Biobuf *f, char *pkg, int64 length, char *pn)
-{
- int c;
- uchar buf[8];
- int64 start;
- char *lib;
-
- start = Boffset(f);
- ctxt->version++;
- memset(buf, 0, sizeof buf);
- Bread(f, buf, sizeof buf);
- if(memcmp(buf, startmagic, sizeof buf) != 0)
- sysfatal("%s: invalid file start %x %x %x %x %x %x %x %x", pn, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
- if((c = Bgetc(f)) != 1)
- sysfatal("%s: invalid file version number %d", pn, c);
-
- for(;;) {
- lib = rdstring(f);
- if(lib[0] == 0)
- break;
- addlib(ctxt, pkg, pn, lib);
- }
-
- for(;;) {
- c = Bgetc(f);
- Bungetc(f);
- if(c == 0xff)
- break;
- readsym(ctxt, f, pkg, pn);
- }
-
- memset(buf, 0, sizeof buf);
- Bread(f, buf, sizeof buf);
- if(memcmp(buf, endmagic, sizeof buf) != 0)
- sysfatal("%s: invalid file end", pn);
-
- if(Boffset(f) != start+length)
- sysfatal("%s: unexpected end at %lld, want %lld", pn, (vlong)Boffset(f), (vlong)(start+length));
-}
-
-static void
-readsym(Link *ctxt, Biobuf *f, char *pkg, char *pn)
-{
- int i, j, c, t, v, n, ndata, nreloc, size, dupok;
- static int ndup;
- char *name;
- uchar *data;
- Reloc *r;
- LSym *s, *dup, *typ;
- Pcln *pc;
- Auto *a;
-
- if(Bgetc(f) != 0xfe)
- sysfatal("readsym out of sync");
- t = rdint(f);
- name = expandpkg(rdstring(f), pkg);
- v = rdint(f);
- if(v != 0 && v != 1)
- sysfatal("invalid symbol version %d", v);
- dupok = rdint(f);
- dupok &= 1;
- size = rdint(f);
- typ = rdsym(ctxt, f, pkg);
- rddata(f, &data, &ndata);
- nreloc = rdint(f);
-
- if(v != 0)
- v = ctxt->version;
- s = linklookup(ctxt, name, v);
- dup = nil;
- if(s->type != 0 && s->type != SXREF) {
- if((t == SDATA || t == SBSS || t == SNOPTRBSS) && ndata == 0 && nreloc == 0) {
- if(s->size < size)
- s->size = size;
- if(typ != nil && s->gotype == nil)
- s->gotype = typ;
- return;
- }
- if((s->type == SDATA || s->type == SBSS || s->type == SNOPTRBSS) && s->np == 0 && s->nr == 0)
- goto overwrite;
- if(s->type != SBSS && s->type != SNOPTRBSS && !dupok && !s->dupok)
- sysfatal("duplicate symbol %s (types %d and %d) in %s and %s", s->name, s->type, t, s->file, pn);
- if(s->np > 0) {
- dup = s;
- s = linknewsym(ctxt, ".dup", ndup++); // scratch
- }
- }
-overwrite:
- s->file = pkg;
- s->dupok = dupok;
- if(t == SXREF)
- sysfatal("bad sxref");
- if(t == 0)
- sysfatal("missing type for %s in %s", name, pn);
- if(t == SBSS && (s->type == SRODATA || s->type == SNOPTRBSS))
- t = s->type;
- s->type = t;
- if(s->size < size)
- s->size = size;
- if(typ != nil) // if bss sym defined multiple times, take type from any one def
- s->gotype = typ;
- if(dup != nil && typ != nil)
- dup->gotype = typ;
- s->p = data;
- s->np = ndata;
- s->maxp = s->np;
- if(nreloc > 0) {
- s->r = emallocz(nreloc * sizeof s->r[0]);
- s->nr = nreloc;
- s->maxr = nreloc;
- for(i=0; i<nreloc; i++) {
- r = &s->r[i];
- r->off = rdint(f);
- r->siz = rdint(f);
- r->type = rdint(f);
- r->add = rdint(f);
- r->xadd = rdint(f);
- r->sym = rdsym(ctxt, f, pkg);
- r->xsym = rdsym(ctxt, f, pkg);
- }
- }
-
- if(s->np > 0 && dup != nil && dup->np > 0 && strncmp(s->name, "gclocals·", 10) == 0) {
- // content-addressed garbage collection liveness bitmap symbol.
- // double check for hash collisions.
- if(s->np != dup->np || memcmp(s->p, dup->p, s->np) != 0)
- sysfatal("dupok hash collision for %s in %s and %s", s->name, s->file, pn);
- }
-
- if(s->type == STEXT) {
- s->args = rdint(f);
- s->locals = rdint(f);
- s->nosplit = rdint(f);
- v = rdint(f);
- s->leaf = v&1;
- s->cfunc = v&2;
- n = rdint(f);
- for(i=0; i<n; i++) {
- a = emallocz(sizeof *a);
- a->asym = rdsym(ctxt, f, pkg);
- a->aoffset = rdint(f);
- a->name = rdint(f);
- a->gotype = rdsym(ctxt, f, pkg);
- a->link = s->autom;
- s->autom = a;
- }
-
- s->pcln = emallocz(sizeof *s->pcln);
- pc = s->pcln;
- rddata(f, &pc->pcsp.p, &pc->pcsp.n);
- rddata(f, &pc->pcfile.p, &pc->pcfile.n);
- rddata(f, &pc->pcline.p, &pc->pcline.n);
- n = rdint(f);
- pc->pcdata = emallocz(n * sizeof pc->pcdata[0]);
- pc->npcdata = n;
- for(i=0; i<n; i++)
- rddata(f, &pc->pcdata[i].p, &pc->pcdata[i].n);
- n = rdint(f);
- pc->funcdata = emallocz(n * sizeof pc->funcdata[0]);
- pc->funcdataoff = emallocz(n * sizeof pc->funcdataoff[0]);
- pc->nfuncdata = n;
- for(i=0; i<n; i++)
- pc->funcdata[i] = rdsym(ctxt, f, pkg);
- for(i=0; i<n; i++)
- pc->funcdataoff[i] = rdint(f);
- n = rdint(f);
- pc->file = emallocz(n * sizeof pc->file[0]);
- pc->nfile = n;
- for(i=0; i<n; i++)
- pc->file[i] = rdsym(ctxt, f, pkg);
-
- if(dup == nil) {
- if(s->onlist)
- sysfatal("symbol %s listed multiple times", s->name);
- s->onlist = 1;
- if(ctxt->etextp)
- ctxt->etextp->next = s;
- else
- ctxt->textp = s;
- ctxt->etextp = s;
- }
- }
-
- if(ctxt->debugasm) {
- Bprint(ctxt->bso, "%s ", s->name);
- if(s->version)
- Bprint(ctxt->bso, "v=%d ", s->version);
- if(s->type)
- Bprint(ctxt->bso, "t=%d ", s->type);
- if(s->dupok)
- Bprint(ctxt->bso, "dupok ");
- if(s->cfunc)
- Bprint(ctxt->bso, "cfunc ");
- if(s->nosplit)
- Bprint(ctxt->bso, "nosplit ");
- Bprint(ctxt->bso, "size=%lld value=%lld", (vlong)s->size, (vlong)s->value);
- if(s->type == STEXT)
- Bprint(ctxt->bso, " args=%#llux locals=%#llux", (uvlong)s->args, (uvlong)s->locals);
- Bprint(ctxt->bso, "\n");
- for(i=0; i<s->np; ) {
- Bprint(ctxt->bso, "\t%#06ux", i);
- for(j=i; j<i+16 && j<s->np; j++)
- Bprint(ctxt->bso, " %02ux", s->p[j]);
- for(; j<i+16; j++)
- Bprint(ctxt->bso, " ");
- Bprint(ctxt->bso, " ");
- for(j=i; j<i+16 && j<s->np; j++) {
- c = s->p[j];
- if(' ' <= c && c <= 0x7e)
- Bprint(ctxt->bso, "%c", c);
- else
- Bprint(ctxt->bso, ".");
- }
- Bprint(ctxt->bso, "\n");
- i += 16;
- }
- for(i=0; i<s->nr; i++) {
- r = &s->r[i];
- Bprint(ctxt->bso, "\trel %d+%d t=%d %s+%lld\n", (int)r->off, r->siz, r->type, r->sym->name, (vlong)r->add);
- }
- }
-}
-
-static int64
-rdint(Biobuf *f)
-{
- int c;
- uint64 uv;
- int shift;
-
- uv = 0;
- for(shift = 0;; shift += 7) {
- if(shift >= 64)
- sysfatal("corrupt input");
- c = Bgetc(f);
- uv |= (uint64)(c & 0x7F) << shift;
- if(!(c & 0x80))
- break;
- }
-
- return (int64)(uv>>1) ^ ((int64)((uint64)uv<<63)>>63);
-}
-
-static char*
-rdstring(Biobuf *f)
-{
- int n;
- char *p;
-
- n = rdint(f);
- p = emallocz(n+1);
- Bread(f, p, n);
- return p;
-}
-
-static void
-rddata(Biobuf *f, uchar **pp, int *np)
-{
- *np = rdint(f);
- *pp = emallocz(*np);
- Bread(f, *pp, *np);
-}
-
-static LSym*
-rdsym(Link *ctxt, Biobuf *f, char *pkg)
-{
- int n, v;
- char *p;
- LSym *s;
-
- n = rdint(f);
- if(n == 0) {
- rdint(f);
- return nil;
- }
- p = emallocz(n+1);
- Bread(f, p, n);
- v = rdint(f);
- if(v != 0)
- v = ctxt->version;
- s = linklookup(ctxt, expandpkg(p, pkg), v);
-
- if(v == 0 && s->name[0] == '$' && s->type == 0) {
- if(strncmp(s->name, "$f32.", 5) == 0) {
- int32 i32;
- i32 = strtoul(s->name+5, nil, 16);
- s->type = SRODATA;
- adduint32(ctxt, s, i32);
- s->reachable = 0;
- } else if(strncmp(s->name, "$f64.", 5) == 0 || strncmp(s->name, "$i64.", 5) == 0) {
- int64 i64;
- i64 = strtoull(s->name+5, nil, 16);
- s->type = SRODATA;
- adduint64(ctxt, s, i64);
- s->reachable = 0;
- }
- }
-
- return s;
-}
+++ /dev/null
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-
-// funcpctab writes to dst a pc-value table mapping the code in func to the values
-// returned by valfunc parameterized by arg. The invocation of valfunc to update the
-// current value is, for each p,
-//
-// val = valfunc(func, val, p, 0, arg);
-// record val as value at p->pc;
-// val = valfunc(func, val, p, 1, arg);
-//
-// where func is the function, val is the current value, p is the instruction being
-// considered, and arg can be used to further parameterize valfunc.
-
-// pctofileline computes either the file number (arg == 0)
-// or the line number (arg == 1) to use at p.
-// Because p->lineno applies to p, phase == 0 (before p)
-// takes care of the update.
-
-// pctospadj computes the sp adjustment in effect.
-// It is oldval plus any adjustment made by p itself.
-// The adjustment by p takes effect only after p, so we
-// apply the change during phase == 1.
-
-// pctopcdata computes the pcdata value in effect at p.
-// A PCDATA instruction sets the value in effect at future
-// non-PCDATA instructions.
-// Since PCDATA instructions have no width in the final code,
-// it does not matter which phase we use for the update.
-
-
-// iteration over encoded pcdata tables.
-
-static uint32
-getvarint(uchar **pp)
-{
- uchar *p;
- int shift;
- uint32 v;
-
- v = 0;
- p = *pp;
- for(shift = 0;; shift += 7) {
- v |= (uint32)(*p & 0x7F) << shift;
- if(!(*p++ & 0x80))
- break;
- }
- *pp = p;
- return v;
-}
-
-void
-pciternext(Pciter *it)
-{
- uint32 v;
- int32 dv;
-
- it->pc = it->nextpc;
- if(it->done)
- return;
- if(it->p >= it->d.p + it->d.n) {
- it->done = 1;
- return;
- }
-
- // value delta
- v = getvarint(&it->p);
- if(v == 0 && !it->start) {
- it->done = 1;
- return;
- }
- it->start = 0;
- dv = (int32)(v>>1) ^ ((int32)(v<<31)>>31);
- it->value += dv;
-
- // pc delta
- v = getvarint(&it->p);
- it->nextpc = it->pc + v*it->pcscale;
-}
-
-void
-pciterinit(Link *ctxt, Pciter *it, Pcdata *d)
-{
- it->d = *d;
- it->p = it->d.p;
- it->pc = 0;
- it->nextpc = 0;
- it->value = -1;
- it->start = 1;
- it->done = 0;
- it->pcscale = ctxt->arch->minlc;
- pciternext(it);
-}
+++ /dev/null
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-// Portions Copyright © 1997-1999 Vita Nuova Limited
-// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-// Portions Copyright © 2004,2006 Bruce Ellis
-// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-// Portions Copyright © 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-static int
-yy_isalpha(int c)
-{
- return c >= 0 && c <= 0xFF && isalpha(c);
-}
-
-static struct {
- char *name;
- int val;
-} headers[] = {
- {"darwin", Hdarwin},
- {"dragonfly", Hdragonfly},
- {"elf", Helf},
- {"freebsd", Hfreebsd},
- {"linux", Hlinux},
- {"android", Hlinux}, // must be after "linux" entry or else headstr(Hlinux) == "android"
- {"nacl", Hnacl},
- {"netbsd", Hnetbsd},
- {"openbsd", Hopenbsd},
- {"plan9", Hplan9},
- {"solaris", Hsolaris},
- {"windows", Hwindows},
- {"windowsgui", Hwindows},
-};
-
-int
-headtype(char *name)
-{
- int i;
-
- for(i=0; i < nelem(headers); i++)
- if(strcmp(name, headers[i].name) == 0)
- return headers[i].val;
- return -1;
-}
-
-char*
-headstr(int v)
-{
- static char buf[20];
- int i;
-
- for(i=0; i < nelem(headers); i++)
- if(v == headers[i].val)
- return headers[i].name;
- snprint(buf, sizeof buf, "%d", v);
- return buf;
-}
-
-Link*
-linknew(LinkArch *arch)
-{
- Link *ctxt;
- char *p;
- char buf[1024];
-
- nuxiinit(arch);
-
- ctxt = emallocz(sizeof *ctxt);
- ctxt->arch = arch;
- ctxt->version = HistVersion;
- ctxt->goroot = getgoroot();
-
- p = getgoarch();
- if(strcmp(p, arch->name) != 0)
- sysfatal("invalid goarch %s (want %s)", p, arch->name);
-
- if(getwd(buf, sizeof buf) == 0)
- strcpy(buf, "/???");
- if(yy_isalpha(buf[0]) && buf[1] == ':') {
- // On Windows.
- ctxt->windows = 1;
-
- // Canonicalize path by converting \ to / (Windows accepts both).
- for(p=buf; *p; p++)
- if(*p == '\\')
- *p = '/';
- }
-
- ctxt->headtype = headtype(getgoos());
- if(ctxt->headtype < 0)
- sysfatal("unknown goos %s", getgoos());
-
- // Record thread-local storage offset.
- // TODO(rsc): Move tlsoffset back into the linker.
- switch(ctxt->headtype) {
- default:
- sysfatal("unknown thread-local storage offset for %s", headstr(ctxt->headtype));
- case Hplan9:
- case Hwindows:
- break;
- case Hlinux:
- case Hfreebsd:
- case Hnetbsd:
- case Hopenbsd:
- case Hdragonfly:
- case Hsolaris:
- /*
- * ELF uses TLS offset negative from FS.
- * Translate 0(FS) and 8(FS) into -16(FS) and -8(FS).
- * Known to low-level assembly in package runtime and runtime/cgo.
- */
- ctxt->tlsoffset = -2*ctxt->arch->ptrsize;
- break;
-
- case Hnacl:
- switch(ctxt->arch->thechar) {
- default:
- sysfatal("unknown thread-local storage offset for nacl/%s", ctxt->arch->name);
- case '5':
- ctxt->tlsoffset = 0;
- break;
- case '6':
- ctxt->tlsoffset = 0;
- break;
- case '8':
- ctxt->tlsoffset = -8;
- break;
- }
- break;
-
- case Hdarwin:
- /*
- * OS X system constants - offset from 0(GS) to our TLS.
- * Explained in ../../runtime/cgo/gcc_darwin_*.c.
- */
- switch(ctxt->arch->thechar) {
- default:
- sysfatal("unknown thread-local storage offset for darwin/%s", ctxt->arch->name);
- case '6':
- ctxt->tlsoffset = 0x8a0;
- break;
- case '8':
- ctxt->tlsoffset = 0x468;
- break;
- case '5':
- ctxt->tlsoffset = 0; // dummy value, not needed
- break;
- }
- break;
- }
-
- // On arm, record goarm.
- if(ctxt->arch->thechar == '5') {
- p = getgoarm();
- if(p != nil)
- ctxt->goarm = atoi(p);
- else
- ctxt->goarm = 6;
- }
-
- return ctxt;
-}
-
-LSym*
-linknewsym(Link *ctxt, char *symb, int v)
-{
- LSym *s;
-
- s = malloc(sizeof(*s));
- memset(s, 0, sizeof(*s));
-
- s->dynid = -1;
- s->plt = -1;
- s->got = -1;
- s->name = estrdup(symb);
- s->type = 0;
- s->version = v;
- s->value = 0;
- s->sig = 0;
- s->size = 0;
- ctxt->nsymbol++;
-
- s->allsym = ctxt->allsym;
- ctxt->allsym = s;
-
- return s;
-}
-
-static LSym*
-_lookup(Link *ctxt, char *symb, int v, int creat)
-{
- LSym *s;
- char *p;
- uint32 h;
- int c;
-
- h = v;
- for(p=symb; c = *p; p++)
- h = h+h+h + c;
- h &= 0xffffff;
- h %= LINKHASH;
- for(s = ctxt->hash[h]; s != nil; s = s->hash)
- if(s->version == v && strcmp(s->name, symb) == 0)
- return s;
- if(!creat)
- return nil;
-
- s = linknewsym(ctxt, symb, v);
- s->extname = s->name;
- s->hash = ctxt->hash[h];
- ctxt->hash[h] = s;
-
- return s;
-}
-
-LSym*
-linklookup(Link *ctxt, char *name, int v)
-{
- return _lookup(ctxt, name, v, 1);
-}
-
-// read-only lookup
-LSym*
-linkrlookup(Link *ctxt, char *name, int v)
-{
- return _lookup(ctxt, name, v, 0);
-}
-
exit wrongdir
}
-# Generate libc_plan9.h.
-../include/plan9/mklibc.rc > ../include/plan9/libc_plan9.h
-
# Clean old generated file that will cause problems in the build.
rm -f ./runtime/runtime_defs.go