Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 2269bb274471fd2722517c2c0b740d7f > files > 184

rpm-devel-4.0.4-19mdk.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>build/parseChangelog.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.17 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>build/parseChangelog.c</h1><a href="parseChangelog_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00006 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span>
00007 
00008 <span class="preprocessor">#include "<a class="code" href="rpmbuild_8h.html">rpmbuild.h</a>"</span>
00009 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00010 
<a name="l00011"></a><a class="code" href="group__rpmbuild.html#a26">00011</a> <span class="keywordtype">void</span> <a class="code" href="group__rpmbuild.html#a26">addChangelogEntry</a>(<a class="code" href="structheaderToken.html">Header</a> h, time_t time, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keywordtype">char</span> *text)
00012 {
00013     <a class="code" href="header_8h.html#a9">int_32</a> mytime = time;       <span class="comment">/* XXX convert to header representation */</span>
00014     <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a34">headerIsEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a184">RPMTAG_CHANGELOGTIME</a>)) {
00015         (void) <a class="code" href="group__header.html#a46">headerAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a184">RPMTAG_CHANGELOGTIME</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
00016                           &amp;mytime, 1);
00017         (void) <a class="code" href="group__header.html#a46">headerAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a185">RPMTAG_CHANGELOGNAME</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
00018                           &amp;name, 1);
00019         (void) <a class="code" href="group__header.html#a46">headerAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a186">RPMTAG_CHANGELOGTEXT</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
00020                          &amp;text, 1);
00021     } <span class="keywordflow">else</span> {
00022         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a184">RPMTAG_CHANGELOGTIME</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
00023                        &amp;mytime, 1);
00024         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a185">RPMTAG_CHANGELOGNAME</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
00025                        &amp;name, 1);
00026         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a186">RPMTAG_CHANGELOGTEXT</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
00027                        &amp;text, 1);
00028     }
00029 }
00030 
<a name="l00037"></a><a class="code" href="parseChangelog_8c.html#a1">00037</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parseChangelog_8c.html#a1">dateToTimet</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * datestr, <span class="comment">/*@out@*/</span> time_t * secs)
00038         <span class="comment">/*@modifies *secs @*/</span>
00039 {
00040     <span class="keyword">struct </span>tm time;
00041     <span class="keywordtype">char</span> * p, * pe, * q, ** idx;
00042     <span class="keywordtype">char</span> * date = strcpy(<a class="code" href="system_8h.html#a36">alloca</a>(strlen(datestr) + 1), datestr);
00043 <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keywordtype">char</span> * days[] =
00044         { <span class="stringliteral">"Sun"</span>, <span class="stringliteral">"Mon"</span>, <span class="stringliteral">"Tue"</span>, <span class="stringliteral">"Wed"</span>, <span class="stringliteral">"Thu"</span>, <span class="stringliteral">"Fri"</span>, <span class="stringliteral">"Sat"</span>, NULL };
00045 <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keywordtype">char</span> * months[] =
00046         { <span class="stringliteral">"Jan"</span>, <span class="stringliteral">"Feb"</span>, <span class="stringliteral">"Mar"</span>, <span class="stringliteral">"Apr"</span>, <span class="stringliteral">"May"</span>, <span class="stringliteral">"Jun"</span>,
00047           <span class="stringliteral">"Jul"</span>, <span class="stringliteral">"Aug"</span>, <span class="stringliteral">"Sep"</span>, <span class="stringliteral">"Oct"</span>, <span class="stringliteral">"Nov"</span>, <span class="stringliteral">"Dec"</span>, NULL };
00048 <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keywordtype">char</span> lengths[] =
00049         { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
00050     
00051     memset(&amp;time, 0, <span class="keyword">sizeof</span>(time));
00052 
00053     pe = date;
00054 
00055     <span class="comment">/* day of week */</span>
00056     p = pe; <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(p);
00057     <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>) <span class="keywordflow">return</span> -1;
00058     pe = p; <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00059     <span class="keywordflow">for</span> (idx = days; *idx &amp;&amp; strcmp(*idx, p); idx++)
00060         {};
00061     <span class="keywordflow">if</span> (*idx == NULL) <span class="keywordflow">return</span> -1;
00062 
00063     <span class="comment">/* month */</span>
00064     p = pe; <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(p);
00065     <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>) <span class="keywordflow">return</span> -1;
00066     pe = p; <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00067     <span class="keywordflow">for</span> (idx = months; *idx &amp;&amp; strcmp(*idx, p); idx++)
00068         {};
00069     <span class="keywordflow">if</span> (*idx == NULL) <span class="keywordflow">return</span> -1;
00070     time.tm_mon = idx - months;
00071 
00072     <span class="comment">/* day */</span>
00073     p = pe; <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(p);
00074     <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>) <span class="keywordflow">return</span> -1;
00075     pe = p; <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00076 
00077     <span class="comment">/* make this noon so the day is always right (as we make this UTC) */</span>
00078     time.tm_hour = 12;
00079 
00080     time.tm_mday = strtol(p, &amp;q, 10);
00081     <span class="keywordflow">if</span> (!(q &amp;&amp; *q == <span class="charliteral">'\0'</span>)) <span class="keywordflow">return</span> -1;
00082     <span class="keywordflow">if</span> (time.tm_mday &lt; 0 || time.tm_mday &gt; lengths[time.tm_mon]) <span class="keywordflow">return</span> -1;
00083 
00084     <span class="comment">/* year */</span>
00085     p = pe; <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(p);
00086     <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>) <span class="keywordflow">return</span> -1;
00087     pe = p; <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00088     time.tm_year = strtol(p, &amp;q, 10);
00089     <span class="keywordflow">if</span> (!(q &amp;&amp; *q == <span class="charliteral">'\0'</span>)) <span class="keywordflow">return</span> -1;
00090     <span class="keywordflow">if</span> (time.tm_year &lt; 1997 || time.tm_year &gt;= 3000) <span class="keywordflow">return</span> -1;
00091     time.tm_year -= 1900;
00092 
00093     *secs = mktime(&amp;time);
00094     <span class="keywordflow">if</span> (*secs == -1) <span class="keywordflow">return</span> -1;
00095 
00096     <span class="comment">/* adjust to GMT */</span>
00097     *secs += timezone;
00098 
00099     <span class="keywordflow">return</span> 0;
00100 }
00101 
<a name="l00108"></a><a class="code" href="parseChangelog_8c.html#a2">00108</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parseChangelog_8c.html#a2">addChangelog</a>(<a class="code" href="structheaderToken.html">Header</a> h, <a class="code" href="structStringBufRec.html">StringBuf</a> sb)
00109         <span class="comment">/*@modifies h @*/</span>
00110 {
00111     <span class="keywordtype">char</span> *s;
00112     <span class="keywordtype">int</span> i;
00113     time_t time;
00114     time_t lastTime = 0;
00115     <span class="keywordtype">char</span> *date, *name, *text, *next;
00116 
00117     s = <a class="code" href="stringbuf_8c.html#a7">getStringBuf</a>(sb);
00118 
00119     <span class="comment">/* skip space */</span>
00120     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00121 
00122     <span class="keywordflow">while</span> (*s != <span class="charliteral">'\0'</span>) {
00123         <span class="keywordflow">if</span> (*s != <span class="charliteral">'*'</span>) {
00124             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00125                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%%changelog entries must start with *\n"</span>));
00126             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00127         }
00128 
00129         <span class="comment">/* find end of line */</span>
00130         date = s;
00131         <span class="keywordflow">while</span>(*s &amp;&amp; *s != <span class="charliteral">'\n'</span>) s++;
00132         <span class="keywordflow">if</span> (! *s) {
00133             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"incomplete %%changelog entry\n"</span>));
00134             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00135         }
00136         <span class="comment">/*@-modobserver@*/</span>
00137         *s = <span class="charliteral">'\0'</span>;
00138         <span class="comment">/*@=modobserver@*/</span>
00139         text = s + 1;
00140         
00141         <span class="comment">/* 4 fields of date */</span>
00142         date++;
00143         s = date;
00144         <span class="keywordflow">for</span> (i = 0; i &lt; 4; i++) {
00145             <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00146             <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(s);
00147         }
00148         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(date);
00149         <span class="keywordflow">if</span> (<a class="code" href="parseChangelog_8c.html#a1">dateToTimet</a>(date, &amp;time)) {
00150             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"bad date in %%changelog: %s\n"</span>), date);
00151             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00152         }
00153         <span class="keywordflow">if</span> (lastTime &amp;&amp; lastTime &lt; time) {
00154             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00155                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%%changelog not in descending chronological order\n"</span>));
00156             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00157         }
00158         lastTime = time;
00159 
00160         <span class="comment">/* skip space to the name */</span>
00161         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00162         <span class="keywordflow">if</span> (! *s) {
00163             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"missing name in %%changelog\n"</span>));
00164             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00165         }
00166 
00167         <span class="comment">/* name */</span>
00168         name = s;
00169         <span class="keywordflow">while</span> (*s != <span class="charliteral">'\0'</span>) s++;
00170         <span class="keywordflow">while</span> (s &gt; name &amp;&amp; <a class="code" href="rpmio_8h.html#a102">xisspace</a>(*s)) {
00171             *s-- = <span class="charliteral">'\0'</span>;
00172         }
00173         <span class="keywordflow">if</span> (s == name) {
00174             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"missing name in %%changelog\n"</span>));
00175             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00176         }
00177 
00178         <span class="comment">/* text */</span>
00179         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(text);
00180         <span class="keywordflow">if</span> (! *text) {
00181             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"no description in %%changelog\n"</span>));
00182             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00183         }
00184             
00185         <span class="comment">/* find the next leading '*' (or eos) */</span>
00186         s = text;
00187         <span class="keywordflow">do</span> {
00188            s++;
00189         } <span class="keywordflow">while</span> (*s &amp;&amp; (*(s-1) != <span class="charliteral">'\n'</span> || *s != <span class="charliteral">'*'</span>));
00190         next = s;
00191         s--;
00192 
00193         <span class="comment">/* backup to end of description */</span>
00194         <span class="keywordflow">while</span> ((s &gt; text) &amp;&amp; <a class="code" href="rpmio_8h.html#a102">xisspace</a>(*s)) {
00195             *s-- = <span class="charliteral">'\0'</span>;
00196         }
00197         
00198         <a class="code" href="group__rpmbuild.html#a26">addChangelogEntry</a>(h, time, name, text);
00199         s = next;
00200     }
00201 
00202     <span class="keywordflow">return</span> 0;
00203 }
00204 
<a name="l00205"></a><a class="code" href="group__rpmbuild.html#a28">00205</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmbuild.html#a28">parseChangelog</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec)
00206 {
00207     <span class="keywordtype">int</span> nextPart, res, rc;
00208     <a class="code" href="structStringBufRec.html">StringBuf</a> sb = <a class="code" href="stringbuf_8c.html#a3">newStringBuf</a>();
00209     
00210     <span class="comment">/* There are no options to %changelog */</span>
00211     <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a21">readLine</a>(spec, <a class="code" href="rpmbuild_8h.html#a6">STRIP_COMMENTS</a>)) &gt; 0) {
00212         sb = <a class="code" href="stringbuf_8c.html#a4">freeStringBuf</a>(sb);
00213         <span class="keywordflow">return</span> <a class="code" href="group__rpmbuild.html#a57a22">PART_NONE</a>;
00214     }
00215     <span class="keywordflow">if</span> (rc)
00216         <span class="keywordflow">return</span> rc;
00217     
00218     <span class="keywordflow">while</span> (! (nextPart = <a class="code" href="group__rpmbuild.html#a24">isPart</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>))) {
00219         <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(sb, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00220         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a21">readLine</a>(spec, <a class="code" href="rpmbuild_8h.html#a6">STRIP_COMMENTS</a>)) &gt; 0) {
00221             nextPart = <a class="code" href="group__rpmbuild.html#a57a22">PART_NONE</a>;
00222             <span class="keywordflow">break</span>;
00223         }
00224         <span class="keywordflow">if</span> (rc)
00225             <span class="keywordflow">return</span> rc;
00226     }
00227 
00228     res = <a class="code" href="parseChangelog_8c.html#a2">addChangelog</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, sb);
00229     sb = <a class="code" href="stringbuf_8c.html#a4">freeStringBuf</a>(sb);
00230 
00231     <span class="keywordflow">return</span> (res) ? res : nextPart;
00232 }
</pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:55 2002 for rpm by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.17 </small></address>
</body>
</html>