Imported Upstream version 7.59.0
[platform/upstream/curl.git] / src / tool_msgs.c
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