<!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> <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/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 <<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>></span> 00009 <span class="preprocessor">#include <<a class="code" href="rpmbuild_8h.html">rpmbuild.h</a>></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, &argc, &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 <pkg> or <pkg> */</span> 00065 <span class="comment">/* <pkg> 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) && <a class="code" href="rpmio_8h.html#a102">xisspace</a>(c)) s++; 00155 se = s; 00156 <span class="keywordflow">while</span> ((c = *se) && <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-><a class="code" href="structtokenBits__s.html#m0">name</a>; tb++) { 00160 <span class="keywordflow">if</span> (tb-><a class="code" href="structtokenBits__s.html#m0">name</a> != NULL && 00161 strlen(tb-><a class="code" href="structtokenBits__s.html#m0">name</a>) == (se-s) && !strncmp(tb-><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-><a class="code" href="structtokenBits__s.html#m0">name</a> == NULL) 00165 <span class="keywordflow">break</span>; 00166 bits |= tb-><a class="code" href="structtokenBits__s.html#m1">bits</a>; 00167 <span class="keywordflow">while</span> ((c = *se) && <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 && 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, &type, (<span class="keywordtype">void</span> **)&names, &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 >= 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>(&arch, NULL); 00226 <a class="code" href="group__rpmrc.html#a51">rpmGetOsInfo</a>(&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-><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-><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-><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-><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, &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-><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-><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-><a class="code" href="structoptionalTag.html#m1">ot_mac</a>, NULL); 00333 <span class="keywordflow">if</span> (val && *val != <span class="charliteral">'%'</span>) 00334 (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, ot-><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 >= 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 >= 0 && 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-><a class="code" href="structSpecStruct.html#m6">st</a>) { 00407 <a class="code" href="structspectags__s.html">spectags</a> st = spec-><a class="code" href="structSpecStruct.html#m6">st</a>; 00408 <span class="keywordflow">if</span> (st-><a class="code" href="structspectags__s.html#m2">st_ntags</a> == st-><a class="code" href="structspectags__s.html#m1">st_nalloc</a>) { 00409 st-><a class="code" href="structspectags__s.html#m1">st_nalloc</a> += 10; 00410 st-><a class="code" href="structspectags__s.html#m0">st_t</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(st-><a class="code" href="structspectags__s.html#m0">st_t</a>, st-><a class="code" href="structspectags__s.html#m1">st_nalloc</a> * <span class="keyword">sizeof</span>(*(st-><a class="code" href="structspectags__s.html#m0">st_t</a>))); 00411 } 00412 t = st-><a class="code" href="structspectags__s.html#m0">st_t</a> + st-><a class="code" href="structspectags__s.html#m2">st_ntags</a>++; 00413 t-><a class="code" href="structspectag__s.html#m0">t_tag</a> = tag; 00414 t-><a class="code" href="structspectag__s.html#m1">t_startx</a> = spec-><a class="code" href="structSpecStruct.html#m12">lineNum</a> - 1; 00415 t-><a class="code" href="structspectag__s.html#m2">t_nlines</a> = 1; 00416 t-><a class="code" href="structspectag__s.html#m3">t_lang</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(lang); 00417 t-><a class="code" href="structspectag__s.html#m4">t_msgid</a> = NULL; 00418 <span class="keywordflow">if</span> (!(t-><a class="code" href="structspectag__s.html#m3">t_lang</a> && strcmp(t-><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> **) &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-><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->lineNum, spec->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->macros, spec->st, spec->buildRootURL,</span> 00450 <span class="comment"> spec->sources, spec->numSources, spec->noSource,</span> 00451 <span class="comment"> spec->buildRestrictions, spec->BANames, spec->BACount,</span> 00452 <span class="comment"> spec->line, spec->gotBuildRootURL,</span> 00453 <span class="comment"> pkg->header, pkg->autoProv, pkg->autoReq, pkg->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-><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) && (*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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, <span class="stringliteral">"version"</span>, spec-><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-><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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, <span class="stringliteral">"release"</span>, spec-><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-><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-><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-><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-><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> && 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-><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-><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-><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> **)&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-><a class="code" href="structSpecStruct.html#m4">rootURL</a>, field, NULL); 00559 spec-><a class="code" href="structSpecStruct.html#m2">buildRootURL</a> = buildRootURL; 00560 field = (<span class="keywordtype">char</span> *) buildRootURL; 00561 } 00562 spec-><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-><a class="code" href="structSpecStruct.html#m2">buildRootURL</a>, NULL); 00567 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(buildRootURL, &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-><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-><a class="code" href="structPackageStruct.html#m0">header</a>, tag, field); 00581 xx = hge(pkg-><a class="code" href="structPackageStruct.html#m0">header</a>, tag, &type, (<span class="keywordtype">void</span> **)&array, &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> && len > 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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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, &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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structPackageStruct.html#m0">header</a>, tag, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &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-><a class="code" href="structPackageStruct.html#m3">autoReq</a> = <a class="code" href="parsePreamble_8c.html#a12">parseYesNo</a>(field); 00618 pkg-><a class="code" href="structPackageStruct.html#m4">autoProv</a> = pkg-><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-><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-><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-><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-><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, &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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, tagName(tag), spec-><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, &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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, tagName(tag), spec-><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-><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 &(spec-><a class="code" href="structSpecStruct.html#m17">BACount</a>), 00685 &(spec-><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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structSpecStruct.html#m17">BACount</a>) 00692 spec-><a class="code" href="structSpecStruct.html#m16">BANames</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(spec-><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-><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-><a class="code" href="structPreambleRec__s.html#m3">token</a> != NULL; p++) 00774 <span class="keywordflow">if</span> (p-><a class="code" href="structPreambleRec__s.html#m3">token</a>) p-><a class="code" href="structPreambleRec__s.html#m1">len</a> = strlen(p-><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-><a class="code" href="structPreambleRec__s.html#m3">token</a> != NULL; p++) { 00790 <span class="keywordflow">if</span> (p-><a class="code" href="structPreambleRec__s.html#m3">token</a> && !<a class="code" href="group__rpmio.html#a1">xstrncasecmp</a>(spec-><a class="code" href="structSpecStruct.html#m11">line</a>, p-><a class="code" href="structPreambleRec__s.html#m3">token</a>, p-><a class="code" href="structPreambleRec__s.html#m1">len</a>)) 00791 <span class="keywordflow">break</span>; 00792 } 00793 <span class="keywordflow">if</span> (p-><a class="code" href="structPreambleRec__s.html#m3">token</a> == NULL) 00794 <span class="keywordflow">return</span> 1; 00795 00796 s = spec-><a class="code" href="structSpecStruct.html#m11">line</a> + p-><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-><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-><a class="code" href="structPreambleRec__s.html#m0">tag</a> != <a class="code" href="rpmlib_8h.html#a494a131">RPMTAG_SOURCE</a> && p-><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 ( <token> ). */</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) && *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-><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-><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: <pkg> or -n <pkg> */</span> 00851 <span class="keywordflow">if</span> (<a class="code" href="parsePreamble_8c.html#a11">parseSimplePart</a>(spec-><a class="code" href="structSpecStruct.html#m11">line</a>, &name, &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-><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-><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-><a class="code" href="structSpecStruct.html#m35">packages</a>-><a class="code" href="structPackageStruct.html#m0">header</a>, &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-><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>)) > 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-><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-><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, &tag, &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-><a class="code" href="structSpecStruct.html#m12">lineNum</a>, spec-><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-><a class="code" href="structSpecStruct.html#m16">BANames</a> && !spec-><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>)) > 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-><a class="code" href="structSpecStruct.html#m21">gotBuildRootURL</a> && spec-><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-><a class="code" href="structSpecStruct.html#m20">anyarch</a> && <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-><a class="code" href="structSpecStruct.html#m35">packages</a>) 00916 <a class="code" href="parsePreamble_8c.html#a19">fillOutMainPackage</a>(pkg-><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-><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-><a class="code" href="structSpecStruct.html#m35">packages</a>) 00922 <a class="code" href="group__header.html#a67">headerCopyTags</a>(spec-><a class="code" href="structSpecStruct.html#m35">packages</a>-><a class="code" href="structPackageStruct.html#m0">header</a>, pkg-><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-><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>