diff --git a/include/README b/include/README deleted file mode 100644 index b8fb5231a99fdc60c340260e21805a30c6313172..0000000000000000000000000000000000000000 --- a/include/README +++ /dev/null @@ -1,6 +0,0 @@ -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. diff --git a/include/ar.h b/include/ar.h deleted file mode 100644 index 350941738c7043a6448406fc7439eb85cb3b70db..0000000000000000000000000000000000000000 --- a/include/ar.h +++ /dev/null @@ -1,54 +0,0 @@ -// 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]; -}; diff --git a/include/bio.h b/include/bio.h deleted file mode 100644 index 982b881f160539dc9a5a41e8a0f71292d119e418..0000000000000000000000000000000000000000 --- a/include/bio.h +++ /dev/null @@ -1,144 +0,0 @@ -/* -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 diff --git a/include/fmt.h b/include/fmt.h deleted file mode 100644 index 2280f25250b7adfdfadf7aa0b1ad329ee6bc69d2..0000000000000000000000000000000000000000 --- a/include/fmt.h +++ /dev/null @@ -1,116 +0,0 @@ -#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 diff --git a/include/libc.h b/include/libc.h deleted file mode 100644 index d82a19ccce8f3b78f8fdb92e7f681484fffb5f81..0000000000000000000000000000000000000000 --- a/include/libc.h +++ /dev/null @@ -1,398 +0,0 @@ -/* -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_ */ diff --git a/include/link.h b/include/link.h deleted file mode 100644 index 3df9b102c0f7cf40e6618e06faf1cbc59411ad18..0000000000000000000000000000000000000000 --- a/include/link.h +++ /dev/null @@ -1,406 +0,0 @@ -// 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; diff --git a/include/plan9/386/u.h b/include/plan9/386/u.h deleted file mode 100644 index 1c4076b5ea295688cdb12d722e040feb8de53164..0000000000000000000000000000000000000000 --- a/include/plan9/386/u.h +++ /dev/null @@ -1,17 +0,0 @@ -// 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; diff --git a/include/plan9/amd64/u.h b/include/plan9/amd64/u.h deleted file mode 100644 index c2d4999383c95e2c60b45b13a2bfb549d6639ab2..0000000000000000000000000000000000000000 --- a/include/plan9/amd64/u.h +++ /dev/null @@ -1,17 +0,0 @@ -// 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; diff --git a/include/plan9/ar.h b/include/plan9/ar.h deleted file mode 100644 index 350941738c7043a6448406fc7439eb85cb3b70db..0000000000000000000000000000000000000000 --- a/include/plan9/ar.h +++ /dev/null @@ -1,54 +0,0 @@ -// 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]; -}; diff --git a/include/plan9/arm/u.h b/include/plan9/arm/u.h deleted file mode 100644 index 19249aa480546c8d403b624b1f5cfb830aa7564a..0000000000000000000000000000000000000000 --- a/include/plan9/arm/u.h +++ /dev/null @@ -1,15 +0,0 @@ -// 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; diff --git a/include/plan9/bio.h b/include/plan9/bio.h deleted file mode 100644 index 13d5e0ef20377d9e9d2d1b61c22afa5be36bca77..0000000000000000000000000000000000000000 --- a/include/plan9/bio.h +++ /dev/null @@ -1,8 +0,0 @@ -// 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 diff --git a/include/plan9/errno.h b/include/plan9/errno.h deleted file mode 100644 index 1ed572acedd15c53149d6208376d00c6d5168cc9..0000000000000000000000000000000000000000 --- a/include/plan9/errno.h +++ /dev/null @@ -1,7 +0,0 @@ -// 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 diff --git a/include/plan9/fmt.h b/include/plan9/fmt.h deleted file mode 100644 index b4a4fe79153e38a10ee337e200af5e606c07f26a..0000000000000000000000000000000000000000 --- a/include/plan9/fmt.h +++ /dev/null @@ -1,64 +0,0 @@ -// 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* diff --git a/include/plan9/libc.h b/include/plan9/libc.h deleted file mode 100644 index 9a880505a4d91348e02b6363cb02a1476855257e..0000000000000000000000000000000000000000 --- a/include/plan9/libc.h +++ /dev/null @@ -1,37 +0,0 @@ -// 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 diff --git a/include/plan9/link.h b/include/plan9/link.h deleted file mode 100644 index f65971efceb4b85fa81695506e8bc7d496f2be89..0000000000000000000000000000000000000000 --- a/include/plan9/link.h +++ /dev/null @@ -1,5 +0,0 @@ -// 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" diff --git a/include/plan9/mklibc.rc b/include/plan9/mklibc.rc deleted file mode 100755 index 449e15fdffa65c15f4e52d4096536c5d1824beb2..0000000000000000000000000000000000000000 --- a/include/plan9/mklibc.rc +++ /dev/null @@ -1,8 +0,0 @@ -#!/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' diff --git a/include/plan9/stdarg.h b/include/plan9/stdarg.h deleted file mode 100644 index b562a3a6e83d28244e1f09a02fa36f79e626791f..0000000000000000000000000000000000000000 --- a/include/plan9/stdarg.h +++ /dev/null @@ -1,3 +0,0 @@ -// 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. diff --git a/include/plan9/utf.h b/include/plan9/utf.h deleted file mode 100644 index 03c26d69d0c76271ca3c05f6a42030bf037fad67..0000000000000000000000000000000000000000 --- a/include/plan9/utf.h +++ /dev/null @@ -1,5 +0,0 @@ -// 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" diff --git a/include/u.h b/include/u.h deleted file mode 100644 index 6f857820deafb1b80156ec09c425052236f88ae1..0000000000000000000000000000000000000000 --- a/include/u.h +++ /dev/null @@ -1,236 +0,0 @@ -/* -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 diff --git a/include/utf.h b/include/utf.h deleted file mode 100644 index be1c46e7f2e5e71750263653a2bd66ef021a5974..0000000000000000000000000000000000000000 --- a/include/utf.h +++ /dev/null @@ -1 +0,0 @@ -#include "../src/lib9/utf/utf.h" diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index f21331055f177df02b396ba4f3833cd3f33332b9..c13bace3604cd771003a9bd19fe74af66766ab4d 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -10,7 +10,6 @@ import ( "fmt" "os" "path/filepath" - "runtime" "strings" ) @@ -457,49 +456,9 @@ func setup() { } /* - * 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. @@ -517,8 +476,6 @@ var deptab = []struct { // depsuffix records the allowed suffixes for source files. var depsuffix = []string{ - ".c", - ".h", ".s", ".go", } @@ -561,40 +518,7 @@ func install(dir string) { 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. @@ -603,27 +527,13 @@ func install(dir string) { 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" { @@ -631,27 +541,6 @@ func install(dir string) { } 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]) @@ -669,30 +558,11 @@ func install(dir string) { 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) } } } @@ -737,15 +607,6 @@ func install(dir string) { return } - if !stale { - for _, p := range libs { - if mtime(p).After(ttarg) { - stale = true - break - } - } - } - if !stale { return } @@ -788,7 +649,7 @@ func install(dir string) { 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) @@ -797,111 +658,47 @@ func install(dir string) { } 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" { @@ -919,20 +716,12 @@ func install(dir string) { } 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...) @@ -1128,9 +917,6 @@ var cleantab = []string{ "cmd/9g", "cmd/9l", "cmd/go", - "lib9", - "libbio", - "liblink", // Go packages. "bufio", diff --git a/src/lib9/Makefile b/src/lib9/Makefile deleted file mode 100644 index 62aba5dca70f55d17e405cabf30766131503571a..0000000000000000000000000000000000000000 --- a/src/lib9/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# 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 diff --git a/src/lib9/_exits.c b/src/lib9/_exits.c deleted file mode 100644 index af55181b9002ff50d30e23cb3e8952535bc4a296..0000000000000000000000000000000000000000 --- a/src/lib9/_exits.c +++ /dev/null @@ -1,37 +0,0 @@ -// +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)); -} diff --git a/src/lib9/_p9dir.c b/src/lib9/_p9dir.c deleted file mode 100644 index 6b5a04eadd5b393cc7bebfdf02c365a1115ac7fa..0000000000000000000000000000000000000000 --- a/src/lib9/_p9dir.c +++ /dev/null @@ -1,184 +0,0 @@ -// +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; -} - diff --git a/src/lib9/atoi.c b/src/lib9/atoi.c deleted file mode 100644 index 5b002df75e464c84d49fa37acae74cd0f4f0f5f0..0000000000000000000000000000000000000000 --- a/src/lib9/atoi.c +++ /dev/null @@ -1,47 +0,0 @@ -// +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); -} diff --git a/src/lib9/await.c b/src/lib9/await.c deleted file mode 100644 index dfb155b2435b2371c69cc46e4d6a23d38d7e0fda..0000000000000000000000000000000000000000 --- a/src/lib9/await.c +++ /dev/null @@ -1,182 +0,0 @@ -// +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); -} diff --git a/src/lib9/cleanname.c b/src/lib9/cleanname.c deleted file mode 100644 index cb8fce6a5f3580317415eb102d81fd252580bad4..0000000000000000000000000000000000000000 --- a/src/lib9/cleanname.c +++ /dev/null @@ -1,80 +0,0 @@ -// +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; -} diff --git a/src/lib9/create.c b/src/lib9/create.c deleted file mode 100644 index 4ac7f7d619bec79124185ffa4a5957f1c3c858ad..0000000000000000000000000000000000000000 --- a/src/lib9/create.c +++ /dev/null @@ -1,85 +0,0 @@ -// +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; -} diff --git a/src/lib9/ctime.c b/src/lib9/ctime.c deleted file mode 100644 index e16ad4a5e51632cabac6b7fd3cd299c81fee0d97..0000000000000000000000000000000000000000 --- a/src/lib9/ctime.c +++ /dev/null @@ -1,30 +0,0 @@ -// 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; -} diff --git a/src/lib9/dirfstat.c b/src/lib9/dirfstat.c deleted file mode 100644 index c092a2a0725c2a620123580edd49133a4fadf933..0000000000000000000000000000000000000000 --- a/src/lib9/dirfstat.c +++ /dev/null @@ -1,56 +0,0 @@ -// +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; -} - diff --git a/src/lib9/dirfwstat.c b/src/lib9/dirfwstat.c deleted file mode 100644 index 4666e21079df446f5eacfc75abd4a632b0d70450..0000000000000000000000000000000000000000 --- a/src/lib9/dirfwstat.c +++ /dev/null @@ -1,84 +0,0 @@ -// +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; -} - diff --git a/src/lib9/dirstat.c b/src/lib9/dirstat.c deleted file mode 100644 index 33f0d7cf26e58b10acf46040efa9edd2b59b1ea0..0000000000000000000000000000000000000000 --- a/src/lib9/dirstat.c +++ /dev/null @@ -1,65 +0,0 @@ -// +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; -} - diff --git a/src/lib9/dirwstat.c b/src/lib9/dirwstat.c deleted file mode 100644 index 22e25fff7b770b1138dfc32d1d92edab6f9981c6..0000000000000000000000000000000000000000 --- a/src/lib9/dirwstat.c +++ /dev/null @@ -1,45 +0,0 @@ -// +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); -} diff --git a/src/lib9/dup.c b/src/lib9/dup.c deleted file mode 100644 index 5cac831d6862f1e40d3345765c51f6f99ef4ca23..0000000000000000000000000000000000000000 --- a/src/lib9/dup.c +++ /dev/null @@ -1,38 +0,0 @@ -// +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); -} diff --git a/src/lib9/errstr.c b/src/lib9/errstr.c deleted file mode 100644 index 9d919755d183b1831e6ad3172f0eb30064789647..0000000000000000000000000000000000000000 --- a/src/lib9/errstr.c +++ /dev/null @@ -1,107 +0,0 @@ -// +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); -} - diff --git a/src/lib9/exec.c b/src/lib9/exec.c deleted file mode 100644 index 8e5fc57848e554d6b0defc3649b29b1b1f43daf8..0000000000000000000000000000000000000000 --- a/src/lib9/exec.c +++ /dev/null @@ -1,35 +0,0 @@ -// +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); -} diff --git a/src/lib9/execl.c b/src/lib9/execl.c deleted file mode 100644 index fd4d23daaf513a8a0ddd175034db2aea2b9fab20..0000000000000000000000000000000000000000 --- a/src/lib9/execl.c +++ /dev/null @@ -1,55 +0,0 @@ -// +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; -} - diff --git a/src/lib9/exitcode.c b/src/lib9/exitcode.c deleted file mode 100644 index fc863445f5ea9f8de54e499507e129208cec916f..0000000000000000000000000000000000000000 --- a/src/lib9/exitcode.c +++ /dev/null @@ -1,37 +0,0 @@ -// +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; -} - diff --git a/src/lib9/exits.c b/src/lib9/exits.c deleted file mode 100644 index 0be7cb9f10531a6a9f80b087fd3eb801d976e127..0000000000000000000000000000000000000000 --- a/src/lib9/exits.c +++ /dev/null @@ -1,36 +0,0 @@ -// +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)); -} diff --git a/src/lib9/flag.c b/src/lib9/flag.c deleted file mode 100644 index db46b980950667ff4ef34652a8336b9687dd33c6..0000000000000000000000000000000000000000 --- a/src/lib9/flag.c +++ /dev/null @@ -1,307 +0,0 @@ -// 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); - } -} diff --git a/src/lib9/fmt/charstod.c b/src/lib9/fmt/charstod.c deleted file mode 100644 index b8096e8fbaccd4ed54b9dd348604d51d2e99811d..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/charstod.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/dofmt.c b/src/lib9/fmt/dofmt.c deleted file mode 100644 index 3b9dc361213707b16fa72c07be3cd30cb9ce9a68..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/dofmt.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/dorfmt.c b/src/lib9/fmt/dorfmt.c deleted file mode 100644 index f760d47e5e85948812dda0145fb320c727e9c899..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/dorfmt.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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; - } -} diff --git a/src/lib9/fmt/errfmt.c b/src/lib9/fmt/errfmt.c deleted file mode 100644 index a86709398e932d37a3cf32367c47eec2be2c3a01..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/errfmt.c +++ /dev/null @@ -1,32 +0,0 @@ -// +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)); -} diff --git a/src/lib9/fmt/fltfmt.c b/src/lib9/fmt/fltfmt.c deleted file mode 100644 index 6fe8192211412c0b52c04553e0f536e516990b41..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fltfmt.c +++ /dev/null @@ -1,683 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/fmt.c b/src/lib9/fmt/fmt.c deleted file mode 100644 index 7e576773b0c576e84a0a0e69620a2572f1112248..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmt.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * 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; - } -} diff --git a/src/lib9/fmt/fmtdef.h b/src/lib9/fmt/fmtdef.h deleted file mode 100644 index 4bbd9f5781fc7cd53d97a189e2d3be902e03c03e..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtdef.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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 - diff --git a/src/lib9/fmt/fmtfd.c b/src/lib9/fmt/fmtfd.c deleted file mode 100644 index dde05b7a5e0364ceac229af6e48478e7da28b0bc..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtfd.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fmtfdflush.c b/src/lib9/fmt/fmtfdflush.c deleted file mode 100644 index 401acbea731bf3029c8bf5d2225aa6fb70f05450..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtfdflush.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fmtlocale.c b/src/lib9/fmt/fmtlocale.c deleted file mode 100644 index 64ed10f7b98d2051761d488d3b66131b1388dd01..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtlocale.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/fmtlock.c b/src/lib9/fmt/fmtlock.c deleted file mode 100644 index 297acd8f92880fb65a2e79bad77898bf8aaaf1e7..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtlock.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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) -{ -} diff --git a/src/lib9/fmt/fmtnull.c b/src/lib9/fmt/fmtnull.c deleted file mode 100644 index b8caacbf7b7d88d013ec6c76d55db114d0ac5a7e..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtnull.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/fmtprint.c b/src/lib9/fmt/fmtprint.c deleted file mode 100644 index 6848ab4ebb892331839539aafdf28b7ceb059bf8..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtprint.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/fmtquote.c b/src/lib9/fmt/fmtquote.c deleted file mode 100644 index 93b2abbe799502333bb74fd97c45f27549399a01..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtquote.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fmtrune.c b/src/lib9/fmt/fmtrune.c deleted file mode 100644 index 2bc8d28e6f1312f11c55e829bb9723bd80720d55..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtrune.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fmtstr.c b/src/lib9/fmt/fmtstr.c deleted file mode 100644 index a6ca7721d025c5ac811ca13c31dc1b75174c0f76..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtstr.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fmtvprint.c b/src/lib9/fmt/fmtvprint.c deleted file mode 100644 index f18d27bbad019c5e465f727f67aa407e8688baa9..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fmtvprint.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/fprint.c b/src/lib9/fmt/fprint.c deleted file mode 100644 index 70cb1385a432b7e6d19e5f786e2b0f737f8b2cfa..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/fprint.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/nan64.c b/src/lib9/fmt/nan64.c deleted file mode 100644 index 1ea702741e7119a43055082d4441e014a2ad9742..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/nan64.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/pow10.c b/src/lib9/fmt/pow10.c deleted file mode 100644 index e146884a8f8d42bd08cefc66e93e64a8ac791472..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/pow10.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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); -} diff --git a/src/lib9/fmt/print.c b/src/lib9/fmt/print.c deleted file mode 100644 index 5c39457d6dc7a56f24763a545021e7ef078d3dc1..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/print.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/seprint.c b/src/lib9/fmt/seprint.c deleted file mode 100644 index 88779d90adca93ebf7e6031f0356a806df671945..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/seprint.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/smprint.c b/src/lib9/fmt/smprint.c deleted file mode 100644 index c13ffd7ddc95b4e704d1c4cd389d9955572b11ca..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/smprint.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/snprint.c b/src/lib9/fmt/snprint.c deleted file mode 100644 index 372399c448aa349ba6efaff7013f1ac1f1e948c3..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/snprint.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/sprint.c b/src/lib9/fmt/sprint.c deleted file mode 100644 index 02655ad123c0b1371131baa49674e9a237db622f..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/sprint.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/strtod.c b/src/lib9/fmt/strtod.c deleted file mode 100644 index ec185d2d5f762c14ca4bbd48d50b4c76a06f4e59..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/strtod.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/test.c b/src/lib9/fmt/test.c deleted file mode 100644 index d82ff78baf48f10b140ad8dcf07df3ac9f105ef9..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/test.c +++ /dev/null @@ -1,67 +0,0 @@ -// +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; -} diff --git a/src/lib9/fmt/vfprint.c b/src/lib9/fmt/vfprint.c deleted file mode 100644 index a23c5a0c658c68629233753606e1a7e9b72bcd88..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/vfprint.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/fmt/vseprint.c b/src/lib9/fmt/vseprint.c deleted file mode 100644 index c9fbfb95603f949ff14f2602e1a1b2392c005565..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/vseprint.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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; -} - diff --git a/src/lib9/fmt/vsmprint.c b/src/lib9/fmt/vsmprint.c deleted file mode 100644 index 46086f9e280cbd42448b6ffb8bf16eeb5d6afe10..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/vsmprint.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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); -} diff --git a/src/lib9/fmt/vsnprint.c b/src/lib9/fmt/vsnprint.c deleted file mode 100644 index 6b3877205e86fe36b32552e8b092b3ec2fa4131c..0000000000000000000000000000000000000000 --- a/src/lib9/fmt/vsnprint.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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); -} diff --git a/src/lib9/fmtlock2.c b/src/lib9/fmtlock2.c deleted file mode 100644 index a0e2636ec83c94c13680b0557091ec38fc824585..0000000000000000000000000000000000000000 --- a/src/lib9/fmtlock2.c +++ /dev/null @@ -1,40 +0,0 @@ -// +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) -{ -} diff --git a/src/lib9/getenv.c b/src/lib9/getenv.c deleted file mode 100644 index 2454b6b4167d0c95b840d7fe9aa424fb12249f6e..0000000000000000000000000000000000000000 --- a/src/lib9/getenv.c +++ /dev/null @@ -1,52 +0,0 @@ -// +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; -} diff --git a/src/lib9/getfields.c b/src/lib9/getfields.c deleted file mode 100644 index 0af8388da8dc6e3098bbecaf35e9b43a06b322f4..0000000000000000000000000000000000000000 --- a/src/lib9/getfields.c +++ /dev/null @@ -1,63 +0,0 @@ -/* -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; -} diff --git a/src/lib9/getwd.c b/src/lib9/getwd.c deleted file mode 100644 index 03a8ff1a2f500fed0b199e9a10247400fa28f66a..0000000000000000000000000000000000000000 --- a/src/lib9/getwd.c +++ /dev/null @@ -1,56 +0,0 @@ -// +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); -} diff --git a/src/lib9/goos.c b/src/lib9/goos.c deleted file mode 100644 index 68b94d6114ed3eccd5c639b3cf0da65b1320e075..0000000000000000000000000000000000000000 --- a/src/lib9/goos.c +++ /dev/null @@ -1,71 +0,0 @@ -// 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; -} diff --git a/src/lib9/jmp.c b/src/lib9/jmp.c deleted file mode 100644 index 733ed70e96ad663b6a865b56a207049386ff77b4..0000000000000000000000000000000000000000 --- a/src/lib9/jmp.c +++ /dev/null @@ -1,45 +0,0 @@ -// +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); -} - diff --git a/src/lib9/main.c b/src/lib9/main.c deleted file mode 100644 index 088b09523c24d19dd0939772e56060ce6071c3f8..0000000000000000000000000000000000000000 --- a/src/lib9/main.c +++ /dev/null @@ -1,60 +0,0 @@ -// +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; -} diff --git a/src/lib9/math_darwin_arm.c b/src/lib9/math_darwin_arm.c deleted file mode 100644 index ff5b0ce07a6429b53cb4f94c6673c7d94da84f04..0000000000000000000000000000000000000000 --- a/src/lib9/math_darwin_arm.c +++ /dev/null @@ -1,102 +0,0 @@ -// 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" - ); -} diff --git a/src/lib9/nan.c b/src/lib9/nan.c deleted file mode 100644 index f17b441aae6ab229ff8af3e67bb0c126586aa2d4..0000000000000000000000000000000000000000 --- a/src/lib9/nan.c +++ /dev/null @@ -1,54 +0,0 @@ -// +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); -} diff --git a/src/lib9/notify.c b/src/lib9/notify.c deleted file mode 100644 index 7843d347135890e6688e733533927cd255323aba..0000000000000000000000000000000000000000 --- a/src/lib9/notify.c +++ /dev/null @@ -1,300 +0,0 @@ -// +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); - } -} - diff --git a/src/lib9/nulldir.c b/src/lib9/nulldir.c deleted file mode 100644 index 2157ff313d8e72fd5907292f670ed3b49a316991..0000000000000000000000000000000000000000 --- a/src/lib9/nulldir.c +++ /dev/null @@ -1,37 +0,0 @@ -// +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 = ""; -} diff --git a/src/lib9/open.c b/src/lib9/open.c deleted file mode 100644 index 7f53c8ea645be353f732d3a28a86f64f8e41d578..0000000000000000000000000000000000000000 --- a/src/lib9/open.c +++ /dev/null @@ -1,70 +0,0 @@ -// +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; -} diff --git a/src/lib9/readn.c b/src/lib9/readn.c deleted file mode 100644 index 7dfe9e515d84004996c265cb422ab538bc5fb11c..0000000000000000000000000000000000000000 --- a/src/lib9/readn.c +++ /dev/null @@ -1,50 +0,0 @@ -// +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; -} diff --git a/src/lib9/rfork.c b/src/lib9/rfork.c deleted file mode 100644 index 23b3ee67196bac8b33887ce6797168fbfaecd2a6..0000000000000000000000000000000000000000 --- a/src/lib9/rfork.c +++ /dev/null @@ -1,156 +0,0 @@ -// +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; -} diff --git a/src/lib9/run_plan9.c b/src/lib9/run_plan9.c deleted file mode 100644 index 29932626dc976d389e44940ddd5301e7df29dd24..0000000000000000000000000000000000000000 --- a/src/lib9/run_plan9.c +++ /dev/null @@ -1,40 +0,0 @@ -// 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; -} diff --git a/src/lib9/run_unix.c b/src/lib9/run_unix.c deleted file mode 100644 index 1acaefed87535f16b807ae4b2e0f8abd225610e6..0000000000000000000000000000000000000000 --- a/src/lib9/run_unix.c +++ /dev/null @@ -1,43 +0,0 @@ -// 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; -} - diff --git a/src/lib9/run_windows.c b/src/lib9/run_windows.c deleted file mode 100644 index e3e1c25710d1beb624add3f7c85a6bab74a899ac..0000000000000000000000000000000000000000 --- a/src/lib9/run_windows.c +++ /dev/null @@ -1,89 +0,0 @@ -// 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; -} diff --git a/src/lib9/seek.c b/src/lib9/seek.c deleted file mode 100644 index 0a0706cbeec2ef5e8a8cc1236c0759fd3b470f52..0000000000000000000000000000000000000000 --- a/src/lib9/seek.c +++ /dev/null @@ -1,35 +0,0 @@ -// +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); -} diff --git a/src/lib9/strecpy.c b/src/lib9/strecpy.c deleted file mode 100644 index 4b2b92b43d95199e88cf2986e7c870c29e5a6559..0000000000000000000000000000000000000000 --- a/src/lib9/strecpy.c +++ /dev/null @@ -1,45 +0,0 @@ -// +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; -} diff --git a/src/lib9/sysfatal.c b/src/lib9/sysfatal.c deleted file mode 100644 index 9789061a881d4441571dab2139e28f016d19468e..0000000000000000000000000000000000000000 --- a/src/lib9/sysfatal.c +++ /dev/null @@ -1,49 +0,0 @@ -// +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"); -} - diff --git a/src/lib9/tempdir_plan9.c b/src/lib9/tempdir_plan9.c deleted file mode 100644 index 80d7ddbe4bbe1b3afd127bead035a2c325cd22f5..0000000000000000000000000000000000000000 --- a/src/lib9/tempdir_plan9.c +++ /dev/null @@ -1,56 +0,0 @@ -// 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); -} diff --git a/src/lib9/tempdir_unix.c b/src/lib9/tempdir_unix.c deleted file mode 100644 index 269d53823320d20424ad9d2a4f4fc09f423100e9..0000000000000000000000000000000000000000 --- a/src/lib9/tempdir_unix.c +++ /dev/null @@ -1,52 +0,0 @@ -// 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); -} diff --git a/src/lib9/tempdir_windows.c b/src/lib9/tempdir_windows.c deleted file mode 100644 index 4c3df7cf11ac5d76d263771edab00a510eab39b7..0000000000000000000000000000000000000000 --- a/src/lib9/tempdir_windows.c +++ /dev/null @@ -1,113 +0,0 @@ -// 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); -} diff --git a/src/lib9/time.c b/src/lib9/time.c deleted file mode 100644 index e1b87a774066e9487ca21b4c520cf69a06dc07ce..0000000000000000000000000000000000000000 --- a/src/lib9/time.c +++ /dev/null @@ -1,68 +0,0 @@ -// +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; -} diff --git a/src/lib9/tokenize.c b/src/lib9/tokenize.c deleted file mode 100644 index a9b5935670e830e21eba41e79ebfca039a3fe5fc..0000000000000000000000000000000000000000 --- a/src/lib9/tokenize.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -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; -} diff --git a/src/lib9/utf/Makefile b/src/lib9/utf/Makefile deleted file mode 100644 index fe6f6351a9c3ab6781b29b420f3b1b0793a980cd..0000000000000000000000000000000000000000 --- a/src/lib9/utf/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# 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 diff --git a/src/lib9/utf/mkrunetype.c b/src/lib9/utf/mkrunetype.c deleted file mode 100644 index 01eb6b6ec54bbaf3fe7b3ec760ab1fe19adfaa2c..0000000000000000000000000000000000000000 --- a/src/lib9/utf/mkrunetype.c +++ /dev/null @@ -1,734 +0,0 @@ -// 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); -} diff --git a/src/lib9/utf/rune.c b/src/lib9/utf/rune.c deleted file mode 100644 index 99f03eaa3f88f5edc4255cbadf549bb13986f4e7..0000000000000000000000000000000000000000 --- a/src/lib9/utf/rune.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/utf/runetype.c b/src/lib9/utf/runetype.c deleted file mode 100644 index ed775af08f54c9e54ce6e30918982a7e6009da28..0000000000000000000000000000000000000000 --- a/src/lib9/utf/runetype.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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" diff --git a/src/lib9/utf/runetypebody-6.3.0.h b/src/lib9/utf/runetypebody-6.3.0.h deleted file mode 100644 index 5554dca36d8c8c281c9d75418cf9fe5bddc5074b..0000000000000000000000000000000000000000 --- a/src/lib9/utf/runetypebody-6.3.0.h +++ /dev/null @@ -1,1638 +0,0 @@ -/* 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; -} - diff --git a/src/lib9/utf/utf.h b/src/lib9/utf/utf.h deleted file mode 100644 index 72d01ed636a339e05d8a12954062cd2c7e752d3d..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utf.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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 diff --git a/src/lib9/utf/utfdef.h b/src/lib9/utf/utfdef.h deleted file mode 100644 index 4bbdfc643c859580707de60d0e93579a15bc25cb..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfdef.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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])) diff --git a/src/lib9/utf/utfecpy.c b/src/lib9/utf/utfecpy.c deleted file mode 100644 index 85406646080944e15188a2f025f35903539c1266..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfecpy.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/utf/utflen.c b/src/lib9/utf/utflen.c deleted file mode 100644 index 9b961856a5832f5c2f307c21fc52a8c13058d38c..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utflen.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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++; - } -} diff --git a/src/lib9/utf/utfnlen.c b/src/lib9/utf/utfnlen.c deleted file mode 100644 index d6ef5fa06f4763ad625f8c19a541dac0d8cf4418..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfnlen.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/utf/utfrrune.c b/src/lib9/utf/utfrrune.c deleted file mode 100644 index b1ea93b423234bfb79a35749102f23b0d5306c5c..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfrrune.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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; - } -} diff --git a/src/lib9/utf/utfrune.c b/src/lib9/utf/utfrune.c deleted file mode 100644 index 44675c98920495f7586ce83a65e1bee7707f1046..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfrune.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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; - } -} diff --git a/src/lib9/utf/utfutf.c b/src/lib9/utf/utfutf.c deleted file mode 100644 index 05335b23e8b2e224c3793c7cc573e52581467301..0000000000000000000000000000000000000000 --- a/src/lib9/utf/utfutf.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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; -} diff --git a/src/lib9/win.h b/src/lib9/win.h deleted file mode 100644 index d9df319afbc09c93760215341c6d679e85577501..0000000000000000000000000000000000000000 --- a/src/lib9/win.h +++ /dev/null @@ -1,8 +0,0 @@ -// 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*); diff --git a/src/lib9/windows.c b/src/lib9/windows.c deleted file mode 100644 index 082f33997a7d09b617c6826cc749e69e4dec4c8c..0000000000000000000000000000000000000000 --- a/src/lib9/windows.c +++ /dev/null @@ -1,31 +0,0 @@ -// 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; -} diff --git a/src/libbio/Makefile b/src/libbio/Makefile deleted file mode 100644 index 62aba5dca70f55d17e405cabf30766131503571a..0000000000000000000000000000000000000000 --- a/src/libbio/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# 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 diff --git a/src/libbio/bbuffered.c b/src/libbio/bbuffered.c deleted file mode 100644 index 2ddb29b770d82a191798693376967fa1c68cdf8b..0000000000000000000000000000000000000000 --- a/src/libbio/bbuffered.c +++ /dev/null @@ -1,46 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bfildes.c b/src/libbio/bfildes.c deleted file mode 100644 index aef1f70bb84c7cbbb1afd68292d27692c89d1d4c..0000000000000000000000000000000000000000 --- a/src/libbio/bfildes.c +++ /dev/null @@ -1,35 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bflush.c b/src/libbio/bflush.c deleted file mode 100644 index ea7ae2c62b15e28223e36ff783789f8c4e0b6773..0000000000000000000000000000000000000000 --- a/src/libbio/bflush.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bgetc.c b/src/libbio/bgetc.c deleted file mode 100644 index ceb5cb13f8c75eabf111f325c7fe0e1e25c91945..0000000000000000000000000000000000000000 --- a/src/libbio/bgetc.c +++ /dev/null @@ -1,99 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bgetd.c b/src/libbio/bgetd.c deleted file mode 100644 index 12d2c5b37298a559fd5438becb4fc67ae45d2587..0000000000000000000000000000000000000000 --- a/src/libbio/bgetd.c +++ /dev/null @@ -1,62 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bgetrune.c b/src/libbio/bgetrune.c deleted file mode 100644 index b5db3910617c45a8d3654e5e82857fb9c08fdc8c..0000000000000000000000000000000000000000 --- a/src/libbio/bgetrune.c +++ /dev/null @@ -1,72 +0,0 @@ -/* -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; -} diff --git a/src/libbio/binit.c b/src/libbio/binit.c deleted file mode 100644 index a7ade5081fe76e9abab24d00fa1963a84ab2a456..0000000000000000000000000000000000000000 --- a/src/libbio/binit.c +++ /dev/null @@ -1,179 +0,0 @@ -/* -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; -} diff --git a/src/libbio/boffset.c b/src/libbio/boffset.c deleted file mode 100644 index 15dd609e10e43ca5d522046dfa481752377b1ec9..0000000000000000000000000000000000000000 --- a/src/libbio/boffset.c +++ /dev/null @@ -1,51 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bprint.c b/src/libbio/bprint.c deleted file mode 100644 index 301dc0c7f34c87a192db5cf9be2a9a8bdc23ec41..0000000000000000000000000000000000000000 --- a/src/libbio/bprint.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bputc.c b/src/libbio/bputc.c deleted file mode 100644 index 07b4789b707254d3bfe1830bef18657e4f9d8084..0000000000000000000000000000000000000000 --- a/src/libbio/bputc.c +++ /dev/null @@ -1,60 +0,0 @@ -/* -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); -} diff --git a/src/libbio/bputrune.c b/src/libbio/bputrune.c deleted file mode 100644 index f2077958bc8a925ae05c4e97e7710998914b7988..0000000000000000000000000000000000000000 --- a/src/libbio/bputrune.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -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; -} diff --git a/src/libbio/brdline.c b/src/libbio/brdline.c deleted file mode 100644 index 1c3093ecf3a69e0987e303d225a4a1190f2c4d31..0000000000000000000000000000000000000000 --- a/src/libbio/brdline.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -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; -} diff --git a/src/libbio/brdstr.c b/src/libbio/brdstr.c deleted file mode 100644 index 6a90cf69b2a7adc76d92062697844a923e0bac5a..0000000000000000000000000000000000000000 --- a/src/libbio/brdstr.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - 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; -} diff --git a/src/libbio/bread.c b/src/libbio/bread.c deleted file mode 100644 index 343a0bf29bee1e7497b4a6b68cb4ad8ac43830c9..0000000000000000000000000000000000000000 --- a/src/libbio/bread.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bseek.c b/src/libbio/bseek.c deleted file mode 100644 index 528958510634fc7c6c82d69ce599c4e4ace39d4a..0000000000000000000000000000000000000000 --- a/src/libbio/bseek.c +++ /dev/null @@ -1,93 +0,0 @@ -/* -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; -} diff --git a/src/libbio/bwrite.c b/src/libbio/bwrite.c deleted file mode 100644 index 8b9943ab086f969fac4d3bcdc5b1f60f808ecf38..0000000000000000000000000000000000000000 --- a/src/libbio/bwrite.c +++ /dev/null @@ -1,64 +0,0 @@ -/* -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; -} diff --git a/src/liblink/Makefile b/src/liblink/Makefile deleted file mode 100644 index 2a317462b3010cc6c10575d84793ecd85ccd25bc..0000000000000000000000000000000000000000 --- a/src/liblink/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# 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 diff --git a/src/liblink/arch.c b/src/liblink/arch.c deleted file mode 100644 index 2e425a6117a6b8b6e30ebb3c82eff1d2478fe878..0000000000000000000000000000000000000000 --- a/src/liblink/arch.c +++ /dev/null @@ -1,68 +0,0 @@ -// 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, -}; diff --git a/src/liblink/data.c b/src/liblink/data.c deleted file mode 100644 index 06fe7e047194e844a61e247f8ce4904007fde9fd..0000000000000000000000000000000000000000 --- a/src/liblink/data.c +++ /dev/null @@ -1,283 +0,0 @@ -// 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; -} diff --git a/src/liblink/go.c b/src/liblink/go.c deleted file mode 100644 index 6dae3f438c20610854bc94edbddee33f7cdbaa44..0000000000000000000000000000000000000000 --- a/src/liblink/go.c +++ /dev/null @@ -1,72 +0,0 @@ -// 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; -} - - - - diff --git a/src/liblink/ld.c b/src/liblink/ld.c deleted file mode 100644 index 5dfb4efc214a4df2458f528e4c4a8910f837eda4..0000000000000000000000000000000000000000 --- a/src/liblink/ld.c +++ /dev/null @@ -1,220 +0,0 @@ -// 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; -} diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c deleted file mode 100644 index 3531c69df4f04f54e3728dc49f5a223f70a859ba..0000000000000000000000000000000000000000 --- a/src/liblink/objfile.c +++ /dev/null @@ -1,417 +0,0 @@ -// 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; -} diff --git a/src/liblink/pcln.c b/src/liblink/pcln.c deleted file mode 100644 index cdc11b85db7119cc51cb92da780a7375aa3ae595..0000000000000000000000000000000000000000 --- a/src/liblink/pcln.c +++ /dev/null @@ -1,100 +0,0 @@ -// 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); -} diff --git a/src/liblink/sym.c b/src/liblink/sym.c deleted file mode 100644 index 9ee179717a781c64ba0cd6f03b14afa26c3d1d5f..0000000000000000000000000000000000000000 --- a/src/liblink/sym.c +++ /dev/null @@ -1,255 +0,0 @@ -// 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); -} - diff --git a/src/make.rc b/src/make.rc index 46ab35bcbc2db7a2033dc3fcbdb0e0889f8b700f..1d51f2842ecccadfe5fbd848b5e681c604b9d455 100755 --- a/src/make.rc +++ b/src/make.rc @@ -35,9 +35,6 @@ if(! test -f run.rc){ 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