| 376 | } lpb_Value; |
| 377 | |
| 378 | static int lpb_addtype(lua_State *L, pb_Buffer *b, int idx, int type, size_t *plen) { |
| 379 | int ret = 0, expected = LUA_TNUMBER; |
| 380 | lpb_Value v; |
| 381 | size_t len = 0; |
| 382 | switch (type) { |
| 383 | case PB_Tbool: |
| 384 | len = pb_addvarint32(b, ret = lua_toboolean(L, idx)); |
| 385 | if (ret) len = 0; |
| 386 | ret = 1; |
| 387 | break; |
| 388 | case PB_Tdouble: |
| 389 | v.lnum = lua_tonumberx(L, idx, &ret); |
| 390 | if (ret) len = pb_addfixed64(b, pb_encode_double((double)v.lnum)); |
| 391 | if (v.lnum != 0.0) len = 0; |
| 392 | break; |
| 393 | case PB_Tfloat: |
| 394 | v.lnum = lua_tonumberx(L, idx, &ret); |
| 395 | if (ret) len = pb_addfixed32(b, pb_encode_float((float)v.lnum)); |
| 396 | if (v.lnum != 0.0) len = 0; |
| 397 | break; |
| 398 | case PB_Tfixed32: |
| 399 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 400 | if (ret) len = pb_addfixed32(b, v.u32); |
| 401 | if (v.u64 != 0) len = 0; |
| 402 | break; |
| 403 | case PB_Tsfixed32: |
| 404 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 405 | if (ret) len = pb_addfixed32(b, v.u32); |
| 406 | if (v.u64 != 0) len = 0; |
| 407 | break; |
| 408 | case PB_Tint32: |
| 409 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 410 | if (ret) len = pb_addvarint64(b, pb_expandsig((uint32_t)v.u64)); |
| 411 | if (v.u64 != 0) len = 0; |
| 412 | break; |
| 413 | case PB_Tuint32: |
| 414 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 415 | if (ret) len = pb_addvarint32(b, v.u32); |
| 416 | if (v.u64 != 0) len = 0; |
| 417 | break; |
| 418 | case PB_Tsint32: |
| 419 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 420 | if (ret) len = pb_addvarint32(b, pb_encode_sint32(v.u32)); |
| 421 | if (v.u64 != 0) len = 0; |
| 422 | break; |
| 423 | case PB_Tfixed64: |
| 424 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 425 | if (ret) len = pb_addfixed64(b, v.u64); |
| 426 | if (v.u64 != 0) len = 0; |
| 427 | break; |
| 428 | case PB_Tsfixed64: |
| 429 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 430 | if (ret) len = pb_addfixed64(b, v.u64); |
| 431 | if (v.u64 != 0) len = 0; |
| 432 | break; |
| 433 | case PB_Tint64: case PB_Tuint64: |
| 434 | v.u64 = lpb_tointegerx(L, idx, &ret); |
| 435 | if (ret) len = pb_addvarint64(b, v.u64); |
no test coverage detected