aboutsummaryrefslogtreecommitdiff
path: root/lib/liblame/STYLEGUIDE
diff options
context:
space:
mode:
Diffstat (limited to 'lib/liblame/STYLEGUIDE')
-rw-r--r--lib/liblame/STYLEGUIDE187
1 files changed, 187 insertions, 0 deletions
diff --git a/lib/liblame/STYLEGUIDE b/lib/liblame/STYLEGUIDE
new file mode 100644
index 0000000000..e955dc5553
--- /dev/null
+++ b/lib/liblame/STYLEGUIDE
@@ -0,0 +1,187 @@
+* 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.
+
+