summaryrefslogtreecommitdiff
path: root/doc/STYLE
blob: 49f89330475c6df664f2a6871479932ac5588ed5 (plain)
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
GNU m4 STYLE - The way this code should look.		-*- outline -*-

Before all else this code follows the GNU coding standards and
indentation style described in standards.info.  Additionally the
following restrictions on coding style apply:

* SPACING

  + Avoid TABs in .h and .c files.  See HACKING for details.

* C STANDARD

  + All of this code is ANSI-C, GNU C extensions are conditional so that
    the code will compile cleanly on non GLIBC/GCC systems.

* SYMBOL NAMES

  + All non-static symbols have a prefix either `M4' or `m4'.

  + All exported symbols which are part of the library api have the
    prefix `m4_'.

  + Symbols which are exported from the library (for efficiency perhaps)
    but are not part of the supported library api have the prefix
    `m4__',

  + Function names should be verb phrases; m4_module_get_field.

  + Functions which exist to be used as callbacks from API functions, and
    hence which likely have strange looking parameters are named with the
    suffix `_CB', to make it obvious why they look a little odd.

  + Macros which implement fast versions of functions share the
    same name as the function they replace, and may not evaluate
    parameters more than once.

  + Otherwise macros are in uppercase, prefixed `M4' if they are visible
    to the user after installation, to help the user know when to be
    careful about multiple evaluations of parameters.

  + Function names should contain the name of the module they belong to,
    usually immediately after the namespace prefix: m4_module_load.

  + Variables should not be exported (not true, but I'm working on it),
    but accessor functions used instead.  Note the `get'/`set' part of
    the symbol name comes before the module part: m4_get_module_macros.

  + Structures come with accessor macros named <struct name>_<field
    name> (in upper case), to make refactoring of nested structures much
    easier: SYMBOL_FLAGS.

  + Structures are typedeffed separately, and the structure itself
    generally not exported unless in the `m4__' namespace to support
    fast accessor macros.

  + An opaque abstract data type (ADT) can have public and private fields:
    By convention public fields will have exported accessor functions (and
    maybe also fast macro versions of the same), and private fields will
    not export accessors at all.  However, there should be non-exported
    (or at least in the `m4__' namespace) accessor functions for even the
    private fields of an ADT to aid possible later refactoring.

* ARCHITECTURE

  + There are four groups of sources in subdirectories: `gnu' contains
    the files maintained outside of m4, as a portability layer when building
    the souce for non-glibc2 machines; `m4' contains the functionality for
    libm4 and enables the user to write modules; `modules' implements the
    builtin macros for the m4 binary; `src' is a small wrapper program
    which links libm4 and loads initial modules to implement the m4 engine.

  + The headers in gnu need to be managed carefully: gnulib headers
    can be included by other files in the same directory using `#include
    "file.h"', and from files in other directories with `#include
    <m4/file.h>'.  The include path to invocations of the compiler from
    various Makefile.am are set to prevent the possibility of picking up
    an m4/file.h when the system file.h (e.g stdbool.h) is present.  This,
    in turn means the replacement headers can live in gnulib/m4 without
    suffering a renaming scheme at configure time.  Don't break with the
    `#include' convention, or the compile will go wrong in hard to debug
    ways on some platforms.

  + Low coupling.  Classes (and in C, by this I mean files of functions)
    should not rely on a web of other classes to be useful, they should
    communicate with as few other classes as possible.

  + High cohesion.  The api and caller boundaries should be well defined
    and adhered to; a class should do one thing only.

========================================================================

Copyright (C) 2003, 2006, 2010, 2013-2014 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the ``GNU Free
Documentation License'' file as part of this distribution.