def _SignedVarintDecoder(mask):
  """Like _VarintDecoder() but decodes signed values."""


  def DecodeVarint(buffer, pos):
    result = 0
    shift = 0
    while 1:
      if pos > len(buffer) -1:
        raise NotEnoughDataException(  "Not enough data to decode varint" )
      b = local_ord(buffer[pos])
      result |= ((b & 0x7f) << shift)
      pos += 1
      if not (b & 0x80):
        if result > 0x7fffffffffffffff:
          result -= (1 << 64)
          result |= ~mask
        else:
          result &= mask
        return (result, pos)
      shift += 7
      if shift >= 64:
        raise _DecodeError('Too many bytes when decoding varint.')

  return DecodeVarint
def _SignedVarintDecoder ( mask ) : def DecodeVarint ( buffer , pos ) : result = 0 shift = 0 while 1 : if pos > len ( buffer ) - 1 : raise NotEnoughDataException ( "Not enough data to decode varint" ) b = local_ord ( buffer [ pos ] ) result |= ( ( b & 0x7f ) << shift ) pos += 1 if not ( b & 0x80 ) : if result > 0x7fffffffffffffff : result -= ( 1 << 64 ) result |= ~ mask else : result &= mask return ( result , pos ) shift += 7 if shift >= 64 : raise _DecodeError ( 'Too many bytes when decoding varint.' ) return DecodeVarint
Like _VarintDecoder() but decodes signed values.