5#include "sw/device/lib/base/status.h"
12const uint32_t MODULE_ID = 0;
14static const char *basename(
const char *file,
size_t *basename_len) {
21 while (f > file && f[-1] !=
'/' && f[-1] !=
'\\') {
28status_t status_create(absl_status_t code, uint32_t module_id,
const char *file,
32 return (status_t){.value = arg};
53 size_t basename_len = 0;
54 const char *f = basename(file, &basename_len);
55 module_id = basename_len >= 3 ? MAKE_MODULE_ID(f[0], f[1], f[2])
56 : MAKE_MODULE_ID(
'u',
'n',
'd');
60 .value = (int32_t)(module_id |
61 bitfield_bit32_write(0, STATUS_BIT_ERROR,
true) |
62 bitfield_field32_write(0, STATUS_FIELD_CODE, code) |
63 bitfield_field32_write(0, STATUS_FIELD_ARG,
67const char *status_codes[] = {
106bool status_extract(status_t s,
const char **code, int32_t *arg,
char *mod_id) {
107 size_t err = (size_t)status_err(s);
108 if (s.value < 0 && err == 0) {
109 err =
sizeof(status_codes) /
sizeof(status_codes[0]) - 1;
111 *code = status_codes[err];
113 *arg = (int32_t)bitfield_field32_read((uint32_t)s.value, STATUS_FIELD_ARG);
115 bitfield_field32_read((uint32_t)s.value, STATUS_FIELD_MODULE_ID);
116 *mod_id++ =
'@' + ((module_id >> 0) & 0x1F);
117 *mod_id++ =
'@' + ((module_id >> 5) & 0x1F);
118 *mod_id++ =
'@' + ((module_id >> 10) & 0x1F);
126extern bool status_ok(status_t s);
127extern absl_status_t status_err(status_t s);
133void status_report(status_t value) { (void)value; }