commit df121a0027e6dc08abe6fc907c9af2593a263c17 from: rsc date: Sun Dec 26 23:07:37 2004 UTC import changes from plan 9 commit - a76c0fd4a9a9a9a64893db614dd146a5819a6e0c commit + df121a0027e6dc08abe6fc907c9af2593a263c17 blob - 824253bc5bcb33200501ba08ee4d945e33103350 blob + 1db97738624e57f2fdb6258a18b869702967ecd5 --- src/lib9/fmt/dofmt.c +++ src/lib9/fmt/dofmt.c @@ -526,11 +526,9 @@ __flagfmt(Fmt *f) f->flags |= FmtByte; f->flags |= FmtShort; break; -#ifndef PLAN9PORT case 'L': f->flags |= FmtLDouble; break; -#endif case 'l': if(f->flags & FmtLong) f->flags |= FmtVLong; blob - 90b86c10068fd08a13699fa684267759b6071860 blob + 57839ce914f9b14cdac1fe1a9e551a6f5a3ae0c3 --- src/lib9/fmt/fltfmt.c +++ src/lib9/fmt/fltfmt.c @@ -371,39 +371,6 @@ found: } static int -fmtzdotpad(Fmt *f, int n, int pt) -{ - char *t, *s; - int i; - Rune *rt, *rs; - - if(f->runes){ - rt = (Rune*)f->to; - rs = (Rune*)f->stop; - for(i = 0; i < n; i++){ - if(i == pt){ - FMTRCHAR(f, rt, rs, '.'); - } - FMTRCHAR(f, rt, rs, '0'); - } - f->nfmt += rt - (Rune*)f->to; - f->to = rt; - }else{ - t = (char*)f->to; - s = (char*)f->stop; - for(i = 0; i < n; i++){ - if(i == pt){ - FMTCHAR(f, t, s, '.'); - } - FMTCHAR(f, t, s, '0'); - } - f->nfmt += t - (char *)f->to; - f->to = t; - } - return 0; -} - -static int floatfmt(Fmt *fmt, double f) { char s[FDIGIT+10]; blob - f9d8328d45c8dcb8d85e2918be47d58557343f99 blob + f785d48e2daadb546f3f7f9dfdb3f72adb3b3ff6 --- src/lib9/fmt/fmt.c +++ src/lib9/fmt/fmt.c @@ -45,9 +45,13 @@ static Convfmt knownfmt[] = { '-', __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 */ @@ -57,7 +61,9 @@ static Convfmt knownfmt[] = { 'f', __efgfmt, 'g', __efgfmt, 'h', __flagfmt, +#ifndef PLAN9PORT 'i', __ifmt, /* ANSI only */ +#endif 'l', __flagfmt, 'n', __countfmt, 'o', __ifmt, blob - bfb2aa976be2c61443330f572bedd08fef51e712 blob + 5a63f9be9b7f50cfb0dcaf8fd3efe8c976c4a8ff --- src/lib9/fmt/fmtdef.h +++ src/lib9/fmt/fmtdef.h @@ -105,3 +105,12 @@ int __strfmt(Fmt *f); 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 + blob - 7501ce41619d30b0bc5b10091884636c82fd722d blob + 0ab5a16cb78773dff39ed6250b02349adca97e5e --- src/lib9/fmt/fmtlock.c +++ src/lib9/fmt/fmtlock.c @@ -19,11 +19,9 @@ void __fmtlock(void) { - ; } void __fmtunlock(void) { - ; } blob - 7044d5bd41740892398a4b11091b1cd9515c6528 blob + 84a74c8a13864186cd15d268a6077c80c5a9c90a --- src/lib9/fmt/fmtprint.c +++ src/lib9/fmt/fmtprint.c @@ -17,7 +17,6 @@ #include "fmt.h" #include "fmtdef.h" - /* * format a string into the output buffer * designed for formats which themselves call fmt, @@ -32,15 +31,16 @@ fmtprint(Fmt *f, char *fmt, ...) f->flags = 0; f->width = 0; f->prec = 0; - va_copy(va, f->args); + VA_COPY(va, f->args); + VA_END(f->args); va_start(f->args, fmt); n = dofmt(f, fmt); va_end(f->args); f->flags = 0; f->width = 0; f->prec = 0; - va_copy(f->args,va); - va_end(va); + VA_COPY(f->args,va); + VA_END(va); if(n >= 0) return 0; return n; blob - b8f00c18812afc36e67a3d5966fdacfa9af31296 blob + 7d659a5a5748fc632fed817a9f7ca162464ba1e9 --- src/lib9/fmt/fmtquote.c +++ src/lib9/fmt/fmtquote.c @@ -48,7 +48,7 @@ __quotesetup(char *s, Rune *r, int nin, int nout, Quot q->nbytesout = 2; q->nrunesout = 2; } - for(; nin!=0; nin-=w){ + for(; nin!=0; nin--){ if(s) w = chartorune(&c, s); else{ @@ -183,12 +183,14 @@ qstrfmt(char *sin, Rune *rin, Quoteinfo *q, Fmt *f) int __quotestrfmt(int runesin, Fmt *f) { - int outlen; + int nin, outlen; Rune *r; char *s; Quoteinfo q; - f->flags &= ~FmtPrec; /* ignored for %q %Q, so disable for %s %S in easy case */ + nin = -1; + if(f->flags&FmtPrec) + nin = f->prec; if(runesin){ r = va_arg(f->args, Rune *); s = nil; @@ -206,7 +208,7 @@ __quotestrfmt(int runesin, Fmt *f) else outlen = (char*)f->stop - (char*)f->to; - __quotesetup(s, r, -1, outlen, &q, f->flags&FmtSharp, f->runes); + __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){ blob - b4b6818548d03766cfde943597c8130aff83e5a2 blob + 8568b5d517f4b3837891af2c4eb0febfa5be59a7 --- src/lib9/fmt/fmtstr.c +++ src/lib9/fmt/fmtstr.c @@ -11,63 +11,17 @@ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ -/* - * Plan 9 port version must include libc.h in order to - * get Plan 9 debugging malloc, which sometimes returns - * different pointers than the standard malloc. - */ -#ifdef PLAN9PORT -#include -#include -#else #include +#include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" -#endif -static int -fmtStrFlush(Fmt *f) -{ - char *s; - int n; - - n = (int)f->farg; - n += 256; - f->farg = (void*)n; - s = (char*)f->start; - f->start = realloc(s, n); - if(f->start == nil){ - f->start = s; - return 0; - } - f->to = (char*)f->start + ((char*)f->to - s); - f->stop = (char*)f->start + n - 1; - return 1; -} - -int -fmtstrinit(Fmt *f) -{ - int n; - - f->runes = 0; - n = 32; - f->start = malloc(n); - if(f->start == nil) - return -1; - f->to = f->start; - f->stop = (char*)f->start + n - 1; - f->flush = fmtStrFlush; - f->farg = (void*)n; - f->nfmt = 0; - return 0; -} - char* fmtstrflush(Fmt *f) { + if(f->start == nil) + return nil; *(char*)f->to = '\0'; - f->to = f->start; return (char*)f->start; } blob - d1176a50dd06b8ce385cb029116bf46ac984b067 blob + 013314c2bb301556368336736a5751e1acd99eea --- src/lib9/fmt/fmtvprint.c +++ src/lib9/fmt/fmtvprint.c @@ -32,15 +32,16 @@ fmtvprint(Fmt *f, char *fmt, va_list args) f->flags = 0; f->width = 0; f->prec = 0; - va_copy(va,f->args); - va_copy(f->args,args); + VA_COPY(va,f->args); + VA_END(f->args); + VA_COPY(f->args,args); n = dofmt(f, fmt); f->flags = 0; f->width = 0; f->prec = 0; - va_end(f->args); - va_copy(f->args,va); - va_end(va); + VA_END(f->args); + VA_COPY(f->args,va); + VA_END(va); if(n >= 0) return 0; return n; blob - 533763952be5a8841c07eb0dc3b99a1c2a8e7f11 blob + b7ff3b5aefa25134a8958b99d51ef8506c99cd27 --- src/lib9/fmt/runefmtstr.c +++ src/lib9/fmt/runefmtstr.c @@ -11,63 +11,17 @@ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ -/* - * Plan 9 port version must include libc.h in order to - * get Plan 9 debugging malloc, which sometimes returns - * different pointers than the standard malloc. - */ -#ifdef PLAN9PORT -#include -#include -#else +#include #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" -#endif -static int -runeFmtStrFlush(Fmt *f) -{ - Rune *s; - int n; - - n = (int)f->farg; - n += 256; - f->farg = (void*)n; - s = (Rune*)f->start; - f->start = realloc(s, sizeof(Rune)*n); - if(f->start == nil){ - f->start = s; - return 0; - } - f->to = (Rune*)f->start + ((Rune*)f->to - s); - f->stop = (Rune*)f->start + n - 1; - return 1; -} - -int -runefmtstrinit(Fmt *f) -{ - int n; - - f->runes = 1; - n = 32; - f->start = malloc(sizeof(Rune)*n); - if(f->start == nil) - return -1; - f->to = f->start; - f->stop = (Rune*)f->start + n - 1; - f->flush = runeFmtStrFlush; - f->farg = (void*)n; - f->nfmt = 0; - return 0; -} - Rune* runefmtstrflush(Fmt *f) { + if(f->start == nil) + return nil; *(Rune*)f->to = '\0'; - f->to = f->start; return f->start; } blob - 72f7e1b0a0fc89f33ec9193b0aca84ca004d16cf blob + 1e69f1b462a1d56a22cb14482907427b4d477728 --- src/lib9/fmt/runevseprint.c +++ src/lib9/fmt/runevseprint.c @@ -31,9 +31,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list ar f.flush = nil; f.farg = nil; f.nfmt = 0; - va_copy(f.args,args); + VA_COPY(f.args,args); dofmt(&f, fmt); - va_end(f.args); + VA_END(f.args); *(Rune*)f.to = '\0'; return (Rune*)f.to; } blob - 988e5c021ad660b04acf73073cf53087025dcf42 blob + d1b25f300d680c3be90544e53b1791f674670885 --- src/lib9/fmt/runevsmprint.c +++ src/lib9/fmt/runevsmprint.c @@ -11,12 +11,65 @@ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ -#include +/* + * Plan 9 port version must include libc.h in order to + * get Plan 9 debugging malloc, which sometimes returns + * different pointers than the standard malloc. + */ +#ifdef PLAN9PORT +#include +#include +#else #include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" +#endif +static int +runeFmtStrFlush(Fmt *f) +{ + Rune *s; + int n; + + if(f->start == nil) + return 0; + n = (int)f->farg; + n *= 2; + s = (Rune*)f->start; + f->start = realloc(s, sizeof(Rune)*n); + if(f->start == nil){ + f->farg = nil; + f->to = nil; + f->stop = nil; + free(s); + return 0; + } + f->farg = (void*)n; + f->to = (Rune*)f->start + ((Rune*)f->to - s); + f->stop = (Rune*)f->start + n - 1; + return 1; +} + +int +runefmtstrinit(Fmt *f) +{ + int n; + + memset(f, 0, sizeof *f); + f->runes = 1; + n = 32; + f->start = malloc(sizeof(Rune)*n); + if(f->start == nil) + return -1; + f->to = f->start; + f->stop = (Rune*)f->start + n - 1; + f->flush = runeFmtStrFlush; + f->farg = (void*)n; + f->nfmt = 0; + return 0; +} + /* * print into an allocated string buffer */ @@ -28,11 +81,15 @@ runevsmprint(char *fmt, va_list args) if(runefmtstrinit(&f) < 0) return nil; - va_copy(f.args,args); + VA_COPY(f.args,args); n = dofmt(&f, fmt); - va_end(f.args); - if(n < 0) + VA_END(f.args); + if(f.start == nil) return nil; + if(n < 0){ + free(f.start); + return nil; + } *(Rune*)f.to = '\0'; return (Rune*)f.start; } blob - 8aff7345a35c7f6b5e9ba645d508ff5345e81aea blob + 120f5168ac5b7a0db75868fd96d3051a79dcbf69 --- src/lib9/fmt/runevsnprint.c +++ src/lib9/fmt/runevsnprint.c @@ -31,9 +31,9 @@ runevsnprint(Rune *buf, int len, char *fmt, va_list ar f.flush = nil; f.farg = nil; f.nfmt = 0; - va_copy(f.args,args); + VA_COPY(f.args,args); dofmt(&f, fmt); - va_end(f.args); + VA_END(f.args); *(Rune*)f.to = '\0'; return (Rune*)f.to - buf; } blob - 650f0f559c50326cb655ef00c9d327684bf2e747 blob + d66377ed622c0cb6eec0b3a5e5056c24b05a874e --- src/lib9/fmt/test.c +++ src/lib9/fmt/test.c @@ -11,6 +11,7 @@ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ +#include #include #include #include "plan9.h" @@ -32,10 +33,12 @@ main(int argc, char *argv[]) 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 %.18\n", 2e25, 2e25); + 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); return 0; } blob - 1df47477406e4d50ef441ad34928b4ea2fef57cf blob + 3b0262025fcae121d5c42f4ba6993672891fffa6 --- src/lib9/fmt/vfprint.c +++ src/lib9/fmt/vfprint.c @@ -24,9 +24,9 @@ vfprint(int fd, char *fmt, va_list args) int n; fmtfdinit(&f, fd, buf, sizeof(buf)); - va_copy(f.args,args); + VA_COPY(f.args,args); n = dofmt(&f, fmt); - va_end(f.args); + VA_END(f.args); if(n > 0 && __fmtFdFlush(&f) == 0) return -1; return n; blob - 9eb674ac4a07a346ed61c138120592ed0263f2e2 blob + c7c41ab4992111d49b9548b86b725d2ac1f15e7e --- src/lib9/fmt/vseprint.c +++ src/lib9/fmt/vseprint.c @@ -30,9 +30,9 @@ vseprint(char *buf, char *e, char *fmt, va_list args) f.flush = 0; f.farg = nil; f.nfmt = 0; - va_copy(f.args,args); + VA_COPY(f.args,args); dofmt(&f, fmt); - va_end(f.args); + VA_END(f.args); *(char*)f.to = '\0'; return (char*)f.to; } blob - 871531ee3d098d56ca9df1a98ad0315ba002b63d blob + b6cf187cd5127a5c038791b94999288717b32dfa --- src/lib9/fmt/vsmprint.c +++ src/lib9/fmt/vsmprint.c @@ -11,12 +11,65 @@ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. */ +/* + * Plan 9 port version must include libc.h in order to + * get Plan 9 debugging malloc, which sometimes returns + * different pointers than the standard malloc. + */ +#ifdef PLAN9PORT +#include +#include +#else #include -#include #include "plan9.h" #include "fmt.h" #include "fmtdef.h" +#endif +static int +fmtStrFlush(Fmt *f) +{ + char *s; + int n; + + if(f->start == nil) + return 0; + n = (int)f->farg; + n *= 2; + s = (char*)f->start; + f->start = realloc(s, n); + if(f->start == nil){ + f->farg = nil; + f->to = nil; + f->stop = nil; + free(s); + return 0; + } + f->farg = (void*)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(n); + if(f->start == nil) + return -1; + f->to = f->start; + f->stop = (char*)f->start + n - 1; + f->flush = fmtStrFlush; + f->farg = (void*)n; + f->nfmt = 0; + return 0; +} + /* * print into an allocated string buffer */ @@ -28,10 +81,12 @@ vsmprint(char *fmt, va_list args) if(fmtstrinit(&f) < 0) return nil; - va_copy(f.args,args); + VA_COPY(f.args,args); n = dofmt(&f, fmt); - va_end(f.args); - if(n < 0) + VA_END(f.args); + if(n < 0){ + free(f.start); return nil; + } return fmtstrflush(&f); } blob - ec05d48a2c099fb71579f8061943ffaed2c2977b blob + 8061f0d72d855669c91c3d75b173cd29979d3717 --- src/lib9/fmt/vsnprint.c +++ src/lib9/fmt/vsnprint.c @@ -31,9 +31,9 @@ vsnprint(char *buf, int len, char *fmt, va_list args) f.flush = 0; f.farg = nil; f.nfmt = 0; - va_copy(f.args,args); + VA_COPY(f.args,args); dofmt(&f, fmt); - va_end(f.args); + VA_END(f.args); *(char*)f.to = '\0'; return (char*)f.to - buf; }