aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar robotanarchy <robotanarchy@bingo-ev.de>2015-12-22 00:38:18 +0100
committerLibravatar robotanarchy <robotanarchy@bingo-ev.de>2015-12-22 00:38:18 +0100
commitc3e9ee5e43c6d7adf6d5c9b74b39a5170cfe0b02 (patch)
tree14ce5f51e8cbea387e588697088659ec41173a53
parentfix backtrace detection in CMake (diff)
downloadsway-c3e9ee5e43c6d7adf6d5c9b74b39a5170cfe0b02.tar.gz
sway-c3e9ee5e43c6d7adf6d5c9b74b39a5170cfe0b02.tar.zst
sway-c3e9ee5e43c6d7adf6d5c9b74b39a5170cfe0b02.zip
replace non-standard qsort_r with qsort
I've tried to make as few changes, as possible. Usually the reason for using qsort_r is, that you can pass an extra userdata pointer to the compare function. However, in sway list_sort wrapped qsort_r and always called a wrapper function for comparing, the wrapper function then had the real compare function as argument. The only thing, that the wrapper function does, is dereferencing the 'left' and 'right' function arguments before passing them to the real compare function. I have renamed list_sort to list_qsort to avoid confusion (so nobody tries to use list_qsort like list_sort) and removed the wrapper functionality. Now the dereferencing must be done in the compare function, that gets passed. Some compare functions were used in both list_sort and list_seq_find. To make the difference clear, I've added a '_qsort' suffix to the compare functions, that are intended to be used with the new list_qsort. (In other words: list_qsort is not compatible anymore with list_seq_find). - Changed and renamed function (it isn't used anywhere but in commands.c, and only for sorting): compare_set -> compare_set_qsort - New wrapper functions: sway_binding_cmp_qsort (for sway_binding_cmp) sway_mouse_binding_cmp_qsort (for sway_mouse_binding_cmp)
-rw-r--r--common/list.c10
-rw-r--r--include/config.h2
-rw-r--r--include/list.h5
-rw-r--r--sway/commands.c12
-rw-r--r--sway/config.c8
5 files changed, 21 insertions, 16 deletions
diff --git a/common/list.c b/common/list.c
index d6f6f2ea..850c8569 100644
--- a/common/list.c
+++ b/common/list.c
@@ -50,14 +50,8 @@ void list_cat(list_t *list, list_t *source) {
50 } 50 }
51} 51}
52 52
53// pass the pointer of the object we care about to the comparison function 53void list_qsort(list_t* list, int compare(const void *left, const void *right)) {
54static int list_cmp(const void *l, const void *r, void *_cmp) { 54 qsort(list->items, list->length, sizeof(void *), compare);
55 int (*cmp)(const void *, const void *) = _cmp;
56 return cmp(*(void**)l, *(void**)r);
57}
58
59void list_sort(list_t *list, int compare(const void *left, const void *right)) {
60 qsort_r(list->items, list->length, sizeof(void *), list_cmp, compare);
61} 55}
62 56
63int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) { 57int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) {
diff --git a/include/config.h b/include/config.h
index b97acb57..a915fbed 100644
--- a/include/config.h
+++ b/include/config.h
@@ -179,10 +179,12 @@ void free_output_config(struct output_config *oc);
179int workspace_output_cmp_workspace(const void *a, const void *b); 179int workspace_output_cmp_workspace(const void *a, const void *b);
180 180
181int sway_binding_cmp(const void *a, const void *b); 181int sway_binding_cmp(const void *a, const void *b);
182int sway_binding_cmp_qsort(const void *a, const void *b);
182int sway_binding_cmp_keys(const void *a, const void *b); 183int sway_binding_cmp_keys(const void *a, const void *b);
183void free_sway_binding(struct sway_binding *sb); 184void free_sway_binding(struct sway_binding *sb);
184 185
185int sway_mouse_binding_cmp(const void *a, const void *b); 186int sway_mouse_binding_cmp(const void *a, const void *b);
187int sway_mouse_binding_cmp_qsort(const void *a, const void *b);
186int sway_mouse_binding_cmp_buttons(const void *a, const void *b); 188int sway_mouse_binding_cmp_buttons(const void *a, const void *b);
187void free_sway_mouse_binding(struct sway_mouse_binding *smb); 189void free_sway_mouse_binding(struct sway_mouse_binding *smb);
188 190
diff --git a/include/list.h b/include/list.h
index 90d0ad36..d18d3f54 100644
--- a/include/list.h
+++ b/include/list.h
@@ -13,8 +13,9 @@ void list_add(list_t *list, void *item);
13void list_insert(list_t *list, int index, void *item); 13void list_insert(list_t *list, int index, void *item);
14void list_del(list_t *list, int index); 14void list_del(list_t *list, int index);
15void list_cat(list_t *list, list_t *source); 15void list_cat(list_t *list, list_t *source);
16// See qsort 16// See qsort. Remember to use *_qsort functions as compare functions,
17void list_sort(list_t *list, int compare(const void *left, const void *right)); 17// because they dereference the left and right arguments first!
18void list_qsort(list_t *list, int compare(const void *left, const void *right));
18// Return index for first item in list that returns 0 for given compare 19// Return index for first item in list that returns 0 for given compare
19// function or -1 if none matches. 20// function or -1 if none matches.
20int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to); 21int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to);
diff --git a/sway/commands.c b/sway/commands.c
index 3d882a7b..f6d9b947 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -219,7 +219,7 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) {
219 } 219 }
220 binding->order = binding_order++; 220 binding->order = binding_order++;
221 list_add(mode->bindings, binding); 221 list_add(mode->bindings, binding);
222 list_sort(mode->bindings, sway_binding_cmp); 222 list_qsort(mode->bindings, sway_binding_cmp_qsort);
223 223
224 sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command); 224 sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command);
225 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 225 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
@@ -1255,9 +1255,9 @@ static struct cmd_results *cmd_scratchpad(int argc, char **argv) {
1255} 1255}
1256 1256
1257// sort in order of longest->shortest 1257// sort in order of longest->shortest
1258static int compare_set(const void *_l, const void *_r) { 1258static int compare_set_qsort(const void *_l, const void *_r) {
1259 struct sway_variable const *l = _l; 1259 struct sway_variable const *l = *(void **)_l;
1260 struct sway_variable const *r = _r; 1260 struct sway_variable const *r = *(void **)_r;
1261 return strlen(r->name) - strlen(l->name); 1261 return strlen(r->name) - strlen(l->name);
1262} 1262}
1263 1263
@@ -1284,7 +1284,7 @@ static struct cmd_results *cmd_set(int argc, char **argv) {
1284 var = malloc(sizeof(struct sway_variable)); 1284 var = malloc(sizeof(struct sway_variable));
1285 var->name = strdup(argv[0]); 1285 var->name = strdup(argv[0]);
1286 list_add(config->symbols, var); 1286 list_add(config->symbols, var);
1287 list_sort(config->symbols, compare_set); 1287 list_qsort(config->symbols, compare_set_qsort);
1288 } 1288 }
1289 var->value = join_args(argv + 1, argc - 1); 1289 var->value = join_args(argv + 1, argc - 1);
1290 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1290 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
@@ -1620,7 +1620,7 @@ static struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
1620 list_del(bar->bindings, i); 1620 list_del(bar->bindings, i);
1621 } 1621 }
1622 list_add(bar->bindings, binding); 1622 list_add(bar->bindings, binding);
1623 list_sort(bar->bindings, sway_mouse_binding_cmp); 1623 list_qsort(bar->bindings, sway_mouse_binding_cmp_qsort);
1624 1624
1625 sway_log(L_DEBUG, "bindsym - Bound %s to command %s when clicking swaybar", argv[0], binding->command); 1625 sway_log(L_DEBUG, "bindsym - Bound %s to command %s when clicking swaybar", argv[0], binding->command);
1626 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1626 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
diff --git a/sway/config.c b/sway/config.c
index 4b1bf01a..e86eda53 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -642,6 +642,10 @@ int sway_binding_cmp(const void *a, const void *b) {
642 return lenient_strcmp(binda->command, bindb->command); 642 return lenient_strcmp(binda->command, bindb->command);
643} 643}
644 644
645int sway_binding_cmp_qsort(const void *a, const void *b) {
646 return sway_binding_cmp(*(void **)a, *(void **)b);
647}
648
645void free_sway_binding(struct sway_binding *binding) { 649void free_sway_binding(struct sway_binding *binding) {
646 if (binding->keys) { 650 if (binding->keys) {
647 for (int i = 0; i < binding->keys->length; i++) { 651 for (int i = 0; i < binding->keys->length; i++) {
@@ -675,6 +679,10 @@ int sway_mouse_binding_cmp(const void *a, const void *b) {
675 return lenient_strcmp(binda->command, bindb->command); 679 return lenient_strcmp(binda->command, bindb->command);
676} 680}
677 681
682int sway_mouse_binding_cmp_qsort(const void *a, const void *b) {
683 return sway_mouse_binding_cmp(*(void **)a, *(void **)b);
684}
685
678void free_sway_mouse_binding(struct sway_mouse_binding *binding) { 686void free_sway_mouse_binding(struct sway_mouse_binding *binding) {
679 if (binding->command) { 687 if (binding->command) {
680 free(binding->command); 688 free(binding->command);