summaryrefslogtreecommitdiff
path: root/CODING_STYLE
blob: 126f1a9812d4ffed0a6fdfaa2a81c4e5a7fc1a73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
Pixman coding style.
====================

The pixman coding style is close to cairo's with one exception: braces
go on their own line, rather than on the line of the if/while/for:

	if (condition)
	{
	    do_something();
	    do_something_else();
	}

not

	if (condition) {
	    do_something();
	    do_something_else();
        }



Specific guidelines:


Indentation
===========

Each new level is indented four spaces:

	if (condition)
	    do_something();

This may be achieved with space characters or with a combination of
tab characters and space characters. Tab characters are interpreted as

	Advance to the next column which is a multiple of 8.


Names
=====

In all names, words are separated with underscores. Do not use
CamelCase for any names.

Macros have ALL_CAPITAL_NAMES

Type names are in lower case and end with "_t". For example
pixman_image_t.

Labels, functions and variables have lower case names.


Braces
======

Braces always go on their own line:

	if (condition)
	{
	    do_this ();
	    do_that ();
	}
	else
	{
	    do_the_other ();
	}

Rules for braces and substatements of if/while/for/do:

* If a substatement spans multiple lines, then there must be braces
  around it.

* If the condition of an if/while/for spans multiple lines, then 
  braces must be used for the substatements.

* If one substatement of an if statement has braces, then the other
  must too.

* Otherwise, don't add braces.


Comments
========

For comments either like this:

        /* One line comment */

or like this:

	/* This is a multi-line comment
	 *
         * It extends over multiple lines
	 */

Generally comments should say things that is clear from the code
itself. If too many comments say obvious things, then people will just
stop reading all comments, including the good ones.


Whitespace
==========

* Put a single space after commas

* Put spaces around arithmetic operators such a +, -, *, /:

        y * stride + x

        x / unit_x

* Do not put spaces after the address-of operator, the * when used as
  a pointer derefernce or the ! and ~ operators:

     &foo;

     ~0x00000000

     !condition

     *result = 100

* Break up long lines (> ~80 characters) and use whitespace to align
  things nicely. This is one way:

  	 some_very_long_function name (
	 	implementation, op, src, mask, dest, 
		src_x, src_y, mask_x, mask_y, dest_x, dest_y,
		width, height);

  This is another:

        some_very_long_function_name (implementation, op,
                                      src, mask, dest,
				      src_x, src_y,
				      mask_x, mask_y,
				      dest_x, dest_y,
				      width, height);

* Separate logically distinct chunks with a single newline. This
  obviously applies between functions, but also applies within a
  function or block or structure definition.

* Use a newline after a block of variable declarations.

* Use a single space before a left parenthesis, except where the
  standard will not allow it, (eg. when defining a parameterized macro).

* Don't eliminate newlines just because things would still fit on one
  line. This breaks the expected visual structure of the code making
  it much harder to read and understand:

	if (condition) foo (); else bar ();	/* Yuck! */

* Do eliminate trailing whitespace (space or tab characters) on any
  line. Also, avoid putting initial or final blank lines into any
  file, and never use multiple blank lines instead of a single blank
  line.

* Do enable the default git pre-commit hook that detect trailing
  whitespace for you and help you to avoid corrupting cairo's tree
  with it. Do that as follows:

	chmod a+x .git/hooks/pre-commit

* You might also find the git-stripspace utility helpful which acts as
  a filter to remove trailing whitespace as well as initial, final,
  and duplicate blank lines.


Function Definitions
====================

Function definitions should take the following form:

	void
	my_function (argument)
	{
	    do_my_things ();
	}

If all the parameters to a function fit naturally on one line, format
them that way. Otherwise, put one argument on each line, adding
whitespace so that the parameter names are aligned with each other.

I.e., do either this:

        void
        short_arguments (const char *str, int x, int y, int z)
        {
        }

or this:

	void
	long_arguments (const char *char_star_arg,
			int	    int_arg,
			double	   *double_star_arg,
			double	    double_arg)
	{
	}


Mode lines
==========

Given the rules above, what is the best way to simplify one's life as
a code monkey? Get your editor to do most of the tedious work of
beautifying your code!

As a reward for reading this far, here are some mode lines for the more
popular editors:
/*
 * vim:sw=4:sts=4:ts=8:tw=78:fo=tcroq:cindent:cino=\:0,(0
 * vim:isk=a-z,A-Z,48-57,_,.,-,>
 */