11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/* 21754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Copyright (C) 2016 The Android Open Source Project 31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * 41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License. 61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at 71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * 81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * 101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software 111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and 141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License. 151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */ 161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 17c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#include <android/util/protobuf.h> 181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 19c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace android { 20c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace util { 21c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin 22c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinuint8_t 23c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinread_wire_type(uint32_t varint) 2499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin{ 25974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin return (uint8_t) (varint & WIRE_TYPE_MASK); 2699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 2799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 28c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinuint32_t 29c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinread_field_id(uint32_t varint) 3099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin{ 31974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin return varint >> FIELD_ID_SHIFT; 32974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin} 33974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin 34974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinsize_t 35974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinget_varint_size(uint64_t varint) 36974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin{ 37974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin size_t size = 1; 38974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin while ((varint & ~0x7F)) { 39974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin size++; 40974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin varint >>= 7; 41974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin } 42974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin return size; 4399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 440ed9b68a3fa8f6eab536a93cb18ce75d7d22b757Yi Jin 4599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinuint8_t* 46974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinwrite_raw_varint(uint8_t* buf, uint64_t val) 471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{ 481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato uint8_t* p = buf; 491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato while (true) { 501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato if ((val & ~0x7F) == 0) { 511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *p++ = (uint8_t)val; 521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return p; 531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } else { 541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *p++ = (uint8_t)((val & 0x7F) | 0x80); 551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato val >>= 7; 561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato } 581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato} 591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 6099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinuint8_t* 611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratowrite_length_delimited_tag_header(uint8_t* buf, uint32_t fieldId, size_t size) 621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{ 63974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin buf = write_raw_varint(buf, (fieldId << FIELD_ID_SHIFT) | WIRE_TYPE_LENGTH_DELIMITED); 641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato buf = write_raw_varint(buf, size); 651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato return buf; 661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato} 671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato 68c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // util 69c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // android 70