CodingStyle
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:12k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. Coding Style for Kannel
  2. Code formatting
  3. Don't make lines that are longer than 78 characters.
  4.      Follow the coding style defined by the astyle program:
  5.      astyle --style=linux --pad=oper -m0 -s4
  6. Tabs are 8 characters. Indents are 4.
  7.      Example:
  8. /*
  9.  * This function doesn't do anything sensible. It just uses uses various
  10.  * C constructs to show their layout.
  11.  */
  12. int foo(int bar)
  13. {
  14.     static int tab[2][12] = {
  15.         { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
  16.         { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
  17.     };
  18.     struct yow {
  19.         int plim;
  20.     } barbar;
  21.     int i;
  22.     assert(bar != 0);
  23.     if (bar < 0) {
  24.         for (i = 0; i > bar; --i) {
  25.             while (global_variable < 0) {
  26.                 global_variable += i;
  27.                 printf("%dn", i);
  28.             }
  29.         }
  30.     } else {
  31.         do {
  32.             --bar;
  33.             switch (bar % 3) {
  34.             case 0:
  35.                 printf("0n");
  36.                 break;
  37.             case 1:
  38.                 printf("1n");
  39.                 /*FALLTHROUGH*/
  40.             case 2:
  41.                 printf("2n");
  42.                 break;
  43.             default:
  44.                 assert(0);        /* eeek! */
  45.                 abort();          /* die, stupid program, die */
  46.             }
  47.         } while (bar < 0
  48.                  || global_variable == 42);
  49.     }
  50.     return bar;
  51. }
  52. It is OK to deviate from this style, if it makes the code clearer.
  53. Commenting
  54. Each source code file shall begin with a comment of the following
  55. format:
  56. /*
  57.  * filename - one-line summary
  58.  *
  59.  * A summary of the purpose of the file and a summary
  60.  * of the functions it exports. If the file is the main
  61.  * program, a short usage summary or a reference to the
  62.  * manual should be included.
  63.  */
  64. Each function should
  65. be preceded by a comment like the following:
  66. /*
  67.  * One-sentence summary of what the function does. More 
  68.  * detailed description of what the function does, including
  69.  * return value, purpose of each function, and a summary of
  70.  * who takes care of allocating and freeing memory of the
  71.  * arguments and return values.
  72.  */
  73. Similar comments for global variables, constants, and data types.
  74. Error handling
  75. Typically, functions should have a return type of int and return
  76. -1 for errors, 0 for OK (or 0 for no input, positive for indicating
  77. number of input items read, or similar values). When returning a
  78. pointer, errors should be indicated with NULL.
  79. When a problem is noticed, the lowest level that notices it
  80. should log it using one of the log functions in log.h,
  81. and then return an indication of failure (unless it can handle
  82. the problem itself) to its caller. If the problem is associated
  83. with a system error, i.e., the global variable `errno' details
  84. the problem, it is the lowest level that should pass `errno'
  85. to the log message function. The callers should just report
  86. which operation failed, but not report a system error (i.e.,
  87. they should pass `0' to the log message functions). This way,
  88. an error causes several lines of output to the logs, and it
  89. essentially produces a stack dump. This helps diagnose the
  90. problem, since it becomes more clear which parts of the system
  91. were involved in the operation that failed.
  92. If you want to incorporate the name of the function in the
  93. output, use __func__, not __FUNCTION__. The former is part of
  94. the language starting with the 1999 version, and config.h takes
  95. care of defining it somehow for older compilers.
  96. Memory allocation
  97. Never use malloc, calloc, realloc, or free. Use gw_malloc,
  98. gw_realloc, and gw_free instead.
  99. Do not allocate large arrays on the stack, because there
  100. are systems where the stack space per thread is quite limited.
  101. If you call a function and give it a pointer, and the function
  102. stores it somewhere for later use, and the caller still uses the
  103. pointed area for something, the called function should make sure
  104. it makes a copy of whatever the pointer points at.  This makes
  105. it easier for the caller to know when it can free the area.
  106. Log messages
  107. The logging functions in log.h shall be used, not printf.
  108. Note that panic must never be used after the gateway has been
  109. started, except when an error really, really, REALLY cannot
  110. be handled and recovered from. For example, if memory allocations
  111. fail, there is little or nothing useful the gateway can do and
  112. therefore _for_the_gateway_ it is OK to panic. (This is not a
  113. general rule of software engineering, but it does apply to us.)
  114. You almost certainly want to discuss things on the devel list
  115. before adding a call to panic.
  116. Log messages shall consist of complete sentences: start with
  117. an upper case letter and end in a period (or other suitable
  118. punctuation character).
  119. Error messages (functions warning, error, panic) should indicate
  120. the operation that was being performed, and the (presumed)
  121. cause of the problem. For example:
  122. Reading configuration file smsgateway.conf: out of memory.
  123. System error 42: Not enough space.
  124. Couldn't read configuration file `smsgateway.conf'.
  125. System error 42: Not enough space.
  126. Informational messages (function info) probably shouldn't report
  127. system errors.
  128. Filenames should be given `quoted' so that it is clear what is
  129. and what is not part of the name. Similarly for other data that
  130. may need it.
  131. Open question: The name of the function or source code module
  132. isn't very informational for people just using the gateway,
  133. although they can be useful for debugging the gateway. People
  134. debugging the gateway would probably like the source file, line
  135. number, and possibly function name be reported systematically.
  136. What to do?
  137. Log message at the `debug' level: naming convention for `place'
  138. The debug() function's first argument is called `place'. It tells
  139. the logical place where call is made from. This is not the same
  140. as the source file and line; those change too often for them to
  141. be useful. Instead, it is meant to identify the subsystem and
  142. subsubsystem (and, if necessary, subsubsubsystem). The following
  143. subsystems should be used:
  144. wap WAP Box
  145. wap.wsp WSP implementation
  146. wap.wsp.http WSP implementation
  147. wap.wtp WTP implementation
  148. wap.wtp.timer WTP timers
  149.                 wap.wtp.tid     WTP tid validation
  150. wap.wml WML encoder
  151. bb Bearer box: misc stuff
  152. bb.udp BB UDP sender/receiver
  153. bb.boxc BB box connections
  154. bb.http HTTP admin things
  155. bb.thread Thread handling
  156. bb.sms SMS related stuff
  157. bb.sms.cimd CIMD implementation
  158. bb.sms.cimd2 CIMD 2 implementation
  159. bb.sms.emi EMI/UCP implementation
  160. bb.sms.smpp SMPP implementation
  161. bb.sms.sema SEMA/SMS2000 implementation
  162. sms SMS box
  163. gw Misc stuff used by all boxes
  164. gw.msg Inter-box messages
  165. gwlib Library functions
  166. gwlib.http HTTP implementation
  167. gwlib.octstr Octet strings
  168. test Test programs
  169. test.fakewap
  170. test.udp_send
  171. util Utility programs
  172. If you need more subsystems, please add them here as well.
  173. Debugging places can be set via '-D' (or --debug) command line
  174. option, with format like "wap.* bb.csdr" (see gwlib/log.h). Any 
  175. places need to be excluded from the set are marked with
  176. preceding '-', like "wap.* -wap.wsp.*"
  177. Using integer types
  178. Avoid the uint32_t type, and similar types with other names, and
  179. try to live with:
  180. int (-32000 to 32000)
  181. long (-2 000 000 000 to 2 000 000 000)
  182. unsigned long (0 to 4 000 000 000)
  183. unsigned char (0 to 255)
  184. The ranges given are _minimum_ ranges. Do not assume that there
  185. ever exists an integer type of a specific size. If you think you
  186. need one of a specific size, think again. If that doesn't help,
  187. discuss things on devel@kannel.org.
  188. The exception to this is that it is probably safe to assume char
  189. is 8 bits. Do not assume a plain `char' type is signed or unsigned
  190. - always use unsigned chars. However, remember that it is almost
  191. always smarter to use an `int' for a char (and store non-negative
  192. values) instead of an unsigned char, because of the complicated
  193. type promotion rules in C, when dealing with a single character.
  194. When using an array ("string"), use unsigned char as the element
  195. type. However, remember to use Octstr whenever possible.
  196. Some library functions require the use of a specific integer type.
  197. In that case, use that.
  198. #include directives
  199. When referring to header files that are not part of Kannel,
  200. use the <foo.h> syntax. When referring to header files that
  201. are part of Kannel, use the "foo.h" syntax. Since Kannel source
  202. code is spread over several directories, use the following
  203. rules to construct the actual filename:
  204. if foo.c includes foo.h and they are both in the
  205. same directory, use "foo.h"
  206. if foo.c includes, for example, gwlib.h, and foo.c is not
  207. in the same directory as gwlib.h, the path relative to
  208. the root of the Kannel source tree should be given, thus
  209. "gwlib/gwlib.h".
  210. Header files
  211. When writing header files for Kannel, write them so that they
  212. include whatever other header files they need, rather than
  213. relying on the caller to do that. An exception can be made for
  214. header files that are not normally included directly by a
  215. source file, but bundled by another header file (such as gwlib.h).
  216. This will result in some header files being included multiple
  217. times by a source file. Deal with that by using this construct,
  218. where HEADERNAME is the filename of the header file:
  219. #ifndef HEADERNAME_H
  220. #define HEADERNAME_H
  221. ... the body of the header file
  222. #endif
  223. If your code is not in gwlib, #include "gwlib/gwlib.h", but
  224. nothing else from gwlib.
  225. Use of #if, #ifdef, etc
  226. Try to avoid using the various forms of #if for portability
  227. purposes. It's preferable to write the code so that it works
  228. everywhere, instead of having umpteen versions for different
  229. platforms. Only having a single version makes it easier to
  230. test and debug things, for example.
  231. Don't comment things out with #if (or any other way either).
  232. We use CVS, it is always possible to go back.
  233. Don't add new features and make them conditionally compiled.
  234. Either add them completely, or don't add them at all.
  235. Typecasts
  236. Don't use them, unless you're really certain it's needed. Almost
  237. always when you think you need one, you are doing things that
  238. are too tricky and may become a portability problem in the future.
  239. A common exception are the braindead BSD socket functions: they
  240. have been designed so that typecasts are necessary. We try to
  241. make wrappers around such functions in gwlib, so that we have the
  242. cast only in one place.
  243. Abstract data types, constructors and destructors
  244. Use abstract data types whenever it makes sense. Avoid defining
  245. structures that are used directly in several modules - this is
  246. a maintenance headache. Instead, define an abstract data type,
  247. Foo, and functions to manipulate that data type, e.g., to access
  248. various fields of Foo.
  249. This is sort of a castrated version of object oriented
  250. programming. It's a good thing.
  251.      Use the following naming convention:
  252.          typedef struct Foo Foo;  /* The abstract data type */
  253.     Foo *foo_create(void);   /* Create a new Foo */
  254.     void foo_destroy(Foo *); /* Destroy a Foo */
  255.     void foo_destroy_item(void *);
  256.                     /* Wrapper, for list_destroy use */
  257. ChangeLog
  258. We use the file called `ChangeLog' to log changes, not CVS
  259. commit entries. CVS entries are not usable by people who don't
  260. have CVS access (e.g., they are off-line at the moment, which
  261. happens often for laptop users), and are also harder to browse
  262. than a single file.
  263. When writing an entry, please try to make sure the entry is at
  264. least somewhat understandable without referring to the actual
  265. patch it reflects. This helps immensely those who want to follow
  266. Kannel development without having to wade through millions of
  267. lines of patches per year.
  268. CVS and tags
  269. We use CVS tags for releases. If the version number is X.Y.Z,
  270. then the corresponding tag is version_X_Y_Z. Stable branches
  271. are called stable_X_Y, where X.Y is the stable version that
  272. started the branch.  If you want to use tags for other things,
  273. use some other naming scheme. For private use, prefix tags with
  274. your CVS login name.
  275. Initialization of automatic variables
  276. Try to avoid embedding initialization of automatic variables in
  277. their definitions, since they are easy to miss and this can lead
  278. to trouble. Also, it's too easy to mistakenly use an argument
  279. value before it has been checked with gw_assert.