1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 #include "tool_setup.h" 23 24 #define ENABLE_CURLX_PRINTF 25 /* use our own printf() functions */ 26 #include "curlx.h" 27 28 #include "tool_cfgable.h" 29 #include "tool_msgs.h" 30 31 #include "memdebug.h" /* keep this as LAST include */ 32 33 #define WARN_PREFIX "Warning: " 34 #define NOTE_PREFIX "Note: " 35 36 static void voutf(struct GlobalConfig *config, 37 const char *prefix, 38 const char *fmt, 39 va_list ap) 40 { 41 size_t width = (79 - strlen(prefix)); 42 if(!config->mute) { 43 size_t len; 44 char *ptr; 45 char *print_buffer; 46 47 print_buffer = curlx_mvaprintf(fmt, ap); 48 if(!print_buffer) 49 return; 50 len = strlen(print_buffer); 51 52 ptr = print_buffer; 53 while(len > 0) { 54 fputs(prefix, config->errors); 55 56 if(len > width) { 57 size_t cut = width-1; 58 59 while(!ISSPACE(ptr[cut]) && cut) { 60 cut--; 61 } 62 if(0 == cut) 63 /* not a single cutting position was found, just cut it at the 64 max text width then! */ 65 cut = width-1; 66 67 (void)fwrite(ptr, cut + 1, 1, config->errors); 68 fputs("\n", config->errors); 69 ptr += cut + 1; /* skip the space too */ 70 len -= cut; 71 } 72 else { 73 fputs(ptr, config->errors); 74 len = 0; 75 } 76 } 77 curl_free(print_buffer); 78 } 79 } 80 81 /* 82 * Emit 'note' formatted message on configured 'errors' stream, if verbose was 83 * selected. 84 */ 85 void notef(struct GlobalConfig *config, const char *fmt, ...) 86 { 87 va_list ap; 88 va_start(ap, fmt); 89 if(config->tracetype) 90 voutf(config, NOTE_PREFIX, fmt, ap); 91 va_end(ap); 92 } 93 94 /* 95 * Emit warning formatted message on configured 'errors' stream unless 96 * mute (--silent) was selected. 97 */ 98 99 void warnf(struct GlobalConfig *config, const char *fmt, ...) 100 { 101 va_list ap; 102 va_start(ap, fmt); 103 voutf(config, WARN_PREFIX, fmt, ap); 104 va_end(ap); 105 } 106 /* 107 * Emit help formatted message on given stream. 108 */ 109 110 void helpf(FILE *errors, const char *fmt, ...) 111 { 112 va_list ap; 113 if(fmt) { 114 va_start(ap, fmt); 115 fputs("curl: ", errors); /* prefix it */ 116 vfprintf(errors, fmt, ap); 117 va_end(ap); 118 } 119 fprintf(errors, "curl: try 'curl --help' " 120 #ifdef USE_MANUAL 121 "or 'curl --manual' " 122 #endif 123 "for more information\n"); 124 } 125 126