xref: /nrf52832-nimble/packages/NimBLE-latest/CODING_STANDARDS.md (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero# Coding Style for Apache NimBLE
2*042d53a7SEvalZero
3*042d53a7SEvalZeroApache NimBLE project is part of Apache Mynewt projct and follows its coding
4*042d53a7SEvalZerostyle.
5*042d53a7SEvalZero
6*042d53a7SEvalZero# Coding Style for Apache Mynewt Core
7*042d53a7SEvalZero
8*042d53a7SEvalZeroThis document is meant to define the coding style for Apache Mynewt, and
9*042d53a7SEvalZeroall subprojects of Apache Mynewt.  This covers C and Assembly coding
10*042d53a7SEvalZeroconventions, *only*.  Other languages (such as Go), have their own
11*042d53a7SEvalZerocoding conventions.
12*042d53a7SEvalZero
13*042d53a7SEvalZero## Headers
14*042d53a7SEvalZero
15*042d53a7SEvalZero* All files that are newly written, should have the Apache License clause
16*042d53a7SEvalZeroat the top of them.
17*042d53a7SEvalZero
18*042d53a7SEvalZero* For files that are copied from another source, but contain an Apache
19*042d53a7SEvalZerocompatible license, the original license header shall be maintained.
20*042d53a7SEvalZero
21*042d53a7SEvalZero* For more information on applying the Apache license, the definitive
22*042d53a7SEvalZerosource is here: http://www.apache.org/dev/apply-license.html
23*042d53a7SEvalZero
24*042d53a7SEvalZero* The Apache License clause for the top of files is as follows:
25*042d53a7SEvalZero
26*042d53a7SEvalZero```no-highlight
27*042d53a7SEvalZero/*
28*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one
29*042d53a7SEvalZero * or more contributor license agreements.  See the NOTICE file
30*042d53a7SEvalZero * distributed with this work for additional information
31*042d53a7SEvalZero * regarding copyright ownership.  The ASF licenses this file
32*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the
33*042d53a7SEvalZero * "License"); you may not use this file except in compliance
34*042d53a7SEvalZero * with the License.  You may obtain a copy of the License at
35*042d53a7SEvalZero *
36*042d53a7SEvalZero *  http://www.apache.org/licenses/LICENSE-2.0
37*042d53a7SEvalZero *
38*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing,
39*042d53a7SEvalZero * software distributed under the License is distributed on an
40*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
41*042d53a7SEvalZero * KIND, either express or implied.  See the License for the
42*042d53a7SEvalZero * specific language governing permissions and limitations
43*042d53a7SEvalZero * under the License.
44*042d53a7SEvalZero */
45*042d53a7SEvalZero```
46*042d53a7SEvalZero
47*042d53a7SEvalZero## Whitespace and Braces
48*042d53a7SEvalZero
49*042d53a7SEvalZero* Code must be indented to 4 spaces, tabs should not be used.
50*042d53a7SEvalZero
51*042d53a7SEvalZero* Do not add whitespace at the end of a line.
52*042d53a7SEvalZero
53*042d53a7SEvalZero* Put space after keywords (for, if, return, switch, while).
54*042d53a7SEvalZero
55*042d53a7SEvalZero* for, else, if, while statements must have braces around their
56*042d53a7SEvalZerocode blocks, i.e., do:
57*042d53a7SEvalZero
58*042d53a7SEvalZero```
59*042d53a7SEvalZero    if (x) {
60*042d53a7SEvalZero        assert(0);
61*042d53a7SEvalZero    } else {
62*042d53a7SEvalZero        assert(0);
63*042d53a7SEvalZero    }
64*042d53a7SEvalZero```
65*042d53a7SEvalZero
66*042d53a7SEvalZeroNot:
67*042d53a7SEvalZero
68*042d53a7SEvalZero```
69*042d53a7SEvalZero    if (x)
70*042d53a7SEvalZero        assert(0);
71*042d53a7SEvalZero    else
72*042d53a7SEvalZero        assert(0);
73*042d53a7SEvalZero```
74*042d53a7SEvalZero
75*042d53a7SEvalZero* Braces for statements must be on the same line as the statement.  Good:
76*042d53a7SEvalZero
77*042d53a7SEvalZero```
78*042d53a7SEvalZero    for (i = 0; i < 10; i++) {
79*042d53a7SEvalZero        if (i == 5) {
80*042d53a7SEvalZero            break;
81*042d53a7SEvalZero        } else {
82*042d53a7SEvalZero            continue;
83*042d53a7SEvalZero        }
84*042d53a7SEvalZero    }
85*042d53a7SEvalZero```
86*042d53a7SEvalZero
87*042d53a7SEvalZeroNot:
88*042d53a7SEvalZero
89*042d53a7SEvalZero```
90*042d53a7SEvalZero    for (i = 0; i < 10; i++)
91*042d53a7SEvalZero    { <-- brace must be on same line as for
92*042d53a7SEvalZero        if (i == 5) {
93*042d53a7SEvalZero            break;
94*042d53a7SEvalZero        } <-- no new line between else
95*042d53a7SEvalZero        else {
96*042d53a7SEvalZero            continue;
97*042d53a7SEvalZero        }
98*042d53a7SEvalZero    }
99*042d53a7SEvalZero```
100*042d53a7SEvalZero
101*042d53a7SEvalZero* After a function declaration, the braces should be on a newline, i.e. do:
102*042d53a7SEvalZero
103*042d53a7SEvalZero```
104*042d53a7SEvalZero    static void *
105*042d53a7SEvalZero    function(int var1, int var2)
106*042d53a7SEvalZero    {
107*042d53a7SEvalZero```
108*042d53a7SEvalZero
109*042d53a7SEvalZeronot:
110*042d53a7SEvalZero
111*042d53a7SEvalZero```
112*042d53a7SEvalZero    static void *
113*042d53a7SEvalZero    function(int var1, int var2) {
114*042d53a7SEvalZero```
115*042d53a7SEvalZero
116*042d53a7SEvalZero## Line Length and Wrap
117*042d53a7SEvalZero
118*042d53a7SEvalZero* Line length should never exceed 79 columns.
119*042d53a7SEvalZero
120*042d53a7SEvalZero* When you have to wrap a long statement, put the operator at the end of the
121*042d53a7SEvalZero  line.  i.e.:
122*042d53a7SEvalZero
123*042d53a7SEvalZero```
124*042d53a7SEvalZero    if (x &&
125*042d53a7SEvalZero        y == 10 &&
126*042d53a7SEvalZero        b)
127*042d53a7SEvalZero```
128*042d53a7SEvalZero
129*042d53a7SEvalZeroNot:
130*042d53a7SEvalZero
131*042d53a7SEvalZero```
132*042d53a7SEvalZero    if (x
133*042d53a7SEvalZero        && y == 10
134*042d53a7SEvalZero        && b)
135*042d53a7SEvalZero```
136*042d53a7SEvalZero
137*042d53a7SEvalZero## Comments
138*042d53a7SEvalZero
139*042d53a7SEvalZero* No C++ style comments allowed.
140*042d53a7SEvalZero
141*042d53a7SEvalZero* When using a single line comment, put it above the line of code that you
142*042d53a7SEvalZerointend to comment, i.e., do:
143*042d53a7SEvalZero
144*042d53a7SEvalZero```
145*042d53a7SEvalZero    /* check variable */
146*042d53a7SEvalZero    if (a) {
147*042d53a7SEvalZero```
148*042d53a7SEvalZero
149*042d53a7SEvalZeroNot:
150*042d53a7SEvalZero
151*042d53a7SEvalZero```
152*042d53a7SEvalZero    if (a) { /* check variable */
153*042d53a7SEvalZero```
154*042d53a7SEvalZero
155*042d53a7SEvalZero
156*042d53a7SEvalZero* All public APIs should be commented with Doxygen style comments describing
157*042d53a7SEvalZeropurpose, parameters and return values.  Private APIs need not be documented.
158*042d53a7SEvalZero
159*042d53a7SEvalZero
160*042d53a7SEvalZero## Header files
161*042d53a7SEvalZero
162*042d53a7SEvalZero* Header files must contain the following structure:
163*042d53a7SEvalZero    * Apache License (see above)
164*042d53a7SEvalZero    * ```#ifdef``` aliasing, to prevent multiple includes
165*042d53a7SEvalZero    * ```#include``` directives for other required header files
166*042d53a7SEvalZero    * ```#ifdef __cplusplus``` wrappers to maintain C++ friendly APIs
167*042d53a7SEvalZero    * Contents of the header file
168*042d53a7SEvalZero
169*042d53a7SEvalZero* ```#ifdef``` aliasing, shall be in the following format, where
170*042d53a7SEvalZerothe package name is "os" and the file name is "callout.h":
171*042d53a7SEvalZero
172*042d53a7SEvalZero```no-highlight
173*042d53a7SEvalZero#ifndef _OS_CALLOUT_H
174*042d53a7SEvalZero#define _OS_CALLOUT_H
175*042d53a7SEvalZero```
176*042d53a7SEvalZero
177*042d53a7SEvalZero* ```#include``` directives must happen prior to the cplusplus
178*042d53a7SEvalZerowrapper.
179*042d53a7SEvalZero
180*042d53a7SEvalZero* The cplusplus wrapper must have the following format, and precedes
181*042d53a7SEvalZeroany contents of the header file:
182*042d53a7SEvalZero
183*042d53a7SEvalZero```no-highlight
184*042d53a7SEvalZero#ifdef __cplusplus
185*042d53a7SEvalZero#extern "C" {
186*042d53a7SEvalZero##endif
187*042d53a7SEvalZero```
188*042d53a7SEvalZero
189*042d53a7SEvalZero## Naming
190*042d53a7SEvalZero
191*042d53a7SEvalZero* Names of functions, structures and variables must be in all lowercase.
192*042d53a7SEvalZero
193*042d53a7SEvalZero* Names should be as short as possible, but no shorter.
194*042d53a7SEvalZero
195*042d53a7SEvalZero* Globally visible names must be prefixed with the name of the module,
196*042d53a7SEvalZerofollowed by the '_' character, i.e.:
197*042d53a7SEvalZero
198*042d53a7SEvalZero```
199*042d53a7SEvalZero    os_callout_init(&c)
200*042d53a7SEvalZero```
201*042d53a7SEvalZero
202*042d53a7SEvalZeroNot:
203*042d53a7SEvalZero
204*042d53a7SEvalZero```
205*042d53a7SEvalZero    callout_init(c)
206*042d53a7SEvalZero```
207*042d53a7SEvalZero
208*042d53a7SEvalZero## Functions
209*042d53a7SEvalZero
210*042d53a7SEvalZero* No spaces after function names when calling a function, i.e, do:
211*042d53a7SEvalZero
212*042d53a7SEvalZero```
213*042d53a7SEvalZero    rc = function(a)
214*042d53a7SEvalZero```
215*042d53a7SEvalZero
216*042d53a7SEvalZeroNot:
217*042d53a7SEvalZero
218*042d53a7SEvalZero```
219*042d53a7SEvalZero    rc = function (a)
220*042d53a7SEvalZero```
221*042d53a7SEvalZero
222*042d53a7SEvalZero
223*042d53a7SEvalZero* Arguments to function calls should have spaces between the comma, i.e. do:
224*042d53a7SEvalZero
225*042d53a7SEvalZero```
226*042d53a7SEvalZero    rc = function(a, b)
227*042d53a7SEvalZero```
228*042d53a7SEvalZero
229*042d53a7SEvalZeroNot:
230*042d53a7SEvalZero
231*042d53a7SEvalZero```
232*042d53a7SEvalZero    rc = function(a,b)
233*042d53a7SEvalZero```
234*042d53a7SEvalZero
235*042d53a7SEvalZero* The function type must be on a line by itself preceding the function, i.e. do:
236*042d53a7SEvalZero
237*042d53a7SEvalZero```
238*042d53a7SEvalZero    static void *
239*042d53a7SEvalZero    function(int var1, int var2)
240*042d53a7SEvalZero    {
241*042d53a7SEvalZero```
242*042d53a7SEvalZero
243*042d53a7SEvalZeroNot:
244*042d53a7SEvalZero
245*042d53a7SEvalZero```
246*042d53a7SEvalZero    static void *function(int var1, int var2)
247*042d53a7SEvalZero    {
248*042d53a7SEvalZero```
249*042d53a7SEvalZero
250*042d53a7SEvalZero* In general, for functions that return values that denote success or error, 0
251*042d53a7SEvalZeroshall be success, and non-zero shall be the failure code.
252*042d53a7SEvalZero
253*042d53a7SEvalZero## Variables and Macros
254*042d53a7SEvalZero
255*042d53a7SEvalZero* Do not use typedefs for structures.  This makes it impossible for
256*042d53a7SEvalZeroapplications to use pointers to those structures opaquely.
257*042d53a7SEvalZero
258*042d53a7SEvalZero* typedef may be used for non-structure types, where it is beneficial to
259*042d53a7SEvalZerohide or alias the underlying type used (e.g. ```os_time_t```.)   Indicate
260*042d53a7SEvalZerotypedefs by applying the ```_t``` marker to them.
261*042d53a7SEvalZero
262*042d53a7SEvalZero* Place all function-local variable definitions at the top of the function body, before any statements.
263*042d53a7SEvalZero
264*042d53a7SEvalZero## Compiler Directives
265*042d53a7SEvalZero
266*042d53a7SEvalZero* Code must compile cleanly with -Wall enabled.
267*042d53a7SEvalZero
268