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