VariableSymbol *build_string_constant_variable(SuifEnv *env,const char *string) { TypeBuilder *tb = (TypeBuilder *) env->get_object_factory(TypeBuilder::get_class_name()); IntegerType *char_type = tb->get_integer_type(sizeof(char)*BITSPERBYTE, sizeof(char)*BITSPERBYTE,true); size_t len = 0; while (string[len]) len ++; QualifiedType *q_char_type = tb->get_qualified_type(char_type); ArrayType *string_literal_type = tb->get_array_type(q_char_type,0,len + 1); MultiValueBlock *string_literal_initialization = create_multi_value_block(env,string_literal_type); for (size_t char_num = 0; char_num <= len; ++char_num) { string_literal_initialization->add_sub_block( char_num, create_expression_value_block( env, create_int_constant( env,char_type,string[char_num]))); } return build_initialized_variable(env,emptyLString,string_literal_type, string_literal_initialization,true); }
Walker::ApplyStatus NonConstBoundArrayTypeWalker::operator () (SuifObject *x) { ArrayTypeProxy type(to<DataType>(x)); if (!type.has_non_const_bounds()) return Walker::Continue; Type *rep_type = _type_builder->get_array_type(_type_builder->get_qualified_type(type.get_element_type()),0,1); set_address(rep_type); to<BasicSymbolTable>(x->get_parent())->remove_symbol_table_object( to<SymbolTableObject>(x)); return Walker::Replaced; }