///strict_compress(input)

/*
    Description:    Returns a compressed version of the provided input string
    Arguments:      input (string)
    Returns:        String
*/

var input, input_size, index, output, ml, dict, verb;

input = argument0;
input_size = string_length(input);
index = 1;
output = "";
ml = _strict_data[? "max_length"];
dict = _strict_data[? "dictionary"];
verb = "";

while(index <= input_size) {
    var l = min(input_size-(index-1),ml);
    var q = "";
    for(var c = l; c > 0; c--) {
        var code = ds_map_find_value(dict,string_copy(input,index,c));
        if(!is_undefined(code)) {
            q += chr(code);
            encoded = true;
            index += c;
            break;
        }
    }
    
    if(q == "") {
        verb += string_char_at(input,index);
        index++;
        if(string_length(verb) == 255) {
            q = strict_encode_verb(verb);
            verb = "";
        }
    }
    else {
        if(verb != "") {
            q = strict_encode_verb(verb) + q;
            verb = "";
        }
    }
    
    output += q;

}

if(verb != "") {
    output += strict_encode_verb(verb);    
}

return output;
