Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
  }
}