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