Finger info for theoddone33@icculus.org...
07 August 2005
My favorite quote today: "You're a Christian band? Where's your horn section?"
06 August 2005
I had a brilliant idea for what to write in here, but I forgot what it was. In
celebration of this fact, I'm going to post my solution to Ryan's recent
programming challenge. Note that I didn't come up with the method myself, I
just think that this implementation is pretty concise and altogether nice. If
you find bugs in it don't tell me because it will hurt my feelings.
------
#include <cstdlib>
using namespace std;
typedef void* pointer;
typedef struct node_s
{
struct node_s* parent;
struct node_s* sibling;
struct node_s* child;
size_t depth;
pointer ptr;
} *callstackid;
static callstackid alloc_node ()
{
callstackid ret = (callstackid) malloc (sizeof (struct node_s));
if (ret == NULL)
{
// Tee hee
__asm__ __volatile__ ("int $3");
}
else
{
ret->parent = NULL;
ret->child = NULL;
ret->sibling = NULL;
ret->depth = 0;
ret->ptr = NULL;
}
return ret;
}
static callstackid root_node = NULL;
void callstack_init ()
{
root_node = alloc_node ();
}
callstackid callstack_add (pointer* ptrs, size_t count, callstackid parent = root_node, size_t depth = 0)
{
if (count == 0) return parent;
callstackid node = parent->child;
while (node)
{
if (node->child && node->child->ptr == ptrs[0])
{
break;
}
node = node->sibling;
}
if (!node)
{
node = alloc_node();
node->parent = parent;
node->child = NULL;
node->sibling = NULL;
node->depth = depth;
node->ptr = ptrs[0];
}
return callstack_add (&ptrs[1], count - 1, node, depth + 1);
}
void callstack_doneadding (void)
{
// Lame.
}
size_t callstack_framecount (callstackid id)
{
return id->depth;
}
void callstack_get(callstackid id, pointer* ptrs)
{
size_t depth = id->depth;
size_t count = 0;
callstackid node = id;
while (id && id->parent)
{
ptrs[depth-count-1] = id->ptr;
id = id->parent;
count++;
}
}
When this .plan was written: 2004-08-07 05:24:36
.plan archives for this user are here (RSS here).
Powered by IcculusFinger v2.1.27
Stick it in the camel and go.