35 const char *dataptr =
value;
41 while(*dataptr !=
'\0') {
42 if (*dataptr ==
quote) {
43 *ptr++ = quote_escape;
57 int input_len = strlen(input_value->
values.
string ?:
"");
70 for (ix = 0; ix < input_len; ix++) {
75 }
else if (
c ==
config->separator[0] ||
c ==
'\r' ||
c ==
'\n') {
89 qvalue =
ast_alloca(input_len + quotes_count + 1);
94 return res < 0 ? -1 : 0;
97#define DEFINE_FORMATTER(_name, _field, _type, _fmt) \
98 static int format_ ## _name (struct cdrel_config *config, \
99 struct cdrel_field *field, struct cdrel_value *input_value, struct cdrel_value *output_value) \
103 if (input_value->data_type != output_value->data_type) { \
105 return cdrel_field_formatters[output_value->data_type](config, field, input_value, output_value); \
107 output_value->field_name = input_value->field_name; \
108 if ((config->quoting_method == cdrel_quoting_method_all || ast_test_flag(&field->flags, cdrel_flag_quote)) \
109 && !ast_test_flag(&field->flags, cdrel_flag_noquote)) { \
110 quote = config->quote; \
112 res = ast_asprintf(&output_value->values.string, "%s" _fmt "%s", quote, input_value->values._field, quote); \
113 output_value->data_type = cdrel_type_string; \
114 return res < 0 ? -1 : 0; \
127 char tempbuf[64] = { 0, };
129 const char *format =
"%Y-%m-%d %T";
131 output_value->field_name = input_value->field_name;
135 output_value->values.int64 = input_value->values.tv.tv_sec;
136 return format_int64(
config, field, output_value, output_value);
139 output_value->values.doubler = ((double)input_value->values.tv.tv_sec) + ((double)input_value->values.tv.tv_usec) / 1000000.0;
140 return format_double(
config, field, output_value, output_value);
146 input_value->values.string = tempbuf;
151 format = field->data;
154 if (input_value->values.tv.tv_sec > 0) {
158 input_value->values.string = tempbuf;
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_strdup(str)
A wrapper for strdup()
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
const char * ast_cdr_disp2str(int disposition)
Disposition to a string.
Private header for res_cdrel_custom.
const char * cdrel_basename(const char *path)
cdrel_field_formatter cdrel_field_formatters[cdrel_data_type_end]
const char * cdrel_get_field_flags(struct ast_flags *flags, struct ast_str **str)
int ast_cel_format_eventtime(struct timeval eventtime, char *timebuf, size_t len)
Format an event timeval using dateformat from cel.conf.
static const char config[]
const char * ast_channel_amaflags2string(enum ama_flags flags)
Convert the enum representation of an AMA flag to a string representation.
static int quote(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
#define ast_debug(level,...)
Log a DEBUG message.
Asterisk JSON abstraction layer.
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
static force_inline int attribute_pure ast_strlen_zero(const char *s)
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
union cdrel_value::@454 values
enum cdrel_data_type data_type
#define ast_test_flag(p, flag)