Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > media > main-release > by-pkgid > 1af184c486f5d5f476d50602700ee0a0 > files > 57

lib64zvbi-devel-0.2.33-2mdv2010.0.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>ZVBI Library: src/exp-templ.c</title>
<link href="tabs.css" rel="stylesheet" type="text/css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.9 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div>
<div class="contents">
<h1>src/exp-templ.c</h1>Template for internal export module.<p>
<div class="fragment"><pre class="fragment"><span class="comment">/*</span>
<span class="comment"> *  Template for export modules</span>
<span class="comment"> */</span>

<span class="comment">/* $Id: exp-templ.c,v 1.10 2007/11/27 18:26:32 mschimek Exp $ */</span>

<span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<span class="preprocessor"></span><span class="preprocessor">#  include "config.h"</span>
<span class="preprocessor">#endif</span>
<span class="preprocessor"></span>
<span class="preprocessor">#include &lt;stdio.h&gt;</span>
<span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<span class="preprocessor">#include &lt;string.h&gt;</span>
<span class="preprocessor">#include &lt;errno.h&gt;</span>
<span class="preprocessor">#include &lt;limits.h&gt;</span>

<span class="preprocessor">#include "export.h"</span>

<span class="keyword">typedef</span> <span class="keyword">struct </span>tmpl_instance
{
        <span class="comment">/* Common to all export modules */</span>
        <a name="_a0"></a><a class="code" href="structvbi__export.html">vbi_export</a>              export;

        <span class="comment">/* Our private stuff */</span>

        <span class="comment">/* Options */</span>
        <span class="keywordtype">int</span>                     flip;
        <span class="keywordtype">int</span>                     day;
        <span class="keywordtype">int</span>                     prime;
        <span class="keywordtype">double</span>                  quality;
        <span class="keywordtype">char</span> *                  comment;
        <span class="keywordtype">int</span>                     weekday;

        <span class="keywordtype">int</span>                     counter;
} tmpl_instance;

<span class="comment">/* Safer than tmpl_instance *tmpl = (tmpl_instance *)(vbi_export *) e */</span>
<span class="preprocessor">#define TMPL(e) PARENT(e, tmpl_instance, export);</span>
<span class="preprocessor"></span>
<span class="keyword">static</span> <a class="code" href="structvbi__export.html">vbi_export</a> *
tmpl_new(<span class="keywordtype">void</span>)
{
        tmpl_instance *tmpl;

        <span class="keywordflow">if</span> (!(tmpl = calloc(1, <span class="keyword">sizeof</span>(*tmpl))))
                <span class="keywordflow">return</span> NULL;

        <span class="comment">/*</span>
<span class="comment">         *  The caller will initialize tmpl-&gt;export.class for us</span>
<span class="comment">         *  and reset all options to their defaults, we only</span>
<span class="comment">         *  have to initialize our private stuff.</span>
<span class="comment">         */</span>

        tmpl-&gt;counter = 0;

        <span class="keywordflow">return</span> &amp;tmpl-&gt;export;
}

<span class="keyword">static</span> <span class="keywordtype">void</span>
tmpl_delete(<a class="code" href="structvbi__export.html">vbi_export</a> *e)
{
        tmpl_instance *tmpl = TMPL(e);

        <span class="comment">/* Uninitialize our private stuff and options */</span>

        <span class="keywordflow">if</span> (tmpl-&gt;comment)
                free(tmpl-&gt;comment);

        free(tmpl);
}

<span class="comment">/* convenience */</span>
<span class="preprocessor">#define elements(array) (sizeof(array) / sizeof(array[0]))</span>
<span class="preprocessor"></span>
<span class="comment">/* N_(), _() are NLS functions, see info gettext. */</span>
<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *
string_menu_items[] = {
        N_(<span class="stringliteral">"Sunday"</span>), N_(<span class="stringliteral">"Monday"</span>), N_(<span class="stringliteral">"Tuesday"</span>),
        N_(<span class="stringliteral">"Wednesday"</span>), N_(<span class="stringliteral">"Thursday"</span>), N_(<span class="stringliteral">"Friday"</span>), N_(<span class="stringliteral">"Saturday"</span>)
};

<span class="keyword">static</span> <span class="keywordtype">int</span>
int_menu_items[] = {
        1, 3, 5, 7, 11, 13, 17, 19
};

<span class="keyword">static</span> <a name="_a1"></a><a class="code" href="structvbi__option__info.html" title="Information about an export option.">vbi_option_info</a>
tmpl_options[] = {
        <a name="a2"></a><a class="code" href="group__Exmod.html#g5294e6bb3862d3e8deb85712bcc896ec">VBI_OPTION_BOOL_INITIALIZER</a>
          <span class="comment">/*</span>
<span class="comment">           *  Option keywords must be unique within their module</span>
<span class="comment">           *  and shall contain only "AZaz09_" (be filesystem safe that is).</span>
<span class="comment">           *  Note "network", "creator" and "reveal" are reserved generic</span>
<span class="comment">           *  options, filtered by the export api functions.</span>
<span class="comment">           */</span>
          (<span class="stringliteral">"flip"</span>, N_(<span class="stringliteral">"Boolean option"</span>),
           FALSE, N_(<span class="stringliteral">"This is a boolean option"</span>)),
        <a name="a3"></a><a class="code" href="group__Exmod.html#gcf6a0783eaa62ceb56c2f799770a099b">VBI_OPTION_INT_RANGE_INITIALIZER</a>
          (<span class="stringliteral">"day"</span>, N_(<span class="stringliteral">"Select a month day"</span>),
           <span class="comment">/* default, min, max, step, has no tooltip */</span>
              13,       1,   31,  1,      NULL),
        <a name="a4"></a><a class="code" href="group__Exmod.html#g44d7cca3a31209ab6ba9503974517f40">VBI_OPTION_INT_MENU_INITIALIZER</a>
          (<span class="stringliteral">"prime"</span>, N_(<span class="stringliteral">"Select a prime"</span>),
           0, int_menu_items, elements(int_menu_items),
           N_(<span class="stringliteral">"Default is the first, '1'"</span>)),
        <a name="a5"></a><a class="code" href="group__Exmod.html#g87a153cf058e601deb83c29533254e6b">VBI_OPTION_REAL_RANGE_INITIALIZER</a>
          (<span class="stringliteral">"quality"</span>, N_(<span class="stringliteral">"Compression quality"</span>),
           100, 1, 100, 0.01, NULL),
        <span class="comment">/* VBI_OPTION_REAL_MENU_INITIALIZER like int */</span>
        <a name="a6"></a><a class="code" href="group__Exmod.html#g0cc437cd7d695b9a4a44b7fb773443f3">VBI_OPTION_STRING_INITIALIZER</a>
          (<span class="stringliteral">"comment"</span>, N_(<span class="stringliteral">"Add a comment"</span>),
           <span class="stringliteral">"default comment"</span>, N_(<span class="stringliteral">"Another tooltip"</span>)),
        <a name="a7"></a><a class="code" href="group__Exmod.html#ga15784af5f2ffc133575079bfb98adeb">VBI_OPTION_MENU_INITIALIZER</a>
          (<span class="stringliteral">"weekday"</span>, N_(<span class="stringliteral">"Select a weekday"</span>),
           2, string_menu_items, 7, N_(<span class="stringliteral">"Default is Tuesday"</span>))
};

<span class="comment">/*</span>
<span class="comment"> *  Enumerate our options (optional if we have no options).</span>
<span class="comment"> *  Instead of using a table one could also dynamically create</span>
<span class="comment"> *  vbi_option_info's in tmpl_instance.</span>
<span class="comment"> */</span>
<span class="keyword">static</span> <a class="code" href="structvbi__option__info.html" title="Information about an export option.">vbi_option_info</a> *
option_enum(<a class="code" href="structvbi__export.html">vbi_export</a> *e, <span class="keywordtype">int</span> index)
{
        e = e;

        <span class="comment">/* Enumeration 0 ... n */</span>
        <span class="keywordflow">if</span> (index &lt; 0 || index &gt;= (<span class="keywordtype">int</span>) elements(tmpl_options))
                <span class="keywordflow">return</span> NULL;

        <span class="keywordflow">return</span> tmpl_options + index;
}

<span class="preprocessor">#define KEYWORD(str) (strcmp(keyword, str) == 0)</span>
<span class="preprocessor"></span>
<span class="comment">/*</span>
<span class="comment"> *  Get an option (optional if we have no options).</span>
<span class="comment"> */</span>
<span class="keyword">static</span> vbi_bool
option_get(<a class="code" href="structvbi__export.html">vbi_export</a> *e, <span class="keyword">const</span> <span class="keywordtype">char</span> *keyword, <a name="_a8"></a><a class="code" href="unionvbi__option__value.html" title="Result of an option query.">vbi_option_value</a> *value)
{
        tmpl_instance *tmpl = TMPL(e);

        <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"flip"</span>)) {
                value-&gt;<a name="a9"></a>num = tmpl-&gt;flip;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"day"</span>)) {
                value-&gt;num = tmpl-&gt;day;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"prime"</span>)) {
                value-&gt;num = tmpl-&gt;prime;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"quality"</span>)) {
                value-&gt;<a name="a10"></a>dbl = tmpl-&gt;quality;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"comment"</span>)) {
                <span class="keywordflow">if</span> (!(value-&gt;<a name="a11"></a>str = <a name="a12"></a><a class="code" href="group__Exmod.html#gfe535f80c12fa1371386aa20239c89dc">vbi_export_strdup</a>(e, NULL,
                        tmpl-&gt;comment ? tmpl-&gt;comment : <span class="stringliteral">""</span>)))
                        <span class="keywordflow">return</span> FALSE;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"weekday"</span>)) {
                value-&gt;num = tmpl-&gt;weekday;
        } <span class="keywordflow">else</span> {
                <a name="a13"></a><a class="code" href="group__Exmod.html#g9ff019ade9574fae5cbf5af605709d41">vbi_export_unknown_option</a>(e, keyword);
                <span class="keywordflow">return</span> FALSE;
        }

        <span class="keywordflow">return</span> TRUE; <span class="comment">/* success */</span>
}

<span class="comment">/*</span>
<span class="comment"> *  Set an option (optional if we have no options).</span>
<span class="comment"> */</span>
<span class="keyword">static</span> vbi_bool
option_set(<a class="code" href="structvbi__export.html">vbi_export</a> *e, <span class="keyword">const</span> <span class="keywordtype">char</span> *keyword, va_list args)
{
        tmpl_instance *tmpl = TMPL(e);

        <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"flip"</span>)) {
                tmpl-&gt;flip = !!va_arg(args, <span class="keywordtype">int</span>);
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"day"</span>)) {
                <span class="keywordtype">int</span> day = va_arg(args, <span class="keywordtype">int</span>);

                <span class="comment">/* or clamp */</span>
                <span class="keywordflow">if</span> (day &lt; 1 || day &gt; 31) {
                        <a name="a14"></a><a class="code" href="group__Exmod.html#gcbceab3a49fc720f1df144e399dffb76">vbi_export_invalid_option</a>(e, keyword, day);
                        <span class="keywordflow">return</span> FALSE;
                }

                tmpl-&gt;day = day;

        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"prime"</span>)) {
                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d, dmin = UINT_MAX;
                <span class="keywordtype">int</span> value = va_arg(args, <span class="keywordtype">int</span>);

                <span class="comment">/* or return an error */</span>
                <span class="keywordflow">for</span> (i = 0; i &lt; elements(int_menu_items); i++)
                        <span class="keywordflow">if</span> ((d = abs(int_menu_items[i] - value)) &lt; dmin) {
                                tmpl-&gt;prime = int_menu_items[i];
                                dmin = d;
                        }

        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"quality"</span>)) {
                <span class="keywordtype">double</span> quality = va_arg(args, <span class="keywordtype">double</span>);

                <span class="comment">/* or return an error */</span>
                <span class="keywordflow">if</span> (quality &lt; 1)
                        quality = 1;
                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (quality &gt; 100)
                        quality = 100;

                tmpl-&gt;quality = quality;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"comment"</span>)) {
                <span class="keywordtype">char</span> *comment = va_arg(args, <span class="keywordtype">char</span> *);

                <span class="comment">/* Note the option remains unchanged in case of error */</span>
                <span class="keywordflow">if</span> (!<a class="code" href="group__Exmod.html#gfe535f80c12fa1371386aa20239c89dc">vbi_export_strdup</a>(e, &amp;tmpl-&gt;comment, comment))
                        <span class="keywordflow">return</span> FALSE;
        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"weekday"</span>)) {
                <span class="keywordtype">int</span> day = va_arg(args, <span class="keywordtype">int</span>);

                <span class="comment">/* or return an error */</span>
                tmpl-&gt;weekday = day % 7;
        } <span class="keywordflow">else</span> {
                <a class="code" href="group__Exmod.html#g9ff019ade9574fae5cbf5af605709d41">vbi_export_unknown_option</a>(e, keyword);
                <span class="keywordflow">return</span> FALSE;
        }

        <span class="keywordflow">return</span> TRUE; <span class="comment">/* success */</span>
}

<span class="comment">/*</span>
<span class="comment"> *  The output function, mandatory.</span>
<span class="comment"> */</span>
<span class="keyword">static</span> vbi_bool
export(<a class="code" href="structvbi__export.html">vbi_export</a> *e, <a name="_a15"></a><a class="code" href="structvbi__page.html" title="Formatted Teletext or Closed Caption page.">vbi_page</a> *pg)
{
        tmpl_instance *tmpl = TMPL(e);

        <span class="comment">/* Write pg to target, that's all. */</span>
        vbi_export_printf (e, <span class="stringliteral">"Page %x.%x\n"</span>, pg-&gt;<a name="a16"></a><a class="code" href="structvbi__page.html#7633883c5732103d8048c9db0e250358">pgno</a>, pg-&gt;<a name="a17"></a><a class="code" href="structvbi__page.html#741ccb9357e542ff47b12baa4ee0de8c">subno</a>);

        tmpl-&gt;counter++; <span class="comment">/* just for fun */</span>

        <span class="comment">/*</span>
<span class="comment">         *  Should any of the module functions return unsuccessful</span>
<span class="comment">         *  they better post a description of the problem.</span>
<span class="comment">         *  Parameters like printf, no linefeeds '\n' please.</span>
<span class="comment">         */</span>
        <span class="comment">/*</span>
<span class="comment">        vbi_export_error_printf(_("Writing failed: %s"), strerror(errno));</span>
<span class="comment">         */</span>

        <span class="keywordflow">return</span> FALSE; <span class="comment">/* no success (since we didn't write anything) */</span>
}

<span class="comment">/*</span>
<span class="comment"> *  Let's describe us.</span>
<span class="comment"> *  You can leave away assignments unless mandatory.</span>
<span class="comment"> */</span>
<span class="keyword">static</span> <a name="_a18"></a><a class="code" href="structvbi__export__info.html" title="Information about an export module.">vbi_export_info</a>
info_tmpl = {
        <span class="comment">/* The mandatory keyword must be unique and shall</span>
<span class="comment">           contain only "AZaz09_" */</span>
        .keyword        = <span class="stringliteral">"templ"</span>,
        <span class="comment">/* When omitted this module can still be used by</span>
<span class="comment">           libzvbi clients but won't be listed in a UI. */</span>
        .label          = N_(<span class="stringliteral">"Template"</span>),
        .tooltip        = N_(<span class="stringliteral">"This is just an export template"</span>),

        .mime_type      = <span class="stringliteral">"misc/example"</span>,
        .extension      = <span class="stringliteral">"tmpl"</span>,
};

<a name="_a19"></a><a class="code" href="structvbi__export__class.html">vbi_export_class</a>
vbi_export_class_tmpl = {
        .<a name="a20"></a>_public                = &amp;info_tmpl,

        <span class="comment">/* Functions to allocate and free a tmpl_class vbi_export instance.</span>
<span class="comment">           When you omit these, libzvbi will allocate a bare struct vbi_export */</span>
        ._new                   = tmpl_new,
        ._delete                = tmpl_delete,

        <span class="comment">/* Functions to enumerate, read and write options */</span>
        .option_enum            = option_enum,
        .option_get             = option_get,
        .option_set             = option_set,

        <span class="comment">/* Function to export a page, mandatory */</span>
        .export                 = export
};

<span class="comment">/*</span>
<span class="comment"> *  This is a constructor calling vbi_register_export_module().</span>
<span class="comment"> *  (Commented out since we don't want to register the example module.)</span>
<span class="comment"> */</span>
<span class="preprocessor">#if 0</span>
<span class="preprocessor"></span><a name="a21"></a><a class="code" href="group__Exmod.html#gc39fe176dadc4d377e693192e2018a38">VBI_AUTOREG_EXPORT_MODULE</a>(vbi_export_class_tmpl)
<span class="preprocessor">#endif</span>
<span class="preprocessor"></span>
<span class="comment">/*</span>
<span class="comment">Local variables:</span>
<span class="comment">c-set-style: K&amp;R</span>
<span class="comment">c-basic-offset: 8</span>
<span class="comment">End:</span>
<span class="comment">*/</span>
</pre></div> </div>
<hr size="1"><address style="text-align: right;"><small>Generated on Wed May 27 04:47:58 2009 for ZVBI Library by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.9 </small></address>
</body>
</html>