#!/usr/bin/env python
"""Parser for parsing iocShell cd commands
These take these forms
1) cd ${TOP}
2) cd("${IOC_DATA}/${IOC}/autosave-req")
3) chdir("../..")
4) chdir ${TOP}
"""
from __future__ import print_function

import re

# Form regex patterns for the six possible forms
epicsCdPatterns = []
patternComponentLists = [
    ['cd', r'\(', r'"([^"]+)"', r'\)'],      # cd("${IOC_DATA}/${IOC}/autosave-req")
    ['cd', r'\(', r'([^()\s]+)', r'\)'],     # cd(${TOP})
    ['cd ', r'(\S+)'],                       # cd ${TOP}
    ['chdir', r'\(', r'"([^"]+)"', r'\)'],   # chdir("../..")
    ['chdir', r'\(', r'([^()\s]+)', r'\)'],  # chdir(${TOP})
    ['chdir ', r'(\S+)'],                    # chdir ${TOP}
]
for patternComponents in patternComponentLists:
    # Allow spaces between components and comments at the end
    pattern = r'^\s*{}\s*(?:#.*)?$'.format(r'\s*'.join(patternComponents))
    epicsCdPatterns.append(re.compile(pattern))

def multiRegexMatch(regexPatterns, text):
    '''Matches text against multiple regex patterns'''
    for pattern in regexPatterns:
        result = pattern.match(text)
        if result:
            return result

    return None

def parseEpicsCDCommand(line):
    '''Parses a epics cd command and returns the folder name we are cd'ing to'''
    result = multiRegexMatch(epicsCdPatterns, line)
    if result:
        return result.group(1)

    return line


if __name__ == "__main__":
    print('|' + parseEpicsCDCommand('cd ${TOP}') + '|')
    print('|' + parseEpicsCDCommand('cd(${TOP})') + '|')
    print('|' + parseEpicsCDCommand('cd("${IOC_DATA}/${IOC}/autosave-req")') + '|')
    print('|' + parseEpicsCDCommand('cd(${IOC_DATA}/${IOC}/autosave-req)') + '|')
    print('|' + parseEpicsCDCommand('cd ${IOC_DATA}/${IOC}/autosave-req') + '|')
    print('|' + parseEpicsCDCommand('cd("${IOC_DATA}/${IOC}/autosave-req")  ') + '|')
    print('|' + parseEpicsCDCommand('cd $(AREA_DETECTOR)/ADApp/Db') + '|')
    print('|' + parseEpicsCDCommand('chdir("../..")') + '|')
    print('|' + parseEpicsCDCommand('chdir ${TOP}') + '|')
    
