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    }