Пример #1
0
const atom*		__equal(const atom** list)
{
  int			index;
  const atom*		current;

  current = list[0];
  for (index = 1; list[index] != 0; ++index)
    if (final_value(current) != final_value(list[index]))
      return (atom_res(BOOLEAN, false));
  return (atom_res(BOOLEAN, true));
}
Пример #2
0
const atom*		__or(const atom** list)
{
  int		index;
  
  for (index = 0; list[index] != 0; ++index)
    if (final_value(list[index]) == true)
      return (atom_res(BOOLEAN, true));
  return (atom_res(BOOLEAN, false));
}
Пример #3
0
void cpp_typecheckt::typecheck_enum_body(symbolt &enum_symbol)
{
  typet &type=enum_symbol.type;
  
  exprt &body=static_cast<exprt &>(type.add(ID_body));
  irept::subt &components=body.get_sub();
  
  typet enum_type(ID_symbol);
  enum_type.set(ID_identifier, enum_symbol.name);
  
  mp_integer i=0;
  
  Forall_irep(it, components)
  {
    const irep_idt &name=it->get(ID_name);
    
    if(it->find(ID_value).is_not_nil())
    {
      exprt &value=static_cast<exprt &>(it->add(ID_value));
      typecheck_expr(value);
      make_constant_index(value);
      if(to_integer(value, i))
        throw "failed to produce integer for enum";
    }
    
    exprt final_value(ID_constant, enum_type);
    final_value.set(ID_value, integer2string(i));
    
    symbolt symbol;

    symbol.name=id2string(enum_symbol.name)+"::"+id2string(name);
    symbol.base_name=name;
    symbol.value.swap(final_value);
    symbol.location=static_cast<const locationt &>(it->find(ID_C_location));
    symbol.mode=ID_cpp;
    symbol.module=module;
    symbol.type=enum_type;
    symbol.is_type=false;
    symbol.is_macro=true;
    
    symbolt *new_symbol;
    if(symbol_table.move(symbol, new_symbol))
      throw "cpp_typecheckt::typecheck_enum_body: symbol_table.move() failed";

    cpp_idt &scope_identifier=
      cpp_scopes.put_into_scope(*new_symbol);
    
    scope_identifier.id_class=cpp_idt::SYMBOL;
    
    ++i;
  }
}
Пример #4
0
const atom*		__greater_or_equal(const atom** list)
{
  return (atom_res(BOOLEAN, final_value(list[0]) >= final_value(list[1])));
}
Пример #5
0
const atom*		__less_or_equal(const atom** list)
{
  return (atom_res(BOOLEAN, final_value(list[0]) <= final_value(list[1])));
}
Пример #6
0
const atom*		__less(const atom** list)
{
  return (atom_res(BOOLEAN, final_value(list[0]) < final_value(list[1])));
}
Пример #7
0
const atom*		__not(const atom** list)
{
  return (atom_res(BOOLEAN, !final_value(list[0])));
}
Пример #8
0
const atom*		__different(const atom** list)
{
  return (atom_res(BOOLEAN, final_value(__equal(list)) == false));
}