ACPI AML decompiler w/ CFG recovery and structured pseudocode
1#include "dg.h"
2
3#include "mem.h"
4
5#include <stdarg.h>
6#include <stdio.h>
7#include <stdlib.h>
8
9void tobi_diag_init(tobi_diag_list *dl) {
10 dl->items = NULL;
11 dl->len = 0;
12 dl->cap = 0;
13}
14
15void tobi_diag_free(tobi_diag_list *dl) {
16 for (size_t i = 0; i < dl->len; i++) {
17 free(dl->items[i].msg);
18 }
19 free(dl->items);
20 dl->items = NULL;
21 dl->len = 0;
22 dl->cap = 0;
23}
24
25void tobi_diag_add(tobi_diag_list *dl, tobi_diag_level level, size_t off, const char *fmt, ...) {
26 if (dl->len == dl->cap) {
27 dl->cap = dl->cap ? dl->cap * 2 : 8;
28 dl->items = tobi_xrealloc(dl->items, dl->cap * sizeof(dl->items[0]));
29 }
30 va_list ap;
31 va_start(ap, fmt);
32 va_list cp;
33 va_copy(cp, ap);
34 int n = vsnprintf(NULL, 0, fmt, cp);
35 va_end(cp);
36 if (n < 0) {
37 va_end(ap);
38 n = 0;
39 }
40 char *msg = tobi_xmalloc((size_t)n + 1);
41 (void)vsnprintf(msg, (size_t)n + 1, fmt, ap);
42 va_end(ap);
43 dl->items[dl->len].level = level;
44 dl->items[dl->len].off = off;
45 dl->items[dl->len].msg = msg;
46 dl->len++;
47}
48
49int tobi_diag_has_error(const tobi_diag_list *dl) {
50 for (size_t i = 0; i < dl->len; i++) {
51 if (dl->items[i].level == TOBI_DIAG_ERROR) {
52 return 1;
53 }
54 }
55 return 0;
56}
57
58const char *tobi_diag_level_name(tobi_diag_level level) {
59 return level == TOBI_DIAG_ERROR ? "error" : "warning";
60}