ACPI AML decompiler w/ CFG recovery and structured pseudocode
29

Configure Feed

Select the types of activity you want to include in your feed.

tobi / src / dg.c
2.6 kB 90 lines
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}