File tree Expand file tree Collapse file tree 3 files changed +34
-5
lines changed Expand file tree Collapse file tree 3 files changed +34
-5
lines changed Original file line number Diff line number Diff line change @@ -77,7 +77,8 @@ typedef enum {
7777 T_cppd_elif ,
7878 T_cppd_else ,
7979 T_cppd_endif ,
80- T_cppd_ifdef
80+ T_cppd_ifdef ,
81+ T_cppd_ifndef
8182} token_t ;
8283
8384char token_str [MAX_TOKEN_LEN ];
@@ -206,6 +207,8 @@ token_t lex_token_internal(bool aliasing)
206207 return T_cppd_elif ;
207208 if (!strcmp (token_str , "#ifdef" ))
208209 return T_cppd_ifdef ;
210+ if (!strcmp (token_str , "#ifndef" ))
211+ return T_cppd_ifndef ;
209212 if (!strcmp (token_str , "#else" ))
210213 return T_cppd_else ;
211214 if (!strcmp (token_str , "#endif" ))
Original file line number Diff line number Diff line change @@ -334,9 +334,9 @@ void cppd_control_flow_skip_lines()
334334 skip_whitespace ();
335335}
336336
337- void check_def (char * alias )
337+ void check_def (char * alias , bool expected )
338338{
339- if (find_alias (alias ))
339+ if (( find_alias (alias ) != NULL ) == expected )
340340 preproc_match = true;
341341}
342342
@@ -349,7 +349,7 @@ void read_defined_macro()
349349 lex_ident (T_identifier , lookup_alias );
350350 lex_expect (T_close_bracket );
351351
352- check_def (lookup_alias );
352+ check_def (lookup_alias , true );
353353}
354354
355355/* read preprocessor directive at each potential positions: e.g.,
@@ -485,7 +485,20 @@ bool read_preproc_directive()
485485 if (lex_accept_internal (T_cppd_ifdef , false)) {
486486 preproc_match = false;
487487 lex_ident (T_identifier , token );
488- check_def (token );
488+ check_def (token , true);
489+
490+ if (preproc_match ) {
491+ skip_whitespace ();
492+ return true;
493+ }
494+
495+ cppd_control_flow_skip_lines ();
496+ return true;
497+ }
498+ if (lex_accept_internal (T_cppd_ifndef , false)) {
499+ preproc_match = false;
500+ lex_ident (T_identifier , token );
501+ check_def (token , false);
489502
490503 if (preproc_match ) {
491504 skip_whitespace ();
Original file line number Diff line number Diff line change @@ -458,6 +458,19 @@ int main()
458458}
459459EOF
460460
461+ # #ifndef...#else...#endif
462+ try_ 0 << EOF
463+ #ifndef A
464+ #define A 0
465+ #else
466+ #define A 1
467+ #endif
468+ int main()
469+ {
470+ return A;
471+ }
472+ EOF
473+
461474# #if defined(...) ... #elif defined(...) ... #else ... #endif
462475try_ 0 << EOF
463476#define A 0
You can’t perform that action at this time.
0 commit comments