On Mon, Nov 28, 2011 at 01:13:44PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
* HACKING: Add notes on coding style conventions
---
HACKING | 221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 220 insertions(+), 1 deletions(-)
diff --git a/HACKING b/HACKING
index fe52c17..ea419e5 100644
--- a/HACKING
+++ b/HACKING
@@ -6,4 +6,223 @@ having to run make install, there are two environment variables
that need to be set:
export
GI_TYPELIB_PATH=`pwd`/libvirt-glib:`pwd`/libvirt-gconfig:`pwd`/libvirt-gobject
- export
LD_LIBRARY_PATH=`pwd`/libvirt-glib/.libs:`pwd`/libvirt-gconfig/.libs:`pwd`/libvirt-gobject/.libs
\ No newline at end of file
+ export
LD_LIBRARY_PATH=`pwd`/libvirt-glib/.libs:`pwd`/libvirt-gconfig/.libs:`pwd`/libvirt-gobject/.libs
+
+
+Coding style rules
+
+ - Opening & closing braces for functions should be at start of line
+
+ int foo(int bar)
+ {
+ ...
+ }
+
+ Not
+
+ int foo(int bar) {
+ ...
+ }
+
+
+
+ - Opening brace for if/while/for loops should be at the end of line
+
+ if (foo) {
+ bar;
+ wizz;
+ }
+
+ Not
+
+ if (foo)
+ {
+ bar;
+ wizz;
+ }
+
+ Rationale: putting every if/while/for opening brace on a new line
+ expands function length too much
+
+
+
+ - If a brace needs to be used for one clause in an if/else statement,
+ it should be used for both clauses, even if the other clauses are
+ only single statements. eg
+
+ if (foo) {
+ bar;
+ wizz;
+ } else {
+ eek;
+ }
+
+ Not
+
+ if (foo) {
+ bar;
+ wizz;
+ } else
+ eek;
+
+
+
+ - Function parameter attribute annotations should follow the parameter
+ name, eg
+
+ int foo(int bar G_GNUC_UNUSED)
+ {
+ }
+
+ Not
+
+ int foo(G_GNUC_UNUSED int bar)
+ {
+ }
+
+ Rationale: Adding / removing G_GNUC_UNUSED should not cause the
+ rest of the line to move around since that obscures diffs.
+
+
+
+ - There should be no space between function names & open brackets eg
+
+ int foo(int bar)
+ {
+ }
+
+ Not
+
+ int foo (int bar)
+ {
+ }
+
+
+
+ - To keep lines under 80 characters (where practical), multiple parameters
+ should be on new lines. Do not attempt to line up parameters vertically
+ eg
+
+ int foo(int bar,
+ unsigned long wizz)
+ {
+ }
+
+ Not
+
+ int foo(int bar, unsigned long wizz)
+ {
+ }
+
+ Not
+
+ int foo(int bar,
+ unsigned long wizz)
+ {
+ }
+
+ Rationale: attempting vertical alignment causes bigger diffs when
+ modifying code if type names change causing whitespace re-alignment.
+
+
+
+ - Function declarations in headers should not attempt to line up parameters
+ vertically
+
+ eg
+
+ int foo(int bar)
+ unsigned long eek(sometype wizz)
+
+ Not
+
+
+ int foo(int bar)
+ unsigned long eek(sometype wizz)
+
+ Rationale: when making changes to headers, existing vertical alignment
+ is often invalidated, requiring reindentation. This causes bigger
+ diffs which obscures code review.
+
+ Exception: the 6 common decls for defining a new GObject
+
+ #define GVIR_TYPE_INPUT_STREAM (_gvir_input_stream_get_type ())
+ #define GVIR_INPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst),
GVIR_TYPE_INPUT_STREAM, GVirInputStream))
+ #define GVIR_INPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class),
GVIR_TYPE_INPUT_STREAM, GVirInputStreamClass))
+ #define GVIR_IS_INPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst),
GVIR_TYPE_INPUT_STREAM))
+ #define GVIR_IS_INPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class),
GVIR_TYPE_INPUT_STREAM))
+ #define GVIR_INPUT_STREAM_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst),
GVIR_TYPE_INPUT_STREAM, GVirInputStreamClass))
+
+ Rationale: These decls never change once added so vertical
+ alignment of these 6 lines only, will not cause diff whitespace
+ problems later.
+
+
+ - Usage of goto should follow one of the following patterns, and
+ label naming conventions. In particular any exit path jumps should
+ obay the 'cleanup' vs 'error' label naming
+
+ * Interrupted system calls:
+
+ retry:
+ err = func()
+ if (err < 0 && errno == EINTR)
+ goto retry;
+
+ Alternate label name: retry_func:
+
+
+ * Shared cleanup paths:
+
+ int foo(int bar)
+ {
+ int ret = -1;
+
+
+ if (something goes wrong)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ ...shared cleanup code...
+ return ret;
+ }
+
+
+ * Separate error exit paths:
+
+ int foo(int bar)
+ {
+ if (something goes wrong)
+ goto error;
+
+ return 0;
+
+ error:
+ ...error cleanup code...
+ return -1;
+ }
+
+
+ * Separate and shared error exit paths:
+
+ int foo(int bar)
+ {
+ int ret = -1;
+
+ if (something very bad goes wrong)
+ goto error;
+
+ if (something goes wrong)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ ...shared cleanup code...
+ return 0;
+
+ error:
+ ...error cleanup code...
+ return -1;
+ }
+
For what it's worth this adds a blank line to the end of the file.
Christophe