From 8b7d46114b90b4ceba66d964692bf14a271d3aee Mon Sep 17 00:00:00 2001 From: Imran Tierce Date: Fri, 3 Jan 2020 22:14:31 +0100 Subject: [PATCH] premier commit --- .gitignore | 7 +++ include/userinput.h | 6 +++ src/userinput.c | 126 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 .gitignore create mode 100644 include/userinput.h create mode 100644 src/userinput.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b07d157 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +assets-cg +assets-fx +build-fx +Makefile +project.cfg +uitest.g1a +src/main.c diff --git a/include/userinput.h b/include/userinput.h new file mode 100644 index 0000000..feb59c5 --- /dev/null +++ b/include/userinput.h @@ -0,0 +1,6 @@ +#ifndef USERINPUT_H +#define USERINPUT_H + +uint64_t input_uint(); + +#endif diff --git a/src/userinput.c b/src/userinput.c new file mode 100644 index 0000000..8da1106 --- /dev/null +++ b/src/userinput.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include + +#define WIDTH 128 +#define HEIGHT 64 +#define TAILLE_INPUT_U64 20 + +uint64_t atoi(char *s); +void draw_field(int h); +void itoa(char *s, uint64_t a); +void clear_field(int h); + +uint64_t input_uint() { + int key = 0, h; + unsigned int curseur; + char input[TAILLE_INPUT_U64+1]; + char nb_limite[TAILLE_INPUT_U64+1]; + + uint64_t limite = -1; + + itoa(nb_limite, limite); + + for(curseur = 0; curseur <= TAILLE_INPUT_U64; ++curseur) input[curseur] = 0; + + curseur = 0; + + dsize("0", NULL, NULL, &h); + + draw_field(h); + + while(1) { + if(input[0] != '0' && curseur < TAILLE_INPUT_U64) { + switch(key) { + case KEY_0: + input[curseur++] = '0'; + break; + case KEY_1: + input[curseur++] = '1'; + break; + case KEY_2: + input[curseur++] = '2'; + break; + case KEY_3: + input[curseur++] = '3'; + break; + case KEY_4: + input[curseur++] = '4'; + break; + case KEY_5: + input[curseur++] = '5'; + break; + case KEY_6: + input[curseur++] = '6'; + break; + case KEY_7: + input[curseur++] = '7'; + break; + case KEY_8: + input[curseur++] = '8'; + break; + case KEY_9: + input[curseur++] = '9'; + } + if(curseur == TAILLE_INPUT_U64 && strcmp(input, nb_limite) > 0) input[--curseur] = 0; + } + if(curseur) { + switch(key) { + case KEY_DEL: + clear_field(h); + input[--curseur] = 0; + break; + case KEY_EXE: + return atoi(input); + } + } + + dtext(2, HEIGHT-2-h, input, C_BLACK, C_WHITE); + dupdate(); + key = getkey().key; + } +} + +void clear_field(int h) { + drect(1, HEIGHT-2-h, WIDTH-2, HEIGHT-3, C_WHITE); +} + +void draw_field(int h) { + clear_field(h); + dhline(HEIGHT-4-h, C_BLACK); + dhline(HEIGHT-1, C_BLACK); + dline(0, HEIGHT-3-h, 0, HEIGHT-2, C_BLACK); + dline(WIDTH-1, HEIGHT-3-h, WIDTH-1, HEIGHT-2, C_BLACK); +} + +uint64_t pow(const int n, unsigned int p) { + uint64_t retour = 1; + for(; p; --p) retour *= n; + return retour; +} + +uint64_t atoi(char *s) { + int taille = strlen(s); + uint64_t retour = 0; + for(int puissance = 0; puissance < taille; ++puissance) { + retour += (s[taille-1-puissance] - '0') * pow(10, puissance); + } + return retour; +} + +void itoa(char *s, uint64_t a) { + int i = 0, j; + char c; + while(a) { + s[i++] = '0' + a%10; + a/=10; + } + s[i] = 0; + for(j = 0; j < i/2; ++j) { + c = s[j]; + s[j] = s[i-j-1]; + s[i-j-1] = c; + } +}