source: trunk/libtransmission/error.c

Last change on this file was 14369, checked in by mikedld, 6 years ago

Add missing svn:keywords property to recently (and not so recently) added files

  • Property svn:keywords set to Date Rev Author Id
File size: 3.6 KB
Line 
1/*
2 * This file Copyright (C) 2013-2014 Mnemosyne LLC
3 *
4 * It may be used under the GNU GPL versions 2 or 3
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 * $Id: error.c 14369 2014-12-10 18:58:12Z mikedld $
8 */
9
10#include <assert.h>
11
12#include "transmission.h"
13#include "error.h"
14#include "utils.h"
15
16tr_error *
17tr_error_new (int          code,
18              const char * message_format,
19                           ...)
20{
21  tr_error * error;
22  va_list args;
23
24  assert (message_format != NULL);
25
26  va_start (args, message_format);
27  error = tr_error_new_valist (code, message_format, args);
28  va_end (args);
29
30  return error;
31}
32
33tr_error *
34tr_error_new_literal (int          code,
35                      const char * message)
36{
37  tr_error * error;
38
39  assert (message != NULL);
40
41  error = tr_new (tr_error, 1);
42  error->code = code;
43  error->message = tr_strdup (message);
44
45  return error;
46}
47
48tr_error *
49tr_error_new_valist (int          code,
50                     const char * message_format,
51                     va_list      args)
52{
53  tr_error * error;
54
55  assert (message_format != NULL);
56
57  error = tr_new (tr_error, 1);
58  error->code = code;
59  error->message = tr_strdup_vprintf (message_format, args);
60
61  return error;
62}
63
64void
65tr_error_free (tr_error * error)
66{
67  if (error == NULL)
68    return;
69
70  tr_free (error->message);
71  tr_free (error);
72}
73
74void
75tr_error_set (tr_error   ** error,
76              int           code,
77              const char  * message_format,
78                            ...)
79{
80  va_list args;
81
82  if (error == NULL)
83    return;
84
85  assert (*error == NULL);
86  assert (message_format != NULL);
87
88  va_start (args, message_format);
89  *error = tr_error_new_valist (code, message_format, args);
90  va_end (args);
91}
92
93void
94tr_error_set_literal (tr_error   ** error,
95                      int           code,
96                      const char  * message)
97{
98  if (error == NULL)
99    return;
100
101  assert (*error == NULL);
102  assert (message != NULL);
103
104  *error = tr_error_new_literal (code, message);
105}
106
107void
108tr_error_propagate (tr_error ** new_error,
109                    tr_error ** old_error)
110{
111  assert (old_error != NULL);
112  assert (*old_error != NULL);
113
114  if (new_error != NULL)
115    {
116      assert (*new_error == NULL);
117
118      *new_error = *old_error;
119      *old_error = NULL;
120    }
121  else
122    {
123      tr_error_clear (old_error);
124    }
125}
126
127void
128tr_error_clear (tr_error ** error)
129{
130  if (error == NULL)
131    return;
132
133  tr_error_free (*error);
134
135  *error = NULL;
136}
137
138static void
139error_prefix_valist (tr_error   ** error,
140                     const char  * prefix_format,
141                     va_list       args)
142{
143  char * prefix;
144  char * new_message;
145
146  assert (error != NULL);
147  assert (*error != NULL);
148  assert (prefix_format != NULL);
149
150  prefix = tr_strdup_vprintf (prefix_format, args);
151
152  new_message = tr_strdup_printf ("%s%s", prefix, (*error)->message);
153  tr_free ((*error)->message);
154  (*error)->message = new_message;
155
156  tr_free (prefix);
157}
158
159void
160tr_error_prefix (tr_error   ** error,
161                 const char  * prefix_format,
162                               ...)
163{
164  va_list args;
165
166  assert (prefix_format != NULL);
167
168  if (error == NULL || *error == NULL)
169    return;
170
171  va_start (args, prefix_format);
172  error_prefix_valist (error, prefix_format, args);
173  va_end (args);
174}
175
176void
177tr_error_propagate_prefixed (tr_error   ** new_error,
178                             tr_error   ** old_error,
179                             const char  * prefix_format,
180                                           ...)
181{
182  va_list args;
183
184  assert (prefix_format != NULL);
185
186  tr_error_propagate (new_error, old_error);
187
188  if (new_error == NULL)
189    return;
190
191  va_start (args, prefix_format);
192  error_prefix_valist (new_error, prefix_format, args);
193  va_end (args);
194}
Note: See TracBrowser for help on using the repository browser.