sav

Sorting Algorithms Visualized
Index Commits Files Refs README LICENSE
commit 56f6a24f96bd857dc7e7e35f963cb4ce69ed7073
parent cf525ad73240bbcee614e4a41a90d2494803fd4e
Author: klewer-martin <martin.cachari@gmail.com>
Date:   Tue, 29 Mar 2022 18:46:04 -0300

New module created, SAV - Sorting Algorithms Visualized

This new module contains, the most general data of the app, like the
status, the item of the algorithm that is being selected and compared,
and the array that is being sorted

Diffstat:
Mdrw.c | 19+++++++++++++++++++
Mdrw.h | 7+++++++
Msav.c | 145++++++++++++++++++++-----------------------------------------------------------
Asav.h | 12++++++++++++
Msort.c | 45++++++++++++++++++++++-----------------------
Msort.h | 7+++++--
Mutil.c | 8++++++++
Mutil.h | 7+++++++
8 files changed, 117 insertions(+), 133 deletions(-)
diff --git a/drw.c b/drw.c
@@ -39,3 +39,22 @@ drw_element_color(SDL_Renderer *rend, int x, int y, int h, unsigned int col) {
     SDL_SetRenderDrawColor(rend, 0, 0, 0, 0);
     SDL_RenderDrawLine(rend, x + X_BORDER, y - Y_BORDER, x + X_BORDER, y - Y_BORDER - h);
 }
+
+void
+drw_array_graph(SDL_Renderer *rend, SDL_Window *win, SAV *sav) {
+    int x, w, h;
+
+    SDL_GetWindowSize(win, &w, &h);
+
+    SDL_SetRenderDrawColor(rend, 29, 28, 28, 0);
+    SDL_RenderClear(rend);
+
+    size_t i;
+    for(i = x = 0; i < sav->arr->len; i++, x += RECT_WIDTH) {
+        if(i == sav->sel) drw_element_color(rend, x, h, sav->arr->v[i], SEL_COLOR);
+        else if(i == sav->cmp) drw_element_color(rend, x, h, sav->arr->v[i], CMP_COLOR);
+        else drw_element(rend, x, h, sav->arr->v[i]);
+    }
+
+    SDL_RenderPresent(rend);
+}
diff --git a/drw.h b/drw.h
@@ -6,8 +6,15 @@
 #include <SDL2/SDL_image.h>
 
 #include "util.h"
+#include "sav.h"
+
+#define SEL_COLOR    0x00FF0000 // RGBA (A not used rn)
+#define CMP_COLOR    0x00FFFF00
 
 void drw_element(SDL_Renderer *rend, int x, int y, int h);
+/* void draw_array_graph(SDL_Renderer *rend, SDL_Window *win, Arr *arr); */
 void drw_element_color(SDL_Renderer *rend, int x, int y, int h, unsigned int col);
 
+void drw_array_graph(SDL_Renderer *rend, SDL_Window *win, SAV *sav);
+
 #endif // __DRAW_H__
diff --git a/sav.c b/sav.c
@@ -9,140 +9,69 @@
 #include <unistd.h>
 #include <pthread.h>
 
+#include "sav.h"
 #include "drw.h"
 #include "util.h"
-/* #include "sort.h" */
+#include "sort.h"
 #include "sdl_extra.h"
 
-#define SEL_COLOR    0x00FF0000 // RGBA
-#define CMP_COLOR    0x00FFFF00
-
-typedef struct {
-    int *v;
-    size_t len;
-} Arr;
-
-/* Maybe in a future */
-/* typedef struct {
-    int sel, cmp;
-    status_t st;
-    Arr *arr;
-    SDL_Renderer *rend;
-    SDL_Window *win;
-} Graph;
-*/
-
-/* variables */
-SDL_Renderer *rend;
-SDL_Window *win;
-Arr *arr = NULL;
-
-size_t sel, cmp;
-status_t st;
-
-/* functions declarations */
-void update_array_graph(SDL_Renderer *rend, SDL_Window *win, Arr *arr);
-void wait_main_thread(void);
-void *routine_wrapper(void *arg);
-void insertion_sort(Arr *arr);
-
-
-/* functions definitions */
-void
-update_array_graph(SDL_Renderer *rend, SDL_Window *win, Arr *arr) {
-    int x, w, h;
-
-    SDL_GetWindowSize(win, &w, &h);
-
-    SDL_SetRenderDrawColor(rend, 29, 28, 28, 0);
-    SDL_RenderClear(rend);
-
-    size_t i;
-    for(i = x = 0; i < arr->len; i++, x += RECT_WIDTH) {
-        if(i == sel) drw_element_color(rend, x, h, arr->v[i], SEL_COLOR);
-        else if(i == cmp) drw_element_color(rend, x, h, arr->v[i], CMP_COLOR);
-        else drw_element(rend, x, h, arr->v[i]);
-    }
-
-    SDL_RenderPresent(rend);
-}
-
-void
-wait_main_thread(void) {
-    if(st != STOP) st = UPDATE;
-
-    /* wait 'til main thread changes st value to RUN */
-    while(st == UPDATE);
-}
-
-void
-insertion_sort(Arr *arr) {
-    int key;
-    size_t i, j;
-
-    for(i = 1; i < arr->len; i++) {
-        key = arr->v[i];
-        j = i - 1;
-        while((j >= 0) && (arr->v[j] > key)) {
-            arr->v[j + 1] = arr->v[j];
-            j = j - 1;
-            sel = i;
-            cmp = j;
-
-            /* wait 'til main thread updates graphics */
-            wait_main_thread();
-            if(st == STOP) break;
-        }
-        arr->v[j + 1] = key;
-        sel = i;
-        cmp = j;
-        /* wait 'til main thread updates graphics */
-        wait_main_thread();
-        if(st == STOP) break;
-    }
-}
-
 void *
 routine_wrapper(void *arg) {
-    Arr *arr = (Arr *)arg;
+    SAV *sav = (SAV *)arg;
 
-    insertion_sort(arr);
+    insertion_sort(sav);
 
     return NULL;
 }
 
 int
 main (void) {
-    size_t i;
+    SAV *sav = NULL;
+    SDL_Renderer *rend;
+    SDL_Window *win;
     pthread_t p1;
 
-    sel = cmp = 0;
-
     setup(&win, &rend);
 
-    arr = (Arr *)malloc(sizeof(Arr));
-    arr->v = (int *)malloc(sizeof(int) * ARR_LEN);
-    arr->len = ARR_LEN;
+    if((sav = (SAV *)malloc(sizeof(SAV))) == NULL)
+        return ERROR_MEMORY_ALLOC;
 
-    /* create a random array */
-    srand((unsigned int)time(NULL));
-    for(i = 0; i < arr->len; i++)
-        while(!(arr->v[i] = rand() % ARR_MAX))
+    sav->sel = sav->cmp = 0;
+    sav->status = RUN;
 
-    st = RUN;
+    if((sav->arr = (Arr *)malloc(sizeof(Arr))) == NULL)
+        return ERROR_MEMORY_ALLOC;
 
-    pthread_create(&p1, NULL, &routine_wrapper, (void *)arr);
+    if((sav->arr->v = (int *)malloc(sizeof(int) * ARR_LEN)) == NULL)
+        return ERROR_MEMORY_ALLOC;
+
+    sav->arr->len = ARR_LEN;
+
+    if(sav->arr == NULL) {
+        return ERROR_MEMORY_ALLOC;
+    }
+
+    /* assigns random values to array */
+    srand((unsigned int)time(NULL));
+    for(size_t i = 0; i < sav->arr->len; i++)
+        while(!(sav->arr->v[i] = rand() % ARR_MAX));
+
+    pthread_create(&p1, NULL, &routine_wrapper, (void *)sav);
 
     /* main loop */
-    while(st != STOP) {
-        check_events(&st); 
-        if(st == UPDATE) {
-            update_array_graph(rend, win, arr);
-            st = RUN;
+    while(sav->status != STOP) {
+        check_events(&(sav->status)); 
+        if(sav->status == UPDATE) {
+            drw_array_graph(rend, win, sav);
+            sav->status = RUN;
         }
     }
 
     pthread_join(p1, NULL);
+
+    free(sav->arr);
+    free(sav);
+
     cleanup(win, rend);
     return 0;
 }
diff --git a/sav.h b/sav.h
@@ -0,0 +1,12 @@
+#ifndef __SAV_H__
+#define __SAV_H__
+
+#include "util.h"
+
+typedef struct {
+    Arr *arr;
+    size_t sel, cmp;
+    status_t status;
+} SAV;
+
+#endif
diff --git a/sort.c b/sort.c
@@ -2,32 +2,31 @@
 #include <stdbool.h>
 
 #include "sort.h"
-#include "util.h"
 
-int bubble_sort(int *arr, size_t len) {
-    if(arr == NULL) return 1;
+void
+insertion_sort(SAV *sav) {
+    int key;
+    size_t i, j;
 
-    /* size_t swaps, top; */
-    /* top = len; */
+    for(i = 1; i < sav->arr->len; i++) {
+        key = sav->arr->v[i];
+        j = i - 1;
+        while((j >= 0) && (sav->arr->v[j] > key)) {
+            sav->arr->v[j + 1] = sav->arr->v[j];
+            j = j - 1;
 
-    static size_t i = 0;
-    static size_t j = 100;
+            sav->sel = i;
+            sav->cmp = j;
 
-    if(i < len) {
-        if(j > (i + 1)) {
-            if(arr[j] < arr[j - 1])
-                swap(&arr[j], &arr[j + 1]);
-
-            printf("j: %ld\n", j);
-
-            j--;
-            return 1;
+            /* wait 'til main thread updates graphics */
+            wait_main_thread(&(sav->status));
+            if(sav->status == STOP) break;
         }
-        /* if(swaps == 0) break; */
-        printf("i: %ld\n", i);
-        i++;
-        j = 100;
-    } else return 0;
-
-    return 1;
+        sav->arr->v[j + 1] = key;
+        sav->sel = i;
+        sav->cmp = j;
+        /* wait 'til main thread updates graphics */
+        wait_main_thread(&(sav->status));
+        if(sav->status == STOP) break;
+    }
 }
diff --git a/sort.h b/sort.h
@@ -1,7 +1,10 @@
 #ifndef __SORT_H__
 #define __SORT_H__
 
-int bubble_sort(int *arr, size_t len);
-void insertion_sort(int *arr, size_t len);
+#include "sav.h"
+#include "util.h"
+
+int bubble_sort(SAV *);
+void insertion_sort(SAV *);
 
 #endif // __SORT_H__
diff --git a/util.c b/util.c
@@ -1,6 +1,14 @@
 #include "util.h"
 
 void
+wait_main_thread(status_t *st) {
+    if(*st != STOP) *st = UPDATE;
+
+    /* wait 'til main thread changes st value to RUN */
+    while(*st == UPDATE);
+}
+
+void
 end(const char *msg) {
     fprintf(stderr, "%s\n", msg);
     exit(1);
diff --git a/util.h b/util.h
@@ -17,10 +17,17 @@ typedef enum {
     RUN,
     PAUSE,
     UPDATE,
+    ERROR_MEMORY_ALLOC,
     STOP
 } status_t;
 
+typedef struct {
+    int *v;
+    size_t len;
+} Arr;
+
 void end(const char *msg);
 void swap(int *a, int *b);
+void wait_main_thread(status_t *st);
 
 #endif // __UTIL_H__