PipeWire  1.4.5
context.h
Go to the documentation of this file.
1 /* Simple Plugin API */
2 /* SPDX-FileCopyrightText: Copyright © 2023 Wim Taymans */
3 /* SPDX-License-Identifier: MIT */
4 
5 #ifndef SPA_DEBUG_CONTEXT_H
6 #define SPA_DEBUG_CONTEXT_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #include <stdio.h>
13 #include <stdarg.h>
14 #include <ctype.h>
15 
16 #include <spa/utils/defs.h>
22 #ifndef spa_debugn
23 #define spa_debugn(_fmt,...) printf((_fmt), ## __VA_ARGS__)
24 #endif
25 #ifndef spa_debug
26 #define spa_debug(_fmt,...) spa_debugn(_fmt"\n", ## __VA_ARGS__)
27 #endif
28 
29 
30 #ifndef SPA_API_DEBUG_CONTEXT
31  #ifdef SPA_API_IMPL
32  #define SPA_API_DEBUG_CONTEXT SPA_API_IMPL
33  #else
34  #define SPA_API_DEBUG_CONTEXT static inline
35  #endif
36 #endif
37 
38 struct spa_debug_context {
39  void (*log) (struct spa_debug_context *ctx, const char *fmt, ...) SPA_PRINTF_FUNC(2, 3);
40 };
41 
42 #define spa_debugc(_c,_fmt,...) (_c)?((_c)->log((_c),_fmt, ## __VA_ARGS__)):(void)spa_debug(_fmt, ## __VA_ARGS__)
43 
45  struct spa_error_location *loc)
46 {
47  int i, skip = loc->col > 80 ? loc->col - 40 : 0, lc = loc->col-skip-1;
48  char buf[80];
49 
50  for (i = 0; (size_t)i < sizeof(buf)-1 && (size_t)(i + skip) < loc->len; i++) {
51  char ch = loc->location[i + skip];
52  if (ch == '\n' || ch == '\0')
53  break;
54  buf[i] = isspace(ch) ? ' ' : ch;
55  }
56  buf[i] = '\0';
57  spa_debugc(c, "line:%6d | %s%s", loc->line, skip ? "..." : "", buf);
58  for (i = 0; buf[i]; i++)
59  buf[i] = i < lc ? '-' : i == lc ? '^' : ' ';
60  spa_debugc(c, "column:%4d |-%s%s", loc->col, skip ? "---" : "", buf);
61 }
62 
67 #ifdef __cplusplus
68 } /* extern "C" */
69 #endif
70 
71 #endif /* SPA_DEBUG_CONTEXT_H */
spa/utils/defs.h
#define spa_debugc(_c, _fmt,...)
Definition: context.h:49
SPA_API_DEBUG_CONTEXT void spa_debugc_error_location(struct spa_debug_context *c, struct spa_error_location *loc)
Definition: context.h:51
#define SPA_API_DEBUG_CONTEXT
Definition: context.h:41
#define SPA_PRINTF_FUNC(fmt, arg1)
Definition: defs.h:295
Definition: context.h:45
void(* log)(struct spa_debug_context *ctx, const char *fmt,...)
Definition: context.h:46
Definition: defs.h:439
int line
Definition: defs.h:440
const char * location
Definition: defs.h:443
int col
Definition: defs.h:441
size_t len
Definition: defs.h:442