Home | History | Annotate | Line # | Download | only in util
      1 #!/bin/sh
      2 #
      3 # Copyright 2015-2019 The OpenSSL Project Authors. All Rights Reserved.
      4 #
      5 # Licensed under the OpenSSL license (the "License").  You may not use
      6 # this file except in compliance with the License.  You can obtain a copy
      7 # in the file LICENSE in the source distribution or at
      8 # https://www.openssl.org/source/license.html
      9 
     10 #
     11 # openssl-format-source
     12 # - format source tree according to OpenSSL coding style using indent
     13 #
     14 # usage:
     15 #   openssl-format-source [-v] [-n] [file|directory] ...
     16 #
     17 # note: the indent options assume GNU indent v2.2.10 which was released
     18 #       Feb-2009 so if you have an older indent the options may not
     19 #	match what is expected
     20 #
     21 # any marked block comment blocks have to be moved to align manually after
     22 # the reformatting has been completed as marking a block causes indent to
     23 # not move it at all ...
     24 #
     25 
     26 PATH=/usr/local/bin:/bin:/usr/bin:$PATH
     27 export PATH
     28 HERE="`dirname $0`"
     29 
     30 set -e
     31 
     32 INDENT=indent
     33 uname -s | grep BSD > /dev/null && type gindent > /dev/null 2>&1 && INDENT=gindent
     34 
     35 if [ $# -eq 0 ]; then
     36   echo "usage: $0 [-v] [-n] [-c] [sourcefile|sourcedir] ..." >&2
     37   exit 1
     38 fi
     39 
     40 VERBOSE=false
     41 DONT=false
     42 STOPARGS=false
     43 COMMENTS=false
     44 CHANGED=false
     45 DEBUG=""
     46 
     47 # for this exercise, we want to force the openssl style, so we roll
     48 # our own indent profile, which is at a well known location
     49 INDENT_PROFILE="$HERE/indent.pro"
     50 export INDENT_PROFILE
     51 if [ ! -f "$INDENT_PROFILE" ]; then
     52   echo "$0: unable to locate the openssl indent.pro file" >&2
     53   exit 1
     54 fi
     55 
     56 # Extra arguments; for adding the comment-formatting
     57 INDENT_ARGS=""
     58 for i
     59 do
     60   if [ "$STOPARGS" != "true" ]; then
     61     case $i in
     62       --) STOPARGS="true"; continue;;
     63       -n) DONT="true"; continue;;
     64       -v) VERBOSE="true";
     65 	  echo "INDENT_PROFILE=$INDENT_PROFILE";
     66 	  continue;;
     67       -c) COMMENTS="true";
     68       	  INDENT_ARGS="-fc1 -fca -cdb -sc";
     69 	  continue;;
     70       -nc) COMMENTS="true";
     71 	  continue;;
     72       -d) DEBUG='eval tee "$j.pre" |'
     73 	  continue;;
     74     esac
     75   fi
     76 
     77   if [ -d "$i" ]; then
     78     LIST=`find "$i" -name '*.[ch]' -print`
     79   else
     80     if [ ! -f "$i" ]; then
     81       echo "$0: source file not found: $i" >&2
     82       exit 1
     83     fi
     84     LIST="$i"
     85   fi
     86 
     87   for j in $LIST
     88   do
     89     # ignore symlinks - we only ever process the base file - so if we
     90     # expand a directory tree we need to ignore any located symlinks
     91     if [ -d "$i" ]; then
     92       if [ -h "$j" ]; then
     93 	continue;
     94       fi
     95     fi
     96 
     97     if [ "$DONT" = "false" ]; then
     98       tmp=$(mktemp /tmp/indent.XXXXXX)
     99       trap 'rm -f "$tmp"' HUP INT TERM EXIT
    100 
    101       case `basename $j` in
    102 	# the list of files that indent is unable to handle correctly
    103 	# that we simply leave alone for manual formatting now
    104 	obj_dat.h|aes_core.c|aes_x86core.c|ecp_nistz256.c)
    105 	  echo "skipping $j"
    106 	  ;;
    107 	*)
    108 	  if [ "$COMMENTS" = "true" ]; then
    109 	    # we have to mark single line comments as /*- ...*/ to stop indent
    110 	    # messing with them, run expand then indent as usual but with the
    111 	    # the process-comments options and then undo that marking, and then
    112 	    # finally re-run indent without process-comments so the marked-to-
    113 	    # be-ignored comments we did automatically end up getting moved
    114 	    # into the right position within the code as indent leaves marked
    115 	    # comments entirely untouched - we appear to have no way to avoid
    116 	    # the double processing and get the desired output
    117 	    cat "$j" | \
    118 	    expand | \
    119 	    perl -0 -np \
    120 	      -e 's/(\n#[ \t]*ifdef[ \t]+__cplusplus\n[^\n]*\n#[ \t]*endif\n)/\n\/**INDENT-OFF**\/$1\/**INDENT-ON**\/\n/g;' \
    121 	      -e 's/(\n\/\*\!)/\n\/**/g;' \
    122 	      -e 's/(STACK_OF|LHASH_OF)\(([^ \t,\)]+)\)( |\n)/$1_$2_$3/g;' \
    123 	      | \
    124 	    perl -np \
    125 	      -e 's/^([ \t]*)\/\*([ \t]+.*)\*\/[ \t]*$/my ($x1,$x2) = ($1, $2); if (length("$x1$x2")<75 && $x2 !~ m#^\s*\*INDENT-(ON|OFF)\*\s*$#) {$c="-"}else{$c=""}; "$x1\/*$c$x2*\/"/e;' \
    126 	      -e 's/^\/\* ((Copyright|=|----).*)$/\/*-$1/;' \
    127 	      -e 's/^((DECLARE|IMPLEMENT)_.*)$/\/**INDENT-OFF**\/\n$1\n\/**INDENT-ON**\//;' \
    128 	      -e 's/^([ \t]*(make_dh|make_dh_bn|make_rfc5114_td)\(.*\)[ \t,]*)$/\/**INDENT-OFF**\/\n$1\n\/**INDENT-ON**\//;' \
    129 	      -e 's/^(ASN1_ADB_TEMPLATE\(.*)$/\/**INDENT-OFF**\/\n$1\n\/**INDENT-ON**\//;' \
    130 	      -e 's/^((ASN1|ADB)_.*_(end|END)\(.*[\){=,;]+[ \t]*)$/$1\n\/**INDENT-ON**\//;' \
    131 	      -e '/ASN1_(ITEM_ref|ITEM_ptr|ITEM_rptr|PCTX)/ || s/^((ASN1|ADB)_[^\*]*[){=,]+[ \t]*)$/\/**INDENT-OFF**\/\n$1/;' \
    132 	      -e 's/^(} (ASN1|ADB)_[^\*]*[\){=,;]+)$/$1\n\/**INDENT-ON**\//;' \
    133 	      | \
    134 	      $DEBUG $INDENT $INDENT_ARGS | \
    135 	      perl -np \
    136 		-e 's/^([ \t]*)\/\*-(.*)\*\/[ \t]*$/$1\/*$2*\//;' \
    137 		-e 's/^\/\*-((Copyright|=|----).*)$/\/* $1/;' \
    138 	      | $INDENT | \
    139 	      perl -0 -np \
    140 		-e 's/\/\*\*INDENT-(ON|OFF)\*\*\/\n//g;' \
    141 	      | perl -np \
    142 	        -e 's/(STACK_OF|LHASH_OF)_([^ \t,]+)_( |\/)/$1($2)$3/g;' \
    143 	        -e 's/(STACK_OF|LHASH_OF)_([^ \t,]+)_$/$1($2)/g;' \
    144 	      | perl "$HERE"/su-filter.pl \
    145 	      > "$tmp"
    146 	  else
    147 	    expand "$j" | $INDENT $INDENT_ARGS > "$tmp"
    148 	  fi;
    149 	  if cmp -s "$tmp" "$j"; then
    150 	    if [ "$VERBOSE" = "true" ]; then
    151 	      echo "$j unchanged"
    152 	    fi
    153 	    rm "$tmp"
    154 	  else
    155 	    if [ "$VERBOSE" = "true" ]; then
    156 	      echo "$j changed"
    157 	    fi
    158 	    CHANGED=true
    159 	    mv "$tmp" "$j"
    160 	  fi
    161 	  ;;
    162       esac
    163     fi
    164   done
    165 done
    166 
    167 
    168 if [ "$VERBOSE" = "true" ]; then
    169   echo
    170   if [ "$CHANGED" = "true" ]; then
    171     echo "SOURCE WAS MODIFIED"
    172   else
    173     echo "SOURCE WAS NOT MODIFIED"
    174   fi
    175 fi
    176