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