1 | /*************************************************************************** |
2 | * _ _ ____ _ |
3 | * Project ___| | | | _ \| | |
4 | * / __| | | | |_) | | |
5 | * | (__| |_| | _ <| |___ |
6 | * \___|\___/|_| \_\_____| |
7 | * |
8 | * Copyright (C) 1998 - 2019, 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 + 1; |
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 | if(fmt) { |
113 | va_list ap; |
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 | |