Edit

kc3-lang/freetype/builds/atari/deflinejoiner.awk

Branch :

  • Show log

    Commit

  • Author : Werner Lemberg
    Date : 2013-01-24 13:33:06
    Hash : 4cd5fd46
    Message : Remove trailing whitespace.

  • builds/atari/deflinejoiner.awk
  • #!/usr/bin/env awk
    
    
    function shift( array, \
                    junk, elm0, l )
    {
      elm0 = array[0]
      for ( l = 0; l < asorti( array, junk ) - 1; l++ )
        array[l] = array[l+1];
      delete array[l]
      return elm0
    }
    
    
    function init_cpp_src_line()
    {
      logical_line = ""
      delete break_pos
    }
    
    
    function shift_valid_bp( array, \
                             junk, elm )
    {
      elm = -1
    
      if ( 0 < asorti( array, junk ) )
        do {
          elm = shift( array )
        } while ( 0 > elm );
    
      return elm
    }
    
    
    function check_cpp_src_line_break_pos( \
                                           i, junk )
    {
      printf( "break_pos:" )
      for ( i = 0; i < asorti( break_pos, junk ); i++ )
        printf( " %d", break_pos[i] );
      printf( "\n" )
    }
    
    
    function check_cpp_src_line()
    {
      printf( "logical_line[%s]\n", logical_line )
      check_cpp_src_line_break_pos()
    }
    
    
    function append_line( phys_line, \
                          filt_line, bp_len )
    {
      filt_line = phys_line
      sub( /\\$/, " ", filt_line )
      logical_line    = logical_line filt_line
      bp_len = asorti( break_pos, junk )
      break_pos[bp_len] = length( logical_line ) - 1
    }
    
    
    function print_line( \
                         c0, c1, i, junk, part_str )
    {
      c0 = 0
    
      while( asorti( break_pos, junk ) > 1 )
      {
        if ( ( c1 = shift_valid_bp( break_pos ) ) < 1 )
        {
          part_str = substr( logical_line, c0 + 1 )
          printf( "%s\n", part_str )
          return
        }
    
        part_str = substr( logical_line, c0 + 1, c1 - c0 + 1 )
        gsub( / $/, "\\", part_str )
        printf( "%s\n", part_str )
        c0 = c1 + 1
      }
    
      part_str = substr( logical_line, c0 + 1 )
      printf( "%s\n", part_str )
    }
    
    
    function shrink_spaces( pos, \
                            tail, removed_length, k )
    {
      tail = substr( logical_line, pos )
      sub( /^[ \t]+/, " ", tail )
      removed_length = length( logical_line ) - pos - length( tail ) + 1
      logical_line = substr( logical_line, 0, pos - 1 ) tail
    
    
      for ( k = 0; k < asorti( break_pos, junk ); k++ )
        if ( ( pos + removed_length ) <= break_pos[k] )
          break_pos[k] = break_pos[k] - removed_length;
        else if ( pos <= break_pos[k] )
          break_pos[k] = -1;
    
      return removed_length
    }
    
    
    function shrink_spaces_to_linebreak( pos, \
                                         junk, part_str, removed_length, i )
    {
      for ( i = 0; i < asorti( break_pos, junk ) && break_pos[i] < pos ; i++ )
        ;
    
      if ( break_pos[i] < 1 )
        return;
    
      part_str = substr( logical_line, pos, break_pos[i] - pos + 1 )
      sub( /^[ \t]+/, " ", part_str )
      removed_length = ( break_pos[i] - pos + 1 ) - length( part_str )
    
      tail = substr( logical_line, pos + removed_length )
      logical_line = substr( logical_line, 0, pos - 1 ) tail
    
      for ( ; i < asorti( break_pos, junk ); i++ )
        break_pos[i] -= removed_length;
    
      return removed_length
    }
    
    
    function delete_linebreaks_in_2nd_token( \
                                               tail, paren_depth, junk, i, j, k, l )
    {
      if ( logical_line ~ /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+\(/ )
      {
        tail = logical_line
        sub( /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+/, "", tail )
    
        paren_depth = 0
        l = 0
        i = length( logical_line ) - length( tail ) + 1 # seek to the 1st op paren
        j = i
        do {
          if ( substr( logical_line, j, 2 ) ~ /[ \t][ \t]/ )
            l = shrink_spaces( j );
          else if ( substr( logical_line, j, 1 ) == "(" )
            paren_depth += 1;
          else if ( substr( logical_line, j, 1 ) == ")" )
            paren_depth -= 1;
          j += 1
        } while ( j < length( logical_line ) && paren_depth != 0 )
    
        for ( k = 0; k < asorti( break_pos, junk ); k++ )
          if ( i <= break_pos[k] && break_pos[k] < j )
            break_pos[k] = -1;
    
        if ( l > 0 )
          shrink_spaces_to_linebreak( j );
      }
    }
    
    
    BEGIN{
      init_cpp_src_line()
    }
    {
      append_line( $0 )
      if ( $0 !~ /\\$/ )
      {
        delete_linebreaks_in_2nd_token()
        print_line()
        init_cpp_src_line()
      }
    }
    END{
      if ( 0 < length( logical_line ) )
      {
        delete_linebreaks_in_2nd_token()
        print_line()
      }
    }