[languages/lisp]
[parrot.git] / src / key.c
blob730516c2ff06bfaf562246bffad00e1722f5bbad
1 /*
2 Copyright (C) 2001-2003, The Perl Foundation.
3 $Id$
5 =head1 NAME
7 src/key.c - Base vtable calling functions
9 =head1 DESCRIPTION
11 The base vtable calling functions.
13 =head2 Functions
15 =over 4
17 =cut
21 #include "parrot/parrot.h"
25 =item C<PMC *
26 key_new(Interp *interp)>
28 Returns a new C<Key> PMC.
30 =cut
34 PMC *
35 key_new(Interp *interp)
37 PMC *key = pmc_new(interp, enum_class_Key);
39 return key;
44 =item C<PMC *
45 key_new_integer(Interp *interp, INTVAL value)>
47 Returns a new integer C<Key> PMC with value C<value>.
49 =cut
53 PMC *
54 key_new_integer(Interp *interp, INTVAL value)
56 PMC *key = pmc_new(interp, enum_class_Key);
58 PObj_get_FLAGS(key) |= KEY_integer_FLAG;
59 PMC_int_val(key) = value;
61 return key;
66 =item C<PMC *
67 key_new_number(Interp *interp, FLOATVAL value)>
69 Returns a new number C<Key> PMC with value C<value>.
71 =cut
75 PMC *
76 key_new_number(Interp *interp, FLOATVAL value)
78 PMC *key = pmc_new(interp, enum_class_Key);
80 PObj_get_FLAGS(key) |= KEY_number_FLAG;
81 PMC_num_val(key) = value;
83 return key;
88 =item C<PMC *
89 key_new_string(Interp *interp, STRING *value)>
91 Returns a new string C<Key> PMC with value C<value>.
93 =cut
97 PMC *
98 key_new_string(Interp *interp, STRING *value)
100 PMC *key = pmc_new(interp, enum_class_Key);
102 PObj_get_FLAGS(key) |= KEY_string_FLAG;
103 PMC_str_val(key) = value;
105 return key;
110 =item C<PMC *
111 key_new_cstring(Interp *interp, const char *value)>
113 Returns a new string C<Key> PMC with value C<value> converted to a
114 C<STRING>.
116 =cut
120 PMC *
121 key_new_cstring(Interp *interp, const char *value)
123 return key_new_string(interp,
124 string_from_cstring(interp, value, 0));
129 =item C<PMC *
130 key_new_pmc(Interp *interp, PMC *value)>
132 Returns a new PMC C<Key> PMC with value C<value>.
134 =cut
138 PMC *
139 key_new_pmc(Interp *interp, PMC *value)
141 PMC *key = pmc_new(interp, enum_class_Key);
143 PObj_get_FLAGS(key) |= KEY_pmc_FLAG;
144 internal_exception(1, "this is broken - see slice.pmc");
145 PMC_pmc_val(key) = value;
147 return key;
152 =item C<void
153 key_set_integer(Interp *interp, PMC *key, INTVAL value)>
155 Set the integer C<value> in C<key>.
157 =cut
161 void
162 key_set_integer(Interp *interp, PMC *key, INTVAL value)
164 PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
165 PObj_get_FLAGS(key) |= KEY_integer_FLAG;
166 PMC_int_val(key) = value;
168 return;
173 =item C<void
174 key_set_register(Interp *interp, PMC *key, INTVAL value,
175 INTVAL flag)>
177 Set the register C<value> in C<key>.
179 =cut
183 void
184 key_set_register(Interp *interp, PMC *key, INTVAL value,
185 INTVAL flag)
187 PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
188 PObj_get_FLAGS(key) |= KEY_register_FLAG | flag;
189 PMC_int_val(key) = value;
191 return;
196 =item C<void
197 key_set_number(Interp *interp, PMC *key, FLOATVAL value)>
199 Set the number C<value> in C<key>.
201 =cut
205 void
206 key_set_number(Interp *interp, PMC *key, FLOATVAL value)
208 PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
209 PObj_get_FLAGS(key) |= KEY_number_FLAG;
210 PMC_num_val(key) = value;
212 return;
217 =item C<void
218 key_set_string(Interp *interp, PMC *key, STRING *value)>
220 Set the string C<value> in C<key>.
222 =cut
226 void
227 key_set_string(Interp *interp, PMC *key, STRING *value)
229 PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
230 PObj_get_FLAGS(key) |= KEY_string_FLAG;
231 PMC_str_val(key) = value;
233 return;
238 =item C<void
239 key_set_pmc(Interp *interp, PMC *key, PMC *value)>
241 Set the PMC C<value> in C<key>.
243 =cut
247 void
248 key_set_pmc(Interp *interp, PMC *key, PMC *value)
250 PObj_get_FLAGS(key) &= ~KEY_type_FLAGS;
251 PObj_get_FLAGS(key) |= KEY_pmc_FLAG;
253 * XXX leo
254 * what for is this indirection?
256 internal_exception(1, "this is broken - see slice.pmc");
257 PMC_pmc_val(key) = value;
259 return;
264 =item C<INTVAL
265 key_type(Interp *interp, PMC *key)>
267 Returns the type of C<key>.
269 =cut
273 INTVAL
274 key_type(Interp *interp, PMC *key)
276 return (PObj_get_FLAGS(key) & KEY_type_FLAGS) & ~KEY_register_FLAG;
281 =item C<INTVAL
282 key_integer(Interp *interp, PMC *key)>
284 =cut
288 INTVAL
289 key_integer(Interp *interp, PMC *key)
291 PMC *reg;
292 STRING *s_reg;
294 switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
295 case KEY_hash_iterator_FLAGS:
296 case KEY_integer_FLAG:
297 return PMC_int_val(key);
298 case KEY_integer_FLAG | KEY_register_FLAG:
299 return REG_INT(PMC_int_val(key));
300 case KEY_pmc_FLAG | KEY_register_FLAG:
301 reg = REG_PMC(PMC_int_val(key));
302 return VTABLE_get_integer(interp, reg);
303 case KEY_string_FLAG:
304 return string_to_int(interp, PMC_str_val(key));
305 case KEY_string_FLAG | KEY_register_FLAG:
306 s_reg = REG_STR(PMC_int_val(key));
307 return string_to_int(interp, s_reg);
308 default:
309 /* TODO check for slice_FLAGs */
310 return VTABLE_get_integer(interp, key);
316 =item C<FLOATVAL
317 key_number(Interp *interp, PMC *key)>
319 =cut
323 FLOATVAL
324 key_number(Interp *interp, PMC *key)
326 PMC *reg;
328 switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
329 case KEY_number_FLAG:
330 return PMC_num_val(key);
331 case KEY_number_FLAG | KEY_register_FLAG:
332 return REG_NUM(PMC_int_val(key));
333 case KEY_pmc_FLAG:
334 return VTABLE_get_number(interp, key);
335 /* PMC_pmc_val(key)); */
336 case KEY_pmc_FLAG | KEY_register_FLAG:
337 reg = REG_PMC(PMC_int_val(key));
338 return VTABLE_get_number(interp, reg);
339 default:
340 internal_exception(INVALID_OPERATION, "Key not a number!\n");
341 return 0;
347 =item C<STRING *
348 key_string(Interp *interp, PMC *key)>
350 =cut
354 STRING *
355 key_string(Interp *interp, PMC *key)
357 PMC *reg;
359 switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
360 case KEY_string_FLAG:
361 return PMC_str_val(key);
362 case KEY_string_FLAG | KEY_register_FLAG:
363 return REG_STR(PMC_int_val(key));
364 /* PMC_pmc_val(key)); */
365 case KEY_pmc_FLAG | KEY_register_FLAG:
366 reg = REG_PMC(PMC_int_val(key));
367 return VTABLE_get_string(interp, reg);
368 case KEY_integer_FLAG:
369 return string_from_int(interp, PMC_int_val(key));
370 case KEY_integer_FLAG | KEY_register_FLAG:
371 return string_from_int(interp, REG_INT(PMC_int_val(key)));
372 default:
373 case KEY_pmc_FLAG:
374 return VTABLE_get_string(interp, key);
380 =item C<PMC *
381 key_pmc(Interp *interp, PMC *key)>
383 These functions return the integer/number/string/PMC values of C<key> if
384 possible. Otherwise they throws an exceptions.
386 =cut
390 PMC *
391 key_pmc(Interp *interp, PMC *key)
393 switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
394 case KEY_pmc_FLAG | KEY_register_FLAG:
395 return REG_PMC(PMC_int_val(key));
396 default:
397 return key; /* PMC_pmc_val(key); */
403 =item C<PMC *
404 key_next(Interp *interp, PMC *key)>
406 Returns the next key if C<key> is in a sequence of linked keys.
408 =cut
412 PMC *
413 key_next(Interp *interp, PMC *key)
415 if (!key->pmc_ext)
416 return NULL;
417 return (PMC *)PMC_data(key);
422 =item C<PMC *
423 key_append(Interp *interp, PMC *key1, PMC *key2)>
425 Appends C<key2> to C<key1>.
427 Note that if C<key1> is not the last key in a sequence linked keys then
428 the last key will be found and C<key2> appended to that.
430 Returns C<key1>.
432 =cut
436 PMC *
437 key_append(Interp *interp, PMC *key1, PMC *key2)
439 PMC *tail = key1;
441 while (PMC_data(tail)) {
442 tail = (PMC *)PMC_data(tail);
445 PMC_data(tail) = key2;
447 return key1;
452 =item C<void
453 key_mark(Interp *interp, PMC *key)>
455 Marks C<key> as live.
457 =cut
461 void
462 key_mark(Interp *interp, PMC *key)
464 UINTVAL flags;
466 flags = PObj_get_FLAGS(key) & KEY_type_FLAGS;
467 if (flags == KEY_string_FLAG)
468 pobject_lives(interp, (PObj *)PMC_str_val(key));
470 * KEY_hash_iterator_FLAGS denote a hash key iteration, PMC_data() is
471 * the bucket_index and not the next key component
473 if (flags == KEY_hash_iterator_FLAGS)
474 return;
476 /* if iteration hasn't started, above flag isn't set yet */
477 if (PMC_data(key) && PMC_data(key) != (void *)INITBucketIndex)
478 pobject_lives(interp, (PObj *)PMC_data(key));
484 =item C<STRING *
485 key_set_to_string(Interp *interpreter, PMC *key)>
487 =cut
491 STRING *
492 key_set_to_string(Interp *interp, PMC *key)
494 PMC *reg;
495 STRING *semicolon = string_from_cstring(interp, " ; ", 3);
496 STRING *quote = string_from_cstring(interp, "'", 1);
497 STRING *value = string_from_cstring(interp, "[ ", 2);
499 for (; key; key = (PMC *)PMC_data(key)) {
500 switch (PObj_get_FLAGS(key) & KEY_type_FLAGS) {
501 case KEY_integer_FLAG:
502 string_append(interp, value, string_from_int(interp, PMC_int_val(key)));
503 break;
504 case KEY_string_FLAG:
505 string_append(interp, value, quote);
506 string_append(interp, value, PMC_str_val(key));
507 string_append(interp, value, quote);
508 break;
509 case KEY_pmc_FLAG:
510 string_append(interp, value, VTABLE_get_string(interp, key));
511 break;
512 case KEY_integer_FLAG | KEY_register_FLAG:
513 string_append(interp, value, string_from_int(interp, REG_INT(PMC_int_val(key))));
514 break;
515 case KEY_string_FLAG | KEY_register_FLAG:
516 string_append(interp, value, quote);
517 string_append(interp, value, REG_STR(PMC_int_val(key)));
518 string_append(interp, value, quote);
519 break;
520 case KEY_pmc_FLAG | KEY_register_FLAG:
521 reg = REG_PMC(PMC_int_val(key));
522 string_append(interp, value, VTABLE_get_string(interp, reg));
523 break;
524 default:
525 string_append(interp, value, string_from_cstring(interp, "Key type unknown", 0));
526 break;
529 if (PMC_data(key))
530 string_append(interp, value, semicolon);
532 string_append(interp, value, string_from_cstring(interp, " ]", 2));
533 return value;
538 =back
540 =head1 SEE ALSO
542 F<include/parrot/key.h>.
544 =head1 HISTORY
546 Initial version by Jeff G. on 2001.12.05.
548 =cut
554 * Local variables:
555 * c-file-style: "parrot"
556 * End:
557 * vim: expandtab shiftwidth=4: