001 package org.crsh.cmdline.matcher.tokenizer;
002
003 /**
004 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
005 */
006 class State {
007
008 /** . */
009 StringBuilder buffer;
010
011 /** . */
012 Escape escape;
013
014 /** . */
015 Status status;
016
017 public State() {
018 this.buffer = new StringBuilder();
019 this.status = Status.INIT;
020 this.escape = Escape.NONE;
021 }
022
023 void push(char c) {
024
025 //
026 switch (escape) {
027 case NONE:
028 if (c == '"') {
029 escape = Escape.DOUBLE;
030 return;
031 } else if (c == '\\') {
032 escape = Escape.BACKSLASH;
033 return;
034 } else if (c == '\'') {
035 escape = Escape.SINGLE;
036 return;
037 } else {
038 // Do nothing
039 break;
040 }
041 case DOUBLE:
042 if (c == '"') {
043 escape = Escape.NONE;
044 return;
045 } else {
046 // Do nothing
047 break;
048 }
049 case SINGLE:
050 if (c == '\'') {
051 escape = Escape.NONE;
052 return;
053 } else {
054 // Do nothing
055 break;
056 }
057 case BACKSLASH:
058 escape = Escape.NONE;
059 break;
060 default:
061 throw new AssertionError(escape);
062 }
063
064 switch (status) {
065 case INIT: {
066 if (c == '-') {
067 buffer.append(c);
068 status = Status.SHORT_OPTION;
069 return;
070 } else {
071 buffer.append(c);
072 status = Status.WORD;
073 return;
074 }
075 }
076 case WORD: {
077 buffer.append(c);
078 status = Status.WORD;
079 return;
080 }
081 case SHORT_OPTION: {
082 if (Character.isLetter(c)) {
083 buffer.append(c);
084 return;
085 } else if (c == '-') {
086 buffer.append('-');
087 status = Status.LONG_OPTION;
088 return;
089 } else {
090 buffer.append(c);
091 status = Status.WORD;
092 return;
093 }
094 }
095 case LONG_OPTION: {
096 if (Character.isLetter(c)) {
097 buffer.append(c);
098 return;
099 } else {
100 buffer.append(c);
101 status = Status.WORD;
102 return;
103 }
104 }
105 default:
106 throw new AssertionError(escape);
107 }
108 }
109 }