Exemplo n.º 1
0
void HelpPopUpMenu::onItemChoosed(type_index item_index, const NEString& chosen_content)
{
	switch(item_index)
	{
	case 0:
		::Core::commander.command("help -command");
		break;

	case 1:
		::Core::commander.command("help -module");
		break;

	case 2:
		::Core::commander.command("help");
		break;
	}

	getCaller().delete_me = delete_me = true;
}
Exemplo n.º 2
0
int StackTrace::printStackTrace(MapFile** map, int maps,
                                int initLevel, int maxDepth,
                                char* buffer, int bufferSize)
{
	if(maxDepth > MAX_DEPTH)
		maxDepth = MAX_DEPTH;

	// list callers
	long callersAddr[MAX_DEPTH];
	int callers = 0;
	int i;
	for(i = initLevel ; i < maxDepth ; ++i)
	{
		long addr = getCaller(i);
		callersAddr[callers++] = addr;

		// end tracing here if the entry is not in a map file
		int entry = -1;
		for(int j = 0 ; j < maps ; ++j)
		{
			entry = map[j]->findEntry(addr);
			if(-1 != entry)
				break;
		}
		if(-1 == entry)
			break;
	}

	// output call stack
	if(bufferSize > 0)
		*buffer = 0;
	int needed = 0;
	for(i = initLevel ; i < callers ; ++i)
	{
		long addr = callersAddr[callers - i - 1];

		// find entry info
		int entry = -1;
		const MapFile* entryMap = NULL;
		for(int j = 0 ; j < maps ; ++j)
		{
			entry = map[j]->findEntry(addr);
			if(-1 != entry)
			{
				entryMap = map[j];
				break;
			}
		}

		// format entry to tempory buf
		char buf[MapFileEntry::MAX_NAME + MAX_DEPTH + 20];	// name + margin + hex number
		buf[0] = 0;
		for(int k = initLevel - 1 ; k < i ; ++k)
			strcat(buf, " ");
		if(!entryMap)
			sprintf(buf + strlen(buf), "0x%x\n", addr);
		else
			sprintf(buf + strlen(buf), "%s (%x)\n", entryMap->getEntry(entry).name(), addr);

		// append temporary buf to output buffer if space left
		needed += (int)strlen(buf);
		if(needed < bufferSize)
			strcat(buffer, buf);
	}

	// terminate output buffer
	if(needed < bufferSize)
		buffer[needed] = 0;
	else if(bufferSize > 0)
		buffer[bufferSize - 1] = 0;
	return needed;
}