Code Tidy



A perl script that tidies up the indentation and braces in C, C++, Java or C# program source code.

#!/usr/local/bin/perl

$bs=0; #backslash count
$qu=0; #quote count
$br=0; #brace count
$co=0; #comment count

$prev=""; #previous character;
$pnw=""; #previous non-whitespace character
$prep=0; #pre-processor definition?

if ($#ARGV==0){
$in_file=$ARGV[0];
}else{
print "Invalid Arguments\n";
}

open(IN,"< $in_file");
while(<IN>){
	$line=$_;
	$len = length($line);
	for ($i=0;$i<$len;$i++){
	  $_ = substr($line,$i,1);
		SWITCH: {
		  /\n/o && do {
			  if ($prev ne "\n"){
  			  print " ";
				}
			  if ($pre==1 && $pnw ne "\\"){
  		    $pre=0;
					new_line();
				}
				last SWITCH;
			};
			/\//o && do {
				if ($prev eq "*"){
					$co++;
				}
				if ($pnw=~/[;}{]/o && $qu%2==0){
					new_line();
				}
				print "/";
				$bs=0;
				last SWITCH;
			};
			if ($pre==0 && $co==0){
				/\#/o && do {
					if ($pnw=~/[;}{]/o && $qu%2==0){
						new_line();
					}
					print "#";
					$bs=0;
					if ($i==0){
						$pre=1;
					}
					last SWITCH;
				};
				/\*/o && do {
					if ($prev eq "/"){
					  $co--;
					}
					if ($pnw=~/[;}{]/o && $qu%2==0){
						new_line();
					}
					print "*";
					$bs=0;
					last SWITCH;
				};
				/{/o && do {
					if ($pnw eq "{"){
						new_line();
					}
					$br++;
					$bs=0;
					print "{";
					last SWITCH;
				};
				/}/o && do {
					$br--;
					if ($pnw=~/[;}{]/o && $qu%2==0){
						new_line();
					}
					$bs=0;
					print "}";
					last SWITCH;
				};
				/\\/o && do {
					if ($pnw=~/[;}{]/o && $qu%2==0){
						new_line();
					}
					$bs++;
					print "\\";
					last SWITCH;
				};
				/\"/o && do {
					if ($pnw=~/[;}{]/o && $qu%2==0){
						new_line();
					}
					if (($bs % 2)==0){
						$qu++;
					}
					$bs=0;
					print "\"";
					last SWITCH;
				};
				/;/o && do {
					print ";";
					$bs=0;
					last SWITCH;
				};
				/\s/o && do {
					if ($qu%2==0){
						if ($prev ne " " && $prev ne "\n" && $prev ne "\r"){
							print " ";
						}
					}else{
						print " ";
					}
					$bs=0;
					last SWITCH;
				};
				/\t/o && do {
					if ($qu%2==0){
						if ($prev ne "\t"){
							print " ";
						}
					}else{
						print "\t";
					}
					$bs=0;
					last SWITCH;
				};
				$bs=0;
				if ($pnw=~/[;}{]/o && $qu%2==0){
					new_line();
				}
			}#endif pre==0
  	  print $_;
		}
		if ($_ ne "\r"){
	    $prev = $_;
		}
		if ($_ ne " " && $_ ne "\t" && $_ ne "\n" && $_ ne "\r"){
		  $pnw = $_;
		}
	}
}
print "\n";
close(IN);

sub new_line {
	print "\n";
	for ($j=0;$j<$br;$j++){
		print "  ";
	}
}