doc/style: clarify default case for enumerators
[openocd.git] / doc / manual / style.txt
index 87b1e6babcd74baf19f8b743de1e4eb618907b8e..1d3ec6748d9a2aca75228577224f71ee7f621c01 100644 (file)
@@ -48,11 +48,57 @@ OpenOCD project.
 - use Unix line endings ('\\n'); do NOT use DOS endings ('\\r\\n')
 - limit adjacent empty lines to at most two (2).
 - remove any trailing empty lines at the end of source files
-- do not "comment out" code from the tree; instead, one should either:
-  -# remove it entirely (git can retrieve the old version), or
-  -# use an @c \#if/\#endif block.
-
-Finally, try to avoid lines of code that are longer than than 72-80 columns:
+- do not "comment out" code from the tree nor put it within a block
+  @code
+  #if 0
+  ...
+  #endif
+  @endcode
+  otherwise it would never be checked at compile time and when new
+  patches get merged it could be not compilable anymore.
+  Code that is not fully working nor ready for submission should
+  instead be removed entirely (git can retrieve the old version).
+  For exceptional cases that require keeping some unused code, let
+  the compiler check it by putting it in a block
+  @code
+  if (false) {
+      /* explain why this code should be kept here */
+      ...
+  }
+  @endcode
+- in a @c switch statement align the @c switch with the @c case label
+  @code
+  switch (dev_id) {
+  case 0x0123:
+      size = 0x10000;
+      break;
+  case 0x0412:
+      size = 0x20000;
+      break;
+  default:
+      size = 0x40000;
+      break;
+  }
+  @endcode
+- in an <tt> if / then / else </tt> statement, if only one of the conditions
+  require curly brackets due to multi-statement block, put the curly brackets
+  also to the other condition
+  @code
+  if (x > 0)
+      a = 12 + x;
+  else
+      a = 24;
+  @endcode
+  @code
+  if (x > 0) {
+      a = 12 + x;
+  } else {
+      a = 24;
+      x = 0;
+  }
+  @endcode
+
+Finally, try to avoid lines of code that are longer than 72-80 columns:
 
 - long lines frequently indicate other style problems:
   - insufficient use of static functions, macros, or temporary variables
@@ -60,24 +106,44 @@ Finally, try to avoid lines of code that are longer than than 72-80 columns:
 - a few lines may be wider than this limit (typically format strings), but:
   - all C compilers will concatenate series of string constants.
   - all long string constants should be split across multiple lines.
+  - do never exceed 120 columns.
 
 @section stylenames Naming Rules
 
 - most identifiers must use lower-case letters (and digits) only.
-  - macros must use upper-case letters (and digits) only.
-  - OpenOCD identifiers should NEVER use @c MixedCaps.
+  - macros and enumerators must use upper-case letters (and digits) only.
+  - OpenOCD identifiers should NEVER use @c MixedCaps, aka @c CamelCase.
 - @c typedef names must end with the '_t' suffix.
   - This should be reserved for types that should be passed by value.
   - Do @b not mix the typedef keyword with @c struct.
 - use underline characters between consecutive words in identifiers
   (e.g. @c more_than_one_word).
 
+@section style_include_guards Include Guards
+
+Every header file should have a unique include guard to prevent multiple
+inclusion.
+To guarantee uniqueness, an include guard should be based on the filename and
+the full path in the project source tree.
+
+For the header file src/helper/jim-nvp.h, the include guard would look like
+this:
+
+@code
+#ifndef OPENOCD_HELPER_JIM_NVP_H
+#define OPENOCD_HELPER_JIM_NVP_H
+
+/* Your code here. */
+
+#endif /* OPENOCD_HELPER_JIM_NVP_H */
+@endcode
+
 @section stylec99 C99 Rules
 
 - inline functions
 - @c // comments -- in new code, prefer these for single-line comments
 - trailing comma allowed in enum declarations
-- designated initializers (@{ .field = value @})
+- designated initializers ( .field = value )
 - variables declarations should occur at the point of first use
 - new block scopes for selection and iteration statements
 - use malloc() to create dynamic arrays. Do @b not use @c alloca
@@ -85,19 +151,23 @@ or variable length arrays on the stack. non-MMU hosts(uClinux) and
 pthreads require modest and predictable stack usage.
 
 @section styletypes Type Guidelines
-- use native types (@c int or @c unsigned) if the type is not important
+- use native types (@c int or <tt> unsigned int </tt>) if the type is not important
   - if size matters, use the types from \<stdint.h\> or \<inttypes.h\>:
     - @c int8_t, @c int16_t, @c int32_t, or @c int64_t: signed types of specified size
     - @c uint8_t, @c uint16_t, @c uint32_t, or @c uint64_t: unsigned types of specified size
+    - use the associated @c printf and @c scanf formatting strings for these types
+      (e.g. @c PRId8, PRIx16, SCNu8, ...)
   - do @b NOT redefine @c uN types from "types.h"
+  - use type @c target_addr_t for target's address values
+  - prefer type <tt> unsigned int </tt> to type @c unsigned
 
 @section stylefunc Functions
 
-- static inline functions should be prefered over macros:
+- static inline functions should be preferred over macros:
 @code
-/** do NOT define macro-like functions like this... */
+/* do NOT define macro-like functions like this... */
 #define CUBE(x) ((x) * (x) * (x))
-/** instead, define the same expression using a C99 inline function */
+/* instead, define the same expression using a C99 inline function */
 static inline int cube(int x) { return x * x * x; }
 @endcode
 - Functions should be declared static unless required by other modules
@@ -116,14 +186,28 @@ should write statements like the following:
 @code
 // separate statements should be preferred
 result = foo();
-if (ERROR_OK != result)
+if (result != ERROR_OK)
        ...
 @endcode
 More directly, do @b not combine these kinds of statements:
 @code
 // Combined statements should be avoided
-if (ERROR_OK != (result = foo()))
+if ((result = foo()) != ERROR_OK)
        return result;
+@endcode
+- Do not compare @c bool values with @c true or @c false but use the
+  value directly
+@code
+if (!is_enabled)
+    ...
+@endcode
+- Avoid comparing pointers with @c NULL
+@code
+buf = malloc(buf_size);
+if (!buf) {
+    LOG_ERROR("Out of memory");
+    return ERROR_FAIL;
+}
 @endcode
 
  */
@@ -157,19 +241,19 @@ comments.
  * @returns The value(s) returned, or possible error conditions.
  */
 @endverbatim
-  -# The block should start on the line following the opening @c /**.
-  -# The end of the block, \f$*/\f$, should also be on its own line.
+  -# The block should start on the line following the opening @c /\**.
+  -# The end of the block, @c *&zwj;/, should also be on its own line.
   -# Every line in the block should have a @c '*' in-line with its start:
-    - A leading space is required to align the @c '*' with the @c /** line.
+    - A leading space is required to align the @c '*' with the @c /\** line.
     - A single "empty" line should separate the function documentation
       from the block of parameter and return value descriptions.
     - Except to separate paragraphs of documentation, other extra
       "empty" lines should be removed from the block.
   -# Only single spaces should be used; do @b not add mid-line indentation.
 -# If the total line length will be less than 72-80 columns, then
-  - The @c /**< form can be used on the same line.
+  - The @c /\**< form can be used on the same line.
   - This style should be used sparingly; the best use is for fields:
-    @code int field; /**< field description */ @endcode
+    @verbatim int field; /**< field description */ @endverbatim
 
 @section styledoxyall Doxygen Style Guide
 
@@ -182,7 +266,7 @@ The following guidelines apply to all Doxygen comment blocks:
   -# @c struct_name::member_name should be used to reference structure
     fields in the documentation (e.g. @c flash_driver::name).
   -# URLS get converted to markup automatically, without any extra effort.
-  -# new pages can be linked into the heirarchy by using the @c \@subpage
+  -# new pages can be linked into the hierarchy by using the @c \@subpage
     command somewhere the page(s) under which they should be linked:
   -# use @c \@ref in other contexts to create links to pages and sections.
 -# Use good Doxygen mark-up:
@@ -214,7 +298,7 @@ documentation as part of standalone text files:
   - Doxygen creates such pages for files automatically, but no content
     will appear on them for those that only contain manual pages.
   - The \@file block should provide useful meta-documentation to assist
-    techincal writers; typically, a list of the pages that it contains.
+    technical writers; typically, a list of the pages that it contains.
   - For example, the @ref styleguide exists in @c doc/manual/style.txt,
     which contains a reference back to itself.
 -# The \@file and \@page commands should begin on the same line as
@@ -242,7 +326,7 @@ The User's Guide is there to provide two basic kinds of information.  It
 is a guide for how and why to use each feature or mechanism of OpenOCD.
 It is also the reference manual for all commands and options involved
 in using them, including interface, flash, target, and other drivers.
-At this time, it is the only user-targetted documentation; everything
+At this time, it is the only documentation for end users; everything
 else is addressing OpenOCD developers.
 
 There are two key audiences for the User's Guide, both developer based.
@@ -322,7 +406,7 @@ For technical reference material:
      vice versa.
 - Alphabetize the \@defn declarations for all commands in each
   section.
-- Keep the per-command documentation focussed on exactly what that
+- Keep the per-command documentation focused on exactly what that
   command does, not motivation, advice, suggestions, or big examples.
   When commands deserve such expanded text, it belongs elsewhere.
   Solutions might be using a \@section explaining a cluster of related
@@ -370,7 +454,7 @@ Maintainers must also be sure to follow additional guidelines:
 
 This page contains style guidelines for the OpenOCD autotools scripts.
 
-The following guidelines apply to the @c configure.in file:
+The following guidelines apply to the @c configure.ac file:
 - Better guidelines need to be developed, but until then...
 - Use good judgement.
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)