Coding Conventions for AppleWin
===============================

History:
v2 - 16-Feb-2006 (TC)
. Updated after discussion with M.Pohoreski
v1 - 04-Feb-2006 (TC)
. First draft

-------------------------------------------------------------------------------

Introduction:
-------------

This doc defines a very simple set of coding guidelines to be used for AppleWin.
This ensures consistency & readability throughout the project, when worked on
by multiple developers.

-------------------------------------------------------------------------------

1) Project files:

1.1: Each module to have corresponding header
EG. Debug.cpp has a corresponding Debug.h
This is for shared vars, enums, structs, classes, etc.

1.2: AppleWin.h to only be used as per 1.1

1.3: Common.h to be used for any common definitions
EG. const/enum/struct
Obviously not for global funcs or vars.

1.4: PCH (StdAfx.h)
Could ditch this.
Does this gain anything for such a simple project?

-------------------------------------------------------------------------------

2) Coding Style:

2.1: Naming
The following simplied Hungarian style must be used:

Prefixes:
a	: array
b	: bool
e	: enum variable
g_	: global
h	: handle
i	: iterator (eg. UINT, STL-iterator)
m	: STL map
m_	: member
n	: int
p	: pointer
r	: reference
s	: string
sg_p	: singleton (could also use 'sgp' - to be reviewed)
u	: unsigned int
v	: STL vector

Tags:
_e	: named enum definitions
_t	: struct/typedef

Legacy:
dw	: DWORD [legacy: existing 'dw' to be replaced with 'u' prefix]
sz	: string (null-terminated) [legacy: 

EG:
	enum MODE_e {MODE1, MODE2, MODE2};
	MODE_e eMode;
	
	struct PAIR_t
	{
		UINT uA;
		UINT uB;
	};

Simple loop counters (i,j,k) don't need to adhere to this style.

Don't go Hungarian-mad (you might argue that we already have :)
. an array of any type can just be prefixed with 'a'. Eg. Array of bools:
	bool aFlags[NUM_FLAGS];
. a pointer to any type can just be prefixed with 'p'. Eg. Pointer to array of bools:
	bool* pFlags;

Naming for parameters that are being modified (eg. OUT):
It is recommended (but not mandatory) to use a suffix of OUT or '_', eg:
	bool Find(int* pFoundOUT);
	bool Find(int* pFound_);


2.2: Matching braces
These should be have same indentation, unless the braces fit neatly on one line.
EG:
	for (int i=0; i<10; i++)
	{
		// Some code
	}

2.3: Scope of module vars/funcs
If module vars/funcs aren't wrapped in a class, then declare as static if not global.

2.4: const/enum favoured over #define
Try to use const/enum instead of #define

2.4: Use of bool over BOOL
Always use bool instead of BOOL

2.5: File header
GPL header, followed by description of module & author.

2.6: Indentation
Tabs favoured over spaces.

2.7: Expression to be well spaced and parenthesised
It is recommended (but not mandatory):
. to have/use explicit parenthesis
. to have spaces between operators

Eg:
. Prefer: z = ((a + b) + 1) instead of: z=((a+b)+1)
