adlint 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +27 -0
- data/COPYING +674 -0
- data/ChangeLog +820 -0
- data/INSTALL +78 -0
- data/MANIFEST +464 -0
- data/NEWS +38 -0
- data/README +74 -0
- data/Rakefile +167 -0
- data/TODO +29 -0
- data/bin/adlint +141 -0
- data/bin/adlint_chk +129 -0
- data/bin/adlint_cma +122 -0
- data/bin/adlint_sma +129 -0
- data/bin/adlintize +286 -0
- data/etc/conf.d/fallback/cinit.erb +11 -0
- data/etc/conf.d/fallback/traits.erb +216 -0
- data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
- data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
- data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
- data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
- data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
- data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
- data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
- data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
- data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
- data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
- data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
- data/etc/conf.d/noarch/pinit.erb +11 -0
- data/etc/mesg.d/en_US/messages.yml +784 -0
- data/etc/mesg.d/ja_JP/messages.yml +784 -0
- data/lib/adlint/analyzer.rb +294 -0
- data/lib/adlint/c/branch.rb +251 -0
- data/lib/adlint/c/builtin.rb +92 -0
- data/lib/adlint/c/code.rb +490 -0
- data/lib/adlint/c/const.rb +465 -0
- data/lib/adlint/c/conv.rb +212 -0
- data/lib/adlint/c/ctrlexpr.rb +949 -0
- data/lib/adlint/c/domain.rb +7499 -0
- data/lib/adlint/c/environ.rb +133 -0
- data/lib/adlint/c/expr.rb +1725 -0
- data/lib/adlint/c/format.rb +3209 -0
- data/lib/adlint/c/interp.rb +1740 -0
- data/lib/adlint/c/lexer.rb +241 -0
- data/lib/adlint/c/mediator.rb +313 -0
- data/lib/adlint/c/message.rb +13597 -0
- data/lib/adlint/c/metric.rb +765 -0
- data/lib/adlint/c/object.rb +1018 -0
- data/lib/adlint/c/parser.rb +3800 -0
- data/lib/adlint/c/parser.y +2054 -0
- data/lib/adlint/c/phase.rb +712 -0
- data/lib/adlint/c/resolver.rb +270 -0
- data/lib/adlint/c/scanner.rb +248 -0
- data/lib/adlint/c/scope.rb +74 -0
- data/lib/adlint/c/syntax.rb +4279 -0
- data/lib/adlint/c/type.rb +7506 -0
- data/lib/adlint/c/util.rb +91 -0
- data/lib/adlint/c/value.rb +2310 -0
- data/lib/adlint/c.rb +56 -0
- data/lib/adlint/code.rb +500 -0
- data/lib/adlint/cpp/code.rb +189 -0
- data/lib/adlint/cpp/constexpr.rb +721 -0
- data/lib/adlint/cpp/constexpr.y +389 -0
- data/lib/adlint/cpp/eval.rb +1012 -0
- data/lib/adlint/cpp/lexer.rb +860 -0
- data/lib/adlint/cpp/macro.rb +637 -0
- data/lib/adlint/cpp/message.rb +992 -0
- data/lib/adlint/cpp/phase.rb +176 -0
- data/lib/adlint/cpp/scanner.rb +93 -0
- data/lib/adlint/cpp/source.rb +169 -0
- data/lib/adlint/cpp/subst.rb +300 -0
- data/lib/adlint/cpp/syntax.rb +1412 -0
- data/lib/adlint/cpp/util.rb +97 -0
- data/lib/adlint/cpp.rb +43 -0
- data/lib/adlint/driver.rb +147 -0
- data/lib/adlint/error.rb +179 -0
- data/lib/adlint/lang.rb +97 -0
- data/lib/adlint/ld/message.rb +259 -0
- data/lib/adlint/ld/metric.rb +57 -0
- data/lib/adlint/ld/object.rb +542 -0
- data/lib/adlint/ld/phase.rb +193 -0
- data/lib/adlint/ld/typedef.rb +109 -0
- data/lib/adlint/ld/util.rb +88 -0
- data/lib/adlint/ld.rb +37 -0
- data/lib/adlint/lexer.rb +293 -0
- data/lib/adlint/message.rb +368 -0
- data/lib/adlint/metric.rb +805 -0
- data/lib/adlint/monitor.rb +144 -0
- data/lib/adlint/phase.rb +90 -0
- data/lib/adlint/prelude.rb +314 -0
- data/lib/adlint/report.rb +617 -0
- data/lib/adlint/source.rb +155 -0
- data/lib/adlint/symbol.rb +127 -0
- data/lib/adlint/token.rb +215 -0
- data/lib/adlint/traits.rb +643 -0
- data/lib/adlint/util.rb +524 -0
- data/lib/adlint/version.rb +71 -0
- data/lib/adlint.rb +66 -0
- data/share/HEADER +45 -0
- data/share/demo/Makefile +110 -0
- data/share/demo/ambig_operator/ambig_operator.c +289 -0
- data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
- data/share/demo/array_range/array_range.c +62 -0
- data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
- data/share/demo/bad_brace/bad_brace.c +19 -0
- data/share/demo/bad_charset/abcde$.h +0 -0
- data/share/demo/bad_charset/bad_charset.c +22 -0
- data/share/demo/bad_comment/bad_comment.c +3 -0
- data/share/demo/bad_const/bad_const.c +19 -0
- data/share/demo/bad_conv/bad_conv.c +48 -0
- data/share/demo/bad_indent/bad_indent.c +50 -0
- data/share/demo/bad_init/bad_init.c +49 -0
- data/share/demo/bad_macro/bad_macro.c +97 -0
- data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
- data/share/demo/call_by_value/call_by_value.c +26 -0
- data/share/demo/cross_ref/cross_ref.c +21 -0
- data/share/demo/dangling_else/dangling_else.c +20 -0
- data/share/demo/dead_code/dead_code.c +237 -0
- data/share/demo/deep_nest/deep_nest.c +57 -0
- data/share/demo/dense_switch/dense_switch.c +62 -0
- data/share/demo/direct_recur/direct_recur.c +15 -0
- data/share/demo/div_by_zero/div_by_zero.c +35 -0
- data/share/demo/dos_source/dos_source.c +7 -0
- data/share/demo/funptr_cast/funptr_cast.c +26 -0
- data/share/demo/goto_stmt/goto_stmt.c +19 -0
- data/share/demo/id_hiding/id_hiding.c +19 -0
- data/share/demo/ill_defined/ill_defined.c +13 -0
- data/share/demo/implicit_conv/implicit_conv.c +60 -0
- data/share/demo/implicit_int/implicit_int.c +14 -0
- data/share/demo/incomplete_type/incomplete_type.c +49 -0
- data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
- data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
- data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
- data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
- data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
- data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
- data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
- data/share/demo/intro_demo/intro_demo.c +76 -0
- data/share/demo/intro_demo/intro_demo.h +12 -0
- data/share/demo/intro_demo/useless_header.h +5 -0
- data/share/demo/invalid_call/invalid_call.c +32 -0
- data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
- data/share/demo/line_comment/line_comment.c +12 -0
- data/share/demo/local_decl/local_decl.c +9 -0
- data/share/demo/logical_trick/logical_trick.c +36 -0
- data/share/demo/long_sym/long_sym.c +5 -0
- data/share/demo/loop_var/loop_var.c +92 -0
- data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
- data/share/demo/may_be_null/may_be_null.c +52 -0
- data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
- data/share/demo/may_be_unset/may_be_unset.c +34 -0
- data/share/demo/mmapped_io/mmapped_io.c +23 -0
- data/share/demo/multi_break/multi_break.c +33 -0
- data/share/demo/multi_decl/multi_decl_1.c +17 -0
- data/share/demo/multi_decl/multi_decl_1.h +6 -0
- data/share/demo/multi_decl/multi_decl_2.c +13 -0
- data/share/demo/multi_decl/multi_decl_2.h +6 -0
- data/share/demo/multi_decl/multi_decl_3.c +22 -0
- data/share/demo/multi_def/multi_def_1.c +36 -0
- data/share/demo/multi_def/multi_def_1.h +6 -0
- data/share/demo/multi_def/multi_def_2.c +22 -0
- data/share/demo/multi_def/multi_def_2.h +6 -0
- data/share/demo/multi_def/multi_def_3.c +6 -0
- data/share/demo/multi_typedef/multi_typedef.c +11 -0
- data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
- data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
- data/share/demo/must_be_false/must_be_false.c +53 -0
- data/share/demo/must_be_null/must_be_null.c +13 -0
- data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
- data/share/demo/must_be_true/must_be_true.c +21 -0
- data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
- data/share/demo/no_void_arg/no_void_arg.c +14 -0
- data/share/demo/null_stmt/null_stmt.c +19 -0
- data/share/demo/octal_const/octal_const.c +20 -0
- data/share/demo/output_by_param/output_by_param.c +17 -0
- data/share/demo/overflow/overflow.c +74 -0
- data/share/demo/press_release/press_release.c +40 -0
- data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
- data/share/demo/shift_expr/shift_expr.c +14 -0
- data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
- data/share/demo/static_paths/static_paths.c +153 -0
- data/share/demo/static_vars/static_vars.c +39 -0
- data/share/demo/tag_hiding/tag_hiding.c +18 -0
- data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
- data/share/demo/undefined_macro/undefined_macro.c +17 -0
- data/share/demo/uninit_vars/uninit_vars.c +28 -0
- data/share/demo/union_type/union_type.c +23 -0
- data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
- data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
- data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
- data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
- data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
- data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
- data/share/demo/unreachable/unreachable.c +34 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
- data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
- data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
- data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
- data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
- data/share/demo/useless_expr/useless_expr.c +17 -0
- data/share/demo/useless_funs/useless_funs_1.c +21 -0
- data/share/demo/useless_funs/useless_funs_1.h +8 -0
- data/share/demo/useless_funs/useless_funs_2.c +6 -0
- data/share/demo/useless_header/useless_header.c +9 -0
- data/share/demo/useless_header/useless_header_1.h +12 -0
- data/share/demo/useless_header/useless_header_2.h +6 -0
- data/share/demo/useless_header/useless_header_3.h +9 -0
- data/share/demo/useless_header/useless_header_4.h +3 -0
- data/share/demo/useless_vars/useless_vars.c +17 -0
- data/share/demo/va_funcall/va_funcall.c +25 -0
- data/share/demo/various_fundef/various_fundef.c +36 -0
- data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
- data/share/demo/wrap_around/wrap_around.c +38 -0
- data/share/doc/Makefile +16 -0
- data/share/doc/adlint_on_adqua.png +0 -0
- data/share/doc/adlint_on_eclipse_en.png +0 -0
- data/share/doc/adlint_on_eclipse_ja.png +0 -0
- data/share/doc/adlint_on_vim_en.png +0 -0
- data/share/doc/adlint_on_vim_ja.png +0 -0
- data/share/doc/developers_guide_ja.html +171 -0
- data/share/doc/developers_guide_ja.texi +87 -0
- data/share/doc/gen_mesg_sections.rb +39 -0
- data/share/doc/samples/GNUmakefile +162 -0
- data/share/doc/samples/adlint_traits.yml +238 -0
- data/share/doc/texinfo.css +22 -0
- data/share/doc/users_guide_en.html +39975 -0
- data/share/doc/users_guide_en.texi +32640 -0
- data/share/doc/users_guide_ja.html +40505 -0
- data/share/doc/users_guide_ja.texi +33189 -0
- data/share/logo/adlint-110.png +0 -0
- data/share/logo/adlint-524.png +0 -0
- data/share/logo/adlint.svg +4637 -0
- data/share/sample/README +6 -0
- data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
- data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
- data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
- data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
- data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
- data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
- data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
- data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
- data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
- data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
- data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
- data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
- data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
- data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
- data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
- data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
- data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
- data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
- data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
- data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
- data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
- data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
- data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
- data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
- data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
- data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
- data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
- data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
- data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
- data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
- data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
- data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
- data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
- metadata +532 -0
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
# C preprocessor macros.
|
|
2
|
+
#
|
|
3
|
+
# Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
|
|
4
|
+
# Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
|
5
|
+
# License:: GPLv3+: GNU General Public License version 3 or later
|
|
6
|
+
#
|
|
7
|
+
# Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
|
|
8
|
+
|
|
9
|
+
#--
|
|
10
|
+
# ___ ____ __ ___ _________
|
|
11
|
+
# / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
|
|
12
|
+
# / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
|
|
13
|
+
# / __ |/ /_/ / /___/ / /| / / /
|
|
14
|
+
# /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
|
15
|
+
#
|
|
16
|
+
# This file is part of AdLint.
|
|
17
|
+
#
|
|
18
|
+
# AdLint is free software: you can redistribute it and/or modify it under the
|
|
19
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
20
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
21
|
+
# version.
|
|
22
|
+
#
|
|
23
|
+
# AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
24
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
25
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
26
|
+
#
|
|
27
|
+
# You should have received a copy of the GNU General Public License along with
|
|
28
|
+
# AdLint. If not, see <http://www.gnu.org/licenses/>.
|
|
29
|
+
#
|
|
30
|
+
#++
|
|
31
|
+
|
|
32
|
+
require "adlint/token"
|
|
33
|
+
require "adlint/report"
|
|
34
|
+
require "adlint/util"
|
|
35
|
+
require "adlint/cpp/syntax"
|
|
36
|
+
|
|
37
|
+
module AdLint #:nodoc:
|
|
38
|
+
module Cpp #:nodoc:
|
|
39
|
+
|
|
40
|
+
class Macro
|
|
41
|
+
def initialize(define_line)
|
|
42
|
+
@define_line = define_line
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attr_reader :define_line
|
|
46
|
+
|
|
47
|
+
def name
|
|
48
|
+
@define_line.identifier
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def replacement_list
|
|
52
|
+
@define_line.replacement_list
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def location
|
|
56
|
+
@define_line.location
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def expand(tokens, macro_table, context)
|
|
60
|
+
@define_line.mark_as_referred_by(tokens.first)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def function_like?
|
|
64
|
+
subclass_responsibility
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
class ObjectLikeMacro < Macro
|
|
69
|
+
def replaceable_size(tokens)
|
|
70
|
+
if tokens.first.value == "NULL" then
|
|
71
|
+
0
|
|
72
|
+
else
|
|
73
|
+
name.value == tokens.first.value ? 1 : 0
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def expand(tokens, macro_table, context)
|
|
78
|
+
super
|
|
79
|
+
macro_table.notify_object_like_macro_replacement(self, tokens)
|
|
80
|
+
|
|
81
|
+
if replacement_list
|
|
82
|
+
location = tokens.first.location
|
|
83
|
+
replacement_list.tokens.map { |t|
|
|
84
|
+
ReplacedToken.new(t.type, t.value, location, t.type_hint, false)
|
|
85
|
+
}
|
|
86
|
+
else
|
|
87
|
+
[]
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def function_like?; false end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
class FunctionLikeMacro < Macro
|
|
95
|
+
def initialize(define_line)
|
|
96
|
+
super
|
|
97
|
+
if params = define_line.identifier_list
|
|
98
|
+
@parameter_names = params.identifiers.map { |t| t.value }
|
|
99
|
+
else
|
|
100
|
+
@parameter_names = []
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
attr_reader :parameter_names
|
|
105
|
+
|
|
106
|
+
def replaceable_size(tokens)
|
|
107
|
+
return 0 unless name.value == tokens.first.value
|
|
108
|
+
arg_array, index = parse_arguments(tokens, 1)
|
|
109
|
+
arg_array && @parameter_names.size >= arg_array.size ? index + 1 : 0
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def expand(tokens, macro_table, context)
|
|
113
|
+
super
|
|
114
|
+
arg_array = parse_arguments(tokens, 1).first
|
|
115
|
+
macro_table.notify_function_like_macro_replacement(self, tokens)
|
|
116
|
+
|
|
117
|
+
args = {}
|
|
118
|
+
@parameter_names.each_with_index do |param, i|
|
|
119
|
+
arg = arg_array[i] and args[param] = arg
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
location = tokens.first.location
|
|
123
|
+
expand_replacement_list(args, location, macro_table, context)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def function_like?; true end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
def parse_arguments(tokens, index)
|
|
130
|
+
while token = tokens[index]
|
|
131
|
+
case
|
|
132
|
+
when token.type == :NEW_LINE
|
|
133
|
+
index += 1
|
|
134
|
+
when token.value == "("
|
|
135
|
+
index += 1
|
|
136
|
+
break
|
|
137
|
+
else
|
|
138
|
+
return nil, index
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
return nil, index unless token
|
|
142
|
+
|
|
143
|
+
args = []
|
|
144
|
+
while token = tokens[index]
|
|
145
|
+
if token.value == ","
|
|
146
|
+
args.push(nil)
|
|
147
|
+
index += 1
|
|
148
|
+
else
|
|
149
|
+
arg, index = parse_one_argument(tokens, index)
|
|
150
|
+
break unless arg
|
|
151
|
+
args.push(arg)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
return args, index
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def parse_one_argument(tokens, index)
|
|
158
|
+
arg = []
|
|
159
|
+
paren_depth = 0
|
|
160
|
+
while token = tokens[index]
|
|
161
|
+
case token.value
|
|
162
|
+
when "("
|
|
163
|
+
arg << token
|
|
164
|
+
paren_depth += 1
|
|
165
|
+
when ")"
|
|
166
|
+
paren_depth -= 1
|
|
167
|
+
if paren_depth >= 0
|
|
168
|
+
arg << token
|
|
169
|
+
else
|
|
170
|
+
break
|
|
171
|
+
end
|
|
172
|
+
when ","
|
|
173
|
+
if paren_depth > 0
|
|
174
|
+
arg << token
|
|
175
|
+
else
|
|
176
|
+
index += 1
|
|
177
|
+
break
|
|
178
|
+
end
|
|
179
|
+
when "\n"
|
|
180
|
+
;
|
|
181
|
+
else
|
|
182
|
+
arg << token
|
|
183
|
+
end
|
|
184
|
+
index += 1
|
|
185
|
+
end
|
|
186
|
+
return (arg.empty? ? nil : arg), index
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def expand_replacement_list(args, expansion_location, macro_table, context)
|
|
190
|
+
return [] unless replacement_list
|
|
191
|
+
|
|
192
|
+
result = []
|
|
193
|
+
index = 0
|
|
194
|
+
while curr_token = replacement_list.tokens[index]
|
|
195
|
+
next_token = replacement_list.tokens[index + 1]
|
|
196
|
+
|
|
197
|
+
case
|
|
198
|
+
when arg = args[curr_token.value]
|
|
199
|
+
substitute_argument(curr_token, next_token, arg, result,
|
|
200
|
+
macro_table, context)
|
|
201
|
+
when curr_token.value == "#"
|
|
202
|
+
if next_token and arg = args[next_token.value]
|
|
203
|
+
result.push(stringize_argument(arg, expansion_location))
|
|
204
|
+
index += 1
|
|
205
|
+
end
|
|
206
|
+
when curr_token.value == "##" && next_token.value == "#"
|
|
207
|
+
if next_next_token = replacement_list.tokens[index + 2] and
|
|
208
|
+
arg = args[next_next_token.value]
|
|
209
|
+
stringized = stringize_argument(arg, expansion_location)
|
|
210
|
+
concat_with_last_token([stringized], expansion_location, result)
|
|
211
|
+
index += 2
|
|
212
|
+
end
|
|
213
|
+
when curr_token.value == "##"
|
|
214
|
+
if next_token and arg = args[next_token.value]
|
|
215
|
+
concat_with_last_token(arg, expansion_location, result)
|
|
216
|
+
else
|
|
217
|
+
concat_with_last_token([next_token], expansion_location, result)
|
|
218
|
+
end
|
|
219
|
+
index += 1
|
|
220
|
+
else
|
|
221
|
+
result.push(ReplacedToken.new(curr_token.type, curr_token.value,
|
|
222
|
+
expansion_location,
|
|
223
|
+
curr_token.type_hint, false))
|
|
224
|
+
end
|
|
225
|
+
index += 1
|
|
226
|
+
end
|
|
227
|
+
result
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def substitute_argument(param_token, next_token, arg, result,
|
|
231
|
+
macro_table, context)
|
|
232
|
+
# NOTE: The ISO C99 standard saids;
|
|
233
|
+
#
|
|
234
|
+
# 6.10.3.1 Argument substitution
|
|
235
|
+
#
|
|
236
|
+
# 1 After the arguments for the invocation of a function-like macro have
|
|
237
|
+
# been identified, argument substitution take place. A parameter in
|
|
238
|
+
# the replacement list, unless proceeded by a # or ## preprocessing
|
|
239
|
+
# token or followed by a ## preprocessing token, is replaced by the
|
|
240
|
+
# corresponding argument after all macros contained therein have been
|
|
241
|
+
# expanded. Before being substituted, each argument's preprocessing
|
|
242
|
+
# tokens are completely macro replaced as if they formed the rest of
|
|
243
|
+
# the preprocessing file; no other preprocessing tokens are available.
|
|
244
|
+
|
|
245
|
+
if next_token && next_token.value == "##"
|
|
246
|
+
result.concat(arg.map { |t|
|
|
247
|
+
ReplacedToken.new(t.type, t.value, t.location, t.type_hint, false)
|
|
248
|
+
})
|
|
249
|
+
else
|
|
250
|
+
macro_table.replace(arg, context)
|
|
251
|
+
result.concat(arg.map { |t|
|
|
252
|
+
ReplacedToken.new(t.type, t.value, t.location, t.type_hint, true)
|
|
253
|
+
})
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def stringize_argument(arg, expansion_location)
|
|
258
|
+
# NOTE: The ISO C99 standard saids;
|
|
259
|
+
#
|
|
260
|
+
# 6.10.3.2 The # operator
|
|
261
|
+
#
|
|
262
|
+
# Constraints
|
|
263
|
+
#
|
|
264
|
+
# 1 Each # preprocessing token in the replacement list for a
|
|
265
|
+
# function-like macro shall be followed by a parameter as the next
|
|
266
|
+
# preprocessing token in the replacement list.
|
|
267
|
+
#
|
|
268
|
+
# Semantics
|
|
269
|
+
#
|
|
270
|
+
# 2 If, in the replacement list, a parameter is immediately proceeded by
|
|
271
|
+
# a # preprocessing token, both are replaced by a single character
|
|
272
|
+
# string literal preprocessing token that contains the spelling of the
|
|
273
|
+
# preprocessing token sequence for the corresponding argument. Each
|
|
274
|
+
# occurrence of white space between the argument's preprocessing tokens
|
|
275
|
+
# becomes a single space character in the character string literal.
|
|
276
|
+
# White space before the first preprocessing token and after the last
|
|
277
|
+
# preprocessing token composing the argument is deleted. Otherwise,
|
|
278
|
+
# the original spelling of each preprocessing token in the argument is
|
|
279
|
+
# retained in the character string literal, except for special handling
|
|
280
|
+
# for producing the spelling of string literals and character
|
|
281
|
+
# constants: a \ character is inserted before each " and \ character of
|
|
282
|
+
# a character constant or string literal (including the delimiting "
|
|
283
|
+
# characters), except that it is implementation-defined whether a \
|
|
284
|
+
# character is inserted before the \ character beginning of universal
|
|
285
|
+
# character name. If the replacement that results is not a valid
|
|
286
|
+
# character string literal, the behavior is undefined. The character
|
|
287
|
+
# string literal corresponding to an empty argument is "". The order
|
|
288
|
+
# of evaluation of # and ## operators is unspecified.
|
|
289
|
+
#
|
|
290
|
+
# NOTE: This code does not concern about contents of the string literal.
|
|
291
|
+
# But, it is enough for analysis.
|
|
292
|
+
|
|
293
|
+
ReplacedToken.new(:PP_TOKEN,
|
|
294
|
+
"\"#{arg.map { |token| token.value }.join(' ')}\"",
|
|
295
|
+
expansion_location, :STRING_LITERAL, false)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def concat_with_last_token(tokens, expansion_location, result)
|
|
299
|
+
# NOTE: The ISO C99 standard saids;
|
|
300
|
+
#
|
|
301
|
+
# 6.10.3.3 The ## operator
|
|
302
|
+
#
|
|
303
|
+
# Constraints
|
|
304
|
+
#
|
|
305
|
+
# 1 A ## preprocessing token shall not occur at the beginning or at the
|
|
306
|
+
# end of a replacement list for either form of macro definition.
|
|
307
|
+
#
|
|
308
|
+
# Semantics
|
|
309
|
+
#
|
|
310
|
+
# 2 If, in the replacement list of a function-form macro, a parameter is
|
|
311
|
+
# immediately preceded or followed by a ## preprocessing token, the
|
|
312
|
+
# parameter is replaced by the corresponding argument's preprocessing
|
|
313
|
+
# token sequence; however, if an argument consists of no preprocessing
|
|
314
|
+
# tokens, the parameter is replaced by a placemarker preprocessing
|
|
315
|
+
# token instead.
|
|
316
|
+
#
|
|
317
|
+
# 3 For both object-like and function-like macro invocations, before the
|
|
318
|
+
# replacement list is reexamined for more macro names to replace, each
|
|
319
|
+
# instance of a ## preprocessing token in the replacement list (not
|
|
320
|
+
# from an argument) is deleted and the preceding preprocessing token is
|
|
321
|
+
# concatenated with the following preprocessing token. Placemarker
|
|
322
|
+
# preprocessing tokens are handled specially: concatenation of two
|
|
323
|
+
# placemarkers results in a single placemarker preprocessing token, and
|
|
324
|
+
# concatenation of a placemarker with a non-placemarker preprocessing
|
|
325
|
+
# token results in the non-placemarker preprocessing token. If the
|
|
326
|
+
# result is not a valid preprocessing token, the behavior is undefined.
|
|
327
|
+
# The resulting token is available for further macro replacement. The
|
|
328
|
+
# order of evaluation of ## operators is unspecified.
|
|
329
|
+
|
|
330
|
+
if last_token = result.pop
|
|
331
|
+
result.push(
|
|
332
|
+
ReplacedToken.new(:PP_TOKEN, last_token.value + tokens.first.value,
|
|
333
|
+
expansion_location, nil, false))
|
|
334
|
+
|
|
335
|
+
result.concat(tokens[1..-1].map { |token|
|
|
336
|
+
ReplacedToken.new(token.type, token.value, expansion_location,
|
|
337
|
+
token.type_hint, false)
|
|
338
|
+
})
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
class SpecialMacro < ObjectLikeMacro
|
|
344
|
+
def initialize(name_str)
|
|
345
|
+
super(PseudoObjectLikeDefineLine.new(name_str))
|
|
346
|
+
@replacement_list = nil
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
attr_reader :replacement_list
|
|
350
|
+
|
|
351
|
+
def expand(tokens, macro_table, context)
|
|
352
|
+
@replacement_list = generate_replacement_list(tokens.first)
|
|
353
|
+
super
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
private
|
|
357
|
+
def generate_replacement_list(token)
|
|
358
|
+
subclass_responsibility
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
class DateMacro < SpecialMacro
|
|
363
|
+
def initialize
|
|
364
|
+
super("__DATE__")
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
private
|
|
368
|
+
def generate_replacement_list(token)
|
|
369
|
+
date = Time.now.strftime("%h %d %Y")
|
|
370
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "\"#{date}\"", token.location,
|
|
371
|
+
:STRING_LITERAL))
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
class FileMacro < SpecialMacro
|
|
376
|
+
def initialize
|
|
377
|
+
super("__FILE__")
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
private
|
|
381
|
+
def generate_replacement_list(token)
|
|
382
|
+
PPTokens.new.push(
|
|
383
|
+
Token.new(:PP_TOKEN, "\"#{token.location.fpath}\"", token.location,
|
|
384
|
+
:STRING_LITERAL))
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
class LineMacro < SpecialMacro
|
|
389
|
+
def initialize
|
|
390
|
+
super("__LINE__")
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
private
|
|
394
|
+
def generate_replacement_list(token)
|
|
395
|
+
PPTokens.new.push(
|
|
396
|
+
Token.new(:PP_TOKEN, "#{token.location.line_no}", token.location,
|
|
397
|
+
:STRING_LITERAL))
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
class StdcMacro < SpecialMacro
|
|
402
|
+
def initialize
|
|
403
|
+
super("__STDC__")
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
private
|
|
407
|
+
def generate_replacement_list(token)
|
|
408
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "1", token.location, :CONSTANT))
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
class StdcHostedMacro < SpecialMacro
|
|
413
|
+
def initialize
|
|
414
|
+
super("__STDC_HOSTED__")
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
private
|
|
418
|
+
def generate_replacement_list(token)
|
|
419
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "1", token.location, :CONSTANT))
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
class StdcMbMightNeqWcMacro < SpecialMacro
|
|
424
|
+
def initialize
|
|
425
|
+
super("__STDC_MB_MIGHT_NEQ_WC__")
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
private
|
|
429
|
+
def generate_replacement_list(token)
|
|
430
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "1", token.location, :CONSTANT))
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
class StdcVersionMacro < SpecialMacro
|
|
435
|
+
def initialize
|
|
436
|
+
super("__STDC_VERSION__")
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
private
|
|
440
|
+
def generate_replacement_list(token)
|
|
441
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "199901L", token.location,
|
|
442
|
+
:CONSTANT))
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
class TimeMacro < SpecialMacro
|
|
447
|
+
def initialize
|
|
448
|
+
super("__TIME__")
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
private
|
|
452
|
+
def generate_replacement_list(token)
|
|
453
|
+
time = Time.now.strftime("%H:%M:%S")
|
|
454
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "\"#{time}\"", token.location,
|
|
455
|
+
:STRING_LITERAL))
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
class StdcIec559Macro < SpecialMacro
|
|
460
|
+
def initialize
|
|
461
|
+
super("__STDC_IEC_559__")
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
private
|
|
465
|
+
def generate_replacement_list(token)
|
|
466
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "0", token.location, :CONSTANT))
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
class StdcIec559ComplexMacro < SpecialMacro
|
|
471
|
+
def initialize
|
|
472
|
+
super("__STDC_IEC_559_COMPLEX__")
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
private
|
|
476
|
+
def generate_replacement_list(token)
|
|
477
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "0", token.location, :CONSTANT))
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
class StdcIso10646Macro < SpecialMacro
|
|
482
|
+
def initialize
|
|
483
|
+
super("__STDC_ISO_10646__")
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
private
|
|
487
|
+
def generate_replacement_list(token)
|
|
488
|
+
PPTokens.new.push(Token.new(:PP_TOKEN, "199712L", token.location,
|
|
489
|
+
:CONSTANT))
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
class PragmaOperator < FunctionLikeMacro
|
|
494
|
+
def initialize
|
|
495
|
+
super(PseudoFunctionLikeDefineLine.new("_Pragma", ["str"]))
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
def expand(tokens, macro_table, context)
|
|
499
|
+
# TODO: Should implement pragma handling feature.
|
|
500
|
+
[]
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
class MacroReplacementContext
|
|
505
|
+
def initialize
|
|
506
|
+
@hide_sets = Hash.new { |h, k| h[k] = Set.new }
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
def add_to_hide_set(orig_token, new_tokens, macro_name)
|
|
510
|
+
new_tokens.each do |new_token|
|
|
511
|
+
@hide_sets[new_token].merge(@hide_sets[orig_token])
|
|
512
|
+
@hide_sets[new_token].add(macro_name)
|
|
513
|
+
end
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
def hidden?(token, macro_name)
|
|
517
|
+
@hide_sets[token].include?(macro_name)
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
class MacroTable
|
|
522
|
+
def initialize
|
|
523
|
+
@macros = {}
|
|
524
|
+
predefine_special_macros
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
extend Pluggable
|
|
528
|
+
|
|
529
|
+
def_plugin :on_object_like_macro_replacement
|
|
530
|
+
def_plugin :on_function_like_macro_replacement
|
|
531
|
+
|
|
532
|
+
def define(macro)
|
|
533
|
+
@macros[macro.name.value] = macro
|
|
534
|
+
self
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
def undef(name_str)
|
|
538
|
+
@macros.delete(name_str)
|
|
539
|
+
self
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
def lookup(name_str)
|
|
543
|
+
@macros[name_str]
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
def replace(tokens, context = nil)
|
|
547
|
+
replaced = false
|
|
548
|
+
index = 0
|
|
549
|
+
|
|
550
|
+
while token = tokens[index]
|
|
551
|
+
case token.value
|
|
552
|
+
when "defined"
|
|
553
|
+
in_defined = true
|
|
554
|
+
when "(", ")"
|
|
555
|
+
;
|
|
556
|
+
else
|
|
557
|
+
if in_defined
|
|
558
|
+
in_defined = false
|
|
559
|
+
else
|
|
560
|
+
if new_index = do_replace(tokens, index, context)
|
|
561
|
+
index = new_index
|
|
562
|
+
replaced = true
|
|
563
|
+
end
|
|
564
|
+
end
|
|
565
|
+
end
|
|
566
|
+
index += 1
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
replaced
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
def notify_object_like_macro_replacement(macro, tokens)
|
|
573
|
+
on_object_like_macro_replacement.invoke(macro, tokens)
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def notify_function_like_macro_replacement(macro, tokens)
|
|
577
|
+
on_function_like_macro_replacement.invoke(macro, tokens)
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
private
|
|
581
|
+
def do_replace(tokens, index, context)
|
|
582
|
+
context ||= MacroReplacementContext.new
|
|
583
|
+
|
|
584
|
+
return nil unless token = tokens[index] and macro = lookup(token.value)
|
|
585
|
+
return nil if context.hidden?(token, macro.name.value)
|
|
586
|
+
|
|
587
|
+
size = macro.replaceable_size(tokens[index..-1])
|
|
588
|
+
|
|
589
|
+
if tokens[index, size].all? { |t| t.need_no_further_replacement? }
|
|
590
|
+
return nil
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
expanded = macro.expand(tokens[index, size], self, context)
|
|
594
|
+
context.add_to_hide_set(tokens[index], expanded, macro.name.value)
|
|
595
|
+
|
|
596
|
+
# NOTE: The ISO C99 standard saids;
|
|
597
|
+
#
|
|
598
|
+
# 6.10.3.4 Rescanning and further replacement
|
|
599
|
+
#
|
|
600
|
+
# 1 After all parameters in the replacement list have been substituted
|
|
601
|
+
# and # and ## processing has take place, all placemarker preprocessing
|
|
602
|
+
# tokens are removed. Then, the resulting preprocessing token sequence
|
|
603
|
+
# is rescanned, along with all subsequent preprocessing tokens of the
|
|
604
|
+
# source file, for more macro names to replace.
|
|
605
|
+
#
|
|
606
|
+
# 2 If the name of the macro being replaced is found during this scan of
|
|
607
|
+
# the replacement list (not including the rest of the source file's
|
|
608
|
+
# preprocessing tokens), it is not replaced. Furthermore, if any
|
|
609
|
+
# nested replacements encounter the name of the macro being replaced,
|
|
610
|
+
# it is not replaced. These nonreplaced macro name preprocessing
|
|
611
|
+
# tokens are no longer available for further replacement even if they
|
|
612
|
+
# are later (re)examined in contexts in which that macro name
|
|
613
|
+
# preprocessing token whould otherwise have been replaced.
|
|
614
|
+
while replace(expanded, context); end
|
|
615
|
+
tokens[index, size] = expanded
|
|
616
|
+
|
|
617
|
+
index + expanded.size - 1
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
def predefine_special_macros
|
|
621
|
+
define(DateMacro.new)
|
|
622
|
+
define(FileMacro.new)
|
|
623
|
+
define(LineMacro.new)
|
|
624
|
+
define(StdcMacro.new)
|
|
625
|
+
define(StdcHostedMacro.new)
|
|
626
|
+
define(StdcMbMightNeqWcMacro.new)
|
|
627
|
+
define(StdcVersionMacro.new)
|
|
628
|
+
define(TimeMacro.new)
|
|
629
|
+
define(StdcIec559Macro.new)
|
|
630
|
+
define(StdcIec559ComplexMacro.new)
|
|
631
|
+
define(StdcIso10646Macro.new)
|
|
632
|
+
define(PragmaOperator.new)
|
|
633
|
+
end
|
|
634
|
+
end
|
|
635
|
+
|
|
636
|
+
end
|
|
637
|
+
end
|