1- Não entendi como você fez o artifício contra a problema do limite de tamaho do buffer primário. Assim, acho que no meu esboço falta isso.
Pois é, temos que ver isso. Você fez aquele teste, mudando os 3 trechos para 9 e não aconteceu nada. Talvez 8 seja um valor "de segurança" e caiba mais alguma coisa. Se couber mais 3 caracteres não precisaremos do artifício. Imagine que o primeiro caractere da tag, que é "<", esteja na posição 8 (vamos considerá-la como última do buffer). Quando você buscar pelo próximo caractere da tag, que pode ser o "i" ou a barra, irá somar 1 ao contador e tentará ler algo na posição 9, que estará fora do buffer (e poderá ser qualquer caractere que estiver na memória naquela posição). Assim, a rotina, muito provavelmente, "perderá" essa tag, a qual somente terá o próximo caractere carregado na primeira posição do buffer após o novo preenchimento.
Mas, pelo teste, parece que o buffer tem ao menos 9 posições. Para o pior caso, que é quando a maior tag (tag </i>) estiver começando na posição 8 do buffer, teríamos que ter pelo menos mais 3 posições para garantir a leitura. 8+3 = 11 = #B. Teste com o valor #B naquelas 3 posições para ver se perdem-se caracteres da legenda (ou se são adicionados caracteres estranhos). Caso não aconteça nada, só para tirar uma dúvida sobre o tamanho do buffer, teste valores maiores, como #20 ou #40.
Caso dê problemas com #B, tente o valor #A. Depois de descobir o valor máximo do buffer, você poderá deixar que ele seja lido até o valor máximo - 3 (para garantir a tag </i>). Por exemplo, se for 9, o máximo até agora testado, então deixe aqueles valores somente até 6 (9-3).
Mas caso nada disso dê algum resultado prático, deixe em 8 mesmo. Se após o itálico ser implementado tivermos problemas com algumas tags não sendo reconhecidas, então o limitador do buffer estará em outro lugar. Depois descobriremos.