cpp.st - enscript - GNU Enscript
(HTM) git clone git://thinkerwim.org/enscript.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
cpp.st (3528B)
---
1 /**
2 * Name: cpp
3 * Description: C++ programming language.
4 * Author: Markku Rossi <mtr@iki.fi>
5 */
6
7 cpp_type_re =
8 /* Types.
9 (build-re '(alignas alignof and and_eq asm auto bitand bitor bool
10 break case catch char char16_t char32_t class compl const constexpr
11 const_cast continue decltype default delete do double dynamic_cast
12 else enum explicit export extern false float for friend goto if
13 inline int long mutable namespace new noexcept not not_eq nullptr
14 operator or or_eq private protected public register
15 reinterpret_cast return short signed sizeof static static_assert
16 static_cast struct switch template this thread_local throw true try
17 typedef typeid typename union unsigned using virtual void volatile
18 wchar_t while xor xor_eq))
19 */
20 /\\b(a(lign(as|of)|nd(|_eq)|sm|uto)|b(it(and|or)|ool|reak)\\
21 |c(a(se|tch)|har(|16_t|32_t)|lass|o(mpl|n(st(|_cast|expr)|tinue)))\\
22 |d(e(cltype|fault|lete)|o(|uble)|ynamic_cast)\\
23 |e(lse|num|x(p(licit|ort)|tern))|f(alse|loat|or|riend)|goto\\
24 |i(f|n(line|t))|long|mutable|n(amespace|ew|o(except|t(|_eq))|ullptr)\\
25 |o(perator|r(|_eq))|p(r(ivate|otected)|ublic)\\
26 |re(gister|interpret_cast|turn)\\
27 |s(hort|i(gned|zeof)|t(atic(|_(assert|cast))|ruct)|witch)\\
28 |t(emplate|h(is|r(ead_local|ow))|r(ue|y)|ype(def|id|name))\\
29 |u(n(ion|signed)|sing)|v(irtual|o(id|latile))|w(char_t|hile)|xor(|_eq))\b/;
30
31 /*
32 * We inherit the C++ state from the C state. This gives us all the
33 * defaults, etc. All we have to do here is to overwrite things that
34 * are not implemented, or are broken.
35 */
36 state cpp extends c
37 {
38 BEGIN {
39 /* See `c.st' for the comments on this one. */
40 type_re = cpp_type_re;
41 }
42
43 /* One line comments. */
44 /\/\// {
45 comment_face (true);
46 language_print ($0);
47 call (eat_one_line);
48 comment_face (false);
49 }
50
51 /* Keywords; those missing from C, but not types, goto, or case
52 (build-re '(asm catch delete new operator overload this throw try))
53 */
54 /\b(asm|catch|delete|new|o(perator|verload)|t(h(is|row)|ry))\b/ {
55 keyword_face (true);
56 language_print ($0);
57 keyword_face (false);
58 }
59
60 /* Types. */
61 cpp_type_re {
62 type_face (true);
63 language_print ($0);
64 type_face (false);
65 }
66
67 /* Remove false labels. */
68 /[a-zA-Z0-9_]+::/ {
69 language_print ($0);
70 }
71
72 /* Labels. Emacs accepts also bare numbers. */
73 /^([ \t]*)([a-zA-Z0-9_]+)(:)/ {
74 language_print ($1);
75
76 if (strcmp ($2, "public") == 0
77 || strcmp ($2, "private") == 0
78 || strcmp ($2, "protected") == 0)
79 {
80 /* These use the `type' face. */
81 type_face (true);
82 language_print ($2);
83 type_face (false);
84 }
85 else
86 {
87 reference_face (true);
88 language_print ($2);
89 reference_face (false);
90 }
91
92 language_print ($3);
93 }
94
95 /*
96 * Function definitions, but only if you code with the one and only
97 * usable indentation style (GNU).
98 */
99 /^([a-zA-Z_][a-zA-Z_0-9:~]*)([ \t]*\()/ {
100 function_name_face (true);
101 language_print ($1);
102 function_name_face (false);
103
104 language_print ($2);
105 }
106
107 /* Function definitions and prototypes for other (loser) coding styles. */
108 /^([A-Za-z][a-zA-Z0-9_\&\* ]+)([ \*])([a-zA-Z_][a-zA-Z_0-9:~]*)([ \t]*\()/ {
109 garbage = $1;
110 middle_garbage = $2;
111 function_name = $3;
112 tail_garbage = $4;
113
114 highlight_types (garbage, cpp_type_re);
115
116 language_print (middle_garbage);
117
118 function_name_face (true);
119 language_print (function_name);
120 function_name_face (false);
121
122 language_print (tail_garbage);
123 }
124 }
125
126
127 /*
128 Local variables:
129 mode: c
130 End:
131 */