About Us
Museum

Reference-coding-guide

From RFID Guardian

This is a fairly large software project. Please follow the coding guidelines here; conformance helps understanding.

Contents

[edit] C code

[edit] Software tree structure

  • include file
in the include/ tree
has public interface for your module. Anything that need not be exported outside the module has no place here: keep it in the source
  • source file
in the src/ tree

Makefile: best practice would be to clone an appropriate Makefile in some src/ subdirectory, and some test/ subdirectory. The Makefile infrastructure is set up so most configuration is automatic, but you have to define:

  • RFID := $(shell cd ../..; pwd -P)
(or more ../ , until that path points to the root of MRG).
  • MRG_LIB := $(RFID)/lib/libmrg
  • default: $(MRG_LIB)
  • include $(RFID)/include.mk

If your module has subdirectories, follow the example in e.g. src/ui/ that has two subdirectories, src/ui/impl/ and src/ui/stdin/.

Provide one or more unit tests for all your module's features. Make an appropriate subdirectory or subtree in test/.

[edit] Documenting

  • In the include file, all macros, enums, types, variables and functions must be documented in Doxygen style. The generated Doxygen documentation will be on the project's web page.
  • Nontrivial stuff is documented in the source file. Functions that implement nontrivial algorithms are documented in the source file before the start of the function.

[edit] Naming

C has no name spaces, so in an attempt to avoid name collisions, all public identifiers must be prefixed with mrg_<subproject>_ where subproject is a few-letter acronym for the current subproject. Macros are in all-caps, functions and variables are in all-lowercase and use "_" for sub-name separation. Static (non-public) identifiers need not be prefixed, but still beware of name collisions: debuggers tend to not understand.

Make all non-public identifiers static.

[edit] Types

Struct and enum types are of this form:


typedef struct MRG_PRJ_BLA {
    ... struct fields ...
} mrg_prj_bla_t;


If a struct contents need not be public, make it an opaque type and define the struct in the source.


Where an integer type of a certain number of bits is necessary, specify that explicitly: uint32_t in stead of unsigned long.

[edit] Layout

Use 4 spaces for indent. Use no tabs.

Separate functions with 2 blank lines. Separate variable declarations and code with 1 blank line. Mark code structure with a blank line.

Always use braces in if, while etc statements. Single exception:

if (error) return -1;

for an abnormal return


Bracing looks like this:

if (a) {
    ... work along a ...
} else if (b) {
    ... work along b ...
} else {
    ... work elsewise ...
}
static int
func(mrg_prj_bla_t *prj, const char *bla)
{
}

[edit] Java code

Packages must live under org.rfidguardian.<package>. Currently, there are two packages: GP, which has the stubs/skeletons generated by the GPc stub compiler and some common hand-written classes; and UI/ME that has the user interface implementation on top of MIDP (aka JavaME). Code must be relevantly javadoc'ed.

Java code style must adhere to Sun's Code Conventions. It is no coincidence that this resembles the C coding style a lot.