diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2024-06-20 08:11:38 +0000 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2024-06-20 08:11:38 +0000 |
commit | 24fa7a5107c5b75d1c197accf0305be64bc72882 (patch) | |
tree | 183f09c93417ac0e5f7f49760329a3d2cfaacda9 /ncurses/trace/lib_trace.c | |
parent | bf0ab54638a5ef969749f6ceae30e864f9556ea8 (diff) |
Vendor import ncurses 6.5vendor/ncurses/6.5vendor/ncurses
Diffstat (limited to 'ncurses/trace/lib_trace.c')
-rw-r--r-- | ncurses/trace/lib_trace.c | 99 |
1 files changed, 74 insertions, 25 deletions
diff --git a/ncurses/trace/lib_trace.c b/ncurses/trace/lib_trace.c index 5eb87fe0c176..0904c132fee1 100644 --- a/ncurses/trace/lib_trace.c +++ b/ncurses/trace/lib_trace.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 2018-2023,2024 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * @@ -37,7 +37,7 @@ /* * lib_trace.c - Tracing/Debugging routines * - * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982. + * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982. * pcurses allowed one to enable/disable tracing using traceon() and traceoff() * functions. ncurses provides a trace() function which allows one to * selectively enable or disable several tracing features. @@ -48,7 +48,7 @@ #include <ctype.h> -MODULE_ID("$Id: lib_trace.c,v 1.97 2020/08/29 16:22:03 juergen Exp $") +MODULE_ID("$Id: lib_trace.c,v 1.106 2024/02/24 18:28:19 tom Exp $") NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ @@ -89,45 +89,74 @@ NCURSES_EXPORT_VAR(long) _nc_outchars = 0; #define MyFP _nc_globals.trace_fp #define MyFD _nc_globals.trace_fd #define MyInit _nc_globals.trace_opened -#define MyPath _nc_globals.trace_fname #define MyLevel _nc_globals.trace_level #define MyNested _nc_globals.nested_tracef #endif /* TRACE */ +#if USE_REENTRANT +#define Locked(statement) \ + do { \ + _nc_lock_global(tst_tracef); \ + statement; \ + _nc_unlock_global(tst_tracef); \ + } while (0) +#else +#define Locked(statement) statement +#endif + NCURSES_EXPORT(unsigned) curses_trace(unsigned tracelevel) { unsigned result; + #if defined(TRACE) - result = _nc_tracing; + int bit; + +#define DATA(name) { name, #name } + static struct { + unsigned mask; + const char *name; + } trace_names[] = { + DATA(TRACE_TIMES), + DATA(TRACE_TPUTS), + DATA(TRACE_UPDATE), + DATA(TRACE_MOVE), + DATA(TRACE_CHARPUT), + DATA(TRACE_CALLS), + DATA(TRACE_VIRTPUT), + DATA(TRACE_IEVENT), + DATA(TRACE_BITS), + DATA(TRACE_ICALLS), + DATA(TRACE_CCALLS), + DATA(TRACE_DATABASE), + DATA(TRACE_ATTRS) + }; +#undef DATA + + Locked(result = _nc_tracing); + if ((MyFP == 0) && tracelevel) { MyInit = TRUE; if (MyFD >= 0) { MyFP = fdopen(MyFD, BIN_W); } else { - if (MyPath[0] == '\0') { - size_t size = sizeof(MyPath) - 12; - if (getcwd(MyPath, size) == 0) { - perror("curses: Can't get working directory"); - exit(EXIT_FAILURE); - } - MyPath[size] = '\0'; - assert(strlen(MyPath) <= size); - _nc_STRCAT(MyPath, "/trace", sizeof(MyPath)); - if (_nc_is_dir_path(MyPath)) { - _nc_STRCAT(MyPath, ".log", sizeof(MyPath)); - } + char myFile[80]; + + _nc_STRCPY(myFile, "trace", sizeof(myFile)); + if (_nc_is_dir_path(myFile)) { + _nc_STRCAT(myFile, ".log", sizeof(myFile)); } - if (_nc_access(MyPath, W_OK) < 0 - || (MyFD = open(MyPath, O_CREAT | O_EXCL | O_RDWR, 0600)) < 0 +#define SAFE_MODE (O_CREAT | O_EXCL | O_RDWR) + if (_nc_access(myFile, W_OK) < 0 + || (MyFD = safe_open3(myFile, SAFE_MODE, 0600)) < 0 || (MyFP = fdopen(MyFD, BIN_W)) == 0) { ; /* EMPTY */ } } - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); /* Try to set line-buffered mode, or (failing that) unbuffered, * so that the trace-output gets flushed automatically at the - * end of each line. This is useful in case the program dies. + * end of each line. This is useful in case the program dies. */ if (MyFP != 0) { #if HAVE_SETVBUF /* ANSI */ @@ -140,15 +169,33 @@ curses_trace(unsigned tracelevel) NCURSES_VERSION, NCURSES_VERSION_PATCH, tracelevel); + +#define SPECIAL_MASK(mask) \ + if ((tracelevel & mask) == mask) \ + _tracef("- %s (%u)", #mask, mask) + + for (bit = 0; bit < TRACE_SHIFT; ++bit) { + unsigned mask = (1U << bit) & tracelevel; + if ((mask & trace_names[bit].mask) != 0) { + _tracef("- %s (%u)", trace_names[bit].name, mask); + } + } + SPECIAL_MASK(TRACE_MAXIMUM); + else + SPECIAL_MASK(TRACE_ORDINARY); + + if (tracelevel > TRACE_MAXIMUM) { + _tracef("- DEBUG_LEVEL(%u)", tracelevel >> TRACE_SHIFT); + } } else if (tracelevel == 0) { if (MyFP != 0) { MyFD = dup(MyFD); /* allow reopen of same file */ fclose(MyFP); MyFP = 0; } - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); } else if (_nc_tracing != tracelevel) { - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); _tracef("tracelevel=%#x", tracelevel); } #else @@ -213,11 +260,13 @@ _nc_va_tracef(const char *fmt, va_list ap) # if USE_WEAK_SYMBOLS if ((pthread_self)) # endif + fprintf(fp, "%#" PRIxPTR ":", #ifdef _NC_WINDOWS - fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self().p); + CASTxPTR(pthread_self().p) #else - fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self()); + CASTxPTR(pthread_self()) #endif + ); #endif if (before || after) { int n; |