FrancisBFTC / KiddieOS_Development

O KiddieOS é um sistema operacional open-source básico em desenvolvimento pelo curso gratuito D.S.O.S [Desenvolvendo Sistemas Operacionais Simples]. A intenção deste sistema será: Criar, editar ou excluir arquivos, codificar em uma linguagem própria do sistema, criar objetos visuais e automatizados (desenhos) através desta linguagem, utilizar uma interface simples e intuitiva, criar novas interfaces gráficas, como: Janelas, botões, campos, etc... e estimular crianças, jovens e adultos a programar numa linguagem simples dentro do sistema operacional KiddieOS. A intenção do curso D.S.O.S é dá início ao desenvolvimento de sistemas operacionais utilizando a linguagem Assembly e entender a fundo sobre diversos conceitos internos deste tipo de sistema. Aqui neste repositório serão armazenados arquivos de APIs do KiddieOS, a imagem de disco para teste e futuramente - todo o sistema operacional completo. Visite o link abaixo para nos acompanhar no curso do Youtube, se inscreva neste canal para se manter atualizado e siga-me no GitHub. Vejo vocês lá:
MIT License
46 stars 5 forks source link

Comando WRITE reinicia o sistema [Resolvido] #14

Closed arthur-cas closed 7 months ago

arthur-cas commented 7 months ago

Estava vendo o comando WRITE mas ele reiniciou o KiddieOS quando usei ele errado. Depois fui ver as opções dele. Daí quando eu coloco o arquivo com 1 letra na extensão ele reinicia também. Inclusive em outros casos também

FrancisBFTC commented 7 months ago

Ah sim, então tem estes casos mesmo que ele não aceita, terei que colocar uma condicional pra impedir isso ou ao menos mostrar ao usuário que tem um erro ali na formatação. Por exemplo: No KiddieOS ainda não aceita arquivos com 1 letra na extensão, você precisa obrigatoriamente inserir 3 letras pra seguir no padrão 8.3, a menos que eu faça certas mudanças no FAT16 pra ele aceitar arquivos com uma letra na extensão. Eu testando aqui, eu vi que o Write Reinicia se eu colocar write ola mundo, sem aspas, aí eu tenho que mostrar um erro pro usuário, dizendo que é preciso colocar aspas, porque se não ele vai interpretar o "ola" e o "mundo" como dois argumentos, que aliás não existiria, então ele falaria: "O argumento 'ola' e 'mundo' não existe".

FrancisBFTC commented 7 months ago

Vou fazer aqui por enquanto as anotações de bugs que encontrei, que causam a reinicialização e a medida que eu for encontrando, vou editando este comentário:

Bugs encontrados

  1. Reinicia quando coloca uma frase/palavra sem aspas após o comando "write".
  2. Quando mais de uma String são separadas por escape "\n", a última String substitui a String anterior, ou seja, se colocar "Frase1\nFrase2\nFrase3\n", ele apresentará apenas Frase3 na tela.
  3. Por algum motivo, o Write consegue escrever dados em arquivos pelo parâmetro -fc (criar) e -fa (acrescentar) mesmo quando não há aspas na String, isto se a String estiver após o parâmetro com o nome do arquivo, mas se ela tiver antes do parâmetro, em ambos os casos (fc e fa), o sistema reinicia. Ou seja, se trata do mesmo problema do Bug 1, porém, apesar de ser legal o comando aceitar Strings fora de aspas no segundo caso (após os parâmetros), fica estranho do comando saber o que são parâmetros e o que são Strings, ainda mais se tiverem dividido por espaços.
  4. Do mesmo jeito que o Bug 2, acrescentar dados em arquivos com o parâmetro -fa usando uma String com "\n" como quebra de linha, os dados são apenas substituídos (Assim como o -fc faz, mas essa não tem que ser a ideia). Então resolvendo o Bug 2, provavelmente resolvemos o Bug 4. Resolvendo o Bug 1 provavelmente resolvemos o Bug 3.

Possíveis soluções

No bug 2 e 4 provavelmente seja no processamento inadequado dos caracteres de Escape 0x0A e 0x0D, talvez o código esteja processando só o 0x0A e se esquecendo do 0x0D, tanto pra exibir em tela, quanto pra inserir em arquivos.

No bug 1 e 3 é provável que precisamos adicionar mais um parâmetro pro comando Write saber o que é "criar arquivos" e o que é "exibir strings na tela", pode ser que é mais complicado o Write identificar, porém ele pode verificar se os argumentos são inválidos primeiro antes de tudo, exemplo: Não contendo nenhum '.' ponto de arquivo, nem '\' barras de diretórios e nem aspas '"' de Strings, mas contendo palavras alfabéticas dividida por espaços ou sem divisão por espaços, e aí saberia que isso foi um erro de formatação de argumentos, eu me lembro de ter feito essas verificações, mas agora vou procurar aqui pra ver se algo mudou. Também será preciso regularizar a questão das aspas, e que obrigatoriamente se as aspas estiverem no início (antes do parâmetro), então ta válido, porque se não for aspas, deve ser o sinal de - (por causa dos parâmetros -fc e -fa), em qualquer outra condição, serão parâmetros inválidos, Exemplos: só podemos fazer write -.... ou write "... Ou seja, apenas duas condições Ou o "sinal" no início ou as aspas no início,.. sem incluir o fato de podermos ter espaços entre o comando e o sinal, exemplo: write "... ou write -...., Isso aí estaria válido.

Correções e outros bugs

Tudo que resta agora é controlar as aspas nos dados da linha de comando e imprimir erros na tela caso o usuário forneça argumentos incorretos. Ah, sem contar que há um outro probleminha mas não é tão sério assim, que em determinados momentos, o arquivo é salvo com 1 caractere a mais, mas depois é possível apagá-lo e voltar ao normal. Acredito que este caractere a mais é o próprio 0x0A, mas é estranho pois se não o cursor retornaria para a coluna origem, ou se fosse 0x0D, iria pra próxima linha, o que não está acontecendo, ou seja, mesmo com o caractere a mais, o máximo que acontece é o cursor dar um espaço a mais (space normal), então só mais um pouco de depuração e vou saber qual registrador eu devo manipular pra impedir que este caractere adicional seja armazenado.

O comando write é uma das funções mais complexas do sistema, não necessariamente a mais "difícil", só que mais complexa, porque ela contém várias funções dela, vários caminhos e possibilidades, e aí eu tenho que testar cada detalhe de cada possibilidade, e como todas estas funções são dependentes, alterando uma parte pode afetar outra, é isso que complica neste código. Então é preciso testar todas as possibilidades em cada alteração, inclusive criar vários arquivos de tamanhos diferentes e fazer a mesma coisa pra cada um.

FrancisBFTC commented 7 months ago

Mudanças de plano: Aquilo que eu falei sobre controlar as aspas quando a String está após os parâmetros -fc ou -fa, eu mudei de ideia! Eu percebi algo, que sem querer o write obteve uma nova função quando não colocamos as aspas na String (neste segundo caso), esta função se trata do comando imprimir na tela os últimos dados escritos no arquivo, mesmo assim, ele escreve o último dado normalmente quando não tem aspas. Porém isso só vai funcionar pro parâmetro -fa, que é pra acrescentar dados nos arquivos. No entanto é obrigatório inserir aspas na String a partir do momento que a String está antes dos parâmetros -fc ou -fa, se caso não inserir (neste primeiro caso) aí o comando exibe um erro na tela de parâmetro inválido. Pelo fato dos dados anteriores do arquivo serem imprimidos na tela quando a String está sem aspas no segundo caso, tive a ideia de criar um novo parâmetro chamado "-hi", que significa "hidden" ou "oculto", ou seja, é quando o usuário não quer colocar aspas e mesmo assim não quer também que apareça os dados anteriores na impressão e este novo parâmetro ele teve algo legal também no comando, que se caso você quiser escrever um novo dado no arquivo e você tem a plena certeza que este novo dado estará no final do arquivo e você não quer manipular nada que estava anteriormente, você pode optar por usar o -hi pra dizer ao comando que você não quer imprimir os dados anteriores do arquivo, apenas acrescentar os novos dados. Vou dá um exemplo de cinco situações:

1ª situação:

write -fa hello.txt "Ola mundo3" - Neste caso, como tem aspas, não vai apresentar os dados anteriores, só acrescentar a nova String.

2ª situação:

write -fa hello.txt \nOla mundo4 - Neste caso, como não tem aspas, o comando vai imprimir na tela os últimos dados armazenados, como o "Ola mundo3" armazenado anteriormente, e vai acrescentar mais "Ola mundo4".

3ª situação:

write -hi -fa hello.txt \nOla mundo5 - Este é igual o caso anterior, com a diferença de que tem o parâmetro -hi (obrigatoriamente sempre no início) e de que ele não vai imprimir na tela os últimos dados armazenados, mas ainda vai armazenar o "Ola mundo5" igual o caso anterior.

4ª situação:

write -hi -fa hello.txt - Sabendo que você tem as 3 Strings no arquivo: "Ola mundo3", "Ola mundo4" e "Ola mundo5", separados por quebras de linhas, você agora não quer ver estes dados novamente, então você adiciona um -hi pra ocultar eles, e aí vai abrir o editor pra você em branco (limpo, sem nada), e você pode adicionar novos dados digitando pelo teclado, como por exemplo: Ola mundo6. Isso significa que você sabe que o dado vai ficar no final do arquivo e sua intenção é apenas esta, então não será preciso ver os dados anteriores se você não quiser, então só oculte com -hi.

5ª situação:

write -fa hello.txt - Neste caso é quando você precisa alterar os dados anteriores, ou seja, provavelmente você vai pressionar um backspace e apagá-los pra poder substituir-los por outros novos dados, então não necessariamente você queira adicionar dados no final do arquivo, mas apagar por exemplo, então você não pode usar o parâmetro -hi, pois você quer "ver" os seus dados anteriores.

Observações: o novo parâmetro -hi só será útil para o comando -fa, pois o parâmetro -fa (File Append) é pra acrescentar novos dados, e isso considera que o arquivo já existe, por isso há a necessidade de ocultar ou ver os dados anteriores. Já no caso do -fc (File Create), o arquivo é dado como novo, sem dados anteriores. E na 2ª e 3ª situação como eu expliquei lá no início do texto, os dados só são apresentados em tela, no caso da String ser na linha de comando, se você realmente estiver usando -fa e a String estiver no final do comando (após os parâmetros -fa), e sem aspas também, estas são as condições, mas não vai dar certo se caso você fizer algo assim: write \nOla mundo -fa hello.txt, ou assim, write "Ola mundo" -hi -fa hello.txt, ou até mesmo assim write -hi -fc hello.txt, ... destas formas, não vai surtir o efeito do -hi, e neste 1ª exemplinho ali, dará até erro de parâmetro inválido pelo fato da String está sem aspas antes do parâmetro -fa. Então por ser um comando um pouco mais complexo, são regras que deve ficar atento.

No mas, todos os outros erros já foram corrigidos, a reinicialização, as quebras de linhas indevidas, a falta de identificação do cursor na hora de voltar na linha anterior, tudo isso já foi corrigido. Amanhã vou revisar melhor outras coisas e qualquer coisa já subo aqui, pra poder movimentar com mais frequências o github. Uma boa noite pra ti.

FrancisBFTC commented 7 months ago

É, finalmente conseguir corrigir o Write completamente. Se tiver algum erro, deve ser algum bem específico que eu não consigo encontrar, porque já testei todas as possibilidades. Vou ver se consigo encontrar uma forma prática de processar as setas direcionais.

arthur-cas commented 7 months ago

Acabei de ler os seus comentários. Já pode marcar como concluído.

FrancisBFTC commented 7 months ago

Beleza!! Agora que tu captou tudo, eu vou atualizar amanhã a tarde. Porque fui adicionando novas atualizações no Editor do Write, e não tá 100% estável. Quero chegar a pelo menos uns 95% de estabilidade. Muitas coisas já ta dando certo, tô bem feliz agora por essas mudanças, mais um tempinho eu consigo e subo amanhã.

FrancisBFTC commented 7 months ago

Eae man! Subir já pro Github as atualizações, vou realizar o merge agora da Pull request. Se quiser ver lá o que foi implementado com detalhes, as novas funções, as descrições disso estão aqui https://github.com/FrancisBFTC/KiddieOS_Development/pull/16.

No youtube também mostro a utilização do que foi atualizado: https://www.youtube.com/watch?v=OWPTbTGlfk4

Fecharei esta issue com este comentário, valeu!