blob: 3313150d15e53dd1eecc343d253a0e7acde643f1 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
// Author: kenton@google.com (Kenton Varda)
#include "google/protobuf/stubs/common.h"
#include <errno.h>
#include <stdio.h>
#include <atomic>
#include <sstream>
#include <vector>
#ifdef _WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN // We only need minimal includes
#endif
#include <windows.h>
#define snprintf _snprintf // see comment in strutil.cc
#endif
#if defined(__ANDROID__)
#include <android/log.h>
#endif
#include "absl/log/absl_log.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "google/protobuf/stubs/callback.h"
// Must be last.
#include "google/protobuf/port_def.inc" // NOLINT
namespace google {
namespace protobuf {
namespace internal {
void VerifyVersion(int protobufVersionCompiledWith, const char* filename) {
// If the user's program is linked against a different version of Protobuf,
// GOOGLE_PROTOBUF_VERSION will have a different value.
if (GOOGLE_PROTOBUF_VERSION != protobufVersionCompiledWith) {
ABSL_LOG(FATAL)
<< "This program was compiled with Protobuf C++ version "
<< VersionString(protobufVersionCompiledWith)
<< ", but the linked version is "
<< VersionString(GOOGLE_PROTOBUF_VERSION)
<< ". Please update your library. If you compiled the program "
"yourself, make sure that"
"your headers are from the same version of Protocol Buffers as your "
"link-time library. (Version verification failed in \""
<< filename << "\".)";
}
}
std::string VersionString(int version) {
int major = version / 1000000;
int minor = (version / 1000) % 1000;
int micro = version % 1000;
// 128 bytes should always be enough, but we use snprintf() anyway to be
// safe.
char buffer[128];
snprintf(buffer, sizeof(buffer), "%d.%d.%d", major, minor, micro);
// Guard against broken MSVC snprintf().
buffer[sizeof(buffer)-1] = '\0';
return buffer;
}
std::string ProtocVersionString(int version) {
int minor = (version / 1000) % 1000;
int micro = version % 1000;
// 128 bytes should always be enough, but we use snprintf() anyway to be
// safe.
char buffer[128];
snprintf(buffer, sizeof(buffer), "%d.%d", minor, micro);
// Guard against broken MSVC snprintf().
buffer[sizeof(buffer) - 1] = '\0';
return buffer;
}
} // namespace internal
// ===================================================================
// emulates google3/base/callback.cc
Closure::~Closure() {}
namespace internal { FunctionClosure0::~FunctionClosure0() {} }
void DoNothing() {}
// ===================================================================
// emulates google3/util/endian/endian.h
uint32_t ghtonl(uint32_t x) {
union {
uint32_t result;
uint8_t result_array[4];
};
result_array[0] = static_cast<uint8_t>(x >> 24);
result_array[1] = static_cast<uint8_t>((x >> 16) & 0xFF);
result_array[2] = static_cast<uint8_t>((x >> 8) & 0xFF);
result_array[3] = static_cast<uint8_t>(x & 0xFF);
return result;
}
} // namespace protobuf
} // namespace google
#include "google/protobuf/port_undef.inc" // NOLINT