import sys
import string
import inspect

def stack_find(symbol, level='stack') :
    label="_casa_top_frame_"
    a=inspect.stack()
    stacklevel=0
    if level == "stack":
        for k in range(len(a)):
            if a[k][1].startswith("<ipython-input-") or \
               string.find(a[k][1], 'ipython console') > 0 or \
               string.find(a[k][1],"/casapy.py") > 0 or \
               string.find(a[k][1],"/casa.py") > 0 or \
               string.find(a[k][1],"mpi4casapy.py") > 0:
                stacklevel=k
                # jagonzal: Take the first level that matches the requirement
                break

        myf=sys._getframe(stacklevel).f_globals

        if myf.has_key(symbol) and myf.has_key(label) :
            return myf[symbol]

        else:
            return None

    elif level == "root":
        for k in range(len(a)):
            if string.find(a[k][1],"start_casa.py") > 0:
                stacklevel=k
                # jagonzal: Take the first level that matches the requirement
                break

        myf=sys._getframe(stacklevel).f_globals

        if myf.has_key(symbol) :
            return myf[symbol]

        else:
            return None

    else:
        raise RuntimeError("unknown stack level %s" % level)


def stack_frame_find(level='stack') :
    label="_casa_top_frame_"
    a=inspect.stack()
    stacklevel=0
    if level == "stack":
        for k in range(len(a)):
            if a[k][1].startswith("<ipython-input-") or \
               string.find(a[k][1], 'ipython console') > 0 or \
               string.find(a[k][1],"/casapy.py") > 0 or \
               string.find(a[k][1],"/casa.py") > 0 or \
               string.find(a[k][1],'/MPICommandServer.py') > 0 or \
               string.find(a[k][1],"mpi4casapy.py") > 0:
                stacklevel=k
                # jagonzal: Take the first level that matches the requirement
                break
    elif level == "root":
        for k in range(len(a)):
            if string.find(a[k][1],"start_casa.py") > 0:
                stacklevel=k
                # jagonzal: Take the first level that matches the requirement
                break
    else:
        raise RuntimeError("unknown stack level %s" % level)

    myf=sys._getframe(stacklevel).f_globals

    if myf.has_key(label) :
        return myf
    else:
        return None

def find_casa( ):
    return stack_find('casa')