# Kodkonvention

I detta dokument beskrivs den kodkonvention som har följts/ska följas
för kod som läggs till kodbasen. Konventionen är till stor del baserad
på kodkonventionen som följs i Linux-kärnan. Därför kommer läsaren
hänvisas till dokumentet med den officiella kernelkonventionen.


# Linuxkärnans kodkonvention

Se [Linux kernel coding style](https://www.kernel.org/doc/html/v4.10/process/coding-style.html).
Nedan följer en uppräkning av vilka punkter vi ska följa, samt
eventuella avvikelser från dessa. Om en punkt från dokumentet ovan ej
nämns nedan så gäller punkten ej.

## 1. Indentation

Indenteringskonventionen ska följas helt och hållet. Det är möjligt att
konfigurera utvecklingsmiljön (e.g. Codelite) att automatiskt indentera
korrekt.

## 2. Breaking long lines and strings

Denna punkt är också mycket viktig, samt något din utvecklingsmiljö kan 
hantera eller varna för.

## 3. Placing Braces and Spaces

Här ska alla punkter följas (även de under 3.1), med ett undantag:
Ensamma satser i t.ex. if-satser *ska* ha måsvingar.

## 4. Naming

När det kommer till namngivning är det viktigt att ha i åtanke att koden
tillsammans med kommentarerna ska tydligt förklara syftet med koden. Därför är
det viktigt att konventionen som beskrivs under `4. Naming` tolkas med detta i
hänsyn. Det innebär till exempel att om koden blir enklare att läsa med
variabelnamnet `counter` istället för `c` eller `tmp`, bör `counter` användas
istället.

## 5. Typedefs

Här avviker kursen från Linuxkärnans kodkonvention. För att främja
datatypernas gränsytor och göra dem så lik de teoretiska gränsytorna
som möjligt så används `typedefs` för t.ex. `struct list_pos`. I
Linuxkärnan hade motsvarande implementation krävt att det skrevs
`struct list_pos pos` överallt, medan datatyperna givna på kursen
förenklar detta till `list_pos pos`. Det viktiga här är att lära sig
gränsytorna.

## 6. Functions

Denna konvention ska följas så som den presenteras. Långa funktioner kommer
under denna kurs alltid vara onödigt, dela upp i mindre funktioner! Det ökar
läsbarheten, förenklar debugging, samt gör det enklare att diskutera koden.

## 7. Centralized exiting of functions

Det finns anledningar till att `goto` används i Linuxkärnan (e.g.
bakåtkompabilitet), men under denna kurs ska ni ej använda detta.

## 8. Commenting

Följ det första exemplet för kommentarer. Det finns exempel i de givna
datatyperna på hur funktioner kan dokumenteras.

## 14. Allocating memory

I Linuxkärnan finns inte `malloc` och `calloc`, motsvarande funktioner heter
`kmalloc` samt `kcalloc`. Vi kommer under denna kurs att översätta Linuxkärnans
konvention till följande:

```c
p = malloc(sizeof(*p));
```

samt 

```c
p = calloc(n, sizeof(*p));
```

Det är fullt möjligt att i det senare fallet vända på parametrarna (i.e.
`calloc(sizeof(*p), n)`) då storleken på minnet som allokeras beräknas som
första argumentet gånger det andra argumentet (i.e., 
`n*sizeof(*p) == sizeof(*p)*n`).

## 16. Function return values and names

Här är det första och sista stycket vad som är viktigt att följa. Om en funktion
returnerar huruvida funktionen lyckades eller ej så signifierar `0` ett lyckat
anrop, och negativa värden signifierar fel (e.g. `-1` om en fil inte finns, `-2`
om filen inte gick att läsa). Om en funktion returnerar en pekare `p`, så 
indikerar `p == NULL` att funktionen inte lyckades.

# Avslutning

Det finns visst rum för tolkning under några av dessa punkter.
