package org.nutz.mvc.upload.util;

import org.nutz.lang.Lang;

/**
 * 根据给给定的 bytes[] 计算所有的查找回溯点
 * 
 * @author zozoh(zozohtnt@gmail.com)
 */
public class RemountBytes {
    
    public static RemountBytes create(String str){
        return create(Lang.toBytes(str.toCharArray()));
    }

    public static RemountBytes create(byte[] bs) {
        // 初始化失效数组
        int[] fails = new int[bs.length];

        // 如果数组长度大于 0
        if (bs.length > 1) {
            // 如果字符为 ABABCDE
            // 循环从第三个开始的字符
            for (int i = 2; i < bs.length; i++) {
                // 如果当前为 C
                // red: 本字符之前的子串 ABAB
                // int redL = 0;
                // int redR = i - 1;
                // blue: 本字符之前的子串不包括第一个字符的子串 BAB
                int blueL = 1;
                int blueR = i - 1;
                // 循环，遇到 blue 结束，不相等的话，游标置零
                int x = 0;
                for (int j = blueL; j <= blueR; j++) {
                    byte red = bs[x];
                    byte blue = bs[j];
                    if (red == blue)
                        x++;
                    else
                        x = 0;
                }
                // 当 blue 全部耗尽，长度为失效数组的值
                fails[i] = x;
            }
        }
        RemountBytes re = new RemountBytes();
        re.bytes = bs;
        re.fails = fails;
        return re;
    }

    public byte[] bytes;

    public int[] fails;

}
