| #! /usr/bin/awk -f |
| # unfold <spice.in >spice.out |
| # unfold spice.in >spice.out |
| # |
| # remove continuation lines from spice netlist. |
| # Also absorbs (deletes) CR at end of line (i.e. Windows style CRLF endings convert to unix LF). |
| # |
| # NOTE: If there are comments or blank lines ahead/between continuation lines, they |
| # are "pushed": move such sets of comment/blank-lines AFTER the net resultant active line. |
| # For example: |
| # |
| # * --> * |
| # .param .param abc=123 xyz=456 |
| # |
| # * Comment * Comment |
| # +abc=123 *... |
| # *... *--- |
| # +xyz=456 .save all |
| # *--- |
| # .save all |
| # |
| # What to do if line.2 is a continuation and line.1 is a comment? |
| # (Shouldn't spice treat this as a syntax error)? |
| # Here we never recognize line.1 as a comment, so line.2 gets |
| # joined onto end of line.1. Arguably line.1 should be preserved as-is |
| # always; suppress recognition of continuation at line.2: then if |
| # line.3 is also a continuation, join it to end of line.2 despite |
| # result being a longer line.2 but that still starts with '+'. |
| |
| # remove leading,trailing whitespace or both |
| function ltrim(s) { sub(/^[[:space:]]+/, "", s); return s } |
| function rtrim(s) { sub( /[[:space:]]+$/, "", s); return s } |
| function trim(s) { return rtrim(ltrim(s)); } |
| |
| function unfold(s) { gsub(/[[:space:]]*\n[+][[:space:]]*/, " ", s); return s } |
| |
| { sub(/\r$/,"") } |
| # collect comments and blank lines retaining newlines |
| NR > 1 && ( /^\*/ || /^[:space:]*$/ ) { |
| prevc = prevc $0 "\n" |
| next |
| } |
| # concatenate continuation lines |
| # We strip all '\n+' (plus neighboring whitespace) later at print of |
| # the final/total line (fast, compared to editting an ever lengthening |
| # intermediate line again and again). |
| NR > 1 && /^\+/ { |
| prev = prev "\n" $0 |
| next |
| } |
| { if (NR > 1) print unfold(prev); prev = $0; printf "%s", prevc; prevc = "" } |
| END { if (NR > 0) print unfold(prev); printf "%s", prevc } |