-
Notifications
You must be signed in to change notification settings - Fork 1
/
ici-core3.ici
113 lines (107 loc) · 2.85 KB
/
ici-core3.ici
1
2
3
4
5
6
7
8
9
10
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
/*
* min - return the minimum of all parameters
*/
extern min(v)
{
var vargs = [array];
var rc;
rc = v;
forall (v in vargs)
if (v < rc)
rc = v;
return rc;
}
/*
* max - return the maximum value of all parameters
*/
extern max(v)
{
var vargs = [array];
var rc;
rc = v;
forall (v in vargs)
if (v > rc)
rc = v;
return rc;
}
/*
* Raise an error for an incorrect argument argument passed to a function.
* Mimics the interpreter's internal routine to do the same thing.
*/
extern argerror(f, n, t)
{
fail(sprintf("argument %d of %s() incorrectly supplied as %s", n, f, t));
}
/*
* Raise an error for an incorrect number of arguments to a function.
* Mimics the interpreter's internal routine.
*/
extern argcount(f, n, a)
{
fail(sprintf("%d arguments given to %s, but it takes %d", a, f, n));
}
/*
* typecheck - validate arguments via format string
*
* Parameters:
* f A string, the name of function calling typecheck. This is
* used when raising errors about too few arguments or an
* argument being of incorrect type.
*
* XXXX This can be removed now that ICI has _funcname_. Typecheck
* can all vstack() to find the caller's name, if it has
* one, and issue the appropriate message.
*
* fmt A format string specifying the types for the
* arguments, each character represents a single
* argument. If there are too few arguments or
* arguments of incorrect type an error is raised.
* The following characters are used,
*
* i int
* s string
* f float
* d map
* a array
* u file
* r regexp
*
* args An array of the parameters to be validated.
*
* Returns:
* A map containing two keys, "args" - an array of the actual
* validated parameters - and "vargs" - an array containing any
* remaining parameters.
*/
extern typecheck(f, fmt, args)
{
var o;
var c;
var res;
var i;
var n;
var map = [map
i = "int",
s = "string",
f = "float",
d = "map",
a = "array",
u = "file",
r = "regexp",
];
i = 0;
n = len(args);
res = array();
if (len(fmt) != len(args))
argcount(f, len(fmt), i);
forall (c in fmt)
{
o = args[i];
if (!(c = map[c]))
fail("invalid type specifier in typecheck() format string");
if ((t = typeof(o)) != c)
argerror(f, i, t);
push(res, o);
}
return map("args", res, "vargs", interval(args, i));
}