mirror of
https://github.com/DrBeef/QuestZDoom.git
synced 2025-03-06 09:21:22 +00:00
188 lines
6.8 KiB
Text
188 lines
6.8 KiB
Text
|
* The LAME API is frozen. Poorly designed as it is, don't change it,
|
||
|
and add to it sparingly.
|
||
|
|
||
|
* Don't take it upon yourself to go through LAME with the sole purpose
|
||
|
of updating everything to match this guide. Especially important:
|
||
|
don't change the spacing, indentation, curly braces, etc,
|
||
|
in routines you did not write.
|
||
|
|
||
|
* If you want to make a change which effects many many functions,
|
||
|
please check with the maintainer first.
|
||
|
|
||
|
* Respect the indentation of the author of the original function.
|
||
|
If the indentation is not consistent, use 4.
|
||
|
|
||
|
* Don't use tabulators (the character with the value '\t') in source code,
|
||
|
especially these with a width of unequal 8. Lame sources are using
|
||
|
different sizes for tabulators.
|
||
|
|
||
|
* Don't set the macro NDEBUG in alpha versons.
|
||
|
NDEBUG should be set for beta versions.
|
||
|
|
||
|
* check important assumptions with an assert()
|
||
|
|
||
|
* use int for all integer quantities.
|
||
|
LAME requires 32 bit ints, so you can assume int is at least 32 bits.
|
||
|
Don't use 'long'. Don't use 'unsigned' unless ABSOLUTELY necessary.
|
||
|
Don't use 'char' just to save bytes. If 64 bits is required, use int64.
|
||
|
|
||
|
Annnotation:
|
||
|
ISO C calls the 64 bit int type not int64 but int64_t.
|
||
|
|
||
|
* Avoid using float or double, and instead use: (defined in machine.h).
|
||
|
|
||
|
FLOAT for variables which require at least 32bits
|
||
|
FLOAT8 for variables which require at least 64bits
|
||
|
|
||
|
On some machines, 64bit will be faster than 32bit. Also, some math
|
||
|
routines require 64bit float, so setting FLOAT=float will result in a
|
||
|
lot of conversions.
|
||
|
|
||
|
Annotation (pfk):
|
||
|
The new ISO C standard passed in autumn 1999 has defined new types for
|
||
|
exactly this reason. There are called float_least32_t and float_least64_t
|
||
|
and have at least the advantage that you not need to explain their
|
||
|
meaning.
|
||
|
|
||
|
Annotation (mt):
|
||
|
we will adopt this convention in Jan 1, 2003.
|
||
|
|
||
|
|
||
|
* The internal representation of PCM samples in type 'sample_t',
|
||
|
currently this is a FLOAT.
|
||
|
|
||
|
* Use SI base units. Lame mixes Hz, kHz, kbps, bps. This is mess.
|
||
|
|
||
|
Example:
|
||
|
float wavelength_green = 555.e-9;
|
||
|
unsigned data_rate = 128000;
|
||
|
float lowpass_freq = 12500.;
|
||
|
|
||
|
Converting between user input and internal representation should be done
|
||
|
near the user interface, not in the most inner loop of an utility
|
||
|
function.
|
||
|
|
||
|
----------------------------------------------------------------------------------
|
||
|
Edited version of the Linux Kernel Style Guide:
|
||
|
----------------------------------------------------------------------------------
|
||
|
|
||
|
Chapter 1: Indentation
|
||
|
|
||
|
Respect the indentation of the author of the original function.
|
||
|
If the indentation is not consistent, don't change it. If
|
||
|
you are so anal-retentive about these things and you can't
|
||
|
bare to even look at code with poor indentation, change it to 4.
|
||
|
|
||
|
|
||
|
Chapter 2: Placing Braces
|
||
|
|
||
|
The other issue that always comes up in C styling is the placement of
|
||
|
braces. Unlike the indent size, there are few technical reasons to
|
||
|
choose one placement strategy over the other, but the preferred way, as
|
||
|
shown to us by the prophets Kernighan and Ritchie, is to put the opening
|
||
|
brace last on the line, and put the closing brace first, thusly:
|
||
|
|
||
|
if (x is true) {
|
||
|
we do y
|
||
|
}
|
||
|
|
||
|
However, there is one special case, namely functions: they have the
|
||
|
opening brace at the beginning of the next line, thus:
|
||
|
|
||
|
int function(int x)
|
||
|
{
|
||
|
body of function
|
||
|
}
|
||
|
|
||
|
Heretic people all over the world have claimed that this inconsistency
|
||
|
is ... well ... inconsistent, but all right-thinking people know that
|
||
|
(a) K&R are _right_ and (b) K&R are right. Besides, functions are
|
||
|
special anyway (you can't nest them in C).
|
||
|
|
||
|
Note that the closing brace is empty on a line of its own, _except_ in
|
||
|
the cases where it is followed by a continuation of the same statement,
|
||
|
ie a "while" in a do-statement or an "else" in an if-statement, like
|
||
|
this:
|
||
|
|
||
|
do {
|
||
|
body of do-loop
|
||
|
} while (condition);
|
||
|
|
||
|
and
|
||
|
|
||
|
if (x == y) {
|
||
|
..
|
||
|
} else if (x > y) {
|
||
|
...
|
||
|
} else {
|
||
|
....
|
||
|
}
|
||
|
|
||
|
Rationale: K&R.
|
||
|
|
||
|
Also, note that this brace-placement also minimizes the number of empty
|
||
|
(or almost empty) lines, without any loss of readability. Thus, as the
|
||
|
supply of new-lines on your screen is not a renewable resource (think
|
||
|
25-line terminal screens here), you have more empty lines to put
|
||
|
comments on.
|
||
|
|
||
|
|
||
|
Chapter 3: Naming
|
||
|
|
||
|
C is a Spartan language, and so should your naming be. Unlike Modula-2
|
||
|
and Pascal programmers, C programmers do not use cute names like
|
||
|
ThisVariableIsATemporaryCounter. A C programmer would call that
|
||
|
variable "tmp", which is much easier to write, and not the least more
|
||
|
difficult to understand.
|
||
|
|
||
|
HOWEVER, while mixed-case names are frowned upon, descriptive names for
|
||
|
global variables are a must. To call a global function "foo" is a
|
||
|
shooting offense.
|
||
|
|
||
|
GLOBAL variables (to be used only if you _really_ need them) need to
|
||
|
have descriptive names, as do global functions. If you have a function
|
||
|
that counts the number of active users, you should call that
|
||
|
"count_active_users()" or similar, you should _not_ call it "cntusr()".
|
||
|
|
||
|
Encoding the type of a function into the name (so-called Hungarian
|
||
|
notation) is brain damaged - the compiler knows the types anyway and can
|
||
|
check those, and it only confuses the programmer. No wonder MicroSoft
|
||
|
makes buggy programs.
|
||
|
|
||
|
LOCAL variable names should be short, and to the point. If you have
|
||
|
some random integer loop counter, it should probably be called "i".
|
||
|
Calling it "loop_counter" is non-productive, if there is no chance of it
|
||
|
being mis-understood. Similarly, "tmp" can be just about any type of
|
||
|
variable that is used to hold a temporary value.
|
||
|
|
||
|
|
||
|
|
||
|
Chapter 4: Functions
|
||
|
|
||
|
Document functions.
|
||
|
|
||
|
Keep functions as modular as possible. But don't adhere to artificial
|
||
|
line number limitations. For example, lame_encode_frame() encodes a
|
||
|
single MP3 frame and is a long sequence of function calls. It makes
|
||
|
no sense to break this into two or more routines.
|
||
|
|
||
|
|
||
|
|
||
|
Chapter 5: Commenting
|
||
|
|
||
|
Comments are good, but there is also a danger of over-commenting. NEVER
|
||
|
try to explain HOW your code works in a comment: it's much better to
|
||
|
write the code so that the _working_ is obvious, and it's a waste of
|
||
|
time to explain badly written code.
|
||
|
|
||
|
Generally, you want your comments to tell WHAT your code does, not HOW.
|
||
|
Also, try to avoid putting comments inside a function body: if the
|
||
|
function is so complex that you need to separately comment parts of it,
|
||
|
you should probably go back to chapter 4 for a while. You can make
|
||
|
small comments to note or warn about something particularly clever (or
|
||
|
ugly), but try to avoid excess. Instead, put the comments at the head
|
||
|
of the function, telling people what it does, and possibly WHY it does
|
||
|
it.
|
||
|
|
||
|
|