O método compareTo(Calendar anotherCalendar) verifica: “Se uma data (Calendar) x quando comparada a outra data (Calendar) y”; e retorna um valor inteiro que determina um de três casos:
-> caso o retorno seja 0 (zero), as datas são iguais;
-> caso o retorno seja menor que 0 (zero), a data x é anterior (mais antiga) que a data y;
-> caso o retorno seja maior que 0 (zero), a data x é posterior (mais recente) que a data y;
Porém, você está verificando se o retorno é menor ou igual a +1? Você está tentando somar uma unidade ao retorno do método?
1 - O certo é comparar com zero, já que o caso definido no retorno baseia-se na posição de zero;
2 - Supõe-se que cFim nunca é menor que c, ou c ou é igual a cFim. Logo, c sempre posterior a cFim;
3 - Dentro do bloco do while (seu escopo) deve haver um meio de tornar a condição falsa. Logo, a condição deve ser alterada dentro do bloco while para que em determinado momento, a iteração chegue ao fim ou uma outra condição arbitrária (cujo único objetivo é finalizar o laço) torne-se falsa.
Exemplo:
short contagem = 0;
while(contagem < 100 || c.compareTo(cFim) <= 0){
c.set(Calendar.DAY_OF_MONTH, 1);
datas.add(c.getTime());
contagem++;
}
4 - A documentação indica que:
Compara os valores de tempo (deslocamentos de milissegundos da época - Epoch) representados por dois objetos de calendário.
e
Parâmetro: o calendrio a ser comparado.
Fonte: compareTo method.