lib/nbt: Begin implementing nextTagDataLength
							parent
							
								
									027f324f03
								
							
						
					
					
						commit
						86f1ef596f
					
				|  | @ -451,22 +451,62 @@ namespace NBT { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         ErrorOr<uint32_t> nextTagDataSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition){ | ||||
|         //FIXME: instead of blindly passing the error code upwards, choose
 | ||||
|         // one that is applicable to the situation (for example replace
 | ||||
|         // OUT_OF_RANGE with OVERRUN where appropriate)
 | ||||
|         ErrorOr<int32_t> nextTagDataLength(uint8_t data[], uint64_t dataSize, uint64_t currentPosition){ | ||||
| 
 | ||||
|             uint8_t nextTag; | ||||
|             if (dataSize <= currentPosition) { | ||||
|                 return ErrorOr<uint32_t>(true, ErrorCodes::OVERRUN); | ||||
|                 return ErrorOr<int32_t>(true, ErrorCodes::OVERRUN); | ||||
|             } else { | ||||
|                 nextTag = data[currentPosition]; | ||||
|             } | ||||
| 
 | ||||
|             // deal with compound tags separately
 | ||||
|             if (nextTag == TagType::COMPOUND) return ErrorOr<uint32_t>(true, ErrorCodes::NOT_YET_KNOWN); | ||||
|             if (nextTag == TagType::COMPOUND) { | ||||
|                 return ErrorOr<int32_t>(true, ErrorCodes::NOT_YET_KNOWN); | ||||
|             } | ||||
| 
 | ||||
|             // deal with end tag before trying to access the name
 | ||||
|             if (nextTag == TagType::END) return 0; | ||||
|             //TODO: implement for all the remaining types
 | ||||
|             // unknown tag or parsing error
 | ||||
|             return ErrorOr<uint32_t>(true, ErrorCodes::UNKNOWN); | ||||
|             if (nextTag == TagType::END) { | ||||
|                 return ErrorOr<int32_t>(0); | ||||
|             } | ||||
| 
 | ||||
|             // tags that only ever hold one value
 | ||||
|             if (nextTag == TagType::INT8 || nextTag == TagType::INT16 || nextTag == TagType::INT32 || nextTag == TagType::INT64 || nextTag == TagType::FLOAT || nextTag == TagType::DOUBLE) { | ||||
|                 return ErrorOr<int32_t>(1); | ||||
|             } | ||||
| 
 | ||||
|             ErrorOr<int16_t> nameSize = helper::readInt16(data, dataSize, currentPosition+1); | ||||
|             if (nameSize.isError) { | ||||
|                 return ErrorOr<int32_t>(true, nameSize.errorCode); | ||||
|             } | ||||
|             // add type byte and name size bytes
 | ||||
|             uint64_t prefixSize = (uint64_t) nameSize.value + 3; | ||||
|             switch (nextTag) { | ||||
|                 case TagType::INT8_ARRAY: { | ||||
|                     return helper::readInt32(data, dataSize, currentPosition+prefixSize); | ||||
|                 } | ||||
|                 case TagType::STRING: { | ||||
|                     ErrorOr<int16_t> stringSize = helper::readInt16(data, dataSize, currentPosition+prefixSize); | ||||
|                     if (stringSize.isError) { | ||||
|                         return ErrorOr<int32_t>(true, stringSize.errorCode); | ||||
|                     } | ||||
|                     return ErrorOr<int32_t>((int32_t) stringSize.value); | ||||
|                 } | ||||
|                 case TagType::LIST: { | ||||
|                 } | ||||
|                 case TagType::INT32_ARRAY: { | ||||
|                     return helper::readInt32(data, dataSize, currentPosition+prefixSize); | ||||
|                 } | ||||
|                 case TagType::INT64_ARRAY: { | ||||
|                     return helper::readInt32(data, dataSize, currentPosition+prefixSize); | ||||
|                 } | ||||
|                 default: | ||||
|                     // unknown tag or parsing error
 | ||||
|                     return ErrorOr<int32_t>(true, ErrorCodes::UNKNOWN); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -68,7 +68,7 @@ namespace NBT { | |||
|         void writeInt64Array(std::vector<uint8_t>* destination, int64_t data[], uint32_t dataSize); | ||||
| 
 | ||||
|         ErrorOr<uint64_t> nextTagTotalSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition); | ||||
|         ErrorOr<uint32_t> nextTagDataSize(uint8_t data[], uint64_t dataSize, uint64_t currentPosition); | ||||
|         ErrorOr<int32_t> nextTagDataLength(uint8_t data[], uint64_t dataSize, uint64_t currentPosition); | ||||
|     } | ||||
| 
 | ||||
|     namespace TagType { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BodgeMaster
						BodgeMaster