Release 1.6.5
[enscript.git] / states / hl / c.st
1 /**
2  * Name: c
3  * Description: C programming language.
4  * Author: Markku Rossi <mtr@iki.fi>
5  */
6
7 c_type_re =
8 /* Types.
9    (build-re '(auto char const double enum extern float int long
10    register short signed static struct typedef union unsigned void
11    volatile))
12  */
13   /\b(auto|c(har|onst)|double|e(num|xtern)|float|int|long|register\
14 |s(hort|igned|t(atic|ruct))|typedef|un(ion|signed)|vo(id|latile))\b/;
15
16 /* The super state of all C highlightings. */
17 state CHighlight extends Highlight
18 {
19   BEGIN {
20     if (verbose_highlighting)
21       verbose_re = /(->|<=|>=|==|!=|\&\&|\|\||!)/;
22     else
23       verbose_re = 0;
24   }
25
26   verbose_re {
27     match = $0;
28     if (strcmp (match, "->") == 0)
29       str = "rightarrow";
30     else if (strcmp (match, "<=") == 0)
31       str = "le";
32     else if (strcmp (match, ">=") == 0)
33       str = "ge";
34     else if (strcmp (match, "==") == 0)
35       str = "equiv";
36     else if (strcmp (match, "&&") == 0)
37       str = "land";
38     else if (strcmp (match, "||") == 0)
39       str = "lor";
40     else if (strcmp (match, "!") == 0)
41       str = "lnot";
42     else if (strcmp (match, "!=") == 0)
43       str = "ne";
44     else
45       str = 0;
46
47     if (!str || !language_symbol (str))
48       language_print ($0);
49   }
50 }
51
52 /*
53  * The highlight entry for C highlightings.  It is a bit ugly to
54  * re-implement the BEGIN and END because they must be kept in sync
55  * with the code in the `HighlightEntry'.  But, since we don't support
56  * multiple heritance, we have no choice.
57  */
58 state CHighlightEntry extends CHighlight
59 {
60   BEGIN {
61     if (highlight_entry_nesting++ == 0)
62       header ();
63   }
64   END {
65     if (--highlight_entry_nesting == 0)
66       trailer ();
67   }
68 }
69
70 state c extends CHighlightEntry
71 {
72   BEGIN {
73     /*
74      * Set the regular expression that is used to highlight types from
75      * the beginning of the on-line function definition.  This
76      * variable should be overwritten by each state that extends the
77      * `c' state.
78      */
79     type_re = c_type_re;
80   }
81
82   /* Comments. */
83   /\/\*/ {
84     comment_face (true);
85     language_print ($0);
86     call (c_comment);
87     comment_face (false);
88   }
89   /\/\// {
90     comment_face (true);
91     language_print ($0);
92     call (eat_one_line);
93     comment_face (false);
94   }
95
96   /* String constants. */
97   /\"/ {
98     string_face (true);
99     language_print ($0);
100     call (c_string);
101     string_face (false);
102   }
103
104   /* Pre-processor lines. */
105   /^#/ {
106     language_print ($0);
107     call (c_ppline);
108   }
109
110   /* Character constants. */
111   /'.'|'\\\\.'/ {
112     string_face (true);
113     language_print ($0);
114     string_face (false);
115   }
116
117   /* Keywords, but not types, goto, or case.
118      (build-re '(break continue default do else for if return sizeof
119      switch while))
120   */
121   /\b(break|continue|d(efault|o)|else|for|if|return|s(izeof|witch)|while)\b/ {
122     keyword_face (true);
123     language_print ($0);
124     keyword_face (false);
125   }
126
127   /* Types. */
128   c_type_re {
129     type_face (true);
130     language_print ($0);
131     type_face (false);
132   }
133
134   /* Labels.  Emacs accepts also bare numbers. */
135   /^([ \t]*)([a-zA-Z0-9_]+)(:)/ {
136     language_print ($1);
137
138     reference_face (true);
139     language_print ($2);
140     reference_face (false);
141
142     language_print ($3);
143   }
144
145   /* Goto, case and the target. */
146   /\<(goto|case)\>([ \t]+)(-?[A-Za-z_0-9]+)?/ {
147     keyword_face (true);
148     language_print ($1);
149     keyword_face (false);
150
151     language_print ($2);
152
153     if (length ($3) > 0)
154       {
155         reference_face (true);
156         language_print ($3);
157         reference_face (false);
158       }
159   }
160
161   /*
162    * Function definitions, but only if you code with the one and only
163    * usable indentation style (GNU).
164    */
165   /^([a-zA-Z_][a-zA-Z_0-9]*)([ \t]*\()/ {
166     function_name_face (true);
167     language_print ($1);
168     function_name_face (false);
169
170     language_print ($2);
171   }
172
173   /* Function definitions and prototypes for other (loser) coding styles. */
174   /^([A-Za-z][a-zA-Z0-9_\* ]+)([ \*])([a-zA-Z_][a-zA-Z_0-9]*)([ \t]*\()/ {
175     garbage = $1;
176     middle_garbage = $2;
177     function_name = $3;
178     tail_garbage = $4;
179
180     highlight_types (garbage, type_re);
181
182     language_print (middle_garbage);
183
184     function_name_face (true);
185     language_print (function_name);
186     function_name_face (false);
187
188     language_print (tail_garbage);
189   }
190 }
191
192 \f
193 /*
194 Local variables:
195 mode: c
196 End:
197 */