#!/usr/bin/env python3

# Automatically formatted with yapf (https://github.com/google/yapf)

# Fake 'opt' program that can be made to crash on request. For testing
# the 'reduce_pipeline.py' automatic 'opt' NPM pipeline reducer.

import argparse
import os
import shutil
import signal

parser = argparse.ArgumentParser()
parser.add_argument('-passes', action='store', dest='passes', required=True)
parser.add_argument('-print-pipeline-passes',
                    dest='print_pipeline_passes',
                    action='store_true')
parser.add_argument('-crash-seq',
                    action='store',
                    dest='crash_seq',
                    required=True)
parser.add_argument('-o', action='store', dest='output')
parser.add_argument('input')
[args, unknown_args] = parser.parse_known_args()

# Expand pipeline if '-print-pipeline-passes'.
if args.print_pipeline_passes:
    if args.passes == 'EXPAND_a_to_f':
        print('a,b,c,d,e,f')
    else:
        print(args.passes)
    exit(0)

# Parse '-crash-seq'.
crash_seq = []
tok = ''
for c in args.crash_seq:
    if c == ',':
        if tok != '':
            crash_seq.append(tok)
        tok = ''
    else:
        tok += c
if tok != '':
    crash_seq.append(tok)
print(crash_seq)

# Parse '-passes' and see if we need to crash.
tok = ''
for c in args.passes:
    if c == ',':
        if len(crash_seq) > 0 and crash_seq[0] == tok:
            crash_seq.pop(0)
        tok = ''
    elif c == '(':
        tok = ''
    elif c == ')':
        if len(crash_seq) > 0 and crash_seq[0] == tok:
            crash_seq.pop(0)
        tok = ''
    else:
        tok += c
if len(crash_seq) > 0 and crash_seq[0] == tok:
    crash_seq.pop(0)

# Copy input to output.
if args.output:
    shutil.copy(args.input, args.output)

# Crash if all 'crash_seq' passes occured in right order.
if len(crash_seq) == 0:
    print('crash')
    os.kill(os.getpid(), signal.SIGKILL)
else:
    print('no crash')
    exit(0)
