PageRenderTime 36ms CodeModel.GetById 22ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/freetype2/builds/atari/deflinejoiner.awk

http://github.com/zpao/v8monkey
AWK | 181 lines | 162 code | 18 blank | 1 comment | 0 complexity | 31e0a62bf6df66f3b70b2805f55ecd72 MD5 | raw file
  1#!/usr/bin/env awk
  2
  3
  4function 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
 15function init_cpp_src_line()
 16{
 17  logical_line = ""
 18  delete break_pos 
 19}
 20
 21
 22function 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
 36function 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
 46function check_cpp_src_line()
 47{
 48  printf( "logical_line[%s]\n", logical_line )
 49  check_cpp_src_line_break_pos()
 50}
 51
 52
 53function 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
 64function 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
 89function 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
108function 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
131function 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
163BEGIN{
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}
175END{
176  if ( 0 < length( logical_line ) )
177  {
178    delete_linebreaks_in_2nd_token()
179    print_line()
180  }
181}