Sophie

Sophie

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

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/parsePreamble.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/parsePreamble.c</h1><a href="parsePreamble_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 &lt;<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>&gt;</span>
00009 <span class="preprocessor">#include &lt;<a class="code" href="rpmbuild_8h.html">rpmbuild.h</a>&gt;</span>
00010 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00011 
00012 <span class="comment">/*@access FD_t @*/</span>      <span class="comment">/* compared with NULL */</span>
00013 
00016 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00017"></a><a class="code" href="parsePreamble_8c.html#a1">00017</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> <a class="code" href="parsePreamble_8c.html#a1">copyTagsDuringParse</a>[] = {
00018     <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>,
00019     <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>,
00020     <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>,
00021     <a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>,
00022     <a class="code" href="rpmlib_8h.html#a494a128">RPMTAG_PACKAGER</a>,
00023     <a class="code" href="rpmlib_8h.html#a494a123">RPMTAG_DISTRIBUTION</a>,
00024     <a class="code" href="rpmlib_8h.html#a494a227">RPMTAG_DISTURL</a>,
00025     <a class="code" href="rpmlib_8h.html#a494a124">RPMTAG_VENDOR</a>,
00026     <a class="code" href="rpmlib_8h.html#a494a156">RPMTAG_ICON</a>,
00027     <a class="code" href="rpmlib_8h.html#a494a133">RPMTAG_URL</a>,
00028     <a class="code" href="rpmlib_8h.html#a494a184">RPMTAG_CHANGELOGTIME</a>,
00029     <a class="code" href="rpmlib_8h.html#a494a185">RPMTAG_CHANGELOGNAME</a>,
00030     <a class="code" href="rpmlib_8h.html#a494a186">RPMTAG_CHANGELOGTEXT</a>,
00031     <a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>,
00032     <a class="code" href="rpmlib_8h.html#a494a235">RPMTAG_RHNPLATFORM</a>,
00033     0
00034 };
00035 
00038 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00039"></a><a class="code" href="parsePreamble_8c.html#a2">00039</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> <a class="code" href="parsePreamble_8c.html#a2">requiredTags</a>[] = {
00040     <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>,
00041     <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>,
00042     <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>,
00043     <a class="code" href="rpmlib_8h.html#a494a117">RPMTAG_SUMMARY</a>,
00044     <a class="code" href="rpmlib_8h.html#a494a129">RPMTAG_GROUP</a>,
00045     <a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>,
00046     0
00047 };
00048 
<a name="l00051"></a><a class="code" href="parsePreamble_8c.html#a10">00051</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="parsePreamble_8c.html#a10">addOrAppendListEntry</a>(<a class="code" href="structheaderToken.html">Header</a> h, <a class="code" href="header_8h.html#a9">int_32</a> tag, <span class="keywordtype">char</span> * line)
00052         <span class="comment">/*@modifies h @*/</span>
00053 {
00054     <span class="keywordtype">int</span> xx;
00055     <span class="keywordtype">int</span> argc;
00056     <span class="keyword">const</span> <span class="keywordtype">char</span> **argv;
00057 
00058     xx = <a class="code" href="group__popt.html#a2">poptParseArgvString</a>(line, &amp;argc, &amp;argv);
00059     <span class="keywordflow">if</span> (argc)
00060         xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, tag, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, argv, argc);
00061     argv = <a class="code" href="poptint_8h.html#a14">_free</a>(argv);
00062 }
00063 
00064 <span class="comment">/* Parse a simple part line that only take -n &lt;pkg&gt; or &lt;pkg&gt; */</span>
00065 <span class="comment">/* &lt;pkg&gt; is return in name as a pointer into a static buffer */</span>
00066 
<a name="l00069"></a><a class="code" href="parsePreamble_8c.html#a11">00069</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a11">parseSimplePart</a>(<span class="keywordtype">char</span> *line, <span class="comment">/*@out@*/</span><span class="keywordtype">char</span> **name, <span class="comment">/*@out@*/</span><span class="keywordtype">int</span> *flag)
00070         <span class="comment">/*@globals internalState@*/</span>
00071         <span class="comment">/*@modifies *name, *flag, internalState @*/</span>
00072 {
00073     <span class="keywordtype">char</span> *tok;
00074     <span class="keywordtype">char</span> linebuf[BUFSIZ];
00075     <span class="keyword">static</span> <span class="keywordtype">char</span> buf[BUFSIZ];
00076 
00077     strcpy(linebuf, line);
00078 
00079     <span class="comment">/* Throw away the first token (the %xxxx) */</span>
00080     (void)strtok(linebuf, <span class="stringliteral">" \t\n"</span>);
00081     
00082     <span class="keywordflow">if</span> (!(tok = strtok(NULL, <span class="stringliteral">" \t\n"</span>))) {
00083         *name = NULL;
00084         <span class="keywordflow">return</span> 0;
00085     }
00086     
00087     <span class="keywordflow">if</span> (!strcmp(tok, <span class="stringliteral">"-n"</span>)) {
00088         <span class="keywordflow">if</span> (!(tok = strtok(NULL, <span class="stringliteral">" \t\n"</span>)))
00089             <span class="keywordflow">return</span> 1;
00090         *flag = <a class="code" href="rpmbuild_8h.html#a3">PART_NAME</a>;
00091     } <span class="keywordflow">else</span> {
00092         *flag = <a class="code" href="rpmbuild_8h.html#a2">PART_SUBNAME</a>;
00093     }
00094     strcpy(buf, tok);
00095     *name = buf;
00096 
00097     <span class="keywordflow">return</span> (strtok(NULL, <span class="stringliteral">" \t\n"</span>)) ? 1 : 0;
00098 }
00099 
<a name="l00102"></a><a class="code" href="parsePreamble_8c.html#a12">00102</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a12">parseYesNo</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * s)
00103         <span class="comment">/*@*/</span>
00104 {
00105     <span class="keywordflow">return</span> ((!s || (s[0] == <span class="charliteral">'n'</span> || s[0] == <span class="charliteral">'N'</span> || s[0] == <span class="charliteral">'0'</span>) ||
00106         !<a class="code" href="group__rpmio.html#a0">xstrcasecmp</a>(s, <span class="stringliteral">"false"</span>) || !<a class="code" href="group__rpmio.html#a0">xstrcasecmp</a>(s, <span class="stringliteral">"off"</span>))
00107             ? 0 : 1);
00108 }
00109 
<a name="l00110"></a><a class="code" href="structtokenBits__s.html">00110</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structtokenBits__s.html">tokenBits_s</a> {
<a name="l00111"></a><a class="code" href="structtokenBits__s.html#m0">00111</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structtokenBits__s.html#m0">name</a>;
<a name="l00112"></a><a class="code" href="structtokenBits__s.html#m1">00112</a>     <a class="code" href="rpmlib_8h.html#a56">rpmsenseFlags</a> <a class="code" href="structtokenBits__s.html#m1">bits</a>;
00113 } * <a class="code" href="structtokenBits__s.html">tokenBits</a>;
00114 
00117 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00118"></a><a class="code" href="parsePreamble_8c.html#a4">00118</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structtokenBits__s.html">tokenBits_s</a> installScriptBits[] = {
00119     { <span class="stringliteral">"interp"</span>,         <a class="code" href="rpmlib_8h.html#a497a262">RPMSENSE_INTERP</a> },
00120     { <span class="stringliteral">"prereq"</span>,         <a class="code" href="rpmlib_8h.html#a497a260">RPMSENSE_PREREQ</a> },
00121     { <span class="stringliteral">"preun"</span>,          <a class="code" href="rpmlib_8h.html#a497a265">RPMSENSE_SCRIPT_PREUN</a> },
00122     { <span class="stringliteral">"pre"</span>,            <a class="code" href="rpmlib_8h.html#a497a263">RPMSENSE_SCRIPT_PRE</a> },
00123     { <span class="stringliteral">"postun"</span>,         <a class="code" href="rpmlib_8h.html#a497a266">RPMSENSE_SCRIPT_POSTUN</a> },
00124     { <span class="stringliteral">"post"</span>,           <a class="code" href="rpmlib_8h.html#a497a264">RPMSENSE_SCRIPT_POST</a> },
00125     { <span class="stringliteral">"rpmlib"</span>,         <a class="code" href="rpmlib_8h.html#a497a278">RPMSENSE_RPMLIB</a> },
00126     { <span class="stringliteral">"verify"</span>,         <a class="code" href="rpmlib_8h.html#a497a267">RPMSENSE_SCRIPT_VERIFY</a> },
00127     { NULL, 0 }
00128 };
00129 
00132 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00133"></a><a class="code" href="parsePreamble_8c.html#a5">00133</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structtokenBits__s.html">tokenBits_s</a> buildScriptBits[] = {
00134     { <span class="stringliteral">"prep"</span>,           <a class="code" href="rpmlib_8h.html#a497a274">RPMSENSE_SCRIPT_PREP</a> },
00135     { <span class="stringliteral">"build"</span>,          <a class="code" href="rpmlib_8h.html#a497a275">RPMSENSE_SCRIPT_BUILD</a> },
00136     { <span class="stringliteral">"install"</span>,        <a class="code" href="rpmlib_8h.html#a497a276">RPMSENSE_SCRIPT_INSTALL</a> },
00137     { <span class="stringliteral">"clean"</span>,          <a class="code" href="rpmlib_8h.html#a497a277">RPMSENSE_SCRIPT_CLEAN</a> },
00138     { NULL, 0 }
00139 };
00140 
<a name="l00143"></a><a class="code" href="parsePreamble_8c.html#a13">00143</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a13">parseBits</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * s, <span class="keyword">const</span> <a class="code" href="structtokenBits__s.html">tokenBits</a> tokbits,
00144                 <span class="comment">/*@out@*/</span> <a class="code" href="rpmlib_8h.html#a56">rpmsenseFlags</a> * bp)
00145         <span class="comment">/*@modifies *bp @*/</span>
00146 {
00147     <a class="code" href="structtokenBits__s.html">tokenBits</a> tb;
00148     <span class="keyword">const</span> <span class="keywordtype">char</span> * se;
00149     <a class="code" href="rpmlib_8h.html#a56">rpmsenseFlags</a> bits = <a class="code" href="rpmlib_8h.html#a497a253">RPMSENSE_ANY</a>;
00150     <span class="keywordtype">int</span> c = 0;
00151 
00152     <span class="keywordflow">if</span> (s) {
00153         <span class="keywordflow">while</span> (*s != <span class="charliteral">'\0'</span>) {
00154             <span class="keywordflow">while</span> ((c = *s) &amp;&amp; <a class="code" href="rpmio_8h.html#a102">xisspace</a>(c)) s++;
00155             se = s;
00156             <span class="keywordflow">while</span> ((c = *se) &amp;&amp; <a class="code" href="rpmio_8h.html#a98">xisalpha</a>(c)) se++;
00157             <span class="keywordflow">if</span> (s == se)
00158                 <span class="keywordflow">break</span>;
00159             <span class="keywordflow">for</span> (tb = tokbits; tb-&gt;<a class="code" href="structtokenBits__s.html#m0">name</a>; tb++) {
00160                 <span class="keywordflow">if</span> (tb-&gt;<a class="code" href="structtokenBits__s.html#m0">name</a> != NULL &amp;&amp;
00161                     strlen(tb-&gt;<a class="code" href="structtokenBits__s.html#m0">name</a>) == (se-s) &amp;&amp; !strncmp(tb-&gt;<a class="code" href="structtokenBits__s.html#m0">name</a>, s, (se-s)))
00162                     <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00163             }
00164             <span class="keywordflow">if</span> (tb-&gt;<a class="code" href="structtokenBits__s.html#m0">name</a> == NULL)
00165                 <span class="keywordflow">break</span>;
00166             bits |= tb-&gt;<a class="code" href="structtokenBits__s.html#m1">bits</a>;
00167             <span class="keywordflow">while</span> ((c = *se) &amp;&amp; <a class="code" href="rpmio_8h.html#a102">xisspace</a>(c)) se++;
00168             <span class="keywordflow">if</span> (c != <span class="charliteral">','</span>)
00169                 <span class="keywordflow">break</span>;
00170             s = ++se;
00171         }
00172     }
00173     <span class="keywordflow">if</span> (c == 0 &amp;&amp; bp) *bp = bits;
00174     <span class="keywordflow">return</span> (c ? <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a> : 0);
00175 }
00176 
<a name="l00179"></a><a class="code" href="parsePreamble_8c.html#a14">00179</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">char</span> * <a class="code" href="parsePreamble_8c.html#a14">findLastChar</a>(<span class="keywordtype">char</span> * s)
00180         <span class="comment">/*@*/</span>
00181 {
00182     <span class="keywordtype">char</span> *res = s;
00183 
00184     <span class="keywordflow">while</span> (*s != <span class="charliteral">'\0'</span>) {
00185         <span class="keywordflow">if</span> (! <a class="code" href="rpmio_8h.html#a102">xisspace</a>(*s))
00186             res = s;
00187         s++;
00188     }
00189 
00190     <span class="comment">/*@-temptrans -retalias@*/</span>
00191     <span class="keywordflow">return</span> res;
00192     <span class="comment">/*@=temptrans =retalias@*/</span>
00193 }
00194 
<a name="l00197"></a><a class="code" href="parsePreamble_8c.html#a15">00197</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a15">isMemberInEntry</a>(<a class="code" href="structheaderToken.html">Header</a> h, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> tag)
00198         <span class="comment">/*@*/</span>
00199 {
00200     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
00201     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = headerFreeData;
00202     <span class="keyword">const</span> <span class="keywordtype">char</span> ** names;
00203     <a class="code" href="group__header.html#a13">rpmTagType</a> type;
00204     <span class="keywordtype">int</span> count;
00205 
00206     <span class="keywordflow">if</span> (!hge(h, tag, &amp;type, (<span class="keywordtype">void</span> **)&amp;names, &amp;count))
00207         <span class="keywordflow">return</span> -1;
00208     <span class="keywordflow">while</span> (count--) {
00209         <span class="keywordflow">if</span> (!<a class="code" href="group__rpmio.html#a0">xstrcasecmp</a>(names[count], name))
00210             <span class="keywordflow">break</span>;
00211     }
00212     names = hfd(names, type);
00213     <span class="keywordflow">return</span> (count &gt;= 0 ? 1 : 0);
00214 }
00215 
<a name="l00218"></a><a class="code" href="parsePreamble_8c.html#a16">00218</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a16">checkForValidArchitectures</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec)
00219         <span class="comment">/*@*/</span>
00220 {
00221 <span class="preprocessor">#ifndef DYING</span>
00222 <span class="preprocessor"></span>    <span class="keyword">const</span> <span class="keywordtype">char</span> *arch = NULL;
00223     <span class="keyword">const</span> <span class="keywordtype">char</span> *os = NULL;
00224 
00225     <a class="code" href="group__rpmrc.html#a50">rpmGetArchInfo</a>(&amp;arch, NULL);
00226     <a class="code" href="group__rpmrc.html#a51">rpmGetOsInfo</a>(&amp;os, NULL);
00227 <span class="preprocessor">#else</span>
00228 <span class="preprocessor"></span>    <span class="keyword">const</span> <span class="keywordtype">char</span> *arch = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_target_cpu}"</span>, NULL);
00229     <span class="keyword">const</span> <span class="keywordtype">char</span> *os = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_target_os}"</span>, NULL);
00230 <span class="preprocessor">#endif</span>
00231 <span class="preprocessor"></span>    
00232     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a15">isMemberInEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>,
00233                         arch, <a class="code" href="rpmlib_8h.html#a494a172">RPMTAG_EXCLUDEARCH</a>) == 1) {
00234         <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">"Architecture is excluded: %s\n"</span>), arch);
00235         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00236     }
00237     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a15">isMemberInEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>,
00238                         arch, <a class="code" href="rpmlib_8h.html#a494a174">RPMTAG_EXCLUSIVEARCH</a>) == 0) {
00239         <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">"Architecture is not included: %s\n"</span>), arch);
00240         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00241     }
00242     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a15">isMemberInEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>,
00243                         os, <a class="code" href="rpmlib_8h.html#a494a173">RPMTAG_EXCLUDEOS</a>) == 1) {
00244         <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">"OS is excluded: %s\n"</span>), os);
00245         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00246     }
00247     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a15">isMemberInEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>,
00248                         os, <a class="code" href="rpmlib_8h.html#a494a175">RPMTAG_EXCLUSIVEOS</a>) == 0) {
00249         <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">"OS is not included: %s\n"</span>), os);
00250         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00251     }
00252 
00253     <span class="keywordflow">return</span> 0;
00254 }
00255 
<a name="l00262"></a><a class="code" href="parsePreamble_8c.html#a17">00262</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a17">checkForRequired</a>(<a class="code" href="structheaderToken.html">Header</a> h, <span class="keyword">const</span> <span class="keywordtype">char</span> * NVR)
00263         <span class="comment">/*@modifies h @*/</span> <span class="comment">/* LCL: parse error here with modifies */</span>
00264 {
00265     <span class="keywordtype">int</span> res = 0;
00266     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> * p;
00267 
00268     <span class="keywordflow">for</span> (p = <a class="code" href="parsePreamble_8c.html#a2">requiredTags</a>; *p != 0; p++) {
00269         <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a34">headerIsEntry</a>(h, *p)) {
00270             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00271                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s field must be present in package: %s\n"</span>),
00272                         <a class="code" href="tagName_8c.html#a0">tagName</a>(*p), NVR);
00273             res = 1;
00274         }
00275     }
00276 
00277     <span class="keywordflow">return</span> res;
00278 }
00279 
<a name="l00286"></a><a class="code" href="parsePreamble_8c.html#a18">00286</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a18">checkForDuplicates</a>(<a class="code" href="structheaderToken.html">Header</a> h, <span class="keyword">const</span> <span class="keywordtype">char</span> * NVR)
00287         <span class="comment">/*@modifies h @*/</span>
00288 {
00289     <span class="keywordtype">int</span> res = 0;
00290     <span class="keywordtype">int</span> lastTag, tag;
00291     <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi;
00292     
00293     <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(h), lastTag = 0;
00294         <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, NULL, NULL, NULL);
00295         lastTag = tag)
00296     {
00297         <span class="keywordflow">if</span> (tag != lastTag)
00298             <span class="keywordflow">continue</span>;
00299         <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">"Duplicate %s entries in package: %s\n"</span>),
00300                      <a class="code" href="tagName_8c.html#a0">tagName</a>(tag), NVR);
00301         res = 1;
00302     }
00303     hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
00304 
00305     <span class="keywordflow">return</span> res;
00306 }
00307 
00310 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00311"></a><a class="code" href="structoptionalTag.html">00311</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structoptionalTag.html">optionalTag</a> {
<a name="l00312"></a><a class="code" href="structoptionalTag.html#m0">00312</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a>      <a class="code" href="structoptionalTag.html#m0">ot_tag</a>;
<a name="l00313"></a><a class="code" href="structoptionalTag.html#m1">00313</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structoptionalTag.html#m1">ot_mac</a>;
00314 } <a class="code" href="parsePreamble_8c.html#a6">optionalTags</a>[] = {
00315     { <a class="code" href="rpmlib_8h.html#a494a124">RPMTAG_VENDOR</a>,            <span class="stringliteral">"%{vendor}"</span> },
00316     { <a class="code" href="rpmlib_8h.html#a494a128">RPMTAG_PACKAGER</a>,          <span class="stringliteral">"%{packager}"</span> },
00317     { <a class="code" href="rpmlib_8h.html#a494a123">RPMTAG_DISTRIBUTION</a>,      <span class="stringliteral">"%{distribution}"</span> },
00318     { <a class="code" href="rpmlib_8h.html#a494a227">RPMTAG_DISTURL</a>,           <span class="stringliteral">"%{disturl}"</span> },
00319     { -1, NULL }
00320 };
00321 
<a name="l00324"></a><a class="code" href="parsePreamble_8c.html#a19">00324</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="parsePreamble_8c.html#a19">fillOutMainPackage</a>(<a class="code" href="structheaderToken.html">Header</a> h)
00325         <span class="comment">/*@globals rpmGlobalMacroContext @*/</span>
00326         <span class="comment">/*@modifies h, rpmGlobalMacroContext @*/</span>
00327 {
00328     <span class="keyword">struct </span><a class="code" href="structoptionalTag.html">optionalTag</a> *ot;
00329 
00330     <span class="keywordflow">for</span> (ot = <a class="code" href="parsePreamble_8c.html#a6">optionalTags</a>; ot-&gt;<a class="code" href="structoptionalTag.html#m1">ot_mac</a> != NULL; ot++) {
00331         <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a34">headerIsEntry</a>(h, ot-&gt;<a class="code" href="structoptionalTag.html#m0">ot_tag</a>)) {
00332             <span class="keyword">const</span> <span class="keywordtype">char</span> *val = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(ot-&gt;<a class="code" href="structoptionalTag.html#m1">ot_mac</a>, NULL);
00333             <span class="keywordflow">if</span> (val &amp;&amp; *val != <span class="charliteral">'%'</span>)
00334                 (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, ot-&gt;<a class="code" href="structoptionalTag.html#m0">ot_tag</a>, <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>, (<span class="keywordtype">void</span> *)val, 1);
00335             val = <a class="code" href="poptint_8h.html#a14">_free</a>(val);
00336         }
00337     }
00338 }
00339 
<a name="l00342"></a><a class="code" href="parsePreamble_8c.html#a20">00342</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a20">readIcon</a>(<a class="code" href="structheaderToken.html">Header</a> h, <span class="keyword">const</span> <span class="keywordtype">char</span> * file)
00343         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
00344 <span class="comment">                fileSystem@*/</span>
00345         <span class="comment">/*@modifies h, rpmGlobalMacroContext, fileSystem @*/</span>
00346 {
00347     <span class="keyword">const</span> <span class="keywordtype">char</span> *fn = NULL;
00348     <span class="keywordtype">char</span> *icon;
00349     <a class="code" href="struct__FD__s.html">FD_t</a> fd;
00350     <span class="keywordtype">int</span> rc = 0;
00351     off_t size;
00352     size_t nb, iconsize;
00353 
00354     <span class="comment">/* XXX use rpmGenPath(rootdir, "%{_sourcedir}/", file) for icon path. */</span>
00355     fn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_sourcedir}/"</span>, file, NULL);
00356 
00357     fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(fn, <span class="stringliteral">"r.ufdio"</span>);
00358     <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) {
00359         <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">"Unable to open icon %s: %s\n"</span>),
00360                 fn, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
00361         rc = <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00362         <span class="keywordflow">goto</span> exit;
00363     }
00364     size = <a class="code" href="group__rpmio.html#a12">fdSize</a>(fd);
00365     iconsize = (size &gt;= 0 ? size : (8 * BUFSIZ));
00366     <span class="keywordflow">if</span> (iconsize == 0) {
00367         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00368         rc = 0;
00369         <span class="keywordflow">goto</span> exit;
00370     }
00371 
00372     icon = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(iconsize + 1);
00373     *icon = <span class="charliteral">'\0'</span>;
00374 
00375     nb = <a class="code" href="group__rpmio.html#a77">Fread</a>(icon, <span class="keyword">sizeof</span>(icon[0]), iconsize, fd);
00376     <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a85">Ferror</a>(fd) || (size &gt;= 0 &amp;&amp; nb != size)) {
00377         <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">"Unable to read icon %s: %s\n"</span>),
00378                 fn, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
00379         rc = <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00380     }
00381     (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00382     <span class="keywordflow">if</span> (rc)
00383         <span class="keywordflow">goto</span> exit;
00384 
00385     <span class="keywordflow">if</span> (! strncmp(icon, <span class="stringliteral">"GIF"</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"GIF"</span>)-1)) {
00386         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a125">RPMTAG_GIF</a>, <a class="code" href="group__header.html#a93a72">RPM_BIN_TYPE</a>, icon, iconsize);
00387     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (! strncmp(icon, <span class="stringliteral">"/* XPM"</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"/* XPM"</span>)-1)) {
00388         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a126">RPMTAG_XPM</a>, <a class="code" href="group__header.html#a93a72">RPM_BIN_TYPE</a>, icon, iconsize);
00389     } <span class="keywordflow">else</span> {
00390         <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">"Unknown icon type: %s\n"</span>), file);
00391         rc = <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00392         <span class="keywordflow">goto</span> exit;
00393     }
00394     icon = <a class="code" href="poptint_8h.html#a14">_free</a>(icon);
00395     
00396 exit:
00397     fn = <a class="code" href="poptint_8h.html#a14">_free</a>(fn);
00398     <span class="keywordflow">return</span> rc;
00399 }
00400 
<a name="l00401"></a><a class="code" href="group__rpmbuild.html#a53">00401</a> <a class="code" href="structspectag__s.html">spectag</a> <a class="code" href="group__rpmbuild.html#a53">stashSt</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <a class="code" href="structheaderToken.html">Header</a> h, <span class="keywordtype">int</span> tag, <span class="keyword">const</span> <span class="keywordtype">char</span> * lang)
00402 {
00403     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
00404     <a class="code" href="structspectag__s.html">spectag</a> t = NULL;
00405 
00406     <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m6">st</a>) {
00407         <a class="code" href="structspectags__s.html">spectags</a> st = spec-&gt;<a class="code" href="structSpecStruct.html#m6">st</a>;
00408         <span class="keywordflow">if</span> (st-&gt;<a class="code" href="structspectags__s.html#m2">st_ntags</a> == st-&gt;<a class="code" href="structspectags__s.html#m1">st_nalloc</a>) {
00409             st-&gt;<a class="code" href="structspectags__s.html#m1">st_nalloc</a> += 10;
00410             st-&gt;<a class="code" href="structspectags__s.html#m0">st_t</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(st-&gt;<a class="code" href="structspectags__s.html#m0">st_t</a>, st-&gt;<a class="code" href="structspectags__s.html#m1">st_nalloc</a> * <span class="keyword">sizeof</span>(*(st-&gt;<a class="code" href="structspectags__s.html#m0">st_t</a>)));
00411         }
00412         t = st-&gt;<a class="code" href="structspectags__s.html#m0">st_t</a> + st-&gt;<a class="code" href="structspectags__s.html#m2">st_ntags</a>++;
00413         t-&gt;<a class="code" href="structspectag__s.html#m0">t_tag</a> = tag;
00414         t-&gt;<a class="code" href="structspectag__s.html#m1">t_startx</a> = spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a> - 1;
00415         t-&gt;<a class="code" href="structspectag__s.html#m2">t_nlines</a> = 1;
00416         t-&gt;<a class="code" href="structspectag__s.html#m3">t_lang</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(lang);
00417         t-&gt;<a class="code" href="structspectag__s.html#m4">t_msgid</a> = NULL;
00418         <span class="keywordflow">if</span> (!(t-&gt;<a class="code" href="structspectag__s.html#m3">t_lang</a> &amp;&amp; strcmp(t-&gt;<a class="code" href="structspectag__s.html#m3">t_lang</a>, <a class="code" href="rpmspec_8h.html#a4">RPMBUILD_DEFAULT_LANG</a>))) {
00419             <span class="keywordtype">char</span> *n;
00420             <span class="keywordflow">if</span> (hge(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;n, NULL)) {
00421                 <span class="keywordtype">char</span> buf[1024];
00422                 sprintf(buf, <span class="stringliteral">"%s(%s)"</span>, n, <a class="code" href="tagName_8c.html#a0">tagName</a>(tag));
00423                 t-&gt;<a class="code" href="structspectag__s.html#m4">t_msgid</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(buf);
00424             }
00425         }
00426     }
00427     <span class="comment">/*@-usereleased -compdef@*/</span>
00428     <span class="keywordflow">return</span> t;
00429     <span class="comment">/*@=usereleased =compdef@*/</span>
00430 }
00431 
<a name="l00432"></a><a class="code" href="parsePreamble_8c.html#a0">00432</a> <span class="preprocessor">#define SINGLE_TOKEN_ONLY \</span>
00433 <span class="preprocessor">if (multiToken) { \</span>
00434 <span class="preprocessor">    rpmError(RPMERR_BADSPEC, _("line %d: Tag takes single token only: %s\n"), \</span>
00435 <span class="preprocessor">             spec-&gt;lineNum, spec-&gt;line); \</span>
00436 <span class="preprocessor">    return RPMERR_BADSPEC; \</span>
00437 <span class="preprocessor">}</span>
00438 <span class="preprocessor"></span>
00439 <span class="comment">/*@-redecl@*/</span>
<a name="l00440"></a><a class="code" href="parsePreamble_8c.html#a7">00440</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a7">noLang</a>;
00441 <span class="comment">/*@=redecl@*/</span>
00442 
<a name="l00445"></a><a class="code" href="parsePreamble_8c.html#a22">00445</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a22">handlePreambleTag</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <a class="code" href="structPackageStruct.html">Package</a> pkg, <span class="keywordtype">int</span> tag, <span class="keyword">const</span> <span class="keywordtype">char</span> *macro,
00446                              <span class="keyword">const</span> <span class="keywordtype">char</span> *lang)
00447         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
00448 <span class="comment">                fileSystem @*/</span>
00449         <span class="comment">/*@modifies spec-&gt;macros, spec-&gt;st, spec-&gt;buildRootURL,</span>
00450 <span class="comment">                spec-&gt;sources, spec-&gt;numSources, spec-&gt;noSource,</span>
00451 <span class="comment">                spec-&gt;buildRestrictions, spec-&gt;BANames, spec-&gt;BACount,</span>
00452 <span class="comment">                spec-&gt;line, spec-&gt;gotBuildRootURL,</span>
00453 <span class="comment">                pkg-&gt;header, pkg-&gt;autoProv, pkg-&gt;autoReq, pkg-&gt;icon,</span>
00454 <span class="comment">                rpmGlobalMacroContext, fileSystem @*/</span>
00455 {
00456     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
00457     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = headerFreeData;
00458     <span class="keywordtype">char</span> * field = spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>;
00459     <span class="keywordtype">char</span> * end;
00460     <span class="keywordtype">char</span> ** array;
00461     <span class="keywordtype">int</span> multiToken = 0;
00462     <a class="code" href="rpmlib_8h.html#a56">rpmsenseFlags</a> tagflags;
00463     <a class="code" href="group__header.html#a13">rpmTagType</a> type;
00464     <span class="keywordtype">int</span> len;
00465     <span class="keywordtype">int</span> num;
00466     <span class="keywordtype">int</span> rc;
00467     <span class="keywordtype">int</span> xx;
00468     
00469     <span class="keywordflow">if</span> (field == NULL) <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;   <span class="comment">/* XXX can't happen */</span>
00470     <span class="comment">/* Find the start of the "field" and strip trailing space */</span>
00471     <span class="keywordflow">while</span> ((*field) &amp;&amp; (*field != <span class="charliteral">':'</span>))
00472         field++;
00473     <span class="keywordflow">if</span> (*field != <span class="charliteral">':'</span>) {
00474         <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">"line %d: Malformed tag: %s\n"</span>),
00475                  spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00476         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00477     }
00478     field++;
00479     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(field);
00480     <span class="keywordflow">if</span> (!*field) {
00481         <span class="comment">/* Empty field */</span>
00482         <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">"line %d: Empty tag: %s\n"</span>),
00483                  spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00484         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00485     }
00486     end = <a class="code" href="parsePreamble_8c.html#a14">findLastChar</a>(field);
00487     *(end+1) = <span class="charliteral">'\0'</span>;
00488 
00489     <span class="comment">/* See if this is multi-token */</span>
00490     end = field;
00491     <a class="code" href="rpmbuild_8h.html#a1">SKIPNONSPACE</a>(end);
00492     <span class="keywordflow">if</span> (*end != <span class="charliteral">'\0'</span>)
00493         multiToken = 1;
00494 
00495     <span class="keywordflow">switch</span> (tag) {
00496       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>:
00497       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>:
00498       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>:
00499       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a133">RPMTAG_URL</a>:
00500       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a235">RPMTAG_RHNPLATFORM</a>:
00501         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00502         <span class="comment">/* These macros are for backward compatibility */</span>
00503         <span class="keywordflow">if</span> (tag == <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>) {
00504             <span class="keywordflow">if</span> (strchr(field, <span class="charliteral">'-'</span>) != NULL) {
00505                 <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">"line %d: Illegal char '-' in %s: %s\n"</span>),
00506                     spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, <span class="stringliteral">"version"</span>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00507                 <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00508             }
00509             <a class="code" href="macro_8c.html#a43">addMacro</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m30">macros</a>, <span class="stringliteral">"PACKAGE_VERSION"</span>, NULL, field, <a class="code" href="rpmmacro_8h.html#a6">RMIL_OLDSPEC</a>);
00510         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tag == <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>) {
00511             <span class="keywordflow">if</span> (strchr(field, <span class="charliteral">'-'</span>) != NULL) {
00512                 <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">"line %d: Illegal char '-' in %s: %s\n"</span>),
00513                     spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, <span class="stringliteral">"release"</span>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00514                 <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00515             }
00516             <a class="code" href="macro_8c.html#a43">addMacro</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m30">macros</a>, <span class="stringliteral">"PACKAGE_RELEASE"</span>, NULL, field, <a class="code" href="rpmmacro_8h.html#a6">RMIL_OLDSPEC</a>-1);
00517         }
00518         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>, field, 1);
00519         <span class="keywordflow">break</span>;
00520       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a129">RPMTAG_GROUP</a>:
00521       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a117">RPMTAG_SUMMARY</a>:
00522         (void) <a class="code" href="group__rpmbuild.html#a53">stashSt</a>(spec, pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, lang);
00523         <span class="comment">/*@fallthrough@*/</span>
00524       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a123">RPMTAG_DISTRIBUTION</a>:
00525       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a124">RPMTAG_VENDOR</a>:
00526       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>:
00527       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a128">RPMTAG_PACKAGER</a>:
00528         <span class="keywordflow">if</span> (!*lang)
00529             (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>, field, 1);
00530         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!(<a class="code" href="parsePreamble_8c.html#a7">noLang</a> &amp;&amp; strcmp(lang, <a class="code" href="rpmspec_8h.html#a4">RPMBUILD_DEFAULT_LANG</a>)))
00531             (void) <a class="code" href="group__header.html#a48">headerAddI18NString</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, field, lang);
00532         <span class="keywordflow">break</span>;
00533       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a170">RPMTAG_BUILDROOT</a>:
00534         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00535       { <span class="keyword">const</span> <span class="keywordtype">char</span> * buildRoot = NULL;
00536         <span class="keyword">const</span> <span class="keywordtype">char</span> * buildRootURL = spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a>;
00537 
00538         <span class="comment">/*</span>
00539 <span class="comment">         * Note: rpmGenPath should guarantee a "canonical" path. That means</span>
00540 <span class="comment">         * that the following pathologies should be weeded out:</span>
00541 <span class="comment">         *          //bin//sh</span>
00542 <span class="comment">         *          //usr//bin/</span>
00543 <span class="comment">         *          /.././../usr/../bin//./sh</span>
00544 <span class="comment">         */</span>
00545         <span class="keywordflow">if</span> (buildRootURL == NULL) {
00546             buildRootURL = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(NULL, <span class="stringliteral">"%{?buildroot:%{buildroot}}"</span>, NULL);
00547             <span class="keywordflow">if</span> (strcmp(buildRootURL, <span class="stringliteral">"/"</span>)) {
00548                 spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a> = buildRootURL;
00549                 macro = NULL;
00550             } <span class="keywordflow">else</span> {
00551                 <span class="keyword">const</span> <span class="keywordtype">char</span> * specURL = field;
00552 
00553                 buildRootURL = <a class="code" href="poptint_8h.html#a14">_free</a>(buildRootURL);
00554                 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(specURL, (<span class="keyword">const</span> <span class="keywordtype">char</span> **)&amp;field);
00555                 <span class="comment">/*@-branchstate@*/</span>
00556                 <span class="keywordflow">if</span> (*field == <span class="charliteral">'\0'</span>) field = <span class="stringliteral">"/"</span>;
00557                 <span class="comment">/*@=branchstate@*/</span>
00558                 buildRootURL = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m4">rootURL</a>, field, NULL);
00559                 spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a> = buildRootURL;
00560                 field = (<span class="keywordtype">char</span> *) buildRootURL;
00561             }
00562             spec-&gt;<a class="code" href="structSpecStruct.html#m21">gotBuildRootURL</a> = 1;
00563         } <span class="keywordflow">else</span> {
00564             macro = NULL;
00565         }
00566         buildRootURL = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(NULL, spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a>, NULL);
00567         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(buildRootURL, &amp;buildRoot);
00568         <span class="comment">/*@-branchstate@*/</span>
00569         <span class="keywordflow">if</span> (*buildRoot == <span class="charliteral">'\0'</span>) buildRoot = <span class="stringliteral">"/"</span>;
00570         <span class="comment">/*@=branchstate@*/</span>
00571         <span class="keywordflow">if</span> (!strcmp(buildRoot, <span class="stringliteral">"/"</span>)) {
00572             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00573                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"BuildRoot can not be \"/\": %s\n"</span>), spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a>);
00574             buildRootURL = <a class="code" href="poptint_8h.html#a14">_free</a>(buildRootURL);
00575             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00576         }
00577         buildRootURL = <a class="code" href="poptint_8h.html#a14">_free</a>(buildRootURL);
00578       } <span class="keywordflow">break</span>;
00579       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>:
00580         <a class="code" href="parsePreamble_8c.html#a10">addOrAppendListEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, field);
00581         xx = hge(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, &amp;type, (<span class="keywordtype">void</span> **)&amp;array, &amp;num);
00582         <span class="keywordflow">while</span> (num--) {
00583             len = strlen(array[num]);
00584             <span class="keywordflow">if</span> (array[num][len - 1] == <span class="charliteral">'/'</span> &amp;&amp; len &gt; 1) {
00585                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00586                          <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Prefixes must not end with \"/\": %s\n"</span>),
00587                          spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00588                 array = hfd(array, type);
00589                 <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00590             }
00591         }
00592         array = hfd(array, type);
00593         <span class="keywordflow">break</span>;
00594       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a197">RPMTAG_DOCDIR</a>:
00595         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00596         <span class="keywordflow">if</span> (field[0] != <span class="charliteral">'/'</span>) {
00597             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00598                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Docdir must begin with '/': %s\n"</span>),
00599                      spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00600             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00601         }
00602         macro = NULL;
00603         <a class="code" href="macro_8c.html#a44">delMacro</a>(NULL, <span class="stringliteral">"_docdir"</span>);
00604         <a class="code" href="macro_8c.html#a43">addMacro</a>(NULL, <span class="stringliteral">"_docdir"</span>, NULL, field, <a class="code" href="rpmmacro_8h.html#a5">RMIL_SPEC</a>);
00605         <span class="keywordflow">break</span>;
00606       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>:
00607         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00608         <span class="keywordflow">if</span> (<a class="code" href="group__rpmbuild.html#a25">parseNum</a>(field, &amp;num)) {
00609             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00610                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Epoch/Serial field must be a number: %s\n"</span>),
00611                      spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00612             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00613         }
00614         xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, tag, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &amp;num, 1);
00615         <span class="keywordflow">break</span>;
00616       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a176">RPMTAG_AUTOREQPROV</a>:
00617         pkg-&gt;<a class="code" href="structPackageStruct.html#m3">autoReq</a> = <a class="code" href="parsePreamble_8c.html#a12">parseYesNo</a>(field);
00618         pkg-&gt;<a class="code" href="structPackageStruct.html#m4">autoProv</a> = pkg-&gt;<a class="code" href="structPackageStruct.html#m3">autoReq</a>;
00619         <span class="keywordflow">break</span>;
00620       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a207">RPMTAG_AUTOREQ</a>:
00621         pkg-&gt;<a class="code" href="structPackageStruct.html#m3">autoReq</a> = <a class="code" href="parsePreamble_8c.html#a12">parseYesNo</a>(field);
00622         <span class="keywordflow">break</span>;
00623       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a208">RPMTAG_AUTOPROV</a>:
00624         pkg-&gt;<a class="code" href="structPackageStruct.html#m4">autoProv</a> = <a class="code" href="parsePreamble_8c.html#a12">parseYesNo</a>(field);
00625         <span class="keywordflow">break</span>;
00626       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a131">RPMTAG_SOURCE</a>:
00627       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a132">RPMTAG_PATCH</a>:
00628         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00629         macro = NULL;
00630         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a14">addSource</a>(spec, pkg, field, tag)))
00631             <span class="keywordflow">return</span> rc;
00632         <span class="keywordflow">break</span>;
00633       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a156">RPMTAG_ICON</a>:
00634         <a class="code" href="parsePreamble_8c.html#a0">SINGLE_TOKEN_ONLY</a>;
00635         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a14">addSource</a>(spec, pkg, field, tag)))
00636             <span class="keywordflow">return</span> rc;
00637         <span class="keywordflow">if</span> ((rc = <a class="code" href="parsePreamble_8c.html#a20">readIcon</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, field)))
00638             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00639         <span class="keywordflow">break</span>;
00640       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a164">RPMTAG_NOSOURCE</a>:
00641       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a165">RPMTAG_NOPATCH</a>:
00642         spec-&gt;<a class="code" href="structSpecStruct.html#m27">noSource</a> = 1;
00643         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a13">parseNoSource</a>(spec, field, tag)))
00644             <span class="keywordflow">return</span> rc;
00645         <span class="keywordflow">break</span>;
00646       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a212">RPMTAG_BUILDPREREQ</a>:
00647       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a213">RPMTAG_BUILDREQUIRES</a>:
00648         <span class="keywordflow">if</span> ((rc = <a class="code" href="parsePreamble_8c.html#a13">parseBits</a>(lang, buildScriptBits, &amp;tagflags))) {
00649             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00650                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Bad %s: qualifiers: %s\n"</span>),
00651                      spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, tagName(tag), spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00652             <span class="keywordflow">return</span> rc;
00653         }
00654         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a33">parseRCPOT</a>(spec, pkg, field, tag, 0, tagflags)))
00655             <span class="keywordflow">return</span> rc;
00656         <span class="keywordflow">break</span>;
00657       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>:
00658       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a188">RPMTAG_PREREQ</a>:
00659         <span class="keywordflow">if</span> ((rc = <a class="code" href="parsePreamble_8c.html#a13">parseBits</a>(lang, installScriptBits, &amp;tagflags))) {
00660             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00661                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Bad %s: qualifiers: %s\n"</span>),
00662                      spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, tagName(tag), spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00663             <span class="keywordflow">return</span> rc;
00664         }
00665         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a33">parseRCPOT</a>(spec, pkg, field, tag, 0, tagflags)))
00666             <span class="keywordflow">return</span> rc;
00667         <span class="keywordflow">break</span>;
00668       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a214">RPMTAG_BUILDCONFLICTS</a>:
00669       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a166">RPMTAG_CONFLICTFLAGS</a>:
00670       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a218">RPMTAG_OBSOLETEFLAGS</a>:
00671       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a216">RPMTAG_PROVIDEFLAGS</a>:
00672         tagflags = <a class="code" href="rpmlib_8h.html#a497a253">RPMSENSE_ANY</a>;
00673         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a33">parseRCPOT</a>(spec, pkg, field, tag, 0, tagflags)))
00674             <span class="keywordflow">return</span> rc;
00675         <span class="keywordflow">break</span>;
00676       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a172">RPMTAG_EXCLUDEARCH</a>:
00677       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a174">RPMTAG_EXCLUSIVEARCH</a>:
00678       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a173">RPMTAG_EXCLUDEOS</a>:
00679       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a175">RPMTAG_EXCLUSIVEOS</a>:
00680         <a class="code" href="parsePreamble_8c.html#a10">addOrAppendListEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>, tag, field);
00681         <span class="keywordflow">break</span>;
00682       <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a193">RPMTAG_BUILDARCHS</a>:
00683         <span class="keywordflow">if</span> ((rc = <a class="code" href="group__popt.html#a2">poptParseArgvString</a>(field,
00684                                       &amp;(spec-&gt;<a class="code" href="structSpecStruct.html#m17">BACount</a>),
00685                                       &amp;(spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a>)))) {
00686             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00687                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line %d: Bad BuildArchitecture format: %s\n"</span>),
00688                      spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00689             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00690         }
00691         <span class="keywordflow">if</span> (!spec-&gt;<a class="code" href="structSpecStruct.html#m17">BACount</a>)
00692             spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a>);
00693         <span class="keywordflow">break</span>;
00694 
00695       <span class="keywordflow">default</span>:
00696         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a14">RPMERR_INTERNAL</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Internal error: Bogus tag %d\n"</span>), tag);
00697         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a14">RPMERR_INTERNAL</a>;
00698     }
00699 
00700     <span class="keywordflow">if</span> (macro)
00701         <a class="code" href="macro_8c.html#a43">addMacro</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m30">macros</a>, macro, NULL, field, <a class="code" href="rpmmacro_8h.html#a5">RMIL_SPEC</a>);
00702     
00703     <span class="keywordflow">return</span> 0;
00704 }
00705 
00706 <span class="comment">/* This table has to be in a peculiar order.  If one tag is the */</span>
00707 <span class="comment">/* same as another, plus a few letters, it must come first.     */</span>
00708 
<a name="l00711"></a><a class="code" href="structPreambleRec__s.html">00711</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structPreambleRec__s.html">PreambleRec_s</a> {
<a name="l00712"></a><a class="code" href="structPreambleRec__s.html#m0">00712</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> <a class="code" href="structPreambleRec__s.html#m0">tag</a>;
<a name="l00713"></a><a class="code" href="structPreambleRec__s.html#m1">00713</a>     <span class="keywordtype">int</span> <a class="code" href="structPreambleRec__s.html#m1">len</a>;
<a name="l00714"></a><a class="code" href="structPreambleRec__s.html#m2">00714</a>     <span class="keywordtype">int</span> <a class="code" href="structPreambleRec__s.html#m2">multiLang</a>;
<a name="l00715"></a><a class="code" href="structPreambleRec__s.html#m3">00715</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structPreambleRec__s.html#m3">token</a>;
00716 } * <a class="code" href="structPreambleRec__s.html">PreambleRec</a>;
00717 
00718 <span class="comment">/*@unchecked@*/</span>
<a name="l00719"></a><a class="code" href="parsePreamble_8c.html#a9">00719</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structPreambleRec__s.html">PreambleRec_s</a> preambleList[] = {
00720     {<a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>,               0, 0, <span class="stringliteral">"name"</span>},
00721     {<a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>,            0, 0, <span class="stringliteral">"version"</span>},
00722     {<a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>,            0, 0, <span class="stringliteral">"release"</span>},
00723     {<a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>,              0, 0, <span class="stringliteral">"epoch"</span>},
00724     {<a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>,              0, 0, <span class="stringliteral">"serial"</span>},
00725     {<a class="code" href="rpmlib_8h.html#a494a117">RPMTAG_SUMMARY</a>,            0, 1, <span class="stringliteral">"summary"</span>},
00726     {<a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>,            0, 0, <span class="stringliteral">"copyright"</span>},
00727     {<a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>,            0, 0, <span class="stringliteral">"license"</span>},
00728     {<a class="code" href="rpmlib_8h.html#a494a123">RPMTAG_DISTRIBUTION</a>,       0, 0, <span class="stringliteral">"distribution"</span>},
00729     {<a class="code" href="rpmlib_8h.html#a494a227">RPMTAG_DISTURL</a>,            0, 0, <span class="stringliteral">"disturl"</span>},
00730     {<a class="code" href="rpmlib_8h.html#a494a124">RPMTAG_VENDOR</a>,             0, 0, <span class="stringliteral">"vendor"</span>},
00731     {<a class="code" href="rpmlib_8h.html#a494a129">RPMTAG_GROUP</a>,              0, 1, <span class="stringliteral">"group"</span>},
00732     {<a class="code" href="rpmlib_8h.html#a494a128">RPMTAG_PACKAGER</a>,           0, 0, <span class="stringliteral">"packager"</span>},
00733     {<a class="code" href="rpmlib_8h.html#a494a133">RPMTAG_URL</a>,                0, 0, <span class="stringliteral">"url"</span>},
00734     {<a class="code" href="rpmlib_8h.html#a494a131">RPMTAG_SOURCE</a>,             0, 0, <span class="stringliteral">"source"</span>},
00735     {<a class="code" href="rpmlib_8h.html#a494a132">RPMTAG_PATCH</a>,              0, 0, <span class="stringliteral">"patch"</span>},
00736     {<a class="code" href="rpmlib_8h.html#a494a164">RPMTAG_NOSOURCE</a>,           0, 0, <span class="stringliteral">"nosource"</span>},
00737     {<a class="code" href="rpmlib_8h.html#a494a165">RPMTAG_NOPATCH</a>,            0, 0, <span class="stringliteral">"nopatch"</span>},
00738     {<a class="code" href="rpmlib_8h.html#a494a172">RPMTAG_EXCLUDEARCH</a>,        0, 0, <span class="stringliteral">"excludearch"</span>},
00739     {<a class="code" href="rpmlib_8h.html#a494a174">RPMTAG_EXCLUSIVEARCH</a>,      0, 0, <span class="stringliteral">"exclusivearch"</span>},
00740     {<a class="code" href="rpmlib_8h.html#a494a173">RPMTAG_EXCLUDEOS</a>,          0, 0, <span class="stringliteral">"excludeos"</span>},
00741     {<a class="code" href="rpmlib_8h.html#a494a175">RPMTAG_EXCLUSIVEOS</a>,        0, 0, <span class="stringliteral">"exclusiveos"</span>},
00742     {<a class="code" href="rpmlib_8h.html#a494a156">RPMTAG_ICON</a>,               0, 0, <span class="stringliteral">"icon"</span>},
00743     {<a class="code" href="rpmlib_8h.html#a494a216">RPMTAG_PROVIDEFLAGS</a>,       0, 0, <span class="stringliteral">"provides"</span>},
00744     {<a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,       0, 1, <span class="stringliteral">"requires"</span>},
00745     {<a class="code" href="rpmlib_8h.html#a494a188">RPMTAG_PREREQ</a>,             0, 1, <span class="stringliteral">"prereq"</span>},
00746     {<a class="code" href="rpmlib_8h.html#a494a166">RPMTAG_CONFLICTFLAGS</a>,      0, 0, <span class="stringliteral">"conflicts"</span>},
00747     {<a class="code" href="rpmlib_8h.html#a494a218">RPMTAG_OBSOLETEFLAGS</a>,      0, 0, <span class="stringliteral">"obsoletes"</span>},
00748     {<a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>,           0, 0, <span class="stringliteral">"prefixes"</span>},
00749     {<a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>,           0, 0, <span class="stringliteral">"prefix"</span>},
00750     {<a class="code" href="rpmlib_8h.html#a494a170">RPMTAG_BUILDROOT</a>,          0, 0, <span class="stringliteral">"buildroot"</span>},
00751     {<a class="code" href="rpmlib_8h.html#a494a193">RPMTAG_BUILDARCHS</a>,         0, 0, <span class="stringliteral">"buildarchitectures"</span>},
00752     {<a class="code" href="rpmlib_8h.html#a494a193">RPMTAG_BUILDARCHS</a>,         0, 0, <span class="stringliteral">"buildarch"</span>},
00753     {<a class="code" href="rpmlib_8h.html#a494a214">RPMTAG_BUILDCONFLICTS</a>,     0, 0, <span class="stringliteral">"buildconflicts"</span>},
00754     {<a class="code" href="rpmlib_8h.html#a494a212">RPMTAG_BUILDPREREQ</a>,        0, 1, <span class="stringliteral">"buildprereq"</span>},
00755     {<a class="code" href="rpmlib_8h.html#a494a213">RPMTAG_BUILDREQUIRES</a>,      0, 1, <span class="stringliteral">"buildrequires"</span>},
00756     {<a class="code" href="rpmlib_8h.html#a494a176">RPMTAG_AUTOREQPROV</a>,        0, 0, <span class="stringliteral">"autoreqprov"</span>},
00757     {<a class="code" href="rpmlib_8h.html#a494a207">RPMTAG_AUTOREQ</a>,            0, 0, <span class="stringliteral">"autoreq"</span>},
00758     {<a class="code" href="rpmlib_8h.html#a494a208">RPMTAG_AUTOPROV</a>,           0, 0, <span class="stringliteral">"autoprov"</span>},
00759     {<a class="code" href="rpmlib_8h.html#a494a197">RPMTAG_DOCDIR</a>,             0, 0, <span class="stringliteral">"docdir"</span>},
00760     {<a class="code" href="rpmlib_8h.html#a494a235">RPMTAG_RHNPLATFORM</a>,        0, 0, <span class="stringliteral">"rhnplatform"</span>},
00761     <span class="comment">/*@-nullassign@*/</span>   <span class="comment">/* LCL: can't add null annotation */</span>
00762     {0, 0, 0, 0}
00763     <span class="comment">/*@=nullassign@*/</span>
00764 };
00765 
<a name="l00768"></a><a class="code" href="parsePreamble_8c.html#a23">00768</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="parsePreamble_8c.html#a23">initPreambleList</a>(<span class="keywordtype">void</span>)
00769         <span class="comment">/*@globals preambleList @*/</span>
00770         <span class="comment">/*@modifies preambleList @*/</span>
00771 {
00772     <a class="code" href="structPreambleRec__s.html">PreambleRec</a> p;
00773     <span class="keywordflow">for</span> (p = preambleList; p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a> != NULL; p++)
00774         <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a>) p-&gt;<a class="code" href="structPreambleRec__s.html#m1">len</a> = strlen(p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a>);
00775 }
00776 
<a name="l00779"></a><a class="code" href="parsePreamble_8c.html#a24">00779</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="parsePreamble_8c.html#a24">findPreambleTag</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <span class="comment">/*@out@*/</span><span class="keywordtype">int</span> * tag,
00780                 <span class="comment">/*@null@*/</span> <span class="comment">/*@out@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** macro, <span class="comment">/*@out@*/</span> <span class="keywordtype">char</span> * lang)
00781         <span class="comment">/*@modifies *tag, *macro, *lang @*/</span>
00782 {
00783     <a class="code" href="structPreambleRec__s.html">PreambleRec</a> p;
00784     <span class="keywordtype">char</span> *s;
00785 
00786     <span class="keywordflow">if</span> (preambleList[0].<a class="code" href="structPreambleRec__s.html#m1">len</a> == 0)
00787         <a class="code" href="parsePreamble_8c.html#a23">initPreambleList</a>();
00788 
00789     <span class="keywordflow">for</span> (p = preambleList; p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a> != NULL; p++) {
00790         <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a> &amp;&amp; !<a class="code" href="group__rpmio.html#a1">xstrncasecmp</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>, p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a>, p-&gt;<a class="code" href="structPreambleRec__s.html#m1">len</a>))
00791             <span class="keywordflow">break</span>;
00792     }
00793     <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a> == NULL)
00794         <span class="keywordflow">return</span> 1;
00795 
00796     s = spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a> + p-&gt;<a class="code" href="structPreambleRec__s.html#m1">len</a>;
00797     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00798 
00799     <span class="keywordflow">switch</span> (p-&gt;<a class="code" href="structPreambleRec__s.html#m2">multiLang</a>) {
00800     <span class="keywordflow">default</span>:
00801     <span class="keywordflow">case</span> 0:
00802         <span class="comment">/* Unless this is a source or a patch, a ':' better be next */</span>
00803         <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structPreambleRec__s.html#m0">tag</a> != <a class="code" href="rpmlib_8h.html#a494a131">RPMTAG_SOURCE</a> &amp;&amp; p-&gt;<a class="code" href="structPreambleRec__s.html#m0">tag</a> != <a class="code" href="rpmlib_8h.html#a494a132">RPMTAG_PATCH</a>) {
00804             <span class="keywordflow">if</span> (*s != <span class="charliteral">':'</span>) <span class="keywordflow">return</span> 1;
00805         }
00806         *lang = <span class="charliteral">'\0'</span>;
00807         <span class="keywordflow">break</span>;
00808     <span class="keywordflow">case</span> 1:     <span class="comment">/* Parse optional ( &lt;token&gt; ). */</span>
00809         <span class="keywordflow">if</span> (*s == <span class="charliteral">':'</span>) {
00810             strcpy(lang, <a class="code" href="rpmspec_8h.html#a4">RPMBUILD_DEFAULT_LANG</a>);
00811             <span class="keywordflow">break</span>;
00812         }
00813         <span class="keywordflow">if</span> (*s != <span class="charliteral">'('</span>) <span class="keywordflow">return</span> 1;
00814         s++;
00815         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00816         <span class="keywordflow">while</span> (!<a class="code" href="rpmio_8h.html#a102">xisspace</a>(*s) &amp;&amp; *s != <span class="charliteral">')'</span>)
00817             *lang++ = *s++;
00818         *lang = <span class="charliteral">'\0'</span>;
00819         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00820         <span class="keywordflow">if</span> (*s != <span class="charliteral">')'</span>) <span class="keywordflow">return</span> 1;
00821         s++;
00822         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
00823         <span class="keywordflow">if</span> (*s != <span class="charliteral">':'</span>) <span class="keywordflow">return</span> 1;
00824         <span class="keywordflow">break</span>;
00825     }
00826 
00827     *tag = p-&gt;<a class="code" href="structPreambleRec__s.html#m0">tag</a>;
00828     <span class="keywordflow">if</span> (macro)
00829         <span class="comment">/*@-onlytrans -observertrans -dependenttrans@*/</span> <span class="comment">/* FIX: double indirection. */</span>
00830         *macro = p-&gt;<a class="code" href="structPreambleRec__s.html#m3">token</a>;
00831         <span class="comment">/*@=onlytrans =observertrans =dependenttrans@*/</span>
00832     <span class="keywordflow">return</span> 0;
00833 }
00834 
<a name="l00835"></a><a class="code" href="group__rpmbuild.html#a31">00835</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmbuild.html#a31">parsePreamble</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <span class="keywordtype">int</span> initialPackage)
00836 {
00837     <span class="keywordtype">int</span> nextPart;
00838     <span class="keywordtype">int</span> tag, rc, xx;
00839     <span class="keywordtype">char</span> *name, *linep;
00840     <span class="keywordtype">int</span> flag;
00841     <a class="code" href="structPackageStruct.html">Package</a> pkg;
00842     <span class="keywordtype">char</span> NVR[BUFSIZ];
00843     <span class="keywordtype">char</span> lang[BUFSIZ];
00844 
00845     strcpy(NVR, <span class="stringliteral">"(main package)"</span>);
00846 
00847     pkg = <a class="code" href="group__rpmbuild.html#a9">newPackage</a>(spec);
00848         
00849     <span class="keywordflow">if</span> (! initialPackage) {
00850         <span class="comment">/* There is one option to %package: &lt;pkg&gt; or -n &lt;pkg&gt; */</span>
00851         <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a11">parseSimplePart</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>, &amp;name, &amp;flag)) {
00852             <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 package specification: %s\n"</span>),
00853                         spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00854             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00855         }
00856         
00857         <span class="keywordflow">if</span> (!<a class="code" href="group__rpmbuild.html#a8">lookupPackage</a>(spec, name, flag, NULL)) {
00858             <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">"Package already exists: %s\n"</span>),
00859                         spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00860             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00861         }
00862         
00863         <span class="comment">/* Construct the package */</span>
00864         <span class="keywordflow">if</span> (flag == <a class="code" href="rpmbuild_8h.html#a2">PART_SUBNAME</a>) {
00865             <span class="keyword">const</span> <span class="keywordtype">char</span> * mainName;
00866             xx = <a class="code" href="group__header.html#a88">headerNVR</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, &amp;mainName, NULL, NULL);
00867             sprintf(NVR, <span class="stringliteral">"%s-%s"</span>, mainName, name);
00868         } <span class="keywordflow">else</span>
00869             strcpy(NVR, name);
00870         xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>, NVR, 1);
00871     }
00872 
00873     <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmbuild.html#a21">readLine</a>(spec, <a class="code" href="rpmbuild_8h.html#a5">STRIP_TRAILINGSPACE</a> | <a class="code" href="rpmbuild_8h.html#a6">STRIP_COMMENTS</a>)) &gt; 0) {
00874         nextPart = <a class="code" href="group__rpmbuild.html#a57a22">PART_NONE</a>;
00875     } <span class="keywordflow">else</span> {
00876         <span class="keywordflow">if</span> (rc)
00877             <span class="keywordflow">return</span> rc;
00878         <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>))) {
00879             <span class="keyword">const</span> <span class="keywordtype">char</span> * macro;
00880             <span class="comment">/* Skip blank lines */</span>
00881             linep = spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>;
00882             <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(linep);
00883             <span class="keywordflow">if</span> (*linep != <span class="charliteral">'\0'</span>) {
00884                 <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a24">findPreambleTag</a>(spec, &amp;tag, &amp;macro, lang)) {
00885                     <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">"line %d: Unknown tag: %s\n"</span>),
00886                                 spec-&gt;<a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m11">line</a>);
00887                     <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00888                 }
00889                 <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a22">handlePreambleTag</a>(spec, pkg, tag, macro, lang))
00890                     <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00891                 <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a> &amp;&amp; !spec-&gt;<a class="code" href="structSpecStruct.html#m18">recursing</a>)
00892                     <span class="keywordflow">return</span> <a class="code" href="group__rpmbuild.html#a57a38">PART_BUILDARCHITECTURES</a>;
00893             }
00894             <span class="keywordflow">if</span> ((rc =
00895                  <a class="code" href="group__rpmbuild.html#a21">readLine</a>(spec, <a class="code" href="rpmbuild_8h.html#a5">STRIP_TRAILINGSPACE</a> | <a class="code" href="rpmbuild_8h.html#a6">STRIP_COMMENTS</a>)) &gt; 0) {
00896                 nextPart = <a class="code" href="group__rpmbuild.html#a57a22">PART_NONE</a>;
00897                 <span class="keywordflow">break</span>;
00898             }
00899             <span class="keywordflow">if</span> (rc)
00900                 <span class="keywordflow">return</span> rc;
00901         }
00902     }
00903 
00904     <span class="comment">/* Do some final processing on the header */</span>
00905     
00906     <span class="keywordflow">if</span> (!spec-&gt;<a class="code" href="structSpecStruct.html#m21">gotBuildRootURL</a> &amp;&amp; spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a>) {
00907         <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">"Spec file can't use BuildRoot\n"</span>));
00908         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00909     }
00910 
00911     <span class="comment">/* XXX Skip valid arch check if not building binary package */</span>
00912     <span class="keywordflow">if</span> (!spec-&gt;<a class="code" href="structSpecStruct.html#m20">anyarch</a> &amp;&amp; <a class="code" href="parsePreamble_8c.html#a16">checkForValidArchitectures</a>(spec))
00913         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00914 
00915     <span class="keywordflow">if</span> (pkg == spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>)
00916         <a class="code" href="parsePreamble_8c.html#a19">fillOutMainPackage</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>);
00917 
00918     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a18">checkForDuplicates</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, NVR))
00919         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00920 
00921     <span class="keywordflow">if</span> (pkg != spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>)
00922         <a class="code" href="group__header.html#a67">headerCopyTags</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>,
00923                         (<a class="code" href="header_8h.html#a9">int_32</a> *)<a class="code" href="parsePreamble_8c.html#a1">copyTagsDuringParse</a>);
00924 
00925     <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a17">checkForRequired</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, NVR))
00926         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00927 
00928     <span class="keywordflow">return</span> nextPart;
00929 }
</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>