11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
_function = function;
_argumentsTypes = argumentsTypes;
return self;
}
- (int)callWithArguments:(char **)arguments
numArguments:(size_t)numArguments
isDown:(bool)isDown
{
switch (_argumentsTypes) {
case ARG_1INT:
if (isDown)
((void(__cdecl *)(int))_function)(ATOI(arguments[1]));
break;
case ARG_2INT:
if (isDown)
((void(__cdecl *)(int, int))_function)(
ATOI(arguments[1]), ATOI(arguments[2]));
break;
case ARG_3INT:
if (isDown)
((void(__cdecl *)(int, int, int))_function)(
ATOI(arguments[1]), ATOI(arguments[2]),
ATOI(arguments[3]));
break;
case ARG_4INT:
if (isDown)
((void(__cdecl *)(int, int, int, int))_function)(
ATOI(arguments[1]), ATOI(arguments[2]),
ATOI(arguments[3]), ATOI(arguments[4]));
break;
case ARG_NONE:
if (isDown)
((void(__cdecl *)())_function)();
break;
case ARG_1STR:
if (isDown)
((void(__cdecl *)(OFString *))_function)(
@(arguments[1]));
break;
case ARG_2STR:
if (isDown)
((void(__cdecl *)(OFString *, OFString *))_function)(
@(arguments[1]), @(arguments[2]));
break;
case ARG_3STR:
if (isDown)
((void(__cdecl *)(
OFString *, OFString *, OFString *))_function)(
@(arguments[1]), @(arguments[2]), @(arguments[3]));
break;
case ARG_5STR:
if (isDown)
((void(__cdecl *)(OFString *, OFString *, OFString *,
OFString *, OFString *))_function)(@(arguments[1]),
@(arguments[2]), @(arguments[3]), @(arguments[4]),
@(arguments[5]));
break;
case ARG_DOWN:
((void(__cdecl *)(bool))_function)(isDown);
break;
case ARG_DWN1:
((void(__cdecl *)(bool, OFString *))_function)(
isDown, @(arguments[1]));
break;
case ARG_1EXP:
if (isDown)
return ((int(__cdecl *)(int))_function)(
execute(@(arguments[1])));
break;
case ARG_2EXP:
if (isDown)
return ((int(__cdecl *)(int, int))_function)(
execute(@(arguments[1])), execute(@(arguments[2])));
break;
case ARG_1EST:
if (isDown)
return ((int(__cdecl *)(OFString *))_function)(
@(arguments[1]));
break;
case ARG_2EST:
if (isDown)
return (
(int(__cdecl *)(OFString *, OFString *))_function)(
@(arguments[1]), @(arguments[2]));
break;
case ARG_VARI:
if (isDown) {
// limit, remove
string r;
r[0] = 0;
for (int i = 1; i < numArguments; i++) {
// make string-list out of all arguments
strcat_s(r, arguments[i]);
if (i == numArguments - 1)
break;
strcat_s(r, " ");
}
((void(__cdecl *)(OFString *))_function)(@(r));
}
break;
}
return 0;
}
@end
|
|
<
<
|
>
|
>
|
>
|
|
>
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
<
|
<
<
<
<
<
<
<
<
<
|
<
>
>
|
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
_function = function;
_argumentsTypes = argumentsTypes;
return self;
}
- (int)callWithArguments:(OFArray<OFString *> *)arguments isDown:(bool)isDown
{
switch (_argumentsTypes) {
case ARG_1INT:
if (isDown)
((void(__cdecl *)(int))_function)(
(int)[arguments[1] longLongValueWithBase:0]);
break;
case ARG_2INT:
if (isDown)
((void(__cdecl *)(int, int))_function)(
(int)[arguments[1] longLongValueWithBase:0],
(int)[arguments[2] longLongValueWithBase:0]);
break;
case ARG_3INT:
if (isDown)
((void(__cdecl *)(int, int, int))_function)(
(int)[arguments[1] longLongValueWithBase:0],
(int)[arguments[2] longLongValueWithBase:0],
(int)[arguments[3] longLongValueWithBase:0]);
break;
case ARG_4INT:
if (isDown)
((void(__cdecl *)(int, int, int, int))_function)(
(int)[arguments[1] longLongValueWithBase:0],
(int)[arguments[2] longLongValueWithBase:0],
(int)[arguments[3] longLongValueWithBase:0],
(int)[arguments[4] longLongValueWithBase:0]);
break;
case ARG_NONE:
if (isDown)
((void(__cdecl *)())_function)();
break;
case ARG_1STR:
if (isDown)
((void(__cdecl *)(OFString *))_function)(arguments[1]);
break;
case ARG_2STR:
if (isDown)
((void(__cdecl *)(OFString *, OFString *))_function)(
arguments[1], arguments[2]);
break;
case ARG_3STR:
if (isDown)
((void(__cdecl *)(
OFString *, OFString *, OFString *))_function)(
arguments[1], arguments[2], arguments[3]);
break;
case ARG_5STR:
if (isDown)
((void(__cdecl *)(OFString *, OFString *, OFString *,
OFString *, OFString *))_function)(arguments[1],
arguments[2], arguments[3], arguments[4],
arguments[5]);
break;
case ARG_DOWN:
((void(__cdecl *)(bool))_function)(isDown);
break;
case ARG_DWN1:
((void(__cdecl *)(bool, OFString *))_function)(
isDown, arguments[1]);
break;
case ARG_1EXP:
if (isDown)
return ((int(__cdecl *)(int))_function)(
execute(arguments[1]));
break;
case ARG_2EXP:
if (isDown)
return ((int(__cdecl *)(int, int))_function)(
execute(arguments[1]), execute(arguments[2]));
break;
case ARG_1EST:
if (isDown)
return ((int(__cdecl *)(OFString *))_function)(
arguments[1]);
break;
case ARG_2EST:
if (isDown)
return ((int(__cdecl *)(OFString *,
OFString *))_function)(arguments[1], arguments[2]);
break;
case ARG_VARI:
if (isDown)
// limit, remove
((void(__cdecl *)(OFString *))_function)([[arguments
objectsInRange:OFMakeRange(1, arguments.count - 1)]
componentsJoinedByString:@" "]);
break;
}
return 0;
}
@end
|