commit 01d87ab3b67fdd908043c54c25313a7d348b22d7 Author: Alexandre Date: Mon Dec 30 12:02:08 2024 +0100 initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e5d25f8 --- /dev/null +++ b/Makefile @@ -0,0 +1,31 @@ +CC = gcc +FLAGS = -Wall -Wextra -Wpedantic -g +LFLAGS = -lSDL2 -lSDL2_image -lm -lncurses + +all: bin/back + + +test: bin/back + bin/back + +bin/back: obj/main.o obj/generation.o obj/display.o obj/base.o obj/hash.o + mkdir -p bin + $(CC) $(FLAGS) $^ $(LFLAGS) -o $@ + +obj/%.o: src/%.c + @mkdir -p obj + $(CC) -o $@ -c $(FLAGS) $< + +obj/main.o: src/main.c +obj/generation.o: src/generation.c +obj/display.o: src/display.c +obj/base.o: src/base.c +obj/hash.o: src/hash.c + +.PHONY: clean mrproper + +clean: + rm -rf obj/ + +mrproper: clean + rm -rf bin/ diff --git a/bin/back b/bin/back new file mode 100755 index 0000000..9021eb7 Binary files /dev/null and b/bin/back differ diff --git a/obj/base.o b/obj/base.o new file mode 100644 index 0000000..de5f54f Binary files /dev/null and b/obj/base.o differ diff --git a/obj/display.o b/obj/display.o new file mode 100644 index 0000000..7cba6f8 Binary files /dev/null and b/obj/display.o differ diff --git a/obj/generation.o b/obj/generation.o new file mode 100644 index 0000000..26ccd15 Binary files /dev/null and b/obj/generation.o differ diff --git a/obj/hash.o b/obj/hash.o new file mode 100644 index 0000000..6d1374f Binary files /dev/null and b/obj/hash.o differ diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000..5b907f8 Binary files /dev/null and b/obj/main.o differ diff --git a/res/digits/big-sign-sum.bmp b/res/digits/big-sign-sum.bmp new file mode 100755 index 0000000..3941036 Binary files /dev/null and b/res/digits/big-sign-sum.bmp differ diff --git a/res/digits/digit-0.bmp b/res/digits/digit-0.bmp new file mode 100755 index 0000000..2d29cce Binary files /dev/null and b/res/digits/digit-0.bmp differ diff --git a/res/digits/digit-1.bmp b/res/digits/digit-1.bmp new file mode 100755 index 0000000..50cbccb Binary files /dev/null and b/res/digits/digit-1.bmp differ diff --git a/res/digits/digit-2.bmp b/res/digits/digit-2.bmp new file mode 100755 index 0000000..8afa656 Binary files /dev/null and b/res/digits/digit-2.bmp differ diff --git a/res/digits/digit-3.bmp b/res/digits/digit-3.bmp new file mode 100755 index 0000000..0b75609 Binary files /dev/null and b/res/digits/digit-3.bmp differ diff --git a/res/digits/digit-4.bmp b/res/digits/digit-4.bmp new file mode 100755 index 0000000..88cb6e8 Binary files /dev/null and b/res/digits/digit-4.bmp differ diff --git a/res/digits/digit-5.bmp b/res/digits/digit-5.bmp new file mode 100755 index 0000000..d6d03f4 Binary files /dev/null and b/res/digits/digit-5.bmp differ diff --git a/res/digits/digit-6.bmp b/res/digits/digit-6.bmp new file mode 100755 index 0000000..9bca97a Binary files /dev/null and b/res/digits/digit-6.bmp differ diff --git a/res/digits/digit-7.bmp b/res/digits/digit-7.bmp new file mode 100755 index 0000000..538fafb Binary files /dev/null and b/res/digits/digit-7.bmp differ diff --git a/res/digits/digit-8.bmp b/res/digits/digit-8.bmp new file mode 100755 index 0000000..541457a Binary files /dev/null and b/res/digits/digit-8.bmp differ diff --git a/res/digits/digit-9.bmp b/res/digits/digit-9.bmp new file mode 100755 index 0000000..976c2af Binary files /dev/null and b/res/digits/digit-9.bmp differ diff --git a/res/digits/sign-minus.bmp b/res/digits/sign-minus.bmp new file mode 100755 index 0000000..9709c17 Binary files /dev/null and b/res/digits/sign-minus.bmp differ diff --git a/res/digits/sign-plus.bmp b/res/digits/sign-plus.bmp new file mode 100755 index 0000000..5c79139 Binary files /dev/null and b/res/digits/sign-plus.bmp differ diff --git a/res/digits/sign-prod.bmp b/res/digits/sign-prod.bmp new file mode 100755 index 0000000..cdb645f Binary files /dev/null and b/res/digits/sign-prod.bmp differ diff --git a/res/digits/sum-k.bmp b/res/digits/sum-k.bmp new file mode 100755 index 0000000..e078d79 Binary files /dev/null and b/res/digits/sum-k.bmp differ diff --git a/res/letters/letter-a.bmp b/res/letters/letter-a.bmp new file mode 100755 index 0000000..14f2b35 Binary files /dev/null and b/res/letters/letter-a.bmp differ diff --git a/res/letters/letter-b.bmp b/res/letters/letter-b.bmp new file mode 100755 index 0000000..262a69f Binary files /dev/null and b/res/letters/letter-b.bmp differ diff --git a/res/letters/letter-c.bmp b/res/letters/letter-c.bmp new file mode 100755 index 0000000..2679118 Binary files /dev/null and b/res/letters/letter-c.bmp differ diff --git a/res/letters/letter-d.bmp b/res/letters/letter-d.bmp new file mode 100755 index 0000000..5b8b9ba Binary files /dev/null and b/res/letters/letter-d.bmp differ diff --git a/res/letters/letter-e.bmp b/res/letters/letter-e.bmp new file mode 100755 index 0000000..de2b701 Binary files /dev/null and b/res/letters/letter-e.bmp differ diff --git a/res/letters/letter-f.bmp b/res/letters/letter-f.bmp new file mode 100755 index 0000000..2372800 Binary files /dev/null and b/res/letters/letter-f.bmp differ diff --git a/res/letters/letter-g.bmp b/res/letters/letter-g.bmp new file mode 100755 index 0000000..237148a Binary files /dev/null and b/res/letters/letter-g.bmp differ diff --git a/res/letters/letter-h.bmp b/res/letters/letter-h.bmp new file mode 100755 index 0000000..360b232 Binary files /dev/null and b/res/letters/letter-h.bmp differ diff --git a/res/letters/letter-i.bmp b/res/letters/letter-i.bmp new file mode 100755 index 0000000..be20a23 Binary files /dev/null and b/res/letters/letter-i.bmp differ diff --git a/res/letters/letter-j.bmp b/res/letters/letter-j.bmp new file mode 100755 index 0000000..e24a36f Binary files /dev/null and b/res/letters/letter-j.bmp differ diff --git a/res/letters/letter-k.bmp b/res/letters/letter-k.bmp new file mode 100755 index 0000000..feb33bf Binary files /dev/null and b/res/letters/letter-k.bmp differ diff --git a/res/letters/letter-l.bmp b/res/letters/letter-l.bmp new file mode 100755 index 0000000..c4c746f Binary files /dev/null and b/res/letters/letter-l.bmp differ diff --git a/res/letters/letter-m.bmp b/res/letters/letter-m.bmp new file mode 100755 index 0000000..227af44 Binary files /dev/null and b/res/letters/letter-m.bmp differ diff --git a/res/letters/letter-n.bmp b/res/letters/letter-n.bmp new file mode 100755 index 0000000..0493414 Binary files /dev/null and b/res/letters/letter-n.bmp differ diff --git a/res/letters/letter-o.bmp b/res/letters/letter-o.bmp new file mode 100755 index 0000000..5e66c2d Binary files /dev/null and b/res/letters/letter-o.bmp differ diff --git a/res/letters/letter-p.bmp b/res/letters/letter-p.bmp new file mode 100755 index 0000000..680a103 Binary files /dev/null and b/res/letters/letter-p.bmp differ diff --git a/res/letters/letter-q.bmp b/res/letters/letter-q.bmp new file mode 100755 index 0000000..ec1425b Binary files /dev/null and b/res/letters/letter-q.bmp differ diff --git a/res/letters/letter-r.bmp b/res/letters/letter-r.bmp new file mode 100755 index 0000000..cf35973 Binary files /dev/null and b/res/letters/letter-r.bmp differ diff --git a/res/letters/letter-s.bmp b/res/letters/letter-s.bmp new file mode 100755 index 0000000..778ab9d Binary files /dev/null and b/res/letters/letter-s.bmp differ diff --git a/res/letters/letter-t.bmp b/res/letters/letter-t.bmp new file mode 100755 index 0000000..789c76c Binary files /dev/null and b/res/letters/letter-t.bmp differ diff --git a/res/letters/letter-u.bmp b/res/letters/letter-u.bmp new file mode 100755 index 0000000..741d11f Binary files /dev/null and b/res/letters/letter-u.bmp differ diff --git a/res/letters/letter-v.bmp b/res/letters/letter-v.bmp new file mode 100755 index 0000000..69071e9 Binary files /dev/null and b/res/letters/letter-v.bmp differ diff --git a/res/letters/letter-w.bmp b/res/letters/letter-w.bmp new file mode 100755 index 0000000..46d063d Binary files /dev/null and b/res/letters/letter-w.bmp differ diff --git a/res/letters/letter-x.bmp b/res/letters/letter-x.bmp new file mode 100755 index 0000000..a8d4395 Binary files /dev/null and b/res/letters/letter-x.bmp differ diff --git a/res/letters/letter-y.bmp b/res/letters/letter-y.bmp new file mode 100755 index 0000000..5d6a432 Binary files /dev/null and b/res/letters/letter-y.bmp differ diff --git a/res/letters/letter-z.bmp b/res/letters/letter-z.bmp new file mode 100755 index 0000000..0c5ec0e Binary files /dev/null and b/res/letters/letter-z.bmp differ diff --git a/res/letters/ranking-A.png b/res/letters/ranking-A.png new file mode 100755 index 0000000..62bdba4 Binary files /dev/null and b/res/letters/ranking-A.png differ diff --git a/res/letters/ranking-B.png b/res/letters/ranking-B.png new file mode 100755 index 0000000..e6101be Binary files /dev/null and b/res/letters/ranking-B.png differ diff --git a/res/letters/ranking-C.png b/res/letters/ranking-C.png new file mode 100755 index 0000000..16fa5c5 Binary files /dev/null and b/res/letters/ranking-C.png differ diff --git a/res/letters/ranking-D.png b/res/letters/ranking-D.png new file mode 100755 index 0000000..030ce33 Binary files /dev/null and b/res/letters/ranking-D.png differ diff --git a/res/letters/ranking-S.png b/res/letters/ranking-S.png new file mode 100755 index 0000000..02486e2 Binary files /dev/null and b/res/letters/ranking-S.png differ diff --git a/res/letters/ranking-X.png b/res/letters/ranking-X.png new file mode 100755 index 0000000..dc9cec7 Binary files /dev/null and b/res/letters/ranking-X.png differ diff --git a/res/letters/symbol-percent.bmp b/res/letters/symbol-percent.bmp new file mode 100755 index 0000000..034c65c Binary files /dev/null and b/res/letters/symbol-percent.bmp differ diff --git a/src/base.c b/src/base.c new file mode 100644 index 0000000..b6b6b97 --- /dev/null +++ b/src/base.c @@ -0,0 +1,516 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "structure.h" +#include "base.h" + +imgs digits ; +imgs letters ; + +int ln_baseN(int n, int b) { + int r = 0; + while(n != 0) { + n = n / b; + r++; + } + return r; +} + +int pw(int x, int n) { + if (n<0) + return 0; + if (n==0) + return 1; + if (n%2==0) + return pw(x*x, n/2); + return x*pw(x*x, n/2); +} + +int abs(int n) { + if(n > 0) { + return n; + } else { + return (-n); + } +} + +int min(int a, int b) { + if(a > b) { + return b; + }; + return a; +} + +int max(int a, int b) { + if(a < b) { + return b; + }; + return a; +} + +double absf(double n) { + if(n > 0.0f) { + return n; + } else { + return (-n); + } +} + +int convex_seg(int x1, int x2, double theta) { + return (int)(((1.0f - theta) * x1 + theta * x2)); +} + +bool is_an_integer(char c) { + return ((int)c >= 48 && (int)c <= 57); +} + +double to_double(int n) { + return (double)n ; +} + +int to_int(double n) { + return (int)n ; +} + +double distance_pt(int x1, int x2, int y1, int y2) { + return sqrt(to_double(pw(x2 - x1, 2) + pw(y2 - y1, 2))); +} + +int line_count(char* filename) { + FILE* ptr = fopen(filename, "r"); + char c = 'd'; + + int n = 0 ; + while(c != EOF) { + if(c == '\n') { + n += 1; + }; + c = fgetc(ptr); + }; + fclose(ptr); + return (n+1); +} + +int str_to_int(char* s) { + int res = 0 ; + int i = 0 ; + while(s[i] != '\0' && is_an_integer(s[i])) { + res *= 10 ; + res += (int)s[i] - 48 ; + i++; + }; + return res; +} + +int get_integer(FILE* ptr) { + char c = fgetc(ptr); + + int res = 0 ; + int sign = 1; + + if(c == '-') { + sign = -1; + c = fgetc(ptr); + }; + + while(is_an_integer(c)) { + res = 10*res + (int)c - 48; + c = fgetc(ptr); + }; + return (res*sign); +} + +int get_integer_plus_align(FILE* ptr, FILE* ptr2) { + char c = fgetc(ptr); + char c2 = fgetc(ptr2); + + int res = 0 ; + int sign = 1; + + if(c == '-') { + sign = -1; + c = fgetc(ptr); + c2 = fgetc(ptr2); + }; + + while(is_an_integer(c)) { + res = 10*res + (int)c - 48; + c = fgetc(ptr); + c2 = fgetc(ptr2); + }; + return (res*sign); +} + +int count_char_in_line(FILE* ptr, char target) { + int res = 0 ; + char c = fgetc(ptr); + + while(c != EOF && c != '\n') { + if(c == target) { + res += 1; + } + c = fgetc(ptr); + }; + + return res; +} + +void terminate_line(FILE* ptr) { + char c = fgetc(ptr); + while(c != '\n' && c != EOF) { + c = fgetc(ptr); + } +} + +bool str_equal(char* s1, char* s2) { + if(s1[0] == '\0' || s2[0] == '\0') { + return (s1[0] == '\0' && s2[0] == '\0'); + } + return (s1[0] == s2[0] && str_equal(&s1[1], &s2[1])); +} + +// ------------------------------------------------------------------------------------------------ // + +void linked_add(linkedList* lst, int x, int y, char* flag) { + if(lst == NULL) { + fprintf(stderr, "ERROR : linked list has not been initialized\n"); + exit(1); + } else if(lst->next == NULL) { + lst->next = malloc(sizeof(linkedList)); + lst->next->coord = x + 16*y ; + lst->next->flag = flag ; + lst->next->next = NULL ; + } else { + linked_add(lst->next, x, y, flag); + } +} + +void linked_removeCoord(linkedList* lst, int x, int y) { + if(lst != NULL) { + if(lst->coord == x + 16*y) { + linkedList* temp = lst->next ; + free(lst) ; + lst = temp ; + } else { + linked_removeCoord(lst->next, x, y); + } + } +} + +void linked_removeFlag(linkedList* lst, char* flag) { + if(lst != NULL) { + if(lst->flag == flag) { + linkedList* temp = lst->next ; + free(lst) ; + lst = temp ; + } else { + linked_removeFlag(lst->next, flag); + } + } +} + +void linked_change(linkedList* lst, int x, int y, char* flag) { + linked_removeCoord(lst, x, y); + linked_add(lst, x, y, flag); +} + +bool linked_mem(linkedList* lst, int x, int y, char** flag) { + if(lst == NULL) { + return false; + } + if(lst->coord == x + 16*y) { + *flag = lst->flag; + return true ; + } + return linked_mem(lst->next, x, y, flag); +} + +linkedList* linked_copy(linkedList* src) { + linkedList* new = malloc(sizeof(linkedList)) ; + new->flag = "E" ; + new->coord = 0 ; + new->next = NULL ; + + //printf("in\n"); + linkedList* curSrc = src->next ; + //printf("out\n"); + + while(curSrc != NULL) { + //printf("cp\n"); + linked_add(new, curSrc->coord%8, curSrc->coord/16, curSrc->flag); + curSrc = curSrc->next; + } + + return new ; +} + +void linkedPrint(linkedList* lst) { + if(lst != NULL) { + printf("[(%d, %d), %s] ", lst->coord%8, lst->coord/16, lst->flag); + linkedPrint(lst->next); + } +} + +// ------------------------------------------------------------------------------------------------ // + +void import_digits(SDL_Renderer* renderer) { + imgs res; + res.arr = malloc(sizeof(SDL_Texture*)*11); + SDL_Texture* texture; + SDL_Surface* img; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-0.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[0] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-1.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[1] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-2.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[2] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-3.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[3] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-4.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[4] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-5.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[5] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-6.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[6] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-7.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[7] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-8.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[8] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/digit-9.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[9] = texture; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/digits/sign-minus.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[10] = texture; + + res.len = 11 ; + digits = res; +} + +void import_letters(SDL_Renderer* renderer) { + imgs res; + res.arr = malloc(sizeof(SDL_Texture*)*26); + SDL_Texture* texture; + SDL_Surface* img; + + int cc = 0 ; + + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-a.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-b.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-c.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-d.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-e.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-f.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-g.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-h.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-i.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-j.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-k.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-l.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-m.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-n.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-o.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-p.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-q.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-r.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-s.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-t.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-u.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-v.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-w.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-x.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-y.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + cc += 1 ; + // -------------------------------------------------------- // + img = SDL_LoadBMP("./res/letters/letter-z.bmp"); + texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + res.arr[cc] = texture; + + res.len = 26 ; + letters = res; +} + +void free_digits(imgs dgts) { + for(int i = 0; i < dgts.len; i++) { + SDL_DestroyTexture(dgts.arr[i]); + } + free(dgts.arr); +} \ No newline at end of file diff --git a/src/base.h b/src/base.h new file mode 100644 index 0000000..18d2764 --- /dev/null +++ b/src/base.h @@ -0,0 +1,60 @@ +#ifndef BACK_BASE_H +#define BACK_BASE_H + +int ln_baseN(int n, int b); + +int pw(int x, int n); + +int abs(int n); + +int min(int a, int b); + +int max(int a, int b); + +double absf(double n); + +int convex_seg(int x1, int x2, double theta); + +bool is_an_integer(char c); + +double to_double(int n); + +int to_int(double n); + +double distance_pt(int x1, int x2, int y1, int y2); + +int line_count(char* filename); + +int str_to_int(char* s); + +int get_integer(FILE* ptr); + +int get_integer_plus_align(FILE* ptr, FILE* ptr2); + +int count_char_in_line(FILE* ptr, char c); + +void terminate_line(FILE* ptr); + +bool str_equal(char* s1, char* s2); + +void linked_add(linkedList* lst, int x, int y, char* flag); + +void linked_removeCoord(linkedList* lst, int x, int y); + +void linked_removeFlag(linkedList* lst, char* flag); + +void linked_change(linkedList* lst, int x, int y, char* flag); + +bool linked_mem(linkedList* lst, int x, int y, char** flag); + +linkedList* linked_copy(linkedList* src); + +void linkedPrint(linkedList* lst); + +void import_digits(SDL_Renderer* renderer); + +void import_letters(SDL_Renderer* renderer); + +void free_digits(imgs dgts); + +#endif \ No newline at end of file diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..b18df64 --- /dev/null +++ b/src/display.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "structure.h" +#include "base.h" +#include "generation.h" +#include "display.h" + +void updateRenderer(SDL_Renderer* renderer) { + //printf("E"); + SDL_RenderPresent(renderer); +} + +void resetRenderer(SDL_Renderer* renderer) { + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); +} + +void drawRectToRenderer(SDL_Renderer* renderer, SDL_Rect* rect, int R, int G, int B, int A) { + SDL_SetRenderDrawColor(renderer, R, G, B, A); + SDL_RenderFillRect(renderer, rect); +} + +void placeRectToRenderer(SDL_Renderer* renderer, int X, int Y, int W, int H, int R, int G, int B, int A) { + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + SDL_SetRenderDrawColor(renderer, R, G, B, A); + SDL_RenderFillRect(renderer, &rect); +} + +void drawLineWithThicc(SDL_Renderer* renderer, int width, int x1, int x2, int y1, int y2, int R, int G, int B, int A) { + // draws line with width (native SDL cannot do that) + double theta = 0.0; + double seglen = distance_pt(x1, x2, y1, y2); + while(theta < 1.0) { + placeRectToRenderer(renderer, convex_seg(x1, x2, theta)-width/2, convex_seg(y1, y2, theta)-width/2, width, width, R, G, B, A); + theta += 1 / seglen; + } +} + +void drawLineWithThiccGradient(SDL_Renderer* renderer, int start_width, int end_width, int x1, int x2, int y1, int y2, int R, int G, int B, int A) { + // draws line with width ; + // width goes from start_width to end_with in a linear way + double theta = 0.0; + double seglen = distance_pt(x1, x2, y1, y2); + while(theta < 1.0) { + int width = convex_seg(start_width, end_width, theta) ; + placeRectToRenderer(renderer, convex_seg(x1, x2, theta)-width/2, convex_seg(y1, y2, theta)-width/2, width, width, R, G, B, A); + theta += 1 / seglen; + } +} + +void drawDigitToRenderer(SDL_Renderer* renderer, imgs data, int digit, int X, int Y, int W, int H) { + if(digit == -727) { + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + + SDL_Texture* texture = data.arr[10]; + + SDL_RenderCopy(renderer, texture, NULL, &rect); + } else if (!(0 <= digit && digit <= 9)) { + fprintf(stderr, "Illegal digit : '%d'.\n", digit); + exit(1); + } else { + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + + SDL_Texture* texture = data.arr[digit]; + + SDL_RenderCopy(renderer, texture, NULL, &rect); + } +} + +void drawCharToRenderer(SDL_Renderer* renderer, imgs data, char c, int X, int Y, int W, int H) { + if ((int)c >= 97 && (int)c <= 122) { + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + + SDL_Texture* texture = data.arr[(int)c - 97]; + + SDL_RenderCopy(renderer, texture, NULL, &rect); + } +} + +void drawNumberToRenderer(SDL_Renderer* renderer, imgs data, int n, int X, int Y, int W, int H, int Woffset) { + if(n == 0) { + drawDigitToRenderer(renderer, data, 0, X + W, Y, W, H); + } else if(n > 0) { + int toDraw = 0, remaining = n, nIter = ln_baseN(n, 10); + while(nIter != 0) { + toDraw = remaining%10; + remaining = remaining / 10; + drawDigitToRenderer(renderer, data, toDraw, X + (W-Woffset)*nIter, Y, W, H); + nIter--; + } + } else { + int toDraw = 0, remaining = -n, nIter = ln_baseN(-n, 10); + drawDigitToRenderer(renderer, data, -727, X, Y, W, H); + while(nIter != 0) { + toDraw = remaining%10; + remaining = remaining / 10; + drawDigitToRenderer(renderer, data, toDraw, X + (W-Woffset)*nIter, Y, W, H); + nIter--; + } + } +} + +void drawStringToRenderer(SDL_Renderer* renderer, imgs data, char* s, int X, int Y, int W, int H) { + int k = 0 ; + while(s[k] != '\0') { + drawCharToRenderer(renderer, data, s[k], X + W*k, Y, W, H); + k += 1; + } +} diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..dc169db --- /dev/null +++ b/src/display.h @@ -0,0 +1,24 @@ +#ifndef DISPLAY_H +#define DISPLAY_H + +void updateRenderer(SDL_Renderer* renderer); + +void resetRenderer(SDL_Renderer* renderer); + +void drawRectToRenderer(SDL_Renderer* renderer, SDL_Rect* rect, int R, int G, int B, int A); + +void placeRectToRenderer(SDL_Renderer* renderer, int X, int Y, int W, int H, int R, int G, int B, int A); + +void drawLineWithThicc(SDL_Renderer* renderer, int width, int x1, int x2, int y1, int y2, int R, int G, int B, int A); + +void drawLineWithThiccGradient(SDL_Renderer* renderer, int start_width, int end_width, int x1, int x2, int y1, int y2, int R, int G, int B, int A); + +void drawDigitToRenderer(SDL_Renderer* renderer, imgs data, int digit, int X, int Y, int W, int H); + +void drawCharToRenderer(SDL_Renderer* renderer, imgs data, char c, int X, int Y, int W, int H); + +void drawNumberToRenderer(SDL_Renderer* renderer, imgs data, int n, int X, int Y, int W, int H, int Woffset); + +void drawStringToRenderer(SDL_Renderer* renderer, imgs data, char* s, int X, int Y, int W, int H); + +#endif \ No newline at end of file diff --git a/src/generation.c b/src/generation.c new file mode 100644 index 0000000..0885334 --- /dev/null +++ b/src/generation.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "structure.h" +#include "base.h" +#include "generation.h" + +// ------------------------------------------------------------------------ // \ No newline at end of file diff --git a/src/generation.h b/src/generation.h new file mode 100644 index 0000000..00f3ac3 --- /dev/null +++ b/src/generation.h @@ -0,0 +1,6 @@ +#ifndef GEN_H +#define GEN_H + + + +#endif \ No newline at end of file diff --git a/src/hash.c b/src/hash.c new file mode 100644 index 0000000..ea62a13 --- /dev/null +++ b/src/hash.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" + +// Cantor pairing function +int cantor(int x, int y) { + return ((x + y) * (x + y + 1) / 2) + y; +} + +int generate_hash(int x, int y) { + if (x < 0) { + x = -2*x - 1; + } else { + x = 2 * x; + } + if (y < 0) { + y = -2*y - 1; + } else { + y = 2 * y; + } + return cantor(x, y); +} + +void freeGrid(Grid grid) { + for (int i = 0; i < grid->capacity; i++) { + List list = grid->data[i]; + while (list != NULL) { + List next = list->next; + free(list); + list = next; + } + } + free(grid->data); + free(grid); +} + +void subGridInsert(Grid grid, int hash, chunk* elt, int x, int y) { + int index = hash % grid->capacity; + //printf(" inserting at index [%d]", index); + List* data = grid->data; + if (data[index] == NULL) { + //printf(" <-->\n"); + List list = malloc(sizeof(struct List)); + list->hash = hash; + list->x = x; + list->y = y; + list->elt = elt; + list->next = NULL; + grid->size++; + data[index] = list; + } else { + //printf(" <>\n"); + List list = data[index]; + while (list->next != NULL && list->hash != hash) { + list = list->next; + }; + //printf(" <>\n"); + if (list->x == x && list->y == y) { + list->elt = elt; + } else { + List nex = malloc(sizeof(struct List)); + nex->hash = hash; + nex->x = x; + nex->y = y; + nex->elt = elt; + nex->next = NULL; + list->next = nex; + grid->size++; + } + } +} + +void gridInsert(Grid grid, int x, int z, chunk* elt) { + if (grid->size >= grid->capacity * grid->loadFactor) { + grid->size = 0; + grid->capacity *= 2; + + printf("resizing\n"); + + List* old_data = grid->data; + grid->data = malloc(sizeof(List) * grid->capacity);; + for (int i = 0; i < grid->capacity; i++) { + grid->data[i] = NULL; + }; + for (int i = 0; i < grid->capacity/2; i++) { + List list = old_data[i]; + while (list != NULL) { + subGridInsert(grid, list->hash, list->elt, list->x, list->y); + list = list->next; + } + } + }; + + int hash = generate_hash(x, z); + subGridInsert(grid, hash, elt, x, z); +} + +chunk* gridGet(Grid grid, int x, int z) { + int hash = generate_hash(x, z); + int index = hash % grid->capacity; + List list = grid->data[index]; + while (list != NULL && (list->x != x || list->y != z)) { + list = list->next; + } + if (list == NULL) { + return NULL; + } + return list->elt; +} + +bool gridMem(Grid grid, int x, int z) { + int hash = generate_hash(x, z); + int index = hash % grid->capacity; + List list = grid->data[index]; + while (list != NULL && (list->x != x || list->y != z)) { + list = list->next; + } + if (list == NULL) { + return false; + } + return true; +} + +chunk* gridRemove(Grid grid, int x, int z) { + int hash = generate_hash(x, z); + int index = hash % grid->capacity; + List list = grid->data[index]; + List prev = NULL; + while (list != NULL && list->hash != hash) { + prev = list; + list = list->next; + } + if (list == NULL) { + return NULL; + } + chunk* elt = list->elt; + if (prev == NULL) { + grid->data[index] = list->next; + } else { + prev->next = list->next; + } + free(list); + grid->size--; + return elt; +} + +Grid newGrid() { + Grid grid = malloc(sizeof(struct Grid)); + grid->data = malloc(sizeof(List) * 800); + grid->size = 0; + grid->capacity = 800; + grid->loadFactor = 0.75; + for (int i = 0; i < grid->capacity; i++) { + grid->data[i] = NULL; + } + grid->push = &gridInsert; + grid->pop = &gridRemove; + grid->get = &gridGet; + grid->mem = &gridMem; + return grid; +} + +chunk** gridIter(Grid grid) { + chunk** array = malloc(sizeof(chunk*) * grid->size); + int index = 0; + for (int i = 0; i < grid->capacity; i++) { + List list = grid->data[i]; + while (list != NULL) { + array[index++] = list->elt; + list = list->next; + } + } + return array; +} + +ChunkCoord newChunkCoord(int x, int z) { + ChunkCoord coord = malloc(sizeof(struct ChunkCoord)); + coord->x = x; + coord->z = z; + return coord; +} + +void freeChunkCoord(ChunkCoord coord) { + free(coord); +} diff --git a/src/hash.h b/src/hash.h new file mode 100644 index 0000000..453276b --- /dev/null +++ b/src/hash.h @@ -0,0 +1,75 @@ +// credit to Benoit // + +#ifndef GRID_H +#define GRID_H +#include + +typedef struct linkedList { + uint8_t coord ; // coord%8 = x ; coord/16 = y + char* flag ; + struct linkedList* next ; +} linkedList ; + +typedef struct template { + uint8_t id ; + uint8_t* lines ; // len = 8 + + bool checkCompat ; + + uint8_t eastsig ; + uint8_t westsig ; + + linkedList* meta ; +} template ; + +typedef struct chunk { + int16_t chx ; + int16_t chy ; + + int draw_id ; + + template chdata ; +} chunk ; + +// + +typedef struct List { + int hash; + int x; + int y; + chunk* elt; + struct List* next; +} *List; + +typedef struct Grid { + List* data; + int capacity; + int size; + double loadFactor; + void (*push)(struct Grid *grid, int x, int z, chunk* elt); + chunk* (*pop)(struct Grid *grid, int x, int z); + chunk* (*get)(struct Grid *grid, int x, int z); + bool (*mem)(struct Grid *grid, int x, int z); +} *Grid; + +int generate_hash(int x, int y); + +Grid newGrid(); +void freeGrid(Grid grid); + +void gridInsert(Grid grid, int x, int z, chunk* elt); +chunk* gridGet(Grid grid, int x, int z); +bool gridMem(Grid grid, int x, int z); +chunk* gridRemove(Grid grid, int x, int z); + +chunk** gridIter(Grid grid); + +typedef struct ChunkCoord { + int x; + int z; +} *ChunkCoord; + +ChunkCoord newChunkCoord(int x, int z); +void freeChunkCoord(ChunkCoord coord); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..8e14a5d --- /dev/null +++ b/src/main.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "structure.h" +#include "base.h" +#include "display.h" +#include "generation.h" + +int main(int argc, char** argv) { + srand(time(NULL)); + + //-------------------------------------------------------------------------------// + + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { + printf("error initializing SDL: %s\n", SDL_GetError()); + } + SDL_Window* win = SDL_CreateWindow("Game", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, + 1000, 1000, 0); + + Uint32 render_flags = SDL_RENDERER_ACCELERATED; + SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags); + SDL_SetRenderDrawBlendMode(rend, SDL_BLENDMODE_BLEND); + //-------------------------------------------------------------------------------// + + if(SDL_Init(SDL_INIT_AUDIO)) { + fprintf(stderr, "cannot initialize audio"); + exit(1); + } + + /* -------------------------------------------------------- */ + + + + /* -------------------------------------------------------- */ + + SDL_DestroyRenderer(rend); + SDL_DestroyWindow(win); + SDL_Quit(); + + /* -------------------------------------------------------- */ + + printf("Done\n") ; + + return 0; +} \ No newline at end of file diff --git a/src/structure.h b/src/structure.h new file mode 100644 index 0000000..2ec4cb1 --- /dev/null +++ b/src/structure.h @@ -0,0 +1,12 @@ +#ifndef BACK_CONSTS_H +#define BACK_CONSTS_H + +typedef struct imgs { + int len; + SDL_Texture** arr; +} imgs ; + +extern imgs digits ; +extern imgs letters ; + +#endif \ No newline at end of file