libtraceevent(3)
================

NAME
----
tep_print_field, tep_print_fields, tep_print_num_field, tep_print_func_field -
Print the field content.

SYNOPSIS
--------
[verse]
--
*#include <event-parse.h>*
*#include <trace-seq.h>*

void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
--

DESCRIPTION
-----------
These functions print recorded field's data, according to the field's type.

The _tep_print_field()_ function extracts from the recorded raw _data_ value of
the _field_ and prints it into _s_, according to the field type.

The _tep_print_fields()_ prints each field name followed by the record's field
value according to the field's type:
[verse]
--
"field1_name=field1_value field2_name=field2_value ..."
--
It iterates all fields of the _event_, and calls _tep_print_field()_ for each of
them.

The _tep_print_num_field()_ function prints a numeric field with given format
string. A search is performed in the _event_ for a field with _name_. If such
field is found, its value is extracted from the _record_ and is printed in the
_s_, according to the given format string _fmt_. If the argument _err_ is
non-zero, and an error occures - it is printed in the _s_.

The _tep_print_func_field()_ function prints a function field with given format
string.  A search is performed in the _event_ for a field with _name_. If such
field is found, its value is extracted from the _record_. The value is assumed
to be a function address, and a search is perform to find the name of this
function. The function name (if found) and its address are printed in the _s_,
according to the given format string _fmt_. If the argument _err_ is non-zero,
and an error occures - it is printed in _s_.

RETURN VALUE
------------
The _tep_print_num_field()_ and _tep_print_func_field()_ functions return 1
on success, -1 in case of an error or 0 if the print buffer _s_ is full.

EXAMPLE
-------
[source,c]
--
#include <event-parse.h>
#include <trace-seq.h>
...
struct tep_handle *tep = tep_alloc();
...
struct trace_seq seq;
trace_seq_init(&seq);
struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
...
void process_record(struct tep_record *record)
{
	struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");

	trace_seq_reset(&seq);

	/* Print the value of "common_pid" */
	tep_print_field(&seq, record->data, field_pid);

	/* Print all fields of the "hrtimer_start" event */
	tep_print_fields(&seq, record->data, record->size, event);

	/* Print the value of "expires" field with custom format string */
	tep_print_num_field(&seq, " timer expires in %llu ", event, "expires", record, 0);

	/* Print the address and the name of "function" field with custom format string */
	tep_print_func_field(&seq, " timer function is %s ", event, "function", record, 0);
 }
 ...
--

FILES
-----
[verse]
--
*event-parse.h*
	Header file to include in order to have access to the library APIs.
*trace-seq.h*
	Header file to include in order to have access to trace sequences related APIs.
	Trace sequences are used to allow a function to call several other functions
	to create a string of data to use.
*-ltraceevent*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
_libtraceevent(3)_, _trace-cmd(1)_

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>, author of *libtraceevent*.
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtraceevent is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
