"""Extract unchanged production definitions for SDK-faked host tests."""
import re


def definition(source, name, struct=False):
    pattern = r'\bstruct\s+'+name+r'\s*\{' if struct else r'^[^\n]*\b'+name+r'\([^;]*?\)\s*\{'
    match = re.search(pattern,source,re.M|re.S)
    if match is None: raise ValueError('production definition missing: '+name)
    start, i, depth, quote = match.start(),match.end()-1,0,None
    while i < len(source):
        c = source[i]
        if quote:
            if c == '\\': i += 2; continue
            if c == quote: quote = None
        elif c in ('"',"'"): quote = c
        elif source[i:i+2] == '//': i = source.find('\n',i); continue
        elif source[i:i+2] == '/*': i = source.find('*/',i)+2; continue
        elif c == '{': depth += 1
        elif c == '}':
            depth -= 1
            if depth == 0: return source[start:i+1]+(';' if struct else '')
        i += 1
    raise ValueError('unterminated definition: '+name)
