diff options
Diffstat (limited to 'scripts')
38 files changed, 4263 insertions, 2772 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 677bc6c175cb..b96ea8d6a5ed 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -56,6 +56,17 @@ endef # gcc support functions # See documentation in Documentation/kbuild/makefiles.txt +# cc-cross-prefix +# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) +# Return first prefix where a prefix$(CC) is found in PATH. +# If no $(CC) found in PATH with listed prefixes return nothing +cc-cross-prefix = \ + $(word 1, $(foreach c,$(1), \ + $(shell set -e; \ + if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \ + echo $(c); \ + fi))) + # output directory for tests below TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) @@ -75,24 +86,24 @@ try-run = $(shell set -e; \ # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) as-option = $(call try-run,\ - $(CC) $(CFLAGS) $(1) -c -xassembler /dev/null -o "$$TMP",$(1),$(2)) + $(CC) $(KBUILD_CFLAGS) $(1) -c -xassembler /dev/null -o "$$TMP",$(1),$(2)) # as-instr # Usage: cflags-y += $(call as-instr,instr,option1,option2) as-instr = $(call try-run,\ - echo -e "$(1)" | $(CC) $(AFLAGS) -c -xassembler -o "$$TMP" -,$(2),$(3)) + echo -e "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" -,$(2),$(3)) # cc-option # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) cc-option = $(call try-run,\ - $(CC) $(CFLAGS) $(1) -S -xc /dev/null -o "$$TMP",$(1),$(2)) + $(CC) $(KBUILD_CFLAGS) $(1) -S -xc /dev/null -o "$$TMP",$(1),$(2)) # cc-option-yn # Usage: flag := $(call cc-option-yn,-march=winchip-c6) cc-option-yn = $(call try-run,\ - $(CC) $(CFLAGS) $(1) -S -xc /dev/null -o "$$TMP",y,n) + $(CC) $(KBUILD_CFLAGS) $(1) -S -xc /dev/null -o "$$TMP",y,n) # cc-option-align # Prefix align with either -falign or -malign diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 7fd6055bedfd..de9836eee8bb 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -22,16 +22,30 @@ EXTRA_AFLAGS := EXTRA_CFLAGS := EXTRA_CPPFLAGS := EXTRA_LDFLAGS := +asflags-y := +ccflags-y := +cppflags-y := +ldflags-y := # Read .config if it exist, otherwise ignore -include include/config/auto.conf include scripts/Kbuild.include +# For backward compatibility check that these variables does not change +save-cflags := $(CFLAGS) + # The filename Kbuild has precedence over Makefile kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) -include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile) - +kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) +include $(kbuild-file) + +# If the save-* variables changed error out +ifeq ($(KBUILD_NOPEDANTIC),) + ifneq ("$(save-cflags)","$(CFLAGS)") + $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use EXTRA_CFLAGS) + endif +endif include scripts/Makefile.lib ifdef host-progs @@ -55,31 +69,6 @@ _dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) _dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d))) endif - -ifdef EXTRA_TARGETS -$(warning kbuild: $(obj)/Makefile - Usage of EXTRA_TARGETS is obsolete in 2.6. Please fix!) -endif - -ifdef build-targets -$(warning kbuild: $(obj)/Makefile - Usage of build-targets is obsolete in 2.6. Please fix!) -endif - -ifdef export-objs -$(warning kbuild: $(obj)/Makefile - Usage of export-objs is obsolete in 2.6. Please fix!) -endif - -ifdef O_TARGET -$(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.6. Please fix!) -endif - -ifdef L_TARGET -$(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.6. Please fix!) -endif - -ifdef list-multi -$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.6. Please fix!) -endif - ifndef obj $(warning kbuild: Makefile.build is included improperly) endif @@ -291,7 +280,7 @@ endif # builtin-target # ifdef lib-target quiet_cmd_link_l_target = AR $@ -cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(lib-y) +cmd_link_l_target = rm -f $@; $(AR) rcs $@ $(lib-y) $(lib-target): $(lib-y) FORCE $(call if_changed,link_l_target) diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean index cff33498fa16..2c647107c9cc 100644 --- a/scripts/Makefile.clean +++ b/scripts/Makefile.clean @@ -40,7 +40,7 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) # build a list of files to remove, usually releative to the current # directory -__clean-files := $(extra-y) $(EXTRA_TARGETS) $(always) \ +__clean-files := $(extra-y) $(always) \ $(targets) $(clean-files) \ $(host-progs) \ $(hostprogs-y) $(hostprogs-m) $(hostprogs-) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index fc498fee68ed..3c5e88bfecf1 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -1,5 +1,9 @@ -# Backward compatibility - to be removed... -extra-y += $(EXTRA_TARGETS) +# Backward compatibility +asflags-y += $(EXTRA_AFLAGS) +ccflags-y += $(EXTRA_CFLAGS) +cppflags-y += $(EXTRA_CPPFLAGS) +ldflags-y += $(EXTRA_LDFLAGS) + # Figure out what we need to build from the various variables # =========================================================================== @@ -44,9 +48,9 @@ multi-objs-y := $(foreach m, $(multi-used-y), $($(m:.o=-objs)) $($(m:.o=-y))) multi-objs-m := $(foreach m, $(multi-used-m), $($(m:.o=-objs)) $($(m:.o=-y))) multi-objs := $(multi-objs-y) $(multi-objs-m) -# $(subdir-obj-y) is the list of objects in $(obj-y) which do not live -# in the local directory -subdir-obj-y := $(foreach o,$(obj-y),$(if $(filter-out $(o),$(notdir $(o))),$(o))) +# $(subdir-obj-y) is the list of objects in $(obj-y) which uses dir/ to +# tell kbuild to descend +subdir-obj-y := $(filter %/built-in.o, $(obj-y)) # $(obj-dirs) is a list of directories that contain object files obj-dirs := $(dir $(multi-objs) $(subdir-obj-y)) @@ -86,9 +90,9 @@ basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" modname_flags = $(if $(filter 1,$(words $(modname))),\ -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") -_c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(basetarget).o) -_a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) -_cpp_flags = $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F)) +_c_flags = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o) +_a_flags = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o) +_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F)) # If building the kernel in a separate objtree expand all occurrences # of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/'). @@ -108,16 +112,16 @@ __a_flags = $(call flags,_a_flags) __cpp_flags = $(call flags,_cpp_flags) endif -c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) \ +c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ $(__c_flags) $(modkern_cflags) \ -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) -a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) \ +a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ $(__a_flags) $(modkern_aflags) cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(__cpp_flags) -ld_flags = $(LDFLAGS) $(EXTRA_LDFLAGS) +ld_flags = $(LDFLAGS) $(ldflags-y) # Finds the multi-part object the current object will be linked into modname-multi = $(sort $(foreach m,$(multi-used),\ @@ -140,14 +144,14 @@ $(obj)/%:: $(src)/%_shipped # target: source(s) FORCE # $(if_changed,ld/objcopy/gzip) # -# and add target to EXTRA_TARGETS so that we know we have to +# and add target to extra-y so that we know we have to # read in the saved command line # Linking # --------------------------------------------------------------------------- quiet_cmd_ld = LD $@ -cmd_ld = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \ +cmd_ld = $(LD) $(LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) \ $(filter-out FORCE,$^) -o $@ # Objcopy diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile index 2f60070f9733..4c324a1f1e0e 100644 --- a/scripts/basic/Makefile +++ b/scripts/basic/Makefile @@ -1,13 +1,13 @@ ### -# Makefile.basic list the most basic programs used during the build process. -# The programs listed herein is what is needed to do the basic stuff, -# such as fix dependency file. +# Makefile.basic lists the most basic programs used during the build process. +# The programs listed herein are what are needed to do the basic stuff, +# such as fix file dependencies. # This initial step is needed to avoid files to be recompiled # when kernel configuration changes (which is what happens when # .config is included by main Makefile. # --------------------------------------------------------------------------- # fixdep: Used to generate dependency information during build process -# docproc: Used in Documentation/docbook +# docproc: Used in Documentation/DocBook hostprogs-y := fixdep docproc always := $(hostprogs-y) diff --git a/scripts/basic/docproc.c b/scripts/basic/docproc.c index f4d2f68452ba..0e4bd5459df4 100644 --- a/scripts/basic/docproc.c +++ b/scripts/basic/docproc.c @@ -10,8 +10,10 @@ * documentation-frontend * Scans the template file and call kernel-doc for * all occurrences of ![EIF]file - * Beforehand each referenced file are scanned for - * any exported sympols "EXPORT_SYMBOL()" statements. + * Beforehand each referenced file is scanned for + * any symbols that are exported via these macros: + * EXPORT_SYMBOL(), EXPORT_SYMBOL_GPL(), & + * EXPORT_SYMBOL_GPL_FUTURE() * This is used to create proper -function and * -nofunction arguments in calls to kernel-doc. * Usage: docproc doc file.tmpl @@ -64,16 +66,19 @@ FILELINE * entity_system; #define FUNCTION "-function" #define NOFUNCTION "-nofunction" +char *srctree; + void usage (void) { fprintf(stderr, "Usage: docproc {doc|depend} file\n"); fprintf(stderr, "Input is read from file.tmpl. Output is sent to stdout\n"); fprintf(stderr, "doc: frontend when generating kernel documentation\n"); fprintf(stderr, "depend: generate list of files referenced within file\n"); + fprintf(stderr, "Environment variable SRCTREE: absolute path to kernel source tree.\n"); } /* - * Execute kernel-doc with parameters givin in svec + * Execute kernel-doc with parameters given in svec */ void exec_kernel_doc(char **svec) { @@ -82,13 +87,13 @@ void exec_kernel_doc(char **svec) char real_filename[PATH_MAX + 1]; /* Make sure output generated so far are flushed */ fflush(stdout); - switch(pid=fork()) { + switch (pid=fork()) { case -1: perror("fork"); exit(1); case 0: memset(real_filename, 0, sizeof(real_filename)); - strncat(real_filename, getenv("SRCTREE"), PATH_MAX); + strncat(real_filename, srctree, PATH_MAX); strncat(real_filename, KERNELDOCPATH KERNELDOC, PATH_MAX - strlen(real_filename)); execvp(real_filename, svec); @@ -133,6 +138,7 @@ struct symfile * add_new_file(char * filename) symfilelist[symfilecnt++].filename = strdup(filename); return &symfilelist[symfilecnt - 1]; } + /* Check if file already are present in the list */ struct symfile * filename_exist(char * filename) { @@ -156,8 +162,8 @@ void noaction2(char * file, char * line) { file = file; line = line; } void printline(char * line) { printf("%s", line); } /* - * Find all symbols exported with EXPORT_SYMBOL and EXPORT_SYMBOL_GPL - * in filename. + * Find all symbols in filename that are exported with EXPORT_SYMBOL & + * EXPORT_SYMBOL_GPL (& EXPORT_SYMBOL_GPL_FUTURE implicitly). * All symbols located are stored in symfilelist. */ void find_export_symbols(char * filename) @@ -168,7 +174,7 @@ void find_export_symbols(char * filename) if (filename_exist(filename) == NULL) { char real_filename[PATH_MAX + 1]; memset(real_filename, 0, sizeof(real_filename)); - strncat(real_filename, getenv("SRCTREE"), PATH_MAX); + strncat(real_filename, srctree, PATH_MAX); strncat(real_filename, filename, PATH_MAX - strlen(real_filename)); sym = add_new_file(filename); @@ -179,15 +185,15 @@ void find_export_symbols(char * filename) perror(real_filename); exit(1); } - while(fgets(line, MAXLINESZ, fp)) { + while (fgets(line, MAXLINESZ, fp)) { char *p; char *e; - if (((p = strstr(line, "EXPORT_SYMBOL_GPL")) != 0) || - ((p = strstr(line, "EXPORT_SYMBOL")) != 0)) { + if (((p = strstr(line, "EXPORT_SYMBOL_GPL")) != NULL) || + ((p = strstr(line, "EXPORT_SYMBOL")) != NULL)) { /* Skip EXPORT_SYMBOL{_GPL} */ while (isalnum(*p) || *p == '_') p++; - /* Remove paranteses and additional ws */ + /* Remove parentheses & additional whitespace */ while (isspace(*p)) p++; if (*p != '(') @@ -211,7 +217,7 @@ void find_export_symbols(char * filename) * Document all external or internal functions in a file. * Call kernel-doc with following parameters: * kernel-doc -docbook -nofunction function_name1 filename - * function names are obtained from all the src files + * Function names are obtained from all the src files * by find_export_symbols. * intfunc uses -nofunction * extfunc uses -function @@ -262,7 +268,7 @@ void singfunc(char * filename, char * line) vec[idx++] = KERNELDOC; vec[idx++] = DOCBOOK; - /* Split line up in individual parameters preceeded by FUNCTION */ + /* Split line up in individual parameters preceded by FUNCTION */ for (i=0; line[i]; i++) { if (isspace(line[i])) { line[i] = '\0'; @@ -292,7 +298,7 @@ void parse_file(FILE *infile) { char line[MAXLINESZ]; char * s; - while(fgets(line, MAXLINESZ, infile)) { + while (fgets(line, MAXLINESZ, infile)) { if (line[0] == '!') { s = line + 2; switch (line[1]) { @@ -335,6 +341,10 @@ void parse_file(FILE *infile) int main(int argc, char *argv[]) { FILE * infile; + + srctree = getenv("SRCTREE"); + if (!srctree) + srctree = getcwd(NULL, 0); if (argc != 3) { usage(); exit(1); @@ -351,9 +361,9 @@ int main(int argc, char *argv[]) { /* Need to do this in two passes. * First pass is used to collect all symbols exported - * in the various files. + * in the various files; * Second pass generate the documentation. - * This is required because function are declared + * This is required because some functions are declared * and exported in different files :-(( */ /* Collect symbols */ @@ -396,4 +406,3 @@ int main(int argc, char *argv[]) fflush(stdout); return exitstatus; } - diff --git a/scripts/checkkconfigsymbols.sh b/scripts/checkkconfigsymbols.sh new file mode 100755 index 000000000000..39677c82747a --- /dev/null +++ b/scripts/checkkconfigsymbols.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# Find Kconfig variables used in source code but never defined in Kconfig +# Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> + +# Tested with dash. +paths="$@" +[ -z "$paths" ] && paths=. + +# Doing this once at the beginning saves a lot of time, on a cache-hot tree. +Kconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`" + +echo -e "File list \tundefined symbol used" +find $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i +do + # Output the bare Kconfig variable and the filename; the _MODULE part at + # the end is not removed here (would need perl an not-hungry regexp for that). + sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Z_]\+\).*!\2 '$i'!p' < $i +done | \ +# Smart "sort|uniq" implemented in awk and tuned to collect the names of all +# files which use a given symbol +awk '{map[$1, count[$1]++] = $2; } +END { + for (combIdx in map) { + split(combIdx, separate, SUBSEP); + # The value may have been removed. + if (! ( (separate[1], separate[2]) in map ) ) + continue; + symb=separate[1]; + printf "%s ", symb; + #Use gawk extension to delete the names vector + delete names; + #Portably delete the names vector + #split("", names); + for (i=0; i < count[symb]; i++) { + names[map[symb, i]] = 1; + # Unfortunately, we may still encounter symb, i in the + # outside iteration. + delete map[symb, i]; + } + i=0; + for (name in names) { + if (i > 0) + printf ", %s", name; + else + printf "%s", name; + i++; + } + printf "\n"; + } +}' | +while read symb files; do + # Remove the _MODULE suffix when checking the variable name. This should + # be done only on tristate symbols, actually, but Kconfig parsing is + # beyond the purpose of this script. + symb_bare=`echo $symb | sed -e 's/_MODULE//'` + if ! grep -q "\<$symb_bare\>" $Kconfigs; then + echo -e "$files: \t$symb" + fi +done|sort diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index dae7d30dca0f..cbb42580a81d 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -9,7 +9,7 @@ use strict; my $P = $0; $P =~ s@.*/@@g; -my $V = '0.09'; +my $V = '0.11'; use Getopt::Long qw(:config no_auto_abbrev); @@ -18,12 +18,21 @@ my $tree = 1; my $chk_signoff = 1; my $chk_patch = 1; my $tst_type = 0; +my $emacs = 0; +my $file = 0; +my $check = 0; +my $root; GetOptions( - 'q|quiet' => \$quiet, + 'q|quiet+' => \$quiet, 'tree!' => \$tree, 'signoff!' => \$chk_signoff, 'patch!' => \$chk_patch, 'test-type!' => \$tst_type, + 'emacs!' => \$emacs, + 'file!' => \$file, + 'subjective!' => \$check, + 'strict!' => \$check, + 'root=s' => \$root, ) or exit; my $exit = 0; @@ -33,19 +42,110 @@ if ($#ARGV < 0) { print "version: $V\n"; print "options: -q => quiet\n"; print " --no-tree => run without a kernel tree\n"; + print " --emacs => emacs compile window format\n"; + print " --file => check a source file\n"; + print " --strict => enable more subjective tests\n"; + print " --root => path to the kernel tree root\n"; exit(1); } -if ($tree && !top_of_kernel_tree()) { - print "Must be run from the top-level dir. of a kernel tree\n"; - exit(2); +if ($tree) { + if (defined $root) { + if (!top_of_kernel_tree($root)) { + die "$P: $root: --root does not point at a valid tree\n"; + } + } else { + if (top_of_kernel_tree('.')) { + $root = '.'; + } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && + top_of_kernel_tree($1)) { + $root = $1; + } + } + + if (!defined $root) { + print "Must be run from the top-level dir. of a kernel tree\n"; + exit(2); + } } +my $emitted_corrupt = 0; + +our $Ident = qr{[A-Za-z_][A-Za-z\d_]*}; +our $Storage = qr{extern|static|asmlinkage}; +our $Sparse = qr{ + __user| + __kernel| + __force| + __iomem| + __must_check| + __init_refok| + __kprobes| + fastcall + }x; +our $Attribute = qr{ + const| + __read_mostly| + __kprobes| + __(?:mem|cpu|dev|)(?:initdata|init) + }x; +our $Inline = qr{inline|__always_inline|noinline}; +our $NonptrType = qr{ + \b + (?:const\s+)? + (?:unsigned\s+)? + (?: + void| + char| + short| + int| + long| + unsigned| + float| + double| + bool| + long\s+int| + long\s+long| + long\s+long\s+int| + (?:__)?(?:u|s|be|le)(?:8|16|32|64)| + struct\s+$Ident| + union\s+$Ident| + enum\s+$Ident| + ${Ident}_t| + ${Ident}_handler| + ${Ident}_handler_fn + ) + (?:\s+$Sparse)* + \b + }x; + +our $Type = qr{ + \b$NonptrType\b + (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? + (?:\s+$Sparse|\s+$Attribute)* + }x; +our $Declare = qr{(?:$Storage\s+)?$Type}; +our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; +our $Lval = qr{$Ident(?:$Member)*}; + +our $Constant = qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*}; +our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)}; +our $Operators = qr{ + <=|>=|==|!=| + =>|->|<<|>>|<|>|!|~| + &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/ + }x; + +our $Bare = ''; + +$chk_signoff = 0 if ($file); + my @dep_includes = (); my @dep_functions = (); -my $removal = 'Documentation/feature-removal-schedule.txt'; -if ($tree && -f $removal) { - open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!\n"; +my $removal = "Documentation/feature-removal-schedule.txt"; +if ($tree && -f "$root/$removal") { + open(REMOVE, "<$root/$removal") || + die "$P: $removal: open failed - $!\n"; while (<REMOVE>) { if (/^Check:\s+(.*\S)/) { for my $entry (split(/[, ]+/, $1)) { @@ -61,28 +161,42 @@ if ($tree && -f $removal) { } my @rawlines = (); -while (<>) { - chomp; - push(@rawlines, $_); - if (eof(ARGV)) { - if (!process($ARGV, @rawlines)) { - $exit = 1; - } - @rawlines = (); +for my $filename (@ARGV) { + if ($file) { + open(FILE, "diff -u /dev/null $filename|") || + die "$P: $filename: diff failed - $!\n"; + } else { + open(FILE, "<$filename") || + die "$P: $filename: open failed - $!\n"; } + while (<FILE>) { + chomp; + push(@rawlines, $_); + } + close(FILE); + if (!process($filename, @rawlines)) { + $exit = 1; + } + @rawlines = (); } exit($exit); sub top_of_kernel_tree { - if ((-f "COPYING") && (-f "CREDITS") && (-f "Kbuild") && - (-f "MAINTAINERS") && (-f "Makefile") && (-f "README") && - (-d "Documentation") && (-d "arch") && (-d "include") && - (-d "drivers") && (-d "fs") && (-d "init") && (-d "ipc") && - (-d "kernel") && (-d "lib") && (-d "scripts")) { - return 1; + my ($root) = @_; + + my @tree_check = ( + "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", + "README", "Documentation", "arch", "include", "drivers", + "fs", "init", "ipc", "kernel", "lib", "scripts", + ); + + foreach my $check (@tree_check) { + if (! -e $root . '/' . $check) { + return 0; + } } - return 0; + return 1; } sub expand_tabs { @@ -105,6 +219,20 @@ sub expand_tabs { return $res; } +sub copy_spacing { + my ($str) = @_; + + my $res = ''; + for my $c (split(//, $str)) { + if ($c eq "\t") { + $res .= $c; + } else { + $res .= ' '; + } + } + + return $res; +} sub line_stats { my ($line) = @_; @@ -212,6 +340,11 @@ sub ctx_block_level { return ctx_block_get($linenr, $remain, 0, '{', '}', 0); } +sub ctx_statement_level { + my ($linenr, $remain, $off) = @_; + + return ctx_block_get($linenr, $remain, 0, '(', ')', $off); +} sub ctx_locate_comment { my ($first_line, $end_line) = @_; @@ -257,16 +390,136 @@ sub ctx_has_comment { sub cat_vet { my ($vet) = @_; + my ($res, $coded); - $vet =~ s/\t/^I/; - $vet =~ s/$/\$/; + $res = ''; + while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { + $res .= $1; + if ($2 ne '') { + $coded = sprintf("^%c", unpack('C', $2) + 64); + $res .= $coded; + } + } + $res =~ s/$/\$/; - return $vet; + return $res; } +sub annotate_values { + my ($stream, $type) = @_; + + my $res; + my $cur = $stream; + + my $debug = 0; + + print "$stream\n" if ($debug); + + ##my $type = 'N'; + my $pos = 0; + my $preprocessor = 0; + my $paren = 0; + my @paren_type; + + # Include any user defined types we may have found as we went. + my $type_match = "(?:$Type$Bare)"; |
