module.exports = mine;

function mine (js) {
    js = String(js);
    var names = [];
    var state = 0;
    var ident;
    var quote;
    var name;
    var start;
    
    var isIdent = /[a-z0-9_.]/i;
    var isWhitespace = /[ \r\n\t]/;
    
    function $start (char) {
        if (char === "/") {
            return $slash;
        }
        if (char === "'" || char === '"') {
            quote = char;
            return $string;
        }
        if (isIdent.test(char)) {
            ident = char;
            return $ident;
        }
        return $start;
    }
    
    function $ident (char) {
        if (isIdent.test(char)) {
            ident += char;
            return $ident;
        }
        if (char === "(" && ident === "require") {
            ident = undefined;
            return $call;
        }
        else if (isWhitespace.test(char)){
            if (ident !== 'yield' && ident !== 'return'){
                return $ident;
            }
        }
        return $start(char);
    }
    
    function $call (char) {
        if (isWhitespace.test(char)) return $call;
        if (char === "'" || char === '"') {
            quote = char;
            name = "";
            start = i + 1;
            return $name;
        }
        return $start(char);
    }
    
    function $name (char) {
        if (char === quote) {
            return $close;
        }
        name += char;
        return $name;
    }
    
    function $close (char) {
        if (isWhitespace.test(char)) return $close;
        if (char === ")" || char === ',') {
            names.push({
                name: name,
                offset: start
            });
        }
        name = undefined;
        return $start(char);
    }
    
    function $string (char) {
        if (char === "\\") {
            return $escape;
        }
        if (char === quote) {
            return $start;
        }
        return $string;
    }
    
    function $escape (char) {
        return $string;
    }
    
    function $slash (char) {
        if (char === "/") return $lineComment;
        if (char === "*") return $multilineComment;
        return $start(char);
    }
    
    function $lineComment (char) {
        if (char === "\r" || char === "\n") return $start;
        return $lineComment;
    }
    
    function $multilineComment (char) {
        if (char === "*") return $multilineEnding;
        return $multilineComment;
    }
    
    function $multilineEnding (char) {
        if (char === "/") return $start;
        if (char === "*") return $multilineEnding;
        return $multilineComment;
    }
    
    var state = $start;
    for (var i = 0, l = js.length; i < l; i++) {
        state = state(js[i]);
    }
    return names;
}
