[SO] Add pratice exam

Signed-off-by: Tiago Garcia <tiago.rgarcia@ua.pt>
This commit is contained in:
Tiago Garcia 2024-11-06 01:37:12 +00:00
parent 11be924274
commit cb3bcb8c25
Signed by: TiagoRG
GPG Key ID: DFCD48E3F420DB42
71 changed files with 13842 additions and 0 deletions

View File

@ -0,0 +1,21 @@
CXX = g++
CPPFLAGS=-Wall -Wfatal-errors -Wno-write-strings -Wno-unused-function -ggdb -pthread -Iinclude # -DEXCEPTION_POLICY or -DEXIT_POLICY
LDFLAGS = -Llib -lsoconcur
OBJS=pfifo.o urgency.o
TARGET = urgency
.PHONY: all clean cleanall
all: $(TARGET)
urgency: $(OBJS)
$(CXX) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)
clean:
rm -fv *.o core
cleanall: clean
rm -f $(TARGET)

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

View File

@ -0,0 +1,108 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: dbc.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('dbc_8h.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#define-members">Macros</a> </div>
<div class="headertitle">
<div class="title">dbc.h File Reference<div class="ingroups"><a class="el" href="group___db_c.html">DbC</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Design-by-Contract module.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;stdio.h&gt;</code><br />
<code>#include &lt;stdlib.h&gt;</code><br />
<code>#include &lt;assert.h&gt;</code><br />
<code>#include &quot;<a class="el" href="utils_8h_source.html">utils.h</a>&quot;</code><br />
</div>
<p><a href="dbc_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:gac101c8ba449f6f8c71b3789a9c489221"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">check</a>(condition, message)</td></tr>
<tr class="memdesc:gac101c8ba449f6f8c71b3789a9c489221"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of an general algorithm assertion. <a href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">More...</a><br /></td></tr>
<tr class="separator:gac101c8ba449f6f8c71b3789a9c489221"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5bf1825f80465097d4b753a001cf1af8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">require</a>(condition, message)</td></tr>
<tr class="memdesc:ga5bf1825f80465097d4b753a001cf1af8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of a precondition. <a href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">More...</a><br /></td></tr>
<tr class="separator:ga5bf1825f80465097d4b753a001cf1af8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">ensure</a>(condition, message)</td></tr>
<tr class="memdesc:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of a postcondition. <a href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">More...</a><br /></td></tr>
<tr class="separator:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">invariant</a>(condition, message)</td></tr>
<tr class="memdesc:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of an invariant. <a href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">More...</a><br /></td></tr>
<tr class="separator:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Design-by-Contract module. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dbc_8h.html">dbc.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,7 @@
var dbc_8h =
[
[ "check", "group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221", null ],
[ "require", "group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8", null ],
[ "ensure", "group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf", null ],
[ "invariant", "group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725", null ]
];

View File

@ -0,0 +1,203 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: dbc.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('dbc_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">dbc.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="dbc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#ifndef DBC_H</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#define DBC_H</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#include &lt;assert.h&gt;</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="utils_8h.html">utils.h</a>&quot;</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#ifdef NDEBUG</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor">#define NDEBUG_CHECKS</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="preprocessor">#define NDEBUG_PRECONDITIONS</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="preprocessor">#define NDEBUG_POSTCONDITIONS</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="preprocessor">#define NDEBUG_INVARIANTS</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="preprocessor">#ifdef DEBUG_ONLY_PRECONDITIONS</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="preprocessor">#ifdef NDEBUG_PRECONDITIONS</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="preprocessor">#undef NDEBUG_PRECONDITIONS</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="preprocessor">#ifndef NDEBUG_CHECKS</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="preprocessor">#define NDEBUG_CHECKS</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="preprocessor">#ifndef NDEBUG_POSTCONDITIONS</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#define NDEBUG_POSTCONDITIONS</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="preprocessor">#ifndef NDEBUG_INVARIANTS</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="preprocessor">#define NDEBUG_INVARIANTS</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment">// check:</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="preprocessor">#ifdef NDEBUG_CHECKS</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="preprocessor">#define check(condition, message)</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="preprocessor">#if defined __cplusplus &amp;&amp; defined EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="preprocessor">#define check(condition, message) \</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="preprocessor"> throw string_concat(NULL, 0, (char*)&quot;Assertion fail&quot;, message[0] ? (char*)&quot;: &quot; : (char*)&quot;&quot;, message, (char*)&quot;, assertion: \&quot;&quot;, #condition, (char*)&quot;\&quot;, function: \&quot;&quot;, __FUNCTION__, (char*)&quot;\&quot;:&quot;, int2str(__LINE__), (char*)&quot;, file: \&quot;&quot;, __FILE__, (char*)&quot;\&quot;\n&quot;, NULL)</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="preprocessor">#else // EXIT_POLICY (default)</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221"> 81</a></span>&#160;<span class="preprocessor">#define check(condition, message) \</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="preprocessor"> do { \</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="preprocessor"> fprintf (stderr, &quot;Assertion fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;, \</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="preprocessor"> message[0] ? &quot;: &quot; : &quot;&quot;, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="preprocessor"> *((int*)0) = 0; \</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="preprocessor"> abort (); \</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="preprocessor"> } while (0)</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment">// precondition:</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="preprocessor">#ifdef NDEBUG_PRECONDITIONS</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="preprocessor">#define require(condition, message)</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="preprocessor">#if defined __cplusplus &amp;&amp; defined EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor">#define require(condition, message) \</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="preprocessor"> throw string_concat(NULL, 0, (char*)&quot;Precondition fail&quot;, message[0] ? (char*)&quot;: &quot; : (char*)&quot;&quot;, message, (char*)&quot;, assertion: \&quot;&quot;, #condition, (char*)&quot;\&quot;, function: \&quot;&quot;, __FUNCTION__, (char*)&quot;\&quot;:&quot;, int2str(__LINE__), (char*)&quot;, file: \&quot;&quot;, __FILE__, (char*)&quot;\&quot;\n&quot;, NULL)</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="preprocessor">#else // EXIT_POLICY (default)</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
<div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8"> 110</a></span>&#160;<span class="preprocessor">#define require(condition, message) \</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="preprocessor"> do { \</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="preprocessor"> fprintf (stderr, &quot;Precondition fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;, \</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<span class="preprocessor"> message[0] ? &quot;: &quot; : &quot;&quot;, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="preprocessor"> *((int*)0) = 0; \</span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="preprocessor"> abort (); \</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="preprocessor"> } while (0)</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; </div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="comment">// postcondition:</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="preprocessor">#ifdef NDEBUG_POSTCONDITIONS</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="preprocessor">#define ensure(condition, message)</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="preprocessor">#if defined __cplusplus &amp;&amp; defined EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="preprocessor">#define ensure(condition, message) \</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<span class="preprocessor"> throw string_concat(NULL, 0, (char*)&quot;Postcondition fail&quot;, message[0] ? (char*)&quot;: &quot; : (char*)&quot;&quot;, message, (char*)&quot;, assertion: \&quot;&quot;, #condition, (char*)&quot;\&quot;, function: \&quot;&quot;, __FUNCTION__, (char*)&quot;\&quot;:&quot;, int2str(__LINE__), (char*)&quot;, file: \&quot;&quot;, __FILE__, (char*)&quot;\&quot;\n&quot;, NULL)</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="preprocessor">#else // EXIT_POLICY (default)</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
<div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf"> 139</a></span>&#160;<span class="preprocessor">#define ensure(condition, message) \</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="preprocessor"> do { \</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="preprocessor"> fprintf (stderr, &quot;Postcondition fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;, \</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="preprocessor"> message[0] ? &quot;: &quot; : &quot;&quot;, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="preprocessor"> *((int*)0) = 0; \</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="preprocessor"> abort (); \</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="preprocessor"> } while (0)</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="comment">// invariant:</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="preprocessor">#ifdef NDEBUG_INVARIANTS</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="preprocessor">#define invariant(condition, message)</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="preprocessor">#if defined __cplusplus &amp;&amp; defined EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="preprocessor">#define invariant(condition, message) \</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="preprocessor"> throw string_concat(NULL, 0, (char*)&quot;Invariant fail&quot;, message[0] ? (char*)&quot;: &quot; : (char*)&quot;&quot;, message, (char*)&quot;, assertion: \&quot;&quot;, #condition, (char*)&quot;\&quot;, function: \&quot;&quot;, __FUNCTION__, (char*)&quot;\&quot;:&quot;, int2str(__LINE__), (char*)&quot;, file: \&quot;&quot;, __FILE__, (char*)&quot;\&quot;\n&quot;, NULL)</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="preprocessor">#else // EXIT_POLICY (default)</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725"> 168</a></span>&#160;<span class="preprocessor">#define invariant(condition, message) \</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;<span class="preprocessor"> if (!(condition)) \</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;<span class="preprocessor"> do { \</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="preprocessor"> fprintf (stderr, &quot;Invariant fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;, \</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="preprocessor"> message[0] ? &quot;: &quot; : &quot;&quot;, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="preprocessor"> *((int*)0) = 0; \</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="preprocessor"> abort (); \</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="preprocessor"> } while (0)</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; </div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="autils_8h_html"><div class="ttname"><a href="utils_8h.html">utils.h</a></div><div class="ttdoc">Useful common functions and macros.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dbc_8h.html">dbc.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: src Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('dir_68267d1309a1af8e8297ef4c3efbcdba.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">src Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:dbc_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dbc_8h.html">dbc.h</a> <a href="dbc_8h_source.html">[code]</a></td></tr>
<tr class="memdesc:dbc_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Design-by-Contract module. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:process_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="process_8h.html">process.h</a> <a href="process_8h_source.html">[code]</a></td></tr>
<tr class="memdesc:process_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="group__process.html#process">Process</a>, <a class="el" href="group__process.html#sysV">System-V</a>, and <a class="el" href="group__process.html#posix_sem">POSIX libraries</a> wrapper module. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:thread_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thread_8h.html">thread.h</a> <a href="thread_8h_source.html">[code]</a></td></tr>
<tr class="memdesc:thread_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">POSIX threads library wrapper module. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:utils_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html">utils.h</a> <a href="utils_8h_source.html">[code]</a></td></tr>
<tr class="memdesc:utils_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Useful common functions and macros. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,120 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);
// all rows after the clicked row
var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
/* @license-end */

View File

@ -0,0 +1,86 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('files.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="dbc_8h_source.html"><span class="icondoc"></span></a><a class="el" href="dbc_8h.html" target="_self">dbc.h</a></td><td class="desc">Design-by-Contract module </td></tr>
<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="process_8h_source.html"><span class="icondoc"></span></a><a class="el" href="process_8h.html" target="_self">process.h</a></td><td class="desc"><a class="el" href="group__process.html#process">Process</a>, <a class="el" href="group__process.html#sysV">System-V</a>, and <a class="el" href="group__process.html#posix_sem">POSIX libraries</a> wrapper module </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="thread_8h_source.html"><span class="icondoc"></span></a><a class="el" href="thread_8h.html" target="_self">thread.h</a></td><td class="desc">POSIX threads library wrapper module </td></tr>
<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="utils_8h_source.html"><span class="icondoc"></span></a><a class="el" href="utils_8h.html" target="_self">utils.h</a></td><td class="desc">Useful common functions and macros </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,7 @@
var files_dup =
[
[ "dbc.h", "dbc_8h.html", "dbc_8h" ],
[ "process.h", "process_8h.html", "process_8h" ],
[ "thread.h", "thread_8h.html", "thread_8h" ],
[ "utils.h", "utils_8h.html", "utils_8h" ]
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

View File

@ -0,0 +1,439 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('globals.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="contents">
<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
<h3><a id="index_c"></a>- c -</h3><ul>
<li>check
: <a class="el" href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">dbc.h</a>
</li>
<li>clear_console()
: <a class="el" href="group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7">utils.h</a>
</li>
<li>concat_2str
: <a class="el" href="group__utils.html#ga22347cbf977a0300726f06257edd79d6">utils.h</a>
</li>
<li>concat_3str
: <a class="el" href="group__utils.html#ga123e40006d54612c48c2660432dfeb23">utils.h</a>
</li>
<li>concat_4str
: <a class="el" href="group__utils.html#ga69037999e65cdb42d39988e0fec48af4">utils.h</a>
</li>
<li>concat_5str
: <a class="el" href="group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876">utils.h</a>
</li>
<li>concat_6str
: <a class="el" href="group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9">utils.h</a>
</li>
<li>concat_7str
: <a class="el" href="group__utils.html#ga01d1ea65eb6780d91705484dd46833bf">utils.h</a>
</li>
<li>cond_broadcast()
: <a class="el" href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">thread.h</a>
</li>
<li>cond_destroy()
: <a class="el" href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">thread.h</a>
</li>
<li>cond_init()
: <a class="el" href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">thread.h</a>
</li>
<li>cond_signal()
: <a class="el" href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">thread.h</a>
</li>
<li>cond_timedwait()
: <a class="el" href="group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b">thread.h</a>
</li>
<li>cond_wait()
: <a class="el" href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">thread.h</a>
</li>
<li>condattr_destroy()
: <a class="el" href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">thread.h</a>
</li>
<li>condattr_init()
: <a class="el" href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">thread.h</a>
</li>
</ul>
<h3><a id="index_e"></a>- e -</h3><ul>
<li>ensure
: <a class="el" href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">dbc.h</a>
</li>
</ul>
<h3><a id="index_h"></a>- h -</h3><ul>
<li>hide_cursor()
: <a class="el" href="group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1">utils.h</a>
</li>
</ul>
<h3><a id="index_i"></a>- i -</h3><ul>
<li>int2nstr
: <a class="el" href="group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09">utils.h</a>
</li>
<li>int2nstring()
: <a class="el" href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">utils.h</a>
</li>
<li>int2str
: <a class="el" href="group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b">utils.h</a>
</li>
<li>invariant
: <a class="el" href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">dbc.h</a>
</li>
</ul>
<h3><a id="index_l"></a>- l -</h3><ul>
<li>length_vargs_string_list
: <a class="el" href="group__utils.html#ga7bffda236a079c26302722c7d155f7a5">utils.h</a>
</li>
<li>long2nstr
: <a class="el" href="group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086">utils.h</a>
</li>
<li>long2str
: <a class="el" href="group__utils.html#ga69373a612a7b4d264371f727217f9954">utils.h</a>
</li>
</ul>
<h3><a id="index_m"></a>- m -</h3><ul>
<li>mem_alloc()
: <a class="el" href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">utils.h</a>
</li>
<li>mem_free()
: <a class="el" href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">utils.h</a>
</li>
<li>move_cursor()
: <a class="el" href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">utils.h</a>
</li>
<li>mutex_destroy()
: <a class="el" href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">thread.h</a>
</li>
<li>mutex_init()
: <a class="el" href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">thread.h</a>
</li>
<li>mutex_lock()
: <a class="el" href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">thread.h</a>
</li>
<li>mutex_trylock()
: <a class="el" href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">thread.h</a>
</li>
<li>mutex_unlock()
: <a class="el" href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">thread.h</a>
</li>
<li>mutexattr_destroy()
: <a class="el" href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">thread.h</a>
</li>
<li>mutexattr_gettype()
: <a class="el" href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">thread.h</a>
</li>
<li>mutexattr_init()
: <a class="el" href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">thread.h</a>
</li>
<li>mutexattr_settype()
: <a class="el" href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">thread.h</a>
</li>
</ul>
<h3><a id="index_n"></a>- n -</h3><ul>
<li>not_null
: <a class="el" href="group__utils.html#gadfa0375f8178c737deae23ffa8d152f4">utils.h</a>
</li>
</ul>
<h3><a id="index_p"></a>- p -</h3><ul>
<li>perc2str
: <a class="el" href="group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5">utils.h</a>
</li>
<li>percentage2string()
: <a class="el" href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">utils.h</a>
</li>
<li>pexecl()
: <a class="el" href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">process.h</a>
</li>
<li>pfork()
: <a class="el" href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">process.h</a>
</li>
<li>pkill()
: <a class="el" href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">process.h</a>
</li>
<li>pmsgctl()
: <a class="el" href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">process.h</a>
</li>
<li>pmsgget()
: <a class="el" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">process.h</a>
</li>
<li>pmsgrcv()
: <a class="el" href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">process.h</a>
</li>
<li>pmsgsnd()
: <a class="el" href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">process.h</a>
</li>
<li>ppclose()
: <a class="el" href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">process.h</a>
</li>
<li>ppipe()
: <a class="el" href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">process.h</a>
</li>
<li>ppopen()
: <a class="el" href="group__process.html#ga2d9df322812707050312aa24d15a4360">process.h</a>
</li>
<li>psem_close()
: <a class="el" href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">process.h</a>
</li>
<li>psem_destroy()
: <a class="el" href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">process.h</a>
</li>
<li>psem_down()
: <a class="el" href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">process.h</a>
</li>
<li>psem_down2()
: <a class="el" href="group__process.html#ga47891b55ba91af98c5b45cbcf154bc20">process.h</a>
</li>
<li>psem_init()
: <a class="el" href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">process.h</a>
</li>
<li>psem_open()
: <a class="el" href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">process.h</a>
</li>
<li>psem_post()
: <a class="el" href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">process.h</a>
</li>
<li>psem_timedwait()
: <a class="el" href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">process.h</a>
</li>
<li>psem_trywait()
: <a class="el" href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">process.h</a>
</li>
<li>psem_unlink()
: <a class="el" href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">process.h</a>
</li>
<li>psem_up()
: <a class="el" href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">process.h</a>
</li>
<li>psem_wait()
: <a class="el" href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">process.h</a>
</li>
<li>psemctl()
: <a class="el" href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">process.h</a>
</li>
<li>psemget()
: <a class="el" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">process.h</a>
</li>
<li>psemop()
: <a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">process.h</a>
</li>
<li>pshmat()
: <a class="el" href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">process.h</a>
</li>
<li>pshmctl()
: <a class="el" href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">process.h</a>
</li>
<li>pshmdt()
: <a class="el" href="group__process.html#ga1682328cd34b592404ff030779b0428f">process.h</a>
</li>
<li>pshmget()
: <a class="el" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">process.h</a>
</li>
<li>psigaction()
: <a class="el" href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">process.h</a>
</li>
<li>pwait()
: <a class="el" href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">process.h</a>
</li>
<li>pwaitpid()
: <a class="el" href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">process.h</a>
</li>
</ul>
<h3><a id="index_r"></a>- r -</h3><ul>
<li>random_boolean()
: <a class="el" href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">utils.h</a>
</li>
<li>random_int()
: <a class="el" href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">utils.h</a>
</li>
<li>random_string()
: <a class="el" href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">utils.h</a>
</li>
<li>require
: <a class="el" href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">dbc.h</a>
</li>
</ul>
<h3><a id="index_s"></a>- s -</h3><ul>
<li>show_cursor()
: <a class="el" href="group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559">utils.h</a>
</li>
<li>string_clone()
: <a class="el" href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">utils.h</a>
</li>
<li>string_concat()
: <a class="el" href="group__utils.html#gaa23a827164f7039b9770379cbf008905">utils.h</a>
</li>
<li>string_count_char()
: <a class="el" href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">utils.h</a>
</li>
<li>string_ends_with()
: <a class="el" href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">utils.h</a>
</li>
<li>string_list_clone()
: <a class="el" href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">utils.h</a>
</li>
<li>string_list_free()
: <a class="el" href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">utils.h</a>
</li>
<li>string_list_length()
: <a class="el" href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">utils.h</a>
</li>
<li>string_num_columns()
: <a class="el" href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">utils.h</a>
</li>
<li>string_num_lines()
: <a class="el" href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">utils.h</a>
</li>
<li>string_starts_with()
: <a class="el" href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">utils.h</a>
</li>
</ul>
<h3><a id="index_t"></a>- t -</h3><ul>
<li>thread_attr_destroy()
: <a class="el" href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">thread.h</a>
</li>
<li>thread_attr_getdetachstate()
: <a class="el" href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">thread.h</a>
</li>
<li>thread_attr_init()
: <a class="el" href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">thread.h</a>
</li>
<li>thread_attr_setdetachstate()
: <a class="el" href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">thread.h</a>
</li>
<li>thread_cancel()
: <a class="el" href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">thread.h</a>
</li>
<li>thread_create()
: <a class="el" href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">thread.h</a>
</li>
<li>thread_detach()
: <a class="el" href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">thread.h</a>
</li>
<li>thread_equal()
: <a class="el" href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">thread.h</a>
</li>
<li>thread_exit()
: <a class="el" href="group__thread.html#ga19b16adf05364471bae2840aa564329a">thread.h</a>
</li>
<li>thread_getspecific()
: <a class="el" href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">thread.h</a>
</li>
<li>thread_join()
: <a class="el" href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">thread.h</a>
</li>
<li>thread_key_create()
: <a class="el" href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">thread.h</a>
</li>
<li>thread_key_delete()
: <a class="el" href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">thread.h</a>
</li>
<li>thread_once()
: <a class="el" href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">thread.h</a>
</li>
<li>thread_sched_yield()
: <a class="el" href="group__thread.html#ga952c63101c667d247f0923b609710c72">thread.h</a>
</li>
<li>thread_self()
: <a class="el" href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">thread.h</a>
</li>
<li>thread_setcancelstate()
: <a class="el" href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">thread.h</a>
</li>
<li>thread_setcanceltype()
: <a class="el" href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">thread.h</a>
</li>
<li>thread_setspecific()
: <a class="el" href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">thread.h</a>
</li>
<li>thread_testcancel()
: <a class="el" href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">thread.h</a>
</li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,127 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('globals_defs.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="contents">
&#160;<ul>
<li>check
: <a class="el" href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">dbc.h</a>
</li>
<li>concat_2str
: <a class="el" href="group__utils.html#ga22347cbf977a0300726f06257edd79d6">utils.h</a>
</li>
<li>concat_3str
: <a class="el" href="group__utils.html#ga123e40006d54612c48c2660432dfeb23">utils.h</a>
</li>
<li>concat_4str
: <a class="el" href="group__utils.html#ga69037999e65cdb42d39988e0fec48af4">utils.h</a>
</li>
<li>concat_5str
: <a class="el" href="group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876">utils.h</a>
</li>
<li>concat_6str
: <a class="el" href="group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9">utils.h</a>
</li>
<li>concat_7str
: <a class="el" href="group__utils.html#ga01d1ea65eb6780d91705484dd46833bf">utils.h</a>
</li>
<li>ensure
: <a class="el" href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">dbc.h</a>
</li>
<li>int2nstr
: <a class="el" href="group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09">utils.h</a>
</li>
<li>int2str
: <a class="el" href="group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b">utils.h</a>
</li>
<li>invariant
: <a class="el" href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">dbc.h</a>
</li>
<li>length_vargs_string_list
: <a class="el" href="group__utils.html#ga7bffda236a079c26302722c7d155f7a5">utils.h</a>
</li>
<li>long2nstr
: <a class="el" href="group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086">utils.h</a>
</li>
<li>long2str
: <a class="el" href="group__utils.html#ga69373a612a7b4d264371f727217f9954">utils.h</a>
</li>
<li>not_null
: <a class="el" href="group__utils.html#gadfa0375f8178c737deae23ffa8d152f4">utils.h</a>
</li>
<li>perc2str
: <a class="el" href="group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5">utils.h</a>
</li>
<li>require
: <a class="el" href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">dbc.h</a>
</li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,376 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('globals_func.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="contents">
&#160;
<h3><a id="index_c"></a>- c -</h3><ul>
<li>clear_console()
: <a class="el" href="group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7">utils.h</a>
</li>
<li>cond_broadcast()
: <a class="el" href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">thread.h</a>
</li>
<li>cond_destroy()
: <a class="el" href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">thread.h</a>
</li>
<li>cond_init()
: <a class="el" href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">thread.h</a>
</li>
<li>cond_signal()
: <a class="el" href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">thread.h</a>
</li>
<li>cond_timedwait()
: <a class="el" href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">thread.h</a>
</li>
<li>cond_wait()
: <a class="el" href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">thread.h</a>
</li>
<li>condattr_destroy()
: <a class="el" href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">thread.h</a>
</li>
<li>condattr_init()
: <a class="el" href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">thread.h</a>
</li>
</ul>
<h3><a id="index_h"></a>- h -</h3><ul>
<li>hide_cursor()
: <a class="el" href="group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1">utils.h</a>
</li>
</ul>
<h3><a id="index_i"></a>- i -</h3><ul>
<li>int2nstring()
: <a class="el" href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">utils.h</a>
</li>
</ul>
<h3><a id="index_m"></a>- m -</h3><ul>
<li>mem_alloc()
: <a class="el" href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">utils.h</a>
</li>
<li>mem_free()
: <a class="el" href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">utils.h</a>
</li>
<li>move_cursor()
: <a class="el" href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">utils.h</a>
</li>
<li>mutex_destroy()
: <a class="el" href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">thread.h</a>
</li>
<li>mutex_init()
: <a class="el" href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">thread.h</a>
</li>
<li>mutex_lock()
: <a class="el" href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">thread.h</a>
</li>
<li>mutex_trylock()
: <a class="el" href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">thread.h</a>
</li>
<li>mutex_unlock()
: <a class="el" href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">thread.h</a>
</li>
<li>mutexattr_destroy()
: <a class="el" href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">thread.h</a>
</li>
<li>mutexattr_gettype()
: <a class="el" href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">thread.h</a>
</li>
<li>mutexattr_init()
: <a class="el" href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">thread.h</a>
</li>
<li>mutexattr_settype()
: <a class="el" href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">thread.h</a>
</li>
</ul>
<h3><a id="index_p"></a>- p -</h3><ul>
<li>percentage2string()
: <a class="el" href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">utils.h</a>
</li>
<li>pexecl()
: <a class="el" href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">process.h</a>
</li>
<li>pfork()
: <a class="el" href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">process.h</a>
</li>
<li>pkill()
: <a class="el" href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">process.h</a>
</li>
<li>pmsgctl()
: <a class="el" href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">process.h</a>
</li>
<li>pmsgget()
: <a class="el" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">process.h</a>
</li>
<li>pmsgrcv()
: <a class="el" href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">process.h</a>
</li>
<li>pmsgsnd()
: <a class="el" href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">process.h</a>
</li>
<li>ppclose()
: <a class="el" href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">process.h</a>
</li>
<li>ppipe()
: <a class="el" href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">process.h</a>
</li>
<li>ppopen()
: <a class="el" href="group__process.html#ga2d9df322812707050312aa24d15a4360">process.h</a>
</li>
<li>psem_close()
: <a class="el" href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">process.h</a>
</li>
<li>psem_destroy()
: <a class="el" href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">process.h</a>
</li>
<li>psem_down()
: <a class="el" href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">process.h</a>
</li>
<li>psem_down2()
: <a class="el" href="group__process.html#ga47891b55ba91af98c5b45cbcf154bc20">process.h</a>
</li>
<li>psem_init()
: <a class="el" href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">process.h</a>
</li>
<li>psem_open()
: <a class="el" href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">process.h</a>
</li>
<li>psem_post()
: <a class="el" href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">process.h</a>
</li>
<li>psem_timedwait()
: <a class="el" href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">process.h</a>
</li>
<li>psem_trywait()
: <a class="el" href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">process.h</a>
</li>
<li>psem_unlink()
: <a class="el" href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">process.h</a>
</li>
<li>psem_up()
: <a class="el" href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">process.h</a>
</li>
<li>psem_wait()
: <a class="el" href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">process.h</a>
</li>
<li>psemctl()
: <a class="el" href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">process.h</a>
</li>
<li>psemget()
: <a class="el" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">process.h</a>
</li>
<li>psemop()
: <a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">process.h</a>
</li>
<li>pshmat()
: <a class="el" href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">process.h</a>
</li>
<li>pshmctl()
: <a class="el" href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">process.h</a>
</li>
<li>pshmdt()
: <a class="el" href="group__process.html#ga1682328cd34b592404ff030779b0428f">process.h</a>
</li>
<li>pshmget()
: <a class="el" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">process.h</a>
</li>
<li>psigaction()
: <a class="el" href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">process.h</a>
</li>
<li>pwait()
: <a class="el" href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">process.h</a>
</li>
<li>pwaitpid()
: <a class="el" href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">process.h</a>
</li>
</ul>
<h3><a id="index_r"></a>- r -</h3><ul>
<li>random_boolean()
: <a class="el" href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">utils.h</a>
</li>
<li>random_int()
: <a class="el" href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">utils.h</a>
</li>
<li>random_string()
: <a class="el" href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">utils.h</a>
</li>
</ul>
<h3><a id="index_s"></a>- s -</h3><ul>
<li>show_cursor()
: <a class="el" href="group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559">utils.h</a>
</li>
<li>string_clone()
: <a class="el" href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">utils.h</a>
</li>
<li>string_concat()
: <a class="el" href="group__utils.html#gaa23a827164f7039b9770379cbf008905">utils.h</a>
</li>
<li>string_count_char()
: <a class="el" href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">utils.h</a>
</li>
<li>string_ends_with()
: <a class="el" href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">utils.h</a>
</li>
<li>string_list_clone()
: <a class="el" href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">utils.h</a>
</li>
<li>string_list_free()
: <a class="el" href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">utils.h</a>
</li>
<li>string_list_length()
: <a class="el" href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">utils.h</a>
</li>
<li>string_num_columns()
: <a class="el" href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">utils.h</a>
</li>
<li>string_num_lines()
: <a class="el" href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">utils.h</a>
</li>
<li>string_starts_with()
: <a class="el" href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">utils.h</a>
</li>
</ul>
<h3><a id="index_t"></a>- t -</h3><ul>
<li>thread_attr_destroy()
: <a class="el" href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">thread.h</a>
</li>
<li>thread_attr_getdetachstate()
: <a class="el" href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">thread.h</a>
</li>
<li>thread_attr_init()
: <a class="el" href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">thread.h</a>
</li>
<li>thread_attr_setdetachstate()
: <a class="el" href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">thread.h</a>
</li>
<li>thread_cancel()
: <a class="el" href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">thread.h</a>
</li>
<li>thread_create()
: <a class="el" href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">thread.h</a>
</li>
<li>thread_detach()
: <a class="el" href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">thread.h</a>
</li>
<li>thread_equal()
: <a class="el" href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">thread.h</a>
</li>
<li>thread_exit()
: <a class="el" href="group__thread.html#ga19b16adf05364471bae2840aa564329a">thread.h</a>
</li>
<li>thread_getspecific()
: <a class="el" href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">thread.h</a>
</li>
<li>thread_join()
: <a class="el" href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">thread.h</a>
</li>
<li>thread_key_create()
: <a class="el" href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">thread.h</a>
</li>
<li>thread_key_delete()
: <a class="el" href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">thread.h</a>
</li>
<li>thread_once()
: <a class="el" href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">thread.h</a>
</li>
<li>thread_sched_yield()
: <a class="el" href="group__thread.html#ga952c63101c667d247f0923b609710c72">thread.h</a>
</li>
<li>thread_self()
: <a class="el" href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">thread.h</a>
</li>
<li>thread_setcancelstate()
: <a class="el" href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">thread.h</a>
</li>
<li>thread_setcanceltype()
: <a class="el" href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">thread.h</a>
</li>
<li>thread_setspecific()
: <a class="el" href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">thread.h</a>
</li>
<li>thread_testcancel()
: <a class="el" href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">thread.h</a>
</li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,305 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: DbC</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('group___db_c.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#files">Files</a> &#124;
<a href="#define-members">Macros</a> </div>
<div class="headertitle">
<div class="title">DbC</div> </div>
</div><!--header-->
<div class="contents">
<p>Design-by-Contract module.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:dbc_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dbc_8h.html">dbc.h</a></td></tr>
<tr class="memdesc:dbc_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Design-by-Contract module. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:gac101c8ba449f6f8c71b3789a9c489221"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">check</a>(condition, message)</td></tr>
<tr class="memdesc:gac101c8ba449f6f8c71b3789a9c489221"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of an general algorithm assertion. <a href="group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221">More...</a><br /></td></tr>
<tr class="separator:gac101c8ba449f6f8c71b3789a9c489221"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5bf1825f80465097d4b753a001cf1af8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">require</a>(condition, message)</td></tr>
<tr class="memdesc:ga5bf1825f80465097d4b753a001cf1af8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of a precondition. <a href="group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8">More...</a><br /></td></tr>
<tr class="separator:ga5bf1825f80465097d4b753a001cf1af8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">ensure</a>(condition, message)</td></tr>
<tr class="memdesc:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of a postcondition. <a href="group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf">More...</a><br /></td></tr>
<tr class="separator:ga5d17c602c4f191371a5fec5af7adc3cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">invariant</a>(condition, message)</td></tr>
<tr class="memdesc:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks the verification of an invariant. <a href="group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725">More...</a><br /></td></tr>
<tr class="separator:gaf9d59b04beef1bf139e10fc44c6f9725"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>Design-by-Contract module. </p>
<p>This module gives a better support for DbC in C++.</p>
<p>When compared with <code>assert.h</code> this module offers the following functionalities:</p><ul>
<li>separates different assertion types (preconditions, postconditions, invariants, and others);</li>
<li>augments assert with error message strings;</li>
<li>implements two error handling policies:<ol type="1">
<li>EXIT_POLICY (default): describes the failed assertion in <code>stderr</code> (with the identification and the precise location of the assertion), generates a segmentation fault (enabling a stack trace within a debugger like <code>gdb</code>), and exits program execution;</li>
<li>EXCEPTION_POLICY: throws a <code>char*</code> exception with the description of the failed assertion.</li>
</ol>
</li>
</ul>
<p>Debug settings:</p><ul>
<li>As happens with <code>assert.h</code>, this module accepts <b><code>NDEBUG</code></b> macro definition to disable all assertion run-time verification.</li>
<li>Also, each assertion type verification can be disabled with macros: <b><code>NDEBUG_CHECKS</code></b>, <b><code>NDEBUG_PRECONDITIONS</code></b>, <b><code>NDEBUG_POSTCONDITIONS</code></b>, and <b><code>NDEBUG_INVARIANTS</code></b>.</li>
<li>A special (high priority) macro named <b><code>DEBUG_ONLY_PRECONDITIONS</code></b> ensures that only precondition debugging remains active (regardless of other debug definitions).</li>
</ul>
<dl class="section author"><dt>Author</dt><dd>Miguel Oliveira e Silva, 2018 </dd></dl>
<h2 class="groupheader">Macro Definition Documentation</h2>
<a id="gac101c8ba449f6f8c71b3789a9c489221"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac101c8ba449f6f8c71b3789a9c489221">&#9670;&nbsp;</a></span>check</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define check</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">condition, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">message&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (!(condition)) \</div>
<div class="line"> do { \</div>
<div class="line"> fprintf (stderr, <span class="stringliteral">&quot;Assertion fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;</span>, \</div>
<div class="line"> message[0] ? <span class="stringliteral">&quot;: &quot;</span> : <span class="stringliteral">&quot;&quot;</span>, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</div>
<div class="line"> *((<span class="keywordtype">int</span>*)0) = 0; \</div>
<div class="line"> abort (); \</div>
<div class="line"> } <span class="keywordflow">while</span> (0)</div>
</div><!-- fragment -->
<p>Checks the verification of an general algorithm assertion. </p>
<p>This assertion verification can be disabled at compile time by defining the macro <b><code>NDEBUG_CHECKS</code></b>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">condition</td><td>expression to assert its truthness </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">message</td><td>text to be presented with error information when the assertion fails </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga5bf1825f80465097d4b753a001cf1af8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5bf1825f80465097d4b753a001cf1af8">&#9670;&nbsp;</a></span>require</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define require</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">condition, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">message&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (!(condition)) \</div>
<div class="line"> do { \</div>
<div class="line"> fprintf (stderr, <span class="stringliteral">&quot;Precondition fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;</span>, \</div>
<div class="line"> message[0] ? <span class="stringliteral">&quot;: &quot;</span> : <span class="stringliteral">&quot;&quot;</span>, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</div>
<div class="line"> *((<span class="keywordtype">int</span>*)0) = 0; \</div>
<div class="line"> abort (); \</div>
<div class="line"> } <span class="keywordflow">while</span> (0)</div>
</div><!-- fragment -->
<p>Checks the verification of a precondition. </p>
<p>This assertion verification can be disabled at compile time by defining the macro <b><code>NDEBUG_PRECONDITIONS</code></b>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">condition</td><td>expression to assert its truthness </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">message</td><td>text to be presented with error information when the assertion fails </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga5d17c602c4f191371a5fec5af7adc3cf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5d17c602c4f191371a5fec5af7adc3cf">&#9670;&nbsp;</a></span>ensure</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define ensure</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">condition, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">message&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (!(condition)) \</div>
<div class="line"> do { \</div>
<div class="line"> fprintf (stderr, <span class="stringliteral">&quot;Postcondition fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;</span>, \</div>
<div class="line"> message[0] ? <span class="stringliteral">&quot;: &quot;</span> : <span class="stringliteral">&quot;&quot;</span>, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</div>
<div class="line"> *((<span class="keywordtype">int</span>*)0) = 0; \</div>
<div class="line"> abort (); \</div>
<div class="line"> } <span class="keywordflow">while</span> (0)</div>
</div><!-- fragment -->
<p>Checks the verification of a postcondition. </p>
<p>This assertion verification can be disabled at compile time by defining the macro <b><code>NDEBUG_POSTCONDITIONS</code></b>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">condition</td><td>expression to assert its truthness </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">message</td><td>text to be presented with error information when the assertion fails </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaf9d59b04beef1bf139e10fc44c6f9725"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf9d59b04beef1bf139e10fc44c6f9725">&#9670;&nbsp;</a></span>invariant</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define invariant</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">condition, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname">message&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"> <span class="keywordflow">if</span> (!(condition)) \</div>
<div class="line"> do { \</div>
<div class="line"> fprintf (stderr, <span class="stringliteral">&quot;Invariant fail%s%s, assertion: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;</span>, \</div>
<div class="line"> message[0] ? <span class="stringliteral">&quot;: &quot;</span> : <span class="stringliteral">&quot;&quot;</span>, message, #condition, __FUNCTION__, __LINE__ , __FILE__); \</div>
<div class="line"> *((<span class="keywordtype">int</span>*)0) = 0; \</div>
<div class="line"> abort (); \</div>
<div class="line"> } <span class="keywordflow">while</span> (0)</div>
</div><!-- fragment -->
<p>Checks the verification of an invariant. </p>
<p>This assertion verification can be disabled at compile time by defining the macro <b><code>NDEBUG_INVARIANTS</code></b>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">condition</td><td>expression to assert its truthness </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">message</td><td>text to be presented with error information when the assertion fails </td></tr>
</table>
</dd>
</dl>
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,8 @@
var group___db_c =
[
[ "dbc.h", "dbc_8h.html", null ],
[ "check", "group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221", null ],
[ "require", "group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8", null ],
[ "ensure", "group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf", null ],
[ "invariant", "group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725", null ]
];

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
var group__process =
[
[ "process.h", "process_8h.html", null ],
[ "pfork", "group__process.html#ga67e00aff1839b1ba68c83947593f625b", null ],
[ "pwait", "group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1", null ],
[ "pwaitpid", "group__process.html#gac926bd7ccd173f742b5d58f51cabcb48", null ],
[ "pkill", "group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8", null ],
[ "pexecl", "group__process.html#gae5d3e8ac00f0e788f21020699bac758a", null ],
[ "psigaction", "group__process.html#ga7c7f6de68bd3dea8a702668090a65854", null ],
[ "pshmget", "group__process.html#gaff71624be0fc9c76e0c72295721875e6", null ],
[ "pshmctl", "group__process.html#ga3119bdf5486059aee6ec3ed65a01b319", null ],
[ "pshmat", "group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480", null ],
[ "pshmdt", "group__process.html#ga1682328cd34b592404ff030779b0428f", null ],
[ "psemget", "group__process.html#gaada159a0fe725ed843ac358be6e6a9d3", null ],
[ "psemctl", "group__process.html#gac42e869afba098ec9bdd77444ba790c5", null ],
[ "psemop", "group__process.html#ga0e2534c82b54573590d913c297cc4840", null ],
[ "psem_up", "group__process.html#gaa00610fec639ef123819ceee2ef00da3", null ],
[ "psem_down", "group__process.html#gac2b930e9aceda9ef276b21ae8e839c16", null ],
[ "psem_down2", "group__process.html#ga47891b55ba91af98c5b45cbcf154bc20", null ],
[ "pmsgget", "group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7", null ],
[ "pmsgctl", "group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f", null ],
[ "pmsgsnd", "group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a", null ],
[ "pmsgrcv", "group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b", null ],
[ "psem_open", "group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba", null ],
[ "psem_close", "group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668", null ],
[ "psem_unlink", "group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e", null ],
[ "psem_init", "group__process.html#gac49ddb266cec5493ebd756cd9382f99d", null ],
[ "psem_destroy", "group__process.html#ga82e3d1015521711a2a6374d6c3771491", null ],
[ "psem_wait", "group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6", null ],
[ "psem_trywait", "group__process.html#ga04cb3c84545fe7707c63578e1d59b689", null ],
[ "psem_timedwait", "group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef", null ],
[ "psem_post", "group__process.html#gad63921c4ec6f0845b752eb59a8935b8e", null ],
[ "ppipe", "group__process.html#ga013466fa89ac97a0db0ccd78168a8456", null ],
[ "ppopen", "group__process.html#ga2d9df322812707050312aa24d15a4360", null ],
[ "ppclose", "group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68", null ]
];

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
var group__thread =
[
[ "thread.h", "thread_8h.html", null ],
[ "thread_equal", "group__thread.html#gadca8bdcec91b8985370d904591d342b8", null ],
[ "thread_create", "group__thread.html#ga3a0f9920a321b54c41c098d3461d3889", null ],
[ "thread_self", "group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4", null ],
[ "thread_sched_yield", "group__thread.html#ga952c63101c667d247f0923b609710c72", null ],
[ "thread_exit", "group__thread.html#ga19b16adf05364471bae2840aa564329a", null ],
[ "thread_detach", "group__thread.html#ga86aa7989874009c886bea9d41700e25c", null ],
[ "thread_join", "group__thread.html#ga2b2370a45c1518f777493526b2e4f46d", null ],
[ "mutex_init", "group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6", null ],
[ "mutex_destroy", "group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01", null ],
[ "mutex_lock", "group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39", null ],
[ "mutex_trylock", "group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928", null ],
[ "mutex_unlock", "group__thread.html#ga95235231165ebda870afa10ba5fd6c41", null ],
[ "cond_init", "group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad", null ],
[ "cond_destroy", "group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80", null ],
[ "cond_wait", "group__thread.html#ga1123643838d5174ccd41f52f4169e896", null ],
[ "cond_timedwait", "group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2", null ],
[ "cond_timedwait", "group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b", null ],
[ "cond_signal", "group__thread.html#ga9624688b577fb653af7a528848cc53d5", null ],
[ "cond_broadcast", "group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0", null ],
[ "thread_once", "group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c", null ],
[ "thread_key_create", "group__thread.html#ga7df1983f57dca40a86a55d215d13d42b", null ],
[ "thread_key_delete", "group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e", null ],
[ "thread_setspecific", "group__thread.html#ga3008b033f2830e79179a882a2b74c8ba", null ],
[ "thread_getspecific", "group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16", null ],
[ "mutexattr_init", "group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd", null ],
[ "mutexattr_destroy", "group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5", null ],
[ "mutexattr_settype", "group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2", null ],
[ "mutexattr_gettype", "group__thread.html#gadf741e1818d53c5b7d71cd68e161b215", null ],
[ "condattr_init", "group__thread.html#gab8073c72be896ba9d711d887a5405a74", null ],
[ "condattr_destroy", "group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0", null ],
[ "thread_attr_init", "group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6", null ],
[ "thread_attr_destroy", "group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c", null ],
[ "thread_attr_setdetachstate", "group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f", null ],
[ "thread_attr_getdetachstate", "group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4", null ],
[ "thread_cancel", "group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1", null ],
[ "thread_setcancelstate", "group__thread.html#ga98baffe08beec792f3428ae9ddad966e", null ],
[ "thread_setcanceltype", "group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c", null ],
[ "thread_testcancel", "group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671", null ]
];

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,38 @@
var group__utils =
[
[ "utils.h", "utils_8h.html", null ],
[ "concat_2str", "group__utils.html#ga22347cbf977a0300726f06257edd79d6", null ],
[ "concat_3str", "group__utils.html#ga123e40006d54612c48c2660432dfeb23", null ],
[ "concat_4str", "group__utils.html#ga69037999e65cdb42d39988e0fec48af4", null ],
[ "concat_5str", "group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876", null ],
[ "concat_6str", "group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9", null ],
[ "concat_7str", "group__utils.html#ga01d1ea65eb6780d91705484dd46833bf", null ],
[ "int2str", "group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b", null ],
[ "int2nstr", "group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09", null ],
[ "long2str", "group__utils.html#ga69373a612a7b4d264371f727217f9954", null ],
[ "long2nstr", "group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086", null ],
[ "perc2str", "group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5", null ],
[ "length_vargs_string_list", "group__utils.html#ga7bffda236a079c26302722c7d155f7a5", null ],
[ "not_null", "group__utils.html#gadfa0375f8178c737deae23ffa8d152f4", null ],
[ "mem_alloc", "group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052", null ],
[ "mem_free", "group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae", null ],
[ "string_clone", "group__utils.html#ga825354891d287cc86d2b4ed1b600175a", null ],
[ "string_num_lines", "group__utils.html#ga15630ddb64e977c8243892556feedfd8", null ],
[ "string_num_columns", "group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c", null ],
[ "string_count_char", "group__utils.html#gad643e0fcac9e59c1a171c460633e8637", null ],
[ "string_starts_with", "group__utils.html#ga3ec2b60d1636397119c5e0c21987f791", null ],
[ "string_ends_with", "group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4", null ],
[ "string_concat", "group__utils.html#gaa23a827164f7039b9770379cbf008905", null ],
[ "random_boolean", "group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f", null ],
[ "random_int", "group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9", null ],
[ "random_string", "group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75", null ],
[ "clear_console", "group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7", null ],
[ "move_cursor", "group__utils.html#gad3d324aed0ec686314cb0f68dfde9853", null ],
[ "hide_cursor", "group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1", null ],
[ "show_cursor", "group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559", null ],
[ "string_list_length", "group__utils.html#gab8050db5b87bfdee91ee92e67b063478", null ],
[ "string_list_clone", "group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c", null ],
[ "string_list_free", "group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c", null ],
[ "int2nstring", "group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e", null ],
[ "percentage2string", "group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6", null ]
];

View File

@ -0,0 +1,78 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: Main Page</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('index.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">C++ Library, mos@ua Documentation</div> </div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,50 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
var result='';
if ('children' in data) {
result+='<ul>';
for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>';
}
result+='</ul>';
}
return result;
}
$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
}
/* @license-end */

View File

@ -0,0 +1,50 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2019 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
var menudata={children:[
{text:"Main Page",url:"index.html"},
{text:"Modules",url:"modules.html"},
{text:"Files",url:"files.html",children:[
{text:"File List",url:"files.html"},
{text:"Globals",url:"globals.html",children:[
{text:"All",url:"globals.html",children:[
{text:"c",url:"globals.html#index_c"},
{text:"e",url:"globals.html#index_e"},
{text:"h",url:"globals.html#index_h"},
{text:"i",url:"globals.html#index_i"},
{text:"l",url:"globals.html#index_l"},
{text:"m",url:"globals.html#index_m"},
{text:"n",url:"globals.html#index_n"},
{text:"p",url:"globals.html#index_p"},
{text:"r",url:"globals.html#index_r"},
{text:"s",url:"globals.html#index_s"},
{text:"t",url:"globals.html#index_t"}]},
{text:"Functions",url:"globals_func.html",children:[
{text:"c",url:"globals_func.html#index_c"},
{text:"h",url:"globals_func.html#index_h"},
{text:"i",url:"globals_func.html#index_i"},
{text:"m",url:"globals_func.html#index_m"},
{text:"p",url:"globals_func.html#index_p"},
{text:"r",url:"globals_func.html#index_r"},
{text:"s",url:"globals_func.html#index_s"},
{text:"t",url:"globals_func.html#index_t"}]},
{text:"Macros",url:"globals_defs.html"}]}]}]}

View File

@ -0,0 +1,86 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: Modules</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('modules.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Modules</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all modules:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="group___db_c.html" target="_self">DbC</a></td><td class="desc">Design-by-Contract module </td></tr>
<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="group__process.html" target="_self">process</a></td><td class="desc"><a class="el" href="group__process.html#process">Process</a>, <a class="el" href="group__process.html#sysV">System-V</a>, and <a class="el" href="group__process.html#posix_sem">POSIX libraries</a> wrapper module </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="group__thread.html" target="_self">thread</a></td><td class="desc">POSIX threads library wrapper module </td></tr>
<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="group__utils.html" target="_self">utils</a></td><td class="desc">Useful common functions and macros </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,7 @@
var modules =
[
[ "DbC", "group___db_c.html", "group___db_c" ],
[ "process", "group__process.html", "group__process" ],
[ "thread", "group__thread.html", "group__thread" ],
[ "utils", "group__utils.html", "group__utils" ]
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

View File

@ -0,0 +1,146 @@
#nav-tree .children_ul {
margin:0;
padding:4px;
}
#nav-tree ul {
list-style:none outside none;
margin:0px;
padding:0px;
}
#nav-tree li {
white-space:nowrap;
margin:0px;
padding:0px;
}
#nav-tree .plus {
margin:0px;
}
#nav-tree .selected {
background-image: url('tab_a.png');
background-repeat:repeat-x;
color: #fff;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
}
#nav-tree img {
margin:0px;
padding:0px;
border:0px;
vertical-align: middle;
}
#nav-tree a {
text-decoration:none;
padding:0px;
margin:0px;
outline:none;
}
#nav-tree .label {
margin:0px;
padding:0px;
font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
}
#nav-tree .label a {
padding:2px;
}
#nav-tree .selected a {
text-decoration:none;
color:#fff;
}
#nav-tree .children_ul {
margin:0px;
padding:0px;
}
#nav-tree .item {
margin:0px;
padding:0px;
}
#nav-tree {
padding: 0px 0px;
background-color: #FAFAFF;
font-size:14px;
overflow:auto;
}
#doc-content {
overflow:auto;
display:block;
padding:0px;
margin:0px;
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
#side-nav {
padding:0 6px 0 0;
margin: 0px;
display:block;
position: absolute;
left: 0px;
width: 250px;
}
.ui-resizable .ui-resizable-handle {
display:block;
}
.ui-resizable-e {
background-image:url("splitbar.png");
background-size:100%;
background-repeat:repeat-y;
background-attachment: scroll;
cursor:ew-resize;
height:100%;
right:0;
top:0;
width:6px;
}
.ui-resizable-handle {
display:none;
font-size:0.1px;
position:absolute;
z-index:1;
}
#nav-tree-contents {
margin: 6px 0px 0px 0px;
}
#nav-tree {
background-image:url('nav_h.png');
background-repeat:repeat-x;
background-color: #F9FAFC;
-webkit-overflow-scrolling : touch; /* iOS 5+ */
}
#nav-sync {
position:absolute;
top:5px;
right:24px;
z-index:0;
}
#nav-sync img {
opacity:0.3;
}
#nav-sync img:hover {
opacity:0.9;
}
@media print
{
#nav-tree { display: none; }
div.ui-resizable-handle { display: none; position: relative; }
}

View File

@ -0,0 +1,544 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2019 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
var navTreeSubIndices = new Array();
var arrowDown = '&#9660;';
var arrowRight = '&#9658;';
function getData(varName)
{
var i = varName.lastIndexOf('/');
var n = i>=0 ? varName.substring(i+1) : varName;
return eval(n.replace(/\-/g,'_'));
}
function stripPath(uri)
{
return uri.substring(uri.lastIndexOf('/')+1);
}
function stripPath2(uri)
{
var i = uri.lastIndexOf('/');
var s = uri.substring(i+1);
var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
return m ? uri.substring(i-6) : s;
}
function hashValue()
{
return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
}
function hashUrl()
{
return '#'+hashValue();
}
function pathName()
{
return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
}
function localStorageSupported()
{
try {
return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
}
catch(e) {
return false;
}
}
function storeLink(link)
{
if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
window.localStorage.setItem('navpath',link);
}
}
function deleteLink()
{
if (localStorageSupported()) {
window.localStorage.setItem('navpath','');
}
}
function cachedLink()
{
if (localStorageSupported()) {
return window.localStorage.getItem('navpath');
} else {
return '';
}
}
function getScript(scriptName,func,show)
{
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.id = scriptName;
script.type = 'text/javascript';
script.onload = func;
script.src = scriptName+'.js';
head.appendChild(script);
}
function createIndent(o,domNode,node,level)
{
var level=-1;
var n = node;
while (n.parentNode) { level++; n=n.parentNode; }
if (node.childrenData) {
var imgNode = document.createElement("span");
imgNode.className = 'arrow';
imgNode.style.paddingLeft=(16*level).toString()+'px';
imgNode.innerHTML=arrowRight;
node.plus_img = imgNode;
node.expandToggle = document.createElement("a");
node.expandToggle.href = "javascript:void(0)";
node.expandToggle.onclick = function() {
if (node.expanded) {
$(node.getChildrenUL()).slideUp("fast");
node.plus_img.innerHTML=arrowRight;
node.expanded = false;
} else {
expandNode(o, node, false, false);
}
}
node.expandToggle.appendChild(imgNode);
domNode.appendChild(node.expandToggle);
} else {
var span = document.createElement("span");
span.className = 'arrow';
span.style.width = 16*(level+1)+'px';
span.innerHTML = '&#160;';
domNode.appendChild(span);
}
}
var animationInProgress = false;
function gotoAnchor(anchor,aname,updateLocation)
{
var pos, docContent = $('#doc-content');
var ancParent = $(anchor.parent());
if (ancParent.hasClass('memItemLeft') ||
ancParent.hasClass('memtitle') ||
ancParent.hasClass('fieldname') ||
ancParent.hasClass('fieldtype') ||
ancParent.is(':header'))
{
pos = ancParent.position().top;
} else if (anchor.position()) {
pos = anchor.position().top;
}
if (pos) {
var dist = Math.abs(Math.min(
pos-docContent.offset().top,
docContent[0].scrollHeight-
docContent.height()-docContent.scrollTop()));
animationInProgress=true;
docContent.animate({
scrollTop: pos + docContent.scrollTop() - docContent.offset().top
},Math.max(50,Math.min(500,dist)),function(){
if (updateLocation) window.location.href=aname;
animationInProgress=false;
});
}
}
function newNode(o, po, text, link, childrenData, lastNode)
{
var node = new Object();
node.children = Array();
node.childrenData = childrenData;
node.depth = po.depth + 1;
node.relpath = po.relpath;
node.isLast = lastNode;
node.li = document.createElement("li");
po.getChildrenUL().appendChild(node.li);
node.parentNode = po;
node.itemDiv = document.createElement("div");
node.itemDiv.className = "item";
node.labelSpan = document.createElement("span");
node.labelSpan.className = "label";
createIndent(o,node.itemDiv,node,0);
node.itemDiv.appendChild(node.labelSpan);
node.li.appendChild(node.itemDiv);
var a = document.createElement("a");
node.labelSpan.appendChild(a);
node.label = document.createTextNode(text);
node.expanded = false;
a.appendChild(node.label);
if (link) {
var url;
if (link.substring(0,1)=='^') {
url = link.substring(1);
link = url;
} else {
url = node.relpath+link;
}
a.className = stripPath(link.replace('#',':'));
if (link.indexOf('#')!=-1) {
var aname = '#'+link.split('#')[1];
var srcPage = stripPath(pathName());
var targetPage = stripPath(link.split('#')[0]);
a.href = srcPage!=targetPage ? url : "javascript:void(0)";
a.onclick = function(){
storeLink(link);
if (!$(a).parent().parent().hasClass('selected'))
{
$('.item').removeClass('selected');
$('.item').removeAttr('id');
$(a).parent().parent().addClass('selected');
$(a).parent().parent().attr('id','selected');
}
var anchor = $(aname);
gotoAnchor(anchor,aname,true);
};
} else {
a.href = url;
a.onclick = function() { storeLink(link); }
}
} else {
if (childrenData != null)
{
a.className = "nolink";
a.href = "javascript:void(0)";
a.onclick = node.expandToggle.onclick;
}
}
node.childrenUL = null;
node.getChildrenUL = function() {
if (!node.childrenUL) {
node.childrenUL = document.createElement("ul");
node.childrenUL.className = "children_ul";
node.childrenUL.style.display = "none";
node.li.appendChild(node.childrenUL);
}
return node.childrenUL;
};
return node;
}
function showRoot()
{
var headerHeight = $("#top").height();
var footerHeight = $("#nav-path").height();
var windowHeight = $(window).height() - headerHeight - footerHeight;
(function (){ // retry until we can scroll to the selected item
try {
var navtree=$('#nav-tree');
navtree.scrollTo('#selected',100,{offset:-windowHeight/2});
} catch (err) {
setTimeout(arguments.callee, 0);
}
})();
}
function expandNode(o, node, imm, showRoot)
{
if (node.childrenData && !node.expanded) {
if (typeof(node.childrenData)==='string') {
var varName = node.childrenData;
getScript(node.relpath+varName,function(){
node.childrenData = getData(varName);
expandNode(o, node, imm, showRoot);
}, showRoot);
} else {
if (!node.childrenVisited) {
getNode(o, node);
}
$(node.getChildrenUL()).slideDown("fast");
node.plus_img.innerHTML = arrowDown;
node.expanded = true;
}
}
}
function glowEffect(n,duration)
{
n.addClass('glow').delay(duration).queue(function(next){
$(this).removeClass('glow');next();
});
}
function highlightAnchor()
{
var aname = hashUrl();
var anchor = $(aname);
if (anchor.parent().attr('class')=='memItemLeft'){
var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
glowEffect(rows.children(),300); // member without details
} else if (anchor.parent().attr('class')=='fieldname'){
glowEffect(anchor.parent().parent(),1000); // enum value
} else if (anchor.parent().attr('class')=='fieldtype'){
glowEffect(anchor.parent().parent(),1000); // struct field
} else if (anchor.parent().is(":header")) {
glowEffect(anchor.parent(),1000); // section header
} else {
glowEffect(anchor.next(),1000); // normal member
}
}
function selectAndHighlight(hash,n)
{
var a;
if (hash) {
var link=stripPath(pathName())+':'+hash.substring(1);
a=$('.item a[class$="'+link+'"]');
}
if (a && a.length) {
a.parent().parent().addClass('selected');
a.parent().parent().attr('id','selected');
highlightAnchor();
} else if (n) {
$(n.itemDiv).addClass('selected');
$(n.itemDiv).attr('id','selected');
}
if ($('#nav-tree-contents .item:first').hasClass('selected')) {
$('#nav-sync').css('top','30px');
} else {
$('#nav-sync').css('top','5px');
}
showRoot();
}
function showNode(o, node, index, hash)
{
if (node && node.childrenData) {
if (typeof(node.childrenData)==='string') {
var varName = node.childrenData;
getScript(node.relpath+varName,function(){
node.childrenData = getData(varName);
showNode(o,node,index,hash);
},true);
} else {
if (!node.childrenVisited) {
getNode(o, node);
}
$(node.getChildrenUL()).css({'display':'block'});
node.plus_img.innerHTML = arrowDown;
node.expanded = true;
var n = node.children[o.breadcrumbs[index]];
if (index+1<o.breadcrumbs.length) {
showNode(o,n,index+1,hash);
} else {
if (typeof(n.childrenData)==='string') {
var varName = n.childrenData;
getScript(n.relpath+varName,function(){
n.childrenData = getData(varName);
node.expanded=false;
showNode(o,node,index,hash); // retry with child node expanded
},true);
} else {
var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
expandNode(o, n, true, true);
}
selectAndHighlight(hash,n);
}
}
}
} else {
selectAndHighlight(hash);
}
}
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
function getNode(o, po)
{
var insertFunction = removeToInsertLater(po.li);
po.childrenVisited = true;
var l = po.childrenData.length-1;
for (var i in po.childrenData) {
var nodeData = po.childrenData[i];
po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
i==l);
}
insertFunction();
}
function gotoNode(o,subIndex,root,hash,relpath)
{
var nti = navTreeSubIndices[subIndex][root+hash];
o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
navTo(o,NAVTREE[0][1],"",relpath);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
if (o.breadcrumbs) {
o.breadcrumbs.unshift(0); // add 0 for root node
showNode(o, o.node, 0, hash);
}
}
function navTo(o,root,hash,relpath)
{
var link = cachedLink();
if (link) {
var parts = link.split('#');
root = parts[0];
if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
else hash='';
}
if (hash.match(/^#l\d+$/)) {
var anchor=$('a[name='+hash.substring(1)+']');
glowEffect(anchor.parent(),1000); // line number
hash=''; // strip line number anchors
}
var url=root+hash;
var i=-1;
while (NAVTREEINDEX[i+1]<=url) i++;
if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
if (navTreeSubIndices[i]) {
gotoNode(o,i,root,hash,relpath)
} else {
getScript(relpath+'navtreeindex'+i,function(){
navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
if (navTreeSubIndices[i]) {
gotoNode(o,i,root,hash,relpath);
}
},true);
}
}
function showSyncOff(n,relpath)
{
n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
}
function showSyncOn(n,relpath)
{
n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
}
function toggleSyncButton(relpath)
{
var navSync = $('#nav-sync');
if (navSync.hasClass('sync')) {
navSync.removeClass('sync');
showSyncOff(navSync,relpath);
storeLink(stripPath2(pathName())+hashUrl());
} else {
navSync.addClass('sync');
showSyncOn(navSync,relpath);
deleteLink();
}
}
var loadTriggered = false;
var readyTriggered = false;
var loadObject,loadToRoot,loadUrl,loadRelPath;
$(window).on('load',function(){
if (readyTriggered) { // ready first
navTo(loadObject,loadToRoot,loadUrl,loadRelPath);
showRoot();
}
loadTriggered=true;
});
function initNavTree(toroot,relpath)
{
var o = new Object();
o.toroot = toroot;
o.node = new Object();
o.node.li = document.getElementById("nav-tree-contents");
o.node.childrenData = NAVTREE;
o.node.children = new Array();
o.node.childrenUL = document.createElement("ul");
o.node.getChildrenUL = function() { return o.node.childrenUL; };
o.node.li.appendChild(o.node.childrenUL);
o.node.depth = 0;
o.node.relpath = relpath;
o.node.expanded = false;
o.node.isLast = true;
o.node.plus_img = document.createElement("span");
o.node.plus_img.className = 'arrow';
o.node.plus_img.innerHTML = arrowRight;
if (localStorageSupported()) {
var navSync = $('#nav-sync');
if (cachedLink()) {
showSyncOff(navSync,relpath);
navSync.removeClass('sync');
} else {
showSyncOn(navSync,relpath);
}
navSync.click(function(){ toggleSyncButton(relpath); });
}
if (loadTriggered) { // load before ready
navTo(o,toroot,hashUrl(),relpath);
showRoot();
} else { // ready before load
loadObject = o;
loadToRoot = toroot;
loadUrl = hashUrl();
loadRelPath = relpath;
readyTriggered=true;
}
$(window).bind('hashchange', function(){
if (window.location.hash && window.location.hash.length>1){
var a;
if ($(location).attr('hash')){
var clslink=stripPath(pathName())+':'+hashValue();
a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
}
if (a==null || !$(a).parent().parent().hasClass('selected')){
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
var link=stripPath2(pathName());
navTo(o,link,hashUrl(),relpath);
} else if (!animationInProgress) {
$('#doc-content').scrollTop(0);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
navTo(o,toroot,hashUrl(),relpath);
}
})
}
/* @license-end */

View File

@ -0,0 +1,44 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2019 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
var NAVTREE =
[
[ "C++ Library, mos@ua", "index.html", [
[ "Modules", "modules.html", "modules" ],
[ "Files", "files.html", [
[ "File List", "files.html", "files_dup" ],
[ "Globals", "globals.html", [
[ "All", "globals.html", null ],
[ "Functions", "globals_func.html", null ],
[ "Macros", "globals_defs.html", null ]
] ]
] ]
] ]
];
var NAVTREEINDEX =
[
"dbc_8h.html"
];
var SYNCONMSG = 'click to disable panel synchronisation';
var SYNCOFFMSG = 'click to enable panel synchronisation';

View File

@ -0,0 +1,238 @@
var NAVTREEINDEX0 =
{
"dbc_8h.html":[1,0,0],
"dbc_8h_source.html":[1,0,0],
"files.html":[1,0],
"globals.html":[1,1,0],
"globals_defs.html":[1,1,2],
"globals_func.html":[1,1,1],
"group___db_c.html":[0,0],
"group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8":[0,0,2],
"group___db_c.html#ga5bf1825f80465097d4b753a001cf1af8":[1,0,0,1],
"group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf":[0,0,3],
"group___db_c.html#ga5d17c602c4f191371a5fec5af7adc3cf":[1,0,0,2],
"group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221":[0,0,1],
"group___db_c.html#gac101c8ba449f6f8c71b3789a9c489221":[1,0,0,0],
"group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725":[0,0,4],
"group___db_c.html#gaf9d59b04beef1bf139e10fc44c6f9725":[1,0,0,3],
"group__process.html":[0,1],
"group__process.html#ga013466fa89ac97a0db0ccd78168a8456":[0,1,30],
"group__process.html#ga013466fa89ac97a0db0ccd78168a8456":[1,0,1,29],
"group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e":[0,1,23],
"group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e":[1,0,1,22],
"group__process.html#ga04cb3c84545fe7707c63578e1d59b689":[0,1,27],
"group__process.html#ga04cb3c84545fe7707c63578e1d59b689":[1,0,1,26],
"group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480":[1,0,1,8],
"group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480":[0,1,9],
"group__process.html#ga0e2534c82b54573590d913c297cc4840":[1,0,1,12],
"group__process.html#ga0e2534c82b54573590d913c297cc4840":[0,1,13],
"group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f":[1,0,1,17],
"group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f":[0,1,18],
"group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68":[1,0,1,31],
"group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68":[0,1,32],
"group__process.html#ga1682328cd34b592404ff030779b0428f":[1,0,1,9],
"group__process.html#ga1682328cd34b592404ff030779b0428f":[0,1,10],
"group__process.html#ga2d9df322812707050312aa24d15a4360":[1,0,1,30],
"group__process.html#ga2d9df322812707050312aa24d15a4360":[0,1,31],
"group__process.html#ga3119bdf5486059aee6ec3ed65a01b319":[1,0,1,7],
"group__process.html#ga3119bdf5486059aee6ec3ed65a01b319":[0,1,8],
"group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668":[1,0,1,21],
"group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668":[0,1,22],
"group__process.html#ga47891b55ba91af98c5b45cbcf154bc20":[1,0,1,15],
"group__process.html#ga47891b55ba91af98c5b45cbcf154bc20":[0,1,16],
"group__process.html#ga67e00aff1839b1ba68c83947593f625b":[0,1,1],
"group__process.html#ga67e00aff1839b1ba68c83947593f625b":[1,0,1,0],
"group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba":[1,0,1,20],
"group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba":[0,1,21],
"group__process.html#ga7c7f6de68bd3dea8a702668090a65854":[1,0,1,5],
"group__process.html#ga7c7f6de68bd3dea8a702668090a65854":[0,1,6],
"group__process.html#ga82e3d1015521711a2a6374d6c3771491":[0,1,25],
"group__process.html#ga82e3d1015521711a2a6374d6c3771491":[1,0,1,24],
"group__process.html#gaa00610fec639ef123819ceee2ef00da3":[1,0,1,13],
"group__process.html#gaa00610fec639ef123819ceee2ef00da3":[0,1,14],
"group__process.html#gaada159a0fe725ed843ac358be6e6a9d3":[1,0,1,10],
"group__process.html#gaada159a0fe725ed843ac358be6e6a9d3":[0,1,11],
"group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8":[1,0,1,3],
"group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8":[0,1,4],
"group__process.html#gac2b930e9aceda9ef276b21ae8e839c16":[1,0,1,14],
"group__process.html#gac2b930e9aceda9ef276b21ae8e839c16":[0,1,15],
"group__process.html#gac42e869afba098ec9bdd77444ba790c5":[1,0,1,11],
"group__process.html#gac42e869afba098ec9bdd77444ba790c5":[0,1,12],
"group__process.html#gac49ddb266cec5493ebd756cd9382f99d":[0,1,24],
"group__process.html#gac49ddb266cec5493ebd756cd9382f99d":[1,0,1,23],
"group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef":[0,1,28],
"group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef":[1,0,1,27],
"group__process.html#gac926bd7ccd173f742b5d58f51cabcb48":[0,1,3],
"group__process.html#gac926bd7ccd173f742b5d58f51cabcb48":[1,0,1,2],
"group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b":[1,0,1,19],
"group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b":[0,1,20],
"group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1":[0,1,2],
"group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1":[1,0,1,1],
"group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7":[1,0,1,16],
"group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7":[0,1,17],
"group__process.html#gad63921c4ec6f0845b752eb59a8935b8e":[0,1,29],
"group__process.html#gad63921c4ec6f0845b752eb59a8935b8e":[1,0,1,28],
"group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6":[0,1,26],
"group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6":[1,0,1,25],
"group__process.html#gae5d3e8ac00f0e788f21020699bac758a":[1,0,1,4],
"group__process.html#gae5d3e8ac00f0e788f21020699bac758a":[0,1,5],
"group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a":[1,0,1,18],
"group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a":[0,1,19],
"group__process.html#gaff71624be0fc9c76e0c72295721875e6":[1,0,1,6],
"group__process.html#gaff71624be0fc9c76e0c72295721875e6":[0,1,7],
"group__thread.html":[0,2],
"group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5":[0,2,26],
"group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5":[1,0,2,25],
"group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16":[0,2,24],
"group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16":[1,0,2,23],
"group__thread.html#ga1123643838d5174ccd41f52f4169e896":[1,0,2,14],
"group__thread.html#ga1123643838d5174ccd41f52f4169e896":[0,2,15],
"group__thread.html#ga19b16adf05364471bae2840aa564329a":[1,0,2,4],
"group__thread.html#ga19b16adf05364471bae2840aa564329a":[0,2,5],
"group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1":[0,2,35],
"group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1":[1,0,2,34],
"group__thread.html#ga2b2370a45c1518f777493526b2e4f46d":[1,0,2,6],
"group__thread.html#ga2b2370a45c1518f777493526b2e4f46d":[0,2,7],
"group__thread.html#ga3008b033f2830e79179a882a2b74c8ba":[0,2,23],
"group__thread.html#ga3008b033f2830e79179a882a2b74c8ba":[1,0,2,22],
"group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad":[1,0,2,12],
"group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad":[0,2,13],
"group__thread.html#ga3a0f9920a321b54c41c098d3461d3889":[1,0,2,1],
"group__thread.html#ga3a0f9920a321b54c41c098d3461d3889":[0,2,2],
"group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6":[1,0,2,7],
"group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6":[0,2,8],
"group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0":[0,2,30],
"group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0":[1,0,2,29],
"group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b":[1,0,2,16],
"group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b":[0,2,17],
"group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01":[0,2,9],
"group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01":[1,0,2,8],
"group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2":[0,2,27],
"group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2":[1,0,2,26],
"group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4":[1,0,2,2],
"group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4":[0,2,3],
"group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0":[1,0,2,18],
"group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0":[0,2,19],
"group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e":[0,2,22],
"group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e":[1,0,2,21],
"group__thread.html#ga7df1983f57dca40a86a55d215d13d42b":[1,0,2,20],
"group__thread.html#ga7df1983f57dca40a86a55d215d13d42b":[0,2,21],
"group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671":[1,0,2,37],
"group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671":[0,2,38],
"group__thread.html#ga86aa7989874009c886bea9d41700e25c":[1,0,2,5],
"group__thread.html#ga86aa7989874009c886bea9d41700e25c":[0,2,6],
"group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39":[1,0,2,9],
"group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39":[0,2,10],
"group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928":[1,0,2,10],
"group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928":[0,2,11],
"group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2":[1,0,2,15],
"group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2":[0,2,16],
"group__thread.html#ga95235231165ebda870afa10ba5fd6c41":[1,0,2,11],
"group__thread.html#ga95235231165ebda870afa10ba5fd6c41":[0,2,12],
"group__thread.html#ga952c63101c667d247f0923b609710c72":[1,0,2,3],
"group__thread.html#ga952c63101c667d247f0923b609710c72":[0,2,4],
"group__thread.html#ga9624688b577fb653af7a528848cc53d5":[1,0,2,17],
"group__thread.html#ga9624688b577fb653af7a528848cc53d5":[0,2,18],
"group__thread.html#ga98baffe08beec792f3428ae9ddad966e":[0,2,36],
"group__thread.html#ga98baffe08beec792f3428ae9ddad966e":[1,0,2,35],
"group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd":[0,2,25],
"group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd":[1,0,2,24],
"group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4":[0,2,34],
"group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4":[1,0,2,33],
"group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6":[1,0,2,30],
"group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6":[0,2,31],
"group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c":[0,2,37],
"group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c":[1,0,2,36],
"group__thread.html#gab8073c72be896ba9d711d887a5405a74":[0,2,29],
"group__thread.html#gab8073c72be896ba9d711d887a5405a74":[1,0,2,28],
"group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f":[0,2,33],
"group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f":[1,0,2,32],
"group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c":[1,0,2,19],
"group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c":[0,2,20],
"group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80":[1,0,2,13],
"group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80":[0,2,14],
"group__thread.html#gadca8bdcec91b8985370d904591d342b8":[1,0,2,0],
"group__thread.html#gadca8bdcec91b8985370d904591d342b8":[0,2,1],
"group__thread.html#gadf741e1818d53c5b7d71cd68e161b215":[1,0,2,27],
"group__thread.html#gadf741e1818d53c5b7d71cd68e161b215":[0,2,28],
"group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c":[0,2,32],
"group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c":[1,0,2,31],
"group__utils.html":[0,3],
"group__utils.html#ga01d1ea65eb6780d91705484dd46833bf":[1,0,3,5],
"group__utils.html#ga01d1ea65eb6780d91705484dd46833bf":[0,3,6],
"group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c":[0,3,18],
"group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c":[1,0,3,17],
"group__utils.html#ga123e40006d54612c48c2660432dfeb23":[0,3,2],
"group__utils.html#ga123e40006d54612c48c2660432dfeb23":[1,0,3,1],
"group__utils.html#ga15630ddb64e977c8243892556feedfd8":[0,3,17],
"group__utils.html#ga15630ddb64e977c8243892556feedfd8":[1,0,3,16],
"group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559":[0,3,29],
"group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559":[1,0,3,28],
"group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4":[0,3,21],
"group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4":[1,0,3,20],
"group__utils.html#ga22347cbf977a0300726f06257edd79d6":[0,3,1],
"group__utils.html#ga22347cbf977a0300726f06257edd79d6":[1,0,3,0],
"group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9":[1,0,3,4],
"group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9":[0,3,5],
"group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b":[1,0,3,6],
"group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b":[0,3,7],
"group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7":[0,3,26],
"group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7":[1,0,3,25],
"group__utils.html#ga3ec2b60d1636397119c5e0c21987f791":[1,0,3,19],
"group__utils.html#ga3ec2b60d1636397119c5e0c21987f791":[0,3,20],
"group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c":[0,3,31],
"group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c":[1,0,3,30],
"group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1":[0,3,28],
"group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1":[1,0,3,27],
"group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086":[0,3,10],
"group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086":[1,0,3,9],
"group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876":[1,0,3,3],
"group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876":[0,3,4],
"group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5":[0,3,11],
"group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5":[1,0,3,10],
"group__utils.html#ga69037999e65cdb42d39988e0fec48af4":[1,0,3,2],
"group__utils.html#ga69037999e65cdb42d39988e0fec48af4":[0,3,3],
"group__utils.html#ga69373a612a7b4d264371f727217f9954":[0,3,9],
"group__utils.html#ga69373a612a7b4d264371f727217f9954":[1,0,3,8],
"group__utils.html#ga7bffda236a079c26302722c7d155f7a5":[1,0,3,11],
"group__utils.html#ga7bffda236a079c26302722c7d155f7a5":[0,3,12],
"group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e":[0,3,33],
"group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e":[1,0,3,32],
"group__utils.html#ga825354891d287cc86d2b4ed1b600175a":[0,3,16],
"group__utils.html#ga825354891d287cc86d2b4ed1b600175a":[1,0,3,15],
"group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09":[1,0,3,7],
"group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09":[0,3,8],
"group__utils.html#gaa23a827164f7039b9770379cbf008905":[0,3,22],
"group__utils.html#gaa23a827164f7039b9770379cbf008905":[1,0,3,21],
"group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75":[1,0,3,24],
"group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75":[0,3,25],
"group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c":[0,3,32],
"group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c":[1,0,3,31],
"group__utils.html#gab8050db5b87bfdee91ee92e67b063478":[0,3,30],
"group__utils.html#gab8050db5b87bfdee91ee92e67b063478":[1,0,3,29],
"group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f":[1,0,3,22],
"group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f":[0,3,23],
"group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae":[1,0,3,14],
"group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae":[0,3,15],
"group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6":[1,0,3,33],
"group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6":[0,3,34],
"group__utils.html#gad3d324aed0ec686314cb0f68dfde9853":[1,0,3,26],
"group__utils.html#gad3d324aed0ec686314cb0f68dfde9853":[0,3,27],
"group__utils.html#gad643e0fcac9e59c1a171c460633e8637":[0,3,19],
"group__utils.html#gad643e0fcac9e59c1a171c460633e8637":[1,0,3,18],
"group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9":[0,3,24],
"group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9":[1,0,3,23],
"group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052":[0,3,14],
"group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052":[1,0,3,13],
"group__utils.html#gadfa0375f8178c737deae23ffa8d152f4":[1,0,3,12],
"group__utils.html#gadfa0375f8178c737deae23ffa8d152f4":[0,3,13],
"index.html":[],
"modules.html":[0],
"pages.html":[],
"process_8h.html":[1,0,1],
"process_8h_source.html":[1,0,1],
"thread_8h.html":[1,0,2],
"thread_8h_source.html":[1,0,2],
"utils_8h.html":[1,0,3],
"utils_8h_source.html":[1,0,3]
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

View File

@ -0,0 +1,296 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: process.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('process_8h.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">process.h File Reference<div class="ingroups"><a class="el" href="group__process.html">process</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p><a class="el" href="group__process.html#process">Process</a>, <a class="el" href="group__process.html#sysV">System-V</a>, and <a class="el" href="group__process.html#posix_sem">POSIX libraries</a> wrapper module.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;stdio.h&gt;</code><br />
<code>#include &lt;unistd.h&gt;</code><br />
<code>#include &lt;sys/ipc.h&gt;</code><br />
<code>#include &lt;sys/shm.h&gt;</code><br />
<code>#include &lt;sys/sem.h&gt;</code><br />
<code>#include &lt;semaphore.h&gt;</code><br />
<code>#include &lt;signal.h&gt;</code><br />
</div>
<p><a href="process_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td colspan="2"><div class="groupHeader">Process handling</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="process"></a></p>
</div></td></tr>
<tr class="memitem:ga67e00aff1839b1ba68c83947593f625b"><td class="memItemLeft" align="right" valign="top">pid_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">pfork</a> (void)</td></tr>
<tr class="memdesc:ga67e00aff1839b1ba68c83947593f625b"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>fork</code> wrapper function. <a href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">More...</a><br /></td></tr>
<tr class="separator:ga67e00aff1839b1ba68c83947593f625b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad27b81fee9a0f792c4ba29fd95c967e1"><td class="memItemLeft" align="right" valign="top">pid_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">pwait</a> (int *status)</td></tr>
<tr class="memdesc:gad27b81fee9a0f792c4ba29fd95c967e1"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>wait</code> wrapper function. <a href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">More...</a><br /></td></tr>
<tr class="separator:gad27b81fee9a0f792c4ba29fd95c967e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac926bd7ccd173f742b5d58f51cabcb48"><td class="memItemLeft" align="right" valign="top">pid_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">pwaitpid</a> (pid_t pid, int *status, int options)</td></tr>
<tr class="memdesc:gac926bd7ccd173f742b5d58f51cabcb48"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>waitpid</code> wrapper function. <a href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">More...</a><br /></td></tr>
<tr class="separator:gac926bd7ccd173f742b5d58f51cabcb48"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab546ccee89e3159ea7c23aa3a463a0d8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">pkill</a> (pid_t pid, int sig)</td></tr>
<tr class="memdesc:gab546ccee89e3159ea7c23aa3a463a0d8"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>kill</code> wrapper function. <a href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">More...</a><br /></td></tr>
<tr class="separator:gab546ccee89e3159ea7c23aa3a463a0d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae5d3e8ac00f0e788f21020699bac758a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">pexecl</a> (const char *pathname, const char *arg,...)</td></tr>
<tr class="memdesc:gae5d3e8ac00f0e788f21020699bac758a"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>execl</code> wrapper function. <a href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">More...</a><br /></td></tr>
<tr class="separator:gae5d3e8ac00f0e788f21020699bac758a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7c7f6de68bd3dea8a702668090a65854"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">psigaction</a> (int signum, const struct sigaction *act, struct sigaction *oldact)</td></tr>
<tr class="memdesc:ga7c7f6de68bd3dea8a702668090a65854"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sigaction</code> wrapper function. <a href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">More...</a><br /></td></tr>
<tr class="separator:ga7c7f6de68bd3dea8a702668090a65854"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">System V - shared memory</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="shm"></a> </p><dl class="section user"><dt>Example</dt><dd><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="process_8h.html">process.h</a>&gt;</span> <span class="comment">// #include &lt;sys/shm.h&gt;</span></div>
<div class="line">...</div>
<div class="line">int shmid;</div>
<div class="line"><span class="comment">// creation:</span></div>
<div class="line">shmid = <a class="code" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a>(key, size, 0600 | IPC_CREAT | IPC_EXCL);</div>
<div class="line"><span class="comment">// or, use existing:</span></div>
<div class="line">shmid = <a class="code" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a>(key, 0, 0);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// attach shm to pointer address:</span></div>
<div class="line">void* p = <a class="code" href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">pshmat</a>(shmid, NULL, 0);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// detach shm from pointer address:</span></div>
<div class="line">pshmdt(p);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// destroy shm:</span></div>
<div class="line">pshmctl(shmid, IPC_RMID, NULL);</div>
</div><!-- fragment --> </dd></dl>
</div></td></tr>
<tr class="memitem:gaff71624be0fc9c76e0c72295721875e6"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a> (key_t key, size_t size, int shmflg)</td></tr>
<tr class="memdesc:gaff71624be0fc9c76e0c72295721875e6"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>shmget</code> wrapper function. <a href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">More...</a><br /></td></tr>
<tr class="separator:gaff71624be0fc9c76e0c72295721875e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3119bdf5486059aee6ec3ed65a01b319"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">pshmctl</a> (int shmid, int cmd, struct shmid_ds *buf)</td></tr>
<tr class="memdesc:ga3119bdf5486059aee6ec3ed65a01b319"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>shmctl</code> wrapper function. <a href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">More...</a><br /></td></tr>
<tr class="separator:ga3119bdf5486059aee6ec3ed65a01b319"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0cdba7faa458e7fb57c31d3cd8788480"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">pshmat</a> (int shmid, const void *shmaddr, int shmflg)</td></tr>
<tr class="memdesc:ga0cdba7faa458e7fb57c31d3cd8788480"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>shmat</code> wrapper function. <a href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">More...</a><br /></td></tr>
<tr class="separator:ga0cdba7faa458e7fb57c31d3cd8788480"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1682328cd34b592404ff030779b0428f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga1682328cd34b592404ff030779b0428f">pshmdt</a> (const void *shmaddr)</td></tr>
<tr class="memdesc:ga1682328cd34b592404ff030779b0428f"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>shmdt</code> wrapper function. <a href="group__process.html#ga1682328cd34b592404ff030779b0428f">More...</a><br /></td></tr>
<tr class="separator:ga1682328cd34b592404ff030779b0428f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">System V - semaphores</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="sem"></a> </p><dl class="section user"><dt>Example</dt><dd><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="process_8h.html">process.h</a>&gt;</span> <span class="comment">// #include &lt;sys/sem.h&gt;</span></div>
<div class="line">...</div>
<div class="line">int semid;</div>
<div class="line"><span class="comment">// creation:</span></div>
<div class="line">semid = <a class="code" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a>(key, 1, 0600 | IPC_CREAT | IPC_EXCL); <span class="comment">// 1 semaphore!</span></div>
<div class="line"><span class="comment">// or, use existing:</span></div>
<div class="line">semid = <a class="code" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a>(key, 0, 0);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// decrement:</span></div>
<div class="line">struct sembuf down = {0, -1, 0};</div>
<div class="line"><a class="code" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a>(semid, &amp;down, 1);</div>
<div class="line"><span class="comment">// or, simply use provided function:</span></div>
<div class="line"><a class="code" href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">psem_down</a>(semid, 0); <span class="comment">// NOTE: there is no sem_down in default library!</span></div>
<div class="line">...</div>
<div class="line"><span class="comment">// increment:</span></div>
<div class="line">struct sembuf up = {0, 1, 0};</div>
<div class="line"><a class="code" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a>(semid, &amp;up, 1);</div>
<div class="line"><span class="comment">// or, simply use provided function:</span></div>
<div class="line"><a class="code" href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">psem_up</a>(semid, 0); <span class="comment">// NOTE: there is no sem_up in default library!</span></div>
<div class="line">...</div>
<div class="line"><span class="comment">// destroy sem 0:</span></div>
<div class="line">psemctl(semid, 0, IPC_RMID, NULL);</div>
</div><!-- fragment --> </dd></dl>
</div></td></tr>
<tr class="memitem:gaada159a0fe725ed843ac358be6e6a9d3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a> (key_t key, int nsems, int semflg)</td></tr>
<tr class="memdesc:gaada159a0fe725ed843ac358be6e6a9d3"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>semget</code> wrapper function. <a href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">More...</a><br /></td></tr>
<tr class="separator:gaada159a0fe725ed843ac358be6e6a9d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac42e869afba098ec9bdd77444ba790c5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">psemctl</a> (int semid, int semnum, int cmd)</td></tr>
<tr class="memdesc:gac42e869afba098ec9bdd77444ba790c5"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>semctl</code> wrapper function. <a href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">More...</a><br /></td></tr>
<tr class="separator:gac42e869afba098ec9bdd77444ba790c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga808dab47116976fc7866c97b6dddec47"><td class="memItemLeft" align="right" valign="top">
int&#160;</td><td class="memItemRight" valign="bottom"><b>psemctl</b> (int semid, int semnum, int cmd, void *u)</td></tr>
<tr class="separator:ga808dab47116976fc7866c97b6dddec47"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0e2534c82b54573590d913c297cc4840"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a> (int semid, struct sembuf *sops, size_t nsops)</td></tr>
<tr class="memdesc:ga0e2534c82b54573590d913c297cc4840"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>semop</code> wrapper function. <a href="group__process.html#ga0e2534c82b54573590d913c297cc4840">More...</a><br /></td></tr>
<tr class="separator:ga0e2534c82b54573590d913c297cc4840"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa00610fec639ef123819ceee2ef00da3"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">psem_up</a> (int semid, short unsigned int index)</td></tr>
<tr class="memdesc:gaa00610fec639ef123819ceee2ef00da3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Increment a semaphore (uses <a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840" title="semop wrapper function.">psemop()</a>). <br /></td></tr>
<tr class="separator:gaa00610fec639ef123819ceee2ef00da3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac2b930e9aceda9ef276b21ae8e839c16"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">psem_down</a> (int semid, short unsigned int index)</td></tr>
<tr class="memdesc:gac2b930e9aceda9ef276b21ae8e839c16"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decrements a semaphore (uses <a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840" title="semop wrapper function.">psemop()</a>). <br /></td></tr>
<tr class="separator:gac2b930e9aceda9ef276b21ae8e839c16"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga47891b55ba91af98c5b45cbcf154bc20"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga47891b55ba91af98c5b45cbcf154bc20">psem_down2</a> (int semid, short unsigned int index1, unsigned int index2)</td></tr>
<tr class="memdesc:ga47891b55ba91af98c5b45cbcf154bc20"><td class="mdescLeft">&#160;</td><td class="mdescRight">Decrements atomically two semaphores in a System V semaphore array (uses <a class="el" href="group__process.html#ga0e2534c82b54573590d913c297cc4840" title="semop wrapper function.">psemop()</a>). <br /></td></tr>
<tr class="separator:ga47891b55ba91af98c5b45cbcf154bc20"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">System V - message queues</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="msg"></a> </p><dl class="section user"><dt>Example</dt><dd><div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="process_8h.html">process.h</a>&gt;</span> <span class="comment">// #include &lt;sys/msg.h&gt;</span></div>
<div class="line">...</div>
<div class="line">typedef <span class="keyword">struct </span>Item</div>
<div class="line">{</div>
<div class="line"> ...</div>
<div class="line">} Item;</div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>Message</div>
<div class="line">{</div>
<div class="line"> <span class="keywordtype">long</span> type;</div>
<div class="line"> Item item;</div>
<div class="line">} Message;</div>
<div class="line">...</div>
<div class="line">int msgid;</div>
<div class="line"><span class="comment">// creation:</span></div>
<div class="line">msgid = <a class="code" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a>(key, 0600 | IPC_CREAT | IPC_EXCL);</div>
<div class="line"><span class="comment">// or, use existing:</span></div>
<div class="line">msgid = <a class="code" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a>(key, 0);</div>
<div class="line">...</div>
<div class="line">Message msg;</div>
<div class="line"><span class="comment">// send msg:</span></div>
<div class="line">msg = ...;</div>
<div class="line"><a class="code" href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">pmsgsnd</a>(msgid, &amp;msg, <span class="keyword">sizeof</span>(Item), 0);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// receive msg:</span></div>
<div class="line">pmsgrcv(msgid, &amp;msg, <span class="keyword">sizeof</span>(Item), type, 0);</div>
<div class="line">...</div>
<div class="line"><span class="comment">// destroy msg:</span></div>
<div class="line">pmsgctl(msgid, IPC_RMID, NULL);</div>
</div><!-- fragment --> </dd></dl>
</div></td></tr>
<tr class="memitem:gad426e03bc9b8dae5f1fbf889ce2dd8f7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a> (key_t key, int msgflg)</td></tr>
<tr class="memdesc:gad426e03bc9b8dae5f1fbf889ce2dd8f7"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>msgget</code> wrapper function. <a href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">More...</a><br /></td></tr>
<tr class="separator:gad426e03bc9b8dae5f1fbf889ce2dd8f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga13bfac41329ec74b2aa4950f9586ae9f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">pmsgctl</a> (int msqid, int cmd, struct msqid_ds *buf)</td></tr>
<tr class="memdesc:ga13bfac41329ec74b2aa4950f9586ae9f"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>msgctl</code> wrapper function. <a href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">More...</a><br /></td></tr>
<tr class="separator:ga13bfac41329ec74b2aa4950f9586ae9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaeeb6cd0ab585a7769cd17405f600e56a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">pmsgsnd</a> (int msqid, const void *msgp, size_t msgsz, int msgflg)</td></tr>
<tr class="memdesc:gaeeb6cd0ab585a7769cd17405f600e56a"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>msgsnd</code> wrapper function. <a href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">More...</a><br /></td></tr>
<tr class="separator:gaeeb6cd0ab585a7769cd17405f600e56a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gacd4e4161a46bfa2e1f23eb1d49aaa07b"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">pmsgrcv</a> (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)</td></tr>
<tr class="memdesc:gacd4e4161a46bfa2e1f23eb1d49aaa07b"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>msgrcv</code> wrapper function. <a href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">More...</a><br /></td></tr>
<tr class="separator:gacd4e4161a46bfa2e1f23eb1d49aaa07b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">POSIX semaphores</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="posix_sem"></a></p>
</div></td></tr>
<tr class="memitem:ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba"><td class="memItemLeft" align="right" valign="top">sem_t *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">psem_open</a> (const char *name, int oflag)</td></tr>
<tr class="memdesc:ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_open</code> wrapper function. <a href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">More...</a><br /></td></tr>
<tr class="separator:ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabfb2ccd43b219304d77429977a3fb70b"><td class="memItemLeft" align="right" valign="top">
sem_t *&#160;</td><td class="memItemRight" valign="bottom"><b>psem_open</b> (const char *name, int oflag, mode_t mode, unsigned int value)</td></tr>
<tr class="separator:gabfb2ccd43b219304d77429977a3fb70b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga41a884c3a9d9ac6a31fc6ab27ae1d668"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">psem_close</a> (sem_t *sem)</td></tr>
<tr class="memdesc:ga41a884c3a9d9ac6a31fc6ab27ae1d668"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_close</code> wrapper function. <a href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">More...</a><br /></td></tr>
<tr class="separator:ga41a884c3a9d9ac6a31fc6ab27ae1d668"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0415c9c4fab4baafef6cd2d40becd05e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">psem_unlink</a> (const char *name)</td></tr>
<tr class="memdesc:ga0415c9c4fab4baafef6cd2d40becd05e"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_unlink</code> wrapper function. <a href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">More...</a><br /></td></tr>
<tr class="separator:ga0415c9c4fab4baafef6cd2d40becd05e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac49ddb266cec5493ebd756cd9382f99d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">psem_init</a> (sem_t *sem, int pshared, unsigned int value)</td></tr>
<tr class="memdesc:gac49ddb266cec5493ebd756cd9382f99d"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_init</code> wrapper function. <a href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">More...</a><br /></td></tr>
<tr class="separator:gac49ddb266cec5493ebd756cd9382f99d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga82e3d1015521711a2a6374d6c3771491"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">psem_destroy</a> (sem_t *sem)</td></tr>
<tr class="memdesc:ga82e3d1015521711a2a6374d6c3771491"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_destroy</code> wrapper function. <a href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">More...</a><br /></td></tr>
<tr class="separator:ga82e3d1015521711a2a6374d6c3771491"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae2c867f9f66e74fad44df3f32f87a8c6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">psem_wait</a> (sem_t *sem)</td></tr>
<tr class="memdesc:gae2c867f9f66e74fad44df3f32f87a8c6"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_wait</code> wrapper function. <a href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">More...</a><br /></td></tr>
<tr class="separator:gae2c867f9f66e74fad44df3f32f87a8c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga04cb3c84545fe7707c63578e1d59b689"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">psem_trywait</a> (sem_t *sem)</td></tr>
<tr class="memdesc:ga04cb3c84545fe7707c63578e1d59b689"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_trywait</code> wrapper function. <a href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">More...</a><br /></td></tr>
<tr class="separator:ga04cb3c84545fe7707c63578e1d59b689"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac8b2b3d1e18b385f10b389ce2ea734ef"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">psem_timedwait</a> (sem_t *sem, const struct timespec *abs_timeout)</td></tr>
<tr class="memdesc:gac8b2b3d1e18b385f10b389ce2ea734ef"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_timedwait</code> wrapper function. <a href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">More...</a><br /></td></tr>
<tr class="separator:gac8b2b3d1e18b385f10b389ce2ea734ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad63921c4ec6f0845b752eb59a8935b8e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">psem_post</a> (sem_t *sem)</td></tr>
<tr class="memdesc:gad63921c4ec6f0845b752eb59a8935b8e"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sem_post</code> wrapper function. <a href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">More...</a><br /></td></tr>
<tr class="separator:gad63921c4ec6f0845b752eb59a8935b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">UNIX pipes</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="pipes"></a></p>
</div></td></tr>
<tr class="memitem:ga013466fa89ac97a0db0ccd78168a8456"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">ppipe</a> (int pipefd[2])</td></tr>
<tr class="memdesc:ga013466fa89ac97a0db0ccd78168a8456"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pipe</code> wrapper function. <a href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">More...</a><br /></td></tr>
<tr class="separator:ga013466fa89ac97a0db0ccd78168a8456"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga2d9df322812707050312aa24d15a4360"><td class="memItemLeft" align="right" valign="top">FILE *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga2d9df322812707050312aa24d15a4360">ppopen</a> (const char *command, const char *type)</td></tr>
<tr class="memdesc:ga2d9df322812707050312aa24d15a4360"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>popen</code> wrapper function. <a href="group__process.html#ga2d9df322812707050312aa24d15a4360">More...</a><br /></td></tr>
<tr class="separator:ga2d9df322812707050312aa24d15a4360"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1490f6e0ca0ebf607d1f5ff431c79b68"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">ppclose</a> (FILE *stream)</td></tr>
<tr class="memdesc:ga1490f6e0ca0ebf607d1f5ff431c79b68"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pclose</code> wrapper function. <a href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">More...</a><br /></td></tr>
<tr class="separator:ga1490f6e0ca0ebf607d1f5ff431c79b68"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p><a class="el" href="group__process.html#process">Process</a>, <a class="el" href="group__process.html#sysV">System-V</a>, and <a class="el" href="group__process.html#posix_sem">POSIX libraries</a> wrapper module. </p>
<dl class="section remark"><dt>Remarks</dt><dd>Removes defensive programming from native libraries </dd></dl>
</div></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="agroup__process_html_ga0cdba7faa458e7fb57c31d3cd8788480"><div class="ttname"><a href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">pshmat</a></div><div class="ttdeci">void * pshmat(int shmid, const void *shmaddr, int shmflg)</div><div class="ttdoc">shmat wrapper function.</div></div>
<div class="ttc" id="aprocess_8h_html"><div class="ttname"><a href="process_8h.html">process.h</a></div><div class="ttdoc">Process, System-V, and POSIX libraries wrapper module.</div></div>
<div class="ttc" id="agroup__process_html_gaada159a0fe725ed843ac358be6e6a9d3"><div class="ttname"><a href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a></div><div class="ttdeci">int psemget(key_t key, int nsems, int semflg)</div><div class="ttdoc">semget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaff71624be0fc9c76e0c72295721875e6"><div class="ttname"><a href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a></div><div class="ttdeci">int pshmget(key_t key, size_t size, int shmflg)</div><div class="ttdoc">shmget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaeeb6cd0ab585a7769cd17405f600e56a"><div class="ttname"><a href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">pmsgsnd</a></div><div class="ttdeci">void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)</div><div class="ttdoc">msgsnd wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gad426e03bc9b8dae5f1fbf889ce2dd8f7"><div class="ttname"><a href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a></div><div class="ttdeci">int pmsgget(key_t key, int msgflg)</div><div class="ttdoc">msgget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gac2b930e9aceda9ef276b21ae8e839c16"><div class="ttname"><a href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">psem_down</a></div><div class="ttdeci">void psem_down(int semid, short unsigned int index)</div><div class="ttdoc">Decrements a semaphore (uses psemop()).</div></div>
<div class="ttc" id="agroup__process_html_gaa00610fec639ef123819ceee2ef00da3"><div class="ttname"><a href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">psem_up</a></div><div class="ttdeci">void psem_up(int semid, short unsigned int index)</div><div class="ttdoc">Increment a semaphore (uses psemop()).</div></div>
<div class="ttc" id="agroup__process_html_ga0e2534c82b54573590d913c297cc4840"><div class="ttname"><a href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a></div><div class="ttdeci">void psemop(int semid, struct sembuf *sops, size_t nsops)</div><div class="ttdoc">semop wrapper function.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="process_8h.html">process.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,35 @@
var process_8h =
[
[ "pfork", "group__process.html#ga67e00aff1839b1ba68c83947593f625b", null ],
[ "pwait", "group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1", null ],
[ "pwaitpid", "group__process.html#gac926bd7ccd173f742b5d58f51cabcb48", null ],
[ "pkill", "group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8", null ],
[ "pexecl", "group__process.html#gae5d3e8ac00f0e788f21020699bac758a", null ],
[ "psigaction", "group__process.html#ga7c7f6de68bd3dea8a702668090a65854", null ],
[ "pshmget", "group__process.html#gaff71624be0fc9c76e0c72295721875e6", null ],
[ "pshmctl", "group__process.html#ga3119bdf5486059aee6ec3ed65a01b319", null ],
[ "pshmat", "group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480", null ],
[ "pshmdt", "group__process.html#ga1682328cd34b592404ff030779b0428f", null ],
[ "psemget", "group__process.html#gaada159a0fe725ed843ac358be6e6a9d3", null ],
[ "psemctl", "group__process.html#gac42e869afba098ec9bdd77444ba790c5", null ],
[ "psemop", "group__process.html#ga0e2534c82b54573590d913c297cc4840", null ],
[ "psem_up", "group__process.html#gaa00610fec639ef123819ceee2ef00da3", null ],
[ "psem_down", "group__process.html#gac2b930e9aceda9ef276b21ae8e839c16", null ],
[ "psem_down2", "group__process.html#ga47891b55ba91af98c5b45cbcf154bc20", null ],
[ "pmsgget", "group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7", null ],
[ "pmsgctl", "group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f", null ],
[ "pmsgsnd", "group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a", null ],
[ "pmsgrcv", "group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b", null ],
[ "psem_open", "group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba", null ],
[ "psem_close", "group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668", null ],
[ "psem_unlink", "group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e", null ],
[ "psem_init", "group__process.html#gac49ddb266cec5493ebd756cd9382f99d", null ],
[ "psem_destroy", "group__process.html#ga82e3d1015521711a2a6374d6c3771491", null ],
[ "psem_wait", "group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6", null ],
[ "psem_trywait", "group__process.html#ga04cb3c84545fe7707c63578e1d59b689", null ],
[ "psem_timedwait", "group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef", null ],
[ "psem_post", "group__process.html#gad63921c4ec6f0845b752eb59a8935b8e", null ],
[ "ppipe", "group__process.html#ga013466fa89ac97a0db0ccd78168a8456", null ],
[ "ppopen", "group__process.html#ga2d9df322812707050312aa24d15a4360", null ],
[ "ppclose", "group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68", null ]
];

View File

@ -0,0 +1,201 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: process.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('process_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">process.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="process_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="preprocessor">#ifndef PROCESS_H</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="preprocessor">#define PROCESS_H</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="preprocessor">#include &lt;sys/ipc.h&gt;</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="preprocessor">#include &lt;sys/shm.h&gt;</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="preprocessor">#include &lt;sys/sem.h&gt;</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor">#include &lt;semaphore.h&gt;</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor">#include &lt;signal.h&gt;</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; </div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">//#define EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="comment">//#define EXIT_POLICY // DEFAULT</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;pid_t <a class="code" href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">pfork</a>(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;pid_t <a class="code" href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">pwait</a>(<span class="keywordtype">int</span> *status);</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;pid_t <a class="code" href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">pwaitpid</a>(pid_t pid, <span class="keywordtype">int</span> *status, <span class="keywordtype">int</span> options);</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">pkill</a>(pid_t pid, <span class="keywordtype">int</span> sig);</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">pexecl</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *pathname, <span class="keyword">const</span> <span class="keywordtype">char</span> *arg, ... <span class="comment">/* (char *) NULL */</span>);</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">psigaction</a>(<span class="keywordtype">int</span> signum, <span class="keyword">const</span> <span class="keyword">struct</span> sigaction *act, <span class="keyword">struct</span> sigaction *oldact);</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a>(key_t key, <span class="keywordtype">size_t</span> size, <span class="keywordtype">int</span> shmflg);</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">pshmctl</a>(<span class="keywordtype">int</span> shmid, <span class="keywordtype">int</span> cmd, <span class="keyword">struct</span> shmid_ds *buf);</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; </div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">pshmat</a>(<span class="keywordtype">int</span> shmid, <span class="keyword">const</span> <span class="keywordtype">void</span> *shmaddr, <span class="keywordtype">int</span> shmflg);</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga1682328cd34b592404ff030779b0428f">pshmdt</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *shmaddr);</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; </div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a>(key_t key, <span class="keywordtype">int</span> nsems, <span class="keywordtype">int</span> semflg);</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">psemctl</a>(<span class="keywordtype">int</span> semid, <span class="keywordtype">int</span> semnum, <span class="keywordtype">int</span> cmd);</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">psemctl</a>(<span class="keywordtype">int</span> semid, <span class="keywordtype">int</span> semnum, <span class="keywordtype">int</span> cmd, <span class="keywordtype">void</span> *u);</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; </div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a>(<span class="keywordtype">int</span> semid, <span class="keyword">struct</span> sembuf *sops, <span class="keywordtype">size_t</span> nsops);</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; </div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">psem_up</a>(<span class="keywordtype">int</span> semid, <span class="keywordtype">short</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index);</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">psem_down</a>(<span class="keywordtype">int</span> semid, <span class="keywordtype">short</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index);</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; </div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga47891b55ba91af98c5b45cbcf154bc20">psem_down2</a>(<span class="keywordtype">int</span> semid, <span class="keywordtype">short</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index2);</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; </div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a>(key_t key, <span class="keywordtype">int</span> msgflg);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; </div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">pmsgctl</a>(<span class="keywordtype">int</span> msqid, <span class="keywordtype">int</span> cmd, <span class="keyword">struct</span> msqid_ds *buf);</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; </div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">pmsgsnd</a>(<span class="keywordtype">int</span> msqid, <span class="keyword">const</span> <span class="keywordtype">void</span> *msgp, <span class="keywordtype">size_t</span> msgsz, <span class="keywordtype">int</span> msgflg);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; </div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">pmsgrcv</a>(<span class="keywordtype">int</span> msqid, <span class="keywordtype">void</span> *msgp, <span class="keywordtype">size_t</span> msgsz, <span class="keywordtype">long</span> msgtyp, <span class="keywordtype">int</span> msgflg);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; </div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;<span class="comment">// named:</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;<span class="comment"></span>sem_t *<a class="code" href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">psem_open</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> oflag);</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;sem_t *<a class="code" href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">psem_open</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> oflag, mode_t mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> value);</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; </div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">psem_close</a>(sem_t *sem);</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; </div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">psem_unlink</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name);</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; </div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160;<span class="comment">// unnamed:</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160;<span class="comment"></span><span class="keywordtype">void</span> <a class="code" href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">psem_init</a>(sem_t *sem, <span class="keywordtype">int</span> pshared, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> value);</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">psem_destroy</a>(sem_t *sem);</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; </div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;<span class="comment">// named and unnamed:</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;<span class="comment"></span><span class="keywordtype">void</span> <a class="code" href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">psem_wait</a>(sem_t *sem);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; </div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">psem_trywait</a>(sem_t *sem);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">psem_timedwait</a>(sem_t *sem, <span class="keyword">const</span> <span class="keyword">struct</span> timespec *abs_timeout);</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; </div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">psem_post</a>(sem_t *sem);</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; </div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">ppipe</a>(<span class="keywordtype">int</span> pipefd[2]);</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;FILE *<a class="code" href="group__process.html#ga2d9df322812707050312aa24d15a4360">ppopen</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *command, <span class="keyword">const</span> <span class="keywordtype">char</span> *type);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; </div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">ppclose</a>(FILE *stream);</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; </div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; </div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="agroup__process_html_gac8b2b3d1e18b385f10b389ce2ea734ef"><div class="ttname"><a href="group__process.html#gac8b2b3d1e18b385f10b389ce2ea734ef">psem_timedwait</a></div><div class="ttdeci">int psem_timedwait(sem_t *sem, const struct timespec *abs_timeout)</div><div class="ttdoc">sem_timedwait wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gab546ccee89e3159ea7c23aa3a463a0d8"><div class="ttname"><a href="group__process.html#gab546ccee89e3159ea7c23aa3a463a0d8">pkill</a></div><div class="ttdeci">void pkill(pid_t pid, int sig)</div><div class="ttdoc">kill wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gac49ddb266cec5493ebd756cd9382f99d"><div class="ttname"><a href="group__process.html#gac49ddb266cec5493ebd756cd9382f99d">psem_init</a></div><div class="ttdeci">void psem_init(sem_t *sem, int pshared, unsigned int value)</div><div class="ttdoc">sem_init wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga47891b55ba91af98c5b45cbcf154bc20"><div class="ttname"><a href="group__process.html#ga47891b55ba91af98c5b45cbcf154bc20">psem_down2</a></div><div class="ttdeci">void psem_down2(int semid, short unsigned int index1, unsigned int index2)</div><div class="ttdoc">Decrements atomically two semaphores in a System V semaphore array (uses psemop()).</div></div>
<div class="ttc" id="agroup__process_html_ga04cb3c84545fe7707c63578e1d59b689"><div class="ttname"><a href="group__process.html#ga04cb3c84545fe7707c63578e1d59b689">psem_trywait</a></div><div class="ttdeci">int psem_trywait(sem_t *sem)</div><div class="ttdoc">sem_trywait wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gac42e869afba098ec9bdd77444ba790c5"><div class="ttname"><a href="group__process.html#gac42e869afba098ec9bdd77444ba790c5">psemctl</a></div><div class="ttdeci">int psemctl(int semid, int semnum, int cmd)</div><div class="ttdoc">semctl wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gae2c867f9f66e74fad44df3f32f87a8c6"><div class="ttname"><a href="group__process.html#gae2c867f9f66e74fad44df3f32f87a8c6">psem_wait</a></div><div class="ttdeci">void psem_wait(sem_t *sem)</div><div class="ttdoc">sem_wait wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga0415c9c4fab4baafef6cd2d40becd05e"><div class="ttname"><a href="group__process.html#ga0415c9c4fab4baafef6cd2d40becd05e">psem_unlink</a></div><div class="ttdeci">void psem_unlink(const char *name)</div><div class="ttdoc">sem_unlink wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga0cdba7faa458e7fb57c31d3cd8788480"><div class="ttname"><a href="group__process.html#ga0cdba7faa458e7fb57c31d3cd8788480">pshmat</a></div><div class="ttdeci">void * pshmat(int shmid, const void *shmaddr, int shmflg)</div><div class="ttdoc">shmat wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga1490f6e0ca0ebf607d1f5ff431c79b68"><div class="ttname"><a href="group__process.html#ga1490f6e0ca0ebf607d1f5ff431c79b68">ppclose</a></div><div class="ttdeci">void ppclose(FILE *stream)</div><div class="ttdoc">pclose wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaada159a0fe725ed843ac358be6e6a9d3"><div class="ttname"><a href="group__process.html#gaada159a0fe725ed843ac358be6e6a9d3">psemget</a></div><div class="ttdeci">int psemget(key_t key, int nsems, int semflg)</div><div class="ttdoc">semget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga82e3d1015521711a2a6374d6c3771491"><div class="ttname"><a href="group__process.html#ga82e3d1015521711a2a6374d6c3771491">psem_destroy</a></div><div class="ttdeci">void psem_destroy(sem_t *sem)</div><div class="ttdoc">sem_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga013466fa89ac97a0db0ccd78168a8456"><div class="ttname"><a href="group__process.html#ga013466fa89ac97a0db0ccd78168a8456">ppipe</a></div><div class="ttdeci">void ppipe(int pipefd[2])</div><div class="ttdoc">pipe wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba"><div class="ttname"><a href="group__process.html#ga7bf7fce2d1f344e7dfeeb1b46a9ee7ba">psem_open</a></div><div class="ttdeci">sem_t * psem_open(const char *name, int oflag)</div><div class="ttdoc">sem_open wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gae5d3e8ac00f0e788f21020699bac758a"><div class="ttname"><a href="group__process.html#gae5d3e8ac00f0e788f21020699bac758a">pexecl</a></div><div class="ttdeci">void pexecl(const char *pathname, const char *arg,...)</div><div class="ttdoc">execl wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga67e00aff1839b1ba68c83947593f625b"><div class="ttname"><a href="group__process.html#ga67e00aff1839b1ba68c83947593f625b">pfork</a></div><div class="ttdeci">pid_t pfork(void)</div><div class="ttdoc">fork wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga2d9df322812707050312aa24d15a4360"><div class="ttname"><a href="group__process.html#ga2d9df322812707050312aa24d15a4360">ppopen</a></div><div class="ttdeci">FILE * ppopen(const char *command, const char *type)</div><div class="ttdoc">popen wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gad63921c4ec6f0845b752eb59a8935b8e"><div class="ttname"><a href="group__process.html#gad63921c4ec6f0845b752eb59a8935b8e">psem_post</a></div><div class="ttdeci">void psem_post(sem_t *sem)</div><div class="ttdoc">sem_post wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaff71624be0fc9c76e0c72295721875e6"><div class="ttname"><a href="group__process.html#gaff71624be0fc9c76e0c72295721875e6">pshmget</a></div><div class="ttdeci">int pshmget(key_t key, size_t size, int shmflg)</div><div class="ttdoc">shmget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gac926bd7ccd173f742b5d58f51cabcb48"><div class="ttname"><a href="group__process.html#gac926bd7ccd173f742b5d58f51cabcb48">pwaitpid</a></div><div class="ttdeci">pid_t pwaitpid(pid_t pid, int *status, int options)</div><div class="ttdoc">waitpid wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaeeb6cd0ab585a7769cd17405f600e56a"><div class="ttname"><a href="group__process.html#gaeeb6cd0ab585a7769cd17405f600e56a">pmsgsnd</a></div><div class="ttdeci">void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)</div><div class="ttdoc">msgsnd wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gad426e03bc9b8dae5f1fbf889ce2dd8f7"><div class="ttname"><a href="group__process.html#gad426e03bc9b8dae5f1fbf889ce2dd8f7">pmsgget</a></div><div class="ttdeci">int pmsgget(key_t key, int msgflg)</div><div class="ttdoc">msgget wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gac2b930e9aceda9ef276b21ae8e839c16"><div class="ttname"><a href="group__process.html#gac2b930e9aceda9ef276b21ae8e839c16">psem_down</a></div><div class="ttdeci">void psem_down(int semid, short unsigned int index)</div><div class="ttdoc">Decrements a semaphore (uses psemop()).</div></div>
<div class="ttc" id="agroup__process_html_ga3119bdf5486059aee6ec3ed65a01b319"><div class="ttname"><a href="group__process.html#ga3119bdf5486059aee6ec3ed65a01b319">pshmctl</a></div><div class="ttdeci">int pshmctl(int shmid, int cmd, struct shmid_ds *buf)</div><div class="ttdoc">shmctl wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga1682328cd34b592404ff030779b0428f"><div class="ttname"><a href="group__process.html#ga1682328cd34b592404ff030779b0428f">pshmdt</a></div><div class="ttdeci">void pshmdt(const void *shmaddr)</div><div class="ttdoc">shmdt wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga41a884c3a9d9ac6a31fc6ab27ae1d668"><div class="ttname"><a href="group__process.html#ga41a884c3a9d9ac6a31fc6ab27ae1d668">psem_close</a></div><div class="ttdeci">void psem_close(sem_t *sem)</div><div class="ttdoc">sem_close wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga7c7f6de68bd3dea8a702668090a65854"><div class="ttname"><a href="group__process.html#ga7c7f6de68bd3dea8a702668090a65854">psigaction</a></div><div class="ttdeci">void psigaction(int signum, const struct sigaction *act, struct sigaction *oldact)</div><div class="ttdoc">sigaction wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gacd4e4161a46bfa2e1f23eb1d49aaa07b"><div class="ttname"><a href="group__process.html#gacd4e4161a46bfa2e1f23eb1d49aaa07b">pmsgrcv</a></div><div class="ttdeci">size_t pmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)</div><div class="ttdoc">msgrcv wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gaa00610fec639ef123819ceee2ef00da3"><div class="ttname"><a href="group__process.html#gaa00610fec639ef123819ceee2ef00da3">psem_up</a></div><div class="ttdeci">void psem_up(int semid, short unsigned int index)</div><div class="ttdoc">Increment a semaphore (uses psemop()).</div></div>
<div class="ttc" id="agroup__process_html_ga13bfac41329ec74b2aa4950f9586ae9f"><div class="ttname"><a href="group__process.html#ga13bfac41329ec74b2aa4950f9586ae9f">pmsgctl</a></div><div class="ttdeci">int pmsgctl(int msqid, int cmd, struct msqid_ds *buf)</div><div class="ttdoc">msgctl wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_gad27b81fee9a0f792c4ba29fd95c967e1"><div class="ttname"><a href="group__process.html#gad27b81fee9a0f792c4ba29fd95c967e1">pwait</a></div><div class="ttdeci">pid_t pwait(int *status)</div><div class="ttdoc">wait wrapper function.</div></div>
<div class="ttc" id="agroup__process_html_ga0e2534c82b54573590d913c297cc4840"><div class="ttname"><a href="group__process.html#ga0e2534c82b54573590d913c297cc4840">psemop</a></div><div class="ttdeci">void psemop(int semid, struct sembuf *sops, size_t nsops)</div><div class="ttdoc">semop wrapper function.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="process_8h.html">process.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,137 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice
for the JavaScript code in this file
*/
function initResizable()
{
var cookie_namespace = 'doxygen';
var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight;
function readCookie(cookie)
{
var myCookie = cookie_namespace+"_"+cookie+"=";
if (document.cookie) {
var index = document.cookie.indexOf(myCookie);
if (index != -1) {
var valStart = index + myCookie.length;
var valEnd = document.cookie.indexOf(";", valStart);
if (valEnd == -1) {
valEnd = document.cookie.length;
}
var val = document.cookie.substring(valStart, valEnd);
return val;
}
}
return 0;
}
function writeCookie(cookie, val, expiration)
{
if (val==undefined) return;
if (expiration == null) {
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
expiration = date.toGMTString();
}
document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
}
function resizeWidth()
{
var windowWidth = $(window).width() + "px";
var sidenavWidth = $(sidenav).outerWidth();
content.css({marginLeft:parseInt(sidenavWidth)+"px"});
writeCookie('width',sidenavWidth-barWidth, null);
}
function restoreWidth(navWidth)
{
var windowWidth = $(window).width() + "px";
content.css({marginLeft:parseInt(navWidth)+barWidth+"px"});
sidenav.css({width:navWidth + "px"});
}
function resizeHeight()
{
var headerHeight = header.outerHeight();
var footerHeight = footer.outerHeight();
var windowHeight = $(window).height() - headerHeight - footerHeight;
content.css({height:windowHeight + "px"});
navtree.css({height:windowHeight + "px"});
sidenav.css({height:windowHeight + "px"});
var width=$(window).width();
if (width!=collapsedWidth) {
if (width<desktop_vp && collapsedWidth>=desktop_vp) {
if (!collapsed) {
collapseExpand();
}
} else if (width>desktop_vp && collapsedWidth<desktop_vp) {
if (collapsed) {
collapseExpand();
}
}
collapsedWidth=width;
}
(document.getElementById(location.hash.slice(1))||document.body).scrollIntoView();
}
function collapseExpand()
{
if (sidenav.width()>0) {
restoreWidth(0);
collapsed=true;
}
else {
var width = readCookie('width');
if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); }
collapsed=false;
}
}
header = $("#top");
sidenav = $("#side-nav");
content = $("#doc-content");
navtree = $("#nav-tree");
footer = $("#nav-path");
$(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
$(sidenav).resizable({ minWidth: 0 });
$(window).resize(function() { resizeHeight(); });
var device = navigator.userAgent.toLowerCase();
var touch_device = device.match(/(iphone|ipod|ipad|android)/);
if (touch_device) { /* wider split bar for touch only devices */
$(sidenav).css({ paddingRight:'20px' });
$('.ui-resizable-e').css({ width:'20px' });
$('#nav-sync').css({ right:'34px' });
barWidth=20;
}
var width = readCookie('width');
if (width) { restoreWidth(width); } else { resizeWidth(); }
resizeHeight();
var url = location.href;
var i=url.indexOf("#");
if (i>=0) window.location.hash=url.substr(i);
var _preventDefault = function(evt) { evt.preventDefault(); };
$("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
$(".ui-resizable-handle").dblclick(collapseExpand);
$(window).on('load',resizeHeight);
}
/* @license-end */

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,263 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: thread.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('thread_8h.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">thread.h File Reference<div class="ingroups"><a class="el" href="group__thread.html">thread</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>POSIX threads library wrapper module.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;pthread.h&gt;</code><br />
</div>
<p><a href="thread_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td colspan="2"><div class="groupHeader">Thread handling</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_t</code></p>
<p><a class="anchor" id="thread"></a></p>
</div></td></tr>
<tr class="memitem:gadca8bdcec91b8985370d904591d342b8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">thread_equal</a> (pthread_t t1, pthread_t t2)</td></tr>
<tr class="memdesc:gadca8bdcec91b8985370d904591d342b8"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_equal</code> wrapper function. <a href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">More...</a><br /></td></tr>
<tr class="separator:gadca8bdcec91b8985370d904591d342b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3a0f9920a321b54c41c098d3461d3889"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">thread_create</a> (pthread_t *t, pthread_attr_t *attr, void *(*thread_main)(void *), void *arg)</td></tr>
<tr class="memdesc:ga3a0f9920a321b54c41c098d3461d3889"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_create</code> wrapper function. <a href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">More...</a><br /></td></tr>
<tr class="separator:ga3a0f9920a321b54c41c098d3461d3889"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga606fdef53f997c231e0e1e9e54b350d4"><td class="memItemLeft" align="right" valign="top">pthread_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">thread_self</a> ()</td></tr>
<tr class="memdesc:ga606fdef53f997c231e0e1e9e54b350d4"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_self</code> wrapper function. <a href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">More...</a><br /></td></tr>
<tr class="separator:ga606fdef53f997c231e0e1e9e54b350d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga952c63101c667d247f0923b609710c72"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga952c63101c667d247f0923b609710c72">thread_sched_yield</a> (void)</td></tr>
<tr class="memdesc:ga952c63101c667d247f0923b609710c72"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>sched_yield</code> wrapper function. <a href="group__thread.html#ga952c63101c667d247f0923b609710c72">More...</a><br /></td></tr>
<tr class="separator:ga952c63101c667d247f0923b609710c72"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga19b16adf05364471bae2840aa564329a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga19b16adf05364471bae2840aa564329a">thread_exit</a> (void *retval)</td></tr>
<tr class="memdesc:ga19b16adf05364471bae2840aa564329a"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_exit</code> wrapper function. <a href="group__thread.html#ga19b16adf05364471bae2840aa564329a">More...</a><br /></td></tr>
<tr class="separator:ga19b16adf05364471bae2840aa564329a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga86aa7989874009c886bea9d41700e25c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">thread_detach</a> (pthread_t thread)</td></tr>
<tr class="memdesc:ga86aa7989874009c886bea9d41700e25c"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_detach</code> wrapper function. <a href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">More...</a><br /></td></tr>
<tr class="separator:ga86aa7989874009c886bea9d41700e25c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga2b2370a45c1518f777493526b2e4f46d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">thread_join</a> (pthread_t t, void **result)</td></tr>
<tr class="memdesc:ga2b2370a45c1518f777493526b2e4f46d"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_join</code> wrapper function. <a href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">More...</a><br /></td></tr>
<tr class="separator:ga2b2370a45c1518f777493526b2e4f46d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Mutexes</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_mutex_t</code></p>
<p>Initialization of mutexes can be static or dynamic.</p>
<p>In static initialization the following initialization macros are suggested:</p><ul>
<li><code>PTHREAD_MUTEX_INITIALIZER</code> - standard initializer</li>
<li><code>PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP</code> - initializer that ensures error checking</li>
<li><code>PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP</code> - for recursive mutexes (note that recursive mutexes should be avoid)</li>
</ul>
<p>Dynamic initialization is done by <a class="el" href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6" title="pthread_mutex_init wrapper function.">mutex_init()</a> and <a class="el" href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01" title="pthread_mutex_destroy wrapper function.">mutex_destroy()</a>.</p>
<p><a class="anchor" id="mutex"></a></p>
</div></td></tr>
<tr class="memitem:ga3f227a19d6a339ce0aeda15775e5e6e6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">mutex_init</a> (pthread_mutex_t *pmtx, pthread_mutexattr_t *attr)</td></tr>
<tr class="memdesc:ga3f227a19d6a339ce0aeda15775e5e6e6"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutex_init</code> wrapper function. <a href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">More...</a><br /></td></tr>
<tr class="separator:ga3f227a19d6a339ce0aeda15775e5e6e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5ebb836d0f83eac719f2cdd336497b01"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">mutex_destroy</a> (pthread_mutex_t *pmtx)</td></tr>
<tr class="memdesc:ga5ebb836d0f83eac719f2cdd336497b01"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutex_destroy</code> wrapper function. <a href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">More...</a><br /></td></tr>
<tr class="separator:ga5ebb836d0f83eac719f2cdd336497b01"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga87086ba0f13f6ddc479a6bc803a10c39"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">mutex_lock</a> (pthread_mutex_t *pmtx)</td></tr>
<tr class="memdesc:ga87086ba0f13f6ddc479a6bc803a10c39"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutex_lock</code> wrapper function. <a href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">More...</a><br /></td></tr>
<tr class="separator:ga87086ba0f13f6ddc479a6bc803a10c39"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8bd074884e1c92e88ca8ea0552d9a928"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">mutex_trylock</a> (pthread_mutex_t *pmtx)</td></tr>
<tr class="memdesc:ga8bd074884e1c92e88ca8ea0552d9a928"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutex_trylock</code> wrapper function. <a href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">More...</a><br /></td></tr>
<tr class="separator:ga8bd074884e1c92e88ca8ea0552d9a928"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga95235231165ebda870afa10ba5fd6c41"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">mutex_unlock</a> (pthread_mutex_t *pmtx)</td></tr>
<tr class="memdesc:ga95235231165ebda870afa10ba5fd6c41"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutex_unlock</code> wrapper function. <a href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">More...</a><br /></td></tr>
<tr class="separator:ga95235231165ebda870afa10ba5fd6c41"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Condition variables</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_cond_t</code></p>
<p>Initialization of condition variables can be static or dynamic.</p>
<p>In static initialization the following initialization macros should be used:</p><ul>
<li><code>PTHREAD_COND_INITIALIZER</code> - standard initializer</li>
</ul>
<p>Dynamic initialization is done by <a class="el" href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad" title="pthread_cond_init wrapper function.">cond_init()</a> and <a class="el" href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80" title="pthread_cond_destroy wrapper function.">cond_destroy()</a>.</p>
<p><a class="anchor" id="cvar"></a></p>
</div></td></tr>
<tr class="memitem:ga31e5eaf158d118d0e4ef7fd47368eaad"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">cond_init</a> (pthread_cond_t *pcvar, pthread_condattr_t *attr)</td></tr>
<tr class="memdesc:ga31e5eaf158d118d0e4ef7fd47368eaad"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_init</code> wrapper function. <a href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">More...</a><br /></td></tr>
<tr class="separator:ga31e5eaf158d118d0e4ef7fd47368eaad"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad663c43fbfbb4f660d48b07e110c8f80"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">cond_destroy</a> (pthread_cond_t *pcvar)</td></tr>
<tr class="memdesc:gad663c43fbfbb4f660d48b07e110c8f80"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_destroy</code> wrapper function. <a href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">More...</a><br /></td></tr>
<tr class="separator:gad663c43fbfbb4f660d48b07e110c8f80"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1123643838d5174ccd41f52f4169e896"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">cond_wait</a> (pthread_cond_t *pcvar, pthread_mutex_t *pmtx)</td></tr>
<tr class="memdesc:ga1123643838d5174ccd41f52f4169e896"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_wait</code> wrapper function. <a href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">More...</a><br /></td></tr>
<tr class="separator:ga1123643838d5174ccd41f52f4169e896"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8cd2040836c30e4f0ea17abe4f66b8e2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">cond_timedwait</a> (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, const struct timespec *abstime)</td></tr>
<tr class="memdesc:ga8cd2040836c30e4f0ea17abe4f66b8e2"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_timedwait</code> wrapper function. <a href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">More...</a><br /></td></tr>
<tr class="separator:ga8cd2040836c30e4f0ea17abe4f66b8e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4b41089ba3cd8ad0a539b42bc8b95d6b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b">cond_timedwait</a> (pthread_cond_t *pcvar, pthread_mutex_t *pmtx, long relative_time_us)</td></tr>
<tr class="memdesc:ga4b41089ba3cd8ad0a539b42bc8b95d6b"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_timedwait</code> wrapper function accepting relative time (in microseconds) instead of absolute time. <a href="group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b">More...</a><br /></td></tr>
<tr class="separator:ga4b41089ba3cd8ad0a539b42bc8b95d6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga9624688b577fb653af7a528848cc53d5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">cond_signal</a> (pthread_cond_t *pcvar)</td></tr>
<tr class="memdesc:ga9624688b577fb653af7a528848cc53d5"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_signal</code> wrapper function. <a href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">More...</a><br /></td></tr>
<tr class="separator:ga9624688b577fb653af7a528848cc53d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6459039ab27da7237dda2bbc866eb2d0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">cond_broadcast</a> (pthread_cond_t *pcvar)</td></tr>
<tr class="memdesc:ga6459039ab27da7237dda2bbc866eb2d0"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cond_broadcast</code> wrapper function. <a href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">More...</a><br /></td></tr>
<tr class="separator:ga6459039ab27da7237dda2bbc866eb2d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">One-time initialization</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_once_t</code></p>
<p>POSIX thread library support a mechanism that ensures a one-time execution of a function. It does it through <code>pthread_once_t</code> variables, and by passing a callback function (in C/C++ is simply a function pointer).</p>
<dl class="section user"><dt>Example</dt><dd><pre class="fragment"> void once_init_routine(void) { ... }
...
pthread_once_t once_control = PTHREAD_ONCE_INIT;
thread_once(&amp;once_control, &amp;once_init_routine); // one time execution over pthread_once_t
// variable is guaranteed, regardless of the
// number of threads that execute over that
// variable.
</pre></dd></dl>
<p><a class="anchor" id="thread_once"></a></p>
</div></td></tr>
<tr class="memitem:gad0428e8a0809704f4b3d682f26d3ef1c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">thread_once</a> (pthread_once_t *once_control, void(*init_routine)(void))</td></tr>
<tr class="memdesc:gad0428e8a0809704f4b3d682f26d3ef1c"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_once</code> wrapper function. <a href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">More...</a><br /></td></tr>
<tr class="separator:gad0428e8a0809704f4b3d682f26d3ef1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Thread-specific data</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_key_t</code></p>
<p>Thread-specific data allows the definition of variable whose scope is limited to each thread. In practice, we will have a common variable, with a common access, but with different values for each thread.</p>
<p><a class="anchor" id="thread_specific"></a></p>
</div></td></tr>
<tr class="memitem:ga7df1983f57dca40a86a55d215d13d42b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">thread_key_create</a> (pthread_key_t *key, void(*destr_function)(void *))</td></tr>
<tr class="memdesc:ga7df1983f57dca40a86a55d215d13d42b"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_key_create</code> wrapper function. <a href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">More...</a><br /></td></tr>
<tr class="separator:ga7df1983f57dca40a86a55d215d13d42b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga65a50dfc97c087a28cb916e0f30f760e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">thread_key_delete</a> (pthread_key_t key)</td></tr>
<tr class="memdesc:ga65a50dfc97c087a28cb916e0f30f760e"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_key_delete</code> wrapper function. <a href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">More...</a><br /></td></tr>
<tr class="separator:ga65a50dfc97c087a28cb916e0f30f760e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3008b033f2830e79179a882a2b74c8ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">thread_setspecific</a> (pthread_key_t key, void *pointer)</td></tr>
<tr class="memdesc:ga3008b033f2830e79179a882a2b74c8ba"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_setspecific</code> wrapper function. <a href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">More...</a><br /></td></tr>
<tr class="separator:ga3008b033f2830e79179a882a2b74c8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0d207f1bb2e1d493b68a026b8650cb16"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">thread_getspecific</a> (pthread_key_t key)</td></tr>
<tr class="memdesc:ga0d207f1bb2e1d493b68a026b8650cb16"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_getspecific</code> wrapper function. <a href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">More...</a><br /></td></tr>
<tr class="separator:ga0d207f1bb2e1d493b68a026b8650cb16"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Mutex attributes</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_mutexattr_t</code></p>
<p><a class="anchor" id="mutex_attr"></a></p>
</div></td></tr>
<tr class="memitem:ga9fb2733a01e8d668a2022005ea5dbebd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">mutexattr_init</a> (pthread_mutexattr_t *attr)</td></tr>
<tr class="memdesc:ga9fb2733a01e8d668a2022005ea5dbebd"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutexattr_init</code> wrapper function. <a href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">More...</a><br /></td></tr>
<tr class="separator:ga9fb2733a01e8d668a2022005ea5dbebd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga07bf0e49b1f2cb99d3a2955641c676d5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">mutexattr_destroy</a> (pthread_mutexattr_t *attr)</td></tr>
<tr class="memdesc:ga07bf0e49b1f2cb99d3a2955641c676d5"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutexattr_destroy</code> wrapper function. <a href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">More...</a><br /></td></tr>
<tr class="separator:ga07bf0e49b1f2cb99d3a2955641c676d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga601a6a9527d7d5ee2ca2870cddc4afc2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">mutexattr_settype</a> (pthread_mutexattr_t *attr, int type)</td></tr>
<tr class="memdesc:ga601a6a9527d7d5ee2ca2870cddc4afc2"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutexattr_settype</code> wrapper function. <a href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">More...</a><br /></td></tr>
<tr class="separator:ga601a6a9527d7d5ee2ca2870cddc4afc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadf741e1818d53c5b7d71cd68e161b215"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">mutexattr_gettype</a> (const pthread_mutexattr_t *attr, int *kind)</td></tr>
<tr class="memdesc:gadf741e1818d53c5b7d71cd68e161b215"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_mutexattr_gettype</code> wrapper function. <a href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">More...</a><br /></td></tr>
<tr class="separator:gadf741e1818d53c5b7d71cd68e161b215"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Condition variables attributes</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_condattr_t</code></p>
<p><a class="anchor" id="cond_attr"></a></p>
</div></td></tr>
<tr class="memitem:gab8073c72be896ba9d711d887a5405a74"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">condattr_init</a> (pthread_condattr_t *attr)</td></tr>
<tr class="memdesc:gab8073c72be896ba9d711d887a5405a74"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_condattr_init</code> wrapper function. <a href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">More...</a><br /></td></tr>
<tr class="separator:gab8073c72be896ba9d711d887a5405a74"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4644f4989b30ccfb2e908017c43bd0d0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">condattr_destroy</a> (pthread_condattr_t *attr)</td></tr>
<tr class="memdesc:ga4644f4989b30ccfb2e908017c43bd0d0"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_condattr_destroy</code> wrapper function. <a href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">More...</a><br /></td></tr>
<tr class="separator:ga4644f4989b30ccfb2e908017c43bd0d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Thread attributes</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p>Variable type: <code>pthread_attr_t</code></p>
<p><a class="anchor" id="thread_attr"></a></p>
</div></td></tr>
<tr class="memitem:gaaf2db7012069f0006e7ffaf257d8ccc6"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">thread_attr_init</a> (pthread_attr_t *attr)</td></tr>
<tr class="memdesc:gaaf2db7012069f0006e7ffaf257d8ccc6"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_attr_init</code> wrapper function. <a href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">More...</a><br /></td></tr>
<tr class="separator:gaaf2db7012069f0006e7ffaf257d8ccc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf3a9c2c051deee01e21c75f0fa8b2e9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">thread_attr_destroy</a> (pthread_attr_t *attr)</td></tr>
<tr class="memdesc:gaf3a9c2c051deee01e21c75f0fa8b2e9c"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_attr_destroy</code> wrapper function. <a href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">More...</a><br /></td></tr>
<tr class="separator:gaf3a9c2c051deee01e21c75f0fa8b2e9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabc82fea1785fc82aeb2f43cdd77b9b0f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">thread_attr_setdetachstate</a> (pthread_attr_t *attr, int detachstate)</td></tr>
<tr class="memdesc:gabc82fea1785fc82aeb2f43cdd77b9b0f"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_attr_setdetachstate</code> wrapper function. <a href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">More...</a><br /></td></tr>
<tr class="separator:gabc82fea1785fc82aeb2f43cdd77b9b0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaae83c8617612c1bb481fec2b382ac9c4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">thread_attr_getdetachstate</a> (const pthread_attr_t *attr, int *pdetachstate)</td></tr>
<tr class="memdesc:gaae83c8617612c1bb481fec2b382ac9c4"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_attr_getdetachstate</code> wrapper function. <a href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">More...</a><br /></td></tr>
<tr class="separator:gaae83c8617612c1bb481fec2b382ac9c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">Cancellation</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="thread_cancellation"></a></p>
</div></td></tr>
<tr class="memitem:ga1b3cb53565eabe02a36e000e5244dfd1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">thread_cancel</a> (pthread_t thread)</td></tr>
<tr class="memdesc:ga1b3cb53565eabe02a36e000e5244dfd1"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_cancel</code> wrapper function. <a href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">More...</a><br /></td></tr>
<tr class="separator:ga1b3cb53565eabe02a36e000e5244dfd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga98baffe08beec792f3428ae9ddad966e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">thread_setcancelstate</a> (int state, int *oldstate)</td></tr>
<tr class="memdesc:ga98baffe08beec792f3428ae9ddad966e"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_setcancelstate</code> wrapper function. <a href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">More...</a><br /></td></tr>
<tr class="separator:ga98baffe08beec792f3428ae9ddad966e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab4ec114c7b59f8f4185bac648b256d0c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">thread_setcanceltype</a> (int type, int *oldtype)</td></tr>
<tr class="memdesc:gab4ec114c7b59f8f4185bac648b256d0c"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_setcanceltype</code> wrapper function. <a href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">More...</a><br /></td></tr>
<tr class="separator:gab4ec114c7b59f8f4185bac648b256d0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga81bdb13d62e16ad7cb3cbd263c9a5671"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">thread_testcancel</a> (void)</td></tr>
<tr class="memdesc:ga81bdb13d62e16ad7cb3cbd263c9a5671"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>pthread_testcancel</code> wrapper function. <a href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">More...</a><br /></td></tr>
<tr class="separator:ga81bdb13d62e16ad7cb3cbd263c9a5671"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>POSIX threads library wrapper module. </p>
<dl class="section remark"><dt>Remarks</dt><dd>Removes defensive programming from native libraries </dd></dl>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="thread_8h.html">thread.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,41 @@
var thread_8h =
[
[ "thread_equal", "group__thread.html#gadca8bdcec91b8985370d904591d342b8", null ],
[ "thread_create", "group__thread.html#ga3a0f9920a321b54c41c098d3461d3889", null ],
[ "thread_self", "group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4", null ],
[ "thread_sched_yield", "group__thread.html#ga952c63101c667d247f0923b609710c72", null ],
[ "thread_exit", "group__thread.html#ga19b16adf05364471bae2840aa564329a", null ],
[ "thread_detach", "group__thread.html#ga86aa7989874009c886bea9d41700e25c", null ],
[ "thread_join", "group__thread.html#ga2b2370a45c1518f777493526b2e4f46d", null ],
[ "mutex_init", "group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6", null ],
[ "mutex_destroy", "group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01", null ],
[ "mutex_lock", "group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39", null ],
[ "mutex_trylock", "group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928", null ],
[ "mutex_unlock", "group__thread.html#ga95235231165ebda870afa10ba5fd6c41", null ],
[ "cond_init", "group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad", null ],
[ "cond_destroy", "group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80", null ],
[ "cond_wait", "group__thread.html#ga1123643838d5174ccd41f52f4169e896", null ],
[ "cond_timedwait", "group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2", null ],
[ "cond_timedwait", "group__thread.html#ga4b41089ba3cd8ad0a539b42bc8b95d6b", null ],
[ "cond_signal", "group__thread.html#ga9624688b577fb653af7a528848cc53d5", null ],
[ "cond_broadcast", "group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0", null ],
[ "thread_once", "group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c", null ],
[ "thread_key_create", "group__thread.html#ga7df1983f57dca40a86a55d215d13d42b", null ],
[ "thread_key_delete", "group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e", null ],
[ "thread_setspecific", "group__thread.html#ga3008b033f2830e79179a882a2b74c8ba", null ],
[ "thread_getspecific", "group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16", null ],
[ "mutexattr_init", "group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd", null ],
[ "mutexattr_destroy", "group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5", null ],
[ "mutexattr_settype", "group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2", null ],
[ "mutexattr_gettype", "group__thread.html#gadf741e1818d53c5b7d71cd68e161b215", null ],
[ "condattr_init", "group__thread.html#gab8073c72be896ba9d711d887a5405a74", null ],
[ "condattr_destroy", "group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0", null ],
[ "thread_attr_init", "group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6", null ],
[ "thread_attr_destroy", "group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c", null ],
[ "thread_attr_setdetachstate", "group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f", null ],
[ "thread_attr_getdetachstate", "group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4", null ],
[ "thread_cancel", "group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1", null ],
[ "thread_setcancelstate", "group__thread.html#ga98baffe08beec792f3428ae9ddad966e", null ],
[ "thread_setcanceltype", "group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c", null ],
[ "thread_testcancel", "group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671", null ]
];

View File

@ -0,0 +1,207 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: thread.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('thread_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">thread.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="thread_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#ifndef THREAD_H</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#define THREAD_H</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;pthread.h&gt;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment">//#define EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">//#define EXIT_POLICY // DEFAULT</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">thread_equal</a>(pthread_t t1, pthread_t t2);</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">thread_create</a>(pthread_t* t, pthread_attr_t* attr, <span class="keywordtype">void</span> *(*thread_main)(<span class="keywordtype">void</span>*), <span class="keywordtype">void</span>* arg);</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;pthread_t <a class="code" href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">thread_self</a>();</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga952c63101c667d247f0923b609710c72">thread_sched_yield</a>(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga19b16adf05364471bae2840aa564329a">thread_exit</a>(<span class="keywordtype">void</span> *retval);</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">thread_detach</a>(pthread_t thread);</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; </div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">thread_join</a>(pthread_t t, <span class="keywordtype">void</span>** result);</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">mutex_init</a>(pthread_mutex_t* pmtx, pthread_mutexattr_t* attr);</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">mutex_destroy</a>(pthread_mutex_t* pmtx);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">mutex_lock</a>(pthread_mutex_t* pmtx);</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; </div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">mutex_trylock</a>(pthread_mutex_t* pmtx);</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; </div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">mutex_unlock</a>(pthread_mutex_t* pmtx);</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; </div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">cond_init</a>(pthread_cond_t* pcvar, pthread_condattr_t* attr);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">cond_destroy</a>(pthread_cond_t* pcvar);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; </div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">cond_wait</a>(pthread_cond_t* pcvar, pthread_mutex_t* pmtx);</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; </div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">cond_timedwait</a>(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, <span class="keyword">const</span> <span class="keyword">struct</span> timespec *abstime);</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">cond_timedwait</a>(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, <span class="keywordtype">long</span> relative_time_us);</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; </div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">cond_signal</a>(pthread_cond_t* pcvar);</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; </div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">cond_broadcast</a>(pthread_cond_t* pcvar);</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">thread_once</a>(pthread_once_t *once_control, <span class="keywordtype">void</span> (*init_routine) (<span class="keywordtype">void</span>));</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; </div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">thread_key_create</a>(pthread_key_t *key, <span class="keywordtype">void</span> (*destr_function) (<span class="keywordtype">void</span> *));</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; </div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">thread_key_delete</a>(pthread_key_t key);</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; </div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">thread_setspecific</a>(pthread_key_t key, <span class="keywordtype">void</span>* pointer);</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; </div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;<span class="keywordtype">void</span>* <a class="code" href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">thread_getspecific</a>(pthread_key_t key);</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; </div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">mutexattr_init</a>(pthread_mutexattr_t *attr);</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; </div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">mutexattr_destroy</a>(pthread_mutexattr_t *attr);</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; </div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">mutexattr_settype</a>(pthread_mutexattr_t *attr, <span class="keywordtype">int</span> type);</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; </div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">mutexattr_gettype</a>(<span class="keyword">const</span> pthread_mutexattr_t *attr, <span class="keywordtype">int</span> *kind);</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; </div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">condattr_init</a>(pthread_condattr_t *attr);</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; </div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">condattr_destroy</a>(pthread_condattr_t *attr);</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; </div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">thread_attr_init</a>(pthread_attr_t *attr);</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; </div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">thread_attr_destroy</a>(pthread_attr_t *attr);</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; </div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">thread_attr_setdetachstate</a>(pthread_attr_t *attr, <span class="keywordtype">int</span> detachstate);</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; </div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">thread_attr_getdetachstate</a>(<span class="keyword">const</span> pthread_attr_t *attr, <span class="keywordtype">int</span> *pdetachstate);</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; </div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">thread_cancel</a>(pthread_t thread);</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; </div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">thread_setcancelstate</a>(<span class="keywordtype">int</span> state, <span class="keywordtype">int</span> *oldstate);</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; </div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">thread_setcanceltype</a>(<span class="keywordtype">int</span> type, <span class="keywordtype">int</span> *oldtype);</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">thread_testcancel</a>(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; </div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; </div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; </div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="agroup__thread_html_ga31e5eaf158d118d0e4ef7fd47368eaad"><div class="ttname"><a href="group__thread.html#ga31e5eaf158d118d0e4ef7fd47368eaad">cond_init</a></div><div class="ttdeci">void cond_init(pthread_cond_t *pcvar, pthread_condattr_t *attr)</div><div class="ttdoc">pthread_cond_init wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga3008b033f2830e79179a882a2b74c8ba"><div class="ttname"><a href="group__thread.html#ga3008b033f2830e79179a882a2b74c8ba">thread_setspecific</a></div><div class="ttdeci">void thread_setspecific(pthread_key_t key, void *pointer)</div><div class="ttdoc">pthread_setspecific wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gad663c43fbfbb4f660d48b07e110c8f80"><div class="ttname"><a href="group__thread.html#gad663c43fbfbb4f660d48b07e110c8f80">cond_destroy</a></div><div class="ttdeci">void cond_destroy(pthread_cond_t *pcvar)</div><div class="ttdoc">pthread_cond_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga7df1983f57dca40a86a55d215d13d42b"><div class="ttname"><a href="group__thread.html#ga7df1983f57dca40a86a55d215d13d42b">thread_key_create</a></div><div class="ttdeci">void thread_key_create(pthread_key_t *key, void(*destr_function)(void *))</div><div class="ttdoc">pthread_key_create wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga19b16adf05364471bae2840aa564329a"><div class="ttname"><a href="group__thread.html#ga19b16adf05364471bae2840aa564329a">thread_exit</a></div><div class="ttdeci">void thread_exit(void *retval)</div><div class="ttdoc">pthread_exit wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga07bf0e49b1f2cb99d3a2955641c676d5"><div class="ttname"><a href="group__thread.html#ga07bf0e49b1f2cb99d3a2955641c676d5">mutexattr_destroy</a></div><div class="ttdeci">void mutexattr_destroy(pthread_mutexattr_t *attr)</div><div class="ttdoc">pthread_mutexattr_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga98baffe08beec792f3428ae9ddad966e"><div class="ttname"><a href="group__thread.html#ga98baffe08beec792f3428ae9ddad966e">thread_setcancelstate</a></div><div class="ttdeci">void thread_setcancelstate(int state, int *oldstate)</div><div class="ttdoc">pthread_setcancelstate wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gaae83c8617612c1bb481fec2b382ac9c4"><div class="ttname"><a href="group__thread.html#gaae83c8617612c1bb481fec2b382ac9c4">thread_attr_getdetachstate</a></div><div class="ttdeci">void thread_attr_getdetachstate(const pthread_attr_t *attr, int *pdetachstate)</div><div class="ttdoc">pthread_attr_getdetachstate wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga65a50dfc97c087a28cb916e0f30f760e"><div class="ttname"><a href="group__thread.html#ga65a50dfc97c087a28cb916e0f30f760e">thread_key_delete</a></div><div class="ttdeci">void thread_key_delete(pthread_key_t key)</div><div class="ttdoc">pthread_key_delete wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga81bdb13d62e16ad7cb3cbd263c9a5671"><div class="ttname"><a href="group__thread.html#ga81bdb13d62e16ad7cb3cbd263c9a5671">thread_testcancel</a></div><div class="ttdeci">void thread_testcancel(void)</div><div class="ttdoc">pthread_testcancel wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gab8073c72be896ba9d711d887a5405a74"><div class="ttname"><a href="group__thread.html#gab8073c72be896ba9d711d887a5405a74">condattr_init</a></div><div class="ttdeci">void condattr_init(pthread_condattr_t *attr)</div><div class="ttdoc">pthread_condattr_init wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga2b2370a45c1518f777493526b2e4f46d"><div class="ttname"><a href="group__thread.html#ga2b2370a45c1518f777493526b2e4f46d">thread_join</a></div><div class="ttdeci">void thread_join(pthread_t t, void **result)</div><div class="ttdoc">pthread_join wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga4644f4989b30ccfb2e908017c43bd0d0"><div class="ttname"><a href="group__thread.html#ga4644f4989b30ccfb2e908017c43bd0d0">condattr_destroy</a></div><div class="ttdeci">void condattr_destroy(pthread_condattr_t *attr)</div><div class="ttdoc">pthread_condattr_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga9624688b577fb653af7a528848cc53d5"><div class="ttname"><a href="group__thread.html#ga9624688b577fb653af7a528848cc53d5">cond_signal</a></div><div class="ttdeci">void cond_signal(pthread_cond_t *pcvar)</div><div class="ttdoc">pthread_cond_signal wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gaaf2db7012069f0006e7ffaf257d8ccc6"><div class="ttname"><a href="group__thread.html#gaaf2db7012069f0006e7ffaf257d8ccc6">thread_attr_init</a></div><div class="ttdeci">void thread_attr_init(pthread_attr_t *attr)</div><div class="ttdoc">pthread_attr_init wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga3f227a19d6a339ce0aeda15775e5e6e6"><div class="ttname"><a href="group__thread.html#ga3f227a19d6a339ce0aeda15775e5e6e6">mutex_init</a></div><div class="ttdeci">void mutex_init(pthread_mutex_t *pmtx, pthread_mutexattr_t *attr)</div><div class="ttdoc">pthread_mutex_init wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga1123643838d5174ccd41f52f4169e896"><div class="ttname"><a href="group__thread.html#ga1123643838d5174ccd41f52f4169e896">cond_wait</a></div><div class="ttdeci">void cond_wait(pthread_cond_t *pcvar, pthread_mutex_t *pmtx)</div><div class="ttdoc">pthread_cond_wait wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga86aa7989874009c886bea9d41700e25c"><div class="ttname"><a href="group__thread.html#ga86aa7989874009c886bea9d41700e25c">thread_detach</a></div><div class="ttdeci">void thread_detach(pthread_t thread)</div><div class="ttdoc">pthread_detach wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga6459039ab27da7237dda2bbc866eb2d0"><div class="ttname"><a href="group__thread.html#ga6459039ab27da7237dda2bbc866eb2d0">cond_broadcast</a></div><div class="ttdeci">void cond_broadcast(pthread_cond_t *pcvar)</div><div class="ttdoc">pthread_cond_broadcast wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga9fb2733a01e8d668a2022005ea5dbebd"><div class="ttname"><a href="group__thread.html#ga9fb2733a01e8d668a2022005ea5dbebd">mutexattr_init</a></div><div class="ttdeci">void mutexattr_init(pthread_mutexattr_t *attr)</div><div class="ttdoc">pthread_mutexattr_init wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gadf741e1818d53c5b7d71cd68e161b215"><div class="ttname"><a href="group__thread.html#gadf741e1818d53c5b7d71cd68e161b215">mutexattr_gettype</a></div><div class="ttdeci">void mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind)</div><div class="ttdoc">pthread_mutexattr_gettype wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gaf3a9c2c051deee01e21c75f0fa8b2e9c"><div class="ttname"><a href="group__thread.html#gaf3a9c2c051deee01e21c75f0fa8b2e9c">thread_attr_destroy</a></div><div class="ttdeci">void thread_attr_destroy(pthread_attr_t *attr)</div><div class="ttdoc">pthread_attr_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga0d207f1bb2e1d493b68a026b8650cb16"><div class="ttname"><a href="group__thread.html#ga0d207f1bb2e1d493b68a026b8650cb16">thread_getspecific</a></div><div class="ttdeci">void * thread_getspecific(pthread_key_t key)</div><div class="ttdoc">pthread_getspecific wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga5ebb836d0f83eac719f2cdd336497b01"><div class="ttname"><a href="group__thread.html#ga5ebb836d0f83eac719f2cdd336497b01">mutex_destroy</a></div><div class="ttdeci">void mutex_destroy(pthread_mutex_t *pmtx)</div><div class="ttdoc">pthread_mutex_destroy wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gad0428e8a0809704f4b3d682f26d3ef1c"><div class="ttname"><a href="group__thread.html#gad0428e8a0809704f4b3d682f26d3ef1c">thread_once</a></div><div class="ttdeci">void thread_once(pthread_once_t *once_control, void(*init_routine)(void))</div><div class="ttdoc">pthread_once wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga3a0f9920a321b54c41c098d3461d3889"><div class="ttname"><a href="group__thread.html#ga3a0f9920a321b54c41c098d3461d3889">thread_create</a></div><div class="ttdeci">void thread_create(pthread_t *t, pthread_attr_t *attr, void *(*thread_main)(void *), void *arg)</div><div class="ttdoc">pthread_create wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gab4ec114c7b59f8f4185bac648b256d0c"><div class="ttname"><a href="group__thread.html#gab4ec114c7b59f8f4185bac648b256d0c">thread_setcanceltype</a></div><div class="ttdeci">void thread_setcanceltype(int type, int *oldtype)</div><div class="ttdoc">pthread_setcanceltype wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga952c63101c667d247f0923b609710c72"><div class="ttname"><a href="group__thread.html#ga952c63101c667d247f0923b609710c72">thread_sched_yield</a></div><div class="ttdeci">void thread_sched_yield(void)</div><div class="ttdoc">sched_yield wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga601a6a9527d7d5ee2ca2870cddc4afc2"><div class="ttname"><a href="group__thread.html#ga601a6a9527d7d5ee2ca2870cddc4afc2">mutexattr_settype</a></div><div class="ttdeci">void mutexattr_settype(pthread_mutexattr_t *attr, int type)</div><div class="ttdoc">pthread_mutexattr_settype wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gadca8bdcec91b8985370d904591d342b8"><div class="ttname"><a href="group__thread.html#gadca8bdcec91b8985370d904591d342b8">thread_equal</a></div><div class="ttdeci">int thread_equal(pthread_t t1, pthread_t t2)</div><div class="ttdoc">pthread_equal wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga1b3cb53565eabe02a36e000e5244dfd1"><div class="ttname"><a href="group__thread.html#ga1b3cb53565eabe02a36e000e5244dfd1">thread_cancel</a></div><div class="ttdeci">void thread_cancel(pthread_t thread)</div><div class="ttdoc">pthread_cancel wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga606fdef53f997c231e0e1e9e54b350d4"><div class="ttname"><a href="group__thread.html#ga606fdef53f997c231e0e1e9e54b350d4">thread_self</a></div><div class="ttdeci">pthread_t thread_self()</div><div class="ttdoc">pthread_self wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_gabc82fea1785fc82aeb2f43cdd77b9b0f"><div class="ttname"><a href="group__thread.html#gabc82fea1785fc82aeb2f43cdd77b9b0f">thread_attr_setdetachstate</a></div><div class="ttdeci">void thread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)</div><div class="ttdoc">pthread_attr_setdetachstate wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga87086ba0f13f6ddc479a6bc803a10c39"><div class="ttname"><a href="group__thread.html#ga87086ba0f13f6ddc479a6bc803a10c39">mutex_lock</a></div><div class="ttdeci">void mutex_lock(pthread_mutex_t *pmtx)</div><div class="ttdoc">pthread_mutex_lock wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga8cd2040836c30e4f0ea17abe4f66b8e2"><div class="ttname"><a href="group__thread.html#ga8cd2040836c30e4f0ea17abe4f66b8e2">cond_timedwait</a></div><div class="ttdeci">int cond_timedwait(pthread_cond_t *pcvar, pthread_mutex_t *pmtx, const struct timespec *abstime)</div><div class="ttdoc">pthread_cond_timedwait wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga95235231165ebda870afa10ba5fd6c41"><div class="ttname"><a href="group__thread.html#ga95235231165ebda870afa10ba5fd6c41">mutex_unlock</a></div><div class="ttdeci">void mutex_unlock(pthread_mutex_t *pmtx)</div><div class="ttdoc">pthread_mutex_unlock wrapper function.</div></div>
<div class="ttc" id="agroup__thread_html_ga8bd074884e1c92e88ca8ea0552d9a928"><div class="ttname"><a href="group__thread.html#ga8bd074884e1c92e88ca8ea0552d9a928">mutex_trylock</a></div><div class="ttdeci">int mutex_trylock(pthread_mutex_t *pmtx)</div><div class="ttdoc">pthread_mutex_trylock wrapper function.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="thread_8h.html">thread.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,208 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: utils.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('utils_8h.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#define-members">Macros</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">utils.h File Reference<div class="ingroups"><a class="el" href="group__utils.html">utils</a></div></div> </div>
</div><!--header-->
<div class="contents">
<p>Useful common functions and macros.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;stdio.h&gt;</code><br />
<code>#include &lt;string.h&gt;</code><br />
<code>#include &lt;errno.h&gt;</code><br />
<code>#include &quot;<a class="el" href="dbc_8h_source.html">dbc.h</a>&quot;</code><br />
</div>
<p><a href="utils_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ga3c545b669dff7d67e5ed3c58233ccf4b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b">int2str</a>(num)</td></tr>
<tr class="memdesc:ga3c545b669dff7d67e5ed3c58233ccf4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>int</code> value to a stack allocated string. <a href="group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b">More...</a><br /></td></tr>
<tr class="separator:ga3c545b669dff7d67e5ed3c58233ccf4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga858ece77e79fb78d3db0f1851bf7fe09"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09">int2nstr</a>(num, len)</td></tr>
<tr class="memdesc:ga858ece77e79fb78d3db0f1851bf7fe09"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>int</code> value to a stack allocated string. <a href="group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09">More...</a><br /></td></tr>
<tr class="separator:ga858ece77e79fb78d3db0f1851bf7fe09"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga69373a612a7b4d264371f727217f9954"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga69373a612a7b4d264371f727217f9954">long2str</a>(num)</td></tr>
<tr class="memdesc:ga69373a612a7b4d264371f727217f9954"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>long</code> value to a stack allocated string. <a href="group__utils.html#ga69373a612a7b4d264371f727217f9954">More...</a><br /></td></tr>
<tr class="separator:ga69373a612a7b4d264371f727217f9954"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga50cea1f8154c7c7d2abd68f1ddb33086"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086">long2nstr</a>(num, len)</td></tr>
<tr class="memdesc:ga50cea1f8154c7c7d2abd68f1ddb33086"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>long</code> value to a stack allocated string. <a href="group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086">More...</a><br /></td></tr>
<tr class="separator:ga50cea1f8154c7c7d2abd68f1ddb33086"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga59cd66180162d107cf86a51c21d7e6f5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5">perc2str</a>(percentage)</td></tr>
<tr class="memdesc:ga59cd66180162d107cf86a51c21d7e6f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>int</code> percentage to a stack allocated string. <a href="group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5">More...</a><br /></td></tr>
<tr class="separator:ga59cd66180162d107cf86a51c21d7e6f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7bffda236a079c26302722c7d155f7a5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga7bffda236a079c26302722c7d155f7a5">length_vargs_string_list</a>(first)</td></tr>
<tr class="memdesc:ga7bffda236a079c26302722c7d155f7a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs). <a href="group__utils.html#ga7bffda236a079c26302722c7d155f7a5">More...</a><br /></td></tr>
<tr class="separator:ga7bffda236a079c26302722c7d155f7a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadfa0375f8178c737deae23ffa8d152f4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gadfa0375f8178c737deae23ffa8d152f4">not_null</a>(pnt)</td></tr>
<tr class="memdesc:gadfa0375f8178c737deae23ffa8d152f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks if address is not <code>NULL</code>, before its application. <a href="group__utils.html#gadfa0375f8178c737deae23ffa8d152f4">More...</a><br /></td></tr>
<tr class="separator:gadfa0375f8178c737deae23ffa8d152f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr><td colspan="2"><div class="groupHeader">String concatenation in stack memory</div></td></tr>
<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="concat"></a></p>
</div></td></tr>
<tr class="memitem:ga22347cbf977a0300726f06257edd79d6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga22347cbf977a0300726f06257edd79d6">concat_2str</a>(str1, str2)</td></tr>
<tr class="memdesc:ga22347cbf977a0300726f06257edd79d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga22347cbf977a0300726f06257edd79d6">More...</a><br /></td></tr>
<tr class="separator:ga22347cbf977a0300726f06257edd79d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga123e40006d54612c48c2660432dfeb23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga123e40006d54612c48c2660432dfeb23">concat_3str</a>(str1, str2, str3)</td></tr>
<tr class="memdesc:ga123e40006d54612c48c2660432dfeb23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates three strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga123e40006d54612c48c2660432dfeb23">More...</a><br /></td></tr>
<tr class="separator:ga123e40006d54612c48c2660432dfeb23"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga69037999e65cdb42d39988e0fec48af4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga69037999e65cdb42d39988e0fec48af4">concat_4str</a>(str1, str2, str3, str4)</td></tr>
<tr class="memdesc:ga69037999e65cdb42d39988e0fec48af4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates four strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga69037999e65cdb42d39988e0fec48af4">More...</a><br /></td></tr>
<tr class="separator:ga69037999e65cdb42d39988e0fec48af4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga580d1897bc7a8cef16d5a16a2373b876"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876">concat_5str</a>(str1, str2, str3, str4, str5)</td></tr>
<tr class="memdesc:ga580d1897bc7a8cef16d5a16a2373b876"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates five strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876">More...</a><br /></td></tr>
<tr class="separator:ga580d1897bc7a8cef16d5a16a2373b876"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga34f8c2fcee597a99c5f4c66f2119bca9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9">concat_6str</a>(str1, str2, str3, str4, str5, str6)</td></tr>
<tr class="memdesc:ga34f8c2fcee597a99c5f4c66f2119bca9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates six strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9">More...</a><br /></td></tr>
<tr class="separator:ga34f8c2fcee597a99c5f4c66f2119bca9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga01d1ea65eb6780d91705484dd46833bf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga01d1ea65eb6780d91705484dd46833bf">concat_7str</a>(str1, str2, str3, str4, str5, str6, str7)</td></tr>
<tr class="memdesc:ga01d1ea65eb6780d91705484dd46833bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates seven strings in the stack memory (thus it cannot be implemented in a function). <a href="group__utils.html#ga01d1ea65eb6780d91705484dd46833bf">More...</a><br /></td></tr>
<tr class="separator:ga01d1ea65eb6780d91705484dd46833bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:gadce4d1c428f979bf1cf8e1582d2f4052"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">mem_alloc</a> (int size)</td></tr>
<tr class="memdesc:gadce4d1c428f979bf1cf8e1582d2f4052"><td class="mdescLeft">&#160;</td><td class="mdescRight">A replacement for <code>malloc</code> function. <a href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">More...</a><br /></td></tr>
<tr class="separator:gadce4d1c428f979bf1cf8e1582d2f4052"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabe60e8350f3e3b07ed5002ee3449a6ae"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">mem_free</a> (void *pnt)</td></tr>
<tr class="memdesc:gabe60e8350f3e3b07ed5002ee3449a6ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">A replacement for <code>free</code> function. <a href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">More...</a><br /></td></tr>
<tr class="separator:gabe60e8350f3e3b07ed5002ee3449a6ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga825354891d287cc86d2b4ed1b600175a"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">string_clone</a> (char *str)</td></tr>
<tr class="memdesc:ga825354891d287cc86d2b4ed1b600175a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Replicates a string. <a href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">More...</a><br /></td></tr>
<tr class="separator:ga825354891d287cc86d2b4ed1b600175a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga15630ddb64e977c8243892556feedfd8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">string_num_lines</a> (char *text)</td></tr>
<tr class="memdesc:ga15630ddb64e977c8243892556feedfd8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of lines of a string. <a href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">More...</a><br /></td></tr>
<tr class="separator:ga15630ddb64e977c8243892556feedfd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0ca31b2a579b6ef7c75c41324ed5367c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">string_num_columns</a> (char *text)</td></tr>
<tr class="memdesc:ga0ca31b2a579b6ef7c75c41324ed5367c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of columns of a string (not counting character &lsquo;&rsquo;\n'`). <a href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">More...</a><br /></td></tr>
<tr class="separator:ga0ca31b2a579b6ef7c75c41324ed5367c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad643e0fcac9e59c1a171c460633e8637"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">string_count_char</a> (char *text, char *ch)</td></tr>
<tr class="memdesc:gad643e0fcac9e59c1a171c460633e8637"><td class="mdescLeft">&#160;</td><td class="mdescRight">Counts the number of occurrences of an UTF8 character in a text. <a href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">More...</a><br /></td></tr>
<tr class="separator:gad643e0fcac9e59c1a171c460633e8637"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3ec2b60d1636397119c5e0c21987f791"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">string_starts_with</a> (char *text, char *prefix)</td></tr>
<tr class="memdesc:ga3ec2b60d1636397119c5e0c21987f791"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tests if a string starts with a prefix. <a href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">More...</a><br /></td></tr>
<tr class="separator:ga3ec2b60d1636397119c5e0c21987f791"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1c5ba308f71c323fbbd7eb9bb34285d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">string_ends_with</a> (char *text, char *suffix)</td></tr>
<tr class="memdesc:ga1c5ba308f71c323fbbd7eb9bb34285d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tests if a string ends with a suffix. <a href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">More...</a><br /></td></tr>
<tr class="separator:ga1c5ba308f71c323fbbd7eb9bb34285d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa23a827164f7039b9770379cbf008905"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gaa23a827164f7039b9770379cbf008905">string_concat</a> (char *res, int max_length, char *text,...)</td></tr>
<tr class="memdesc:gaa23a827164f7039b9770379cbf008905"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates a <code>NULL</code> terminated list of string arguments. <a href="group__utils.html#gaa23a827164f7039b9770379cbf008905">More...</a><br /></td></tr>
<tr class="separator:gaa23a827164f7039b9770379cbf008905"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabe3e28fe49daaf3530e203c4aed1d15f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">random_boolean</a> (int trueProb)</td></tr>
<tr class="memdesc:gabe3e28fe49daaf3530e203c4aed1d15f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates a random boolean value. <a href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">More...</a><br /></td></tr>
<tr class="separator:gabe3e28fe49daaf3530e203c4aed1d15f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad7954e6a1b9ea073c7bc894dc5af85a9"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">random_int</a> (int min, int max)</td></tr>
<tr class="memdesc:gad7954e6a1b9ea073c7bc894dc5af85a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates a random integer value within a given interval. <a href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">More...</a><br /></td></tr>
<tr class="separator:gad7954e6a1b9ea073c7bc894dc5af85a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa820c93c2f719401b4b1ca54f6ea5c75"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">random_string</a> (char **list, int *used, int length)</td></tr>
<tr class="memdesc:gaa820c93c2f719401b4b1ca54f6ea5c75"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a random string from a given string list. <a href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">More...</a><br /></td></tr>
<tr class="separator:gaa820c93c2f719401b4b1ca54f6ea5c75"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3cffe15b7e5d10a108f1734a9640a2c7"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7">clear_console</a> ()</td></tr>
<tr class="memdesc:ga3cffe15b7e5d10a108f1734a9640a2c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears the terminal. <br /></td></tr>
<tr class="separator:ga3cffe15b7e5d10a108f1734a9640a2c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad3d324aed0ec686314cb0f68dfde9853"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">move_cursor</a> (int line, int column)</td></tr>
<tr class="memdesc:gad3d324aed0ec686314cb0f68dfde9853"><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves the cursor to a position in terminal. <a href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">More...</a><br /></td></tr>
<tr class="separator:gad3d324aed0ec686314cb0f68dfde9853"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga42702791e6da9510e4f44f33d2dad8f1"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1">hide_cursor</a> ()</td></tr>
<tr class="memdesc:ga42702791e6da9510e4f44f33d2dad8f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hides the terminal cursor. <br /></td></tr>
<tr class="separator:ga42702791e6da9510e4f44f33d2dad8f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1bdd62a6bef7cfd6522dc1412e162559"><td class="memItemLeft" align="right" valign="top">
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559">show_cursor</a> ()</td></tr>
<tr class="memdesc:ga1bdd62a6bef7cfd6522dc1412e162559"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shows the terminal cursor. <br /></td></tr>
<tr class="separator:ga1bdd62a6bef7cfd6522dc1412e162559"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab8050db5b87bfdee91ee92e67b063478"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">string_list_length</a> (char **list)</td></tr>
<tr class="memdesc:gab8050db5b87bfdee91ee92e67b063478"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of elements of a <code>NULL</code> terminated list of strings. <a href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">More...</a><br /></td></tr>
<tr class="separator:gab8050db5b87bfdee91ee92e67b063478"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga41163cf3a95e702f12506cd54ba3c70c"><td class="memItemLeft" align="right" valign="top">char **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">string_list_clone</a> (char **list)</td></tr>
<tr class="memdesc:ga41163cf3a95e702f12506cd54ba3c70c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Replicates a <code>NULL</code> terminated list of strings. <a href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">More...</a><br /></td></tr>
<tr class="separator:ga41163cf3a95e702f12506cd54ba3c70c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaacf77b3345bbca43767b08ec0583fe3c"><td class="memItemLeft" align="right" valign="top">char **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">string_list_free</a> (char **list)</td></tr>
<tr class="memdesc:gaacf77b3345bbca43767b08ec0583fe3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees the memory allocated to a <code>NULL</code> terminated list of strings. <a href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">More...</a><br /></td></tr>
<tr class="separator:gaacf77b3345bbca43767b08ec0583fe3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga824373ca8e0b2fdfe3f5c4805cf2ab7e"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">int2nstring</a> (char *res, int num, int len)</td></tr>
<tr class="memdesc:ga824373ca8e0b2fdfe3f5c4805cf2ab7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>int</code> value to a string. <a href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">More...</a><br /></td></tr>
<tr class="separator:ga824373ca8e0b2fdfe3f5c4805cf2ab7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gacf6edf10cb84412b6bfb431ef87b56d6"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">percentage2string</a> (char *res, int percentage)</td></tr>
<tr class="memdesc:gacf6edf10cb84412b6bfb431ef87b56d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts an <code>int</code> percentage to a string. <a href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">More...</a><br /></td></tr>
<tr class="separator:gacf6edf10cb84412b6bfb431ef87b56d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Useful common functions and macros. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="utils_8h.html">utils.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,37 @@
var utils_8h =
[
[ "concat_2str", "group__utils.html#ga22347cbf977a0300726f06257edd79d6", null ],
[ "concat_3str", "group__utils.html#ga123e40006d54612c48c2660432dfeb23", null ],
[ "concat_4str", "group__utils.html#ga69037999e65cdb42d39988e0fec48af4", null ],
[ "concat_5str", "group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876", null ],
[ "concat_6str", "group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9", null ],
[ "concat_7str", "group__utils.html#ga01d1ea65eb6780d91705484dd46833bf", null ],
[ "int2str", "group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b", null ],
[ "int2nstr", "group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09", null ],
[ "long2str", "group__utils.html#ga69373a612a7b4d264371f727217f9954", null ],
[ "long2nstr", "group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086", null ],
[ "perc2str", "group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5", null ],
[ "length_vargs_string_list", "group__utils.html#ga7bffda236a079c26302722c7d155f7a5", null ],
[ "not_null", "group__utils.html#gadfa0375f8178c737deae23ffa8d152f4", null ],
[ "mem_alloc", "group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052", null ],
[ "mem_free", "group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae", null ],
[ "string_clone", "group__utils.html#ga825354891d287cc86d2b4ed1b600175a", null ],
[ "string_num_lines", "group__utils.html#ga15630ddb64e977c8243892556feedfd8", null ],
[ "string_num_columns", "group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c", null ],
[ "string_count_char", "group__utils.html#gad643e0fcac9e59c1a171c460633e8637", null ],
[ "string_starts_with", "group__utils.html#ga3ec2b60d1636397119c5e0c21987f791", null ],
[ "string_ends_with", "group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4", null ],
[ "string_concat", "group__utils.html#gaa23a827164f7039b9770379cbf008905", null ],
[ "random_boolean", "group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f", null ],
[ "random_int", "group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9", null ],
[ "random_string", "group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75", null ],
[ "clear_console", "group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7", null ],
[ "move_cursor", "group__utils.html#gad3d324aed0ec686314cb0f68dfde9853", null ],
[ "hide_cursor", "group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1", null ],
[ "show_cursor", "group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559", null ],
[ "string_list_length", "group__utils.html#gab8050db5b87bfdee91ee92e67b063478", null ],
[ "string_list_clone", "group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c", null ],
[ "string_list_free", "group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c", null ],
[ "int2nstring", "group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e", null ],
[ "percentage2string", "group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6", null ]
];

View File

@ -0,0 +1,330 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>C++ Library, mos@ua: utils.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">C++ Library, mos@ua
&#160;<span id="projectnumber">0.9</span>
</div>
<div id="projectbrief">cpplib-mos</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('utils_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">utils.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#ifndef UTILS_H</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#define UTILS_H</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; </div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &lt;string.h&gt;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;errno.h&gt;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="dbc_8h.html">dbc.h</a>&quot;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
<div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="group__utils.html#ga22347cbf977a0300726f06257edd79d6"> 36</a></span>&#160;<span class="preprocessor">#define concat_2str(str1,str2) \</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="group__utils.html#ga123e40006d54612c48c2660432dfeb23"> 57</a></span>&#160;<span class="preprocessor">#define concat_3str(str1,str2,str3) \</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="preprocessor"> char* s3 = (str3) == NULL ? (char*)&quot;&quot; : (char*)(str3); \</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="preprocessor"> strcat(__res__, s3); \</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="group__utils.html#ga69037999e65cdb42d39988e0fec48af4"> 81</a></span>&#160;<span class="preprocessor">#define concat_4str(str1,str2,str3,str4) \</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="preprocessor"> char* s3 = (str3) == NULL ? (char*)&quot;&quot; : (char*)(str3); \</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="preprocessor"> char* s4 = (str4) == NULL ? (char*)&quot;&quot; : (char*)(str4); \</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="preprocessor"> strcat(__res__, s3); \</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor"> strcat(__res__, s4); \</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="group__utils.html#ga580d1897bc7a8cef16d5a16a2373b876"> 108</a></span>&#160;<span class="preprocessor">#define concat_5str(str1,str2,str3,str4,str5) \</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="preprocessor"> char* s3 = (str3) == NULL ? (char*)&quot;&quot; : (char*)(str3); \</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="preprocessor"> char* s4 = (str4) == NULL ? (char*)&quot;&quot; : (char*)(str4); \</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<span class="preprocessor"> char* s5 = (str5) == NULL ? (char*)&quot;&quot; : (char*)(str5); \</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \</span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="preprocessor"> strcat(__res__, s3); \</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="preprocessor"> strcat(__res__, s4); \</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="preprocessor"> strcat(__res__, s5); \</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="group__utils.html#ga34f8c2fcee597a99c5f4c66f2119bca9"> 138</a></span>&#160;<span class="preprocessor">#define concat_6str(str1,str2,str3,str4,str5,str6) \</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="preprocessor"> char* s3 = (str3) == NULL ? (char*)&quot;&quot; : (char*)(str3); \</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="preprocessor"> char* s4 = (str4) == NULL ? (char*)&quot;&quot; : (char*)(str4); \</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="preprocessor"> char* s5 = (str5) == NULL ? (char*)&quot;&quot; : (char*)(str5); \</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="preprocessor"> char* s6 = (str6) == NULL ? (char*)&quot;&quot; : (char*)(str6); \</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="preprocessor"> strcat(__res__, s3); \</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="preprocessor"> strcat(__res__, s4); \</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="preprocessor"> strcat(__res__, s5); \</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="preprocessor"> strcat(__res__, s6); \</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; </div>
<div class="line"><a name="l00171"></a><span class="lineno"><a class="line" href="group__utils.html#ga01d1ea65eb6780d91705484dd46833bf"> 171</a></span>&#160;<span class="preprocessor">#define concat_7str(str1,str2,str3,str4,str5,str6,str7) \</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="preprocessor"> char* s1 = (str1) == NULL ? (char*)&quot;&quot; : (char*)(str1); \</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="preprocessor"> char* s2 = (str2) == NULL ? (char*)&quot;&quot; : (char*)(str2); \</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="preprocessor"> char* s3 = (str3) == NULL ? (char*)&quot;&quot; : (char*)(str3); \</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="preprocessor"> char* s4 = (str4) == NULL ? (char*)&quot;&quot; : (char*)(str4); \</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="preprocessor"> char* s5 = (str5) == NULL ? (char*)&quot;&quot; : (char*)(str5); \</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="preprocessor"> char* s6 = (str6) == NULL ? (char*)&quot;&quot; : (char*)(str6); \</span></div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="preprocessor"> char* s7 = (str7) == NULL ? (char*)&quot;&quot; : (char*)(str7); \</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor"> strcpy(__res__, s1); \</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="preprocessor"> strcat(__res__, s2); \</span></div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="preprocessor"> strcat(__res__, s3); \</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="preprocessor"> strcat(__res__, s4); \</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="preprocessor"> strcat(__res__, s5); \</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="preprocessor"> strcat(__res__, s6); \</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="preprocessor"> strcat(__res__, s7); \</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
<div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="group__utils.html#ga3c545b669dff7d67e5ed3c58233ccf4b"> 199</a></span>&#160;<span class="preprocessor">#define int2str(num) \</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(numDigits((int)num)+1); \</span></div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;<span class="preprocessor"> sprintf(__res__, &quot;%d&quot;, (int)num); \</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="group__utils.html#ga858ece77e79fb78d3db0f1851bf7fe09"> 220</a></span>&#160;<span class="preprocessor">#define int2nstr(num, len) \</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;<span class="preprocessor"> require (len &gt; 0, concat_3str(&quot;invalid length value (&quot;, int2str(len), &quot;)&quot;)); \</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;<span class="preprocessor"> int d = numDigits((int)num); \</span></div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;<span class="preprocessor"> if (len &gt; d) \</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;<span class="preprocessor"> d = len; \</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(d+1); \</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="preprocessor"> sprintf(__res__, &quot;%0*d&quot;, d, (int)num); \</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; </div>
<div class="line"><a name="l00238"></a><span class="lineno"><a class="line" href="group__utils.html#ga69373a612a7b4d264371f727217f9954"> 238</a></span>&#160;<span class="preprocessor">#define long2str(num) \</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(numDigits((long)num)+1); \</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;<span class="preprocessor"> sprintf(__res__, &quot;%ld&quot;, (long)num); \</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
<div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="group__utils.html#ga50cea1f8154c7c7d2abd68f1ddb33086"> 259</a></span>&#160;<span class="preprocessor">#define long2nstr(num, len) \</span></div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;<span class="preprocessor"> require (len &gt; 0, concat_3str(&quot;invalid length value (&quot;, int2str(len), &quot;)&quot;)); \</span></div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160;<span class="preprocessor"> int d = numDigits((int)num); \</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;<span class="preprocessor"> if (len &gt; d) \</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;<span class="preprocessor"> d = len; \</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(d+1); \</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="preprocessor"> sprintf(__res__, &quot;%0*ld&quot;, d, (long)num); \</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; </div>
<div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="group__utils.html#ga59cd66180162d107cf86a51c21d7e6f5"> 281</a></span>&#160;<span class="preprocessor">#define perc2str(percentage) \</span></div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;<span class="preprocessor"> require (percentage &gt;= 0 &amp;&amp; percentage &lt;= 100, concat_3str(&quot;invalid percentage value (&quot;, int2str(percentage), &quot;)&quot;)); \</span></div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;<span class="preprocessor"> char* __res__ = (char*)alloca(4+1); \</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;<span class="preprocessor"> sprintf(__res__, &quot;%3d%%&quot;, (int)percentage); \</span></div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; </div>
<div class="line"><a name="l00296"></a><span class="lineno"><a class="line" href="group__utils.html#ga7bffda236a079c26302722c7d155f7a5"> 296</a></span>&#160;<span class="preprocessor">#define length_vargs_string_list(first) \</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;<span class="preprocessor"> int __res__ = 0; \</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;<span class="preprocessor"> va_list ap; \</span></div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;<span class="preprocessor"> va_start(ap, first); \</span></div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;<span class="preprocessor"> char* t = first; \</span></div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;<span class="preprocessor"> while (t != NULL) \</span></div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;<span class="preprocessor"> { \</span></div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;<span class="preprocessor"> __res__ += strlen(t); \</span></div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;<span class="preprocessor"> t = va_arg(ap, char*); \</span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;<span class="preprocessor"> } \</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;<span class="preprocessor"> va_end(ap); \</span></div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;<span class="preprocessor"> __res__; \</span></div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; </div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;<span class="preprocessor">#if defined __cplusplus &amp;&amp; defined EXCEPTION_POLICY</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;<span class="preprocessor">#define not_null(pnt) \</span></div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160;<span class="preprocessor"> if ((pnt) == NULL) \</span></div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;<span class="preprocessor"> throw string_concat(NULL, 0, (char*)&quot;Null pointer error&quot;, (char*)&quot;, pointer: \&quot;&quot;, #pnt, (char*)&quot;\&quot;, function: \&quot;&quot;, __FUNCTION__, (char*)&quot;\&quot;:&quot;, int2str(__LINE__), (char*)&quot;, file: \&quot;&quot;, __FILE__, (char*)&quot;\&quot;\n&quot;, NULL); \</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;<span class="preprocessor"> pnt; \</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
<div class="line"><a name="l00336"></a><span class="lineno"><a class="line" href="group__utils.html#gadfa0375f8178c737deae23ffa8d152f4"> 336</a></span>&#160;<span class="preprocessor">#define not_null(pnt) \</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;<span class="preprocessor"> ({ \</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;<span class="preprocessor"> if ((pnt) == NULL) \</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;<span class="preprocessor"> { \</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;<span class="preprocessor"> fprintf (stderr, &quot;Null pointer error, pointer: \&quot;%s\&quot;, function: \&quot;%s\&quot;:%d, file: \&quot;%s\&quot;\n&quot;, \</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;<span class="preprocessor"> #pnt, __FUNCTION__, __LINE__ , __FILE__); \</span></div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;<span class="preprocessor"> *((int*)0) = 0; \</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;<span class="preprocessor"> abort (); \</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="preprocessor"> } \</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160;<span class="preprocessor"> pnt; \</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160;<span class="preprocessor"> })</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; </div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160;<span class="keywordtype">void</span>* <a class="code" href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">mem_alloc</a>(<span class="keywordtype">int</span> size);</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; </div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">mem_free</a>(<span class="keywordtype">void</span>* pnt);</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; </div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160;<span class="keywordtype">char</span>* <a class="code" href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">string_clone</a>(<span class="keywordtype">char</span>* str);</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; </div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">string_num_lines</a>(<span class="keywordtype">char</span>* text);</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; </div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">string_num_columns</a>(<span class="keywordtype">char</span>* text);</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; </div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">string_count_char</a>(<span class="keywordtype">char</span>* text, <span class="keywordtype">char</span>* ch);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; </div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">string_starts_with</a>(<span class="keywordtype">char</span>* text, <span class="keywordtype">char</span>* prefix);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">string_ends_with</a>(<span class="keywordtype">char</span>* text, <span class="keywordtype">char</span>* suffix);</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; </div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160;<span class="keywordtype">char</span>* <a class="code" href="group__utils.html#gaa23a827164f7039b9770379cbf008905">string_concat</a>(<span class="keywordtype">char</span>* res, <span class="keywordtype">int</span> max_length, <span class="keywordtype">char</span>* text, ...);</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; </div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">random_boolean</a>(<span class="keywordtype">int</span> trueProb);</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; </div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">random_int</a>(<span class="keywordtype">int</span> min, <span class="keywordtype">int</span> max);</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; </div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;<span class="keywordtype">char</span>* <a class="code" href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">random_string</a>(<span class="keywordtype">char</span>** list, <span class="keywordtype">int</span>* used, <span class="keywordtype">int</span> length);</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7">clear_console</a>();</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; </div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">move_cursor</a>(<span class="keywordtype">int</span> line,<span class="keywordtype">int</span> column);</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1">hide_cursor</a>();</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; </div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;<span class="keywordtype">void</span> <a class="code" href="group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559">show_cursor</a>();</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; </div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">string_list_length</a>(<span class="keywordtype">char</span>** list);</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; </div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;<span class="keywordtype">char</span>** <a class="code" href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">string_list_clone</a>(<span class="keywordtype">char</span>** list);</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; </div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="keywordtype">char</span>** <a class="code" href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">string_list_free</a>(<span class="keywordtype">char</span>** list);</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; </div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="keywordtype">int</span> numDigits(<span class="keywordtype">int</span> num);</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; </div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160;<span class="keywordtype">char</span>* <a class="code" href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">int2nstring</a>(<span class="keywordtype">char</span>* res, <span class="keywordtype">int</span> num, <span class="keywordtype">int</span> len);</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; </div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160;<span class="keywordtype">char</span>* <a class="code" href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">percentage2string</a>(<span class="keywordtype">char</span>* res, <span class="keywordtype">int</span> percentage);</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; </div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;<span class="comment">/* ************************************************** */</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="agroup__utils_html_gad7954e6a1b9ea073c7bc894dc5af85a9"><div class="ttname"><a href="group__utils.html#gad7954e6a1b9ea073c7bc894dc5af85a9">random_int</a></div><div class="ttdeci">int random_int(int min, int max)</div><div class="ttdoc">Generates a random integer value within a given interval.</div></div>
<div class="ttc" id="agroup__utils_html_gab8050db5b87bfdee91ee92e67b063478"><div class="ttname"><a href="group__utils.html#gab8050db5b87bfdee91ee92e67b063478">string_list_length</a></div><div class="ttdeci">int string_list_length(char **list)</div><div class="ttdoc">Number of elements of a NULL terminated list of strings.</div></div>
<div class="ttc" id="agroup__utils_html_ga825354891d287cc86d2b4ed1b600175a"><div class="ttname"><a href="group__utils.html#ga825354891d287cc86d2b4ed1b600175a">string_clone</a></div><div class="ttdeci">char * string_clone(char *str)</div><div class="ttdoc">Replicates a string.</div></div>
<div class="ttc" id="adbc_8h_html"><div class="ttname"><a href="dbc_8h.html">dbc.h</a></div><div class="ttdoc">Design-by-Contract module.</div></div>
<div class="ttc" id="agroup__utils_html_gabe60e8350f3e3b07ed5002ee3449a6ae"><div class="ttname"><a href="group__utils.html#gabe60e8350f3e3b07ed5002ee3449a6ae">mem_free</a></div><div class="ttdeci">void mem_free(void *pnt)</div><div class="ttdoc">A replacement for free function.</div></div>
<div class="ttc" id="agroup__utils_html_ga1c5ba308f71c323fbbd7eb9bb34285d4"><div class="ttname"><a href="group__utils.html#ga1c5ba308f71c323fbbd7eb9bb34285d4">string_ends_with</a></div><div class="ttdeci">int string_ends_with(char *text, char *suffix)</div><div class="ttdoc">Tests if a string ends with a suffix.</div></div>
<div class="ttc" id="agroup__utils_html_gaacf77b3345bbca43767b08ec0583fe3c"><div class="ttname"><a href="group__utils.html#gaacf77b3345bbca43767b08ec0583fe3c">string_list_free</a></div><div class="ttdeci">char ** string_list_free(char **list)</div><div class="ttdoc">Frees the memory allocated to a NULL terminated list of strings.</div></div>
<div class="ttc" id="agroup__utils_html_gad643e0fcac9e59c1a171c460633e8637"><div class="ttname"><a href="group__utils.html#gad643e0fcac9e59c1a171c460633e8637">string_count_char</a></div><div class="ttdeci">int string_count_char(char *text, char *ch)</div><div class="ttdoc">Counts the number of occurrences of an UTF8 character in a text.</div></div>
<div class="ttc" id="agroup__utils_html_ga1bdd62a6bef7cfd6522dc1412e162559"><div class="ttname"><a href="group__utils.html#ga1bdd62a6bef7cfd6522dc1412e162559">show_cursor</a></div><div class="ttdeci">void show_cursor()</div><div class="ttdoc">Shows the terminal cursor.</div></div>
<div class="ttc" id="agroup__utils_html_gacf6edf10cb84412b6bfb431ef87b56d6"><div class="ttname"><a href="group__utils.html#gacf6edf10cb84412b6bfb431ef87b56d6">percentage2string</a></div><div class="ttdeci">char * percentage2string(char *res, int percentage)</div><div class="ttdoc">Converts an int percentage to a string.</div></div>
<div class="ttc" id="agroup__utils_html_gabe3e28fe49daaf3530e203c4aed1d15f"><div class="ttname"><a href="group__utils.html#gabe3e28fe49daaf3530e203c4aed1d15f">random_boolean</a></div><div class="ttdeci">int random_boolean(int trueProb)</div><div class="ttdoc">Generates a random boolean value.</div></div>
<div class="ttc" id="agroup__utils_html_ga15630ddb64e977c8243892556feedfd8"><div class="ttname"><a href="group__utils.html#ga15630ddb64e977c8243892556feedfd8">string_num_lines</a></div><div class="ttdeci">int string_num_lines(char *text)</div><div class="ttdoc">Number of lines of a string.</div></div>
<div class="ttc" id="agroup__utils_html_ga3cffe15b7e5d10a108f1734a9640a2c7"><div class="ttname"><a href="group__utils.html#ga3cffe15b7e5d10a108f1734a9640a2c7">clear_console</a></div><div class="ttdeci">void clear_console()</div><div class="ttdoc">Clears the terminal.</div></div>
<div class="ttc" id="agroup__utils_html_ga3ec2b60d1636397119c5e0c21987f791"><div class="ttname"><a href="group__utils.html#ga3ec2b60d1636397119c5e0c21987f791">string_starts_with</a></div><div class="ttdeci">int string_starts_with(char *text, char *prefix)</div><div class="ttdoc">Tests if a string starts with a prefix.</div></div>
<div class="ttc" id="agroup__utils_html_gadce4d1c428f979bf1cf8e1582d2f4052"><div class="ttname"><a href="group__utils.html#gadce4d1c428f979bf1cf8e1582d2f4052">mem_alloc</a></div><div class="ttdeci">void * mem_alloc(int size)</div><div class="ttdoc">A replacement for malloc function.</div></div>
<div class="ttc" id="agroup__utils_html_gad3d324aed0ec686314cb0f68dfde9853"><div class="ttname"><a href="group__utils.html#gad3d324aed0ec686314cb0f68dfde9853">move_cursor</a></div><div class="ttdeci">void move_cursor(int line, int column)</div><div class="ttdoc">Moves the cursor to a position in terminal.</div></div>
<div class="ttc" id="agroup__utils_html_gaa820c93c2f719401b4b1ca54f6ea5c75"><div class="ttname"><a href="group__utils.html#gaa820c93c2f719401b4b1ca54f6ea5c75">random_string</a></div><div class="ttdeci">char * random_string(char **list, int *used, int length)</div><div class="ttdoc">Returns a random string from a given string list.</div></div>
<div class="ttc" id="agroup__utils_html_ga824373ca8e0b2fdfe3f5c4805cf2ab7e"><div class="ttname"><a href="group__utils.html#ga824373ca8e0b2fdfe3f5c4805cf2ab7e">int2nstring</a></div><div class="ttdeci">char * int2nstring(char *res, int num, int len)</div><div class="ttdoc">Converts an int value to a string.</div></div>
<div class="ttc" id="agroup__utils_html_gaa23a827164f7039b9770379cbf008905"><div class="ttname"><a href="group__utils.html#gaa23a827164f7039b9770379cbf008905">string_concat</a></div><div class="ttdeci">char * string_concat(char *res, int max_length, char *text,...)</div><div class="ttdoc">Concatenates a NULL terminated list of string arguments.</div></div>
<div class="ttc" id="agroup__utils_html_ga41163cf3a95e702f12506cd54ba3c70c"><div class="ttname"><a href="group__utils.html#ga41163cf3a95e702f12506cd54ba3c70c">string_list_clone</a></div><div class="ttdeci">char ** string_list_clone(char **list)</div><div class="ttdoc">Replicates a NULL terminated list of strings.</div></div>
<div class="ttc" id="agroup__utils_html_ga0ca31b2a579b6ef7c75c41324ed5367c"><div class="ttname"><a href="group__utils.html#ga0ca31b2a579b6ef7c75c41324ed5367c">string_num_columns</a></div><div class="ttdeci">int string_num_columns(char *text)</div><div class="ttdoc">Maximum number of columns of a string (not counting character \n'`).</div></div>
<div class="ttc" id="agroup__utils_html_ga42702791e6da9510e4f44f33d2dad8f1"><div class="ttname"><a href="group__utils.html#ga42702791e6da9510e4f44f33d2dad8f1">hide_cursor</a></div><div class="ttdeci">void hide_cursor()</div><div class="ttdoc">Hides the terminal cursor.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="utils_8h.html">utils.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,186 @@
/**
* \defgroup DbC DbC
* \ingroup concurrency-library
* \brief Design-by-Contract module.
*
* \details This module gives a better support for DbC in C++.
*
* When compared with `assert.h` this module offers the following functionalities:
* - separates different assertion types (preconditions, postconditions, invariants, and others);
* - augments assert with error message strings;
* - implements two error handling policies:
* -# EXIT_POLICY (default): describes the failed assertion in `stderr` (with the identification
* and the precise location of the assertion), generates a segmentation fault
* (enabling a stack trace within a debugger like `gdb`), and exits program execution;
* -# EXCEPTION_POLICY: throws a `char*` exception with the description of the failed assertion.
*
* Debug settings:
* - As happens with `assert.h`, this module accepts <b>`NDEBUG`</b> macro definition to disable all
* assertion run-time verification.
* - Also, each assertion type verification can be disabled with macros: <b>`NDEBUG_CHECKS`</b>,
* <b>`NDEBUG_PRECONDITIONS`</b>, <b>`NDEBUG_POSTCONDITIONS`</b>, and <b>`NDEBUG_INVARIANTS`</b>.
* - A special (high priority) macro named <b>`DEBUG_ONLY_PRECONDITIONS`</b> ensures that only precondition
* debugging remains active (regardless of other debug definitions).
*
* \author Miguel Oliveira e Silva, 2018
* @{
**/
/*!
* \file
* \brief Design-by-Contract module.
*/
#ifndef DBC_H
#define DBC_H
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "utils.h"
#ifdef NDEBUG
#define NDEBUG_CHECKS
#define NDEBUG_PRECONDITIONS
#define NDEBUG_POSTCONDITIONS
#define NDEBUG_INVARIANTS
#endif
#ifdef DEBUG_ONLY_PRECONDITIONS
#ifdef NDEBUG_PRECONDITIONS
#undef NDEBUG_PRECONDITIONS
#endif
#ifndef NDEBUG_CHECKS
#define NDEBUG_CHECKS
#endif
#ifndef NDEBUG_POSTCONDITIONS
#define NDEBUG_POSTCONDITIONS
#endif
#ifndef NDEBUG_INVARIANTS
#define NDEBUG_INVARIANTS
#endif
#endif
// check:
#ifdef NDEBUG_CHECKS
#define check(condition, message)
#else
#if defined __cplusplus && defined EXCEPTION_POLICY
#define check(condition, message) \
if (!(condition)) \
throw string_concat(NULL, 0, (char*)"Assertion fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
#else // EXIT_POLICY (default)
/**
* \brief Checks the verification of an general algorithm assertion.
*
* \details This assertion verification can be disabled at compile time by defining the macro <b>`NDEBUG_CHECKS`</b>.
*
* \param [in] condition expression to assert its truthness
* \param [in] message text to be presented with error information when the assertion fails
*/
#define check(condition, message) \
if (!(condition)) \
do { \
fprintf (stderr, "Assertion fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
*((int*)0) = 0; \
abort (); \
} while (0)
#endif
#endif
// precondition:
#ifdef NDEBUG_PRECONDITIONS
#define require(condition, message)
#else
#if defined __cplusplus && defined EXCEPTION_POLICY
#define require(condition, message) \
if (!(condition)) \
throw string_concat(NULL, 0, (char*)"Precondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
#else // EXIT_POLICY (default)
/**
* \brief Checks the verification of a precondition.
*
* \details This assertion verification can be disabled at compile time by defining the macro <b>`NDEBUG_PRECONDITIONS`</b>.
*
* \param [in] condition expression to assert its truthness
* \param [in] message text to be presented with error information when the assertion fails
*/
#define require(condition, message) \
if (!(condition)) \
do { \
fprintf (stderr, "Precondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
*((int*)0) = 0; \
abort (); \
} while (0)
#endif
#endif
// postcondition:
#ifdef NDEBUG_POSTCONDITIONS
#define ensure(condition, message)
#else
#if defined __cplusplus && defined EXCEPTION_POLICY
#define ensure(condition, message) \
if (!(condition)) \
throw string_concat(NULL, 0, (char*)"Postcondition fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
#else // EXIT_POLICY (default)
/**
* \brief Checks the verification of a postcondition.
*
* \details This assertion verification can be disabled at compile time by defining the macro <b>`NDEBUG_POSTCONDITIONS`</b>.
*
* \param [in] condition expression to assert its truthness
* \param [in] message text to be presented with error information when the assertion fails
*/
#define ensure(condition, message) \
if (!(condition)) \
do { \
fprintf (stderr, "Postcondition fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
*((int*)0) = 0; \
abort (); \
} while (0)
#endif
#endif
//
// invariant:
#ifdef NDEBUG_INVARIANTS
#define invariant(condition, message)
#else
#if defined __cplusplus && defined EXCEPTION_POLICY
#define invariant(condition, message) \
if (!(condition)) \
throw string_concat(NULL, 0, (char*)"Invariant fail", message[0] ? (char*)": " : (char*)"", message, (char*)", assertion: \"", #condition, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL)
#else // EXIT_POLICY (default)
/**
* \brief Checks the verification of an invariant.
*
* \details This assertion verification can be disabled at compile time by defining the macro <b>`NDEBUG_INVARIANTS`</b>.
*
* \param [in] condition expression to assert its truthness
* \param [in] message text to be presented with error information when the assertion fails
*/
#define invariant(condition, message) \
if (!(condition)) \
do { \
fprintf (stderr, "Invariant fail%s%s, assertion: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
message[0] ? ": " : "", message, #condition, __FUNCTION__, __LINE__ , __FILE__); \
*((int*)0) = 0; \
abort (); \
} while (0)
#endif
#endif
#endif
/* ************************************************** */
/**
* @} close group DbC
**/
/* ************************************************** */

View File

@ -0,0 +1,531 @@
/**
* \defgroup process process
* \ingroup concurrency-library
*
* \brief \ref process "Process", \ref sysV "System-V", and \ref posix_sem "POSIX libraries" wrapper module.
*
* \details This module removes defensive programming approach of native libraries.
*
* All implemented functions, have exactly the same arguments and/or result of the original function,
* with the exception of returning an error indication.
*
* Errors are handled by the implementation of two policies:
* -# EXIT_POLICY (default): describes the failed call in `stderr` (with the identification
* of the errno error, and the precise location the call), generates a segmentation fault
* (enabling a stack trace within a debugger like `gdb`), and exits program execution;
* -# EXCEPTION_POLICY: throws a `int` exception with the (errno) status error returned by the original function.
*
* <p><b>System V group of IPC mechanisms</b>
*
* @anchor sysV
*
* There are three resources for IPC: \ref shm "shared memory", \ref sem "semaphores", and \ref msg "message queues".
*
* Common to all, is resource handling through a non-negative integer identifier.
* After proper creation and initialization, different processes can establish communication
* using the same integer identifier.
*
* A key (`key_t`) is used to establish this common identifier.
* There are three possibilities to define a key:
*
* 1. `IPC_PRIVATE`: In this case an alternative channel to communicate the identifier
* between processes is necessary (parent/child fork, file system, ...).
*
* 2. A fixed predetermined key number (may collide with other existing keys).
*
* 3. `ftok` function to generate a key from a path and a byte integer.
*
* Usage:
*
* - create new identifier: `msgget`/`semget`/`shmget` with a key and `IPC_CREAT` and `IPC_EXCL` flags
* - get existing identifier: `msgget`/`semget`/`shmget` with a key and other arguments as zero
*
* \author Miguel Oliveira e Silva, 2017-2018
* @{
**/
/*!
* \file
*
* \brief \ref process "Process", \ref sysV "System-V", and \ref posix_sem "POSIX libraries" wrapper module.
* \remarks Removes defensive programming from native libraries
**/
#ifndef PROCESS_H
#define PROCESS_H
#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <signal.h>
//#define EXCEPTION_POLICY
//#define EXIT_POLICY // DEFAULT
/** @name Process handling
* @anchor process @{
*/
/**
* \brief `fork` wrapper function.
*
* \details Other documentation in @verbatim man 2 fork @endverbatim
*
* @see https://man.cx/fork(2)
*/
pid_t pfork(void);
/**
* \brief `wait` wrapper function.
*
* \details Other documentation in @verbatim man 2 wait @endverbatim
*
* @see https://man.cx/wait(2)
*/
pid_t pwait(int *status);
/**
* \brief `waitpid` wrapper function.
*
* \details Other documentation in @verbatim man 2 waitpid @endverbatim
*
* @see https://man.cx/waitpid(2)
*/
pid_t pwaitpid(pid_t pid, int *status, int options);
/**
* \brief `kill` wrapper function.
*
* \details Other documentation in @verbatim man 2 kill @endverbatim
*
* @see https://man.cx/kill(2)
*/
void pkill(pid_t pid, int sig);
/**
* \brief `execl` wrapper function.
*
* \details Other documentation in @verbatim man 3 execl @endverbatim
*
* @see https://man.cx/execl(3)
*/
void pexecl(const char *pathname, const char *arg, ... /* (char *) NULL */);
/**
* \brief `sigaction` wrapper function.
*
* \details Other documentation in @verbatim man 2 sigaction @endverbatim
*
* @see https://man.cx/sigaction(2)
*/
void psigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
/** @} */
/** @name System V - shared memory
* @anchor shm
*
* \par <b>Example</b>
* @code
#include <process.h> // #include <sys/shm.h>
...
int shmid;
// creation:
shmid = pshmget(key, size, 0600 | IPC_CREAT | IPC_EXCL);
// or, use existing:
shmid = pshmget(key, 0, 0);
...
// attach shm to pointer address:
void* p = pshmat(shmid, NULL, 0);
...
// detach shm from pointer address:
pshmdt(p);
...
// destroy shm:
pshmctl(shmid, IPC_RMID, NULL);
@endcode
*
* @{
*/
/**
* \brief `shmget` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD>(size > 0) || !(shmflg & IPC_CREAT)</DD>
* </DL>
*
* \details Other documentation in @verbatim man 2 shmget @endverbatim
*
* @see https://man.cx/shmget(2)
*/
int pshmget(key_t key, size_t size, int shmflg);
/**
* \brief `shmctl` wrapper function.
*
* \details Other documentation in @verbatim man 2 shmctl @endverbatim
*
* @see https://man.cx/shmctl(2)
*/
int pshmctl(int shmid, int cmd, struct shmid_ds *buf);
/**
* \brief `shmat` wrapper function.
*
* \details Other documentation in @verbatim man 2 shmat @endverbatim
*
* @see https://man.cx/shmat(2)
*/
void *pshmat(int shmid, const void *shmaddr, int shmflg);
/**
* \brief `shmdt` wrapper function.
*
* \details Other documentation in @verbatim man 2 shmdt @endverbatim
*
* @see https://man.cx/shmdt(2)
*/
void pshmdt(const void *shmaddr);
/** @} */
/** @name System V - semaphores
* @anchor sem
*
* \par <b>Example</b>
* @code
#include <process.h> // #include <sys/sem.h>
...
int semid;
// creation:
semid = psemget(key, 1, 0600 | IPC_CREAT | IPC_EXCL); // 1 semaphore!
// or, use existing:
semid = psemget(key, 0, 0);
...
// decrement:
struct sembuf down = {0, -1, 0};
psemop(semid, &down, 1);
// or, simply use provided function:
psem_down(semid, 0); // NOTE: there is no sem_down in default library!
...
// increment:
struct sembuf up = {0, 1, 0};
psemop(semid, &up, 1);
// or, simply use provided function:
psem_up(semid, 0); // NOTE: there is no sem_up in default library!
...
// destroy sem 0:
psemctl(semid, 0, IPC_RMID, NULL);
@endcode
*
* @{
*/
/**
* \brief `semget` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>nsems > 0</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 2 semget @endverbatim
*
* @see https://man.cx/semget(2)
*/
int psemget(key_t key, int nsems, int semflg);
/**
* \brief `semctl` wrapper function.
*
* \details Other documentation in @verbatim man 2 semctl @endverbatim
*
* @see https://man.cx/semctl(2)
*/
int psemctl(int semid, int semnum, int cmd);
int psemctl(int semid, int semnum, int cmd, void *u);
/**
* \brief `semop` wrapper function.
*
* \details Other documentation in @verbatim man 2 semop @endverbatim
*
* @see https://man.cx/semop(2)
*/
void psemop(int semid, struct sembuf *sops, size_t nsops);
/**
* \brief Increment a semaphore (uses psemop()).
*/
void psem_up(int semid, short unsigned int index);
/**
* \brief Decrements a semaphore (uses psemop()).
*/
void psem_down(int semid, short unsigned int index);
/**
* \brief Decrements atomically two semaphores in a System V semaphore array (uses psemop()).
*/
void psem_down2(int semid, short unsigned int index1, unsigned int index2);
/** @} */
/** @name System V - message queues
* @anchor msg
*
* \par <b>Example</b>
* @code
#include <process.h> // #include <sys/msg.h>
...
typedef struct Item
{
...
} Item;
typedef struct Message
{
long type;
Item item;
} Message;
...
int msgid;
// creation:
msgid = pmsgget(key, 0600 | IPC_CREAT | IPC_EXCL);
// or, use existing:
msgid = pmsgget(key, 0);
...
Message msg;
// send msg:
msg = ...;
pmsgsnd(msgid, &msg, sizeof(Item), 0);
...
// receive msg:
pmsgrcv(msgid, &msg, sizeof(Item), type, 0);
...
// destroy msg:
pmsgctl(msgid, IPC_RMID, NULL);
@endcode
*
* @{
*/
/**
* \brief `msgget` wrapper function.
*
* \details Other documentation in @verbatim man 2 msgget @endverbatim
*
* @see https://man.cx/msgget(2)
*/
int pmsgget(key_t key, int msgflg);
/**
* \brief `msgctl` wrapper function.
*
* \details Other documentation in @verbatim man 2 msgctl @endverbatim
*
* @see https://man.cx/msgctl(2)
*/
int pmsgctl(int msqid, int cmd, struct msqid_ds *buf);
/**
* \brief `msgsnd` wrapper function.
*
* \details Other documentation in @verbatim man 2 msgsnd @endverbatim
*
* @see https://man.cx/msgsnd(2)
*/
void pmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
/**
* \brief `msgrcv` wrapper function.
*
* \details Other documentation in @verbatim man 2 msgrcv @endverbatim
*
* @see https://man.cx/msgrcv(2)
*/
size_t pmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
/** @} */
/** @name POSIX semaphores
* @anchor posix_sem @{
*/
// named:
/**
* \brief `sem_open` wrapper function.
*
* \details Other documentation in @verbatim man 3 sem_open @endverbatim
*
* @see https://man.cx/sem_open(3)
*/
sem_t *psem_open(const char *name, int oflag);
sem_t *psem_open(const char *name, int oflag, mode_t mode, unsigned int value);
/**
* \brief `sem_close` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_close @endverbatim
*
* @see https://man.cx/sem_close(3)
*/
void psem_close(sem_t *sem);
/**
* \brief `sem_unlink` wrapper function.
*
* \details Other documentation in @verbatim man 3 sem_unlink @endverbatim
*
* @see https://man.cx/sem_unlink(3)
*/
void psem_unlink(const char *name);
// unnamed:
/**
* \brief `sem_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_init @endverbatim
*
* @see https://man.cx/sem_init(3)
*/
void psem_init(sem_t *sem, int pshared, unsigned int value);
/**
* \brief `sem_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_destroy @endverbatim
*
* @see https://man.cx/sem_destroy(3)
*/
void psem_destroy(sem_t *sem);
// named and unnamed:
/**
* \brief `sem_wait` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_wait @endverbatim
*
* @see https://man.cx/sem_wait(3)
*/
void psem_wait(sem_t *sem);
/**
* \brief `sem_trywait` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_trywait @endverbatim
*
* @see https://man.cx/sem_trywait(3)
*
* \return true (`!=0`) on success, false (`0`) if semaphore is zero
*/
int psem_trywait(sem_t *sem);
/**
* \brief `sem_timedwait` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_timedwait @endverbatim
*
* @see https://man.cx/sem_timedwait(3)
*
* \return true (`!=0`) on success, false (`0`) if timeout has expired before being able to decrement the semaphore
*/
int psem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
/**
* \brief `sem_post` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>sem != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 sem_post @endverbatim
*
* @see https://man.cx/sem_post(3)
*/
void psem_post(sem_t *sem);
/** @} */
/** @name UNIX pipes
* @anchor pipes @{
*/
/**
* \brief `pipe` wrapper function.
*
* \details Other documentation in @verbatim man 3 pipe @endverbatim
*
* @see https://man.cx/pipe
*/
void ppipe(int pipefd[2]);
/**
* \brief `popen` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>command != NULL</code></DD>
* <DD><code>type != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 popen @endverbatim
*
* @see https://man.cx/popen
*/
FILE *ppopen(const char *command, const char *type);
/**
* \brief `pclose` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>stream != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pclose @endverbatim
*
* @see https://man.cx/pclose
*/
void ppclose(FILE *stream);
/** @} */
#endif
/* ************************************************** */
/**
* @} close group process
**/
/* ************************************************** */

View File

@ -0,0 +1,665 @@
/**
* \defgroup thread thread
* \ingroup concurrency-library
* \brief POSIX threads library wrapper module.
*
* \details This module removes defensive programming approach of native POSIX threads library.
*
* All implemented functions, have exactly the same arguments and/or result of the original function,
* with the exception of returning an error indication.
*
* Errors are handled by the implementation of two policies:
* -# EXIT_POLICY (default): describes the failed call in `stderr` (with the identification
* of the errno error, and the precise location the call), generates a segmentation fault
* (enabling a stack trace within a debugger like `gdb`), and exits program execution;
* -# EXCEPTION_POLICY: throws a `int` exception with the (errno) status error returned by the original function.
*
* \author Miguel Oliveira e Silva, 2017-2018
*
* @{
**/
/*!
* \file
*
* \brief POSIX threads library wrapper module.
* \remarks Removes defensive programming from native libraries
**/
#ifndef THREAD_H
#define THREAD_H
#include <pthread.h>
//#define EXCEPTION_POLICY
//#define EXIT_POLICY // DEFAULT
/** @name Thread handling
*
* @details
*
* Variable type: `pthread_t`
*
* @anchor thread @{
*/
/**
* \brief `pthread_equal` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_equal @endverbatim
*
* @see https://man.cx/pthread_equal(3)
*/
int thread_equal(pthread_t t1, pthread_t t2);
/**
* \brief `pthread_create` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>t != NULL</code></DD><BR>
* <DD><code>thread_main != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_create @endverbatim
*
* @see https://man.cx/pthread_create(3)
*/
void thread_create(pthread_t* t, pthread_attr_t* attr, void *(*thread_main)(void*), void* arg);
/**
* \brief `pthread_self` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_self @endverbatim
*
* @see https://man.cx/pthread_self(3)
*/
pthread_t thread_self();
/**
* \brief `sched_yield` wrapper function.
*
* \details Other documentation in @verbatim man 3 sched_yield @endverbatim
*
* @see https://man.cx/sched_yield(3)
*/
void thread_sched_yield(void);
/**
* \brief `pthread_exit` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_exit @endverbatim
*
* @see https://man.cx/pthread_exit(3)
*/
void thread_exit(void *retval);
/**
* \brief `pthread_detach` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_detach @endverbatim
*
* @see https://man.cx/pthread_detach(3)
*/
void thread_detach(pthread_t thread);
/**
* \brief `pthread_join` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_join @endverbatim
*
* @see https://man.cx/pthread_join(3)
*/
void thread_join(pthread_t t, void** result);
/** @} */
/** @name Mutexes
*
* @details
*
* Variable type: `pthread_mutex_t`
*
* Initialization of mutexes can be static or dynamic.
*
* In static initialization the following initialization macros are suggested:
* - `PTHREAD_MUTEX_INITIALIZER` - standard initializer
* - `PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP` - initializer that ensures error checking
* - `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP` - for recursive mutexes (note that recursive mutexes should be avoid)
*
* Dynamic initialization is done by mutex_init() and mutex_destroy().
*
* @anchor mutex @{
*/
/**
* \brief `pthread_mutex_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutex_init @endverbatim
*
* @see https://man.cx/pthread_mutex_init(3)
*/
void mutex_init(pthread_mutex_t* pmtx, pthread_mutexattr_t* attr);
/**
* \brief `pthread_mutex_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutex_destroy @endverbatim
*
* @see https://man.cx/pthread_mutex_destroy(3)
*/
void mutex_destroy(pthread_mutex_t* pmtx);
/**
* \brief `pthread_mutex_lock` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutex_lock @endverbatim
*
* @see https://man.cx/pthread_mutex_lock(3)
*/
void mutex_lock(pthread_mutex_t* pmtx);
/**
* \brief `pthread_mutex_trylock` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutex_trylock @endverbatim
*
* @see https://man.cx/pthread_mutex_trylock(3)
*
* \return true (`!=0`) if lock succeeds, false (`0`) otherwise
*/
int mutex_trylock(pthread_mutex_t* pmtx);
/**
* \brief `pthread_mutex_unlock` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutex_unlock @endverbatim
*
* @see https://man.cx/pthread_mutex_unlock(3)
*/
void mutex_unlock(pthread_mutex_t* pmtx);
/** @} */
/** @name Condition variables
*
* @details
*
* Variable type: `pthread_cond_t`
*
* Initialization of condition variables can be static or dynamic.
*
* In static initialization the following initialization macros should be used:
* - `PTHREAD_COND_INITIALIZER` - standard initializer
*
* Dynamic initialization is done by cond_init() and cond_destroy().
*
* @anchor cvar @{
*/
/**
* \brief `pthread_cond_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_cond_init @endverbatim
*
* @see https://man.cx/pthread_cond_init(3)
*/
void cond_init(pthread_cond_t* pcvar, pthread_condattr_t* attr);
/**
* \brief `pthread_cond_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_cond_destroy @endverbatim
*
* @see https://man.cx/pthread_cond_destroy(3)
*/
void cond_destroy(pthread_cond_t* pcvar);
/**
* \brief `pthread_cond_wait` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD><BR>
* <DD><code>pmtx != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_cond_wait @endverbatim
*
* @see https://man.cx/pthread_cond_wait(3)
*/
void cond_wait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx);
/**
* \brief `pthread_cond_timedwait` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD><BR>
* <DD><code>pmtx != NULL</code></DD><BR>
* <DD><code>abstime != NULL</code></DD>
* </DL>
*
* \return true (`!=0`) if condition variable was signaled, false (`0`) it time out has expired.
*
* \details Other documentation in @verbatim man 3 pthread_cond_timedwait @endverbatim
*
* @see https://man.cx/pthread_cond_wait(3)
*/
int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, const struct timespec *abstime);
/**
* \brief `pthread_cond_timedwait` wrapper function accepting relative time (in microseconds) instead of absolute time.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD><BR>
* <DD><code>pmtx != NULL</code></DD><BR>
* <DD><code>relative_time_us > 0L</code></DD>
* </DL>
*
* \return true (`!=0`) if condition variable was signaled, false (`0`) it time out has expired.
*
* \details Documentation in @verbatim man 3 pthread_cond_timedwait @endverbatim
*
* @see https://man.cx/pthread_cond_wait(3)
*/
int cond_timedwait(pthread_cond_t* pcvar, pthread_mutex_t* pmtx, long relative_time_us);
/**
* \brief `pthread_cond_signal` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_cond_signal @endverbatim
*
* @see https://man.cx/pthread_cond_signal(3)
*/
void cond_signal(pthread_cond_t* pcvar);
/**
* \brief `pthread_cond_broadcast` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pcvar != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_cond_broadcast @endverbatim
*
* @see https://man.cx/pthread_cond_broadcast(3)
*/
void cond_broadcast(pthread_cond_t* pcvar);
/** @} */
/** @name One-time initialization
*
* @details
*
* Variable type: `pthread_once_t`
*
* POSIX thread library support a mechanism that ensures a one-time execution of a function.
* It does it through `pthread_once_t` variables, and by passing a callback function
* (in C/C++ is simply a function pointer).
*
* \par <b>Example</b>
* @verbatim
void once_init_routine(void) { ... }
...
pthread_once_t once_control = PTHREAD_ONCE_INIT;
thread_once(&once_control, &once_init_routine); // one time execution over pthread_once_t
// variable is guaranteed, regardless of the
// number of threads that execute over that
// variable.
@endverbatim
*
* @anchor thread_once @{
*/
/**
* \brief `pthread_once` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>once_control != NULL</code></DD><BR>
* <DD><code>init_routine != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_once @endverbatim
*
* @see https://man.cx/pthread_once(3)
*/
void thread_once(pthread_once_t *once_control, void (*init_routine) (void));
/** @} */
/** @name Thread-specific data
*
* @details
*
* Variable type: `pthread_key_t`
*
* Thread-specific data allows the definition of variable whose scope is limited to each thread.
* In practice, we will have a common variable, with a common access, but with different values for each thread.
*
* @anchor thread_specific @{
*/
/**
* \brief `pthread_key_create` wrapper function.
*
* \details This function should be executed once for each key (use thread_once()).
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>key != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_key_create @endverbatim
*
* @see https://man.cx/pthread_key_create(3)
*/
void thread_key_create(pthread_key_t *key, void (*destr_function) (void *));
/**
* \brief `pthread_key_delete` wrapper function.
*
* \details This function should be executed once for each key (use thread_once()).
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>key != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_key_delete @endverbatim
*
* @see https://man.cx/pthread_key_delete(3)
*/
void thread_key_delete(pthread_key_t key);
/**
* \brief `pthread_setspecific` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pointer != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_setspecific @endverbatim
*
* @see https://man.cx/pthread_setspecific(3)
*/
void thread_setspecific(pthread_key_t key, void* pointer);
/**
* \brief `pthread_getspecific` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>key != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_getspecific @endverbatim
*
* @see https://man.cx/pthread_getspecific(3)
*/
void* thread_getspecific(pthread_key_t key);
/** @} */
/** @name Mutex attributes
*
* @details
*
* Variable type: `pthread_mutexattr_t`
*
* @anchor mutex_attr @{
*/
/**
* \brief `pthread_mutexattr_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutexattr_init @endverbatim
*
* @see https://man.cx/pthread_mutexattr_init(3)
*/
void mutexattr_init(pthread_mutexattr_t *attr);
/**
* \brief `pthread_mutexattr_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutexattr_destroy @endverbatim
*
* @see https://man.cx/pthread_mutexattr_destroy(3)
*/
void mutexattr_destroy(pthread_mutexattr_t *attr);
/**
* \brief `pthread_mutexattr_settype` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutexattr_settype @endverbatim
*
* @see https://man.cx/pthread_mutexattr_settype(3)
*/
void mutexattr_settype(pthread_mutexattr_t *attr, int type);
/**
* \brief `pthread_mutexattr_gettype` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD><BR>
* <DD><code>kind != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_mutexattr_gettype @endverbatim
*
* @see https://man.cx/pthread_mutexattr_gettype(3)
*/
void mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);
/** @} */
/** @name Condition variables attributes
*
* @details
*
* Variable type: `pthread_condattr_t`
*
* @anchor cond_attr @{
*/
/**
* \brief `pthread_condattr_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_condattr_init @endverbatim
*
* @see https://man.cx/pthread_condattr_init(3)
*/
void condattr_init(pthread_condattr_t *attr);
/**
* \brief `pthread_condattr_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_condattr_destroy @endverbatim
*
* @see https://man.cx/pthread_condattr_destroy(3)
*/
void condattr_destroy(pthread_condattr_t *attr);
/** @} */
/** @name Thread attributes
*
* @details
*
* Variable type: `pthread_attr_t`
*
* @anchor thread_attr @{
*/
/**
* \brief `pthread_attr_init` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_attr_init @endverbatim
*
* @see https://man.cx/pthread_attr_init(3)
*/
void thread_attr_init(pthread_attr_t *attr);
/**
* \brief `pthread_attr_destroy` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_attr_destroy @endverbatim
*
* @see https://man.cx/pthread_attr_destroy(3)
*/
void thread_attr_destroy(pthread_attr_t *attr);
/**
* \brief `pthread_attr_setdetachstate` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD><BR>
* <DD><code>detachstate == PTHREAD_CREATE_DETACHED || detachstate == PTHREAD_CREATE_JOINABLE</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_attr_setdetachstate @endverbatim
*
* @see https://man.cx/pthread_attr_setdetachstate(3)
*/
void thread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
/**
* \brief `pthread_attr_getdetachstate` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>attr != NULL</code></DD><BR>
* <DD><code>pdetachstate != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_attr_getdetachstate @endverbatim
*
* @see https://man.cx/pthread_attr_getdetachstate(3)
*/
void thread_attr_getdetachstate(const pthread_attr_t *attr, int *pdetachstate);
/** @} */
/** @name Cancellation
*
* @anchor thread_cancellation @{
*/
/**
* \brief `pthread_cancel` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_cancel @endverbatim
*
* @see https://man.cx/pthread_cancel(3)
*/
void thread_cancel(pthread_t thread);
/**
* \brief `pthread_setcancelstate` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>state == PTHREAD_CANCEL_ENABLE || state == PTHREAD_CANCEL_DISABLE</code></DD><BR>
* <DD><code>oldstate != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_setcancelstate @endverbatim
*
* @see https://man.cx/pthread_setcancelstate(3)
*/
void thread_setcancelstate(int state, int *oldstate);
/**
* \brief `pthread_setcanceltype` wrapper function.
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>type == PTHREAD_CANCEL_DEFERRED || type == PTHREAD_CANCEL_ASYNCHRONOUS</code></DD><BR>
* <DD><code>oldtype != NULL</code></DD>
* </DL>
*
* \details Other documentation in @verbatim man 3 pthread_setcanceltype @endverbatim
*
* @see https://man.cx/pthread_setcanceltype(3)
*/
void thread_setcanceltype(int type, int *oldtype);
/**
* \brief `pthread_testcancel` wrapper function.
*
* \details Other documentation in @verbatim man 3 pthread_testcancel @endverbatim
*
* @see https://man.cx/pthread_testcancel(3)
*/
void thread_testcancel(void);
/** @} */
#endif
/* ************************************************** */
/**
* @} close group thread
**/
/* ************************************************** */

View File

@ -0,0 +1,658 @@
/**
* \defgroup utils utils
* \ingroup concurrency-library
* \brief Useful common functions and macros.
* \author Miguel Oliveira e Silva, 2017-2018
* @{
**/
/*!
* \file
*
* \brief Useful common functions and macros.
**/
#ifndef UTILS_H
#define UTILS_H
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "dbc.h"
/** @name String concatenation in stack memory
* @anchor concat @{
*/
/**
* \brief Concatenates two strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
*
* \return the concatenated string
*/
#define concat_2str(str1,str2) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
__res__; \
})
/**
* \brief Concatenates three strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
* \param [in] str3 string 3
*
* \return the concatenated string
*/
#define concat_3str(str1,str2,str3) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
strcat(__res__, s3); \
__res__; \
})
/**
* \brief Concatenates four strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
* \param [in] str3 string 3
* \param [in] str4 string 4
*
* \return the concatenated string
*/
#define concat_4str(str1,str2,str3,str4) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
strcat(__res__, s3); \
strcat(__res__, s4); \
__res__; \
})
/**
* \brief Concatenates five strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
* \param [in] str3 string 3
* \param [in] str4 string 4
* \param [in] str5 string 5
*
* \return the concatenated string
*/
#define concat_5str(str1,str2,str3,str4,str5) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
strcat(__res__, s3); \
strcat(__res__, s4); \
strcat(__res__, s5); \
__res__; \
})
/**
* \brief Concatenates six strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
* \param [in] str3 string 3
* \param [in] str4 string 4
* \param [in] str5 string 5
* \param [in] str6 string 6
*
* \return the concatenated string
*/
#define concat_6str(str1,str2,str3,str4,str5,str6) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
strcat(__res__, s3); \
strcat(__res__, s4); \
strcat(__res__, s5); \
strcat(__res__, s6); \
__res__; \
})
/**
* \brief Concatenates seven strings in the stack memory (thus it cannot be implemented in a function).
*
* \details A `NULL` reference is treated as an empty string.
*
* \param [in] str1 string 1
* \param [in] str2 string 2
* \param [in] str3 string 3
* \param [in] str4 string 4
* \param [in] str5 string 5
* \param [in] str6 string 6
* \param [in] str7 string 7
*
* \return the concatenated string
*/
#define concat_7str(str1,str2,str3,str4,str5,str6,str7) \
({ \
char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \
char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \
strcpy(__res__, s1); \
strcat(__res__, s2); \
strcat(__res__, s3); \
strcat(__res__, s4); \
strcat(__res__, s5); \
strcat(__res__, s6); \
strcat(__res__, s7); \
__res__; \
})
/** @} */
/**
* \brief Converts an `int` value to a stack allocated string.
*
* \param [in] num integer number
*
* \return the converted string
*/
#define int2str(num) \
({ \
char* __res__ = (char*)alloca(numDigits((int)num)+1); \
sprintf(__res__, "%d", (int)num); \
__res__; \
})
/**
* \brief Converts an `int` value to a stack allocated string.
*
* \details If necessary, fills the result string with left zeros.
*
* \param [in] num integer number
* \param [in] len minimum length of result string
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>len > 0</code></DD>
* </DL>
*
* \return the converted string
*/
#define int2nstr(num, len) \
({ \
require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
int d = numDigits((int)num); \
if (len > d) \
d = len; \
char* __res__ = (char*)alloca(d+1); \
sprintf(__res__, "%0*d", d, (int)num); \
__res__; \
})
/**
* \brief Converts an `long` value to a stack allocated string.
*
* \param [in] num long integer number
*
* \return the converted string
*/
#define long2str(num) \
({ \
char* __res__ = (char*)alloca(numDigits((long)num)+1); \
sprintf(__res__, "%ld", (long)num); \
__res__; \
})
/**
* \brief Converts an `long` value to a stack allocated string.
*
* \details If necessary, fills the result string with left zeros.
*
* \param [in] num long integer number
* \param [in] len minimum length of result string
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>len > 0</code></DD>
* </DL>
*
* \return the converted string
*/
#define long2nstr(num, len) \
({ \
require (len > 0, concat_3str("invalid length value (", int2str(len), ")")); \
int d = numDigits((int)num); \
if (len > d) \
d = len; \
char* __res__ = (char*)alloca(d+1); \
sprintf(__res__, "%0*ld", d, (long)num); \
__res__; \
})
/**
* \brief Converts an `int` percentage to a stack allocated string.
*
* \param [in] percentage an integer number with a percentage value
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>percentage >= 0 && percentage <= 100</code></DD>
* </DL>
*
* \return the converted string
*/
#define perc2str(percentage) \
({ \
require (percentage >= 0 && percentage <= 100, concat_3str("invalid percentage value (", int2str(percentage), ")")); \
char* __res__ = (char*)alloca(4+1); \
sprintf(__res__, "%3d%%", (int)percentage); \
__res__; \
})
/**
* \brief Determines the length of all strings passed as a NULL terminated variable list of arguments (vargs).
*
* \param [in] first the argument that precedes the vargs argument list.
*
* \return the sum of the length of all strings (not counting terminator `'\0'`)
*/
#define length_vargs_string_list(first) \
({ \
int __res__ = 0; \
va_list ap; \
va_start(ap, first); \
char* t = first; \
while (t != NULL) \
{ \
__res__ += strlen(t); \
t = va_arg(ap, char*); \
} \
va_end(ap); \
__res__; \
})
#if defined __cplusplus && defined EXCEPTION_POLICY
#define not_null(pnt) \
({ \
if ((pnt) == NULL) \
throw string_concat(NULL, 0, (char*)"Null pointer error", (char*)", pointer: \"", #pnt, (char*)"\", function: \"", __FUNCTION__, (char*)"\":", int2str(__LINE__), (char*)", file: \"", __FILE__, (char*)"\"\n", NULL); \
pnt; \
})
#else
/**
* \brief Checks if address is not `NULL`, before its application.
*
* \details This macro is a non-defensive implementation of a null pointer verification.
* It implements two error handling policies:
* - EXIT_POLICY (default): describes the error in `stderr` (with the identification
* and the precise location of the failure), generates a segmentation fault
* (enabling a stack trace within a debugger like `gdb`), and exits program execution;
* - EXCEPTION_POLICY: throws a `char*` exception with the description of the failure.
*
* \par <b>Example</b>
* @skipline\code
* not_null(pnt)->something();
* \endcode
*
* \param [in] pnt memory address
*/
#define not_null(pnt) \
({ \
if ((pnt) == NULL) \
{ \
fprintf (stderr, "Null pointer error, pointer: \"%s\", function: \"%s\":%d, file: \"%s\"\n", \
#pnt, __FUNCTION__, __LINE__ , __FILE__); \
*((int*)0) = 0; \
abort (); \
} \
pnt; \
})
#endif
/**
* \brief A replacement for `malloc` function.
*
* \details This function is a non-defensive implementation of `malloc` error verification.
* It implements two error handling policies:
* - EXIT_POLICY (default): describes the error in `stderr` (with the identification
* and the precise location of the failure), generates a segmentation fault
* (enabling a stack trace within a debugger like `gdb`), and exits program execution;
* - EXCEPTION_POLICY: throws a `char*` exception with the description of the failure.
*
* \param [in] size number of bytes to be allocated
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>size >= 0</code></DD>
* </DL>
*
* \return address of the allocated memory
*/
void* mem_alloc(int size);
/**
* \brief A replacement for `free` function.
*
* \param [in] pnt memory address to be freed
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>pnt != NULL</code></DD>
* </DL>
*/
void mem_free(void* pnt);
/**
* \brief Replicates a string.
*
* \details The memory is allocated in the heap (using mem_alloc()).
*
* \param [in] str string to be replicated
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>str != NULL</code></DD>
* </DL>
*
* \return pointer to the replicated string
*/
char* string_clone(char* str);
/**
* \brief Number of lines of a string.
*
* \param [in] text string text to process
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD>
* </DL>
*
* \return number of counted lines
*/
int string_num_lines(char* text);
/**
* \brief Maximum number of columns of a string (not counting character `'\\n'`).
*
* \param [in] text string text to process
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD>
* </DL>
*
* \return maximum number of counted columns
*/
int string_num_columns(char* text);
/**
* \brief Counts the number of occurrences of an UTF8 character in a text.
*
* \param [in] text string text to process
* \param [in] ch string containing the sequence of bytes (one or more) of an UTF8 single character
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD><BR>
* <DD><code>ch != NULL && num_chars_utf8(ch) == 1</code></DD>
* </DL>
*
* \return number of counted occurrences
*/
int string_count_char(char* text, char* ch);
/**
* \brief Tests if a string starts with a prefix.
*
* \param [in] text string text to process
* \param [in] prefix string to test if is a prefix
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD><BR>
* <DD><code>prefix != NULL</code></DD>
* </DL>
*
* \return true (`!=0`) if prefix starts text, false (`0`) otherwise
*/
int string_starts_with(char* text, char* prefix);
/**
* \brief Tests if a string ends with a suffix.
*
* \param [in] text string text to process
* \param [in] suffix string to test if is a suffix
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD><BR>
* <DD><code>suffix != NULL</code></DD>
* </DL>
*
* \return true (`!=0`) if suffix ends text, false (`0`) otherwise
*/
int string_ends_with(char* text, char* suffix);
/**
* \brief Concatenates a `NULL` terminated list of string arguments.
*
* \details
* This function treats all vargs arguments as strings (`char*`),
* and requires that the list is terminated with a NULL argument.
*
* It allocates memory in heap (using mem_alloc()) if `NULL`
* is passed in the `res` argument.
*
* \param [in,out] res address of result string (if not `NULL`)
* \param [in] max_length `res` input argument maximum length (not counting terminator `'\0'`), only applies if `(res != NULL)`
* \param [in] text the first string to be used in concatenation
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>text != NULL</code></DD><BR>
* <DD><code>res == NULL || (max_length > 0 && length_vargs_string_list(text) <= max_length)</code></DD>
* </DL>
*
* \return the concatenated string
*/
char* string_concat(char* res, int max_length, char* text, ...);
/**
* \brief Generates a random boolean value.
*
* \details
* This function generates boolean values with defined probabilities
* for true (`!=0`) and false (`0`) values.
*
* \param [in] trueProb probability (in interval `[0;100]`).
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>trueProb >= 0 && trueProb <= 100</code></DD>
* </DL>
*
* \return the random boolean value
*/
int random_boolean(int trueProb);
/**
* \brief Generates a random integer value within a given interval.
*
* \details
* This function generates integer values in the interval `[min;max]`with an uniform distribution for all values.
*
* \param [in] min lower value of interval
* \param [in] max higher value of interval
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>max >= min</code></DD>
* </DL>
*
* \return the random integer value
*/
int random_int(int min, int max);
/**
* \brief Returns a random string from a given string list.
*
* \details
* This function stores the previous randomly selected string's (using the integer indexes of the string list)
* to disallow its repeated generation.
*
* \param [in] list list of strings to be selected (`NULL` terminated)
* \param [in,out] used indexes of strings already selected
* \param [in] length number of elements of lists `list` (not counting `NULL` entry) and `used`
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>list != NULL</code></DD><BR>
* <DD><code>used != NULL</code></DD>
* </DL>
*
* \return the random string
*/
char* random_string(char** list, int* used, int length);
/**
* \brief Clears the terminal.
*/
void clear_console();
/**
* \brief Moves the cursor to a position in terminal.
*
* \param [in] line position in the terminal
* \param [in] column position in the terminal
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>line >= 0 && column >= 0</code></DD>
* </DL>
*/
void move_cursor(int line,int column);
/**
* \brief Hides the terminal cursor.
*/
void hide_cursor();
/**
* \brief Shows the terminal cursor.
*/
void show_cursor();
/**
* \brief Number of elements of a `NULL` terminated list of strings.
*
* \param [in] list `NULL` terminated array of strings
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>list != NULL</code></DD>
* </DL>
*
* \return number of elements of list (not counting `NULL`)
*/
int string_list_length(char** list);
/**
* \brief Replicates a `NULL` terminated list of strings.
*
* \details The memory is allocated in the heap (using mem_alloc()).
*
* \param [in] list `NULL` terminated array of strings
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>list != NULL</code></DD>
* </DL>
*
* \return pointer to the replicated list
*/
char** string_list_clone(char** list);
/**
* \brief Frees the memory allocated to a `NULL` terminated list of strings.
*
* \details This function is totally compatible with string_list_clone(), and always returns `NULL`.
*
* \param [in] list `NULL` terminated array of strings
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>list != NULL</code></DD>
* </DL>
*
* \return `NULL`
*/
char** string_list_free(char** list);
int numDigits(int num);
/**
* \brief Converts an `int` value to a string.
*
* \details If necessary, fills the result string with left zeros.
* It allocates memory in heap (using mem_alloc()) if `NULL`
* is passed in the `res` argument.
*
* \param [in,out] res address of result string (if not `NULL`)
* \param [in] num integer number
* \param [in] len minimum length of result string (not counting terminator `'\0'`)
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>len >= numDigits(num)</code></DD>
* </DL>
*
* \return the converted string
*/
char* int2nstring(char* res, int num, int len);
/**
* \brief Converts an `int` percentage to a string.
*
* \details It allocates memory in heap (using mem_alloc()) if `NULL`
* is passed in the `res` argument.
*
* \param [in,out] res address of result string (if not `NULL`)
* \param [in] percentage an integer number with a percentage value
*
* <DL><DT><B>Precondition:</B></DT>
* <DD><code>percentage >= 0 && percentage <= 100</code></DD>
* </DL>
*
* \return the converted string (if not `NULL`, it returns `res`)
*/
char* percentage2string(char* res, int percentage);
#endif
/* ************************************************** */
/**
* @} close group utils
**/
/* ************************************************** */

Binary file not shown.

View File

@ -0,0 +1,171 @@
#include "pfifo.h"
#include <dbc.h>
#include <pthread.h>
#include <string.h>
static void print_pfifo(PriorityFIFO *pfifo);
static int empty_pfifo(PriorityFIFO *pfifo);
static int full_pfifo(PriorityFIFO *pfifo);
// TODO: point: initialization changes may be required in this function
void init_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
memset(pfifo->array, 0, sizeof(pfifo->array));
pfifo->inp = pfifo->out = pfifo->cnt = 0;
pfifo->is_closed = 0;
pthread_mutex_init(&pfifo->mutex, NULL);
pthread_cond_init(&pfifo->not_full, NULL);
pthread_cond_init(&pfifo->not_empty, NULL);
}
/* --------------------------------------- */
// TODO: point: termination changes may be required in this function
void term_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
require(is_closed_pfifo(pfifo), "FIFO open");
pthread_mutex_destroy(&pfifo->mutex);
pthread_cond_destroy(&pfifo->not_full);
pthread_cond_destroy(&pfifo->not_empty);
}
/* --------------------------------------- */
// TODO: point: synchronization changes may be required in this function
void insert_pfifo(PriorityFIFO *pfifo, int id, int priority) {
require(pfifo != NULL, "NULL pointer to FIFO");
require(id >= 0 && id <= MAX_ID, "invalid id");
require(priority > 0 && priority <= MAX_PRIORITY, "invalid priority value");
// printf("[insert_pfifo] value=%d, priority=%d, pfifo->inp=%d,
// pfifo->out=%d\n", id, priority, pfifo->inp, pfifo->out);
pthread_mutex_lock(&pfifo->mutex);
while(!pfifo->is_closed && full_pfifo(pfifo)) {
pthread_cond_wait(&pfifo->not_full, &pfifo->mutex);
}
require(pfifo->is_closed || !full_pfifo(pfifo), "open FIFO is full");
if (!pfifo->is_closed) {
int idx = pfifo->inp;
int prev = (idx + FIFO_MAXSIZE - 1) % FIFO_MAXSIZE;
while ((idx != pfifo->out) &&
(pfifo->array[prev].priority > priority)) {
// printf("[insert_pfifo] idx=%d, prev=%d\n", idx, prev);
pfifo->array[idx] = pfifo->array[prev];
idx = prev;
prev = (idx + FIFO_MAXSIZE - 1) % FIFO_MAXSIZE;
}
// printf("[insert_pfifo] idx=%d, prev=%d\n", idx, prev);
pfifo->array[idx].id = id;
pfifo->array[idx].priority = priority;
pfifo->inp = (pfifo->inp + 1) % FIFO_MAXSIZE;
pfifo->cnt++;
// printf("[insert_pfifo] pfifo->inp=%d, pfifo->out=%d\n", pfifo->inp,
// pfifo->out);
}
pthread_cond_broadcast(&pfifo->not_empty);
pthread_mutex_unlock(&pfifo->mutex);
}
/* --------------------------------------- */
// TODO: point: synchronization changes may be required in this function
int retrieve_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL, "NULL pointer to FIFO");
pthread_mutex_lock(&pfifo->mutex);
while(!pfifo->is_closed && empty_pfifo(pfifo)) {
pthread_cond_wait(&pfifo->not_empty, &pfifo->mutex);
}
require(pfifo->is_closed || !empty_pfifo(pfifo), "FIFO is empty");
int result = -1;
if (!pfifo->is_closed) {
check_valid_patient_id(pfifo->array[pfifo->out].id);
check_valid_priority(pfifo->array[pfifo->out].priority);
result = pfifo->array[pfifo->out].id;
pfifo->array[pfifo->out].id = INVALID_ID;
pfifo->array[pfifo->out].priority = INVALID_PRIORITY;
pfifo->out = (pfifo->out + 1) % FIFO_MAXSIZE;
pfifo->cnt--;
// update priority of all remaing elements (increase priority by one)
int idx = pfifo->out;
for (int i = 1; i <= pfifo->cnt; i++) {
if (pfifo->array[idx].priority > 1 &&
pfifo->array[idx].priority != INVALID_PRIORITY)
pfifo->array[idx].priority--;
idx = (idx + 1) % FIFO_MAXSIZE;
}
}
ensure((result >= 0 && result <= MAX_ID) || is_closed_pfifo(pfifo), "OPEN FIFO with an invalid id");
pthread_cond_broadcast(&pfifo->not_full);
pthread_mutex_unlock(&pfifo->mutex);
return result;
}
// TODO: point: synchronization changes may be required in this function
void close_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
require(!is_closed_pfifo(pfifo),
"FIFO already closed"); // a false value indicates a program error
pthread_mutex_lock(&pfifo->mutex);
pfifo->is_closed = 1;
pthread_cond_broadcast(&pfifo->not_empty);
pthread_mutex_unlock(&pfifo->mutex);
}
// TODO: point: synchronization changes may be required in this function
int is_closed_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
return pfifo->is_closed;
}
/* --------------------------------------- */
static int empty_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
return pfifo->cnt == 0;
}
/* --------------------------------------- */
static int full_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
return pfifo->cnt == FIFO_MAXSIZE;
}
/* --------------------------------------- */
static void print_pfifo(PriorityFIFO *pfifo) {
require(pfifo != NULL,
"NULL pointer to FIFO"); // a false value indicates a program error
int idx = pfifo->out;
for (int i = 1; i <= pfifo->cnt; i++) {
check_valid_patient_id(pfifo->array[pfifo->out].id);
check_valid_priority(pfifo->array[pfifo->out].priority);
printf("[%02d] value = %d, priority = %d\n", i, pfifo->array[idx].id,
pfifo->array[idx].priority);
idx = (idx + 1) % FIFO_MAXSIZE;
}
}

View File

@ -0,0 +1,47 @@
/*
* @brief A priority FIFO (implemented with a circular array),
* whose elements are pairs of integers, one being an
* non-negative id and the other a positive priority value.
*
* The following operations are defined:
* \li initialization
* \li destruction
* \li insertion of a value with a given priority
* \li retrieval of a value.
* \li close
* \li check is it is closed
**/
#ifndef PFIFO_H
#define PFIFO_H
#include "settings.h"
#include <stdint.h>
// TODO: point: uncomment the desired implementation
#include "thread.h"
// #include "process.h"
typedef struct {
struct {
int id; // element ID (works as an index in array all_patients)
int priority; // patient priority in FIFO
} array[FIFO_MAXSIZE];
int inp; ///< point of insertion (queue tail)
int out; ///< point of retrieval (queue head)
int cnt; ///< number of items stored
int is_closed; ///< true when closed
// TODO: point: if necessary, add synchronization declarations here
pthread_mutex_t mutex;
pthread_cond_t not_full;
pthread_cond_t not_empty;
} PriorityFIFO;
void init_pfifo(PriorityFIFO *pfifo);
void term_pfifo(PriorityFIFO *pfifo);
void insert_pfifo(PriorityFIFO *pfifo, int id, int priority);
int retrieve_pfifo(PriorityFIFO *pfifo);
void close_pfifo(PriorityFIFO *pfifo);
int is_closed_pfifo(PriorityFIFO *pfifo);
#endif

View File

@ -0,0 +1,96 @@
/**
* @brief Simulation parameter values.
*/
#ifndef SETTINGS_H
#define SETTINGS_H
#include <stdio.h>
#include <stdlib.h>
/**
* \brief maximum patient name length
*/
#define MAX_NAME 31
/**
* \brief maximum number of patients
*/
#define MAX_PATIENTS 100
/**
* \brief maximum number of nurses
*/
#define MAX_NURSES 20
/**
* \brief maximum number of doctors
*/
#define MAX_DOCTORS 20
/**
* \brief maximum time (in microseconds) in random waits
*/
#define MAX_WAIT 100000
/**
* \brief initial priority value for Manchester system colors
*/
#define RED 1
#define ORANGE 2
#define YELLOW 4
#define GREEN 8
#define BLUE 16
/**
* \brief maximum elements in FIFO
*/
#define FIFO_MAXSIZE 5
/**
* \brief maximum value accepted for an id
*/
#define MAX_ID (MAX_PATIENTS-1)
/**
* \brief invalid id number
*/
#define INVALID_ID 99999999
/**
* \brief maximum value accepted for a priority
*/
#define MAX_PRIORITY BLUE
/**
* \brief invalid priority number
*/
#define INVALID_PRIORITY 55555555
/**
* \brief patient id verification test
*/
#define check_valid_patient_id(id) do { if(id < 0 || id > MAX_ID) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid patient ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0)
/**
* \brief nurse id verification test
*/
#define check_valid_nurse_id(id) do { if(id < 0 || id >= MAX_NURSES) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid nurse ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0)
/**
* \brief doctor id verification test
*/
#define check_valid_doctor_id(id) do { if(id < 0 || id >= MAX_DOCTORS) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid doctor ID %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, id); exit(EXIT_FAILURE); } } while(0)
/**
* \brief priority verification test
*/
#define check_valid_priority(priority) do { if(priority < 1 || priority > MAX_PRIORITY) { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid priority %d!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, priority); exit(EXIT_FAILURE); } } while(0)
/**
* \brief patient name verification test
*/
#define check_valid_name(name) do { if(name[0] == '\0') { printf("\e[31;01m[%s, line %d, function %s] ERROR: invalid patient with name \"%s\"!\e[0m\n", __FILE__, __LINE__, __FUNCTION__, name); exit(EXIT_FAILURE); } } while(0)
#endif

Binary file not shown.

View File

@ -0,0 +1,374 @@
/**
* @file
*
* \brief A hospital pediatric urgency with a Manchester triage system.
*/
#include "pfifo.h"
#include "settings.h"
#include <iostream>
#include <libgen.h>
#include <math.h>
#include <pthread.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <thread.h>
#include <unistd.h>
#include <utils.h>
/* DO NOT CHANGE THE FOLLOWING VALUES, run program with option -h to set a
* different values */
static int npatients = 4; ///< number of patients
static int nnurses = 1; ///< number of triage nurses
static int ndoctors = 1; ///< number of doctors
#define USAGE \
"Synopsis: %s [options]\n" \
"\t----------+-----------------------------------------------------------" \
"--\n" \
"\t Option | Description " \
" \n" \
"\t----------+-----------------------------------------------------------" \
"--\n" \
"\t -p num | number of patients (dfl: %d, min: %d, max: %d) " \
" \n" \
"\t -n num | number of nurses (dfl: %d, min: %d, max: %d) " \
" \n" \
"\t -d num | number of doctors (dfl: %d, min: %d, max: %d) " \
" \n" \
"\t -h | this help " \
" \n" \
"\t----------+-----------------------------------------------------------" \
"--\n", \
basename(argv[0]), npatients, 1, MAX_PATIENTS, nnurses, 1, MAX_NURSES, \
ndoctors, 1, MAX_DOCTORS
// TODO: point: changes may be required in these date structures
/**
* \brief Patient data structure
*/
typedef struct {
char name[MAX_NAME + 1];
int done; // 0: waiting for consultation; 1: consultation finished
// TODO: point: if necessary, add new fields here
pthread_mutex_t mutex;
pthread_cond_t cond;
} Patient;
typedef struct {
int num_patients;
Patient all_patients[MAX_PATIENTS];
PriorityFIFO triage_queue;
PriorityFIFO doctor_queue;
// TODO: point: if necessary, add new fields here
} HospitalData;
HospitalData *hd = NULL;
// TODO: point: if necessary, add module variables here
/**
* \brief verification tests:
*/
#define check_valid_patient(id) \
do { \
check_valid_patient_id(id); \
check_valid_name(hd->all_patients[id].name); \
} while (0)
#define check_valid_nurse(id) \
do { \
check_valid_nurse_id(id); \
} while (0)
#define check_valid_doctor(id) \
do { \
check_valid_doctor_id(id); \
} while (0)
int random_manchester_triage_priority();
void new_patient(Patient *patient); // initializes a new patient
void random_wait();
/* ************************************************* */
// TODO: point: changes may be required to this function
void init_simulation(int np) {
printf("Initializing simulation\n");
hd = (HospitalData *)mem_alloc(sizeof(
HospitalData)); // mem_alloc is a malloc with NULL pointer verification
memset(hd, 0, sizeof(HospitalData));
hd->num_patients = np;
init_pfifo(&hd->triage_queue);
init_pfifo(&hd->doctor_queue);
}
/* ************************************************* */
// TODO: point: changes may be required to this function
void term_simulation(int np) {
// DO NOT WAIT THE TERMINATION OF ACTIVE ENTITIES IN THIS FUNCTION!
// This function is just to release the allocated resources
printf("Releasing resources\n");
term_pfifo(&hd->doctor_queue);
term_pfifo(&hd->triage_queue);
free(hd);
hd = NULL;
}
/* ************************************************* */
// TODO: point: changes may be required to this function
int nurse_iteration(int id) // return value can be used to request termination
{
check_valid_nurse(id);
printf("\e[34;01mNurse %d: get next patient\e[0m\n", id);
int patient = retrieve_pfifo(&hd->triage_queue);
// TODO: point: PUT YOUR NURSE TERMINATION CODE HERE:
if (patient == -1) return -1;
check_valid_patient(patient);
printf("\e[34;01mNurse %d: evaluate patient %d priority\e[0m\n", id,
patient);
int priority = random_manchester_triage_priority();
printf("\e[34;01mNurse %d: add patient %d with priority %d to doctor "
"queue\e[0m\n",
id, patient, priority);
insert_pfifo(&hd->doctor_queue, patient, priority);
return 0;
}
/* ************************************************* */
// TODO: point: changes may be required to this function
int doctor_iteration(int id) // return value can be used to request termination
{
check_valid_doctor(id);
printf("\e[32;01mDoctor %d: get next patient\e[0m\n", id);
int patient = retrieve_pfifo(&hd->doctor_queue);
// TODO: point: PUT YOUR DOCTOR TERMINATION CODE HERE:
if (patient == -1) return -1;
check_valid_patient(patient);
printf("\e[32;01mDoctor %d: treat patient %d\e[0m\n", id, patient);
random_wait();
printf("\e[32;01mDoctor %d: patient %d treated\e[0m\n", id, patient);
// TODO: point: PUT YOUR PATIENT CONSULTATION FINISHED NOTIFICATION CODE
// HERE:
pthread_mutex_lock(&hd->all_patients[patient].mutex);
hd->all_patients[patient].done = 1;
pthread_cond_broadcast(&hd->all_patients[patient].cond);
pthread_mutex_unlock(&hd->all_patients[patient].mutex);
return 0;
}
/* ************************************************* */
void patient_goto_urgency(int id) {
new_patient(&hd->all_patients[id]);
check_valid_name(hd->all_patients[id].name);
printf("\e[30;01mPatient %s (number %d): get to hospital\e[0m\n",
hd->all_patients[id].name, id);
insert_pfifo(&hd->triage_queue, id,
1); // all elements in triage queue with the same priority!
}
// TODO: point: changes may be required to this function
void patient_wait_end_of_consultation(int id) {
check_valid_name(hd->all_patients[id].name);
// TODO: point: PUT YOUR WAIT CODE FOR FINISHED CONSULTATION HERE:
pthread_mutex_lock(&hd->all_patients[id].mutex);
while (!hd->all_patients[id].done)
pthread_cond_wait(&hd->all_patients[id].cond, &hd->all_patients[id].mutex);
pthread_mutex_unlock(&hd->all_patients[id].mutex);
printf("\e[30;01mPatient %s (number %d): health problems treated\e[0m\n",
hd->all_patients[id].name, id);
}
// TODO: point: changes are required to this function
void patient_life(int id) {
patient_goto_urgency(id);
// nurse_iteration(
// 0); // TODO: point: to be commented/deleted in concurrent version
// doctor_iteration(
// 0); // TODO: point: to be commented/deleted in concurrent version
patient_wait_end_of_consultation(id);
pthread_mutex_destroy(&hd->all_patients[id].mutex);
pthread_cond_destroy(&hd->all_patients[id].cond);
memset(&(hd->all_patients[id]), 0, sizeof(Patient)); // patient finished
}
/* ************************************************* */
// TODO: point: if necessary, add extra functions here:
void *pthread_fn_patient(void *arg) {
int id = *(int *)arg;
patient_life(id);
int status = EXIT_SUCCESS;
pthread_exit(&status);
}
void *pthread_fn_nurse(void *arg) {
int id = *(int *)arg;
while (nurse_iteration(id) != -1);
int status = EXIT_SUCCESS;
pthread_exit(&status);
}
void *pthread_fn_doctor(void *arg) {
int id = *(int *)arg;
while (doctor_iteration(id) != -1);
int status = EXIT_SUCCESS;
pthread_exit(&status);
}
/* ************************************************* */
int main(int argc, char *argv[]) {
/* command line processing */
int option;
while ((option = getopt(argc, argv, "p:n:d:h")) != -1) {
switch (option) {
case 'p':
npatients = atoi(optarg);
if (npatients < 1 || npatients > MAX_PATIENTS) {
fprintf(stderr, "Invalid number of patients!\n");
return EXIT_FAILURE;
}
break;
case 'n':
nnurses = atoi(optarg);
if (nnurses < 1 || nnurses > MAX_NURSES) {
fprintf(stderr, "Invalid number of nurses!\n");
return EXIT_FAILURE;
}
break;
case 'd':
ndoctors = atoi(optarg);
if (ndoctors < 1 || nnurses > MAX_DOCTORS) {
fprintf(stderr, "Invalid number of doctors!\n");
return EXIT_FAILURE;
}
break;
case 'h':
printf(USAGE);
return EXIT_SUCCESS;
default:
fprintf(stderr, "Non valid option!\n");
fprintf(stderr, USAGE);
return EXIT_FAILURE;
}
}
/* start random generator */
srand(getpid());
/* init simulation */
init_simulation(npatients);
// TODO: point: REPLACE THE FOLLOWING DUMMY CODE WITH code to launch
// active entities and code to properly terminate the simulation.
/* dummy code to show a very simple sequential behavior */
// for(int i = 0; i < npatients; i++)
// {
// printf("\n");
// random_wait(); // random wait for patience creation
// patient_life(i);
// }
/* end of dummy code */
// ######################################
// CREATE
pthread_t patients[npatients];
pthread_t nurses[nnurses];
pthread_t doctors[ndoctors];
int patients_ids[npatients];
int nurses_ids[nnurses];
int doctors_ids[ndoctors];
for (int i = 0; i < npatients; i++) {
patients_ids[i] = i;
pthread_create(&patients[i], NULL, pthread_fn_patient, (void *)&patients_ids[i]);
}
for (int i = 0; i < nnurses; i++) {
nurses_ids[i] = i;
pthread_create(&nurses[i], NULL, pthread_fn_nurse, (void *)&nurses_ids[i]);
}
for (int i = 0; i < ndoctors; i++) {
doctors_ids[i] = i;
pthread_create(&doctors[i], NULL, pthread_fn_doctor, (void *)&doctors_ids[i]);
}
// ######################################
// JOIN
for (int i = 0; i < npatients; i++)
pthread_join(patients[i], NULL);
close_pfifo(&hd->triage_queue);
close_pfifo(&hd->doctor_queue);
for (int i = 0; i < nnurses; i++)
pthread_join(nurses[i], NULL);
for (int i = 0; i < ndoctors; i++)
pthread_join(doctors[i], NULL);
/* terminate simulation */
term_simulation(npatients);
return EXIT_SUCCESS;
}
/* IGNORE THE FOLLOWING CODE */
int random_manchester_triage_priority() {
int result;
int perc = random_int(0, 100);
if (perc < 10)
result = RED;
else if (perc < 30)
result = ORANGE;
else if (perc < 50)
result = YELLOW;
else if (perc < 75)
result = GREEN;
else
result = BLUE;
return result;
}
static char **names =
(char *[]){"Ana", "Miguel", "Luis", "Joao", "Artur", "Maria",
"Luisa", "Mario", "Augusto", "Antonio", "Jose", "Alice",
"Almerindo", "Gustavo", "Paulo", "Paula", NULL};
static int names_len = 16;
char *random_name() { return names[random_int(0, names_len - 1)]; }
void new_patient(Patient *patient) {
strcpy(patient->name, random_name());
patient->done = 0;
}
void random_wait() { usleep((useconds_t)random_int(0, MAX_WAIT)); }