Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > c9cfbd1355daacaf3b34517a6d7b18cc > files > 12

libdap-doc-3.11.0-2.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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"/>
<title>libdap++: Ancillary.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">libdap++&#160;<span id="projectnumber">Updated for version 3.8.2</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('Ancillary_8cc.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<h1>Ancillary.cc</h1>  </div>
</div>
<div class="contents">
<a href="Ancillary_8cc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Ancillary.cc</span>
<a name="l00002"></a>00002 
<a name="l00003"></a>00003 <span class="preprocessor">#include &quot;<a class="code" href="config_8h.html">config.h</a>&quot;</span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;<a class="code" href="Ancillary_8h.html">Ancillary.h</a>&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;<a class="code" href="debug_8h.html">debug.h</a>&quot;</span>
<a name="l00006"></a>00006 
<a name="l00007"></a>00007 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#ifdef HAVE_UNISTD_H</span>
<a name="l00009"></a>00009 <span class="preprocessor"></span><span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#endif</span>
<a name="l00011"></a>00011 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span><span class="preprocessor">#include &lt;io.h&gt;</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;process.h&gt;</span>
<a name="l00015"></a>00015 <span class="comment">// Win32 does not define this. 08/21/02 jhrg</span>
<a name="l00016"></a>00016 <span class="preprocessor">#define F_OK 0</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00018"></a>00018 <span class="preprocessor"></span>
<a name="l00019"></a>00019 <span class="keyword">namespace </span>libdap {
<a name="l00020"></a>00020 
<a name="l00065"></a>00065 <span class="keywordtype">string</span>
<a name="l00066"></a>00066 <a class="code" href="classlibdap_1_1Ancillary.html#a8030c897d09fdf491c3bf56fcdda4ab1" title="Find a file with ancillary data.">Ancillary::find_ancillary_file</a>( <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;pathname,
<a name="l00067"></a>00067                                 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;ext,
<a name="l00068"></a>00068                                 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir,
<a name="l00069"></a><a class="code" href="classlibdap_1_1Ancillary.html#a8030c897d09fdf491c3bf56fcdda4ab1">00069</a>                                 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;file )
<a name="l00070"></a>00070 {
<a name="l00071"></a>00071     string::size_type slash = pathname.rfind(<span class="charliteral">&#39;/&#39;</span>) + 1;
<a name="l00072"></a>00072     <span class="keywordtype">string</span> directory = pathname.substr(0, slash);
<a name="l00073"></a>00073     <span class="keywordtype">string</span> filename = pathname.substr(slash);
<a name="l00074"></a>00074     <span class="keywordtype">string</span> basename = pathname.substr(slash, pathname.rfind(<span class="charliteral">&#39;.&#39;</span>) - slash);
<a name="l00075"></a>00075 
<a name="l00076"></a>00076     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;find ancillary file params: &quot;</span> &lt;&lt; pathname &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; ext
<a name="l00077"></a>00077         &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; dir &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; file &lt;&lt; endl);
<a name="l00078"></a>00078     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;find ancillary file comp: &quot;</span> &lt;&lt; directory &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; filename
<a name="l00079"></a>00079         &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; basename &lt;&lt; endl);
<a name="l00080"></a>00080 
<a name="l00081"></a>00081     <span class="keywordtype">string</span> dot_ext = <span class="stringliteral">&quot;.&quot;</span> + ext;
<a name="l00082"></a>00082 
<a name="l00083"></a>00083     <span class="keywordtype">string</span> name = directory + basename + dot_ext;
<a name="l00084"></a>00084     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00085"></a>00085         <span class="keywordflow">return</span> name;
<a name="l00086"></a>00086 
<a name="l00087"></a>00087     name = pathname + dot_ext;
<a name="l00088"></a>00088     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00089"></a>00089         <span class="keywordflow">return</span> name;
<a name="l00090"></a>00090 
<a name="l00091"></a>00091     name = directory + ext;
<a name="l00092"></a>00092     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00093"></a>00093         <span class="keywordflow">return</span> name;
<a name="l00094"></a>00094 
<a name="l00095"></a>00095     name = dir + basename + dot_ext;
<a name="l00096"></a>00096     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00097"></a>00097         <span class="keywordflow">return</span> name;
<a name="l00098"></a>00098 
<a name="l00099"></a>00099     name = directory + file + dot_ext;
<a name="l00100"></a>00100     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00101"></a>00101         <span class="keywordflow">return</span> name;
<a name="l00102"></a>00102 
<a name="l00103"></a>00103     name = dir + file + dot_ext;
<a name="l00104"></a>00104     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00105"></a>00105         <span class="keywordflow">return</span> name;
<a name="l00106"></a>00106 
<a name="l00107"></a>00107     name = dir + ext;
<a name="l00108"></a>00108     <span class="keywordflow">if</span> (access(name.c_str(), F_OK) == 0)
<a name="l00109"></a>00109         <span class="keywordflow">return</span> name;
<a name="l00110"></a>00110 
<a name="l00111"></a>00111     <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;
<a name="l00112"></a>00112 }
<a name="l00113"></a>00113 
<a name="l00114"></a>00114 <span class="comment">// Given a pathname to a datafile, take that pathname apart and look for an</span>
<a name="l00115"></a>00115 <span class="comment">// ancillary file that describes a group of datafiles of which this datafile</span>
<a name="l00116"></a>00116 <span class="comment">// is a member. Assume that groups follow a simple naming convention where</span>
<a name="l00117"></a>00117 <span class="comment">// files use either leading or trailing digits and a common basename to name</span>
<a name="l00118"></a>00118 <span class="comment">// group members. For example, 00stuff.hdf, 01stuff.hdf, 02stuff.hdf, ..., is</span>
<a name="l00119"></a>00119 <span class="comment">// a group and is has `stuff&#39; as its basename.</span>
<a name="l00120"></a>00120 
<a name="l00134"></a>00134 <span class="keywordtype">string</span>
<a name="l00135"></a>00135 <a class="code" href="classlibdap_1_1Ancillary.html#a2732498600d700e6fb806db2ba39d024">Ancillary::find_group_ancillary_file</a>( <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;name, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;ext )
<a name="l00136"></a>00136 {
<a name="l00137"></a>00137     <span class="comment">// Given /usr/local/data/stuff.01.nc</span>
<a name="l00138"></a><a class="code" href="classlibdap_1_1Ancillary.html#a2732498600d700e6fb806db2ba39d024">00138</a>     <span class="comment">// pathname = /usr/local/data, filename = stuff.01.nc and</span>
<a name="l00139"></a>00139     <span class="comment">// rootname = stuff.01</span>
<a name="l00140"></a>00140     string::size_type slash = name.find_last_of(<span class="charliteral">&#39;/&#39;</span>);
<a name="l00141"></a>00141     <span class="keywordtype">string</span> dirname = name.substr(0, slash);
<a name="l00142"></a>00142     <span class="keywordtype">string</span> filename = name.substr(slash + 1);
<a name="l00143"></a>00143     <span class="keywordtype">string</span> rootname = filename.substr(0, filename.find_last_of(<span class="charliteral">&#39;.&#39;</span>));
<a name="l00144"></a>00144 
<a name="l00145"></a>00145     <span class="comment">// Instead of using regexs, scan the filename for leading and then</span>
<a name="l00146"></a>00146     <span class="comment">// trailing digits.</span>
<a name="l00147"></a>00147     string::iterator rootname_iter = rootname.begin();
<a name="l00148"></a>00148     string::iterator rootname_end_iter = rootname.end();
<a name="l00149"></a>00149     <span class="keywordflow">if</span> (isdigit(*rootname_iter)) {
<a name="l00150"></a>00150         <span class="keywordflow">while</span> (rootname_iter != rootname_end_iter
<a name="l00151"></a>00151                &amp;&amp; isdigit(*++rootname_iter))
<a name="l00152"></a>00152             ;
<a name="l00153"></a>00153 
<a name="l00154"></a>00154         <span class="comment">// We want: new_name = dirname + &quot;/&quot; + &lt;base&gt; + ext but without</span>
<a name="l00155"></a>00155         <span class="comment">// creating a bunch of temp objects.</span>
<a name="l00156"></a>00156         <span class="keywordtype">string</span> new_name = dirname;
<a name="l00157"></a>00157         new_name.append(<span class="stringliteral">&quot;/&quot;</span>);
<a name="l00158"></a>00158         new_name.append(rootname_iter, rootname_end_iter);
<a name="l00159"></a>00159         new_name.append(ext);
<a name="l00160"></a>00160         <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;New Name (iter): &quot;</span> &lt;&lt; new_name &lt;&lt; endl);
<a name="l00161"></a>00161         <span class="keywordflow">if</span> (access(new_name.c_str(), F_OK) == 0) {
<a name="l00162"></a>00162             <span class="keywordflow">return</span> new_name;
<a name="l00163"></a>00163         }
<a name="l00164"></a>00164     }
<a name="l00165"></a>00165 
<a name="l00166"></a>00166     string::reverse_iterator rootname_riter = rootname.rbegin();
<a name="l00167"></a>00167     string::reverse_iterator rootname_end_riter = rootname.rend();
<a name="l00168"></a>00168     <span class="keywordflow">if</span> (isdigit(*rootname_riter)) {
<a name="l00169"></a>00169         <span class="keywordflow">while</span> (rootname_riter != rootname_end_riter
<a name="l00170"></a>00170                &amp;&amp; isdigit(*++rootname_riter))
<a name="l00171"></a>00171             ;
<a name="l00172"></a>00172         <span class="keywordtype">string</span> new_name = dirname;
<a name="l00173"></a>00173         new_name.append(<span class="stringliteral">&quot;/&quot;</span>);
<a name="l00174"></a>00174         <span class="comment">// I used reverse iters to scan rootname backwards. To avoid</span>
<a name="l00175"></a>00175         <span class="comment">// reversing the fragment between end_riter and riter, pass append</span>
<a name="l00176"></a>00176         <span class="comment">// regular iters obtained using reverse_iterator::base(). See Meyers</span>
<a name="l00177"></a>00177         <span class="comment">// p. 123. 1/22/2002 jhrg</span>
<a name="l00178"></a>00178         new_name.append(rootname_end_riter.base(), rootname_riter.base());
<a name="l00179"></a>00179         new_name.append(ext);
<a name="l00180"></a>00180         <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;New Name (riter): &quot;</span> &lt;&lt; new_name &lt;&lt; endl);
<a name="l00181"></a>00181         <span class="keywordflow">if</span> (access(new_name.c_str(), F_OK) == 0) {
<a name="l00182"></a>00182             <span class="keywordflow">return</span> new_name;
<a name="l00183"></a>00183         }
<a name="l00184"></a>00184     }
<a name="l00185"></a>00185 
<a name="l00186"></a>00186     <span class="comment">// If we&#39;re here either the file does not begin with leading digits or a</span>
<a name="l00187"></a>00187     <span class="comment">// template made by removing those digits was not found.</span>
<a name="l00188"></a>00188 
<a name="l00189"></a>00189     <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;
<a name="l00190"></a>00190 }
<a name="l00191"></a>00191 
<a name="l00192"></a>00192 <span class="keywordtype">void</span>
<a name="l00193"></a>00193 <a class="code" href="classlibdap_1_1Ancillary.html#a7644210f5b5e49103dbf7109e7bcb278">Ancillary::read_ancillary_das</a>( DAS &amp;das,
<a name="l00194"></a>00194                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;pathname,
<a name="l00195"></a>00195                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir,
<a name="l00196"></a><a class="code" href="classlibdap_1_1Ancillary.html#a7644210f5b5e49103dbf7109e7bcb278">00196</a>                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;file )
<a name="l00197"></a>00197 {
<a name="l00198"></a>00198     <span class="keywordtype">string</span> name = <a class="code" href="classlibdap_1_1Ancillary.html#a8030c897d09fdf491c3bf56fcdda4ab1" title="Find a file with ancillary data.">find_ancillary_file</a>( pathname, <span class="stringliteral">&quot;das&quot;</span>, dir, file ) ;
<a name="l00199"></a>00199 
<a name="l00200"></a>00200     FILE *in = fopen( name.c_str(), <span class="stringliteral">&quot;r&quot;</span> ) ;
<a name="l00201"></a>00201     <span class="keywordflow">if</span>( in ) {
<a name="l00202"></a>00202         das.parse( in ) ;
<a name="l00203"></a>00203         <span class="keywordtype">int</span> res = fclose( in ) ;
<a name="l00204"></a>00204         <span class="keywordflow">if</span>( res )
<a name="l00205"></a>00205             <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;DODSFilter::read_ancillary_das - Failed to close file &quot;</span> &lt;&lt; (<span class="keywordtype">void</span> *)in &lt;&lt; endl) ;
<a name="l00206"></a>00206     }
<a name="l00207"></a>00207 }
<a name="l00208"></a>00208 
<a name="l00209"></a>00209 <span class="keywordtype">void</span>
<a name="l00210"></a>00210 <a class="code" href="classlibdap_1_1Ancillary.html#aa1f64793537ff7bf93629c9c8a6be8ea">Ancillary::read_ancillary_dds</a>( <a class="code" href="classlibdap_1_1DDS.html">DDS</a> &amp;dds,
<a name="l00211"></a>00211                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;pathname,
<a name="l00212"></a>00212                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir,
<a name="l00213"></a><a class="code" href="classlibdap_1_1Ancillary.html#aa1f64793537ff7bf93629c9c8a6be8ea">00213</a>                                <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;file )
<a name="l00214"></a>00214 {
<a name="l00215"></a>00215     <span class="keywordtype">string</span> name = <a class="code" href="classlibdap_1_1Ancillary.html#a8030c897d09fdf491c3bf56fcdda4ab1" title="Find a file with ancillary data.">find_ancillary_file</a>( pathname, <span class="stringliteral">&quot;dds&quot;</span>, dir, file ) ;
<a name="l00216"></a>00216 
<a name="l00217"></a>00217     FILE *in = fopen( name.c_str(), <span class="stringliteral">&quot;r&quot;</span> ) ;
<a name="l00218"></a>00218     <span class="keywordflow">if</span>( in ) {
<a name="l00219"></a>00219         dds.<a class="code" href="classlibdap_1_1DDS.html#a733c8e49ed42ab47d74afe68056340e6" title="Parse a DDS from a file with the given name.">parse</a>( in ) ;
<a name="l00220"></a>00220         <span class="keywordtype">int</span> res = fclose( in ) ;
<a name="l00221"></a>00221         <span class="keywordflow">if</span>( res )
<a name="l00222"></a>00222             <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;DODSFilter::read_ancillary_das - Failed to close file &quot;</span> &lt;&lt; (<span class="keywordtype">void</span> *)in &lt;&lt; endl) ;
<a name="l00223"></a>00223     }
<a name="l00224"></a>00224 }
<a name="l00225"></a>00225 
<a name="l00226"></a>00226 } <span class="comment">// namespace libdap</span>
<a name="l00227"></a>00227 
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="Ancillary_8cc.html">Ancillary.cc</a>      </li>
      <li class="footer">Generated on Tue Feb 8 2011 for libdap++ by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
    </ul>
  </div>

</body>
</html>