Commit a12eeaaa authored by Luiz Capitulino's avatar Luiz Capitulino Committed by Anthony Liguori
Browse files

QError: Introduce qerror_format_desc()



Refactor non-QError-specific bits out of qerror_human() into general
function that can be used by the error_get_pretty() analogue in the
new error-propagation framework.

Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 23bf93b2
Loading
Loading
Loading
Loading
+25 −19
Original line number Diff line number Diff line
@@ -326,12 +326,14 @@ QError *qerror_from_info(const char *file, int linenr, const char *func,
    return qerr;
}

static void parse_error(const QError *qerror, int c)
static void parse_error(const QErrorStringTable *entry, int c)
{
    qerror_abort(qerror, "expected '%c' in '%s'", c, qerror->entry->desc);
    fprintf(stderr, "expected '%c' in '%s'", c, entry->desc);
    abort();
}

static const char *append_field(QString *outstr, const QError *qerror,
static const char *append_field(QDict *error, QString *outstr,
                                const QErrorStringTable *entry,
                                const char *start)
{
    QObject *obj;
@@ -340,23 +342,23 @@ static const char *append_field(QString *outstr, const QError *qerror,
    const char *end, *key;

    if (*start != '%')
        parse_error(qerror, '%');
        parse_error(entry, '%');
    start++;
    if (*start != '(')
        parse_error(qerror, '(');
        parse_error(entry, '(');
    start++;

    end = strchr(start, ')');
    if (!end)
        parse_error(qerror, ')');
        parse_error(entry, ')');

    key_qs = qstring_from_substr(start, 0, end - start - 1);
    key = qstring_get_str(key_qs);

    qdict = qobject_to_qdict(qdict_get(qerror->error, "data"));
    qdict = qobject_to_qdict(qdict_get(error, "data"));
    obj = qdict_get(qdict, key);
    if (!obj) {
        qerror_abort(qerror, "key '%s' not found in QDict", key);
        abort();
    }

    switch (qobject_type(obj)) {
@@ -367,41 +369,45 @@ static const char *append_field(QString *outstr, const QError *qerror,
            qstring_append_int(outstr, qdict_get_int(qdict, key));
            break;
        default:
            qerror_abort(qerror, "invalid type '%c'", qobject_type(obj));
            abort();
    }

    QDECREF(key_qs);
    return ++end;
}

/**
 * qerror_human(): Format QError data into human-readable string.
 *
 * Formats according to member 'desc' of the specified QError object.
 */
QString *qerror_human(const QError *qerror)
static QString *qerror_format_desc(QDict *error,
                                   const QErrorStringTable *entry)
{
    const char *p;
    QString *qstring;
    const char *p;

    assert(qerror->entry != NULL);
    assert(entry != NULL);

    qstring = qstring_new();

    for (p = qerror->entry->desc; *p != '\0';) {
    for (p = entry->desc; *p != '\0';) {
        if (*p != '%') {
            qstring_append_chr(qstring, *p++);
        } else if (*(p + 1) == '%') {
            qstring_append_chr(qstring, '%');
            p += 2;
        } else {
            p = append_field(qstring, qerror, p);
            p = append_field(error, qstring, entry, p);
        }
    }

    return qstring;
}

/**
 * qerror_human(): Format QError data into human-readable string.
 */
QString *qerror_human(const QError *qerror)
{
    return qerror_format_desc(qerror->error, qerror->entry);
}

/**
 * qerror_print(): Print QError data
 *