1 /*
2 * NAME: mkmapping()
3 * DESCRIPTION: create a mapping of two arrays
4 */
mkmapping(mixed * indices,mixed * values)5 static mapping mkmapping(mixed *indices, mixed *values)
6 {
7 mapping map;
8 int i, sz;
9
10 ARGCHECK(indices, mkmapping, 1);
11 ARGCHECK(values, mkmapping, 2);
12
13 if (sizeof(indices) != sizeof(values)) {
14 error("Unequal argument sizes in mkmapping()");
15 }
16 map = ([ ]);
17 for (i = 0, sz = sizeof(indices); i < sz; i++) {
18 map[indices[i]] = values[i];
19 }
20
21 return map;
22 }
23
24 /*
25 * NAME: m_indices()
26 * DESCRIPTION: return the indices of a mapping
27 */
m_indices(mapping map)28 static mixed *m_indices(mapping map)
29 {
30 ARGCHECK(map, m_indices, 1);
31 return map_indices(map);
32 }
33
34 /*
35 * NAME: m_values()
36 * DESCRIPTION: return the values of a mapping
37 */
m_values(mapping map)38 static mixed *m_values(mapping map)
39 {
40 ARGCHECK(map, m_values, 1);
41 return map_values(map);
42 }
43
44 /*
45 * NAME: m_delete()
46 * DESCRIPTION: return a mapping with an element deleted
47 */
m_delete(mapping map,mixed elt)48 static mapping m_delete(mapping map, mixed elt)
49 {
50 ARGCHECK(map, m_delete, 1);
51
52 map += ([ ]);
53 map[elt] = 0;
54 return map;
55 }
56
57 /*
58 * NAME: m_sizeof()
59 * DESCRIPTION: return the size of a mapping
60 */
m_sizeof(mapping map)61 static int m_sizeof(mapping map)
62 {
63 ARGCHECK(map, m_sizeof, 1);
64 return map_sizeof(map);
65 }
66
67 /*
68 * NAME: filter_mapping()
69 * DESCRIPTION: filter a mapping by its values
70 */
71 static varargs mapping
filter_mapping(mapping map,mixed func,mixed obj,mixed arg)72 filter_mapping(mapping map, mixed func, mixed obj, mixed arg)
73 {
74 mixed *indices, *values, value;
75 mapping copy;
76 int i, sz;
77
78 ARGCHECK(map, filter_mapping, 1);
79 ARGCHECK(stringp(func), filter_mapping, 2);
80 if (stringp(obj)) {
81 call_other(obj = ::find_object(DRIVER)->path_object(obj), "???");
82 obj = find_object(obj);
83 }
84 ARGCHECK(objectp(obj), filter_mapping, 3);
85
86 indices = map_indices(map);
87 values = map_values(map);
88 copy = ([ ]);
89 for (i = 0, sz = sizeof(indices); i < sz; i++) {
90 if (call_other(obj, func, value = values[i], arg)) {
91 copy[indices[i]] = value;
92 }
93 }
94
95 return copy;
96 }
97
98 /*
99 * NAME: map_mapping()
100 * DESCRIPTION: map the values of a mapping
101 */
102 static varargs mapping
map_mapping(mapping map,mixed func,mixed obj,mixed arg)103 map_mapping(mapping map, mixed func, mixed obj, mixed arg)
104 {
105 mixed *indices, *values;
106 mapping copy;
107 int i, sz;
108
109 ARGCHECK(map, map_mapping, 1);
110 ARGCHECK(stringp(func), map_mapping, 2);
111 if (stringp(obj)) {
112 call_other(obj = ::find_object(DRIVER)->path_object(obj), "???");
113 obj = find_object(obj);
114 }
115 ARGCHECK(objectp(obj), map_mapping, 3);
116
117 indices = map_indices(map);
118 values = map_values(map);
119 copy = ([ ]);
120 for (i = 0, sz = sizeof(indices); i < sz; i++) {
121 copy[indices[i]] = call_other(obj, func, values[i], arg);
122 }
123
124 return copy;
125 }
126