File: style.html

package info (click to toggle)
tendra-doc 4.1.2-7
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 2,600 kB
  • ctags: 1,566
  • sloc: makefile: 32; sh: 3
file content (458 lines) | stat: -rw-r--r-- 16,427 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
<!-- Crown Copyright (c) 1998 -->
<HTML>
<HEAD>
<TITLE>
C++ Producer Guide: Style guide 
</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#400080" ALINK="#FF0000">

<H1>C++ Producer Guide</H1>
<H3>March 1998</H3>
<A HREF="alg.html"><IMG SRC="../images/next.gif" ALT="next section"></A>
<A HREF="std.html"><IMG SRC="../images/prev.gif" ALT="previous section"></A>
<A HREF="index.html"><IMG SRC="../images/top.gif" ALT="current document"></A>
<A HREF="../index.html"><IMG SRC="../images/home.gif" ALT="TenDRA home page">
</A>
<IMG SRC="../images/no_index.gif" ALT="document index"><P>
<HR>

<DL>
<DT><A HREF="#language"><B>3.1.1</B> - C coding standard</A><DD>
<DT><A HREF="#api"><B>3.1.2</B> - API usage and target dependencies</A><DD>
<DT><A HREF="#src"><B>3.1.3</B> - Source code modules</A><DD>
</DL>
<HR>

<H2>3.1. Source code organisation</H2>
<P>
This section describes the basic organisation of the source code for
the C++ producer.  This includes the coding conventions applied, the
application programming interface (API) observed and the division
of the code into separate modules. 
</P>

<HR>
<H3><A NAME="language">3.1.1. C coding standard</A></H3>
<P>
The C++ producer is written in a subset of C which is compatible with
C++ (it compiles with most C compilers, but also bootstraps itself).
It has been written to conform to the local (OSSG) 
<A HREF="index.html#cstyle">C coding standard</A>; most of the conformance
checking being automated by use of a 
<A HREF="pragma.html#usr">user-defined compilation profile</A>, 
<CODE>ossg_std.h</CODE>.  The standard macros described in the coding
standard are defined in the standard header <CODE>ossg.h</CODE>. This
is included from the header <CODE>config.h</CODE> which is included
by all source files.  The default definitions for these macros, set
according to the value of <CODE>__STDC__</CODE> and other compiler-defined
macros, should be correct, but they can be overridden by defining
the <CODE>FS_*</CODE> macros, described in the header, as command-line
options. 
</P>
<P>
The most important of these macros are those used to handle function
prototypes, enabling both ISO and pre-ISO C compilers to be accommodated.
Simple function definitions take the form: 
<PRE>
	ret function
	    PROTO_N ( ( p1, p2, ...., pn ) )
	    PROTO_T ( par1 p1 X par2 p2 X .... X parn pn )
	{
	    ....
	}
</PRE>
with the <CODE>PROTO_N</CODE> macro being used to list the parameter
names (note the double bracket) and the <CODE>PROTO_T</CODE> macro
being used to list the parameter types using <CODE>X</CODE> (cartesian
product) as a separator.  The corresponding function declaration will
have the form: 
<PRE>
	ret function PROTO_S ( ( par1, par2, ...., parn ) ) ;
</PRE>
The case where there are no parameter types is defined using: 
<PRE>
	ret function
	    PROTO_Z ()
	{
	    ....
	}
</PRE>
and declared as: 
<PRE>
	ret function PROTO_S ( ( void ) ) ;
</PRE>
Functions with ellipses are defined using: 
<PRE>
	#if FS_STDARG
	#include &lt;stdarg.h&gt;
	#else
	#include &lt;varargs.h&gt;
	#endif

	ret function
	    PROTO_V ( ( par1 p1, par2 p2, ...., parn pn, ... ) )
	{
	    va_list args ;
	    ....
	#if FS_STDARG
	    va_start ( args, pn ) ;
	#else
	    par1 p1 ;
	    par2 p2 ;
	    ....
	    parn pn ;
	    va_start ( args ) ;
	    p1 = va_arg ( args, par1 ) ;
	    p2 = va_arg ( args, par2 ) ;
	    ....
	    pn = va_arg ( args, parn ) ;
	#endif
	    ....
	    va_end ( args ) ;
	    ....
	}
</PRE>
and declared as: 
<PRE>
	ret function PROTO_W ( ( par1, par2, ...., parn, ... ) ) ;
</PRE>
Note that <CODE>&lt;varargs.h&gt;</CODE> does not allow for parameters
preceding the <CODE>va_alist</CODE>, so the fixed parameters need
to be explicitly assigned from <CODE>args</CODE>. 
</P>
<P>
The following <A HREF="pragma.html#keyword">TenDRA keywords</A> are
defined (with suitable default values for non-TenDRA compilers): 
<PRE>
	#pragma TenDRA keyword SET for set
	#pragma TenDRA keyword UNUSED for discard variable
	#pragma TenDRA keyword IGNORE for discard value
	#pragma TenDRA keyword EXHAUSTIVE for exhaustive
	#pragma TenDRA keyword REACHED for set reachable
	#pragma TenDRA keyword UNREACHED for set unreachable
	#pragma TenDRA keyword FALL_THROUGH for fall into case
</PRE>
</P>
<P>
Various flags giving properties of the compiler being used are defined
in <CODE>ossg.h</CODE>.  Among the most useful are <CODE>FS_STDARG</CODE>,
which is true if the compiler supports ellipsis functions (see above),
and <CODE>FS_STDC_HASH</CODE>, which is true if the preprocessor supports
the ISO stringising and concatenation operators.  The macros 
<CODE>CONST</CODE> and <CODE>VOLATILE</CODE>, to be used in place
of 
<CODE>const</CODE> and <CODE>volatile</CODE>, are also defined. 
</P>
<P>
A policy of rigorous static program checking is enforced.  The TenDRA
C producer is applied with the user-defined compilation mode 
<CODE>ossg_std.h</CODE> and intermodule checks enabled.  Checking
is applied with both the C and <CODE>#pragma token</CODE>  
<A HREF="../utilities/calc.html"><CODE>calculus</CODE> output files</A>.
The C++ producer itself is applied with the same checks.  <CODE>gcc
-Wall</CODE> and various versions of <CODE>lint</CODE> are also periodically
applied. 
</P>

<HR>
<H3><A NAME="api">3.1.2. API usage and target dependencies</A></H3>
<P>
Most of the API features used in the C++ producer are to be found
in the ISO C API, with just a couple of extensions from POSIX required.
These POSIX features can be disabled with minimal loss of functionality
by defining the macro <CODE>FS_POSIX</CODE> to be false. 
</P>
<P>
The following features are used from the ISO <CODE>&lt;stdio.h&gt;</CODE>
header: 
<PRE>
	BUFSIZ		EOF		FILE		SEEK_SET
	fclose		fflush		fgetc		fgets
	fopen		fprintf		fputc		fputs
	fread		fseek		fwrite		rewind
	sprintf		stderr		stdin		stdout
	vfprintf
</PRE>
from the ISO <CODE>&lt;stdlib.h&gt;</CODE> header: 
<PRE>
	EXIT_SUCCESS	EXIT_FAILURE	NULL		abort
	exit		free		malloc		realloc
	size_t
</PRE>
and from the ISO <CODE>&lt;string.h&gt;</CODE> header: 
<PRE>
	memcmp		memcpy		strchr		strcmp
	strcpy		strlen		strncmp		strrchr
</PRE>
The three headers just mentioned are included in all source files
via the 
<CODE>ossg_api.h</CODE> header file (included by <CODE>config.h</CODE>).
The remaining headers are only included as and when they are needed.
The following features are used from the ISO <CODE>&lt;ctype.h&gt;</CODE>
header: 
<PRE>
	isalpha		isprint
</PRE>
from the ISO <CODE>&lt;limits.h&gt;</CODE> header: 
<PRE>
	UCHAR_MAX	UINT_MAX	ULONG_MAX
</PRE>
from the ISO <CODE>&lt;stdarg.h&gt;</CODE> header: 
<PRE>
	va_arg		va_end		va_list		va_start
</PRE>
(note that if <CODE>FS_STDARG</CODE> is false the XPG3 
<CODE>&lt;varargs.h&gt;</CODE> header is used instead); and from the
ISO 
<CODE>&lt;time.h&gt;</CODE> header: 
<PRE>
	localtime	time		time_t		struct tm
	tm::tm_hour	tm::tm_mday	tm::tm_min	tm::tm_mon
	tm::tm_sec	tm::tm_year
</PRE>
The following features are used from the POSIX 
<CODE>&lt;sys/stat.h&gt;</CODE> header: 
<PRE>
	stat		struct stat	stat::st_dev	stat::st_ino
	stat::st_mtime
</PRE>
The <CODE>&lt;sys/types.h&gt;</CODE> header is also included to provide
the necessary types for <CODE>&lt;sys/stat.h&gt;</CODE>. 
</P>
<P>
There are a couple of target dependencies in the producer which can
overridden using command-line options: 
<OL>
<LI>It assumes that if a count of the number of characters read from
an input file is maintained, then that count value can be used as
an argument to <CODE>fseek</CODE>.  This may not be true on machines
where the end of line marker consists of both a newline and a carriage
return.  In this case the <CODE>-m-f</CODE> command-line option can
be used to switch to a slower, but more portable, algorithm for setting
file positions. 
<P>
<LI>It assumes that a file is uniquely determined by the 
<CODE>st_dev</CODE> and <CODE>st_ino</CODE> fields of its corresponding
<CODE>stat</CODE> value.  This is used when processing 
<CODE>#include</CODE> directives to prevent a file being read more
than once if this is not necessary.  This assumption may not be true
on machines with a small <CODE>ino_t</CODE> type which have file systems
mounted from machines with a larger <CODE>ino_t</CODE> type.  In this
case the <CODE>-m-i</CODE> command-line option can be used to disable
this check. 
</OL>
</P>

<HR>
<H3><A NAME="src">3.1.3. Source code modules</A></H3>
<P>
For convenience, the source code is divided between a number of directories:
<OL>

<LI>The base directory contains only the module containing the 
<CODE>main</CODE> function, the basic type descriptions and the 
<CODE>Makefile</CODE>.  
<LI>The directories <CODE>obj_c</CODE> and <CODE>obj_tok</CODE> contain
respectively the C and <CODE>#pragma token</CODE> headers generated
from the type algebra by <A HREF="../utilities/calc.html"><CODE>calculus</CODE>
</A>.  The directory <CODE>obj_templ</CODE> contains certain <CODE>calculus
</CODE>
template files. 
<LI>The directory <CODE>utility</CODE> contains routines for such
utility operations as memory allocation and error reporting, including
the <A HREF="error.html">error catalogue</A>. 
<LI>The directory <CODE>parse</CODE> contains routines concerned with
parsing and preprocessing the input, including the 
<A HREF="../utilities/sid.html"><CODE>sid</CODE> grammar</A>. 
<LI>The directory <CODE>construct</CODE> contains routines for building
up and analysing the internal representation of the parsed code. 
<LI>The directory <CODE>output</CODE> contains routines for outputting
the internal representation in various formats including as a 
<A HREF="tdf.html">TDF capsule</A>, a <A HREF="link.html">C++ spec
file</A>, or a <A HREF="dump.html">symbol table dump file</A>. 
</OL>
</P>
<P>
Each module consists of a C source file, <CODE><I>file</I>.c</CODE>
say, containing function definitions, and a corresponding header file
<CODE><I>file</I>.h</CODE> containing the declarations of these functions.
The header is included within its corresponding source file to check
these declarations; it is protected against multiple inclusions by
a macro of the form <CODE><I>FILE</I>_INCLUDED</CODE>. The header
contains a brief comment describing the purpose of the module; each
function in the source file contains a comment describing its purpose,
its inputs and its output. 
</P>
<P>
The following table lists all the source modules in the C++ producer
with a brief description of the purpose of each: 
</P>
<P>
<CENTER>
<TABLE BORDER>
<TR><TH>Module</TH> <TH>Directory</TH>
<TH>Purpose</TH>
<TR><TD>access</TD> <TD>construct</TD>
<TD>member access control</TD>
<TR><TD>allocate</TD> <TD>construct</TD>
<TD><CODE>new</CODE> and <CODE>delete</CODE> expressions<TD>
<TR><TD>assign</TD> <TD>construct</TD>
<TD>assignment expressions<TD>
<TR><TD>basetype</TD> <TD>construct</TD>
<TD>basic type operations</TD>
<TR><TD>buffer</TD> <TD>utility</TD>
<TD>buffer reading and writing routines</TD>
<TR><TD>c_class</TD> <TD>obj_c</TD>
<TD><CODE>calculus</CODE> support routines</TD>
<TR><TD>capsule</TD> <TD>output</TD>
<TD>top-level TDF encoding routines</TD>
<TR><TD>cast</TD> <TD>construct</TD>
<TD>cast expressions</TD>
<TR><TD>catalog</TD> <TD>utility</TD>
<TD>error catalogue definition</TD>
<TR><TD>char</TD> <TD>parse</TD>
<TD>character sets</TD>
<TR><TD>check</TD> <TD>construct</TD>
<TD>expression checking</TD>
<TR><TD>chktype</TD> <TD>construct</TD>
<TD>type checking</TD>
<TR><TD>class</TD> <TD>construct</TD>
<TD>class and enumeration definitions</TD>
<TR><TD>compile</TD> <TD>output</TD>
<TD>TDF tag definition encoding routines</TD>
<TR><TD>constant</TD> <TD>parse</TD>
<TD>integer constant evaluation</TD>
<TR><TD>construct</TD> <TD>construct</TD>
<TD>constructors and destructors</TD>
<TR><TD>convert</TD> <TD>construct</TD>
<TD>standard type conversions</TD>
<TR><TD>copy</TD> <TD>construct</TD>
<TD>expression copying</TD>
<TR><TD>debug</TD> <TD>utility</TD>
<TD>development aids</TD>
<TR><TD>declare</TD> <TD>construct</TD>
<TD>variable and function declarations<TD>
<TR><TD>decode</TD> <TD>output</TD>
<TD>bitstream reading routines</TD>
<TR><TD>derive</TD> <TD>construct</TD>
<TD>base class graphs; inherited members</TD>
<TR><TD>destroy</TD> <TD>construct</TD>
<TD>garbage collection routines</TD>
<TR><TD>diag</TD> <TD>output</TD>
<TD>TDF diagnostic output routines</TD>
<TR><TD>dump</TD> <TD>output</TD>
<TD>symbol table dump routines</TD>
<TR><TD>encode</TD> <TD>output</TD>
<TD>bitstream writing routines</TD>
<TR><TD>error</TD> <TD>utility</TD>
<TD>error output routines</TD>
<TR><TD>exception</TD> <TD>construct</TD>
<TD>exception handling</TD>
<TR><TD>exp</TD> <TD>output</TD>
<TD>TDF expression encoding routines</TD>
<TR><TD>expression</TD> <TD>construct</TD>
<TD>expression processing</TD>
<TR><TD>file</TD> <TD>parse</TD>
<TD>low-level I/O routines</TD>
<TR><TD>function</TD> <TD>construct</TD>
<TD>function definitions and calls</TD>
<TR><TD>hash</TD> <TD>parse</TD>
<TD>hash table and identifier name routines</TD>
<TR><TD>identifier</TD> <TD>construct</TD>
<TD>identifier expressions</TD>
<TR><TD>init</TD> <TD>output</TD>
<TD>TDF initialiser expression encoding routines</TD>
<TR><TD>initialise</TD> <TD>construct</TD>
<TD>variable initialisers</TD>
<TR><TD>instance</TD> <TD>construct</TD>
<TD>template instances and specialisations</TD>
<TR><TD>inttype</TD> <TD>construct</TD>
<TD>integer and floating point type routines</TD>
<TR><TD>label</TD> <TD>construct</TD>
<TD>labels and jumps</TD>
<TR><TD>lex</TD> <TD>parse</TD>
<TD>lexical analysis</TD>
<TR><TD>literal</TD> <TD>parse</TD>
<TD>integer and string literals</TD>
<TR><TD>load</TD> <TD>output</TD>
<TD>C++ spec reading routines</TD>
<TR><TD>macro</TD> <TD>parse</TD>
<TD>macro expansion</TD>
<TR><TD>main</TD> <TD>-</TD>
<TD>main routine; command-line arguments</TD>
<TR><TD>mangle</TD> <TD>output</TD>
<TD>identifier name mangling</TD>
<TR><TD>member</TD> <TD>construct</TD>
<TD>member selector expressions</TD>
<TR><TD>merge</TD> <TD>construct</TD>
<TD>intermodule merge routines</TD>
<TR><TD>namespace</TD> <TD>construct</TD>
<TD>namespaces; name look-up</TD>
<TR><TD>operator</TD> <TD>construct</TD>
<TD>overloaded operators</TD>
<TR><TD>option</TD> <TD>utility</TD>
<TD>compiler options</TD>
<TR><TD>overload</TD> <TD>construct</TD>
<TD>overload resolution</TD>
<TR><TD>parse</TD> <TD>parse</TD>
<TD>low-level parser routines</TD>
<TR><TD>pragma</TD> <TD>parse</TD>
<TD><CODE>#pragma</CODE> directives</TD>
<TR><TD>predict</TD> <TD>parse</TD>
<TD>parser look-ahead routines</TD>
<TR><TD>preproc</TD> <TD>parse</TD>
<TD>preprocessing directives</TD>
<TR><TD>print</TD> <TD>utility</TD>
<TD>error argument printing routines</TD>
<TR><TD>quality</TD> <TD>construct</TD>
<TD>extra expression checks</TD>
<TR><TD>redeclare</TD> <TD>construct</TD>
<TD>variable and function redeclarations</TD>
<TR><TD>rewrite</TD> <TD>construct</TD>
<TD>inline member function definitions</TD>
<TR><TD>save</TD> <TD>output</TD>
<TD>C++ spec writing routines</TD>
<TR><TD>shape</TD> <TD>output</TD>
<TD>TDF shape encoding routines</TD>
<TR><TD>statement</TD> <TD>construct</TD>
<TD>statement processing</TD>
<TR><TD>stmt</TD> <TD>output</TD>
<TD>TDF statement encoding routines</TD>
<TR><TD>struct</TD> <TD>output</TD>
<TD>TDF structure encoding routines</TD>
<TR><TD>syntax[0-9]*</TD> <TD>parse</TD>
<TD><CODE>sid</CODE> parser output</TD>
<TR><TD>system</TD> <TD>utility</TD>
<TD>system dependent routines</TD>
<TR><TD>table</TD> <TD>parse</TD>
<TD>portability table reading</TD>
<TR><TD>template</TD> <TD>construct</TD>
<TD>template declarations and checks</TD>
<TR><TD>throw</TD> <TD>output</TD>
<TD>TDF exception handling encoding routines</TD>
<TR><TD>tok</TD> <TD>output</TD>
<TD>TDF standard tokens encoding</TD>
<TR><TD>tokdef</TD> <TD>construct</TD>
<TD>token definitions</TD>
<TR><TD>token</TD> <TD>construct</TD>
<TD>token declarations and expansion</TD>
<TR><TD>typeid</TD> <TD>construct</TD>
<TD>run-time type information</TD>
<TR><TD>unmangle</TD> <TD>output</TD>
<TD>identifier name unmangling</TD>
<TR><TD>variable</TD> <TD>construct</TD>
<TD>variable analysis</TD>
<TR><TD>virtual</TD> <TD>construct</TD>
<TD>virtual functions</TD>
<TR><TD>xalloc</TD> <TD>utility</TD>
<TD>memory allocation routines</TD>
</TABLE>
</CENTER>
</P>

<HR>
<P><I>Part of the <A HREF="../index.html">TenDRA Web</A>.<BR>Crown
Copyright &copy; 1998.</I></P>
</BODY>
</HTML>