README.md: Add a quick blurb on style
This commit is contained in:
parent
22ed7d0fbf
commit
b8a06c11f6
95
README.md
95
README.md
|
|
@ -31,3 +31,98 @@ To run just ostree's tests:
|
||||||
gnome-desktop-testing-runner -p 0 ostree/
|
gnome-desktop-testing-runner -p 0 ostree/
|
||||||
|
|
||||||
|
|
||||||
|
Coding style
|
||||||
|
------------
|
||||||
|
|
||||||
|
Indentation is GNU. Files should start with the appropriate mode lines.
|
||||||
|
|
||||||
|
Use GCC `__attribute__((cleanup))` wherever possible. If interacting
|
||||||
|
with a third party library, try defining local cleanup macros.
|
||||||
|
|
||||||
|
Use GError and GCancellable where appropriate.
|
||||||
|
|
||||||
|
Prefer returning `gboolean` to signal success/failure, and have output
|
||||||
|
values as parameters.
|
||||||
|
|
||||||
|
Prefer linear control flow inside functions (aside from standard
|
||||||
|
loops). In other words, avoid "early exits" or use of `goto` besides
|
||||||
|
`goto out;`.
|
||||||
|
|
||||||
|
This is an example of an "early exit":
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
myfunc (...)
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
|
||||||
|
/* some code */
|
||||||
|
|
||||||
|
/* some more code */
|
||||||
|
|
||||||
|
if (condition)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* some more code */
|
||||||
|
|
||||||
|
ret = TRUE;
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
If you must shortcut, use:
|
||||||
|
|
||||||
|
if (condition)
|
||||||
|
{
|
||||||
|
ret = TRUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
A consequence of this restriction is that you are encouraged to avoid
|
||||||
|
deep nesting of loops or conditionals. Create internal static helper
|
||||||
|
functions, particularly inside loops. For example, rather than:
|
||||||
|
|
||||||
|
while (condition)
|
||||||
|
{
|
||||||
|
/* some code */
|
||||||
|
if (condition)
|
||||||
|
{
|
||||||
|
for (i = 0; i < somevalue; i++)
|
||||||
|
{
|
||||||
|
if (condition)
|
||||||
|
{
|
||||||
|
/* deeply nested code */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* more nested code */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Instead do this:
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
helperfunc (..., GError **error)
|
||||||
|
{
|
||||||
|
if (condition)
|
||||||
|
{
|
||||||
|
/* deeply nested code */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* more nested code */
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (condition)
|
||||||
|
{
|
||||||
|
/* some code */
|
||||||
|
if (!condition)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (i = 0; i < somevalue; i++)
|
||||||
|
{
|
||||||
|
if (!helperfunc (..., i, error))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue