|
8 | 8 | #import "iTermEchoProbe.h"
|
9 | 9 |
|
10 | 10 | #import "iTermAdvancedSettingsModel.h"
|
| 11 | +#import "VT100Token.h" |
11 | 12 |
|
12 | 13 | typedef NS_ENUM(NSUInteger, iTermEchoProbeState) {
|
13 | 14 | iTermEchoProbeOff = 0,
|
@@ -47,61 +48,64 @@ - (void)beginProbeWithBackspace:(NSData *)backspace
|
47 | 48 | }
|
48 | 49 | }
|
49 | 50 |
|
50 |
| -- (void)updateEchoProbeStateWithBuffer:(char *)buffer length:(int)length { |
| 51 | +- (void)updateEchoProbeStateWithTokenCVector:(CVector *)vector { |
51 | 52 | @synchronized(self) {
|
52 |
| - if (_state == iTermEchoProbeOff) { |
| 53 | + if (_state == iTermEchoProbeOff || _state == iTermEchoProbeFailed) { |
53 | 54 | return;
|
54 | 55 | }
|
55 |
| - for (int i = 0; i < length; i++) { |
56 |
| - switch (_state) { |
57 |
| - case iTermEchoProbeOff: |
58 |
| - case iTermEchoProbeFailed: |
59 |
| - return; |
60 |
| - |
61 |
| - case iTermEchoProbeWaiting: |
62 |
| - if (buffer[i] == '*') { |
63 |
| - _state = iTermEchoProbeOneAsterisk; |
64 |
| - } else { |
65 |
| - _state = iTermEchoProbeFailed; |
66 |
| - return; |
67 |
| - } |
68 |
| - break; |
69 |
| - |
70 |
| - case iTermEchoProbeOneAsterisk: |
71 |
| - if (buffer[i] == '\b') { |
72 |
| - _state = iTermEchoProbeBackspaceOverAsterisk; |
73 |
| - } else { |
74 |
| - _state = iTermEchoProbeFailed; |
75 |
| - return; |
76 |
| - } |
77 |
| - break; |
78 |
| - |
79 |
| - case iTermEchoProbeBackspaceOverAsterisk: |
80 |
| - if (buffer[i] == ' ') { |
81 |
| - _state = iTermEchoProbeSpaceOverAsterisk; |
82 |
| - } else { |
83 |
| - _state = iTermEchoProbeFailed; |
84 |
| - return; |
85 |
| - } |
86 |
| - break; |
87 |
| - |
88 |
| - case iTermEchoProbeSpaceOverAsterisk: |
89 |
| - if (buffer[i] == '\b') { |
90 |
| - _state = iTermEchoProbeBackspaceOverSpace; |
91 |
| - } else { |
92 |
| - _state = iTermEchoProbeFailed; |
93 |
| - return; |
94 |
| - } |
95 |
| - break; |
96 |
| - |
97 |
| - case iTermEchoProbeBackspaceOverSpace: |
98 |
| - _state = iTermEchoProbeFailed; |
99 |
| - return; |
| 56 | + const int count = CVectorCount(vector); |
| 57 | + for (int i = 0; i < count; i++) { |
| 58 | + VT100Token *token = CVectorGetObject(vector, i); |
| 59 | + _state = iTermEchoProbeGetNextState(_state, token); |
| 60 | + if (_state == iTermEchoProbeOff || _state == iTermEchoProbeFailed) { |
| 61 | + break; |
100 | 62 | }
|
101 | 63 | }
|
102 | 64 | }
|
103 | 65 | }
|
104 | 66 |
|
| 67 | +iTermEchoProbeState iTermEchoProbeGetNextState(iTermEchoProbeState state, VT100Token *token) { |
| 68 | + switch (state) { |
| 69 | + case iTermEchoProbeOff: |
| 70 | + case iTermEchoProbeFailed: |
| 71 | + return state; |
| 72 | + |
| 73 | + case iTermEchoProbeWaiting: |
| 74 | + if (token->type == VT100_ASCIISTRING && [[token stringForAsciiData] isEqualToString:@"*"]) { |
| 75 | + return iTermEchoProbeOneAsterisk; |
| 76 | + } else { |
| 77 | + return iTermEchoProbeFailed; |
| 78 | + } |
| 79 | + |
| 80 | + case iTermEchoProbeOneAsterisk: |
| 81 | + if (token->type == VT100CC_BS || |
| 82 | + (token->type == VT100CSI_CUB && token.csi->p[0] == 1)) { |
| 83 | + return iTermEchoProbeBackspaceOverAsterisk; |
| 84 | + } else { |
| 85 | + return iTermEchoProbeFailed; |
| 86 | + } |
| 87 | + |
| 88 | + case iTermEchoProbeBackspaceOverAsterisk: |
| 89 | + if (token->type == VT100_ASCIISTRING && [[token stringForAsciiData] isEqualToString:@" "]) { |
| 90 | + return iTermEchoProbeSpaceOverAsterisk; |
| 91 | + } else if (token->type == VT100CSI_EL && token.csi->p[0] == 0) { |
| 92 | + return iTermEchoProbeBackspaceOverSpace; |
| 93 | + } else { |
| 94 | + return iTermEchoProbeFailed; |
| 95 | + } |
| 96 | + |
| 97 | + case iTermEchoProbeSpaceOverAsterisk: |
| 98 | + if (token->type == VT100CC_BS) { |
| 99 | + return iTermEchoProbeBackspaceOverSpace; |
| 100 | + } else { |
| 101 | + return iTermEchoProbeFailed; |
| 102 | + } |
| 103 | + |
| 104 | + case iTermEchoProbeBackspaceOverSpace: |
| 105 | + return iTermEchoProbeFailed; |
| 106 | + } |
| 107 | +} |
| 108 | + |
105 | 109 | - (void)enterPassword {
|
106 | 110 | [self.delegate echoProbeWriteString:_password];
|
107 | 111 | [self.delegate echoProbeWriteString:@"\n"];
|
|
0 commit comments