From 3317e7f19a15d7b7adb262c2a2712ba3caf05c70 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 28 Feb 2015 14:00:44 -0500 Subject: [PATCH] all: delete C libraries and cmd/dist code that builds them Change-Id: Ic66243674ac1dbf829c7523005e33611cc89ac83 Reviewed-on: https://go-review.googlesource.com/6362 Reviewed-by: Rob Pike --- include/README | 6 - include/ar.h | 54 - include/bio.h | 144 --- include/fmt.h | 116 -- include/libc.h | 398 ------- include/link.h | 406 ------- include/plan9/386/u.h | 17 - include/plan9/amd64/u.h | 17 - include/plan9/ar.h | 54 - include/plan9/arm/u.h | 15 - include/plan9/bio.h | 8 - include/plan9/errno.h | 7 - include/plan9/fmt.h | 64 -- include/plan9/libc.h | 37 - include/plan9/link.h | 5 - include/plan9/mklibc.rc | 8 - include/plan9/stdarg.h | 3 - include/plan9/utf.h | 5 - include/u.h | 236 ----- include/utf.h | 1 - src/cmd/dist/build.go | 284 +---- src/lib9/Makefile | 5 - src/lib9/_exits.c | 37 - src/lib9/_p9dir.c | 184 ---- src/lib9/atoi.c | 47 - src/lib9/await.c | 182 ---- src/lib9/cleanname.c | 80 -- src/lib9/create.c | 85 -- src/lib9/ctime.c | 30 - src/lib9/dirfstat.c | 56 - src/lib9/dirfwstat.c | 84 -- src/lib9/dirstat.c | 65 -- src/lib9/dirwstat.c | 45 - src/lib9/dup.c | 38 - src/lib9/errstr.c | 107 -- src/lib9/exec.c | 35 - src/lib9/execl.c | 55 - src/lib9/exitcode.c | 37 - src/lib9/exits.c | 36 - src/lib9/flag.c | 307 ------ src/lib9/fmt/charstod.c | 88 -- src/lib9/fmt/dofmt.c | 624 ----------- src/lib9/fmt/dorfmt.c | 64 -- src/lib9/fmt/errfmt.c | 32 - src/lib9/fmt/fltfmt.c | 683 ------------ src/lib9/fmt/fmt.c | 235 ----- src/lib9/fmt/fmtdef.h | 119 --- src/lib9/fmt/fmtfd.c | 51 - src/lib9/fmt/fmtfdflush.c | 37 - src/lib9/fmt/fmtlocale.c | 69 -- src/lib9/fmt/fmtlock.c | 31 - src/lib9/fmt/fmtnull.c | 48 - src/lib9/fmt/fmtprint.c | 39 - src/lib9/fmt/fmtquote.c | 274 ----- src/lib9/fmt/fmtrune.c | 43 - src/lib9/fmt/fmtstr.c | 31 - src/lib9/fmt/fmtvprint.c | 52 - src/lib9/fmt/fprint.c | 33 - src/lib9/fmt/nan64.c | 93 -- src/lib9/fmt/pow10.c | 60 -- src/lib9/fmt/print.c | 33 - src/lib9/fmt/seprint.c | 33 - src/lib9/fmt/smprint.c | 33 - src/lib9/fmt/snprint.c | 34 - src/lib9/fmt/sprint.c | 45 - src/lib9/fmt/strtod.c | 533 ---------- src/lib9/fmt/test.c | 67 -- src/lib9/fmt/vfprint.c | 37 - src/lib9/fmt/vseprint.c | 44 - src/lib9/fmt/vsmprint.c | 87 -- src/lib9/fmt/vsnprint.c | 43 - src/lib9/fmtlock2.c | 40 - src/lib9/getenv.c | 52 - src/lib9/getfields.c | 63 -- src/lib9/getwd.c | 56 - src/lib9/goos.c | 71 -- src/lib9/jmp.c | 45 - src/lib9/main.c | 60 -- src/lib9/math_darwin_arm.c | 102 -- src/lib9/nan.c | 54 - src/lib9/notify.c | 300 ------ src/lib9/nulldir.c | 37 - src/lib9/open.c | 70 -- src/lib9/readn.c | 50 - src/lib9/rfork.c | 156 --- src/lib9/run_plan9.c | 40 - src/lib9/run_unix.c | 43 - src/lib9/run_windows.c | 89 -- src/lib9/seek.c | 35 - src/lib9/strecpy.c | 45 - src/lib9/sysfatal.c | 49 - src/lib9/tempdir_plan9.c | 56 - src/lib9/tempdir_unix.c | 52 - src/lib9/tempdir_windows.c | 113 -- src/lib9/time.c | 68 -- src/lib9/tokenize.c | 133 --- src/lib9/utf/Makefile | 30 - src/lib9/utf/mkrunetype.c | 734 ------------- src/lib9/utf/rune.c | 358 ------- src/lib9/utf/runetype.c | 38 - src/lib9/utf/runetypebody-6.3.0.h | 1638 ----------------------------- src/lib9/utf/utf.h | 240 ----- src/lib9/utf/utfdef.h | 27 - src/lib9/utf/utfecpy.c | 36 - src/lib9/utf/utflen.c | 35 - src/lib9/utf/utfnlen.c | 39 - src/lib9/utf/utfrrune.c | 46 - src/lib9/utf/utfrune.c | 45 - src/lib9/utf/utfutf.c | 43 - src/lib9/win.h | 8 - src/lib9/windows.c | 31 - src/libbio/Makefile | 5 - src/libbio/bbuffered.c | 46 - src/libbio/bfildes.c | 35 - src/libbio/bflush.c | 59 -- src/libbio/bgetc.c | 99 -- src/libbio/bgetd.c | 62 -- src/libbio/bgetrune.c | 72 -- src/libbio/binit.c | 179 ---- src/libbio/boffset.c | 51 - src/libbio/bprint.c | 82 -- src/libbio/bputc.c | 60 -- src/libbio/bputrune.c | 49 - src/libbio/brdline.c | 120 --- src/libbio/brdstr.c | 60 -- src/libbio/bread.c | 71 -- src/libbio/bseek.c | 93 -- src/libbio/bwrite.c | 64 -- src/liblink/Makefile | 5 - src/liblink/arch.c | 68 -- src/liblink/data.c | 283 ----- src/liblink/go.c | 72 -- src/liblink/ld.c | 220 ---- src/liblink/objfile.c | 417 -------- src/liblink/pcln.c | 100 -- src/liblink/sym.c | 255 ----- src/make.rc | 3 - 137 files changed, 35 insertions(+), 14917 deletions(-) delete mode 100644 include/README delete mode 100644 include/ar.h delete mode 100644 include/bio.h delete mode 100644 include/fmt.h delete mode 100644 include/libc.h delete mode 100644 include/link.h delete mode 100644 include/plan9/386/u.h delete mode 100644 include/plan9/amd64/u.h delete mode 100644 include/plan9/ar.h delete mode 100644 include/plan9/arm/u.h delete mode 100644 include/plan9/bio.h delete mode 100644 include/plan9/errno.h delete mode 100644 include/plan9/fmt.h delete mode 100644 include/plan9/libc.h delete mode 100644 include/plan9/link.h delete mode 100755 include/plan9/mklibc.rc delete mode 100644 include/plan9/stdarg.h delete mode 100644 include/plan9/utf.h delete mode 100644 include/u.h delete mode 100644 include/utf.h delete mode 100644 src/lib9/Makefile delete mode 100644 src/lib9/_exits.c delete mode 100644 src/lib9/_p9dir.c delete mode 100644 src/lib9/atoi.c delete mode 100644 src/lib9/await.c delete mode 100644 src/lib9/cleanname.c delete mode 100644 src/lib9/create.c delete mode 100644 src/lib9/ctime.c delete mode 100644 src/lib9/dirfstat.c delete mode 100644 src/lib9/dirfwstat.c delete mode 100644 src/lib9/dirstat.c delete mode 100644 src/lib9/dirwstat.c delete mode 100644 src/lib9/dup.c delete mode 100644 src/lib9/errstr.c delete mode 100644 src/lib9/exec.c delete mode 100644 src/lib9/execl.c delete mode 100644 src/lib9/exitcode.c delete mode 100644 src/lib9/exits.c delete mode 100644 src/lib9/flag.c delete mode 100644 src/lib9/fmt/charstod.c delete mode 100644 src/lib9/fmt/dofmt.c delete mode 100644 src/lib9/fmt/dorfmt.c delete mode 100644 src/lib9/fmt/errfmt.c delete mode 100644 src/lib9/fmt/fltfmt.c delete mode 100644 src/lib9/fmt/fmt.c delete mode 100644 src/lib9/fmt/fmtdef.h delete mode 100644 src/lib9/fmt/fmtfd.c delete mode 100644 src/lib9/fmt/fmtfdflush.c delete mode 100644 src/lib9/fmt/fmtlocale.c delete mode 100644 src/lib9/fmt/fmtlock.c delete mode 100644 src/lib9/fmt/fmtnull.c delete mode 100644 src/lib9/fmt/fmtprint.c delete mode 100644 src/lib9/fmt/fmtquote.c delete mode 100644 src/lib9/fmt/fmtrune.c delete mode 100644 src/lib9/fmt/fmtstr.c delete mode 100644 src/lib9/fmt/fmtvprint.c delete mode 100644 src/lib9/fmt/fprint.c delete mode 100644 src/lib9/fmt/nan64.c delete mode 100644 src/lib9/fmt/pow10.c delete mode 100644 src/lib9/fmt/print.c delete mode 100644 src/lib9/fmt/seprint.c delete mode 100644 src/lib9/fmt/smprint.c delete mode 100644 src/lib9/fmt/snprint.c delete mode 100644 src/lib9/fmt/sprint.c delete mode 100644 src/lib9/fmt/strtod.c delete mode 100644 src/lib9/fmt/test.c delete mode 100644 src/lib9/fmt/vfprint.c delete mode 100644 src/lib9/fmt/vseprint.c delete mode 100644 src/lib9/fmt/vsmprint.c delete mode 100644 src/lib9/fmt/vsnprint.c delete mode 100644 src/lib9/fmtlock2.c delete mode 100644 src/lib9/getenv.c delete mode 100644 src/lib9/getfields.c delete mode 100644 src/lib9/getwd.c delete mode 100644 src/lib9/goos.c delete mode 100644 src/lib9/jmp.c delete mode 100644 src/lib9/main.c delete mode 100644 src/lib9/math_darwin_arm.c delete mode 100644 src/lib9/nan.c delete mode 100644 src/lib9/notify.c delete mode 100644 src/lib9/nulldir.c delete mode 100644 src/lib9/open.c delete mode 100644 src/lib9/readn.c delete mode 100644 src/lib9/rfork.c delete mode 100644 src/lib9/run_plan9.c delete mode 100644 src/lib9/run_unix.c delete mode 100644 src/lib9/run_windows.c delete mode 100644 src/lib9/seek.c delete mode 100644 src/lib9/strecpy.c delete mode 100644 src/lib9/sysfatal.c delete mode 100644 src/lib9/tempdir_plan9.c delete mode 100644 src/lib9/tempdir_unix.c delete mode 100644 src/lib9/tempdir_windows.c delete mode 100644 src/lib9/time.c delete mode 100644 src/lib9/tokenize.c delete mode 100644 src/lib9/utf/Makefile delete mode 100644 src/lib9/utf/mkrunetype.c delete mode 100644 src/lib9/utf/rune.c delete mode 100644 src/lib9/utf/runetype.c delete mode 100644 src/lib9/utf/runetypebody-6.3.0.h delete mode 100644 src/lib9/utf/utf.h delete mode 100644 src/lib9/utf/utfdef.h delete mode 100644 src/lib9/utf/utfecpy.c delete mode 100644 src/lib9/utf/utflen.c delete mode 100644 src/lib9/utf/utfnlen.c delete mode 100644 src/lib9/utf/utfrrune.c delete mode 100644 src/lib9/utf/utfrune.c delete mode 100644 src/lib9/utf/utfutf.c delete mode 100644 src/lib9/win.h delete mode 100644 src/lib9/windows.c delete mode 100644 src/libbio/Makefile delete mode 100644 src/libbio/bbuffered.c delete mode 100644 src/libbio/bfildes.c delete mode 100644 src/libbio/bflush.c delete mode 100644 src/libbio/bgetc.c delete mode 100644 src/libbio/bgetd.c delete mode 100644 src/libbio/bgetrune.c delete mode 100644 src/libbio/binit.c delete mode 100644 src/libbio/boffset.c delete mode 100644 src/libbio/bprint.c delete mode 100644 src/libbio/bputc.c delete mode 100644 src/libbio/bputrune.c delete mode 100644 src/libbio/brdline.c delete mode 100644 src/libbio/brdstr.c delete mode 100644 src/libbio/bread.c delete mode 100644 src/libbio/bseek.c delete mode 100644 src/libbio/bwrite.c delete mode 100644 src/liblink/Makefile delete mode 100644 src/liblink/arch.c delete mode 100644 src/liblink/data.c delete mode 100644 src/liblink/go.c delete mode 100644 src/liblink/ld.c delete mode 100644 src/liblink/objfile.c delete mode 100644 src/liblink/pcln.c delete mode 100644 src/liblink/sym.c diff --git a/include/README b/include/README deleted file mode 100644 index b8fb5231a9..0000000000 --- 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 350941738c..0000000000 --- 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 "!\n" -#define ARFMAG "`\n" -/*c2go -char ARMAG[] = "!\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 982b881f16..0000000000 --- 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 2280f25250..0000000000 --- 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 -#include - -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 d82a19ccce..0000000000 --- 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 -#include - -/* - * 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 3df9b102c0..0000000000 --- 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 1c4076b5ea..0000000000 --- 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 c2d4999383..0000000000 --- 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 350941738c..0000000000 --- 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 "!\n" -#define ARFMAG "`\n" -/*c2go -char ARMAG[] = "!\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 19249aa480..0000000000 --- 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 13d5e0ef20..0000000000 --- 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 1ed572aced..0000000000 --- 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 b4a4fe7915..0000000000 --- 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 9a880505a4..0000000000 --- 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 f65971efce..0000000000 --- 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 449e15fdff..0000000000 --- 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 b562a3a6e8..0000000000 --- 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 03c26d69d0..0000000000 --- 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 6f857820de..0000000000 --- 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 - /* 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for tolower */ -#include - -#ifdef _WIN32 -#include -#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 -# if defined(__Linux26__) -# include -# define PLAN9PORT_USING_PTHREADS 1 -# endif -# if defined(__USE_MISC) -# undef _NEEDUSHORT -# undef _NEEDUINT -# undef _NEEDULONG -# endif -#elif defined(__sun__) -# include -# include -# define PLAN9PORT_USING_PTHREADS 1 -# undef _NEEDUSHORT -# undef _NEEDUINT -# undef _NEEDULONG -# define nil 0 /* no cast to void* */ -#elif defined(__FreeBSD__) -# include -# include -# if __FreeBSD_version >= 500000 -# define PLAN9PORT_USING_PTHREADS 1 -# include -# endif -# if !defined(_POSIX_SOURCE) -# undef _NEEDUSHORT -# undef _NEEDUINT -# endif -#elif defined(__APPLE__) -# include -# include -# 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 -# include -# undef _NEEDUSHORT -# undef _NEEDUINT -# undef _NEEDULONG -#elif defined(__OpenBSD__) -# include -# undef _NEEDUSHORT -# undef _NEEDUINT -# undef _NEEDULONG -#elif defined(_WIN32) -#else - /* No idea what system this is -- try some defaults */ -# include -# 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 be1c46e7f2..0000000000 --- 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 f21331055f..c13bace360 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 62aba5dca7..0000000000 --- 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 af55181b90..0000000000 --- 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 -#include - -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 6b5a04eadd..0000000000 --- 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 -#define NOPLAN9DEFINES -#include -#include -#include -#include - -/* - * 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 5b002df75e..0000000000 --- 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 -#include - -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 dfb155b243..0000000000 --- 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 -#include - -#include -#include -#include -#include -#include - -#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; imsg = (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 cb8fce6a5f..0000000000 --- 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 -#include - -/* - * 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 4ac7f7d619..0000000000 --- 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 -#define NOPLAN9DEFINES -#include -#include -#include -#include -#include -#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 e16ad4a5e5..0000000000 --- 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 -#include - -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 c092a2a072..0000000000 --- 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 -#define NOPLAN9DEFINES -#include - -#include - -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 4666e21079..0000000000 --- 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 -#include -#include -#include - -#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 33f0d7cf26..0000000000 --- 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 -#define NOPLAN9DEFINES -#include - -#include - -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 22e25fff7b..0000000000 --- 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 -#define NOPLAN9DEFINES -#include -#include -#include - -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 5cac831d68..0000000000 --- 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 -#include - -#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 9d919755d1..0000000000 --- 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 -#include -#include - -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 8e5fc57848..0000000000 --- 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 -#include - -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 fd4d23daaf..0000000000 --- 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 -#include - -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 fc863445f5..0000000000 --- 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 -#include - -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 0be7cb9f10..0000000000 --- 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 -#include - -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 db46b98095..0000000000 --- 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 -#include - -// 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 b8096e8fba..0000000000 --- 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 -#include -#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 3b9dc36121..0000000000 --- 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 -#include -#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, "", 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; jprec && s[i]; j++) - i += chartorune(&r, s+i); -#else - /* ANSI requires precision in bytes, not Runes */ - for(i=0; iprec; 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, "", 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 f760d47e5e..0000000000 --- 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 -#include -#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 a86709398e..0000000000 --- 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 -#include -#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 6fe8192211..0000000000 --- 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 -#include -#include -#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 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 7e576773b0..0000000000 --- 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 -#include -#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; pc == 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; pc == 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 4bbd9f5781..0000000000 --- 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 dde05b7a5e..0000000000 --- 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 -#include -#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 401acbea73..0000000000 --- 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 -#include -#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 64ed10f7b9..0000000000 --- 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 -#include -#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 297acd8f92..0000000000 --- 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 -#include -#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 b8caacbf7b..0000000000 --- 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 -#include -#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 6848ab4ebb..0000000000 --- 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 -#include -#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 93b2abbe79..0000000000 --- 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 -#include -#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*)"", 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 2bc8d28e6f..0000000000 --- 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 -#include -#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 a6ca7721d0..0000000000 --- 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 -#include -#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 f18d27bbad..0000000000 --- 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 -#include -#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 70cb1385a4..0000000000 --- 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 -#include -#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 1ea702741e..0000000000 --- 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 -#include -#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 e146884a8f..0000000000 --- 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 -#include -#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 5c39457d6d..0000000000 --- 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 -#include -#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 88779d90ad..0000000000 --- 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 -#include -#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 c13ffd7ddc..0000000000 --- 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 -#include -#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 372399c448..0000000000 --- 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 -#include -#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 02655ad123..0000000000 --- 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 -#include -#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 ec185d2d5f..0000000000 --- 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 -#include -#include -#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<>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>= 1; - } - frnorm(mid); - - /* compare */ - c = fpcmp(a, mid); - if(c > 0) { - c = 1; - for(i=0; i= 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; i0; 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> 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 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; - n -= c<= (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<= (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 d82ff78baf..0000000000 --- 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 -#include -#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 a23c5a0c65..0000000000 --- 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 -#include -#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 c9fbfb9560..0000000000 --- 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 -#include -#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 46086f9e28..0000000000 --- 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 -#include -#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 6b3877205e..0000000000 --- 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 -#include -#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 a0e2636ec8..0000000000 --- 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 -#include - -void -__fmtlock(void) -{ -} - -void -__fmtunlock(void) -{ -} diff --git a/src/lib9/getenv.c b/src/lib9/getenv.c deleted file mode 100644 index 2454b6b416..0000000000 --- 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 -#define NOPLAN9DEFINES -#include - -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 0af8388da8..0000000000 --- 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 -#include - -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 03a8ff1a2f..0000000000 --- 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 -#include -#include -#define NOPLAN9DEFINES -#include - -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 68b94d6114..0000000000 --- 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 -#include - -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 733ed70e96..0000000000 --- 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 -#define NOPLAN9DEFINES -#include - -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 088b09523c..0000000000 --- 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 -#define NOPLAN9DEFINES -#include - -#ifdef WIN32 -#include - -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 ff5b0ce07a..0000000000 --- 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 - -// 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 f17b441aae..0000000000 --- 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 -#include -#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 7843d34713..0000000000 --- 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 -#include -#define NOPLAN9DEFINES -#include - -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; ib)){ - 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; isig) != SIG_DFL) - continue; - notifyseton(sig->sig, 1); - } -} - diff --git a/src/lib9/nulldir.c b/src/lib9/nulldir.c deleted file mode 100644 index 2157ff313d..0000000000 --- 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 -#include - -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 7f53c8ea64..0000000000 --- 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 -#define NOPLAN9DEFINES -#include -#include -#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 7dfe9e515d..0000000000 --- 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 -#include - -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 23b3ee6719..0000000000 --- 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 -#include -#include -#include -#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 29932626dc..0000000000 --- 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 -#include - -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 1acaefed87..0000000000 --- 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 -#include -#include -#define NOPLAN9DEFINES -#include - -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 e3e1c25710..0000000000 --- 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 -#include -#define NOPLAN9DEFINES -#include -#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 -#include - -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 4b2b92b43d..0000000000 --- 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 -#include - -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 9789061a88..0000000000 --- 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 -#include - -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 : "", buf); - exits("fatal"); -} - diff --git a/src/lib9/tempdir_plan9.c b/src/lib9/tempdir_plan9.c deleted file mode 100644 index 80d7ddbe4b..0000000000 --- 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 -#include - -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 -#include -#include -#define NOPLAN9DEFINES -#include - -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 4c3df7cf11..0000000000 --- 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 -#include -#include -#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 -#include -#include -#ifndef _WIN32 -#include -#endif -#define NOPLAN9DEFINES -#include - -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 a9b5935670..0000000000 --- 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 -#include - -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_$@ - 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 01eb6b6ec5..0000000000 --- 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 -#include -#include -#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] \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