diff options
Diffstat (limited to 'codingrules')
-rw-r--r-- | codingrules | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/codingrules b/codingrules new file mode 100644 index 0000000..fd6f700 --- /dev/null +++ b/codingrules @@ -0,0 +1,99 @@ + + JPEG SYSTEM CODING RULES 27-SEP-91 + +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/cstyle.ms.tbl.Z, 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) { + then-part; + } else { + else-part; + } + +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) +{ + code... +} + +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 +#else +#define METHOD(type,methodname,arglist) type (*methodname) () +#endif + +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 +file. |