1/*
2 * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef STRACE_SYSCALL_H
6#define STRACE_SYSCALL_H
7
8#include <string>
9#include <vector>
10
11#include <SupportDefs.h>
12
13#include "TypeHandler.h"
14
15using std::string;
16using std::vector;
17
18// Type
19class Type {
20public:
21	Type(string typeName, TypeHandler *handler)
22		: fTypeName(typeName), fHandler(handler) {}
23
24	const string &TypeName() const	{ return fTypeName; }
25
26	void SetHandler(TypeHandler *handler)
27	{
28		delete fHandler;
29		fHandler = handler;
30	}
31
32	TypeHandler	*Handler() const	{ return fHandler; }
33
34private:
35	string		fTypeName;
36	TypeHandler	*fHandler;
37};
38
39// Parameter
40class Parameter : public Type {
41public:
42	Parameter(string name, int32 offset, string typeName, TypeHandler *handler)
43		: Type(typeName, handler),
44		  fName(name),
45		  fOffset(offset)
46	{
47	}
48
49	const string &Name() const		{ return fName; }
50	int32 Offset() const			{ return fOffset; }
51
52private:
53	string	fName;
54	int32	fOffset;
55};
56
57// Syscall
58class Syscall {
59public:
60	Syscall(string name, string returnTypeName, TypeHandler *returnTypeHandler)
61		: fName(name),
62		  fReturnType(new Type(returnTypeName, returnTypeHandler))
63	{
64	}
65
66	const string &Name() const
67	{
68		return fName;
69	}
70
71	Type *ReturnType() const
72	{
73		return fReturnType;
74	}
75
76	void AddParameter(Parameter *parameter)
77	{
78		fParameters.push_back(parameter);
79	}
80
81	void AddParameter(string name, int32 offset, string typeName,
82		TypeHandler *handler)
83	{
84		AddParameter(new Parameter(name, offset, typeName, handler));
85	}
86
87	int32 CountParameters() const
88	{
89		return fParameters.size();
90	}
91
92	Parameter *ParameterAt(int32 index) const
93	{
94		return fParameters[index];
95	}
96
97	Parameter *GetParameter(string name) const
98	{
99		int32 count = CountParameters();
100		for (int32 i = 0; i < count; i++) {
101			Parameter *parameter = ParameterAt(i);
102			if (parameter->Name() == name)
103				return parameter;
104		}
105
106		return NULL;
107	}
108
109private:
110	string				fName;
111	Type				*fReturnType;
112	vector<Parameter*>	fParameters;
113};
114
115#endif	// STRACE_SYSCALL_H
116