                                  _   _ ____  _
                              ___| | | |  _ \| |
                             / __| | | | |_) | |
                            | (__| |_| |  _ <| |___
                             \___|\___/|_| \_\_____|

To Think About When Contributing Source Code

 This document is intended to offer some simple guidelines that can be useful
 to keep in mind when you decide to contribute to the project. This concerns
 new features as well as corrections to existing flaws or bugs.

Join the Community

 Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
 list(s).  Read up on details before you post questions. Read this file before
 you start sending patches! We prefer patches and discussions being held on
 the mailing list(s), not sent to individuals.

The License Issue

 When contributing with code, you agree to put your changes and new code under
 the same license curl and libcurl is already using unless stated otherwise.

 If you add a larger piece of code, you can opt to make that file or set of
 files to use a different license as long as they don't enforce any changes to
 the rest of the package and they make sense. Such "separate parts" can not be
 GPL (as we don't want the GPL virus to attack users of libcurl) but they must
 use "GPL compatible" licenses.

What To Read

 Source code, the man pages, the INTERNALS document, the TODO, the most recent
 CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
 insights on what's going on right now. Asking there is a good idea too.

Naming

 Try using a non-confusing naming scheme for your new functions and variable
 names. It doesn't necessarily have to mean that you should use the same as in
 other places of the code, just that the names should be logical,
 understandable and be named according to what they're used for. File-local
 functions should be made static. We like lower case names.

 See the INTERNALS document on how we name non-exported library-global
 symbols.

Indenting

 Please try using the same indenting levels and bracing method as all the
 other code already does. It makes the source code a lot easier to follow if
 all of it is written using the same style. We don't ask you to like it, we
 just ask you to follow the tradition! ;-) This mainly means: 2-level indents,
 using spaces only (no tabs) and having the opening brace ({) on the same line
 as the if() or while().

Commenting

 Comment your source code extensively using C comments (/* comment */), DO NOT
 use C++ comments (// this style). Commented code is quality code and enables
 future modifications much more. Uncommented code risk having to be completely
 replaced when someone wants to extend things, since other persons' source
 code can get quite hard to read.

General Style

 Keep your functions small. If they're small you avoid a lot of mistakes and
 you don't accidentally mix up variables etc.

Non-clobbering All Over

 When you write new functionality or fix bugs, it is important that you don't
 fiddle all over the source files and functions. Remember that it is likely
 that other people have done changes in the same source files as you have and
 possibly even in the same functions. If you bring completely new
 functionality, try writing it in a new source file. If you fix bugs, try to
 fix one bug at a time and send them as separate patches.

Platform Dependent Code

 Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for
 particular operating systems or hardware in the #ifdef lines. The
 HAVE_FEATURE shall be generated by the configure script for unix-like systems
 and they are hard-coded in the config-[system].h files for the others.

Separate Patches

 It is annoying when you get a huge patch from someone that is said to fix 511
 odd problems, but discussions and opinions don't agree with 510 of them - or
 509 of them were already fixed in a different way. Then the patcher needs to
 extract the single interesting patch from somewhere within the huge pile of
 source, and that gives a lot of extra work. Preferably, all fixes that
 correct different problems should be in their own patch with an attached
 description exactly what they correct so that all patches can be selectively
 applied by the maintainer or other interested parties.

Patch Against Recent Sources

 Please try to get the latest available sources to make your patches
 against. It makes the life of the developers so much easier. The very best is
 if you get the most up-to-date sources from the CVS repository, but the
 latest release archive is quite OK as well!

Document

 Writing docs is dead boring and one of the big problems with many open source
 projects. Someone's gotta do it. It makes it a lot easier if you submit a
 small description of your fix or your new features with every contribution so
 that it can be swiftly added to the package documentation.

 The documentation is always made in man pages (nroff formatted) or plain
 ASCII files. All HTML files on the web site and in the release archives are
 generated from the nroff/ASCII versions.

Write Access to CVS Repository

 If you are a frequent contributor, or have another good reason, you can of
 course get write access to the CVS repository and then you'll be able to
 check-in all your changes straight into the CVS tree instead of sending all
 changes by mail as patches. Just ask if this is what you'd want. You will be
 required to have posted a few quality patches first, before you can be
 granted write access.

Test Cases

 Since the introduction of the test suite, we can quickly verify that the main
 features are working as they're supposed to. To maintain this situation and
 improve it, all new features and functions that are added need to be tested
 in the test suite. Every feature that is added should get at least one valid
 test case that verifies that it works as documented. If every submitter also
 posts a few test cases, it won't end up as a heavy burden on a single person!

How To Make a Patch

 Keep a copy of the unmodified curl sources. Make your changes in a separate
 source tree. When you think you have something that you want to offer the
 curl community, use GNU diff to generate patches.

 If you have modified a single file, try something like:

     diff -u unmodified-file.c my-changed-one.c > my-fixes.diff

 If you have modified several files, possibly in different directories, you
 can use diff recursively:

     diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff

 The GNU diff and GNU patch tools exist for virtually all platforms, including
 all kinds of Unixes and Windows:

 For unix-like operating systems:

        http://www.fsf.org/software/patch/patch.html
        http://www.gnu.org/directory/diffutils.html

 For Windows:

        http://gnuwin32.sourceforge.net/packages/patch.htm
        http://gnuwin32.sourceforge.net/packages/diffutils.htm
