extent_list init_extent(const_extent_list ranges, const_index_entry_list quantifier_indices, const_user_type_entry_list user_type_table) { register unsigned int ix; extent_list extent = new_extent_list(); for (ix = 0; ix < ranges->sz; ix++) { int v = eval_int_expr(ranges->arr[ix]->from, quantifier_indices, user_type_table); append_extent_list(extent, new_extent(to_expr(new_expr_int(to_type(new_int_type()), v)), to_expr(new_expr_int(to_type(new_int_type()), v)))); } return extent; }
expression_t * expr_primitive_for_type (type_t const * self) { assert (self != NULL); if (self->base.kind == tk_own) self = self->t_own.host; assert (self->base.kind != tk_own); switch (self->base.kind) { case tk_int: return new_expr_int (new_cursor ("", 0), 0); case tk_real: return new_expr_real (new_cursor ("", 0), new_estring_from ("0.0")); case tk_string: return new_expr_string (new_cursor ("", 0), new_estring_from ("")); case tk_bool: return new_expr_bool (new_cursor ("", 0), 1); case tk_unknown: case tk_implicit: case tk_any: case tk_void: case tk_label: case tk_switch: case tk_array: case tk_own: case tk_proc: assert (!"Should never get there!"); }; assert (!"Should never get there!"); return NULL; }
extent_list advance_extent(extent_list extent, const_extent_list ranges, const_index_entry_list quantifier_indices, const_user_type_entry_list user_type_table) { register unsigned int ix; assert(extent->sz == ranges->sz); for (ix = extent->sz - 1; ix < extent->sz; ix--) { int p = eval_int_expr(extent->arr[ix]->from, quantifier_indices, user_type_table); int s = eval_int_expr(extent->arr[ix]->to, quantifier_indices, user_type_table); int r = eval_int_expr(ranges->arr[ix]->from, quantifier_indices, user_type_table); int q = eval_int_expr(ranges->arr[ix]->to, quantifier_indices, user_type_table); rfre_expr(extent->arr[ix]->from); rfre_expr(extent->arr[ix]->to); if (r < q) { if (p < q) { p += 1; s += 1; extent->arr[ix]->from = to_expr(new_expr_int(to_type(new_int_type()), p)); extent->arr[ix]->to = to_expr(new_expr_int(to_type(new_int_type()), s)); break; } } else { if (p > q) { p -= 1; s -= 1; extent->arr[ix]->from = to_expr(new_expr_int(to_type(new_int_type()), p)); extent->arr[ix]->to = to_expr(new_expr_int(to_type(new_int_type()), s)); break; } } extent->arr[ix]->from = to_expr(new_expr_int(to_type(new_int_type()), r)); extent->arr[ix]->to = to_expr(new_expr_int(to_type(new_int_type()), r)); } if (ix >= extent->sz) { rfre_extent_list(extent); return extent_listNIL; } return extent; }