void GDAFile::add(Common::SeekableReadStream *gda) { try { _gff4s.push_back(new GFF4File(gda, kG2DAID)); const GFF4Struct &top = _gff4s.back()->getTopLevel(); _rows.push_back(&top.getList(kGFF4G2DARowList)); _rowStarts.push_back(_rowCount); _rowCount += _rows.back()->size(); Columns columns = &top.getList(kGFF4G2DAColumnList); if (columns->size() != _columns->size()) throw Common::Exception("Column counts don't match (%u vs. %u)", (uint)columns->size(), (uint)_columns->size()); for (size_t i = 0; i < columns->size(); i++) { const uint32 hash1 = (uint32) (* columns)[i]->getUint(kGFF4G2DAColumnHash); const uint32 hash2 = (uint32) (*_columns)[i]->getUint(kGFF4G2DAColumnHash); const uint32 type1 = identifyType( columns, _rows.back(), i); const uint32 type2 = identifyType(_columns, _rows[0] , i); if ((hash1 != hash2) || (type1 != type2)) throw Common::Exception("Columns don't match (%u: %u+%u vs. %u+%u)", (uint) i, hash1, type1, hash2, type2); } } catch (Common::Exception &e) { clear(); e.add("Failed adding GDA file"); throw; } }
void main_process(char input[]) { inputType t; t = identifyType(input); verify_order(t); switch (t) { case DIRECTIVE: treat_directive(input); break; case COMMENT: treat_comment(input); break; case LABEL: //treat_label(input); break; case INSTRUCTION: treat_instruction(input); break; case ERROR: break; case NONE: break; } }
void GDAFile::load(Common::SeekableReadStream *gda) { try { _gff4s.push_back(new GFF4File(gda, kG2DAID)); const GFF4Struct &top = _gff4s.back()->getTopLevel(); _columns = &top.getList(kGFF4G2DAColumnList); _rows.push_back(&top.getList(kGFF4G2DARowList)); _rowStarts.push_back(_rowCount); _rowCount += _rows.back()->size(); _headers.resize(_columns->size()); for (size_t i = 0; i < _columns->size(); i++) { if (!(*_columns)[i]) continue; _headers[i].hash = (uint32) (*_columns)[i]->getUint(kGFF4G2DAColumnHash); _headers[i].type = (Type) identifyType(_columns, _rows.back(), i); _headers[i].field = (uint32) kGFF4G2DAColumn1 + i; } } catch (Common::Exception &e) { clear(); e.add("Failed reading GDA file"); throw; } }
void pre_process(char input[]) { inputType t = identifyType(input); switch (t) { // Does the basic operations in order to compute the labels in the pre process cicle case DIRECTIVE: if(!strcmp(input, ".word")) memoryPosition++; else if(!strcmp(input, ".wfill")) { long long int n; read_number_generic(&n); memoryPosition += n; } else if(!strcmp(input, ".align")) { long long int n; read_number_generic(&n); if(instructionPos == LEFT) { while(memoryPosition % n) { _increment(true); } } else { _increment(false); while(memoryPosition % n) { _increment(true); } } } else if(!strcmp(input, ".org")) { long long int n; read_number_generic(&n); _change_position(n); } read_junk(); break; case COMMENT: treat_comment(input); break; case LABEL: treat_label(input); break; case INSTRUCTION: read_junk(); _increment(false); break; case ERROR: break; case NONE: break; } }
string CLBuiltInMethod::getDeserialMethod(CLAbstractType * v_elementType ,string base_ptr ) { string t_type = identifyType(v_elementType); string t_strOff = to_string((long long )v_elementType->getOff()); if(v_elementType->getPtrFlag()&&v_elementType->getArrFlag()) { string t_strTypeLen = "8"; string t_arrSize = to_string((long long )v_elementType->getTypeLen() * (long long)v_elementType->getArrSize()); string ret = "("+t_type+" *)("+base_ptr+"["+t_strOff+"]) = new "+t_type+";\n\t"; ret += "memcpy((char *)("+base_ptr+"["+t_strOff+"]),&in[m_buf_pos],"+t_strTypeLen+");\n\tm_buf_pos += "+t_strTypeLen+";\n\t"; return ret; } else if(v_elementType->getArrFlag()) { string t_strTypeLen = to_string((long long )v_elementType->getTypeLen() * (long long)v_elementType->getArrSize()); string ret = "memcpy(&"+base_ptr+"["+t_strOff+"],&in[m_buf_pos],"+t_strTypeLen+");\n\tm_buf_pos += "+t_strTypeLen+";\n\t"; return ret; } else if(v_elementType->getPtrFlag()) { string t_strTypeLen = to_string((long long )v_elementType->m_type_len); string ret = "*((long *)(&"+base_ptr+"["+t_strOff+"])) = (long )new "+t_type+"[ (*(unsigned int *)(&"+base_ptr+"["+((CLBuiltInType *)v_elementType)->m_sizeOff+"]))];\n\t"; ret += "memcpy((char *)*((long *)&("+base_ptr+"["+t_strOff+"])) ,&in[m_buf_pos],"+t_strTypeLen+"* (*(unsigned int *)(&"+base_ptr+"["+((CLBuiltInType *)v_elementType)->m_sizeOff+"])));\n\tm_buf_pos += "+t_strTypeLen+"* (*(unsigned int *)(&"+base_ptr+"["+((CLBuiltInType *)v_elementType)->m_sizeOff+"]));\n\t"; return ret; } else { string t_strTypeLen = to_string((long long )v_elementType->getTypeLen()); string ret = "*(("+t_type+" *)&"+base_ptr+"["+t_strOff+"]) = *(("+t_type+" *)&in[m_buf_pos]);\n\tm_buf_pos += "+t_strTypeLen+";\n\t"; return ret; } }
SbkObjectType* identifyType(void** cptr, SbkObjectType* type, SbkObjectType* baseType) const { Edges::const_iterator edgesIt = m_edges.find(type); if (edgesIt != m_edges.end()) { const NodeList& adjNodes = m_edges.find(type)->second; NodeList::const_iterator i = adjNodes.begin(); for (; i != adjNodes.end(); ++i) { SbkObjectType* newType = identifyType(cptr, *i, baseType); if (newType) return newType; } } void* typeFound = ((type->d && type->d->type_discovery) ? type->d->type_discovery(*cptr, baseType) : 0); if (typeFound) { // This "typeFound != type" is needed for backwards compatibility with old modules using a newer version of // libshiboken because old versions of type_discovery function used to return a SbkObjectType* instead of // a possible variation of the C++ instance pointer (*cptr). if (typeFound != type) *cptr = typeFound; return type; } else { return 0; } }