/modules/freetype2/builds/atari/deflinejoiner.awk
http://github.com/zpao/v8monkey · AWK · 181 lines · 142 code · 38 blank · 1 comment · 31 complexity · 31e0a62bf6df66f3b70b2805f55ecd72 MD5 · raw file
- #!/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()
- }
- }