X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftrace%2Flib_trace.c;h=7e2ca854e656e158a4538dc174ba73ea50d1da9d;hp=4567054a9fd30120b47309d576e258d41033c9d1;hb=8890c8f28a1db5995ef17f52a7d8c0b9cf574210;hpb=5461fc336d03fbfea6b85ac21c6d49c528f6752d diff --git a/ncurses/trace/lib_trace.c b/ncurses/trace/lib_trace.c index 4567054a..7e2ca854 100644 --- a/ncurses/trace/lib_trace.c +++ b/ncurses/trace/lib_trace.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2016 Free Software Foundation, Inc. * + * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -47,7 +47,7 @@ #include -MODULE_ID("$Id: lib_trace.c,v 1.85 2016/12/31 13:50:06 tom Exp $") +MODULE_ID("$Id: lib_trace.c,v 1.94 2019/12/07 22:32:36 tom Exp $") NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ @@ -87,16 +87,22 @@ 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 */ -NCURSES_EXPORT(void) -trace(const unsigned int tracelevel) +NCURSES_EXPORT(unsigned) +curses_trace(unsigned tracelevel) { + unsigned result; +#if defined(TRACE) + result = _nc_tracing; if ((MyFP == 0) && tracelevel) { + MyInit = TRUE; if (MyFD >= 0) { - MyFP = fdopen(MyFD, "wb"); + MyFP = fdopen(MyFD, BIN_W); } else { if (MyPath[0] == '\0') { size_t size = sizeof(MyPath) - 12; @@ -113,7 +119,7 @@ trace(const unsigned int tracelevel) } if (_nc_access(MyPath, W_OK) < 0 || (MyFD = open(MyPath, O_CREAT | O_EXCL | O_RDWR, 0600)) < 0 - || (MyFP = fdopen(MyFD, "wb")) == 0) { + || (MyFP = fdopen(MyFD, BIN_W)) == 0) { ; /* EMPTY */ } } @@ -144,6 +150,18 @@ trace(const unsigned int tracelevel) _nc_tracing = tracelevel; _tracef("tracelevel=%#x", tracelevel); } +#else + (void) tracelevel; + result = 0; +#endif + return result; +} + +#if defined(TRACE) +NCURSES_EXPORT(void) +trace(const unsigned int tracelevel) +{ + curses_trace(tracelevel); } static void @@ -160,7 +178,7 @@ _nc_va_tracef(const char *fmt, va_list ap) #ifdef TRACE /* verbose-trace in the command-line utilities relies on this */ - if (fp == 0 && _nc_tracing >= DEBUG_LEVEL(1)) + if (fp == 0 && !MyInit && _nc_tracing >= DEBUG_LEVEL(1)) fp = stderr; #endif @@ -194,7 +212,7 @@ _nc_va_tracef(const char *fmt, va_list ap) # if USE_WEAK_SYMBOLS if ((pthread_self)) # endif -#ifdef __MINGW32__ +#ifdef _WIN32 fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self().p); #else fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self()); @@ -217,7 +235,7 @@ _nc_va_tracef(const char *fmt, va_list ap) } NCURSES_EXPORT(void) -_tracef(const char *fmt,...) +_tracef(const char *fmt, ...) { va_list ap; @@ -306,6 +324,39 @@ _nc_retrace_win(WINDOW *code) return code; } +NCURSES_EXPORT(char *) +_nc_fmt_funcptr(char *target, const char *source, size_t size) +{ + size_t n; + char *dst = target; + bool leading = TRUE; + + union { + int value; + char bytes[sizeof(int)]; + } byteorder; + + byteorder.value = 0x1234; + + *dst++ = '0'; + *dst++ = 'x'; + + for (n = 0; n < size; ++n) { + unsigned ch = ((byteorder.bytes[0] == 0x34) + ? UChar(source[size - n - 1]) + : UChar(source[n])); + if (ch != 0 || (n + 1) >= size) + leading = FALSE; + if (!leading) { + _nc_SPRINTF(dst, _nc_SLIMIT(TR_FUNC_LEN - (dst - target)) + "%02x", ch & 0xff); + dst += 2; + } + } + *dst = '\0'; + return target; +} + #if USE_REENTRANT /* * Check if the given trace-mask is enabled. @@ -341,7 +392,7 @@ _nc_use_tracef(unsigned mask) * the tracef mutex. */ NCURSES_EXPORT(void) -_nc_locked_tracef(const char *fmt,...) +_nc_locked_tracef(const char *fmt, ...) { va_list ap;