tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

deflinejoiner.awk (3962B)


      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 }