commit e12fe8d1f7c43f1b54ef834f3cc4e400ad1c80b8 Author: alexandre Date: Sat Apr 6 11:58:42 2024 +0200 here we go diff --git a/display.c b/display.c new file mode 100644 index 0000000..fdd2093 --- /dev/null +++ b/display.c @@ -0,0 +1,275 @@ +#include "structure.c" + +void remove_lanes(int n) { + for(int i = 0; i < n; i++) { + printf("\x1b[1F"); + printf("\x1b[2K"); + } +} + +void updateRenderer(SDL_Renderer* renderer) { + SDL_RenderPresent(renderer); +} + +void resetRenderer(SDL_Renderer* renderer) { + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); +} + +void refreshRenderer(SDL_Renderer* renderer) { + resetRenderer(renderer); + updateRenderer(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); +} + +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 == 1) { + return x; + } + return x*pw(x, n-1); +} + +void drawCharToRenderer(SDL_Renderer* renderer, char c, int X, int Y, int W, int H) { + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + SDL_Surface* img; + switch(c) { + case 'a': + img = SDL_LoadBMP("./letters/letter-a.bmp"); + break; + case 'b': + img = SDL_LoadBMP("./letters/letter-b.bmp"); + break; + case 'c': + img = SDL_LoadBMP("./letters/letter-c.bmp"); + break; + case 'd': + img = SDL_LoadBMP("./letters/letter-d.bmp"); + break; + case 'e': + img = SDL_LoadBMP("./letters/letter-e.bmp"); + break; + case 'f': + img = SDL_LoadBMP("./letters/letter-f.bmp"); + break; + case 'g': + img = SDL_LoadBMP("./letters/letter-g.bmp"); + break; + case 'h': + img = SDL_LoadBMP("./letters/letter-h.bmp"); + break; + case 'i': + img = SDL_LoadBMP("./letters/letter-i.bmp"); + break; + case 'j': + img = SDL_LoadBMP("./letters/letter-j.bmp"); + break; + case 'k': + img = SDL_LoadBMP("./letters/letter-k.bmp"); + break; + case 'l': + img = SDL_LoadBMP("./letters/letter-l.bmp"); + break; + case 'm': + img = SDL_LoadBMP("./letters/letter-m.bmp"); + break; + case 'n': + img = SDL_LoadBMP("./letters/letter-n.bmp"); + break; + case 'o': + img = SDL_LoadBMP("./letters/letter-o.bmp"); + break; + case 'p': + img = SDL_LoadBMP("./letters/letter-p.bmp"); + break; + case 'q': + img = SDL_LoadBMP("./letters/letter-q.bmp"); + break; + case 'r': + img = SDL_LoadBMP("./letters/letter-r.bmp"); + break; + case 's': + img = SDL_LoadBMP("./letters/letter-s.bmp"); + break; + case 't': + img = SDL_LoadBMP("./letters/letter-t.bmp"); + break; + case 'u': + img = SDL_LoadBMP("./letters/letter-u.bmp"); + break; + case 'v': + img = SDL_LoadBMP("./letters/letter-v.bmp"); + break; + case 'w': + img = SDL_LoadBMP("./letters/letter-w.bmp"); + break; + case 'x': + img = SDL_LoadBMP("./letters/letter-x.bmp"); + break; + case 'y': + img = SDL_LoadBMP("./letters/letter-y.bmp"); + break; + case 'z': + img = SDL_LoadBMP("./letters/letter-z.bmp"); + break; + case '-': + img = SDL_LoadBMP("./digits/sign-minus.bmp"); + break; + default: + printf("Wait, thats illegal (%c)\n", c); + break; + } + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + SDL_RenderCopy(renderer, texture, NULL, &rect); +} + +void drawStringToRenderer(SDL_Renderer* renderer, char* str, int X, int Y, int W, int H) { + char c = str[0]; + int i = 0; + int cX = X; + while((int)(c) != 0) { + if(c != ' ') { + drawCharToRenderer(renderer, c, cX, Y, W, H); + } + i++; + cX += W; + c = str[i]; + } +} + +void drawDigitToRenderer(SDL_Renderer* renderer, int digit, int X, int Y, int W, int H) { + assert(digit - digit%10 == 0 && digit >= 0); + SDL_Rect rect; + rect.x = X; + rect.y = Y; + rect.w = W; + rect.h = H; + SDL_Surface* img; + switch(digit) { + case 0 : + img = SDL_LoadBMP("./digits/digit-0.bmp"); + break; + case 1 : + img = SDL_LoadBMP("./digits/digit-1.bmp"); + break; + case 2 : + img = SDL_LoadBMP("./digits/digit-2.bmp"); + break; + case 3 : + img = SDL_LoadBMP("./digits/digit-3.bmp"); + break; + case 4 : + img = SDL_LoadBMP("./digits/digit-4.bmp"); + break; + case 5 : + img = SDL_LoadBMP("./digits/digit-5.bmp"); + break; + case 6 : + img = SDL_LoadBMP("./digits/digit-6.bmp"); + break; + case 7 : + img = SDL_LoadBMP("./digits/digit-7.bmp"); + break; + case 8 : + img = SDL_LoadBMP("./digits/digit-8.bmp"); + break; + case 9 : + img = SDL_LoadBMP("./digits/digit-9.bmp"); + break; + default: + printf("Wait, thats illegal\n"); + break; + } + + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img); + SDL_FreeSurface(img); + SDL_RenderCopy(renderer, texture, NULL, &rect); +} + +void drawNumberToRenderer(SDL_Renderer* renderer, int n, int X, int Y, int W, int H, int Woffset) { + if(n == 0) { + drawDigitToRenderer(renderer, 0, X + W, Y, W, H); + } else { + int toDraw = 0, remaining = n, nIter = ln_baseN(n, 10); + while(nIter != 0) { + toDraw = remaining%10; + remaining = remaining / 10; + drawDigitToRenderer(renderer, toDraw, X + (W-Woffset)*nIter, Y, W, H); + nIter--; + } + } +} + +void drawDateToRenderer(SDL_Renderer* renderer, date d, int X, int Y, int W, int H) { + int cX = X; + drawNumberToRenderer(renderer, d.day, cX, Y, W, H, 0); + cX += (1+ln_baseN(d.day, 10))*W; + drawCharToRenderer(renderer, '-', cX, Y, W, H); + drawNumberToRenderer(renderer, d.month, cX, Y, W, H, 0); + cX += (1+ln_baseN(d.day, 10))*W; + drawCharToRenderer(renderer, '-', cX, Y, W, H); + drawNumberToRenderer(renderer, d.year, cX, Y, W, H, 0); +} + +void print_one_week(SDL_Renderer* renderer, creneau* edt, int len_creneau, date start, int w, int h, int offset_x, int offset_y) { /* + 1) print names + 2) print weeks + 3) print groups */ + resetRenderer(renderer); + + int wd = 75/3; + int ht = 105/3; + + int i = 0; + + //printf("%d \n", date_dist(start, edt[i].date)); + + // locate the specified week in edt + while(i < len_creneau && (date_dist(start, edt[i].date) == -1)) { + i++; + } + + drawStringToRenderer(renderer, "from", 10, 10, wd, ht); + drawDateToRenderer(renderer, start, 10+5*wd, 10, wd, ht); + // print the corresponding week + while(i < len_creneau && (date_dist(start, edt[i].date) < 7)) { + printf("%d %d %d %d\n", edt[i].date.hour, edt[i].date.day, edt[i].date.month, edt[i].date.year); + i++; + } + if(i < len_creneau) { + drawStringToRenderer(renderer, "to", width/2+3*wd, 10, wd, ht); + drawDateToRenderer(renderer, edt[i].date, width/2+5*wd, 10, wd, ht); + } else { + drawStringToRenderer(renderer, "to", width/2+3*wd, 10, wd, ht); + drawDateToRenderer(renderer, edt[i-1].date, width/2+5*wd, 10, wd, ht); + } + updateRenderer(renderer); + usleep(3000000); +} \ No newline at end of file diff --git a/file.txt b/file.txt new file mode 100644 index 0000000..c626282 --- /dev/null +++ b/file.txt @@ -0,0 +1,22 @@ +18 1 1 2024 +18 2 1 2024 +13 3 1 2024 +14 3 1 2024 +15 3 1 2024 +17 3 1 2024 +17 4 1 2024 +18 4 1 2024 +16 5 1 2024 +17 5 1 2024 +18 5 1 2024 +17 7 1 2024 +18 7 1 2024 +18 8 1 2024 +14 9 1 2024 +15 9 1 2024 +16 9 1 2024 +17 10 1 2024 +18 10 1 2024 +18 11 1 2024 + +$ \ No newline at end of file diff --git a/images.zip b/images.zip new file mode 100644 index 0000000..d760280 Binary files /dev/null and b/images.zip differ diff --git a/main.c b/main.c new file mode 100644 index 0000000..25a03d2 --- /dev/null +++ b/main.c @@ -0,0 +1,37 @@ +#include "display.c" + +// gcc -g -Wall -Wextra -Wpedantic main.c -lSDL2 -lSDL2_image -lm -o main + +int main() { + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { + printf("error initializing SDL: %s\n", SDL_GetError()); + } + SDL_Window* win = SDL_CreateWindow("a game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); + + Uint32 render_flags = SDL_RENDERER_ACCELERATED; + SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags); + SDL_SetRenderDrawBlendMode(rend, SDL_BLENDMODE_BLEND); + + creneau* edt = import_creneaux("file.txt", 20); + + //printf("%d %d %d %d\n", edt[10].date.hour, edt[10].date.day, edt[10].date.month, edt[10].date.year); + + date d1 = {17, 4, 1, 2024}; + //printf("%d %d %d %d\n", edt[0].date.hour, edt[0].date.day, edt[0].date.month, edt[0].date.year); + + print_one_week(rend, edt, 20, d1, 10, 10, 10, 10); + + + /* + date d1 = {19, 20, 2, 2023}; + date d2 = {18, 3, 4, 2023}; + + printf("%d\n", date_dist(d1, d2)); + */ + + + SDL_DestroyRenderer(rend); + SDL_DestroyWindow(win); + SDL_Quit(); + return 0; +} diff --git a/structure.c b/structure.c new file mode 100644 index 0000000..d7d1173 --- /dev/null +++ b/structure.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef enum topic {MATH, PHYSICS, ENGLISH, FRENCH, INFO} topic; +// colles subjects + +typedef struct date {int hour; int day; int month; int year;} date; +// nothing to say here + +typedef struct creneau {date date; int group; char* name; topic mat;} creneau; +// créneau de colle +// /!\ creneau has to be sorted by ascending dates + +typedef struct colleur {char* name; topic mat; date* disp; int n_disp;} colleur; +// available creneaux for the colleurs + +static int width = 1200; +static int height = 900; + +int date_dist(date d1, date d2) { + // returns distance between d1 and d2 in days + // if d2 is sooner than d1, it will return -1 + if(d2.month == d1.month && d2.year == d1.year) { + if(d2.day < d1.day) { + return -1; + } + return d2.day - d1.day; + } else { + int is_31 = 0; + if(d1.month == 1 || d1.month == 3 || d1.month == 5 || d1.month == 7 || d1.month == 8 || d1.month == 10 || d1.month == 12) { + is_31 = 1; + } else { + is_31 = (d1.month == 2)*(-2) + (d1.month == 2 && d1.year%4 == 0 && d1.year%100 != 0); + } + if(d2.month - d1.month < 0 && d2.year <= d1.year) { + return -1; + } else if(d2.month - d1.month == 1 && d2.year == d1.year) { + return d2.day + (30 + is_31 - d1.day); + } else { + date copy; + copy.day = d1.day; + copy.month = d1.month; + copy.year = d1.year; + copy.month = (copy.month + 1); + if(copy.month == 13) { + copy.month = 1; + copy.year += 1; + } + return (30 + is_31 + date_dist(copy, d2)); + } + } +} + +creneau* import_creneaux(char* filename, int size) { + // import creneau data from a file + // see file.txt for an example + FILE* ptr = fopen(filename, "r"); + char c = fgetc(ptr); + + creneau* edt = malloc(sizeof(creneau)*size); + int i = 0; + int to_fill = 0; + + int buffer = 0; + + while(c != EOF && c != '$') { + if((int)(c) >= 48 && (int)(c) <= 57) { + buffer *= 10; + buffer += (int)(c) - 48; + } else { + if(to_fill == 0) { + edt[i].date.hour = buffer; + } else if(to_fill == 1) { + edt[i].date.day = buffer; + } else if(to_fill == 2) { + edt[i].date.month = buffer; + } else { + edt[i].date.year = buffer; + } + to_fill++; + buffer = 0; + if(c == '\n') { + i++; + to_fill = 0; + } + } + c = fgetc(ptr); + } + + fclose(ptr); + return edt; +} \ No newline at end of file