*CVSTrac Coding Guidelines* These are more like observations from a latecomer, but better than nothing. CvstracArchitecture is a big picture overview. This talks about the nitty-gritty coding details. *: CVSTrac source uses two spaces for indentation, no tabs *: braces are a modified K&R. Generally, there should be no whitespace between the trailing paren and the leading brace. i.e. void function(args){ if( condition ){ } } *: In the case of _else_ and _else if_ keywords, also eliminate extra whitespace: if( condition ){ }else if( condition2 ){ }else{ } *: whithin parens, rules seem to be a bit more variable. For example, _if_ and _while_ statements use internal whitespace: if( condition ){ while( v[i] ) i++; } but _for_ loops are a bit different: for(i=0; i<40; i++){ } *: CVSTrac has a magical preprocessor which extracts HTML strings prefixed inline by '@' characters and basically turns them into _cgi_printf()_ calls. CvstracArchitecture discusses this a bit more. *: variable naming is partially Hungarian style. *:: 'z' prefixes NUL-terminated strings *:: 'az' prefixes an array of 'z' strings. 'az' strings also appear to be NULL terminated. *:: 'p' prefixes a pointer to something *:: 'n' occasionally prefixes integers, but usually not. *: commonly used variable names *:: tn is a ticket number *:: cn is a change/checkin number *:: rn is a report number *: CVSTrac doesn't worry about memory management! It's assumed that a CVSTrac instance will live only long enough to serve out a request and then resources will be reclaimed (AKA garbage collection by exit()). As such, you frequently see constructs like: zPath = mprintf("%s/%s", zDir, zFile); without a corresponding _free()_. The only time memory is really a concern happens when a large amount of activity happens in a loop. In such instances, _free()_ or _db_query_free()_ will be used. *: CVSTrac cares about security. This means dynamic memory allocation where possible, really large static buffers with limits on the size of copies, heavy use of the %q format (as found in _mprintf()_ and _db_query()_), and a lot of heavily used helper functions to manage all this.