==================
Coding conventions
==================


General conventions
===================

All executable files should have a name with lowercase.

Tabs are forbidden everywhere.

Try to set the maximum line length to 80 characters.  Long lines can be
automatically reformatted in vim by pressing :kbd:`gqj`.

Use blank lines between blocks to improve readability.

For existing files, stay faithful to the existing indentation.



Shell scripts
=============

Executables should have no extension.  To know if the file is binary, or in
what shell scripting language it was written, the :command:`file` command can
be used. In addition, all the shell scripts should be under
:file:`${QP_ROOT}/scripts/`.

The exit code of the script should be 0 upon success only.

Bash and Python3 are the only shell scripting language permitted for
executables.


Bash
----

* Bash scripts should start with ``#!/bin/bash``

* All error messages should go to standard error, and should be prefixed with
  the name of the command. For example, in Bash use

  .. code:: bash

      function echo_err() {
         2>& echo $(basename $0)": error"
      }

* The command-line options should be handled with ``getopt``.

* The script should check that the command-line arguments are consistent.

* Long options should be preferred to short options.

* Always quote strings containing variables, command substitutions, spaces or
  shell meta characters, unless careful unquoted expansion is required.

* Use ``"$@"`` unless you have a specific reason to use ``$*``.

* Use ``$(command)`` instead of backticks, because they can be easily nested.

* ``[[ ... ]]`` is preferred over ``[``, ``test`` and ``/usr/bin/[``.

* Declare function-specific variables with local. Declaration and assignment
  should be on different lines.

* Pipelines should be split one per line if they don't all fit on one line.

* Put ``; do`` and ``; then`` on the same line as the ``while``, ``for`` or ``if``.


Python
------

Only Python3 is supported.

Python scripts should start with ``#!/usr/bin/env python3`` to mention
explicitly that Python3 has to be used, possibly from a conda installation.

:command:`pylint` should be used to increase the quality of the source code.



IRPF90
======

The code can be automatically indented with :command:`irp_indent`.

Lines sould not be longer than 80 characters.

Mathematical formulas in the `BEGIN_DOC...END_DOC` sections sould be written in
LaTeX format, between `$` symbols.

All the providers, subroutines and functions should have a
`BEGIN_DOC...END_DOC` block.

Providers should never be present in the same file as a main program.

String must not use double quotes (`"`) but single quotes (`'`).

After a `read` statement there should be no comma.

Only standard Fortran is allowed : Intel or GNU extensions are forbidden.

The name of a program should be the same as the name of the file. For example,
for the :ref:`fci` program, we have

.. code-block:: fortran

   program fci

and the file is named :file:`fci.irp.f`.