/**
 * Description of the coding style for the source files.
 *
 * @file        codingStyle
 * @ingroup     codingStyle
 * @author      name
 * @copyright   2020 name
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef XYZ_H
#define XYZ_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup codingStyle Description of coding style
 * @ingroup parentGroup
 * @{
 *
 * Contents of this file should be the base for .h source file, except function
 * body at the end.
 *
 * ###Style
 *  - Style is based on https://github.com/MaJerle/c-code-style
 *  - Indent size is 4 spaces, no tabs.
 *  - Line width is 80 characters.
 *  - Some (old) code may not be formatted according to the rules. Try to avoid
 *    unnecessary changes based on individual taste.
 *
 * ###Doxygen
 * Documentation is generated by doxygen.
 * Doxygen comment starts with /**. /**< is used after member.
 * Documentation is usually in header.
 * Doxygen settings:
 *  - JAVADOC_AUTOBRIEF = YES.
 *  - See doxyfile for other settings.
 *
 * Doxygen specifics: If description of the structure member is one sentence
 * only, don't use period after the sentence.
 */

/**
 * Brief description of the object ends at this dot. Details follow
 * here.
 */
typedef struct {
    int8_t member1;   /**< Short description of the member 1 */
    uint16_t member2; /**< Note the '/**<' sequence after the member 2 */
    /** Long description of the variable stringMember. More description. */
    char_t stringMember[5];
} object1_t;

/**
 * Function example 1.
 *
 * This is global function. Local functions (and variables) used inside one file
 * are declared as static and not documented by Doxygen.
 *
 * @param thisObj Pointer to object. Function operates on this object (not on
 * global variables).
 * @param argument_2 Description of the argument.
 * @param argument_2 Description of the argument.
 * @param argument_4 Description of the argument.
 *
 * @return Some value.
 */
int32_t
foo1(object1_t* thisObj, int32_t argument_2, uint16_t argument_3, float32_t argument_4, bool_t argument_5,
     int32_t argument_6) {
    /* Comment */

    /* Multiline
     * comment.
     */

    /* All if and else statement must have use { } around their bodies
     * (MISRA C 2004 rule 14.9)
     */
    if (xy == yz) { /* Comment. '//' comments are not allowed */
        a = b;
    } else if (xy < yz) {
        a = c;
    } else {
        /* To stay compliant with MISRA C 2004 14.10
         * all else if statements need a final else even if empty
         */
    }

    /* Assignment operators shall not be used in expressions which return
     * boolean values (MISRA C 2004 rule 13.1)
     * This is true for: 'if' and 'while' statements.
     * For instance:
     */
    if (xy = yz) {}
    while (xy = yz) {}

    switch (zx) {
        case 1:
            a = b;
            break default :
                /* To stay compliant with MISRA C 2004 15.3
                 * the default case must be present */
                break;
    }
}

/* MISRA C 2004 Rule E14.4.3
 * There should be no more than one break or goto statement used to terminate
 * any iteration statement.
 */

/* MISRA C 2004 Rule 14.5
 * The continue statement shall not be used.
 */

/* More about MISRA C
 * https://www.ibm.com/docs/en/devops-test-embedded/9.0.0?topic=review-code-misra-2004-rules
 */

/** @} */

#ifdef __cplusplus
}
#endif /*__cplusplus */

#endif /* XYZ_H */
