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