'use strict'; var singleComment = 1; var multiComment = 2;

function stripWithoutWhitespace() {

return '';

}

function stripWithWhitespace(str, start, end) {

return str.slice(start, end).replace(/\S/g, ' ');

}

module.exports = function (str, opts) {

opts = opts || {};

var currentChar;
var nextChar;
var insideString = false;
var insideComment = false;
var offset = 0;
var ret = '';
var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;

for (var i = 0; i < str.length; i++) {
        currentChar = str[i];
        nextChar = str[i + 1];

        if (!insideComment && currentChar === '"') {
                var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
                if (!escaped) {
                        insideString = !insideString;
                }
        }

        if (insideString) {
                continue;
        }

        if (!insideComment && currentChar + nextChar === '//') {
                ret += str.slice(offset, i);
                offset = i;
                insideComment = singleComment;
                i++;
        } else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
                i++;
                insideComment = false;
                ret += strip(str, offset, i);
                offset = i;
                continue;
        } else if (insideComment === singleComment && currentChar === '\n') {
                insideComment = false;
                ret += strip(str, offset, i);
                offset = i;
        } else if (!insideComment && currentChar + nextChar === '/*') {
                ret += str.slice(offset, i);
                offset = i;
                insideComment = multiComment;
                i++;
                continue;
        } else if (insideComment === multiComment && currentChar + nextChar === '*/') {
                i++;
                insideComment = false;
                ret += strip(str, offset, i + 1);
                offset = i + 1;
                continue;
        }
}

return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));

};