44#include " tensor_external_data_info.h"
55#include " core/common/common.h"
66#include " core/common/narrow.h"
7+ #include " core/common/parse_string.h"
78#include " core/common/safeint.h"
89#include " core/common/string_utils.h"
910#include " core/platform/path_lib.h"
@@ -18,21 +19,8 @@ using ::ONNX_NAMESPACE::StringStringEntryProto;
1819
1920namespace onnxruntime {
2021Status ExternalDataInfo::Create (const RepeatedPtrField<StringStringEntryProto>& input,
21- std::unique_ptr<ExternalDataInfo>& out) {
22- auto str_to_int = [](const std::string& s, OFFSET_TYPE& result) -> Status {
23- char * end;
24- #ifdef _WIN32
25- result = _strtoi64 (s.c_str (), &end, 10 );
26- #else
27- result = OrtStrToPtrDiff (s.c_str (), &end);
28- #endif
29- if (end != s.c_str () + s.length ()) {
30- return ORT_MAKE_STATUS (ONNXRUNTIME, FAIL, " parsing " , s, " failed" );
31- }
32- return Status::OK ();
33- };
34-
35- out = std::make_unique<ExternalDataInfo>();
22+ std::unique_ptr<ExternalDataInfo>& external_data_info_result) {
23+ auto external_data_info = std::make_unique<ExternalDataInfo>();
3624 PrepackedInfos prepacked_infos;
3725
3826 const int input_size = input.size ();
@@ -43,17 +31,15 @@ Status ExternalDataInfo::Create(const RepeatedPtrField<StringStringEntryProto>&
4331 return ORT_MAKE_STATUS (ONNXRUNTIME, FAIL, " model format error! Need a key for the external data info" );
4432 if (!stringmap.has_value ())
4533 return ORT_MAKE_STATUS (ONNXRUNTIME, FAIL, " model format error! Need a value for the external data info" );
34+
4635 if (stringmap.key () == " location" && !stringmap.value ().empty ()) {
47- out ->rel_path_ = ToWideString (stringmap.value ());
36+ external_data_info ->rel_path_ = ToWideString (stringmap.value ());
4837 } else if (stringmap.key () == " offset" && !stringmap.value ().empty ()) {
49- ORT_RETURN_IF_ERROR (str_to_int (stringmap.value (), out ->offset_ ));
38+ ORT_RETURN_IF_ERROR (ParseStringWithClassicLocale (stringmap.value (), external_data_info ->offset_ ));
5039 } else if (stringmap.key () == " length" && !stringmap.value ().empty ()) {
51- char * end;
52- out->length_ = narrow<size_t >(OrtStrToPtrDiff (stringmap.value ().c_str (), &end));
53- if (end != stringmap.value ().c_str () + stringmap.value ().length ())
54- return ORT_MAKE_STATUS (ONNXRUNTIME, FAIL, " parsing " , stringmap.value (), " failed" );
40+ ORT_RETURN_IF_ERROR (ParseStringWithClassicLocale (stringmap.value (), external_data_info->length_ ));
5541 } else if (stringmap.key () == " checksum" && !stringmap.value ().empty ()) {
56- out ->checksum_ = stringmap.value ();
42+ external_data_info ->checksum_ = stringmap.value ();
5743 } else if (stringmap.key ().find (" prepacked" , 0 ) == 0 ) {
5844 // Starts with 'prepacked', each has its own key.
5945 // Each prepacked entry may have multiple blobs with the same key
@@ -72,10 +58,11 @@ Status ExternalDataInfo::Create(const RepeatedPtrField<StringStringEntryProto>&
7258 const auto & blob = split_fields[f];
7359 auto blob_fields = utils::SplitString (blob, " ;" , false );
7460 if (blob_fields.size () == 3 ) {
75- OFFSET_TYPE offset, len;
76- ORT_RETURN_IF_ERROR (str_to_int (std::string (blob_fields[0 ]), offset));
77- ORT_RETURN_IF_ERROR (str_to_int (std::string (blob_fields[1 ]), len));
78- blob_infos.push_back (std::make_tuple (offset, narrow<size_t >(len), std::string (blob_fields[2 ])));
61+ OFFSET_TYPE offset;
62+ size_t len;
63+ ORT_RETURN_IF_ERROR (ParseStringWithClassicLocale (blob_fields[0 ], offset));
64+ ORT_RETURN_IF_ERROR (ParseStringWithClassicLocale (blob_fields[1 ], len));
65+ blob_infos.push_back (std::make_tuple (offset, len, std::string (blob_fields[2 ])));
7966 }
8067 }
8168 if (blob_infos.empty ()) {
@@ -88,14 +75,15 @@ Status ExternalDataInfo::Create(const RepeatedPtrField<StringStringEntryProto>&
8875 }
8976 }
9077
91- if (out ->rel_path_ .empty ()) {
78+ if (external_data_info ->rel_path_ .empty ()) {
9279 return ORT_MAKE_STATUS (ONNXRUNTIME, FAIL, " model format error! Missing 'location'" );
9380 }
9481
9582 if (!prepacked_infos.empty ()) {
96- out ->prepacked_infos_ = std::move (prepacked_infos);
83+ external_data_info ->prepacked_infos_ = std::move (prepacked_infos);
9784 }
9885
86+ external_data_info_result = std::move (external_data_info);
9987 return Status::OK ();
10088}
10189void ExternalDataInfo::SetExternalLocationToProto (const std::filesystem::path& external_file_path,
0 commit comments