Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle-Lite
提交
2bad95ec
P
Paddle-Lite
项目概览
PaddlePaddle
/
Paddle-Lite
通知
338
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
271
列表
看板
标记
里程碑
合并请求
78
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle-Lite
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
271
Issue
271
列表
看板
标记
里程碑
合并请求
78
合并请求
78
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2bad95ec
编写于
10月 09, 2018
作者:
H
hjchen2
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dev-latest' of
https://github.com/hjchen2/paddle-mobile
into dev-latest
上级
58c809e8
2042242a
变更
13
显示空白变更内容
内联
并排
Showing
13 changed file
with
2428 addition
and
2848 deletion
+2428
-2848
.pre-commit-config.yaml
.pre-commit-config.yaml
+1
-1
src/io/executor.cpp
src/io/executor.cpp
+34
-36
src/io/executor.h
src/io/executor.h
+7
-8
src/operators/dequantize_op.cpp
src/operators/dequantize_op.cpp
+0
-1
src/operators/feed_op.cpp
src/operators/feed_op.cpp
+1
-3
src/operators/feed_op.h
src/operators/feed_op.h
+2
-3
src/operators/fetch_op.cpp
src/operators/fetch_op.cpp
+1
-5
src/operators/fetch_op.h
src/operators/fetch_op.h
+0
-1
src/operators/kernel/arm/dequantize_kernel.cpp
src/operators/kernel/arm/dequantize_kernel.cpp
+4
-4
src/operators/kernel/arm/quantize_kernel.cpp
src/operators/kernel/arm/quantize_kernel.cpp
+15
-21
src/operators/quantize_op.cpp
src/operators/quantize_op.cpp
+1
-1
src/protobuf-c/protobuf-c.c
src/protobuf-c/protobuf-c.c
+2361
-2763
tools/pre-commit.hooks/cpplint.hook
tools/pre-commit.hooks/cpplint.hook
+1
-1
未找到文件。
.pre-commit-config.yaml
浏览文件 @
2bad95ec
...
...
@@ -46,7 +46,7 @@ repos:
entry
:
bash ./tools/pre-commit.hooks/cpplint.hook
language
:
system
files
:
(test/|src/).*\.(c|cc|cxx|cpp|h|hpp|hxx)$
exclude
:
(?!.*third_party)^.*$ | (?!.*book)^.*$i | *\.pb\.cpp
exclude
:
(?!.*third_party)^.*$ | (?!.*book)^.*$i | *\.pb\.cpp
| third_party/*
#
...
...
src/io/executor.cpp
浏览文件 @
2bad95ec
...
...
@@ -13,8 +13,8 @@ See the License for the specific language governing permissions and
limitations under the License. */
#include "io/executor.h"
#include <operators/math/gemm.h>
#include <algorithm>
#include <utility>
#include <vector>
#include "common/enforce.h"
#include "common/log.h"
...
...
@@ -26,7 +26,7 @@ limitations under the License. */
#include "framework/program/var_desc.h"
#include "framework/scope.h"
#include "framework/tensor.h"
#include "operators/math/gemm.h"
namespace
paddle_mobile
{
...
...
@@ -34,8 +34,7 @@ using framework::Variable;
template
<
typename
Dtype
,
Precision
P
>
Executor
<
Dtype
,
P
>::
Executor
(
const
framework
::
Program
<
Dtype
>
p
,
const
bool
use_optimize
,
const
bool
loddable
)
const
bool
use_optimize
,
const
bool
loddable
)
:
program_
(
p
),
use_optimize_
(
use_optimize
),
loddable_
(
loddable
)
{
Variable
*
variable_ptr
=
program_
.
scope
->
Var
(
"batch_size"
);
variable_ptr
->
SetValue
<
int
>
(
1
);
...
...
@@ -77,20 +76,20 @@ Executor<Dtype, P>::Executor(const framework::Program<Dtype> p,
}
}
template
<
typename
Dtype
>
template
<
typename
Dtype
>
void
LoadMemInternal
(
void
**
data
,
framework
::
LoDTensor
*
tensor
)
{
char
**
data_buf
=
reinterpret_cast
<
char
**>
(
data
);
int64_t
size
=
tensor
->
numel
();
Dtype
*
tensor_data
=
tensor
->
mutable_data
<
Dtype
>
();
Dtype
*
tensor_data
=
tensor
->
mutable_data
<
Dtype
>
();
if
(
0
)
{
// TODO should be moved into operator init function
// TODO
(hjchen2)
should be moved into operator init function
float
min_value
;
float
max_value
;
memcpy
(
&
min_value
,
data_buf
,
sizeof
(
float
));
memcpy
(
&
max_value
,
data_buf
+
sizeof
(
float
),
sizeof
(
float
));
data_buf
+=
2
*
sizeof
(
float
);
const
float
factor
=
(
max_value
-
min_value
)
/
255.0
;
const
uint8_t
*
uint8_data
=
reinterpret_cast
<
uint8_t
*>
(
data_buf
);
const
uint8_t
*
uint8_data
=
reinterpret_cast
<
uint8_t
*>
(
data_buf
);
for
(
int
k
=
0
;
k
<
size
;
++
k
)
{
tensor_data
[
k
]
=
uint8_data
[
k
]
*
factor
+
min_value
;
}
...
...
@@ -103,21 +102,20 @@ void LoadMemInternal(void **data, framework::LoDTensor *tensor) {
template
<
typename
Dtype
,
Precision
P
>
void
Executor
<
Dtype
,
P
>::
LoadMemory
(
void
**
data
,
const
std
::
shared_ptr
<
framework
::
VarDesc
>
var_desc
,
void
**
data
,
const
std
::
shared_ptr
<
framework
::
VarDesc
>
var_desc
,
framework
::
LoDTensor
*
tensor
)
{
char
**
data_buf
=
reinterpret_cast
<
char
**>
(
data
);
char
**
data_buf
=
reinterpret_cast
<
char
**>
(
data
);
// version
uint32_t
version
=
*
(
reinterpret_cast
<
uint32_t
*>
(
*
data_buf
));
uint32_t
version
=
*
(
reinterpret_cast
<
uint32_t
*>
(
*
data_buf
));
*
data_buf
+=
sizeof
(
uint32_t
);
// lod information
uint64_t
lod_level
=
*
(
reinterpret_cast
<
uint64_t
*>
(
*
data_buf
));
uint64_t
lod_level
=
*
(
reinterpret_cast
<
uint64_t
*>
(
*
data_buf
));
*
data_buf
+=
sizeof
(
uint64_t
);
auto
*
lod
=
tensor
->
mutable_lod
();
lod
->
resize
(
lod_level
);
for
(
uint64_t
i
=
0
;
i
<
lod_level
;
++
i
)
{
uint64_t
size
=
*
(
reinterpret_cast
<
uint64_t
*>
(
*
data_buf
));
uint64_t
size
=
*
(
reinterpret_cast
<
uint64_t
*>
(
*
data_buf
));
*
data_buf
+=
sizeof
(
uint64_t
);
std
::
vector
<
size_t
>
tmp_dim
(
size
/
sizeof
(
size_t
));
memcpy
(
tmp_dim
.
data
(),
*
data_buf
,
size
);
...
...
@@ -125,10 +123,10 @@ void Executor<Dtype, P>::LoadMemory(
*
data_buf
+=
size
;
}
// tensor version
uint32_t
tensor_version
=
*
(
reinterpret_cast
<
uint32_t
*>
(
*
data_buf
));
uint32_t
tensor_version
=
*
(
reinterpret_cast
<
uint32_t
*>
(
*
data_buf
));
*
data_buf
+=
sizeof
(
uint32_t
);
// tensor desc size
int32_t
tensor_desc_size
=
*
(
reinterpret_cast
<
int32_t
*>
(
*
data_buf
));
int32_t
tensor_desc_size
=
*
(
reinterpret_cast
<
int32_t
*>
(
*
data_buf
));
*
data_buf
+=
sizeof
(
int32_t
);
// skip tensor desc
*
data_buf
+=
tensor_desc_size
;
...
...
@@ -138,13 +136,13 @@ void Executor<Dtype, P>::LoadMemory(
// parse tensor from stream
switch
(
tensor_desc
.
DataType
())
{
case
framework
::
VARTYPE_TYPE_FP32
:
LoadMemInternal
<
float
>
(
(
void
**
)
data_buf
,
tensor
);
LoadMemInternal
<
float
>
(
reinterpret_cast
<
void
**>
(
data_buf
)
,
tensor
);
break
;
case
framework
::
VARTYPE_TYPE_INT8
:
LoadMemInternal
<
int8_t
>
(
(
void
**
)
data_buf
,
tensor
);
LoadMemInternal
<
int8_t
>
(
reinterpret_cast
<
void
**>
(
data_buf
)
,
tensor
);
break
;
case
framework
::
VARTYPE_TYPE_INT32
:
LoadMemInternal
<
int
>
(
(
void
**
)
data_buf
,
tensor
);
LoadMemInternal
<
int
>
(
reinterpret_cast
<
void
**>
(
data_buf
)
,
tensor
);
break
;
default:
LOG
(
kLOG_ERROR
)
<<
"data type is not supported"
;
...
...
@@ -164,8 +162,8 @@ void Executor<Dtype, P>::InitMemory() {
char
*
origin_data
=
ReadFileToBuff
(
program_
.
model_path
+
"/"
+
var_desc
->
Name
());
char
*
data
=
origin_data
;
LoadMemory
(
(
void
**
)
&
data
,
var_desc
,
tensor
);
delete
[]
origin_data
;
LoadMemory
(
reinterpret_cast
<
void
**>
(
&
data
)
,
var_desc
,
tensor
);
delete
[]
origin_data
;
}
else
{
if
(
var_desc
->
Type
()
==
framework
::
VARTYPE_TYPE_LOD_TENSOR
)
{
varInputMemory
(
var_desc
,
var
,
tensor
);
...
...
@@ -180,7 +178,7 @@ void Executor<Dtype, P>::InitCombineMemory() {
char
*
origin_data
=
nullptr
;
bool
self_alloc
=
false
;
if
(
program_
.
combined_params_buf
&&
program_
.
combined_params_len
)
{
origin_data
=
(
char
*
)
program_
.
combined_params_buf
;
origin_data
=
reinterpret_cast
<
char
*>
(
program_
.
combined_params_buf
)
;
}
else
{
self_alloc
=
true
;
origin_data
=
ReadFileToBuff
(
program_
.
para_path
);
...
...
@@ -195,7 +193,7 @@ void Executor<Dtype, P>::InitCombineMemory() {
if
(
var_desc
->
Name
()
==
"feed"
||
var_desc
->
Name
()
==
"fetch"
)
{
continue
;
}
LoadMemory
(
(
void
**
)
&
data
,
var_desc
,
tensor
);
LoadMemory
(
reinterpret_cast
<
void
**>
(
&
data
)
,
var_desc
,
tensor
);
}
else
{
if
(
var_desc
->
Type
()
==
framework
::
VARTYPE_TYPE_LOD_TENSOR
)
{
varInputMemory
(
var_desc
,
var
,
tensor
);
...
...
@@ -204,7 +202,7 @@ void Executor<Dtype, P>::InitCombineMemory() {
}
}
if
(
self_alloc
)
{
delete
[]
origin_data
;
delete
[]
origin_data
;
}
LOG
(
kLOG_INFO
)
<<
"init combine memory finish"
;
}
...
...
@@ -402,12 +400,12 @@ void Executor<Dtype, P>::InjectVariable(const framework::Tensor &t,
g_feed_value
->
GetMutable
<
framework
::
LoDTensor
>
();
feed_tensor
->
Resize
(
t
.
dims
());
feed_tensor
->
ShareDataWith
(
t
);
}
;
}
template
<
typename
Dtype
,
Precision
P
>
void
Executor
<
Dtype
,
P
>::
FeedData
(
const
framework
::
Tensor
&
t
)
{
InjectVariable
(
t
,
"feed"
);
}
;
}
template
<
typename
Dtype
,
Precision
P
>
std
::
shared_ptr
<
framework
::
Tensor
>
Executor
<
Dtype
,
P
>::
FetchResult
(
int
id
)
{
...
...
@@ -423,14 +421,14 @@ std::shared_ptr<framework::Tensor> Executor<Dtype, P>::FetchResult(int id) {
auto
*
output_tensor
=
framework
::
GetVarValue
<
framework
::
LoDTensor
>
(
out_keys
[
0
],
output_map
,
*
(
program_
.
scope
));
return
std
::
make_shared
<
framework
::
Tensor
>
(
framework
::
Tensor
(
*
output_tensor
));
}
;
}
template
<
typename
Dtype
,
Precision
P
>
void
Executor
<
Dtype
,
P
>::
Predict_From_To
(
int
start
,
int
end
)
{
std
::
shared_ptr
<
framework
::
BlockDesc
>
to_predict_block
=
to_predict_program_
->
Block
(
0
);
auto
&
ops
=
ops_of_block_
[
*
to_predict_block
.
get
()];
end
=
end
<
0
?
(
int
)
ops
.
size
(
)
:
end
;
end
=
end
<
0
?
static_cast
<
int
>
(
ops
.
size
()
)
:
end
;
PADDLE_MOBILE_ENFORCE
(
start
>=
0
&&
start
<
end
&&
end
<=
ops
.
size
(),
"start or end parameter is wrong"
);
...
...
@@ -451,17 +449,17 @@ void Executor<Dtype, P>::Predict_From_To(int start, int end) {
profile
[
i
].
runEnd
=
(
uint64_t
)
ts
.
tv_sec
*
1e9
+
ts
.
tv_nsec
;
#endif
}
}
;
}
template
<
typename
Dtype
,
Precision
P
>
void
Executor
<
Dtype
,
P
>::
Predict_From
(
int
start
)
{
Predict_From_To
(
start
);
}
;
}
template
<
typename
Dtype
,
Precision
P
>
void
Executor
<
Dtype
,
P
>::
Predict_To
(
int
end
)
{
Predict_From_To
(
0
,
end
);
}
;
}
#endif
template
class
Executor
<
CPU
,
Precision
::
FP32
>;
...
...
src/io/executor.h
浏览文件 @
2bad95ec
...
...
@@ -14,16 +14,16 @@ limitations under the License. */
#pragma once
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "common/types.h"
#include "common/util.h"
#include "framework/lod_tensor.h"
#include "framework/operator.h"
#include "framework/program/program.h"
#include "framework/tensor.h"
#include <memory>
#include <string>
#include <vector>
#include <map>
namespace
paddle_mobile
{
...
...
@@ -36,8 +36,7 @@ class Executor {
// @param use_optimize bool whether use operator fusion to speed up or not
// @param loddable bool
Executor
(
const
framework
::
Program
<
Dtype
>
program
,
const
bool
use_optimize
=
true
,
const
bool
loddable
=
false
);
const
bool
use_optimize
=
true
,
const
bool
loddable
=
false
);
// predict with tensor input
// @param t input tensor to do prediction
...
...
@@ -68,7 +67,7 @@ class Executor {
framework
::
LoDTensor
*
tensor
)
const
;
void
InitMemory
();
void
InitCombineMemory
();
void
LoadMemory
(
void
**
data
,
void
LoadMemory
(
void
**
data
,
const
std
::
shared_ptr
<
framework
::
VarDesc
>
var_desc
,
framework
::
LoDTensor
*
tensor
);
...
...
src/operators/dequantize_op.cpp
浏览文件 @
2bad95ec
...
...
@@ -30,4 +30,3 @@ namespace ops = paddle_mobile::operators;
#ifdef PADDLE_MOBILE_CPU
REGISTER_OPERATOR_CPU
(
dequantize
,
ops
::
DequantizeOp
);
#endif
src/operators/feed_op.cpp
浏览文件 @
2bad95ec
...
...
@@ -12,8 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#include "feed_op.h"
#include "operators/feed_op.h"
namespace
ops
=
paddle_mobile
::
operators
;
...
...
@@ -26,4 +25,3 @@ REGISTER_OPERATOR_MALI_GPU(feed, ops::FeedOp);
#ifdef PADDLE_MOBILE_FPGA
REGISTER_OPERATOR_FPGA
(
feed
,
ops
::
FeedOp
);
#endif
src/operators/feed_op.h
浏览文件 @
2bad95ec
...
...
@@ -44,7 +44,7 @@ class FeedOp : public framework::OperatorBase<DeviceType> {
}
void
RunImpl
()
const
{
auto
input
=
(
Tensor
*
)
const_cast
<
LoD
Tensor
*>
(
param_
.
InputX
());
auto
input
=
reinterpret_cast
<
Tensor
*>
(
param_
.
InputX
());
fpga
::
format_image
(
input
);
auto
input_ptr
=
input
->
data
<
float
>
();
Tensor
*
output
=
param_
.
Out
();
...
...
@@ -53,7 +53,7 @@ class FeedOp : public framework::OperatorBase<DeviceType> {
fpga
::
BypassArgs
args
;
args
.
convert_type
=
fpga
::
DATA_FP32_TO_FP16
;
args
.
layout_type
=
fpga
::
LAYOUT_NO_CONVERT
;
args
.
image
.
address
=
(
void
*
)
input_ptr
;
args
.
image
.
address
=
input_ptr
;
args
.
image
.
channels
=
input
->
dims
()[
1
];
args
.
image
.
height
=
input
->
dims
()[
2
];
args
.
image
.
width
=
input
->
dims
()[
3
];
...
...
@@ -78,4 +78,3 @@ class FeedOp : public framework::OperatorBase<DeviceType> {
}
// namespace operators
}
// namespace paddle_mobile
src/operators/fetch_op.cpp
浏览文件 @
2bad95ec
...
...
@@ -12,10 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#include "fetch_op.h"
namespace
paddle_mobile
{
namespace
operators
{}
}
// namespace paddle_mobile
#include "operators/fetch_op.h"
namespace
ops
=
paddle_mobile
::
operators
;
#ifdef PADDLE_MOBILE_CPU
...
...
@@ -27,4 +24,3 @@ REGISTER_OPERATOR_MALI_GPU(fetch, ops::FetchOp);
#ifdef PADDLE_MOBILE_FPGA
REGISTER_OPERATOR_FPGA
(
fetch
,
ops
::
FetchOp
);
#endif
src/operators/fetch_op.h
浏览文件 @
2bad95ec
...
...
@@ -46,4 +46,3 @@ class FetchOp : public framework::OperatorBase<DeviceType> {
}
// namespace operators
}
// namespace paddle_mobile
src/operators/kernel/arm/dequantize_kernel.cpp
浏览文件 @
2bad95ec
...
...
@@ -23,12 +23,12 @@ limitations under the License. */
namespace
paddle_mobile
{
namespace
operators
{
template
<
>
template
<
>
bool
DequantizeKernel
<
CPU
,
float
>::
Init
(
DequantizeParam
<
CPU
>
*
param
)
{
return
true
;
}
template
<
>
template
<
>
void
DequantizeKernel
<
CPU
,
float
>::
Compute
(
const
DequantizeParam
<
CPU
>
&
param
)
const
{
const
Tensor
*
input
=
param
.
input_
;
...
...
@@ -70,7 +70,7 @@ void DequantizeKernel<CPU, float>::Compute(
}
}
}
// namespace paddle_mobile
}
// namespace operators
}
// namespace paddle_mobile
#endif
src/operators/kernel/arm/quantize_kernel.cpp
浏览文件 @
2bad95ec
...
...
@@ -28,9 +28,7 @@ float32_t vmaxvq_f32(float32x4_t r) {
}
#endif
int32x4_t
vrnd_towards_zero
(
float32x4_t
r
)
{
return
vcvtq_s32_f32
(
r
);
}
int32x4_t
vrnd_towards_zero
(
float32x4_t
r
)
{
return
vcvtq_s32_f32
(
r
);
}
int32x4_t
vrnd_away_zero
(
float32x4_t
r
)
{
float32x4_t
plus
=
vdupq_n_f32
(
0.5
);
...
...
@@ -85,7 +83,7 @@ int32x4_t vrnd_to_even(float32x4_t r) {
smask
=
vsubq_s32
(
smask
,
one
);
rnd
=
vaddq_s32
(
rnd
,
smask
);
return
rnd
;
#endif
#endif
}
#endif
...
...
@@ -93,7 +91,7 @@ namespace paddle_mobile {
namespace
operators
{
static
float
find_abs_max
(
const
Tensor
*
input
)
{
float
max_abs
=
float
(
0
)
;
float
max_abs
=
0.
f
;
const
float
*
x
=
input
->
data
<
const
float
>
();
size_t
size
=
input
->
numel
();
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
...
...
@@ -130,8 +128,7 @@ static float find_abs_max(const Tensor *input) {
return
max_abs
;
}
static
void
quantize_round_to_even
(
const
Tensor
*
input
,
const
float
scale
,
static
void
quantize_round_to_even
(
const
Tensor
*
input
,
const
float
scale
,
Tensor
*
output
)
{
const
float
*
x
=
input
->
data
<
const
float
>
();
int8_t
*
y
=
output
->
data
<
int8_t
>
();
...
...
@@ -183,8 +180,7 @@ static void quantize_round_to_even(const Tensor *input,
}
}
static
void
quantize_round_to_zero
(
const
Tensor
*
input
,
const
float
scale
,
static
void
quantize_round_to_zero
(
const
Tensor
*
input
,
const
float
scale
,
Tensor
*
output
)
{
const
float
*
x
=
input
->
data
<
const
float
>
();
int8_t
*
y
=
output
->
data
<
int8_t
>
();
...
...
@@ -225,8 +221,7 @@ static void quantize_round_to_zero(const Tensor *input,
}
}
static
void
quantize_round_to_nearest
(
const
Tensor
*
input
,
const
float
scale
,
static
void
quantize_round_to_nearest
(
const
Tensor
*
input
,
const
float
scale
,
Tensor
*
output
)
{
const
float
*
x
=
input
->
data
<
const
float
>
();
int8_t
*
y
=
output
->
data
<
int8_t
>
();
...
...
@@ -267,15 +262,14 @@ static void quantize_round_to_nearest(const Tensor *input,
}
}
template
<
>
template
<
>
bool
QuantizeKernel
<
CPU
,
float
>::
Init
(
QuantizeParam
<
CPU
>
*
param
)
{
return
true
;
}
template
<
>
template
<
>
void
QuantizeKernel
<
CPU
,
float
>::
Compute
(
const
QuantizeParam
<
CPU
>
&
param
)
const
{
// TODO
float
max_abs
=
0.
f
;
const
Tensor
*
input
=
param
.
input_
;
Tensor
*
output
=
param
.
out_
;
...
...
@@ -306,7 +300,7 @@ void QuantizeKernel<CPU, float>::Compute(
}
}
}
// namespace paddle_mobile
}
// namespace operators
}
// namespace paddle_mobile
#endif
src/operators/quantize_op.cpp
浏览文件 @
2bad95ec
...
...
@@ -13,6 +13,7 @@ See the License for the specific language governing permissions and
limitations under the License. */
#include "operators/quantize_op.h"
#include <vector>
namespace
paddle_mobile
{
namespace
operators
{
...
...
@@ -32,4 +33,3 @@ namespace ops = paddle_mobile::operators;
#ifdef PADDLE_MOBILE_CPU
REGISTER_OPERATOR_CPU
(
quantize
,
ops
::
QuantizeOp
);
#endif
src/protobuf-c/protobuf-c.c
浏览文件 @
2bad95ec
...
...
@@ -57,7 +57,7 @@
/* Workaround for Microsoft compilers. */
#ifdef _MSC_VER
#
define inline __inline
#define inline __inline
#endif
/**
...
...
@@ -81,7 +81,7 @@
#define MAX_UINT64_ENCODED_SIZE 10
#ifndef PROTOBUF_C_UNPACK_ERROR
#
define PROTOBUF_C_UNPACK_ERROR(...)
#define PROTOBUF_C_UNPACK_ERROR(...)
#endif
const
char
protobuf_c_empty_string
[]
=
""
;
...
...
@@ -93,7 +93,7 @@ const char protobuf_c_empty_string[] = "";
* STRUCT_MEMBER_PTR().
*/
#define STRUCT_MEMBER_P(struct_p, struct_offset) \
((void *) ((uint8_t *)
(struct_p) + (struct_offset)))
((void *)((uint8_t *)
(struct_p) + (struct_offset)))
/**
* Return field in a `ProtobufCMessage` based on offset.
...
...
@@ -102,7 +102,7 @@ const char protobuf_c_empty_string[] = "";
* Cast it to the passed type.
*/
#define STRUCT_MEMBER(member_type, struct_p, struct_offset) \
(*(member_type *)
STRUCT_MEMBER_P((struct_p), (struct_offset)))
(*(member_type *)
STRUCT_MEMBER_P((struct_p), (struct_offset)))
/**
* Return field in a `ProtobufCMessage` based on offset.
...
...
@@ -111,7 +111,7 @@ const char protobuf_c_empty_string[] = "";
* it to a pointer to the passed type.
*/
#define STRUCT_MEMBER_PTR(member_type, struct_p, struct_offset) \
((member_type *)
STRUCT_MEMBER_P((struct_p), (struct_offset)))
((member_type *)
STRUCT_MEMBER_P((struct_p), (struct_offset)))
/* Assertions for magic numbers. */
...
...
@@ -131,43 +131,24 @@ const char protobuf_c_empty_string[] = "";
/* --- version --- */
const
char
*
protobuf_c_version
(
void
)
{
return
PROTOBUF_C_VERSION
;
}
const
char
*
protobuf_c_version
(
void
)
{
return
PROTOBUF_C_VERSION
;
}
uint32_t
protobuf_c_version_number
(
void
)
{
return
PROTOBUF_C_VERSION_NUMBER
;
}
uint32_t
protobuf_c_version_number
(
void
)
{
return
PROTOBUF_C_VERSION_NUMBER
;
}
/* --- allocator --- */
static
void
*
system_alloc
(
void
*
allocator_data
,
size_t
size
)
{
static
void
*
system_alloc
(
void
*
allocator_data
,
size_t
size
)
{
return
malloc
(
size
);
}
static
void
system_free
(
void
*
allocator_data
,
void
*
data
)
{
free
(
data
);
}
static
void
system_free
(
void
*
allocator_data
,
void
*
data
)
{
free
(
data
);
}
static
inline
void
*
do_alloc
(
ProtobufCAllocator
*
allocator
,
size_t
size
)
{
static
inline
void
*
do_alloc
(
ProtobufCAllocator
*
allocator
,
size_t
size
)
{
return
allocator
->
alloc
(
allocator
->
allocator_data
,
size
);
}
static
inline
void
do_free
(
ProtobufCAllocator
*
allocator
,
void
*
data
)
{
if
(
data
!=
NULL
)
allocator
->
free
(
allocator
->
allocator_data
,
data
);
static
inline
void
do_free
(
ProtobufCAllocator
*
allocator
,
void
*
data
)
{
if
(
data
!=
NULL
)
allocator
->
free
(
allocator
->
allocator_data
,
data
);
}
/*
...
...
@@ -183,11 +164,9 @@ static ProtobufCAllocator protobuf_c__allocator = {
/* === buffer-simple === */
void
protobuf_c_buffer_simple_append
(
ProtobufCBuffer
*
buffer
,
size_t
len
,
const
uint8_t
*
data
)
{
ProtobufCBufferSimple
*
simp
=
(
ProtobufCBufferSimple
*
)
buffer
;
void
protobuf_c_buffer_simple_append
(
ProtobufCBuffer
*
buffer
,
size_t
len
,
const
uint8_t
*
data
)
{
ProtobufCBufferSimple
*
simp
=
(
ProtobufCBufferSimple
*
)
buffer
;
size_t
new_len
=
simp
->
len
+
len
;
if
(
new_len
>
simp
->
alloced
)
{
...
...
@@ -195,13 +174,10 @@ protobuf_c_buffer_simple_append(ProtobufCBuffer *buffer,
size_t
new_alloced
=
simp
->
alloced
*
2
;
uint8_t
*
new_data
;
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
while
(
new_alloced
<
new_len
)
new_alloced
+=
new_alloced
;
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
while
(
new_alloced
<
new_len
)
new_alloced
+=
new_alloced
;
new_data
=
do_alloc
(
allocator
,
new_alloced
);
if
(
!
new_data
)
return
;
if
(
!
new_data
)
return
;
memcpy
(
new_data
,
simp
->
data
,
simp
->
len
);
if
(
simp
->
must_free_data
)
do_free
(
allocator
,
simp
->
data
);
...
...
@@ -232,9 +208,7 @@ protobuf_c_buffer_simple_append(ProtobufCBuffer *buffer,
* \return
* Number of bytes required.
*/
static
inline
size_t
get_tag_size
(
uint32_t
number
)
{
static
inline
size_t
get_tag_size
(
uint32_t
number
)
{
if
(
number
<
(
1UL
<<
4
))
{
return
1
;
}
else
if
(
number
<
(
1UL
<<
11
))
{
...
...
@@ -257,9 +231,7 @@ get_tag_size(uint32_t number)
* \return
* Number of bytes required.
*/
static
inline
size_t
uint32_size
(
uint32_t
v
)
{
static
inline
size_t
uint32_size
(
uint32_t
v
)
{
if
(
v
<
(
1UL
<<
7
))
{
return
1
;
}
else
if
(
v
<
(
1UL
<<
14
))
{
...
...
@@ -282,9 +254,7 @@ uint32_size(uint32_t v)
* \return
* Number of bytes required.
*/
static
inline
size_t
int32_size
(
int32_t
v
)
{
static
inline
size_t
int32_size
(
int32_t
v
)
{
if
(
v
<
0
)
{
return
10
;
}
else
if
(
v
<
(
1L
<<
7
))
{
...
...
@@ -309,13 +279,11 @@ int32_size(int32_t v)
* \return
* ZigZag encoded integer.
*/
static
inline
uint32_t
zigzag32
(
int32_t
v
)
{
static
inline
uint32_t
zigzag32
(
int32_t
v
)
{
if
(
v
<
0
)
return
(
-
(
uint32_t
)
v
)
*
2
-
1
;
else
return
(
uint32_t
)(
v
)
*
2
;
return
(
uint32_t
)(
v
)
*
2
;
}
/**
...
...
@@ -328,11 +296,7 @@ zigzag32(int32_t v)
* \return
* Number of bytes required.
*/
static
inline
size_t
sint32_size
(
int32_t
v
)
{
return
uint32_size
(
zigzag32
(
v
));
}
static
inline
size_t
sint32_size
(
int32_t
v
)
{
return
uint32_size
(
zigzag32
(
v
));
}
/**
* Return the number of bytes required to store a 64-bit unsigned integer in
...
...
@@ -343,13 +307,11 @@ sint32_size(int32_t v)
* \return
* Number of bytes required.
*/
static
inline
size_t
uint64_size
(
uint64_t
v
)
{
uint32_t
upper_v
=
(
uint32_t
)
(
v
>>
32
);
static
inline
size_t
uint64_size
(
uint64_t
v
)
{
uint32_t
upper_v
=
(
uint32_t
)(
v
>>
32
);
if
(
upper_v
==
0
)
{
return
uint32_size
((
uint32_t
)
v
);
return
uint32_size
((
uint32_t
)
v
);
}
else
if
(
upper_v
<
(
1UL
<<
3
))
{
return
5
;
}
else
if
(
upper_v
<
(
1UL
<<
10
))
{
...
...
@@ -374,13 +336,11 @@ uint64_size(uint64_t v)
* \return
* ZigZag encoded integer.
*/
static
inline
uint64_t
zigzag64
(
int64_t
v
)
{
static
inline
uint64_t
zigzag64
(
int64_t
v
)
{
if
(
v
<
0
)
return
(
-
(
uint64_t
)
v
)
*
2
-
1
;
else
return
(
uint64_t
)(
v
)
*
2
;
return
(
uint64_t
)(
v
)
*
2
;
}
/**
...
...
@@ -393,11 +353,7 @@ zigzag64(int64_t v)
* \return
* Number of bytes required.
*/
static
inline
size_t
sint64_size
(
int64_t
v
)
{
return
uint64_size
(
zigzag64
(
v
));
}
static
inline
size_t
sint64_size
(
int64_t
v
)
{
return
uint64_size
(
zigzag64
(
v
));
}
/**
* Calculate the serialized size of a single required message field, including
...
...
@@ -410,25 +366,23 @@ sint64_size(int64_t v)
* \return
* Number of bytes required.
*/
static
size_t
required_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
static
size_t
required_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
size_t
rv
=
get_tag_size
(
field
->
id
);
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_SINT32
:
return
rv
+
sint32_size
(
*
(
const
int32_t
*
)
member
);
return
rv
+
sint32_size
(
*
(
const
int32_t
*
)
member
);
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
return
rv
+
int32_size
(
*
(
const
int32_t
*
)
member
);
return
rv
+
int32_size
(
*
(
const
int32_t
*
)
member
);
case
PROTOBUF_C_TYPE_UINT32
:
return
rv
+
uint32_size
(
*
(
const
uint32_t
*
)
member
);
return
rv
+
uint32_size
(
*
(
const
uint32_t
*
)
member
);
case
PROTOBUF_C_TYPE_SINT64
:
return
rv
+
sint64_size
(
*
(
const
int64_t
*
)
member
);
return
rv
+
sint64_size
(
*
(
const
int64_t
*
)
member
);
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
return
rv
+
uint64_size
(
*
(
const
uint64_t
*
)
member
);
return
rv
+
uint64_size
(
*
(
const
uint64_t
*
)
member
);
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
return
rv
+
4
;
...
...
@@ -442,16 +396,16 @@ required_field_get_packed_size(const ProtobufCFieldDescriptor *field,
case
PROTOBUF_C_TYPE_DOUBLE
:
return
rv
+
8
;
case
PROTOBUF_C_TYPE_STRING
:
{
const
char
*
str
=
*
(
char
*
const
*
)
member
;
const
char
*
str
=
*
(
char
*
const
*
)
member
;
size_t
len
=
str
?
strlen
(
str
)
:
0
;
return
rv
+
uint32_size
(
len
)
+
len
;
}
case
PROTOBUF_C_TYPE_BYTES
:
{
size_t
len
=
((
const
ProtobufCBinaryData
*
)
member
)
->
len
;
size_t
len
=
((
const
ProtobufCBinaryData
*
)
member
)
->
len
;
return
rv
+
uint32_size
(
len
)
+
len
;
}
case
PROTOBUF_C_TYPE_MESSAGE
:
{
const
ProtobufCMessage
*
msg
=
*
(
ProtobufCMessage
*
const
*
)
member
;
const
ProtobufCMessage
*
msg
=
*
(
ProtobufCMessage
*
const
*
)
member
;
size_t
subrv
=
msg
?
protobuf_c_message_get_packed_size
(
msg
)
:
0
;
return
rv
+
uint32_size
(
subrv
)
+
subrv
;
}
...
...
@@ -474,20 +428,16 @@ required_field_get_packed_size(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
size_t
oneof_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
static
size_t
oneof_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
uint32_t
oneof_case
,
const
void
*
member
)
{
const
void
*
member
)
{
if
(
oneof_case
!=
field
->
id
)
{
return
0
;
}
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
return
required_field_get_packed_size
(
field
,
member
);
}
...
...
@@ -506,33 +456,26 @@ oneof_field_get_packed_size(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
size_t
optional_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
protobuf_c_boolean
has
,
const
void
*
member
)
{
static
size_t
optional_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
protobuf_c_boolean
has
,
const
void
*
member
)
{
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
else
{
if
(
!
has
)
return
0
;
if
(
!
has
)
return
0
;
}
return
required_field_get_packed_size
(
field
,
member
);
}
static
protobuf_c_boolean
field_is_zeroish
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
static
protobuf_c_boolean
field_is_zeroish
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
protobuf_c_boolean
ret
=
FALSE
;
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_BOOL
:
ret
=
(
0
==
*
(
const
protobuf_c_boolean
*
)
member
);
ret
=
(
0
==
*
(
const
protobuf_c_boolean
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_SINT32
:
...
...
@@ -540,28 +483,28 @@ field_is_zeroish(const ProtobufCFieldDescriptor *field,
case
PROTOBUF_C_TYPE_UINT32
:
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
ret
=
(
0
==
*
(
const
uint32_t
*
)
member
);
ret
=
(
0
==
*
(
const
uint32_t
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_SINT64
:
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
case
PROTOBUF_C_TYPE_SFIXED64
:
case
PROTOBUF_C_TYPE_FIXED64
:
ret
=
(
0
==
*
(
const
uint64_t
*
)
member
);
ret
=
(
0
==
*
(
const
uint64_t
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_FLOAT
:
ret
=
(
0
==
*
(
const
float
*
)
member
);
ret
=
(
0
==
*
(
const
float
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_DOUBLE
:
ret
=
(
0
==
*
(
const
double
*
)
member
);
ret
=
(
0
==
*
(
const
double
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_STRING
:
ret
=
(
NULL
==
*
(
const
char
*
const
*
)
member
)
||
(
'\0'
==
**
(
const
char
*
const
*
)
member
);
ret
=
(
NULL
==
*
(
const
char
*
const
*
)
member
)
||
(
'\0'
==
**
(
const
char
*
const
*
)
member
);
break
;
case
PROTOBUF_C_TYPE_BYTES
:
case
PROTOBUF_C_TYPE_MESSAGE
:
ret
=
(
NULL
==
*
(
const
void
*
const
*
)
member
);
ret
=
(
NULL
==
*
(
const
void
*
const
*
)
member
);
break
;
default:
ret
=
TRUE
;
...
...
@@ -584,12 +527,9 @@ field_is_zeroish(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
size_t
unlabeled_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
static
size_t
unlabeled_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
return
required_field_get_packed_size
(
field
,
member
);
}
...
...
@@ -607,43 +547,34 @@ unlabeled_field_get_packed_size(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
size_t
repeated_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
size_t
count
,
const
void
*
member
)
{
static
size_t
repeated_field_get_packed_size
(
const
ProtobufCFieldDescriptor
*
field
,
size_t
count
,
const
void
*
member
)
{
size_t
header_size
;
size_t
rv
=
0
;
unsigned
i
;
void
*
array
=
*
(
void
*
const
*
)
member
;
void
*
array
=
*
(
void
*
const
*
)
member
;
if
(
count
==
0
)
return
0
;
if
(
count
==
0
)
return
0
;
header_size
=
get_tag_size
(
field
->
id
);
if
(
0
==
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
))
header_size
*=
count
;
if
(
0
==
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
))
header_size
*=
count
;
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_SINT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint32_size
(((
int32_t
*
)
array
)[
i
]);
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint32_size
(((
int32_t
*
)
array
)[
i
]);
break
;
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
int32_size
(((
int32_t
*
)
array
)[
i
]);
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
int32_size
(((
int32_t
*
)
array
)[
i
]);
break
;
case
PROTOBUF_C_TYPE_UINT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint32_size
(((
uint32_t
*
)
array
)[
i
]);
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint32_size
(((
uint32_t
*
)
array
)[
i
]);
break
;
case
PROTOBUF_C_TYPE_SINT64
:
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint64_size
(((
int64_t
*
)
array
)[
i
]);
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint64_size
(((
int64_t
*
)
array
)[
i
]);
break
;
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint64_size
(((
uint64_t
*
)
array
)[
i
]);
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint64_size
(((
uint64_t
*
)
array
)[
i
]);
break
;
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
...
...
@@ -660,20 +591,20 @@ repeated_field_get_packed_size(const ProtobufCFieldDescriptor *field,
break
;
case
PROTOBUF_C_TYPE_STRING
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
size_t
len
=
strlen
(((
char
**
)
array
)[
i
]);
size_t
len
=
strlen
(((
char
**
)
array
)[
i
]);
rv
+=
uint32_size
(
len
)
+
len
;
}
break
;
case
PROTOBUF_C_TYPE_BYTES
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
size_t
len
=
((
ProtobufCBinaryData
*
)
array
)[
i
].
len
;
size_t
len
=
((
ProtobufCBinaryData
*
)
array
)[
i
].
len
;
rv
+=
uint32_size
(
len
)
+
len
;
}
break
;
case
PROTOBUF_C_TYPE_MESSAGE
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
size_t
len
=
protobuf_c_message_get_packed_size
(
((
ProtobufCMessage
**
)
array
)[
i
]);
size_t
len
=
protobuf_c_message_get_packed_size
(((
ProtobufCMessage
**
)
array
)[
i
]);
rv
+=
uint32_size
(
len
)
+
len
;
}
break
;
...
...
@@ -694,9 +625,8 @@ repeated_field_get_packed_size(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
inline
size_t
unknown_field_get_packed_size
(
const
ProtobufCMessageUnknownField
*
field
)
{
static
inline
size_t
unknown_field_get_packed_size
(
const
ProtobufCMessageUnknownField
*
field
)
{
return
get_tag_size
(
field
->
tag
)
+
field
->
len
;
}
...
...
@@ -705,47 +635,31 @@ unknown_field_get_packed_size(const ProtobufCMessageUnknownField *field)
/*
* Calculate the serialized size of the message.
*/
size_t
protobuf_c_message_get_packed_size
(
const
ProtobufCMessage
*
message
)
{
size_t
protobuf_c_message_get_packed_size
(
const
ProtobufCMessage
*
message
)
{
unsigned
i
;
size_t
rv
=
0
;
ASSERT_IS_MESSAGE
(
message
);
for
(
i
=
0
;
i
<
message
->
descriptor
->
n_fields
;
i
++
)
{
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
if
(
field
->
label
==
PROTOBUF_C_LABEL_REQUIRED
)
{
rv
+=
required_field_get_packed_size
(
field
,
member
);
}
else
if
((
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
||
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
&&
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
)))
{
rv
+=
oneof_field_get_packed_size
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
);
rv
+=
oneof_field_get_packed_size
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
)
{
rv
+=
optional_field_get_packed_size
(
field
,
*
(
protobuf_c_boolean
*
)
qmember
,
member
);
field
,
*
(
protobuf_c_boolean
*
)
qmember
,
member
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
{
rv
+=
unlabeled_field_get_packed_size
(
field
,
member
);
rv
+=
unlabeled_field_get_packed_size
(
field
,
member
);
}
else
{
rv
+=
repeated_field_get_packed_size
(
field
,
*
(
const
size_t
*
)
qmember
,
member
);
rv
+=
repeated_field_get_packed_size
(
field
,
*
(
const
size_t
*
)
qmember
,
member
);
}
}
for
(
i
=
0
;
i
<
message
->
n_unknown_fields
;
i
++
)
...
...
@@ -773,9 +687,7 @@ size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
uint32_pack
(
uint32_t
value
,
uint8_t
*
out
)
{
static
inline
size_t
uint32_pack
(
uint32_t
value
,
uint8_t
*
out
)
{
unsigned
rv
=
0
;
if
(
value
>=
0x80
)
{
...
...
@@ -810,9 +722,7 @@ uint32_pack(uint32_t value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
int32_pack
(
int32_t
value
,
uint8_t
*
out
)
{
static
inline
size_t
int32_pack
(
int32_t
value
,
uint8_t
*
out
)
{
if
(
value
<
0
)
{
out
[
0
]
=
value
|
0x80
;
out
[
1
]
=
(
value
>>
7
)
|
0x80
;
...
...
@@ -838,9 +748,7 @@ int32_pack(int32_t value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
sint32_pack
(
int32_t
value
,
uint8_t
*
out
)
{
static
inline
size_t
sint32_pack
(
int32_t
value
,
uint8_t
*
out
)
{
return
uint32_pack
(
zigzag32
(
value
),
out
);
}
...
...
@@ -855,15 +763,12 @@ sint32_pack(int32_t value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
size_t
uint64_pack
(
uint64_t
value
,
uint8_t
*
out
)
{
uint32_t
hi
=
(
uint32_t
)
(
value
>>
32
);
uint32_t
lo
=
(
uint32_t
)
value
;
static
size_t
uint64_pack
(
uint64_t
value
,
uint8_t
*
out
)
{
uint32_t
hi
=
(
uint32_t
)(
value
>>
32
);
uint32_t
lo
=
(
uint32_t
)
value
;
unsigned
rv
;
if
(
hi
==
0
)
return
uint32_pack
((
uint32_t
)
lo
,
out
);
if
(
hi
==
0
)
return
uint32_pack
((
uint32_t
)
lo
,
out
);
out
[
0
]
=
(
lo
)
|
0x80
;
out
[
1
]
=
(
lo
>>
7
)
|
0x80
;
out
[
2
]
=
(
lo
>>
14
)
|
0x80
;
...
...
@@ -895,9 +800,7 @@ uint64_pack(uint64_t value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
sint64_pack
(
int64_t
value
,
uint8_t
*
out
)
{
static
inline
size_t
sint64_pack
(
int64_t
value
,
uint8_t
*
out
)
{
return
uint64_pack
(
zigzag64
(
value
),
out
);
}
...
...
@@ -912,9 +815,7 @@ sint64_pack(int64_t value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
fixed32_pack
(
uint32_t
value
,
void
*
out
)
{
static
inline
size_t
fixed32_pack
(
uint32_t
value
,
void
*
out
)
{
#if !defined(WORDS_BIGENDIAN)
memcpy
(
out
,
&
value
,
4
);
#else
...
...
@@ -943,14 +844,12 @@ fixed32_pack(uint32_t value, void *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
fixed64_pack
(
uint64_t
value
,
void
*
out
)
{
static
inline
size_t
fixed64_pack
(
uint64_t
value
,
void
*
out
)
{
#if !defined(WORDS_BIGENDIAN)
memcpy
(
out
,
&
value
,
8
);
#else
fixed32_pack
(
value
,
out
);
fixed32_pack
(
value
>>
32
,
((
char
*
)
out
)
+
4
);
fixed32_pack
(
value
>>
32
,
((
char
*
)
out
)
+
4
);
#endif
return
8
;
}
...
...
@@ -968,9 +867,7 @@ fixed64_pack(uint64_t value, void *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
boolean_pack
(
protobuf_c_boolean
value
,
uint8_t
*
out
)
{
static
inline
size_t
boolean_pack
(
protobuf_c_boolean
value
,
uint8_t
*
out
)
{
*
out
=
value
?
TRUE
:
FALSE
;
return
1
;
}
...
...
@@ -990,9 +887,7 @@ boolean_pack(protobuf_c_boolean value, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
string_pack
(
const
char
*
str
,
uint8_t
*
out
)
{
static
inline
size_t
string_pack
(
const
char
*
str
,
uint8_t
*
out
)
{
if
(
str
==
NULL
)
{
out
[
0
]
=
0
;
return
1
;
...
...
@@ -1015,9 +910,8 @@ string_pack(const char *str, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
binary_data_pack
(
const
ProtobufCBinaryData
*
bd
,
uint8_t
*
out
)
{
static
inline
size_t
binary_data_pack
(
const
ProtobufCBinaryData
*
bd
,
uint8_t
*
out
)
{
size_t
len
=
bd
->
len
;
size_t
rv
=
uint32_pack
(
len
,
out
);
memcpy
(
out
+
rv
,
bd
->
data
,
len
);
...
...
@@ -1035,17 +929,15 @@ binary_data_pack(const ProtobufCBinaryData *bd, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
inline
size_t
prefixed_message_pack
(
const
ProtobufCMessage
*
message
,
uint8_t
*
out
)
{
static
inline
size_t
prefixed_message_pack
(
const
ProtobufCMessage
*
message
,
uint8_t
*
out
)
{
if
(
message
==
NULL
)
{
out
[
0
]
=
0
;
return
1
;
}
else
{
size_t
rv
=
protobuf_c_message_pack
(
message
,
out
+
1
);
uint32_t
rv_packed_size
=
uint32_size
(
rv
);
if
(
rv_packed_size
!=
1
)
memmove
(
out
+
rv_packed_size
,
out
+
1
,
rv
);
if
(
rv_packed_size
!=
1
)
memmove
(
out
+
rv_packed_size
,
out
+
1
,
rv
);
return
uint32_pack
(
rv
,
out
)
+
rv
;
}
}
...
...
@@ -1064,13 +956,11 @@ prefixed_message_pack(const ProtobufCMessage *message, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
size_t
tag_pack
(
uint32_t
id
,
uint8_t
*
out
)
{
static
size_t
tag_pack
(
uint32_t
id
,
uint8_t
*
out
)
{
if
(
id
<
(
1UL
<<
(
32
-
3
)))
return
uint32_pack
(
id
<<
3
,
out
);
else
return
uint64_pack
(((
uint64_t
)
id
)
<<
3
,
out
);
return
uint64_pack
(((
uint64_t
)
id
)
<<
3
,
out
);
}
/**
...
...
@@ -1085,52 +975,52 @@ tag_pack(uint32_t id, uint8_t *out)
* \return
* Number of bytes written to `out`.
*/
static
size_t
required_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
uint8_t
*
out
)
{
static
size_t
required_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
uint8_t
*
out
)
{
size_t
rv
=
tag_pack
(
field
->
id
,
out
);
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_SINT32
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
sint32_pack
(
*
(
const
int32_t
*
)
member
,
out
+
rv
);
return
rv
+
sint32_pack
(
*
(
const
int32_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
int32_pack
(
*
(
const
int32_t
*
)
member
,
out
+
rv
);
return
rv
+
int32_pack
(
*
(
const
int32_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_UINT32
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
uint32_pack
(
*
(
const
uint32_t
*
)
member
,
out
+
rv
);
return
rv
+
uint32_pack
(
*
(
const
uint32_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_SINT64
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
sint64_pack
(
*
(
const
int64_t
*
)
member
,
out
+
rv
);
return
rv
+
sint64_pack
(
*
(
const
int64_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
uint64_pack
(
*
(
const
uint64_t
*
)
member
,
out
+
rv
);
return
rv
+
uint64_pack
(
*
(
const
uint64_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
case
PROTOBUF_C_TYPE_FLOAT
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_32BIT
;
return
rv
+
fixed32_pack
(
*
(
const
uint32_t
*
)
member
,
out
+
rv
);
return
rv
+
fixed32_pack
(
*
(
const
uint32_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_SFIXED64
:
case
PROTOBUF_C_TYPE_FIXED64
:
case
PROTOBUF_C_TYPE_DOUBLE
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_64BIT
;
return
rv
+
fixed64_pack
(
*
(
const
uint64_t
*
)
member
,
out
+
rv
);
return
rv
+
fixed64_pack
(
*
(
const
uint64_t
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_BOOL
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
return
rv
+
boolean_pack
(
*
(
const
protobuf_c_boolean
*
)
member
,
out
+
rv
);
return
rv
+
boolean_pack
(
*
(
const
protobuf_c_boolean
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_STRING
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
return
rv
+
string_pack
(
*
(
char
*
const
*
)
member
,
out
+
rv
);
return
rv
+
string_pack
(
*
(
char
*
const
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_BYTES
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
return
rv
+
binary_data_pack
((
const
ProtobufCBinaryData
*
)
member
,
out
+
rv
);
return
rv
+
binary_data_pack
((
const
ProtobufCBinaryData
*
)
member
,
out
+
rv
);
case
PROTOBUF_C_TYPE_MESSAGE
:
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
return
rv
+
prefixed_message_pack
(
*
(
ProtobufCMessage
*
const
*
)
member
,
out
+
rv
);
return
rv
+
prefixed_message_pack
(
*
(
ProtobufCMessage
*
const
*
)
member
,
out
+
rv
);
}
PROTOBUF_C__ASSERT_NOT_REACHED
();
return
0
;
...
...
@@ -1151,20 +1041,16 @@ required_field_pack(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes written to `out`.
*/
static
size_t
oneof_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
uint32_t
oneof_case
,
const
void
*
member
,
uint8_t
*
out
)
{
static
size_t
oneof_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
uint32_t
oneof_case
,
const
void
*
member
,
uint8_t
*
out
)
{
if
(
oneof_case
!=
field
->
id
)
{
return
0
;
}
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
return
required_field_pack
(
field
,
member
,
out
);
}
...
...
@@ -1183,20 +1069,15 @@ oneof_field_pack(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes written to `out`.
*/
static
size_t
optional_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
static
size_t
optional_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
const
protobuf_c_boolean
has
,
const
void
*
member
,
uint8_t
*
out
)
{
const
void
*
member
,
uint8_t
*
out
)
{
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
else
{
if
(
!
has
)
return
0
;
if
(
!
has
)
return
0
;
}
return
required_field_pack
(
field
,
member
,
out
);
}
...
...
@@ -1213,12 +1094,9 @@ optional_field_pack(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes written to `out`.
*/
static
size_t
unlabeled_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
uint8_t
*
out
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
static
size_t
unlabeled_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
uint8_t
*
out
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
return
required_field_pack
(
field
,
member
,
out
);
}
...
...
@@ -1232,9 +1110,7 @@ unlabeled_field_pack(const ProtobufCFieldDescriptor *field,
* \return
* Size of the field.
*/
static
inline
size_t
sizeof_elt_in_repeated_array
(
ProtobufCType
type
)
{
static
inline
size_t
sizeof_elt_in_repeated_array
(
ProtobufCType
type
)
{
switch
(
type
)
{
case
PROTOBUF_C_TYPE_SINT32
:
case
PROTOBUF_C_TYPE_INT32
:
...
...
@@ -1273,16 +1149,14 @@ sizeof_elt_in_repeated_array(ProtobufCType type)
* \param[in] n
* Number of elements in the source array.
*/
static
void
copy_to_little_endian_32
(
void
*
out
,
const
void
*
in
,
const
unsigned
n
)
{
static
void
copy_to_little_endian_32
(
void
*
out
,
const
void
*
in
,
const
unsigned
n
)
{
#if !defined(WORDS_BIGENDIAN)
memcpy
(
out
,
in
,
n
*
4
);
#else
unsigned
i
;
const
uint32_t
*
ini
=
in
;
for
(
i
=
0
;
i
<
n
;
i
++
)
fixed32_pack
(
ini
[
i
],
(
uint32_t
*
)
out
+
i
);
for
(
i
=
0
;
i
<
n
;
i
++
)
fixed32_pack
(
ini
[
i
],
(
uint32_t
*
)
out
+
i
);
#endif
}
...
...
@@ -1296,16 +1170,14 @@ copy_to_little_endian_32(void *out, const void *in, const unsigned n)
* \param[in] n
* Number of elements in the source array.
*/
static
void
copy_to_little_endian_64
(
void
*
out
,
const
void
*
in
,
const
unsigned
n
)
{
static
void
copy_to_little_endian_64
(
void
*
out
,
const
void
*
in
,
const
unsigned
n
)
{
#if !defined(WORDS_BIGENDIAN)
memcpy
(
out
,
in
,
n
*
8
);
#else
unsigned
i
;
const
uint64_t
*
ini
=
in
;
for
(
i
=
0
;
i
<
n
;
i
++
)
fixed64_pack
(
ini
[
i
],
(
uint64_t
*
)
out
+
i
);
for
(
i
=
0
;
i
<
n
;
i
++
)
fixed64_pack
(
ini
[
i
],
(
uint64_t
*
)
out
+
i
);
#endif
}
...
...
@@ -1318,19 +1190,13 @@ copy_to_little_endian_64(void *out, const void *in, const unsigned n)
* \return
* Number of bytes.
*/
static
unsigned
get_type_min_size
(
ProtobufCType
type
)
{
if
(
type
==
PROTOBUF_C_TYPE_SFIXED32
||
type
==
PROTOBUF_C_TYPE_FIXED32
||
type
==
PROTOBUF_C_TYPE_FLOAT
)
{
static
unsigned
get_type_min_size
(
ProtobufCType
type
)
{
if
(
type
==
PROTOBUF_C_TYPE_SFIXED32
||
type
==
PROTOBUF_C_TYPE_FIXED32
||
type
==
PROTOBUF_C_TYPE_FLOAT
)
{
return
4
;
}
if
(
type
==
PROTOBUF_C_TYPE_SFIXED64
||
type
==
PROTOBUF_C_TYPE_FIXED64
||
type
==
PROTOBUF_C_TYPE_DOUBLE
)
{
if
(
type
==
PROTOBUF_C_TYPE_SFIXED64
||
type
==
PROTOBUF_C_TYPE_FIXED64
||
type
==
PROTOBUF_C_TYPE_DOUBLE
)
{
return
8
;
}
return
1
;
...
...
@@ -1351,11 +1217,10 @@ get_type_min_size(ProtobufCType type)
* \return
* Number of bytes serialised to `out`.
*/
static
size_t
repeated_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
size_t
count
,
const
void
*
member
,
uint8_t
*
out
)
{
void
*
array
=
*
(
void
*
const
*
)
member
;
static
size_t
repeated_field_pack
(
const
ProtobufCFieldDescriptor
*
field
,
size_t
count
,
const
void
*
member
,
uint8_t
*
out
)
{
void
*
array
=
*
(
void
*
const
*
)
member
;
unsigned
i
;
if
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
))
{
...
...
@@ -1367,8 +1232,7 @@ repeated_field_pack(const ProtobufCFieldDescriptor *field,
unsigned
actual_length_size
;
uint8_t
*
payload_at
;
if
(
count
==
0
)
return
0
;
if
(
count
==
0
)
return
0
;
header_len
=
tag_pack
(
field
->
id
,
out
);
out
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
len_start
=
header_len
;
...
...
@@ -1392,38 +1256,38 @@ repeated_field_pack(const ProtobufCFieldDescriptor *field,
break
;
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
{
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
int32_pack
(
arr
[
i
],
payload_at
);
break
;
}
case
PROTOBUF_C_TYPE_SINT32
:
{
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
sint32_pack
(
arr
[
i
],
payload_at
);
break
;
}
case
PROTOBUF_C_TYPE_SINT64
:
{
const
int64_t
*
arr
=
(
const
int64_t
*
)
array
;
const
int64_t
*
arr
=
(
const
int64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
sint64_pack
(
arr
[
i
],
payload_at
);
break
;
}
case
PROTOBUF_C_TYPE_UINT32
:
{
const
uint32_t
*
arr
=
(
const
uint32_t
*
)
array
;
const
uint32_t
*
arr
=
(
const
uint32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
uint32_pack
(
arr
[
i
],
payload_at
);
break
;
}
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
{
const
uint64_t
*
arr
=
(
const
uint64_t
*
)
array
;
const
uint64_t
*
arr
=
(
const
uint64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
uint64_pack
(
arr
[
i
],
payload_at
);
break
;
}
case
PROTOBUF_C_TYPE_BOOL
:
{
const
protobuf_c_boolean
*
arr
=
(
const
protobuf_c_boolean
*
)
array
;
const
protobuf_c_boolean
*
arr
=
(
const
protobuf_c_boolean
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
payload_at
+=
boolean_pack
(
arr
[
i
],
payload_at
);
break
;
...
...
@@ -1436,15 +1300,15 @@ repeated_field_pack(const ProtobufCFieldDescriptor *field,
actual_length_size
=
uint32_size
(
payload_len
);
if
(
length_size_min
!=
actual_length_size
)
{
assert
(
actual_length_size
==
length_size_min
+
1
);
memmove
(
out
+
header_len
+
1
,
out
+
header_len
,
payload_len
);
memmove
(
out
+
header_len
+
1
,
out
+
header_len
,
payload_len
);
header_len
++
;
}
uint32_pack
(
payload_len
,
out
+
len_start
);
return
header_len
+
payload_len
;
}
else
{
/* not "packed" cased */
/* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */
/* CONSIDER: optimize this case a bit (by putting the loop inside the
* switch) */
size_t
rv
=
0
;
unsigned
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
...
...
@@ -1456,9 +1320,8 @@ repeated_field_pack(const ProtobufCFieldDescriptor *field,
}
}
static
size_t
unknown_field_pack
(
const
ProtobufCMessageUnknownField
*
field
,
uint8_t
*
out
)
{
static
size_t
unknown_field_pack
(
const
ProtobufCMessageUnknownField
*
field
,
uint8_t
*
out
)
{
size_t
rv
=
tag_pack
(
field
->
tag
,
out
);
out
[
0
]
|=
field
->
wire_type
;
memcpy
(
out
+
rv
,
field
->
data
,
field
->
len
);
...
...
@@ -1467,17 +1330,14 @@ unknown_field_pack(const ProtobufCMessageUnknownField *field, uint8_t *out)
/**@}*/
size_t
protobuf_c_message_pack
(
const
ProtobufCMessage
*
message
,
uint8_t
*
out
)
{
size_t
protobuf_c_message_pack
(
const
ProtobufCMessage
*
message
,
uint8_t
*
out
)
{
unsigned
i
;
size_t
rv
=
0
;
ASSERT_IS_MESSAGE
(
message
);
for
(
i
=
0
;
i
<
message
->
descriptor
->
n_fields
;
i
++
)
{
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
/*
* It doesn't hurt to compute qmember (a pointer to the
...
...
@@ -1488,32 +1348,23 @@ protobuf_c_message_pack(const ProtobufCMessage *message, uint8_t *out)
* - an optional field that isn't a pointer type
* (Meaning: not a message or a string).
*/
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
if
(
field
->
label
==
PROTOBUF_C_LABEL_REQUIRED
)
{
rv
+=
required_field_pack
(
field
,
member
,
out
+
rv
);
}
else
if
((
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
||
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
&&
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
)))
{
rv
+=
oneof_field_pack
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
,
out
+
rv
);
rv
+=
oneof_field_pack
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
,
out
+
rv
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
)
{
rv
+=
optional_field_pack
(
field
,
*
(
const
protobuf_c_boolean
*
)
qmember
,
member
,
out
+
rv
);
rv
+=
optional_field_pack
(
field
,
*
(
const
protobuf_c_boolean
*
)
qmember
,
member
,
out
+
rv
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
{
rv
+=
unlabeled_field_pack
(
field
,
member
,
out
+
rv
);
}
else
{
rv
+=
repeated_field_pack
(
field
,
*
(
const
size_t
*
)
q
member
,
member
,
out
+
rv
);
rv
+=
repeated_field_pack
(
field
,
*
(
const
size_t
*
)
qmember
,
member
,
out
+
rv
);
}
}
for
(
i
=
0
;
i
<
message
->
n_unknown_fields
;
i
++
)
...
...
@@ -1542,10 +1393,9 @@ protobuf_c_message_pack(const ProtobufCMessage *message, uint8_t *out)
* \return
* Number of bytes packed.
*/
static
size_t
required_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
static
size_t
required_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
size_t
rv
;
uint8_t
scratch
[
MAX_UINT64_ENCODED_SIZE
*
2
];
...
...
@@ -1553,63 +1403,63 @@ required_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_SINT32
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
sint32_pack
(
*
(
const
int32_t
*
)
member
,
scratch
+
rv
);
rv
+=
sint32_pack
(
*
(
const
int32_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
int32_pack
(
*
(
const
int32_t
*
)
member
,
scratch
+
rv
);
rv
+=
int32_pack
(
*
(
const
int32_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_UINT32
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
uint32_pack
(
*
(
const
uint32_t
*
)
member
,
scratch
+
rv
);
rv
+=
uint32_pack
(
*
(
const
uint32_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_SINT64
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
sint64_pack
(
*
(
const
int64_t
*
)
member
,
scratch
+
rv
);
rv
+=
sint64_pack
(
*
(
const
int64_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
uint64_pack
(
*
(
const
uint64_t
*
)
member
,
scratch
+
rv
);
rv
+=
uint64_pack
(
*
(
const
uint64_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
case
PROTOBUF_C_TYPE_FLOAT
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_32BIT
;
rv
+=
fixed32_pack
(
*
(
const
uint32_t
*
)
member
,
scratch
+
rv
);
rv
+=
fixed32_pack
(
*
(
const
uint32_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_SFIXED64
:
case
PROTOBUF_C_TYPE_FIXED64
:
case
PROTOBUF_C_TYPE_DOUBLE
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_64BIT
;
rv
+=
fixed64_pack
(
*
(
const
uint64_t
*
)
member
,
scratch
+
rv
);
rv
+=
fixed64_pack
(
*
(
const
uint64_t
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_BOOL
:
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_VARINT
;
rv
+=
boolean_pack
(
*
(
const
protobuf_c_boolean
*
)
member
,
scratch
+
rv
);
rv
+=
boolean_pack
(
*
(
const
protobuf_c_boolean
*
)
member
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
break
;
case
PROTOBUF_C_TYPE_STRING
:
{
const
char
*
str
=
*
(
char
*
const
*
)
member
;
const
char
*
str
=
*
(
char
*
const
*
)
member
;
size_t
sublen
=
str
?
strlen
(
str
)
:
0
;
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
rv
+=
uint32_pack
(
sublen
,
scratch
+
rv
);
buffer
->
append
(
buffer
,
rv
,
scratch
);
buffer
->
append
(
buffer
,
sublen
,
(
const
uint8_t
*
)
str
);
buffer
->
append
(
buffer
,
sublen
,
(
const
uint8_t
*
)
str
);
rv
+=
sublen
;
break
;
}
case
PROTOBUF_C_TYPE_BYTES
:
{
const
ProtobufCBinaryData
*
bd
=
((
const
ProtobufCBinaryData
*
)
member
);
const
ProtobufCBinaryData
*
bd
=
((
const
ProtobufCBinaryData
*
)
member
);
size_t
sublen
=
bd
->
len
;
scratch
[
0
]
|=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
;
...
...
@@ -1622,7 +1472,7 @@ required_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
case
PROTOBUF_C_TYPE_MESSAGE
:
{
uint8_t
simple_buffer_scratch
[
256
];
size_t
sublen
;
const
ProtobufCMessage
*
msg
=
*
(
ProtobufCMessage
*
const
*
)
member
;
const
ProtobufCMessage
*
msg
=
*
(
ProtobufCMessage
*
const
*
)
member
;
ProtobufCBufferSimple
simple_buffer
=
PROTOBUF_C_BUFFER_SIMPLE_INIT
(
simple_buffer_scratch
);
...
...
@@ -1645,7 +1495,8 @@ required_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
}
/**
* Pack a oneof field to a buffer. Only packs the field that is selected by the case enum.
* Pack a oneof field to a buffer. Only packs the field that is selected by the
* case enum.
*
* \param field
* Field descriptor.
...
...
@@ -1658,20 +1509,17 @@ required_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes serialised to `buffer`.
*/
static
size_t
oneof_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
static
size_t
oneof_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
uint32_t
oneof_case
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
if
(
oneof_case
!=
field
->
id
)
{
return
0
;
}
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
return
required_field_pack_to_buffer
(
field
,
member
,
buffer
);
}
...
...
@@ -1690,20 +1538,15 @@ oneof_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes serialised to `buffer`.
*/
static
size_t
optional_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
protobuf_c_boolean
has
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
static
size_t
optional_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
protobuf_c_boolean
has
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
if
(
field
->
type
==
PROTOBUF_C_TYPE_MESSAGE
||
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
field
->
type
==
PROTOBUF_C_TYPE_STRING
)
{
const
void
*
ptr
=
*
(
const
void
*
const
*
)
member
;
if
(
ptr
==
NULL
||
ptr
==
field
->
default_value
)
return
0
;
}
else
{
if
(
!
has
)
return
0
;
if
(
!
has
)
return
0
;
}
return
required_field_pack_to_buffer
(
field
,
member
,
buffer
);
}
...
...
@@ -1720,12 +1563,10 @@ optional_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes serialised to `buffer`.
*/
static
size_t
unlabeled_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
static
size_t
unlabeled_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
if
(
field_is_zeroish
(
field
,
member
))
return
0
;
return
required_field_pack_to_buffer
(
field
,
member
,
buffer
);
}
...
...
@@ -1741,10 +1582,8 @@ unlabeled_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes required.
*/
static
size_t
get_packed_payload_length
(
const
ProtobufCFieldDescriptor
*
field
,
unsigned
count
,
const
void
*
array
)
{
static
size_t
get_packed_payload_length
(
const
ProtobufCFieldDescriptor
*
field
,
unsigned
count
,
const
void
*
array
)
{
unsigned
rv
=
0
;
unsigned
i
;
...
...
@@ -1759,34 +1598,29 @@ get_packed_payload_length(const ProtobufCFieldDescriptor *field,
return
count
*
8
;
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
{
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
int32_size
(
arr
[
i
]);
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
int32_size
(
arr
[
i
]);
break
;
}
case
PROTOBUF_C_TYPE_SINT32
:
{
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint32_size
(
arr
[
i
]);
const
int32_t
*
arr
=
(
const
int32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint32_size
(
arr
[
i
]);
break
;
}
case
PROTOBUF_C_TYPE_UINT32
:
{
const
uint32_t
*
arr
=
(
const
uint32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint32_size
(
arr
[
i
]);
const
uint32_t
*
arr
=
(
const
uint32_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint32_size
(
arr
[
i
]);
break
;
}
case
PROTOBUF_C_TYPE_SINT64
:
{
const
int64_t
*
arr
=
(
const
int64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint64_size
(
arr
[
i
]);
const
int64_t
*
arr
=
(
const
int64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
sint64_size
(
arr
[
i
]);
break
;
}
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
{
const
uint64_t
*
arr
=
(
const
uint64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint64_size
(
arr
[
i
]);
const
uint64_t
*
arr
=
(
const
uint64_t
*
)
array
;
for
(
i
=
0
;
i
<
count
;
i
++
)
rv
+=
uint64_size
(
arr
[
i
]);
break
;
}
case
PROTOBUF_C_TYPE_BOOL
:
...
...
@@ -1811,11 +1645,9 @@ get_packed_payload_length(const ProtobufCFieldDescriptor *field,
* \return
* Number of bytes packed.
*/
static
size_t
pack_buffer_packed_payload
(
const
ProtobufCFieldDescriptor
*
field
,
static
size_t
pack_buffer_packed_payload
(
const
ProtobufCFieldDescriptor
*
field
,
unsigned
count
,
const
void
*
array
,
ProtobufCBuffer
*
buffer
)
{
ProtobufCBuffer
*
buffer
)
{
uint8_t
scratch
[
16
];
size_t
rv
=
0
;
unsigned
i
;
...
...
@@ -1829,7 +1661,7 @@ pack_buffer_packed_payload(const ProtobufCFieldDescriptor *field,
goto
no_packing_needed
;
#else
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
fixed32_pack
(((
uint32_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
fixed32_pack
(((
uint32_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
...
...
@@ -1843,7 +1675,7 @@ pack_buffer_packed_payload(const ProtobufCFieldDescriptor *field,
goto
no_packing_needed
;
#else
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
fixed64_pack
(((
uint64_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
fixed64_pack
(((
uint64_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
...
...
@@ -1852,28 +1684,28 @@ pack_buffer_packed_payload(const ProtobufCFieldDescriptor *field,
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
int32_pack
(((
int32_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
int32_pack
(((
int32_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
break
;
case
PROTOBUF_C_TYPE_SINT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
sint32_pack
(((
int32_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
sint32_pack
(((
int32_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
break
;
case
PROTOBUF_C_TYPE_UINT32
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
uint32_pack
(((
uint32_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
uint32_pack
(((
uint32_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
break
;
case
PROTOBUF_C_TYPE_SINT64
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
sint64_pack
(((
int64_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
sint64_pack
(((
int64_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
...
...
@@ -1881,14 +1713,14 @@ pack_buffer_packed_payload(const ProtobufCFieldDescriptor *field,
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
uint64_pack
(((
uint64_t
*
)
array
)[
i
],
scratch
);
unsigned
len
=
uint64_pack
(((
uint64_t
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
break
;
case
PROTOBUF_C_TYPE_BOOL
:
for
(
i
=
0
;
i
<
count
;
i
++
)
{
unsigned
len
=
boolean_pack
(((
protobuf_c_boolean
*
)
array
)[
i
],
scratch
);
unsigned
len
=
boolean_pack
(((
protobuf_c_boolean
*
)
array
)[
i
],
scratch
);
buffer
->
append
(
buffer
,
len
,
scratch
);
rv
+=
len
;
}
...
...
@@ -1905,15 +1737,12 @@ no_packing_needed:
#endif
}
static
size_t
repeated_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
unsigned
count
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
char
*
array
=
*
(
char
*
const
*
)
member
;
static
size_t
repeated_field_pack_to_buffer
(
const
ProtobufCFieldDescriptor
*
field
,
unsigned
count
,
const
void
*
member
,
ProtobufCBuffer
*
buffer
)
{
char
*
array
=
*
(
char
*
const
*
)
member
;
if
(
count
==
0
)
return
0
;
if
(
count
==
0
)
return
0
;
if
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
))
{
uint8_t
scratch
[
MAX_UINT64_ENCODED_SIZE
*
2
];
size_t
rv
=
tag_pack
(
field
->
id
,
scratch
);
...
...
@@ -1929,7 +1758,8 @@ repeated_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
}
else
{
size_t
siz
;
unsigned
i
;
/* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */
/* CONSIDER: optimize this case a bit (by putting the loop inside the
* switch) */
unsigned
rv
=
0
;
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
...
...
@@ -1941,10 +1771,8 @@ repeated_field_pack_to_buffer(const ProtobufCFieldDescriptor *field,
}
}
static
size_t
unknown_field_pack_to_buffer
(
const
ProtobufCMessageUnknownField
*
field
,
ProtobufCBuffer
*
buffer
)
{
static
size_t
unknown_field_pack_to_buffer
(
const
ProtobufCMessageUnknownField
*
field
,
ProtobufCBuffer
*
buffer
)
{
uint8_t
header
[
MAX_UINT64_ENCODED_SIZE
];
size_t
rv
=
tag_pack
(
field
->
tag
,
header
);
...
...
@@ -1956,53 +1784,32 @@ unknown_field_pack_to_buffer(const ProtobufCMessageUnknownField *field,
/**@}*/
size_t
protobuf_c_message_pack_to_buffer
(
const
ProtobufCMessage
*
message
,
ProtobufCBuffer
*
buffer
)
{
size_t
protobuf_c_message_pack_to_buffer
(
const
ProtobufCMessage
*
message
,
ProtobufCBuffer
*
buffer
)
{
unsigned
i
;
size_t
rv
=
0
;
ASSERT_IS_MESSAGE
(
message
);
for
(
i
=
0
;
i
<
message
->
descriptor
->
n_fields
;
i
++
)
{
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
const
ProtobufCFieldDescriptor
*
field
=
message
->
descriptor
->
fields
+
i
;
const
void
*
member
=
((
const
char
*
)
message
)
+
field
->
offset
;
const
void
*
qmember
=
((
const
char
*
)
message
)
+
field
->
quantifier_offset
;
if
(
field
->
label
==
PROTOBUF_C_LABEL_REQUIRED
)
{
rv
+=
required_field_pack_to_buffer
(
field
,
member
,
buffer
);
}
else
if
((
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
||
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
&&
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
)))
{
rv
+=
oneof_field_pack_to_buffer
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
,
buffer
);
rv
+=
oneof_field_pack_to_buffer
(
field
,
*
(
const
uint32_t
*
)
qmember
,
member
,
buffer
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_OPTIONAL
)
{
rv
+=
optional_field_pack_to_buffer
(
field
,
*
(
const
protobuf_c_boolean
*
)
qmember
,
member
,
buffer
);
field
,
*
(
const
protobuf_c_boolean
*
)
qmember
,
member
,
buffer
);
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_NONE
)
{
rv
+=
unlabeled_field_pack_to_buffer
(
field
,
member
,
buffer
);
rv
+=
unlabeled_field_pack_to_buffer
(
field
,
member
,
buffer
);
}
else
{
rv
+=
repeated_field_pack_to_buffer
(
field
,
*
(
const
size_t
*
)
qmember
,
member
,
buffer
);
rv
+=
repeated_field_pack_to_buffer
(
field
,
*
(
const
size_t
*
)
qmember
,
member
,
buffer
);
}
}
for
(
i
=
0
;
i
<
message
->
n_unknown_fields
;
i
++
)
...
...
@@ -2020,14 +1827,12 @@ protobuf_c_message_pack_to_buffer(const ProtobufCMessage *message,
* @{
*/
static
inline
int
int_range_lookup
(
unsigned
n_ranges
,
const
ProtobufCIntRange
*
ranges
,
int
value
)
{
static
inline
int
int_range_lookup
(
unsigned
n_ranges
,
const
ProtobufCIntRange
*
ranges
,
int
value
)
{
unsigned
n
;
unsigned
start
;
if
(
n_ranges
==
0
)
return
-
1
;
if
(
n_ranges
==
0
)
return
-
1
;
start
=
0
;
n
=
n_ranges
;
while
(
n
>
1
)
{
...
...
@@ -2035,38 +1840,30 @@ int_range_lookup(unsigned n_ranges, const ProtobufCIntRange *ranges, int value)
if
(
value
<
ranges
[
mid
].
start_value
)
{
n
=
mid
-
start
;
}
else
if
(
value
>=
ranges
[
mid
].
start_value
+
(
int
)
(
ranges
[
mid
+
1
].
orig_index
-
ranges
[
mid
].
orig_index
))
{
}
else
if
(
value
>=
ranges
[
mid
].
start_value
+
(
int
)(
ranges
[
mid
+
1
].
orig_index
-
ranges
[
mid
].
orig_index
))
{
unsigned
new_start
=
mid
+
1
;
n
=
start
+
n
-
new_start
;
start
=
new_start
;
}
else
return
(
value
-
ranges
[
mid
].
start_value
)
+
ranges
[
mid
].
orig_index
;
return
(
value
-
ranges
[
mid
].
start_value
)
+
ranges
[
mid
].
orig_index
;
}
if
(
n
>
0
)
{
unsigned
start_orig_index
=
ranges
[
start
].
orig_index
;
unsigned
range_size
=
ranges
[
start
+
1
].
orig_index
-
start_orig_index
;
unsigned
range_size
=
ranges
[
start
+
1
].
orig_index
-
start_orig_index
;
if
(
ranges
[
start
].
start_value
<=
value
&&
value
<
(
int
)
(
ranges
[
start
].
start_value
+
range_size
))
{
return
(
value
-
ranges
[
start
].
start_value
)
+
start_orig_index
;
value
<
(
int
)(
ranges
[
start
].
start_value
+
range_size
))
{
return
(
value
-
ranges
[
start
].
start_value
)
+
start_orig_index
;
}
}
return
-
1
;
}
static
size_t
parse_tag_and_wiretype
(
size_t
len
,
const
uint8_t
*
data
,
static
size_t
parse_tag_and_wiretype
(
size_t
len
,
const
uint8_t
*
data
,
uint32_t
*
tag_out
,
ProtobufCWireType
*
wiretype_out
)
{
ProtobufCWireType
*
wiretype_out
)
{
unsigned
max_rv
=
len
>
5
?
5
:
len
;
uint32_t
tag
=
(
data
[
0
]
&
0x7f
)
>>
3
;
unsigned
shift
=
4
;
...
...
@@ -2103,10 +1900,9 @@ struct _ScannedMember {
const
uint8_t
*
data
;
/**< Pointer to field data. */
};
static
inline
uint32_t
scan_length_prefixed_data
(
size_t
len
,
const
uint8_t
*
data
,
size_t
*
prefix_len_out
)
{
static
inline
uint32_t
scan_length_prefixed_data
(
size_t
len
,
const
uint8_t
*
data
,
size_t
*
prefix_len_out
)
{
unsigned
hdr_max
=
len
<
5
?
len
:
5
;
unsigned
hdr_len
;
uint32_t
val
=
0
;
...
...
@@ -2116,8 +1912,7 @@ scan_length_prefixed_data(size_t len, const uint8_t *data,
for
(
i
=
0
;
i
<
hdr_max
;
i
++
)
{
val
|=
(
data
[
i
]
&
0x7f
)
<<
shift
;
shift
+=
7
;
if
((
data
[
i
]
&
0x80
)
==
0
)
break
;
if
((
data
[
i
]
&
0x80
)
==
0
)
break
;
}
if
(
i
==
hdr_max
)
{
PROTOBUF_C_UNPACK_ERROR
(
"error parsing length for length-prefixed data"
);
...
...
@@ -2132,13 +1927,10 @@ scan_length_prefixed_data(size_t len, const uint8_t *data,
return
hdr_len
+
val
;
}
static
size_t
max_b128_numbers
(
size_t
len
,
const
uint8_t
*
data
)
{
static
size_t
max_b128_numbers
(
size_t
len
,
const
uint8_t
*
data
)
{
size_t
rv
=
0
;
while
(
len
--
)
if
((
*
data
++
&
0x80
)
==
0
)
++
rv
;
if
((
*
data
++
&
0x80
)
==
0
)
++
rv
;
return
rv
;
}
...
...
@@ -2158,46 +1950,33 @@ max_b128_numbers(size_t len, const uint8_t *data)
* some of its fields may have been reused and changed to their default
* values during the merge.
*/
static
protobuf_c_boolean
merge_messages
(
ProtobufCMessage
*
earlier_msg
,
static
protobuf_c_boolean
merge_messages
(
ProtobufCMessage
*
earlier_msg
,
ProtobufCMessage
*
latter_msg
,
ProtobufCAllocator
*
allocator
)
{
ProtobufCAllocator
*
allocator
)
{
unsigned
i
;
const
ProtobufCFieldDescriptor
*
fields
=
latter_msg
->
descriptor
->
fields
;
const
ProtobufCFieldDescriptor
*
fields
=
latter_msg
->
descriptor
->
fields
;
for
(
i
=
0
;
i
<
latter_msg
->
descriptor
->
n_fields
;
i
++
)
{
if
(
fields
[
i
].
label
==
PROTOBUF_C_LABEL_REPEATED
)
{
size_t
*
n_earlier
=
STRUCT_MEMBER_PTR
(
size_t
,
earlier_msg
,
fields
[
i
].
quantifier_offset
);
STRUCT_MEMBER_PTR
(
size_t
,
earlier_msg
,
fields
[
i
].
quantifier_offset
);
uint8_t
**
p_earlier
=
STRUCT_MEMBER_PTR
(
uint8_t
*
,
earlier_msg
,
fields
[
i
].
offset
);
STRUCT_MEMBER_PTR
(
uint8_t
*
,
earlier_msg
,
fields
[
i
].
offset
);
size_t
*
n_latter
=
STRUCT_MEMBER_PTR
(
size_t
,
latter_msg
,
fields
[
i
].
quantifier_offset
);
STRUCT_MEMBER_PTR
(
size_t
,
latter_msg
,
fields
[
i
].
quantifier_offset
);
uint8_t
**
p_latter
=
STRUCT_MEMBER_PTR
(
uint8_t
*
,
latter_msg
,
fields
[
i
].
offset
);
STRUCT_MEMBER_PTR
(
uint8_t
*
,
latter_msg
,
fields
[
i
].
offset
);
if
(
*
n_earlier
>
0
)
{
if
(
*
n_latter
>
0
)
{
/* Concatenate the repeated field */
size_t
el_size
=
sizeof_elt_in_repeated_array
(
fields
[
i
].
type
);
size_t
el_size
=
sizeof_elt_in_repeated_array
(
fields
[
i
].
type
);
uint8_t
*
new_field
;
new_field
=
do_alloc
(
allocator
,
(
*
n_earlier
+
*
n_latter
)
*
el_size
);
if
(
!
new_field
)
return
FALSE
;
new_field
=
do_alloc
(
allocator
,
(
*
n_earlier
+
*
n_latter
)
*
el_size
);
if
(
!
new_field
)
return
FALSE
;
memcpy
(
new_field
,
*
p_earlier
,
*
n_earlier
*
el_size
);
memcpy
(
new_field
+
*
n_earlier
*
el_size
,
*
p_latter
,
memcpy
(
new_field
,
*
p_earlier
,
*
n_earlier
*
el_size
);
memcpy
(
new_field
+
*
n_earlier
*
el_size
,
*
p_latter
,
*
n_latter
*
el_size
);
do_free
(
allocator
,
*
p_latter
);
...
...
@@ -2216,14 +1995,10 @@ merge_messages(ProtobufCMessage *earlier_msg,
}
else
if
(
fields
[
i
].
label
==
PROTOBUF_C_LABEL_OPTIONAL
||
fields
[
i
].
label
==
PROTOBUF_C_LABEL_NONE
)
{
const
ProtobufCFieldDescriptor
*
field
;
uint32_t
*
earlier_case_p
=
STRUCT_MEMBER_PTR
(
uint32_t
,
earlier_msg
,
fields
[
i
].
quantifier_offset
);
uint32_t
*
latter_case_p
=
STRUCT_MEMBER_PTR
(
uint32_t
,
latter_msg
,
fields
[
i
].
quantifier_offset
);
uint32_t
*
earlier_case_p
=
STRUCT_MEMBER_PTR
(
uint32_t
,
earlier_msg
,
fields
[
i
].
quantifier_offset
);
uint32_t
*
latter_case_p
=
STRUCT_MEMBER_PTR
(
uint32_t
,
latter_msg
,
fields
[
i
].
quantifier_offset
);
protobuf_c_boolean
need_to_merge
=
FALSE
;
void
*
earlier_elem
;
void
*
latter_elem
;
...
...
@@ -2232,17 +2007,11 @@ merge_messages(ProtobufCMessage *earlier_msg,
if
(
fields
[
i
].
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
)
{
if
(
*
latter_case_p
==
0
)
{
/* lookup correct oneof field */
int
field_index
=
int_range_lookup
(
latter_msg
->
descriptor
->
n_field_ranges
,
latter_msg
->
descriptor
->
field_ranges
,
*
earlier_case_p
);
if
(
field_index
<
0
)
return
FALSE
;
field
=
latter_msg
->
descriptor
->
fields
+
field_index
;
int
field_index
=
int_range_lookup
(
latter_msg
->
descriptor
->
n_field_ranges
,
latter_msg
->
descriptor
->
field_ranges
,
*
earlier_case_p
);
if
(
field_index
<
0
)
return
FALSE
;
field
=
latter_msg
->
descriptor
->
fields
+
field_index
;
}
else
{
/* Oneof is present in the latter message, move on */
continue
;
...
...
@@ -2257,12 +2026,11 @@ merge_messages(ProtobufCMessage *earlier_msg,
switch
(
field
->
type
)
{
case
PROTOBUF_C_TYPE_MESSAGE
:
{
ProtobufCMessage
*
em
=
*
(
ProtobufCMessage
**
)
earlier_elem
;
ProtobufCMessage
*
lm
=
*
(
ProtobufCMessage
**
)
latter_elem
;
ProtobufCMessage
*
em
=
*
(
ProtobufCMessage
**
)
earlier_elem
;
ProtobufCMessage
*
lm
=
*
(
ProtobufCMessage
**
)
latter_elem
;
if
(
em
!=
NULL
)
{
if
(
lm
!=
NULL
)
{
if
(
!
merge_messages
(
em
,
lm
,
allocator
))
return
FALSE
;
if
(
!
merge_messages
(
em
,
lm
,
allocator
))
return
FALSE
;
/* Already merged */
need_to_merge
=
FALSE
;
}
else
{
...
...
@@ -2273,25 +2041,18 @@ merge_messages(ProtobufCMessage *earlier_msg,
break
;
}
case
PROTOBUF_C_TYPE_BYTES
:
{
uint8_t
*
e_data
=
((
ProtobufCBinaryData
*
)
earlier_elem
)
->
data
;
uint8_t
*
l_data
=
((
ProtobufCBinaryData
*
)
latter_elem
)
->
data
;
const
ProtobufCBinaryData
*
d_bd
=
(
ProtobufCBinaryData
*
)
def_val
;
uint8_t
*
e_data
=
((
ProtobufCBinaryData
*
)
earlier_elem
)
->
data
;
uint8_t
*
l_data
=
((
ProtobufCBinaryData
*
)
latter_elem
)
->
data
;
const
ProtobufCBinaryData
*
d_bd
=
(
ProtobufCBinaryData
*
)
def_val
;
need_to_merge
=
(
e_data
!=
NULL
&&
(
d_bd
==
NULL
||
e_data
!=
d_bd
->
data
))
&&
(
l_data
==
NULL
||
(
d_bd
!=
NULL
&&
l_data
==
d_bd
->
data
));
(
e_data
!=
NULL
&&
(
d_bd
==
NULL
||
e_data
!=
d_bd
->
data
))
&&
(
l_data
==
NULL
||
(
d_bd
!=
NULL
&&
l_data
==
d_bd
->
data
));
break
;
}
case
PROTOBUF_C_TYPE_STRING
:
{
char
*
e_str
=
*
(
char
**
)
earlier_elem
;
char
*
l_str
=
*
(
char
**
)
latter_elem
;
char
*
e_str
=
*
(
char
**
)
earlier_elem
;
char
*
l_str
=
*
(
char
**
)
latter_elem
;
const
char
*
d_str
=
def_val
;
need_to_merge
=
e_str
!=
d_str
&&
l_str
==
d_str
;
...
...
@@ -2301,15 +2062,13 @@ merge_messages(ProtobufCMessage *earlier_msg,
/* Could be has field or case enum, the logic is
* equivalent, since 0 (FALSE) means not set for
* oneof */
need_to_merge
=
(
*
earlier_case_p
!=
0
)
&&
(
*
latter_case_p
==
0
);
need_to_merge
=
(
*
earlier_case_p
!=
0
)
&&
(
*
latter_case_p
==
0
);
break
;
}
}
if
(
need_to_merge
)
{
size_t
el_size
=
sizeof_elt_in_repeated_array
(
field
->
type
);
size_t
el_size
=
sizeof_elt_in_repeated_array
(
field
->
type
);
memcpy
(
latter_elem
,
earlier_elem
,
el_size
);
/*
* Reset the element from the old message to 0
...
...
@@ -2340,16 +2099,16 @@ merge_messages(ProtobufCMessage *earlier_msg,
* others; the remaining error checking is done by
* parse_packed_repeated_member().
*/
static
protobuf_c_boolean
count_packed_elements
(
ProtobufCType
type
,
size_t
len
,
const
uint8_t
*
data
,
size_t
*
count_out
)
{
static
protobuf_c_boolean
count_packed_elements
(
ProtobufCType
type
,
size_t
len
,
const
uint8_t
*
data
,
size_t
*
count_out
)
{
switch
(
type
)
{
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
case
PROTOBUF_C_TYPE_FLOAT
:
if
(
len
%
4
!=
0
)
{
PROTOBUF_C_UNPACK_ERROR
(
"length must be a multiple of 4 for fixed-length 32-bit types"
);
PROTOBUF_C_UNPACK_ERROR
(
"length must be a multiple of 4 for fixed-length 32-bit types"
);
return
FALSE
;
}
*
count_out
=
len
/
4
;
...
...
@@ -2358,7 +2117,8 @@ count_packed_elements(ProtobufCType type,
case
PROTOBUF_C_TYPE_FIXED64
:
case
PROTOBUF_C_TYPE_DOUBLE
:
if
(
len
%
8
!=
0
)
{
PROTOBUF_C_UNPACK_ERROR
(
"length must be a multiple of 8 for fixed-length 64-bit types"
);
PROTOBUF_C_UNPACK_ERROR
(
"length must be a multiple of 8 for fixed-length 64-bit types"
);
return
FALSE
;
}
*
count_out
=
len
/
8
;
...
...
@@ -2379,117 +2139,92 @@ count_packed_elements(ProtobufCType type,
case
PROTOBUF_C_TYPE_BYTES
:
case
PROTOBUF_C_TYPE_MESSAGE
:
default:
PROTOBUF_C_UNPACK_ERROR
(
"bad protobuf-c type %u for packed-repeated"
,
type
);
PROTOBUF_C_UNPACK_ERROR
(
"bad protobuf-c type %u for packed-repeated"
,
type
);
return
FALSE
;
}
}
static
inline
uint32_t
parse_uint32
(
unsigned
len
,
const
uint8_t
*
data
)
{
static
inline
uint32_t
parse_uint32
(
unsigned
len
,
const
uint8_t
*
data
)
{
uint32_t
rv
=
data
[
0
]
&
0x7f
;
if
(
len
>
1
)
{
rv
|=
((
uint32_t
)
(
data
[
1
]
&
0x7f
)
<<
7
);
rv
|=
((
uint32_t
)
(
data
[
1
]
&
0x7f
)
<<
7
);
if
(
len
>
2
)
{
rv
|=
((
uint32_t
)
(
data
[
2
]
&
0x7f
)
<<
14
);
rv
|=
((
uint32_t
)
(
data
[
2
]
&
0x7f
)
<<
14
);
if
(
len
>
3
)
{
rv
|=
((
uint32_t
)
(
data
[
3
]
&
0x7f
)
<<
21
);
if
(
len
>
4
)
rv
|=
((
uint32_t
)
(
data
[
4
])
<<
28
);
rv
|=
((
uint32_t
)(
data
[
3
]
&
0x7f
)
<<
21
);
if
(
len
>
4
)
rv
|=
((
uint32_t
)(
data
[
4
])
<<
28
);
}
}
}
return
rv
;
}
static
inline
uint32_t
parse_int32
(
unsigned
len
,
const
uint8_t
*
data
)
{
static
inline
uint32_t
parse_int32
(
unsigned
len
,
const
uint8_t
*
data
)
{
return
parse_uint32
(
len
,
data
);
}
static
inline
int32_t
unzigzag32
(
uint32_t
v
)
{
static
inline
int32_t
unzigzag32
(
uint32_t
v
)
{
if
(
v
&
1
)
return
-
(
v
>>
1
)
-
1
;
else
return
v
>>
1
;
}
static
inline
uint32_t
parse_fixed_uint32
(
const
uint8_t
*
data
)
{
static
inline
uint32_t
parse_fixed_uint32
(
const
uint8_t
*
data
)
{
#if !defined(WORDS_BIGENDIAN)
uint32_t
t
;
memcpy
(
&
t
,
data
,
4
);
return
t
;
#else
return
data
[
0
]
|
((
uint32_t
)
(
data
[
1
])
<<
8
)
|
((
uint32_t
)
(
data
[
2
])
<<
16
)
|
((
uint32_t
)
(
data
[
3
])
<<
24
);
return
data
[
0
]
|
((
uint32_t
)(
data
[
1
])
<<
8
)
|
((
uint32_t
)(
data
[
2
])
<<
16
)
|
((
uint32_t
)(
data
[
3
])
<<
24
);
#endif
}
static
uint64_t
parse_uint64
(
unsigned
len
,
const
uint8_t
*
data
)
{
static
uint64_t
parse_uint64
(
unsigned
len
,
const
uint8_t
*
data
)
{
unsigned
shift
,
i
;
uint64_t
rv
;
if
(
len
<
5
)
return
parse_uint32
(
len
,
data
);
rv
=
((
uint64_t
)
(
data
[
0
]
&
0x7f
))
|
((
uint64_t
)
(
data
[
1
]
&
0x7f
)
<<
7
)
|
((
uint64_t
)
(
data
[
2
]
&
0x7f
)
<<
14
)
|
((
uint64_t
)
(
data
[
3
]
&
0x7f
)
<<
21
);
if
(
len
<
5
)
return
parse_uint32
(
len
,
data
);
rv
=
((
uint64_t
)(
data
[
0
]
&
0x7f
))
|
((
uint64_t
)(
data
[
1
]
&
0x7f
)
<<
7
)
|
((
uint64_t
)(
data
[
2
]
&
0x7f
)
<<
14
)
|
((
uint64_t
)(
data
[
3
]
&
0x7f
)
<<
21
);
shift
=
28
;
for
(
i
=
4
;
i
<
len
;
i
++
)
{
rv
|=
(((
uint64_t
)
(
data
[
i
]
&
0x7f
))
<<
shift
);
rv
|=
(((
uint64_t
)
(
data
[
i
]
&
0x7f
))
<<
shift
);
shift
+=
7
;
}
return
rv
;
}
static
inline
int64_t
unzigzag64
(
uint64_t
v
)
{
static
inline
int64_t
unzigzag64
(
uint64_t
v
)
{
if
(
v
&
1
)
return
-
(
v
>>
1
)
-
1
;
else
return
v
>>
1
;
}
static
inline
uint64_t
parse_fixed_uint64
(
const
uint8_t
*
data
)
{
static
inline
uint64_t
parse_fixed_uint64
(
const
uint8_t
*
data
)
{
#if !defined(WORDS_BIGENDIAN)
uint64_t
t
;
memcpy
(
&
t
,
data
,
8
);
return
t
;
#else
return
(
uint64_t
)
parse_fixed_uint32
(
data
)
|
(((
uint64_t
)
parse_fixed_uint32
(
data
+
4
))
<<
32
);
return
(
uint64_t
)
parse_fixed_uint32
(
data
)
|
(((
uint64_t
)
parse_fixed_uint32
(
data
+
4
))
<<
32
);
#endif
}
static
protobuf_c_boolean
parse_boolean
(
unsigned
len
,
const
uint8_t
*
data
)
{
static
protobuf_c_boolean
parse_boolean
(
unsigned
len
,
const
uint8_t
*
data
)
{
unsigned
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
if
(
data
[
i
]
&
0x7f
)
return
TRUE
;
if
(
data
[
i
]
&
0x7f
)
return
TRUE
;
return
FALSE
;
}
static
protobuf_c_boolean
parse_required_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCAllocator
*
allocator
,
protobuf_c_boolean
maybe_clear
)
{
static
protobuf_c_boolean
parse_required_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCAllocator
*
allocator
,
protobuf_c_boolean
maybe_clear
)
{
unsigned
len
=
scanned_member
->
len
;
const
uint8_t
*
data
=
scanned_member
->
data
;
ProtobufCWireType
wire_type
=
scanned_member
->
wire_type
;
...
...
@@ -2497,63 +2232,53 @@ parse_required_member(ScannedMember *scanned_member,
switch
(
scanned_member
->
field
->
type
)
{
case
PROTOBUF_C_TYPE_ENUM
:
case
PROTOBUF_C_TYPE_INT32
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int32_t
*
)
member
=
parse_int32
(
len
,
data
);
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int32_t
*
)
member
=
parse_int32
(
len
,
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_UINT32
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
uint32_t
*
)
member
=
parse_uint32
(
len
,
data
);
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
uint32_t
*
)
member
=
parse_uint32
(
len
,
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_SINT32
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int32_t
*
)
member
=
unzigzag32
(
parse_uint32
(
len
,
data
));
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int32_t
*
)
member
=
unzigzag32
(
parse_uint32
(
len
,
data
));
return
TRUE
;
case
PROTOBUF_C_TYPE_SFIXED32
:
case
PROTOBUF_C_TYPE_FIXED32
:
case
PROTOBUF_C_TYPE_FLOAT
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_32BIT
)
return
FALSE
;
*
(
uint32_t
*
)
member
=
parse_fixed_uint32
(
data
);
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_32BIT
)
return
FALSE
;
*
(
uint32_t
*
)
member
=
parse_fixed_uint32
(
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_INT64
:
case
PROTOBUF_C_TYPE_UINT64
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
uint64_t
*
)
member
=
parse_uint64
(
len
,
data
);
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
uint64_t
*
)
member
=
parse_uint64
(
len
,
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_SINT64
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int64_t
*
)
member
=
unzigzag64
(
parse_uint64
(
len
,
data
));
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_VARINT
)
return
FALSE
;
*
(
int64_t
*
)
member
=
unzigzag64
(
parse_uint64
(
len
,
data
));
return
TRUE
;
case
PROTOBUF_C_TYPE_SFIXED64
:
case
PROTOBUF_C_TYPE_FIXED64
:
case
PROTOBUF_C_TYPE_DOUBLE
:
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_64BIT
)
return
FALSE
;
*
(
uint64_t
*
)
member
=
parse_fixed_uint64
(
data
);
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_64BIT
)
return
FALSE
;
*
(
uint64_t
*
)
member
=
parse_fixed_uint64
(
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_BOOL
:
*
(
protobuf_c_boolean
*
)
member
=
parse_boolean
(
len
,
data
);
*
(
protobuf_c_boolean
*
)
member
=
parse_boolean
(
len
,
data
);
return
TRUE
;
case
PROTOBUF_C_TYPE_STRING
:
{
char
**
pstr
=
member
;
unsigned
pref_len
=
scanned_member
->
length_prefix_len
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
if
(
maybe_clear
&&
*
pstr
!=
NULL
)
{
const
char
*
def
=
scanned_member
->
field
->
default_value
;
if
(
*
pstr
!=
NULL
&&
*
pstr
!=
def
)
do_free
(
allocator
,
*
pstr
);
if
(
*
pstr
!=
NULL
&&
*
pstr
!=
def
)
do_free
(
allocator
,
*
pstr
);
}
*
pstr
=
do_alloc
(
allocator
,
len
-
pref_len
+
1
);
if
(
*
pstr
==
NULL
)
return
FALSE
;
if
(
*
pstr
==
NULL
)
return
FALSE
;
memcpy
(
*
pstr
,
data
+
pref_len
,
len
-
pref_len
);
(
*
pstr
)[
len
-
pref_len
]
=
0
;
return
TRUE
;
...
...
@@ -2563,20 +2288,16 @@ parse_required_member(ScannedMember *scanned_member,
const
ProtobufCBinaryData
*
def_bd
;
unsigned
pref_len
=
scanned_member
->
length_prefix_len
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
def_bd
=
scanned_member
->
field
->
default_value
;
if
(
maybe_clear
&&
bd
->
data
!=
NULL
&&
(
def_bd
==
NULL
||
bd
->
data
!=
def_bd
->
data
))
{
if
(
maybe_clear
&&
bd
->
data
!=
NULL
&&
(
def_bd
==
NULL
||
bd
->
data
!=
def_bd
->
data
))
{
do_free
(
allocator
,
bd
->
data
);
}
if
(
len
-
pref_len
>
0
)
{
bd
->
data
=
do_alloc
(
allocator
,
len
-
pref_len
);
if
(
bd
->
data
==
NULL
)
return
FALSE
;
if
(
bd
->
data
==
NULL
)
return
FALSE
;
memcpy
(
bd
->
data
,
data
+
pref_len
,
len
-
pref_len
);
}
else
{
bd
->
data
=
NULL
;
...
...
@@ -2591,51 +2312,41 @@ parse_required_member(ScannedMember *scanned_member,
protobuf_c_boolean
merge_successful
=
TRUE
;
unsigned
pref_len
=
scanned_member
->
length_prefix_len
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
if
(
wire_type
!=
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
)
return
FALSE
;
def_mess
=
scanned_member
->
field
->
default_value
;
subm
=
protobuf_c_message_unpack
(
scanned_member
->
field
->
descriptor
,
allocator
,
len
-
pref_len
,
data
+
pref_len
);
if
(
maybe_clear
&&
*
pmessage
!=
NULL
&&
*
pmessage
!=
def_mess
)
{
subm
=
protobuf_c_message_unpack
(
scanned_member
->
field
->
descriptor
,
allocator
,
len
-
pref_len
,
data
+
pref_len
);
if
(
maybe_clear
&&
*
pmessage
!=
NULL
&&
*
pmessage
!=
def_mess
)
{
if
(
subm
!=
NULL
)
merge_successful
=
merge_messages
(
*
pmessage
,
subm
,
allocator
);
/* Delete the previous message */
protobuf_c_message_free_unpacked
(
*
pmessage
,
allocator
);
}
*
pmessage
=
subm
;
if
(
subm
==
NULL
||
!
merge_successful
)
return
FALSE
;
if
(
subm
==
NULL
||
!
merge_successful
)
return
FALSE
;
return
TRUE
;
}
}
return
FALSE
;
}
static
protobuf_c_boolean
parse_oneof_member
(
ScannedMember
*
scanned_member
,
static
protobuf_c_boolean
parse_oneof_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
uint32_t
*
oneof_case
=
STRUCT_MEMBER_PTR
(
uint32_t
,
message
,
scanned_member
->
field
->
quantifier_offset
);
ProtobufCAllocator
*
allocator
)
{
uint32_t
*
oneof_case
=
STRUCT_MEMBER_PTR
(
uint32_t
,
message
,
scanned_member
->
field
->
quantifier_offset
);
/* If we have already parsed a member of this oneof, free it. */
if
(
*
oneof_case
!=
0
)
{
/* lookup field */
int
field_index
=
int_range_lookup
(
message
->
descriptor
->
n_field_ranges
,
message
->
descriptor
->
field_ranges
,
*
oneof_case
);
if
(
field_index
<
0
)
return
FALSE
;
message
->
descriptor
->
field_ranges
,
*
oneof_case
);
if
(
field_index
<
0
)
return
FALSE
;
const
ProtobufCFieldDescriptor
*
old_field
=
message
->
descriptor
->
fields
+
field_index
;
size_t
el_size
=
sizeof_elt_in_repeated_array
(
old_field
->
type
);
...
...
@@ -2644,16 +2355,13 @@ parse_oneof_member (ScannedMember *scanned_member,
case
PROTOBUF_C_TYPE_STRING
:
{
char
**
pstr
=
member
;
const
char
*
def
=
old_field
->
default_value
;
if
(
*
pstr
!=
NULL
&&
*
pstr
!=
def
)
do_free
(
allocator
,
*
pstr
);
if
(
*
pstr
!=
NULL
&&
*
pstr
!=
def
)
do_free
(
allocator
,
*
pstr
);
break
;
}
case
PROTOBUF_C_TYPE_BYTES
:
{
ProtobufCBinaryData
*
bd
=
member
;
const
ProtobufCBinaryData
*
def_bd
=
old_field
->
default_value
;
if
(
bd
->
data
!=
NULL
&&
(
def_bd
==
NULL
||
bd
->
data
!=
def_bd
->
data
))
{
if
(
bd
->
data
!=
NULL
&&
(
def_bd
==
NULL
||
bd
->
data
!=
def_bd
->
data
))
{
do_free
(
allocator
,
bd
->
data
);
}
break
;
...
...
@@ -2669,74 +2377,59 @@ parse_oneof_member (ScannedMember *scanned_member,
break
;
}
memset
(
member
,
0
,
el_size
);
memset
(
member
,
0
,
el_size
);
}
if
(
!
parse_required_member
(
scanned_member
,
member
,
allocator
,
TRUE
))
if
(
!
parse_required_member
(
scanned_member
,
member
,
allocator
,
TRUE
))
return
FALSE
;
*
oneof_case
=
scanned_member
->
tag
;
return
TRUE
;
}
static
protobuf_c_boolean
parse_optional_member
(
ScannedMember
*
scanned_member
,
static
protobuf_c_boolean
parse_optional_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
ProtobufCAllocator
*
allocator
)
{
if
(
!
parse_required_member
(
scanned_member
,
member
,
allocator
,
TRUE
))
return
FALSE
;
if
(
scanned_member
->
field
->
quantifier_offset
!=
0
)
STRUCT_MEMBER
(
protobuf_c_boolean
,
message
,
STRUCT_MEMBER
(
protobuf_c_boolean
,
message
,
scanned_member
->
field
->
quantifier_offset
)
=
TRUE
;
return
TRUE
;
}
static
protobuf_c_boolean
parse_repeated_member
(
ScannedMember
*
scanned_member
,
static
protobuf_c_boolean
parse_repeated_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
ProtobufCAllocator
*
allocator
)
{
const
ProtobufCFieldDescriptor
*
field
=
scanned_member
->
field
;
size_t
*
p_n
=
STRUCT_MEMBER_PTR
(
size_t
,
message
,
field
->
quantifier_offset
);
size_t
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
char
*
array
=
*
(
char
**
)
member
;
char
*
array
=
*
(
char
**
)
member
;
if
(
!
parse_required_member
(
scanned_member
,
array
+
siz
*
(
*
p_n
),
allocator
,
FALSE
))
{
if
(
!
parse_required_member
(
scanned_member
,
array
+
siz
*
(
*
p_n
),
allocator
,
FALSE
))
{
return
FALSE
;
}
*
p_n
+=
1
;
return
TRUE
;
}
static
unsigned
scan_varint
(
unsigned
len
,
const
uint8_t
*
data
)
{
static
unsigned
scan_varint
(
unsigned
len
,
const
uint8_t
*
data
)
{
unsigned
i
;
if
(
len
>
10
)
len
=
10
;
if
(
len
>
10
)
len
=
10
;
for
(
i
=
0
;
i
<
len
;
i
++
)
if
((
data
[
i
]
&
0x80
)
==
0
)
break
;
if
(
i
==
len
)
return
0
;
if
((
data
[
i
]
&
0x80
)
==
0
)
break
;
if
(
i
==
len
)
return
0
;
return
i
+
1
;
}
static
protobuf_c_boolean
parse_packed_repeated_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCMessage
*
message
)
{
static
protobuf_c_boolean
parse_packed_repeated_member
(
ScannedMember
*
scanned_member
,
void
*
member
,
ProtobufCMessage
*
message
)
{
const
ProtobufCFieldDescriptor
*
field
=
scanned_member
->
field
;
size_t
*
p_n
=
STRUCT_MEMBER_PTR
(
size_t
,
message
,
field
->
quantifier_offset
);
size_t
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
void
*
array
=
*
(
char
**
)
member
+
siz
*
(
*
p_n
);
void
*
array
=
*
(
char
**
)
member
+
siz
*
(
*
p_n
);
const
uint8_t
*
at
=
scanned_member
->
data
+
scanned_member
->
length_prefix_len
;
size_t
rem
=
scanned_member
->
len
-
scanned_member
->
length_prefix_len
;
size_t
count
=
0
;
...
...
@@ -2751,7 +2444,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
goto
no_unpacking_needed
;
#else
for
(
i
=
0
;
i
<
count
;
i
++
)
{
((
uint32_t
*
)
array
)[
i
]
=
parse_fixed_uint32
(
at
);
((
uint32_t
*
)
array
)[
i
]
=
parse_fixed_uint32
(
at
);
at
+=
4
;
}
break
;
...
...
@@ -2764,7 +2457,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
goto
no_unpacking_needed
;
#else
for
(
i
=
0
;
i
<
count
;
i
++
)
{
((
uint64_t
*
)
array
)[
i
]
=
parse_fixed_uint64
(
at
);
((
uint64_t
*
)
array
)[
i
]
=
parse_fixed_uint64
(
at
);
at
+=
8
;
}
break
;
...
...
@@ -2777,7 +2470,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated int32 value"
);
return
FALSE
;
}
((
int32_t
*
)
array
)[
count
++
]
=
parse_int32
(
s
,
at
);
((
int32_t
*
)
array
)[
count
++
]
=
parse_int32
(
s
,
at
);
at
+=
s
;
rem
-=
s
;
}
...
...
@@ -2789,7 +2482,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated sint32 value"
);
return
FALSE
;
}
((
int32_t
*
)
array
)[
count
++
]
=
unzigzag32
(
parse_uint32
(
s
,
at
));
((
int32_t
*
)
array
)[
count
++
]
=
unzigzag32
(
parse_uint32
(
s
,
at
));
at
+=
s
;
rem
-=
s
;
}
...
...
@@ -2801,7 +2494,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated enum or uint32 value"
);
return
FALSE
;
}
((
uint32_t
*
)
array
)[
count
++
]
=
parse_uint32
(
s
,
at
);
((
uint32_t
*
)
array
)[
count
++
]
=
parse_uint32
(
s
,
at
);
at
+=
s
;
rem
-=
s
;
}
...
...
@@ -2814,7 +2507,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated sint64 value"
);
return
FALSE
;
}
((
int64_t
*
)
array
)[
count
++
]
=
unzigzag64
(
parse_uint64
(
s
,
at
));
((
int64_t
*
)
array
)[
count
++
]
=
unzigzag64
(
parse_uint64
(
s
,
at
));
at
+=
s
;
rem
-=
s
;
}
...
...
@@ -2827,7 +2520,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated int64/uint64 value"
);
return
FALSE
;
}
((
int64_t
*
)
array
)[
count
++
]
=
parse_uint64
(
s
,
at
);
((
int64_t
*
)
array
)[
count
++
]
=
parse_uint64
(
s
,
at
);
at
+=
s
;
rem
-=
s
;
}
...
...
@@ -2839,7 +2532,7 @@ parse_packed_repeated_member(ScannedMember *scanned_member,
PROTOBUF_C_UNPACK_ERROR
(
"bad packed-repeated boolean value"
);
return
FALSE
;
}
((
protobuf_c_boolean
*
)
array
)[
i
]
=
at
[
i
];
((
protobuf_c_boolean
*
)
array
)[
i
]
=
at
[
i
];
}
break
;
default:
...
...
@@ -2856,61 +2549,47 @@ no_unpacking_needed:
#endif
}
static
protobuf_c_boolean
is_packable_type
(
ProtobufCType
type
)
{
return
type
!=
PROTOBUF_C_TYPE_STRING
&&
type
!=
PROTOBUF_C_TYPE_BYTES
&&
static
protobuf_c_boolean
is_packable_type
(
ProtobufCType
type
)
{
return
type
!=
PROTOBUF_C_TYPE_STRING
&&
type
!=
PROTOBUF_C_TYPE_BYTES
&&
type
!=
PROTOBUF_C_TYPE_MESSAGE
;
}
static
protobuf_c_boolean
parse_member
(
ScannedMember
*
scanned_member
,
static
protobuf_c_boolean
parse_member
(
ScannedMember
*
scanned_member
,
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
ProtobufCAllocator
*
allocator
)
{
const
ProtobufCFieldDescriptor
*
field
=
scanned_member
->
field
;
void
*
member
;
if
(
field
==
NULL
)
{
ProtobufCMessageUnknownField
*
ufield
=
message
->
unknown_fields
+
(
message
->
n_unknown_fields
++
);
message
->
unknown_fields
+
(
message
->
n_unknown_fields
++
);
ufield
->
tag
=
scanned_member
->
tag
;
ufield
->
wire_type
=
scanned_member
->
wire_type
;
ufield
->
len
=
scanned_member
->
len
;
ufield
->
data
=
do_alloc
(
allocator
,
scanned_member
->
len
);
if
(
ufield
->
data
==
NULL
)
return
FALSE
;
if
(
ufield
->
data
==
NULL
)
return
FALSE
;
memcpy
(
ufield
->
data
,
scanned_member
->
data
,
ufield
->
len
);
return
TRUE
;
}
member
=
(
char
*
)
message
+
field
->
offset
;
member
=
(
char
*
)
message
+
field
->
offset
;
switch
(
field
->
label
)
{
case
PROTOBUF_C_LABEL_REQUIRED
:
return
parse_required_member
(
scanned_member
,
member
,
allocator
,
TRUE
);
return
parse_required_member
(
scanned_member
,
member
,
allocator
,
TRUE
);
case
PROTOBUF_C_LABEL_OPTIONAL
:
case
PROTOBUF_C_LABEL_NONE
:
if
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
))
{
return
parse_oneof_member
(
scanned_member
,
member
,
message
,
allocator
);
return
parse_oneof_member
(
scanned_member
,
member
,
message
,
allocator
);
}
else
{
return
parse_optional_member
(
scanned_member
,
member
,
message
,
allocator
);
return
parse_optional_member
(
scanned_member
,
member
,
message
,
allocator
);
}
case
PROTOBUF_C_LABEL_REPEATED
:
if
(
scanned_member
->
wire_type
==
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
&&
if
(
scanned_member
->
wire_type
==
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
&&
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
)
||
is_packable_type
(
field
->
type
)))
{
return
parse_packed_repeated_member
(
scanned_member
,
member
,
message
);
is_packable_type
(
field
->
type
)))
{
return
parse_packed_repeated_member
(
scanned_member
,
member
,
message
);
}
else
{
return
parse_repeated_member
(
scanned_member
,
member
,
message
,
return
parse_repeated_member
(
scanned_member
,
member
,
message
,
allocator
);
}
}
...
...
@@ -2925,20 +2604,16 @@ parse_member(ScannedMember *scanned_member,
* for old code, and which would be useful to support allocating
* descriptors dynamically).
*/
static
void
message_init_generic
(
const
ProtobufCMessageDescriptor
*
desc
,
ProtobufCMessage
*
message
)
{
static
void
message_init_generic
(
const
ProtobufCMessageDescriptor
*
desc
,
ProtobufCMessage
*
message
)
{
unsigned
i
;
memset
(
message
,
0
,
desc
->
sizeof_message
);
message
->
descriptor
=
desc
;
for
(
i
=
0
;
i
<
desc
->
n_fields
;
i
++
)
{
if
(
desc
->
fields
[
i
].
default_value
!=
NULL
&&
desc
->
fields
[
i
].
label
!=
PROTOBUF_C_LABEL_REPEATED
)
{
void
*
field
=
STRUCT_MEMBER_P
(
message
,
desc
->
fields
[
i
].
offset
);
desc
->
fields
[
i
].
label
!=
PROTOBUF_C_LABEL_REPEATED
)
{
void
*
field
=
STRUCT_MEMBER_P
(
message
,
desc
->
fields
[
i
].
offset
);
const
void
*
dv
=
desc
->
fields
[
i
].
default_value
;
switch
(
desc
->
fields
[
i
].
type
)
{
...
...
@@ -2972,7 +2647,7 @@ message_init_generic(const ProtobufCMessageDescriptor *desc,
* The next line essentially implements a cast
* from const, which is totally unavoidable.
*/
*
(
const
void
**
)
field
=
dv
;
*
(
const
void
**
)
field
=
dv
;
break
;
}
}
...
...
@@ -2998,27 +2673,23 @@ message_init_generic(const ProtobufCMessageDescriptor *desc,
* that we would overflow if we needed a slab larger than provided.
*/
#define MAX_SCANNED_MEMBER_SLAB \
(sizeof(unsigned int)*8 - 1 \
- BOUND_SIZEOF_SCANNED_MEMBER_LOG2 \
- FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2)
(sizeof(unsigned int) * 8 - 1 - BOUND_SIZEOF_SCANNED_MEMBER_LOG2 - \
FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2)
#define REQUIRED_FIELD_BITMAP_SET(index) \
(required_fields_bitmap[(index)/8] |= (1UL<<((index)%
8)))
(required_fields_bitmap[(index) / 8] |= (1UL << ((index) %
8)))
#define REQUIRED_FIELD_BITMAP_IS_SET(index) \
(required_fields_bitmap[(index)/8] & (1UL<<((index)%
8)))
(required_fields_bitmap[(index) / 8] & (1UL << ((index) %
8)))
ProtobufCMessage
*
protobuf_c_message_unpack
(
const
ProtobufCMessageDescriptor
*
desc
,
ProtobufCAllocator
*
allocator
,
size_t
len
,
const
uint8_t
*
data
)
{
ProtobufCMessage
*
protobuf_c_message_unpack
(
const
ProtobufCMessageDescriptor
*
desc
,
ProtobufCAllocator
*
allocator
,
size_t
len
,
const
uint8_t
*
data
)
{
ProtobufCMessage
*
rv
;
size_t
rem
=
len
;
const
uint8_t
*
at
=
data
;
const
ProtobufCFieldDescriptor
*
last_field
=
desc
->
fields
+
0
;
ScannedMember
first_member_slab
[
1UL
<<
FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2
];
ScannedMember
first_member_slab
[
1UL
<<
FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2
];
/*
* scanned_member_slabs[i] is an array of arrays of ScannedMember.
...
...
@@ -3041,12 +2712,10 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
ASSERT_IS_MESSAGE_DESCRIPTOR
(
desc
);
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
rv
=
do_alloc
(
allocator
,
desc
->
sizeof_message
);
if
(
!
rv
)
return
(
NULL
);
if
(
!
rv
)
return
(
NULL
);
scanned_member_slabs
[
0
]
=
first_member_slab
;
required_fields_bitmap_len
=
(
desc
->
n_fields
+
7
)
/
8
;
...
...
@@ -3080,7 +2749,7 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
if
(
used
==
0
)
{
PROTOBUF_C_UNPACK_ERROR
(
"error parsing tag/wiretype at offset %u"
,
(
unsigned
)
(
at
-
data
));
(
unsigned
)
(
at
-
data
));
goto
error_cleanup_during_scan
;
}
/*
...
...
@@ -3090,9 +2759,7 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
if
(
last_field
==
NULL
||
last_field
->
id
!=
tag
)
{
/* lookup field */
int
field_index
=
int_range_lookup
(
desc
->
n_field_ranges
,
desc
->
field_ranges
,
tag
);
int_range_lookup
(
desc
->
n_field_ranges
,
desc
->
field_ranges
,
tag
);
if
(
field_index
<
0
)
{
field
=
NULL
;
n_unknown
++
;
...
...
@@ -3122,11 +2789,10 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
unsigned
i
;
for
(
i
=
0
;
i
<
max_len
;
i
++
)
if
((
at
[
i
]
&
0x80
)
==
0
)
break
;
if
((
at
[
i
]
&
0x80
)
==
0
)
break
;
if
(
i
==
max_len
)
{
PROTOBUF_C_UNPACK_ERROR
(
"unterminated varint at offset %u"
,
(
unsigned
)
(
at
-
data
));
(
unsigned
)
(
at
-
data
));
goto
error_cleanup_during_scan
;
}
tmp
.
len
=
i
+
1
;
...
...
@@ -3135,7 +2801,7 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
case
PROTOBUF_C_WIRE_TYPE_64BIT
:
if
(
rem
<
8
)
{
PROTOBUF_C_UNPACK_ERROR
(
"too short after 64bit wiretype at offset %u"
,
(
unsigned
)
(
at
-
data
));
(
unsigned
)
(
at
-
data
));
goto
error_cleanup_during_scan
;
}
tmp
.
len
=
8
;
...
...
@@ -3154,20 +2820,19 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
case
PROTOBUF_C_WIRE_TYPE_32BIT
:
if
(
rem
<
4
)
{
PROTOBUF_C_UNPACK_ERROR
(
"too short after 32bit wiretype at offset %u"
,
(
unsigned
)
(
at
-
data
));
(
unsigned
)
(
at
-
data
));
goto
error_cleanup_during_scan
;
}
tmp
.
len
=
4
;
break
;
default:
PROTOBUF_C_UNPACK_ERROR
(
"unsupported tag %u at offset %u"
,
wire_type
,
(
unsigned
)
(
at
-
data
));
PROTOBUF_C_UNPACK_ERROR
(
"unsupported tag %u at offset %u"
,
wire_type
,
(
unsigned
)
(
at
-
data
));
goto
error_cleanup_during_scan
;
}
if
(
in_slab_index
==
(
1UL
<<
(
which_slab
+
FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2
)))
{
if
(
in_slab_index
==
(
1UL
<<
(
which_slab
+
FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2
)))
{
size_t
size
;
in_slab_index
=
0
;
...
...
@@ -3185,20 +2850,13 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
scanned_member_slabs
[
which_slab
][
in_slab_index
++
]
=
tmp
;
if
(
field
!=
NULL
&&
field
->
label
==
PROTOBUF_C_LABEL_REPEATED
)
{
size_t
*
n
=
STRUCT_MEMBER_PTR
(
size_t
,
rv
,
field
->
quantifier_offset
);
size_t
*
n
=
STRUCT_MEMBER_PTR
(
size_t
,
rv
,
field
->
quantifier_offset
);
if
(
wire_type
==
PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED
&&
(
0
!=
(
field
->
flags
&
PROTOBUF_C_FIELD_FLAG_PACKED
)
||
is_packable_type
(
field
->
type
)))
{
is_packable_type
(
field
->
type
)))
{
size_t
count
;
if
(
!
count_packed_elements
(
field
->
type
,
tmp
.
len
-
tmp
.
length_prefix_len
,
tmp
.
data
+
tmp
.
length_prefix_len
,
&
count
))
{
if
(
!
count_packed_elements
(
field
->
type
,
tmp
.
len
-
tmp
.
length_prefix_len
,
tmp
.
data
+
tmp
.
length_prefix_len
,
&
count
))
{
PROTOBUF_C_UNPACK_ERROR
(
"counting packed elements"
);
goto
error_cleanup_during_scan
;
}
...
...
@@ -3212,26 +2870,23 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
rem
-=
tmp
.
len
;
}
/* allocate space for repeated fields, also check that all required fields have been set */
/* allocate space for repeated fields, also check that all required fields
* have been set */
for
(
f
=
0
;
f
<
desc
->
n_fields
;
f
++
)
{
const
ProtobufCFieldDescriptor
*
field
=
desc
->
fields
+
f
;
if
(
field
->
label
==
PROTOBUF_C_LABEL_REPEATED
)
{
size_t
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
size_t
*
n_ptr
=
STRUCT_MEMBER_PTR
(
size_t
,
rv
,
field
->
quantifier_offset
);
size_t
siz
=
sizeof_elt_in_repeated_array
(
field
->
type
);
size_t
*
n_ptr
=
STRUCT_MEMBER_PTR
(
size_t
,
rv
,
field
->
quantifier_offset
);
if
(
*
n_ptr
!=
0
)
{
unsigned
n
=
*
n_ptr
;
void
*
a
;
*
n_ptr
=
0
;
assert
(
rv
->
descriptor
!=
NULL
);
#define CLEAR_REMAINING_N_PTRS() \
for(f++;f < desc->n_fields; f++) \
{ \
for (f++; f < desc->n_fields; f++) { \
field = desc->fields + f; \
if (field->label == PROTOBUF_C_LABEL_REPEATED) \
STRUCT_MEMBER
(size_t, rv, field->quantifier_offset) = 0; \
STRUCT_MEMBER
(size_t, rv, field->quantifier_offset) = 0; \
}
a
=
do_alloc
(
allocator
,
siz
*
n
);
if
(
!
a
)
{
...
...
@@ -3241,9 +2896,7 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
STRUCT_MEMBER
(
void
*
,
rv
,
field
->
offset
)
=
a
;
}
}
else
if
(
field
->
label
==
PROTOBUF_C_LABEL_REQUIRED
)
{
if
(
field
->
default_value
==
NULL
&&
!
REQUIRED_FIELD_BITMAP_IS_SET
(
f
))
{
if
(
field
->
default_value
==
NULL
&&
!
REQUIRED_FIELD_BITMAP_IS_SET
(
f
))
{
CLEAR_REMAINING_N_PTRS
();
PROTOBUF_C_UNPACK_ERROR
(
"message '%s': missing required field '%s'"
,
desc
->
name
,
field
->
name
);
...
...
@@ -3255,128 +2908,109 @@ protobuf_c_message_unpack(const ProtobufCMessageDescriptor *desc,
/* allocate space for unknown fields */
if
(
n_unknown
)
{
rv
->
unknown_fields
=
do_alloc
(
allocator
,
n_unknown
*
sizeof
(
ProtobufCMessageUnknownField
));
if
(
rv
->
unknown_fields
==
NULL
)
goto
error_cleanup
;
rv
->
unknown_fields
=
do_alloc
(
allocator
,
n_unknown
*
sizeof
(
ProtobufCMessageUnknownField
));
if
(
rv
->
unknown_fields
==
NULL
)
goto
error_cleanup
;
}
/* do real parsing */
for
(
i_slab
=
0
;
i_slab
<=
which_slab
;
i_slab
++
)
{
unsigned
max
=
(
i_slab
==
which_slab
)
?
in_slab_index
:
(
1UL
<<
(
i_slab
+
4
));
unsigned
max
=
(
i_slab
==
which_slab
)
?
in_slab_index
:
(
1UL
<<
(
i_slab
+
4
));
ScannedMember
*
slab
=
scanned_member_slabs
[
i_slab
];
for
(
j
=
0
;
j
<
max
;
j
++
)
{
if
(
!
parse_member
(
slab
+
j
,
rv
,
allocator
))
{
PROTOBUF_C_UNPACK_ERROR
(
"error parsing member %s of %s"
,
slab
->
field
?
slab
->
field
->
name
:
"*unknown-field*
"
,
desc
->
name
);
PROTOBUF_C_UNPACK_ERROR
(
"error parsing member %s of %s
"
,
slab
->
field
?
slab
->
field
->
name
:
"*unknown-field*"
,
desc
->
name
);
goto
error_cleanup
;
}
}
}
/* cleanup */
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
if
(
required_fields_bitmap_alloced
)
do_free
(
allocator
,
required_fields_bitmap
);
return
rv
;
error_cleanup:
protobuf_c_message_free_unpacked
(
rv
,
allocator
);
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
if
(
required_fields_bitmap_alloced
)
do_free
(
allocator
,
required_fields_bitmap
);
return
NULL
;
error_cleanup_during_scan:
do_free
(
allocator
,
rv
);
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
for
(
j
=
1
;
j
<=
which_slab
;
j
++
)
do_free
(
allocator
,
scanned_member_slabs
[
j
]);
if
(
required_fields_bitmap_alloced
)
do_free
(
allocator
,
required_fields_bitmap
);
return
NULL
;
}
void
protobuf_c_message_free_unpacked
(
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
void
protobuf_c_message_free_unpacked
(
ProtobufCMessage
*
message
,
ProtobufCAllocator
*
allocator
)
{
const
ProtobufCMessageDescriptor
*
desc
;
unsigned
f
;
if
(
message
==
NULL
)
return
;
if
(
message
==
NULL
)
return
;
desc
=
message
->
descriptor
;
ASSERT_IS_MESSAGE
(
message
);
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
if
(
allocator
==
NULL
)
allocator
=
&
protobuf_c__allocator
;
message
->
descriptor
=
NULL
;
for
(
f
=
0
;
f
<
desc
->
n_fields
;
f
++
)
{
if
(
0
!=
(
desc
->
fields
[
f
].
flags
&
PROTOBUF_C_FIELD_FLAG_ONEOF
)
&&
desc
->
fields
[
f
].
id
!=
STRUCT_MEMBER
(
uint32_t
,
message
,
desc
->
fields
[
f
].
quantifier_offset
))
{
STRUCT_MEMBER
(
uint32_t
,
message
,
desc
->
fields
[
f
].
quantifier_offset
))
{
/* This is not the selected oneof, skip it */
continue
;
}
if
(
desc
->
fields
[
f
].
label
==
PROTOBUF_C_LABEL_REPEATED
)
{
size_t
n
=
STRUCT_MEMBER
(
size_t
,
message
,
desc
->
fields
[
f
].
quantifier_offset
);
void
*
arr
=
STRUCT_MEMBER
(
void
*
,
message
,
desc
->
fields
[
f
].
offset
);
size_t
n
=
STRUCT_MEMBER
(
size_t
,
message
,
desc
->
fields
[
f
].
quantifier_offset
);
void
*
arr
=
STRUCT_MEMBER
(
void
*
,
message
,
desc
->
fields
[
f
].
offset
);
if
(
arr
!=
NULL
)
{
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_STRING
)
{
unsigned
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
do_free
(
allocator
,
((
char
**
)
arr
)[
i
]);
for
(
i
=
0
;
i
<
n
;
i
++
)
do_free
(
allocator
,
((
char
**
)
arr
)[
i
]);
}
else
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_BYTES
)
{
unsigned
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
do_free
(
allocator
,
((
ProtobufCBinaryData
*
)
arr
)[
i
].
data
);
do_free
(
allocator
,
((
ProtobufCBinaryData
*
)
arr
)[
i
].
data
);
}
else
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_MESSAGE
)
{
unsigned
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
protobuf_c_message_free_unpacked
(
((
ProtobufCMessage
**
)
arr
)[
i
],
allocator
);
protobuf_c_message_free_unpacked
(((
ProtobufCMessage
**
)
arr
)[
i
],
allocator
);
}
do_free
(
allocator
,
arr
);
}
}
else
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_STRING
)
{
char
*
str
=
STRUCT_MEMBER
(
char
*
,
message
,
desc
->
fields
[
f
].
offset
);
char
*
str
=
STRUCT_MEMBER
(
char
*
,
message
,
desc
->
fields
[
f
].
offset
);
if
(
str
&&
str
!=
desc
->
fields
[
f
].
default_value
)
do_free
(
allocator
,
str
);
if
(
str
&&
str
!=
desc
->
fields
[
f
].
default_value
)
do_free
(
allocator
,
str
);
}
else
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_BYTES
)
{
void
*
data
=
STRUCT_MEMBER
(
ProtobufCBinaryData
,
message
,
desc
->
fields
[
f
].
offset
).
data
;
void
*
data
=
STRUCT_MEMBER
(
ProtobufCBinaryData
,
message
,
desc
->
fields
[
f
].
offset
)
.
data
;
const
ProtobufCBinaryData
*
default_bd
;
default_bd
=
desc
->
fields
[
f
].
default_value
;
if
(
data
!=
NULL
&&
(
default_bd
==
NULL
||
default_bd
->
data
!=
data
))
{
if
(
data
!=
NULL
&&
(
default_bd
==
NULL
||
default_bd
->
data
!=
data
))
{
do_free
(
allocator
,
data
);
}
}
else
if
(
desc
->
fields
[
f
].
type
==
PROTOBUF_C_TYPE_MESSAGE
)
{
ProtobufCMessage
*
sm
;
sm
=
STRUCT_MEMBER
(
ProtobufCMessage
*
,
message
,
desc
->
fields
[
f
].
offset
);
sm
=
STRUCT_MEMBER
(
ProtobufCMessage
*
,
message
,
desc
->
fields
[
f
].
offset
);
if
(
sm
&&
sm
!=
desc
->
fields
[
f
].
default_value
)
protobuf_c_message_free_unpacked
(
sm
,
allocator
);
}
...
...
@@ -3390,22 +3024,16 @@ protobuf_c_message_free_unpacked(ProtobufCMessage *message,
do_free
(
allocator
,
message
);
}
void
protobuf_c_message_init
(
const
ProtobufCMessageDescriptor
*
descriptor
,
void
*
message
)
{
descriptor
->
message_init
((
ProtobufCMessage
*
)
(
message
));
void
protobuf_c_message_init
(
const
ProtobufCMessageDescriptor
*
descriptor
,
void
*
message
)
{
descriptor
->
message_init
((
ProtobufCMessage
*
)(
message
));
}
protobuf_c_boolean
protobuf_c_message_check
(
const
ProtobufCMessage
*
message
)
{
protobuf_c_boolean
protobuf_c_message_check
(
const
ProtobufCMessage
*
message
)
{
unsigned
i
;
if
(
!
message
||
!
message
->
descriptor
||
message
->
descriptor
->
magic
!=
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC
)
{
if
(
!
message
||
!
message
->
descriptor
||
message
->
descriptor
->
magic
!=
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC
)
{
return
FALSE
;
}
...
...
@@ -3413,56 +3041,51 @@ protobuf_c_message_check(const ProtobufCMessage *message)
const
ProtobufCFieldDescriptor
*
f
=
message
->
descriptor
->
fields
+
i
;
ProtobufCType
type
=
f
->
type
;
ProtobufCLabel
label
=
f
->
label
;
void
*
field
=
STRUCT_MEMBER_P
(
message
,
f
->
offset
);
void
*
field
=
STRUCT_MEMBER_P
(
message
,
f
->
offset
);
if
(
label
==
PROTOBUF_C_LABEL_REPEATED
)
{
size_t
*
quantity
=
STRUCT_MEMBER_P
(
message
,
f
->
quantifier_offset
);
size_t
*
quantity
=
STRUCT_MEMBER_P
(
message
,
f
->
quantifier_offset
);
if
(
*
quantity
>
0
&&
*
(
void
**
)
field
==
NULL
)
{
if
(
*
quantity
>
0
&&
*
(
void
**
)
field
==
NULL
)
{
return
FALSE
;
}
if
(
type
==
PROTOBUF_C_TYPE_MESSAGE
)
{
ProtobufCMessage
**
submessage
=
*
(
ProtobufCMessage
***
)
field
;
ProtobufCMessage
**
submessage
=
*
(
ProtobufCMessage
***
)
field
;
unsigned
j
;
for
(
j
=
0
;
j
<
*
quantity
;
j
++
)
{
if
(
!
protobuf_c_message_check
(
submessage
[
j
]))
return
FALSE
;
if
(
!
protobuf_c_message_check
(
submessage
[
j
]))
return
FALSE
;
}
}
else
if
(
type
==
PROTOBUF_C_TYPE_STRING
)
{
char
**
string
=
*
(
char
***
)
field
;
char
**
string
=
*
(
char
***
)
field
;
unsigned
j
;
for
(
j
=
0
;
j
<
*
quantity
;
j
++
)
{
if
(
!
string
[
j
])
return
FALSE
;
if
(
!
string
[
j
])
return
FALSE
;
}
}
else
if
(
type
==
PROTOBUF_C_TYPE_BYTES
)
{
ProtobufCBinaryData
*
bd
=
*
(
ProtobufCBinaryData
**
)
field
;
ProtobufCBinaryData
*
bd
=
*
(
ProtobufCBinaryData
**
)
field
;
unsigned
j
;
for
(
j
=
0
;
j
<
*
quantity
;
j
++
)
{
if
(
bd
[
j
].
len
>
0
&&
bd
[
j
].
data
==
NULL
)
return
FALSE
;
if
(
bd
[
j
].
len
>
0
&&
bd
[
j
].
data
==
NULL
)
return
FALSE
;
}
}
}
else
{
/* PROTOBUF_C_LABEL_REQUIRED or PROTOBUF_C_LABEL_OPTIONAL */
if
(
type
==
PROTOBUF_C_TYPE_MESSAGE
)
{
ProtobufCMessage
*
submessage
=
*
(
ProtobufCMessage
**
)
field
;
ProtobufCMessage
*
submessage
=
*
(
ProtobufCMessage
**
)
field
;
if
(
label
==
PROTOBUF_C_LABEL_REQUIRED
||
submessage
!=
NULL
)
{
if
(
!
protobuf_c_message_check
(
submessage
))
return
FALSE
;
if
(
!
protobuf_c_message_check
(
submessage
))
return
FALSE
;
}
}
else
if
(
type
==
PROTOBUF_C_TYPE_STRING
)
{
char
*
string
=
*
(
char
**
)
field
;
if
(
label
==
PROTOBUF_C_LABEL_REQUIRED
&&
string
==
NULL
)
return
FALSE
;
char
*
string
=
*
(
char
**
)
field
;
if
(
label
==
PROTOBUF_C_LABEL_REQUIRED
&&
string
==
NULL
)
return
FALSE
;
}
else
if
(
type
==
PROTOBUF_C_TYPE_BYTES
)
{
protobuf_c_boolean
*
has
=
STRUCT_MEMBER_P
(
message
,
f
->
quantifier_offset
);
protobuf_c_boolean
*
has
=
STRUCT_MEMBER_P
(
message
,
f
->
quantifier_offset
);
ProtobufCBinaryData
*
bd
=
field
;
if
(
label
==
PROTOBUF_C_LABEL_REQUIRED
||
*
has
==
TRUE
)
{
if
(
bd
->
len
>
0
&&
bd
->
data
==
NULL
)
return
FALSE
;
if
(
bd
->
len
>
0
&&
bd
->
data
==
NULL
)
return
FALSE
;
}
}
}
...
...
@@ -3473,17 +3096,13 @@ protobuf_c_message_check(const ProtobufCMessage *message)
/* === services === */
typedef
void
(
*
GenericHandler
)
(
void
*
service
,
const
ProtobufCMessage
*
input
,
ProtobufCClosure
closure
,
void
*
closure_data
);
void
protobuf_c_service_invoke_internal
(
ProtobufCService
*
service
,
typedef
void
(
*
GenericHandler
)(
void
*
service
,
const
ProtobufCMessage
*
input
,
ProtobufCClosure
closure
,
void
*
closure_data
);
void
protobuf_c_service_invoke_internal
(
ProtobufCService
*
service
,
unsigned
method_index
,
const
ProtobufCMessage
*
input
,
ProtobufCClosure
closure
,
void
*
closure_data
)
{
void
*
closure_data
)
{
GenericHandler
*
handlers
;
GenericHandler
handler
;
...
...
@@ -3498,7 +3117,7 @@ protobuf_c_service_invoke_internal(ProtobufCService *service,
* Get the array of virtual methods (which are enumerated by the
* generated code).
*/
handlers
=
(
GenericHandler
*
)
(
service
+
1
);
handlers
=
(
GenericHandler
*
)
(
service
+
1
);
/*
* Get our method and invoke it.
...
...
@@ -3508,11 +3127,9 @@ protobuf_c_service_invoke_internal(ProtobufCService *service,
(
*
handler
)(
service
,
input
,
closure
,
closure_data
);
}
void
protobuf_c_service_generated_init
(
ProtobufCService
*
service
,
const
ProtobufCServiceDescriptor
*
descriptor
,
ProtobufCServiceDestroy
destroy
)
{
void
protobuf_c_service_generated_init
(
ProtobufCService
*
service
,
const
ProtobufCServiceDescriptor
*
descriptor
,
ProtobufCServiceDestroy
destroy
)
{
ASSERT_IS_SERVICE_DESCRIPTOR
(
descriptor
);
service
->
descriptor
=
descriptor
;
service
->
destroy
=
destroy
;
...
...
@@ -3520,22 +3137,18 @@ protobuf_c_service_generated_init(ProtobufCService *service,
memset
(
service
+
1
,
0
,
descriptor
->
n_methods
*
sizeof
(
GenericHandler
));
}
void
protobuf_c_service_destroy
(
ProtobufCService
*
service
)
{
void
protobuf_c_service_destroy
(
ProtobufCService
*
service
)
{
service
->
destroy
(
service
);
}
/* --- querying the descriptors --- */
const
ProtobufCEnumValue
*
protobuf_c_enum_descriptor_get_value_by_name
(
const
ProtobufCEnumDescriptor
*
desc
,
const
char
*
name
)
{
const
ProtobufCEnumValue
*
protobuf_c_enum_descriptor_get_value_by_name
(
const
ProtobufCEnumDescriptor
*
desc
,
const
char
*
name
)
{
unsigned
start
=
0
;
unsigned
count
;
if
(
desc
==
NULL
||
desc
->
values_by_name
==
NULL
)
return
NULL
;
if
(
desc
==
NULL
||
desc
->
values_by_name
==
NULL
)
return
NULL
;
count
=
desc
->
n_value_names
;
...
...
@@ -3550,33 +3163,26 @@ protobuf_c_enum_descriptor_get_value_by_name(const ProtobufCEnumDescriptor *desc
}
else
count
=
mid
-
start
;
}
if
(
count
==
0
)
return
NULL
;
if
(
count
==
0
)
return
NULL
;
if
(
strcmp
(
desc
->
values_by_name
[
start
].
name
,
name
)
==
0
)
return
desc
->
values
+
desc
->
values_by_name
[
start
].
index
;
return
NULL
;
}
const
ProtobufCEnumValue
*
protobuf_c_enum_descriptor_get_value
(
const
ProtobufCEnumDescriptor
*
desc
,
int
value
)
{
const
ProtobufCEnumValue
*
protobuf_c_enum_descriptor_get_value
(
const
ProtobufCEnumDescriptor
*
desc
,
int
value
)
{
int
rv
=
int_range_lookup
(
desc
->
n_value_ranges
,
desc
->
value_ranges
,
value
);
if
(
rv
<
0
)
return
NULL
;
if
(
rv
<
0
)
return
NULL
;
return
desc
->
values
+
rv
;
}
const
ProtobufCFieldDescriptor
*
protobuf_c_message_descriptor_get_field_by_name
(
const
ProtobufCMessageDescriptor
*
desc
,
const
char
*
name
)
{
const
ProtobufCFieldDescriptor
*
protobuf_c_message_descriptor_get_field_by_name
(
const
ProtobufCMessageDescriptor
*
desc
,
const
char
*
name
)
{
unsigned
start
=
0
;
unsigned
count
;
const
ProtobufCFieldDescriptor
*
field
;
if
(
desc
==
NULL
||
desc
->
fields_sorted_by_name
==
NULL
)
return
NULL
;
if
(
desc
==
NULL
||
desc
->
fields_sorted_by_name
==
NULL
)
return
NULL
;
count
=
desc
->
n_fields
;
...
...
@@ -3593,33 +3199,26 @@ protobuf_c_message_descriptor_get_field_by_name(const ProtobufCMessageDescriptor
}
else
count
=
mid
-
start
;
}
if
(
count
==
0
)
return
NULL
;
if
(
count
==
0
)
return
NULL
;
field
=
desc
->
fields
+
desc
->
fields_sorted_by_name
[
start
];
if
(
strcmp
(
field
->
name
,
name
)
==
0
)
return
field
;
if
(
strcmp
(
field
->
name
,
name
)
==
0
)
return
field
;
return
NULL
;
}
const
ProtobufCFieldDescriptor
*
protobuf_c_message_descriptor_get_field
(
const
ProtobufCMessageDescriptor
*
desc
,
unsigned
value
)
{
int
rv
=
int_range_lookup
(
desc
->
n_field_ranges
,
desc
->
field_ranges
,
value
);
if
(
rv
<
0
)
return
NULL
;
const
ProtobufCFieldDescriptor
*
protobuf_c_message_descriptor_get_field
(
const
ProtobufCMessageDescriptor
*
desc
,
unsigned
value
)
{
int
rv
=
int_range_lookup
(
desc
->
n_field_ranges
,
desc
->
field_ranges
,
value
);
if
(
rv
<
0
)
return
NULL
;
return
desc
->
fields
+
rv
;
}
const
ProtobufCMethodDescriptor
*
protobuf_c_service_descriptor_get_method_by_name
(
const
ProtobufCServiceDescriptor
*
desc
,
const
char
*
name
)
{
protobuf_c_service_descriptor_get_method_by_name
(
const
ProtobufCServiceDescriptor
*
desc
,
const
char
*
name
)
{
unsigned
start
=
0
;
unsigned
count
;
if
(
desc
==
NULL
||
desc
->
method_indices_by_name
==
NULL
)
return
NULL
;
if
(
desc
==
NULL
||
desc
->
method_indices_by_name
==
NULL
)
return
NULL
;
count
=
desc
->
n_methods
;
...
...
@@ -3629,8 +3228,7 @@ protobuf_c_service_descriptor_get_method_by_name(const ProtobufCServiceDescripto
const
char
*
mid_name
=
desc
->
methods
[
mid_index
].
name
;
int
rv
=
strcmp
(
mid_name
,
name
);
if
(
rv
==
0
)
return
desc
->
methods
+
desc
->
method_indices_by_name
[
mid
];
if
(
rv
==
0
)
return
desc
->
methods
+
desc
->
method_indices_by_name
[
mid
];
if
(
rv
<
0
)
{
count
=
start
+
count
-
(
mid
+
1
);
start
=
mid
+
1
;
...
...
@@ -3638,9 +3236,9 @@ protobuf_c_service_descriptor_get_method_by_name(const ProtobufCServiceDescripto
count
=
mid
-
start
;
}
}
if
(
count
==
0
)
return
NULL
;
if
(
strcmp
(
desc
->
methods
[
desc
->
method_indices_by_name
[
start
]].
name
,
name
)
==
0
)
if
(
count
==
0
)
return
NULL
;
if
(
strcmp
(
desc
->
methods
[
desc
->
method_indices_by_name
[
start
]].
name
,
name
)
==
0
)
return
desc
->
methods
+
desc
->
method_indices_by_name
[
start
];
return
NULL
;
}
tools/pre-commit.hooks/cpplint.hook
浏览文件 @
2bad95ec
...
...
@@ -3,7 +3,7 @@
TOTAL_ERRORS
=
0
# The trick to remove deleted files: https://stackoverflow.com/a/2413151
for
file
in
$(
git diff
--cached
--name-status
|
awk
'$1 != "D" {print $2}'
|
grep
-v
".pb.cpp"
|
grep
-v
".pb.h"
)
;
do
for
file
in
$(
git diff
--cached
--name-status
|
awk
'$1 != "D" {print $2}'
|
grep
-v
".pb.cpp"
|
grep
-v
".pb.h"
|
grep
-v
"protobuf-c.*"
)
;
do
cpplint
$file
;
TOTAL_ERRORS
=
$(
expr
$TOTAL_ERRORS
+
$?
)
;
done
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录