mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.2 KiB
68 lines
2.2 KiB
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
|
|
|
<section id="str" xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
<sectioninfo>
|
|
<revhistory>
|
|
<revision>
|
|
<revnumber>$Revision$</revnumber>
|
|
<date>$Date$</date>
|
|
</revision>
|
|
</revhistory>
|
|
</sectioninfo>
|
|
|
|
<title>Type <type>str</type></title>
|
|
<para>
|
|
One of our main goals was to make <acronym>SER</acronym> really
|
|
fast. There are many functions across the server that need to work with
|
|
strings. Usually these functions need to know string length. We wanted
|
|
to avoid using of <function>strlen</function> because the function is
|
|
relatively slow. It must scan the whole string and find the first
|
|
occurrence of zero character. To avoid this, we created
|
|
<type>str</type> type. The type has 2 fields, field
|
|
<structfield>s</structfield> is pointer to the beginning of the string
|
|
and field <structfield>len</structfield> is length of the string. We
|
|
then calculate length of the string only once and later reuse saved
|
|
value.
|
|
</para>
|
|
<important>
|
|
<para>
|
|
<type>str</type> structure is quite important because it is widely
|
|
used in <acronym>SER</acronym> (most functions accept
|
|
<type>str</type> instead of <type>char*</type>).
|
|
</para>
|
|
</important>
|
|
|
|
<para><emphasis><type>str</type> Type Declaration</emphasis></para>
|
|
<programlisting>
|
|
struct _str{
|
|
char* s;
|
|
int len;
|
|
};
|
|
|
|
typedef struct _str str;
|
|
</programlisting>
|
|
|
|
<para>
|
|
The declaration can be found in header file <filename>str.h</filename>.
|
|
</para>
|
|
|
|
<warning>
|
|
<para>
|
|
Because we store string lengths, there is no need to zero terminate
|
|
them. Some strings in the server are still zero terminated, some
|
|
are not. Be careful when using functions like
|
|
<function>snprintf</function> that rely on the ending zero. You can
|
|
print variable of type <type>str</type> this way:
|
|
|
|
<programlisting>
|
|
printf("%.*s", mystring->len, mystring->s);
|
|
</programlisting>
|
|
|
|
That ensures that the string will be printed correctly even if
|
|
there is no zero character at the end.
|
|
</para>
|
|
</warning>
|
|
</section>
|