#!/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()
  }
}
