18df6a8dbSIngo Weinhold /* 28df6a8dbSIngo Weinhold * Copyright 2007, Haiku Inc. All rights reserved. 38df6a8dbSIngo Weinhold * Distributed under the terms of the MIT License. 48df6a8dbSIngo Weinhold * 58df6a8dbSIngo Weinhold * Authors: 68df6a8dbSIngo Weinhold * Hugo Santos <hugosantos@gmail.com> 78df6a8dbSIngo Weinhold * Ingo Weinhold <bonefish@cs.tu-berlin.de> 88df6a8dbSIngo Weinhold */ 98df6a8dbSIngo Weinhold 108df6a8dbSIngo Weinhold #include "Context.h" 118df6a8dbSIngo Weinhold 128df6a8dbSIngo Weinhold #include <stdio.h> 138df6a8dbSIngo Weinhold #include <string.h> 148df6a8dbSIngo Weinhold 158df6a8dbSIngo Weinhold string 168df6a8dbSIngo Weinhold Context::FormatSigned(int64 value, int bytes) const 178df6a8dbSIngo Weinhold { 188df6a8dbSIngo Weinhold char tmp[32]; 198df6a8dbSIngo Weinhold 208df6a8dbSIngo Weinhold // decimal 218df6a8dbSIngo Weinhold 228df6a8dbSIngo Weinhold if (fDecimal) { 23*a3802ca9SAlex Smith snprintf(tmp, sizeof(tmp), "%" B_PRId64, value); 248df6a8dbSIngo Weinhold return tmp; 258df6a8dbSIngo Weinhold } 268df6a8dbSIngo Weinhold 278df6a8dbSIngo Weinhold // hex 288df6a8dbSIngo Weinhold 29*a3802ca9SAlex Smith snprintf(tmp, sizeof(tmp), "0x%" B_PRIx64, value); 308df6a8dbSIngo Weinhold 318df6a8dbSIngo Weinhold // Negative numbers are expanded when being converted to int64. Hence 328df6a8dbSIngo Weinhold // we skip all but the last 2 * bytes hex digits to retain the original 338df6a8dbSIngo Weinhold // type's width. 348df6a8dbSIngo Weinhold int len = strlen(tmp); 358df6a8dbSIngo Weinhold int offset = len - min_c(len, bytes * 2); 368df6a8dbSIngo Weinhold 378df6a8dbSIngo Weinhold // use the existing "0x" prefix or prepend it again 388df6a8dbSIngo Weinhold if (offset <= 2) { 398df6a8dbSIngo Weinhold offset = 0; 408df6a8dbSIngo Weinhold } else { 418df6a8dbSIngo Weinhold tmp[--offset] = 'x'; 428df6a8dbSIngo Weinhold tmp[--offset] = '0'; 438df6a8dbSIngo Weinhold } 448df6a8dbSIngo Weinhold 458df6a8dbSIngo Weinhold return tmp + offset; 468df6a8dbSIngo Weinhold } 478df6a8dbSIngo Weinhold 488df6a8dbSIngo Weinhold string 498df6a8dbSIngo Weinhold Context::FormatUnsigned(uint64 value) const 508df6a8dbSIngo Weinhold { 518df6a8dbSIngo Weinhold char tmp[32]; 52*a3802ca9SAlex Smith snprintf(tmp, sizeof(tmp), fDecimal ? "%" B_PRIu64 : "0x%" B_PRIx64, value); 538df6a8dbSIngo Weinhold return tmp; 548df6a8dbSIngo Weinhold } 558df6a8dbSIngo Weinhold 568df6a8dbSIngo Weinhold string 578df6a8dbSIngo Weinhold Context::FormatFlags(uint64 value) const 588df6a8dbSIngo Weinhold { 598df6a8dbSIngo Weinhold char tmp[32]; 60*a3802ca9SAlex Smith snprintf(tmp, sizeof(tmp), "0x%" B_PRIx64, value); 618df6a8dbSIngo Weinhold return tmp; 628df6a8dbSIngo Weinhold } 638df6a8dbSIngo Weinhold 648df6a8dbSIngo Weinhold string 658df6a8dbSIngo Weinhold Context::FormatPointer(const void *address) const 668df6a8dbSIngo Weinhold { 678df6a8dbSIngo Weinhold char buffer[32]; 688df6a8dbSIngo Weinhold sprintf(buffer, "%p", address); 698df6a8dbSIngo Weinhold return buffer; 708df6a8dbSIngo Weinhold } 71