/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * 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.
 */

#ifndef _LINKER_LEB128_H
#define _LINKER_LEB128_H

#include <stdint.h>

// Helper classes for decoding LEB128, used in packed relocation data.
// http://en.wikipedia.org/wiki/LEB128

class leb128_decoder {
 public:
  leb128_decoder(const uint8_t* buffer, size_t count)
      : current_(buffer), end_(buffer + count) { }

  size_t pop_front() {
    size_t value = 0;

    size_t shift = 0;
    uint8_t byte;

    do {
      if (current_ >= end_) {
        __libc_fatal("leb128_decoder ran out of bounds");
      }
      byte = *current_++;
      value |= static_cast<size_t>(byte & 127) << shift;
      shift += 7;
    } while (byte & 128);

    return value;
  }

 private:
  const uint8_t* current_;
  const uint8_t* const end_;
};

class sleb128_decoder {
 public:
  sleb128_decoder(const uint8_t* buffer, size_t count)
      : current_(buffer), end_(buffer+count) { }

  size_t pop_front() {
    size_t value = 0;
    static const size_t size = CHAR_BIT * sizeof(value);

    size_t shift = 0;
    uint8_t byte;

    do {
      if (current_ >= end_) {
        __libc_fatal("leb128_decoder ran out of bounds");
      }
      byte = *current_++;
      value |= (static_cast<size_t>(byte & 127) << shift);
      shift += 7;
    } while (byte & 128);

    if (shift < size && (byte & 64)) {
      value |= -(static_cast<size_t>(1) << shift);
    }

    return value;
  }

 private:
  const uint8_t* current_;
  const uint8_t* const end_;
};

#endif // __LINKER_LEB128_H

