All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.segoia.util.data.encoding.Decoder Maven / Gradle / Ivy

The newest version!
/**
 * commons - Various Java Utils
 * Copyright (C) 2009  Adrian Cristian Ionescu - https://github.com/acionescu
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.segoia.util.data.encoding;

import net.segoia.util.data.Interval;

public class Decoder {
    private String target;
    private String reference;

    StringBuffer result = new StringBuffer();
    int start = 0;
    int end = 0;
    String val = "";
    boolean matchBlock = false;
    boolean escaped = false;

    public Decoder(String target, String reference) {
	super();
	this.target = target;
	this.reference = reference;
    }

    public String decode() {
	if(target.equals(""+Encoder.START_MATCH_BLOCK)) {
	    return reference;
	}
	for (int i = 0; i < target.length(); i++) {
	    char c = target.charAt(i);

	    switch (c) {
	    case Encoder.ESCAPE_CHAR:
		if (!escaped) {
		    escaped = true;
		    continue;
		}
		
	    case Encoder.START_MATCH_BLOCK:
		if (!escaped) {
		    processBlockStart();
		    matchBlock = true;
		    break;
		}
	    case Encoder.START_DIFF_BLOCK:
		if (matchBlock) {
		    processBlockStart();
		    matchBlock = false;
		    continue;
		}
	    default:
		if (escaped) {
		    escaped = false;
		}
		if (matchBlock) {
		    if (c == Interval.DELIMITER) {
			start = Integer.parseInt(val);
			val = "";
		    } else {
			val += c;
		    }
		} else {
		    result.append(c);
		}
	    }
	}

	if (!"".equals(val)) {
	    result.append(reference.substring(Integer.parseInt(val)));
	}

	return result.toString();
    }

    private void processBlockStart() {
	if (!"".equals(val)) {
	    end = Integer.parseInt(val);
	    val = "";
	    result.append(reference.subSequence(start, end + 1));
	}
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy