Compare commits

...

No commits in common. "develop" and "master" have entirely different histories.

5 changed files with 2519 additions and 36 deletions

2407
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,20 @@
# autoformat
# csc230-autoformat
## Requirements
- zsh
- astyle 2.04+
- perl
- doxygen (optional, for checking if all code is documented)
## Usage
```sh
./make.sh java > ../java-project/autoformat.sh
GLOB='src/**/*.c' ./make.sh c > ../c-project/autoformat.sh
cd path/with/code/
git clone https://github.ncsu.edu/agadler/csc230-autoformat ../autoformat
../autoformat/autoformat.sh
```
## Known Issues
- Automatically formatting this doesn't work (`(true)` doesn't get placed after `while ``): ```
while
(true) {}
```

41
autoformat.sh Executable file
View File

@ -0,0 +1,41 @@
#!/bin/zsh
# Format all c files
GLOB=( **/*.c )
# Astyle options:
# --mode=c : c formatting
# -xc : Brace attached to class names
# --style=stroustrup : stroustrup style (similar to 1tbs)
# -j : Always add brackets (even on one line if statements)
# -s2 : Three spaces
# -xG : Indent modifiers
# -S : Indent switches
# -K : Indent cases
# -N : Indent namespaces
# -xn : Attach bracket to namespace
# -xl : Attach inlines
# -n : Don't make a backup
# -p : Pad operators
# -H : Pad header (space after if, for, while)
OPTS=( --mode=c -xc --style=stroustrup -j -s2 -xG -S -K -N -xn -xl -n -p -H )
# Process the c files by adding the comment and removing newlines
perl "${0:h}/process.pl" $GLOB
# Colorize output if you can
if which colout>/dev/null; then
astyle $OPTS $GLOB|\grep -P '^(?!Unchanged)'|colout '(Formatted)' green||true
else
astyle $OPTS $GLOB|\grep -P '^(?!Unchanged)'||true
fi
# Now check for documentation
# Run doxygen, redirecting stdout to dev null, and setting stderr to $OUTPUT
if command -v doxygen >/dev/null; then
OUTPUT=$((doxygen "${0:h}/Doxyfile" > /dev/null) 2>&1)
# If there is output, something went wrong
if [ ! -z "$OUTPUT" ]; then
printf "$OUTPUT\n" >&2
return 2
fi
#TODO: We might need this in the future, bur for now, delete html directory
rm -r html || true
else
printf "You don't have doxygen installed. Can't check documentation\n" >&2
fi

33
make.sh
View File

@ -1,33 +0,0 @@
if [ -z "$1" ]; then
echo "Usage:" >&2
echo "$0 lang > autoformat.sh" >&2
exit 1
fi
OPTS="${OPTS:---mode=$1}"
GLOB="${GLOB:-**/*.$1}"
# --style=google : google style (similar to 1tbs)
# -H : Pad header (space after if, for, while)
# -K : Indent cases
# -N : Indent namespaces
# -S : Indent switches
# -j : Always add brackets (even on one line if statements)
# -n : Don't make a backup
# -p : Pad operators
# -s2 : Two spaces
# -xG : Indent modifiers
# -xc : Brace attached to class names
# -xe : Erase blank lines
# -xl : Attach inlines
# -xn : Attach bracket to namespace
# -z2 : Force Linux lineending
BASE_OPTS='-H -K -N -S -j -n -p -s2 -xG -xc -xe -xl -xn -z2'
cat << EOF
#!/bin/zsh
# For support:
# https://austenwares.com/gogs/stonewareslord/autoformat
#
GLOB=( $GLOB )
OPTS=( $BASE_OPTS $OPTS )
astyle \$OPTS \$GLOB|\\grep -P '^(?!Unchanged)'||true
EOF

59
process.pl Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/perl
use strict;
use autodie;
use warnings;
use File::Compare;
use File::Basename;
no warnings 'once';
# For every argument (file)
foreach my $file (@ARGV) {
# If it exists
if (-e $file) {
# Load the autoformatted data into $data
my ($data, $old_data) = process_file($file);
# Check if original data matches new data, if it doesn't, write it
# If it matches (there were no changes made), do nothing
if (not $data eq $old_data) {
# Write out the data
open(MYOUTPUTFILE, "+>$file") or die "Error opening output file $!";
print MYOUTPUTFILE $data;
close(MYOUTPUTFILE);
# Tell the user that we changed the file
print "Processed $file\n";
}
}
}
# Creates the automatically formatted file
sub process_file {
my($filename) = "$_[0]";
open(MYINPUTFILE, "<$filename") or die "x $!";
# The formatted file
my($data) = "";
# The original file (used for comparison to see if changes were made)
my($old_data) = "";
# Loop through every line in the file
while(<MYINPUTFILE>) {
# Add data to $old_data
$old_data .= $_;
# Get rid of trailing whitespace
s/\s*$//;
my($line) = $_;
# If it is not a whitespace only line, append it to $data
if($line !~ /^\s*$/) {
$data = $data . "$line\n";
}
}
close(MYINPUTFILE);
# Get rid of final newline
chomp($data);
if ($data !~ /^\s*\/\*\*/) {
# Get the basename of the file, this prevents making the block comment say:
# @file src/folders/code.c
# And instead uses
# @file code.c
my $basename = basename($filename);
$data = "/**\n * \@file $basename\n * \@author Austen Adler (agadler)\n * TODO: Description\n */\n$data";
}
$data .= "\n";
return ($data, $old_data);
}