Joe Onorato 6c9547d8e1 Add android.util.proto package as an @TestApi.
The classes there add a way for the platform to write out
protocol buffers that doesn't require lots of small objects,
generate code, and extra copying.

Includes the plugin for protoc to generate the constants.

Test: proto cts tests

Change-Id: I6385c198cecda9ac6fa533151609e3ace341af01
2016-10-12 16:37:18 -07:00

88 lines
1.6 KiB
C++

#include "Errors.h"
#include <stdlib.h>
namespace android {
namespace javastream_proto {
Errors ERRORS;
const string UNKNOWN_FILE;
const int UNKNOWN_LINE = 0;
Error::Error()
{
}
Error::Error(const Error& that)
:filename(that.filename),
lineno(that.lineno),
message(that.message)
{
}
Error::Error(const string& f, int l, const char* m)
:filename(f),
lineno(l),
message(m)
{
}
Errors::Errors()
:m_errors()
{
}
Errors::~Errors()
{
}
void
Errors::Add(const string& filename, int lineno, const char* format, ...)
{
va_list args;
va_start(args, format);
AddImpl(filename, lineno, format, args);
va_end(args);
}
void
Errors::AddImpl(const string& filename, int lineno, const char* format, va_list args)
{
va_list args2;
va_copy(args2, args);
int message_size = vsnprintf((char*)NULL, 0, format, args2);
va_end(args2);
char* buffer = new char[message_size+1];
vsnprintf(buffer, message_size, format, args);
Error error(filename, lineno, buffer);
delete[] buffer;
m_errors.push_back(error);
}
void
Errors::Print() const
{
for (vector<Error>::const_iterator it = m_errors.begin(); it != m_errors.end(); it++) {
if (it->filename == UNKNOWN_FILE) {
fprintf(stderr, "%s", it->message.c_str());
} else if (it->lineno == UNKNOWN_LINE) {
fprintf(stderr, "%s:%s", it->filename.c_str(), it->message.c_str());
} else {
fprintf(stderr, "%s:%d:%s", it->filename.c_str(), it->lineno, it->message.c_str());
}
}
}
bool
Errors::HasErrors() const
{
return m_errors.size() > 0;
}
} // namespace javastream_proto
} // namespace android