// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "runtime.h" void dump(byte *p, int32 n) { int32 i; for(i=0; i>4)); sys·printpointer((byte*)(p[i]&0xf)); if((i&15) == 15) prints("\n"); else prints(" "); } if(n & 15) prints("\n"); } void prints(int8 *s) { sys·write(1, s, findnull((byte*)s)); } // Very simple printf. Only for debugging prints. // Do not add to this without checking with Rob. void printf(int8 *s, ...) { int8 *p, *lp; byte *arg, *narg; lp = p = s; arg = (byte*)(&s+1); for(; *p; p++) { if(*p != '%') continue; if(p > lp) sys·write(1, lp, p-lp); p++; narg = nil; switch(*p) { case 'd': // 32-bit case 'x': narg = arg + 4; break; case 'D': // 64-bit case 'X': if(sizeof(uintptr) == 8 && ((uint32)(uint64)arg)&4) arg += 4; narg = arg + 8; break; case 'p': // pointer-sized case 's': case 'S': if(sizeof(uintptr) == 8 && ((uint32)(uint64)arg)&4) arg += 4; narg = arg + sizeof(uintptr); break; } switch(*p) { case 'd': sys·printint(*(int32*)arg); break; case 'D': sys·printint(*(int64*)arg); break; case 'x': sys·printhex(*(int32*)arg); break; case 'X': sys·printhex(*(int64*)arg); break; case 'p': sys·printpointer(*(void**)arg); break; case 's': prints(*(int8**)arg); break; case 'S': sys·printstring(*(string*)arg); break; } arg = narg; lp = p+1; } if(p > lp) sys·write(1, lp, p-lp); } void sys·printpc(void *p) { prints("PC="); sys·printhex((uint64)sys·getcallerpc(p)); } void sys·printbool(bool v) { if(v) { sys·write(1, (byte*)"true", 4); return; } sys·write(1, (byte*)"false", 5); } void sys·printfloat(float64 v) { byte buf[20]; int32 e, s, i, n; float64 h; if(isNaN(v)) { sys·write(1, "NaN", 3); return; } if(isInf(v, 0)) { sys·write(1, "+Inf", 4); return; } if(isInf(v, -1)) { sys·write(1, "+Inf", 4); return; } n = 7; // digits printed e = 0; // exp s = 0; // sign if(v != 0) { // sign if(v < 0) { v = -v; s = 1; } // normalize while(v >= 10) { e++; v /= 10; } while(v < 1) { e--; v *= 10; } // round h = 5; for(i=0; i= 10) { e++; v /= 10; } } // format +d.dddd+edd buf[0] = '+'; if(s) buf[0] = '-'; for(i=0; i0; i--) { buf[i] = v%10 + '0'; if(v < 10) break; v = v/10; } sys·write(1, buf+i, nelem(buf)-i); } void sys·printint(int64 v) { if(v < 0) { sys·write(1, "-", 1); v = -v; } sys·printuint(v); } void sys·printhex(uint64 v) { static int8 *dig = "0123456789abcdef"; byte buf[100]; int32 i; i=nelem(buf); for(; v>0; v/=16) buf[--i] = dig[v%16]; if(i == nelem(buf)) buf[--i] = '0'; buf[--i] = 'x'; buf[--i] = '0'; sys·write(1, buf+i, nelem(buf)-i); } void sys·printpointer(void *p) { sys·printhex((uint64)p); } void sys·printstring(string v) { extern int32 maxstring; if(v != nil) { if(v->len > maxstring) sys·write(1, "[invalid string]", 16); else sys·write(1, v->str, v->len); } } void sys·printsp(void) { sys·write(1, " ", 1); } void sys·printnl(void) { sys·write(1, "\n", 1); }