(CommandList children: [ (C {(set)} {(-e)}) (AndOr children: [ (SimpleCommand words: [{(command)} {(-v)} {(tput)}] redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(/dev/null)} spids:[17])] ) (C {(exec)} {(grep)} {(-v)} {(DQ ('^begin '))}) ] op_id: Op_DPipe ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:header_pattern) op: Equal rhs: {(SQ <'[0-9]+\\.\\.[0-9]+'>)} spids: [33] ) ] spids: [33] ) (SimpleCommand words: [{(read)} {(-r)} {(header)}] more_env: [(env_pair name:IFS val:{(SQ )} spids:[38])] ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_EqualTilde left: {(DQ ($ VSub_Name '$header'))} right: {($ VSub_Name '$header_pattern')} ) ) terminator: <Op_Semi ';'> ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:count) op: Equal rhs: { (DQ (BracedVarSub token: <VSub_Name header> suffix_op: (Slice begin:(ArithWord w:{(Lit_Digits 3)})) spids: [67 71] ) ) } spids: [65] ) ] spids: [65] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:index) op:Equal rhs:{(0)} spids:[75])] spids: [75] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:failures) op:Equal rhs:{(0)} spids:[79])] spids: [79] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:skipped) op:Equal rhs:{(0)} spids:[83])] spids: [83] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:name) op:Equal rhs:{(DQ )} spids:[87])] spids: [87] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:count_column_width) op: Equal rhs: { (ArithSubPart anode: (ArithBinary op_id: Arith_Plus left: (ArithBinary op_id: Arith_Star left: (ArithWord w: { (BracedVarSub token: <VSub_Name count> prefix_op: VSub_Pound spids: [95 98] ) } ) right: (ArithWord w:{(Lit_Digits 2)}) ) right: (ArithWord w:{(Lit_Digits 2)}) ) spids: [93 109] ) } spids: [92] ) ] spids: [92] ) ] spids: [16777215 62] ) ] else_action: [ (C {(printf)} {(DQ ('%s') (Lit_Other '\\') (n))} {(DQ ($ VSub_Name '$header'))}) (C {(exec)} {(cat)}) ] spids: [111 135] ) (FuncDef name: update_screen_width body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:screen_width) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children:[(C {(tput)} {(cols)})]) left_token: <Left_CommandSub '$('> spids: [147 151] ) ) } spids: [145] ) ] spids: [145] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:count_column_left) op: Equal rhs: { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithWord w:{($ VSub_Name '$screen_width')}) right: (ArithWord w:{($ VSub_Name '$count_column_width')}) ) spids: [156 165] ) } spids: [155] ) ] spids: [155] ) ] spids: [142] ) spids: [138 141] ) (C {(trap)} {(update_screen_width)} {(WINCH)}) (C {(update_screen_width)}) (FuncDef name: begin body: (BraceGroup children: [ (C {(go_to_column)} {(0)}) (C {(printf_with_truncation)} { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithWord w:{($ VSub_Name '$count_column_left')}) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [193 202] ) } {(DQ (' %s'))} {(DQ ($ VSub_Name '$name'))} ) (C {(clear_to_end_of_line)}) (C {(go_to_column)} {($ VSub_Name '$count_column_left')}) (C {(printf)} { (DQ ('%') (BracedVarSub token:<VSub_Name count> prefix_op:VSub_Pound spids:[225 228]) (s/) (${ VSub_Name count) ) } {(DQ ($ VSub_Name '$index'))} ) (C {(go_to_column)} {(1)}) ] spids: [183] ) spids: [179 182] ) (FuncDef name: pass body: (BraceGroup children: [ (C {(go_to_column)} {(0)}) (C {(printf)} {(DQ (' \xe2\x9c\x93 %s'))} {(DQ ($ VSub_Name '$name'))}) (C {(advance)}) ] spids: [251] ) spids: [247 250] ) (FuncDef name: skip body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:reason) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [284] ) ] spids: [282] ) (AndOr children: [ (C {(Lit_Other '[')} {(-z)} {(DQ ($ VSub_Name '$reason'))} {(Lit_Other ']')}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:reason) op: Equal rhs: {(DQ (': ') ($ VSub_Name '$reason'))} spids: [302] ) ] spids: [302] ) ] op_id: Op_DPipe ) (C {(go_to_column)} {(0)}) (C {(printf)} {(DQ (' - %s (skipped%s)'))} {(DQ ($ VSub_Name '$name'))} {(DQ ($ VSub_Name '$reason'))} ) (C {(advance)}) ] spids: [279] ) spids: [275 278] ) (FuncDef name: fail body: (BraceGroup children: [ (C {(go_to_column)} {(0)}) (C {(set_color)} {(1)} {(bold)}) (C {(printf)} {(DQ (' \xe2\x9c\x97 %s'))} {(DQ ($ VSub_Name '$name'))}) (C {(advance)}) ] spids: [338] ) spids: [334 337] ) (FuncDef name: log body: (BraceGroup children: [ (C {(set_color)} {(1)}) (C {(printf)} {(DQ (' %s') (Lit_Other '\\') (n))} {(DQ ($ VSub_Number '$1'))}) (C {(clear_color)}) ] spids: [373] ) spids: [369 372] ) (FuncDef name: summary body: (BraceGroup children: [ (C {(printf)} {(DQ (Lit_Other '\\') ('n%d test%s'))} {(DQ ($ VSub_Name '$count'))} { (DQ (CommandSubPart command_list: (CommandList children: [(C {(plural)} {(DQ ($ VSub_Name '$count'))})] ) left_token: <Left_CommandSub '$('> spids: [418 424] ) ) } ) (C {(printf)} {(DQ (', %d failure%s'))} {(DQ ($ VSub_Name '$failures'))} { (DQ (CommandSubPart command_list: (CommandList children: [(C {(plural)} {(DQ ($ VSub_Name '$failures'))})] ) left_token: <Left_CommandSub '$('> spids: [440 446] ) ) } ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$skipped'))} {(-gt)} {(0)} {(Lit_Other ']')} ) terminator: <Op_Semi ';'> ) ] action: [(C {(printf)} {(DQ (', %d skipped'))} {(DQ ($ VSub_Name '$skipped'))})] spids: [16777215 466] ) ] spids: [16777215 480] ) (C {(printf)} {(DQ (Lit_Other '\\') (n))}) ] spids: [403] ) spids: [399 402] ) (FuncDef name: printf_with_truncation body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:width) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [503] ) ] spids: [501] ) (C {(shift)}) (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:string) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children: [(C {(printf)} {(DQ ($ VSub_At '$@'))})] ) left_token: <Left_CommandSub '$('> spids: [516 522] ) ) } spids: [514] ) ] spids: [512] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other '[')} { (DQ (BracedVarSub token: <VSub_Name string> prefix_op: VSub_Pound spids: [532 535] ) ) } {(-gt)} {(DQ ($ VSub_Name '$width'))} {(Lit_Other ']')} ) terminator: <Op_Semi ';'> ) ] action: [ (C {(printf)} {(DQ ('%s...'))} { (DQ (BracedVarSub token: <VSub_Name string> suffix_op: (Slice begin: (ArithWord w:{(Lit_Digits 0)}) length: (ArithWord w: { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithWord w:{($ VSub_Name '$width')}) right: (ArithWord w:{(Lit_Digits 4)}) ) spids: [562 571] ) } ) ) spids: [557 572] ) ) } ) ] spids: [16777215 547] ) ] else_action: [(C {(printf)} {(DQ ('%s'))} {(DQ ($ VSub_Name '$string'))})] spids: [576 590] ) ] spids: [498] ) spids: [494 497] ) (FuncDef name: go_to_column body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:column) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [604] ) ] spids: [602] ) (C {(printf)} {(DQ (Lit_Other '\\') ('x1B[%dG'))} { (ArithSubPart anode: (ArithBinary op_id: Arith_Plus left: (ArithWord w:{($ VSub_Name '$column')}) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [617 626] ) } ) ] spids: [599] ) spids: [595 598] ) (FuncDef name: clear_to_end_of_line body: (BraceGroup children:[(C {(printf)} {(DQ (Lit_Other '\\') ('x1B[K'))})] spids:[635]) spids: [631 634] ) (FuncDef name: advance body: (BraceGroup children: [(C {(clear_to_end_of_line)}) (C {(echo)}) (C {(clear_color)})] spids: [652] ) spids: [648 651] ) (FuncDef name: set_color body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:color) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [675] ) ] spids: [673] ) (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:weight) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} spids: [683] ) ] spids: [681] ) (C {(printf)} {(DQ (Lit_Other '\\') ('x1B[%d;%dm'))} { (ArithSubPart anode: (ArithBinary op_id: Arith_Plus left: (ArithWord w:{(Lit_Digits 30)}) right: (ArithWord w:{($ VSub_Name '$color')}) ) spids: [696 705] ) } { (DQ (CommandSubPart command_list: (CommandList children: [ (AndOr children: [ (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$weight'))} {(Lit_Other '=')} {(DQ (bold))} {(Lit_Other ']')} ) (AndOr children: [(C {(echo)} {(1)}) (C {(echo)} {(22)})] op_id: Op_DPipe ) ] op_id: Op_DAmp ) ] ) left_token: <Left_CommandSub '$('> spids: [708 736] ) ) } ) ] spids: [670] ) spids: [666 669] ) (FuncDef name: clear_color body: (BraceGroup children:[(C {(printf)} {(DQ (Lit_Other '\\') ('x1B[0m'))})] spids:[746]) spids: [742 745] ) (FuncDef name: plural body: (BraceGroup children: [ (AndOr children: [ (C {(Lit_Other '[')} {(DQ ($ VSub_Number '$1'))} {(-eq)} {(1)} {(Lit_Other ']')}) (C {(echo)} {(DQ (s))}) ] op_id: Op_DPipe ) ] spids: [763] ) spids: [759 762] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:_buffer) op:Equal rhs:{(DQ )} spids:[789])] spids: [789] ) (FuncDef name: buffer body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_buffer) op: Equal rhs: { (DQ (${ VSub_Name _buffer) (CommandSubPart command_list: (CommandList children:[(C {(DQ ($ VSub_At '$@'))})]) left_token: <Left_CommandSub '$('> spids: [806 810] ) ) } spids: [801] ) ] spids: [801] ) ] spids: [798] ) spids: [794 797] ) (FuncDef name: flush body: (BraceGroup children: [ (C {(printf)} {(DQ ('%s'))} {(DQ ($ VSub_Name '$_buffer'))}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:_buffer) op:Equal rhs:{(DQ )} spids:[834])] spids: [834] ) ] spids: [820] ) spids: [816 819] ) (FuncDef name: finish body: (BraceGroup children: [(C {(flush)}) (C {(printf)} {(DQ (Lit_Other '\\') (n))})] spids: [845] ) spids: [841 844] ) (C {(trap)} {(finish)} {(EXIT)}) (While cond: [ (Sentence child: (SimpleCommand words: [{(read)} {(-r)} {(line)}] more_env: [(env_pair name:IFS val:{(SQ )} spids:[870])] ) terminator: <Op_Semi ';'> ) ] body: (DoGroup children: [ (Case to_match: {(DQ ($ VSub_Name '$line'))} arms: [ (case_arm pat_list: [{(DQ ('begin ')) (Lit_Other '*')}] action: [ (C {(let)} {(Lit_VarLike 'index+=') (1)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:name) op: Equal rhs: { (DQ (BracedVarSub token: <VSub_Name line> suffix_op: (StringUnary op_id: VOp1_Pound arg_word: {('* ') ($ VSub_Name '$index') (' ')} ) spids: [907 913] ) ) } spids: [905] ) ] spids: [905] ) (C {(buffer)} {(begin)}) (C {(flush)}) ] spids: [892 896 925 16777215] ) (case_arm pat_list: [{(DQ ('ok ')) (Lit_Other '*')}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:skip_expr) op: Equal rhs: { (DQ ('ok ') ($ VSub_Name '$index') (' # skip (') (Lit_Other '\\') ('(([^)]*)') (Lit_Other '\\') ('))?') ) } spids: [936] ) ] spids: [936] ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_EqualTilde left: {(DQ ($ VSub_Name '$line'))} right: {($ VSub_Name '$skip_expr')} ) ) terminator: <Op_Semi ';'> ) ] action: [ (C {(let)} {(Lit_VarLike 'skipped+=') (1)}) (C {(buffer)} {(skip)} { (DQ (BracedVarSub token: <VSub_Name BASH_REMATCH> bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 2)})) spids: [977 982] ) ) } ) ] spids: [16777215 963] ) ] else_action: [(C {(buffer)} {(pass)})] spids: [986 994] ) ] spids: [929 933 997 16777215] ) (case_arm pat_list: [{(DQ ('not ok ')) (Lit_Other '*')}] action: [(C {(let)} {(Lit_VarLike 'failures+=') (1)}) (C {(buffer)} {(fail)})] spids: [1001 1005 1019 16777215] ) (case_arm pat_list: [{(DQ ('# ')) (Lit_Other '*')}] action: [ (C {(buffer)} {(log)} { (DQ (BracedVarSub token: <VSub_Name line> suffix_op: (Slice begin:(ArithWord w:{(Lit_Digits 2)})) spids: [1035 1039] ) ) } ) ] spids: [1023 1027 1043 16777215] ) ] spids: [882 888 1046] ) ] spids: [879 1048] ) ) (C {(buffer)} {(summary)}) ] )