This document describes some aspects of the coding style of isl,
which is similar to that of the linux kernel and git.

The general rule is to use the same style as that of the surrounding code.

More specific rules:
	- every line should have at most 80 columns
	- use tabs for indentation, where a tab counts for 8 characters
	- use single spaces around binary operators such as '+', '-', '=', '!='
	- no space after unary operators such as '!'
	- use a single space after a comma and a semicolon
	  (except at the end of a line)
	- no space between function name and arguments
	- use a single space after control keywords such as if, for and while
	- use a single space between the type of a cast and the value
	  that is being cast
	- no whitespace at the end of a line
	- opening brace of a function is placed on a new line
	- opening brace of other blocks stays on the same line
	- the body of a control statement is placed on the next line(s)
	- an else appears on the same line as the closing brace of
	  the then branch, if there is such a closing brace
	- if either the then or the else branch of an if has braces,
	  then they both have braces
	- no parentheses around argument of return keyword
	- use only C style comments (/* ... */)
	- no comments inside function bodies;
	  if some part of a function deserves additional comments, then
	  extract it out into a separate function first
	- no #ifs inside function bodies
	- variables are declared at the start of a block, before any
	  other statements

There are some exceptions to the general rule of using
the same style as the surrounding code, most notably
when the surrounding code is very old.
In particular, an "isl_space" used to be called "isl_dim" and
some variables of this type are still called "dim" or some variant thereof.
New variables of this type should be called "space" or a more specific name.
Some old functions do not have memory management annotations yet.
All new functions should have memory management annotations,
whenever appropriate
