|  | 
| 93 | 93 |     int ret = 0; | 
| 94 | 94 |     foreach (size_t i; 0 .. callstack.length) | 
| 95 | 95 |     { | 
| 96 |  | -        char[1536] buffer = void; buffer[0] = 0; | 
| 97 |  | -        char[256] addressBuffer = void; addressBuffer[0] = 0; | 
|  | 96 | +        char[1536] buffer = void; | 
|  | 97 | +        size_t bufferLength = 0; | 
|  | 98 | + | 
|  | 99 | +        void appendToBuffer(Args...)(const(char)* format, Args args) | 
|  | 100 | +        { | 
|  | 101 | +            const count = snprintf(buffer.ptr + bufferLength, buffer.length - bufferLength, format, args); | 
|  | 102 | +            assert(count >= 0); | 
|  | 103 | +            bufferLength += count; | 
|  | 104 | +            if (bufferLength >= buffer.length) | 
|  | 105 | +                bufferLength = buffer.length - 1; | 
|  | 106 | +        } | 
| 98 | 107 | 
 | 
| 99 | 108 |         if (locations.length > 0 && locations[i].line != -1) | 
| 100 |  | -            snprintf(addressBuffer.ptr, addressBuffer.length, "%.*s:%d ", cast(int) locations[i].file.length, locations[i].file.ptr, locations[i].line); | 
|  | 109 | +        { | 
|  | 110 | +            appendToBuffer("%.*s:%d ", cast(int) locations[i].file.length, locations[i].file.ptr, locations[i].line); | 
|  | 111 | +        } | 
| 101 | 112 |         else | 
| 102 |  | -            addressBuffer[] = "??:? \0"; | 
|  | 113 | +        { | 
|  | 114 | +            buffer[0 .. 5] = "??:? "; | 
|  | 115 | +            bufferLength = 5; | 
|  | 116 | +        } | 
| 103 | 117 | 
 | 
| 104 | 118 |         char[1024] symbolBuffer = void; | 
| 105 |  | -        int bufferLength; | 
| 106 | 119 |         auto symbol = getDemangledSymbol(frameList[i][0 .. strlen(frameList[i])], symbolBuffer); | 
| 107 | 120 |         if (symbol.length > 0) | 
| 108 |  | -            bufferLength = snprintf(buffer.ptr, buffer.length, "%s%.*s [0x%x]", addressBuffer.ptr, cast(int) symbol.length, symbol.ptr, callstack[i]); | 
| 109 |  | -        else | 
| 110 |  | -            bufferLength = snprintf(buffer.ptr, buffer.length, "%s[0x%x]", addressBuffer.ptr, callstack[i]); | 
|  | 121 | +            appendToBuffer("%.*s ", cast(int) symbol.length, symbol.ptr); | 
| 111 | 122 | 
 | 
| 112 |  | -        assert(bufferLength >= 0); | 
|  | 123 | +        static if (size_t.sizeof == 8) | 
|  | 124 | +            appendToBuffer("[0x%llx]", callstack[i]); | 
|  | 125 | +        else | 
|  | 126 | +            appendToBuffer("[0x%x]", callstack[i]); | 
| 113 | 127 | 
 | 
| 114 | 128 |         auto output = buffer[0 .. bufferLength]; | 
| 115 | 129 |         auto pos = i; | 
|  | 
0 commit comments