pa_debugprint.c (3879B)
1 /* 2 * $Id: pa_log.c $ 3 * Portable Audio I/O Library Multi-Host API front end 4 * Validate function parameters and manage multiple host APIs. 5 * 6 * Based on the Open Source API proposed by Ross Bencina 7 * Copyright (c) 1999-2006 Ross Bencina, Phil Burk 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining 10 * a copy of this software and associated documentation files 11 * (the "Software"), to deal in the Software without restriction, 12 * including without limitation the rights to use, copy, modify, merge, 13 * publish, distribute, sublicense, and/or sell copies of the Software, 14 * and to permit persons to whom the Software is furnished to do so, 15 * subject to the following conditions: 16 * 17 * The above copyright notice and this permission notice shall be 18 * included in all copies or substantial portions of the Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 24 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 25 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 */ 28 29 /* 30 * The text above constitutes the entire PortAudio license; however, 31 * the PortAudio community also makes the following non-binding requests: 32 * 33 * Any person wishing to distribute modifications to the Software is 34 * requested to send the modifications to the original developer so that 35 * they can be incorporated into the canonical version. It is also 36 * requested that these non-binding requests be included along with the 37 * license above. 38 */ 39 40 /** @file 41 @ingroup common_src 42 43 @brief Implements log function. 44 45 PaUtil_SetLogPrintFunction can be user called to replace the provided 46 DefaultLogPrint function, which writes to stderr. 47 One can NOT pass var_args across compiler/dll boundaries as it is not 48 "byte code/abi portable". So the technique used here is to allocate a local 49 a static array, write in it, then callback the user with a pointer to its 50 start. 51 */ 52 53 #include <stdio.h> 54 #include <stdarg.h> 55 56 #include "pa_debugprint.h" 57 58 // for OutputDebugStringA 59 #if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) 60 #define WIN32_LEAN_AND_MEAN // exclude rare headers 61 #include "windows.h" 62 #endif 63 64 // User callback 65 static PaUtilLogCallback userCB = NULL; 66 67 // Sets user callback 68 void PaUtil_SetDebugPrintFunction(PaUtilLogCallback cb) 69 { 70 userCB = cb; 71 } 72 73 /* 74 If your platform doesn’t have vsnprintf, you are stuck with a 75 VERY dangerous alternative, vsprintf (with no n) 76 */ 77 #if _MSC_VER 78 /* Some Windows Mobile SDKs don't define vsnprintf but all define _vsnprintf (hopefully). 79 According to MSDN "vsnprintf is identical to _vsnprintf". So we use _vsnprintf with MSC. 80 */ 81 #define VSNPRINTF _vsnprintf 82 #else 83 #define VSNPRINTF vsnprintf 84 #endif 85 86 #define PA_LOG_BUF_SIZE 2048 87 88 void PaUtil_DebugPrint( const char *format, ... ) 89 { 90 // Optional logging into Output console of Visual Studio 91 #if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) 92 { 93 char buf[PA_LOG_BUF_SIZE]; 94 va_list ap; 95 va_start(ap, format); 96 VSNPRINTF(buf, sizeof(buf), format, ap); 97 buf[sizeof(buf)-1] = 0; 98 OutputDebugStringA(buf); 99 va_end(ap); 100 } 101 #endif 102 103 // Output to User-Callback 104 if (userCB != NULL) 105 { 106 char strdump[PA_LOG_BUF_SIZE]; 107 va_list ap; 108 va_start(ap, format); 109 VSNPRINTF(strdump, sizeof(strdump), format, ap); 110 strdump[sizeof(strdump)-1] = 0; 111 userCB(strdump); 112 va_end(ap); 113 } 114 else 115 // Standard output to stderr 116 { 117 va_list ap; 118 va_start(ap, format); 119 vfprintf(stderr, format, ap); 120 va_end(ap); 121 fflush(stderr); 122 } 123 }