Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #!/usr/bin/env awk
  2.  
  3.  
  4. function shift( array, \
  5.                 junk, elm0, l )
  6. {
  7.   elm0 = array[0]
  8.   for ( l = 0; l < asorti( array, junk ) - 1; l++ )
  9.     array[l] = array[l+1];
  10.   delete array[l]
  11.   return elm0
  12. }
  13.  
  14.  
  15. function init_cpp_src_line()
  16. {
  17.   logical_line = ""
  18.   delete break_pos
  19. }
  20.  
  21.  
  22. function shift_valid_bp( array, \
  23.                          junk, elm )
  24. {
  25.   elm = -1
  26.  
  27.   if ( 0 < asorti( array, junk ) )
  28.     do {
  29.       elm = shift( array )
  30.     } while ( 0 > elm );
  31.  
  32.   return elm
  33. }
  34.  
  35.  
  36. function check_cpp_src_line_break_pos( \
  37.                                        i, junk )
  38. {
  39.   printf( "break_pos:" )
  40.   for ( i = 0; i < asorti( break_pos, junk ); i++ )
  41.     printf( " %d", break_pos[i] );
  42.   printf( "\n" )
  43. }
  44.  
  45.  
  46. function check_cpp_src_line()
  47. {
  48.   printf( "logical_line[%s]\n", logical_line )
  49.   check_cpp_src_line_break_pos()
  50. }
  51.  
  52.  
  53. function append_line( phys_line, \
  54.                       filt_line, bp_len )
  55. {
  56.   filt_line = phys_line
  57.   sub( /\\$/, " ", filt_line )
  58.   logical_line    = logical_line filt_line
  59.   bp_len = asorti( break_pos, junk )
  60.   break_pos[bp_len] = length( logical_line ) - 1
  61. }
  62.  
  63.  
  64. function print_line( \
  65.                      c0, c1, i, junk, part_str )
  66. {
  67.   c0 = 0
  68.  
  69.   while( asorti( break_pos, junk ) > 1 )
  70.   {
  71.     if ( ( c1 = shift_valid_bp( break_pos ) ) < 1 )
  72.     {
  73.       part_str = substr( logical_line, c0 + 1 )
  74.       printf( "%s\n", part_str )
  75.       return
  76.     }
  77.  
  78.     part_str = substr( logical_line, c0 + 1, c1 - c0 + 1 )
  79.     gsub( / $/, "\\", part_str )
  80.     printf( "%s\n", part_str )
  81.     c0 = c1 + 1
  82.   }
  83.  
  84.   part_str = substr( logical_line, c0 + 1 )
  85.   printf( "%s\n", part_str )
  86. }
  87.  
  88.  
  89. function shrink_spaces( pos, \
  90.                         tail, removed_length, k )
  91. {
  92.   tail = substr( logical_line, pos )
  93.   sub( /^[ \t]+/, " ", tail )
  94.   removed_length = length( logical_line ) - pos - length( tail ) + 1
  95.   logical_line = substr( logical_line, 0, pos - 1 ) tail
  96.  
  97.  
  98.   for ( k = 0; k < asorti( break_pos, junk ); k++ )
  99.     if ( ( pos + removed_length ) <= break_pos[k] )
  100.       break_pos[k] = break_pos[k] - removed_length;
  101.     else if ( pos <= break_pos[k] )
  102.       break_pos[k] = -1;
  103.  
  104.   return removed_length
  105. }
  106.  
  107.  
  108. function shrink_spaces_to_linebreak( pos, \
  109.                                      junk, part_str, removed_length, i )
  110. {
  111.   for ( i = 0; i < asorti( break_pos, junk ) && break_pos[i] < pos ; i++ )
  112.     ;
  113.  
  114.   if ( break_pos[i] < 1 )
  115.     return;
  116.  
  117.   part_str = substr( logical_line, pos, break_pos[i] - pos + 1 )
  118.   sub( /^[ \t]+/, " ", part_str )
  119.   removed_length = ( break_pos[i] - pos + 1 ) - length( part_str )
  120.  
  121.   tail = substr( logical_line, pos + removed_length )
  122.   logical_line = substr( logical_line, 0, pos - 1 ) tail
  123.  
  124.   for ( ; i < asorti( break_pos, junk ); i++ )
  125.     break_pos[i] -= removed_length;
  126.  
  127.   return removed_length
  128. }
  129.  
  130.  
  131. function delete_linebreaks_in_2nd_token( \
  132.                                            tail, paren_depth, junk, i, j, k, l )
  133. {
  134.   if ( logical_line ~ /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+\(/ )
  135.   {
  136.     tail = logical_line
  137.     sub( /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+/, "", tail )
  138.  
  139.     paren_depth = 0
  140.     l = 0
  141.     i = length( logical_line ) - length( tail ) + 1 # seek to the 1st op paren
  142.     j = i
  143.     do {
  144.       if ( substr( logical_line, j, 2 ) ~ /[ \t][ \t]/ )
  145.         l = shrink_spaces( j );
  146.       else if ( substr( logical_line, j, 1 ) == "(" )
  147.         paren_depth += 1;
  148.       else if ( substr( logical_line, j, 1 ) == ")" )
  149.         paren_depth -= 1;
  150.       j += 1
  151.     } while ( j < length( logical_line ) && paren_depth != 0 )
  152.  
  153.     for ( k = 0; k < asorti( break_pos, junk ); k++ )
  154.       if ( i <= break_pos[k] && break_pos[k] < j )
  155.         break_pos[k] = -1;
  156.  
  157.     if ( l > 0 )
  158.       shrink_spaces_to_linebreak( j );
  159.   }
  160. }
  161.  
  162.  
  163. BEGIN{
  164.   init_cpp_src_line()
  165. }
  166. {
  167.   append_line( $0 )
  168.   if ( $0 !~ /\\$/ )
  169.   {
  170.     delete_linebreaks_in_2nd_token()
  171.     print_line()
  172.     init_cpp_src_line()
  173.   }
  174. }
  175. END{
  176.   if ( 0 < length( logical_line ) )
  177.   {
  178.     delete_linebreaks_in_2nd_token()
  179.     print_line()
  180.   }
  181. }
  182.