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 }