Changeset 804:c5b7d4a2cc77 in freeDiameter for libfdproto/dictionary.c
- Timestamp:
- Aug 22, 2012, 7:22:46 AM (12 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdproto/dictionary.c
r788 r804 1305 1305 1306 1306 /* Default dump functions */ 1307 static void dump_val_os(union avp_value * value, FILE * fstr)1307 static int dump_val_os(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1308 1308 { 1309 1309 int i; 1310 1310 for (i = 0; i < value->os.len; i++) { 1311 1311 if (i == 24) { /* Dump only up to 24 bytes of the buffer */ 1312 fd_log_debug_fstr(fstr, "[...] (len=%zd)", value->os.len);1312 CHECK_FCT( dump_add_str(outstr, offset, outlen, "[...] (len=%zd)", value->os.len) ); 1313 1313 break; 1314 1314 } 1315 fd_log_debug_fstr(fstr, "%02.2X ", value->os.data[i]); 1316 } 1317 } 1318 1319 static void dump_val_i32(union avp_value * value, FILE * fstr) 1320 { 1321 fd_log_debug_fstr(fstr, "%i (0x%x)", value->i32, value->i32); 1322 } 1323 1324 static void dump_val_i64(union avp_value * value, FILE * fstr) 1325 { 1326 fd_log_debug_fstr(fstr, "%lli (0x%llx)", value->i64, value->i64); 1327 } 1328 1329 static void dump_val_u32(union avp_value * value, FILE * fstr) 1330 { 1331 fd_log_debug_fstr(fstr, "%u (0x%x)", value->u32, value->u32); 1332 } 1333 1334 static void dump_val_u64(union avp_value * value, FILE * fstr) 1335 { 1336 fd_log_debug_fstr(fstr, "%llu (0x%llx)", value->u64, value->u64); 1337 } 1338 1339 static void dump_val_f32(union avp_value * value, FILE * fstr) 1340 { 1341 fd_log_debug_fstr(fstr, "%f", value->f32); 1342 } 1343 1344 static void dump_val_f64(union avp_value * value, FILE * fstr) 1345 { 1346 fd_log_debug_fstr(fstr, "%g", value->f64); 1315 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%02.2X ", value->os.data[i]) ); 1316 } 1317 return 0; 1318 } 1319 1320 static int dump_val_i32(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1321 { 1322 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%i (0x%x)", value->i32, value->i32) ); 1323 return 0; 1324 } 1325 1326 static int dump_val_i64(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1327 { 1328 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%lli (0x%llx)", value->i64, value->i64) ); 1329 return 0; 1330 } 1331 1332 static int dump_val_u32(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1333 { 1334 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%u (0x%x)", value->u32, value->u32) ); 1335 return 0; 1336 } 1337 1338 static int dump_val_u64(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1339 { 1340 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%llu (0x%llx)", value->u64, value->u64) ); 1341 return 0; 1342 } 1343 1344 static int dump_val_f32(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1345 { 1346 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%f", value->f32) ); 1347 return 0; 1348 } 1349 1350 static int dump_val_f64(union avp_value * value, char **outstr, size_t *offset, size_t *outlen) 1351 { 1352 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%g", value->f64) ); 1353 return 0; 1347 1354 } 1348 1355 1349 1356 /* Get the dump function for basic dict_avp_basetype */ 1350 static void (*get_default_dump_val_cb(enum dict_avp_basetype datatype))(union avp_value *, FILE*)1357 static int (*get_default_dump_val_cb(enum dict_avp_basetype datatype))(union avp_value *, char **, size_t *, size_t *) 1351 1358 { 1352 1359 switch (datatype) { … … 1383 1390 1384 1391 /* Formater for the AVP value dump line */ 1385 static void dump_avp_val(union avp_value *avp_value, void (*dump_val_cb)(union avp_value *, FILE *), enum dict_avp_basetype datatype, char * type_name, char * const_name, int indent, FILE * fstr) 1392 static int dump_avp_val(union avp_value *avp_value, 1393 int (*def_dump_val_cb)(union avp_value *, char **, size_t *, size_t *), 1394 char * (*dump_val_cb)(union avp_value *), 1395 enum dict_avp_basetype datatype, 1396 char * type_name, 1397 char * const_name, 1398 int indent, 1399 char **outstr, 1400 size_t *offset, 1401 size_t *outlen) 1386 1402 { 1387 1403 /* Header for all AVP values dumps: */ 1388 fd_log_debug_fstr(fstr, INOBJHDR "value ", INOBJHDRVAL);1404 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "value ", INOBJHDRVAL) ); 1389 1405 1390 1406 /* If the type is provided, write it */ 1391 if (type_name) 1392 fd_log_debug_fstr(fstr, "t: '%s' ", type_name); 1407 if (type_name) { 1408 CHECK_FCT( dump_add_str(outstr, offset, outlen, "t: '%s' ", type_name) ); 1409 } 1393 1410 1394 1411 /* Always give the base datatype anyway */ 1395 fd_log_debug_fstr(fstr, "(%s) ", type_base_name[datatype]);1412 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(%s) ", type_base_name[datatype]) ); 1396 1413 1397 1414 /* Now, the value */ 1398 fd_log_debug_fstr(fstr, "v: "); 1399 if (const_name) 1400 fd_log_debug_fstr(fstr, "'%s' (", const_name); 1401 (*dump_val_cb)(avp_value, fstr); 1402 if (const_name) 1403 fd_log_debug_fstr(fstr, ")"); 1415 CHECK_FCT( dump_add_str(outstr, offset, outlen, "v: ") ); 1416 if (const_name) { 1417 CHECK_FCT( dump_add_str(outstr, offset, outlen, "'%s' (", const_name) ); 1418 } 1419 if (dump_val_cb) { 1420 char * str; 1421 CHECK_MALLOC_DO( str = (*dump_val_cb)(avp_value), dump_add_str(outstr, offset, outlen, "(dump failed)") ); 1422 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%s", str) ); 1423 free(str); 1424 } else { 1425 CHECK_FCT( (*def_dump_val_cb)(avp_value, outstr, offset, outlen) ); 1426 } 1427 if (const_name) { 1428 CHECK_FCT( dump_add_str(outstr, offset, outlen, ")") ); 1429 } 1404 1430 1405 1431 /* Done! */ 1406 fd_log_debug_fstr(fstr, "\n"); 1407 } 1408 1409 /* Dump the value of an AVP of known type */ 1410 void fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, FILE * fstr) 1411 { 1412 void (*dump_val_cb)(union avp_value *avp_value, FILE * fstr); 1432 CHECK_FCT( dump_add_str(outstr, offset, outlen, "\n") ); 1433 return 0; 1434 } 1435 1436 /* Dump the value of an AVP of known type into the returned str */ 1437 int fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, char **outstr, size_t *offset, size_t *outlen) 1438 { 1439 char * (*dump_val_cb)(union avp_value *avp_value) = NULL; 1413 1440 struct dict_object * type = NULL; 1414 1441 char * type_name = NULL; … … 1416 1443 1417 1444 /* Check the parameters are correct */ 1418 CHECK_PARAMS_DO( avp_value && verify_object(model) && (model->type == DICT_AVP), return ); 1419 1420 /* Default: display the value with the formatter for the AVP datatype */ 1421 CHECK_PARAMS_DO( dump_val_cb = get_default_dump_val_cb(model->data.avp.avp_basetype), return ); 1445 CHECK_PARAMS( avp_value && verify_object(model) && (model->type == DICT_AVP) ); 1422 1446 1423 1447 /* Get the type definition of this AVP */ … … 1445 1469 1446 1470 /* And finally, dump the value */ 1447 dump_avp_val(avp_value, dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent, fstr); 1471 CHECK_FCT( dump_avp_val(avp_value, get_default_dump_val_cb(model->data.avp.avp_basetype), dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent, outstr, offset, outlen) ); 1472 return 0; 1448 1473 } 1449 1474
Note: See TracChangeset
for help on using the changeset viewer.