(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TMP)
          op: Equal
          rhs: 
            {
              (braced_var_sub
                token: <VSub_Name TMP>
                suffix_op: (suffix_op.Unary op_id:VTest_ColonHyphen arg_word:{(Lit_Slash /) (tmp)})
              )
            }
        )
      ]
    )
    (C {(readonly)} {(TMP)})
    (command.ShFunction
      name: log
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ($ VSub_Number '$0') (': ') ($ VSub_At '$@'))}]
              redirects: [(redir.Redir op:<Redir_GreatAnd '1>&'> fd:1 arg_word:{(2)})]
            )
          ]
        )
    )
    (command.ShFunction
      name: die
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ($ VSub_Number '$0') (' ERROR: ') ($ VSub_At '$@'))}]
              redirects: [(redir.Redir op:<Redir_GreatAnd '1>&'> fd:1 arg_word:{(2)})]
            )
            (command.ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)})
          ]
        )
    )
    (command.ShFunction
      name: show_help
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(EOF)}
                  here_end_span_id: 127
                  stdin_parts: [
                    ('Usage: ./configure [OPTION]\n')
                    ('\n')
                    ('Detects system settings before a build of Oil.\n')
                    ('\n')
                    ('  --prefix            Prefix for the bin/ directory [/usr/local]\n')
                    ('  --with-readline     Fail unless readline is available.\n')
                    ("  --without-readline  Don't compile with readline, even if it's available.\n")
                    ("\t\t      The shell won't have any interactive features.\n")
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:FLAG_prefix) op:Equal rhs:{(SQ </usr/local>)})]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:FLAG_with_readline) op:Equal rhs:{(SQ )})]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:FLAG_without_readline) op:Equal rhs:{(SQ )})]
    )
    (command.WhileUntil
      keyword: <KW_While while>
      cond: [(command.Sentence child:(C {(true)}) terminator:<Op_Semi ';'>)]
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {(DQ ($ VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [(command.ControlFlow token:<ControlFlow_Break break>)]
                )
                (case_arm
                  pat_list: [{(--help)}]
                  action: [
                    (C {(show_help)})
                    (command.ControlFlow
                      token: <ControlFlow_Exit exit>
                      arg_word: {(0)}
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(--with-readline)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FLAG_with_readline)
                          op: Equal
                          rhs: {(1)}
                        )
                      ]
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(--without-readline)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FLAG_without_readline)
                          op: Equal
                          rhs: {(1)}
                        )
                      ]
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(--prefix) (Lit_Equals '=') (Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FLAG_prefix)
                          op: Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Left_DollarParen '$('>
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (C {(expr)} {(DQ ($ VSub_Number '$1'))} {(Lit_Other ':')} 
                                        {(SQ <'--prefix=\\(.*\\)'>)}
                                      )
                                    ]
                                  )
                              )
                            }
                        )
                      ]
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(--prefix)}]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: (C {(test)} {($ VSub_Pound '$#')} {(-eq)} {(1)})
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [(C {(die)} {(DQ ('--prefix requires an argument'))})]
                        )
                      ]
                    )
                    (C {(shift)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FLAG_prefix)
                          op: Equal
                          rhs: {($ VSub_Number '$1')}
                        )
                      ]
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(Lit_Star '*')}]
                  action: [(C {(die)} {(DQ ("Invalid argument '") ($ VSub_Number '$1') ("'"))})]
                )
              ]
            )
            (C {(shift)})
          ]
        )
    )
    (command.ShFunction
      name: cc_quiet
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cc)} {(DQ ($ VSub_At '$@'))} {(-o)} {(/dev/null)}]
              redirects: [
                (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})
                (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: cc_or_die
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [
                            (command.Simple
                              words: [{(cc)} {(DQ ($ VSub_At '$@'))}]
                              redirects: [
                                (redir.Redir
                                  op: <Redir_Great '>'>
                                  fd: 16777215
                                  arg_word: {($ VSub_DollarName '$TMP') (/cc.log)}
                                )
                                (redir.Redir
                                  op: <Redir_GreatAnd '2>&'>
                                  fd: 2
                                  arg_word: {(1)}
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(log)} {(DQ ("Error running 'cc ") ($ VSub_At '$@') ("':"))})
                    (C {(cat)} {($ VSub_DollarName '$TMP') (/cc.log)})
                    (C {(die)} {(DQ ('Fatal compile error running feature test'))})
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: cc_statement
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Lit_VarLike 'pp_var=') (DQ ($ VSub_Number '$1'))})
            (C {(local)} {(Lit_VarLike 'prog=') (DQ ($ VSub_Number '$2'))})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$TMP') (/cc_statement.c)}
                )
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(EOF)}
                  here_end_span_id: 456
                  stdin_parts: [('int main() {\n') ('  ') ($ VSub_DollarName '$prog') ('\n') ('}\n')]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {(cc_quiet)} {($ VSub_DollarName '$TMP') (/cc_statement.c)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('#define ') ($ VSub_DollarName '$pp_var') (' 1'))})
                    (command.ControlFlow
                      token: <ControlFlow_Return return>
                      arg_word: {(0)}
                    )
                  ]
                )
              ]
              else_action: [(command.ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})]
            )
          ]
        )
    )
    (command.ShFunction
      name: detect_readline
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {(cc_quiet)} {(build/detect-readline.c)} {(-l)} {(readline)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(echo)} {(SQ <'HAVE_READLINE=1'>)})]
                )
              ]
              else_action: [
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.Sentence
                          child: 
                            (C {(test)} {(DQ ($ VSub_DollarName '$FLAG_with_readline'))} 
                              {(Lit_Equals '=')} {(1)}
                            )
                          terminator: <Op_Semi ';'>
                        )
                      ]
                      action: [
                        (C {(die)} 
                          {(SQ <'readline was not detected on the system (--with-readline passed).'>)}
                        )
                      ]
                    )
                  ]
                )
                (C {(echo)} {(SQ <'HAVE_READLINE='>)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: detect_and_echo_vars
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(test)} {(DQ ($ VSub_DollarName '$FLAG_without_readline'))} 
                          {(Lit_Equals '=')} {(1)}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(echo)} {(SQ <'HAVE_READLINE='>)})]
                )
              ]
              else_action: [(C {(detect_readline)})]
            )
            (C {(echo)} {(DQ ('PREFIX=') ($ VSub_DollarName '$FLAG_prefix'))})
          ]
        )
    )
    (command.ShFunction
      name: cc_print_expr
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Lit_VarLike 'c_expr=') (DQ ($ VSub_Number '$1'))})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$TMP') (/print_expr.c)}
                )
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(EOF)}
                  here_end_span_id: 661
                  stdin_parts: [
                    ('#include <stdio.h>\n')
                    ('#include <sys/types.h>  /* size_t, pid_t */\n')
                    ('\n')
                    ('int main() {\n')
                    ('  printf(')
                    (Right_DoubleQuote '"')
                    ('%lu')
                    (Right_DoubleQuote '"')
                    (', ')
                    ($ VSub_DollarName '$c_expr')
                    (');\n')
                    ('}\n')
                  ]
                )
              ]
            )
            (C {(cc_or_die)} {(-o)} {($ VSub_DollarName '$TMP') (/print_expr)} 
              {($ VSub_DollarName '$TMP') (/print_expr.c)}
            )
            (command.Simple
              words: [{($ VSub_DollarName '$TMP') (/print_expr)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$TMP') (/print_expr.out)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_sizeof
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Lit_VarLike 'pp_var=') (DQ ($ VSub_Number '$1'))})
            (C {(local)} {(Lit_VarLike 'c_type=') (DQ ($ VSub_Number '$2'))})
            (C {(local)} {(Lit_VarLike 'min_bytes=') (DQ ($ VSub_Number '$3'))})
            (C {(cc_print_expr)} {(DQ ('sizeof(') ($ VSub_DollarName '$c_type') (')'))})
            (C {(local)} {(actual_bytes)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:actual_bytes)
                  op: Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Left_DollarParen '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {(cat)} {($ VSub_DollarName '$TMP') (/print_expr.out)})]
                          )
                      )
                    }
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.AndOr
                          ops: [Op_DAmp]
                          children: [
                            (C {(test)} {(-n)} {(DQ ($ VSub_DollarName '$min_bytes'))})
                            (C {(test)} {(DQ ($ VSub_DollarName '$actual_bytes'))} {(-lt)} 
                              {(DQ ($ VSub_DollarName '$min_bytes'))}
                            )
                          ]
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(die)} 
                      {
                        (DQ ('sizeof(') ($ VSub_DollarName '$c_type') (') should be at least ') 
                          ($ VSub_DollarName '$min_bytes') ('; got ') ($ VSub_DollarName '$actual_bytes')
                        )
                      }
                    )
                  ]
                )
              ]
            )
            (C {(echo)} 
              {
                (DQ ('#define ') ($ VSub_DollarName '$pp_var') (' ') ($ VSub_DollarName '$actual_bytes'))
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: detect_c_language
      body: 
        (command.BraceGroup
          children: [
            (C {(check_sizeof)} {(SIZEOF_INT)} {(SQ <int>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_LONG)} {(SQ <long>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_VOID_P)} {(SQ <'void *'>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_SHORT)} {(SQ <short>)} {(2)})
            (C {(check_sizeof)} {(SIZEOF_FLOAT)} {(SQ <float>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_DOUBLE)} {(SQ <double>)} {(8)})
            (C {(check_sizeof)} {(SIZEOF_SIZE_T)} {(SQ <size_t>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_FPOS_T)} {(SQ <fpos_t>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_PID_T)} {(SQ <pid_t>)} {(4)})
            (C {(check_sizeof)} {(SIZEOF_OFF_T)} {(SQ <off_t>)} {(SQ )})
            (C {(check_sizeof)} {(SIZEOF_TIME_T)} {(SQ <time_t>)} {(SQ )})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {(cc_statement)} {(HAVE_LONG_LONG)} {(SQ <'long long x; x = (long long)0;'>)})
                  ]
                  action: [(C {(check_sizeof)} {(SIZEOF_LONG_LONG)} {(SQ <'long long'>)} {(8)})]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {(cc_statement)} {(HAVE_LONG_DOUBLE)} 
                      {(SQ <'long double x; x = (long double)0;'>)}
                    )
                  ]
                  action: [(C {(check_sizeof)} {(SIZEOF_LONG_DOUBLE)} {(SQ <'long double'>)} {(8)})]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [(C {(cc_statement)} {(HAVE_C99_BOOL)} {(SQ <'_Bool x; x = (_Bool)0;'>)})]
                  action: [(C {(check_sizeof)} {(SIZEOF__BOOL)} {(SQ <_Bool>)} {(1)})]
                )
              ]
            )
            (C {(echo)} {(SQ <'#define HAVE_WCHAR_H 1'>)})
            (C {(echo)} {(SQ <'#define SIZEOF_WCHAR_T 4'>)})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$TMP') (/detect_va_list.c)}
                )
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(EOF)}
                  here_end_span_id: 1144
                  stdin_parts: [
                    ('#include <stdarg.h>  /* C89 */\n')
                    ('int main() {\n')
                    ('  va_list list1, list2;\n')
                    ('  list1 = list2;\n')
                    ('}\n')
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {(cc_quiet)} {($ VSub_DollarName '$TMP') (/detect_va_list.c)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(echo)} {(SQ )})]
                )
              ]
              else_action: [(C {(echo)} {(SQ <'#define VA_LIST_IS_ARRAY 1'>)})]
            )
          ]
        )
    )
    (command.ShFunction
      name: main
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [(C {(cc_quiet)} {(build/detect-cc.c)})]
                          negated: T
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(die)} {(DQ ("Couldn't compile a basic C program (cc not installed?)"))})]
                )
              ]
            )
            (C {(mkdir)} {(-p)} {(_build)})
            (C {(local)} {(Lit_VarLike 'sh_out=') (_build/detected-config.sh)})
            (C {(local)} {(Lit_VarLike 'c_out=') (_build/detected-config.h)})
            (command.Simple
              words: [{(detect_and_echo_vars)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$sh_out')}
                )
              ]
            )
            (command.Simple
              words: [{(detect_c_language)}]
              redirects: [
                (redir.Redir
                  op: <Redir_Great '>'>
                  fd: 16777215
                  arg_word: {($ VSub_DollarName '$c_out')}
                )
              ]
            )
            (C {(log)} 
              {(DQ ('Wrote ') ($ VSub_DollarName '$sh_out') (' and ') ($ VSub_DollarName '$c_out'))}
            )
          ]
        )
    )
    (command.ShFunction
      name: unittest
      body: 
        (command.BraceGroup
          children: [
            (C {(cc_print_expr)} {(SQ <'sizeof(int)'>)})
            (C {(local)} {(actual)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:actual)
                  op: Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Left_DollarParen '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {(cat)} {($ VSub_DollarName '$TMP') (/print_expr.out)})]
                          )
                      )
                    }
                )
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (C {(test)} {(DQ ($ VSub_DollarName '$actual'))} {(Lit_Equals '=')} {(4)})
                (C {(die)} {(DQ ('Expected 4, got ') ($ VSub_DollarName '$actual'))})
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (C {(check_sizeof)} {(SIZEOF_INT)} {(SQ <int>)} {(4)})
                (C {(die)} {(DQ (FAILED))})
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (C {(cc_statement)} {(HAVE_INT)} {(SQ <'int x = (int)0;'>)})
                (C {(die)} {(DQ (FAILED))})
              ]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (C {(cc_statement)} {(HAVE_FOO)} {(SQ <'foo x = (foo)0;'>)})
                (C {(die)} {(DQ ('Expected to fail'))})
              ]
            )
          ]
        )
    )
    (C {(main)} {(DQ ($ VSub_At '$@'))})
  ]
)