<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </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 &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 &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 &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 &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 &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 &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(&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 && 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 && 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, &q, 10); 00081 <span class="keywordflow">if</span> (!(q && *q == <span class="charliteral">'\0'</span>)) <span class="keywordflow">return</span> -1; 00082 <span class="keywordflow">if</span> (time.tm_mday < 0 || time.tm_mday > 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, &q, 10); 00089 <span class="keywordflow">if</span> (!(q && *q == <span class="charliteral">'\0'</span>)) <span class="keywordflow">return</span> -1; 00090 <span class="keywordflow">if</span> (time.tm_year < 1997 || time.tm_year >= 3000) <span class="keywordflow">return</span> -1; 00091 time.tm_year -= 1900; 00092 00093 *secs = mktime(&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 && *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 < 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, &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 && lastTime < 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 > name && <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 && (*(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 > text) && <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>)) > 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-><a class="code" href="structSpecStruct.html#m11">line</a>))) { 00219 <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(sb, spec-><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>)) > 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-><a class="code" href="structSpecStruct.html#m35">packages</a>-><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>