blob: fd6f7003319289d4f88043d8fb69083e2e8f8e3e [file] [log] [blame]
Since numerous people will be contributing code and bug fixes, it's important
to establish a common coding style. The goal of using similar coding styles
is much more important than the details of just what that style is.
I suggest we follow the recommendations of "Recommended C Style and Coding
Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and
Brader). I have placed a copy of this document in the jpeg FTP archive (see
jpeg/doc/, or cstyle.txt.Z for those without nroff/tbl).
Unless someone has a real strong objection, let's do block comments thusly:
* Block comments in this style.
and indent statements in K&R style, e.g.,
if (test) {
} else {
I suggest that multi-word names be written in the style multi_word_name
rather than multiWordName, but I am open to argument on this.
I would like to use function prototypes everywhere, and rely on automatic
source code transformation to feed non-ANSI C compilers. The best tool
I have so far found for this is 'ansi2knr.c', which is part of Ghostscript.
ansi2knr is not very bright, so it imposes a format requirement on function
declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions
should be written in the following style:
static int *
function_name (int a, char *b)
ansi2knr won't help with method declarations (function pointers in structs).
I suggest we use a macro to declare method pointers, something like this:
#ifdef PROTO
#define METHOD(type,methodname,arglist) type (*methodname) arglist
#define METHOD(type,methodname,arglist) type (*methodname) ()
which is used like this:
struct function_pointers {
METHOD(void, init_entropy_encoder, (functptrs fptrs, jparms *jp));
METHOD(void, term_entropy_encoder, (void));
Note the set of parentheses surrounding the parameter list.
A similar solution is used for external function declarations (see the PP
macro in jpegdata.h).
If the code is to work on non-ANSI compilers, you cannot rely on a prototype
declaration to coerce actual parameters into the right types. Therefore, use
explicit casts on actual parameters whenever the actual parameter type is not
identical to the formal parameter. Beware of implicit conversions to "int".
It seems there are some non-ANSI compilers in which the sizeof() operator
is defined to return int, while size_t is defined as long. Needless to say,
this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(),
so that the result is guaranteed to be of type size_t.
We can expect that the JPEG compressor and decompressor will be incorporated
into larger programs. Therefore, the following rules are important:
1. Avoid direct use of any file I/O, "malloc", error report printouts, etc;
pass these through the common routines provided.
2. Assume that the JPEG code may be invoked more than once per program run;
therefore, do not rely on static initialization of variables, and be careful
to release all allocated storage at the end of processing.
3. Minimize global namespace pollution. Functions should be declared static
wherever possible. (Note that our method-based calling conventions help this
a lot: in many modules only the method-selector function will ever need to be
called directly, so only that function need be externally visible.) All
global function names should begin with "j", and should be unique in the first
six characters for portability reasons.
Don't use global variables at all; anything that must be used in another
module should be put into parameters (there'll be some large structs passed
around for this purpose).
4. Source file names should also begin with "j"; remember to keep them to
eight characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers.
Do not put code for both compression and decompression into the same source