From 37d72420e4e5cac0693854a1cab4f255574cb269 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 4 Apr 2008 20:24:56 +0000 Subject: [PATCH] added %b for binary printing --HG-- branch : sourcemod-1.0.1 extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/branches/sourcemod-1.0.1%401985 --- core/sm_stringutil.cpp | 69 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/core/sm_stringutil.cpp b/core/sm_stringutil.cpp index 70586d96..f12bba8b 100644 --- a/core/sm_stringutil.cpp +++ b/core/sm_stringutil.cpp @@ -2,7 +2,7 @@ * vim: set ts=4 : * ============================================================================= * SourceMod - * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -357,6 +357,57 @@ void AddFloat(char **buf_p, size_t &maxlen, double fval, int width, int prec, in *buf_p = buf; } +void AddBinary(char **buf_p, size_t &maxlen, unsigned int val, int width, int flags) +{ + char text[32]; + int digits; + char *buf; + + digits = 0; + do + { + if (val & 1) + { + text[digits++] = '1'; + } + else + { + text[digits++] = '0'; + } + val >>= 1; + } while (val); + + buf = *buf_p; + + if (!(flags & LADJUST)) + { + while (digits < width && maxlen) + { + *buf++ = (flags & ZEROPAD) ? '0' : ' '; + width--; + maxlen--; + } + } + + while (digits-- && maxlen) + { + *buf++ = text[digits]; + width--; + maxlen--; + } + + if (flags & LADJUST) + { + while (width-- && maxlen) + { + *buf++ = (flags & ZEROPAD) ? '0' : ' '; + maxlen--; + } + } + + *buf_p = buf; +} + void AddUInt(char **buf_p, size_t &maxlen, unsigned int val, int width, int flags) { char text[32]; @@ -623,6 +674,13 @@ reswitch: arg++; break; } + case 'b': + { + int *value = (int *)args[arg]; + AddBinary(&buf_p, llen, *value, width, flags); + arg++; + break; + } case 'd': case 'i': { @@ -809,6 +867,15 @@ reswitch: arg++; break; } + case 'b': + { + CHECK_ARGS(0); + cell_t *value; + pCtx->LocalToPhysAddr(params[arg], &value); + AddBinary(&buf_p, llen, *value, width, flags); + arg++; + break; + } case 'd': case 'i': {