/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.util;
import org.eclipse.cdt.internal.core.model.CElement;
/**
* A tokenizer to decipher a C element memento string.
*
* @since 5.0
*/
public class MementoTokenizer {
private static final String CPROJECT = Character.toString(CElement.CEM_CPROJECT);
private static final String SOURCEROOT = Character.toString(CElement.CEM_SOURCEROOT);
private static final String SOURCEFOLDER = Character.toString(CElement.CEM_SOURCEFOLDER);
private static final String TRANSLATIONUNIT = Character.toString(CElement.CEM_TRANSLATIONUNIT);
private static final String SOURCEELEMENT = Character.toString(CElement.CEM_SOURCEELEMENT);
private static final String ELEMENTTYPE = Character.toString(CElement.CEM_ELEMENTTYPE);
private static final String PARAMETER = Character.toString(CElement.CEM_PARAMETER);
private final char[] memento;
private final int length;
private int index = 0;
public MementoTokenizer(String memento) {
this.memento = memento.toCharArray();
this.length = this.memento.length;
}
public boolean hasMoreTokens() {
return this.index < this.length;
}
public String nextToken() {
int start = this.index;
StringBuilder buffer = null;
switch (this.memento[this.index++]) {
case CElement.CEM_ESCAPE:
buffer = new StringBuilder();
buffer.append(this.memento[this.index]);
start = ++this.index;
break;
case CElement.CEM_CPROJECT:
return CPROJECT;
case CElement.CEM_SOURCEROOT:
return SOURCEROOT;
case CElement.CEM_SOURCEFOLDER:
return SOURCEFOLDER;
case CElement.CEM_TRANSLATIONUNIT:
return TRANSLATIONUNIT;
case CElement.CEM_SOURCEELEMENT:
return SOURCEELEMENT;
case CElement.CEM_ELEMENTTYPE:
return ELEMENTTYPE;
case CElement.CEM_PARAMETER:
return PARAMETER;
}
loop: while (this.index < this.length) {
switch (this.memento[this.index]) {
case CElement.CEM_ESCAPE:
if (buffer == null) buffer = new StringBuilder();
buffer.append(this.memento, start, this.index - start);
start = ++this.index;
break;
case CElement.CEM_CPROJECT:
case CElement.CEM_TRANSLATIONUNIT:
case CElement.CEM_SOURCEROOT:
case CElement.CEM_SOURCEFOLDER:
case CElement.CEM_SOURCEELEMENT:
case CElement.CEM_ELEMENTTYPE:
case CElement.CEM_PARAMETER:
break loop;
}
this.index++;
}
if (buffer != null) {
buffer.append(this.memento, start, this.index - start);
return buffer.toString();
} else {
return new String(this.memento, start, this.index - start);
}
}
}