| 1 | == [Proposal] Coding Style == |
| 2 | |
| 3 | In general, the [http://kerneltrap.org/files/Jeremy/CodingStyle.txt coding standards] used in the Linux kernel are versatile, comprehensive and quite good looking. They are boiling down to the following guide lines: |
| 4 | |
| 5 | Indentation:: Hardtabs |
| 6 | Spaces:: Spaces around keywords but not in inner parenthesis. |
| 7 | Brace placement:: '{' at end of line except for function definition and '}' on its own line except in do-while-loops. |
| 8 | Naming:: Descriptive for global functions and usually lower case with underscores. |
| 9 | Macros:: Upper case for constants, lower case with underscores for macros resembling functions. |
| 10 | Structures:: No typedefs, although this is debatable. For shared data structures reference counting should be implemented. |
| 11 | |
| 12 | I would add the following: |
| 13 | |
| 14 | Position of C-pointer star:: At variable name not type. |
| 15 | const:: Wherever possible. |
| 16 | White space:: Avoid at all costs. |
| 17 | C99:: Enable it and declare variables only when needed. |
| 18 | |
| 19 | There are still some open questions: |
| 20 | |
| 21 | * Number of white lines to separate functions? |
| 22 | * Comments: C vs. C++ style, usage of '*'? |
| 23 | * Alignment of multiple assignments? |
| 24 | * Breaking of long lines, especially argument lists? |
| 25 | * #define indentation? Commenting each #endif with the corresponding #define name makes the code hard to read in my opinion. |
| 26 | * Documentation tools? ([http://www.stack.nl/~dimitri/doxygen/ Doxygen], [http://sphinx.pocoo.org/ Sphinx], [http://www.naturaldocs.org/ Natural Docs]) |
| 27 | * Name prefixes? (e.g. 'g_' for global) |
| 28 | |
| 29 | In essence, a bit of code would look like that: |
| 30 | |
| 31 | {{{ |
| 32 | #!c |
| 33 | #define PI 3.14159265 |
| 34 | #define min(a,b) ((a) < (b) ? (a) : (b)) |
| 35 | |
| 36 | struct string { |
| 37 | char *content; |
| 38 | size_t length; |
| 39 | int refcount; |
| 40 | }; |
| 41 | |
| 42 | struct string* clone_string(const char *s) |
| 43 | { |
| 44 | if (s == NULL) |
| 45 | return NULL; |
| 46 | |
| 47 | struct string *clone = (struct string *) malloc(sizeof(struct string)); |
| 48 | const int len = strlen(s); |
| 49 | clone->content = (char *) malloc(len); |
| 50 | clone->length = len; |
| 51 | clone->refcount = 1; |
| 52 | strncpy(clone->content, s, len); |
| 53 | |
| 54 | return clone; |
| 55 | } |
| 56 | }}} |