Fix unresolved implicit dependency of c_ppline.st state on c.st
[enscript.git] / states / hl / c_ppline.st
1 /*
2  * C preprocessor line handling.  This is shared between C, C++, and
3  * Objective-C highlighting rules.
4  */
5
6 require_state (c);
7
8 state c_ppline extends CHighlight
9 {
10   /* Comments within a pre-processor line. */
11   /\/\*/ {
12     comment_face (true);
13     language_print ($0);
14     call (c_comment);
15     comment_face (false);
16   }
17   /* Include line. */
18   /(include)([ \t]+)/ {
19     reference_face (true);
20     language_print ($1);
21     reference_face (false);
22     language_print ($2);
23     call (c_ppline_include);
24     return;
25   }
26   /* Define line. */
27   /(define)([ \t]+)/ {
28     reference_face (true);
29     language_print ($1);
30     reference_face (false);
31     language_print ($2);
32     call (c_ppline_define);
33     return;
34   }
35   /* Simple directives:
36      (build-re '(undef if ifdef ifndef endif elif else line error pragma))
37    */
38   /\b(e(l(if|se)|ndif|rror)|if(|def|ndef)|line|pragma|undef)\b/ {
39     reference_face (true);
40     language_print ($0);
41     reference_face (false);
42     call (c_ppline_tokensequence);
43     return;
44   }
45   /* An unknown pre-processor directive. */
46   /[a-zA-Z_][^ \t\n]*/ {
47     reference_face (true);
48     language_print ($0);
49     reference_face (false);
50     call (c_ppline_tokensequence);
51     return;
52   }
53   /\n/ {
54     language_print ($0);
55     return;
56   }
57 }
58
59 state c_ppline_include extends CHighlight
60 {
61   /\"/ {
62     string_face (true);
63     language_print ($0);
64     call (c_string);
65     string_face (false);
66     call (c_ppline_comments_strings_chars);
67     return;
68   }
69   /<[^<>]+>/ {
70     string_face (true);
71     language_print ($0);
72     string_face (false);
73     call (c_ppline_comments_strings_chars);
74     return;
75   }
76   /[a-zA-Z_][a-zA-Z_0-9]*/ {
77     variable_name_face (true);
78     print ($0);
79     variable_name_face (false);
80     call (c_ppline_comments_strings_chars);
81     return;
82   }
83   /\n/ {
84     language_print ($0);
85     return;
86   }
87 }
88
89 state c_ppline_define extends CHighlight
90 {
91   /([a-zA-Z_][a-zA-Z_0-9]*)(\([^\)]*\))?/ {
92     if (strcmp ($2, "") != 0)
93       {
94         function_name_face (true);
95         language_print ($1);
96         function_name_face (false);
97         language_print ($2);
98       }
99     else
100       {
101         variable_name_face (true);
102         language_print ($1);
103         variable_name_face (false);
104       }
105     call (c_ppline_comments_strings_chars);
106     return;
107   }
108   /\n/ {
109     language_print ($0);
110     return;
111   }
112 }
113
114 state c_ppline_comments_strings_chars extends CHighlight
115 {
116   /* Comments. */
117   /\/\*/ {
118     comment_face (true);
119     language_print ($0);
120     call (c_comment);
121     comment_face (false);
122   }
123   /* String constants. */
124   /\"/ {
125     string_face (true);
126     language_print ($0);
127     call (c_string);
128     string_face (false);
129   }
130   /* Character constants. */
131   /'.'|'\\\\.'/ {
132     string_face (true);
133     language_print ($0);
134     string_face (false);
135   }
136   /\n/ {
137     language_print ($0);
138     return;
139   }
140 }
141
142 state c_ppline_tokensequence extends CHighlight
143 {
144   /* Comments. */
145   /\/\*/ {
146     comment_face (true);
147     language_print ($0);
148     call (c_comment);
149     comment_face (false);
150   }
151   /* String constants. */
152   /\"/ {
153     string_face (true);
154     language_print ($0);
155     call (c_string);
156     string_face (false);
157   }
158   /* Character constants. */
159   /'.'|'\\\\.'/ {
160     string_face (true);
161     language_print ($0);
162     string_face (false);
163   }
164   /* defined() operators. */
165   /(defined)(\()([^\)]+)(\))/ {
166     reference_face (true);
167     language_print ($1);
168     reference_face (false);
169     language_print ($2);
170
171     variable_name_face (true);
172     language_print ($3);
173     variable_name_face (false);
174
175     language_print ($4);
176   }
177   /* Variable references. */
178   /\b[a-zA-Z_][a-zA-Z_0-9]*\b/ {
179     variable_name_face (true);
180     language_print ($0);
181     variable_name_face (false);
182   }
183   /\n/ {
184     language_print ($0);
185     return;
186   }
187 }
188
189 \f
190 /*
191 Local variables:
192 mode: c
193 End:
194 */