This patch adds a script called "run_indent.pl" which runs the GNU indent program to reformat code to conform to PDD 7. It also patches PDD 7 to reflect what is being done.
[josh-011.patch] Index: MANIFEST =================================================================== RCS file: /home/perlcvs/parrot/MANIFEST,v retrieving revision 1.118 diff -u -r1.118 MANIFEST --- MANIFEST 21 Feb 2002 18:04:32 -0000 1.118 +++ MANIFEST 24 Feb 2002 01:01:49 -0000 @@ -230,6 +230,7 @@ register.c resources.c runops_cores.c +run_indent.pl rx.c rx.ops rxstacks.c Index: docs/pdds/pdd7.pod =================================================================== RCS file: /home/perlcvs/parrot/docs/pdds/pdd7.pod,v retrieving revision 1.1 diff -u -r1.1 pdd7.pod --- docs/pdds/pdd7.pod 18 Feb 2002 17:47:18 -0000 1.1 +++ docs/pdds/pdd7.pod 24 Feb 2002 01:01:49 -0000 @@ -1,3 +1,6 @@ + + + =head1 TITLE Conventions and Guidelines for Perl Source Code @@ -65,14 +68,14 @@ boilerplate code must appear at the bottom of each source file. (This rule may be rescinded if I'm ever threatened with a lynching....) - /* + /* * Local variables: * c-indentation-style: bsd * c-basic-offset: 4 * indent-tabs-mode: nil - * End + * End: * - * vim:expandtab shiftwidth=4: + * vim: expandtab shiftwidth=4: */ @@ -174,6 +177,53 @@ =back +To enforce the spacing, indenting, and bracing guidelines mentioned +above, the following arguments to GNU Indent should be used: + + -kr -nce -sc -cp0 -l79 -lc79 -psl -nut -cdw -ncs -lps + +This expands out to: + -nbad Do not force blank lines after declarations. + -bap Force blank lines after procedure bodies. + -bbo Prefer to break long lines before boolean operators. + -nbc Do not force newlines after commas in declarations + -br Put braces on line with if, etc. + -brs Put braces on struct declaration line. + -c33 Put comments to the right of code in column 33 (not recommended) + -cd33 Put declaration comments to the right of code in column 33 + -ncdb Do not put comment delimiters on blank lines. + -nce Do not cuddle } and else. + -cdw Do cuddle do { } while. + -ci4 Continuation indent of 4 spaces + -cli0 Case label indent of 0 spaces + -ncs Do not put a space after a cast operator. + -d0 Set indentation of comments not to the right of code to 0 spaces. + -di1 Put declaration variables 1 space after their types + -nfc1 Do not format comments in the first column as normal. + -nfca Do not format any comments + -hnl Prefer to break long lines at the position of newlines in the input. + -i4 4-space indents + -ip0 Indent parameter types in old-style function definitions by 0 spaces. + -l79 maximum line length for non-comment lines is 79 spaces. + -lc79 maximum line length for comment lines is 79 spaces. + -lp maximum line length for non-comment lines is 79 spaces. + -npcs Do not put a space after the function in function calls. + -nprs Do not put a space after every ´(´ and before every ´)´. + -psl Put the type of a procedure on the line before its name. + -saf Put a space after each for. + -sai Put a space after each if. + -saw Put a space after each while. + -sc Put the `*´ character at the left of comments. + -nsob Do not swallow optional blank lines. + -nss Do not force a space before the semicolon after certain statements + -nut Use spaces instead of tabs. + -lps Leave space between `#´ and preprocessor directive. + +Please note that it is also necessary to include all typedef types +with the "-T" option to ensure that everything is formatted properly. + +A script (run_indent.pl) is be provided which runs indent properly for +automatically. =head2 Naming conventions @@ -256,6 +306,7 @@ =back + The top-level structure of the Perl source tarball should be as follows: /README, etc a few top-level documents @@ -272,6 +323,20 @@ /pod/ src of the Perl man pages etc plus others as it becomes necessary. + +=item Header Files + +All .h files should include the following "guards" to prevent +multiple-inclusion: + + /* file header comments */ + + #if !defined(PARROT_<FILENAME>_H_GUARD) + #define PARROT_<FILENAME>_H_GUARD + + /* body of file */ + + #endif /* PARROT_<FILENAME>_H_GUARD */ =item Names of code entities --- /dev/null Sat Jul 14 02:37:41 2001 +++ run_indent.pl Sat Feb 23 19:57:30 2002 @@ -0,0 +1,72 @@ +#!/usr/bin/env perl + +die "Usage: $0 <c source files>\n" unless @ARGV; + +$|=1; +use strict; +use lib 'lib'; + +use Parrot::Config; +use C::Scan; + +my @incdirs; +my $cc_inc = $PConfig{'cc_inc'}; +my $ccflags = $PConfig{'ccflags'}; +while ($cc_inc =~ s/-I(\S+)//g) { push @incdirs, $1; } +while ($ccflags =~ s/-I(\S+)//g) { push @incdirs, $1; } +my $i_flags = join ' ', map { "-I$_" } @incdirs; + +my %all_errors; +foreach my $file (@ARGV) { + next unless ($file =~ /\.[ch]$/); + + print STDERR "Scanning $file.."; + my $c = new C::Scan 'filename' => $file, + 'add_cppflags' => $ccflags; + $c->set('includeDirs' => \@incdirs); + + my $errors = 0; + local $SIG{__WARN__} = sub { $errors++; $all_errors{"@_"}=1; }; + my $typedefs = $c->get('typedef_hash'); + + $/="\n"; # i don't know why, but this is necessary. + + my $defines = $c->get('defines_no_args_full'); + foreach (keys %$defines) { + next unless (length($defines->{$_}) >= 3 && + $defines->{$_} !~ /\n/); + + $typedefs->{$_}="maybe"; + } + + + # now a little trick. Weed out the ones we know aren't used. + open(F, "<$file") || die "Can't read $file: $!\n"; + { + local $/=undef; + my $contents = <F>; + + foreach (keys %$typedefs) { + delete $typedefs->{$_} unless ($contents =~ /\Q$_\E/); + } + } + close(F); + + print STDERR "$errors parse errors. " if ($errors); + print STDERR "Found " . scalar(keys %$typedefs) . " typedefs.\n"; + my $cmd = "indent -kr -nce -sc -cp0 -l79 -lc79 -psl -nut -cdw -ncs -lps"; + foreach (sort keys %$typedefs) { + $cmd .= " -T $_"; + } + $cmd .= " $file"; + + print "Running \"$cmd\"\n"; + system($cmd); +} + +#if (%all_errors) { +# print STDERR "The following parse errors occurred:\n"; +# foreach (sort keys %all_errors) { +# print; +# } +#}