268 lines
5.5 KiB
Markdown
268 lines
5.5 KiB
Markdown
|
# Coding Style for Apache NimBLE
|
||
|
|
||
|
Apache NimBLE project is part of Apache Mynewt projct and follows its coding
|
||
|
style.
|
||
|
|
||
|
# Coding Style for Apache Mynewt Core
|
||
|
|
||
|
This document is meant to define the coding style for Apache Mynewt, and
|
||
|
all subprojects of Apache Mynewt. This covers C and Assembly coding
|
||
|
conventions, *only*. Other languages (such as Go), have their own
|
||
|
coding conventions.
|
||
|
|
||
|
## Headers
|
||
|
|
||
|
* All files that are newly written, should have the Apache License clause
|
||
|
at the top of them.
|
||
|
|
||
|
* For files that are copied from another source, but contain an Apache
|
||
|
compatible license, the original license header shall be maintained.
|
||
|
|
||
|
* For more information on applying the Apache license, the definitive
|
||
|
source is here: http://www.apache.org/dev/apply-license.html
|
||
|
|
||
|
* The Apache License clause for the top of files is as follows:
|
||
|
|
||
|
```no-highlight
|
||
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance
|
||
|
* with the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing,
|
||
|
* software distributed under the License is distributed on an
|
||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
* KIND, either express or implied. See the License for the
|
||
|
* specific language governing permissions and limitations
|
||
|
* under the License.
|
||
|
*/
|
||
|
```
|
||
|
|
||
|
## Whitespace and Braces
|
||
|
|
||
|
* Code must be indented to 4 spaces, tabs should not be used.
|
||
|
|
||
|
* Do not add whitespace at the end of a line.
|
||
|
|
||
|
* Put space after keywords (for, if, return, switch, while).
|
||
|
|
||
|
* for, else, if, while statements must have braces around their
|
||
|
code blocks, i.e., do:
|
||
|
|
||
|
```
|
||
|
if (x) {
|
||
|
assert(0);
|
||
|
} else {
|
||
|
assert(0);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
if (x)
|
||
|
assert(0);
|
||
|
else
|
||
|
assert(0);
|
||
|
```
|
||
|
|
||
|
* Braces for statements must be on the same line as the statement. Good:
|
||
|
|
||
|
```
|
||
|
for (i = 0; i < 10; i++) {
|
||
|
if (i == 5) {
|
||
|
break;
|
||
|
} else {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
for (i = 0; i < 10; i++)
|
||
|
{ <-- brace must be on same line as for
|
||
|
if (i == 5) {
|
||
|
break;
|
||
|
} <-- no new line between else
|
||
|
else {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
* After a function declaration, the braces should be on a newline, i.e. do:
|
||
|
|
||
|
```
|
||
|
static void *
|
||
|
function(int var1, int var2)
|
||
|
{
|
||
|
```
|
||
|
|
||
|
not:
|
||
|
|
||
|
```
|
||
|
static void *
|
||
|
function(int var1, int var2) {
|
||
|
```
|
||
|
|
||
|
## Line Length and Wrap
|
||
|
|
||
|
* Line length should never exceed 79 columns.
|
||
|
|
||
|
* When you have to wrap a long statement, put the operator at the end of the
|
||
|
line. i.e.:
|
||
|
|
||
|
```
|
||
|
if (x &&
|
||
|
y == 10 &&
|
||
|
b)
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
if (x
|
||
|
&& y == 10
|
||
|
&& b)
|
||
|
```
|
||
|
|
||
|
## Comments
|
||
|
|
||
|
* No C++ style comments allowed.
|
||
|
|
||
|
* When using a single line comment, put it above the line of code that you
|
||
|
intend to comment, i.e., do:
|
||
|
|
||
|
```
|
||
|
/* check variable */
|
||
|
if (a) {
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
if (a) { /* check variable */
|
||
|
```
|
||
|
|
||
|
|
||
|
* All public APIs should be commented with Doxygen style comments describing
|
||
|
purpose, parameters and return values. Private APIs need not be documented.
|
||
|
|
||
|
|
||
|
## Header files
|
||
|
|
||
|
* Header files must contain the following structure:
|
||
|
* Apache License (see above)
|
||
|
* ```#ifdef``` aliasing, to prevent multiple includes
|
||
|
* ```#include``` directives for other required header files
|
||
|
* ```#ifdef __cplusplus``` wrappers to maintain C++ friendly APIs
|
||
|
* Contents of the header file
|
||
|
|
||
|
* ```#ifdef``` aliasing, shall be in the following format, where
|
||
|
the package name is "os" and the file name is "callout.h":
|
||
|
|
||
|
```no-highlight
|
||
|
#ifndef _OS_CALLOUT_H
|
||
|
#define _OS_CALLOUT_H
|
||
|
```
|
||
|
|
||
|
* ```#include``` directives must happen prior to the cplusplus
|
||
|
wrapper.
|
||
|
|
||
|
* The cplusplus wrapper must have the following format, and precedes
|
||
|
any contents of the header file:
|
||
|
|
||
|
```no-highlight
|
||
|
#ifdef __cplusplus
|
||
|
#extern "C" {
|
||
|
##endif
|
||
|
```
|
||
|
|
||
|
## Naming
|
||
|
|
||
|
* Names of functions, structures and variables must be in all lowercase.
|
||
|
|
||
|
* Names should be as short as possible, but no shorter.
|
||
|
|
||
|
* Globally visible names must be prefixed with the name of the module,
|
||
|
followed by the '_' character, i.e.:
|
||
|
|
||
|
```
|
||
|
os_callout_init(&c)
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
callout_init(c)
|
||
|
```
|
||
|
|
||
|
## Functions
|
||
|
|
||
|
* No spaces after function names when calling a function, i.e, do:
|
||
|
|
||
|
```
|
||
|
rc = function(a)
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
rc = function (a)
|
||
|
```
|
||
|
|
||
|
|
||
|
* Arguments to function calls should have spaces between the comma, i.e. do:
|
||
|
|
||
|
```
|
||
|
rc = function(a, b)
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
rc = function(a,b)
|
||
|
```
|
||
|
|
||
|
* The function type must be on a line by itself preceding the function, i.e. do:
|
||
|
|
||
|
```
|
||
|
static void *
|
||
|
function(int var1, int var2)
|
||
|
{
|
||
|
```
|
||
|
|
||
|
Not:
|
||
|
|
||
|
```
|
||
|
static void *function(int var1, int var2)
|
||
|
{
|
||
|
```
|
||
|
|
||
|
* In general, for functions that return values that denote success or error, 0
|
||
|
shall be success, and non-zero shall be the failure code.
|
||
|
|
||
|
## Variables and Macros
|
||
|
|
||
|
* Do not use typedefs for structures. This makes it impossible for
|
||
|
applications to use pointers to those structures opaquely.
|
||
|
|
||
|
* typedef may be used for non-structure types, where it is beneficial to
|
||
|
hide or alias the underlying type used (e.g. ```os_time_t```.) Indicate
|
||
|
typedefs by applying the ```_t``` marker to them.
|
||
|
|
||
|
* Place all function-local variable definitions at the top of the function body, before any statements.
|
||
|
|
||
|
## Compiler Directives
|
||
|
|
||
|
* Code must compile cleanly with -Wall enabled.
|
||
|
|