summaryrefslogtreecommitdiff
path: root/sys/src/cmd/unix/drawterm/libmp/mpfmt.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2013-11-23 01:05:33 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2013-11-23 01:05:33 +0100
commit2f9ae0f8ac8610e13ced184847b57b87fe5db580 (patch)
treef9ad2223d518585a2cfe9ea1c73e1e37d07bf637 /sys/src/cmd/unix/drawterm/libmp/mpfmt.c
parentea5797c0731203c09ec5fb7172e77eab2750f1a9 (diff)
removing (outdated) drawterm
drawterm is much better maintained by russ cox, so removing this outdated copy. for a more recent version, go to: http://swtch.com/drawterm/
Diffstat (limited to 'sys/src/cmd/unix/drawterm/libmp/mpfmt.c')
-rw-r--r--sys/src/cmd/unix/drawterm/libmp/mpfmt.c193
1 files changed, 0 insertions, 193 deletions
diff --git a/sys/src/cmd/unix/drawterm/libmp/mpfmt.c b/sys/src/cmd/unix/drawterm/libmp/mpfmt.c
deleted file mode 100644
index f7c42a7bc..000000000
--- a/sys/src/cmd/unix/drawterm/libmp/mpfmt.c
+++ /dev/null
@@ -1,193 +0,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-#include "dat.h"
-
-static int
-to64(mpint *b, char *buf, int len)
-{
- uchar *p;
- int n, rv;
-
- p = nil;
- n = mptobe(b, nil, 0, &p);
- if(n < 0)
- return -1;
- rv = enc64(buf, len, p, n);
- free(p);
- return rv;
-}
-
-static int
-to32(mpint *b, char *buf, int len)
-{
- uchar *p;
- int n, rv;
-
- // leave room for a multiple of 5 buffer size
- n = b->top*Dbytes + 5;
- p = malloc(n);
- if(p == nil)
- return -1;
- n = mptobe(b, p, n, nil);
- if(n < 0)
- return -1;
-
- // round up buffer size, enc32 only accepts a multiple of 5
- if(n%5)
- n += 5 - (n%5);
- rv = enc32(buf, len, p, n);
- free(p);
- return rv;
-}
-
-static char set16[] = "0123456789ABCDEF";
-
-static int
-to16(mpint *b, char *buf, int len)
-{
- mpdigit *p, x;
- int i, j;
- char *out, *eout;
-
- if(len < 1)
- return -1;
-
- out = buf;
- eout = buf+len;
- for(p = &b->p[b->top-1]; p >= b->p; p--){
- x = *p;
- for(i = Dbits-4; i >= 0; i -= 4){
- j = 0xf & (x>>i);
- if(j != 0 || out != buf){
- if(out >= eout)
- return -1;
- *out++ = set16[j];
- }
- }
- }
- if(out == buf)
- *out++ = '0';
- if(out >= eout)
- return -1;
- *out = 0;
- return 0;
-}
-
-static char*
-modbillion(int rem, ulong r, char *out, char *buf)
-{
- ulong rr;
- int i;
-
- for(i = 0; i < 9; i++){
- rr = r%10;
- r /= 10;
- if(out <= buf)
- return nil;
- *--out = '0' + rr;
- if(rem == 0 && r == 0)
- break;
- }
- return out;
-}
-
-static int
-to10(mpint *b, char *buf, int len)
-{
- mpint *d, *r, *billion;
- char *out;
-
- if(len < 1)
- return -1;
-
- d = mpcopy(b);
- r = mpnew(0);
- billion = uitomp(1000000000, nil);
- out = buf+len;
- *--out = 0;
- do {
- mpdiv(d, billion, d, r);
- out = modbillion(d->top, r->p[0], out, buf);
- if(out == nil)
- break;
- } while(d->top != 0);
- mpfree(d);
- mpfree(r);
- mpfree(billion);
-
- if(out == nil)
- return -1;
- len -= out-buf;
- if(out != buf)
- memmove(buf, out, len);
- return 0;
-}
-
-int
-mpfmt(Fmt *fmt)
-{
- mpint *b;
- char *p;
-
- b = va_arg(fmt->args, mpint*);
- if(b == nil)
- return fmtstrcpy(fmt, "*");
-
- p = mptoa(b, fmt->prec, nil, 0);
- fmt->flags &= ~FmtPrec;
-
- if(p == nil)
- return fmtstrcpy(fmt, "*");
- else{
- fmtstrcpy(fmt, p);
- free(p);
- return 0;
- }
-}
-
-char*
-mptoa(mpint *b, int base, char *buf, int len)
-{
- char *out;
- int rv, alloced;
-
- alloced = 0;
- if(buf == nil){
- len = ((b->top+1)*Dbits+2)/3 + 1;
- buf = malloc(len);
- if(buf == nil)
- return nil;
- alloced = 1;
- }
-
- if(len < 2)
- return nil;
-
- out = buf;
- if(b->sign < 0){
- *out++ = '-';
- len--;
- }
- switch(base){
- case 64:
- rv = to64(b, out, len);
- break;
- case 32:
- rv = to32(b, out, len);
- break;
- default:
- case 16:
- rv = to16(b, out, len);
- break;
- case 10:
- rv = to10(b, out, len);
- break;
- }
- if(rv < 0){
- if(alloced)
- free(buf);
- return nil;
- }
- return buf;
-}