1
1
/*
2
- Copyright (c) 2008-2011
2
+ Copyright (c) 2008-2014
3
3
Lars-Dominik Braun <[email protected] >
4
4
5
5
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -53,7 +53,6 @@ static size_t BarReadlinePrevUtf8 (char *ptr) {
53
53
*/
54
54
size_t BarReadline (char * buf , const size_t bufSize , const char * mask ,
55
55
BarReadlineFds_t * input , const BarReadlineFlags_t flags , int timeout ) {
56
- size_t bufPos = 0 ;
57
56
size_t bufLen = 0 ;
58
57
unsigned char escapeState = 0 ;
59
58
fd_set set ;
@@ -107,9 +106,26 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
107
106
if (echo ) {
108
107
fputs ("\n" , stdout );
109
108
}
109
+ buf [bufLen ] = '\0' ;
110
110
return bufLen ;
111
111
break ;
112
112
113
+ /* clear line */
114
+ case 21 :
115
+ if (echo ) {
116
+ while (bufLen > 0 ) {
117
+ const size_t moveSize = BarReadlinePrevUtf8 (& buf [bufLen ]);
118
+ assert (bufLen >= moveSize );
119
+
120
+ /* move caret and delete character */
121
+ fputs ("\033[D\033[K" , stdout );
122
+ bufLen -= moveSize ;
123
+ }
124
+ fflush (stdout );
125
+ }
126
+ bufLen = 0 ;
127
+ break ;
128
+
113
129
/* escape */
114
130
case 27 :
115
131
escapeState = 1 ;
@@ -122,28 +138,18 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
122
138
/* backspace */
123
139
case 8 : /* ASCII BS */
124
140
case 127 : /* ASCII DEL */
125
- if (bufPos > 0 ) {
126
- size_t moveSize = BarReadlinePrevUtf8 (& buf [bufPos ]);
127
- assert (( signed int ) bufPos - ( signed int ) moveSize >= 0 );
128
- memmove (& buf [bufPos - moveSize ], & buf [bufPos ], moveSize );
141
+ if (bufLen > 0 ) {
142
+ size_t moveSize = BarReadlinePrevUtf8 (& buf [bufLen ]);
143
+ assert (bufLen >= moveSize );
144
+ memmove (& buf [bufLen - moveSize ], & buf [bufLen ], moveSize );
129
145
130
- bufPos -= moveSize ;
131
146
bufLen -= moveSize ;
132
147
133
- buf [bufLen ] = '\0' ;
134
-
135
148
/* move caret back and delete last character */
136
149
if (echo ) {
137
150
fputs ("\033[D\033[K" , stdout );
138
151
fflush (stdout );
139
152
}
140
- } else if (bufPos == 0 && buf [bufPos ] != '\0' ) {
141
- /* delete char at position 0 but don't move cursor any further */
142
- buf [bufPos ] = '\0' ;
143
- if (echo ) {
144
- fputs ("\033[K" , stdout );
145
- fflush (stdout );
146
- }
147
153
}
148
154
break ;
149
155
@@ -165,25 +171,26 @@ size_t BarReadline (char *buf, const size_t bufSize, const char *mask,
165
171
break ;
166
172
}
167
173
/* don't write beyond buffer's limits */
168
- if (bufPos < bufSize - 1 ) {
169
- buf [bufPos ] = chr ;
170
- ++ bufPos ;
174
+ if (bufLen < bufSize - 1 ) {
175
+ buf [bufLen ] = chr ;
171
176
++ bufLen ;
172
177
if (echo ) {
173
178
putchar (chr );
174
179
fflush (stdout );
175
180
}
176
181
/* buffer full => return if requested */
177
- if (bufPos >= bufSize - 1 && (flags & BAR_RL_FULLRETURN )) {
182
+ if (bufLen >= bufSize - 1 && (flags & BAR_RL_FULLRETURN )) {
178
183
if (echo ) {
179
184
fputs ("\n" , stdout );
180
185
}
186
+ buf [bufLen ] = '\0' ;
181
187
return bufLen ;
182
188
}
183
189
}
184
190
break ;
185
191
} /* end switch */
186
192
} /* end while */
193
+ buf [0 ] = '\0' ;
187
194
return 0 ;
188
195
}
189
196
0 commit comments