ref: 001d391fa75a1bb098be4306334b2df501eff4be
parent: c0c120e2d18d6636e2c66ff640c17035817d2978
author: Russ Cox <rsc@swtch.com>
date: Tue Jan 17 07:37:52 EST 2006
updates from p9p
--- a/libc/charstod.c
+++ b/libc/charstod.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
/*
* Reads a floating-point number by interpreting successive characters
@@ -8,74 +24,62 @@
* necessary to back up the input stream up one byte after calling charstod.
*/
-#define ADVANCE *s++ = c; if(s>=e) return __NaN(); c = (*f)(vp)
-
double
-charstod(int(*f)(void*), void *vp)
+fmtcharstod(int(*f)(void*), void *vp)
{
- char str[400], *s, *e, *start;
- int c;
+ double num, dem;
+ int neg, eneg, dig, exp, c;
- s = str;
- e = str + sizeof str - 1;
+ num = 0;
+ neg = 0;
+ dig = 0;
+ exp = 0;
+ eneg = 0;
+
c = (*f)(vp);
while(c == ' ' || c == '\t')
c = (*f)(vp);
if(c == '-' || c == '+'){
- ADVANCE;
+ if(c == '-')
+ neg = 1;
+ c = (*f)(vp);
}
- start = s;
while(c >= '0' && c <= '9'){
- ADVANCE;
+ num = num*10 + c-'0';
+ c = (*f)(vp);
}
- if(c == '.'){
- ADVANCE;
- while(c >= '0' && c <= '9'){
- ADVANCE;
- }
+ if(c == '.')
+ c = (*f)(vp);
+ while(c >= '0' && c <= '9'){
+ num = num*10 + c-'0';
+ dig++;
+ c = (*f)(vp);
}
- if(s > start && (c == 'e' || c == 'E')){
- ADVANCE;
+ if(c == 'e' || c == 'E'){
+ c = (*f)(vp);
if(c == '-' || c == '+'){
- ADVANCE;
+ if(c == '-'){
+ dig = -dig;
+ eneg = 1;
+ }
+ c = (*f)(vp);
}
while(c >= '0' && c <= '9'){
- ADVANCE;
+ exp = exp*10 + c-'0';
+ c = (*f)(vp);
}
- }else if(s == start && (c == 'i' || c == 'I')){
- ADVANCE;
- if(c != 'n' && c != 'N')
- return __NaN();
- ADVANCE;
- if(c != 'f' && c != 'F')
- return __NaN();
- ADVANCE;
- if(c != 'i' && c != 'I')
- return __NaN();
- ADVANCE;
- if(c != 'n' && c != 'N')
- return __NaN();
- ADVANCE;
- if(c != 'i' && c != 'I')
- return __NaN();
- ADVANCE;
- if(c != 't' && c != 'T')
- return __NaN();
- ADVANCE;
- if(c != 'y' && c != 'Y')
- return __NaN();
- ADVANCE; /* so caller can back up uniformly */
- USED(c);
- }else if(s == str && (c == 'n' || c == 'N')){
- ADVANCE;
- if(c != 'a' && c != 'A')
- return __NaN();
- ADVANCE;
- if(c != 'n' && c != 'N')
- return __NaN();
- ADVANCE; /* so caller can back up uniformly */
- USED(c);
}
- *s = 0;
- return strtod(str, &s);
+ 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;
}
--- a/libc/dofmt.c
+++ b/libc/dofmt.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
/* format the output into f->to and return the number of characters fmted */
@@ -14,8 +29,8 @@
nfmt = f->nfmt;
for(;;){
if(f->runes){
- rt = f->to;
- rs = f->stop;
+ rt = (Rune*)f->to;
+ rs = (Rune*)f->stop;
while((r = *(uchar*)fmt) && r != '%'){
if(r < Runeself)
fmt++;
@@ -32,8 +47,8 @@
return f->nfmt - nfmt;
f->stop = rs;
}else{
- t = f->to;
- s = f->stop;
+ t = (char*)f->to;
+ s = (char*)f->stop;
while((r = *(uchar*)fmt) && r != '%'){
if(r < Runeself){
FMTCHAR(f, t, s, r);
@@ -41,9 +56,9 @@
}else{
n = chartorune(&rune, fmt);
if(t + n > s){
- t = _fmtflush(f, t, n);
+ t = (char*)__fmtflush(f, t, n);
if(t != nil)
- s = f->stop;
+ s = (char*)f->stop;
else
return -1;
}
@@ -59,15 +74,14 @@
f->stop = s;
}
- fmt = _fmtdispatch(f, fmt, 0);
+ fmt = (char*)__fmtdispatch(f, fmt, 0);
if(fmt == nil)
return -1;
}
- return 0; /* not reached */
}
void *
-_fmtflush(Fmt *f, void *t, int len)
+__fmtflush(Fmt *f, void *t, int len)
{
if(f->runes)
f->nfmt += (Rune*)t - (Rune*)f->to;
@@ -86,13 +100,13 @@
* left/right justified in a field of at least f->width charactes
*/
int
-_fmtpad(Fmt *f, int n)
+__fmtpad(Fmt *f, int n)
{
char *t, *s;
int i;
- t = f->to;
- s = f->stop;
+ t = (char*)f->to;
+ s = (char*)f->stop;
for(i = 0; i < n; i++)
FMTCHAR(f, t, s, ' ');
f->nfmt += t - (char *)f->to;
@@ -101,13 +115,13 @@
}
int
-_rfmtpad(Fmt *f, int n)
+__rfmtpad(Fmt *f, int n)
{
Rune *t, *s;
int i;
- t = f->to;
- s = f->stop;
+ t = (Rune*)f->to;
+ s = (Rune*)f->stop;
for(i = 0; i < n; i++)
FMTRCHAR(f, t, s, ' ');
f->nfmt += t - (Rune *)f->to;
@@ -116,7 +130,7 @@
}
int
-_fmtcpy(Fmt *f, void *vm, int n, int sz)
+__fmtcpy(Fmt *f, const void *vm, int n, int sz)
{
Rune *rt, *rs, r;
char *t, *s, *m, *me;
@@ -123,7 +137,7 @@
ulong fl;
int nc, w;
- m = vm;
+ m = (char*)vm;
me = m + sz;
w = f->width;
fl = f->flags;
@@ -130,10 +144,10 @@
if((fl & FmtPrec) && n > f->prec)
n = f->prec;
if(f->runes){
- if(!(fl & FmtLeft) && _rfmtpad(f, w - n) < 0)
+ if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
return -1;
- rt = f->to;
- rs = f->stop;
+ rt = (Rune*)f->to;
+ rs = (Rune*)f->stop;
for(nc = n; nc > 0; nc--){
r = *(uchar*)m;
if(r < Runeself)
@@ -146,15 +160,13 @@
}
f->nfmt += rt - (Rune *)f->to;
f->to = rt;
- if(m < me)
+ if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
return -1;
- if(fl & FmtLeft && _rfmtpad(f, w - n) < 0)
- return -1;
}else{
- if(!(fl & FmtLeft) && _fmtpad(f, w - n) < 0)
+ if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
return -1;
- t = f->to;
- s = f->stop;
+ t = (char*)f->to;
+ s = (char*)f->stop;
for(nc = n; nc > 0; nc--){
r = *(uchar*)m;
if(r < Runeself)
@@ -167,7 +179,7 @@
}
f->nfmt += t - (char *)f->to;
f->to = t;
- if(fl & FmtLeft && _fmtpad(f, w - n) < 0)
+ if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
return -1;
}
return 0;
@@ -174,7 +186,7 @@
}
int
-_fmtrcpy(Fmt *f, void *vm, int n)
+__fmtrcpy(Fmt *f, const void *vm, int n)
{
Rune r, *m, *me, *rt, *rs;
char *t, *s;
@@ -181,27 +193,27 @@
ulong fl;
int w;
- m = vm;
+ m = (Rune*)vm;
w = f->width;
fl = f->flags;
if((fl & FmtPrec) && n > f->prec)
n = f->prec;
if(f->runes){
- if(!(fl & FmtLeft) && _rfmtpad(f, w - n) < 0)
+ if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
return -1;
- rt = f->to;
- rs = f->stop;
+ rt = (Rune*)f->to;
+ rs = (Rune*)f->stop;
for(me = m + n; m < me; m++)
FMTRCHAR(f, rt, rs, *m);
f->nfmt += rt - (Rune *)f->to;
f->to = rt;
- if(fl & FmtLeft && _rfmtpad(f, w - n) < 0)
+ if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
return -1;
}else{
- if(!(fl & FmtLeft) && _fmtpad(f, w - n) < 0)
+ if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
return -1;
- t = f->to;
- s = f->stop;
+ t = (char*)f->to;
+ s = (char*)f->stop;
for(me = m + n; m < me; m++){
r = *m;
FMTRUNE(f, t, s, r);
@@ -208,7 +220,7 @@
}
f->nfmt += t - (char *)f->to;
f->to = t;
- if(fl & FmtLeft && _fmtpad(f, w - n) < 0)
+ if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
return -1;
}
return 0;
@@ -216,23 +228,23 @@
/* fmt out one character */
int
-_charfmt(Fmt *f)
+__charfmt(Fmt *f)
{
char x[1];
x[0] = va_arg(f->args, int);
f->prec = 1;
- return _fmtcpy(f, x, 1, 1);
+ return __fmtcpy(f, (const char*)x, 1, 1);
}
/* fmt out one rune */
int
-_runefmt(Fmt *f)
+__runefmt(Fmt *f)
{
Rune x[1];
x[0] = va_arg(f->args, int);
- return _fmtrcpy(f, x, 1);
+ return __fmtrcpy(f, (const void*)x, 1);
}
/* public helper routine: fmt out a null terminated string already in hand */
@@ -239,24 +251,24 @@
int
fmtstrcpy(Fmt *f, char *s)
{
- int p, i;
+ int i, j;
+ Rune r;
+
if(!s)
- return _fmtcpy(f, "<nil>", 5, 5);
+ return __fmtcpy(f, "<nil>", 5, 5);
/* if precision is specified, make sure we don't wander off the end */
if(f->flags & FmtPrec){
- p = f->prec;
- for(i = 0; i < p; i++)
- if(s[i] == 0)
- break;
- return _fmtcpy(f, s, utfnlen(s, i), i); /* BUG?: won't print a partial rune at end */
+ i = 0;
+ for(j=0; j<f->prec && s[i]; j++)
+ i += chartorune(&r, s+i);
+ return __fmtcpy(f, s, j, i);
}
-
- return _fmtcpy(f, s, utflen(s), strlen(s));
+ return __fmtcpy(f, s, utflen(s), strlen(s));
}
/* fmt out a null terminated utf string */
int
-_strfmt(Fmt *f)
+__strfmt(Fmt *f)
{
char *s;
@@ -272,7 +284,7 @@
int n, p;
if(!s)
- return _fmtcpy(f, "<nil>", 5, 5);
+ return __fmtcpy(f, "<nil>", 5, 5);
/* if precision is specified, make sure we don't wander off the end */
if(f->flags & FmtPrec){
p = f->prec;
@@ -284,12 +296,12 @@
;
n = e - s;
}
- return _fmtrcpy(f, s, n);
+ return __fmtrcpy(f, s, n);
}
/* fmt out a null terminated rune string */
int
-_runesfmt(Fmt *f)
+__runesfmt(Fmt *f)
{
Rune *s;
@@ -299,18 +311,18 @@
/* fmt a % */
int
-_percentfmt(Fmt *f)
+__percentfmt(Fmt *f)
{
Rune x[1];
x[0] = f->r;
f->prec = 1;
- return _fmtrcpy(f, x, 1);
+ return __fmtrcpy(f, (const void*)x, 1);
}
/* fmt an integer */
int
-_ifmt(Fmt *f)
+__ifmt(Fmt *f)
{
char buf[70], *p, *conv;
uvlong vu;
@@ -322,6 +334,21 @@
isv = 0;
vu = 0;
u = 0;
+#ifndef PLAN9PORT
+ /*
+ * Unsigned verbs for ANSI C
+ */
+ switch(f->r){
+ case 'x':
+ case 'X':
+ case 'o':
+ case 'u':
+ case 'p':
+ fl |= FmtUnsigned;
+ fl &= ~(FmtSign|FmtSpace);
+ break;
+ }
+#endif
if(f->r == 'p'){
u = (ulong)va_arg(f->args, void*);
f->r = 'x';
@@ -356,6 +383,8 @@
conv = "0123456789abcdef";
switch(f->r){
case 'd':
+ case 'i':
+ case 'u':
base = 10;
break;
case 'x':
@@ -426,7 +455,7 @@
n++;
}
}
- if((fl & FmtZero) && !(fl & FmtLeft)){
+ if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){
for(w = f->width; n < w && p > buf+3; n++)
*p-- = '0';
f->width = 0;
@@ -444,11 +473,11 @@
else if(fl & FmtSpace)
*p-- = ' ';
f->flags &= ~FmtPrec;
- return _fmtcpy(f, p + 1, n, n);
+ return __fmtcpy(f, p + 1, n, n);
}
int
-_countfmt(Fmt *f)
+__countfmt(Fmt *f)
{
void *p;
ulong fl;
@@ -470,7 +499,7 @@
}
int
-_flagfmt(Fmt *f)
+__flagfmt(Fmt *f)
{
switch(f->r){
case ',':
@@ -496,6 +525,9 @@
f->flags |= FmtByte;
f->flags |= FmtShort;
break;
+ case 'L':
+ f->flags |= FmtLDouble;
+ break;
case 'l':
if(f->flags & FmtLong)
f->flags |= FmtVLong;
@@ -507,7 +539,7 @@
/* default error format */
int
-_badfmt(Fmt *f)
+__badfmt(Fmt *f)
{
char x[3];
@@ -515,6 +547,6 @@
x[1] = f->r;
x[2] = '%';
f->prec = 3;
- _fmtcpy(f, x, 3, 3);
+ __fmtcpy(f, (const void*)x, 3, 3);
return 0;
}
--- a/libc/dorfmt.c
+++ b/libc/dorfmt.c
@@ -1,11 +1,26 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
/* format the output into f->to and return the number of characters fmted */
int
-dorfmt(Fmt *f, Rune *fmt)
+dorfmt(Fmt *f, const Rune *fmt)
{
Rune *rt, *rs;
int r;
@@ -38,7 +53,7 @@
f->stop = s;
}
- fmt = _fmtdispatch(f, fmt, 1);
+ fmt = __fmtdispatch(f, (Rune*)fmt, 1);
if(fmt == nil)
return -1;
}
--- a/libc/errfmt.c
+++ b/libc/errfmt.c
@@ -1,12 +1,28 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <errno.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
int
-errfmt(Fmt *f)
+__errfmt(Fmt *f)
{
- char buf[ERRMAX];
+ char *s;
- rerrstr(buf, sizeof buf);
- return _fmtcpy(f, buf, utflen(buf), strlen(buf));
+ s = strerror(errno);
+ return fmtstrcpy(f, s);
}
--- a/libc/fltfmt.c
+++ b/libc/fltfmt.c
@@ -1,6 +1,27 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * 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 <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdarg.h>
#include <ctype.h>
+#include <fmt.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
enum
@@ -7,9 +28,70 @@
{
FDIGIT = 30,
FDEFLT = 6,
- NSIGNIF = 17,
+ 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,
+};
+
+#define pow10(x) fmtpow10(x)
+
+static double
+pow10(int n)
+{
+ double d;
+ int neg;
+
+ neg = 0;
+ if(n < 0){
+ if(n < DBL_MIN_10_EXP){
+ return 0.;
+ }
+ neg = 1;
+ n = -n;
+ }else if(n > DBL_MAX_10_EXP){
+ return HUGE_VAL;
+ }
+ if(n < (int)(sizeof(pows10)/sizeof(pows10[0])))
+ d = pows10[n];
+ else{
+ d = pows10[sizeof(pows10)/sizeof(pows10[0]) - 1];
+ for(;;){
+ n -= sizeof(pows10)/sizeof(pows10[0]) - 1;
+ if(n < (int)(sizeof(pows10)/sizeof(pows10[0]))){
+ d *= pows10[n];
+ break;
+ }
+ d *= pows10[sizeof(pows10)/sizeof(pows10[0]) - 1];
+ }
+ }
+ if(neg){
+ return 1./d;
+ }
+ return d;
+}
+
static int
xadd(char *a, int n, int v)
{
@@ -27,7 +109,7 @@
*b = '0';
v = 1;
}
- *a = '1'; // overflow adding
+ *a = '1'; /* overflow adding */
return 1;
}
@@ -46,7 +128,7 @@
*b = '9';
v = 1;
}
- *a = '9'; // underflow subtracting
+ *a = '9'; /* underflow subtracting */
return 1;
}
@@ -291,22 +373,22 @@
s2[d] = 0;
}
-int
-_floatfmt(Fmt *fmt, double f)
+static int
+floatfmt(Fmt *fmt, double f)
{
- char s[FDIGIT+10];
+ char s[341]; /* precision+exponent+sign+'.'+null */
xdtoa(fmt, s, f);
fmt->flags &= FmtWidth|FmtLeft;
- _fmtcpy(fmt, s, strlen(s), strlen(s));
+ __fmtcpy(fmt, s, strlen(s), strlen(s));
return 0;
}
int
-_efgfmt(Fmt *f)
+__efgfmt(Fmt *f)
{
double d;
d = va_arg(f->args, double);
- return _floatfmt(f, d);
+ return floatfmt(f, d);
}
--- a/libc/fmt.c
+++ b/libc/fmt.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
enum
@@ -16,48 +31,62 @@
struct
{
- /* lock by calling _fmtlock, _fmtunlock */
+ /* lock by calling __fmtlock, __fmtunlock */
int nfmt;
Convfmt fmt[Maxfmt];
} fmtalloc;
static Convfmt knownfmt[] = {
- ' ', _flagfmt,
- '#', _flagfmt,
- '%', _percentfmt,
- '+', _flagfmt,
- ',', _flagfmt,
- '-', _flagfmt,
- 'C', _runefmt,
- 'E', _efgfmt,
- 'G', _efgfmt,
- 'S', _runesfmt,
- 'X', _ifmt,
- 'b', _ifmt,
- 'c', _charfmt,
- 'd', _ifmt,
- 'e', _efgfmt,
- 'f', _efgfmt,
- 'g', _efgfmt,
- 'h', _flagfmt,
- 'l', _flagfmt,
- 'n', _countfmt,
- 'o', _ifmt,
- 'p', _ifmt,
-/* 'r', errfmt, */
- 's', _strfmt,
- 'u', _flagfmt,
- 'x', _ifmt,
+ ' ', __flagfmt,
+ '#', __flagfmt,
+ '%', __percentfmt,
+ '+', __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 (*doquote)(int);
+int (*fmtdoquote)(int);
+
/*
- * _fmtlock() must be set
+ * __fmtlock() must be set
*/
static int
-_fmtinstall(int c, Fmts f)
+__fmtinstall(int c, Fmts f)
{
Convfmt *p, *ep;
@@ -64,7 +93,7 @@
if(c<=0 || c>=65536)
return -1;
if(!f)
- f = _badfmt;
+ f = __badfmt;
ep = &fmtalloc.fmt[fmtalloc.nfmt];
for(p=fmtalloc.fmt; p<ep; p++)
@@ -84,13 +113,13 @@
}
int
-fmtinstall(int c, Fmts f)
+fmtinstall(int c, int (*f)(Fmt*))
{
int ret;
- _fmtlock();
- ret = _fmtinstall(c, f);
- _fmtunlock();
+ __fmtlock();
+ ret = __fmtinstall(c, f);
+ __fmtunlock();
return ret;
}
@@ -108,20 +137,20 @@
}
/* is this a predefined format char? */
- _fmtlock();
+ __fmtlock();
for(p=knownfmt; p->c; p++)
if(p->c == c){
- _fmtinstall(p->c, p->fmt);
- _fmtunlock();
+ __fmtinstall(p->c, p->fmt);
+ __fmtunlock();
return p->fmt;
}
- _fmtunlock();
+ __fmtunlock();
- return _badfmt;
+ return __badfmt;
}
void*
-_fmtdispatch(Fmt *f, void *fmt, int isrunes)
+__fmtdispatch(Fmt *f, void *fmt, int isrunes)
{
Rune rune, r;
int i, n;
@@ -134,7 +163,7 @@
r = *(Rune*)fmt;
fmt = (Rune*)fmt + 1;
}else{
- fmt = (char*)fmt + chartorune(&rune, fmt);
+ fmt = (char*)fmt + chartorune(&rune, (char*)fmt);
r = rune;
}
f->r = r;
@@ -179,6 +208,15 @@
case '*':
i = va_arg(f->args, int);
if(i < 0){
+ /*
+ * negative precision =>
+ * ignore the precision.
+ */
+ if(f->flags & FmtPrec){
+ f->flags &= ~FmtPrec;
+ f->prec = 0;
+ continue;
+ }
i = -i;
f->flags |= FmtLeft;
}
--- a/libc/fmtdef.h
+++ b/libc/fmtdef.h
@@ -1,4 +1,18 @@
/*
+ * 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.
+ */
+
+/*
* dofmt -- format to a buffer
* the number of characters formatted is returned,
* or -1 if there was an error.
@@ -18,33 +32,41 @@
int nbytesout; /* number of bytes that will be generated */
};
-void *_fmtflush(Fmt*, void*, int);
-void *_fmtdispatch(Fmt*, void*, int);
-int _floatfmt(Fmt*, double);
-int _fmtpad(Fmt*, int);
-int _rfmtpad(Fmt*, int);
-int _fmtFdFlush(Fmt*);
+/* 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 __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);
-int _efgfmt(Fmt*);
-int _charfmt(Fmt*);
-int _countfmt(Fmt*);
-int _flagfmt(Fmt*);
-int _percentfmt(Fmt*);
-int _ifmt(Fmt*);
-int _runefmt(Fmt*);
-int _runesfmt(Fmt*);
-int _strfmt(Fmt*);
-int _badfmt(Fmt*);
-int _fmtcpy(Fmt*, void*, int, int);
-int _fmtrcpy(Fmt*, void*, int n);
-
-void _fmtlock(void);
-void _fmtunlock(void);
-
#define FMTCHAR(f, t, s, c)\
do{\
if(t + 1 > (char*)s){\
- t = _fmtflush(f, t, 1);\
+ t = __fmtflush(f, t, 1);\
if(t != nil)\
s = f->stop;\
else\
@@ -56,7 +78,7 @@
#define FMTRCHAR(f, t, s, c)\
do{\
if(t + 1 > (Rune*)s){\
- t = _fmtflush(f, t, sizeof(Rune));\
+ t = __fmtflush(f, t, sizeof(Rune));\
if(t != nil)\
s = f->stop;\
else\
@@ -70,7 +92,7 @@
Rune _rune;\
int _runelen;\
if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
- t = _fmtflush(f, t, _runelen);\
+ t = __fmtflush(f, t, _runelen);\
if(t != nil)\
s = f->stop;\
else\
@@ -83,3 +105,12 @@
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
+
--- a/libc/fmtfd.c
+++ b/libc/fmtfd.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
/*
@@ -9,7 +24,7 @@
int
fmtfdflush(Fmt *f)
{
- if(_fmtFdFlush(f) <= 0)
+ if(__fmtFdFlush(f) <= 0)
return -1;
return f->nfmt;
}
@@ -24,8 +39,8 @@
f->start = buf;
f->to = buf;
f->stop = buf + size;
- f->flush = _fmtFdFlush;
- f->farg = (void*)fd;
+ f->flush = __fmtFdFlush;
+ f->farg = (void*)(uintptr_t)fd;
f->nfmt = 0;
return 0;
}
--- a/libc/fmtlock.c
+++ b/libc/fmtlock.c
@@ -1,16 +1,27 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
-static Lock fmtl;
-
void
-_fmtlock(void)
+__fmtlock(void)
{
- lock(&fmtl);
}
void
-_fmtunlock(void)
+__fmtunlock(void)
{
- unlock(&fmtl);
}
--- a/libc/fmtprint.c
+++ b/libc/fmtprint.c
@@ -1,8 +1,22 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
-
/*
* format a string into the output buffer
* designed for formats which themselves call fmt,
@@ -17,7 +31,8 @@
f->flags = 0;
f->width = 0;
f->prec = 0;
- 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);
@@ -24,7 +39,8 @@
f->flags = 0;
f->width = 0;
f->prec = 0;
- f->args = va;
+ VA_COPY(f->args,va);
+ VA_END(va);
if(n >= 0)
return 0;
return n;
--- a/libc/fmtquote.c
+++ b/libc/fmtquote.c
@@ -1,11 +1,26 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
/*
* How many bytes of output UTF will be produced by quoting (if necessary) this string?
* How many runes? How much of the input will be consumed?
- * The parameter q is filled in by _quotesetup.
+ * The 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:
@@ -16,7 +31,7 @@
* 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)
+__quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout)
{
int w;
Rune c;
@@ -33,7 +48,7 @@
q->nbytesout = 2;
q->nrunesout = 2;
}
- for(; nin!=0; nin-=w){
+ for(; nin!=0; nin--){
if(s)
w = chartorune(&c, s);
else{
@@ -51,7 +66,7 @@
break;
}
- if((c <= L' ') || (c == L'\'') || (doquote!=nil && doquote(c))){
+ if((c <= L' ') || (c == L'\'') || (fmtdoquote!=nil && fmtdoquote(c))){
if(!q->quoted){
if(runesout){
if(1+q->nrunesout+1+1 > nout) /* no room for quotes */
@@ -108,16 +123,16 @@
w = f->width;
fl = f->flags;
if(f->runes){
- if(!(fl & FmtLeft) && _rfmtpad(f, w - q->nrunesout) < 0)
+ if(!(fl & FmtLeft) && __rfmtpad(f, w - q->nrunesout) < 0)
return -1;
}else{
- if(!(fl & FmtLeft) && _fmtpad(f, w - q->nbytesout) < 0)
+ if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0)
return -1;
}
- t = f->to;
- s = f->stop;
- rt = f->to;
- rs = f->stop;
+ t = (char*)f->to;
+ s = (char*)f->stop;
+ rt = (Rune*)f->to;
+ rs = (Rune*)f->stop;
if(f->runes)
FMTRCHAR(f, rt, rs, '\'');
else
@@ -152,7 +167,7 @@
USED(rs);
f->nfmt += rt - (Rune *)f->to;
f->to = rt;
- if(fl & FmtLeft && _rfmtpad(f, w - q->nrunesout) < 0)
+ if(fl & FmtLeft && __rfmtpad(f, w - q->nrunesout) < 0)
return -1;
}else{
FMTRUNE(f, t, s, '\'');
@@ -159,7 +174,7 @@
USED(s);
f->nfmt += t - (char *)f->to;
f->to = t;
- if(fl & FmtLeft && _fmtpad(f, w - q->nbytesout) < 0)
+ if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0)
return -1;
}
return 0;
@@ -166,14 +181,16 @@
}
int
-_quotestrfmt(int runesin, Fmt *f)
+__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;
@@ -182,7 +199,7 @@
r = nil;
}
if(!s && !r)
- return _fmtcpy(f, "<nil>", 5, 5);
+ return __fmtcpy(f, (void*)"<nil>", 5, 5);
if(f->flush)
outlen = 0x7FFFFFFF; /* if we can flush, no output limit */
@@ -191,17 +208,17 @@
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){
if(!q.quoted)
- return _fmtrcpy(f, r, q.nrunesin);
+ return __fmtrcpy(f, r, q.nrunesin);
return qstrfmt(nil, r, &q, f);
}
if(!q.quoted)
- return _fmtcpy(f, s, q.nrunesin, q.nbytesin);
+ return __fmtcpy(f, s, q.nrunesin, q.nbytesin);
return qstrfmt(s, nil, &q, f);
}
@@ -208,13 +225,13 @@
int
quotestrfmt(Fmt *f)
{
- return _quotestrfmt(0, f);
+ return __quotestrfmt(0, f);
}
int
quoterunestrfmt(Fmt *f)
{
- return _quotestrfmt(1, f);
+ return __quotestrfmt(1, f);
}
void
@@ -225,11 +242,11 @@
}
int
-_needsquotes(char *s, int *quotelenp)
+__needsquotes(char *s, int *quotelenp)
{
Quoteinfo q;
- _quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0);
+ __quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0);
*quotelenp = q.nbytesout;
return q.quoted;
@@ -236,11 +253,11 @@
}
int
-_runeneedsquotes(Rune *r, int *quotelenp)
+__runeneedsquotes(Rune *r, int *quotelenp)
{
Quoteinfo q;
- _quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0);
+ __quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0);
*quotelenp = q.nrunesout;
return q.quoted;
--- a/libc/fmtrune.c
+++ b/libc/fmtrune.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
int
@@ -10,12 +25,12 @@
int n;
if(f->runes){
- rt = f->to;
+ rt = (Rune*)f->to;
FMTRCHAR(f, rt, f->stop, r);
f->to = rt;
n = 1;
}else{
- t = f->to;
+ t = (char*)f->to;
FMTRUNE(f, t, f->stop, r);
n = t - (char*)f->to;
f->to = t;
--- a/libc/fmtstr.c
+++ b/libc/fmtstr.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * 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 <stdlib.h>
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
char*
fmtstrflush(Fmt *f)
@@ -7,5 +23,5 @@
if(f->start == nil)
return nil;
*(char*)f->to = '\0';
- return f->start;
+ return (char*)f->start;
}
--- a/libc/fmtvprint.c
+++ b/libc/fmtvprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
#include "fmtdef.h"
@@ -17,13 +32,16 @@
f->flags = 0;
f->width = 0;
f->prec = 0;
- va = f->args;
- 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;
- f->args = va;
+ VA_END(f->args);
+ VA_COPY(f->args,va);
+ VA_END(va);
if(n >= 0)
return 0;
return n;
--- a/libc/fprint.c
+++ b/libc/fprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
fprint(int fd, char *fmt, ...)
--- a/libc/nan64.c
+++ b/libc/nan64.c
@@ -5,27 +5,36 @@
* same byte ordering.
*/
-#include <u.h>
-#include <libc.h>
-#include "nan.h"
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
-// typedef unsigned long long uvlong;
-// typedef unsigned long ulong;
+#if defined (__APPLE__) || (__powerpc__)
+#define _NEEDLL
+#endif
-static uvlong uvnan = 0x7FF0000000000001ULL;
-static uvlong uvinf = 0x7FF0000000000000ULL;
-static uvlong uvneginf = 0xFFF0000000000000ULL;
+static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001;
+static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000;
+static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000;
double
__NaN(void)
{
- return *(double*)(void*)&uvnan;
+ uvlong *p;
+
+ /* gcc complains about "return *(double*)&uvnan;" */
+ p = &uvnan;
+ return *(double*)p;
}
int
__isNaN(double d)
{
- uvlong x = *(uvlong*)(void*)&d;
+ uvlong x;
+ double *p;
+
+ p = &d;
+ x = *(uvlong*)p;
return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
}
@@ -32,10 +41,13 @@
double
__Inf(int sign)
{
+ uvlong *p;
+
if(sign < 0)
- return *(double*)(void*)&uvinf;
+ p = &uvinf;
else
- return *(double*)(void*)&uvneginf;
+ p = &uvneginf;
+ return *(double*)p;
}
int
@@ -42,8 +54,10 @@
__isInf(double d, int sign)
{
uvlong x;
+ double *p;
- x = *(uvlong*)(void*)&d;
+ p = &d;
+ x = *(uvlong*)p;
if(sign == 0)
return x==uvinf || x==uvneginf;
else if(sign > 0)
@@ -51,5 +65,3 @@
else
return x==uvneginf;
}
-
-
--- a/libc/pow10.c
+++ b/libc/pow10.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
/*
* this table might overflow 127-bit exponent representations.
@@ -9,41 +25,33 @@
* 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,
- 1.0e70, 1.0e71, 1.0e72, 1.0e73, 1.0e74, 1.0e75, 1.0e76, 1.0e77, 1.0e78, 1.0e79,
- 1.0e80, 1.0e81, 1.0e82, 1.0e83, 1.0e84, 1.0e85, 1.0e86, 1.0e87, 1.0e88, 1.0e89,
- 1.0e90, 1.0e91, 1.0e92, 1.0e93, 1.0e94, 1.0e95, 1.0e96, 1.0e97, 1.0e98, 1.0e99,
- 1.0e100,1.0e101,1.0e102,1.0e103,1.0e104,1.0e105,1.0e106,1.0e107,1.0e108,1.0e109,
- 1.0e110,1.0e111,1.0e112,1.0e113,1.0e114,1.0e115,1.0e116,1.0e117,1.0e118,1.0e119,
- 1.0e120,1.0e121,1.0e122,1.0e123,1.0e124,1.0e125,1.0e126,1.0e127,1.0e128,1.0e129,
- 1.0e130,1.0e131,1.0e132,1.0e133,1.0e134,1.0e135,1.0e136,1.0e137,1.0e138,1.0e139,
- 1.0e140,1.0e141,1.0e142,1.0e143,1.0e144,1.0e145,1.0e146,1.0e147,1.0e148,1.0e149,
- 1.0e150,1.0e151,1.0e152,1.0e153,1.0e154,1.0e155,1.0e156,1.0e157,1.0e158,1.0e159,
+ 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
-pow10(int n)
+__fmtpow10(int n)
{
int m;
if(n < 0) {
n = -n;
- if(n < sizeof(tab)/sizeof(tab[0]))
+ if(n < (int)(sizeof(tab)/sizeof(tab[0])))
return 1/tab[n];
m = n/2;
- return 1/(pow10(m) * pow10(n-m));
+ return __fmtpow10(-m) * __fmtpow10(m-n);
}
- if(n < sizeof(tab)/sizeof(tab[0]))
+ if(n < (int)(sizeof(tab)/sizeof(tab[0])))
return tab[n];
m = n/2;
- return pow10(m) * pow10(n-m);
+ return __fmtpow10(m) * __fmtpow10(n-m);
}
--- a/libc/print.c
+++ b/libc/print.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
print(char *fmt, ...)
--- a/libc/runefmtstr.c
+++ b/libc/runefmtstr.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <stdlib.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
Rune*
runefmtstrflush(Fmt *f)
--- a/libc/runeseprint.c
+++ b/libc/runeseprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
Rune*
runeseprint(Rune *buf, Rune *e, char *fmt, ...)
--- a/libc/runesmprint.c
+++ b/libc/runesmprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
Rune*
runesmprint(char *fmt, ...)
--- a/libc/runesnprint.c
+++ b/libc/runesnprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
runesnprint(Rune *buf, int len, char *fmt, ...)
--- a/libc/runesprint.c
+++ b/libc/runesprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
runesprint(Rune *buf, char *fmt, ...)
--- a/libc/runevseprint.c
+++ b/libc/runevseprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
Rune*
runevseprint(Rune *buf, Rune *e, char *fmt, va_list args)
@@ -15,9 +31,10 @@
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ VA_COPY(f.args,args);
dofmt(&f, fmt);
+ VA_END(f.args);
*(Rune*)f.to = '\0';
- return f.to;
+ return (Rune*)f.to;
}
--- a/libc/runevsmprint.c
+++ b/libc/runevsmprint.c
@@ -1,6 +1,32 @@
+/*
+ * 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.
+ */
+/*
+ * 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 <u.h>
#include <libc.h>
#include "fmtdef.h"
+#else
+#include <stdlib.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
+#endif
static int
runeFmtStrFlush(Fmt *f)
@@ -10,9 +36,9 @@
if(f->start == nil)
return 0;
- n = (int)f->farg;
+ n = (uintptr)f->farg;
n *= 2;
- s = f->start;
+ s = (Rune*)f->start;
f->start = realloc(s, sizeof(Rune)*n);
if(f->start == nil){
f->farg = nil;
@@ -21,7 +47,7 @@
free(s);
return 0;
}
- f->farg = (void*)n;
+ f->farg = (void*)(uintptr)n;
f->to = (Rune*)f->start + ((Rune*)f->to - s);
f->stop = (Rune*)f->start + n - 1;
return 1;
@@ -41,7 +67,7 @@
f->to = f->start;
f->stop = (Rune*)f->start + n - 1;
f->flush = runeFmtStrFlush;
- f->farg = (void*)n;
+ f->farg = (void*)(uintptr)n;
f->nfmt = 0;
return 0;
}
@@ -57,8 +83,9 @@
if(runefmtstrinit(&f) < 0)
return nil;
- f.args = args;
+ VA_COPY(f.args,args);
n = dofmt(&f, fmt);
+ VA_END(f.args);
if(f.start == nil)
return nil;
if(n < 0){
@@ -66,5 +93,5 @@
return nil;
}
*(Rune*)f.to = '\0';
- return f.start;
+ return (Rune*)f.start;
}
--- a/libc/runevsnprint.c
+++ b/libc/runevsnprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
runevsnprint(Rune *buf, int len, char *fmt, va_list args)
@@ -15,8 +31,9 @@
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ VA_COPY(f.args,args);
dofmt(&f, fmt);
+ VA_END(f.args);
*(Rune*)f.to = '\0';
return (Rune*)f.to - buf;
}
--- a/libc/seprint.c
+++ b/libc/seprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
char*
seprint(char *buf, char *e, char *fmt, ...)
--- a/libc/smprint.c
+++ b/libc/smprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
char*
smprint(char *fmt, ...)
--- a/libc/snprint.c
+++ b/libc/snprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
snprint(char *buf, int len, char *fmt, ...)
--- a/libc/sprint.c
+++ b/libc/sprint.c
@@ -1,14 +1,39 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include <fmt.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
sprint(char *buf, char *fmt, ...)
{
int n;
+ uint len;
va_list args;
+ len = 1<<30; /* big number, but sprint is deprecated anyway */
+ /*
+ * on PowerPC, the stack is near the top of memory, so
+ * we must be sure not to overflow a 32-bit pointer.
+ */
+ if(buf+len < buf)
+ len = -(uintptr)buf-1;
+
va_start(args, fmt);
- n = vsnprint(buf, 65536, fmt, args); /* big number, but sprint is deprecated anyway */
+ n = vsnprint(buf, len, fmt, args);
va_end(args);
return n;
}
--- a/libc/strtod.c
+++ b/libc/strtod.c
@@ -1,7 +1,37 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * 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 <stdlib.h>
+#include <math.h>
#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
+static ulong
+umuldiv(ulong a, ulong b, ulong c)
+{
+ double d;
+
+ d = ((double)a * (double)b) / (double)c;
+ if(d >= 4294967295.)
+ d = 4294967295.;
+ return (ulong)d;
+}
+
/*
* This routine will convert to arbitrary precision
* floating point entirely in multi-precision fixed.
@@ -17,46 +47,34 @@
*/
enum
{
- Nbits = 28, // bits safely represented in a ulong
- Nmant = 53, // bits of precision required
- Bias = 1022,
- Prec = (Nmant+Nbits+1)/Nbits, // words of Nbits each to represent mantissa
- Sigbit = 1<<(Prec*Nbits-Nmant), // first significant bit of Prec-th word
+ Nbits = 28, /* bits safely represented in a ulong */
+ Nmant = 53, /* bits of precision required */
+ Prec = (Nmant+Nbits+1)/Nbits, /* words of Nbits each to represent mantissa */
+ Sigbit = 1<<(Prec*Nbits-Nmant), /* first significant bit of Prec-th word */
Ndig = 1500,
One = (ulong)(1<<Nbits),
Half = (ulong)(One>>1),
Maxe = 310,
- Fsign = 1<<0, // found -
- Fesign = 1<<1, // found e-
- Fdpoint = 1<<2, // found .
- S0 = 0, // _ _S0 +S1 #S2 .S3
- S1, // _+ #S2 .S3
- S2, // _+# #S2 .S4 eS5
- S3, // _+. #S4
- S4, // _+#.# #S4 eS5
- S5, // _+#.#e +S6 #S7
- S6, // _+#.#e+ #S7
- S7, // _+#.#e+# #S7
+ 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 ulong
-umuldiv(ulong a, ulong b, ulong c)
-{
- double d;
-
- d = ((double)a * (double)b) / (double)c;
- if(d >= 4294967295.)
- d = 4294967295.;
- return d;
-}
-
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*);
-static void divby(char*, int*, int);
typedef struct Tab Tab;
struct Tab
@@ -67,20 +85,20 @@
};
double
-strtod(char *as, char **aas)
+fmtstrtod(const char *as, char **aas)
{
- int na, ona, ex, dp, bp, c, i, flag, state;
- ulong low[Prec], hig[Prec], mid[Prec], num, den;
+ 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
+ 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=as;; s++) {
+ for(s=(char*)as;; s++) {
c = *s;
if(c >= '0' && c <= '9') {
switch(state) {
@@ -131,7 +149,7 @@
if(state == S5)
state = S6;
else
- break; // syntax
+ break; /* syntax */
continue;
case '.':
flag |= Fdpoint;
@@ -179,12 +197,12 @@
}
case S3:
if(aas != nil)
- *aas = as;
- goto ret0; // no digits found
+ *aas = (char*)as;
+ goto ret0; /* no digits found */
case S6:
- s--; // back over +-
+ s--; /* back over +- */
case S5:
- s--; // back over e
+ s--; /* back over e */
break;
}
if(aas != nil)
@@ -194,7 +212,7 @@
while(na > 0 && a[na-1] == '0')
na--;
if(na == 0)
- goto ret0; // zero
+ goto ret0; /* zero */
a[na] = 0;
if(!(flag & Fdpoint))
dp = na;
@@ -201,48 +219,34 @@
if(flag & Fesign)
ex = -ex;
dp += ex;
- if(dp < -Maxe-Nmant/3) /* actually -Nmant*log(2)/log(10), but Nmant/3 close enough */
- goto ret0; // underflow by exp
- else
+ if(dp < -Maxe){
+ errno = ERANGE;
+ goto ret0; /* underflow by exp */
+ } else
if(dp > +Maxe)
- goto retinf; // overflow by exp
+ goto retinf; /* overflow by exp */
/*
* normalize the decimal ascii number
* to range .[5-9][0-9]* e0
*/
- bp = 0; // binary exponent
+ bp = 0; /* binary exponent */
while(dp > 0)
divascii(a, &na, &dp, &bp);
while(dp < 0 || a[0] < '5')
mulascii(a, &na, &dp, &bp);
- a[na] = 0;
- /*
- * very small numbers are represented using
- * bp = -Bias+1. adjust accordingly.
- */
- if(bp < -Bias+1){
- ona = na;
- divby(a, &na, -bp-Bias+1);
- if(na < ona){
- memmove(a+ona-na, a, na);
- memset(a, '0', ona-na);
- na = ona;
- }
- a[na] = 0;
- bp = -Bias+1;
- }
-
/* close approx by naive conversion */
- num = 0;
- den = 1;
- for(i=0; i<9 && (c=a[i]); i++) {
- num = num*10 + (c-'0');
- den *= 10;
+ mid[0] = 0;
+ mid[1] = 1;
+ for(i=0; c=a[i]; i++) {
+ mid[0] = mid[0]*10 + (c-'0');
+ mid[1] = mid[1]*10;
+ if(i >= 8)
+ break;
}
- low[0] = umuldiv(num, One, den);
- hig[0] = umuldiv(num+1, One, den);
+ low[0] = umuldiv(mid[0], One, mid[1]);
+ hig[0] = umuldiv(mid[0]+1, One, mid[1]);
for(i=1; i<Prec; i++) {
low[i] = 0;
hig[i] = One-1;
@@ -271,7 +275,7 @@
low[i] = mid[i];
}
if(c)
- break; // between mid and hig
+ break; /* between mid and hig */
continue;
}
if(c < 0) {
@@ -284,7 +288,7 @@
c = mid[Prec-1] & (Sigbit-1);
if(c == Sigbit/2 && (mid[Prec-1]&Sigbit) == 0)
mid[Prec-1] -= c;
- break; // exactly mid
+ break; /* exactly mid */
}
/* normal rounding applies */
@@ -294,13 +298,7 @@
mid[Prec-1] += Sigbit;
frnorm(mid);
}
- d = 0;
- for(i=0; i<Prec; i++)
- d = d*One + mid[i];
- if(flag & Fsign)
- d = -d;
- d = ldexp(d, bp - Prec*Nbits);
- return d;
+ goto out;
ret0:
return 0;
@@ -309,9 +307,24 @@
return __NaN();
retinf:
+ /*
+ * Unix strtod requires these. Plan 9 would return Inf(0) or Inf(-1). */
+ errno = ERANGE;
if(flag & Fsign)
- return __Inf(-1);
- return __Inf(+1);
+ return -HUGE_VAL;
+ return HUGE_VAL;
+
+out:
+ d = 0;
+ for(i=0; i<Prec; i++)
+ d = d*One + mid[i];
+ if(flag & Fsign)
+ d = -d;
+ d = ldexp(d, bp - Prec*Nbits);
+ if(d == 0){ /* underflow */
+ errno = ERANGE;
+ }
+ return d;
}
static void
@@ -364,11 +377,10 @@
a++;
cont:;
}
- return 0;
}
static void
-_divby(char *a, int *na, int b)
+divby(char *a, int *na, int b)
{
int n, c;
char *p;
@@ -410,18 +422,6 @@
*p = 0;
}
-static void
-divby(char *a, int *na, int b)
-{
- while(b > 9){
- _divby(a, na, 9);
- a[*na] = 0;
- b -= 9;
- }
- if(b > 0)
- _divby(a, na, b);
-}
-
static Tab tab1[] =
{
1, 0, "",
@@ -443,8 +443,8 @@
Tab *t;
d = *dp;
- if(d >= nelem(tab1))
- d = nelem(tab1)-1;
+ if(d >= (int)(nelem(tab1)))
+ d = (int)(nelem(tab1))-1;
t = tab1 + d;
b = t->bp;
if(memcmp(a, t->cmp, t->siz) > 0)
@@ -483,7 +483,7 @@
static Tab tab2[] =
{
- 1, 1, "", // dp = 0-0
+ 1, 1, "", /* dp = 0-0 */
3, 3, "125",
6, 5, "15625",
9, 7, "1953125",
@@ -492,7 +492,7 @@
19, 14, "19073486328125",
23, 17, "11920928955078125",
26, 19, "1490116119384765625",
- 27, 19, "7450580596923828125", // dp 8-9
+ 27, 19, "7450580596923828125", /* dp 8-9 */
};
static void
@@ -503,8 +503,8 @@
Tab *t;
d = -*dp;
- if(d >= nelem(tab2))
- d = nelem(tab2)-1;
+ if(d >= (int)(nelem(tab2)))
+ d = (int)(nelem(tab2))-1;
t = tab2 + d;
b = t->bp;
if(memcmp(a, t->cmp, t->siz) < 0)
--- a/libc/vfprint.c
+++ b/libc/vfprint.c
@@ -1,23 +1,21 @@
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
/*
- * generic routine for flushing a formatting buffer
- * to a file descriptor
+ * 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.
*/
-int
-_fmtFdFlush(Fmt *f)
-{
- int n;
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
- n = (char*)f->to - (char*)f->start;
- if(n && write((int)f->farg, f->start, n) != n)
- return 0;
- f->to = f->start;
- return 1;
-}
-
int
vfprint(int fd, char *fmt, va_list args)
{
@@ -26,9 +24,10 @@
int n;
fmtfdinit(&f, fd, buf, sizeof(buf));
- f.args = args;
+ VA_COPY(f.args,args);
n = dofmt(&f, fmt);
- if(n > 0 && _fmtFdFlush(&f) == 0)
+ VA_END(f.args);
+ if(n > 0 && __fmtFdFlush(&f) == 0)
return -1;
return n;
}
--- a/libc/vseprint.c
+++ b/libc/vseprint.c
@@ -1,5 +1,20 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * The authors of this software are Rob Pike and Ken Thompson.
+ * Copyright (c) 2002 by Lucent Technologies.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
+ * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ */
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
char*
vseprint(char *buf, char *e, char *fmt, va_list args)
@@ -12,12 +27,13 @@
f.start = buf;
f.to = buf;
f.stop = e - 1;
- f.flush = nil;
+ f.flush = 0;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ VA_COPY(f.args,args);
dofmt(&f, fmt);
+ VA_END(f.args);
*(char*)f.to = '\0';
- return f.to;
+ return (char*)f.to;
}
--- a/libc/vsmprint.c
+++ b/libc/vsmprint.c
@@ -1,6 +1,32 @@
+/*
+ * 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.
+ */
+/*
+ * 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 <u.h>
#include <libc.h>
#include "fmtdef.h"
+#else
+#include <stdlib.h>
+#include <string.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
+#endif
static int
fmtStrFlush(Fmt *f)
@@ -10,9 +36,9 @@
if(f->start == nil)
return 0;
- n = (int)f->farg;
+ n = (uintptr)f->farg;
n *= 2;
- s = f->start;
+ s = (char*)f->start;
f->start = realloc(s, n);
if(f->start == nil){
f->farg = nil;
@@ -21,7 +47,7 @@
free(s);
return 0;
}
- f->farg = (void*)n;
+ f->farg = (void*)(uintptr)n;
f->to = (char*)f->start + ((char*)f->to - s);
f->stop = (char*)f->start + n - 1;
return 1;
@@ -41,7 +67,7 @@
f->to = f->start;
f->stop = (char*)f->start + n - 1;
f->flush = fmtStrFlush;
- f->farg = (void*)n;
+ f->farg = (void*)(uintptr)n;
f->nfmt = 0;
return 0;
}
@@ -57,14 +83,12 @@
if(fmtstrinit(&f) < 0)
return nil;
- f.args = args;
+ VA_COPY(f.args,args);
n = dofmt(&f, fmt);
- if(f.start == nil)
- return nil;
+ VA_END(f.args);
if(n < 0){
free(f.start);
return nil;
}
- *(char*)f.to = '\0';
- return f.start;
+ return fmtstrflush(&f);
}
--- a/libc/vsnprint.c
+++ b/libc/vsnprint.c
@@ -1,5 +1,21 @@
-#include <u.h>
-#include <libc.h>
+/*
+ * 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 <stdlib.h>
+#include <stdarg.h>
+#include "plan9.h"
+#include "fmt.h"
+#include "fmtdef.h"
int
vsnprint(char *buf, int len, char *fmt, va_list args)
@@ -12,11 +28,12 @@
f.start = buf;
f.to = buf;
f.stop = buf + len - 1;
- f.flush = nil;
+ f.flush = 0;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ VA_COPY(f.args,args);
dofmt(&f, fmt);
+ VA_END(f.args);
*(char*)f.to = '\0';
return (char*)f.to - buf;
}