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
9static void diag_addv(tobi_diag_list *dl, tobi_diag_level level, size_t off,
10 const char *source, size_t input_index, int has_source,
11 const char *fmt, va_list ap) {
12 if (dl->len == dl->cap) {
13 dl->cap = tobi_xgrow_cap(dl->cap, dl->len + 1u, 8u);
14 dl->items = tobi_xrealloc(dl->items, tobi_xmul_size(dl->cap, sizeof(dl->items[0])));
15 }
16 va_list cp;
17 va_copy(cp, ap);
18 int n = vsnprintf(NULL, 0, fmt, cp);
19 va_end(cp);
20 if (n < 0) {
21 n = 0;
22 }
23 char *msg = tobi_xmalloc((size_t)n + 1);
24 (void)vsnprintf(msg, (size_t)n + 1, fmt, ap);
25 dl->items[dl->len].level = level;
26 dl->items[dl->len].off = off;
27 dl->items[dl->len].source = has_source && source ? tobi_xstrdup(source) : NULL;
28 dl->items[dl->len].input_index = input_index;
29 dl->items[dl->len].has_source = has_source && source != NULL;
30 dl->items[dl->len].msg = msg;
31 dl->len++;
32}
33
34void tobi_diag_init(tobi_diag_list *dl) {
35 dl->items = NULL;
36 dl->len = 0;
37 dl->cap = 0;
38}
39
40void tobi_diag_free(tobi_diag_list *dl) {
41 for (size_t i = 0; i < dl->len; i++) {
42 free(dl->items[i].source);
43 free(dl->items[i].msg);
44 }
45 free(dl->items);
46 dl->items = NULL;
47 dl->len = 0;
48 dl->cap = 0;
49}
50
51void tobi_diag_add(tobi_diag_list *dl, tobi_diag_level level, size_t off, const char *fmt, ...) {
52 va_list ap;
53 va_start(ap, fmt);
54 diag_addv(dl, level, off, NULL, 0, 0, fmt, ap);
55 va_end(ap);
56}
57
58void tobi_diag_add_source(tobi_diag_list *dl, tobi_diag_level level, size_t off,
59 const char *source, size_t input_index, int has_source,
60 const char *fmt, ...) {
61 va_list ap;
62 va_start(ap, fmt);
63 diag_addv(dl, level, off, source, input_index, has_source, fmt, ap);
64 va_end(ap);
65}
66
67void tobi_diag_set_source(tobi_diag_list *dl, const char *source, size_t input_index) {
68 if (!dl || !source) {
69 return;
70 }
71 for (size_t i = 0; i < dl->len; i++) {
72 free(dl->items[i].source);
73 dl->items[i].source = tobi_xstrdup(source);
74 dl->items[i].input_index = input_index;
75 dl->items[i].has_source = 1;
76 }
77}
78
79int tobi_diag_has_error(const tobi_diag_list *dl) {
80 for (size_t i = 0; i < dl->len; i++) {
81 if (dl->items[i].level == TOBI_DIAG_ERROR) {
82 return 1;
83 }
84 }
85 return 0;
86}
87
88const char *tobi_diag_level_name(tobi_diag_level level) {
89 return level == TOBI_DIAG_ERROR ? "error" : "warning";
90}