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