diff options
-rw-r--r-- | src/pjctl.c | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/src/pjctl.c b/src/pjctl.c index a64e78e..51a668e 100644 --- a/src/pjctl.c +++ b/src/pjctl.c @@ -45,18 +45,35 @@ enum pjctl_state { PJCTL_FINISH }; -struct pjctl { - enum pjctl_state state; - GList *queue; - - int fd; -}; +struct pjctl; struct queue_command { char *command; void (*response_func)(struct pjctl *pjctl, char *cmd, char *param); + struct queue_command *prev, *next; }; +struct pjctl { + enum pjctl_state state; + struct queue_command queue; + int fd; +}; + +#define remove_from_list(elem) \ + do { \ + (elem)->next->prev = (elem)->prev; \ + (elem)->prev->next = (elem)->next; \ + } while (0) + +#define insert_at_head(list, elem) \ + do { \ + (elem)->prev = list; \ + (elem)->next = (list)->next; \ + (list)->next->prev = elem; \ + (list)->next = elem; \ + } while(0) + + /* return value: -1 = error, 1 = ok, 0 = unknown */ static int handle_pjlink_error(char *param) @@ -99,12 +116,12 @@ send_next_cmd(struct pjctl *pjctl) struct queue_command *cmd; /* Are we're ready? */ - if (g_list_length(pjctl->queue) == 0) { + if (pjctl->queue.next == &pjctl->queue) { pjctl->state = PJCTL_FINISH; return 0; } - cmd = g_list_nth_data(pjctl->queue, 0); + cmd = pjctl->queue.prev; ret = send(pjctl->fd, cmd->command, strlen(cmd->command), 0); @@ -170,9 +187,9 @@ handle_data(struct pjctl *pjctl, char *data, int len) } data[PJLINK_SEPERATOR] = '\0'; - cmd = g_list_nth_data(pjctl->queue, 0); + cmd = pjctl->queue.prev; - pjctl->queue = g_list_remove(pjctl->queue, cmd); + remove_from_list(cmd); cmd->response_func(pjctl, &data[PJLINK_COMMAND], &data[PJLINK_PARAMETER]); @@ -248,7 +265,7 @@ power(struct pjctl *pjctl, char **argv, int argc) return -1; cmd->response_func = power_response; - pjctl->queue = g_list_append(pjctl->queue, cmd); + insert_at_head(&pjctl->queue, cmd); printf("power %s: ", argv[1]); @@ -303,7 +320,7 @@ source(struct pjctl *pjctl, char **argv, int argc) return -1; cmd->response_func = source_response; - pjctl->queue = g_list_append(pjctl->queue, cmd); + insert_at_head(&pjctl->queue, cmd); printf("source select %s%c: ", switches[type-1], num); @@ -368,7 +385,7 @@ avmute(struct pjctl *pjctl, char **argv, int argc) return -1; cmd->response_func = avmute_response; - pjctl->queue = g_list_append(pjctl->queue, cmd); + insert_at_head(&pjctl->queue, cmd); printf("%s mute %s: ", targets[type-1], argv[2]); @@ -507,7 +524,7 @@ status(struct pjctl *pjctl, char **argv, int argc) return -1; if (asprintf(&cmd->command, "%%1%s ?\r", cmds[i].command) < 0) return -1; - pjctl->queue = g_list_append(pjctl->queue, cmd); + insert_at_head(&pjctl->queue, cmd); } return 0; @@ -545,6 +562,7 @@ main(int argc, char **argv) int s, i; memset(&pjctl, 0, sizeof pjctl); + pjctl.queue.next = pjctl.queue.prev = &pjctl.queue; if (argc <= 2) { usage(&pjctl); @@ -559,7 +577,7 @@ main(int argc, char **argv) } /* Nothing got into queue? User gave invalid command. */ - if (g_list_length(pjctl.queue) == 0) { + if (pjctl.queue.next == &pjctl.queue) { fprintf(stderr, "error: invalid command\n"); usage(&pjctl); return 1; |