diff --git a/ex01/src/main.c b/ex01/src/main.c index 5ecc5e0..ec7c2f0 100644 --- a/ex01/src/main.c +++ b/ex01/src/main.c @@ -50,45 +50,97 @@ void print_eeprom(uint16_t highlight_addr) { } } -uint16_t read_hex(void) { - uint16_t addr; - char data; +// true on error +bool parse_string(char* str, uint16_t* addr, uint8_t* value) { + uint16_t addr_temp; + uint8_t val_temp; - addr = 0; + uint8_t tmp; + uint8_t i; + uint8_t j; - for (uint8_t i = 0; i < 2; i++) { - read_data: - data = uart_rx(); - if ('a' <= data && data <= 'z') - data -= 'a' - 'A'; - if (!((data >= '0' && data <= '9') || (data >= 'A' && data <= 'F'))) - goto read_data; - - if (data >= '0' && data <= '9') - addr |= ((data - '0') << (4 - 4 * i)); - else - addr |= (data - 'A' + 10) << (4 - 4 * i); - uart_tx(data); + addr_temp = 0; + i = 0; + j = 0; + while ((tmp = ft_stridx("0123456789ABCDEF", str[i])) != 255 && j < 4) { + addr_temp *= 16; + addr_temp += tmp; + i++; + j++; + } + if (str[i] != ' ') { + uart_sendstring("invalid format: \r\n"); + return true; + } + i++; + j = 0; + val_temp = 0; + while ((tmp = ft_stridx("0123456789ABCDEF", str[i])) != 255 && j < 2) { + val_temp *= 16; + val_temp += tmp; + i++; + j++; + } + if (str[i] != 0) { + uart_sendstring("invalid format: \r\n"); + return true; + } + if (addr_temp > 1023) { + uart_sendstring("invalid format: can't be greater than 1023\r\n"); + return true; } - return addr; + *addr = addr_temp; + *value = val_temp; + return false; +} + +void read_addr_value(uint16_t* addr, uint8_t* value) { +#define BUFFER_SIZE (128) + + char buffer[BUFFER_SIZE]; + uint8_t cursor; +start: + ft_bzero(buffer, BUFFER_SIZE); + cursor = 0; + + while (true) { + uint8_t chr = uart_rx(); + if (chr == '\x7f' || chr == '\b') { + if (cursor) { + buffer[--cursor] = 0; + uart_sendstring("\b \b"); + } + continue; + } + if (chr == '\r') { + uart_sendstring("\r\n"); + if (parse_string(buffer, addr, value)) + goto start; + return; + } + + if (chr < ' ' || chr > '~') + continue; + + if (cursor + 1 >= BUFFER_SIZE) + continue; + if (chr >= 'a' && chr <= 'z') + chr -= 'a' - 'A'; + buffer[cursor++] = chr; + uart_tx(chr); + } } int main(void) { uart_init(); + uint16_t addr = 0; + uint8_t data = 0; + print_eeprom(-1); while (true) { - uint16_t addr = read_hex(); - uart_tx(' '); - uint16_t data = read_hex(); - uart_sendstring("\r\n"); - - if (addr >= 1024) { - uart_sendstring("Addr can't be greater than 1023\r\n"); - continue; - } - + read_addr_value(&addr, &data); uint16_t edata = eeprom_read_single(addr); if (edata == data) uart_sendstring("not writing anything since same data !\r\n");