66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Code conventions used internally by fftw3 (not in API):
 | |
| 
 | |
| LEARN FROM THE MASTERS: read Ken Thompson's C compiler in Plan 9.
 | |
|    Avoid learning from C++/Java programs.
 | |
| 
 | |
| INDENTATION: K&R, 5 spaces/tab.  In case of doubt, indent -kr -i5.
 | |
| 
 | |
| NAMES: keep them short.  Shorter than you think.  The Bible was written
 | |
|    without vowels.  Don't outsmart the Bible.
 | |
| 
 | |
|    Common names:
 | |
| 
 | |
|    R       : real type, aka fftw_real
 | |
|    E       : real type for local variables (possibly extra precision)
 | |
|    C       : complex type
 | |
|    sz      : size
 | |
|    vecsz   : vector size
 | |
|    is, os  : input/output stride
 | |
|    ri, ii  : real/imag input (complex data)
 | |
|    ro, io  : real/imag output (complex data)
 | |
|    I, O    : real input/output (real data)
 | |
|    A       : assert
 | |
|    CK      : check
 | |
|    S       : solver, defined internally to each solver file
 | |
|    P       : plan, defined internally to each solver file
 | |
|    k       : codelet
 | |
|    X(...)  : used for mangling of external names (see below)
 | |
|    K(...)  : floating-point constant, in E precision
 | |
| 
 | |
|    If a name is used often and must have the form fftw_foo to avoid
 | |
|    namespace pollution, #define FOO fftw_foo and use the short name.
 | |
| 
 | |
|    Leave that hungarian crap to MS.  foo_t counts as hungarian: use
 | |
|    foo instead.  foo is lowercase so that it does not look like a DOS
 | |
|    program. Exception: typedef struct foo_s {...} foo;  instead of
 | |
|    typedef struct foo {...} foo;  for C++ compatibility.
 | |
| 
 | |
| NAME MANGLING: use X(foo) for external names instead of fftw_foo.
 | |
|     X(foo) expands to fftwf_foo or fftw_foo, depending on the
 | |
|     precision.  (Unfortunately, this is a ugly form of hungarian
 | |
|     notation.  Grrr...)  Names that are not exported do not need to be
 | |
|     mangled.
 | |
| 
 | |
| REPEATED CODE: favor a table.  E.g., do not write
 | |
| 
 | |
|     foo("xxx", 1);
 | |
|     foo("yyy", 2);
 | |
|     foo("zzz", -1);
 | |
| 
 | |
|     Instead write
 | |
| 
 | |
|       struct { const char *nam, int arg } footab[] = {
 | |
| 	{ "xxx", 1 },
 | |
| 	{ "yyy", 2 },
 | |
| 	{ "zzz", -1 }
 | |
|       };
 | |
| 
 | |
|     and loop over footab.  Rationale: it saves code space.
 | |
|     Similarly, replace a switch statement with a table whenever
 | |
|     possible.
 | |
| 
 | |
| C++: The code should compile as a C++ program. Run the code through
 | |
|     gcc -xc++ .  The extra C++ restrictions are unnecessary, of
 | |
|     course, but this will save us from a flood of complaints when
 | |
|     we release the code.
 | 
