1/*
2 * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "CliThreadCommand.h"
8
9#include <stdio.h>
10
11#include <AutoLocker.h>
12
13#include "CliContext.h"
14#include "Team.h"
15
16
17CliThreadCommand::CliThreadCommand()
18	:
19	CliCommand("set or print the current thread",
20		"%s [ <thread ID> ]\n"
21		"Sets the current thread to <thread ID>, if supplied. Otherwise prints "
22			"the\n"
23		"current thread.")
24{
25}
26
27
28void
29CliThreadCommand::Execute(int argc, const char* const* argv,
30	CliContext& context)
31{
32	if (argc > 2) {
33		PrintUsage(argv[0]);
34		return;
35	}
36
37	if (argc < 2) {
38		// no arguments -- print the current thread
39		context.PrintCurrentThread();
40		return;
41	}
42
43	// parse the argument
44	char* endPointer;
45	long threadID = strtol(argv[1], &endPointer, 0);
46	if (*endPointer != '\0' || threadID < 0) {
47		printf("Error: Invalid parameter \"%s\"\n", argv[1]);
48		return;
49	}
50
51	// get the thread and change the current thread
52	Team* team = context.GetTeam();
53	AutoLocker<Team> teamLocker(team);
54	if (Thread* thread = team->ThreadByID(threadID))
55		context.SetCurrentThread(thread);
56	else
57		printf("Error: No thread with ID %ld\n", threadID);
58}
59