Truncate error source from start, not end, if it's too long to fit
[jansson.git] / src / error.c
1 #include <string.h>
2 #include "jansson_private.h"
3
4 void jsonp_error_init(json_error_t *error, const char *source)
5 {
6     if(error)
7     {
8         size_t length;
9
10         error->text[0] = '\0';
11         error->line = -1;
12         error->column = -1;
13         error->position = 0;
14
15         length = strlen(source);
16         if(length < JSON_ERROR_SOURCE_LENGTH)
17             strcpy(error->source, source);
18         else {
19             size_t extra = length - JSON_ERROR_SOURCE_LENGTH + 4;
20             strcpy(error->source, "...");
21             strcpy(error->source + 3, source + extra);
22         }
23     }
24 }
25
26 void jsonp_error_set(json_error_t *error, int line, int column,
27                      size_t position, const char *msg, ...)
28 {
29     va_list ap;
30
31     va_start(ap, msg);
32     jsonp_error_vset(error, line, column, position, msg, ap);
33     va_end(ap);
34 }
35
36 void jsonp_error_vset(json_error_t *error, int line, int column,
37                       size_t position, const char *msg, va_list ap)
38 {
39     if(!error)
40         return;
41
42     if(error->text[0] != '\0') {
43         /* error already set */
44         return;
45     }
46
47     error->line = line;
48     error->column = column;
49     error->position = position;
50
51     vsnprintf(error->text, JSON_ERROR_TEXT_LENGTH, msg, ap);
52 }