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