xref: /haiku/src/bin/debug/strace/Context.cpp (revision a3802ca96702d7011ad4967428c38f196b07480c)
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