const char *string_to_attribute(const char *cfg, AttributeType *out) { const char *pcur = skip_special_symbols(cfg); if (pcur[0] == '\'' || pcur[0] == '"') { AutoBuffer buf; uint8_t t1 = pcur[0]; int str_sz = 0; pcur++; while (*pcur != t1 && *pcur != '\0') { pcur++; str_sz++; } buf.write_bin(&cfg[1], str_sz); pcur++; out->make_string(buf.getBuffer()); } else if (pcur[0] == '[') { pcur++; pcur = skip_special_symbols(pcur); AttributeType new_item; out->make_list(0); while (*pcur != ']' && *pcur != '\0') { pcur = string_to_attribute(pcur, &new_item); out->realloc_list(out->size() + 1); (*out)[out->size() - 1] = new_item; pcur = skip_special_symbols(pcur); if (*pcur == ',') { pcur++; pcur = skip_special_symbols(pcur); } } pcur++; pcur = skip_special_symbols(pcur); } else if (pcur[0] == '{') { AttributeType new_key; AttributeType new_value; out->make_dict(); pcur++; pcur = skip_special_symbols(pcur); while (*pcur != '}' && *pcur != '\0') { pcur = string_to_attribute(pcur, &new_key); pcur = skip_special_symbols(pcur); if (*pcur == ':') { pcur++; } pcur = skip_special_symbols(pcur); pcur = string_to_attribute(pcur, &new_value); (*out)[new_key.to_string()] = new_value; pcur = skip_special_symbols(pcur); if (*pcur == ',') { pcur++; pcur = skip_special_symbols(pcur); } } pcur++; pcur = skip_special_symbols(pcur); if (out->has_key("Type")) { if (strcmp((*out)["Type"].to_string(), IFACE_SERVICE) == 0) { IService *iserv; iserv = static_cast<IService *>( RISCV_get_service((*out)["ModuleName"].to_string())); out->attr_free(); *out = AttributeType(iserv); } else { RISCV_printf(NULL, LOG_ERROR, "Not implemented string to dict. attribute"); } } } else if (pcur[0] == '(') { AutoBuffer buf; char byte_value; pcur++; pcur = skip_special_symbols(pcur); while (*pcur != ')' && *pcur != '\0') { byte_value = 0; for (int n = 0; n < 2; n++) { if (*pcur >= 'A' && *pcur <= 'F') { byte_value = (byte_value << 4) | ((*pcur - 'A') + 10); } else { byte_value = (byte_value << 4) | (*pcur - '0'); } pcur++; } buf.write_bin(&byte_value, 1); pcur = skip_special_symbols(pcur); if (*pcur == ',') { pcur++; pcur = skip_special_symbols(pcur); } } out->make_data(buf.size(), buf.getBuffer()); pcur++; pcur = skip_special_symbols(pcur); } else { pcur = skip_special_symbols(pcur); if (pcur[0] == 'N' && pcur[1] == 'o' && pcur[2] == 'n' && pcur[3] == 'e') { pcur += 4; } else if (pcur[0] == 'f' && pcur[1] == 'a' && pcur[2] == 'l' && pcur[3] == 's' && pcur[4] == 'e') { pcur += 5; out->make_boolean(false); } else if (pcur[0] == 't' && pcur[1] == 'r' && pcur[2] == 'u' && pcur[3] == 'e') { pcur += 4; out->make_boolean(true); } else { char digits[32] = {0}; int digits_cnt = 0; if (pcur[0] == '0' && pcur[1] == 'x') { pcur += 2; digits[digits_cnt++] = '0'; digits[digits_cnt++] = 'x'; } while ((*pcur >= '0' && *pcur <= '9') || (*pcur >= 'a' && *pcur <= 'f') || (*pcur >= 'A' && *pcur <= 'F')) { digits[digits_cnt++] = *pcur++; } int64_t t1 = strtoull(digits, NULL, 0); out->make_int64(t1); } } return pcur; }
TupleType::TupleType( const ListExpr typeInfo ): noAttributes(0), attrTypeArray(0),totalSize(0),refs(1),coreSize(0) { int i = 0; size_t offset = sizeof(uint16_t); try { const string errMsg("TupleType: Wrong list format! Line "); if ( nl->ListLength(typeInfo) != 2) { // ( <tuple> <attr_list> ) throw SecondoException(errMsg + int2Str(__LINE__)); } noAttributes = nl->ListLength( nl->Second( typeInfo ) ); ListExpr rest = nl->Second( typeInfo ); attrTypeArray = new AttributeType[noAttributes]; while( !nl->IsEmpty( rest ) ) { ListExpr list = nl->First( rest ); if (nl->ListLength(list) != 2){ //( <attr_name> <attr_desc> ) throw SecondoException(errMsg + int2Str(__LINE__)); } //list = (a b ...) ListExpr b = nl->Second( list ); rest = nl->Rest( rest ); int algId=0, typeId=0, clsSize=0; if( nl->IsAtom(b) ){ throw SecondoException(errMsg + int2Str(__LINE__)); } ListExpr b1 = nl->First( b ); if( nl->IsAtom( b1 ) ) //b = (b1 b2 ...) { if ( nl->ListLength(b) < 2 ){ throw SecondoException(errMsg + int2Str(__LINE__)); } //b = (algid typeid ...) algId = nl->IntValue( nl->First( b ) ), typeId = nl->IntValue( nl->Second( b ) ), clsSize = (am->SizeOfObj(algId, typeId))(); } else { if ( nl->ListLength(b1) < 2 ){ throw SecondoException(errMsg + int2Str(__LINE__)); } //b1 = ((algid typeid ...) ...) algId = nl->IntValue( nl->First(b1) ); typeId = nl->IntValue( nl->Second(b1) ); clsSize = (am->SizeOfObj(algId, typeId))(); } int currentCoreSize = 0; TypeConstructor* tc = am->GetTC(algId, typeId); int numOfFlobs = tc->NumOfFLOBs(); bool extStorage = false; if ( tc->GetStorageType() == Attribute::Extension ) { currentCoreSize = sizeof(uint32_t); extStorage = true; } else if ( tc->GetStorageType() == Attribute::Default ) { currentCoreSize = clsSize; } else { currentCoreSize = tc->SerializedFixSize(); } //totalSize += clsSize; totalSize += currentCoreSize; attrTypeArray[i++] = AttributeType( algId, typeId, numOfFlobs, clsSize, currentCoreSize, extStorage, offset ); coreSize += currentCoreSize; offset += currentCoreSize; } } catch (SecondoException e) { cerr << e.msg() << endl; cerr << "Input list: " << nl->ToString(typeInfo) << endl; cerr << "Assuming list: " << "(a1 (algid typeid) a2 (algid typeid) ....) or" << endl; cerr << " " << "(a1 ((algid typeid)) a2 ((algid typeid)) ....) " << endl; } }