trick/trick_source/codegen/Interface_Code_Gen/PrintFileContents13.cpp
2015-02-26 09:02:31 -06:00

212 lines
7.4 KiB
C++

#include <sstream>
#include <iostream>
#include <fstream>
#include <libgen.h>
#include <sys/stat.h>
#include "PrintFileContents13.hh"
#include "FieldDescription.hh"
#include "ClassValues.hh"
#include "EnumValues.hh"
PrintFileContents13::PrintFileContents13() {}
/**
*/
void PrintFileContents13::printIOHeader(std::ofstream & outfile , std::string header_file_name) {
if ( ! header_file_name.compare("S_source.hh") ) {
header_file_name = "../S_source.hh" ;
}
outfile << "\n"
"/*\n"
" * This file was automatically generated by the ICG based on the file:\n"
" * " << header_file_name << "\n"
" */\n"
"#include \"" << header_file_name << "\"\n"
"#include <stddef.h>\n" // for offsetof()
"#include \"TypeDictionary.hh\"\n"
"#include \"EnumDataType.hh\"\n"
"#include \"CompositeDataType.hh\"\n"
"\n";
}
std::string PrintFileContents13::enumeration_identifier( EnumValues * e ) {
std::ostringstream oss;
EnumValues::NamespaceIterator nsi ;
for ( nsi = e->namespace_begin() ; nsi != e->namespace_end() ; nsi++ ) {
oss << *nsi << "__" ;
}
EnumValues::ContainerClassIterator ci ;
for ( ci = e->container_class_begin() ; ci != e->container_class_end() ; ci++ ) {
oss << *ci << "__" ;
}
oss << e->getName();
return oss.str();
}
/** Prints enumeration attributes */
void PrintFileContents13::print_enum_attr(std::ofstream & outfile , EnumValues * e ) {
EnumValues::NameValueIterator nvit ;
outfile << "class type_" << enumeration_identifier(e) << " {\n"
<< "public:\n"
<< " type_" << enumeration_identifier(e) << "() {\n"
<< " TypeDictionary * type_dict = TypeDictionary::getInstance();\n"
<< " EnumDataType * dataType = new EnumDataType( sizeof(enum " << e->getName() << "));\n"
<< " try {\n"
;
for ( nvit = e->begin() ; nvit != e->end() ; nvit++ ) {
outfile << " dataType->addEnumerator(\"" << (*nvit).first << "\" , " << (*nvit).second << ");\n" ;
}
outfile << " typeDictionary->addTypeDefinition( \"" << e->getName() << "\", dataType );\n"
<< " } catch ( std::logic_error e ) {\n"
<< " std::cerr << e.what();\n"
<< " }\n"
<< " }\n"
<< "};\n"
<< "type_" << enumeration_identifier(e) << " __" << enumeration_identifier(e) << ";\n"
<< "\n"
;
}
/** */
std::string PrintFileContents13::class_identifier( ClassValues * c ) {
std::ostringstream oss;
ClassValues::NamespaceIterator nsi ;
for ( nsi = c->namespace_begin() ; nsi != c->namespace_end() ; nsi++ ) {
oss << *nsi << "__" ;
}
ClassValues::ContainerClassIterator ci ;
for ( ci = c->container_class_begin() ; ci != c->container_class_end() ; ci++ ) {
oss << *ci << "__" ;
}
oss << c->getName();
return oss.str();
}
std::string PrintFileContents13::bit_field_getter_name(ClassValues * c, FieldDescription * f) {
std::ostringstream oss;
oss << " get_" << class_identifier(c) << "__" << f->getName();
return oss.str();
}
std::string PrintFileContents13::bit_field_setter_name(ClassValues * c, FieldDescription * f) {
std::ostringstream oss;
oss << " set_" << class_identifier(c) << "__" << f->getName();
return oss.str();
}
/** Prints attributes for a field */
void PrintFileContents13::print_field_attr(std::ofstream & outfile , ClassValues * c, FieldDescription * fv ) {
if (fv->isBitField()) {
outfile << " " ;
outfile << "dataType->addBitFieldMember(\"" << fv->getName() << "\", "
<< bit_field_getter_name(c,fv) << ", "
<< bit_field_setter_name(c,fv) << ");\n"
;
} else {
int ndims = fv->getNumDims();
// For arrays and/or pointers, generate a dimension-size array.
if (ndims) {
outfile << " " ;
outfile << "unsigned int dim_" << fv->getName() << "[] = {";
for ( unsigned int ii = 0 ; ii < ndims ; ii++ ) {
if (ii) {
outfile << ",";
}
outfile << fv->getArrayDim(ii) ;
}
outfile << "};\n";
}
outfile << " " ;
if (fv->isStatic()) {
outfile << "dataType->addStaticMember( \"";
outfile << fv->getName()
<< "\", &" << c->getName() << "::" << fv->getName() << ", \"" << fv->getTypeName() << "\", ";
} else {
outfile << "dataType->addRegularMember( \"";
outfile << fv->getName() << "\", offsetof(" << c->getName() << ", " << fv->getName() << "), \"" << fv->getTypeName() << "\", ";
}
if (ndims) {
outfile << ndims << ", " << "dim_" << fv->getName() ;
} else {
outfile << "0, NULL" ;
}
outfile <<");\n" ;
}
}
/** Prints class attributes */
void PrintFileContents13::print_class_attr(std::ofstream & outfile , ClassValues * c ) {
ClassValues::FieldIterator fit ;
// Create setters and getters for any bitfields we may have.
for ( fit = c->field_begin() ; fit != c->field_end() ; fit++ ) {
FieldDescription * f = *fit;
if ( f->isBitField()) {
// Create bitfield getter.
outfile << "static " << f->getTypeName() << " " << bit_field_getter_name(c,f) << "()(void* addr) {\n"
<< " return ((" << class_identifier(c) << "*)addr)->" << f->getName() << ";\n"
<< "}\n"
;
// Create bitfield setter.
outfile << "static void " << bit_field_setter_name(c,f) << "(void* addr, "<< f->getTypeName() << " v) {\n"
<< " ((" << class_identifier(c) << "*)addr)->" << f->getName() << " = v;\n"
<< "}\n"
;
}
}
outfile << "class type_" << class_identifier(c) << " {\n"
<< "public:\n"
<< " type_" << class_identifier(c) << "() {\n"
<< " TypeDictionary * type_dict = TypeDictionary::getInstance();\n"
<< " CompositeDataType * dataType = new CompositeDataType( sizeof( " << c->getName() << "));\n"
<< " try {\n"
;
for ( fit = c->field_begin() ; fit != c->field_end() ; fit++ ) {
FieldDescription * field = *fit;
if ( determinePrintAttr(c , field) ) {
print_field_attr( outfile, c, field) ;
}
}
outfile << " typeDictionary->addTypeDefinition( \"" << c->getName() << "\", dataType );\n"
<< " } catch ( std::logic_error e ) {\n"
<< " std::cerr << e.what();\n"
<< " }\n"
<< " }\n"
<< "};\n"
<< "type_" << class_identifier(c) << " __" << class_identifier(c) << ";\n\n"
;
}
/** Prints io_src for a class */
void PrintFileContents13::printClass( std::ofstream & outfile , ClassValues * cv ) {
print_class_attr(outfile, cv) ;
}
/** Prints io_src for an enum */
void PrintFileContents13::printEnum( std::ofstream & outfile , EnumValues * ev ) {
print_enum_attr(outfile, ev) ;
}