| | 45 | |
| | 46 | |
| | 47 | = Source Code Style and Indentation (to be completed) = |
| | 48 | |
| | 49 | In so far as possible, people writing code are encouraged to follow some rules regarding indentation and coding style. These rules are described below: |
| | 50 | |
| | 51 | * The coding style used is a variant of the BSD KNF style. |
| | 52 | * There must be one instruction per line : a line can be terminated by: |
| | 53 | * a semi-colon {{{;}}} |
| | 54 | * an opening bracket {{{ { }}} |
| | 55 | * a closing bracket {{{ } }}} |
| | 56 | * a colon after a {{{case}}} statement |
| | 57 | * A line following an opening bracket must be right-shifted |
| | 58 | * The opening bracket must always be the last character of its line |
| | 59 | * A left shift is done on a line containing a closing bracket |
| | 60 | * The opening bracket can be either on the same line as the instruction before or be the single instruction of its line |
| | 61 | * A line following a {{{case}}} statement must be right-shifted if no new block is created |
| | 62 | * A space is inserted at the following places: |
| | 63 | * after the statements {{{if}}}, {{{while}}}, {{{for}}} and {{{switch}}} |
| | 64 | * before and after a {{{=}}} |
| | 65 | * before and after all binary operators: {{{==}}}, {{{!=}}}, {{{&&}}}, {{{||}}}, {{{&}}} (bitwise and), {{{|}}}, {{{<<}}}, {{{>>}}}, {{{%}}}, {{{/}}}, {{{*}}} (multiplication), {{{+}}}, {{{-}}}, {{{<}}}, {{{>}}} |
| | 66 | * before and after a {{{*}}} in a pointer declaration |
| | 67 | * after a comma {{{,}}} |
| | 68 | * before the question mark {{{?}}} and the semi-colon {{{:}}} in a unary if construct {{{(x ? y : z)}}} |
| | 69 | * after the closing parenthesis in a cast statement |
| | 70 | * after the {{{//}}} sequence (commentary) |
| | 71 | * A space is '''not''' inserted at the following places : |
| | 72 | * before a semi-colon {{{;}}} |
| | 73 | * before and after the operators {{{->}}} and {{{.}}} (field selection) |
| | 74 | * before the opening bracket of a function declaration |
| | 75 | * before the opening bracket of a function call |
| | 76 | * before a comma {{{,}}} |
| | 77 | * before the operators {{{++}}} and {{{--}}} |
| | 78 | * after a {{{*}}} in a pointer dereferencement |
| | 79 | * before a colon {{{:}}} of a case statement |
| | 80 | * before an indexation operator {{{[]}}} |
| | 81 | * It is tolerated to add spaces to align some elements such as: affectations, indexation, conditions on several lines, parameters in function calls, variables declarations. |
| | 82 | * C-99 types must be used when possible: {{{int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t}}} |
| | 83 | * The indentation must use spaces and not tabs. The number of spaces used is 4. |
| | 84 | * Blocks (i.e. brackets) must be used even for a single instruction. |
| | 85 | * The keywords {{{public}}} and {{{private}}} can be either indented regularly or the same way as their parents (the class in which they are). |
| | 86 | |
| | 87 | Here is a code exemple : |
| | 88 | {{{ |
| | 89 | #!cpp |
| | 90 | |
| | 91 | template <int32_t size> class MyClass : public Parent { |
| | 92 | |
| | 93 | public: |
| | 94 | sc_signal<uint32_t> my_signal; |
| | 95 | }; |
| | 96 | |
| | 97 | typedef struct _mystruct { |
| | 98 | uint32_t val; |
| | 99 | } mystruct; |
| | 100 | |
| | 101 | |
| | 102 | int32_t f(int32_t x, mystruct * y, uint32_t c) { |
| | 103 | int16_t a, b = 0; |
| | 104 | int32_t * ptr; |
| | 105 | mystruct st; |
| | 106 | |
| | 107 | MyClass<1> t1; |
| | 108 | MyClass<10> t10; |
| | 109 | |
| | 110 | while (st.val == b && *ptr != 0) { |
| | 111 | if ((a & 0x10) != 0 || y->val) { |
| | 112 | *y--; |
| | 113 | #ifdef SOME_FLAG |
| | 114 | my_counter++; |
| | 115 | #endif |
| | 116 | return 1; |
| | 117 | } |
| | 118 | |
| | 119 | switch (c) { |
| | 120 | case 0: |
| | 121 | printf("c is %d\n", c); |
| | 122 | break; |
| | 123 | case 1: |
| | 124 | { |
| | 125 | int local = 2; |
| | 126 | c = local + 1; |
| | 127 | } |
| | 128 | default: |
| | 129 | break; |
| | 130 | } |
| | 131 | } |
| | 132 | // f is a recursive function |
| | 133 | f(x, y, c + 1); |
| | 134 | int32_t exp = (a + (b * st.val) % d) >> 2; |
| | 135 | uint32_t b = (a * (b + c) == 1) ? c : c + 1; |
| | 136 | uint32_t var = *(uint32_t *) 0x10000000; |
| | 137 | |
| | 138 | return exp; |
| | 139 | } |
| | 140 | }}} |
| | 141 | |
| | 142 | * Every file must contain at its end an epilogue specifying some indentation parameters for vim and emacs. This epilogue must be: |
| | 143 | {{{ |
| | 144 | # Local Variables: |
| | 145 | # tab-width: 4; |
| | 146 | # c-basic-offset: 4; |
| | 147 | # c-file-offsets:((innamespace . 0)(inline-open . 0)); |
| | 148 | # indent-tabs-mode: nil; |
| | 149 | # End: |
| | 150 | # |
| | 151 | # vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 |
| | 152 | }}} |
| | 153 | |
| | 154 | ''Please note: some files do not respect yet all these conventions.'' |