1#include <string.h> 2#include "jansson_private.h" 3 4void jsonp_error_init(json_error_t *error, const char *source) 5{ 6 if(error) 7 { 8 error->text[0] = '\0'; 9 error->line = -1; 10 error->column = -1; 11 error->position = 0; 12 if(source) 13 jsonp_error_set_source(error, source); 14 else 15 error->source[0] = '\0'; 16 } 17} 18 19void jsonp_error_set_source(json_error_t *error, const char *source) 20{ 21 size_t length; 22 23 if(!error || !source) 24 return; 25 26 length = strlen(source); 27 if(length < JSON_ERROR_SOURCE_LENGTH) 28 strcpy(error->source, source); 29 else { 30 size_t extra = length - JSON_ERROR_SOURCE_LENGTH + 4; 31 strcpy(error->source, "..."); 32 strcpy(error->source + 3, source + extra); 33 } 34} 35 36void jsonp_error_set(json_error_t *error, int line, int column, 37 size_t position, const char *msg, ...) 38{ 39 va_list ap; 40 41 va_start(ap, msg); 42 jsonp_error_vset(error, line, column, position, msg, ap); 43 va_end(ap); 44} 45 46void jsonp_error_vset(json_error_t *error, int line, int column, 47 size_t position, const char *msg, va_list ap) 48{ 49 if(!error) 50 return; 51 52 if(error->text[0] != '\0') { 53 /* error already set */ 54 return; 55 } 56 57 error->line = line; 58 error->column = column; 59 error->position = position; 60 61 vsnprintf(error->text, JSON_ERROR_TEXT_LENGTH, msg, ap); 62 error->text[JSON_ERROR_TEXT_LENGTH - 1] = '\0'; 63} 64