/* Cut out and return first \0-terminated string from world.queue and
* appropriately reduce world.queue_size. Return NULL if queue is empty.
* Superfluous \0 bytes after the string are also cut out. Should the queue
- * start with \0 bytes, those are cut out, but NULL is returned instead of "".
-*/
+ * start with \0 bytes, those are cut out before returning anything after them.
+ */
static char * get_message_from_queue();
/* Poll input file for world.queue input. Wait a few seconds until giving up;
- * poll only every 0.03 seconds.. Translate '\n' chars in input file into '\0'.
+ * poll only every 0.03 seconds. Translate '\n' chars in input file into '\0'.
*/
static void read_file_into_queue();
if (world.queue_size)
{
size_t cutout_len = strlen(world.queue);
+ uint8_t is_nullbyte_chunk = !cutout_len;
if (0 < cutout_len)
{
cutout_len++;
memcpy(new_queue, &(world.queue[cutout_len]), world.queue_size);
free(world.queue);
world.queue = new_queue;
+ if (is_nullbyte_chunk)
+ {
+ return get_message_from_queue();
+ }
}
}
return message;
* Each such call cuts off bytes from the beginning of world.queue, up to and
* including the last \0 byte that is followed by a non-\0 byte or ends the
* queue. If the queue starts with a \0 byte, it and its \0 followers are cut
- * and a NULL pointer is returned. Reading from the input file stops only when
- * one or more byte were read and the next read returns 0 bytes. If the
- * re-filled queue does not end in a \0 byte, a \0 byte is appended to it.
+ * before returning anything after them. Reading from the input file stops only
+ * at its end or when one or more byte were read and the next read returns 0
+ * bytes. If the re-filled queue doesn't end in \0, a \0 byte is appended to it.
*/
extern char * io_round();