static int Aconv(Fmt *fp) { int i; i = va_arg(fp->args, int); return fmtstrcpy(fp, anames8[i]); }
int Aconv(Fmt *fp) { int r; r = va_arg(fp->args, int); return fmtstrcpy(fp, anames[r]); }
int __errfmt(Fmt *f) { char *s; s = strerror(errno); return fmtstrcpy(f, s); }
/* fmt out a null terminated utf string */ int __strfmt(Fmt *f) { char *s; s = va_arg(f->args, char *); return fmtstrcpy(f, s); }
int dirfmt(Fmt *fmt) { char buf[160]; fdirconv(buf, buf+sizeof buf, va_arg(fmt->args, Dir*)); return fmtstrcpy(fmt, buf); }
static int Wfmt(Fmt *f) { Window *w; w = va_arg(f->args, Window*); if(w == nil) return fmtstrcpy(f, "<nil>"); return fmtprint(f, "0x%ulx", w->xid); }
static int fmtæ(Fmt *f) { char buf[16]; Aoedev *d; d = va_arg(f->args, Aoedev*); snprint(buf, sizeof buf, "aoe%d.%d", d->major, d->minor); return fmtstrcpy(f, buf); }
int iconv(Fmt *f) { Inst *i; char buf[128]; i = va_arg(f->args, Inst*); if(i == nil) return fmtstrcpy(f, "IZ"); switch(keywds[i->op].terminal) { case TOKI0: sprint(buf, "%s", keywds[i->op].name); break; case TOKI1: sprint(buf, "%s\t%a", keywds[i->op].name, i->dst); break; case TOKI3: if(i->reg != 0) { char *pre = ""; char *post = ""; switch(i->reg->mode) { case AXIMM: pre = "$"; break; case AXINF: post = "(fp)"; break; case AXINM: post = "(mp)"; break; } sprint(buf, "%s\t%a, %s%ld%s, %a", keywds[i->op].name, i->src, pre, i->reg->val, post, i->dst); break; } case TOKI2: sprint(buf, "%s\t%a, %a", keywds[i->op].name, i->src, i->dst); break; } return fmtstrcpy(f, buf); }
/* * Format time like ctime without newline. */ static int tfmt(Fmt *fmt) { uint t; char buf[30]; t = va_arg(fmt->args, uint); strcpy(buf, ctime(t)); buf[28] = 0; return fmtstrcpy(fmt, buf); }
int Gfmt(Fmt *f1) { int t; t = va_arg(f1->args, int); if(t >= 0 && t < MAXTAG) return fmtstrcpy(f1, tagnames[t]); else return fmtprint(f1, "<badtag %d>", t); }
int Aconv(Fmt *fp) { char *s; int a; a = va_arg(fp->args, int); s = "???"; if(a >= AXXX && a < ALAST) s = anames[a]; return fmtstrcpy(fp, s); }
static int digestfmt(Fmt *fmt) { char buf[MD5dlen*2+1]; uchar *p; int i; p = va_arg(fmt->args, uchar*); for(i=0; i<MD5dlen; i++) sprint(buf+2*i, "%.2ux", p[i]); return fmtstrcpy(fmt, buf); }
int Pconv(Fmt *fp) { char str[STRINGSZ]; Prog *p; p = va_arg(fp->args, Prog*); snprint(str, sizeof str, " %A %D,%D", p->as, &p->from, &p->to); if(p->from.field) return fmtprint(fp, "%s,%d,%d", str, p->to.field, p->from.field); return fmtstrcpy(fp, str); }
int Rconv(Fmt *fp) { char *s; int a; a = va_arg(fp->args, int); s = "C_??"; if(a >= C_NONE && a <= C_NCLASS) s = cnames[a]; return fmtstrcpy(fp, s); }
static int Gfmt(Fmt* fmt) { int t; char *s; t = va_arg(fmt->args, int); s = "<badtag>"; if(t >= 0 && t < MAXTAG) s = tagnames[t]; return fmtstrcpy(fmt, s); }
static int binput(Fmt *f, Const *c) { mpint *n, *x; int rc, i, j, k; mpdigit p, q; n = mpcopy(c->n); x = mpcopy(c->x); j = mpsignif(n); k = mpsignif(x); i = j > k ? j : k; if(x->sign == -1){ mptrunc(n, ++i, n); mptrunc(x, i, x); }else if(k >= j) i++; if(n->sign == -1) return fmtstrcpy(f, "(invalid)"); if(i == 0) i = 1; j = (i + 31) / (sizeof(mpdigit) * 8); i = (i + sizeof(mpdigit) * 8 - 1) % (sizeof(mpdigit) * 8) + 1; rc = fmtstrcpy(f, "'b"); while(--j >= 0){ p = j >= n->top ? 0 : n->p[j]; q = j >= x->top ? 0 : x->p[j]; while(--i >= 0){ k = (mpdigit)1<<i; rc += fmtstrcpy(f, (q & k) != 0 ? ((p & k) != 0 ? "z" : "x") : ((p & k) != 0 ? "1" : "0")); } i = sizeof(mpdigit) * 8; } mpfree(n); mpfree(x); return rc; }
int placeconv(Fmt *fp) { char str[256]; int n; Place pl; pl = va_arg(fp->args, Place); n = 0; n += printlatlon(str+n, sizeof(str)-n, pl.lat, 'N', 'S'); n += snprint(str+n, sizeof(str)-n, ", "); printlatlon(str+n, sizeof(str)-n, pl.lon, 'E', 'W'); return fmtstrcpy(fp, str); }
int eipfmt(Fmt *f) { char buf[5*8]; static char *efmt = "%.2lux%.2lux%.2lux%.2lux%.2lux%.2lux"; static char *ifmt = "%d.%d.%d.%d"; uchar *p, ip[16]; ulong ul; switch(f->r) { case 'E': /* Ethernet address */ p = va_arg(f->args, uchar*); snprint(buf, sizeof buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]); return fmtstrcpy(f, buf); case 'I': ul = va_arg(f->args, ulong); hnputl(ip, ul); snprint(buf, sizeof buf, ifmt, ip[0], ip[1], ip[2], ip[3]); return fmtstrcpy(f, buf); } return fmtstrcpy(f, "(eipfmt)"); }
int Rconv(Fmt *fp) { char str[20]; int r; r = va_arg(fp->args, int); if(r >= D_AL && r <= D_NONE) snprint(str, sizeof(str), "%s", regstr[r-D_AL]); else snprint(str, sizeof(str), "gok(%d)", r); return fmtstrcpy(fp, str); }
static int Rconv(Fmt *fp) { char str[STRINGSZ]; int r; r = va_arg(fp->args, int); if(r >= D_AL && r <= D_NONE) sprint(str, "%s", regstr[r-D_AL]); else sprint(str, "gok(%d)", r); return fmtstrcpy(fp, str); }
int aconv(Fmt *f) { Addr *a; char buf[64]; a = va_arg(f->args, Addr*); if(a == nil) return fmtstrcpy(f, "AZ"); if(a->mode & AIND) { switch(a->mode & ~AIND) { case AFP: sprint(buf, "%ld(%d(fp))", a->val, a->off); break; case AMP: sprint(buf, "%ld(%d(mp))", a->val, a->off); break; } } else { switch(a->mode) { case AFP: sprint(buf, "%ld(fp)", a->val); break; case AMP: sprint(buf, "%ld(mp)", a->val); break; case AIMM: sprint(buf, "$%ld", a->val); break; } } return fmtstrcpy(f, buf); }
/* * Format number in simplest way that is okay with unittoull. */ static int zfmt(Fmt *fmt) { vlong x; x = va_arg(fmt->args, vlong); if(x == 0) return fmtstrcpy(fmt, "0"); if(x%G == 0) return fmtprint(fmt, "%lldG", x/G); if(x%M == 0) return fmtprint(fmt, "%lldM", x/M); if(x%K == 0) return fmtprint(fmt, "%lldK", x/K); return fmtprint(fmt, "%lld", x); }
int Xconv(Fmt *fp) { char str[20]; Index x; int i, j; x = va_arg(fp->args, Index); str[0] = 0; i = x.o0 & D_MASK; if(i != D_NONE){ j = x.o1; return fmtprint(fp, "(%R.%c*%c)", i, "WWWWLLLL"[j], "12481248"[j]); } return fmtstrcpy(fp, str); }
int Bconv(Fmt *fp) { char buf[500], *p; Mpint *xval, q, r, ten, sixteen; int f, digit; xval = va_arg(fp->args, Mpint*); mpmovefixfix(&q, xval); f = 0; if(mptestfix(&q) < 0) { f = 1; mpnegfix(&q); } p = &buf[sizeof(buf)]; *--p = 0; if(fp->flags & FmtSharp) { // Hexadecimal mpmovecfix(&sixteen, 16); for(;;) { mpdivmodfixfix(&q, &r, &q, &sixteen); digit = mpgetfix(&r); if(digit < 10) *--p = digit + '0'; else *--p = digit - 10 + 'A'; if(mptestfix(&q) <= 0) break; } *--p = 'x'; *--p = '0'; } else { // Decimal mpmovecfix(&ten, 10); for(;;) { mpdivmodfixfix(&q, &r, &q, &ten); *--p = mpgetfix(&r) + '0'; if(mptestfix(&q) <= 0) break; } } if(f) *--p = '-'; return fmtstrcpy(fp, p); }
int Sconv(Fmt *fp) { int i, c; char str[STRINGSZ], *p, *a; a = va_arg(fp->args, char*); p = str; for(i=0; i<NSNAME; i++) { c = a[i] & 0xff; if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c == ' ' || c == '%') { *p++ = c; continue; } *p++ = '\\'; switch(c) { case 0: *p++ = 'z'; continue; case '\\': case '"': *p++ = c; continue; case '\n': *p++ = 'n'; continue; case '\t': *p++ = 't'; continue; case '\r': *p++ = 'r'; continue; case '\f': *p++ = 'f'; continue; } *p++ = (c>>6) + '0'; *p++ = ((c>>3) & 7) + '0'; *p++ = (c & 7) + '0'; } *p = 0; return fmtstrcpy(fp, str); }
int Pconv(Fmt *fp) { char str[STRINGSZ], s[20]; Prog *p; p = va_arg(fp->args, Prog*); bigP = p; sprint(str, "(%ld) %A %D,%D", p->line, p->as, &p->from, &p->to); if(p->from.field) { sprint(s, ",%d,%d", p->to.field, p->from.field); strcat(str, s); } bigP = P; return fmtstrcpy(fp, str); }
static int Tconv(Fmt *f) { Token* t; int i; int tag; char* srbra; Rune* aname; Rune* tname; Attr* a; char buf[BIGBUFSIZE]; t = va_arg(f->args, Token*); if(t == nil) sprint(buf, "<null>"); else { i = 0; if(dbglex > 1) i = snprint(buf, sizeof(buf), "[%d]", t->starti); tag = t->tag; if(tag == Data) { i += snprint(buf+i, sizeof(buf)-i-1, "'%S'", t->text); } else { srbra = ""; if(tag >= RBRA) { tag -= RBRA; srbra = "/"; } tname = tagnames[tag]; if(tag == Notfound) tname = L"?"; i += snprint(buf+i, sizeof(buf)-i-1, "<%s%S", srbra, tname); for(a = t->attr; a != nil; a = a->next) { aname = attrnames[a->attid]; i += snprint(buf+i, sizeof(buf)-i-1, " %S", aname); if(a->value != nil) i += snprint(buf+i, sizeof(buf)-i-1, "=%S", a->value); } i += snprint(buf+i, sizeof(buf)-i-1, ">"); } buf[i] = 0; } return fmtstrcpy(f, buf); }
int Fconv(Fmt *fp) { char buf[500]; Mpflt *fvp, fv; double d; fvp = va_arg(fp->args, Mpflt*); if(fp->flags & FmtSharp) { // alternate form - decimal for error messages. // for well in range, convert to double and use print's %g if(-900 < fvp->exp && fvp->exp < 900) { d = mpgetflt(fvp); if(d >= 0 && (fp->flags & FmtSign)) fmtprint(fp, "+"); return fmtprint(fp, "%g", d); } // TODO(rsc): for well out of range, print // an approximation like 1.234e1000 } if(sigfig(fvp) == 0) { snprint(buf, sizeof(buf), "0p+0"); goto out; } fv = *fvp; while(fv.val.a[0] == 0) { mpshiftfix(&fv.val, -Mpscale); fv.exp += Mpscale; } while((fv.val.a[0]&1) == 0) { mpshiftfix(&fv.val, -1); fv.exp += 1; } if(fv.exp >= 0) { snprint(buf, sizeof(buf), "%#Bp+%d", &fv.val, fv.exp); goto out; } snprint(buf, sizeof(buf), "%#Bp-%d", &fv.val, -fv.exp); out: return fmtstrcpy(fp, buf); }
int Pconv(Fmt *fp) { char str[STRINGSZ]; Prog *p; p = va_arg(fp->args, Prog*); if(p->as == ADATA) snprint(str, sizeof(str), " %A %D/%d,%D", p->as, &p->from, p->from.scale, &p->to); else if(p->as == ATEXT) snprint(str, sizeof(str), " %A %D,%d,%D", p->as, &p->from, p->from.scale, &p->to); else snprint(str, sizeof(str), " %A %D,%D", p->as, &p->from, &p->to); return fmtstrcpy(fp, str); }
int Yconv(Fmt *fp) { int i, c; char str[STRINGSZ], *p, *a; a = va_arg(fp->args, char*); p = str; for(i=0; i<sconsize; i++) { c = a[i] & 0xff; if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { *p++ = c; continue; } *p++ = '\\'; switch(c) { default: if(c < 040 || c >= 0177) break; /* not portable */ p[-1] = c; continue; case 0: *p++ = 'z'; continue; case '\\': case '"': *p++ = c; continue; case '\n': *p++ = 'n'; continue; case '\t': *p++ = 't'; continue; } *p++ = (c>>6) + '0'; *p++ = ((c>>3) & 7) + '0'; *p++ = (c & 7) + '0'; } *p = 0; return fmtstrcpy(fp, str); }