corto_void* corto_value_ptrof(corto_value* val) { corto_void* result; switch(val->kind) { case CORTO_OBJECT: result = val->is.object.o; break; case CORTO_BASE: result = val->is.base.v; break; case CORTO_LITERAL: result = &val->is.literal.v; break; case CORTO_VALUE: case CORTO_MEM: result = val->is.value.v; break; case CORTO_MEMBER: result = val->is.member.v; break; case CORTO_CONSTANT: result = val->is.constant.v; break; case CORTO_ELEMENT: result = val->is.element.v; break; case CORTO_MAP_ELEMENT: result = val->is.mapElement.v; break; default: corto_critical("corto_value_ptrof: invalid corto_valueKind(%d).", val->kind); result = NULL; break; } return result; }
corto_int16 corto_value_ptrset(corto_value *val, void *ptr) { switch(val->kind) { case CORTO_OBJECT: val->is.object.o = ptr; break; case CORTO_BASE: val->is.base.v = ptr; break; case CORTO_VALUE: case CORTO_MEM: val->is.value.v = ptr; break; case CORTO_MEMBER: val->is.member.v = ptr; break; case CORTO_CONSTANT: val->is.constant.v = ptr; break; case CORTO_ELEMENT: val->is.element.v = ptr; break; case CORTO_MAP_ELEMENT: val->is.mapElement.v = ptr; break; case CORTO_LITERAL: corto_seterr("cannot set pointer for literal"); goto error; default: corto_critical("corto_value_ptrset: invalid corto_valueKind(%d).", val->kind); break; } return 0; error: return -1; }
/* Set data of current element. */ void corto_llIterSet(corto_iter* iter, void* o) { if (corto_iterData(*iter)->cur) { ((corto_llNode)corto_iterData(*iter)->cur)->data = o; } else { corto_critical("Illegal use of 'set' by corto_iter: no element selected. Use 'next' to select an element first."); } }
/* Remove the last-read element from the iterator. */ void* corto_llIterRemove(corto_iter* iter) { corto_llNode current; void* result; result = 0; if ((current = corto_iterData(*iter)->cur)) { if ((corto_iterData(*iter)->list)->first == current) { (corto_iterData(*iter)->list)->first = current->next; } if ((corto_iterData(*iter)->list)->last == current) { (corto_iterData(*iter)->list)->last = current->next; } if (current->prev) { current->prev->next = current->next; } if (current->next) { current->next->prev = current->prev; } result = current->data; free(current); (corto_iterData(*iter)->list)->size--; } else { corto_critical("Illegal use of 'remove' by corto_iter: no element selected. Use 'next' to select an element first."); } return result; }
static void* html_getDocMember(corto_object doc, corto_string member, htmlData_t *data) { corto_member m = corto_interface_resolveMember(data->docClass, member); void *result = NULL; if (m) { result = CORTO_OFFSET(doc, m->offset); } else { corto_critical("member description not found in doc class"); } return result; }
void* corto_llIterMove(corto_iter* iter, unsigned int index) { void* result; result = NULL; if (corto_iterData(*iter)->list->size <= index) { corto_critical("iterMove exceeds list-bound (%d >= %d).", index, (corto_iterData(*iter)->list)->size); } corto_iterMoveFirst(iter); while(index) { result = corto_iterNext(iter); index--; } return result; }
/* Take next element of iterator */ void* corto_llIterNextPtr(corto_iter* iter) { corto_llNode current; void* result; current = corto_iterData(*iter)->next; result = 0; if (current) { corto_iterData(*iter)->next = current->next; result = ¤t->data; corto_iterData(*iter)->cur = current; } else { corto_critical("Illegal use of 'next' by corto_iter. Use 'hasNext' to check if data is still available."); } return result; }
corto_type corto_value_typeof(corto_value* val) { corto_type result; switch(val->kind) { case CORTO_OBJECT: result = val->is.object.t; break; case CORTO_BASE: result = val->is.base.t; break; case CORTO_VALUE: case CORTO_MEM: result = val->is.value.t; break; case CORTO_LITERAL: switch(val->is.literal.kind) { case CORTO_LITERAL_BOOLEAN: result = corto_type(corto_bool_o); break; case CORTO_LITERAL_CHARACTER: result = corto_type(corto_char_o); break; case CORTO_LITERAL_INTEGER: result = corto_type(corto_int64_o); break; case CORTO_LITERAL_UNSIGNED_INTEGER: result = corto_type(corto_uint64_o); break; case CORTO_LITERAL_FLOATING_POINT: result = corto_type(corto_float64_o); break; case CORTO_LITERAL_STRING: result = corto_type(corto_string_o); break; case CORTO_LITERAL_NULL: result = NULL; break; default: corto_critical("corto_value_typeof: invalid corto_literalKind(%d)", val->is.literal.kind); result = NULL; break; } break; case CORTO_MEMBER: result = val->is.member.t->type; break; case CORTO_CONSTANT: result = corto_value_typeof(val->parent); break; case CORTO_ELEMENT: result = val->is.element.t.type; break; case CORTO_MAP_ELEMENT: result = val->is.mapElement.t.type; break; default: corto_critical("corto_value_typeof: invalid corto_valueKind(%d).", val->kind); result = NULL; break; } return result; }