Coding Style - neutrinolabs/xrdp GitHub Wiki

xrdp Coding Style

The coding style used by xrdp is described below.

The xrdp project uses astyle 3.1 (artistic style) to format the code. Astyle requires a configuration file that describes how you want your code formatted. This file is present in the xrdp root directory and is named astyle_config.as.

Here is how we run the astyle command:

astyle --options=/path/to/file/astyle_config.as "*.c"

Alternatively, set the environment variable ARTISTIC_STYLE_PROJECT_OPTIONS to astyle_config.as. Then astyle can be invoked anywhere in the xrdp source tree and it will find the correct file.

This coding style is a work in progress and is still evolving.

Indentation

  • 4 spaces per indent
  • No tabs for any indents

if (fd < 0)
{
    return -1;
}

Line wrapping

  • Keep lines shorter than 80 chars
  • Align wrapped argument to the first argument

log_message("connection aborted: error %d",
            ret);

Variable names

  • Use lowercase with underscores as needed
  • Don't use camelCase

int fd;
int bytes_in_stream;

Variable declaration

  • Each variable is declared on a separate line

int i;
int j;

Whitespace

  • Use blank lines to group statements
  • Use at most one empty line between statements
  • For pointers and references, use a single space before * or & but not after
  • Use one space after a cast
  • No space before square brackets

char *cptr;
int *iptr;
cptr = (char *) malloc(1024);

write(fd, &buf[12], 16);

Function declarations

  • Use newline before function name

static int
value_ok(int val)
{
    return (val >= 0);
}

Braces

  • Opening brace is always on a separate line
  • Align braces with the line preceding the opening brace

struct stream
{
    int flags;
    char *data;
};

void
process_data(struct stream *s)
{
    if (stream == NULL)
    {
        return;
    }
}

if statements

  • Always use braces
  • Put both braces on separate lines

if (val <= 0xff)
{
    out_uint8(s, val);
}
else if (val <= 0xffff)
{
    out_uint16_le(s, val);
}
else
{
    out_uint32_le(s, val);
}

for statements

  • Always use braces
  • Put both braces on separate lines

for (i = 0; i < 10; i++)
{
    printf("i = %d\n", i);
}

while and do while statements

  • Always use braces
  • while after the closing brace is on the same line

while (cptr)
{
    cptr—;
}

do
{
    cptr--;
} while (cptr);

switch statements

  • Indent case once
  • Indent statements under case one more time
  • Put both braces on separate lines

switch (cmd)
{
    case READ:
        read(fd, buf, 1024);
        break;

    default:
        printf("bad cmd\n");
}

Pointers to functions

When invoking a function via a variable containing a pointer to the function, it is preferred to use a pointer-to-function type rather than a function designator as defined in the C standard, i.e:-

static int
sum(int a, int b)
{
    return a + b;
}
. . .
{
    int (*my_func)(int, int); // Declare pointer-to-function variable
    int total;

    my_func = sum;

    total = my_func(1, 2); // Invocation via function pointer
    total = (*my_func)(1, 2); // Invocation via function designator
}