Mercurial > emacs
comparison lib-src/pop.c @ 9674:e5a897cf215d
(getline): When a search of already-read input for CRLF
fails, store the fact that we've searched it and don't search it
again after reading more data.
(getline): When determining whether or not it's necessary
to grow the input buffer, take into account the null that's stored
at the end of already-read input in the buffer.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 24 Oct 1994 04:41:21 +0000 |
parents | 530b4511e5b3 |
children | 621a575db6f7 |
comparison
equal
deleted
inserted
replaced
9673:5ec29dee380c | 9674:e5a897cf215d |
---|---|
1182 popserver server; | 1182 popserver server; |
1183 { | 1183 { |
1184 #define GETLINE_ERROR "Error reading from server: " | 1184 #define GETLINE_ERROR "Error reading from server: " |
1185 | 1185 |
1186 int ret; | 1186 int ret; |
1187 | 1187 int search_offset = 0; |
1188 | |
1188 if (server->data) | 1189 if (server->data) |
1189 { | 1190 { |
1190 char *cp = find_crlf (server->buffer + server->buffer_index); | 1191 char *cp = find_crlf (server->buffer + server->buffer_index); |
1191 if (cp) | 1192 if (cp) |
1192 { | 1193 { |
1206 } | 1207 } |
1207 else | 1208 else |
1208 { | 1209 { |
1209 bcopy (server->buffer + server->buffer_index, | 1210 bcopy (server->buffer + server->buffer_index, |
1210 server->buffer, server->data); | 1211 server->buffer, server->data); |
1212 /* Record the fact that we've searched the data already in | |
1213 the buffer for a CRLF, so that when we search below, we | |
1214 don't have to search the same data twice. There's a "- | |
1215 1" here to account for the fact that the last character | |
1216 of the data we have may be the CR of a CRLF pair, of | |
1217 which we haven't read the second half yet, so we may have | |
1218 to search it again when we read more data. */ | |
1219 search_offset = server->data - 1; | |
1211 server->buffer_index = 0; | 1220 server->buffer_index = 0; |
1212 } | 1221 } |
1213 } | 1222 } |
1214 else | 1223 else |
1215 { | 1224 { |
1216 server->buffer_index = 0; | 1225 server->buffer_index = 0; |
1217 } | 1226 } |
1218 | 1227 |
1219 while (1) | 1228 while (1) |
1220 { | 1229 { |
1221 if (server->data == server->buffer_size) | 1230 /* There's a "- 1" here to leave room for the null that we put |
1231 at the end of the read data below. We put the null there so | |
1232 that find_crlf knows where to stop when we call it. */ | |
1233 if (server->data == server->buffer_size - 1) | |
1222 { | 1234 { |
1223 server->buffer_size += GETLINE_INCR; | 1235 server->buffer_size += GETLINE_INCR; |
1224 server->buffer = realloc (server->buffer, server->buffer_size); | 1236 server->buffer = realloc (server->buffer, server->buffer_size); |
1225 if (! server->buffer) | 1237 if (! server->buffer) |
1226 { | 1238 { |
1249 { | 1261 { |
1250 char *cp; | 1262 char *cp; |
1251 server->data += ret; | 1263 server->data += ret; |
1252 server->buffer[server->data] = '\0'; | 1264 server->buffer[server->data] = '\0'; |
1253 | 1265 |
1254 cp = find_crlf (server->buffer); | 1266 cp = find_crlf (server->buffer + search_offset); |
1255 if (cp) | 1267 if (cp) |
1256 { | 1268 { |
1257 int data_used = (cp + 2) - server->buffer; | 1269 int data_used = (cp + 2) - server->buffer; |
1258 *cp = '\0'; | 1270 *cp = '\0'; |
1259 server->data -= data_used; | 1271 server->data -= data_used; |
1261 | 1273 |
1262 if (pop_debug) | 1274 if (pop_debug) |
1263 fprintf (stderr, "<<< %s\n", server->buffer); | 1275 fprintf (stderr, "<<< %s\n", server->buffer); |
1264 return (server->buffer); | 1276 return (server->buffer); |
1265 } | 1277 } |
1278 search_offset += ret; | |
1266 } | 1279 } |
1267 } | 1280 } |
1268 | 1281 |
1269 /* NOTREACHED */ | 1282 /* NOTREACHED */ |
1270 } | 1283 } |