If too many trusted referrers are used,
[privoxy.git] / doc / source / developer-manual.sgml
1 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[
2 <!entity % dummy "IGNORE"> 
3 <!entity supported SYSTEM "supported.sgml">
4 <!entity newfeatures SYSTEM "newfeatures.sgml">
5 <!entity p-intro SYSTEM "privoxy.sgml">
6 <!entity history SYSTEM "history.sgml">
7 <!entity seealso SYSTEM "seealso.sgml">
8 <!entity contacting SYSTEM "contacting.sgml">
9 <!entity copyright SYSTEM "copyright.sgml">
10 <!entity license SYSTEM "license.sgml">
11 <!entity p-version "3.0.4">
12 <!entity p-status "BETA">
13 <!entity % p-not-stable "INCLUDE">
14 <!entity % p-stable "IGNORE">
15 <!entity % p-text "IGNORE">        <!-- define we are not a text only doc -->
16 <!entity % p-doc "INCLUDE">        <!-- and we are a formal doc           -->
17 <!entity  my-copy "&copy;">        <!-- kludge for docbook2man            -->
18 ]>
19 <!--
20  File        :  $Source: /cvsroot/ijbswa/current/doc/source/developer-manual.sgml,v $
21
22  Purpose     :  developer manual
23                 This file belongs into
24                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
25                 
26  $Id: developer-manual.sgml,v 2.7 2006/07/18 14:48:50 david__schmidt Exp $
27
28  Copyright (C) 2001, 2002 Privoxy Developers <developers@privoxy.org>
29  See LICENSE.
30
31  ========================================================================
32  NOTE: Please read developer-manual/documentation.html before touching 
33  anything in this, or other Privoxy documentation. You have been warned!
34  Failure to abide by this rule will result in the revocation of your license 
35  to live a peaceful existence!
36  ========================================================================
37
38 -->
39
40 <article id="index">
41   <artheader>
42     <title>Privoxy Developer Manual</title>
43     <pubdate>
44      <subscript>
45     <!-- Completely the wrong markup, but very little is allowed  -->
46     <!-- in this part of an article. FIXME -->
47       <link linkend="copyright">Copyright</link> &my-copy; 2001, 2002 by 
48       <ulink url="http://www.privoxy.org">Privoxy Developers</ulink>
49      </subscript>
50     </pubdate>
51
52
53     <pubdate>$Id: developer-manual.sgml,v 2.7 2006/07/18 14:48:50 david__schmidt Exp $</pubdate>
54
55 <!--
56
57 Note: this should generate a separate page, and a live link to it. 
58 But it doesn't for some mysterious reason. Please leave commented
59 unless it can be fixed proper. For the time being, the copyright 
60 statement will be in copyright.smgl.
61
62 Hal.
63
64 <legalnotice id="legalnotice"> 
65  <para>
66   text goes here ........
67  </para>
68 </legalnotice>
69
70 -->
71
72     <abstract>
73
74 <![%dummy;[
75  <para>
76  <comment>
77   This is here to keep vim syntax file from breaking :/
78   If I knew enough to fix it, I would.
79   PLEASE DO NOT REMOVE! HB: hal@foobox.net
80  </comment>
81  </para>
82  ]]>
83 <para>
84  The developer manual provides guidance on coding, testing, packaging, documentation
85  and other issues of importance to those involved with
86  <application>Privoxy</application> development. It is mandatory (and helpful!) reading
87  for anyone who wants to join the team.
88 </para>
89
90 <!-- Include privoxy.sgml boilerplate text: -->
91
92 <!--  &p-intro; Someone interested enough in the project to contribute
93                 will already know at this point what Privoxy is. -->
94
95 <!-- end boilerplate -->
96
97 <para>
98  Please note that this document is constantly evolving. This copy represents
99  the state at the release of version &p-version;.
100  You can find the latest version of the this manual at <ulink
101  url="http://www.privoxy.org/developer-manual/">http://www.privoxy.org/developer-manual/</ulink>.
102  Please see <link linkend="contact">the Contact section</link> 
103  on how to contact the developers.
104 </para>
105 <!--        <para> -->
106 <!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
107 <!--   </para> -->
108
109     </abstract>
110   </artheader>
111
112
113 <!--   ~~~~~       New section      ~~~~~     -->
114   <sect1 id="introduction"><title>Introduction</title>
115 <!--
116
117  I don't like seeing blank space :) So added *something* here.
118
119  --> 
120     <para>
121      <application>Privoxy</application>, as an heir to
122      <application>Junkbuster</application>, is an Open Source project 
123      and licensed under the GPL. As such, <application>Privoxy</application>
124      development is potentially open to anyone who has the time, knowledge,
125      and desire to contribute in any capacity. Our goals are simply to
126      continue the mission, to improve <application>Privoxy</application>, and
127      to make it available to as wide an audience as possible. 
128     </para>
129     <para>
130      One does not have to be a programmer to contribute. Packaging, testing,
131      and porting, are all important jobs as well.
132     </para>
133
134   <!--   ~~~~~       New section      ~~~~~     -->
135   <sect2 id="quickstart"><title>Quickstart to Privoxy Development</title>
136    <!-- 
137     <para>
138       You'll need an account on <ulink
139       url="http://sourceforge.net/">Sourceforge</ulink> to support our
140       development.  Mail your ID to <ulink
141       url="mailto:developers@privoxy.org">the list</ulink> and wait until a
142       project manager has added you.
143     </para>
144    --> 
145    <para>
146     The first step is to join the <ulink
147       url="mailto:ijbswa-developers@lists.sourceforge.net">developer's mailing list</ulink>.
148     You can submit your ideas, or even better patches. Patches are best 
149     submitted to the Sourceforge tracker set up for this purpose, but 
150     can be sent to the list for review too.
151    </para>
152     <para>
153      You will also need to have a cvs package installed, which will 
154      entail having ssh installed as well (which seems to be a requirement of
155      SourceForge), in order to access the cvs repository. Having the GNU build
156      tools is also going to be important (particularly, autoconf and gmake).
157     </para>
158     <para>
159       For the time being (read, this section is under construction), you can 
160       also refer to the extensive comments in the source code. In fact, 
161       reading the code is recommended in any case.
162     </para>
163    </sect2>
164   </sect1>
165
166   <!--   ~~~~~       New section      ~~~~~     -->
167   <sect1 id="cvs"><title>The CVS Repository</title>
168     <para>
169       If you become part of the active development team, you will eventually
170       need write access to our holy grail, the CVS repository. One of the 
171       team members will need to set this up for you. Please read
172       this chapter completely before accessing via CVS.
173     </para>
174
175     <sect2 id="cvsaccess"><title>Access to CVS</title>
176       <para>
177         The project's CVS repository is hosted on
178         <ulink url="http://sourceforge.net/">SourceForge.</ulink>
179         Please refer to the chapters 6 and 7 in
180         <ulink url="http://sourceforge.net/docman/?group_id=1">SF's site
181         documentation</ulink> for the technical access details for your
182         operating system. For historical reasons, the CVS server is
183         called <literal>ijbswa.cvs.sourceforge.net</literal>, the repository is
184         called <literal>ijbswa</literal>, and the source tree module is called
185         <literal>current</literal>.
186       </para>
187     </sect2>
188
189     <sect2 id="cvsbranches">
190     <title>Branches</title>
191      <para>
192        Within the CVS repository, there are modules and branches. As
193        mentioned, the sources are in the <literal>current</literal>
194        <quote>module</quote>. Other modules are present for platform specific
195        issues. There is a webview of the CVS hierarchy at <ulink
196        url="http://ijbswa.cvs.sourceforge.net/ijbswa/">http://ijbswa.cvs.sourceforge.net/ijbswa/</ulink>,
197        which might help with visualizing how these pieces fit together.
198      </para>
199      <para>
200        Branches are used to fork a sub-development path from the main trunk.
201        Within the <literal>current</literal> module where the sources are, there
202        is always at least one <quote>branch</quote> from the main trunk
203        devoted to a stable release series. The main trunk is where active
204        development takes place for the next stable series (e.g. 3.2.x).
205        So just prior to each stable series (e.g. 3.0.x), a branch is created
206        just for stable series releases (e.g. 3.0.0 -> 3.0.1 -> 3.0.2, etc).
207        Once the initial stable release of any stable branch has taken place,
208        this branch is <emphasis>only used for bugfixes</emphasis>, which have
209        had prior testing before being committed to CVS. (See <link
210        linkend="versionnumbers">Version Numbers</link> below for details on
211        versioning.)
212      </para>
213      <para>
214       At one time there were two distinct branches: stable and unstable. The
215       more drastic changes were to be in the unstable branch. These branches 
216       have now been merged to minimize time and effort of maintaining two 
217       branches.
218      </para>
219     <!-- 
220      <para>
221        This will result in at least two active branches, which means there may
222        be occasions that require the same (or similar) item to be 
223        checked into to two different places (assuming its a bugfix and needs 
224        fixing in both the stable and unstable trees). This also means that in
225        order to have access to both trees, both will have to be checked out 
226        separately. Use the <literal>cvs -r</literal> flag to check out a 
227        branch, e.g: <literal>cvs co -r v_3_0_branch current</literal>.
228      </para>
229     --> 
230     </sect2>
231
232     <sect2 id="cvscommit"><title>CVS Commit Guidelines</title>
233       <para>
234         The source tree is the heart of every software project. Every effort must
235         be made to ensure that it is readable, compilable and consistent at all
236         times. There are differing guidelines for the stable branch and the
237         main development trunk, and we ask anyone with CVS access to strictly
238         adhere to the following guidelines:
239       </para>
240       
241       <para>
242        Basic Guidelines, for all branches:
243       </para>
244       <para>
245         <itemizedlist>
246           <listitem><para>
247             Please don't commit even 
248             a small change without testing it thoroughly first. When we're
249             close to a public release, ask a fellow developer to review your 
250             changes.
251           </para></listitem>
252           <listitem><para>
253             Your commit message should give a concise overview of <emphasis>what you
254             changed</emphasis> (no big details) and <emphasis>why you changed it</emphasis>
255             Just check previous messages for good examples.
256           </para></listitem>
257           <listitem><para>
258             Don't use the same message on multiple files, unless it equally applies to
259             all those files.
260           </para></listitem>
261           <listitem><para>
262             If your changes span multiple files, and the code won't recompile unless
263             all changes are committed (e.g. when changing the signature of a function),
264             then commit all files one after another, without long delays in between.
265             If necessary, prepare the commit messages in advance.
266           </para></listitem>
267           <listitem><para>
268             Before changing things on CVS, make sure that your changes are in line
269             with the team's general consensus on what should be done.
270           </para></listitem>
271           <listitem>
272            <para>
273             Note that near a major public release, we get more cautious.
274             There is always the possibility to submit a patch to the <ulink
275             url="http://sourceforge.net/tracker/?atid=311118&amp;group_id=11118&amp;func=browse">patch
276             tracker</ulink> instead.
277           </para>
278          </listitem> 
279         </itemizedlist>
280       </para>
281       
282 <!--
283       <para>
284        Stable branches are handled with more care, especially after the 
285        initial *.*.0 release, and we are just in bugfix mode. In addition to 
286        the above, the below applies only to the stable branch (currently the 
287        <literal>v_3_0_branch</literal> branch):
288       </para>
289       
290       <para>
291        <itemizedlist>
292         <listitem>
293          <para>
294            Do not commit <emphasis>anything</emphasis> unless your proposed
295            changes have been well tested first, preferably by other members of the
296            project, or have prior approval of the project leaders or consensus
297            of the devel list.
298          </para>
299         </listitem> 
300        <listitem>
301         <para>
302          Where possible, bugfixes and changes should be tested in the main 
303          development trunk first. There may be occasions where this is not 
304          feasible, though.
305         </para>
306        </listitem> 
307        <listitem>
308         <para>
309           Alternately, proposed changes can be submitted as patches to the patch tracker on 
310           Sourceforge first: <ulink
311           url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=311118">http://sourceforge.net/tracker/?group_id=11118&#38;atid=311118</ulink>.
312           Then ask for peer review. 
313         </para>
314        </listitem> 
315         <listitem>
316          <para>
317           Do not even think about anything except bugfixes. No new features!
318          </para>
319         </listitem> 
320      
321        </itemizedlist>
322       </para> 
323     -->
324     </sect2>
325
326   </sect1>
327         
328   <!--   ~~~~~       New section      ~~~~~     -->
329 <sect1 id="documentation"><title>Documentation Guidelines</title>
330   <para>
331     All formal documents are maintained in Docbook SGML and located in the
332     <computeroutput>doc/source/*</computeroutput> directory. You will need
333     <ulink url="http://www.docbook.org">Docbook</ulink>, the Docbook 
334     DTD's and the Docbook modular stylesheets (or comparable alternatives),
335     and either <application>jade</application> or
336     <application>openjade</application> (recommended) installed in order to
337     build docs from source. Currently there is <ulink
338     url="../user-manual/index.html"><citetitle>user-manual</citetitle></ulink>,
339     <ulink url="../faq/index.html"><citetitle>FAQ</citetitle></ulink>, and, of
340     course this, the <citetitle>developer-manual</citetitle> in this format.
341     The <citetitle>README</citetitle>, <citetitle>AUTHORS</citetitle>,
342     <citetitle>INSTALL</citetitle>,
343     <citetitle>privoxy.1</citetitle> (man page), and
344     <citetitle>config</citetitle> files are also now maintained as Docbook
345     SGML. These files, when built, in the top-level source directory are
346     generated files! Also, the <application>Privoxy</application> <filename>index.html</filename> (and a 
347     variation on this file, <filename>privoxy-index.html</filename>, 
348     meant for inclusion with doc packages), are maintained as SGML as well.
349     <emphasis>DO NOT edit these directly</emphasis>. Edit the SGML source, or
350     contact someone involved in the documentation.
351     </para> 
352     <para>
353      <filename>config</filename> requires some special handling. The reason it
354      is maintained this way is so that the extensive comments in the file
355      mirror those in <citetitle>user-manual</citetitle>. But the conversion 
356      process requires going from SGML to HTML to text to special formatting 
357      required for the embedded comments. Some of this does not survive so
358      well. Especially some of the examples that are longer than 80 characters.
359      The build process for this file outputs to <filename>config.new</filename>, 
360      which should be reviewed for errors and mis-formatting. Once satisfied
361      that it is correct, then it should be hand copied to
362      <filename>config</filename>.
363     </para>
364     <para>
365      Other, less formal documents (e.g. <filename>LICENSE</filename>) are
366      maintained as plain text files in the top-level source directory.
367     </para>
368     <para>
369      Packagers are encouraged to include this documentation. For those without
370      the ability to build the docs locally, text versions of each are kept in
371      CVS. HTML versions are also being kept in CVS under 
372      <filename>doc/webserver/*</filename>. And PDF version are kept in 
373      <filename>doc/pdf/*</filename>.
374     </para>
375     <para>
376      Formal documents are built with the Makefile targets of
377      <computeroutput>make dok</computeroutput>, or alternately
378      <computeroutput>make redhat-dok</computeroutput>. If you have problems,
379      try both. The build process uses the document SGML sources in
380      <computeroutput>doc/source/*/*</computeroutput> to update all text files in
381      <computeroutput>doc/text/</computeroutput> and to update all HTML
382      documents in <computeroutput>doc/webserver/</computeroutput>.
383     </para>
384     <para>
385      Documentation writers should please make sure documents build
386      successfully before committing to CVS, if possible.
387     </para>
388     <para>
389      How do you update the webserver (i.e. the pages on privoxy.org)?
390      
391      <orderedlist numeration="arabic">
392       <listitem><para>
393         First, build the docs by running <computeroutput>make
394         dok</computeroutput> (or alternately <computeroutput>make
395         redhat-dok</computeroutput>). For PDF docs, do <computeroutput>make
396         dok-pdf</computeroutput>.
397       </para></listitem>
398       <listitem><para>
399         Run <computeroutput>make webserver</computeroutput> which copies all
400         files from <computeroutput>doc/webserver</computeroutput> to the
401         sourceforge webserver via scp.
402       </para></listitem>
403      </orderedlist>
404   </para>
405
406   <para>
407    Finished docs should be occasionally submitted to CVS
408    (<filename>doc/webserver/*/*.html</filename>) so that those without 
409    the ability to build them locally, have access to them if needed.
410    This is especially important just prior to a new release! Please
411    do this <emphasis>after</emphasis> the <literal>$VERSION</literal> and
412    other release specific data in <filename>configure.in</filename> has been
413    updated (this is done just prior to a new release).
414   </para>
415
416 <!--   ~~~~~       New section      ~~~~~     -->
417 <sect2 id="sgml">
418 <title>Quickstart to Docbook and SGML</title>
419 <para>
420  If you are not familiar with SGML, it is a markup language similar to HTML. 
421  Actually, not a mark up language per se, but a language used to define 
422  markup languages. In fact, HTML is an SGML application. Both will use
423  <quote>tags</quote> to format text and other content. SGML tags can be much
424  more varied, and flexible, but do much of the same kinds of things. The tags,
425  or <quote>elements</quote>, are definable in SGML. There is no set
426  <quote>standards</quote>. Since we are using
427  <application>Docbook</application>, our tags are those that are defined by 
428  <application>Docbook</application>. Much of how the finish document is
429  rendered is determined by the <quote>stylesheets</quote>.
430  The stylesheets determine how each tag gets translated to HTML, or other
431  formats.
432 </para>
433
434 <para>
435  Tags in Docbook SGML need to be always <quote>closed</quote>. If not, you
436  will likely generate errors. Example: <literal>&lt;title&gt;My
437  Title&lt;/title&gt;</literal>. They are also case-insensitive, but we
438  strongly suggest using all lower case. This keeps compatibility with
439  [Docbook] <application>XML</application>.
440 </para>
441
442 <para>
443  Our documents use <quote>sections</quote> for the most part. Sections
444  will be processed into HTML headers (e.g. <literal>h1</literal> for 
445  <literal>sect1</literal>). The <application>Docbook</application> stylesheets
446  will use these to also generate the Table of Contents for each doc. Our 
447  TOC's are set to a depth of three. Meaning <literal>sect1</literal>, 
448  <literal>sect2</literal>, and <literal>sect3</literal> will have TOC 
449  entries, but <literal>sect4</literal> will not. Each section requires 
450  a <literal>&lt;title&gt;</literal> element, and at least one 
451  <literal>&lt;para&gt;</literal>. There is a limit of five section 
452  levels in Docbook, but generally three should be sufficient for our 
453  purposes.
454 </para>
455
456 <para>
457  Some common elements that you likely will use: 
458 </para>
459
460 <para>
461   <simplelist>
462     <member>
463       <emphasis>&lt;para&gt;&lt;/para&gt;</emphasis>, paragraph delimiter. Most 
464       text needs to be within paragraph elements (there are some exceptions).
465     </member>
466     <member>
467       <emphasis>&lt;emphasis&gt;&lt;/emphasis&gt;</emphasis>, the stylesheets
468       make this italics.
469     </member>
470     <member>
471       <emphasis>&lt;filename&gt;&lt;/filename&gt;</emphasis>, files and directories.
472     </member>
473     <member>
474       <emphasis>&lt;command&gt;&lt;/command&gt;</emphasis>, command examples.
475     </member>
476     <member>
477       <emphasis>&lt;literallayout&gt;&lt;/literallayout&gt;</emphasis>, like 
478       <literal>&lt;pre&gt;</literal>, more or less.
479     </member>
480     <member>
481       <emphasis>&lt;itemizedlist&gt;&lt;/itemizedlist&gt;</emphasis>, list with bullets.
482     </member>
483     <member>
484       <emphasis>&lt;listitem&gt;&lt;/listitem&gt;</emphasis>, member of the above.
485     </member>
486     <member>
487       <emphasis>&lt;screen&gt;&lt;/screen&gt;</emphasis>, screen output, implies 
488       <literal>&lt;literallayout&gt;</literal>.
489     </member>
490     <member>
491       <emphasis>&lt;ulink url="example.com"&gt;&lt;/ulink&gt;</emphasis>, like 
492       HTML <literal>&lt;a&gt;</literal> tag.
493     </member>
494     <member>
495       <emphasis>&lt;quote&gt;&lt;/quote&gt;</emphasis>, for, doh, quoting text. 
496     </member>
497   </simplelist>
498 </para>
499
500 <para>
501  Look at any of the existing docs for examples of all these and more.
502 </para>
503
504 <para>
505  You might also find <quote><ulink
506  url="http://www.bureau-cornavin.com/opensource/crash-course/">Writing Documentation
507  Using DocBook - A Crash Course</ulink></quote> useful.
508 </para>
509 </sect2>
510
511 <!--   ~~~~~       New section      ~~~~~     -->
512   <sect2 id="docstyle">
513   <title><application>Privoxy</application> Documentation Style</title>
514    <para>
515     It will be easier if everyone follows a similar writing style. This 
516     just makes it easier to read what someone else has written if it 
517     is all done in a similar fashion.
518    </para>
519    <para>
520     Here it is:
521    </para>
522    <para>
523     <itemizedlist>
524      <listitem>
525       <para>
526        All tags should be lower case.
527       </para>
528     </listitem> 
529     <listitem>
530      <para>
531        Tags delimiting a <emphasis>block</emphasis> of text (even small
532        blocks) should be on their own line. Like:
533        <literallayout>
534  &lt;para&gt;
535   Some text goes here.
536  &lt;/para&gt;
537        </literallayout>
538        Tags marking individual words, or few words, should be in-line:
539        <literallayout>
540   Just to &lt;emphasis&gt;emphasize&lt;/emphasis&gt;, some text goes here.
541        </literallayout>
542      </para>
543    </listitem> 
544    <listitem>
545     <para>
546       Tags should be nested and step indented for block text like: (except
547       in-line tags) 
548      <literallayout>
549  &lt;para&gt;
550   &lt;itemizedlist&gt;
551    &lt;para&gt;
552     &lt;listitem&gt;
553       Some text goes here in our list example.
554      &lt;/listitem&gt;
555    &lt;/para&gt;
556   &lt;/itemizedlist&gt;
557  &lt;/para&gt;
558        </literallayout>
559       This makes it easier to find the text amongst the tags ;-)
560     </para>
561    </listitem> 
562    <listitem>
563     <para>
564      Use white space to separate logical divisions within a document, 
565      like between sections. Running everything together consistently 
566      makes it harder to read and work on.
567     </para>
568    </listitem> 
569    <listitem>
570     <para>
571      Do not hesitate to make comments. Comments can either use the 
572      &lt;comment&gt; element, or the &lt;!--  --&gt; style comment 
573      familiar from HTML. (Note in Docbook v4.x &lt;comment&gt; is 
574      replaced by &lt;remark&gt;.)
575     </para>
576   </listitem> 
577   <listitem>
578    <para>
579      We have an international audience. Refrain from slang, or English 
580      idiosyncrasies (too many to list :). Humor also does not translate 
581      well sometimes.
582    </para>
583   </listitem> 
584   <listitem>
585    <para>
586     Try to keep overall line lengths in source files to 80 characters or less
587     for obvious reasons. This is not always possible, with lengthy URLs for
588     instance.
589    </para>
590   </listitem> 
591   <listitem>
592    <para>
593     Our documents are available in differing formats. Right now, they 
594     are just plain text, HTML, and PDF, but others are always a 
595     future possibility. Be careful with URLs (&lt;ulink&gt;), and avoid 
596     this mistake:
597    </para>
598    <para>
599      My favorite site is &lt;ulink url="http://example.com"&gt;here&lt;/ulink&gt;.
600    </para>
601    <para>
602      This will render as <quote>My favorite site is here</quote>, which is 
603      not real helpful in a text doc. Better like this:
604    </para>
605    <para>
606      My favorite site is &lt;ulink url="http://example.com"&gt;example.com&lt;/ulink&gt;.
607    </para>
608   </listitem>
609   <listitem>
610    <para>
611     All documents should be spell checked occasionally.
612     <application>aspell</application> can check SGML with the
613     <literal>-H</literal> option. (<application>ispell</application> I think
614     too.)
615    </para>
616   </listitem> 
617
618   </itemizedlist>
619  </para> 
620   
621   </sect2>
622
623   
624  <!--   ~~~~~       New section      ~~~~~     -->
625
626  <sect2><title>Privoxy Custom Entities</title>
627  <para>
628   <application>Privoxy</application> documentation is using 
629   a number of customized <quote>entities</quote> to facilitate 
630   documentation maintenance. 
631  </para>
632  <para>
633   We are using a set of <quote>boilerplate</quote> files with generic text,
634   that is used by multiple docs. This way we can write something once, and use
635   it repeatedly without having to re-write the same content over and over again.
636   If editing such a file, keep in mind that it should be
637   <emphasis>generic</emphasis>. That is the purpose; so it can be used in varying 
638   contexts without additional modifications.
639  </para>
640  <para>
641   We are also using what <application>Docbook</application> calls 
642   <quote>internal entities</quote>. These are like variables in 
643   programming. Well, sort of. For instance, we have the
644   <literal>p-version</literal> entity that contains the current 
645   <application>Privoxy</application> version string. You are strongly 
646   encouraged to use these where possible. Some of these obviously 
647   require re-setting with each release (done by the Makefile). A sampling of
648   custom entities are listed below. See any of the main docs for examples.
649  </para>
650
651  <para>
652   <itemizedlist>
653   <listitem>
654    <para>
655     Re- <quote>boilerplate</quote> text entities are defined like:
656    </para>
657    <para>
658     <literal>&lt;!entity supported SYSTEM "supported.sgml"&gt;</literal>
659    </para>
660    <para>
661      In this example, the contents of the file,
662      <filename>supported.sgml</filename> is available for inclusion anywhere 
663      in the doc. To make this happen, just reference the now defined 
664      entity: <literal>&#38;supported;</literal> (starts with an ampersand 
665      and ends with a semi-colon), and the contents will be dumped into 
666      the finished doc at that point.
667    </para>
668   </listitem> 
669   <listitem>
670    <para>
671     Commonly used <quote>internal entities</quote>:
672   </para>
673   <simplelist>
674    <member>
675     <emphasis>p-version</emphasis>: the <application>Privoxy</application> 
676     version string, e.g. <quote>&p-version;</quote>.
677    </member>
678    <member>
679     <emphasis>p-status</emphasis>: the project status, either 
680     <quote>alpha</quote>, <quote>beta</quote>, or <quote>stable</quote>.
681    </member>
682    <member>
683     <emphasis>p-not-stable</emphasis>: use to conditionally include 
684     text in <quote>not stable</quote> releases (e.g. <quote>beta</quote>).
685    </member>
686    <member>
687     <emphasis>p-stable</emphasis>: just the opposite.
688    </member>
689    <member>
690     <emphasis>p-text</emphasis>: this doc is only generated as text.
691    </member>
692   </simplelist>
693  </listitem> 
694  </itemizedlist>
695  </para> 
696  <para>
697   There are others in various places that are defined for a specific 
698   purpose. Read the source!
699  </para>
700  
701  </sect2>
702   
703  </sect1>
704
705 <!--     <listitem><para>be consistent with the redirect script (i.e. the <application>Privoxy</application> program -->
706 <!--       points via the redirect URL at sf to valid end-points in the document)</para></listitem> -->
707
708   <!--   ~~~~~       New section      ~~~~~     -->
709   <sect1 id="coding"><title>Coding Guidelines</title>
710
711     <sect2 id="s1"><title>Introduction</title>
712
713     <para>This set of standards is designed to make our lives easier.  It is
714     developed with the simple goal of helping us keep the "new and improved
715     <application>Privoxy</application>" consistent and reliable. Thus making
716     maintenance easier and increasing chances of success of the
717     project.</para>
718
719     <para>And that of course comes back to us as individuals. If we can
720     increase our development and product efficiencies then we can solve more
721     of the request for changes/improvements and in general feel good about
722     ourselves. ;-></para>
723
724   </sect2>
725
726     <sect2 id="s2"><title>Using Comments</title>
727  
728
729     <sect3 id="s3"><title>Comment, Comment, Comment</title>
730
731     <para><emphasis>Explanation:</emphasis></para>
732
733     <para>Comment as much as possible without commenting the obvious.
734     For example do not comment "aVariable is equal to bVariable".
735     Instead explain why aVariable should be equal to the bVariable.
736     Just because a person can read code does not mean they will
737     understand why or what is being done. A reader may spend a lot
738     more time figuring out what is going on when a simple comment
739     or explanation would have prevented the extra research. Please
740     help your brother IJB'ers out!</para>
741
742     <para>The comments will also help justify the intent of the code.
743     If the comment describes something different than what the code
744     is doing then maybe a programming error is occurring.</para>
745
746     <para><emphasis>Example:</emphasis></para>
747 <programlisting>
748 /* if page size greater than 1k ... */
749 if ( PageLength() > 1024 )
750 {
751     ... "block" the page up ...
752 }
753
754 /* if page size is small, send it in blocks */
755 if ( PageLength() > 1024 )
756 {
757     ... "block" the page up ...
758 }
759
760 This demonstrates 2 cases of "what not to do".  The first is a
761 "syntax comment".  The second is a comment that does not fit what
762 is actually being done.
763 </programlisting>
764   </sect3>
765
766     
767
768     <sect3 id="s4"><title>Use blocks for comments</title>
769
770     <para><emphasis>Explanation:</emphasis></para>
771
772     <para>Comments can help or they can clutter. They help when they
773     are differentiated from the code they describe. One line
774     comments do not offer effective separation between the comment
775     and the code. Block identifiers do, by surrounding the code
776     with a clear, definable pattern.</para>
777
778     <para><emphasis>Example:</emphasis></para>
779 <programlisting>
780 /*********************************************************************
781  * This will stand out clearly in your code!
782  *********************************************************************/
783 if ( thisVariable == thatVariable )
784 {
785    DoSomethingVeryImportant();
786 }
787
788
789 /* unfortunately, this may not */
790 if ( thisVariable == thatVariable )
791 {
792    DoSomethingVeryImportant();
793 }
794
795
796 if ( thisVariable == thatVariable ) /* this may not either */
797 {
798    DoSomethingVeryImportant();
799 }</programlisting>
800
801     <para><emphasis>Exception:</emphasis></para>
802
803     <para>If you are trying to add a small logic comment and do not
804     wish to "disrupt" the flow of the code, feel free to use a 1
805     line comment which is NOT on the same line as the code.</para>
806
807     
808   </sect3>
809     
810
811     <sect3 id="s5"><title>Keep Comments on their own line</title>
812
813     <para><emphasis>Explanation:</emphasis></para>
814
815     <para>It goes back to the question of readability. If the comment
816     is on the same line as the code it will be harder to read than
817     the comment that is on its own line.</para>
818
819     <para>There are three exceptions to this rule, which should be
820     violated freely and often: during the definition of variables,
821     at the end of closing braces, when used to comment
822     parameters.</para>
823
824     <para><emphasis>Example:</emphasis></para>
825 <programlisting>
826 /*********************************************************************
827  * This will stand out clearly in your code,
828  * But the second example won't.
829  *********************************************************************/
830 if ( thisVariable == thatVariable )
831 {
832    DoSomethingVeryImportant();
833 }
834
835 if ( thisVariable == thatVariable ) /*can you see me?*/
836 {
837    DoSomethingVeryImportant(); /*not easily*/
838 }
839
840
841 /*********************************************************************
842  * But, the encouraged exceptions:
843  *********************************************************************/
844 int urls_read     = 0;     /* # of urls read + rejected */
845 int urls_rejected = 0;     /* # of urls rejected */
846
847 if ( 1 == X )
848 {
849    DoSomethingVeryImportant();
850 }
851
852
853 short DoSomethingVeryImportant(
854    short firstparam,   /* represents something */
855    short nextparam     /* represents something else */ )
856 {
857    ...code here...
858
859 }   /* -END- DoSomethingVeryImportant */
860 </programlisting>
861   </sect3>
862     
863
864     <sect3 id="s6"><title>Comment each logical step</title>
865
866     <para><emphasis>Explanation:</emphasis></para>
867
868     <para>Logical steps should be commented to help others follow the
869     intent of the written code and comments will make the code more
870     readable.</para>
871
872     <para>If you have 25 lines of code without a comment, you should
873     probably go back into it to see where you forgot to put
874     one.</para>
875
876     <para>Most "for", "while", "do", etc... loops _probably_ need a
877     comment. After all, these are usually major logic
878     containers.</para>
879
880     
881   </sect3>
882     
883
884     <sect3 id="s7"><title>Comment All Functions Thoroughly</title>
885
886     <para><emphasis>Explanation:</emphasis></para>
887
888     <para>A reader of the code should be able to look at the comments
889     just prior to the beginning of a function and discern the
890     reason for its existence and the consequences of using it. The
891     reader should not have to read through the code to determine if
892     a given function is safe for a desired use. The proper
893     information thoroughly presented at the introduction of a
894     function not only saves time for subsequent maintenance or
895     debugging, it more importantly aids in code reuse by allowing a
896     user to determine the safety and applicability of any function
897     for the problem at hand. As a result of such benefits, all
898     functions should contain the information presented in the
899     addendum section of this document.</para>
900
901     
902   </sect3>
903     
904
905     <sect3 id="s8"><title>Comment at the end of braces if the
906     content is more than one screen length</title>
907
908     <para><emphasis>Explanation:</emphasis></para>
909
910     <para>Each closing brace should be followed on the same line by a
911     comment that describes the origination of the brace if the
912     original brace is off of the screen, or otherwise far away from
913     the closing brace. This will simplify the debugging,
914     maintenance, and readability of the code.</para>
915
916     <para>As a suggestion , use the following flags to make the
917     comment and its brace more readable:</para>
918
919     <para>use following a closing brace: } /* -END- if() or while ()
920     or etc... */</para>
921
922     <para><emphasis>Example:</emphasis></para>
923 <programlisting>
924 if ( 1 == X )
925 {
926    DoSomethingVeryImportant();
927    ...some long list of commands...
928 } /* -END- if x is 1 */
929
930 or:
931
932 if ( 1 == X )
933 {
934    DoSomethingVeryImportant();
935    ...some long list of commands...
936 } /* -END- if ( 1 == X ) */
937 </programlisting>
938   </sect3>
939     
940   </sect2>
941
942     <sect2 id="s9"><title>Naming Conventions</title>
943
944     
945
946     <sect3 id="s10"><title>Variable Names</title>
947
948     <para><emphasis>Explanation:</emphasis></para>
949
950     <para>Use all lowercase, and separate words via an underscore
951     ('_'). Do not start an identifier with an underscore. (ANSI C
952     reserves these for use by the compiler and system headers.) Do
953     not use identifiers which are reserved in ANSI C++. (E.g.
954     template, class, true, false, ...). This is in case we ever
955     decide to port Privoxy to C++.</para>
956
957     <para><emphasis>Example:</emphasis></para>
958 <programlisting>
959 int ms_iis5_hack = 0;</programlisting>
960
961     <para><emphasis>Instead of:</emphasis></para>
962
963     <para>
964 <programlisting>
965 int msiis5hack = 0; int msIis5Hack = 0;
966 </programlisting>
967 </para>
968
969     
970
971   </sect3>    
972
973     <sect3 id="s11"><title>Function Names</title>
974
975     <para><emphasis>Explanation:</emphasis></para>
976
977     <para>Use all lowercase, and separate words via an underscore
978     ('_'). Do not start an identifier with an underscore. (ANSI C
979     reserves these for use by the compiler and system headers.) Do
980     not use identifiers which are reserved in ANSI C++. (E.g.
981     template, class, true, false, ...). This is in case we ever
982     decide to port Privoxy to C++.</para>
983
984     <para><emphasis>Example:</emphasis></para>
985 <programlisting>
986 int load_some_file( struct client_state *csp )</programlisting>
987
988     <para><emphasis>Instead of:</emphasis></para>
989
990     <para>
991 <programlisting>
992 int loadsomefile( struct client_state *csp )
993 int loadSomeFile( struct client_state *csp )
994 </programlisting>
995 </para>
996
997     
998   </sect3>
999     
1000
1001     <sect3 id="s12"><title>Header file prototypes</title>
1002
1003     <para><emphasis>Explanation:</emphasis></para>
1004
1005     <para>Use a descriptive parameter name in the function prototype
1006     in header files. Use the same parameter name in the header file
1007     that you use in the c file.</para>
1008
1009     <para><emphasis>Example:</emphasis></para>
1010 <programlisting>
1011 (.h) extern int load_aclfile( struct client_state *csp );
1012 (.c) int load_aclfile( struct client_state *csp )</programlisting>
1013
1014     <para><emphasis>Instead of:</emphasis>
1015 <programlisting>
1016 (.h) extern int load_aclfile( struct client_state * ); or 
1017 (.h) extern int load_aclfile(); 
1018 (.c) int load_aclfile( struct client_state *csp )
1019 </programlisting>
1020 </para>
1021
1022     
1023   </sect3>
1024     
1025
1026     <sect3 id="s13"><title>Enumerations, and #defines</title>
1027
1028     <para><emphasis>Explanation:</emphasis></para>
1029
1030     <para>Use all capital letters, with underscores between words. Do
1031     not start an identifier with an underscore. (ANSI C reserves
1032     these for use by the compiler and system headers.)</para>
1033
1034     <para><emphasis>Example:</emphasis></para>
1035 <programlisting>
1036 (enumeration) : enum Boolean { FALSE, TRUE };
1037 (#define) : #define DEFAULT_SIZE 100;</programlisting>
1038
1039     <para><emphasis>Note:</emphasis> We have a standard naming scheme for #defines
1040     that toggle a feature in the preprocessor: FEATURE_>, where
1041     > is a short (preferably 1 or 2 word) description.</para>
1042
1043     <para><emphasis>Example:</emphasis></para>
1044 <programlisting>
1045 #define FEATURE_FORCE 1
1046
1047 #ifdef FEATURE_FORCE
1048 #define FORCE_PREFIX blah
1049 #endif /* def FEATURE_FORCE */
1050 </programlisting>
1051   </sect3>
1052     
1053
1054     <sect3 id="s14"><title>Constants</title>
1055
1056     <para><emphasis>Explanation:</emphasis></para>
1057
1058     <para>Spell common words out entirely (do not remove vowels).</para>
1059
1060     <para>Use only widely-known domain acronyms and abbreviations.
1061     Capitalize all letters of an acronym.</para>
1062
1063     <para>Use underscore (_) to separate adjacent acronyms and
1064     abbreviations. Never terminate a name with an underscore.</para>
1065
1066     <para><emphasis>Example:</emphasis></para>
1067 <programlisting>
1068 #define USE_IMAGE_LIST 1</programlisting>
1069
1070     <para><emphasis>Instead of:</emphasis></para>
1071
1072     <para>
1073 <programlisting>
1074 #define USE_IMG_LST 1 or 
1075 #define _USE_IMAGE_LIST 1 or
1076 #define USE_IMAGE_LIST_ 1 or 
1077 #define use_image_list 1 or
1078 #define UseImageList 1
1079 </programlisting>
1080 </para>
1081
1082     
1083   </sect3>
1084
1085   </sect2>
1086     
1087
1088     <sect2 id="s15"><title>Using Space</title>
1089
1090     
1091
1092     <sect3 id="s16"><title>Put braces on a line by themselves.</title>
1093
1094     <para><emphasis>Explanation:</emphasis></para>
1095
1096     <para>The brace needs to be on a line all by itself, not at the
1097     end of the statement. Curly braces should line up with the
1098     construct that they're associated with. This practice makes it
1099     easier to identify the opening and closing braces for a
1100     block.</para>
1101
1102     <para><emphasis>Example:</emphasis></para>
1103 <programlisting>
1104 if ( this == that )
1105 {
1106    ...
1107 }</programlisting>
1108
1109     <para><emphasis>Instead of:</emphasis></para>
1110
1111     <para>if ( this == that ) { ... }</para>
1112
1113     <para>or</para>
1114
1115     <para>if ( this == that ) { ... }</para>
1116
1117     <para><emphasis>Note:</emphasis> In the special case that the if-statement is
1118     inside a loop, and it is trivial, i.e. it tests for a
1119     condition that is obvious from the purpose of the block,
1120     one-liners as above may optically preserve the loop structure
1121     and make it easier to read.</para>
1122
1123     <para><emphasis>Status:</emphasis> developer-discretion.</para>
1124
1125     <para><emphasis>Example exception:</emphasis></para>
1126 <programlisting>
1127 while ( more lines are read )
1128 {
1129    /* Please document what is/is not a comment line here */
1130    if ( it's a comment ) continue;
1131
1132    do_something( line );
1133 }
1134 </programlisting>
1135   </sect3>
1136     
1137
1138     <sect3 id="s17"><title>ALL control statements should have a
1139     block</title>
1140
1141     <para><emphasis>Explanation:</emphasis></para>
1142
1143     <para>Using braces to make a block will make your code more
1144     readable and less prone to error. All control statements should
1145     have a block defined.</para>
1146
1147     <para><emphasis>Example:</emphasis></para>
1148 <programlisting>
1149 if ( this == that )
1150 {
1151    DoSomething();
1152    DoSomethingElse();
1153 }</programlisting>
1154
1155     <para><emphasis>Instead of:</emphasis></para>
1156
1157     <para>if ( this == that ) DoSomething(); DoSomethingElse();</para>
1158
1159     <para>or</para>
1160
1161     <para>if ( this == that ) DoSomething();</para>
1162
1163     <para><emphasis>Note:</emphasis> The first example in "Instead of" will execute
1164     in a manner other than that which the developer desired (per
1165     indentation). Using code braces would have prevented this
1166     "feature". The "explanation" and "exception" from the point
1167     above also applies.</para>
1168
1169     
1170   </sect3>
1171     
1172
1173     <sect3 id="s18"><title>Do not belabor/blow-up boolean
1174     expressions</title>
1175
1176     <para><emphasis>Example:</emphasis></para>
1177 <programlisting>
1178 structure->flag = ( condition );</programlisting>
1179
1180     <para><emphasis>Instead of:</emphasis></para>
1181
1182     <para>if ( condition ) { structure->flag = 1; } else {
1183     structure->flag = 0; }</para>
1184
1185     <para><emphasis>Note:</emphasis> The former is readable and concise. The later
1186     is wordy and inefficient. Please assume that any developer new
1187     to the project has at least a "good" knowledge of C/C++. (Hope
1188     I do not offend by that last comment ... 8-)</para>
1189
1190     
1191   </sect3>
1192     
1193
1194     <sect3 id="s19"><title>Use white space freely because it is
1195     free</title>
1196
1197     <para><emphasis>Explanation:</emphasis></para>
1198
1199     <para>Make it readable. The notable exception to using white space
1200     freely is listed in the next guideline.</para>
1201
1202     <para><emphasis>Example:</emphasis></para>
1203 <programlisting>
1204 int firstValue   = 0;
1205 int someValue    = 0;
1206 int anotherValue = 0;
1207 int thisVariable = 0;
1208
1209 if ( thisVariable == thatVariable )
1210
1211 firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
1212 </programlisting>
1213   </sect3>
1214     
1215
1216     <sect3 id="s20"><title>Don't use white space around structure
1217     operators</title>
1218
1219     <para><emphasis>Explanation:</emphasis></para>
1220
1221     <para>- structure pointer operator ( "->" ) - member operator (
1222     "." ) - functions and parentheses</para>
1223
1224     <para>It is a general coding practice to put pointers, references,
1225     and function parentheses next to names. With spaces, the
1226     connection between the object and variable/function name is not
1227     as clear.</para>
1228
1229     <para><emphasis>Example:</emphasis></para>
1230 <programlisting>
1231 aStruct->aMember;
1232 aStruct.aMember;
1233 FunctionName();</programlisting>
1234
1235     <para><emphasis>Instead of:</emphasis> aStruct -> aMember; aStruct . aMember;
1236     FunctionName ();</para>
1237
1238     
1239   </sect3>
1240     
1241
1242     <sect3 id="s21"><title>Make the last brace of a function stand
1243     out</title>
1244
1245     <para><emphasis>Example:</emphasis></para>
1246 <programlisting>
1247 int function1( ... )
1248 {
1249    ...code...
1250    return( retCode );
1251
1252 }   /* -END- function1 */
1253
1254
1255 int function2( ... )
1256 {
1257 }   /* -END- function2 */
1258 </programlisting>
1259
1260     <para><emphasis>Instead of:</emphasis></para>
1261
1262     <para>int function1( ... ) { ...code... return( retCode ); } int
1263     function2( ... ) { }</para>
1264
1265     <para><emphasis>Note:</emphasis> Use 1 blank line before the closing brace and 2
1266     lines afterward. This makes the end of function standout to
1267     the most casual viewer. Although function comments help
1268     separate functions, this is still a good coding practice. In
1269     fact, I follow these rules when using blocks in "for", "while",
1270     "do" loops, and long if {} statements too. After all whitespace
1271     is free!</para>
1272
1273     <para><emphasis>Status:</emphasis> developer-discretion on the number of blank
1274     lines. Enforced is the end of function comments.</para>
1275
1276     
1277   </sect3>
1278     
1279
1280     <sect3 id="s22"><title>Use 3 character indentions</title>
1281
1282     <para><emphasis>Explanation:</emphasis></para>
1283
1284     <para>If some use 8 character TABs and some use 3 character TABs,
1285     the code can look *very* ragged. So use 3 character indentions
1286     only. If you like to use TABs, pass your code through a filter
1287     such as "expand -t3" before checking in your code.</para>
1288
1289     <para><emphasis>Example:</emphasis></para>
1290 <programlisting>
1291 static const char * const url_code_map[256] =
1292 {
1293    NULL, ...
1294 };
1295
1296
1297 int function1( ... )
1298 {
1299    if ( 1 )
1300    {
1301       return( ALWAYS_TRUE );
1302    }
1303    else
1304    {
1305       return( HOW_DID_YOU_GET_HERE );
1306    }
1307
1308    return( NEVER_GETS_HERE );
1309
1310 }
1311 </programlisting>
1312   </sect3>
1313
1314   </sect2>
1315     
1316
1317     <sect2 id="s23"><title>Initializing</title>
1318
1319     
1320
1321     <sect3 id="s24"><title>Initialize all variables</title>
1322
1323     <para><emphasis>Explanation:</emphasis></para>
1324
1325     <para>Do not assume that the variables declared will not be used
1326     until after they have been assigned a value somewhere else in
1327     the code. Remove the chance of accidentally using an unassigned
1328     variable.</para>
1329
1330     <para><emphasis>Example:</emphasis></para>
1331 <programlisting>
1332 short anShort = 0;
1333 float aFloat  = 0;
1334 struct *ptr = NULL;</programlisting>
1335
1336     <para><emphasis>Note:</emphasis> It is much easier to debug a SIGSEGV if the
1337     message says you are trying to access memory address 00000000
1338     and not 129FA012; or arrayPtr[20] causes a SIGSEV vs.
1339     arrayPtr[0].</para>
1340
1341     <para><emphasis>Status:</emphasis> developer-discretion if and only if the
1342     variable is assigned a value "shortly after" declaration.</para>
1343
1344   </sect3>
1345   </sect2>
1346     
1347
1348     <sect2 id="s25"><title>Functions</title>
1349
1350     
1351
1352     <sect3 id="s26"><title>Name functions that return a boolean as a
1353     question.</title>
1354
1355     <para><emphasis>Explanation:</emphasis></para>
1356
1357     <para>Value should be phrased as a question that would logically
1358     be answered as a true or false statement</para>
1359
1360     <para><emphasis>Example:</emphasis></para>
1361 <programlisting>
1362 ShouldWeBlockThis();
1363 ContainsAnImage();
1364 IsWebPageBlank();
1365 </programlisting>
1366   </sect3>
1367     
1368
1369     <sect3 id="s27"><title>Always specify a return type for a
1370     function.</title>
1371
1372     <para><emphasis>Explanation:</emphasis></para>
1373
1374     <para>The default return for a function is an int. To avoid
1375     ambiguity, create a return for a function when the return has a
1376     purpose, and create a void return type if the function does not
1377     need to return anything.</para>
1378
1379     
1380   </sect3>
1381     
1382
1383     <sect3 id="s28"><title>Minimize function calls when iterating by
1384     using variables</title>
1385
1386     <para><emphasis>Explanation:</emphasis></para>
1387
1388     <para>It is easy to write the following code, and a clear argument
1389     can be made that the code is easy to understand:</para>
1390
1391     <para><emphasis>Example:</emphasis></para>
1392 <programlisting>
1393 for ( size_t cnt = 0; cnt &lt; blockListLength(); cnt ++ )
1394 {
1395    ....
1396 }</programlisting>
1397
1398     <para><emphasis>Note:</emphasis> Unfortunately, this makes a function call for
1399     each and every iteration. This increases the overhead in the
1400     program, because the compiler has to look up the function each
1401     time, call it, and return a value. Depending on what occurs in
1402     the blockListLength() call, it might even be creating and
1403     destroying structures with each iteration, even though in each
1404     case it is comparing "cnt" to the same value, over and over.
1405     Remember too - even a call to blockListLength() is a function
1406     call, with the same overhead.</para>
1407
1408     <para>Instead of using a function call during the iterations,
1409     assign the value to a variable, and evaluate using the
1410     variable.</para>
1411
1412     <para><emphasis>Example:</emphasis></para>
1413 <programlisting>
1414 size_t len = blockListLength();
1415
1416 for ( size_t cnt = 0; cnt &lt; len; cnt ++ )
1417 {
1418    ....
1419 }</programlisting>
1420
1421     <para><emphasis>Exceptions:</emphasis> if the value of blockListLength() *may*
1422     change or could *potentially* change, then you must code the
1423     function call in the for/while loop.</para>
1424
1425     
1426   </sect3>
1427     
1428
1429     <sect3 id="s29"><title>Pass and Return by Const Reference</title>
1430
1431     <para><emphasis>Explanation:</emphasis></para>
1432
1433     <para>This allows a developer to define a const pointer and call
1434     your function. If your function does not have the const
1435     keyword, we may not be able to use your function. Consider
1436     strcmp, if it were defined as: extern int strcmp( char *s1,
1437     char *s2 );</para>
1438
1439     <para>I could then not use it to compare argv's in main: int main(
1440     int argc, const char *argv[] ) { strcmp( argv[0], "privoxy"
1441     ); }</para>
1442
1443     <para>Both these pointers are *const*! If the c runtime library
1444     maintainers do it, we should too.</para>
1445
1446     
1447   </sect3>
1448     
1449
1450     <sect3 id="s30"><title>Pass and Return by Value</title>
1451
1452     <para><emphasis>Explanation:</emphasis></para>
1453
1454     <para>Most structures cannot fit onto a normal stack entry (i.e.
1455     they are not 4 bytes or less). Aka, a function declaration
1456     like: int load_aclfile( struct client_state csp )</para>
1457
1458     <para>would not work. So, to be consistent, we should declare all
1459     prototypes with "pass by value": int load_aclfile( struct
1460     client_state *csp )</para>
1461
1462     
1463   </sect3>
1464     
1465
1466     <sect3 id="s31"><title>Names of include files</title>
1467
1468     <para><emphasis>Explanation:</emphasis></para>
1469
1470     <para>Your include statements should contain the file name without
1471     a path. The path should be listed in the Makefile, using -I as
1472     processor directive to search the indicated paths. An exception
1473     to this would be for some proprietary software that utilizes a
1474     partial path to distinguish their header files from system or
1475     other header files.</para>
1476
1477     <para><emphasis>Example:</emphasis></para>
1478 <programlisting>
1479 #include &lt;iostream.h&gt;     /* This is not a local include */
1480 #include "config.h"       /* This IS a local include */
1481 </programlisting>
1482
1483     <para><emphasis>Exception:</emphasis></para>
1484
1485     <para>
1486 <programlisting>
1487 /* This is not a local include, but requires a path element. */ 
1488 #include &lt;sys/fileName.h&gt;
1489 </programlisting>
1490 </para>
1491
1492     <para><emphasis>Note:</emphasis> Please! do not add "-I." to the Makefile
1493     without a _very_ good reason. This duplicates the #include
1494     "file.h" behavior.</para>
1495
1496     
1497   </sect3>
1498     
1499
1500     <sect3 id="s32"><title>Provide multiple inclusion
1501     protection</title>
1502
1503     <para><emphasis>Explanation:</emphasis></para>
1504
1505     <para>Prevents compiler and linker errors resulting from
1506     redefinition of items.</para>
1507
1508     <para>Wrap each header file with the following syntax to prevent
1509     multiple inclusions of the file. Of course, replace PROJECT_H
1510     with your file name, with "." Changed to "_", and make it
1511     uppercase.</para>
1512
1513     <para><emphasis>Example:</emphasis></para>
1514 <programlisting>
1515 #ifndef PROJECT_H_INCLUDED
1516 #define PROJECT_H_INCLUDED
1517  ...
1518 #endif /* ndef PROJECT_H_INCLUDED */
1519 </programlisting>
1520   </sect3>
1521     
1522
1523     <sect3 id="s33"><title>Use `extern "C"` when appropriate</title>
1524
1525     <para><emphasis>Explanation:</emphasis></para>
1526
1527     <para>If our headers are included from C++, they must declare our
1528     functions as `extern "C"`. This has no cost in C, but increases
1529     the potential re-usability of our code.</para>
1530
1531     <para><emphasis>Example:</emphasis></para>
1532 <programlisting>
1533 #ifdef __cplusplus
1534 extern "C"
1535 {
1536 #endif /* def __cplusplus */
1537
1538 ... function definitions here ...
1539
1540 #ifdef __cplusplus
1541 }
1542 #endif /* def __cplusplus */
1543 </programlisting>
1544   </sect3>
1545     
1546
1547     <sect3 id="s34"><title>Where Possible, Use Forward Struct
1548     Declaration Instead of Includes</title>
1549
1550     <para><emphasis>Explanation:</emphasis></para>
1551
1552     <para>Useful in headers that include pointers to other struct's.
1553     Modifications to excess header files may cause needless
1554     compiles.</para>
1555
1556     <para><emphasis>Example:</emphasis></para>
1557 <programlisting>
1558 /*********************************************************************
1559  * We're avoiding an include statement here!
1560  *********************************************************************/
1561 struct file_list;
1562 extern file_list *xyz;</programlisting>
1563
1564     <para><emphasis>Note:</emphasis> If you declare "file_list xyz;" (without the
1565     pointer), then including the proper header file is necessary.
1566     If you only want to prototype a pointer, however, the header
1567     file is unnecessary.</para>
1568
1569     <para><emphasis>Status:</emphasis> Use with discretion.</para>
1570
1571     
1572   </sect3>
1573   </sect2>
1574
1575     <sect2 id="s35"><title>General Coding Practices</title>
1576
1577     
1578
1579     <sect3 id="s36"><title>Turn on warnings</title>
1580
1581     <para><emphasis>Explanation</emphasis></para>
1582
1583     <para>Compiler warnings are meant to help you find bugs. You
1584     should turn on as many as possible. With GCC, the switch is
1585     "-Wall". Try and fix as many warnings as possible.</para>
1586
1587     
1588   </sect3>
1589     
1590
1591     <sect3 id="s37"><title>Provide a default case for all switch
1592     statements</title>
1593
1594     <para><emphasis>Explanation:</emphasis></para>
1595
1596     <para>What you think is guaranteed is never really guaranteed. The
1597     value that you don't think you need to check is the one that
1598     someday will be passed. So, to protect yourself from the
1599     unknown, always have a default step in a switch statement.</para>
1600
1601     <para><emphasis>Example:</emphasis></para>
1602 <programlisting>
1603 switch( hash_string( cmd ) )
1604 {
1605    case hash_actions_file :
1606       ... code ...
1607       break;
1608
1609    case hash_confdir :
1610       ... code ...
1611       break;
1612
1613    default :
1614       log_error( ... );
1615       ... anomaly code goes here ...
1616       continue; / break; / exit( 1 ); / etc ...
1617
1618 } /* end switch( hash_string( cmd ) ) */</programlisting>
1619
1620     <para><emphasis>Note:</emphasis> If you already have a default condition, you
1621     are obviously exempt from this point. Of note, most of the
1622     WIN32 code calls `DefWindowProc' after the switch statement.
1623     This API call *should* be included in a default statement.</para>
1624
1625     <para><emphasis>Another Note:</emphasis> This is not so much a readability issue
1626     as a robust programming issue. The "anomaly code goes here" may
1627     be no more than a print to the STDERR stream (as in
1628     load_config). Or it may really be an ABEND condition.</para>
1629
1630     <para><emphasis>Status:</emphasis> Programmer discretion is advised.</para>
1631
1632     
1633   </sect3>
1634     
1635
1636     <sect3 id="s38"><title>Try to avoid falling through cases in a
1637     switch statement.</title>
1638
1639     <para><emphasis>Explanation:</emphasis></para>
1640
1641     <para>In general, you will want to have a 'break' statement within
1642     each 'case' of a switch statement. This allows for the code to
1643     be more readable and understandable, and furthermore can
1644     prevent unwanted surprises if someone else later gets creative
1645     and moves the code around.</para>
1646
1647     <para>The language allows you to plan the fall through from one
1648     case statement to another simply by omitting the break
1649     statement within the case statement. This feature does have
1650     benefits, but should only be used in rare cases. In general,
1651     use a break statement for each case statement.</para>
1652
1653     <para>If you choose to allow fall through, you should comment both
1654     the fact of the fall through and reason why you felt it was
1655     necessary.</para>
1656
1657     
1658   </sect3>
1659     
1660
1661     <sect3 id="s39"><title>Use 'long' or 'short' Instead of
1662     'int'</title>
1663
1664     <para><emphasis>Explanation:</emphasis></para>
1665
1666     <para>On 32-bit platforms, int usually has the range of long. On
1667     16-bit platforms, int has the range of short.</para>
1668
1669     <para><emphasis>Status:</emphasis> open-to-debate. In the case of most FSF
1670     projects (including X/GNU-Emacs), there are typedefs to int4,
1671     int8, int16, (or equivalence ... I forget the exact typedefs
1672     now). Should we add these to IJB now that we have a "configure"
1673     script?</para>
1674
1675     
1676   </sect3>
1677     
1678
1679     <sect3 id="s40"><title>Don't mix size_t and other types</title>
1680
1681     <para><emphasis>Explanation:</emphasis></para>
1682
1683     <para>The type of size_t varies across platforms. Do not make
1684     assumptions about whether it is signed or unsigned, or about
1685     how long it is. Do not compare a size_t against another
1686     variable of a different type (or even against a constant)
1687     without casting one of the values. Try to avoid using size_t if
1688     you can.</para>
1689
1690     
1691   </sect3>
1692     
1693
1694     <sect3 id="s41"><title>Declare each variable and struct on its
1695     own line.</title>
1696
1697     <para><emphasis>Explanation:</emphasis></para>
1698
1699     <para>It can be tempting to declare a series of variables all on
1700     one line. Don't.</para>
1701
1702     <para><emphasis>Example:</emphasis></para>
1703 <programlisting>
1704 long a = 0;
1705 long b = 0;
1706 long c = 0;</programlisting>
1707
1708     <para><emphasis>Instead of:</emphasis></para>
1709
1710     <para>long a, b, c;</para>
1711
1712     <para><emphasis>Explanation:</emphasis> - there is more room for comments on the
1713     individual variables - easier to add new variables without
1714     messing up the original ones - when searching on a variable to
1715     find its type, there is less clutter to "visually"
1716     eliminate</para>
1717
1718     <para><emphasis>Exceptions:</emphasis> when you want to declare a bunch of loop
1719     variables or other trivial variables; feel free to declare them
1720     on 1 line. You should, although, provide a good comment on
1721     their functions.</para>
1722
1723     <para><emphasis>Status:</emphasis> developer-discretion.</para>
1724
1725     
1726   </sect3>
1727     
1728
1729     <sect3 id="s42"><title>Use malloc/zalloc sparingly</title>
1730
1731     <para><emphasis>Explanation:</emphasis></para>
1732
1733     <para>Create a local struct (on the stack) if the variable will
1734     live and die within the context of one function call.</para>
1735
1736     <para>Only "malloc" a struct (on the heap) if the variable's life
1737     will extend beyond the context of one function call.</para>
1738
1739     <para><emphasis>Example:</emphasis></para>
1740 <programlisting>
1741 If a function creates a struct and stores a pointer to it in a
1742 list, then it should definitely be allocated via `malloc'.
1743 </programlisting>
1744   </sect3>
1745     
1746
1747     <sect3 id="s43"><title>The Programmer Who Uses 'malloc' is
1748     Responsible for Ensuring 'free'</title>
1749
1750     <para><emphasis>Explanation:</emphasis></para>
1751
1752     <para>If you have to "malloc" an instance, you are responsible for
1753     insuring that the instance is `free'd, even if the deallocation
1754     event falls within some other programmer's code. You are also
1755     responsible for ensuring that deletion is timely (i.e. not too
1756     soon, not too late). This is known as "low-coupling" and is a
1757     "good thing (tm)". You may need to offer a
1758     free/unload/destructor type function to accommodate this.</para>
1759
1760     <para><emphasis>Example:</emphasis></para>
1761 <programlisting>
1762 int load_re_filterfile( struct client_state *csp ) { ... }
1763 static void unload_re_filterfile( void *f ) { ... }</programlisting>
1764
1765     <para><emphasis>Exceptions:</emphasis></para>
1766
1767     <para>The developer cannot be expected to provide `free'ing
1768     functions for C run-time library functions ... such as
1769     `strdup'.</para>
1770
1771     <para><emphasis>Status:</emphasis> developer-discretion. The "main" use of this
1772     standard is for allocating and freeing data structures (complex
1773     or nested).</para>
1774
1775     
1776   </sect3>
1777     
1778
1779     <sect3 id="s44"><title>Add loaders to the `file_list' structure
1780     and in order</title>
1781
1782     <para><emphasis>Explanation:</emphasis></para>
1783
1784     <para>I have ordered all of the "blocker" file code to be in alpha
1785     order. It is easier to add/read new blockers when you expect a
1786     certain order.</para>
1787
1788     <para><emphasis>Note:</emphasis> It may appear that the alpha order is broken in
1789     places by POPUP tests coming before PCRS tests. But since
1790     POPUPs can also be referred to as KILLPOPUPs, it is clear that
1791     it should come first.</para>
1792
1793     
1794   </sect3>
1795     
1796
1797     <sect3 id="s45"><title>"Uncertain" new code and/or changes to
1798     existing code, use FIXME</title>
1799
1800     <para><emphasis>Explanation:</emphasis></para>
1801
1802     <para>If you have enough confidence in new code or confidence in
1803     your changes, but are not *quite* sure of the repercussions,
1804     add this:</para>
1805
1806     <para>/* FIXME: this code has a logic error on platform XYZ, *
1807     attempting to fix */ #ifdef PLATFORM ...changed code here...
1808     #endif</para>
1809
1810     <para>or:</para>
1811
1812     <para>/* FIXME: I think the original author really meant this...
1813     */ ...changed code here...</para>
1814
1815     <para>or:</para>
1816
1817     <para>/* FIXME: new code that *may* break something else... */
1818     ...new code here...</para>
1819
1820     <para><emphasis>Note:</emphasis> If you make it clear that this may or may not
1821     be a "good thing (tm)", it will be easier to identify and
1822     include in the project (or conversely exclude from the
1823     project).</para>
1824
1825     
1826   </sect3>
1827
1828   </sect2>
1829
1830     <sect2 id="s46"><title>Addendum: Template for files and function
1831     comment blocks:</title>
1832
1833     <para><emphasis>Example for file comments:</emphasis></para>
1834 <programlisting>
1835 const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 2.7 2006/07/18 14:48:50 david__schmidt Exp $";
1836 /*********************************************************************
1837  *
1838  * File        :  $S<!-- Break CVS Substitution -->ource$
1839  *
1840  * Purpose     :  (Fill me in with a good description!)
1841  *
1842  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
1843  *                Privoxy team. http://www.privoxy.org/
1844  *
1845  *                Based on the Internet Junkbuster originally written
1846  *                by and Copyright (C) 1997 Anonymous Coders and
1847  *                Junkbusters Corporation.  http://www.junkbusters.com
1848  *
1849  *                This program is free software; you can redistribute it
1850  *                and/or modify it under the terms of the GNU General
1851  *                Public License as published by the Free Software
1852  *                Foundation; either version 2 of the License, or (at
1853  *                your option) any later version.
1854  *
1855  *                This program is distributed in the hope that it will
1856  *                be useful, but WITHOUT ANY WARRANTY; without even the
1857  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
1858  *                PARTICULAR PURPOSE.  See the GNU General Public
1859  *                License for more details.
1860  *
1861  *                The GNU General Public License should be included with
1862  *                this file.  If not, you can view it at
1863  *                http://www.gnu.org/copyleft/gpl.html
1864  *                or write to the Free Software Foundation, Inc., 59
1865  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
1866  *
1867  * Revisions   :
1868  *    $L<!-- Break CVS Substitution -->og$
1869  *
1870  *********************************************************************/
1871
1872
1873 #include "config.h"
1874
1875    ...necessary include files for us to do our work...
1876
1877 const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
1878 </programlisting>
1879
1880     <para><emphasis>Note:</emphasis> This declares the rcs variables that should be
1881     added to the "show-proxy-args" page. If this is a brand new
1882     creation by you, you are free to change the "Copyright" section
1883     to represent the rights you wish to maintain.</para>
1884
1885     <para><emphasis>Note:</emphasis> The formfeed character that is present right
1886     after the comment flower box is handy for (X|GNU)Emacs users to
1887     skip the verbiage and get to the heart of the code (via
1888     `forward-page' and `backward-page'). Please include it if you
1889     can.</para>
1890
1891     <para><emphasis>Example for file header comments:</emphasis></para>
1892 <programlisting>
1893 #ifndef _FILENAME_H
1894 #define _FILENAME_H
1895 #define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 2.7 2006/07/18 14:48:50 david__schmidt Exp $"
1896 /*********************************************************************
1897  *
1898  * File        :  $S<!-- Break CVS Substitution -->ource$
1899  *
1900  * Purpose     :  (Fill me in with a good description!)
1901  *
1902  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
1903  *                Privoxy team. http://www.privoxy.org/
1904  *
1905  *                Based on the Internet Junkbuster originally written
1906  *                by and Copyright (C) 1997 Anonymous Coders and
1907  *                Junkbusters Corporation.  http://www.junkbusters.com
1908  *
1909  *                This program is free software; you can redistribute it
1910  *                and/or modify it under the terms of the GNU General
1911  *                Public License as published by the Free Software
1912  *                Foundation; either version 2 of the License, or (at
1913  *                your option) any later version.
1914  *
1915  *                This program is distributed in the hope that it will
1916  *                be useful, but WITHOUT ANY WARRANTY; without even the
1917  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
1918  *                PARTICULAR PURPOSE.  See the GNU General Public
1919  *                License for more details.
1920  *
1921  *                The GNU General Public License should be included with
1922  *                this file.  If not, you can view it at
1923  *                http://www.gnu.org/copyleft/gpl.html
1924  *                or write to the Free Software Foundation, Inc., 59
1925  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
1926  *
1927  * Revisions   :
1928  *    $L<!-- Break CVS Substitution -->og$
1929  *
1930  *********************************************************************/
1931
1932
1933 #include "project.h"
1934
1935 #ifdef __cplusplus
1936 extern "C" {
1937 #endif
1938
1939    ... function headers here ...
1940
1941
1942 /* Revision control strings from this header and associated .c file */
1943 extern const char FILENAME_rcs[];
1944 extern const char FILENAME_h_rcs[];
1945
1946
1947 #ifdef __cplusplus
1948 } /* extern "C" */
1949 #endif
1950
1951 #endif /* ndef _FILENAME_H */
1952
1953 /*
1954   Local Variables:
1955   tab-width: 3
1956   end:
1957 */
1958 </programlisting>
1959
1960     <para><emphasis>Example for function comments:</emphasis></para>
1961 <programlisting>
1962 /*********************************************************************
1963  *
1964  * Function    :  FUNCTION_NAME
1965  *
1966  * Description :  (Fill me in with a good description!)
1967  *
1968  * parameters  :
1969  *          1  :  param1 = pointer to an important thing
1970  *          2  :  x      = pointer to something else
1971  *
1972  * Returns     :  0 => Ok, everything else is an error.
1973  *
1974  *********************************************************************/
1975 int FUNCTION_NAME( void *param1, const char *x )
1976 {
1977    ...
1978    return( 0 );
1979
1980 }
1981 </programlisting>
1982
1983     <para><emphasis>Note:</emphasis> If we all follow this practice, we should be
1984     able to parse our code to create a "self-documenting" web
1985     page.</para>
1986
1987   </sect2>
1988
1989   </sect1>
1990
1991   <!--   ~~~~~       New section      ~~~~~     -->
1992   <sect1 id="testing"><title>Testing Guidelines</title>
1993     <para>To be filled.
1994 </para>
1995
1996     <!--   ~~~~~       New section      ~~~~~     -->
1997     <sect2 id="testing-plan"><title>Testplan for releases</title>
1998       <para>
1999        Explain release numbers. major, minor. developer releases. etc.
2000
2001 <orderedlist numeration="arabic">
2002           <listitem><para>
2003 Remove any existing rpm with rpm -e
2004 </para></listitem>
2005           <listitem><para>
2006 Remove any file that was left over. This includes (but is not limited to)
2007       <itemizedlist>
2008                 <listitem><para>/var/log/privoxy</para></listitem>
2009                 <listitem><para>/etc/privoxy</para></listitem>
2010                 <listitem><para>/usr/sbin/privoxy</para></listitem>
2011                 <listitem><para>/etc/init.d/privoxy</para></listitem>
2012                 <listitem><para>/usr/doc/privoxy*</para></listitem>
2013               </itemizedlist>
2014 </para></listitem>
2015           <listitem><para>
2016 Install the rpm. Any error messages?
2017 </para></listitem>
2018           <listitem><para>start,stop,status <application>Privoxy</application> with the specific script
2019       (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does
2020       autostart work?</para></listitem>
2021           <listitem><para>Start browsing. Does <application>Privoxy</application> work? Logfile written?</para></listitem>
2022           <listitem><para>Remove the rpm. Any error messages? All files removed?</para></listitem>
2023         </orderedlist>
2024 </para>
2025     </sect2>
2026
2027     <!--   ~~~~~       New section      ~~~~~     -->
2028     <sect2 id="testing-report"><title>Test reports</title>
2029       <para>
2030 Please submit test reports only with the <ulink url="http://sourceforge.net/tracker/?func=add&amp;group_id=11118&amp;atid=395005">test form</ulink>
2031 at sourceforge. Three simple steps:
2032         <itemizedlist>
2033           
2034           <listitem><para>Select category: the distribution you test on.</para></listitem>
2035           <listitem><para>Select group: the version of <application>Privoxy</application> that we are about to release.</para></listitem>
2036           <listitem><para>Fill the Summary and Detailed Description with something
2037               intelligent (keep it short and precise).</para>
2038           </listitem>
2039         </itemizedlist>
2040         Do not mail to the mailing list (we cannot keep track on issues there).
2041       </para>
2042     </sect2>
2043     
2044   </sect1>
2045
2046   <!--   ~~~~~       New section      ~~~~~     -->
2047   <sect1 id="newrelease"><title>Releasing a New Version</title>
2048     <para>
2049         When we release versions of <application>Privoxy</application>,
2050         our work leaves our cozy secret lab and has to work in the cold
2051         RealWorld[tm]. Once it is released, there is no way to call it
2052         back, so it is very important that great care is taken to ensure
2053         that everything runs fine, and not to introduce problems in the
2054         very last minute.
2055     </para>
2056     <para>
2057         So when releasing a new version, please adhere exactly to the
2058         procedure outlined in this chapter.
2059     </para>
2060
2061     <para>
2062         The following programs are required to follow this process:
2063         <filename>ncftpput</filename> (ncftp), <filename>scp, ssh</filename> (ssh),
2064         <filename>gmake</filename> (GNU's version of make), autoconf, cvs.
2065     </para>
2066
2067     <sect2 id="versionnumbers">
2068     <title>Version numbers</title>
2069
2070     <para>
2071       First you need to determine which version number the release will have. 
2072       <application>Privoxy</application> version numbers consist of three numbers,
2073       separated by dots, like in X.Y.Z (e.g. 3.0.0), where:
2074         <itemizedlist>
2075           <listitem>
2076             <para>
2077               X, the version major, is rarely ever changed. It is increased by one if
2078               turning a development branch into stable substantially changes the functionality,
2079               user interface or configuration syntax. Majors 1 and 2 were 
2080               <application>Junkbuster</application>, and 3 will be the first stable
2081               <application>Privoxy</application> release.
2082             </para>
2083           </listitem>
2084           <listitem>
2085             <para>
2086               Y, the version minor, represents the branch within the major version.
2087               At any point in time, there are two branches being maintained:
2088               The stable branch, with an even minor, say, 2N, in which no functionality is
2089               being added and only bug-fixes are made, and 2N+1, the development branch, in
2090               which the further development of <application>Privoxy</application> takes
2091               place.
2092               This enables us to turn the code upside down and inside out, while at the same time
2093               providing and maintaining a stable version.
2094               The minor is reset to zero (and one) when the major is incremented. When a development
2095               branch has matured to the point where it can be turned into stable, the old stable branch
2096               2N is given up (i.e. no longer maintained), the former development branch 2N+1 becomes the
2097               new stable branch 2N+2, and a new development branch 2N+3 is opened.
2098             </para>
2099           </listitem>
2100           <listitem>
2101             <para>
2102               Z, the point or sub version, represents a release of the software within a branch.
2103               It is therefore incremented immediately before each code freeze. 
2104               In development branches, only the even point versions correspond to actual releases,
2105               while the odd ones denote the evolving state of the sources on CVS in between.
2106               It follows that Z is odd on CVS in development branches most of the time. There, it gets
2107               increased to an even number immediately before a code freeze, and is increased to an odd
2108               number again immediately thereafter.
2109               This ensures that builds from CVS snapshots are easily distinguished from released versions.
2110               The point version is reset to zero when the minor changes.
2111             </para>
2112             <para>
2113               Stable branches work a little differently, since there should be
2114               little to no development happening in such branches. Remember,
2115               only bugfixes, which presumably should have had some testing
2116               before being committed. Stable branches will then have their 
2117               version reported as <literal>0.0.0</literal>, during that period 
2118               between releases when changes are being added. This is to denote 
2119               that this code is <emphasis>not for release</emphasis>. Then 
2120               as the release nears, the version is bumped according: e.g. 
2121               <literal>3.0.1 -> 0.0.0 -> 3.0.2</literal>.
2122             </para>
2123           </listitem>
2124         </itemizedlist>
2125     </para>
2126     <para>
2127      In summary, the main CVS trunk is the development branch where new
2128      features are being worked on for the next stable series. This should
2129      almost always be where the most activity takes place. There is always at
2130      least one stable branch from the trunk, e.g now it is
2131      <literal>3.0</literal>, which is only used to release stable versions.
2132      Once the initial *.0 release of the stable branch has been done, then as a
2133      rule, only bugfixes that have had prior testing should be committed to
2134      the stable branch. Once there are enough bugfixes to justify a new
2135      release, the version of this branch is again incremented Example: 3.0.0
2136      -> 3.0.1 -> 3.0.2, etc are all stable releases from within the stable
2137      branch. 3.1.x is currently the main trunk, and where work on 3.2.x is
2138      taking place. If any questions, please post to the devel list
2139      <emphasis>before</emphasis> committing to a stable branch!
2140     </para>
2141     <para>
2142      Developers should remember too that if they commit a bugfix to the stable 
2143      branch, this will more than likely require a separate submission to the 
2144      main trunk, since these are separate development trees within CVS. If you 
2145      are working on both, then this would require at least two separate check
2146      outs (i.e main trunk, <emphasis>and</emphasis> the stable release branch,
2147      which is <literal>v_3_0_branch</literal> at the moment).
2148     </para>
2149
2150     </sect2>
2151      
2152     <sect2 id="beforerelease">
2153     <title>Before the Release: Freeze</title>
2154      <para>
2155        The following <emphasis>must be done by one of the
2156        developers</emphasis> prior to each new release.
2157      </para>
2158      <para>
2159       <itemizedlist>
2160        <listitem>
2161         <para>
2162          Make sure that everybody who has worked on the code in the last
2163          couple of days has had a chance to yell <quote>no!</quote> in case
2164          they have pending changes/fixes in their pipelines. Announce the
2165          freeze so that nobody will interfere with last minute changes.
2166         </para>
2167       </listitem> 
2168       <listitem>
2169        <para>
2170          Increment the version number (point from odd to even in development
2171          branches!) in <filename>configure.in</filename>. (RPM spec files 
2172          will need to be incremented as well.)
2173        </para>
2174       </listitem> 
2175       <listitem>
2176        <para>
2177         If <filename>default.action</filename> has changed since last
2178         release (i.e. software release or standalone actions file release),
2179         bump up its version info to A.B in this line:
2180        </para>
2181        <para> 
2182         <programlisting>
2183   {+add-header{X-Actions-File-Version: A.B} -filter -no-popups}
2184 </programlisting>
2185        </para>
2186        <para> 
2187         Then change the version info in doc/webserver/actions/index.php,
2188         line: '$required_actions_file_version = "A.B";'
2189        </para>
2190       </listitem>
2191       <listitem>
2192        <para>
2193         All documentation should be rebuild after the version bump.
2194         Finished docs should be then be committed to CVS (for those 
2195         without the ability to build these). Some docs may require 
2196         rather obscure processing tools. <filename>config</filename>,
2197         the man page (and the html version of the man page), and the PDF docs
2198         fall in this category. REAMDE, the man page, AUTHORS, and config
2199         should all also be committed to CVS for other packagers. The 
2200         formal docs should be uploaded to the webserver. See the
2201         Section "Updating the webserver" in this manual for details.
2202        </para>
2203       </listitem> 
2204       <listitem>
2205        <para>
2206          The <citetitle>User Manual</citetitle> is also used for context 
2207          sensitive help for the CGI editor. This is version sensitive, so that
2208          the user will get appropriate help for his/her release. So with 
2209          each release a fresh version should be uploaded to the webserver
2210          (this is in addition to the main <citetitle>User Manual</citetitle>
2211          link from the main page since we need to keep manuals for various 
2212          versions available). The CGI pages will link to something like 
2213          <literal>http://privoxy.org/$(VERSION)/user-manual/</literal>. This
2214          will need to be updated for each new release. There is no Makefile
2215          target for this at this time!!! It needs to be done manually.
2216        </para>
2217       </listitem> 
2218       <listitem>
2219        <para>
2220         All developers should look at the <filename>ChangeLog</filename> and
2221         make sure noteworthy changes are referenced.
2222        </para>
2223      </listitem> 
2224       <listitem>
2225        <para>
2226         <emphasis>Commit all files that were changed in the above steps!</emphasis>
2227        </para>
2228       </listitem>
2229       <listitem>
2230        <para>
2231         Tag all files in CVS with the version number with
2232         <quote><command>cvs tag v_X_Y_Z</command></quote>.
2233         Don't use vX_Y_Z, ver_X_Y_Z, v_X.Y.Z (won't work) etc.
2234        </para>
2235       </listitem> 
2236      <listitem>
2237        <para>
2238         If the release was in a development branch, increase the point version
2239         from even to odd (X.Y.(Z+1)) again in <filename>configure.in</filename> and
2240         commit your change.
2241        </para>
2242       </listitem> 
2243      <listitem>
2244        <para>
2245         On the webserver, copy the user manual to a new top-level directory
2246         called <filename>X.Y.Z</filename>. This ensures that help links from the CGI
2247         pages, which have the version as a prefix, will go into the right version of the manual.
2248         If this is a development branch release, also symlink <filename>X.Y.(Z-1)</filename>
2249         to <filename>X.Y.Z</filename> and <filename>X.Y.(Z+1)</filename> to
2250         <filename>.</filename> (i.e. dot). 
2251        </para>
2252       </listitem> 
2253       </itemizedlist>
2254      </para> 
2255     </sect2>
2256     
2257     <sect2 id="therelease">
2258     <title>Building and Releasing the Packages</title>
2259      <para>
2260       Now the individual packages can be built and released. Note that for
2261       GPL reasons the first package to be released is always the source tarball.
2262      </para>
2263  
2264      <para>
2265       For <emphasis>all</emphasis> types of packages, including the source tarball,
2266       <emphasis>you must make sure that you build from clean sources by exporting
2267       the right version from CVS into an empty directory</emphasis> (just press return when
2268       asked for a password):
2269      </para>
2270       
2271      <para>
2272       <programlisting>
2273   mkdir dist # delete or choose different name if it already exists
2274   cd dist
2275   cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
2276   cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa export -r v_X_Y_Z current
2277 </programlisting>
2278     </para>
2279   
2280     <para>
2281      <emphasis>Do NOT change</emphasis> a single bit, including, but not limited to
2282      version information after export from CVS. This is to make sure that
2283      all release packages, and with them, all future bug reports, are based
2284      on exactly the same code.
2285     </para>
2286   
2287     <para>
2288      Please find additional instructions for the source tarball and the
2289      individual platform dependent binary packages below. And details 
2290      on the Sourceforge release process below that.
2291     </para>
2292
2293     <sect3 id="pack-guidelines">
2294     <title>Note on Privoxy Packaging</title>
2295      <para>
2296       Please keep these general guidelines in mind when putting together 
2297       your package. These apply to <emphasis>all</emphasis> platforms!
2298      </para>
2299      <para>
2300       <itemizedlist>
2301        <listitem>
2302         <para>
2303           <application>Privoxy</application> <emphasis>requires</emphasis>
2304           write access to: all <filename>*.action</filename> files, all 
2305           logfiles, and the <filename>trust</filename> file. You will 
2306           need to determine the best way to do this for your platform.
2307         </para>
2308        </listitem> 
2309        <listitem>
2310         <para>
2311           Please include up to date documentation. At a bare minimum:
2312         </para>
2313         <simplelist>
2314          <member>
2315           <filename>LICENSE</filename> (top-level directory)
2316          </member>
2317         </simplelist>
2318         <simplelist>
2319          <member>
2320           <filename>README</filename> (top-level directory)
2321          </member>
2322         </simplelist>
2323         <simplelist>
2324          <member>
2325           <filename>AUTHORS</filename> (top-level directory)
2326          </member>
2327         </simplelist>
2328         <simplelist>
2329          <member>
2330           <filename>man page</filename> (top-level directory, Unix-like
2331           platforms only)
2332          </member>
2333         </simplelist>
2334         <simplelist>
2335          <member>
2336           <filename>The User Manual</filename> (doc/webserver/user-manual/)
2337          </member>
2338         </simplelist>
2339         <simplelist>
2340          <member>
2341           <filename>FAQ</filename> (doc/webserver/faq/)
2342          </member>
2343         </simplelist>
2344         <para>
2345           Also suggested: <filename>Developer Manual</filename>
2346           (doc/webserver/developer-manual) and <filename>ChangeLog</filename>
2347           (top-level directory). <filename>FAQ</filename> and the manuals are
2348           HTML docs. There are also text versions in
2349           <filename>doc/text/</filename> which could conceivably also be
2350           included.
2351         </para>
2352         <para>
2353          The documentation has been designed such that the manuals are linked
2354          to each other from parallel directories, and should be packaged 
2355          that way. <filename>privoxy-index.html</filename> can also be
2356          included and can serve as a focal point for docs and other links of
2357          interest (and possibly renamed to <filename>index.html</filename>).
2358          This should be one level up from the manuals. There is a link also 
2359          on this page to an HTMLized version of the man page. To avoid 404 for
2360          this, it is in CVS as
2361          <filename>doc/webserver/man-page/privoxy-man-page.html</filename>,
2362          and should be included along with the manuals. There is also a
2363          css stylesheets that can be included for better presentation:
2364          <filename>p_doc.css</filename>. This should be in the same directory
2365          with <filename>privoxy-index.html</filename>, (i.e. one level up from
2366          the manual directories).
2367         </para>
2368       </listitem> 
2369       <listitem>
2370        <para>
2371         <filename>user.action</filename> is designed for local preferences. 
2372         Make sure this does not get overwritten!
2373        </para>
2374       </listitem> 
2375       <listitem>
2376        <para>
2377         Other configuration files should be installed as the new defaults, 
2378         but all previously installed configuration files should be preserved
2379         as backups. This is just good manners :-)
2380        </para>
2381      </listitem> 
2382      <listitem>
2383       <para>
2384        Please check platform specific notes in this doc, if you haven't 
2385        done <quote>Privoxy</quote> packaging before for other platform 
2386        specific issues. Conversely, please add any notes that you know 
2387        are important for your platform (or contact one of the doc 
2388        maintainers to do this if you can't).
2389       </para>
2390     </listitem> 
2391     <listitem>
2392      <para>
2393        Packagers should do a <quote>clean</quote> install of their 
2394        package after building it. So any previous installs should be 
2395        removed first to ensure the integrity of the newly built package. 
2396        Then run the package for a while to make sure there are no 
2397        obvious problems, before uploading.
2398      </para>
2399     </listitem> 
2400
2401       </itemizedlist>
2402      </para> 
2403     
2404     </sect3>
2405
2406     <sect3 id="newrelease-tarball"><title>Source Tarball</title>
2407         <para>
2408         First, <emphasis>make sure that you have freshly exported the right
2409         version into an empty directory</emphasis>. (See "Building and releasing
2410         packages" above). Then run:
2411         </para>
2412         <para>
2413         <programlisting>
2414   cd current
2415   autoheader && autoconf && ./configure
2416 </programlisting>
2417         </para>
2418         <para>
2419         Then do:
2420         </para>
2421         <para>
2422         <programlisting>
2423   make tarball-dist
2424 </programlisting>
2425         </para>
2426         <para>
2427         To upload the package to Sourceforge, simply issue
2428         </para>
2429         <para>
2430         <programlisting>
2431   make tarball-upload
2432 </programlisting>
2433         </para>
2434         <para>
2435         Go to the displayed URL and release the file publicly on Sourceforge.
2436         For the change log field, use the relevant section of the
2437         <filename>ChangeLog</filename> file.
2438       </para>
2439     </sect3>
2440
2441     <sect3 id="newrelease-rpm"><title>SuSE, Conectiva or Red Hat RPM</title>
2442         <para>
2443         In following text, replace <replaceable class="parameter">dist</replaceable>
2444         with either <quote>rh</quote> for Red Hat or <quote>suse</quote> for SuSE.
2445         </para>
2446         <para>
2447         First, <emphasis>make sure that you have freshly exported the right
2448         version into an empty directory</emphasis>. (See "Building and releasing
2449         packages" above). 
2450         </para>
2451         <para>
2452         As the only exception to not changing anything after export from CVS,
2453         now examine the file <filename>privoxy-</filename><replaceable class="parameter">dist</replaceable><filename>.spec</filename>
2454         and make sure that the version information and the RPM release number are
2455         correct. The RPM release numbers for each version start at one. Hence it must
2456         be reset to one if this is the first RPM for
2457         <replaceable class="parameter">dist</replaceable> which is built from version
2458         X.Y.Z. Check the
2459         <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">file
2460         list</ulink> if unsure. Else, it must be set to the highest already available RPM
2461         release number for that version plus one.
2462         </para>
2463         <para>
2464         Then run:
2465         </para>
2466         <para>
2467         <programlisting>
2468   cd current
2469   autoheader && autoconf && ./configure
2470 </programlisting>
2471         </para>
2472         <para>
2473         Then do
2474         </para>
2475         <para>
2476         <programlisting>
2477   make <replaceable class="parameter">dist</replaceable>-dist
2478 </programlisting>
2479         </para>
2480         <para>
2481         To upload the package to Sourceforge, simply issue
2482         </para>
2483         <para>
2484         <programlisting>
2485   make <replaceable class="parameter">dist</replaceable>-upload <replaceable class="parameter">rpm_packagerev</replaceable>
2486 </programlisting>
2487         </para>
2488         <para>
2489         where <replaceable class="parameter">rpm_packagerev</replaceable> is the
2490         RPM release number as determined above.
2491         Go to the displayed URL and release the file publicly on Sourceforge.
2492         Use the release notes and change log from the source tarball package.
2493       </para>
2494     </sect3>
2495
2496     <sect3 id="newrelease-os2"><title>OS/2</title>
2497       <para>
2498         First, <emphasis>make sure that you have freshly exported the right
2499         version into an empty directory</emphasis>. (See "Building and releasing
2500         packages" above). Then get the OS/2 Setup module:
2501         </para>
2502         <para>
2503         <programlisting>
2504   cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co os2setup
2505 </programlisting>
2506         </para>
2507         <para>
2508         You will need a mix of development tools.
2509         The main compilation takes place with IBM Visual Age C++.
2510         Some ancillary work takes place with GNU tools, available from
2511         various sources like hobbes.nmsu.edu.
2512         Specificially, you will need <filename>autoheader</filename>,
2513         <filename>autoconf</filename> and <filename>sh</filename> tools.
2514         The packaging takes place with WarpIN, available from various sources, including
2515         its home page: <ulink url="http://www.xworkplace.org/">xworkplace</ulink>.
2516         </para>
2517         <para>
2518         Change directory to the <filename>os2setup</filename> directory.
2519         Edit the os2build.cmd file to set the final executable filename.
2520         For example, 
2521         </para>
2522         <para>
2523         <programlisting>
2524   installExeName='privoxyos2_setup_X.Y.Z.exe'
2525 </programlisting>
2526         </para>
2527         <para>
2528         Next, edit the <filename>IJB.wis</filename> file so the release number matches
2529         in the <filename>PACKAGEID</filename> section:
2530         </para>
2531         <para>
2532         <programlisting>
2533   PACKAGEID="Privoxy Team\Privoxy\Privoxy Package\X\Y\Z"
2534 </programlisting>
2535         </para>
2536         <para>
2537         You're now ready to build.  Run:
2538         </para>
2539         <para>
2540         <programlisting>
2541   os2build
2542 </programlisting>
2543         </para>
2544         <para>
2545          You will find the  WarpIN-installable executable in the
2546         <filename>./files</filename> directory. Upload this anonymously to
2547          <filename>uploads.sourceforge.net/incoming</filename>, create a release
2548          for it, and you're done. Use the release notes and Change Log from the
2549          source tarball package.
2550         </para>
2551     </sect3>
2552
2553     <sect3 id="newrelease-solaris"><title>Solaris</title>
2554       <para>
2555         Login to Sourceforge's compilefarm via ssh:
2556         </para>
2557         <para>
2558         <programlisting>
2559   ssh cf.sourceforge.net
2560 </programlisting>
2561         </para>
2562         <para>
2563         Choose the right operating system (not the Debian one).
2564         When logged in, <emphasis>make sure that you have freshly exported the right
2565         version into an empty directory</emphasis>. (See "Building and releasing
2566         packages" above). Then run:
2567         </para>
2568         <para>
2569         <programlisting>
2570   cd current
2571   autoheader && autoconf && ./configure
2572 </programlisting>
2573         </para>
2574         <para>
2575         Then run
2576         </para>
2577         <para>
2578         <programlisting>
2579   gmake solaris-dist
2580 </programlisting>
2581         </para>
2582         <para>
2583         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2584         solaris-upload</command> on the Sourceforge machine (no ncftpput). You now have
2585         to manually upload the archive to Sourceforge's ftp server and release
2586         the file publicly. Use the release notes and Change Log from the
2587         source tarball package.
2588         </para>
2589     </sect3>
2590
2591     <sect3 id="newrelease-windows"><title>Windows</title>
2592       <para>
2593         You should ensure you have the latest version of Cygwin (from
2594         <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink>).
2595         Run the following commands from within a Cygwin bash shell.
2596       </para>
2597       <para>
2598         First, <emphasis>make sure that you have freshly exported the right
2599         version into an empty directory</emphasis>. (See "Building and releasing
2600         packages" above). Then get the Windows setup module:
2601       </para>
2602       <para>
2603       <programlisting>
2604   cvs -z3  -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co winsetup
2605 </programlisting>
2606       </para>
2607       <para>
2608         Then you can build the package.  This is fully automated, and is
2609         controlled by <filename>winsetup/GNUmakefile</filename>.
2610         All you need to do is:
2611       </para>
2612       <para>
2613       <programlisting>
2614   cd winsetup
2615   make
2616 </programlisting>
2617       </para>
2618       <para>
2619         Now you can manually rename <filename>privoxy_setup.exe</filename> to
2620         <filename>privoxy_setup_X_Y_Z.exe</filename>, and upload it to
2621         SourceForge. When releasing the package on SourceForge, use the release notes
2622         and Change Log from the source tarball package.
2623       </para>
2624     </sect3>
2625
2626     <sect3 id="newrelease-debian"><title>Debian</title>
2627       <para>
2628         First, <emphasis>make sure that you have freshly exported the
2629         right version into an empty directory</emphasis>. (See
2630         "Building and releasing packages" above).  Then add a log
2631         entry to <filename>debian/changelog</filename>, if it is not
2632         already there, for example by running:
2633       </para>
2634       <para>
2635         <programlisting>
2636   debchange -v &p-version;-&p-status;-1 "New upstream version"
2637 </programlisting>
2638       </para>
2639       <para>
2640         Then, run: 
2641       </para>
2642       <para>
2643         <programlisting>
2644   dpkg-buildpackage -rfakeroot -us -uc -b
2645 </programlisting>
2646       </para>
2647       <para>
2648         This will create
2649         <filename>../privoxy_&p-version;-&p-status;-1_i386.deb</filename>
2650         which can be uploaded.  To upload the package to Sourceforge, simply
2651         issue
2652       </para>
2653       <para>
2654         <programlisting>
2655   make debian-upload
2656 </programlisting>
2657       </para>
2658     </sect3>
2659
2660     <sect3 id="newrelease-macosx"><title>Mac OSX</title>
2661       <para>
2662         First, <emphasis>make sure that you have freshly exported the right
2663         version into an empty directory</emphasis>. (See "Building and releasing
2664         packages" above). Then get the Mac OSX setup module:
2665         </para>
2666         <para>
2667         <programlisting>
2668   cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co osxsetup
2669 </programlisting>
2670         </para>
2671         <para>
2672         Then run:
2673         </para>
2674         <para>
2675         <programlisting>
2676   cd osxsetup
2677   build
2678 </programlisting>
2679         </para>
2680         <para>
2681         This will run <filename>autoheader</filename>, <filename>autoconf</filename> and
2682         <filename>configure</filename> as well as <filename>make</filename>.
2683         Finally, it will copy over the necessary files to the ./osxsetup/files directory
2684         for further processing by <filename>PackageMaker</filename>.
2685         </para>
2686         <para>
2687         Bring up PackageMaker with the PrivoxyPackage.pmsp definition file, modify the package
2688         name to match the release, and hit the "Create package" button.
2689         If you specify ./Privoxy.pkg as the output package name, you can then create
2690         the distributable zip file with the command:
2691         </para>
2692         <para>
2693         <programlisting>
2694   zip -r privoxyosx_setup_x.y.z.zip Privoxy.pkg
2695 </programlisting>
2696         </para>
2697         <para>
2698         You can then upload <filename>privoxyosx_setup_x.y.z.zip</filename> anonymously to 
2699         <filename>uploads.sourceforge.net/incoming</filename>,
2700         create a release for it, and you're done. Use the release notes
2701         and Change Log from the source tarball package.
2702         </para>
2703     </sect3>
2704
2705     <sect3 id="newrelease-freebsd"><title>FreeBSD</title>
2706       <para>
2707         Login to Sourceforge's compile-farm via ssh:
2708         </para>
2709         <para>
2710         <programlisting>
2711   ssh cf.sourceforge.net
2712 </programlisting>
2713         </para>
2714         <para>
2715         Choose the right operating system.
2716         When logged in, <emphasis>make sure that you have freshly exported the right
2717         version into an empty directory</emphasis>. (See "Building and releasing
2718         packages" above). Then run:
2719         </para>
2720         <para>
2721         <programlisting>
2722   cd current
2723   autoheader && autoconf && ./configure
2724 </programlisting>
2725         </para>
2726         <para>
2727         Then run:
2728         </para>
2729         <para>
2730         <programlisting>
2731   gmake freebsd-dist
2732 </programlisting>
2733         </para>
2734         <para>
2735         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2736         freebsd-upload</command> on the Sourceforge machine (no ncftpput). You now have
2737         to manually upload the archive to Sourceforge's ftp server and release
2738         the file publicly. Use the release notes and Change Log from the
2739         source tarball package.
2740         </para>
2741     </sect3>
2742
2743     <sect3 id="newrelease-hpux"><title>HP-UX 11</title>
2744       <para>
2745         First, <emphasis>make sure that you have freshly exported the right
2746         version into an empty directory</emphasis>. (See "Building and releasing
2747         packages" above). Then run:
2748         </para>
2749         <para>
2750         <programlisting>
2751   cd current
2752   autoheader && autoconf && ./configure
2753 </programlisting>
2754         </para>
2755         <para>
2756         Then do FIXME.
2757         </para>
2758     </sect3>
2759
2760     <sect3 id="newrelease-amiga"><title>Amiga OS</title>
2761       <para>
2762         First, <emphasis>make sure that you have freshly exported the right
2763         version into an empty directory</emphasis>. (See "Building and releasing
2764         packages" above). Then run:
2765         </para>
2766         <para>
2767         <programlisting>
2768   cd current
2769   autoheader && autoconf && ./configure
2770 </programlisting>
2771         </para>
2772         <para>
2773         Then do FIXME.
2774         </para>
2775     </sect3>
2776
2777     <sect3 id="newrelease-aix"><title>AIX</title>
2778       <para>
2779         Login to Sourceforge's compilefarm via ssh:
2780         </para>
2781         <para>
2782         <programlisting>
2783   ssh cf.sourceforge.net
2784 </programlisting>
2785         </para>
2786         <para>
2787         Choose the right operating system.
2788         When logged in, <emphasis>make sure that you have freshly exported the right
2789         version into an empty directory</emphasis>. (See "Building and releasing
2790         packages" above). Then run:
2791         </para>
2792         <para>
2793         <programlisting>
2794   cd current
2795   autoheader && autoconf && ./configure
2796 </programlisting>
2797         </para>
2798         <para>
2799         Then run:
2800         </para>
2801         <para>
2802         <programlisting>
2803   make aix-dist
2804 </programlisting>
2805         </para>
2806         <para>
2807         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2808         aix-upload</command> on the Sourceforge machine (no ncftpput). You now have
2809         to manually upload the archive to Sourceforge's ftp server and release
2810         the file publicly. Use the release notes and Change Log from the
2811         source tarball package.
2812         </para>
2813     </sect3>
2814    </sect2>
2815
2816    <sect2 id="releasing">
2817    <title>Uploading and Releasing Your Package</title>
2818     <para>
2819       After the package is ready, it is time to upload it 
2820       to SourceForge, and go through the release steps. The upload
2821       is done via FTP:
2822     </para>
2823      <para>
2824       <itemizedlist>
2825        <listitem>
2826         <para>
2827           Upload to: <ulink url="ftp://upload.sourceforge.net/incoming">ftp://upload.sourceforge.net/incoming</ulink>
2828         </para>
2829       </listitem> 
2830       <listitem>
2831        <para>
2832          user: <literal>anonymous</literal>
2833        </para>
2834       </listitem> 
2835       <listitem>
2836        <para>
2837          password: <literal>ijbswa-developers@lists.sourceforge.net</literal>
2838        </para>
2839       </listitem> 
2840      </itemizedlist>
2841     </para> 
2842     <para>
2843      Or use the <command>make</command> targets as described above.
2844     </para>
2845     <para>
2846      Once this done go to <ulink url="http://sourceforge.net/project/admin/editpackages.php?group_id=11118">http://sourceforge.net/project/admin/editpackages.php?group_id=11118</ulink>, 
2847      making sure you are logged in. Find your target platform in the 
2848      second column, and click <literal>Add Release</literal>. You will 
2849      then need to create a new release for your package, using the format 
2850      of <literal>$VERSION ($CODE_STATUS)</literal>, e.g. <emphasis>&p-version;
2851      (beta)</emphasis>.
2852     </para>
2853     <para>
2854      Now just follow the prompts. Be sure to add any appropriate Release
2855      notes. You should see your freshly uploaded packages in 
2856      <quote>Step 2. Add Files To This Release</quote>. Check the 
2857      appropriate box(es). Remember at each step to hit the 
2858      <quote>Refresh/Submit</quote> buttons! You should now see your 
2859      file(s) listed in Step 3. Fill out the forms with the appropriate 
2860      information for your platform, being sure to hit <quote>Update</quote>
2861      for each file. If anyone is monitoring your platform, check the 
2862      <quote>email</quote> box at the very bottom to notify them of 
2863      the new package. This should do it!
2864     </para>
2865     <para>
2866      If you have made errors, or need to make changes, you can go through 
2867      essentially the same steps, but select <literal>Edit Release</literal>, 
2868      instead of <literal>Add Release</literal>.
2869     </para>
2870    </sect2>
2871
2872     <sect2 id="afterrelease">
2873     <title>After the Release</title>
2874      <para>
2875       When all (or: most of the) packages have been uploaded and made available,
2876       send an email to the <ulink url="mailto:ijbswa-announce@lists.sourceforge.net">announce
2877       mailing list</ulink>, Subject: "Version X.Y.Z available for download". Be sure to
2878       include the
2879       <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">download
2880       location</ulink>, the release notes and the Changelog. Also, post an
2881       updated News item on the project page Sourceforge, and update the Home 
2882       page and docs linked from the Home page (see below).
2883      </para>
2884    </sect2>
2885
2886   </sect1>
2887   
2888   <!--   ~~~~~       New section      ~~~~~     -->
2889   <sect1 id="webserver-update"><title>Update the Webserver</title>
2890    <para>
2891     The webserver should be updated at least with each stable release. When
2892     updating, please follow these steps to make sure that no broken links,
2893     inconsistent contents or permission problems will occur (as it has many 
2894     times in the past!):
2895    </para>
2896    <para>
2897     If you have changed anything in the stable-branch documentation source
2898     SGML files, do:
2899    </para>
2900    <para>
2901     <programlisting>
2902   make dok dok-pdf # (or 'make redhat-dok dok-pdf' if 'make dok' doesn't work for you)
2903 </programlisting>
2904    </para>
2905    <para>
2906     That will generate <filename>doc/webserver/user-manual</filename>,
2907     <filename>doc/webserver/developer-manual</filename>,
2908     <filename>doc/webserver/faq</filename>, 
2909     <filename>doc/pdf/*.pdf</filename> and
2910     <filename>doc/webserver/index.html</filename> automatically.
2911    </para>
2912    <para>
2913     If you changed the manual page sources, generate
2914     <filename>doc/webserver/man-page/privoxy-man-page.html</filename>
2915     by running <quote><command>make man</command></quote>. (This is
2916     a separate target due to dependencies on some obscure perl scripts
2917     [now in CVS, but not well tested]. See comments in <filename>GNUmakefile</filename>.)
2918    </para>
2919    <para>
2920     If you want to add new files to the webserver, create them locally in
2921     the <filename>doc/webserver/*</filename> directory (or
2922     create new directories under <filename>doc/webserver</filename>).
2923    </para>
2924    <para>
2925     Next, commit any changes from the above steps to CVS. All set? 
2926     If these are docs in the stable branch, then do:
2927    </para>
2928    <para>
2929     <programlisting>
2930   make webserver
2931 </programlisting>
2932    </para>
2933    <para>
2934     This will do the upload to <ulink url="http://www.privoxy.org/">the
2935     webserver</ulink> (www.privoxy.org) and ensure all files and directories
2936     there are group writable.
2937    </para>
2938    <para>
2939     Please do <emphasis>NOT</emphasis> use any other means of transferring
2940     files to the webserver to avoid permission problems. Also, please do not
2941     upload docs from development branches or versions. The publicly posted
2942     docs should be in sync with the last official release.
2943    </para>
2944   </sect1>
2945
2946   <!--   ~~~~~       New section      ~~~~~     -->
2947   <sect1 id="contact"><title>Contacting the developers, Bug Reporting and Feature Requests</title>
2948 <!-- Include contacting.sgml  -->
2949  &contacting;
2950 <!-- end contacting -->
2951   </sect1>
2952   
2953
2954 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
2955 <sect1 id="copyright"><title>Privoxy Copyright, License and History</title>
2956
2957 <!-- Include copyright.sgml -->
2958  &copyright;
2959 <!-- end -->
2960
2961 <!--   ~~~~~       New section      ~~~~~     -->
2962 <sect2><title>License</title>
2963 <!-- Include copyright.sgml: -->
2964  &license;
2965 <!-- end copyright -->
2966 </sect2>
2967 <!--  ~  End section  ~  -->
2968
2969 <!--   ~~~~~       New section      ~~~~~     -->
2970 <sect2><title>History</title>
2971 <!-- Include history.sgml -->
2972  &history;
2973 <!-- end -->
2974 </sect2>
2975
2976 </sect1>
2977   
2978   <!--   ~~~~~       New section      ~~~~~     -->
2979   <sect1 id="seealso"><title>See also</title>
2980 <!-- Include seealso.sgml -->
2981  &seealso;
2982 <!-- end  -->
2983
2984   </sect1>
2985
2986   <!--
2987
2988   This program is free software; you can redistribute it 
2989   and/or modify it under the terms of the GNU General
2990   Public License as published by the Free Software
2991   Foundation; either version 2 of the License, or (at
2992   your option) any later version.
2993
2994   This program is distributed in the hope that it will
2995   be useful, but WITHOUT ANY WARRANTY; without even the
2996   implied warranty of MERCHANTABILITY or FITNESS FOR A
2997   PARTICULAR PURPOSE.  See the GNU General Public
2998   License for more details.
2999
3000   The GNU General Public License should be included with
3001   this file.  If not, you can view it at
3002   http://www.gnu.org/copyleft/gpl.html
3003   or write to the Free Software Foundation, Inc., 59
3004   Temple Place - Suite 330, Boston, MA  02111-1307, USA.
3005
3006   $Log: developer-manual.sgml,v $
3007   Revision 2.7  2006/07/18 14:48:50  david__schmidt
3008   Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
3009   with what was really the latest development (the v_3_0_branch branch)
3010
3011   Revision 1.46.2.11  2002/12/11 13:12:15  hal9
3012   Rewrite cvs write access give-away section.
3013
3014   Revision 1.46.2.10  2002/09/26 21:53:45  hal9
3015   Changes to reflect recent change in stable branch commit policy (hopefully
3016   clearer now).
3017
3018   Revision 1.46.2.9  2002/09/26 01:21:40  hal9
3019   Porting 3.1.1 changes: more on cvs and branches, more on versions and
3020   releases.
3021
3022   Revision 1.46.2.8  2002/08/17 00:16:10  hal9
3023   Add note on updating webserver for User-manual/CGI editor, which is version
3024   dependent (and different from main UM link).
3025
3026   Revision 1.46.2.7  2002/08/14 17:29:25  hal9
3027   Add small notes on post-release steps, and uploading docs to webserver.
3028
3029   Revision 1.46.2.6  2002/08/10 11:40:25  oes
3030   Added disclaimer about probably being out-of-date and two small hints
3031
3032   Revision 1.46.2.5  2002/08/09 01:15:12  hal9
3033   Added some notes on pre-release steps (test builds first, update ChangeLog).
3034
3035   Revision 1.46.2.4  2002/05/29 00:30:59  mal0rd
3036   Fixed a little formatting.  Clarified debian section.
3037
3038   Revision 1.46.2.3  2002/05/28 04:32:45  hal9
3039   Change hints on bundling index.html to privoxy-index.html
3040
3041   Revision 1.46.2.2  2002/05/26 17:04:24  hal9
3042   -Spellcheck, very minor edits, and sync across branches
3043
3044   Revision 1.48  2002/05/26 12:48:31  roro
3045   Add releasing information about Debian.
3046
3047   Revision 1.47  2002/05/26 04:55:11  mal0rd
3048   Added debian-dist and debian-upload targets.  Also documented usage.
3049
3050   Revision 1.46  2002/05/22 17:15:00  oes
3051   Updated intro
3052
3053   Revision 1.45  2002/05/19 23:01:54  hal9
3054   Add small section on general packaging guidelines (e.g. actions files must
3055   be writable).
3056
3057   Revision 1.44  2002/05/15 03:55:17  hal9
3058   Fix ulink -> link, and minor modification to release process section for
3059   clarification.
3060
3061   Revision 1.43  2002/05/10 01:48:19  hal9
3062   This is mostly proposed copyright/licensing additions and changes. Docs
3063   are still GPL, but licensing and copyright are more visible. Also, copyright
3064   changed in doc header comments (eliminate references to JB except FAQ).
3065
3066   Revision 1.42  2002/05/05 20:26:02  hal9
3067   Sorting out license vs copyright in these docs.
3068
3069   Revision 1.41  2002/05/04 08:44:44  swa
3070   bumped version
3071
3072   Revision 1.40  2002/05/04 00:43:43  hal9
3073   -Remove TOC/first page kludge with proper stylesheet fix.
3074   -Combined the two very brief sections: Intro and Quickstart.
3075
3076   Revision 1.39  2002/05/02 15:08:25  oes
3077   Added explanation about version numbers and RPM package revisions
3078
3079   Revision 1.38  2002/04/29 02:20:31  hal9
3080   Add info on steps for uploading and the release process on SF.
3081
3082   Revision 1.37  2002/04/26 17:23:29  swa
3083   bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot
3084
3085   Revision 1.36  2002/04/26 05:25:23  hal9
3086   Mass commit to catch a few scattered fixes.
3087
3088   Revision 1.35  2002/04/17 15:16:15  oes
3089   Added link to docbook crash course
3090
3091   Revision 1.34  2002/04/15 23:39:32  oes
3092    - Extended & fixed the release section
3093    - Added CVS guideline sections
3094    - Separated webserver section from release section
3095    - Commented out boilerplate inclusion (If you don't know yet what it is,
3096      you shouldn't mess with its code ;-)
3097    - Nits & fixes
3098
3099   Revision 1.33  2002/04/12 03:49:53  hal9
3100   Spell checked. Clarification on where docs are kept.
3101
3102   Revision 1.32  2002/04/11 21:29:58  jongfoster
3103   Documenting Win32 release procedure
3104
3105   Revision 1.31  2002/04/11 09:32:52  oes
3106   more nits
3107
3108   Revision 1.30  2002/04/11 09:24:53  oes
3109   nits
3110
3111   Revision 1.29  2002/04/10 18:45:14  swa
3112   generated
3113
3114   Revision 1.28  2002/04/08 22:59:26  hal9
3115   Version update. Spell chkconfig correctly :)
3116
3117   Revision 1.27  2002/04/08 15:31:18  hal9
3118   Touch ups to documentation section.
3119
3120   Revision 1.26  2002/04/07 23:50:08  hal9
3121   Documentation changes to reflect HTML docs now in CVS, and new generated files
3122   list.
3123
3124   Revision 1.25  2002/04/06 05:07:28  hal9
3125   -Add privoxy-man-page.sgml, for man page.
3126   -Add authors.sgml for AUTHORS (and p-authors.sgml)
3127   -Reworked various aspects of various docs.
3128   -Added additional comments to sub-docs.
3129
3130   Revision 1.24  2002/04/04 21:33:37  hal9
3131   More on documenting the documents.
3132
3133   Revision 1.23  2002/04/04 18:46:47  swa
3134   consistent look. reuse of copyright, history et. al.
3135
3136   Revision 1.22  2002/04/04 17:27:56  swa
3137   more single file to be included at multiple points. make maintaining easier
3138
3139   Revision 1.21  2002/04/04 06:48:37  hal9
3140   Structural changes to allow for conditional inclusion/exclusion of content
3141   based on entity toggles, e.g. 'entity % p-not-stable  "INCLUDE"'. And
3142   definition of internal entities, e.g. 'entity p-version "2.9.13"' that will
3143   eventually be set by Makefile.
3144   More boilerplate text for use across multiple docs.
3145
3146   Revision 1.20  2002/04/04 03:28:27  david__schmidt
3147   Add Mac OSX section
3148
3149   Revision 1.19  2002/04/03 15:09:42  david__schmidt
3150   Add OS/2 build section
3151
3152   Revision 1.18  2002/04/03 03:51:48  hal9
3153   Touch ups.
3154
3155   Revision 1.17  2002/04/03 01:21:17  hal9
3156   Implementing Andreas's suggestions for Release sections.
3157
3158   Revision 1.16  2002/03/31 23:04:40  hal9
3159   Fleshed out the doc section, and added something for an intro so it was not
3160   blank.
3161
3162   Revision 1.15  2002/03/30 22:29:47  swa
3163   wrong make flavour
3164
3165   Revision 1.14  2002/03/30 19:04:08  swa
3166   people release differently. no good.
3167   I want to make parts of the docs only.
3168
3169   Revision 1.13  2002/03/27 01:16:41  hal9
3170   ditto
3171
3172   Revision 1.12  2002/03/27 01:02:51  hal9
3173   Touch up on name change...
3174
3175   Revision 1.11  2002/03/26 22:29:55  swa
3176   we have a new homepage!
3177
3178   Revision 1.10  2002/03/24 12:33:01  swa
3179   more additions.
3180
3181   Revision 1.9  2002/03/24 11:01:05  swa
3182   name change
3183
3184   Revision 1.8  2002/03/23 15:13:11  swa
3185   renamed every reference to the old name with foobar.
3186   fixed "application foobar application" tag, fixed
3187   "the foobar" with "foobar". left junkbustser in cvs
3188   comments and remarks to history untouched.
3189
3190   Revision 1.7  2002/03/11 13:13:27  swa
3191   correct feedback channels
3192
3193   Revision 1.6  2002/02/24 14:25:06  jongfoster
3194   Formatting changes.  Now changing the doctype to DocBook XML 4.1
3195   will work - no other changes are needed.
3196
3197   Revision 1.5  2001/10/31 18:16:51  swa
3198   documentation added: howto generate docs in text and html
3199   format, howto move stuff to the webserver.
3200
3201   Revision 1.4  2001/09/23 10:13:48  swa
3202   upload process established. run make webserver and
3203   the documentation is moved to the webserver. documents
3204   are now linked correctly.
3205
3206   Revision 1.3  2001/09/13 15:27:40  swa
3207   cosmetics
3208
3209   Revision 1.2  2001/09/13 15:20:17  swa
3210   merged standards into developer manual
3211
3212   Revision 1.1  2001/09/12 15:36:41  swa
3213   source files for junkbuster documentation
3214
3215   Revision 1.3  2001/09/10 17:43:59  swa
3216   first proposal of a structure.
3217
3218   Revision 1.2  2001/06/13 14:28:31  swa
3219   docs should have an author.
3220
3221   Revision 1.1  2001/06/13 14:20:37  swa
3222   first import of project's documentation for the webserver.
3223
3224   -->
3225
3226 </article>