| 1 | IJG JPEG LIBRARY:  CODING RULES | 
|---|
| 2 |  | 
|---|
| 3 | Copyright (C) 1991-1996, Thomas G. Lane. | 
|---|
| 4 | This file is part of the Independent JPEG Group's software. | 
|---|
| 5 | For conditions of distribution and use, see the accompanying README file. | 
|---|
| 6 |  | 
|---|
| 7 |  | 
|---|
| 8 | Since numerous people will be contributing code and bug fixes, it's important | 
|---|
| 9 | to establish a common coding style.  The goal of using similar coding styles | 
|---|
| 10 | is much more important than the details of just what that style is. | 
|---|
| 11 |  | 
|---|
| 12 | In general we follow the recommendations of "Recommended C Style and Coding | 
|---|
| 13 | Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and | 
|---|
| 14 | Brader).  This document is available in the IJG FTP archive (see | 
|---|
| 15 | jpeg/doc/cstyle.ms.tbl.Z, or cstyle.txt.Z for those without nroff/tbl). | 
|---|
| 16 |  | 
|---|
| 17 | Block comments should be laid out thusly: | 
|---|
| 18 |  | 
|---|
| 19 | /* | 
|---|
| 20 | *  Block comments in this style. | 
|---|
| 21 | */ | 
|---|
| 22 |  | 
|---|
| 23 | We indent statements in K&R style, e.g., | 
|---|
| 24 | if (test) { | 
|---|
| 25 | then-part; | 
|---|
| 26 | } else { | 
|---|
| 27 | else-part; | 
|---|
| 28 | } | 
|---|
| 29 | with two spaces per indentation level.  (This indentation convention is | 
|---|
| 30 | handled automatically by GNU Emacs and many other text editors.) | 
|---|
| 31 |  | 
|---|
| 32 | Multi-word names should be written in lower case with underscores, e.g., | 
|---|
| 33 | multi_word_name (not multiWordName).  Preprocessor symbols and enum constants | 
|---|
| 34 | are similar but upper case (MULTI_WORD_NAME).  Names should be unique within | 
|---|
| 35 | the first fifteen characters.  (On some older systems, global names must be | 
|---|
| 36 | unique within six characters.  We accommodate this without cluttering the | 
|---|
| 37 | source code by using macros to substitute shorter names.) | 
|---|
| 38 |  | 
|---|
| 39 | We use function prototypes everywhere; we rely on automatic source code | 
|---|
| 40 | transformation to feed prototype-less C compilers.  Transformation is done | 
|---|
| 41 | by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript). | 
|---|
| 42 | ansi2knr is not very bright, so it imposes a format requirement on function | 
|---|
| 43 | declarations: the function name MUST BEGIN IN COLUMN 1.  Thus all functions | 
|---|
| 44 | should be written in the following style: | 
|---|
| 45 |  | 
|---|
| 46 | LOCAL(int *) | 
|---|
| 47 | function_name (int a, char *b) | 
|---|
| 48 | { | 
|---|
| 49 | code... | 
|---|
| 50 | } | 
|---|
| 51 |  | 
|---|
| 52 | Note that each function definition must begin with GLOBAL(type), LOCAL(type), | 
|---|
| 53 | or METHODDEF(type).  These macros expand to "static type" or just "type" as | 
|---|
| 54 | appropriate.  They provide a readable indication of the routine's usage and | 
|---|
| 55 | can readily be changed for special needs.  (For instance, special linkage | 
|---|
| 56 | keywords can be inserted for use in Windows DLLs.) | 
|---|
| 57 |  | 
|---|
| 58 | ansi2knr does not transform method declarations (function pointers in | 
|---|
| 59 | structs).  We handle these with a macro JMETHOD, defined as | 
|---|
| 60 | #ifdef HAVE_PROTOTYPES | 
|---|
| 61 | #define JMETHOD(type,methodname,arglist)  type (*methodname) arglist | 
|---|
| 62 | #else | 
|---|
| 63 | #define JMETHOD(type,methodname,arglist)  type (*methodname) () | 
|---|
| 64 | #endif | 
|---|
| 65 | which is used like this: | 
|---|
| 66 | struct function_pointers { | 
|---|
| 67 | JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp)); | 
|---|
| 68 | JMETHOD(void, term_entropy_encoder, (void)); | 
|---|
| 69 | }; | 
|---|
| 70 | Note the set of parentheses surrounding the parameter list. | 
|---|
| 71 |  | 
|---|
| 72 | A similar solution is used for forward and external function declarations | 
|---|
| 73 | (see the EXTERN and JPP macros). | 
|---|
| 74 |  | 
|---|
| 75 | If the code is to work on non-ANSI compilers, we cannot rely on a prototype | 
|---|
| 76 | declaration to coerce actual parameters into the right types.  Therefore, use | 
|---|
| 77 | explicit casts on actual parameters whenever the actual parameter type is not | 
|---|
| 78 | identical to the formal parameter.  Beware of implicit conversions to "int". | 
|---|
| 79 |  | 
|---|
| 80 | It seems there are some non-ANSI compilers in which the sizeof() operator | 
|---|
| 81 | is defined to return int, yet size_t is defined as long.  Needless to say, | 
|---|
| 82 | this is brain-damaged.  Always use the SIZEOF() macro in place of sizeof(), | 
|---|
| 83 | so that the result is guaranteed to be of type size_t. | 
|---|
| 84 |  | 
|---|
| 85 |  | 
|---|
| 86 | The JPEG library is intended to be used within larger programs.  Furthermore, | 
|---|
| 87 | we want it to be reentrant so that it can be used by applications that process | 
|---|
| 88 | multiple images concurrently.  The following rules support these requirements: | 
|---|
| 89 |  | 
|---|
| 90 | 1. Avoid direct use of file I/O, "malloc", error report printouts, etc; | 
|---|
| 91 | pass these through the common routines provided. | 
|---|
| 92 |  | 
|---|
| 93 | 2. Minimize global namespace pollution.  Functions should be declared static | 
|---|
| 94 | wherever possible.  (Note that our method-based calling conventions help this | 
|---|
| 95 | a lot: in many modules only the initialization function will ever need to be | 
|---|
| 96 | called directly, so only that function need be externally visible.)  All | 
|---|
| 97 | global function names should begin with "jpeg_", and should have an | 
|---|
| 98 | abbreviated name (unique in the first six characters) substituted by macro | 
|---|
| 99 | when NEED_SHORT_EXTERNAL_NAMES is set. | 
|---|
| 100 |  | 
|---|
| 101 | 3. Don't use global variables; anything that must be used in another module | 
|---|
| 102 | should be in the common data structures. | 
|---|
| 103 |  | 
|---|
| 104 | 4. Don't use static variables except for read-only constant tables.  Variables | 
|---|
| 105 | that should be private to a module can be placed into private structures (see | 
|---|
| 106 | the system architecture document, structure.txt). | 
|---|
| 107 |  | 
|---|
| 108 | 5. Source file names should begin with "j" for files that are part of the | 
|---|
| 109 | library proper; source files that are not part of the library, such as cjpeg.c | 
|---|
| 110 | and djpeg.c, do not begin with "j".  Keep source file names to eight | 
|---|
| 111 | characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers.  Keep | 
|---|
| 112 | compression and decompression code in separate source files --- some | 
|---|
| 113 | applications may want only one half of the library. | 
|---|
| 114 |  | 
|---|
| 115 | Note: these rules (particularly #4) are not followed religiously in the | 
|---|
| 116 | modules that are used in cjpeg/djpeg but are not part of the JPEG library | 
|---|
| 117 | proper.  Those modules are not really intended to be used in other | 
|---|
| 118 | applications. | 
|---|