#include "Errors.h"

#include <stdlib.h>

namespace android {
namespace stream_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 stream_proto
} // namespace android

