| |
| 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. |