<!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 Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data 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 <stdio.h></span> <span class="preprocessor">#include <stdlib.h></span> <span class="preprocessor">#include <string.h></span> <span class="preprocessor">#include <errno.h></span> <span class="preprocessor">#include <limits.h></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->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->counter = 0; <span class="keywordflow">return</span> &tmpl->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->comment) free(tmpl->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 < 0 || index >= (<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-><a name="a9"></a>num = tmpl->flip; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"day"</span>)) { value->num = tmpl->day; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"prime"</span>)) { value->num = tmpl->prime; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"quality"</span>)) { value-><a name="a10"></a>dbl = tmpl->quality; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (KEYWORD(<span class="stringliteral">"comment"</span>)) { <span class="keywordflow">if</span> (!(value-><a name="a11"></a>str = <a name="a12"></a><a class="code" href="group__Exmod.html#gfe535f80c12fa1371386aa20239c89dc">vbi_export_strdup</a>(e, NULL, tmpl->comment ? tmpl->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->num = tmpl->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->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 < 1 || day > 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->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 < elements(int_menu_items); i++) <span class="keywordflow">if</span> ((d = abs(int_menu_items[i] - value)) < dmin) { tmpl->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 < 1) quality = 1; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (quality > 100) quality = 100; tmpl->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, &tmpl->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->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-><a name="a16"></a><a class="code" href="structvbi__page.html#7633883c5732103d8048c9db0e250358">pgno</a>, pg-><a name="a17"></a><a class="code" href="structvbi__page.html#741ccb9357e542ff47b12baa4ee0de8c">subno</a>); tmpl->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 = &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&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 <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>